Newer
Older
Ruby / StudyRPG.rb
#!/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

#数学
#算数(算術)
#計算(演算)
#公式
#式
#表
#図
#解
#数
#ディ・シプリーナ闘技場(練習)

#探索
#アイテムショップ
#宿屋
#教会
#ステータス
#必殺技セット