Mercurial > might-and-magic-trilogy
view Spells.cpp @ 7:1200e31f08e5
10.10.12
author | Серик@ПончиК |
---|---|
date | Wed, 10 Oct 2012 21:05:53 +0600 |
parents | 8b8875f5b359 |
children | 8be5293b6b33 |
line wrap: on
line source
#include <stdlib.h> #include "Spells.h" #include "Overlays.h" #include "Allocator.h" #include "LOD.h" #include "stru123.h" #include "mm7_data.h" struct SpellStats *pSpellStats; stru324_spell stru_4E3ACC[102]; SpellData pSpellDatas[95]; //----- (0042EB31) -------------------------------------------------------- bool SpellBuff::NotExpired() { bool result; // eax@1 result = 0; if ( (signed __int64)this->uExpireTime > 0 ) result = 1; return result; } //----- (00458585) -------------------------------------------------------- void SpellBuff::Reset() { SpellBuff *v1; // esi@1 unsigned __int16 v2; // ax@1 v1 = this; v2 = this->uOverlayID; this->uSkill = 0; this->uPower = 0; this->uExpireTime = 0i64; this->uCaster = 0; this->uFlags = 0; if ( v2 ) { ((OtherOverlay *)&stru_5E4C90.field_4B[20 * v2 + 105])->Reset(); pOtherOverlayList->field_3EC = 1; v1->uOverlayID = 0; } } //----- (004585CA) -------------------------------------------------------- signed int SpellBuff::_4585CA(__int64 a2) { signed int result; // eax@3 if ( this->uExpireTime && (signed __int64)this->uExpireTime < a2 ) { this->uExpireTime = 0i64; this->uPower = 0; this->uSkill = 0; this->uOverlayID = 0; result = 1; } else { result = 0; } return result; } //----- (004584E0) -------------------------------------------------------- signed int SpellBuff::Apply(unsigned __int64 uExpireTime, unsigned __int16 uSkillLevel, unsigned __int16 uPower, int a5, unsigned __int8 a6) { SpellBuff *v6; // esi@1 signed int result; // eax@3 int v8; // eax@4 v6 = this; if ( this->uExpireTime && (signed __int64)uExpireTime < (signed __int64)this->uExpireTime ) { result = 0; } else { this->uSkill = uSkillLevel; this->uPower = uPower; LOWORD(v8) = this->uOverlayID; this->uExpireTime = uExpireTime; if ( (short)v8 ) { v8 = (unsigned __int16)v8; if ( (unsigned __int16)v8 != a5 ) { ((OtherOverlay *)&stru_5E4C90.field_4B[20 * v8 + 105])->Reset(); pOtherOverlayList->field_3EC = 1; v6->uOverlayID = 0; } } v6->uOverlayID = a5; v6->uCaster = a6; result = 1; } return result; } //----- (0045384A) -------------------------------------------------------- void SpellStats::Initialize() { SpellStats *v1; // esi@1 const char *v2; // ebp@3 char *v3; // edi@3 signed int v4; // ebx@4 char *v5; // esi@4 char v6; // cl@5 int v7; // eax@5 size_t v8; // ebp@40 int v9; // eax@41 int v10; // eax@42 int v11; // eax@43 char *v12; // [sp+10h] [bp-10h]@3 signed int v13; // [sp+14h] [bp-Ch]@4 signed int v14; // [sp+18h] [bp-8h]@3 int v15; // [sp+1Ch] [bp-4h]@9 v1 = this; if ( pSpellsTXT_Raw ) pAllocator->FreeChunk(pSpellsTXT_Raw); pSpellsTXT_Raw = 0; v2 = "\r"; pSpellsTXT_Raw = (char *)pEvents_LOD->LoadRaw("spells.txt", 0); strtok(pSpellsTXT_Raw, "\r"); strtok(0, "\r"); v14 = 1; v12 = (char *)&pSpellDatas[1].field_10; v3 = (char *)&v1->pInfos[1].uSchool; do { v4 = 0; v5 = strtok(0, v2) + 1; v13 = 0; do { v6 = *v5; v7 = 0; while ( v6 != 9 && v6 ) { ++v7; v6 = v5[v7]; } v15 = (int)&v5[v7]; if ( !v5[v7] ) v13 = 1; v5[v7] = 0; if ( v7 ) { switch ( v4 ) { case 2: *((char **)v3 - 7) = RemoveQuotes(v5); break; case 3: *v3 = 4; if ( _strcmpi("fire", v5) ) { if ( _strcmpi("air", v5) ) { if ( _strcmpi("water", v5) ) { if ( _strcmpi("earth", v5) ) { if ( _strcmpi("spirit", v5) ) { if ( _strcmpi("mind", v5) ) { if ( _strcmpi("body", v5) ) { if ( _strcmpi("light", v5) ) { if ( _strcmpi("dark", v5) ) { if ( !_strcmpi("magic", v5) ) *v3 = 5; } else { *v3 = 10; } } else { *v3 = 9; } } else { *v3 = 8; } } else { *v3 = 7; } } else { *v3 = 6; } } else { *v3 = 3; } } else { *v3 = 2; } } else { *v3 = 1; } } else { *v3 = 0; } break; case 4: *((char **)v3 - 6) = RemoveQuotes(v5); break; case 5: *((char **)v3 - 5) = RemoveQuotes(v5); break; case 6: *((char **)v3 - 4) = RemoveQuotes(v5); break; case 7: *((char **)v3 - 3) = RemoveQuotes(v5); break; case 8: *((char **)v3 - 2) = RemoveQuotes(v5); break; case 9: *((char **)v3 - 1) = RemoveQuotes(v5); break; case 10: v4 = 0; v8 = strlen(v5); if ( (signed int)v8 > 0 ) { do { v9 = tolower((unsigned __int8)v5[v4]) - 99; if ( v9 ) { v10 = v9 - 2; if ( v10 ) { v11 = v10 - 8; if ( v11 ) { if ( v11 == 11 ) *v12 |= 8u; } else { *v12 |= 1u; } } else { *v12 |= 2u; } } else { *v12 |= 4u; } ++v4; } while ( v4 < (signed int)v8 ); } v2 = "\r"; break; default: break; } } else { v13 = 1; } ++v4; v5 = (char *)(v15 + 1); } while ( v4 - 1 <= 10 && !v13 ); if ( !(v14 % 11) ) strtok(0, v2); v12 += 20; ++v14; v3 += 36; } while ( (signed int)v12 <= (signed int)&pSpellDatas[90].field_12 ); }