RunDB.pas 維護DBServer和M2 的數據交換。
RunSock.pas 維護 M2和網關的數據交換。
LocalDB.pas 用於讀取標準數據庫(物品 技能 怪物)內的數據。
其中可以看到 在讀取物品數據庫的時候
StdItem.AC := MakeLong(Round(Query.FieldByName('Ac').AsInteger * (g_Config.nItemsACPowerRate / 10)), Round(Query.FieldByName('Ac2').AsInteger * (g_Config.nItemsACPowerRate / 10)));
StdItem.MAC := MakeLong(Round(Query.FieldByName('Mac').AsInteger * (g_Config.nItemsACPowerRate / 10)), Round(Query.FieldByName('MAc2').AsInteger * (g_Config.nItemsACPowerRate / 10)));
StdItem.DC := MakeLong(Round(Query.FieldByName('Dc').AsInteger * (g_Config.nItemsPowerRate / 10)), Round(Query.FieldByName('Dc2').AsInteger * (g_Config.nItemsPowerRate / 10)));
StdItem.MC := MakeLong(Round(Query.FieldByName('Mc').AsInteger * (g_Config.nItemsPowerRate / 10)), Round(Query.FieldByName('Mc2').AsInteger * (g_Config.nItemsPowerRate / 10)));
StdItem.SC := MakeLong(Round(Query.FieldByName('Sc').AsInteger * (g_Config.nItemsPowerRate / 10)), Round(Query.FieldByName('Sc2').AsInteger * (g_Config.nItemsPowerRate / 10)));
物品的防禦、魔法防禦 、攻擊這種 一個字段內包含了 攻擊上限了下限。類型爲4字節。 這裏也就限制了 物品的屬性無法超越2字節限制。 0-65535 。要超過此限制 必須使用8字節數據。
--------------------------------------------------------以上是M2和外部數據交換的操作--------------------------------------------
Magic.pas 內實現了一個魔法管理器 TMagicManager 所有魔法的傷害都在此進行管理和統計。源代碼很冗餘。相同的代碼有太多重複。如果考慮將物品屬性改成4字節 那麼這裏面有很多代碼需要重新維護 防止數據溢出。
Guild.pas內 實現 了2個類,TGuild(行會) 和TGuildManager (行會管理)。那麼關於行會的操作都將在此進行。
UsrEngn.pas內是對所有Actor數據的處理。包含處理NPC 人物 怪物 和英雄 的數據
在TUserEngine.ProcessHumans 我發現在處理全局公告的時候的邏輯 也在這裏面處理 實在是很不應該。這應該是公告類自身來處理的。主要負責前端 不過職責太混亂 啥都有。
而frnEngn.pas 內 TFrontEngine = class(TThread) 雖然從字面上來理解是前端。。但是做的是後勤工作。。反正這兩個類的職責比較混亂!是處理數據的主要類!
Event.pas 內實現的是事件類。安全區的光環 以及地圖上的特效 都是以事件來實現的。比如困魔咒。在遊戲網絡突然中斷我們可以看到困魔咒的光環依舊是動態的。這說明。這些地圖特效的幀率 是不受服務端控制 的 主要邏輯在客戶端 服務端只是告訴客戶端 有這麼一個事件 什麼時候消亡!
TEvent = class(TBaseObject)
Envir.pas 內維護了一個TEnvirmonent 在服務端 如果服務端有1000個地圖map 那麼會有1000個TEnvirMonent 對象。每個對象維護各自地圖內的玩家怪物列表。 而此類並不是線程類的子類。也就就是表示服務端在處理數據並不是並行處理的。而是線性處理。那麼隨着對象縱深越來越深 效率也是會降低。所以此類應該獨立出來 不受M2維護 應該做到自維護。
在加入新土城格式 需要在此單元內做兼容。
DataEngn.pas 此單元與RunDB.pas配合 DataEngn.pas主要是處理底層Socket鏈接 而RunDB.pas主要負責合適發送者這種高層邏輯。是線程類。
Castle.pas 是城堡處理實現單元內部實現了TCastle 和 TCastleManager。關於城堡的操作 在此單元內。
StorageEngn.pas 倉庫實現單元。其保存的爲本地文件 並非數據庫內。 需要改進
其他以Obj開頭的單元是怪物 以及NPC的 AI實現。
ps:源代碼爲 飛爾20120918代碼