mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Merge branch 'qsto/chests-cleanup' into 'master'
Qsto/chests cleanup See merge request veloren/veloren!4039
This commit is contained in:
commit
8abb93040c
@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
- Axe
|
||||
- Combat music toggle
|
||||
- Spawn rtsim wyverns that travel the world, providing dragon scale loot drops
|
||||
- Hardwood in tropical forests, frostwood in cold forests, and iron wood on the top of giant trees
|
||||
|
||||
### Changed
|
||||
|
||||
|
@ -3,10 +3,10 @@
|
||||
name: Name("Beastmaster"),
|
||||
body: RandomWith("humanoid"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-5.miniboss"),
|
||||
loot: LootTable("common.loot_tables.dungeon.cultist.miniboss"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.dungeon.tier-5.beastmaster"),
|
||||
inherit: Asset("common.loadout.dungeon.cultist.beastmaster"),
|
||||
active_hands: InHands((Choice([
|
||||
(1, Item("common.items.weapons.axe.malachite_axe-0")),
|
||||
(1, ModularWeapon(tool: Sword, material: Bloodsteel, hands: Two)),
|
@ -3,7 +3,7 @@
|
||||
name: Name("Mindflayer"),
|
||||
body: RandomWith("mindflayer"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-5.boss"),
|
||||
loot: LootTable("common.loot_tables.dungeon.cultist.boss"),
|
||||
inventory: (
|
||||
loadout: FromBody,
|
||||
),
|
@ -3,10 +3,10 @@
|
||||
name: Name("Cultist"),
|
||||
body: RandomWith("humanoid"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-5.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.cultist.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.dungeon.tier-5.cultist"),
|
||||
inherit: Asset("common.loadout.dungeon.cultist.cultist"),
|
||||
active_hands: InHands((Choice([
|
||||
(2, ModularWeapon(tool: Axe, material: Orichalcum, hands: One)),
|
||||
(4, Item("common.items.weapons.sword.cultist")),
|
@ -3,7 +3,7 @@
|
||||
name: Name("Tamed Darkhound"),
|
||||
body: RandomWith("darkhound"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-5.minion"),
|
||||
loot: LootTable("common.loot_tables.dungeon.cultist.minion"),
|
||||
inventory: (
|
||||
loadout: FromBody,
|
||||
),
|
@ -3,9 +3,9 @@
|
||||
name: Name("Cultist Husk"),
|
||||
body: RandomWith("husk"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-5.minion"),
|
||||
loot: LootTable("common.loot_tables.dungeon.cultist.minion"),
|
||||
inventory: (
|
||||
loadout: Asset("common.loadout.dungeon.tier-5.husk"),
|
||||
loadout: Asset("common.loadout.dungeon.cultist.husk"),
|
||||
),
|
||||
meta: [],
|
||||
)
|
@ -3,7 +3,7 @@
|
||||
name: Name("Husk Brute"),
|
||||
body: RandomWith("husk_brute"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-5.miniboss"),
|
||||
loot: LootTable("common.loot_tables.dungeon.cultist.miniboss"),
|
||||
inventory: (
|
||||
loadout: FromBody,
|
||||
),
|
@ -3,10 +3,10 @@
|
||||
name: Name("Cultist Warlock"),
|
||||
body: RandomWith("cultist_warlock"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-5.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.cultist.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.dungeon.tier-5.warlock"),
|
||||
inherit: Asset("common.loadout.dungeon.cultist.warlock"),
|
||||
active_hands: InHands((Choice([
|
||||
(1, Item("common.items.npc_weapons.staff.bipedlarge-cultist")),
|
||||
(1, Item("common.items.npc_weapons.bow.bipedlarge-velorite")),
|
@ -3,10 +3,10 @@
|
||||
name: Name("Cultist Warlord"),
|
||||
body: RandomWith("cultist_warlord"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-5.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.cultist.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.dungeon.tier-5.warlord"),
|
||||
inherit: Asset("common.loadout.dungeon.cultist.warlord"),
|
||||
active_hands: InHands((Choice([
|
||||
(1, Item("common.items.npc_weapons.sword.bipedlarge-cultist")),
|
||||
(1, Item("common.items.npc_weapons.hammer.bipedlarge-cultist")),
|
@ -3,10 +3,10 @@
|
||||
name: Name("Myrmidon Hoplite"),
|
||||
body: RandomWith("myrmidon"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-4.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.myrmidon.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.dungeon.tier-4.hoplite"),
|
||||
inherit: Asset("common.loadout.dungeon.myrmidon.hoplite"),
|
||||
active_hands: InHands((Item("common.items.npc_weapons.biped_small.myrmidon.hoplite"), None)),
|
||||
)),
|
||||
),
|
||||
|
@ -3,10 +3,10 @@
|
||||
name: Name("Myrmidon Marksman"),
|
||||
body: RandomWith("myrmidon"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-4.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.myrmidon.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.dungeon.tier-4.marksman"),
|
||||
inherit: Asset("common.loadout.dungeon.myrmidon.marksman"),
|
||||
active_hands: InHands((Item("common.items.npc_weapons.biped_small.myrmidon.marksman"), None)),
|
||||
)),
|
||||
),
|
||||
|
@ -3,10 +3,10 @@
|
||||
name: Name("Myrmidon Sniper"),
|
||||
body: RandomWith("myrmidon"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-4.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.myrmidon.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.dungeon.tier-4.marksman"),
|
||||
inherit: Asset("common.loadout.dungeon.myrmidon.marksman"),
|
||||
active_hands: InHands((Item("common.items.npc_weapons.biped_small.myrmidon.marksman"), None)),
|
||||
)),
|
||||
),
|
||||
|
@ -3,10 +3,10 @@
|
||||
name: Name("Myrmidon Strategian"),
|
||||
body: RandomWith("myrmidon"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-4.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.myrmidon.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.dungeon.tier-4.strategian"),
|
||||
inherit: Asset("common.loadout.dungeon.myrmidon.strategian"),
|
||||
active_hands: InHands((Item("common.items.npc_weapons.biped_small.myrmidon.strategian"), None)),
|
||||
)),
|
||||
),
|
||||
|
@ -3,10 +3,10 @@
|
||||
name: Name("Haniwa Archer"),
|
||||
body: RandomWith("haniwa"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-3.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.haniwa.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.dungeon.tier-3.archer"),
|
||||
inherit: Asset("common.loadout.dungeon.haniwa.archer"),
|
||||
active_hands: InHands((Item("common.items.npc_weapons.biped_small.haniwa.archer"), None)),
|
||||
)),
|
||||
),
|
@ -3,7 +3,7 @@
|
||||
name: Name("Clay Golem"),
|
||||
body: RandomWith("claygolem"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-3.boss"),
|
||||
loot: LootTable("common.loot_tables.dungeon.haniwa.boss"),
|
||||
inventory: (
|
||||
loadout: FromBody,
|
||||
),
|
@ -3,10 +3,10 @@
|
||||
name: Name("Haniwa Guard"),
|
||||
body: RandomWith("haniwa"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-3.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.haniwa.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.dungeon.tier-3.guard"),
|
||||
inherit: Asset("common.loadout.dungeon.haniwa.guard"),
|
||||
active_hands: InHands((Item("common.items.npc_weapons.biped_small.haniwa.guard"), None)),
|
||||
)),
|
||||
),
|
@ -3,10 +3,10 @@
|
||||
name: Name("Haniwa Soldier"),
|
||||
body: RandomWith("haniwa"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-3.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.haniwa.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.dungeon.tier-3.soldier"),
|
||||
inherit: Asset("common.loadout.dungeon.haniwa.soldier"),
|
||||
active_hands: InHands((Item("common.items.npc_weapons.biped_small.haniwa.soldier"), None)),
|
||||
)),
|
||||
),
|
@ -3,7 +3,7 @@
|
||||
name: Name("Minotaur"),
|
||||
body: RandomWith("minotaur"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-4.boss"),
|
||||
loot: LootTable("common.loot_tables.dungeon.myrmidon.boss"),
|
||||
inventory: (
|
||||
loadout: FromBody,
|
||||
),
|
@ -3,10 +3,10 @@
|
||||
name: Name("Myrmidon Hoplite"),
|
||||
body: RandomWith("myrmidon"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-4.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.myrmidon.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.dungeon.tier-4.hoplite"),
|
||||
inherit: Asset("common.loadout.dungeon.myrmidon.hoplite"),
|
||||
active_hands: InHands((Item("common.items.npc_weapons.biped_small.myrmidon.hoplite"), None)),
|
||||
)),
|
||||
),
|
@ -3,10 +3,10 @@
|
||||
name: Name("Myrmidon Marksman"),
|
||||
body: RandomWith("myrmidon"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-4.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.myrmidon.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.dungeon.tier-4.marksman"),
|
||||
inherit: Asset("common.loadout.dungeon.myrmidon.marksman"),
|
||||
active_hands: InHands((Item("common.items.npc_weapons.biped_small.myrmidon.marksman"), None)),
|
||||
)),
|
||||
),
|
@ -3,7 +3,7 @@
|
||||
name: Automatic,
|
||||
body: RandomWith("cyclops"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-4.miniboss"),
|
||||
loot: LootTable("common.loot_tables.dungeon.myrmidon.miniboss"),
|
||||
inventory: (
|
||||
loadout: FromBody,
|
||||
),
|
@ -3,10 +3,10 @@
|
||||
name: Name("Myrmidon Strategian"),
|
||||
body: RandomWith("myrmidon"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-4.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.myrmidon.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.dungeon.tier-4.strategian"),
|
||||
inherit: Asset("common.loadout.dungeon.myrmidon.strategian"),
|
||||
active_hands: InHands((Item("common.items.npc_weapons.biped_small.myrmidon.strategian"), None)),
|
||||
)),
|
||||
),
|
@ -3,7 +3,7 @@
|
||||
name: Name("Tidal Warrior"),
|
||||
body: RandomWith("tidalwarrior"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-2.boss"),
|
||||
loot: LootTable("common.loot_tables.dungeon.sahagin.boss"),
|
||||
inventory: (
|
||||
loadout: FromBody,
|
||||
),
|
@ -3,10 +3,10 @@
|
||||
name: Name("Sahagin Sniper"),
|
||||
body: RandomWith("sahagin"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-2.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.sahagin.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.dungeon.tier-2.sniper"),
|
||||
inherit: Asset("common.loadout.dungeon.sahagin.sniper"),
|
||||
active_hands: InHands((Item("common.items.npc_weapons.biped_small.sahagin.sniper"), None)),
|
||||
)),
|
||||
),
|
@ -3,10 +3,10 @@
|
||||
name: Name("Sahagin Sorcerer"),
|
||||
body: RandomWith("sahagin"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-2.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.sahagin.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.dungeon.tier-2.sorcerer"),
|
||||
inherit: Asset("common.loadout.dungeon.sahagin.sorcerer"),
|
||||
active_hands: InHands((Item("common.items.npc_weapons.biped_small.sahagin.sorcerer"), None)),
|
||||
)),
|
||||
),
|
@ -3,10 +3,10 @@
|
||||
name: Name("Sahagin Spearman"),
|
||||
body: RandomWith("sahagin"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-2.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.sahagin.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.dungeon.tier-2.spearman"),
|
||||
inherit: Asset("common.loadout.dungeon.sahagin.spearman"),
|
||||
active_hands: InHands((Item("common.items.npc_weapons.biped_small.sahagin.spearman"), None)),
|
||||
)),
|
||||
),
|
@ -3,7 +3,7 @@
|
||||
name: Name("Gnome"),
|
||||
body: RandomWith("gnome"),
|
||||
alignment: Alignment(Wild),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-4.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.myrmidon.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.spots.gnome"),
|
||||
|
@ -3,7 +3,7 @@
|
||||
name: Name("Adept"),
|
||||
body: RandomWith("humanoid"),
|
||||
alignment: Alignment(Npc),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-5.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.cultist.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.spots.wizard_tower.wizard_low"),
|
||||
|
@ -3,7 +3,7 @@
|
||||
name: Name("Novice"),
|
||||
body: RandomWith("humanoid"),
|
||||
alignment: Alignment(Npc),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-5.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.cultist.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.spots.wizard_tower.wizard_low"),
|
||||
|
@ -3,7 +3,7 @@
|
||||
name: Name("Overseer"),
|
||||
body: RandomWith("cultist_warlock"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-5.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.cultist.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.spots.wizard_tower.wizard_overseer"),
|
||||
|
@ -3,7 +3,7 @@
|
||||
name: Name("Overseer"),
|
||||
body: RandomWith("cultist_warlock"),
|
||||
alignment: Alignment(Enemy),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-5.enemy"),
|
||||
loot: LootTable("common.loot_tables.dungeon.cultist.enemy"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.spots.wizard_tower.wizard_spellbinder"),
|
||||
|
@ -4,7 +4,7 @@
|
||||
name: Name("Argo"),
|
||||
body: RandomWith("humanoid"),
|
||||
alignment: Alignment(Npc),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-5.miniboss"),
|
||||
loot: LootTable("common.loot_tables.dungeon.cultist.miniboss"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.spots.wizard_tower.wizard_boss"),
|
||||
|
@ -4,7 +4,7 @@
|
||||
name: Name("Haku"),
|
||||
body: RandomWith("humanoid"),
|
||||
alignment: Alignment(Npc),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-5.miniboss"),
|
||||
loot: LootTable("common.loot_tables.dungeon.cultist.miniboss"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.spots.wizard_tower.wizard_boss"),
|
||||
|
@ -4,7 +4,7 @@
|
||||
name: Name("Trish"),
|
||||
body: RandomWith("humanoid"),
|
||||
alignment: Alignment(Npc),
|
||||
loot: LootTable("common.loot_tables.dungeon.tier-5.miniboss"),
|
||||
loot: LootTable("common.loot_tables.dungeon.cultist.miniboss"),
|
||||
inventory: (
|
||||
loadout: Inline((
|
||||
inherit: Asset("common.loadout.spots.wizard_tower.wizard_boss"),
|
||||
|
@ -7,5 +7,9 @@
|
||||
(1.0, Item("common.items.armor.cultist.shoulder")),
|
||||
(1.0, Item("common.items.armor.cultist.bandana")),
|
||||
(1.0, Item("common.items.armor.misc.back.dungeon_purple")),
|
||||
(1.0, Item("common.items.armor.cultist.necklace")),
|
||||
(1, All([
|
||||
Item("common.items.armor.cultist.necklace"),
|
||||
MultiDrop(Item("common.items.armor.cultist.ring"), 2, 2),
|
||||
],
|
||||
)),
|
||||
]
|
@ -3,7 +3,7 @@
|
||||
Item("common.items.crafting_ing.animal_misc.grim_eyeball"),
|
||||
MultiDrop(Item("common.items.mineral.ingot.iron"), 5, 10),
|
||||
MultiDrop(Item("common.items.utility.coins"), 200, 500),
|
||||
LootTable("common.loot_tables.dungeon.tier-4.miniboss"),
|
||||
LootTable("common.loot_tables.dungeon.myrmidon.miniboss"),
|
||||
],
|
||||
)),
|
||||
]
|
@ -1,7 +1,7 @@
|
||||
[
|
||||
(1, All([
|
||||
MultiDrop(Item("common.items.utility.coins"), 200, 500),
|
||||
LootTable("common.loot_tables.dungeon.tier-4.miniboss"),
|
||||
LootTable("common.loot_tables.dungeon.myrmidon.miniboss"),
|
||||
MultiDrop(LootTable("common.loot_tables.gliders"), 0, 1),
|
||||
],
|
||||
)),
|
||||
|
@ -1,7 +1,7 @@
|
||||
[
|
||||
(12.0, Item("common.items.log.wood")),
|
||||
(6.0, Item("common.items.flowers.plant_fiber")),
|
||||
(6.0, Item("common.items.crafting_ing.resin")),
|
||||
(5.0, Item("common.items.crafting_ing.animal_misc.grim_eyeball")),
|
||||
(1.0, Item("common.items.armor.misc.head.bamboo_twig")),
|
||||
(2.0, MultiDrop(Item("common.items.log.wood"), 1, 3)),
|
||||
(1.0, Item("common.items.log.hardwood")),
|
||||
(2.0, Item("common.items.flowers.plant_fiber")),
|
||||
(2.0, Item("common.items.crafting_ing.resin")),
|
||||
(1.0, Item("common.items.crafting_ing.animal_misc.grim_eyeball")),
|
||||
]
|
@ -1,17 +1,15 @@
|
||||
[
|
||||
// Gear
|
||||
(0.5, LootTable("common.loot_tables.weapons.components.tier-1")),
|
||||
(0.5, LootTable("common.loot_tables.armor.tier-1")),
|
||||
(0.25, LootTable("common.loot_tables.armor.tier-1")),
|
||||
(0.25, LootTable("common.loot_tables.weapons.tier-1")),
|
||||
(0.25, Item("common.items.armor.misc.head.hog_hood")),
|
||||
// Currency
|
||||
(3.0, MultiDrop(Item("common.items.utility.coins"), 50, 100)),
|
||||
// Materials
|
||||
(2.0, MultiDrop(Item("common.items.mineral.ore.veloritefrag"), 3, 10)),
|
||||
(1.0, MultiDrop(Item("common.items.crafting_ing.cloth.wool"), 3, 10)),
|
||||
(1.0, MultiDrop(Item("common.items.crafting_ing.leather.thick_leather"), 3, 10)),
|
||||
(1.0, MultiDrop(Item("common.items.mineral.ingot.iron"), 3, 10)),
|
||||
(1.0, MultiDrop(Item("common.items.log.bamboo"), 3, 10)),
|
||||
// Gems
|
||||
(0.15, Item("common.items.mineral.gem.sapphire")),
|
||||
(0.15, Item("common.items.mineral.gem.emerald")),
|
||||
(0.15, Item("common.items.mineral.gem.ruby")),
|
||||
// Consumables
|
||||
(2.0, MultiDrop(Item("common.items.consumable.potion_minor"), 2, 5)),
|
||||
// Food
|
||||
|
@ -6,7 +6,7 @@
|
||||
(0.25, MultiDrop(Item("common.items.crafting_ing.animal_misc.fur"), 1, 2)),
|
||||
(0.25, MultiDrop(Item("common.items.crafting_ing.leather.thick_leather"), 1, 2)),
|
||||
// Utilities
|
||||
(0.1, Item("common.items.lantern.blue_0")),
|
||||
(0.05, Item("common.items.lantern.blue_0")),
|
||||
(0.05, Item("common.items.tool.pickaxe_steel")),
|
||||
// Nothing
|
||||
(0.75, Nothing),
|
||||
|
@ -11,7 +11,7 @@
|
||||
// Legendary weapons
|
||||
(1.0, LootTable("common.loot_tables.weapons.legendary_ranged")),
|
||||
// Crafting material
|
||||
// Allow for DS and Eldwood to drop till entity droppers are implemented
|
||||
// Allow for Eldwood to drop till entity droppers are implemented
|
||||
(1.0, Item("common.items.crafting_ing.mindflayer_bag_damaged")),
|
||||
(1.0, MultiDrop(Item("common.items.log.eldwood"), 2, 6)),
|
||||
]
|
12
assets/common/loot_tables/dungeon/cultist/chest.ron
Normal file
12
assets/common/loot_tables/dungeon/cultist/chest.ron
Normal file
@ -0,0 +1,12 @@
|
||||
[
|
||||
// Gear
|
||||
(0.25, LootTable("common.loot_tables.weapons.cultist")),
|
||||
(0.25, LootTable("common.loot_tables.armor.cultist")),
|
||||
// Currency
|
||||
(3.0, MultiDrop(Item("common.items.utility.coins"), 1000, 2000)),
|
||||
// Consumables
|
||||
(2.0, MultiDrop(Item("common.items.consumable.potion_minor"), 4, 8)),
|
||||
(0.1, MultiDrop(Item("common.items.food.spore_corruption"), 1, 3)),
|
||||
// Food
|
||||
(1.0, MultiDrop(LootTable("common.loot_tables.food.prepared"), 3, 6)),
|
||||
]
|
@ -6,7 +6,7 @@
|
||||
// Back
|
||||
(1.0, Item("common.items.armor.misc.back.dungeon_purple")),
|
||||
// Ring
|
||||
(0.5, Item("common.items.armor.cultist.ring")),
|
||||
(0.5, LootTable("common.loot_tables.armor.cultist")),
|
||||
// Glider
|
||||
(1.0, Item("common.items.glider.blue")),
|
||||
]
|
@ -4,7 +4,7 @@
|
||||
LootTable("common.loot_tables.dungeon.dwarven_quarry.t4"),
|
||||
MultiDrop(LootTable("common.loot_tables.dungeon.dwarven_quarry.t4-mats"), 1, 3),
|
||||
MultiDrop(Item("common.items.utility.coins"), 200, 500),
|
||||
LootTable("common.loot_tables.dungeon.tier-4.boss"),
|
||||
LootTable("common.loot_tables.dungeon.myrmidon.boss"),
|
||||
],
|
||||
)),
|
||||
]
|
@ -4,7 +4,7 @@
|
||||
LootTable("common.loot_tables.dungeon.dwarven_quarry.t4"),
|
||||
MultiDrop(LootTable("common.loot_tables.dungeon.dwarven_quarry.t4-mats"), 1, 3),
|
||||
MultiDrop(Item("common.items.utility.coins"), 200, 500),
|
||||
LootTable("common.loot_tables.dungeon.tier-4.boss"),
|
||||
LootTable("common.loot_tables.dungeon.myrmidon.boss"),
|
||||
],
|
||||
)),
|
||||
]
|
@ -3,17 +3,11 @@
|
||||
(0.5, LootTable("common.loot_tables.weapons.components.tier-0")),
|
||||
(0.25, LootTable("common.loot_tables.weapons.tier-0")),
|
||||
(0.25, LootTable("common.loot_tables.armor.tier-0")),
|
||||
(0.25, Item("common.items.armor.misc.head.bamboo_twig")),
|
||||
// Currency
|
||||
(2.0, MultiDrop(Item("common.items.utility.coins"), 25, 50)),
|
||||
(3.0, MultiDrop(Item("common.items.utility.coins"), 25, 50)),
|
||||
// Materials
|
||||
(1.0, MultiDrop(Item("common.items.crafting_ing.cloth.linen"), 3, 10)),
|
||||
(1.0, MultiDrop(Item("common.items.crafting_ing.leather.simple_leather"), 3, 10)),
|
||||
(1.0, MultiDrop(Item("common.items.mineral.ingot.bronze"), 3, 10)),
|
||||
(1.0, MultiDrop(Item("common.items.log.wood"), 3, 10)),
|
||||
// Gems
|
||||
(0.1, Item("common.items.mineral.gem.sapphire")),
|
||||
(0.1, Item("common.items.mineral.gem.emerald")),
|
||||
(0.1, Item("common.items.mineral.gem.ruby")),
|
||||
(0.5, MultiDrop(Item("common.items.mineral.ore.veloritefrag"), 5, 10)),
|
||||
// Consumables
|
||||
(2.0, MultiDrop(Item("common.items.consumable.potion_minor"), 2, 5)),
|
||||
// Food
|
||||
|
@ -6,6 +6,7 @@
|
||||
// Misc
|
||||
(3.0, Item("common.items.armor.misc.neck.scratched")),
|
||||
(2.0, Item("common.items.armor.misc.head.wanderers_hat")),
|
||||
(3.0, Item("common.items.armor.misc.head.bamboo_twig")),
|
||||
// Chieftain Mask
|
||||
(1.0, Item("common.items.armor.misc.head.gnarling_mask")),
|
||||
// Indirect crafting materials for T2 gear
|
||||
|
12
assets/common/loot_tables/dungeon/haniwa/chest.ron
Normal file
12
assets/common/loot_tables/dungeon/haniwa/chest.ron
Normal file
@ -0,0 +1,12 @@
|
||||
[
|
||||
// Gear
|
||||
(0.5, LootTable("common.loot_tables.weapons.components.tier-3")),
|
||||
(0.25, LootTable("common.loot_tables.weapons.tier-3")),
|
||||
(0.25, LootTable("common.loot_tables.armor.tier-3")),
|
||||
// Currency
|
||||
(3.0, MultiDrop(Item("common.items.utility.coins"), 250, 500)),
|
||||
// Consumables
|
||||
(2.0, MultiDrop(Item("common.items.consumable.potion_minor"), 2, 5)),
|
||||
// Food
|
||||
(1.0, MultiDrop(LootTable("common.loot_tables.food.prepared"), 2, 4)),
|
||||
]
|
@ -7,6 +7,6 @@
|
||||
// Legendary weapons
|
||||
(1.0, LootTable("common.loot_tables.weapons.legendary_melee")),
|
||||
// Crafting material
|
||||
// Allow for DS and Eldwood to drop till entity droppers are implemented
|
||||
// Allow for Eldwood to drop till entity droppers are implemented
|
||||
(1.0, MultiDrop(Item("common.items.log.eldwood"), 2, 6)),
|
||||
]
|
13
assets/common/loot_tables/dungeon/myrmidon/chest.ron
Normal file
13
assets/common/loot_tables/dungeon/myrmidon/chest.ron
Normal file
@ -0,0 +1,13 @@
|
||||
[
|
||||
// Gear
|
||||
(0.5, LootTable("common.loot_tables.weapons.components.tier-4")),
|
||||
(0.25, LootTable("common.loot_tables.weapons.tier-4")),
|
||||
(0.25, LootTable("common.loot_tables.armor.tier-4")),
|
||||
(0.1, Item("common.items.armor.misc.head.spikeguard")),
|
||||
// Currency
|
||||
(3.0, MultiDrop(Item("common.items.utility.coins"), 500, 1000)),
|
||||
// Consumables
|
||||
(2.0, MultiDrop(Item("common.items.consumable.potion_minor"), 4, 8)),
|
||||
// Food
|
||||
(1.0, MultiDrop(LootTable("common.loot_tables.food.prepared"), 2, 5)),
|
||||
]
|
@ -11,7 +11,6 @@
|
||||
// Gear
|
||||
(2.0, Item("common.items.armor.misc.head.mitre")),
|
||||
// Crafting material
|
||||
// Allow for DS and Eldwood to drop till entity droppers are implemented
|
||||
(1.0, MultiDrop(Item("common.items.crafting_ing.hide.dragon_scale"), 2, 4)),
|
||||
// Allow for Eldwood to drop till entity droppers are implemented
|
||||
(1.0, MultiDrop(Item("common.items.log.eldwood"), 2, 4)),
|
||||
]
|
12
assets/common/loot_tables/dungeon/sahagin/chest.ron
Normal file
12
assets/common/loot_tables/dungeon/sahagin/chest.ron
Normal file
@ -0,0 +1,12 @@
|
||||
[
|
||||
// Gear
|
||||
(0.5, LootTable("common.loot_tables.weapons.components.tier-2")),
|
||||
(0.25, LootTable("common.loot_tables.weapons.tier-2")),
|
||||
(0.25, LootTable("common.loot_tables.armor.tier-2")),
|
||||
// Currency
|
||||
(3.0, MultiDrop(Item("common.items.utility.coins"), 100, 250)),
|
||||
// Consumables
|
||||
(2.0, MultiDrop(Item("common.items.consumable.potion_minor"), 2, 5)),
|
||||
// Food
|
||||
(1.0, MultiDrop(LootTable("common.loot_tables.food.prepared"), 1, 4)),
|
||||
]
|
@ -1,17 +0,0 @@
|
||||
[
|
||||
// Gear
|
||||
(0.5, LootTable("common.loot_tables.weapons.components.tier-2")),
|
||||
(0.5, LootTable("common.loot_tables.weapons.tier-2")),
|
||||
(0.5, LootTable("common.loot_tables.armor.tier-2")),
|
||||
// Currency
|
||||
(3.0, MultiDrop(Item("common.items.utility.coins"), 100, 250)),
|
||||
// Materials
|
||||
(1.0, MultiDrop(Item("common.items.crafting_ing.cloth.silk"), 3, 10)),
|
||||
(1.0, MultiDrop(Item("common.items.crafting_ing.hide.scales"), 3, 10)),
|
||||
(1.0, MultiDrop(Item("common.items.mineral.ingot.steel"), 3, 10)),
|
||||
(1.0, MultiDrop(Item("common.items.log.hardwood"), 3, 10)),
|
||||
// Consumables
|
||||
(2.0, MultiDrop(Item("common.items.consumable.potion_minor"), 2, 5)),
|
||||
// Food
|
||||
(1.0, MultiDrop(LootTable("common.loot_tables.food.prepared"), 1, 4)),
|
||||
]
|
@ -1,19 +0,0 @@
|
||||
[
|
||||
// Gear
|
||||
(0.5, LootTable("common.loot_tables.weapons.components.tier-3")),
|
||||
(0.5, LootTable("common.loot_tables.weapons.tier-3")),
|
||||
(0.5, LootTable("common.loot_tables.armor.tier-3")),
|
||||
// Currency
|
||||
(3.0, MultiDrop(Item("common.items.utility.coins"), 250, 500)),
|
||||
// Materials
|
||||
// Allow ironwood to have higher drops till entity droppers are implemented
|
||||
(1.0, MultiDrop(Item("common.items.crafting_ing.cloth.lifecloth"), 2, 6)),
|
||||
(1.0, MultiDrop(Item("common.items.crafting_ing.hide.carapace"), 2, 6)),
|
||||
(1.0, MultiDrop(Item("common.items.mineral.ingot.cobalt"), 2, 6)),
|
||||
(1.0, MultiDrop(Item("common.items.log.ironwood"), 3, 7)),
|
||||
(2.0, MultiDrop(Item("common.items.mineral.ore.velorite"), 3, 10)),
|
||||
// Consumables
|
||||
(2.0, MultiDrop(Item("common.items.consumable.potion_minor"), 2, 5)),
|
||||
// Food
|
||||
(1.0, MultiDrop(LootTable("common.loot_tables.food.prepared"), 2, 4)),
|
||||
]
|
@ -1,19 +0,0 @@
|
||||
[
|
||||
// Gear
|
||||
(0.5, LootTable("common.loot_tables.weapons.components.tier-4")),
|
||||
(0.5, LootTable("common.loot_tables.weapons.tier-4")),
|
||||
(0.5, LootTable("common.loot_tables.armor.tier-4")),
|
||||
(0.5, Item("common.items.armor.misc.head.spikeguard")),
|
||||
// Currency
|
||||
(3.0, MultiDrop(Item("common.items.utility.coins"), 500, 1000)),
|
||||
// Materials
|
||||
// Allow frostwood to have higher drops till entity droppers are implemented
|
||||
(1.0, MultiDrop(Item("common.items.crafting_ing.cloth.moonweave"), 1, 5)),
|
||||
(1.0, MultiDrop(Item("common.items.crafting_ing.hide.plate"), 1, 5)),
|
||||
(1.0, MultiDrop(Item("common.items.mineral.ingot.bloodsteel"), 1, 5)),
|
||||
(1.0, MultiDrop(Item("common.items.log.frostwood"), 3, 6)),
|
||||
// Consumables
|
||||
(2.0, MultiDrop(Item("common.items.consumable.potion_minor"), 4, 8)),
|
||||
// Food
|
||||
(1.0, MultiDrop(LootTable("common.loot_tables.food.prepared"), 2, 5)),
|
||||
]
|
@ -1,19 +0,0 @@
|
||||
[
|
||||
// Gear
|
||||
(0.5, LootTable("common.loot_tables.weapons.components.tier-5")),
|
||||
(0.5, LootTable("common.loot_tables.weapons.tier-5")),
|
||||
(0.5, LootTable("common.loot_tables.armor.tier-5")),
|
||||
(0.1, Item("common.items.armor.cultist.bandana")),
|
||||
// Currency
|
||||
(3.0, MultiDrop(Item("common.items.utility.coins"), 1000, 5000)),
|
||||
// Materials
|
||||
(1.0, MultiDrop(Item("common.items.crafting_ing.cloth.moonweave"), 1, 5)),
|
||||
(1.0, MultiDrop(Item("common.items.crafting_ing.hide.plate"), 1, 5)),
|
||||
(1.0, MultiDrop(Item("common.items.mineral.ingot.bloodsteel"), 1, 5)),
|
||||
(1.0, MultiDrop(Item("common.items.log.frostwood"), 1, 5)),
|
||||
// Consumables
|
||||
(2.0, MultiDrop(Item("common.items.consumable.potion_minor"), 4, 8)),
|
||||
(0.1, MultiDrop(Item("common.items.food.spore_corruption"), 1, 3)),
|
||||
// Food
|
||||
(1.0, MultiDrop(LootTable("common.loot_tables.food.prepared"), 3, 6)),
|
||||
]
|
@ -2,11 +2,11 @@
|
||||
|
||||
[
|
||||
(
|
||||
specifier: "world.structure.natural.gnarling_tree",
|
||||
specifier: "world.structure.natural.fallen_tree",
|
||||
center: (32, 28, 15),
|
||||
/// ( X, Y, Z, )
|
||||
custom_indices: {
|
||||
48: Sprite(Chest),
|
||||
48: Sprite(Bones),
|
||||
},
|
||||
),
|
||||
]
|
@ -1049,7 +1049,7 @@ impl LoadoutBuilder {
|
||||
let rng = &mut rand::thread_rng();
|
||||
match preset {
|
||||
Preset::HuskSummon => {
|
||||
self = self.with_asset_expect("common.loadout.dungeon.tier-5.husk", rng);
|
||||
self = self.with_asset_expect("common.loadout.dungeon.cultist.husk", rng);
|
||||
},
|
||||
Preset::BorealSummon => {
|
||||
self = self.with_asset_expect("common.loadout.world.boreal.boreal_warrior", rng);
|
||||
|
@ -1172,7 +1172,7 @@ mod tests {
|
||||
assert!((lootsum3 - 1.0).abs() < 1e-5);
|
||||
|
||||
// includes tier-5 modular weapons
|
||||
let loot4 = expand_loot_table("common.loot_tables.dungeon.tier-4.boss");
|
||||
let loot4 = expand_loot_table("common.loot_tables.dungeon.myrmidon.boss");
|
||||
let lootsum4 = loot4.iter().fold(0.0, |s, i| s + i.0);
|
||||
//tracing::trace!("{:?} {}", loot4, lootsum4);
|
||||
assert!((lootsum4 - 1.0).abs() < 1e-5);
|
||||
|
@ -522,12 +522,12 @@ impl SpriteKind {
|
||||
SpriteKind::Bomb => item("common.items.utility.bomb"),
|
||||
SpriteKind::DungeonChest0 => table("common.loot_tables.dungeon.gnarling.chest"),
|
||||
SpriteKind::DungeonChest1 => table("common.loot_tables.dungeon.adlet.chest"),
|
||||
SpriteKind::DungeonChest2 => table("common.loot_tables.dungeon.tier-2.chest"),
|
||||
SpriteKind::DungeonChest3 => table("common.loot_tables.dungeon.tier-3.chest"),
|
||||
SpriteKind::DungeonChest4 => table("common.loot_tables.dungeon.tier-4.chest"),
|
||||
SpriteKind::DungeonChest5 => table("common.loot_tables.dungeon.tier-5.chest"),
|
||||
SpriteKind::DungeonChest2 => table("common.loot_tables.dungeon.sahagin.chest"),
|
||||
SpriteKind::DungeonChest3 => table("common.loot_tables.dungeon.haniwa.chest"),
|
||||
SpriteKind::DungeonChest4 => table("common.loot_tables.dungeon.myrmidon.chest"),
|
||||
SpriteKind::DungeonChest5 => table("common.loot_tables.dungeon.cultist.chest"),
|
||||
SpriteKind::Chest => table("common.loot_tables.sprite.chest"),
|
||||
SpriteKind::CommonLockedChest => table("common.loot_tables.dungeon.tier-2.chest"),
|
||||
SpriteKind::CommonLockedChest => table("common.loot_tables.dungeon.sahagin.chest"),
|
||||
SpriteKind::ChestBuried => table("common.loot_tables.sprite.chest-buried"),
|
||||
SpriteKind::CoralChest => table("common.loot_tables.dungeon.sea_chapel.chest_coral"),
|
||||
SpriteKind::Mud => table("common.loot_tables.sprite.mud"),
|
||||
|
@ -49,7 +49,7 @@ fn humanoid_config(profession: &Profession) -> &'static str {
|
||||
Profession::Chef => "common.entity.village.chef",
|
||||
Profession::Alchemist => "common.entity.village.alchemist",
|
||||
Profession::Pirate => "common.entity.spot.pirate",
|
||||
Profession::Cultist => "common.entity.dungeon.tier-5.cultist",
|
||||
Profession::Cultist => "common.entity.dungeon.cultist.cultist",
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -65,7 +65,7 @@ pub const CONFIG: Config = Config {
|
||||
tropical_temp: 0.4,
|
||||
desert_temp: 0.8,
|
||||
// humidity
|
||||
desert_hum: 0.15,
|
||||
desert_hum: 0.0,
|
||||
forest_hum: 0.5,
|
||||
jungle_hum: 0.75,
|
||||
// water
|
||||
|
@ -29,6 +29,7 @@ pub fn density_factor_by_altitude(lower_limit: f32, altitude: f32, upper_limit:
|
||||
|
||||
const MUSH_FACT: f32 = 1.0e-4; // To balance things around the mushroom spawning rate
|
||||
const GRASS_FACT: f32 = 1.0e-3; // To balance things around the grass spawning rate
|
||||
const TREE_FACT: f32 = 0.15e-3; // To balance things around the wood spawning rate
|
||||
const DEPTH_WATER_NORM: f32 = 15.0; // Water depth at which regular underwater sprites start spawning
|
||||
pub fn apply_scatter_to(canvas: &mut Canvas, _rng: &mut impl Rng, calendar: Option<&Calendar>) {
|
||||
enum WaterMode {
|
||||
@ -312,7 +313,7 @@ pub fn apply_scatter_to(canvas: &mut Canvas, _rng: &mut impl Rng, calendar: Opti
|
||||
permit: |b| matches!(b, BlockKind::Grass),
|
||||
f: |_, col| {
|
||||
(
|
||||
(col.tree_density * 1.25 - 0.25).powf(0.5).max(0.0) * 0.75e-3,
|
||||
(col.tree_density * 1.25 - 0.25).powf(0.5).max(0.0) * TREE_FACT * 5.0,
|
||||
None,
|
||||
)
|
||||
},
|
||||
@ -324,7 +325,45 @@ pub fn apply_scatter_to(canvas: &mut Canvas, _rng: &mut impl Rng, calendar: Opti
|
||||
permit: |b| matches!(b, BlockKind::Grass),
|
||||
f: |_, col| {
|
||||
(
|
||||
(col.tree_density * 1.25 - 0.25).powf(0.5).max(0.0) * 0.15e-3,
|
||||
(col.tree_density * 1.25 - 0.25).powf(0.5).max(0.0) * TREE_FACT,
|
||||
None,
|
||||
)
|
||||
},
|
||||
},
|
||||
ScatterConfig {
|
||||
kind: Hardwood,
|
||||
water_mode: Ground,
|
||||
permit: |b| matches!(b, BlockKind::Grass),
|
||||
f: |_, col| {
|
||||
(
|
||||
((close(col.temp, CONFIG.tropical_temp + 0.1, 0.3).min(close(
|
||||
col.humidity,
|
||||
CONFIG.jungle_hum,
|
||||
0.4,
|
||||
)) > 0.0) as i32) as f32
|
||||
* (col.tree_density * 1.25 - 0.25).powf(0.5).max(0.0)
|
||||
* TREE_FACT
|
||||
* 0.75,
|
||||
None,
|
||||
)
|
||||
},
|
||||
},
|
||||
// This is just a placeholder for future biomes
|
||||
// Currently Ironwood has been included in the world\src\site2\plot\giant_tree.rs
|
||||
// ScatterConfig {
|
||||
// kind: Ironwood,
|
||||
// water_mode: Ground,
|
||||
// permit: |b| matches!(b, BlockKind::Wood | BlockKind::Grass),
|
||||
// f: |_, col| {
|
||||
// },
|
||||
// },
|
||||
ScatterConfig {
|
||||
kind: Frostwood,
|
||||
water_mode: Ground,
|
||||
permit: |b| matches!(b, BlockKind::Snow | BlockKind::Ice),
|
||||
f: |_, col| {
|
||||
(
|
||||
(col.tree_density * 1.25 - 0.25).powf(0.5).max(0.0) * TREE_FACT * 0.5,
|
||||
None,
|
||||
)
|
||||
},
|
||||
@ -558,9 +597,12 @@ pub fn apply_scatter_to(canvas: &mut Canvas, _rng: &mut impl Rng, calendar: Opti
|
||||
permit: |b| matches!(b, BlockKind::Grass),
|
||||
f: |_, col| {
|
||||
(
|
||||
close(col.temp, 1.0, 0.95).min(close(col.humidity, 0.0, 0.3))
|
||||
* MUSH_FACT
|
||||
* 0.35,
|
||||
close(col.temp, CONFIG.desert_temp, 0.25).min(close(
|
||||
col.humidity,
|
||||
CONFIG.desert_hum,
|
||||
0.1,
|
||||
)) * MUSH_FACT
|
||||
* 0.1,
|
||||
None,
|
||||
)
|
||||
},
|
||||
@ -571,7 +613,12 @@ pub fn apply_scatter_to(canvas: &mut Canvas, _rng: &mut impl Rng, calendar: Opti
|
||||
permit: |b| matches!(b, BlockKind::Grass),
|
||||
f: |_, col| {
|
||||
(
|
||||
close(col.temp, 1.0, 0.25).min(close(col.humidity, 0.0, 0.1)) * MUSH_FACT * 1.5,
|
||||
close(col.temp, CONFIG.desert_temp, 0.25).min(close(
|
||||
col.humidity,
|
||||
CONFIG.desert_hum,
|
||||
0.1,
|
||||
)) * MUSH_FACT
|
||||
* 1.5,
|
||||
None,
|
||||
)
|
||||
},
|
||||
@ -582,7 +629,12 @@ pub fn apply_scatter_to(canvas: &mut Canvas, _rng: &mut impl Rng, calendar: Opti
|
||||
permit: |b| matches!(b, BlockKind::Grass),
|
||||
f: |_, col| {
|
||||
(
|
||||
close(col.temp, 1.0, 0.25).min(close(col.humidity, 0.0, 0.1)) * MUSH_FACT * 2.0,
|
||||
close(col.temp, CONFIG.desert_temp, 0.25).min(close(
|
||||
col.humidity,
|
||||
CONFIG.desert_hum,
|
||||
0.1,
|
||||
)) * MUSH_FACT
|
||||
* 2.0,
|
||||
None,
|
||||
)
|
||||
},
|
||||
@ -593,7 +645,12 @@ pub fn apply_scatter_to(canvas: &mut Canvas, _rng: &mut impl Rng, calendar: Opti
|
||||
permit: |b| matches!(b, BlockKind::Grass),
|
||||
f: |_, col| {
|
||||
(
|
||||
close(col.temp, 1.0, 0.25).min(close(col.humidity, 0.0, 0.1)) * MUSH_FACT * 1.5,
|
||||
close(col.temp, CONFIG.desert_temp, 0.25).min(close(
|
||||
col.humidity,
|
||||
CONFIG.desert_hum,
|
||||
0.1,
|
||||
)) * MUSH_FACT
|
||||
* 1.5,
|
||||
None,
|
||||
)
|
||||
},
|
||||
@ -604,7 +661,12 @@ pub fn apply_scatter_to(canvas: &mut Canvas, _rng: &mut impl Rng, calendar: Opti
|
||||
permit: |b| matches!(b, BlockKind::Grass),
|
||||
f: |_, col| {
|
||||
(
|
||||
close(col.temp, 1.0, 0.25).min(close(col.humidity, 0.0, 0.1)) * MUSH_FACT * 2.0,
|
||||
close(col.temp, CONFIG.desert_temp, 0.25).min(close(
|
||||
col.humidity,
|
||||
CONFIG.desert_hum,
|
||||
0.1,
|
||||
)) * MUSH_FACT
|
||||
* 2.0,
|
||||
None,
|
||||
)
|
||||
},
|
||||
@ -615,7 +677,12 @@ pub fn apply_scatter_to(canvas: &mut Canvas, _rng: &mut impl Rng, calendar: Opti
|
||||
permit: |b| matches!(b, BlockKind::Grass),
|
||||
f: |_, col| {
|
||||
(
|
||||
close(col.temp, 1.0, 0.25).min(close(col.humidity, 0.0, 0.1)) * MUSH_FACT * 2.0,
|
||||
close(col.temp, CONFIG.desert_temp, 0.25).min(close(
|
||||
col.humidity,
|
||||
CONFIG.desert_hum,
|
||||
0.1,
|
||||
)) * MUSH_FACT
|
||||
* 2.0,
|
||||
None,
|
||||
)
|
||||
},
|
||||
@ -626,7 +693,12 @@ pub fn apply_scatter_to(canvas: &mut Canvas, _rng: &mut impl Rng, calendar: Opti
|
||||
permit: |b| matches!(b, BlockKind::Grass),
|
||||
f: |_, col| {
|
||||
(
|
||||
close(col.temp, 1.0, 0.25).min(close(col.humidity, 0.0, 0.1)) * MUSH_FACT * 2.0,
|
||||
close(col.temp, CONFIG.desert_temp, 0.25).min(close(
|
||||
col.humidity,
|
||||
CONFIG.desert_hum,
|
||||
0.1,
|
||||
)) * MUSH_FACT
|
||||
* 2.0,
|
||||
None,
|
||||
)
|
||||
},
|
||||
@ -637,7 +709,12 @@ pub fn apply_scatter_to(canvas: &mut Canvas, _rng: &mut impl Rng, calendar: Opti
|
||||
permit: |b| matches!(b, BlockKind::Grass),
|
||||
f: |_, col| {
|
||||
(
|
||||
close(col.temp, 1.0, 0.25).min(close(col.humidity, 0.0, 0.1)) * MUSH_FACT * 2.0,
|
||||
close(col.temp, CONFIG.desert_temp, 0.25).min(close(
|
||||
col.humidity,
|
||||
CONFIG.desert_hum,
|
||||
0.1,
|
||||
)) * MUSH_FACT
|
||||
* 2.0,
|
||||
None,
|
||||
)
|
||||
},
|
||||
|
@ -64,7 +64,7 @@ pub enum Spot {
|
||||
FruitTree,
|
||||
Shipwreck,
|
||||
Shipwreck2,
|
||||
GnarlingTree,
|
||||
FallenTree,
|
||||
TrollCave,
|
||||
TrollCaveMountain,
|
||||
TrollCaveSwamp,
|
||||
@ -220,7 +220,7 @@ impl Spot {
|
||||
Self::generate_spots(
|
||||
Spot::GnarlingTotem,
|
||||
world,
|
||||
2.0,
|
||||
1.5,
|
||||
|g, c| {
|
||||
g < 0.25
|
||||
&& !c.near_cliffs()
|
||||
@ -232,9 +232,9 @@ impl Spot {
|
||||
false,
|
||||
);
|
||||
Self::generate_spots(
|
||||
Spot::GnarlingTree,
|
||||
Spot::FallenTree,
|
||||
world,
|
||||
1.0,
|
||||
1.5,
|
||||
|g, c| {
|
||||
g < 0.25
|
||||
&& !c.near_cliffs()
|
||||
@ -601,9 +601,9 @@ pub fn apply_spots_to(canvas: &mut Canvas, _dynamic_rng: &mut impl Rng) {
|
||||
base_structures: Some("spots.myrmidon-temple"),
|
||||
entity_radius: 10.0,
|
||||
entities: &[
|
||||
(3..5, "common.entity.dungeon.tier-4.hoplite"),
|
||||
(3..5, "common.entity.dungeon.tier-4.strategian"),
|
||||
(2..3, "common.entity.dungeon.tier-4.marksman"),
|
||||
(3..5, "common.entity.dungeon.myrmidon.hoplite"),
|
||||
(3..5, "common.entity.dungeon.myrmidon.strategian"),
|
||||
(2..3, "common.entity.dungeon.myrmidon.marksman"),
|
||||
],
|
||||
},
|
||||
Spot::WitchHouse => SpotConfig {
|
||||
@ -645,14 +645,13 @@ pub fn apply_spots_to(canvas: &mut Canvas, _dynamic_rng: &mut impl Rng) {
|
||||
(1..2, "common.entity.dungeon.gnarling.woodgolem"),
|
||||
],
|
||||
},
|
||||
Spot::GnarlingTree => SpotConfig {
|
||||
base_structures: Some("spots_grasslands.gnarling_tree"),
|
||||
Spot::FallenTree => SpotConfig {
|
||||
base_structures: Some("spots_grasslands.fallen_tree"),
|
||||
entity_radius: 64.0,
|
||||
entities: &[
|
||||
(1..5, "common.entity.dungeon.gnarling.mugger"),
|
||||
(2..4, "common.entity.dungeon.gnarling.stalker"),
|
||||
(1..2, "common.entity.dungeon.gnarling.logger"),
|
||||
(1..4, "common.entity.wild.aggressive.deadwood"),
|
||||
(1..2, "common.entity.dungeon.gnarling.mandragora"),
|
||||
(2..6, "common.entity.wild.aggressive.deadwood"),
|
||||
(0..1, "common.entity.wild.aggressive.mossdrake"),
|
||||
],
|
||||
},
|
||||
Spot::TrollCave => SpotConfig {
|
||||
|
@ -216,6 +216,7 @@ pub enum Fill {
|
||||
Sprite(SpriteKind),
|
||||
RotatedSprite(SpriteKind, u8),
|
||||
RotatedSpriteWithCfg(SpriteKind, u8, SpriteCfg),
|
||||
ResourceSprite(SpriteKind, u8),
|
||||
Block(Block),
|
||||
Brick(BlockKind, Rgb<u8>, u8),
|
||||
Gradient(util::gradient::Gradient, BlockKind),
|
||||
@ -465,16 +466,18 @@ impl Fill {
|
||||
} else {
|
||||
old_block.with_sprite(*sprite)
|
||||
}),
|
||||
Fill::RotatedSprite(sprite, ori) => Some(if old_block.is_filled() {
|
||||
Block::air(*sprite)
|
||||
.with_ori(*ori)
|
||||
.unwrap_or_else(|| Block::air(*sprite))
|
||||
} else {
|
||||
old_block
|
||||
.with_sprite(*sprite)
|
||||
.with_ori(*ori)
|
||||
.unwrap_or_else(|| old_block.with_sprite(*sprite))
|
||||
}),
|
||||
Fill::RotatedSprite(sprite, ori) | Fill::ResourceSprite(sprite, ori) => {
|
||||
Some(if old_block.is_filled() {
|
||||
Block::air(*sprite)
|
||||
.with_ori(*ori)
|
||||
.unwrap_or_else(|| Block::air(*sprite))
|
||||
} else {
|
||||
old_block
|
||||
.with_sprite(*sprite)
|
||||
.with_ori(*ori)
|
||||
.unwrap_or_else(|| old_block.with_sprite(*sprite))
|
||||
})
|
||||
},
|
||||
Fill::RotatedSpriteWithCfg(sprite, ori, cfg) => Some({
|
||||
*sprite_cfg = Some(cfg.clone());
|
||||
if old_block.is_filled() {
|
||||
@ -1085,6 +1088,17 @@ impl Painter {
|
||||
.fill(Fill::RotatedSpriteWithCfg(sprite, ori, cfg))
|
||||
}
|
||||
|
||||
/// Places a sprite at the provided location with the provided orientation
|
||||
/// which will be tracked by rtsim nature if the sprite has an associated
|
||||
/// [`ChunkResource`].
|
||||
pub fn resource_sprite(&self, pos: Vec3<i32>, sprite: SpriteKind, ori: u8) {
|
||||
self.aabb(Aabb {
|
||||
min: pos,
|
||||
max: pos + 1,
|
||||
})
|
||||
.fill(Fill::ResourceSprite(sprite, ori))
|
||||
}
|
||||
|
||||
/// Returns a `PrimitiveRef` of the largest pyramid with a slope of 1 that
|
||||
/// fits in the provided Aabb.
|
||||
pub fn pyramid(&self, aabb: Aabb<i32>) -> PrimitiveRef {
|
||||
|
@ -1656,7 +1656,8 @@ impl Site {
|
||||
let pos = Vec3::new(x, y, z);
|
||||
|
||||
let mut sprite_cfg = None;
|
||||
canvas.map(pos, |block| {
|
||||
|
||||
let map = |block| {
|
||||
let current_block = fill.sample_at(
|
||||
&prim_tree,
|
||||
prim,
|
||||
@ -1671,7 +1672,13 @@ impl Site {
|
||||
}
|
||||
last_block = current_block;
|
||||
current_block.unwrap_or(block)
|
||||
});
|
||||
};
|
||||
|
||||
match fill {
|
||||
Fill::ResourceSprite { .. } => canvas.map_resource(pos, map),
|
||||
_ => canvas.map(pos, map),
|
||||
};
|
||||
|
||||
if let Some(sprite_cfg) = sprite_cfg {
|
||||
canvas.set_sprite_cfg(pos, sprite_cfg);
|
||||
}
|
||||
|
@ -673,9 +673,9 @@ fn enemy_2(dynamic_rng: &mut impl Rng, tile_wcenter: Vec3<i32>) -> Vec<EntityInf
|
||||
// TODO: give enemies health skills?
|
||||
let entity = EntityInfo::at(tile_wcenter.map(|e| e as f32));
|
||||
match dynamic_rng.gen_range(0..=4) {
|
||||
0 => entity.with_asset_expect("common.entity.dungeon.tier-2.sniper", dynamic_rng),
|
||||
1 => entity.with_asset_expect("common.entity.dungeon.tier-2.sorcerer", dynamic_rng),
|
||||
_ => entity.with_asset_expect("common.entity.dungeon.tier-2.spearman", dynamic_rng),
|
||||
0 => entity.with_asset_expect("common.entity.dungeon.sahagin.sniper", dynamic_rng),
|
||||
1 => entity.with_asset_expect("common.entity.dungeon.sahagin.sorcerer", dynamic_rng),
|
||||
_ => entity.with_asset_expect("common.entity.dungeon.sahagin.spearman", dynamic_rng),
|
||||
}
|
||||
});
|
||||
|
||||
@ -689,9 +689,9 @@ fn enemy_3(dynamic_rng: &mut impl Rng, tile_wcenter: Vec3<i32>) -> Vec<EntityInf
|
||||
// TODO: give enemies health skills?
|
||||
let entity = EntityInfo::at(tile_wcenter.map(|e| e as f32));
|
||||
match dynamic_rng.gen_range(0..=4) {
|
||||
0 => entity.with_asset_expect("common.entity.dungeon.tier-3.archer", dynamic_rng),
|
||||
1 => entity.with_asset_expect("common.entity.dungeon.tier-3.soldier", dynamic_rng),
|
||||
_ => entity.with_asset_expect("common.entity.dungeon.tier-3.guard", dynamic_rng),
|
||||
0 => entity.with_asset_expect("common.entity.dungeon.haniwa.archer", dynamic_rng),
|
||||
1 => entity.with_asset_expect("common.entity.dungeon.haniwa.soldier", dynamic_rng),
|
||||
_ => entity.with_asset_expect("common.entity.dungeon.haniwa.guard", dynamic_rng),
|
||||
}
|
||||
});
|
||||
|
||||
@ -705,9 +705,9 @@ fn enemy_4(dynamic_rng: &mut impl Rng, tile_wcenter: Vec3<i32>) -> Vec<EntityInf
|
||||
// TODO: give enemies health skills?
|
||||
let entity = EntityInfo::at(tile_wcenter.map(|e| e as f32));
|
||||
match dynamic_rng.gen_range(0..=4) {
|
||||
0 => entity.with_asset_expect("common.entity.dungeon.tier-4.marksman", dynamic_rng),
|
||||
1 => entity.with_asset_expect("common.entity.dungeon.tier-4.strategian", dynamic_rng),
|
||||
_ => entity.with_asset_expect("common.entity.dungeon.tier-4.hoplite", dynamic_rng),
|
||||
0 => entity.with_asset_expect("common.entity.dungeon.myrmidon.marksman", dynamic_rng),
|
||||
1 => entity.with_asset_expect("common.entity.dungeon.myrmidon.strategian", dynamic_rng),
|
||||
_ => entity.with_asset_expect("common.entity.dungeon.myrmidon.hoplite", dynamic_rng),
|
||||
}
|
||||
});
|
||||
|
||||
@ -721,9 +721,9 @@ fn enemy_5(dynamic_rng: &mut impl Rng, tile_wcenter: Vec3<i32>) -> Vec<EntityInf
|
||||
// TODO: give enemies health skills?
|
||||
let entity = EntityInfo::at(tile_wcenter.map(|e| e as f32));
|
||||
match dynamic_rng.gen_range(0..=4) {
|
||||
0 => entity.with_asset_expect("common.entity.dungeon.tier-5.warlock", dynamic_rng),
|
||||
1 => entity.with_asset_expect("common.entity.dungeon.tier-5.warlord", dynamic_rng),
|
||||
_ => entity.with_asset_expect("common.entity.dungeon.tier-5.cultist", dynamic_rng),
|
||||
0 => entity.with_asset_expect("common.entity.dungeon.cultist.warlock", dynamic_rng),
|
||||
1 => entity.with_asset_expect("common.entity.dungeon.cultist.warlord", dynamic_rng),
|
||||
_ => entity.with_asset_expect("common.entity.dungeon.cultist.cultist", dynamic_rng),
|
||||
}
|
||||
});
|
||||
|
||||
@ -742,24 +742,24 @@ fn enemy_fallback(dynamic_rng: &mut impl Rng, tile_wcenter: Vec3<i32>) -> Vec<En
|
||||
}
|
||||
|
||||
fn turret_3(dynamic_rng: &mut impl Rng, pos: Vec3<f32>) -> EntityInfo {
|
||||
EntityInfo::at(pos).with_asset_expect("common.entity.dungeon.tier-3.sentry", dynamic_rng)
|
||||
EntityInfo::at(pos).with_asset_expect("common.entity.dungeon.haniwa.sentry", dynamic_rng)
|
||||
}
|
||||
|
||||
fn turret_5(dynamic_rng: &mut impl Rng, pos: Vec3<f32>) -> EntityInfo {
|
||||
EntityInfo::at(pos).with_asset_expect("common.entity.dungeon.tier-5.turret", dynamic_rng)
|
||||
EntityInfo::at(pos).with_asset_expect("common.entity.dungeon.cultist.turret", dynamic_rng)
|
||||
}
|
||||
|
||||
fn boss_2(dynamic_rng: &mut impl Rng, tile_wcenter: Vec3<i32>) -> Vec<EntityInfo> {
|
||||
vec![
|
||||
EntityInfo::at(tile_wcenter.map(|e| e as f32))
|
||||
.with_asset_expect("common.entity.dungeon.tier-2.boss", dynamic_rng),
|
||||
.with_asset_expect("common.entity.dungeon.sahagin.boss", dynamic_rng),
|
||||
]
|
||||
}
|
||||
fn boss_3(dynamic_rng: &mut impl Rng, tile_wcenter: Vec3<i32>) -> Vec<EntityInfo> {
|
||||
let mut entities = Vec::new();
|
||||
entities.resize_with(2, || {
|
||||
EntityInfo::at(tile_wcenter.map(|e| e as f32))
|
||||
.with_asset_expect("common.entity.dungeon.tier-3.boss", dynamic_rng)
|
||||
.with_asset_expect("common.entity.dungeon.haniwa.boss", dynamic_rng)
|
||||
});
|
||||
|
||||
entities
|
||||
@ -768,14 +768,14 @@ fn boss_3(dynamic_rng: &mut impl Rng, tile_wcenter: Vec3<i32>) -> Vec<EntityInfo
|
||||
fn boss_4(dynamic_rng: &mut impl Rng, tile_wcenter: Vec3<i32>) -> Vec<EntityInfo> {
|
||||
vec![
|
||||
EntityInfo::at(tile_wcenter.map(|e| e as f32))
|
||||
.with_asset_expect("common.entity.dungeon.tier-4.boss", dynamic_rng),
|
||||
.with_asset_expect("common.entity.dungeon.myrmidon.boss", dynamic_rng),
|
||||
]
|
||||
}
|
||||
|
||||
fn boss_5(dynamic_rng: &mut impl Rng, tile_wcenter: Vec3<i32>) -> Vec<EntityInfo> {
|
||||
vec![
|
||||
EntityInfo::at(tile_wcenter.map(|e| e as f32))
|
||||
.with_asset_expect("common.entity.dungeon.tier-5.boss", dynamic_rng),
|
||||
.with_asset_expect("common.entity.dungeon.cultist.boss", dynamic_rng),
|
||||
]
|
||||
}
|
||||
|
||||
@ -790,7 +790,7 @@ fn mini_boss_2(dynamic_rng: &mut impl Rng, tile_wcenter: Vec3<i32>) -> Vec<Entit
|
||||
let mut entities = Vec::new();
|
||||
entities.resize_with(6, || {
|
||||
EntityInfo::at(tile_wcenter.map(|e| e as f32))
|
||||
.with_asset_expect("common.entity.dungeon.tier-2.hakulaq", dynamic_rng)
|
||||
.with_asset_expect("common.entity.dungeon.sahagin.hakulaq", dynamic_rng)
|
||||
});
|
||||
entities
|
||||
}
|
||||
@ -799,7 +799,7 @@ fn mini_boss_3(dynamic_rng: &mut impl Rng, tile_wcenter: Vec3<i32>) -> Vec<Entit
|
||||
let mut entities = Vec::new();
|
||||
entities.resize_with(3, || {
|
||||
EntityInfo::at(tile_wcenter.map(|e| e as f32))
|
||||
.with_asset_expect("common.entity.dungeon.tier-3.bonerattler", dynamic_rng)
|
||||
.with_asset_expect("common.entity.dungeon.haniwa.bonerattler", dynamic_rng)
|
||||
});
|
||||
entities
|
||||
}
|
||||
@ -807,7 +807,7 @@ fn mini_boss_3(dynamic_rng: &mut impl Rng, tile_wcenter: Vec3<i32>) -> Vec<Entit
|
||||
fn mini_boss_4(dynamic_rng: &mut impl Rng, tile_wcenter: Vec3<i32>) -> Vec<EntityInfo> {
|
||||
vec![
|
||||
EntityInfo::at(tile_wcenter.map(|e| e as f32))
|
||||
.with_asset_expect("common.entity.dungeon.tier-4.miniboss", dynamic_rng),
|
||||
.with_asset_expect("common.entity.dungeon.myrmidon.miniboss", dynamic_rng),
|
||||
]
|
||||
}
|
||||
|
||||
@ -817,23 +817,23 @@ fn mini_boss_5(dynamic_rng: &mut impl Rng, tile_wcenter: Vec3<i32>) -> Vec<Entit
|
||||
0 => {
|
||||
entities.push(
|
||||
EntityInfo::at(tile_wcenter.map(|e| e as f32))
|
||||
.with_asset_expect("common.entity.dungeon.tier-5.beastmaster", dynamic_rng),
|
||||
.with_asset_expect("common.entity.dungeon.cultist.beastmaster", dynamic_rng),
|
||||
);
|
||||
entities.resize_with(entities.len() + 4, || {
|
||||
EntityInfo::at(tile_wcenter.map(|e| e as f32))
|
||||
.with_asset_expect("common.entity.dungeon.tier-5.hound", dynamic_rng)
|
||||
.with_asset_expect("common.entity.dungeon.cultist.hound", dynamic_rng)
|
||||
});
|
||||
},
|
||||
1 => {
|
||||
entities.resize_with(2, || {
|
||||
EntityInfo::at(tile_wcenter.map(|e| e as f32))
|
||||
.with_asset_expect("common.entity.dungeon.tier-5.husk_brute", dynamic_rng)
|
||||
.with_asset_expect("common.entity.dungeon.cultist.husk_brute", dynamic_rng)
|
||||
});
|
||||
},
|
||||
_ => {
|
||||
entities.resize_with(10, || {
|
||||
EntityInfo::at(tile_wcenter.map(|e| e as f32))
|
||||
.with_asset_expect("common.entity.dungeon.tier-5.husk", dynamic_rng)
|
||||
.with_asset_expect("common.entity.dungeon.cultist.husk", dynamic_rng)
|
||||
});
|
||||
},
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ use crate::{
|
||||
site::namegen::NameGen,
|
||||
site2::{Fill, Painter, Site, Structure},
|
||||
util::FastNoise,
|
||||
Land, Sampler,
|
||||
Land, Sampler, SpriteKind,
|
||||
};
|
||||
use common::{
|
||||
generation::EntityInfo,
|
||||
@ -92,6 +92,7 @@ impl Structure for GiantTree {
|
||||
light,
|
||||
fast_noise.get((self.wpos.map(|e| e as f64) * 0.05) * 0.5 + 0.5),
|
||||
);
|
||||
let mut rng = rand::thread_rng();
|
||||
self.tree.walk(|branch, parent| {
|
||||
let aabr = Aabr {
|
||||
min: self.wpos.xy() + branch.get_aabb().min.xy().as_(),
|
||||
@ -120,7 +121,20 @@ impl Structure for GiantTree {
|
||||
.fill(Fill::Block(Block::new(
|
||||
BlockKind::Leaves,
|
||||
leaf_col.map(|e| e as u8),
|
||||
)))
|
||||
)));
|
||||
// Calculate direction of the branch
|
||||
let branch_start = branch.get_line().start;
|
||||
let branch_end = branch.get_line().end;
|
||||
let branch_direction = (branch_end - branch_start).normalized();
|
||||
|
||||
// Generate a sprite at the surface of the leafy part of the branch
|
||||
let displacement =
|
||||
(branch_direction * branch.get_leaf_radius()).map(|e| e.round() as i32);
|
||||
let pos = self.wpos + branch_end.as_() + displacement;
|
||||
if rng.gen_bool(0.07) {
|
||||
let ori = rng.gen_range(0..=3) * 2;
|
||||
painter.resource_sprite(pos, SpriteKind::Ironwood, ori);
|
||||
}
|
||||
}
|
||||
true
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user