diff --git a/planet/Objects.ocd/Structures.ocd/LiquidTank.ocd/DefCore.txt b/planet/Objects.ocd/Structures.ocd/LiquidTank.ocd/DefCore.txt new file mode 100644 index 000000000..b3d54d0c6 --- /dev/null +++ b/planet/Objects.ocd/Structures.ocd/LiquidTank.ocd/DefCore.txt @@ -0,0 +1,14 @@ +[DefCore] +id=LiquidTank +Version=8,0 +Category=C4D_Structure +Width=40 +Height=72 +Offset=-20,-36 +Vertices=6 +VertexX=-16,16,-18,18,-18,18 +VertexY=35,35,0,0,-20,-20 +VertexFriction=100,100,50,50,50,50 +Mass=800 +Exclusive=1 +Construction=1 \ No newline at end of file diff --git a/planet/Objects.ocd/Structures.ocd/LiquidTank.ocd/Graphics.5.png b/planet/Objects.ocd/Structures.ocd/LiquidTank.ocd/Graphics.5.png new file mode 100644 index 000000000..6d813f137 Binary files /dev/null and b/planet/Objects.ocd/Structures.ocd/LiquidTank.ocd/Graphics.5.png differ diff --git a/planet/Objects.ocd/Structures.ocd/LiquidTank.ocd/Script.c b/planet/Objects.ocd/Structures.ocd/LiquidTank.ocd/Script.c new file mode 100644 index 000000000..41596fef3 --- /dev/null +++ b/planet/Objects.ocd/Structures.ocd/LiquidTank.ocd/Script.c @@ -0,0 +1,174 @@ +/** + Liquid Tank + Holds liquids of any type and can be opened to create a flood. + + @author Maikel +*/ + + +#include Library_Structure +#include Library_Ownable +#include Library_Tank + + +public func Initialize() +{ + return _inherited(...); +} + +public func Construction(object creator) +{ + return _inherited(creator, ...); +} + +public func IsHammerBuildable() { return true; } + + +/*-- Liquid Control --*/ + +// Only accept a single liquid at the same time, but accept any liquid type. +public func IsLiquidContainerForMaterial(string liquid) +{ + for (var liquid_content in GetLiquidContents()) + if (GetLiquidDef(liquid) != GetLiquidDef(liquid_content->GetID())) + return false; + return true; +} + +public func GetLiquidContainerMaxFillLevel(liquid_name) +{ + return this.LiquidCapacity; +} + +// The liquid tank may have one drain and one source. +public func QueryConnectPipe(object pipe, bool do_msg) +{ + if (GetDrainPipe() && GetSourcePipe()) + { + if (do_msg) pipe->Report("$MsgHasPipes$"); + return true; + } + else if (GetSourcePipe() && pipe->IsSourcePipe()) + { + if (do_msg) pipe->Report("$MsgSourcePipeProhibited$"); + return true; + } + else if (GetDrainPipe() && pipe->IsDrainPipe()) + { + if (do_msg) pipe->Report("$MsgDrainPipeProhibited$"); + return true; + } + else if (pipe->IsAirPipe()) + { + if (do_msg) pipe->Report("$MsgPipeProhibited$"); + return true; + } + return false; +} + +// Set to source or drain pipe. +public func OnPipeConnect(object pipe, string specific_pipe_state) +{ + if (PIPE_STATE_Source == specific_pipe_state) + { + SetSourcePipe(pipe); + pipe->SetSourcePipe(); + } + else if (PIPE_STATE_Drain == specific_pipe_state) + { + SetDrainPipe(pipe); + pipe->SetDrainPipe(); + } + else + { + if (!GetDrainPipe()) + OnPipeConnect(pipe, PIPE_STATE_Drain); + else if (!GetSourcePipe()) + OnPipeConnect(pipe, PIPE_STATE_Source); + } + pipe->Report("$MsgConnectedPipe$"); +} + + +/*-- Interaction --*/ + +public func IsInteractable(object clonk) +{ + if (GetCon() < 100) + return false; + return !Hostile(GetOwner(), clonk->GetOwner()); +} + +public func GetInteractionMetaInfo(object clonk) +{ + if (GetEffect("FxDisperseLiquid", this)) + return { Description = "$MsgCloseTank$", IconName = nil, IconID = Icon_Enter, Selected = false }; + return { Description = "$MsgOpenTank$", IconName = nil, IconID = Icon_Exit, Selected = false }; +} + +public func Interact(object clonk) +{ + var fx = GetEffect("FxDisperseLiquid", this); + if (fx) + { + fx->Remove(); + return true; + } + CreateEffect(FxDisperseLiquid, 100, 2); + return true; +} + +local FxDisperseLiquid = new Effect +{ + Construction = func() + { + this.Interval = 2; + return FX_OK; + }, + Timer = func() + { + var liquid = Target->Contents(); + if (!liquid || !liquid->~IsLiquid()) + return FX_OK; + if (liquid->GetLiquidAmount() <= Target.DispersionRate) + { + liquid->Exit(); + liquid->SetPosition(Target->GetX(), Target->GetY()); + liquid->Disperse(180, 40); + } + else + { + liquid->RemoveLiquid(nil, Target.DispersionRate); + liquid = liquid->GetID()->CreateLiquid(Target.DispersionRate); + liquid->SetPosition(Target->GetX(), Target->GetY()); + liquid->Disperse(180, 40); + } + // TODO: Sound. + return FX_OK; + } +}; + + +/*-- Contents Control --*/ + +public func IsContainer() { return true; } + +protected func RejectCollect(id item, object obj) +{ + // Accept liquids only. + if (obj->~IsLiquid()) + return _inherited(item, obj, ...); + return true; +} + + +/*-- Properties --*/ + +local Name = "$Name$"; +local Description ="$Description$"; +local BlastIncinerate = 100; +local FireproofContainer = true; +local HitPoints = 90; +local Components = {Wood = 3, Metal = 2}; +local LiquidCapacity = 10000; +local DispersionRate = 40; \ No newline at end of file diff --git a/planet/Objects.ocd/Structures.ocd/LiquidTank.ocd/StringTblDE.txt b/planet/Objects.ocd/Structures.ocd/LiquidTank.ocd/StringTblDE.txt new file mode 100644 index 000000000..5b9159c1d --- /dev/null +++ b/planet/Objects.ocd/Structures.ocd/LiquidTank.ocd/StringTblDE.txt @@ -0,0 +1,11 @@ +Name=Tank +Description=Hier können Flüssigkeiten gespeichert werden, aber nur eine Art gleichzeitig. + +MsgConnectedPipe=Rohr angeschlossen. +MsgPipeProhibited=Dieses Rohr kann nicht an den Tank angeschlossen werden. +MsgHasPipes=Der Tank hat schon ein Zu- und Abflussrohr. +MsgSourcePipeProhibited=Zuflussrohre können nicht an den Tank angeschlossen werden. +MsgDrainPipeProhibited=Abflussrohre können nicht an den Tank angeschlossen werden. + +MsgOpenTank=Ventil öffnen +MsgCloseTank=Ventil schließen \ No newline at end of file diff --git a/planet/Objects.ocd/Structures.ocd/LiquidTank.ocd/StringTblUS.txt b/planet/Objects.ocd/Structures.ocd/LiquidTank.ocd/StringTblUS.txt new file mode 100644 index 000000000..630389196 --- /dev/null +++ b/planet/Objects.ocd/Structures.ocd/LiquidTank.ocd/StringTblUS.txt @@ -0,0 +1,11 @@ +Name=Liquid Tank +Description=Liquids can be stored here, but only one type of liquid at the same time. + +MsgConnectedPipe=Connected pipe. +MsgPipeProhibited=This pipe cannot be connected to the liquid tank. +MsgHasPipes=Liquid tank already has a source and a drain pipe. +MsgSourcePipeProhibited=Unable to connect source pipe to the liquid tank. +MsgDrainPipeProhibited=Unable to connect drain pipe to the liquid tank. + +MsgOpenTank=Open valve +MsgCloseTank=Close valve \ No newline at end of file diff --git a/planet/Tests.ocf/LiquidSystem.ocs/Script.c b/planet/Tests.ocf/LiquidSystem.ocs/Script.c index f51498f5c..4b8b97058 100644 --- a/planet/Tests.ocf/LiquidSystem.ocs/Script.c +++ b/planet/Tests.ocf/LiquidSystem.ocs/Script.c @@ -378,6 +378,43 @@ global func Test5_OnFinished() return; } +global func Test6_OnStart(int plr) +{ + var tank = CreateObjectAbove(LiquidTank, 70, 160, plr); + var pump1 = CreateObjectAbove(Pump, 16, 160, plr); + var pump2 = CreateObjectAbove(Pump, 124, 160, plr); + + var source = CreateObjectAbove(Pipe, 168, 292, plr); + source->ConnectPipeTo(pump1, PIPE_STATE_Source); + var drain = CreateObjectAbove(Pipe, 240, 100, plr); + drain->ConnectPipeTo(pump1, PIPE_STATE_Drain); + drain->ConnectPipeTo(tank, PIPE_STATE_Drain); + + var source = CreateObjectAbove(Pipe, 168, 292, plr); + source->ConnectPipeTo(pump2, PIPE_STATE_Source); + source->ConnectPipeTo(tank, PIPE_STATE_Source); + var drain = CreateObjectAbove(Pipe, 240, 100, plr); + drain->ConnectPipeTo(pump2, PIPE_STATE_Drain); + + // Log what the test is about. + Log("Test pumping into and from a liquid tank"); + return true; +} + +global func Test6_Completed() +{ + if (GetMaterial(240, 60) == Material("Water")) + return true; + return false; +} + +global func Test6_OnFinished() +{ + RemoveAll(Find_Or(Find_ID(LiquidTank), Find_ID(Pump), Find_ID(Pipe))); + RestoreWaterLevels(); + return; +} + /*-- Helper Functions --*/ diff --git a/planet/Worlds.ocf/Functions.ocd/System.ocg/Knowledge.c b/planet/Worlds.ocf/Functions.ocd/System.ocg/Knowledge.c index 5a08e59af..4a564abf5 100644 --- a/planet/Worlds.ocf/Functions.ocd/System.ocg/Knowledge.c +++ b/planet/Worlds.ocf/Functions.ocd/System.ocg/Knowledge.c @@ -59,7 +59,7 @@ global func GivePlayerPumpingKnowledge(int plr) { var knowledge = [ // Stuff needed for pumping. - Pump, Pipe + Pump, Pipe /*,LiquidTank TODO: add when graphics are done*/ ]; for (var plan in knowledge) SetPlrKnowledge(plr, plan);