#!/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() + "
\n"
if type == 'wiz'
adj =
[ '強力な', '巨大な', '凍てつく', '不死系の', '原子融合による',
'祝福の', '$adj$adj', '呪いの', '魔法の', '魔法の',
'真空の',
]
tar =
[ '敵1体', '呪文を唱えた者', '敵', '敵1グループ', '敵全て',
'パーティ全員', '$adj$tar', '味方1人', '正体不明な敵',
]
noun =
[ '掌', '火球', '城', '階段', '身体', '爆炎', '火花', '冷気',
'炎の嵐', '空気', '冷気の嵐', '暗闇', '壁',
'明り', '障壁', '宝箱',
'盾', '火柱', '味方の死体',
'血流脈',
'刃',
*(['$adj$noun']*13)
]
pref =
[
'死と灰状態を治療し、',
'死と灰以外の状態を治療し、',
'$nounを破壊し、',
'$nounから$nounを放ち、',
'$tarの肉体を硬化し、',
'$tarを眠らせて行動不能にする。眠っている相手に直接攻撃すると、',
'$tarが現在いる位置を、',
'$tarを$nounで包み、',
'$tarの$nounを透明にして、',
'$nounを発し、',
'$nounの嵐で、',
'$tarに恐怖心を起こさせ、',
'$nounを汚染し、',
'$nounを起こし',
'$tar周辺を真空状態にし、',
'$tarを透明化し、',
'$randの奇跡のうちの1つが起こる。',
'任意の座標にテレポートする。',
'$adj核爆発を起こし、',
'$tarを祝福して、',
'$adj言葉を唱え、',
'$nounを生み',
'$nounを発生させ',
'透視能力を得て、',
'$tarを麻痺させ、',
'$tarを静寂で包み、',
'',
'$nounを作り、$tarのACを$rand下げる。城に戻るまで効果は持続。',
'迷宮内に残された、',
'死亡状態の$tarを蘇生させる。',
'$tarを城へテレポートさせる。使用すると、',
]
suf =
[
'失敗すると、死体は灰になり、灰はロストとなる。',
'所持金とアイテムの大半を失う。',
'$tarのHPを$randポイントにしてしまう。',
'HPも完全回復させる。',
'$tarを即死させる。',
'失敗すると$nounは灰になる。',
'$tarに$randのダメージを与える。',
'ACを$rand下げる。',
'$rand倍のダメージを与える。',
'$nounへの$nounを基点とした座標で示してくれる。',
'ACを$rand上昇させる。',
'レベル$rand以下の$tarを即死させる。',
'$tarを窒息死させる。',
'$tarのレベルは$rand下がる。',
'$tarを消滅させる。',
'$nounの中にはまると全滅。',
'$tarのHPを$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 = 'ラリホー
ねむくて死ぬ'
end
print msg + "
\n"
print '