2014-12-30 19:24:13 +00:00
/**
2010-12-31 12:20:54 +00:00
Pump
2013-05-30 20:11:39 +00:00
Pumps liquids using drain and source pipes . Features include :
+ switch on and off
+ consume / produce a variable amount of power depending on the height of
source and drain
2010-12-31 12:20:54 +00:00
2014-12-30 19:24:13 +00:00
@ author Maikel , ST - DDT , Sven2 , Newton
*/
2010-12-31 12:20:54 +00:00
2012-05-10 19:20:06 +00:00
# include Library_Structure
2012-02-18 21:50:18 +00:00
# include Library_Ownable
2010-12-31 12:20:54 +00:00
# include Library_PowerConsumer
2013-04-28 11:57:25 +00:00
# include Library_PowerProducer
2010-12-31 12:20:54 +00:00
2013-05-30 20:11:39 +00:00
local animation ; // animation handle
2013-05-31 20:34:17 +00:00
local switched_on ; // controlled by Interaction. Indicates whether the user wants to pump or not
2013-05-30 20:11:39 +00:00
2013-05-31 20:34:17 +00:00
local powered ; // whether the pump has enough power as a consumer, always true if producing
local power_used ; // the amount of power currently consumed or (if negative) produced
2013-05-30 20:11:39 +00:00
local stored_material_index ; //contained liquid
local stored_material_amount ;
local source_pipe ;
local drain_pipe ;
2015-09-05 17:10:19 +00:00
local clog_count ; // increased when the pump doesn't find liquid or can't insert it. When it reaches max_clog_count, it will put the pump into temporary idle mode.
local max_clog_count = 5 ; // note that even when max_clog_count is reached, the pump will search through offsets (but in idle mode)
2013-05-25 15:58:19 +00:00
/** This object is a liquid pump, thus pipes can be connected. */
2010-12-31 12:20:54 +00:00
public func IsLiquidPump ( ) { return true ; }
2013-05-30 20:11:39 +00:00
func Construction ( )
2012-04-16 15:31:38 +00:00
{
2013-05-30 20:11:39 +00:00
// Rotate at a 45 degree angle towards viewer and add a litte bit of Random
2014-12-30 19:24:13 +00:00
this . MeshTransformation = Trans_Rotate ( 50 + RandomX ( - 10 , 10 ) , 0 , 1 , 0 ) ;
2015-02-08 12:07:35 +00:00
return _inherited ( . . . ) ;
2013-05-30 20:11:39 +00:00
}
func Initialize ( )
{
switched_on = true ;
2013-05-27 11:24:42 +00:00
var start = 0 ;
var end = GetAnimationLength ( " pump " ) ;
2013-05-30 20:11:39 +00:00
animation = PlayAnimation ( " pump " , 5 , Anim_Linear ( GetAnimationPosition ( animation ) , start , end , 35 , ANIM_Loop ) , Anim_Const ( 1000 ) ) ;
SetState ( " Wait " ) ;
2015-02-04 11:40:29 +00:00
return _inherited ( . . . ) ;
2010-12-31 12:20:54 +00:00
}
2013-12-22 22:47:40 +00:00
2012-03-10 19:45:18 +00:00
/*-- Interaction --*/
2015-09-10 16:23:44 +00:00
public func HasInteractionMenu ( ) { return true ; }
2015-03-01 09:27:29 +00:00
public func GetPumpControlMenuEntries ( object clonk )
{
var menu_entries = [ ] ;
// default design of a control menu item
var custom_entry =
{
2015-09-06 17:02:31 +00:00
Right = " 100% " , Bottom = " 2em " ,
2015-03-01 09:27:29 +00:00
BackgroundColor = { Std = 0 , OnHover = 0x50ff0000 } ,
2015-09-06 17:02:31 +00:00
image = { Right = " 2em " } ,
text = { Left = " 2em " }
2015-03-01 09:27:29 +00:00
} ;
if ( ! switched_on )
PushBack ( menu_entries , { symbol = Icon_Play , extra_data = " on " ,
custom =
{
Prototype = custom_entry ,
Priority = 1 ,
text = { Prototype = custom_entry . text , Text = " $MsgTurnOn$ " } ,
image = { Prototype = custom_entry . image , Symbol = Icon_Play }
} } ) ;
else
PushBack ( menu_entries , { symbol = Icon_Stop , extra_data = " off " ,
custom =
{
Prototype = custom_entry ,
Priority = 1 ,
text = { Prototype = custom_entry . text , Text = " $MsgTurnOff$ " } ,
image = { Prototype = custom_entry . image , Symbol = Icon_Stop }
} } ) ;
if ( source_pipe )
PushBack ( menu_entries , { symbol = Icon_Cancel , extra_data = " cutsource " ,
custom =
{
Prototype = custom_entry ,
Priority = 2 ,
text = { Prototype = custom_entry . text , Text = " $MsgCutSource$ " } ,
image = { Prototype = custom_entry . image , Symbol = Icon_Cancel }
} } ) ;
if ( drain_pipe )
PushBack ( menu_entries , { symbol = Icon_Cancel , extra_data = " cutdrain " ,
custom =
{
Prototype = custom_entry ,
Priority = 3 ,
text = { Prototype = custom_entry . text , Text = " $MsgCutDrain$ " } ,
image = { Prototype = custom_entry . image , Symbol = Icon_Cancel }
} } ) ;
return menu_entries ;
}
2015-02-27 10:23:20 +00:00
public func GetInteractionMenus ( object clonk )
2012-03-10 19:45:18 +00:00
{
2015-03-01 10:20:33 +00:00
var menus = _inherited ( ) ? ? [ ] ;
var prod_menu =
{
title = " $Control$ " ,
entries_callback = this . GetPumpControlMenuEntries ,
callback = " OnPumpControl " ,
callback_hover = " OnPumpControlHover " ,
callback_target = this ,
BackgroundColor = RGB ( 0 , 50 , 50 ) ,
Priority = 20
} ;
PushBack ( menus , prod_menu ) ;
2015-02-27 10:23:20 +00:00
return menus ;
}
public func OnPumpControlHover ( id symbol , string action , desc_menu_target , menu_id )
{
var text = " " ;
if ( action = = " on " ) text = " $DescTurnOn$ " ;
else if ( action = = " off " ) text = " $DescTurnOff$ " ;
else if ( action = = " cutdrain " ) text = " $DescCutDrain$ " ;
else if ( action = = " cutsource " ) text = " $DescCutSource$ " ;
GuiUpdateText ( text , menu_id , 1 , desc_menu_target ) ;
2014-10-18 17:12:55 +00:00
}
2015-02-27 10:23:20 +00:00
public func OnPumpControl ( id symbol , string action , bool alt )
2014-10-18 17:12:55 +00:00
{
2015-02-27 10:23:20 +00:00
if ( action = = " on " | | action = = " off " )
2015-03-01 09:27:29 +00:00
ToggleOnOff ( true ) ;
2015-02-27 10:23:20 +00:00
else if ( action = = " cutsource " & & source_pipe )
2014-10-18 17:12:55 +00:00
source_pipe - > RemoveObject ( ) ;
2015-02-27 10:23:20 +00:00
else if ( action = = " cutdrain " & & drain_pipe )
2014-10-18 17:12:55 +00:00
drain_pipe - > RemoveObject ( ) ;
2015-03-01 09:27:29 +00:00
UpdateInteractionMenus ( this . GetPumpControlMenuEntries ) ;
2012-03-10 19:45:18 +00:00
}
2010-12-31 12:20:54 +00:00
/*-- Pipe connection --*/
public func GetSource ( ) { return source_pipe ; }
public func SetDrain ( object pipe ) { drain_pipe = pipe ; }
public func GetDrain ( ) { return drain_pipe ; }
2012-10-25 18:14:13 +00:00
public func SetSource ( object pipe )
{
source_pipe = pipe ;
2013-05-25 15:58:19 +00:00
CheckState ( ) ;
2012-10-25 18:14:13 +00:00
}
2013-05-25 15:58:19 +00:00
/*-- Power stuff --*/
2014-12-19 20:47:08 +00:00
public func GetConsumerPriority ( ) { return 25 ; }
public func GetProducerPriority ( ) { return 100 ; }
2014-12-30 19:24:13 +00:00
public func IsSteadyPowerProducer ( ) { return true ; }
public func OnNotEnoughPower ( )
2012-02-18 21:50:18 +00:00
{
2013-05-30 20:11:39 +00:00
powered = false ;
2013-06-04 18:10:51 +00:00
CheckState ( ) ;
2015-02-01 11:39:02 +00:00
return _inherited ( . . . ) ;
2012-02-18 21:50:18 +00:00
}
2014-12-30 19:24:13 +00:00
public func OnEnoughPower ( )
2012-02-18 21:50:18 +00:00
{
2013-05-30 20:11:39 +00:00
powered = true ;
2013-06-04 18:10:51 +00:00
CheckState ( ) ;
2015-02-01 11:39:02 +00:00
return _inherited ( . . . ) ;
2012-02-18 21:50:18 +00:00
}
2013-05-25 15:58:19 +00:00
/** Returns object to which the liquid is pumped */
2013-04-28 11:57:25 +00:00
private func GetDrainObject ( )
{
if ( drain_pipe ) return drain_pipe - > GetConnectedObject ( this ) ? ? this ;
return this ;
}
2011-10-11 22:32:46 +00:00
2014-10-18 17:12:55 +00:00
/** Returns object from which the liquid is pumped */
2013-05-25 15:58:19 +00:00
private func GetSourceObject ( )
{
2015-02-01 11:39:02 +00:00
if ( source_pipe )
return source_pipe - > GetConnectedObject ( this ) ? ? this ;
2013-05-25 15:58:19 +00:00
return this ;
}
2013-05-30 20:11:39 +00:00
/** Returns amount of pixels to pump per 30 frames */
public func GetPumpSpeed ( )
{
return 50 ;
}
2013-05-25 15:58:19 +00:00
/** PhaseCall of Pump: Pump the liquid from the source to the drain pipe */
2010-12-31 12:20:54 +00:00
protected func Pumping ( )
{
2012-10-25 18:14:13 +00:00
// at this point we can assert that we have power
// something went wrong in the meantime?
2013-05-30 20:11:39 +00:00
// let the central function handle that on next check
2015-02-01 11:39:02 +00:00
if ( ! source_pipe )
return ;
2013-04-28 11:57:25 +00:00
var pump_ok = true ;
2012-10-25 18:14:13 +00:00
2013-05-30 20:11:39 +00:00
// is empty? -> try to get liquid
if ( ! stored_material_amount )
2011-10-11 22:32:46 +00:00
{
2012-10-25 18:14:13 +00:00
// get new materials
2015-05-01 16:04:42 +00:00
var source_obj = GetSourceObject ( ) ;
var mat = source_obj - > ExtractLiquidAmount ( source_obj . ApertureOffsetX , source_obj . ApertureOffsetY , GetPumpSpeed ( ) / 10 , true ) ;
2013-05-30 20:11:39 +00:00
2012-10-25 18:14:13 +00:00
// no material to pump?
2014-12-30 19:24:13 +00:00
if ( mat )
2013-05-30 20:11:39 +00:00
{
2015-02-01 11:39:02 +00:00
stored_material_index = mat [ 0 ] ;
stored_material_amount = mat [ 1 ] ;
2013-05-30 20:11:39 +00:00
}
2013-04-28 12:02:57 +00:00
else
2013-05-30 20:11:39 +00:00
{
2015-09-05 17:10:19 +00:00
source_obj - > ~ CycleApertureOffset ( this ) ; // try different offsets, so we don't stop pumping just because 1px of earth was dropped on the source pipe
2013-05-30 20:11:39 +00:00
pump_ok = false ;
}
2011-10-11 22:32:46 +00:00
}
2013-04-28 11:57:25 +00:00
if ( pump_ok )
{
2013-05-30 20:11:39 +00:00
var i = stored_material_amount ;
while ( i > 0 )
2013-04-28 11:57:25 +00:00
{
2015-05-01 16:04:42 +00:00
var drain_obj = GetDrainObject ( ) ;
if ( GetDrainObject ( ) - > InsertMaterial ( stored_material_index , drain_obj . ApertureOffsetX , drain_obj . ApertureOffsetY ) )
2013-05-30 20:11:39 +00:00
{
i - - ;
}
// Drain is stuck.
else
{
2015-09-05 17:10:19 +00:00
drain_obj - > ~ CycleApertureOffset ( this ) ; // try different offsets, so we don't stop pumping just because 1px of earth was dropped on the drain pipe
2013-05-30 20:11:39 +00:00
pump_ok = false ;
break ;
}
2013-04-28 11:57:25 +00:00
}
2013-05-30 20:11:39 +00:00
stored_material_amount = i ;
if ( stored_material_amount < = 0 )
stored_material_index = nil ;
2013-04-28 11:57:25 +00:00
}
2013-05-30 20:11:39 +00:00
2015-09-05 17:10:19 +00:00
if ( pump_ok )
{
clog_count = 0 ;
}
else
{
// Put into wait state if no liquid could be pumped for a while
if ( + + clog_count > = max_clog_count )
{
SetState ( " WaitForLiquid " ) ;
}
}
2014-12-30 19:24:13 +00:00
return ;
2013-04-28 11:57:25 +00:00
}
2013-05-30 20:11:39 +00:00
/** Re check state and change the state if needed */
2013-05-25 15:58:19 +00:00
func CheckState ( )
2013-04-28 11:57:25 +00:00
{
2013-05-30 20:11:39 +00:00
var is_fullcon = GetCon ( ) > = 100 ;
var can_pump = source_pipe & & is_fullcon & & switched_on ;
// can't pump at all -> wait
if ( ! can_pump )
2013-04-28 11:57:25 +00:00
{
2013-05-30 20:11:39 +00:00
SetState ( " Wait " ) ;
}
else
{
// can pump but has no liquid -> wait for liquid
if ( ! HasLiquidToPump ( ) )
2013-05-25 15:58:19 +00:00
{
2013-05-30 20:11:39 +00:00
SetState ( " WaitForLiquid " ) ;
2013-05-25 15:58:19 +00:00
}
2013-05-30 20:11:39 +00:00
else
2013-05-25 15:58:19 +00:00
{
2013-05-30 20:11:39 +00:00
// can pump, has liquid but has no power -> wait for power
if ( ! powered )
2013-05-25 15:58:19 +00:00
{
2013-05-30 20:11:39 +00:00
SetState ( " WaitForPower " ) ;
2013-05-25 15:58:19 +00:00
}
2013-05-30 20:11:39 +00:00
// otherwise, pump! :-)
else
{
2015-09-05 17:10:19 +00:00
clog_count = 0 ;
2013-05-30 20:11:39 +00:00
SetState ( " Pump " ) ;
}
// regularly update the power usage while pumping or waiting for power
UpdatePowerUsage ( ) ;
2013-05-25 15:58:19 +00:00
}
2013-04-28 11:57:25 +00:00
}
}
2013-05-25 15:58:19 +00:00
/** Get current height the pump has to push liquids upwards (input.y - output.y) */
private func GetPumpHeight ( )
2013-04-28 11:57:25 +00:00
{
2013-05-30 20:11:39 +00:00
// compare each the surfaces of the bodies of liquid pumped
2013-05-25 15:58:19 +00:00
// find Y position of surface of liquid that is pumped to target
2015-05-01 16:04:42 +00:00
var source_obj = GetSourceObject ( ) ;
var source_x = source_obj . ApertureOffsetX ;
var source_y = source_obj . ApertureOffsetY ;
if ( source_obj - > GBackLiquid ( source_x , source_y ) )
2013-05-25 15:58:19 +00:00
{
2015-05-01 16:04:42 +00:00
var src_mat = source_obj - > GetMaterial ( source_x , source_y ) ;
while ( src_mat = = source_obj - > GetMaterial ( source_x , source_y - 1 ) )
2013-05-30 20:11:39 +00:00
- - source_y ;
2013-05-25 15:58:19 +00:00
}
2013-06-04 18:09:09 +00:00
// same for target (use same function as if inserting)
2015-02-01 11:39:02 +00:00
var target_pos = { X = 0 , Y = 0 } ;
2015-05-01 16:04:42 +00:00
var drain_obj = GetDrainObject ( ) ;
drain_obj - > CanInsertMaterial ( Material ( " Water " ) , drain_obj . ApertureOffsetX , drain_obj . ApertureOffsetY , target_pos ) ;
return source_obj - > GetY ( ) + source_y - target_pos . Y ;
2013-04-28 11:57:25 +00:00
}
2013-05-25 15:58:19 +00:00
/** Recheck power usage/production for current pump height
and make the pump a producer / consumer for the power system */
private func UpdatePowerUsage ( )
2013-04-28 11:57:25 +00:00
{
2013-05-25 15:58:19 +00:00
var new_power ;
2014-12-30 19:24:13 +00:00
if ( IsUsingPower ( ) )
2013-05-25 15:58:19 +00:00
new_power = PumpHeight2Power ( GetPumpHeight ( ) ) ;
else
new_power = 0 ;
2013-05-31 20:34:17 +00:00
// do nothing if not necessary
if ( new_power = = power_used )
2015-03-05 19:40:10 +00:00
{
// But still set powered to true if power_used was not positive.
if ( power_used < = 0 )
powered = true ;
2013-05-31 20:34:17 +00:00
return ;
2015-03-05 19:40:10 +00:00
}
2013-05-31 20:34:17 +00:00
2013-05-25 15:58:19 +00:00
// and update energy system
2013-04-28 11:57:25 +00:00
if ( new_power > 0 )
{
2013-05-31 20:34:17 +00:00
if ( power_used < 0 )
{
powered = false ; // needed since the flag was set manually
2014-12-30 19:24:13 +00:00
UnregisterPowerProduction ( ) ;
2013-05-31 20:34:17 +00:00
}
2014-12-30 19:24:13 +00:00
RegisterPowerRequest ( new_power ) ;
2013-04-28 11:57:25 +00:00
}
2013-05-31 20:34:17 +00:00
else if ( new_power < 0 )
2013-04-28 11:57:25 +00:00
{
2013-05-31 20:34:17 +00:00
if ( power_used > 0 )
2014-12-30 19:24:13 +00:00
UnregisterPowerRequest ( ) ;
RegisterPowerProduction ( - new_power ) ;
2013-05-31 20:34:17 +00:00
powered = true ; // when producing, we always have power
2013-05-25 15:58:19 +00:00
}
2013-05-31 20:34:17 +00:00
else // new_power == 0
{
2014-12-30 19:24:13 +00:00
if ( power_used < 0 )
UnregisterPowerProduction ( ) ;
else if ( power_used > 0 )
UnregisterPowerRequest ( ) ;
2013-06-04 18:10:51 +00:00
powered = true ;
2013-05-31 20:34:17 +00:00
}
power_used = new_power ;
2015-02-01 11:39:02 +00:00
return ;
2013-04-28 11:57:25 +00:00
}
2015-02-01 11:39:02 +00:00
// Return whether the pump should be using power in the current state.
2013-05-25 15:58:19 +00:00
private func IsUsingPower ( )
2013-04-28 11:57:25 +00:00
{
2013-05-31 20:34:17 +00:00
return switched_on & & ( GetAction ( ) = = " Pump " | | GetAction ( ) = = " WaitForPower " ) ;
2010-12-31 12:20:54 +00:00
}
2015-02-01 11:39:02 +00:00
// Transform pump height (input.y - output.y) into required power.
2013-05-25 15:58:19 +00:00
private func PumpHeight2Power ( int pump_height )
2012-10-25 18:14:13 +00:00
{
2015-02-01 11:39:02 +00:00
// Pumping upwards will always cost the minimum energy.
// Pumping downwards will only produce energy after an offset.
var power_offset = 10 ;
// Max power consumed / produced.
var max_power = 60 ;
// Calculate the used power in steps of ten, every 60 pixels represents ten units.
var used_power = pump_height / 60 * 10 ;
2015-05-13 19:18:15 +00:00
// If the pump height is positive then add the minimum energy.
if ( pump_height > = 0 )
2015-02-01 11:39:02 +00:00
used_power = Min ( used_power + 10 , max_power ) ;
// Pumping power downwards never costs energy, but only brings something if offset is overcome.
else
2015-05-13 19:18:15 +00:00
used_power = BoundBy ( used_power + power_offset - 10 , - max_power , 0 ) ;
2015-02-01 11:39:02 +00:00
return used_power ;
2012-10-25 18:14:13 +00:00
}
2015-05-13 19:18:15 +00:00
// Returns whether there is liquid at the source pipe to pump.
2012-10-25 18:14:13 +00:00
private func HasLiquidToPump ( )
2010-12-31 12:20:54 +00:00
{
2013-05-30 20:11:39 +00:00
// source
2015-05-01 16:04:42 +00:00
var source_obj = GetSourceObject ( ) ;
if ( ! source_obj - > GBackLiquid ( source_obj . ApertureOffsetX , source_obj . ApertureOffsetY ) )
2015-09-05 17:10:19 +00:00
{
source_obj - > ~ CycleApertureOffset ( this ) ; // try different offsets, so we can resume pumping after clog because 1px of earth was dropped on the source pipe
2013-05-30 20:11:39 +00:00
return false ;
2015-09-05 17:10:19 +00:00
}
2013-05-30 20:11:39 +00:00
2013-06-04 18:10:51 +00:00
// target (test with the very popular liquid "water")
2015-05-01 16:04:42 +00:00
var drain_obj = GetDrainObject ( ) ;
if ( ! drain_obj - > CanInsertMaterial ( Material ( " Water " ) , drain_obj . ApertureOffsetX , drain_obj . ApertureOffsetY ) )
2015-09-05 17:10:19 +00:00
{
drain_obj - > ~ CycleApertureOffset ( this ) ; // try different offsets, so we can resume pumping after clog because 1px of earth was dropped on the source pipe
2010-12-31 12:20:54 +00:00
return false ;
2015-09-05 17:10:19 +00:00
}
2013-05-30 20:11:39 +00:00
2010-12-31 12:20:54 +00:00
return true ;
}
2015-02-01 11:39:02 +00:00
// Set the state of the pump, retaining the animation position and updating the power usage.
private func SetState ( string act )
2012-03-10 17:23:48 +00:00
{
2015-02-01 11:39:02 +00:00
if ( act = = GetAction ( ) )
return ;
2012-03-10 17:23:48 +00:00
2015-02-01 11:39:02 +00:00
// Set animation depending on the current action.
2013-05-30 20:11:39 +00:00
var start = 0 ;
var end = GetAnimationLength ( " pump " ) ;
2013-06-04 18:10:51 +00:00
var anim_pos = GetAnimationPosition ( animation ) ;
2013-05-30 20:11:39 +00:00
if ( act = = " Pump " )
{
2013-06-04 18:10:51 +00:00
SetAnimationPosition ( animation , Anim_Linear ( anim_pos , start , end , 35 , ANIM_Loop ) ) ;
2011-10-11 22:32:46 +00:00
}
2013-05-30 20:11:39 +00:00
else if ( act = = " WaitForLiquid " )
2013-05-27 11:24:42 +00:00
{
2013-06-04 18:10:51 +00:00
SetAnimationPosition ( animation , Anim_Linear ( anim_pos , start , end , 350 , ANIM_Loop ) ) ;
2013-05-30 20:11:39 +00:00
}
else
2013-05-27 11:24:42 +00:00
{
2013-06-04 18:10:51 +00:00
SetAnimationPosition ( animation , Anim_Const ( anim_pos ) ) ;
2013-05-27 11:24:42 +00:00
}
2013-05-30 20:11:39 +00:00
2015-02-01 11:39:02 +00:00
// Deactivate power usage when not pumping.
2013-05-31 20:34:17 +00:00
if ( powered & & ( act = = " Wait " | | act = = " WaitForLiquid " ) )
2013-05-27 11:24:42 +00:00
{
2014-12-30 19:24:13 +00:00
if ( power_used < 0 )
UnregisterPowerProduction ( ) ;
else if ( power_used > 0 )
UnregisterPowerRequest ( ) ;
2013-05-31 20:34:17 +00:00
power_used = 0 ;
powered = false ;
2013-05-30 20:11:39 +00:00
}
2015-02-01 11:39:02 +00:00
// Finally, set the action.
2013-05-30 20:11:39 +00:00
SetAction ( act ) ;
2015-03-01 09:27:29 +00:00
}
/* Deactivates a running pump or vice-versa. */
func ToggleOnOff ( bool no_menu_refresh )
{
switched_on = ! switched_on ;
CheckState ( ) ;
if ( ! no_menu_refresh )
2015-06-03 20:32:36 +00:00
UpdateInteractionMenus ( this . GetPumpControlMenuEntries ) ;
}
2014-12-30 19:24:13 +00:00
/*-- Properties --*/
protected func Definition ( def )
{
// for title image
SetProperty ( " PictureTransformation " , Trans_Rotate ( 50 , 0 , 1 , 0 ) , def ) ;
// for building preview
SetProperty ( " MeshTransformation " , Trans_Rotate ( 50 , 0 , 1 , 0 ) , def ) ;
}
/*
States
" Wait " : turned off or source pipe not connected
" WaitForPower " : turned on but no power ( does consume power )
" WaitForLiquid " : turned on but no liquid ( does not consume power )
" Pump " : currently working and consuming / producing power
*/
local ActMap = {
Pump = {
Prototype = Action ,
Name = " Pump " ,
Length = 30 ,
Delay = 3 ,
Sound = " Pumpjack " ,
NextAction = " Pump " ,
StartCall = " CheckState " ,
PhaseCall = " Pumping "
} ,
Wait = {
Prototype = Action ,
Name = " Wait " ,
Delay = 90 ,
NextAction = " Wait " ,
EndCall = " CheckState "
} ,
WaitForPower = {
Prototype = Action ,
Name = " WaitForPower " ,
Delay = 30 ,
NextAction = " WaitForPower " ,
EndCall = " CheckState "
} ,
WaitForLiquid = {
Prototype = Action ,
Name = " WaitForLiquid " ,
Delay = 30 ,
NextAction = " WaitForLiquid " ,
EndCall = " CheckState "
}
} ;
local Name = " $Name$ " ;
local Description = " $Description$ " ;
local BlastIncinerate = 50 ;
local HitPoints = 70 ;