openclonk/planet/Experimental.ocd/LiftTower.ocd/Hook.ocd/Script.c

141 lines
2.5 KiB
C

/*-- Hook --*/
local tower, rope;
/* Connection */
public func ControlUse(object clonk, int x, int y)
{
// Search for objects to connect with!
var connect = FindObjects(Find_Category(C4D_Vehicle), Find_AtPoint(), Find_Not(Find_Func("NoLiftTowerConnection")), Find_Not(Find_Func("IsEnvironment")));
if (!GetLength(connect)) return true;
if (GetLength(connect) == 1) return ConnectTo(connect[0]);
var menu = clonk->CreateRingMenu(GetID(), this);
for (var connect_object in connect)
menu->AddItem(connect_object);
menu->Show();
}
public func Selected(object menu, object selected)
{
return ConnectTo(selected->GetSymbol());
}
public func ConnectTo(object connect)
{
Hook();
/* rope->BreakRope(true);
SetRope(true);
rope->Connect(tower, connect);*/
rope->Reconnect(connect);
AddEffect("Connecting", this, 1, 1, this, nil, connect);
return true;
}
private func Hook()
{
if (Contained()) Exit();
this.Collectible = 0;
SetCategory(C4D_StaticBack);
}
private func Unhook()
{
this.Collectible = 1;
SetCategory(C4D_Object);
}
private func FxConnectingStart(object target, effect, int temp, object connect_object)
{
if (temp) return;
effect.connection = connect_object;
}
private func FxConnectingTimer(object target, effect)
{
if (!rope)
{
Unhook();
return -1;
}
if (!effect.connection)
{
Unhook();
rope->BreakRope(true);
SetRope();
return -1;
}
SetPosition(effect.connection->GetX(), effect.connection->GetY());
}
public func Connected()
{
return GetEffect("Connecting", this);
}
public func IsInteractable(object clonk)
{
return !this.Collectible && clonk->GetAction() == "Walk";
}
public func GetInteractionMetaInfo(object clonk)
{
return { IconID = LiftTower_Hook, Description = "$Unhook$" };
}
public func Interact(object clonk)
{
if(clonk->Collect(this))
{
RemoveEffect("Connecting", this);
Unhook();
rope->BreakRope(true);
SetRope();
return true;
}
return false;
}
/* Events */
protected func Hit()
{
Sound("Hits::Materials::Metal::LightMetalHit?");
}
func Construction(object constructor)
{
tower = constructor;
}
func Initialize()
{
AddTimer("Rotation", 2);
}
func SetRope(bool no_connect)
{
rope = CreateObjectAbove(LiftTower_Rope,0,0,NO_OWNER);
if (!no_connect) rope->Connect(tower, this);
tower->SetRope(rope);
return rope;
}
public func Destruction()
{
if(rope)
rope->HookRemoved();
}
protected func Rotation()
{
if (!rope) return;
SetR(rope->GetHookAngle());
}
public func NoLiftTowerConnection() { return true; }
local Name = "$Name$";
local Description = "$Description$";
local Collectible = 1;