设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 7080|回复: 13
打印 上一主题 下一主题

RMVX 數據庫編輯器(初行版)

 关闭 [复制链接]

Lv3.寻梦者

酱油的

梦石
0
星屑
1020
在线时间
2161 小时
注册时间
2007-12-22
帖子
3271

贵宾

跳转到指定楼层
1
发表于 2008-7-11 03:52:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
RMVX 用的外挂數據庫編輯器,主要功能可以隨意添加「新的屬性」
http://www.filepub.com/pfiles/7066/Wxdata.rar



使用後記得按下 save,另外如果增加了新的屬性,麻煩手動把相應的拋出代碼加入自己的腳本編輯器當中。

此外,記得備份。由此産生的任何data損害禾西概不負責。



初版發布,具體的修改慢慢來好了 XD
不負責任地逃跑 ——
PS:多謝輪回者前輩跨時空相助

對了,差點忘記開源代碼:
使用工具 : Ruby 與 Wxruby

  1. require 'Win32API'
  2. # Error Raise
  3. class Exception

  4. alias :ozrmesage :message
  5. def message
  6.   mes = ozrmesage
  7.   Win32API.new('user32', 'MessageBox', %w(p p p i), 'i').call(0,mes , 'Warning', 0)
  8.   return mes
  9. end

  10. end

  11. Dir.chdir("./sdata")
  12. Dir["*.rb"].each{|f|require("./"+f)}
  13. # Create a data instance
  14. class Rvdata
  15.   def initialize(filename, scriptname)
  16.     @script = Script.new(scriptname, 'o')
  17.     @classname = File.basename(scriptname,'.*')
  18.     p filename
  19.     @data = File.open("../Data/#{filename}", "rb"){|f|Marshal.load(f)}
  20.     @filename = filename
  21.   end
  22.   def read
  23.     return @data
  24.   end
  25.   def control
  26.     return @data
  27.   end
  28.   def inst(index)
  29.     return @data[index].instance_variables
  30.   end
  31.   def init
  32.     @data << eval("RPG::#{@classname}.new")
  33.     @data[-1].id = @data.size - 1
  34.   end
  35.   def write(index, str, val)
  36.     @data[index].instance_variable_set("@#{str}", val)
  37.   end
  38.   def save
  39.     File.open("../Data/#{@filename}", "wb"){|f| Marshal.dump(@data, f)}
  40.     @script.save
  41.     p "Saved #{@filename}"
  42.   end
  43.   def add(bstr, val)
  44.     str = "@#{bstr}"
  45.     @data.each_index do |index|
  46.       next if @data[index].nil?
  47.       next if @data[index].instance_variable_get(str) != nil
  48.       @data[index].instance_variable_set(str, val)
  49.     end
  50.     @script.add(bstr,val)
  51.   end
  52.   def del(bstr)
  53.     str = "@#{bstr}"
  54.     @data.each_index do |index|
  55.       next if @data[index].nil?
  56.       next if @data[index].instance_variable_get(str) == nil
  57.       @data[index].send(:remove_instance_variable, str.to_sym)
  58.     end
  59.     @script.del(bstr)
  60.   end
  61. end
  62. # Create a basic Script control data
  63. class Script
  64.   def initialize(filename, mode)
  65.     case mode
  66.     when 'o'
  67.       @content = File.open(filename,'r'){|f|f.read}
  68.       @filename = filename
  69.       @classname = File.basename(filename,'.*')
  70.     when 'n'
  71.       @content = File.open('Format.rb','r'){|f|f.read}
  72.       @filename = filename
  73.       @classname = File.basename(filename,'.*')
  74.       @content[/class Format/]="class#{@classname}"
  75.     end
  76.   end
  77.   def read
  78.     return @content
  79.   end
  80.   def save
  81.     File.open(@filename, 'w'){|f|f.write(@content)}
  82.     File.open("../#{@classname}.txt", 'w'){|f|f.write(@content)}
  83.   end
  84.   def add(bstr,val)
  85.     return false if eval("defined?(RPG::#{@classname}.new.#{bstr})")
  86.     begin
  87.     @content[/# 1/] =
  88.     if val == ""
  89.       "@#{bstr} = \"\"\n# 1"
  90.     else
  91.       "@#{bstr} = #{val}\n# 1"
  92.     end
  93.     @content[/# 2/]= "attr_accessor :#{bstr}\n# 2"
  94.     rescue
  95.       raise 'Existing undefined Error'
  96.     end
  97.     return true
  98.   end
  99.   def del(bstr)
  100.     return false unless eval("defined?(RPG::#{@classname}.new.#{bstr})")
  101.      @content[/@#{str} = \S*$\n/]=""
  102.      @content[/attr_accessor :#{str}$\n/]=""
  103.     return true
  104.   end
  105. end


  106. # Basic Format
  107. begin
  108. require 'rubygems'
  109. rescue LoadError
  110. end

  111. require 'wx'
  112. include Wx
  113. #=====================================================================================================================
  114. class DataPage < Panel
  115.   def initialize(parent, log, data, index = 1)
  116.     super(parent, -1)
  117.     # Record All Parameters
  118.     @parent = parent
  119.     @log =log
  120.     @data = data
  121.     @id = index
  122.    
  123.     @list = {}
  124.     @listele = @data.inst(index).map!{|s|s.delete('@')}.sort!
  125.    
  126.     repaint(index)
  127.     fresh(0)
  128.   end
  129.   
  130.   def repaint(index)
  131.    
  132.     #Create Button
  133.     Button.new(self,10,'Save Edit',Point.new(0,0),Size.new(150,50))
  134.     evt_button(10) {|event| on_save}
  135.    
  136.     #Create List
  137.     listdata = ([email protected]).to_a.map!{|s|"#{sprintf("%#03d", s)}: #{@data.read[s].name}"}
  138.     @list[:d] = ListBox.new(self, 20, Point.new(150,0), Size.new(150,450), listdata)
  139.     evt_listbox(20) {|event| on_list_d(event)}
  140.    
  141.     #Initialize a New Element to this class (Button)
  142.     Button.new(self, 30,'Initialize',Point.new(300,0))
  143.     StaticText.new(self, -1,'@', Point.new(380,0))
  144.     n = TextCtrl.new(self, -1,'',Point.new(390,0))
  145.     StaticText.new(self, -1,'=',Point.new(500,0))
  146.     v = TextCtrl.new(self, -1,'',Point.new(520,0))
  147.     evt_button(30){on_cre(n.get_value, v.get_value); n.clear; v.clear}
  148.    
  149.     #Delete a Old Element of this class (Button)
  150.     Button.new(self, 40,'Delete',Point.new(300,30))
  151.     StaticText.new(self, -1,'@', Point.new(380,30))
  152.     e = TextCtrl.new(self, -1,'',Point.new(390,30))
  153.     evt_button(40){on_del(e.get_value); e.clear}
  154.    
  155.     #Change the Name of this Item
  156.     Button.new(self, 50,'Change Name',Point.new(300,60))
  157.     l = TextCtrl.new(self, -1,'',Point.new(400,60), Size.new(220,20))
  158.     evt_button(50){
  159.       @list[:d].set_string(
  160.         (@id-1) , "#{sprintf("%#03d", @id)}: #{l.get_value}"
  161.       )
  162.       @data.read[@id].name = l.get_value
  163.       @text.set_value(l.get_value) if @listele[@index] == 'name'
  164.       l.set_value('')
  165.     }
  166.    
  167.     #Edit the Item's Amout of this Class
  168.     @edit_text = TextCtrl.new(self,-1,'1',Point.new(150,450))
  169.     Button.new(self, 60,'OK',Point.new(250,450),Size.new(50,20))
  170.     evt_button(60) {on_edit}
  171.    
  172.     #The list showing all Elements of this class
  173.     @list[:e] = ListBox.new(self, 70, Point.new(620,0), Size.new(150,300), @listele)
  174.     evt_listbox(@list[:e].get_id) {|event| on_list_e(event)}
  175.    
  176.     #The 2nd list showing all Elements of the Selecting Element(For the instance of Table or a Array Containing Serial instances )
  177.     @list[:e2] = ListBox.new(self, 80, Point.new(450,90), Size.new(170,210), [])
  178.     evt_listbox(@list[:e2].get_id) {|event| on_list_e2(event.get_selection)}
  179.     #The Controling Text
  180.     @text = TextCtrl.new(self,-1,'',Point.new(480,300),Size.new(300,200),TE_MULTILINE)
  181.   end
  182.   def on_cre(nval, vval)
  183.     return if @listele.include?(nval) or nval == ""
  184.     begin
  185.     @data.add(
  186.       nval,
  187.       begin
  188.       eval(vval)
  189.       rescue
  190.       vval
  191.       end
  192.     )
  193.     rescue
  194.     end
  195.     @listele << nval
  196.     @list[:e].append(nval)
  197.   end
  198.   def on_del(str)
  199.     @list[:e2] = nil
  200.     return unless @listele.include?(str) or str != ""
  201.     @data.del(str)
  202.     @list[:e].delete(@listele.index(str))
  203.     @listele.delete(str)
  204.    
  205.   end
  206.   def on_edit
  207.     size = @data.read.size - 1
  208.     begin
  209.     num = @edit_text.get_value.to_i
  210.     rescue
  211.     num = size
  212.     end
  213.     if num > size
  214.       (num - size).times{
  215.         |i|
  216.         @data.init
  217.         @list[:d].append("#{ sprintf("%#03d", @data.read[-1].id) }: #{@data.read[-1].name}")
  218.       }
  219.     else
  220.       while num < size
  221.         size -= 1
  222.         @list[:d].delete(size)
  223.         @data.control.delete_at(-1)
  224.       end
  225.     end
  226.   end
  227.   def on_save
  228.     $data.each_value{|data|data.save}
  229.   end
  230.   def on_list_d(event)
  231.     record
  232.     @id = event.get_selection+1
  233.     fresh(@index)
  234.   end
  235.   def on_list_e(event)
  236.     record
  237.     index = event.get_selection
  238.     fresh(index)
  239.   end
  240.   def on_list_e2(index2)
  241.     if @table != nil
  242.       para = @listele_2[@index2].split(/, /)
  243.       para.map!{|s|s.to_i}
  244.       @table[para[0], para[1], para[2] ] = @text.get_value.to_i
  245.       
  246.       @index2 = index2
  247.       
  248.       para = @listele_2[index2].split(/, /)
  249.       para.map!{|s|s.to_i}
  250.       @text.set_value( @table[para[0], para[1], para[2] ].inspect )
  251.     end
  252.   end
  253. =begin
  254.   def on_list_e3(index3)
  255.     if @array != nil
  256.       @index3 = index3
  257.       @text.set_value(eval("@array[@index2].#{@listele_3[@index3]}").inspect)
  258.     end
  259.   end
  260. =end
  261.   def record
  262.     return if @skip
  263.     return if @data.read[@id].nil?
  264.     str = @listele[@index]
  265.     # The resolution to Table instance
  266.     if @table != nil
  267.       on_list_e2(@index2)
  268.       @data.write(@id, str, @table)
  269.       @table = nil
  270.       return
  271.     end
  272.     # The resolution to a Array Containing Serial instances
  273.    
  274.     text = @text.get_value
  275.     # The resolution to a Empty String instance
  276.     if text == ""
  277.       @data.write(@id, str, "")
  278.       return
  279.     end
  280.       
  281.     begin
  282.     val = eval(text)
  283.     rescue SyntaxError, NameError
  284.     val = text
  285.     ensure
  286.     end
  287.   
  288.     @data.write(@id, str, val)
  289.    
  290.   end
  291.   def fresh(index)
  292.     # Element Index
  293.     @index = index
  294.     #=>
  295.     if @data.read[@id].nil?
  296.       return
  297.     end
  298.     #repaint
  299.     text = @data.read[@id].instance_variable_get("@#{@listele[index]}")
  300.     #=>
  301.     if @listele_2 != []
  302.       @listele_2 = []
  303.       @list[:e2].set(@listele_2)
  304.     end
  305.     #=>
  306.     case @listele[index]
  307.     when "name", "id", "learnings", "actions", "drop_item1", "drop_item2", "pages", "members", "list"
  308.         @skip = true
  309.         @text.hide
  310.         return
  311.     end
  312.     #=>
  313.     if @skip
  314.       @skip = false
  315.       @text.show
  316.     end
  317.     #=>
  318.     case text
  319.     when Table
  320.       @index2 = 0
  321.       @listele_2 = []
  322.       @table = text
  323.       text.xsize.times do |x|; text.ysize.times do |y|; text.zsize.times do |z|
  324.         @listele_2 << "#{x}, #{y}, #{z}"
  325.       end; end; end
  326.       @list[:e2].set(@listele_2)
  327.       @text.set_value(text[0,0,0].inspect)
  328.       return
  329.     when Array
  330.       @text.set_value(text.inspect)
  331.       return
  332.     when String
  333.       @text.set_value(text)
  334.       return
  335.     else
  336.       @text.set_value(text.inspect)
  337.       return
  338.     end
  339.    
  340.    
  341.   end
  342. end
  343. #=====================================================================================================================
  344. class NewNotebook < Notebook
  345.   def initialize(parent, id ,log)
  346.     super(parent, id, DEFAULT_POSITION, DEFAULT_SIZE, NB_BOTTOM)
  347.     add_page(DataPage.new(self, -1, $data[:actors]), 'Actor')
  348.     add_page(DataPage.new(self, -1, $data[:classes]), 'Class')
  349.     add_page(DataPage.new(self, -1, $data[:skills]), 'Skill')
  350.     add_page(DataPage.new(self, -1, $data[:items]), 'Item')
  351.     add_page(DataPage.new(self, -1, $data[:weapons]), 'Weapon')
  352.     add_page(DataPage.new(self, -1, $data[:armors]), 'Armor')
  353.     add_page(DataPage.new(self, -1, $data[:enemies]), 'Enemy')
  354.     add_page(DataPage.new(self, -1, $data[:troop]), 'Troop')
  355.     add_page(DataPage.new(self, -1, $data[:states]), 'State')
  356.     add_page(DataPage.new(self, -1, $data[:commonEvents]), 'CommonEvent')
  357.   end
  358. end
  359. #=====================================================================================================================
  360. class NewFrame < Frame
  361.   def initialize(title)
  362.     super(nil, :title => title, :size=>[800, 600])
  363.     $data = {}
  364.    
  365.     $data[:actors]  = Rvdata.new('Actors.rvdata', 'Actor.rb')
  366.     $data[:classes] = Rvdata.new('Classes.rvdata', 'Class.rb')
  367.     $data[:skills]    = Rvdata.new('Skills.rvdata', 'Skill.rb')
  368.     $data[:items]    = Rvdata.new('Items.rvdata', 'Item.rb')
  369.     $data[:weapons] = Rvdata.new('Weapons.rvdata', 'Weapon.rb')
  370.     $data[:armors]    = Rvdata.new('Armors.rvdata', 'Armor.rb')
  371.     $data[:enemies] = Rvdata.new('Enemies.rvdata', 'Enemy.rb')
  372.     $data[:troop] = Rvdata.new('Troops.rvdata', 'Troop.rb')
  373.     $data[:states] = Rvdata.new('States.rvdata', 'State.rb')
  374.     $data[:commonEvents] = Rvdata.new('CommonEvents.rvdata', 'CommonEvent.rb')
  375.    
  376.     NewNotebook.new(self, -1, Log.new)
  377.    
  378.     menu_bar =MenuBar.new
  379.     menu = []
  380.    
  381.     menu << [Menu.new(),"&File"]
  382.     menu[-1][0].append(ID_SAVE, "&Save\tAlt-S", "")
  383.     menu[-1][0].append(ID_EXIT, "E&xit\tAlt-X", "")
  384.    
  385.    
  386.     menu << [Menu.new(), "&Help"]
  387.     menu[-1][0].append(ID_ABOUT,  "&About...\tF1", "")
  388.    
  389.     menu_bar = MenuBar.new()
  390.     menu.each{|m|menu_bar.append(m[0], m[1])}
  391.     self.menu_bar = menu_bar
  392.     create_status_bar(menu.size)
  393.    
  394.     self.status_text = ""
  395.    
  396.     evt_menu(ID_SAVE,   :on_save)
  397.     evt_menu(ID_EXIT,    :on_quit)
  398.     evt_menu(ID_ABOUT, :on_about)
  399.    
  400.     evt_close {|evt| evt.skip }
  401.    
  402.   end
  403.   
  404.   def on_save
  405.     $data.each_value{|data|data.save}
  406.   end
  407.   def on_quit
  408.     close()
  409.   end
  410.   def on_about
  411.    
  412.   end
  413. end
  414. #=====================================================================================================================
  415. class NewApp < App
  416.     def on_init
  417.       NewFrame.new("RM Editor").show( )
  418.     end
  419. end


  420. NewApp.new().main_loop()
复制代码

同樣功能的東東的介紹= =不要再問我這個是甚麽東東?
http://rpg.blue/viewthread.php?tid=50762
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
609
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

2
发表于 2008-7-11 03:59:18 | 只看该作者
沙发?
支持一个{/qiang}
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3299
在线时间
3619 小时
注册时间
2006-9-6
帖子
37400

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

3
发表于 2008-7-11 04:48:28 | 只看该作者
话说【新的属性】是什么?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

酱油的

梦石
0
星屑
1020
在线时间
2161 小时
注册时间
2007-12-22
帖子
3271

贵宾

4
 楼主| 发表于 2008-7-11 05:55:29 | 只看该作者


以下引用越前リョーマ于2008-7-10 20:48:28的发言:

话说【新的属性】是什么?

......
閣下,難道禾西會專門寫個東西來增加地風水火屬性嗎?指的當然是比如 攻擊範圍,hp附加等等「新的屬性」
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

Lv1.梦旅人

史上最强粉丝

梦石
0
星屑
50
在线时间
9 小时
注册时间
2007-8-20
帖子
5574

贵宾

5
发表于 2008-7-11 06:02:24 | 只看该作者
禾西太油菜了!!!支持啊!有了这个,再多的脚本也不怕漏了。
编程,策划,测试,想怎么弄就怎么弄啊。
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3299
在线时间
3619 小时
注册时间
2006-9-6
帖子
37400

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

6
发表于 2008-7-11 21:09:20 | 只看该作者
以下引用禾西于2008-7-10 21:55:29的发言:




以下引用越前リョーマ于2008-7-10 20:48:28的发言:

话说【新的属性】是什么?


......
閣下,難道禾西會專門寫個東西來增加地風水火屬性嗎?指的當然是比如 攻擊範圍,hp附加等等「新的屬性」

也就是说让装备技能什么的增加功能性属性……?
话说还是得用脚本写吧……还是里面就有……?
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-5-28
帖子
28
7
发表于 2008-7-11 21:52:56 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3299
在线时间
3619 小时
注册时间
2006-9-6
帖子
37400

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

8
发表于 2008-7-12 01:39:17 | 只看该作者
看了那个帖子的介绍,的确很强大。

不过对于新加属性还是无能啊……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
2 小时
注册时间
2008-7-9
帖子
121
9
发表于 2008-7-12 17:09:01 | 只看该作者
BaseItem初始化失败,运行不能……
雨~ 纯净~又有点感伤……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

很傻很天真

梦石
0
星屑
55
在线时间
3 小时
注册时间
2007-3-13
帖子
3667
10
发表于 2009-6-12 08:00:00 | 只看该作者
试试看...
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-16 06:31

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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