#!/usr/bin/env ruby # -*- coding: utf-8 -*- #変数名の最初は大文字NG ability = [20,3,8,5,5,20,15,1] #能力値最大 #HP(0体力)MP(1魔力)ATS(2攻撃力)MAT(3魔法攻撃力)DEF(4防御力)DEX(5素早さ)AGI(6器用さ)LUK(7運) current = [20,3] #現在の能力値 #現在のHPとMP lv = [1,0,0] #レベル関連 #Lv(レベル)所持EXP(経験値)次のLvUPに必要なEXPの処理に使う lvup = [0,8] #前回のLvUP必要EXP LvUP必要EXP g = [30] #お金(Gold) count = [0,0,0,0] #0=バトル数1=勝利数2=敗北数3=逃走数 progress = 0 #ストーリーの進行度 gamedescription = [ # ゲーム説明 "ゲーム説明","このゲームはメニューで行動を選択して遊びます", "ステータスを見る・宿屋へ行く・武器屋へ行く・教会へ行く・探索へ行くの中から好きなのを選びます", "ステータスを見るは今の自分のステータスを見ることができます", "HP=体力 MP=魔力・魔法防御力 ATS=攻撃力 MAT=魔法攻撃力 DEF=防御力 DEX=素早さ AGI=器用さ LUK=運", "宿屋はGを支払うとHP・MPが回復します", "武器屋は武器・防具を購入することができます", "教会はセーブをすることができます", "探索は魔物の生息地に行き 戦いをします", "戦いは行動を選択して魔物を倒します", "死んでしまったら'GAMEOVER'でGを失い村・街からやり直しです", "目標は魔王を倒すこと!", "じゃぁクリア目指して頑張ってね", "※このゲームは共同制作作品です" ] prorogu = [ # 最初の会話シーン "\e[96m_me_:う、うっ", "\e[96;2m(強い頭痛を感じ_jibun_は意識を失った)", "\e[96;2m(目覚めると そこは見知らぬ村だった)", "\e[96m_me_:こ、ここは どこ?", "\e[96;2m(その瞬間すべてを思い出した)", "\e[96;2m(剣術や魔法 世界のことわり)", "\e[96;2m(そして魔王を倒さなければ ならないという強い使命感を覚えた)", "\e[96m_me_:魔王を倒さなければ", "\e[96m_me_:なぜだか わからないけど そんな気がする", "\e[96m_me_:あっ そして ここは どこなんだろう", "(近くに村人らしき人が見える)", "\e[96m_me_:すみません ここが どこか わかりますか", "\e[2m村人:何いってるんだい?", "\e[2m村人:ここは「パクス村」ディーヴァス川のほとりにある小さな農村さ", "\e[2m村人:ここが初めてなら注意しておくけど「ポルタ平原」には魔物が出るから用意なしには行くなよ", "\e[2m村人:まぁ旅人なら宿屋で休んでいきな", "\e[96m_me_:あっ _jibun_ お金持ってないんですけど", "\e[2m村人:なんだお前さん一文無しかよ", "\e[2m村人:しかたねーなー ここで会ったのも何かの縁だ", "\e[2m村人:30Gやるから あとは魔物でも倒して自分で稼げ", "(_me_は村人から30Gをもらった)", "\e[2m村人:じゃぁな", "\e[96m_me_:とりあえずポルタ平原を探索しようかな" ] #\e[○mは色を変えるコマンド #_me_などはPLの名前などに置き換える credit = [ "スタッフロール(クレジットタイトル)","システム","村井侑平 澤田羽衣", "システムアドバイザー","佐藤隆之助 阿部光峻", "広瀬雄二様 東北公益文科大学の皆様", "シナリオ","村井侑平 高橋真翔 佐藤風斗 佐藤然", "シナリオアドバイザー","佐藤隆之助 澤田羽衣 疋田琉莉 阿部光峻", "グラフィック","村井侑平", "この作品に関わった すべての方に感謝の意を申し上げます", "制作","「#みんなでゲームを作ろう」の会"] #クレジットタイトル(スタッフロール) battleselect = ["攻撃","アイテム","逃げる"] #バトルの行動の選択肢 attack = ["スラッシュ"] #攻撃名 attackdetail = [[1,0,0]] #攻撃の詳細 #ダメージ増加 使用MP 反動によるダメージ monster = ["スライム","デーモンビースト","\e[93mゴールデンスライム","黒い影"] #モンスター名 enemy = [[12,12,8,8,4,0,3,10,8,1,3,"突進","Error"],[15,15,5,5,10,0,5,25,15,1,7,"突進","Error"], [12,12,20,20,6,0,30,8,8,1,30,"突進","Error"],[8,8,15,15,0,8,20,35,25,3,13,"Error","闇の刃"]] #モンスターの能力値 #HP 最大HP MP 最大MP 攻撃力 魔法攻撃力 防御力 素早さ 器用さ 運 落とすEXP 攻撃名 魔法名 kakuritu = [0]*91 + [1]*5 + [3]*3 + [2]*1,[0]*82 + [1]*10 + [3]*5 + [2]*3,[0]*72 + [1]*15 + [3]*8 + [2]*5,[0]*52 + [1]*25 + [3]*15 + [2]*8,[0]*25 + [1]*40 + [3]*25 + [2]*10 #モンスターの出現確率 skillkakuritu = [] #ボスのスキルの確率を入れる予定 status = [] #PLが入力する[名前、性別、一人称etc.] item = [] #アイテム itemlist = [] #アイテムの効果などの一覧 area = [] #探索に行けるエリア searchselect = ["深部に進む","拠点に戻る"] sentaku = ["プレイ","ゲーム説明","クレジットタイトル"] q1 = ["男","女"] #性別 q2 = ["俺","僕","私"] #一人称 #キャラ設定の選択肢 nani = [ ["名前","性別","一人称"], ["Lv","EXP"],["HP","MP"],["ATS","MAT","DEF","DEX","AGI","LUK"], ["ステータスを見る","アイテムを見る","装備を見る","宿屋に行く","武器屋に行く","教会に行く","探索に行く"]] yadoya = ["泊まる10G","泊まらない"] kyokai = ["祈りを捧げる","聖水を買う20G"] bukiya = ["石剣10G ATS+1","買わない"] #各施設の選択肢 def status(status,ability,current,nani,lv,g) #ステータスを表示するためのメソッド x = 0 puts" ステータス" for i in nani[0] #i = ["名前","性別","一人称"] printf("%s:%s ",i,status[x]) #名前性別一人称 x += 1 end x = 0 # xは同時にforしてるイメージでやってるやつ printf("Lv.%s ",lv[0]) printf("EXP:%d ",lv[1]) printf("所持金:%dG",g[0]) print("\n") for i in nani[2] printf("%s:%d/%d ",i,current[x],ability[x]) x += 1 end x = 2 for i in nani[3] printf("%s:%d ",i,ability[x]) x += 1 end print("\n\n") end def question(situmon,list,kata = "moji") #質問を出すメソッド kaisu = 0 ## 3番目の引数kataで返却値を文字か数字か決める ## select = -1 ## "moji"(デフォルト)->文字 "kazu"->数字 ## if kata == "hyozi" while kaisu < list.length printf("%s",list[kaisu]) print("\e[m") kaisu += 1 end else while kaisu < list.length # "kazu"と入れなければ文字が返ります # printf("%s(%d)\n",list[kaisu],kaisu) print("\e[m") kaisu += 1 end while select < 0 || select >= list.length #回答の仕分け print(situmon+":") select = gets if select == "\n" redo end select = select.to_i end if kata == "moji" return list[select] elsif kata == "kazu" return select else puts"questionメソッドでスペルミスしてるようだ" end end end def dot(time,kaisu,ten) #「.」とかのためにいろいろ打ちたくなかったのメソッド for i in 1..kaisu sleep(time) print(ten) end end def story(hanasi,status,dainyu = "suru") #物語のgetsをサボりたいのメソッド if dainyu == "suru" for i in hanasi puts(i.sub("_me_", status[0]) #subがiのキーワードを .sub("_jibun_", status[2]) #特定の文字に .sub("_seibetu_", status[1])) #置き換えてくれる print("\e[m") gets end elsif dainyu == "sinai" # 3番目に"sinai"を入れるとここに来る("代入しない") for i in hanasi ## subるやつがないやつは"sinai"をつけること ## puts(i) print("\e[m") gets end end end def encounter(list) #何のモンスターが出現するか決めてくれるメソッド return list[rand(list.length)] end def enemyturn(probability,monster,enemy,ability,current) #敵のターンの一連の処理をまとめたメソッド if probability > 3 #ボス用の処理(未完成) skill = encounter elsif probability > 2 enemymagic(probability,monster,enemy,ability,current) else if rand(((enemy[probability][4]*1.5).round) + 1) < rand(enemy[probability][5] + 1) #左:物理攻撃 右:魔法攻撃 enemymagic(probability,monster,enemy,ability,current) #魔法攻撃 else enemyattack(probability,monster,enemy,ability,current) #物理攻撃 end end end def process(damage) #ダメージの表示をする if damage < 1 puts("攻撃失敗") else printf("%dダメージ\n",damage) #ダメージの表示 end end def battle(probability,monster,enemy,ability,current,item,status,nani,lv,g,attack,attackdetail,battleselect) #バトルの一連の処理をまとめた"すごい"メソッド escape = [1] printf("%s\e[mが現れた\n",monster) print("戦闘") dot(0.01,28,"=") print("\n") turn = rand(2) enemy[probability][0] = enemy[probability][1] enemy[probability][2] = enemy[probability][3] while true if current[0] <= 0 return 0 #負け elsif enemy[probability][0] <= 0 return 1 #勝ち elsif escape[0] == 0 return 2 end if ability[5] < enemy[probability][7] #敵の方がDEXが早かったとき enemyturn(probability,monster,enemy,ability,current) if current[0] <= 0 return 0 #負け elsif enemy[probability][0] <= 0 return 1 #勝ち elsif escape[0] == 0 return 2 end myturn(probability,monster,enemy,ability,current,item,status,nani,lv,g,attack,attackdetail,battleselect,escape) elsif ability[5] == enemy[probability][7] #敵とPLのDEXが同じ値だったとき if turn == 0 myturn(probability,monster,enemy,ability,current,item,status,nani,lv,g,attack,attackdetail,battleselect,escape) if current[0] <= 0 return 0 #負け elsif enemy[probability][0] <= 0 return 1 #勝ち elsif escape[0] == 0 return 2 end enemyturn(probability,monster,enemy,ability,current) else enemyturn(probability,monster,enemy,ability,current) if current[0] <= 0 return 0 #負け elsif enemy[probability][0] <= 0 return 1 #勝ち elsif escape[0] == 0 return 2 end myturn(probability,monster,enemy,ability,current,item,status,nani,lv,g,attack,attackdetail,battleselect,escape) end elsif ability[5] > enemy[probability][5] #PLの方がDEXが早かったとき myturn(probability,monster,enemy,ability,current,item,status,nani,lv,g,attack,attackdetail,battleselect,escape) if current[0] <= 0 return 0 #負け elsif enemy[probability][0] <= 0 return 1 #勝ち elsif escape[0] == 0 return 2 end enemyturn(probability,monster,enemy,ability,current) end end end def enemymagic(probability,monster,enemy,ability,current) #敵の魔法攻撃の処理 if not enemy[probability][2] == 0 print("\n") printf("%s\e[mの攻撃\n",monster) mp = (enemy[probability][3])/10.round + rand(3)+1 if mp > enemy[probability][2] mp = enemy[probability][2] elsif mp > 100 mp = 100 end damage = (enemy[probability][5] + (mp / 2).round - current[1] / 2).floor printf("%s!",enemy[probability][12]) enemy[probability][2] -= mp damage += (damage/10).floor*rand(3) + rand(4) if damage <= 0 if damage <= -100 damage = 0 else damage = rand(4) end end if rand(enemy[probability][8]*2 + enemy[probability][7] + (enemy[probability][9]/2).floor*2) > rand(((ability[5]*2 + ability[6] + (ability[7]/2).floor)/2).floor) if rand(enemy[probability][8]*2 + enemy[probability][7] + (enemy[probability][9]/2).floor/4) > rand(((ability[5]*2 + ability[6] + (ability[7]/2).floor)/2).floor) damage = (damage*1.5).floor end current[0] -= damage else damage = 0 end else damage = 0 end process(damage) end def enemyattack(probability,monster,enemy,ability,current) #敵の物理攻撃の処理 print("\n") printf("%s\e[mの攻撃\n",monster) damage = enemy[probability][4] - ability[4]/2.floor damage += (damage/10).floor*rand(3) + rand(4) printf("%s!",enemy[probability][11]) if damage <= 0 if damage <= -100 damage = 0 else damage = rand(4) end end if rand(enemy[probability][8]*2 + enemy[probability][7] + (enemy[probability][9]/2).floor*2) > rand(((ability[5]*2 + ability[6] + (ability[7]/2).floor)/2).floor) if rand(enemy[probability][8]*2 + enemy[probability][7] + (enemy[probability][9]/2).floor/4) > rand(((ability[5]*2 + ability[6] + (ability[7]/2).floor)/2).floor) damage = (damage*1.5).floor end current[0] -= damage else damage = 0 end process(damage) end def myturn(probability,monster,enemy,ability,current,item,status,nani,lv,g,attack,attackdetail,battleselect,escape) status(status,ability,current,nani,lv,g) select = question("行動…",battleselect) if select == "攻撃" select = question("攻撃…",attack,"kazu") damage = ability[2] * attackdetail[select][0] - ((enemy[probability][6] / 2).floor) damage += (damage/10).floor*rand(3) + rand(4) if damage <= 0 if damage <= -100 damage = 0 else damage = rand(4) end end if rand(enemy[probability][7]*2 + enemy[probability][8] + (enemy[probability][9]/2).floor) < rand((((ability[6]*2 + ability[5] + (ability[7]/2).floor)/2).floor)*2) if rand(enemy[probability][7]*2 + enemy[probability][8] + (enemy[probability][9]/2).floor) < rand(((ability[6]*2 + ability[5] + (ability[7]/2).floor)/2).floor/4) damage = (damage*1.5).floor end else damage = 0 end current[1] -= attackdetail[select][1] current[0] -= attackdetail[select][2] printf("%s!",attack[select]) enemy[probability][0] -= damage process(damage) damage = 0 elsif select == "アイテム" elsif select == "逃げる" if rand((ability[5] + ability[7])*2) > rand(enemy[probability][7] + enemy [probability][9]) puts("逃げ切れた") escape[0] = 0 return else puts("逃げ切れなかった") return end end end #detaの配列は[0]がダメージ[1]が消費MP[2]が反動ダメージ def game(probability,monster,enemy,ability,current,item,status,nani,lv,g,attack,attackdetail,battleselect,searchselect,lvup,count) sleep(rand(40)/10) result = battle(probability,monster[probability],enemy,ability,current,item,status,nani,lv,g,attack,attackdetail,battleselect) count[0] += 1 if 0 == result gameovre #GAMEOVREのメソッド current[0] = ability[0] #HP全快 current[1] = ability[1] #MP全快 g[0] -= ((g[0]/10).floor + 10)#Gを減らす if g[0] < 0 #Gが0未満になった場合 g[0] = 0 end count[2] += 1 return 0 elsif 1 == result print("\n") printf("%s\e[mに勝った!\n",monster[probability]) print("\n") x = enemy[probability][10] + ((enemy[probability][10]/10).floor * (rand(3) + 1) + (rand(3) + 1)) lv[1] += x lv[2] += x g[0] += ((enemy[probability][10] + ((enemy[probability][10]/10).floor * (rand(3) + 1) + (rand(3) + 1)))*1.5).floor level(lv,lvup,status,ability,current,nani,g) count[1] += 1 select = question("どうする",searchselect) if select == "拠点に戻る" return 0 end elsif 2 == result count[3] += 1 return 0 end return 1 end def appearance(monster,enemy,ability,current,item,status,nani,lv,g,attack,attackdetail,battleselect,kakuritu,n,limit,searchselect,lvup,count) while not n == limit probability = encounter(kakuritu[n]) # probability = 遭遇した敵 game_return = game(probability,monster,enemy,ability,current,item,status,nani,lv,g,attack,attackdetail,battleselect,searchselect,lvup,count) if game_return == 0 return 0 end n += 1 if n == limit print("\n") puts("この先から禍々しい気配がする それでも進みますか?") print("\n") ques_ans = question("どうする",searchselect) if ques_ans == "深部に進む" #ボス用メソッド puts("ボス戦は未制作です") else return 0 end end end end def gameovre puts("GAMEOVER") picture = spawn "display -geometry +0+0 gameover.png" gets Process.kill(:INT,picture) end def level(lv,lvup,status,ability,current,nani,g) exp = lvup[1] if not lv[0] == "50(MAX)" || lv[0] == "\e[93mSPECIAL\e[m" while 0 >= exp-lv[2] puts("レベルアップ!") x = lv[0]+1 printf("Lv%s→Lv%s\n",lv[0],x) lv[0] += 1 lvup[0] = lvup[1] lvup[1] = (lvup[0]*1.2).floor ability[0] = (ability[0]*1.065).ceil ability[1] = (ability[1]*1.1).ceil ability[2] = (ability[2]*1.04).ceil ability[3] = (ability[3]*1.035).ceil ability[4] = (ability[4]*1.05).ceil ability[5] = (ability[5]*1.045).ceil ability[6] = (ability[6]*1.045).ceil ability[7] = lv[0] lv[2] -= exp if lv[0] == 50 lv[0] = "50(MAX)" ability[1] = 800 ability[2] = 120 ability[4] = 150 ability[5] = 250 ability[6] = 200 end end end status(status,ability,current,nani,lv,g) end while true puts("RPG") #ここから やっとメソッドじゃない select = question("選択",sentaku) if select == "ゲーム説明" print("\n") story(gamedescription,status,"sinai") redo end if select == "クレジットタイトル" print("\n") story(credit,status,"sinai") redo end if select == "プレイ" name = "" puts("PL名を決めてください") while name == "" #この辺少し変だから真似はよく見てやって print("name…") name = gets.chomp if name == "administrator" || name == "管理者" #スーパーアカウント(^_^;) lv[0] = "\e[93mSPECIAL\e[m" ability[0] = 1000 ability[1] = 1500 ability[2] = 500 ability[3] = 300 ability[4] = 400 ability[5] = 500 ability[6] = 400 ability[7] = 100 current[0] = ability[0] current[1] = ability[1] g[0] = 100000000 puts("スーパーアカウントの使用を許可します") puts("PL名を決めてください") redo end end name = name.chomp status << name status << question("性別を決めてください",q1) status << question("一人称を決めてください",q2) end puts("ゲームを起動します") sleep(1) print"Loading" dot(0.5,3,".") #「.」を0.5秒間隔で3回表示する sleep(1) print("\n\n") story(prorogu,status) #ストーリを表示する progress += 1 #進行度を進める area << "ポルタ平原" #行けるエリアを増やす while true # メニューここから puts(" メニュー") x = 0 koudou = question("行動…",nani[4]) #koudouはPLの回答を拾ってくる print("\n") if koudou == "ステータスを見る" status(status,ability,current,nani,lv,g) elsif koudou == "宿屋に行く" puts("宿屋の主人:一泊10Gだよ") select = question("どうする",yadoya) if select == "泊まる10G" if g[0] >= 10 #10Gで泊まれる g[0] -= 10 print"Sleeing" dot(0.5,3,".") sleep(1) print("\n") current[0] = ability[0] current[1] = ability[1] puts("宿屋の主人:また 来いよ") #泊まるとHPとMPが全快する else puts("宿屋の主人:お前 金持ってないのか!") puts("宿屋の主人:ひやかしは帰れ!!") #お金が足りなかった場合 end else puts("宿屋の主人:なんだ泊まんねーのかよ") #泊まんなかった場合 end print("\n") elsif koudou == "アイテムを見る" if item.length == 0 puts("所持アイテムはありません") print("\n") else question("なし",item) end elsif koudou == "探索に行く" select = question("どこに探索に行きますか",area) #どこに行くかの選択 if select == "ポルタ平原" n = 0 limit = 5 appearance(monster,enemy,ability,current,item,status,nani,lv,g,attack,attackdetail,battleselect,kakuritu,n,limit,searchselect,lvup,count) redo end else puts"未実装の項目または存在しない選択肢です。" end end redo end