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