Buff系統框架設計

2021-07-26 16:12:18 字數 3698 閱讀 1467

buff的配置檔案

buftype: 1: 精神類buf 2: 物理類buf 3.元素類buf 4.其他類buf 5.被動類buf

bufsubtype: 1000-1999 精神子類 2000-2999.物理子類 3000-3999.元素子類 4000-4999.其他子類 5000-5999.被動子類。所以子類可以唯一標識乙個buff的類別 

oppgroupid: 表明該groupbuff互斥的buffgroup.玩家身上只可能兩種buffsubtype存在一種

rawbufdesc.xml

bufdesc.xml

bufgroupdesc.xml

propertiesdesc.xml 記錄了所有遊戲使用的屬性內容,已經其對應的巨集

buff系統構成

rawbuff構成了buff

buff相同subtype的內容構成了bufgroup,如果沒有buffgroup的subtype可以相互替代

buffgroup記錄了可以疊加的subtype組,和疊加的buff關係

buff的流程

判定是否buff能夠attach

=> tfightactor::getfirstbufbysubtype(isubtype) 獲取身上該subtype的buff

=> 比較需要新增的buff和已經有的buff的 bufflevel.如果已經有更強大的則不能新增

attach buff流程

=> attachbufwithcalc(_u32 ibuffid, _u32 ibuffinstanceid, _u32 iperiod, tactorrecalccontext* pctx)

=> calcbufchangewhenattachbufbyid(_u32 ibuffid, u32& iattachbufid, _u32& iperiod, _u32& idetachbufid, _u32& idetachinstanceid) 該函式會調整最後生成的buffid, 生存週期 和detach的buffid, buffinstanceid

通過ibuffid的subtype判定該buff是有buffgroup還是沒有。如果有buffgroup獲取其在組裡面的bufflevel,否則bufflevel為1

=> calcbufchangewhenattachbufbysubtype(_u16 ibufsubtype, _u32 ibufid, _u32 ibuflevelinc, _u32& iattachbufid, _u32& iperiod, _u32 idetachbufid, _u32& idetachinsid)

subtype的替換類別是

a.同bufid替換

查詢身上第乙個同個buffid的buffer,

如果有,

則detach原來的attach現在的,

否則只attach現在的

b.同subtype替換

查詢身上第乙個同subtype的buffer,

如果有,

則detach原來的attach現在的,

否則只attach現在的

c.同subtype同level替換

查詢身上第乙個同subtype的buffer,

如果沒有,

則直接attach現在的;

如果有,而且新的buffer bufflevel更高,

則detach原來的attach現在的,

否則無法attach

d.疊加

查詢該subtype的buffgroup,

如果不存在則無法attach

如果存在,則獲取當前subtype的buff的bufflevel

如果存在,則detach當前buff, 計算當前bufflevel+新增buff的newbufflevel計算出新的buff.新增新的buff

如果不存在,直接attach當前buff

e.疊加、對抗

查詢是否存在該subtype對抗的subtype的buff

如果不存在,則走疊加的邏輯

如果存在,則detach對抗的buff, 把newbuff的new bufflevel和對抗的bufflevel相減。attach剩下的bufflevel的buffid

f.時間疊加

如果存在該buffid則detach原來的,attach新的,但是period時間是新的+原來的剩餘時間

g.直接新增

不管任何情況,直接新增

=> detachbuf(_u32 ibuffid, _u32 ibuffinstanceid, tupdatebufcontext* pctx)

遍歷m_listbuff, if(pbuf->m_iid == ibuffid && (ibufinstance == 0 || pbuf->m_iinstanceid == ibufinstanceid)) detachbuf(tbuff* pbuff, tupdatebufcontext* pctx)

=>detachbuf(tbuff* pbuff, tupdatebufcontext* pctx)

pctx記錄detach的buffinstanceid, buffdesc, detachbuffcount

如果rawbuff列表在tfight的戰鬥process中,刪除

=>tfight::removeprocessrequeest(trawbuff* prawbuff)

把prawbuff的process從戰鬥的m_listprocessreqctx裡面移除,釋放process. rawbuff的記憶體資源還在哦

=> tfightactor::detachbufinternal(tbuff* pbuf)buff釋放邏輯,(rawbuff沒有記憶體釋放哦)

遍歷buff的rawbuff裡面

rawbuff::ondetach()

從m_listrawbufflist清除rawbuff

從m_listbufflist清除buff

=> tbuf::destroybuf(tbuf* pbuf)

釋放rawbuff記憶體

釋放buff記憶體

=> 如果alive attachbuf(_u32 ibufid, _u32 ibufinstanceid, _u32 iperiod, tupdatebufcontext* pctx)

=> tbuff::createbuf(_u32 ibuffid, _u32 ibuffinstanceid)

建立rawbuff物件

建立buff物件

pbuff->m_iperiod = iperiod

pbuff->m_icurrtime = 0

=>tfightactor::attachbufinternal(tbuff* pbuf)

把pbuff放入m_listbuff

把pbuff的rawbuff陣列放入m_listrawbuff

=>tbuf::onattach(tfightactor* pactor)

設定tbuff::m_pactor

設定trawbuff::m_pactor

pctx->m_arattachbuf記錄pbuff

=> tfightactor::recalcplayerskillequipbufprobyctx(tactorrecalccontext* pctx, tactorrecalccontext* ppetctx)

計算buf屬性影響

計算屬性

校驗屬性

伺服器客戶端同步協議

與技能相同的資料,是乙個process陣列

原文出處:

再議成就系統框架設計

根據的設計,其實還有幾點可以優化 1.group組的buff是靠嚴格的配置的偏移量計算出來的,這個太不可控了。buff可能出在無法檢查的策劃小錯誤上 2.如果已經有n種型別的成就,而有乙個新的需求,其事件是已有的幾種成就組事件的組合,則需要 產生一種新的成就組,使用新的成就buff。儲存空間浪費,冗...

系統介面框架設計與實現

目錄 1 引言 2 設計 2.1 inte ce 2.2 business service 2.3 object transaction data 3 實現 3.1 webservice.asmx 3.2 ibusinessservice 3.3 common submitresult 4 使用說明...

MegEngine 框架設計

megengine框架設計 megengine 技術負責人許欣然將帶了解乙個深度學習框架是如何把網路的定義逐步優化並最終執行的,從框架開發者的視角來看待深度學習。背景 ai 浪潮一波又一波,彷彿不會演算法就落後於時代。深度學習框架處理了各種裝置的計算細節 求導 計算優化序列的工作,而在動態 靜態兩套...