forked from Mirrors/openclonk
176 lines
3.4 KiB
C
176 lines
3.4 KiB
C
/*-- Elevator --*/
|
|
|
|
#include Library_Structure
|
|
#include Library_Ownable
|
|
|
|
// used in the elevator case
|
|
static const Elevator_needed_power = 50;
|
|
|
|
local case, rope;
|
|
local partner, slave;
|
|
|
|
// Frees a rectangle for the case
|
|
func CreateShaft(int length)
|
|
{
|
|
// Move the case out of the way
|
|
case->SetPosition(case->GetX(), GetY()-10);
|
|
ClearFreeRect(GetX() + 7, GetY() + 20, 24, length + 13);
|
|
// Move the case back
|
|
case->SetPosition(case->GetX(), GetY()+20);
|
|
}
|
|
|
|
/* Initialization */
|
|
|
|
func Construction(object creator)
|
|
{
|
|
SetProperty("MeshTransformation", Trans_Rotate(-44,0,1,0));
|
|
SetAction("Default");
|
|
return _inherited(creator, ...);
|
|
}
|
|
|
|
func Initialize()
|
|
{
|
|
SetCategory(C4D_StaticBack);
|
|
CreateCase();
|
|
CreateRope();
|
|
|
|
if (partner)
|
|
{
|
|
if (Inside(partner->GetY(), GetY()-3, GetY()+3))
|
|
{
|
|
partner->LetsBecomeFriends(this);
|
|
slave = true; // Note: This is liberal slavery
|
|
SetPosition(GetX(), partner->GetY());
|
|
}
|
|
else
|
|
partner = nil;
|
|
}
|
|
return _inherited();
|
|
}
|
|
|
|
func CreateCase()
|
|
{
|
|
case = CreateObject(ElevatorCase, -19 * GetCalcDir(), 33, GetOwner());
|
|
case->Connect(this);
|
|
}
|
|
|
|
func CreateRope()
|
|
{
|
|
rope = CreateObject(ElevatorRope, -19 * GetCalcDir(), -11, GetOwner());
|
|
rope->SetAction("Be", case.back);
|
|
}
|
|
|
|
/* Destruction */
|
|
|
|
func Destruction()
|
|
{
|
|
if(rope) rope->RemoveObject();
|
|
if(case) case->LostElevator();
|
|
if (partner) partner->LoseCombination();
|
|
}
|
|
|
|
func LostCase()
|
|
{
|
|
if(partner) partner->LoseCombination();
|
|
if(rope) rope->RemoveObject();
|
|
|
|
DoCon(-1);
|
|
}
|
|
|
|
/* Effects */
|
|
|
|
func StartEngine()
|
|
{
|
|
Sound("ElevatorStart");
|
|
ScheduleCall(this, "EngineLoop", 34);
|
|
Sound("ElevatorMoving", nil, nil, nil, 1);
|
|
}
|
|
func EngineLoop()
|
|
{
|
|
Sound("ElevatorMoving", nil, nil, nil, 1);
|
|
}
|
|
func StopEngine()
|
|
{
|
|
Sound("ElevatorMoving", nil, nil, nil, -1);
|
|
ClearScheduleCall(this, "EngineLoop");
|
|
Sound("ElevatorStop");
|
|
}
|
|
|
|
/* Construction */
|
|
|
|
// Sticking to other elevators
|
|
func ConstructionCombineWith() { return "IsElevator"; }
|
|
|
|
// Called to determine if sticking is possible
|
|
func IsElevator(object previewer)
|
|
{
|
|
if (!previewer) return true;
|
|
|
|
if (GetDir() == DIR_Left)
|
|
{
|
|
if (previewer.direction == DIR_Right && previewer->GetX() > GetX()) return true;
|
|
}
|
|
else
|
|
{
|
|
if (previewer.direction == DIR_Left && previewer->GetX() < GetX()) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// Called when the elevator construction site is created
|
|
func CombineWith(object other)
|
|
{
|
|
// Save for use in Initialize
|
|
partner = other;
|
|
}
|
|
|
|
/* Combination */
|
|
|
|
// Called by a new elevator next to this one
|
|
// The other elevator will be the slave
|
|
func LetsBecomeFriends(object other)
|
|
{
|
|
partner = other;
|
|
if (case) case->StartConnection(other.case);
|
|
}
|
|
|
|
// Partner was destroyed or moved
|
|
func LoseCombination()
|
|
{
|
|
partner = nil;
|
|
slave = false;
|
|
if (case) case->LoseConnection();
|
|
}
|
|
|
|
// Called by our case because the case has a timer anyway
|
|
func CheckSlavery()
|
|
{
|
|
// Check if somehow we moved away from our fellow
|
|
if (ObjectDistance(partner) > 62 || !Inside(partner->GetY(), GetY()-1, GetY()+1))
|
|
{
|
|
LoseCombination();
|
|
partner->LoseCombination();
|
|
}
|
|
}
|
|
|
|
local ActMap = {
|
|
Default = {
|
|
Prototype = Action,
|
|
Name = "Default",
|
|
Procedure = DFA_NONE,
|
|
Directions = 2,
|
|
FlipDir = 1,
|
|
Length = 1,
|
|
Delay = 0,
|
|
FacetBase = 1,
|
|
NextAction = "Default",
|
|
},
|
|
};
|
|
|
|
func Definition(def) {
|
|
SetProperty("PictureTransformation", Trans_Mul(Trans_Rotate(-20,1,0), Trans_Rotate(-20, 0, 1, 0)));
|
|
}
|
|
local Name = "$Name$";
|
|
local Description = "$Description$";
|
|
local BlastIncinerate = 100;
|
|
local HitPoints = 70; |