summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-08-28 18:28:34 +0000
committerrubidium <rubidium@openttd.org>2010-08-28 18:28:34 +0000
commite0ba6550d2885ccfade874679fa792648df416f5 (patch)
treebdb38086be6f15051871ce66bb6c325a4fba2d3f
parentb376f8ae15a053c3a8f54431517da0c235f45489 (diff)
downloadopenttd-e0ba6550d2885ccfade874679fa792648df416f5.tar.xz
(svn r20658) -Codechange: add the colour of an object to the object instance
-rw-r--r--src/object_base.h7
-rw-r--r--src/object_cmd.cpp18
-rw-r--r--src/saveload/afterload.cpp9
-rw-r--r--src/saveload/object_sl.cpp1
4 files changed, 29 insertions, 6 deletions
diff --git a/src/object_base.h b/src/object_base.h
index d5f796191..1b814fa3f 100644
--- a/src/object_base.h
+++ b/src/object_base.h
@@ -23,9 +23,10 @@ extern ObjectPool _object_pool;
/** An object, such as transmitter, on the map. */
struct Object : ObjectPool::PoolItem<&_object_pool> {
- Town *town; ///< Town the object is built in
- TileArea location; ///< Location of the object
- Date build_date; ///< Date of construction
+ Town *town; ///< Town the object is built in
+ TileArea location; ///< Location of the object
+ Date build_date; ///< Date of construction
+ byte colour; ///< Colour of the object, for display purpose
/** Make sure the object isn't zeroed. */
Object() {}
diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp
index 87d5f7369..29564f8fe 100644
--- a/src/object_cmd.cpp
+++ b/src/object_cmd.cpp
@@ -59,9 +59,21 @@ void BuildObject(ObjectType type, TileIndex tile, CompanyID owner, Town *town)
TileArea ta(tile, GB(spec->size, 0, 4), GB(spec->size, 4, 4));
Object *o = new Object();
- o->location = ta;
- o->town = town == NULL ? CalcClosestTownFromTile(tile) : town;
- o->build_date = _date;
+ o->location = ta;
+ o->town = town == NULL ? CalcClosestTownFromTile(tile) : town;
+ o->build_date = _date;
+
+ /* If nothing owns the object, the colour will be random. Otherwise
+ * get the colour from the company's livery settings. */
+ if (owner == OWNER_NONE) {
+ o->colour = Random();
+ } else {
+ const Livery *l = Company::Get(owner)->livery;
+ o->colour = l->colour1 + l->colour2 * 16;
+ }
+
+ /* If the object wants only one colour, then give it that colour. */
+ if ((spec->flags & OBJECT_FLAG_2CC_COLOUR) == 0) o->colour &= 0xF;
assert(o->town != NULL);
diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp
index 95a379c9d..f636c0cc8 100644
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -2279,6 +2279,15 @@ bool AfterLoadGame()
}
}
+ /* Add (random) colour to all objects. */
+ if (CheckSavegameVersion(148)) {
+ Object *o;
+ FOR_ALL_OBJECTS(o) {
+ Owner owner = GetTileOwner(o->location.tile);
+ o->colour = (owner == OWNER_NONE) ? Random() & 0xF : Company::Get(owner)->livery->colour1;
+ }
+ }
+
/* Road stops is 'only' updating some caches */
AfterLoadRoadStops();
AfterLoadLabelMaps();
diff --git a/src/saveload/object_sl.cpp b/src/saveload/object_sl.cpp
index 6218eea1e..586c12a33 100644
--- a/src/saveload/object_sl.cpp
+++ b/src/saveload/object_sl.cpp
@@ -22,6 +22,7 @@ static const SaveLoad _object_desc[] = {
SLE_VAR(Object, location.h, SLE_FILE_U8 | SLE_VAR_U16),
SLE_REF(Object, town, REF_TOWN),
SLE_VAR(Object, build_date, SLE_UINT32),
+ SLE_CONDVAR(Object, colour, SLE_UINT8, 148, SL_MAX_VERSION),
SLE_END()
};