MCPcopy Create free account
hub / github.com/OpenTTD/OpenTTD / DoTriggerVehicleRandomisation

Function DoTriggerVehicleRandomisation

src/newgrf_engine.cpp:1260–1319  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1258}
1259
1260static void DoTriggerVehicleRandomisation(Vehicle *v, VehicleRandomTrigger trigger, uint16_t base_random_bits, bool first)
1261{
1262 /* We can't trigger a non-existent vehicle... */
1263 assert(v != nullptr);
1264
1265 VehicleResolverObject object(v->engine_type, v, VehicleResolverObject::WO_CACHED, false, CBID_RANDOM_TRIGGER);
1266 v->waiting_random_triggers.Set(trigger); // store now for var 5F
1267 object.SetWaitingRandomTriggers(v->waiting_random_triggers);
1268
1269 object.ResolveRerandomisation();
1270
1271 /* Store remaining triggers. */
1272 v->waiting_random_triggers.Reset(object.GetUsedRandomTriggers());
1273
1274 /* Rerandomise bits. Scopes other than SELF are invalid for rerandomisation. For bug-to-bug-compatibility with TTDP we ignore the scope. */
1275 uint16_t new_random_bits = Random();
1276 uint32_t reseed = object.GetReseedSum();
1277 v->random_bits &= ~reseed;
1278 v->random_bits |= (first ? new_random_bits : base_random_bits) & reseed;
1279
1280 switch (trigger) {
1281 case VehicleRandomTrigger::NewCargo:
1282 /* All vehicles in chain get ANY_NEW_CARGO trigger now.
1283 * So we call it for the first one and they will recurse.
1284 * Indexing part of vehicle random bits needs to be
1285 * same for all triggered vehicles in the chain (to get
1286 * all the random-cargo wagons carry the same cargo,
1287 * i.e.), so we give them all the NEW_CARGO triggered
1288 * vehicle's portion of random bits. */
1289 assert(first);
1290 DoTriggerVehicleRandomisation(v->First(), VehicleRandomTrigger::AnyNewCargo, new_random_bits, false);
1291 break;
1292
1293 case VehicleRandomTrigger::Depot:
1294 /* We now trigger the next vehicle in chain recursively.
1295 * The random bits portions may be different for each
1296 * vehicle in chain. */
1297 if (v->Next() != nullptr) DoTriggerVehicleRandomisation(v->Next(), trigger, 0, true);
1298 break;
1299
1300 case VehicleRandomTrigger::Empty:
1301 /* We now trigger the next vehicle in chain
1302 * recursively. The random bits portions must be same
1303 * for each vehicle in chain, so we give them all
1304 * first chained vehicle's portion of random bits. */
1305 if (v->Next() != nullptr) DoTriggerVehicleRandomisation(v->Next(), trigger, first ? new_random_bits : base_random_bits, false);
1306 break;
1307
1308 case VehicleRandomTrigger::AnyNewCargo:
1309 /* Now pass the trigger recursively to the next vehicle
1310 * in chain. */
1311 assert(!first);
1312 if (v->Next() != nullptr) DoTriggerVehicleRandomisation(v->Next(), trigger, base_random_bits, false);
1313 break;
1314
1315 case VehicleRandomTrigger::Callback32:
1316 /* Do not do any recursion */
1317 break;

Callers 1

Calls 9

GetUsedRandomTriggersMethod · 0.80
GetReseedSumMethod · 0.80
RandomFunction · 0.50
SetMethod · 0.45
ResetMethod · 0.45
FirstMethod · 0.45
NextMethod · 0.45

Tested by

no test coverage detected