mirror of https://github.com/OpenTTD/OpenTTD
(svn r11410) -Codechange: implement random triggers for industries.
parent
f6dda29549
commit
af5c2a785f
|
@ -1256,6 +1256,7 @@ static void DeliverGoodsToIndustry(TileIndex xy, CargoID cargo_type, int num_pie
|
||||||
best->produced_cargo_waiting[1] = min(best->produced_cargo_waiting[1] + (num_pieces * indspec->input_cargo_multiplier[accepted_cargo_index][1] / 256), 0xFFFF);
|
best->produced_cargo_waiting[1] = min(best->produced_cargo_waiting[1] + (num_pieces * indspec->input_cargo_multiplier[accepted_cargo_index][1] / 256), 0xFFFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TriggerIndustry(best, INDUSTRY_TRIGGER_RECEIVED_CARGO);
|
||||||
StartStopIndustryTileAnimation(best, IAT_INDUSTRY_RECEIVED_CARGO);
|
StartStopIndustryTileAnimation(best, IAT_INDUSTRY_RECEIVED_CARGO);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,6 +130,9 @@ struct Industry : PoolItem<Industry, IndustryID, &_Industry_pool> {
|
||||||
Date last_cargo_accepted_at; ///< Last day cargo was accepted by this industry
|
Date last_cargo_accepted_at; ///< Last day cargo was accepted by this industry
|
||||||
byte selected_layout; ///< Which tile layout was used when creating the industry
|
byte selected_layout; ///< Which tile layout was used when creating the industry
|
||||||
|
|
||||||
|
byte random_triggers; ///< Triggers for the random
|
||||||
|
uint16 random; ///< Random value used for randomisation of all kinds of things
|
||||||
|
|
||||||
PersistentStorage psa; ///< Persistent storage for NewGRF industries.
|
PersistentStorage psa; ///< Persistent storage for NewGRF industries.
|
||||||
|
|
||||||
Industry(TileIndex tile = 0) : xy(tile) {}
|
Industry(TileIndex tile = 0) : xy(tile) {}
|
||||||
|
|
|
@ -701,6 +701,8 @@ static void TileLoop_Industry(TileIndex tile)
|
||||||
IndustryGfx newgfx;
|
IndustryGfx newgfx;
|
||||||
IndustryGfx gfx;
|
IndustryGfx gfx;
|
||||||
|
|
||||||
|
TriggerIndustryTile(tile, INDTILE_TRIGGER_TILE_LOOP);
|
||||||
|
|
||||||
if (!IsIndustryCompleted(tile)) {
|
if (!IsIndustryCompleted(tile)) {
|
||||||
MakeIndustryTileBigger(tile);
|
MakeIndustryTileBigger(tile);
|
||||||
return;
|
return;
|
||||||
|
@ -1042,6 +1044,7 @@ void OnTick_Industry()
|
||||||
if (_game_mode == GM_EDITOR) return;
|
if (_game_mode == GM_EDITOR) return;
|
||||||
|
|
||||||
FOR_ALL_INDUSTRIES(i) {
|
FOR_ALL_INDUSTRIES(i) {
|
||||||
|
TriggerIndustry(i, INDUSTRY_TRIGGER_INDUSTRY_TICK);
|
||||||
StartStopIndustryTileAnimation(i, IAT_INDUSTRY_TICK);
|
StartStopIndustryTileAnimation(i, IAT_INDUSTRY_TICK);
|
||||||
ProduceIndustryGoods(i);
|
ProduceIndustryGoods(i);
|
||||||
}
|
}
|
||||||
|
@ -2137,6 +2140,9 @@ static const SaveLoad _industry_desc[] = {
|
||||||
|
|
||||||
SLE_CONDARRX(cpp_offsetof(Industry, psa) + cpp_offsetof(Industry::PersistentStorage, storage), SLE_UINT32, 16, 76, SL_MAX_VERSION),
|
SLE_CONDARRX(cpp_offsetof(Industry, psa) + cpp_offsetof(Industry::PersistentStorage, storage), SLE_UINT32, 16, 76, SL_MAX_VERSION),
|
||||||
|
|
||||||
|
SLE_CONDVAR(Industry, random_triggers, SLE_UINT8, 82, SL_MAX_VERSION),
|
||||||
|
SLE_CONDVAR(Industry, random, SLE_UINT16, 82, SL_MAX_VERSION),
|
||||||
|
|
||||||
/* reserve extra space in savegame here. (currently 32 bytes) */
|
/* reserve extra space in savegame here. (currently 32 bytes) */
|
||||||
SLE_CONDNULL(32, 2, SL_MAX_VERSION),
|
SLE_CONDNULL(32, 2, SL_MAX_VERSION),
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include "newgrf_callbacks.h"
|
#include "newgrf_callbacks.h"
|
||||||
#include "newgrf_spritegroup.h"
|
#include "newgrf_spritegroup.h"
|
||||||
#include "newgrf_industries.h"
|
#include "newgrf_industries.h"
|
||||||
|
#include "newgrf_industrytiles.h"
|
||||||
#include "newgrf_commons.h"
|
#include "newgrf_commons.h"
|
||||||
#include "newgrf_text.h"
|
#include "newgrf_text.h"
|
||||||
#include "newgrf_town.h"
|
#include "newgrf_town.h"
|
||||||
|
@ -338,18 +339,18 @@ static const SpriteGroup *IndustryResolveReal(const ResolverObject *object, cons
|
||||||
|
|
||||||
static uint32 IndustryGetRandomBits(const ResolverObject *object)
|
static uint32 IndustryGetRandomBits(const ResolverObject *object)
|
||||||
{
|
{
|
||||||
return object->u.industry.ind == NULL ? 0 : 0; //object->u.industry.ind->random_bits;
|
return object->u.industry.ind == NULL ? 0 : object->u.industry.ind->random;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32 IndustryGetTriggers(const ResolverObject *object)
|
static uint32 IndustryGetTriggers(const ResolverObject *object)
|
||||||
{
|
{
|
||||||
return object->u.industry.ind == NULL ? 0 : 0; //object->u.industry.ind->triggers;
|
return object->u.industry.ind == NULL ? 0 : object->u.industry.ind->random_triggers;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void IndustrySetTriggers(const ResolverObject *object, int triggers)
|
static void IndustrySetTriggers(const ResolverObject *object, int triggers)
|
||||||
{
|
{
|
||||||
if (object->u.industry.ind == NULL) return;
|
if (object->u.industry.ind == NULL) return;
|
||||||
//object->u.industry.ind->triggers = triggers;
|
object->u.industry.ind->random_triggers = triggers;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void NewIndustryResolver(ResolverObject *res, TileIndex tile, Industry *indus)
|
static void NewIndustryResolver(ResolverObject *res, TileIndex tile, Industry *indus)
|
||||||
|
@ -528,3 +529,19 @@ void IndustryProductionCallback(Industry *ind, int reason)
|
||||||
|
|
||||||
InvalidateWindow(WC_INDUSTRY_VIEW, ind->index);
|
InvalidateWindow(WC_INDUSTRY_VIEW, ind->index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DoTriggerIndustry(Industry *ind, IndustryTileTrigger trigger)
|
||||||
|
{
|
||||||
|
ResolverObject object;
|
||||||
|
|
||||||
|
NewIndustryResolver(&object, ind->xy, ind);
|
||||||
|
object.callback = CBID_RANDOM_TRIGGER;
|
||||||
|
object.trigger = trigger;
|
||||||
|
|
||||||
|
const SpriteGroup *group = Resolve(GetIndustrySpec(ind->type)->grf_prop.spritegroup, &object);
|
||||||
|
if (group == NULL) return;
|
||||||
|
|
||||||
|
byte new_random_bits = Random();
|
||||||
|
ind->random &= ~object.reseed;
|
||||||
|
ind->random |= new_random_bits & object.reseed;
|
||||||
|
}
|
||||||
|
|
|
@ -119,14 +119,14 @@ static uint32 IndustryTileGetRandomBits(const ResolverObject *object)
|
||||||
{
|
{
|
||||||
const TileIndex tile = object->u.industry.tile;
|
const TileIndex tile = object->u.industry.tile;
|
||||||
if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return 0;
|
if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return 0;
|
||||||
return (object->scope == VSG_SCOPE_SELF) ? GetIndustryRandomBits(tile) : 0; //GetIndustryByTile(tile)->random_bits;
|
return (object->scope == VSG_SCOPE_SELF) ? GetIndustryRandomBits(tile) : GetIndustryByTile(tile)->random;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32 IndustryTileGetTriggers(const ResolverObject *object)
|
static uint32 IndustryTileGetTriggers(const ResolverObject *object)
|
||||||
{
|
{
|
||||||
const TileIndex tile = object->u.industry.tile;
|
const TileIndex tile = object->u.industry.tile;
|
||||||
if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return 0;
|
if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return 0;
|
||||||
return (object->scope == VSG_SCOPE_SELF) ? GetIndustryTriggers(tile) : 0; //GetIndustryByTile(tile)->triggers;
|
return (object->scope == VSG_SCOPE_SELF) ? GetIndustryTriggers(tile) : GetIndustryByTile(tile)->random_triggers;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void IndustryTileSetTriggers(const ResolverObject *object, int triggers)
|
static void IndustryTileSetTriggers(const ResolverObject *object, int triggers)
|
||||||
|
@ -134,10 +134,10 @@ static void IndustryTileSetTriggers(const ResolverObject *object, int triggers)
|
||||||
const TileIndex tile = object->u.industry.tile;
|
const TileIndex tile = object->u.industry.tile;
|
||||||
if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return;
|
if (tile == INVALID_TILE || !IsTileType(tile, MP_INDUSTRY)) return;
|
||||||
|
|
||||||
if (object->scope != VSG_SCOPE_SELF) {
|
if (object->scope == VSG_SCOPE_SELF) {
|
||||||
SetIndustryTriggers(tile, triggers);
|
SetIndustryTriggers(tile, triggers);
|
||||||
} else {
|
} else {
|
||||||
//GetIndustryByTile(tile)->triggers = triggers;
|
GetIndustryByTile(tile)->random_triggers = triggers;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -385,3 +385,43 @@ bool StartStopIndustryTileAnimation(const Industry *ind, IndustryAnimationTrigge
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void DoTriggerIndustryTile(TileIndex tile, IndustryTileTrigger trigger, Industry *ind)
|
||||||
|
{
|
||||||
|
ResolverObject object;
|
||||||
|
|
||||||
|
IndustryGfx gfx = GetIndustryGfx(tile);
|
||||||
|
const IndustryTileSpec *itspec = GetIndustryTileSpec(gfx);
|
||||||
|
|
||||||
|
NewIndustryTileResolver(&object, gfx, tile, ind);
|
||||||
|
|
||||||
|
object.callback = CBID_RANDOM_TRIGGER;
|
||||||
|
object.trigger = trigger;
|
||||||
|
|
||||||
|
const SpriteGroup *group = Resolve(itspec->grf_prop.spritegroup, &object);
|
||||||
|
if (group == NULL) return;
|
||||||
|
|
||||||
|
byte new_random_bits = Random();
|
||||||
|
byte random_bits = GetIndustryRandomBits(tile);
|
||||||
|
random_bits &= ~object.reseed;
|
||||||
|
random_bits |= new_random_bits & object.reseed;
|
||||||
|
SetIndustryRandomBits(tile, random_bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TriggerIndustryTile(TileIndex tile, IndustryTileTrigger trigger)
|
||||||
|
{
|
||||||
|
DoTriggerIndustryTile(tile, trigger, GetIndustryByTile(tile));
|
||||||
|
}
|
||||||
|
|
||||||
|
extern void DoTriggerIndustry(Industry *ind, IndustryTileTrigger trigger);
|
||||||
|
|
||||||
|
void TriggerIndustry(Industry *ind, IndustryTileTrigger trigger)
|
||||||
|
{
|
||||||
|
BEGIN_TILE_LOOP(tile, ind->width, ind->height, ind->xy)
|
||||||
|
if (IsTileType(tile, MP_INDUSTRY) && GetIndustryIndex(tile) == ind->index) {
|
||||||
|
DoTriggerIndustryTile(tile, trigger, ind);
|
||||||
|
}
|
||||||
|
END_TILE_LOOP(tile, ind->width, ind->height, ind->xy)
|
||||||
|
|
||||||
|
DoTriggerIndustry(ind, trigger);
|
||||||
|
}
|
||||||
|
|
|
@ -21,4 +21,16 @@ void AnimateNewIndustryTile(TileIndex tile);
|
||||||
bool StartStopIndustryTileAnimation(TileIndex tile, IndustryAnimationTrigger iat, uint32 random = Random());
|
bool StartStopIndustryTileAnimation(TileIndex tile, IndustryAnimationTrigger iat, uint32 random = Random());
|
||||||
bool StartStopIndustryTileAnimation(const Industry *ind, IndustryAnimationTrigger iat);
|
bool StartStopIndustryTileAnimation(const Industry *ind, IndustryAnimationTrigger iat);
|
||||||
|
|
||||||
|
|
||||||
|
enum IndustryTileTrigger {
|
||||||
|
/* The tile of the industry has been triggered during the tileloop. */
|
||||||
|
INDTILE_TRIGGER_TILE_LOOP = 0x01,
|
||||||
|
/* The industry has been triggered via it's tick. */
|
||||||
|
INDUSTRY_TRIGGER_INDUSTRY_TICK = 0x02,
|
||||||
|
/* Cargo has been delivered. */
|
||||||
|
INDUSTRY_TRIGGER_RECEIVED_CARGO = 0x04,
|
||||||
|
};
|
||||||
|
void TriggerIndustryTile(TileIndex t, IndustryTileTrigger trigger);
|
||||||
|
void TriggerIndustry(Industry *ind, IndustryTileTrigger trigger);
|
||||||
|
|
||||||
#endif /* NEWGRF_INDUSTRYTILES_H */
|
#endif /* NEWGRF_INDUSTRYTILES_H */
|
||||||
|
|
|
@ -252,7 +252,7 @@ static inline const SpriteGroup *ResolveRandom(const SpriteGroup *group, Resolve
|
||||||
/* Handle triggers */
|
/* Handle triggers */
|
||||||
/* Magic code that may or may not do the right things... */
|
/* Magic code that may or may not do the right things... */
|
||||||
byte waiting_triggers = object->GetTriggers(object);
|
byte waiting_triggers = object->GetTriggers(object);
|
||||||
byte match = group->g.random.triggers & (waiting_triggers | object->trigger);
|
byte match = group->g.random.triggers & (waiting_triggers | object->trigger) || group->g.random.triggers == 0;
|
||||||
bool res;
|
bool res;
|
||||||
|
|
||||||
res = (group->g.random.cmp_mode == RSG_CMP_ANY) ?
|
res = (group->g.random.cmp_mode == RSG_CMP_ANY) ?
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#include "strings.h"
|
#include "strings.h"
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
extern const uint16 SAVEGAME_VERSION = 81;
|
extern const uint16 SAVEGAME_VERSION = 82;
|
||||||
uint16 _sl_version; ///< the major savegame version identifier
|
uint16 _sl_version; ///< the major savegame version identifier
|
||||||
byte _sl_minor_version; ///< the minor savegame version, DO NOT USE!
|
byte _sl_minor_version; ///< the minor savegame version, DO NOT USE!
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue