2008-06-13 00:08:04 +03:00
# define VCMI_DLL
2008-01-09 19:21:31 +02:00
# include "../stdafx.h"
2007-07-03 11:10:37 +03:00
# include "CDefObjInfoHandler.h"
2007-08-30 13:11:53 +03:00
# include "../CGameInfo.h"
2007-08-29 15:18:31 +03:00
# include "CLodHandler.h"
2007-08-04 22:01:22 +03:00
# include <sstream>
2008-06-30 03:06:41 +03:00
# include "../lib/VCMI_Lib.h"
2008-09-18 17:18:08 +03:00
# include <set>
2008-06-13 00:08:04 +03:00
extern CLodHandler * bitmaph ;
2008-02-05 05:56:45 +02:00
bool CGDefInfo : : isVisitable ( )
{
for ( int i = 0 ; i < 6 ; i + + )
{
if ( visitMap [ i ] )
return true ;
}
return false ;
}
2008-02-15 20:40:58 +02:00
CGDefInfo : : CGDefInfo ( )
{
2009-01-11 00:08:18 +02:00
handler = NULL ;
2009-01-06 20:42:20 +02:00
serial = - 1 ;
2008-02-15 20:40:58 +02:00
visitDir = ( 8 | 16 | 32 | 64 | 128 ) ; //4,5,6,7,8 - any not-from-up direction
}
2007-07-03 11:10:37 +03:00
void CDefObjInfoHandler : : load ( )
{
2008-06-30 03:06:41 +03:00
VLC - > dobjinfo = this ;
2008-02-05 05:56:45 +02:00
nodrze < int > ideki ;
2008-06-13 00:08:04 +03:00
std : : istringstream inp ( bitmaph - > getTextFile ( " ZOBJCTS.TXT " ) ) ;
2007-07-03 11:10:37 +03:00
int objNumber ;
inp > > objNumber ;
2008-10-18 14:41:24 +03:00
std : : string mapStr ;
2007-07-03 11:10:37 +03:00
for ( int hh = 0 ; hh < objNumber ; + + hh )
{
2008-02-05 05:56:45 +02:00
CGDefInfo * nobj = new CGDefInfo ( ) ;
nobj - > handler = NULL ;
2007-07-03 11:10:37 +03:00
std : : string dump ;
2008-02-05 05:56:45 +02:00
inp > > nobj - > name ;
2007-11-20 19:52:22 +02:00
2008-02-05 05:56:45 +02:00
std : : transform ( nobj - > name . begin ( ) , nobj - > name . end ( ) , nobj - > name . begin ( ) , ( int ( * ) ( int ) ) toupper ) ;
2007-08-07 16:49:15 +03:00
for ( int o = 0 ; o < 6 ; + + o )
{
2008-02-05 05:56:45 +02:00
nobj - > blockMap [ o ] = 0xff ;
nobj - > visitMap [ o ] = 0x00 ;
2007-08-07 16:49:15 +03:00
}
inp > > mapStr ;
2007-08-11 17:58:07 +03:00
std : : reverse ( mapStr . begin ( ) , mapStr . end ( ) ) ;
2007-08-07 16:49:15 +03:00
for ( int v = 0 ; v < mapStr . size ( ) ; + + v )
{
if ( mapStr [ v ] = = ' 0 ' )
{
2008-02-05 05:56:45 +02:00
nobj - > blockMap [ v / 8 ] & = 255 - ( 128 > > ( v % 8 ) ) ;
2007-08-07 16:49:15 +03:00
}
}
inp > > mapStr ;
2007-08-11 17:58:07 +03:00
std : : reverse ( mapStr . begin ( ) , mapStr . end ( ) ) ;
2007-08-07 16:49:15 +03:00
for ( int v = 0 ; v < mapStr . size ( ) ; + + v )
{
if ( mapStr [ v ] = = ' 1 ' )
{
2008-02-05 05:56:45 +02:00
nobj - > visitMap [ v / 8 ] | = ( 128 > > ( v % 8 ) ) ;
2007-08-07 16:49:15 +03:00
}
}
2008-06-30 03:06:41 +03:00
for ( int yy = 0 ; yy < 2 ; + + yy ) //first - on which types of terrain object can be placed;
inp > > dump ; //second -in which terrains' menus object in the editor will be available (?)
2008-02-05 05:56:45 +02:00
inp > > nobj - > id ;
inp > > nobj - > subid ;
inp > > nobj - > type ;
2008-10-26 22:58:34 +02:00
if ( nobj - > type = = 2 | | nobj - > type = = 3 | | nobj - > type = = 4 | | nobj - > type = = 5 | | nobj - > id = = 111 | | nobj - > id = = 33 | | nobj - > id = = 81 ) //creature, hero, artifact, resource or whirlpool or garrison or scholar
2008-09-18 17:18:08 +03:00
nobj - > visitDir = 0xff ;
else
nobj - > visitDir = ( 8 | 16 | 32 | 64 | 128 ) ; //disabled visiting from the top
2008-02-05 05:56:45 +02:00
inp > > nobj - > printPriority ;
gobjs [ nobj - > id ] [ nobj - > subid ] = nobj ;
if ( nobj - > id = = 98 )
castles [ nobj - > subid ] = nobj ;
2007-07-03 11:10:37 +03:00
}
2009-01-11 00:08:18 +02:00
}
CDefObjInfoHandler : : ~ CDefObjInfoHandler ( )
{
for ( std : : map < int , std : : map < int , CGDefInfo * > > : : iterator i = gobjs . begin ( ) ; i ! = gobjs . end ( ) ; i + + )
for ( std : : map < int , CGDefInfo * > : : iterator j = i - > second . begin ( ) ; j ! = i - > second . end ( ) ; j + + )
delete j - > second ;
2008-06-08 03:58:29 +03:00
}