查看: 29671|回复: 92

[转载发布] 【汉化/改进】ひきも記 (Tomoaky) RGSS3_SRPG(战棋)

[复制链接]
梦石
0
星屑
2590
在线时间
452 小时
注册时间
2019-6-22
回帖
68
发表于 2020-1-27 00:21:59 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 kunikai 于 2022-1-30 22:53 编辑

【最近更新:2020/5/30】
2022.1.30补档
这两年深受现实折磨。
现在想来接触RM也有六七年了,连半点自己的东西都没做出来……


1.发布

1.0 在一切之前——

1.0.1 著作权所属

该脚本的作者为Tomoaky(ひきも記),原发布地址为 https://hikimoki.sakura.ne.jp/。

在使用脚本时,务必遵守该脚本的利用规约。该规约在"RPG制作大师授权素材推广计划"中被提及,现将其抄录如下。
(规约地址:http://rmproject.lofter.com/post/3b5924_13a570e)
(原文:https://hikimoki.sakura.ne.jp/index.php?article=material#license)

RPG制作大师授权素材推广计划  基本规则
  ├在遵守规则的情况下,通常情况下这些素材可以免费的用于游戏中。
  ├作者并没有放弃素材的著作权。
  ├禁止直接使用素材的网址。
  ├禁止在不恰当的作品中使用这些素材。
  ├素材作者不对使用素材造成的任何后果负责。
  ├规则可能在不作通知的情况下更改。
  ├没有特别说明的规则并不表示许可,如果对于是否可以使用感到不确定的话请询问一下作者。
  └对于由其他素材(外站/制作大师系列官方素材)加工而来的素材,在遵守本站的规则时还需要遵守素材原作者(外站/官方)的规则。

不需要报告
  ├这份素材既不需要下载报告又不需要使用报告。
  ├下载这份素材时,你不需要告知素材的作者。
  ├在自己的游戏中使用这份素材时,你不需要告知素材的作者。
  └另外,大部分素材作者还是希望你使用素材时能够报告他们的(非强制性要求),你的报告对于素材的作者来说是很大的鼓励。

自由的用于收费游戏中(游戏类型未说明)
├素材的作者允许将这份素材用于收费游戏中,但是这里的收费游戏是否包含企业/公司制作的商业游戏作者并没有详细说明。
├这个规定的宽松程度介于下面这两个规定之间:
├自由的用于收费游戏中(同人游戏)
├自由的用于收费游戏中(商业游戏)
├一般情况下,只有日本的素材网站才会将收费游戏分为同人游戏与非同人游戏,其他国家的素材网站只会将游戏分成商业游戏和免费游戏这两种。
└如果是作为一家游戏公司使用这份素材时,出于保险考虑,我们建议您咨询一下素材作者。

自由的用于参加比赛的游戏中

自由的用于特殊题材的游戏中
  ├这份素材可以自由的用于特殊题材的游戏中。
  ├所谓的特殊题材,指的是游戏中包含BL、GL或者包含成人内容、猎奇内容等存在年龄限制的内容。
  ├在法律允许的情况下,你可以在包含以上特殊题材的游戏中使用这份素材。相应的,素材作者不对使用这些素材制作出的游戏可能造成的后果负责。
  └对于某团体或个人的诽谤中伤类题材、违反社会公序良俗的题材(反动、自杀劝诱)不包含在上面所说的特殊题材之中。

加工后可发布
  ├素材禁止直接转载。
  ├但是,对素材进行了能够看的出痕迹的加工的话,你可以在注明原作者的前提下发布这份素材。
  ├例如,对于图像素材来说,只是翻转图像、改变色调或者拼接图片这种简单的加工都不适用这条规则。
  ├为了避免惹上麻烦,同时,在大部分情况下,我们都要求你对加工后再发布的素材注明“禁止再一次加工后发布”。
  ├另外,大部分的素材作者都禁止加工后的素材作为收费素材公开。加工后发布的素材请不要收费。
  └由于是否进行了“能看的出痕迹的加工”包含了个人的主观判断,所以一般情况下我们不建议你发布自己加工后的素材。


1.0.2 这帖子是要做什么?

※该帖的目的在于向战旗爱好者推广这一优秀脚本。
※该帖的目的在于尽个人绵薄之力以回报(算吗……?)6R中众多帮助过我的人。
※该帖的目的在于为6R贡献出自己的一份力量。


1.0.3 “谢谢你们。”

您即将下载到的范例中,除了“ひきも記”的SRPG脚本之外,还有一些我自己也在使用的,与该SRPG脚本互动良好(?)且无冲突的脚本,
现将其列表如下,并对这些脚本的作者表示诚挚感谢。

以下排名不分先后

@taroxd
  ├基础设置
  ├定值再生
  ├战斗指令优化
  └普通攻防技能的扩展


ひきも記
  ├改变TP类型
  └技能获得武器属性(パッシブスキル)

TheoAllen
  ├按数值增减能力值
  └状态堆叠

@张咚咚
  ├计时器V2.0
  └Log信息提示v1.1

使用以上任何脚本请遵守利用规约并保留原作者ID。


此外,该范例中部分BGM来自“魔王魂”(https://maoudamashii.jokersounds.com/)。


1.0.4 这是什么?

这是一个用于RMVA的SRPG脚本,能够做出类似火焰纹章、机战等游戏的战斗效果。

下面是范例的一些预览。该战棋系统的使用方式除了在范例中可学习外,本人也会在该帖中进行介绍。
踩开关破坏地形.png 索敌力.png 技能范围2.png 非击破对象.png 瑞克.png 我方状态第二页.png 连携衰减.png

1.0.5 你做了什么?

※汉化了所有用于设定角色、技能、敌人等的名词。
※汉化了脚本内所有注释。
※汉化并润色了原作者的范例,并在原本的两个范例事件之上新增了四个范例事件。
※设定了八个默认角色供示例用。
※……总之把能看到的日语都汉化了。

1.0.6 要说的话

如果在脚本使用过程中有不明白的地方,欢迎在帖子下方提问。

如果想表示支持,在下方打赏1星屑表示有人在看就好。


1.0.7 下载地址
再重申一遍:下载前请务必阅读利用规约。【2022.1.30 补档】
链接:https://pan.baidu.com/s/1hxNBszjhb8KeSvY3hO4nDA
提取码:2022

1.0.8 更新履历

【2020.1.27:修正了范例中两处文本错误。发现了<击退回避率>的设置无效。】
【2020.1.28:由@gqxastg 提供方法,解决了<击退回避率>无效的问题。】
【2020.1.28:由@gqxastg 提供方法,使得“击退”效果能即时与地形进行互动。】
【2020.1.28:修改了范例内文本。为角色“瑞克”增加了10攻击力。】
【2020.1.28:由@gqxastg 提供方法,解决了敌人移动后才能响应公共事件的问题。】
【2020.1.28:在范例中夹带了一个用于记录更新并表示谢意的NPC。(呃。)】
【2020.1.28:由@gqxastg 提供方法,使得<使用者除外>这一设置现在会正常生效了。(真的非常感谢!)】
【2020.1.28:由@gqxastg 提供方法,使得现在可以使用通过角色/敌人备注<图标 图标ID, 显示优先度, 显示位置>在脸图显示ICON。】
【2020.1.28:由@gqxastg 提供方法,使得现在发动连携攻击时会面向攻击对象。】
【2020.1.28:由@gqxastg 提供方法,使得现在在状态下备注<动画 X>会令被赋予该状态的角色循环播放X号动画,并在之后解决了动画位置偏移的BUG。】
【2020.1.30:由@gqxastg 提供方法,使得现在可以在地图上显示棋子的血条并自定义血条样式。在游戏中也可以更改血条的颜色。】
【2020.1.30:由@gqxastg 提供方法,使得现在发动连携攻击、保护弱者时会面向攻击对象;效果结算完毕后会转回原方向。(大大减少了违和感。)】
【2020.1.30:由@gqxastg 提供方法,增加了“朝向”命令,用来更改友方角色的朝向。】
【2020.1.30:由@gqxastg 提供方法,使得现在可以使用通过在角色/敌人备注<图标 图标ID, 显示优先度>在行走图显示ICON。(与脸图显示不冲突)】
【2020.1.31:由@gqxastg 提供方法,使得现在可以在战斗中跨地图调用事件作为战斗者。】
【2020.1.31:由@gqxastg 提供方法,使得现在可以自定义“系统设置”这一选项的详细内容。(具体请在脚本中查看)】
【2020.1.31:由@gqxastg 提供方法,使得现在可以更改<物品>类敌人的显示样式。(具体请在脚本中查看)】
【2020.1.31:由@gqxastg 提供方法,增加了“换位”命令,用来与周围友军交换位置。】
【2020.2.2:修正了一个关于调用事件脚本的BUG;增加了一个范例。】
【2020.2.12:暂时清醒了一会。】
【2020.4.1:由@gqxastg改进了“生成事件”脚本。】

1.0.9 待改进的方向……?

这些功能不存在于原脚本中,但我希望它们存在——我尽量去做。
【事实上我什么都没做。】

※以范例中“阿奈斯特”的技能“稲妻閃光”为例,如果能做出冲刺指定距离并将路径敌人击退至两侧且造成一定伤害的效果,个人觉得会很好玩。(类似“英雄联盟”中“皮城执法官”的终极技能。)
※以角色“龙马”的“一闪”为例。希望做出“如果龙马无法做到向前一步,则无法选定前方两格处的敌人为目标”。(“不过去怎么砍人?”)
※在“敌人”“状态”中备注<缠斗>,使得符合条件的角色在行动后即使仍能移动也不会远离目标。
※在“状态”中备注<优先级 X>,使得当该状态作为地形时,“非可操作角色”会在不影响行动的前提下优先进入优先级较高的地形。
※与<击退>相对,做出<牵引>效果,使技能能够将目标向使用者位置拖拽一格。(现在的单体牵引做法:角色发动<击退>技能时朝向身后,技能结束后再次朝向身后)
※新增一些<范围类型>。如“面朝方向的直线X格”。
※在地图中存在两个或以上的<GATE>。
※处于某编号的区块时,回合开始(或回合结束)会向某方向强制移动一格。
※强制目标转向的技能。
※光环类:在角色、职业、武器、防具、敌人、状态下备注<同队光环 X,Y,Z>/<敌方光环 X,Y,Z>,使得以自身为原点,Z类型且以Y为半径的范围内友军/敌人获得X状态。
※难以通过的地形:某地形需要X移动力才能移动一格。
※战棋中常见的“骑兵”角色所使用的技能:本回合已移动的移动路程越长,伤害越高。
※射程为“指定编号区块”的技能。
※天气效果。(我记得是有精灵的啊……)
※这样一看,真的需要群策群力了。


1.0.10 最后说点什么

……浅葱樱正在引诱夕暮降下。春天正在逐步消逝。

任何人都可以要求删除该范例。若如此要求,本人将在24小时内将范例修改至其同意发布。


*你得到了来自他人的帮助和认同,这使你充满了决心。

点评

作者網站也掛了  发表于 2021-6-26 21:23
請問方便放到 成通 空間嗎? OTZ 這邊不方便 或者不想用百度  发表于 2021-6-26 21:22

评分

参与人数 18赞 +18 收起 理由
肥哥 + 1 精品文章
venom2000 + 1 精品文章
frost_king_hw + 1 塞糖
DL_I + 1 精品文章
york0818 + 1 精品文章
yuben83 + 1 我很赞同
shouhuangzhua + 1 精品文章
百里_飞柳 + 1 精品文章
阿薩男爵 + 1 精品文章
子叶子叶 + 1 精品文章

查看全部评分

一介凡人。对大多数事情都有心无力的凡人。
梦石
0
星屑
2590
在线时间
452 小时
注册时间
2019-6-22
回帖
68
 楼主| 发表于 2020-1-27 11:50:36 | 显示全部楼层
本帖最后由 kunikai 于 2020-2-12 15:14 编辑

2.关于该脚本的介绍(请善用CTRL+F)

2.0 通用类名词解释

2.0.1 <移动力>

移动力,即描述角色一回合可以移动的距离长短的量。
某角色的移动力合计为<移动力 X>,则表示该角色每回合的可移动范围为一个以X为半径的圆。

下面分别是移动力为4、0、3的角色的可移动范围。
移动力为4的娜塔丽.png 移动力为0的舞女.png 移动力为3的龙马.png

使用方法:

可操作角色:在角色、职业、武器、防具、状态的备注栏中写下<移动力 X>,则移动力会叠加计算。
不可操作角色:在敌人、状态的备注栏中写下<移动力 X>,则移动力会叠加计算。

例:角色“艾里克”的职业是战士。
      在“艾里克”这一角色的备注栏写<移动力 1>,在“战士”这一职业的备注栏写<移动力 3>,
      则艾里克在战斗中的实际移动力为(1+3=)4。

2.0.2 <连携力>

连携力,即身旁友军发动普通攻击时,自身无视距离追加一次对其攻击目标的普通攻击的概率。
<连携力 60>,即满足条件时,该角色发动追加攻击的概率为60%。

如图,龙马发动普通攻击“一闪”攻击爱丽丝,龙马身边的艾里克追加了一次普攻。
连携攻击.png
使用方法:
可操作角色:在角色、职业、武器、防具、状态的备注栏中写下<连携力 X>,则连携力会叠加计算。
不可操作角色:在敌人、状态的备注栏中写下<连携力 X>,则连携力会叠加计算。

2.0.3 <索敌力>

索敌力,即不可操作角色侦测敌人的能力。
<索敌力 X>即表示事件可以侦测到半径为X格的圆内的敌人。

下面以索敌力为5的骷髅兵为例。

索敌力示例2.png 索敌力示例.png 索敌力示例3.png
图2.0.3-1:艾里克处于所有骷髅兵的视野之外,这些骷髅兵不会对艾里克的存在作出任何反应。
图2.0.3-2:艾里克向前一步,进入了大骷髅的视野内。
图2.0.3-3:大骷髅执行战斗时应执行的行动,其他骷髅按兵不动。

使用方法:
可操作角色:不可使用。(这没有意义。)
不可操作角色:在敌人、状态的备注栏中写下<索敌力 X>,则索敌力会叠加计算。

使用例:安黛因在瀑布的小桥上拦截玩家,在“敌人”界面的“安黛因”备注栏写下<索敌力 1>,则除非玩家靠近,她不会主动离开小桥。
             设置安黛因的所有技能,使其使用任意技能时为自己附加状态“决心”,“决心”状态的备注栏中写下<索敌力 999>;
             则此时安黛因的视野变为1000格,会一直追杀玩家直至她融化。(BGM:Battle Against a True Hero)

2.0.4 <射程>

顾名思义,“射程”即定义某个技能最远作用距离的值。(先不考虑<范围>)

下面分别是在备注栏中写下了<射程 1>、<射程 2>、<射程 3>、<射程 4>的技能。

射程1.png 射程2.png 射程3.png 射程4.png

使用方法:
在技能的备注栏中写下<射程 X>。如未写下,默认值为0。

如果仔细观察,会发现上图中的技能范围是空心的;这是因为——

2.0.5 <射程穴>

这是因为上图中的技能,其备注栏还被写下了<射程穴 1>。

射程穴,即某技能射程的的空心区域。

下面同样用图片来直观展示<射程穴>的效果,以<射程 4>的技能为基础,
这些技能分别被写下了<射程穴 0><射程穴 1><射程穴 2><射程穴 3><射程穴 4><射程穴 5>。

射程穴0.png 射程穴1.png 射程穴2.png 射程穴3.png 射程穴4.png 射程穴5.png

使用方法:
在技能的备注栏中写下<射程穴 X>。如未写下,默认值为0。(请观察范例中的“防御”技能——什么都没写。)

使用例:
SRPG常见的“炮兵”。射程极远,但无法攻击接近自己的敌人。

2.0.6 <射程类型>

射程类型,即射程的类型。(抱歉。实在不知道如何详细描述。)
目前存在四种射程类型,如图所示,分别为“圆形”“正方形”“十字形”“X字”。

0类型.png 1类型.png 2类型.png 3类型.png

使用方法:
在技能的备注栏中写下<射程类型 X>。如未写下,默认值为0,即默认类型为圆形。

2.0.7 <范围>

范围,即描述技能生效区域大小的量。(?)

通过对<范围>的设置,可以实现技能同时对一定区域内多个目标生效的效果。<范围>取0时,技能对单个目标生效。

下面是在<射程 4 ><射程穴 1><射程类型 0><范围穴 0><范围类型 0>的设置下,
分别对<范围 0><范围 1><范围 2><范围 3><范围 4>技能的展示。
0范围.png 1范围.png 2范围.png 3范围.png 4范围.png

使用方法:
在技能的备注栏中写下<范围 X>。如未写下,默认值为0,即一格区域。

2.0.8 <范围穴>

与<射程穴>类似,是表示技能生效区域的中空部分大小的量。(我自己读着都费劲。有更好的解释方法欢迎提出。)
下面是在<射程 4 ><射程穴 1><射程类型 0><范围 3><范围类型 0>的设置下,
分别对<范围穴 0><范围穴 1><范围穴 2>技能的展示。

0范围穴.png 1范围穴.png 2范围穴.png

使用方法:
在技能的备注栏中写下<范围穴 X>。如未写下,默认值为0,即范围为实心。

2.0.9 <范围类型>

与<射程类型>类似,用来设定技能生效区域的形状。(我是不是每次都用了不一样的描述?)

下面是在<射程 4 ><射程穴 1><射程类型 0><范围 3><范围穴 1>的设置下,
分别对<范围类型 0><范围类型 1><范围类型 2><范围类型 3>技能的展示。
与射程类型相同,目前存在四种范围类型,如图所示,分别为“圆形”“正方形”“十字形”“X字”。
0范围类型.png 1范围类型.png 2范围类型.png 3范围类型.png

使用方法:
在技能的备注栏中写下<范围类型 X>。如未写下,默认值为0,即范围为实心。


2.0.10 <发动前事件>

顾名思义,<发动前事件>就是在技能发动前会执行的公共事件。

在原版工程中仅被用作播放使用者的动画,但我们显然可以自由发挥。

图2.0.10-1:在第五回合发动某技能时,魔王会感叹一句。
图2.0.10-2:某角色发动技能时向前一步。
图2.0.10-3:在洞窟中使用人工降雨会被嘲笑。(目前天气效果在战斗中并不能正常生效)
发动前事件2.png 发动前事件1.png 发动前事件3.png

使用方法:
在技能的备注栏中写下<发动前事件 X>。

2.0.11 <无差别>

备注了<无差别>的技能会对范围内所有单位生效。

使用方法:
在技能的备注栏中写下<无差别>。

2.0.12 <使用者除外>

备注了<使用者除外>的技能,即使自身在范围中也不会对自身生效。

使用方法:
在技能的备注栏中写下<使用者除外>。

2.0.13 <浮游>、<浮游特效不表示>

<浮游>角色不受地形效果的影响,且在“不可通行”的图块也可以自由通行。
同时其行走图会上下浮动。可备注<浮游特效不表示>

图2.0.13-1:抓拍下的<浮游>单位移动的珍惜画面。
图2.0.13-2:<浮游>角色的行走图浮动效果。
浮游.png 浮游特效.gif


使用方法:
在角色、职业、武器、防具、状态、敌人的备注栏中写下<浮游>,并依实际情况选择是否写下<浮游特效不表示>。

2.0.14 <水上移动>

<水上移动>角色的可移动区域与“大船”相同。
水上移动.png

使用方法:
在角色、职业、武器、防具、状态、敌人的备注栏中写下<水上移动>。




2.1 “敌人”专属名词解释(下列设定仅在“敌人”备注栏中有效。)

2.1.1 <行走图>、<脸图>

顾名思义,<行走图>、<脸图>用于设定敌人在战斗中所使用的行走图和脸图。

使用方法:
在“敌人”的备注栏中写下<行走图 XXX,Y>、<脸图 XXX,Y>,
其中“XXX”为图片名称,Y为索引(0-7)。

使用例: 备注.png
行走图.png 脸图.png

2.1.2 <HP隐藏>、<MP隐藏>、<掉落物隐藏>

<XX隐藏>用于对玩家隐藏对应的数据。

使用方法:
在“敌人”的备注栏中直接写下<HP隐藏>、<MP隐藏>、<掉落物隐藏>,则对应数据对玩家不可见。
隐藏时用于代替原数据的文字、用于代替原掉落物的图标可自由设定,详见3.X.X。

使用例:
图为设置了<MP隐藏>、<掉落物隐藏>的敌人的状态窗口和信息窗口。
隐藏.png 隐藏2.png

2.1.3 <称号>、<职业>、<等级>、<装备>

这些字段用来设置敌人在状态窗口中显示的内容,对实际属性没有影响。

使用方法:
在“敌人”的备注栏中直接写下对应内容。

使用例:设写下的内容为
<称号 帝国之鹰>
<职业 12>
<等级 65>
<装备 24,35,48,53,57>
(<装备>第一个数字为武器,其余为防具。若设定了“双持武器”,则第一、第二个数字为武器。)

则实际显示如下。
设定.png

2.1.4 <说明>、</说明>

用来设置显示在敌人状态窗口的文本。默认分辨率下最多支持两行。

使用方法:
在“敌人”的备注栏中写下
<说明>你需要的说明文字
你需要的说明文字</说明>。

使用例:
说明2.png 说明.png

2.1.5 <普攻动画>

用来设定敌人采取行动“攻击”时对目标播放的动画。

使用方法:
在“敌人”的备注栏中写下<普攻动画 X>,则敌人进行普通攻击时目标身上播放X号动画。

评分

参与人数 1赞 +1 收起 理由
chanszeman1018 + 1 精品文章

查看全部评分

一介凡人。对大多数事情都有心无力的凡人。
回复 1 0

使用道具 举报

梦石
0
星屑
17038
在线时间
6058 小时
注册时间
2011-7-18
回帖
152

开拓者

发表于 2020-1-28 00:02:11 | 显示全部楼层
本帖最后由 gqxastg 于 2022-11-26 03:54 编辑

针对楼主在范例里发现的一些问题(BUG)
这边从脚本根源上试着找了一下出现原因和解决方案
[fold=关于<击退回避率>的设置无效]
出现原因

经检查,在RPG::BaseItem中,获取击退回避率的正则表达式书写错误。
与其他相似格式的相比,第二个\s后未加星号(即“*”),导致无法正确匹配<击退回避率>的备注

解决方法

GFTC(17QR6T[HWTI6ZG~{Y4.png
如图所示,将RPG::BaseItem原第88行的
  1. /<击退回避率\s*(\-*\d+)\s>/
复制代码
修改为
  1. /<击退回避率\s*(\-*\d+)\s*>/
复制代码
即可
[/fold]
[fold=关于被击退后地形效果不刷新]
出现原因

就单纯的只是被击退后没刷新而已【

解决方法

QABC}IUHM}9OB9ZL~TMX7.png
如图所示,在Scene_SrpgMap的原第376行插入
  1. target.update_tile_state
复制代码
即可
[/fold]
[fold=关于非可操纵角色,使用调用公共事件的技能时,不能及时执行公共事件]
出现原因

敌对事件的行动处理时不会刷新地图的事件解释器,使用技能后无法及时执行公共事件

解决方法

U84`DY8Y%O}O4~)GD]X50SQ.png
如图所示,在Scene_SrpgMap的原第291行插入
  1. wait_for_event
复制代码
即可
[/fold]
[fold=关于<使用者除外>无效]
出现原因

经检查,在脚本中似乎并没有应用使用者除外效果的代码。
可能为作者遗忘或废案特性。

解决方法

K3KX%B((S2}$UYC7FZ4(CFT.png
如图所示,在Game_SrpgMap的原第484行插入
  1. targets -= [event] if item.no_user?
复制代码
即可
[/fold]
针对“1.0.9 待改进的方向”中一些效果的实现
↓最后更新时间:1/30 21:57
[fold=※如果能在地图上绘制棋子血条,观感应该会好些。]
已集成角色显示图标
[pre lang="ruby"]# SRPG插件-棋子地图血条 Ver.2020.1.30
# 岚风雷(论坛ID:gqxastg)制作
#==============================================================================
# 补充说明:可通过修改
# $game_actors[ID].hp_gauge 和
# $game_srpgmap.events[ID].battler
# 来修改角色血条样式
#==============================================================================
# ■ 设定项目
#==============================================================================

module TMSRPG
  
    MAP_HP_GAUGE = {
    # 匹配棋子血条的正则表达式
    # 默认为 <血条 样式ID>
    # 仅读取角色和敌人页的备注
    REGEXP:  /<血条\s*(\S+?)\s*>/,
    # 指定ID的开关打开时隐藏所有血条 不使用的话请设定为0
    HIDE:    0,
    # 默认的血条样式 默认不使用的话请设定为nil
    # 如默认使用血条,可在备注中使用 <血条 nil> 来不使用血条
    DEFAULT: {:actor => :blue, :enemy => :red},
    # 血条样式预设
    TYPE: {
    # :default为样式ID,可以为数字等值
      :default => {
        z:       0,
        visible: true,
        back: {
          origin: [15, 0],
          offset: [0, 1],
          width:  30,
          height: 5,
          color:  "Color.new(32, 32, 64)",
          zoom:   [1.0, 1.0],
        },
        gauge: {
          origin:   [0, 0],
          offset:   [-14, 2],
          width:    28,
          height:   3,
          color:    ["Color.new(224, 128, 64)", "Color.new(240, 192, 64)"],
          vertical: false,
          zoom:     [1.0, 1.0],
        },
      },
      :blue => {
        z:       0,
        # 可用脚本指定来单独控制某个样式的血条是否显示
        visible: "!$game_switches[0]",
        back: {
          origin: [15, 0],
          offset: [0, 1],
          width:  30,
          height: 5,
          color:  "Color.new(32, 32, 64)",
          zoom:   [1.0, 1.0],
        },
        gauge: {
          origin:   [0, 0],
          offset:   [-14, 2],
          width:    28,
          height:   3,
          color:    ["Color.new(0, 183, 238)", "Color.new(145, 255, 255)"],
          vertical: true,
          zoom:     [1.0, 1.0],
        },
      },
      :red => {
        z:       0,
        visible: true,
        back: {
          origin: [15, 0],
          offset: [0, 1],
          width:  30,
          height: 5,
          color:  "Color.new(32, 32, 64)",
          zoom:   [1.0, 1.0],
        },
        gauge: {
          origin:   [0, 0],
          offset:   [-14, 2],
          width:    28,
          height:   3,
          color:    ["Color.new(240, 60, 0)", "Color.new(255, 220, 210)"],
          vertical: true,
          zoom:     [1.0, 1.0],
        },
      },
      :only_icon => {
        z:       0,
        visible: false,
        back: {
          origin: [0, 0],
          offset: [0, 0],
          width:  1,
          height: 1,
          color:  "Color.new(32, 32, 64)",
          zoom:   [1.0, 1.0],
        },
        gauge: {
          origin:   [0, 0],
          offset:   [0, 0],
          width:    1,
          height:   1,
          color:    ["Color.new(224, 128, 64)", "Color.new(240, 192, 64)"],
          vertical: false,
          zoom:     [1.0, 1.0],
        },
      },
    },
  }
  
  MAP_CUSTOM_ICON = {
    # 是否启用自定义地图图标
    ENABLE:  true,
    # 匹配自定义地图图标的正则表达式
    # 默认为 <图标 图标ID, 显示优先度>
    # 与“自定义角色脸图位置图标”不冲突
    # 同一个备注可以通过不同行写入追加多个图标
    REGEXP:  /<图标\s*(\d+)\s*\,\s*(\d+)\s*>/,
    # 指定ID的开关打开时隐藏所有图标 不使用的话请设定为0
    HIDE:    0,
    # 显示模式
    # 0为仅显示优先级最高的图标
    # 其他数字为循环显示,每对应数字帧切换
    MODE:    180,
    # 图标样式预设
    # 将使用血条样式所对应的
    TYPE: {
      :default => {
        visible:  "!$game_switches[0]",
        z:        1,
        offset:   [-16, -24],
        origin:   [0, 0],
      },
      :blue => {
        visible:  true,
        z:        1,
        offset:   [-16, -24],
        origin:   [0, 0],
      },
      :red => {
        visible:  true,
        z:        1,
        offset:   [-16, -24],
        origin:   [0, 0],
      },
    },
  }
  
end
#==============================================================================
# ■ RPG::BaseItem
#==============================================================================

class RPG::BaseItem
  #--------------------------------------------------------------------------
  # ○ 获取自定义地图图标
  #--------------------------------------------------------------------------
  def custom_map_icons
    icons = []
    note.each_line do |line|
      case line
      when TMSRPG::MAP_CUSTOM_ICON[:REGEXP]
        icons.push([$1.to_i, $2.to_i])
      end
    end
    return icons.empty? ? nil : icons
  end
end
#==============================================================================
# ■ RPG::Actor
#==============================================================================

class RPG::Actor
  #--------------------------------------------------------------------------
  # ○ 获取血条样式
  #--------------------------------------------------------------------------
  def hp_gauge
    TMSRPG::MAP_HP_GAUGE[:REGEXP] =~ note ? eval($1) :
    TMSRPG::MAP_HP_GAUGE[:DEFAULT][:actor]
  end
end
#==============================================================================
# ■ RPG::Enemy
#==============================================================================

class RPG::Enemy
  #--------------------------------------------------------------------------
  # ○ 获取血条样式
  #--------------------------------------------------------------------------
  def hp_gauge
    TMSRPG::MAP_HP_GAUGE[:REGEXP] =~ note ? eval($1) :
    TMSRPG::MAP_HP_GAUGE[:DEFAULT][:enemy]
  end
end
#==============================================================================
# ■ Game_BattlerBase
#==============================================================================

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_accessor :hp_gauge # 血条样式
  #--------------------------------------------------------------------------
  # ○ 获取自定义地图图标
  #--------------------------------------------------------------------------
  def custom_map_icons
    feature_objects.collect {|object| object.custom_map_icons}.compact.flatten.
    each_slice(2).to_a.uniq.sort {|a, b| b[1] <=> a[1]}
  end
end
#==============================================================================
# ■ Game_Actor
#==============================================================================

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 设置
  #--------------------------------------------------------------------------
  alias maphpgauge_setup setup
  def setup(actor_id)
    maphpgauge_setup(actor_id)
    @hp_gauge = actor.hp_gauge
  end
end
#==============================================================================
# ■ Game_Enemy
#==============================================================================

class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  alias maphpgauge_initialize initialize
  def initialize(index, enemy_id)
    maphpgauge_initialize(index, enemy_id)
    @hp_gauge = enemy.hp_gauge
  end
end
#==============================================================================
# ■ Sprite_MapCustomIcon
#==============================================================================

class Sprite_MapCustomIcon < Sprite
  include TMSRPG
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_accessor :character
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize(viewport, character = nil)
    super(viewport)
    @character = character
    @index = 0
    @icons = []
    self.bitmap = Cache.system("Iconset")
    self.src_rect.set(icon_rect)
    update
  end
  #--------------------------------------------------------------------------
  # ● 更新画面
  #--------------------------------------------------------------------------
  def update
    super
    return invisible if $game_switches[MAP_CUSTOM_ICON[:HIDE]]
    return invisible unless @character && battler
    return invisible unless battler.hp_gauge
    return invisible if battler.custom_map_icons.empty?
    return invisible unless eval(data[:visible].to_s)
    self.visible = true
    #--------------------------------------------------------------------------
    if @icons != battler.custom_map_icons
      @icons = battler.custom_map_icons
      @index = 0
      @wait = MAP_CUSTOM_ICON[:MODE]
    end
    #--------------------------------------------------------------------------
    if @wait > 0
      @wait -= 1
    else
      @wait = MAP_CUSTOM_ICON[:MODE] - 1
      @index = (@index + 1) % @icons.size
    end unless MAP_CUSTOM_ICON[:MODE] == 0
    #--------------------------------------------------------------------------
    self.x = @character.screen_x + data[:offset][0]
    self.y = @character.screen_y + data[:offset][1]
    self.z = @character.screen_z + data[:z]
    self.ox, self.oy = data[:origin]
    self.src_rect.set(icon_rect)
  end
  #--------------------------------------------------------------------------
  # ● 不可见处理
  #--------------------------------------------------------------------------
  def invisible
    self.visible = false
    @index = 0
    @wait = MAP_CUSTOM_ICON[:MODE]
  end
  #--------------------------------------------------------------------------
  # ● 获取图标传输矩形
  #--------------------------------------------------------------------------
  def icon_rect
    @icons.empty? ?
    Rect.new(0, 0, 0, 0) :
    Rect.new(@icons[@index][0] % 16 * 24, @icons[@index][0] / 16 * 24, 24, 24)
  end
  #--------------------------------------------------------------------------
  # ● 获取战斗者
  #--------------------------------------------------------------------------
  def battler
    @character.instance_variable_get(:@battler)
  end
  #--------------------------------------------------------------------------
  # ● 获取图标样式参数
  #--------------------------------------------------------------------------
  def data
    MAP_CUSTOM_ICON[:TYPE][battler.hp_gauge]
  end
end
#==============================================================================
# ■ Sprite_MapHPGauge
#==============================================================================

class Sprite_MapHPGauge < Sprite
  include TMSRPG
  #--------------------------------------------------------------------------
  # ● 获取角色
  #--------------------------------------------------------------------------
  def character; @character; end
  #--------------------------------------------------------------------------
  # ● 设定角色
  #--------------------------------------------------------------------------
  def character=(c)
    @character = c
    @icon_sprite.character = c if @icon_sprite
  end
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize(viewport, character = nil)
    super(viewport)
    @character = character
    @gauge_sprite = Sprite.new(viewport)
    @icon_sprite = Sprite_MapCustomIcon.new(viewport, character) if
    MAP_CUSTOM_ICON[:ENABLE]
    @type = nil
    update
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  def dispose
    @icon_sprite.dispose if @icon_sprite
    @gauge_sprite.bitmap.dispose if @gauge_sprite.bitmap
    @gauge_sprite.dispose
    self.bitmap.dispose if self.bitmap
    super
  end
  #--------------------------------------------------------------------------
  # ● 更新画面
  #--------------------------------------------------------------------------
  def update
    super
    @icon_sprite.update if @icon_sprite
    return self.opacity = 0 if $game_switches[MAP_HP_GAUGE[:HIDE]]
    return self.opacity = 0 unless @character && battler
    return self.opacity = 0 unless battler.hp_gauge
    #--------------------------------------------------------------------------
    if @type != battler.hp_gauge
      @type = battler.hp_gauge
      redraw_back
      redraw_gauge
    end
    #--------------------------------------------------------------------------
    update_back
    update_gauge
  end
  #--------------------------------------------------------------------------
  # ● 重绘血槽背景
  #--------------------------------------------------------------------------
  def redraw_back
    self.bitmap.dispose if self.bitmap
    w, h = eval(data[:back][:width].to_s), eval(data[:back][:height].to_s)
    self.bitmap = Bitmap.new(w, h)
    c = eval(data[:back][:color])
    self.bitmap.fill_rect(0, 0, w, h, c)
    @back_color = c
  end
  #--------------------------------------------------------------------------
  # ● 重绘血槽
  #--------------------------------------------------------------------------
  def redraw_gauge
    @gauge_sprite.bitmap.dispose if @gauge_sprite.bitmap
    w, h = eval(data[:gauge][:width].to_s), eval(data[:gauge][:height].to_s)
    @gauge_sprite.bitmap = Bitmap.new(w, h)
    c = [eval(data[:gauge][:color][0]), eval(data[:gauge][:color][1])]
    @gauge_sprite.bitmap.gradient_fill_rect(
    Rect.new(0, 0, w, h), c[0], c[1], data[:gauge][:vertical])
    @gauge_color = c
  end
  #--------------------------------------------------------------------------
  # ● 更新血槽背景
  #--------------------------------------------------------------------------
  def update_back
    redraw_back if @back_color != eval(data[:back][:color])
    #--------------------------------------------------------------------------
    self.x = @character.screen_x + data[:back][:offset][0]
    self.y = @character.screen_y + data[:back][:offset][1]
    self.z = @character.screen_z + data[:z]
    #--------------------------------------------------------------------------
    self.ox, self.oy = data[:back][:origin]
    #--------------------------------------------------------------------------
    self.zoom_x = eval(data[:back][:zoom][0].to_s)
    self.zoom_y = eval(data[:back][:zoom][1].to_s)
    #--------------------------------------------------------------------------
    self.opacity = 255 #@character.opacity
    self.visible = eval(data[:visible].to_s)
    self.visible = false if @character.transparent
    self.visible = false if battler.hp_hide? &&
    !(CRISIS_HP_SHOW && battler.hp < battler.mhp / 4)
    self.visible = false if battler.dead?
  end
  #--------------------------------------------------------------------------
  # ● 更新血槽
  #--------------------------------------------------------------------------
  def update_gauge
    redraw_gauge if @gauge_color !=
    [eval(data[:gauge][:color][0]), eval(data[:gauge][:color][1])]
    #--------------------------------------------------------------------------
    @gauge_sprite.x = @character.screen_x + data[:gauge][:offset][0]
    @gauge_sprite.y = @character.screen_y + data[:gauge][:offset][1]
    #--------------------------------------------------------------------------
    @gauge_sprite.ox, @gauge_sprite.oy = data[:gauge][:origin]
    #--------------------------------------------------------------------------
    @gauge_sprite.zoom_x = battler.hp_rate * eval(data[:gauge][:zoom][0].to_s)
    @gauge_sprite.zoom_y = eval(data[:gauge][:zoom][1].to_s)
    #--------------------------------------------------------------------------
#~     @gauge_sprite.visible = false if battler.hp_hide? &&
#~     !(CRISIS_HP_SHOW && battler.hp < battler.mhp / 4)
  end
  #--------------------------------------------------------------------------
  # ● 获取血条样式参数
  #--------------------------------------------------------------------------
  def data
    MAP_HP_GAUGE[:TYPE][@type]
  end
  #--------------------------------------------------------------------------
  # ● 获取战斗者
  #--------------------------------------------------------------------------
  def battler
    @character.instance_variable_get(:@battler)
  end
  #--------------------------------------------------------------------------
  # ● 同步属性
  #--------------------------------------------------------------------------
  def z=(z); super; @gauge_sprite.z = z; end
  def opacity=(o); super; @gauge_sprite.opacity = o; end
  def visible=(v); super; @gauge_sprite.visible = v; end
end
#==============================================================================
# ■ Spriteset_SrpgMap
#==============================================================================

class Spriteset_SrpgMap
  #--------------------------------------------------------------------------
  # ● 生成人物精灵
  #--------------------------------------------------------------------------
  alias maphpgauge_create_characters create_characters
  def create_characters
    maphpgauge_create_characters
    create_hp_gauge
  end
  #--------------------------------------------------------------------------
  # ● 更新人物精灵
  #--------------------------------------------------------------------------
  alias maphpgauge_update_characters update_characters
  def update_characters
    maphpgauge_update_characters
    update_hp_gauge
  end
  #--------------------------------------------------------------------------
  # ● 释放人物精灵
  #--------------------------------------------------------------------------
  alias maphpgauge_dispose_characters dispose_characters
  def dispose_characters
    dispose_hp_gauge
    maphpgauge_dispose_characters
  end
  #--------------------------------------------------------------------------
  # ● 生成血槽精灵
  #--------------------------------------------------------------------------
  def create_hp_gauge
    @hp_gauge_sprites = []
    $game_srpgmap.all_battler_events.each do |event|
      @hp_gauge_sprites.push(Sprite_MapHPGauge.new(@viewport1, event))
    end
  end
  #--------------------------------------------------------------------------
  # ● 更新血槽精灵
  #--------------------------------------------------------------------------
  def update_hp_gauge
    arr = @hp_gauge_sprites.collect {|sprite| sprite.character}
    $game_srpgmap.all_battler_events.each do |event|
      @hp_gauge_sprites.push(Sprite_MapHPGauge.new(@viewport1, event)) unless
      arr.include?(event)
    end
    @hp_gauge_sprites.each {|sprite| sprite.update }
  end
  #--------------------------------------------------------------------------
  # ● 释放血槽精灵
  #--------------------------------------------------------------------------
  def dispose_hp_gauge
    @hp_gauge_sprites.each {|sprite| sprite.dispose }
  end
end[/pre]
[/fold]
[fold=※当队友在自身附近时,可通过“移动”指令与其交换位置。]
单独追加“换位”指令
[pre lang="ruby"]# SRPG插件-交换位置命令 Ver.2020.2.2
# 岚风雷(论坛ID:gqxastg)制作
#==============================================================================
# ■ 设定项目
#==============================================================================

module TMSRPG
  
  VC_EXCHANGE_COMMAND = "换位"              # 角色命令:交换位置
  VC_EXCHANGE_INDEX   = -2                 # 交换位置命令插入的位置
  VC_EXCHANGE_SKILL   = 65                 # 表示换位范围用的技能ID
  VC_EXCHANGE_SOUND   = ["Equip1"]         # 交换时播放的音效
  
  VC_EXCHANGE_SOUND   = RPG::SE.new(*VC_EXCHANGE_SOUND) # 请勿修改
  
end
#==============================================================================
# ■ Window_SrpgActorCommand
#==============================================================================

class Window_SrpgActorCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● 生成指令列表
  #--------------------------------------------------------------------------
  alias exchange_make_command_list make_command_list
  def make_command_list
    exchange_make_command_list
    if @event.actor?
      add_command(TMSRPG::VC_EXCHANGE_COMMAND, :exchange, exchange_enabled)
      @list[TMSRPG::VC_EXCHANGE_INDEX, 0] = [@list[-1]]
      @list.delete_at(-1)
    end
  end
  #--------------------------------------------------------------------------
  # ● 获取换位命令的有效状态
  #--------------------------------------------------------------------------
  def exchange_enabled
    @event.battler.inputable?
  end
  #--------------------------------------------------------------------------
  # ● 更新帮助内容
  #--------------------------------------------------------------------------
  alias exchange_update_help update_help
  def update_help
    case current_symbol
    when :exchange
      @help_window.set_text("与邻近友方交换位置")
    else
      exchange_update_help
    end
  end
end
#==============================================================================
# ■ Scene_SrpgMap
#==============================================================================

class Scene_SrpgMap < Scene_Base
  #--------------------------------------------------------------------------
  # ● 生成SRPG角色行动列表窗口
  #--------------------------------------------------------------------------
  alias exchange_create_srpg_actor_command_window create_srpg_actor_command_window
  def create_srpg_actor_command_window
    exchange_create_srpg_actor_command_window
    @srpg_actor_command_window.set_handler(:exchange, method(:on_actor_command_exchange))
  end
  #--------------------------------------------------------------------------
  # ● 角色行动命令【换位】
  #--------------------------------------------------------------------------
  def on_actor_command_exchange
    @active_event.battler.make_actions
    @active_event.battler.current_action.set_skill(TMSRPG::VC_EXCHANGE_SKILL)
    @srpg_actor_command_window.hide     # 隐藏角色命令窗口
    @srpg_action_window = Window_SrpgDummy.new
    @srpg_action_window.set_handler(:ok,     method(:on_exchange_ok))
    @srpg_action_window.set_handler(:cancel, method(:on_action_cancel))
    @srpg_action_window.help_window = @help_window
    @srpg_windows.push(@srpg_action_window)
    $game_srpgmap.put_actable_area(@active_event)
    $game_srpgmap.put_effect_area(@active_event)
    $game_srpgplayer.unlock             # 解除玩家锁定
    @help_window.set_text("选择交换对象")
  end
  #--------------------------------------------------------------------------
  # ● 换位命令【确定】
  #--------------------------------------------------------------------------
  def on_exchange_ok
    targets = $game_srpgmap.events_in_effect_area(@active_event)
    # 交换选中对象只能有一个且对象可操作
    unless $game_srpgmap.actable_area? && targets.size == 1 &&
      targets[0].battler.inputable?
      Sound.play_buzzer
      @srpg_windows[-1].activate
      return
    end
    last = targets[0].priority_type
    # 防止事件优先级影响通行判断
    targets[0].instance_variable_set(:@priority_type, 0)
    # 生成可移动范围
    $game_srpgmap.put_movable_area(@active_event)
    targets[0].instance_variable_set(:@priority_type, last)
    # 检查是否能移动到对象事件
    if !$game_srpgmap.movable_area_route(targets[0].x, targets[0].y)
      $game_srpgmap.clear_flash_data
      $game_srpgmap.put_actable_area(@active_event)
      $game_srpgmap.put_effect_area(@active_event)
      Sound.play_buzzer
      @srpg_windows[-1].activate
      return
    end
    last = @active_event.priority_type
    @active_event.instance_variable_set(:@priority_type, 0)
    $game_srpgmap.put_movable_area(targets[0])
    @active_event.instance_variable_set(:@priority_type, last)
    # 检查对象事件是否能移动过来
    if !$game_srpgmap.movable_area_route(@active_event.x, @active_event.y)
      $game_srpgmap.clear_flash_data
      $game_srpgmap.put_actable_area(@active_event)
      $game_srpgmap.put_effect_area(@active_event)
      Sound.play_buzzer
      @srpg_windows[-1].activate
      return
    end
    $game_srpgmap.clear_flash_data
    $game_srpgmap.put_actable_area(@active_event)
    $game_srpgmap.put_effect_area(@active_event)
    if $game_system.action_check
      @srpg_action_check_window = Window_SrpgChoice.new
      @srpg_action_check_window.set_handler(:yes,    method(:on_exchange_choice_ok))
      @srpg_action_check_window.set_handler(:no,     method(:on_exchange_choice_cancel))
      @srpg_action_check_window.set_handler(:cancel, method(:on_exchange_choice_cancel))
      @srpg_action_check_window.help_window = @help_window
      @srpg_windows.push(@srpg_action_check_window)
      @srpg_actor_command_window.hide
      @action_status_window.setup_target(@active_event, targets[0])
      @help_window.set_text("确认交换吗?")
      $game_srpgplayer.lock             # 锁定玩家操作
    else
      on_exchange_choice_ok
    end
  end
  #--------------------------------------------------------------------------
  # ● 换位确认【确定】
  #--------------------------------------------------------------------------
  def on_exchange_choice_ok
    targets = $game_srpgmap.events_in_effect_area(@active_event)
    @srpg_windows[-1].hide
    @action_status_window.setup_target(nil)
    @spriteset.hide_flash
    # 位置互换
    x, y = @active_event.x, @active_event.y
    @active_event.moveto(targets[0].x, targets[0].y)
    targets[0].moveto(x, y)
    TMSRPG::VC_EXCHANGE_SOUND.play
    # 设定不能撤销移动
    targets[0].set_last_pos(targets[0].x, targets[0].y, targets[0].direction)
    @active_event.set_last_pos(@active_event.x, @active_event.y, @active_event.direction)
    #
    $game_srpgmap.clear_flash_data
    @spriteset.show_flash
    dispose_all_srpg_windows
  end
  #--------------------------------------------------------------------------
  # ● 换位确认【取消】
  #--------------------------------------------------------------------------
  def on_exchange_choice_cancel
    @help_window.set_text("选择交换对象")
    dispose_active_srpg_window
    $game_srpgplayer.unlock             # 解除玩家操作
  end
end[/pre]
[/fold]
[fold=※如果能够让角色发动连携攻击时面向攻击目标,战斗会更加自然]
JPUFXI_~%5$O0{C[OI$MV0O.png
如图所示,在Scene_SrpgMap的原第400行插入
  1. event.turn_toward_character(target)
复制代码
即可

为了防止朝向改变可能影响被攻击背后等情况,可以改成这样在攻击后恢复朝向
(({L4CQ6P3JUAHGKTH]DW85.png
  1. last = event.direction
  2. event.set_direction(last)
复制代码


类似的,保护弱者发动时朝向被保护者可以这么写(因为已经改过了行数不准确,在“发动连携”下面一点)
`SYT${{__PM]IBSXAL)D.png
  1. last = substitute.direction
  2. substitute.turn_toward_character(target)
  3. substitute.set_direction(last)
复制代码

[/fold]↓最后更新时间:2/2 18:07
[fold=※如果能够做到在某状态备注栏写下<动画 X,Y>使棋子在受某状态时以Y%音量循环播放X号动画,状态效果会更加直观。]
1/28 14:53 动画位移BUG已修正
2/2 18:07 特别兼容“角色被击震动”插件

局部调整动画音量相对复杂又没有太大必要就没做【
[pre lang="ruby"]# SRPG插件-状态循环动画 Ver.2020.2.2
# 岚风雷(论坛ID:gqxastg)制作
#==============================================================================
# ■ 设定项目
#==============================================================================

module TMSRPG
  
  # 注意:如果使用了VXAce_SP1,请将本插件尽量紧跟着置于其下
  LOOP_ANIME = {
    REGEXP:    /<动画\s*(\d+)\s*>/,
    # 匹配状态循环动画的正则表达式
    # 默认为 <动画 动画ID>
    # 状态循环动画与状态显示优先级有关
    # 当同时拥有多个包含循环动画的状态时
    # 将选择其中显示优先级最高的状态
    TILE:      true,
    # 是否包括地形效果附加的状态
    # 不推荐启用,系统自身写法原因,地形效果不能及时刷新
    # 显示优先级与普通状态相同的时候优先显示普通状态
    HIT_SHAKE: 1,
    # 特别兼容“角色被击震动”插件的模式
    # false为不启用
    # 1为只角色位移,动画不位移
    # 2为角色与动画同时位移
    # 另请将“角色被击震动”插件置于本插件之下
  }
  
end
#==============================================================================
# ■ RPG::BaseItem
#==============================================================================

class RPG::BaseItem
  #--------------------------------------------------------------------------
  # ○ 获取循环动画
  #--------------------------------------------------------------------------
  def loop_anime
    TMSRPG::LOOP_ANIME[:REGEXP] =~ note ? $1.to_i : nil
  end
end
#==============================================================================
# ■ Game_BattlerBase
#==============================================================================

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ○ 获取循环动画
  #--------------------------------------------------------------------------
  def loop_anime
    arr = states.collect {|state| state.loop_anime ?
    [state.loop_anime, state.priority] : nil}.compact
    if TMSRPG::LOOP_ANIME[:TILE] && tile_state_object &&
      tile_state_object.loop_anime
      arr.unshift([tile_state_object.loop_anime, 0]) if
      (arr.empty? || tile_state_object.priority > arr[0][1])
    end
    return arr.empty? ? nil : arr[0][0]
  end
end
#==============================================================================
# ■ Sprite_Base
#==============================================================================

class Sprite_Base < Sprite
  #--------------------------------------------------------------------------
  # ● 判定是否显示动画中
  #--------------------------------------------------------------------------
  alias loopanime_animation? animation?
  def animation?
    (!@loop || @old_testani) && loopanime_animation?
  end
  #--------------------------------------------------------------------------
  # ● 更新动画
  #--------------------------------------------------------------------------
  alias loopanime_update_animation update_animation
  def update_animation
    @old_testani = true
    loopanime_update_animation
    @old_testani = false
  end
  #--------------------------------------------------------------------------
  # ● 开始动画
  #--------------------------------------------------------------------------
  alias loopanime_start_animation start_animation
  def start_animation(animation, mirror = false, loop = false)
    @loop = loop
    loopanime_start_animation(animation, mirror)
  end
  #--------------------------------------------------------------------------
  # ● 结束动画
  #--------------------------------------------------------------------------
  alias loopanime_end_animation end_animation
  def end_animation
    if @loop
      @ani_duration = @animation.frame_max * @ani_rate + 1
      return update_animation
    end
    loopanime_end_animation
  end
end
#==============================================================================
# ■ Sprite_Character
#==============================================================================

class Sprite_Character < Sprite_Base
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  alias vxace_sp1_initialize initialize
  def initialize(viewport, character = nil)
    vxace_sp1_initialize(viewport, character)
    # 以下摘自 VXAce_SP1
    if !defined?(move_animation)
      alias vxace_sp1_update_position update_position
      #------------------------------------------------------------------------
      # ● 移动动画
      #------------------------------------------------------------------------
      def move_animation(dx, dy)
        if @animation && @animation.position != 3
          @ani_ox += dx
          @ani_oy += dy
          @ani_sprites.each do |sprite|
            sprite.x += dx
            sprite.y += dy
          end
        end
      end
    end
  end
  #------------------------------------------------------------------------
  # ● 更新位置
  #------------------------------------------------------------------------
  def update_position
    vxace_sp1_update_position
    move_animation(self.x - @last_pos[0], self.y - @last_pos[1])
  end
  #--------------------------------------------------------------------------
  # ● 更新动画
  #--------------------------------------------------------------------------
  def update_animation
    @last_pos = [self.x, self.y]
    if TMSRPG::LOOP_ANIME[:HIT_SHAKE] == 1
      @last_pos[0] -= pos_offset[0].round
      @last_pos[1] -= pos_offset[1].round
    end
    super
    if TMSRPG::LOOP_ANIME[:HIT_SHAKE] == 2
      @last_pos[0] -= pos_offset[0].round
      @last_pos[1] -= pos_offset[1].round
    end
  end
  #--------------------------------------------------------------------------
  # ● 设置新的效果
  #--------------------------------------------------------------------------
  alias loopanime_setup_new_effect setup_new_effect
  def setup_new_effect
    if SceneManager.scene_is?(Scene_SrpgMap)
      battler = @character.instance_variable_get(:@battler)
      if battler && battler.loop_anime
        if @character.animation_id > 0 && @loop
          @loop = false
          end_animation
        else
          if !@animation
            animation = $data_animations[battler.loop_anime]
            start_animation(animation, false, true)
          end
        end
      elsif @loop
        @loop = false
        end_animation
      end
    end
    loopanime_setup_new_effect
  end
  #--------------------------------------------------------------------------
  # ● 结束动画 # Overwrite
  #--------------------------------------------------------------------------
  def end_animation
    @character.animation_id = 0 if !SceneManager.scene_is?(Scene_SrpgMap) ||
    (!@loop && $data_animations[@character.animation_id] == @animation)
    super
  end
end
#==============================================================================
# ■ Sprite_SrpgCharacter
#==============================================================================

class Sprite_SrpgCharacter < Sprite_Base
  #--------------------------------------------------------------------------
  # ● 更新动画
  #--------------------------------------------------------------------------
  def update_animation
    @last_pos = [self.x, self.y]
    if TMSRPG::LOOP_ANIME[:HIT_SHAKE] == 1
      @last_pos[0] -= pos_offset[0].round
      @last_pos[1] -= pos_offset[1].round
    end
    super
    if TMSRPG::LOOP_ANIME[:HIT_SHAKE] == 2
      @last_pos[0] -= pos_offset[0].round
      @last_pos[1] -= pos_offset[1].round
    end
  end
  #--------------------------------------------------------------------------
  # ● 设置新的效果
  #--------------------------------------------------------------------------
  alias loopanime_setup_new_effect setup_new_effect
  def setup_new_effect
    battler = @character.instance_variable_get(:@battler)
    if battler && battler.loop_anime
      if @character.animation_id > 0 && @loop
        @loop = false
        end_animation
      else
        if !@animation
          animation = $data_animations[battler.loop_anime]
          start_animation(animation, false, true)
        end
      end
    elsif @loop
      @loop = false
      end_animation
    end
    loopanime_setup_new_effect
  end
  #--------------------------------------------------------------------------
  # ● 结束动画 # Overwrite
  #--------------------------------------------------------------------------
  def end_animation
    @character.animation_id = 0 if
    !@loop && $data_animations[@character.animation_id] == @animation
    super
  end
  # 以下摘自 VXAce_SP1
  #--------------------------------------------------------------------------
  # ● 更新位置
  #--------------------------------------------------------------------------
  alias vxace_sp1_update_position update_position
  def update_position
    vxace_sp1_update_position
    move_animation(self.x - @last_pos[0], self.y - @last_pos[1])
  end
  #--------------------------------------------------------------------------
  # ● 移动动画
  #--------------------------------------------------------------------------
  def move_animation(dx, dy)
    if @animation && @animation.position != 3
      @ani_ox += dx
      @ani_oy += dy
      @ani_sprites.each do |sprite|
        sprite.x += dx
        sprite.y += dy
      end
    end
  end
end[/pre]
[/fold]↓最后更新时间:4/1 0:10
[fold=※在指定地点生成NPC/敌人/<物品>的技能。]
[pre lang="ruby"]# SRPG插件-生成事件 Ver.2020.4.1
# 岚风雷(论坛ID:gqxastg)制作
#==============================================================================
# 使用方法
#------------------------------------------------------------------------------
# 在事件脚本中调用create_event(map_id, event_id, target_id, x, y)
# map_id    : 读取事件的地图ID
# event_id  : 读取的事件ID
# target_id : 生成到的地图事件ID
# x, y      : 放置到的x坐标, 放置到的y坐标
# reset_swi : 是否重置生成事件的全部独立开关(true重置,false不重置,不填默认重置)
#==============================================================================
class Game_SrpgInterpreter
  
  #--------------------------------------------------------------------------
  # ● 从其他地图读取事件生成
  #--------------------------------------------------------------------------
  def create_event(map_id, event_id, target_id, x, y, reset_swi = true)
    map = load_data(sprintf("Data/Map%03d.rvdata2", map_id))
    event = map.events[event_id]
    # 读取事件ID匹配生成事件ID
    event.id = target_id
    # 新建事件需地图上无对应target_id的事件 否则会覆盖
    $game_srpgmap.events[target_id] = Game_SrpgEvent.new(@map_id, event)
    $game_srpgmap.events[target_id].moveto(x, y)
   
    # 重置独立开关
    if reset_swi
      ("A".."D").each {|c|
      $game_self_switches[[@map_id, target_id, c]] = false }
    elsif TMSRPG::AUTO_D_RESET
      key = [@map_id, target_id, "D"]
      $game_self_switches[key] = false
    end

    # 添加新增加事件人物的精灵
    SceneManager.scene.instance_eval do
      @spriteset.instance_eval do
        return if @character_sprites.find {|sprite| sprite.character ==
        $game_srpgmap.events[target_id]}
        @character_sprites.push(Sprite_SrpgCharacter.new(@viewport1,
        $game_srpgmap.events[target_id]))
      end
    end

#~     # 重新创建所有地图人物的精灵
#~     SceneManager.scene.instance_eval{
#~     @spriteset.dispose_characters
#~     @spriteset.create_characters
#~     }
  end
end[/pre]
[/fold]↓最后更新时间:1/30 20:24
[fold=※在角色、职业、武器、防具、敌人、状态的备注栏写下<图标 X>,使符合条件的单位左下角显示对应编号的ICON。]
该脚本为角色脸图位置显示图标,地图行走图上显示图标已集成到血条脚本
[pre lang="ruby"]# SRPG插件-自定义角色脸图位置图标 Ver.2020.1.30
# 岚风雷(论坛ID:gqxastg)制作
#==============================================================================
# ■ 设定项目
#==============================================================================

module TMSRPG
  
  CUSTOM_ICON = {
    REGEXP: /<图标\s*(\d+)\s*\,\s*(\-*\d+)\s*\,\s*(\d+)\s*\>/,
    # 匹配自定义图标的正则表达式
    # 默认为 <图标 图标ID, 显示优先度, 显示位置>
    # 显示优先度可以为负数,同一显示位置有多个自定义图标时将显示优先度最高的
    # 优先度大于等于0时将覆盖对应显示位置的默认图标(如水上移动、击破对象)
    # 否则会显示默认图标
    # 显示位置可以为1和2
    # 1为显示在角色脸图左上角Y坐标+24处(显示水上移动、浮游的位置)
    # 2为显示在角色脸图左上角Y坐标+48处(显示击破对象、护卫对象的位置)
    # 同一个备注可以通过不同行写入追加多个图标
  }
  
end
#==============================================================================
# ■ RPG::BaseItem
#==============================================================================

class RPG::BaseItem
  #--------------------------------------------------------------------------
  # ○ 获取自定义图标
  #--------------------------------------------------------------------------
  def custom_icons
    icons = []
    note.each_line do |line|
      case line
      when TMSRPG::CUSTOM_ICON[:REGEXP]
        icons.push([$1.to_i, $2.to_i, $3.to_i])
      end
    end
    return icons.empty? ? nil : icons
  end
end
#==============================================================================
# ■ Game_BattlerBase
#==============================================================================

class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ○ 获取自定义图标
  #--------------------------------------------------------------------------
  def custom_icons
    arr = feature_objects.collect {|object| object.custom_icons}.compact.
    flatten.each_slice(3).to_a
    return nil if arr.empty?
    return arr.sort {|a, b| b[1] <=> a[1]}.group_by {|a| a[2]}
  end
end
#==============================================================================
# ■ Window_Base
#==============================================================================

class Window_Base < Window
  #--------------------------------------------------------------------------
  # ○ 绘制SRPG角色脸图上的图标(ICON)
  #--------------------------------------------------------------------------
  alias customicons_draw_srpg_face_icon draw_srpg_face_icon
  def draw_srpg_face_icon(battler, x, y)
    arr = battler.custom_icons
    if arr
      if arr[1]
        if arr[1][0][1] >= 0
          draw_icon(arr[1][0][0], x, y + 24)
        else
          if battler.float?;   draw_icon(TMSRPG::ICON_FLOAT, x, y + 24)
          elsif battler.ship?; draw_icon(TMSRPG::ICON_SHIP, x, y + 24)
          else;                draw_icon(arr[1][0][0], x, y + 24)
          end
        end
      else
        if battler.float?
          draw_icon(TMSRPG::ICON_FLOAT, x, y + 24)
        elsif battler.ship?
          draw_icon(TMSRPG::ICON_SHIP, x, y + 24)
        end
      end
      #----------------------------------------------------------------------
      if arr[2]
        if arr[2][0][1] >= 0
          draw_icon(arr[2][0][0], x, y + 48)
        else
          if battler.boss?;        draw_icon(TMSRPG::ICON_BOSS, x, y + 48)
          elsif battler.princess?; draw_icon(TMSRPG::ICON_PRINCESS, x, y + 48)
          else;                    draw_icon(arr[2][0][0], x, y + 48)
          end
        end
      else
        draw_icon(TMSRPG::ICON_BOSS, x, y + 48) if battler.boss?
        draw_icon(TMSRPG::ICON_PRINCESS, x, y + 48) if battler.princess?
      end
    else
      customicons_draw_srpg_face_icon(battler, x, y)
    end
  end
end[/pre]
[/fold]
写的一些其他插件
[fold=变更角色朝向命令]
[pre lang="ruby"]# SRPG插件-变更角色朝向命令 Ver.2020.1.30
# 岚风雷(论坛ID:gqxastg)制作
#==============================================================================
# ■ 设定项目
#==============================================================================

module TMSRPG
  
  VC_DIRECTION_COMMAND = "朝向"         # 角色命令:变更朝向
  VC_DIRECTION_INDEX   = -2             # 变更朝向命令插入的位置
  
end
#==============================================================================
# ■ Window_SrpgActorCommand
#==============================================================================

class Window_SrpgActorCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● 生成指令列表
  #--------------------------------------------------------------------------
  alias changedir_make_command_list make_command_list
  def make_command_list
    changedir_make_command_list
    if @event.actor?
      add_command(TMSRPG::VC_DIRECTION_COMMAND, :direction, direction_enabled)
      @list[TMSRPG::VC_DIRECTION_INDEX, 0] = [@list[-1]]
      @list.delete_at(-1)
    end
  end
  #--------------------------------------------------------------------------
  # ● 获取朝向命令的有效状态
  #--------------------------------------------------------------------------
  def direction_enabled
    @event.battler.inputable?
  end
  #--------------------------------------------------------------------------
  # ● 更新帮助内容
  #--------------------------------------------------------------------------
  alias changedir_update_help update_help
  def update_help
    case current_symbol
    when :direction
      @help_window.set_text("变更角色朝向")
    else
      changedir_update_help
    end
  end
end
#==============================================================================
# ■ Scene_SrpgMap
#==============================================================================

class Scene_SrpgMap < Scene_Base
  #--------------------------------------------------------------------------
  # ● 生成SRPG角色行动列表窗口
  #--------------------------------------------------------------------------
  alias changedir_create_srpg_actor_command_window create_srpg_actor_command_window
  def create_srpg_actor_command_window
    changedir_create_srpg_actor_command_window
    @srpg_actor_command_window.set_handler(:direction, method(:on_actor_command_direction))
  end
  #--------------------------------------------------------------------------
  # ● 角色行动命令【朝向】
  #--------------------------------------------------------------------------
  def on_actor_command_direction
    @srpg_actor_command_window.hide     # 隐藏角色命令窗口
    @srpg_direction_window = Window_SrpgDummy.new
    @srpg_direction_window.help_window = @help_window
    @srpg_windows.push(@srpg_direction_window)
    @help_window.set_text("按方向键变更朝向")
    last = @active_event.direction
    loop do
      update
      if Input.trigger?(:C)
        Sound.play_ok
        break
      elsif Input.trigger?(:B)
        Sound.play_cancel
        @active_event.set_direction(last)
        break
      elsif Input.trigger?(:DOWN)
        @active_event.set_direction(2)
      elsif Input.trigger?(:LEFT)
        @active_event.set_direction(4)
      elsif Input.trigger?(:RIGHT)
        @active_event.set_direction(6)
      elsif Input.trigger?(:UP)
        @active_event.set_direction(8)
      end
    end
    dispose_active_srpg_window
  end
end[/pre]
[/fold]↓最后更新时间:2022/11/26[fold=物品类敌人功能拓展]
[pre lang="ruby"]# SRPG插件-物品类敌人功能拓展 Ver.2022.11.26
# 岚风雷(论坛ID:gqxastg)制作
#==============================================================================
# 补充说明
#------------------------------------------------------------------------------
# 可以对任何敌人备注<中立>
# 中立单位双方无法穿过,可以被双方效果范围内的任何技能影响,不会被敌方主动攻击
#==============================================================================
# ■ 设定项目
#==============================================================================

module TMSRPG
  
  OBJECT_ENEMY = {
    # 默认物品类敌人样式
    # 备注<物品>不带参数则使用默认值
    # 备注<物品 样式ID>使用指定样式
    DEFAULT: :default,
    TYPE: {
      :default => {
        show_name:      true,
        show_hp:        false,
        show_mp:        false,
        show_tp:        false,
        show_face:      false,
        show_srpg_icon: false,
        show_icon:      false,
        show_gold:      true,
        show_exp:       true,
        show_level:     false,
        show_item:      true,
        # 是否显示能力值
        show_param:     false,
        # 是否显示(属性、状态)有效度
        show_rate:      false,
        # 是否显示在角色一览的窗口中
        show_in_list:   true,
        # 是否可以查看其状态
        can_see_status: true,
        # 是否可被设定为行动目标
        selectable:     true,
      },
      :button => {
        show_name:      true,
        show_hp:        false,
        show_mp:        false,
        show_tp:        false,
        show_face:      false,
        show_srpg_icon: false,
        show_icon:      false,
        show_gold:      false,
        show_exp:       false,
        show_level:     false,
        show_item:      false,
        show_param:     false,
        show_rate:      false,
        show_in_list:   true,
        can_see_status: false,
        selectable:     false,
      },
      :obstacle => {
        show_name:      true,
        show_hp:        true,
        show_mp:        false,
        show_tp:        false,
        show_face:      false,
        show_srpg_icon: false,
        show_icon:      false,
        show_gold:      false,
        show_exp:       false,
        show_level:     false,
        show_item:      false,
        show_param:     false,
        show_rate:      true,
        show_in_list:   true,
        can_see_status: true,
        selectable:     true,
      }
    },
  }
  
end
#==============================================================================
# ■ Game_Enemy
#==============================================================================

class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ○ 获取行走图名称 # Overwrite
  #--------------------------------------------------------------------------
  def character_name
    /<行走图\s*(\S+?)\s*\,\s*(\d+)>/ =~ enemy.note ? $1 : nil
  end
  #--------------------------------------------------------------------------
  # ○ 获取行走图索引编号 # Overwrite
  #--------------------------------------------------------------------------
  def character_index
    /<行走图\s*(\S+?)\s*\,\s*(\d+)>/ =~ enemy.note ? $2.to_i : nil
  end
  #--------------------------------------------------------------------------
  # ○ 获取是否为物品 # Overwrite
  #--------------------------------------------------------------------------
  def object?
    /<物品\s*(\S+?)\s*>/ =~ enemy.note ? eval($1) :
    (/<物品>/ =~ enemy.note ? TMSRPG::OBJECT_ENEMY[:DEFAULT] : false)
  end
  #--------------------------------------------------------------------------
  # ○ 获取是否为中立单位
  #--------------------------------------------------------------------------
  def neutral?
    /<中立>/ =~ enemy.note ? true : false
  end
end
#==============================================================================
# ■ Game_SrpgEvent
#==============================================================================

class Game_SrpgEvent < Game_SrpgCharacter
  #--------------------------------------------------------------------------
  # ● 获取是否为中立单位
  #--------------------------------------------------------------------------
  def neutral?
    battler? && battler.neutral?
  end
  #--------------------------------------------------------------------------
  # ● 获取事件是否为友军
  #--------------------------------------------------------------------------
  alias objectenemy_ev_friend? friend?
  def friend?(target)
    return $game_srpgmap.neutral_force_friend if target.neutral?
    objectenemy_ev_friend?(target)
  end
  #--------------------------------------------------------------------------
  # ● 获取敌对事件的数组
  #--------------------------------------------------------------------------
  alias objectenemy_opponent_events opponent_events
  def opponent_events
    result = objectenemy_opponent_events
    if [:both, nil].include?($game_srpgmap.neutral_force_friend)
      a = $game_srpgmap.all_battler_events.select {|event| event.neutral? }
      $game_srpgmap.neutral_force_friend ? (result |= a) : (result -= a)
    end
    result
  end
  #--------------------------------------------------------------------------
  # ● 获取友方事件的数组
  #--------------------------------------------------------------------------
  alias objectenemy_friend_events friend_events
  def friend_events
    result = objectenemy_friend_events
    result
  end
  #--------------------------------------------------------------------------
  # ● 决定实行行动的坐标
  #--------------------------------------------------------------------------
  alias objectenemy_make_action_pos make_action_pos
  def make_action_pos
    item = battler.current_action.item
    $game_srpgmap.neutral_force_friend = !item.for_friend?
    result = objectenemy_make_action_pos
    $game_srpgmap.neutral_force_friend = nil
    result
  end
  #--------------------------------------------------------------------------
  # ● 更改图像
  #--------------------------------------------------------------------------
  alias objectenemy_set_graphic set_graphic
  def set_graphic(character_name, character_index)
    return unless character_name && character_index
    objectenemy_set_graphic(character_name, character_index)
  end
end
#==============================================================================
# ■ Game_SrpgActorEvent
#==============================================================================

class Game_SrpgActorEvent < Game_SrpgEvent
  #--------------------------------------------------------------------------
  # ● 获取是否为中立单位
  #--------------------------------------------------------------------------
  def neutral?
    false
  end
  #--------------------------------------------------------------------------
  # ● 获取事件是否为友军
  #--------------------------------------------------------------------------
  alias objectenemy_ac_friend? friend?
  def friend?(target)
    return $game_srpgmap.neutral_force_friend if target.neutral?
    objectenemy_ac_friend?(target)
  end
end
#==============================================================================
# ■ Game_SrpgMap
#==============================================================================

class Game_SrpgMap
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_accessor :neutral_force_friend
  #--------------------------------------------------------------------------
  # ● 获取存在于效果范围内的SRPG事件的数组
  #--------------------------------------------------------------------------
  alias objectenemy_events_in_effect_area events_in_effect_area
  def events_in_effect_area(event)
    item = event.battler.current_action.item
    @neutral_force_friend = item.for_friend?
   
    result = objectenemy_events_in_effect_area(event)
   
    @neutral_force_friend = nil
   
    result.reject! {|event| event.object? &&
    !TMSRPG::OBJECT_ENEMY[:TYPE][event.battler.object?][:selectable]}
    result
  end
  #--------------------------------------------------------------------------
  # ● 设置用来计算可移动范围的通行判定表
  #--------------------------------------------------------------------------
  alias objectenemy_setup_passable_table setup_passable_table
  def setup_passable_table(event, mov)
    #@neutral_force_friend = nil
    result = objectenemy_setup_passable_table(event, mov)
    #@neutral_force_friend = nil
    result
  end
end
#==============================================================================
# ■ Window_SrpgActorCommand
#==============================================================================

class Window_SrpgActorCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● 获取状态命令的有效状态
  #--------------------------------------------------------------------------
  alias objectenemy_status_enabled status_enabled
  def status_enabled
    if @event.object? &&
      !TMSRPG::OBJECT_ENEMY[:TYPE][@event.battler.object?][:can_see_status]
      return false
    else
      return objectenemy_status_enabled
    end
  end
end
#==============================================================================
# ■ Window_SrpgBattlerList
#==============================================================================

class Window_SrpgBattlerList < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 查询此角色是否可用
  #--------------------------------------------------------------------------
  alias objectenemy_enable? enable?
  def enable?(item)
    if item.object? &&
      !TMSRPG::OBJECT_ENEMY[:TYPE][item.battler.object?][:can_see_status]
      return false
    else
      return objectenemy_enable?(item)
    end
  end
  #--------------------------------------------------------------------------
  # ● 生成角色列表
  #--------------------------------------------------------------------------
  alias objectenemy_make_item_list make_item_list
  def make_item_list
    objectenemy_make_item_list
    @data.reject! {|event| event.object? &&
    !TMSRPG::OBJECT_ENEMY[:TYPE][event.battler.object?][:show_in_list]}
  end
end
#==============================================================================
# ■ Window_SrpgActionStatus
#==============================================================================

class Window_SrpgActionStatus < Window_Base
  #--------------------------------------------------------------------------
  # ● 绘制战斗者A(左侧)
  #--------------------------------------------------------------------------
  alias objectenemy_draw_battler_a draw_battler_a
  def draw_battler_a(battler)
    if battler.enemy? && battler.object?
      data = TMSRPG::OBJECT_ENEMY[:TYPE][battler.object?]
      y = line_height * 4
      if data[:show_mp]
        draw_actor_mp(battler, 96, y, 124)
        y -= line_height
      end
      if data[:show_hp]
        draw_actor_hp(battler, 96, y, 124)
        y -= line_height
      end
      draw_actor_icons(battler, 96, y, 124) if data[:show_icon]
      draw_face(battler.face_name, battler.face_index, 0, line_height * 1) if
      data[:show_face]
      draw_srpg_face_icon(battler, 0, line_height * 1) if data[:show_srpg_icon]
      draw_actor_tp(battler, 2, line_height * 4, 92) if data[:show_tp]
      y = (data[:show_srpg_icon] || data[:show_face]) ? line_height * 1 :
      (data[:show_tp] ? line_height * 3 : line_height * 4)
      if data[:show_name]
        draw_actor_name(battler, 0, y, 96)
        y -= line_height
      end
      draw_tile_state(battler, 2, y, 220)
    else
      objectenemy_draw_battler_a(battler)
    end
  end
  #--------------------------------------------------------------------------
  # ● 绘制战斗者A(右侧)
  #--------------------------------------------------------------------------
  alias objectenemy_draw_battler_b draw_battler_b
  def draw_battler_b(battler)
    if battler.enemy? && battler.object?
      data = TMSRPG::OBJECT_ENEMY[:TYPE][battler.object?]
      x = contents.width - 96
      y = line_height * 4
      if data[:show_mp]
        draw_actor_mp(battler, x - 124, y, 124)
        y -= line_height
      end
      if data[:show_hp]
        draw_actor_hp(battler, x - 124, y, 124)
        y -= line_height
      end
      draw_actor_icons(battler, x - 124, y, 124) if data[:show_icon]
      draw_face(battler.face_name, battler.face_index, x, line_height * 1) if
      data[:show_face]
      draw_srpg_face_icon(battler, x, line_height * 1) if data[:show_srpg_icon]
      draw_actor_tp(battler, x + 2, line_height * 4, 92) if data[:show_tp]
      y = (data[:show_srpg_icon] || data[:show_face]) ? line_height * 1 :
      (data[:show_tp] ? line_height * 3 : line_height * 4)
      if data[:show_name]
        draw_actor_name(battler, x, y, 96)
        y -= line_height
      end
      draw_tile_state(battler, x - 124, y, 220)
    else
      objectenemy_draw_battler_b(battler)
    end
  end
end
#==============================================================================
# ■ Window_SrpgStatus
#==============================================================================

class Window_SrpgStatus < Window_Status
  #--------------------------------------------------------------------------
  # ● 绘制能力值
  #--------------------------------------------------------------------------
  def draw_parameters(x, y)
    return if @actor.enemy? && @actor.object? &&
    !TMSRPG::OBJECT_ENEMY[:TYPE][@actor.object?][:show_param]
    super
  end
  #--------------------------------------------------------------------------
  # ○ 绘制能力值(第二页)
  #--------------------------------------------------------------------------
  def draw_parameters_ex(x, y)
    return if @actor.enemy? && @actor.object? &&
    !TMSRPG::OBJECT_ENEMY[:TYPE][@actor.object?][:show_param]
    super
  end
  #--------------------------------------------------------------------------
  # ○ 绘制属性有效度
  #--------------------------------------------------------------------------
  def draw_element_rate(x, y)
    return if @actor.enemy? && @actor.object? &&
    !TMSRPG::OBJECT_ENEMY[:TYPE][@actor.object?][:show_rate]
    super
  end
  #--------------------------------------------------------------------------
  # ○ 绘制状态有效度
  #--------------------------------------------------------------------------
  def draw_state_rate(x, y)
    return if @actor.enemy? && @actor.object? &&
    !TMSRPG::OBJECT_ENEMY[:TYPE][@actor.object?][:show_rate]
    super
  end
  #--------------------------------------------------------------------------
  # ● 绘制区域 2
  #--------------------------------------------------------------------------
  alias objectenemy_draw_block2 draw_block2
  def draw_block2(y)
    if @actor.enemy? && @actor.object?
      data = TMSRPG::OBJECT_ENEMY[:TYPE][@actor.object?]
      draw_actor_face(@actor, 8, y) if data[:show_face]
      draw_srpg_face_icon(@actor, 8, y) if data[:show_srpg_icon]
      draw_actor_tp(@actor, 10, y + line_height * 3, 92) if data[:show_tp]
      draw_basic_info(136, y)
      draw_exp_info(304, y)
    else
      objectenemy_draw_block2(y)
    end
  end
  #--------------------------------------------------------------------------
  # ● 绘制基本信息
  #--------------------------------------------------------------------------
  def draw_basic_info(x, y)
    if @actor.enemy? && @actor.object?
      data = TMSRPG::OBJECT_ENEMY[:TYPE][@actor.object?]
      draw_actor_level(@actor, x, y + line_height * 0) if data[:show_level]
      draw_actor_icons(@actor, x, y + line_height * 1) if data[:show_icon]
      y2 = line_height * 3
      if data[:show_mp]
        draw_actor_mp(@actor, x, y + y2)
        y2 -= line_height
      end
      draw_actor_hp(@actor, x, y + y2) if data[:show_hp]
    else
      super
    end
  end
  #--------------------------------------------------------------------------
  # ● 绘制经验值信息
  #--------------------------------------------------------------------------
  alias objectenemy_draw_exp_info draw_exp_info
  def draw_exp_info(x, y)
    if @actor.enemy? && @actor.object?
      if TMSRPG::OBJECT_ENEMY[:TYPE][@actor.object?][:show_exp]
        change_color(system_color)
        draw_text(x, y + line_height * 0, 180, line_height, "经验值")
        change_color(normal_color)
        draw_text(x, y + line_height * 0, 180, line_height, @actor.enemy.exp, 2)
      end
      draw_drop_info(x, y + line_height * 1) if
      TMSRPG::OBJECT_ENEMY[:TYPE][@actor.object?][:show_item]
    else
      objectenemy_draw_exp_info(x, y)
    end
  end
  #--------------------------------------------------------------------------
  # ● 绘制掉落物信息 # Overwrite
  #--------------------------------------------------------------------------
  def draw_drop_info(x, y)
    @actor.enemy.drop_items.each_with_index do |drop_item, i|
      break if i > 2 # 防止通过其它手段使掉落物多于三个导致绘制出界
      case drop_item.kind
      when 1; item = $data_items[drop_item.data_id]
      when 2; item = $data_weapons[drop_item.data_id]
      when 3; item = $data_armors[drop_item.data_id]
      end
      next unless item
      if @mode == 0
        if @actor.drop_hide?
          draw_icon(TMSRPG::ICON_DROP_HIDE, x, y + line_height * i)
          draw_text(x + 24, y + line_height * i, 172, line_height, "?" * item.name.size)
        else
          draw_item_name(item, x, y + line_height * i)
        end
      else
        draw_text(x, y + line_height * i, 180, line_height,
          sprintf("%.1f%%", 1.0 / drop_item.denominator * 100), 2)
        draw_icon(@actor.drop_hide? ? TMSRPG::ICON_DROP_HIDE : item.icon_index,
          x, y + line_height * i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 绘制装备、金钱
  #--------------------------------------------------------------------------
  alias objectenemy_draw_equipments draw_equipments
  def draw_equipments(x, y)
    if @actor.enemy? && @actor.object? &&
      !TMSRPG::OBJECT_ENEMY[:TYPE][@actor.object?][:show_gold]
      super
    else
      objectenemy_draw_equipments(x, y)
    end
  end
end
[/pre]
[/fold]
[fold=自定义系统设置]
[pre lang="ruby"]# SRPG插件-自定义系统设置 Ver.2020.2.1
# 岚风雷(论坛ID:gqxastg)制作
#==============================================================================
# ■ 设定项目
#==============================================================================

module TMSRPG
  
  CUSTOM_OPTION = {}
  CUSTOM_OPTION[0] = {
    enable: "!@level",
    text:   ['"光标速度设定"',
    '$game_system.player_auto_dash ? "常时高速" : "按住A(键盘SHIFT)高速"'],
    input:  "$game_system.player_auto_dash ^= true; true",
    help:   '"对光标是常时高速还是按住A(键盘SHIFT)高速进行设定"',
    ok:     "call_handler(:ok)",
  }
  CUSTOM_OPTION[1] = {
    enable: "!@level",
    text:   ['"游戏进行速度设定"',
    '$game_system.turn_auto_dash ? "常时高速" : "按住A(键盘SHIFT)高速"'],
    input:  "$game_system.turn_auto_dash ^= true; true",
    help:   '"对战斗是常时高速还是按住A(键盘SHIFT)高速进行设定"',
    ok:     "call_handler(:ok)",
  }
  CUSTOM_OPTION[2] = {
    enable: "!@level",
    text:   ['"行动实行前的确认"',
    '$game_system.action_check ? "每次都确认" : "始终省略"'],
    input:  "$game_system.action_check ^= true; true",
    help:   '"对选择目标后是否再次进行确认进行设定"',
    ok:     "call_handler(:ok)",
  }
  CUSTOM_OPTION[3] = {
    enable: "!@level",
    text:   ['"BGM音量"',
    'sprintf("%d%%", $game_system.bgm_volume)'],
    input:  "
      $game_system.bgm_volume += Input.repeat?(:LEFT) ? -10 : 10
      $game_system.bgm_volume = 100 if $game_system.bgm_volume < 0
      $game_system.bgm_volume = 0   if $game_system.bgm_volume > 100
      RPG::BGM.last.replay
      true
    ",
    help:   '"对音乐的音量进行设定"',
    ok:     "call_handler(:ok)",
  }
  CUSTOM_OPTION[4] = {
    enable: "!@level",
    text:   ['"SE音量"',
    'sprintf("%d%%", $game_system.se_volume)'],
    input:  "
      $game_system.se_volume += Input.repeat?(:LEFT) ? -10 : 10
      $game_system.se_volume = 100 if $game_system.se_volume < 0
      $game_system.se_volume = 0   if $game_system.se_volume > 100
      RPG::BGS.last.replay
      true
    ",
    help:   '"对效果音的音量进行设定"',
    ok:     "call_handler(:ok)",
  }
  CUSTOM_OPTION[5] = {
    enable: "!@level",
    text:   ['"血条设置"',
    ""],
    input: nil,
    help:   '"对血条进行设定"',
    ok:     "
    @level = :gauge
    refresh
    select(0)
    activate
    ",
  }
  CUSTOM_OPTION[106] = {
    enable: "@level == :gauge",
    text:   ['"友方血条颜色"',
    '["蓝色", "绿色"][$game_variables[15]]'],
    input:  "
      $game_variables[15] =
      [[($game_variables[15] + (Input.repeat?(:LEFT) ? -1 : 1)), 0].max, 1].min
    ",
    help:   '"对友方血条颜色进行设定"',
    ok:     "call_cancel_handler",
  }
  
  CUSTOM_OPTION_CANCEL = '
  case @level
  when nil
    call_handler(:cancel)
  when :gauge
    @level = nil
    refresh
    select_key(5)
    activate
  else
    @level = nil
    refresh
    select(0)
    activate
  end
  '
  
end
#==============================================================================
# ■ Window_SrpgOption
#==============================================================================

class Window_SrpgOption < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #-------------------------------------------------------------------------
  alias customoption_initialize initialize
  def initialize(x, y)
    customoption_initialize(x, y)
    set_handler(:ok_inner, method(:ok_inner))
    set_handler(:cancel_inner, method(:cancel_inner))
  end
  #--------------------------------------------------------------------------
  # ● 刷新 # Overwrite
  #--------------------------------------------------------------------------
  def refresh
    make_item_list
    return if item_max == 0
    self.height = fitting_height(item_max)
    create_contents
    draw_all_items
  end
  #--------------------------------------------------------------------------
  # ● 生成项目列表
  #--------------------------------------------------------------------------
  def make_item_list
    @data = TMSRPG::CUSTOM_OPTION.keys.select {|key|
    eval(TMSRPG::CUSTOM_OPTION[key][:enable].to_s)}
  end
  #--------------------------------------------------------------------------
  # ● 获取项目参数
  #--------------------------------------------------------------------------
  def item(index); TMSRPG::CUSTOM_OPTION[@data[index]]; end
  #--------------------------------------------------------------------------
  # ● 获取项目数 # Overwrite
  #--------------------------------------------------------------------------
  def item_max; @data ? @data.size : 0; end
  #--------------------------------------------------------------------------
  # ● 绘制项目 # Overwrite
  #--------------------------------------------------------------------------
  def draw_item(index)
    rect = item_rect_for_text(index)
    draw_text(rect, eval(item(index)[:text][0]))
    draw_text(rect, eval(item(index)[:text][1]), 2)
  end
  #--------------------------------------------------------------------------
  # ● 更新画面 # Overwrite
  #--------------------------------------------------------------------------
  def update
    super
    if Input.repeat?(:LEFT) || Input.repeat?(:RIGHT)
      if eval(item(index)[:input].to_s)
        Sound.play_cursor
        redraw_item(index)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 更新帮助内容 # Overwrite
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(eval(item(index)[:help]))
  end
  #--------------------------------------------------------------------------
  # ● 将光标移动到指定的键对应的选项
  #--------------------------------------------------------------------------
  def select_key(key)
    @data.each_index {|i| select(i) if @data == key }
  end
  #--------------------------------------------------------------------------
  # ● 内部用“确定”的处理
  #--------------------------------------------------------------------------
  def ok_inner; eval(item(@index)[:ok]); end
  #--------------------------------------------------------------------------
  # ● 内部用“取消”的处理
  #--------------------------------------------------------------------------
  def cancel_inner; eval(TMSRPG::CUSTOM_OPTION_CANCEL); end
  #--------------------------------------------------------------------------
  # ● 调用“确定”的处理方法 # Overwrite
  #--------------------------------------------------------------------------
  def call_ok_handler; call_handler(:ok_inner); end
  #--------------------------------------------------------------------------
  # ● 调用“取消”的处理方法 # Overwrite
  #--------------------------------------------------------------------------
  def call_cancel_handler; call_handler(:cancel_inner); end
end
[/pre]
[/fold]
[fold=角色被击震动]
[pre lang="ruby"]# SRPG插件-角色被击震动 Ver.2020.2.2
# 岚风雷(论坛ID:gqxastg)制作
#==============================================================================
# ■ 设定项目
#==============================================================================

module TMSRPG
  
  # 动画里设定声效与闪烁效果,播放指定名称的SE时
  # 以闪烁目标的参数对角色行走图进行位移(震动)
  # 红:+x坐标  绿:-x坐标  蓝:+y坐标  强度:-y坐标
  # 时间:设定为200时重置位移,其他无效
  # 另外:红设定为255时,将以强度为震动强度,时间为持续帧数,蓝为震动速度,
  #    绿为震动方向
  #      (0为横向先向右,1为横向先向左,2为纵向先向下,3为纵向先向上
  #        4为斜向先向右下,5为斜向先向左上,6斜向先向右上,7斜向先向左下),
  #       设置一个余弦震动
  #      (如已有震动时再次设置,会立刻结束当前,开始新设置的震动)
  # 注意:判定为震动处理时,则实质不会执行播放SE和闪烁处理
  #    动画帧数约为震动帧数的三倍多,如动画第一帧开始15帧震动,
  #    需要在动画第8或第9帧重置位移
  HIT_SHAKE_SE    = "shake"
  
  # 是否只有造成伤害时才进行位移(震动)处理
  # 注意:因原系统写法问题,动画第1~3帧均会被判定为无伤害
  HIT_SHAKE_DAMGE = true
  
  # 是否动画播放完毕后位置自动复原
  HIT_SHAKE_RESET = true
  
end
#==============================================================================
# ■ Sprite_Base
#==============================================================================

class Sprite_Base < Sprite
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  alias hitshake_initialize initialize
  def initialize(viewport = nil)
    hitshake_initialize(viewport)
    @pos_offset = [0, 0]
    #             剩余帧数 强度 速度 方向 正负
    @animation_shake = [0, 0, 0, 0, 1]
    @shake = 0
  end
  #--------------------------------------------------------------------------
  # ● 释放动画
  #--------------------------------------------------------------------------
  alias hitshake_dispose_animation dispose_animation
  def dispose_animation
    hitshake_dispose_animation
    @pos_offset = [0, 0] if TMSRPG::HIT_SHAKE_RESET
    @animation_shake = [0, 0, 0, 0, 1]
    @shake = 0
  end
  #--------------------------------------------------------------------------
  # ● 更新动画
  #--------------------------------------------------------------------------
  alias hitshake_update_animation update_animation
  def update_animation
    hitshake_update_animation
    if @animation_shake[0] > 0 || @shake != 0
      delta = (@animation_shake[1] * @animation_shake[2] *
      @animation_shake[4]) / 10.0
      if @animation_shake[0] <= 1 && @shake * (@shake + delta) < 0
        @shake = 0
      else
        @shake += delta
      end
      @animation_shake[4] = -1 if @shake > @animation_shake[1] * 2
      @animation_shake[4] = 1 if @shake < - @animation_shake[1] * 2
      @animation_shake[0] -= 1
    end
  end
  #--------------------------------------------------------------------------
  # ● 声效(SE)和闪烁时机的处理
  #--------------------------------------------------------------------------
  alias hitshake_animation_process_timing animation_process_timing
  def animation_process_timing(timing)
    if timing.se.name == TMSRPG::HIT_SHAKE_SE
      return unless SceneManager.scene_is?(Scene_SrpgMap)
      return unless @character &&
      @character.instance_variable_get(:@battler)
      # 无伤害则不处理
      return if TMSRPG::HIT_SHAKE_DAMGE &&
      @character.battler.result.hp_damage == 0
      if timing.flash_color.red == 255
        # 帧数
        @animation_shake[0] = timing.flash_duration
        # 强度
        @animation_shake[1] = timing.flash_color.alpha.to_i
        # 速度
        @animation_shake[2] = timing.flash_color.blue.to_i
        # 方向
        @animation_shake[3] = timing.flash_color.green.to_i
        # 正负
        @animation_shake[4] = 1
      elsif timing.flash_duration == 200
        @pos_offset = [0, 0]
      else
        @pos_offset[0] +=
        timing.flash_color.red - timing.flash_color.green
        @pos_offset[1] +=
        timing.flash_color.blue - timing.flash_color.alpha
      end
    else
      hitshake_animation_process_timing(timing)
    end
  end
  #--------------------------------------------------------------------------
  # ● 获取坐标偏移
  #--------------------------------------------------------------------------
  def pos_offset
    case @animation_shake[3]
    when 0 # 横向先向右
      return [@pos_offset[0] + @shake, @pos_offset[1]]
    when 1 # 横向先向左
      return [@pos_offset[0] - @shake, @pos_offset[1]]
    when 2 # 纵向先向下
      return [@pos_offset[0], @pos_offset[1] + @shake]
    when 3 # 纵向先向上
      return [@pos_offset[0], @pos_offset[1] - @shake]
    when 4 # 斜向先向右下
      return [@pos_offset[0] + @shake, @pos_offset[1] + @shake]
    when 5 # 斜向先向左上
      return [@pos_offset[0] - @shake, @pos_offset[1] - @shake]
    when 6 # 斜向先向右上
      return [@pos_offset[0] + @shake, @pos_offset[1] - @shake]
    when 7 # 斜向先向左下
      return [@pos_offset[0] - @shake, @pos_offset[1] + @shake]
    end
  end
end
#==============================================================================
# ■ Sprite_Character
#==============================================================================

class Sprite_Character < Sprite_Base
  #--------------------------------------------------------------------------
  # ● 更新位置
  #--------------------------------------------------------------------------
  alias hitshake_update_position update_position
  def update_position
     hitshake_update_position
     self.x += pos_offset[0].round
     self.y += pos_offset[1].round
  end
end
#==============================================================================
# ■ Sprite_SrpgCharacter
#==============================================================================

class Sprite_SrpgCharacter < Sprite_Base
  #--------------------------------------------------------------------------
  # ● 更新位置
  #--------------------------------------------------------------------------
  alias hitshake_update_position update_position
  def update_position
    hitshake_update_position
    self.x += pos_offset[0].round
    self.y += pos_offset[1].round
  end
end[/pre]
[/fold]其他待更新...

点评

可以哦!给个群号或者QQ号我都行!  发表于 2020-1-28 15:20
嗯会留着的,就是本义那个还得再写了x 话说不知道您有没有意向在QQ一类的通讯平台交流,也许能方便些,最近略闲很乐意尽量写一下这些改进想法【  发表于 2020-1-28 15:18
脸图显示ICON的脚本也用上了哦!都留着吧!  发表于 2020-1-28 15:01
2020.1.28 14:19 收到!范例已更新!  发表于 2020-1-28 14:19
那个ICON其实我当时想的是在行走图左下角显示……不过显示在脸图也很有用!谢谢!  发表于 2020-1-28 11:11

评分

参与人数 5赞 +5 收起 理由
Cupidk爱呗茶 + 1 我很赞同
百里_飞柳 + 1 精品文章
高须小龙 + 1 精品文章
chanszeman1018 + 1 精品文章
kunikai + 1 我很赞同

查看全部评分

这里岚风·雷,任饭、PM理性粉、UT/DR原作粉、(Trans)Furry自萌,半吊子技术一枚_(:з」∠)_    游戏制作交流工(liao)作(tian)室欢迎来玩!
【无偿/有偿】RGSS3(VA)脚本定制 + 合作招募/同好交友    修正Firefox/火狐浏览器的代码框复制问题(油猴脚本)
Click→←Click
回复

使用道具 举报

梦石
0
星屑
17038
在线时间
6058 小时
注册时间
2011-7-18
回帖
152

开拓者

发表于 2020-1-28 01:20:16 | 显示全部楼层
gqxastg 发表于 2020-1-28 00:02
针对楼主在范例里发现的一些问题(BUG)
这边从脚本根源上试着找了一下出现原因和解决方案
[fold=关于的设 ...

更新完啦,到目前为止工程里看见提到的问题应该就这些了吧,之后要是发现新问题我也愿意继续尽力帮忙x 话说ひきも記的脚本BUG感觉是真多了【
虽说这个系统在站内被反复搬运汉化好几次了,您的不仅脚本是最新和完全汉化的,也是我见到过最详细用心带有自己见解的一版了。
咱也希望这个能成为最好的一版,来给用使用VA制作SRPG的制作人们带来帮助呢x

点评

啊好几次可能是我的错觉x 是有搬运过的 https://rpg.blue/thread-347528-1-1.html 14年的贴子了 汉化忘了在哪看见的了 不过翻译很不全还都机翻的【 不用介意啦  发表于 2020-1-28 02:11
话说回来站内已经有了吗……?我之前翻了很久都找不到才决定自己汉化的(  发表于 2020-1-28 01:57
呜啊……我会努力的!谢谢!  发表于 2020-1-28 01:53

评分

参与人数 3赞 +3 收起 理由
Cupidk爱呗茶 + 1 塞糖
chanszeman1018 + 1 精品文章
kunikai + 1 塞糖

查看全部评分

这里岚风·雷,任饭、PM理性粉、UT/DR原作粉、(Trans)Furry自萌,半吊子技术一枚_(:з」∠)_    游戏制作交流工(liao)作(tian)室欢迎来玩!
【无偿/有偿】RGSS3(VA)脚本定制 + 合作招募/同好交友    修正Firefox/火狐浏览器的代码框复制问题(油猴脚本)
Click→←Click
回复

使用道具 举报

梦石
0
星屑
2590
在线时间
452 小时
注册时间
2019-6-22
回帖
68
 楼主| 发表于 2020-1-31 17:09:59 | 显示全部楼层
本帖最后由 kunikai 于 2020-4-7 09:14 编辑

3.事件设定(施工中。)

3.0 常见且会反复用到的设定

3.0.1 <GATE>

<GATE>,即用于派遣和撤离角色的事件。
战斗地图中必须存在且只能存在一个<GATE>。

如图所示,光标指向的魔法阵即为<GATE>。
GATE.png

使用方式:在地图事件的名称中写下<GATE>。

3.0.2 <ENEMY X>

<ENEMY X>用来表明这是一个战斗者事件,且读取数据库中X号敌人的数据。
如无其他设置,则<ENEMY X>会作为普通敌人存在。

使用方式:在地图事件的名称中写下<ENEMY X>。

3.0.3 <NPC>

在<ENEMY X>的基础上写下<NPC>表明这是一个友好的(?)战斗者事件,且读取数据库中X号敌人的数据。
<NPC>不受控制,会作为玩家的友方存在。

图3.0.3-1:一个友善的骷髅兵。
图3.0.3-2:其名称。
骷髅兵.png NPC.png
使用方式:在地图事件的名称中写下<NPC>。

3.0.4 <击破对象>

当某一<击破对象>被击杀时,若场上没有其他<击破对象>,则判定玩家胜利。

使用方式:在地图事件的名称中写下<击破对象>。

3.0.5 <护卫对象>

当某一<护卫对象>被击杀时,若场上没有其他<护卫对象>,则判定玩家失败。

使用方式:在地图事件的名称中写下<护卫对象>。

3.0.6 <非击破对象>

当没有设置<击破对象>时,默认胜利条件为击破所有<非击破对象>以外的敌人。

使用方式:在地图事件的名称中写下<非击破对象>。
一介凡人。对大多数事情都有心无力的凡人。
回复

使用道具 举报

梦石
0
星屑
123
在线时间
10 小时
注册时间
2018-1-6
回帖
26
发表于 2020-1-31 18:07:11 | 显示全部楼层
超期待以后可以制作SLG类的游戏!谢谢大大!

点评

好的大佬!目前还只是停留在世界观背景架构的阶段。我一萌新,准备先从短小一点的游戏形式学习学习。熟悉了之后才敢考虑SLG类型的游戏呢。  发表于 2020-1-31 19:42
有什么想要实现的功能和想法可以和我说哦。  发表于 2020-1-31 18:34
回复

使用道具 举报

梦石
0
星屑
2590
在线时间
452 小时
注册时间
2019-6-22
回帖
68
 楼主| 发表于 2020-2-2 16:54:59 | 显示全部楼层
本帖最后由 kunikai 于 2020-3-31 20:54 编辑

4.进阶(施工中。)

4.0 常见脚本的使用

4.0.1 pop_actor(k, x, y)

强制使队伍中的k号角色在(x,y)出击。

使用方法:
在脚本中直接输入pop_actor(k, x, y)。


4.0.2 select_actor(k)

选择(k)号角色,使其成为“设置移动路线——玩家”所操作的对象。

使用方法:
在脚本中直接输入select_actor(k)。

4.0.3 focus_event(k)

光标向(k)号事件所在位置移动。

使用方法:
在脚本中直接输入focus_event(k)。

4.0.4 focus_actor(k)

光标向(k)号角色所在位置移动。

使用方法:
在脚本中直接输入focus_actor(k)。

4.0.5 focus_xy(a, b)

光标向(a, b)这一坐标移动。

使用方法:
在脚本中直接输入focus_xy(a, b)。

4.1 移动路线中的脚本

4.1.1 gain_hp/mp/tp(X)

使角色回复X点hp/mp/tp。

使用方法:
在“移动路线”→“脚本”中输入gain_hp(X)/gain_mp(X)/gain_tp(X)。

4.1.2 add/remove_state(X)

为角色附加/解除X号状态。

使用方法:
在“移动路线”→“脚本”中输入add_state(X)/remove_state(X)。

点评

来了  发表于 2020-3-18 10:11
表示十分期待啊  发表于 2020-3-17 23:31
一介凡人。对大多数事情都有心无力的凡人。
回复

使用道具 举报

姬魂

梦石
0
星屑
443
在线时间
400 小时
注册时间
2009-8-30
回帖
568

开拓者

发表于 2020-2-11 18:18:21 | 显示全部楼层
不错不错,几年前我也汉化研究过,只是没有共享,后面不用就罢了,楼主加油!
【RPG MAKER MZ 】游戏制作新手群:185916404
回复

使用道具 举报

梦石
0
星屑
196
在线时间
229 小时
注册时间
2011-5-19
回帖
647
发表于 2020-2-23 20:29:34 | 显示全部楼层
前排支持。
回复

使用道具 举报

梦石
0
星屑
4476
在线时间
419 小时
注册时间
2016-5-11
回帖
127
发表于 2020-2-23 21:39:18 | 显示全部楼层
顶一下楼主 辛苦了
回复 0 1

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部