newgrf_engine.c
changeset 4057 36ceb8e7cbd2
parent 4056 30ceffc75059
child 4058 019da48e79d3
equal deleted inserted replaced
4056:30ceffc75059 4057:36ceb8e7cbd2
   500 
   500 
   501 	if (v != NULL) v->waiting_triggers = triggers;
   501 	if (v != NULL) v->waiting_triggers = triggers;
   502 }
   502 }
   503 
   503 
   504 
   504 
       
   505 static uint32 GetGRFParameter(EngineID engine_type, byte parameter)
       
   506 {
       
   507 	const GRFFile *file = GetEngineGRF(engine_type);
       
   508 
       
   509 	if (parameter >= file->param_end) return 0;
       
   510 	return file->param[parameter];
       
   511 }
       
   512 
       
   513 
   505 static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
   514 static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
   506 {
   515 {
   507 	const Vehicle *v = GRV(object);
   516 	const Vehicle *v = GRV(object);
   508 
   517 
   509 	if (v == NULL) {
   518 	if (v == NULL) {
   511 		switch (variable) {
   520 		switch (variable) {
   512 			case 0x43: return _current_player; /* Owner information */
   521 			case 0x43: return _current_player; /* Owner information */
   513 			case 0x46: return 0;               /* Motion counter */
   522 			case 0x46: return 0;               /* Motion counter */
   514 			case 0xC4: return _cur_year;       /* Build year */
   523 			case 0xC4: return _cur_year;       /* Build year */
   515 			case 0xDA: return INVALID_VEHICLE; /* Next vehicle */
   524 			case 0xDA: return INVALID_VEHICLE; /* Next vehicle */
       
   525 			case 0x7F: return GetGRFParameter(object->u.vehicle.self_type, parameter); /* Read GRF parameter */
   516 		}
   526 		}
   517 
   527 
   518 		*available = false;
   528 		*available = false;
   519 		return -1;
   529 		return -1;
   520 	}
   530 	}
   626 					if (v->engine_type == parameter) count++;
   636 					if (v->engine_type == parameter) count++;
   627 				}
   637 				}
   628 				return count;
   638 				return count;
   629 			}
   639 			}
   630 
   640 
   631 		case 0x7F: { /* Read GRF parameter */
   641 		case 0x7F: return GetGRFParameter(v->engine_type, parameter); /* Read GRF parameter */
   632 			const GRFFile *file = GetEngineGRF(v->engine_type);
       
   633 			if (parameter >= file->param_end) return 0;
       
   634 			return file->param[parameter];
       
   635 		}
       
   636 	}
   642 	}
   637 
   643 
   638 	/* General vehicle properties */
   644 	/* General vehicle properties */
   639 	switch (variable - 0x80) {
   645 	switch (variable - 0x80) {
   640 		case 0x00: return v->type;
   646 		case 0x00: return v->type;
   786 
   792 
   787 	return in_motion ? group->g.real.loaded[set] : group->g.real.loading[set];
   793 	return in_motion ? group->g.real.loaded[set] : group->g.real.loading[set];
   788 }
   794 }
   789 
   795 
   790 
   796 
   791 static inline void NewVehicleResolver(ResolverObject *res, const Vehicle *v)
   797 static inline void NewVehicleResolver(ResolverObject *res, EngineID engine_type, const Vehicle *v)
   792 {
   798 {
   793 	res->GetRandomBits = &VehicleGetRandomBits;
   799 	res->GetRandomBits = &VehicleGetRandomBits;
   794 	res->GetTriggers   = &VehicleGetTriggers;
   800 	res->GetTriggers   = &VehicleGetTriggers;
   795 	res->SetTriggers   = &VehicleSetTriggers;
   801 	res->SetTriggers   = &VehicleSetTriggers;
   796 	res->GetVariable   = &VehicleGetVariable;
   802 	res->GetVariable   = &VehicleGetVariable;
   797 	res->ResolveReal   = &VehicleResolveReal;
   803 	res->ResolveReal   = &VehicleResolveReal;
   798 
   804 
   799 	res->u.vehicle.self   = v;
   805 	res->u.vehicle.self   = v;
   800 	res->u.vehicle.parent = (v != NULL && v->type == VEH_Train) ? GetFirstVehicleInChain(v) : v;
   806 	res->u.vehicle.parent = (v != NULL && v->type == VEH_Train) ? GetFirstVehicleInChain(v) : v;
       
   807 
       
   808 	res->u.vehicle.self_type = engine_type;
   801 
   809 
   802 	res->info_view = false;
   810 	res->info_view = false;
   803 
   811 
   804 	res->callback        = 0;
   812 	res->callback        = 0;
   805 	res->callback_param1 = 0;
   813 	res->callback_param1 = 0;
   814 {
   822 {
   815 	const SpriteGroup *group;
   823 	const SpriteGroup *group;
   816 	ResolverObject object;
   824 	ResolverObject object;
   817 	CargoID cargo = GC_PURCHASE;
   825 	CargoID cargo = GC_PURCHASE;
   818 
   826 
   819 	NewVehicleResolver(&object, v);
   827 	NewVehicleResolver(&object, engine, v);
   820 
   828 
   821 	if (v != NULL) {
   829 	if (v != NULL) {
   822 		cargo = _global_cargo_id[_opt.landscape][v->cargo_type];
   830 		cargo = _global_cargo_id[_opt.landscape][v->cargo_type];
   823 		assert(cargo != GC_INVALID);
   831 		assert(cargo != GC_INVALID);
   824 	}
   832 	}
   853 	assert(engine < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES);
   861 	assert(engine < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES);
   854 
   862 
   855 	/* Only valid for helicopters */
   863 	/* Only valid for helicopters */
   856 	assert(!(AircraftVehInfo(engine)->subtype & AIR_CTOL));
   864 	assert(!(AircraftVehInfo(engine)->subtype & AIR_CTOL));
   857 
   865 
   858 	NewVehicleResolver(&object, v);
   866 	NewVehicleResolver(&object, engine, v);
   859 
   867 
   860 	object.info_view = info_view;
   868 	object.info_view = info_view;
   861 
   869 
   862 	group = heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX];
   870 	group = heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX];
   863 	group = Resolve(group, &object);
   871 	group = Resolve(group, &object);
   894 {
   902 {
   895 	const SpriteGroup *group;
   903 	const SpriteGroup *group;
   896 	ResolverObject object;
   904 	ResolverObject object;
   897 	CargoID cargo;
   905 	CargoID cargo;
   898 
   906 
   899 	NewVehicleResolver(&object, v);
   907 	NewVehicleResolver(&object, engine, v);
   900 
   908 
   901 	object.callback        = callback;
   909 	object.callback        = callback;
   902 	object.callback_param1 = param1;
   910 	object.callback_param1 = param1;
   903 	object.callback_param2 = param2;
   911 	object.callback_param2 = param2;
   904 
   912 
   939 {
   947 {
   940 	const SpriteGroup *group;
   948 	const SpriteGroup *group;
   941 	ResolverObject object;
   949 	ResolverObject object;
   942 	CargoID cargo;
   950 	CargoID cargo;
   943 
   951 
   944 	NewVehicleResolver(&object, v);
   952 	NewVehicleResolver(&object, engine, v);
   945 
   953 
   946 	object.callback        = callback;
   954 	object.callback        = callback;
   947 	object.callback_param1 = param1;
   955 	object.callback_param1 = param1;
   948 	object.callback_param2 = param2;
   956 	object.callback_param2 = param2;
   949 
   957 
   980 	byte new_random_bits;
   988 	byte new_random_bits;
   981 
   989 
   982 	/* We can't trigger a non-existent vehicle... */
   990 	/* We can't trigger a non-existent vehicle... */
   983 	assert(v != NULL);
   991 	assert(v != NULL);
   984 
   992 
   985 	NewVehicleResolver(&object, v);
   993 	NewVehicleResolver(&object, v->engine_type, v);
   986 
   994 
   987 	object.trigger = trigger;
   995 	object.trigger = trigger;
   988 
   996 
   989 	cargo = _global_cargo_id[_opt.landscape][v->cargo_type];
   997 	cargo = _global_cargo_id[_opt.landscape][v->cargo_type];
   990 	group = engine_custom_sprites[v->engine_type][cargo];
   998 	group = engine_custom_sprites[v->engine_type][cargo];