#!/usr/bin/env ruby
# -*- coding: euc-jp -*-

if ENV['HTTP_HOST'] == 'shinh.skr.jp'
  puts %Q(Status-Code: 302 Found
Location: http://shinh.org/koneta/spell_markov_generater.cgi?#{ENV['QUERY_STRING']}

)
  exit
end

class MarkovGenerater
  def initialize(filename)
	@next = Hash.new
	@keys = Array.new
	@prefix = "\0"

	File.new(filename).each { |line|
		line.chomp!
		for i in 0...line.length/2
			add(line[i*2,2])
		end
		add("\0")
	}

	@prefix = @keys[rand(@keys.size)]
  end

  def add(str)
	if (@next[@prefix] == nil) then
		@next[@prefix] = [str]
		if (str != "\0") then
			@keys.push(@prefix)
		end
	else
		@next[@prefix].push(str)
	end
	@prefix = str
  end

  def generate
    ret = ""
	key = "\0"
	while (key == "\0")
	  key = @keys[rand(@keys.size)]
	  if (ENV['QUERY_STRING'] == 'negima') then key = 'ラ' end
	end
	while (key != "\0")
	    ret += key
		n = @next[key]
		key = n[rand(n.size)]
	end

	return ret
  end

end

print "Content-Type: text/html; charset=EUC-JP\n\n"

spellsFile = "spells.txt"
type = ENV['QUERY_STRING']
if type =~ /q=(.*)/
  type = $1
end

if type != 'rariho' then

if (type == 'negima') then
	spellsFile = "spells_negima.txt"
elsif (type == 'wiz') then
	spellsFile = "spells_wiz.txt"
end

markov = MarkovGenerater.new(spellsFile)
print markov.generate() + "<br>\n"

if type == 'wiz'
adj =
    [ '強力な', '巨大な', '凍てつく', '不死系の', '原子融合による',
      '祝福の', '$adj$adj', '呪いの', '魔法の', '魔法の',
      '真空の',
    ]

tar =
    [ '敵１体', '呪文を唱えた者', '敵', '敵１グループ', '敵全て',
      'パーティ全員', '$adj$tar', '味方１人', '正体不明な敵',
    ]

noun =
    [ '掌', '火球', '城', '階段', '身体', '爆炎', '火花', '冷気',
      '炎の嵐', '空気', '冷気の嵐', '暗闇', '壁',
      '明り', '障壁', '宝箱',
      '盾', '火柱', '味方の死体',
      '血流脈',
      '刃',
      *(['$adj$noun']*13)
    ]

pref =
    [
     '死と灰状態を治療し、',
     '死と灰以外の状態を治療し、',
     '$nounを破壊し、',
     '$nounから$nounを放ち、',
     '$tarの肉体を硬化し、',
     '$tarを眠らせて行動不能にする。眠っている相手に直接攻撃すると、',
     '$tarが現在いる位置を、',
     '$tarを$nounで包み、',
     '$tarの$nounを透明にして、',
     '$nounを発し、',
     '$nounの嵐で、',
     '$tarに恐怖心を起こさせ、',
     '$nounを汚染し、',
     '$nounを起こし',
     '$tar周辺を真空状態にし、',
     '$tarを透明化し、',
     '$randの奇跡のうちの１つが起こる。',
     '任意の座標にテレポートする。',
     '$adj核爆発を起こし、',
     '$tarを祝福して、',
     '$adj言葉を唱え、',
     '$nounを生み',
     '$nounを発生させ',
     '透視能力を得て、',
     '$tarを麻痺させ、',
     '$tarを静寂で包み、',
     '',
     '$nounを作り、$tarのACを$rand下げる。城に戻るまで効果は持続。',
     '迷宮内に残された、',
     '死亡状態の$tarを蘇生させる。',
     '$tarを城へテレポートさせる。使用すると、',
    ]

suf =
    [
     '失敗すると、死体は灰になり、灰はロストとなる。',
     '所持金とアイテムの大半を失う。',
     '$tarのＨＰを$randポイントにしてしまう。',
     'ＨＰも完全回復させる。',
     '$tarを即死させる。',
     '失敗すると$nounは灰になる。',
     '$tarに$randのダメージを与える。',
     'ＡＣを$rand下げる。',
     '$rand倍のダメージを与える。',
     '$nounへの$nounを基点とした座標で示してくれる。',
     'ＡＣを$rand上昇させる。',
     'レベル$rand以下の$tarを即死させる。',
     '$tarを窒息死させる。',
     '$tarのレベルは$rand下がる。',
     '$tarを消滅させる。',
     '$nounの中にはまると全滅。',
     '$tarのＨＰを$randポイント回復させる。',
     '$nounに仕掛けられた罠の種類を$rand％の確率で識別する。',
     '行動不能にする。',
     '呪文を唱えるのを不可能にする。',
     '麻痺、催眠状態を治療する。',
     '$tarを識別する。',
     '毒状態を治療する。',
     '$nounの位置を知ることができる。',
    ]
else
noun = ['']
adj = [
  '', '小さな', '大きな', '激しく巨大な', 'ほとばしる', '灼熱の', '大',
  '想像を絶する大', '激しい', '身を切り裂く$adj', '全てを切り刻む',
  '大幅に', '全ての', '深い', '1度行った', '弱い'
]

tar = [
  '仲間一人', '仲間全員', '敵', 'マヒ', '毒', '守備力', '攻撃力',
  'MP', '自分', '魔法', '魔法効果', '身', 'バリア', '鉄のかたまり',
  'ダメージ床', '宝箱', 'あやしいもの'
]

pref = [
  '$adj火の玉で', '$adj炎で', '$adj爆発を起こし、', '氷の刃で',
  '$adj竜巻で', '$adj稲妻で', '力を合わせて', '死の言葉を投げかけ',
  'ドラゴンになり炎をはくが、', '命を捨て自爆し、', '命を捨てて',
  '幻で', '1ターンの間だけ', '数ターン'
]

suf = [
  '約$randPtのダメージ', '息の根を止める', '変身している間は我を忘れる',
  '瀕死または戦闘不能にする', 'HPを約$randPt回復', 'HPを$adj回復',
  '$tarを消し去る', '$tarを直す', '$tarを1/2の確率で生き返らせる',
  '$tarを完全に生き返らせる', '$tarを生き返らせる',
  '$tarを遠くにはじき飛ばす', '$tarを消し去る', '$tarを下げる',
  '$tarを二倍にする', '$tarを吸い取る',
  '$tarの受けた$tarの$tarを自分のものにする',
  '$adj$tarを消し去る', '$tarを上げる', '$tarを$adj眠りに誘う',
  '$tarを包む', '$tarを混乱させる', '$tarの$tarを封じ込める',
  '$tarをはね返す', '$tarや$tarから$tarを守る',
  '$tarに対して$tarをはる', '$tarが$tarになる',
  '$adj町や村に移動できる', '建物や洞窟から脱出する',
  '$tarより$adj$tarが出なくなる', '$tarからダメージを受けなくなる',
  '$tarの中身を見極める', '$tarで$tarを発見する', '何が起こるかわからない'
]
end

msg = suf[rand(suf.size)]
rval = 27
if type == 'wiz'
  rval = 11
  msg = pref[rand(pref.size)] + msg
else
  if (rand(2) < 1) then
    msg = pref[rand(pref.size)] + msg
  end
end

while (msg.sub!(/\$noun/, noun[rand(noun.size)]) != nil ||
	   msg.sub!(/\$adj/, adj[rand(adj.size)]) != nil ||
	   msg.sub!(/\$tar/, tar[rand(tar.size)]) != nil ||
	   msg.sub!(/\$rand/, (rand(rval)*rand(rval)).to_s))
end

else
  msg = 'ラリホー<br>ねむくて死ぬ'
end

print msg + "<br>\n"

print '<form><input type="hidden" name="q" value="'+type+'">
<input type="submit" value="もう一度"></form>'
