#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'csv'
    
class RPG
  def initialize
    @@story = {"ゲーム説明" => ["ゲーム説明","このゲームはメニューで行動を選択して遊びます",
                                "ステータスを見る・宿屋へ行く・武器屋へ行く・教会へ行く・探索へ行くの中から好きなのを選びます",
                                "ステータスを見るは今の自分のステータスを見ることができます",
                                "HP=体力 MP=魔力・魔法防御力 ATS=攻撃力 MAT=魔法攻撃力 DEF=防御力 DEX=素早さ AGI=器用さ  LUK=運",
                                "宿屋はGを支払うとHP・MPが回復します",
                                "武器屋は武器・防具を購入することができます",
                                "教会はセーブをすることができます",
                                "探索は魔物の生息地に行き 戦いをします",
                                "戦いは行動を選択して魔物を倒します",
                                "死んでしまったら'GAMEOVER'でGを失い村・街からやり直しです",
                                "目標は魔王を倒すこと!",
                                "じゃぁクリア目指して頑張ってね",
                                "※このゲームは共同制作作品です"],
               
               "クレジットタイトル" => ["クレジットタイトル(スタッフロール)","システム","村井侑平 澤田羽衣",
                                        "システムアドバイザー","佐藤隆之助 阿部光峻",
                                        "広瀬雄二様 東北公益文科大学の皆様",
                                        "シナリオ","村井侑平 高橋真翔 佐藤風斗 佐藤然",
                                        "シナリオアドバイザー","佐藤隆之助 澤田羽衣 疋田琉莉 阿部光峻",
                                        "グラフィック","村井侑平",
                                        "この作品に関わった すべての方に感謝の意を申し上げます",
                                        "制作","「#みんなでゲームを作ろう」の会"],
               
               "目覚め" => ["\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[96,2m(近くの村人らしき男の人に声をかけた)",
                            "\e[96m_me_:すみません ここが どこか わかりますか",
                            "\e[2m村人:何いってるんだい?",
                            "\e[2m村人:ここは「パクス村」ディーヴァス川のほとりにある小さな農村さ",
                            "\e[2m村人:ここが初めてなら注意しておくけど「ポルタ平原」には魔物が出るから用意なしには行くなよ",
                            "\e[2m村人:最近プリーンビーストロードってのが現れて魔物が増えたんだけどな",
                            "\e[2m村人:森にも近づけなくて困ってるんだよ",
                            "\e[2m村人:まぁ旅 人なら宿屋で休んでいきな",
                            "\e[96m_me_:あっ _jibun_ お金持ってないんですけど",
                            "\e[2m村人:なんだお前さん一文無しかよ",
                            "\e[2m村人:しかたねーなー ここで会ったのも何かの縁だ",
                            "\e[2m村人:30Gやるから あとは魔物でも倒して自分で稼げ",
                            "(_me_は村人から30Gをもらった)",
                            "\e[2m村人:じゃぁな",
                            "\e[96,2m(_me_:とりあえずポルタ平原を探索しようかな)"],
               
               "プリーンビーストロード戦闘前" => ["\e96m_me_:うわっ",
                                                  "\e[96,2m(_jibun_の2倍ほどの四足歩行の巨体が姿を現した)",
                                                  "\e[91mプリーンビーストロード:＠※ ※※ ＆※ ＆＠ ×＠ ＠＆ ＠％゛＄＄ ￥※ ※※ ＃％",
                                                  "\e[91mプリーンビーストロード:×％ △＆ ＠％゛□＄ △＄ ＄％ ％＄"],

               "プリーンビーストロード勝利後" => ["\e[96m_me_:今のが\e[91mプリーンビーストロード\e[96mかな",
                                                  "\e[96m_me_:死ぬかと思った...",
                                                  "\e[96m_me_:この辺りで できることは もうあんまりないし",
                                                  "\e[96m_me_:最寄りの町に移動しようかな",
                                                  "(パクス村を出てしばらくして)",
                                                  "\e[96m_me_:あっ 村だ",
                                                  "\e[96,2m(近くに見えた村人らしき女の人に声をかけた)",
                                                  "\e[96m_me_:すみません 最寄りの町への道を教えてほしいんですが",
                                                  "\e[2m村人:ここから一番近いのは北東に行った先の鉱山都市〇〇だよ",
                                                  "\e[2m村人:でも強力な魔物が住み着いちまったみたいで 道中は危険だよ",
                                                  "\e[2m村人:かと言って他の町は馬車で一月かかるんだよな",
                                                  "\e[2m村人:魔物が住んじまったせいで踏んだり蹴ったりだよ",
                                                  "\e[2m村人:しばらく居るつもりなら歓迎するよ",
                                                  "\e[2m村人:ここは〇〇村 森の中の小さな農村だよ",
                                                  "(そう言って村人は去っていった)",
                                                  "\e[96,2m(_me_:町に行くためには無理にでも森を抜けないとな)"]
              }

    x = ["たいあたり"],["たいあたり"]*2+["突進"],["突進"],["魔法:闇の刃"],["たいあたり"]*2+["突進"],["魔法:飛礫"]*3+["たいあたり"]+["突進"]*7,["ヒール"]+["たいあたり"]*2,["パンチ"]*3,["魔法:リーフカッター"],["パンチ"]*13+["魔法:リーフカッター"]*6+["回復:ヒール"]
    e = CSV.read("enemy.csv",:headers => true,:converters => :numeric)
    for i in e["name"]
      i.gsub!("|","\e")
    end
    n = e["name"]
    hP = e["HP"]
    mP = e["MP"]
    aTS = e["ATS"]
    mAT = e["MAT"]
    dEF = e["DEF"]
    mDF = e["MDF"]
    dEX = e["DEX"]
    aGI = e["AGI"]
    lUK = e["LUK"]
    g = e["G"]
    eXP = e["EXP"]

    @@enemy = {"name" => n,
               "HP" => hP,
               "MAXHP" => hP,
               "MP" => mP,
               "MAXMP" => mP,
               "ATS" => aTS,
               "MAT" => mAT,
               "DEF" => dEF,
               "MDF" => mDF,
               "DEX" => dEX,
               "AGI" => aGI,
               "LUK" => lUK,
               "G" => g,
               "EXP" => eXP}
    
    @@enemy["攻撃"] = x
    @@enemy["エンカウント数"] = [0]*@@enemy["name"].length
    @@enemy["勝利数"] = [0]*@@enemy["name"].length
    @@enemy["敗北数"] = [0]*@@enemy["name"].length

    @@probability = [0]*99 + [4],[0]*67 + [2]*30 + [4]*3,[0]*45 + [2]*40 + [3]*20 + [4]*5,[0]*7 + [2]*65 + [3]*20 + [4]*8

    @@choices = {"プレイetc" => ["はじめから","つづきから","ゲーム説明","クレジットタイトル"],
                 "ロード" => ["ロードする","タイトルに戻る"],
                 "性別" => ["男","女"],
                 "一人称" => ["俺","僕","私"],
                 "メニュー" => ["ステータスを見る","アイテムを見る","装備を見る","宿屋に行く","武器屋に行く","アイテムショップに行く","教会に行く","探索に行く"],
                 "使うor使わない" => ["使う","使わない"],
                 "宿屋" => ["泊まる10G","泊まらない"],
                 "教会" => ["祈りを捧げる[セーブ]"],
                 "バトル" => ["攻撃","アイテム","逃げる"],
                 "進むor戻る" => ["深部に進む","拠点に戻る"]
                }

    @item = []

    @@itemlist = []

    @area = ["エリア１:ポルタ平原"]

    @attack = ["剣技:スラッシュ"]

    @@attack_list = {"剣技:スラッシュ" => [1,0,3,0],"たいあたり" => [2,1,1,0],"突進" => [3,1,0,0],
                     "魔法:闇の刃" => [3,0,2,0,0],"魔法:飛礫" => [3,0,3,2,1],
                     "魔法:マジックミサイル" => [1,0,1,0,1],"パンチ" => [1,1,2,3],
                     "剣技:疾風斬り" => [2,0,2,1],"魔法:ファイアーボール" => [3,0,3,0,0],
                     "回復:ヒール" => [5,5],"魔法:リーフカッター" => [3,0,3,1,0],
                     "Command:何もしない" => nil,
                     "回復Command:Soul Regeneration" => [10000,0],
                     "攻撃Command:Delete Life" => [10000,0,10000,10000] #<=管理者特権
                    }

    @@skill = CSV.read("skill.csv",:headers => true)
    @attack_ckeck = [0,0,-1,-1]

    @@shop_list = ["薬草",5,0],["傷薬",10,1]
    @@item_list = {"薬草" => [5,0],
                   "傷薬" => [10,0],
                   "マジックポーション" => [15,8]}
    
    @@pass = {"スーパーアカウント" => ["ADMINISTRATOR","HEALER"],
              "管理者" => ["管理者","administrator","ADMINISTRATOR"],
              "ヒーラー" => ["ヒーラー","HEALER","healer"]}
    
    @@key = ["name","性別","一人称","Lv","EXP","処理用EXP","前回のLvUP必要EXP","G","HP","MAXHP","MP","MAXMP","ATS","MAT","DEF","DEX","AGI","LUK","バトル数","勝利数","敗北数","逃走数"]

  end

  def question(choices,mold)
    kaisu = 0
    select = -1
    if mold == "hyozi"
      while kaisu < choices.length
        printf("%s ",choices[kaisu])
        print("\e[m")
        kaisu += 1
      end
    else
      while kaisu < choices.length
        printf("%s(%d) ",choices[kaisu],kaisu)
        print("\e[m")
        kaisu += 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 choices[select]
    elsif mold == "suji"
      @select = select
      return select
    else
      puts"questionメソッドでスペルミスしてるようだ"
    end
  end

  def talk(story,mold = "置き換え")
    print("\n")
    if not story == "なし"
      if mold == "置き換え"
        for i in @@story[story]
          puts(i.gsub("_me_",@status["name"])
                 .gsub("_jibun_",@status["一人称"])
                 .gsub("_seibetu_",@status["性別"])
              )
          print("\e[m")
          gets
        end
      elsif mold == "読み上げ"
        for i in @@story[story]
          puts i
          print("\e[m")
          gets
        end
      end
    end
  end

  def check(h)
    number = ["1","2","3","4","5","6","6","7","8","9","0"]
    x = h.split("")
    n = 0
    for i in x
      if  false == number.include?(x[n])
        return false
      end
      n += 1
    end
    return true
  end
  

  def first
    while true
      question(@@choices["プレイetc"],"moji")
      if @select == "はじめから"
        print("\n")
        puts("初期設定"+"="*42)
        print("\n")
        puts("PLの名前を決めてください")
        name = ""
        while name == ""
          print("name…")
          name = gets.chomp
          if @@pass["管理者"].include?(name) == true
            @status = {"Lv" => "\e[93m\"ADMINISTRATOR\"\e[m",
                       "EXP" => 0,
                       "処理用EXP" => 0,
                       "LvUP必要EXP" => 8,
                       "前回のLvUP必要EXP" => 0,
                       "G" => 100000000,
                       "HP" => 100000000,
                       "MAXHP" => 100000000, 
                       "MP" => 100000000,
                       "MAXMP" => 100000000,
                       "ATS" => 100000000,
                       "MAT" => 100000000, 
                       "DEF" => 100000000,
                       "MDF" => 100000000,
                       "DEX" => 100000000,
                       "AGI" => 100000000,
                       "LUK" => 100000000
                      }
            @attack << "Command:何もしない"
            @attack << "攻撃Command:Delete Life"
            puts('コード"管理者"を認証しました')
            puts("スーパーアカウントの使用を許可します")
            x = "OK"
            redo

          elsif @@pass["ヒーラー"].include?(name) == true
            @status = {"Lv" => "\e[92m\"HEALER\"\e[m",
                       "EXP" => 0,
                       "処理用EXP" => 0,
                       "LvUP必要EXP" => 8,
                       "前回のLvUP必要EXP" => 0,
                       "G" => 30,
                       "HP" => 100000000,
                       "MAXHP" => 100000000, 
                       "MP" => 3,
                       "MAXMP" => 3, 
                       "ATS" => 8,
                       "MAT" => 5, 
                       "DEF" => 5,
                       "MDF" => 3,
                       "DEX" => 20,
                       "AGI" => 15,
                       "LUK" => 1
                      }
            @attack << "Command:何もしない"
            @attack << "回復Command:Soul Regeneration"
            puts('コード"ヒーラー"を認証しました')
            puts("スーパーアカウントの使用を許可します")
            x = "OK"
            redo
          end
        end

        if x.nil? == true
          @status = {"Lv" => 1,
                     "EXP" => 0,
                     "処理用EXP" => 0,
                     "LvUP必要EXP" => 8,
                     "前回のLvUP必要EXP" => 0,
                     "G" => 30,
                     "HP" => 20,
                     "MAXHP" => 20, 
                     "MP" => 3,
                     "MAXMP" => 3, 
                     "ATS" => 8,
                     "MAT" => 5, 
                     "DEF" => 5,
                     "MDF" => 3,
                     "DEX" => 20,
                     "AGI" => 15,
                     "LUK" => 1
                    }
        end
        @status["name"] = name
        @status["バトル数"] = 0
        @status["勝利数"] = 0
        @status["敗北数"] = 0
        @status["逃走数"] = 0
        print("\n")
        puts("性別を決めてください")
        @status["性別"] = question(@@choices["性別"],"moji")
        print("\n")
        puts("一人称を決めてください")
        @status["一人称"] = question(@@choices["一人称"],"moji")
        talk("目覚め")
        menu

      elsif @select == "つづきから"
        redo
        puts("セーブデータが ない場合はプログラムが強制終了されますが よろしいですか")
        question(@@choices["ロード"],"moji")
        if @select == "タイトルに戻る"
          redo
        end
        data = CSV.read("RPG.csv")
        @status = data["ステータス"]
        @item = data["アイテム"]
        menu
      elsif @select == "ゲーム説明"
        talk("ゲーム説明","読み上げ")

      elsif @select == "クレジットタイトル"
        talk("クレジットタイトル","読み上げ")
        
      end
    end
  end
  
  def display
    print("\n")
    puts("="*50)
    printf("name:%s Lv.%s ",@status["name"],@status["Lv"])
    if @status["EXP"].nil? == false
      printf("EXP:%d %dG\n",@status["EXP"],@status["G"])
      printf("HP:%d/%d MP:%d/%d",@status["HP"],@status["MAXHP"],@status["MP"],@status["MAXMP"])
    else
      print("%sG\n",@status["G"])
      print("HP:%s MP:%s",@status["HP"],@status["MP"])
    end
    printf("ATS:%s MAT:%s DEF:%s MDF:%s DEX:%s AGI:%s LUK:%s",@status["ATS"],@status["MAT"],@status["DEF"],@status["MDF"],@status["DEX"],@status["AGI"],@status["LUK"])
    print("\n")
    puts("="*50)
    print("\n")
  end

  def item
    print("\n")
    puts("="*50)
    if @item.length == 0
      puts("所持アイテムはありません")
    else
      while true
        x = @item + ["戻る"]
        question(x,"suji")
        i = x[@select]
        if x[@select] == x[-1]
          return
        end
        if question(@@choices["使うor使わない"],"moji") == "使う"
          p i
          p @@item_list
          @status["HP"] += @@item_list[i][0]
          @status["MP"] += @@item_list[i][1]
          
        else
          redo
        end
      end
    end
    puts("="*50)
    print("\n")
  end
  
  def kyoukai
    return
    question(@@choices["教会"]+["戻る"],"moji")
    if @select == "祈りを捧げる[セーブ]"
      print("Praying(Saving)")
      dot(["."]*3,1)

      items = @item.join("/")

      data = []
      n = 0
      for i in @@key
        data << @status[i]
      end
      data << items
      p data
      CSV.open("RPG.csv","w") do |c|
        data.each{|row| c << row}
      end

    elsif @select == "戻る"
      return
    end
  end
  
  def yadoya
    puts("宿屋の主人:一泊10Gだよ")
    if question(@@choices["宿屋"],"moji") == "泊まる10G"
      if not @status["G"] >= 10
        puts("宿屋の主人:お前 金持ってないのか!?")
        puts("宿屋の主人:冷やかしは帰れ!!")
        return
      else
        @status["G"] -= 10
      end
      @status["HP"] = @status["MAXHP"]
      @status["MP"] = @status["MAXMP"]
      print("Sleeping")
      dot(["."]*3,1)
      print("\n")
    else
      puts("宿屋の主人:なんだ 泊まんねーのかよ")
    end
  end

  def item_shop
    puts("店の店主:どれを買う?")
    x = 0
    a = []
    b = []
    for i in @area
      y = /クリア/ !~ i
      if y == false
        x += 1
      end
    end
    for i in @@shop_list
      if i[2] <= x
        a << i[0]
        b << i[1]
      end
    end
    question(a+["戻る"],"suji")
    if @select == a.length
      return
    end
    if @status["G"] >= b[@select]
      @status["G"] -= b[@select]
      @item << a[@select]
      puts("店の店主:ありがとな また買ってくれ")
    else
      puts("店の店主:こら お金もないのに 買うと言わない!")
    end
  end

  def dot(dot,matu)
    for i in dot
      print i
      sleep(matu)
    end
  end

  def tansaku
    x = @area + ["戻る"]
    select = question(x,"moji")
    if select == "エリア１:ポルタ平原"
      battle(0,3,select,5,"プリーンビーストロード戦闘前","プリーンビーストロード勝利後")
    end
  end

  def encounter(list)
    return list[rand(list.length)]
  end
  
  def battle(s,e,area,boss,t1,t2)
    for n in @@probability[s..e]
      @teki = encounter(n)
      sleep(rand(40)/10)
      @status["バトル数"] += 1
      @@enemy["エンカウント数"][@teki] += 1
      game
      if @result == "勝ち"
        print("\n")
        printf("%s\e[mに勝った!\n",@@enemy["name"][@teki])
        print("\n")
        x = @@enemy["EXP"][@teki] + ((@@enemy["EXP"][@teki]/10).floor * (rand(3) + 1) + (rand(3) + 1))
        @status["EXP"] += x
        @status["処理用EXP"] += x
        @status["G"] += @@enemy["G"][@teki] + ((@@enemy["G"][@teki]/10).floor * (rand(3) + 1) + (rand(3) + 1))
        @status["勝利数"] += 1
        @@enemy["勝利数"][@teki] += 1
        level
      elsif @result == "負け"
        gameovre                #GAMEOVREのメソッド
        @status["HP"] = @status["MAXHP"] #HP全快
        @status["MP"] = @status["MAXMP"] #MP全快
        @status["G"] -= ((@status["G"]/10).floor + 10)#Gを減らす
        if @status["G"] < 0                #Gが0未満になった場合
          @status["G"] = 0
        end
        @status["敗北数"] += 1
        @@enemy["敗北数"][@teki] += 1
        return
      elsif @result == "逃走"
        @status["逃走数"] += 1
        return
      end
      question(@@choices["進むor戻る"],"moji")
      if @select == "拠点に戻る"
        return
      end
    end
    x =  /クリア/ !~ area
    if false == x
      puts("もう先には行けなさそうだ")
      return
    end
    puts("この先から禍々しい気配がする")
    question(@@choices["進むor戻る"],"moji")
    if @select == "深部に進む"
      @teki = boss
      talk(t1)
      game
      if @result == "勝ち"
        print("\n")
        printf("%sの主 %s\e[mに勝った!\n",area,@@enemy["name"][@teki])
        print("\n")
        x = @@enemy["EXP"][@teki] + ((@@enemy["EXP"][@teki]/10).floor * (rand(3) + 1) + (rand(3) + 1))
        @status["EXP"] += x
        @status["処理用EXP"] += x
        @status["G"] += @@enemy["G"][@teki] + ((@@enemy["G"][@teki]/10).floor * (rand(3) + 1) + (rand(3) + 1))
        @status["勝利数"] += 1
        @@enemy["勝利数"][@teki] += 1
        level
      elsif @result == "負け"
        gameovre                #GAMEOVREのメソッド
        @status["HP"] = @status["MAXHP"] #HP全快
        @status["MP"] = @status["MAXMP"] #MP全快
        @status["G"] -= ((@status["G"]/5).floor + 30)#Gを減らす
        if @status["G"] < 0                #Gが0未満になった場合
          @status["G"] = 0
        end
        @status["敗北数"] += 1
        @@enemy["敗北数"][@teki] += 1
        return
      end
      talk(t2)
      addition(area)
    end
  end

  def gameovre
    puts("GAMEOVER")
    picture = spawn "display -geometry +0+0 gameover.png"
    gets
    Process.kill(:INT,picture)
  end
  
  def syouhai
    if @@enemy["HP"][@teki] <= 0 || @status["HP"] <= 0 || @result == "逃走"
      return true
    end
    return false
  end

  def game
    print("戦闘")
    dot(["="]*20,0.01)
    print("\n")
    @@enemy["HP"][@teki] = @@enemy["MAXHP"][@teki]
    printf("%s\e[mが現れた",@@enemy["name"][@teki])
    turn = rand(2)
    @result = "戦闘"
    while  true
      if @status["DEX"] > @@enemy["DEX"][@teki]
        myturn
        if syouhai == true
          break
        end
        enemyturn
      elsif @status["DEX"] < @@enemy["DEX"][@teki]
        enemyturn
        if syouhai == true
          break
        end
        myturn
      elsif @status["DEX"] == @@enemy["DEX"][@teki]
        if ture == 0
          myturn
          if syouhai == true
            break
          end
          enemyturn
        else
          enemyturn
          if syouhai == true
            break
          end
          myturn
        end
      end
      if syouhai == true
        break
      end
    end
    if @status["HP"] <= 0
      @result = "負け"
    elsif @@enemy["HP"][@teki] <= 0
      @result = "勝ち"
    end
  end

  def enemyturn
    @turn = "敵"
    x = ["攻撃","剣技","魔法","魔剣","回復"]
    @waza = encounter(@@enemy["攻撃"][@teki])
    type = x.index(@waza[0..1])
    puts @waza
    if type == 2
      magic
    elsif type == 3
      magic_sword
    elsif type == 4
      heal
    else
      sword
    end
  end

  def sword
    if @turn == "敵"
      @damage = @@enemy["ATS"][@teki] + @@attack_list[@waza][0] - ((@status["DEF"] / 2).floor)
      @@enemy["HP"][@teki] -= @@attack_list[@waza][1]
      if @damage <= 0
        @damae = 0
        @damage += 1
        @damage += (@@attack_list[@waza][0]/10).floor
      end
      if  rand((@@enemy["AGI"][@teki]*2+@@enemy["DEX"][@teki]+@@enemy["LUK"][@teki]/2).floor*2)+@@attack_list[@waza][-2] > rand(((@status["DEX"]*2+@status["AGI"]+@status["LUK"]/2).floor/2).floor)
        if rand(((@@enemy["AGI"][@teki]*2+@@enemy["DEX"][@teki]+@@enemy["LUK"][@teki]/2).floor/4).floor)+@@attack_list[@waza][-1] > rand((@status["DEX"]*2+@status["AGI"]+@status["LUK"]/2).floor)
          @damage = (@damage*1.5).floor
        end
        @status["HP"] -= @damage
      else
        @damage = 0
      end
    elsif @turn == "PL"
      @damage = @status["ATS"] + @@attack_list[@waza][0] - ((@@enemy["DEF"][@teki] / 2).floor)
      @status["HP"] -= @@attack_list[@waza][1]
      if @damage <= 0
        @damage = 0
        @damage += 1
        @damage += (@@attack_list[@waza][0]/10).floor
      end
      if rand((@status["AGI"]*2+@status["DEX"]+@status["LUK"]/2).floor*2)+@@attack_list[@waza][-2] > rand(((@@enemy["DEX"][@teki]*2+@@enemy["AGI"][@teki]+@@enemy["LUK"][@teki]/2).floor/2).floor)
        if rand(((@status["AGI"]*2+@status["DEX"]+@status["LUK"]/2).floor/4).floor)+@@attack_list[@waza][-1] > rand((@@enemy["DEX"][@teki]*2+@@enemy["AGI"][@teki]+@@enemy["LUK"][@teki]/2).floor)
          @damage = (@damage*1.5).floor
        end
      else
        @damage = 0
      end
      @@enemy["HP"][@teki] -= @damage
    end
    process
  end

  def magic
    mp = @@attack_list[@waza][2] + rand(4)
    if @turn == "敵"
      if mp > @@enemy["MP"][@teki]
        mp = @@attack_list[@waza][2]
      end
      if mp > @@enemy["MP"][@teki]
        mp = @@enemy["MP"][@teki]
      end
      @damage = @@enemy["MAT"][@teki] * ((mp/2).floor +1) + @@attack_list[@waza][0] - (@status["MDF"]/3).floor - (@status["MP"]/5).floor
      @@enemy["MP"][@teki] -= mp
      @@enemy["HP"][@teki] -= @@attack_list[@waza][1]
      if @damage <= 0
        @damage = 0
        @damage += 1
        @damage += (@@attacl_list[@waza][0]/10).floor
      end
      if  rand((@@enemy["AGI"][@teki]*2+@@enemy["DEX"][@teki]+@@enemy["LUK"][@teki]/2).floor*2)+@@attack_list[@waza][-2] > rand(((@status["DEX"]*2+@status["AGI"]+@status["LUK"]/2).floor/2).floor)
        if rand(((@@enemy["AGI"][@teki]*2+@@enemy["DEX"][@teki]+@@enemy["LUK"][@teki]/2).floor/4).floor)+@@attack_list[@waza][-1] > rand((@status["DEX"]*2+@status["AGI"]+@status["LUK"]/2).floor)
          @damage = (@damage*1.5).floor
        end
        @status["HP"] -= @damage
      else
        @damage = 0
      end
      
    elsif @turn == "PL"
      if mp > @status["MP"]
        mp = @@attack_list[2]
      end
      if mp > @status["MP"]
        mp = @status["MP"]
      end
      @damage = @status["MAT"] * ((mp/2).floor +1) + @@attack_list[@waza][0] - (@@enemy["MDF"][@teki]/3).floor - (@@enemy["MP"][@teki]/5).floor
      @status["MP"] -= mp
      @status["HP"] -= @@attack_list[@waza][1]
      if @damage <= 0
        @damage = 0
        @damage += 1
        @damage += (@@attacl_list[@waza][0]/10).floor
      end
      if rand((@status["AGI"]*2+@status["DEX"]+@status["LUK"]/2).floor*2)+@@attack_list[@waza][-2] > rand(((@@enemy["DEX"][@teki]*2+@@enemy["AGI"][@teki]+@@enemy["LUK"][@teki]/2).floor/2).floor)
        if rand(((@status["AGI"]*2+@status["DEX"]+@status["LUK"]/2).floor/4).floor)+@@attack_list[@waza][-1] > rand((@@enemy["DEX"][@teki]*2+@@enemy["AGI"][@teki]+@@enemy["LUK"][@teki]/2).floor)
          @damage = (@damage*1.5).floor
        end
      else
        @damage = 0
      end
      @@enemy["HP"][@teki] -= @damage
    end
    process
  end
  
  def magic_sword
    mp = @@attack_list[@waza][2] + rand(4)
    if @turn == "敵"
      if mp > @@enemy["MP"][@teki]
        mp = @@attack_list[@waza][2]
      end
      if mp > @@enemy["MP"][@teki]
        mp = @@enemy["MP"][@teki]
      end
      @damage = ((@@enemy["MAT"][@teki]/3).floor + (@@enemy["ATS"][@teki]/2).floor) * ((mp/2).floor +1) * (@@attack_list[@waza][0]/5).floor - (@status["MDF"]/5).floor - (@status["MP"]/8).floor - (@status["DEF"]/3).floor
      @@enemy["MP"][@teki] -= mp
      @@enemy["HP"][@teki] -= @@attack_list[@waza][1]
      if @damage <= 0
        @damage = 0
        @damage += 1
        @damage += (@@attacl_list[@waza][0]/10).floor
      end
      if  rand((@@enemy["AGI"][@teki]*2+@@enemy["DEX"][@teki]+@@enemy["LUK"][@teki]/2).floor*2)+@@attack_list[@waza][-2] > rand(((@status["DEX"]*2+@status["AGI"]+@status["LUK"]/2).floor/2).floor)
        if rand(((@@enemy["AGI"][@teki]*2+@@enemy["DEX"][@teki]+@@enemy["LUK"][@teki]/2).floor/4).floor)+@@attack_list[@waza][-1] > rand((@status["DEX"]*2+@status["AGI"]+@status["LUK"]/2).floor)
          @damage = (@damage*1.5).floor
        end
        @status["HP"] -= @damage
      else
        @damage = 0
      end
    elsif @turn == "PL"
      if mp > @status["MP"]
        mp = @@attack_list[@waza][2]
      end
      if mp > @status["MP"]
        mp = @status["MP"]
      end
      @damage = (@status["MAT"]/3).floor + (@status["ATS"]/2).floor * ((mp/2).floor +1) * (@@attack_list[@waza][0]/5).floor - (@@enemy["MDF"][@teki]/5).floor - (@@enemy["MP"][@teki]/8).floor - (@@enemy["DEF"]/3).floor
      @status["MP"] -= mp
      @status["HP"] -= @@attack_list[@waza][1]
      if @damage <= 0
        @damage = 0
        @damage += 1
        @damage += (@@attacl_list[@waza][0]/10).floor
      end
      if rand((@status["AGI"]*2+@status["DEX"]+@status["LUK"]/2).floor*2)+@@attack_list[@waza][-2] > rand(((@@enemy["DEX"][@teki]*2+@@enemy["AGI"][@teki]+@@enemy["LUK"][@teki]/2).floor/2).floor)
        if rand(((@status["AGI"]*2+@status["DEX"]+@status["LUK"]/2).floor/4).floor)+@@attack_list[@waza][-1] > rand((@@enemy["DEX"][@teki]*2+@@enemy["AGI"][@teki]+@@enemy["LUK"][@teki]/2).floor)
          @damage = (@damage*1.5).floor
        end
      else
        @damage = 0
      end
      @@enemy["HP"][@teki] -= @damage
    end
    process
  end

  def heal
    mp = @@attack_list[@waza][1] + rand(4)
    if @turn == "敵"
      if mp > @@enemy["MP"][@teki]
        mp = @@attack_list[@waza][1]
      end
      if mp > @@enemy["MP"][@teki]
        mp = @@enemy["MP"][@teki]
      end
      @damage = @@attack_list[@waza][0] + mp + rand(4)
      @@enemy["HP"][@teki] += @smgw
      if @@enemy["HP"][@teki] > @@enemy["MAXHP"][@teki]
        @@enemy["HP"][@teki] = @@enemy["MAXHP"][@teki]
      end
    elsif @turn == "PL"
      if mp > @status["MP"]
        mp = @@attack_list[@waza][1]
      end
      if mp > @status["MP"]
        mp = @status["MP"]
      end
      @damage = @@attack_list[@waza][0] + mp + rand(4)
      @status["HP"] += @damage
      if @status["HP"] > @status["MAXHP"]
        @status["HP"] = @status["MAXHP"]
      end
    end
    process("回復")
  end

  def myturn
    display
    while true
      question(@@choices["バトル"],"moji")
      if @select == "攻撃"
        x = @attack + ["戻る"]
        @waza = question(x,"moji")
        if @waza == "戻る"
          redo
        end
        puts @waza
        @turn = "PL"
        x = ["攻撃","剣技","魔法","魔剣","回復"]
        if not @waza == "Command:何もしない"
          type = x.index(@waza[0..1])
          if type == 2
            magic
          elsif type == 3
            magic_sword
          elsif type == 4
            heal
          else
            sword
          end
        end

        print("\n")
        return
      elsif @select == "アイテム"
        item
      elsif @select == "逃げる"
        x =  /ボス/ !~ @@enemy["name"][@teki]
        if not x == false
          if rand((@status["DEF"] + @status["LUK"])*2) > rand(@@enemy["DEX"][@teki]+@@enemy["LUK"][@teki])
            puts("逃げ切れた")
            @result = "逃走"
            return
          else
            puts("逃げ切れなかった")
            return
          end
        else
          puts("逃げ切れなかった")
          return
        end
      end
    end
  end

  def level
    if not @status["Lv"] == 99 && @@pass["スーパーアカウント"].include?(@status["Lv"]) == false
      while 0 >= @status["LvUP必要EXP"]-@status["処理用EXP"]
        puts("レベルアップ!")
        @status["Lv"] += 1
        printf("Lv%s→Lv%s\n",@status["Lv"]-1,@status["Lv"])
        @status["処理用EXP"] -= @status["LvUP必要EXP"]
        @status["前回のLvUP必要EXP"] = @status["LvUP必要EXP"]
        @status["LvUP必要EXP"] = (@status["前回のLvUP必要EXP"]*1.1).ceil
        @status["MAXHP"] = (@status["MAXHP"]*1.053).ceil
        @status["MAXMP"] = (@status["MAXMP"]*1.044).ceil
        @status["ATS"] = (@status["ATS"]*1.05).ceil
        @status["MAT"] = (@status["MAT"]*1.035).ceil
        @status["DEF"] = (@status["DEF"]*1.043).ceil
        @status["MDF"] = (@status["MDF"]*1.04).ceil
        @status["DEX"] = (@status["DEX"]*1.045).ceil
        @status["AGI"] = (@status["AGI"]*1.045).ceil
        @status["LUK"] = @status["Lv"]
        if  not @@skill[@status["Lv"].to_s][0] == nil
          for i in @@skill[@status["Lv"].to_s]
            @attack << i
          end
        end
        if @status["Lv"] == 99
          @status["MP"] = 800
          @status["ATS"] = 120
          @status["DEF"] = 150
          @status["DEX"] = 250
          @status["AGI"] = 200
        end
      end
    end
    display
  end

  def addition(mold)
    if mold == "エリア１:ポルタ平原"
      @area[0] = "エリア１:ポルタ平原(クリア)"
      @area[1] = "〇〇森"
    end
  end

  def achievement
    if @@enemy["勝利数"][0]+@@enemy["勝利数"][1]*2 >= 50
      @area << "ダンジョン:スライムの巣"
      @area.sort!
    end
  end

  def process(mold = "無")
    if mold == "他"
    elsif @damage == 0
      puts("ミス")
    elsif mold == "回復"
      printf("回復した\n",@damage)
    else
      printf("%dダメージ!\n",@damage)
    end
  end
  
  def menu
    while true
      select = question(@@choices["メニュー"],"moji")
      print("\n")
      if select == "ステータスを見る"
        display
      elsif select == "アイテムを見る"
        item
      elsif select == "装備を見る"

      elsif select == "宿屋に行く"
        yadoya
      elsif select == "武器屋に行く"

      elsif select == "アイテムショップに行く"
        item_shop
      elsif select == "教会に行く"
          kyoukai
      elsif select == "探索に行く"
        tansaku
      end
    end
  end
end

x = RPG.new
x.first
