骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 衣谷三国
查看: 2764|回复: 8

[经验与教程] 花糕滴小知识——关于script脚本的抽象隐藏玩法

[复制链接]

18

主题

689

回帖

377

积分

见习骑士

Rank: 3

UID
3102512
第纳尔
2430
精华
0
互助
33
荣誉
0
贡献
0
魅力
84
注册时间
2019-9-6

骑砍中文站APP会员勋章战团正版勋章霸主正版勋章

鲜花(62) 鸡蛋(0)
发表于 2025-4-22 23:25:47 | 显示全部楼层 |阅读模式
本帖最后由 huagao 于 2025-4-23 00:12 编辑

    最近偷懒期间没写代码,只玩嘴皮子,在给一个初学modder灌顶编译原理的时候被问了一个之前都没注意过的问题,即

  1. file.write("%s -1\n"%(convert_to_identifier(func[0])))
  2. ...
  3. else:
  4.       file.write("%s %f\n"%(convert_to_identifier(func[0]), func[1]))
复制代码
   这个“-1”(else里面可以发现是一个浮点数),到底是干什么的


    在一系列省略过的实验过程之后,结论是:编译后的机器码中  scriptID X  这个X参数实际上是script的调用周期
    简单地说,script脚本实际上就是一种simple trigger,这个X就是trigger的触发周期,下面放一个例子
  1. ("test_script_time",
  2.     [
  3.         (store_time_of_day, reg2),
  4.         (display_message,"@now_time_is:_{reg2}"),
  5.   ]),
复制代码
   
   
    我在机器码中分别改为 test_script_time 0;test_script_time 1;test_script_time 1.5;test_script_time 3,得到的结果为


time_is_0.png

time 1

time 1

time 1.5

time 1.5

3

3


    以上只为做解释说明用,实际我已经做了相当多的控制实验。


    参数为0时,对应的script会持续触发;参数为正数时,会按照给定时间参数触发;参数为负数时,仅能依靠call手动触发(game_ 是系统硬编码调用)。
    另外众所周知,当有同名script存在时,call的时候只会触发最前面的那个,因为call这个动作执行起来实际上是开始遍历整个scripts文件,这个遍历过程是按角标来的。但是这个时间参数的script自动触发是不受同名影响的,因为并不是call动作执行的,简单举个例子:

同名script

同名script
same_name.png

   

    最后,是这个参数真正的使用方法:(这里我只用代码举例)
code.png code1.png


   

    这个抽象的东西我之前从来没有注意过,这次如果不是新人刨根问底地问,我说不知道又觉得脸上挂不住,真就一直忽略了。我不清楚在这之前有没有人发现过,但我从来没发现过任何人使用过这个冷门的东西。从animation的研究开始就有这种离谱的隐藏参数,对于script这种结构简单用法直观的东西,居然还有可以挖的点,战团也是真离谱啊。。。

    所以我要严厉谴责T社的离谱,通常我们认为,模块文档顶头的注释 既是该模块的 “参数说明” ,也是 “需要严格遵守的编写要求” ,这种从anim和script文件隐藏参数的行为恰恰是战团文档既不规范也不严谨的证明。那怕在注释里面加一个没有任何解释的空参数,都比这种甚至从结构上都不符合注释要求的code还tmd居然能通过编译来得更靠谱。

鲜花鸡蛋

AntiN0m1  在2025-5-5 10:46  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
解解解解解解解解解解解解解解解解解解

34

主题

235

回帖

196

积分

见习骑士

Rank: 3

UID
2462463
第纳尔
1607
精华
0
互助
23
荣誉
0
贡献
0
魅力
85
注册时间
2015-3-3
鲜花(62) 鸡蛋(0)
发表于 2025-4-23 04:00:45 | 显示全部楼层
抽象的东西。。这是怎么发现本质就是module_simple_triggers的。。另外经过试验,和module_simple_triggers一样,开始时间不固定。比方那个地方填3,并不是进游戏一瞬间就出发第一次,有可能过了123456,才触发第一次,然后3循环

18

主题

689

回帖

377

积分

见习骑士

Rank: 3

UID
3102512
第纳尔
2430
精华
0
互助
33
荣誉
0
贡献
0
魅力
84
注册时间
2019-9-6

骑砍中文站APP会员勋章战团正版勋章霸主正版勋章

鲜花(62) 鸡蛋(0)
 楼主| 发表于 2025-4-23 10:13:53 来自手机 | 显示全部楼层
战争傀儡阿格兰 发表于 2025-4-23 04:00
抽象的东西。。这是怎么发现本质就是module_simple_triggers的。。另外经过试验,和module_simple_triggers ...

试出来的呗。。时间就是跟simpletrigger一个吊样
这个试出来其实没花多少时间,反而是ms里面费劲来自: Android客户端

18

主题

689

回帖

377

积分

见习骑士

Rank: 3

UID
3102512
第纳尔
2430
精华
0
互助
33
荣誉
0
贡献
0
魅力
84
注册时间
2019-9-6

骑砍中文站APP会员勋章战团正版勋章霸主正版勋章

鲜花(62) 鸡蛋(0)
 楼主| 发表于 2025-4-23 10:15:07 来自手机 | 显示全部楼层
战争傀儡阿格兰 发表于 2025-4-23 04:00
抽象的东西。。这是怎么发现本质就是module_simple_triggers的。。另外经过试验,和module_simple_triggers ...

还有你4点起床啊来自: Android客户端

26

主题

824

回帖

405

积分

骑士

民间工匠

Rank: 4Rank: 4

UID
1115705
第纳尔
4077
精华
0
互助
26
荣誉
2
贡献
0
魅力
30
注册时间
2012-12-13
鲜花(236) 鸡蛋(10)
发表于 2025-4-27 23:21:35 | 显示全部楼层
我觉得这是很久以前的残留,事实上是有很多调试或者早已废弃的内容在引擎(或者启动器)中始终存在,比如说名不见经传的食物槽。
食物槽这玩意一直存在,但是即使是打开了之后也只能报错,我不觉得这种情况在骑砍中算是孤例,也就是说,你不要对应一坨翔山抱有太多离谱的期望。

18

主题

689

回帖

377

积分

见习骑士

Rank: 3

UID
3102512
第纳尔
2430
精华
0
互助
33
荣誉
0
贡献
0
魅力
84
注册时间
2019-9-6

骑砍中文站APP会员勋章战团正版勋章霸主正版勋章

鲜花(62) 鸡蛋(0)
 楼主| 发表于 2025-4-28 20:18:29 | 显示全部楼层
a1550887802 发表于 2025-4-27 23:21
我觉得这是很久以前的残留,事实上是有很多调试或者早已废弃的内容在引擎(或者启动器)中始终存在,比如说 ...

说起来食物槽这东西在远古版本的战团也有迹可循,放马在里面会给训练矛,怀疑以前角标1的item是马肉
解解解解解解解解解解解解解解解解解解

19

主题

1452

回帖

511

积分

皇家侍卫长[官方战队队长]

光辉骑士团[UTD]
战团ID:UTD_awe23

Rank: 6Rank: 6

UID
2102975
第纳尔
7295
精华
0
互助
10
荣誉
2
贡献
0
魅力
73
注册时间
2014-8-1

2024国庆青训杯季军勋章第二届梦幻联赛奉献勋章第十一届战团中国联赛征战勋章第十一届战团中国联赛铁骨勋章第一届梦幻联赛参与勋章第十届战团中国联赛征战勋章战团正版勋章骑士美德之英勇勋章[杰出会员活跃勋章]元老骑士勋章霸主正版勋章

鲜花(77) 鸡蛋(2)
发表于 2025-4-29 12:27:13 | 显示全部楼层
本帖最后由 BattleField 于 2025-4-29 12:33 编辑

可能在早期骑砍版本里面没有simple_trigger这个东西,是后来才从script里面独立出来的,是屎山代码遗留

另外在WSE的源码里,script的定义是这样的:


  1. struct script
  2. {
  3.     int u1;
  4.     rgl::string id;
  5.     float interval;
  6.     operation_manager operations;

  7.     bool execute(const int &num_params, __int64 *params);
  8.     static void error(const char *message);
  9. };
复制代码


18

主题

689

回帖

377

积分

见习骑士

Rank: 3

UID
3102512
第纳尔
2430
精华
0
互助
33
荣誉
0
贡献
0
魅力
84
注册时间
2019-9-6

骑砍中文站APP会员勋章战团正版勋章霸主正版勋章

鲜花(62) 鸡蛋(0)
 楼主| 发表于 2025-5-5 20:26:47 | 显示全部楼层
BattleField 发表于 2025-4-29 12:27
可能在早期骑砍版本里面没有simple_trigger这个东西,是后来才从script里面独立出来的,是屎山代码遗留

另 ...

远古遗留是肯定的,主要的问题是这种明明应该在注释里面声明“Not currently used”
解解解解解解解解解解解解解解解解解解

5

主题

3021

回帖

943

积分

骑士

Rank: 4Rank: 4

UID
86936
第纳尔
12662
精华
0
互助
5
荣誉
1
贡献
0
魅力
71
注册时间
2008-8-10

原版正版勋章战团正版勋章元老骑士勋章汉匈决战正版勋章维京征服正版勋章霸主正版勋章

鲜花(65) 鸡蛋(1)
发表于 2025-5-14 17:23:07 | 显示全部楼层
这事真是头一回知道,感谢大佬分享!
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2025-9-1 12:58 , Processed in 0.117987 second(s), 30 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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