Project1

标题: 自制敌人数据库文件+敌人等级随我方变化 [发布预备] [打印本页]

作者: hide秀    时间: 2008-7-5 09:56
标题: 自制敌人数据库文件+敌人等级随我方变化 [发布预备]
自制敌人数据库文件 + 敌人等级随我方变化

作者:秀秀

由于原敌人数据库没有等级和等级能力变化曲线
所以自己制作了个敌人数据库
里面只定义了等级和能力变化曲线
如果不满足需求,比如还需要定义敌人经验啊 经验曲线 职业 等等
自行添加即可

由于公开了 数据库结构 制作 读取 全过程
是需要比较坚实的基础才能理解
所以小设了一点点vip{/wx}

也希望留给大家研究

最后说下。。。此脚本还赠送了 敌人等级随我方变化

ms 这个系统比较针对某口袋妖怪。。{/cy}

请别见怪...其实自己闲的无聊 才想写{/cy}

有bug请留言~

具体用法见脚本开始的说明

------------下载范例--------------------------------------------------------
http://rpg.blue/upload_program/f ... 变化_95652411.rar
----------------------------------------------------------------------------

脚本部分


=begin

  自制敌人数据库 + 敌人等级随我方变化

  作者:秀秀

  用法:1.数据库设置
          见开始的几个常量
          HP_RATE    表示敌人随等级HP(以下类推)增长倍率
          SP_RATE    公式 maxhp * (HP_RATE) ** level
          STR_RATE   可以自行找到脚本的地方修改公式
          DEX_RATE
          AGI_RATE
          INT_RATE
  
        2.数据库制作:
          (默认已经做好了,要自己做只需要在第一步设置好,
           再制作一遍会覆盖掉,或者删除掉已经做好的文件)
          使用函数 Enemy_data.create_data 来制作
          会产生一个目录SELF_DATA
          里面有个Enemy_data.rxdata文件
          运行时候检测到这个文件会自动读取到
          全局变量$enemy_data
        
        3.数据库使用
          比如要设置1号敌人的等级为30
          $game_system.enemies_level.levels[1] = 30
          要获取10号敌人35级时候的str
          $enemy_data[10].str_list[35]
          以下数据使用方法相同 不说了
          hp_list
          sp_list   
          dex_list
          agi_list         
          int_list
        4.赠送敌人随我方平均等级变化(默认为true)
          等级浮动范围见脚本开始的常量 LEVEL_RANGE
          开始的常量  Enemy_data.with_player_level(true) 则为变化
                      Enemy_data.with_player_level(false) 则不变化
          不随玩家等级变化的话 游戏中需完家自己改变敌人等级 来变化
          改变方法见上 = =
=end


                        
module Enemy_data
  
  # 等级变化范围 (-4..4)
  LEVEL_RANGE = rand(5) - rand(5)
  
  # 敌人随等级能力增长倍率
  HP_RATE = 1.1
  SP_RATE = 1.1
  STR_RATE = 1.1
  DEX_RATE = 1.1
  AGI_RATE = 1.1
  INT_RATE = 1.1
  
  #最大等级
  MAX_LEVEL = 99
  
  @@with_player_level = true
  
  def self.with_player_level(tf)
    @@with_player_level = tf
    return
  end
  
  def self.return_wpl
    return @@with_player_level
  end  
  
  def self.create_data
    Dir.mkdir("SELF_DATA") unless File.exists?("SELF_DATA")
    File.open("SELF_DATA/Enemy_data.rxdata","wb")
    datas = {}
    for i in 1...$data_enemies.size
      datas = (Pm_Enemy.new)
      for j in 1..(MAX_LEVEL)
        datas.hp_list[j] = (
        $data_enemies.maxhp * (HP_RATE) ** j).to_i
      end
      for j in 1..(MAX_LEVEL)
        datas.sp_list[j] = (
        $data_enemies.maxsp * (SP_RATE) ** j).to_i
      end
      for j in 1..(MAX_LEVEL)
        datas.str_list[j] = (
        $data_enemies.str * (STR_RATE) ** j).to_i
      end
      for j in 1..(MAX_LEVEL)
        datas.dex_list[j] = (
        $data_enemies.dex * (DEX_RATE) ** j).to_i
      end
      for j in 1..(MAX_LEVEL)
        datas.agi_list[j] = (
        $data_enemies.agi * (AGI_RATE) ** j).to_i
      end
      for j in 1..(MAX_LEVEL)
        datas.int_list[j] = (
        $data_enemies.int * (INT_RATE) ** j).to_i
      end
    end
    save_data(datas,"SELF_DATA/Enemy_data.rxdata")
    p "数据库制作成功"
    exit
  end  

  
  class Pm_Enemy
    attr_accessor     :hp_list
    attr_accessor     :sp_list
    attr_accessor     :str_list
    attr_accessor     :dex_list
    attr_accessor     :agi_list
    attr_accessor     :int_list
    attr_accessor     :level
    def initialize
      @hp_list = {}
      @sp_list = {}
      @str_list = {}
      @dex_list = {}
      @agi_list = {}
      @int_list = {}
      @level = 1
    end  
  end  
end  

class Game_Party
  #--------------------------------------------------------------------------
  # ● 获取平均等级
  #--------------------------------------------------------------------------
  def avg_level
    # 同伴人数为 0 的情况下
    if @actors.size == 0
      return 0
    end
    # 初始化本地变量 level
    level = 0
    # 求得同伴的最大等级
    for actor in @actors
      level += actor.level
    end
    return Integer(level/@actors.size)
  end
end


class Enemies_Level
  attr_accessor   :levels
  def initialize
    @levels = {}
    create_enemy_level
  end
  def create_enemy_level
     for i in 1...$data_enemies.size
       @levels = 1
     end  
  end  
end  

              
class Game_System
  attr_accessor     :enemies_level
  alias oir_initialize initialize                     
  def initialize                     
    oir_initialize           
    @enemies_level = Enemies_Level.new
  end                     
end

class Game_Enemy < Game_Battler

  def level=(level)
    @level = [[level, Enemy_data::MAX_LEVEL].min, 1].max
  end

  def base_maxhp
    return $enemy_data[@enemy_id].hp_list[
          Enemy_data.return_wpl ? (Enemy_data::LEVEL_RANGE +
          $game_party.avg_level) : (
          $game_system.enemies_level.levels[@enemy_id])]
  end

  def base_maxsp
    return $enemy_data[id].sp_list[
           Enemy_data.return_wpl ? (Enemy_data::LEVEL_RANGE +
           $game_party.avg_level) : (
           $game_system.enemies_level.levels[@enemy_id])]
  end

  def base_str
    return $enemy_data[id].str_list[
           Enemy_data.return_wpl ? (Enemy_data::LEVEL_RANGE +
           $game_party.avg_level) : (
           $game_system.enemies_level.levels[@enemy_id])]
  end

  def base_dex
    return $enemy_data[id].dex_list[
           Enemy_data.return_wpl ? (Enemy_data::LEVEL_RANGE +
           $game_party.avg_level) : (
           $game_system.enemies_level.levels[@enemy_id])]
  end

  def base_agi
    return $enemy_data[id].agi_list[
           Enemy_data.return_wpl ? (Enemy_data::LEVEL_RANGE +
           $game_party.avg_level) : (
           $game_system.enemies_level.levels[@enemy_id])]
  end

  def base_int
    return $enemy_data[id].int_list[
           Enemy_data.return_wpl ? (Enemy_data::LEVEL_RANGE +
           $game_party.avg_level) : (
           $game_system.enemies_level.levels[@enemy_id])]
  end
end

$enemy_data = load_data("SELF_DATA/Enemy_data.rxdata") if File.exists?(
                        "SELF_DATA/Enemy_data.rxdata")

作者: bububinghe    时间: 2008-7-5 10:34
脚本...学习中啊./..

作者: 越前止まる殇    时间: 2008-7-5 17:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: 冰の红苹果    时间: 2008-7-5 17:35
提示: 作者被禁止或删除 内容自动屏蔽
作者: yangff    时间: 2008-7-5 19:12
其实这和口袋没多大关系{/gg}
作者: 越前リョーマ    时间: 2008-7-5 20:16
话说有个类似的……?
http://rpg.blue/viewthread.php?tid=75134&ntime=2008%2D7%2D5+12%3A15%3A33
MS也是敌人的等级和质量设置。
作者: hide秀    时间: 2008-7-5 21:15
话说有个类似的……?
http://rpg.blue/viewthread.php?tid=75134&ntime=2008%2D7%2D5+12%3A15%3A33
MS也是敌人的等级和质量设置


不一样的~呵呵 这个着重是教你如和制作数据库文件
读取部分可能有相似 不过是从自己做作的数据库中文件读取
那个是直接在默认类里面定义变量的
用这个可以做出扩展{/wx}
作者: yangff    时间: 2008-7-5 21:38
口袋妖怪的等级不会随我方变。
还有,自制数据库可不是这样的哦 {/hx}
作者: hide秀    时间: 2008-7-6 00:11
口袋妖怪的等级不会随我方变。
还有,自制数据库可不是这样的哦

自制数据库啊。。。没有啥规定的吧
只要写入就可以了
RM默认有编辑器保存功能 不过写入的是hash
结构 ID=>对象 的集合
我这个也是hash
除了没有Zlib压缩(默认好象有压缩,8记得了{/cy})。。。和默认没啥区别
8过觉得没啥必要压缩。。。{/cy}
还是解除限制吧~{/cy}个人也觉得没啥必要了{/cy}

口袋妖怪虽然不是跟我方等级变化 但至少也是有等级的
也能用这个来方便地控制地敌人等级

yangff大人觉得哪里不对 或者有更好的思路 不妨提示下
我一定学习{/cy}
作者: 司马睿风    时间: 2008-7-6 01:24
写出来拉?但是还是不是我想要的东西。话说明天我就回家了,后天休息一天,大后天就开始实践了。没时间的说,再说这个波动不是我要的那种波动,去仔细的玩通任何版本的口袋妖怪你就懂了
作者: 灯笼菜刀王    时间: 2008-7-6 03:05
口袋妖怪的能力不是随着等级变化的。是根据种族值个体值随机变化,如果不是野生的还要加上努力值,加上性格修正。
作者: hide秀    时间: 2008-7-6 03:41
口袋妖怪的能力不是随着等级变化的。是根据种族值个体值随机变化,如果不是野生的还要加上努力值,加上性格修正。

{/gg}厄。。。不讨论口袋了 直接用不上就算了 没啥时间在去玩。。。
就当是个跟我方等级变化的脚本吧 其实主要还是看制作数据库部分拉{/wx}
作者: keerry    时间: 2008-7-9 03:36
173行发生了NoMethodError.
undefined method "[]" for nil:nilclass
什么原因呢?
作者: yangff    时间: 2008-7-9 03:45
以下引用hide秀于2008-7-5 16:11:29的发言:


口袋妖怪的等级不会随我方变。
还有,自制数据库可不是这样的哦

自制数据库啊。。。没有啥规定的吧
只要写入就可以了
RM默认有编辑器保存功能 不过写入的是hash
结构 ID=>对象 的集合
我这个也是hash
除了没有Zlib压缩(默认好象有压缩,8记得了)。。。和默认没啥区别
8过觉得没啥必要压缩。。。
还是解除限制吧~个人也觉得没啥必要了

口袋妖怪虽然不是跟我方等级变化 但至少也是有等级的
也能用这个来方便地控制地敌人等级

yangff大人觉得哪里不对 或者有更好的思路 不妨提示下
我一定学习


[本贴由作者于 2008-7-5 17:24:09 最后编辑]

我是说,虽然可以写入,这点不错。
但是,正规一点来说要:
module RPG
  class Enemy
    attr_accessor : 变量名
    def initialize
      INIT
    end
  end
end
在制作数据库的时候要:
def make
  a = RPG::Enemy.new
  a.** = **
end
而且有个最重要的东西没有写入——id



当然,这只是我的个人看法,有可能忧很多错误。只是想说明,规范一点可能更好些。{/wx}
毕竟你这样有点让人看不懂。
(虽然我自己写的代码也不大规范{/gg})
作者: keerry    时间: 2008-7-9 04:08
请问下,如果我要重新做数据库,怎么实现,谢谢。
作者: hide秀    时间: 2008-7-9 15:57
我是说,虽然可以写入,这点不错。
但是,正规一点来说要:
module RPG
class Enemy
   attr_accessor : 变量名
   def initialize
     INIT
   end
end
end


怎么会看不懂呢 我也是这么写的阿

def self.create_data
   Dir.mkdir("SELF_DATA") unless File.exists?("SELF_DATA")
   File.open("SELF_DATA/Enemy_data.rxdata","wb")
   datas = {}
   for i in 1...$data_enemies.size
     datas = (Pm_Enemy.new)
     for j in 1..(MAX_LEVEL)
       datas.hp_list[j] = (
       $data_enemies.maxhp * (HP_RATE) ** j).to_i
     end
    后面省略.......
class Pm_Enemy
   attr_accessor     :hp_list
   attr_accessor     :sp_list
   attr_accessor     :str_list
   attr_accessor     :dex_list
   attr_accessor     :agi_list
   attr_accessor     :int_list
   attr_accessor     :level
   def initialize
     @hp_list = {}
     @sp_list = {}
     @str_list = {}
     @dex_list = {}
     @agi_list = {}
     @int_list = {}
     @level = 1
   end  
end  




ID我故意不写了 因为默认数据库可以访问...只写了原先没有的(升级曲线,等级..)
话说访问还是要用ID的 格式为 ID=>EMENY对象
毕竟只是范例 大家需要可以自己添加 {/wx} [LINE]1,#dddddd[/LINE]版主对此帖的认可:『我知道的,看来是我误解了。对于我来讲,就是直接覆盖某个文件,不过,id还是最好写入(没说不能不写)不发布,看看最近回更新不 {/hx}』,积分『+20』。
作者: hide秀    时间: 2008-7-9 16:03
请问下,如果我要重新做数据库,怎么实现,谢谢

删除目录下的自制数据库文件夹
使用函数
Enemy_data.create_data
来制作
作者: 风隐幻者    时间: 2008-7-20 09:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: 沉影不器    时间: 2008-8-6 18:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: hide秀    时间: 2008-8-6 18:55
数据库可以用现成界面编辑器的代替,比如我的过期帖:
http://rpg.blue/viewthread.php?tid=77388

刚发现沉影也做过这个 去看看
不过你这个是利用我方数据库来制作的吧 和我这个生成数据库文件还是有点区别
{/wx}
作者: 沉影不器    时间: 2008-8-6 19:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: x1515x    时间: 2008-8-6 23:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: hide秀    时间: 2008-8-7 02:00
谢谢指正~
自制数据库文件当然对vx通用了
懂脚本的话 稍微改动下获取能力值这里就可以了{/wx}
作者: x1515x    时间: 2008-8-7 07:25
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1