Project1

标题: RMXP魔改计划及发布贴 [打印本页]

作者: 玻璃柿子    时间: 2023-3-22 06:58
标题: RMXP魔改计划及发布贴
本帖最后由 玻璃柿子 于 2023-4-13 07:45 编辑

有不少网友给了建议,都很好。
但是有一点要说明一下,这次魔改的对象是rmxp编辑器本身,而不是引擎。另外,修改原则是兼容性第一,升级第二,扩展第三。
所以,有一些方向暂时不会考虑。如,支持多图层,多事件曾gh,双全景图等。因为改动这些,除了改编辑器本身之外,脚本也会改,脚本如果改动,会造成之前做的游戏,没法在魔改版本上打开编辑。
另外,需改改动引擎的,暂时也不考虑。诸如改游戏分辨率,使其支持显卡等。因为我们论坛有足够优秀的非官方运行时(20210725),可以直接点进去找到满足自己需求的版本。
最后,我排版较差,也感谢【纯属小虫】的建议,新开一楼,以日志和分割线的方式,把主要内容全部写在一楼。
下面是关于rmxp编辑器的魔改计划,还是希望大家能多提点建议,让我们的rmxp编辑器能变得更好用:
=========================================================================================================================
开发日志:
RPGXP开发日志(1)
RPGXP开发日志(2)
RPGXP开发日志(3)
RPGXP开发日志(4)
=========================================================================================================================
事件编辑器添加折叠功能,使得条件分支和循环这样的事件块可以折叠和展开
添加事件搜索功能,可以根据某个变量,开关,物品搜索所有与之相关的事件,并直接定位到其所在的公共事件,或者地图的位置
添加地图搜索功能,根据地图名称,地图id,变量,开关,物品,战斗处理等条件,搜索与之相关的地图
添加全景图的预览功能
添加事件路线编辑中,手动划路线的功能
添加鼠标移动到地图事件上面,会自动出现一个简介窗口功能
=========================================================================================================================
新版本更新:
2023年4月1日更新,添加了插件功能,用户可以通过插件定制rmxp的界面
2023年4月10日更新,修改了一些数值上限,武器,防具,敌人的战斗力都可以突破999上限,最高可达9999
2023年4月13日更新,数据库元素个数可以突破999上限,修改了找不到washduck.rb文件就不能启动的问题,将破限的接口封装成ruby,可以让用户自己修改
链接:https://pan.baidu.com/s/1jhNk3wMwA9qUryQzWBOmTA
提取码:smhw
--来自百度网盘超级会员V1的分享
交流qq群:688306339
作者: 玻璃柿子    时间: 2023-3-25 21:00
研究了RGSS103J.dll动态库中的一些c函数,RGSSInitialize是初始化全局环境,这个函数没有参数。初始化之后,可以调用RGSSEval执行ruby脚本,RGSSEval函数只有一个参数,那就是字符串,虽然没有公开源码,但猜测声明可能是这样的void RGSSEval(const char* script),直接把字符串往里传就能执行。我有个想法,就是在rmxp基础上,开一个插件功能,让大家可以写ruby来定制编辑器的界面和功能,但需要收集一些建议。
主要是插件的接口标准和相关功能的必要性,欢迎踊跃提供意见或者建议。之前的贴我废话太多了,所以弃楼。具体有关rmxp编辑器的讨论都放这边了。
作者: 玻璃柿子    时间: 2023-3-27 07:10
本帖最后由 玻璃柿子 于 2023-3-28 19:54 编辑
玻璃柿子 发表于 2023-3-25 21:00
研究了RGSS103J.dll动态库中的一些c函数,RGSSInitialize是初始化全局环境,这个函数没有参数。初始化之后 ...


目前打算在工具菜单栏下面,增加一个插件管理,而插件支持修改和定制rmxp的界面与功能扩展。目前还在想插件的标准接口怎么定义。这个比较难,因为一旦定义了,后面就不能再改了,否则同样版本之间就不能相互兼容,我希望能征集一下大家的意见。
上述所说的功能,我打算拿插件做,这样子也能提供一些原始的参考,方便大家一起参与编辑器的定制。为了rmxp崛起,一起加油。

作者: 荔竹    时间: 2023-3-27 09:11
像MV一样支持打包apk就好了
作者: 契约师Vi    时间: 2023-3-27 09:49
还有一个想法,我希望数值可以定义负数
作者: 玻璃柿子    时间: 2023-3-27 20:48
荔竹 发表于 2023-3-27 09:11
像MV一样支持打包apk就好了

打包成apk没考虑,但是打包成网页版倒是能做到。
具体教程:这里
可能有些复杂,得简化简化,但是我一时抽不出时间来。
还有,你们怎么在论坛发图片的,为啥我不会。
作者: 黑米馒头    时间: 2023-3-28 12:56
用Rgu工程的移植过来能兼容吗
作者: 玻璃柿子    时间: 2023-3-29 21:46
契约师Vi 发表于 2023-3-27 09:49
还有一个想法,我希望数值可以定义负数

哪个值改成负数?在等几天,下周估计可以了。到时候我把支持插件的版本发出来,然后你们爱咋改咋改。我现在发现,最难的好像不是技术,是设计能力,接口设计了半天,咋看都不对。我虽然上着班,但是朝九晚五加双休,工作日一般早上或者晚上在线,有事情或者想法随时交流就行。
作者: 纯属小虫    时间: 2023-3-30 11:39
玻璃柿子 发表于 2023-3-29 21:46
哪个值改成负数?在等几天,下周估计可以了。到时候我把支持插件的版本发出来,然后你们爱咋改咋改。我现 ...

软件设计确实是一件伟大的事,要整合所有人的要求并归类,保证使用逻辑性并用技术手段将其实现;本质上其实跟游戏设计有异曲同工之处。
非常钦佩楼主这种能够拥有技术,并赋予实践的人。
本人没有软件设计基础,但是擅长收集方法和归类,使用XP多年,有一定游戏设计基础。
如果可以的话,希望楼主能够建立一个群聊(QQ比较好,有云盘),工作群的性质,以收集归纳思路为出发点,再探讨插件改良的大方向,最终落位接口位置、工具使用方式、窗口布局方式之类的细节。
作者: 陈大帅帅帅哥    时间: 2023-3-30 17:47
自定义插件也必须要有能通过反编译修改rmxp本体的能力才能做吗,还是会简单一点
作者: 黑米馒头    时间: 2023-3-30 18:27
最好是建一个QQ群,大家一起收集归纳思路为出发点,再探讨插件改良的大方向,最终落位接口位置、工具使用方式、窗口布局方式之类的细节。
作者: 玻璃柿子    时间: 2023-3-30 20:07
陈大帅帅帅哥 发表于 2023-3-30 17:47
自定义插件也必须要有能通过反编译修改rmxp本体的能力才能做吗,还是会简单一点 ...

需要一定的反编译,也需要一定的汇编基础,但不会涉及到太深入的东西。
作者: 玻璃柿子    时间: 2023-4-1 05:53
黑米馒头 发表于 2023-3-30 18:27
最好是建一个QQ群,大家一起收集归纳思路为出发点,再探讨插件改良的大方向,最终落位接口位置、工具使用方 ...

有这个想法,不过先等等,把插件版的rmxp发出来再建。
作者: 玻璃柿子    时间: 2023-4-1 21:30
本帖最后由 玻璃柿子 于 2023-4-1 21:37 编辑

发布新版本编辑器,支持插件功能
下载地址:链接:https://pan.baidu.com/s/13icsrv9ubk-jvMTS7Fj0sw
提取码:nlws
更多内容还是多看看一楼,听取某个大神的建议,将主要内容放在一楼了
下载下来之后,将文件覆盖掉原有的rmxp目录即可




作者: guoxiaomi    时间: 2023-4-1 23:05
一人血书新增显示远景图的功能
作者: 纯属小虫    时间: 2023-4-3 16:57
本帖最后由 纯属小虫 于 2023-4-3 17:16 编辑
玻璃柿子 发表于 2023-4-1 21:30
发布新版本编辑器,支持插件功能
下载地址:链接:https://pan.baidu.com/s/13icsrv9ubk-jvMTS7Fj0sw
提取 ...


存在一个小问题,我自己的老工程用该编辑器打开是,会出现【找不到Washduck.rb】
新建的工程不会;有没有可能是我的老工程为了脱机运行,把【Game.ini】里的RTP= 后面的东西给删掉了的缘故?


(图片上传不上去,就文字描述了)


另外,我还有个兼容性方面的顾虑。
如果使用过该编辑器编辑过并保存的工程,再用原版编辑器打开,是否还能保证正常使用?
(理论上,如果只是修改编辑器的使用方式的话。应该是不会因使用了不同编辑器,而让工程本体中,增添或减少文件的。如果某些功能存在对工程文件的改变,那应该在对应功能&插件上备注【这个功能可能存在兼容性问题】)
作者: soulsaga    时间: 2023-4-3 18:34
事件触发的开关变量条件增加..实在太少了
作者: 玻璃柿子    时间: 2023-4-4 06:02
纯属小虫 发表于 2023-4-3 16:57
存在一个小问题,我自己的老工程用该编辑器打开是,会出现【找不到Washduck.rb】
新建的工程不会;有没有 ...

这个问题,我之前测试过是没有的,要不你加我qq讨论吧。
qq:1541803232
作者: 玻璃柿子    时间: 2023-4-4 06:06
guoxiaomi 发表于 2023-4-1 23:05
一人血书新增显示远景图的功能

改动太大会引发兼容性灾难的,我觉得就是开放这方面的扩展功能,然后工程的话,根据需求去改动。把改动文件和工程放一起,这样子打开不同的工程,界面会变成不同的样子。
作者: 玻璃柿子    时间: 2023-4-4 07:31
纯属小虫 发表于 2023-4-3 16:57
存在一个小问题,我自己的老工程用该编辑器打开是,会出现【找不到Washduck.rb】
新建的工程不会;有没有 ...

我好像知道怎么回事了,你如果双击工程下Game.rxproj,那么程序会从你当前的工程目录下去找Washduck.rb这个文件,所以找不到。解决方案是在当前工程下放一个Washduck.rb这个文件就行。我去加个判断条件,如果当前目录找不到就去系统路径找。
不过这个修改,等这周末跟新功能一起发布,不单独发包了。
作者: soulsaga    时间: 2023-4-4 17:24
本帖最后由 soulsaga 于 2023-4-4 17:47 编辑

像VA那样保存工程关闭后下次打开会是自动打开上次保存的工程
脚本编辑器搜索关键词也会自动保留上一次的
作者: 灯笼菜刀王    时间: 2023-4-4 17:31
本帖最后由 灯笼菜刀王 于 2023-4-4 17:37 编辑

我想要脚本全局查找(ctrl+shift+f)的结果窗口能保留, 不会点击一条, 跳转到对应位置后, 搜索结果窗口就消失了, 想找下一条还要再次按ctrl+shift+f, 然后ctrl+V, enter, 麻烦死了

窗口跳转后不消失, 要排错就方便多了

还有, XP的脚本编辑器只能一页一页复制, 或者直接替换scripts.rxdata,  想要能批量复制的功能


作者: 玻璃柿子    时间: 2023-4-5 05:49
玻璃柿子 发表于 2023-4-4 06:02
这个问题,我之前测试过是没有的,要不你加我qq讨论吧。
qq:1541803232

你这是通宵了吗?这么早上
作者: guoxiaomi    时间: 2023-4-5 17:18
本帖最后由 guoxiaomi 于 2023-4-5 18:59 编辑

提点想法。我先用画图说明我对“插件”的理解。

“插件”特指在程序特定的入口添加新的对话框,然后在新的对话框里进行操作,保存后能修改Data文件夹里的部分数据。

目前至少有3种不同类型的入口,图上标注的1和2是进入对话框的顺序:
1. 在插件菜单里,添加一个按钮跳转到新的对话框。


2. 事件选项里添加一个按钮,增加新的条目,点击对应条目打开对话框。
这里的条目,在编辑结束后要能显示对应的新指令。


3. 数据库编辑的部分多一些入口。如果尽可能兼容旧版本,可以在“系统”的右边多一栏,点击后打开新的对话框。
这里的条目,对应于Data文件夹里额外的.rxdata文件。在编辑结束后要修改那个.rxdata文件。


而对话框,指的是可以修改数值的那种东西,比如,下面这个是变量处理的事件:


对话框里包含了各种小组件(widget),组件按照特定的规律排布。

如果能适当做好封装,提供一个友好的dsl,那么插件的作者,完全不需要懂win32的知识,只需要会写一点脚本,完成插件对应的逻辑即可。

举个例子,以下代码描述了在插件菜单里添加一个选项,以打开变量处理的事件,我使用ruby的格式来写。当然用标记语言写layout也很合适。

大体思路就是
1. 继承自 Plugin_Menu 说明入口是上面的第一种情况,在插件列表里。
2. layout里定义widget的位置和内容,以及如何操作data变量。这部分可以对照上图来看。
3. on_xxx函数表示此插件在打开、关闭、应用、取消四个时机时该如何处理data与外部数据(一般是Data文件夹里的数据)。

RUBY 代码复制
  1. class MyPlugin < Plugin_Menu
  2.   def initialize
  3.     super('变量处理')
  4.   end
  5.  
  6.   # 处理 data 和外部数据
  7.   def on_open; end
  8.  
  9.   def on_close; end
  10.  
  11.   def on_save; end
  12.  
  13.   def on_cancel; end
  14.  
  15.   def layout
  16.     title '操作变量'
  17.     align :vertical
  18.  
  19.     form '变量' do
  20.       data[0] << 0
  21.       radio do
  22.         align :vertical
  23.         option do
  24.           label '单独'
  25.           data[1] << select_variables
  26.         end
  27.         option do
  28.           align :horizontal
  29.           label '统一'
  30.           data[1] << integer(0, $game_variables.size)
  31.           label '~'
  32.           data[2] << integer(0, $game_variables.size)
  33.         end
  34.       end
  35.     end
  36.  
  37.     form '操作' do
  38.       radio do
  39.         align :horizontal
  40.         option do
  41.           label '代入'
  42.           data[3] << 0
  43.         end
  44.         option do
  45.           label '加法'
  46.           data[3] << 1
  47.         end
  48.         option do
  49.           label '减法'
  50.           data[3] << 2
  51.         end
  52.         option do
  53.           label '乘法'
  54.           data[3] << 3
  55.         end
  56.         option do
  57.           label '除法'
  58.           data[3] << 4
  59.         end
  60.         option do
  61.           label '取余'
  62.           data[3] << 5
  63.         end
  64.       end
  65.     end
  66.  
  67.     form '操作数' do
  68.       radio do
  69.         align :horizontal
  70.         option do
  71.           label '常量'
  72.           data[4] << interger(-99_999, 99_999)
  73.         end
  74.         # ... 中间省略 ...
  75.         option '其它' do
  76.           listbox do
  77.             option do
  78.               label '地图ID'
  79.               data[4] << 0
  80.             end
  81.             # ... 中间省略 ...
  82.             option do
  83.               label '存档次数'
  84.               data[4] << 6
  85.             end
  86.           end
  87.         end
  88.       end
  89.     end
  90.   end
  91. end

这样做应该会方便插件作者许多,但是维护插件生态比开发一个DSL要难多了,我们还有很长的路要走。

个人看法,如果我来做这个,就会直接全部重写,当DSL设计好,widget整理好之后,剩下的对话框全部都是写上面这种DSL写就行。地图的处理可能会稍微麻烦一点,但是也不算特别难。当然我现在的重点维护RGM这个runtime,编辑器的事情,我泉水指挥总是轻松的……
作者: guoxiaomi    时间: 2023-4-5 18:11
从回复楼层中也能看出来,大家特别关心的是能否解除原版编辑器的一些限制,或者优化使用体验。插件生态倒是其次了。。。
作者: 玻璃柿子    时间: 2023-4-6 06:31
guoxiaomi 发表于 2023-4-5 18:11
从回复楼层中也能看出来,大家特别关心的是能否解除原版编辑器的一些限制,或者优化使用体验。插件生态倒是 ...

感谢建议,写的那么多,又那么详细,应该花了不少时间去想这个事情。我正愁没有一个方向呢,这下也省了很多事情。加油。
作者: 玻璃柿子    时间: 2023-4-8 21:09
本来想这周发个新版本,但是因为改数值上限这个事情,耽误了很多时间,只能退后几天了。
数值上限的修改,没有想的那么容易,其牵扯到很多细节,稍微动一下,原生的脚本就容易崩。
这一个版本,打算放一些实际的功能:
1.所有数值上限都增加一位数,如原来999的,现在变成9999
2.数据库个窗口增加注释功能
3.增加事件搜索功能
以上这些功能,将全部基于新增的插件实现。
作者: 玻璃柿子    时间: 2023-4-10 20:32
发布的新版本中,武器,防具以及敌人的一些战斗力属性,已经成功突破了999上限,最高可达9999.
另外,对于角色的力量,智力这些,修改突破了会引起一些奇怪的bug,可能需要同时修改脚本。
后面我会把修改这些属性的接口封装了发布出来,到时候需要的自行修改。
我因为暂时还要兼顾兼容性,不能全部推翻。
作者: soulsaga    时间: 2023-4-11 15:07
可以复制数据库敌人的元素属性和状态
批量贴上
省了一个个点
作者: 玻璃柿子    时间: 2023-4-13 07:36
soulsaga 发表于 2023-4-11 15:07
可以复制数据库敌人的元素属性和状态
批量贴上
省了一个个点

后面会加的
作者: 玻璃柿子    时间: 2023-4-13 07:37
本帖最后由 玻璃柿子 于 2023-4-13 07:39 编辑

这个版本增加了数据库元素个数破限的功能
以及用户可以修改脚本,自己改数值上限
修改washduck.rb即可
下载地址在一楼




作者: SailCat    时间: 2023-4-13 23:22
能否将名称以及说明这两个字段的文本长度上限提升至10,000或32,767字?
作者: xiaohuangdi    时间: 2023-4-14 07:19
【製作】
攝像機:設置鏡頭坐標;輸入攝像機位置坐標,x y, 重置玩家坐標;
走位記錄:MZ功能,起始點然後鼠標移動記錄路綫,自動生成剛才的路綫(向上移動向上向左向上...)
記錄已設置的NPC設定:右鍵的“快速新建特定事件”,製作人可通過記錄NPC,需要的時候直接右鍵讀取,
                                   雖然RM也能通過複製黏貼的辦法,製作游戲需要方便大量調用已設置的NPC功能;
事件出現條件:最下方增加一個脚本,RM出現條件無法 “等於” 或者 “在之間”;
對話單獨顯示名字: 角色名字是RPG對話必帶的,它因該被單獨標記出來,而不是要製作則在對話框中手打名字占用一行來顯示,
                            人名輸入在臉圖下方,可由其他脚本來顯示人物名字類型和位置。

【地圖】
自由移動圖塊:畫圖時可自由移動地圖塊的位置,方便微調物件擺放的坐標xy,按下快捷鍵后可以自由微調前後上下32pixel;
自由移動NPC位置:同上可以左右上下移動“事件”在圖塊中的初始位置
陰影圖層:默認一個陰影圖層“F”,只放置各類陰影類型,可在Tileset陰影png更換添加陰影樣式;


【必備插件功能】可以選擇開啓或者關閉
物品獲得提示;
選項擴展:選項旁邊可輸入顯示選項數量,設定裏面可更改默認值4;

收集增加已有的脚本功能,歸納到新建頁“事件指令4”
作者: 玻璃柿子    时间: 2023-4-14 20:36
SailCat 发表于 2023-4-13 23:22
能否将名称以及说明这两个字段的文本长度上限提升至10,000或32,767字?

如果是…………猫大的话……可以哦…………
作者: 玻璃柿子    时间: 2023-4-14 20:42
xiaohuangdi 发表于 2023-4-14 07:19
【製作】
攝像機:設置鏡頭坐標;輸入攝像機位置坐標,x y, 重置玩家坐標;
走位記錄:MZ功能,起始點然後 ...

好哦,这个我先保存上,真正开始弄,可能会拖到六月份以后
作者: soulsaga    时间: 2023-4-14 22:28
数据库物品技能那些等都加个
状态和属性那些名字左边加上ID编号更直观
作者: 玻璃柿子    时间: 2023-4-15 17:58
SailCat 发表于 2023-4-13 23:22
能否将名称以及说明这两个字段的文本长度上限提升至10,000或32,767字?

链接:https://pan.baidu.com/s/1mCFgb0vjd-Vk0cWVRuop3w
提取码:rcbd
--来自百度网盘超级会员V1的分享
改好了,上限是40000,超出了容易出现bug。
另外,因为原系统只给名称和说框分配了1字节的内存,最高只能是127个字符,为了破限用了一些特殊的办法。
我只是简单测试了下,暂时没发现bug,但不保证一定没有,如果出现问题及时找我。
作者: 玻璃柿子    时间: 2023-4-15 18:56
玻璃柿子 发表于 2023-4-15 17:58
链接:https://pan.baidu.com/s/1mCFgb0vjd-Vk0cWVRuop3w
提取码:rcbd
--来自百度网盘超级会员V1的分 ...

目前这些修改方案,都是基于二进制的,只是改这个更麻烦一些,用的是一个自己才研究出来,没有试过的办法。
作者: SailCat    时间: 2023-4-16 18:37
玻璃柿子 发表于 2023-4-15 17:58
链接:https://pan.baidu.com/s/1mCFgb0vjd-Vk0cWVRuop3w
提取码:rcbd
--来自百度网盘超级会员V1的分 ...

刚下载了,结果被报Trojan:Win32/Spursint.F!cl……
没办法用……唉
作者: 玻璃柿子    时间: 2023-4-16 20:46
本帖最后由 玻璃柿子 于 2023-4-16 20:49 编辑
SailCat 发表于 2023-4-16 18:37
刚下载了,结果被报Trojan:Win32/Spursint.F!cl……
没办法用……唉


因为xp不开源,所有的修改都是采用非正常方案,就是对文件直接修改二进制内存,所以容易被杀毒软件判定是病毒。
在信任的情况下,可以这样操作:
1.在任意位置新建一个文件夹,然后把软件放进去
2.在杀毒软件中设置免杀目录,将刚刚新建的文件夹添加到免杀目录中
3.解压到当前目录,并运行



作者: 玻璃柿子    时间: 2023-4-19 20:20
最近研究一些编辑器内部的原理,五一节前先不上新版本了,五一后会出一个较大的更新。
作者: soulsaga    时间: 2023-4-21 22:55
本帖最后由 soulsaga 于 2023-4-22 18:46 编辑

关於插件,希望可以附上数个范例參考,
空白一片要重头写多困难
谁都可以,不一定要作者
作者: jinae2022    时间: 2023-4-22 11:22
现在还有人愿意大刀阔斧的搞xp真的是难得
作者: 玻璃柿子    时间: 2023-4-24 21:16
soulsaga 发表于 2023-4-21 22:55
关於插件,希望可以附上数个范例參考,
空白一片要重头写多困难
谁都可以,不一定要作者 ...

好的,在考虑,最近在闭关中
作者: 89444640    时间: 2023-4-25 11:30
本帖最后由 89444640 于 2023-4-26 11:31 编辑

跟楼主申请个改版的动画编辑器,可以考虑下,能在rmxp编辑器里直接运行即可套原来界面把下面动画编辑窗口弄大点
稳定不毁动画数据库,以前外国有个版本毁数据库,测试下不稳定没敢用,
可读取保存9999个动画列表,可随时运行测试动画效果,和默认一样的闪烁和音效播放,扩大动画原件可拉动范围,默认战斗窗口320*240,动画原件可拉出这个范围即可,
编辑动画原件的窗口不缩放动画原件,可改编辑器背景颜色,黑底色调节黑色动画原件看不清。
游戏启动前的设置,比如手柄键盘按键调节,分辨率选择,比如放大为1280*960全屏显示,其他部分自动补黑边等。
作者: lcx666s    时间: 2023-4-30 22:11
作者能不能把地图上限从999改成9999?
作者: 玻璃柿子    时间: 2023-5-4 20:33
五一假期啥都没干,就知道玩…………
作者: 玻璃柿子    时间: 2023-5-5 20:46
lcx666s 发表于 2023-4-30 22:11
作者能不能把地图上限从999改成9999?

地图上限是吧,可以哦
作者: 玻璃柿子    时间: 2023-5-5 22:14
class Rlib
        attr_reader :WM_COMMAND
        attr_reader :WM_SHOWWINDOW
        attr_reader :WS_POPUP
        attr_reader :WS_BORDER
        attr_reader :WS_SYSMENU
        attr_reader :WS_CAPTION
        attr_reader :WS_CHILD
        attr_reader :WS_VISIBLE
        attr_reader :DS_MODALFRAME
        attr_reader :BS_DEFPUSHBUTTON
        attr_reader :IDOK
        attr_reader :IDCANCEL
        attr_reader :DG_BUTTON
        attr_reader :DG_EDIT
        attr_reader :DG_STATIC
        attr_reader :DG_LIST
        attr_reader :DG_SCROLL
        attr_reader :DG_COMBO
        attr_reader :TCM_GETCURFOCUS
       
        def initialize
                # 导入win32 api
                @utf8_MessageBox = Win32API.new('washduck', 'utf8_MessageBox', ['l','p','p','l'], 'l')
                @GetSubMenu = Win32API.new('user32', 'GetSubMenu', ['l','l'], 'l')
                @utf8_AppendMenu = Win32API.new('washduck', 'utf8_AppendMenu', ['l','l','l','p'], 'l')
                @utf8_CreateDialog = Win32API.new('washduck', 'utf8_CreateDialog', ['l','l','l','l','l','p'], 'l')
                @utf8_AppendDialogItem = Win32API.new('washduck', 'utf8_AppendDialogItem', ['l','l','l','l','l','l','l','l','p'], 'l')
                @ShowDialog = Win32API.new('washduck', 'ShowDialog', 'l', 'l')
                @DestoryDialog = Win32API.new('washduck', 'DestoryDialog', 'l', 'l')
                @GetWindowTitle = Win32API.new('washduck', 'GetWindowTitle', 'l', 'p')
                @EndDialog = Win32API.new('user32', 'EndDialog', ['l','l'], 'l')
                @GetDlgItem = Win32API.new('user32', 'GetDlgItem', ['l','l'], 'l')
                @GetDlgCtrlID = Win32API.new('user32', 'GetDlgCtrlID', 'l', 'l')
                @SendMessageA = Win32API.new('user32', 'SendMessageA', ['l','l','l','l'], 'l')
                @GetMemVal = Win32API.new('washduck', 'GetMemVal', 'l', 'l')
                @SetMemVal = Win32API.new('washduck', 'SetMemVal', ['l','l'], 'l')
               
                # 窗口消息
                @WM_COMMAND = 0x0111
                @WM_SHOWWINDOW = 0x0018

                # 窗口样式
                @WS_POPUP = 0x80000000
                @WS_BORDER = 0x00800000
                @WS_SYSMENU = 0x00080000
                @WS_CAPTION = 0x00C00000
                @WS_CHILD = 0x40000000
                @WS_VISIBLE = 0x10000000

                # 对话框样式
                @DS_MODALFRAME = 0x80

                # 按钮样式
                @BS_DEFPUSHBUTTON = 0x00000001

                # 控件消息
                @IDOK = 1
                @IDCANCEL = 2

                # 对话框元素
                @DG_BUTTON = 0x0080
                @DG_EDIT = 0x0081
                @DG_STATIC = 0x0082
                @DG_LIST = 0x0083
                @DG_SCROLL = 0x0084
                @DG_COMBO = 0x0085

                # 选项卡操作
                @TCM_GETCURFOCUS = 0x1300 + 47
        end
       
        def MessageBox(hwnd, text, lpCapition, uType)
                return @utf8_MessageBox.call(hwnd, text, lpCapition, uType)
        end
       
        def GetSubMenu(menu, index)
                return @GetSubMenu.call(menu, index)
        end
       
        def AppendMenu(menu, flags, mid, name)
                return @utf8_AppendMenu.call(menu, flags, mid, name)
        end
       
        def CreateDialog(style, x, y, cx, cy, title)
                return @utf8_CreateDialog.call(style, x, y, cx, cy, title)
        end
       
        def AppendDialogItem(id, style, x, y, cx, cy, classid, mid, name)
                return @utf8_AppendDialogItem.call(id, style, x, y, cx, cy, classid, mid, name)
        end
       
        def ShowDialog(id)
                return @ShowDialog.call(id)
        end
       
        def DestoryDialog(id)
                return @DestoryDialog.call(id)
        end
       
        def GetWindowTitle(hWnd)
                return @GetWindowTitle.call(hWnd)
        end
       
        def EndDialog(hWnd, wParam)
                return @EndDialog.call(hWnd, wParam)
        end
       
        def GetDlgItem(hWnd, mid)
                return @GetDlgItem.call(hWnd, mid)
        end
       
        def SendMessageA(hWnd, message, wParam, lParam)
                return @SendMessageA.call(hWnd, message, wParam, lParam)
        end
       
        def GetMemVal(addr)
                return @GetMemVal.call(addr)
        end
       
        def SetMemVal(addr, val)
                return @SetMemVal.call(addr, val)
        end
       
        def SetWeaponAtk(val)
                SetMemVal(0x00435AEC,val)
                SetMemVal(0x00436239,val)
        end
       
        def SetWeaponPdef(val)
                SetMemVal(0x00435AFF,val)
                SetMemVal(0x0043625B,val)
        end
       
        def SetWeaponMdef(val)
                SetMemVal(0x00435B12,val)
                SetMemVal(0x0043627D,val)
        end
       
        def SetWeaponStr(min,max)
                SetMemVal(0x00435B25,max)
                SetMemVal(0x0043629F,max)
               
                SetMemVal(0x00435B2A,min)
                SetMemVal(0x004362A4,min)
        end
       
        def SetWeaponDex(min,max)
                SetMemVal(0x00435B3B,max)
                SetMemVal(0x004362C4,max)
               
                SetMemVal(0x00435B40,min)
                SetMemVal(0x004362C9,min)
        end
       
        def SetWeaponAgi(min,max)
                SetMemVal(0x00435B51,max)
                SetMemVal(0x004362E9,max)
               
                SetMemVal(0x00435B56,min)
                SetMemVal(0x004362EE,min)
        end
       
        def SetWeaponInt(min,max)
                SetMemVal(0x00435B67,max)
                SetMemVal(0x0043630E,max)
               
                SetMemVal(0x00435B6C,min)
                SetMemVal(0x00436313,min)
        end
       
        def SetArmorPdef(val)
                SetMemVal(0x00427E2C,val)
                SetMemVal(0x0042858E,val)
        end
       
        def SetArmorMdef(val)
                SetMemVal(0x00427E3F,val)
                SetMemVal(0x004285B0,val)
        end
       
        def SetArmorStr(min,max)
                SetMemVal(0x00427E62,max)
                SetMemVal(0x004285F1,max)
               
                SetMemVal(0x00427E67,min)
                SetMemVal(0x004285F6,min)
        end
       
        def SetArmorDex(min,max)
                SetMemVal(0x00427E78,max)
                SetMemVal(0x00428616,max)
               
                SetMemVal(0x00427E7D,min)
                SetMemVal(0x0042861b,min)
        end
       
        def SetArmorAgi(min,max)
                SetMemVal(0x00427E8E,max)
                SetMemVal(0x0042863B,max)
               
                SetMemVal(0x00427E93,min)
                SetMemVal(0x00428640,min)
        end
       
        def SetArmorInt(min,max)
                SetMemVal(0x00427EA4,max)
                SetMemVal(0x00428660,max)
               
                SetMemVal(0x00427EA9,min)
                SetMemVal(0x00428665,min)
        end
       
        def SetEnemyStr(val)
                SetMemVal(0x0042AEEF,val)
                SetMemVal(0x0042BBCC,val)
        end
       
        def SetEnemyDex(val)
                SetMemVal(0x0042AF02,val)
                SetMemVal(0x0042BBF2,val)
        end
       
        def SetEnemyAgi(val)
                SetMemVal(0x0042AF15,val)
                SetMemVal(0x0042BC18,val)
        end
       
        def SetEnemyInt(val)
                SetMemVal(0x0042AF28,val)
                SetMemVal(0x0042BC3E,val)
        end
       
        def SetEnemyAtk(val)
                SetMemVal(0x0042AF3B,val)
                SetMemVal(0x0042BC64,val)
        end
       
        def SetEnemyPdef(val)
                SetMemVal(0x0042AF4E,val)
                SetMemVal(0x0042BC8A,val)
        end
       
        def SetEnemyMdef(val)
                SetMemVal(0x0042AF61,val)
                SetMemVal(0x0042BCB0,val)
        end
       
        def SetDatabaseMax(val)
                SetMemVal(0x00496C9C,val)
        end
       
        def SetMapMaxSize(val)
                SetMemVal(0x004888E0,val)
                SetMemVal(0x00488906,val)
                SetMemVal(0x00488A92,val)
                SetMemVal(0x00488AA5,val)
        end
end

$rlib = Rlib.new

class PluginWindow
        def initialize
                @Window = $rlib.CreateDialog($rlib.WS_POPUP | $rlib.WS_BORDER | $rlib.WS_SYSMENU | $rlib.DS_MODALFRAME | $rlib.WS_CAPTION, 10, 10, 300, 300, "插件管理")
                $rlib.AppendDialogItem(@window, $rlib.WS_CHILD | $rlib.WS_VISIBLE | $rlib.BS_DEFPUSHBUTTON, 10, 70, 80, 20, $rlib.DG_BUTTON, $rlib.IDOK, "确定")
        end
       
        def ShowWindow()
                $rlib.ShowDialog(@window)
        end
       
        def Update(hWnd, message, wParam, lParam)
                case message
                when $rlib.WM_COMMAND
                        case wParam
                        when $rlib.IDOK
                                $rlib.MessageBox(0, "你好,这里是插件窗口", '打印', 0)
                                d = load_data("Data/Actors.rxdata")
                                $rlib.MessageBox(0, d[1].name, '读取第一个角色名字', 0)
                        when $rlib.IDCANCEL
                                $rlib.EndDialog(hWnd, wParam)
                        end
                end
                return false
        end
end

class DatabaseWindow
        def initialize(hWnd)
                #$rlib.MessageBox(0, '数据库窗口启动', '调试信息', 0)
                @hWnd = hWnd
                @tab = $rlib.GetDlgItem(hWnd, 3101)
        end
       
        def GetTebIndex()
                return $rlib.SendMessageA(@tab, $rlib.TCM_GETCURFOCUS, 0, 0)
        end
       
        def Update(hWnd, message, wParam, lParam)
                #$rlib.MessageBox(0, message.to_s + ' ' + wParam.to_s, '欢迎', 0)
        end
end

class MainWindow
        def initialize
                #$rlib.MessageBox(0, 'rpg maker xp必将迎来新生', '欢迎', 0)
                @plugin = PluginWindow.new
               
                #武器攻击力破限
                $rlib.SetWeaponAtk(9999)
               
                #武器物理防御破限
                $rlib.SetWeaponPdef(9999)
               
                #武器魔法防御破限
                $rlib.SetWeaponMdef(9999)
               
                #武器力量破限
                $rlib.SetWeaponStr(-9999, 9999)
               
                #武器灵巧破限
                $rlib.SetWeaponDex(-9999, 9999)
               
                #武器速度破限
                $rlib.SetWeaponAgi(-9999, 9999)
               
                #武器魔力破限
                $rlib.SetWeaponInt(-9999, 9999)
               
                #防具物理防御破限
                $rlib.SetArmorPdef(9999)
               
                #防具魔法防御破限
                $rlib.SetArmorMdef(9999)
               
                #防具力量破限
                $rlib.SetArmorStr(-9999, 9999)
               
                #防具灵巧破限
                $rlib.SetArmorDex(-9999, 9999)
               
                #防具速度破限
                $rlib.SetArmorAgi(-9999, 9999)
               
                #防具魔力破限
                $rlib.SetArmorInt(-9999, 9999)
               
                #敌人攻击力破限
                $rlib.SetEnemyAtk(9999)
               
                #敌人物理防御破限
                $rlib.SetEnemyPdef(9999)
               
                #敌人魔法防御破限
                $rlib.SetEnemyMdef(9999)
               
                #敌人力量破限
                $rlib.SetEnemyStr(9999)
               
                #敌人灵巧破限
                $rlib.SetEnemyDex(9999)
               
                #敌人速度破限
                $rlib.SetEnemyAgi(9999)
               
                #敌人魔力破限
                $rlib.SetEnemyInt(9999)
               
                #数据库元素上限破限
                $rlib.SetDatabaseMax(9999)
               
                #地图大小破限
                $rlib.SetMapMaxSize(9999)
        end
       
        def ShowMenu(id, menu)
                case id
                        when 801
                        sub_menu = $rlib.GetSubMenu(menu, 6)
                        $rlib.AppendMenu(sub_menu, 0, 100000, '插件')
                end
        end
       
        def UpdateMain(hWnd, message, wParam, lParam)
                case message
                when $rlib.WM_COMMAND
                        case wParam
                        when 100000
                                @plugin.ShowWindow
                        end
                end
                return false
        end
       
        def Update(hWnd, message, wParam, lParam)
                title = $rlib.GetWindowTitle(hWnd)
                case title
                when '插件管理'
                        return @plugin.Update(hWnd, message, wParam, lParam)
                when '数据库'
                        if message == $rlib.WM_SHOWWINDOW && wParam == 1
                                @db = DatabaseWindow.new(hWnd)
                        end
                when ''
                        @db.Update(hWnd, message, wParam, lParam)
                else
                        return UpdateMain(hWnd, message, wParam, lParam)
                end
                return false
        end
end

$_washduck = MainWindow.new
作者: 玻璃柿子    时间: 2023-5-5 22:15
玻璃柿子 发表于 2023-5-5 22:14
class Rlib
        attr_reader :WM_COMMAND
        attr_reader :WM_SHOWWINDOW

复制这个脚本,替换原工程中的washduck.rb,就能破限地图大小的限制。注意,要拿我改过的rmxp才可以,原版是没有效果的。
作者: 玻璃柿子    时间: 2023-5-5 22:17
89444640 发表于 2023-4-25 11:30
跟楼主申请个改版的动画编辑器,可以考虑下,能在rmxp编辑器里直接运行即可套原来界面把下面动画编辑窗口弄 ...

最近就在整窗口,感觉win32编程,天生就难,想要封装成ruby,并且简单易用的话,好像不太可能的说。
作者: zlyl_wiley    时间: 2023-7-25 00:04
这几天稍微研究了下,擅自写了点东西
【魔改了魔改版XP】做了个简单的多runtime带参快速启动插件
虽然遇到了奇怪现象暂时不继续了,但研究过程中真是深深感叹这个计划的神奇,期待早日完善
然后也体会到插件管理的重要性,做好这一步,才能不用再为兼容性纠结,到时各路大神能自由发挥,使用者自行个性化配置,这才真的是RMXP的新生啊
总之楼主辛苦了,这份努力绝对会值得的,加油!
作者: soulsaga    时间: 2023-7-26 14:29
关於魔改版xp编辑器...
原版如果打开了编辑器的情況下
蓝屏死机或且突然断电的话工程就会爆炸了..
不知魔改版如何?
作者: drqiu    时间: 2023-10-18 12:41
请问大佬还能提供下载链接嘛
作者: soulsaga    时间: 2024-1-27 23:18
这帖好久没新消息了?
作者: 一枚菜鸡大队长    时间: 2024-2-1 09:11
soulsaga 发表于 2023-7-26 14:29
关於魔改版xp编辑器...
原版如果打开了编辑器的情況下
蓝屏死机或且突然断电的话工程就会爆炸了..

停电工程爆炸这件事我也遇到过,一般情况下再造一个项目然后把老项目的部分内容复制粘贴过去就解决了
作者: chouxiaojiu    时间: 2024-3-8 16:05
求一个软件连接
作者: lcjavip    时间: 2024-3-14 18:25
楼主链接失效了!!!
作者: a986776335    时间: 2024-4-24 16:56
楼主下载链接失效咯




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