太阁立志传2简体中文版数据浅析(转自高亚男)
本帖最后由 小丰 于 2011-11-27 18:02 编辑声明:
以下数据仅供参考;
以下说明针对太阁立志传2简体中文光盘版,硬盘版没测试,繁体版的数据地址绝对不一致,请勿对号入座;
因为KOEI游戏数据喜欢采用“位域”(请参考C语言常识,不叙述),除了已经测试出来的部分有效位,其他未声明位请勿随意修改。否则引起任何故障,本人不做任何解释与歉意。请勿使用不支持位修改的修改器生成专用修改器去修改标志位。(04年GPoint不小心修改了城市信息中的一个数据位,导致城市信息夹带“围城”标志,就是该问题的范例)
开发工具:Delphi 7
调试工具:OllyDbg 1.09
第02楼:人物信息说明。
第03楼:主角及系统信息。
第04楼:城市信息。
第05楼:会战信息。
第06楼:获取武将名称地址(反汇编代码)有些深奥哦,看不懂就不要强看,不过你看懂了,就入门了。
第07楼:太阁立志传2简体中文版内存地址。(本人所找)
第08楼:太阁立志传2简体中文版全功能内存修改器(本人原创)
暂时写到这里。嘿嘿,以后再说。
人物信息
起始地址:$00519868;
信息长度:$2F
总人数:700,人物信息在BSDATA1.TR2、BSDATA2.TR2中
上场人物:356(ID:0~355)
新武将编号:359
关于脸谱编号:人物在内存的地址有随机性,依靠“脸谱”编号与上述文件中武将信息关联。该编号也是所谓的“父亲”血缘的关系。
关于姓名编号:在内存中是连续自然数,从0开始。
关于技能~年龄字段间信息:应该是承接任务信息。
-------------------------------------------------------------------
0D 42 1E 14 32 5C FF FF 2F 24 40 0D 00 10 00 B2
|----- -----
|姓 名 脸 谱
|
AE 51 00 FD 05 64 64 64 64 64 FF FF 0F FF E2 05
-- -- -------------- --------
性 相 能力(5个) 技 能
格 性
0E 00 00 00 00 00 2E 80 FF FF 11 64 5A 50 32 0D
-- -- -- -- -- -- ----- -- ----- -- -- --
aa bb cc dd ee 年 父 亲 体 力 野 亲 大
龄 (脸谱) 心 密 名
42 64 00 01 64 FF FF 2F 01 00 0E 00 11 00 B7 8B
-- ----- -- -- -- -- -- -- -- |
居 信 赖 俸 忠 上 司 寿 身 形 |
城 禄 誠 命 份 象 |
//=====================================================
特殊信息说明:
性格:
Bit: 80 40 20 10 08 04 02 01
-------- -------- -------- -------- -------- -------- -------- --------
饮酒 物欲 勇气 思考 情理 决断 主义 性格
0: 不喝酒 淡薄名利 缺乏勇气 非常固执 正义不足 优柔寡断 现 实 单纯
1: 喜欢喝酒 不合常理 勇敢的人 随机应变 讲信义 刚毅果断 远大抱负 复杂
相性:
Bit:80 40 20 10 08 04 0201
---- ---- ---- ---- ---- ---- --------
气质 喜好
0: 性急 武器
1: 忠厚 书籍
2: 艺术品
3: 南蛮物
寿命:
10.生病 80.死亡?
//=====================================================
数据及类型定义:
const
IDI_Game_PersonnelNameSpaceLen = 7;
IDI_Game_FemalePersonnelNameLen= 5;
IDI_Game_PersonnelInfoCount = 3029;
IDI_Game_PersonnelInfoInvalidID = $FFFF; // ----------数据待定
IDI_HistoryPersonalityStartID : Word = 0; // 历史人物起始编号
IDI_HistoryPersonalityCount : Word= 360; // 历史人物数
IDI_SpecialPersonalityStartID : Word= $3E8; // 特殊人物起始编号
IDI_SpecialPersonalityCount : Word= 30; // 特殊人物数
IDI_FemalePersonalityStartID: Word= $7D0; // 姬人物起始编号
IDI_FemalePersonalityCount : Word= 4; // 姬人物数
IDI_NPCPersonalityStartID : Word= $BB8; // NPC人物起始编号
IDI_NPCPersonalityCount : Word= 29; // NPC人物数
IDI_LandladyID : Word= $BB8; // 宿屋老板娘
IDI_HorseCoperBossID: Word= $BBA; // 马贩老板
IDI_GrainShopBossID : Word= $BBB; // 粮店老板
IDI_TK2_PersonnelInfoLength = $2F;
type
// 00519868 历史人物信息 len = $2F
TGame_HistoryPersonnelInfo = packed record
dwID: Word; // 姓名编号
// 姓氏:
// < $3E8 历史人物$00521AA8 + dwID * 7
// (>= $3E8 and < $7D0) 特殊人物$005077B0 + (dwID - $3E8) * 7
// (>= $7D0 and < $BB8) 姬 [$00506C54]
// (>= $BB8) NPC $00507978 + (dwID - $BB8) * 7
// 名称:
// < $3E8 历史人物$00520660 + dwID * 7
// (>= $3E8 and < $7D0) 特殊人物$00507888 + (dwID - $3E8) * 7
// (>= $7D0 and < $BB8) 姬 $00507960 + dwID * 5
// (= $BB8) 老板娘 $0050BDB0
// (<= $BB9 or > $BBB)NPC [$00506C54]
// (= $BBA or = $BBB) 马行、米店主人 $0050BDB8
dwFaceCode: Word; // 头像编号FFFF 无效2E9
Unknow0: array of Byte;//
byPersonality1: Byte; // 性格
//性格:
//Bit: 80 40 20 10 08 04 02 01
// -------- -------- -------- -------- -------- -------- -------- --------
// 饮酒 物欲 勇气 思考 情理 决断 主义 性格
//0: 不喝酒 淡薄名利 缺乏勇气 非常固执 正义不足 优柔寡断 现 实 单纯
//1: 喜欢喝酒 不合常理 勇敢的人 随机应变 讲信义 刚毅果断 远大抱负 复杂
byPersonality2: Byte; // 相性
//相性:
//Bit:80 40 20 10 08 04 0201
// ---- ---- ---- ---- ---- ---- --------
// 气质 喜好
//0: 性急 武器
//1: 忠厚 书籍
//2: 艺术品
//3: 南蛮物
byForces: array of Byte;// 能力:统御、武力、内政、外交、魅力
bySkills: array of Byte;// 技能:口才、马术、算术、剑术、忍术、
// 兵法、洋枪、筑城、礼法、茶道
Unknow1: array of Byte;//
byAge: Byte; // ?年龄
// ?生年
Unknow2: Byte;
dwFather: Word; // 父亲
Unknow3: Byte;
byVim: array of Byte;// 体力:Max、当前值
byAspiring: Byte; // 野心
byBosom: Byte; // 亲密
byGroup: Byte; // 势力 31 无效
byCity: Byte; // 居城
dwTrust: Word; // 信赖
bySalary: Byte; // 俸禄
byLoyal: Byte; // 忠诚
dwBoss: Word; // 家臣
byDead: Byte; // 寿命
byStation: Byte; // 身份
byFigure: Byte; // 形象
end;
//=====================================================
关于人物名称:
这是一个复杂的地址计算,反汇编游戏之后才弄明白,太恶劣了。
GameAddress 类中常量定义
FHistoryPersonalityName1 := $00521AA8; // 人物姓氏地址 ==========
FSpecialPersonalityName1 := $005077B0;
FFemalePersonalityName1 := $00506C54; // 姬 无姓氏
FNPCPersonalityName1 := $00507978;
FHistoryPersonalityName2 := $00520660; // 人物名称地址 ==========
FSpecialPersonalityName2 := $00507888;
FFemalePersonalityName2 := $00507960;
FNPCPersonalityName20 := $0050BDB0;
FNPCPersonalityName21 := $00506C54; // 无名 NPC
FNPCPersonalityName22 := $0050BDB8;
人名地址获取代码:
function TPersonnelInfos.GetNameAddress
(Index: Word): TGame_PersonnelNameAddress;
// 获取人物名称地址
begin
if Index = IDI_Game_PersonnelInfoInvalidID then
begin
Result.Address := $0;
Result.Address := $0;
end
else
if (Index >= IDI_HistoryPersonalityStartID)
and (Index < IDI_HistoryPersonalityStartID + IDI_HistoryPersonalityCount) then
begin // 历史人物
Result.Address := Self.GameAddress.HistoryPersonalityName1
+ Index * IDI_Game_PersonnelNameSpaceLen;
Result.Address := Self.GameAddress.HistoryPersonalityName2
+ Index * IDI_Game_PersonnelNameSpaceLen;
end
else if (Index >= IDI_SpecialPersonalityStartID)
and (Index < IDI_SpecialPersonalityStartID + IDI_SpecialPersonalityCount) then
begin // 特殊人物
Result.Address := Self.GameAddress.SpecialPersonalityName1
+ (Index - IDI_SpecialPersonalityStartID) * IDI_Game_PersonnelNameSpaceLen;
Result.Address := Self.GameAddress.SpecialPersonalityName2
+ (Index - IDI_SpecialPersonalityStartID) * IDI_Game_PersonnelNameSpaceLen;
end
elseif (Index >= IDI_FemalePersonalityStartID)
and (Index < IDI_FemalePersonalityStartID + IDI_FemalePersonalityCount) then
begin // 姬
Self.GetGameMemory(Self.GameAddress.FemalePersonalityName1,
@Result.Address, SizeOf(Result.Address));
Result.Address := Self.GameAddress.FemalePersonalityName2
+ (Index - IDI_FemalePersonalityStartID) * IDI_Game_FemalePersonnelNameLen;
end
else
begin// NPC
Result.Address := Self.GameAddress.NPCPersonalityName1
+ (Index - IDI_NPCPersonalityStartID) * IDI_Game_PersonnelNameSpaceLen;
if Index = IDI_LandladyID then// 宿屋老板娘
Result.Address := Self.GameAddress.NPCPersonalityName20
else if (Index = IDI_HorseCoperBossID) or (Index = IDI_GrainShopBossID) then
// 马贩老板、粮店老板
Result.Address := Self.GameAddress.NPCPersonalityName22
else
Self.GetGameMemory(Self.GameAddress.NPCPersonalityName21,
@Result.Address, SizeOf(Result.Address));
end;
end;
主角及系统信息:
GameAddress 类中常量定义
FLeadingActorInfo := $00516610; // 主角信息===========
FCurrentTime := $005205F0;
数据及类型定义:
// 00516610 主角基本信息
TGame_LeadingActorInfo = packed record
Unknow0 : array of Byte; //
LeadingActorID: Word; // 主角编号
Unknow1 : array of Byte;//
Money, Bank : Word; // 现金、存款
RetinueID : Word; // 随从
Unknow2 : array of Byte;//
SpecialGoods : Word; // 特殊物品:000F浊酒、00F0铭酒、0F00南蛮酒、F000药。
// 嘿嘿,这里的数据很有意思,有个BUG,当你的物品数量超过11,将不会产生消耗。
Unknow3 : array of Byte;//
end;
const
IDI_GameBaseYear = 1560;
type
// 时间及天气 005205F0
TGame_CurrentTime = record //游戏时间 Len = 4
Year : Byte; // 年份 = 内存值 + 1560
Month : Byte; // 月份 = 内存值 + 1
Day : Byte; // 日期 = 内存值 + 1
Hour : Byte; // 小时
Weather : Byte; // 天气:0、晴;1、阴;2、雨;3、雪
end;
//================================================
嘿嘿,关键数据信息:
起始地址 + 偏移量标志位
// 00517728 +9 80 惠琼的信
// 00517734 +9 80 惠琼的信
// 00517740 +9 80 日乘的信
// 0051774C +9 80 日乘的信
// 00517758 +9 80 绍喜的信
// 00517764 +9 80 绍喜的信
// 00517770 +9 80 弗洛伊斯的介绍信
// 0051777C +9 80 阿尔梅伊达的介绍信
// 00517788 +9 80 南蛮酒标志
// 00517794 +9 80 铭酒标志
// 005177A0 +9 80 浊酒标志
// 005177AC +9 80 药标志
// 005177B8 +9 80 绍喜的墨迹
// 005177C4 +9 80 惠琼的墨迹
// 005177D0 +9 80 特殊宝物0014
// 005177DC +9 80 特殊宝物0015
// 005177E8 +9 80 特殊宝物0016
// 005177F4 +9 80 特殊宝物0016
说明:00517788 +9 = 00517791这个地址如果最高位置1,则表示有该物品,系统显示该物品,否则不显示 。
这就是为什么你改了酒的数量,结果看不见酒,改了药的数量,看不见药。 城市信息:
信息起始地址:$0051EB88;
名称起始地址:$00506FC0
信息长度:$1F
总数:200
4A BB 51 00 9D F4 51 00 11 0D 0B 00 1E 9D C8 64
-- 产 ----- 俸 防 士 支
国 量 城 主 禄 御 气 持
FC 44 A0 73 BA 69 D8 01 C7 00 BC 0C 05 FF FF
----- ----- ----- ----- ----- 训 状
士 兵 资 金 军 粮 枪军 马 练 态
状态值:
00 (0000 0000) = 城市规模(小)(最大俸禄 0001 )
01 (0000 0001) = 城市规模(中)(最大俸禄 0340 )
02 (0000 0010) = 城市规模(大)(最大俸禄 0680 )
03 (0000 0011) = 城市规模(大)(最大俸禄 0680 )
04 (0000 0100) = 城市规模(大)(最大俸禄 0680 )
05 (0000 0101) = 城市规模(巨)(最大俸禄 1020 )
06 (0000 0110) = 城市规模(巨)(最大俸禄 1020 )
07 (0000 0111) = 城市规模(巨)(最大俸禄 1020 )
状态标志:
10 = 围城
数据定义:
const
IDI_Game_CityInfoCount = $C8;
IDI_Game_CityInfoInvalidID = $FF;
IDI_Game_CityInfoLength = $1F;
// 城市信息起始地址 = 0051EB88
// 城市名称起始地址 = 00506FC0
// 特殊城市:
// 48 稻叶山PUSH 04(0000 0100)005203C0 + 00 + 02( and 10 <> 0)
// and 005203C0 + 00 + 0A( and 10 = 0)005076C8
// 66 目加田PUSH 08(0000 1000)005203C0 + 01 + 02( and 01 <> 0)
// and 005203C0 + 01 + 0A( and 01 = 0)005076D1
// 64 今滨 PUSH 0F(0000 1111)005203C0 + 01 + 02( and 01 <> 0) 005076DA
// 7C 本愿寺PUSH 26(0010 0110)005203C0 + 04 + 02( and 10 <> 0) 005076E3
type
TGame_CityInfo = packed record
Unknow0 : LongWord; // 指针
Unknow1 : LongWord; // 指针
ZoneID : Byte; // 国
Yield : Byte; // 产量
MasterID : Word; // 城主
Salary : Byte; // 俸禄
Defence : Byte; // 防御度
Morale : Byte; // 士气
ApprovalRate: Byte; // 支持率
Soldier : Word; // 士兵
Bankroll : Word; // 资金
Provisions: Word; // 军粮
Firelock : Word; // 火枪
Horse : Word; // 军马
Training : Byte; // 训练度
State : Byte; // 状态
Unknow2 : Byte; // 未知
end;
特殊说明:
有四个城市名字会在游戏中变动,反汇编看起来很乱,可以参考上面的一些反汇编信息。暂不做特殊论断。 会战信息
LEN = 30H
我方地址:00513555
04 05 04 05 00 0D 00 07 00 A4 00 3B 01 56 01 C8
----------------------------- --
五个武将
00 F0 00 F0 00 F0 00 F0 00 20 03 00 00 00 00 00
-------------------------- --------------------
五个兵力 五个功勋
00 00 00 C8 C8 1C 02 02 02 02 02 3F 8F 00 00 00
-------- ----- -- -------------- -- -- -- -- --
五个功勋 士 气 五个兵种 ?
不做叙述! 获取武将名称地址(反汇编代码):
有些深奥哦,看不懂就不要强看,不过你看懂了,就入门了。
=============================================================================
004755DA . 6A 00 PUSH 0
004755DC . 68 F8000000 PUSH 0F8
004755E1 . E8 FAC50300 CALL TAIK2W95.004B1BE0
004755E6 . 8BCF MOV ECX,EDI
004755E8 . E8 C36C0200 CALL TAIK2W95.0049C2B0 ;------- 取姓氏地址
004755ED . 50 PUSH EAX
004755EE . E8 4D9A0200 CALL TAIK2W95.0049F040 ;------- 取姓氏
004755F3 . 83C4 04 ADD ESP,4
004755F6 . 68 A8965100 PUSH TAIK2W95.005196A8
004755FB . E8 C0690700 CALL TAIK2W95.004EBFC0
00475600 . 83C4 04 ADD ESP,4
00475603 . 8BCF MOV ECX,EDI
00475605 . E8 066D0200 CALL TAIK2W95.0049C310 ;------- 取名字地址
0047560A . 50 PUSH EAX
0047560B . E8 609A0200 CALL TAIK2W95.0049F070 ;------- 取名字
=============================================================================
;------- 取姓氏地址
0049C2B0/$ 66:8B01 MOV AX,WORD PTR DS:
0049C2B3|. 66:3D E803 CMP AX,3E8 ;< $3E8 历史人物$00521AA8 + dwID * 7
0049C2B7|. 73 12 JNB SHORT TAIK2W95.0049C2CB
0049C2B9|. 25 FFFF0000 AND EAX,0FFFF
0049C2BE|. 8BC8 MOV ECX,EAX
0049C2C0|. C1E0 03 SHL EAX,3
0049C2C3|. 2BC1 SUB EAX,ECX
0049C2C5|. 05 A81A5200 ADD EAX,TAIK2W95.00521AA8
0049C2CA|. C3 RETN
0049C2CB|> 66:3D D007 CMP AX,7D0 ;(>= $3E8 and < $7D0) 特殊人物$005077B0 + (dwID - $3E8) * 7
0049C2CF|. 73 17 JNB SHORT TAIK2W95.0049C2E8
0049C2D1|. 25 FFFF0000 AND EAX,0FFFF
0049C2D6|. 2D E8030000 SUB EAX,3E8
0049C2DB|. 8BC8 MOV ECX,EAX
0049C2DD|. C1E0 03 SHL EAX,3
0049C2E0|. 2BC1 SUB EAX,ECX
0049C2E2|. 05 B0775000 ADD EAX,TAIK2W95.005077B0
0049C2E7|. C3 RETN
0049C2E8|> 66:3D B80B CMP AX,0BB8 ;(>= $7D0 and < $BB8) $00506C54
0049C2EC|. 73 06 JNB SHORT TAIK2W95.0049C2F4
0049C2EE|. A1 546C5000 MOV EAX,DWORD PTR DS:
0049C2F3|. C3 RETN
0049C2F4|> 25 FFFF0000 AND EAX,0FFFF ;(>= $BB8) NPC $00507978 + (dwID - $BB8) * 7
0049C2F9|. 2D B80B0000 SUB EAX,0BB8
0049C2FE|. 8BC8 MOV ECX,EAX
0049C300|. C1E0 03 SHL EAX,3
0049C303|. 2BC1 SUB EAX,ECX
0049C305|. 05 78795000 ADD EAX,TAIK2W95.00507978
0049C30A\. C3 RETN
=============================================================================
;------- 取名字地址
0049C310/$ 66:8B01 MOV AX,WORD PTR DS:
0049C313|. 66:3D E803 CMP AX,3E8 ;< $3E8 历史人物$00520660 + dwID * 7
0049C317|. 73 12 JNB SHORT TAIK2W95.0049C32B
0049C319|. 25 FFFF0000 AND EAX,0FFFF
0049C31E|. 8BC8 MOV ECX,EAX
0049C320|. C1E0 03 SHL EAX,3
0049C323|. 2BC1 SUB EAX,ECX
0049C325|. 05 60065200 ADD EAX,TAIK2W95.00520660
0049C32A|. C3 RETN
0049C32B|> 66:3D D007 CMP AX,7D0 ;(>= $3E8 and < $7D0) 特殊人物$00507888 + (dwID - $3E8) * 7
0049C32F|. 73 17 JNB SHORT TAIK2W95.0049C348
0049C331|. 25 FFFF0000 AND EAX,0FFFF
0049C336|. 2D E8030000 SUB EAX,3E8
0049C33B|. 8BC8 MOV ECX,EAX
0049C33D|. C1E0 03 SHL EAX,3
0049C340|. 2BC1 SUB EAX,ECX
0049C342|. 05 88785000 ADD EAX,TAIK2W95.00507888
0049C347|. C3 RETN
0049C348|> 66:3D B80B CMP AX,0BB8 ;(>= $7D0 and < $BB8)姬 $00507960 + (dwID - $7D0) * 5
0049C34C|. 73 12 JNB SHORT TAIK2W95.0049C360
0049C34E|. 25 FFFF0000 AND EAX,0FFFF
0049C353|. 2D D0070000 SUB EAX,7D0
0049C358|. 8D8480 6079500>LEA EAX,DWORD PTR DS:
0049C35F|. C3 RETN
0049C360|> 25 FFFF0000 AND EAX,0FFFF ;(>= $BB8)
0049C365|. 3D B80B0000 CMP EAX,0BB8 ;(= $BB8)
0049C36A|. 74 1A JE SHORT TAIK2W95.0049C386
0049C36C|. 3D B90B0000 CMP EAX,0BB9 ;(<= $BB9)
0049C371|. 7E 0D JLE SHORT TAIK2W95.0049C380
0049C373|. 3D BB0B0000 CMP EAX,0BBB ;(> $BBB)
0049C378|. 7F 06 JG SHORT TAIK2W95.0049C380
0049C37A|. B8 B8BD5000 MOV EAX,TAIK2W95.0050BDB8 ;(= $BBA or = $BBB) 主人 $0050BDB8
0049C37F|. C3 RETN
0049C380|> A1 546C5000 MOV EAX,DWORD PTR DS: ;(<= $BB9 or > $BBB)NPC $00506C54
0049C385|. C3 RETN
0049C386|> B8 B0BD5000 MOV EAX,TAIK2W95.0050BDB0 ;(= $BB8) 老板娘 $0050BDB0
0049C38B\. C3 RETN 更换主角:00516624
更换主角身份:00516638
主角所持金:0051662E
家中存款:00516630
京镇画师画画期限:0051793E
界镇画师画画期限:0051794A
国友善兵卫造铁炮期限:005178BA
芝迂仙斋造铁炮期限:005178AE
八板清定造铁炮期限:005178A2
浊酒、铭酒数量:00516636
南蛮酒、药数量:00516637
购买米/马/枪数量:00516616
预算资金/修复城池天数:00516614
任务修改:00516610
特权值:00513C18
月/日:005205F1/005205F2
野战行动点数:00513927
攻城野战我方训练度:005185F7
攻城野战我方总大将士气:00513573
攻城野战我方第二分队士气:005135A3
攻城野战我方第三分队士气:005135D3
攻城野战我方第四分队士气:00513603
攻城野战我方第五分队士气:00513633
攻城野战敌方总大将士气:00513663
攻城野战敌方第二分队士气:00513693
攻城野战敌方第三分队士气:005136C3
攻城野战敌方第四分队士气:005136F3
攻城野战敌方第五分队士气:00513723
攻城不会疲劳:00513575/005185F8
攻城易攻陷:00513A79/00513A7E/00513A83/00513A88/00513A8D/00513A92/00513A97/00513A9C/00513AA1/00513AA6/00513AAB/00513AB0/00513AB5/00513ABA/00513ABF 点此下载修改器
http://tt.a.5d6d.com/userdirs/3/0/cheatmaker/attachments/month_1110/11100820291ee1596cd50f5f9b.gif
楼主威武啊~~~~~~ 楼主威武!! 不错的游戏啊 谢谢楼主分享
页:
[1]