summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--content/encyclopediae/default_encyclopedia.json4
-rw-r--r--content/maps/room.json2
-rw-r--r--src/componentparameter.rs31
3 files changed, 33 insertions, 4 deletions
diff --git a/content/encyclopediae/default_encyclopedia.json b/content/encyclopediae/default_encyclopedia.json
index 68acc02..ac25482 100644
--- a/content/encyclopediae/default_encyclopedia.json
+++ b/content/encyclopediae/default_encyclopedia.json
@@ -195,9 +195,9 @@
"components": [
["Timer", {
"delay": ["arg", "delay"],
- "spread": 0.9,
+ "spread": 0.1,
"trigger": "spawn",
- "target_time": 0
+ "target_time": ["if", [["arg", "initial_spawn"], 0, -1]]
}],
["Spawner", {
"template": ["arg", "template"],
diff --git a/content/maps/room.json b/content/maps/room.json
index 41663fc..ec4533f 100644
--- a/content/maps/room.json
+++ b/content/maps/room.json
@@ -44,7 +44,7 @@
"1": {"type": "portal", "kwargs": {"destination": "smallview"}},
"^": ["grass", "spiketrap"],
"d": ["grass", {"type": "spawner", "kwargs": {"template": {"type": "dummy"}, "delay": 100}}],
- "r": ["grass", {"type": "spawner", "kwargs": {"template": {"type": "rat"}, "amount": 10, "clan": "rats", "delay": 20}}],
+ "r": ["grass", {"type": "spawner", "kwargs": {"template": {"type": "rat"}, "amount": 3, "clan": "rats", "delay": 200, "initial_spawn": false}}],
"V": ["grass", "radishplant"],
"/": ["grass", "sword"],
"D": ["ground", "closeddoor"],
diff --git a/src/componentparameter.rs b/src/componentparameter.rs
index 47c9a26..333c6e1 100644
--- a/src/componentparameter.rs
+++ b/src/componentparameter.rs
@@ -20,6 +20,7 @@ pub enum ComponentParameter {
Argument(String),
Random(Vec<ComponentParameter>),
Concat(Vec<ComponentParameter>),
+ If(Box<ComponentParameter>, Box<ComponentParameter>, Box<ComponentParameter>),
TemplateSelf,
TemplateName
}
@@ -56,6 +57,17 @@ impl ComponentParameter {
}
Some(Parameter::String(string))
}
+ Self::If(condition, thenval, elseval) => {
+ if let Parameter::Bool(b) = condition.evaluate_(arguments, template, nesting+1)? {
+ if b {
+ thenval.evaluate_(arguments, template, nesting+1)
+ } else {
+ elseval.evaluate_(arguments, template, nesting+1)
+ }
+ } else {
+ None
+ }
+ }
Self::TemplateSelf => Some(Parameter::Template(template.clone())),
Self::TemplateName => Some(Parameter::String(template.name.0.clone())),
@@ -94,6 +106,13 @@ impl ComponentParameter {
}
Ok(Self::Concat(options))
},
+ "if" => {
+ Ok(Self::If(
+ Box::new(Self::from_json(paramvalue.get(0).ok_or(perr!("if does not have condition"))?)?),
+ Box::new(Self::from_json(paramvalue.get(1).ok_or(perr!("if does not have then value"))?)?),
+ Box::new(Self::from_json(paramvalue.get(2).ok_or(perr!("if does not have else value"))?)?)
+ ))
+ }
"self" => Ok(Self::TemplateSelf),
"name" => Ok(Self::TemplateName),
_ => Err(perr!("unknown compparam type '{}'", typename))
@@ -109,11 +128,21 @@ impl ComponentParameter {
let typ: ParameterType = options.get(0).ok_or(aerr!("random has no options"))?.get_type(arguments)?;
for param in options {
if param.get_type(arguments)? != typ {
- return Err(aerr!("inconsistent parameter types"));
+ return Err(aerr!("inconsistent parameter types in random"));
}
}
typ
},
+ Self::If(condition, thenval, elseval) => {
+ if condition.get_type(arguments)? != ParameterType::Bool {
+ return Err(aerr!("if condition is not a bool"));
+ }
+ let typ: ParameterType = thenval.get_type(arguments)?;
+ if elseval.get_type(arguments)? != typ {
+ return Err(aerr!("inconsistent parameter types in if"));
+ }
+ typ
+ },
Self::Concat(_s) => ParameterType::String,
Self::TemplateSelf => ParameterType::Template,
Self::TemplateName => ParameterType::String