• 23519阅读
  • 3235回复

水组的水楼~~[Adarm说要争取纯水的机会- -b] [复制链接]

上一主题 下一主题
离线maigod
发帖
168
金钱
0
91币
0
信誉
0
资产
0 IST
在线时间
43 小时
注册时间
2008-05-24
最后登录
2008-06-16
只看该作者 2520楼 发表于: 2008-06-01 17:53:49
暂时歇一下
离线hqy
发帖
1850
金钱
187
91币
0
信誉
0
资产
0 IST
在线时间
260 小时
注册时间
2008-04-12
最后登录
2020-05-02
只看该作者 2521楼 发表于: 2008-06-01 17:57:36
搭讪若水
离线hqy
发帖
1850
金钱
187
91币
0
信誉
0
资产
0 IST
在线时间
260 小时
注册时间
2008-04-12
最后登录
2020-05-02
只看该作者 2522楼 发表于: 2008-06-01 18:06:40
暗黑全角色共同台词:

"I can't."

"Help Me!"
"Help!"
"Follow Me."
"Come on."
"This is for you."
"This is yours."
"Thank you."
"Thanks."
"Oops."
"Forgive me."
"Goodbye."
"Bye."
"Die!"
"Time to Die!"

"Not enough mana."
"I need mana."


"I can't use this yet."
"I am overburdened."
"I can't carry anymore."
"Not in Town."
"Not Here."
"I can't do that here."
"It's Locked."
"I need a key."

//Act 1 player statments
离开罗格营地 
Ama, "I shall purge this land of the shadow."
Bar, "Beware foul demons and beasts."
Pal, "I will cleanse thiw widerness."
Sor, "Evil beware!"
Nec, "My enemies beware."
进入邪恶洞窟
Ama, "I hear foul creatures about."
Bar, "There are many foes here."
Pal, "Evil Dwells within this cave."
Sor, "This place is trouble."
Nec, "I sense death within this place."
进入埋骨之地
Ama, "I sense great sorrow and misery."
Bar, "I shall meet death head-on."
Pal, "This holy place has been desecrated!"
Sor, "There is dark magic at work here."
Nec, "Too many empty graves."
进入僧院大门
Ama, "So, this is the site of Andariel's atrocities."
Bar, "The Monastery reeks with evil and corruption."
Pal, "Even the Light cannot pierce this gloom."
Sor, "Ah, the Monastery… Andariel's stronghold!"
Nec, "This place has the stench of demons about it."
进入遗忘之塔
Ama, "What's that smell?" 
Bar, "The stench of poison…"
Pal, "This tower shall be cleansed of evil."
Sor, "This place holds many secrets."
Nec, "This place reeks of death."
进入监牢
Ama, "What nightmarish tortures took place here?"
Bar, "No one should ever be caged."
Pal, "This is no place for a warrior to die."
Sor, "If there was magic here, it's long gone now."
Nec, "Ah, the slow torture of caged starvation."
进入地下墓穴
Ama, "This place is eerie."
Bar, "So cold and damp under the earth."
Pal, "There is great evil here."
Sor, "This place chills me to the bone."
Nec, "I sense a demonic presence here."
完成邪恶洞窟任务
Ama, "Perhaps now the Sisters will trust me."
Bar, "The Rogues are safe for the moment."
Pal, "My duty here is done."
Sor, "This cave has been purged of evil."
Nec, "Is that enough to earn the Rogues' trust?"
完成埋骨之地任务
Ama, "Rest in peace, Sister."
Bar, "Good riddance, Blood Raven."
Pal, "Sisters, there was no other way."
Sor, "Rest now, Blood Raven."
Nec, "Blood Raven… rest well."
找到凯恩任务树
Ama, "What a strange-looking tree…"
Bar, "This tree is one of a kind."
Pal, "This tree bristles with magic!"
Sor, "This ancient tree has an aura of magic about it."
Nec, "This tree shines with inner spirits."
找到营救凯恩的五根魔法石
Ama, "These stones serve some magical purpose…"
Bar, "These magic stones are ancient."
Pal, "Maybe Akara could dispel the mystery of these stones."
Sor, "These stones radiate powerful magic."
Nec, "I sense many spirits around the stones."
进入Tristram
Ama, "It's as if a great war were fought here."
Bar, "The land here is dead and lifeless."
Pal, "What a tragic end to Tristram!"
Sor, "Tristram was no match for Diablo's fury."
Nec, "All that's left of proud Tristram are ghosts and ashes."
营救凯恩
Ama, "Deckard Cain, go to the Rogues' camp without delay!"
Bar, "Deckard Cain, you've got to get out of here!"
Pal, "Deckard Cain, leave quickly!"
Sor, "Deckard Cain, get to the Rogue camp!"
Nec, "Deckard Cain, if you value your life, leave here immediately."
锤子任务
Ama, "The Sisters will be glad to have this back!"
Bar, "I should take this to Charsi."
Pal, "This will help the Sisters turn the tide against evil."
Sor, "I hope the Sisters appreciate this thing…"
Nec, "All this for a hammer?"
遗忘之塔任务完成
Ama, "The Tower's trove… for the taking!"
Bar, "This is reward enough!"
Pal, "I've earned the right to this abandoned trove."
Sor, "I hope to find other such treasures!"
Nec, "Treasure hunting… bah… Treasure finding… yes."
act1最后任务完成
Ama, "This Maiden shall inflict no more anguish."
Bar, "Let the gate be opened!"
Pal, "My work here is finished."
Sor, "The evil queen has fallen."
Nec, "Back to the hell that spawned you, Andariel."

//Act 2 player statements
进入下水道
Ama, "This place disgusts me."
Bar, "Ugh... The tell-tale stench of a carnivore's lair."
Pal, "The foul stench of evil assails me."
Sor, "I sense strange magic here."
Nec, "I sense a powerful undead being within this place."
Radament任务完成
Ama, "Atma has been avenged."
Bar, "I've just about had my fill of the walking dead."
Pal, "I pray that Atma will rest easy now."
Sor, "What a misguided monster."
Nec, "What a waste of undead flesh."
堕落的太阳
Ama, "Great. An eclipse. This just keeps getting better and better."
Bar, "What is wrong with the sun?" 
Pal, "What Evil taints the light of the sun?"
Sor, "Only powerful magic can conjure an eclipse."
Nec, "Only the darkest magics can turn the sun black."
进入利爪蝮蛇神殿
Ama, "I hope I know what I'm doing!"
Bar, "The sun has never shone here!"
Pal, "Light guide my way in this accursed place."
Sor, "I sense strong magic within this place."
Nec, "This place is as dark as a tomb."
堕落的太阳任务完成
Ama, "Let there be light."
Bar, "It is good to know that the sun shines once again."
Pal, "The Light can never be extinguished by evil."
Sor, "Who would have thought that such primitive beings could cause so much trouble!"
Nec, "What a pity. I was beginning to enjoy the darkness."
进入神秘的庇护所
Ama, "Am I the first to find this Arcane fortress?"
Bar, "One could get lost in here."
Pal, "This surely is the product of a twisted mind!" 
Sor, "This place actually… distorts reality. Fascinating."
Nec, "This is fantastic! I wish I had time to study this bizarre dimension."
找到召唤者
Ama, "What a freak!"
Bar, "Stand aside, old fool. I have no time for your babblings." 
Pal, strplayersubtitles146, "Surely the evil here has driven you mad."
Sor, strplayersubtitles147, "Is this truly Horazon?"
Nec, strplayersubtitles148, "This bumbling fool cannot be the mighty Horazon!"
杀死召唤者
Ama, "Good riddance, freak."
Bar, "I hate staining my hands with the blood of foul sorcerers."
Pal, "Rest in peace, tortured soul."
Sor, "That couldn't have been Horazon. Poor wretch."
Nec, "He was not Horazon. He was a deluded fool who got too close to true power!"
进入塔拉夏的墓穴
Ama, "This has got to be the right place."
Bar, "This tomb is very ornate. This must be Tal Rasha's resting place."
Pal, "Is this the tomb I seek?"
Sor, "This tomb has Horadric markings. I wonder if this is Tal Rasha's tomb?"
Nec, "This could be Tal Rasha's tomb. However, I'm sensing very strange energies here."
找到正确的塔拉夏墓穴
Ama, "Should I enter…? Diablo and Baal may have laid a trap…"
Bar, "Such a cold breeze… Tal Rasha must be kept here."
Pal, "Here, at last, is a fitting testament in stone to Tal Rasha's sacrifice."
Sor, "This must be the true Tomb of Tal Rasha!"
Nec, "I sense an incredible aura about this tomb. The Horadrim hid something powerful 

inside."
act2最后任务完成
Ama, "This is not good. Will this madness ever end?"
Bar, "I have failed. Diablo has freed his accursed brother. The world remains at their 

mercy." 
Pal, "I shall honor Tal Rasha's sacrifice by destroying all the Prime Evils."
Sor, "Diablo and Baal have escaped me! Next time… vengeance!" 
Nec, "I came too late. Now… Destruction is let loose upon the world once more."

//Act 3
找到LamEsen之书
Ama, "I hope the secrets within this book can help us."
Bar, "I hope this book is worth all the trouble."
Pal, "The Black Book… It's heresy to the Zakarum High Council."
Sor, "This tome has the weight of knowledge about it."
Nec, "This ancient book radiates arcane power!"
LamEsen之书任务完成
Ama, "All this trouble over a tattered book."
Bar, "May this book lift the shadow from Kurast."
Pal, "May the Black Book deliver us from evil!"
Sor, "May the Black Book bring a black day to hell!"
Nec, "Once the book has served its purpose, I shall delve into its secrets."
找到BeneathCity
Ama, "Whoa…. What died down here?"
Bar, "Cough… The stench down here is choking!"
Pal, "The smell of death… or worse… surrounds me."
Sor, "It smells worse than rotting reagents down here."
Nec, "It's been years since I waded through sewers for fun."
找到DrainLever
Ama, "I hope this does something good…"
Bar, "This will drain out some of the filth."
Pal, "This appears to control the ancient valves."
Sor, "This looks promising."
Nec, "This looks like what I've been searching for."
BeneathCity任务完成
Ama, "Eureka!"
Bar, "Good. Now I can get out of here and get some fresh air!"
Pal, "This trove will help lift the curse from Kurast!"
Sor, "I hope these items can aid me against the demons."
Nec, "Great. More junk. Just what I'd expect to find in a sewer…"
吉得宝任务完成
Ama, "This dagger will separate the faithful from the fallen."
Bar, "This holy blade does not belong in the hands of the Zakarum."
Pal, "This blade shall pierce the heart of evil!"
Sor, "I must take this to Ormus."
Nec, "This is a powerful weapon. Perhaps Ormus can tell me more about it."
找到玉制小人
Ama, "What would this bring from the right buyer?"
bar, "What a strange little statue."
pal, "Perhaps I could trade this for something more valuable?"
sor, "I don't sense any magic about this item. Very strange."
nec, "A worthless statue. Perhaps I can trade this for something better."
q5开始
Ama, strplayersubtitles205, "Such a dark temple for a Religion of Light…"
Bar, strplayersubtitles206, "The spirits of nature have fled this dreaded place."
Pal, strplayersubtitles207, "This corrupted temple was once the shining heart of my religion

…"
Sor, strplayersubtitles208, "I sense tremendous evil within this place."
Nec, strplayersubtitles209, "This temple exudes darkness."
q5完成
Ama, "Skatsim's reign is renewed!"
Bar, "The dark powers here will no longer poison the land."
Pal, "The Temple shall shine anew with the Light."
Sor, "The Temple's power is annulled."
Nec, "The Temple's dark power is broken."
进入憎恨的牢房
Ama, "This must be where Mephisto is."
Bar, "The final resting place of Hatred itself."
Pal, "This must be where the Horadrim imprisoned Mephisto."
Sor, "Ah… Mephisto's prison."
Nec, "The Tower that holds Mephisto…."
杀死老M
Ama, "Success… But still there's something not right."
Bar, "Maybe now the world will have peace."
Pal, "The Lord of Hatred shall darken the world no longer."
Sor, "Mephisto shall no longer darken our souls with hatred."
Nec, "Good journey, Mephisto. Give my regards to the abyss."

//Act 4
Izual任务
Ama, "Wait… Don't I get three wishes?"
Bar, "Even Fallen Angels deserve freedom."
Pal, "How can one who was once so holy fall so far from righteousness?"
Sor, "He was corrupted to the core. I pity him."
Nec, s "Bah! Izual was weak. He squandered his infernal power." 
离线hqy
发帖
1850
金钱
187
91币
0
信誉
0
资产
0 IST
在线时间
260 小时
注册时间
2008-04-12
最后登录
2020-05-02
只看该作者 2523楼 发表于: 2008-06-01 18:09:54
d2gs发送给客户段的一段代码?

0    1    2
01   
01 00 04 08 30 00 01 01 00
01 00 04 00 30 00 01 01 00
01 00 07 4B 00 05
02//blank
03: "Press OK to trade" menu comes up/ opens inventory out of town for one second. Weird!
04: Displays the loading screen
05 //blank?
07: Server tells client to add/display map data
07 [WORD X] [WORD Y] [BYTE Area ID]
08: Server tells client to delete/hide map data
08 [WORD x] [WORD y] [BYTE Area ID]
09    //Cave Notification/aLen == 11\\(aPacket[1] == 0x05)?lvl_wrap_data[aPacket[6]].lvlName
//(&unit.dwUnitID, aPacket + 2, 4)unit.dwUnitType = aPacket[1](&x, aPacket + 7, 2)(&y, aPacket + 9, 2)
if (aPacket[1] == 0x05)    {DWORD id=*((DWORD*)(aPacket+2));POINT16 *p = (POINT16*)(aPacket+7);
        if(aPacket[6]==0x12) //类型:地下墓穴的楼梯
09 05 [DWORD id] [WORD UnitType] [WORD X] [WORD Y]
0a    //Object/Unit is Destroyed by the Game (be Gone from Player's Vision)/aLen == 6
//(&unit.dwUnitID, aPacket + 2, 4)unit.dwUnitType = aPacket[1]//Remove Entity
0a [BYTE entity kind] [DWORD id]
0b nPlayerID = *(DWORD *)(aPacket + 2);
0C: Entity State Info

0d     //other player info/movement
//(aPacket[2] == leaderId)(&leaderLoc.x, (aPacket+7), 2)(&leaderLoc.y, (aPacket+9), 2)<=follow/bot1.cpp
//Unit State //Enity State Info, Health/Dead/Position/etc...
0d [DWORD Unit ID] [BYTE Unit Type] XX XX XX XX 00 00
0D 00 07 00 00 00 07 F4 13 C0 13 00 63  //13     
0D 00 07 00 00 00 07 F6 13 C2 13 00 63
0D 00 07 00 00 00 07 F1 13 BD 13 00 63         
      2          7    9   
//k3c.cpp    if(aPacket[6] == 0x01 && aPacket[11] == 0x00 && aPacket[12] == 0x00) {
            ::memcpy(&WpLocation.x, aPacket + 7, 2);::memcpy(&WpLocation.y, aPacket + 9, 2);
            sprintf(sMsg, "WpLocation (%04x,%04x)", WpLocation.x,WpLocation.y);
0e 03 xx xx xx xx [other shit] //xxxxxxxx = tpid
//when a town portal changes modes,may be sent when you click a chest/shrine also because of the mode change.
//Update Object State
0e 02 [DWORD Object ID] XX XX [DWORD State]
51 02 1A 00 00 00 25 00 A9 16 B8 11 02 00
0E 02 1A 00 00 00 03 00 02 00 00 00
51 02 19 00 00 00 25 00 A9 16 EC 11 02 00
0E 02 19 00 00 00 03 00 02 00 00 00
0F     //other player movement/(aPacket[2] == leaderId)//Player/Entity, Running
0F 00 07 00 00 00 17 F7 13 C4 13 00 F9 13 CB 13
0F 00 07 00 00 00 17 F6 13 C2 13 00 F8 13 C9 13
0F 00 07 00 00 00 01 F4 13 C0 13 00 F2 13 BC 13 walk
0F 00 07 00 00 00 17 F1 13 BD 13 00 F4 13 C0 13 run
      2              7    9      <-12    14 
10     //cave follow code
    if ( toFollow && (aPacket[1] == 0x00) &&    // not sure if this is always 0x00
         (aPacket[2] == leaderId) &&
         (aPacket[6] == 0x18) && // seems to be constant
         (aPacket[7] == 0x05)
10 00 02 00 00 00 18 02 55 00 00 00 7A 15 5B 12
11 - {8} - [11 00 (DWORD Player ID) (BYTE Unit ID) 00 - /Attacked By Player??/
12: Update Entity State, Auras/Spells/Dead/etc...
13    //aura types/((aLen == 14 && aPacket[0] == 0x13 && aPacket[6] != 0x69)|| (aLen == 18 && aPacket[0] == 0x14))
//(&dwID, aPacket + 2, 4)g_aAttrs[g_nAuraPos] = aPacket[6] + AURA_BASE
13 AC 13 01 00 0D 4B 00 05 95 83 21 40 01 //14
14//18
15    //Map Blink (Teleport, WP, TP, etc)/aLen == 11 IsThisPlayerID(aPacket + 2) (&x, aPacket + 6, 2) (&y, aPacket + 8, 2)
// teleport successfully if(aPacket[1] == 0x01)
15 00 [DWORD Player ID] XX XX XX XX XX
//Entity Position, Sent When Out of Sync With Client or for Major Updates
19 0C: Picking up Gold
1B //blank?
1d    0c    //Player Character Level Changed/aLen == 3
1d    0e     //gold         BYTE
1e    0e     //gold         word
1f    0e     //gold         dword
//Inventory gold 0e/Stash gold 0f

20 07 00 00 00 43 64 00 00 00
20 07 00 00 00 44 64 00 00 00
20 07 00 00 00 0C 4F 00 00 00
20 07 00 00 00 00 23 00 00 00
20 07 00 00 00 02 14 00 00 00
  id
21: Tells client info about a single skill base level (eg, update the skill level on skill tab)
21 00 00 01 00 00 00 36 00 00 03 00
21 00 00 01 00 00 00 71 00 00 3F 00

22    //alen=12?Charge-able Spells(&ca.wSpellID, aPacket + 7, 2)ca.dwCharges = aPacket[9]
             7    9
22 00 EA 01 00 00 00 DC 00 1A E3 00
22 00 EA 01 00 00 00 DA 00 2A E3 00
//got when open stash
23    00    //Player Left/Right Spell Selected/aLen == 13 IsThisPlayerID(aPacket + 2) (&wSpell, aPacket + 7, 2)
//(aPacket[6])// left-hand// right-hand\\(aPacket[6] == 0x01) // left
//Switch Skill
23 00 [DWORD Player ID] [BYTE Left/Right (00/01)] [WORD Skill ID] FF FF FF FF

26    MsgType    //welcome msg/01chat
26 01 00 02 00 00 00 00 00 (varies, character name) 00 (varies, message)]
26 01 00 02 00 00 00 00 00 61 46 6C 79 5F 41 75 72 61 00 00   
// 01 is standard chat message
// 02 prints in the format "%s whispers: %s" where the first var is Name, and the second is Message.
// 04 bypasses the name checks, etc, and prints the message with color specified in Color.
// 05 creates an overhead struct and assigns it to the unit with id (UnitId)
// 06 prints the "You whispered to %s:  %s, with the first var being Name, and the second being Message.
// 07 prints Message on a recipe scroll background.  Recipe scroll pane opens but lacks buttons.
typedef struct
{
    t_d2game_header    h;
    bn_short        unknown1;
    bn_int        unknown2;
    bn_short        unknown3;
    bn_byte        unknown4;  /* id or token? a fixed number for each char*/
    /* player name */
    /* message */
} t_d2game_server_chat_message;

27    //interact_succeed/aLen == 40 && aPacket[1] == 0x01(&id, aPacket + 2, 4)
27 01 01 00 00 00 01 6F 03 02 7C 0D 00 76 43 05 01 00 00 00 78 F5 F2 00 00 76 43 05 00 56 A6 01 7C 00 FA 00 01 00 00 00
27 01 09 00 00 00 01 00 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
29 //97
28 //105/103
//interact npc->27 29 28 npcmove
2a    //(aPacket[1] == 0x01)repaired
2B 00 01 04 14 30 40 01 //hp mp?
2B 00 01 08 00 05 00 63 //8
2C    00    //Inventory is Full/aLen=8 aPacket[1]=0x00 aPacket[6]=0x17 aPacket[7]=0x00 IsThisPlayerID(aPacket + 2)
2C 00 ID 17 00
2C: Some sounds (Like open a TP, the "Follow Me" sayings, etc.) 
2C 01 0A 00 00 00 12 00
      id
2D 41 7D E2 73 42 FD 13 //8
2D 21 25 82 BF 22 85 1F
2D 21 F3 81 6A 22 93 0A
2D A1 90 C2 15 A3 D0 15

2F 00 00 42 00 00 7F /37 11 /04 16 /01 00 07 4B 00 05
2F 00 14 00 97 00 01 /95 0F /57 13 /01 00 07 4B 00 05   

2F 00 00 00 8F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 //37 
2F 00 00 00 8F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   

30    01    //NPDSTROE?

3e    // arrow/bolt/throwing weapon quantity update(aLen == 11&& aPacket[0] == 0x3e)(&g_wAmmoQuantity, aPacket + 7, 2)
3f 08 Right Click(scroll, pot,etc)
3f [BYTE Used[00/ff] [DWORD ItemID] ff    
3F FF 08 00 00 00 FF FF //7C 04 08 00 00 00  //after open cube

47 00 00 02 00 00 00 00 00 00 00 //11
        id
48 00 00 02 00 00 00 00 00 00 00//11
49    //GameIP?
4c     //leader use skill(target)/aPacket[2] == leaderId
// 06(click unitL) -> 09(hold unitL),        
// 07(shift unitL) -> 0A (shift hold unit L),
// 0d(click unitR) -> 10 (hold unitR),
// oe(shift unitR) -> 11 (shift hold unit R)
4d     //other player use skill (non target)/???<=follow bot
//(aPacket[2] == leaderId)(aPacket[6] == 0x36 && aPacket[7] == 0x00=>tp)
4d    //Monster Revived by Itself (Act5 Zombies)/aLen == 17 aPacket[1] == 0x01
//(&unit.dwUnitID, aPacket + 2, 4)
4E: //Merc-Trade-Info
4E 58 0D AC EA B0 AD //7
4E 5B 0D 7E 19 BC F7
4E 5D 0D DF 53 C0 43
4E 5E 0D 9D AC 45 B8
4E 6D 0D 37 6B 0F D0
4E 6E 0D 07 30 BE 7D
4E 70 0D A9 EC F6 22
4E 71 0D 7B 56 6E DF
4E 78 0D 76 08 04 72 
4E 7A 0D 3A D7 3E 48

4f//blank?1st talk to merc
4F 00 14 00 4C 00 00 00 00 01/D0 13/9A 13/01 00 07 4B 00 05
4F 00 42 00 27 00 00/86 14/B2 18/01 00 07 4B 00 05
4F 00 14 00 31 20 00 EE
4F 00 14 00 31 20 00/EA 13/A6 13/01 00 0D 4B 00 05
4F 00 00 00
4F 00 00
4F 56 5E 00 00 28 11 0B 16 80
4F 56 E0 00 78 0F 86 13 80//9                                       
4F 56 19 00 00 73 0F 43 13 80
4F 56 0B 00 00 AE 0F 5D 13 80     
4F 56 F8 00 3E 15 5C 12 80                           
4F E9 00 00 00 00 00 00 76 14 AC 18 80 


50: Quest Related
51:World Entity Info
//Town Portal Appeared/aLen>12 aPacket[0]=0x51 aPacket[6]= 0x3b aPacket[7] == 0x00 (&gu.dwUnitID, aPacket + 2, 4)
//Static Object Spawned/aLen > 12 (&unit.dwUnitID, aPacket + 2, 4)(&x, aPacket + 8, 2)(&y, aPacket + 10, 2)
//Packet 51 02 - world entity update
//(&wFingerPrint, aPacket + 6, 2)
51 //14 Identifies Close Objects
51 02 [DWORD ID][WORD object ID][DWORD Coordinates X,Y][WORD state]
51 02 1A 00 00 00 25 00 A9 16 B8 11 02 00
0E 02 1A 00 00 00 03 00 02 00 00 00
51 02 19 00 00 00 25 00 A9 16 EC 11 02 00
0E 02 19 00  00 00 03 00 02 00 00 00
51 if(aPacket[1] == 0x02 && aPacket[8] == 0x27 && aPacket[10] == 0xb9 && aLen==0x0e) {
            ::memcpy(&WpID,aPacket+2,4);
//14//abot
    if (aLen != 14 && aPacket[1] != 0x02) return aLen;
    {    WORD code;::memcpy(&code, aPacket + 6, 2);
        DWORD id=*((DWORD*)(aPacket + 2));
        POINT16 *p = (POINT16*)(aPacket+8);
        if (code == 0x0077 &&_wp1.id==0) // act1 wp
        {    _wp1.id=id;    _wp1.pos=*p;
        if (code == 0x010b &&_stash.id==0) // act1 wp
        {    _stash.id=id;    _stash.pos=*p;
52: Quest Related
53   
53 02 00 00 00 80 08 00 00 00  //10
53 02 00 00 00 00 11 00 00 00
53 02 00 00 00 80 19 00 00 00
54//blank?
54 00 00 00                         
54 69 60 00 A7 0F 5C 13 80
54 69 60 00 B2 0F 59 13 80 //9
54 69 F3 00 00 98 0F 63 13 80     
54 69 35 00 00 76 0F 4C 13 80                 
54 69 33 00 00 C0 14 93 18 80
54 69 35 00 00 D2 13 A0 13 80 //10               
54 4A 00 01 00 00 00 18 14 AD 13 80 //12   
54 4A 00 00 00 00 00 00 90 0F 50 13 80 //13                         
54 4A 00 00 00 00 00 00 8A 0F 52 13 80
55     //NPC Info
//(aLen == 13&& aPacket[0] == 0x55&& aPacket[11] == 0x80&& aPacket[12] == 0x01)
//(&wFingerPrint, aPacket + 5, 2)(ID, aPacket + 1, 4)(Location.x, aPacket + 7, 2)(Location.y, aPacket + 9, 2)
//npc update/(WORD*)(aPacket+5) == healer.entityID/(&healer.baseID, aPacket+1, 2)
56    // monster/NPC/merc/summonning spawn packet
if (aLen == 46&& aPacket[0] == 0x56)
{if (aPacket[15] != 0xff // friendly units&& aPacket[37] == 0x13) // merc token
        {::memcpy(&g_dwMercID, aPacket + 1, 4);    g_mem.SetBool(TRUE, MEM_MERCALIVE);
            //server->GamePrintInfo("Merc is
离线sccd
发帖
29
金钱
0
91币
0
信誉
0
资产
0 IST
在线时间
18 小时
注册时间
2008-05-22
最后登录
2008-06-15
只看该作者 2524楼 发表于: 2008-06-01 18:11:00
顶一下啊
离线hqy
发帖
1850
金钱
187
91币
0
信誉
0
资产
0 IST
在线时间
260 小时
注册时间
2008-04-12
最后登录
2020-05-02
只看该作者 2525楼 发表于: 2008-06-01 18:12:26
按类型分类?(这算什么P话...)


COLD:
Cold Arrow
Ice Arrow
Freezing Arrow
Ice Bolt
Frost Nova
Ice Blast
Shiver Armor
Glacial Spike
Blizzard
Chilling Armor
Frozen Orb
Vengeance
Holy Freeze
Arctic Blast
Hurricane
Blades of Ice
Baal Cold Missiles
MonColdArrow
MonFreezingArrow
MephFrostNova
MonIceSpear
ShamanIce

FIRE:
Fire Arrow
Exploding Arrow
Immolation Arrow
Fire Bolt
Warmth
Inferno
Blaze
Fire Ball
Fire Wall
Enchant
Meteor
Fire Mastery
Hydra
Corpse Explosion
FireGolem
Holy Fire
VampireMeteor
Firestorm
Molten Boulder
Eruption
Fire Claws
Volcano
Armageddon
Fire Trauma
Fists of Fire
Wake of Fire Sentry
Dragon Tail
Inferno Sentry
Imp Inferno
mon death sentry
Baal Nova
MonFireArrow
MonExplodingArrow
Diablogeddon
NihlathakCorpseExplosion

LIGHTNING
Power Strike
Lightning Bolt
Charged Strike
Lightning Strike
Lightning Fury
Charged Bolt
Static Field
Telekinesis
Nova
Lightning
Chain Lightning
Thunder Storm
Holy Shock
Fist of the Heavens
Shock Field
Charged Bolt Sentry
Claws of Thunder
Lightning Sentry
Death Sentry
MonPowerStrike

MAGIC:
Teeth
Bone Spear
Bone Spirit
Holy Bolt
Blessed Hammer
Sanctuary
Concentrate
Frenzy
Berserk
DiabCold
Psychic Hammer
Baal Inferno
SuccubusBolt

POISON:
Poison Javelin
Plague Javelin
Poison Dagger
Poison Explosion
Poison Nova
Plague Poppy
Rabies
Venom

STUN:
Stun
Mind Blast
离线hqy
发帖
1850
金钱
187
91币
0
信誉
0
资产
0 IST
在线时间
260 小时
注册时间
2008-04-12
最后登录
2020-05-02
只看该作者 2526楼 发表于: 2008-06-01 18:16:00
Animation Frame
—Dtalon Fpa Specific
动作帧数—Dtalon详解

BY Louis-J
本帖出自:HOLY Clan和暗黑品网

感谢:
jrichard 对Fpa原理和Dtalon攻击特性的详尽论述,本贴许多资料和理论来自他
Brianc84 对C/C WSM公式的计算推导及提出Dtalon的极限为7/3/3/3……而非7/2/2/2……
Ruvanal 提出Rollback概念及对其的精彩论述

写这个帖子前后花费了4天的时间,期间查阅论证了许多资料数据并做了多次测试。本帖虽然主要是说Dtalon这个技能的攻击帧数,但其实是对D2所有动作运行帧数的一个剖析。
由于我个人对D2这个游戏的认识有效,难免有错误纰漏的地方,请LRs多多指正。


※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
完成一个动作所需的帧数公式
Frames Per Attack={HitShift*(FramePerDirection) / [AnimationSpeed*(BaseRate+SpeedIncrease)/100]}-1 


Fpa=Frames Per Attack 每次攻击帧数
HitShift=256 
FramePerDirection 动作长度
AnimationSpeed 动作速度
BaseRate 基础效率
SI=SpeedIncrease=Skill EIAS-100*Slow%-WSM+EIAS   
SpeedIncrease 速度增量
Skill EIAS 技能提供的EIAS:包括Asn的BoS(速度爆发),Pal的Fanaticism(狂热光环)
Slow% 减速效果:包括Slows Target(使目标减速),Clay Golem(土魔),Freeze(各种冰冻效果),Slow Missiles(缓慢攻击),Decrepify(衰老)等等。
WSM=Weapon Speed Modifier 武器基础速度
EIAS=Effective Increase Attack Speed = [120*IAS/(120+IAS)] 有效IAS
IAS=Increased Attack Speed=(120*EIAS)/(120-EIAS) 装备提速属性之和
{ } 向上取整
[ ] 向下取整
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※


※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
Animation:动作
Animation types:动作类型
Weapon types:武器类型
FramePerDirection:动作长度
AnimationSpeed:动作速度


在游戏中,无论角色什么时候做什么动作,包括走、跑、格挡、攻击,甚至站立不动,游戏都会有记录。在这个过程中,首先游戏确定其为什么动作,这取决于角色使用何种动作类型和武器类型;确定后,游戏就会运做这个动作直到下一个动作;再确定下一个为什么动作,运做这个动作到再下一个动作,周而复始。

与动作相关的参量是动作长度和动作速度。大多数动作的动作速度是256,但也不全是。
动作类型不同,动作长度和动作速度也会不同。
同一种动作类型,武器类型不同,动作长度和动作速度也会不同;至于Asn的踢击技能,用的都是鞋子-o-(确切的说不划分在武器类型之内),所以踢击技能的动作长度和动作速度都是一样的;一些动作类型的动作长度和动作速度不受武器类型的影响,比如打击恢复、施法动作,但还是受角色类型的影响(最直观的例子就是Nec的Human形态和Vampire形态其施法动作的速度就不同)。
当然,如果角色类型不同,即使动作类型和武器类型都相同,其动作长度也可能会有差异,比如Asn/Pal、Ama、Sor、Dru/Nec、Bar使用1HS的武器类型做Zeal的攻击,其动作长度就各不相同。
(说的有些拗口,希望大家能听懂-o-)



Animation types:动作类型 
(From PlrMode.txt)             
A1 – Attack 1 
A2 – Attack 2
BL – Blocking                 
DD - Death                     
DT – Death Throe 
GH – Get hit(hit recovery)             
KK - Kick                     
NU – Neutral(outside of town)
RN - Run                     
S1 – Skill 1
S2 – Skill 2 
S3 – Skill 3
S4 – Skill 4
SC – Spell casting
TH – Get Hit(in town)
TN – Neutral(in town)
TW – Walk(in town)
WL – Walk(outside of town)

Weapon types:武器类型
(From Weapons.txt) 
1HS - One Handed Swinging (axes, swords, flails, maces, hammers, clubs and wands)
1HT - One Handed Thrusting/Throwing* (Daggers, javelins, potions)
2HS - Two Handed Swords (swords)
2HT - Two Handed Thrusting (All Spear class weapons)
BOW – Bows (All Bow class weapons)
HT1 - Single wielded katars (Katar, Claw, Scissors type assassin class weapons)
HT2 - Dual wielded katars (Katar, claw, scissors type assassin class weapons)
HTH - Hand to Hand (Bare fists)
STF - Two handed Swinging (Staves, polearms, axes, mauls)
XBW – Crossbows (All Crossbow class weapons)
*注:throwing axes不属于1HT(One Handed Throwing)类型, 而属于1HS(one handed swinging)类型。

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※


※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
BaseRate:基础效率
SpeedIncrease:速度增量
Skill EIAS:技能提供的EIAS 
WSM:武器基础速度
EIAS:有效IAS
IAS:装备提速属性之和



BaseRate:基础效率
BaseRate只取决于角色使用何种动作类型,不受装备的影响,大多数的BaseRate为100。Asn的所有BaseRate除了格挡和打击恢复为 50及一些顺序攻击如(FoF/CoT/BoI/DC 为70,其实是个攻击速度惩罚-30,即100-30=70);DTail为60(攻击速度惩罚为-40,即100-40=60);其他都是100 。


(BaseRate+SpeedIncrease)
上限为175,这也是为什么攻击动作有急速封顶Fpa的原因。
关于下限,由于角色攻击时基本不考虑减速效果,则SpeedIncrease=Skill EIAS-WSM+EIAS=0-30+0=-30(武器的最慢WSM为30,关于C/C 的WSM在下面论述)。所以SI的下限为-30,所以基本上(BaseRate+SpeedIncrease)下限为100-30=70。
如果考虑减速效果,则(BaseRate+SpeedIncrease)=BaseRate+Skill EIAS-100*Slow%-WSM+EIAS,很显然能达到0甚至是负数的下限,但是当(BaseRate+SpeedIncrease) < BaseRate*15%,(BaseRate+SpeedIncrease)=BaseRate*15%,则基本上(BaseRate+ SpeedIncrease)下限为100*15%=15。


SI=SpeedIncrease:速度增量
=Skill EIAS-100*Slow%-WSM+EIAS
比如9级的BOS(Attack Speed +44),20%的减速效果,WSM=-10,EIAS=20
则SI=44-100*20%-(-10)+20=54


Skill EIAS:技能提供的EIAS
Skill EIAS = ((110*lvl) * (b-a))/(100 * (lvl+6)) + a
b=60,a=15(BoS速度爆发), 
b=40,a=10(Fanaticism狂热光环)
(from skillcalc.txt and skills.txt)
这个公式算出的EIAS和游戏中我们看到的数值个别级别有些出入,比如1级的BOS(Attack Speed +21),但用这个公式的话
Skill EIAS = ((110*lvl) * (b-a))/(100 * (lvl+6)) + a
SLVL 1 BOS EIAS=((110*1) * (60-15))/(100 * (1+6)) + 15=110*45 / 100*7 + (15)=22

其实稍微懂些java方面的语言就很好理解了
javascript:
function dm(l,a,b){
return a+dec((b-a)*dec(110*l/(l+6),0)/100,0)
}
其中a,b即相当于上面公式中的a,b;l 即相当于上面公式中的技能等级 Skill Lvl。
没学过也不要紧,看下面这个公式吧
IF LEVEL>0
Skill EIAS = a + ROUNDDOWN( (b-a)*ROUNDDOWN( 110*LEVEL / (LEVEL+6) ) /100) 
b=60,a=15,Level=1代入
=15 + ROUNDDOWN( 45*ROUNDDOWN(110*1/7) /100)
=15 + ROUNDDOWN( 45*ROUNDDOWN(15.xxx) /100)
=15 + ROUNDDOWN(45*15/100)
=15 + ROUNDDOWN(45*15/100)
=15 + ROUNDDOWN(6.75)
=15 + 6
=21
搞定。
(Skill EIAS只要看游戏中直接显示的数值就可以了,这个公式有兴趣的当消遣看吧- - !)


WSM:武器基础速度
当装备武器/盾牌或双手武器,没什么说的,就是我们在许多资料上常看到的那样,是该武器的WSM,如-10啊,0啊,30啊什么的。
当用双爪时
<1>先放屏幕左边装备槽,再放屏幕右边装备槽
WSMs=(right_WSM + left_WSM)/2 
例:两把爪的WSM分别为10和-30,则最终WSMs为-10 

<2>先放屏幕右边,再放屏幕左边(EIAS C/C Bug)
WSMs = (right_WSM + left_WSM)/2 + (right_WSM - left_WSM)
例:先把WSM为-30的放在屏幕右边,再把WSM为10的放在屏幕左边
WSMs = (-30+10)/2 +(-30–10)
= (-20)/2 + (-40)
= (-10) + (-40)
= -50
先把WSM为10的放在屏幕右边,再把WSM为-30的放在屏幕左边
WSMs = (10+(-30))/2 + (10-(-30))
= (-20)/2 + (40)
= (-10) + 40
= 30
当把WSM快的爪先放在屏幕右边时,就可以利用这个EIAS Bug了。
但是当角色在游戏中切换武器后,WSMs将变回<1>的状态- -!。
注:C/C bug对踢击有效。

EIAS:有效IAS
=Effective Increase Attack Speed = [120*IAS/(120+IAS)]
比如装备提供20IAS,则EIAS=[120*20/(120+20)] =17


EIAS/IAS 换算表格
+----+----+ +----+----+ +----+----+ +----+----+
|EIAS| IAS| |EIAS| IAS| |EIAS| IAS| |EIAS| IAS|
+----+----+ +----+----+ +----+----+ +----+----+
|  1|  2| |  31|  42| |  61| 125| |  91| 377|
|  2|  3| |  32|  44| |  62| 129| |  92| 395|
|  3|  4| |  33|  46| |  63| 133| |  93| 414|
|  4|  5| |  34|  48| |  64| 138| |  94| 434|
|  5|  6| |  35|  50| |  65| 142| |  95| 456|
|  6|  7| |  36|  52| |  66| 147| |  96| 480|
|  7|  8| |  37|  54| |  67| 152| |  97| 507|
|  8|  9| |  38|  56| |  68| 157| |  98| 535|
|  9|  10| |  39|  58| |  69| 163| |  99| 566|
|  10|  11| |  40|  60| |  70| 168| | 100| 600|
|  11|  13| |  41|  63| |  71| 174| | 101| 638|
|  12|  14| |  42|  65| |  72| 180| | 102| 680|
|  13|  15| |  43|  68| |  73| 187| | 103| 728|
|  14|  16| |  44|  70| |  74| 194| | 104| 780|
|  15|  18| |  45|  72| |  75| 200| | 105| 840|
|  16|  19| |  46|  75| |  76| 208| | 106| 909|
|  17|  20| |  47|  78| |  77| 215| | 107| 988|
|  18|  22| |  48|  80| |  78| 223| | 108|1080|
|  19|  23| |  49|  83| |  79| 232| | 109|1190|
|  20|  24| |  50|  86| |  80| 240| | 110|1320|
|  21|  26| |  51|  89| |  81| 250| | 111|1480|
|  22|  27| |  52|  92| |  82| 259| | 112|1680|
|  23|  29| |  53|  95| |  83| 270| | 113|1938|
|  24|  30| |  54|  99| |  84| 280| | 114|2280|
|  25|  32| |  55| 102| |  85| 292| | 115|2760|
|  26|  34| |  56| 105| |  86| 304| | 116|3480|
|  27|  35| |  57| 109| |  87| 317| | 117|4680|
|  28|  37| |  58| 113| |  88| 330| | 118|7080|
|  29|  39| |  59| 117| |  89| 345| | 119|14280
|  30|  40| |  60| 120| |  90| 360| | 120|inf |
+----+----+ +----+----+ +----+----+ +----+----+

注:这个换算表同样适用于EFCR/FCR、EFHR/FHR、EFBR/FBR的相互换算。


IAS:装备提速属性之和
=Increased Attack Speed=(120*EIAS)/(120-EIAS) 这个是和EIAS的换算公式
很简单,装备上所有的IAS叠加起来。
如果是双爪,只算先装备的爪上的IAS(如果切换后,则只算屏幕左方即手套上面爪的IAS,也是大家常说的主爪位置):这个只相对使用主爪攻击如TS、CS、PS和踢击技能及陷阱放置而言。
一些双爪轮流击打如normal attack、FoF、CoT、BoI包括WW,则只算当前攻击爪的IAS。
离线hqy
发帖
1850
金钱
187
91币
0
信誉
0
资产
0 IST
在线时间
260 小时
注册时间
2008-04-12
最后登录
2020-05-02
只看该作者 2527楼 发表于: 2008-06-01 18:16:22
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ 
Frame:帧数
Fpa:每次攻击帧数
Increment:增量
Terminating_value:终止值
AFrame:计数范围
Counter:计数值
ticks:计数



Frame:帧数
D2 每秒运行25Frames。意思是指游戏每秒刷新你的屏幕画面25次,即每0.04秒刷新一次屏幕画面。如果你在游戏里用/fps的命令(frames per second 每秒运行帧数),你会看见每秒的Frames会超过25(这个越高越好啦-o-)。这只是指你的系统可以超过25fps,不是指D2这个游戏能超过 25fps。每秒运行25帧是D2这个游戏的程序设定,是不能改变的。


Fpa(Frames per attack):(完成)一次攻击(所需)帧数
比如说一种攻击的速度是7Fpa,意思是指完成这个动作需要7帧。


Increment:增量
= [AnimationSpeed * (BaseRate + SpeedIncrease) / 100]
数值越大,则攻击速度越快。如前面所说的,由于(BaseRate + SpeedIncrease)有上下限, 所以Increment也有上下限。


Terminating_value:终止值
Terminating_value= 256*FramePerDirection

比如动作长度为5,则终止值为1280。
把这个终止值按256分解成5个计数范围
0-255
256-511
512-767
768-1023
1023-1279
即到1279时,整个动作完成。之所以没有1280,是因为从0开始计数。

AFrame:计数范围
Counter:计数值
AFrame表示一个计数范围, 如0 - 255表示AFrame为00,256-511表示AFrame为01。
如果一个计数值为4000,则/256后为15.625,舍去小数,此时的AFrame为15。



Counter/AFrame 对照图表
Counter value    AFrame displayed    Counter value    AFrame displayed
0 - 255                00              3328 - 3583          13
256 - 511              01              3584 - 3839          14
512 - 767              02              3840 - 4095          15
768 - 1023              03              4096 - 4351          16
1024 - 1279            04              4352 - 4607          17
1280 - 1535            05              4608 - 4863          18
1536 - 1791            06              4864 - 5119          19
1792 - 2047            07              5120 - 5375          20
2048 - 2303            08              5376 - 5631          21
2304 - 2559            09              5632 - 5887          22
2560 - 2815            10              5888 - 6143          23
2816 - 3071            11              6144 - 6399          24
3072 - 3327            12 



ticks:计数
许多资料和帖子在解析游戏中的Animation(动作)信息的时候都会提到这个词。这个计数有什么用?让游戏知道一个动作什么时候结束?不是,这只是为了让大家比较直观的了解一个攻击动作的完成所需Fpa而引入的一个游戏程序计数器。


下面举个例子,还是以上面的动作长度5为例,假设某个动作的动作速度为256,基础效率为100,速度增量为0。
这个动作的各项参量:
AnimationSpeed = 256
FramePerDirection = 5 ( Aframe从00到04,共5个Aframe)
BaseRate = 100
SpeedIncrease = 0

Terminating_value = 256* FramePerDirection = 256*5 = 1280
Increment = [AnimationSpeed * (BaseRate + SpeedIncrease) / 100] = 256*(100 + 0) / 100=256*100/100 = 256

  1. 从0开始计数,动作开始
  2. Game tick 1
  3. counter增加, counter=256
  4. counter < 1280 动作继续
  5. Aframe = 01(看上面的对照表counter=256时,Aframe = 01)
  6. Game tick 2
  7. counter增加, counter=512
  8. counter < 1280
  9. Aframe = 02 
  10. Game tick 3
  11. counter增加, counter=768
  12. counter < 1280
  13. Aframe = 03
  14. Game tick 4
  15. counter增加, counter=1024
  16. counter < 1280
  17. Aframe = 04
  18. Game tick 5
  19. counter增加, counter=1280
  20. counter>=1280
  21. 动作结束,寻找下一个动作,counter重新计数,下一个动作从这个tick开始。


由于1279时动作就结束,所以Game tick 5将作为下一个动作的Game tick 1(下一个动作从这个tick开始)。而不算在这个假设的动作中。即从tick 1到tick 4共4ticks整个动作完成。就是说这个假设的动作速度增量SI为0时,可达到4Fpa(完成这个动作需4帧)。


上面是个很简单的例子,下面我们再考虑SI分别为-1、24、25这3种状态。其他参量都不变。
SI=-1,Increment = [256*(100-1) / 100]=[256*99/100] = 253
SI=24,Increment = [256*(100+24) / 100]=[256*124/100] = 317
SI=25,Increment = [256*(100+25) / 100]=[256*125/100] = 320

  1. 动作开始
  2. Game tick 1
  3. SI=-1,counter=253 Aframe=00
  4. SI=24,counter=317 Aframe=01
  5. SI=25,counter=320 Aframe=01
  6. Game tick 2
  7. SI=-1,counter=506 Aframe=01
  8. SI=24,counter=634 Aframe=02
  9. SI=25,counter=640 Aframe=02
  10. Game tick 3
  11. SI=-1,counter=751 Aframe=02
  12. SI=24,counter=951 Aframe=03
  13. SI=25,counter=960 Aframe=03
  14. Game tick 4
  15. SI=-1,counter=1012 Aframe=03
  16. SI=24,counter=1268 Aframe=04
  17. SI=25,counter=1280 动作结束
  18. Game tick 5 
  19. SI=-1,counter=1265 Aframe=04
  20. SI=24,counter=1585 动作结束
  21. Game tick 6
  22. SI=-1,counter=1518 动作结束


可见,SI=0时,动作在tick 4就完成;而SI=-1时,动作在tick 5完成。
SI=25时,动作在tick 3就完成;而SI=24时,动作在tick 4完成。
-1-,0,25就代表了这个动作Fpa所需SI的3个档次。
一般情况不考虑Slow影响,SI=Skill EIAS-WSM+EIAS,Skill EIAS和WSM都是已知的,只要知道EIAS的数值,就能知道一个动作的Fpa是多少了。而这个EIAS就取决于你装备上提供的IAS。
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
离线hqy
发帖
1850
金钱
187
91币
0
信誉
0
资产
0 IST
在线时间
260 小时
注册时间
2008-04-12
最后登录
2020-05-02
只看该作者 2528楼 发表于: 2008-06-01 18:16:48
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
Dtalon:龙爪
Rollback:回退特性
Initial Kicks:最初踢击
Follow-Up Kicks:后续踢击
FrameDataActionFlag:发生回退特性标记点



Rollback这个概念的解释最早是由Ruvanal在lurkerlounge上给出的,简单的说,就是相对角色完成一个完整动作,具有 Rollback特性的只完成其中的某些部分。一些拥有Rollback特性的技能有Fend(Ama的击退技能)、Strafe(Ama的炮轰技能)、 Jab(Ama的戳刺技能)、Zeal(Pal的热诚技能)、Fury(Dru的狂怒技能)和Dragon Talon(Asn的龙爪技能),它们共有的特征就是在一次攻击中包括多重打击。这些技能的% Rollback各有不同,比如Zeal/Dtalon为100%,Strafe为50%。   

Dtalon的整个踢击动作包括最后1次踢击(Dtalon只有1 kick的这次踢击也算在最后1次踢击范畴内)和前面的几次多重踢击。通常我们把这最后1次踢击称为Initial Kicks(最初踢击),反而把前面的几次多重踢击称为Follow-Up Kicks(后续踢击),这是一个叫法的习惯问题。比如我们说7/3/3/3,如果按踢击顺序的话应该是3/3/3/7;这样会让许多人认为第1次踢击是 7Fpa,其实正确的认识是第1次→第3次这3次多重踢击为3Fpa,最后一次踢击为7Fpa。

下面就用Counter/AFrame理论来说说DTalon的Rollback。为了完成Dtalon的多重踢击,Counter将回退,也就是 AFrame值将会重复,由于Dtalon是个100% Rollback技能,所以发生Rollback时Counter将回退到0然后开始对多重踢击进行计数。一个关于Rollback的参量是 FrameDataActionFlag,如果到达这个标记点,表示一次多重踢击结束。Dtalon的FrameDataActionFlag=04。


举个简单的2 kicks的例子。
Dtalon的各项参量数值
AnimationSpeed = 256
FramePerDirection = 13 (Aframe从00到12)
FrameDataActionFlag = 04
BaseRate = 100
假设其SI = 0 

其增量和终止值分别为
Increment = [AnimationSpeed * (BaseRate + SpeedIncrease) / 100] = [256*100 / 100] = 256
Initial Kicks的终止值Terminating_value = 256* FramePerDirection = 256*13 = 3328
Follow-Up Kicks的终止值Terminating_value = 256* FrameDataActionFlag = 256*4 = 1024 

  1. 动作开始
  2. Game tick 1
  3. counter增加, counter=256
  4. counter<3328
  5. Aframe=01 
  6. counter<1024 
  7. Game tick 2
  8. counter增加,counter=512
  9. counter<3328 
  10. Aframe=02 
  11. counter<1024 
  12. Game tick 3
  13. counter增加, counter=768
  14. is counter<3328 
  15. Aframe=03 
  16. counter<1024 
  17. Game tick 4
  18. counter增加, counter=1024
  19. counter<3328 
  20. Aframe=04 
  21. counter>=1024 
  22. 第1次(多重)踢击结束,寻找下一个动作
  23. counter回复到0
  24. Game tick 5
  25. counter增加, counter=256
  26. counter<3328 
  27. Aframe=01 
  28. counter<1024 
  29. 第2次踢击开始
  30. Game tick 6
  31. counter增加, counter=512
  32. counter<3328 
  33. Aframe=02 
  34. counter<1024
  35. Game tick 7
  36. counter增加, counter=768
  37. counter<3328 
  38. Aframe=03 
  39. counter<1024
  40. Game tick 8
  41. counter增加, counter=1024
  42. counter<3328 
  43. Aframe=04 
  44. counter>=1024 
  45. Game tick 9
  46. counter增加, counter=1280
  47. counter<3328 
  48. Aframe=05 
  49. counter>=1024 
  50. 第1次(多重)踢击在 tick 4已完成,counter不需要rolled back到0
  51. 第2次踢击继续 
  52. .
  53. .
  54. .
  55. .
  56. Game tick 16
  57. counter增加, counter=3072
  58. counter<3328 
  59. Aframe=12 
  60. counter>=1024 
  61. 第1次(多重)踢击在 tick 4已完成,counter不需要rolled back到0
  62. 第2次踢击继续
  63. Game tick 17
  64. counter增加, counter=3328
  65. counter>=3328
  66. 整个踢击结束


从这里我们可以看出,第1次踢击从tick 1 到 tick 4完成共4ticks,第2次踢击从tick 5 to tick 16完成共12ticks,整个过程一共是16ticks,即第1次踢击为4Fpa,第2次踢击为12Fpa,整个踢击共16Fpa。按习惯,我们会说这次踢击的Fpa为12/4。
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※



※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
DTalon Fpa公式
Initial Kick Frames={256*(FramePerDirection) / [AnimationSpeed*(BaseRate+SpeedIncrease)/100]}-1 
Follow-Up Kick Frames={256*(FrameDataActionFlag) / [AnimationSpeed*(BaseRate+Speed_Increase)/100]}
Follow-Up Kicks的Fpa极速上下限 
Initial Kicks的Fpa极速上下限



DTalon Follow-Up Kicks的Fpa极速上限 
前面说过(BaseRate + SpeedIncrease)的上限为175
Increment = [AnimationSpeed * (BaseRate + SpeedIncrease) / 100]
= [256 * 175 / 100] = 448
增量Increment的上限就是448
Initial Kicks的终止值Terminating_value = 256* FramePerDirection = 256*13 = 3328
Follow-Up Kicks的终止值Terminating_value = 256* FrameDataActionFlag = 256*4 = 1024

以2 Kicks为例
  1. 动作开始
  2. Game tick 1
  3. counter增加,counter=448
  4. counter<3328
  5. Aframe=01 
  6. counter<1024 
  7. Game tick 2
  8. counter增加,counter=896
  9. counter<3328 
  10. Aframe=03 
  11. counter<1024
  12. Game tick 3
  13. counter增加,counter=1344
  14. counter<3328
  15. Aframe=05 
  16. counter>=1024
  17. ? ? ? ? ? ? ? 


暂且在这里停止。从tick 1到tick 3共 3 ticks,counter在哪里回复到0?第1次踢击从tick 1到tick 几?下次踢击从哪个tick开始?能达到tick 2 (2Fpa)吗?其实这个问题前面已经有答案了。

前面最早的那个例子有这么一句话:下一个动作从这个tick开始
即终止值不算在一次动作内,反映在帧数公式上就是最后的“ - 1 ”
Fpa={256*(FramePerDirection) / [AnimationSpeed*(BaseRate+SI)/100]}-1
如果这个公式也适用于DTalon的Follow-Up多重踢击的话,那么显然,Follow-Up Kicks是能达到2Fpa的。

啊啊啊~````不要急不要急 - -!
看看刚开始说Dtalon的那个简单的2 kicks例子

Game tick 4
counter增加, counter=1024
counter<3328 
Aframe=04 
counter>=1024 
第1次(多重)踢击结束,寻找下一个动作
counter回复到0

Game tick 5
counter增加, counter=256
counter<3328 
Aframe=01 
counter<1024 
第2次踢击开始
虽然counter在这个tick 4将回复到0,但是新的动作将从下一个tick开始而不是从这个tick开始。因而,不需要“ - 1 ”。

所以第1次踢击是从tick 1到tick 3共 3 ticks,下一个动作从tick 4开始,即Follow-Up Kicks的极速上限Fpa为3,HOHO,大功告成 -o- 。


DTalon Initial Kicks的Fpa极速上限
继续上面的增量上限448的例子

  1. 动作开始
  2. Game tick 1
  3. counter增加,counter=448
  4. counter<3328
  5. Aframe=01 
  6. counter<1024 
  7. Game tick 2
  8. counter增加,counter=896
  9. counter<3328 
  10. Aframe=03 
  11. counter<1024
  12. Game tick 3
  13. counter增加,counter=1344
  14. counter<3328
  15. Aframe=05 
  16. counter>=1024
  17. 第1次(多重)踢击结束,寻找下一个动作
  18. counter回复到0
  19. Game tick 4
  20. counter增加,counter=448
  21. counter<3328
  22. Aframe=01 
  23. counter<1024 
  24. 第2次踢击开始
  25. Game tick 5
  26. counter增加,counter=896
  27. counter<3328 
  28. Aframe=03 
  29. counter<1024
  30. Game tick 6
  31. counter增加,counter=1344
  32. counter<3328
  33. Aframe=05 
  34. counter>=1024
  35. 第1次(多重)踢击在 tick 4已完成,counter不需要rolled back到0
  36. 第2次踢击继续
  37. .
  38. .
  39. .
  40. .
  41. Game tick 10
  42. counter增加,counter=3136
  43. counter<3328
  44. Aframe=12 
  45. counter>=1024
  46. 第1次(多重)踢击在 tick 4已完成,counter不需要rolled back到0
  47. 第2次踢击继续
  48. Game tick 11
  49. counter增加,counter=3584
  50. counter>=3328
  51. Aframe=14 
  52. counter>=1024
  53. 整个踢击结束,寻找新的动作,counter重新计数,下一个动作从这个tick开始。


可见Initial Kicks从tick 4到tick 10共7ticks,即7Fpa。
所以Dtalon的极速上限为7/3/3/3/3/3 Fpa。


如果你是从头开始看到这里的话,应该有些明白了吧:)。
要是连续2次Dtalon 2kick,这2次之间的下一个动作从这个tick开始怎么理解呢?看下面这个例子。
连续2次Dtalon 2kick 极速3/7

  1. 动作开始
  2. Game tick 1
  3. counter增加,counter=448
  4. counter<3328
  5. Aframe=01 
  6. counter<1024 
  7. Game tick 2
  8. counter增加,counter=896
  9. counter<3328 
  10. Aframe=03 
  11. counter<1024
  12. Game tick 3
  13. counter增加,counter=1344
  14. counter<3328
  15. Aframe=05 
  16. counter>=1024
  17. 第1次(多重)踢击结束,寻找下一个动作
  18. counter回复到0
  19. Game tick 4
  20. counter增加,counter=448
  21. counter<3328
  22. Aframe=01 
  23. counter<1024 
  24. 第2次踢击开始
  25. Game tick 5
  26. counter增加,counter=896
  27. counter<3328 
  28. Aframe=03 
  29. counter<1024
  30. Game tick 6
  31. counter增加,counter=1344
  32. counter<3328
  33. Aframe=05 
  34. counter>=1024
  35. 第1次(多重)踢击在 tick 4已完成,counter不需要rolled back到0
  36. 第2次踢击继续
  37. .
  38. .
  39. .
  40. .
  41. Game tick 10
  42. counter增加,counter=3136
  43. counter<3328
  44. Aframe=12 
  45. counter>=1024
  46. 第1次(多重)踢击在 tick 4已完成,counter不需要rolled back到0
  47. 第2次踢击继续
  48. Game tick 11
  49. counter增加,counter=3584
  50. counter>=3328
  51. Aframe=14 
  52. counter>=1024
  53. 第1次Dtalon结束,找到第2次Dtalon的动作,counter重新计数回复到0,第2次Dtalon从这个tick开始。
  54. Game tick 11
  55. counter增加,counter=448
  56. counter<3328
  57. Aframe=01 
  58. counter<1024 
  59. Game tick 12
  60. counter增加,counter=896
  61. counter<3328 
  62. Aframe=03 
  63. counter<1024
  64. Game tick 13
  65. counter增加,counter=1344
  66. counter<3328
  67. Aframe=05 
  68. counter>=1024
  69. 第1次(多重)踢击结束,寻找下一个动作
  70. counter回复到0
  71. Game tick 14
  72. counter增加,counter=448
  73. counter<3328
  74. Aframe=01 
  75. counter<1024 
  76. 第2次踢击开始
  77. Game tick 15
  78. counter增加,counter=896
  79. counter<3328 
  80. Aframe=03 
  81. counter<1024
  82. Game tick 16
  83. counter增加,counter=1344
  84. counter<3328
  85. Aframe=05 
  86. counter>=1024
  87. 第1次(多重)踢击在 tick 13已完成,counter不需要rolled back到0
  88. 第2次踢击继续
  89. .
  90. .
  91. .
  92. .
  93. Game tick 20
  94. counter增加,counter=3136
  95. counter<3328
  96. Aframe=12 
  97. counter>=1024
  98. 第1次(多重)踢击在 tick 13已完成,counter不需要rolled back到0
  99. 第2次踢击继续
  100. Game tick 21
  101. counter增加,counter=3584
  102. counter>=3328
  103. Aframe=14 
  104. counter>=1024
  105. 第2次Dtalon结束,寻找下一个动作,counter重新计数,下一个动作从这个tick开始。


即第1次Dtalon
从tick 1到tick 3,共3ticks 即3fpa。
从tick 4到tick 10,共7ticks 即7fpa。

第2次Dtalon
从tick 11到tick 13,共3ticks 即3fpa。
从tick 14到tick 20,共7ticks 即7fpa。


至于下限的问题,前面说过基本不考虑Slow的因素,SI的下限为-30,(BaseRate+SI)下限为100-30=70。
就由Dtalon的Fpa公式直接计算了,18/6/6/6/6/6。


Initial Kick Frames={256*(FramePerDirection) / [AnimationSpeed*(BaseRate+SpeedIncrease)/100]}-1 
Follow-Up Kick Frames={256*(FrameDataActionFlag) / [AnimationSpeed*(BaseRate+Speed_Increase)/100]}

AnimationSpeed = 256
FramePerDirection = 13 
FrameDataActionFlag = 4
BaseRate = 100



DTalon Initial Kick SI Table:
+------+-----+
|  SI  | Fpa |
+------+-----+
| -30  |  18 |
| -27  |  17 |
| -23  |  16 |
| -18  |  15 |
| -13  |  14 |
|  -7  |  13 |
|  0  |  12 |
|  9  |  11 |
|  19  |  10 |
|  31  |  9 |
|  45  |  8 |
|  63  |  7 |
+------+-----+

DTalon Follow-Up Kick SI Table:
+------+-----+
|  SI  | Fpa |
+------+-----+
| -30  |  6 |
| -19  |  5 |
|  0  |  4 |
|  34  |  3 |
+------+-----+


顺便举个例子:1级Bos(Attack Speed +21),拿双爪:主爪巨鹰爪(-30WSM/0IAS),副爪绿爪(0WSM/40IAS),其他装备提供20IAS,Dtalon能达到多少Fpa?

<1>不考虑C/C bug
SI=Skill EIAS-WSM+EIAS 
= 21 - (-30+0)/2 + [120*20 / (120+20)]
= 21 + 15 + 17
= 53
能达到8/3/3/3/3……。(绿爪的IAS怎么不算在内?啊啊啊,什么?踢击技能只算主爪的IAS?答对-o-)

<2>考虑C/C bug
SI=Skill EIAS-WSM+EIAS 
= 21 -[(-30+0)/2  +(-30-0)] + [120*20 / (120+20)]
= 21 + 45 + 17
= 83
能达到7/3/3/3……极速。
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※



※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
到这里这个帖子算是结束了,其实举一反三的话,我们还可以计算其他动作的帧数。 

Spell Casting:施法动作
Asn的施法动作有Psychic Hammer(心灵战锤),Cloak of Shadows(魔影斗篷)和Mindblast(精神爆震),IAS, WSM和BoS对他们的速度都没有影响,FCR决定了施展他们的快慢。

一个非常有趣的技能就是Dragon Flight(飞龙在天),FCR决定了它的初始cast速度,传送到目标面前后的踢击动作则取决于Asn的IAS、WSM和BOS等这些EIAS特性(即SI),HOHO,完美的结合。

再顺便说说Teleport(瞬移)吧,现在已经不是Sor的专利了。假设Asn的Cast Rate Frames为9帧,从A点TP到B点,那这9帧的动作是在哪里完成?A点全部、B点全部、A→B整个过程?
答案是A→B整个过程(上面的DF也是如此),以前一直有存疑,这次终于了解了,施法动作和攻击动作的原理是一样的,算是拨乱反正吧。

EFCR=Effective Faster Cast Rate:有效FCR
FCR=Faster Cast Rate:快速施法速度
EFCR = [(120 * FCR)/(120 + FCR)]
相应的,EFCR也可转换为FCR:FCR = (120 * EFCR)/(120-EFCR)

Asn施法动作的各项参量及公式
Cast Rate Frames = {256*(FramePerDirection) / [AnimationSpeed*(BaseRate+EFCR)/100]}-1 
AnimationSpeed = 256
FramePerDirection = 17
BaseRate = 100



+-----+------+
| FCR |Frames|
+-----+------+
|  0 |  16  |
|  8 |  15  |
|  16 |  14  |
|  27 |  13  |
|  42 |  12  |
|  65 |  11  |
| 102 |  10  |
| 174 |  9  |
+-----+------+




Hit Recovery(打击恢复)和Blocking(格挡动作)
和施法动作类似。

EFCR=Effective Faster Hit Recovery:有效FHR
FHR=Faster Hit Recovery:快速打击恢复
EFHR = [(120 * FHR)/(120 + FHR)]

Asn打击恢复的各项参量及公式
Hit Recovery Frames = {256*(FramePerDirection) / [AnimationSpeed*(BaseRate+EFHR)/100]}-1 
AnimationSpeed = 256
FramePerDirection = 5
Base = 50



+-----+------+
| FHR |Frames|
+-----+------+
|  0 |  9  |
|  7 |  8  |
|  15 |  7  |
|  27 |  6  |
|  48 |  5  |
|  86 |  4  |
| 200 |  3  |
+-----+------+



EFBR=Effective Faster Block Rate:有效FBR
FBR=Faster Block Rate:快速格挡速度
EFBR = [(120 * FBR)/(120 + FBR)]+ Skill Bonus

Asn快速格挡的各项参量及公式
Block Rate Frames = {256*(FramePerDirection) / [AnimationSpeed*(BaseRate+EFBR)/100]}-1 
AnimationSpeed = 256
FramePerDirection = 3
Base = 50 



+-----+------+
| FBR |Frames|
+-----+------+
|  0 |  5  |
|  13 |  4  |
|  32 |  3  |
|  86 |  2  |
| 600 |  1  |
+-----+------+



收工。
离线hqy
发帖
1850
金钱
187
91币
0
信誉
0
资产
0 IST
在线时间
260 小时
注册时间
2008-04-12
最后登录
2020-05-02
只看该作者 2529楼 发表于: 2008-06-01 18:17:17
以下发现自battlecn,指的是官服bn



今天晚上挂了一会KPbot
查看战果时发现经验值少了不少
原来是我去KB room蹭级时把副手的spirit换到正手来了
于是F11暂停bot,想帮他把副手拿着的wmd换回来
但得到提示pindlebot运行中,不允许切换武器
于是输入.unload pindlebot 终止bot运行,换回了wmd
接下来是最关键的--
我为了继续运行bot
输入.load pindlebot重新加载pindlebot.d2h模块
这时只见bot按老路线走下左边的台阶
头顶上突然出现提示说需要复活佣兵,同时向夸尔凯克走去
可这会pet不是活蹦乱跳的,没有死啊,它复活个什么劲呢?
正疑惑间,bot和夸尔凯克说了句话,然后继续去kp,退出游戏
等再进入游戏,我才发现,pet呢?pet哪去了?
bot头上又提示需要复活pet,再次跟那个夸尔凯克说话,但pet却还是没有出现。。。
我一惊,难道遇到了传说中的丢pet!!??
赶快关了bot,手动进游戏,结果
。。。。。
pet消失了--
我从act1到act5和npc说话,都没有出现复活pet的选项
出现的选项跟我还没雇过pet时出现的选项一样
就这样,pet在我的眼皮底下消失了,彻彻底底的没了...

一阵之后,我仔细回顾以上过程,作出几点猜想和结论,供大家讨论:

1.很多没经历过丢pet的人以为,丢pet是bot不小心在复活pet时点错了,点成了雇佣,结果雇了个新的,原来的就没了。
照这种说法,若真是是雇了新的而把原来的取代了,那跟npc对话时也应该出现复活pet的选项,只不过复活的是那个新雇的pet。
但,事实是--没有复活选项--pet不是被取代了,而是,完完全全没了!
另外,丢pet也不是像有人说的被act4的吃尸体的怪物把尸体吃了造成的,更不是什么rpwt!

2.丢pet触发条件:在pet活着的情况下,进行复活pet的操作。
这和我们知道的一点也不矛盾:
1)lag时容易丢pet。因为lag时bot去复活pet,本来已经复活了,但由于lag,bot又向服务器发送了复活的指令,于是。。。
2)手动玩怎么没见有人丢过pet。因为手动玩,在pet活着的情况下,npc那里根本不会有复活pet的选项。
这一结论可以用sniffer测试一下:先手动复活pet,用sniffer记录下这时向bn发送的数据,然后在pet活着的时候,模拟这个数据的发送,看pet是不是就丢了!
由于我手头没有sniffer,无法测试,希望那位lr测试一下。

3.丢pet不是某个bot的特别现象,而是bot进行操作的特殊性决定的(我们是通过游戏的界面和鼠标键盘操作间接发送某个动作的信息给服务器,而 bot可以直接发送某个动作的数据包给服务器)用abin的这个Pbot相信大家应该没丢过pet吧?这个bot在正常操作下应该是不会丢pet的, pet的丢失是由于我的非正常操作引起的
(可能是我的unload使bot记录pet生死状态的开关被清空,而加载pindlebot.d2h时又会根据这个开关决定是否复活pet,我的操作使bot产生了错误的判断)

4.对丢pet原因的一点猜想(纯属猜想,不过与我所知倒也并无矛盾之处,望指正):
1)pet的生死状态在服务器上由某变量(记为M)记载(1为生,0为死)
  而复活pet的这一动作可以对其“取反”(注意,只是“取反”而非“置1”)
  结果:在pet活着时发送“复活pet”的指令,M取反成了0--pet就相当于死了
2)为什么npc复活pet的选项也没了呢?我想也许是这样:
  npc那里是否出现复活pet选项,可由一个变量(记N)控制(1为出现,0为不出现)
  其初值为0(在从未雇过pet时,自然不会有这个选项)
  雇佣pet后,以pet死亡或角色死亡作为条件,将该变量置1(出现),以发送“复活pet”指令为条件将其置0(不出现)
  结果:在发送过“复活pet”指令后,对话时便不会有复活选项(N被置0)
3)在已雇佣pet的情况下,M和N是不可能同时为0的--这是显然的:pet死了(M=0)才需要复活(N=1);pet没死(M=1),就没有复活的选项(N=0)。
  正常游戏中,只有一种情况才有M=N=0(无pet,也无复活选项),那就是还没有雇过pet!
  看到这,想一想,如果你是游戏制作者,是不是有充足的理由把M=N=0作为还没雇过pet的标志?           
4)bot的特殊性就导致了这个例外
  从1)和2)的结果看,在pet活着时发送“复活pet”的指令,M和N同时被置为了0,即置为了“无pet的状态”
  于是,pet消失了,一切表现得就像你从没雇过pet一样......
5)很多人看了上面的第1点,可能会想,既然发送“复活pet”的指令会使M取反,那么再让其发送一次“复活pet”的指令,pet不就又活了吗?
  我本来也试图用这个方法找回pet,但这显然行不通!
  我描述的过程就已经否定了这种可行性:bot再次进入游戏企图复活pet而再次发送了“复活pet指令”,但bot依然没有出现。
  为什么呢?因为在上个游戏中已经由M=N=0确定了“无pet的状态”,这一状态在退出游戏时已经被服务器保存下来了!
  而在无pet状态下,发送“复活pet”指令是毫无意义的。
人没有牺牲的话就什么都得不到
快速回复
限100 字节
 
上一个 下一个