view Spells.cpp @ 1266:71ebff35c428

Merge
author Grumpy7
date Thu, 13 Jun 2013 07:23:54 +0200
parents ab6560001f5b
children 86a83e12d795 dcc52e17b517
line wrap: on
line source

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#include <stdlib.h>

#include "Spells.h"
#include "Overlays.h"
#include "Allocator.h"
#include "LOD.h"
#include "texts.h"

#include "mm7_data.h"




std::array<TownPortalData, 6> TownPortalList = //4ECBB8
{{
 {Vec3_int_(-5121, 2107, 1), 1536, 0, 21, 0},
 {Vec3_int_(-15148, -10240, 1473), 0, 0, 4, 0},
 {Vec3_int_(-10519, 5375, 753), 512, 0, 3, 0},
 {Vec3_int_(3114, -11055, 513), 0, 0, 10, 0},
 {Vec3_int_(-158, 7624, 1), 512, 0, 7, 0},
 {Vec3_int_(-1837, -4247, 65), 65, 0, 8, 0}
}} ;

struct SpellStats *pSpellStats;


std::array<stru324_spell, 103> stru_4E3ACC =
{{
  {10, 0},
  {1000, 0}, {1010, 0}, {1020, 0}, {1030, 0}, {1040, 0}, {1050, 0}, {1060, 0}, {1070, 0}, {1080, 0}, {1090, 0}, {1100, 0},
  {2000, 0}, {2010, 0}, {2020, 0}, {2030, 0}, {2040, 0}, {2050, 0}, {2060, 0}, {2070, 0}, {2080, 0}, {2090, 0}, {2100, 0},
  {3000, 0}, {3010, 0}, {3020, 0}, {3030, 0}, {3040, 0}, {3050, 0}, {3060, 0}, {3070, 0}, {3080, 0}, {3090, 0}, {3100, 0},
  {4000, 0}, {4010, 0}, {4020, 0}, {4030, 0}, {4040, 0}, {4050, 0}, {4060, 0}, {4070, 0}, {4080, 0}, {4090, 0}, {4100, 0},
  {5000, 0}, {5010, 0}, {5020, 0}, {5030, 0}, {5040, 0}, {5050, 0}, {5060, 0}, {5070, 0}, {5080, 0}, {5090, 0}, {5100, 0},
  {6000, 0}, {6010, 0}, {6020, 0}, {6030, 0}, {6040, 0}, {6050, 0}, {6060, 0}, {6070, 0}, {6080, 0}, {6090, 0}, {6100, 0},
  {7000, 0}, {7010, 0}, {7020, 0}, {7030, 0}, {7040, 0}, {7050, 0}, {7060, 0}, {7070, 0}, {7080, 0}, {7090, 0}, {7100, 0},
  {8000, 0}, {8010, 0}, {8020, 0}, {8030, 0}, {8040, 0}, {8050, 0}, {8060, 0}, {8070, 0}, {8080, 0}, {8090, 0}, {8100, 0},
  {9000, 0}, {9010, 0}, {9020, 0}, {9030, 0}, {9040, 0}, {9050, 0}, {9060, 0}, {9070, 0}, {9080, 0}, {9090, 0}, {9100, 0},
  {545, 0},
  {545, 0},
  {555, 0}
}};
 //9 spellbook pages  11 spells per page 9*11 =99 +1 zero struct at 0. It counted from 1!
std::array<SpellData, 100> pSpellDatas={{
					 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

					 {1, 1, 1, 1, 60, 60, 60, 40, 0, 0},//0
	                 {2, 2, 2, 2, 110, 110, 100, 90, 768, 0},
	                 {3, 3, 3, 3, 120, 120, 120, 120, 0, 0},
	                 {4, 4, 4, 4, 120, 120, 120, 120, 0, 0},
	                 {5, 5, 5, 5, 120, 120, 120, 120, 0, 0},
	                 {8, 8, 8, 8, 100, 100, 90, 80, 1536, 0},
	                 {10, 10, 10, 10, 150, 150, 150, 150, 1536, 0},
	                 {15, 15, 15, 15, 120, 120, 120, 120, 1536, 0},
	                 {20, 20, 20, 20, 100, 100, 100, 90, 264, 0},
	                 {25, 25, 25, 25, 100, 100, 100, 90, 268, 0},
	                 {30, 30, 30, 30, 90, 90, 90, 90, 3855, 0},

	                 {1, 1, 1, 0, 60, 60, 60, 60, 0, 0},  //1
	                 {2, 2, 2, 2, 120, 120, 120, 100, 0, 0},
	                 {3, 3, 3, 3, 120, 120, 120, 120, 0, 0},
	                 {4, 4, 4, 4, 110, 100, 90, 80, 258, 0},
	                 {5, 5, 5, 5,  90, 90,  70, 50, 0, 0},
	                 {8, 8, 8, 8, 120, 120, 120, 120, 0, 0},
	                 {10, 10, 10, 10, 100, 100, 90, 70, 2048, 0},
	                 {15, 15, 15, 15, 200, 200, 200, 200, 0, 0},
	                 {20, 20, 20, 20, 100, 100, 100, 90, 2570, 0},
	                 {25, 25, 25, 25, 250, 250, 250, 250, 0, 0},
	                 {30, 30, 30, 30, 90, 90, 90, 90, 276, 0},

	                 {1, 1, 1, 1, 60, 60, 60, 20, 0, 0},  //2
	                 {2, 2, 2, 2, 110, 100, 90, 70, 514, 0},
	                 {3, 3, 3, 3, 120, 120, 120, 120, 0, 0},
	                 {4, 4, 4, 4, 110, 100, 90, 80, 1024, 0},
	                 {5, 5, 5, 5, 150, 150, 150, 150, 0, 0},
	                 {8, 8, 8, 8, 200, 200, 200, 200, 0, 0},
	                 {10, 10, 10, 10, 100, 100, 90, 80, 2313, 0},
	                 {15, 15, 15, 15, 140, 140, 140, 140, 0, 0},
	                 {20, 20, 20, 20, 200, 200, 200, 200, 0, 0},
	                 {25, 25, 25, 25, 80, 80, 80, 80, 780, 0},
	                 {30, 30, 30, 30, 250, 250, 250, 250, 0, 0},

	                 {1, 1, 1, 1, 80, 80, 80, 80, 0, 0},  //3
	                 {2, 2, 2, 2, 100, 100, 100, 100, 0, 0},
	                 {3, 3, 3, 3, 120, 120, 120, 120, 0, 0},
	                 {4, 4, 4, 4, 110, 100, 90, 80, 773, 0},
	                 {5, 5, 5, 5, 120, 120, 120, 120, 0, 0},
	                 {8, 8, 8, 8, 100, 100, 90, 80, 2304, 0},
	                 {10, 10, 10, 10, 140, 140, 140, 140, 0, 0},
	                 {15, 15, 15, 15, 90, 90, 90, 80, 2048, 0},
	                 {20, 20, 20, 20, 150, 150, 150, 150, 0, 0},
	                 {25, 25, 25, 25, 100, 100, 100, 90, 276, 0},
	                 {30, 30, 30, 30, 90, 90, 90, 90, 25, 0},

	                 {1, 1, 1, 1, 100, 100, 100, 100, 0, 0},  //4
	                 {2, 2, 2, 2, 100, 100, 100, 100, 0, 0},
	                 {3, 3, 3, 3, 90, 90, 90, 90, 0, 0},
	                 {4, 4, 4, 4, 120, 120, 120, 120, 0, 0},
	                 {5, 5, 5, 5, 120, 120, 120, 120, 0, 0},
	                 {8, 8, 8, 8, 120, 120, 120, 120, 0, 0},
	                 {10, 10, 10, 10, 120, 120, 120, 120, 0, 0},
	                 {15, 15, 15, 15, 100, 100, 100, 100, 2058, 0},
	                 {20, 20, 20, 20, 240, 240, 240, 240, 0, 0},
	                 {25, 25, 25, 25, 150, 150, 150, 150, 0, 0},
	                 {30, 30, 30, 30, 1000, 1000, 1000, 1000, 0, 0},

	                 {1, 1, 1, 1, 120, 120, 120, 120, 0, 0},  //5
	                 {2, 2, 2, 2, 110, 110, 110, 110, 771, 0},
	                 {3, 3, 3, 3, 120, 120, 120, 120, 0, 0},
	                 {4, 4, 4, 4, 110, 100, 90, 80, 0, 0},
	                 {5, 5, 5, 5, 100, 100, 100, 100, 0, 0},
	                 {8, 8, 8, 8, 120, 120, 120, 120, 0, 0},
	                 {10, 10, 10, 10, 120, 120, 120, 120, 0, 0},
	                 {15, 15, 15, 15, 80, 80, 80, 80, 0, 0},
	                 {20, 20, 20, 20, 120, 120, 120, 120, 0, 0},
	                 {25, 25, 25, 25, 110, 110, 110, 100, 268, 0},
	                 {30, 30, 30, 30, 120, 120, 120, 120, 0, 0},

	                 {1, 1, 1, 1, 120, 120, 120, 120, 0, 0},  //6
	                 {2, 2, 2, 2, 100, 100, 100, 100, 0, 0},
	                 {3, 3, 3, 3, 120, 120, 120, 120, 0, 0},
	                 {4, 4, 4, 4, 110, 100, 90, 80, 520, 0},
	                 {5, 5, 5, 5, 110, 110, 110, 110, 0, 0},
	                 {8, 8, 8, 8, 120, 120, 120, 120, 0, 0},
	                 {10, 10, 10, 10, 120, 120, 120, 120, 0, 0},
	                 {15, 15, 15, 15, 120, 120, 120, 120, 0, 0},
	                 {20, 20, 20, 20, 120, 120, 120, 120, 0, 0},
	                 {25, 25, 25, 25, 110, 110, 110, 100, 1310, 0},
	                 {30, 30, 30, 30, 100, 100, 100, 100, 0, 0},

	                 {5, 5, 5, 5, 110, 100, 90, 80, 1024, 0},   //7
	                 {10, 10, 10, 10, 120, 110, 100, 90, 4112, 0},
	                 {15, 15, 15, 15, 120, 110, 100, 90, 0, 0},
	                 {20, 20, 20, 20, 160, 140, 120, 100, 0, 0},
	                 {25, 25, 25, 25, 140, 140, 140, 140, 0, 0},
	                 {30, 30, 30, 30, 500, 500, 500, 500, 0, 0},
	                 {35, 35, 35, 35, 135, 135, 120, 100, 281, 0},
	                 {40, 40, 40, 40, 500, 500, 500, 500, 0, 0},
	                 {45, 45, 45, 45, 250, 250, 250, 250, 0, 0},
	                 {50, 50, 50, 50, 150, 150, 150, 135, 5140, 0},
	                 {55, 55, 55, 55, 300, 300, 300, 300, 0, 0},

	                 {10, 10, 10, 10, 140, 140, 140, 140, 0, 0},  //8
	                 {15, 15, 15, 15, 120, 110, 100, 90, 2585, 0},
	                 {20, 20, 20, 20, 120, 100, 90, 120, 0, 0},
	                 {25, 25, 25, 25, 120, 120, 120, 120, 0, 0},
	                 {30, 30, 30, 30, 90, 90, 80, 70, 1542, 0},
	                 {35, 35, 35, 35, 120, 120, 100, 80, 0, 0},
	                 {40, 40, 40, 40, 110, 110, 110, 110, 0, 0},
	                 {45, 45, 45, 45, 200, 200, 200, 150, 0, 0},
	                 {50, 50, 50, 50, 120, 120, 120, 100, 6400, 0},
	                 {55, 55, 55, 55, 250, 250, 250, 250, 306, 0},
	                 {60, 60, 60, 60, 300, 300, 300, 300, 2073, 0}
  }};


std::array<unsigned int, 25> wand_spell_ids =
{
// 135 Wand of Fire               136 Wand of Sparks             137 Wand of Poison             138 Wand of Stunning           139 Wand of Harm
  SPELL_FIRE_FIRE_BOLT,           SPELL_AIR_SPARKS,              SPELL_WATER_POISON_SPRAY,      SPELL_EARTH_STUN,              SPELL_BODY_HARM,
// 140 Fairy Wand of Light        141 Fairy Wand of Ice          142 Fairy Wand of Lashing      143 Fairy Wand of Mind         144 Fairy Wand of Swarms
  SPELL_LIGHT_LIGHT_BOLT,         SPELL_WATER_ICE_BOLT,          SPELL_SPIRIT_SPIRIT_LASH,      SPELL_MIND_MIND_BLAST,         SPELL_EARTH_DEADLY_SWARM,
// 145 Alacorn Wand of Fireballs  146 Alacorn Wand of Acid       147 Alacorn Wand of Lightning  148 Alacorn Wand of Blades     149 Alacorn Wand of Charms
  SPELL_FIRE_FIREBALL,            SPELL_WATER_ACID_BURST,        SPELL_AIR_LIGHNING_BOLT,       SPELL_EARTH_BLADES,            SPELL_MIND_CHARM,
// 150 Arcane Wand of Blasting    151 Arcane Wand of The Fist    152 Arcane Wand of Rocks       153 Arcane Wand of Paralyzing  154 Arcane Wand of Clouds
  SPELL_WATER_ICE_BLAST,          SPELL_BODY_FLYING_FIST,        SPELL_EARTH_ROCK_BLAST,        SPELL_LIGHT_PARALYZE,          SPELL_DARK_TOXIC_CLOUD,
// 155 Mystic Wand of Implosion   156 Mystic Wand of Distortion  157 Mystic Wand of Sharpmetal  158 Mystic Wand of Shrinking   159 Mystic Wand of Incineration
  SPELL_AIR_IMPLOSION,            SPELL_EARTH_MASS_DISTORTION,   SPELL_DARK_SHARPMETAL,         SPELL_DARK_SHRINKING_RAY,      SPELL_FIRE_INCINERATE
};


std::array<std::array<unsigned char, 12>, 9> pSpellbookSpellIndices = // 4E2430
	{{  //0   1   2   3  4    5   6  7    8  9   10  11
		{0,  3,  1,  8, 11,  7,  4, 10,  6,  2,  5,  9},
		{0, 11,  2,  9,  6,  8,  5, 10,  3,  7,  1,  4},
		{0,  4,  8,  9,  1, 10,  3, 11,  7,  6,  2,  5}, 
		{0,  7, 10,  8,  2, 11,  1,  5,  3,  6,  4,  9},
		{0,  5, 10, 11,  7,  2,  8,  1,  4,  9,  3,  6},
		{0,  5,  9,  8,  3,  7,  6,  4,  1, 11,  2, 10}, 
		{0,  1,  6,  9,  3,  5,  8, 11,  7, 10,  4,  2},
		{0,  1, 10, 11,  9,  4,  3,  6,  5,  7,  8,  2},
		{0,  9,  3,  7,  1,  5,  2, 10, 11,  8,  6,  4}
}};

	std::array<std::array<struct SpellBookIconPos, 12>, 9> pIconPos={{

		 {  0,   0,  17,  13, 115,   2, 217,  15,
		 299,   6,  28, 125, 130, 133, 294, 114,
      11, 232, 134, 233, 237, 171, 296, 231},

		 {  0,   0, 19,   9, 117,   3, 206,  13,	
		 285,   7,  16, 123, 113, 101, 201, 118,
		 317, 110,  11, 230, 149, 236, 296, 234},

		 {  0,   0,  17,   9, 140,   0, 210,  34,
		 293,   5,   15,  98,  78, 121, 175, 136,
     301, 115,   15, 226, 154, 225, 272, 220},

		 { 0,    0,   7,   9, 156,   2, 277,   9,
		  11, 117, 111,  82, 180, 102, 303, 108,
		  10, 229, 120, 221, 201, 217, 296, 225},

		 {  0,   0,  18,   8,  89,  15, 192,  14,
		 292,   7,  22, 129, 125, 146, 217, 136,
		 305, 115,  22, 226, 174, 237, 290, 231},

     { 0,    0,  18,  12, 148,   9, 292,   7,
     17, 122, 121,  99, 220,  87, 293, 112,
     13, 236, 128, 213, 220, 223, 315, 223},

     {  0,   0,  23,  14, 127,   8, 204, 0,
     306,   8,  14, 115, 122, 132, 200, 116,
     293, 122,  20, 228, 154, 228, 294, 239},

     {  0,   0,  19,  14, 124,  10, 283,  12,
     8, 105, 113,  89, 190,  82, 298, 108,
     18, 181, 101, 204, 204, 203, 285, 218},

		 {  0,   0, 18,  17, 110,  16, 201,  15,
		 307,  15, 18, 148, 125, 166, 201, 123,
     275, 120, 28, 235, 217, 222, 324, 216}}};


//----- (0042EB31) --------------------------------------------------------
bool SpellBuff::NotExpired()
{
  return (signed __int64)this->uExpireTime > 0 ? true:false;
}


//----- (00458585) --------------------------------------------------------
void SpellBuff::Reset()
{
  uSkill = 0;
  uPower = 0;
  uExpireTime = 0i64;
  uCaster = 0;
  uFlags = 0;
  if (uOverlayID)
  {
    pOtherOverlayList->pOverlays[uOverlayID - 1].Reset();
    pOtherOverlayList->bRedraw = true;
    uOverlayID = 0;
  }
}

//----- (004585CA) --------------------------------------------------------
signed int SpellBuff::_4585CA(__int64 a2)
{
  if (uExpireTime && uExpireTime < a2)
  {
    uExpireTime = 0;
    uPower = 0;
    uSkill = 0;
    uOverlayID = 0;
    return true;
  }
  return false;
}

//----- (004584E0) --------------------------------------------------------
bool SpellBuff::Apply(unsigned __int64 uExpireTime, unsigned __int16 uSkillLevel, unsigned __int16 uPower, int uOverlayID, unsigned __int8 caster)
{
  if (this->uExpireTime && uExpireTime < this->uExpireTime)
    return false;

  this->uSkill = uSkillLevel;
  this->uPower = uPower;
  this->uExpireTime = uExpireTime;
  if (this->uOverlayID && this->uOverlayID != uOverlayID)
  {
    pOtherOverlayList->pOverlays[this->uOverlayID - 1].Reset();
    pOtherOverlayList->bRedraw = true;
    this->uOverlayID = 0;
  }
  this->uOverlayID = uOverlayID;
  this->uCaster = caster;

  return true;
}

//----- (0045384A) --------------------------------------------------------
void SpellStats::Initialize()
{
	int decode_step;
	char* test_string;
	bool break_loop;
	unsigned char c;
	unsigned int temp_str_len;
	char* tmp_pos;

	if ( pSpellsTXT_Raw )
		pAllocator->FreeChunk(pSpellsTXT_Raw);
	pSpellsTXT_Raw = NULL;

	pSpellsTXT_Raw = (char *)pEvents_LOD->LoadRaw("spells.txt", 0);
	strtok(pSpellsTXT_Raw, "\r");
	strtok(NULL, "\r");
	for(int i=1; i<100; ++i) 
		{
		test_string=strtok(NULL, "\r")+1;
		decode_step =0;
		break_loop=false;
		do 
			{
			c = *(unsigned char*)test_string;
			temp_str_len = 0;
			while((c!='\t')&&(c>0))
				{
				++temp_str_len;
				c=test_string[temp_str_len];
				}		
			tmp_pos=test_string+temp_str_len;
			if (*tmp_pos == 0)
				break_loop = true;
			*tmp_pos = 0;
			if (temp_str_len)
				{		
				switch (decode_step)
					{	
				case 2:
					pInfos[i].pName=RemoveQuotes(test_string);
					break;
				case 3:
					pInfos[i].uSchool = SPELL_SCHOOL_NONE;
					if (!_stricmp("fire", test_string) )
						{
						pInfos[i].uSchool =SPELL_SCHOOL_FIRE;
						break;
						}
					if ( !_stricmp("air", test_string) )	
						{
						pInfos[i].uSchool = SPELL_SCHOOL_AIR;
						break;
						}
					if ( !_stricmp("water", test_string))	
						{
						pInfos[i].uSchool = SPELL_SCHOOL_WATER;
						break;
						}	
					if ( !_stricmp("earth", test_string))	
						{
						pInfos[i].uSchool = SPELL_SCHOOL_EARTH;
						break;
						}	
					if ( !_stricmp("spirit", test_string))	
						{
						pInfos[i].uSchool = SPELL_SCHOOL_SPIRIT;
						break;
						}
					if ( !_stricmp("mind", test_string))	
						{
						pInfos[i].uSchool = SPELL_SCHOOL_MIND;
						break;
						}
					if ( !_stricmp("body", test_string) )	
						{
						pInfos[i].uSchool = SPELL_SCHOOL_BODY;
						break;
						}			
					if ( !_stricmp("light", test_string) )	
						{
						pInfos[i].uSchool =  SPELL_SCHOOL_LIGHT;
						break;
						}					
					if ( !_stricmp("dark", test_string))	
						{
						pInfos[i].uSchool = SPELL_SCHOOL_DARK;
						break;
						}					

					if ( !_stricmp("magic", test_string))	
						{
						pInfos[i].uSchool = SPELL_SCHOOL_MAGIC;
						break;
						}								
					break;
				case 4:
					pInfos[i].pShortName=RemoveQuotes(test_string);
					break;
				case 5:
					pInfos[i].pDescription=RemoveQuotes(test_string);
					break;
				case 6:
					pInfos[i].pBasicSkillDesc=RemoveQuotes(test_string);
					break;
				case 7:
					pInfos[i].pExpertSkillDesc=RemoveQuotes(test_string);
					break;
				case 8:
					pInfos[i].pMasterSkillDesc=RemoveQuotes(test_string);
					break;
				case 9:
					pInfos[i].pGrandmasterSkillDesc=RemoveQuotes(test_string);
					break;
				case 10:
					int in_string_pos=0;
					unsigned char test;
					int in_str_len=strlen(test_string);
					for (int j=0; j<in_str_len; ++j)
						{
							test= tolower(test_string[j]);
							switch (test)
							{
							case 109:
								pSpellDatas[i].field_12|=1;
								break;
							case 101:
								pSpellDatas[i].field_12|=2;
								break;
							case 99:
								pSpellDatas[i].field_12|=4;
								break;
							case 120:
								pSpellDatas[i].field_12|=8;
								break;
							}					
						}
					break;
					}
				}
			else
				break_loop=true;
			++decode_step;
			test_string=tmp_pos+1;	
			} while ((decode_step<11)&&!break_loop);
			if ((i%11)==0)
				strtok(NULL, "\r");
		}

	}