removing and adding Rule_NoPowerNeed while consumers are active has now the expected behavior (#828)

David Dormagen 2012-11-10 14:19:59 +01:00
parent f509d052e3
commit 85d720f88e
2 changed files with 93 additions and 1 deletions

View File

@ -112,19 +112,21 @@ func MakePowerConsumer(int amount, bool just_pass_to_global /* whether to skip s
if(PowerConsumer_last_power_request == PowerConsumer_LPR_None) // initially requesting 0 power?
{
PowerConsumer_last_power_request = PowerConsumer_LPR_Zero;
PowerConsumer_last_power_request_amount = amount;
// always enable
this->~OnEnoughPower();
return true;
}
else if(PowerConsumer_last_power_request == PowerConsumer_LPR_Zero)// requesting 0 power as a second request
{
PowerConsumer_last_power_request_amount = amount;
// should still have power at this point
return true;
}
else // requesting 0 power after having requested nonzero power
{
PowerConsumer_last_power_request = PowerConsumer_LPR_Zero;
PowerConsumer_last_power_request_amount = amount;
inherited(0); // removes as official power consumer
// re-enable power supply
this->~OnEnoughPower();

View File

@ -1,5 +1,95 @@
/*-- Power usage --*/
func Initialize()
{
// we are not the first?
if(ObjectCount(Find_ID(GetID())) != 1) return;
// no power consumers yet, nothing to be done
if(Library_Power_power_compounds == nil) return;
// update all consumers forcefully
var remember = [];
// get all power compounds (bases)
for(var base in Library_Power_power_compounds)
{
// iterate through all registered consumers & producers
// these are not the sleeping power links!
for(var i = GetLength(base.power_links) - 1; i >= 0; --i)
{
var obj_data = base.power_links[i];
if(obj_data == nil) continue;
// is a power producer?
if(!obj_data.obj->~CurrentlyHasPower()) continue;
if(obj_data.amount > 0) continue;
// temporarily stop consuming power to make sure the callback order is correct
obj_data.obj->~OnNotEnoughPower();
// power consumer behavior
var lpr = obj_data.obj.PowerConsumer_last_power_request;
obj_data.obj.PowerConsumer_last_power_request = 0;
var lpr_a = obj_data.obj.PowerConsumer_last_power_request_amount;
obj_data.obj.PowerConsumer_last_power_request_amount = 0;
// remove from list
RemoveArrayIndexUnstable(base.power_links, i);
// make new power consumer later
PushBack(remember, {obj = obj_data.obj, amount = lpr_a});
}
// now awake the sleeping links (later)
for(var i = GetLength(base.sleeping_links) - 1; i >= 0; --i)
{
var obj_data = base.sleeping_links[i];
PushBack(remember, {obj = obj_data.obj, amount = obj_data.amount});
}
base.sleeping_links = [];
}
// let all remembered consumers consume again!
for(var obj_data in remember)
{
if(obj_data == nil) continue;
obj_data.obj->MakePowerConsumer(Abs(obj_data.amount));
}
}
func Destruction()
{
// we are not the last?
if(ObjectCount(Find_ID(GetID())) != 1) return;
// schedule the call so that the removal is complete
Schedule(nil, "Rule_NoPowerNeed->DestructionEx()", 1);
}
func DestructionEx()
{
// we were not the last?
if(ObjectCount(Find_ID(Rule_NoPowerNeed)) != 0) return;
// update consumers again
// go through all existing consumers and see whether they are consuming atm
for(var obj in FindObjects(Find_Func("IsPowerConsumer")))
{
var last_request = obj.PowerConsumer_last_power_request;
var last_amount = obj.PowerConsumer_last_power_request_amount;
// had not requested power aka "is not running"
if(last_request == PowerConsumer_LPR_None) continue;
// temporarily stop consuming power to make sure the callback order is correct
obj->OnNotEnoughPower();
obj.PowerConsumer_last_power_request = PowerConsumer_LPR_None;
obj.PowerConsumer_last_power_request_amount = 0;
obj->MakePowerConsumer(last_amount);
}
}
protected func Activate(int iByPlayer)
{
MessageWindow(GetProperty("Description"), iByPlayer);