newgrf_engine.c
changeset 4869 cded5f3a83c9
parent 4832 a6f226c90f30
child 4901 3f661c8faa1a
equal deleted inserted replaced
4868:e9478d949505 4869:cded5f3a83c9
    56 };
    56 };
    57 
    57 
    58 int _traininfo_vehicle_pitch = 0;
    58 int _traininfo_vehicle_pitch = 0;
    59 int _traininfo_vehicle_width = 29;
    59 int _traininfo_vehicle_width = 29;
    60 
    60 
    61 // TODO: We don't support cargo-specific wagon overrides. Pretty exotic... ;-) --pasky
       
    62 
       
    63 typedef struct WagonOverride {
    61 typedef struct WagonOverride {
    64 	byte *train_id;
    62 	byte *train_id;
    65 	int trains;
    63 	int trains;
       
    64 	CargoID cargo;
    66 	const SpriteGroup *group;
    65 	const SpriteGroup *group;
    67 } WagonOverride;
    66 } WagonOverride;
    68 
    67 
    69 typedef struct WagonOverrides {
    68 typedef struct WagonOverrides {
    70 	int overrides_count;
    69 	int overrides_count;
    71 	WagonOverride *overrides;
    70 	WagonOverride *overrides;
    72 } WagonOverrides;
    71 } WagonOverrides;
    73 
    72 
    74 static WagonOverrides _engine_wagon_overrides[TOTAL_NUM_ENGINES];
    73 static WagonOverrides _engine_wagon_overrides[TOTAL_NUM_ENGINES];
    75 
    74 
    76 void SetWagonOverrideSprites(EngineID engine, const SpriteGroup *group, byte *train_id, int trains)
    75 void SetWagonOverrideSprites(EngineID engine, CargoID cargo, const SpriteGroup *group, byte *train_id, int trains)
    77 {
    76 {
    78 	WagonOverrides *wos;
    77 	WagonOverrides *wos;
    79 	WagonOverride *wo;
    78 	WagonOverride *wo;
    80 
    79 
    81 	wos = &_engine_wagon_overrides[engine];
    80 	wos = &_engine_wagon_overrides[engine];
    86 	wo = &wos->overrides[wos->overrides_count - 1];
    85 	wo = &wos->overrides[wos->overrides_count - 1];
    87 	/* FIXME: If we are replacing an override, release original SpriteGroup
    86 	/* FIXME: If we are replacing an override, release original SpriteGroup
    88 	 * to prevent leaks. But first we need to refcount the SpriteGroup.
    87 	 * to prevent leaks. But first we need to refcount the SpriteGroup.
    89 	 * --pasky */
    88 	 * --pasky */
    90 	wo->group = group;
    89 	wo->group = group;
       
    90 	wo->cargo = cargo;
    91 	wo->trains = trains;
    91 	wo->trains = trains;
    92 	wo->train_id = malloc(trains);
    92 	wo->train_id = malloc(trains);
    93 	memcpy(wo->train_id, train_id, trains);
    93 	memcpy(wo->train_id, train_id, trains);
    94 }
    94 }
    95 
    95 
    96 static const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, byte overriding_engine)
    96 static const SpriteGroup *GetWagonOverrideSpriteSet(EngineID engine, CargoID cargo, byte overriding_engine)
    97 {
    97 {
    98 	const WagonOverrides *wos = &_engine_wagon_overrides[engine];
    98 	const WagonOverrides *wos = &_engine_wagon_overrides[engine];
    99 	int i;
    99 	int i;
   100 
   100 
   101 	// XXX: This could turn out to be a timesink on profiles. We could
   101 	// XXX: This could turn out to be a timesink on profiles. We could
   106 	for (i = 0; i < wos->overrides_count; i++) {
   106 	for (i = 0; i < wos->overrides_count; i++) {
   107 		const WagonOverride *wo = &wos->overrides[i];
   107 		const WagonOverride *wo = &wos->overrides[i];
   108 		int j;
   108 		int j;
   109 
   109 
   110 		for (j = 0; j < wo->trains; j++) {
   110 		for (j = 0; j < wo->trains; j++) {
   111 			if (wo->train_id[j] == overriding_engine) return wo->group;
   111 			if (wo->train_id[j] == overriding_engine && (wo->cargo == cargo || wo->cargo == GC_DEFAULT)) return wo->group;
   112 		}
   112 		}
   113 	}
   113 	}
   114 	return NULL;
   114 	return NULL;
   115 }
   115 }
   116 
   116 
   870 	assert(cargo != GC_INVALID);
   870 	assert(cargo != GC_INVALID);
   871 
   871 
   872 	group = engine_custom_sprites[engine][cargo];
   872 	group = engine_custom_sprites[engine][cargo];
   873 
   873 
   874 	if (v != NULL && v->type == VEH_Train) {
   874 	if (v != NULL && v->type == VEH_Train) {
   875 		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, v->u.rail.first_engine);
   875 		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine);
   876 
   876 
   877 		if (overset != NULL) group = overset;
   877 		if (overset != NULL) group = overset;
   878 	}
   878 	}
   879 
   879 
   880 	if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT];
   880 	if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT];
   917  * @return true if it is using an override, false otherwise
   917  * @return true if it is using an override, false otherwise
   918  */
   918  */
   919 bool UsesWagonOverride(const Vehicle* v)
   919 bool UsesWagonOverride(const Vehicle* v)
   920 {
   920 {
   921 	assert(v->type == VEH_Train);
   921 	assert(v->type == VEH_Train);
   922 	return GetWagonOverrideSpriteSet(v->engine_type, v->u.rail.first_engine) != NULL;
   922 	return GetWagonOverrideSpriteSet(v->engine_type, _global_cargo_id[_opt.landscape][v->cargo_type], v->u.rail.first_engine) != NULL;
   923 }
   923 }
   924 
   924 
   925 /**
   925 /**
   926  * Evaluate a newgrf callback for vehicles
   926  * Evaluate a newgrf callback for vehicles
   927  * @param callback The callback to evalute
   927  * @param callback The callback to evalute
   947 	assert(cargo != GC_INVALID);
   947 	assert(cargo != GC_INVALID);
   948 
   948 
   949 	group = engine_custom_sprites[engine][cargo];
   949 	group = engine_custom_sprites[engine][cargo];
   950 
   950 
   951 	if (v != NULL && v->type == VEH_Train) {
   951 	if (v != NULL && v->type == VEH_Train) {
   952 		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, v->u.rail.first_engine);
   952 		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine);
   953 
   953 
   954 		if (overset != NULL) group = overset;
   954 		if (overset != NULL) group = overset;
   955 	}
   955 	}
   956 
   956 
   957 	if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT];
   957 	if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT];
   989 	assert(cargo != GC_INVALID);
   989 	assert(cargo != GC_INVALID);
   990 
   990 
   991 	group = engine_custom_sprites[engine][cargo];
   991 	group = engine_custom_sprites[engine][cargo];
   992 
   992 
   993 	if (v != NULL && v->type == VEH_Train) {
   993 	if (v != NULL && v->type == VEH_Train) {
   994 		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, v->u.rail.first_engine);
   994 		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, cargo, v->u.rail.first_engine);
   995 
   995 
   996 		if (overset != NULL) group = overset;
   996 		if (overset != NULL) group = overset;
   997 	}
   997 	}
   998 
   998 
   999 	if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT];
   999 	if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT];
  1021 	assert(cargo != GC_INVALID);
  1021 	assert(cargo != GC_INVALID);
  1022 
  1022 
  1023 	group = engine_custom_sprites[v->engine_type][cargo];
  1023 	group = engine_custom_sprites[v->engine_type][cargo];
  1024 
  1024 
  1025 	if (v->type == VEH_Train) {
  1025 	if (v->type == VEH_Train) {
  1026 		const SpriteGroup *overset = GetWagonOverrideSpriteSet(v->engine_type, v->u.rail.first_engine);
  1026 		const SpriteGroup *overset = GetWagonOverrideSpriteSet(v->engine_type, cargo, v->u.rail.first_engine);
  1027 		if (overset != NULL) group = overset;
  1027 		if (overset != NULL) group = overset;
  1028 	}
  1028 	}
  1029 
  1029 
  1030 	if (group == NULL) group = engine_custom_sprites[v->engine_type][GC_DEFAULT];
  1030 	if (group == NULL) group = engine_custom_sprites[v->engine_type][GC_DEFAULT];
  1031 	group = Resolve(group, &object);
  1031 	group = Resolve(group, &object);