summaryrefslogtreecommitdiff
path: root/src/names
diff options
context:
space:
mode:
Diffstat (limited to 'src/names')
-rw-r--r--src/names/artifact.rs17
-rw-r--r--src/names/mod.rs13
2 files changed, 24 insertions, 6 deletions
diff --git a/src/names/artifact.rs b/src/names/artifact.rs
index af24b3d..336eef4 100644
--- a/src/names/artifact.rs
+++ b/src/names/artifact.rs
@@ -2,22 +2,31 @@
//! called once a scholar has told you what it is.
use rand::RngExt;
+use serde::{Deserialize, Serialize};
use super::{Culture, pick};
use crate::seed::Rng;
-#[derive(Clone, Debug)]
+#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Artifact {
/// What you see when you find it: "a humming ochre lattice".
pub unidentified: String,
/// Its true name: "the Lacquered Orrery of Teshemond".
pub true_name: String,
+ /// Whether a scholar has told you its true name.
+ pub identified: bool,
+}
+
+impl Artifact {
+ /// What you call it: its true name once you know it.
+ pub fn name(&self) -> &str {
+ if self.identified { &self.true_name } else { &self.unidentified }
+ }
}
pub fn artifact(rng: &mut Rng) -> Artifact {
let look = format!("{} {} {}", pick(QUALITIES, rng), pick(COLOURS, rng), pick(SHAPES, rng));
- let article = if look.starts_with(['a', 'e', 'i', 'o', 'u']) { "an" } else { "a" };
- let unidentified = format!("{article} {look}");
+ let unidentified = super::a(&look);
let object = pick(OBJECTS, rng);
let culture = Culture::ALL[rng.random_range(..Culture::ALL.len())];
@@ -28,7 +37,7 @@ pub fn artifact(rng: &mut Rng) -> Artifact {
3 => format!("the {} {object}", pick(EPITHETS, rng)),
_ => format!("the {object} {}", pick(CLAUSES, rng)),
};
- Artifact { unidentified, true_name }
+ Artifact { unidentified, true_name, identified: false }
}
const QUALITIES: &[&str] = &[
diff --git a/src/names/mod.rs b/src/names/mod.rs
index 719455f..9b5d9a6 100644
--- a/src/names/mod.rs
+++ b/src/names/mod.rs
@@ -21,10 +21,12 @@ use std::fmt::Write as _;
use rand::RngExt;
use rand::seq::IndexedRandom;
+use serde::{Deserialize, Serialize};
use crate::seed::Rng;
-#[derive(Clone, Copy, Debug, PartialEq, Eq)]
+#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "lowercase")]
pub enum Culture {
Qaari,
Cant,
@@ -198,7 +200,7 @@ impl Culture {
self.expand(pick(self.phonology().places, rng), rng)
}
- fn expand(self, template: &str, rng: &mut Rng) -> String {
+ pub(crate) fn expand(self, template: &str, rng: &mut Rng) -> String {
let mut out = String::new();
let mut rest = template;
while let Some(open) = rest.find('{') {
@@ -217,6 +219,13 @@ impl Culture {
}
}
+/// The phrase with "a" or "an" in front, by its first letter: "an ice
+/// world", "a desert world".
+pub fn a(phrase: &str) -> String {
+ let article = if phrase.starts_with(['a', 'e', 'i', 'o', 'u']) { "an" } else { "a" };
+ format!("{article} {phrase}")
+}
+
pub(crate) fn pick(list: &'static [&'static str], rng: &mut Rng) -> &'static str {
list.choose(rng).expect("name lists are never empty")
}