Skip to content

Commit

Permalink
Add: Script API for group efficiency ratings
Browse files Browse the repository at this point in the history
  • Loading branch information
nielsmh committed May 11, 2019
1 parent ff4df17 commit ba123b8
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 16 deletions.
2 changes: 2 additions & 0 deletions src/script/api/ai/ai_group.hpp.sq
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ void SQAIGroup_Register(Squirrel *engine)
SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::StopAutoReplace, "StopAutoReplace", 3, ".ii");
SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::GetProfitThisYear, "GetProfitThisYear", 2, ".i");
SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::GetProfitLastYear, "GetProfitLastYear", 2, ".i");
SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::GetEfficiencyThisYear, "GetEfficiencyThisYear", 2, ".i");
SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::GetEfficiencyLastYear, "GetEfficiencyLastYear", 2, ".i");
SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::GetCurrentUsage, "GetCurrentUsage", 2, ".i");
SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::SetPrimaryColour, "SetPrimaryColour", 3, ".ii");
SQAIGroup.DefSQStaticMethod(engine, &ScriptGroup::SetSecondaryColour, "SetSecondaryColour", 3, ".ii");
Expand Down
2 changes: 2 additions & 0 deletions src/script/api/ai_changelog.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
* \li AIGroup::SetSecondaryColour
* \li AIGroup::GetPrimaryColour
* \li AIGroup::GetSecondaryColour
* \li AIGroup::GetEfficiencyThisYear
* \li AIGroup::GetEfficiencyLastYear
* \li AIVehicle::BuildVehicleWithRefit
* \li AIVehicle::GetBuildWithRefitCapacity
* \li AIVehicle::GetEfficiencyThisYear
Expand Down
59 changes: 43 additions & 16 deletions src/script/api/script_group.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,21 +150,27 @@
return ScriptObject::DoCommand(0, group_id << 16, (::INVALID_ENGINE << 16) | engine_id, CMD_SET_AUTOREPLACE);
}

/* static */ Money ScriptGroup::GetProfitThisYear(GroupID group_id)
template <typename T, typename Func>
T SumVehiclesInGroup(GroupID group_id, Func func)
{
if (!IsValidGroup(group_id)) return -1;

Money profit = 0;
T result{};

const Vehicle *v;
FOR_ALL_VEHICLES(v) {
if (v->group_id != group_id) continue;
if (!v->IsPrimaryVehicle()) continue;

profit += v->GetDisplayProfitThisYear();
result += func(v);
}

return profit;
return result;
}

/* static */ Money ScriptGroup::GetProfitThisYear(GroupID group_id)
{
if (!IsValidGroup(group_id)) return -1;

return SumVehiclesInGroup<Money>(group_id, [](const Vehicle * v) { return v->GetDisplayProfitThisYear(); });
}

/* static */ Money ScriptGroup::GetProfitLastYear(GroupID group_id)
Expand All @@ -174,24 +180,45 @@
return ::Group::Get(group_id)->statistics.profit_last_year;
}

/* static */ uint32 ScriptGroup::GetCurrentUsage(GroupID group_id)
struct EfficiencyRating {
OverflowSafeInt32 potential;
OverflowSafeInt32 delivered;
EfficiencyRating & operator+=(const EfficiencyRating &other)
{
this->potential += other.potential;
this->delivered += other.delivered;
return *this;
}

int32 GetPercent() const
{
if (this->potential == 0) return 0;
return this->delivered * 100 / this->potential;
}
};

/* static */ int32 ScriptGroup::GetEfficiencyThisYear(GroupID group_id)
{
if (!IsValidGroup(group_id)) return -1;

uint32 occupancy = 0;
uint32 vehicle_count = 0;
return SumVehiclesInGroup<EfficiencyRating>(group_id, [](const Vehicle * v) { return EfficiencyRating{ v->potential_cargotiles_this_year, v->delivered_cargotiles_this_year }; }).GetPercent();
}

const Vehicle *v;
FOR_ALL_VEHICLES(v) {
if (v->group_id != group_id) continue;
if (!v->IsPrimaryVehicle()) continue;
/* static */ int32 ScriptGroup::GetEfficiencyLastYear(GroupID group_id)
{
if (!IsValidGroup(group_id)) return -1;

occupancy += v->trip_occupancy;
vehicle_count++;
}
return SumVehiclesInGroup<EfficiencyRating>(group_id, [](const Vehicle * v) { return EfficiencyRating{ v->potential_cargotiles_last_year, v->delivered_cargotiles_last_year }; }).GetPercent();
}

/* static */ uint32 ScriptGroup::GetCurrentUsage(GroupID group_id)
{
if (!IsValidGroup(group_id)) return -1;

uint32 vehicle_count = ::Group::Get(group_id)->statistics.num_vehicle;
if (vehicle_count == 0) return -1;

uint32 occupancy = SumVehiclesInGroup<uint32>(group_id, [](const Vehicle * v) { return v->trip_occupancy; });
return occupancy / vehicle_count;
}

Expand Down
18 changes: 18 additions & 0 deletions src/script/api/script_group.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,24 @@ class ScriptGroup : public ScriptObject {
*/
static Money GetProfitLastYear(GroupID group_id);

/**
* Get the efficiency rating this year of a group.
* @param group_id The group to get the efficiency rating of.
* @pre IsValidGroup(group_id).
* @return Efficiency rating in percent.
* @note The rating value is typically 0..100, but may go above 100 in certain cases.
*/
static int32 GetEfficiencyThisYear(GroupID group_id);

/**
* Get the efficiency rating last year of a group.
* @param group_id The group to get the efficiency rating of.
* @pre IsValidGroup(group_id).
* @return Efficiency rating in percent.
* @note The rating value is typically 0..100, but may go above 100 in certain cases.
*/
static int32 GetEfficiencyLastYear(GroupID group_id);

/**
* Get the current vehicle usage of a group.
* @param group_id The group to get the current usage of.
Expand Down

0 comments on commit ba123b8

Please sign in to comment.