Let plants grow less crowded, especially different kinds of plants (#1607).

This will need some testing whether all scenarios are still playable.
alut-include-path
Clonkonaut 2017-01-04 03:33:28 +01:00
parent 3fe83986ce
commit e4cfd39fdc
10 changed files with 45 additions and 21 deletions

View File

@ -6,6 +6,7 @@
local plant_seed_chance = 20;
local plant_seed_area = 400;
local plant_seed_amount = 10;
local plant_seed_offset = 30;
local lib_tree_burned = Deco_Tree_Deciduous3_Burned;

View File

@ -6,6 +6,7 @@
local plant_seed_chance = 20;
local plant_seed_area = 400;
local plant_seed_amount = 10;
local plant_seed_offset = 50;
local lib_tree_burned = Deco_Tree_Deciduous4_Burned;

View File

@ -99,7 +99,6 @@ private func UpdateSeedTimer()
return true;
}
/** Distance the seeds may travel. Default is 250.
@return the maximum distance.
*/
@ -135,7 +134,7 @@ public func SetSeedAmount(int v)
}
/** The closest distance a new plant may seed to its nearest neighbour. Default is 20.
@return the maximum amount of plants.
@return the closest distance to another plant.
*/
local plant_seed_offset = 20;
@ -151,7 +150,6 @@ public func SetSeedOffset(int v)
return true;
}
/** Evaluates parameters for this definition to determine if seeding should occur.
@par offx X offset added to context position for check.
@par offy Y offset added to context position for check.
@ -185,7 +183,36 @@ private func Seed()
var plant;
if (CheckSeedChance())
{
plant = DoSeed();
plant = DoSeed(true);
// Check if it is not close to another one.
if (plant)
{
var neighbours = FindObjects(Find_Func("IsPlant"), Find_Exclude(plant),
Sort_Multiple(Sort_Distance(plant->GetX() - GetX(), plant->GetY() - GetY()), Sort_Reverse(Sort_Func("SeedOffset"))));
// Only check the nearest 3 plants
var too_close = false;
for (var i = 0; i < GetLength(neighbours) && i < 3; i++)
{
var neighbour = neighbours[i];
var x_distance = plant->SeedOffset() + 1;
var y_distance = 151;
if (neighbour)
{
x_distance = Abs(neighbour->GetX() - plant->GetX());
y_distance = Abs(neighbour->GetY() - plant->GetY());
}
if ((x_distance < plant->SeedOffset() || x_distance < neighbour->~SeedOffset()) && y_distance < 151)
{
too_close = true;
break;
}
}
// Closeness check
if (too_close)
plant->RemoveObject();
else
plant->InitChild(this);
}
}
return plant;
}
@ -193,7 +220,7 @@ private func Seed()
/** Forcefully places a seed of the plant, without random chance
or other sanity checks. This is useful for testing.
*/
private func DoSeed()
public func DoSeed(bool no_init)
{
// Apply confinement for plant placement
var size = SeedArea();
@ -212,19 +239,11 @@ private func DoSeed()
// Place the new plant in the original area
confined_area = area;
}
// Place the plant...
// Place the plant
var plant = PlaceVegetation(GetID(), 0, 0, 0, 0, 3, confined_area);
if (plant)
{
// ...but check if it is not close to another one.
var neighbour = FindObject(Find_ID(GetID()), Find_Exclude(plant), Sort_Distance(plant->GetX() - GetX(), plant->GetY() - GetY()));
var distance = ObjectDistance(plant, neighbour);
// Closeness check
if (distance < SeedOffset())
plant->RemoveObject();
else
plant->InitChild(this);
}
if (!no_init && plant)
plant->InitChild(this);
return plant;
}
@ -236,8 +255,6 @@ private func RemoveInTunnel()
}
}
/* Editor */
public func Definition(def, ...)

View File

@ -5,6 +5,7 @@
local plant_seed_chance = 25;
local plant_seed_area = 120;
local plant_seed_amount = 4;
local plant_seed_offset = 10;
func Construction()
{

View File

@ -12,6 +12,7 @@ local is_explicit_skin = false;
local plant_seed_chance = 33;
local plant_seed_area = 120;
local plant_seed_amount = 6;
local plant_seed_offset = 5;
public func Construction()
{

View File

@ -10,7 +10,7 @@
local plant_seed_chance = 17;
local plant_seed_area = 150;
local plant_seed_amount = 4;
local plant_seed_offset = 10;
local plant_seed_offset = 5;
private func Incineration()
{

View File

@ -6,6 +6,7 @@
local plant_seed_chance = 100;
local plant_seed_area = 400;
local plant_seed_amount = 12;
local plant_seed_offset = 30;
local coconuts;
// Saved for GetTreetopPosition

View File

@ -6,6 +6,7 @@
local plant_seed_chance = 20;
local plant_seed_area = 400;
local plant_seed_amount = 10;
local plant_seed_offset = 30;
local lib_tree_burned = Tree_Coniferous_Burned;

View File

@ -6,6 +6,7 @@
local plant_seed_chance = 20;
local plant_seed_area = 400;
local plant_seed_amount = 10;
local plant_seed_offset = 30;
local lib_tree_burned = Tree_Deciduous_Burned;

View File

@ -13,7 +13,7 @@ local swing_anim;
local plant_seed_area = 60;
local plant_seed_chance = 40;
local plant_seed_amount = 4; // small seed area -> don't allow too many plants
local plant_seed_offset = 20;
local plant_seed_offset = 10;
public func SickleHarvesting() { return true; }
private func Construction()