| 1258 | } |
| 1259 | |
| 1260 | static 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; |
no test coverage detected