日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

最终幻想OL(FF14)分析 - 基本数据

發布時間:2023/12/10 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最终幻想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)分析 - 基本数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。