diff --git a/docs/scarpet/language/SystemFunctions.md b/docs/scarpet/language/SystemFunctions.md
index bdc17d72..eb453bcd 100644
--- a/docs/scarpet/language/SystemFunctions.md
+++ b/docs/scarpet/language/SystemFunctions.md
@@ -239,6 +239,11 @@ map(range(10), bool(rand(2))) => [false, false, true, false, false, false, true,
map(range(10), str('%.1f',rand(_))) => [0.0, 0.4, 0.6, 1.9, 2.8, 3.8, 5.3, 2.2, 1.6, 5.6]
+## `reset_seed(seed)`
+
+Resets the sequence of the randomizer used by `rand` for this seed to its initial state. Returns a boolean value
+indicating if the given seed has been used or not.
+
### `perlin(x), perlin(x, y), perlin(x, y, z), perlin(x, y, z, seed)`
returns a noise value from `0.0` to `1.0` (roughly) for 1, 2 or 3 dimensional coordinate. The default seed it samples
diff --git a/docs/scarpet/resources/editors/idea/1.txt b/docs/scarpet/resources/editors/idea/1.txt
index d69ced42..e83e03da 100644
--- a/docs/scarpet/resources/editors/idea/1.txt
+++ b/docs/scarpet/resources/editors/idea/1.txt
@@ -63,6 +63,7 @@ reduce
relu
replace
replace_first
+reset_seed
return
round
sec
diff --git a/docs/scarpet/resources/editors/npp/scarpet.xml b/docs/scarpet/resources/editors/npp/scarpet.xml
index b44bb643..c274f9bd 100644
--- a/docs/scarpet/resources/editors/npp/scarpet.xml
+++ b/docs/scarpet/resources/editors/npp/scarpet.xml
@@ -25,7 +25,7 @@
- not fact rand
+ not fact rand reset_seed
sin cos tan asin acos atan atan2 sinh cosh tanh sec csc sech csch cot acot coth asinh acosh atanh
rad deg
log log10 log1p
@@ -46,7 +46,7 @@
var undef vars if loop map filter first all c_for for while reduce continue break
- import call outer type hash_code bool number str length rand sleep time profile_expr lower upper title replace replace_first
+ import call outer type hash_code bool number str length sleep time profile_expr lower upper title replace replace_first
block pos pos_offset solid air liquid flammable
diff --git a/src/main/java/carpet/script/Expression.java b/src/main/java/carpet/script/Expression.java
index cb95e860..7aa7ec0f 100644
--- a/src/main/java/carpet/script/Expression.java
+++ b/src/main/java/carpet/script/Expression.java
@@ -313,6 +313,11 @@ public class Expression
addUnaryFunction(name, (v) -> new NumericValue(fun.apply(NumericValue.asNumber(v).getDouble())));
}
+ public void addMathematicalUnaryIntFunction(String name, Function fun)
+ {
+ addUnaryFunction(name, (v) -> new NumericValue(fun.apply(NumericValue.asNumber(v).getDouble())));
+ }
+
public void addMathematicalBinaryFunction(String name, BiFunction fun)
{
addBinaryFunction(name, (w, v) ->
diff --git a/src/main/java/carpet/script/ScriptHost.java b/src/main/java/carpet/script/ScriptHost.java
index 1cae3c97..255f76d4 100644
--- a/src/main/java/carpet/script/ScriptHost.java
+++ b/src/main/java/carpet/script/ScriptHost.java
@@ -42,6 +42,10 @@ public abstract class ScriptHost
return randomizers.computeIfAbsent(aLong, Random::new);
}
+ public boolean resetRandom(long aLong) {
+ return randomizers.remove(aLong) != null;
+ }
+
public static class ModuleData
{
Module parent;
diff --git a/src/main/java/carpet/script/language/Sys.java b/src/main/java/carpet/script/language/Sys.java
index 4655f9d6..dc2a75df 100644
--- a/src/main/java/carpet/script/language/Sys.java
+++ b/src/main/java/carpet/script/language/Sys.java
@@ -210,6 +210,10 @@ public class Sys {
Value retval = new NumericValue(NumericValue.asNumber(argument).getDouble()*randomizer.nextDouble());
return (cc, tt) -> retval;
});
+ expression.addLazyFunction("reset_seed", 1, (c, t, lv) -> {
+ boolean gotIt = c.host.resetRandom(NumericValue.asNumber(lv.get(0).evalValue(c)).getLong());
+ return gotIt?LazyValue.TRUE:LazyValue.FALSE;
+ });
expression.addLazyFunction("perlin", -1, (c, t, lv) ->
{