mirror of https://github.com/OpenTTD/OpenTTD
POC of more companies
parent
d7eb29d292
commit
143581b9e0
|
@ -44,7 +44,7 @@ enum CargoCompanyBits {
|
||||||
CCB_CARGO_TYPE_START = 19, ///< Start bit of the cargo type field.
|
CCB_CARGO_TYPE_START = 19, ///< Start bit of the cargo type field.
|
||||||
CCB_CARGO_TYPE_LENGTH = 6, ///< Number of bits of the cargo type field.
|
CCB_CARGO_TYPE_LENGTH = 6, ///< Number of bits of the cargo type field.
|
||||||
CCB_COMPANY_START = 25, ///< Start bit of the company field.
|
CCB_COMPANY_START = 25, ///< Start bit of the company field.
|
||||||
CCB_COMPANY_LENGTH = 4, ///< Number of bits of the company field.
|
CCB_COMPANY_LENGTH = 8, ///< Number of bits of the company field.
|
||||||
};
|
};
|
||||||
|
|
||||||
static_assert(NUM_CARGO <= (1 << CCB_CARGO_TYPE_LENGTH));
|
static_assert(NUM_CARGO <= (1 << CCB_CARGO_TYPE_LENGTH));
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
/** @file company_cmd.cpp Handling of companies. */
|
/** @file company_cmd.cpp Handling of companies. */
|
||||||
|
|
||||||
|
#include "gfx_type.h"
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "company_base.h"
|
#include "company_base.h"
|
||||||
#include "company_func.h"
|
#include "company_func.h"
|
||||||
|
@ -448,27 +449,6 @@ bad_town_name:;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sorting weights for the company colours. */
|
|
||||||
static const uint8_t _colour_sort[COLOUR_END] = {2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 2, 2, 3, 1, 1, 1};
|
|
||||||
/** Similar colours, so we can try to prevent same coloured companies. */
|
|
||||||
static const Colours _similar_colour[COLOUR_END][2] = {
|
|
||||||
{ COLOUR_BLUE, COLOUR_LIGHT_BLUE }, // COLOUR_DARK_BLUE
|
|
||||||
{ COLOUR_GREEN, COLOUR_DARK_GREEN }, // COLOUR_PALE_GREEN
|
|
||||||
{ INVALID_COLOUR, INVALID_COLOUR }, // COLOUR_PINK
|
|
||||||
{ COLOUR_ORANGE, INVALID_COLOUR }, // COLOUR_YELLOW
|
|
||||||
{ INVALID_COLOUR, INVALID_COLOUR }, // COLOUR_RED
|
|
||||||
{ COLOUR_DARK_BLUE, COLOUR_BLUE }, // COLOUR_LIGHT_BLUE
|
|
||||||
{ COLOUR_PALE_GREEN, COLOUR_DARK_GREEN }, // COLOUR_GREEN
|
|
||||||
{ COLOUR_PALE_GREEN, COLOUR_GREEN }, // COLOUR_DARK_GREEN
|
|
||||||
{ COLOUR_DARK_BLUE, COLOUR_LIGHT_BLUE }, // COLOUR_BLUE
|
|
||||||
{ COLOUR_BROWN, COLOUR_ORANGE }, // COLOUR_CREAM
|
|
||||||
{ COLOUR_PURPLE, INVALID_COLOUR }, // COLOUR_MAUVE
|
|
||||||
{ COLOUR_MAUVE, INVALID_COLOUR }, // COLOUR_PURPLE
|
|
||||||
{ COLOUR_YELLOW, COLOUR_CREAM }, // COLOUR_ORANGE
|
|
||||||
{ COLOUR_CREAM, INVALID_COLOUR }, // COLOUR_BROWN
|
|
||||||
{ COLOUR_WHITE, INVALID_COLOUR }, // COLOUR_GREY
|
|
||||||
{ COLOUR_GREY, INVALID_COLOUR }, // COLOUR_WHITE
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate a company colour.
|
* Generate a company colour.
|
||||||
|
@ -476,53 +456,13 @@ static const Colours _similar_colour[COLOUR_END][2] = {
|
||||||
*/
|
*/
|
||||||
static Colours GenerateCompanyColour()
|
static Colours GenerateCompanyColour()
|
||||||
{
|
{
|
||||||
Colours colours[COLOUR_END];
|
int num_colours = COLOUR_END - COLOUR_BEGIN;
|
||||||
|
|
||||||
/* Initialize array */
|
int companies = 0;
|
||||||
for (uint i = 0; i < COLOUR_END; i++) colours[i] = static_cast<Colours>(i);
|
for (const Company *_ : Company::Iterate()) {
|
||||||
|
companies++;
|
||||||
/* And randomize it */
|
|
||||||
for (uint i = 0; i < 100; i++) {
|
|
||||||
uint r = Random();
|
|
||||||
Swap(colours[GB(r, 0, 4)], colours[GB(r, 4, 4)]);
|
|
||||||
}
|
}
|
||||||
|
return Colours(companies % num_colours);
|
||||||
/* Bubble sort it according to the values in table 1 */
|
|
||||||
for (uint i = 0; i < COLOUR_END; i++) {
|
|
||||||
for (uint j = 1; j < COLOUR_END; j++) {
|
|
||||||
if (_colour_sort[colours[j - 1]] < _colour_sort[colours[j]]) {
|
|
||||||
Swap(colours[j - 1], colours[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Move the colours that look similar to each company's colour to the side */
|
|
||||||
for (const Company *c : Company::Iterate()) {
|
|
||||||
Colours pcolour = c->colour;
|
|
||||||
|
|
||||||
for (uint i = 0; i < COLOUR_END; i++) {
|
|
||||||
if (colours[i] == pcolour) {
|
|
||||||
colours[i] = INVALID_COLOUR;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint j = 0; j < 2; j++) {
|
|
||||||
Colours similar = _similar_colour[pcolour][j];
|
|
||||||
if (similar == INVALID_COLOUR) break;
|
|
||||||
|
|
||||||
for (uint i = 1; i < COLOUR_END; i++) {
|
|
||||||
if (colours[i - 1] == similar) Swap(colours[i - 1], colours[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return the first available colour */
|
|
||||||
for (uint i = 0; i < COLOUR_END; i++) {
|
|
||||||
if (colours[i] != INVALID_COLOUR) return colours[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
NOT_REACHED();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -18,21 +18,27 @@
|
||||||
enum Owner : uint8_t {
|
enum Owner : uint8_t {
|
||||||
/* All companies below MAX_COMPANIES are playable
|
/* All companies below MAX_COMPANIES are playable
|
||||||
* companies, above, they are special, computer controlled 'companies' */
|
* companies, above, they are special, computer controlled 'companies' */
|
||||||
OWNER_BEGIN = 0x00, ///< First owner
|
OWNER_BEGIN = 0x00, ///< First owner
|
||||||
COMPANY_FIRST = 0x00, ///< First company, same as owner
|
COMPANY_FIRST = 0x00, ///< First company, same as owner
|
||||||
MAX_COMPANIES = 0x0F, ///< Maximum number of companies
|
MAX_COMPANIES = 0xF0, ///< Maximum number of companies
|
||||||
OWNER_TOWN = 0x0F, ///< A town owns the tile, or a town is expanding
|
OLD_MAX_COMPANIES = 0x0F, ///< Maximum number of companies
|
||||||
OWNER_NONE = 0x10, ///< The tile has no ownership
|
OWNER_TOWN = 0xF1, ///< A town owns the tile, or a town is expanding
|
||||||
OWNER_WATER = 0x11, ///< The tile/execution is done by "water"
|
OLD_OWNER_TOWN = 0x0F,
|
||||||
OWNER_DEITY = 0x12, ///< The object is owned by a superuser / goal script
|
OWNER_NONE = 0xF2, ///< The tile has no ownership
|
||||||
|
OLD_OWNER_NONE = 0x10, ///< The tile has no ownership
|
||||||
|
|
||||||
|
|
||||||
|
OWNER_WATER = 0xF3, ///< The tile/execution is done by "water"
|
||||||
|
OLD_OWNER_WATER = 0x11, ///< The tile/execution is done by "water"
|
||||||
|
OWNER_DEITY = 0xF4, ///< The object is owned by a superuser / goal script
|
||||||
OWNER_END, ///< Last + 1 owner
|
OWNER_END, ///< Last + 1 owner
|
||||||
INVALID_OWNER = 0xFF, ///< An invalid owner
|
INVALID_OWNER = 0xFF, ///< An invalid owner
|
||||||
INVALID_COMPANY = 0xFF, ///< An invalid company
|
INVALID_COMPANY = 0xFF, ///< An invalid company
|
||||||
|
|
||||||
/* 'Fake' companies used for networks */
|
/* 'Fake' companies used for networks */
|
||||||
COMPANY_INACTIVE_CLIENT = 253, ///< The client is joining
|
COMPANY_INACTIVE_CLIENT = 0xF7, ///< The client is joining
|
||||||
COMPANY_NEW_COMPANY = 254, ///< The client wants a new company
|
COMPANY_NEW_COMPANY = 0xF8, ///< The client wants a new company
|
||||||
COMPANY_SPECTATOR = 255, ///< The client is spectating
|
COMPANY_SPECTATOR = 0xF9, ///< The client is spectating
|
||||||
};
|
};
|
||||||
DECLARE_POSTFIX_INCREMENT(Owner)
|
DECLARE_POSTFIX_INCREMENT(Owner)
|
||||||
DECLARE_ENUM_AS_ADDABLE(Owner)
|
DECLARE_ENUM_AS_ADDABLE(Owner)
|
||||||
|
|
|
@ -166,7 +166,7 @@ struct ValuesInterval {
|
||||||
|
|
||||||
struct BaseGraphWindow : Window {
|
struct BaseGraphWindow : Window {
|
||||||
protected:
|
protected:
|
||||||
static const int GRAPH_MAX_DATASETS = 64;
|
static const int GRAPH_MAX_DATASETS = 300;
|
||||||
static const int GRAPH_BASE_COLOUR = GREY_SCALE(2);
|
static const int GRAPH_BASE_COLOUR = GREY_SCALE(2);
|
||||||
static const int GRAPH_GRID_COLOUR = GREY_SCALE(3);
|
static const int GRAPH_GRID_COLOUR = GREY_SCALE(3);
|
||||||
static const int GRAPH_AXIS_LINE_COLOUR = GREY_SCALE(1);
|
static const int GRAPH_AXIS_LINE_COLOUR = GREY_SCALE(1);
|
||||||
|
|
|
@ -656,7 +656,7 @@ bool AfterLoadGame()
|
||||||
* walk through the whole map.. */
|
* walk through the whole map.. */
|
||||||
if (IsSavegameVersionBefore(SLV_4, 3)) {
|
if (IsSavegameVersionBefore(SLV_4, 3)) {
|
||||||
for (auto t : Map::Iterate()) {
|
for (auto t : Map::Iterate()) {
|
||||||
if (IsTileType(t, MP_WATER) && GetTileOwner(t) >= MAX_COMPANIES) {
|
if (IsTileType(t, MP_WATER) && GetTileOwner(t) >= OLD_MAX_COMPANIES) {
|
||||||
SetTileOwner(t, OWNER_WATER);
|
SetTileOwner(t, OWNER_WATER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -986,7 +986,7 @@ bool AfterLoadGame()
|
||||||
|
|
||||||
case MP_ROAD:
|
case MP_ROAD:
|
||||||
t.m4() |= (t.m2() << 4);
|
t.m4() |= (t.m2() << 4);
|
||||||
if ((GB(t.m5(), 4, 2) == ROAD_TILE_CROSSING ? (Owner)t.m3() : GetTileOwner(t)) == OWNER_TOWN) {
|
if ((GB(t.m5(), 4, 2) == ROAD_TILE_CROSSING ? (Owner)t.m3() : GetTileOwner(t)) == OLD_OWNER_TOWN) {
|
||||||
SetTownIndex(t, CalcClosestTownFromTile(t)->index);
|
SetTownIndex(t, CalcClosestTownFromTile(t)->index);
|
||||||
} else {
|
} else {
|
||||||
SetTownIndex(t, 0);
|
SetTownIndex(t, 0);
|
||||||
|
@ -1151,7 +1151,7 @@ bool AfterLoadGame()
|
||||||
|
|
||||||
Owner o = GetTileOwner(t);
|
Owner o = GetTileOwner(t);
|
||||||
SB(t.m7(), 0, 5, o); // road owner
|
SB(t.m7(), 0, 5, o); // road owner
|
||||||
SB(t.m3(), 4, 4, o == OWNER_NONE ? OWNER_TOWN : o); // tram owner
|
SB(t.m3(), 4, 4, o == OLD_OWNER_NONE ? OWNER_TOWN : o); // tram owner
|
||||||
}
|
}
|
||||||
SB(t.m6(), 2, 4, GB(t.m2(), 4, 4)); // bridge type
|
SB(t.m6(), 2, 4, GB(t.m2(), 4, 4)); // bridge type
|
||||||
SB(t.m7(), 5, 1, GB(t.m4(), 7, 1)); // snow/desert
|
SB(t.m7(), 5, 1, GB(t.m4(), 7, 1)); // snow/desert
|
||||||
|
@ -1213,7 +1213,7 @@ bool AfterLoadGame()
|
||||||
GetRailType(t)
|
GetRailType(t)
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
TownID town = IsTileOwner(t, OWNER_TOWN) ? ClosestTownFromTile(t, UINT_MAX)->index : 0;
|
TownID town = IsTileOwner(t, OLD_OWNER_TOWN) ? ClosestTownFromTile(t, UINT_MAX)->index : 0;
|
||||||
|
|
||||||
/* MakeRoadNormal */
|
/* MakeRoadNormal */
|
||||||
SetTileType(t, MP_ROAD);
|
SetTileType(t, MP_ROAD);
|
||||||
|
@ -1568,7 +1568,7 @@ bool AfterLoadGame()
|
||||||
* be OWNER_NONE. So replace OWNER_NONE with OWNER_WATER. */
|
* be OWNER_NONE. So replace OWNER_NONE with OWNER_WATER. */
|
||||||
if (IsSavegameVersionBefore(SLV_46)) {
|
if (IsSavegameVersionBefore(SLV_46)) {
|
||||||
for (Waypoint *wp : Waypoint::Iterate()) {
|
for (Waypoint *wp : Waypoint::Iterate()) {
|
||||||
if ((wp->facilities & FACIL_DOCK) != 0 && IsTileOwner(wp->xy, OWNER_NONE) && TileHeight(wp->xy) == 0) SetTileOwner(wp->xy, OWNER_WATER);
|
if ((wp->facilities & FACIL_DOCK) != 0 && IsTileOwner(wp->xy, OLD_OWNER_NONE) && TileHeight(wp->xy) == 0) SetTileOwner(wp->xy, OWNER_WATER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1865,7 +1865,7 @@ bool AfterLoadGame()
|
||||||
|
|
||||||
if (IsBuoyTile(t) || IsDriveThroughStopTile(t) || IsTileType(t, MP_WATER)) {
|
if (IsBuoyTile(t) || IsDriveThroughStopTile(t) || IsTileType(t, MP_WATER)) {
|
||||||
Owner o = GetTileOwner(t);
|
Owner o = GetTileOwner(t);
|
||||||
if (o < MAX_COMPANIES && !Company::IsValidID(o)) {
|
if (o < OLD_MAX_COMPANIES && !Company::IsValidID(o)) {
|
||||||
Backup<CompanyID> cur_company(_current_company, o);
|
Backup<CompanyID> cur_company(_current_company, o);
|
||||||
ChangeTileOwner(t, o, INVALID_OWNER);
|
ChangeTileOwner(t, o, INVALID_OWNER);
|
||||||
cur_company.Restore();
|
cur_company.Restore();
|
||||||
|
@ -1880,7 +1880,7 @@ bool AfterLoadGame()
|
||||||
for (RoadTramType rtt : _roadtramtypes) {
|
for (RoadTramType rtt : _roadtramtypes) {
|
||||||
/* update even non-existing road types to update tile owner too */
|
/* update even non-existing road types to update tile owner too */
|
||||||
Owner o = GetRoadOwner(t, rtt);
|
Owner o = GetRoadOwner(t, rtt);
|
||||||
if (o < MAX_COMPANIES && !Company::IsValidID(o)) SetRoadOwner(t, rtt, OWNER_NONE);
|
if (o < OLD_MAX_COMPANIES && !Company::IsValidID(o)) SetRoadOwner(t, rtt, OWNER_NONE);
|
||||||
}
|
}
|
||||||
if (IsLevelCrossing(t)) {
|
if (IsLevelCrossing(t)) {
|
||||||
if (!Company::IsValidID(GetTileOwner(t))) FixOwnerOfRailTrack(t);
|
if (!Company::IsValidID(GetTileOwner(t))) FixOwnerOfRailTrack(t);
|
||||||
|
@ -1996,7 +1996,7 @@ bool AfterLoadGame()
|
||||||
|
|
||||||
/* signs with invalid owner left from older savegames */
|
/* signs with invalid owner left from older savegames */
|
||||||
for (Sign *si : Sign::Iterate()) {
|
for (Sign *si : Sign::Iterate()) {
|
||||||
if (si->owner != OWNER_NONE && !Company::IsValidID(si->owner)) si->owner = OWNER_NONE;
|
if (si->owner != OLD_OWNER_NONE && !Company::IsValidID(si->owner)) si->owner = OWNER_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Station can get named based on an industry type, but the current ones
|
/* Station can get named based on an industry type, but the current ones
|
||||||
|
@ -2025,7 +2025,7 @@ bool AfterLoadGame()
|
||||||
|
|
||||||
for (Town *t : Town::Iterate()) {
|
for (Town *t : Town::Iterate()) {
|
||||||
if (t->have_ratings == 0xFF) t->have_ratings = MAX_UVALUE(CompanyMask);
|
if (t->have_ratings == 0xFF) t->have_ratings = MAX_UVALUE(CompanyMask);
|
||||||
for (uint i = 8; i != MAX_COMPANIES; i++) t->ratings[i] = RATING_INITIAL;
|
for (uint i = 8; i != OLD_MAX_COMPANIES; i++) t->ratings[i] = RATING_INITIAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2474,7 +2474,7 @@ bool AfterLoadGame()
|
||||||
if (IsSavegameVersionBefore(SLV_148)) {
|
if (IsSavegameVersionBefore(SLV_148)) {
|
||||||
for (Object *o : Object::Iterate()) {
|
for (Object *o : Object::Iterate()) {
|
||||||
Owner owner = GetTileOwner(o->location.tile);
|
Owner owner = GetTileOwner(o->location.tile);
|
||||||
o->colour = (owner == OWNER_NONE) ? static_cast<Colours>(GB(Random(), 0, 4)) : Company::Get(owner)->livery->colour1;
|
o->colour = (owner == OLD_OWNER_NONE) ? static_cast<Colours>(GB(Random(), 0, 4)) : Company::Get(owner)->livery->colour1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ struct SIGNChunkHandler : ChunkHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Signs placed in scenario editor shall now be OWNER_DEITY */
|
/* Signs placed in scenario editor shall now be OWNER_DEITY */
|
||||||
if (IsSavegameVersionBefore(SLV_171) && si->owner == OWNER_NONE && _file_to_saveload.abstract_ftype == FT_SCENARIO) {
|
if (IsSavegameVersionBefore(SLV_171) && si->owner == OLD_OWNER_NONE && _file_to_saveload.abstract_ftype == FT_SCENARIO) {
|
||||||
si->owner = OWNER_DEITY;
|
si->owner = OWNER_DEITY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
/** @file vehiclelist.cpp Lists of vehicles. */
|
/** @file vehiclelist.cpp Lists of vehicles. */
|
||||||
|
|
||||||
|
#include "cargomonitor.h"
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "train.h"
|
#include "train.h"
|
||||||
#include "vehicle_func.h"
|
#include "vehicle_func.h"
|
||||||
|
@ -23,7 +24,6 @@
|
||||||
uint32_t VehicleListIdentifier::Pack() const
|
uint32_t VehicleListIdentifier::Pack() const
|
||||||
{
|
{
|
||||||
uint8_t c = this->company == OWNER_NONE ? 0xF : (uint8_t)this->company;
|
uint8_t c = this->company == OWNER_NONE ? 0xF : (uint8_t)this->company;
|
||||||
assert(c < (1 << 4));
|
|
||||||
assert(this->vtype < (1 << 2));
|
assert(this->vtype < (1 << 2));
|
||||||
assert(this->index < (1 << 20));
|
assert(this->index < (1 << 20));
|
||||||
assert(this->type < VLT_END);
|
assert(this->type < VLT_END);
|
||||||
|
|
Loading…
Reference in New Issue