作者SmallBeeWayn (喵喵叫的蜜蜂貓職方法)
看板WindFantasy
標題Re: [閒聊] 被太多怪圍毆傷害會增加
時間Sun Aug 16 03:54:24 2009
先來個10000HIT 紀念
http://picasaweb.google.com/lh/photo/tzwnZ6hf5MUj00zmlAheVQ?feat=directlink
不用說....為了要確保連擊持續, 整個累計期間我沒有停止過攻擊(及被攻擊)
在這期間別說是把所有怪物清空了,我連稍微遠離一下都沒有
就是一直一直刷個不停...
※ 引述《lasner (= =)》之銘言:
: ※ 引述《virkful (卡啦)》之銘言:
: : //Susan
: : 破防..哪來的新名詞0_0
: : 防禦的計算是.. 從你"進入戰鬥" 開始計算
: : 根據仇視你的怪物的數量多寡 去減去 你目前的防禦力%
: : EG: 你拖了20支怪, 降低了(20-1)*a % , 殺死了17支, 剩3支
: : 又拖了30支 再次降低 (30-1)*a % , 殺死了32支, 剩1支
: : 就算剩下一支再打你, 你目前的防禦降低量仍是 48*a%
: : 你把最後一支仇視你的怪物殺死, 你的防禦恢復為原本防禦值
: 個人感覺 他們的寫法應該是只要被怪物攻擊 存數量的參數就++
: 每次受到攻擊時就去判定參數 公式有可能是virkful大大所寫的 降低(參數-1)*a%
: 所以問題就在於怪物死掉時參數沒有-1 以上都是以學過一點點程式的觀點下去看
: 不過沒有原始程式 一切都只能用猜測的
: 如果以我個人的感覺 怪物死亡參數-1要做應該還漫簡單的吧
: 畢竟風色幻想Online都已經出來了XD
: 不過實際做的時候會發生什麼問題我就不知道了= =
如果是我的護盾值系統, 被攻擊計算大概是這樣的Func
===========================================================
Struct 玩家結構 { //(摘錄)
int 防禦力
int 護盾等級
int 護盾值
int 護盾回復力
int LastAtkTime //上次受到攻擊的伺服器時間
}
Function 玩家受到傷害(攻擊力, 玩家ID) {
Get and Lock 玩家結構
int NowTime=現在伺服器時間
玩家.HP -= (攻擊力-防禦力*護盾影響參數*護盾等級)
While(NowTime-LastAtkTime>重計參數) {
IF(玩家.護盾等級>0) 玩家.護盾等級--
LastAtkTime+=重計參數
//或是直接 玩家.護盾等級=0
Reset 護盾值
}
玩家.護盾值 -= (護盾扣減公式-(NowTime-LastAtkTime)*護盾回復力)
IF(玩家.護盾值 <= 0) {
玩家.護盾等級++
Reset 護盾值
}
玩家.LastAtkTime=NowTime
Unlock 玩家結構
}
===========================================================
整個處理只需要對"玩家表"進行一次索引,剩餘的都可以處理成整數運算
而且無論用不用護盾, 這個讀取動作都是必要的
可以說多寫一個護盾系統對於整個系統負載幾無差異
如果採用數量統計的話...
===========================================================
Struct 怪物結構 { //摘錄
int 最後攻擊目標玩家ID
}
Struct 玩家結構 { //摘錄
int 以自己為目標的怪物數量
}
Function 怪物死亡(怪物ID) {
...
Get and Lock 最後攻擊目標玩家的玩家結構
If(玩家還在有效區域) 玩家.以自己為目標的怪物數量--
Unlock 玩家結構
...
}
Function 怪物停止攻擊(怪物ID) {
...
內容同怪物死亡之處理
...
}
Function 怪物轉移攻擊(怪物ID) {
...
Get and Lock 前一個攻擊目標玩家的玩家結構
If(玩家還在有效區域內) 玩家.以自己為目標的怪物數量--
Unlock 玩家結構
Get and Lock 新的攻擊目標玩家的玩家結構
玩家.以自己為目標的怪物數量++
Unlock 玩家結構
}
===========================================================
有效區域指的是還在線,而且沒換分流也未曾在這之間換過地圖
雖然我沒有把他詳細該怎麼去做寫出來, 但實際上這是一個複雜的判斷
尤其是對於瞬間跨過地圖過去再回來的狀況
當然也可以把這個判斷寫進處理玩家跨越區域的Function裡面
但是除非弄一個動態陣列寫名該玩家所有未死亡之仇視怪物名單
否則這會是一個對整個怪物記憶體做Full Search的動作
而無論是Full Search還是動態陣列對於Online Game的Server都是絕對要避免的東西
而且我這個函式也沒有考慮從怪物轉移目標到新目標卻還沒做有效攻擊的問題
例如說魔道師放大魔法不小心OT了一大坨怪
結果旁邊一隻路過的小怪就直接把魔道師爆血推倒的問題會出現在我這個函式
如果要把這個問題修正, 首先是當怪物轉移目標時
不是直接就對參數做修正, 而是先設立旗標, 等怪物真的K到才更動參數
: : "只要你沒有脫離, 就不會恢復防禦數值"
: : 所以就算 跑開個五秒.. 他打你照樣是扣那數據
: : 一定要殺到" 脫離戰鬥" 才會恢復防禦數值
: : 基本上就是這防禦的式子沒寫好... 應該算是bug..
: : 我相信那工程師 是想寫拖多怪def就會降低.. 只是他不知道可以用loop來算
: : 因為沒去測試, 恐怕重新仇視也會再次計算進去.. 所以說這真的應該算bug..
: : [Edit] 我也沒測閃5秒.. 搞不好閃5秒能重算.. 我只覺得這寫法很神而已= =
: : [Edit2] 恩..稍微解釋一下給小蜜蜂兄..
: 小蜜蜂兄是可以不用那麼激動啦 畢竟大家也是討論討論阿= =
對於V板友的回文我並沒有特別怎麼樣, 畢竟他也只是提出看法
我主要在意的是不但m了一個未被確定,單方面的說法,而且還收進精華區這一點....
如果我沒有提出抗議, 是不是這個錯誤就被永遠的紀錄下來了?
: : 之所以用% 是因為 感覺不到所謂的"層次"
: : 我從1跳到8跳到14跳到20跳到30跳到40跳到50跳到58
: : 老實說 我沒有很詳細的在算到底幾隻在打我或者打了多久
: : 只是看數字很穩定的從1慢慢的往上爬
我的觀察倒是看的出來傷害是一階一階的往上跳而不是平滑的增加
: : 在怪物數量沒有增加的狀況下 數字不會增加
: : 根據"5秒"的說法 就當做這是事實吧, 我有拉開怪2~3秒 但是就是沒撐到5秒證實
: : 確信的就是, 殺完怪的瞬間 這個debuff會歸零
拉開所需要的時間我覺得跟護盾被打掉幾層有關係
因為幻影劍很方便,我只要往沒怪的地方放一次,在等個一秒再放回來
通常就會恢復防禦力了
: : 破防 ~ Guard Break , okok , 我道歉 ~
: : 關於您的五秒定律 似乎也有個[Edit] 說明 我不保證五秒定律的真假
: : WF是很輕鬆的版... 我是覺得您發表不滿情緒可以在含蓄收斂一些的是
: : 我是懂程式, 所以看到一些結果的時候就會多多少少想的到是怎麼寫的
: : 但是沒有原script, 誰知道 到底怎麼寫, 只是猜測而已. 非官方沒標準答案
: 個人猜測可能情況
: 1. 程式人員上班都在談李毓芬的八卦>////<
: 2. 程式人員沒有注意到這個BUG?
: 3. 程式人員有注意到 可是認為不重要(or沒時間改?)
: 4. 原本的設定就是這樣....Orz....
: 個人感覺應該是1吧(誤....
: 希望是2或3啦..= =
: 不過這邊有BUG文章出來了OB應該會改了吧~
: [八卦] 有沒有風色幻想程式設計師上班都再做啥的八掛阿=.=a
網路遊戲伺服器設計其實就是掌握幾個大原則
1.能不Search就不Search, 就算有Index也一樣, 更別說Full Search是絕對不可以
2.最好不要ReBuild Memory(包含動態陣列重載, new/delete Memory)
這會讓記憶體變得雜亂, 內部IO也很多, 而且很多指標也需要跟著修訂
這也是為何現在Online Game每一張地圖中每種怪物的數量都是定值
這樣怪物死掉重生都不需要ReBuild, 不過是Delay一下, 換個位置又冒出來這樣
3.涉及到個人Data就一定要有完整的Lock & Unlock處理
就是會發生兩個Function同時對同一個Data存取的事情
尤其是現在都是多執行緒,機會更是高...
其實我也是剛剛才好好的思考這幾種系統之間的差異
才發現到護盾系統真是輕便好用, 可以直接把整個Function都寫清楚
數量統計的話...說真的因為動到太多東西
還有很多沒有思考到, 例如各種類型攻擊法的對應之類的...
想到真的有點頭痛起來了...
: : 不用刺刺的 3Q
: : 這年頭GD都很可憐... 尤其在台灣
: ....推....台灣的廉價勞工T.T
: 小弟不才 學過幾年程式 以上都是猜測 不用那麼認真麻~
: 畢竟這是個簡單輕鬆的線上遊戲!?
台灣沒有高級程式工程師這種東西
程是寫幾年就轉管理職,不然就是只能當基層員工到死
不存在那種拿很高薪水,在公司裡說話很有份量的程式設計師
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.116.180.163
※ 編輯: SmallBeeWayn 來自: 122.116.180.163 (08/16 03:59)
推 lasner:認真文推一個!!不過還是要看真正的程式內容才知道這到底要 08/16 09:46
→ lasner:不要修改.不過這越想越頭痛的問題就交給風色的工程師吧.(逃 08/16 09:48