编译和反汇编pokémon red和pokémon crystal的工具。

pokemontools的Python项目详细描述


Pokémon Crystal Utilities and Extras
==crystal.py`解析rom并提供方便的类来使用global`to廑asm()方法转储人类可读的asm。这个asm可以编译回原始rom。目前它解析映射头,"第二个"映射头、映射事件头、映射脚本头、映射触发器、映射"回调"、映射块数据、xy触发器、扭曲、人员事件,文本和脚本。

一旦模块第一次加载,如果文件更改并且需要更新,则必须重新加载它。

`` python
导入pokemontools.crystal as crystal

=10
asm.insert_with_dependencies(crystal.all_map_headers[:x])


要测试新插入的asm是否编译到同一rom中,请使用"make clean&;make"。如果有什么东西坏了,这会非常大声地抱怨。


<

>单元测试覆盖了大多数类。



``bash
python tests.py py py
````



//


这里是一个演示如何调查特定脚本的演示,从已知脚本的地址(0x580580580xbr/>43页)。在这种情况下,脚本调用"2writetext"命令来显示一些对话框。此对话框将显示在示例的末尾。

``python
import pokemontools.crystal as crystal

=脚本(0x58043)


这些必须出现在最终的asm文件中,rgbasm才能编译文件
objdeps=script.get_dependencies()
print str(objdeps)

=script.commands[2]
>print thirdcommand





看命令参数
>params=thirdcommand.params
>print params
{0:
0:








2 writetext总是有一个单独的参数
definition

参数计数=len(getattr(crystal,"2writetextcommand").param_types.keys())
当前参数计数=len(params.keys())
断言定义参数计数==当前参数计数,"这不应该"+\
"发生:命令实例的参数比命令的"+\
"定义允许的参数多"

获取第一个参数(文本指针)
param=params[0]
print param
<;crystal.rawtextpointerlabelparam实例,位于0x8ad4b0c>;

rawtextpointerlabelparam实例指向其文本
text=param.text
打印文本
位于0x8AD47EC的crystal.textscript实例>;

这是一个-",$4f
db"dex,不是吗?,$55
;…
```

但是,这不是"textscript"对象在最终asm中的显示方式。若要查看插入后在"main.asm"中的显示方式,请运行"print crys"Tal.to_asm(text)`获得以下结果。

`` asm
未知文本_0x580c7:;0x580c7
db$0,hm?这是一个-",$4f
db"dex,不是吗?,$55
db"我可以看看吗?",$51
db"有那么多",$4f
db"各种周一",$51
db"嗯?这是什么?",$51
db"这是什么",$4f
db"周一?"",$51
db"看起来像",$4f
db"奇怪的文字",$51
db"墙壁",$4f
db"废墟",$51
db"如果那些画",$4f
db"真的是-",$55
db"周一,应该有",$55
db"更多",$51
db"我知道!让我上来-",$4f
db"给你的-",$55
db"dex评分。跟我来,",$57
;0x581e5
```

这样做的好处是脚本对象将设置"map_group"和"map_id"变量。

``python
import pokemontools.crystal as crystal

/>#读取其属性以计算map group/map id
map-group=script.map-group
map-id=script.map-id

_dict["header_new"]

print map_dict["name"]
外面的阿尔卑斯山遗迹
```

虽然上面没有显示这一点,但结果是在"mapEventHeader"中,0x58043处的脚本被引用为一个Person事件。

``python
print map_header.second_map_header.event_header。这将显示一个大致如下的结构:

``asm
``个人事件$3c,19,15,$7,$0,255,255,$0,0,0,0,未知脚本u 0x58043,$0703,` ` ` `,19,15,$19,15,$3,$7,$0,255,255,255,$0,0,未知脚本u 0x58043,$0703,` ` `

` ` ` ` ` ` ` ` `
` ` ` ` ` ` ` ` ` `
` ` ` ` ` ` ` ` ` ` ` ` ` ` `>;翘曲
db 11
翘曲定义$11,$2,1,阿尔卑斯山奥乌洞室群遗址,阿尔卑斯山奥乌洞室地图遗址,阿尔卑斯山奥乌洞室群遗址
翘曲定义$7,$e,1,阿尔卑斯山卡布托洞室群遗址,阿尔卑斯山卡布托洞室群遗址,阿尔卑斯山卡布托洞室群遗址,阿尔卑斯山卡布托洞室群遗址
翘曲定义$1d,$2,1,阿尔卑斯山奥马尼特岩遗址群遗址
翘曲定义$1d,$2,2,1,阿尔卑斯山奥马尼特奥马尼岩遗址群遗址,奥马尼特奥马尼岩岩遗址,阿尔卑斯山奥马尼特奥马尼阿尔卑斯山地图遗址任何一个房间都可以
warp def$21,$10,1,1,1,1,阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔卑阿尔阿尔卑斯山_研究中心
warp-def$13,$6,1,1,1,1,2,6,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,6,2,2,1,1,1,1,1,1,1,1,6,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,7,3,3,3,6,3,3,3,3,3,6,6,6,6,6,6,6,6,6,6,1,6,6,1,1,1,1,6,32嫒睿路组阿尔卑斯山门,地图路线,32阿普阿尔卑斯山门遗址,32阿普阿尔卑斯山门遗址,15美元,D,2,32阿普阿尔卑斯山门遗址,32阿普阿尔卑斯山门遗址,32阿普阿尔卑斯山门遗址,地图路线,32阿普阿尔卑斯山门遗址,

;xy触发器
d b 2
xy触发1,$E,$B,$0,未知脚本,0x58031,$0,$0,$0,$0,$0
xy触发1,$F,$A,$0,$0,$0,E,$B,$0,未知脚本,未知脚本,0x58031,$0,$0,$0,$0,$0,$0,$0,$0,$0,$未知脚本5803A,$0,$0

;路标
db 3
路标8,16,$0,未知标号0x580b1
路标16,12,$0,未知标号0x580b4
路标12,18,$0,未知标号0x580b7

;人员事件
db 5
人员事件$27,24,8,$6,$0,255,255,$2,1,Trainer_0x58089,$ffff
个人事件$3c,19,15,$7,$0,255,255,$0,0,Unknownscript_0x58043,$0703
个人事件$3A,21,17,$3,$0,255,255,$a0,0,Unknownscript_0x58061,$078e
个人事件$27,15,18,$2,$11,255,255,$b0,Unknownscript_0x58076,$078f
个人事件$27,12,16,$7,$0,255,255,$80,0,未知脚本@0x5807e,$078f
0x58560
`````

```` python
`` python
`` python
`` python
`导入pokemontools.crystal.crystal as crystalas crystal

` ` `;加载字节
crystal.load\rom()

` ``获取一系列字节
crystal.rom interval(0x112116,10)
<
``获取一系列字节
crystalrom interval(0x112116,10)
<
` ` ` ` `` crystal 10,10","0x50","0x2f","x31,'0x2e,'0x30,'0xd,'0xa']
crystal.rom-crystal.rom的存储间隔(0x112116,10,字符串=false)
[72,84,84,84,80,80,47,49,46,48,13,10]





crystal.rom-crystystal.rom的存储间隔(0x112116,0x50,字符串=false)


[0x48,'0x48','0x54','0x54','0x54'']


<
或者直接查看编码字符
crystal.rom[0x112116:0x112116+10]
"http/1.0\r\n"

"查看0x197186处的文本
"text=crystal.parse"text"at2(0x197186,601,debug=false)
"打印文本
````

"最后一个文本"在0x197186处看起来像:

``python
"""橡树:啊哈!所以你是!
我是橡树!一位研究者,我刚去拜访我的老朋友,我听说你在为埃尔姆教授跑腿,所以我就在这里等着。这是什么?
一个罕见的"周一"!

"
"```

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Hibernate:jpamodelgen生成java而不是类   java如何在第二次活动结束后显示广告?   javascript如何在linux或windows上将java导出到jar   java One ArrayList添加了2个不同的选项   AmazonWeb服务如何在java中使用AWS Textract检索pdf中存在的表   java为什么RecycleView中的水平项在单击时不起作用?   java计算如果存在映射   java在捕获的组上应用正则表达式   如何使用Java在MySQL的同一个表中插入来自不同类的值   java字符串中最常见的字母(大写和小写)   Spring SessionBean实例正在由java中的多个用户共享   使用Spring Boot将@WebInitParam中的值外部化   java一创建线程就开始执行(多线程)   java是安卓所需的系统权限。意图行动给你打电话?