幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2517|回复: 13

[原创]数据库扩展属性编辑器测试版

[复制链接]

8

主题

73

帖子

930

积分

⑤进阶

积分
930
发表于 2006-11-25 19:08:34 | 显示全部楼层 |阅读模式
有时候,我们需要创建自己的类或者扩展原有类的属性,但是rm的数据库编辑器只能识别module RPG里面默认的属性。

例如武器,我们加个防御有效度的属性pdef_factor,然后再加个双手武器的属性 two_handed

1、我们写RPG::Weapon类的扩展类,添加这两个属性
2、制作类似debug的武器编辑场景,在这个场景可以编辑$data_weapons里面的数据。
3、场景退出的时候,利用文件操作函数保存$data_weapons数据到Data\Weapons.rxdata


这样我们可以替换掉rm的武器编辑界面了,唯一麻烦的地方是输入汉字的问题,不过只是要修改数值类型的属性倒也无所谓了。

这样做的好处是游戏里面可以直接修改数据库数据,方便调试平衡性,并且我们添加一些自定义的类型,例如宠物可以保存数据了,不必再写在脚本里面了。
--------------------------------------------------------------------------------------------------

下面是测试版,写了个武器的扩展类,然后在游戏里面编辑扩展属性。其实原有属性也可以编辑,甚至可以取代rm的主程序,不过那样是个大工程,恐怕不是几天能完成的。 [s:5]

测试版使用方法:
1、创建RPG::Weapon的扩展类
2、创建Window_WeaponEditor_List类
3、创建Window_WeaponEditor_Attr类
4、创建Scene_WeaponEditor类
5、如果第一次使用,游戏里面要执行如下脚本
for ind in 1...$data_weapons.size
  $data_weapons[ind].ext
end
作用就是初始化这些Weapon事例的扩展属性,否则无法保存数据
6、游戏中可以调用$scene = Scene_WeaponEditor.new进入编辑界面
7、注意:扩展属性后两个现在还不能编辑,因为要创建数组的编辑界面实在是复杂

#==============================================================================
# ■ Game_Weapon
#------------------------------------------------------------------------------
#  武器扩展定义
#==============================================================================
module RPG
  class Weapon
    #--------------------------------------------------------------------------
    # ● 扩展数据
    #--------------------------------------------------------------------------
    attr_accessor :ammo_id            #弹药id
    attr_accessor :ammo_req           #弹药消耗量
    attr_accessor :two_handed         #双手?
    attr_accessor :str_bonus          #力量加成点数
    attr_accessor :dex_bonus          #敏捷加成点数
    attr_accessor :bonus              #固定加成点数
    attr_accessor :def_factor         #防御有效度
    attr_accessor :hp_factor          #HP影响度
    attr_accessor :sta_factor         #状态影响度
    attr_accessor :hit_factor         #命中率修正
    attr_accessor :class_atk_factors  #职业攻击力修正
    attr_accessor :class_hit_factors  #职业命中率修正
    #--------------------------------------------------------------------------
    # ● 初始化扩展数据
    #--------------------------------------------------------------------------
    def ext
      @ammo_id = 0
      @ammo_req = 0
      @two_handed = false
      @str_bonus = 100
      @dex_bonus = 0
      @bonus = 0
      @def_factor = 100
      @hp_factor = 0
      @sta_factor = 100
      @hit_factor = 100
      @class_atk_factors = []
      @class_hit_factors = []
    end
    #--------------------------------------------------------------------------
    # ● 弹药足够与否
    #--------------------------------------------------------------------------
    def ammo_available?
      return $game_party.item_number(@ammo_id) >= @ammo_req
    end
    #--------------------------------------------------------------------------
    # ● 弹药剩余数量
    #--------------------------------------------------------------------------
    def ammo_count
      return $game_party.item_number(@ammo_id)
    end
  end
end





#==============================================================================
# ■ Window_WeaponEditor_List
#------------------------------------------------------------------------------
#  武器编辑器的列表窗口。
#==============================================================================

class Window_WeaponEditor_List < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 192, 480)
    self.index = 0
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @item_max = $data_weapons.size
    self.contents = Bitmap.new(width - 32, @item_max * 32)
    for i in 1...@item_max
      text = i.to_s + " " + $data_weapons.name
      self.contents.draw_text(4, i * 32 - 32, 152, 32, text)
    end
  end
end









#==============================================================================
# ■ Window_WeaponEditor_Attr
#------------------------------------------------------------------------------
#  武器编辑器的属性窗口。
#==============================================================================

class Window_WeaponEditor_Attr < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_reader   :weapon                   # 当前武器
  attr_accessor :value_list               # 属性值列表
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    super(192, 0, 448, 352)
    self.index = -1
    self.active = false
    @num_window = Window_InputNumber.new(3)
    @num_window.visible = false
    @num_window.x = self.x + self.width / 2
    @num_window.y = self.y + self.height / 2
    @weapon = nil
    @attr_list = ["名称", "双手?", "力量加成", "敏捷加成", "固定加成", "HP影响度",
                  "状态影响度", "防御有效度", "命中率修正", "弹药ID", "弹药消耗"]
    # 模式 (-1:只读、0:开关、1:变量、2:列表编辑,保留)
    @mode_list = [-1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    @value_list = nil
    @item_max = @attr_list.size
    self.contents = Bitmap.new(width - 32, @item_max * 32)
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 更新界面
  #--------------------------------------------------------------------------
  def update
    super
    if @num_window.visible
      @num_window.update
      #按确定,保存数据
      if Input.trigger?(Input::C)
        attr_change(@num_window.number)
        @num_window.visible = false
        @num_window.active = false
        self.active = true
        return
      end
      #按取消,放弃数据
      if Input.trigger?(Input::B)
        @num_window.visible = false
        @num_window.active = false
        self.active = true
        return
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 销毁
  #--------------------------------------------------------------------------
  def dispose
    super
    @num_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    @value_list = nil
    if @weapon == nil
      return
    end
    #属性列表
    @value_list = [@weapon.name, @weapon.two_handed, @weapon.str_bonus,
                  @weapon.dex_bonus, @weapon.bonus, @weapon.hp_factor,
                  @weapon.sta_factor, @weapon.def_factor, @weapon.hit_factor,
                  @weapon.ammo_id, @weapon.ammo_req]
    for i in 0..@item_max-1
      width = self.contents.text_size(@attr_list).width
      self.contents.draw_text(4, i * 32, width, 32, @attr_list)
      self.contents.draw_text(312, i * 32, 100, 32, @value_list.to_s)
      #if @mode_list != 2
      # self.contents.draw_text(312, i * 32, 100, 32, @value_list.to_s)
      #else
      #  self.contents.draw_text(312, i * 32, 100, 32, "[编辑]")
      #end
    end
  end
  #--------------------------------------------------------------------------
  # ● 模式
  #--------------------------------------------------------------------------
  def mode
    return @mode_list[self.index]
  end
  #--------------------------------------------------------------------------
  # ● 设置武器
  #     weapon : 新的武器
  #--------------------------------------------------------------------------
  def weapon=(weapon)
    if @weapon != weapon
      @weapon = weapon
      refresh
    end
  end
  #--------------------------------------------------------------------------
  # ● 更新武器属性
  #--------------------------------------------------------------------------
  def update_attr
    if @weapon == nil or @value_list == nil
      return
    end
    #@weapon.name = @value_list[0]
    @weapon.two_handed = @value_list[1]
    @weapon.str_bonus = @value_list[2]
    @weapon.dex_bonus = @value_list[3]
    @weapon.bonus = @value_list[4]
    @weapon.hp_factor = @value_list[5]
    @weapon.sta_factor = @value_list[6]
    @weapon.def_factor = @value_list[7]
    @weapon.hit_factor = @value_list[8]
    @weapon.ammo_id = @value_list[9]
    @weapon.ammo_req = @value_list[10]
    self.refresh
  end
  #--------------------------------------------------------------------------
  # ● 开始输入数值
  #--------------------------------------------------------------------------
  def begin_num_input
    if @value_list == nil
      return
    end
    @num_window.visible = true
    @num_window.active = true
    @num_window.number = @value_list[self.index]
    self.active = false
  end
  #--------------------------------------------------------------------------
  # ● 改变属性值
  #     chg : 新数量
  #--------------------------------------------------------------------------
  def attr_change(chg)
    if @value_list == nil
      return
    end
    @value_list[self.index] = chg
    update_attr
  end
  #--------------------------------------------------------------------------
  # ● 反转布尔属性值
  #--------------------------------------------------------------------------
  def attr_reverse
    if @value_list == nil
      return
    end
    @value_list[self.index] = !@value_list[self.index]
    update_attr
  end
end









#==============================================================================
# ■ Scene_WeapoEditor
#------------------------------------------------------------------------------
#  武器属性编辑界面
#==============================================================================

class Scene_WeaponEditor
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    # 生成窗口
    @list_window = Window_WeaponEditor_List.new
    @list_window.active = true
    @attr_window = Window_WeaponEditor_Attr.new
    @help_window = Window_Base.new(192, 352, 448, 128)
    @help_window.contents = Bitmap.new(406, 96)
    # 执行过渡
    Graphics.transition
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入情报
      Input.update
      # 刷新画面
      update
      # 如果画面被切换的话就中断循环
      if $scene != self
        break
      end
    end
    #保存文件
    file = File.open("Data/Weapons.rxdata", "wb")
    Marshal.dump($data_weapons, file)
    file.close
    # 刷新地图
    $game_map.refresh
    # 装备过渡
    Graphics.freeze
    # 释放窗口
    @list_window.dispose
    @attr_window.dispose
    @help_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    #刷新
    @list_window.update
    @attr_window.update
    @help_window.update
    @attr_window.weapon = $data_weapons[@list_window.index + 1]
    # 列表窗口被激活的情况下: 调用 update_list
    if @list_window.active
      update_list
      return
    end
    # 属性窗口被激活的情况下: 调用 update_attr
    if @attr_window.active
      update_attr
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (列表窗口被激活的情况下)
  #--------------------------------------------------------------------------
  def update_list
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 切换到地图画面
      $scene = Scene_Map.new
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      text1 = "← 或者 → : 编辑数据"
      text2 = "C (Enter) : 改变布尔值 "
      @help_window.contents.draw_text(4, 0, 406, 32, text1)
      @help_window.contents.draw_text(4, 32, 406, 32, text2)
      #@help_window.contents.draw_text(4, 64, 406, 32, text3)
      @attr_window.weapon = $data_weapons[@list_window.index + 1]
      @list_window.active = false
      @attr_window.active = true
      @attr_window.index = 0
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (属性窗口被激活的情况下)
  #--------------------------------------------------------------------------
  def update_attr
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      @list_window.active = true
      @attr_window.active = false
      @attr_window.index = -1
      return
    end
    #数字编辑模式
    if @attr_window.mode == 1
      # 按下左/右键的情况下
      if Input.repeat?(Input:EFT) or Input.repeat?(Input::RIGHT)
        # 演奏光标 SE
        $game_system.se_play($data_system.cursor_se)
        # 属性值减 +1  执行数字更改和刷新
        @attr_window.begin_num_input
        return
      end
    end
    #布尔值编辑模式
    if @attr_window.mode == 0
      # 按下 C 键的情况下
      if Input.repeat?(Input::C)
        # 演奏光标 SE
        $game_system.se_play($data_system.cursor_se)
        #执行数字更改和刷新
        @attr_window.attr_reverse
        return
      end
    end
  end
end
回复

使用道具 举报

845

主题

1万

帖子

214748万

积分

版主

脑残中……

Rank: 7Rank: 7Rank: 7

积分
2147483647

声命组金赏

发表于 2006-11-25 19:19:10 | 显示全部楼层
这个问题要是解决了,らい的横版脚本就变无敌了!

看看有谁来解决吧~~~  [s:5]
http://icv.cc声动音缘配音社
回复 支持 反对

使用道具 举报

8

主题

73

帖子

930

积分

⑤进阶

积分
930
 楼主| 发表于 2006-11-25 19:57:06 | 显示全部楼层
操作起来比较复杂 [s:5]

顺便问下游戏里面汉字输入都是如何处理的 [s:7]
回复 支持 反对

使用道具 举报

38

主题

3468

帖子

1

积分

超级版主

传说中的Bunny火神~!

Rank: 8Rank: 8

积分
1
发表于 2006-11-25 21:06:15 | 显示全部楼层
汉字输入是没有的…… [s:5] ,字都是要事先准备好。
我突然发现,我是一个很幸运的好人。老婆真好~ 点我进入JQ(激情)教程范例收集!
回复 支持 反对

使用道具 举报

8

主题

73

帖子

930

积分

⑤进阶

积分
930
 楼主| 发表于 2006-11-25 21:15:55 | 显示全部楼层
按照拼音或者部首排列,做个字盘如何-v-
回复 支持 反对

使用道具 举报

8

主题

73

帖子

930

积分

⑤进阶

积分
930
 楼主| 发表于 2006-11-26 03:10:21 | 显示全部楼层
做了个测试的看看

回复 支持 反对

使用道具 举报

79

主题

617

帖子

6150

积分

⑦老手

暗夜下可怜人

积分
6150
发表于 2006-11-26 10:04:55 | 显示全部楼层
这是先建个窗口进行原有属性与附加属性的操作,编辑完后,最后再存入文件.
与以往的区别在于多出一个编辑界面,往常都是在脚本内编辑.

关于输入汉字,LZ可以用我上次发的那本电子书,内含一个夏娜编写调用本地机输入法程序的脚本.
希望破灭是因为发现真实,宁可背负罪孽也要维护爱我之人,永远的娜乌西卡!!!!!!
回复 支持 反对

使用道具 举报

好人卡的 该用户已被删除
发表于 2006-11-26 15:30:26 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

8

主题

73

帖子

930

积分

⑤进阶

积分
930
 楼主| 发表于 2006-11-26 19:08:18 | 显示全部楼层
只是个思路的问题,并不一定非要是武器-v-
回复 支持 反对

使用道具 举报

38

主题

3468

帖子

1

积分

超级版主

传说中的Bunny火神~!

Rank: 8Rank: 8

积分
1
发表于 2006-11-26 19:20:31 | 显示全部楼层
做cheat code倒是不错…… [s:4]
我突然发现,我是一个很幸运的好人。老婆真好~ 点我进入JQ(激情)教程范例收集!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2025-6-27 21:05 , Processed in 0.012084 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表