Add: Goal 'done' detection, and removal.
This commit is contained in:
32
company.nut
32
company.nut
@@ -15,6 +15,8 @@ class CompanyGoal {
|
|||||||
|
|
||||||
function AddMonitorElement(mon);
|
function AddMonitorElement(mon);
|
||||||
function UpdateDelivered(mon);
|
function UpdateDelivered(mon);
|
||||||
|
function CheckFinished();
|
||||||
|
function FinalizeGoal();
|
||||||
};
|
};
|
||||||
|
|
||||||
// Add an entry to the collection of monitored things.
|
// Add an entry to the collection of monitored things.
|
||||||
@@ -45,6 +47,19 @@ function CompanyGoal::UpdateDelivered(mon)
|
|||||||
this.delivered_amount += delivered;
|
this.delivered_amount += delivered;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test whether the goal can be considered 'done'.
|
||||||
|
// @return Whether the goal is considered done.
|
||||||
|
function CompanyGoal::CheckFinished()
|
||||||
|
{
|
||||||
|
return this.delivered_amount >= this.wanted_amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Goal is considered 'done', last chance to clean up before the goal is dropped
|
||||||
|
// (to make room for a new goal).
|
||||||
|
function CompanyGoal::FinalizeGoal()
|
||||||
|
{
|
||||||
|
// Nothing to do (yet).
|
||||||
|
}
|
||||||
|
|
||||||
class CompanyData {
|
class CompanyData {
|
||||||
comp_id = null;
|
comp_id = null;
|
||||||
@@ -63,6 +78,7 @@ class CompanyData {
|
|||||||
|
|
||||||
function AddMonitorElement(mon);
|
function AddMonitorElement(mon);
|
||||||
function UpdateDelivered(mon);
|
function UpdateDelivered(mon);
|
||||||
|
function CheckAndFinishGoals();
|
||||||
};
|
};
|
||||||
|
|
||||||
// Find the number of active goals that are missing for this company.
|
// Find the number of active goals that are missing for this company.
|
||||||
@@ -128,12 +144,28 @@ function CompanyData::AddMonitorElements(cmon)
|
|||||||
// Distribute the delivered amounts to the goals.
|
// Distribute the delivered amounts to the goals.
|
||||||
// @param cmon Monitor results of all companies, 'comp_id' numbers to 'cargo_id' number to
|
// @param cmon Monitor results of all companies, 'comp_id' numbers to 'cargo_id' number to
|
||||||
// 'ind' and/or 'town' to resource indices to amount.
|
// 'ind' and/or 'town' to resource indices to amount.
|
||||||
|
// @return Whether a goal is considered to be 'done'.
|
||||||
function CompanyData::UpdateDelivereds(cmon)
|
function CompanyData::UpdateDelivereds(cmon)
|
||||||
{
|
{
|
||||||
|
local finished = false;
|
||||||
if (this.comp_id in cmon) {
|
if (this.comp_id in cmon) {
|
||||||
foreach (num, goal in this.active_goals) {
|
foreach (num, goal in this.active_goals) {
|
||||||
if (goal == null) continue;
|
if (goal == null) continue;
|
||||||
goal.UpdateDelivered(cmon[this.comp_id]);
|
goal.UpdateDelivered(cmon[this.comp_id]);
|
||||||
|
if (goal.CheckFinished()) finished = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return finished; // One or more goals was considered 'done'
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test whether goals of the company are 'done', and if so, drop them.
|
||||||
|
function CompanyData::CheckAndFinishGoals()
|
||||||
|
{
|
||||||
|
foreach (num, goal in this.active_goals) {
|
||||||
|
if (goal == null) continue;
|
||||||
|
if (goal.CheckFinished()) {
|
||||||
|
goal.FinalizeGoal();
|
||||||
|
this.active_goals[num] = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
31
main.nut
31
main.nut
@@ -219,7 +219,8 @@ function FMainClass::Start()
|
|||||||
|
|
||||||
// Main event loop.
|
// Main event loop.
|
||||||
local companies_timeout = 0;
|
local companies_timeout = 0;
|
||||||
local goal_timeout = 0;
|
local new_goal_timeout = 0;
|
||||||
|
local finished_timeout = 0;
|
||||||
local monitor_timeout = 0;
|
local monitor_timeout = 0;
|
||||||
local old_cmonitor = null;
|
local old_cmonitor = null;
|
||||||
while (true) {
|
while (true) {
|
||||||
@@ -244,7 +245,7 @@ function FMainClass::Start()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check for having to create new goals.
|
// Check for having to create new goals.
|
||||||
if (goal_timeout <= 0) {
|
if (new_goal_timeout <= 0) {
|
||||||
local total_missing = 0; // Total number of missing goals.
|
local total_missing = 0; // Total number of missing goals.
|
||||||
local best_cid = null;
|
local best_cid = null;
|
||||||
local cid_missing = 0;
|
local cid_missing = 0;
|
||||||
@@ -265,9 +266,9 @@ function FMainClass::Start()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (total_missing > 1) {
|
if (total_missing > 1) {
|
||||||
goal_timeout = 1 * 74; // If more missing goals, wait only a short while.
|
new_goal_timeout = 1 * 74; // If more missing goals, wait only a short while.
|
||||||
} else {
|
} else {
|
||||||
goal_timeout = 30 * 74;
|
new_goal_timeout = 30 * 74;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -287,9 +288,10 @@ function FMainClass::Start()
|
|||||||
this.FillMonitors(cmon); // Query the monitors.
|
this.FillMonitors(cmon); // Query the monitors.
|
||||||
|
|
||||||
// Distribute the retrieved data.
|
// Distribute the retrieved data.
|
||||||
|
local finished = false;
|
||||||
foreach (cid, cdata in companies) {
|
foreach (cid, cdata in companies) {
|
||||||
if (cdata == null) continue;
|
if (cdata == null) continue;
|
||||||
cdata.UpdateDelivereds(cmon);
|
if (cdata.UpdateDelivereds(cmon)) finished = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Drop obsolete monitors.
|
// Drop obsolete monitors.
|
||||||
@@ -297,6 +299,17 @@ function FMainClass::Start()
|
|||||||
old_cmonitor = cmon;
|
old_cmonitor = cmon;
|
||||||
|
|
||||||
monitor_timeout = 15 * 74; // By default, check monitors every 15 days (other processes may force a check earlier).
|
monitor_timeout = 15 * 74; // By default, check monitors every 15 days (other processes may force a check earlier).
|
||||||
|
if (finished) finished_timeout = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for finished goals, and remove them if they exist.
|
||||||
|
if (finished_timeout <= 0) {
|
||||||
|
foreach (cid, cdata in companies) {
|
||||||
|
if (cdata == null) continue;
|
||||||
|
cdata.CheckAndFinishGoals();
|
||||||
|
}
|
||||||
|
|
||||||
|
finished_timeout = 30 * 74; // By default, check for finished goals every 30 days (may be forced by other processes).
|
||||||
}
|
}
|
||||||
|
|
||||||
// local lake_news = GSText(GSText.STR_LAKE_NEWS);
|
// local lake_news = GSText(GSText.STR_LAKE_NEWS);
|
||||||
@@ -306,15 +319,19 @@ function FMainClass::Start()
|
|||||||
// Sleep until the next event.
|
// Sleep until the next event.
|
||||||
local delay_time = 5000;
|
local delay_time = 5000;
|
||||||
if (delay_time > companies_timeout) delay_time = companies_timeout;
|
if (delay_time > companies_timeout) delay_time = companies_timeout;
|
||||||
if (delay_time > goal_timeout) delay_time = goal_timeout;
|
if (delay_time > new_goal_timeout) delay_time = new_goal_timeout;
|
||||||
if (delay_time > monitor_timeout) delay_time = monitor_timeout;
|
if (delay_time > monitor_timeout) delay_time = monitor_timeout;
|
||||||
|
if (delay_time > finished_timeout) delay_time = finished_timeout;
|
||||||
|
|
||||||
// XXX Perhaps check for company events?
|
// XXX Perhaps check for company events?
|
||||||
|
GSLog.Info("");
|
||||||
|
GSLog.Info("Sleeping for " + delay_time + " ticks.");
|
||||||
if (delay_time > 0) this.Sleep(delay_time);
|
if (delay_time > 0) this.Sleep(delay_time);
|
||||||
|
|
||||||
companies_timeout -= delay_time;
|
companies_timeout -= delay_time;
|
||||||
goal_timeout -= delay_time;
|
new_goal_timeout -= delay_time;
|
||||||
monitor_timeout -= delay_time;
|
monitor_timeout -= delay_time;
|
||||||
|
finished_timeout -= delay_time;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user