home *** CD-ROM | disk | FTP | other *** search
/ Game Killer / Game_Killer.bin / 519.WOLFMAP.H < prev    next >
C/C++ Source or Header  |  1992-10-20  |  23KB  |  508 lines

  1. /*
  2.  
  3. ---------------------------------------------------------------------------
  4. | WolfMap global definitions   |    (c) Oct 1992 Sysma Automatisering     |
  5. ---------------------------------------------------------------------------
  6. | Version 1.0         06/10/92 | First implementation.                    |
  7. |                              | J.P. Dijkstra, M.Sc.                     |
  8. | Version 1.01        07/10/92 | Added automatic renaming of the game     |
  9. |                              | maps file during format conversions.     |
  10. |                              | J.P. Dijkstra, M.Sc.                     |
  11. | Version 1.05        11/10/92 | Removed all explicit references to far   |
  12. |                              | pointers and changed the memory model to |
  13. |                              | large.                                   |
  14. |                              | J.P. Dijkstra, M.Sc.                     |
  15. | Version 1.5         12/10/92 | Added functions which enable copying and |
  16. |                              | storing modified GameMaps inside a       |
  17. |                              | MapGlobalRec instance.                   |
  18. |                              | J.P. Dijkstra, M.Sc.                     |
  19. | Version 1.6         20/10/92 | Removed the list of map headers from the |
  20. |                              | map data, since it was only used by one  |
  21. |                              | command and saves about 2K of memory.    |
  22. |                              | J.P. Dijkstra, M.Sc.                     |
  23. ---------------------------------------------------------------------------
  24. | This header file contains definitions shared among the various source   |
  25. | files used to create WolfMap.Exe                                        |
  26. ---------------------------------------------------------------------------
  27.  
  28. */
  29.  
  30. #include "stdio.h"
  31.  
  32. /*
  33.  
  34. ---------------------------------------------------------------------------
  35. | Global data structures and constants                                    |
  36. ---------------------------------------------------------------------------
  37. | MapHeaderRec                | Structure to hold the essential level     |
  38. |                             | information to enable reading and         |
  39. |                             | decompression.                            |
  40. |   StartMaze                 | Start of compressed maze data.            |
  41. |   StartObjects              | Start of compressed objects data.         |
  42. |   StartUnknown              | Start of a compressed third block. In the |
  43. |                             | current Wolf-3D versions this block       |
  44. |                             | appears to contain only zeros.            |
  45. |   SizeMaze                  | The number of data bytes of the maze data |
  46. |                             | in the file.                              |
  47. |   SizeObjects               | Idem., but for the objects data.          |
  48. |   SizeUnknown               | Idem., but for the unknown data.          |
  49. |   Title                     | Array to hold a zero terminated ASCII     |
  50. |                             | string to give the level a name.          |
  51. ---------------------------------------------------------------------------
  52. | LegendRec                   | Structure holding one legend description  |
  53. |                             | and representation.                       |
  54. |   Representation            | Holds the representation of the legend.   |
  55. |   Name                      | Holds the name of the legend.             |
  56. ---------------------------------------------------------------------------
  57. | MapGlobalRec                | Class holding all essential global data   |
  58. |                             | of the maphead and gamemaps files.        |
  59. |   ErrorCode                 | Holds the last error code.                |
  60. |   CurrentVersion            | Holds the version of the opened set of    |
  61. |                             | map files.                                |
  62. |   MapHeadName               | Holds the name of the active MapHead      |
  63. |                             | file.                                     |
  64. |   GameMapsName              | Holds the name of the active GameMaps     |
  65. |                             | file.                                     |
  66. |   NrMaps                    | The number of maps in the file.           |
  67. |   NrMapsStored              | The number of maps in the store.          |
  68. |   MagicValue                | Value preceding a word count in the       |
  69. |                             | second level (de)compression.             |
  70. |   MapsHandle                | Holds the file handle to the opened maps  |
  71. |                             | file.                                     |
  72. |   WorkMapsHandle            | Holds the file handle to the created      |
  73. |                             | work file to write processed maps into.   |
  74. |   Offsets                   | Pointer to a memory block holding all the |
  75. |                             | offsets, stored in the MapHead file.      |
  76. |   Headers                   | Pointer to a memory block holding the map |
  77. |                             | headers of all maps, accessible by the    |
  78. |                             | HeaderOffsets.                            |
  79. |   MapStore                  | Pointer to an array of pointers to        |
  80. |                             | GameMapRec classes, making up the map     |
  81. |                             | store.                                    |
  82. ---------------------------------------------------------------------------
  83. | GraphRec                    | Class implementing the graphical map      |
  84. |                             | viewer / editor.                          |
  85. |   Maze                      | Pointer to an array of LegendRec pointers |
  86. |                             | making up the maze legend list.           |
  87. |   Objects                   | Pointer to an array of LegendRec          |
  88. |                             | pointers making up the objects legend.    |
  89. |   MazeChoise                | The value selected from the maze legend.  |
  90. |   ObjectChoise              | The value selected from the objects       |
  91. |                             | legend.                                   |
  92. |   MazeFirst                 | The first value of the maze legend which  |
  93. |                             | is visible on the display.                |
  94. |   ObjectsFirst              | The first value of the objects legend     |
  95. |                             | which is visible on the display.          |
  96. |   Legend                    | Determines which legend list is currently |
  97. |                             | visible on the display.                   |
  98. |   ChoiseLegend              | Determines from which legend the selected |
  99. |                             | choise is on the display.                 |
  100. |   ShowFloors                | Holds whether or not the floor values     |
  101. |                             | should be made visible.                   |
  102. |   ShowObjects               | Holds whether or not the object values    |
  103. |                             | should be made visible.                   |
  104. |   SizeX                     | Holds the horizontal size of the map      |
  105. |                             | currently in the editor.                  |
  106. |   SizeY                     | Holds the vertical size of the map        |
  107. |                             | currently in the editor.                  |
  108. |   StartTextY                | Holds a calculated internal value. Used   |
  109. |                             | to speedup certain draw actions.          |
  110. ---------------------------------------------------------------------------
  111. | GameMapRec                  | Class holding all data of one single map. |
  112. |   ErrorCode                 | Holds the last error code.                |
  113. |   CurrentFormat             | Holds the code representing the current   |
  114. |                             | compression format of the data blocks.    |
  115. |   Maze                      | Data block holding the maze data.         |
  116. |   Objects                   | Data block holding the objects data.      |
  117. |   Unknown                   | Data block holding data for a presently   |
  118. |                             | unknown function.                         |
  119. |   Header                    | Data block holding the map header.        |
  120. |   ActorCount                | Holds the number of actors of each actor  |
  121. |                             | type, except special actors.              |
  122. |   HugeActorCount            | Holds the number of special actors.       |
  123. |   SecretDoorCount           | Holds the number of secret doors.         |
  124. |   DoorCount                 | Holds the number of normal doors.         |
  125. |   LockedDoorCount           | Holds the number of locked doors.         |
  126. |   ElevatorCount             | Holds the number of elevators.            |
  127. |   TreasureCount             | Holds the number of treasures, including  |
  128. |                             | the bonus life sphere.                    |
  129. ---------------------------------------------------------------------------
  130. | MapDataRec                  | Class holding one single data block.      |
  131. |   BlockData                 | Pointer to a data block holding the data. |
  132. |   BlockSize                 | Holds the size of the block the BlockData |
  133. |                             | field is pointing to.                     |
  134. ---------------------------------------------------------------------------
  135.  
  136. */
  137.  
  138. //
  139. //   Various general purpose constants.
  140. //
  141. const int cFalse        = 0;
  142. const int cTrue         = 1;
  143. const int cShowFloors   = cTrue;
  144. const int cHideFloors   = cFalse;
  145. const int cShowObjects  = cTrue;
  146. const int cHideObjects  = cFalse;
  147. const int cMazeLegend   = 1;
  148. const int cObjectLegend = 2;
  149.  
  150. const unsigned cUndetermined = 0;
  151. const unsigned cShareware    = 1;
  152. const unsigned cComplete     = 2;
  153. const unsigned cLocal        = 3;
  154.  
  155. const unsigned cDecompressed = 1;
  156. const unsigned cFormat10     = 2;
  157. const unsigned cFormat11     = 3;
  158.  
  159. const unsigned cStdout       = 0;
  160. const unsigned cSeparate     = 1;
  161. const unsigned cSingle       = 2;
  162.  
  163. const unsigned cOneColumn    = 0;
  164. const unsigned cTwoColumns   = 1;
  165. const unsigned cThreeColumns = 2;
  166.  
  167. const unsigned cMapCount         = 100;
  168. const unsigned cMagicValue       = 0xABCD;
  169. const unsigned cMaxMazeLegends   = 256;
  170. const unsigned cMaxObjectLegends = 512;
  171. const unsigned cMaxDisplayLegend = 25;
  172.  
  173. //
  174. //   Error codes, generated by various functions.
  175. //
  176. const int errOk              = 0;
  177. const int errNoMemory        = 1;
  178. const int errMemoryCorrupted = 2;
  179. const int errSeek            = 3;
  180. const int errRead            = 4;
  181. const int errWrite           = 5;
  182. const int errLeaderTooLarge  = 6;
  183. const int errNoSuchFile      = 7;
  184. const int errNoMapHeadFile   = 8;
  185. const int errNoSuchVersion   = 9;
  186. const int errDelete          = 10;
  187. const int errBackup          = 11;
  188. const int errCopy            = 12;
  189. const int errCreate          = 13;
  190. const int errNotOpen         = 14;
  191. const int errLocalIsTarget   = 15;
  192. const int errMapNotPresent   = 16;
  193. const int errNotAllocated    = 17;
  194. const int errCreateOutput    = 18;
  195. const int errNoDefFile       = 19;
  196. const int errIllegalLegend   = 20;
  197. const int errIllegalMaze     = 21;
  198. const int errInitializeGraph = 22;
  199.  
  200. //
  201. //   Values of various maze components.
  202. //
  203. const int mUndetermined = 0;     //   Unknown or illegal maze value.
  204. const int mNothing      = 1;     //   Nothing, no maze value present.
  205. const int mWall         = 2;     //   Wall.
  206. const int mFloor        = 3;     //   Floor.
  207. const int mhDoor        = 4;     //   Horizontal normal door.
  208. const int mvDoor        = 5;     //   Vertical normal door.
  209. const int mlbhDoor      = 6;     //   Horizontal locked door, blue key.
  210. const int mlbvDoor      = 7;     //   Vertical locked door, blue key.
  211. const int mlyhDoor      = 8;     //   Horizontal locked door, yellow key.
  212. const int mlyvDoor      = 9;     //   Vertical locked door, yellow key.
  213. const int mehDoor       = 10;    //   Horizontal elevator door.
  214. const int mevDoor       = 11;    //   Vertical elevator door.
  215. const int mEntrance     = 12;    //   Door marking entrance to level.
  216. const int mElevator     = 13;    //   Wall of elevator.
  217.  
  218. //
  219. //   Values of various maze objects.
  220. //
  221. const int oUndetermined = 0;     //   Unknown or illegal object.
  222. const int oNothing      = 1;     //   Nothing, no object value present.
  223.  
  224. const int oGuard1       = 11;    //   Stationary guard, level 1.
  225. const int oGuard3       = 12;    //   Stationary guard, level 3.
  226. const int oGuard4       = 13;    //   Stationary guard, level 4.
  227. const int oOfficer1     = 14;    //   Stationary officer, level 1.
  228. const int oOfficer3     = 15;    //   Stationary officer, level 3.
  229. const int oOfficer4     = 16;    //   Stationary officer, level 4.
  230. const int oSS1          = 17;    //   Stationary SS officer, level 1.
  231. const int oSS3          = 18;    //   Stationary SS officer, level 3.
  232. const int oSS4          = 19;    //   Stationary SS officer, level 4.
  233. const int oUndead1      = 20;    //   Stationary undead man, level 1.
  234. const int oUndead3      = 21;    //   Stationary undead man, level 3.
  235. const int oUndead4      = 22;    //   Stationary undead man, level 4.
  236. const int oDog1         = 23;    //   Moving dog, level 1.
  237. const int oDog3         = 24;    //   Moving dog, level 3.
  238. const int oDog4         = 25;    //   Moving dog, level 4.
  239. const int omGuard1      = 26;    //   Moving guard, level 1.
  240. const int omGuard3      = 27;    //   Moving guard, level 3.
  241. const int omGuard4      = 28;    //   Moving guard, level 4.
  242. const int omOfficer1    = 29;    //   Moving officer, level 1.
  243. const int omOfficer3    = 30;    //   Moving officer, level 3.
  244. const int omOfficer4    = 31;    //   Moving officer, level 4.
  245. const int omSS1         = 32;    //   Moving SS officer, level 1.
  246. const int omSS3         = 33;    //   Moving SS officer, level 3.
  247. const int omSS4         = 34;    //   Moving SS officer, level 4.
  248. const int omUndead1     = 35;    //   Moving undead man, level 1.
  249. const int omUndead3     = 36;    //   Moving undead man, level 3.
  250. const int omUndead4     = 37;    //   Moving undead man, level 4.
  251. const int oPacman       = 38;    //   Moving pacman ghosts.
  252. const int oHans         = 39;    //   Hans, the huge guard from episode 1.
  253. const int oGretel       = 40;    //   Gretel, the huge guard from episode 5.
  254. const int oSchabbs      = 41;    //   Dr. Schabbs, from episode 2.
  255. const int oGiftmacher   = 42;    //   Dr. Otto Giftmacher, from episode 4.
  256. const int oFettgesicht  = 43;    //   General Fettgesicht, from episode 6.
  257. const int oHitler       = 44;    //   Adolf Hitler himself, from episode 3.
  258. const int oGhostHitler  = 45;    //   Ghost of Hitler, also from episode 3.
  259. const int oDeadGuard    = 46;    //   Dead guard, any level.
  260. const int oFirstActor   = oGuard1;
  261. const int oLastActor    = omUndead4;
  262.  
  263. const int oSecretDoor   = 51;     //   Secret door, placed in a wall.
  264. const int oEndgame      = 52;     //   Endgame trigger, jumping Blazkovic.
  265. const int oTurningPoint = 53;     //   Turning point for moving actors.
  266. const int oTreasure     = 54;     //   Treasure, including sphere.
  267. const int oMachineGun   = 55;     //   Machine gun.
  268. const int oGattlingGun  = 56;     //   Gattling (or big) gun.
  269. const int oFirstAid     = 57;     //   First aid kid.
  270. const int oFood         = 58;     //   Tray with food, or dog food.
  271. const int oAmmunition   = 59;     //   Ammunition pack.
  272. const int oBlueKey      = 60;     //   Blue key, for locked doors.
  273. const int oYellowKey    = 61;     //   Yellow key, for locked doors.
  274. const int olStart       = 62;     //   Starting position, facing left.
  275. const int orStart       = 63;     //   Starting position, facing right.
  276. const int ouStart       = 64;     //   Starting position, facing up.
  277. const int odStart       = 65;     //   Starting position, facing down.
  278. const int oObstacle     = 66;     //   Any object blocking the way.
  279.  
  280. //
  281. //   Constants defining the different areas in the edit display.
  282. //
  283. const int aNone         = 0;
  284. const int aMap          = 1;
  285. const int aLegend       = 2;
  286. const int aMapButton    = 3;
  287. const int aObjectButton = 4;
  288. const int aUpButton     = 5;
  289. const int aDownButton   = 6;
  290.  
  291. //
  292. //   Commands with which the ModifyMap can terminate.
  293. //
  294. const int cMap0        = 0;
  295. const int cMap1        = 1;
  296. const int cMap2        = 2;
  297. const int cMap3        = 3;
  298. const int cMap4        = 4;
  299. const int cMap5        = 5;
  300. const int cMap6        = 6;
  301. const int cMap7        = 7;
  302. const int cMap8        = 8;
  303. const int cMap9        = 9;
  304. const int cNextMap     = 10;
  305. const int cPrevMap     = 11;
  306. const int cDiscard     = 12;
  307. const int cExit        = 13;
  308. const int cNone        = 14;
  309. const int cNextEpisode = 15;
  310. const int cPrevEpisode = 16;
  311. const int cEscape      = 17;
  312. const int cBreak       = 18;
  313. const int cStore       = 19;
  314.  
  315. extern char *cVersion;
  316. extern char *cCopyright;
  317.  
  318. struct MapHeaderRec
  319. {
  320.   long     StartMaze;
  321.   long     StartObjects;
  322.   long     StartUnknown;
  323.   unsigned SizeMaze;
  324.   unsigned SizeObjects;
  325.   unsigned SizeUnknown;
  326.   unsigned SizeX;
  327.   unsigned SizeY;
  328.   char     Title [16];
  329. };
  330.  
  331. struct LegendRec
  332. {
  333.   char Representation [5];
  334.   char Name [25];
  335. };
  336.  
  337. class MapDataRec
  338. {
  339. private:
  340.   unsigned *BlockData;
  341.   unsigned  BlockSize;
  342.  
  343. public:
  344.   MapDataRec ();
  345.   MapDataRec (unsigned Size);
  346.   ~MapDataRec ();
  347.  
  348.   unsigned *Data ()     { return BlockData; }
  349.   unsigned  DataSize () { return BlockSize; }
  350.   int       Allocate (unsigned Size);
  351.   int       Resize (unsigned NewSize);
  352.   int       Free ();
  353.   int       Copy (MapDataRec *Source);
  354.   int       CompressFormat10 (unsigned MagicValue);
  355.   int       CompressFormat11 ();
  356.   int       DecompressFormat10 (unsigned MagicValue);
  357.   int       DecompressFormat11 ();
  358. };
  359.  
  360. class GameMapRec
  361. {
  362. private:
  363.   int          ErrorCode;
  364.   unsigned     CurrentFormat;
  365.   MapDataRec   Maze;
  366.   MapDataRec   Objects;
  367.   MapDataRec   Unknown;
  368.   MapHeaderRec Header;
  369.   unsigned     ActorCount [ oLastActor - oFirstActor + 1 ];
  370.   unsigned     HugeActorCount;
  371.   unsigned     SecretDoorCount;
  372.   unsigned     DoorCount;
  373.   unsigned     LockedDoorCount;
  374.   unsigned     ElevatorCount;
  375.   unsigned     TreasureCount;
  376.  
  377. public:
  378.   GameMapRec ();
  379.   ~GameMapRec ();
  380.  
  381.   int       LastError ()            { return ErrorCode; }
  382.   int       Format ()               { return CurrentFormat; }
  383.   int       Actors (unsigned Actor) { return ActorCount [Actor - oFirstActor]; }
  384.   int       HugeActors ()           { return HugeActorCount; }
  385.   int       Doors ()                { return DoorCount; }
  386.   int       LockedDoors ()          { return LockedDoorCount; }
  387.   int       SecretDoors ()          { return SecretDoorCount; }
  388.   int       Elevators ()            { return ElevatorCount; }
  389.   int       Treasures ()            { return TreasureCount; }
  390.   char     *Title ()                { return Header.Title; }
  391.   unsigned  MazeSizeX ()            { return Header.SizeX; }
  392.   unsigned  MazeSizeY ()            { return Header.SizeY; }
  393.   unsigned *MazeBlock ()            { return Maze.Data (); }
  394.   unsigned *ObjectsBlock ()         { return Objects.Data (); }
  395.   unsigned *UnknownBlock ()         { return Unknown.Data (); }
  396.  
  397.   int       SetError (int Error);
  398.   unsigned  SetFormat (unsigned NewFormat);
  399.   int       DetermineFormat ();
  400.   int       CompressFormat10 (unsigned MagicValue);
  401.   int       CompressFormat11 ();
  402.   int       DecompressFormat10 (unsigned MagicValue);
  403.   int       DecompressFormat11 ();
  404.   int       Load (int Handle, long HeaderPos);
  405.   int       Save (int Handle, long *HeaderPos);
  406.   int       Copy (GameMapRec *Source);
  407.   int       Close ();
  408.   int       Print (FILE *Stream, unsigned MapNr);
  409.   int       PrintStatistics (FILE *Stream, unsigned MapNr);
  410.   int       Statistics ();
  411.   int       Clear ();
  412.   int       Create (unsigned SizeX, unsigned SizeY, char *Title);
  413. };
  414.  
  415. class GraphRec
  416. {
  417. private:
  418.   LegendRec **Maze;
  419.   LegendRec **Objects;
  420.   unsigned    MazeChoise;
  421.   unsigned    ObjectChoise;
  422.   unsigned    MazeFirst;
  423.   unsigned    ObjectsFirst;
  424.   int         Legend;
  425.   int         ChoiseLegend;
  426.   int         ShowFloors;
  427.   int         ShowObjects;
  428.   unsigned    SizeX;
  429.   unsigned    SizeY;
  430.   int         StartTextY;
  431.  
  432.   void DisplayCell (int x, int y, unsigned MazeValue, unsigned ObjectValue);
  433.   void DisplayMap (GameMapRec *Map);
  434.   void DisplayMazeLegend ();
  435.   void DisplayObjectLegend ();
  436.   int  DetermineArea (int x, int y, int *ResultX, int *ResultY);
  437.  
  438. public:
  439.   GraphRec ();
  440.   ~GraphRec ();
  441.  
  442.   int Open ();
  443.   int Close ();
  444.   int Display (GameMapRec *Map, int EpisodeNr, int MapNr);
  445.   int Modify (GameMapRec *Map, int *Changed, int *Command);
  446. };
  447.  
  448. class MapGlobalRec
  449. {
  450. private:
  451.   int          ErrorCode;
  452.   unsigned     CurrentVersion;
  453.   char         MapHeadName  [13];
  454.   char         GameMapsName [13];
  455.   unsigned     NrMaps;
  456.   unsigned     NrMapsStored;
  457.   unsigned     MagicValue;
  458.   int          MapsHandle;
  459.   int          WorkMapsHandle;
  460.   long        *Offsets;
  461.   GameMapRec **MapStore;
  462.  
  463. public:
  464.   MapGlobalRec ();
  465.   ~MapGlobalRec ();
  466.   int      LastError      () { return ErrorCode; }
  467.   unsigned MapCount       () { return NrMaps; }
  468.   unsigned OpenedVersion  () { return CurrentVersion; }
  469.   unsigned MapsStored     () { return NrMapsStored; }
  470.   int      SetError       (int Error);
  471.   int      MapPossible    (unsigned MapNr);
  472.   int      MapAvailable   (unsigned MapNr);
  473.   int      Open           (unsigned Version);
  474.   int      Create         (unsigned Version);
  475.   int      OpenWork       ();
  476.   int      ConvertName    (unsigned NewFormat);
  477.   int      Close          ();
  478.   int      Load           (GameMapRec *Map, unsigned MapNr);
  479.   int      Save           (GameMapRec *Map, unsigned MapNr);
  480.   int      Compress       (GameMapRec *Map, unsigned NewFormat);
  481.   int      Add            (GameMapRec *Map, unsigned MapNr);
  482.   int      Copy           (GameMapRec *Map, unsigned MapNr);
  483.   int      InStore        (unsigned MapNr);
  484.   int      Delete         (unsigned MapNr);
  485.   int      DisplayHeaders (FILE *Stream, unsigned Columns);
  486. };
  487.  
  488. const int cOk             = 0;
  489. const int cNoCommands     = 1;
  490. const int cIllegalCommand = 2;
  491. const int cError          = 3;
  492.  
  493. /*
  494.  
  495. ---------------------------------------------------------------------------
  496. | Global functions to support the implementation of the application.      |
  497. ---------------------------------------------------------------------------
  498. | Function name               | Description.                              |
  499. ---------------------------------------------------------------------------
  500.  
  501. */
  502.  
  503. int      ReadData (int Handle, long Pos, void *Location, unsigned Size);
  504. int      WriteData (int Handle, long *Pos, void *Location, unsigned Size);
  505. unsigned DetermineMaze (unsigned Value);
  506. unsigned DetermineObject (unsigned Value);
  507. int      PrintLegend (FILE *Stream);
  508.