Project1

标题: 利用rxdata制作的任务文件--然后写的任务脚本 [打印本页]

作者: kula1900    时间: 2009-7-9 23:15
标题: [范例]基于本人所发的任务脚本--思路解析
本帖最后由 kula1900 于 2009-7-15 10:36 编辑

#------------------------------------------------------------------------------
# □模块定义
#------------------------------------------------------------------------------
module RPG
  #----------------------------------------------------------------------------
  # □类定义
  #----------------------------------------------------------------------------
  class Task
    #-------------------------------------------------------------------------
    # □ 常量设置
    # □ 任务难度最大值
    #-------------------------------------------------------------------------
    DIFFICULT = 5
    #-------------------------------------------------------------------------
    # □ 实例变量
    #-------------------------------------------------------------------------
    attr_accessor :id
    attr_accessor :name
    attr_accessor :line
    attr_accessor :description
    attr_accessor :lv_stint
    attr_accessor :difficult
    attr_accessor :glod
    attr_accessor :exp
    attr_accessor :items
    attr_accessor :weapons
    attr_accessor :armors
    attr_accessor :ditto_accept
    attr_accessor :need
    attr_accessor :need_items
    attr_accessor :need_items_no
    attr_accessor :need_weapons
    attr_accessor :need_weapons_no
    attr_accessor :need_armors
    attr_accessor :switch_string
    attr_accessor :need_armors_no
    attr_accessor :need_switch
    attr_accessor :need_variable
    attr_accessor :need_variable_situation
    attr_accessor :need_variable_value
    attr_accessor :signature
    attr_accessor :initialize_signature
    attr_accessor :need_enemie
    attr_accessor :need_enemie_no
    # □初始化
    def initialize
      #------------------------------------------------------------------------
      # □任务一般数据
      #------------------------------------------------------------------------
      # 任务编号
      @id = 0
      # 任务名称
      @name = ""
      # 任务线型--字符串
      @line = ""
      # 任务在任务栏中显示的说明和提示
      @description = ""
      # 任务等级限制--数据
      @lv_stint = 0
      # 任务难度描绘---0……DIFFICULT---会自动生成★☆等等---不要填浮点数
      @difficult = 0
      #------------------------------------------------------------------------
      # □任务奖励数据
      #------------------------------------------------------------------------
      # 金币
      @glod = 0
      # 经验
      @exp = 0
      # 物品ID
      @items = 0
      # 武器ID
      @weapons = 0
      # 防具ID
      @armors = 0
      # 其他情况自己是奖励
      #------------------------------------------------------------------------
      # □任务完成判定数据
      #------------------------------------------------------------------------
      # 任务完成条件--需要下列哪些总数
      @need = 0
      # 任务完成--条件1--需要物品ID
      @need_items = 0
      # 任务完成--条件1--分支--需要物品i 几个
      @need_items_no = 0
      # 任务完成--条件2--需要武器ID
      @need_weapons = 0
      # 任务完成--条件1--分支--需要武器i 几个
      @need_weapons_no = 0
      # 任务完成--条件3--需要防具ID
      @need_armors = 0
      # 任务完成--条件3--分支--需要防具i 几个
      @need_armors_no = 0
      # 任务完成--条件4--需要开关ID 为ON 状态
      @need_switch = 0
      # 任务完成--分歧--用文字描绘开关ID的概念
      # 就是所他为嘛没有打开--你还需要跟"who"对话--跟谁对话一定要写上
      @switch_string = ""
      # 任务完成--条件5--需要变量ID
      @need_variable = 0
      #------------------------------------------------------------------------
      # ●任务完成--条件5--分支情况---如果以上等于0 下面的既不成立
      # ●-3 的时候是 不是数字--即字符串
      # ●-2 的时候是 小于等于
      # ●-1 的时候是 小于
      # ● 0 的时候是 等于
      # ● 1 的时候是 大于
      # ● 2 的时候是 大于等于
      # ● 3 的时候是 以外
      #------------------------------------------------------------------------
      @need_variable_situation = 0
      # 任务完成--条件5--分支-需要变量@need_variable 的值
      @need_variable_value = 0
      # 任务完成--条件6- 需要战胜的敌人数据库ID
      @need_enemie = 0
      # 任务完成--条件6-分支---需要战胜的敌人I---几个
      @need_enemie_no = 0
    end
  end
end
以上是追加的模块RPG定义Task用于以后的读写
以下是写入脚本~~确认无误后 测试游戏后--出现Task.rxdata删除脚本
  no = 1
   task = []
   task[no] = RPG::Task.new
   task[no].id = 0
   task[no].name = "新手任务"
   task[no].line = "主线"
   task[no].description =
   "走到第二个人那里去听完废话,听完后到我身边报道=======
   ========"
   task[no].lv_stint = 0
   task[no].difficult = 0
   task[no].glod = 1000
   task[no].exp = 100
   task[no].need = 3
   task[no].items = 10
   task[no].need_items = 10
   task[no].need_items_no = 20
   task[no].need_switch = 1
   task[no].need_enemie = 1
   task[no].need_enemie_no = 5
   task[no].switch_string = "你好像要跟一位大姐姐对话哦"
   save_data(task, "Data/Task.rxdata")
以下是基于脚本中敌人类没有 计数器的添加
#==============================================================================
# ■ Game_Enemy
#------------------------------------------------------------------------------
#  处理敌人的类。本类在战斗中起到计数器作用
#==============================================================================
class Game_Enemys < Game_Battler
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    @data = []
  end
  #--------------------------------------------------------------------------
  # ● 获取任务
  #     id : 敌人 ID
  #--------------------------------------------------------------------------
  def [](id)
    if id > 999 or $data_enemies[id] == nil
      return nil
    end
    if @data[id] == nil
      @data[id] = Game_Enemys_Count.new
    end
    return @data[id]
  end
end
class Game_Enemys_Count
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     id : 敌人 ID
  #--------------------------------------------------------------------------
  def initialize
    @count = 0
  end
  #--------------------------------------------------------------------------
  # ● 计数器数据
  #--------------------------------------------------------------------------
  def count
    return @count
  end
  #--------------------------------------------------------------------------
  # ● 计数器+
  #--------------------------------------------------------------------------
  def add
    @count += 1
  end
  #--------------------------------------------------------------------------
  # ● 计数器-
  #--------------------------------------------------------------------------
  def by
    @count -= 1
  end
end
然后在Game_Battler (分割定义 3)
在基本攻击 & 特技攻击中的计算公式中加入
      # HP 的伤害计算
      self.hp -= self.damage
      # 如果承受攻击的是敌人
      if self.is_a?(Game_Enemy)
        # 如果敌人hp 小于等于0
        if self.hp <= 0
          # 获取ID
          @enemy_id = self.id
          # 下面有两种方法增加计数器一种是无任务即清零,有任务即即时
          # 第二种是无论是否有任务都会不会清零---这里采用第二种--直接计数
          $game_enemys[@enemy_id].add
        end
      end
然后请在 游戏开始时添加
    $data_tasks         = load_data("Data/Task.rxdata")
      $game_tasks         = Game_Tasks.new
      $game_enemys        = Game_Enemys.new
save 中
         Marshal.dump($game_tasks, file)
         Marshal.dump($game_enemys, file)
load 中
      $game_tasks         = Marshal.load(file)
         $game_enemys        = Marshal.load(file)
而任务主要判断完成过程脚本如下
      #==============================================================================
# ■ Game_Tasks
#------------------------------------------------------------------------------
#  处理任务序列的类。本类的实例请参考
#  $game_tasks。
#==============================================================================
class Game_Tasks
  attr_accessor:all_id
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    @data = []
    @all_id = []
    @all_id[0] = nil
  end
  #--------------------------------------------------------------------------
  # ● 获取任务
  #     task_id : 任务 ID
  #--------------------------------------------------------------------------
  def [](task_id)
    if task_id > 999 or $data_tasks[task_id] == nil or $game_tasks.all_id.include?(task_id) == false
      return nil
    end
    # 获取真正的ID
    @id = @all_id[task_id]
    if @data[task_id] == nil
      @data[task_id] = Game_Task.new(@id)
      # 是否完成初始化
      @data[task_id].completion = false
    end
    return @data[task_id]
  end
  #--------------------------------------------------------------------------
  # ● 接受任务
  #--------------------------------------------------------------------------
  def accept(task_id)
    @all_id[$game_tasks.all_id.size] = task_id
  end
end
#==============================================================================
# ■ Game_Task
#------------------------------------------------------------------------------
#  处理任务的类。本类在 Game_Tasks 类 ($game_tasks)
#   的内部使用
#==============================================================================
class Game_Task
  # 任务数据库ID
  attr_accessor:id
  # 任务完成标志
  attr_accessor:completion
  # 任务从接受到完成总共击杀个数
  attr_accessor:enemie
  # 人物名字
  attr_accessor:name
  # 人物名字
  attr_accessor:need
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     task_id : 任务 ID
  #--------------------------------------------------------------------------
  def initialize(task_id)
    super()
    setup(task_id)
  end
  #--------------------------------------------------------------------------
  # ● 设置
  #     task_id : 任务 ID
  #--------------------------------------------------------------------------
  def setup(task_id)
    task = $data_tasks[task_id]
    @task_id = task_id
    @name = task.name
    i = $data_tasks[task_id].need_enemie
    no = $data_tasks[task_id].need_enemie_no
    no += $game_enemys.count
    @enemie = no
    @need = $data_tasks[task_id].need
  end
  #--------------------------------------------------------------------------
  # ● 获取任务 ID
  #--------------------------------------------------------------------------
  def id
    return @task_id
  end
  #-------------------------------------------------------------------------
  # □ 任务完成--task_id 任务id--自动识别 == 事件中无需加入条件分歧
  #-------------------------------------------------------------------------
  def fulfil
    task_id = @task_id
    # 如果是该脚本能识别的条件下
    if $data_tasks[task_id].need != 0
      if $data_tasks[task_id].need_items != 0
        i = $data_tasks[task_id].need_items
        if $game_party.item_number(i) >= $data_tasks[task_id].need_items_no
          @need -= 1
        else
          p "你身上的物品#{$data_items.name}不够"
        end
      end
      if $data_tasks[task_id].need_weapons != 0
        i = $data_tasks[task_id].need_weapons
        if $game_party.weapon_number(i) >= $data_tasks[task_id].need_weapons_no
          @need -= 1
        else
          p "你身上的物品#{$data_weapons.name}不够"
        end
      end
      if $data_tasks[task_id].need_armors != 0
        i = $data_tasks[task_id].need_armors
        if $game_party.armor_number(i) >= $data_tasks[task_id].need_armors_no
          @need -= 1
        else
          p "你身上的物品#{$data_armors.name}不够"
        end
      end
      if $data_tasks[task_id].need_switch != 0
        i = $data_tasks[task_id].need_switch
        if $game_switches == true
          @need -= 1
        else
          p "#{$data_tasks[task_id].switch_string}"
        end
      end
    if $data_tasks[task_id].need_variable != 0
      i = $data_tasks[task_id].need_variable
      # 变量特定值
      value = $data_tasks[task_id].need_variable_value
      # 游戏变量现在值
      game_value = $game_variables
      #------------------------------------------------------------------------
      # ●-3 的时候是 不是数字--即字符串
      # ●-2 的时候是 小于等于
      # ●-1 的时候是 小于
      # ● 0 的时候是 等于
      # ● 1 的时候是 大于
      # ● 2 的时候是 大于等于
      # ● 3 的时候是 以外
      #------------------------------------------------------------------------
      case $data_tasks[task_id].need_variable_situation
        when -3
           # 是数字的情况下
           if game_value.is_a?(Numeric)
             p "任务尚未完成--仍需要努力啊!"
           else
             @need -= 1
           end
        when -2
           if game_value <= value
             @need -= 1
           else
             p "任务尚未完成--仍需要努力啊!"
           end
        when -1
           if game_value < value
             @need -= 1
           else
             p "任务尚未完成--仍需要努力啊!"
           end
        when 0
           if game_value = value
             @need -= 1
           else
             p "任务尚未完成--仍需要努力啊!"
           end
        when 1
           if game_value > value
             @need -= 1
           else
             p "任务尚未完成--仍需要努力啊!"
           end
        when 2
           if game_value >= value
              @need -= 1
           else
             p "任务尚未完成--仍需要努力啊!"
           end
        when 3
          if game_value != value
            @need -= 1
          else
            p "任务尚未完成--仍需要努力啊!"
          end
        end
      end
      if $data_tasks[task_id].need_enemie != 0
        i = $data_tasks[task_id].need_enemie
        # 当计数器大于等于要求被K的
        if $game_enemys.count >= $game_tasks[task_id].enemie
          @need -= 1
        else
          k = $game_tasks[task_id].enemie - $game_enemys.count
          p "还有#{k}#{$data_enemies.name}"
        end
      end
    end
    # 最后返回@need 的值
    if @need == 0
      @completion = true
    end
  end
end
一些显示等 请参照自己实际情况而定义
思路在于 用一些数组 写入到文件后然后读取出来 生成 类似#{RPG::Task:16进制}代码后用脚本读取
作者: 后知后觉    时间: 2009-7-10 18:20
学以自用
F1就是最好的教科书~~
LZ加油~!
作者: 霜冻之狼    时间: 2009-7-11 16:25
以前看张永的<运行时设定数据库>就想要类似的教材,
谢谢楼主了!
作者: kula1900    时间: 2009-7-14 15:20
标题: 利用rxdata制作的任务文件--然后写的任务脚本
本人利用Tasks.rxdata 生成文件 后 读取此文件 后 做的 脚本

任务大全.rar

199.42 KB, 下载次数: 139


作者: ★PIG★    时间: 2009-7-14 15:21
本帖最后由 ★PIG★ 于 2009-7-14 15:26 编辑

貌似有点诡异,研究研究
很深奥的范例...
作者: 后知后觉    时间: 2009-7-14 18:25
如果是【成品】 => 写出使用说明&截图

如果是【教程】 => 写出思路&步骤&知识点

只给了个工程没多大用处~!
作者: ONEWateR    时间: 2009-7-14 18:28
如果能够将制作任务这个过程简单化就是最实际的问题
作者: orochi2k    时间: 2009-7-14 20:35
其实只是文件读写而已 囧
作者: kula1900    时间: 2009-7-14 21:12
如果你觉得囧 就不要下载~请你记住了~没人强迫你去看~至少你要尊重作者~
作者: orochi2k    时间: 2009-7-14 21:43
如果你觉得囧 就不要下载~请你记住了~没人强迫你去看~至少你要尊重作者~
kula1900 发表于 2009-7-14 21:12


呃……只是现在的习惯性表情而已……
从本质上讲,rxdata的扩展名不是重点,重点在于里面写的具体是什么
作者: 后知后觉    时间: 2009-7-14 23:36
本帖最后由 后知后觉 于 2009-7-14 23:38 编辑

就你的工程来说,个人认为是走了弯路了~

load_data和save_data并不是做这样的事用的……
作者: kula1900    时间: 2009-7-15 18:12
本帖最后由 kula1900 于 2009-7-15 18:13 编辑

那是干啥用的???版主 喵~~
八云 说过那个可以让文件加密~喵
作者: orochi2k    时间: 2009-7-15 18:42
那是干啥用的???版主 喵~~
八云 说过那个可以让文件加密~喵
kula1900 发表于 2009-7-15 18:12


其实……还是文件读写……
加密倒没有,不过某个最原始的破解方法里到时用到过……
作者: 后知后觉    时间: 2009-7-15 19:47
load & save
目前就有的范例就是 游戏运行时设定事件

还有就是突破一些数据库的限制
比如
数据库动画只有最高200帧
但是需要更多的帧的动画的时候 可以先load出来
然后在脚本里手动合成以后save备份
还有就是突破一些999个数限制

又或者是为懒人服务,比如我
在一个庞大的游戏里 数据库的设置也是一个很庞大的项目
拿梦幻群侠传来说
宠物 职业 武器 敌人 动画
这几个项目有很多都是用的一样的name
一个一个去设置是不是太麻烦了?
就可以先设置要一个项目 比如敌人  一个64个基本敌人
把他们的名字设置好以后就可以用load读取 Actors.rxdata Classes.rxdata Weapons.rxdata
然后一个for循环就可以瞬间搞定这几项的名字处理
还可以把职业可以装备的武器ID也弄好
然后根据一定的间隔对动画数据库开始命名 之后
把武器和敌人的 攻击方和对象方 对象ID瞬间设置好

我想这样才是对load_data和save_data的最好的应用
并不是把新定义的类什么的都放进去,那样做没意义
因为这些东西已经存放在了 Scripts.rxdata 里了~
作者: tommay    时间: 2009-7-15 19:52
也许反常的思维有时会有意外的收获……
作者: kula1900    时间: 2009-7-15 21:20
可是 Weapons 武器数据库 写入的 都不是 等变量吗????我就不懂了~~你把 $data_weapons 看看~
作者: 后知后觉    时间: 2009-7-15 21:46
Weapons.rxdata 装的是 以武器ID对应数组单元号的数组
除了单元0为 nil 以外 其他都是 RPG::Weapon 类的对象
这些对象是默认脚本中,不会发生任何属性上的改变
这些对象的属性来源于数据库设置的东西
反过来就是,在脚本中改变了这些对象的属性 然后save
就等于是改变了数据库的设定
作者: dna_7086    时间: 2009-7-16 00:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: kula1900    时间: 2009-7-16 09:44
那么既然武器 有说明等变量  那么任务说明不可以堪称是.rxdata的变量吗??同理 奖励金币不可以用读写吗?? 难道非要把任务写进脚本里???我就不懂了~~~
作者: 后知后觉    时间: 2009-7-16 10:52
武器的属性的根本来源是数据库操作平台
你能把你的任务属性添加进数据库操作平台里去吗?
添加不进去就只有在脚本里一个一个设置,既然都已经在脚本里设置了
那又为什么要把设置好的东西写到文件里去,然后游戏运行的时候又去读
这有必要吗
如果你不写到新的文件里去
那么程序在加载Scripts.rxdata的时候就会把那些东西一并加载了
你说你写到新文件里去是不是有点多此一举的嫌疑?
武器等数据库资源的来源是操作平台
而 新增的东西的来源就是脚本编辑器 脚本编辑器的东西都存放在 Scripts.rxdata里~
当然你有能力的话可以写进DLL里去~
作者: kula1900    时间: 2009-7-16 11:15
要说明的是:生成Task文件后!你可以把脚本删除啊??那就是我的方法~~一次生成所有任务文件`照你这么说有了新闻媒体 要报纸干嘛?对吧
作者: orochi2k    时间: 2009-7-16 11:32
要说明的是:生成Task文件后!你可以把脚本删除啊??那就是我的方法~~一次生成所有任务文件`照你这么说有了新闻媒体 要报纸干嘛?对吧
kula1900 发表于 2009-7-16 11:15


1,报纸属于新闻媒体的1种
2,这个问题和有了数据库为啥大家还要文件系统一样 o(╯□╰)o
作者: 猫哥哥    时间: 2009-7-16 12:10
没有可视化的GUI,用这种方法还是不方便啊。虽然我也是用直接写脚本加save_date这种笨办法,来自制一些自制数据的…… = =
作者: 465889216    时间: 2009-7-16 23:38
提示: 作者被禁止或删除 内容自动屏蔽
作者: 小华    时间: 2009-7-19 15:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: veal    时间: 2009-7-24 07:52
如果想让不懂编程的策划来设计任务,可以考虑用XML,而这个Task类可以作为读取XML文件后保存数据用




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