src/newgrf_station.cpp
author Darkvater
Sun, 18 Feb 2007 22:50:51 +0000
changeset 6400 7b98825c5cb0
parent 6100 280c81a05098
child 6268 4b5241e5dd10
child 6432 8fb778a7f2d7
permissions -rw-r--r--
(svn r8807) -Feature: Add support for loading (some of) the TTDP extra chunks mainly list of GRFIDs and TTDP version the game was saved with.
GRFID list is read and active GRFs are loaded with the game if present in the data/ directory.
TTDP versioning information only works for newer versions, old versions will only give rough information but it's not worth the effort to precisely figure out what bit means what where and when.
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
     1
/* $Id$ */
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
     2
2963
6645da0a5b4a (svn r3525) - Rename station_newgrf.[ch] to newgrf_station.[ch], and update project files.
peter1138
parents: 2625
diff changeset
     3
/** @file newgrf_station.c Functions for dealing with station classes and custom stations. */
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
     4
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
     5
#include "stdafx.h"
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
     6
#include "openttd.h"
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
     7
#include "variables.h"
3764
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
     8
#include "functions.h"
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
     9
#include "debug.h"
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    10
#include "sprite.h"
3764
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
    11
#include "table/sprites.h"
3594
31fd59e606c8 (svn r4484) - Newstations: Use StringIDs instead of char*s to reference our custom names.
peter1138
parents: 3587
diff changeset
    12
#include "table/strings.h"
2967
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
    13
#include "station.h"
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
    14
#include "station_map.h"
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5172
diff changeset
    15
#include "newgrf.h"
3752
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
    16
#include "newgrf_callbacks.h"
2963
6645da0a5b4a (svn r3525) - Rename station_newgrf.[ch] to newgrf_station.[ch], and update project files.
peter1138
parents: 2625
diff changeset
    17
#include "newgrf_station.h"
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
    18
#include "newgrf_spritegroup.h"
4261
2ec8f5a9747b (svn r5887) -Cleanup: move date related functions, defines and variables to date.[ch]
rubidium
parents: 4206
diff changeset
    19
#include "date.h"
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    20
#include "helpers.hpp"
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    21
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    22
static StationClass station_classes[STAT_CLASS_MAX];
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    23
3786
73784d02aa69 (svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents: 3780
diff changeset
    24
enum {
73784d02aa69 (svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents: 3780
diff changeset
    25
	MAX_SPECLIST = 255,
73784d02aa69 (svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents: 3780
diff changeset
    26
};
73784d02aa69 (svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents: 3780
diff changeset
    27
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    28
/**
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    29
 * Reset station classes to their default state.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    30
 * 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
    31
 * entry, for standard stations and waypoints.
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
void ResetStationClasses(void)
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    34
{
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    35
	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
    36
		station_classes[i].id = 0;
3594
31fd59e606c8 (svn r4484) - Newstations: Use StringIDs instead of char*s to reference our custom names.
peter1138
parents: 3587
diff changeset
    37
		station_classes[i].name = STR_EMPTY;
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    38
		station_classes[i].stations = 0;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    39
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    40
		free(station_classes[i].spec);
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    41
		station_classes[i].spec = NULL;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    42
	}
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    43
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    44
	// Set up initial data
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    45
	station_classes[0].id = 'DFLT';
3594
31fd59e606c8 (svn r4484) - Newstations: Use StringIDs instead of char*s to reference our custom names.
peter1138
parents: 3587
diff changeset
    46
	station_classes[0].name = STR_STAT_CLASS_DFLT;
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    47
	station_classes[0].stations = 1;
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
    48
	station_classes[0].spec = MallocT<StationSpec*>(1);
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    49
	station_classes[0].spec[0] = NULL;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    50
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    51
	station_classes[1].id = 'WAYP';
3594
31fd59e606c8 (svn r4484) - Newstations: Use StringIDs instead of char*s to reference our custom names.
peter1138
parents: 3587
diff changeset
    52
	station_classes[1].name = STR_STAT_CLASS_WAYP;
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    53
	station_classes[1].stations = 1;
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
    54
	station_classes[1].spec = MallocT<StationSpec*>(1);
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    55
	station_classes[1].spec[0] = NULL;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    56
}
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    57
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    58
/**
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    59
 * Allocate a station class for the given class id.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    60
 * @param classid A 32 bit value identifying the class.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    61
 * @return Index into station_classes of allocated class.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    62
 */
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    63
StationClassID AllocateStationClass(uint32 cls)
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    64
{
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    65
	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
    66
		if (station_classes[i].id == cls) {
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    67
			// ClassID is already allocated, so reuse it.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    68
			return i;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    69
		} else if (station_classes[i].id == 0) {
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    70
			// 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
    71
			station_classes[i].id = cls;
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
		}
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    74
	}
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
    75
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5172
diff changeset
    76
	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
    77
	return STAT_CLASS_DFLT;
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
3642
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    80
/** Set the name of a custom station class */
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    81
void SetStationClassName(StationClassID sclass, StringID name)
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    82
{
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    83
	assert(sclass < STAT_CLASS_MAX);
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    84
	station_classes[sclass].name = name;
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    85
}
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
/** Retrieve the name of a custom station class */
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    88
StringID GetStationClassName(StationClassID sclass)
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
	assert(sclass < STAT_CLASS_MAX);
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    91
	return station_classes[sclass].name;
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    92
}
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
/** 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
    95
 * @return Pointer to a (static) array of StringIDs
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
StringID *BuildStationClassDropdown(void)
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    98
{
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
    99
	/* Allow room for all station classes, plus a terminator entry */
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   100
	static StringID names[STAT_CLASS_MAX + 1];
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   101
	uint i;
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
	/* Add each name */
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   104
	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
   105
		names[i] = station_classes[i].name;
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
	/* Terminate the list */
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   108
	names[i] = INVALID_STRING_ID;
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   109
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   110
	return names;
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   111
}
a247e07fafdf (svn r4551) - NewGRF: add string handling for newstations.
peter1138
parents: 3594
diff changeset
   112
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   113
/**
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   114
 * Get the number of station classes in use.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   115
 * @return Number of station classes.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   116
 */
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   117
uint GetNumStationClasses(void)
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   118
{
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   119
	uint i;
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   120
	for (i = 0; i < STAT_CLASS_MAX && station_classes[i].id != 0; i++);
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   121
	return i;
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   122
}
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   123
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   124
/**
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   125
 * 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
   126
 * @param sclass Index of the station class.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   127
 * @return Number of stations in the class.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   128
 */
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   129
uint GetNumCustomStations(StationClassID sclass)
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   130
{
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   131
	assert(sclass < STAT_CLASS_MAX);
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   132
	return station_classes[sclass].stations;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   133
}
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
/**
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   136
 * Tie a station spec to its station class.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   137
 * @param spec The station spec.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   138
 */
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3668
diff changeset
   139
void SetCustomStationSpec(StationSpec *statspec)
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   140
{
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   141
	StationClass *station_class;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   142
	int i;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   143
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
   144
	/* 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
   145
	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
   146
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3668
diff changeset
   147
	assert(statspec->sclass < STAT_CLASS_MAX);
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3668
diff changeset
   148
	station_class = &station_classes[statspec->sclass];
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   149
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   150
	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
   151
	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
   152
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3668
diff changeset
   153
	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
   154
	statspec->allocated = true;
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   155
}
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   156
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   157
/**
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   158
 * Retrieve a station spec from a class.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   159
 * @param sclass Index of the station class.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   160
 * @param station The station index with the class.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   161
 * @return The station spec.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   162
 */
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3668
diff changeset
   163
const StationSpec *GetCustomStationSpec(StationClassID sclass, uint station)
2625
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   164
{
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   165
	assert(sclass < STAT_CLASS_MAX);
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   166
	if (station < station_classes[sclass].stations)
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   167
		return station_classes[sclass].spec[station];
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
	// If the custom station isn't defined any more, then the GRF file
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   170
	// probably was not loaded.
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   171
	return NULL;
66b3d632dcd2 (svn r3167) - NewGRF: Start moving custom station code to separate files.
peter1138
parents:
diff changeset
   172
}
2967
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   173
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   174
3765
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   175
const StationSpec *GetCustomStationSpecByGrf(uint32 grfid, byte localidx)
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   176
{
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   177
	uint j;
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   178
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   179
	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
   180
		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
   181
			const StationSpec *statspec = station_classes[i].spec[j];
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   182
			if (statspec == NULL) continue;
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   183
			if (statspec->grfid == grfid && statspec->localidx == localidx) return statspec;
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   184
		}
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   185
	}
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   186
e057e2b740d4 (svn r4757) - Newstations: add saveload support for custom station speclists
peter1138
parents: 3764
diff changeset
   187
	return NULL;
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
3756
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   191
/* 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
   192
 * 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
   193
 * 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
   194
 * 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
   195
 * 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
   196
 * 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
   197
 */
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   198
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
   199
{
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   200
	uint32 retval = 0;
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
	if (axis == AXIS_X) {
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   203
		intswap(platforms, length);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   204
		intswap(x, y);
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
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   207
	/* 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
   208
	platforms = min(15, platforms);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   209
	length    = min(15, length);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   210
	x = min(15, x);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   211
	y = min(15, y);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   212
	if (centred) {
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   213
		x -= platforms / 2;
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   214
		y -= length / 2;
3790
66700f2c57a9 (svn r4786) - Newstations: in GetPlatformInfo() ensure negative values are only four bits
peter1138
parents: 3789
diff changeset
   215
		SB(retval,  0, 4, y & 0xF);
66700f2c57a9 (svn r4786) - Newstations: in GetPlatformInfo() ensure negative values are only four bits
peter1138
parents: 3789
diff changeset
   216
		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
   217
	} else {
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   218
		SB(retval,  0, 4, y);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   219
		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
   220
		SB(retval,  8, 4, x);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   221
		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
   222
	}
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   223
	SB(retval, 16, 4, length);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   224
	SB(retval, 20, 4, platforms);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   225
	SB(retval, 24, 4, tile);
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
	return retval;
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   228
}
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   229
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   230
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   231
/* 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
   232
 * 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
   233
 * 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
   234
 */
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   235
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
   236
{
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   237
	bool waypoint;
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   238
	byte orig_type = 0;
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   239
	Axis orig_axis = AXIS_X;
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
	waypoint = IsTileType(tile, MP_RAILWAY);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   242
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   243
	if (waypoint) {
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   244
		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
   245
	} else {
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   246
		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
   247
		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
   248
	}
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   249
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   250
	while (true) {
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   251
		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
   252
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   253
		if (waypoint) {
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   254
			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
   255
			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
   256
			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
   257
		} else {
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   258
			if (!IsRailwayStationTile(new_tile)) break;
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   259
			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
   260
			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
   261
		}
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   262
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   263
		tile = new_tile;
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   264
	}
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   265
	return tile;
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
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
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
   270
{
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   271
	int tx = TileX(tile);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   272
	int ty = TileY(tile);
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   273
	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
   274
	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
   275
	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
   276
	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
   277
	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
   278
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   279
	tx -= sx; ex -= sx;
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   280
	ty -= sy; ey -= sy;
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   281
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   282
	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
   283
}
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   284
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   285
5660
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   286
static uint32 GetRailContinuationInfo(TileIndex tile)
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   287
{
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   288
	/* 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
   289
	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
   290
	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
   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 Y axis */
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   293
	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
   294
	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
   295
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   296
	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
   297
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   298
	/* Choose appropriate lookup table to use */
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   299
	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
   300
	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
   301
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   302
	uint32 res = 0;
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   303
	uint i;
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   304
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   305
	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
   306
		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
   307
		if (ts != 0) {
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   308
			/* 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
   309
			SETBIT(res, i + 8);
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   310
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   311
			/* 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
   312
			if (ts & DiagdirReachesTracks(*diagdir)) SETBIT(res, i);
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   313
		}
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
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   316
	return res;
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
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   320
/* 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
   321
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
   322
{
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   323
	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
   324
	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
   325
	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
   326
}
2967
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   327
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   328
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   329
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
   330
{
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   331
	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
   332
	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
   333
}
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
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   336
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
   337
{
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   338
	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
   339
	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
   340
	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
   341
}
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   342
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   343
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3834
diff changeset
   344
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
   345
{
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   346
	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
   347
	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
   348
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   349
	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
   350
		/* 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
   351
		switch (variable) {
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   352
			case 0x40:
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   353
			case 0x41:
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   354
			case 0x46:
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   355
			case 0x47:
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   356
			case 0x49: return 0x2110000;       /* Platforms, tracks & position */
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   357
			case 0x42: return 0;               /* Rail type (XXX Get current type from GUI?) */
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   358
			case 0x43: return _current_player; /* Station owner */
3748
120f9786a654 (svn r4736) - Newstations: use the correct value for PBS status (No PBS)
peter1138
parents: 3746
diff changeset
   359
			case 0x44: return 2;               /* PBS status */
4331
11de01553605 (svn r6013) -Fix: some newgrf properties returned the date in the new format where the newgrf's expect the original format. Thanks to michi_cc for finding these and providing the initial patch.
rubidium
parents: 4261
diff changeset
   360
			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
   361
		}
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3834
diff changeset
   362
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3834
diff changeset
   363
		*available = false;
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   364
		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
   365
	}
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   366
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   367
	switch (variable) {
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   368
		/* Calculated station variables */
3756
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   369
		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
   370
		case 0x41: return GetPlatformInfoHelper(tile, true,  false, false);
3758
1ec9e4e26a9f (svn r4749) - Newstations: add snowline support to variable 42.
peter1138
parents: 3756
diff changeset
   371
		case 0x42: /* Terrain and rail type */
1ec9e4e26a9f (svn r4749) - Newstations: add snowline support to variable 42.
peter1138
parents: 3756
diff changeset
   372
			return ((_opt.landscape == LT_HILLY && GetTileZ(tile) > _opt.snow_line) ? 4 : 0) |
6076
c4114ae31687 (svn r8391) -Codechange: Make normal/desert/rainforest detection for newgrf stations work
peter1138
parents: 5919
diff changeset
   373
			       (_opt.landscape == LT_DESERT ? GetTropicZone(tile) : 0) |
3758
1ec9e4e26a9f (svn r4749) - Newstations: add snowline support to variable 42.
peter1138
parents: 3756
diff changeset
   374
			       (GetRailType(tile) << 8);
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   375
		case 0x43: return st->owner; /* Station owner */
3748
120f9786a654 (svn r4736) - Newstations: use the correct value for PBS status (No PBS)
peter1138
parents: 3746
diff changeset
   376
		case 0x44: return 2;         /* PBS status */
5660
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   377
		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
   378
		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
   379
		case 0x47: return GetPlatformInfoHelper(tile, true,  false, true);
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   380
		case 0x48: { /* Accepted cargo types */
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   381
			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
   382
			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
   383
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   384
			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
   385
				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
   386
			}
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   387
			return value;
2967
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   388
		}
3756
b3835d8eca4d (svn r4747) - Newstations: implement support for variables 40, 41, 46, 47 and 49.
peter1138
parents: 3755
diff changeset
   389
		case 0x49: return GetPlatformInfoHelper(tile, false, true, false);
2967
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   390
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   391
		/* Variables which use the parameter */
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   392
		case 0x60: return GB(st->goods[parameter].waiting_acceptance, 0, 12);
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   393
		case 0x61: return st->goods[parameter].days_since_pickup;
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   394
		case 0x62: return st->goods[parameter].rating;
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   395
		case 0x63: return st->goods[parameter].enroute_time;
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   396
		case 0x64: return st->goods[parameter].last_speed | (st->goods[parameter].last_age << 8);
5660
600fdb6cb88f (svn r7606) -Codechange: [NewStations] Add support for variables 45 and 65.
peter1138
parents: 5568
diff changeset
   397
		case 0x65: return GB(st->goods[parameter].waiting_acceptance, 12, 4);
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   398
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   399
		/* 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
   400
		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
   401
		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
   402
		case 0x86: return 0;
3746
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   403
		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
   404
		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
   405
		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
   406
		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
   407
		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
   408
		case 0xF6: return st->airport_flags;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4817
diff changeset
   409
		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
   410
		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
   411
	}
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   412
3746
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   413
	/* Handle cargo variables (deprecated) */
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   414
	if (variable >= 0x8C && variable <= 0xEC) {
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   415
		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
   416
		switch (GB(variable - 0x8C, 0, 3)) {
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   417
			case 0: return g->waiting_acceptance;
5172
7e64b65d3c54 (svn r7282) -Fix (r625): ttdpatch vars are little endian
peter1138
parents: 4817
diff changeset
   418
			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
   419
			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
   420
			case 3: return g->rating;
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   421
			case 4: return g->enroute_from;
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   422
			case 5: return g->enroute_time;
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   423
			case 6: return g->last_speed;
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   424
			case 7: return g->last_age;
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   425
		}
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   426
	}
bde65debf648 (svn r4734) - Newstations: add more variables and fix a division by zero.
peter1138
parents: 3743
diff changeset
   427
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5172
diff changeset
   428
	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
   429
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3834
diff changeset
   430
	*available = false;
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   431
	return UINT_MAX;
2967
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   432
}
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   433
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   434
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   435
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
   436
{
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   437
	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
   438
	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
   439
	uint set;
2967
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   440
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   441
	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
   442
	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
   443
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   444
	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
   445
		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
   446
	}
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   447
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
   448
	switch (cargo_type) {
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   449
		case GC_INVALID:
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   450
		case GC_DEFAULT_NA:
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   451
		case GC_PURCHASE:
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   452
			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
   453
			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
   454
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   455
		case GC_DEFAULT:
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   456
			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
   457
				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
   458
			}
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   459
			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
   460
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   461
		default:
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   462
			cargo = GB(st->goods[_local_cargo_id_ctype[cargo_type]].waiting_acceptance, 0, 12);
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   463
			break;
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   464
	}
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   465
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   466
	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
   467
	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
   468
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   469
	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
   470
		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
   471
			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
   472
			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
   473
		}
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   474
	} else {
3749
96b36cc10188 (svn r4737) - Newstations: 'real' groups picked the wrong set of loading or loaded sprites
peter1138
parents: 3748
diff changeset
   475
		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
   476
			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
   477
			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
   478
		}
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   479
	}
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   480
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   481
	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
   482
}
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   483
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   484
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   485
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
   486
{
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   487
	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
   488
	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
   489
	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
   490
	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
   491
	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
   492
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   493
	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
   494
	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
   495
	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
   496
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   497
	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
   498
	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
   499
	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
   500
	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
   501
	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
   502
	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
   503
}
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   504
6100
280c81a05098 (svn r8423) -Fix
tron
parents: 6076
diff changeset
   505
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
   506
{
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   507
	const SpriteGroup *group;
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   508
	CargoID ctype = GC_DEFAULT_NA;
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   509
6100
280c81a05098 (svn r8423) -Fix
tron
parents: 6076
diff changeset
   510
	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
   511
		/* No station, so we are in a purchase list */
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   512
		ctype = GC_PURCHASE;
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   513
	} 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
   514
		CargoID cargo;
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   515
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   516
		/* Pick the first cargo that we have waiting */
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   517
		for (cargo = 0; cargo < NUM_GLOBAL_CID; cargo++) {
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   518
			CargoID lcid = _local_cargo_id_ctype[cargo];
6100
280c81a05098 (svn r8423) -Fix
tron
parents: 6076
diff changeset
   519
			if (lcid != CT_INVALID &&
280c81a05098 (svn r8423) -Fix
tron
parents: 6076
diff changeset
   520
					object->u.station.statspec->spritegroup[cargo] != NULL &&
280c81a05098 (svn r8423) -Fix
tron
parents: 6076
diff changeset
   521
					GB(object->u.station.st->goods[lcid].waiting_acceptance, 0, 12) != 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
   522
				ctype = cargo;
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   523
				break;
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   524
			}
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   525
		}
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   526
	}
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   527
6100
280c81a05098 (svn r8423) -Fix
tron
parents: 6076
diff changeset
   528
	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
   529
	if (group == NULL) {
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   530
		ctype = GC_DEFAULT;
6100
280c81a05098 (svn r8423) -Fix
tron
parents: 6076
diff changeset
   531
		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
   532
	}
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   533
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   534
	if (group == NULL) return NULL;
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   535
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   536
	/* Remember the cargo type we've picked */
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   537
	object->u.station.cargo_type = ctype;
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   538
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   539
	return Resolve(group, object);
413372173231 (svn r6741) - Codechange: Simplify and unify resolving of station groups, and use the first available cargo type instead of only the default.
peter1138
parents: 4331
diff changeset
   540
}
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   541
3751
785501c18d0d (svn r4739) - Newstations: remove cargo type parameter of GetCustomStationRelocation() as we can determine it internally
peter1138
parents: 3750
diff changeset
   542
SpriteID GetCustomStationRelocation(const StationSpec *statspec, const Station *st, TileIndex tile)
3743
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   543
{
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   544
	const SpriteGroup *group;
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   545
	ResolverObject object;
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   546
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   547
	NewStationResolver(&object, statspec, st, tile);
c6efbe2e3a28 (svn r4729) - Newstations: replace old station resolver with new resolver code (as has happened for vehicles)
peter1138
parents: 3741
diff changeset
   548
6100
280c81a05098 (svn r8423) -Fix
tron
parents: 6076
diff changeset
   549
	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
   550
	if (group == NULL || group->type != SGT_RESULT) return 0;
3775
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   551
	return group->g.result.sprite - 0x42D;
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   552
}
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   553
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   554
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   555
SpriteID GetCustomStationGroundRelocation(const StationSpec *statspec, const Station *st, TileIndex tile)
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   556
{
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   557
	const SpriteGroup *group;
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   558
	ResolverObject object;
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   559
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   560
	NewStationResolver(&object, statspec, st, tile);
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   561
	object.callback_param1 = 1; /* Indicate we are resolving the ground sprite */
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   562
6100
280c81a05098 (svn r8423) -Fix
tron
parents: 6076
diff changeset
   563
	group = ResolveStation(&object);
3775
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   564
	if (group == NULL || group->type != SGT_RESULT) return 0;
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   565
	return group->g.result.sprite - 0x42D;
2967
4208a82bf0d9 (svn r3530) - NewGRF: Move station resolver to newgrf_station
peter1138
parents: 2963
diff changeset
   566
}
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   567
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   568
3752
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   569
uint16 GetStationCallback(uint16 callback, uint32 param1, uint32 param2, const StationSpec *statspec, const Station *st, TileIndex tile)
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   570
{
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   571
	const SpriteGroup *group;
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   572
	ResolverObject object;
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   573
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   574
	NewStationResolver(&object, statspec, st, tile);
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   575
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   576
	object.callback        = callback;
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   577
	object.callback_param1 = param1;
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   578
	object.callback_param2 = param2;
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   579
6100
280c81a05098 (svn r8423) -Fix
tron
parents: 6076
diff changeset
   580
	group = ResolveStation(&object);
3752
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   581
	if (group == NULL || group->type != SGT_CALLBACK) return CALLBACK_FAILED;
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   582
	return group->g.callback.result;
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   583
}
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   584
a7cdd7c0c928 (svn r4740) - Newstations: add function to evaluate station callbacks
peter1138
parents: 3751
diff changeset
   585
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   586
/**
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   587
 * Allocate a StationSpec to a Station. This is called once per build operation.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   588
 * @param spec StationSpec to allocate.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   589
 * @param st Station to allocate it to.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   590
 * @param exec Whether to actually allocate the spec.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   591
 * @return Index within the Station's spec list, or -1 if the allocation failed.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   592
 */
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3668
diff changeset
   593
int AllocateSpecToStation(const StationSpec *statspec, Station *st, bool exec)
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   594
{
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   595
	uint i;
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   596
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3668
diff changeset
   597
	if (statspec == NULL) return 0;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   598
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   599
	/* Check if this spec has already been allocated */
3786
73784d02aa69 (svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents: 3780
diff changeset
   600
	for (i = 1; i < st->num_specs && i < MAX_SPECLIST; i++) {
3676
48444d881fbe (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3668
diff changeset
   601
		if (st->speclist[i].spec == statspec) return i;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   602
	}
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   603
3786
73784d02aa69 (svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents: 3780
diff changeset
   604
	for (i = 1; i < st->num_specs && i < MAX_SPECLIST; i++) {
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   605
		if (st->speclist[i].spec == NULL && st->speclist[i].grfid == 0) break;
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   606
	}
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   607
3786
73784d02aa69 (svn r4782) - Newstations: fix issue with saving/loading games with newstations on big endian architectures.
peter1138
parents: 3780
diff changeset
   608
	if (i == MAX_SPECLIST) return -1;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   609
3730
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   610
	if (exec) {
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   611
		if (i >= st->num_specs) {
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   612
			st->num_specs = i + 1;
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
   613
			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
   614
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   615
			if (st->num_specs == 2) {
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   616
				/* Initial allocation */
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   617
				st->speclist[0].spec     = NULL;
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   618
				st->speclist[0].grfid    = 0;
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   619
				st->speclist[0].localidx = 0;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   620
			}
3730
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   621
		}
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   622
3730
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   623
		st->speclist[i].spec     = statspec;
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   624
		st->speclist[i].grfid    = statspec->grfid;
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   625
		st->speclist[i].localidx = statspec->localidx;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   626
	}
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   627
3730
1aca9dabaeea (svn r4707) - NewGRF: minor code duffage; return early and less indentation.
peter1138
parents: 3676
diff changeset
   628
	return i;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   629
}
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   630
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   631
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   632
/** Deallocate a StationSpec from a Station. Called when removing a single station tile.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   633
 * @param st Station to work with.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   634
 * @param specindex Index of the custom station within the Station's spec list.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   635
 * @return Indicates whether the StationSpec was deallocated.
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   636
 */
4190
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   637
void DeallocateSpecFromStation(Station* st, byte specindex)
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   638
{
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   639
	/* specindex of 0 (default) is never freeable */
4190
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   640
	if (specindex == 0) return;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   641
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   642
	/* Check all tiles over the station to check if the specindex is still in use */
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   643
	BEGIN_TILE_LOOP(tile, st->trainst_w, st->trainst_h, st->train_tile) {
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   644
		if (IsTileType(tile, MP_STATION) && GetStationIndex(tile) == st->index && IsRailwayStation(tile) && GetCustomStationSpecIndex(tile) == specindex) {
4190
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   645
			return;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   646
		}
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   647
	} END_TILE_LOOP(tile, st->trainst_w, st->trainst_h, st->train_tile)
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   648
4190
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   649
	/* This specindex is no longer in use, so deallocate it */
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   650
	st->speclist[specindex].spec     = NULL;
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   651
	st->speclist[specindex].grfid    = 0;
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   652
	st->speclist[specindex].localidx = 0;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   653
4190
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   654
	/* If this was the highest spec index, reallocate */
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   655
	if (specindex == st->num_specs - 1) {
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   656
		for (; st->speclist[st->num_specs - 1].grfid == 0 && st->num_specs > 1; st->num_specs--);
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   657
4190
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   658
		if (st->num_specs > 1) {
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
   659
			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
   660
		} else {
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   661
			free(st->speclist);
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   662
			st->num_specs = 0;
24d5420b6242 (svn r5632) Replace a boolean variable in DeallocateSpecFromStation() by a return
tron
parents: 4182
diff changeset
   663
			st->speclist  = NULL;
3587
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   664
		}
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   665
	}
2eb52db0b872 (svn r4473) - Newstations:
peter1138
parents: 3573
diff changeset
   666
}
3764
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   667
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   668
/** Draw representation of a station tile for GUI purposes.
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   669
 * @param x, y Position of image.
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   670
 * @param dir Direction.
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   671
 * @param railtype Rail type.
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   672
 * @param sclass, station Type of station.
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   673
 * @return True if the tile was drawn (allows for fallback to default graphic)
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   674
 */
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   675
bool DrawStationTile(int x, int y, RailType railtype, Axis axis, StationClassID sclass, uint station)
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   676
{
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   677
	const StationSpec *statspec;
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   678
	const DrawTileSprites *sprites;
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   679
	const DrawTileSeqStruct *seq;
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   680
	const RailtypeInfo *rti = GetRailTypeInfo(railtype);
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   681
	SpriteID relocation;
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5860
diff changeset
   682
	SpriteID image;
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5860
diff changeset
   683
	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
   684
	uint tile = 2;
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   685
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   686
	statspec = GetCustomStationSpec(sclass, station);
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   687
	if (statspec == NULL) return false;
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   688
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   689
	relocation = GetCustomStationRelocation(statspec, NULL, INVALID_TILE);
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   690
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   691
	if (HASBIT(statspec->callbackmask, CBM_CUSTOM_LAYOUT)) {
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   692
		uint16 callback = GetStationCallback(CBID_STATION_SPRITE_LAYOUT, 0x2110000, 0, statspec, NULL, INVALID_TILE);
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   693
		if (callback != CALLBACK_FAILED) tile = callback;
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   694
	}
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   695
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   696
	if (statspec->renderdata == NULL) {
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   697
		sprites = GetStationTileLayout(tile + axis);
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   698
	} else {
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   699
		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
   700
	}
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   701
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   702
	image = sprites->ground_sprite;
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5860
diff changeset
   703
	if (HASBIT(image, SPRITE_MODIFIER_USE_OFFSET)) {
3775
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   704
		image += GetCustomStationGroundRelocation(statspec, NULL, INVALID_TILE);
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   705
		image += rti->custom_ground_offset;
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   706
	} else {
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   707
		image += rti->total_offset;
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   708
	}
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
   709
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5860
diff changeset
   710
	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
   711
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
	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
   713
		Point pt;
3775
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   714
		image = seq->image;
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5860
diff changeset
   715
		if (HASBIT(image, SPRITE_MODIFIER_USE_OFFSET)) {
3775
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   716
			image += rti->total_offset;
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   717
		} else {
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   718
			image += relocation;
f3f1ba3111fa (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3766
diff changeset
   719
		}
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
   720
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
		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
   722
			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
   723
			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
   724
		}
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
	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
   728
}
ebcaf412fb3a (svn r4755) - Newstations: add a gui station tile drawing routine and use it in place of the existing one for waypoints.
peter1138
parents: 3758
diff changeset
   729
4206
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   730
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   731
static const StationSpec* GetStationSpec(TileIndex t)
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   732
{
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   733
	const Station* st;
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   734
	uint specindex;
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   735
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   736
	if (!IsCustomStationSpecIndex(t)) return NULL;
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   737
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   738
	st = GetStationByTile(t);
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   739
	specindex = GetCustomStationSpecIndex(t);
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   740
	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
   741
}
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   742
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   743
3766
f0077e6b6f99 (svn r4758) - Newstations: add support for 'blocked' station tiles, which no train can pass.
peter1138
parents: 3765
diff changeset
   744
/* 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
   745
 * 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
   746
bool IsStationTileBlocked(TileIndex tile)
f0077e6b6f99 (svn r4758) - Newstations: add support for 'blocked' station tiles, which no train can pass.
peter1138
parents: 3765
diff changeset
   747
{
4206
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   748
	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
   749
4206
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   750
	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
   751
}
3789
bf75e48227de (svn r4785) - Newstations: don't draw catenary on non-track tiles
glx
parents: 3787
diff changeset
   752
bf75e48227de (svn r4785) - Newstations: don't draw catenary on non-track tiles
glx
parents: 3787
diff changeset
   753
/* 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
   754
 * 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
   755
bool IsStationTileElectrifiable(TileIndex tile)
bf75e48227de (svn r4785) - Newstations: don't draw catenary on non-track tiles
glx
parents: 3787
diff changeset
   756
{
4206
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   757
	const StationSpec* statspec = GetStationSpec(tile);
3789
bf75e48227de (svn r4785) - Newstations: don't draw catenary on non-track tiles
glx
parents: 3787
diff changeset
   758
4206
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   759
	return
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   760
		statspec == NULL ||
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   761
		HASBIT(statspec->pylons, GetStationGfx(tile)) ||
599a0c60e964 (svn r5690) Factor common code to reduce code duplication
tron
parents: 4205
diff changeset
   762
		!HASBIT(statspec->wires, GetStationGfx(tile));
3789
bf75e48227de (svn r4785) - Newstations: don't draw catenary on non-track tiles
glx
parents: 3787
diff changeset
   763
}