查看: 3936|回复: 4

[RMVA发布] RM辅助数据库,重填一年前的坑。。。。

[复制链接]
梦石
0
星屑
48
在线时间
784 小时
注册时间
2013-1-4
回帖
1057
发表于 2015-6-12 00:27:35 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 墨凌羽 于 2015-6-12 22:04 编辑

差不多去年这个时候,高考结束有时间就看了几天脚本,当时是满瓶水不响半瓶水咣当。写了一个极其坑爹的玩意。。。这个算是重填之前的坑了
脚本暂时只在VA上试过,按原理来说应该是三个都通用的。

脚本介绍:
辅助数据库脚本,可以再RM再带数据库外自己添加其他的数据(例如NPC数据、任务数据)。暂时仅支持csv格式的文件。
食用方法:
自带一个范例。里面自建了一个NPC数据库,除此之外还有用csv格式的Actors替换原版的。
使用时,只要编写好csv格式的数据库文件(第一行为文件头,说明每列数据的字段名),程序会自动读取并生成一个$data_<name>的全局变量,数据类型为数组,数组的每个值为一个相关数据生成的类。(也就是说和RM自带数据库最后读取生成的$data_<name>全局变量是一样的结构,也就是说完全支持$data_<name>[id].attribute_name的访问方式。)
[fold=脚本][pre lang="ruby" file="DataBase"]#encoding:utf-8
#===============================脚本信息========================================
# DataBase : 辅助数据库
#-------------------------------------------------------------------------------
# 作者: 墨凌羽 (墨凌羽@66rpg)
# 版本: 1.0
#-------------------------------------------------------------------------------
# 说明:
# 用于RM的XP、VX、VA通用辅助数据库系统,目前仅支持CSV格式文件的读取.
# DataManager模块的子模块。
#===============================全局变量==========================================
# 全局变量名: DATAPATH
# 类型: String
# 说明:辅助数据库文件所在路径.
$DATAPATH = "Data"
#-------------------------------------------------------------------------------
# 全局变量名: SAVEFILE
# 类型:Boole
# 说明:自动存读档开关
$SAVEFILE == true
#=================================函数==========================================
# 函数名: DataBase.init
# 说明:初始化函数,读取前需调用一次。
# 参数:无
# 返回:无
#-------------------------------------------------------------------------------
# 函数名: DataBase::CSV.load_data(filename)
# 说明:读取CSV格式辅助数据库
# 参数:filename|String|所读取数据库的文件名,不包含后缀(默认为.csv).
# 返回:data_table|Array|一个包含所有数据的数组,其值为每行数据所对应生成的类.
#==================================结束==========================================
module DataBase

  def self.init
      @classlist = []
  end
  def self.classlist
    return @classlist
  end
  def self.classlist= obj
    @classlist = obj
  end

  module DataBase::CSV

    attr_reader :data_table

    def self.load_data(filename)
      data = readtable(filename)
      class_name = make_data_class(data, filename)
      @data_table = fill_datas(data, class_name)
    end
   
    #生成数据文件对应的类
    def self.make_data_class(data, filename)
      names = data[0]   
      data_class = DataBase.const_set(filename.capitalize, Class.new)
      data_class.class_eval do
        names.each{|i| attr_accessor i}
        define_method(:initialize) do |val|
          names.each_with_index do |name, i|
            instance_variable_set("@"+name, eval(val))
          end
        end
      end
      DataBase.classlist.push(filename)

      return data_class
    end

    #填充数据
    def self.fill_datas(data, class_name)
      table = []
      table[0] = nil
      #删除头数据
      data.delete_at(0)
      data.each_index{|i| table.push(class_name.new(data))}
      return table
    end

    #读取
    def self.readtable(filename)
      data = File.open("#{$DATAPATH}/#{filename}.csv", "r") do |f|
        f = f.readlines()
        f = f.each_index do |i|
          f = f.split(",")
          f[-1] = f[-1].chomp
        end
      end
    end
  end
end

#==============================================================================
# ■ DataManager
#------------------------------------------------------------------------------
#  数据库和游戏实例的管理器。所有在游戏中使用的全局变量都在这里初始化。
#==============================================================================
module DataManager
  def self.load_database
    if $BTEST
      load_battle_test_database
    else
      load_normal_database
      DataBase.init
      load_assist_database
      check_player_location
    end
  end
  def self.load_assist_database
    # $data_<database_names> = DataBase::CSV.load_data("<DataBaseNames>")  
    $data_actors      = DataBase::CSV.load_data("Actors")
    $data_npcs        = DataBase::CSV.load_data("Npcs")
  end

  # 自动存读档
  if $SAVEFILE == true then
    # 生成存档内容
    def self.make_save_contents
      contents = {}
      contents[:system]        = $game_system
      contents[:timer]         = $game_timer
      contents[:message]       = $game_message
      contents[:switches]      = $game_switches
      contents[:variables]     = $game_variables
      contents[:self_switches] = $game_self_switches
      contents[:actors]        = $game_actors
      contents[:party]         = $game_party
      contents[:troop]         = $game_troop
      contents[:map]           = $game_map
      contents[:player]        = $game_player
      DataBase.classlist.each{|i| eval("contents[:" + i.downcase! + "] = $game_" + i.chop.downcase!)}   
      contents
    end
    # 展开存档内容
    def self.extract_save_contents(contents)
      $game_system        = contents[:system]
      $game_timer         = contents[:timer]
      $game_message       = contents[:message]
      $game_switches      = contents[:switches]
      $game_variables     = contents[:variables]
      $game_self_switches = contents[:self_switches]
      $game_actors        = contents[:actors]
      $game_party         = contents[:party]
      $game_troop         = contents[:troop]
      $game_map           = contents[:map]
      $game_player        = contents[:player]
      DataBase.classlist.each{|i| eval("$game_" + i.downcase! + "= contents[:" + i.downcase!)}
    end
  end
end[/pre][/fold]
感觉说的有点乱。。。。 范例.zip (1.43 MB, 下载次数: 217)
存在问题
1.关于编码。。。如果是用excel编辑记得保存后用记事本打开选择编码在保存一次。如果用Excel打开发现汉字都是乱码则反向处理。
2.关于报错,如果提示脚本62行(instance_variable_set("@"+name, eval(val)))有错误,请先确定csv文件时否无误。。。。如果真的没问题那就是我脚本的错了。。。
3.关于对于数组、哈希的支持问题,暂时还不支持数组和哈希表。。。(因为这两个分割值时用的也是“,”同理字符串里如果出现“,”请使用全角的)
4.其他bug貌似暂时没有 坐等各种报错
最后@lanyaolove  @wangzh9173   

评分

参与人数 1星屑 +15 收起 理由
欠K罗琳 + 15 塞糖

查看全部评分

RM-GUI延期。。。最近被黑心老板压迫T_T
二次元少女的shitake,长着长脸,身高165,蓝色卷双马尾,FCUP,瞳色黑色,病气和御宅属性,是天才少女。
梦石
0
星屑
62
在线时间
839 小时
注册时间
2010-6-26
回帖
652
发表于 2015-6-12 08:30:55 | 显示全部楼层
本帖最后由 企鹅达达 于 2015-6-12 10:11 编辑

和我自己写的原理差不多。我是用|来当分割符,把数据库导出后手动用excel的数据分列功能分列。数组一类的数据单独复制到脚本里用另一段脚本导入。于是整个脚本分成了导出、外置表导入、内置表导入三个部分。
啊,又发现一个不同,你是外带数据库,我是反写数据库设置 = =

点评

对了,关于数组和哈希的输出问题,能不能试试在导出的时候用不同的符号gsub!掉,然后导入的时候再gsub!回来?  发表于 2015-6-12 15:32
我到觉得不会脚本用不来这东西,毕竟属性名字都是英文,表格也没有编辑器里的直观,而且你还只自带1个默认数据库的导入导出  发表于 2015-6-12 15:08
前不久折腾R里面的csv导入会自动根据头文件生成字段 就有了灵感 开始是直接eval一大串字符串 后来又用元编程把字符串提前求值了一下  发表于 2015-6-12 12:59
这个主要是给不会写脚本人用的 另外也能提供一些便利 不然设置数据库什么的也是麻烦。  发表于 2015-6-12 12:58
新手们!不要被看扁了!我们也会用论坛搜索,我们也会自己找脚本,我们也会自己点击关闭按钮旁边的小问号!
回复

使用道具 举报

梦石
0
星屑
48
在线时间
784 小时
注册时间
2013-1-4
回帖
1057
 楼主| 发表于 2015-6-12 16:23:08 | 显示全部楼层
本帖最后由 墨凌羽 于 2015-6-12 16:28 编辑
企鹅达达 发表于 2015-6-12 08:30
和我自己写的原理差不多。我是用|来当分割符,把数据库导出后手动用excel的数据分列功能分列。数组一类的数 ...


关于数组和哈希
我在试着先统一读取 然后判断每个子字符串第一个是不是[或者{ 如果是 新建一个变量把它放进去 然后继续判断下一个 直到找到]或者} 在此之前的所有子字符串都放到那个变量里去 最后拼接成一个
含有一个方法是 在设计数据表格时就尽量不要使用数组 或者对于短数组 可以考虑数组的每一个值占一个字段 最后做一个拼接,(例如Actor里的equips就是一个[0,0,0,0,]这样的数组那么可以分解成equips1,equips2,equips3,equips4最后在Game_Actor里这么写 quips = [equips1,equips2,equips3,equips4])

其实准确来说是给不太会脚本的以及主要还是提供便利 不用为每一个csv去写一个单独的读取

另外 导出原版的用csv去替代意义不大 我那样做只是为了表明其最后生成的$Data变量和RM原版的差不多可以使用同样的方式来访问。而且RM的原版基本都是树状结构的(这个xml应该更适合) csv只适合存储表状结构

RM-GUI延期。。。最近被黑心老板压迫T_T
二次元少女的shitake,长着长脸,身高165,蓝色卷双马尾,FCUP,瞳色黑色,病气和御宅属性,是天才少女。
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2015-6-12 16:24:30 | 显示全部楼层
就是用外置的表格文档替换掉RM默认的角色?从VX移植的吗?

点评

。。。ENEMY用这个呢?  发表于 2015-6-12 22:25
试了下 貌似是那个我自己写的Game_Npcs有问题。。。。Game_Actors正常  发表于 2015-6-12 22:03
→_→下了工程看了···是给一个NPC增加等级这样的属性?这个挺适合魔塔的···但是存档读档不管是否重启游戏读档都变回去了···  发表于 2015-6-12 18:11
而且这意味着这个哈希的每个值在读取时还要创建对应的类然后生成这个类的实例。。。  发表于 2015-6-12 16:41
实际上 暂时还不能 应为不支持数组和哈希表 而如map的event就是一个 RPG::Event 实例为对应值组成的哈希表  发表于 2015-6-12 16:39
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

头像被屏蔽
梦石
0
星屑
88
在线时间
631 小时
注册时间
2014-8-4
回帖
3243
发表于 2015-6-12 21:08:08 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部