Mercurial > mm7
annotate Items.h @ 1518:091c5eb46a0e
Fix size of byte_5111F6, it must include unk_511206 (as byte).
author | yoctozepto |
---|---|
date | Wed, 04 Sep 2013 15:27:01 +0200 |
parents | bfe342ae0c1f |
children | 2ae7139dde11 |
rev | line source |
---|---|
0 | 1 #pragma once |
1202 | 2 #include <array> |
0 | 3 |
1036 | 4 enum DAMAGE_TYPE:unsigned int |
5 { | |
6 DMGT_FIRE = 0, | |
7 DMGT_ELECTR = 1, | |
8 DMGT_COLD = 2, | |
9 DMGT_3 = 3, | |
10 DMGT_PHISYCAL= 4, | |
11 DMGT_5 = 5, | |
12 DMGT_SPIRIT = 6, | |
13 DMGT_MIND = 7, | |
14 DMGT_BODY = 8, | |
15 DMGT_DARK =10 | |
16 }; | |
0 | 17 |
18 | |
19 | |
20 /* 338 */ | |
463 | 21 enum ITEM_FLAGS :unsigned int |
0 | 22 { |
23 ITEM_IDENTIFIED = 0x1, | |
24 ITEM_BROKEN = 0x2, | |
25 ITEM_TEMP_BONUS = 0x8, | |
1455 | 26 ITEM_AURA_EFFECT_RED = 0x10,//16 |
27 ITEM_AURA_EFFECT_BLUE = 0x20,//32 | |
28 ITEM_AURA_EFFECT_GREEN = 0x40,//64 | |
29 ITEM_AURA_EFFECT_PURPLE = 0x80,//128 | |
0 | 30 ITEM_STOLEN = 0x100, |
31 ITEM_ENCHANTED = 0x200, | |
32 }; | |
33 | |
34 | |
377 | 35 enum ITEM_MATERIAL |
437 | 36 { |
377 | 37 MATERIAL_COMMON =0, |
38 MATERIAL_ARTEFACT = 1, | |
39 MATERIAL_RELIC = 2, | |
40 MATERIAL_SPECIAL = 3 | |
437 | 41 }; |
377 | 42 |
0 | 43 /* 330 */ |
44 enum ITEM_TYPE | |
45 { | |
46 ITEM_LONGSWORD_1 = 0x1, | |
47 ITEM_DAGGER_1 = 0xF, | |
48 ITEM_AXE_1 = 0x17, | |
49 ITEM_SPEAR_1 = 0x1F, | |
50 ITEM_CROSSBOW_1 = 0x2F, | |
51 ITEM_MACE_1 = 0x32, | |
52 ITEM_STAFF_1 = 0x3D, | |
816 | 53 ITEM_BLASTER = 64, |
54 ITEM_LASER_RIFLE = 65, | |
0 | 55 ITEM_LEATHER_1 = 0x42, |
56 ITEM_CHAINMAIL_1 = 0x47, | |
57 ITEM_PLATE_1 = 0x4C, | |
58 ITEM_BUCKLER_1 = 0x54, | |
59 ITEM_GAUNTLETS_1 = 0x6E, | |
60 ITEM_BOOTS_1 = 0x73, | |
490 | 61 ITEM_WAND_FIRE = 135, |
62 ITEM_WAND_STUN = 138, | |
0 | 63 ITEM_WAND_INCENERATION = 0x9F, |
64 ITEM_TROLL_BLOOD = 0xCA, | |
65 ITEM_DRAGON_EYE = 0xCC, | |
66 ITEM_HARPY_FEATHER = 0xCF, | |
67 ITEM_DEVIL_ICHOR = 0xD6, | |
68 ITEM_OOZE_ECTOPLASM_BOTTLE = 0xD9, | |
69 ITEM_POTION_BOTTLE = 0xDC, | |
1455 | 70 ITEM_SPELLBOOK_TORCHLIGHT = 400,//0x190 |
71 ITEM_SPELLBOOK_FIRE_STRIKE = 401,//0x191, | |
0 | 72 ITEM_SPELLBOOK_AIR_FEATHER_FALL = 0x19C, |
73 ITEM_SPELLBOOK_WATER_POISON_SPRAY = 0x1A7, | |
74 ITEM_SPELLBOOK_EARTH_SLOW = 0x1B2, | |
75 ITEM_SPELLBOOK_SPIRIT_BLESS = 0x1BD, | |
76 ITEM_SPELLBOOK_MIND_MIND_BLAST = 0x1C8, | |
77 ITEM_SPELLBOOK_BODY_FIRST_AID = 0x1D3, | |
78 ITEM_SPELLBOOK_BODY_HEAL = 0x1D6, | |
79 ITEM_SPELLBOOK_BODY_BREAK_POISON = 0x1D7, | |
80 ITEM_SPELLBOOK_LIGHT_LIGHT_BOLT = 0x1DD, | |
81 ITEM_SPELLBOOK_LIGHT_SUN_BURST = 0x1E6, | |
82 ITEM_SPELLBOOK_LIGHT_DIVINE_INTERVENTION = 0x1E7, | |
1455 | 83 ITEM_ARTIFACT_PUCK = 500,//0x1F4, |
513 | 84 ITEM_ARTICACT_GOVERNONS_ARMOR = 504,//1F8 |
85 ITEM_ARTIFACT_YORUBA = 505,//1F9 | |
305 | 86 ITEM_ARTIFACT_SPLITTER = 506,//1FA |
1080 | 87 ITEM_ARTIFACT_GHOULSBANE = 507,//1FA |
88 ITEM_ARTEFACT_ULLYSES =510, | |
513 | 89 ITEM_ARTIFACT_LEAGUE_BOOTS = 512,//200 |
1358
61010a655c94
a few itemID changed to their enum values + added a few new ones
Grumpy7
parents:
1202
diff
changeset
|
90 ITEM_RELIC_ETHRICS_STAFF = 515,//204 |
513 | 91 ITEM_RELIC_HARECS_LEATHER = 516,//204 |
1358
61010a655c94
a few itemID changed to their enum values + added a few new ones
Grumpy7
parents:
1202
diff
changeset
|
92 ITEM_RELIC_OLD_NICK = 517,//204 |
1080 | 93 ITEM_RELIC_KELEBRIM = 520,//208 |
513 | 94 ITEM_RELIC_TALEDONS_HELM = 521,//209 |
95 ITEM_RELIC_SCHOLARS_CAP = 522,//20A | |
96 ITEM_RELIC_PHYNAXIAN_CROWN = 523,//20B | |
97 ITEM_RILIC_TITANS_BELT = 524,//20C | |
98 ITEM_RELIC_TWILIGHT = 525,//20D | |
1358
61010a655c94
a few itemID changed to their enum values + added a few new ones
Grumpy7
parents:
1202
diff
changeset
|
99 ITEM_RELIC_JUSTICE = 527, |
61010a655c94
a few itemID changed to their enum values + added a few new ones
Grumpy7
parents:
1202
diff
changeset
|
100 ITEM_RELIC_MEKORIGS_HAMMER = 528, |
831 | 101 ITEM_ARTIFACT_HERMES_SANDALS = 529, |
513 | 102 ITEM_ARTIFACT_CLOAK_OF_THE_SHEEP = 530,//212 |
1358
61010a655c94
a few itemID changed to their enum values + added a few new ones
Grumpy7
parents:
1202
diff
changeset
|
103 ITEM_ARTIFACT_ELFBANE = 531,//212 |
513 | 104 ITEM_ARTIFACT_MINDS_EYE = 532,//214 |
105 ITEM_ELVEN_CHAINMAIL = 533,//215 | |
1358
61010a655c94
a few itemID changed to their enum values + added a few new ones
Grumpy7
parents:
1202
diff
changeset
|
106 ITEM_FORGE_GAUNTLETS = 534, |
831 | 107 ITEM_ARTIFACT_HEROS_BELT = 535,//217 |
108 ITEM_ARTIFACT_LADYS_ESCORT = 536, | |
513 | 109 ITEM_RARE_SHADOWS_MASK = 544,//220 |
110 ITEM_RARE_SUN_CLOAK = 547,//223 | |
111 ITEM_RARE_MOON_CLOAK = 548,//224 | |
112 ITEM_RARE_VAMPIRES_CAPE = 550,//226 | |
1358
61010a655c94
a few itemID changed to their enum values + added a few new ones
Grumpy7
parents:
1202
diff
changeset
|
113 ITEM_LICH_JAR_FULL = 601, |
61010a655c94
a few itemID changed to their enum values + added a few new ones
Grumpy7
parents:
1202
diff
changeset
|
114 ITEM_WETSUIT = 604, |
61010a655c94
a few itemID changed to their enum values + added a few new ones
Grumpy7
parents:
1202
diff
changeset
|
115 ITEM_LICH_JAR_EMPTY = 615, |
1387
297b6f192232
Player::SelectPhrasesTransaction finished, some constants changed to enum values, removed unused vars
Grumpy7
parents:
1358
diff
changeset
|
116 ITEM_RECIPE_REJUVENATION = 740, |
297b6f192232
Player::SelectPhrasesTransaction finished, some constants changed to enum values, removed unused vars
Grumpy7
parents:
1358
diff
changeset
|
117 ITEM_RECIPE_BODY_RESISTANCE = 771, |
0 | 118 }; |
119 | |
120 /* 331 */ | |
816 | 121 enum ITEM_EQUIP_TYPE: unsigned __int8 |
0 | 122 { |
816 | 123 EQUIP_OFF_HAND = 0, |
124 EQUIP_MAIN_HAND = 1, | |
125 EQUIP_BOW = 2, | |
126 EQUIP_ARMOUR = 3, | |
127 EQUIP_SHIELD = 4, | |
128 EQUIP_HELMET = 5, | |
129 EQUIP_BELT = 6, | |
130 EQUIP_CLOAK = 7, | |
1082 | 131 EQUIP_GAUNTLETS = 8, |
132 EQUIP_BOOTS = 9, | |
816 | 133 EQUIP_RING = 10, |
134 EQUIP_AMULET = 11, | |
135 EQUIP_WAND = 12, | |
136 EQUIP_REAGENT = 13, | |
137 EQUIP_POTION = 14, | |
138 EQUIP_SPELL_SCROLL = 15, | |
139 EQUIP_BOOK = 16, | |
1080 | 140 EQIUP_ANY = 16, |
816 | 141 EQUIP_MESSAGE_SCROLL = 17, |
142 EQUIP_GOLD = 18, | |
143 EQUIP_GEM = 19, | |
144 EQUIP_NONE = 20 | |
0 | 145 }; |
146 | |
147 | |
148 | |
149 /* 64 */ | |
150 #pragma pack(push, 1) | |
526 | 151 struct ItemGen //0x24 |
0 | 152 { |
153 //----- (0042EB25) -------------------------------------------------------- | |
1012 | 154 // inline ItemGen() |
155 // { | |
156 // Reset(); | |
157 // } | |
0 | 158 |
1113
39eaa6b00141
something to bool cast (performance warning) mostly fixed
Grumpy7
parents:
1082
diff
changeset
|
159 inline bool Broken() {return (uAttributes & ITEM_BROKEN) != 0;} |
39eaa6b00141
something to bool cast (performance warning) mostly fixed
Grumpy7
parents:
1082
diff
changeset
|
160 inline bool Identified() {return (uAttributes & ITEM_IDENTIFIED) != 0;} |
315 | 161 inline void SetIdentified() {uAttributes |= ITEM_IDENTIFIED;} |
1113
39eaa6b00141
something to bool cast (performance warning) mostly fixed
Grumpy7
parents:
1082
diff
changeset
|
162 inline bool Stolen() {return (uAttributes & ITEM_STOLEN) != 0;} |
749 | 163 inline void SetStolen() {uAttributes |= ITEM_STOLEN;} |
271 | 164 |
0 | 165 bool GenerateArtifact(); |
166 unsigned int GetValue(); | |
167 const char *GetDisplayName(); | |
168 const char *GetIdentifiedName(); | |
169 void UpdateTempBonus(__int64 uTimePlayed); | |
170 void Reset(); | |
385 | 171 int _439DF3_get_additional_damage(int *a2, bool *vampiyr); |
0 | 172 |
173 | |
174 | |
1019 | 175 int uItemID; //0 |
176 int uEnchantmentType; //4 | |
177 int _bonus_strength; //8 | |
178 int uSpecEnchantmentType; // 25 +5 levels //0c | |
816 | 179 // 16 Drain Hit Points from target. |
180 // 39 Double damage vs Demons. | |
181 // 40 Double damage vs Dragons | |
182 // 45 +5 Speed and Accuracy | |
183 // 56 +5 Might and Endurance. | |
184 // 57 +5 Intellect and Personality. | |
185 // 58 Increased Value. | |
186 // 60 +3 Unarmed and Dodging skills | |
187 // 61 +3 Stealing and Disarm skills. | |
188 // 59 Increased Weapon speed. | |
189 // 63 Double Damage vs. Elves. | |
190 // 64 Double Damage vs. Undead. | |
191 // 67 Adds 5 points of Body damage and +2 Disarm skill. | |
192 // 68 Adds 6-8 points of Cold damage and +5 Armor Class. | |
831 | 193 // 71 Prevents drowning damage. |
194 // 72 Prevents falling damage. | |
1019 | 195 int uNumCharges; //10 |
196 unsigned int uAttributes; //14 | |
0 | 197 unsigned __int8 uBodyAnchor; |
198 char uMaxCharges; | |
377 | 199 char uHolderPlayer; |
0 | 200 char field_1B; |
201 unsigned __int64 uExpireTime; | |
202 }; | |
203 #pragma pack(pop) | |
204 | |
205 | |
206 | |
207 /* 175 */ | |
208 #pragma pack(push, 1) | |
559 | 209 struct ItemDesc //30h |
229 | 210 { //Item # |Pic File|Name|Value|Equip Stat|Skill Group|Mod1|Mod2|material| |
211 ///ID/Rep/St|Not identified name|Sprite Index|VarA|VarB|Equip X|Equip Y|Notes | |
212 char *pIconName; //0 4 | |
213 char *pName; //4 8 | |
214 char *pUnidentifiedName; //8 c | |
215 char *pDescription; //0c 10 | |
216 unsigned int uValue; //10 14 | |
217 unsigned __int16 uSpriteID; //14 18 | |
218 __int16 field_1A; //16 | |
365 | 219 signed __int16 uEquipX; //18 1c |
220 signed __int16 uEquipY; //1a 1e | |
816 | 221 ITEM_EQUIP_TYPE uEquipType; //1c 20 |
229 | 222 unsigned __int8 uSkillType; //1d 21 |
223 unsigned __int8 uDamageDice; //1e 22 | |
224 unsigned __int8 uDamageRoll; //1f 23 | |
225 unsigned __int8 uDamageMod; //20 24 | |
226 unsigned __int8 uMaterial; //21 25 | |
227 char _additional_value; //22 26 | |
228 char _bonus_type; //23 27 | |
229 char _bonus_strength; //24 28 | |
230 char field_25; // 25 29 | |
231 char field_26; //26 2A | |
232 char field_27; // 27 2b | |
233 union | |
315 | 234 { |
229 | 235 unsigned __int8 uChanceByTreasureLvl[6]; |
236 struct { | |
237 unsigned __int8 uChanceByTreasureLvl1; // 28 2c | |
238 unsigned __int8 uChanceByTreasureLvl2; // 29 2d | |
239 unsigned __int8 uChanceByTreasureLvl3; // 2A 2e | |
240 unsigned __int8 uChanceByTreasureLvl4; // 2B 2f | |
241 unsigned __int8 uChanceByTreasureLvl5; // 2C 30 | |
242 unsigned __int8 uChanceByTreasureLvl6; // 2D 32 | |
243 }; | |
315 | 244 }; |
245 unsigned char uItemID_Rep_St; //2e 32 | |
246 char field_2f; | |
247 }; | |
0 | 248 #pragma pack(pop) |
249 | |
250 | |
251 | |
252 /* 177 */ | |
253 #pragma pack(push, 1) | |
254 struct ItemEnchantment | |
222 | 255 { //Bonus|Sta|Of Name|Arm|Shld|Helm|Belt|Cape|Gaunt|Boot|Ring|Amul |
256 char *pBonusStat; | |
257 char *pOfName; | |
258 /* union{ | |
259 struct { | |
260 unsigned char to_arm; | |
261 unsigned char to_shld; | |
262 unsigned char to_helm; | |
263 unsigned char to_belt; | |
264 unsigned char to_cape; | |
265 unsigned char to_gaunt; | |
266 unsigned char to_boot; | |
267 unsigned char to_ring; | |
268 unsigned char to_amul; | |
269 }; */ | |
270 unsigned char to_item[12]; | |
271 // }; | |
272 }; | |
0 | 273 #pragma pack(pop) |
274 | |
275 /* 178 */ | |
276 #pragma pack(push, 1) | |
559 | 277 struct ItemSpecialEnchantment //1Ch |
222 | 278 { //Bonus Stat|Name Add|W1|W2|Miss|Arm|Shld|Helm|Belt|Cape|Gaunt|Boot|Ring|Amul|Value|Lvl|Description fo special Bonuses and values |
279 | |
559 | 280 char *pBonusStatement; //0 |
281 char *pNameAdd; //4 | |
282 char to_item_apply[12]; //8 | |
283 int iValue; //14 | |
284 int iTreasureLevel; //18 | |
0 | 285 }; |
286 #pragma pack(pop) | |
287 | |
222 | 288 #pragma pack(push, 1) |
289 struct BonusRange | |
290 { | |
291 unsigned int minR; | |
292 unsigned int maxR; | |
293 }; | |
294 #pragma pack(pop) | |
193
821fd955c379
fixed potion data parsing. Somehow 3d render was affected
Gloval
parents:
0
diff
changeset
|
295 |
0 | 296 /* 176 */ |
297 #pragma pack(push, 1) | |
298 struct ItemsTable | |
299 { | |
300 void Initialize(); | |
301 void LoadPotions(); | |
302 void LoadPotionNotes(); | |
385 | 303 void GenerateItem(int treasure_level, unsigned int uTreasureType, ItemGen *pItem); |
0 | 304 void SetSpecialBonus(ItemGen *pItem); |
377 | 305 bool IsMaterialSpecial(ItemGen *pItem); |
306 bool IsMaterialNonCommon(ItemGen *pItem); | |
374 | 307 void Release(); |
0 | 308 |
222 | 309 int uAllItemsCount; |
310 ItemDesc pItems[800]; //4-9604h | |
311 ItemEnchantment pEnchantments[24]; //9604h | |
229 | 312 ItemSpecialEnchantment pSpecialEnchantments[72]; //97E4h -9FC4h |
224 | 313 char field_9FC4[5000]; |
0 | 314 char field_B348[5000]; |
315 char field_C6D0[5000]; | |
316 char field_DA58[5000]; | |
229 | 317 char field_EDE0[384]; |
222 | 318 unsigned __int16 potion_data[50][50]; // 77B2h*2=EF64h -102ECh |
319 unsigned __int16 potion_note[50][50]; // 8176h*2=102ECh -11674h | |
320 char *pItemsTXT_Raw; //11674h | |
0 | 321 char *pRndItemsTXT_Raw; |
222 | 322 char *pStdItemsTXT_Raw; //1167Ch |
323 char *pSpcItemsTXT_Raw; //11680h | |
224 | 324 unsigned int uChanceByTreasureLvlSumm[6]; //11684 |
325 unsigned int uBonusChanceStandart[6]; //1169c | |
326 unsigned int uBonusChanceSpecial[6]; //116B4 | |
327 unsigned int uBonusChanceWpSpecial[6]; //116cc -116e4 | |
222 | 328 unsigned int pEnchantmentsSumm[9]; //116E4h -11708h |
329 BonusRange bonus_ranges[6]; //45C2h*4 =11708h | |
224 | 330 unsigned int pSpecialEnchantmentsSumm[24]; //11738h |
331 unsigned int pSpecialEnchantments_count; //11798h | |
0 | 332 char field_1179C; |
315 | 333 char field_1179D; |
334 char field_1179E; | |
335 char field_1179F; | |
0 | 336 }; |
337 #pragma pack(pop) | |
338 | |
463 | 339 void GenerateStandartShopItems(); |
340 void GenerateSpecialShopItems(); | |
598 | 341 void GenerateItemsInChest(); |
0 | 342 |
1202 | 343 extern std::array<const char, 5> uItemsAmountPerShopType; // weak |
0 | 344 extern ItemGen *ptr_50C9A4; |
345 | |
377 | 346 extern struct ItemsTable *pItemsTable; |
347 | |
348 /* | |
349 +10 to all Resistances. 1 | |
350 +10 to all Seven Statistics. 2 | |
351 Explosive Impact! 3 | |
352 Adds 3-4 points of Cold damage. 4 | |
353 Adds 6-8 points of Cold damage. 5 | |
354 Adds 9-12 points of Cold damage. 6 | |
355 Adds 2-5 points of Electrical damage. 7 | |
356 Adds 4-10 points of Electrical damage. 8 | |
357 Adds 6-15 points of Electrical damage. 9 | |
358 Adds 1-6 points of Fire damage. 10 | |
359 Adds 2-12 points of Fire damage. 11 | |
360 Adds 3-18 points of Fire damage. 12 | |
361 Adds 5 points of Body damage. 13 | |
362 Adds 8 points of Body damage. 14 | |
363 Adds 12 points of Body damage. 15 | |
364 Drain Hit Points from target. 16 | |
365 Increases rate of Recovery. 17 | |
366 Wearer resistant to Diseases. 18 | |
367 Wearer resistant to Insanity. 19 | |
368 Wearer resistant to Paralysis. 20 | |
369 Wearer resistant to Poison. 21 | |
370 Wearer resistant to Sleep. 22 | |
371 Wearer resistant to Stone. 23 | |
372 Increased Knockback. 24 | |
373 +5 Level. 25 | |
374 Increases effect of all Air spells. 26 | |
375 Increases effect of all Body spells. 27 | |
376 Increases effect of all Dark spells. 28 | |
377 Increases effect of all Earth spells. 29 | |
378 Increases effect of all Fire spells. 30 | |
379 Increases effect of all Light spells. 31 | |
380 Increases effect of all Mind spells. 32 | |
381 Increases effect of all Spirit spells. 33 | |
382 Increases effect of all Water spells. 34 | |
383 Increases chance of Disarming. 35 | |
384 Half damage from all missile attacks. 36 | |
385 Regenerate Hit points over time. 37 | |
386 Regenerate Spell points over time. 38 | |
387 Double damage vs Demons. 39 | |
388 Double damage vs Dragons 40 | |
389 Drain Hit Points from target and Increased Weapon speed. 41 | |
390 +1 to Seven Stats, HP, SP, Armor, Resistances. 42 | |
391 +10 to Endurance, Armor, Hit points. 43 | |
392 +10 Hit points and Regenerate Hit points over time. 44 | |
393 +5 Speed and Accuracy. 45 | |
394 Adds 10-20 points of Fire damage and +25 Might. 46 | |
395 +10 Spell points and Regenerate Spell points over time. 47 | |
396 +15 Endurance and +5 Armor. 48 | |
397 +10 Intellect and Luck. 49 | |
398 +30 Fire Resistance and Regenerate Hit points over time. 50 | |
399 +10 Spell points, Speed, Intellect. 51 | |
400 +10 Endurance and Accuracy. 52 | |
401 +10 Might and Personality. 53 | |
402 +15 Endurance and Regenerate Hit points over time. 54 | |
403 +15 Luck and Regenerate Spell points over time. 55 | |
404 +5 Might and Endurance. 56 | |
405 +5 Intellect and Personality. 57 | |
406 Increased Value. 58 | |
407 Increased Weapon speed. 59 | |
408 +3 Unarmed and Dodging skills. 60 | |
409 +3 Stealing and Disarm skills. 61 | |
410 +3 ID Item and ID Monster skills. 62 | |
411 Double Damage vs. Elves. 63 | |
412 Double Damage vs. Undead. 64 | |
413 Double Damage vs. Titans. 65 | |
414 Regenerate Spell points and Hit points over time. 66 | |
415 Adds 5 points of Body damage and +2 Disarm skill. 67 | |
416 Adds 6-8 points of Cold damage and +5 Armor Class. 68 | |
417 +20 Air Resistance and Shielding. 69 | |
418 +10 Water Resistance and +2 Alchemy skill. 70 | |
419 Prevents damage from drowning. 71 | |
420 Prevents damage from falling. 72 | |
939 | 421 */ |
422 | |
423 | |
424 /* 391 */ | |
425 #pragma pack(push, 1) | |
426 struct stru351_summoned_item | |
427 { | |
428 int field_0_expire_second; | |
429 int field_4_expire_minute; | |
430 int field_8_expire_hour; | |
431 int field_C_expire_day; | |
432 int field_10_expire_week; | |
433 int field_14_exprie_month; | |
434 int field_18_expire_year; | |
435 }; | |
436 #pragma pack(pop) |