From d920f911a2fe4c70e9140b564a517d8ff5e50926 Mon Sep 17 00:00:00 2001 From: juliancoffee Date: Sun, 4 Jul 2021 17:55:52 +0300 Subject: [PATCH] Add Exact body field for EntityConfig Add Alignment field to EntityConfig + Migrate to specifying alignment and body in entity assets + Make Body required field (with Uninit if you want to specify it later) --- .../common/entity/dungeon/fallback/boss.ron | 3 +- .../common/entity/dungeon/fallback/enemy.ron | 3 +- .../entity/dungeon/fallback/miniboss.ron | 3 +- assets/common/entity/dungeon/tier-0/boss.ron | 3 +- assets/common/entity/dungeon/tier-0/bow.ron | 3 +- .../common/entity/dungeon/tier-0/miniboss.ron | 3 +- assets/common/entity/dungeon/tier-0/spear.ron | 3 +- assets/common/entity/dungeon/tier-0/staff.ron | 3 +- assets/common/entity/dungeon/tier-1/boss.ron | 3 +- assets/common/entity/dungeon/tier-1/bow.ron | 3 +- assets/common/entity/dungeon/tier-1/rat.ron | 3 +- assets/common/entity/dungeon/tier-1/spear.ron | 3 +- assets/common/entity/dungeon/tier-1/staff.ron | 3 +- assets/common/entity/dungeon/tier-2/boss.ron | 3 +- assets/common/entity/dungeon/tier-2/bow.ron | 3 +- .../common/entity/dungeon/tier-2/hakulaq.ron | 3 +- assets/common/entity/dungeon/tier-2/spear.ron | 3 +- assets/common/entity/dungeon/tier-2/staff.ron | 3 +- .../entity/dungeon/tier-3/bonerattler.ron | 3 +- assets/common/entity/dungeon/tier-3/boss.ron | 3 +- assets/common/entity/dungeon/tier-3/bow.ron | 3 +- .../common/entity/dungeon/tier-3/sentry.ron | 3 +- assets/common/entity/dungeon/tier-3/spear.ron | 3 +- assets/common/entity/dungeon/tier-3/staff.ron | 3 +- assets/common/entity/dungeon/tier-4/boss.ron | 3 +- assets/common/entity/dungeon/tier-4/bow.ron | 3 +- .../common/entity/dungeon/tier-4/miniboss.ron | 3 +- assets/common/entity/dungeon/tier-4/spear.ron | 3 +- assets/common/entity/dungeon/tier-4/staff.ron | 3 +- .../entity/dungeon/tier-5/beastmaster.ron | 3 +- assets/common/entity/dungeon/tier-5/boss.ron | 3 +- .../common/entity/dungeon/tier-5/cultist.ron | 3 +- assets/common/entity/dungeon/tier-5/hound.ron | 3 +- assets/common/entity/dungeon/tier-5/husk.ron | 3 +- .../entity/dungeon/tier-5/husk_brute.ron | 3 +- .../common/entity/dungeon/tier-5/turret.ron | 3 +- .../common/entity/dungeon/tier-5/warlock.ron | 3 +- .../common/entity/dungeon/tier-5/warlord.ron | 3 +- assets/common/entity/test.ron | 6 +- assets/common/entity/village/dummy.ron | 13 ++ assets/common/entity/village/guard.ron | 4 +- assets/common/entity/village/merchant.ron | 4 +- assets/common/entity/village/villager.ron | 5 +- common/src/comp/agent.rs | 3 +- common/src/generation.rs | 64 +++++---- world/src/site/settlement/mod.rs | 136 +++++++++--------- world/src/site2/plot/dungeon.rs | 84 +++++------ 47 files changed, 252 insertions(+), 181 deletions(-) create mode 100644 assets/common/entity/village/dummy.ron diff --git a/assets/common/entity/dungeon/fallback/boss.ron b/assets/common/entity/dungeon/fallback/boss.ron index caf7fc2256..002479e311 100644 --- a/assets/common/entity/dungeon/fallback/boss.ron +++ b/assets/common/entity/dungeon/fallback/boss.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Crazy Sheep"), - body: Some(RandomWith("sheep")), + body: RandomWith("sheep"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.fallback")), diff --git a/assets/common/entity/dungeon/fallback/enemy.ron b/assets/common/entity/dungeon/fallback/enemy.ron index 63e9172578..71d2483b36 100644 --- a/assets/common/entity/dungeon/fallback/enemy.ron +++ b/assets/common/entity/dungeon/fallback/enemy.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Yan Hus"), - body: Some(RandomWith("humanoid")), + body: RandomWith("humanoid"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.fallback")), diff --git a/assets/common/entity/dungeon/fallback/miniboss.ron b/assets/common/entity/dungeon/fallback/miniboss.ron index 6f7ba8171e..dfeb34cb24 100644 --- a/assets/common/entity/dungeon/fallback/miniboss.ron +++ b/assets/common/entity/dungeon/fallback/miniboss.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Big Goose"), - body: Some(RandomWith("goose")), + body: RandomWith("goose"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.fallback")), diff --git a/assets/common/entity/dungeon/tier-0/boss.ron b/assets/common/entity/dungeon/tier-0/boss.ron index 98483efc4d..04f32f3935 100644 --- a/assets/common/entity/dungeon/tier-0/boss.ron +++ b/assets/common/entity/dungeon/tier-0/boss.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Harvester"), - body: Some(RandomWith("harvester")), + body: RandomWith("harvester"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-0.boss")), diff --git a/assets/common/entity/dungeon/tier-0/bow.ron b/assets/common/entity/dungeon/tier-0/bow.ron index be2948eb55..a26c225b74 100644 --- a/assets/common/entity/dungeon/tier-0/bow.ron +++ b/assets/common/entity/dungeon/tier-0/bow.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Gnarling Stalker"), - body: Some(RandomWith("gnarling")), + body: RandomWith("gnarling"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-0.enemy")), diff --git a/assets/common/entity/dungeon/tier-0/miniboss.ron b/assets/common/entity/dungeon/tier-0/miniboss.ron index 411ef1a7b1..8f091f4065 100644 --- a/assets/common/entity/dungeon/tier-0/miniboss.ron +++ b/assets/common/entity/dungeon/tier-0/miniboss.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Deadwood"), - body: Some(RandomWith("deadwood")), + body: RandomWith("deadwood"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-0.miniboss")), diff --git a/assets/common/entity/dungeon/tier-0/spear.ron b/assets/common/entity/dungeon/tier-0/spear.ron index e5a4d9e2ad..df95fc9982 100644 --- a/assets/common/entity/dungeon/tier-0/spear.ron +++ b/assets/common/entity/dungeon/tier-0/spear.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Gnarling Mugger"), - body: Some(RandomWith("gnarling")), + body: RandomWith("gnarling"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-0.enemy")), diff --git a/assets/common/entity/dungeon/tier-0/staff.ron b/assets/common/entity/dungeon/tier-0/staff.ron index 7202904324..593e7a38f6 100644 --- a/assets/common/entity/dungeon/tier-0/staff.ron +++ b/assets/common/entity/dungeon/tier-0/staff.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Gnarling Shaman"), - body: Some(RandomWith("gnarling")), + body: RandomWith("gnarling"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-0.enemy")), diff --git a/assets/common/entity/dungeon/tier-1/boss.ron b/assets/common/entity/dungeon/tier-1/boss.ron index 30035d7c3f..3dfcbfca13 100644 --- a/assets/common/entity/dungeon/tier-1/boss.ron +++ b/assets/common/entity/dungeon/tier-1/boss.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Yeti"), - body: Some(RandomWith("yeti")), + body: RandomWith("yeti"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-1.boss")), diff --git a/assets/common/entity/dungeon/tier-1/bow.ron b/assets/common/entity/dungeon/tier-1/bow.ron index 013fd7c04c..cf8a1e7d82 100644 --- a/assets/common/entity/dungeon/tier-1/bow.ron +++ b/assets/common/entity/dungeon/tier-1/bow.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Adlet Tracker"), - body: Some(RandomWith("adlet")), + body: RandomWith("adlet"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-1.enemy")), diff --git a/assets/common/entity/dungeon/tier-1/rat.ron b/assets/common/entity/dungeon/tier-1/rat.ron index 565057282d..0cfae2fa49 100644 --- a/assets/common/entity/dungeon/tier-1/rat.ron +++ b/assets/common/entity/dungeon/tier-1/rat.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Rat"), - body: Some(RandomWith("rat")), + body: RandomWith("rat"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.creature.quad_small.generic")), diff --git a/assets/common/entity/dungeon/tier-1/spear.ron b/assets/common/entity/dungeon/tier-1/spear.ron index 0ce2a1b28c..7bfd55d539 100644 --- a/assets/common/entity/dungeon/tier-1/spear.ron +++ b/assets/common/entity/dungeon/tier-1/spear.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Adlet Hunter"), - body: Some(RandomWith("adlet")), + body: RandomWith("adlet"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-1.enemy")), diff --git a/assets/common/entity/dungeon/tier-1/staff.ron b/assets/common/entity/dungeon/tier-1/staff.ron index d9dc6d2a3e..c0bcc443a2 100644 --- a/assets/common/entity/dungeon/tier-1/staff.ron +++ b/assets/common/entity/dungeon/tier-1/staff.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Adlet Shaman"), - body: Some(RandomWith("adlet")), + body: RandomWith("adlet"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-1.enemy")), diff --git a/assets/common/entity/dungeon/tier-2/boss.ron b/assets/common/entity/dungeon/tier-2/boss.ron index 4db8d8d5d2..661c35dbd2 100644 --- a/assets/common/entity/dungeon/tier-2/boss.ron +++ b/assets/common/entity/dungeon/tier-2/boss.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Tidal Warrior"), - body: Some(RandomWith("tidalwarrior")), + body: RandomWith("tidalwarrior"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-2.boss")), diff --git a/assets/common/entity/dungeon/tier-2/bow.ron b/assets/common/entity/dungeon/tier-2/bow.ron index abd5927b14..5a2803862e 100644 --- a/assets/common/entity/dungeon/tier-2/bow.ron +++ b/assets/common/entity/dungeon/tier-2/bow.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Sahagin Sniper"), - body: Some(RandomWith("sahagin")), + body: RandomWith("sahagin"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-2.enemy")), diff --git a/assets/common/entity/dungeon/tier-2/hakulaq.ron b/assets/common/entity/dungeon/tier-2/hakulaq.ron index 8f279e3943..0b42e2968b 100644 --- a/assets/common/entity/dungeon/tier-2/hakulaq.ron +++ b/assets/common/entity/dungeon/tier-2/hakulaq.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Hakulaq"), - body: Some(RandomWith("hakulaq")), + body: RandomWith("hakulaq"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.creature.quad_low.fanged")), diff --git a/assets/common/entity/dungeon/tier-2/spear.ron b/assets/common/entity/dungeon/tier-2/spear.ron index bce3699599..43c4d19381 100644 --- a/assets/common/entity/dungeon/tier-2/spear.ron +++ b/assets/common/entity/dungeon/tier-2/spear.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Sahagin Spearman"), - body: Some(RandomWith("sahagin")), + body: RandomWith("sahagin"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-2.enemy")), diff --git a/assets/common/entity/dungeon/tier-2/staff.ron b/assets/common/entity/dungeon/tier-2/staff.ron index e41cddb070..889d656483 100644 --- a/assets/common/entity/dungeon/tier-2/staff.ron +++ b/assets/common/entity/dungeon/tier-2/staff.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Sahagin Sorcerer"), - body: Some(RandomWith("sahagin")), + body: RandomWith("sahagin"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-2.enemy")), diff --git a/assets/common/entity/dungeon/tier-3/bonerattler.ron b/assets/common/entity/dungeon/tier-3/bonerattler.ron index 1fbf9329eb..6d53d539fb 100644 --- a/assets/common/entity/dungeon/tier-3/bonerattler.ron +++ b/assets/common/entity/dungeon/tier-3/bonerattler.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Bonerattler"), - body: Some(RandomWith("bonerattler")), + body: RandomWith("bonerattler"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.creature.quad_medium.carapace")), diff --git a/assets/common/entity/dungeon/tier-3/boss.ron b/assets/common/entity/dungeon/tier-3/boss.ron index cf6ddc11ed..6b86a0ff60 100644 --- a/assets/common/entity/dungeon/tier-3/boss.ron +++ b/assets/common/entity/dungeon/tier-3/boss.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Clay Golem"), - body: Some(RandomWith("claygolem")), + body: RandomWith("claygolem"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-3.boss")), diff --git a/assets/common/entity/dungeon/tier-3/bow.ron b/assets/common/entity/dungeon/tier-3/bow.ron index f693a38d03..b5550656ac 100644 --- a/assets/common/entity/dungeon/tier-3/bow.ron +++ b/assets/common/entity/dungeon/tier-3/bow.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Haniwa Archer"), - body: Some(RandomWith("haniwa")), + body: RandomWith("haniwa"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-3.enemy")), diff --git a/assets/common/entity/dungeon/tier-3/sentry.ron b/assets/common/entity/dungeon/tier-3/sentry.ron index 724f259ee4..90dd422e20 100644 --- a/assets/common/entity/dungeon/tier-3/sentry.ron +++ b/assets/common/entity/dungeon/tier-3/sentry.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Haniwa Sentry"), - body: None, + body: Exact(Object(HaniwaSentry)), + alignment: Alignment(Enemy), loot: Some(Item("common.items.crafting_ing.stones")), diff --git a/assets/common/entity/dungeon/tier-3/spear.ron b/assets/common/entity/dungeon/tier-3/spear.ron index 376d2d67e6..0fa6541dc0 100644 --- a/assets/common/entity/dungeon/tier-3/spear.ron +++ b/assets/common/entity/dungeon/tier-3/spear.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Haniwa Guard"), - body: Some(RandomWith("haniwa")), + body: RandomWith("haniwa"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-3.enemy")), diff --git a/assets/common/entity/dungeon/tier-3/staff.ron b/assets/common/entity/dungeon/tier-3/staff.ron index f8d051f2b7..c2450d26d6 100644 --- a/assets/common/entity/dungeon/tier-3/staff.ron +++ b/assets/common/entity/dungeon/tier-3/staff.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Haniwa Sorcerer"), - body: Some(RandomWith("haniwa")), + body: RandomWith("haniwa"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-3.enemy")), diff --git a/assets/common/entity/dungeon/tier-4/boss.ron b/assets/common/entity/dungeon/tier-4/boss.ron index 5f8883c1dd..756eb9c71e 100644 --- a/assets/common/entity/dungeon/tier-4/boss.ron +++ b/assets/common/entity/dungeon/tier-4/boss.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Minotaur"), - body: Some(RandomWith("minotaur")), + body: RandomWith("minotaur"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-4.boss")), diff --git a/assets/common/entity/dungeon/tier-4/bow.ron b/assets/common/entity/dungeon/tier-4/bow.ron index 04ec56dc59..14b7719c2b 100644 --- a/assets/common/entity/dungeon/tier-4/bow.ron +++ b/assets/common/entity/dungeon/tier-4/bow.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Myrmidon Marksman"), - body: Some(RandomWith("myrmidon")), + body: RandomWith("myrmidon"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-4.enemy")), diff --git a/assets/common/entity/dungeon/tier-4/miniboss.ron b/assets/common/entity/dungeon/tier-4/miniboss.ron index 46ba728ead..30446ac213 100644 --- a/assets/common/entity/dungeon/tier-4/miniboss.ron +++ b/assets/common/entity/dungeon/tier-4/miniboss.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Dullahan"), - body: Some(RandomWith("dullahan")), + body: RandomWith("dullahan"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-4.miniboss")), diff --git a/assets/common/entity/dungeon/tier-4/spear.ron b/assets/common/entity/dungeon/tier-4/spear.ron index dffc6440dd..5cb98458c3 100644 --- a/assets/common/entity/dungeon/tier-4/spear.ron +++ b/assets/common/entity/dungeon/tier-4/spear.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Myrmidon Hoplite"), - body: Some(RandomWith("myrmidon")), + body: RandomWith("myrmidon"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-4.enemy")), diff --git a/assets/common/entity/dungeon/tier-4/staff.ron b/assets/common/entity/dungeon/tier-4/staff.ron index 8d432875d2..1f26828f6b 100644 --- a/assets/common/entity/dungeon/tier-4/staff.ron +++ b/assets/common/entity/dungeon/tier-4/staff.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Myrmidon Wizard"), - body: Some(RandomWith("myrmidon")), + body: RandomWith("myrmidon"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-4.enemy")), diff --git a/assets/common/entity/dungeon/tier-5/beastmaster.ron b/assets/common/entity/dungeon/tier-5/beastmaster.ron index 29987a13e2..4c1abf5318 100644 --- a/assets/common/entity/dungeon/tier-5/beastmaster.ron +++ b/assets/common/entity/dungeon/tier-5/beastmaster.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Beastmaster"), - body: Some(RandomWith("humanoid")), + body: RandomWith("humanoid"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-5.miniboss")), diff --git a/assets/common/entity/dungeon/tier-5/boss.ron b/assets/common/entity/dungeon/tier-5/boss.ron index 9957ec5482..18557c26a3 100644 --- a/assets/common/entity/dungeon/tier-5/boss.ron +++ b/assets/common/entity/dungeon/tier-5/boss.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Mindflayer"), - body: Some(RandomWith("mindflayer")), + body: RandomWith("mindflayer"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-5.boss")), diff --git a/assets/common/entity/dungeon/tier-5/cultist.ron b/assets/common/entity/dungeon/tier-5/cultist.ron index b8e7996861..3b8097244e 100644 --- a/assets/common/entity/dungeon/tier-5/cultist.ron +++ b/assets/common/entity/dungeon/tier-5/cultist.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Cultist"), - body: Some(RandomWith("humanoid")), + body: RandomWith("humanoid"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-5.enemy")), diff --git a/assets/common/entity/dungeon/tier-5/hound.ron b/assets/common/entity/dungeon/tier-5/hound.ron index 0b78c67746..f8116062fe 100644 --- a/assets/common/entity/dungeon/tier-5/hound.ron +++ b/assets/common/entity/dungeon/tier-5/hound.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Tamed Darkhound"), - body: Some(RandomWith("darkhound")), + body: RandomWith("darkhound"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-5.minion")), diff --git a/assets/common/entity/dungeon/tier-5/husk.ron b/assets/common/entity/dungeon/tier-5/husk.ron index a28e46db0e..54aba3f90c 100644 --- a/assets/common/entity/dungeon/tier-5/husk.ron +++ b/assets/common/entity/dungeon/tier-5/husk.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Cultist Husk"), - body: Some(RandomWith("husk")), + body: RandomWith("husk"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-5.minion")), diff --git a/assets/common/entity/dungeon/tier-5/husk_brute.ron b/assets/common/entity/dungeon/tier-5/husk_brute.ron index 40f26815b6..ec39247f96 100644 --- a/assets/common/entity/dungeon/tier-5/husk_brute.ron +++ b/assets/common/entity/dungeon/tier-5/husk_brute.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Husk Brute"), - body: Some(RandomWith("husk_brute")), + body: RandomWith("husk_brute"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-5.miniboss")), diff --git a/assets/common/entity/dungeon/tier-5/turret.ron b/assets/common/entity/dungeon/tier-5/turret.ron index bb84413d6a..7834953f58 100644 --- a/assets/common/entity/dungeon/tier-5/turret.ron +++ b/assets/common/entity/dungeon/tier-5/turret.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Possessed Turret"), - body: None, + body: Exact(Object(Crossbow)), + alignment: Alignment(Enemy), loot: Some(Item("common.items.crafting_ing.twigs")), diff --git a/assets/common/entity/dungeon/tier-5/warlock.ron b/assets/common/entity/dungeon/tier-5/warlock.ron index 369bd091cb..53f2ef16bd 100644 --- a/assets/common/entity/dungeon/tier-5/warlock.ron +++ b/assets/common/entity/dungeon/tier-5/warlock.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Cultist Warlock"), - body: Some(RandomWith("cultist_warlock")), + body: RandomWith("cultist_warlock"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-5.enemy")), diff --git a/assets/common/entity/dungeon/tier-5/warlord.ron b/assets/common/entity/dungeon/tier-5/warlord.ron index fe2152e6e4..be50ee1aa8 100644 --- a/assets/common/entity/dungeon/tier-5/warlord.ron +++ b/assets/common/entity/dungeon/tier-5/warlord.ron @@ -1,6 +1,7 @@ EntityConfig ( name: Some("Cultist Warlord"), - body: Some(RandomWith("cultist_warlord")), + body: RandomWith("cultist_warlord"), + alignment: Alignment(Enemy), loot: Some(LootTable("common.loot_tables.dungeon.tier-5.enemy")), diff --git a/assets/common/entity/test.ron b/assets/common/entity/test.ron index 20c8ff8fb6..b24d5e713d 100644 --- a/assets/common/entity/test.ron +++ b/assets/common/entity/test.ron @@ -5,7 +5,11 @@ EntityConfig ( /// Body /// Can be Exact (Body with all fields e.g BodyType, Species, Hair color and such) /// or RandomWith (will generate random body or species) - body: Some(RandomWith("humanoid")), + /// or Uninit (means it should be specified somewhere in code) + body: RandomWith("humanoid"), + + /// Alignment, can be Uninit + alignment: Alignment(Enemy), /// Main and second tools /// Can be Option (with asset_specifier for item) diff --git a/assets/common/entity/village/dummy.ron b/assets/common/entity/village/dummy.ron new file mode 100644 index 0000000000..ca958ede04 --- /dev/null +++ b/assets/common/entity/village/dummy.ron @@ -0,0 +1,13 @@ +EntityConfig ( + name: Some("Training Dummy"), + body: Exact(Object(TrainingDummy)), + alignment: Alignment(Passive), + + loot: None, + + main_tool: None, + second_tool: None, + + loadout_asset: None, + skillset_asset: None, +) diff --git a/assets/common/entity/village/guard.ron b/assets/common/entity/village/guard.ron index a80314380c..dc642b2a81 100644 --- a/assets/common/entity/village/guard.ron +++ b/assets/common/entity/village/guard.ron @@ -1,7 +1,7 @@ EntityConfig ( name: Some("Guard"), - // body is specified outsite - body: None, + body: RandomWith("humanoid"), + alignment: Alignment(Npc), loot: None, diff --git a/assets/common/entity/village/merchant.ron b/assets/common/entity/village/merchant.ron index 7fb1de003d..74491b729e 100644 --- a/assets/common/entity/village/merchant.ron +++ b/assets/common/entity/village/merchant.ron @@ -1,7 +1,7 @@ EntityConfig ( name: Some("Merchant"), - // body is specified outsite - body: None, + body: RandomWith("humanoid"), + alignment: Alignment(Npc), // considering giving some gold/gems/materials? loot: None, diff --git a/assets/common/entity/village/villager.ron b/assets/common/entity/village/villager.ron index 37d6528807..b1bac72a82 100644 --- a/assets/common/entity/village/villager.ron +++ b/assets/common/entity/village/villager.ron @@ -1,7 +1,8 @@ EntityConfig ( + // name is specified outsite name: None, - // body is specified outsite - body: None, + body: RandomWith("humanoid"), + alignment: Alignment(Npc), loot: None, diff --git a/common/src/comp/agent.rs b/common/src/comp/agent.rs index 0cb2bb22cb..ba42292175 100644 --- a/common/src/comp/agent.rs +++ b/common/src/comp/agent.rs @@ -5,6 +5,7 @@ use crate::{ trade::{PendingTrade, ReducedInventory, SiteId, SitePrices, TradeId, TradeResult}, uid::Uid, }; +use serde::Deserialize; use specs::{Component, Entity as EcsEntity}; use specs_idvs::IdvStorage; use std::{collections::VecDeque, fmt}; @@ -16,7 +17,7 @@ pub const DEFAULT_INTERACTION_TIME: f32 = 1.0; pub const TRADE_INTERACTION_TIME: f32 = 300.0; pub const MAX_LISTEN_DIST: f32 = 100.0; -#[derive(Copy, Clone, Debug, PartialEq)] +#[derive(Copy, Clone, Debug, PartialEq, Deserialize)] pub enum Alignment { /// Wild animals and gentle giants Wild, diff --git a/common/src/generation.rs b/common/src/generation.rs index e5a46562c0..8f856553d4 100644 --- a/common/src/generation.rs +++ b/common/src/generation.rs @@ -14,8 +14,10 @@ use serde::Deserialize; use vek::*; #[derive(Debug, Deserialize, Clone)] -enum BodyKind { +enum BodyBuilder { RandomWith(String), + Exact(Body), + Uninit, } #[derive(Debug, Deserialize, Clone)] @@ -24,10 +26,17 @@ enum LootKind { LootTable(String), } +#[derive(Debug, Deserialize, Clone)] +enum AlignmentMark { + Alignment(Alignment), + Uninit, +} + #[derive(Debug, Deserialize, Clone)] struct EntityConfig { name: Option, - body: Option, + body: BodyBuilder, + alignment: AlignmentMark, loot: Option, main_tool: Option, second_tool: Option, @@ -101,6 +110,7 @@ impl EntityInfo { let EntityConfig { name, body, + alignment, loot, main_tool, second_tool, @@ -112,17 +122,23 @@ impl EntityInfo { self = self.with_name(name); } - if let Some(body) = body { - match body { - BodyKind::RandomWith(string) => { - let npc::NpcBody(_body_kind, mut body_creator) = - string.parse::().unwrap_or_else(|err| { - panic!("failed to parse body {:?}. Err: {:?}", &string, err) - }); - let body = body_creator(); - self = self.with_body(body); - }, - } + match body { + BodyBuilder::RandomWith(string) => { + let npc::NpcBody(_body_kind, mut body_creator) = + string.parse::().unwrap_or_else(|err| { + panic!("failed to parse body {:?}. Err: {:?}", &string, err) + }); + let body = body_creator(); + self = self.with_body(body); + }, + BodyBuilder::Exact(body) => { + self = self.with_body(body); + }, + BodyBuilder::Uninit => {}, + } + + if let AlignmentMark::Alignment(alignment) = alignment { + self = self.with_alignment(alignment); } if let Some(loot) = loot { @@ -319,9 +335,10 @@ mod tests { second_tool, loadout_asset, skillset_asset, - name: _name, body, loot, + name: _name, // can't fail if serialized, it's a boring String + alignment: _alignment, // can't fail if serialized, it's a boring enum } = config.clone(); if let Some(main_tool) = main_tool { @@ -332,16 +349,15 @@ mod tests { second_tool.validate(EquipSlot::ActiveOffhand); } - if let Some(body) = body { - match body { - BodyKind::RandomWith(string) => { - let npc::NpcBody(_body_kind, mut body_creator) = - string.parse::().unwrap_or_else(|err| { - panic!("failed to parse body {:?}. Err: {:?}", &string, err) - }); - let _ = body_creator(); - }, - } + match body { + BodyBuilder::RandomWith(string) => { + let npc::NpcBody(_body_kind, mut body_creator) = + string.parse::().unwrap_or_else(|err| { + panic!("failed to parse body {:?}. Err: {:?}", &string, err) + }); + let _ = body_creator(); + }, + BodyBuilder::Exact { .. } | BodyBuilder::Uninit => {}, } if let Some(loot) = loot { diff --git a/world/src/site/settlement/mod.rs b/world/src/site/settlement/mod.rs index aba6c5d984..2f18b78b0a 100644 --- a/world/src/site/settlement/mod.rs +++ b/world/src/site/settlement/mod.rs @@ -16,13 +16,13 @@ use crate::{ use common::{ astar::Astar, comp::{ - self, agent, bird_medium, humanoid, + self, agent, bird_medium, inventory::{ loadout_builder::{make_potion_bag, LoadoutBuilder}, slot::ArmorSlot, trade_pricing::TradePricing, }, - object, quadruped_small, Item, + quadruped_small, Item, }, generation::{ChunkSupplement, EntityInfo}, path::Path, @@ -860,7 +860,6 @@ impl Settlement { } } - #[allow(clippy::eval_order_dependence)] // TODO: Pending review in #587 pub fn apply_supplement<'a>( &'a self, // NOTE: Used only for dynamic elements like chests and entities! @@ -904,75 +903,19 @@ impl Settlement { if matches!(sample.plot, Some(Plot::Town { .. })) && RandomField::new(self.seed).chance(Vec3::from(wpos2d), 1.0 / (50.0 * 40.0)) { - let is_human: bool; let is_dummy = RandomField::new(self.seed + 1).chance(Vec3::from(wpos2d), 1.0 / 15.0); - let entity = EntityInfo::at(entity_wpos) - .with_body(match dynamic_rng.gen_range(0..5) { - _ if is_dummy => { - is_human = false; - object::Body::TrainingDummy.into() - }, - 0 => { - let species = match dynamic_rng.gen_range(0..5) { - 0 => quadruped_small::Species::Pig, - 1 => quadruped_small::Species::Sheep, - 2 => quadruped_small::Species::Goat, - 3 => quadruped_small::Species::Dog, - _ => quadruped_small::Species::Cat, - }; - is_human = false; - comp::Body::QuadrupedSmall(quadruped_small::Body::random_with( - dynamic_rng, - &species, - )) - }, - 1 => { - let species = match dynamic_rng.gen_range(0..4) { - 0 => bird_medium::Species::Duck, - 1 => bird_medium::Species::Chicken, - 2 => bird_medium::Species::Goose, - _ => bird_medium::Species::Peacock, - }; - is_human = false; - comp::Body::BirdMedium(bird_medium::Body::random_with( - dynamic_rng, - &species, - )) - }, - _ => { - is_human = true; - comp::Body::Humanoid(humanoid::Body::random()) - }, - }) - .with_agency(!is_dummy) - .with_alignment(if is_dummy { - comp::Alignment::Passive - } else if is_human { - comp::Alignment::Npc - } else { - comp::Alignment::Tame - }) - .do_if(!is_dummy, |e| e.with_automatic_name()) - .do_if(is_dummy, |e| e.with_name("Training Dummy")) - .do_if(is_human && dynamic_rng.gen(), |entity| { - match dynamic_rng.gen_range(0..6) { - 0 => entity - .with_agent_mark(agent::Mark::Guard) - .with_lazy_loadout(guard_loadout) - .with_level(dynamic_rng.gen_range(10..15)) - .with_asset_expect("common.entity.village.guard"), - 1 | 2 => entity - .with_agent_mark(agent::Mark::Merchant) - .with_economy(&economy) - .with_lazy_loadout(merchant_loadout) - .with_level(dynamic_rng.gen_range(10..15)) - .with_asset_expect("common.entity.village.merchant"), - _ => entity - .with_lazy_loadout(villager_loadout) - .with_asset_expect("common.entity.village.villager"), - } - }); + let entity = if is_dummy { + EntityInfo::at(entity_wpos) + .with_agency(false) + .with_asset_expect("common.entity.village.dummy") + } else { + match dynamic_rng.gen_range(0..=4) { + 0 => barnyard(entity_wpos, dynamic_rng), + 1 => bird(entity_wpos, dynamic_rng), + _ => human(entity_wpos, &economy, dynamic_rng), + } + }; supplement.add_entity(entity); } @@ -1031,6 +974,59 @@ impl Settlement { } } +fn barnyard(pos: Vec3, dynamic_rng: &mut impl Rng) -> EntityInfo { + let species = match dynamic_rng.gen_range(0..5) { + 0 => quadruped_small::Species::Pig, + 1 => quadruped_small::Species::Sheep, + 2 => quadruped_small::Species::Goat, + 3 => quadruped_small::Species::Dog, + _ => quadruped_small::Species::Cat, + }; + EntityInfo::at(pos) + .with_body(comp::Body::QuadrupedSmall( + quadruped_small::Body::random_with(dynamic_rng, &species), + )) + .with_alignment(comp::Alignment::Tame) + .with_automatic_name() +} + +fn bird(pos: Vec3, dynamic_rng: &mut impl Rng) -> EntityInfo { + let species = match dynamic_rng.gen_range(0..4) { + 0 => bird_medium::Species::Duck, + 1 => bird_medium::Species::Chicken, + 2 => bird_medium::Species::Goose, + _ => bird_medium::Species::Peacock, + }; + EntityInfo::at(pos) + .with_body(comp::Body::BirdMedium(bird_medium::Body::random_with( + dynamic_rng, + &species, + ))) + .with_alignment(comp::Alignment::Tame) + .with_automatic_name() +} + +fn human(pos: Vec3, economy: &SiteInformation, dynamic_rng: &mut impl Rng) -> EntityInfo { + let entity = EntityInfo::at(pos); + match dynamic_rng.gen_range(0..12) { + 0 => entity + .with_agent_mark(agent::Mark::Guard) + .with_lazy_loadout(guard_loadout) + .with_level(dynamic_rng.gen_range(10..15)) + .with_asset_expect("common.entity.village.guard"), + 1 | 2 => entity + .with_agent_mark(agent::Mark::Merchant) + .with_economy(&economy) + .with_lazy_loadout(merchant_loadout) + .with_level(dynamic_rng.gen_range(10..15)) + .with_asset_expect("common.entity.village.merchant"), + _ => entity + .with_lazy_loadout(villager_loadout) + .with_asset_expect("common.entity.village.villager") + .with_automatic_name(), + } +} + fn merchant_loadout( loadout_builder: LoadoutBuilder, economy: Option<&trade::SiteInformation>, diff --git a/world/src/site2/plot/dungeon.rs b/world/src/site2/plot/dungeon.rs index 6ee1804e08..3266ef4182 100644 --- a/world/src/site2/plot/dungeon.rs +++ b/world/src/site2/plot/dungeon.rs @@ -9,7 +9,6 @@ use crate::{ use common::{ assets::{self, AssetExt, AssetHandle}, astar::Astar, - comp::{self}, generation::{ChunkSupplement, EntityInfo}, store::{Id, Store}, terrain::{ @@ -235,16 +234,14 @@ impl Room { for entity in entities { supplement.add_entity( - entity - .with_level( - dynamic_rng - .gen_range( - (self.difficulty as f32).powf(1.25) + 3.0 - ..(self.difficulty as f32).powf(1.5) + 4.0, - ) - .round() as u16, - ) - .with_alignment(comp::Alignment::Enemy), + entity.with_level( + dynamic_rng + .gen_range( + (self.difficulty as f32).powf(1.25) + 3.0 + ..(self.difficulty as f32).powf(1.5) + 4.0, + ) + .round() as u16, + ), ); } } else { @@ -260,19 +257,13 @@ impl Room { - 16 }) .map(|e| e as f32 / 16.0); - let turret = - EntityInfo::at(pos.map(|e| e as f32)).with_alignment(comp::Alignment::Enemy); match self.difficulty { 3 => { - let turret = turret - .with_body(comp::Body::Object(comp::object::Body::HaniwaSentry)) - .with_asset_expect("common.entity.dungeon.tier-3.sentry"); + let turret = turret_3(pos); supplement.add_entity(turret); }, 5 => { - let turret = turret - .with_body(comp::Body::Object(comp::object::Body::Crossbow)) - .with_asset_expect("common.entity.dungeon.tier-5.turret"); + let turret = turret_5(pos); supplement.add_entity(turret); }, _ => {}, @@ -311,17 +302,15 @@ impl Room { for entity in entities { supplement.add_entity( - entity - .with_level( - dynamic_rng - .gen_range( - (self.difficulty as f32).powf(1.25) + 3.0 - ..(self.difficulty as f32).powf(1.5) + 4.0, - ) - .round() as u16 - * 5, - ) - .with_alignment(comp::Alignment::Enemy), + entity.with_level( + dynamic_rng + .gen_range( + (self.difficulty as f32).powf(1.25) + 3.0 + ..(self.difficulty as f32).powf(1.5) + 4.0, + ) + .round() as u16 + * 5, + ), ); } } @@ -357,17 +346,15 @@ impl Room { for entity in entities { supplement.add_entity( - entity - .with_level( - dynamic_rng - .gen_range( - (self.difficulty as f32).powf(1.25) + 3.0 - ..(self.difficulty as f32).powf(1.5) + 4.0, - ) - .round() as u16 - * 5, - ) - .with_alignment(comp::Alignment::Enemy), + entity.with_level( + dynamic_rng + .gen_range( + (self.difficulty as f32).powf(1.25) + 3.0 + ..(self.difficulty as f32).powf(1.5) + 4.0, + ) + .round() as u16 + * 5, + ), ); } } @@ -789,6 +776,14 @@ fn enemy_fallback(dynamic_rng: &mut impl Rng, tile_wcenter: Vec3) -> Vec) -> EntityInfo { + EntityInfo::at(pos).with_asset_expect("common.entity.dungeon.tier-3.sentry") +} + +fn turret_5(pos: Vec3) -> EntityInfo { + EntityInfo::at(pos).with_asset_expect("common.entity.dungeon.tier-5.turret") +} + fn boss_0(tile_wcenter: Vec3) -> Vec { vec![ EntityInfo::at(tile_wcenter.map(|e| e as f32)) @@ -1441,4 +1436,11 @@ mod tests { mini_boss_5(&mut dynamic_rng, tile_wcenter); mini_boss_fallback(tile_wcenter); } + + #[test] + fn test_creating_turrets() { + let pos = Vec3::new(0.0, 0.0, 0.0); + turret_3(pos); + turret_5(pos); + } }