mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-09 07:29:44 +00:00
(svn r20345) -Codechange: unify removing of objects a bit more
This commit is contained in:
parent
e2d706cd21
commit
87386cabc4
@ -80,35 +80,6 @@ void IncreaseAnimationStage(TileIndex northern)
|
|||||||
/** We encode the company HQ size in the animation stage. */
|
/** We encode the company HQ size in the animation stage. */
|
||||||
#define IncreaseCompanyHQSize IncreaseAnimationStage
|
#define IncreaseCompanyHQSize IncreaseAnimationStage
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroy a HQ.
|
|
||||||
* During normal gameplay you can only implicitely destroy a HQ when you are
|
|
||||||
* rebuilding it. Otherwise, only water can destroy it.
|
|
||||||
* @param cid Company requesting the destruction of his HQ
|
|
||||||
* @param flags docommand flags of calling function
|
|
||||||
* @return cost of the operation
|
|
||||||
*/
|
|
||||||
static CommandCost DestroyCompanyHQ(CompanyID cid, DoCommandFlag flags)
|
|
||||||
{
|
|
||||||
Company *c = Company::Get(cid);
|
|
||||||
|
|
||||||
if (flags & DC_EXEC) {
|
|
||||||
TileIndex t = c->location_of_HQ;
|
|
||||||
|
|
||||||
DoClearSquare(t);
|
|
||||||
DoClearSquare(t + TileDiffXY(0, 1));
|
|
||||||
DoClearSquare(t + TileDiffXY(1, 0));
|
|
||||||
DoClearSquare(t + TileDiffXY(1, 1));
|
|
||||||
c->location_of_HQ = INVALID_TILE; // reset HQ position
|
|
||||||
SetWindowDirty(WC_COMPANY, cid);
|
|
||||||
|
|
||||||
CargoPacket::InvalidateAllFrom(ST_HEADQUARTERS, cid);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* cost of relocating company is 1% of company value */
|
|
||||||
return CommandCost(EXPENSES_PROPERTY, CalculateCompanyValue(c) / 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateCompanyHQ(TileIndex tile, uint score)
|
void UpdateCompanyHQ(TileIndex tile, uint score)
|
||||||
{
|
{
|
||||||
if (tile == INVALID_TILE) return;
|
if (tile == INVALID_TILE) return;
|
||||||
@ -126,6 +97,7 @@ void UpdateCompanyHQ(TileIndex tile, uint score)
|
|||||||
}
|
}
|
||||||
|
|
||||||
extern CommandCost CheckFlatLand(TileArea tile_area, DoCommandFlag flags);
|
extern CommandCost CheckFlatLand(TileArea tile_area, DoCommandFlag flags);
|
||||||
|
static CommandCost ClearTile_Unmovable(TileIndex tile, DoCommandFlag flags);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build an unmovable object
|
* Build an unmovable object
|
||||||
@ -180,8 +152,11 @@ CommandCost CmdBuildUnmovable(TileIndex tile, DoCommandFlag flags, uint32 p1, ui
|
|||||||
|
|
||||||
case UNMOVABLE_HQ: {
|
case UNMOVABLE_HQ: {
|
||||||
Company *c = Company::Get(_current_company);
|
Company *c = Company::Get(_current_company);
|
||||||
if (c->location_of_HQ != INVALID_TILE) { // Moving HQ
|
if (c->location_of_HQ != INVALID_TILE) {
|
||||||
cost.AddCost(DestroyCompanyHQ(_current_company, flags));
|
/* We need to persuade a bit harder to remove the old HQ. */
|
||||||
|
_current_company = OWNER_WATER;
|
||||||
|
cost.AddCost(ClearTile_Unmovable(c->location_of_HQ, flags));
|
||||||
|
_current_company = c->index;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
@ -278,9 +253,12 @@ static CommandCost ClearTile_Unmovable(TileIndex tile, DoCommandFlag flags)
|
|||||||
UnmovableType type = GetUnmovableType(tile);
|
UnmovableType type = GetUnmovableType(tile);
|
||||||
const UnmovableSpec *spec = UnmovableSpec::Get(type);
|
const UnmovableSpec *spec = UnmovableSpec::Get(type);
|
||||||
|
|
||||||
|
/* Get to the northern most tile. */
|
||||||
|
tile -= GetUnmovableOffset(tile);
|
||||||
|
|
||||||
/* Water can remove everything! */
|
/* Water can remove everything! */
|
||||||
if (_current_company != OWNER_WATER) {
|
if (_current_company != OWNER_WATER) {
|
||||||
if (type != UNMOVABLE_OWNED_LAND && flags & DC_AUTO) {
|
if ((spec->flags & OBJECT_FLAG_AUTOREMOVE) == 0 && flags & DC_AUTO) {
|
||||||
/* No automatic removal by overbuilding stuff. */
|
/* No automatic removal by overbuilding stuff. */
|
||||||
return_cmd_error(type == UNMOVABLE_HQ ? STR_ERROR_COMPANY_HEADQUARTERS_IN : STR_ERROR_OBJECT_IN_THE_WAY);
|
return_cmd_error(type == UNMOVABLE_HQ ? STR_ERROR_COMPANY_HEADQUARTERS_IN : STR_ERROR_OBJECT_IN_THE_WAY);
|
||||||
} else if (_game_mode == GM_EDITOR) {
|
} else if (_game_mode == GM_EDITOR) {
|
||||||
@ -291,15 +269,32 @@ static CommandCost ClearTile_Unmovable(TileIndex tile, DoCommandFlag flags)
|
|||||||
} else if (CheckTileOwnership(tile).Failed()) {
|
} else if (CheckTileOwnership(tile).Failed()) {
|
||||||
/* We don't own it!. */
|
/* We don't own it!. */
|
||||||
return_cmd_error(STR_ERROR_OWNED_BY);
|
return_cmd_error(STR_ERROR_OWNED_BY);
|
||||||
} else if (type != UNMOVABLE_OWNED_LAND && !_cheats.magic_bulldozer.value) {
|
} else if ((spec->flags & OBJECT_FLAG_AUTOREMOVE) == 0 && !_cheats.magic_bulldozer.value) {
|
||||||
/* In the game editor or with cheats we can remove, otherwise we can't. */
|
/* In the game editor or with cheats we can remove, otherwise we can't. */
|
||||||
return CMD_ERROR;
|
return CMD_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int size_x = GB(spec->size, 0, 4);
|
||||||
|
int size_y = GB(spec->size, 4, 4);
|
||||||
|
TileArea ta(tile, size_x, size_y);
|
||||||
|
|
||||||
|
CommandCost cost(EXPENSES_CONSTRUCTION, spec->GetClearCost() * size_x * size_y);
|
||||||
|
if (spec->flags & OBJECT_FLAG_CLEAR_INCOME) cost.MultiplyCost(-1); // They get an income!
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case UNMOVABLE_HQ:
|
case UNMOVABLE_HQ: {
|
||||||
return DestroyCompanyHQ(GetTileOwner(tile), flags);
|
Company *c = Company::Get(GetTileOwner(tile));
|
||||||
|
if (flags & DC_EXEC) {
|
||||||
|
c->location_of_HQ = INVALID_TILE; // reset HQ position
|
||||||
|
SetWindowDirty(WC_COMPANY, c->index);
|
||||||
|
CargoPacket::InvalidateAllFrom(ST_HEADQUARTERS, c->index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cost of relocating company is 1% of company value */
|
||||||
|
cost = CommandCost(EXPENSES_PROPERTY, CalculateCompanyValue(c) / 100);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case UNMOVABLE_STATUE:
|
case UNMOVABLE_STATUE:
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
@ -314,11 +309,9 @@ static CommandCost ClearTile_Unmovable(TileIndex tile, DoCommandFlag flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (flags & DC_EXEC) {
|
if (flags & DC_EXEC) {
|
||||||
DoClearSquare(tile);
|
TILE_AREA_LOOP(tile_cur, ta) DoClearSquare(tile_cur);
|
||||||
}
|
}
|
||||||
|
|
||||||
CommandCost cost(EXPENSES_CONSTRUCTION, spec->GetClearCost());
|
|
||||||
if (type == UNMOVABLE_OWNED_LAND) cost.MultiplyCost(-1); // They get an income!
|
|
||||||
return cost;
|
return cost;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user