Newer
Older
Ruby / RPG (コピー) / Class_DANGEON.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'csv'
require './Class_MONSTER'
require './Module_QUESTION'

class DANGEON
  include QUESTION
  #attr_accessor クラス外でインスタンス変数を参照するためのもの
  #クラス変数には適用されないためクラス変数の場合はgetter・setterを作る必要がある
  attr_accessor :dangeon_name
  attr_accessor :dangeon_data
  
  def initialize(name)
    @dangeon_name = name
    #下記の方法より良い方法があると思う
    csv = CSV.read("POP_Monster.csv")
    data={}
    csv[1..].length.times do |n|
      x={}
      csv[0][1..].length.times do |m|
        if csv[n+1][m+1] =~ /:/
          z={}
          y=csv[n+1][m+1].split(",")
          for i in y
            l=i.split(":")
            z[l[0]]=number_change(l[1])
          end
          x[csv[0][m+1]]=z
        elsif csv[0][m+1] == "数アップ"
          if csv[n+1][m+1].nil?
            x[csv[0][m+1]]=[]
          else
            x[csv[0][m+1]]=[]
            for i in csv[n+1][m+1].split(",")
              x[csv[0][m+1]] << number_change(i)
            end
          end
        else
          x[csv[0][m+1]]=number_change(csv[n+1][m+1])
        end
      end
      data[csv[n+1][0]]=x
    end
    @@dangeons_data=data
    if not @@dangeons_data.keys.include?(name)
      fail "不明なダンジョン名が入力されています"
    end
    
    @dangeon_data=@@dangeons_data[name]
    monsters=MONSTER.new.monsters_data_getter
    @@monsters_data=monsters
  end

  def pop_monster_random(area_number=1)
    
    x=[@dangeon_data["バトル数"]/@dangeon_data["POPモンスター"].keys.length]*@dangeon_data["POPモンスター"].keys.length
    (@dangeon_data["バトル数"]%@dangeon_data["POPモンスター"].keys.length).times do |n|
      x[-(n%x.length)-1]+=1
    end
    y=[]
    x.length.times do |n|
      y<<[n]*x[n]
    end
    y.flatten!
    pop_monster=Marshal.load(Marshal.dump(@dangeon_data["POPモンスター"]))
    
    num=y[area_number-1]
    
    pop_monster.keys.length.times do |n|
      if num!=0
        if num==n
          pop_monster[pop_monster.keys[n]]+pop_monster.values.sum/5*2
        elsif num+1==n
          pop_monster[pop_monster.keys[n]]+=pop_monster.values.sum/5
        elsif num-1>n
          pop_monster[pop_monster.keys[n]]-=pop_monster.values.sum/5*(num-1-n)
        end
      end
    end
    list=[]
    for i in pop_monster.keys
      if pop_monster[i]>0
        list<<[i]*pop_monster[i]
      end
    end
    monsters=[]
    many=1
    for i in @dangeon_data["数アップ"]
      if i <= area_number
        many+=1
      end
    end
    many.times do
      monsters<<list.flatten.sample
    end
    return monsters
  end

  def dangeons_data_getter
    return @@dangeons_data
  end

  def dangeon_start(hero)
    @dangeon_data["バトル数"].times do |n|
      monsters=pop_monster_random(n+1)
      result=BATTLE.new.start([["PL"],monsters],hero)
      if result[1]!="WIN"
        if result[0].status["HP"] <= 0
          result[0].status=result[0].recovery(result[0].status,result[0].status["MAXHP"],result[0].status["MAXMP"])
          result[0].status["G"]-= (result[0].status["G"]*0.02*(n+1)).ceil
        end
        return [result[0]]
      end
      print"\e[2J\e[0;0H"
      print n==@dangeon_data["バトル数"]-1 ? "この先から異様な気配がする\n" : ""
      puts"深部に進みますか?"
      case question(["進む","拠点に戻る"],"moji")
      when "進む"
        
      when "拠点に戻る"
        return [result[0]]
      else
        puts"Class_DANGEON.rbのdangeon_startでError"
      end  
    end
    puts"ボスバトル!! #{@dangeon_data["二つ名"]}:#{@dangeon_data["ボス"]}"
    pid=spawn"display -geometry +0+0 #{@dangeon_data["ボス"]}.jpg"
    result=BATTLE.new.start([["PL"],@dangeon_data["ボス"].split("&")],hero)
    Process.kill(:INT, pid)
    if result[1]!="WIN"
      if result[0].status["HP"] <= 0
        result[0].status=result[0].recovery(result[0].status,result[0].status["MAXHP"],result[0].status["MAXMP"])
        result[0].status["G"] -= (result[0].status["G"]*0.02*(@dangeon_data["バトル数"]+(@dangeon_data["バトル数"]/5).floor)).ceil
      end
      return [result[0]]
    end
    puts"#{@dangeon_data["二つ名"]}:#{@dangeon_data["ボス"]}に勝利した"
    return [result[0],@dangeon_data["開放場所"]]
  end
  
end