#!/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