Newer
Older
Ruby / RPG,rb
#!/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]                      #レベル関連 
#Lv(レベル)EXP(経験値)

g = 0                           #お金(Gold)

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_:とりあえずポルタ平原を探索しようかな"]
#最初の会話シーン
#\e[○mは色を変えるコマンド
#_me_などはPLの名前などに置き換える

credit = ["スタッフロール(クレジットタイトル)","システム","村井侑平 澤田羽衣",
          "システムアドバイザー","佐藤隆之助 阿部光峻",
          "広瀬雄二様 東北公益文科大学の皆様",
          "シナリオ","村井侑平 高橋真翔 佐藤風斗 佐藤然",
          "シナリオアドバイザー","佐藤隆之助 澤田羽衣 疋田琉莉 阿部光峻",
          "グラフィック","澤田羽衣",          "この作品に関わった すべての方に感謝の意を申し上げます",
          "制作","「#みんなでゲームを作ろう」の会"]
#クレジットタイトル(スタッフロール)

battleselect = ["攻撃","アイテム","逃げる"]
#バトルの行動の選択肢

attack = ["スラッシュ"]         #攻撃名
attackdetail = [[1,0,0]]        #攻撃の詳細

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"],
         [8,8,15,15,0,8,20,35,25,3,13,"Error","闇の刃"],[12,12,20,20,6,0,30,8,8,1,30,"突進","Error"]]
#モンスターの能力値

status = []                     #PLが入力する[名前、性別、一人称etc.]

item = []                       #アイテム

area = []                       #探索に行けるエリsentaku = ["プレイ","ゲーム説明","クレジットタイトル"]

q1 = ["男","女"]                #性別
q2 = ["俺","僕","私"]           #一人称
#キャラ設定の選択肢

nani = [["名前","性別","一人称"],["Lv","EXP"],["HP","MP"],["ATS","MAT","DEF","DEX","AGI","LUK"],
        ["ステータスを見る","宿屋に行く","武器屋に行く","教会に行く","探索に行く"]]

yadoya = ["泊まる(10G)","泊まらない"]
kyokai = ["祈りを捧げる(セーブ)","聖水を買う(20G)"]
#各施設の選択肢

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
  printf("Lv%s   ",lv[0])
  printf("EXP:%d   ",lv[1])
  printf("所持金:%dG",g)
  print("\n")
  for i in nani[2]
    printf("%s:%d/%d   ",i,ability[x],current[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)                 #質問を出すメソッド
  kaisu = 0
  select = -1
  while kaisu < list.length
    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
  return list[select]           #ただ見やすくしてる
end

def query(situmon,list)                 #質問を出すメソッド
  kaisu = 0
  select = -1
  while kaisu < list.length
    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
  return select          #数字版
end

def dot(time,kaisu,ten)   #「.」のためにいろいろ打ちたくなかったのメソッド
  for i in 1..kaisu
    sleep(time)
    print(ten)
  end
end

def description(hanasi)         #会話を出すためのメソッド
  for i in hanasi
    puts(i)
    print("\e[m")
    gets
  end
end

def story(hanasi,status)             #物語のgetsをサボりたいのメソッド
  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
end

def encounter(probability)                              #何のモンスターが出現するか決めてくれるメソッド
  encounter = probability[rand(probability.length)]
end

def enemyturn(probability,monster,enemy,ability,current) #敵のターンの一連の処理をまとめたメソッド
  if rand(((enemy[probability][4]*1.5).round) + 1) <= rand(enemy[probability][5] + 1)       #左:物理攻撃 右:魔法攻撃
      data = enemymagic(probability,monster,enemy,ability,current)                         #魔法攻撃
    if rand(enemy[probability][8]*2 + enemy[probability][7] + (enemy[probability][9]/2).floor) > rand(((ability[5]*2 + ability[5] + (ability[7]/2).floor)/2).floor)
      return data
    end
  else
    data = enemyattack(probability,monster,enemy,ability,current)                          #物理攻撃
    if rand(enemy[probability][8]*2 + enemy[probability][7] + (enemy[probability][9]/2).floor) > rand(((ability[5]*2 + ability[6] + (ability[7]/2).floor)/2).floor)
      return data
    end
  end
  data[0] = 0
  return data
end

def process1(data) #攻撃失敗・攻撃以外の行動(PLのアイテムや逃げる)・ダメージの表示をする
  if data[0][0] == 0
    puts("攻撃失敗")
  elsif data[0][0] == "他"
    data[0][0] = 0
    return data
  else
    printf("%dダメージ\n",data[0]) #ダメージの表示
  end
  return data
end

def  battle(probability,monster,enemy,ability,current,item,status,nani,lv,g,attack,attackdetail,battleselect) #バトルの一連の処理をまとめた"すごい"メソッド
  printf("%s\e[mが現れた\n",monster[probability])
  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                  #勝ち
    end
    
    if ability[5] < enemy[probability][7] #敵の方がDEXが早かったとき
      data = enemyturn(probability,monster,enemy,ability,current)
      process1(data)
      current[0] -= data[0]
      enemy[probability][2] -= data[1]
      enemy[probability][0] -= data[2]

      if current[0] <= 0
        return 0                  #負け
      elsif enemy[probability][0] <= 0
        return 1                  #勝ち
      end
      
      data = myturn(probability,monster,enemy,ability,current,item,status,nani,lv,g,attack,attackdetail,battleselect)
      process1(data)
      enemy[probability][0] -= data[0]
      current[1] -= data[1]
      current[0] -= data[2]
      
    elsif ability[5] = enemy[probability][7] #敵とPLのDEXが同じ値だったとき
      
      if turn  == 0
        
        data = myturn(probability,monster,enemy,ability,current,item,status,nani,lv,g,attack,attackdetail,battleselect)
        process1(data)
        enemy[probability][0] -= data[0]
        current[1] -= data[1]
        current[0] -= data[2]

        if current[0] <= 0
          return 0                  #負け
        elsif enemy[probability][0] <= 0
          return 1                  #勝ち
        end

        data = enemyturn(probability,monster,enemy,ability,current)
        process1(data)
        current[0] -= data[0]
        enemy[probability][2] -= data[1]
        enemy[probability][0] -= data[2]
        
      else
        
        data = enemyturn(probability,monster,enemy,ability,current)
        process1(data)
        current[0] -= data[0]
        enemy[probability][2] -= data[1]
        enemy[probability][0] -= data[2]

        if current[0] <= 0
          return 0                  #負け
        elsif enemy[probability][0] <= 0
          return 1                  #勝ち
        end
        
        data = myturn(probability,monster,enemy,ability,current,item,status,nani,lv,g,attack,attackdetail,battleselect)
        process1(data)
        enemy[probability][0] -= data[0]
        current[1] -= data[1]
        current[0] -= data[2]
        
      end

    elsif ability[5] > enemy[probability][5] #PLの方がDEXが早かったとき
      data = myturn(probability,monster,enemy,ability,current,item,status,nani,lv,g,battleselect)
      process1(data)
      enemy[probability][0] -= data[0]
      current[1] -= data[1]
      current[0] -= data[2]

      if current[0] <= 0
        return 0                  #負け
      elsif enemy[probability][0] <= 0
        return 1                  #勝ち
      end
      
      data = enemyturn(probability,monster,enemy,ability,current)
      process1(data)
      current[0] -= data[0]
      enemy[probability][2] -= data[1]
      enemy[probability][0] -= data[2]
    end
  end
end


def enemymagic(probability,monster,enemy,ability,current) #敵の魔法攻撃の処理
  data = []
  if not enemy[probability][2] == 0
    print("\n")
    printf("%s\e[mの攻撃\n",monster[probability])
    mp = (enemy[probability][3])/10.round + rand(3)+1
    if  mp > enemy[probability][2]
      mp = enemy[probability][2]
    elsif mp > 1000
      mp = 1000
    end
    data << (enemy[probability][5] * (mp / 2).round - current[1] / 2).floor
    printf("%s!",enemy[probability][12])
    data << mp
    data << 0
    if data[0] < 1
      data[0] = rand(3)+1
    end
    return data
  else
    return [[0,0,0]]
  end
end

def enemyattack(probability,monster,enemy,ability,current) #敵の物理攻撃の処理
  data = []
  print("\n")
  printf("%s\e[mの攻撃\n",monster[probability])
  data << enemy[probability][4] - ability[4]/2.floor
  printf("%s!",enemy[probability][11])
  data << 0
  data << 0
  if data[0] < 1
    data[0] = rand(3)+1
  end
  return data
end

def myturn(probability,monster,enemy,ability,current,item,status,nani,lv,g,attack,attackdetail,battleselect)
  data = []
  status(status,ability,current,nani,lv,g)
  select = question("行動…",battleselect)
  if select == "攻撃"
    select = query("攻撃…",attack)
    damage = ability[2] * attackdetail[select][0] - ((enemy[probability][6] / 2).floor)
    if rand(enemy[probability][8]*2 + enemy[probability][7] + (enemy[probability][9]/2).floor) > rand(((ability[probability][5]*2 + ability[probability][6] + (ability[probability][7]/2).floor)/2).floor)
      data << damage
    else
      data << 0
    end
    data << attackdetail[select][1]
    data << attackdetail[select][2]
    printf("%s!",attack[select])
    return data
  end
end

#detaの配列は[0]がダメージ[1]が消費MP[2]が反動ダメージ

def gameovre
  puts("GAMEOVER")
  picture = spawn "display -geometry +0+0 gameover.png"
  gets
  Process.kill(:INT,picture)
end

puts("RPG")                     #ここから やっとメソッドじゃない
select = question("選択",sentaku)
if select == "ゲーム説明"
  print("\n")
  description(gamedescription)
  select = question("選択",sentaku)
end
if select == "クレジットタイトル"
  print("\n")
  description(credit)
  select = question("選択",sentaku)
end

if select == "プレイ"
  name = "\n"
  while name == "\n"             #この辺少し変だから真似はよく見てやって
    puts("PL名を決めてください")
    print("name…")
    name = gets
  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
  y = question("行動…",nani[4])      #yはPLの回答を拾ってくる 
  print("\n")

  if y == "ステータスを見る"
    status(status,ability,current,nani,lv,g)
   #!/usr/bin/env ruby
# -*- coding: utf-8 -*-
 if y == "ステータスを見る"
    status(status,ability,current,nani,lv,g)

 elsif y == 2
   puts("")#何でも入れてね!
   select = question("どうする",bukiya)
   if select == "ひのきのぼう(6G)"
     if g >= 6
       g - 6
       puts("")#何でも入れてね!
       if select == "木の盾(7G)"
         if g >= 7
           g - 7
           puts("")#何でも入れてね!
           if select == "革の服(5G)"
             if g >= 5
               puts("")#何でも入れてね!
               if select =="帰る"
                 puts("")#何でも入れてね!
               end
             end
           end
         end
       end
     end
   end
 end
 
 
  elsif y == "宿屋に行く"
    puts("村人:一泊10Gだよ")
    select = question("どうする",yadoya)
    if select == "泊まる(10G)"
      if g >= 10                #10Gで泊まれる
        g - 10
        print"Sleeing"
        dot(0.5,3,".")
        sleep(1)
        current[0] =  ability[0]
        current[1] =  ability[1]
        puts("また 来いよ")     #泊まるとHPとMPが全快する
        
      else
        puts("村人:ひやかしは帰れ!!") #お金が足りなかった場合
      end
    else
      puts("村人:なんだ泊まんねーのかよ") #泊まんなかった場合
    end
    print("\n")
    
  elsif y == "探索に行く"
    select = question("どこに探索に行きますか",area) #どこに行くかの選択
    
    if  select == "ポルタ平原"
      sleep(rand(3))
      probability = encounter([0]*75 + [1]*15 + [2]*5 + [3]*5) #出現するモンスターと その確率を決めてメソッドを使う
      game =  battle(probability,monster,enemy,ability,current,item,status,nani,lv,g,attack,attackdetail,battleselect)
      
      if 0  ==  game
        gameovre                #GAMEOVREのメソッド
        current[0] = ability[0] #HP全快
        current[1] = ability[1] #MP全快
        g -= (g/10).floor + 10  #Gを減らす
        if g < 0                #Gが0未満になった場合
          g = 0
        end
        
      elsif 1 == game
        print("\n")
        printf("%sに勝った!\n",monster[probability])
        lv[1] += enemy[probability][10] + ((enemy[probability][10]/10).floor * (rand(3) + 1) + (rand(3) + 1))
        g += ((enemy[probability][10] + ((enemy[probability][10]/10).floor * (rand(3) + 1) + (rand(3) + 1)))*1.5).floor
      end
    end
  end
end