src/newgrf_engine.cpp
branchgamebalance
changeset 9895 7bd07f43b0e3
parent 6502 7ca154aca2b7
child 9906 6f41b8713b65
equal deleted inserted replaced
9894:70d78ac95d6c 9895:7bd07f43b0e3
    22 
    22 
    23 
    23 
    24 int _traininfo_vehicle_pitch = 0;
    24 int _traininfo_vehicle_pitch = 0;
    25 int _traininfo_vehicle_width = 29;
    25 int _traininfo_vehicle_width = 29;
    26 
    26 
    27 typedef struct WagonOverride {
    27 struct WagonOverride {
    28 	byte *train_id;
    28 	byte *train_id;
    29 	int trains;
    29 	int trains;
    30 	CargoID cargo;
    30 	CargoID cargo;
    31 	const SpriteGroup *group;
    31 	const SpriteGroup *group;
    32 } WagonOverride;
    32 };
    33 
    33 
    34 typedef struct WagonOverrides {
    34 struct WagonOverrides {
    35 	int overrides_count;
    35 	int overrides_count;
    36 	WagonOverride *overrides;
    36 	WagonOverride *overrides;
    37 } WagonOverrides;
    37 };
    38 
    38 
    39 static WagonOverrides _engine_wagon_overrides[TOTAL_NUM_ENGINES];
    39 static WagonOverrides _engine_wagon_overrides[TOTAL_NUM_ENGINES];
    40 
    40 
    41 void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *group, byte *train_id, int trains)
    41 void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *group, byte *train_id, int trains)
    42 {
    42 {
    83 }
    83 }
    84 
    84 
    85 /**
    85 /**
    86  * Unload all wagon override sprite groups.
    86  * Unload all wagon override sprite groups.
    87  */
    87  */
    88 void UnloadWagonOverrides(void)
    88 void UnloadWagonOverrides()
    89 {
    89 {
    90 	WagonOverrides *wos;
    90 	WagonOverrides *wos;
    91 	WagonOverride *wo;
    91 	WagonOverride *wo;
    92 	EngineID engine;
    92 	EngineID engine;
    93 	int i;
    93 	int i;
   121 }
   121 }
   122 
   122 
   123 /**
   123 /**
   124  * Unload all engine sprite groups.
   124  * Unload all engine sprite groups.
   125  */
   125  */
   126 void UnloadCustomEngineSprites(void)
   126 void UnloadCustomEngineSprites()
   127 {
   127 {
   128 	memset(_engine_custom_sprites, 0, sizeof(_engine_custom_sprites));
   128 	memset(_engine_custom_sprites, 0, sizeof(_engine_custom_sprites));
   129 	memset(_engine_grf, 0, sizeof(_engine_grf));
   129 	memset(_engine_grf, 0, sizeof(_engine_grf));
   130 }
   130 }
   131 
   131 
   142 	}
   142 	}
   143 	heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX] = group;
   143 	heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX] = group;
   144 }
   144 }
   145 
   145 
   146 /** Unload all rotor override sprite groups */
   146 /** Unload all rotor override sprite groups */
   147 void UnloadRotorOverrideSprites(void)
   147 void UnloadRotorOverrideSprites()
   148 {
   148 {
   149 	EngineID engine;
   149 	EngineID engine;
   150 
   150 
   151 	/* Starting at AIRCRAFT_ENGINES_INDEX may seem pointless, but it means
   151 	/* Starting at AIRCRAFT_ENGINES_INDEX may seem pointless, but it means
   152 	 * the context of EngineID is correct */
   152 	 * the context of EngineID is correct */
   193 }
   193 }
   194 
   194 
   195 
   195 
   196 static int MapOldSubType(const Vehicle *v)
   196 static int MapOldSubType(const Vehicle *v)
   197 {
   197 {
   198 	if (v->type != VEH_Train) return v->subtype;
   198 	if (v->type != VEH_TRAIN) return v->subtype;
   199 	if (IsTrainEngine(v)) return 0;
   199 	if (IsTrainEngine(v)) return 0;
   200 	if (IsFreeWagon(v)) return 4;
   200 	if (IsFreeWagon(v)) return 4;
   201 	return 2;
   201 	return 2;
   202 }
   202 }
   203 
   203 
   487 
   487 
   488 	/* Calculated vehicle parameters */
   488 	/* Calculated vehicle parameters */
   489 	switch (variable) {
   489 	switch (variable) {
   490 		case 0x40: /* Get length of consist */
   490 		case 0x40: /* Get length of consist */
   491 		case 0x41: /* Get length of same consecutive wagons */
   491 		case 0x41: /* Get length of same consecutive wagons */
   492 			if (v->type != VEH_Train) return 1;
   492 			if (v->type != VEH_TRAIN) return 1;
   493 
   493 
   494 			{
   494 			{
   495 				const Vehicle* u;
   495 				const Vehicle* u;
   496 				byte chain_before = 0;
   496 				byte chain_before = 0;
   497 				byte chain_after  = 0;
   497 				byte chain_after  = 0;
   543 
   543 
   544 		case 0x43: /* Player information */
   544 		case 0x43: /* Player information */
   545 			return v->owner;
   545 			return v->owner;
   546 
   546 
   547 		case 0x44: /* Aircraft information */
   547 		case 0x44: /* Aircraft information */
   548 			if (v->type != VEH_Aircraft) return UINT_MAX;
   548 			if (v->type != VEH_AIRCRAFT) return UINT_MAX;
   549 
   549 
   550 			{
   550 			{
   551 				const Vehicle *w = v->next;
   551 				const Vehicle *w = v->next;
   552 				uint16 altitude = v->z_pos - w->z_pos; /* Aircraft height - shadow height */
   552 				uint16 altitude = v->z_pos - w->z_pos; /* Aircraft height - shadow height */
   553 				byte airporttype;
   553 				byte airporttype;
   588 
   588 
   589 		case 0x48: return GetEngine(v->engine_type)->flags; /* Vehicle Type Info */
   589 		case 0x48: return GetEngine(v->engine_type)->flags; /* Vehicle Type Info */
   590 
   590 
   591 		/* Variables which use the parameter */
   591 		/* Variables which use the parameter */
   592 		case 0x60: /* Count consist's engine ID occurance */
   592 		case 0x60: /* Count consist's engine ID occurance */
   593 			if (v->type != VEH_Train) return v->engine_type == parameter;
   593 			if (v->type != VEH_TRAIN) return v->engine_type == parameter;
   594 
   594 
   595 			{
   595 			{
   596 				uint count = 0;
   596 				uint count = 0;
   597 				for (; v != NULL; v = v->next) {
   597 				for (; v != NULL; v = v->next) {
   598 					if (v->engine_type == parameter) count++;
   598 					if (v->engine_type == parameter) count++;
   697 		case 0x7B: return v->waiting_triggers;
   697 		case 0x7B: return v->waiting_triggers;
   698 	}
   698 	}
   699 
   699 
   700 	/* Vehicle specific properties */
   700 	/* Vehicle specific properties */
   701 	switch (v->type) {
   701 	switch (v->type) {
   702 		case VEH_Train:
   702 		case VEH_TRAIN:
   703 			switch (variable - 0x80) {
   703 			switch (variable - 0x80) {
   704 				case 0x62: return v->u.rail.track;
   704 				case 0x62: return v->u.rail.track;
   705 				case 0x66: return v->u.rail.railtype;
   705 				case 0x66: return v->u.rail.railtype;
   706 				case 0x73: return v->u.rail.cached_veh_length;
   706 				case 0x73: return v->u.rail.cached_veh_length;
   707 				case 0x74: return v->u.rail.cached_power;
   707 				case 0x74: return v->u.rail.cached_power;
   712 				case 0x7D: return GB(v->first->index, 8, 8);
   712 				case 0x7D: return GB(v->first->index, 8, 8);
   713 				case 0x7F: return 0; // Used for vehicle reversing hack in TTDP
   713 				case 0x7F: return 0; // Used for vehicle reversing hack in TTDP
   714 			}
   714 			}
   715 			break;
   715 			break;
   716 
   716 
   717 		case VEH_Road:
   717 		case VEH_ROAD:
   718 			switch (variable - 0x80) {
   718 			switch (variable - 0x80) {
   719 				case 0x62: return v->u.road.state;
   719 				case 0x62: return v->u.road.state;
   720 				case 0x64: return v->u.road.blocked_ctr;
   720 				case 0x64: return v->u.road.blocked_ctr;
   721 				case 0x65: return GB(v->u.road.blocked_ctr, 8, 8);
   721 				case 0x65: return GB(v->u.road.blocked_ctr, 8, 8);
   722 				case 0x66: return v->u.road.overtaking;
   722 				case 0x66: return v->u.road.overtaking;
   724 				case 0x68: return v->u.road.crashed_ctr;
   724 				case 0x68: return v->u.road.crashed_ctr;
   725 				case 0x69: return GB(v->u.road.crashed_ctr, 8, 8);
   725 				case 0x69: return GB(v->u.road.crashed_ctr, 8, 8);
   726 			}
   726 			}
   727 			break;
   727 			break;
   728 
   728 
   729 		case VEH_Aircraft:
   729 		case VEH_AIRCRAFT:
   730 			switch (variable - 0x80) {
   730 			switch (variable - 0x80) {
   731 				case 0x62: return MapAircraftMovementState(v);  // Current movement state
   731 				case 0x62: return MapAircraftMovementState(v);  // Current movement state
   732 				case 0x63: return v->u.air.targetairport;       // Airport to which the action refers
   732 				case 0x63: return v->u.air.targetairport;       // Airport to which the action refers
   733 				case 0x66: return MapAircraftMovementAction(v); // Current movement action
   733 				case 0x66: return MapAircraftMovementAction(v); // Current movement action
   734 			}
   734 			}
   749 	uint set;
   749 	uint set;
   750 	bool in_motion;
   750 	bool in_motion;
   751 
   751 
   752 	if (v == NULL) return group->g.real.loading[0];
   752 	if (v == NULL) return group->g.real.loading[0];
   753 
   753 
   754 	if (v->type == VEH_Train) {
   754 	if (v->type == VEH_TRAIN) {
   755 		in_motion = GetFirstVehicleInChain(v)->current_order.type != OT_LOADING;
   755 		in_motion = GetFirstVehicleInChain(v)->current_order.type != OT_LOADING;
   756 	} else {
   756 	} else {
   757 		in_motion = v->current_order.type != OT_LOADING;
   757 		in_motion = v->current_order.type != OT_LOADING;
   758 	}
   758 	}
   759 
   759 
   778 	res->SetTriggers   = &VehicleSetTriggers;
   778 	res->SetTriggers   = &VehicleSetTriggers;
   779 	res->GetVariable   = &VehicleGetVariable;
   779 	res->GetVariable   = &VehicleGetVariable;
   780 	res->ResolveReal   = &VehicleResolveReal;
   780 	res->ResolveReal   = &VehicleResolveReal;
   781 
   781 
   782 	res->u.vehicle.self   = v;
   782 	res->u.vehicle.self   = v;
   783 	res->u.vehicle.parent = (v != NULL && v->type == VEH_Train) ? GetFirstVehicleInChain(v) : v;
   783 	res->u.vehicle.parent = (v != NULL && v->type == VEH_TRAIN) ? GetFirstVehicleInChain(v) : v;
   784 
   784 
   785 	res->u.vehicle.self_type = engine_type;
   785 	res->u.vehicle.self_type = engine_type;
   786 
   786 
   787 	res->info_view = false;
   787 	res->info_view = false;
   788 
   788 
   810 	if (v == NULL) {
   810 	if (v == NULL) {
   811 		cargo = CT_PURCHASE;
   811 		cargo = CT_PURCHASE;
   812 	} else {
   812 	} else {
   813 		cargo = v->cargo_type;
   813 		cargo = v->cargo_type;
   814 
   814 
   815 		if (v->type == VEH_Train) {
   815 		if (v->type == VEH_TRAIN) {
   816 			group = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine);
   816 			group = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine);
   817 
   817 
   818 			if (group != NULL) return group;
   818 			if (group != NULL) return group;
   819 		}
   819 		}
   820 	}
   820 	}
   872  * @param v The wagon to check
   872  * @param v The wagon to check
   873  * @return true if it is using an override, false otherwise
   873  * @return true if it is using an override, false otherwise
   874  */
   874  */
   875 bool UsesWagonOverride(const Vehicle* v)
   875 bool UsesWagonOverride(const Vehicle* v)
   876 {
   876 {
   877 	assert(v->type == VEH_Train);
   877 	assert(v->type == VEH_TRAIN);
   878 	return GetWagonOverrideSpriteSet(v->engine_type, v->cargo_type, v->u.rail.first_engine) != NULL;
   878 	return GetWagonOverrideSpriteSet(v->engine_type, v->cargo_type, v->u.rail.first_engine) != NULL;
   879 }
   879 }
   880 
   880 
   881 /**
   881 /**
   882  * Evaluate a newgrf callback for vehicles
   882  * Evaluate a newgrf callback for vehicles
   960 			 * same for all triggered vehicles in the chain (to get
   960 			 * same for all triggered vehicles in the chain (to get
   961 			 * all the random-cargo wagons carry the same cargo,
   961 			 * all the random-cargo wagons carry the same cargo,
   962 			 * i.e.), so we give them all the NEW_CARGO triggered
   962 			 * i.e.), so we give them all the NEW_CARGO triggered
   963 			 * vehicle's portion of random bits. */
   963 			 * vehicle's portion of random bits. */
   964 			assert(first);
   964 			assert(first);
   965 			DoTriggerVehicle((v->type == VEH_Train) ? GetFirstVehicleInChain(v) : v, VEHICLE_TRIGGER_ANY_NEW_CARGO, new_random_bits, false);
   965 			DoTriggerVehicle((v->type == VEH_TRAIN) ? GetFirstVehicleInChain(v) : v, VEHICLE_TRIGGER_ANY_NEW_CARGO, new_random_bits, false);
   966 			break;
   966 			break;
   967 
   967 
   968 		case VEHICLE_TRIGGER_DEPOT:
   968 		case VEHICLE_TRIGGER_DEPOT:
   969 			/* We now trigger the next vehicle in chain recursively.
   969 			/* We now trigger the next vehicle in chain recursively.
   970 			 * The random bits portions may be different for each
   970 			 * The random bits portions may be different for each
  1005 {
  1005 {
  1006 	assert(engine < lengthof(_engine_custom_names));
  1006 	assert(engine < lengthof(_engine_custom_names));
  1007 	_engine_custom_names[engine] = name;
  1007 	_engine_custom_names[engine] = name;
  1008 }
  1008 }
  1009 
  1009 
  1010 void UnloadCustomEngineNames(void)
  1010 void UnloadCustomEngineNames()
  1011 {
  1011 {
  1012 	EngineID i;
  1012 	EngineID i;
  1013 	for (i = 0; i < TOTAL_NUM_ENGINES; i++) {
  1013 	for (i = 0; i < TOTAL_NUM_ENGINES; i++) {
  1014 		_engine_custom_names[i] = 0;
  1014 		_engine_custom_names[i] = 0;
  1015 	}
  1015 	}
  1023 // Functions for changing the order of vehicle purchase lists
  1023 // Functions for changing the order of vehicle purchase lists
  1024 // This is currently only implemented for rail vehicles.
  1024 // This is currently only implemented for rail vehicles.
  1025 static EngineID _engine_list_order[NUM_TRAIN_ENGINES];
  1025 static EngineID _engine_list_order[NUM_TRAIN_ENGINES];
  1026 static byte _engine_list_position[NUM_TRAIN_ENGINES];
  1026 static byte _engine_list_position[NUM_TRAIN_ENGINES];
  1027 
  1027 
  1028 void ResetEngineListOrder(void)
  1028 void ResetEngineListOrder()
  1029 {
  1029 {
  1030 	EngineID i;
  1030 	EngineID i;
  1031 
  1031 
  1032 	for (i = 0; i < NUM_TRAIN_ENGINES; i++) {
  1032 	for (i = 0; i < NUM_TRAIN_ENGINES; i++) {
  1033 		_engine_list_order[i] = i;
  1033 		_engine_list_order[i] = i;