PowerSystem: Streamline method behaviour

Linked flag changing now always updates all networks (which is not very
hard on the performance), special treatment for neutral network will be
removed with the next commit.
install-platforms
Mark 2017-09-10 19:18:52 +02:00
parent 0c148530a6
commit 6149f7de8a
2 changed files with 30 additions and 40 deletions

View File

@ -208,7 +208,6 @@ private func AddOwnership()
RefreshOwnershipOfSurrounding();
// Linked flags - refresh links for this flag and update the power system.
RefreshLinkedFlags();
GetPowerSystem()->RefreshAllPowerNetworks();
return;
}
@ -226,7 +225,6 @@ private func RemoveOwnership()
RefreshOwnershipOfSurrounding();
// Linked flags - refresh links for this flag and update the power system.
RefreshLinkedFlags();
GetPowerSystem()->RefreshAllPowerNetworks();
return;
}
@ -341,31 +339,13 @@ public func RefreshLinkedFlags()
// Update the linked flags for all other linked flags as well.
for (var other in lib_flag.linked_flags)
other->CopyLinkedFlags(this, lib_flag.linked_flags);
// Since the connected flags have been updated it is necessary to update the power helper as well.
// First make sure the power system is initialized.
GetPowerSystem()->Init();
// Get the old power network for this flag.
var old_network = GetPowerHelper();
// Create a new power network for ths flag since we don't know whether flag links have been lost.
// We then just possibly remove the old ones if they exist.
SetPowerHelper(GetPowerSystem()->CreateNetwork());
// Make a list of the power networks which need to be merged into the new one.
var to_merge = [old_network];
for (var linked_flag in lib_flag.linked_flags)
{
// Add old network of this flag to merge list and reset to new network.
if (GetIndexOf(to_merge, linked_flag->GetPowerHelper()) == -1)
PushBack(to_merge, linked_flag->GetPowerHelper());
linked_flag->SetPowerHelper(GetPowerHelper());
}
SetPowerHelper(GetPowerSystem()->CreateNetwork(), true, false);
// Now merge all networks into the newly created network.
for (var network in to_merge)
{
if (network == nil)
continue;
GetPowerSystem()->RefreshPowerNetwork(network);
}
GetPowerSystem()->RefreshAllPowerNetworks();
// Debugging logs.
//LogFlags();
return;
@ -474,9 +454,25 @@ public func GetLinkedFlags() {return lib_flag.linked_flags; }
public func GetPowerHelper() { return lib_flag.power_helper; }
public func SetPowerHelper(object to)
public func SetPowerHelper(object to, bool update_linked_flags, bool report_inconsistency)
{
lib_flag.power_helper = to;
var old_network = GetPowerHelper();
lib_flag.power_helper = to;
// Update linked flags
if (update_linked_flags)
{
for (var linked_flag in GetLinkedFlags())
{
if (!linked_flag)
continue;
// Assert different power helpers for the same network.
if (report_inconsistency && linked_flag->GetPowerHelper() != old_network)
{
FatalError("Flags in the same network have different power helpers.");
}
linked_flag->SetPowerHelper(to);
}
}
return;
}

View File

@ -186,6 +186,8 @@ public func GetPowerNetwork(object for_obj)
// Definition call safety checks.
if (this != GetPowerSystem() || !for_obj)
return FatalError("GetPowerNetwork() either not called from definition context or no object specified.");
Init();
// Get the actual power consumer for this object. This can for example be the elevator for the case.
var actual;
@ -204,8 +206,6 @@ public func GetPowerNetwork(object for_obj)
// If no flag was available the object is neutral and needs a neutral helper.
if (!flag)
{
if (!LIB_POWR_Networks)
LIB_POWR_Networks = [];
for (var network in LIB_POWR_Networks)
{
if (!network || !network.lib_power.neutral_network)
@ -227,19 +227,8 @@ public func GetPowerNetwork(object for_obj)
if (helper == nil)
{
helper = CreateNetwork(false);
// Add to all linked flags.
flag->SetPowerHelper(helper);
for (var linked_flag in flag->GetLinkedFlags())
{
if (!linked_flag)
continue;
// Assert different power helpers for the same network.
if (linked_flag->GetPowerHelper() != nil)
{
FatalError("Flags in the same network have different power helpers.");
}
linked_flag->SetPowerHelper(helper);
}
// Add to all linked flags, report errors if the linked flags already have a power helper
flag->SetPowerHelper(helper, true, true);
}
}
return helper;
@ -262,6 +251,7 @@ public func Init()
// Can be a neutral network, if desired.
private func CreateNetwork(bool neutral)
{
Init();
var network = CreateObject(GetPowerSystemNetwork(), 0, 0, NO_OWNER);
PushBack(LIB_POWR_Networks, network);
network.lib_power.neutral_network = neutral;
@ -308,6 +298,10 @@ public func RefreshAllPowerNetworks()
continue;
}
//network->CheckPowerBalance();
if (!network.lib_power.neutral_network) // this makes the special handling above essentially obsolete
{
RefreshPowerNetwork(network);
}
}
return;
}