view Spells.cpp @ 28:18f7a1b94448

Indoor::Load
author Nomad
date Tue, 16 Oct 2012 19:31:34 +0200
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 );
}