# HG changeset patch # User truelight # Date 1184334579 0 # Node ID 760b7b504e37eb8a9fd5daef6764206b2d9dcc57 # Parent c17046b1b8a2317dbb52c7982ac9a83addfa3bd1 (svn r10543) [NoAI] -Add: added AIStationListCargoRating as valuator for a station list diff -r c17046b1b8a2 -r 760b7b504e37 bin/ai/regression/regression.nut --- a/bin/ai/regression/regression.nut Fri Jul 13 11:04:00 2007 +0000 +++ b/bin/ai/regression/regression.nut Fri Jul 13 13:49:39 2007 +0000 @@ -237,6 +237,11 @@ for (local i = list.Begin(); list.HasNext(); i = list.Next()) { print(" " + i + " => " + list.GetValue(i)); } + list.Valuate(AIStationListCargoRating(1)); + print(" CargoRating(1) ListDump:"); + for (local i = list.Begin(); list.HasNext(); i = list.Next()) { + print(" " + i + " => " + list.GetValue(i)); + } list = AIStationVehicleList(0); diff -r c17046b1b8a2 -r 760b7b504e37 bin/ai/regression/regression.txt --- a/bin/ai/regression/regression.txt Fri Jul 13 11:04:00 2007 +0000 +++ b/bin/ai/regression/regression.txt Fri Jul 13 13:49:39 2007 +0000 @@ -1664,6 +1664,9 @@ CargoWaiting(1) ListDump: 1 => 0 0 => 0 + CargoRating(1) ListDump: + 1 => 69 + 0 => 69 --StationVehicleList-- Count(): 1 diff -r c17046b1b8a2 -r 760b7b504e37 src/ai/ai_squirrel.cpp --- a/src/ai/ai_squirrel.cpp Fri Jul 13 11:04:00 2007 +0000 +++ b/src/ai/ai_squirrel.cpp Fri Jul 13 13:49:39 2007 +0000 @@ -215,6 +215,7 @@ SQAIRoadRegister(this->engine); SQAISettingsRegister(this->engine); SQAISignRegister(this->engine); + SQAIStationListCargoRatingRegister(this->engine); SQAIStationListCargoWaitingRegister(this->engine); SQAIStationListLocationRegister(this->engine); SQAIStationListRegister(this->engine); diff -r c17046b1b8a2 -r 760b7b504e37 src/ai/api/ai_station.cpp --- a/src/ai/api/ai_station.cpp Fri Jul 13 11:04:00 2007 +0000 +++ b/src/ai/api/ai_station.cpp Fri Jul 13 13:49:39 2007 +0000 @@ -25,3 +25,11 @@ return ::GetStation(station_id)->goods[cargo_id].cargo.Count(); } + +/* static */ int32 AIStation::GetCargoRating(StationID station_id, CargoID cargo_id) +{ + if (!AIStation::IsValidStation(station_id)) return -1; + if (!AICargo::IsValidCargo(cargo_id)) return -1; + + return ::GetStation(station_id)->goods[cargo_id].rating * 101 >> 8; +} diff -r c17046b1b8a2 -r 760b7b504e37 src/ai/api/ai_station.hpp --- a/src/ai/api/ai_station.hpp Fri Jul 13 11:04:00 2007 +0000 +++ b/src/ai/api/ai_station.hpp Fri Jul 13 13:49:39 2007 +0000 @@ -41,6 +41,16 @@ * @return the amount of units waiting at the station. */ static int32 GetCargoWaiting(StationID station_id, CargoID cargo_id); + + /** + * See how high the rating is of a cargo on a station. + * @param station_id the station to get the cargo-rating of. + * @param cargo_id the cargo to get the cargo-rating of. + * @pre IsValidStation(station_id). + * @pre IsValidCargo(cargo_id). + * @return the rating in percent of the cargo on the station. + */ + static int32 GetCargoRating(StationID station_id, CargoID cargo_id); }; #endif /* AI_STATION_HPP */ diff -r c17046b1b8a2 -r 760b7b504e37 src/ai/api/ai_station.hpp.sq --- a/src/ai/api/ai_station.hpp.sq Fri Jul 13 11:04:00 2007 +0000 +++ b/src/ai/api/ai_station.hpp.sq Fri Jul 13 13:49:39 2007 +0000 @@ -17,6 +17,7 @@ SQAIStation.DefSQStaticMethod(engine, &AIStation::IsValidStation, "IsValidStation", 2, "xi"); SQAIStation.DefSQStaticMethod(engine, &AIStation::GetLocation, "GetLocation", 2, "xi"); SQAIStation.DefSQStaticMethod(engine, &AIStation::GetCargoWaiting, "GetCargoWaiting", 3, "xii"); + SQAIStation.DefSQStaticMethod(engine, &AIStation::GetCargoRating, "GetCargoRating", 3, "xii"); SQAIStation.PostRegister(engine); } diff -r c17046b1b8a2 -r 760b7b504e37 src/ai/api/ai_stationlist_valuator.cpp --- a/src/ai/api/ai_stationlist_valuator.cpp Fri Jul 13 11:04:00 2007 +0000 +++ b/src/ai/api/ai_stationlist_valuator.cpp Fri Jul 13 13:49:39 2007 +0000 @@ -12,3 +12,8 @@ { return AIStation::GetCargoWaiting(station, this->cargo_type); } + +int32 AIStationListCargoRating::Valuate(int32 station) const +{ + return AIStation::GetCargoRating(station, this->cargo_type); +} diff -r c17046b1b8a2 -r 760b7b504e37 src/ai/api/ai_stationlist_valuator.hpp --- a/src/ai/api/ai_stationlist_valuator.hpp Fri Jul 13 11:04:00 2007 +0000 +++ b/src/ai/api/ai_stationlist_valuator.hpp Fri Jul 13 13:49:39 2007 +0000 @@ -46,4 +46,27 @@ int32 Valuate(int32 station) const; }; +/** + * Get the cargo rating for entries in an AIStationList instance. + * @note resulting items are of the type percent + * @note the input items are of the type StationID + */ +class AIStationListCargoRating : public AIAbstractList::Valuator { +public: + /** + * The name of the class, needed by several sub-processes. + */ + static const char *GetClassName() { return "AIStationListCargoRating"; } + + /** + * Custom constructor, we want a cargo-type as parameter. + */ + AIStationListCargoRating(CargoID cargo_type) { this->cargo_type = cargo_type; } + +private: + CargoID cargo_type; + + int32 Valuate(int32 station) const; +}; + #endif /* AI_STATIONLIST_VALUATOR_HPP */ diff -r c17046b1b8a2 -r 760b7b504e37 src/ai/api/ai_stationlist_valuator.hpp.sq --- a/src/ai/api/ai_stationlist_valuator.hpp.sq Fri Jul 13 11:04:00 2007 +0000 +++ b/src/ai/api/ai_stationlist_valuator.hpp.sq Fri Jul 13 13:49:39 2007 +0000 @@ -35,3 +35,21 @@ SQAIStationListCargoWaiting.PostRegister(engine); } + +namespace SQConvert { + /* Allow AIStationListCargoRating to be used as Squirrel parameter */ + template <> AIStationListCargoRating *GetParam(ForceType, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (AIStationListCargoRating *)instance; } + template <> AIStationListCargoRating &GetParam(ForceType, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AIStationListCargoRating *)instance; } + template <> const AIStationListCargoRating *GetParam(ForceType, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return (AIStationListCargoRating *)instance; } + template <> const AIStationListCargoRating &GetParam(ForceType, HSQUIRRELVM vm, int index) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(AIStationListCargoRating *)instance; } +}; // namespace SQConvert + +void SQAIStationListCargoRatingRegister(Squirrel *engine) { + DefSQClass SQAIStationListCargoRating("AIStationListCargoRating"); + SQAIStationListCargoRating.PreRegister(engine); + SQAIStationListCargoRating.AddConstructor(engine, "xi"); + + SQAIStationListCargoRating.DefSQStaticMethod(engine, &AIStationListCargoRating::GetClassName, "GetClassName", 1, "x"); + + SQAIStationListCargoRating.PostRegister(engine); +}