ES2 MUD LIB :: 東方故事二(ES2) 天朝帝國 mudlib 瀏覽展示

/doc/mudlib/daemon/combatd

HOME :: doc :: mudlib :: daemon :: combatd
□ 戰鬥

    戰鬥可說是 LPmud 最重要的部份﹐而且各種 mudlib 的實作方式也大同小異﹐
都是利用 heart_beat() 這個函數來執行每「回合」的攻擊動作﹐整個 mud 的執行
時間有極大的部份用在執行物件的 heart_beat() 上 ﹐而 heart_beat() 所作的工
作主要就是進行戰鬥﹐因此有關戰鬥的程式若是缺乏效率﹐整個 mud 的速度就會變
得很慢。

    有別於大部分的 mudlib﹐我將進行戰鬥的主要程式從使用者物件中分離出來﹐
寫成一個 daemon﹐這樣做的理由有二﹕

    第一﹐方便線上更新(update)戰鬥部份的程式 ﹐如果戰鬥的程式是由使用者繼
承的傳統方式 ﹐你必須更新使用者物件才能使你在線上所作的修改能動作﹐但是更
新使用者物件是一件「極端」麻煩與複雜的工作 ﹐牽涉的東西太多了﹐如 hunt、
poison.... 等等﹐能避免就盡量避免﹐因此將這些未來擴充或除錯時可能常常會修
改的部份獨立成一個 daemon﹐修改時只要更新 daemon 就可以了。

    第二﹐是記憶體和速度的考量 ﹐一般而言戰鬥部份的程式常常用到許多常數字
串(訊息)﹐但是因為 LPmud是用解譯(interpret)的執行方式﹐因此使用常數的速度
往往比變數慢很多﹐尤其是常數型態的陣列、mapping等﹐因此在遇到這類情形時我
通常將這些資料用「具有初始值的變數」定義好 ﹐這樣一來這些資料結構的建置只
有在物件被載入時執行一次﹐往後都是以變數形式使用 ﹐這種方式雖然加快了速度
﹐但只能說是「以空間換取時間」﹐因為增加了變數的數量 ﹐若是每個生物都自己
擁有一份這些實際上是常數的變數﹐(複製的物件會複製一份所有繼承物件的變數)
記憶體的負擔是很可怕的﹐因此把這些變數放在 daemon 裡 ﹐既節省空間﹐又加快
速度。

□ 戰鬥的進行

    當一個生物處於戰鬥狀態下﹐原則上每回合會作出一個動作(action)去攻擊敵人
﹐這個動作是定義在一個 mapping 中﹐有關動作的定義方式請參考其他文件﹐

HOME :: doc :: mudlib :: daemon :: combatd