骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 小黑盒加速器
查看: 1039|回复: 1

[讨论] 如何将MS的变量名称转化为外部python可识别的数字变量

[复制链接]

23

主题

337

回帖

298

积分

见习骑士

Rank: 3

UID
3189500
第纳尔
2704
精华
0
互助
26
荣誉
6
贡献
20
魅力
437
注册时间
2020-6-13
鲜花(67) 鸡蛋(0)
发表于 2023-1-19 23:54:11 | 显示全部楼层 |阅读模式
本帖最后由 apk43 于 2023-1-20 09:53 编辑

研究一天未果,特此向中文站大佬们求助。

在这篇帖子的启发下,[osp代码] 已成功。输出玩家身上所有物品的ID为py格式的代码到rgl_log.txt,我实现了获取兵种的字符串ID而非数字ID,代码如下:

from module_troops import *
from process_common import *

def get_troop_char_id(troop_i):
        troop_char_id = "str_trp_" + str(troops[troop_i][0])
        return troop_char_id


检测方法为:在MS语法里调用函数

(display_message, get_troop_char_id(290)),


因为290是“波尔查”的兵种ID,所以get_troop_char_id(290)得到的值就是"str_trp_npc1",
因为我提前把需要用到的兵种字符串转化为了   ("兵种字符串ID", "中文兵种名称")  的形式添加在module_strings.py里,比如("str_trp_npc1", "波尔查"),
所以"str_trp_npc1"对应的string就是波尔查,因此display_message将会显示该兵种名称
结果成功显示了”波尔查“;

可问题来了,我想获取任意兵种的字符串ID,就要在(display_message, get_troop_char_id(290)),里将290替换成变量troop_id,可是MS语法里的变量形式都是":""$",无法在[]之外被识别,
我尝试用print看看输出的值,结果用":troop_id"传给函数之后输出为:troop_id,说明只是把它当作了字符串;
用寄存器的话输出值是一串数字,应该就是它的地址吧;
直接用slot作为参数的话,网上找的方法通过get_value = ctypes.cast(id(slot), ctypes.py_object).value获取它的内存地址的值,结果输出为slot对应的数字id,而非slot储存的值。

一整天了,到现在还没搞明白。我对python没有深入的了解,希望大佬们回复帮助解决,以解心中难结。

B站个人空间:https://b23.tv/rZhCYpH

23

主题

337

回帖

298

积分

见习骑士

Rank: 3

UID
3189500
第纳尔
2704
精华
0
互助
26
荣誉
6
贡献
20
魅力
437
注册时间
2020-6-13
鲜花(67) 鸡蛋(0)
 楼主| 发表于 2023-1-20 12:11:09 | 显示全部楼层
研究了一上午,换了个思路。既然不好传参,那就用最简单的begin,and。用MS里的eq判断参数与数值是否相等,从而将数值传给函数。代码如下:
在脚本文件头部添加
from module_troops import *
from process_common import *
from ID_troops import *


def get_troop_char_id(i_troop):       
        return ("str_trp_" + str(troops[i_troop][0]))
       
def get_i_troop():
        get_troop_id = []
        get_troop_id.extend([(try_begin),(eq, "$troop_id", 0),(display_message, get_troop_char_id(0))])
        for i_troop in xrange(trp_npc1, trp_heroes_end):       
                get_troop_id.extend([(else_try),(eq, "$troop_id", i_troop),(display_message, get_troop_char_id(i_troop))])
        get_troop_id.append((try_end))
        return get_troop_id[:]


再在script里调用函数
("get_troop_char_id", get_i_troop()),

在触发器下调用脚本
                (assign, "$troop_id", "trp_kingdom_1_lord"),
                (call_script, "script_get_troop_char_id"),

最后成功显示“哈劳斯国王



以上我借鉴了R大的帖子[教学] [难度4]MOD教程之Python语言在Module System里的简单应用,在script里循环多次写入list[判断语句,函数调用语句],从而达到间接传参的目的。
这样的缺点就是性能没这么好,导出的txt不美观,因为本质上就是一直在判断。

不知道大家是否有更好的解决办法。
B站个人空间:https://b23.tv/rZhCYpH
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

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

GMT+8, 2024-11-19 12:30 , Processed in 0.112390 second(s), 19 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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