src/newgrf_engine.cpp
branchnoai
changeset 9624 b71483f2330f
parent 9620 31e38d28a0af
child 9626 79f2b5a0cdd7
equal deleted inserted replaced
9623:ee0173281563 9624:b71483f2330f
    61 	wo->trains = trains;
    61 	wo->trains = trains;
    62 	wo->train_id = MallocT<byte>(trains);
    62 	wo->train_id = MallocT<byte>(trains);
    63 	memcpy(wo->train_id, train_id, trains);
    63 	memcpy(wo->train_id, train_id, trains);
    64 }
    64 }
    65 
    65 
    66 static const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, byte overriding_engine)
    66 const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, byte overriding_engine)
    67 {
    67 {
    68 	const WagonOverrides *wos = &_engine_wagon_overrides[engine];
    68 	const WagonOverrides *wos = &_engine_wagon_overrides[engine];
    69 	int i;
       
    70 
    69 
    71 	/* XXX: This could turn out to be a timesink on profiles. We could
    70 	/* XXX: This could turn out to be a timesink on profiles. We could
    72 	 * always just dedicate 65535 bytes for an [engine][train] trampoline
    71 	 * always just dedicate 65535 bytes for an [engine][train] trampoline
    73 	 * for O(1). Or O(logMlogN) and searching binary tree or smt. like
    72 	 * for O(1). Or O(logMlogN) and searching binary tree or smt. like
    74 	 * that. --pasky */
    73 	 * that. --pasky */
    75 
    74 
    76 	for (i = 0; i < wos->overrides_count; i++) {
    75 	for (int i = 0; i < wos->overrides_count; i++) {
    77 		const WagonOverride *wo = &wos->overrides[i];
    76 		const WagonOverride *wo = &wos->overrides[i];
    78 		int j;
    77 
    79 
    78 		if (wo->cargo != cargo && wo->cargo != CT_DEFAULT) continue;
    80 		for (j = 0; j < wo->trains; j++) {
    79 
    81 			if (wo->train_id[j] == overriding_engine && (wo->cargo == cargo || wo->cargo == CT_DEFAULT)) return wo->group;
    80 		for (int j = 0; j < wo->trains; j++) {
       
    81 			if (wo->train_id[j] == overriding_engine) return wo->group;
    82 		}
    82 		}
    83 	}
    83 	}
    84 	return NULL;
    84 	return NULL;
    85 }
    85 }
    86 
    86 
   244  */
   244  */
   245 static byte MapAircraftMovementState(const Vehicle *v)
   245 static byte MapAircraftMovementState(const Vehicle *v)
   246 {
   246 {
   247 	const Station *st = GetStation(v->u.air.targetairport);
   247 	const Station *st = GetStation(v->u.air.targetairport);
   248 	const AirportFTAClass *afc = st->Airport();
   248 	const AirportFTAClass *afc = st->Airport();
   249 	byte amdflag = afc->MovingData(v->u.air.pos)->flag;
   249 	uint16 amdflag = afc->MovingData(v->u.air.pos)->flag;
   250 
   250 
   251 	switch (v->u.air.state) {
   251 	switch (v->u.air.state) {
   252 		case HANGAR:
   252 		case HANGAR:
   253 			/* The international airport is a special case as helicopters can land in
   253 			/* The international airport is a special case as helicopters can land in
   254 			 * front of the hanger. Helicopters also change their air.state to
   254 			 * front of the hanger. Helicopters also change their air.state to
   311 			} else {
   311 			} else {
   312 				return AMS_TTDP_HELI_TAKEOFF_HELIPORT;
   312 				return AMS_TTDP_HELI_TAKEOFF_HELIPORT;
   313 			}
   313 			}
   314 
   314 
   315 		case FLYING:
   315 		case FLYING:
   316 			return AMS_TTDP_FLIGHT_TO_TOWER;
   316 			return amdflag & AMED_HOLD ? AMS_TTDP_FLIGHT_APPROACH : AMS_TTDP_FLIGHT_TO_TOWER;
   317 
   317 
   318 		case LANDING: // Descent
   318 		case LANDING: // Descent
   319 			return AMS_TTDP_FLIGHT_DESCENT;
   319 			return AMS_TTDP_FLIGHT_DESCENT;
   320 
   320 
   321 		case ENDLANDING: // On the runway braking
   321 		case ENDLANDING: // On the runway braking
   768 				case 0x62: return MapAircraftMovementState(v);  // Current movement state
   768 				case 0x62: return MapAircraftMovementState(v);  // Current movement state
   769 				case 0x63: return v->u.air.targetairport;       // Airport to which the action refers
   769 				case 0x63: return v->u.air.targetairport;       // Airport to which the action refers
   770 				case 0x66: return MapAircraftMovementAction(v); // Current movement action
   770 				case 0x66: return MapAircraftMovementAction(v); // Current movement action
   771 			}
   771 			}
   772 			break;
   772 			break;
       
   773 
       
   774 		default: break;
   773 	}
   775 	}
   774 
   776 
   775 	DEBUG(grf, 1, "Unhandled vehicle property 0x%X, type 0x%X", variable, v->type);
   777 	DEBUG(grf, 1, "Unhandled vehicle property 0x%X, type 0x%X", variable, v->type);
   776 
   778 
   777 	*available = false;
   779 	*available = false;
   848 		cargo = CT_PURCHASE;
   850 		cargo = CT_PURCHASE;
   849 	} else {
   851 	} else {
   850 		cargo = v->cargo_type;
   852 		cargo = v->cargo_type;
   851 
   853 
   852 		if (v->type == VEH_TRAIN) {
   854 		if (v->type == VEH_TRAIN) {
   853 			group = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine);
   855 			group = v->u.rail.cached_override;
   854 
       
   855 			if (group != NULL) return group;
   856 			if (group != NULL) return group;
   856 		}
   857 		}
   857 	}
   858 	}
   858 
   859 
   859 	group = _engine_custom_sprites[engine][cargo];
   860 	group = _engine_custom_sprites[engine][cargo];
   910  * @return true if it is using an override, false otherwise
   911  * @return true if it is using an override, false otherwise
   911  */
   912  */
   912 bool UsesWagonOverride(const Vehicle* v)
   913 bool UsesWagonOverride(const Vehicle* v)
   913 {
   914 {
   914 	assert(v->type == VEH_TRAIN);
   915 	assert(v->type == VEH_TRAIN);
   915 	return GetWagonOverrideSpriteSet(v->engine_type, v->cargo_type, v->u.rail.first_engine) != NULL;
   916 	return v->u.rail.cached_override != NULL;
   916 }
   917 }
   917 
   918 
   918 /**
   919 /**
   919  * Evaluate a newgrf callback for vehicles
   920  * Evaluate a newgrf callback for vehicles
   920  * @param callback The callback to evalute
   921  * @param callback The callback to evalute