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 |