最终幻想OL(FF14)分析 - 基本数据
生活随笔
收集整理的這篇文章主要介紹了
最终幻想OL(FF14)分析 - 基本数据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
國慶在家閑來無事,下個了收費游戲,經典之作FF14,簡單的分析了下,日本人的游戲結構挺簡單。
具體的基地址就不寫了,就發發實現的代碼和效果
注意說明:
??? 1、游戲內的字符編碼是UTF8
??? 2、游戲的數據結構大部分都是靜態(至少看的幾個都是)
??? 3、日本人的代碼看起來比棒子的易懂(棒子是游戲做多了,框架封裝的太好了)
一、背包列表
實現代碼:
procedure ShowBagList(); varItemPageBase:Cardinal;i,j,Count:Cardinal;BagObj:^_BagObj;Name:Pchar; beginif pCardinal(g_BagBase)^ <> 0 thenbegin//有4頁for i := 0 to 3 dobeginItemPageBase:= pCardinal(g_BagBase)^ + i * $18;if PCardinal(ItemPageBase)^ <> 0 thenbeginPrintf('Item Page:%d',[i]);Count:= pInteger(ItemPageBase + 8)^;if Count > 0 thenbeginfor j := 0 to Count - 1 dobeginBagObj:=Pointer(pCardinal(ItemPageBase)^ + j * $40);if BagObj.ResId <> 0 thenbeginName:=Pointer(g_GetItemNameByResId(BagObj.ResId) + $D0);Printf('Idx:%d ResId:%X Name:%s Num:%d',[BagObj.Idx,BagObj.ResId,Utf8ToAnsi(Name),BagObj.Num]);end;end;end;end;end;end; end;二、環境列表
代碼實現:
Procedure ShowWorld(); varObjBase:^_RoleObj;I:Cardinal; beginfor I := 0 to $158 dobeginObjBase:=pPointer(g_WorldBase + i * 4)^;if ObjBase <> nil thenbeginPrintf('[%d]Lv:%d Name:%s Hp:%d/%d Mp:%d/%d Pos:%.2f,%.2f,%.2f',[i,ObjBase.BaseInfo.Lv,Utf8ToAnsi(ObjBase.Name),ObjBase.BaseInfo.Hp,ObjBase.BaseInfo.MaxHp,ObjBase.BaseInfo.Mp,ObjBase.BaseInfo.MaxMp,ObjBase.x,ObjBase.z,ObjBase.y]);end;end; end;三、角色基本信息
實現代碼:
Procedure ShowRoleInfo(); varRoleObj:^_RoleObj; beginRoleObj:=pPointer(g_RoleBase)^;if RoleObj <> nil thenbeginPrintf('Lv:%d',[RoleObj.BaseInfo.Lv]);Printf('Name:%s',[Utf8ToAnsi(RoleObj.Name)]);Printf('Hp:%d/%d',[RoleObj.BaseInfo.Hp,RoleObj.BaseInfo.MaxHp]);Printf('Mp:%d/%d',[RoleObj.BaseInfo.Mp,RoleObj.BaseInfo.MaxMp]);Printf('SkillPower:%d',[RoleObj.BaseInfo.SkillPower]);Printf('Pos:%.2f,%.2f,%.2f',[RoleObj.x,RoleObj.z,RoleObj.y]);end; end;=====================================我是分割線=====================================
這里要給出一個重要的對象結構體,上面的代碼應該也能發現就是_RoleObj
_RoleBaseInfo = Packed recordModIndex:Byte;Lv:Byte;Empty1:array [0..5] of byte;MaxHp,Hp:Cardinal;MaxMp,Mp:Cardinal;SkillPower:Word;end;_RoleObj = packed RecordUnkonwMem1:array [0..$2F] of byte; // 0x30Name:Array [0..$1F] of Char; // 0x20UnkonwMem2:array [0..$4F] of byte; // 0x50x,z,y:Single; Empty:Cardinal;Way:Single;Offset:Array [0..$177B] of Byte; // 0x17E0 -> BASE + 0x1830BaseInfo:_RoleBaseInfo;End;另外個背包的數據的結構,這個比較簡單
_BagObj = Packed RecordUnkonw:Cardinal;Idx:Cardinal;ResId:Cardinal;Num:Cardinal;End;最后不公開的幾個函數和全局地址申明如下: typeTGetItemNameByResId = function (Resid:Cardinal):Cardinal;cdecl; varg_RoleBase:Cardinal;g_BagBase:Cardinal;g_GetItemNameByResId:TGetItemNameByResId; //通過資源ID查詢物品名稱g_WorldBase:Cardinal;
[吐槽]~~又是個掛B滿天飛的游戲啊~
總結
以上是生活随笔為你收集整理的最终幻想OL(FF14)分析 - 基本数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows系统停止8080端口
- 下一篇: JAVA手写ArrayList以及Lin