Isometric Utils.h 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #ifndef __ISOMETRIC_UTILSH
  2. #define __ISOMETRIC_UTILSH
  3. #include "worlddef.h"
  4. //DEFINES
  5. #define MAXCOL WORLD_COLS
  6. #define MAXROW WORLD_ROWS
  7. #define GRIDSIZE (MAXCOL * MAXROW)
  8. #define RIGHTMOSTGRID (MAXCOL - 1)
  9. #define LASTROWSTART (GRIDSIZE - MAXCOL)
  10. #define NOWHERE (GRIDSIZE + 1)
  11. #define NO_MAP_POS NOWHERE
  12. #define MAPWIDTH (WORLD_COLS)
  13. #define MAPHEIGHT (WORLD_ROWS)
  14. #define MAPLENGTH (MAPHEIGHT*MAPWIDTH)
  15. #define ADJUST_Y_FOR_HEIGHT( pos, y ) ( y -= gpWorldLevelData[ pos ].sHeight )
  16. UINT8 gOppositeDirection[ NUM_WORLD_DIRECTIONS ];
  17. UINT8 gTwoCCDirection[ NUM_WORLD_DIRECTIONS ];
  18. UINT8 gTwoCDirection[ NUM_WORLD_DIRECTIONS ];
  19. UINT8 gOneCDirection[ NUM_WORLD_DIRECTIONS ];
  20. UINT8 gOneCCDirection[ NUM_WORLD_DIRECTIONS ];
  21. UINT8 gPurpendicularDirection[ NUM_WORLD_DIRECTIONS ][ NUM_WORLD_DIRECTIONS ];
  22. // Macros
  23. // |Check for map bounds------------------------------------------| |Invalid-| |Valid-------------------|
  24. #define MAPROWCOLTOPOS( r, c ) ( ( (r < 0) || (r >= WORLD_ROWS) || (c < 0) || (c >= WORLD_COLS) ) ? ( 0xffff ) : ( (r) * WORLD_COLS + (c) ) )
  25. #define GETWORLDINDEXFROMWORLDCOORDS( r, c ) ( (INT16) ( r / CELL_X_SIZE ) ) * WORLD_COLS + ( (INT16) ( c / CELL_Y_SIZE ) )
  26. void ConvertGridNoToXY( INT16 sGridNo, INT16 *sXPos, INT16 *sYPos );
  27. void ConvertGridNoToCellXY( INT16 sGridNo, INT16 *sXPos, INT16 *sYPos );
  28. void ConvertGridNoToCenterCellXY( INT16 sGridNo, INT16 *sXPos, INT16 *sYPos );
  29. // GRID NO MANIPULATION FUNCTIONS
  30. INT16 NewGridNo(INT16 sGridno, INT16 sDirInc);
  31. INT16 DirectionInc(INT16 sDirection);
  32. INT32 OutOfBounds(INT16 sGridno, INT16 sProposedGridno);
  33. // Functions
  34. BOOLEAN GetMouseCell( INT32 *piMouseMapPos );
  35. BOOLEAN GetMouseXY( INT16 *psMouseX, INT16 *psMouseY );
  36. BOOLEAN GetMouseWorldCoords( INT16 *psMouseX, INT16 *psMouseY );
  37. BOOLEAN GetMouseMapPos( INT16 *psMapPos );
  38. BOOLEAN GetMouseWorldCoordsInCenter( INT16 *psMouseX, INT16 *psMouseY );
  39. BOOLEAN GetMouseXYWithRemainder( INT16 *psMouseX, INT16 *psMouseY, INT16 *psCellX, INT16 *psCellY );
  40. void GetScreenXYWorldCoords( INT16 sScreenX, INT16 sScreenY, INT16 *pWorldX, INT16 *psWorldY );
  41. void GetScreenXYWorldCell( INT16 sScreenX, INT16 sScreenY, INT16 *psWorldCellX, INT16 *psWorldCellY );
  42. void GetScreenXYGridNo( INT16 sScreenX, INT16 sScreenY, INT16 *psMapPos );
  43. void GetWorldXYAbsoluteScreenXY( INT32 sWorldCellX, INT32 sWorldCellY, INT16 *psWorldScreenX, INT16 *psWorldScreenY );
  44. void GetFromAbsoluteScreenXYWorldXY( INT32 *psWorldCellX, INT32* psWorldCellY, INT16 sWorldScreenX, INT16 sWorldScreenY );
  45. void FromCellToScreenCoordinates( INT16 sCellX, INT16 sCellY, INT16 *psScreenX, INT16 *psScreenY );
  46. void FromScreenToCellCoordinates( INT16 sScreenX, INT16 sScreenY, INT16 *psCellX, INT16 *psCellY );
  47. // Higher resolution convertion functions
  48. void FloatFromCellToScreenCoordinates( FLOAT dCellX, FLOAT dCellY, FLOAT *pdScreenX, FLOAT *pdScreenY );
  49. void FloatFromScreenToCellCoordinates( FLOAT dScreenX, FLOAT dScreenY, FLOAT *pdCellX, FLOAT *pdCellY );
  50. BOOLEAN GridNoOnVisibleWorldTile( INT16 sGridNo );
  51. BOOLEAN GridNoOnVisibleWorldTileGivenYLimits( INT16 sGridNo );
  52. BOOLEAN GridNoOnEdgeOfMap( INT16 sGridNo, INT8 * pbDirection );
  53. BOOLEAN ConvertMapPosToWorldTileCenter( UINT16 usMapPos, INT16 *psXPos, INT16 *psYPos );
  54. BOOLEAN CellXYToScreenXY(INT16 sCellX, INT16 sCellY, INT16 *sScreenX, INT16 *sScreenY);
  55. INT32 GetRangeFromGridNoDiff( INT16 sGridNo1, INT16 sGridNo2 );
  56. INT32 GetRangeInCellCoordsFromGridNoDiff( INT16 sGridNo1, INT16 sGridNo2 );
  57. BOOLEAN IsPointInScreenRect( INT16 sXPos, INT16 sYPos, SGPRect *pRect );
  58. BOOLEAN IsPointInScreenRectWithRelative( INT16 sXPos, INT16 sYPos, SGPRect *pRect, INT16 *sXRel, INT16 *sRelY );
  59. INT16 PythSpacesAway(INT16 sOrigin, INT16 sDest);
  60. INT16 SpacesAway(INT16 sOrigin, INT16 sDest);
  61. INT16 CardinalSpacesAway(INT16 sOrigin, INT16 sDest);
  62. INT8 FindNumTurnsBetweenDirs( INT8 sDir1, INT8 sDir2 );
  63. BOOLEAN FindHeigherLevel( SOLDIERTYPE *pSoldier, INT16 sGridNo, INT8 bStartingDir, INT8 *pbDirection );
  64. BOOLEAN FindLowerLevel( SOLDIERTYPE *pSoldier, INT16 sGridNo, INT8 bStartingDir, INT8 *pbDirection );
  65. INT16 QuickestDirection(INT16 origin, INT16 dest);
  66. INT16 ExtQuickestDirection(INT16 origin, INT16 dest);
  67. // Returns the (center ) cell coordinates in X
  68. INT16 CenterX( INT16 sGridno );
  69. // Returns the (center ) cell coordinates in Y
  70. INT16 CenterY( INT16 sGridno );
  71. INT16 MapX( INT16 sGridNo );
  72. INT16 MapY( INT16 sGridNo );
  73. BOOLEAN FindFenceJumpDirection( SOLDIERTYPE *pSoldier, INT16 sGridNo, INT8 bStartingDir, INT8 *pbDirection );
  74. //Simply chooses a random gridno within valid boundaries (for dropping things in unloaded sectors)
  75. INT16 RandomGridNo();
  76. extern UINT32 guiForceRefreshMousePositionCalculation;
  77. #endif