Skylands.ocs: Sky islands scenario WIP
fixed some typo in Crash.ocs
|
@ -11,7 +11,7 @@ MsgCrashedPlane=Und, habt ihr das Flugzeug schon gefunden?
|
|||
AnsCrashedPlane=Nein, wir suchen noch.
|
||||
|
||||
# NPC Merchant
|
||||
MsgSellPlans=Ich habe hier ein paar interessante Bauplaene! Fuer 150 Clunker wuerde ich sie dir ueberlasdsen.
|
||||
MsgSellPlans=Ich habe hier ein paar interessante Bauplaene! Fuer 150 Clunker wuerde ich sie dir ueberlasden.
|
||||
AnsNoMoney=Da muss ich noch etwas Gold abbauen. Ich komme spaeter wieder.
|
||||
AnsBuyPlans=Das ist ein guter Deal; hier sind deine Clunker.
|
||||
MsgGivePlans=Danke! Hier hast du Plaene fuer {{Pump}}, {{Pipe}}, {{Catapult}} und {{Cannon}}. Aber Vorsicht: Die Pumpe ist aus Holz und sollte nicht zum Pumpen von Lava verwendet werden!
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
[DefCore]
|
||||
id=LiftTower
|
||||
Version=5,2,0,1
|
||||
Category=C4D_Structure
|
||||
Timer=5
|
||||
TimerCall=SpinWheel
|
||||
Width=23
|
||||
Height=68
|
||||
Offset=-11,-10
|
||||
Vertices=4
|
||||
VertexX=-11,11,-11,11
|
||||
VertexY=-10,-10,58,58
|
||||
VertexFriction=50,50,100,100
|
||||
Value=200
|
||||
Mass=4500
|
||||
Components=Metal=2;Wood=4;
|
||||
Exclusive=1
|
||||
BlastIncinerate=100
|
||||
Construction=1
|
||||
ContainBlast=1
|
|
@ -0,0 +1,15 @@
|
|||
[DefCore]
|
||||
id=LiftTower_Hook
|
||||
Version=5,2,0,1
|
||||
Category=C4D_Object
|
||||
Timer=2
|
||||
TimerCall=Rotation
|
||||
Width=8
|
||||
Height=8
|
||||
Offset=-4,-4
|
||||
Vertices=3
|
||||
VertexX=0,2,-2
|
||||
VertexY=1,-1,-1
|
||||
VertexFriction=50,50,50
|
||||
Mass=4
|
||||
Rotate=1
|
After Width: | Height: | Size: 6.8 KiB |
After Width: | Height: | Size: 511 B |
|
@ -0,0 +1,135 @@
|
|||
/*-- 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")));
|
||||
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("MetalHit?");
|
||||
}
|
||||
|
||||
func Construction(object constructor)
|
||||
{
|
||||
tower = constructor;
|
||||
}
|
||||
|
||||
func SetRope(bool no_connect)
|
||||
{
|
||||
rope = CreateObject(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;
|
|
@ -0,0 +1,3 @@
|
|||
Name=Haken
|
||||
Description=Drücke [Benutzen] vor einem Fahrzeug oder einem anderen großen Gegenstand, um den Haken zu befestigen.
|
||||
Unhook=Haken abnehmen.
|
|
@ -0,0 +1,3 @@
|
|||
Name=Hook
|
||||
Description=Press [Use] in front of a vehicle or another big object to attach the hook.
|
||||
Unhook=Unhook object.
|
|
@ -0,0 +1,8 @@
|
|||
[DefCore]
|
||||
id=LiftTower_Rope
|
||||
Version=5,2,0,1
|
||||
Category=C4D_StaticBack
|
||||
Vertices=2
|
||||
Width=2
|
||||
Height=12
|
||||
Offset=-1,-6
|
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 767 B |
After Width: | Height: | Size: 4.0 KiB |
|
@ -0,0 +1,259 @@
|
|||
/*
|
||||
Lift Tower Rope
|
||||
Author: Randrian, Clonkonaut
|
||||
|
||||
The rope used for the lift tower.
|
||||
Connect(obj1, obj2) connects two objects
|
||||
BreakRope() breaks the rope
|
||||
*/
|
||||
|
||||
#include Library_Rope
|
||||
|
||||
static const Weight = 1;
|
||||
|
||||
// Call this to break the rope.
|
||||
public func BreakRope(bool silent)
|
||||
{
|
||||
if(length == -1) return;
|
||||
length = -1;
|
||||
var act1 = objects[0][0];
|
||||
var act2 = objects[1][0];
|
||||
SetAction("Idle");
|
||||
// notify action targets.
|
||||
if (act1 != nil && !silent)
|
||||
act1->~OnRopeBreak();
|
||||
if (act2 != nil && !silent)
|
||||
act2->~OnRopeBreak();
|
||||
RemoveRope();
|
||||
RemoveObject();
|
||||
return;
|
||||
}
|
||||
|
||||
/* --------------------- Callbacks form the rope ---------------------- */
|
||||
|
||||
/* To be overloaded for special segment behaviour */
|
||||
private func CreateSegment(int index, object previous)
|
||||
{
|
||||
if(index == 0) return;
|
||||
var segment;
|
||||
segment = CreateObject(LiftTower_Rope);
|
||||
return segment;
|
||||
}
|
||||
|
||||
/*-- Rope connecting --*/
|
||||
|
||||
// Connects two objects to the rope, but the length will vary on their positions.
|
||||
public func Connect(object obj1, object obj2)
|
||||
{
|
||||
StartRopeConnect(obj1, obj2);
|
||||
SetMaxLength(200);
|
||||
SetFixed(true, false);
|
||||
|
||||
SetAction("Hide");
|
||||
|
||||
AddEffect("IntHang", this, 1, 1, this);
|
||||
return;
|
||||
}
|
||||
|
||||
public func Reconnect(object reconnect)
|
||||
{
|
||||
objects[1][0] = reconnect;
|
||||
}
|
||||
|
||||
public func GetConnectStatus() { return !length_auto; }
|
||||
|
||||
public func HookRemoved()
|
||||
{
|
||||
BreakRope();
|
||||
}
|
||||
|
||||
func FxIntHangTimer() { TimeStep(); }
|
||||
|
||||
local last_point;
|
||||
|
||||
func UpdateLines()
|
||||
{
|
||||
var oldangle;
|
||||
for(var i=1; i < ParticleCount; i++)
|
||||
{
|
||||
// Update the Position of the Segment
|
||||
segments[i]->SetPosition(GetPartX(i), GetPartY(i));
|
||||
|
||||
// Calculate the angle to the previous segment
|
||||
var angle = Angle(particles[i][0][0], particles[i][0][1], particles[i-1][0][0], particles[i-1][0][1]);
|
||||
|
||||
// Draw the left line
|
||||
var start = particles[i-1][0][:];
|
||||
var end = particles[i][0][:];
|
||||
|
||||
if(i == 1 && ParticleCount > 2)
|
||||
{
|
||||
angle = Angle(particles[2][0][0], particles[2][0][1], particles[0][0][0], particles[0][0][1]);
|
||||
end = particles[0][0][:];
|
||||
end[0] += -Sin(angle, 45*Rope_Precision/10);
|
||||
end[1] += +Cos(angle, 45*Rope_Precision/10);
|
||||
segments[i]->SetGraphics("Invis");
|
||||
}
|
||||
|
||||
if(i == 2)
|
||||
{
|
||||
angle = Angle(particles[2][0][0], particles[2][0][1], particles[0][0][0], particles[0][0][1]);
|
||||
start = particles[0][0][:];
|
||||
start[0] += -Sin(angle, 45*Rope_Precision/10);
|
||||
start[1] += +Cos(angle, 45*Rope_Precision/10);
|
||||
segments[i]->SetGraphics("Short");
|
||||
}
|
||||
|
||||
var diff = Vec_Sub(end,start);
|
||||
var point = Vec_Add(start, Vec_Div(diff, 2));
|
||||
var diffangle = Vec_Angle(diff, [0,0]);
|
||||
var length = Vec_Length(diff)*1000/Rope_Precision/10;
|
||||
|
||||
if(i == ParticleCount-1)
|
||||
{
|
||||
var old = particles[i-2][0][:];
|
||||
var old_diff = Vec_Sub(start,old);
|
||||
var o_length = Vec_Length(old_diff)*1000/Rope_Precision/10;
|
||||
if(!o_length) diff = old_diff;
|
||||
else diff = Vec_Div(Vec_Mul(old_diff, length),o_length);
|
||||
diffangle = Vec_Angle(diff, [0,0]);
|
||||
point = Vec_Add(start, Vec_Div(diff, 2));
|
||||
last_point = point;
|
||||
}
|
||||
|
||||
segments[i]->SetGraphics(nil);
|
||||
SetLineTransform(segments[i], -diffangle, point[0]*10-GetPartX(i)*1000,point[1]*10-GetPartY(i)*1000, length );
|
||||
|
||||
// Remember the angle
|
||||
oldangle = angle;
|
||||
}
|
||||
}
|
||||
|
||||
func GetHookAngle()
|
||||
{
|
||||
if(ParticleCount > 3)
|
||||
return Angle(particles[-2][0][0], particles[-2][0][1], particles[-3][0][0], particles[-3][0][1])+180;
|
||||
}
|
||||
|
||||
func SetLineTransform(obj, int r, int xoff, int yoff, int length, int layer, int MirrorSegments) {
|
||||
if(!MirrorSegments) MirrorSegments = 1;
|
||||
var fsin=Sin(r, 1000), fcos=Cos(r, 1000);
|
||||
// set matrix values
|
||||
obj->SetObjDrawTransform (
|
||||
+fcos*MirrorSegments, +fsin*length/1000, xoff,
|
||||
-fsin*MirrorSegments, +fcos*length/1000, yoff,layer
|
||||
);
|
||||
}
|
||||
|
||||
/* Overload */
|
||||
|
||||
local pull_position, pull_faults, pull_frame;
|
||||
|
||||
// Altered to not just pull the objects into the rope's direction but
|
||||
// if the object doesn't not move it is tried to shake it free by applying
|
||||
// impulses to every direction
|
||||
func ForcesOnObjects()
|
||||
{
|
||||
if(!length) return;
|
||||
|
||||
var redo = LengthAutoTryCount();
|
||||
while(length_auto && redo)
|
||||
{
|
||||
var speed = Vec_Length(Vec_Sub(particles[-1][0], particles[-1][1]));
|
||||
if(length == GetMaxLength())
|
||||
{
|
||||
if(ObjContact(objects[1][0]))
|
||||
speed = 40;
|
||||
else speed = 100;
|
||||
}
|
||||
if(speed > 150) DoLength(1);
|
||||
else if(speed < 50) DoLength(-1);
|
||||
else redo = 0;
|
||||
if(redo) redo --;
|
||||
}
|
||||
var j = 0;
|
||||
if(PullObjects() )
|
||||
for(var i = 0; i < 2; i++)
|
||||
{
|
||||
if(i == 1) j = ParticleCount-1;
|
||||
var obj = objects[i][0];
|
||||
|
||||
if(obj == nil || objects[i][1] == 0) continue;
|
||||
|
||||
if(obj->Contained()) obj = obj->Contained();
|
||||
|
||||
if( (obj->GetAction() == "Walk" || obj->GetAction() == "Scale" || obj->GetAction() == "Hangle"))
|
||||
obj->SetAction("Jump");
|
||||
if( obj->GetAction() == "Climb")
|
||||
obj->SetAction("Jump");
|
||||
|
||||
var xdir = BoundBy(particles[j][0][0]-particles[j][1][0], -100, 100);
|
||||
var ydir = particles[j][0][1]-particles[j][1][1];
|
||||
|
||||
if (!obj->GetContact(-1))
|
||||
ydir = BoundBy(ydir, -50, 50);
|
||||
|
||||
if (pull_position && pull_frame != FrameCounter() && !Distance(pull_position[0], pull_position[1], obj->GetX(), obj->GetY()))
|
||||
{
|
||||
if (!pull_faults)
|
||||
{
|
||||
ydir *= -1;
|
||||
pull_faults++;
|
||||
}
|
||||
else
|
||||
{
|
||||
xdir *= -1;
|
||||
pull_faults = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pull_position = [obj->GetX(), obj->GetY()];
|
||||
pull_faults = 0;
|
||||
}
|
||||
pull_frame = FrameCounter();
|
||||
|
||||
obj->SetXDir( xdir, Rope_Precision);
|
||||
obj->SetYDir( obj->GetYDir() + ydir, Rope_Precision);
|
||||
//Log("%v, %v", xdir, ydir);
|
||||
}
|
||||
}
|
||||
|
||||
// Altered to function in 'ConnectPull' mode
|
||||
public func ConstraintObjects()
|
||||
{
|
||||
if(length < GetMaxLength()) // in the rope library this is
|
||||
{ // if(length_auto && length < GetMaxLength())
|
||||
for(var i = 0, i2 = 0; i < 2; i++ || i2--)
|
||||
SetParticleToObject(i2, i);
|
||||
}
|
||||
}
|
||||
|
||||
// This is called constantly by the lift tower as long as something is reeled in
|
||||
// Altered so the rope will not get shorter than the distance between the tower
|
||||
// and the hooked up object
|
||||
public func DoLength(int dolength)
|
||||
{
|
||||
var obj = objects[0][0]; // First connected object
|
||||
var obj2 = objects[1][0]; // Second connected object
|
||||
// I guess this is not possible but just to be sure
|
||||
if (!obj || !obj2) return _inherited(dolength);
|
||||
if (obj->Contained()) obj = obj->Contained();
|
||||
if (obj2->Contained()) obj2 = obj2->Contained();
|
||||
|
||||
// Line would be shorter than the distance? Do nothing
|
||||
if (dolength < 0 && ObjectDistance(obj, obj2) > GetLineLength()/100) return;
|
||||
return _inherited(dolength);
|
||||
}
|
||||
|
||||
func Definition(def)
|
||||
{
|
||||
def.LineColors = [RGB(66,33,00), RGB(66,33,00)];
|
||||
}
|
||||
local ActMap = {
|
||||
Hide = {
|
||||
Prototype = Action,
|
||||
Name = "Hide",
|
||||
},
|
||||
};
|
||||
local Name = "$Name$";
|
|
@ -0,0 +1 @@
|
|||
Name=Seil
|
|
@ -0,0 +1 @@
|
|||
Name=Rope
|
|
@ -0,0 +1,14 @@
|
|||
material Material
|
||||
{
|
||||
receive_shadows on
|
||||
technique
|
||||
{
|
||||
pass
|
||||
{
|
||||
ambient 0.500000 0.500000 0.500000 1.000000
|
||||
diffuse 0.584337 0.584337 0.584337 1.000000
|
||||
specular 0.500000 0.500000 0.500000 1.000000 12.500000
|
||||
emissive 0.000000 0.000000 0.000000 1.000000
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,163 @@
|
|||
/*--
|
||||
LiftTower
|
||||
Authors: Clonkonaut
|
||||
--*/
|
||||
|
||||
local hook, rope;
|
||||
local hook_pos, anim_no, stopped, direction;
|
||||
|
||||
static const LIFTTOWER_HOOK_LOOSEDIST = 50;
|
||||
|
||||
public func Construction()
|
||||
{
|
||||
SetProperty("MeshTransformation",Trans_Rotate(RandomX(-20,20),0,1,0));
|
||||
return _inherited(...);
|
||||
}
|
||||
|
||||
protected func Initialize()
|
||||
{
|
||||
OnRopeBreak();
|
||||
hook_pos = CreateArray();
|
||||
anim_no = PlayAnimation("Turn", 10, Anim_Const(0), Anim_Const(1000));
|
||||
stopped = true;
|
||||
}
|
||||
|
||||
/* Rope */
|
||||
|
||||
func OnRopeBreak()
|
||||
{
|
||||
if (!hook)
|
||||
hook = CreateObject(LiftTower_Hook, 0,0, NO_OWNER);
|
||||
hook->Enter(this);
|
||||
}
|
||||
|
||||
/* Interaction */
|
||||
|
||||
func IsInteractable(object clonk)
|
||||
{
|
||||
return GetCon() >= 100;
|
||||
}
|
||||
|
||||
func GetInteractionMetaInfo()
|
||||
{
|
||||
if (!hook) OnRopeBreak();
|
||||
|
||||
if (hook->Contained() == this)
|
||||
return { IconID = LiftTower_Hook, Description = "$TakeHook$" };
|
||||
}
|
||||
|
||||
func Interact(object clonk)
|
||||
{
|
||||
if (!hook) OnRopeBreak();
|
||||
|
||||
if (clonk->GetAction() == "Walk")
|
||||
{
|
||||
if (hook->Contained() == this)
|
||||
if (clonk->Collect(hook,true))
|
||||
hook->SetRope();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
func SetRope(object rope_to_set)
|
||||
{
|
||||
rope = rope_to_set;
|
||||
}
|
||||
|
||||
/* Control */
|
||||
|
||||
public func ControlUp(object clonk)
|
||||
{
|
||||
return DrawIn();
|
||||
}
|
||||
public func ControlStop(object clonk)
|
||||
{
|
||||
return RemoveEffect("DrawIn", this);
|
||||
}
|
||||
|
||||
public func DrawIn()
|
||||
{
|
||||
if (!rope) return false;
|
||||
if (!hook) OnRopeBreak();
|
||||
if (hook->Contained() == this) return false;
|
||||
if (ObjectDistance(hook) < LIFTTOWER_HOOK_LOOSEDIST) return false;
|
||||
if (GetEffect("DrawIn", this)) return false;
|
||||
rope->ConnectPull();
|
||||
return AddEffect("DrawIn", this, 1, 1, this);
|
||||
}
|
||||
|
||||
private func FxDrawInTimer(effect)
|
||||
{
|
||||
if (!rope) return -1;
|
||||
if (!hook)
|
||||
{
|
||||
OnRopeBreak();
|
||||
return -1;
|
||||
}
|
||||
rope->DoLength(-1);
|
||||
if (ObjectDistance(hook) < LIFTTOWER_HOOK_LOOSEDIST) return -1;
|
||||
}
|
||||
|
||||
private func FxDrawInStop(object target, effect, int temp)
|
||||
{
|
||||
if (temp) return;
|
||||
if (!rope) return;
|
||||
rope->ConnectLoose();
|
||||
}
|
||||
|
||||
/* Animation */
|
||||
|
||||
protected func SpinWheel()
|
||||
{
|
||||
if (!hook) return StopWheel();
|
||||
if (hook->Contained() == this) return StopWheel();
|
||||
if (hook->GetX() == hook_pos[0])
|
||||
if (hook->GetY() == hook_pos[1])
|
||||
return StopWheel();
|
||||
|
||||
stopped = false;
|
||||
var new_direction = false;
|
||||
if (!direction)
|
||||
{
|
||||
direction = 100;
|
||||
new_direction = true;
|
||||
}
|
||||
if (Distance(GetX(),GetY(), hook->GetX(), hook->GetY()) < Distance(GetX(),GetY(), hook_pos[0], hook_pos[1]))
|
||||
{
|
||||
if (direction > 0)
|
||||
{
|
||||
direction = -100;
|
||||
new_direction = true;
|
||||
}
|
||||
}
|
||||
else if (direction < 0)
|
||||
{
|
||||
direction = 100;
|
||||
new_direction = true;
|
||||
}
|
||||
hook_pos = [hook->GetX(), hook->GetY()];
|
||||
if (!new_direction) return;
|
||||
|
||||
if (direction < 0)
|
||||
anim_no = PlayAnimation("Turn", 10, Anim_Linear(GetAnimationPosition(anim_no), GetAnimationLength("Turn"), 0, 40, ANIM_Loop), Anim_Const(1000));
|
||||
else
|
||||
anim_no = PlayAnimation("Turn", 10, Anim_Linear(GetAnimationPosition(anim_no), 0, GetAnimationLength("Turn"), 40, ANIM_Loop), Anim_Const(1000));
|
||||
}
|
||||
|
||||
private func StopWheel()
|
||||
{
|
||||
if (stopped) return;
|
||||
var position = GetAnimationPosition(anim_no);
|
||||
stopped = true;
|
||||
direction = 0;
|
||||
anim_no = PlayAnimation("Turn", 10, Anim_Const(position), Anim_Const(1000));
|
||||
}
|
||||
|
||||
func Definition(def) {
|
||||
SetProperty("PictureTransformation", Trans_Mul(Trans_Translate(2000,0,7000),Trans_Rotate(-20,1,0,0),Trans_Rotate(30,0,1,0)), def);
|
||||
}
|
||||
|
||||
local Name = "$Name$";
|
||||
local Description = "$Description$";
|
||||
local Touchable = 1;
|
|
@ -0,0 +1,3 @@
|
|||
Name=Hebeturm
|
||||
Description=Um schwere Lasten zu heben.
|
||||
TakeHook=Haken nehmen.
|
|
@ -0,0 +1,3 @@
|
|||
Name=Lift Tower
|
||||
Description=For pulling heavy loads.
|
||||
TakeHook=Take the hook.
|
After Width: | Height: | Size: 20 KiB |
|
@ -0,0 +1,16 @@
|
|||
[DefCore]
|
||||
id=Plane_Chassis
|
||||
Version=5,2,0,1
|
||||
Category=C4D_Vehicle
|
||||
Width=60
|
||||
Height=25
|
||||
Offset=-30,-12
|
||||
Vertices=6
|
||||
VertexX=-25,-25,0,0,27,25
|
||||
VertexY=7,-7,7,-7,-8,1
|
||||
VertexFriction=30,60,30,60,60,30
|
||||
Value=40
|
||||
Mass=100
|
||||
Components=Wood=3;Metal=2;
|
||||
Rotate=1
|
||||
Float=1
|
After Width: | Height: | Size: 71 KiB |
|
@ -0,0 +1,20 @@
|
|||
/*--
|
||||
Plane part: Chassis
|
||||
Author: Sven2
|
||||
|
||||
Used to construct the plane
|
||||
--*/
|
||||
|
||||
private func Hit()
|
||||
{
|
||||
Sound("WoodHit");
|
||||
}
|
||||
|
||||
public func Definition(proplist def)
|
||||
{
|
||||
}
|
||||
|
||||
local Collectible = false;
|
||||
local Name = "$Name$";
|
||||
local Description = "$Description$";
|
||||
local Rebuy = true;
|
|
@ -0,0 +1,2 @@
|
|||
Name=Rumpf
|
||||
Description=Ein wichtiges Teil des Flugzeuges.
|
|
@ -0,0 +1,2 @@
|
|||
Name=Chassis
|
||||
Description=An important part of the plane.
|
|
@ -0,0 +1,18 @@
|
|||
[DefCore]
|
||||
id=Plane_Construction
|
||||
Version=5,2,0,1
|
||||
Category=C4D_Structure
|
||||
Width=60
|
||||
Height=29
|
||||
Offset=-30,-14
|
||||
Vertices=2
|
||||
VertexX=-18,18
|
||||
VertexY=14,14
|
||||
VertexFriction=100,100
|
||||
Value=200
|
||||
Mass=4000
|
||||
Components=Plane_Propeller=1;Plane_Chassis=1;Plane_Skids=1;Plane_Engine=1;Plane_Wings=1;
|
||||
Construction=0
|
||||
Rotate=0
|
||||
TimerCall=Timer
|
||||
Timer=10
|
|
@ -0,0 +1,16 @@
|
|||
[DefCore]
|
||||
id=Plane_Engine
|
||||
Version=5,2,0,1
|
||||
Category=C4D_Object
|
||||
Width=13
|
||||
Height=8
|
||||
Offset=-6,-4
|
||||
Vertices=4
|
||||
VertexX=-3,-3,5,5
|
||||
VertexY=-3,3,-3,3
|
||||
VertexFriction=60,60,60,60
|
||||
Value=12
|
||||
Mass=20
|
||||
Components=Metal=10;
|
||||
Rotate=1
|
||||
Float=1
|
After Width: | Height: | Size: 13 KiB |
|
@ -0,0 +1,22 @@
|
|||
/*--
|
||||
Plane part: Engine
|
||||
Author: Sven2
|
||||
|
||||
Used to construct the plane
|
||||
--*/
|
||||
|
||||
private func Hit()
|
||||
{
|
||||
Sound("WoodHit");
|
||||
}
|
||||
|
||||
func IsToolProduct() { return true; }
|
||||
|
||||
public func Definition(proplist def)
|
||||
{
|
||||
}
|
||||
|
||||
local Collectible = true;
|
||||
local Name = "$Name$";
|
||||
local Description = "$Description$";
|
||||
local Rebuy = true;
|
|
@ -0,0 +1,2 @@
|
|||
Name=Motor
|
||||
Description=Ein wichtiges Teil des Flugzeuges.
|
|
@ -0,0 +1,2 @@
|
|||
Name=Engine
|
||||
Description=An important part of the plane.
|
After Width: | Height: | Size: 137 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 111 KiB |
After Width: | Height: | Size: 131 KiB |
After Width: | Height: | Size: 132 KiB |
After Width: | Height: | Size: 42 KiB |
|
@ -0,0 +1,16 @@
|
|||
[DefCore]
|
||||
id=Plane_Propeller
|
||||
Version=5,2,0,1
|
||||
Category=C4D_Object
|
||||
Width=9
|
||||
Height=10
|
||||
Offset=-5,-5
|
||||
Vertices=3
|
||||
VertexX=-4,3,3
|
||||
VertexY=0,-4,4
|
||||
VertexFriction=60,60,60
|
||||
Value=12
|
||||
Mass=20
|
||||
Components=Wood=1;Metal=1;
|
||||
Rotate=1
|
||||
Float=1
|
After Width: | Height: | Size: 17 KiB |
|
@ -0,0 +1,20 @@
|
|||
/*--
|
||||
Plane part: Propeller
|
||||
Author: Sven2
|
||||
|
||||
Used to construct the plane
|
||||
--*/
|
||||
|
||||
private func Hit()
|
||||
{
|
||||
Sound("WoodHit");
|
||||
}
|
||||
|
||||
public func Definition(proplist def)
|
||||
{
|
||||
}
|
||||
|
||||
local Collectible = true;
|
||||
local Name = "$Name$";
|
||||
local Description = "$Description$";
|
||||
local Rebuy = true;
|
|
@ -0,0 +1,2 @@
|
|||
Name=Propeller
|
||||
Description=Ein wichtiges Teil des Flugzeuges.
|
|
@ -0,0 +1,2 @@
|
|||
Name=Propeller
|
||||
Description=An important part of the plane.
|
|
@ -0,0 +1,62 @@
|
|||
/*--
|
||||
Plane construction site
|
||||
Author: Sven2
|
||||
|
||||
Successive buildup of the plane
|
||||
--*/
|
||||
|
||||
local progress, next_part;
|
||||
|
||||
public func Initialize()
|
||||
{
|
||||
SetProgress(0);
|
||||
}
|
||||
|
||||
func SetProgress(int new_progress)
|
||||
{
|
||||
var parts = [Plane_Skids, Plane_Chassis, Plane_Wings, Plane_Engine, Plane_Propeller, nil];
|
||||
progress = new_progress;
|
||||
if (!progress)
|
||||
{
|
||||
SetGraphics("Site");
|
||||
SetGraphics(nil, nil, GFX_Overlay, GFXOV_MODE_Base);
|
||||
}
|
||||
else if (progress < 5)
|
||||
{
|
||||
SetGraphics(Format("%d", new_progress));
|
||||
SetGraphics("Site", GetID(), GFX_Overlay, GFXOV_MODE_Base);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetGraphics();
|
||||
SetGraphics(nil, nil, GFX_Overlay, GFXOV_MODE_Base);
|
||||
}
|
||||
next_part = parts[progress];
|
||||
return true;
|
||||
}
|
||||
|
||||
func Timer()
|
||||
{
|
||||
if (next_part)
|
||||
for (var part in FindObjects(Find_ID(next_part), Find_InRect(-30,-15,60,30), Find_Layer(GetObjectLayer())))
|
||||
if (part->GetCon() >= 100)
|
||||
{
|
||||
AddPart(part);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
func AddPart(object part)
|
||||
{
|
||||
part->RemoveObject();
|
||||
Sound("Applause", true);
|
||||
SetProgress(progress+1);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
func Definition(def) {
|
||||
|
||||
}
|
||||
|
||||
local Name = "$Name$";
|
|
@ -0,0 +1,16 @@
|
|||
[DefCore]
|
||||
id=Plane_Skids
|
||||
Version=5,2,0,1
|
||||
Category=C4D_Vehicle
|
||||
Width=38
|
||||
Height=8
|
||||
Offset=-19,-4
|
||||
Vertices=5
|
||||
VertexX=-18,-12,8,18,0
|
||||
VertexY=3,-3,-3,3,3
|
||||
VertexFriction=30,60,60,30,30
|
||||
Value=20
|
||||
Mass=20
|
||||
Components=Metal=2;
|
||||
Rotate=1
|
||||
Float=0
|
After Width: | Height: | Size: 5.9 KiB |
|
@ -0,0 +1,20 @@
|
|||
/*--
|
||||
Plane part: Skids
|
||||
Author: Sven2
|
||||
|
||||
Used to construct the plane
|
||||
--*/
|
||||
|
||||
private func Hit()
|
||||
{
|
||||
Sound("WoodHit");
|
||||
}
|
||||
|
||||
public func Definition(proplist def)
|
||||
{
|
||||
}
|
||||
|
||||
local Collectible = false;
|
||||
local Name = "$Name$";
|
||||
local Description = "$Description$";
|
||||
local Rebuy = true;
|
|
@ -0,0 +1,2 @@
|
|||
Name=Kufen
|
||||
Description=Ein wichtiges Teil des Flugzeuges.
|
|
@ -0,0 +1,2 @@
|
|||
Name=Skids
|
||||
Description=An important part of the plane.
|
|
@ -0,0 +1 @@
|
|||
Name=Flugzeugbaustelle
|
|
@ -0,0 +1 @@
|
|||
Name=Plane construction site
|
|
@ -0,0 +1,16 @@
|
|||
[DefCore]
|
||||
id=Plane_Wings
|
||||
Version=5,2,0,1
|
||||
Category=C4D_Vehicle
|
||||
Width=10
|
||||
Height=35
|
||||
Offset=-5,-17
|
||||
Vertices=4
|
||||
VertexX=-4,-4,4,4
|
||||
VertexY=-16,16,-16,16
|
||||
VertexFriction=60,60,60,60
|
||||
Value=30
|
||||
Mass=50
|
||||
Components=Wood=2;Metal=1;
|
||||
Rotate=1
|
||||
Float=0
|
After Width: | Height: | Size: 23 KiB |
|
@ -0,0 +1,20 @@
|
|||
/*--
|
||||
Plane part: Wings
|
||||
Author: Sven2
|
||||
|
||||
Used to construct the plane
|
||||
--*/
|
||||
|
||||
private func Hit()
|
||||
{
|
||||
Sound("WoodHit");
|
||||
}
|
||||
|
||||
public func Definition(proplist def)
|
||||
{
|
||||
}
|
||||
|
||||
local Collectible = false;
|
||||
local Name = "$Name$";
|
||||
local Description = "$Description$";
|
||||
local Rebuy = true;
|
|
@ -0,0 +1,2 @@
|
|||
Name=Fluegel
|
||||
Description=Ein wichtiges Teil des Flugzeuges.
|
|
@ -0,0 +1,2 @@
|
|||
Name=Wings
|
||||
Description=An important part of the plane.
|
|
@ -0,0 +1,50 @@
|
|||
[Head]
|
||||
Icon=25
|
||||
Title=Skylands
|
||||
Version=5,2,90,20
|
||||
Difficulty=20
|
||||
MaxPlayer=30
|
||||
NoInitialize=true
|
||||
|
||||
[Game]
|
||||
Rules=Rule_EnergyNeed=1;Rule_TeamAccount=1;Rule_BuyAtFlagpole=1
|
||||
|
||||
[Player1]
|
||||
Wealth=10,0,0,250
|
||||
Crew=Clonk=2
|
||||
Knowledge=Plane_Engine=1;Foundry=1;ToolsWorkshop=1;WindGenerator=1;Flagpole=1;Sawmill=1;Elevator=1;Lorry=1;Pickaxe=1;Axe=1;Hammer=1;Shovel=1;Firestone=1;Barrel=1;Dynamite=1;DynamiteBox=1;LiftTower=1;Pump=1
|
||||
HomeBaseMaterial=Loam=10;Wood=5;Metal=3;Shovel=2;Axe=2;Hammer=2;Clonk=5
|
||||
HomeBaseProduction=Loam=10;Wood=5;Metal=3;Shovel=2;Axe=2;Hammer=2;Clonk=5
|
||||
|
||||
[Player2]
|
||||
Wealth=10,0,0,250
|
||||
Crew=Clonk=2
|
||||
Knowledge=Plane_Engine=1;Foundry=1;ToolsWorkshop=1;WindGenerator=1;Flagpole=1;Sawmill=1;Elevator=1;Lorry=1;Pickaxe=1;Axe=1;Hammer=1;Shovel=1;Firestone=1;Barrel=1;Dynamite=1;DynamiteBox=1;LiftTower=1;Pump=1
|
||||
HomeBaseMaterial=Loam=10;Wood=5;Metal=3;Shovel=2;Axe=2;Hammer=2;Clonk=5
|
||||
HomeBaseProduction=Loam=10;Wood=5;Metal=3;Shovel=2;Axe=2;Hammer=2;Clonk=5
|
||||
|
||||
[Player3]
|
||||
Wealth=10,0,0,250
|
||||
Crew=Clonk=2
|
||||
Knowledge=Plane_Engine=1;Foundry=1;ToolsWorkshop=1;WindGenerator=1;Flagpole=1;Sawmill=1;Elevator=1;Lorry=1;Pickaxe=1;Axe=1;Hammer=1;Shovel=1;Firestone=1;Barrel=1;Dynamite=1;DynamiteBox=1;LiftTower=1;Pump=1
|
||||
HomeBaseMaterial=Loam=10;Wood=5;Metal=3;Shovel=2;Axe=2;Hammer=2;Clonk=5
|
||||
HomeBaseProduction=Loam=10;Wood=5;Metal=3;Shovel=2;Axe=2;Hammer=2;Clonk=5
|
||||
|
||||
[Player4]
|
||||
Wealth=10,0,0,250
|
||||
Crew=Clonk=2
|
||||
Knowledge=Plane_Engine=1;Foundry=1;ToolsWorkshop=1;WindGenerator=1;Flagpole=1;Sawmill=1;Elevator=1;Lorry=1;Pickaxe=1;Axe=1;Hammer=1;Shovel=1;Firestone=1;Barrel=1;Dynamite=1;DynamiteBox=1;LiftTower=1;Pump=1
|
||||
HomeBaseMaterial=Loam=10;Wood=5;Metal=3;Shovel=2;Axe=2;Hammer=2;Clonk=5
|
||||
HomeBaseProduction=Loam=10;Wood=5;Metal=3;Shovel=2;Axe=2;Hammer=2;Clonk=5
|
||||
|
||||
[Landscape]
|
||||
Sky=Clouds2
|
||||
BottomOpen=true
|
||||
MapWidth=100,0,64,10000
|
||||
MapHeight=200,0,40,10000
|
||||
NewStyleLandscape=2
|
||||
|
||||
[Weather]
|
||||
Climate=0,10,0,100
|
||||
YearSpeed=0,0,0,100
|
||||
Wind=0,100,-100,100
|
|
@ -0,0 +1,60 @@
|
|||
/**
|
||||
Skylands
|
||||
Assemble a plane on some floating islands
|
||||
|
||||
@authors Sven2
|
||||
*/
|
||||
|
||||
|
||||
static g_is_initialized;
|
||||
static g_intro_initialized;
|
||||
|
||||
func DoInit(int first_player)
|
||||
{
|
||||
// Set time of day to evening and create some clouds and celestials.
|
||||
EnsureObject(Environment_Clouds,0,0,-1);
|
||||
EnsureObject(Environment_Celestial,0,0,-1);
|
||||
EnsureObject(Rule_BuyAtFlagpole,0,0,-1);
|
||||
var time = EnsureObject(Environment_Time,0,0,-1);
|
||||
time->SetTime(600);
|
||||
time->SetCycleSpeed(12);
|
||||
// Goal
|
||||
//CreateObject(Goal_Plane);
|
||||
return true;
|
||||
}
|
||||
|
||||
func EnsureObject(id def, int x, int y, int owner)
|
||||
{
|
||||
var obj = FindObject(Find_ID(def));
|
||||
if (!obj) obj = CreateObject(def,x,y,owner);
|
||||
return obj;
|
||||
}
|
||||
|
||||
func InitializePlayer(int plr)
|
||||
{
|
||||
// Scenario init
|
||||
if (!g_is_initialized) g_is_initialized = DoInit(plr);
|
||||
// Move clonks to location and give them a shovel.
|
||||
var index = 0, crew;
|
||||
while (crew = GetCrew(plr, index))
|
||||
{
|
||||
var x = 150 + Random(50);
|
||||
crew->SetPosition(x , 400);
|
||||
crew->CreateContents(Shovel);
|
||||
// one clonk can construct, another can mine.
|
||||
if (index == 1)
|
||||
{
|
||||
crew->CreateContents(Hammer);
|
||||
crew->CreateContents(Wood,4);
|
||||
crew->CreateContents(Metal);
|
||||
}
|
||||
else
|
||||
{
|
||||
crew->CreateContents(Axe);
|
||||
crew->CreateContents(GrappleBow);
|
||||
}
|
||||
index++;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
[Teams]
|
||||
Active=false
|
||||
Custom=false
|
||||
AllowHostilityChange=true
|
||||
AutoGenerateTeams=true
|
|
@ -0,0 +1,2 @@
|
|||
DE:Himmelsinseln
|
||||
US:Skylands
|