src/newgrf_commons.cpp
author truebrain
Mon, 16 Jun 2008 14:43:19 +0000
branchnoai
changeset 10978 13fd0364b2c6
parent 10776 07203fc29812
permissions -rw-r--r--
(svn r13532) [NoAI] -Fix: in MultiPlayer SignID wasn't set correctly, causing weird effects. Code is now more unified, which should avoid simular effects in the future (tnx to glx for initial patch)
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     1
/* $Id$ */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     2
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     3
/** @file newgrf_commons.cpp Implementation of the class OverrideManagerBase
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     4
 * and its descendance, present and futur
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     5
 */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     6
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     7
#include "stdafx.h"
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
     8
#include "openttd.h"
9626
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
     9
#include "variables.h"
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
    10
#include "landscape.h"
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    11
#include "town.h"
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    12
#include "industry.h"
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    13
#include "newgrf.h"
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    14
#include "newgrf_commons.h"
9723
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
    15
#include "tile_map.h"
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
    16
#include "station_map.h"
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
    17
#include "settings_type.h"
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
    18
#include "tree_map.h"
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    19
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    20
/** Constructor of generic class
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    21
 * @param offset end of original data for this entity. i.e: houses = 110
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    22
 * @param maximum of entities this manager can deal with. i.e: houses = 512
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    23
 * @param invalid is the ID used to identify an invalid entity id
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    24
 */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    25
OverrideManagerBase::OverrideManagerBase(uint16 offset, uint16 maximum, uint16 invalid)
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    26
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    27
	max_offset = offset;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    28
	max_new_entities = maximum;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    29
	invalid_ID = invalid;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    30
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    31
	mapping_ID = CallocT<EntityIDMapping>(max_new_entities);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    32
	entity_overrides = MallocT<uint16>(max_offset);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    33
	memset(entity_overrides, invalid, sizeof(entity_overrides));
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
    34
	grfid_overrides = CallocT<uint32>(max_offset);
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    35
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    36
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    37
/** Destructor of the generic class.
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    38
 * Frees allocated memory of constructor
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    39
 */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    40
OverrideManagerBase::~OverrideManagerBase()
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    41
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    42
	free(mapping_ID);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    43
	free(entity_overrides);
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
    44
	free(grfid_overrides);
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    45
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    46
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    47
/** Since the entity IDs defined by the GRF file does not necessarily correlate
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    48
 * to those used by the game, the IDs used for overriding old entities must be
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    49
 * translated when the entity spec is set.
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
    50
 * @param local_id ID in grf file
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
    51
 * @param grfid  ID of the grf file
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    52
 * @param entity_type original entity type
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    53
 */
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
    54
void OverrideManagerBase::Add(uint8 local_id, uint32 grfid, uint entity_type)
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    55
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    56
	assert(entity_type < max_offset);
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
    57
	/* An override can be set only once */
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
    58
	if (entity_overrides[entity_type] != invalid_ID) return;
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    59
	entity_overrides[entity_type] = local_id;
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
    60
	grfid_overrides[entity_type] = grfid;
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    61
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    62
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    63
/** Resets the mapping, which is used while initializing game */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    64
void OverrideManagerBase::ResetMapping()
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    65
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    66
	memset(mapping_ID, 0, (max_new_entities - 1) * sizeof(EntityIDMapping));
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    67
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    68
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    69
/** Resets the override, which is used while initializing game */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    70
void OverrideManagerBase::ResetOverride()
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    71
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    72
	for (uint16 i = 0; i < max_offset; i++) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    73
		entity_overrides[i] = invalid_ID;
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
    74
		grfid_overrides[i] = 0;
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    75
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    76
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    77
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    78
/** Return the ID (if ever available) of a previously inserted entity.
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    79
 * @param grf_local_id ID of this enity withing the grfID
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    80
 * @param grfid ID of the grf file
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    81
 * @return the ID of the candidate, of the Invalid flag item ID
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    82
 */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    83
uint16 OverrideManagerBase::GetID(uint8 grf_local_id, uint32 grfid)
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    84
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    85
	const EntityIDMapping *map;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    86
9641
855e32c08c9b (svn r10533) [NoAI] -Sync with trunk r10460:r10532.
truelight
parents: 9629
diff changeset
    87
	for (uint16 id = 0; id < max_new_entities; id++) {
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    88
		map = &mapping_ID[id];
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    89
		if (map->entity_id == grf_local_id && map->grfid == grfid) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    90
			return id;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    91
		}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    92
	}
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
    93
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    94
	return invalid_ID;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    95
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    96
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    97
/** Reserves a place in the mapping array for an entity to be installed
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    98
 * @param grf_local_id is an arbitrary id given by the grf's author.  Also known as setid
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
    99
 * @param grfid is the id of the grf file itself
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   100
 * @param substitute_id is the original entity from which data is copied for the new one
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   101
 * @return the proper usable slot id, or invalid marker if none is found
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   102
 */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   103
uint16 OverrideManagerBase::AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id)
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   104
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   105
	uint16 id = this->GetID(grf_local_id, grfid);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   106
	EntityIDMapping *map;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   107
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   108
	/* Look to see if this entity has already been added. This is done
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   109
	 * separately from the loop below in case a GRF has been deleted, and there
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   110
	 * are any gaps in the array.
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   111
	 */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   112
	if (id != invalid_ID) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   113
		return id;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   114
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   115
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   116
	/* This entity hasn't been defined before, so give it an ID now. */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   117
	for (id = max_offset; id < max_new_entities; id++) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   118
		map = &mapping_ID[id];
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   119
9704
197cb8c6ae17 (svn r11221) [NoAI] -Sync: with trunk r11145:11220
glx
parents: 9703
diff changeset
   120
		if (CheckValidNewID(id) && map->entity_id == 0 && map->grfid == 0) {
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   121
			map->entity_id     = grf_local_id;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   122
			map->grfid         = grfid;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   123
			map->substitute_id = substitute_id;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   124
			return id;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   125
		}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   126
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   127
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   128
	return invalid_ID;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   129
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   130
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   131
/** Gives the substitute of the entity, as specified by the grf file
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   132
 * @param entity_id of the entity being queried
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   133
 * @return mapped id
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   134
 */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   135
uint16 OverrideManagerBase::GetSubstituteID(byte entity_id)
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   136
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   137
	return mapping_ID[entity_id].substitute_id;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   138
}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   139
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   140
/** Install the specs into the HouseSpecs array
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   141
 * It will find itself the proper slot onwhich it will go
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   142
 * @param hs HouseSpec read from the grf file, ready for inclusion
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   143
 */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   144
void HouseOverrideManager::SetEntitySpec(const HouseSpec *hs)
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   145
{
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   146
	HouseID house_id = this->AddEntityID(hs->local_id, hs->grffile->grfid, hs->substitute_id);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   147
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   148
	if (house_id == invalid_ID) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   149
		grfmsg(1, "House.SetEntitySpec: Too many houses allocated. Ignoring.");
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   150
		return;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   151
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   152
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   153
	memcpy(&_house_specs[house_id], hs, sizeof(*hs));
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   154
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   155
	/* Now add the overrides. */
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   156
	for (int i = 0; i != max_offset; i++) {
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   157
		HouseSpec *overridden_hs = GetHouseSpecs(i);
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   158
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
   159
		if (entity_overrides[i] != hs->local_id || grfid_overrides[i] != hs->grffile->grfid) continue;
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   160
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   161
		overridden_hs->override = house_id;
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   162
		entity_overrides[i] = invalid_ID;
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
   163
		grfid_overrides[i] = 0;
9624
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   164
	}
b71483f2330f (svn r9915) [NoAI] -Sync with trunk -r9815:9914
glx
parents:
diff changeset
   165
}
9626
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   166
9732
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   167
/** Return the ID (if ever available) of a previously inserted entity.
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   168
 * @param grf_local_id ID of this enity withing the grfID
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   169
 * @param grfid ID of the grf file
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   170
 * @return the ID of the candidate, of the Invalid flag item ID
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   171
 */
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   172
uint16 IndustryOverrideManager::GetID(uint8 grf_local_id, uint32 grfid)
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   173
{
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   174
	uint16 id = OverrideManagerBase::GetID(grf_local_id, grfid);
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   175
	if (id != invalid_ID) return id;
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   176
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   177
	/* No mapping found, try the overrides */
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   178
	for (id = 0; id < max_offset; id++) {
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   179
		if (entity_overrides[id] == grf_local_id && grfid_overrides[id] == grfid) return id;
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   180
	}
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   181
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   182
	return invalid_ID;
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   183
}
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   184
9626
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   185
/** Method to find an entity ID and to mark it as reserved for the Industry to be included.
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   186
 * @param grf_local_id ID used by the grf file for pre-installation work (equivalent of TTDPatch's setid
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   187
 * @param grfid ID of the current grf file
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   188
 * @param substitute_id industry from which data has been copied
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   189
 * @return a free entity id (slotid) if ever one has been found, or Invalid_ID marker otherwise
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   190
 */
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   191
uint16 IndustryOverrideManager::AddEntityID(byte grf_local_id, uint32 grfid, byte substitute_id)
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   192
{
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   193
	/* This entity hasn't been defined before, so give it an ID now. */
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   194
	for (uint16 id = 0; id < max_new_entities; id++) {
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
   195
		/* Skip overriden industries */
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
   196
		if (id < max_offset && entity_overrides[id] != invalid_ID) continue;
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
   197
9626
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   198
		/* Get the real live industry */
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   199
		const IndustrySpec *inds = GetIndustrySpec(id);
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   200
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   201
		/* This industry must be one that is not available(enabled), mostly because of climate.
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   202
		 * And it must not already be used by a grf (grffile == NULL).
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   203
		 * So reseve this slot here, as it is the chosen one */
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   204
		if (!inds->enabled && inds->grf_prop.grffile == NULL) {
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   205
			EntityIDMapping *map = &mapping_ID[id];
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   206
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   207
			if (map->entity_id == 0 && map->grfid == 0) {
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   208
				/* winning slot, mark it as been used */
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   209
				map->entity_id     = grf_local_id;
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   210
				map->grfid         = grfid;
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   211
				map->substitute_id = substitute_id;
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   212
				return id;
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   213
			}
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   214
		}
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   215
	}
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   216
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   217
	return invalid_ID;
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   218
}
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   219
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   220
/** Method to install the new indistry data in its proper slot
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   221
 * The slot assigment is internal of this method, since it requires
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   222
 * checking what is available
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   223
 * @param inds Industryspec that comes from the grf decoding process
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   224
 */
9704
197cb8c6ae17 (svn r11221) [NoAI] -Sync: with trunk r11145:11220
glx
parents: 9703
diff changeset
   225
void IndustryOverrideManager::SetEntitySpec(IndustrySpec *inds)
9626
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   226
{
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   227
	/* First step : We need to find if this industry is already specified in the savegame data */
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   228
	IndustryType ind_id = this->GetID(inds->grf_prop.local_id, inds->grf_prop.grffile->grfid);
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   229
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
   230
	if (ind_id == invalid_ID) {
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
   231
		/* Not found.
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
   232
		 * Or it has already been overriden, so you've lost your place old boy.
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
   233
		 * Or it is a simple substitute.
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
   234
		 * We need to find a free available slot */
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
   235
		ind_id = this->AddEntityID(inds->grf_prop.local_id, inds->grf_prop.grffile->grfid, inds->grf_prop.subst_id);
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
   236
		inds->grf_prop.override = invalid_ID;  // make sure it will not be detected as overriden
9626
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   237
	}
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   238
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   239
	if (ind_id == invalid_ID) {
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   240
		grfmsg(1, "Industry.SetEntitySpec: Too many industries allocated. Ignoring.");
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   241
		return;
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   242
	}
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   243
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   244
	/* Now that we know we can use the given id, copy the spech to its final destination*/
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   245
	memcpy(&_industry_specs[ind_id], inds, sizeof(*inds));
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   246
	/* and mark it as usable*/
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   247
	_industry_specs[ind_id].enabled = true;
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   248
}
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   249
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   250
void IndustryTileOverrideManager::SetEntitySpec(const IndustryTileSpec *its)
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   251
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   252
	IndustryGfx indt_id = this->AddEntityID(its->grf_prop.local_id, its->grf_prop.grffile->grfid, its->grf_prop.subst_id);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   253
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   254
	if (indt_id == invalid_ID) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   255
		grfmsg(1, "IndustryTile.SetEntitySpec: Too many industry tiles allocated. Ignoring.");
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   256
		return;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   257
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   258
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   259
	memcpy(&_industry_tile_specs[indt_id], its, sizeof(*its));
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   260
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   261
	/* Now add the overrides. */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   262
	for (int i = 0; i < max_offset; i++) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   263
		IndustryTileSpec *overridden_its = &_industry_tile_specs[i];
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   264
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
   265
		if (entity_overrides[i] != its->grf_prop.local_id || grfid_overrides[i] != its->grf_prop.grffile->grfid) continue;
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   266
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   267
		overridden_its->grf_prop.override = indt_id;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   268
		overridden_its->enabled = false;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   269
		entity_overrides[i] = invalid_ID;
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9718
diff changeset
   270
		grfid_overrides[i] = 0;
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   271
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   272
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9626
diff changeset
   273
9626
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   274
/** Function used by houses (and soon industries) to get information
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   275
 * on type of "terrain" the tile it is queries sits on.
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   276
 * @param tile TileIndex of the tile been queried
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   277
 * @return value corresponding to the grf expected format:
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   278
 *         Terrain type: 0 normal, 1 desert, 2 rainforest, 4 on or above snowline */
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   279
uint32 GetTerrainType(TileIndex tile)
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   280
{
10776
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents: 10715
diff changeset
   281
	switch (_settings_game.game_creation.landscape) {
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   282
		case LT_TROPIC: return GetTropicZone(tile);
9703
d2a6acdbd665 (svn r11146) [NoAI] -Sync: with trunk r11035:11045.
rubidium
parents: 9641
diff changeset
   283
		case LT_ARCTIC: return GetTileZ(tile) > GetSnowLine() ? 4 : 0;
9626
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   284
		default:        return 0;
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   285
	}
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   286
}
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   287
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   288
TileIndex GetNearbyTile(byte parameter, TileIndex tile)
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   289
{
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   290
	int8 x = GB(parameter, 0, 4);
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   291
	int8 y = GB(parameter, 4, 4);
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   292
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   293
	if (x >= 8) x -= 16;
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   294
	if (y >= 8) y -= 16;
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   295
9723
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
   296
	/* Swap width and height depending on axis for railway stations */
9732
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9724
diff changeset
   297
	if (IsRailwayStationTile(tile) && GetRailStationAxis(tile) == AXIS_Y) Swap(x, y);
9723
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
   298
9641
855e32c08c9b (svn r10533) [NoAI] -Sync with trunk r10460:r10532.
truelight
parents: 9629
diff changeset
   299
	/* Make sure we never roam outside of the map */
855e32c08c9b (svn r10533) [NoAI] -Sync with trunk r10460:r10532.
truelight
parents: 9629
diff changeset
   300
	return TILE_MASK(tile + TileDiffXY(x, y));
9626
79f2b5a0cdd7 (svn r10118) [NoAI] -Sync with trunk r10015:r10096
glx
parents: 9624
diff changeset
   301
}
9724
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   302
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   303
/**
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   304
 * Common part of station var 0x67 , house var 0x62, indtile var 0x60, industry var 0x62.
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   305
 *
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   306
 * @param tile the tile of interest.
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   307
 * @return 0czzbbss: c = TileType; zz = TileZ; bb: 7-3 zero, 4-2 TerrainType, 1 water/shore, 0 zero; ss = TileSlope
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   308
 */
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   309
uint32 GetNearbyTileInformation(TileIndex tile)
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   310
{
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   311
	TileType tile_type = GetTileType(tile);
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   312
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   313
	/* Fake tile type for trees on shore */
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   314
	if (IsTileType(tile, MP_TREES) && GetTreeGround(tile) == TREE_GROUND_SHORE) tile_type = MP_WATER;
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   315
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   316
	uint z;
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   317
	Slope tileh = GetTileSlope(tile, &z);
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   318
	byte terrain_type = GetTerrainType(tile) << 2 | (tile_type == MP_WATER ? 1 : 0) << 1;
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   319
	return tile_type << 24 | z << 16 | terrain_type << 8 | tileh;
b39bc69bb2f2 (svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents: 9723
diff changeset
   320
}