comparison mm7_6.cpp @ 1296:c423f946dc99

moving files continue
author Ritor1
date Tue, 18 Jun 2013 17:28:11 +0600
parents 62f4cdaa726b
children bfde0563ecdc
comparison
equal deleted inserted replaced
1295:86a83e12d795 1296:c423f946dc99
1191 dword_50C998_turnbased_icon_1A = 0; 1191 dword_50C998_turnbased_icon_1A = 0;
1192 } 1192 }
1193 // 50C968: using guessed type int dword_50C968; 1193 // 50C968: using guessed type int dword_50C968;
1194 // 50C994: using guessed type int dword_50C994; 1194 // 50C994: using guessed type int dword_50C994;
1195 // 50C998: using guessed type int dword_50C998_turnbased_icon_1A; 1195 // 50C998: using guessed type int dword_50C998_turnbased_icon_1A;
1196
1197 //----- (004269A2) --------------------------------------------------------
1198 void __fastcall GivePartyExp(unsigned int pEXPNum)
1199 {
1200 signed int pActivePlayerCount; // ecx@1
1201 int pLearningPercent; // eax@13
1202
1203 pActivePlayerCount = 0;
1204 for ( uint i = 0; i < 4; ++i )
1205 {
1206 if ( !pParty->pPlayers[i].pConditions[13] && !pParty->pPlayers[i].pConditions[14] && !pParty->pPlayers[i].pConditions[15] && !pParty->pPlayers[i].pConditions[16] )
1207 pActivePlayerCount ++;
1208 }
1209 if ( pActivePlayerCount )
1210 {
1211 pEXPNum = pEXPNum / pActivePlayerCount;
1212 for ( uint i = 0; i < 4; ++i )
1213 {
1214 if ( !pParty->pPlayers[i].pConditions[13] && !pParty->pPlayers[i].pConditions[14] && !pParty->pPlayers[i].pConditions[15] && !pParty->pPlayers[i].pConditions[16] )
1215 {
1216 if ( pEXPNum )
1217 {
1218 pLearningPercent = pParty->pPlayers[i].GetLearningPercent();
1219 pEXPNum = pEXPNum + pEXPNum * pLearningPercent / 100;
1220 pParty->pPlayers[i].uExperience += pEXPNum;
1221 if ( pParty->pPlayers[i].uExperience > 4000000000i64 )
1222 {
1223 pParty->pPlayers[i].uExperience = 0;
1224 }
1225 }
1226 }
1227 }
1228 }
1229 }
1230 1196
1231 //----- (00426A5A) -------------------------------------------------------- 1197 //----- (00426A5A) --------------------------------------------------------
1232 void stru319::LootActor(Actor *pActor) 1198 void stru319::LootActor(Actor *pActor)
1233 { 1199 {
1234 signed int v2; // edi@1 1200 signed int v2; // edi@1
2022 break; 1988 break;
2023 } 1989 }
2024 return result; 1990 return result;
2025 } 1991 }
2026 1992
2027 //----- (00427769) --------------------------------------------------------
2028 bool __fastcall sub_427769_spell(unsigned int uSpellID)
2029 {
2030 bool result; // eax@2
2031
2032 __debugbreak(); // refactor
2033 if ( *(&pSpellDatas[0].field_12 + 20 * uSpellID) & 0xC )
2034 result = 1;
2035 else
2036 result = 0;
2037 return result;
2038 }
2039
2040 //----- (0042777D) --------------------------------------------------------
2041 void _42777D_CastSpell_UseWand_ShootArrow(int a1, unsigned int uPlayerID, unsigned int a4, __int16 a5, int a6)
2042 {
2043 //bool result; // eax@2
2044 //__int16 v6; // bx@4
2045 //Player *v7; // eax@4
2046 //char v8; // zf@12
2047 unsigned __int16 v9; // cx@16
2048 unsigned int v10; // eax@18
2049 unsigned __int8 v11; // sf@18
2050 unsigned __int8 v12; // of@18
2051 unsigned __int16 v13; // cx@21
2052 unsigned int v14; // eax@23
2053 //stru277 *v15; // esi@27
2054 //stru277 *v16; // eax@28
2055 //GUIWindow *v17; // eax@43
2056 //GUIWindow *v18; // [sp-30h] [bp-48h]@44
2057 //unsigned int v19; // [sp-2Ch] [bp-44h]@44
2058 //unsigned int v20; // [sp-28h] [bp-40h]@44
2059 //unsigned int v21; // [sp-24h] [bp-3Ch]@44
2060 //unsigned int v22; // [sp-20h] [bp-38h]@44
2061 //int v23; // [sp-1Ch] [bp-34h]@44
2062 //int v24; // [sp-18h] [bp-30h]@44
2063 //unsigned int v25; // [sp-14h] [bp-2Ch]@43
2064 //unsigned int v26; // [sp-10h] [bp-28h]@43
2065 //unsigned __int8 v27; // [sp-Ch] [bp-24h]@43
2066 //char *v28; // [sp-8h] [bp-20h]@43
2067 //Texture *v29; // [sp-4h] [bp-1Ch]@43
2068 //__int16 a3a; // [sp+10h] [bp-8h]@1
2069 //__int16 a2a; // [sp+14h] [bp-4h]@1
2070
2071 //a3a = uPlayerID;
2072 //a2a = a1;
2073
2074 //if ( pParty->bTurnBasedModeOn != 1
2075 // || (result = pTurnEngine->field_4, pTurnEngine->field_4 != 1) && pTurnEngine->field_4 != 3 )
2076 if (pParty->bTurnBasedModeOn)
2077 {
2078 if (pTurnEngine->field_4 == 1 || pTurnEngine->field_4 == 3)
2079 return;
2080 }
2081
2082
2083 //v6 = a5;
2084 //v7 = &pParty->pPlayers[uPlayerID];
2085 assert(uPlayerID < 4);
2086 auto player = &pParty->pPlayers[uPlayerID];
2087 if ( !(a5 & 0x10) )
2088 {
2089 switch ( a1 )
2090 {
2091 case SPELL_SPIRIT_FATE:
2092 case SPELL_BODY_FIRST_AID:
2093 case SPELL_DARK_REANIMATE:
2094 //HIBYTE(v6) = HIBYTE(a5) | 1;
2095 a5 |= 0x0100;
2096 break;
2097
2098 case SPELL_FIRE_FIRE_AURA:
2099 case SPELL_WATER_RECHARGE_ITEM:
2100 case SPELL_WATER_ENCHANT_ITEM:
2101 case SPELL_DARK_VAMPIRIC_WEAPON:
2102 //LOBYTE(v6) = a5 | 0x80;
2103 a5 |= 0x0080;
2104 break;
2105
2106 case SPELL_FIRE_FIRE_BOLT:
2107 case SPELL_FIRE_FIREBALL:
2108 case SPELL_FIRE_INCINERATE:
2109 case SPELL_AIR_LIGHNING_BOLT:
2110 case SPELL_AIR_IMPLOSION:
2111 case SPELL_WATER_POISON_SPRAY:
2112 case SPELL_WATER_ICE_BOLT:
2113 case SPELL_WATER_ACID_BURST:
2114 case SPELL_WATER_ICE_BLAST:
2115 case SPELL_EARTH_STUN:
2116 case SPELL_EARTH_SLOW:
2117 case SPELL_EARTH_DEADLY_SWARM:
2118 case SPELL_EARTH_BLADES:
2119 case SPELL_EARTH_MASS_DISTORTION:
2120 case SPELL_SPIRIT_SPIRIT_LASH:
2121 case SPELL_MIND_MIND_BLAST:
2122 case SPELL_MIND_CHARM:
2123 case SPELL_MIND_PSYCHIC_SHOCK:
2124 case SPELL_BODY_HARM:
2125 case SPELL_BODY_FLYING_FIST:
2126 case SPELL_LIGHT_LIGHT_BOLT:
2127 case SPELL_LIGHT_DESTROY_UNDEAD:
2128 case SPELL_LIGHT_SUNRAY:
2129 case SPELL_DARK_TOXIC_CLOUD:
2130 case SPELL_DARK_SHRINKING_RAY:
2131 case SPELL_DARK_SHARPMETAL:
2132 case SPELL_DARK_DRAGON_BREATH:
2133 if ( !a6 )
2134 a5 |= 0x0008;
2135 break;
2136 case SPELL_MIND_TELEPATHY:
2137 case SPELL_MIND_BERSERK:
2138 case SPELL_MIND_ENSLAVE:
2139 case SPELL_LIGHT_PARALYZE:
2140 case SPELL_DARK_CONTROL_UNDEAD:
2141 //LABEL_9:
2142 //v6 = a5 | 8;
2143 a5 |= 0x0008;
2144 break;
2145
2146 case SPELL_EARTH_TELEKINESIS:
2147 a5 |= 0x0040;
2148 break;
2149
2150 case SPELL_SPIRIT_BLESS:
2151 if (a4 && ~a4 & 0x01C0)
2152 //goto LABEL_25;
2153 {
2154 a5 |= 0x0002;
2155 break;
2156 }
2157 else if ((player->pActiveSkills[PLAYER_SKILL_SPIRIT] & 0x1C0) == 0)
2158 //goto LABEL_25;
2159 {
2160 a5 |= 0x0002;
2161 break;
2162 }
2163 break;
2164
2165 case SPELL_SPIRIT_PRESERVATION:
2166 v9 = a4;
2167 if ( !a4 )
2168 v9 = player->pActiveSkills[PLAYER_SKILL_SPIRIT];
2169 //goto LABEL_18;
2170 v10 = SkillToMastery(v9);
2171 v12 = __OFSUB__(v10, 3);
2172 v11 = ((v10 - 3) & 0x80000000u) != 0;
2173 //goto LABEL_24;
2174 if ( v11 ^ v12 )
2175 {
2176 a5 |= 0x0002;
2177 break;
2178 }
2179 break;
2180
2181 case SPELL_DARK_PAIN_REFLECTION:
2182 v9 = a4;
2183 if ( !a4 )
2184 v9 = player->pActiveSkills[PLAYER_SKILL_DARK];
2185 //LABEL_18:
2186 v10 = SkillToMastery(v9);
2187 v12 = __OFSUB__(v10, 3);
2188 v11 = ((v10 - 3) & 0x80000000u) != 0;
2189 //goto LABEL_24;
2190 if ( v11 ^ v12 )
2191 {
2192 a5 |= 0x0002;
2193 break;
2194 }
2195 break;
2196
2197 case SPELL_BODY_HAMMERHANDS:
2198 v13 = a4;
2199 if ( !a4 )
2200 v13 = player->pActiveSkills[PLAYER_SKILL_BODY];
2201 v14 = SkillToMastery(v13);
2202 v12 = __OFSUB__(v14, 4);
2203 v11 = ((v14 - 4) & 0x80000000u) != 0;
2204 //LABEL_24:
2205 if ( v11 ^ v12 )
2206 //goto LABEL_25;
2207 {
2208 a5 |= 0x0002;
2209 break;
2210 }
2211 break;
2212
2213 case SPELL_EARTH_STONE_TO_FLESH:
2214 case SPELL_SPIRIT_REMOVE_CURSE:
2215 case SPELL_SPIRIT_RAISE_DEAD:
2216 case SPELL_SPIRIT_RESSURECTION:
2217 case SPELL_MIND_REMOVE_FEAR:
2218 case SPELL_MIND_CURE_PARALYSIS:
2219 case SPELL_MIND_CURE_INSANITY:
2220 case SPELL_BODY_CURE_WEAKNESS:
2221 case SPELL_BODY_REGENERATION:
2222 case SPELL_BODY_CURE_POISON:
2223 case SPELL_BODY_CURE_DISEASE:
2224 //LABEL_25:
2225 //v6 = a5 | 2;
2226 a5 |= 0x0002;
2227 break;
2228
2229 case SPELL_DARK_SACRIFICE:
2230 //HIBYTE(v6) = HIBYTE(a5) | 2;
2231 a5 |= 0x0200;
2232 break;
2233 default:
2234 break;
2235 }
2236 }
2237
2238
2239 if (a5 & 0x3CA)
2240 {
2241 assert(sizeof(pCastSpellInfo) / sizeof(*pCastSpellInfo.data()) == 10);
2242 for (uint i = 0; i < 10; ++i)
2243 if (pCastSpellInfo[i].field_8 & 0x3CA)
2244 {
2245 pCastSpellInfo[i].spellnum = 0;
2246 break;
2247 }
2248 }
2249
2250 assert(sizeof(pCastSpellInfo) / sizeof(*pCastSpellInfo.data()) == 10);
2251 for (uint i = 0; i < 10; ++i)
2252 {
2253 auto spell = &pCastSpellInfo[i];
2254 if (!spell->spellnum)
2255 continue;
2256
2257 spell->spellnum = 0;
2258 if (spell->field_8 & 0x3CA)
2259 {
2260 pGUIWindow_Settings->Release();
2261 pGUIWindow_Settings = nullptr;
2262 pMouse->SetCursorBitmap("MICON1");
2263 GameUI_Footer_TimeLeft = 0;
2264 unk_50C9A0 = 0;
2265 back_to_game();
2266 }
2267 }
2268
2269 int result = pCastSpellInfo.data()->PushCastSpellInfo(a1, uPlayerID, a4, a5, a6);
2270 if ( result != -1 )
2271 {
2272 if ( a5 & 2 )
2273 {
2274 if ( pGUIWindow_Settings )
2275 return;
2276 pGUIWindow_Settings = GUIWindow::Create(0, 0, 640, 480, WINDOW_CastSpell, (int)&pCastSpellInfo[result], 0);
2277 pGUIWindow_Settings->CreateButton(52, 422, 35, 0, 2, 0, UIMSG_CastSpell_Character_Big_Improvement, 0, 49, "", 0);
2278 pGUIWindow_Settings->CreateButton(165, 422, 35, 0, 2, 0, UIMSG_CastSpell_Character_Big_Improvement, 1, 50, "", 0);
2279 pGUIWindow_Settings->CreateButton(280, 422, 35, 0, 2, 0, UIMSG_CastSpell_Character_Big_Improvement, 2, 51, "", 0);
2280 pGUIWindow_Settings->CreateButton(390, 422, 35, 0, 2, 0, UIMSG_CastSpell_Character_Big_Improvement, 3, 52, "", 0);
2281 sub_421B2C_PlaceInInventory_or_DropPickedItem();
2282 return;
2283 }
2284 if ( a5 & 8 )
2285 {
2286 if ( pGUIWindow_Settings )
2287 return;
2288
2289 pGUIWindow_Settings = GUIWindow::Create(0, 0, 640, 480, WINDOW_CastSpell, (int)&pCastSpellInfo[result], 0);
2290 pGUIWindow_Settings->CreateButton(game_viewport_x, game_viewport_y, game_viewport_width, game_viewport_height, 1, 0, UIMSG_CastSpell_Shoot_Monster, 0, 0, "", 0);
2291 sub_421B2C_PlaceInInventory_or_DropPickedItem();
2292 return;
2293 }
2294 if ( a5 & 0x40 )
2295 {
2296 if ( pGUIWindow_Settings )
2297 return;
2298
2299 pGUIWindow_Settings = GUIWindow::Create(0, 0, 640, 480, WINDOW_CastSpell, (int)&pCastSpellInfo[result], 0);
2300 pGUIWindow_Settings->CreateButton(game_viewport_x, game_viewport_y, game_viewport_width, game_viewport_height, 1, 0, UIMSG_CastSpell_BE, 0, 0, "", 0);
2301 sub_421B2C_PlaceInInventory_or_DropPickedItem();
2302 return;
2303 }
2304 if ( (char)a5 < 0 )
2305 {
2306 if ( pGUIWindow_Settings )
2307 return;
2308 ++pIcons_LOD->uTexturePacksCount;
2309 if ( !pIcons_LOD->uNumPrevLoadedFiles )
2310 pIcons_LOD->uNumPrevLoadedFiles = pIcons_LOD->uNumLoadedFiles;
2311 pGUIWindow_Settings = pCastSpellInfo[result].sub_4219BE();
2312 unk_50C9A0 = 1;
2313 some_active_character = uActiveCharacter;
2314 sub_421B2C_PlaceInInventory_or_DropPickedItem();
2315 return;
2316 }
2317 if ( HIBYTE(a5) & 1 )
2318 {
2319 if ( pGUIWindow_Settings )
2320 return;
2321 pGUIWindow_Settings = GUIWindow::Create(0, 0, 640, 480, WINDOW_CastSpell, (int)&pCastSpellInfo[result], 0);
2322 pGUIWindow_Settings->CreateButton(0x34u, 0x1A6u, 0x23u, 0, 2, 0, UIMSG_CastSpell_Character_Small_Improvement, 0, 0x31u, "", 0);
2323 pGUIWindow_Settings->CreateButton(0xA5u, 0x1A6u, 0x23u, 0, 2, 0, UIMSG_CastSpell_Character_Small_Improvement, 1, 0x32u, "", 0);
2324 pGUIWindow_Settings->CreateButton(0x118u, 0x1A6u, 0x23u, 0, 2, 0, UIMSG_CastSpell_Character_Small_Improvement, 2, 0x33u, "", 0);
2325 pGUIWindow_Settings->CreateButton(0x186u, 0x1A6u, 0x23u, 0, 2, 0, UIMSG_CastSpell_Character_Small_Improvement, 3, 0x34u, "", 0);
2326 pGUIWindow_Settings->CreateButton(8, 8, game_viewport_width, game_viewport_height, 1, 0, UIMSG_CastSpell_Monster_Improvement, 0, 0, "", NULL);
2327 sub_421B2C_PlaceInInventory_or_DropPickedItem();
2328 }
2329 if ( HIBYTE(a5) & 2 && !pGUIWindow_Settings )
2330 {
2331 pGUIWindow_Settings = GUIWindow::Create(0, 0, 640, 480, WINDOW_CastSpell, (int)&pCastSpellInfo[result], 0);
2332 pBtn_NPCLeft = pGUIWindow_Settings->CreateButton(469, 178,
2333 pIcons_LOD->GetTexture(uTextureID_Btn_NPCLeft)->uTextureWidth,
2334 pIcons_LOD->GetTexture(uTextureID_Btn_NPCLeft)->uTextureHeight,
2335 1, 0, UIMSG_ScrollNPCPanel, 0, 0, "",
2336 pIcons_LOD->GetTexture(uTextureID_Btn_NPCLeft), 0);
2337 pBtn_NPCRight = pGUIWindow_Settings->CreateButton(626, 178,
2338 pIcons_LOD->GetTexture(uTextureID_Btn_NPCRight)->uTextureWidth,
2339 pIcons_LOD->GetTexture(uTextureID_Btn_NPCRight)->uTextureHeight,
2340 1, 0, UIMSG_ScrollNPCPanel, 1, 0, "",
2341 pIcons_LOD->GetTexture(uTextureID_Btn_NPCRight), 0);
2342 pGUIWindow_Settings->CreateButton(491, 149, 64, 74, 1, 0, UIMSG_HiredNPC_CastSpell, 4, 0x35u, "", 0);
2343 pGUIWindow_Settings->CreateButton(561, 149, 64, 74, 1, 0, UIMSG_HiredNPC_CastSpell, 5, 0x36u, "", 0);
2344 }
2345 }
2346 }
2347
2348 //----- (00427D48) --------------------------------------------------------
2349 void CastSpellInfo::_427D48(unsigned int uPlayerID)
2350 {
2351 CastSpellInfo *v2; // esi@1
2352 signed int v3; // ebx@1
2353
2354 v2 = this;
2355 v3 = 10;
2356 do
2357 {
2358 if ( v2->spellnum )
2359 {
2360 if ( v2->field_8 & 0x3CA )
2361 {
2362 v2->spellnum = 0;
2363 pGUIWindow_Settings->Release();
2364 pGUIWindow_Settings = 0;
2365 pMouse->SetCursorBitmap("MICON1");
2366 GameUI_Footer_TimeLeft = 0;
2367 unk_50C9A0 = 0;
2368 back_to_game();
2369 }
2370 }
2371 ++v2;
2372 --v3;
2373 }
2374 while ( v3 );
2375 }
2376
2377 //----- (00427DA0) --------------------------------------------------------
2378 unsigned int CastSpellInfo::PushCastSpellInfo(__int16 a2, __int16 uPlayerID, __int16 skill_level, __int16 a5, int spell_sound_id)
2379 {
2380 unsigned int result; // eax@1
2381 CastSpellInfo *v7; // edx@1
2382 CastSpellInfo *v8; // ecx@5
2383
2384 result = 0;
2385 v7 = this;
2386 while ( v7->spellnum )
2387 {
2388 ++result;
2389 ++v7;
2390 if ( (signed int)result >= 10 )
2391 goto LABEL_8;
2392 }
2393 v8 = &this[result];
2394 v8->spellnum = a2;
2395 v8->uPlayerID = uPlayerID;
2396 if ( a5 & 0x10 )
2397 v8->uPlayerID_2 = uPlayerID;
2398 v8->field_6 = 0;
2399 v8->spell_target_pid = 0;
2400 v8->field_8 = a5;
2401 v8->forced_spell_skill_level = skill_level;
2402 v8->sound_id = spell_sound_id;
2403 LABEL_8:
2404 if ( result == 10 )
2405 result = -1;
2406 return result;
2407 }
2408
2409 //----- (00427E01) --------------------------------------------------------
2410 void CastSpellInfo::_427E01_cast_spell()
2411 {
2412 int v2; // edi@1
2413 CastSpellInfo *pCastSpell; // ebx@2
2414 signed int v6; // eax@14
2415 unsigned __int16 v11; // cx@45
2416 unsigned __int8 v14; // zf@53
2417 signed int i; // esi@76
2418 __int16 v23; // ax@88
2419 int v51; // eax@146
2420 __int16 v52; // ax@153
2421 signed __int64 v54; // qax@164
2422 Actor *v55; // edi@164
2423 signed __int64 v58; // qax@177
2424 Actor *pActor; // edi@177
2425 unsigned __int16 v60; // ax@184
2426 int v61; // ecx@184
2427 ItemGen *v69; // esi@211
2428 double v90; // st7@245
2429 Player *v92; // eax@255
2430 int v105; // edi@271
2431 __int16 v108; // ST1C_2@274
2432 __int16 v109; // ST18_2@274
2433 stru6 *v110; // eax@274
2434 int v111; // eax@274
2435 Actor *v112; // esi@278
2436 int v113; // eax@278
2437 int v114; // ebx@278
2438 unsigned int v115; // ecx@278
2439 int v116; // edx@279
2440 int v117; // edx@281
2441 int v118; // edx@283
2442 signed int v122; // eax@286
2443 int v127; // eax@296
2444 int v153; // ecx@322
2445 int v154; // eax@322
2446 int v155; // eax@323
2447 int v156; // eax@323
2448 int v162; // edi@340
2449 signed int v164; // eax@340
2450 signed int v165; // edi@340
2451 signed int v168; // edi@343
2452 int v169; // eax@344
2453 signed int v174; // edi@355
2454 int v188; // esi@369
2455 int v189; // edi@369
2456 signed int v191; // edi@379
2457 signed int v205; // edi@405
2458 int v206; // eax@407
2459 __int16 v207; // cx@407
2460 int v208; // eax@411
2461 signed int v209; // ecx@412
2462 int v210; // edx@412
2463 signed int v211; // ecx@412
2464 int v212; // eax@413
2465 int v213; // eax@413
2466 int v214; // eax@413
2467 int v215; // eax@415
2468 double v216; // st7@415
2469 double v217; // st6@415
2470 signed __int64 v218; // qtt@423
2471 char v223; // al@438
2472
2473 int v227; // esi@453
2474 unsigned int v228; // edi@454
2475 int v229; // edi@466
2476
2477 ItemGen *v240; // ecx@472
2478 double v241; // st7@478
2479 ItemGen *v245; // edi@492
2480 int v254; // eax@513
2481 int v255; // esi@513
2482 int v256; // ecx@513
2483 int v257; // edx@514
2484 int v258; // ecx@514
2485 char v259; // al@516
2486 int v260; // eax@518
2487 int v261; // esi@519
2488 int v262; // edx@521
2489 int *v263; // ecx@521
2490 int v264; // esi@521
2491 int v265; // edx@521
2492 int *ii; // eax@522
2493 int v267; // eax@524
2494 int v268; // eax@524
2495 char v271; // al@531
2496 int v277; // edx@548
2497 int v278; // ecx@548
2498 char v279; // al@550
2499 int v280; // eax@552
2500 int *v281; // esi@553
2501 int v282; // edx@555
2502 int *v283; // ecx@555
2503 int v284; // esi@555
2504 int v285; // edx@555
2505 int *l; // eax@556
2506 ItemGen *v294; // esi@575
2507 int v295; // edx@575
2508 int kk; // edi@575
2509 char v313; // al@606pGame->GetStru6()
2510 const char *v317; // ecx@617
2511 Player *v318; // ecx@619
2512 unsigned int v319; // edi@627
2513 int v323; // edi@635
2514 char *v324; // eax@635
2515 Player *v325; // ecx@640
2516 int v328; // ecx@651
2517 int v329; // ecx@652
2518 int v330; // edi@654
2519 signed int v342; // edi@668
2520 signed int v343; // edi@670
2521 unsigned __int64 v344; // ST08_8@670
2522 Player *v351; // edi@680
2523 Player *v357; // edi@694
2524 Actor *v369; // edi@705
2525 int v373; // eax@715
2526 int v374; // eax@717
2527 int v376; // eax@717
2528 Player *v377; // ecx@719
2529 int v381; // edi@727
2530 int v382; // ecx@727
2531 Player *v383; // eax@728
2532 int v384; // eax@733
2533 int v388; // edi@740
2534 int v396; // eax@752
2535 int v397; // eax@757
2536 int v398; // eax@757
2537 int v399; // eax@757
2538 Actor *v417; // eax@787
2539 int v418; // ecx@789
2540 __int16 v419; // ax@791
2541 signed int v420; // eax@793
2542 ItemGen *v421; // edx@793
2543 const char *v422; // eax@801
2544 signed int v426; // eax@815
2545 Actor *v433; // edi@832
2546 int v435; // ecx@837
2547 int v440; // eax@843
2548 int v441; // eax@847
2549 signed int v445; // edi@857
2550 int v446; // ecx@862
2551 LevelDecoration *v447; // edi@864
2552 __int16 v448; // ax@864
2553 char *v449; // esi@870
2554 int v450; // eax@870
2555 signed int v460; // eax@895
2556 Actor *v461; // eax@897
2557 unsigned __int16 v462; // cx@897
2558 signed int v463; // edx@897
2559 int v470; // edi@913
2560 int v471; // eax@917
2561 int v472; // eax@917
2562 int v498; // edi@931
2563 int v499; // eax@935
2564 int v500; // eax@935
2565 Player *v501; // edi@939
2566 int v505; // eax@943
2567 int v507; // edi@944
2568 signed int v509; // eax@944
2569 //signed int v510; // edi@944
2570 Actor *v518; // edx@957
2571 __int16 v519; // cx@958
2572 int v531; // eax@982
2573 int v533; // edi@983
2574 signed int v535; // eax@983
2575 signed int v536; // edi@983
2576 stru6 *v537; // eax@984
2577 double v549; // st7@991
2578 unsigned __int16 v550; // di@991
2579 Player *v553; // edi@1001
2580 unsigned __int16 v562; // di@1005
2581 signed int v563; // eax@1010
2582 unsigned int v564; // ecx@1011
2583 signed int v565; // eax@1012
2584 Player **v566; // ecx@1012
2585 int v567; // eax@1012
2586 Player *v571; // eax@1013
2587 char *v572; // ecx@1013
2588 signed int v576; // eax@1025
2589 Player *v577; // eax@1026
2590 int v578; // eax@1028
2591 __int16 v579; // ax@1029
2592 int v581; // edi@1031
2593 char *v585; // esi@1034
2594 signed int v587; // eax@1035
2595 char v591; // al@1048
2596 ItemGen *v592; // esi@1052
2597 int v596; // esi@1066
2598 unsigned int v597; // edi@1067
2599 int v600; // edi@1086
2600 int v601; // edx@1086
2601 int v602; // eax@1086
2602 int v603; // ecx@1086
2603 NPCData *pNPCData; // eax@1089
2604 int v606; // edx@1091
2605 AwardType *v607; // ecx@1100
2606 __int16 v608; // ax@1102
2607 signed int v609; // eax@1104
2608 int v610; // edi@1106
2609 unsigned int v611; // eax@1106
2610 Player *v612; // edi@1106
2611 DDM_DLV_Header *v613; // eax@1108
2612 int v615; // edi@1119
2613 Player *v619; // edi@1123
2614 signed __int64 v623; // qax@1127
2615 int v625; // edi@1129
2616 signed int v627; // eax@1129
2617 signed int v628; // edi@1129
2618 int v629; // ecx@1130
2619 Player *v630; // eax@1131
2620 int v631; // eax@1137
2621 int v635; // edi@1142
2622 int v642; // edi@1156
2623 int v643; // eax@1156
2624 int v644; // eax@1156
2625 signed int v645; // eax@1158
2626 unsigned int v656; // [sp-4h] [bp-E88h]@639
2627 int v657; // [sp-4h] [bp-E88h]@807
2628 int v659; // [sp+0h] [bp-E84h]@123
2629 int v660; // [sp+0h] [bp-E84h]@146
2630 Actor *v661; // [sp+0h] [bp-E84h]@164
2631 unsigned __int64 v663; // [sp+0h] [bp-E84h]@639
2632 const char *v664; // [sp+0h] [bp-E84h]@802
2633 int v665; // [sp+0h] [bp-E84h]@807
2634 int v666; // [sp+4h] [bp-E80h]@12
2635 PLAYER_SKILL_TYPE v667; // [sp+4h] [bp-E80h]@25
2636 int v671; // [sp+4h] [bp-E80h]@146
2637 int v675; // [sp+4h] [bp-E80h]@800
2638 int v676; // [sp+4h] [bp-E80h]@807
2639 int v677; // [sp+4h] [bp-E80h]@861
2640 int v679[800]; // [sp+14h] [bp-E70h]@515
2641 AIDirection a3; // [sp+C94h] [bp-1F0h]@21
2642 int v681[4]; // [sp+CB0h] [bp-1D4h]@1137
2643 int v682[4]; // [sp+CC0h] [bp-1C4h]@731
2644 ItemGen v683; // [sp+CD0h] [bp-1B4h]@791
2645 int v684; // [sp+D04h] [bp-180h]@416
2646 unsigned __int64 v685; // [sp+D08h] [bp-17Ch]@416
2647 unsigned __int64 v687; // [sp+D24h] [bp-160h]@327
2648 Vec3_int_ v688; // [sp+D2Ch] [bp-158h]@943
2649 Vec3_int_ v691; // [sp+D38h] [bp-14Ch]@137
2650 Vec3_int_ v694; // [sp+D44h] [bp-140h]@982
2651 Vec3_int_ v697; // [sp+D50h] [bp-134h]@129
2652 Vec3_int_ v700; // [sp+D5Ch] [bp-128h]@339
2653 Vec3_int_ v701; // [sp+D68h] [bp-11Ch]@286
2654 Vec3_int_ v704; // [sp+D74h] [bp-110h]@132
2655 Vec3_int_ v707; // [sp+D80h] [bp-104h]@1127
2656 int v710; // [sp+D8Ch] [bp-F8h]@1156
2657 __int64 v712; // [sp+D94h] [bp-F0h]@991
2658 int v713; // [sp+D9Ch] [bp-E8h]@324
2659 int n; // [sp+DA0h] [bp-E4h]@1
2660 AIDirection v715; // [sp+DA4h] [bp-E0h]@21
2661 int v716; // [sp+DC0h] [bp-C4h]@272
2662 __int64 v717; // [sp+DC4h] [bp-C0h]@271
2663 float v718; // [sp+DCCh] [bp-B8h]@176
2664 signed int sRecoveryTime; // [sp+DD0h] [bp-B4h]@53
2665 char *y; // [sp+DD4h] [bp-B0h]@325
2666 int v721; // [sp+DD8h] [bp-ACh]@163
2667 int v723; // [sp+E4Ch] [bp-38h]@1
2668 ItemGen *_this; // [sp+E50h] [bp-34h]@23
2669 float v725; // [sp+E54h] [bp-30h]@23
2670 Player *v726; // [sp+E58h] [bp-2Ch]@131
2671 float v727; // [sp+E5Ch] [bp-28h]@1
2672 unsigned int uRequiredMana; // [sp+E60h] [bp-24h]@53
2673 Player *pPlayer; // [sp+E64h] [bp-20h]@8
2674 int v730; // [sp+E68h] [bp-1Ch]@53
2675 Player *v730b;
2676 ItemGen *v730c;
2677 int v731; // [sp+E6Ch] [bp-18h]@48
2678 signed int v732; // [sp+E70h] [bp-14h]@325
2679 unsigned __int64 v733; // [sp+E74h] [bp-10h]@1
2680 signed int a2; // [sp+E7Ch] [bp-8h]@14
2681 int amount; // [sp+E80h] [bp-4h]@1
2682
2683 SpriteObject pSpellSprite; // [sp+DDCh] [bp-A8h]@1
2684
2685 v2 = 0;
2686 amount = 0;
2687 LODWORD(v733) = 0;
2688 v723 = 0;
2689 v727 = 0.0;
2690 for(n = 0; n < 10; ++n)
2691 {
2692 pCastSpell = &this[n];
2693 HIDWORD(v733) = (int)pCastSpell;
2694 if ( pCastSpell->spellnum == 0 )
2695 continue;
2696
2697 if (pParty->Invisible())
2698 pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].Reset();
2699
2700 if ( pCastSpell->field_8 & 0x3CA )
2701 {
2702 if ( !pParty->pPlayers[pCastSpell->uPlayerID].CanAct() )
2703 this->_427D48(1);
2704 continue;
2705 }
2706 pPlayer = &pParty->pPlayers[pCastSpell->uPlayerID];
2707
2708 a2 = pCastSpell->spell_target_pid;
2709 if (!pCastSpell->spell_target_pid)
2710 {
2711 if (pCastSpell->spellnum == SPELL_LIGHT_DESTROY_UNDEAD ||
2712 pCastSpell->spellnum == SPELL_SPIRIT_TURN_UNDEAD ||
2713 pCastSpell->spellnum == SPELL_DARK_CONTROL_UNDEAD )
2714 v666 = 1;
2715 else
2716 v666 = 0;
2717
2718 a2 = stru_50C198.FindClosestActor(5120, 1, v666);
2719 v6 = pMouse->uPointingObjectID;
2720 if ( pMouse->uPointingObjectID && PID_TYPE(v6) == OBJECT_Actor && pActors[PID_ID(v6)].CanAct() )
2721 a2 = pMouse->uPointingObjectID;
2722 }
2723
2724
2725 pSpellSprite.uType = stru_4E3ACC[pCastSpell->spellnum].uType;
2726 if (pSpellSprite.uType)
2727 {
2728 if (PID_TYPE(a2) == OBJECT_Actor)
2729 {
2730 memcpy(&v715, Actor::GetDirectionInfo(PID(OBJECT_Player, pCastSpell->uPlayerID + 1), a2, &a3, 0), sizeof(v715));
2731 v2 = v723;
2732 }
2733 else
2734 {
2735 v715.uYawAngle = pParty->sRotationY;
2736 v715.uPitchAngle = pParty->sRotationX;
2737 }
2738 }
2739
2740 LODWORD(v725) = 0;
2741 _this = 0;
2742 if (pCastSpell->forced_spell_skill_level)
2743 {
2744 v11 = pCastSpell->forced_spell_skill_level;
2745 v723 = v11 & 0x3F; // 6 bytes
2746 v2 = v723;
2747 }
2748 else
2749 {
2750 //v667 = PLAYER_SKILL_STAFF;
2751 if (pCastSpell->spellnum < SPELL_AIR_WIZARD_EYE)
2752 v667 = PLAYER_SKILL_FIRE;
2753 else if (pCastSpell->spellnum < SPELL_WATER_AWAKEN)
2754 v667 = PLAYER_SKILL_AIR;
2755 else if (pCastSpell->spellnum < SPELL_EARTH_STUN)
2756 v667 = PLAYER_SKILL_WATER;
2757 else if (pCastSpell->spellnum < SPELL_SPIRIT_DETECT_LIFE)
2758 v667 = PLAYER_SKILL_EARTH;
2759 else if (pCastSpell->spellnum < SPELL_MIND_REMOVE_FEAR)
2760 v667 = PLAYER_SKILL_SPIRIT;
2761 else if (pCastSpell->spellnum < SPELL_BODY_CURE_WEAKNESS)
2762 v667 = PLAYER_SKILL_MIND;
2763 else if (pCastSpell->spellnum < SPELL_LIGHT_LIGHT_BOLT)
2764 v667 = PLAYER_SKILL_BODY;
2765 else if (pCastSpell->spellnum < SPELL_DARK_REANIMATE)
2766 v667 = PLAYER_SKILL_LIGHT;
2767 else if (pCastSpell->spellnum < SPELL_BOW_ARROW)
2768 v667 = PLAYER_SKILL_DARK;
2769 else if (pCastSpell->spellnum == SPELL_BOW_ARROW)
2770 v667 = PLAYER_SKILL_BOW;
2771 else assert(false && "Unknown spell");
2772
2773 LODWORD(v725) = v667;
2774 v723 = pPlayer->GetActualSkillLevel(v667) & 0x3F;
2775 v2 = v723;
2776 v11 = pPlayer->pActiveSkills[LODWORD(v725)];
2777 }
2778
2779 v731 = SkillToMastery(v11);
2780
2781 if (pCastSpell->forced_spell_skill_level)
2782 uRequiredMana = 0;
2783 else
2784 uRequiredMana = pSpellDatas[pCastSpell->spellnum - 1].mana_per_skill[v731 - 1];
2785 sRecoveryTime = pSpellDatas[pCastSpell->spellnum - 1].recovery_per_skill[v731 - 1];
2786
2787 if (LODWORD(v725) == PLAYER_SKILL_DARK && pParty->uCurrentHour == 0 && pParty->uCurrentMinute == 0 ||
2788 LODWORD(v725) == PLAYER_SKILL_LIGHT && pParty->uCurrentHour == 12 && pParty->uCurrentMinute == 0)
2789 uRequiredMana = 0;
2790
2791 if (pCastSpell->spellnum < SPELL_BOW_ARROW && pPlayer->sMana < uRequiredMana)
2792 {
2793 ShowStatusBarString(pGlobalTXT_LocalizationStrings[586], 2u); // "Not enough spell points"
2794 pCastSpell->spellnum = 0;
2795 continue;
2796 }
2797 v730 = pCastSpell->spellnum;
2798 if (pPlayer->Cursed() && pCastSpell->spellnum < SPELL_BOW_ARROW && rand() % 100 < 50)
2799 {
2800 if (!pParty->bTurnBasedModeOn)
2801 {
2802 //v646 = pPlayer;
2803 pPlayer->SetRecoveryTime((signed __int64)(flt_6BE3A4_debug_recmod1 * 213.3333333333333));
2804 //v647 = n;
2805 }
2806 else
2807 {
2808 //v647 = n;
2809 //v646 = pPlayer;
2810 //v648 = sRecoveryTime;
2811 //v649 = pPlayer;
2812 pParty->pTurnBasedPlayerRecoveryTimes[this[n].uPlayerID] = 100;
2813 pPlayer->SetRecoveryTime(sRecoveryTime);
2814 pTurnEngine->_40471C();
2815 }
2816 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2u); // "Spell failed"
2817 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
2818 this[n].spellnum = 0;
2819 pPlayer->sMana -= uRequiredMana;
2820 return;
2821 }
2822
2823 switch ( pCastSpell->spellnum )
2824 {
2825 case SPELL_101:
2826 assert(false && "Unknown spell effect #101 (prolly flaming bow arrow");
2827 case SPELL_BOW_ARROW:
2828 {
2829 amount = 1;
2830 if ( SkillToMastery(pPlayer->pActiveSkills[PLAYER_SKILL_BOW]) >= 3 )
2831 amount = 2;
2832 sRecoveryTime = pPlayer->GetAttackRecoveryTime(true);
2833 pSpellSprite.stru_24.Reset();
2834 pSpellSprite.spell_level = v2;
2835 pSpellSprite.spell_id = pCastSpell->spellnum;
2836 pSpellSprite.spell_skill = v731;
2837 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
2838 if ( pPlayer->WearsItem(ITEM_ARTEFACT_ULLYSES, EQUIP_BOW) )
2839 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(0xBD6u);
2840 pSpellSprite.vPosition.x = pParty->vPosition.x;
2841 pSpellSprite.vPosition.y = pParty->vPosition.y;
2842 pSpellSprite.uAttributes = 0;
2843 pSpellSprite.uSpriteFrameID = 0;
2844 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
2845 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
2846 pSpellSprite.spell_target_pid = a2;
2847 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
2848 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
2849 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
2850 pPlayer = &pParty->pPlayers[pCastSpell->uPlayerID];
2851 memcpy(&pSpellSprite.stru_24, &pPlayer->pInventoryItems[pPlayer->pEquipment.uBow-1], sizeof(pSpellSprite.stru_24));
2852 pSpellSprite.uAttributes = 256;
2853 if ( pParty->bTurnBasedModeOn == 1 )
2854 pSpellSprite.uAttributes = 260;
2855 for ( i = 0; i < amount; ++i )
2856 {
2857 if ( i )
2858 pSpellSprite.vPosition.z += 32;
2859 pSpellSprite.uSectorID = pIndoor->GetSector(pSpellSprite.vPosition.x, pSpellSprite.vPosition.y, pSpellSprite.vPosition.z);
2860 if ( pSpellSprite.Create(v715.uYawAngle, v715.uPitchAngle, pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed,
2861 pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
2862 ++pTurnEngine->field_1C;
2863 }
2864 break;
2865 }
2866 case SPELL_LASER_PROJECTILE:
2867 {
2868 sRecoveryTime = pPlayer->GetAttackRecoveryTime(0);
2869 pSpellSprite.stru_24.Reset();
2870 pSpellSprite.spell_id = pCastSpell->spellnum;
2871 pSpellSprite.spell_level = v723;
2872 pSpellSprite.spell_skill = v731;
2873 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
2874 pSpellSprite.vPosition.x = pParty->vPosition.x;
2875 pSpellSprite.vPosition.y = pParty->vPosition.y;
2876 pSpellSprite.uAttributes = 0;
2877 pSpellSprite.uSpriteFrameID = 0;
2878 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 2;
2879 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
2880 pSpellSprite.spell_target_pid = a2;
2881 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
2882 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
2883 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
2884 pPlayer = &pParty->pPlayers[pCastSpell->uPlayerID];
2885 memcpy(&pSpellSprite.stru_24, &pPlayer->pInventoryItems[pPlayer->pEquipment.uMainHand-1],sizeof(pSpellSprite.stru_24));
2886 // &pParty->pPlayers[pCastSpell->uPlayerID].spellbook.pDarkSpellbook.bIsSpellAvailable[36
2887 // * pParty->pPlayers[pCastSpell->uPlayerID].pEquipment.uMainHand + 5], );
2888 v23 = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pSpellSprite.vPosition.z);
2889 HIBYTE(pSpellSprite.uAttributes) |= 1u;
2890 pSpellSprite.uSectorID = v23;
2891 if ( pParty->bTurnBasedModeOn == 1 )
2892 LOBYTE(pSpellSprite.uAttributes) |= 4u;
2893 if ( pSpellSprite.Create(v715.uYawAngle, v715.uPitchAngle, pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed,
2894 pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
2895 ++pTurnEngine->field_1C;
2896 break;
2897 }
2898 case SPELL_FIRE_TORCH_LIGHT:
2899 {
2900 switch (v731)
2901 {
2902 case 1: amount = 2; break;
2903 case 2: amount = 3; break;
2904 case 3:
2905 case 4: amount = 4; break;
2906 default:
2907 assert(false);
2908 }
2909 if ( !pPlayer->CanCastSpell(uRequiredMana) )
2910 break;
2911 pParty->pPartyBuffs[PARTY_BUFF_TORCHLIGHT].Apply(pParty->uTimePlayed + (signed __int64)((double)(signed int)3600 * v2 * 4.2666669), v731, amount, 0, 0);
2912 LODWORD(v727) = 1;
2913 break;
2914 }
2915 case SPELL_FIRE_FIRE_SPIKE:
2916 {
2917 switch (v731)
2918 {
2919 case 1: amount = 3; break;
2920 case 2: amount = 5; break;
2921 case 3: amount = 7; break;
2922 case 4: amount = 9; break;
2923 default:
2924 assert(false);
2925 }
2926
2927 //v31 = v3->uPlayerID;
2928 //v32 = 8 * v31;
2929 //LOBYTE(v32) = v32 | OBJECT_Player;
2930
2931 //if ( (signed int)uNumSpriteObjects > 0 )
2932 int _v733 = 0;
2933 for (uint i = 0; i < uNumSpriteObjects; ++i)
2934 {
2935 auto object = &pSpriteObjects[i];
2936 if (object->uType && object->spell_id == SPELL_FIRE_FIRE_SPIKE && object->spell_caster_pid == PID(OBJECT_Player, pCastSpell->uPlayerID))
2937 ++_v733;
2938 /*v33 = (char *)&pSpriteObjects[0].field_48;
2939 v730 = uNumSpriteObjects;
2940 do
2941 {
2942 if ( *((short *)v33 - 36) && *(int *)v33 == 7 && *((int *)v33 + 4) == v32 )
2943 ++HIDWORD(v733);
2944 v33 += 112;
2945 --v730;
2946 }
2947 while ( v730 );*/
2948 }
2949 if (_v733 > amount)
2950 {
2951 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2952 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
2953 pCastSpell->spellnum = 0;
2954 continue;
2955 }
2956 if ( !pPlayer->CanCastSpell(uRequiredMana) )
2957 break;
2958 pSpellSprite.stru_24.Reset();
2959 pSpellSprite.spell_id = pCastSpell->spellnum;
2960 pSpellSprite.spell_level = v2;
2961 pSpellSprite.spell_skill = v731;
2962 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
2963 pSpellSprite.vPosition.y = pParty->vPosition.y;
2964 pSpellSprite.vPosition.x = pParty->vPosition.x;
2965 pSpellSprite.uAttributes = 0;
2966 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
2967 pSpellSprite.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3);
2968 pSpellSprite.uSpriteFrameID = 0;
2969 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
2970 pSpellSprite.spell_target_pid = a2;
2971 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
2972 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
2973 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
2974 if ( pParty->bTurnBasedModeOn == 1 )
2975 LOBYTE(pSpellSprite.uAttributes) |= 4u;
2976 v659 = pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed;
2977 if ( pSpellSprite.Create(pParty->sRotationY, pParty->sRotationX + 10, v659, pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
2978 ++pTurnEngine->field_1C;
2979 LODWORD(v727) = 1;
2980 break;
2981 }
2982 case SPELL_AIR_IMPLOSION:
2983 {
2984 if ( !pPlayer->CanCastSpell(uRequiredMana) )
2985 break;
2986 if (!a2)
2987 {
2988 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
2989 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
2990 pCastSpell->spellnum = 0;
2991 continue;
2992 }
2993 if (PID_TYPE(a2) != OBJECT_Actor)
2994 {
2995 LODWORD(v727) = 1;
2996 break;
2997 }
2998 v697.x = 0;
2999 v697.y = 0;
3000 v697.z = 0;
3001 pSpellSprite.stru_24.Reset();
3002 pSpellSprite.spell_id = pCastSpell->spellnum;
3003 pSpellSprite.spell_level = v2;
3004 pSpellSprite.spell_skill = v731;
3005 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
3006 pSpellSprite.uAttributes = 0;
3007 pSpellSprite.uSectorID = 0;
3008 pSpellSprite.uSpriteFrameID = 0;
3009 pSpellSprite.field_60_distance_related_prolly_lod = 0;
3010 pSpellSprite.uFacing = 0;
3011 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
3012 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
3013 pSpellSprite.vPosition.x = pActors[PID_ID(a2)].vPosition.x;
3014 pSpellSprite.vPosition.z = pActors[PID_ID(a2)].vPosition.z;
3015 pSpellSprite.vPosition.y = pActors[PID_ID(a2)].vPosition.y;
3016 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, PID_ID(a2));
3017 auto obj_id = pSpellSprite.Create(0, 0, 0, 0);
3018 DamageMonsterFromParty(PID(OBJECT_Item, obj_id), PID_ID(a2), &v697);
3019 LODWORD(v727) = 1;
3020 break;
3021 }
3022 case SPELL_EARTH_MASS_DISTORTION:
3023 {
3024 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3025 break;
3026 if ( !stru_50C198.GetMagicalResistance(&pActors[PID_ID(a2)], 3u) )
3027 {
3028 LODWORD(v727) = 1;
3029 break;
3030 }
3031 pActors[PID_ID(a2)].pActorBuffs[10].Apply(pMiscTimer->uTotalGameTimeElapsed + 128, 0, 0, 0, 0);
3032 v704.x = 0;
3033 v704.y = 0;
3034 v704.z = 0;
3035 pSpellSprite.stru_24.Reset();
3036 pSpellSprite.spell_id = pCastSpell->spellnum;
3037 pSpellSprite.spell_level = v2;
3038 pSpellSprite.spell_skill = v731;
3039 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
3040 pSpellSprite.uAttributes = 0;
3041 pSpellSprite.uSectorID = 0;
3042 pSpellSprite.uSpriteFrameID = 0;
3043 pSpellSprite.field_60_distance_related_prolly_lod = 0;
3044 pSpellSprite.uFacing = 0;
3045 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
3046 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
3047 pSpellSprite.vPosition.x = pActors[PID_ID(a2)].vPosition.x;
3048 pSpellSprite.vPosition.y = pActors[PID_ID(a2)].vPosition.y;
3049 pSpellSprite.vPosition.z = pActors[PID_ID(a2)].vPosition.z;
3050 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, PID_ID(a2));
3051 auto obj_id = pSpellSprite.Create(0, 0, 0, 0);
3052 DamageMonsterFromParty(PID(OBJECT_Item, obj_id), PID_ID(a2), &v704);
3053 LODWORD(v727) = 1;
3054 break;
3055 }
3056 case SPELL_LIGHT_DESTROY_UNDEAD:
3057 {
3058 if ( !pPlayer->CanCastSpell(uRequiredMana) || !a2 || PID_TYPE(a2) != OBJECT_Actor)
3059 break;
3060 //v730 = a2 >> 3;
3061 //HIDWORD(v733) = (int)&pActors[PID_ID(a2)];
3062 v691.x = 0;
3063 v691.y = 0;
3064 v691.z = 0;
3065 pSpellSprite.stru_24.Reset();
3066 pSpellSprite.spell_id = pCastSpell->spellnum;
3067 pSpellSprite.spell_level = v2;
3068 pSpellSprite.spell_skill = v731;
3069 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
3070 pSpellSprite.vPosition.x = pActors[PID_ID(a2)].vPosition.x;
3071 pSpellSprite.vPosition.y = pActors[PID_ID(a2)].vPosition.y;
3072 pSpellSprite.vPosition.z = pActors[PID_ID(a2)].vPosition.z;
3073 pSpellSprite.uAttributes = 0;
3074 pSpellSprite.uSectorID = pIndoor->GetSector(pSpellSprite.vPosition.x, pSpellSprite.vPosition.y, pSpellSprite.vPosition.z);
3075 pSpellSprite.uSpriteFrameID = 0;
3076 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
3077 pSpellSprite.spell_target_pid = a2;
3078 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
3079 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
3080 pSpellSprite.uAttributes |= 0x80u;
3081 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
3082 auto obj_id = pSpellSprite.Create(0, 0, 0, 0);
3083 if ( !MonsterStats::BelongsToSupertype(pActor->pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD) )
3084 {
3085 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
3086 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
3087 pCastSpell->spellnum = 0;
3088 continue;
3089 }
3090 DamageMonsterFromParty(PID(OBJECT_Item, obj_id), PID_ID(a2), &v691);
3091 LODWORD(v727) = 1;
3092 break;
3093 }
3094 case SPELL_FIRE_FIRE_BOLT:
3095 case SPELL_FIRE_FIREBALL:
3096 case SPELL_FIRE_INCINERATE:
3097 case SPELL_AIR_LIGHNING_BOLT:
3098 case SPELL_WATER_ICE_BOLT:
3099 case SPELL_WATER_ICE_BLAST:
3100 case SPELL_EARTH_STUN:
3101 case SPELL_EARTH_DEADLY_SWARM:
3102 case SPELL_MIND_MIND_BLAST:
3103 case SPELL_MIND_PSYCHIC_SHOCK:
3104 case SPELL_BODY_HARM:
3105 case SPELL_LIGHT_LIGHT_BOLT:
3106 case SPELL_DARK_DRAGON_BREATH:
3107 {
3108 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3109 break;
3110 pSpellSprite.stru_24.Reset();
3111 pSpellSprite.spell_id = pCastSpell->spellnum;
3112 pSpellSprite.spell_level = v2;
3113 pSpellSprite.spell_skill = v731;
3114 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
3115 pSpellSprite.vPosition.y = pParty->vPosition.y;
3116 pSpellSprite.vPosition.x = pParty->vPosition.x;
3117 pSpellSprite.uAttributes = 0;
3118 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
3119 if (uCurrentlyLoadedLevelType == LEVEL_Indoor)
3120 pSpellSprite.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3);
3121 else
3122 pSpellSprite.uSectorID = 0;
3123 pSpellSprite.uSpriteFrameID = 0;
3124 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
3125 pSpellSprite.spell_target_pid = a2;
3126 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
3127 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
3128 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
3129 if ( pParty->bTurnBasedModeOn == 1 )
3130 LOBYTE(pSpellSprite.uAttributes) |= 4u;
3131 if ( pCastSpell->spellnum == SPELL_AIR_LIGHNING_BOLT )
3132 LOBYTE(pSpellSprite.uAttributes) |= 0x40u;
3133 v659 = pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed;
3134 if ( pSpellSprite.Create(v715.uYawAngle, v715.uPitchAngle, v659, pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
3135 ++pTurnEngine->field_1C;
3136 LODWORD(v727) = 1;
3137 break;
3138 }
3139 case SPELL_WATER_ACID_BURST:
3140 case SPELL_EARTH_BLADES:
3141 case SPELL_BODY_FLYING_FIST:
3142 case SPELL_DARK_TOXIC_CLOUD:
3143 {
3144 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3145 break;
3146 pSpellSprite.stru_24.Reset();
3147 pSpellSprite.spell_id = pCastSpell->spellnum;
3148 pSpellSprite.spell_level = v2;
3149 pSpellSprite.spell_skill = v731;
3150 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
3151 v51 = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 2;
3152 pSpellSprite.vPosition.y = pParty->vPosition.y;
3153 v671 = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 2;
3154 v660 = pParty->vPosition.y;
3155 pSpellSprite.uAttributes = 0;
3156 pSpellSprite.vPosition.x = pParty->vPosition.x;
3157 pSpellSprite.vPosition.z = v51;
3158 v52 = pIndoor->GetSector(pParty->vPosition.x, v660, v671);
3159 pSpellSprite.uSpriteFrameID = 0;
3160 pSpellSprite.uSectorID = v52;
3161 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
3162 pSpellSprite.spell_target_pid = a2;
3163 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
3164 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
3165 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
3166 if ( pParty->bTurnBasedModeOn == 1 )
3167 LOBYTE(pSpellSprite.uAttributes) |= 4u;
3168 v659 = pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed;
3169 if ( pSpellSprite.Create(v715.uYawAngle, v715.uPitchAngle, v659, pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
3170 ++pTurnEngine->field_1C;
3171 LODWORD(v727) = 1;
3172 break;
3173 }
3174 case SPELL_LIGHT_SUNRAY:
3175 {
3176 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor
3177 || uCurrentlyLoadedLevelType == LEVEL_Outdoor && (pParty->uCurrentHour < 5 || pParty->uCurrentHour >= 21) )
3178 {
3179 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
3180 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
3181 pCastSpell->spellnum = 0;
3182 continue;
3183 }
3184 if ( pPlayer->CanCastSpell(uRequiredMana) )
3185 {
3186 pSpellSprite.stru_24.Reset();
3187 pSpellSprite.spell_id = pCastSpell->spellnum;
3188 pSpellSprite.spell_skill = v731;
3189 pSpellSprite.spell_level = v2;
3190 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
3191 pSpellSprite.vPosition.y = pParty->vPosition.y;
3192 v51 = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
3193 v671 = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
3194 v660 = pParty->vPosition.y;
3195 pSpellSprite.uAttributes = 0;
3196 pSpellSprite.vPosition.x = pParty->vPosition.x;
3197 pSpellSprite.vPosition.z = v51;
3198 v52 = pIndoor->GetSector(pParty->vPosition.x, v660, v671);
3199 pSpellSprite.uSpriteFrameID = 0;
3200 pSpellSprite.uSectorID = v52;
3201 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
3202 pSpellSprite.spell_target_pid = a2;
3203 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
3204 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
3205 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
3206 if ( pParty->bTurnBasedModeOn == 1 )
3207 LOBYTE(pSpellSprite.uAttributes) |= 4u;
3208 v659 = pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed;
3209 if ( pSpellSprite.Create(v715.uYawAngle, v715.uPitchAngle, v659, pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
3210 ++pTurnEngine->field_1C;
3211 LODWORD(v727) = 1;
3212 }
3213 break;
3214 }
3215 case SPELL_LIGHT_PARALYZE:
3216 {
3217 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3218 break;
3219 if (PID_TYPE(a2) != OBJECT_Actor || (v730 = PID_ID(a2), v721 = (int)&pActors[PID_ID(a2)],
3220 !stru_50C198.GetMagicalResistance(&pActors[PID_ID(a2)], 9)) )
3221 {
3222 LODWORD(v727) = 1;
3223 break;
3224 }
3225 Actor::AI_Stand(PID_ID(a2), 4u, 0x80u, 0);
3226 v54 = (signed __int64)((double)(23040 * v2) * 0.033333335);
3227 v55 = &pActors[PID_ID(a2)];
3228 v55->pActorBuffs[6].Apply(pParty->uTimePlayed + (signed int)v54, v731, 0, 0, 0);
3229 BYTE2(v55->uAttributes) |= 8u;
3230 v55->vVelocity.x = 0;
3231 //v672 = 0;
3232 v55->vVelocity.y = 0;
3233 v661 = v55;
3234 pGame->GetStru6()->_4A7E89_sparkles_on_actor_after_it_casts_buff(v661, 0);
3235 LODWORD(v727) = 1;
3236 break;
3237 }
3238 case SPELL_EARTH_SLOW:
3239 {
3240 switch (v731)
3241 {
3242 case 1: LODWORD(v733) = 180 * v2; amount = 2; break;
3243 case 2: LODWORD(v733) = 300 * v2; amount = 2; break;
3244 case 3: LODWORD(v733) = 300 * v2; amount = 4; break;
3245 case 4: LODWORD(v733) = 300 * v2; amount = 8; break;
3246 default:
3247 assert(false);
3248 }
3249 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3250 break;
3251 if (PID_TYPE(a2) != OBJECT_Actor
3252 || (v721 = 836 * PID_ID(a2),
3253 LODWORD(v718) = (int)&pActors[PID_ID(a2)],
3254 !stru_50C198.GetMagicalResistance(&pActors[PID_ID(a2)], 3u)) )
3255 {
3256 LODWORD(v727) = 1;
3257 break;
3258 }
3259 v58 = (signed __int64)((double)(23040 * v2) * 0.033333335);
3260 //v59 = v721;
3261 pActor = &pActors[PID_ID(a2)];
3262 //((SpellBuff *)((char *)&pActors[0].pActorBuffs[7] + v721))->Apply(
3263 pActor->pActorBuffs[7].Apply(pParty->uTimePlayed + (signed int)v58, v731, amount, 0, 0);
3264 //*((char *)&pActors[0].uAttributes + v59 + 2) |= 8u;
3265 BYTE2(pActor->uAttributes) |= 8u;
3266 //v672 = 0;
3267 v661 = (Actor *)LODWORD(v718);
3268 pGame->GetStru6()->_4A7E89_sparkles_on_actor_after_it_casts_buff(v661, 0);
3269 LODWORD(v727) = 1;
3270 break;
3271 }
3272 case SPELL_MIND_CHARM:
3273 {
3274 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3275 break;
3276
3277 if ( !stru_50C198.GetMagicalResistance(&pActors[PID_ID(a2)], 7u) )
3278 {
3279 LODWORD(v727) = 1;
3280 break;
3281 }
3282
3283 uint power = 300 * v2;
3284 if ( v731 == 2 )
3285 {
3286 power = 600 * v2;
3287 }
3288 else if ( v731 == 3 )
3289 power = 29030400;
3290
3291 //((SpellBuff *)((char *)&pActors[0].pActorBuffs[9] + v730))->Reset();
3292 pActors[PID_ID(a2)].pActorBuffs[9].Reset();
3293 //((SpellBuff *)((char *)&pActors[0].pActorBuffs[12] + v730))->Reset();
3294 pActors[PID_ID(a2)].pActorBuffs[12].Reset();
3295 //((SpellBuff *)((char *)&pActors[0].pActorBuffs[1] + v730))->Apply(
3296 pActors[PID_ID(a2)].pActorBuffs[1].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)(power << 7) * 0.033333335),
3297 v731, 0, 0, 0);
3298 pSpellSprite.stru_24.Reset();
3299 pSpellSprite.spell_id = pCastSpell->spellnum;
3300 pSpellSprite.spell_level = v2;
3301 pSpellSprite.spell_skill = v731;
3302 v60 = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
3303 v61 = PID_ID(a2);
3304 v600 = pActors[v61].vPosition.y;
3305 v601 = pActors[v61].vPosition.x;
3306 pSpellSprite.uObjectDescID = v60;
3307 pSpellSprite.vPosition.x = v601;
3308 v602 = pActors[v61].uActorHeight;
3309 v603 = pActors[v61].vPosition.z;
3310 pSpellSprite.vPosition.y = v600;
3311 v676 = v603 + v602;
3312 v665 = v600;
3313 pSpellSprite.vPosition.z = v603 + v602;
3314 v657 = v601;
3315 pSpellSprite.uAttributes = 0;
3316 pSpellSprite.uSectorID = pIndoor->GetSector(v657, v665, v676);
3317 pSpellSprite.uSpriteFrameID = 0;
3318 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
3319 pSpellSprite.spell_target_pid = a2;
3320 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
3321 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
3322 LOBYTE(pSpellSprite.uAttributes) |= 0x80u;
3323 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
3324 pSpellSprite.Create(0, 0, 0, pCastSpell->uPlayerID + 1);
3325 LODWORD(v727) = 1;
3326 break;
3327 }
3328 case SPELL_DARK_SHRINKING_RAY:
3329 {
3330 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3331 break;
3332 pSpellSprite.stru_24.Reset();
3333 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
3334 pSpellSprite.vPosition.x = pParty->vPosition.x;
3335 pSpellSprite.vPosition.y = pParty->vPosition.y;
3336 pSpellSprite.uAttributes = 0;
3337 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
3338 pSpellSprite.uSectorID = pIndoor->GetSector(
3339 pParty->vPosition.x,
3340 pParty->vPosition.y,
3341 pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3);
3342 pSpellSprite.uSpriteFrameID = 0;
3343 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
3344 pSpellSprite.spell_target_pid = a2;
3345 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
3346 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
3347 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
3348 pSpellSprite.spell_skill = v731;
3349 pSpellSprite.spell_id = SPELL_FIRE_PROTECTION_FROM_FIRE;
3350 pSpellSprite.spell_level = 300 * v2;
3351 if ( pParty->bTurnBasedModeOn == 1 )
3352 LOBYTE(pSpellSprite.uAttributes) |= 4u;
3353
3354 v659 = pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed;
3355
3356 if ( pSpellSprite.Create(v715.uYawAngle, v715.uPitchAngle, v659, pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
3357 ++pTurnEngine->field_1C;
3358 LODWORD(v727) = 1;
3359 break;
3360 }
3361 case SPELL_FIRE_FIRE_AURA:
3362 {
3363 switch (v731)
3364 {
3365 case 1: LODWORD(v733) = 3600 * v2; amount = 10; break;
3366 case 2: LODWORD(v733) = 3600 * v2; amount = 11; break;
3367 case 3: LODWORD(v733) = 3600 * v2; amount = 12; break;
3368 case 4: LODWORD(v733) = 0; amount = 12; break;
3369 default:
3370 assert(false);
3371 }
3372
3373 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3374 break;
3375 v730c = &pParty->pPlayers[pCastSpell->uPlayerID_2].pInventoryItems[a2];
3376 auto _itm = &pItemsTable->pItems[v730c->uItemID];
3377 v730c->UpdateTempBonus(pParty->uTimePlayed);
3378 if ( v730c->uItemID < 64 || v730c->uItemID > 65
3379 && !v730c->Broken()
3380 && !v730c->uSpecEnchantmentType
3381 && !v730c->uEnchantmentType
3382 && ( _itm->uEquipType == 0 || _itm->uEquipType == 1 || _itm->uEquipType == 2)
3383 && !pItemsTable->IsMaterialNonCommon(v730c) )
3384 {
3385 v69 = v730c;
3386 v14 = v731 == 4;
3387 v730c->uSpecEnchantmentType = amount;
3388 if ( !v14 )
3389 {
3390 v69->uExpireTime = pParty->uTimePlayed
3391 + (signed int)(signed __int64)((double)(signed int)((int)v733 << 7)
3392 * 0.033333335);
3393 v69->uAttributes |= 8u;
3394 }
3395 v69->uAttributes |= 0x10u;
3396 _50C9A8_item_enchantment_timer = 256;
3397 LODWORD(v727) = 1;
3398 break;
3399 }
3400
3401 dword_50C9D0 = 113;
3402 dword_50C9D4 = 0;
3403 dword_50C9D8 = 1;
3404
3405 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
3406 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
3407 pCastSpell->spellnum = 0;
3408 continue;
3409 }
3410 case SPELL_BODY_REGENERATION:
3411 {
3412 switch (v731)
3413 {
3414 case 1: LODWORD(v733) = 3600 * v2; amount = 1; break;
3415 case 2: LODWORD(v733) = 3600 * v2; amount = 1; break;
3416 case 3: LODWORD(v733) = 3600 * v2; amount = 3; break;
3417 case 4: LODWORD(v733) = 3600 * v2; amount = 10; break;
3418 default:
3419 assert(false);
3420 }
3421 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3422 break;
3423
3424 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, pCastSpell->uPlayerID_2);
3425
3426 pParty->pPlayers[pCastSpell->uPlayerID_2].pPlayerBuffs[PLAYER_BUFF_REGENERATION].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)v733 * 4.2666669), v731, amount, 0, 0);
3427 LODWORD(v727) = 1;
3428 break;
3429 }
3430 case SPELL_FIRE_PROTECTION_FROM_FIRE:
3431 case SPELL_AIR_PROTECTION_FROM_AIR:
3432 case SPELL_WATER_PROTECTION_FROM_WATER:
3433 case SPELL_EARTH_PROTECTION_FROM_EARTH:
3434 case SPELL_MIND_PROTECTION_FROM_MIND:
3435 case SPELL_BODY_PROTECTION_FROM_BODY:
3436 {
3437 switch (v731)
3438 {
3439 case 1:
3440 case 2:
3441 case 3:
3442 case 4: LODWORD(v733) = 3600 * v2; amount = v731 * v2; break;
3443 default:
3444 assert(false);
3445 }
3446
3447 switch (pCastSpell->spellnum)
3448 {
3449 case SPELL_FIRE_PROTECTION_FROM_FIRE:
3450 LODWORD(v725) = PARTY_BUFF_RESIST_FIRE;
3451 break;
3452 case SPELL_AIR_PROTECTION_FROM_AIR:
3453 LODWORD(v725) = PARTY_BUFF_RESIST_AIR;
3454 break;
3455 case SPELL_WATER_PROTECTION_FROM_WATER:
3456 LODWORD(v725) = PARTY_BUFF_RESIST_WATER;
3457 break;
3458 case SPELL_EARTH_PROTECTION_FROM_EARTH:
3459 LODWORD(v725) = PARTY_BUFF_RESIST_EARTH;
3460 break;
3461 case SPELL_MIND_PROTECTION_FROM_MIND:
3462 LODWORD(v725) = PARTY_BUFF_RESIST_MIND;
3463 break;
3464 case SPELL_BODY_PROTECTION_FROM_BODY:
3465 LODWORD(v725) = PARTY_BUFF_RESIST_BODY;
3466 break;
3467 default:
3468 assert(false);
3469 continue;
3470 }
3471 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3472 break;
3473 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 0);
3474 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 1);
3475 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 2);
3476 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 3);
3477 v90 = (double)(signed int)v733 * 4.2666669;
3478 pParty->pPartyBuffs[LODWORD(v725)].Apply(pParty->uTimePlayed + (signed int)(signed __int64)v90, v731, amount, 0, 0);
3479 LODWORD(v727) = 1;
3480 break;
3481 }
3482 case SPELL_FIRE_HASTE:
3483 {
3484 switch (v731)
3485 {
3486 case 1: LODWORD(v733) = 60 * (v2 + 60); break;
3487 case 2: LODWORD(v733) = 60 * (v2 + 60); break;
3488 case 3: LODWORD(v733) = 180 * (v2 + 20); break;
3489 case 4: LODWORD(v733) = 240 * (v2 + 15); break;
3490 default:
3491 assert(false);
3492 }
3493 if ( pPlayer->CanCastSpell(uRequiredMana) )
3494 {
3495 v92 = pParty->pPlayers;//[0].pConditions[1];
3496 LODWORD(v727) = 1;
3497 do
3498 {
3499 if ( v92->pConditions[1] )
3500 LODWORD(v727) = 0;
3501 ++v92;
3502 }
3503 while ( v92 <= &pParty->pPlayers[3] );
3504 if (LODWORD(v727))
3505 {
3506 pParty->pPartyBuffs[PARTY_BUFF_HASTE].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335), v731, 0, 0, 0);
3507
3508 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 0);
3509 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 1);
3510 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 2);
3511 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 3);
3512 }
3513 }
3514 break;
3515 }
3516 case SPELL_SPIRIT_BLESS:
3517 {
3518 switch (v731)
3519 {
3520 case 1: LODWORD(v733) = 300 * (v2 + 12); break;
3521 case 2: LODWORD(v733) = 300 * (v2 + 12); break;
3522 case 3: LODWORD(v733) = 900 * (v2 + 4); break;
3523 case 4: LODWORD(v733) = 3600 * (v2 + 1); break;
3524 default:
3525 assert(false);
3526 }
3527 amount = v2 + 5;
3528 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3529 break;
3530 if ( v731 == 1 )
3531 {
3532 v108 = pCastSpell->uPlayerID_2;
3533 v109 = pCastSpell->spellnum;
3534 v110 = pGame->GetStru6();
3535 pGame->GetStru6()->SetPlayerBuffAnim(v109, v108);
3536 v111 = pOtherOverlayList->_4418B1(10000, pCastSpell->uPlayerID_2 + 310, 0, 65536);
3537 //v668 = 0;
3538 v716 = v111;
3539 //v658 = v111;
3540 //v653 = amount;
3541 //v651 = 1;
3542 //v28 = pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335);
3543 //v27 = (char *)&pParty->pPlayers[v3->uPlayerID_2].pPlayerBuffs[PLAYER_BUFF_BLESS];
3544 //LABEL_103:
3545 //HIDWORD(v650) = HIDWORD(v28);
3546 //LABEL_104:
3547 //LODWORD(v650) = v28;
3548 pParty->pPlayers[pCastSpell->uPlayerID_2].pPlayerBuffs[PLAYER_BUFF_BLESS].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335), 1, amount, v111, 0);
3549 LODWORD(v727) = 1;
3550 break;
3551 }
3552 v105 = 0;
3553 v717 = (signed int)(signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335);
3554 v730b = pParty->pPlayers;//[0].pPlayerBuffs[1];
3555 do
3556 {
3557 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, v105);
3558 v716 = pOtherOverlayList->_4418B1(10000, v105 + 310, 0, 65536);
3559 v730b->pPlayerBuffs[1].Apply(pParty->uTimePlayed + v717, v731, amount, v716, 0);
3560 ++v730b;
3561 ++v105;
3562 }
3563 while ( v730b <= &pParty->pPlayers[3] );
3564 LODWORD(v727) = 1;
3565 break;
3566 }
3567 case SPELL_SPIRIT_SPIRIT_LASH:
3568 {
3569 if ( pPlayer->CanCastSpell(uRequiredMana) && a2 && PID_TYPE(a2) == OBJECT_Actor)
3570 {
3571 //v730 = a2 >> 3;
3572 v112 = &pActors[PID_ID(a2)];
3573 //v726 = (Player *)abs(v112->vPosition.z - pParty->vPosition.z);
3574 v721 = abs(v112->vPosition.y - pParty->vPosition.y);
3575 v113 = abs(v112->vPosition.x - pParty->vPosition.x);
3576 _this = (ItemGen *)v113;
3577 v114 = v721;
3578 v115 = (unsigned int)abs(v112->vPosition.z - pParty->vPosition.z);
3579 if ( v113 < v721 )
3580 {
3581 v116 = v113;
3582 v113 = v721;
3583 v114 = v116;
3584 }
3585 if ( v113 < (signed int)v115 )
3586 {
3587 v117 = v113;
3588 v113 = (int)v115;
3589 v115 = v117;
3590 }
3591 if ( v114 < (signed int)v115 )
3592 {
3593 v118 = v115;
3594 v115 = v114;
3595 v114 = v118;
3596 }
3597 _this = (ItemGen *)(((unsigned int)(11 * v114) >> 5) + (v115 >> 2) + v113);
3598 if ( (double)(signed int)this <= 307.2 )
3599 {
3600 v701.x = 0;
3601 v701.y = 0;
3602 v701.z = 0;
3603 pSpellSprite.stru_24.Reset();
3604 pSpellSprite.spell_id = pCastSpell->spellnum;
3605 pSpellSprite.spell_level = v723;
3606 pSpellSprite.spell_skill = v731;
3607 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
3608 pSpellSprite.uAttributes = 0;
3609 pSpellSprite.uSectorID = 0;
3610 pSpellSprite.uSpriteFrameID = 0;
3611 pSpellSprite.field_60_distance_related_prolly_lod = 0;
3612 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
3613 pSpellSprite.uFacing = 0;
3614 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
3615 pSpellSprite.vPosition.x = v112->vPosition.x;
3616 pSpellSprite.vPosition.y = v112->vPosition.y;
3617 pSpellSprite.vPosition.z = v112->vPosition.z - (unsigned int)(signed __int64)((double)(signed int)v112->uActorHeight * unk_4D8548);
3618 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, a2);
3619 v122 = pSpellSprite.Create(0, 0, 0, 0);
3620 DamageMonsterFromParty(PID(OBJECT_Item, v122), PID_ID(a2), &v701);
3621 LODWORD(v727) = 1;
3622 }
3623 else
3624 {
3625 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2u);
3626 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
3627 pCastSpell->spellnum = 0;
3628 }
3629 //pCastSpell = (CastSpellInfo *)HIDWORD(v733);
3630 }
3631 break;
3632 }
3633 case SPELL_AIR_SHIELD:
3634 case SPELL_EARTH_STONESKIN:
3635 case SPELL_SPIRIT_HEROISM:
3636 {
3637 switch (v731)
3638 {
3639 case 1: LODWORD(v733) = 300 * (v2 + 12); break;
3640 case 2: LODWORD(v733) = 300 * (v2 + 12); break;
3641 case 3: LODWORD(v733) = 900 * (v2 + 4); break;
3642 case 4: LODWORD(v733) = 3600 * (v2 + 1); break;
3643 default:
3644 assert(false);
3645 }
3646 v127 = pCastSpell->spellnum;
3647 if ( v127 == 17 )
3648 {
3649 amount = 0;
3650 LODWORD(v725) = 14;
3651 }
3652 else
3653 {
3654 if ( v127 == 38 )
3655 {
3656 LODWORD(v725) = 15;
3657 amount = v2 + 5;
3658 }
3659 else
3660 {
3661 if ( v127 != 51 )
3662 continue;
3663 LODWORD(v725) = 9;
3664 amount = v2 + 5;
3665 }
3666 }
3667 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3668 break;
3669 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 0);
3670 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 1);
3671 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 2);
3672 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 3);
3673 v90 = (double)(signed int)((int)v733 << 7) * 0.033333335;
3674 //LABEL_304:
3675 pParty->pPartyBuffs[LODWORD(v725)].Apply(pParty->uTimePlayed + (signed int)(signed __int64)v90, v731, amount, 0, 0);
3676 LODWORD(v727) = 1;
3677 break;
3678 }
3679 case SPELL_FIRE_IMMOLATION:
3680 {
3681 if ( v731 == 4 )
3682 LODWORD(v733) = 600 * v2;
3683 else
3684 LODWORD(v733) = 60 * v2;
3685 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3686 break;
3687
3688 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 0);
3689 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 1);
3690 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 2);
3691 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 3);
3692
3693 pParty->pPartyBuffs[PARTY_BUFF_IMMOLATION].Apply(pParty->uTimePlayed + (signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335), v731, v2, 0, 0);
3694 LODWORD(v727) = 1;
3695 break;
3696 }
3697 case SPELL_FIRE_METEOR_SHOWER:
3698 {
3699 //v149 = v731 - 1;
3700 //if ( v149 && (v150 = v149 - 1) != 0 && (v151 = v150 - 1) != 0 )
3701 int i;
3702 if ( v731 == 4 )
3703 {
3704 i = 20;
3705 }
3706 else
3707 {
3708 i = 16;
3709 }
3710 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor)
3711 {
3712 ShowStatusBarString(pGlobalTXT_LocalizationStrings[491], 2); // Can't cast Meteor Shower indoors!
3713 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
3714 pCastSpell->spellnum = 0;
3715 continue;
3716 }
3717 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3718 break;
3719 LODWORD(v725) = PID_TYPE(a2);
3720 if (PID_TYPE(a2) == OBJECT_Actor)
3721 {
3722 uRequiredMana = pActors[PID_ID(a2)].vPosition.x;
3723 v153 = pActors[PID_ID(a2)].vPosition.y;
3724 v154 = pActors[PID_ID(a2)].vPosition.z;
3725 LODWORD(v727) = v153;
3726 }
3727 else
3728 {
3729 v155 = stru_5C6E00->Cos(pParty->sRotationY);
3730 uRequiredMana = pParty->vPosition.x + sub_42EBBE(2048, v155);
3731 v156 = stru_5C6E00->Sin(pParty->sRotationY);
3732 LODWORD(v727) = pParty->vPosition.y + sub_42EBBE(2048, v156);
3733 v154 = pParty->vPosition.z;
3734 }
3735 unsigned __int64 k = 0;
3736 int j = 0;
3737 if ( (signed int)i > 0 )
3738 {
3739 v730 = LODWORD(v725) == 3 ? a2 : 0;
3740 do
3741 {
3742 a2 = rand() % 1000;
3743 if ( sqrt((double)(rand() % 1000) - 2500 *
3744 (double)(rand() % 1000) - 2500 +
3745 j * j + k * k) <= 1.0 )
3746 {
3747 LODWORD(v687) = 0;
3748 HIDWORD(v687) = 0;
3749 }
3750 else
3751 {
3752 v687 = __PAIR__(
3753 stru_5C6E00->Atan2((signed __int64)sqrt((float)(j * j + k * k)),
3754 (double)(rand() % 1000) - 2500),
3755 stru_5C6E00->Atan2(j, k));
3756 }
3757 pSpellSprite.stru_24.Reset();
3758 pSpellSprite.spell_id = pCastSpell->spellnum;
3759 pSpellSprite.spell_level = v2;
3760 pSpellSprite.spell_skill = v731;
3761 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
3762 pSpellSprite.uAttributes = 0;
3763 pSpellSprite.vPosition.x = uRequiredMana;
3764 pSpellSprite.vPosition.y = LODWORD(v727);
3765 pSpellSprite.uSectorID = 0;
3766 pSpellSprite.vPosition.z = a2 + v154;
3767 pSpellSprite.uSpriteFrameID = 0;
3768 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
3769 pSpellSprite.spell_target_pid = v730;
3770 pSpellSprite.field_60_distance_related_prolly_lod = stru_50C198._427546(a2 + 2500);
3771 pSpellSprite.uFacing = v687;
3772 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
3773 if ( pParty->bTurnBasedModeOn == 1 )
3774 pSpellSprite.uAttributes = 4;
3775 if ( pSpellSprite.Create(v687, SHIDWORD(v687), pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed, 0) != -1
3776 && pParty->bTurnBasedModeOn == 1 )
3777 ++pTurnEngine->field_1C;
3778 j = rand() % 1024 - 512;
3779 k = rand() % 1024 - 512;
3780 }
3781 while ( i-- != 1 );
3782 }
3783 LODWORD(v727) = 1;
3784 break;
3785 }
3786 case SPELL_FIRE_INFERNO:
3787 {
3788 //v67 = 2;
3789 if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor)
3790 {
3791 ShowStatusBarString(pGlobalTXT_LocalizationStrings[492], 2); // Can't cast Inferno outdoors!
3792 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
3793 pCastSpell->spellnum = 0;
3794 continue;
3795 }
3796 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3797 break;
3798 auto _v726 = sub_46A6AC((int)dword_50BF30.data(), 100, 4096);
3799 v700.z = 0;
3800 v700.y = 0;
3801 v700.x = 0;
3802 pSpellSprite.stru_24.Reset();
3803 pSpellSprite.spell_id = pCastSpell->spellnum;
3804 pSpellSprite.spell_level = v2;
3805 pSpellSprite.spell_skill = v731;
3806 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
3807 pSpellSprite.uAttributes = 0;
3808 pSpellSprite.uSectorID = 0;
3809 pSpellSprite.uSpriteFrameID = 0;
3810 pSpellSprite.field_60_distance_related_prolly_lod = 0;
3811 pSpellSprite.uFacing = 0;
3812 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
3813 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
3814 a2 = 0;
3815 if ( (signed int)_v726 > 0 )
3816 {
3817 do
3818 {
3819 v162 = dword_50BF30[a2];
3820 pSpellSprite.vPosition.x = pActors[v162].vPosition.x;
3821 pSpellSprite.vPosition.y = pActors[v162].vPosition.y;
3822 pSpellSprite.vPosition.z = pActors[v162].vPosition.z - (unsigned int)(signed __int64)((double)pActors[v162].uActorHeight * unk_4D8548);
3823 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, dword_50BF30[a2]);
3824 v164 = pSpellSprite.Create(0, 0, 0, 0);
3825 v165 = a2;
3826 DamageMonsterFromParty(PID(OBJECT_Item, v164), dword_50BF30[a2], &v700);
3827 pGame->GetStru6()->_4A81CA(&pSpellSprite);
3828 pGame->GetStru6()->FadeScreen__like_Turn_Undead_and_mb_Armageddon(0xFF3C1Eu, 0x40u);
3829 a2 = v165 + 1;
3830 }
3831 while ( v165 + 1 < (signed int)_v726 );
3832 }
3833 LODWORD(v727) = 1;
3834 break;
3835 }
3836 case SPELL_AIR_WIZARD_EYE:
3837 {
3838 LODWORD(v733) = 3600 * v2;
3839 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3840 break;
3841 v168 = 0;
3842 do
3843 {
3844 v169 = pOtherOverlayList->_4418B1(2000, v168++ + 100, 0, 65536);
3845 v716 = v169;
3846 }
3847 while ( v168 < 4 );
3848
3849 pParty->pPartyBuffs[PARTY_BUFF_WIZARD_EYE].Apply(pParty->uTimePlayed + (signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335), v731, 0, 0, 0);
3850 LODWORD(v727) = 1;
3851 break;
3852 }
3853 case SPELL_AIR_FEATHER_FALL:
3854 {
3855 switch (v731)
3856 {
3857 case 1: LODWORD(v733) = 300 * v2; break;
3858 case 2: LODWORD(v733) = 600 * v2; break;
3859 case 3: LODWORD(v733) = 3600 * v2; break;
3860 case 4: LODWORD(v733) = 3600 * v2; break;
3861 default:
3862 assert(false);
3863 }
3864 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3865 break;
3866 v174 = 0;
3867 do
3868 pOtherOverlayList->_4418B1(2010, v174++ + 100, 0, 65536);
3869 while ( v174 < 4 );
3870 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 0);
3871 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 1);
3872 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 2);
3873 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 3);
3874
3875 pParty->pPartyBuffs[PARTY_BUFF_FEATHER_FALL].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335), v731, 0, 0, 0);
3876 LODWORD(v727) = 1;
3877 break;
3878 }
3879 case SPELL_AIR_SPARKS:
3880 {
3881 switch (v731)
3882 {
3883 case 1: amount = 3; break;
3884 case 2: amount = 5; break;
3885 case 3: amount = 7; break;
3886 case 4: amount = 9; break;
3887 default:
3888 assert(false);
3889 }
3890 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3891 break;
3892 auto _v726 = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360;
3893 pSpellSprite.stru_24.Reset();
3894 pSpellSprite.spell_id = pCastSpell->spellnum;
3895 pSpellSprite.spell_level = v2;
3896 pSpellSprite.spell_skill = v731;
3897 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
3898 pSpellSprite.vPosition.y = pParty->vPosition.y;
3899 pSpellSprite.vPosition.x = pParty->vPosition.x;
3900 pSpellSprite.uAttributes = 0;
3901 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
3902 pSpellSprite.uSectorID = pIndoor->GetSector(
3903 pParty->vPosition.x,
3904 pParty->vPosition.y,
3905 pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3);
3906 pSpellSprite.uSpriteFrameID = 0;
3907 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
3908 pSpellSprite.spell_target_pid = a2;
3909 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
3910 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
3911 if ( pParty->bTurnBasedModeOn == 1 )
3912 LOBYTE(pSpellSprite.uAttributes) |= 4u;
3913 v188 = (signed int)_v726 / -2;
3914 v189 = (signed int)_v726 / 2;
3915 while ( v188 <= v189 )
3916 {
3917 pSpellSprite.uFacing = v188 + LOWORD(v715.uYawAngle);
3918 if ( pSpellSprite.Create(
3919 (signed __int16)(v188 + LOWORD(v715.uYawAngle)),
3920 v715.uPitchAngle,
3921 pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed,
3922 pCastSpell->uPlayerID + 1) != -1
3923 && pParty->bTurnBasedModeOn == 1 )
3924 ++pTurnEngine->field_1C;
3925 v188 += _v726 / (amount - 1);
3926 }
3927 LODWORD(v727) = 1;
3928 break;
3929 }
3930 case SPELL_AIR_JUMP:
3931 {
3932 if ( pParty->uFlags & PARTY_FLAGS_1_FALLING)
3933 {
3934 ShowStatusBarString(pGlobalTXT_LocalizationStrings[493], 2); // Can't cast Jump while airborne!
3935 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
3936 break;
3937 }
3938 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3939 break;
3940 v191 = 0;
3941 do
3942 pOtherOverlayList->_4418B1(2040, v191++ + 100, 0, 65536);
3943 while ( v191 < 4 );
3944 BYTE1(pParty->uFlags) |= 1u;
3945 pParty->uFallSpeed = 1000;
3946 LODWORD(v727) = 1;
3947 break;
3948 }
3949 case SPELL_AIR_INVISIBILITY:
3950 {
3951 switch (v731)
3952 {
3953 case 1: LODWORD(v733) = 600 * v2; amount = v2; break;
3954 case 2: LODWORD(v733) = 600 * v2; amount = 2 * v2; break;
3955 case 3: LODWORD(v733) = 600 * v2; amount = 3 * v2; break;
3956 case 4: LODWORD(v733) = 3600 * v2; amount = 4 * v2; break;
3957 default:
3958 assert(false);
3959 }
3960 if (pParty->uFlags & (PARTY_FLAGS_1_ALERT_RED | PARTY_FLAGS_1_ALERT_YELLOW))
3961 {
3962 ShowStatusBarString(pGlobalTXT_LocalizationStrings[638], 2); // There are hostile creatures nearby!
3963 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
3964 pCastSpell->spellnum = 0;
3965 continue;
3966 }
3967 if ( pPlayer->CanCastSpell(uRequiredMana) )
3968 {
3969 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 0);
3970 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 1);
3971 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 2);
3972 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 3);
3973
3974 pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335), v731, amount, 0, 0);
3975 LODWORD(v727) = 1;
3976 }
3977 break;
3978 }
3979 case SPELL_AIR_FLY:
3980 {
3981 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor)
3982 {
3983 ShowStatusBarString(pGlobalTXT_LocalizationStrings[494], 2); // Can not cast Fly indoors!
3984 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
3985 break;
3986 }
3987 if ( !pPlayers[pCastSpell->uPlayerID + 1]->GetMaxMana() )
3988 {
3989 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
3990 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
3991 break;
3992 }
3993 LODWORD(v733) = 3600 * v2;
3994 if ( v731 == 1 || v731 == 2 || v731 == 3 )
3995 amount = 1;
3996 else
3997 amount = 0;
3998 if ( !pPlayer->CanCastSpell(uRequiredMana) )
3999 break;
4000 v205 = 0;
4001 do
4002 pOtherOverlayList->_4418B1(2090, v205++ + 100, 0, 65536);
4003 while ( v205 < 4 );
4004 v206 = pOtherOverlayList->_4418B1(10008, 203, 0, 65536);
4005 v207 = pCastSpell->uPlayerID + 1;
4006 v716 = v206;
4007
4008 pParty->pPartyBuffs[PARTY_BUFF_FLY].Apply(pParty->uTimePlayed + (signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335), v731, amount, v206, v207);
4009 LODWORD(v727) = 1;
4010 break;
4011 }
4012 case SPELL_AIR_STARBURST:
4013 {
4014 //v67 = 2;
4015 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor)
4016 {
4017 ShowStatusBarString(pGlobalTXT_LocalizationStrings[495], 2); // Can't cast Starburst indoors!
4018 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
4019 pCastSpell->spellnum = 0;
4020 continue;
4021 }
4022 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4023 break;
4024 v208 = PID_TYPE(a2);
4025 LODWORD(v725) = PID_TYPE(a2);
4026 if ( v208 == 3 )
4027 {
4028 v209 = PID_ID(a2);
4029 LODWORD(v718) = pActors[v209].vPosition.x;
4030 v210 = pActors[v209].vPosition.y;
4031 v211 = pActors[v209].vPosition.z;
4032 v713 = v210;
4033 }
4034 else
4035 {
4036 v212 = stru_5C6E00->Cos(pParty->sRotationY);
4037 LODWORD(v718) = pParty->vPosition.x + sub_42EBBE(2048, v212);
4038 v213 = stru_5C6E00->Sin(pParty->sRotationY);
4039 v214 = sub_42EBBE(2048, v213);
4040 v211 = pParty->vPosition.z;
4041 v713 = pParty->vPosition.y + v214;
4042 v208 = LODWORD(v725);
4043 }
4044 signed int _v733 = 0;
4045 *(float *)&v732 = (double)v211;
4046 LODWORD(v725) = v211 + 2500;
4047 v721 = 0;
4048 *(float *)&y = (double)(v211 + 2500);
4049 v730 = v208 == 3 ? a2 : 0;
4050 a2 = 20;
4051 do
4052 {
4053 v215 = rand();
4054 v216 = (double)v721;
4055 v217 = (double)_v733;
4056 *(float *)&uRequiredMana = v217;
4057 _this = (ItemGen *)(v215 % 1000);
4058 *((float *)&v733 + 1) = (double)(v215 % 1000) + *(float *)&v732 - *(float *)&y;
4059 *(float *)&v721 = v217 * v217;
4060 //*(float *)&v726 = v216 * v216;
4061 if ( sqrt(*((float *)&v733 + 1) * *((float *)&v733 + 1) + v216 * v216 + *(float *)&v721) <= 1.0 )
4062 {
4063 LODWORD(v685) = 0;
4064 HIDWORD(v685) = 0;
4065 }
4066 else
4067 {
4068 v684 = (signed __int64)sqrt(v216 * v216 + *(float *)&v721);
4069 v685 = __PAIR__(
4070 stru_5C6E00->Atan2(v684, (signed __int64)*((float *)&v733 + 1)),
4071 stru_5C6E00->Atan2((signed __int64)v216, (signed __int64)*(float *)&uRequiredMana));
4072 }
4073 pSpellSprite.stru_24.Reset();
4074 pSpellSprite.spell_id = pCastSpell->spellnum;
4075 pSpellSprite.spell_level = v2;
4076 pSpellSprite.spell_skill = v731;
4077 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
4078 pSpellSprite.uAttributes = 0;
4079 pSpellSprite.vPosition.x = LODWORD(v718);
4080 pSpellSprite.vPosition.y = v713;
4081 pSpellSprite.uSectorID = 0;
4082 pSpellSprite.vPosition.z = (int)((char *)_this + LODWORD(v725));
4083 pSpellSprite.uSpriteFrameID = 0;
4084 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
4085 pSpellSprite.spell_target_pid = v730;
4086 //__debugbreak();//çâåçäîïàä
4087 pSpellSprite.field_60_distance_related_prolly_lod = stru_50C198._427546((int)&_this[69].uNumCharges);
4088 pSpellSprite.uFacing = v685;
4089 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
4090 if ( pParty->bTurnBasedModeOn == 1 )
4091 pSpellSprite.uAttributes = 4;
4092 if ( pSpellSprite.Create(v685, SHIDWORD(v685), pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed, 0) != -1
4093 && pParty->bTurnBasedModeOn == 1 )
4094 ++pTurnEngine->field_1C;
4095 v721 = rand() % 1024 - 512;
4096 v218 = rand();
4097 v14 = a2-- == 1;
4098 _v733 = (unsigned __int64)(v218 % 1024) - 512;
4099 }
4100 while ( !v14 );
4101 LODWORD(v727) = 1;
4102 break;
4103 }
4104 case SPELL_WATER_AWAKEN:
4105 {
4106 switch (v731)
4107 {
4108 case 1: amount = 180 * v2; break;
4109 case 2: amount = 3600 * v2; break;
4110 case 3: amount = 86400 * v2; break;
4111 case 4: amount = 0; break;
4112 default:
4113 assert(false);
4114 }
4115 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4116 break;
4117 for( int i=0; i < 4; i++ )
4118 {
4119 pPlayer = &pParty->pPlayers[i];
4120 if ( v731 == 4 )
4121 {
4122 if ( pPlayer->pConditions[2] )
4123 {
4124 //*((int *)v222 + 4) = 0;
4125 //*((int *)v222 + 5) = 0;
4126 pPlayer->pConditions[2] = 0;
4127 pPlayer->PlaySound(SPEECH_103, 0);
4128 }
4129 }
4130 else
4131 {
4132 v223 = pPlayer->DiscardConditionIfLastsLongerThan(
4133 2u,
4134 pParty->uTimePlayed - (signed int)(signed __int64)((double)(amount << 7) * 0.033333335));
4135 if ( v223 )
4136 pPlayer->PlaySound(SPEECH_103, 0);
4137 }
4138 }
4139 LODWORD(v727) = 1;
4140 break;
4141 }
4142 case SPELL_WATER_POISON_SPRAY:
4143 {
4144 switch (v731)
4145 {
4146 case 1: amount = 1; break;
4147 case 2: amount = 3; break;
4148 case 3: amount = 5; break;
4149 case 4: amount = 7; break;
4150 default:
4151 assert(false);
4152 }
4153 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4154 break;
4155 signed int _v733 = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360;
4156 if ( amount == 1 )
4157 {
4158 pSpellSprite.stru_24.Reset();
4159 pSpellSprite.spell_id = pCastSpell->spellnum;
4160 pSpellSprite.spell_skill = v731;
4161 pSpellSprite.spell_level = v2;
4162 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
4163 pSpellSprite.vPosition.y = pParty->vPosition.y;
4164 v51 = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
4165 v671 = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
4166 v660 = pParty->vPosition.y;
4167 // LABEL_153:
4168 pSpellSprite.uAttributes = 0;
4169 pSpellSprite.vPosition.x = pParty->vPosition.x;
4170 pSpellSprite.vPosition.z = v51;
4171 v52 = pIndoor->GetSector(pParty->vPosition.x, v660, v671);
4172 pSpellSprite.uSpriteFrameID = 0;
4173 pSpellSprite.uSectorID = v52;
4174 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
4175 pSpellSprite.spell_target_pid = a2;
4176 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
4177 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
4178 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
4179 if ( pParty->bTurnBasedModeOn == 1 )
4180 LOBYTE(pSpellSprite.uAttributes) |= 4u;
4181 v659 = pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed;
4182 if ( pSpellSprite.Create(v715.uYawAngle, v715.uPitchAngle, v659, pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
4183 ++pTurnEngine->field_1C;
4184 }
4185 else
4186 {
4187 pSpellSprite.stru_24.Reset();
4188 pSpellSprite.spell_id = pCastSpell->spellnum;
4189 pSpellSprite.spell_level = v2;
4190 pSpellSprite.spell_skill = v731;
4191 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
4192 pSpellSprite.vPosition.y = pParty->vPosition.y;
4193 pSpellSprite.vPosition.x = pParty->vPosition.x;
4194 pSpellSprite.uAttributes = 0;
4195 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
4196 pSpellSprite.uSectorID = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3);
4197 pSpellSprite.uSpriteFrameID = 0;
4198 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
4199 pSpellSprite.spell_target_pid = a2;
4200 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
4201 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
4202 if ( pParty->bTurnBasedModeOn == 1 )
4203 LOBYTE(pSpellSprite.uAttributes) |= 4u;
4204 v227 = _v733 / -2;
4205 signed int _y = _v733 / 2;
4206 if ( _v733 / -2 <= _v733 / 2 )
4207 {
4208 v228 = v715.uYawAngle;
4209 do
4210 {
4211 pSpellSprite.uFacing = v227 + v228;
4212 if ( pSpellSprite.Create(
4213 v227 + v228,
4214 v715.uPitchAngle,
4215 pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed,
4216 pCastSpell->uPlayerID + 1) != -1
4217 && pParty->bTurnBasedModeOn == 1 )
4218 ++pTurnEngine->field_1C;
4219 v227 += _v733 / (amount - 1);
4220 }
4221 while ( v227 <= _y );
4222 }
4223 }
4224 LODWORD(v727) = 1;
4225 break;
4226 }
4227 case SPELL_WATER_WATER_WALK:
4228 {
4229 if ( !pPlayers[pCastSpell->uPlayerID + 1]->GetMaxMana() )
4230 {
4231 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
4232 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
4233 break;
4234 }
4235 if ( v731 == 2 || v731 != 3 && v731 != 4 )
4236 v229 = 600 * v2;
4237 else
4238 v229 = 3600 * v2;
4239 LODWORD(v733) = v229;
4240 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4241 break;
4242 v716 = pOtherOverlayList->_4418B1(10005, 201, 0, 65536);
4243 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 0);
4244 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 1);
4245 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 2);
4246 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 3);
4247
4248 pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].Apply(
4249 pParty->uTimePlayed + (signed int)(signed __int64)((double)(v229 << 7) * 0.033333335),
4250 v731,
4251 amount,
4252 v716,
4253 pCastSpell->uPlayerID + 1);
4254 if ( v731 == 4 )
4255 pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uFlags = 1;
4256 LODWORD(v727) = 1;
4257 break;
4258 }
4259 case SPELL_WATER_RECHARGE_ITEM:
4260 {
4261 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4262 break;
4263 v240 = &pParty->pPlayers[pCastSpell->uPlayerID_2].pInventoryItems[a2];
4264
4265 if ( pItemsTable->pItems[v240->uItemID].uEquipType != 12 || v240->uAttributes & 2 )
4266 {
4267 dword_50C9D0 = 113;
4268 dword_50C9D4 = 0;
4269 dword_50C9D8 = 1;
4270
4271 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
4272 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
4273 pCastSpell->spellnum = 0;
4274 continue;
4275 }
4276 if ( v731 == 1 || v731 == 2 )
4277 {
4278 v241 = (double)v723 * 0.0099999998 + 0.5;
4279 }
4280 else if ( v731 == 3 )
4281 {
4282 v241 = (double)v723 * 0.0099999998 + 0.69999999;
4283 }
4284 else if ( v731 == 4 )
4285 {
4286 v241 = (double)v723 * 0.0099999998 + 0.80000001;
4287 }
4288 else
4289 {
4290 v241 = 0.0;
4291 }
4292 if ( v241 > 1.0 )
4293 v241 = 1.0;
4294 int uNewCharges = v240->uMaxCharges * v241;
4295 v240->uMaxCharges = uNewCharges;
4296 v240->uNumCharges = uNewCharges;
4297 if ( uNewCharges <= 0 )
4298 {
4299 v240 = 0;
4300 dword_50C9D0 = 113;
4301 dword_50C9D4 = 0;
4302 dword_50C9D8 = 1;
4303 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2u);
4304 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
4305 pCastSpell->spellnum = 0;
4306 v2 = v723;
4307 continue;
4308 }
4309 v240->uAttributes |= 0x40u;
4310 _50C9A8_item_enchantment_timer = 256;
4311 LODWORD(v727) = 1;
4312 break;
4313 }
4314 case SPELL_WATER_ENCHANT_ITEM:
4315 {
4316 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4317 break;
4318 uRequiredMana = 0;
4319 amount = 10 * v2;
4320 v730 = 1;
4321 pPlayer = &pParty->pPlayers[pCastSpell->uPlayerID_2];
4322 v245 = &pPlayer->pInventoryItems[a2];
4323 ItemDesc *_v725 = &pItemsTable->pItems[v245->uItemID];
4324 if (
4325 v731 == 1 || v731 == 2 && _v725->uEquipType > 2 ||
4326 v731 == 3 || v731 == 4 &&
4327 v245->uItemID <= 134 &&
4328 v245->uSpecEnchantmentType == 0 &&
4329 v245->uEnchantmentType == 0 &&
4330 v245->_bonus_strength== 0 &&
4331 !v245->Broken() )
4332 {
4333 if ( v245->GetValue() < 450 ||
4334 (v245->GetValue() < 250 && (v731 == 3 || v731 == 4) && _v725->uEquipType >= 0 && _v725->uEquipType <= 2)
4335 )
4336 {
4337 v730 = 0;
4338 }
4339 if ( rand() % 100 < 10 * v2 ||
4340 (rand() % 100 < 80 && (v731 == 3 || v731 == 4 )) ||
4341 v245->GetValue() < 450 ||
4342 (v245->GetValue() < 250 && (v731 == 3 || v731 == 4) && v271 >= 0 && v271 <= 2)
4343 )
4344 {
4345 v313 = _v725->uEquipType;
4346 if ( _v725->uEquipType >= 3 && _v725->uEquipType <= 11 )
4347 {
4348 v295 = rand() % 10;// pItemsTable->field_116D8[pItemsTable->pItems[_this->uItemID].uEquipType];
4349 v245->uEnchantmentType = 0;
4350 for ( kk = pItemsTable->pEnchantments[0].to_item[pItemsTable->pItems[v245->uItemID].uEquipType + 1];
4351 ;
4352 kk += pItemsTable->pEnchantments[v294->uEnchantmentType].to_item[pItemsTable->pItems[v245->uItemID].uEquipType + 1] )
4353 {
4354 ++v245->uEnchantmentType;
4355 if ( kk >= v295 )
4356 break;
4357 }
4358 v255 = 10;//pItemsTable->field_116D8[17];
4359 v256 = 10;//pItemsTable->field_116D8[16];
4360 v245->_bonus_strength = v256 + rand() % (v255 - v256 + 1);
4361 v245->uAttributes |= 0x20u;
4362 _50C9A8_item_enchantment_timer = 256;
4363 LODWORD(v727) = 1;
4364 break;
4365 }
4366 else if ( v731 == 3 || v731 == 4)
4367 {
4368 v257 = pItemsTable->pSpecialEnchantments_count;
4369 v258 = 0;
4370 v725 = 0.0;
4371 int _v733 = 0;
4372 if ( pItemsTable->pSpecialEnchantments_count > 0 )
4373 {
4374 v730 = (int)&v679;
4375 do
4376 {
4377 v259 = LOBYTE(pItemsTable->pSpecialEnchantments[v258 + 1].pBonusStatement);
4378 if ( !v259 || v259 == 1 )
4379 {
4380 v260 = *(&pItemsTable->pSpecialEnchantments[0].to_item_apply[pItemsTable->pItems[*(int *)v245].uEquipType
4381 + 4]
4382 + v258 * 28);
4383 LODWORD(v725) += v260;
4384 if ( v260 )
4385 {
4386 v261 = v730;
4387 v730 += 4;
4388 *(int *)v261 = _v733;
4389 }
4390 }
4391 ++_v733;
4392 ++v258;
4393 }
4394 while ( _v733 < v257 );
4395 }
4396 v262 = rand() % SLODWORD(v725);
4397 v263 = v679;
4398 v245->uSpecEnchantmentType = v679[0];
4399 v264 = pItemsTable->pSpecialEnchantments[*v263].to_item_apply[pItemsTable->pItems[*(int *)v245].uEquipType + 4];
4400 v265 = v262 + 1;
4401 if ( v264 < v265 )
4402 {
4403 for ( ii = v679; ; ii = (int *)v732 )
4404 {
4405 v267 = (int)(ii + 1);
4406 v732 = v267;
4407 v268 = *(int *)v267;
4408 *(int *)(v245 + 12) = v268;
4409 v264 += pItemsTable->pSpecialEnchantments[v268].to_item_apply[pItemsTable->pItems[*(int *)v245].uEquipType
4410 + 4];
4411 if ( v264 >= v265 )
4412 break;
4413 }
4414 }
4415
4416 v277 = pItemsTable->pSpecialEnchantments_count;
4417 v278 = 0;
4418 v725 = 0.0;
4419 _v733 = 0;
4420 if ( pItemsTable->pSpecialEnchantments_count > 0 )
4421 {
4422 int *_v730 = v679;
4423 do
4424 {
4425 v279 = LOBYTE(pItemsTable->pSpecialEnchantments[v278].pBonusStatement);
4426 if ( !v279 || v279 == 1 )
4427 {
4428 v280 = *(&pItemsTable->pSpecialEnchantments[v278].to_item_apply[pItemsTable->pItems[v245->uItemID].uEquipType]);
4429 _v733 += v280;
4430 if ( v280 )
4431 {
4432 v281 = _v730;
4433 ++_v730;
4434 *v281 = _v733;
4435 }
4436 }
4437 ++_v733;
4438 ++v278;
4439 }
4440 while ( _v733 < v277 );
4441 }
4442 v282 = rand() % _v733;
4443 v283 = v679;
4444 v245->uSpecEnchantmentType = v679[0];
4445 v284 = pItemsTable->pSpecialEnchantments[*v283].to_item_apply[pItemsTable->pItems[v245->uItemID].uEquipType ];
4446 v285 = v282 + 1;
4447 for ( l = v679; v284 < v285; ++l )
4448 {
4449 v245->uSpecEnchantmentType = *(l+1);
4450 v284 += pItemsTable->pSpecialEnchantments[*(l+1)].to_item_apply[pItemsTable->pItems[v245->uItemID].uEquipType];
4451 }
4452 ++v245->uSpecEnchantmentType;
4453 v245->uAttributes |= 0x20u;
4454 _50C9A8_item_enchantment_timer = 256;
4455 LODWORD(v727) = 1;
4456 break;
4457 }
4458 }
4459 else
4460 {
4461 if ( !(BYTE1(v245->uAttributes) & 2) )
4462 {
4463 v245->uAttributes |= 2;
4464 }
4465 }
4466
4467 }
4468
4469 if ( LODWORD(v727) == 0 )
4470 {
4471 v317 = pGlobalTXT_LocalizationStrings[428];
4472 if ( v730 == 0 )
4473 v317 = pGlobalTXT_LocalizationStrings[585];
4474 ShowStatusBarString(v317, 2u);
4475 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
4476 v318 = &pParty->pPlayers[pCastSpell->uPlayerID_2];
4477 pCastSpell->spellnum = 0;
4478 v318->PlaySound(SPEECH_43, 0);
4479 }
4480
4481 break;
4482 }
4483 case SPELL_WATER_TOWN_PORTAL:
4484 {
4485 amount = 10 * v2;
4486 if ( pPlayer->sMana < (signed int)uRequiredMana )
4487 break;
4488 if ( pParty->uFlags & (PARTY_FLAGS_1_ALERT_RED | PARTY_FLAGS_1_ALERT_YELLOW) && v731 != 4 || rand() % 100 >= amount && v731 != 4 )
4489 {
4490 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
4491 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
4492 pCastSpell->spellnum = 0;
4493 continue;
4494 }
4495 town_portal_caster_id = LOBYTE(pCastSpell->uPlayerID);
4496 pMessageQueue_50CBD0->AddMessage(UIMSG_OnCastTownPortal, 0, 0);
4497 LODWORD(v727) = 1;
4498 break;
4499 }
4500 case SPELL_WATER_LLOYDS_BEACON:
4501 {
4502 LODWORD(v733) = 604800 * v2;
4503 if ( !_stricmp(pCurrentMapName.data(), "d05.blv") )
4504 {
4505 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
4506 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
4507 pCastSpell->spellnum = 0;
4508 continue;
4509 }
4510 v319 = uRequiredMana;
4511 if ( pPlayer->sMana >= (signed int)uRequiredMana )
4512 {
4513 pEventTimer->Pause();
4514 pMessageQueue_50CBD0->AddMessage(UIMSG_OnCastLloydsBeacon, 0, 0);
4515 qword_506350 = (signed int)v733;
4516 _506348_current_lloyd_playerid = pCastSpell->uPlayerID;
4517 ::uRequiredMana = v319;
4518 ::sRecoveryTime = sRecoveryTime;
4519 dword_50633C = pCastSpell->sound_id;
4520 dword_506338 = pCastSpell->spellnum;
4521 LOBYTE(pCastSpell->field_8) |= 0x20u;
4522 }
4523 break;
4524 }
4525 case SPELL_EARTH_STONE_TO_FLESH:
4526 {
4527 __debugbreak(); // missing GM ?
4528 switch (v731)
4529 {
4530 case 1: amount = 3600 * v2; break;
4531 case 2: amount = 3600 * v2; break;
4532 case 3: amount = 86400 * v2; break;
4533 case 4: break;
4534 default:
4535 assert(false);
4536 }
4537 //LABEL_634:
4538 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4539 break;
4540 v323 = pCastSpell->uPlayerID_2;
4541 v324 = (char *)&pParty->pPlayers[v323].pConditions[15];
4542 if ( !pParty->pPlayers[v323].pConditions[15] )
4543 {
4544 LODWORD(v727) = 1;
4545 break;
4546 }
4547 if ( v731 == 4 )
4548 {
4549 *(int *)v324 = 0;
4550 *((int *)v324 + 1) = 0;
4551 LODWORD(v727) = 1;
4552 break;
4553 }
4554 v732 = amount << 7;
4555 v663 = (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335);
4556 v656 = 15;
4557 v325 = &pParty->pPlayers[v323];
4558 v325->DiscardConditionIfLastsLongerThan(v656, v663);
4559 LODWORD(v727) = 1;
4560 break;
4561 }
4562 case SPELL_EARTH_ROCK_BLAST:
4563 {
4564 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4565 break;
4566 pSpellSprite.stru_24.Reset();
4567 pSpellSprite.spell_id = pCastSpell->spellnum;
4568 pSpellSprite.spell_level = v2;
4569 pSpellSprite.spell_skill = v731;
4570 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
4571 pSpellSprite.vPosition.y = pParty->vPosition.y;
4572 pSpellSprite.vPosition.x = pParty->vPosition.x;
4573 pSpellSprite.uAttributes = 0;
4574 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
4575 pSpellSprite.uSectorID = pIndoor->GetSector(
4576 pParty->vPosition.x,
4577 pParty->vPosition.y,
4578 pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3);
4579 pSpellSprite.uSpriteFrameID = 0;
4580 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
4581 pSpellSprite.spell_target_pid = a2;
4582 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
4583 pSpellSprite.uFacing = LOWORD(pParty->sRotationY);
4584 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
4585 if ( pParty->bTurnBasedModeOn == 1 )
4586 LOBYTE(pSpellSprite.uAttributes) |= 4u;
4587
4588 v659 = pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed;
4589 if ( pSpellSprite.Create(pParty->sRotationY, pParty->sRotationX, v659, pCastSpell->uPlayerID + 1) != -1 && pParty->bTurnBasedModeOn == 1 )
4590 ++pTurnEngine->field_1C;
4591 LODWORD(v727) = 1;
4592 break;
4593 }
4594 case SPELL_EARTH_DEATH_BLOSSOM:
4595 {
4596 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor)
4597 {
4598 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
4599 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
4600 pCastSpell->spellnum = 0;
4601 continue;
4602 }
4603 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4604 break;
4605 pSpellSprite.uType = 4090;
4606 pSpellSprite.stru_24.Reset();
4607 pSpellSprite.spell_id = pCastSpell->spellnum;
4608 pSpellSprite.spell_level = v2;
4609 pSpellSprite.spell_skill = v731;
4610 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
4611 pSpellSprite.vPosition.x = pParty->vPosition.x;
4612 pSpellSprite.vPosition.y = pParty->vPosition.y;
4613 pSpellSprite.uAttributes = 0;
4614 pSpellSprite.uSectorID = 0;
4615 pSpellSprite.uSpriteFrameID = 0;
4616 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
4617 pSpellSprite.field_60_distance_related_prolly_lod = 0;
4618 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
4619 pSpellSprite.spell_target_pid = a2;
4620 pSpellSprite.uFacing = LOWORD(pParty->sRotationY);
4621 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
4622 if ( pParty->bTurnBasedModeOn == 1 )
4623 pSpellSprite.uAttributes = 4;
4624
4625 v659 = pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed;
4626 if ( pSpellSprite.Create(pParty->sRotationY, stru_5C6E00->uIntegerHalfPi / 2, v659, 0) != -1 && pParty->bTurnBasedModeOn == 1 )
4627 ++pTurnEngine->field_1C;
4628 LODWORD(v727) = 1;
4629 break;
4630 }
4631 case SPELL_SPIRIT_DETECT_LIFE:
4632 {
4633 v328 = v731 - 2;
4634 if ( v328 )
4635 {
4636 v329 = v328 - 1;
4637 if ( v329 && v329 != 1 )
4638 v330 = 600 * v2;
4639 else
4640 v330 = 3600 * v2;
4641 }
4642 else
4643 {
4644 v330 = 1800 * v2;
4645 }
4646 LODWORD(v733) = v330;
4647 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4648 break;
4649 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 0);
4650 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 1);
4651 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 2);
4652 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 3);
4653
4654 pParty->pPartyBuffs[PARTY_BUFF_DETECT_LIFE].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335), v731, 0, 0, 0);
4655 LODWORD(v727) = 1;
4656 break;
4657 }
4658 case SPELL_SPIRIT_FATE:
4659 {
4660 switch (v731)
4661 {
4662 case 1: amount = 1 * v2; break;
4663 case 2: amount = 2 * v2; break;
4664 case 3: amount = 4 * v2; break;
4665 case 4: amount = 6 * v2; break;
4666 default:
4667 assert(false);
4668 }
4669 LODWORD(v733) = 300;
4670 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4671 break;
4672 v342 = pCastSpell->spell_target_pid;
4673 if ( v342 == 0 )
4674 {
4675 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, pCastSpell->uPlayerID_2);
4676
4677 pParty->pPlayers[pCastSpell->uPlayerID_2].pPlayerBuffs[PLAYER_BUFF_FATE].Apply(pParty->uTimePlayed + 1280, v731, amount, 0, 0);
4678 LODWORD(v727) = 1;
4679 break;
4680 }
4681 if (PID_TYPE(v342) == OBJECT_Actor)
4682 {
4683 v343 = PID_ID(v342);
4684 HIDWORD(v344) = 0 + ((pParty->uTimePlayed + 1280) >> 32);
4685 LODWORD(v344) = LODWORD(pParty->uTimePlayed) + 1280;
4686 pActors[v343].pActorBuffs[11].Apply(v344, v731, amount, 0, 0);
4687 BYTE2(pActors[v343].uAttributes) |= 8u;
4688 //v672 = 0;
4689 v661 = &pActors[v343];
4690 pGame->GetStru6()->_4A7E89_sparkles_on_actor_after_it_casts_buff(v661, 0);
4691 }
4692 LODWORD(v727) = 1;
4693 break;
4694 }
4695 case SPELL_SPIRIT_REMOVE_CURSE:
4696 {
4697 switch (v731)
4698 {
4699 case 1: amount = 3600 * v2; break;
4700 case 2: amount = 3600 * v2; break;
4701 case 3: amount = 86400 * v2; break;
4702 case 4: amount = 0; break;
4703 default:
4704 assert(false);
4705 }
4706 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4707 break;
4708 v351 = &pParty->pPlayers[pCastSpell->uPlayerID_2];
4709 if ( !v351->pConditions[0] )
4710 {
4711 LODWORD(v727) = 1;
4712 break;
4713 }
4714 if ( v731 == 4 )
4715 {
4716 LODWORD(v351->pConditions[0]) = 0;
4717 HIDWORD(v351->pConditions[0]) = 0;
4718 }
4719 else
4720 {
4721 v732 = amount << 7;
4722 v351->DiscardConditionIfLastsLongerThan(0, (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
4723 if ( HIDWORD(pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[0]) | LODWORD(pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[0]) )
4724 {
4725 LODWORD(v727) = 1;
4726 break;
4727 }
4728 }
4729 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, pCastSpell->uPlayerID_2);
4730 LODWORD(v727) = 1;
4731 break;
4732 }
4733 case SPELL_SPIRIT_PRESERVATION:
4734 {
4735 if ( v731 == 4 )
4736 LODWORD(v733) = 900 * (v2 + 4);
4737 else
4738 LODWORD(v733) = 300 * (v2 + 12);
4739 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4740 break;
4741 if ( v731 == 1 || v731 == 2 )
4742 {
4743 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, pCastSpell->uPlayerID_2);
4744 pParty->pPlayers[pCastSpell->uPlayerID_2].pPlayerBuffs[PLAYER_BUFF_PRESERVATION].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335), v731, 0, 0, 0);
4745 LODWORD(v727) = 1;
4746 break;
4747 }
4748 a2 = 0;
4749 v717 = (signed int)(signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335);
4750 v357 = pParty->pPlayers;//[0].pPlayerBuffs[11];
4751 do
4752 {
4753 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, a2);
4754 v357->pPlayerBuffs[PLAYER_BUFF_PRESERVATION].Apply(pParty->uTimePlayed + v717, v731, 0, 0, 0);
4755 ++a2;
4756 ++v357;// = (SpellBuff *)((char *)v357 + 6972);
4757 }
4758 while ( v357 <= &pParty->pPlayers[3] );
4759 LODWORD(v727) = 1;
4760 break;
4761 }
4762 case SPELL_SPIRIT_TURN_UNDEAD:
4763 {
4764 if ( v731 == 1 || v731 == 2)
4765 LODWORD(v733) = 60 * (v2 + 3);
4766 else
4767 LODWORD(v733) = 300 * v2 + 180;
4768 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4769 break;
4770 auto _v726 = sub_46A6AC((int)dword_50BF30.data(), 100, 4096);
4771 pGame->GetStru6()->FadeScreen__like_Turn_Undead_and_mb_Armageddon(0xFFFFFFu, 0xC0u);
4772 ++pSpellSprite.uType;
4773 pSpellSprite.stru_24.Reset();
4774 pSpellSprite.spell_id = pCastSpell->spellnum;
4775 pSpellSprite.spell_level = v2;
4776 pSpellSprite.spell_skill = v731;
4777 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
4778 pSpellSprite.uAttributes = 0;
4779 pSpellSprite.uSectorID = 0;
4780 pSpellSprite.uSpriteFrameID = 0;
4781 pSpellSprite.field_60_distance_related_prolly_lod = 0;
4782 pSpellSprite.uFacing = 0;
4783 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
4784 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
4785 for ( a2 = 0; a2 < (signed int)_v726; ++a2 )
4786 {
4787 v369 = &pActors[dword_50BF30[a2]];
4788 if ( MonsterStats::BelongsToSupertype(v369->pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD) )
4789 {
4790 pSpellSprite.vPosition.x = v369->vPosition.x;
4791 pSpellSprite.vPosition.y = v369->vPosition.y;
4792 pSpellSprite.vPosition.z = v369->vPosition.z - (unsigned int)(signed __int64)((double)v369->uActorHeight * unk_4D8548);
4793
4794 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, dword_50BF30[a2]);
4795 pSpellSprite.Create(0, 0, 0, 0);
4796 v369->pActorBuffs[4].Apply(
4797 pParty->uTimePlayed + (signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335),
4798 v731, 0, 0, 0);
4799 }
4800 }
4801 LODWORD(v727) = 1;
4802 break;
4803 }
4804 case SPELL_SPIRIT_RAISE_DEAD:
4805 {
4806 if ( v731 == 4 )
4807 amount = 0;
4808 else
4809 amount = 86400 * v2;
4810 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4811 break;
4812 pOtherOverlayList->_4418B1(5080, pCastSpell->uPlayerID_2 + 100, 0, 65536);
4813 v373 = pCastSpell->uPlayerID_2;
4814 if ( !(HIDWORD(pParty->pPlayers[v373].pConditions[14]) | LODWORD(pParty->pPlayers[v373].pConditions[14])) )
4815 {
4816 LODWORD(v727) = 1;
4817 break;
4818 }
4819 v14 = v731 == 4;
4820 pParty->pPlayers[v373].sHealth = 1;
4821 if ( v14 )
4822 {
4823 v374 = pCastSpell->uPlayerID_2;
4824 LODWORD(pParty->pPlayers[v374].pConditions[14]) = 0;
4825 HIDWORD(pParty->pPlayers[v374].pConditions[14]) = 0;
4826 v376 = pCastSpell->uPlayerID_2;
4827 LODWORD(pParty->pPlayers[v376].pConditions[13]) = 0;
4828 HIDWORD(pParty->pPlayers[v376].pConditions[13]) = 0;
4829 }
4830 else
4831 {
4832 *(float *)&a2 = (double)(amount << 7) * 0.033333335;
4833 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(
4834 0xEu,
4835 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - *(float *)&a2));
4836 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(
4837 0xDu,
4838 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - *(float *)&a2));
4839 }
4840 v377 = &pParty->pPlayers[pCastSpell->uPlayerID_2];
4841 v377->SetCondition(1, 0);
4842 LODWORD(v727) = 1;
4843 break;
4844 }
4845 case SPELL_SPIRIT_SHARED_LIFE:
4846 {
4847 if ( v731 == 4 )
4848 amount = 4 * v2;
4849 else
4850 amount = 3 * v2;
4851 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4852 break;
4853 v381 = 0;
4854 signed int _v733 = amount;
4855 v730 = 0;
4856 v382 = 1;
4857 do
4858 {
4859 v383 = pPlayers[v382];
4860 if ( !v383->pConditions[14] && !v383->pConditions[15] && !v383->pConditions[16] )
4861 v682[v381++] = v382;
4862 ++v382;
4863 }
4864 while ( v382 <= 4 );
4865 v384 = 0;
4866 v730 = v381;
4867 if ( v381 > 0 )
4868 {
4869 do
4870 _v733 += pPlayers[v682[v384++]]->sHealth;
4871 while ( v384 < v381 );
4872 }
4873 v732 = (signed __int64)((double)_v733 / (double)v730);
4874 _v733 = 0;
4875 if ( v381 > 0 )
4876 {
4877 do
4878 {
4879 //v385 = (ItemGen **)&pPlayers[v682[HIDWORD(v733)]];
4880 v726 = pPlayers[v682[_v733]];
4881 v726->sHealth = v732;
4882 //v386 = v726->GetMaxHealth();
4883 if ( v726->sHealth > v726->GetMaxHealth())
4884 v726->sHealth = v726->GetMaxHealth();
4885 if ( v726->sHealth > 0 )
4886 {
4887 v726->pConditions[Player::Condition_Unconcious] = 0;
4888 }
4889 v388 = _v733;
4890
4891 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, LOWORD(v682[_v733]) - 1);
4892 _v733 = v388 + 1;
4893 }
4894 while ( v388 + 1 < v730 );
4895 }
4896 LODWORD(v727) = 1;
4897 break;
4898 }
4899 case SPELL_SPIRIT_RESSURECTION:
4900 {
4901 switch (v731)
4902 {
4903 case 1: amount = 180 * v2; break;
4904 case 2: amount = 10800 * v2; break;
4905 case 3: amount = 259200 * v2; break;
4906 case 4: amount = 0; break;
4907 default:
4908 assert(false);
4909 }
4910 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4911 break;
4912 v396 = pCastSpell->uPlayerID_2;
4913 if ( HIDWORD(pParty->pPlayers[v396].pConditions[16]) | LODWORD(pParty->pPlayers[v396].pConditions[16])
4914 || HIDWORD(pParty->pPlayers[v396].pConditions[14]) | LODWORD(pParty->pPlayers[v396].pConditions[14]) )
4915 {
4916 if ( !(HIDWORD(pParty->pPlayers[v396].pConditions[1]) | LODWORD(pParty->pPlayers[v396].pConditions[1])) )
4917 pParty->pPlayers[v396].PlaySound(SPEECH_25, 0);
4918 if ( v731 == 4 )
4919 {
4920 v397 = pCastSpell->uPlayerID_2;
4921 LODWORD(pParty->pPlayers[v397].pConditions[16]) = 0;
4922 HIDWORD(pParty->pPlayers[v397].pConditions[16]) = 0;
4923 v398 = pCastSpell->uPlayerID_2;
4924 LODWORD(pParty->pPlayers[v398].pConditions[14]) = 0;
4925 HIDWORD(pParty->pPlayers[v398].pConditions[14]) = 0;
4926 v399 = pCastSpell->uPlayerID_2;
4927 LODWORD(pParty->pPlayers[v399].pConditions[13]) = 0;
4928 HIDWORD(pParty->pPlayers[v399].pConditions[13]) = 0;
4929 }
4930 else
4931 {
4932 *(float *)&a2 = (double)(amount << 7) * 0.033333335;
4933 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan( 0x10u,
4934 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - *(float *)&a2));
4935 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan( 0xEu,
4936 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - *(float *)&a2));
4937 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan( 0xDu,
4938 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - *(float *)&a2));
4939 }
4940 pParty->pPlayers[pCastSpell->uPlayerID_2].SetCondition(1u, 1);
4941 pParty->pPlayers[pCastSpell->uPlayerID_2].sHealth = 1;
4942 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, pCastSpell->uPlayerID_2);
4943 }
4944 LODWORD(v727) = 1;
4945 break;
4946 }
4947 case SPELL_MIND_CURE_PARALYSIS:
4948 {
4949 switch (v731)
4950 {
4951 case 1: amount = 3600 * v2; break;
4952 case 2: amount = 3600 * v2; break;
4953 case 3: amount = 86400 * v2; break;
4954 case 4: amount = 0; break;
4955 default:
4956 assert(false);
4957 }
4958 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4959 break;
4960
4961 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, pCastSpell->uPlayerID_2);
4962 v323 = pCastSpell->uPlayerID_2;
4963 v324 = (char *)&pParty->pPlayers[v323].pConditions[12];
4964 if ( !pParty->pPlayers[v323].pConditions[12] )
4965 {
4966 LODWORD(v727) = 1;
4967 break;
4968 }
4969 if ( v731 == 4 )
4970 {
4971 *(int *)v324 = 0;
4972 *((int *)v324 + 1) = 0;
4973 LODWORD(v727) = 1;
4974 break;
4975 }
4976 v663 = (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335);
4977 v656 = 12;
4978 v325 = &pParty->pPlayers[v323];
4979 v325->DiscardConditionIfLastsLongerThan(v656, v663);
4980 LODWORD(v727) = 1;
4981 break;
4982 }
4983 case SPELL_MIND_REMOVE_FEAR:
4984 {
4985 switch (v731)
4986 {
4987 case 1: amount = 180 * v2; break;
4988 case 2: amount = 3600 * v2; break;
4989 case 3: amount = 86400 * v2; break;
4990 case 4: amount = 0; break;
4991 default:
4992 assert(false);
4993 }
4994
4995 if ( !pPlayer->CanCastSpell(uRequiredMana) )
4996 break;
4997
4998 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, pCastSpell->uPlayerID_2);
4999 v323 = pCastSpell->uPlayerID_2;
5000 v324 = (char *)&pParty->pPlayers[v323].pConditions[3];
5001 if ( !pParty->pPlayers[v323].pConditions[3] )
5002 {
5003 LODWORD(v727) = 1;
5004 break;
5005 }
5006 if ( v731 == 4 )
5007 {
5008 *(int *)v324 = 0;
5009 *((int *)v324 + 1) = 0;
5010 LODWORD(v727) = 1;
5011 break;
5012 }
5013 v663 = (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335);
5014 v656 = 3;
5015 v325 = &pParty->pPlayers[v323];
5016 v325->DiscardConditionIfLastsLongerThan(v656, v663);
5017 LODWORD(v727) = 1;
5018 break;
5019 }
5020 case SPELL_MIND_TELEPATHY:
5021 {
5022 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5023 break;
5024 if (PID_TYPE(a2) != OBJECT_Actor)
5025 {
5026 LODWORD(v727) = 1;
5027 break;
5028 }
5029 v417 = &pActors[PID_ID(a2)];
5030 Actor * _v730 = v417;
5031 if ( !(BYTE2(v417->uAttributes) & 0x80) )
5032 {
5033 v417->SetRandomGoldIfTheresNoItem();
5034 v417 = _v730;
5035 }
5036 v418 = v417->array_000234[3].uItemID;
5037 signed int _v733 = 0;
5038 if ( pItemsTable->pItems[v418].uEquipType == 18 )
5039 _v733 = v417->array_000234[3].uSpecEnchantmentType;
5040
5041 //ItemGen::ItemGen(&v683);
5042 v683.Reset();
5043
5044 v419 = _v730->uCarriedItemID;
5045 if (v419)
5046 {
5047 v683.uItemID = v419;
5048 //goto LABEL_799;
5049 }
5050 else
5051 {
5052 v420 = 0;
5053 v421 = _v730->array_000234;
5054 while ( !v421->uItemID || pItemsTable->pItems[v421->uItemID].uEquipType == 18 )
5055 {
5056 ++v420;
5057 ++v421;
5058 if ( v420 >= 4 )
5059 break;
5060 }
5061 if ( v420 < 4 )
5062 {
5063 memcpy(&v683, &_v730->array_000234[v420], sizeof(v683));
5064 v2 = v723;
5065 //v1 = 0;
5066 }
5067 }
5068 // LABEL_799:
5069 if ( _v733 != 0 )
5070 {
5071 v675 = _v733;
5072 if (v683.uItemID)
5073 {
5074 v422 = v683.GetDisplayName();
5075 sprintf(pTmpBuf2.data(), "(%s), and %d gold", v422, v675);
5076
5077 }
5078 else
5079 {
5080 v664 = "%d gold";
5081 sprintf(pTmpBuf2.data(), v664, v675);
5082 }
5083 }
5084 else
5085 {
5086 if (v683.uItemID)
5087 {
5088 const char *_v675 = v683.GetDisplayName();
5089 v664 = "(%s)";
5090 sprintf(pTmpBuf2.data(), v664, _v675);
5091 }
5092 else
5093 {
5094 strcpy(pTmpBuf2.data(), "nothing");
5095 ShowStatusBarString(pTmpBuf2.data(), 2u);
5096 }
5097 }
5098 ShowStatusBarString(pTmpBuf2.data(), 2u);
5099 pSpellSprite.stru_24.Reset();
5100 pSpellSprite.spell_id = pCastSpell->spellnum;
5101 pSpellSprite.spell_level = v2;
5102 pSpellSprite.spell_skill = v731;
5103 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
5104 pSpellSprite.vPosition.x = _v730->vPosition.x;
5105 pSpellSprite.vPosition.y = _v730->vPosition.y;
5106 v676 = _v730->uActorHeight;
5107 v665 = pSpellSprite.vPosition.y;
5108 pSpellSprite.vPosition.z = _v730->uActorHeight;
5109 v657 = pSpellSprite.vPosition.x;
5110 pSpellSprite.uAttributes = 0;
5111 pSpellSprite.uSectorID = pIndoor->GetSector(v657, v665, v676);
5112 pSpellSprite.uSpriteFrameID = 0;
5113 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
5114 pSpellSprite.spell_target_pid = a2;
5115 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
5116 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
5117 LOBYTE(pSpellSprite.uAttributes) |= 0x80u;
5118 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
5119 pSpellSprite.Create(0, 0, 0, pCastSpell->uPlayerID + 1);
5120 LODWORD(v727) = 1;
5121 break;
5122 }
5123 case SPELL_MIND_BERSERK:
5124 {
5125 switch (v731)
5126 {
5127 case 1: amount = 300 * v2; break;
5128 case 2: amount = 300 * v2; break;
5129 case 3: amount = 600 * v2; break;
5130 case 4: amount = 3600; break;
5131 default:
5132 assert(false);
5133 }
5134 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5135 break;
5136 v426 = PID_ID(a2);
5137 if (PID_TYPE(a2) != OBJECT_Actor)
5138 {
5139 LODWORD(v727) = 1;
5140 break;
5141 }
5142 v730 = 836 * v426;
5143 if ( stru_50C198.GetMagicalResistance(&pActors[v426], 7u) )
5144 {
5145 pActors[v426].pActorBuffs[1].Reset();
5146 pActors[v426].pActorBuffs[12].Reset();
5147 pActors[v426].pActorBuffs[9].Apply(
5148 pParty->uTimePlayed + (signed __int64)((double)(amount << 7) * 0.033333335),
5149 v731, 0, 0, 0);
5150 pActors[v426].pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long;
5151 }
5152 pSpellSprite.stru_24.Reset();
5153 pSpellSprite.spell_id = pCastSpell->spellnum;
5154 pSpellSprite.spell_level = v2;
5155 pSpellSprite.spell_skill = v731;
5156 v60 = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
5157 v61 = v426;
5158 v600 = pActors[v61].vPosition.y;
5159 v601 = pActors[v61].vPosition.x;
5160 pSpellSprite.uObjectDescID = v60;
5161 pSpellSprite.vPosition.x = v601;
5162 v602 = pActors[v61].uActorHeight;
5163 v603 = pActors[v61].vPosition.z;
5164 pSpellSprite.vPosition.y = v600;
5165 v676 = v603 + v602;
5166 v665 = v600;
5167 pSpellSprite.vPosition.z = v603 + v602;
5168 v657 = v601;
5169 pSpellSprite.uAttributes = 0;
5170 pSpellSprite.uSectorID = pIndoor->GetSector(v657, v665, v676);
5171 pSpellSprite.uSpriteFrameID = 0;
5172 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
5173 pSpellSprite.spell_target_pid = a2;
5174 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
5175 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
5176 LOBYTE(pSpellSprite.uAttributes) |= 0x80u;
5177 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
5178 pSpellSprite.Create(0, 0, 0, pCastSpell->uPlayerID + 1);
5179 LODWORD(v727) = 1;
5180 break;
5181 }
5182 case SPELL_MIND_ENSLAVE:
5183 {
5184 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5185 break;
5186 amount = 600 * v2;
5187 if (PID_TYPE(a2) != OBJECT_Actor)
5188 {
5189 LODWORD(v727) = 1;
5190 break;
5191 }
5192 v730 = 836 * PID_ID(a2);
5193 if ( MonsterStats::BelongsToSupertype(pActors[PID_ID(a2)].pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD) )
5194 break;
5195 if ( stru_50C198.GetMagicalResistance(&pActors[PID_ID(a2)], 7u) )
5196 {
5197 pActors[PID_ID(a2)].pActorBuffs[9].Reset();
5198 pActors[PID_ID(a2)].pActorBuffs[1].Reset();
5199 pActors[PID_ID(a2)].pActorBuffs[12].Apply(pParty->uTimePlayed + (signed __int64)((double)(amount << 7) * 0.033333335),
5200 v731, 0, 0, 0);
5201 }
5202 pSpellSprite.stru_24.Reset();
5203 pSpellSprite.spell_id = pCastSpell->spellnum;
5204 pSpellSprite.spell_level = v2;
5205 pSpellSprite.spell_skill = v731;
5206 v60 = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
5207 v61 = PID_ID(a2);
5208 v600 = pActors[v61].vPosition.y;
5209 v601 = pActors[v61].vPosition.x;
5210 pSpellSprite.uObjectDescID = v60;
5211 pSpellSprite.vPosition.x = v601;
5212 v602 = pActors[v61].uActorHeight;
5213 v603 = pActors[v61].vPosition.z;
5214 pSpellSprite.vPosition.y = v600;
5215 v676 = v603 + v602;
5216 v665 = v600;
5217 pSpellSprite.vPosition.z = v603 + v602;
5218 v657 = v601;
5219 pSpellSprite.uAttributes = 0;
5220 pSpellSprite.uSectorID = pIndoor->GetSector(v657, v665, v676);
5221 pSpellSprite.uSpriteFrameID = 0;
5222 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
5223 pSpellSprite.spell_target_pid = a2;
5224 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
5225 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
5226 LOBYTE(pSpellSprite.uAttributes) |= 0x80u;
5227 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
5228 pSpellSprite.Create(0, 0, 0, pCastSpell->uPlayerID + 1);
5229 LODWORD(v727) = 1;
5230 break;
5231 }
5232 case SPELL_MIND_MASS_FEAR:
5233 {
5234 if ( v731 == 4 )
5235 amount = 300 * v2;
5236 else
5237 amount = 180 * v2;
5238 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5239 break;
5240 auto _v726 = sub_46A6AC((int)dword_50BF30.data(), 100, 4096);
5241 pGame->GetStru6()->FadeScreen__like_Turn_Undead_and_mb_Armageddon(0xA0A0Au, 0xC0u);
5242 ++pSpellSprite.uType;
5243 pSpellSprite.stru_24.Reset();
5244 pSpellSprite.spell_id = pCastSpell->spellnum;
5245 pSpellSprite.spell_level = v2;
5246 pSpellSprite.spell_skill = v731;
5247 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
5248 pSpellSprite.uAttributes = 0;
5249 pSpellSprite.uSectorID = 0;
5250 pSpellSprite.uSpriteFrameID = 0;
5251 pSpellSprite.field_60_distance_related_prolly_lod = 0;
5252 pSpellSprite.uFacing = 0;
5253 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
5254 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
5255 for ( a2 = 0; a2 < (signed int)_v726; ++a2 )
5256 {
5257 v433 = &pActors[dword_50BF30[a2]];
5258 if ( MonsterStats::BelongsToSupertype(v433->pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD) )
5259 break;
5260 pSpellSprite.vPosition.x = v433->vPosition.x;
5261 pSpellSprite.vPosition.y = v433->vPosition.y;
5262 pSpellSprite.vPosition.z = v433->vPosition.z - (unsigned int)(signed __int64)((double)v433->uActorHeight * unk_4D8548);
5263
5264 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, dword_50BF30[a2]);
5265 pSpellSprite.Create(0, 0, 0, 0);
5266 if ( stru_50C198.GetMagicalResistance(v433, 7u) )
5267 {
5268 v433->pActorBuffs[4].Apply(pParty->uTimePlayed + (signed __int64)((double)(amount << 7) * 0.033333335),
5269 v731, 0, 0, 0);
5270 }
5271 }
5272 LODWORD(v727) = 1;
5273 break;
5274 }
5275 case SPELL_MIND_CURE_INSANITY:
5276 {
5277 v435 = v731 - 2;
5278 if ( v731 == 4 )
5279 amount = 0;
5280 else
5281 amount = 86400 * v2;
5282 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5283 break;
5284
5285 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, pCastSpell->uPlayerID_2);
5286 v440 = pCastSpell->uPlayerID_2;
5287 if ( HIDWORD(pParty->pPlayers[v440].pConditions[5]) | LODWORD(pParty->pPlayers[v440].pConditions[5]) )
5288 {
5289 if ( !(HIDWORD(pParty->pPlayers[v440].pConditions[1]) | LODWORD(pParty->pPlayers[v440].pConditions[1])) )
5290 pParty->pPlayers[v440].PlaySound(SPEECH_25, 0);
5291 if ( v731 == 4 )
5292 {
5293 v441 = pCastSpell->uPlayerID_2;
5294 LODWORD(pParty->pPlayers[v441].pConditions[5]) = 0;
5295 HIDWORD(pParty->pPlayers[v441].pConditions[5]) = 0;
5296 }
5297 else
5298 {
5299 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(5u,
5300 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335));
5301 }
5302 v377 = &pParty->pPlayers[pCastSpell->uPlayerID_2];
5303 v377->SetCondition(1, 0);
5304 }
5305 LODWORD(v727) = 1;
5306 break;
5307 }
5308 case SPELL_EARTH_TELEKINESIS:
5309 {
5310 switch (v731)
5311 {
5312 case 1: amount = 2 * v2; break;
5313 case 2: amount = 2 * v2; break;
5314 case 3: amount = 3 * v2; break;
5315 case 4: amount = 4 * v2; break;
5316 default:
5317 assert(false);
5318 }
5319 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5320 break;
5321 v445 = PID_ID(a2);
5322 if (PID_TYPE(a2) == OBJECT_Item)
5323 {
5324 v449 = (char *)&pSpriteObjects[v445].stru_24;
5325 v450 = *(int *)v449;
5326 if ( pItemsTable->pItems[v450].uEquipType == 18 )
5327 {
5328 party_finds_gold(*((int *)v449 + 3), 0);
5329 viewparams->bRedrawGameUI = 1;
5330 }
5331 else
5332 {
5333 sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[471], pItemsTable->pItems[v450].pUnidentifiedName);
5334 ShowStatusBarString(pTmpBuf2.data(), 2u);
5335 if ( !pParty->AddItem(&pSpriteObjects[v445].stru_24) )
5336 pParty->SetHoldingItem(&pSpriteObjects[v445].stru_24);
5337 }
5338 SpriteObject::OnInteraction(v445);
5339 }
5340 else
5341 {
5342 if (PID_TYPE(a2) == OBJECT_Actor)
5343 {
5344 stru_50C198.LootActor(&pActors[v445]);
5345 }
5346 else
5347 {
5348 if (PID_TYPE(a2) != OBJECT_Decoration)
5349 {
5350 if (PID_TYPE(a2) != OBJECT_BModel)
5351 {
5352 LODWORD(v727) = 1;
5353 break;
5354 }
5355 dword_507CD8 = 1;
5356 v677 = 1;
5357 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor)
5358 v446 = pIndoor->pFaceExtras[pIndoor->pFaces[v445].uFaceExtraID].uEventID;
5359 else
5360 v446 = pOutdoor->pBModels[a2 >> 9].pFaces[v445 & 0x3F].sCogTriggeredID;
5361 EventProcessor(v446, a2, v677);
5362 LODWORD(v727) = 1;
5363 break;
5364 }
5365 v447 = &pLevelDecorations[v445];
5366 dword_507CD8 = 1;
5367 v448 = v447->field_16_event_id;
5368 if (v448)
5369 {
5370 v677 = 1;
5371 v446 = v448;
5372 EventProcessor(v446, a2, v677);
5373 LODWORD(v727) = 1;
5374 break;
5375 }
5376 if ( v447->IsInteractive() )
5377 {
5378 activeLevelDecoration = v447;
5379 EventProcessor(stru_5E4C90._decor_events[v447->_idx_in_stru123 - 75] + 380, 0, 1);
5380 activeLevelDecoration = NULL;
5381 }
5382 }
5383 }
5384 LODWORD(v727) = 1;
5385 break;
5386 }
5387 case SPELL_BODY_CURE_WEAKNESS:
5388 {
5389 switch (v731)
5390 {
5391 case 1: amount = 180 * v2; break;
5392 case 2: amount = 3600 * v2; break;
5393 case 3: amount = 86400 * v2; break;
5394 case 4: amount = 0; break;
5395 default:
5396 assert(false);
5397 }
5398 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5399 break;
5400
5401 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, pCastSpell->uPlayerID_2);
5402 v323 = pCastSpell->uPlayerID_2;
5403 v324 = (char *)&pParty->pPlayers[v323].pConditions[1];
5404 if ( !pParty->pPlayers[v323].pConditions[1] )
5405 {
5406 LODWORD(v727) = 1;
5407 break;
5408 }
5409 if ( v731 == 4 )
5410 {
5411 *(int *)v324 = 0;
5412 *((int *)v324 + 1) = 0;
5413 LODWORD(v727) = 1;
5414 break;
5415 }
5416 v663 = (signed __int64)((double)(signed __int64)pParty->uTimePlayed - (double)(amount << 7) * 0.033333335);
5417 v656 = 1;
5418 v325 = &pParty->pPlayers[v323];
5419 v325->DiscardConditionIfLastsLongerThan(v656, v663);
5420 LODWORD(v727) = 1;
5421 break;
5422 }
5423 case SPELL_BODY_FIRST_AID:
5424 {
5425 switch (v731)
5426 {
5427 case 1: amount = 2 * v2 + 5; break;
5428 case 2: amount = 3 * v2 + 5; break;
5429 case 3: amount = 4 * v2 + 5; break;
5430 case 4: amount = 5 * v2 + 5; break;
5431 default:
5432 assert(false);
5433 }
5434 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5435 break;
5436 v460 = pCastSpell->spell_target_pid;
5437 if (!v460)
5438 {
5439 pParty->pPlayers[pCastSpell->uPlayerID_2].Heal(amount);
5440 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, pCastSpell->uPlayerID_2);
5441 }
5442 else
5443 {
5444 if (PID_TYPE(v460) == OBJECT_Actor)
5445 {
5446 v461 = &pActors[PID_ID(v460)];
5447 v462 = v461->uAIState;
5448 v463 = v461->pMonsterInfo.uHP;
5449 if ( v462 != 5 )
5450 {
5451 if ( v462 != 4 )
5452 {
5453 if ( v462 != 19 )
5454 {
5455 if ( v462 != 11 )
5456 {
5457 v461->sCurrentHP += amount;
5458 if ( v461->sCurrentHP > v463 )
5459 v461->sCurrentHP = v463;
5460 }
5461 }
5462 }
5463 }
5464 }
5465 }
5466 LODWORD(v727) = 1;
5467 break;
5468 }
5469 case SPELL_BODY_CURE_POISON:
5470 {
5471 switch (v731)
5472 {
5473 case 1: amount = 3600 * v2; break;
5474 case 2: amount = 3600 * v2; break;
5475 case 3: amount = 86400 * v2; break;
5476 case 4: amount = 0; break;
5477 default:
5478 assert(false);
5479 }
5480 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5481 break;
5482
5483 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, pCastSpell->uPlayerID_2);
5484 v470 = pCastSpell->uPlayerID_2;
5485 if ( !(HIDWORD(pParty->pPlayers[v470].pConditions[6]) | LODWORD(pParty->pPlayers[v470].pConditions[6]))
5486 && !(HIDWORD(pParty->pPlayers[v470].pConditions[8]) | LODWORD(pParty->pPlayers[v470].pConditions[8]))
5487 && !(HIDWORD(pParty->pPlayers[v470].pConditions[10]) | LODWORD(pParty->pPlayers[v470].pConditions[10])) )
5488 {
5489 LODWORD(v727) = 1;
5490 break;
5491 }
5492 if ( v731 == 4 )
5493 {
5494 LODWORD(pParty->pPlayers[v470].pConditions[6]) = 0;
5495 HIDWORD(pParty->pPlayers[v470].pConditions[6]) = 0;
5496 v471 = pCastSpell->uPlayerID_2;
5497 LODWORD(pParty->pPlayers[v471].pConditions[8]) = 0;
5498 HIDWORD(pParty->pPlayers[v471].pConditions[8]) = 0;
5499 v472 = pCastSpell->uPlayerID_2;
5500 LODWORD(pParty->pPlayers[v472].pConditions[10]) = 0;
5501 HIDWORD(pParty->pPlayers[v472].pConditions[10]) = 0;
5502 LODWORD(v727) = 1;
5503 break;
5504 }
5505 *(float *)&a2 = (double)(amount << 7) * 0.033333335;
5506 pParty->pPlayers[v470].DiscardConditionIfLastsLongerThan(
5507 6u,
5508 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - *(float *)&a2));
5509 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(
5510 8u,
5511 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - *(float *)&a2));
5512 v663 = (signed __int64)((double)(signed __int64)pParty->uTimePlayed - *(float *)&a2);
5513 v656 = 10;
5514 v325 = &pParty->pPlayers[pCastSpell->uPlayerID_2];
5515 v325->DiscardConditionIfLastsLongerThan(v656, v663);
5516 LODWORD(v727) = 1;
5517 break;
5518 }
5519 case SPELL_BODY_PROTECTION_FROM_MAGIC:
5520 {
5521 amount = v2;
5522 LODWORD(v733) = 3600 * v2;
5523 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5524 break;
5525
5526 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 0);
5527 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 1);
5528 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 2);
5529 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 3);
5530
5531 pParty->pPartyBuffs[PARTY_BUFF_PROTECTION_FROM_MAGIC].Apply(pParty->uTimePlayed + (signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335), v731, v2, 0, 0);
5532 LODWORD(v727) = 1;
5533 break;
5534 }
5535 case SPELL_BODY_HAMMERHANDS:
5536 {
5537 LODWORD(v733) = 3600 * v2;
5538 amount = v2;
5539 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5540 break;
5541 if ( v731 == 4 )
5542 {
5543 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 0);
5544 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 1);
5545 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 2);
5546 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 3);
5547 v732 = (int)v733 << 7;
5548 v717 = (signed int)(signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335);
5549 pParty->pPlayers[0].pPlayerBuffs[PLAYER_BUFF_HAMMERHANDS].Apply(pParty->uTimePlayed + v717, 4u, v2, v2, 0);
5550 pParty->pPlayers[1].pPlayerBuffs[PLAYER_BUFF_HAMMERHANDS].Apply(pParty->uTimePlayed + v717, 4u, v2, v2, 0);
5551 pParty->pPlayers[2].pPlayerBuffs[PLAYER_BUFF_HAMMERHANDS].Apply(pParty->uTimePlayed + v717, 4u, v2, v2, 0);
5552
5553 pParty->pPlayers[3].pPlayerBuffs[PLAYER_BUFF_HAMMERHANDS].Apply(pParty->uTimePlayed + v717, 4, v2, v2, 0);
5554 LODWORD(v727) = 1;
5555 break;
5556 }
5557 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, pCastSpell->uPlayerID_2);
5558
5559 pParty->pPlayers[pCastSpell->uPlayerID_2].pPlayerBuffs[PLAYER_BUFF_HAMMERHANDS].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335), v731, v2, v2, 0);
5560 LODWORD(v727) = 1;
5561 break;
5562 }
5563 case SPELL_BODY_CURE_DISEASE:
5564 {
5565 if ( v731 == 4 )
5566 amount = 0;
5567 else
5568 amount = 86400 * v2;
5569 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5570 break;
5571
5572 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, pCastSpell->uPlayerID_2);
5573 v498 = pCastSpell->uPlayerID_2;
5574 if ( !(HIDWORD(pParty->pPlayers[v498].pConditions[7]) | LODWORD(pParty->pPlayers[v498].pConditions[7]))
5575 && !(HIDWORD(pParty->pPlayers[v498].pConditions[9]) | LODWORD(pParty->pPlayers[v498].pConditions[9]))
5576 && !(HIDWORD(pParty->pPlayers[v498].pConditions[11]) | LODWORD(pParty->pPlayers[v498].pConditions[11])) )
5577 {
5578 LODWORD(v727) = 1;
5579 break;
5580 }
5581 if ( v731 == 4 )
5582 {
5583 LODWORD(pParty->pPlayers[v498].pConditions[7]) = 0;
5584 HIDWORD(pParty->pPlayers[v498].pConditions[7]) = 0;
5585 v499 = pCastSpell->uPlayerID_2;
5586 LODWORD(pParty->pPlayers[v499].pConditions[9]) = 0;
5587 HIDWORD(pParty->pPlayers[v499].pConditions[9]) = 0;
5588 v500 = pCastSpell->uPlayerID_2;
5589 LODWORD(pParty->pPlayers[v500].pConditions[11]) = 0;
5590 HIDWORD(pParty->pPlayers[v500].pConditions[11]) = 0;
5591 }
5592 else
5593 {
5594 *(float *)&a2 = (double)(amount << 7) * 0.033333335;
5595 pParty->pPlayers[v498].DiscardConditionIfLastsLongerThan(
5596 7u,
5597 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - *(float *)&a2));
5598 pParty->pPlayers[pCastSpell->uPlayerID_2].DiscardConditionIfLastsLongerThan(
5599 9u,
5600 (signed __int64)((double)(signed __int64)pParty->uTimePlayed - *(float *)&a2));
5601 v663 = (signed __int64)((double)(signed __int64)pParty->uTimePlayed - *(float *)&a2);
5602 v656 = 11;
5603 v325 = &pParty->pPlayers[pCastSpell->uPlayerID_2];
5604 v325->DiscardConditionIfLastsLongerThan(v656, v663);
5605 }
5606 LODWORD(v727) = 1;
5607 break;
5608 }
5609 case SPELL_BODY_POWER_CURE:
5610 {
5611 amount = 5 * v2 + 10;
5612 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5613 break;
5614 v501 = pParty->pPlayers;
5615 int v1 = 0;
5616 do
5617 {
5618 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, v1);
5619 v501->Heal(amount);
5620 ++v501;
5621 ++v1;
5622 }
5623 while ( (signed int)v501 < (signed int)pParty->pHirelings );
5624 LODWORD(v727) = 1;
5625 break;
5626 }
5627 case SPELL_LIGHT_DISPEL_MAGIC:
5628 {
5629 sRecoveryTime -= v2;
5630 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5631 break;
5632
5633 pGame->GetStru6()->FadeScreen__like_Turn_Undead_and_mb_Armageddon(0xAFF0Au, 0xC0u);
5634 v505 = sub_46A6AC((int)dword_50BF30.data(), 100, 4096);
5635 ++pSpellSprite.uType;
5636 //signed int _v733 = v505;
5637 v688.x = 0;
5638 v688.y = 0;
5639 v688.z = 0;
5640 pSpellSprite.stru_24.Reset();
5641 pSpellSprite.spell_id = pCastSpell->spellnum;
5642 pSpellSprite.spell_level = v2;
5643 pSpellSprite.spell_skill = v731;
5644 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
5645 pSpellSprite.uAttributes = 0;
5646 pSpellSprite.uSectorID = 0;
5647 pSpellSprite.uSpriteFrameID = 0;
5648 pSpellSprite.field_60_distance_related_prolly_lod = 0;
5649 pSpellSprite.uFacing = 0;
5650 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
5651 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
5652 a2 = 0;
5653 for ( a2 = 0; a2 < v505; ++a2 )
5654 {
5655 v507 = dword_50BF30[a2];
5656 pSpellSprite.vPosition.x = pActors[v507].vPosition.x;
5657 pSpellSprite.vPosition.y = pActors[v507].vPosition.y;
5658 pSpellSprite.vPosition.z = pActors[v507].vPosition.z - (unsigned int)(signed __int64)((double)pActors[v507].uActorHeight * unk_4D8548);
5659 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, dword_50BF30[a2]);
5660 v509 = pSpellSprite.Create(0, 0, 0, 0);
5661 DamageMonsterFromParty(PID(OBJECT_Item, v509), dword_50BF30[a2], &v688);
5662 }
5663 for ( a2 = 0; a2 < v505; ++a2 )
5664 {
5665 pActor = &pActors[dword_50BF30[a2]];
5666 pSpellSprite.vPosition.x = pActor->vPosition.x;
5667 pSpellSprite.vPosition.y = pActor->vPosition.y;
5668 pSpellSprite.vPosition.z = pActor->vPosition.z - (unsigned int)(signed __int64)((double)pActor->uActorHeight * unk_4D8548);
5669 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, dword_50BF30[a2]);
5670 pSpellSprite.Create(0, 0, 0, 0);
5671 for (int i = 0; i < 22; ++i)
5672 {
5673 pActor->pActorBuffs[i].Reset();
5674 }
5675 }
5676 LODWORD(v727) = 1;
5677 break;
5678 }
5679 case SPELL_LIGHT_SUMMON_ELEMENTAL:
5680 {
5681 switch (v731)
5682 {
5683 case 1: v733 = 300 * v2; amount = 1; break;
5684 case 2: v733 = 300 * v2; amount = 1; break;
5685 case 3: v733 = 900 * v2; amount = 3; break;
5686 case 4: v733 = 900 * v2; amount = 5; break;
5687 default:
5688 assert(false);
5689 }
5690 //v733 = __PAIR__(0, v516);
5691 signed int _v733 = 0;
5692 if ( (signed int)uNumActors > 0 )
5693 {
5694 v518 = pActors.data();//[0].uAIState;
5695 auto _v726 = uNumActors;
5696 do
5697 {
5698 v519 = v518->uAIState;
5699 if ( v518->uAIState != 5 && v519 != 11 && v519 != 19 && PID(OBJECT_Player, pCastSpell->uPlayerID) == v518->uSummonerID )
5700 ++_v733;
5701 ++v518;
5702 --_v726;
5703 }
5704 while ( _v726 != 0 );
5705 }
5706 if ( _v733 >= amount )
5707 {
5708 ShowStatusBarString(pGlobalTXT_LocalizationStrings[648], 2); // This character can't summon any more monsters!
5709 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
5710 pCastSpell->spellnum = 0;
5711 continue;
5712 }
5713 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5714 break;
5715 sub_44FA4C_spawn_light_elemental(pCastSpell->uPlayerID, v731, v733);
5716 LODWORD(v727) = 1;
5717 break;
5718 }
5719 case SPELL_LIGHT_DAY_OF_THE_GODS:
5720 {
5721 switch (v731)
5722 {
5723 case 1: LODWORD(v733) = 10800 * v2; amount = 3 * v2 + 10; break;
5724 case 2: LODWORD(v733) = 10800 * v2; amount = 3 * v2 + 10; break;
5725 case 3: LODWORD(v733) = 14400 * v2; amount = 4 * v2 + 10; break;
5726 case 4: LODWORD(v733) = 18000 * v2; amount = 5 * v2 + 10; break;
5727 default:
5728 assert(false);
5729 }
5730 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5731 break;
5732
5733 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 0);
5734 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 1);
5735 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 2);
5736 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 3);
5737
5738 pParty->pPartyBuffs[PARTY_BUFF_DAY_OF_GODS].Apply(pParty->uTimePlayed + (signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335), v731, amount, 0, 0);
5739 LODWORD(v727) = 1;
5740 break;
5741 }
5742 case SPELL_LIGHT_PRISMATIC_LIGHT:
5743 {
5744 //v67 = 2;
5745 if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor)
5746 {
5747 ShowStatusBarString(pGlobalTXT_LocalizationStrings[497], 2); // Can't cast Prismatic Light outdoors!
5748 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
5749 pCastSpell->spellnum = 0;
5750 continue;
5751 }
5752 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5753 break;
5754 v531 = sub_46A6AC((int)dword_50BF30.data(), 100, 4096);
5755 ++pSpellSprite.uType;
5756 v694.x = 0;
5757 v694.y = 0;
5758 v694.z = 0;
5759 pSpellSprite.stru_24.Reset();
5760 pSpellSprite.spell_id = pCastSpell->spellnum;
5761 pSpellSprite.spell_level = v2;
5762 pSpellSprite.spell_skill = v731;
5763 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
5764 pSpellSprite.uAttributes = 0;
5765 pSpellSprite.uSectorID = 0;
5766 pSpellSprite.uSpriteFrameID = 0;
5767 pSpellSprite.field_60_distance_related_prolly_lod = 0;
5768 pSpellSprite.uFacing = 0;
5769 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
5770 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
5771 a2 = 0;
5772 if ( (signed int)v531 > 0 )
5773 {
5774 do
5775 {
5776 v533 = dword_50BF30[a2];
5777 pSpellSprite.vPosition.x = pActors[v533].vPosition.x;
5778 pSpellSprite.vPosition.y = pActors[v533].vPosition.y;
5779 pSpellSprite.vPosition.z = pActors[v533].vPosition.z - (unsigned int)(signed __int64)((double)pActors[v533].uActorHeight * unk_4D8548);
5780 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, dword_50BF30[a2]);
5781 v535 = pSpellSprite.Create(0, 0, 0, 0);
5782 v536 = a2;
5783 DamageMonsterFromParty(PID(OBJECT_Item, v535), dword_50BF30[a2], &v694);
5784 a2 = v536 + 1;
5785 }
5786 while ( v536 + 1 < (signed int)v531 );
5787 }
5788 v537 = pGame->GetStru6();
5789 pGame->GetStru6()->_4A8BFC();
5790 LODWORD(v727) = 1;
5791 break;
5792 }
5793 case SPELL_LIGHT_DAY_OF_PROTECTION:
5794 {
5795 switch (v731)
5796 {
5797 case 1: LODWORD(v733) = 14400 * v2; amount = 4 * v2; break;
5798 case 2: LODWORD(v733) = 14400 * v2; amount = 4 * v2; break;
5799 case 3: LODWORD(v733) = 14400 * v2; amount = 4 * v2; break;
5800 case 4: LODWORD(v733) = 18000 * v2; amount = 5 * v2; break;
5801 default:
5802 assert(false);
5803 }
5804 v730 = LODWORD(v733);
5805 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5806 break;
5807
5808 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 0);
5809 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 1);
5810 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 2);
5811 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 3);
5812
5813 v732 = v730 << 7;
5814 v549 = (double)(v730 << 7) * 0.033333335;
5815 *((float *)&v733 + 1) = v549;
5816 v712 = (signed __int64)v549;
5817 pParty->pPartyBuffs[PARTY_BUFF_RESIST_BODY].Apply(pParty->uTimePlayed + (signed __int64)v549, v731, amount, 0, 0);
5818 pParty->pPartyBuffs[PARTY_BUFF_RESIST_MIND].Apply(pParty->uTimePlayed + v712, v731, amount, 0, 0);
5819 pParty->pPartyBuffs[PARTY_BUFF_RESIST_FIRE].Apply(pParty->uTimePlayed + v712, v731, amount, 0, 0);
5820 pParty->pPartyBuffs[PARTY_BUFF_RESIST_WATER].Apply(pParty->uTimePlayed + v712, v731, amount, 0, 0);
5821 pParty->pPartyBuffs[PARTY_BUFF_RESIST_AIR].Apply(pParty->uTimePlayed + v712, v731, amount, 0, 0);
5822 pParty->pPartyBuffs[PARTY_BUFF_RESIST_EARTH].Apply(pParty->uTimePlayed + v712, v731, amount, 0, 0);
5823 v550 = v2 + 5;
5824 pParty->pPartyBuffs[PARTY_BUFF_FEATHER_FALL].Apply(
5825 (signed __int64)((double)(signed __int64)pParty->uTimePlayed + *((float *)&v733 + 1)),
5826 v731,
5827 v550, 0, 0);
5828
5829 pParty->pPartyBuffs[PARTY_BUFF_WIZARD_EYE].Apply((signed __int64)((double)(signed __int64)pParty->uTimePlayed + *((float *)&v733 + 1)), v731, v550, 0, 0);
5830 LODWORD(v727) = 1;
5831 break;
5832 }
5833 case SPELL_LIGHT_HOUR_OF_POWER:
5834 {
5835 switch (v731)
5836 {
5837 case 1: LODWORD(v733) = 4; amount = 4; break;
5838 case 2: LODWORD(v733) = 4; amount = 4; break;
5839 case 3: LODWORD(v733) = 12; amount = 12; break;
5840 case 4: LODWORD(v733) = 20; amount = 15; break;
5841 default:
5842 assert(false);
5843 }
5844 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5845 break;
5846 y = (char *)(60 * (v2 * LODWORD(v733) + 60));
5847 v732 = (300 * amount * v2 + 60) << 7;
5848 v730 = v2 + 5;
5849 int _v726 = 0;
5850 v553 = pParty->pPlayers;//[0].pConditions[1];
5851 *((float *)&v733) = (double)v732 * 0.033333335;
5852 do
5853 {
5854 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 0);
5855 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 1);
5856 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 2);
5857 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, 3);
5858
5859 //((SpellBuff *)(v553 + 6056))->Apply(
5860 v553->pPlayerBuffs[4].Apply((signed __int64)((double)(signed __int64)pParty->uTimePlayed + *((float *)&v733)), v731, v730, 0, 0);
5861 if ( *(_QWORD *)v553 )
5862 _v726 = 1;
5863 ++v553;
5864 }
5865 while ( v553 <= &pParty->pPlayers[3] );
5866 v562 = v731;
5867 pParty->pPartyBuffs[PARTY_BUFF_HEROISM].Apply((signed __int64)((double)(signed __int64)pParty->uTimePlayed + *((float *)&v733)), v731, v730, 0, 0);
5868 pParty->pPartyBuffs[PARTY_BUFF_SHIELD].Apply((signed __int64)((double)(signed __int64)pParty->uTimePlayed + *((float *)&v733)), v562, 0, 0, 0);
5869 pParty->pPartyBuffs[PARTY_BUFF_STONE_SKIN].Apply((signed __int64)((double)(signed __int64)pParty->uTimePlayed + *((float *)&v733)), v562, v730, 0, 0);
5870 if (!_v726)
5871 {
5872 pParty->pPartyBuffs[PARTY_BUFF_HASTE].Apply((signed __int64)((double)(signed int)((int)y << 7) * 0.033333335 + (double)(signed __int64)pParty->uTimePlayed), v562, v730, 0, 0);
5873 }
5874 LODWORD(v727) = 1;
5875 break;
5876 }
5877 case SPELL_LIGHT_DIVINE_INTERVENTION:
5878 {
5879 amount = 3;
5880 if ( pPlayer->uNumDivineInterventionCastsThisDay >= 3u )
5881 {
5882 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
5883 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
5884 pCastSpell->spellnum = 0;
5885 continue;
5886 }
5887 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5888 break;
5889 a2 = 0;
5890 _this = (ItemGen *)&pPlayers[1];
5891 do
5892 {
5893 v563 = 0;
5894 do
5895 {
5896 v564 = _this->uItemID;
5897 *(int *)(v563 + _this->uItemID) = 0;
5898 v563 += 8;
5899 *(int *)(v563 + v564 - 4) = 0;
5900 }
5901 while ( v563 <= 128 );
5902 v565 = ((Player *)_this->uItemID)->GetMaxHealth();
5903 v566 = (Player **)_this;
5904 *(int *)(_this->uItemID + 6460) = v565;
5905 v567 = (*v566)->GetMaxMana();
5906 *(int *)(_this->uItemID + 6464) = v567;
5907 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, a2);
5908 ++a2;
5909 _this = (ItemGen *)((char *)_this + 4);
5910 }
5911 while ( (signed int)this < (signed int)&qword_A750D8 );
5912 v571 = pPlayer;
5913 v572 = (char *)&pPlayer->sAgeModifier;
5914 if ( pPlayer->sAgeModifier + 10 >= 120 )
5915 *(short *)v572 = 120;
5916 else
5917 *(short *)v572 = pPlayer->sAgeModifier + 10;
5918 sRecoveryTime += -5 * v2;
5919 ++v571->uNumDivineInterventionCastsThisDay;
5920 LODWORD(v727) = 1;
5921 break;
5922 }
5923 case SPELL_DARK_REANIMATE:
5924 {
5925 switch (v731)
5926 {
5927 case 1: amount = 2 * v2; break;
5928 case 2: amount = 3 * v2; break;
5929 case 3: amount = 4 * v2; break;
5930 case 4: amount = 5 * v2; break;
5931 default:
5932 assert(false);
5933 }
5934 if ( !pPlayer->CanCastSpell(uRequiredMana) )
5935 break;
5936 v576 = pCastSpell->spell_target_pid;
5937 if (!v576)
5938 {
5939 v585 = (char *)&pParty->pPlayers[pCastSpell->uPlayerID_2];
5940 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, pCastSpell->uPlayerID_2);
5941 if ( *((_QWORD *)v585 + 14) )
5942 {
5943 ((Player *)v585)->SetCondition(0x11u, 1);
5944 v587 = ((Player *)v585)->GetSexByVoice();
5945 ReloadPlayerPortraits(pCastSpell->uPlayerID_2, (v587 != 0) + 23);
5946 *((_QWORD *)v585 + 17) = pParty->uTimePlayed;
5947 }
5948 break;
5949 }
5950 v577 = (Player *)(PID_ID(v576));
5951 //v726 = v577;
5952 if ( v577 == (Player *)-1 )
5953 {
5954 ShowStatusBarString(pGlobalTXT_LocalizationStrings[496], 2); // No valid target exists!
5955 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
5956 pCastSpell->spellnum = 0;
5957 continue;
5958 }
5959 v578 = (int)&pActors[(int)v577];
5960 v721 = v578;
5961 if ( *(short *)(v578 + 40) > 0 || (v579 = *(short *)(v578 + 176), v579 != 5) && v579 != 4 )
5962 {
5963 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
5964 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
5965 pCastSpell->spellnum = 0;
5966 continue;
5967 }
5968 ++pSpellSprite.uType;
5969 pSpellSprite.stru_24.Reset();
5970 pSpellSprite.spell_id = pCastSpell->spellnum;
5971 pSpellSprite.spell_level = v2;
5972 pSpellSprite.spell_skill = v731;
5973 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
5974 pSpellSprite.uAttributes = 0;
5975 pSpellSprite.uSectorID = 0;
5976 pSpellSprite.uSpriteFrameID = 0;
5977 pSpellSprite.field_60_distance_related_prolly_lod = 0;
5978 v581 = v721;
5979 pSpellSprite.uFacing = 0;
5980 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
5981 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
5982 pSpellSprite.vPosition.x = *(short *)(v721 + 142);
5983 pSpellSprite.vPosition.y = *(short *)(v721 + 144);
5984 v732 = *(short *)(v721 + 138);
5985 pSpellSprite.vPosition.z = *(short *)(v721 + 146) - (unsigned int)(signed __int64)((double)v732 * unk_4D8548);
5986 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, (int)v577);
5987 pSpellSprite.Create(0, 0, 0, 0);
5988 if ( *(char *)(v581 + 52) > amount )
5989 break;
5990 Actor::Resurrect((unsigned int)v577);
5991 *(char *)(v581 + 61) = 0;
5992 *(char *)(v581 + 53) = 0;
5993 *(char *)(v581 + 54) = 0;
5994 *(char *)(v581 + 55) = 0;
5995 *(char *)(v581 + 56) = 0;
5996 *(char *)(v581 + 57) = 0;
5997 *(int *)(v581 + 712) = 9999;
5998 *(char *)(v581 + 38) &= 0xF7u;
5999 *(int *)(v581 + 708) = 0;
6000 ((SpellBuff *)(v581 + 356))->Reset();
6001 ((SpellBuff *)(v581 + 228))->Reset();
6002 ((SpellBuff *)(v581 + 404))->Reset();
6003 if ( *(short *)(v581 + 40) > 10 * amount )
6004 *(short *)(v581 + 40) = 10 * amount;
6005 LODWORD(v727) = 1;
6006 break;
6007 }
6008 case SPELL_DARK_VAMPIRIC_WEAPON:
6009 {
6010 amount = 16;
6011 if ( v731 == 4 )
6012 {
6013 LODWORD(v733) = 0;
6014 }
6015 else
6016 {
6017 LODWORD(v733) = 3600 * v2;
6018 }
6019 if ( !pPlayer->CanCastSpell(uRequiredMana) )
6020 break;
6021 __debugbreak();
6022 //HIDWORD(v733) = (int)(char *)&pParty + 6972 * pCastSpell->uPlayerID_2 + 36 * a2 + 3040;
6023 ItemGen *_v733 = &pParty->pPlayers[pCastSpell->uPlayerID_2].pInventoryItems[a2];
6024 ItemDesc *_v732 = &pItemsTable->pItems[_v733->uItemID];
6025 _v733->UpdateTempBonus(pParty->uTimePlayed);
6026 if ( _v733->uItemID >= 64 && _v733->uItemID <= 65
6027 || LOBYTE(_v733->uAttributes) & 2
6028 || _v733->uSpecEnchantmentType != 0
6029 || _v733->uEnchantmentType != 0
6030 || (v591 = _v732->uEquipType) != 0 && v591 != 1 && v591 != 2
6031 || pItemsTable->IsMaterialNonCommon(_v733) )
6032 {
6033 dword_50C9D0 = 113;
6034 dword_50C9D4 = 0;
6035 dword_50C9D8 = 1;
6036
6037 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
6038 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
6039 pCastSpell->spellnum = 0;
6040 continue;
6041 }
6042 v592 = _v733;
6043 v14 = v731 == 4;
6044 _v733->uSpecEnchantmentType = 16;
6045 if ( !v14 )
6046 {
6047 v732 = (int)v733 << 7;
6048 v592->uExpireTime = pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335);
6049 v592->uAttributes |= 8u;
6050 }
6051 LOBYTE(v592->uAttributes) |= 0x80u;
6052 _50C9A8_item_enchantment_timer = 256;
6053 LODWORD(v727) = 1;
6054 break;
6055 }
6056 case SPELL_DARK_SHARPMETAL:
6057 {
6058 switch (v731)
6059 {
6060 case 1: amount = 5; break;
6061 case 2: amount = 5; break;
6062 case 3: amount = 7; break;
6063 case 4: amount = 9; break;
6064 default:
6065 assert(false);
6066 }
6067 if ( !pPlayer->CanCastSpell(uRequiredMana) )
6068 break;
6069 auto _v726 = ((signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360);
6070 pSpellSprite.stru_24.Reset();
6071 pSpellSprite.spell_id = pCastSpell->spellnum;
6072 pSpellSprite.spell_level = v2;
6073 pSpellSprite.spell_skill = v731;
6074 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
6075 pSpellSprite.vPosition.x = pParty->vPosition.x;
6076 pSpellSprite.vPosition.y = pParty->vPosition.y;
6077 pSpellSprite.uAttributes = 0;
6078 pSpellSprite.vPosition.z = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 2;
6079 pSpellSprite.uSectorID = pIndoor->GetSector(
6080 pParty->vPosition.x,
6081 pParty->vPosition.y,
6082 pParty->vPosition.z + (signed int)pParty->uPartyHeight / 2);
6083 pSpellSprite.uSpriteFrameID = 0;
6084 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
6085 pSpellSprite.spell_target_pid = a2;
6086 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
6087 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
6088 if ( pParty->bTurnBasedModeOn == 1 )
6089 LOBYTE(pSpellSprite.uAttributes) |= 4u;
6090 v596 = (signed int)_v726 / -2;
6091 y = (char *)((signed int)_v726 / 2);
6092 if ( (signed int)_v726 / -2 <= (signed int)_v726 / 2 )
6093 {
6094 v597 = v715.uYawAngle;
6095 do
6096 {
6097 pSpellSprite.uFacing = v596 + v597;
6098 if ( pSpellSprite.Create(
6099 v596 + v597,
6100 v715.uPitchAngle,
6101 pObjectList->pObjects[(signed __int16)pSpellSprite.uObjectDescID].uSpeed,
6102 pCastSpell->uPlayerID + 1) != -1
6103 && pParty->bTurnBasedModeOn == 1 )
6104 ++pTurnEngine->field_1C;
6105 v596 += _v726 / (amount - 1);
6106 }
6107 while ( v596 <= (signed int)y );
6108 }
6109 LODWORD(v727) = 1;
6110 break;
6111 }
6112 case SPELL_DARK_CONTROL_UNDEAD:
6113 {
6114 if ( !pPlayer->CanCastSpell(uRequiredMana) )
6115 break;
6116 switch (v731)
6117 {
6118 case 1: LODWORD(v733) = 180 * v2; break;
6119 case 2: LODWORD(v733) = 180 * v2; break;
6120 case 3: LODWORD(v733) = 300 * v2; break;
6121 case 4: LODWORD(v733) = 29030400; break;
6122 default:
6123 assert(false);
6124 }
6125 if (PID_TYPE(a2) != OBJECT_Actor)
6126 {
6127 LODWORD(v727) = 1;
6128 break;
6129 }
6130 pActor = &pActors[PID_ID(a2)];
6131 if ( !MonsterStats::BelongsToSupertype(pActor->pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD) )
6132 break;
6133 if ( !stru_50C198.GetMagicalResistance(pActor, 0xAu) )
6134 {
6135 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
6136 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
6137 pCastSpell->spellnum = 0;
6138 continue;
6139 }
6140 pActor->pActorBuffs[9].Reset();
6141 pActor->pActorBuffs[1].Reset();
6142 pActor->pActorBuffs[12].Apply(pParty->uTimePlayed + (signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335),
6143 v731, 0, 0, 0);
6144 pSpellSprite.stru_24.Reset();
6145 pSpellSprite.spell_id = pCastSpell->spellnum;
6146 pSpellSprite.spell_level = v2;
6147 pSpellSprite.spell_skill = v731;
6148 v60 = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
6149
6150 v600 = pActor->vPosition.y;
6151 v601 = pActor->vPosition.x;
6152 pSpellSprite.uObjectDescID = v60;
6153 pSpellSprite.vPosition.x = v601;
6154 v602 = pActor->uActorHeight;
6155 v603 = pActor->vPosition.z;
6156 pSpellSprite.vPosition.y = v600;
6157 v676 = v603 + v602;
6158 v665 = v600;
6159 pSpellSprite.vPosition.z = v603 + v602;
6160 v657 = v601;
6161 pSpellSprite.uAttributes = 0;
6162 pSpellSprite.uSectorID = pIndoor->GetSector(v657, v665, v676);
6163 pSpellSprite.uSpriteFrameID = 0;
6164 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
6165 pSpellSprite.spell_target_pid = a2;
6166 pSpellSprite.field_60_distance_related_prolly_lod = LOBYTE(v715.uDistance);
6167 pSpellSprite.uFacing = LOWORD(v715.uYawAngle);
6168 LOBYTE(pSpellSprite.uAttributes) |= 0x80u;
6169 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
6170 pSpellSprite.Create(0, 0, 0, pCastSpell->uPlayerID + 1);
6171 LODWORD(v727) = 1;
6172 break;
6173 }
6174 case SPELL_DARK_SACRIFICE:
6175 {
6176 if ( !pPlayer->CanCastSpell(uRequiredMana) )
6177 break;
6178 int _v733 = 0;
6179 memset(&achieved_awards, 0, 4000);
6180 int i = 0;
6181 pNPCData = pParty->pHirelings;
6182 do
6183 {
6184 if ( pNPCData->pName != 0)
6185 {
6186 v606 = _v733++;
6187 achieved_awards[v606] = (AwardType)(i + 1);
6188 }
6189 ++i;
6190 ++pNPCData;
6191 }
6192 while ( pNPCData <= &pParty->pHirelings[1] );
6193 i = 0;
6194 if ( (signed int)pNPCStats->uNumNewNPCs > 0)
6195 {
6196 pNPCData = pNPCStats->pNewNPCData;
6197 //__debugbreak(); // data offset
6198 AwardType *_v734 = &achieved_awards[_v733];
6199 do
6200 {
6201 if ( pNPCData->uFlags & 0x80
6202 && (!pParty->pHirelings[0].pName || strcmp(pNPCData->pName, pParty->pHirelings[0].pName))
6203 && (!pParty->pHirelings[1].pName || strcmp(pNPCData->pName, pParty->pHirelings[1].pName)) )
6204 {
6205 v607 = _v734;
6206 ++_v734;
6207 *v607 = (AwardType)(i + 3);
6208 }
6209 ++i;
6210 ++pNPCData;
6211 }
6212 while ( (signed int)i < (signed int)pNPCStats->uNumNewNPCs );
6213 }
6214 v608 = pCastSpell->uPlayerID_2;
6215 if ( v608 != 4 && v608 != 5
6216 || (v609 = (signed int)*(&pFontCChar + v608 + (unsigned __int8)pParty->field_709), v609 <= 0)
6217 || v609 >= 3 )
6218 {
6219 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
6220 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
6221 pCastSpell->spellnum = 0;
6222 continue;
6223 }
6224 v610 = 76 * v609;
6225 //*((int *)&pParty->pPlayers[3].pInstalledBeacons[4].uBeaconTime + 19 * v609) = 0;
6226 pParty->pHirelings[v609-1].evt_B = 0;
6227 v611 = pIconsFrameTable->FindIcon("spell96");
6228 //*(int *)((char *)&pParty->pPlayers[3].pInstalledBeacons[4].uBeaconTime + v610 + 4) = pIconsFrameTable->GetIconAnimLength(v611);
6229 pParty->pHirelings[v609-1].evt_C = pIconsFrameTable->GetIconAnimLength(v611);
6230 //*(int *)((char *)&pParty->pPlayers[3].pInstalledBeacons[3].field_18 + v610) = 1;
6231 pParty->pHirelings[v609-1].evt_A = 1;
6232
6233 v612 = pParty->pPlayers;
6234 do
6235 {
6236 v612->sHealth = v612->GetMaxHealth();
6237 v612->sMana = v612->GetMaxMana();
6238 ++v612;
6239 }
6240 while ( v612 <= &pParty->pPlayers[3] );
6241 v613 = &pOutdoor->ddm;
6242 if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor)
6243 v613 = &pIndoor->dlv;
6244 v613->uReputation += 15;
6245 if ( v613->uReputation > 10000 )
6246 v613->uReputation = 10000;
6247 LODWORD(v727) = 1;
6248 break;
6249 }
6250 case SPELL_DARK_PAIN_REFLECTION:
6251 {
6252 switch (v731)
6253 {
6254 case 1: LODWORD(v733) = 300 * (v2 + 12); break;
6255 case 2: LODWORD(v733) = 300 * (v2 + 12); break;
6256 case 3: LODWORD(v733) = 300 * (v2 + 12); break;
6257 case 4: LODWORD(v733) = 900 * (v2 + 4); break;
6258 default:
6259 assert(false);
6260 }
6261 amount = v2 + 5;
6262 if ( !pPlayer->CanCastSpell(uRequiredMana) )
6263 break;
6264 if ( v731 != 3 && v731 != 4 )
6265 {
6266 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, pCastSpell->uPlayerID_2);
6267 pParty->pPlayers[pCastSpell->uPlayerID_2].pPlayerBuffs[PLAYER_BUFF_PAIN_REFLECTION].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335), v731, amount, v716, 0);
6268 LODWORD(v727) = 1;
6269 break;
6270 }
6271 a2 = 0;
6272 v717 = (signed int)(signed __int64)((double)(signed int)((int)v733 << 7) * 0.033333335);
6273 v619 = pParty->pPlayers;//[0].pPlayerBuffs[10];
6274 do
6275 {
6276 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, a2);
6277 v619->pPlayerBuffs[PLAYER_BUFF_PAIN_REFLECTION].Apply(pParty->uTimePlayed + v717, v731, amount, v716, 0);
6278 ++a2;
6279 ++v619;
6280 }
6281 while ( v619 <= &pParty->pPlayers[3] );
6282 LODWORD(v727) = 1;
6283 break;
6284 }
6285 case SPELL_DARK_SOULDRINKER:
6286 {
6287 if ( !pPlayer->CanCastSpell(uRequiredMana) )
6288 break;
6289 pGame->GetIndoorCamera();
6290 v623 = (signed __int64)pGame->pIndoorCameraD3D->GetPickDepth();
6291 signed int _v733 = sub_46A6AC((int)dword_50BF30.data(), 100, v623);
6292 v707.x = 0;
6293 v707.y = 0;
6294 v707.z = 0;
6295 pSpellSprite.stru_24.Reset();
6296 pSpellSprite.spell_id = pCastSpell->spellnum;
6297 pSpellSprite.spell_level = v2;
6298 pSpellSprite.spell_skill = v731;
6299 pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
6300 pSpellSprite.uAttributes = 0;
6301 pSpellSprite.uSectorID = 0;
6302 pSpellSprite.uSpriteFrameID = 0;
6303 pSpellSprite.field_60_distance_related_prolly_lod = 0;
6304 pSpellSprite.uFacing = 0;
6305 pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
6306 pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
6307 a2 = 0;
6308 int _v726 = 0;
6309 if ( _v733 > 0 )
6310 {
6311 _v726 = (_v733 * (7 * v2 + 25));
6312 do
6313 {
6314 v625 = dword_50BF30[a2];
6315 pSpellSprite.vPosition.x = pActors[v625].vPosition.x;
6316 pSpellSprite.vPosition.y = pActors[v625].vPosition.y;
6317 //v732 = pActors[v625].uActorHeight;
6318 pSpellSprite.vPosition.z = pActors[v625].vPosition.z - (unsigned int)(signed __int64)((double)pActors[v625].uActorHeight * unk_4D8548);
6319 pSpellSprite.spell_target_pid = PID(OBJECT_Actor, dword_50BF30[a2]);
6320 v627 = pSpellSprite.Create(0, 0, 0, 0);
6321 v628 = a2;
6322 DamageMonsterFromParty(PID(OBJECT_Item, v627), dword_50BF30[a2], &v707);
6323 a2 = v628 + 1;
6324 }
6325 while ( v628 + 1 < _v733 );
6326 }
6327 v730 = 0;
6328 v629 = 1;
6329 do
6330 {
6331 v630 = pPlayers[v629];
6332 if ( !v630->pConditions[2]
6333 && !v630->pConditions[12]
6334 && !v630->pConditions[13]
6335 && !v630->pConditions[14]
6336 && !v630->pConditions[15]
6337 && !v630->pConditions[16] )
6338 {
6339 v631 = v730++;
6340 v681[v631] = v629;
6341 }
6342 ++v629;
6343 }
6344 while ( v629 <= 4 );
6345 v732 = (signed __int64)((double)(signed int)_v726 / (double)v730);
6346 _v733 = 0;
6347 if ( v730 > 0 )
6348 {
6349 do
6350 {
6351 //v632 = 4 * v681[HIDWORD(v733)] + 10965188;
6352 v726 = pPlayers[v681[_v733]];
6353 //v633 = pPlayers[v681[HIDWORD(v733)]];
6354 v726->sHealth += v732;
6355 //v726 = *(Player **)v632;
6356 //v634 = v726->GetMaxHealth();
6357 if ( v726->sHealth > v726->GetMaxHealth())
6358 v726->sHealth = v726->GetMaxHealth();
6359 v635 = _v733;
6360
6361 pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->spellnum, WORD2(v733));
6362 _v733 = v635 + 1;
6363 }
6364 while ( v635 + 1 < v730 );
6365 }
6366 pGame->GetStru6()->FadeScreen__like_Turn_Undead_and_mb_Armageddon(0, 0x40u);
6367 LODWORD(v727) = 1;
6368 break;
6369 }
6370 case SPELL_DARK_ARMAGEDDON:
6371 {
6372 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor)
6373 {
6374 ShowStatusBarString(pGlobalTXT_LocalizationStrings[499], 2); // Can't cast Armageddon indoors!
6375 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
6376 pCastSpell->spellnum = 0;
6377 continue;
6378 }
6379 if ( v731 == 4)
6380 amount = 4;
6381 else
6382 amount = 3;
6383 if ( pPlayer->uNumArmageddonCasts >= amount || pParty->armageddon_timer > 0 )
6384 {
6385 ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
6386 pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
6387 pCastSpell->spellnum = 0;
6388 continue;
6389 }
6390 if ( !pPlayer->CanCastSpell(uRequiredMana) )
6391 break;
6392 pParty->armageddon_timer = 256;
6393 pParty->field_16140 = v2;
6394 ++pPlayer->uNumArmageddonCasts;
6395 if ( pParty->bTurnBasedModeOn == 1 )
6396 ++pTurnEngine->field_1C;
6397 auto _v726 = 50;
6398 do
6399 {
6400 v642 = rand() % 4096 - 2048;
6401 v643 = rand();
6402 v721 = v642 + pParty->vPosition.x;
6403 y = (char *)(pParty->vPosition.y + v643 % 4096 - 2048);
6404 v732 = GetTerrainHeightsAroundParty2(v642 + pParty->vPosition.x, (int)y, &v710, 0);
6405 v644 = rand();
6406 sub_42F7EB_DropItemAt(0xFE6u, v721, (int)y, v732 + 16, v644 % 500 + 500, 1, 0, 0, 0);
6407 --_v726;
6408 }
6409 while ( _v726 != 0 );
6410 LODWORD(v727) = 1;
6411 break;
6412 }
6413
6414 default:
6415 break;
6416 }
6417 if ( pCastSpell->field_8 & 0x20 )
6418 {
6419 if ( v727 != 0.0 )
6420 pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[pCastSpell->spellnum], 0, 0, -1, 0, pCastSpell->sound_id, 0, 0);
6421 }
6422 else
6423 {
6424 if ( sRecoveryTime < 0 )
6425 sRecoveryTime = 0;
6426 if ( pParty->bTurnBasedModeOn )
6427 {
6428 v645 = sRecoveryTime;
6429 pParty->pTurnBasedPlayerRecoveryTimes[pCastSpell->uPlayerID] = sRecoveryTime;
6430 pPlayer->SetRecoveryTime(v645);
6431 if ( !some_active_character )
6432 pTurnEngine->_40471C();
6433 }
6434 else
6435 {
6436 pPlayer->SetRecoveryTime(
6437 (signed __int64)(flt_6BE3A4_debug_recmod1 * (double)sRecoveryTime * 2.133333333333333));
6438 }
6439 if ( v727 != 0.0 )
6440 {
6441 pPlayer->PlaySound(SPEECH_49, 0);
6442 if ( v727 != 0.0 )
6443 pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[pCastSpell->spellnum], 0, 0, -1, 0, pCastSpell->sound_id, 0, 0);
6444 }
6445 }
6446 pCastSpell->spellnum = 0;
6447 v2 = v723;
6448 continue;
6449 }
6450
6451 }
6452 //----- (0042EB42) --------------------------------------------------------
6453 __int16 ObjectList::ObjectIDByItemID(unsigned __int16 uItemID)
6454 {
6455 unsigned int v2; // edx@1
6456 signed int v3; // eax@1
6457 char *v4; // ecx@2
6458
6459 v2 = this->uNumObjects;
6460 v3 = 0;
6461 if ( (signed int)this->uNumObjects <= 0 )
6462 {
6463 LABEL_5:
6464 LOWORD(v3) = 0;
6465 }
6466 else
6467 {
6468 v4 = (char *)&this->pObjects->uObjectID;
6469 while ( uItemID != *(short *)v4 )
6470 {
6471 ++v3;
6472 v4 += 56;
6473 if ( v3 >= (signed int)v2 )
6474 goto LABEL_5;
6475 }
6476 }
6477 return v3;
6478 }
6479
6480 //----- (0042EB78) --------------------------------------------------------
6481 int IconFrameTable::GetIconAnimLength(unsigned int uIconID)
6482 {
6483 return 8 * this->pIcons[uIconID].uAnimLength;
6484 }
6485
6486 const wchar_t *UIMessage2String(UIMessageType msg)
6487 {
6488 #define CASE(xxx) case xxx: swprintf(b, wcslen(L"%03X/%s"), L"%03X/%s", msg, L#xxx); return b;
6489 static wchar_t b[256]; // bad for threads
6490 switch (msg)
6491 {
6492 CASE(UIMSG_SelectSpell)
6493 CASE(UIMSG_ChangeGameState)
6494 CASE(UIMSG_Attack)
6495 CASE(UIMSG_PlayArcomage)
6496 CASE(UIMSG_MainMenu_ShowPartyCreationWnd)
6497 CASE(UIMSG_MainMenu_ShowLoadWindow)
6498 CASE(UIMSG_ShowCredits)
6499 CASE(UIMSG_ExitToWindows)
6500 CASE(UIMSG_PlayerCreationChangeName)
6501 CASE(UIMSG_PlayerCreationClickPlus)
6502 CASE(UIMSG_PlayerCreationClickMinus)
6503 CASE(UIMSG_PlayerCreationSelectActiveSkill)
6504 CASE(UIMSG_PlayerCreationSelectClass)
6505 CASE(UIMSG_PlayerCreationClickOK)
6506 CASE(UIMSG_PlayerCreationClickReset)
6507 CASE(UIMSG_ClickBooksBtn)
6508 CASE(UIMSG_PlayerCreationRemoveUpSkill)
6509 CASE(UIMSG_PlayerCreationRemoveDownSkill)
6510 CASE(UIMSG_SPellbook_ShowHightlightedSpellInfo)
6511 CASE(UIMSG_LoadGame)
6512 CASE(UIMSG_SaveGame)
6513 CASE(UIMSG_ShowStatus_DateTime)
6514 CASE(UIMSG_ShowStatus_ManaHP)
6515 CASE(UIMSG_ShowStatus_Player)
6516 CASE(UIMSG_Wait5Minutes)
6517 CASE(UIMSG_Wait1Hour)
6518 CASE(UIMSG_ShowStatus_Food)
6519 CASE(UIMSG_ShowStatus_Funds)
6520 CASE(UIMSG_QuickReference)
6521 CASE(UIMSG_GameMenuButton)
6522 CASE(UIMSG_AlreadyResting)
6523 CASE(UIMSG_SelectCharacter)
6524 CASE(UIMSG_ChangeSoundVolume)
6525 CASE(UIMSG_ChangeMusicVolume)
6526 CASE(UIMSG_Escape)
6527 CASE(UIMSG_PlayerCreation_SelectAttribute)
6528 CASE(UIMSG_InventoryLeftClick)
6529 CASE(UIMSG_SkillUp)
6530 CASE(UIMSG_GameMenu_ReturnToGame)
6531 CASE(UIMSG_StartNewGame)
6532 CASE(UIMSG_Game_OpenLoadGameDialog)
6533 CASE(UIMSG_Game_OpenSaveGameDialog)
6534 CASE(UIMSG_Game_OpenOptionsDialog)
6535 CASE(UIMSG_SetGraphicsMode)
6536 CASE(UIMSG_Quit)
6537 CASE(UIMSG_StartHireling1Dialogue)
6538 CASE(UIMSG_StartHireling2Dialogue)
6539 CASE(UIMSG_SelectNPCDialogueOption)
6540 CASE(UIMSG_CastSpellFromBook)
6541 CASE(UIMSG_PlayerCreation_VoicePrev)
6542 CASE(UIMSG_PlayerCreation_VoiceNext)
6543 CASE(UIMSG_StartNPCDialogue)
6544 CASE(UIMSG_ArrowUp)
6545 CASE(UIMSG_DownArrow)
6546 CASE(UIMSG_SaveLoadBtn)
6547 CASE(UIMSG_SelectLoadSlot)
6548 CASE(UIMSG_Cancel)
6549 CASE(UIMSG_ExitRest)
6550 CASE(UIMSG_PlayerCreation_FacePrev)
6551 CASE(UIMSG_PlayerCreation_FaceNext)
6552 CASE(UIMSG_CycleCharacters)
6553 CASE(UIMSG_SetTurnSpeed)
6554 CASE(UIMSG_ToggleWalkSound)
6555 CASE(UIMSG_ChangeVoiceVolume)
6556 CASE(UIMSG_ToggleShowDamage)
6557 CASE(UIMSG_ScrollNPCPanel)
6558 CASE(UIMSG_ShowFinalWindow)
6559 CASE(UIMSG_OpenQuestBook)
6560 CASE(UIMSG_OpenAutonotes)
6561 CASE(UIMSG_OpenMapBook)
6562 CASE(UIMSG_OpenCalendar)
6563 CASE(UIMSG_OpenHistoryBook)
6564 CASE(UIMSG_ToggleAlwaysRun)
6565 CASE(UIMSG_ToggleFlipOnExit)
6566 CASE(UIMSG_Game_Action)
6567 CASE(UIMSG_RentRoom)
6568 CASE(UIMSG_TransitionUI_Confirm)
6569 CASE(UIMSG_OpenKeyMappingOptions)
6570 CASE(UIMSG_SelectKeyPage1)
6571 CASE(UIMSG_SelectKeyPage2)
6572 CASE(UIMSG_ResetKeyMapping)
6573 CASE(UIMSG_ChangeKeyButton)
6574 CASE(UIMSG_OpenVideoOptions)
6575 CASE(UIMSG_ToggleBloodsplats)
6576 CASE(UIMSG_ToggleColoredLights)
6577 CASE(UIMSG_ToggleTint)
6578 default:
6579 swprintf(b, wcslen(L"UIMSG_%03X") , L"UIMSG_%03X", msg); return b;
6580 };
6581 #undef CASE
6582 }
6583
6584 //----- (0042EB8D) -------------------------------------------------------- 1993 //----- (0042EB8D) --------------------------------------------------------
6585 void GUIMessageQueue::AddMessageImpl(UIMessageType msg, int param, unsigned int a4, const char *file, int line) 1994 void GUIMessageQueue::AddMessageImpl(UIMessageType msg, int param, unsigned int a4, const char *file, int line)
6586 { 1995 {
6587 //Log::Warning(L"%s @ (%S %u)", UIMessage2String(msg), file, line); 1996 //Log::Warning(L"%s @ (%S %u)", UIMessage2String(msg), file, line);
6588 if (uNumMessages < 40) 1997 if (uNumMessages < 40)