view Engine/MapInfo.cpp @ 2542:bacf9809126a

.
author a.parshin
date Sun, 10 May 2015 02:04:52 +0200
parents a902abdfc7f2
children 30eb6dcac768
line wrap: on
line source

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

#include "Engine/Engine.h"

#include "MapInfo.h"
#include "LOD.h"
#include "texts.h"
#include "Engine/Objects/ObjectList.h"
#include "Engine/Objects/SpriteObject.h"
#include "Engine/Graphics/Indoor.h"


#include "Engine/Graphics/Level/Decoration.h"
#include "Engine/Graphics/DecorationList.h"
#include "Party.h"
#include "OurMath.h"



//----- (00453F62) --------------------------------------------------------
void MapStats::Initialize()
{
  char work_str[32]; // [sp+Ch] [bp-34h]@3
  int work_str_pos;
  int work_str_len;
  int i;
  char* test_string;
  unsigned char c;
  bool break_loop;
  unsigned int temp_str_len;
  char* tmp_pos;
  int decode_step;
//  int item_counter;

  free(pMapStatsTXT_Raw);
  pMapStatsTXT_Raw = (char *)pEvents_LOD->LoadRaw("MapStats.txt", 0);
  strtok(pMapStatsTXT_Raw, "\r");
  strtok(NULL, "\r");
  strtok(NULL, "\r");

  for (i=1; i<77; ++i)
  {
    test_string = strtok(NULL, "\r") + 1;
    break_loop = false;
    decode_step=0;
    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 1:
          pInfos[i].pName = RemoveQuotes(test_string);
          break;
        case 2:
          pInfos[i].pFilename = RemoveQuotes(test_string);
          break;
        case 3:
          pInfos[i].uNumResets = atoi(test_string);
          break;
        case 4:
          pInfos[i].uFirstVisitedAt = atoi(test_string);
          break;
        case 5:
          pInfos[i]._per = atoi(test_string);
          break;
        case 6:
          pInfos[i].uRespawnIntervalDays = atoi(test_string);
          break;
        case 7:
          pInfos[i]._alert_days = atoi(test_string);
          break;
        case 8:
          pInfos[i]._steal_perm = atoi(test_string);
          break;
        case 9:
          pInfos[i].LockX5 = atoi(test_string);
          break;
        case 10:
          pInfos[i].Trap_D20 = atoi(test_string);
          break;
        case 11:
          pInfos[i].Treasure_prob = atoi(test_string);
          break;
        case 12:
          pInfos[i].Encounter_percent = atoi(test_string);
          break;
        case 13:
          pInfos[i].EncM1percent = atoi(test_string);
          break;
        case 14:
          pInfos[i].EncM2percent = atoi(test_string);
          break;
        case 15:
          pInfos[i].EncM3percent = atoi(test_string);
          break;
        case 16:
          pInfos[i].pEncounterMonster1Texture = RemoveQuotes(test_string);
          break;
        case 18:
          pInfos[i].Dif_M1 = atoi(test_string);
          break;
        case 19:
          pInfos[i].uEncounterMonster1AtLeast = 1;
          pInfos[i].uEncounterMonster1AtMost = 1;
          strcpy(work_str, test_string);
          work_str_pos = 0;
          work_str_len=strlen(work_str);
          if (work_str_len )
          {
            while (work_str[work_str_pos] != '-' )
            {
              ++work_str_pos;
              if (work_str_pos >= work_str_len )
                break;
            }
            work_str[work_str_pos] = 0;
            pInfos[i].uEncounterMonster1AtLeast = atoi(work_str);
            if ( work_str_pos < work_str_len )
              pInfos[i].uEncounterMonster1AtMost = atoi(&work_str[work_str_pos + 1]);
            else
              pInfos[i].uEncounterMonster1AtMost = pInfos[i].uEncounterMonster1AtLeast;
          }
          break;
        case 20:
          pInfos[i].pEncounterMonster2Texture = RemoveQuotes(test_string);
          break;
        case 22:
          pInfos[i].Dif_M2 = atoi(test_string);
          break;
        case 23:
          pInfos[i].uEncounterMonster2AtLeast = 1;
          pInfos[i].uEncounterMonster2AtMost = 1;
          strcpy(work_str, test_string);
          work_str_pos = 0;
          work_str_len=strlen(work_str);
          if (work_str_len )
          {
            while (work_str[work_str_pos] != '-' )
            {
              ++work_str_pos;
              if (work_str_pos >= work_str_len )
                break;
            }
            work_str[work_str_pos] = 0;
            pInfos[i].uEncounterMonster2AtLeast = atoi(work_str);
            if ( work_str_pos < work_str_len )
              pInfos[i].uEncounterMonster2AtMost = atoi(&work_str[work_str_pos + 1]);
            else
              pInfos[i].uEncounterMonster2AtMost = pInfos[i].uEncounterMonster2AtLeast;
          }
          break;
        case 24:
          pInfos[i].pEncounterMonster3Texture = RemoveQuotes(test_string);
          break;
        case 26:
          pInfos[i].Dif_M3 = atoi(test_string);
          break;
        case 27:
          pInfos[i].uEncounterMonster3AtLeast = 1;
          pInfos[i].uEncounterMonster3AtMost = 1;
          strcpy(work_str, test_string);
          work_str_pos = 0;
          work_str_len=strlen(work_str);
          if (work_str_len )
          {
            while (work_str[work_str_pos] != '-' )
            {
              ++work_str_pos;
              if (work_str_pos >= work_str_len )
                break;
            }
            work_str[work_str_pos] = 0;
            pInfos[i].uEncounterMonster3AtLeast = atoi(work_str);
            if ( work_str_pos < work_str_len )
              pInfos[i].uEncounterMonster3AtMost = atoi(&work_str[work_str_pos + 1]);
            else
              pInfos[i].uEncounterMonster3AtMost = pInfos[i].uEncounterMonster3AtLeast;
          }
          break;
        case 28:
          pInfos[i].uRedbookTrackID = atoi(test_string);
          break;
        case 29:
          {
            if ( !strcmp(test_string, "CAVE") )
            {
              pInfos[i].uEAXEnv = 8;
              break;
            }
            if ( !strcmp(test_string, "STONEROOM") )
            {
              pInfos[i].uEAXEnv = 5;
              break;
            }
            if ( !strcmp(test_string, "MOUNTAINS") )
            {
              pInfos[i].uEAXEnv = 17;
              break;
            }
            if ( !strcmp(test_string, "PLAIN") )
            {
              pInfos[i].uEAXEnv = 19;
              break;
            }
            if ( !strcmp(test_string, "FOREST") )
            {
              pInfos[i].uEAXEnv = 15;
              break;
            }
            if ( !strcmp(test_string, "CITY") )
            {
              pInfos[i].uEAXEnv = 16;
              break;
            }
            if ( !strcmp(test_string, "UNDERWATER") )
            {
              pInfos[i].uEAXEnv = 22;
              break;
            }
            if ( !strcmp(test_string, "ARENA") )
            {
              pInfos[i].uEAXEnv = 9;
              break;
            }
            if ( !strcmp(test_string, "GENERIC") )
            {
              pInfos[i].uEAXEnv = 0;
              break;
            }
            if ( !strcmp(test_string, "PADDEDCELL") )
            {
              pInfos[i].uEAXEnv = 1;
              break;
            }
            if ( !strcmp(test_string, "ROOM") )
            {
              pInfos[i].uEAXEnv = 2;
              break;
            }
            if ( !strcmp(test_string, "BATHROOM") )
            {
              pInfos[i].uEAXEnv = 3;
              break;
            }
            if ( !strcmp(test_string, "LIVINGROOM") )
            {
              pInfos[i].uEAXEnv = 4;
              break;
            }
            if ( !strcmp(test_string, "AUDITORIUM") )
            {
              pInfos[i].uEAXEnv = 6;
              break;
            }
            if ( !strcmp(test_string, "CONCERTHALL") )
            {
              pInfos[i].uEAXEnv = 7;
              break;
            }
            if ( !strcmp(test_string, "HANGAR") )
            {
              pInfos[i].uEAXEnv = 10;
              break;
            }
            if ( !strcmp(test_string, "CARPETEDHALLWAY") )
            {
              pInfos[i].uEAXEnv = 11;
              break;
            }
            if ( !strcmp(test_string, "HALLWAY") )
            {
              pInfos[i].uEAXEnv = 12;
              break;
            }
            if ( !strcmp(test_string, "STONECORRIDOR") )
            {
              pInfos[i].uEAXEnv = 13;
              break;
            }
            if ( !strcmp(test_string, "ALLEY") )
            {
              pInfos[i].uEAXEnv = 14;
              break;
            }
            if ( !strcmp(test_string, "QUARRY") )
            {
              pInfos[i].uEAXEnv = 18;
              break;
            }
            if ( !strcmp(test_string, "PARKINGLOT") )
            {
              pInfos[i].uEAXEnv = 20;
              break;
            }
            if ( !strcmp(test_string, "SEWERPIPE") )
            {
              pInfos[i].uEAXEnv = 21;
              break;
            }
            if ( !strcmp(test_string, "DRUGGED") )
            {
              pInfos[i].uEAXEnv = 23;
              break;
            }
            if ( !strcmp(test_string, "DIZZY") )
            {
              pInfos[i].uEAXEnv = 24;
              break;
            }
            if ( !strcmp(test_string, "PSYCHOTIC") )
            {
              pInfos[i].uEAXEnv = 25;
              break;
            }
            pInfos[i].uEAXEnv = 26;

          }
          break;
        }
      }
      else
      { 
        break_loop = true;
      }
      ++decode_step;
      test_string=tmp_pos+1;
    } while ((decode_step<31)&&!break_loop);
  }

  uNumMaps = 77;
}
// 453F62: using guessed type char Str[32];

//----- (00410D99) --------------------------------------------------------
int MapStats::sub_410D99_get_map_index(int a1)
{
  for (int i = 1; i <= pMapStats->uNumMaps; i++)
  {
    if (_stricmp(pMapStats->pInfos[i].pFilename, pGames_LOD->pSubIndices[a1].pFilename) )
      return i;
  }
  Error("Map not found");
  return -1;
}

//----- (004547A3) --------------------------------------------------------
MAP_TYPE MapStats::GetMapInfo(const char *Str2)
{
  Assert(uNumMaps >= 2);

  for (uint i = 1; i < uNumMaps; ++i)
    if (!_stricmp(pInfos[i].pFilename, Str2))
      return (MAP_TYPE)i;

  Error("Map not found!");
  return (MAP_TYPE)-1;
}


//----- (0044FFD8) --------------------------------------------------------
int MapInfo::SpawnRandomTreasure(SpawnPointMM7 *a2)
{
  //MapInfo *v2; // ebx@1
  //SpawnPointMM7 *v3; // esi@1
  //int v4; // eax@1
  int v5; // edx@1
//  int v6; // eax@1
  int v7; // ecx@1
  int v8; // ebx@1
  int v9; // eax@1
  signed int v10; // ebx@1
  signed int result; // eax@1
  signed __int64 v12; // qtt@1
  int v13; // ebx@1
  int v14; // edx@10
  signed int v15; // ebx@20
  unsigned __int16 v16; // dx@20
//  ObjectDesc *v17; // ecx@21
  unsigned __int16 v18; // ax@24
  int v19; // ST0C_4@27
  int v20; // ST08_4@27
  int v21; // ST04_4@27
  int v22; // eax@27
  signed int v23; // ebx@29
  unsigned __int16 v24; // dx@29
//  ObjectDesc *v25; // ecx@30
  unsigned __int16 v26; // ax@33
  //int v27; // ecx@35
  //int v28; // eax@35
  //int v29; // esi@35
  //__int16 v30; // ax@35
  SpriteObject a1a; // [sp+Ch] [bp-7Ch]@1
  //int v32; // [sp+7Ch] [bp-Ch]@1
  //int v33; // [sp+80h] [bp-8h]@1
  int v34; // [sp+84h] [bp-4h]@1

  //auto a1 = this;
  //v2 = a1;
  //v3 = a2;
  //v4 = rand();
  v34 = 0;
  v5 = rand() % 100;
  // v6 = 2 * (v2->Treasure_prob + 7 * v3->uIndex) - 14;
  v7 = (unsigned __int8)byte_4E8168[a2->uIndex - 1][2 * Treasure_prob];
  v8 = (unsigned __int8)byte_4E8168[a2->uIndex - 1][2 * Treasure_prob + 1];
  //v32 = v5;
  //v33 = v7;
  v9 = rand();
  v10 = v8 - v7 + 1;
  v12 = v9;
  result = v9 / v10;
  v13 = v7 + (unsigned __int64)(v12 % v10);
  if ( v13 < 7 )
  {
    if ( v5 < 20 )
      return result;
    if ( v5 >= 60 )
    {
      v19 = a2->vPosition.z;
      v20 = a2->vPosition.y;
      v21 = a2->vPosition.x;
      v22 = rand();
      return sub_450521_ProllyDropItemAt(v13, v22 % 27 + 20, v21, v20, v19, 0);
    }
    if ( a2->uIndex == 1 )
    {
      v14 = rand() % 51 + 50;
      a1a.stru_24.uItemID = 197;
      v34 = v14;
    }
    else if ( a2->uIndex == 2 )
    {
      v14 = rand() % 101 + 100;
      a1a.stru_24.uItemID = 197;
      v34 = v14;
    }
    else if ( a2->uIndex == 3 )
    {
      v14 = rand() % 301 + 200;
      a1a.stru_24.uItemID = 198;
      v34 = v14;
    }
    else if ( a2->uIndex == 4 )
    {
      v14 = rand() % 501 + 500;
      a1a.stru_24.uItemID = 198;
      v34 = v14;
    }
    else if ( a2->uIndex == 5 )
    {
      v14 = rand() % 1001 + 1000;
      a1a.stru_24.uItemID = 199;
      v34 = v14;
    }
    else if ( a2->uIndex == 6 )
    {
      v14 = rand() % 3001 + 2000;
      a1a.stru_24.uItemID = 199;
      v34 = v14;
    }	 
    v15 = 0;
    v16 = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
    a1a.uType = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
    v18 = 0;
    for( int i = 0; i < pObjectList->uNumObjects; i++ )
    {
      if ( pObjectList->pObjects[i].uObjectID == v16 )
      {
        v18 = i;
        break;
      }
    }
    a1a.stru_24.SetIdentified();
    a1a.uObjectDescID = v18;
    a1a.stru_24.uSpecEnchantmentType = v34;
  }
  else
  {
    result = a1a.stru_24.GenerateArtifact();
    if ( !result )
      return result;
    v23 = 0;
    v24 = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
    a1a.uType = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
    v26 = 0;
    for( int i = 0; i < pObjectList->uNumObjects; i++ )
    {
      if( v24 == pObjectList->pObjects[i].uObjectID )
      {
        v26 = i;
        break;
      }
    }
    a1a.uObjectDescID = v26;
    a1a.stru_24.Reset();
  }
  a1a.vPosition.y = a2->vPosition.y;
  a1a.uAttributes = 0;
  a1a.uSoundID = 0;
  a1a.uFacing = 0;
  a1a.vPosition.z = a2->vPosition.z;
  a1a.vPosition.x = a2->vPosition.x;
  a1a.spell_skill = 0;
  a1a.spell_level = 0;
  a1a.spell_id = 0;
  a1a.spell_target_pid = 0;
  a1a.spell_caster_pid = 0;
  a1a.uSpriteFrameID = 0;
  a1a.uSectorID = pIndoor->GetSector(a2->vPosition.x, a2->vPosition.y, a2->vPosition.z);;
  return a1a.Create(0, 0, 0, 0);
}

//----- (004498D5) --------------------------------------------------------
void TeleportToStartingPoint(MapStartPoint point)
{
	const char *model_name; // [sp-4h] [bp-84h]@6
	char pName[128]; // [sp+8h] [bp-78h]@11

	switch (point)
	{
	case MapStartPoint_Party: model_name = "Party Start"; break;
	case MapStartPoint_North: model_name = "North Start"; break;
	case MapStartPoint_South: model_name = "South Start"; break;
	case MapStartPoint_East: model_name = "East Start";  break;
	case MapStartPoint_West: model_name = "West Start";  break;
	default:
		Error("Invalid enum value: %u", point);
	}

	strcpy(pName, model_name);
	if (pDecorationList->GetDecorIdByName(pName))
	{

		if ((signed int)uNumLevelDecorations > 0)
		{
			for (uint i = 0; i < (signed int)uNumLevelDecorations; ++i)
			{
				if (pLevelDecorations[i].uDecorationDescID == (signed __int16)pDecorationList->GetDecorIdByName(pName))
				{
					pParty->vPosition.x = pLevelDecorations[i].vPosition.x;
					pParty->vPosition.y = pLevelDecorations[i].vPosition.y;
					pParty->vPosition.z = pLevelDecorations[i].vPosition.z;
					pParty->uFallStartY = pParty->vPosition.z;
					pParty->sRotationY = (signed int)(stru_5C6E00->uIntegerHalfPi * pLevelDecorations[i].field_1A) / 90;
					if (pLevelDecorations[i].field_10_y_rot)
						pParty->sRotationY = pLevelDecorations[i].field_10_y_rot;
					pParty->sRotationX = 0;
					pParty->uFallSpeed = 0;
				}
			}
		}
		if (dword_5B65C0)
		{
			if (_5B65A8_npcdata_uflags_or_other)
				pParty->vPosition.x = _5B65A8_npcdata_uflags_or_other;
			if (_5B65AC_npcdata_fame_or_other)
				pParty->vPosition.y = _5B65AC_npcdata_fame_or_other;
			if (_5B65B0_npcdata_rep_or_other)
			{
				pParty->vPosition.z = _5B65B0_npcdata_rep_or_other;
				pParty->uFallStartY = _5B65B0_npcdata_rep_or_other;
			}
			if (_5B65B4_npcdata_loword_house_or_other != -1)
				pParty->sRotationY = _5B65B4_npcdata_loword_house_or_other;
			if (_5B65B8_npcdata_hiword_house_or_other)
				pParty->sRotationX = _5B65B8_npcdata_hiword_house_or_other;
			if (dword_5B65BC)
				pParty->uFallSpeed = dword_5B65BC;
		}
		_5B65B4_npcdata_loword_house_or_other = -1;
		dword_5B65C0 = 0;
		dword_5B65BC = 0;
		_5B65B8_npcdata_hiword_house_or_other = 0;
		_5B65B0_npcdata_rep_or_other = 0;
		_5B65AC_npcdata_fame_or_other = 0;
		_5B65A8_npcdata_uflags_or_other = 0;
	}
}