home *** CD-ROM | disk | FTP | other *** search
/ Game Killer / Game_Killer.bin / 515.WSUP.C < prev    next >
C/C++ Source or Header  |  1992-10-19  |  11KB  |  279 lines

  1. /*
  2.  
  3. ---------------------------------------------------------------------------
  4. | WSup module                  |    (c) Oct 1992 Sysma Automatisering     |
  5. ---------------------------------------------------------------------------
  6. | Version 1.0         06/10/92 | First implementation.                    |
  7. |                              | J.P. Dijkstra, M.Sc.                     |
  8. | Version 1.05        11/10/92 | Removed all explicit references to far   |
  9. |                              | pointers and changed the memory model to |
  10. |                              | large.                                   |
  11. |                              | J.P. Dijkstra, M.Sc.                     |
  12. ---------------------------------------------------------------------------
  13. | This module contains support functions, used in the member functions of |
  14. | the classes, containing the actual functionality of this program.       |
  15. ---------------------------------------------------------------------------
  16.  
  17. */
  18.  
  19. #include "wolfmap.h"
  20. #include "dos.h"
  21. #include "io.h"
  22. #include "fcntl.h"
  23.  
  24. /*
  25.  
  26. ---------------------------------------------------------------------------
  27. | Public functions to implement the desired API.                          |
  28. ---------------------------------------------------------------------------
  29. | ReadData                    | Reads a block of data from the given      |
  30. |                             | position into the specified memory block. |
  31. | WriteData                   | Writes a block of data from the specified |
  32. |                             | memory block to the target file and       |
  33. |                             | returns the start position of that block  |
  34. |                             | in the target file.                       |
  35. | DetermineMaze               | Takes a word of maze data and determines  |
  36. |                             | what class of maze data it belongs to.    |
  37. | DetermineObject             | Takes a word of object data and tries to  |
  38. |                             | determine what class of object data it    |
  39. |                             | belongs to.                               |
  40. | PrintLegend                 | Prints a legend of symbols used in the    |
  41. |                             | printout of a map.                        |
  42. ---------------------------------------------------------------------------
  43.  
  44. */
  45.  
  46. int ReadData (int Handle, long Pos, void *Location, unsigned Size)
  47. {
  48.   //
  49.   //   Try positioning the file pointer at the given location.
  50.   //
  51.   if ( lseek (Handle, Pos, SEEK_SET) != Pos )
  52.   {
  53.     return errSeek;
  54.   }
  55.  
  56.   //
  57.   //   The seek was successful. Now try reading in the requested number of
  58.   //   bytes from that position into the given buffer.
  59.   //
  60.   unsigned ReadSize = 0;
  61.   if ( _dos_read (Handle, Location, Size, &ReadSize) == 0 && ReadSize == Size )
  62.   {
  63.     //
  64.     //   The reading was successful, so return Ok.
  65.     //
  66.     return errOk;
  67.   }
  68.  
  69.   //
  70.   //   The read function failed, so return the error code.
  71.   //
  72.   return errRead;
  73. }
  74.  
  75. int WriteData (int Handle, long *Pos, void *Location, unsigned Size)
  76. {
  77.   //
  78.   //   Try positioning the file pointer at the given location.
  79.   //
  80.   *Pos = lseek (Handle, 0, SEEK_END);
  81.   if (*Pos == -1)
  82.   {
  83.     *Pos = 0;
  84.     return errSeek;
  85.   }
  86.  
  87.   //
  88.   //   The seek was successful. Now try reading in the requested number of
  89.   //   bytes from that position into the given buffer.
  90.   //
  91.   unsigned WriteSize = 0;
  92.   if ( _dos_write (Handle, Location, Size, &WriteSize) == 0 && WriteSize == Size )
  93.   {
  94.     //
  95.     //   The reading was successful, so return Ok.
  96.     //
  97.     return errOk;
  98.   }
  99.  
  100.   //
  101.   //   The write function failed, so set the position of the block written
  102.   //   to 0 and return the error code.
  103.   //
  104.   *Pos = 0;
  105.   return errWrite;
  106. }
  107.  
  108. unsigned DetermineMaze (unsigned Value)
  109. {
  110.   if (Value >= 0x01 && Value <= 0x14) return mWall;
  111.   if (Value >= 0x17 && Value <= 0x31) return mWall;
  112.   if (Value >= 0x6A && Value <= 0x8F) return mFloor;
  113.  
  114.   switch (Value)
  115.   {
  116.     case 0x00: return mNothing;
  117.     case 0x0D: return mEntrance;
  118.     case 0x15: return mElevator;
  119.     case 0x16: return mElevator;
  120.     case 0x5A: return mvDoor;
  121.     case 0x5B: return mhDoor;
  122.     case 0x5C: return mlyvDoor;
  123.     case 0x5D: return mlyhDoor;
  124.     case 0x5E: return mlbvDoor;
  125.     case 0x5F: return mlbhDoor;
  126.     case 0x64: return mevDoor;
  127.     case 0x65: return mehDoor;
  128.     default:   return mUndetermined;
  129.   }
  130. }
  131.  
  132. unsigned DetermineObject (unsigned Value)
  133. {
  134.   //
  135.   //   Check for stationary actors.
  136.   //
  137.   if (Value >= 0x6C && Value <= 0x6F) return oGuard1;
  138.   if (Value >= 0x90 && Value <= 0x93) return oGuard3;
  139.   if (Value >= 0xB4 && Value <= 0xB7) return oGuard4;
  140.   if (Value >= 0x74 && Value <= 0x77) return oOfficer1;
  141.   if (Value >= 0x98 && Value <= 0x9B) return oOfficer3;
  142.   if (Value >= 0xBC && Value <= 0xBF) return oOfficer4;
  143.   if (Value >= 0x7E && Value <= 0x81) return oSS1;
  144.   if (Value >= 0xA2 && Value <= 0xA5) return oSS3;
  145.   if (Value >= 0xC6 && Value <= 0xC9) return oSS4;
  146.   if (Value >= 0xD8 && Value <= 0xDB) return oUndead1;
  147.   if (Value >= 0xEA && Value <= 0xED) return oUndead3;
  148.   if (Value >= 0xFC && Value <= 0xFF) return oUndead4;
  149.  
  150.   //
  151.   //   Check for moving actors.
  152.   //
  153.   if (Value >= 0x8A && Value <= 0x8D) return oDog1;
  154.   if (Value >= 0xAE && Value <= 0xB1) return oDog3;
  155.   if (Value >= 0xD2 && Value <= 0xD5) return oDog4;
  156.   if (Value >= 0x70 && Value <= 0x73) return omGuard1;
  157.   if (Value >= 0x94 && Value <= 0x97) return omGuard3;
  158.   if (Value >= 0xB8 && Value <= 0xBB) return omGuard4;
  159.   if (Value >= 0x78 && Value <= 0x7B) return omOfficer1;
  160.   if (Value >= 0x9C && Value <= 0x9F) return omOfficer3;
  161.   if (Value >= 0xC0 && Value <= 0xC3) return omOfficer4;
  162.   if (Value >= 0x82 && Value <= 0x85) return omSS1;
  163.   if (Value >= 0xA6 && Value <= 0xA9) return omSS3;
  164.   if (Value >= 0xCA && Value <= 0xCD) return omSS4;
  165.   if (Value >= 0xDC && Value <= 0xDF) return omUndead1;
  166.   if (Value >= 0xEE && Value <= 0xF1) return omUndead3;
  167.   if (Value >= 0x100 && Value <= 0x103) return omUndead4;
  168.   if (Value >= 0xE0 && Value <= 0xE3) return oPacman;
  169.  
  170.   //
  171.   //   Check for other objects.
  172.   //
  173.   if (Value >= 0x18 && Value <= 0x1A) return oObstacle;
  174.   if (Value >= 0x1E && Value <= 0x1F) return oObstacle;
  175.   if (Value >= 0x21 && Value <= 0x24) return oObstacle;
  176.   if (Value >= 0x26 && Value <= 0x29) return oObstacle;
  177.   if (Value >= 0x2D && Value <= 0x2E) return oObstacle;
  178.   if (Value >= 0x3A && Value <= 0x3C) return oObstacle;
  179.   if (Value >= 0x5A && Value <= 0x61) return oTurningPoint;
  180.   if (Value >= 0x34 && Value <= 0x38) return oTreasure;
  181.  
  182.   switch (Value)
  183.   {
  184.     case 0x00: return oNothing;
  185.     case 0x1C: return oObstacle;
  186.     case 0x3E: return oObstacle;
  187.     case 0x62: return oSecretDoor;
  188.     case 0x63: return oEndgame;
  189.     case 0x13: return ouStart;
  190.     case 0x14: return orStart;
  191.     case 0x15: return odStart;
  192.     case 0x16: return olStart;
  193.     case 0x7C: return oDeadGuard;
  194.     case 0x2B: return oYellowKey;
  195.     case 0x2C: return oBlueKey;
  196.     case 0x32: return oMachineGun;
  197.     case 0x33: return oGattlingGun;
  198.     case 0x30: return oFirstAid;
  199.     case 0x2F: return oFood;
  200.     case 0x1D: return oFood;
  201.     case 0x31: return oAmmunition;
  202.     case 0xD6: return oHans;
  203.     case 0xC4: return oSchabbs;
  204.     case 0xA0: return oGhostHitler;
  205.     case 0xB2: return oHitler;
  206.     case 0xD7: return oGiftmacher;
  207.     case 0xC5: return oGretel;
  208.     case 0xB3: return oFettgesicht;
  209.     default:   return oUndetermined;
  210.   }
  211. }
  212.  
  213. int PrintLegend (FILE *Stream)
  214. {
  215.   //
  216.   //   Write a banner to the output stream.
  217.   //
  218.   fprintf (Stream, "WOLFENSTEIN 3D   -   Legend of the maps\n\n\n\n");
  219.  
  220.   //
  221.   //   Write the legend for maze related objects.
  222.   //
  223.   fprintf (Stream, "Various maze related objects.\n\n");
  224.   fprintf (Stream, "'%c%c' , '%c%c'   Start position, facing left or right.\n", '<', '-', '-', '>');
  225.   fprintf (Stream, "'%c%c' , '%c%c'   Start position, facing up or down.\n", 0x18, 0x18, 0x19, 0x19);
  226.   fprintf (Stream, "'%c%c' , '%c%c'   Normal door.\n", 0xB3, ' ', 0xC4, 0xC4);
  227.   fprintf (Stream, "'%c%c' , '%c%c'   Locked door, blue or yellow key.\n", 0xBA, ' ', 0xCD, 0xCD);
  228.   fprintf (Stream, "'%c%c'          Secret door.\n", '[', ']');
  229.   fprintf (Stream, "'%c%c'          Any type of wall.\n", 0xB2, 0xB2);
  230.   fprintf (Stream, "'%c%c'          Any type of floor.\n", ' ', ' ');
  231.   fprintf (Stream, "'%c%c'          Entrance to level.\n", 0xAE, 0xAF);
  232.   fprintf (Stream, "'%c%c'          Elevator.\n", 0xDB, 0xDB);
  233.   fprintf (Stream, "'%c%c'          Trigger of the endgame.\n", '%', '%');
  234.   fprintf (Stream, "'%c%c'          Obstacle.\n", 'o', ' ');
  235.  
  236.   //
  237.   //   Write the legend of the takeables.
  238.   //
  239.   fprintf (Stream, "\nVarious objects which can be taken.\n\n");
  240.   fprintf (Stream, "'%c%c'          Treasure, including bonus life sphere.\n", 't', ' ');
  241.   fprintf (Stream, "'%c%c'          First aid kid.\n", '+', ' ');
  242.   fprintf (Stream, "'%c%c'          Food tray or dog food basket.\n", 'f', ' ');
  243.   fprintf (Stream, "'%c%c'          Free ammunition.\n", 'a', ' ');
  244.   fprintf (Stream, "'%c%c'          Free machine gun.\n", 'm', 'g');
  245.   fprintf (Stream, "'%c%c'          Free gattling (or big) gun.\n", 'g', 'g');
  246.   fprintf (Stream, "'%c%c'          Blue key to unlock doors.\n", 'b', 'k');
  247.   fprintf (Stream, "'%c%c'          Yellow key to unlock doors.\n", 'y', 'k');
  248.  
  249.   //
  250.   //   Write the legend of the actors.
  251.   //
  252.   fprintf (Stream, "\nVarious actors inside a maze.\n\n");
  253.   fprintf (Stream, "'%c%c'          Dead guard.\n", 'D', 'G');
  254.   fprintf (Stream, "'%c%c'          Hans, the huge guard from episode 1.\n", 'H', 'A');
  255.   fprintf (Stream, "'%c%c'          Doctor Schabbs, from episode 2.\n", 'D', 'S');
  256.   fprintf (Stream, "'%c%c'          Ghost of Hitler, from episode 3.\n", 'G', 'H');
  257.   fprintf (Stream, "'%c%c'          Hitler, from episode 3.\n", 'A', 'H');
  258.   fprintf (Stream, "'%c%c'          Otto Giftmacher, from episode 4.\n", 'O', 'G');
  259.   fprintf (Stream, "'%c%c'          Gretel, the huge guard from episode 5, and sister of Hans.\n", 'G', 'R');
  260.   fprintf (Stream, "'%c%c'          General Fettgesicht, from episode 6.\n", 'G', 'F');
  261.   fprintf (Stream, "'%c%c'          Pacman ghost.\n", 'P', 'G');
  262.   fprintf (Stream, "'%c%c'          Moving or stationary brown guard, from difficulty level x.\n", 'G', 'x');
  263.   fprintf (Stream, "'%c%c'          Moving or stationary white officer, from difficulty level x.\n", 'O', 'x');
  264.   fprintf (Stream, "'%c%c'          Moving or stationary blue SS officer, from difficulty level x.\n", 'S', 'x');
  265.   fprintf (Stream, "'%c%c'          Moving or stationary undead man, from difficulty level x.\n", 'U', 'x');
  266.   fprintf (Stream, "'%c%c'          Moving dog, from difficulty level x.\n\n\n\n", 'D', 'x');
  267.  
  268.   //
  269.   //   Write a copyright message as a trailer.
  270.   //
  271.   fprintf (Stream, "Printed with %s.\n%s\n", cVersion, cCopyright);
  272.  
  273.   //
  274.   //   Return Ok to indicate success.
  275.   //
  276.   return errOk;
  277. }
  278.  
  279.