src/newgrf_station.cpp
author celestar
Wed, 13 Jun 2007 11:00:24 +0000
branchgamebalance
changeset 9909 dce9a6923bb7
parent 9908 0fa543611bbe
child 9912 1ac8aac92385
permissions -rw-r--r--
(svn r10133) [gamebalance] -Sync: r9620:9670 from trunk
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
6443
b8f06d8eb7be (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6439
diff changeset
     3
/** @file newgrf_station.cpp 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"
9906
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
     9
#include "landscape.h"
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    10
#include "debug.h"
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    11
#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
    12
#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
    13
#include "table/strings.h"
2967
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
    14
#include "station.h"
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
    15
#include "station_map.h"
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5172
diff changeset
    16
#include "newgrf.h"
3752
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
    17
#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
    18
#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
    19
#include "newgrf_spritegroup.h"
4261
2ec8f5a9747b (svn r5887) -Cleanup: move date related functions, defines and variables to date.[ch]
rubidium
parents: 4206
diff changeset
    20
#include "date.h"
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    21
#include "helpers.hpp"
6439
99a5807852b1 (svn r8849) -Codechange: Replace hardcoded global/climate cargo mapping tables with dynamically generated data. Change associated code to use new functions.
peter1138
parents: 6432
diff changeset
    22
#include "cargotype.h"
9906
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
    23
#include "town_map.h"
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
    24
#include "newgrf_town.h"
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    25
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    26
static StationClass station_classes[STAT_CLASS_MAX];
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    27
3786
73784d02aa69 (svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents: 3780
diff changeset
    28
enum {
73784d02aa69 (svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents: 3780
diff changeset
    29
	MAX_SPECLIST = 255,
73784d02aa69 (svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents: 3780
diff changeset
    30
};
73784d02aa69 (svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents: 3780
diff changeset
    31
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    32
/**
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    33
 * Reset station classes to their default state.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    34
 * 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
    35
 * entry, for standard stations and waypoints.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    36
 */
9895
7bd07f43b0e3 (svn r9321) [gamebalance] -Sync: r9025:9314 from trunk
celestar
parents: 6474
diff changeset
    37
void ResetStationClasses()
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    38
{
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    39
	for (StationClassID i = STAT_CLASS_BEGIN; i < STAT_CLASS_MAX; i++) {
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    40
		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
    41
		station_classes[i].name = STR_EMPTY;
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    42
		station_classes[i].stations = 0;
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
		free(station_classes[i].spec);
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    45
		station_classes[i].spec = NULL;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    46
	}
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    47
9906
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
    48
	/* Set up initial data */
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    49
	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
    50
	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
    51
	station_classes[0].stations = 1;
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5838
diff changeset
    52
	station_classes[0].spec = MallocT<StationSpec*>(1);
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    53
	station_classes[0].spec[0] = NULL;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    54
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    55
	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
    56
	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
    57
	station_classes[1].stations = 1;
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5838
diff changeset
    58
	station_classes[1].spec = MallocT<StationSpec*>(1);
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    59
	station_classes[1].spec[0] = NULL;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    60
}
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    61
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
 * Allocate a station class for the given class id.
9909
dce9a6923bb7 (svn r10133) [gamebalance] -Sync: r9620:9670 from trunk
celestar
parents: 9908
diff changeset
    64
 * @param cls A 32 bit value identifying the class.
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    65
 * @return Index into station_classes of allocated class.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    66
 */
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    67
StationClassID AllocateStationClass(uint32 cls)
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    68
{
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    69
	for (StationClassID i = STAT_CLASS_BEGIN; i < STAT_CLASS_MAX; i++) {
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    70
		if (station_classes[i].id == cls) {
9906
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
    71
			/* ClassID is already allocated, so reuse it. */
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    72
			return i;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    73
		} else if (station_classes[i].id == 0) {
9906
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
    74
			/* This class is empty, so allocate it to the ClassID. */
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    75
			station_classes[i].id = cls;
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    76
			return i;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    77
		}
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    78
	}
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    79
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5172
diff changeset
    80
	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
    81
	return STAT_CLASS_DFLT;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    82
}
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    83
3642
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    84
/** Set the name of a custom station class */
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    85
void SetStationClassName(StationClassID sclass, StringID name)
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    86
{
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    87
	assert(sclass < STAT_CLASS_MAX);
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    88
	station_classes[sclass].name = name;
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    89
}
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    90
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    91
/** Retrieve the name of a custom station class */
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    92
StringID GetStationClassName(StationClassID sclass)
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    93
{
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    94
	assert(sclass < STAT_CLASS_MAX);
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    95
	return station_classes[sclass].name;
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    96
}
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    97
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    98
/** 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
    99
 * @return Pointer to a (static) array of StringIDs
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   100
 */
9895
7bd07f43b0e3 (svn r9321) [gamebalance] -Sync: r9025:9314 from trunk
celestar
parents: 6474
diff changeset
   101
StringID *BuildStationClassDropdown()
3642
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   102
{
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   103
	/* Allow room for all station classes, plus a terminator entry */
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   104
	static StringID names[STAT_CLASS_MAX + 1];
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   105
	uint i;
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   106
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   107
	/* Add each name */
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   108
	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
   109
		names[i] = station_classes[i].name;
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   110
	}
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   111
	/* Terminate the list */
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   112
	names[i] = INVALID_STRING_ID;
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
	return names;
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   115
}
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   116
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   117
/**
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   118
 * Get the number of station classes in use.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   119
 * @return Number of station classes.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   120
 */
9895
7bd07f43b0e3 (svn r9321) [gamebalance] -Sync: r9025:9314 from trunk
celestar
parents: 6474
diff changeset
   121
uint GetNumStationClasses()
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   122
{
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   123
	uint i;
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   124
	for (i = 0; i < STAT_CLASS_MAX && station_classes[i].id != 0; i++);
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   125
	return i;
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   126
}
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   127
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   128
/**
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   129
 * 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
   130
 * @param sclass Index of the station class.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   131
 * @return Number of stations in the class.
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
uint GetNumCustomStations(StationClassID sclass)
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   134
{
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   135
	assert(sclass < STAT_CLASS_MAX);
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   136
	return station_classes[sclass].stations;
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
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   139
/**
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   140
 * Tie a station spec to its station class.
9909
dce9a6923bb7 (svn r10133) [gamebalance] -Sync: r9620:9670 from trunk
celestar
parents: 9908
diff changeset
   141
 * @param statspec The station spec.
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   142
 */
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3668
diff changeset
   143
void SetCustomStationSpec(StationSpec *statspec)
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   144
{
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   145
	StationClass *station_class;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   146
	int i;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   147
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
   148
	/* 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
   149
	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
   150
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3668
diff changeset
   151
	assert(statspec->sclass < STAT_CLASS_MAX);
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3668
diff changeset
   152
	station_class = &station_classes[statspec->sclass];
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   153
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   154
	i = station_class->stations++;
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5838
diff changeset
   155
	station_class->spec = ReallocT(station_class->spec, station_class->stations);
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   156
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3668
diff changeset
   157
	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
   158
	statspec->allocated = true;
2625
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
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   161
/**
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   162
 * Retrieve a station spec from a class.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   163
 * @param sclass Index of the station class.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   164
 * @param station The station index with the class.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   165
 * @return The station spec.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   166
 */
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3668
diff changeset
   167
const StationSpec *GetCustomStationSpec(StationClassID sclass, uint station)
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   168
{
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   169
	assert(sclass < STAT_CLASS_MAX);
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   170
	if (station < station_classes[sclass].stations)
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   171
		return station_classes[sclass].spec[station];
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   172
9906
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   173
	/* If the custom station isn't defined any more, then the GRF file
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   174
	 * probably was not loaded. */
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   175
	return NULL;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   176
}
2967
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   177
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   178
3765
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   179
const StationSpec *GetCustomStationSpecByGrf(uint32 grfid, byte localidx)
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   180
{
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   181
	uint j;
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   182
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   183
	for (StationClassID i = STAT_CLASS_BEGIN; i < STAT_CLASS_MAX; i++) {
3765
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   184
		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
   185
			const StationSpec *statspec = station_classes[i].spec[j];
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   186
			if (statspec == NULL) continue;
9908
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   187
			if (statspec->grffile->grfid == grfid && statspec->localidx == localidx) return statspec;
3765
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
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   191
	return NULL;
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
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   194
3756
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   195
/* 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
   196
 * 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
   197
 * 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
   198
 * 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
   199
 * 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
   200
 * 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
   201
 */
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   202
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
   203
{
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   204
	uint32 retval = 0;
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   205
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   206
	if (axis == AXIS_X) {
6432
8fb778a7f2d7 (svn r8841) -Fix
tron
parents: 6100
diff changeset
   207
		Swap(platforms, length);
8fb778a7f2d7 (svn r8841) -Fix
tron
parents: 6100
diff changeset
   208
		Swap(x, y);
3756
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
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   211
	/* 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
   212
	platforms = min(15, platforms);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   213
	length    = min(15, length);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   214
	x = min(15, x);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   215
	y = min(15, y);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   216
	if (centred) {
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   217
		x -= platforms / 2;
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   218
		y -= length / 2;
3790
66700f2c57a9 (svn r4786) - Newstations: in GetPlatformInfo() ensure negative values are only four bits
peter1138
parents: 3789
diff changeset
   219
		SB(retval,  0, 4, y & 0xF);
66700f2c57a9 (svn r4786) - Newstations: in GetPlatformInfo() ensure negative values are only four bits
peter1138
parents: 3789
diff changeset
   220
		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
   221
	} else {
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   222
		SB(retval,  0, 4, y);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   223
		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
   224
		SB(retval,  8, 4, x);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   225
		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
   226
	}
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   227
	SB(retval, 16, 4, length);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   228
	SB(retval, 20, 4, platforms);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   229
	SB(retval, 24, 4, tile);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   230
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   231
	return retval;
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
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   235
/* 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
   236
 * 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
   237
 * 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
   238
 */
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   239
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
   240
{
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   241
	bool waypoint;
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   242
	byte orig_type = 0;
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   243
	Axis orig_axis = AXIS_X;
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   244
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   245
	waypoint = IsTileType(tile, MP_RAILWAY);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   246
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   247
	if (waypoint) {
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   248
		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
   249
	} else {
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   250
		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
   251
		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
   252
	}
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   253
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   254
	while (true) {
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   255
		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
   256
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   257
		if (waypoint) {
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   258
			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
   259
			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
   260
			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
   261
		} else {
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   262
			if (!IsRailwayStationTile(new_tile)) break;
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   263
			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
   264
			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
   265
		}
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   266
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   267
		tile = new_tile;
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   268
	}
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   269
	return tile;
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
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   273
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
   274
{
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   275
	int tx = TileX(tile);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   276
	int ty = TileY(tile);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   277
	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
   278
	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
   279
	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
   280
	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
   281
	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
   282
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   283
	tx -= sx; ex -= sx;
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   284
	ty -= sy; ey -= sy;
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   285
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   286
	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
   287
}
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   288
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   289
5660
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   290
static uint32 GetRailContinuationInfo(TileIndex tile)
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   291
{
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   292
	/* Tile offsets and exit dirs for X axis */
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   293
	static Direction x_dir[8] = { DIR_SW, DIR_NE, DIR_SE, DIR_NW, DIR_S, DIR_E, DIR_W, DIR_N };
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   294
	static DiagDirection x_exits[8] = { DIAGDIR_SW, DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NE, DIAGDIR_SW, DIAGDIR_NE };
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   295
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   296
	/* Tile offsets and exit dirs for Y axis */
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   297
	static Direction y_dir[8] = { DIR_SE, DIR_NW, DIR_SW, DIR_NE, DIR_S, DIR_W, DIR_E, DIR_N };
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   298
	static DiagDirection y_exits[8] = { DIAGDIR_SE, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_NW, DIAGDIR_SE, DIAGDIR_NW };
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   299
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   300
	Axis axis = IsTileType(tile, MP_RAILWAY) ? GetWaypointAxis(tile) : GetRailStationAxis(tile);
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   301
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   302
	/* Choose appropriate lookup table to use */
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   303
	Direction *dir = axis == AXIS_X ? x_dir : y_dir;
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   304
	DiagDirection *diagdir = axis == AXIS_X ? x_exits : y_exits;
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   305
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   306
	uint32 res = 0;
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   307
	uint i;
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   308
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   309
	for (i = 0; i < lengthof(x_dir); i++, dir++, diagdir++) {
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   310
		uint32 ts = GetTileTrackStatus(tile + TileOffsByDir(*dir), TRANSPORT_RAIL);
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   311
		if (ts != 0) {
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   312
			/* If there is any track on the tile, set the bit in the second byte */
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   313
			SETBIT(res, i + 8);
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   314
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   315
			/* If any track reaches our exit direction, set the bit in the lower byte */
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   316
			if (ts & DiagdirReachesTracks(*diagdir)) SETBIT(res, i);
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   317
		}
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   318
	}
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   319
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   320
	return res;
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   321
}
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   322
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   323
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   324
/* 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
   325
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
   326
{
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   327
	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
   328
	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
   329
	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
   330
}
2967
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   331
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   332
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   333
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
   334
{
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   335
	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
   336
	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
   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
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   340
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
   341
{
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   342
	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
   343
	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
   344
	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
   345
}
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   346
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   347
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3834
diff changeset
   348
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
   349
{
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   350
	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
   351
	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
   352
9906
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   353
	if (object->scope == VSG_SCOPE_PARENT) {
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   354
		/* Pass the request on to the town of the station */
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   355
		Town *t;
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   356
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   357
		if (st != NULL) {
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   358
			t = st->town;
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   359
		} else if (tile != INVALID_TILE) {
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   360
			t = GetTownByTile(tile);
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   361
		} else {
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   362
			*available = false;
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   363
			return UINT_MAX;
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   364
		}
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   365
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   366
		return TownGetVariable(variable, parameter, available, t);
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   367
	}
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   368
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   369
	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
   370
		/* 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
   371
		switch (variable) {
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   372
			case 0x40:
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   373
			case 0x41:
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   374
			case 0x46:
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   375
			case 0x47:
9906
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   376
			case 0x49: return 0x2110000;       // Platforms, tracks & position
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   377
			case 0x42: return 0;               // Rail type (XXX Get current type from GUI?)
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   378
			case 0x43: return _current_player; // Station owner
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   379
			case 0x44: return 2;               // PBS status
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   380
			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
   381
		}
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3834
diff changeset
   382
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3834
diff changeset
   383
		*available = false;
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   384
		return UINT_MAX;
3743
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
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   387
	switch (variable) {
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   388
		/* Calculated station variables */
3756
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   389
		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
   390
		case 0x41: return GetPlatformInfoHelper(tile, true,  false, false);
9906
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   391
		case 0x42: // Terrain and rail type
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   392
			return ((_opt.landscape == LT_ARCTIC && GetTileZ(tile) > GetSnowLine()) ? 4 : 0) |
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   393
			       (_opt.landscape == LT_TROPIC ? GetTropicZone(tile) : 0) |
3758
1ec9e4e26a9f (svn r4749) - Newstations: add snowline support to variable 42.
peter1138
parents: 3756
diff changeset
   394
			       (GetRailType(tile) << 8);
9906
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   395
		case 0x43: return st->owner; // Station owner
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   396
		case 0x44: return 2;         // PBS status
5660
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   397
		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
   398
		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
   399
		case 0x47: return GetPlatformInfoHelper(tile, true,  false, true);
9906
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   400
		case 0x48: { // Accepted cargo types
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   401
			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
   402
			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
   403
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   404
			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
   405
				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
   406
			}
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   407
			return value;
2967
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   408
		}
3756
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   409
		case 0x49: return GetPlatformInfoHelper(tile, false, true, false);
2967
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   410
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   411
		/* Variables which use the parameter */
9908
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   412
		/* Variables 0x60 to 0x65 are handled separately below */
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   413
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   414
		/* 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
   415
		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
   416
		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
   417
		case 0x86: return 0;
3746
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   418
		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
   419
		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
   420
		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
   421
		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
   422
		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
   423
		case 0xF6: return st->airport_flags;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4817
diff changeset
   424
		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
   425
		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
   426
	}
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   427
9908
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   428
	/* Handle cargo variables with parameter, 0x60 to 0x65 */
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   429
	if (variable >= 0x60 && variable <= 0x65) {
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   430
		CargoID c = GetCargoTranslation(parameter, object->u.station.statspec->grffile);
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   431
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   432
		if (c == CT_INVALID) return 0;
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   433
		const GoodsEntry *ge = &st->goods[c];
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   434
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   435
		switch (variable) {
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   436
			case 0x60: return GB(ge->waiting_acceptance, 0, 12);
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   437
			case 0x61: return ge->days_since_pickup;
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   438
			case 0x62: return ge->rating;
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   439
			case 0x63: return ge->enroute_time;
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   440
			case 0x64: return ge->last_speed | (ge->last_age << 8);
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   441
			case 0x65: return GB(ge->waiting_acceptance, 12, 4);
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   442
		}
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   443
	}
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   444
3746
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   445
	/* Handle cargo variables (deprecated) */
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   446
	if (variable >= 0x8C && variable <= 0xEC) {
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   447
		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
   448
		switch (GB(variable - 0x8C, 0, 3)) {
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   449
			case 0: return g->waiting_acceptance;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4817
diff changeset
   450
			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
   451
			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
   452
			case 3: return g->rating;
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   453
			case 4: return g->enroute_from;
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   454
			case 5: return g->enroute_time;
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   455
			case 6: return g->last_speed;
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   456
			case 7: return g->last_age;
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   457
		}
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   458
	}
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   459
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5172
diff changeset
   460
	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
   461
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3834
diff changeset
   462
	*available = false;
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   463
	return UINT_MAX;
2967
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   464
}
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   465
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   466
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   467
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
   468
{
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   469
	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
   470
	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
   471
	uint set;
2967
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   472
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   473
	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
   474
	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
   475
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   476
	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
   477
		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
   478
	}
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   479
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
   480
	switch (cargo_type) {
6474
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6448
diff changeset
   481
		case CT_INVALID:
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6448
diff changeset
   482
		case CT_DEFAULT_NA:
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6448
diff changeset
   483
		case CT_PURCHASE:
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
   484
			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
   485
			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
   486
6474
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6448
diff changeset
   487
		case CT_DEFAULT:
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
   488
			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
   489
				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
   490
			}
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
   491
			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
   492
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
   493
		default:
6474
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6448
diff changeset
   494
			cargo = GB(st->goods[cargo_type].waiting_acceptance, 0, 12);
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
   495
			break;
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   496
	}
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   497
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   498
	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
   499
	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
   500
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   501
	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
   502
		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
   503
			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
   504
			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
   505
		}
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   506
	} else {
3749
96b36cc10188 (svn r4737) - Newstations: 'real' groups picked the wrong set of loading or loaded sprites
peter1138
parents: 3748
diff changeset
   507
		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
   508
			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
   509
			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
   510
		}
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   511
	}
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   512
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   513
	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
   514
}
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   515
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   516
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   517
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
   518
{
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   519
	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
   520
	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
   521
	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
   522
	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
   523
	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
   524
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   525
	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
   526
	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
   527
	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
   528
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   529
	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
   530
	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
   531
	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
   532
	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
   533
	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
   534
	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
   535
}
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   536
6100
280c81a05098 (svn r8423) -Fix
tron
parents: 6076
diff changeset
   537
static const SpriteGroup *ResolveStation(ResolverObject *object)
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
   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
	const SpriteGroup *group;
6474
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6448
diff changeset
   540
	CargoID ctype = CT_DEFAULT_NA;
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
   541
6100
280c81a05098 (svn r8423) -Fix
tron
parents: 6076
diff changeset
   542
	if (object->u.station.st == NULL) {
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
   543
		/* No station, so we are in a purchase list */
6474
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6448
diff changeset
   544
		ctype = CT_PURCHASE;
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
   545
	} 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
   546
		/* Pick the first cargo that we have waiting */
6439
99a5807852b1 (svn r8849) -Codechange: Replace hardcoded global/climate cargo mapping tables with dynamically generated data. Change associated code to use new functions.
peter1138
parents: 6432
diff changeset
   547
		for (CargoID cargo = 0; cargo < NUM_CARGO; cargo++) {
99a5807852b1 (svn r8849) -Codechange: Replace hardcoded global/climate cargo mapping tables with dynamically generated data. Change associated code to use new functions.
peter1138
parents: 6432
diff changeset
   548
			const CargoSpec *cs = GetCargo(cargo);
6474
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6448
diff changeset
   549
			if (cs->IsValid() && object->u.station.statspec->spritegroup[cargo] != NULL &&
6439
99a5807852b1 (svn r8849) -Codechange: Replace hardcoded global/climate cargo mapping tables with dynamically generated data. Change associated code to use new functions.
peter1138
parents: 6432
diff changeset
   550
					GB(object->u.station.st->goods[cargo].waiting_acceptance, 0, 12) != 0) {
6474
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6448
diff changeset
   551
				ctype = cargo;
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
   552
				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
   553
			}
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
   554
		}
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
   555
	}
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
   556
6100
280c81a05098 (svn r8423) -Fix
tron
parents: 6076
diff changeset
   557
	group = object->u.station.statspec->spritegroup[ctype];
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
   558
	if (group == NULL) {
6474
24e7ceeb25f5 (svn r8891) -Codechange: Remove remains of global cargo scheme. All cargo mapping is now dealt with only in NewGRF code, on load where possible.
peter1138
parents: 6448
diff changeset
   559
		ctype = CT_DEFAULT;
6100
280c81a05098 (svn r8423) -Fix
tron
parents: 6076
diff changeset
   560
		group = object->u.station.statspec->spritegroup[ctype];
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
   561
	}
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
   562
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
	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
   564
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
   565
	/* 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
   566
	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
   567
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
   568
	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
   569
}
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   570
3751
785501c18d0d (svn r4739) - Newstations: remove cargo type parameter of GetCustomStationRelocation() as we can determine it internally
peter1138
parents: 3750
diff changeset
   571
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
   572
{
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   573
	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
   574
	ResolverObject object;
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   575
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   576
	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
   577
6100
280c81a05098 (svn r8423) -Fix
tron
parents: 6076
diff changeset
   578
	group = ResolveStation(&object);
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   579
	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
   580
	return group->g.result.sprite - 0x42D;
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   581
}
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   582
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   583
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   584
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
   585
{
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   586
	const SpriteGroup *group;
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   587
	ResolverObject object;
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   588
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   589
	NewStationResolver(&object, statspec, st, tile);
9906
6f41b8713b65 (svn r9674) [gamebalance] -Sync: r9322:9420 from trunk
celestar
parents: 9895
diff changeset
   590
	object.callback_param1 = 1; // Indicate we are resolving the ground sprite
3775
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   591
6100
280c81a05098 (svn r8423) -Fix
tron
parents: 6076
diff changeset
   592
	group = ResolveStation(&object);
3775
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   593
	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
   594
	return group->g.result.sprite - 0x42D;
2967
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   595
}
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   596
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   597
3752
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   598
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
   599
{
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   600
	const SpriteGroup *group;
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   601
	ResolverObject object;
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   602
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   603
	NewStationResolver(&object, statspec, st, tile);
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   604
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   605
	object.callback        = callback;
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   606
	object.callback_param1 = param1;
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   607
	object.callback_param2 = param2;
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   608
6100
280c81a05098 (svn r8423) -Fix
tron
parents: 6076
diff changeset
   609
	group = ResolveStation(&object);
3752
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   610
	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
   611
	return group->g.callback.result;
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   612
}
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   613
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   614
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   615
/**
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   616
 * Allocate a StationSpec to a Station. This is called once per build operation.
9909
dce9a6923bb7 (svn r10133) [gamebalance] -Sync: r9620:9670 from trunk
celestar
parents: 9908
diff changeset
   617
 * @param statspec StationSpec to allocate.
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   618
 * @param st Station to allocate it to.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   619
 * @param exec Whether to actually allocate the spec.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   620
 * @return Index within the Station's spec list, or -1 if the allocation failed.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   621
 */
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3668
diff changeset
   622
int AllocateSpecToStation(const StationSpec *statspec, Station *st, bool exec)
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   623
{
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   624
	uint i;
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   625
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3668
diff changeset
   626
	if (statspec == NULL) return 0;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   627
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   628
	/* 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
   629
	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
   630
		if (st->speclist[i].spec == statspec) return i;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   631
	}
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   632
3786
73784d02aa69 (svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents: 3780
diff changeset
   633
	for (i = 1; i < st->num_specs && i < MAX_SPECLIST; i++) {
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   634
		if (st->speclist[i].spec == NULL && st->speclist[i].grfid == 0) break;
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   635
	}
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   636
3786
73784d02aa69 (svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents: 3780
diff changeset
   637
	if (i == MAX_SPECLIST) return -1;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   638
3730
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   639
	if (exec) {
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   640
		if (i >= st->num_specs) {
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   641
			st->num_specs = i + 1;
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5838
diff changeset
   642
			st->speclist = ReallocT(st->speclist, st->num_specs);
3730
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   643
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   644
			if (st->num_specs == 2) {
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   645
				/* Initial allocation */
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   646
				st->speclist[0].spec     = NULL;
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   647
				st->speclist[0].grfid    = 0;
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   648
				st->speclist[0].localidx = 0;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   649
			}
3730
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   650
		}
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   651
3730
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   652
		st->speclist[i].spec     = statspec;
9908
0fa543611bbe (svn r10112) [gamebalance] -Sync: r9520:9620 from trunk
celestar
parents: 9906
diff changeset
   653
		st->speclist[i].grfid    = statspec->grffile->grfid;
3730
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   654
		st->speclist[i].localidx = statspec->localidx;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   655
	}
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   656
3730
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   657
	return i;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   658
}
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   659
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   660
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   661
/** Deallocate a StationSpec from a Station. Called when removing a single station tile.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   662
 * @param st Station to work with.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   663
 * @param specindex Index of the custom station within the Station's spec list.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   664
 * @return Indicates whether the StationSpec was deallocated.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   665
 */
4190
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   666
void DeallocateSpecFromStation(Station* st, byte specindex)
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   667
{
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   668
	/* 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
   669
	if (specindex == 0) return;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   670
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   671
	/* Check all tiles over the station to check if the specindex is still in use */
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   672
	BEGIN_TILE_LOOP(tile, st->trainst_w, st->trainst_h, st->train_tile) {
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   673
		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
   674
			return;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   675
		}
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   676
	} END_TILE_LOOP(tile, st->trainst_w, st->trainst_h, st->train_tile)
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   677
4190
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   678
	/* 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
   679
	st->speclist[specindex].spec     = NULL;
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   680
	st->speclist[specindex].grfid    = 0;
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   681
	st->speclist[specindex].localidx = 0;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   682
4190
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   683
	/* 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
   684
	if (specindex == st->num_specs - 1) {
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   685
		for (; st->speclist[st->num_specs - 1].grfid == 0 && st->num_specs > 1; st->num_specs--);
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   686
4190
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   687
		if (st->num_specs > 1) {
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5838
diff changeset
   688
			st->speclist = ReallocT(st->speclist, st->num_specs);
4190
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   689
		} else {
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   690
			free(st->speclist);
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   691
			st->num_specs = 0;
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   692
			st->speclist  = NULL;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   693
		}
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   694
	}
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   695
}
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
   696
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
/** Draw representation of a station tile for GUI purposes.
9909
dce9a6923bb7 (svn r10133) [gamebalance] -Sync: r9620:9670 from trunk
celestar
parents: 9908
diff changeset
   698
 * @param x Position x of image.
dce9a6923bb7 (svn r10133) [gamebalance] -Sync: r9620:9670 from trunk
celestar
parents: 9908
diff changeset
   699
 * @param y Position y of image.
dce9a6923bb7 (svn r10133) [gamebalance] -Sync: r9620:9670 from trunk
celestar
parents: 9908
diff changeset
   700
 * @param axis Axis.
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
   701
 * @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
   702
 * @param sclass, station Type of station.
9909
dce9a6923bb7 (svn r10133) [gamebalance] -Sync: r9620:9670 from trunk
celestar
parents: 9908
diff changeset
   703
 * @param station station ID
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
   704
 * @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
   705
 */
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
   706
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
   707
{
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
   708
	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
   709
	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
   710
	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
   711
	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
   712
	SpriteID relocation;
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5860
diff changeset
   713
	SpriteID image;
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5860
diff changeset
   714
	SpriteID pal = PLAYER_SPRITE_COLOR(_local_player);
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
   715
	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
   716
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
   717
	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
   718
	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
   719
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
   720
	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
   721
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
   722
	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
   723
		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
   724
		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
   725
	}
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
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
	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
   728
		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
   729
	} else {
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   730
		sprites = &statspec->renderdata[(tile < statspec->tiles) ? tile + axis : (uint)axis];
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
   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
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
   733
	image = sprites->ground_sprite;
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5860
diff changeset
   734
	if (HASBIT(image, SPRITE_MODIFIER_USE_OFFSET)) {
3775
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   735
		image += GetCustomStationGroundRelocation(statspec, NULL, INVALID_TILE);
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   736
		image += rti->custom_ground_offset;
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   737
	} else {
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   738
		image += rti->total_offset;
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   739
	}
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
   740
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5860
diff changeset
   741
	DrawSprite(image, PAL_NONE, x, y);
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
   742
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
   743
	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
   744
		Point pt;
3775
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   745
		image = seq->image;
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5860
diff changeset
   746
		if (HASBIT(image, SPRITE_MODIFIER_USE_OFFSET)) {
3775
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   747
			image += rti->total_offset;
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   748
		} else {
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   749
			image += relocation;
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   750
		}
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
   751
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
   752
		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
   753
			pt = RemapCoords(seq->delta_x, seq->delta_y, seq->delta_z);
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5860
diff changeset
   754
			DrawSprite(image, pal, x + pt.x, y + pt.y);
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
   755
		}
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
   756
	}
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
   757
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
   758
	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
   759
}
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
   760
4206
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   761
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   762
static const StationSpec* GetStationSpec(TileIndex t)
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   763
{
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   764
	const Station* st;
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   765
	uint specindex;
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   766
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   767
	if (!IsCustomStationSpecIndex(t)) return NULL;
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   768
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   769
	st = GetStationByTile(t);
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   770
	specindex = GetCustomStationSpecIndex(t);
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   771
	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
   772
}
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   773
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   774
3766
f0077e6b6f99 (svn r4758) - Newstations: add support for 'blocked' station tiles, which no train can pass.
peter1138
parents: 3765
diff changeset
   775
/* 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
   776
 * 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
   777
bool IsStationTileBlocked(TileIndex tile)
f0077e6b6f99 (svn r4758) - Newstations: add support for 'blocked' station tiles, which no train can pass.
peter1138
parents: 3765
diff changeset
   778
{
4206
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   779
	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
   780
4206
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   781
	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
   782
}
3789
bf75e48227de (svn r4785) - Newstations: don't draw catenary on non-track tiles
glx
parents: 3787
diff changeset
   783
bf75e48227de (svn r4785) - Newstations: don't draw catenary on non-track tiles
glx
parents: 3787
diff changeset
   784
/* 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
   785
 * 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
   786
bool IsStationTileElectrifiable(TileIndex tile)
bf75e48227de (svn r4785) - Newstations: don't draw catenary on non-track tiles
glx
parents: 3787
diff changeset
   787
{
4206
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   788
	const StationSpec* statspec = GetStationSpec(tile);
3789
bf75e48227de (svn r4785) - Newstations: don't draw catenary on non-track tiles
glx
parents: 3787
diff changeset
   789
4206
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   790
	return
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   791
		statspec == NULL ||
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   792
		HASBIT(statspec->pylons, GetStationGfx(tile)) ||
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   793
		!HASBIT(statspec->wires, GetStationGfx(tile));
3789
bf75e48227de (svn r4785) - Newstations: don't draw catenary on non-track tiles
glx
parents: 3787
diff changeset
   794
}