diff options
| author | troido <troido@protonmail.com> | 2020-04-13 15:13:36 +0200 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-04-13 15:13:36 +0200 |
| commit | e8088a736a48cfb650df7f7a8f69e3e91922ca57 (patch) | |
| tree | 95f2738dd10aa7250fd6416f598340c4aec8710e | |
| parent | 2d4cabc768968a215556f7a4ed81a728d3b6e120 (diff) | |
added if conditions in assemblages
| -rw-r--r-- | content/encyclopediae/default_encyclopedia.json | 4 | ||||
| -rw-r--r-- | content/maps/room.json | 2 | ||||
| -rw-r--r-- | src/componentparameter.rs | 31 |
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 |
