466 if (parameter >= file->param_end) return 0; |
466 if (parameter >= file->param_end) return 0; |
467 return file->param[parameter]; |
467 return file->param[parameter]; |
468 } |
468 } |
469 |
469 |
470 |
470 |
|
471 static uint8 LiveryHelper(EngineID engine, const Vehicle *v) |
|
472 { |
|
473 const Livery *l; |
|
474 |
|
475 if (v == NULL) { |
|
476 l = GetEngineLivery(engine, _current_player, INVALID_ENGINE, NULL); |
|
477 } else if (v->type == VEH_TRAIN) { |
|
478 l = GetEngineLivery((v->u.rail.first_engine != INVALID_ENGINE && (IsArticulatedPart(v) || UsesWagonOverride(v))) ? v->u.rail.first_engine : v->engine_type, v->owner, v->u.rail.first_engine, v); |
|
479 } else { |
|
480 l = GetEngineLivery(v->engine_type, v->owner, INVALID_ENGINE, v); |
|
481 } |
|
482 |
|
483 return l->colour1 + l->colour2 * 16; |
|
484 } |
|
485 |
|
486 |
471 static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available) |
487 static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available) |
472 { |
488 { |
473 const Vehicle *v = GRV(object); |
489 const Vehicle *v = GRV(object); |
474 |
490 |
475 if (v == NULL) { |
491 if (v == NULL) { |
476 /* Vehicle does not exist, so we're in a purchase list */ |
492 /* Vehicle does not exist, so we're in a purchase list */ |
477 switch (variable) { |
493 switch (variable) { |
478 case 0x43: return _current_player; // Owner information |
494 case 0x43: return _current_player | (LiveryHelper(object->u.vehicle.self_type, NULL) << 24); // Owner information |
479 case 0x46: return 0; // Motion counter |
495 case 0x46: return 0; // Motion counter |
480 case 0x48: return GetEngine(object->u.vehicle.self_type)->flags; // Vehicle Type Info |
496 case 0x48: return GetEngine(object->u.vehicle.self_type)->flags; // Vehicle Type Info |
481 case 0xC4: return clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR; // Build year |
497 case 0xC4: return clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR; // Build year |
482 case 0xDA: return INVALID_VEHICLE; // Next vehicle |
498 case 0xDA: return INVALID_VEHICLE; // Next vehicle |
483 case 0x7F: return GetGRFParameter(object->u.vehicle.self_type, parameter); // Read GRF parameter |
499 case 0x7F: return GetGRFParameter(object->u.vehicle.self_type, parameter); // Read GRF parameter |
542 |
558 |
543 return cargo_classes | (common_cargo_type << 8) | (user_def_data << 24); |
559 return cargo_classes | (common_cargo_type << 8) | (user_def_data << 24); |
544 } |
560 } |
545 |
561 |
546 case 0x43: // Player information |
562 case 0x43: // Player information |
547 return v->owner; |
563 return v->owner | (GetPlayer(v->owner)->is_ai ? 0x10000 : 0) | (LiveryHelper(v->engine_type, v) << 24); |
548 |
564 |
549 case 0x44: // Aircraft information |
565 case 0x44: // Aircraft information |
550 if (v->type != VEH_AIRCRAFT) return UINT_MAX; |
566 if (v->type != VEH_AIRCRAFT) return UINT_MAX; |
551 |
567 |
552 { |
568 { |
884 * Evaluate a newgrf callback for vehicles |
900 * Evaluate a newgrf callback for vehicles |
885 * @param callback The callback to evalute |
901 * @param callback The callback to evalute |
886 * @param param1 First parameter of the callback |
902 * @param param1 First parameter of the callback |
887 * @param param2 Second parameter of the callback |
903 * @param param2 Second parameter of the callback |
888 * @param engine Engine type of the vehicle to evaluate the callback for |
904 * @param engine Engine type of the vehicle to evaluate the callback for |
889 * @param vehicle The vehicle to evaluate the callback for, or NULL if it doesnt exist yet |
905 * @param v The vehicle to evaluate the callback for, or NULL if it doesnt exist yet |
890 * @return The value the callback returned, or CALLBACK_FAILED if it failed |
906 * @return The value the callback returned, or CALLBACK_FAILED if it failed |
891 */ |
907 */ |
892 uint16 GetVehicleCallback(uint16 callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v) |
908 uint16 GetVehicleCallback(uint16 callback, uint32 param1, uint32 param2, EngineID engine, const Vehicle *v) |
893 { |
909 { |
894 const SpriteGroup *group; |
910 const SpriteGroup *group; |
932 group = Resolve(GetVehicleSpriteGroup(engine, v), &object); |
948 group = Resolve(GetVehicleSpriteGroup(engine, v), &object); |
933 if (group == NULL || group->type != SGT_CALLBACK) return CALLBACK_FAILED; |
949 if (group == NULL || group->type != SGT_CALLBACK) return CALLBACK_FAILED; |
934 |
950 |
935 return group->g.callback.result; |
951 return group->g.callback.result; |
936 } |
952 } |
|
953 |
|
954 |
|
955 /* Callback 36 handlers */ |
|
956 uint GetVehicleProperty(const Vehicle *v, uint8 property, uint orig_value) |
|
957 { |
|
958 uint16 callback = GetVehicleCallback(CBID_VEHICLE_MODIFY_PROPERTY, property, 0, v->engine_type, v); |
|
959 if (callback != CALLBACK_FAILED) return callback; |
|
960 |
|
961 return orig_value; |
|
962 } |
|
963 |
|
964 |
|
965 uint GetEngineProperty(EngineID engine, uint8 property, uint orig_value) |
|
966 { |
|
967 uint16 callback = GetVehicleCallback(CBID_VEHICLE_MODIFY_PROPERTY, property, 0, engine, NULL); |
|
968 if (callback != CALLBACK_FAILED) return callback; |
|
969 |
|
970 return orig_value; |
|
971 } |
|
972 |
937 |
973 |
938 static void DoTriggerVehicle(Vehicle *v, VehicleTrigger trigger, byte base_random_bits, bool first) |
974 static void DoTriggerVehicle(Vehicle *v, VehicleTrigger trigger, byte base_random_bits, bool first) |
939 { |
975 { |
940 const SpriteGroup *group; |
976 const SpriteGroup *group; |
941 ResolverObject object; |
977 ResolverObject object; |