(svn r25360) -Codechange: save and load flow stats

This commit is contained in:
fonsinchen 2013-06-09 13:03:11 +00:00
parent 5c8ff0a251
commit a2ff96d682
1 changed files with 47 additions and 0 deletions

View File

@ -224,6 +224,7 @@ static const SaveLoad _old_station_desc[] = {
};
static uint16 _waiting_acceptance;
static uint32 _num_flows;
static uint16 _cargo_source;
static uint32 _cargo_source_xy;
static uint8 _cargo_days;
@ -236,6 +237,20 @@ static const SaveLoad _station_speclist_desc[] = {
SLE_END()
};
struct FlowSaveLoad {
FlowSaveLoad() : via(0), share(0) {}
StationID source;
StationID via;
uint32 share;
};
static const SaveLoad _flow_desc[] = {
SLE_VAR(FlowSaveLoad, source, SLE_UINT16),
SLE_VAR(FlowSaveLoad, via, SLE_UINT16),
SLE_VAR(FlowSaveLoad, share, SLE_UINT32),
SLE_END()
};
/**
* Wrapper function to get the GoodsEntry's internal structure while
* some of the variables itself are private.
@ -260,6 +275,9 @@ const SaveLoad *GetGoodsDesc()
SLE_CONDVAR(GoodsEntry, amount_fract, SLE_UINT8, 150, SL_MAX_VERSION),
SLE_CONDLST(GoodsEntry, cargo.packets, REF_CARGO_PACKET, 68, SL_MAX_VERSION),
SLE_CONDVAR(GoodsEntry, cargo.reserved_count, SLE_UINT, 181, SL_MAX_VERSION),
SLE_CONDVAR(GoodsEntry, link_graph, SLE_UINT16, 183, SL_MAX_VERSION),
SLE_CONDVAR(GoodsEntry, node, SLE_UINT16, 183, SL_MAX_VERSION),
SLEG_CONDVAR( _num_flows, SLE_UINT32, 183, SL_MAX_VERSION),
SLE_END()
};
@ -409,7 +427,24 @@ static void RealSave_STNN(BaseStation *bst)
if (!waypoint) {
Station *st = Station::From(bst);
for (CargoID i = 0; i < NUM_CARGO; i++) {
_num_flows = 0;
for (FlowStatMap::const_iterator it(st->goods[i].flows.begin()); it != st->goods[i].flows.end(); ++it) {
_num_flows += (uint32)it->second.GetShares()->size();
}
SlObject(&st->goods[i], GetGoodsDesc());
for (FlowStatMap::const_iterator outer_it(st->goods[i].flows.begin()); outer_it != st->goods[i].flows.end(); ++outer_it) {
const FlowStat::SharesMap *shares = outer_it->second.GetShares();
uint32 sum_shares = 0;
FlowSaveLoad flow;
flow.source = outer_it->first;
for (FlowStat::SharesMap::const_iterator inner_it(shares->begin()); inner_it != shares->end(); ++inner_it) {
flow.via = inner_it->second;
flow.share = inner_it->first - sum_shares;
sum_shares = inner_it->first;
assert(flow.share > 0);
SlObject(&flow, _flow_desc);
}
}
}
}
@ -451,6 +486,18 @@ static void Load_STNN()
for (CargoID i = 0; i < NUM_CARGO; i++) {
SlObject(&st->goods[i], GetGoodsDesc());
FlowSaveLoad flow;
FlowStat *fs = NULL;
StationID prev_source = INVALID_STATION;
for (uint32 j = 0; j < _num_flows; ++j) {
SlObject(&flow, _flow_desc);
if (fs == NULL || prev_source != flow.source) {
fs = &(st->goods[i].flows.insert(std::make_pair(flow.source, FlowStat(flow.via, flow.share))).first->second);
} else {
fs->AppendShare(flow.via, flow.share);
}
prev_source = flow.source;
}
}
}