add vine as new vegetation object

still missing: proper graphics, leave particles which fall off
liquid_container
Maikel de Vries 2016-04-11 21:10:04 +02:00
parent 9bb2de333a
commit 66c71b4ab8
10 changed files with 247 additions and 1 deletions

View File

@ -0,0 +1,11 @@
[DefCore]
id=Vine
Version=6,0
Category=C4D_StaticBack
Width=10
Height=56
Offset=-5,-28
Vertices=3
VertexX=0,0,0
VertexY=-27,0,27
Mass=4

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

View File

@ -0,0 +1,146 @@
/**
Vine
A single vine which can hang down from ceilings.
@author Maikel, Randrian
*/
local segments;
protected func Initialize()
{
// Create vine segments to climb on.
CreateSegments();
return;
}
protected func Damage()
{
return;
}
/*-- Ladder Control --*/
// Creates the segments which control the climbing.
private func CreateSegments()
{
segments = [];
var nr_segments = (GetBottom() - GetTop()) / 8;
for (var index = 0; index < nr_segments; index++)
{
var y = GetTop() + index * 8;
var segment = CreateObject(VineSegment, 0, y + 4);
segment->SetMaster(this, index);
// Store the segments.
PushBack(segments, segment);
// Set next and previous segment for climbing control.
if (index > 0)
{
segments[index - 1]->SetPreviousLadder(segment);
segment->SetNextLadder(segments[index - 1]);
}
}
return;
}
// Callback by the ladder climb library when the vine is grabbed.
public func OnLadderGrab(object clonk, object segment, int segment_index)
{
segment->Sound("Environment::Vine::Grab?");
return;
}
// Callback by the ladder climb library when the vine is climbed.
public func OnLadderClimb(object clonk, object segment, int segment_index)
{
if (clonk->GetComDir() == COMD_Up || clonk->GetComDir() == COMD_Down)
if (!Random(20))
segment->Sound("Environment::Vine::Grab?", {volume = 35});
return;
}
// Callback by the ladder climb library when the vine is released.
public func OnLadderReleased(object clonk, object segment, int segment_index)
{
segment->Sound("Environment::Vine::Grab?", {volume = 50});
return;
}
/*-- Placement --*/
// Place an amount of branches in the specified area. Settings:
// min_dist: the minimal distance between vines (default 32 pixels).
public func Place(int amount, proplist area, proplist settings)
{
// Only allow definition call.
if (this != Vine)
return;
// Default parameters.
if (!settings)
settings = {};
if (!settings.min_dist)
settings.min_dist = 32;
var loc_area = nil;
if (area)
loc_area = Loc_InArea(area);
var vines = [];
var max_tries = Max(200, amount * 20);
var nr_created = 0;
for (var i = 0; i < max_tries && nr_created < amount; i++)
{
var loc = FindLocation(Loc_Sky(), Loc_Not(Loc_Liquid()), Loc_Wall(CNAT_Top, Loc_Or(Loc_Material("Granite"), Loc_Material("Rock"), Loc_MaterialVal("Soil", "Material", nil, 1))), loc_area);
if (!loc)
continue;
var vine = CreateObject(Vine);
vine->SetPosition(loc.x, loc.y);
if (!Random(3))
vine.Plane = 510;
// Adjust position with respect to landscape.
vine->AdjustPosition();
// Retry if the center is at a solid location or if another vine is too close.
if (vine->GBackSolid() || vine->FindObject(Find_ID(Vine), Find_Distance(settings.min_dist + Random(8)), Find_Exclude(vine)))
{
vine->RemoveObject();
continue;
}
PushBack(vines, vine);
nr_created++;
}
return vines;
}
// Adjust position with respect to material.
public func AdjustPosition()
{
// Find distance to material.
var d = 0;
while (!GBackSolid(0, d) && d < 36 * GetCon() / 100)
d++;
// Adjust position.
var size = 12 * GetCon() / 100;
SetPosition(GetX(), GetY() + d - size);
return;
}
/*-- Saving --*/
// Save placed ladder segments in scenarios.
public func SaveScenarioObject(props)
{
if (!inherited(props, ...))
return false;
props->AddCall("CreateSegments", this, "CreateSegments");
return true;
}
/*-- Properties --*/
local Name = "$Name$";
local BlastIncinerate = 1;
local ContactIncinerate = 3;
local Placement = 4;

View File

@ -0,0 +1 @@
Name=Kletterpflanze

View File

@ -0,0 +1 @@
Name=Vine

View File

@ -0,0 +1,7 @@
[DefCore]
id=VineSegment
Version=6,0
Category=C4D_StaticBack
Width=5
Height=8
Offset=-3,-4

View File

@ -0,0 +1,80 @@
/**
Vine Segment
@author Maikel
*/
#include Library_Ladder
local index;
// Called from the ladder object to set a master and the segment index.
public func SetMaster(object new_master, int new_index)
{
// First perform setting the master in the library function.
_inherited(new_master, new_index, ...);
// Then set index and attach to master object.
index = new_index;
AddVertex(0, new_master->GetY() - GetY() + new_master->GetTop());
SetAction("Attach", master);
return;
}
// Returns whether the ladder can be climbed.
public func CanNotBeClimbed(bool is_climbing)
{
var test_height = 10;
if (is_climbing)
test_height = 8;
if (GBackSolid(1, test_height) && GBackSolid(-1, test_height))
return true;
return false;
}
// Returns the segment (start x, start y, end x, end y, angle) on which the clonk can climb.
// The coordinate value must be specified with a precision of a 1000.
public func GetLadderData()
{
return [
GetX(1000),
GetY(1000) + 4000,
GetX(1000),
GetY(1000) - 4000,
0
];
}
public func OnLadderGrab(object clonk)
{
if (master)
master->OnLadderGrab(clonk, this, index);
return;
}
public func OnLadderClimb(object clonk)
{
if (master)
master->OnLadderClimb(clonk, this, index);
return;
}
public func OnLadderReleased(object clonk)
{
if (master)
master->OnLadderReleased(clonk, this, index);
return;
}
// Main vine object is saved.
public func SaveScenarioObject() { return false; }
/*-- Properties --*/
local ActMap = {
Attach = {
Prototype = Action,
Name = "Attach",
Procedure = DFA_ATTACH,
},
};

View File

@ -5,7 +5,7 @@ Author Work(s)
===============================================================================
ala - Fire/Spark1&2&3, Objects/Weapons/Musket/Click1&2&3, Clonk/Action/Munch2, Clonk/Movement/DivingLoop1&2&3, Animals/Wipf/Snuff3
Structures/DoorOpen*, Structures/DoorClose*, Hits/BucketHit*, Objects/Lorry/Dump*, UI/UnCash1&2&3
Structures/DoorOpen*, Structures/DoorClose*, Hits/BucketHit*, Objects/Lorry/Dump*, UI/UnCash1&2&3, Environment/Vine/Grab1&2
Structures/Repair, Structures/FinishBuilding made from following resources:
- JoelAudio: https://www.freesound.org/people/JoelAudio/sounds/135860/ - CC-By 3.0
- cmusounddesign: https://www.freesound.org/people/cmusounddesign/sounds/84696 - CC-By 3.0