Volcano: Additional script possibilities

Added settings for minimal and maximal strength, reset to defaults if passing nil as a parameter, possibility to overload chunk effects on eruption
clonk_re-export
Mark 2018-02-13 23:23:00 +01:00
parent f62050cf5b
commit c792833d98
1 changed files with 67 additions and 7 deletions

View File

@ -29,21 +29,68 @@ public func GetChance()
return;
}
// Sets the material, defaults to "Lava";
public func SetMaterial(string material)
{
if (this != Volcano)
return;
var effect = GetEffect("IntVolcanoControl");
if (effect)
effect.material = material;
effect.material = material ?? "Lava";
return;
}
// Sets the minimum strength in 1/4 pixels, defaults to 4.
public func SetMinStrength(string strength)
{
if (this != Volcano)
return;
var effect = GetEffect("IntVolcanoControl");
if (effect)
effect.min_strength = strength ?? 4;
return;
}
public func GetMinStrength()
{
if (this != Volcano)
return;
var effect = GetEffect("IntVolcanoControl");
if (effect)
return effect.min_strength;
return;
}
// Sets the minimum strength in 1/4 pixels, defaults to 4.
public func SetMaxStrength(string strength)
{
if (this != Volcano)
return;
var effect = GetEffect("IntVolcanoControl");
if (effect)
effect.max_strength = strength ?? 100;
return;
}
public func GetMaxStrength()
{
if (this != Volcano)
return;
var effect = GetEffect("IntVolcanoControl");
if (effect)
return effect.max_strength;
return;
}
protected func FxIntVolcanoControlStart(object target, proplist effect, int temp)
{
// Default to lava as material.
// Default to lava as material, 1 to 25 pixels wide streams
if (!temp)
{
effect.material = "Lava";
effect.min_strength = 4;
effect.max_strength = 100;
}
return FX_OK;
}
@ -59,6 +106,8 @@ func FxIntVolcanoControlSaveScen(obj, fx, props)
{
props->Add("Volcano", "Volcano->SetChance(%d)", fx.chance);
if (fx.material && fx.material != "Lava") props->Add("Volcano", "Volcano->SetMaterial(%v)", fx.material);
if (fx.min_strength && fx.min_strength != 4) props->Add("Volcano", "Volcano->SetMinStrength(%d)", fx.min_strength);
if (fx.max_strength && fx.max_strength != 100) props->Add("Volcano", "Volcano->SetMaxStrength(%d)", fx.max_strength);
return true;
}
@ -82,7 +131,7 @@ public func Launch(int x, int y, int strength, string material, int angle)
// Initial coordinates of the volcano.
SetPosition(x, y);
// Strength of the volcano.
str = BoundBy(strength, 1, 100);
str = BoundBy(strength, Volcano->GetMinStrength(), Volcano->GetMaxStrength());
// Volcano material.
mat = Material(material);
// Direction of the volcano.
@ -102,7 +151,7 @@ public func Launch(int x, int y, int strength, string material, int angle)
private func Advance()
{
// Branch volcano.
if (!Random((120 - str) / 12))
if (!Random((Volcano->GetMaxStrength() + 20 - str) / 12))
Branch();
// Store old coordinates.
oldx = GetX();
@ -163,8 +212,9 @@ private func Erupt()
// Cast other particles (lava chunks, ashes, ashclouds).
if (!Random(6))
if (WildcardMatch(MaterialName(mat), "*Lava*"))
CastObjects(LavaChunk, 1, 60, 0, 0, 0, 40);
{
CastChunks(MaterialName(mat));
}
// Reduce strength.
if(!Random(3))
@ -177,12 +227,22 @@ private func Erupt()
return;
}
// Cast other particles (lava chunks, ashes, ashclouds).
private func CastChunks(string material)
{
if (WildcardMatch(material, "*Lava*"))
{
CastObjects(LavaChunk, 1, 60, 0, 0, 0, 40);
}
return _inherited(material, ...);
}
// The volcano mainline branches into mainline + sideline.
private func Branch()
{
// Branch volcano.
var side = 2 * Random(2) - 1; // At which side the volcano branches.
var new_str = Max(Random(str / 2), 4); // Strength of the branch.
var new_str = Max(Random(str / 2), Volcano->GetMinStrength()); // Strength of the branch.
var x = side * Cos(angle, str / 4 - new_str / 4);
var y = side * Sin(angle, str / 4 - new_str / 4);
var new_mat = MaterialName(mat);