direction.h
author peter1138
Sun, 01 Oct 2006 12:00:32 +0000
changeset 4694 c917a3ad0dd2
parent 4666 172a0cdf28a6
permissions -rw-r--r--
(svn r6601) - Codechange: Support cargo subtypes in the refit window. The refit window has been altered to support resizing and scrolling. Note that the cargo subtype isn't yet passed for actual refitting yet. (Based on mart3p's patch)
3147
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
     1
/* $Id$ */
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
     2
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
     3
#ifndef DIRECTION_H
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
     4
#define DIRECTION_H
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
     5
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
     6
/* Direction as commonly used in v->direction, 8 way. */
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
     7
typedef enum Direction {
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
     8
	DIR_N   = 0,
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
     9
	DIR_NE  = 1,      /* Northeast, upper right on your monitor */
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    10
	DIR_E   = 2,
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    11
	DIR_SE  = 3,
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    12
	DIR_S   = 4,
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    13
	DIR_SW  = 5,
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    14
	DIR_W   = 6,
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    15
	DIR_NW  = 7,
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    16
	DIR_END,
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    17
	INVALID_DIR = 0xFF,
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    18
} Direction;
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    19
3157
3f35e2d9c8e3 (svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3154
diff changeset
    20
static inline Direction ReverseDir(Direction d)
3f35e2d9c8e3 (svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3154
diff changeset
    21
{
3f35e2d9c8e3 (svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3154
diff changeset
    22
	return (Direction)(4 ^ d);
3f35e2d9c8e3 (svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3154
diff changeset
    23
}
3f35e2d9c8e3 (svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3154
diff changeset
    24
3147
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    25
3158
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    26
typedef enum DirDiff {
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    27
	DIRDIFF_SAME    = 0,
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    28
	DIRDIFF_45RIGHT = 1,
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    29
	DIRDIFF_90RIGHT = 2,
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    30
	DIRDIFF_REVERSE = 4,
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    31
	DIRDIFF_90LEFT  = 6,
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    32
	DIRDIFF_45LEFT  = 7
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    33
} DirDiff;
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    34
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    35
static inline DirDiff DirDifference(Direction d0, Direction d1)
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    36
{
3162
5ff241ceadb3 (svn r3788) Fix (harmless) typo in r3784
tron
parents: 3158
diff changeset
    37
	return (DirDiff)((d0 + 8 - d1) % 8);
3158
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    38
}
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    39
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    40
static inline DirDiff ChangeDirDiff(DirDiff d, DirDiff delta)
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    41
{
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    42
	return (DirDiff)((d + delta) % 8);
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    43
}
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    44
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    45
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    46
static inline Direction ChangeDir(Direction d, DirDiff delta)
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    47
{
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    48
	return (Direction)((d + delta) % 8);
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    49
}
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    50
696a6ca0bfa9 (svn r3784) Add a type and functions to handle direction changes
tron
parents: 3157
diff changeset
    51
3147
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    52
/* Direction commonly used as the direction of entering and leaving tiles, 4-way */
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    53
typedef enum DiagDirection {
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    54
	DIAGDIR_NE  = 0,      /* Northeast, upper right on your monitor */
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    55
	DIAGDIR_SE  = 1,
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    56
	DIAGDIR_SW  = 2,
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    57
	DIAGDIR_NW  = 3,
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    58
	DIAGDIR_END,
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    59
	INVALID_DIAGDIR = 0xFF,
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    60
} DiagDirection;
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    61
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    62
static inline DiagDirection ReverseDiagDir(DiagDirection d)
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    63
{
3148
96d6a2fa97df (svn r3769) Add a cast to make KUDr's C++ compiler happy
tron
parents: 3147
diff changeset
    64
	return (DiagDirection)(2 ^ d);
3147
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    65
}
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    66
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    67
3163
14e1eba3591d (svn r3789) Add an enum and function to handle DiagDirection changes
tron
parents: 3162
diff changeset
    68
typedef enum DiagDirDiff {
14e1eba3591d (svn r3789) Add an enum and function to handle DiagDirection changes
tron
parents: 3162
diff changeset
    69
	DIAGDIRDIFF_SAME    = 0,
14e1eba3591d (svn r3789) Add an enum and function to handle DiagDirection changes
tron
parents: 3162
diff changeset
    70
	DIAGDIRDIFF_90RIGHT = 1,
14e1eba3591d (svn r3789) Add an enum and function to handle DiagDirection changes
tron
parents: 3162
diff changeset
    71
	DIAGDIRDIFF_REVERSE = 2,
14e1eba3591d (svn r3789) Add an enum and function to handle DiagDirection changes
tron
parents: 3162
diff changeset
    72
	DIAGDIRDIFF_90LEFT  = 3
14e1eba3591d (svn r3789) Add an enum and function to handle DiagDirection changes
tron
parents: 3162
diff changeset
    73
} DiagDirDiff;
14e1eba3591d (svn r3789) Add an enum and function to handle DiagDirection changes
tron
parents: 3162
diff changeset
    74
14e1eba3591d (svn r3789) Add an enum and function to handle DiagDirection changes
tron
parents: 3162
diff changeset
    75
static inline DiagDirection ChangeDiagDir(DiagDirection d, DiagDirDiff delta)
14e1eba3591d (svn r3789) Add an enum and function to handle DiagDirection changes
tron
parents: 3162
diff changeset
    76
{
14e1eba3591d (svn r3789) Add an enum and function to handle DiagDirection changes
tron
parents: 3162
diff changeset
    77
	return (DiagDirection)((d + delta) % 4);
14e1eba3591d (svn r3789) Add an enum and function to handle DiagDirection changes
tron
parents: 3162
diff changeset
    78
}
14e1eba3591d (svn r3789) Add an enum and function to handle DiagDirection changes
tron
parents: 3162
diff changeset
    79
14e1eba3591d (svn r3789) Add an enum and function to handle DiagDirection changes
tron
parents: 3162
diff changeset
    80
3153
e83501906eae (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3148
diff changeset
    81
static inline DiagDirection DirToDiagDir(Direction dir)
3147
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    82
{
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    83
	return (DiagDirection)(dir >> 1);
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    84
}
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    85
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    86
3153
e83501906eae (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3148
diff changeset
    87
static inline Direction DiagDirToDir(DiagDirection dir)
e83501906eae (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3148
diff changeset
    88
{
e83501906eae (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3148
diff changeset
    89
	return (Direction)(dir * 2 + 1);
e83501906eae (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3148
diff changeset
    90
}
e83501906eae (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3148
diff changeset
    91
e83501906eae (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3148
diff changeset
    92
3147
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    93
/* the 2 axis */
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    94
typedef enum Axis {
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    95
	AXIS_X = 0,
3699
dfd1e4dec957 (svn r4640) - Add: IsValidDiagDirection, IsValidDirection and IsValidAxis functions.
matthijs
parents: 3209
diff changeset
    96
	AXIS_Y = 1,
dfd1e4dec957 (svn r4640) - Add: IsValidDiagDirection, IsValidDirection and IsValidAxis functions.
matthijs
parents: 3209
diff changeset
    97
	AXIS_END
3147
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    98
} Axis;
fc76d566a68e (svn r3767) Move all direction related enums and functions to a separate header
tron
parents:
diff changeset
    99
3154
6ab0cb6b7ab3 (svn r3777) Add some functions to handle tunnels
tron
parents: 3153
diff changeset
   100
4158
91ff9bb84ced (svn r5582) Add and use AxisToTrack{Bits,}()
tron
parents: 3953
diff changeset
   101
static inline Axis OtherAxis(Axis a)
91ff9bb84ced (svn r5582) Add and use AxisToTrack{Bits,}()
tron
parents: 3953
diff changeset
   102
{
91ff9bb84ced (svn r5582) Add and use AxisToTrack{Bits,}()
tron
parents: 3953
diff changeset
   103
	return (Axis)(a ^ 1);
91ff9bb84ced (svn r5582) Add and use AxisToTrack{Bits,}()
tron
parents: 3953
diff changeset
   104
}
91ff9bb84ced (svn r5582) Add and use AxisToTrack{Bits,}()
tron
parents: 3953
diff changeset
   105
91ff9bb84ced (svn r5582) Add and use AxisToTrack{Bits,}()
tron
parents: 3953
diff changeset
   106
3154
6ab0cb6b7ab3 (svn r3777) Add some functions to handle tunnels
tron
parents: 3153
diff changeset
   107
static inline Axis DiagDirToAxis(DiagDirection d)
6ab0cb6b7ab3 (svn r3777) Add some functions to handle tunnels
tron
parents: 3153
diff changeset
   108
{
6ab0cb6b7ab3 (svn r3777) Add some functions to handle tunnels
tron
parents: 3153
diff changeset
   109
	return (Axis)(d & 1);
6ab0cb6b7ab3 (svn r3777) Add some functions to handle tunnels
tron
parents: 3153
diff changeset
   110
}
6ab0cb6b7ab3 (svn r3777) Add some functions to handle tunnels
tron
parents: 3153
diff changeset
   111
3209
98153d2f1ba7 (svn r3877) Add functions to turn a tile into a rail/road bridge ramp/middle part
tron
parents: 3163
diff changeset
   112
98153d2f1ba7 (svn r3877) Add functions to turn a tile into a rail/road bridge ramp/middle part
tron
parents: 3163
diff changeset
   113
/*
98153d2f1ba7 (svn r3877) Add functions to turn a tile into a rail/road bridge ramp/middle part
tron
parents: 3163
diff changeset
   114
 * Converts an Axis to a DiagDirection
98153d2f1ba7 (svn r3877) Add functions to turn a tile into a rail/road bridge ramp/middle part
tron
parents: 3163
diff changeset
   115
 * Points always in the positive direction, i.e. S[EW]
98153d2f1ba7 (svn r3877) Add functions to turn a tile into a rail/road bridge ramp/middle part
tron
parents: 3163
diff changeset
   116
 */
98153d2f1ba7 (svn r3877) Add functions to turn a tile into a rail/road bridge ramp/middle part
tron
parents: 3163
diff changeset
   117
static inline DiagDirection AxisToDiagDir(Axis a)
98153d2f1ba7 (svn r3877) Add functions to turn a tile into a rail/road bridge ramp/middle part
tron
parents: 3163
diff changeset
   118
{
98153d2f1ba7 (svn r3877) Add functions to turn a tile into a rail/road bridge ramp/middle part
tron
parents: 3163
diff changeset
   119
	return (DiagDirection)(2 - a);
98153d2f1ba7 (svn r3877) Add functions to turn a tile into a rail/road bridge ramp/middle part
tron
parents: 3163
diff changeset
   120
}
98153d2f1ba7 (svn r3877) Add functions to turn a tile into a rail/road bridge ramp/middle part
tron
parents: 3163
diff changeset
   121
3953
e64bbd8598e2 (svn r5101) Add a function to convert an axis and a flag for north/south into a DiagDirection. Use it for bridge ramps and ship depots
tron
parents: 3744
diff changeset
   122
/**
e64bbd8598e2 (svn r5101) Add a function to convert an axis and a flag for north/south into a DiagDirection. Use it for bridge ramps and ship depots
tron
parents: 3744
diff changeset
   123
 * Convert an axis and a flag for north/south into a DiagDirection
e64bbd8598e2 (svn r5101) Add a function to convert an axis and a flag for north/south into a DiagDirection. Use it for bridge ramps and ship depots
tron
parents: 3744
diff changeset
   124
 * @param ns north -> 0, south -> 1
e64bbd8598e2 (svn r5101) Add a function to convert an axis and a flag for north/south into a DiagDirection. Use it for bridge ramps and ship depots
tron
parents: 3744
diff changeset
   125
 */
e64bbd8598e2 (svn r5101) Add a function to convert an axis and a flag for north/south into a DiagDirection. Use it for bridge ramps and ship depots
tron
parents: 3744
diff changeset
   126
static inline DiagDirection XYNSToDiagDir(Axis xy, uint ns)
e64bbd8598e2 (svn r5101) Add a function to convert an axis and a flag for north/south into a DiagDirection. Use it for bridge ramps and ship depots
tron
parents: 3744
diff changeset
   127
{
e64bbd8598e2 (svn r5101) Add a function to convert an axis and a flag for north/south into a DiagDirection. Use it for bridge ramps and ship depots
tron
parents: 3744
diff changeset
   128
	return (DiagDirection)(xy * 3 ^ ns * 2);
e64bbd8598e2 (svn r5101) Add a function to convert an axis and a flag for north/south into a DiagDirection. Use it for bridge ramps and ship depots
tron
parents: 3744
diff changeset
   129
}
e64bbd8598e2 (svn r5101) Add a function to convert an axis and a flag for north/south into a DiagDirection. Use it for bridge ramps and ship depots
tron
parents: 3744
diff changeset
   130
e64bbd8598e2 (svn r5101) Add a function to convert an axis and a flag for north/south into a DiagDirection. Use it for bridge ramps and ship depots
tron
parents: 3744
diff changeset
   131
3699
dfd1e4dec957 (svn r4640) - Add: IsValidDiagDirection, IsValidDirection and IsValidAxis functions.
matthijs
parents: 3209
diff changeset
   132
static inline bool IsValidDiagDirection(DiagDirection d)
dfd1e4dec957 (svn r4640) - Add: IsValidDiagDirection, IsValidDirection and IsValidAxis functions.
matthijs
parents: 3209
diff changeset
   133
{
dfd1e4dec957 (svn r4640) - Add: IsValidDiagDirection, IsValidDirection and IsValidAxis functions.
matthijs
parents: 3209
diff changeset
   134
	return d < DIAGDIR_END;
dfd1e4dec957 (svn r4640) - Add: IsValidDiagDirection, IsValidDirection and IsValidAxis functions.
matthijs
parents: 3209
diff changeset
   135
}
dfd1e4dec957 (svn r4640) - Add: IsValidDiagDirection, IsValidDirection and IsValidAxis functions.
matthijs
parents: 3209
diff changeset
   136
3744
6f0d9e0fc2d9 (svn r4732) - Fix: use correct types in IsValid[Direction|Axis]
glx
parents: 3699
diff changeset
   137
static inline bool IsValidDirection(Direction d)
3699
dfd1e4dec957 (svn r4640) - Add: IsValidDiagDirection, IsValidDirection and IsValidAxis functions.
matthijs
parents: 3209
diff changeset
   138
{
dfd1e4dec957 (svn r4640) - Add: IsValidDiagDirection, IsValidDirection and IsValidAxis functions.
matthijs
parents: 3209
diff changeset
   139
	return d < DIR_END;
dfd1e4dec957 (svn r4640) - Add: IsValidDiagDirection, IsValidDirection and IsValidAxis functions.
matthijs
parents: 3209
diff changeset
   140
}
dfd1e4dec957 (svn r4640) - Add: IsValidDiagDirection, IsValidDirection and IsValidAxis functions.
matthijs
parents: 3209
diff changeset
   141
3744
6f0d9e0fc2d9 (svn r4732) - Fix: use correct types in IsValid[Direction|Axis]
glx
parents: 3699
diff changeset
   142
static inline bool IsValidAxis(Axis d)
3699
dfd1e4dec957 (svn r4640) - Add: IsValidDiagDirection, IsValidDirection and IsValidAxis functions.
matthijs
parents: 3209
diff changeset
   143
{
dfd1e4dec957 (svn r4640) - Add: IsValidDiagDirection, IsValidDirection and IsValidAxis functions.
matthijs
parents: 3209
diff changeset
   144
	return d < AXIS_END;
dfd1e4dec957 (svn r4640) - Add: IsValidDiagDirection, IsValidDirection and IsValidAxis functions.
matthijs
parents: 3209
diff changeset
   145
}
dfd1e4dec957 (svn r4640) - Add: IsValidDiagDirection, IsValidDirection and IsValidAxis functions.
matthijs
parents: 3209
diff changeset
   146
4666
172a0cdf28a6 (svn r6560) - Codechange: Minor fix; add missing #include guards and comments, and correct svn properties on bmp.[ch]
peter1138
parents: 4158
diff changeset
   147
#endif /* DIRECTION_H */