#!/usr/bin/env ocaml
#load "nums.cma";;
#load "unix.cma";;
open Big_int;;

let monster =
  [|"焼きたてパン";"強いシャチホコ";"もんじゃ焼き一年生";
  "怪人ホタテ男";"ニセ勇者";"逃げ足の早いアレ";"睡魔";
  "煩悩";"愛らしい子犬の中の人";"恋するスズメバチ";
  "勇敢なクマンバチ";"信じられない物";"勇者の師匠";
  "浮遊する鎧";"怪盗ドボン";"闇の招き猫";
  "誘惑のカスタードクリーム";"しょっぱすぎる籠手";
  "カレー味の兜";"光沢だけは一流の盾";"若葉マークのモンスター";
  "新緑の季節";"梅雨時の車両のニオイ";"暑すぎる夏";
  "新宿らしき何か";"やたら発達したドーナツ";"育ちすぎたクマー";
  "なごやかな雰囲気";"凍り付いた気配";"忍び寄る恐怖"|]

let skill =
 [|"お豆腐の買い方";"鉛筆の買い方";"消しゴムの使い方";
  "メモの取り方";"攻撃に使えないこともない呪文";
  "裏町の歩き方";"森林浴";"珈琲の味";"しじみのみそ汁の作り方";
  "回覧板の回し方";"郵便物の投函方法";"立ち話のコツ";"猫の呼び方";
  "犬の呼び方";"カラスの呼び方";"鳩専用豆鉄砲";"秘密の趣味";
  "速く走るコツ";"剣の使い方";"斧の使い方";
  "まきわりで、まっきわりわり";"聖なる祈り";"孤独";
  "涼しく過ごすコツ";"お洒落のコツ";"卵をふわっと焼く方法";
  "ごはんの研ぎ方";"油汚れの対応方法";
  "大人の振るまい";"Suicaの使い方"|]

let len_monster = Array.length monster
let len_skill = Array.length skill

let exp = 
  let tmp = ref (unit_big_int)  in
  Array.init 30 (fun i -> 
    tmp := (mult_int_big_int (i+1) !tmp);
    string_of_big_int !tmp)

let form = format_of_string "\
    *-----\n\
    %sを倒した！\n\
    %sの経験値を得た。\n\
    勇者は%sレベルが上がった！\n\
    勇者は、%sを覚えた。\n\n%!" ;;


let hero exp sec = 
  let len = Array.length exp in

  for i = 0 to len-2 do
    Printf.printf form
      monster.(Random.int len_monster)
      exp.(i)
      (string_of_int (i+1) ^ "に")
      skill.(Random.int len_skill);
    
    Unix.sleep sec;
    print_endline "\nそして、\n\
      かくかくしかじかで、\
      山あり谷ありの冒険が続いたが割愛。\n";
    Unix.sleep sec;
  done;

  Printf.printf form 
    monster.(Random.int len_monster)
    exp.(len-1) "、また、" "ふと虚しさ";;

hero exp 1;;