equal
deleted
inserted
replaced
500 |
500 |
501 if (v != NULL) v->waiting_triggers = triggers; |
501 if (v != NULL) v->waiting_triggers = triggers; |
502 } |
502 } |
503 |
503 |
504 |
504 |
|
505 static uint32 GetGRFParameter(EngineID engine_type, byte parameter) |
|
506 { |
|
507 const GRFFile *file = GetEngineGRF(engine_type); |
|
508 |
|
509 if (parameter >= file->param_end) return 0; |
|
510 return file->param[parameter]; |
|
511 } |
|
512 |
|
513 |
505 static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available) |
514 static uint32 VehicleGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available) |
506 { |
515 { |
507 const Vehicle *v = GRV(object); |
516 const Vehicle *v = GRV(object); |
508 |
517 |
509 if (v == NULL) { |
518 if (v == NULL) { |
511 switch (variable) { |
520 switch (variable) { |
512 case 0x43: return _current_player; /* Owner information */ |
521 case 0x43: return _current_player; /* Owner information */ |
513 case 0x46: return 0; /* Motion counter */ |
522 case 0x46: return 0; /* Motion counter */ |
514 case 0xC4: return _cur_year; /* Build year */ |
523 case 0xC4: return _cur_year; /* Build year */ |
515 case 0xDA: return INVALID_VEHICLE; /* Next vehicle */ |
524 case 0xDA: return INVALID_VEHICLE; /* Next vehicle */ |
|
525 case 0x7F: return GetGRFParameter(object->u.vehicle.self_type, parameter); /* Read GRF parameter */ |
516 } |
526 } |
517 |
527 |
518 *available = false; |
528 *available = false; |
519 return -1; |
529 return -1; |
520 } |
530 } |
626 if (v->engine_type == parameter) count++; |
636 if (v->engine_type == parameter) count++; |
627 } |
637 } |
628 return count; |
638 return count; |
629 } |
639 } |
630 |
640 |
631 case 0x7F: { /* Read GRF parameter */ |
641 case 0x7F: return GetGRFParameter(v->engine_type, parameter); /* Read GRF parameter */ |
632 const GRFFile *file = GetEngineGRF(v->engine_type); |
|
633 if (parameter >= file->param_end) return 0; |
|
634 return file->param[parameter]; |
|
635 } |
|
636 } |
642 } |
637 |
643 |
638 /* General vehicle properties */ |
644 /* General vehicle properties */ |
639 switch (variable - 0x80) { |
645 switch (variable - 0x80) { |
640 case 0x00: return v->type; |
646 case 0x00: return v->type; |
786 |
792 |
787 return in_motion ? group->g.real.loaded[set] : group->g.real.loading[set]; |
793 return in_motion ? group->g.real.loaded[set] : group->g.real.loading[set]; |
788 } |
794 } |
789 |
795 |
790 |
796 |
791 static inline void NewVehicleResolver(ResolverObject *res, const Vehicle *v) |
797 static inline void NewVehicleResolver(ResolverObject *res, EngineID engine_type, const Vehicle *v) |
792 { |
798 { |
793 res->GetRandomBits = &VehicleGetRandomBits; |
799 res->GetRandomBits = &VehicleGetRandomBits; |
794 res->GetTriggers = &VehicleGetTriggers; |
800 res->GetTriggers = &VehicleGetTriggers; |
795 res->SetTriggers = &VehicleSetTriggers; |
801 res->SetTriggers = &VehicleSetTriggers; |
796 res->GetVariable = &VehicleGetVariable; |
802 res->GetVariable = &VehicleGetVariable; |
797 res->ResolveReal = &VehicleResolveReal; |
803 res->ResolveReal = &VehicleResolveReal; |
798 |
804 |
799 res->u.vehicle.self = v; |
805 res->u.vehicle.self = v; |
800 res->u.vehicle.parent = (v != NULL && v->type == VEH_Train) ? GetFirstVehicleInChain(v) : v; |
806 res->u.vehicle.parent = (v != NULL && v->type == VEH_Train) ? GetFirstVehicleInChain(v) : v; |
|
807 |
|
808 res->u.vehicle.self_type = engine_type; |
801 |
809 |
802 res->info_view = false; |
810 res->info_view = false; |
803 |
811 |
804 res->callback = 0; |
812 res->callback = 0; |
805 res->callback_param1 = 0; |
813 res->callback_param1 = 0; |
814 { |
822 { |
815 const SpriteGroup *group; |
823 const SpriteGroup *group; |
816 ResolverObject object; |
824 ResolverObject object; |
817 CargoID cargo = GC_PURCHASE; |
825 CargoID cargo = GC_PURCHASE; |
818 |
826 |
819 NewVehicleResolver(&object, v); |
827 NewVehicleResolver(&object, engine, v); |
820 |
828 |
821 if (v != NULL) { |
829 if (v != NULL) { |
822 cargo = _global_cargo_id[_opt.landscape][v->cargo_type]; |
830 cargo = _global_cargo_id[_opt.landscape][v->cargo_type]; |
823 assert(cargo != GC_INVALID); |
831 assert(cargo != GC_INVALID); |
824 } |
832 } |
853 assert(engine < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES); |
861 assert(engine < AIRCRAFT_ENGINES_INDEX + NUM_AIRCRAFT_ENGINES); |
854 |
862 |
855 /* Only valid for helicopters */ |
863 /* Only valid for helicopters */ |
856 assert(!(AircraftVehInfo(engine)->subtype & AIR_CTOL)); |
864 assert(!(AircraftVehInfo(engine)->subtype & AIR_CTOL)); |
857 |
865 |
858 NewVehicleResolver(&object, v); |
866 NewVehicleResolver(&object, engine, v); |
859 |
867 |
860 object.info_view = info_view; |
868 object.info_view = info_view; |
861 |
869 |
862 group = heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX]; |
870 group = heli_rotor_custom_sprites[engine - AIRCRAFT_ENGINES_INDEX]; |
863 group = Resolve(group, &object); |
871 group = Resolve(group, &object); |
894 { |
902 { |
895 const SpriteGroup *group; |
903 const SpriteGroup *group; |
896 ResolverObject object; |
904 ResolverObject object; |
897 CargoID cargo; |
905 CargoID cargo; |
898 |
906 |
899 NewVehicleResolver(&object, v); |
907 NewVehicleResolver(&object, engine, v); |
900 |
908 |
901 object.callback = callback; |
909 object.callback = callback; |
902 object.callback_param1 = param1; |
910 object.callback_param1 = param1; |
903 object.callback_param2 = param2; |
911 object.callback_param2 = param2; |
904 |
912 |
939 { |
947 { |
940 const SpriteGroup *group; |
948 const SpriteGroup *group; |
941 ResolverObject object; |
949 ResolverObject object; |
942 CargoID cargo; |
950 CargoID cargo; |
943 |
951 |
944 NewVehicleResolver(&object, v); |
952 NewVehicleResolver(&object, engine, v); |
945 |
953 |
946 object.callback = callback; |
954 object.callback = callback; |
947 object.callback_param1 = param1; |
955 object.callback_param1 = param1; |
948 object.callback_param2 = param2; |
956 object.callback_param2 = param2; |
949 |
957 |
980 byte new_random_bits; |
988 byte new_random_bits; |
981 |
989 |
982 /* We can't trigger a non-existent vehicle... */ |
990 /* We can't trigger a non-existent vehicle... */ |
983 assert(v != NULL); |
991 assert(v != NULL); |
984 |
992 |
985 NewVehicleResolver(&object, v); |
993 NewVehicleResolver(&object, v->engine_type, v); |
986 |
994 |
987 object.trigger = trigger; |
995 object.trigger = trigger; |
988 |
996 |
989 cargo = _global_cargo_id[_opt.landscape][v->cargo_type]; |
997 cargo = _global_cargo_id[_opt.landscape][v->cargo_type]; |
990 group = engine_custom_sprites[v->engine_type][cargo]; |
998 group = engine_custom_sprites[v->engine_type][cargo]; |