src/direction.h
branchgamebalance
changeset 9895 7bd07f43b0e3
parent 6451 7baba06b4b85
child 6307 f40e88cff863
equal deleted inserted replaced
9894:70d78ac95d6c 9895:7bd07f43b0e3
     6 #define DIRECTION_H
     6 #define DIRECTION_H
     7 
     7 
     8 #include "helpers.hpp"
     8 #include "helpers.hpp"
     9 
     9 
    10 /* Direction as commonly used in v->direction, 8 way. */
    10 /* Direction as commonly used in v->direction, 8 way. */
    11 typedef enum Direction {
    11 enum Direction {
    12 	DIR_BEGIN = 0,
    12 	DIR_BEGIN = 0,
    13 	DIR_N   = 0,
    13 	DIR_N   = 0,
    14 	DIR_NE  = 1,      ///< Northeast, upper right on your monitor
    14 	DIR_NE  = 1,      ///< Northeast, upper right on your monitor
    15 	DIR_E   = 2,
    15 	DIR_E   = 2,
    16 	DIR_SE  = 3,
    16 	DIR_SE  = 3,
    18 	DIR_SW  = 5,
    18 	DIR_SW  = 5,
    19 	DIR_W   = 6,
    19 	DIR_W   = 6,
    20 	DIR_NW  = 7,
    20 	DIR_NW  = 7,
    21 	DIR_END,
    21 	DIR_END,
    22 	INVALID_DIR = 0xFF,
    22 	INVALID_DIR = 0xFF,
    23 } Direction;
    23 };
    24 
    24 
    25 /** Define basic enum properties */
    25 /** Define basic enum properties */
    26 template <> struct EnumPropsT<Direction> : MakeEnumPropsT<Direction, byte, DIR_BEGIN, DIR_END, INVALID_DIR> {};
    26 template <> struct EnumPropsT<Direction> : MakeEnumPropsT<Direction, byte, DIR_BEGIN, DIR_END, INVALID_DIR> {};
    27 typedef TinyEnumT<Direction> DirectionByte;
    27 typedef TinyEnumT<Direction> DirectionByte;
    28 
    28 
    30 {
    30 {
    31 	return (Direction)(4 ^ d);
    31 	return (Direction)(4 ^ d);
    32 }
    32 }
    33 
    33 
    34 
    34 
    35 typedef enum DirDiff {
    35 enum DirDiff {
    36 	DIRDIFF_SAME    = 0,
    36 	DIRDIFF_SAME    = 0,
    37 	DIRDIFF_45RIGHT = 1,
    37 	DIRDIFF_45RIGHT = 1,
    38 	DIRDIFF_90RIGHT = 2,
    38 	DIRDIFF_90RIGHT = 2,
    39 	DIRDIFF_REVERSE = 4,
    39 	DIRDIFF_REVERSE = 4,
    40 	DIRDIFF_90LEFT  = 6,
    40 	DIRDIFF_90LEFT  = 6,
    41 	DIRDIFF_45LEFT  = 7
    41 	DIRDIFF_45LEFT  = 7
    42 } DirDiff;
    42 };
    43 
    43 
    44 static inline DirDiff DirDifference(Direction d0, Direction d1)
    44 static inline DirDiff DirDifference(Direction d0, Direction d1)
    45 {
    45 {
    46 	return (DirDiff)((d0 + 8 - d1) % 8);
    46 	return (DirDiff)((d0 + 8 - d1) % 8);
    47 }
    47 }
    57 	return (Direction)((d + delta) % 8);
    57 	return (Direction)((d + delta) % 8);
    58 }
    58 }
    59 
    59 
    60 
    60 
    61 /* Direction commonly used as the direction of entering and leaving tiles, 4-way */
    61 /* Direction commonly used as the direction of entering and leaving tiles, 4-way */
    62 typedef enum DiagDirection {
    62 enum DiagDirection {
    63 	DIAGDIR_BEGIN = 0,
    63 	DIAGDIR_BEGIN = 0,
    64 	DIAGDIR_NE  = 0,      ///< Northeast, upper right on your monitor
    64 	DIAGDIR_NE  = 0,      ///< Northeast, upper right on your monitor
    65 	DIAGDIR_SE  = 1,
    65 	DIAGDIR_SE  = 1,
    66 	DIAGDIR_SW  = 2,
    66 	DIAGDIR_SW  = 2,
    67 	DIAGDIR_NW  = 3,
    67 	DIAGDIR_NW  = 3,
    68 	DIAGDIR_END,
    68 	DIAGDIR_END,
    69 	INVALID_DIAGDIR = 0xFF,
    69 	INVALID_DIAGDIR = 0xFF,
    70 } DiagDirection;
    70 };
    71 
    71 
    72 DECLARE_POSTFIX_INCREMENT(DiagDirection);
    72 DECLARE_POSTFIX_INCREMENT(DiagDirection);
    73 
    73 
    74 /** Define basic enum properties */
    74 /** Define basic enum properties */
    75 template <> struct EnumPropsT<DiagDirection> : MakeEnumPropsT<DiagDirection, byte, DIAGDIR_BEGIN, DIAGDIR_END, INVALID_DIAGDIR> {};
    75 template <> struct EnumPropsT<DiagDirection> : MakeEnumPropsT<DiagDirection, byte, DIAGDIR_BEGIN, DIAGDIR_END, INVALID_DIAGDIR> {};
    79 {
    79 {
    80 	return (DiagDirection)(2 ^ d);
    80 	return (DiagDirection)(2 ^ d);
    81 }
    81 }
    82 
    82 
    83 
    83 
    84 typedef enum DiagDirDiff {
    84 enum DiagDirDiff {
    85 	DIAGDIRDIFF_SAME    = 0,
    85 	DIAGDIRDIFF_SAME    = 0,
    86 	DIAGDIRDIFF_90RIGHT = 1,
    86 	DIAGDIRDIFF_90RIGHT = 1,
    87 	DIAGDIRDIFF_REVERSE = 2,
    87 	DIAGDIRDIFF_REVERSE = 2,
    88 	DIAGDIRDIFF_90LEFT  = 3
    88 	DIAGDIRDIFF_90LEFT  = 3
    89 } DiagDirDiff;
    89 };
    90 
    90 
    91 static inline DiagDirection ChangeDiagDir(DiagDirection d, DiagDirDiff delta)
    91 static inline DiagDirection ChangeDiagDir(DiagDirection d, DiagDirDiff delta)
    92 {
    92 {
    93 	return (DiagDirection)((d + delta) % 4);
    93 	return (DiagDirection)((d + delta) % 4);
    94 }
    94 }
   105 	return (Direction)(dir * 2 + 1);
   105 	return (Direction)(dir * 2 + 1);
   106 }
   106 }
   107 
   107 
   108 
   108 
   109 /* the 2 axis */
   109 /* the 2 axis */
   110 typedef enum Axis {
   110 enum Axis {
   111 	AXIS_X = 0,
   111 	AXIS_X = 0,
   112 	AXIS_Y = 1,
   112 	AXIS_Y = 1,
   113 	AXIS_END
   113 	AXIS_END
   114 } Axis;
   114 };
   115 
   115 
   116 
   116 
   117 static inline Axis OtherAxis(Axis a)
   117 static inline Axis OtherAxis(Axis a)
   118 {
   118 {
   119 	return (Axis)(a ^ 1);
   119 	return (Axis)(a ^ 1);