#!/usr/bin/env ruby # -*- coding: utf-8 -*- class StudyRPG def initialize @@story = {"あとがき" => ["制作者の村井侑平(j2114)です", "このゲームは独自テーマプログラミングとして つくりました", 'テーマは "数学×RPG" です', "現在 制作中のRPG.rbを参考にしてつくりました", "RPG.rbに似ているところは多々ありますが", "ほぼ完全に一からつくって さまざまなところを改良し", "RPG.rbとは全然違う戦闘システムをつくりました", "基礎の部分はRPG.rbの経験を活かして 数日でつくれました", "つくっているうちに いい改善案が出てきて 微妙なところがかなり違いますけどね", "一人で制作しているので好き勝手につくれたので楽しかったです", "一番苦労したのはネーミングです", "骨組み部分のシナリオをつくるのは得意なんですけど 町の名前や敵の名前が なかなか思いつかなくて苦労しました", "感想や改善案などがありましたらダウンロード先の掲示板に書き込みお願いします", "クリアして頂きありがとうございました"], "序文" => ["〜ここはマフマティクス〜", "訛り(なまり)でマスマティクスやマセアティクスと言う人もいる", "今 この国で一つの物語が生まれようとしている"], "目覚め" => ["_name_:う〜ん", "(憂鬱な気分を感じながら_call_は目を覚ました)", "(_name_:ここはどこなんだ)", "(_call_は脳内細胞を フル稼働させて 今の状況を理解しようとした)", "ガサッ", "(すると突然 近くの茂みから物音がした)", "_name_:なっ何!?", '("それ"は茂みから飛び出してきた)', '("それ"は RPGに よく出てくるスライムに似ているて 黄色い見た目をし 体内には"+"の記号が漂っている)', "_name_:なにこれ", 'すると突然"それ"は何かを出現させて こちらに発射してきた', "???:%#□@$△&!"], "チュートリアル" => ["_name_:なっ 何だったんだ 今の", "_name_:とっ とりあえず人が居るところに行こう", "(10分ほど辺りを歩き回ると村らしきものが見えた)", "_name_:あぁ やっと見つけた〜", "(_call_は近くに居た村人らしき人物に声をかけた)", "_name_:すみません この村のことについて 教えてほしいんですが", "町人:うん? 何いってるんだ ここは村なんかじゃなくて そこそこ栄えた町なんだぞ", "_name_:あっ すみません ここよりかなり都会の方から来たので", "町人:そうなのか もしかして中央都市から来たのか", "_name_:まぁ そんな感じです", "町人:とりあえず 町の説明をするぞ", "町人:ここは 南西の町で イニティウム って言うんだ", "町人:ここマフマティクスの貿易玄関口ってとこだな", "町人:まぁ ほとんどの貿易の品は中央の方に 流れちまってるんだけどな", "町人:でも この辺には弱いマフモンスターしか居ないから平和なんだけどな", "町人:とりあえず この町の地図をやるから あとは頑張れよ", "町人:じゃぁな", "(町人は人混みに紛れて消えていった)", "_name_: ...ほとんど理解できなかった", "_name_:とりあえず 地図に図書館が書いてあるから行ってみようかな"], "この国について" => ["ここはマフマティクス", "訛り(なまり)でマスマティクスやマセアティクスと言う人もいる", "この国は北東から南西に広がる半島の国だ", "この国の首都は中央都市チェントゥルムで マフマティクス一の大都市である", "この国の約7万前に生まれ 今現在まで平和が続いている"], "マスモンスターについて" => ["この国にはマスモンスターと呼ばれるモンスターが存在する", "他国の普通のモンスターと違い このマスマティクス半島にだけ存在が確認されている", "マスモンスターは数式を攻撃に使う", "その問題を解けなければ 攻撃を与えられてしまうが", "問題を解くとマスモンスターにカウンターすることができる", "この攻撃は 防具類では防げない", "そして カウンター以外で マスモンスターに攻撃できたという例は今現在まで報告されていない", "この原理は今現在まで解明されていない", "マスモンスターが落とすものも普通のモンスターとは違う", "普通のモンスターはGold(ゴールド)と呼ばれる通貨を落とすが", "マスモンスターはζ(ゼータ)と呼ばれる通貨を落とす", "マスモンスターは この半島にしか出現しないため ζはこの国でしか使用できない通貨である", "マスモンスターは北東に近づけば近づくほど強力になっていくが 今現在では 中央都市チェントゥルム までしかマスマティクス半島は探索されていない", "マスマティクス半島の近海は常に激しい嵐に見舞われていて 陸海共に最北東に何があるかは確認されていない", "最北東に何があるかを確認した者には政府から100000000ζまたは100000000Gが報奨金として与えられる", "そして 近年マスモンスターが強力になりつつあり この国に訪れる人々が減少している"], "行動開始" => ["_name_:とりあえず 生活線を確保しないとな〜", "_name_:ζって多分これのことだよな〜", "(_call_は さっきの変なやつが落とした硬貨を取り出した)", "_name_:最北東にに行けば100000000もの大金が手に入るのか", "_name_:当分は 最北東を目指しながらお金を稼ごうかな", "_name_:近くの平原でマフモンスターを倒してお金を稼がないとな〜", "(その後 _call_は図書館でマフモンスター大百科という本を読んで町に出た)"] } @@enemy = {"name" => ["プラススライム"], "HP" => [12], "MAXHP" => [12], "NIT" => [1], "ATK" => [3], "DEF" => [5], "DEX" => [15], "数1" => [1..3], "四則" => ["+"], "数2" => [1..3] } @@kakuritu = [[0]*100] @@choices = {"プレイetc" => ["プレイ","ゲーム説明","パスワード"], "性別" => ["男","女"], "一人称" => ["俺","僕","私"], "スーパーアカウント" => ["管理者","administrator","Administrator","神","god","God"], "行動" => ["ステータス確認","二つ名","宿屋","教会","道具屋","図書館","探索"], "宿屋" => ["泊まる10ζ","泊まらない"], "図書館" => ["この国について","マスモンスターについて"], "エリア" => ["エッデュ平原"]#エッデュ平原 ビヴェラ森林 デューブレックス洞窟 ディヴィテ } @@pass = {"解除" => ["ALLCLEAR","ALL CLEAR","allclear","all clear"]} end def question(choices,mold = "moji") x = 0 @select = -1 if mold == "hyozi" while x < choices.length printf("%s ",choices[x]) print("\e[m") x += 1 end else while x < choices.length printf("%s(%d) ",choices[x],x) print("\e[m") x += 1 end end print("\n") while @select < 0 || @select >= choices.length #回答の仕分け print("選択:") @select = gets.chomp if @select == "" || check(@select) == false redo end @select = @select.to_i end if mold == "moji" @select = choices[@select] return @select elsif mold == "kazu" return @select else puts("Error") end end def talk(read,mold = "置換") if mold == "普通" for i in read r = i+"▼" puts r print("\e[m") gets end elsif mold == "置換" for i in read r = i+"▼" puts r.gsub("_name_",@status["name"]) print("\e[m") gets end end end def security(serif,pass) print serif @input = gets.chomp if pass.include?(@input) puts("パスワードの認証に成功しました") @input = "all clear" return end puts("パスワードの認証に失敗しました") @input = nil end def initial print("\n") puts("初期設定"+"="*42) print("\n") name = "" while name == "" print("name…") name = gets.chomp x = false if @@choices["スーパーアカウント"].include?(name) == true puts('隠しコマンド"スーパーアカウント"を認証しました') x = true redo end end if x == true @status = {"名前" => name} else @status = {"name" => name, "称号" => "初心者", "Lv" => 1, "EXP" => 0, "処理用EXP" => 0, "LvUP必要EXP" => 8, "前回のLvUP必要EXP" => 0, "ζ" => 10, "HP" => 20, "MAXHP" => 20, "NIT" => 5, "DEX" => 5, "SPA" => 1, "SP" => 0, } end print("\n") @status["性別"] = question(@@choices["性別"]) print("\n") @status["一人称"] = question(@@choices["一人称"]) print("\n") puts("="*50) print("\n") end def diaplay print("\n") puts("ステータス"+"="*30) printf("名前:%s 称号:%s 性別:%s 一人称:%s ",@status["name"],@status["称号"],@status["性別"],@status["一人称"]) printf("Lv.%s EXP:%s %sζ %sSP\n",@status["Lv"],@status["EXP"],@status["ζ"],@status["SP"]) printf("HP:%s/%s NIT:%s DEX:%s SPA:%s\n",@status["HP"],@status["MAXHP"],@status["NIT"],@status["DEX"],@status["SPA"]) puts("="*40) print("\n") end def dot(n,i) for d in n print d sleep i end print("\n") end def check(h) number = ["1","2","3","4","5","6","6","7","8","9","0",nil,"."] x = h.split("") n = 0 if x[0] == "-" x[0] = nil end if x[0] == "." || x[-1] == "." return false end for i in x if false == number.include?(x[n]) return false end n += 1 end return true end def tosyokan while true question(@@choices["図書館"]+["戻る"]) if @select == "この国について" talk(@@story["この国について"],"普通") elsif @select == "マスモンスターについて" talk(@@story["マスモンスターについて"],"普通") elsif @select == "戻る" return end end end def prologue talk(@@story["序文"]) print("New Loading") dot(["."]*3,1) talk(@@story["目覚め"]) x = -1 print("バトルスタート") dot(["="]*36,0.01) while not x == 2 print("1+1=") x = gets.chomp if false == check(x) puts("不正解!") redo end x = x.to_i if not x == 2 puts("不正解!") redo end end puts("正解!5ダメージ!") puts("???を倒した") puts("10ζを手に入れた") puts("="*50) gets talk(@@story["チュートリアル"]) puts("図書館(0)") x = -1 while not x == "0" print("選択:") x = gets.chomp end print("\n") tosyokan talk(@@story["行動開始"]) end def title if @status["二つ名"].nil? == true puts("二つ名は ありません") else for i in @status["二つ名"] printf("%s ",i) end end end def yadoya puts("宿屋の主人:一泊10ζだよ") question(@@choices["宿屋"]) if @select == "泊まる10ζ" if @status["ζ"] >= 10 #10ζで泊まれる @status["ζ"] -= 10 print"Sleeing" dot(["."]*3,0.5) sleep(1) print("\n") @status["HP"] = @status["MAXHP"] puts("宿屋の主人:また 来いよ") #泊まるとHPが全快する else puts("宿屋の主人:お前 金持ってないのか!") puts("宿屋の主人:ひやかしは帰れ!!") #お金が足りなかった場合 end else puts("宿屋の主人:なんだ泊まんねーのかよ") #泊まんなかった場合 end print("\n") end def probability(list) x = list[rand(list.length)] return x end def time @time = @@enemy["NIT"][@who]-@status["NIT"]/2 if @time <= 0 @time = 0 end @time += rand(3)+1 end def counter @counter = @status["NIT"]*1.5-@@enemy["DEF"][@who]/2 if @counter <= 0 @counter = 0 end @counter = @counter.floor @counter += rand(3)+1 end def damage @damage = @@enemy["ATK"][@who]*1.5-@status["NIT"]/2 if @damage <= 0 @damage = 0 end @damage = @damage.floor @damage += rand(3)+1 end def battle sleep(rand(40)/10) @result = "?" @@enemy["HP"][@who] = @@enemy["MAXHP"][@who] r = rand(2) printf("%s\e[mが現れた\n",@@enemy["name"][@who]) print("戦闘開始") dot(["="]*42,0.01) while not @@enemy["HP"][@who] <= 0 && @status["HP"] <= 0 && @result == "逃走" diaplay sisoku = probability(@@enemy["四則"]) while true x = rand(@@enemy["数1"][@who]) y = rand(@@enemy["数2"][@who]) penalty = 0 k = nil s = Time.now if sisoku == "+" time a = x+y while k.nil? == true printf("%d+%d=",x,y) an = gets.chomp.to_i p a if s+@time <= Time.now+penalty k = "失敗" break end an = an.to_i if a == an k = "成功" puts("正解!") break else penalty += 1 puts("不正解!") redo end end elsif sisoku == "-" elsif sisoku == "*" elsif sisoku == "/" end if k == "成功" counter printf("%sD",@counter) @@enemy["HP"][@who]-= @counter elsif k == "失敗" damage @status["HP"] -= @damage end end end end def encounter(s,r) while not s == r @who = probability(@@kakuritu[s]) battle if @result == "勝ち" elsif @result == "負け" elsif @result == "逃走" end s += 1 question(@@choices["ボス戦"]) if @select == "深部に進む" puts("未制作") else return end end end def tansaku question(@@choices["エリア"]+["戻る"]) if @select == "エッデュ平原" #+ encounter(0,3) elsif @select == "ビヴェラ森林" #− encounter(4,7) elsif @select == "デューブレックス洞窟" #× encounter(8,12) elsif @select == "ディヴィテ鉱山" #÷ encounter(13,17) elsif @select == "オフィチャリス遺跡" #公式 encounter(18,23) elsif @select == "オンミス城" #すべて encounter(24,30) elsif @select == "戻る" return end end def control while true question(@@choices["行動"]) if @select == "ステータス確認" diaplay elsif @select == "二つ名" title elsif @select == "宿屋" yadoya elsif @select == "教会" elsif @select == "道具屋" elsif @select == "図書館" tosyokan elsif @select == "探索" tansaku end end end def game while true question(@@choices["プレイetc"]) if @select == "プレイ" initial prologue control elsif @select == "ゲーム説明" elsif @select == "パスワード" security("パスワードを入力してください:",@@pass["解除"]) if @input == "all clear" if false == @@choices["プレイetc"].include?("あとがき") @@choices["プレイetc"] << "あとがき" end end elsif @select == "あとがき" talk(@@story["あとがき"],"普通") end end end end x = StudyRPG.new x.game #数学 #算数(算術) #計算(演算) #公式 #式 #表 #図 #解 #数 #ディ・シプリーナ闘技場(練習) #探索 #アイテムショップ #宿屋 #教会 #ステータス #必殺技セット