Tile Surface.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. #ifdef PRECOMPILEDHEADERS
  2. #include "TileEngine All.h"
  3. #else
  4. #include "worlddef.h"
  5. #include "worlddat.h"
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include "wcheck.h"
  9. #include "stdlib.h"
  10. #include "time.h"
  11. #include "video.h"
  12. #include "debug.h"
  13. #include "smooth.h"
  14. #include "worldman.h"
  15. #include "mousesystem.h"
  16. #include "sys globals.h"
  17. #include "tiledat.h"
  18. #include "Fileman.h"
  19. #endif
  20. TILE_IMAGERY *gTileSurfaceArray[ NUMBEROFTILETYPES ];
  21. UINT8 gbDefaultSurfaceUsed[ NUMBEROFTILETYPES ];
  22. UINT8 gbSameAsDefaultSurfaceUsed[ NUMBEROFTILETYPES ];
  23. TILE_IMAGERY *LoadTileSurface( char * cFilename )
  24. {
  25. // Add tile surface
  26. PTILE_IMAGERY pTileSurf = NULL;
  27. VOBJECT_DESC VObjectDesc;
  28. HVOBJECT hVObject;
  29. HIMAGE hImage;
  30. SGPFILENAME cStructureFilename;
  31. STR cEndOfName;
  32. STRUCTURE_FILE_REF * pStructureFileRef;
  33. BOOLEAN fOk;
  34. hImage = CreateImage( cFilename, IMAGE_ALLDATA );
  35. if (hImage == NULL)
  36. {
  37. // Report error
  38. SET_ERROR( "Could not load tile file: %s", cFilename );
  39. return( NULL );
  40. }
  41. VObjectDesc.fCreateFlags = VOBJECT_CREATE_FROMHIMAGE;
  42. VObjectDesc.hImage = hImage;
  43. hVObject = CreateVideoObject( &VObjectDesc );
  44. if ( hVObject == NULL )
  45. {
  46. // Report error
  47. SET_ERROR( "Could not load tile file: %s", cFilename );
  48. // Video Object will set error conition.]
  49. DestroyImage( hImage );
  50. return( NULL );
  51. }
  52. // Load structure data, if any.
  53. // Start by hacking the image filename into that for the structure data
  54. strcpy( cStructureFilename, cFilename );
  55. cEndOfName = strchr( cStructureFilename, '.' );
  56. if (cEndOfName != NULL)
  57. {
  58. cEndOfName++;
  59. *cEndOfName = '\0';
  60. }
  61. else
  62. {
  63. strcat( cStructureFilename, "." );
  64. }
  65. strcat( cStructureFilename, STRUCTURE_FILE_EXTENSION );
  66. if (FileExists( cStructureFilename ))
  67. {
  68. pStructureFileRef = LoadStructureFile( cStructureFilename );
  69. if (pStructureFileRef == NULL || hVObject->usNumberOfObjects != pStructureFileRef->usNumberOfStructures)
  70. {
  71. DestroyImage( hImage );
  72. DeleteVideoObject( hVObject );
  73. SET_ERROR( "Structure file error: %s", cStructureFilename );
  74. return( NULL );
  75. }
  76. DebugMsg( TOPIC_JA2, DBG_LEVEL_3, cStructureFilename );
  77. fOk = AddZStripInfoToVObject( hVObject, pStructureFileRef, FALSE, 0 );
  78. if (fOk == FALSE)
  79. {
  80. DestroyImage( hImage );
  81. DeleteVideoObject( hVObject );
  82. SET_ERROR( "ZStrip creation error: %s", cStructureFilename );
  83. return( NULL );
  84. }
  85. }
  86. else
  87. {
  88. pStructureFileRef = NULL;
  89. }
  90. pTileSurf = MemAlloc( sizeof( TILE_IMAGERY ) );
  91. // Set all values to zero
  92. memset( pTileSurf, 0, sizeof( TILE_IMAGERY ) );
  93. pTileSurf->vo = hVObject;
  94. pTileSurf->pStructureFileRef = pStructureFileRef;
  95. if (pStructureFileRef && pStructureFileRef->pAuxData != NULL)
  96. {
  97. pTileSurf->pAuxData = pStructureFileRef->pAuxData;
  98. pTileSurf->pTileLocData = pStructureFileRef->pTileLocData;
  99. }
  100. else if (hImage->uiAppDataSize == hVObject->usNumberOfObjects * sizeof( AuxObjectData ))
  101. {
  102. // Valid auxiliary data, so make a copy of it for TileSurf
  103. pTileSurf->pAuxData = MemAlloc( hImage->uiAppDataSize );
  104. if ( pTileSurf->pAuxData == NULL)
  105. {
  106. DestroyImage( hImage );
  107. DeleteVideoObject( hVObject );
  108. return( NULL );
  109. }
  110. memcpy( pTileSurf->pAuxData, hImage->pAppData, hImage->uiAppDataSize );
  111. }
  112. else
  113. {
  114. pTileSurf->pAuxData = NULL;
  115. }
  116. // the hImage is no longer needed
  117. DestroyImage( hImage );
  118. return( pTileSurf );
  119. }
  120. void DeleteTileSurface( PTILE_IMAGERY pTileSurf )
  121. {
  122. if ( pTileSurf->pStructureFileRef != NULL )
  123. {
  124. FreeStructureFile( pTileSurf->pStructureFileRef );
  125. }
  126. else
  127. {
  128. // If a structure file exists, it will free the auxdata.
  129. // Since there is no structure file in this instance, we
  130. // free it ourselves.
  131. if (pTileSurf->pAuxData != NULL)
  132. {
  133. MemFree( pTileSurf->pAuxData );
  134. }
  135. }
  136. DeleteVideoObject( pTileSurf->vo );
  137. MemFree( pTileSurf );
  138. }
  139. extern void GetRootName( INT8 *pDestStr, INT8 *pSrcStr );
  140. void SetRaisedObjectFlag( char *cFilename, TILE_IMAGERY *pTileSurf )
  141. {
  142. INT32 cnt = 0;
  143. CHAR8 cRootFile[ 128 ];
  144. UINT8 ubRaisedObjectFiles[][80] =
  145. {
  146. "bones",
  147. "bones2",
  148. "grass2",
  149. "grass3",
  150. "l_weed3",
  151. "litter",
  152. "miniweed",
  153. "sblast",
  154. "sweeds",
  155. "twigs",
  156. "wing",
  157. "1"
  158. };
  159. // Loop through array of RAISED objecttype imagery and
  160. // set global value...
  161. if ( ( pTileSurf->fType >= DEBRISWOOD && pTileSurf->fType <= DEBRISWEEDS ) || pTileSurf->fType == DEBRIS2MISC || pTileSurf->fType == ANOTHERDEBRIS )
  162. {
  163. GetRootName( cRootFile, cFilename );
  164. while( ubRaisedObjectFiles[ cnt ][ 0 ] != '1' )
  165. {
  166. if ( stricmp( ubRaisedObjectFiles[ cnt ], cRootFile ) == 0 )
  167. {
  168. pTileSurf->bRaisedObjectType = TRUE;
  169. }
  170. cnt++;
  171. }
  172. }
  173. }