openclonk/planet/Objects.ocd/Structures.ocd/SteamEngine.ocd/Script.c

121 lines
2.3 KiB
C
Raw Normal View History

2009-12-29 13:44:16 +00:00
/*-- Steam engine --*/
#include Library_Ownable
#include Library_PowerProducer
2009-12-29 13:44:16 +00:00
static const SteamEngine_produced_power = 300;
2009-12-29 13:44:16 +00:00
local iFuelAmount;
local power_seconds;
2009-12-29 13:44:16 +00:00
2011-05-30 22:50:07 +00:00
func Construction()
2009-12-29 13:44:16 +00:00
{
iFuelAmount = 0;
power_seconds = 0;
2011-05-30 22:50:07 +00:00
return _inherited(...);
2009-12-29 13:44:16 +00:00
}
func ContentsCheck()
{
//Ejects non fuel items immediately
var fuel;
if(fuel = FindObject(Find_Container(this), Find_Not(Find_Func("IsFuel"))))
{
fuel->Exit(-53,21, -20, -1, -1, -30);
Sound("Chuff"); //I think a 'chuff' or 'metal clonk' sound could be good here -Ringwaul
}
// Still active?
if(!ActIdle()) return true;
// or still warm water in the tank?!
if(GetEffect("CreatesPower", this))
return true;
// not needed?
if(GetPendingPowerAmount() == 0)
return false;
// Still has some fuel?
if(iFuelAmount) return SetAction("Work");
// Search for new fuel
if(fuel = FindObject(Find_Container(this), Find_Func("IsFuel")))
{
iFuelAmount += fuel->~GetFuelAmount();
fuel->RemoveObject();
SetAction("Work");
return true;
}
2009-12-29 13:44:16 +00:00
return false;
2009-12-29 13:44:16 +00:00
}
func ConsumeFuel()
{
if(iFuelAmount > 0)
{
// every fuel unit gives power for one second
--iFuelAmount;
power_seconds += 1;
if(!GetEffect("CreatesPower", this))
AddEffect("CreatesPower", this, 1, 36, this);
}
// All used up?
if(!iFuelAmount || ((GetPendingPowerAmount() == 0) && (GetCurrentPowerBalance() >= SteamEngine_produced_power)))
{
SetAction("Idle");
ContentsCheck();
}
2009-12-29 13:44:16 +00:00
}
func FxCreatesPowerStart(target, effect, temp)
{
if(temp) return;
// fixed amount
MakePowerProducer(SteamEngine_produced_power);
AddEffect("Smoking", this, 1, 5, this);
}
func FxCreatesPowerTimer(target, effect)
{
if(power_seconds == 0) return -1;
--power_seconds;
}
func FxCreatesPowerStop(target, effect, reason, temp)
{
if(temp) return;
// disable producer
MakePowerProducer(0);
if(GetEffect("Smoking", this))
RemoveEffect("Smoking", this);
}
func FxSmokingTimer()
{
Smoke(20, -15, 10);
return 1;
}
local ActMap = {
2009-12-29 13:44:16 +00:00
Work = {
Prototype = Action,
Name = "Work",
Procedure = DFA_NONE,
Directions = 2,
FlipDir = 1,
Length = 20,
Delay = 2,
NextAction = "Work",
Animation = "Work",
EndCall = "ConsumeFuel",
},
};
local Name = "$Name$";
func Definition(def) {
SetProperty("MeshTransformation", Trans_Mul(Trans_Rotate(25,0,1,0), Trans_Scale(625)), def);
}