newgrf_engine.c
changeset 4832 df13be750d2b
parent 4812 d71b2e7d11e0
child 4869 3a75d9b3b5ea
equal deleted inserted replaced
4831:ffc748f7e3e6 4832:df13be750d2b
   860 
   860 
   861 SpriteID GetCustomEngineSprite(EngineID engine, const Vehicle *v, Direction direction)
   861 SpriteID GetCustomEngineSprite(EngineID engine, const Vehicle *v, Direction direction)
   862 {
   862 {
   863 	const SpriteGroup *group;
   863 	const SpriteGroup *group;
   864 	ResolverObject object;
   864 	ResolverObject object;
   865 	CargoID cargo = GC_PURCHASE;
   865 	CargoID cargo;
   866 
   866 
   867 	NewVehicleResolver(&object, engine, v);
   867 	NewVehicleResolver(&object, engine, v);
   868 
   868 
   869 	if (v != NULL) {
   869 	cargo = (v == NULL) ? GC_PURCHASE : _global_cargo_id[_opt.landscape][v->cargo_type];
   870 		cargo = _global_cargo_id[_opt.landscape][v->cargo_type];
   870 	assert(cargo != GC_INVALID);
   871 		assert(cargo != GC_INVALID);
       
   872 	}
       
   873 
   871 
   874 	group = engine_custom_sprites[engine][cargo];
   872 	group = engine_custom_sprites[engine][cargo];
   875 
   873 
   876 	if (v != NULL && v->type == VEH_Train) {
   874 	if (v != NULL && v->type == VEH_Train) {
   877 		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, v->u.rail.first_engine);
   875 		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, v->u.rail.first_engine);
   878 
   876 
   879 		if (overset != NULL) group = overset;
   877 		if (overset != NULL) group = overset;
   880 	}
   878 	}
   881 
   879 
       
   880 	if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT];
   882 	group = Resolve(group, &object);
   881 	group = Resolve(group, &object);
   883 
       
   884 	if ((group == NULL || group->type != SGT_RESULT) && cargo != GC_DEFAULT) {
       
   885 		// This group is empty but perhaps there'll be a default one.
       
   886 		group = Resolve(engine_custom_sprites[engine][GC_DEFAULT], &object);
       
   887 	}
       
   888 
       
   889 	if (group == NULL || group->type != SGT_RESULT) return 0;
   882 	if (group == NULL || group->type != SGT_RESULT) return 0;
   890 
   883 
   891 	return group->g.result.sprite + (direction % group->g.result.num_sprites);
   884 	return group->g.result.sprite + (direction % group->g.result.num_sprites);
   892 }
   885 }
   893 
   886 
   949 	object.callback        = callback;
   942 	object.callback        = callback;
   950 	object.callback_param1 = param1;
   943 	object.callback_param1 = param1;
   951 	object.callback_param2 = param2;
   944 	object.callback_param2 = param2;
   952 
   945 
   953 	cargo = (v == NULL) ? GC_PURCHASE : _global_cargo_id[_opt.landscape][v->cargo_type];
   946 	cargo = (v == NULL) ? GC_PURCHASE : _global_cargo_id[_opt.landscape][v->cargo_type];
       
   947 	assert(cargo != GC_INVALID);
   954 
   948 
   955 	group = engine_custom_sprites[engine][cargo];
   949 	group = engine_custom_sprites[engine][cargo];
   956 
   950 
   957 	if (v != NULL && v->type == VEH_Train) {
   951 	if (v != NULL && v->type == VEH_Train) {
   958 		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, v->u.rail.first_engine);
   952 		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, v->u.rail.first_engine);
   959 
   953 
   960 		if (overset != NULL) group = overset;
   954 		if (overset != NULL) group = overset;
   961 	}
   955 	}
   962 
   956 
       
   957 	if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT];
   963 	group = Resolve(group, &object);
   958 	group = Resolve(group, &object);
   964 
       
   965 	if ((group == NULL || group->type != SGT_CALLBACK) && cargo != GC_DEFAULT) {
       
   966 		// This group is empty but perhaps there'll be a default one.
       
   967 		group = Resolve(engine_custom_sprites[engine][GC_DEFAULT], &object);
       
   968 	}
       
   969 
       
   970 	if (group == NULL || group->type != SGT_CALLBACK) return CALLBACK_FAILED;
   959 	if (group == NULL || group->type != SGT_CALLBACK) return CALLBACK_FAILED;
   971 
   960 
   972 	return group->g.callback.result;
   961 	return group->g.callback.result;
   973 }
   962 }
   974 
   963 
   995 	object.callback_param2 = param2;
   984 	object.callback_param2 = param2;
   996 
   985 
   997 	object.u.vehicle.parent = parent;
   986 	object.u.vehicle.parent = parent;
   998 
   987 
   999 	cargo = (v == NULL) ? GC_PURCHASE : _global_cargo_id[_opt.landscape][v->cargo_type];
   988 	cargo = (v == NULL) ? GC_PURCHASE : _global_cargo_id[_opt.landscape][v->cargo_type];
       
   989 	assert(cargo != GC_INVALID);
  1000 
   990 
  1001 	group = engine_custom_sprites[engine][cargo];
   991 	group = engine_custom_sprites[engine][cargo];
  1002 
   992 
  1003 	if (v != NULL && v->type == VEH_Train) {
   993 	if (v != NULL && v->type == VEH_Train) {
  1004 		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, v->u.rail.first_engine);
   994 		const SpriteGroup *overset = GetWagonOverrideSpriteSet(engine, v->u.rail.first_engine);
  1005 
   995 
  1006 		if (overset != NULL) group = overset;
   996 		if (overset != NULL) group = overset;
  1007 	}
   997 	}
  1008 
   998 
       
   999 	if (group == NULL) group = engine_custom_sprites[engine][GC_DEFAULT];
  1009 	group = Resolve(group, &object);
  1000 	group = Resolve(group, &object);
  1010 
       
  1011 	if ((group == NULL || group->type != SGT_CALLBACK) && cargo != GC_DEFAULT) {
       
  1012 		// This group is empty but perhaps there'll be a default one.
       
  1013 		group = Resolve(engine_custom_sprites[engine][GC_DEFAULT], &object);
       
  1014 	}
       
  1015 
       
  1016 	if (group == NULL || group->type != SGT_CALLBACK) return CALLBACK_FAILED;
  1001 	if (group == NULL || group->type != SGT_CALLBACK) return CALLBACK_FAILED;
  1017 
  1002 
  1018 	return group->g.callback.result;
  1003 	return group->g.callback.result;
  1019 }
  1004 }
  1020 
  1005 
  1031 	NewVehicleResolver(&object, v->engine_type, v);
  1016 	NewVehicleResolver(&object, v->engine_type, v);
  1032 
  1017 
  1033 	object.trigger = trigger;
  1018 	object.trigger = trigger;
  1034 
  1019 
  1035 	cargo = _global_cargo_id[_opt.landscape][v->cargo_type];
  1020 	cargo = _global_cargo_id[_opt.landscape][v->cargo_type];
       
  1021 	assert(cargo != GC_INVALID);
       
  1022 
  1036 	group = engine_custom_sprites[v->engine_type][cargo];
  1023 	group = engine_custom_sprites[v->engine_type][cargo];
  1037 
  1024 
  1038 	if (v->type == VEH_Train) {
  1025 	if (v->type == VEH_Train) {
  1039 		const SpriteGroup *overset = GetWagonOverrideSpriteSet(v->engine_type, v->u.rail.first_engine);
  1026 		const SpriteGroup *overset = GetWagonOverrideSpriteSet(v->engine_type, v->u.rail.first_engine);
  1040 		if (overset != NULL) group = overset;
  1027 		if (overset != NULL) group = overset;
  1041 	}
  1028 	}
  1042 
  1029 
       
  1030 	if (group == NULL) group = engine_custom_sprites[v->engine_type][GC_DEFAULT];
  1043 	group = Resolve(group, &object);
  1031 	group = Resolve(group, &object);
  1044 	if (group == NULL && v->cargo_type != GC_DEFAULT) {
       
  1045 		// This group is empty but perhaps there'll be a default one.
       
  1046 		group = Resolve(engine_custom_sprites[v->engine_type][GC_DEFAULT], &object);
       
  1047 	}
       
  1048 
       
  1049 	/* Really return? */
       
  1050 	if (group == NULL) return;
       
  1051 
  1032 
  1052 	new_random_bits = Random();
  1033 	new_random_bits = Random();
  1053 	v->random_bits &= ~object.reseed;
  1034 	v->random_bits &= ~object.reseed;
  1054 	v->random_bits |= (first ? new_random_bits : base_random_bits) & object.reseed;
  1035 	v->random_bits |= (first ? new_random_bits : base_random_bits) & object.reseed;
  1055 
  1036