Elide vehicle random trigger callbacks
This commit is contained in:
@@ -338,6 +338,7 @@ enum SpriteGroupCallbacksUsed : uint8 {
|
|||||||
SGCU_ALL = 0xFF,
|
SGCU_ALL = 0xFF,
|
||||||
SGCU_VEHICLE_32DAY_CALLBACK = 1 << 0,
|
SGCU_VEHICLE_32DAY_CALLBACK = 1 << 0,
|
||||||
SGCU_VEHICLE_REFIT_COST = 1 << 1,
|
SGCU_VEHICLE_REFIT_COST = 1 << 1,
|
||||||
|
SGCU_RANDOM_TRIGGER = 1 << 2,
|
||||||
};
|
};
|
||||||
DECLARE_ENUM_AS_BIT_SET(SpriteGroupCallbacksUsed)
|
DECLARE_ENUM_AS_BIT_SET(SpriteGroupCallbacksUsed)
|
||||||
|
|
||||||
|
@@ -1378,6 +1378,8 @@ static void DoTriggerVehicle(Vehicle *v, VehicleTrigger trigger, byte base_rando
|
|||||||
/* We can't trigger a non-existent vehicle... */
|
/* We can't trigger a non-existent vehicle... */
|
||||||
assert(v != nullptr);
|
assert(v != nullptr);
|
||||||
|
|
||||||
|
uint32 reseed = 0;
|
||||||
|
if (Engine::Get(v->engine_type)->callbacks_used & SGCU_RANDOM_TRIGGER) {
|
||||||
VehicleResolverObject object(v->engine_type, v, VehicleResolverObject::WO_CACHED, false, CBID_RANDOM_TRIGGER);
|
VehicleResolverObject object(v->engine_type, v, VehicleResolverObject::WO_CACHED, false, CBID_RANDOM_TRIGGER);
|
||||||
object.waiting_triggers = v->waiting_triggers | trigger;
|
object.waiting_triggers = v->waiting_triggers | trigger;
|
||||||
v->waiting_triggers = object.waiting_triggers; // store now for var 5F
|
v->waiting_triggers = object.waiting_triggers; // store now for var 5F
|
||||||
@@ -1388,9 +1390,16 @@ static void DoTriggerVehicle(Vehicle *v, VehicleTrigger trigger, byte base_rando
|
|||||||
/* Store remaining triggers. */
|
/* Store remaining triggers. */
|
||||||
v->waiting_triggers = object.GetRemainingTriggers();
|
v->waiting_triggers = object.GetRemainingTriggers();
|
||||||
|
|
||||||
|
reseed = object.GetReseedSum();
|
||||||
|
} else {
|
||||||
|
v->waiting_triggers |= trigger;
|
||||||
|
|
||||||
|
const Engine *e = Engine::Get(v->engine_type);
|
||||||
|
if (!(e->grf_prop.spritegroup[v->cargo_type] || e->grf_prop.spritegroup[CT_DEFAULT])) return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Rerandomise bits. Scopes other than SELF are invalid for rerandomisation. For bug-to-bug-compatibility with TTDP we ignore the scope. */
|
/* Rerandomise bits. Scopes other than SELF are invalid for rerandomisation. For bug-to-bug-compatibility with TTDP we ignore the scope. */
|
||||||
byte new_random_bits = Random();
|
byte new_random_bits = Random();
|
||||||
uint32 reseed = object.GetReseedSum();
|
|
||||||
v->random_bits &= ~reseed;
|
v->random_bits &= ~reseed;
|
||||||
v->random_bits |= (first ? new_random_bits : base_random_bits) & reseed;
|
v->random_bits |= (first ? new_random_bits : base_random_bits) & reseed;
|
||||||
|
|
||||||
|
@@ -341,6 +341,10 @@ void DeterministicSpriteGroup::AnalyseCallbacks(AnalyseCallbackOperation &op) co
|
|||||||
op.callbacks_used |= SGCU_VEHICLE_REFIT_COST;
|
op.callbacks_used |= SGCU_VEHICLE_REFIT_COST;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CBID_RANDOM_TRIGGER:
|
||||||
|
op.callbacks_used |= SGCU_RANDOM_TRIGGER;
|
||||||
|
break;
|
||||||
|
|
||||||
case CBID_VEHICLE_MODIFY_PROPERTY:
|
case CBID_VEHICLE_MODIFY_PROPERTY:
|
||||||
if (range.group != nullptr) {
|
if (range.group != nullptr) {
|
||||||
AnalyseCallbackOperation cb36_op;
|
AnalyseCallbackOperation cb36_op;
|
||||||
@@ -433,6 +437,10 @@ const SpriteGroup *RandomizedSpriteGroup::Resolve(ResolverObject &object) const
|
|||||||
return SpriteGroup::Resolve(this->groups[index], object, false);
|
return SpriteGroup::Resolve(this->groups[index], object, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RandomizedSpriteGroup::AnalyseCallbacks(AnalyseCallbackOperation &op) const
|
||||||
|
{
|
||||||
|
if (op.mode == ACOM_CB_VAR) op.callbacks_used |= SGCU_RANDOM_TRIGGER;
|
||||||
|
}
|
||||||
|
|
||||||
const SpriteGroup *RealSpriteGroup::Resolve(ResolverObject &object) const
|
const SpriteGroup *RealSpriteGroup::Resolve(ResolverObject &object) const
|
||||||
{
|
{
|
||||||
|
@@ -219,6 +219,8 @@ struct RandomizedSpriteGroup : SpriteGroup {
|
|||||||
|
|
||||||
std::vector<const SpriteGroup *> groups; ///< Take the group with appropriate index:
|
std::vector<const SpriteGroup *> groups; ///< Take the group with appropriate index:
|
||||||
|
|
||||||
|
void AnalyseCallbacks(AnalyseCallbackOperation &op) const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const SpriteGroup *Resolve(ResolverObject &object) const;
|
const SpriteGroup *Resolve(ResolverObject &object) const;
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user