src/newgrf_engine.cpp
branchcpp_gui
changeset 6308 646711c5feaa
parent 6303 84c215fc8eb8
equal deleted inserted replaced
6307:f40e88cff863 6308:646711c5feaa
   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;