diff -r 721cafc243c6 company.nut --- a/company.nut Sun Jul 12 15:12:28 2015 +0100 +++ b/company.nut Sat Sep 26 18:17:56 2015 +0100 @@ -128,9 +128,18 @@ } // Update the delivered amount from the monitored amounts. -function CompanyGoal::UpdateDelivered(mon, comp_id) +function CompanyGoal::UpdateDelivered(mon, cdata) { local delivered; + local comp_id = cdata.comp_id +// foreach (key, value in cdata.won_goals["towns"]) { +// GSLog.Info(key); +// GSLog.Info(value); +// } +// foreach (key, value in cdata.won_goals["industries"]) { +// GSLog.Info(key); +// GSLog.Info(value); +// } if ("ind" in this.accept) { delivered = mon[this.cargo.cid].ind[this.accept.ind]; } else { @@ -148,8 +157,20 @@ local destination_string_news; if ("town" in this.accept) { destination_string_news = GSText(GSText.STR_TOWN_NAME_NEWS, this.accept.town); + if (this.accept.town in cdata.won_goals["towns"]) { + // key already exists, don't need to create it + } else { + cdata.won_goals["towns"][this.accept.town] <- {}; + } + cdata.won_goals["towns"][this.accept.town][this.cargo.cid] <- true; } else { destination_string_news = GSText(GSText.STR_INDUSTRY_NAME_NEWS, this.accept.ind); + if (this.accept.ind in cdata.won_goals["industries"]) { + // key already exists, don't need to create it + } else { + cdata.won_goals["industries"][this.accept.ind] <- {}; + } + cdata.won_goals["industries"][this.accept.ind][this.cargo.cid] <- true; } local goal_won_news = GSText(GSText.STR_COMPANY_GOAL_WON_NEWS, cargo.cid, this.wanted_amount, destination_string_news); @@ -317,10 +338,14 @@ comp_id = null; active_goals = null; + won_goals = null; constructor(comp_id) { this.active_goals = {}; + this.won_goals = {}; + this.won_goals["industries"] <- {} + this.won_goals["towns"] <- {} this.comp_id = comp_id; local num_goals = GSController.GetSetting("num_goals"); @@ -425,6 +450,28 @@ return false; } +// Has this goal been won already for this company for the given cargo and accepting resource? +// @param cargo_id Cargo to check. +// @param accept Accepting resource to check. +// @return Whether this goal has been won for this company for the cargo and resource. +function CompanyData::GoalAlreadyWon(cargo_id, accept) +{ + GSLog.Info("Checking if won already"); + if ("town" in accept) { + foreach (location, cargo_table in this.won_goals["towns"]) { + continue; + } + } else { + if (accept["ind"] in this.won_goals["industries"]) { + if (cargo_id in this.won_goals["industries"][accept["ind"]]) { + return true; + } + } + } + return false; +} + + // Count the number of goals that ask for the given cargo type. // @param cargo_id Cargo to check for. // @return Number of active goals with the given cargo type. @@ -490,7 +537,7 @@ if (this.comp_id in cmon) { foreach (num, goal in this.active_goals) { if (goal == null) continue; - goal.UpdateDelivered(cmon[this.comp_id], this.comp_id); + goal.UpdateDelivered(cmon[this.comp_id], this); if (goal.CheckFinished()) finished = true; } } diff -r 721cafc243c6 main.nut --- a/main.nut Sun Jul 12 15:12:28 2015 +0100 +++ b/main.nut Sat Sep 26 18:17:56 2015 +0100 @@ -243,6 +243,7 @@ local best_accept = null; // Best accepting to target. foreach (_, accept in accepts) { if (cdata != null && cdata.HasGoal(cargo.cid, accept)) continue; // Prevent duplicates. + if (cdata != null && cdata.GoalAlreadyWon(cargo.cid, accept)) continue; // Prevent repeating goals already won. local min_prod_distance = distance * 2; // Smallest found distance to the accepting industry. local prod_score = best_score;