(svn r23620) -Add: ScriptTown::SetCargoGoal and ScriptTown::SetGrowthRate (GameScript only)
This commit is contained in:
@@ -762,7 +762,7 @@ static void TownTickHandler(Town *t)
|
||||
int i = t->grow_counter - 1;
|
||||
if (i < 0) {
|
||||
if (GrowTown(t)) {
|
||||
i = t->growth_rate;
|
||||
i = t->growth_rate & (~TOWN_GROW_RATE_CUSTOM);
|
||||
} else {
|
||||
i = 0;
|
||||
}
|
||||
@@ -2434,6 +2434,70 @@ const CargoSpec *FindFirstCargoWithTownEffect(TownEffect effect)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void UpdateTownGrowRate(Town *t);
|
||||
|
||||
/**
|
||||
* Change the cargo goal of a town.
|
||||
* @param tile Unused.
|
||||
* @param flags Type of operation.
|
||||
* @param p1 various bitstuffed elements
|
||||
* - p1 = (bit 0 - 15) - Town ID to cargo game of.
|
||||
* - p1 = (bit 16 - 23) - TownEffect to change the game of.
|
||||
* @param p2 The new goal value.
|
||||
* @param text Unused.
|
||||
* @return Empty cost or an error.
|
||||
*/
|
||||
CommandCost CmdTownCargoGoal(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
|
||||
{
|
||||
if (_current_company != OWNER_DEITY) return CMD_ERROR;
|
||||
|
||||
TownEffect te = (TownEffect)GB(p1, 16, 8);
|
||||
if (te < TE_BEGIN || te > TE_END) return CMD_ERROR;
|
||||
|
||||
uint16 index = GB(p1, 0, 16);
|
||||
Town *t = Town::GetIfValid(index);
|
||||
if (t == NULL) return CMD_ERROR;
|
||||
|
||||
/* Validate if there is a cargo which is the requested TownEffect */
|
||||
const CargoSpec *cargo = FindFirstCargoWithTownEffect(te);
|
||||
if (cargo == NULL) return CMD_ERROR;
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
t->goal[te] = p2;
|
||||
UpdateTownGrowRate(t);
|
||||
InvalidateWindowData(WC_TOWN_VIEW, index);
|
||||
}
|
||||
|
||||
return CommandCost();
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the growth rate of the town.
|
||||
* @param tile Unused.
|
||||
* @param flags Type of operation.
|
||||
* @param p1 Town ID to cargo game of.
|
||||
* @param p2 Amount of days between growth.
|
||||
* @param text Unused.
|
||||
* @return Empty cost or an error.
|
||||
*/
|
||||
CommandCost CmdTownGrowthRate(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
|
||||
{
|
||||
if (_current_company != OWNER_DEITY) return CMD_ERROR;
|
||||
if ((p2 & TOWN_GROW_RATE_CUSTOM) != 0) return CMD_ERROR;
|
||||
if (GB(p2, 16, 16) != 0) return CMD_ERROR;
|
||||
|
||||
Town *t = Town::GetIfValid(p1);
|
||||
if (t == NULL) return CMD_ERROR;
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
t->growth_rate = (p2 == 0) ? 0 : p2 | TOWN_GROW_RATE_CUSTOM;
|
||||
UpdateTownGrowRate(t);
|
||||
InvalidateWindowData(WC_TOWN_VIEW, p1);
|
||||
}
|
||||
|
||||
return CommandCost();
|
||||
}
|
||||
|
||||
/**
|
||||
* Expand a town (scenario editor only).
|
||||
* @param tile Unused.
|
||||
@@ -2883,6 +2947,12 @@ static void UpdateTownGrowRate(Town *t)
|
||||
}
|
||||
}
|
||||
|
||||
if ((t->growth_rate & TOWN_GROW_RATE_CUSTOM) != 0) {
|
||||
SetBit(t->flags, TOWN_IS_FUNDED);
|
||||
SetWindowDirty(WC_TOWN_VIEW, t->index);
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Towns are processed every TOWN_GROWTH_TICKS ticks, and this is the
|
||||
* number of times towns are processed before a new building is built.
|
||||
@@ -2907,7 +2977,6 @@ static void UpdateTownGrowRate(Town *t)
|
||||
|
||||
if (t->fund_buildings_months != 0) {
|
||||
m = _grow_count_values[0][min(n, 5)];
|
||||
t->fund_buildings_months--;
|
||||
} else {
|
||||
m = _grow_count_values[1][min(n, 5)];
|
||||
if (n == 0 && !Chance16(1, 12)) return;
|
||||
@@ -2933,6 +3002,7 @@ static void UpdateTownAmounts(Town *t)
|
||||
{
|
||||
for (CargoID i = 0; i < NUM_CARGO; i++) t->supplied[i].NewMonth();
|
||||
for (int i = TE_BEGIN; i < TE_END; i++) t->received[i].NewMonth();
|
||||
if (t->fund_buildings_months != 0) t->fund_buildings_months--;
|
||||
|
||||
SetWindowDirty(WC_TOWN_VIEW, t->index);
|
||||
}
|
||||
|
Reference in New Issue
Block a user