author | celestar |
Fri, 29 Dec 2006 12:18:43 +0000 | |
branch | custombridgeheads |
changeset 5595 | 049ed4486972 |
parent 5592 | fd60d4ecc921 |
permissions | -rw-r--r-- |
2625
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
1 |
/* $Id$ */ |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
2 |
|
2963
6645da0a5b4a
(svn r3525) - Rename station_newgrf.[ch] to newgrf_station.[ch], and update project files.
peter1138
parents:
2625
diff
changeset
|
3 |
/** @file newgrf_station.c Functions for dealing with station classes and custom stations. */ |
2625
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
4 |
|
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
5 |
#include "stdafx.h" |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
6 |
#include "openttd.h" |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
7 |
#include "variables.h" |
3764
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
8 |
#include "functions.h" |
2625
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
9 |
#include "debug.h" |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
10 |
#include "sprite.h" |
3764
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
11 |
#include "table/sprites.h" |
3594
31fd59e606c8
(svn r4484) - Newstations: Use StringIDs instead of char*s to reference our custom names.
peter1138
parents:
3587
diff
changeset
|
12 |
#include "table/strings.h" |
2967
4208a82bf0d9
(svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents:
2963
diff
changeset
|
13 |
#include "station.h" |
3587 | 14 |
#include "station_map.h" |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5172
diff
changeset
|
15 |
#include "newgrf.h" |
3752
a7cdd7c0c928
(svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents:
3751
diff
changeset
|
16 |
#include "newgrf_callbacks.h" |
2963
6645da0a5b4a
(svn r3525) - Rename station_newgrf.[ch] to newgrf_station.[ch], and update project files.
peter1138
parents:
2625
diff
changeset
|
17 |
#include "newgrf_station.h" |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
18 |
#include "newgrf_spritegroup.h" |
4261
2ec8f5a9747b
(svn r5887) -Cleanup: move date related functions, defines and variables to date.[ch]
rubidium
parents:
4206
diff
changeset
|
19 |
#include "date.h" |
2625
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
20 |
|
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
21 |
static StationClass station_classes[STAT_CLASS_MAX]; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
22 |
|
3786
73784d02aa69
(svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents:
3780
diff
changeset
|
23 |
enum { |
73784d02aa69
(svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents:
3780
diff
changeset
|
24 |
MAX_SPECLIST = 255, |
73784d02aa69
(svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents:
3780
diff
changeset
|
25 |
}; |
73784d02aa69
(svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents:
3780
diff
changeset
|
26 |
|
2625
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
27 |
/** |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
28 |
* Reset station classes to their default state. |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
29 |
* This includes initialising the Default and Waypoint classes with an empty |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
30 |
* entry, for standard stations and waypoints. |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
31 |
*/ |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
32 |
void ResetStationClasses(void) |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
33 |
{ |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
34 |
StationClassID i; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
35 |
for (i = 0; i < STAT_CLASS_MAX; i++) { |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
36 |
station_classes[i].id = 0; |
3594
31fd59e606c8
(svn r4484) - Newstations: Use StringIDs instead of char*s to reference our custom names.
peter1138
parents:
3587
diff
changeset
|
37 |
station_classes[i].name = STR_EMPTY; |
2625
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
38 |
station_classes[i].stations = 0; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
39 |
|
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
40 |
free(station_classes[i].spec); |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
41 |
station_classes[i].spec = NULL; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
42 |
} |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
43 |
|
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
44 |
// Set up initial data |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
45 |
station_classes[0].id = 'DFLT'; |
3594
31fd59e606c8
(svn r4484) - Newstations: Use StringIDs instead of char*s to reference our custom names.
peter1138
parents:
3587
diff
changeset
|
46 |
station_classes[0].name = STR_STAT_CLASS_DFLT; |
2625
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
47 |
station_classes[0].stations = 1; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
48 |
station_classes[0].spec = malloc(sizeof(*station_classes[0].spec)); |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
49 |
station_classes[0].spec[0] = NULL; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
50 |
|
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
51 |
station_classes[1].id = 'WAYP'; |
3594
31fd59e606c8
(svn r4484) - Newstations: Use StringIDs instead of char*s to reference our custom names.
peter1138
parents:
3587
diff
changeset
|
52 |
station_classes[1].name = STR_STAT_CLASS_WAYP; |
2625
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
53 |
station_classes[1].stations = 1; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
54 |
station_classes[1].spec = malloc(sizeof(*station_classes[1].spec)); |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
55 |
station_classes[1].spec[0] = NULL; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
56 |
} |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
57 |
|
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
58 |
/** |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
59 |
* Allocate a station class for the given class id. |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
60 |
* @param classid A 32 bit value identifying the class. |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
61 |
* @return Index into station_classes of allocated class. |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
62 |
*/ |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
63 |
StationClassID AllocateStationClass(uint32 class) |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
64 |
{ |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
65 |
StationClassID i; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
66 |
|
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
67 |
for (i = 0; i < STAT_CLASS_MAX; i++) { |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
68 |
if (station_classes[i].id == class) { |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
69 |
// ClassID is already allocated, so reuse it. |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
70 |
return i; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
71 |
} else if (station_classes[i].id == 0) { |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
72 |
// This class is empty, so allocate it to the ClassID. |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
73 |
station_classes[i].id = class; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
74 |
return i; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
75 |
} |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
76 |
} |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
77 |
|
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5172
diff
changeset
|
78 |
grfmsg(2, "StationClassAllocate: already allocated %d classes, using default", STAT_CLASS_MAX); |
2625
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
79 |
return STAT_CLASS_DFLT; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
80 |
} |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
81 |
|
3642
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
82 |
/** Set the name of a custom station class */ |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
83 |
void SetStationClassName(StationClassID sclass, StringID name) |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
84 |
{ |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
85 |
assert(sclass < STAT_CLASS_MAX); |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
86 |
station_classes[sclass].name = name; |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
87 |
} |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
88 |
|
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
89 |
/** Retrieve the name of a custom station class */ |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
90 |
StringID GetStationClassName(StationClassID sclass) |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
91 |
{ |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
92 |
assert(sclass < STAT_CLASS_MAX); |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
93 |
return station_classes[sclass].name; |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
94 |
} |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
95 |
|
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
96 |
/** Build a list of station class name StringIDs to use in a dropdown list |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
97 |
* @return Pointer to a (static) array of StringIDs |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
98 |
*/ |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
99 |
StringID *BuildStationClassDropdown(void) |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
100 |
{ |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
101 |
/* Allow room for all station classes, plus a terminator entry */ |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
102 |
static StringID names[STAT_CLASS_MAX + 1]; |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
103 |
uint i; |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
104 |
|
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
105 |
/* Add each name */ |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
106 |
for (i = 0; i < STAT_CLASS_MAX && station_classes[i].id != 0; i++) { |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
107 |
names[i] = station_classes[i].name; |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
108 |
} |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
109 |
/* Terminate the list */ |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
110 |
names[i] = INVALID_STRING_ID; |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
111 |
|
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
112 |
return names; |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
113 |
} |
a247e07fafdf
(svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents:
3594
diff
changeset
|
114 |
|
2625
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
115 |
/** |
3587 | 116 |
* Get the number of station classes in use. |
117 |
* @return Number of station classes. |
|
118 |
*/ |
|
119 |
uint GetNumStationClasses(void) |
|
120 |
{ |
|
121 |
uint i; |
|
122 |
for (i = 0; i < STAT_CLASS_MAX && station_classes[i].id != 0; i++); |
|
123 |
return i; |
|
124 |
} |
|
125 |
||
126 |
/** |
|
2625
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
127 |
* Return the number of stations for the given station class. |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
128 |
* @param sclass Index of the station class. |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
129 |
* @return Number of stations in the class. |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
130 |
*/ |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
131 |
uint GetNumCustomStations(StationClassID sclass) |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
132 |
{ |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
133 |
assert(sclass < STAT_CLASS_MAX); |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
134 |
return station_classes[sclass].stations; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
135 |
} |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
136 |
|
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
137 |
/** |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
138 |
* Tie a station spec to its station class. |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
139 |
* @param spec The station spec. |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
140 |
*/ |
3676
48444d881fbe
(svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents:
3668
diff
changeset
|
141 |
void SetCustomStationSpec(StationSpec *statspec) |
2625
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
142 |
{ |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
143 |
StationClass *station_class; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
144 |
int i; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
145 |
|
3780
9555a46e6ca9
(svn r4772) - Newstations: when allocating a custom station (via action 0x03) check if the station has already been allocated. (Fixes duplicate waypoints in newstatsw in non-temperate climate)
peter1138
parents:
3775
diff
changeset
|
146 |
/* If the station has already been allocated, don't reallocate it. */ |
9555a46e6ca9
(svn r4772) - Newstations: when allocating a custom station (via action 0x03) check if the station has already been allocated. (Fixes duplicate waypoints in newstatsw in non-temperate climate)
peter1138
parents:
3775
diff
changeset
|
147 |
if (statspec->allocated) return; |
9555a46e6ca9
(svn r4772) - Newstations: when allocating a custom station (via action 0x03) check if the station has already been allocated. (Fixes duplicate waypoints in newstatsw in non-temperate climate)
peter1138
parents:
3775
diff
changeset
|
148 |
|
3676
48444d881fbe
(svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents:
3668
diff
changeset
|
149 |
assert(statspec->sclass < STAT_CLASS_MAX); |
48444d881fbe
(svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents:
3668
diff
changeset
|
150 |
station_class = &station_classes[statspec->sclass]; |
2625
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
151 |
|
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
152 |
i = station_class->stations++; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
153 |
station_class->spec = realloc(station_class->spec, station_class->stations * sizeof(*station_class->spec)); |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
154 |
|
3676
48444d881fbe
(svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents:
3668
diff
changeset
|
155 |
station_class->spec[i] = statspec; |
3780
9555a46e6ca9
(svn r4772) - Newstations: when allocating a custom station (via action 0x03) check if the station has already been allocated. (Fixes duplicate waypoints in newstatsw in non-temperate climate)
peter1138
parents:
3775
diff
changeset
|
156 |
statspec->allocated = true; |
2625
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
157 |
} |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
158 |
|
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
159 |
/** |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
160 |
* Retrieve a station spec from a class. |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
161 |
* @param sclass Index of the station class. |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
162 |
* @param station The station index with the class. |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
163 |
* @return The station spec. |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
164 |
*/ |
3676
48444d881fbe
(svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents:
3668
diff
changeset
|
165 |
const StationSpec *GetCustomStationSpec(StationClassID sclass, uint station) |
2625
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
166 |
{ |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
167 |
assert(sclass < STAT_CLASS_MAX); |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
168 |
if (station < station_classes[sclass].stations) |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
169 |
return station_classes[sclass].spec[station]; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
170 |
|
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
171 |
// If the custom station isn't defined any more, then the GRF file |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
172 |
// probably was not loaded. |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
173 |
return NULL; |
66b3d632dcd2
(svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff
changeset
|
174 |
} |
2967
4208a82bf0d9
(svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents:
2963
diff
changeset
|
175 |
|
4208a82bf0d9
(svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents:
2963
diff
changeset
|
176 |
|
3765
e057e2b740d4
(svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents:
3764
diff
changeset
|
177 |
const StationSpec *GetCustomStationSpecByGrf(uint32 grfid, byte localidx) |
e057e2b740d4
(svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents:
3764
diff
changeset
|
178 |
{ |
e057e2b740d4
(svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents:
3764
diff
changeset
|
179 |
StationClassID i; |
e057e2b740d4
(svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents:
3764
diff
changeset
|
180 |
uint j; |
e057e2b740d4
(svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents:
3764
diff
changeset
|
181 |
|
e057e2b740d4
(svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents:
3764
diff
changeset
|
182 |
for (i = STAT_CLASS_DFLT; i < STAT_CLASS_MAX; i++) { |
e057e2b740d4
(svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents:
3764
diff
changeset
|
183 |
for (j = 0; j < station_classes[i].stations; j++) { |
e057e2b740d4
(svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents:
3764
diff
changeset
|
184 |
const StationSpec *statspec = station_classes[i].spec[j]; |
e057e2b740d4
(svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents:
3764
diff
changeset
|
185 |
if (statspec == NULL) continue; |
e057e2b740d4
(svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents:
3764
diff
changeset
|
186 |
if (statspec->grfid == grfid && statspec->localidx == localidx) return statspec; |
e057e2b740d4
(svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents:
3764
diff
changeset
|
187 |
} |
e057e2b740d4
(svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents:
3764
diff
changeset
|
188 |
} |
e057e2b740d4
(svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents:
3764
diff
changeset
|
189 |
|
e057e2b740d4
(svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents:
3764
diff
changeset
|
190 |
return NULL; |
e057e2b740d4
(svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents:
3764
diff
changeset
|
191 |
} |
e057e2b740d4
(svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents:
3764
diff
changeset
|
192 |
|
e057e2b740d4
(svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents:
3764
diff
changeset
|
193 |
|
3756
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
194 |
/* Evaluate a tile's position within a station, and return the result a bitstuffed format. |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
195 |
* if not centred: .TNLcCpP, if centred: .TNL..CP |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
196 |
* T = Tile layout number (GetStationGfx), N = Number of platforms, L = Length of platforms |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
197 |
* C = Current platform number from start, c = from end |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
198 |
* P = Position along platform from start, p = from end |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
199 |
* if centred, C/P start from the centre and c/p are not available. |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
200 |
*/ |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
201 |
uint32 GetPlatformInfo(Axis axis, byte tile, int platforms, int length, int x, int y, bool centred) |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
202 |
{ |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
203 |
uint32 retval = 0; |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
204 |
|
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
205 |
if (axis == AXIS_X) { |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
206 |
intswap(platforms, length); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
207 |
intswap(x, y); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
208 |
} |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
209 |
|
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
210 |
/* Limit our sizes to 4 bits */ |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
211 |
platforms = min(15, platforms); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
212 |
length = min(15, length); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
213 |
x = min(15, x); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
214 |
y = min(15, y); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
215 |
if (centred) { |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
216 |
x -= platforms / 2; |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
217 |
y -= length / 2; |
3790
66700f2c57a9
(svn r4786) - Newstations: in GetPlatformInfo() ensure negative values are only four bits
peter1138
parents:
3789
diff
changeset
|
218 |
SB(retval, 0, 4, y & 0xF); |
66700f2c57a9
(svn r4786) - Newstations: in GetPlatformInfo() ensure negative values are only four bits
peter1138
parents:
3789
diff
changeset
|
219 |
SB(retval, 4, 4, x & 0xF); |
3756
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
220 |
} else { |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
221 |
SB(retval, 0, 4, y); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
222 |
SB(retval, 4, 4, length - y - 1); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
223 |
SB(retval, 8, 4, x); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
224 |
SB(retval, 12, 4, platforms - x - 1); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
225 |
} |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
226 |
SB(retval, 16, 4, length); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
227 |
SB(retval, 20, 4, platforms); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
228 |
SB(retval, 24, 4, tile); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
229 |
|
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
230 |
return retval; |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
231 |
} |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
232 |
|
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
233 |
|
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
234 |
/* Find the end of a railway station, from the tile, in the direction of delta. |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
235 |
* If check_type is set, we stop if the custom station type changes. |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
236 |
* If check_axis is set, we stop if the station direction changes. |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
237 |
*/ |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
238 |
static TileIndex FindRailStationEnd(TileIndex tile, TileIndexDiff delta, bool check_type, bool check_axis) |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
239 |
{ |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
240 |
bool waypoint; |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
241 |
byte orig_type = 0; |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
242 |
Axis orig_axis = AXIS_X; |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
243 |
|
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
244 |
waypoint = IsTileType(tile, MP_RAILWAY); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
245 |
|
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
246 |
if (waypoint) { |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
247 |
if (check_axis) orig_axis = GetWaypointAxis(tile); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
248 |
} else { |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
249 |
if (check_type) orig_type = GetCustomStationSpecIndex(tile); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
250 |
if (check_axis) orig_axis = GetRailStationAxis(tile); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
251 |
} |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
252 |
|
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
253 |
while (true) { |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
254 |
TileIndex new_tile = TILE_ADD(tile, delta); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
255 |
|
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
256 |
if (waypoint) { |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
257 |
if (!IsTileType(new_tile, MP_RAILWAY)) break; |
4182
20d711816338
(svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents:
3893
diff
changeset
|
258 |
if (!IsRailWaypoint(new_tile)) break; |
3756
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
259 |
if (check_axis && GetWaypointAxis(new_tile) != orig_axis) break; |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
260 |
} else { |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
261 |
if (!IsRailwayStationTile(new_tile)) break; |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
262 |
if (check_type && GetCustomStationSpecIndex(new_tile) != orig_type) break; |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
263 |
if (check_axis && GetRailStationAxis(new_tile) != orig_axis) break; |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
264 |
} |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
265 |
|
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
266 |
tile = new_tile; |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
267 |
} |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
268 |
return tile; |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
269 |
} |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
270 |
|
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
271 |
|
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
272 |
static uint32 GetPlatformInfoHelper(TileIndex tile, bool check_type, bool check_axis, bool centred) |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
273 |
{ |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
274 |
int tx = TileX(tile); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
275 |
int ty = TileY(tile); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
276 |
int sx = TileX(FindRailStationEnd(tile, TileDiffXY(-1, 0), check_type, check_axis)); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
277 |
int sy = TileY(FindRailStationEnd(tile, TileDiffXY( 0, -1), check_type, check_axis)); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
278 |
int ex = TileX(FindRailStationEnd(tile, TileDiffXY( 1, 0), check_type, check_axis)) + 1; |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
279 |
int ey = TileY(FindRailStationEnd(tile, TileDiffXY( 0, 1), check_type, check_axis)) + 1; |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
280 |
Axis axis = IsTileType(tile, MP_RAILWAY) ? GetWaypointAxis(tile) : GetRailStationAxis(tile); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
281 |
|
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
282 |
tx -= sx; ex -= sx; |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
283 |
ty -= sy; ey -= sy; |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
284 |
|
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
285 |
return GetPlatformInfo(axis, IsTileType(tile, MP_RAILWAY) ? 2 : GetStationGfx(tile), ex, ey, tx, ty, centred); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
286 |
} |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
287 |
|
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
288 |
|
5592
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
289 |
static uint32 GetRailContinuationInfo(TileIndex tile) |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
290 |
{ |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
291 |
/* Tile offsets and exit dirs for X axis */ |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
292 |
static Direction x_dir[8] = { DIR_SW, DIR_NE, DIR_SE, DIR_NW, DIR_S, DIR_E, DIR_W, DIR_N }; |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
293 |
static DiagDirection x_exits[8] = { DIAGDIR_SW, DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NE, DIAGDIR_SW, DIAGDIR_NE }; |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
294 |
|
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
295 |
/* Tile offsets and exit dirs for Y axis */ |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
296 |
static Direction y_dir[8] = { DIR_SE, DIR_NW, DIR_SW, DIR_NE, DIR_S, DIR_W, DIR_E, DIR_N }; |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
297 |
static DiagDirection y_exits[8] = { DIAGDIR_SE, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_NW, DIAGDIR_SE, DIAGDIR_NW }; |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
298 |
|
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
299 |
Axis axis = IsTileType(tile, MP_RAILWAY) ? GetWaypointAxis(tile) : GetRailStationAxis(tile); |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
300 |
|
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
301 |
/* Choose appropriate lookup table to use */ |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
302 |
Direction *dir = axis == AXIS_X ? x_dir : y_dir; |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
303 |
DiagDirection *diagdir = axis == AXIS_X ? x_exits : y_exits; |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
304 |
|
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
305 |
uint32 res = 0; |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
306 |
uint i; |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
307 |
|
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
308 |
for (i = 0; i < lengthof(x_dir); i++, dir++, diagdir++) { |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
309 |
uint32 ts = GetTileTrackStatus(tile + TileOffsByDir(*dir), TRANSPORT_RAIL); |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
310 |
if (ts != 0) { |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
311 |
/* If there is any track on the tile, set the bit in the second byte */ |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
312 |
SETBIT(res, i + 8); |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
313 |
|
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
314 |
/* If any track reaches our exit direction, set the bit in the lower byte */ |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
315 |
if (ts & DiagdirReachesTracks(*diagdir)) SETBIT(res, i); |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
316 |
} |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
317 |
} |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
318 |
|
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
319 |
return res; |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
320 |
} |
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
321 |
|
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
322 |
|
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
323 |
/* Station Resolver Functions */ |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
324 |
static uint32 StationGetRandomBits(const ResolverObject *object) |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
325 |
{ |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
326 |
const Station *st = object->u.station.st; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
327 |
const TileIndex tile = object->u.station.tile; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
328 |
return (st == NULL ? 0 : st->random_bits) | (tile == INVALID_TILE ? 0 : GetStationTileRandomBits(tile) << 16); |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
329 |
} |
2967
4208a82bf0d9
(svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents:
2963
diff
changeset
|
330 |
|
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
331 |
|
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
332 |
static uint32 StationGetTriggers(const ResolverObject *object) |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
333 |
{ |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
334 |
const Station *st = object->u.station.st; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
335 |
return st == NULL ? 0 : st->waiting_triggers; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
336 |
} |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
337 |
|
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
338 |
|
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
339 |
static void StationSetTriggers(const ResolverObject *object, int triggers) |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
340 |
{ |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
341 |
Station *st = (Station*)object->u.station.st; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
342 |
assert(st != NULL); |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
343 |
st->waiting_triggers = triggers; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
344 |
} |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
345 |
|
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
346 |
|
3893
46169364701b
(svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents:
3834
diff
changeset
|
347 |
static uint32 StationGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available) |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
348 |
{ |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
349 |
const Station *st = object->u.station.st; |
3756
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
350 |
TileIndex tile = object->u.station.tile; |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
351 |
|
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
352 |
if (st == NULL) { |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
353 |
/* Station does not exist, so we're in a purchase list */ |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
354 |
switch (variable) { |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
355 |
case 0x40: |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
356 |
case 0x41: |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
357 |
case 0x46: |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
358 |
case 0x47: |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
359 |
case 0x49: return 0x2110000; /* Platforms, tracks & position */ |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
360 |
case 0x42: return 0; /* Rail type (XXX Get current type from GUI?) */ |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
361 |
case 0x43: return _current_player; /* Station owner */ |
3748
120f9786a654
(svn r4736) - Newstations: use the correct value for PBS status (No PBS)
peter1138
parents:
3746
diff
changeset
|
362 |
case 0x44: return 2; /* PBS status */ |
4331
11de01553605
(svn r6013) -Fix: some newgrf properties returned the date in the new format where the newgrf's expect the original format. Thanks to michi_cc for finding these and providing the initial patch.
rubidium
parents:
4261
diff
changeset
|
363 |
case 0xFA: return max(_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0); /* Build date */ |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
364 |
} |
3893
46169364701b
(svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents:
3834
diff
changeset
|
365 |
|
46169364701b
(svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents:
3834
diff
changeset
|
366 |
*available = false; |
46169364701b
(svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents:
3834
diff
changeset
|
367 |
return -1; |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
368 |
} |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
369 |
|
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
370 |
switch (variable) { |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
371 |
/* Calculated station variables */ |
3756
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
372 |
case 0x40: return GetPlatformInfoHelper(tile, false, false, false); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
373 |
case 0x41: return GetPlatformInfoHelper(tile, true, false, false); |
3758
1ec9e4e26a9f
(svn r4749) - Newstations: add snowline support to variable 42.
peter1138
parents:
3756
diff
changeset
|
374 |
case 0x42: /* Terrain and rail type */ |
1ec9e4e26a9f
(svn r4749) - Newstations: add snowline support to variable 42.
peter1138
parents:
3756
diff
changeset
|
375 |
return ((_opt.landscape == LT_HILLY && GetTileZ(tile) > _opt.snow_line) ? 4 : 0) | |
1ec9e4e26a9f
(svn r4749) - Newstations: add snowline support to variable 42.
peter1138
parents:
3756
diff
changeset
|
376 |
(GetRailType(tile) << 8); |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
377 |
case 0x43: return st->owner; /* Station owner */ |
3748
120f9786a654
(svn r4736) - Newstations: use the correct value for PBS status (No PBS)
peter1138
parents:
3746
diff
changeset
|
378 |
case 0x44: return 2; /* PBS status */ |
5592
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
379 |
case 0x45: return GetRailContinuationInfo(tile); |
3756
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
380 |
case 0x46: return GetPlatformInfoHelper(tile, false, false, true); |
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
381 |
case 0x47: return GetPlatformInfoHelper(tile, true, false, true); |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
382 |
case 0x48: { /* Accepted cargo types */ |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
383 |
CargoID cargo_type; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
384 |
uint32 value = 0; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
385 |
|
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
386 |
for (cargo_type = 0; cargo_type < NUM_CARGO; cargo_type++) { |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
387 |
if (HASBIT(st->goods[cargo_type].waiting_acceptance, 15)) SETBIT(value, cargo_type); |
2967
4208a82bf0d9
(svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents:
2963
diff
changeset
|
388 |
} |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
389 |
return value; |
2967
4208a82bf0d9
(svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents:
2963
diff
changeset
|
390 |
} |
3756
b3835d8eca4d
(svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents:
3755
diff
changeset
|
391 |
case 0x49: return GetPlatformInfoHelper(tile, false, true, false); |
2967
4208a82bf0d9
(svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents:
2963
diff
changeset
|
392 |
|
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
393 |
/* Variables which use the parameter */ |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
394 |
case 0x60: return GB(st->goods[parameter].waiting_acceptance, 0, 12); |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
395 |
case 0x61: return st->goods[parameter].days_since_pickup; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
396 |
case 0x62: return st->goods[parameter].rating; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
397 |
case 0x63: return st->goods[parameter].enroute_time; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
398 |
case 0x64: return st->goods[parameter].last_speed | (st->goods[parameter].last_age << 8); |
5592
fd60d4ecc921
(svn r7608) [cbh] - Merge with trunk r7593:7607 because I need 7607 here
celestar
parents:
5568
diff
changeset
|
399 |
case 0x65: return GB(st->goods[parameter].waiting_acceptance, 12, 4); |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
400 |
|
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
401 |
/* General station properties */ |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
402 |
case 0x82: return 50; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
403 |
case 0x84: return st->string_id; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
404 |
case 0x86: return 0; |
3746
bde65debf648
(svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents:
3743
diff
changeset
|
405 |
case 0x8A: return st->had_vehicle_of_type; |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
406 |
case 0xF0: return st->facilities; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
407 |
case 0xF1: return st->airport_type; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
408 |
case 0xF2: return st->truck_stops->status; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
409 |
case 0xF3: return st->bus_stops->status; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
410 |
case 0xF6: return st->airport_flags; |
5172
7e64b65d3c54
(svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents:
4817
diff
changeset
|
411 |
case 0xF7: return GB(st->airport_flags, 8, 8); |
4331
11de01553605
(svn r6013) -Fix: some newgrf properties returned the date in the new format where the newgrf's expect the original format. Thanks to michi_cc for finding these and providing the initial patch.
rubidium
parents:
4261
diff
changeset
|
412 |
case 0xFA: return max(st->build_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0); |
2967
4208a82bf0d9
(svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents:
2963
diff
changeset
|
413 |
} |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
414 |
|
3746
bde65debf648
(svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents:
3743
diff
changeset
|
415 |
/* Handle cargo variables (deprecated) */ |
bde65debf648
(svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents:
3743
diff
changeset
|
416 |
if (variable >= 0x8C && variable <= 0xEC) { |
bde65debf648
(svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents:
3743
diff
changeset
|
417 |
const GoodsEntry *g = &st->goods[GB(variable - 0x8C, 3, 4)]; |
bde65debf648
(svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents:
3743
diff
changeset
|
418 |
switch (GB(variable - 0x8C, 0, 3)) { |
bde65debf648
(svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents:
3743
diff
changeset
|
419 |
case 0: return g->waiting_acceptance; |
5172
7e64b65d3c54
(svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents:
4817
diff
changeset
|
420 |
case 1: return GB(g->waiting_acceptance, 8, 8); |
3746
bde65debf648
(svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents:
3743
diff
changeset
|
421 |
case 2: return g->days_since_pickup; |
bde65debf648
(svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents:
3743
diff
changeset
|
422 |
case 3: return g->rating; |
bde65debf648
(svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents:
3743
diff
changeset
|
423 |
case 4: return g->enroute_from; |
bde65debf648
(svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents:
3743
diff
changeset
|
424 |
case 5: return g->enroute_time; |
bde65debf648
(svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents:
3743
diff
changeset
|
425 |
case 6: return g->last_speed; |
bde65debf648
(svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents:
3743
diff
changeset
|
426 |
case 7: return g->last_age; |
bde65debf648
(svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents:
3743
diff
changeset
|
427 |
} |
bde65debf648
(svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents:
3743
diff
changeset
|
428 |
} |
bde65debf648
(svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents:
3743
diff
changeset
|
429 |
|
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5172
diff
changeset
|
430 |
DEBUG(grf, 1, "Unhandled station property 0x%X", variable); |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
431 |
|
3893
46169364701b
(svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents:
3834
diff
changeset
|
432 |
*available = false; |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
433 |
return -1; |
2967
4208a82bf0d9
(svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents:
2963
diff
changeset
|
434 |
} |
4208a82bf0d9
(svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents:
2963
diff
changeset
|
435 |
|
4208a82bf0d9
(svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents:
2963
diff
changeset
|
436 |
|
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
437 |
static const SpriteGroup *StationResolveReal(const ResolverObject *object, const SpriteGroup *group) |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
438 |
{ |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
439 |
const Station *st = object->u.station.st; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
440 |
const StationSpec *statspec = object->u.station.statspec; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
441 |
uint set; |
2967
4208a82bf0d9
(svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents:
2963
diff
changeset
|
442 |
|
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
443 |
uint cargo = 0; |
4817
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
444 |
CargoID cargo_type = object->u.station.cargo_type; |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
445 |
|
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
446 |
if (st == NULL || statspec->sclass == STAT_CLASS_WAYP) { |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
447 |
return group->g.real.loading[0]; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
448 |
} |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
449 |
|
4817
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
450 |
switch (cargo_type) { |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
451 |
case GC_INVALID: |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
452 |
case GC_DEFAULT_NA: |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
453 |
case GC_PURCHASE: |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
454 |
cargo = 0; |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
455 |
break; |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
456 |
|
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
457 |
case GC_DEFAULT: |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
458 |
for (cargo_type = 0; cargo_type < NUM_CARGO; cargo_type++) { |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
459 |
cargo += GB(st->goods[cargo_type].waiting_acceptance, 0, 12); |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
460 |
} |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
461 |
break; |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
462 |
|
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
463 |
default: |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
464 |
cargo = GB(st->goods[_local_cargo_id_ctype[cargo_type]].waiting_acceptance, 0, 12); |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
465 |
break; |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
466 |
} |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
467 |
|
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
468 |
if (HASBIT(statspec->flags, 1)) cargo /= (st->trainst_w + st->trainst_h); |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
469 |
cargo = min(0xfff, cargo); |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
470 |
|
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
471 |
if (cargo > statspec->cargo_threshold) { |
3749
96b36cc10188
(svn r4737) - Newstations: 'real' groups picked the wrong set of loading or loaded sprites
peter1138
parents:
3748
diff
changeset
|
472 |
if (group->g.real.num_loading > 0) { |
3787
a71d1c53e679
(svn r4783) - Newstations: fix graphical bug that affected some stations when a station has a high amount of cargo waiting.
peter1138
parents:
3786
diff
changeset
|
473 |
set = ((cargo - statspec->cargo_threshold) * group->g.real.num_loading) / (4096 - statspec->cargo_threshold); |
3749
96b36cc10188
(svn r4737) - Newstations: 'real' groups picked the wrong set of loading or loaded sprites
peter1138
parents:
3748
diff
changeset
|
474 |
return group->g.real.loading[set]; |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
475 |
} |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
476 |
} else { |
3749
96b36cc10188
(svn r4737) - Newstations: 'real' groups picked the wrong set of loading or loaded sprites
peter1138
parents:
3748
diff
changeset
|
477 |
if (group->g.real.num_loaded > 0) { |
96b36cc10188
(svn r4737) - Newstations: 'real' groups picked the wrong set of loading or loaded sprites
peter1138
parents:
3748
diff
changeset
|
478 |
set = (cargo * group->g.real.num_loaded) / (statspec->cargo_threshold + 1); |
96b36cc10188
(svn r4737) - Newstations: 'real' groups picked the wrong set of loading or loaded sprites
peter1138
parents:
3748
diff
changeset
|
479 |
return group->g.real.loaded[set]; |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
480 |
} |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
481 |
} |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
482 |
|
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
483 |
return group->g.real.loading[0]; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
484 |
} |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
485 |
|
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
486 |
|
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
487 |
static void NewStationResolver(ResolverObject *res, const StationSpec *statspec, const Station *st, TileIndex tile) |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
488 |
{ |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
489 |
res->GetRandomBits = StationGetRandomBits; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
490 |
res->GetTriggers = StationGetTriggers; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
491 |
res->SetTriggers = StationSetTriggers; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
492 |
res->GetVariable = StationGetVariable; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
493 |
res->ResolveReal = StationResolveReal; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
494 |
|
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
495 |
res->u.station.st = st; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
496 |
res->u.station.statspec = statspec; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
497 |
res->u.station.tile = tile; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
498 |
|
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
499 |
res->callback = 0; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
500 |
res->callback_param1 = 0; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
501 |
res->callback_param2 = 0; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
502 |
res->last_value = 0; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
503 |
res->trigger = 0; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
504 |
res->reseed = 0; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
505 |
} |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
506 |
|
4817
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
507 |
static const SpriteGroup *ResolveStation(const StationSpec *statspec, const Station *st, ResolverObject *object) |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
508 |
{ |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
509 |
const SpriteGroup *group; |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
510 |
CargoID ctype = GC_DEFAULT_NA; |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
511 |
|
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
512 |
if (st == NULL) { |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
513 |
/* No station, so we are in a purchase list */ |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
514 |
ctype = GC_PURCHASE; |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
515 |
} else { |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
516 |
CargoID cargo; |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
517 |
|
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
518 |
/* Pick the first cargo that we have waiting */ |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
519 |
for (cargo = 0; cargo < NUM_GLOBAL_CID; cargo++) { |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
520 |
CargoID lcid = _local_cargo_id_ctype[cargo]; |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
521 |
if (lcid != CT_INVALID && statspec->spritegroup[cargo] != NULL && GB(st->goods[lcid].waiting_acceptance, 0, 12) != 0) { |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
522 |
ctype = cargo; |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
523 |
break; |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
524 |
} |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
525 |
} |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
526 |
} |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
527 |
|
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
528 |
group = statspec->spritegroup[ctype]; |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
529 |
if (group == NULL) { |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
530 |
ctype = GC_DEFAULT; |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
531 |
group = statspec->spritegroup[ctype]; |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
532 |
} |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
533 |
|
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
534 |
if (group == NULL) return NULL; |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
535 |
|
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
536 |
/* Remember the cargo type we've picked */ |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
537 |
object->u.station.cargo_type = ctype; |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
538 |
|
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
539 |
return Resolve(group, object); |
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
540 |
} |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
541 |
|
3751
785501c18d0d
(svn r4739) - Newstations: remove cargo type parameter of GetCustomStationRelocation() as we can determine it internally
peter1138
parents:
3750
diff
changeset
|
542 |
SpriteID GetCustomStationRelocation(const StationSpec *statspec, const Station *st, TileIndex tile) |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
543 |
{ |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
544 |
const SpriteGroup *group; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
545 |
ResolverObject object; |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
546 |
|
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
547 |
NewStationResolver(&object, statspec, st, tile); |
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
548 |
|
4817
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
549 |
group = ResolveStation(statspec, st, &object); |
3743
c6efbe2e3a28
(svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents:
3741
diff
changeset
|
550 |
if (group == NULL || group->type != SGT_RESULT) return 0; |
3775
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
551 |
return group->g.result.sprite - 0x42D; |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
552 |
} |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
553 |
|
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
554 |
|
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
555 |
SpriteID GetCustomStationGroundRelocation(const StationSpec *statspec, const Station *st, TileIndex tile) |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
556 |
{ |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
557 |
const SpriteGroup *group; |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
558 |
ResolverObject object; |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
559 |
|
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
560 |
NewStationResolver(&object, statspec, st, tile); |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
561 |
object.callback_param1 = 1; /* Indicate we are resolving the ground sprite */ |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
562 |
|
4817
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
563 |
group = ResolveStation(statspec, st, &object); |
3775
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
564 |
if (group == NULL || group->type != SGT_RESULT) return 0; |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
565 |
return group->g.result.sprite - 0x42D; |
2967
4208a82bf0d9
(svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents:
2963
diff
changeset
|
566 |
} |
3587 | 567 |
|
568 |
||
3752
a7cdd7c0c928
(svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents:
3751
diff
changeset
|
569 |
uint16 GetStationCallback(uint16 callback, uint32 param1, uint32 param2, const StationSpec *statspec, const Station *st, TileIndex tile) |
a7cdd7c0c928
(svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents:
3751
diff
changeset
|
570 |
{ |
a7cdd7c0c928
(svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents:
3751
diff
changeset
|
571 |
const SpriteGroup *group; |
a7cdd7c0c928
(svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents:
3751
diff
changeset
|
572 |
ResolverObject object; |
a7cdd7c0c928
(svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents:
3751
diff
changeset
|
573 |
|
a7cdd7c0c928
(svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents:
3751
diff
changeset
|
574 |
NewStationResolver(&object, statspec, st, tile); |
a7cdd7c0c928
(svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents:
3751
diff
changeset
|
575 |
|
a7cdd7c0c928
(svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents:
3751
diff
changeset
|
576 |
object.callback = callback; |
a7cdd7c0c928
(svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents:
3751
diff
changeset
|
577 |
object.callback_param1 = param1; |
a7cdd7c0c928
(svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents:
3751
diff
changeset
|
578 |
object.callback_param2 = param2; |
a7cdd7c0c928
(svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents:
3751
diff
changeset
|
579 |
|
4817
413372173231
(svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents:
4331
diff
changeset
|
580 |
group = ResolveStation(statspec, st, &object); |
3752
a7cdd7c0c928
(svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents:
3751
diff
changeset
|
581 |
if (group == NULL || group->type != SGT_CALLBACK) return CALLBACK_FAILED; |
a7cdd7c0c928
(svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents:
3751
diff
changeset
|
582 |
return group->g.callback.result; |
a7cdd7c0c928
(svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents:
3751
diff
changeset
|
583 |
} |
a7cdd7c0c928
(svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents:
3751
diff
changeset
|
584 |
|
a7cdd7c0c928
(svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents:
3751
diff
changeset
|
585 |
|
3587 | 586 |
/** |
587 |
* Allocate a StationSpec to a Station. This is called once per build operation. |
|
588 |
* @param spec StationSpec to allocate. |
|
589 |
* @param st Station to allocate it to. |
|
590 |
* @param exec Whether to actually allocate the spec. |
|
591 |
* @return Index within the Station's spec list, or -1 if the allocation failed. |
|
592 |
*/ |
|
3676
48444d881fbe
(svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents:
3668
diff
changeset
|
593 |
int AllocateSpecToStation(const StationSpec *statspec, Station *st, bool exec) |
3587 | 594 |
{ |
595 |
uint i; |
|
596 |
||
3676
48444d881fbe
(svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents:
3668
diff
changeset
|
597 |
if (statspec == NULL) return 0; |
3587 | 598 |
|
599 |
/* Check if this spec has already been allocated */ |
|
3786
73784d02aa69
(svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents:
3780
diff
changeset
|
600 |
for (i = 1; i < st->num_specs && i < MAX_SPECLIST; i++) { |
3676
48444d881fbe
(svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents:
3668
diff
changeset
|
601 |
if (st->speclist[i].spec == statspec) return i; |
3587 | 602 |
} |
603 |
||
3786
73784d02aa69
(svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents:
3780
diff
changeset
|
604 |
for (i = 1; i < st->num_specs && i < MAX_SPECLIST; i++) { |
3587 | 605 |
if (st->speclist[i].spec == NULL && st->speclist[i].grfid == 0) break; |
606 |
} |
|
607 |
||
3786
73784d02aa69
(svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents:
3780
diff
changeset
|
608 |
if (i == MAX_SPECLIST) return -1; |
3587 | 609 |
|
3730
1aca9dabaeea
(svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents:
3676
diff
changeset
|
610 |
if (exec) { |
1aca9dabaeea
(svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents:
3676
diff
changeset
|
611 |
if (i >= st->num_specs) { |
1aca9dabaeea
(svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents:
3676
diff
changeset
|
612 |
st->num_specs = i + 1; |
1aca9dabaeea
(svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents:
3676
diff
changeset
|
613 |
st->speclist = realloc(st->speclist, st->num_specs * sizeof(*st->speclist)); |
1aca9dabaeea
(svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents:
3676
diff
changeset
|
614 |
|
1aca9dabaeea
(svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents:
3676
diff
changeset
|
615 |
if (st->num_specs == 2) { |
1aca9dabaeea
(svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents:
3676
diff
changeset
|
616 |
/* Initial allocation */ |
1aca9dabaeea
(svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents:
3676
diff
changeset
|
617 |
st->speclist[0].spec = NULL; |
1aca9dabaeea
(svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents:
3676
diff
changeset
|
618 |
st->speclist[0].grfid = 0; |
1aca9dabaeea
(svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents:
3676
diff
changeset
|
619 |
st->speclist[0].localidx = 0; |
3587 | 620 |
} |
3730
1aca9dabaeea
(svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents:
3676
diff
changeset
|
621 |
} |
3587 | 622 |
|
3730
1aca9dabaeea
(svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents:
3676
diff
changeset
|
623 |
st->speclist[i].spec = statspec; |
1aca9dabaeea
(svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents:
3676
diff
changeset
|
624 |
st->speclist[i].grfid = statspec->grfid; |
1aca9dabaeea
(svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents:
3676
diff
changeset
|
625 |
st->speclist[i].localidx = statspec->localidx; |
3587 | 626 |
} |
627 |
||
3730
1aca9dabaeea
(svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents:
3676
diff
changeset
|
628 |
return i; |
3587 | 629 |
} |
630 |
||
631 |
||
632 |
/** Deallocate a StationSpec from a Station. Called when removing a single station tile. |
|
633 |
* @param st Station to work with. |
|
634 |
* @param specindex Index of the custom station within the Station's spec list. |
|
635 |
* @return Indicates whether the StationSpec was deallocated. |
|
636 |
*/ |
|
4190
24d5420b6242
(svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents:
4182
diff
changeset
|
637 |
void DeallocateSpecFromStation(Station* st, byte specindex) |
3587 | 638 |
{ |
639 |
/* specindex of 0 (default) is never freeable */ |
|
4190
24d5420b6242
(svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents:
4182
diff
changeset
|
640 |
if (specindex == 0) return; |
3587 | 641 |
|
642 |
/* Check all tiles over the station to check if the specindex is still in use */ |
|
643 |
BEGIN_TILE_LOOP(tile, st->trainst_w, st->trainst_h, st->train_tile) { |
|
644 |
if (IsTileType(tile, MP_STATION) && GetStationIndex(tile) == st->index && IsRailwayStation(tile) && GetCustomStationSpecIndex(tile) == specindex) { |
|
4190
24d5420b6242
(svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents:
4182
diff
changeset
|
645 |
return; |
3587 | 646 |
} |
647 |
} END_TILE_LOOP(tile, st->trainst_w, st->trainst_h, st->train_tile) |
|
648 |
||
4190
24d5420b6242
(svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents:
4182
diff
changeset
|
649 |
/* This specindex is no longer in use, so deallocate it */ |
24d5420b6242
(svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents:
4182
diff
changeset
|
650 |
st->speclist[specindex].spec = NULL; |
24d5420b6242
(svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents:
4182
diff
changeset
|
651 |
st->speclist[specindex].grfid = 0; |
24d5420b6242
(svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents:
4182
diff
changeset
|
652 |
st->speclist[specindex].localidx = 0; |
3587 | 653 |
|
4190
24d5420b6242
(svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents:
4182
diff
changeset
|
654 |
/* If this was the highest spec index, reallocate */ |
24d5420b6242
(svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents:
4182
diff
changeset
|
655 |
if (specindex == st->num_specs - 1) { |
24d5420b6242
(svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents:
4182
diff
changeset
|
656 |
for (; st->speclist[st->num_specs - 1].grfid == 0 && st->num_specs > 1; st->num_specs--); |
3587 | 657 |
|
4190
24d5420b6242
(svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents:
4182
diff
changeset
|
658 |
if (st->num_specs > 1) { |
24d5420b6242
(svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents:
4182
diff
changeset
|
659 |
st->speclist = realloc(st->speclist, st->num_specs * sizeof(*st->speclist)); |
24d5420b6242
(svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents:
4182
diff
changeset
|
660 |
} else { |
24d5420b6242
(svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents:
4182
diff
changeset
|
661 |
free(st->speclist); |
24d5420b6242
(svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents:
4182
diff
changeset
|
662 |
st->num_specs = 0; |
24d5420b6242
(svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents:
4182
diff
changeset
|
663 |
st->speclist = NULL; |
3587 | 664 |
} |
665 |
} |
|
666 |
} |
|
3764
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
667 |
|
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
668 |
/** Draw representation of a station tile for GUI purposes. |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
669 |
* @param x, y Position of image. |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
670 |
* @param dir Direction. |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
671 |
* @param railtype Rail type. |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
672 |
* @param sclass, station Type of station. |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
673 |
* @return True if the tile was drawn (allows for fallback to default graphic) |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
674 |
*/ |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
675 |
bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID sclass, uint station) |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
676 |
{ |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
677 |
const StationSpec *statspec; |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
678 |
const DrawTileSprites *sprites; |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
679 |
const DrawTileSeqStruct *seq; |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
680 |
const RailtypeInfo *rti = GetRailTypeInfo(railtype); |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
681 |
SpriteID relocation; |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
682 |
PalSpriteID image; |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
683 |
PalSpriteID colourmod = SPRITE_PALETTE(PLAYER_SPRITE_COLOR(_local_player)); |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
684 |
uint tile = 2; |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
685 |
|
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
686 |
statspec = GetCustomStationSpec(sclass, station); |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
687 |
if (statspec == NULL) return false; |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
688 |
|
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
689 |
relocation = GetCustomStationRelocation(statspec, NULL, INVALID_TILE); |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
690 |
|
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
691 |
if (HASBIT(statspec->callbackmask, CBM_CUSTOM_LAYOUT)) { |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
692 |
uint16 callback = GetStationCallback(CBID_STATION_SPRITE_LAYOUT, 0x2110000, 0, statspec, NULL, INVALID_TILE); |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
693 |
if (callback != CALLBACK_FAILED) tile = callback; |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
694 |
} |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
695 |
|
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
696 |
if (statspec->renderdata == NULL) { |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
697 |
sprites = GetStationTileLayout(tile + axis); |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
698 |
} else { |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
699 |
sprites = &statspec->renderdata[(tile < statspec->tiles) ? tile + axis : axis]; |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
700 |
} |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
701 |
|
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
702 |
image = sprites->ground_sprite; |
3775
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
703 |
if (HASBIT(image, 31)) { |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
704 |
CLRBIT(image, 31); |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
705 |
image += GetCustomStationGroundRelocation(statspec, NULL, INVALID_TILE); |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
706 |
image += rti->custom_ground_offset; |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
707 |
} else { |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
708 |
image += rti->total_offset; |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
709 |
} |
3764
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
710 |
|
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
711 |
if (image & PALETTE_MODIFIER_COLOR) image &= SPRITE_MASK; |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
712 |
DrawSprite(image, x, y); |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
713 |
|
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
714 |
foreach_draw_tile_seq(seq, sprites->seq) { |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
715 |
Point pt; |
3775
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
716 |
image = seq->image; |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
717 |
if (HASBIT(image, 30)) { |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
718 |
CLRBIT(image, 30); |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
719 |
image += rti->total_offset; |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
720 |
} else { |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
721 |
image += relocation; |
f3f1ba3111fa
(svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents:
3766
diff
changeset
|
722 |
} |
3764
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
723 |
|
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
724 |
if ((byte)seq->delta_z != 0x80) { |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
725 |
pt = RemapCoords(seq->delta_x, seq->delta_y, seq->delta_z); |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
726 |
DrawSprite((image & SPRITE_MASK) | colourmod, x + pt.x, y + pt.y); |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
727 |
} |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
728 |
} |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
729 |
|
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
730 |
return true; |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
731 |
} |
ebcaf412fb3a
(svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents:
3758
diff
changeset
|
732 |
|
4206
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
733 |
|
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
734 |
static const StationSpec* GetStationSpec(TileIndex t) |
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
735 |
{ |
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
736 |
const Station* st; |
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
737 |
uint specindex; |
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
738 |
|
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
739 |
if (!IsCustomStationSpecIndex(t)) return NULL; |
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
740 |
|
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
741 |
st = GetStationByTile(t); |
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
742 |
specindex = GetCustomStationSpecIndex(t); |
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
743 |
return specindex < st->num_specs ? st->speclist[specindex].spec : NULL; |
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
744 |
} |
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
745 |
|
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
746 |
|
3766
f0077e6b6f99
(svn r4758) - Newstations: add support for 'blocked' station tiles, which no train can pass.
peter1138
parents:
3765
diff
changeset
|
747 |
/* Check if a rail station tile is traversable. |
f0077e6b6f99
(svn r4758) - Newstations: add support for 'blocked' station tiles, which no train can pass.
peter1138
parents:
3765
diff
changeset
|
748 |
* XXX This could be cached (during build) in the map array to save on all the dereferencing */ |
f0077e6b6f99
(svn r4758) - Newstations: add support for 'blocked' station tiles, which no train can pass.
peter1138
parents:
3765
diff
changeset
|
749 |
bool IsStationTileBlocked(TileIndex tile) |
f0077e6b6f99
(svn r4758) - Newstations: add support for 'blocked' station tiles, which no train can pass.
peter1138
parents:
3765
diff
changeset
|
750 |
{ |
4206
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
751 |
const StationSpec* statspec = GetStationSpec(tile); |
3766
f0077e6b6f99
(svn r4758) - Newstations: add support for 'blocked' station tiles, which no train can pass.
peter1138
parents:
3765
diff
changeset
|
752 |
|
4206
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
753 |
return statspec != NULL && HASBIT(statspec->blocked, GetStationGfx(tile)); |
3766
f0077e6b6f99
(svn r4758) - Newstations: add support for 'blocked' station tiles, which no train can pass.
peter1138
parents:
3765
diff
changeset
|
754 |
} |
3789
bf75e48227de
(svn r4785) - Newstations: don't draw catenary on non-track tiles
glx
parents:
3787
diff
changeset
|
755 |
|
bf75e48227de
(svn r4785) - Newstations: don't draw catenary on non-track tiles
glx
parents:
3787
diff
changeset
|
756 |
/* Check if a rail station tile is electrifiable. |
bf75e48227de
(svn r4785) - Newstations: don't draw catenary on non-track tiles
glx
parents:
3787
diff
changeset
|
757 |
* XXX This could be cached (during build) in the map array to save on all the dereferencing */ |
bf75e48227de
(svn r4785) - Newstations: don't draw catenary on non-track tiles
glx
parents:
3787
diff
changeset
|
758 |
bool IsStationTileElectrifiable(TileIndex tile) |
bf75e48227de
(svn r4785) - Newstations: don't draw catenary on non-track tiles
glx
parents:
3787
diff
changeset
|
759 |
{ |
4206
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
760 |
const StationSpec* statspec = GetStationSpec(tile); |
3789
bf75e48227de
(svn r4785) - Newstations: don't draw catenary on non-track tiles
glx
parents:
3787
diff
changeset
|
761 |
|
4206
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
762 |
return |
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
763 |
statspec == NULL || |
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
764 |
HASBIT(statspec->pylons, GetStationGfx(tile)) || |
599a0c60e964
(svn r5690) Factor common code to reduce code duplication
tron
parents:
4205
diff
changeset
|
765 |
!HASBIT(statspec->wires, GetStationGfx(tile)); |
3789
bf75e48227de
(svn r4785) - Newstations: don't draw catenary on non-track tiles
glx
parents:
3787
diff
changeset
|
766 |
} |