Board layers
This commit is contained in:
+47
-19
@@ -41,15 +41,26 @@ pub(crate) enum Action {
|
||||
/// Append a styled line to the game log.
|
||||
Log(LogLine),
|
||||
/// Add (`present = true`) or remove (`present = false`) `tag` on `target`.
|
||||
SetTag { target: ObjectId, tag: String, present: bool },
|
||||
SetTag {
|
||||
target: ObjectId,
|
||||
tag: String,
|
||||
present: bool,
|
||||
},
|
||||
/// Display a speech bubble above the source object for `duration` seconds.
|
||||
Say(String, f64),
|
||||
/// Pause draining this object's queue for `secs` seconds. Never reaches the board queue.
|
||||
Delay(f64),
|
||||
/// Set the source object's foreground and/or background color.
|
||||
SetColor { fg: Option<Rgba8>, bg: Option<Rgba8> },
|
||||
SetColor {
|
||||
fg: Option<Rgba8>,
|
||||
bg: Option<Rgba8>,
|
||||
},
|
||||
/// Call `fn_name` on `target` object, optionally passing `arg`.
|
||||
Send { target: ObjectId, fn_name: String, arg: Option<ScriptArg> },
|
||||
Send {
|
||||
target: ObjectId,
|
||||
fn_name: String,
|
||||
arg: Option<ScriptArg>,
|
||||
},
|
||||
/// Open a scrollable text overlay. Pauses game ticks while shown; a choice
|
||||
/// selection dispatches [`Send`](Action::Send) to the source object.
|
||||
Scroll(Vec<ScrollLine>),
|
||||
@@ -65,8 +76,8 @@ fn dir_to_str(d: Direction) -> &'static str {
|
||||
match d {
|
||||
Direction::North => "North",
|
||||
Direction::South => "South",
|
||||
Direction::East => "East",
|
||||
Direction::West => "West",
|
||||
Direction::East => "East",
|
||||
Direction::West => "West",
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,26 +94,35 @@ pub(crate) fn action_to_map(action: &Action) -> rhai::Map {
|
||||
match action {
|
||||
Action::Move(dir) => {
|
||||
m.insert("type".into(), ds("Move"));
|
||||
m.insert("dir".into(), ds(dir_to_str(*dir)));
|
||||
m.insert("dir".into(), ds(dir_to_str(*dir)));
|
||||
}
|
||||
Action::SetTile(n) => {
|
||||
m.insert("type".into(), ds("SetTile"));
|
||||
m.insert("tile".into(), Dynamic::from(*n as i64));
|
||||
}
|
||||
Action::Log(line) => {
|
||||
let text = line.spans.first().map(|s| s.text.as_str()).unwrap_or("").to_string();
|
||||
let text = line
|
||||
.spans
|
||||
.first()
|
||||
.map(|s| s.text.as_str())
|
||||
.unwrap_or("")
|
||||
.to_string();
|
||||
m.insert("type".into(), ds("Log"));
|
||||
m.insert("msg".into(), Dynamic::from(text));
|
||||
m.insert("msg".into(), Dynamic::from(text));
|
||||
}
|
||||
Action::SetTag { target, tag, present } => {
|
||||
m.insert("type".into(), ds("SetTag"));
|
||||
m.insert("target".into(), Dynamic::from(*target as i64));
|
||||
m.insert("tag".into(), Dynamic::from(tag.clone()));
|
||||
Action::SetTag {
|
||||
target,
|
||||
tag,
|
||||
present,
|
||||
} => {
|
||||
m.insert("type".into(), ds("SetTag"));
|
||||
m.insert("target".into(), Dynamic::from(*target as i64));
|
||||
m.insert("tag".into(), Dynamic::from(tag.clone()));
|
||||
m.insert("present".into(), Dynamic::from(*present));
|
||||
}
|
||||
Action::Say(text, dur) => {
|
||||
m.insert("type".into(), ds("Say"));
|
||||
m.insert("msg".into(), Dynamic::from(text.clone()));
|
||||
m.insert("type".into(), ds("Say"));
|
||||
m.insert("msg".into(), Dynamic::from(text.clone()));
|
||||
m.insert("duration".into(), Dynamic::from(*dur));
|
||||
}
|
||||
Action::Delay(secs) => {
|
||||
@@ -111,13 +131,21 @@ pub(crate) fn action_to_map(action: &Action) -> rhai::Map {
|
||||
}
|
||||
Action::SetColor { fg, bg } => {
|
||||
m.insert("type".into(), ds("SetColor"));
|
||||
if let Some(c) = fg { m.insert("fg".into(), Dynamic::from(color_to_hex(*c))); }
|
||||
if let Some(c) = bg { m.insert("bg".into(), Dynamic::from(color_to_hex(*c))); }
|
||||
if let Some(c) = fg {
|
||||
m.insert("fg".into(), Dynamic::from(color_to_hex(*c)));
|
||||
}
|
||||
if let Some(c) = bg {
|
||||
m.insert("bg".into(), Dynamic::from(color_to_hex(*c)));
|
||||
}
|
||||
}
|
||||
Action::Send { target, fn_name, arg } => {
|
||||
m.insert("type".into(), ds("Send"));
|
||||
Action::Send {
|
||||
target,
|
||||
fn_name,
|
||||
arg,
|
||||
} => {
|
||||
m.insert("type".into(), ds("Send"));
|
||||
m.insert("target".into(), Dynamic::from(*target as i64));
|
||||
m.insert("name".into(), Dynamic::from(fn_name.clone()));
|
||||
m.insert("name".into(), Dynamic::from(fn_name.clone()));
|
||||
if let Some(a) = arg {
|
||||
let dyn_arg = match a {
|
||||
ScriptArg::Str(s) => Dynamic::from(s.clone()),
|
||||
|
||||
Reference in New Issue
Block a user