與怪物相關的模組有三個:mod_mon_create.erl,mod_mon_active.erl,lib_mon.erl
mod_mon_create:建立負責建立怪物的程序,通過mod_mon_create:create_mon([monid, scene, x, y, type])建立怪物程序
怪物建立程序的state
-record(state, ).
用於儲存怪物的自增id,每乙個怪物id都不同
mod_mon_active負責建立怪物程序,每個怪物程序是乙個有限狀態機(gen_fsm)
怪物程序state儲存當前怪物所追蹤的玩家pid列表,當前怪物的#ets_mon資訊
在mod_mon_active:start([id,monid,scene,x,y,type])中建立怪物程序,根據配置表和傳入的引數,初始化乙個#ets_mon,插入到?ets_mon表中,程序進入sleep狀態。
怪物程序的有限狀態機主要有以下幾種狀態:
sleep:休眠狀態,怪物程序被建立後為該狀態,當有玩家進入追蹤範圍後會去跟隨(trace)
trace:跟隨狀態,如果玩家進入攻擊範圍則發起戰鬥,否則繼續跟隨,或者玩家離開追蹤範圍,則返回出生點(back)
back:返回出生點,進入sleep狀態
rerive:復活,進入sleep狀態
sleep,trace狀態中如果怪物hp為0,則進入rerive狀態。
怪物程序接收last_red_hp訊息,收到該訊息後會減少hp,當hp為0時,無論何種狀態都進入revive
有限狀態機大致圖示:
初始化 -> sleep
sleep - timeout - 未死亡 - 附近有玩家 -> trace
sleep - timeout - 未死亡 - 附近沒有玩家 -> sleep
sleep - timeout - 已死亡 -> revive
trace - timeout - 在攻擊範圍內 - mod_battle:battle/2發起戰鬥 -> trace
trace - timeout - 不足攻擊範圍 -trace_line - move -> trace
trace - timeout - 在追蹤範圍外 -> back
trace - timeout - 怪物死亡 -> revive
trace - repeat -> trace
back - timeout - 返回(瞬移)出生點 -> sleep
revive - timeout - #ets_mon.retime大於0 -> sleep
revive - timeout - #ets_mon.retime小於0 -> 關閉怪物程序
任何狀態下 - 掉血 - 怪物死亡 -> revive
任何狀態下 - 掉血 - 怪物未死亡 -> 狀態不變
怪物程序中兩個handle_info方法:
handle_info(clear, _statename, [att, minfo]) 清除怪物,停止程序
handle_info(, statename, [att, minfo]) 掉血,修改後的#ets_mon回寫?ets_mon
is_attack(status,x,y):判斷是否進入攻擊距離,根據#ets_mon.att_area判斷
trace_area(status,x,y):判斷是否進入追蹤距離,根據#ets_mon.trace_area判斷
move(x,y,[pid,minfo]):怪物移動,判斷區域是否有障礙,將怪物新座標寫回?ets_mon
auto_move(minfo):隨機移動,每次走兩格
erlang遊戲原始碼 英雄遠征分析
erl p 1024000 k true smp disable name sd2 127.0.0.1 setcookie sd2 mnesia extra db nodes sd1 127.0.0.1 boot start sasl config log s sd gateway start ex...
英雄遠征Erlang原始碼分析(4) TCP連線處理
在start tcp 0中啟動了sd tcp listener sup監控樹,並掛到sd sup下。其後啟動的程序樹形關係如下 這是遊戲伺服器啟動後使用observer觀察到的遊戲內程序關係圖,0.68.0 為start tcp 0啟動的sd tcp listener sup監控樹,0.70.0 為...
英雄遠征Erlang原始碼分析(9) 戰鬥流程解析
和戰鬥相關的模組有mod battle.erl 當玩家程序和怪物程序被建立的時候都會通過mod battle start link 建立乙個戰鬥程序。該戰鬥程序的state,用於儲存玩家上次出手或者使用技能的時機,用於cd的判斷 record state,開始戰鬥的時候,生成攻擊方和防守方的 bat...