From a55276ea7386bf0514994e5875d1f0771ef18833 Mon Sep 17 00:00:00 2001 From: flo Date: Wed, 24 May 2023 18:13:29 +0000 Subject: [PATCH] seachapel_rework --- .../common/abilities/ability_set_manifest.ron | 23 +- .../arthropods/dagonite/leapshockwave.ron | 26 + ...summonseacrocs.ron => summondagonites.ron} | 8 +- .../abilities/custom/coralgolem/shockwave.ron | 18 + .../abilities/custom/coralgolem/spin.ron | 21 + .../abilities/custom/coralgolem/strike.ron | 17 + .../abilities/custom/dagon/steambeam.ron | 19 + .../abilities/custom/sea_bishop/longbeam.ron | 19 + .../entity/dungeon/sea_chapel/coralgolem.ron | 11 + .../entity/dungeon/sea_chapel/dagonite.ron | 11 + .../entity/dungeon/sea_chapel/organ.ron | 2 +- .../entity/dungeon/sea_chapel/sea_bishop.ron | 11 + .../dungeon/sea_chapel/sea_cleric_sceptre.ron | 18 - assets/common/items/armor/brinestone/back.ron | 10 + assets/common/items/armor/brinestone/belt.ron | 10 + .../common/items/armor/brinestone/chest.ron | 10 + .../common/items/armor/brinestone/crown.ron | 14 + assets/common/items/armor/brinestone/foot.ron | 10 + assets/common/items/armor/brinestone/hand.ron | 10 + .../common/items/armor/brinestone/pants.ron | 10 + .../items/armor/brinestone/shoulder.ron | 10 + assets/common/items/armor/cardinal/mitre.ron | 10 + .../common/items/crafting_ing/brinestone.ron | 9 + assets/common/items/keys/glass_key.ron | 11 + .../items/npc_armor/quadruped_low/dagon.ron | 2 +- .../unique/arthropods/dagonite.ron | 21 + .../npc_weapons/unique/coral_golem_fist.ron | 21 + .../npc_weapons/unique/sea_bishop_sceptre.ron | 21 + .../loadout/dungeon/sea_chapel/cardinal.ron | 1 + .../dungeon/sea_chapel/cardinal.ron | 1 - .../dungeon/sea_chapel/chest_coral.ron | 5 +- .../dungeon/sea_chapel/coralgolem.ron | 5 + .../loot_tables/dungeon/sea_chapel/dagon.ron | 6 +- .../dungeon/sea_chapel/sea_bishop.ron | 4 + assets/common/material_stats_manifest.ron | 6 + assets/common/npc_names.ron | 12 + assets/common/recipe_book.ron | 71 +- assets/server/manifests/kits.ron | 10 + assets/voxygen/audio/sfx.ron | 7 + assets/voxygen/audio/sfx/abilities/steam.ogg | 3 + assets/voxygen/i18n/en/hud/subtitles.ftl | 1 + assets/voxygen/i18n/en/npc.ftl | 3 +- assets/voxygen/i18n/sv_SE/hud/subtitles.ftl | 1 + assets/voxygen/item_image_manifest.ron | 45 + .../voxygen/voxel/armor/brinestone/back.vox | 3 + .../voxygen/voxel/armor/brinestone/belt.vox | 3 + .../voxygen/voxel/armor/brinestone/chest.vox | 3 + .../voxygen/voxel/armor/brinestone/crown.vox | 3 + .../voxygen/voxel/armor/brinestone/foot.vox | 3 + .../voxygen/voxel/armor/brinestone/hand.vox | 3 + .../voxygen/voxel/armor/brinestone/pants.vox | 3 + .../voxel/armor/brinestone/shoulder.vox | 3 + assets/voxygen/voxel/armor/cardinal/mitre.vox | 3 + .../voxel/arthropod_central_manifest.ron | 20 + .../voxel/arthropod_lateral_manifest.ron | 116 + .../voxel/biped_large_central_manifest.ron | 52 + .../voxel/biped_large_lateral_manifest.ron | 68 + .../voxygen/voxel/biped_weapon_manifest.ron | 4 + .../voxygen/voxel/golem_central_manifest.ron | 36 + .../voxygen/voxel/golem_lateral_manifest.ron | 68 + .../voxel/humanoid_armor_back_manifest.ron | 4 + .../voxel/humanoid_armor_belt_manifest.ron | 4 + .../voxel/humanoid_armor_chest_manifest.ron | 4 + .../voxel/humanoid_armor_foot_manifest.ron | 4 + .../voxel/humanoid_armor_hand_manifest.ron | 10 + .../voxel/humanoid_armor_head_manifest.ron | 98 + .../voxel/humanoid_armor_pants_manifest.ron | 4 + .../humanoid_armor_shoulder_manifest.ron | 10 + assets/voxygen/voxel/item_drop_manifest.ron | 11 + .../voxel/npc/coralgolem/male/chest_lower.vox | 3 + .../voxel/npc/coralgolem/male/chest_upper.vox | 3 + .../voxel/npc/coralgolem/male/foot_l.vox | 3 + .../voxel/npc/coralgolem/male/foot_r.vox | 3 + .../voxel/npc/coralgolem/male/hand_l.vox | 3 + .../voxel/npc/coralgolem/male/hand_r.vox | 3 + .../voxel/npc/coralgolem/male/head.vox | 3 + .../voxel/npc/coralgolem/male/leg_l.vox | 3 + .../voxel/npc/coralgolem/male/leg_r.vox | 3 + .../voxel/npc/coralgolem/male/shoulder_l.vox | 3 + .../voxel/npc/coralgolem/male/shoulder_r.vox | 3 + .../voxygen/voxel/npc/dagonite/male/chest.vox | 3 + .../voxygen/voxel/npc/dagonite/male/head.vox | 3 + .../voxel/npc/dagonite/male/leg_bcr.vox | 3 + .../voxel/npc/dagonite/male/leg_fcr.vox | 3 + .../voxel/npc/dagonite/male/leg_fr.vox | 3 + .../voxel/npc/sea_bishop/male/hand_l.vox | 3 + .../voxel/npc/sea_bishop/male/hand_r.vox | 3 + .../voxel/npc/sea_bishop/male/head.vox | 3 + .../voxel/npc/sea_bishop/male/leg_l.vox | 3 + .../voxel/npc/sea_bishop/male/leg_r.vox | 3 + .../voxel/npc/sea_bishop/male/shoulder_l.vox | 3 + .../voxel/npc/sea_bishop/male/shoulder_r.vox | 3 + .../voxel/npc/sea_bishop/male/torso_lower.vox | 3 + .../voxel/npc/sea_bishop/male/torso_upper.vox | 3 + assets/voxygen/voxel/object/key_glass.vox | 3 + .../voxel/sprite/crafting_ing/brinestone.vox | 3 + .../sprite/furniture/glass_barrier_block.vox | 3 + .../sprite/furniture/glass_keyhole_block.vox | 3 + .../voxel/sprite/misc/glass_barrier.vox | 3 - .../voxel/sprite/misc/sea_decor_emblem.vox | 4 +- assets/voxygen/voxel/sprite_manifest.ron | 14 +- .../weapon/sceptre/scepter_sea_bishop.vox | 3 + common/src/comp/agent.rs | 1 + common/src/comp/body.rs | 15 +- common/src/comp/body/arthropod.rs | 6 +- common/src/comp/body/biped_large.rs | 6 +- common/src/comp/body/golem.rs | 6 +- common/src/comp/inventory/loadout_builder.rs | 9 + common/src/outcome.rs | 4 + common/src/states/basic_beam.rs | 1 + common/src/states/leap_shockwave.rs | 19 +- common/src/states/shockwave.rs | 5 + common/src/states/sprite_interact.rs | 4 +- common/src/states/utils.rs | 1 + common/src/terrain/block.rs | 2 +- common/src/terrain/sprite.rs | 12 +- common/src/terrain/structure.rs | 1 + server/agent/src/action_nodes.rs | 12 +- server/agent/src/attack.rs | 93 + server/agent/src/data.rs | 1 + server/src/events/inventory_manip.rs | 19 +- voxygen/anim/src/arthropod/leapshockwave.rs | 133 + voxygen/anim/src/arthropod/mod.rs | 15 +- voxygen/anim/src/biped_large/beam.rs | 82 +- voxygen/anim/src/biped_large/mod.rs | 11 + voxygen/anim/src/biped_large/wield.rs | 2 +- voxygen/anim/src/golem/mod.rs | 10 + voxygen/src/audio/sfx/mod.rs | 11 +- voxygen/src/scene/figure/mod.rs | 32 + voxygen/src/scene/particle.rs | 1 + world/src/block/mod.rs | 10 + world/src/site2/plot/sea_chapel.rs | 5465 ++++++----------- 132 files changed, 3599 insertions(+), 3605 deletions(-) create mode 100644 assets/common/abilities/custom/arthropods/dagonite/leapshockwave.ron rename assets/common/abilities/custom/cardinal/{summonseacrocs.ron => summondagonites.ron} (69%) create mode 100644 assets/common/abilities/custom/coralgolem/shockwave.ron create mode 100644 assets/common/abilities/custom/coralgolem/spin.ron create mode 100644 assets/common/abilities/custom/coralgolem/strike.ron create mode 100644 assets/common/abilities/custom/dagon/steambeam.ron create mode 100644 assets/common/abilities/custom/sea_bishop/longbeam.ron create mode 100644 assets/common/entity/dungeon/sea_chapel/coralgolem.ron create mode 100644 assets/common/entity/dungeon/sea_chapel/dagonite.ron create mode 100644 assets/common/entity/dungeon/sea_chapel/sea_bishop.ron delete mode 100644 assets/common/entity/dungeon/sea_chapel/sea_cleric_sceptre.ron create mode 100644 assets/common/items/armor/brinestone/back.ron create mode 100644 assets/common/items/armor/brinestone/belt.ron create mode 100644 assets/common/items/armor/brinestone/chest.ron create mode 100644 assets/common/items/armor/brinestone/crown.ron create mode 100644 assets/common/items/armor/brinestone/foot.ron create mode 100644 assets/common/items/armor/brinestone/hand.ron create mode 100644 assets/common/items/armor/brinestone/pants.ron create mode 100644 assets/common/items/armor/brinestone/shoulder.ron create mode 100644 assets/common/items/armor/cardinal/mitre.ron create mode 100644 assets/common/items/crafting_ing/brinestone.ron create mode 100644 assets/common/items/keys/glass_key.ron create mode 100644 assets/common/items/npc_weapons/unique/arthropods/dagonite.ron create mode 100644 assets/common/items/npc_weapons/unique/coral_golem_fist.ron create mode 100644 assets/common/items/npc_weapons/unique/sea_bishop_sceptre.ron create mode 100644 assets/common/loot_tables/dungeon/sea_chapel/coralgolem.ron create mode 100644 assets/common/loot_tables/dungeon/sea_chapel/sea_bishop.ron create mode 100644 assets/voxygen/audio/sfx/abilities/steam.ogg create mode 100644 assets/voxygen/voxel/armor/brinestone/back.vox create mode 100644 assets/voxygen/voxel/armor/brinestone/belt.vox create mode 100644 assets/voxygen/voxel/armor/brinestone/chest.vox create mode 100644 assets/voxygen/voxel/armor/brinestone/crown.vox create mode 100644 assets/voxygen/voxel/armor/brinestone/foot.vox create mode 100644 assets/voxygen/voxel/armor/brinestone/hand.vox create mode 100644 assets/voxygen/voxel/armor/brinestone/pants.vox create mode 100644 assets/voxygen/voxel/armor/brinestone/shoulder.vox create mode 100644 assets/voxygen/voxel/armor/cardinal/mitre.vox create mode 100644 assets/voxygen/voxel/npc/coralgolem/male/chest_lower.vox create mode 100644 assets/voxygen/voxel/npc/coralgolem/male/chest_upper.vox create mode 100644 assets/voxygen/voxel/npc/coralgolem/male/foot_l.vox create mode 100644 assets/voxygen/voxel/npc/coralgolem/male/foot_r.vox create mode 100644 assets/voxygen/voxel/npc/coralgolem/male/hand_l.vox create mode 100644 assets/voxygen/voxel/npc/coralgolem/male/hand_r.vox create mode 100644 assets/voxygen/voxel/npc/coralgolem/male/head.vox create mode 100644 assets/voxygen/voxel/npc/coralgolem/male/leg_l.vox create mode 100644 assets/voxygen/voxel/npc/coralgolem/male/leg_r.vox create mode 100644 assets/voxygen/voxel/npc/coralgolem/male/shoulder_l.vox create mode 100644 assets/voxygen/voxel/npc/coralgolem/male/shoulder_r.vox create mode 100644 assets/voxygen/voxel/npc/dagonite/male/chest.vox create mode 100644 assets/voxygen/voxel/npc/dagonite/male/head.vox create mode 100644 assets/voxygen/voxel/npc/dagonite/male/leg_bcr.vox create mode 100644 assets/voxygen/voxel/npc/dagonite/male/leg_fcr.vox create mode 100644 assets/voxygen/voxel/npc/dagonite/male/leg_fr.vox create mode 100644 assets/voxygen/voxel/npc/sea_bishop/male/hand_l.vox create mode 100644 assets/voxygen/voxel/npc/sea_bishop/male/hand_r.vox create mode 100644 assets/voxygen/voxel/npc/sea_bishop/male/head.vox create mode 100644 assets/voxygen/voxel/npc/sea_bishop/male/leg_l.vox create mode 100644 assets/voxygen/voxel/npc/sea_bishop/male/leg_r.vox create mode 100644 assets/voxygen/voxel/npc/sea_bishop/male/shoulder_l.vox create mode 100644 assets/voxygen/voxel/npc/sea_bishop/male/shoulder_r.vox create mode 100644 assets/voxygen/voxel/npc/sea_bishop/male/torso_lower.vox create mode 100644 assets/voxygen/voxel/npc/sea_bishop/male/torso_upper.vox create mode 100644 assets/voxygen/voxel/object/key_glass.vox create mode 100644 assets/voxygen/voxel/sprite/crafting_ing/brinestone.vox create mode 100644 assets/voxygen/voxel/sprite/furniture/glass_barrier_block.vox create mode 100644 assets/voxygen/voxel/sprite/furniture/glass_keyhole_block.vox delete mode 100644 assets/voxygen/voxel/sprite/misc/glass_barrier.vox create mode 100644 assets/voxygen/voxel/weapon/sceptre/scepter_sea_bishop.vox create mode 100644 voxygen/anim/src/arthropod/leapshockwave.rs diff --git a/assets/common/abilities/ability_set_manifest.ron b/assets/common/abilities/ability_set_manifest.ron index 263094e734..c6965e109d 100644 --- a/assets/common/abilities/ability_set_manifest.ron +++ b/assets/common/abilities/ability_set_manifest.ron @@ -248,6 +248,13 @@ Simple(None, "common.abilities.custom.woodgolem.shockwave") ], ), + Custom("Coral Golem"): ( + primary: Simple(None, "common.abilities.custom.coralgolem.strike"), + secondary: Simple(None, "common.abilities.custom.coralgolem.spin"), + abilities: [ + Simple(None, "common.abilities.custom.coralgolem.shockwave") + ], + ), Custom("Simple Flying Melee"): ( primary: Simple(None, "common.abilities.custom.simpleflyingmelee.singlestrike"), secondary: Simple(None, "common.abilities.custom.simpleflyingmelee.singlestrike"), @@ -471,6 +478,13 @@ Simple(None, "common.abilities.custom.arthropods.weevil.threadshot"), ], ), + Custom("Dagonite"): ( + primary: Simple(None, "common.abilities.custom.arthropods.dagonite.leapshockwave"), + secondary: Simple(None, "common.abilities.custom.arthropods.dagonite.leapshockwave"), + abilities: [ + Simple(None, "common.abilities.custom.arthropods.dagonite.leapshockwave"), + ], + ), /// TODO: Organize the rest into further catagories and give purple tier droppers+ custom skillsets Custom("Turret"): ( primary: Simple(None, "common.abilities.custom.turret.arrows"), @@ -560,7 +574,7 @@ secondary: Simple(None, "common.abilities.custom.dagon.seaurchins"), abilities: [ Simple(None, "common.abilities.custom.dagon.steamwave"), - Simple(None, "common.abilities.custom.cardinal.steambeam"), + Simple(None, "common.abilities.custom.dagon.steambeam"), Simple(None, "common.abilities.custom.dagon.steamheal"), ], ), @@ -569,9 +583,14 @@ secondary: Simple(None, "common.abilities.sceptre.healingaura"), abilities: [ Simple(None, "common.abilities.custom.cardinal.steambeam"), - Simple(None, "common.abilities.custom.cardinal.summonseacrocs"), + Simple(None, "common.abilities.custom.cardinal.summondagonites"), ], ), + Custom("Sea Bishop"): ( + primary: Simple(None, "common.abilities.custom.sea_bishop.longbeam"), + secondary: Simple(None, "common.abilities.custom.sea_bishop.longbeam"), + abilities: [], + ), Custom("Oni"): ( primary: Simple(None, "common.abilities.custom.oni.dash"), secondary: Simple(None, "common.abilities.custom.oni.doublestrike"), diff --git a/assets/common/abilities/custom/arthropods/dagonite/leapshockwave.ron b/assets/common/abilities/custom/arthropods/dagonite/leapshockwave.ron new file mode 100644 index 0000000000..b61faf2129 --- /dev/null +++ b/assets/common/abilities/custom/arthropods/dagonite/leapshockwave.ron @@ -0,0 +1,26 @@ +LeapShockwave( + energy_cost: 0, + buildup_duration: 1.4, + movement_duration: 0.8, + swing_duration: 0.15, + recover_duration: 0.9, + damage: 15.0, + poise_damage: 10, + knockback: (strength: 3.0, direction: Up), + shockwave_angle: 360.0, + shockwave_vertical_angle: 15.0, + shockwave_speed: 20.0, + shockwave_duration: 0.8, + requires_ground: true, + move_efficiency: 0.2, + damage_kind: Crushing, + specifier: Steam, + damage_effect: Some(Buff(( + kind: Cursed, + dur_secs: 1.0, + strength: DamageFraction(0.1), + chance: 1.0, + ))), + forward_leap_strength: 40.0, + vertical_leap_strength: 7.5, +) diff --git a/assets/common/abilities/custom/cardinal/summonseacrocs.ron b/assets/common/abilities/custom/cardinal/summondagonites.ron similarity index 69% rename from assets/common/abilities/custom/cardinal/summonseacrocs.ron rename to assets/common/abilities/custom/cardinal/summondagonites.ron index daf70af1ca..be27b5f88f 100644 --- a/assets/common/abilities/custom/cardinal/summonseacrocs.ron +++ b/assets/common/abilities/custom/cardinal/summondagonites.ron @@ -2,17 +2,17 @@ BasicSummon( buildup_duration: 0.2, cast_duration: 0.3, recover_duration: 0.3, - summon_amount: 4, + summon_amount: 1, summon_distance: (4, 4), summon_info: ( - body: QuadrupedLow(( - species: SeaCrocodile, + body: Arthropod(( + species: Dagonite, body_type: Male, )), scale: None, has_health: true, loadout_config: None, - skillset_config: Some(Rank5), + skillset_config: Some(Rank3), ), duration: None, ) diff --git a/assets/common/abilities/custom/coralgolem/shockwave.ron b/assets/common/abilities/custom/coralgolem/shockwave.ron new file mode 100644 index 0000000000..3803060335 --- /dev/null +++ b/assets/common/abilities/custom/coralgolem/shockwave.ron @@ -0,0 +1,18 @@ +Shockwave( + energy_cost: 0, + buildup_duration: 3.0, + swing_duration: 0.12, + recover_duration: 2.4, + damage: 60.0, + poise_damage: 30, + knockback: (strength: 20.0, direction: TowardsUp), + shockwave_angle: 360.0, + shockwave_vertical_angle: 90.0, + shockwave_speed: 25.0, + shockwave_duration: 2.0, + requires_ground: true, + move_efficiency: 0.0, + damage_kind: Crushing, + specifier: Water, + ori_rate: 1.0, +) diff --git a/assets/common/abilities/custom/coralgolem/spin.ron b/assets/common/abilities/custom/coralgolem/spin.ron new file mode 100644 index 0000000000..1f80da5bab --- /dev/null +++ b/assets/common/abilities/custom/coralgolem/spin.ron @@ -0,0 +1,21 @@ +SpinMelee( + buildup_duration: 0.9, + swing_duration: 0.3, + recover_duration: 0.6, + melee_constructor: ( + kind: Bash( + damage: 45.0, + poise: 30.0, + knockback: 20.0, + energy_regen: 0.0, + ), + range: 7.5, + angle: 360.0, + ), + energy_cost: 0, + is_infinite: false, + movement_behavior: Stationary, + forward_speed: 0.0, + num_spins: 1, + specifier: None, +) diff --git a/assets/common/abilities/custom/coralgolem/strike.ron b/assets/common/abilities/custom/coralgolem/strike.ron new file mode 100644 index 0000000000..ed5331673c --- /dev/null +++ b/assets/common/abilities/custom/coralgolem/strike.ron @@ -0,0 +1,17 @@ +BasicMelee( + energy_cost: 0, + buildup_duration: 1.6, + swing_duration: 0.1, + recover_duration: 1.0, + melee_constructor: ( + kind: Bash( + damage: 30.0, + poise: 25.0, + knockback: 15.0, + energy_regen: 0.0, + ), + range: 4.0, + angle: 45.0, + ), + ori_modifier: 0.4, +) diff --git a/assets/common/abilities/custom/dagon/steambeam.ron b/assets/common/abilities/custom/dagon/steambeam.ron new file mode 100644 index 0000000000..5ea8687c52 --- /dev/null +++ b/assets/common/abilities/custom/dagon/steambeam.ron @@ -0,0 +1,19 @@ +BasicBeam( + buildup_duration: 0.3, + recover_duration: 1.0, + beam_duration: 1.0, + damage: 22.5, + tick_rate: 5.0, + range: 12.0, + max_angle: 15.0, + damage_effect: Some(Buff(( + kind: Burning, + dur_secs: 3.0, + strength: Value(0.5), + chance: 1.0, + ))), + energy_regen: 2, + energy_drain: 0, + ori_rate: 0.5, + specifier: Steam, +) \ No newline at end of file diff --git a/assets/common/abilities/custom/sea_bishop/longbeam.ron b/assets/common/abilities/custom/sea_bishop/longbeam.ron new file mode 100644 index 0000000000..2e4cda981d --- /dev/null +++ b/assets/common/abilities/custom/sea_bishop/longbeam.ron @@ -0,0 +1,19 @@ +BasicBeam( + buildup_duration: 0.3, + recover_duration: 1.0, + beam_duration: 1.0, + damage: 6.5, + tick_rate: 3.0, + range: 30.0, + max_angle: 15.0, + damage_effect: Some(Buff(( + kind: Burning, + dur_secs: 3.0, + strength: Value(0.2), + chance: 0.1, + ))), + energy_regen: 2, + energy_drain: 0, + ori_rate: 0.5, + specifier: Bubbles, +) \ No newline at end of file diff --git a/assets/common/entity/dungeon/sea_chapel/coralgolem.ron b/assets/common/entity/dungeon/sea_chapel/coralgolem.ron new file mode 100644 index 0000000000..354650cef2 --- /dev/null +++ b/assets/common/entity/dungeon/sea_chapel/coralgolem.ron @@ -0,0 +1,11 @@ +#![enable(implicit_some)] +( + name: Name("Coral Golem"), + body: RandomWith("coralgolem"), + alignment: Alignment(Enemy), + loot: LootTable("common.loot_tables.dungeon.sea_chapel.coralgolem"), + inventory: ( + loadout: FromBody, + ), + meta: [], +) \ No newline at end of file diff --git a/assets/common/entity/dungeon/sea_chapel/dagonite.ron b/assets/common/entity/dungeon/sea_chapel/dagonite.ron new file mode 100644 index 0000000000..8461a7816d --- /dev/null +++ b/assets/common/entity/dungeon/sea_chapel/dagonite.ron @@ -0,0 +1,11 @@ +#![enable(implicit_some)] +( + name: Name("Dagonite"), + body: RandomWith("dagonite"), + alignment: Alignment(Enemy), + loot: LootTable("common.loot_tables.dungeon.sea_chapel.sea_cleric"), + inventory: ( + loadout: FromBody, + ), + meta: [], +) \ No newline at end of file diff --git a/assets/common/entity/dungeon/sea_chapel/organ.ron b/assets/common/entity/dungeon/sea_chapel/organ.ron index c8acfdbe7c..8c23ee1ad0 100644 --- a/assets/common/entity/dungeon/sea_chapel/organ.ron +++ b/assets/common/entity/dungeon/sea_chapel/organ.ron @@ -3,7 +3,7 @@ name: Name("Organ"), body: Exact(Object(BarrelOrgan)), alignment: Alignment(Enemy), - loot: Item("common.items.crafting_ing.seashells"), + loot: Item("common.items.keys.glass_key"), inventory: ( loadout: FromBody ), diff --git a/assets/common/entity/dungeon/sea_chapel/sea_bishop.ron b/assets/common/entity/dungeon/sea_chapel/sea_bishop.ron new file mode 100644 index 0000000000..3cb0bf4d3c --- /dev/null +++ b/assets/common/entity/dungeon/sea_chapel/sea_bishop.ron @@ -0,0 +1,11 @@ +#![enable(implicit_some)] +( + name: Automatic, + body: RandomWith("sea_bishop"), + alignment: Alignment(Enemy), + loot: LootTable("common.loot_tables.dungeon.sea_chapel.sea_bishop"), + inventory: ( + loadout: FromBody, + ), + meta: [], +) \ No newline at end of file diff --git a/assets/common/entity/dungeon/sea_chapel/sea_cleric_sceptre.ron b/assets/common/entity/dungeon/sea_chapel/sea_cleric_sceptre.ron deleted file mode 100644 index 4ac20749ad..0000000000 --- a/assets/common/entity/dungeon/sea_chapel/sea_cleric_sceptre.ron +++ /dev/null @@ -1,18 +0,0 @@ -#![enable(implicit_some)] -( - name: Name("Sea Cleric"), - body: RandomWith("danari"), - alignment: Alignment(Enemy), - loot: LootTable("common.loot_tables.dungeon.sea_chapel.sea_cleric"), - inventory: ( - loadout: Inline(( - inherit: Asset("common.loadout.dungeon.sea_chapel.sea_cleric"), - active_hands: InHands((Choice([ - (1, ModularWeapon(tool: Sceptre, material: Ironwood, hands: None)), - ]), None)), - )), - ), - meta: [ - SkillSetAsset("common.skillset.preset.rank4.fullskill"), - ], -) \ No newline at end of file diff --git a/assets/common/items/armor/brinestone/back.ron b/assets/common/items/armor/brinestone/back.ron new file mode 100644 index 0000000000..a05e431968 --- /dev/null +++ b/assets/common/items/armor/brinestone/back.ron @@ -0,0 +1,10 @@ +ItemDef( + name: "Brinestone Cloak", + description: "It's not weak.", + kind: Armor(( + kind: Back, + stats: FromSet("Brinestone"), + )), + quality: Legendary, + tags: [], +) \ No newline at end of file diff --git a/assets/common/items/armor/brinestone/belt.ron b/assets/common/items/armor/brinestone/belt.ron new file mode 100644 index 0000000000..33edfc7453 --- /dev/null +++ b/assets/common/items/armor/brinestone/belt.ron @@ -0,0 +1,10 @@ +ItemDef( + name: "Brinestone Belt", + description: "Ties it together.", + kind: Armor(( + kind: Belt, + stats: FromSet("Brinestone"), + )), + quality: Legendary, + tags: [], +) diff --git a/assets/common/items/armor/brinestone/chest.ron b/assets/common/items/armor/brinestone/chest.ron new file mode 100644 index 0000000000..050b1e1b0a --- /dev/null +++ b/assets/common/items/armor/brinestone/chest.ron @@ -0,0 +1,10 @@ +ItemDef( + name: "Brinestone Chestplate", + description: "Hard to pierce.", + kind: Armor(( + kind: Chest, + stats: FromSet("Brinestone"), + )), + quality: Legendary, + tags: [], +) \ No newline at end of file diff --git a/assets/common/items/armor/brinestone/crown.ron b/assets/common/items/armor/brinestone/crown.ron new file mode 100644 index 0000000000..3c2d4f3436 --- /dev/null +++ b/assets/common/items/armor/brinestone/crown.ron @@ -0,0 +1,14 @@ +ItemDef( + name: "Brinestone Crown", + description: "Makes you look taller.", + kind: Armor(( + kind: Head, + stats: Direct(( + protection: Some(Normal(8.0)), + poise_resilence: Some(Normal(4.0)), + energy_reward: Some(0.15), + crit_power: Some(0.05), + )), )), + quality: Legendary, + tags: [], +) diff --git a/assets/common/items/armor/brinestone/foot.ron b/assets/common/items/armor/brinestone/foot.ron new file mode 100644 index 0000000000..d5da649eab --- /dev/null +++ b/assets/common/items/armor/brinestone/foot.ron @@ -0,0 +1,10 @@ +ItemDef( + name: "Brinestone Boots", + description: "Not very comfortable.", + kind: Armor(( + kind: Foot, + stats: FromSet("Brinestone"), + )), + quality: Legendary, + tags: [], +) \ No newline at end of file diff --git a/assets/common/items/armor/brinestone/hand.ron b/assets/common/items/armor/brinestone/hand.ron new file mode 100644 index 0000000000..f5c3558b19 --- /dev/null +++ b/assets/common/items/armor/brinestone/hand.ron @@ -0,0 +1,10 @@ +ItemDef( + name: "Brinestone Guantlets", + description: "Hits like a rock.", + kind: Armor(( + kind: Hand, + stats: FromSet("Brinestone"), + )), + quality: Legendary, + tags: [], +) \ No newline at end of file diff --git a/assets/common/items/armor/brinestone/pants.ron b/assets/common/items/armor/brinestone/pants.ron new file mode 100644 index 0000000000..1ed1d8c996 --- /dev/null +++ b/assets/common/items/armor/brinestone/pants.ron @@ -0,0 +1,10 @@ +ItemDef( + name: "Brinestone Pants", + description: "Do not tumble.", + kind: Armor(( + kind: Pants, + stats: FromSet("Brinestone"), + )), + quality: Legendary, + tags: [], +) \ No newline at end of file diff --git a/assets/common/items/armor/brinestone/shoulder.ron b/assets/common/items/armor/brinestone/shoulder.ron new file mode 100644 index 0000000000..5ecc4602e7 --- /dev/null +++ b/assets/common/items/armor/brinestone/shoulder.ron @@ -0,0 +1,10 @@ +ItemDef( + name: "Brinestone Pads", + description: "Almost too heavy.", + kind: Armor(( + kind: Shoulder, + stats: FromSet("Brinestone"), + )), + quality: Legendary, + tags: [], +) \ No newline at end of file diff --git a/assets/common/items/armor/cardinal/mitre.ron b/assets/common/items/armor/cardinal/mitre.ron new file mode 100644 index 0000000000..a83f77e0a9 --- /dev/null +++ b/assets/common/items/armor/cardinal/mitre.ron @@ -0,0 +1,10 @@ +ItemDef( + name: "Cardinal Mitre", + description: "Induces respect.", + kind: Armor(( + kind: Head, + stats: FromSet("Cardinal"), + )), + quality: Legendary, + tags: [], +) diff --git a/assets/common/items/crafting_ing/brinestone.ron b/assets/common/items/crafting_ing/brinestone.ron new file mode 100644 index 0000000000..f24afadd2d --- /dev/null +++ b/assets/common/items/crafting_ing/brinestone.ron @@ -0,0 +1,9 @@ +ItemDef( + name: "Brinestone", + description: "Used for armor crafting.", + kind: Ingredient( + // Descriptor not needed + descriptor: "", ), + quality: Epic, + tags: [], +) diff --git a/assets/common/items/keys/glass_key.ron b/assets/common/items/keys/glass_key.ron new file mode 100644 index 0000000000..8f469dcd43 --- /dev/null +++ b/assets/common/items/keys/glass_key.ron @@ -0,0 +1,11 @@ +ItemDef( + name: "Glass Key", + description: "Used to open Glass Barriers. Will break after use.", + kind: Utility( + kind: Key, + ), + amount: 1, + quality: Common, + tags: [Utility], +) + diff --git a/assets/common/items/npc_armor/quadruped_low/dagon.ron b/assets/common/items/npc_armor/quadruped_low/dagon.ron index 84526acf12..52bf5baf17 100644 --- a/assets/common/items/npc_armor/quadruped_low/dagon.ron +++ b/assets/common/items/npc_armor/quadruped_low/dagon.ron @@ -4,7 +4,7 @@ ItemDef( kind: Armor(( kind: Chest, stats: Direct(( - protection: Some(Normal(150.0)), + protection: Some(Normal(100.0)), poise_resilience: Some(Normal(5.0)), )), )), diff --git a/assets/common/items/npc_weapons/unique/arthropods/dagonite.ron b/assets/common/items/npc_weapons/unique/arthropods/dagonite.ron new file mode 100644 index 0000000000..c3dc0d2148 --- /dev/null +++ b/assets/common/items/npc_weapons/unique/arthropods/dagonite.ron @@ -0,0 +1,21 @@ +ItemDef( + name: "Dagonite", + description: "testing123", + kind: Tool(( + kind: Natural, + hands: Two, + stats: ( + equip_time_secs: 0.01, + power: 1.0, + effect_power: 1.0, + speed: 1.0, + crit_chance: 0.1, + range: 1.0, + energy_efficiency: 1.0, + buff_strength: 1.0, + ), + )), + quality: High, + tags: [], + ability_spec: Some(Custom("Dagonite")), +) \ No newline at end of file diff --git a/assets/common/items/npc_weapons/unique/coral_golem_fist.ron b/assets/common/items/npc_weapons/unique/coral_golem_fist.ron new file mode 100644 index 0000000000..61ba2a2274 --- /dev/null +++ b/assets/common/items/npc_weapons/unique/coral_golem_fist.ron @@ -0,0 +1,21 @@ +ItemDef( + name: "Coral Golem Fists", + description: "Yeet", + kind: Tool(( + kind: Natural, + hands: Two, + stats: ( + equip_time_secs: 0.001, + power: 1.0, + effect_power: 1.0, + speed: 1.0, + crit_chance: 0.1, + range: 1.0, + energy_efficiency: 1.0, + buff_strength: 1.0, + ), + )), + quality: Low, + tags: [], + ability_spec: Some(Custom("Coral Golem")), +) \ No newline at end of file diff --git a/assets/common/items/npc_weapons/unique/sea_bishop_sceptre.ron b/assets/common/items/npc_weapons/unique/sea_bishop_sceptre.ron new file mode 100644 index 0000000000..ecef1d76ea --- /dev/null +++ b/assets/common/items/npc_weapons/unique/sea_bishop_sceptre.ron @@ -0,0 +1,21 @@ +ItemDef( + name: "Sea Bishop Sceptre", + description: "Hits like a wave.", + kind: Tool(( + kind: Sceptre, + hands: Two, + stats: ( + equip_time_secs: 0.4, + power: 1.2, + effect_power: 0.8, + speed: 1.2, + crit_chance: 0.4, + range: 1.0, + energy_efficiency: 1.0, + buff_strength: 1.0, + ), + )), + quality: Epic, + tags: [], + ability_spec: Some(Custom("Sea Bishop")), +) \ No newline at end of file diff --git a/assets/common/loadout/dungeon/sea_chapel/cardinal.ron b/assets/common/loadout/dungeon/sea_chapel/cardinal.ron index 7f77141b61..bc1315f2fa 100644 --- a/assets/common/loadout/dungeon/sea_chapel/cardinal.ron +++ b/assets/common/loadout/dungeon/sea_chapel/cardinal.ron @@ -10,5 +10,6 @@ feet: Item("common.items.armor.cardinal.foot"), lantern: Item("common.items.lantern.blue_0"), neck: Item("common.items.armor.misc.neck.abyssal_gorget"), + head: Item("common.items.armor.cardinal.mitre"), ) \ No newline at end of file diff --git a/assets/common/loot_tables/dungeon/sea_chapel/cardinal.ron b/assets/common/loot_tables/dungeon/sea_chapel/cardinal.ron index e6f31655c0..c5b65cfff4 100644 --- a/assets/common/loot_tables/dungeon/sea_chapel/cardinal.ron +++ b/assets/common/loot_tables/dungeon/sea_chapel/cardinal.ron @@ -1,6 +1,5 @@ [ (0.5, Item("common.items.crafting_ing.abyssal_heart")), (2.0, Item("common.items.crafting_ing.coral_branch")), - (2.5, MultiDrop(Item("common.items.utility.coins"), 50, 100)), (0.2, Item("common.items.tool.instruments.glass_flute")), ] \ No newline at end of file diff --git a/assets/common/loot_tables/dungeon/sea_chapel/chest_coral.ron b/assets/common/loot_tables/dungeon/sea_chapel/chest_coral.ron index 533cbb4dc8..f43ce2c4ec 100644 --- a/assets/common/loot_tables/dungeon/sea_chapel/chest_coral.ron +++ b/assets/common/loot_tables/dungeon/sea_chapel/chest_coral.ron @@ -1,6 +1,5 @@ [ // Ingredients - (0.5, Item("common.items.crafting_ing.coral_branch")), - (0.3, Item("common.items.crafting_ing.pearl")), - (5.0, Item("common.items.crafting_ing.seashells")), + (2.0, Item("common.items.crafting_ing.coral_branch")), + (0.5, Item("common.items.crafting_ing.pearl")), ] \ No newline at end of file diff --git a/assets/common/loot_tables/dungeon/sea_chapel/coralgolem.ron b/assets/common/loot_tables/dungeon/sea_chapel/coralgolem.ron new file mode 100644 index 0000000000..60fa9daba3 --- /dev/null +++ b/assets/common/loot_tables/dungeon/sea_chapel/coralgolem.ron @@ -0,0 +1,5 @@ +[ + // Crafting ingredients + (1.0, Item("common.items.crafting_ing.coral_branch")), + (1.0, MultiDrop(Item("common.items.crafting_ing.brinestone"), 1, 3)), +] diff --git a/assets/common/loot_tables/dungeon/sea_chapel/dagon.ron b/assets/common/loot_tables/dungeon/sea_chapel/dagon.ron index 7e10c98663..c12f5ac638 100644 --- a/assets/common/loot_tables/dungeon/sea_chapel/dagon.ron +++ b/assets/common/loot_tables/dungeon/sea_chapel/dagon.ron @@ -1,6 +1,4 @@ [ - (0.5, Item("common.items.crafting_ing.abyssal_heart")), - (0.5, Item("common.items.crafting_ing.pearl")), - (5.0, LootTable("common.loot_tables.creature.quad_low.fanged")), - (5.0, Item("common.items.food.meat.tough_raw")), + (1.0, Item("common.items.crafting_ing.abyssal_heart")), + (1.0, MultiDrop(Item("common.items.crafting_ing.pearl"), 3, 5)), ] \ No newline at end of file diff --git a/assets/common/loot_tables/dungeon/sea_chapel/sea_bishop.ron b/assets/common/loot_tables/dungeon/sea_chapel/sea_bishop.ron new file mode 100644 index 0000000000..88a370980e --- /dev/null +++ b/assets/common/loot_tables/dungeon/sea_chapel/sea_bishop.ron @@ -0,0 +1,4 @@ +[ + (1.0, MultiDrop(Item("common.items.crafting_ing.brinestone"), 3, 6)), + (1.0, MultiDrop(Item("common.items.crafting_ing.pearl"), 1, 2)), +] \ No newline at end of file diff --git a/assets/common/material_stats_manifest.ron b/assets/common/material_stats_manifest.ron index 16ad69e44b..d5b19098dd 100644 --- a/assets/common/material_stats_manifest.ron +++ b/assets/common/material_stats_manifest.ron @@ -323,6 +323,12 @@ energy_reward: Some(-0.35), crit_power: Some(0.35), stealth: Some(0.5), + ), + "Brinestone": ( + protection: Some(Normal(120.0)), + poise_resilence: Some(Normal(28.0)), + energy_reward: Some(0.35), + crit_power: Some(0.25), ) }, ) diff --git a/assets/common/npc_names.ron b/assets/common/npc_names.ron index 8723d82d26..d2f71081c1 100644 --- a/assets/common/npc_names.ron +++ b/assets/common/npc_names.ron @@ -969,6 +969,10 @@ adlet_elder: ( keyword: "adlet_elder", generic: "Adlet Elder" + ), + sea_bishop: ( + keyword: "sea_bishop", + generic: "Sea Bishop" ) ) ), @@ -995,6 +999,10 @@ claygolem: ( keyword: "claygolem", generic: "ClayGolem" + ), + coralgolem: ( + keyword: "coralgolem", + generic: "CoralGolem" ) ) ), @@ -1367,6 +1375,10 @@ keyword: "crawler_sand", generic: "Sand Crawler" ), + dagonite: ( + keyword: "dagonite", + generic: "Dagonite" + ), ) ), ) diff --git a/assets/common/recipe_book.ron b/assets/common/recipe_book.ron index defa3f5ce3..133c504229 100644 --- a/assets/common/recipe_book.ron +++ b/assets/common/recipe_book.ron @@ -1638,7 +1638,76 @@ ], craft_sprite: Some(Anvil), ), - + //ARMOR/BRINESTONE + "brinestone_back": ( + output: ("common.items.armor.brinestone.back", 1), + inputs: [ + (Item("common.items.mineral.ore.gold"), 1, false), + (Item("common.items.crafting_ing.brinestone"), 2, false), + (Item("common.items.crafting_ing.leather.rigid_leather"), 3, false), + ], + craft_sprite: Some(Anvil), + ), + "brinestone_belt": ( + output: ("common.items.armor.brinestone.belt", 1), + inputs: [ + (Item("common.items.mineral.ore.gold"), 1, false), + (Item("common.items.crafting_ing.brinestone"), 2, false), + ], + craft_sprite: Some(Anvil), + ), + "brinestone_chest": ( + output: ("common.items.armor.brinestone.chest", 1), + inputs: [ + (Item("common.items.mineral.ore.gold"), 2, false), + (Item("common.items.crafting_ing.brinestone"), 4, false), + (Item("common.items.crafting_ing.leather.rigid_leather"), 2, false), + ], + craft_sprite: Some(Anvil), + ), + "brinestone_feet": ( + output: ("common.items.armor.brinestone.foot", 1), + inputs: [ + (Item("common.items.mineral.ore.gold"), 1, false), + (Item("common.items.crafting_ing.brinestone"), 2, false), + ], + craft_sprite: Some(Anvil), + ), + "brinestone_hands": ( + output: ("common.items.armor.brinestone.hand", 1), + inputs: [ + (Item("common.items.crafting_ing.pearl"), 1, false), + (Item("common.items.crafting_ing.brinestone"), 2, false), + ], + craft_sprite: Some(Anvil), + ), + "brinestone_pants": ( + output: ("common.items.armor.brinestone.pants", 1), + inputs: [ + (Item("common.items.mineral.ore.gold"), 2, false), + (Item("common.items.crafting_ing.brinestone"), 4, false), + (Item("common.items.crafting_ing.leather.rigid_leather"), 3, false), + ], + craft_sprite: Some(Anvil), + ), + "brinestone_shoulder": ( + output: ("common.items.armor.brinestone.shoulder", 1), + inputs: [ + (Item("common.items.mineral.ore.gold"), 2, false), + (Item("common.items.crafting_ing.brinestone"), 4, false), + (Item("common.items.crafting_ing.leather.rigid_leather"), 4, false), + ], + craft_sprite: Some(Anvil), + ), + "brinestone_crown": ( + output: ("common.items.armor.brinestone.crown", 1), + inputs: [ + (Item("common.items.mineral.ore.gold"), 1, false), + (Item("common.items.crafting_ing.pearl"), 2, false), + (Item("common.items.crafting_ing.brinestone"), 4, false), + ], + craft_sprite: Some(Anvil), + ), "seashell_necklace": ( output: ("common.items.armor.misc.neck.shell", 1), inputs: [ diff --git a/assets/server/manifests/kits.ron b/assets/server/manifests/kits.ron index 4bedef0acd..1e520e27e0 100644 --- a/assets/server/manifests/kits.ron +++ b/assets/server/manifests/kits.ron @@ -388,6 +388,16 @@ (Item("common.items.armor.boreal.back"),1), (Item("common.items.armor.misc.head.boreal_warhelm"),1), ], + "brinestone": [ + (Item("common.items.armor.brinestone.chest"),1), + (Item("common.items.armor.brinestone.pants"),1), + (Item("common.items.armor.brinestone.hand"),1), + (Item("common.items.armor.brinestone.foot"),1), + (Item("common.items.armor.brinestone.shoulder"),1), + (Item("common.items.armor.brinestone.belt"),1), + (Item("common.items.armor.brinestone.back"),1), + (Item("common.items.armor.brinestone.crown"),1), + ], "instruments": [ (Item("common.items.tool.instruments.double_bass"),1), (Item("common.items.tool.instruments.flute"),1), diff --git a/assets/voxygen/audio/sfx.ron b/assets/voxygen/audio/sfx.ron index a97129db14..de355530b7 100644 --- a/assets/voxygen/audio/sfx.ron +++ b/assets/voxygen/audio/sfx.ron @@ -1471,6 +1471,13 @@ threshold: 0.9, subtitle: "subtitle-attack-ice_crack", ), + Steam: ( + files: [ + "voxygen.audio.sfx.abilities.steam", + ], + threshold: 0.9, + subtitle: "subtitle-attack-steam", + ), // Utterances (NPCs) diff --git a/assets/voxygen/audio/sfx/abilities/steam.ogg b/assets/voxygen/audio/sfx/abilities/steam.ogg new file mode 100644 index 0000000000..afe4bf78e7 --- /dev/null +++ b/assets/voxygen/audio/sfx/abilities/steam.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5486f9c68e70ba591c1e1cb3ee2a07e399c83b90b5c0e7ecc1c3a7e78a14e200 +size 33735 diff --git a/assets/voxygen/i18n/en/hud/subtitles.ftl b/assets/voxygen/i18n/en/hud/subtitles.ftl index 8d12305a3c..240b8ff047 100644 --- a/assets/voxygen/i18n/en/hud/subtitles.ftl +++ b/assets/voxygen/i18n/en/hud/subtitles.ftl @@ -106,6 +106,7 @@ subtitle-giga_roar = Frost gigas roar subtitle-attack-flash_freeze = Flash freeze subtitle-attack-icy_spikes = Icy spikes subtitle-attack-ice_crack = Ice crack +subtitle-attack-steam = Steam subtitle-consume_potion = Drinking potion subtitle-consume_apple = Eating apple diff --git a/assets/voxygen/i18n/en/npc.ftl b/assets/voxygen/i18n/en/npc.ftl index 00d24ba40e..c07d12b26b 100644 --- a/assets/voxygen/i18n/en/npc.ftl +++ b/assets/voxygen/i18n/en/npc.ftl @@ -218,11 +218,10 @@ npc-speech-cultist_low_health_fleeing = .a4 = I must rest! .a5 = They're too strong! npc-speech-prisoner = - .a0 = Them scoundrels took away my pickaxe! + .a0 = Please find the key! .a1 = Being trapped is no fun. .a2 = That Cardinal can't be trusted. .a3 = These Clerics are up to no good. - .a4 = I wish i still had my pick! npc-speech-moving_on = .a0 = I've spent enough time here, onward to { $site }! npc-speech-migrating = diff --git a/assets/voxygen/i18n/sv_SE/hud/subtitles.ftl b/assets/voxygen/i18n/sv_SE/hud/subtitles.ftl index 1686a4d722..0ac0f655b5 100644 --- a/assets/voxygen/i18n/sv_SE/hud/subtitles.ftl +++ b/assets/voxygen/i18n/sv_SE/hud/subtitles.ftl @@ -105,6 +105,7 @@ subtitle-giga_roar = Frost gigas vrål subtitle-attack-flash_freeze = Blixtfrysning subtitle-attack-icy_spikes = Istappar subtitle-attack-ice_crack = Isspricka +subtitle-attack-steam = Ånga subtitle-consume_potion = Dricker förtrollningsdryck subtitle-consume_apple = Äter äpple diff --git a/assets/voxygen/item_image_manifest.ron b/assets/voxygen/item_image_manifest.ron index f35e7d5ddc..140c72f93c 100644 --- a/assets/voxygen/item_image_manifest.ron +++ b/assets/voxygen/item_image_manifest.ron @@ -1987,6 +1987,39 @@ "voxel.armor.boreal.back", (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 0.9, ), + //Brinestone Armor + Simple("common.items.armor.brinestone.chest"): VoxTrans( + "voxel.armor.brinestone.chest", + (0.0, 1.0, 0.0), (-120.0, 210.0,15.0), 1.1, + ), + Simple("common.items.armor.brinestone.pants"): VoxTrans( + "voxel.armor.brinestone.pants", + (0.0, 1.0, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Simple("common.items.armor.brinestone.belt"): VoxTrans( + "voxel.armor.brinestone.belt", + (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Simple("common.items.armor.brinestone.foot"): VoxTrans( + "voxel.armor.brinestone.foot", + (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Simple("common.items.armor.brinestone.hand"): VoxTrans( + "voxel.armor.brinestone.hand", + (0.0, 0.0, 0.0), (-90.0, 135.0, 0.0), 1.0, + ), + Simple("common.items.armor.brinestone.shoulder"): VoxTrans( + "voxel.armor.brinestone.shoulder", + (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 1.0, + ), + Simple("common.items.armor.brinestone.back"): VoxTrans( + "voxel.armor.brinestone.back", + (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 0.9, + ), + Simple("common.items.armor.brinestone.crown"): VoxTrans( + "voxel.armor.brinestone.crown", + (0.0, 4.0, 0.0), (-120.0, 210.0,15.0), 1.3, + ), //Blue Leather Armor Simple("common.items.npc_armor.chest.leather_blue"): VoxTrans( "voxel.armor.leather_blue.chest", @@ -2128,6 +2161,10 @@ "voxel.armor.cardinal.shoulder", (0.0, 0.0, 0.0), (-120.0, 210.0,15.0), 1.0, ), + Simple("common.items.armor.cardinal.mitre"): VoxTrans( + "voxel.armor.cardinal.mitre", + (0.0, 4.0, 0.0), (-120.0, 210.0,15.0), 1.3, + ), //Twig Set Simple("common.items.armor.twigs.chest"): VoxTrans( "voxel.armor.twigs.chest", @@ -3653,6 +3690,10 @@ "voxel.sprite.crafting_ing.abyssal_heart", (0.0, 0.0, 0.0), (-50.0, 30.0, 20.0), 0.8, ), + Simple("common.items.crafting_ing.brinestone"): VoxTrans( + "voxel.sprite.crafting_ing.brinestone", + (0.0, 0.0, 0.0), (-50.0, 30.0, 20.0), 0.8, + ), Simple("common.items.crafting_ing.pearl"): VoxTrans( "voxel.sprite.crafting_ing.pearl", (0.0, 0.0, 0.0), (-50.0, 30.0, 20.0), 0.5, @@ -4861,6 +4902,10 @@ "voxel.object.key_bone", (0.0, 0.0, 0.0), (-100.0, 250.0, 15.0), 1.0, ), + Simple("common.items.keys.glass_key"): VoxTrans( + "voxel.object.key_glass", + (0.0, 0.0, 0.0), (-100.0, 250.0, 15.0), 1.0, + ), // Lockpicks Simple("common.items.utility.lockpick_0"): VoxTrans( "voxel.object.lockpick", diff --git a/assets/voxygen/voxel/armor/brinestone/back.vox b/assets/voxygen/voxel/armor/brinestone/back.vox new file mode 100644 index 0000000000..57eb853461 --- /dev/null +++ b/assets/voxygen/voxel/armor/brinestone/back.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:378770414ba397ccced0a72100833325d3abefc06c577bd79b5e5c62ffcb72d1 +size 1528 diff --git a/assets/voxygen/voxel/armor/brinestone/belt.vox b/assets/voxygen/voxel/armor/brinestone/belt.vox new file mode 100644 index 0000000000..2d797d8d18 --- /dev/null +++ b/assets/voxygen/voxel/armor/brinestone/belt.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1242da1d842b239836f2ac86ac2c1b16b04a7fd20466610b673ce8ed97d4776 +size 1544 diff --git a/assets/voxygen/voxel/armor/brinestone/chest.vox b/assets/voxygen/voxel/armor/brinestone/chest.vox new file mode 100644 index 0000000000..18bd9aba92 --- /dev/null +++ b/assets/voxygen/voxel/armor/brinestone/chest.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53f6dd9e91cc9e0a821717b18bb9266b6a2767d97d2997ebe93c7ee924d75324 +size 3184 diff --git a/assets/voxygen/voxel/armor/brinestone/crown.vox b/assets/voxygen/voxel/armor/brinestone/crown.vox new file mode 100644 index 0000000000..8facc874bc --- /dev/null +++ b/assets/voxygen/voxel/armor/brinestone/crown.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d61e8ad288a06476fe5192ddd68168e8c42b531545441281f166863cc0f5715f +size 2104 diff --git a/assets/voxygen/voxel/armor/brinestone/foot.vox b/assets/voxygen/voxel/armor/brinestone/foot.vox new file mode 100644 index 0000000000..8c0a804ac0 --- /dev/null +++ b/assets/voxygen/voxel/armor/brinestone/foot.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ed4c1d2c1184083b5fa21c26c8d0aba9609f232de7e60d731f84d849610f992 +size 1472 diff --git a/assets/voxygen/voxel/armor/brinestone/hand.vox b/assets/voxygen/voxel/armor/brinestone/hand.vox new file mode 100644 index 0000000000..ddcabdb5e1 --- /dev/null +++ b/assets/voxygen/voxel/armor/brinestone/hand.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4459a56386e3a8ea7f1fe880eebf78c947eadb7f3ba61ae01e812499b528de2f +size 1316 diff --git a/assets/voxygen/voxel/armor/brinestone/pants.vox b/assets/voxygen/voxel/armor/brinestone/pants.vox new file mode 100644 index 0000000000..ab7a357dea --- /dev/null +++ b/assets/voxygen/voxel/armor/brinestone/pants.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a34605416cc3caf20bb454f3c62eac0f65c3b4c27229011d2208ed520b24858c +size 2344 diff --git a/assets/voxygen/voxel/armor/brinestone/shoulder.vox b/assets/voxygen/voxel/armor/brinestone/shoulder.vox new file mode 100644 index 0000000000..38dd4c77e8 --- /dev/null +++ b/assets/voxygen/voxel/armor/brinestone/shoulder.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9052fe1ff6909c52e5badeee76a3b1fd8c812a7b5919055ed7cf69686f8b712b +size 1748 diff --git a/assets/voxygen/voxel/armor/cardinal/mitre.vox b/assets/voxygen/voxel/armor/cardinal/mitre.vox new file mode 100644 index 0000000000..072021fb08 --- /dev/null +++ b/assets/voxygen/voxel/armor/cardinal/mitre.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e9f0d30ec87211eacc1ba59fe69c87c73a1bbb52e38cdb43c38ef5c4971f2f8a +size 35676 diff --git a/assets/voxygen/voxel/arthropod_central_manifest.ron b/assets/voxygen/voxel/arthropod_central_manifest.ron index 5848158a16..28a13e1d12 100644 --- a/assets/voxygen/voxel/arthropod_central_manifest.ron +++ b/assets/voxygen/voxel/arthropod_central_manifest.ron @@ -219,4 +219,24 @@ central: ("npc.crawler_sand.male.chest"), ), ), + (Dagonite, Male): ( + head: ( + offset: (-5.5, 0.0, -5.0), + central: ("npc.dagonite.male.head"), + ), + chest: ( + offset: (-4.5, -4.0, -5.5), + central: ("npc.dagonite.male.chest"), + ), + ), + (Dagonite, Female): ( + head: ( + offset: (-5.5, 0.0, -5.0), + central: ("npc.dagonite.male.head"), + ), + chest: ( + offset: (-4.5, -4.0, -5.5), + central: ("npc.dagonite.male.chest"), + ), + ), }) diff --git a/assets/voxygen/voxel/arthropod_lateral_manifest.ron b/assets/voxygen/voxel/arthropod_lateral_manifest.ron index ce0faddc2a..09da235525 100644 --- a/assets/voxygen/voxel/arthropod_lateral_manifest.ron +++ b/assets/voxygen/voxel/arthropod_lateral_manifest.ron @@ -1275,4 +1275,120 @@ lateral: ("armor.empty"), ), ), + (Dagonite, Male): ( + mandible_l: ( + offset: (0.0, 0.0, -3.0), + lateral: ("armor.empty"), + ), + mandible_r: ( + offset: (-2.0, 0.0, -3.0), + lateral: ("armor.empty"), + ), + wing_fl: ( + offset: (-6.0, -4.5, -8.0), + lateral: ("armor.empty"), + ), + wing_fr: ( + offset: (0.0, -4.5, -8.0), + lateral: ("armor.empty"), + ), + wing_bl: ( + offset: (-11.0, -1.0, -8.0), + lateral: ("armor.empty"), + ), + wing_br: ( + offset: (-11.0, -1.0, -8.0), + lateral: ("armor.empty"), + ), + leg_fl: ( + offset: (-6.0, -0.5, -5.0), + lateral: ("npc.dagonite.male.leg_fr"), + ), + leg_fr: ( + offset: (-0.0, -0.5, -5.0), + lateral: ("npc.dagonite.male.leg_fr"), + ), + leg_fcl: ( + offset: (-6.0, -0.5, -5.0), + lateral: ("npc.dagonite.male.leg_fcr"), + ), + leg_fcr: ( + offset: (-0.0, -0.5, -5.0), + lateral: ("npc.dagonite.male.leg_fcr"), + ), + leg_bcl: ( + offset: (-6.0, -0.5, -5.0), + lateral: ("npc.dagonite.male.leg_bcr"), + ), + leg_bcr: ( + offset: (-0.0, -0.5, -5.0), + lateral: ("npc.dagonite.male.leg_bcr"), + ), + leg_bl: ( + offset: (-11.0, -0.5, -4.5), + lateral: ("armor.empty"), + ), + leg_br: ( + offset: (0.0, -0.5, -4.5), + lateral: ("armor.empty"), + ), + ), + (Dagonite, Female): ( + mandible_l: ( + offset: (0.0, 0.0, -3.0), + lateral: ("armor.empty"), + ), + mandible_r: ( + offset: (-2.0, 0.0, -3.0), + lateral: ("armor.empty"), + ), + wing_fl: ( + offset: (-6.0, -4.5, -8.0), + lateral: ("armor.empty"), + ), + wing_fr: ( + offset: (0.0, -4.5, -8.0), + lateral: ("armor.empty"), + ), + wing_bl: ( + offset: (-11.0, -1.0, -8.0), + lateral: ("armor.empty"), + ), + wing_br: ( + offset: (-11.0, -1.0, -8.0), + lateral: ("armor.empty"), + ), + leg_fl: ( + offset: (-6.0, -0.5, -5.0), + lateral: ("npc.dagonite.male.leg_fr"), + ), + leg_fr: ( + offset: (-0.0, -0.5, -5.0), + lateral: ("npc.dagonite.male.leg_fr"), + ), + leg_fcl: ( + offset: (-6.0, -0.5, -5.0), + lateral: ("npc.dagonite.male.leg_fcr"), + ), + leg_fcr: ( + offset: (-0.0, -0.5, -5.0), + lateral: ("npc.dagonite.male.leg_fcr"), + ), + leg_bcl: ( + offset: (-6.0, -0.5, -5.0), + lateral: ("npc.dagonite.male.leg_bcr"), + ), + leg_bcr: ( + offset: (-0.0, -0.5, -5.0), + lateral: ("npc.dagonite.male.leg_bcr"), + ), + leg_bl: ( + offset: (-11.0, -0.5, -4.5), + lateral: ("armor.empty"), + ), + leg_br: ( + offset: (0.0, -0.5, -4.5), + lateral: ("armor.empty"), + ), + ), }) diff --git a/assets/voxygen/voxel/biped_large_central_manifest.ron b/assets/voxygen/voxel/biped_large_central_manifest.ron index 90ba359938..730df509fa 100644 --- a/assets/voxygen/voxel/biped_large_central_manifest.ron +++ b/assets/voxygen/voxel/biped_large_central_manifest.ron @@ -1248,4 +1248,56 @@ central: ("armor.empty"), ) ), + (SeaBishop, Male): ( + head: ( + offset: (-7.0, -4.5, -8.5), + central: ("npc.sea_bishop.male.head"), + ), + torso_upper: ( + offset: (-4.0, -5.0, -5.0), + central: ("npc.sea_bishop.male.torso_upper"), + ), + torso_lower: ( + offset: (-6.0, -4.5, -11.0), + central: ("npc.sea_bishop.male.torso_lower"), + ), + jaw: ( + offset: (-2.0, 0.0, -2.0), + central: ("armor.empty"), + ), + tail: ( + offset: (-4.0, -27.0, -6.0), + central: ("armor.empty"), + ), + second: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ) + ), + (SeaBishop, Female): ( + head: ( + offset: (-7.0, -4.5, -8.5), + central: ("npc.sea_bishop.male.head"), + ), + torso_upper: ( + offset: (-4.0, -5.0, -5.0), + central: ("npc.sea_bishop.male.torso_upper"), + ), + torso_lower: ( + offset: (-6.0, -4.5, -11.0), + central: ("npc.sea_bishop.male.torso_lower"), + ), + jaw: ( + offset: (-2.0, 0.0, -2.0), + central: ("armor.empty"), + ), + tail: ( + offset: (-4.0, -27.0, -6.0), + central: ("armor.empty"), + ), + second: ( + offset: (0.0, 0.0, 0.0), + central: ("armor.empty"), + ) + ), }) diff --git a/assets/voxygen/voxel/biped_large_lateral_manifest.ron b/assets/voxygen/voxel/biped_large_lateral_manifest.ron index 151932ef03..18571716b0 100644 --- a/assets/voxygen/voxel/biped_large_lateral_manifest.ron +++ b/assets/voxygen/voxel/biped_large_lateral_manifest.ron @@ -1631,4 +1631,72 @@ lateral: ("npc.adlet.elder.male.foot_r"), ), ), + (SeaBishop, Male): ( + shoulder_l: ( + offset: (-3.5, -2.0, -4.0), + lateral: ("npc.sea_bishop.male.shoulder_l"), + ), + shoulder_r: ( + offset: (-3.5, -2.0, -4.0), + lateral: ("npc.sea_bishop.male.shoulder_r"), + ), + hand_l: ( + offset: (-3.0, -2.0, -9.0), + lateral: ("npc.sea_bishop.male.hand_l"), + ), + hand_r: ( + offset: (-3.0, -2.0, -9.0), + lateral: ("npc.sea_bishop.male.hand_r"), + ), + leg_l: ( + offset: (-2.0, -3.5, 0.0), + lateral: ("npc.sea_bishop.male.leg_l"), + ), + leg_r: ( + offset: (-2.0, -3.5, 0.0), + lateral: ("npc.sea_bishop.male.leg_r"), + ), + foot_l: ( + offset: (-3.5, -6.0, -9.0), + lateral: ("armor.empty"), + ), + foot_r: ( + offset: (-3.5, -6.0, -9.0), + lateral: ("armor.empty"), + ), + ), + (SeaBishop, Female): ( + shoulder_l: ( + offset: (-3.5, -2.0, -4.0), + lateral: ("npc.sea_bishop.male.shoulder_l"), + ), + shoulder_r: ( + offset: (-3.5, -2.0, -4.0), + lateral: ("npc.sea_bishop.male.shoulder_r"), + ), + hand_l: ( + offset: (-3.0, -2.0, -9.0), + lateral: ("npc.sea_bishop.male.hand_l"), + ), + hand_r: ( + offset: (-3.0, -2.0, -9.0), + lateral: ("npc.sea_bishop.male.hand_r"), + ), + leg_l: ( + offset: (-2.0, -3.5, 0.0), + lateral: ("npc.sea_bishop.male.leg_l"), + ), + leg_r: ( + offset: (-2.0, -3.5, 0.0), + lateral: ("npc.sea_bishop.male.leg_r"), + ), + foot_l: ( + offset: (-3.5, -6.0, -9.0), + lateral: ("armor.empty"), + ), + foot_r: ( + offset: (-3.5, -6.0, -9.0), + lateral: ("armor.empty"), + ), + ), }) \ No newline at end of file diff --git a/assets/voxygen/voxel/biped_weapon_manifest.ron b/assets/voxygen/voxel/biped_weapon_manifest.ron index f49c3b2acd..11cd3c48d1 100644 --- a/assets/voxygen/voxel/biped_weapon_manifest.ron +++ b/assets/voxygen/voxel/biped_weapon_manifest.ron @@ -1775,4 +1775,8 @@ vox_spec: ("weapon.biped_small.hammer.boreal_hammer", (-2.5, -6.0, -4.0)), color: None ), + Tool("common.items.npc_weapons.unique.sea_bishop_sceptre"): ( + vox_spec: ("weapon.sceptre.scepter_sea_bishop", (-3.5, -4.0, 3.0)), + color: None + ), }) diff --git a/assets/voxygen/voxel/golem_central_manifest.ron b/assets/voxygen/voxel/golem_central_manifest.ron index d872ec79c0..5d8b7d4e71 100644 --- a/assets/voxygen/voxel/golem_central_manifest.ron +++ b/assets/voxygen/voxel/golem_central_manifest.ron @@ -143,4 +143,40 @@ central: ("npc.woodgolem.male.chest_lower"), ), ), + (CoralGolem, Male): ( + head: ( + offset: (-8.5, -2.5, -7.0), + central: ("npc.coralgolem.male.head"), + ), + jaw: ( + offset: (-9.5, 0.0, -3.0), + central: ("armor.empty"), + ), + torso_upper: ( + offset: (-11.5, -16.0, -11.5), + central: ("npc.coralgolem.male.chest_upper"), + ), + torso_lower: ( + offset: (-4.5, -4.0, -8.0), + central: ("npc.coralgolem.male.chest_lower"), + ), + ), + (CoralGolem, Female): ( + head: ( + offset: (-8.5, -2.5, -7.0), + central: ("npc.coralgolem.male.head"), + ), + jaw: ( + offset: (-9.5, 0.0, -3.0), + central: ("armor.empty"), + ), + torso_upper: ( + offset: (-11.5, -16.0, -11.5), + central: ("npc.coralgolem.male.chest_upper"), + ), + torso_lower: ( + offset: (-4.5, -4.0, -8.0), + central: ("npc.coralgolem.male.chest_lower"), + ), + ), }) diff --git a/assets/voxygen/voxel/golem_lateral_manifest.ron b/assets/voxygen/voxel/golem_lateral_manifest.ron index 2deae03ae1..78f096f7a4 100644 --- a/assets/voxygen/voxel/golem_lateral_manifest.ron +++ b/assets/voxygen/voxel/golem_lateral_manifest.ron @@ -271,4 +271,72 @@ lateral: ("npc.woodgolem.male.foot_r"), ) ), + (CoralGolem, Male): ( + shoulder_l: ( + offset: (-7.5, -6.5, -6.5), + lateral: ("npc.coralgolem.male.shoulder_l"), + ), + shoulder_r: ( + offset: (-7.5, -6.5, -6.5), + lateral: ("npc.coralgolem.male.shoulder_r"), + ), + hand_l: ( + offset: (-7.0, -6.0, -15.0), + lateral: ("npc.coralgolem.male.hand_l"), + ), + hand_r: ( + offset: (-7.0, -6.0, -15.0), + lateral: ("npc.coralgolem.male.hand_r"), + ), + leg_l: ( + offset: (-5.0, -3.5, -4.0), + lateral: ("npc.coralgolem.male.leg_l"), + ), + leg_r: ( + offset: (0.0, -3.5, -4.0), + lateral: ("npc.coralgolem.male.leg_r"), + ), + foot_l: ( + offset: (-3.5, -4.5, -9.0), + lateral: ("npc.coralgolem.male.foot_l"), + ), + foot_r: ( + offset: (-3.5, -4.5, -9.0), + lateral: ("npc.coralgolem.male.foot_r"), + ) + ), + (CoralGolem, Female): ( + shoulder_l: ( + offset: (-7.5, -6.5, -6.5), + lateral: ("npc.coralgolem.male.shoulder_l"), + ), + shoulder_r: ( + offset: (-7.5, -6.5, -6.5), + lateral: ("npc.coralgolem.male.shoulder_r"), + ), + hand_l: ( + offset: (-7.0, -6.0, -15.0), + lateral: ("npc.coralgolem.male.hand_l"), + ), + hand_r: ( + offset: (-7.0, -6.0, -15.0), + lateral: ("npc.coralgolem.male.hand_r"), + ), + leg_l: ( + offset: (-5.0, -3.5, -4.0), + lateral: ("npc.coralgolem.male.leg_l"), + ), + leg_r: ( + offset: (0.0, -3.5, -4.0), + lateral: ("npc.coralgolem.male.leg_r"), + ), + foot_l: ( + offset: (-3.5, -4.5, -9.0), + lateral: ("npc.coralgolem.male.foot_l"), + ), + foot_r: ( + offset: (-3.5, -4.5, -9.0), + lateral: ("npc.coralgolem.male.foot_r"), + ) + ), }) diff --git a/assets/voxygen/voxel/humanoid_armor_back_manifest.ron b/assets/voxygen/voxel/humanoid_armor_back_manifest.ron index f1d95ca8f9..c63abd012f 100644 --- a/assets/voxygen/voxel/humanoid_armor_back_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_back_manifest.ron @@ -32,6 +32,10 @@ vox_spec: ("armor.boreal.back", (-5.0, -2.0, -14.0)), color: None ), + "common.items.armor.brinestone.back": ( + vox_spec: ("armor.brinestone.back", (-5.0, -2.0, -14.0)), + color: None + ), "common.items.armor.misc.back.backpack": ( vox_spec: ("armor.misc.back.backpack", (-7.0, -5.0, -10.0)), color: None diff --git a/assets/voxygen/voxel/humanoid_armor_belt_manifest.ron b/assets/voxygen/voxel/humanoid_armor_belt_manifest.ron index 5c8168bd02..ebd72935f3 100644 --- a/assets/voxygen/voxel/humanoid_armor_belt_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_belt_manifest.ron @@ -32,6 +32,10 @@ vox_spec: ("armor.boreal.belt", (-4.0, -3.0, 2.0)), color: None ), + "common.items.armor.brinestone.belt": ( + vox_spec: ("armor.brinestone.belt", (-4.0, -3.0, 2.0)), + color: None + ), "common.items.armor.cloth_purple.belt": ( vox_spec: ("armor.cloth_purple.belt", (-5.0, -3.5, 2.0)), color: None diff --git a/assets/voxygen/voxel/humanoid_armor_chest_manifest.ron b/assets/voxygen/voxel/humanoid_armor_chest_manifest.ron index aa334b5328..cf7894b049 100644 --- a/assets/voxygen/voxel/humanoid_armor_chest_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_chest_manifest.ron @@ -36,6 +36,10 @@ vox_spec: ("armor.boreal.chest", (-7.0, -3.5, 2.0)), color: None ), + "common.items.armor.brinestone.chest": ( + vox_spec: ("armor.brinestone.chest", (-7.0, -3.5, 0.0)), + color: None + ), "common.items.armor.assassin.chest": ( vox_spec: ("armor.assassin.chest", (-7.0, -3.5, 2.0)), color: None diff --git a/assets/voxygen/voxel/humanoid_armor_foot_manifest.ron b/assets/voxygen/voxel/humanoid_armor_foot_manifest.ron index 14ae1ce70c..abfa0c63f5 100644 --- a/assets/voxygen/voxel/humanoid_armor_foot_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_foot_manifest.ron @@ -28,6 +28,10 @@ vox_spec: ("armor.boreal.foot", (-2.5, -3.5, -2.0)), color: None ), + "common.items.armor.brinestone.foot": ( + vox_spec: ("armor.brinestone.foot", (-2.5, -3.5, -2.0)), + color: None + ), "common.items.armor.cloth_blue.foot": ( vox_spec: ("armor.cloth_blue.foot", (-2.5, -3.5, -2.0)), color: None diff --git a/assets/voxygen/voxel/humanoid_armor_hand_manifest.ron b/assets/voxygen/voxel/humanoid_armor_hand_manifest.ron index 6fb2d99faf..0361e1e940 100644 --- a/assets/voxygen/voxel/humanoid_armor_hand_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_hand_manifest.ron @@ -50,6 +50,16 @@ color: None ) ), + "common.items.armor.brinestone.hand": ( + left: ( + vox_spec: ("armor.brinestone.hand", (-3.5, -1.5, -4.0)), + color: None + ), + right: ( + vox_spec: ("armor.brinestone.hand", (-1.5, -1.5, -4.0)), + color: None + ) + ), "common.items.armor.cloth_purple.hand": ( left: ( vox_spec: ("armor.cloth_purple.hand", (-1.5, -1.5, -2.5)), diff --git a/assets/voxygen/voxel/humanoid_armor_head_manifest.ron b/assets/voxygen/voxel/humanoid_armor_head_manifest.ron index 49db7892f0..fb3aacb379 100644 --- a/assets/voxygen/voxel/humanoid_armor_head_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_head_manifest.ron @@ -1107,6 +1107,55 @@ vox_spec: ("armor.misc.head.facegourd", (-2.0, -6.0, 1.0)), color: None ), + // Cardinal Mitre + (Human, Male, "common.items.armor.cardinal.mitre"): ( + vox_spec: ("armor.cardinal.mitre", (-4.0, -5.0, 5.0)), + color: None + ), + (Human, Female, "common.items.armor.cardinal.mitre"): ( + vox_spec: ("armor.cardinal.mitre", (-4.0, -5.0, 5.0)), + color: None + ), + (Elf, Male, "common.items.armor.cardinal.mitre"): ( + vox_spec: ("armor.cardinal.mitre", (-3.0, -5.0, 7.0)), + color: None + ), + (Elf, Female, "common.items.armor.cardinal.mitre"): ( + vox_spec: ("armor.cardinal.mitre", (-3.0, -6.0, 5.0)), + color: None + ), + (Dwarf, Male, "common.items.armor.cardinal.mitre"): ( + vox_spec: ("armor.cardinal.mitre", (-5.0, -4.0, 5.0)), + color: None + ), + (Dwarf, Female, "common.items.armor.cardinal.mitre"): ( + vox_spec: ("armor.cardinal.mitre", (-5.0, -4.0, 5.0)), + color: None + ), + (Danari, Male, "common.items.armor.cardinal.mitre"): ( + vox_spec: ("armor.cardinal.mitre", (-2.0, -5.0, 7.0)), + color: None + ), + (Danari, Female, "common.items.armor.cardinal.mitre"): ( + vox_spec: ("armor.cardinal.mitre", (-2.0, -5.0, 7.0)), + color: None + ), + (Draugr, Male, "common.items.armor.cardinal.mitre"): ( + vox_spec: ("armor.cardinal.mitre", (-6.0, -5.0, 7.0)), + color: None + ), + (Draugr, Female, "common.items.armor.cardinal.mitre"): ( + vox_spec: ("armor.cardinal.mitre", (-6.0, -5.0, 6.0)), + color: None + ), + (Orc, Male, "common.items.armor.cardinal.mitre"): ( + vox_spec: ("armor.cardinal.mitre", (-3.0, -3.0, 8.0)), + color: None + ), + (Orc, Female, "common.items.armor.cardinal.mitre"): ( + vox_spec: ("armor.cardinal.mitre", (-3.0, -6.0, 5.0)), + color: None + ), // Merchant Turban (Human, Male, "common.items.armor.merchant.turban"): ( vox_spec: ("armor.merchant.turban", (-4.0, -7.0, -6.0)), @@ -1254,6 +1303,55 @@ vox_spec: ("armor.misc.head.boreal_warhelm", (-3.0, -7.0, -4.0)), color: None ), + // Brinestone Crown + (Human, Male, "common.items.armor.brinestone.crown"): ( + vox_spec: ("armor.brinestone.crown", (-4.0, -4.0, -1.0)), + color: None + ), + (Human, Female, "common.items.armor.brinestone.crown"): ( + vox_spec: ("armor.brinestone.crown", (-4.0, -4.0, -1.0)), + color: None + ), + (Elf, Male, "common.items.armor.brinestone.crown"): ( + vox_spec: ("armor.brinestone.crown", (-3.0, -4.0, -0.0)), + color: None + ), + (Elf, Female, "common.items.armor.brinestone.crown"): ( + vox_spec: ("armor.brinestone.crown", (-3.0, -4.0, -0.0)), + color: None + ), + (Dwarf, Male, "common.items.armor.brinestone.crown"): ( + vox_spec: ("armor.brinestone.crown", (-5.0, -3.0, -1.0)), + color: None + ), + (Dwarf, Female, "common.items.armor.brinestone.crown"): ( + vox_spec: ("armor.brinestone.crown", (-5.0, -3.0, -1.0)), + color: None + ), + (Danari, Male, "common.items.armor.brinestone.crown"): ( + vox_spec: ("armor.brinestone.crown", (-2.0, -4.0, 1.0)), + color: None + ), + (Danari, Female, "common.items.armor.brinestone.crown"): ( + vox_spec: ("armor.brinestone.crown", (-2.0, -4.0, 2.0)), + color: None + ), + (Draugr, Male, "common.items.armor.brinestone.crown"): ( + vox_spec: ("armor.brinestone.crown", (-6.0, -4.0, 2.0)), + color: None + ), + (Draugr, Female, "common.items.armor.brinestone.crown"): ( + vox_spec: ("armor.brinestone.crown", (-6.0, -4.0, -1.0)), + color: None + ), + (Orc, Male, "common.items.armor.brinestone.crown"): ( + vox_spec: ("armor.brinestone.crown", (-3.0, -2.0, 2.0)), + color: None + ), + (Orc, Female, "common.items.armor.brinestone.crown"): ( + vox_spec: ("armor.brinestone.crown", (-3.0, -5.0, -1.0)), + color: None + ), // Woolly Wintercap (Christmas hat+event) (Human, Male, "common.items.calendar.christmas.armor.misc.head.woolly_wintercap"): ( vox_spec: ("armor.misc.head.woolly_wintercap", (-4.0, -7.0, -3.0)), diff --git a/assets/voxygen/voxel/humanoid_armor_pants_manifest.ron b/assets/voxygen/voxel/humanoid_armor_pants_manifest.ron index ae2fc48e5b..3c78808eee 100644 --- a/assets/voxygen/voxel/humanoid_armor_pants_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_pants_manifest.ron @@ -39,6 +39,10 @@ "common.items.armor.boreal.pants": ( vox_spec: ("armor.boreal.pants", (-5.0, -3.5, 0.0)), color: None + ), + "common.items.armor.brinestone.pants": ( + vox_spec: ("armor.brinestone.pants", (-7.0, -3.5, 0.0)), + color: None ), "common.items.npc_armor.pants.plate_red": ( vox_spec: ("armor.misc.pants.plate_grey", (-5.0, -3.5, 1.0)), diff --git a/assets/voxygen/voxel/humanoid_armor_shoulder_manifest.ron b/assets/voxygen/voxel/humanoid_armor_shoulder_manifest.ron index d990aa543f..74b185483d 100644 --- a/assets/voxygen/voxel/humanoid_armor_shoulder_manifest.ron +++ b/assets/voxygen/voxel/humanoid_armor_shoulder_manifest.ron @@ -61,6 +61,16 @@ color: None ) ), + "common.items.armor.brinestone.shoulder": ( + left: ( + vox_spec: ("armor.brinestone.shoulder", (-5.0, -3.5, -2.0)), + color: None + ), + right: ( + vox_spec: ("armor.brinestone.shoulder", (-3.0, -3.5, -2.0)), + color: None + ) + ), "common.items.armor.cloth_purple.shoulder": ( left: ( vox_spec: ("armor.cloth_purple.shoulder", (-3.2, -3.5, 0.0)), diff --git a/assets/voxygen/voxel/item_drop_manifest.ron b/assets/voxygen/voxel/item_drop_manifest.ron index 1d6ac3f0d4..0966374d25 100644 --- a/assets/voxygen/voxel/item_drop_manifest.ron +++ b/assets/voxygen/voxel/item_drop_manifest.ron @@ -488,6 +488,15 @@ Simple("common.items.armor.boreal.hand"): "voxel.armor.boreal.hand", Simple("common.items.armor.boreal.shoulder"): "voxel.armor.boreal.shoulder", Simple("common.items.armor.boreal.back"): "voxel.armor.boreal.back", + //Brinestone Armor + Simple("common.items.armor.brinestone.chest"): "voxel.armor.brinestone.chest", + Simple("common.items.armor.brinestone.pants"): "voxel.armor.brinestone.pants", + Simple("common.items.armor.brinestone.belt"): "voxel.armor.brinestone.belt", + Simple("common.items.armor.brinestone.foot"): "voxel.armor.brinestone.foot", + Simple("common.items.armor.brinestone.hand"): "voxel.armor.brinestone.hand", + Simple("common.items.armor.brinestone.shoulder"): "voxel.armor.brinestone.shoulder", + Simple("common.items.armor.brinestone.back"): "voxel.armor.brinestone.back", + Simple("common.items.armor.brinestone.crown"): "voxel.armor.brinestone.crown", //Blue Leather Armor Simple("common.items.npc_armor.chest.leather_blue"): "voxel.armor.leather_blue.chest", Simple("common.items.npc_armor.pants.leather_blue"): "voxel.armor.leather_blue.pants", @@ -878,6 +887,7 @@ Simple("common.items.flowers.plant_fiber"): "voxel.sprite.crafting_ing.plant_fiber", Simple("common.items.flowers.moonbell"): "voxel.sprite.flowers.moonbell", Simple("common.items.crafting_ing.abyssal_heart"): "voxel.sprite.crafting_ing.abyssal_heart", + Simple("common.items.crafting_ing.brinestone"): "voxel.sprite.crafting_ing.brinestone", Simple("common.items.crafting_ing.pearl"): "voxel.sprite.crafting_ing.pearl", Simple("common.items.crafting_ing.coral_branch"): "voxel.sprite.crafting_ing.coral_branch", Simple("common.items.flowers.pyrebloom"): "voxel.sprite.flowers.pyrebloom", @@ -929,6 +939,7 @@ // Keys and Lockpicks Simple("common.items.keys.rusty_tower_key"): "voxel.object.key_rusty-0", Simple("common.items.keys.bone_key"): "voxel.object.key_bone", + Simple("common.items.keys.glass_key"): "voxel.object.key_glass", Simple("common.items.utility.lockpick_0"): "voxel.object.lockpick", // Gliders Simple("common.items.glider.cloverleaf"): "voxel.glider.starter", diff --git a/assets/voxygen/voxel/npc/coralgolem/male/chest_lower.vox b/assets/voxygen/voxel/npc/coralgolem/male/chest_lower.vox new file mode 100644 index 0000000000..fb2e7aad21 --- /dev/null +++ b/assets/voxygen/voxel/npc/coralgolem/male/chest_lower.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33a8ee5c75dc7e0492cda252f2cceca6f176b834798e52317aad6640cc7d5d4a +size 2368 diff --git a/assets/voxygen/voxel/npc/coralgolem/male/chest_upper.vox b/assets/voxygen/voxel/npc/coralgolem/male/chest_upper.vox new file mode 100644 index 0000000000..2b6ea89706 --- /dev/null +++ b/assets/voxygen/voxel/npc/coralgolem/male/chest_upper.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30664d555b17144add26cd1c0d9ec95bd22fc7dfaf04ea0b614cb6f04f51d85b +size 10452 diff --git a/assets/voxygen/voxel/npc/coralgolem/male/foot_l.vox b/assets/voxygen/voxel/npc/coralgolem/male/foot_l.vox new file mode 100644 index 0000000000..54fc29194f --- /dev/null +++ b/assets/voxygen/voxel/npc/coralgolem/male/foot_l.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b8eefe704196ca221a75c4342c16ff9d00fbf90fa3efae0095c3ac7222467a9 +size 2112 diff --git a/assets/voxygen/voxel/npc/coralgolem/male/foot_r.vox b/assets/voxygen/voxel/npc/coralgolem/male/foot_r.vox new file mode 100644 index 0000000000..686ded6971 --- /dev/null +++ b/assets/voxygen/voxel/npc/coralgolem/male/foot_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8161ff69eba6bb20f16687cc8a6f525d3e53893b3ee2dad77ada691f48285990 +size 2076 diff --git a/assets/voxygen/voxel/npc/coralgolem/male/hand_l.vox b/assets/voxygen/voxel/npc/coralgolem/male/hand_l.vox new file mode 100644 index 0000000000..22095a571f --- /dev/null +++ b/assets/voxygen/voxel/npc/coralgolem/male/hand_l.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28cb81f7df58f76cfd510dabfceba7e5c0000d1d88feea39b900b9c1233ae373 +size 3868 diff --git a/assets/voxygen/voxel/npc/coralgolem/male/hand_r.vox b/assets/voxygen/voxel/npc/coralgolem/male/hand_r.vox new file mode 100644 index 0000000000..9c1838e375 --- /dev/null +++ b/assets/voxygen/voxel/npc/coralgolem/male/hand_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8960dbb996e10bd065a23dbdb0f8de013010c1c261f24916ea495c9edf0fa3d7 +size 3872 diff --git a/assets/voxygen/voxel/npc/coralgolem/male/head.vox b/assets/voxygen/voxel/npc/coralgolem/male/head.vox new file mode 100644 index 0000000000..ec04c18298 --- /dev/null +++ b/assets/voxygen/voxel/npc/coralgolem/male/head.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b54222d3fb0e1a0f8d2a2479b2383bde24bf8dbe59fc343b45f2bd8daf0a2f2 +size 3708 diff --git a/assets/voxygen/voxel/npc/coralgolem/male/leg_l.vox b/assets/voxygen/voxel/npc/coralgolem/male/leg_l.vox new file mode 100644 index 0000000000..f9dd8dad14 --- /dev/null +++ b/assets/voxygen/voxel/npc/coralgolem/male/leg_l.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a6bb25b873ecbc87e2f88aa429f26f1e28f1815528570c06f5acf6fb951b7fa +size 1656 diff --git a/assets/voxygen/voxel/npc/coralgolem/male/leg_r.vox b/assets/voxygen/voxel/npc/coralgolem/male/leg_r.vox new file mode 100644 index 0000000000..ec9f9ac94c --- /dev/null +++ b/assets/voxygen/voxel/npc/coralgolem/male/leg_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:506f8c9da12229087b0822f397ac91ea4710ccd07839183fd2f71671e8b13baa +size 1652 diff --git a/assets/voxygen/voxel/npc/coralgolem/male/shoulder_l.vox b/assets/voxygen/voxel/npc/coralgolem/male/shoulder_l.vox new file mode 100644 index 0000000000..a1246bc4c1 --- /dev/null +++ b/assets/voxygen/voxel/npc/coralgolem/male/shoulder_l.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e80ca9ddce94d0c670a01b07308e528cec53ed0432e453b705c1c6d5651201bd +size 3312 diff --git a/assets/voxygen/voxel/npc/coralgolem/male/shoulder_r.vox b/assets/voxygen/voxel/npc/coralgolem/male/shoulder_r.vox new file mode 100644 index 0000000000..1edffa7263 --- /dev/null +++ b/assets/voxygen/voxel/npc/coralgolem/male/shoulder_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18788ad29de4d6a0808ef63774fe20926a2f6b61b839890e87786f17a78a63d2 +size 3300 diff --git a/assets/voxygen/voxel/npc/dagonite/male/chest.vox b/assets/voxygen/voxel/npc/dagonite/male/chest.vox new file mode 100644 index 0000000000..add3fc4a8c --- /dev/null +++ b/assets/voxygen/voxel/npc/dagonite/male/chest.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f589756407ba9b66a36e0458ee365a34f77fef6e1dd2cc97467629343df6ef48 +size 2048 diff --git a/assets/voxygen/voxel/npc/dagonite/male/head.vox b/assets/voxygen/voxel/npc/dagonite/male/head.vox new file mode 100644 index 0000000000..0a25fd48fe --- /dev/null +++ b/assets/voxygen/voxel/npc/dagonite/male/head.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cda2318c6d2daecfd30b2f64c0443064cbcc422efb3e1d632f18c9ff3c03558c +size 4764 diff --git a/assets/voxygen/voxel/npc/dagonite/male/leg_bcr.vox b/assets/voxygen/voxel/npc/dagonite/male/leg_bcr.vox new file mode 100644 index 0000000000..5a074783a9 --- /dev/null +++ b/assets/voxygen/voxel/npc/dagonite/male/leg_bcr.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd199d82d78b93eb6f09eec5a16588bf13b5de47cd68d4291ee8f183a2f0f527 +size 1156 diff --git a/assets/voxygen/voxel/npc/dagonite/male/leg_fcr.vox b/assets/voxygen/voxel/npc/dagonite/male/leg_fcr.vox new file mode 100644 index 0000000000..5a074783a9 --- /dev/null +++ b/assets/voxygen/voxel/npc/dagonite/male/leg_fcr.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd199d82d78b93eb6f09eec5a16588bf13b5de47cd68d4291ee8f183a2f0f527 +size 1156 diff --git a/assets/voxygen/voxel/npc/dagonite/male/leg_fr.vox b/assets/voxygen/voxel/npc/dagonite/male/leg_fr.vox new file mode 100644 index 0000000000..5a074783a9 --- /dev/null +++ b/assets/voxygen/voxel/npc/dagonite/male/leg_fr.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd199d82d78b93eb6f09eec5a16588bf13b5de47cd68d4291ee8f183a2f0f527 +size 1156 diff --git a/assets/voxygen/voxel/npc/sea_bishop/male/hand_l.vox b/assets/voxygen/voxel/npc/sea_bishop/male/hand_l.vox new file mode 100644 index 0000000000..12cc7ff631 --- /dev/null +++ b/assets/voxygen/voxel/npc/sea_bishop/male/hand_l.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee0dac12b7a4fa355e6ce7d7b7e57039cce24fb7b013b5c0f029da921f43af61 +size 1556 diff --git a/assets/voxygen/voxel/npc/sea_bishop/male/hand_r.vox b/assets/voxygen/voxel/npc/sea_bishop/male/hand_r.vox new file mode 100644 index 0000000000..307811f3b3 --- /dev/null +++ b/assets/voxygen/voxel/npc/sea_bishop/male/hand_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98ba7fc8ad0e17a1c66f4d059acc7121519932a5420350b45d8668b41b804c57 +size 1556 diff --git a/assets/voxygen/voxel/npc/sea_bishop/male/head.vox b/assets/voxygen/voxel/npc/sea_bishop/male/head.vox new file mode 100644 index 0000000000..ab83d06b5f --- /dev/null +++ b/assets/voxygen/voxel/npc/sea_bishop/male/head.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52b0810478bc7a660308e243d7f459a5ebff0e5a4d5644f3c793f5f8a59b8294 +size 3528 diff --git a/assets/voxygen/voxel/npc/sea_bishop/male/leg_l.vox b/assets/voxygen/voxel/npc/sea_bishop/male/leg_l.vox new file mode 100644 index 0000000000..ae5330a5a0 --- /dev/null +++ b/assets/voxygen/voxel/npc/sea_bishop/male/leg_l.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95d47291517061aca046cfcc97eb79930e9be45ba45db374b076e8c9af0887fc +size 1376 diff --git a/assets/voxygen/voxel/npc/sea_bishop/male/leg_r.vox b/assets/voxygen/voxel/npc/sea_bishop/male/leg_r.vox new file mode 100644 index 0000000000..ae5330a5a0 --- /dev/null +++ b/assets/voxygen/voxel/npc/sea_bishop/male/leg_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95d47291517061aca046cfcc97eb79930e9be45ba45db374b076e8c9af0887fc +size 1376 diff --git a/assets/voxygen/voxel/npc/sea_bishop/male/shoulder_l.vox b/assets/voxygen/voxel/npc/sea_bishop/male/shoulder_l.vox new file mode 100644 index 0000000000..fae3ba894f --- /dev/null +++ b/assets/voxygen/voxel/npc/sea_bishop/male/shoulder_l.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:051be7ab9ead3e749a70291ad15eef8fbf6c44693f52b54a89d49b886a207e49 +size 1416 diff --git a/assets/voxygen/voxel/npc/sea_bishop/male/shoulder_r.vox b/assets/voxygen/voxel/npc/sea_bishop/male/shoulder_r.vox new file mode 100644 index 0000000000..69924ffb3a --- /dev/null +++ b/assets/voxygen/voxel/npc/sea_bishop/male/shoulder_r.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87f4c38934be6236dd1c7b57ad68d9846c0af99c3953f3a9d1ca070013c7011a +size 1416 diff --git a/assets/voxygen/voxel/npc/sea_bishop/male/torso_lower.vox b/assets/voxygen/voxel/npc/sea_bishop/male/torso_lower.vox new file mode 100644 index 0000000000..f685ec0e63 --- /dev/null +++ b/assets/voxygen/voxel/npc/sea_bishop/male/torso_lower.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:918e000b14b49a7216addaeedfe5514074a8dbfb9fb2a5ad3fb86ac2af1c352f +size 2952 diff --git a/assets/voxygen/voxel/npc/sea_bishop/male/torso_upper.vox b/assets/voxygen/voxel/npc/sea_bishop/male/torso_upper.vox new file mode 100644 index 0000000000..c29fe8b392 --- /dev/null +++ b/assets/voxygen/voxel/npc/sea_bishop/male/torso_upper.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcbf2c85b17af0fc267ec248c47cbbef6d6643cb701bfd6af0b4340e9fca6ee2 +size 2424 diff --git a/assets/voxygen/voxel/object/key_glass.vox b/assets/voxygen/voxel/object/key_glass.vox new file mode 100644 index 0000000000..8f6ac00bd5 --- /dev/null +++ b/assets/voxygen/voxel/object/key_glass.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:374f1ac553dffc4f5a8140da34eb0ebb8ca6947b9f000f08bc9eda02f1f1c5b0 +size 1184 diff --git a/assets/voxygen/voxel/sprite/crafting_ing/brinestone.vox b/assets/voxygen/voxel/sprite/crafting_ing/brinestone.vox new file mode 100644 index 0000000000..1add912193 --- /dev/null +++ b/assets/voxygen/voxel/sprite/crafting_ing/brinestone.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56d86290ada7b0d536f61dd6daeb8d3dbf1924a71c6ac22c24ab22a23c41fe90 +size 1376 diff --git a/assets/voxygen/voxel/sprite/furniture/glass_barrier_block.vox b/assets/voxygen/voxel/sprite/furniture/glass_barrier_block.vox new file mode 100644 index 0000000000..c22b4ea1a3 --- /dev/null +++ b/assets/voxygen/voxel/sprite/furniture/glass_barrier_block.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4152f77ba2d8879b2293bfe8f35d009620c0d054d56573618a518addaab1fbb +size 6420 diff --git a/assets/voxygen/voxel/sprite/furniture/glass_keyhole_block.vox b/assets/voxygen/voxel/sprite/furniture/glass_keyhole_block.vox new file mode 100644 index 0000000000..b82e99f0e0 --- /dev/null +++ b/assets/voxygen/voxel/sprite/furniture/glass_keyhole_block.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44f3671de54ab9b9c70a95eea58c145cea39f2336b0ea45e5651a50c663ffbb0 +size 6180 diff --git a/assets/voxygen/voxel/sprite/misc/glass_barrier.vox b/assets/voxygen/voxel/sprite/misc/glass_barrier.vox deleted file mode 100644 index db51993d70..0000000000 --- a/assets/voxygen/voxel/sprite/misc/glass_barrier.vox +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4447a9680c0a2401e400203f10171e345e2ccfde4a96e5ef9e6384ae7efabe7e -size 2268 diff --git a/assets/voxygen/voxel/sprite/misc/sea_decor_emblem.vox b/assets/voxygen/voxel/sprite/misc/sea_decor_emblem.vox index 7e851a1cd1..f11fcfde6f 100644 --- a/assets/voxygen/voxel/sprite/misc/sea_decor_emblem.vox +++ b/assets/voxygen/voxel/sprite/misc/sea_decor_emblem.vox @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cd98c7f9a687f04ff235ba58afd5987c9a08843db24b7293f9a4bf6e9672b253 -size 3368 +oid sha256:2162a942213df17463cf3f56af1ff578b1a4b91e682995c8d538de327cea16d2 +size 7696 diff --git a/assets/voxygen/voxel/sprite_manifest.ron b/assets/voxygen/voxel/sprite_manifest.ron index aa96094c80..d93dcec34e 100644 --- a/assets/voxygen/voxel/sprite_manifest.ron +++ b/assets/voxygen/voxel/sprite_manifest.ron @@ -896,7 +896,7 @@ SeaDecorEmblem: Some(( variations: [ ( model: "voxygen.voxel.sprite.misc.sea_decor_emblem", - offset: (-5.5, -5.5, -4.0), + offset: (-16.0, -16.0, -4.0), lod_axes: (1.0, 1.0, 1.0), ), ], @@ -963,13 +963,23 @@ SeashellLantern: Some(( GlassBarrier: Some(( variations: [ ( - model: "voxygen.voxel.sprite.misc.glass_barrier", + model: "voxygen.voxel.sprite.furniture.glass_barrier_block", offset: (-5.5, -5.5, 0.0), lod_axes: (0.0, 0.0, 0.0), ), ], wind_sway: 0.0, )), +GlassKeyhole: Some(( + variations: [ + ( + model: "voxygen.voxel.sprite.furniture.glass_keyhole_block", + offset: (-5.5, -5.5, 0.0), + lod_axes: (0.5, 0.5, 0.5), + ), + ], + wind_sway: 0.0, +)), // Welwitch Welwitch: Some(( variations: [ diff --git a/assets/voxygen/voxel/weapon/sceptre/scepter_sea_bishop.vox b/assets/voxygen/voxel/weapon/sceptre/scepter_sea_bishop.vox new file mode 100644 index 0000000000..925117d3e0 --- /dev/null +++ b/assets/voxygen/voxel/weapon/sceptre/scepter_sea_bishop.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0ccaae5d3dea02b79bf4535f5b980661074ff346b07ae0623017fbebb6c9c13 +size 1544 diff --git a/common/src/comp/agent.rs b/common/src/comp/agent.rs index 86efcd3543..88583aba92 100644 --- a/common/src/comp/agent.rs +++ b/common/src/comp/agent.rs @@ -364,6 +364,7 @@ impl<'a> From<&'a Body> for Psyche { arthropod::Species::Moltencrawler => 0.2, arthropod::Species::Mosscrawler => 0.2, arthropod::Species::Sandcrawler => 0.2, + arthropod::Species::Dagonite => 0.2, }, }, sight_dist: 40.0, diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs index deee411e79..8112fc1419 100644 --- a/common/src/comp/body.rs +++ b/common/src/comp/body.rs @@ -439,6 +439,7 @@ impl Body { biped_large::Species::Tursus => Vec3::new(4.0, 3.0, 4.0), biped_large::Species::Gigasfrost => Vec3::new(6.0, 3.0, 8.0), biped_large::Species::AdletElder => Vec3::new(3.5, 3.0, 5.0), + biped_large::Species::SeaBishop => Vec3::new(3.7, 2.5, 4.2), _ => Vec3::new(4.6, 3.0, 6.0), }, Body::BipedSmall(body) => match body.species { @@ -465,7 +466,10 @@ impl Body { Body::Dragon(_) => Vec3::new(16.0, 10.0, 16.0), Body::FishMedium(_) => Vec3::new(0.5, 2.0, 0.8), Body::FishSmall(_) => Vec3::new(0.3, 1.2, 0.6), - Body::Golem(_) => Vec3::new(5.0, 5.0, 7.5), + Body::Golem(body) => match body.species { + golem::Species::CoralGolem => Vec3::new(3.0, 5.0, 4.0), + _ => Vec3::new(5.0, 4.5, 7.5), + }, Body::Humanoid(humanoid) => { let height = humanoid.height(); Vec3::new(height / 1.3, 1.75 / 2.0, height) @@ -555,6 +559,7 @@ impl Body { arthropod::Species::Moltencrawler => Vec3::new(3.2, 4.0, 1.5), arthropod::Species::Mosscrawler => Vec3::new(3.2, 4.0, 1.4), arthropod::Species::Sandcrawler => Vec3::new(3.2, 4.0, 1.4), + arthropod::Species::Dagonite => Vec3::new(3.2, 4.7, 1.4), }, Body::BirdMedium(body) => match body.species { bird_medium::Species::SnowyOwl => Vec3::new(1.2, 1.2, 0.9), @@ -813,6 +818,7 @@ impl Body { biped_large::Species::Gigasfrost => 20000, biped_large::Species::AdletElder => 1500, biped_large::Species::Tursus => 300, + biped_large::Species::SeaBishop => 550, _ => 120, }, Body::BipedSmall(biped_small) => match biped_small.species { @@ -839,6 +845,7 @@ impl Body { Body::Golem(golem) => match golem.species { golem::Species::WoodGolem => 200, golem::Species::ClayGolem => 450, + golem::Species::CoralGolem => 550, _ => 1000, }, Body::Theropod(theropod) => match theropod.species { @@ -979,7 +986,11 @@ impl Body { // TODO: Match on species pub fn combat_multiplier(&self) -> f32 { match self { - Body::Object(_) | Body::Ship(_) => 0.0, + Body::Object(object) => match object { + object::Body::BarrelOrgan | object::Body::ArrowTurret => 0.05, + _ => 0.0, + }, + Body::Ship(_) => 0.0, Body::BipedLarge(b) => match b.species { biped_large::Species::Mindflayer => 4.35, biped_large::Species::Minotaur => 4.05, diff --git a/common/src/comp/body/arthropod.rs b/common/src/comp/body/arthropod.rs index 5d76d6336e..c4ffc602c3 100644 --- a/common/src/comp/body/arthropod.rs +++ b/common/src/comp/body/arthropod.rs @@ -39,6 +39,7 @@ pub enum Species { Moltencrawler = 8, Mosscrawler = 9, Sandcrawler = 10, + Dagonite = 11, } /// Data representing per-species generic data. @@ -55,6 +56,7 @@ pub struct AllSpecies { pub crawler_molten: SpeciesMeta, pub crawler_moss: SpeciesMeta, pub crawler_sand: SpeciesMeta, + pub dagonite: SpeciesMeta, } impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies { @@ -74,11 +76,12 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies Species::Moltencrawler => &self.crawler_molten, Species::Mosscrawler => &self.crawler_moss, Species::Sandcrawler => &self.crawler_sand, + Species::Dagonite => &self.dagonite, } } } -pub const ALL_SPECIES: [Species; 11] = [ +pub const ALL_SPECIES: [Species; 12] = [ Species::Tarantula, Species::Blackwidow, Species::Antlion, @@ -90,6 +93,7 @@ pub const ALL_SPECIES: [Species; 11] = [ Species::Moltencrawler, Species::Mosscrawler, Species::Sandcrawler, + Species::Dagonite, ]; impl<'a, SpeciesMeta: 'a> IntoIterator for &'a AllSpecies { diff --git a/common/src/comp/body/biped_large.rs b/common/src/comp/body/biped_large.rs index 0cadddd284..9c117e1308 100644 --- a/common/src/comp/body/biped_large.rs +++ b/common/src/comp/body/biped_large.rs @@ -74,6 +74,7 @@ make_case_elim!( Tursus = 21, Gigasfrost = 22, AdletElder = 23, + SeaBishop = 24, } ); @@ -106,6 +107,7 @@ pub struct AllSpecies { pub tursus: SpeciesMeta, pub gigas_frost: SpeciesMeta, pub adlet_elder: SpeciesMeta, + pub sea_bishop: SpeciesMeta, } impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies { @@ -138,11 +140,12 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies Species::Tursus => &self.tursus, Species::Gigasfrost => &self.gigas_frost, Species::AdletElder => &self.adlet_elder, + Species::SeaBishop => &self.sea_bishop, } } } -pub const ALL_SPECIES: [Species; 24] = [ +pub const ALL_SPECIES: [Species; 25] = [ Species::Ogre, Species::Cyclops, Species::Wendigo, @@ -167,6 +170,7 @@ pub const ALL_SPECIES: [Species; 24] = [ Species::Tursus, Species::Gigasfrost, Species::AdletElder, + Species::SeaBishop, ]; impl<'a, SpeciesMeta: 'a> IntoIterator for &'a AllSpecies { diff --git a/common/src/comp/body/golem.rs b/common/src/comp/body/golem.rs index 6a62739080..2ea8a66808 100644 --- a/common/src/comp/body/golem.rs +++ b/common/src/comp/body/golem.rs @@ -38,6 +38,7 @@ make_case_elim!( Treant = 1, ClayGolem = 2, WoodGolem = 3, + CoralGolem = 4, } ); @@ -50,6 +51,7 @@ pub struct AllSpecies { pub treant: SpeciesMeta, pub claygolem: SpeciesMeta, pub woodgolem: SpeciesMeta, + pub coralgolem: SpeciesMeta, } impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies { @@ -62,15 +64,17 @@ impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies Species::Treant => &self.treant, Species::ClayGolem => &self.claygolem, Species::WoodGolem => &self.woodgolem, + Species::CoralGolem => &self.coralgolem, } } } -pub const ALL_SPECIES: [Species; 4] = [ +pub const ALL_SPECIES: [Species; 5] = [ Species::StoneGolem, Species::Treant, Species::ClayGolem, Species::WoodGolem, + Species::CoralGolem, ]; impl<'a, SpeciesMeta: 'a> IntoIterator for &'a AllSpecies { diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 04794fb2ca..b76287351b 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -532,6 +532,9 @@ fn default_main_tool(body: &Body) -> Item { golem::Species::WoodGolem => Some(Item::new_from_asset_expect( "common.items.npc_weapons.unique.wood_golem_fist", )), + golem::Species::CoralGolem => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.coral_golem_fist", + )), _ => None, }, Body::QuadrupedMedium(quadruped_medium) => match quadruped_medium.species { @@ -663,6 +666,9 @@ fn default_main_tool(body: &Body) -> Item { arthropod::Species::Antlion => Some(Item::new_from_asset_expect( "common.items.npc_weapons.unique.arthropods.antlion", )), + arthropod::Species::Dagonite => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.arthropods.dagonite", + )), _ => Some(Item::new_from_asset_expect( "common.items.npc_weapons.unique.arthropods.leafbeetle", )), @@ -742,6 +748,9 @@ fn default_main_tool(body: &Body) -> Item { (biped_large::Species::AdletElder, _) => Some(Item::new_from_asset_expect( "common.items.npc_weapons.sword.adlet_elder_sword", )), + (biped_large::Species::SeaBishop, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.unique.sea_bishop_sceptre", + )), }, Body::Object(body) => match body { object::Body::Crossbow => Some(Item::new_from_asset_expect( diff --git a/common/src/outcome.rs b/common/src/outcome.rs index c486d88b38..795a4b92e1 100644 --- a/common/src/outcome.rs +++ b/common/src/outcome.rs @@ -97,6 +97,9 @@ pub enum Outcome { FlashFreeze { pos: Vec3, }, + Steam { + pos: Vec3, + }, LaserBeam { pos: Vec3, }, @@ -145,6 +148,7 @@ impl Outcome { | Outcome::FlashFreeze { pos } | Outcome::Woosh { pos } | Outcome::IceSpikes { pos } + | Outcome::Steam { pos } | Outcome::IceCrack { pos } | Outcome::Utterance { pos, .. } | Outcome::SpriteDelete { pos, .. } diff --git a/common/src/states/basic_beam.rs b/common/src/states/basic_beam.rs index 06c0bcbc40..4b2b0f062e 100644 --- a/common/src/states/basic_beam.rs +++ b/common/src/states/basic_beam.rs @@ -242,6 +242,7 @@ fn height_offset(body: &Body, look_dir: Dir, velocity: Vec3, on_ground: Opt }, Body::BipedLarge(b) => match b.species { biped_large::Species::Mindflayer => body.height() * 0.6, + biped_large::Species::SeaBishop => body.height() * 0.4, _ => body.height() * 0.5, }, _ => body.height() * 0.5, diff --git a/common/src/states/leap_shockwave.rs b/common/src/states/leap_shockwave.rs index 61e7fbd74f..905b5a893e 100644 --- a/common/src/states/leap_shockwave.rs +++ b/common/src/states/leap_shockwave.rs @@ -183,9 +183,22 @@ impl CharacterBehavior for Data { ori: *data.ori, }); // Send local event used for frontend shenanigans - output_events.emit_local(LocalEvent::CreateOutcome(Outcome::IceSpikes { - pos: data.pos.0 + *data.ori.look_dir() * (data.body.max_radius()), - })); + match self.static_data.specifier { + shockwave::FrontendSpecifier::IceSpikes => { + output_events.emit_local(LocalEvent::CreateOutcome( + Outcome::IceSpikes { + pos: data.pos.0 + + *data.ori.look_dir() * (data.body.max_radius()), + }, + )); + }, + shockwave::FrontendSpecifier::Steam => { + output_events.emit_local(LocalEvent::CreateOutcome(Outcome::Steam { + pos: data.pos.0 + *data.ori.look_dir() * (data.body.max_radius()), + })); + }, + _ => {}, + }; } else { // Transitions to recover update.character = CharacterState::LeapShockwave(Data { diff --git a/common/src/states/shockwave.rs b/common/src/states/shockwave.rs index 288d908487..bde5909077 100644 --- a/common/src/states/shockwave.rs +++ b/common/src/states/shockwave.rs @@ -160,6 +160,11 @@ impl CharacterBehavior for Data { }, )); }, + shockwave::FrontendSpecifier::Steam => { + output_events.emit_local(LocalEvent::CreateOutcome(Outcome::Steam { + pos: data.pos.0 + *data.ori.look_dir() * (data.body.max_radius()), + })); + }, _ => {}, } } else { diff --git a/common/src/states/sprite_interact.rs b/common/src/states/sprite_interact.rs index 4821a0380e..99401e1ad2 100644 --- a/common/src/states/sprite_interact.rs +++ b/common/src/states/sprite_interact.rs @@ -188,7 +188,9 @@ impl From for Option { | SpriteKind::PotionMinor | SpriteKind::Seashells | SpriteKind::Bomb => Some(SpriteInteractKind::Collectible), - SpriteKind::Keyhole | SpriteKind::BoneKeyhole => Some(SpriteInteractKind::Unlock), + SpriteKind::Keyhole | SpriteKind::BoneKeyhole | SpriteKind::GlassKeyhole => { + Some(SpriteInteractKind::Unlock) + }, // Collectible checked in addition to container for case that sprite requires a tool to // collect and cannot be collected by hand, yet still meets the container check _ if sprite_kind.is_container() && sprite_kind.is_collectible() => { diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs index 06801809bf..197fb62bbc 100644 --- a/common/src/states/utils.rs +++ b/common/src/states/utils.rs @@ -159,6 +159,7 @@ impl Body { arthropod::Species::Moltencrawler => 70.0, arthropod::Species::Mosscrawler => 70.0, arthropod::Species::Sandcrawler => 70.0, + arthropod::Species::Dagonite => 70.0, }, } } diff --git a/common/src/terrain/block.rs b/common/src/terrain/block.rs index c9c0d55b63..523740105e 100644 --- a/common/src/terrain/block.rs +++ b/common/src/terrain/block.rs @@ -423,8 +423,8 @@ impl Block { | SpriteKind::SeaDecorWindowHor | SpriteKind::SeaDecorWindowVer | SpriteKind::Rope - | SpriteKind::GlassBarrier | SpriteKind::FireBlock => None, + SpriteKind::GlassBarrier | SpriteKind::GlassKeyhole => None, SpriteKind::EnsnaringVines | SpriteKind::EnsnaringWeb | SpriteKind::SeaUrchin diff --git a/common/src/terrain/sprite.rs b/common/src/terrain/sprite.rs index de3d9d472f..e0127dc418 100644 --- a/common/src/terrain/sprite.rs +++ b/common/src/terrain/sprite.rs @@ -252,6 +252,7 @@ make_case_elim!( IceCrystal = 0xE0, GlowIceCrystal = 0xE1, OneWayWall = 0xE2, + GlassKeyhole = 0xE3, } ); @@ -341,6 +342,7 @@ impl SpriteKind { | SpriteKind::WitchWindow | SpriteKind::SeaUrchin | SpriteKind::GlassBarrier + | SpriteKind::GlassKeyhole | SpriteKind::Keyhole | SpriteKind::KeyDoor | SpriteKind::BoneKeyhole @@ -510,7 +512,9 @@ impl SpriteKind { SpriteKind::Frostwood => item("common.items.log.frostwood"), SpriteKind::Eldwood => item("common.items.log.eldwood"), SpriteKind::MagicalBarrier => table("common.loot_tables.sprite.chest"), - SpriteKind::Keyhole | SpriteKind::BoneKeyhole => return Some(None), + SpriteKind::Keyhole | SpriteKind::BoneKeyhole | SpriteKind::GlassKeyhole => { + return Some(None); + }, _ => return None, })) } @@ -591,8 +595,7 @@ impl SpriteKind { | SpriteKind::Tin | SpriteKind::Silver | SpriteKind::Gold - | SpriteKind::SapphireSmall - | SpriteKind::GlassBarrier => Some(ToolKind::Pick), + | SpriteKind::SapphireSmall => Some(ToolKind::Pick), _ => None, } } @@ -612,6 +615,9 @@ impl SpriteKind { SpriteKind::BoneKeyhole => UnlockKind::Consumes( ItemDefinitionId::Simple("common.items.keys.bone_key").to_owned(), ), + SpriteKind::GlassKeyhole => UnlockKind::Consumes( + ItemDefinitionId::Simple("common.items.keys.glass_key").to_owned(), + ), _ => UnlockKind::Free, }) } diff --git a/common/src/terrain/structure.rs b/common/src/terrain/structure.rs index 557cdd0388..e913f3d874 100644 --- a/common/src/terrain/structure.rs +++ b/common/src/terrain/structure.rs @@ -43,6 +43,7 @@ make_case_elim!( EntitySpawner(entitykind: String, spawn_chance: f32) = 24, Keyhole(consumes: String) = 25, BoneKeyhole(consumes: String) = 26, + GlassKeyhole(consumes: String) = 27, } ); diff --git a/server/agent/src/action_nodes.rs b/server/agent/src/action_nodes.rs index a3f0a393c6..8e78c9df4d 100644 --- a/server/agent/src/action_nodes.rs +++ b/server/agent/src/action_nodes.rs @@ -972,7 +972,7 @@ impl<'a> AgentData<'a> { "Staff Simple" => Tactic::Staff, "Simple Flying Melee" => Tactic::SimpleFlyingMelee, "Bow Simple" | "Boreal Bow" => Tactic::Bow, - "Stone Golem" => Tactic::StoneGolem, + "Stone Golem" | "Coral Golem" => Tactic::StoneGolem, "Quad Med Quick" => Tactic::CircleCharge { radius: 3, circle_time: 2, @@ -1026,7 +1026,9 @@ impl<'a> AgentData<'a> { "Yeti" => Tactic::Yeti, "Harvester" => Tactic::Harvester, "Cardinal" => Tactic::Cardinal, + "Sea Bishop" => Tactic::SeaBishop, "Dagon" => Tactic::Dagon, + "Dagonite" => Tactic::ArthropodAmbush, "Gnarling Dagger" => Tactic::SimpleBackstab, "Gnarling Blowgun" => Tactic::ElevatedRanged, "Deadwood" => Tactic::Deadwood, @@ -1449,6 +1451,14 @@ impl<'a> AgentData<'a> { read_data, rng, ), + Tactic::SeaBishop => self.handle_sea_bishop_attack( + agent, + controller, + &attack_data, + tgt_data, + read_data, + rng, + ), Tactic::Dagon => { self.handle_dagon_attack(agent, controller, &attack_data, tgt_data, read_data) }, diff --git a/server/agent/src/attack.rs b/server/agent/src/attack.rs index eb28ee7513..a3a37c9cc6 100644 --- a/server/agent/src/attack.rs +++ b/server/agent/src/attack.rs @@ -4161,6 +4161,99 @@ impl<'a> AgentData<'a> { } } + pub fn handle_sea_bishop_attack( + &self, + agent: &mut Agent, + controller: &mut Controller, + attack_data: &AttackData, + tgt_data: &TargetData, + read_data: &ReadData, + rng: &mut impl Rng, + ) { + let line_of_sight_with_target = || { + entities_have_line_of_sight( + self.pos, + self.body, + self.scale, + tgt_data.pos, + tgt_data.body, + tgt_data.scale, + read_data, + ) + }; + + enum ActionStateTimers { + TimerBeam = 0, + } + if agent.action_state.timers[ActionStateTimers::TimerBeam as usize] > 6.0 { + agent.action_state.timers[ActionStateTimers::TimerBeam as usize] = 0.0; + } else { + agent.action_state.timers[ActionStateTimers::TimerBeam as usize] += read_data.dt.0; + } + + // When enemy in sight beam for 3 seconds, every 6 seconds + if line_of_sight_with_target() + && agent.action_state.timers[ActionStateTimers::TimerBeam as usize] < 3.0 + { + controller.push_basic_input(InputKind::Primary); + } + // Logic to move. Intentionally kept separate from ability logic where possible + // so duplicated work is less necessary. + if attack_data.dist_sqrd < (2.0 * attack_data.min_attack_dist).powi(2) { + // Attempt to move away from target if too close + if let Some((bearing, speed)) = agent.chaser.chase( + &*read_data.terrain, + self.pos.0, + self.vel.0, + tgt_data.pos.0, + TraversalConfig { + min_tgt_dist: 1.25, + ..self.traversal_config + }, + ) { + controller.inputs.move_dir = + -bearing.xy().try_normalized().unwrap_or_else(Vec2::zero) * speed; + } + } else if attack_data.dist_sqrd < MAX_PATH_DIST.powi(2) { + // Else attempt to circle target if neither too close nor too far + if let Some((bearing, speed)) = agent.chaser.chase( + &*read_data.terrain, + self.pos.0, + self.vel.0, + tgt_data.pos.0, + TraversalConfig { + min_tgt_dist: 1.25, + ..self.traversal_config + }, + ) { + if line_of_sight_with_target() && attack_data.angle < 45.0 { + controller.inputs.move_dir = bearing + .xy() + .rotated_z(rng.gen_range(0.5..1.57)) + .try_normalized() + .unwrap_or_else(Vec2::zero) + * speed; + } else { + // Unless cannot see target, then move towards them + controller.inputs.move_dir = + bearing.xy().try_normalized().unwrap_or_else(Vec2::zero) * speed; + self.jump_if(bearing.z > 1.5, controller); + controller.inputs.move_z = bearing.z; + } + } + } else { + // If too far, move towards target + self.path_toward_target( + agent, + controller, + tgt_data.pos.0, + read_data, + Path::Partial, + None, + ); + } + } + pub fn handle_dagon_attack( &self, agent: &mut Agent, diff --git a/server/agent/src/data.rs b/server/agent/src/data.rs index 0f34fed635..52d8091476 100644 --- a/server/agent/src/data.rs +++ b/server/agent/src/data.rs @@ -228,6 +228,7 @@ pub enum Tactic { OrganAura, Dagon, Cardinal, + SeaBishop, Roshwalr, FrostGigas, BorealHammer, diff --git a/server/src/events/inventory_manip.rs b/server/src/events/inventory_manip.rs index ed66d81b44..ef669fbeed 100644 --- a/server/src/events/inventory_manip.rs +++ b/server/src/events/inventory_manip.rs @@ -322,7 +322,11 @@ pub fn handle_inventory(server: &mut Server, entity: EcsEntity, manip: comp::Inv // TODO: Abstract this code into a generalised way to do block updates? if matches!( block.get_sprite(), - Some(SpriteKind::Keyhole | SpriteKind::BoneKeyhole) + Some( + SpriteKind::Keyhole + | SpriteKind::BoneKeyhole + | SpriteKind::GlassKeyhole + ) ) { let dirs = [ Vec3::unit_x(), @@ -372,6 +376,19 @@ pub fn handle_inventory(server: &mut Server, entity: EcsEntity, manip: comp::Inv pending.extend(dirs.into_iter().map(|dir| pos + dir)); } }, + Some(SpriteKind::GlassKeyhole) => { + if !destroyed.contains(&pos) + && matches!( + terrain.get(pos).ok().and_then(|b| b.get_sprite()), + Some(SpriteKind::GlassBarrier) + ) + { + block_change.try_set(pos, Block::empty()); + destroyed.insert(pos); + + pending.extend(dirs.into_iter().map(|dir| pos + dir)); + } + }, _ => {}, }; } else { diff --git a/voxygen/anim/src/arthropod/leapshockwave.rs b/voxygen/anim/src/arthropod/leapshockwave.rs new file mode 100644 index 0000000000..6db3319a35 --- /dev/null +++ b/voxygen/anim/src/arthropod/leapshockwave.rs @@ -0,0 +1,133 @@ +use super::{ + super::{vek::*, Animation}, + ArthropodSkeleton, SkeletonAttr, +}; +use common::{comp::item::ToolKind, states::utils::StageSection}; +use core::f32::consts::PI; + +pub struct LeapShockAnimation; + +impl Animation for LeapShockAnimation { + type Dependency<'a> = ( + Option, + Option, + Vec3, + f32, + Option, + ); + type Skeleton = ArthropodSkeleton; + + #[cfg(feature = "use-dyn-lib")] + const UPDATE_FN: &'static [u8] = b"arthropod_leapshockwave\0"; + + #[cfg_attr(feature = "be-dyn-lib", export_name = "arthropod_leapshockwave")] + fn update_skeleton_inner( + skeleton: &Self::Skeleton, + (_active_tool_kind, _second_tool_kind, _velocity, global_time, stage_section): Self::Dependency<'_>, + anim_time: f32, + _rate: &mut f32, + s_a: &SkeletonAttr, + ) -> Self::Skeleton { + let mut next = (*skeleton).clone(); + + let (movement1base, movement2base, movement3base, movement4) = match stage_section { + Some(StageSection::Buildup) => (anim_time, 0.0, 0.0, 0.0), + Some(StageSection::Movement) => (1.0, anim_time.powf(0.1), 0.0, 0.0), + Some(StageSection::Action) => (1.0, 1.0, anim_time.powf(0.1), 0.0), + Some(StageSection::Recover) => (0.0, 1.0, 1.0, anim_time.powi(4)), + _ => (0.0, 0.0, 0.0, 0.0), + }; + let pullback = 1.0 - movement4; + let early_pullback = 1.0 - movement3base; + let movement1abs = movement1base * pullback; + let movement2abs = movement2base * pullback; + let movement3abs = movement3base * pullback; + + let shortalt = (global_time * 80.0).sin() * movement2base * early_pullback; + + next.chest.scale = Vec3::one() / s_a.scaler; + + next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1); + next.head.orientation = + Quaternion::rotation_x(movement1abs * -0.2 + movement2abs * 0.4 + movement3abs * -1.0) + * Quaternion::rotation_z((movement1abs * 4.0 * PI).sin() * 0.08); + + next.chest.position = Vec3::new(0.0, s_a.chest.0, s_a.chest.1 + movement1abs * -0.5); + next.chest.orientation = Quaternion::rotation_x(movement2abs * 0.3) + * Quaternion::rotation_z((movement1abs * 4.0 * PI).sin() * 0.08); + + next.mandible_l.position = Vec3::new(-s_a.mandible.0, s_a.mandible.1, s_a.mandible.2); + next.mandible_r.position = Vec3::new(s_a.mandible.0, s_a.mandible.1, s_a.mandible.2); + next.mandible_l.orientation = Quaternion::rotation_x( + (movement1abs * 4.0 * PI).sin() * 0.08 + movement2abs * 0.3 + movement3abs * -0.4, + ); + next.mandible_r.orientation = Quaternion::rotation_x( + (movement1abs * 4.0 * PI).sin() * 0.08 + movement2abs * 0.3 + movement3abs * -0.4, + ); + + next.wing_fl.position = Vec3::new(-s_a.wing_f.0, s_a.wing_f.1, s_a.wing_f.2); + next.wing_fr.position = Vec3::new(s_a.wing_f.0, s_a.wing_f.1, s_a.wing_f.2); + + next.wing_bl.position = Vec3::new(-s_a.wing_b.0, s_a.wing_b.1, s_a.wing_b.2); + next.wing_br.position = Vec3::new(s_a.wing_b.0, s_a.wing_b.1, s_a.wing_b.2); + + next.leg_fl.position = Vec3::new(-s_a.leg_f.0, s_a.leg_f.1, s_a.leg_f.2); + next.leg_fr.position = Vec3::new(s_a.leg_f.0, s_a.leg_f.1, s_a.leg_f.2); + next.leg_fl.orientation = + Quaternion::rotation_x(movement1abs * 0.2 + movement2abs * 0.8 + movement3abs * -1.5) + * Quaternion::rotation_z(s_a.leg_ori.0); + next.leg_fr.orientation = + Quaternion::rotation_x(movement1abs * 0.2 + movement2abs * 0.8 + movement3abs * -1.5) + * Quaternion::rotation_z(-s_a.leg_ori.0); + + next.leg_fcl.position = Vec3::new(-s_a.leg_fc.0, s_a.leg_fc.1, s_a.leg_fc.2); + next.leg_fcr.position = Vec3::new(s_a.leg_fc.0, s_a.leg_fc.1, s_a.leg_fc.2); + next.leg_fcl.orientation = + Quaternion::rotation_y(movement1abs * 0.2 + movement2abs * -1.0 + movement3abs * 0.8) + * Quaternion::rotation_z(s_a.leg_ori.1); + next.leg_fcr.orientation = Quaternion::rotation_y(movement1abs * -0.2 + movement2abs * 1.0) + * Quaternion::rotation_z(-s_a.leg_ori.1); + + next.leg_bcl.position = Vec3::new(-s_a.leg_bc.0, s_a.leg_bc.1, s_a.leg_bc.2); + next.leg_bcr.position = Vec3::new(s_a.leg_bc.0, s_a.leg_bc.1, s_a.leg_bc.2); + next.leg_bcl.orientation = + Quaternion::rotation_y(movement1abs * 0.2 + movement2abs * -1.0 + movement3abs * 0.8) + * Quaternion::rotation_z(s_a.leg_ori.2); + next.leg_bcr.orientation = Quaternion::rotation_y(movement1abs * -0.2 + movement2abs * 1.0) + * Quaternion::rotation_z(-s_a.leg_ori.2); + + next.leg_bl.position = Vec3::new(-s_a.leg_b.0, s_a.leg_b.1, s_a.leg_b.2); + next.leg_br.position = Vec3::new(s_a.leg_b.0, s_a.leg_b.1, s_a.leg_b.2); + next.leg_bl.orientation = + Quaternion::rotation_y(movement1abs * 0.2 + movement2abs * -1.0 + movement3abs * 0.8) + * Quaternion::rotation_z(s_a.leg_ori.3); + next.leg_br.orientation = Quaternion::rotation_y(movement1abs * -0.2 + movement2abs * 1.0) + * Quaternion::rotation_z(-s_a.leg_ori.3); + + next.wing_fl.position = Vec3::new(-s_a.wing_f.0, s_a.wing_f.1, s_a.wing_f.2); + next.wing_fr.position = Vec3::new(s_a.wing_f.0, s_a.wing_f.1, s_a.wing_f.2); + next.wing_fl.orientation = + Quaternion::rotation_x(movement1abs * -0.4 + movement2abs * -0.2) + * Quaternion::rotation_y(movement1abs * 0.5 + movement2abs * 0.1) + * Quaternion::rotation_z(movement1abs * -0.2); + next.wing_fr.orientation = + Quaternion::rotation_x(movement1abs * -0.4 + movement2abs * -0.2) + * Quaternion::rotation_y(movement1abs * -0.5 + movement2abs * -0.1) + * Quaternion::rotation_z(movement1abs * 0.2); + + next.wing_bl.position = Vec3::new(-s_a.wing_b.0, s_a.wing_b.1, s_a.wing_b.2); + next.wing_br.position = Vec3::new(s_a.wing_b.0, s_a.wing_b.1, s_a.wing_b.2); + next.wing_bl.orientation = + Quaternion::rotation_x((movement1abs * -0.2 + movement2abs * -0.6) * early_pullback) + * Quaternion::rotation_y(movement1abs * 0.4 + shortalt * 2.0 + movement2abs * 0.1) + * Quaternion::rotation_z(movement1abs * -1.4); + next.wing_br.orientation = + Quaternion::rotation_x((movement1abs * -0.2 + movement2abs * -0.6) * early_pullback) + * Quaternion::rotation_y( + movement1abs * -0.4 + shortalt * 2.0 + movement2abs * -0.1, + ) + * Quaternion::rotation_z(movement1abs * 1.4); + + next + } +} diff --git a/voxygen/anim/src/arthropod/mod.rs b/voxygen/anim/src/arthropod/mod.rs index 3e34dbaa65..a446533f54 100644 --- a/voxygen/anim/src/arthropod/mod.rs +++ b/voxygen/anim/src/arthropod/mod.rs @@ -3,6 +3,7 @@ pub mod dash; pub mod idle; pub mod jump; pub mod leapmelee; +pub mod leapshockwave; pub mod run; pub mod shoot; pub mod stunned; @@ -11,8 +12,8 @@ pub mod summon; // Reexports pub use self::{ alpha::AlphaAnimation, dash::DashAnimation, idle::IdleAnimation, jump::JumpAnimation, - leapmelee::LeapMeleeAnimation, run::RunAnimation, shoot::ShootAnimation, - stunned::StunnedAnimation, summon::SummonAnimation, + leapmelee::LeapMeleeAnimation, leapshockwave::LeapShockAnimation, run::RunAnimation, + shoot::ShootAnimation, stunned::StunnedAnimation, summon::SummonAnimation, }; use super::{make_bone, vek::*, FigureBoneData, Offsets, Skeleton}; @@ -181,6 +182,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Moltencrawler, _) => (4.0, -1.0), (Mosscrawler, _) => (4.0, -1.5), (Sandcrawler, _) => (4.0, -1.0), + (Dagonite, _) => (4.0, -1.0), }, chest: match (body.species, body.body_type) { (Tarantula, _) => (-5.0, 6.0), @@ -194,6 +196,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Moltencrawler, _) => (-7.0, 6.0), (Mosscrawler, _) => (-7.0, 6.5), (Sandcrawler, _) => (-7.0, 6.0), + (Dagonite, _) => (-6.0, 6.0), }, mandible: match (body.species, body.body_type) { (Tarantula, _) => (1.5, 7.0, -0.5), @@ -207,6 +210,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Moltencrawler, _) => (2.5, 8.0, 0.0), (Mosscrawler, _) => (2.5, 8.0, 0.0), (Sandcrawler, _) => (2.5, 8.0, 0.0), + (Dagonite, _) => (2.5, 8.0, 0.0), }, wing_f: match (body.species, body.body_type) { (Tarantula, _) => (3.0, 0.0, -4.0), @@ -220,6 +224,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Moltencrawler, _) => (3.0, 0.0, -4.0), (Mosscrawler, _) => (3.0, 0.0, -4.0), (Sandcrawler, _) => (3.0, 0.0, -4.0), + (Dagonite, _) => (3.0, 0.0, -4.0), }, wing_b: match (body.species, body.body_type) { (Tarantula, _) => (3.0, 0.0, -4.0), @@ -233,6 +238,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Moltencrawler, _) => (3.0, 0.0, -4.0), (Mosscrawler, _) => (3.0, 0.0, -4.0), (Sandcrawler, _) => (3.0, 0.0, -4.0), + (Dagonite, _) => (3.0, 0.0, -4.0), }, leg_f: match (body.species, body.body_type) { (Tarantula, _) => (4.0, 11.0, -1.5), @@ -246,6 +252,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Moltencrawler, _) => (2.5, 14.0, -3.0), (Mosscrawler, _) => (1.5, 14.0, -3.5), (Sandcrawler, _) => (1.5, 14.0, -3.0), + (Dagonite, _) => (1.5, 14.0, -3.0), }, leg_fc: match (body.species, body.body_type) { (Tarantula, _) => (1.5, 13.5, -1.5), @@ -259,6 +266,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Moltencrawler, _) => (3.5, 11.0, -3.0), (Mosscrawler, _) => (2.5, 11.0, -3.5), (Sandcrawler, _) => (2.5, 11.0, -3.0), + (Dagonite, _) => (2.5, 11.0, -3.0), }, leg_bc: match (body.species, body.body_type) { (Tarantula, _) => (1.5, 10.5, -1.5), @@ -272,6 +280,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Moltencrawler, _) => (2.5, 8.0, -3.0), (Mosscrawler, _) => (1.5, 8.0, -3.5), (Sandcrawler, _) => (1.5, 8.0, -3.0), + (Dagonite, _) => (1.5, 8.0, -3.0), }, leg_b: match (body.species, body.body_type) { (Tarantula, _) => (1.5, 7.5, -1.5), @@ -285,6 +294,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Moltencrawler, _) => (2.5, 7.0, -5.5), (Mosscrawler, _) => (2.5, 7.0, -5.5), (Sandcrawler, _) => (2.5, 7.0, -5.5), + (Dagonite, _) => (2.5, 7.0, -5.5), }, scaler: match (body.species, body.body_type) { (Tarantula, _) => 1.0, @@ -298,6 +308,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Moltencrawler, _) => 0.8, (Mosscrawler, _) => 0.8, (Sandcrawler, _) => 0.8, + (Dagonite, _) => 0.8, }, // Z ori (front, front center, back center, center) leg_ori: match (body.species, body.body_type) { diff --git a/voxygen/anim/src/biped_large/beam.rs b/voxygen/anim/src/biped_large/beam.rs index 172a0b7637..05d17a22be 100644 --- a/voxygen/anim/src/biped_large/beam.rs +++ b/voxygen/anim/src/biped_large/beam.rs @@ -88,7 +88,7 @@ impl Animation for BeamAnimation { let move1 = move1base * pullback; let move2 = move2base * pullback; match active_tool_kind { - Some(ToolKind::Sceptre) | Some(ToolKind::Staff) => { + Some(ToolKind::Staff) => { next.control_l.position = Vec3::new(-1.0, 3.0, 12.0); next.control_r.position = Vec3::new(1.0 + move1 * 5.0, 2.0 + move1 * 1.0, 2.0 + move1 * 14.0); @@ -125,6 +125,86 @@ impl Animation for BeamAnimation { next.shoulder_r.orientation = Quaternion::rotation_x(move1 * 0.2 + 0.3 + 0.6 * speednorm + (footrotl * -0.2)); }, + Some(ToolKind::Sceptre) => match ability_id { + Some("common.abilities.custom.sea_bishop.longbeam") => { + next.control_l.position = Vec3::new(-1.0, 3.0, 12.0); + next.control_r.position = + Vec3::new(-1.0 + move1 * 5.0, 2.0 + move1 * 1.0, 2.0 + move1 * 14.0); + + next.control.position = Vec3::new( + -3.0 + move1 * -5.0, + -2.0 + s_a.grip.0 / 1.2 + move1 * 3.0 + move2shake * 1.0, + -11.0 + -s_a.grip.0 / 2.0 + move1 * -2.0, + ); + next.head.orientation = + Quaternion::rotation_x(move1 * -0.2) * Quaternion::rotation_y(move1 * 0.2); + next.jaw.orientation = Quaternion::rotation_x(0.0); + + next.control_l.orientation = + Quaternion::rotation_x(PI / 2.0) * Quaternion::rotation_y(-0.5); + next.control_r.orientation = Quaternion::rotation_x(PI / 2.5 + move1 * 0.4) + * Quaternion::rotation_y(0.5) + * Quaternion::rotation_z(move1 * 1.2 + move2shake * 0.5); + + next.control.orientation = Quaternion::rotation_x(-0.2 + move1 * -0.1) + * Quaternion::rotation_y(-0.1 + move1 * 0.6); + next.shoulder_l.position = Vec3::new( + -s_a.shoulder.0, + s_a.shoulder.1, + s_a.shoulder.2 - foothorir * 1.0, + ); + next.shoulder_l.orientation = Quaternion::rotation_x( + move1 * 0.2 + 0.3 + 0.8 * speednorm + (footrotr * -0.2), + ); + next.shoulder_r.position = Vec3::new( + s_a.shoulder.0, + s_a.shoulder.1, + s_a.shoulder.2 - foothoril * 1.0, + ); + next.shoulder_r.orientation = Quaternion::rotation_x( + move1 * 0.2 + 0.3 + 0.6 * speednorm + (footrotl * -0.2), + ); + }, + _ => { + next.control_l.position = Vec3::new(-1.0, 3.0, 12.0); + next.control_r.position = + Vec3::new(1.0 + move1 * 5.0, 2.0 + move1 * 1.0, 2.0 + move1 * 14.0); + + next.control.position = Vec3::new( + -3.0 + move1 * -5.0, + 3.0 + s_a.grip.0 / 1.2 + move1 * 3.0 + move2shake * 1.0, + -11.0 + -s_a.grip.0 / 2.0 + move1 * -2.0, + ); + next.head.orientation = + Quaternion::rotation_x(move1 * -0.2) * Quaternion::rotation_y(move1 * 0.2); + next.jaw.orientation = Quaternion::rotation_x(0.0); + + next.control_l.orientation = + Quaternion::rotation_x(PI / 2.0) * Quaternion::rotation_y(-0.5); + next.control_r.orientation = Quaternion::rotation_x(PI / 2.5 + move1 * 0.4) + * Quaternion::rotation_y(0.5) + * Quaternion::rotation_z(move1 * 1.2 + move2shake * 0.5); + + next.control.orientation = Quaternion::rotation_x(-0.2 + move1 * -0.1) + * Quaternion::rotation_y(-0.1 + move1 * 0.6); + next.shoulder_l.position = Vec3::new( + -s_a.shoulder.0, + s_a.shoulder.1, + s_a.shoulder.2 - foothorir * 1.0, + ); + next.shoulder_l.orientation = Quaternion::rotation_x( + move1 * 0.2 + 0.3 + 0.8 * speednorm + (footrotr * -0.2), + ); + next.shoulder_r.position = Vec3::new( + s_a.shoulder.0, + s_a.shoulder.1, + s_a.shoulder.2 - foothoril * 1.0, + ); + next.shoulder_r.orientation = Quaternion::rotation_x( + move1 * 0.2 + 0.3 + 0.6 * speednorm + (footrotl * -0.2), + ); + }, + }, Some(ToolKind::Natural) => match ability_id { Some("common.abilities.custom.tidalwarrior.bubbles") => { if mirror > 0.0 { diff --git a/voxygen/anim/src/biped_large/mod.rs b/voxygen/anim/src/biped_large/mod.rs index b0dfae671f..a6ac805fd2 100644 --- a/voxygen/anim/src/biped_large/mod.rs +++ b/voxygen/anim/src/biped_large/mod.rs @@ -265,6 +265,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Tursus, _) => (-4.5, -14.0), (Gigasfrost, _) => (-1.5, 5.0), (AdletElder, _) => (-8.0, 10.0), + (SeaBishop, _) => (0.0, 9.5), }, jaw: match (body.species, body.body_type) { (Ogre, _) => (0.0, 0.0), @@ -291,6 +292,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Tursus, _) => (4.0, 10.5), (Gigasfrost, _) => (-1.0, 5.5), (AdletElder, _) => (10.5, -7.0), + (SeaBishop, _) => (5.0, -4.5), }, upper_torso: match (body.species, body.body_type) { (Ogre, Male) => (0.0, 27.5), @@ -318,6 +320,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Tursus, _) => (3.0, 26.0), (Gigasfrost, _) => (-1.0, 30.0), (AdletElder, _) => (3.0, 19.0), + (SeaBishop, _) => (0.0, 15.0), }, lower_torso: match (body.species, body.body_type) { (Ogre, Male) => (1.0, -7.0), @@ -345,6 +348,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Tursus, _) => (-5.0, -9.0), (Gigasfrost, _) => (0.0, -5.5), (AdletElder, _) => (0.0, -4.0), + (SeaBishop, _) => (0.0, -1.0), }, tail: match (body.species, body.body_type) { (Werewolf, _) => (-5.5, -2.0), @@ -381,6 +385,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Tursus, _) => (12.5, -2.5, -2.0), (Gigasfrost, _) => (10.5, 0.5, 0.0), (AdletElder, _) => (8.5, 1.0, 2.5), + (SeaBishop, _) => (7.0, 0.0, 1.0), }, hand: match (body.species, body.body_type) { (Ogre, Male) => (14.5, 0.0, -4.0), @@ -408,6 +413,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Tursus, _) => (15.5, 0.0, -7.0), (Gigasfrost, _) => (17.0, 0.5, -6.0), (AdletElder, _) => (8.0, 1.5, -2.5), + (SeaBishop, _) => (10.0, 0.0, -3.0), }, leg: match (body.species, body.body_type) { (Ogre, Male) => (0.0, 0.0, -4.0), @@ -435,6 +441,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Tursus, _) => (4.5, 1.0, -9.0), (Gigasfrost, _) => (6.0, 0.0, -10.0), (AdletElder, _) => (3.0, -1.5, -4.0), + (SeaBishop, _) => (3.0, 1.0, -14.0), }, foot: match (body.species, body.body_type) { (Ogre, Male) => (4.0, 1.0, -12.0), @@ -462,6 +469,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Tursus, _) => (5.5, 3.0, -14.5), (Gigasfrost, _) => (6.5, 2.0, -19.5), (AdletElder, _) => (4.0, 3.5, -10.0), + (SeaBishop, _) => (5.5, 3.0, -6.5), }, scaler: match (body.species, body.body_type) { (Ogre, Male) => 1.12, @@ -489,6 +497,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Tursus, _) => 1.0, (Gigasfrost, _) => 1.7, (AdletElder, _) => 1.0, + (SeaBishop, _) => 1.0, }, tempo: match (body.species, body.body_type) { (Ogre, Male) => 0.9, @@ -527,6 +536,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Tursus, _) => (13.0, 0.0), (Gigasfrost, _) => (16.0, 0.0), (AdletElder, _) => (10.0, 0.0), + (SeaBishop, _) => (6.0, 0.0), }, shl: match (body.species, body.body_type) { (Dullahan, _) => (-4.75, -11.0, 8.5, 1.47, -0.2, 0.0), @@ -619,6 +629,7 @@ fn mount_point(body: &Body) -> Vec3 { (Tursus, _) => (0.0, 2.0, 3.0), (Gigasfrost, _) => (1.0, 2.0, 4.0), (AdletElder, _) => (0.0, 0.0, -1.0), + (SeaBishop, _) => (0.0, 0.0, -1.0), } .into() } diff --git a/voxygen/anim/src/biped_large/wield.rs b/voxygen/anim/src/biped_large/wield.rs index ed3a57a0e9..4279bc3431 100644 --- a/voxygen/anim/src/biped_large/wield.rs +++ b/voxygen/anim/src/biped_large/wield.rs @@ -219,7 +219,7 @@ impl Animation for WieldAnimation { next.control.orientation = Quaternion::rotation_x(-1.0 + short * 0.2) * Quaternion::rotation_y(-1.8); }, - Some(ToolKind::Staff) => { + Some(ToolKind::Staff) | Some(ToolKind::Sceptre) => { next.control_l.position = Vec3::new(-1.0, 3.0, 12.0); next.control_r.position = Vec3::new(1.0, 2.0, 2.0); diff --git a/voxygen/anim/src/golem/mod.rs b/voxygen/anim/src/golem/mod.rs index 6539c2fb27..41a2beb3a3 100644 --- a/voxygen/anim/src/golem/mod.rs +++ b/voxygen/anim/src/golem/mod.rs @@ -138,60 +138,70 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Treant, _) => (18.0, -8.0), (ClayGolem, _) => (-2.0, 7.0), (WoodGolem, _) => (3.0, 6.0), + (CoralGolem, _) => (-1.0, 3.0), }, jaw: match (body.species, body.body_type) { (StoneGolem, _) => (0.0, 0.0), (Treant, _) => (-6.5, -1.0), (ClayGolem, _) => (0.0, 0.0), (WoodGolem, _) => (0.0, 0.0), + (CoralGolem, _) => (0.0, 0.0), }, upper_torso: match (body.species, body.body_type) { (StoneGolem, _) => (0.0, 34.5), (Treant, _) => (0.0, 28.5), (ClayGolem, _) => (0.0, 26.5), (WoodGolem, _) => (0.0, 24.5), + (CoralGolem, _) => (0.0, 25.0), }, lower_torso: match (body.species, body.body_type) { (StoneGolem, _) => (0.0, -10.5), (Treant, _) => (0.0, -10.5), (ClayGolem, _) => (0.0, -4.5), (WoodGolem, _) => (0.0, -4.5), + (CoralGolem, _) => (0.0, -11.5), }, shoulder: match (body.species, body.body_type) { (StoneGolem, _) => (8.0, -1.5, 4.0), (Treant, _) => (8.0, 4.5, -3.0), (ClayGolem, _) => (8.0, 2.0, 3.0), (WoodGolem, _) => (6.0, 2.0, 1.0), + (CoralGolem, _) => (11.0, 1.0, 0.0), }, hand: match (body.species, body.body_type) { (StoneGolem, _) => (12.5, -1.0, -7.0), (Treant, _) => (8.5, -1.0, -7.0), (ClayGolem, _) => (8.5, -1.0, -7.0), (WoodGolem, _) => (5.5, -1.0, -6.0), + (CoralGolem, _) => (2.5, -1.5, -5.0), }, leg: match (body.species, body.body_type) { (StoneGolem, _) => (4.0, 0.0, -3.5), (Treant, _) => (2.0, 9.5, -1.0), (ClayGolem, _) => (1.0, 0.5, -6.0), (WoodGolem, _) => (2.0, 0.5, -6.0), + (CoralGolem, _) => (2.5, 0.5, -3.0), }, foot: match (body.species, body.body_type) { (StoneGolem, _) => (3.5, 0.5, -9.5), (Treant, _) => (3.5, -5.0, -8.5), (ClayGolem, _) => (3.5, -1.0, -8.5), (WoodGolem, _) => (2.5, 1.0, -5.5), + (CoralGolem, _) => (2.5, 1.0, -1.5), }, scaler: match (body.species, body.body_type) { (StoneGolem, _) => 1.5, (Treant, _) => 1.5, (ClayGolem, _) => 1.5, (WoodGolem, _) => 1.5, + (CoralGolem, _) => 1.0, }, tempo: match (body.species, body.body_type) { (StoneGolem, _) => 1.0, (Treant, _) => 1.0, (ClayGolem, _) => 1.0, (WoodGolem, _) => 1.0, + (CoralGolem, _) => 1.0, }, } } diff --git a/voxygen/src/audio/sfx/mod.rs b/voxygen/src/audio/sfx/mod.rs index 565cc0ebb5..560e40cbd0 100644 --- a/voxygen/src/audio/sfx/mod.rs +++ b/voxygen/src/audio/sfx/mod.rs @@ -173,6 +173,7 @@ pub enum SfxEvent { Lightning, CyclopsCharge, LaserBeam, + Steam, Music(ToolKind, AbilitySpec), Yeet, Klonk, @@ -472,6 +473,10 @@ impl SfxMgr { let sfx_trigger_item = triggers.get_key_value(&SfxEvent::IceCrack); audio.emit_sfx(sfx_trigger_item, *pos, Some(2.0), underwater); }, + Outcome::Steam { pos, .. } => { + let sfx_trigger_item = triggers.get_key_value(&SfxEvent::Steam); + audio.emit_sfx(sfx_trigger_item, *pos, Some(2.0), underwater); + }, Outcome::ProjectileShot { pos, body, .. } => { match body { Body::Object( @@ -565,7 +570,9 @@ impl SfxMgr { } }, Outcome::Beam { pos, specifier } => match specifier { - beam::FrontendSpecifier::LifestealBeam => { + beam::FrontendSpecifier::LifestealBeam + | beam::FrontendSpecifier::Steam + | beam::FrontendSpecifier::Bubbles => { if thread_rng().gen_bool(0.5) { let sfx_trigger_item = triggers.get_key_value(&SfxEvent::SceptreBeam); audio.emit_sfx(sfx_trigger_item, *pos, None, underwater); @@ -578,8 +585,6 @@ impl SfxMgr { } }, beam::FrontendSpecifier::ClayGolem - | beam::FrontendSpecifier::Bubbles - | beam::FrontendSpecifier::Steam | beam::FrontendSpecifier::Frost | beam::FrontendSpecifier::WebStrand => {}, }, diff --git a/voxygen/src/scene/figure/mod.rs b/voxygen/src/scene/figure/mod.rs index 4b1371915a..6593575630 100644 --- a/voxygen/src/scene/figure/mod.rs +++ b/voxygen/src/scene/figure/mod.rs @@ -4698,6 +4698,38 @@ impl FigureMgr { }, } }, + CharacterState::LeapShockwave(s) => { + let stage_time = s.timer.as_secs_f32(); + let stage_progress = match s.stage_section { + StageSection::Buildup => { + stage_time / s.static_data.buildup_duration.as_secs_f32() + }, + StageSection::Movement => { + stage_time / s.static_data.buildup_duration.as_secs_f32() + }, + StageSection::Action => { + stage_time / s.static_data.swing_duration.as_secs_f32() + }, + StageSection::Recover => { + stage_time / s.static_data.recover_duration.as_secs_f32() + }, + _ => 0.0, + }; + + anim::arthropod::LeapShockAnimation::update_skeleton( + &target_base, + ( + active_tool_kind, + second_tool_kind, + rel_vel, + time, + Some(s.stage_section), + ), + stage_progress, + &mut state_animation_rate, + skeleton_attr, + ) + }, // TODO! _ => target_base, }; diff --git a/voxygen/src/scene/particle.rs b/voxygen/src/scene/particle.rs index dad9b80c5b..a3e84759e9 100644 --- a/voxygen/src/scene/particle.rs +++ b/voxygen/src/scene/particle.rs @@ -392,6 +392,7 @@ impl ParticleMgr { | Outcome::IceCrack { .. } | Outcome::Glider { .. } | Outcome::Woosh { .. } + | Outcome::Steam { .. } | Outcome::LaserBeam { .. } => {}, } } diff --git a/world/src/block/mod.rs b/world/src/block/mod.rs index 33ccff42d5..b4f31e4d2a 100644 --- a/world/src/block/mod.rs +++ b/world/src/block/mod.rs @@ -358,6 +358,16 @@ pub fn block_from_structure( }), )); }, + StructureBlock::GlassKeyhole(consumes) => { + return Some(( + Block::air(SpriteKind::GlassKeyhole), + Some(SpriteCfg { + unlock: Some(UnlockKind::Consumes(ItemDefinitionIdOwned::Simple( + consumes.clone(), + ))), + }), + )); + }, }; Some((block?, None)) diff --git a/world/src/site2/plot/sea_chapel.rs b/world/src/site2/plot/sea_chapel.rs index a0ab423511..a7d25d0583 100644 --- a/world/src/site2/plot/sea_chapel.rs +++ b/world/src/site2/plot/sea_chapel.rs @@ -1,7 +1,7 @@ use super::*; use crate::{ - site2::{plot::dungeon::spiral_staircase, util::Dir}, - util::{sampler::Sampler, RandomField, NEIGHBORS}, + site2::{gen::PrimitiveTransform, plot::dungeon::spiral_staircase}, + util::{sampler::Sampler, RandomField, DIAGONALS, NEIGHBORS}, Land, CONFIG, }; use common::{ @@ -10,7 +10,11 @@ use common::{ }; use rand::prelude::*; -use std::sync::Arc; +use std::{ + f32::consts::{PI, TAU}, + sync::Arc, +}; + use vek::*; pub struct SeaChapel { @@ -39,9 +43,10 @@ impl Structure for SeaChapel { let base = self.alt + 1; let center = self.bounds.center(); let diameter = 54; + let variant = center.with_z(base); let mut rng = thread_rng(); // Fills - let (top, washed) = match (RandomField::new(0).get(center.with_z(base))) % 2 { + let (top, washed) = match (RandomField::new(0).get(variant)) % 2 { 0 => { //color_scheme_1 blue ( @@ -61,27 +66,39 @@ impl Structure for SeaChapel { let rope = Fill::Block(Block::air(SpriteKind::Rope)); let ropefix1 = Fill::Brick(BlockKind::Rock, Rgb::new(80, 75, 35), 24); let ropefix2 = Fill::Brick(BlockKind::Rock, Rgb::new(172, 172, 172), 4); - let white_polished = Fill::Brick(BlockKind::Rock, Rgb::new(202, 202, 202), 24); - let white_coral = Fill::Sampling(Arc::new(|center| { - let c = (RandomField::new(0).get(center) % 13) as u8 * 10 + 120; - Some(Block::new(BlockKind::Rock, Rgb::new(c, c, c))) + let white = Fill::Brick(BlockKind::Rock, Rgb::new(202, 202, 202), 24); + let floor_blue = Fill::Sampling(Arc::new(|variant| { + Some( + match (RandomField::new(0).get(Vec3::new(variant.z, variant.x, variant.y))) % 9 { + 0 => Block::new(BlockKind::Rock, Rgb::new(38, 118, 179)), + 1 => Block::new(BlockKind::Rock, Rgb::new(34, 52, 126)), + 2 => Block::new(BlockKind::Rock, Rgb::new(69, 179, 228)), + 3 => Block::new(BlockKind::Rock, Rgb::new(32, 45, 113)), + 4 => Block::new(BlockKind::Rock, Rgb::new(252, 253, 248)), + 5 => Block::new(BlockKind::Rock, Rgb::new(40, 106, 167)), + 6 => Block::new(BlockKind::Rock, Rgb::new(69, 182, 240)), + 7 => Block::new(BlockKind::Rock, Rgb::new(69, 182, 240)), + _ => Block::new(BlockKind::Rock, Rgb::new(240, 240, 238)), + }, + ) })); - let white = match (RandomField::new(0).get(center.with_z(base - 1))) % 2 { - 0 => white_polished, - _ => white_coral.clone(), + let floor_white = white.clone(); + let floor_color = match (RandomField::new(0).get(center.with_z(base - 1))) % 2 { + 0 => floor_white, + _ => floor_blue, }; let gold = Fill::Brick(BlockKind::GlowingRock, Rgb::new(245, 232, 0), 10); let gold_chain = Fill::Block(Block::air(SpriteKind::SeaDecorChain)); let gold_decor = Fill::Block(Block::air(SpriteKind::SeaDecorBlock)); - let window_hor = Fill::Block(Block::air(SpriteKind::SeaDecorWindowHor)); let window_ver = Fill::Block(Block::air(SpriteKind::SeaDecorWindowVer)); let window_ver2 = Fill::Block( Block::air(SpriteKind::SeaDecorWindowVer) .with_ori(2) .unwrap(), ); + let window_hor = Fill::Block(Block::air(SpriteKind::SeaDecorWindowHor)); let glass_barrier = Fill::Block(Block::air(SpriteKind::GlassBarrier)); - let sea_urchins = Fill::Block(Block::air(SpriteKind::SeaUrchin)); + let glass_keyhole = Fill::Block(Block::air(SpriteKind::GlassKeyhole)); // random exit from water basin to side building let mut connect_gate_types = vec![ SpriteKind::GlassBarrier, @@ -89,123 +106,493 @@ impl Structure for SeaChapel { SpriteKind::SeaDecorWindowHor, SpriteKind::SeaDecorWindowHor, ]; - //Paint SeaChapel - // balcony1 - let center_b1 = Vec2::new(center.x + (diameter / 2) - (diameter / 4), center.y); + let sprite_fill = Fill::Sampling(Arc::new(|center| { + Some(match (RandomField::new(0).get(center)) % 200 { + 0 => Block::air(SpriteKind::CoralChest), + 1..=5 => Block::air(SpriteKind::SeaDecorPillar), + 6..=25 => Block::air(SpriteKind::SeashellLantern), + _ => Block::new(BlockKind::Air, Rgb::new(0, 0, 0)), + }) + })); + let pos_var = RandomField::new(0).get(center.with_z(base)) % 5; + let radius = diameter / 2; //8 + pos_var; + let tubes = 7.0 + pos_var as f32; + let phi = TAU / tubes; + let up = diameter / 16; + // chapel main room painter - .cylinder(Aabb { - min: (center_b1 - (diameter / 3) + 2) - .with_z(base - (diameter / 8) + (diameter / 2) - 8), - max: (center_b1 + (diameter / 3) - 2) - .with_z(base - (diameter / 8) + (diameter / 2) - 7), + .sphere(Aabb { + min: (center - (diameter / 2)).with_z(base - (diameter / 8)), + max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter), }) .fill(white.clone()); + let main_upper_half = painter.aabb(Aabb { + min: (center - (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2)), + max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter), + }); + // chapel 1st washed out top + painter + .sphere(Aabb { + min: (center - (diameter / 2)).with_z(base - (diameter / 8)), + max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter), + }) + .intersect(main_upper_half) + .fill(washed.clone()); + // chapel 1st top + painter + .sphere(Aabb { + min: (center - (diameter / 2) + 1).with_z(base - (diameter / 8) + 1), + max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter), + }) + .intersect(main_upper_half) + .fill(top.clone()); + // chapel main room gold ring painter .cylinder(Aabb { - min: (center_b1 - (diameter / 3) + 1) - .with_z(base - (diameter / 8) + (diameter / 2) - 7), - max: (center_b1 + (diameter / 3) - 1) - .with_z(base - (diameter / 8) + (diameter / 2) - 6), + min: (center - (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2) + 1), + max: (center + (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2) + 2), + }) + .fill(gold.clone()); + + // chapel top room + painter + .sphere(Aabb { + min: (center - (diameter / 3)) + .with_z(base - (diameter / 8) + diameter - (diameter / 3)), + max: (center + (diameter / 3)) + .with_z(base - (diameter / 8) + diameter + (diameter / 3)), }) .fill(white.clone()); + let small_upper_half = painter.aabb(Aabb { + min: (center - (diameter / 3)).with_z(base - (diameter / 8) + diameter), + max: (center + (diameter / 3)) + .with_z(base - (diameter / 8) + diameter + (diameter / 3)), + }); + // chapel small washed out top painter - .cylinder(Aabb { - min: (center_b1 - (diameter / 3)) - .with_z(base - (diameter / 8) + (diameter / 2) - 6), - max: (center_b1 + (diameter / 3)) - .with_z(base - (diameter / 8) + (diameter / 2) - 5), + .sphere(Aabb { + min: (center - (diameter / 3)) + .with_z(base - (diameter / 8) + diameter - (diameter / 3)), + max: (center + (diameter / 3)) + .with_z(base - (diameter / 8) + diameter + (diameter / 3)), }) - .fill(white.clone()); + .intersect(small_upper_half) + .fill(washed.clone()); + // chapel small top painter - .cylinder(Aabb { - min: (center_b1 - (diameter / 3) - 1) - .with_z(base - (diameter / 8) + (diameter / 2) - 5), - max: (center_b1 + (diameter / 3) + 1) - .with_z(base - (diameter / 8) + (diameter / 2) - 4), + .sphere(Aabb { + min: (center - (diameter / 3) + 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 3) + 1), + max: (center + (diameter / 3)) + .with_z(base - (diameter / 8) + diameter + (diameter / 3)), }) - .fill(white.clone()); + .intersect(small_upper_half) + .fill(top.clone()); + // chapel small top gold ring painter .cylinder(Aabb { - min: (center_b1 - (diameter / 3)) - .with_z(base - (diameter / 8) + (diameter / 2) - 5), - max: (center_b1 + (diameter / 3)) - .with_z(base - (diameter / 8) + (diameter / 2) - 4), + min: (center - (diameter / 3)).with_z(base - (diameter / 8) + diameter + 1), + max: (center + (diameter / 3)).with_z(base - (diameter / 8) + diameter + 2), + }) + .fill(gold.clone()); + // clear chapel top room + painter + .sphere(Aabb { + min: (center - (diameter / 3) + 1) + .with_z(base - (diameter / 8) + diameter - (diameter / 3) + 1), + max: (center + (diameter / 3) - 1) + .with_z(base - (diameter / 8) + diameter + (diameter / 3) - 1), }) .clear(); - painter - .cylinder(Aabb { - min: (center_b1 - (diameter / 3) - 2) - .with_z(base - (diameter / 8) + (diameter / 2) - 4), - max: (center_b1 + (diameter / 3) + 2) - .with_z(base - (diameter / 8) + (diameter / 2) - 3), - }) - .fill(gold_decor.clone()); - painter - .cylinder(Aabb { - min: (center_b1 - (diameter / 3) - 1) - .with_z(base - (diameter / 8) + (diameter / 2) - 4), - max: (center_b1 + (diameter / 3) + 1) - .with_z(base - (diameter / 8) + (diameter / 2) - 3), - }) + + // chapel gold top emblem + let emblem_4 = painter.aabb(Aabb { + min: Vec3::new( + center.x - 7, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 9, + ), + max: Vec3::new( + center.x + 7, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 11, + ), + }); + emblem_4.fill(gold.clone()); + let emblem_4_clear = painter.aabb(Aabb { + min: Vec3::new( + center.x - 3, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 9, + ), + max: Vec3::new( + center.x + 3, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 11, + ), + }); + emblem_4_clear.clear(); + emblem_4 + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .fill(gold.clone()); + emblem_4_clear + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) .clear(); - // balcony2 - let center_b2 = Vec2::new(center.x, center.y + (diameter / 2) - (diameter / 4)); - painter - .cylinder(Aabb { - min: (center_b2 - (diameter / 3) + 2) - .with_z(base - (diameter / 8) + (diameter / 2) - 8), - max: (center_b2 + (diameter / 3) - 2) - .with_z(base - (diameter / 8) + (diameter / 2) - 7), - }) - .fill(white.clone()); - painter - .cylinder(Aabb { - min: (center_b2 - (diameter / 3) + 1) - .with_z(base - (diameter / 8) + (diameter / 2) - 7), - max: (center_b2 + (diameter / 3) - 1) - .with_z(base - (diameter / 8) + (diameter / 2) - 6), - }) - .fill(white.clone()); - painter - .cylinder(Aabb { - min: (center_b2 - (diameter / 3)) - .with_z(base - (diameter / 8) + (diameter / 2) - 6), - max: (center_b2 + (diameter / 3)) - .with_z(base - (diameter / 8) + (diameter / 2) - 5), - }) - .fill(white.clone()); - painter - .cylinder(Aabb { - min: (center_b2 - (diameter / 3) - 1) - .with_z(base - (diameter / 8) + (diameter / 2) - 5), - max: (center_b2 + (diameter / 3) + 1) - .with_z(base - (diameter / 8) + (diameter / 2) - 4), - }) - .fill(white.clone()); - painter - .cylinder(Aabb { - min: (center_b2 - (diameter / 3)) - .with_z(base - (diameter / 8) + (diameter / 2) - 5), - max: (center_b2 + (diameter / 3)) - .with_z(base - (diameter / 8) + (diameter / 2) - 4), - }) + + let emblem_5 = painter.aabb(Aabb { + min: Vec3::new( + center.x - 9, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 11, + ), + max: Vec3::new( + center.x + 9, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 13, + ), + }); + emblem_5.fill(gold.clone()); + let emblem_5_clear = painter.aabb(Aabb { + min: Vec3::new( + center.x - 5, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 11, + ), + max: Vec3::new( + center.x + 5, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 13, + ), + }); + emblem_5_clear.clear(); + emblem_5 + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .fill(gold.clone()); + emblem_5_clear + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) .clear(); - painter - .cylinder(Aabb { - min: (center_b2 - (diameter / 3) - 2) - .with_z(base - (diameter / 8) + (diameter / 2) - 4), - max: (center_b2 + (diameter / 3) + 2) - .with_z(base - (diameter / 8) + (diameter / 2) - 3), - }) - .fill(gold_decor.clone()); - painter - .cylinder(Aabb { - min: (center_b2 - (diameter / 3) - 1) - .with_z(base - (diameter / 8) + (diameter / 2) - 4), - max: (center_b2 + (diameter / 3) + 1) - .with_z(base - (diameter / 8) + (diameter / 2) - 3), - }) + let emblem_6 = painter.aabb(Aabb { + min: Vec3::new( + center.x - 11, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 13, + ), + max: Vec3::new( + center.x + 11, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 17, + ), + }); + emblem_6.fill(gold.clone()); + let emblem_6_clear = painter.aabb(Aabb { + min: Vec3::new( + center.x - 7, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 13, + ), + max: Vec3::new( + center.x + 7, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 17, + ), + }); + emblem_6_clear.clear(); + emblem_6 + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .fill(gold.clone()); + emblem_6_clear + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) .clear(); + let emblem_7 = painter.aabb(Aabb { + min: Vec3::new( + center.x - 11, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 13, + ), + max: Vec3::new( + center.x + 11, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 17, + ), + }); + emblem_7.fill(gold.clone()); + let emblem_7_clear = painter.aabb(Aabb { + min: Vec3::new( + center.x - 5, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 17, + ), + max: Vec3::new( + center.x + 5, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 19, + ), + }); + emblem_7_clear.clear(); + emblem_7 + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .fill(gold.clone()); + emblem_7_clear + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .clear(); + + let emblem_8 = painter.aabb(Aabb { + min: Vec3::new( + center.x - 9, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 19, + ), + max: Vec3::new( + center.x + 9, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 21, + ), + }); + emblem_8.fill(gold.clone()); + let emblem_8_clear = painter.aabb(Aabb { + min: Vec3::new( + center.x - 3, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 19, + ), + max: Vec3::new( + center.x + 3, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 21, + ), + }); + emblem_8_clear.clear(); + emblem_8 + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .fill(gold.clone()); + emblem_8_clear + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .clear(); + let emblem_9 = painter.aabb(Aabb { + min: Vec3::new( + center.x - 11, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 21, + ), + max: Vec3::new( + center.x + 11, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 23, + ), + }); + emblem_9.fill(gold.clone()); + let emblem_9_clear = painter.aabb(Aabb { + min: Vec3::new( + center.x - 7, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 21, + ), + max: Vec3::new( + center.x + 7, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 23, + ), + }); + emblem_9_clear.clear(); + emblem_9 + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .fill(gold.clone()); + emblem_9_clear + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .clear(); + let emblem_10 = painter.aabb(Aabb { + min: Vec3::new( + center.x - 11, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 23, + ), + max: Vec3::new( + center.x + 11, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 25, + ), + }); + emblem_10.fill(gold.clone()); + let emblem_10_clear = painter.aabb(Aabb { + min: Vec3::new( + center.x - 5, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 23, + ), + max: Vec3::new( + center.x + 5, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 25, + ), + }); + emblem_10_clear.clear(); + emblem_10 + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .fill(gold.clone()); + emblem_10_clear + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .clear(); + let emblem_11 = painter.aabb(Aabb { + min: Vec3::new( + center.x - 9, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 25, + ), + max: Vec3::new( + center.x + 9, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 27, + ), + }); + emblem_11.fill(gold.clone()); + let emblem_11_clear = painter.aabb(Aabb { + min: Vec3::new( + center.x - 3, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 25, + ), + max: Vec3::new( + center.x + 3, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 27, + ), + }); + emblem_11_clear.clear(); + emblem_11 + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .fill(gold.clone()); + emblem_11_clear + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .clear(); + + let emblem_12 = painter.aabb(Aabb { + min: Vec3::new( + center.x - 5, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 27, + ), + max: Vec3::new( + center.x + 5, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 29, + ), + }); + emblem_12.fill(gold.clone()); + let emblem_12_clear = painter.aabb(Aabb { + min: Vec3::new( + center.x - 3, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 27, + ), + max: Vec3::new( + center.x + 3, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 29, + ), + }); + emblem_12_clear.clear(); + emblem_12 + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .fill(gold.clone()); + emblem_12_clear + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .clear(); + let emblem_13 = painter.aabb(Aabb { + min: Vec3::new( + center.x - 7, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 29, + ), + max: Vec3::new( + center.x + 7, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 31, + ), + }); + emblem_13.fill(gold.clone()); + let emblem_13_clear = painter.aabb(Aabb { + min: Vec3::new( + center.x - 5, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 29, + ), + max: Vec3::new( + center.x + 5, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 31, + ), + }); + emblem_13_clear.clear(); + emblem_13 + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .fill(gold.clone()); + emblem_13_clear + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .clear(); + // chapel gold top sphere + painter + .sphere(Aabb { + min: (center - 4).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 3), + max: (center + 4).with_z(base - (diameter / 8) + diameter + (diameter / 3) + 5), + }) + .fill(gold.clone()); + // chapel gold top pole + painter + .aabb(Aabb { + min: (center - 1).with_z(base - (diameter / 8) + diameter + (diameter / 3) + 5), + max: (center + 1).with_z(base - (diameter / 8) + diameter + (diameter / 3) + 21), + }) + .fill(gold.clone()); + + let emblem_1 = painter.aabb(Aabb { + min: Vec3::new( + center.x - 3, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 11, + ), + max: Vec3::new( + center.x + 3, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 19, + ), + }); + emblem_1.fill(gold.clone()); + emblem_1 + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .fill(gold.clone()); + let emblem_2 = painter.aabb(Aabb { + min: Vec3::new( + center.x - 5, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 21, + ), + max: Vec3::new( + center.x + 5, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 23, + ), + }); + emblem_2.fill(gold.clone()); + emblem_2 + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .fill(gold.clone()); + let emblem_3 = painter.aabb(Aabb { + min: Vec3::new( + center.x - 5, + center.y - 1, + base - (diameter / 8) + diameter + (diameter / 3) + 7, + ), + max: Vec3::new( + center.x + 5, + center.y + 1, + base - (diameter / 8) + diameter + (diameter / 3) + 9, + ), + }); + emblem_3.fill(gold.clone()); + emblem_3 + .rotate_about(Mat3::rotation_z(PI / 2.0).as_(), center.with_z(base)) + .fill(gold.clone()); + // chapel bottom painter .sphere(Aabb { @@ -221,431 +608,384 @@ impl Structure for SeaChapel { .with_z(base - (2 * (diameter / 3)) + diameter - 1), }) .clear(); - // chapel main room - painter - .sphere(Aabb { - min: (center - (diameter / 2)).with_z(base - (diameter / 8)), - max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter), - }) - .fill(white.clone()); - // chapel main room entry1 stairs1 - // entry1 white floor - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 2) + 3, - center.y - 5, - base + (diameter / 8) - 4, - ), - max: Vec3::new( - center.x - (diameter / 2) + (diameter / 5), - center.y + 5, - base + (diameter / 8) - 1, - ), - }) - .fill(white.clone()); - painter - .ramp_inset( - Aabb { - min: Vec3::new( - center.x - (diameter / 2) - 12, - center.y - 3, - base - (diameter / 8) - 7, - ), - max: Vec3::new( - center.x - (diameter / 2) + 2, - center.y + 3, - base - (diameter / 8) + 7, - ), - }, - 14, - Dir::X, + // cellar sea crocodiles + let cellar_sea_croc_pos = (center - (diameter / 4)).with_z(base - (diameter / 2)); + for _ in 0..(3 + ((RandomField::new(0).get((cellar_sea_croc_pos).with_z(base))) % 5)) { + painter.spawn( + EntityInfo::at(cellar_sea_croc_pos.as_()) + .with_asset_expect("common.entity.wild.aggressive.sea_crocodile", &mut rng), ) - .fill(white.clone()); - // chapel main room entry2 stairs - // entry2 white floor - painter - .aabb(Aabb { - min: Vec3::new( - center.x + (diameter / 2) - (diameter / 5), - center.y - 5, - base + (diameter / 8) - 4, - ), - max: Vec3::new( - center.x + (diameter / 2) - 3, - center.y + 5, - base + (diameter / 8) - 1, - ), - }) - .fill(white.clone()); - painter - .ramp_inset( - Aabb { - min: Vec3::new( - center.x + (diameter / 2) - 2, - center.y - 3, - base - (diameter / 8) - 7, - ), - max: Vec3::new( - center.x + (diameter / 2) + 12, - center.y + 3, - base - (diameter / 8) + 7, - ), - }, - 14, - Dir::NegX, - ) - .fill(white.clone()); - // chapel 1st washed out top - painter - .sphere(Aabb { - min: (center - (diameter / 2)).with_z(base - (diameter / 8)), - max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter), - }) - .without(painter.cylinder(Aabb { - min: (center - (diameter / 2)).with_z(base - (diameter / 8)), - max: (center + (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2)), - })) - .fill(washed.clone()); - // chapel 1st top - painter - .sphere(Aabb { - min: (center - (diameter / 2) + 1).with_z(base - (diameter / 8)), - max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter), - }) - .without(painter.cylinder(Aabb { - min: (center - (diameter / 2)).with_z(base - (diameter / 8)), - max: (center + (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2)), - })) - .fill(top.clone()); - // chapel small top room - painter - .sphere(Aabb { - min: (center - (diameter / 3)) - .with_z(base - (diameter / 8) + diameter - (diameter / 3)), - max: (center + (diameter / 3)) - .with_z(base - (diameter / 8) + diameter + (diameter / 3)), - }) - .fill(white.clone()); - // chapel small washed out top - painter - .sphere(Aabb { - min: (center - (diameter / 3)) - .with_z(base - (diameter / 8) + diameter - (diameter / 3)), - max: (center + (diameter / 3)) - .with_z(base - (diameter / 8) + diameter + (diameter / 3)), - }) - .without( - painter.cylinder(Aabb { - min: (center - (diameter / 3)) - .with_z(base - (diameter / 8) + diameter - (diameter / 3)), - max: (center + (diameter / 3)).with_z(base - (diameter / 8) + diameter), - }), - ) - .fill(washed.clone()); - // chapel small top - painter - .sphere(Aabb { - min: (center - (diameter / 3) + 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 3)), - max: (center + (diameter / 3)) - .with_z(base - (diameter / 8) + diameter + (diameter / 3)), - }) - .without( - painter.cylinder(Aabb { - min: (center - (diameter / 3)) - .with_z(base - (diameter / 8) + diameter - (diameter / 3)), - max: (center + (diameter / 3)).with_z(base - (diameter / 8) + diameter), - }), - ) - .fill(top.clone()); - // ground to top room stairway3 - let center_s3 = Vec2::new(center.x, center.y - (diameter / 2)); - // stairway3 top room - painter - .sphere(Aabb { - min: (center_s3 - (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2) - 3), - max: (center_s3 + (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 3) - 3), - }) - .fill(white.clone()); - // stairway3 top washed out - painter - .sphere(Aabb { - min: (center_s3 - (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2) - 3), - max: (center_s3 + (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 3) - 3), - }) - .without( - painter.cylinder(Aabb { - min: (center_s3 - (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2) - 3), - max: (center_s3 + (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 3), - }), - ) - .fill(washed.clone()); - // stairway3 top - painter - .sphere(Aabb { - min: (center_s3 - (diameter / 6) + 1) - .with_z(base - (diameter / 8) + (diameter / 2) - 3), - max: (center_s3 + (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 3) - 3), - }) - .without( - painter.cylinder(Aabb { - min: (center_s3 - (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2) - 3), - max: (center_s3 + (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 3), - }), - ) - .fill(top.clone()); - // stairway3 top gold ring - painter - .cylinder(Aabb { - min: (center_s3 - (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 2), - max: (center_s3 + (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 1), - }) - .fill(gold.clone()); - // stairway3 clear top halfway - painter - .sphere(Aabb { - min: (center_s3 - (diameter / 6) + 1) - .with_z(base - (diameter / 8) + (diameter / 2) - 2), - max: (center_s3 + (diameter / 6) - 1) - .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 3) - 4), - }) - .without( - painter.cylinder(Aabb { - min: (center_s3 - (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2)) - - 2, - max: (center_s3 + (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 10) - 3), - }), - ) - .clear(); - // stairway3 top window1 - painter - .aabb(Aabb { - min: Vec3::new( - center_s3.x + (diameter / 6) - 1, - center_s3.y - 1, - base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 5, - ), - max: Vec3::new( - center_s3.x + (diameter / 6), - center_s3.y + 1, - base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 4, - ), - }) - .fill(window_ver2.clone()); - // stairway3 top window2 - painter - .aabb(Aabb { - min: Vec3::new( - center_s3.x - (diameter / 6), - center_s3.y - 1, - base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 5, - ), - max: Vec3::new( - center_s3.x - (diameter / 6) + 1, - center_s3.y + 1, - base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 4, - ), - }) - .fill(window_ver2.clone()); - - // stairway3 top window3 - painter - .aabb(Aabb { - min: Vec3::new( - center_s3.x - 1, - center_s3.y - (diameter / 6), - base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 5, - ), - max: Vec3::new( - center_s3.x + 1, - center_s3.y - (diameter / 6) + 1, - base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 4, - ), - }) - .fill(window_ver.clone()); - - // chapel clear room + } + // clear chapel main room painter .sphere(Aabb { min: (center - (diameter / 2) + 1).with_z(base - (diameter / 8) + 1), max: (center + (diameter / 2) - 1).with_z(base - (diameter / 8) + diameter - 1), }) .clear(); - // chapel main room entry1 gold door frame + + // chapel small top room gold decor ring and floor painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 2) + 2, - center.y - 2, - base + (diameter / 8) + 5, - ), - max: Vec3::new( - center.x - (diameter / 2) + 4, - center.y + 2, - base + (diameter / 8) + 6, - ), + .cylinder(Aabb { + min: (center - (diameter / 3) + 2).with_z(base - (diameter / 8) + diameter - 7), + max: (center + (diameter / 3) - 2).with_z(base - (diameter / 8) + diameter - 6), }) .fill(gold_decor.clone()); painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 2) + 2, - center.y - 3, - base + (diameter / 8) + 3, - ), - max: Vec3::new( - center.x - (diameter / 2) + 5, - center.y + 3, - base + (diameter / 8) + 5, - ), + .cylinder(Aabb { + min: (center - (diameter / 3) + 3).with_z(base - (diameter / 8) + diameter - 7), + max: (center + (diameter / 3) - 3).with_z(base - (diameter / 8) + diameter - 6), }) - .fill(gold_decor.clone()); + .fill(floor_color.clone()); + // chapel small top sprites painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 2) + 3, - center.y - 3, - base + (diameter / 8) - 3, - ), - max: Vec3::new( - center.x - (diameter / 2) + 5, - center.y + 3, - base + (diameter / 8) + 3, - ), + .cylinder(Aabb { + min: (center - (diameter / 3) + 3).with_z(base - (diameter / 8) + diameter - 6), + max: (center + (diameter / 3) - 3).with_z(base - (diameter / 8) + diameter - 5), }) - .fill(gold_decor.clone()); - // chapel main room entry2 gold door frame + .fill(sprite_fill.clone()); painter - .aabb(Aabb { - min: Vec3::new( - center.x + (diameter / 2) - 4, - center.y - 2, - base + (diameter / 8) + 5, - ), - max: Vec3::new( - center.x + (diameter / 2) - 2, - center.y + 2, - base + (diameter / 8) + 6, - ), - }) - .fill(gold_decor.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x + (diameter / 2) - 5, - center.y - 3, - base + (diameter / 8) + 3, - ), - max: Vec3::new( - center.x + (diameter / 2) - 2, - center.y + 3, - base + (diameter / 8) + 5, - ), - }) - .fill(gold_decor.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x + (diameter / 2) - 5, - center.y - 3, - base + (diameter / 8) - 3, - ), - max: Vec3::new( - center.x + (diameter / 2) - 3, - center.y + 3, - base + (diameter / 8) + 3, - ), - }) - .fill(gold_decor.clone()); - // chapel main room clear entries - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 2) - 8, - center.y - 2, - base + (diameter / 8) - 3, - ), - max: Vec3::new( - center.x + (diameter / 2) + 8, - center.y + 2, - base + (diameter / 8) + 4, - ), + .cylinder(Aabb { + min: (center - (diameter / 3) + 4).with_z(base - (diameter / 8) + diameter - 6), + max: (center + (diameter / 3) - 4).with_z(base - (diameter / 8) + diameter - 5), }) .clear(); + // window to main room + let center_w = center + 4; painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 2) - 8, - center.y - 1, - base + (diameter / 8) + 4, - ), - max: Vec3::new( - center.x + (diameter / 2) + 8, - center.y + 1, - base + (diameter / 8) + 5, - ), + .cylinder(Aabb { + min: (center_w - 6).with_z(base - (diameter / 8) + diameter - 7), + max: (center_w + 6).with_z(base - (diameter / 8) + diameter - 6), }) - .clear(); - // chapel main room mobilees - let mbl_corner = center - 5; - for dir in SQUARE_4 { - let mbl_center = mbl_corner + dir * 10; - let mbl_offset = - ((RandomField::new(0).get((mbl_corner - dir).with_z(base))) % 4) as i32 - 2; - painter - .cone(Aabb { - min: (mbl_center - 2) - .with_z(base - (diameter / 8) + (diameter / 3) + 2 + mbl_offset), - max: (mbl_center + 3) - .with_z(base - (diameter / 8) + (diameter / 3) + 2 + mbl_offset + 2), - }) - .fill(top.clone()); - painter - .cylinder(Aabb { - min: (mbl_center - 2) - .with_z(base - (diameter / 8) + (diameter / 3) + 1 + mbl_offset), - max: (mbl_center + 3) - .with_z(base - (diameter / 8) + (diameter / 3) + 2 + mbl_offset), - }) - .fill(gold_decor.clone()); - painter - .aabb(Aabb { - min: (mbl_center - 1) - .with_z(base - (diameter / 8) + (diameter / 3) + 1 + mbl_offset), - max: (mbl_center + 2) - .with_z(base - (diameter / 8) + (diameter / 3) + 2 + mbl_offset), - }) - .clear(); - // chapel main room mobilee chains - painter - .aabb(Aabb { - min: Vec3::new( - mbl_center.x, - mbl_center.y, - base - (diameter / 8) + (diameter / 3) + 4 + mbl_offset, - ), - max: Vec3::new( - mbl_center.x + 1, - mbl_center.y + 1, - base - (diameter / 8) + (diameter / 2) + 1, - ), - }) - .fill(gold_chain.clone()); + .fill(gold_decor.clone()); + painter + .cylinder(Aabb { + min: (center_w - 5).with_z(base - (diameter / 8) + diameter - 7), + max: (center_w + 5).with_z(base - (diameter / 8) + diameter - 6), + }) + .fill(window_hor); + // chapel top floor organ podium + let center_o2 = center - 4; + painter + .cylinder(Aabb { + min: (center_o2 - 4).with_z(base - (diameter / 8) + diameter - 6), + max: (center_o2 + 4).with_z(base - (diameter / 8) + diameter - 5), + }) + .fill(gold_decor.clone()); + painter + .cylinder(Aabb { + min: (center_o2 - 3).with_z(base - (diameter / 8) + diameter - 6), + max: (center_o2 + 3).with_z(base - (diameter / 8) + diameter - 5), + }) + .fill(floor_color.clone()); + // organ on chapel top floor organ podium + let first_floor_organ_pos = center_o2.with_z(base - (diameter / 8) + diameter - 4); + painter.spawn( + EntityInfo::at(first_floor_organ_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.organ", &mut rng), + ); + // sea clerics, bishop on top floor + let first_floor_spawn_pos = (center_o2 - 2).with_z(base - (diameter / 8) + diameter - 4); + for _ in 0..(2 + ((RandomField::new(0).get((first_floor_spawn_pos).with_z(base))) % 2)) { + painter.spawn( + EntityInfo::at(first_floor_spawn_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), + ) } + painter.spawn( + EntityInfo::at(first_floor_spawn_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.sea_bishop", &mut rng), + ); + // chapel main room gold decor ring and floor + painter + .cylinder(Aabb { + min: (center - (diameter / 2) + 3).with_z(base - 1), + max: (center + (diameter / 2) - 3).with_z(base), + }) + .fill(gold_decor.clone()); + painter + .cylinder(Aabb { + min: (center - (diameter / 2) + 5).with_z(base - 1), + max: (center + (diameter / 2) - 5).with_z(base), + }) + .fill(floor_color.clone()); + // chapel main room sprites + painter + .cylinder(Aabb { + min: (center - (diameter / 2) + 5).with_z(base), + max: (center + (diameter / 2) - 5).with_z(base + 1), + }) + .fill(sprite_fill.clone()); + painter + .cylinder(Aabb { + min: (center - (diameter / 2) + 6).with_z(base), + max: (center + (diameter / 2) - 6).with_z(base + 1), + }) + .clear(); + // chapel main room organ podium + let center_o1 = center + (diameter / 8); + painter + .cylinder(Aabb { + min: (center_o1 - 4).with_z(base), + max: (center_o1 + 4).with_z(base + 1), + }) + .fill(gold_decor.clone()); + painter + .cylinder(Aabb { + min: (center_o1 - 3).with_z(base), + max: (center_o1 + 3).with_z(base + 1), + }) + .fill(floor_color.clone()); + // organ on chapel main room organ podium + let first_floor_organ_pos = center_o1.with_z(base + 2); + painter.spawn( + EntityInfo::at(first_floor_organ_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.organ", &mut rng), + ); + // sea clerics on main floor + let main_room_sea_clerics_pos = (center_o1 - 2).with_z(base + 2); + for _ in 0..(3 + ((RandomField::new(0).get((main_room_sea_clerics_pos).with_z(base))) % 3)) + { + painter.spawn( + EntityInfo::at(main_room_sea_clerics_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), + ) + } + // coral golem on main floor + painter.spawn( + EntityInfo::at((first_floor_organ_pos + 2).as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.coralgolem", &mut rng), + ); + painter.spawn( + EntityInfo::at((first_floor_organ_pos + 4).as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.sea_bishop", &mut rng), + ); + // chapel main room glassbarrier to cellar + let center_g = center - diameter / 7; + painter + .cylinder(Aabb { + min: (center_g - 4).with_z(base - 1), + max: (center_g + 4).with_z(base), + }) + .fill(gold_decor.clone()); + painter + .cylinder(Aabb { + min: (center_g - 3).with_z(base - 1), + max: (center_g + 3).with_z(base), + }) + .fill(glass_barrier.clone()); + painter + .cylinder(Aabb { + min: (center_g - 1).with_z(base - 1), + max: (center_g).with_z(base), + }) + .fill(glass_keyhole.clone()); + + // cellar gold decor ring and floor + painter + .cylinder(Aabb { + min: (center - (diameter / 2) + 1).with_z(base - (diameter / 4) - 5), + max: (center + (diameter / 2) - 1).with_z(base - (diameter / 4) - 4), + }) + .fill(gold_decor.clone()); + painter + .cylinder(Aabb { + min: (center - (diameter / 2) + 3).with_z(base - (diameter / 4) - 5), + max: (center + (diameter / 2) - 3).with_z(base - (diameter / 4) - 4), + }) + .fill(floor_color.clone()); + // chapel cellar sprites + painter + .cylinder(Aabb { + min: (center - (diameter / 2) + 3).with_z(base - (diameter / 4) - 4), + max: (center + (diameter / 2) - 3).with_z(base - (diameter / 4) - 3), + }) + .fill(sprite_fill.clone()); + painter + .cylinder(Aabb { + min: (center - (diameter / 2) + 4).with_z(base - (diameter / 4) - 4), + max: (center + (diameter / 2) - 4).with_z(base - (diameter / 4) - 3), + }) + .clear(); + // stairway to cellar cardinals room + let stairs_pos = center_g + 1; + let stair_radius1 = 5.0; + let stairs_clear1 = painter.cylinder(Aabb { + min: (stairs_pos - stair_radius1 as i32).with_z(base - (diameter / 4) - 5), + max: (stairs_pos + stair_radius1 as i32).with_z(base - 1), + }); + stairs_clear1 + .sample(spiral_staircase( + stairs_pos.with_z(base - (diameter / 8) + diameter - (diameter / 8)), + stair_radius1, + 0.5, + 7.0, + )) + .fill(gold.clone()); + stairs_clear1 + .sample(spiral_staircase( + stairs_pos.with_z(base - (diameter / 8) + diameter - (diameter / 8)), + stair_radius1 - 1.0, + 0.5, + 7.0, + )) + .fill(white.clone()); + // cardinals room sea clerics + let cr_sea_clerics_pos = (center - (diameter / 5)).with_z(base - (diameter / 4) - 3); + for _ in 0..(2 + ((RandomField::new(0).get((cr_sea_clerics_pos).with_z(base))) % 3)) { + painter.spawn( + EntityInfo::at(cr_sea_clerics_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), + ) + } + // Cardinal + let cr_cardinal_pos = (center - (diameter / 6)).with_z(base - (diameter / 4) - 3); + painter.spawn( + EntityInfo::at(cr_cardinal_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.cardinal", &mut rng), + ); + // glassbarrier to water basin + painter + .cylinder(Aabb { + min: (center - 3).with_z(base - (diameter / 4) - 5), + max: (center + 3).with_z(base - (diameter / 4) - 4), + }) + .fill(gold_decor.clone()); + painter + .cylinder(Aabb { + min: (center - 2).with_z(base - (diameter / 4) - 5), + max: (center + 2).with_z(base - (diameter / 4) - 4), + }) + .fill(glass_barrier.clone()); + painter + .cylinder(Aabb { + min: (center - 1).with_z(base - (diameter / 4) - 5), + max: (center).with_z(base - (diameter / 4) - 4), + }) + .fill(glass_keyhole.clone()); + + // chapel floor1 window1 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 3), + center.y - 2, + base - (diameter / 8) + diameter - 2, + ), + max: Vec3::new( + center.x - (diameter / 3) + 1, + center.y + 2, + base - (diameter / 8) + diameter - 1, + ), + }) + .fill(window_ver2.clone()); + + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 3), + center.y - 1, + base - (diameter / 8) + diameter - 3, + ), + max: Vec3::new( + center.x - (diameter / 3) + 1, + center.y + 1, + base - (diameter / 8) + diameter - 2, + ), + }) + .fill(window_ver2.clone()); + + // chapel floor1 window2 + painter + .aabb(Aabb { + min: Vec3::new( + center.x + (diameter / 3) - 1, + center.y - 2, + base - (diameter / 8) + diameter - 2, + ), + max: Vec3::new( + center.x + (diameter / 3), + center.y + 2, + base - (diameter / 8) + diameter - 1, + ), + }) + .clear(); + + painter + .aabb(Aabb { + min: Vec3::new( + center.x + (diameter / 3) - 1, + center.y - 1, + base - (diameter / 8) + diameter - 3, + ), + max: Vec3::new( + center.x + (diameter / 3), + center.y + 1, + base - (diameter / 8) + diameter - 2, + ), + }) + .clear(); + + // chapel floor1 window3 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 2, + center.y + (diameter / 3) - 1, + base - (diameter / 8) + diameter - 2, + ), + max: Vec3::new( + center.x + 2, + center.y + (diameter / 3), + base - (diameter / 8) + diameter - 1, + ), + }) + .clear(); + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 1, + center.y + (diameter / 3) - 1, + base - (diameter / 8) + diameter - 3, + ), + max: Vec3::new( + center.x + 1, + center.y + (diameter / 3), + base - (diameter / 8) + diameter - 2, + ), + }) + .clear(); + // chapel floor1 window4 + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 2, + center.y - (diameter / 3), + base - (diameter / 8) + diameter - 2, + ), + max: Vec3::new( + center.x + 2, + center.y - (diameter / 3) + 1, + base - (diameter / 8) + diameter - 1, + ), + }) + .fill(window_ver.clone()); + + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 1, + center.y - (diameter / 3), + base - (diameter / 8) + diameter - 3, + ), + max: Vec3::new( + center.x + 1, + center.y - (diameter / 3) + 1, + base - (diameter / 8) + diameter - 2, + ), + }) + .fill(window_ver.clone()); + // chapel main room window1 painter .aabb(Aabb { @@ -691,7 +1031,7 @@ impl Structure for SeaChapel { }) .fill(window_ver2.clone()); - // chapel main room window2 to balcony1 + // chapel main room window2 painter .aabb(Aabb { min: Vec3::new( @@ -705,7 +1045,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) - 1, ), }) - .clear(); + .fill(window_ver2.clone()); painter .aabb(Aabb { min: Vec3::new( @@ -719,7 +1059,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) - 2, ), }) - .clear(); + .fill(window_ver2.clone()); painter .aabb(Aabb { min: Vec3::new( @@ -733,8 +1073,8 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) - 3, ), }) - .clear(); - // chapel main room window3 to balcony2 + .fill(window_ver2.clone()); + // chapel main room window3 painter .aabb(Aabb { min: Vec3::new( @@ -748,7 +1088,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) - 1, ), }) - .clear(); + .fill(window_ver.clone()); painter .aabb(Aabb { min: Vec3::new( @@ -762,7 +1102,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) - 2, ), }) - .clear(); + .fill(window_ver.clone()); painter .aabb(Aabb { min: Vec3::new( @@ -776,2759 +1116,667 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) - 3, ), }) - .clear(); - // chapel gold ring and white floor - painter - .cylinder(Aabb { - min: (center - (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2) + 1), - max: (center + (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2) + 2), - }) - .fill(gold.clone()); - painter - .cylinder(Aabb { - min: (center - (diameter / 2) + 1) - .with_z(base - (diameter / 8) + (diameter / 2) + 1), - max: (center + (diameter / 2) - 1) - .with_z(base - (diameter / 8) + (diameter / 2) + 2), - }) - .fill(white.clone()); - // chapel main room organ podium - let center_o = Vec2::new(center.x - (diameter / 4), center.y + (diameter / 4)); - painter - .cylinder(Aabb { - min: (center_o - 2).with_z(base), - max: (center_o + 2).with_z(base + (diameter / 8) - 2), - }) - .fill(white.clone()); - painter - .cylinder(Aabb { - min: (center_o - 3).with_z(base + (diameter / 8) - 2), - max: (center_o + 3).with_z(base + (diameter / 8) - 1), - }) - .fill(white.clone()); - painter - .cylinder(Aabb { - min: (center_o - 4).with_z(base + (diameter / 8) - 1), - max: (center_o + 4).with_z(base + (diameter / 8)), - }) - .fill(gold_decor.clone()); - painter - .cylinder(Aabb { - min: (center_o - 3).with_z(base + (diameter / 8) - 1), - max: (center_o + 3).with_z(base + (diameter / 8)), - }) - .fill(white.clone()); - // organ on chapel main room organ podium - let main_room_organ_pos = center_o.with_z(base + (diameter / 8)); - painter.spawn( - EntityInfo::at(main_room_organ_pos.as_()) - .with_asset_expect("common.entity.dungeon.sea_chapel.organ", &mut rng), - ); - // sea clerics in chapel main room - let main_room_sea_clerics_pos = (center_o - 2).with_z(base + (diameter / 8)); - for _ in 0..(4 + ((RandomField::new(0).get((main_room_sea_clerics_pos).with_z(base))) % 4)) - { - painter.spawn( - EntityInfo::at(main_room_sea_clerics_pos.as_()) - .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), - ) - } - // chapel first floor organ podium - let center_o2 = Vec2::new(center.x - (diameter / 4), center.y - (diameter / 4)); - painter - .cylinder(Aabb { - min: (center_o2 - 4).with_z(base - (diameter / 8) + (diameter / 2) + 2), - max: (center_o2 + 4).with_z(base - (diameter / 8) + (diameter / 2) + 3), - }) - .fill(gold_decor.clone()); - painter - .cylinder(Aabb { - min: (center_o2 - 3).with_z(base - (diameter / 8) + (diameter / 2) + 2), - max: (center_o2 + 3).with_z(base - (diameter / 8) + (diameter / 2) + 3), - }) - .fill(white.clone()); - // organ on chapel first floor organ podium - let first_floor_organ_pos = center_o2.with_z(base - (diameter / 8) + (diameter / 2) + 2); - painter.spawn( - EntityInfo::at(first_floor_organ_pos.as_()) - .with_asset_expect("common.entity.dungeon.sea_chapel.organ", &mut rng), - ); - // sea clerics on first floor - let first_floor_sea_clerics_pos = - (center_o2 - 2).with_z(base - (diameter / 8) + (diameter / 2) + 2); - for _ in - 0..(3 + ((RandomField::new(0).get((first_floor_sea_clerics_pos).with_z(base))) % 3)) - { - painter.spawn( - EntityInfo::at(first_floor_sea_clerics_pos.as_()) - .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), - ) - } - // ground to top room stairway1 - let center_s1 = Vec2::new( - center.x - (diameter / 2) + (diameter / 8), - center.y - (diameter / 8) - (diameter / 16), - ); - // stairway1 top room - painter - .sphere(Aabb { - min: (center_s1 - (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 4)), - max: (center_s1 + (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 3)), - }) - .fill(white.clone()); - // stairway1 top washed out - painter - .sphere(Aabb { - min: (center_s1 - (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 4)), - max: (center_s1 + (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 3)), - }) - .without( - painter.cylinder(Aabb { - min: (center_s1 - (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 4)), - max: (center_s1 + (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6)), - }), - ) - .fill(washed.clone()); - // stairway1 top - painter - .sphere(Aabb { - min: (center_s1 - (diameter / 6) + 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 4)), - max: (center_s1 + (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 3)), - }) - .without( - painter.cylinder(Aabb { - min: (center_s1 - (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 4)), - max: (center_s1 + (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6)), - }), - ) - .fill(top.clone()); - // stairway1 top gold ring - painter - .cylinder(Aabb { - min: (center_s1 - (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) + 1), - max: (center_s1 + (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) + 2), - }) - .fill(gold.clone()); - // stairway1 top window1 - painter - .aabb(Aabb { - min: Vec3::new( - center_s1.x - (diameter / 6), - center_s1.y - 1, - base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) - 2, - ), - max: Vec3::new( - center_s1.x - (diameter / 6) + 1, - center_s1.y + 1, - base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) - 1, - ), - }) - .fill(window_ver2.clone()); + .fill(window_ver.clone()); - // stairway1 top window2 + // chapel main room window4 painter .aabb(Aabb { min: Vec3::new( - center_s1.x - 1, - center_s1.y - (diameter / 6), - base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) - 2, + center.x - 4, + center.y - (diameter / 2) + 1, + base - (diameter / 8) + (diameter / 2) - 2, ), max: Vec3::new( - center_s1.x + 1, - center_s1.y - (diameter / 6) + 1, - base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) - 1, + center.x + 4, + center.y - (diameter / 2), + base - (diameter / 8) + (diameter / 2) - 1, ), }) .fill(window_ver.clone()); - - // stairway1 top window3 - painter - .aabb(Aabb { - min: Vec3::new( - center_s1.x - 1, - center_s1.y + (diameter / 6) - 1, - base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) - 2, - ), - max: Vec3::new( - center_s1.x + 1, - center_s1.y + (diameter / 6), - base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) - 1, - ), - }) - .fill(window_ver.clone()); - - // ground to top room stairway2 - let center_s2 = Vec2::new( - center.x + (diameter / 2) - (diameter / 6), - center.y + (diameter / 8) + (diameter / 16), - ); - // stairway2 top room - painter - .sphere(Aabb { - min: (center_s2 - (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 10)), - max: (center_s2 + (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 3)), - }) - .fill(white.clone()); - // stairway2 top washed out - painter - .sphere(Aabb { - min: (center_s2 - (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 10)), - max: (center_s2 + (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 3)), - }) - .without( - painter.cylinder(Aabb { - min: (center_s2 - (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 10)), - max: (center_s2 + (diameter / 6)).with_z( - base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6), - ), - }), - ) - .fill(washed.clone()); - // stairway2 top - painter - .sphere(Aabb { - min: (center_s2 - (diameter / 6) + 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 10)), - max: (center_s2 + (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 3)), - }) - .without( - painter.cylinder(Aabb { - min: (center_s2 - (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 10)), - max: (center_s2 + (diameter / 6)).with_z( - base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6), - ), - }), - ) - .fill(top.clone()); - // stairway2 top gold ring - painter - .cylinder(Aabb { - min: (center_s2 - (diameter / 6)).with_z( - base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6) + 1, - ), - max: (center_s2 + (diameter / 6)).with_z( - base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6) + 2, - ), - }) - .fill(gold.clone()); - // chapel clear top room - painter - .sphere(Aabb { - min: (center - (diameter / 3) + 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 3) + 1), - max: (center + (diameter / 3) - 1) - .with_z(base - (diameter / 8) + diameter + (diameter / 3) - 1), - }) - .clear(); - // stairway1 clear top halfway - painter - .sphere(Aabb { - min: (center_s1 - (diameter / 6) + 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 4) + 1), - max: (center_s1 + (diameter / 6) - 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 3) - 1), - }) - .without( - painter.sphere(Aabb { - min: (center_s1 - (diameter / 6) + 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 4) + 1), - max: (center_s1 + (diameter / 6) - 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 8)), - }), - ) - .clear(); - // stairway2 clear top halfway - painter - .sphere(Aabb { - min: (center_s2 - (diameter / 6) + 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 10) + 1), - max: (center_s2 + (diameter / 6) - 1).with_z( - base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 3) - 1, - ), - }) - .without( - painter.sphere(Aabb { - min: (center_s2 - (diameter / 6) + 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 10) + 1), - max: (center_s2 + (diameter / 6) - 1) - .with_z(base - (diameter / 8) + diameter + 2), - }), - ) - .clear(); - // stairway2 top window1 - painter - .aabb(Aabb { - min: Vec3::new( - center_s2.x + (diameter / 6) - 1, - center_s2.y - 1, - base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6) - 2, - ), - max: Vec3::new( - center_s2.x + (diameter / 6), - center_s2.y + 1, - base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6) - 1, - ), - }) - .fill(window_ver2.clone()); - - // stairway2 top window2 - painter - .aabb(Aabb { - min: Vec3::new( - center_s2.x - 1, - center_s2.y + (diameter / 6) - 1, - base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6) - 2, - ), - max: Vec3::new( - center_s2.x + 1, - center_s2.y + (diameter / 6), - base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6) - 1, - ), - }) - .fill(window_ver.clone()); - // chapel tube1 / NPC-fence - painter - .cylinder(Aabb { - min: (center - (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 2) + 2), - max: (center + (diameter / 6)).with_z(base - (diameter / 8) + diameter + 1), - }) - .fill(white.clone()); - painter - .cylinder(Aabb { - min: (center - (diameter / 6) + 1) - .with_z(base - (diameter / 8) + (diameter / 2) + 2), - max: (center + (diameter / 6) - 1).with_z(base - (diameter / 8) + diameter + 1), - }) - .clear(); - // chapel tube1 gold window - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 6) - 1, - center.y - 1, - base + (diameter / 2) + 5, - ), - max: Vec3::new( - center.x - (diameter / 6), - center.y + 1, - base + (diameter / 2) + 6, - ), - }) - .fill(gold_decor.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 6) - 1, - center.y - 2, - base + (diameter / 2) + 4, - ), - max: Vec3::new( - center.x - (diameter / 6), - center.y + 2, - base + (diameter / 2) + 5, - ), - }) - .fill(gold_decor.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 6) - 1, - center.y - 1, - base + (diameter / 2) + 4, - ), - max: Vec3::new( - center.x - (diameter / 6) + 1, - center.y + 1, - base + (diameter / 2) + 5, - ), - }) - .clear(); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 6) - 1, - center.y - 3, - base + (diameter / 2) + 2, - ), - max: Vec3::new( - center.x - (diameter / 6), - center.y + 3, - base + (diameter / 2) + 4, - ), - }) - .fill(gold_decor.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 6) - 1, - center.y - 2, - base + (diameter / 2) + 2, - ), - max: Vec3::new( - center.x - (diameter / 6) + 1, - center.y + 2, - base + (diameter / 2) + 4, - ), - }) - .clear(); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 6) - 1, - center.y - 2, - base + (diameter / 2) + 1, - ), - max: Vec3::new( - center.x - (diameter / 6), - center.y + 2, - base + (diameter / 2) + 2, - ), - }) - .fill(gold_decor.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 6) - 1, - center.y - 1, - base + (diameter / 2) + 1, - ), - max: Vec3::new( - center.x - (diameter / 6) + 1, - center.y + 1, - base + (diameter / 2) + 2, - ), - }) - .clear(); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 6) - 1, - center.y - 1, - base + (diameter / 2), - ), - max: Vec3::new( - center.x - (diameter / 6), - center.y + 1, - base + (diameter / 2) + 1, - ), - }) - .fill(gold_decor.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 6) - 1, - center.y - 2, - base + (diameter / 2) + 2, - ), - max: Vec3::new( - center.x - (diameter / 6), - center.y + 2, - base + (diameter / 2) + 4, - ), - }) - .fill(window_ver2.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 6) - 1, - center.y - 1, - base + (diameter / 2) + 1, - ), - max: Vec3::new( - center.x - (diameter / 6), - center.y + 1, - base + (diameter / 2) + 5, - ), - }) - .fill(window_ver2.clone()); - // chapel floor1 mobilees and cages - let floor1_corner = center - (diameter / 5); - for dir in SQUARE_4 { - let floor1_pos = floor1_corner + dir * (2 * diameter / 5); - let floor1_variant = (RandomField::new(0).get((floor1_corner + dir).with_z(base))) % 10; - match floor1_variant { - // chapel first floor mobilee - 0..=4 => { - let floor1_mbl_top = Aabb { - min: (floor1_pos - 3) - .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 8), - max: (floor1_pos + 2) - .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 6), - }; - let floor1_mbl_gold = painter.cylinder(Aabb { - min: (floor1_pos - 3) - .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 9), - max: (floor1_pos + 2) - .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 8), - }); - let floor1_mbl_gold_clear = painter.aabb(Aabb { - min: (floor1_pos - 2) - .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 9), - max: (floor1_pos + 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 8), - }); - let floor1_mbl_chain = Aabb { - min: (floor1_pos - 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 6), - max: (floor1_pos) - .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 1), - }; - painter.cone(floor1_mbl_top).fill(top.clone()); - floor1_mbl_gold.fill(gold_decor.clone()); - floor1_mbl_gold_clear.clear(); - painter.aabb(floor1_mbl_chain).fill(gold_chain.clone()); - }, - _ => { - // chapel floor1 hanging cages - let cage_glass_barriers = Aabb { - min: (floor1_pos - 3).with_z( - base - (diameter / 4) + diameter - - (diameter / 8) - - (2 * (diameter / 11)) - + 5, - ), - max: (floor1_pos + 3) - .with_z(base - (diameter / 4) + diameter - (diameter / 8)), - }; - let cage_clear1 = Aabb { - min: (floor1_pos - 3 + 1).with_z( - base - (diameter / 4) + diameter - - (diameter / 8) - - (2 * (diameter / 11)) - + 5, - ), - max: (floor1_pos + 3 - 1) - .with_z(base - (diameter / 4) + diameter - (diameter / 8)), - }; - let cage_clear2 = Aabb { - min: (floor1_pos - 3) - .with_z(base - (diameter / 4) + diameter - (diameter / 8) - 2), - max: (floor1_pos + 3) - .with_z(base - (diameter / 4) + diameter - (diameter / 8) - 1), - }; - let cage_windows = Aabb { - min: (floor1_pos - 3 + 1).with_z( - base - (diameter / 4) + diameter - - (diameter / 8) - - (2 * (diameter / 11)) - + 4, - ), - max: (floor1_pos + 3 - 1).with_z( - base - (diameter / 4) + diameter - - (diameter / 8) - - (2 * (diameter / 11)) - + 5, - ), - }; - let cage_platform = Aabb { - min: (floor1_pos - 1).with_z( - base - (diameter / 4) + diameter - - (diameter / 8) - - (2 * (diameter / 11)) - + 4, - ), - max: (floor1_pos + 1).with_z( - base - (diameter / 4) + diameter - - (diameter / 8) - - (2 * (diameter / 11)) - + 5, - ), - }; - let cage_chain = Aabb { - min: (floor1_pos - 1).with_z( - base - (diameter / 4) + diameter - - (diameter / 8) - - (2 * (diameter / 11)) - + 5, - ), - max: (floor1_pos + 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 2), - }; - let cage_chain_fix = Aabb { - min: (floor1_pos - 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 2), - max: (floor1_pos + 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 1), - }; - let cage_coral_chest_podium = Aabb { - min: (floor1_pos + 1).with_z( - base - (diameter / 4) + diameter - - (diameter / 8) - - (2 * (diameter / 11)) - + 4, - ), - max: (floor1_pos + 2).with_z( - base - (diameter / 4) + diameter - - (diameter / 8) - - (2 * (diameter / 11)) - + 6, - ), - }; - let cage_coral_chest_pos = (floor1_pos + 1).with_z( - base - (diameter / 4) + diameter - (diameter / 8) - (2 * (diameter / 11)) - + 6, - ); - // first floor cage Sea Cleric - let cage_sea_cleric_pos = (floor1_pos - 1).with_z( - base - (diameter / 4) + diameter - (diameter / 8) - (2 * (diameter / 11)) - + 5, - ); - painter - .cylinder(cage_glass_barriers) - .fill(glass_barrier.clone()); - painter.aabb(cage_clear1).clear(); - painter.cylinder(cage_clear2).clear(); - painter.aabb(cage_windows).fill(window_hor.clone()); - painter.aabb(cage_platform).fill(gold_decor.clone()); - painter.aabb(cage_chain).fill(gold_chain.clone()); - painter.aabb(cage_chain_fix).fill(gold_decor.clone()); - painter - .aabb(cage_coral_chest_podium) - .fill(gold_decor.clone()); - painter.rotated_sprite(cage_coral_chest_pos, SpriteKind::CoralChest, 2); - painter.spawn(EntityInfo::at(cage_sea_cleric_pos.as_()).with_asset_expect( - "common.entity.dungeon.sea_chapel.sea_cleric_sceptre", - &mut rng, - )); - }, - } - } - - // chapel floor1 window1 - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 3), - center.y, - base - (diameter / 8) + diameter - 2, - ), - max: Vec3::new( - center.x - (diameter / 3) + 1, - center.y + 2, - base - (diameter / 8) + diameter - 1, - ), - }) - .fill(window_ver2.clone()); - - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 3), - center.y, - base - (diameter / 8) + diameter - 3, - ), - max: Vec3::new( - center.x - (diameter / 3) + 1, - center.y + 1, - base - (diameter / 8) + diameter - 2, - ), - }) - .fill(window_ver2.clone()); - - // chapel floor1 window2 - painter - .aabb(Aabb { - min: Vec3::new( - center.x + (diameter / 3) - 1, - center.y - 2, - base - (diameter / 8) + diameter - 2, - ), - max: Vec3::new( - center.x + (diameter / 3), - center.y, - base - (diameter / 8) + diameter - 1, - ), - }) - .fill(window_ver2.clone()); - - painter - .aabb(Aabb { - min: Vec3::new( - center.x + (diameter / 3) - 1, - center.y - 1, - base - (diameter / 8) + diameter - 3, - ), - max: Vec3::new( - center.x + (diameter / 3), - center.y, - base - (diameter / 8) + diameter - 2, - ), - }) - .fill(window_ver2.clone()); - - // chapel floor1 window3 - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 2, - center.y + (diameter / 3) - 1, - base - (diameter / 8) + diameter - 2, - ), - max: Vec3::new( - center.x + 2, - center.y + (diameter / 3), - base - (diameter / 8) + diameter - 1, - ), - }) - .fill(window_ver.clone()); - - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 1, - center.y + (diameter / 3) - 1, - base - (diameter / 8) + diameter - 3, - ), - max: Vec3::new( - center.x + 1, - center.y + (diameter / 3), - base - (diameter / 8) + diameter - 2, - ), - }) - .fill(window_ver.clone()); - - // chapel floor1 window4 - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 2, - center.y - (diameter / 3), - base - (diameter / 8) + diameter - 2, - ), - max: Vec3::new( - center.x + 2, - center.y - (diameter / 3) + 1, - base - (diameter / 8) + diameter - 1, - ), - }) - .fill(window_ver.clone()); - - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 1, - center.y - (diameter / 3), - base - (diameter / 8) + diameter - 3, - ), - max: Vec3::new( - center.x + 1, - center.y - (diameter / 3) + 1, - base - (diameter / 8) + diameter - 2, - ), - }) - .fill(window_ver.clone()); - - // chapel floor1 - painter - .cylinder(Aabb { - min: (center - (diameter / 3)).with_z(base - (diameter / 8) + diameter + 1), - max: (center + (diameter / 3)).with_z(base - (diameter / 8) + diameter + 2), - }) - .fill(gold.clone()); - painter - .cylinder(Aabb { - min: (center - (diameter / 3) + 1).with_z(base - (diameter / 8) + diameter + 1), - max: (center + (diameter / 3) - 1).with_z(base - (diameter / 8) + diameter + 2), - }) - .fill(white.clone()); - // chapel tube2 / NPC-fence - painter - .cylinder(Aabb { - min: (center - (diameter / 6)).with_z(base - (diameter / 8) + diameter + 2), - max: (center + (diameter / 6)) - .with_z(base - (diameter / 8) + diameter + (diameter / 3) - 3), - }) - .fill(white.clone()); - painter - .cylinder(Aabb { - min: (center - (diameter / 6) + 1).with_z(base - (diameter / 8) + diameter + 2), - max: (center + (diameter / 6) - 1) - .with_z(base - (diameter / 8) + diameter + (diameter / 3) - 3), - }) - .clear(); - // chapel tube2 gold door - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 6) - 1, - center.y - 3, - base - (diameter / 8) + diameter + 2, - ), - max: Vec3::new( - center.x - (diameter / 6), - center.y + 3, - base - (diameter / 8) + diameter + 6, - ), - }) - .fill(gold_decor.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 6) - 1, - center.y - 2, - base - (diameter / 8) + diameter + 6, - ), - max: Vec3::new( - center.x - (diameter / 6), - center.y + 2, - base - (diameter / 8) + diameter + 7, - ), - }) - .fill(gold_decor.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 6) - 1, - center.y - 2, - base - (diameter / 8) + diameter + 2, - ), - max: Vec3::new( - center.x - (diameter / 6) + 1, - center.y + 2, - base - (diameter / 8) + diameter + 5, - ), - }) - .clear(); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 6) - 1, - center.y - 1, - base - (diameter / 8) + diameter + 5, - ), - max: Vec3::new( - center.x - (diameter / 6) + 1, - center.y + 1, - base - (diameter / 8) + diameter + 6, - ), - }) - .clear(); - //chapel floor2 - painter - .cylinder(Aabb { - min: (center - (diameter / 3) + 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 1), - max: (center + (diameter / 3) - 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 8)), - }) - .fill(white.clone()); - //chapel floor2 drawer and potion - painter.sprite( - (center - (diameter / 8)).with_z(base - (diameter / 8) + diameter - (diameter / 8)), - SpriteKind::DrawerSmall, - ); - painter.sprite( - (center - (diameter / 8)).with_z(base - (diameter / 8) + diameter - (diameter / 8) + 1), - SpriteKind::PotionMinor, - ); - //chapel main room pillars1 - for dir in SQUARE_4 { - let sq_corner = Vec2::new(center.x - 3, center.y - (diameter / 4) - 2); - let pos = Vec3::new( - sq_corner.x + (dir.x * 5), - sq_corner.y + (dir.y * ((diameter / 2) + 2)), - base - (diameter / 8) + (diameter / 6), - ); - painter.sprite(pos, SpriteKind::SeaDecorPillar); - } - //chapel main room pillars2 - for dir in SQUARE_4 { - let sq_corner = Vec2::new(center.x - (diameter / 2) + 6, center.y - 4); - let pos = Vec3::new( - sq_corner.x + (dir.x * (diameter - 13)), - sq_corner.y + (dir.y * 7), - base - (diameter / 8) + (diameter / 6) + 2, - ); - painter.sprite(pos, SpriteKind::SeaDecorPillar); - } - //chapel floor1 pillars inside tube - for dir in SQUARE_4 { - let sq_corner = Vec2::new(center.x - (diameter / 8) - 2, center.y - 3); - let pos = Vec3::new( - sq_corner.x + (dir.x * ((diameter / 4) + 2)), - sq_corner.y + (dir.y * 5), - base - (diameter / 8) + (diameter / 2) + 2, - ); - painter.sprite(pos, SpriteKind::SeaDecorPillar); - } - //chapel floor1 pillars outside tube - for dir in SQUARE_4 { - let sq_corner = Vec2::new(center.x - (diameter / 8) - 3, center.y - 4); - let pos = Vec3::new( - sq_corner.x + (dir.x * ((diameter / 4) + 4)), - sq_corner.y + (dir.y * 7), - base - (diameter / 8) + (diameter / 2) + 2, - ); - painter.sprite(pos, SpriteKind::SeaDecorPillar); - } - //chapel floor2/3 pillars inside tube - for dir in SQUARE_4 { - for f in 0..2 { - let sq_corner = Vec2::new(center.x - (diameter / 8) - 2, center.y - 3); - let pos = Vec3::new( - sq_corner.x + (dir.x * ((diameter / 4) + 2)), - sq_corner.y + (dir.y * 5), - base - (diameter / 8) + diameter - (diameter / 8) + (f * ((diameter / 8) + 2)), - ); - painter.sprite(pos, SpriteKind::SeaDecorPillar); - } - } - //chapel floor2/3 pillars outside tube - for dir in SQUARE_4 { - for f in 0..2 { - let sq_corner = Vec2::new(center.x - (diameter / 8) - 3, center.y - 4); - let pos = Vec3::new( - sq_corner.x + (dir.x * ((diameter / 4) + 4)), - sq_corner.y + (dir.y * 7), - base - (diameter / 8) + diameter - (diameter / 8) + (f * ((diameter / 8) + 2)), - ); - painter.sprite(pos, SpriteKind::SeaDecorPillar); - } - } - // floor2 tube Sea Clerics - let fl2_tb_sea_clerics_pos = (center + (diameter / 8) - 2) - .with_z(base - (diameter / 8) + diameter - (diameter / 8) + 1); - for _ in 0..(1 + (RandomField::new(0).get((fl2_tb_sea_clerics_pos).with_z(base))) % 3) { - painter.spawn( - EntityInfo::at(fl2_tb_sea_clerics_pos.as_()).with_asset_expect( - "common.entity.dungeon.sea_chapel.sea_cleric_sceptre", - &mut rng, - ), - ) - } - // chapel upper floor exits - let (exit_pos1, exit_pos2) = ( - Vec2::new(center.x, center.y + (diameter / 4)), - Vec2::new(center.x, center.y - (diameter / 4)), - ); - let floors_exit_distr = RandomField::new(0).get(center.with_z(base)) as usize % 2; - let (floor2_exit_center, floor3_exit_center) = match floors_exit_distr { - 0 => (exit_pos1, exit_pos2), - _ => (exit_pos2, exit_pos1), - }; - // floor3 exit - painter - .cylinder(Aabb { - min: (floor3_exit_center - 2).with_z(base - (diameter / 8) + diameter + 1), - max: (floor3_exit_center + 2).with_z(base - (diameter / 8) + diameter + 2), - }) - .fill(glass_barrier.clone()); - // floor2 exit - painter - .cylinder(Aabb { - min: (floor2_exit_center - 2) - .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 1), - max: (floor2_exit_center + 2) - .with_z(base - (diameter / 8) + diameter - (diameter / 8)), - }) - .fill(glass_barrier.clone()); - // floor 2 Sea Clerics - let fl2_sea_clerics_pos = Vec3::new( - center.x - 3, - center.y - (diameter / 4), - base - (diameter / 8) + diameter - (diameter / 8) + 1, - ); - for _ in 0..(2 + ((RandomField::new(0).get((fl2_sea_clerics_pos).with_z(base))) % 4)) { - painter.spawn( - EntityInfo::at(fl2_sea_clerics_pos.as_()) - .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), - ) - } - // floor 3 Sea Clerics - let fl3_sea_clerics_pos = - (center - (diameter / 6)).with_z(base - (diameter / 8) + diameter + 2); - for _ in 0..(2 + ((RandomField::new(0).get((fl3_sea_clerics_pos).with_z(base))) % 2)) { - painter.spawn( - EntityInfo::at(fl3_sea_clerics_pos.as_()) - .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), - ) - } - // chapel gold top emblem4 - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 7, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 9, - ), - max: Vec3::new( - center.x + 7, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 11, - ), - }) - .fill(gold.clone()); painter .aabb(Aabb { min: Vec3::new( center.x - 3, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 9, + center.y - (diameter / 2) + 1, + base - (diameter / 8) + (diameter / 2) - 3, ), max: Vec3::new( center.x + 3, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 11, - ), - }) - .clear(); - // chapel gold top emblem5 - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 9, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 11, - ), - max: Vec3::new( - center.x + 9, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 13, - ), - }) - .fill(gold.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 5, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 11, - ), - max: Vec3::new( - center.x + 5, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 13, - ), - }) - .clear(); - // chapel gold top emblem6 - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 11, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 13, - ), - max: Vec3::new( - center.x + 11, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 17, - ), - }) - .fill(gold.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 7, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 13, - ), - max: Vec3::new( - center.x + 7, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 17, - ), - }) - .clear(); - // chapel gold top emblem7 - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 9, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 17, - ), - max: Vec3::new( - center.x + 9, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 19, - ), - }) - .fill(gold.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 5, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 17, - ), - max: Vec3::new( - center.x + 5, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 19, - ), - }) - .clear(); - // chapel gold top emblem8 - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 9, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 19, - ), - max: Vec3::new( - center.x + 9, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 21, - ), - }) - .fill(gold.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 3, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 19, - ), - max: Vec3::new( - center.x + 3, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 21, - ), - }) - .clear(); - // chapel gold top emblem9 - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 11, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 21, - ), - max: Vec3::new( - center.x + 11, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 23, - ), - }) - .fill(gold.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 7, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 21, - ), - max: Vec3::new( - center.x + 7, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 23, - ), - }) - .clear(); - // chapel gold top emblem10 - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 11, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 23, - ), - max: Vec3::new( - center.x + 11, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 25, - ), - }) - .fill(gold.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 5, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 23, - ), - max: Vec3::new( - center.x + 5, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 25, - ), - }) - .clear(); - // chapel gold top emblem11 - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 9, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 25, - ), - max: Vec3::new( - center.x + 9, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 27, - ), - }) - .fill(gold.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 3, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 25, - ), - max: Vec3::new( - center.x + 3, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 27, - ), - }) - .clear(); - // chapel gold top emblem12 - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 5, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 27, - ), - max: Vec3::new( - center.x + 5, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 29, - ), - }) - .fill(gold.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 3, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 27, - ), - max: Vec3::new( - center.x + 3, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 29, - ), - }) - .clear(); - // chapel gold top emblem13 - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 7, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 29, - ), - max: Vec3::new( - center.x + 7, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 31, - ), - }) - .fill(gold.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 5, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 29, - ), - max: Vec3::new( - center.x + 5, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 31, - ), - }) - .clear(); - // chapel gold top sphere - painter - .sphere(Aabb { - min: (center - 4).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 3), - max: (center + 4).with_z(base - (diameter / 8) + diameter + (diameter / 3) + 5), - }) - .fill(gold.clone()); - // chapel gold top pole - painter - .aabb(Aabb { - min: (center - 1).with_z(base - (diameter / 8) + diameter + (diameter / 3) + 5), - max: (center + 1).with_z(base - (diameter / 8) + diameter + (diameter / 3) + 21), - }) - .fill(gold.clone()); - // chapel gold top emblem1 - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 3, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 11, - ), - max: Vec3::new( - center.x + 3, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 19, - ), - }) - .fill(gold.clone()); - // chapel gold top emblem2 - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 5, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 21, - ), - max: Vec3::new( - center.x + 5, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 23, - ), - }) - .fill(gold.clone()); - // chapel gold top emblem3 - painter - .aabb(Aabb { - min: Vec3::new( - center.x - 5, - center.y - 1, - base - (diameter / 8) + diameter + (diameter / 3) + 7, - ), - max: Vec3::new( - center.x + 5, - center.y + 1, - base - (diameter / 8) + diameter + (diameter / 3) + 9, - ), - }) - .fill(gold.clone()); - // chapel main room pulpit - painter - .sphere(Aabb { - min: (center - (diameter / 6)).with_z(base - (diameter / 8)), - max: (center + (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 3)), - }) - .fill(white.clone()); - painter - .cylinder(Aabb { - min: (center - (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 6)), - max: (center + (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 3)), - }) - .clear(); - // chapel main room pulpit gold ring - painter - .sphere(Aabb { - min: (center - (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 6)), - max: (center + (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 6) + 1), - }) - .fill(gold_decor.clone()); - - painter - .cylinder(Aabb { - min: (center - (diameter / 6) + 1).with_z(base - (diameter / 8) + (diameter / 6)), - max: (center + (diameter / 6) - 1) - .with_z(base - (diameter / 8) + (diameter / 6) + 1), - }) - .clear(); - // chapel clear rope & platform entries - painter - .cylinder(Aabb { - min: (center - 3).with_z(base - (2 * (diameter / 3)) + 3), - max: (center + 3).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 2), - }) - .clear(); - //chapel main room gold window downwards - painter - .cylinder(Aabb { - min: (center - 3).with_z(base - (diameter / 8)), - max: (center + 3).with_z(base - (diameter / 8) + 1), - }) - .fill(window_hor.clone()); - // chapel Ropefix1 - painter - .cylinder(Aabb { - min: (center - 2).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 3), - max: (center + 2).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 2), - }) - .fill(ropefix1.clone()); - // chapel Ropefix2 - painter - .cylinder(Aabb { - min: (center).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 4), - max: (center + 1).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 3), - }) - .fill(ropefix2.clone()); - // chapel rope - painter - .cylinder(Aabb { - min: (center).with_z(base - (diameter / 8) + (diameter / 2) - 5), - max: (center + 1).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 4), - }) - .fill(rope.clone()); - // chapel floor1 to cellar1 tube (access to dagons room) - let t_center = Vec2::new(center.x + (diameter / 4) + 2, center.y + (diameter / 4) + 4); - painter - .cylinder(Aabb { - min: (t_center - 2).with_z(base - (diameter / 8)), - max: (t_center + 2).with_z(base - (diameter / 8) + (diameter / 2) + 2), - }) - .fill(white.clone()); - painter - .cylinder(Aabb { - min: (t_center - 1).with_z(base - (diameter / 8)), - max: (t_center + 1).with_z(base - (diameter / 8) + (diameter / 2) + 2), - }) - .clear(); - painter - .cylinder(Aabb { - min: (t_center - 1).with_z(base - (diameter / 8) + (diameter / 2) + 1), - max: (t_center + 1).with_z(base - (diameter / 8) + (diameter / 2) + 2), - }) - .fill(glass_barrier.clone()); - // chapel cellar2 water - painter - .cylinder(Aabb { - min: (center - 5).with_z(base - (2 * (diameter / 3)) + 1), - max: (center + 5).with_z(base - (2 * (diameter / 3)) + 2), - }) - .fill(water.clone()); - painter - .cylinder(Aabb { - min: (center - 11).with_z(base - (2 * (diameter / 3)) + 2), - max: (center + 11).with_z(base - (2 * (diameter / 3)) + 3), - }) - .fill(water.clone()); - // chapel cellar to basin glass barrier barricade downwards & miniboss - // cellar floor - painter - .cylinder(Aabb { - min: (center - (2 * (diameter / 3))).with_z(base - (2 * (diameter / 3)) + 10), - max: (center + (2 * (diameter / 3))).with_z(base - (2 * (diameter / 3)) + 16), - }) - .fill(white_coral.clone()); - // exit to water basin - let exit = Fill::Sampling(Arc::new(|center| { - let c = RandomField::new(0).get(center - 6) % 11; - Some(if c < 8 { - let c = c as u8 * 10 + 120; - Block::new(BlockKind::Rock, Rgb::new(c, c, c)) - } else { - Block::air(SpriteKind::GlassBarrier) - }) - })); - // glass barriers with center clearance for dagon - painter - .cylinder(Aabb { - min: (center - 9).with_z(base - (2 * (diameter / 3)) + 10), - max: (center + 9).with_z(base - (2 * (diameter / 3)) + 16), - }) - .fill(glass_barrier.clone()); - painter - .cylinder(Aabb { - min: (center - 9).with_z(base - (2 * (diameter / 3)) + 13), - max: (center + 9).with_z(base - (2 * (diameter / 3)) + 14), - }) - .without(painter.cylinder(Aabb { - min: (center - 8).with_z(base - (2 * (diameter / 3)) + 13), - max: (center + 8).with_z(base - (2 * (diameter / 3)) + 14), - })) - .fill(exit); - painter - .cylinder(Aabb { - min: (center - 8).with_z(base - (2 * (diameter / 3)) + 14), - max: (center + 8).with_z(base - (2 * (diameter / 3)) + 16), - }) - .fill(white_coral.clone()); - painter - .cylinder(Aabb { - min: (center - 9).with_z(base - (2 * (diameter / 3)) + 16), - max: (center + 9).with_z(base - (2 * (diameter / 3)) + 18), - }) - .fill(sea_urchins); - painter - .cylinder(Aabb { - min: (center - 8).with_z(base - (2 * (diameter / 3)) + 16), - max: (center + 8).with_z(base - (2 * (diameter / 3)) + 18), - }) - .clear(); - painter - .cylinder(Aabb { - min: (center - 8).with_z(base - (2 * (diameter / 3)) + 10), - max: (center + 8).with_z(base - (2 * (diameter / 3)) + 14), - }) - .fill(white_coral); - let cellar_miniboss_pos = center.with_z(base - (2 * (diameter / 3)) + 17); - painter.spawn( - EntityInfo::at(cellar_miniboss_pos.as_()) - .with_asset_expect("common.entity.dungeon.sea_chapel.dagon", &mut rng), - ); - // cellar 2 sea crocodiles - let cellar_sea_croc_pos = (center - 12).with_z(base - (2 * (diameter / 3)) + 8); - for _ in 0..(3 + ((RandomField::new(0).get((cellar_sea_croc_pos).with_z(base))) % 5)) { - painter.spawn( - EntityInfo::at(cellar_sea_croc_pos.as_()) - .with_asset_expect("common.entity.wild.aggressive.sea_crocodile", &mut rng), - ) - } - // water basin - painter - .sphere(Aabb { - min: (center - diameter + (diameter / 5) + 1).with_z(base - (4 * diameter / 3)), - max: (center + diameter - (diameter / 5) - 1).with_z(base + 1), - }) - .without(painter.cylinder(Aabb { - min: (center - diameter + (diameter / 5) + 1).with_z(base - (2 * diameter / 3) + 1), - max: (center + diameter - (diameter / 5) - 1).with_z(base + 1), - })) - .fill(white.clone()); - painter - .sphere(Aabb { - min: (center - diameter + (diameter / 5) + 2).with_z(base - (4 * diameter / 3) + 1), - max: (center + diameter - (diameter / 5) - 2).with_z(base + 1), - }) - .without(painter.cylinder(Aabb { - min: (center - diameter + (diameter / 5) + 2).with_z(base - (2 * diameter / 3) + 1), - max: (center + diameter - (diameter / 5) - 2).with_z(base + 1), - })) - .fill(water.clone()); - // stairway1 bottom - painter - .sphere(Aabb { - min: (center_s1 - (diameter / 4)) - .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 2)), - max: (center_s1 + (diameter / 4)).with_z(base - (2 * (diameter / 3)) + 3), - }) - .fill(white.clone()); - // stairway1 bottom gold ring - painter - .cylinder(Aabb { - min: (center_s1 - (diameter / 4)) - .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 4)), - max: (center_s1 + (diameter / 4)) - .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 4) + 1), - }) - .fill(gold.clone()); - painter - .sphere(Aabb { - min: (center_s1 - (diameter / 4) + 1) - .with_z(base - (2 * (diameter / 3)) + 4 - (diameter / 2)), - max: (center_s1 + (diameter / 4) - 1).with_z(base - (2 * (diameter / 3)) + 2), - }) - .clear(); - // stairway1 bottom clear entry - painter - .cylinder(Aabb { - min: Vec3::new( - center_s1.x - 5, - center_s1.y - 5, - base - (2 * (diameter / 3)) + 1, - ), - max: Vec3::new( - center_s1.x + 5, - center_s1.y + 5, - base - (2 * (diameter / 3)) + 2, - ), - }) - .clear(); - // stairway1 bottom window to basin - painter - .cylinder(Aabb { - min: Vec3::new( - center_s1.x - 4, - center_s1.y - 4, - base - (2 * (diameter / 3)) + 4 - (diameter / 2), - ), - max: Vec3::new( - center_s1.x + 4, - center_s1.y + 4, - base - (2 * (diameter / 3)) + 5 - (diameter / 2), - ), - }) - .fill(window_hor); - // stairway1 tube - painter - .cylinder(Aabb { - min: Vec3::new( - center_s1.x - 5, - center_s1.y - 5, - base - (2 * (diameter / 3)) + 1, - ), - max: Vec3::new( - center_s1.x + 5, - center_s1.y + 5, - base - (diameter / 8) + diameter - (diameter / 8), - ), - }) - .fill(white.clone()); - - painter - .cylinder(Aabb { - min: Vec3::new( - center_s1.x - 4, - center_s1.y - 4, - base - (2 * (diameter / 3)) + 1, - ), - max: Vec3::new( - center_s1.x + 4, - center_s1.y + 4, - base - (diameter / 8) + diameter - (diameter / 8), - ), - }) - .clear(); - // stairway1 tube window1 - painter - .aabb(Aabb { - min: Vec3::new(center_s1.x - 5, center_s1.y - 1, base + (diameter / 6)), - max: Vec3::new( - center_s1.x - 4, - center_s1.y + 1, - base - (diameter / 8) + diameter - (diameter / 4) + 1, - ), - }) - .fill(window_ver2.clone()); - - // stairway1 stairs - let stair_radius1 = 4.5; - let stairs_clear1 = painter.cylinder(Aabb { - min: (center_s1 - stair_radius1 as i32) - .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 2)), - max: (center_s1 + stair_radius1 as i32) - .with_z(base - (diameter / 8) + diameter - (diameter / 8)), - }); - stairs_clear1 - .sample(spiral_staircase( - center_s1.with_z(base - (diameter / 8) + diameter - (diameter / 8)), - stair_radius1, - 0.5, - 7.0, - )) - .fill(white.clone()); - // coral chest podium - painter - .aabb(Aabb { - min: Vec3::new( - center_s1.x, - center_s1.y - 2, - base - (2 * (diameter / 3)) - (diameter / 2) + 12, - ), - max: Vec3::new( - center_s1.x + 1, - center_s1.y - 1, - base - (2 * (diameter / 3)) - (diameter / 2) + 13, - ), - }) - .fill(gold_decor.clone()); - // coral chest - painter.rotated_sprite( - Vec3::new( - center_s1.x, - center_s1.y - 2, - base - (2 * (diameter / 3)) - (diameter / 2) + 13, - ), - SpriteKind::CoralChest, - 2, - ); - // cardinals room next to stairway1 bottom - let cr_center = Vec2::new(center.x - diameter - 3, center.y - (diameter / 5) + 1); - painter - .cylinder(Aabb { - min: (cr_center - (diameter / 3)) - .with_z(base - (2 * (diameter / 3)) - (diameter / 4) - 5), - max: (cr_center + (diameter / 3)).with_z(base - (2 * (diameter / 3)) + 3), - }) - .fill(white.clone()); - // cardinals room gold ring - painter - .cylinder(Aabb { - min: (cr_center - (diameter / 3)) - .with_z(base - (2 * (diameter / 3)) - (diameter / 4) + 3), - max: (cr_center + (diameter / 3)) - .with_z(base - (2 * (diameter / 3)) - (diameter / 4) + 4), - }) - .fill(gold.clone()); - // clear cardinals room - painter - .cylinder(Aabb { - min: (cr_center - (diameter / 3) + 1) - .with_z(base - (2 * (diameter / 3)) - (diameter / 4) - 4), - max: (cr_center + (diameter / 3) - 1).with_z(base - (2 * (diameter / 3)) + 2), - }) - .clear(); - // Cardinals room chamber mobile1 - painter - .cone(Aabb { - min: (cr_center - 2).with_z(base - (2 * (diameter / 3)) - 7), - max: (cr_center + 3).with_z(base - (2 * (diameter / 3)) - 5), - }) - .fill(top.clone()); - painter - .cylinder(Aabb { - min: (cr_center - 2).with_z(base - (2 * (diameter / 3)) - 8), - max: (cr_center + 3).with_z(base - (2 * (diameter / 3)) - 7), - }) - .fill(gold_decor.clone()); - painter - .aabb(Aabb { - min: (cr_center - 1).with_z(base - (2 * (diameter / 3)) - 8), - max: (cr_center + 2).with_z(base - (2 * (diameter / 3)) - 7), - }) - .clear(); - // Cardinals room mobile1 chain - painter - .aabb(Aabb { - min: cr_center.with_z(base - (2 * (diameter / 3)) - 5), - max: (cr_center + 1).with_z(base - (2 * (diameter / 3)) + 2), - }) - .fill(gold_chain.clone()); - // passage from stairway1 bottom to cardinals room - painter - .aabb(Aabb { - min: Vec3::new( - cr_center.x + (diameter / 3), - cr_center.y - 3, - base - (2 * (diameter / 3)) - (diameter / 4), - ), - max: Vec3::new( - cr_center.x + (diameter / 3) + 5, - cr_center.y + 3, - base - (2 * (diameter / 3)) - (diameter / 4) + 5, - ), - }) - .fill(white.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - cr_center.x + (diameter / 3), - cr_center.y - 2, - base - (2 * (diameter / 3)) - (diameter / 4) - 1, - ), - max: Vec3::new( - cr_center.x + (diameter / 3) + 5, - cr_center.y + 2, - base - (2 * (diameter / 3)) - (diameter / 4) + 6, - ), - }) - .fill(white.clone()); - // passage from stairway1 bottom to cardinals room gold stripes - painter - .aabb(Aabb { - min: Vec3::new( - cr_center.x + (diameter / 3), - cr_center.y - 3, - base - (2 * (diameter / 3)) - (diameter / 4) + 3, - ), - max: Vec3::new( - cr_center.x + (diameter / 3) + 5, - cr_center.y + 3, - base - (2 * (diameter / 3)) - (diameter / 4) + 4, - ), - }) - .fill(gold.clone()); - // clear passage from stairway1 bottom to cardinals room - painter - .aabb(Aabb { - min: Vec3::new( - cr_center.x + (diameter / 3) - 1, - cr_center.y - 2, - base - (2 * (diameter / 3)) - (diameter / 4) + 2, - ), - max: Vec3::new( - cr_center.x + (diameter / 3) + 6, - cr_center.y + 2, - base - (2 * (diameter / 3)) - (diameter / 4) + 5, - ), - }) - .clear(); - // Cardinals room Sea Clerics - let cr_sea_clerics_pos = - (cr_center - 2).with_z(base - (2 * (diameter / 3)) - (diameter / 4) - 4); - for _ in 0..(2 + ((RandomField::new(0).get((fl2_sea_clerics_pos).with_z(base))) % 3)) { - painter.spawn( - EntityInfo::at(cr_sea_clerics_pos.as_()) - .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), - ) - } - // Cardinal - let cr_cardinal_pos = - (cr_center + 2).with_z(base - (2 * (diameter / 3)) - (diameter / 4) - 4); - painter.spawn( - EntityInfo::at(cr_cardinal_pos.as_()) - .with_asset_expect("common.entity.dungeon.sea_chapel.cardinal", &mut rng), - ); - // stairway2 bottom - painter - .sphere(Aabb { - min: (center_s2 - (diameter / 4)) - .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 2)), - max: (center_s2 + (diameter / 4)).with_z(base - (2 * (diameter / 3)) + 3), - }) - .fill(white.clone()); - // stairway2 bottom gold ring - painter - .cylinder(Aabb { - min: (center_s2 - (diameter / 4)) - .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 4)), - max: (center_s2 + (diameter / 4)) - .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 4) + 1), - }) - .fill(gold.clone()); - painter - .sphere(Aabb { - min: (center_s2 - (diameter / 4) + 1) - .with_z(base - (2 * (diameter / 3)) + 4 - (diameter / 2)), - max: (center_s2 + (diameter / 4) - 1).with_z(base - (2 * (diameter / 3)) + 2), - }) - .fill(water.clone()); - // stairway2 bottom clear entry - painter - .cylinder(Aabb { - min: Vec3::new( - center_s2.x - 5, - center_s2.y - 5, - base - (2 * (diameter / 3)) + 1, - ), - max: Vec3::new( - center_s2.x + 5, - center_s2.y + 5, - base - (2 * (diameter / 3)) + 2, - ), - }) - .clear(); - // stairway2 bottom water to basin - painter - .cylinder(Aabb { - min: Vec3::new( - center_s2.x - 4, - center_s2.y - 4, - base - (2 * (diameter / 3)) + 4 - (diameter / 2), - ), - max: Vec3::new( - center_s2.x + 4, - center_s2.y + 4, - base - (2 * (diameter / 3)) + 5 - (diameter / 2), - ), - }) - .fill(water.clone()); - // stairway2 tube - painter - .cylinder(Aabb { - min: Vec3::new( - center_s2.x - 5, - center_s2.y - 5, - base - (2 * (diameter / 3)) + 1, - ), - max: Vec3::new( - center_s2.x + 5, - center_s2.y + 5, - base - (diameter / 8) + diameter + 2, - ), - }) - .fill(white.clone()); - painter - .cylinder(Aabb { - min: Vec3::new( - center_s2.x - 4, - center_s2.y - 4, - base - (2 * (diameter / 3)) + 1, - ), - max: Vec3::new( - center_s2.x + 4, - center_s2.y + 4, - base - (diameter / 8) + diameter + 1, - ), - }) - .clear(); - painter - .cylinder(Aabb { - min: Vec3::new( - center_s2.x - 3, - center_s2.y - 3, - base - (diameter / 8) + diameter + 1, - ), - max: Vec3::new( - center_s2.x + 3, - center_s2.y + 3, - base - (diameter / 8) + diameter + 2, - ), - }) - .clear(); - // stairway2 tube window1 - painter - .aabb(Aabb { - min: Vec3::new( - center_s2.x + 4, - center_s2.y - 1, - base + (diameter / 8) + (diameter / 2), - ), - max: Vec3::new( - center_s2.x + 5, - center_s2.y + 1, - base - (diameter / 8) + diameter - 4, - ), - }) - .fill(window_ver2.clone()); - // chest - painter.rotated_sprite( - Vec3::new( - center_s2.x - 5, - center_s2.y - 4, - base - (2 * (diameter / 3)) - (diameter / 2) + 11, - ), - SpriteKind::DungeonChest1, - 2, - ); - // bottom 2 sea crocodiles - let bt_sea_croc_pos = center_s2.with_z(base - (2 * (diameter / 3)) - (diameter / 2) + 11); - for _ in 0..(2 + ((RandomField::new(0).get((bt_sea_croc_pos).with_z(base))) % 3)) { - painter.spawn( - EntityInfo::at(bt_sea_croc_pos.as_()) - .with_asset_expect("common.entity.wild.aggressive.sea_crocodile", &mut rng), - ) - } - // underwater chamber - painter - .sphere(Aabb { - min: (center - (diameter / 3)).with_z(base - (4 * diameter / 3) - (diameter / 6)), - max: (center + (diameter / 3)).with_z(base - (2 * diameter / 3) - (diameter / 6)), - }) - .without( - painter.sphere(Aabb { - min: (center - (diameter / 3) + 1) - .with_z(base - (4 * diameter / 3) - (diameter / 6) + 1), - max: (center + (diameter / 3) - 1) - .with_z(base - (2 * diameter / 3) - (diameter / 6) - 1), - }), - ) - .fill(white.clone()); - // underwater chamber entries - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 3), - center.y - 2, - base - (3 * diameter / 3) - (diameter / 3) + 1, - ), - max: Vec3::new( - center.x + (diameter / 3), - center.y + 2, - base - (3 * diameter / 3) - (diameter / 6) - 2, - ), - }) - .fill(water.clone()); - // underwater chamber entries - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 3), - center.y - 1, - base - (3 * diameter / 3) - (diameter / 6) - 2, - ), - max: Vec3::new( - center.x + (diameter / 3), - center.y + 1, - base - (3 * diameter / 3) - (diameter / 6) - 1, - ), - }) - .fill(water.clone()); - // underwater chamber gold ring white floor - painter - .cylinder(Aabb { - min: (center - (diameter / 3)).with_z(base - (3 * diameter / 3) - (diameter / 6)), - max: (center + (diameter / 3)) - .with_z(base - (3 * diameter / 3) - (diameter / 6) + 1), - }) - .fill(gold.clone()); - painter - .cylinder(Aabb { - min: (center - (diameter / 3) + 1) - .with_z(base - (3 * diameter / 3) - (diameter / 6)), - max: (center + (diameter / 3) - 1) - .with_z(base - (3 * diameter / 3) - (diameter / 6) + 1), - }) - .fill(white.clone()); - // underwater chamber floor entry - painter - .cylinder(Aabb { - min: (center - 2).with_z(base - (3 * diameter / 3) - (diameter / 6)), - max: (center + 2).with_z(base - (3 * diameter / 3) - (diameter / 6) + 1), - }) - .fill(water.clone()); - // fill underwater chamber halfway with air - painter - .sphere(Aabb { - min: (center - (diameter / 3) + 1) - .with_z(base - (4 * diameter / 3) - (diameter / 6) + 1), - max: (center + (diameter / 3) - 1) - .with_z(base - (2 * diameter / 3) - (diameter / 6) - 1), - }) - .without( - painter.cylinder(Aabb { - min: (center - (diameter / 3) + 1) - .with_z(base - (4 * diameter / 3) - (diameter / 6) + 1), - max: (center + (diameter / 3) - 1) - .with_z(base - (3 * diameter / 3) - (diameter / 6) + 1), - }), - ) - .clear(); - // chapel underwater chamber mobile1 - painter - .cone(Aabb { - min: (center - 2).with_z(base - (2 * diameter / 3) - (diameter / 6) - 7), - max: (center + 3).with_z(base - (2 * diameter / 3) - (diameter / 6) - 5), - }) - .fill(top.clone()); - painter - .cylinder(Aabb { - min: (center - 2).with_z(base - (2 * diameter / 3) - (diameter / 6) - 8), - max: (center + 3).with_z(base - (2 * diameter / 3) - (diameter / 6) - 7), - }) - .fill(gold_decor.clone()); - painter - .aabb(Aabb { - min: (center - 1).with_z(base - (2 * diameter / 3) - (diameter / 6) - 8), - max: (center + 2).with_z(base - (2 * diameter / 3) - (diameter / 6) - 7), - }) - .clear(); - // chapel underwater chamber mobile1 chain - painter - .aabb(Aabb { - min: center.with_z(base - (2 * diameter / 3) - (diameter / 6) - 5), - max: (center + 1).with_z(base - (2 * diameter / 3) - (diameter / 6) - 1), - }) - .fill(gold_chain); - // underwater chamber coral chest - painter - .cylinder(Aabb { - min: (center - (diameter / 6) - 1) - .with_z(base - (3 * diameter / 3) - (diameter / 6) + 1), - max: (center - (diameter / 6) + 3) - .with_z(base - (3 * diameter / 3) - (diameter / 6) + 2), - }) - .fill(gold_decor.clone()); - painter - .aabb(Aabb { - min: (center - (diameter / 6)) - .with_z(base - (3 * diameter / 3) - (diameter / 6) + 1), - max: (center - (diameter / 6) + 2) - .with_z(base - (3 * diameter / 3) - (diameter / 6) + 2), - }) - .fill(white.clone()); - // coral chest - painter.rotated_sprite( - (center - (diameter / 6)).with_z(base - (3 * diameter / 3) - (diameter / 6) + 2), - SpriteKind::CoralChest, - 2, - ); - // underwater chamber sea crocodiles & sea clerics - let uwc_sea_croc_pos = - (center + (diameter / 8)).with_z(base - (3 * diameter / 3) - (diameter / 6) + 2); - for _ in 0..(3 + ((RandomField::new(0).get((uwc_sea_croc_pos).with_z(base))) % 5)) { - painter.spawn( - EntityInfo::at(uwc_sea_croc_pos.as_()) - .with_asset_expect("common.entity.wild.aggressive.sea_crocodile", &mut rng), - ) - } - let uwc_sea_clerics_pos = - (center + (diameter / 7)).with_z(base - (3 * diameter / 3) - (diameter / 6) + 2); - for _ in 0..(2 + ((RandomField::new(0).get((uwc_sea_clerics_pos).with_z(base))) % 2)) { - painter.spawn( - EntityInfo::at(uwc_sea_clerics_pos.as_()) - .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), - ); - } - // Holding Cell2 - painter - .sphere(Aabb { - min: Vec3::new( - center.x - (diameter / 2) - (diameter / 8), - center.y + (diameter / 16), - base - (diameter / 8), - ), - max: Vec3::new( - center.x - (diameter / 2) + (diameter / 8), - center.y + (diameter / 16) + (diameter / 4), - base - (diameter / 8) + (diameter / 4), - ), - }) - .fill(white.clone()); - painter - .sphere(Aabb { - min: Vec3::new( - center.x - (diameter / 2) - (diameter / 8) + 1, - center.y + (diameter / 16) - 1, - base - (diameter / 8) + 1, - ), - max: Vec3::new( - center.x - (diameter / 2) + (diameter / 8) - 1, - center.y + (diameter / 16) + (diameter / 4) + 1, - base - (diameter / 8) + (diameter / 4) - 1, - ), - }) - .clear(); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 2) - (diameter / 8) - 3, - center.y + (diameter / 16) + (diameter / 8) - 1, - base - (diameter / 8) + (diameter / 16) + 2, - ), - max: Vec3::new( - center.x - (diameter / 2) - (diameter / 8) + 1, - center.y + (diameter / 16) + (diameter / 4) - (diameter / 8) + 1, - base - (diameter / 8) + (diameter / 4) - (diameter / 16) - 2, - ), - }) - .clear(); - painter.sprite( - Vec3::new( - center.x - (diameter / 2) - (diameter / 16) + 4, - center.y + (diameter / 6) - 1, - base - (diameter / 8) + (diameter / 16) - 1, - ), - SpriteKind::DungeonChest1, - ); - // Holding Cell2 glass barriers - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 2) - (diameter / 8), - center.y + (diameter / 16) + (diameter / 8) - 1, - base - (diameter / 8) + (diameter / 16) + 3, - ), - max: Vec3::new( - center.x - (diameter / 2) - (diameter / 8) + 1, - center.y + (diameter / 16) + (diameter / 4) - (diameter / 8) + 1, - base - (diameter / 8) + (diameter / 4) - (diameter / 16) - 3, - ), - }) - .fill(glass_barrier.clone()); - // Holding Cell3 - painter - .sphere(Aabb { - min: Vec3::new( - center.x + (diameter / 2) - (diameter / 8), - center.y - (diameter / 4) - (diameter / 16), - base - (diameter / 8), - ), - max: Vec3::new( - center.x + (diameter / 2) + (diameter / 8), - center.y - (diameter / 16), - base - (diameter / 8) + (diameter / 4), - ), - }) - .fill(white.clone()); - painter - .sphere(Aabb { - min: Vec3::new( - center.x + (diameter / 2) - (diameter / 8) + 1, - center.y - (diameter / 4) - (diameter / 16) + 1, - base - (diameter / 8) + 1, - ), - max: Vec3::new( - center.x + (diameter / 2) + (diameter / 8) - 1, - center.y - (diameter / 16) - 1, - base - (diameter / 8) + (diameter / 4) - 1, - ), - }) - .clear(); - painter - .aabb(Aabb { - min: Vec3::new( - center.x + (diameter / 2) + (diameter / 8) - 1, - center.y - (diameter / 4) - (diameter / 16) + (diameter / 8) - 1, - base - (diameter / 8) + (diameter / 16) + 2, - ), - max: Vec3::new( - center.x + (diameter / 2) + (diameter / 8) + 3, - center.y - (diameter / 16) - (diameter / 8) + 1, - base - (diameter / 8) + (diameter / 4) - (diameter / 16) - 2, - ), - }) - .clear(); - painter.sprite( - Vec3::new( - center.x + (diameter / 2), - center.y - (diameter / 8) - (diameter / 16), - base - (diameter / 8) + 2, - ), - SpriteKind::DungeonChest1, - ); - // Holding Cell3 glass barriers - painter - .aabb(Aabb { - min: Vec3::new( - center.x + (diameter / 2) + (diameter / 8) - 1, - center.y - (diameter / 4) - (diameter / 16) + (diameter / 8) - 1, - base - (diameter / 8) + (diameter / 16) + 3, - ), - max: Vec3::new( - center.x + (diameter / 2) + (diameter / 8), - center.y - (diameter / 16) - (diameter / 8) + 1, - base - (diameter / 8) + (diameter / 16) + 4, - ), - }) - .fill(glass_barrier.clone()); - // Holding Cell1 - painter - .sphere(Aabb { - min: Vec3::new( - center.x - (diameter / 4), - center.y - (diameter / 2) - (diameter / 4), - base - (diameter / 4), - ), - max: Vec3::new( - center.x + (diameter / 4), - center.y - (diameter / 2) + (diameter / 4), - base - (diameter / 4) + (diameter / 2), - ), - }) - .fill(white.clone()); - painter - .sphere(Aabb { - min: Vec3::new( - center.x - (diameter / 4) + 1, - center.y - (diameter / 2) - (diameter / 4) + 1, - base - (diameter / 4) + 1, - ), - max: Vec3::new( - center.x + (diameter / 4 - 1), - center.y - (diameter / 2) + (diameter / 4) - 1, - base - (diameter / 4) + (diameter / 2) - 1, - ), - }) - .without(painter.cylinder(Aabb { - min: Vec3::new( - center.x - (diameter / 4) + 1, - center.y - (diameter / 2) - (diameter / 4) + 1, - base - (diameter / 4) + 1, - ), - max: Vec3::new( - center.x + (diameter / 4 - 1), - center.y - (diameter / 2) + (diameter / 4) - 1, - base - 1, - ), - })) - .clear(); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 16), - center.y - (diameter / 2) - (diameter / 4) - 3, - base, - ), - max: Vec3::new( - center.x + (diameter / 16), - center.y - (diameter / 2) - (diameter / 4) + 1, - base + 3, - ), - }) - .clear(); - // Holding Cell1 windows - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 16), - center.y - (diameter / 2) - (diameter / 4), - base, - ), - max: Vec3::new( - center.x + (diameter / 16), - center.y - (diameter / 2) - (diameter / 4) + 1, - base + 3, - ), - }) - .fill(gold_decor.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 16) + 1, - center.y - (diameter / 2) - (diameter / 4), - base + 1, - ), - max: Vec3::new( - center.x + (diameter / 16) - 1, - center.y - (diameter / 2) - (diameter / 4) + 1, - base + 2, - ), - }) - .fill(window_ver.clone()); - // chapel main room pulpit stairs1 - painter - .ramp_inset( - Aabb { - min: Vec3::new(center.x - 8, center.y - (diameter / 4) - 2, base - 3), - max: Vec3::new(center.x - 3, center.y - (diameter / 4) + 7, base + 2), - }, - 5, - Dir::X, - ) - .fill(white.clone()); - // chapel main room pulpit stairs2 - painter - .ramp_inset( - Aabb { - min: Vec3::new(center.x + 3, center.y - (diameter / 4) - 2, base - 3), - max: Vec3::new(center.x + 8, center.y - (diameter / 4) + 7, base + 2), - }, - 5, - Dir::NegX, - ) - .fill(white.clone()); - // chapel main room pulpit stairs2 - painter - .ramp_inset( - Aabb { - min: Vec3::new(center.x - 8, center.y + (diameter / 4) - 7, base - 3), - max: Vec3::new(center.x - 3, center.y + (diameter / 4) + 2, base + 2), - }, - 5, - Dir::X, - ) - .fill(white.clone()); - // chapel main room pulpit stairs4 - painter - .ramp_inset( - Aabb { - min: Vec3::new(center.x + 3, center.y + (diameter / 4) - 7, base - 3), - max: Vec3::new(center.x + 8, center.y + (diameter / 4) + 2, base + 2), - }, - 5, - Dir::NegX, - ) - .fill(white.clone()); - // Holding Cell1 passage to main room - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 16), - center.y - (diameter / 3) + 3, - base - 4, - ), - max: Vec3::new( - center.x + (diameter / 16), - center.y - (diameter / 20) - 1, - base + 3, - ), - }) - .fill(white.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 16) + 1, - center.y - (diameter / 3) + 3, - base - 3, - ), - max: Vec3::new( - center.x + (diameter / 16) - 1, - center.y - (diameter / 20) - 1, - base, - ), - }) - .clear(); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 16) + 1, - center.y - (diameter / 3), - base - 2, - ), - max: Vec3::new( - center.x + (diameter / 16) - 1, - center.y - (diameter / 20) - 1, - base, - ), - }) - .clear(); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 16) + 2, - center.y - (diameter / 3) + 3, - base, - ), - max: Vec3::new( - center.x + (diameter / 16) - 2, - center.y - (diameter / 20) - 1, - base + 1, - ), - }) - .clear(); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 16) + 1, - center.y - (diameter / 3) + 3, - base - 3, - ), - max: Vec3::new( - center.x + (diameter / 16) - 1, - center.y - (diameter / 3) + 4, - base + 1, - ), - }) - .fill(gold_decor.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 16) + 2, - center.y - (diameter / 3) + 3, - base - 2, - ), - max: Vec3::new( - center.x + (diameter / 16) - 2, - center.y - (diameter / 3) + 4, - base, - ), - }) - .fill(window_ver.clone()); - // holding cell1 coral chest - painter - .aabb(Aabb { - min: Vec3::new( - center.x, - center.y - (diameter / 2) - (diameter / 4) + 7, - base - 1, - ), - max: Vec3::new( - center.x + 1, - center.y - (diameter / 2) - (diameter / 4) + 8, - base, - ), - }) - .fill(gold_decor.clone()); - painter.rotated_sprite( - Vec3::new( - center.x, - center.y - (diameter / 2) - (diameter / 4) + 7, - base, - ), - SpriteKind::CoralChest, - 0, - ); - - // Holding Cell1 Sea Clerics - let hc1_sea_clerics_pos = Vec3::new(center.x, center.y - (diameter / 3), base + 3); - for _ in 0..(3 + ((RandomField::new(0).get((hc1_sea_clerics_pos).with_z(base))) % 3)) { - painter.spawn( - EntityInfo::at(hc1_sea_clerics_pos.as_()) - .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), - ); - } - // Holding Cell - painter - .sphere(Aabb { - min: Vec3::new( - center.x - (diameter / 4), - center.y + (diameter / 2) - (diameter / 4), - base - (diameter / 4), - ), - max: Vec3::new( - center.x + (diameter / 4), - center.y + (diameter / 2) + (diameter / 4), - base - (diameter / 4) + (diameter / 2), - ), - }) - .fill(white.clone()); - painter - .sphere(Aabb { - min: Vec3::new( - center.x - (diameter / 4) + 1, - center.y + (diameter / 2) - (diameter / 4) + 1, - base - (diameter / 4) + 1, - ), - max: Vec3::new( - center.x + (diameter / 4 - 1), - center.y + (diameter / 2) + (diameter / 4) - 1, - base - (diameter / 4) + (diameter / 2) - 1, - ), - }) - .without(painter.cylinder(Aabb { - min: Vec3::new( - center.x - (diameter / 4) + 1, - center.y + (diameter / 2) - (diameter / 4) + 1, - base - (diameter / 4) + 1, - ), - max: Vec3::new( - center.x + (diameter / 4 - 1), - center.y + (diameter / 2) + (diameter / 4) - 1, - base - 1, - ), - })) - .clear(); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 16), - center.y + (diameter / 2) + (diameter / 4) - 1, - base, - ), - max: Vec3::new( - center.x + (diameter / 16), - center.y + (diameter / 2) + (diameter / 4) + 3, - base + 3, - ), - }) - .clear(); - // Holding Cell glass barriers - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 16), - center.y + (diameter / 2) + (diameter / 4) - 2, - base + 1, - ), - max: Vec3::new( - center.x + (diameter / 16), - center.y + (diameter / 2) + (diameter / 4) - 1, - base + 2, - ), - }) - .fill(glass_barrier.clone()); - // Holding Cell passage to main room - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 16), - center.y + (diameter / 20) + 1, - base - 4, - ), - max: Vec3::new( - center.x + (diameter / 16), - center.y + (diameter / 3) - 3, - base + 3, - ), - }) - .fill(white.clone()); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 16) + 1, - center.y + (diameter / 20) + 1, - base - 3, - ), - max: Vec3::new( - center.x + (diameter / 16) - 1, - center.y + (diameter / 3) - 3, - base, - ), - }) - .clear(); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 16) + 1, - center.y + (diameter / 20) + 1, - base - 2, - ), - max: Vec3::new( - center.x + (diameter / 16) - 1, - center.y + (diameter / 3) - 1, - base, - ), - }) - .clear(); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 16) + 2, - center.y + (diameter / 20) + 1, - base, - ), - max: Vec3::new( - center.x + (diameter / 16) - 2, - center.y + (diameter / 3) - 3, - base + 1, - ), - }) - .clear(); - painter - .aabb(Aabb { - min: Vec3::new( - center.x - (diameter / 16) + 1, - center.y + (diameter / 3) - 4, - base - 1, - ), - max: Vec3::new( - center.x + (diameter / 16) - 1, - center.y + (diameter / 3) - 3, - base, - ), - }) - .fill(glass_barrier.clone()); - // stairway3 tube - painter - .cylinder(Aabb { - min: Vec3::new(center_s3.x - 5, center_s3.y - 5, base + (diameter / 4)), - max: Vec3::new( - center_s3.x + 5, - center_s3.y + 5, - base - (diameter / 8) + (diameter / 2) + 2, - ), - }) - .fill(white.clone()); - - painter - .cylinder(Aabb { - min: Vec3::new(center_s3.x - 4, center_s3.y - 4, base + 2), - max: Vec3::new( - center_s3.x + 4, - center_s3.y + 4, - base - (diameter / 8) + (diameter / 2) + 2, - ), - }) - .clear(); - // stairway3 tube window1 - painter - .aabb(Aabb { - min: Vec3::new(center_s3.x - 1, center_s3.y - 5, base + (diameter / 4) + 1), - max: Vec3::new( - center_s3.x + 1, - center_s3.y - 4, + center.y - (diameter / 2), base - (diameter / 8) + (diameter / 2) - 2, ), }) .fill(window_ver.clone()); - - // stairway3 stairs - let stair_radius3 = 4.5; - let stairs_clear3 = painter.cylinder(Aabb { - min: (center_s3 - stair_radius3 as i32).with_z(base - 1), - max: (center_s3 + stair_radius3 as i32) - .with_z(base - (diameter / 8) + (diameter / 2) + 2), - }); - stairs_clear3 - .sample(spiral_staircase( - center_s3.with_z(base - (diameter / 8) + (diameter / 2) + 2), - stair_radius3, - 0.5, - 7.0, - )) - .fill(white.clone()); - // stairway4 - let center_s4 = Vec2::new(center.x + (diameter / 2) + 2, center.y + (diameter / 8)); - // stairway4 balcony2 entry painter - .cylinder(Aabb { - min: (center_s4 - 2).with_z(base - (diameter / 8) + (diameter / 2) - 7), - max: (center_s4 + 3).with_z(base - (diameter / 8) + (diameter / 2) - 5), + .aabb(Aabb { + min: Vec3::new( + center.x - 2, + center.y - (diameter / 2) + 1, + base - (diameter / 8) + (diameter / 2) - 4, + ), + max: Vec3::new( + center.x + 2, + center.y - (diameter / 2), + base - (diameter / 8) + (diameter / 2) - 3, + ), }) - .clear(); - // stairway4 stairs - let stair_radius4 = 3.0; - let stairs_clear4 = painter.cylinder(Aabb { - min: (center_s4 - stair_radius4 as i32).with_z(base - (diameter / 8) - 4), - max: (center_s4 + stair_radius4 as i32) - .with_z(base - (diameter / 8) + (diameter / 2) - 4), - }); - stairs_clear4 - .sample(spiral_staircase( - center_s4.with_z(base - (diameter / 8) + (diameter / 2) - 4), - stair_radius4, - 0.5, - 7.0, - )) - .fill(white.clone()); - // entry lanterns - for dir in SQUARE_4 { - let sq_corner = Vec2::new(center.x - (diameter / 2) + 3, center.y - 5); - let pos = Vec3::new( - sq_corner.x + (dir.x * (diameter - 7)), - sq_corner.y + (dir.y * 9), - base + 5, + .fill(window_ver.clone()); + + // main room hanging emblem + painter.rotated_sprite( + center.with_z(base + (diameter / 4)), + SpriteKind::SeaDecorEmblem, + 2_u8, + ); + painter + .aabb(Aabb { + min: Vec3::new(center.x, center.y, base + (diameter / 4) + 1), + max: Vec3::new( + center.x + 1, + center.y + 1, + base - (diameter / 8) + diameter - 7, + ), + }) + .fill(gold_chain.clone()); + + for n in 1..=tubes as i32 { + let pos = Vec2::new( + center.x + (radius as f32 * ((n as f32 * phi).cos())) as i32, + center.y + (radius as f32 * ((n as f32 * phi).sin())) as i32, ); - painter.sprite(pos, SpriteKind::SeashellLantern); - } - // main room lanterns - for dir in SQUARE_4 { - let sq_corner = Vec2::new(center.x - 4, center.y - (diameter / 2) + 5); - let pos = Vec3::new( - sq_corner.x + (dir.y * 7), - sq_corner.y + (dir.x * (diameter - 10)), - base + 12, - ); - painter.sprite(pos, SpriteKind::SeashellLantern); - } - // first floor lanterns - for dir in SQUARE_4 { - for d in 0..2 { - let sq_corner = Vec2::new(center.x - 3 - d, center.y - (diameter / 8) - 2 - d); - let pos = Vec3::new( - sq_corner.x + (dir.y * (5 + (2 * d))), - sq_corner.y + (dir.x * ((diameter / 4) + 2 + (2 * d))), - base - (diameter / 8) + (diameter / 2) + 2, - ); - painter.sprite(pos, SpriteKind::SeashellLantern); - } - } - // small floor lanterns - for dir in SQUARE_4 { - for d in 0..2 { - let sq_corner = Vec2::new(center.x - 3 - d, center.y - (diameter / 8) - 2 - d); - let pos = Vec3::new( - sq_corner.x + (dir.y * (5 + (2 * d))), - sq_corner.y + (dir.x * ((diameter / 4) + 2 + (2 * d))), - base + diameter - (diameter / 4) + 1, - ); - painter.sprite(pos, SpriteKind::SeashellLantern); + + let storeys = 2 + (RandomField::new(0).get(pos.with_z(base)) as i32 % 2); + let steps = 7; + for n in 0..2 { + for t in 0..storeys { + let mut points = vec![]; + for s in 0..steps { + let step_pos = Vec2::new( + pos.x + (8_f32 * ((s as f32 * phi).cos())) as i32, + pos.y + (8_f32 * ((s as f32 * phi).sin())) as i32, + ); + points.push(step_pos); + } + if t == (storeys - 1) { + // room + painter + .sphere(Aabb { + min: (points[0] - (diameter / 6)).with_z( + base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6), + ), + + max: (points[0] + (diameter / 6)).with_z( + base + (6 * up) + (t * (steps - 1) * up) + (diameter / 6), + ), + }) + .fill(white.clone()); + + let room_upper_half = painter.aabb(Aabb { + min: (points[0] - (diameter / 6)) + .with_z(base + (6 * up) + (t * (steps - 1) * up)), + max: (points[0] + (diameter / 6)) + .with_z(base + (6 * up) + (t * (steps - 1) * up) + (diameter / 6)), + }); + // room top washed out + painter + .sphere(Aabb { + min: (points[0] - (diameter / 6)).with_z( + base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6), + ), + max: (points[0] + (diameter / 6)).with_z( + base + (6 * up) + (t * (steps - 1) * up) + (diameter / 6), + ), + }) + .intersect(room_upper_half) + .fill(washed.clone()); + // room top + painter + .sphere(Aabb { + min: (points[0] - (diameter / 6) + 1).with_z( + base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6) + 1, + ), + max: (points[0] + (diameter / 6)).with_z( + base + (6 * up) + (t * (steps - 1) * up) + (diameter / 6), + ), + }) + .intersect(room_upper_half) + .fill(top.clone()); + // room gold ring + painter + .cylinder(Aabb { + min: (points[0] - (diameter / 6)) + .with_z(base + (6 * up) + (t * (steps - 1) * up) + 1), + max: (points[0] + (diameter / 6)) + .with_z(base + (6 * up) + (t * (steps - 1) * up) + 2), + }) + .fill(gold.clone()); + // clear room + painter + .sphere(Aabb { + min: (points[0] - (diameter / 6) + 1).with_z( + base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6) + 1, + ), + + max: (points[0] + (diameter / 6) - 1).with_z( + base + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) - 1, + ), + }) + .clear(); + // room windows 1 + painter + .aabb(Aabb { + min: Vec3::new( + points[0].x + (diameter / 6) - 1, + points[0].y - 2, + base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6) + 7, + ), + max: Vec3::new( + points[0].x + (diameter / 6), + points[0].y + 2, + base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6) + 8, + ), + }) + .fill(window_ver2.clone()); + // room windows 2 + painter + .aabb(Aabb { + min: Vec3::new( + points[0].x - 2, + points[0].y + (diameter / 6) - 1, + base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6) + 7, + ), + max: Vec3::new( + points[0].x + 2, + points[0].y + (diameter / 6), + base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6) + 8, + ), + }) + .fill(window_ver.clone()); + // room windows 3 + painter + .aabb(Aabb { + min: Vec3::new( + points[0].x - 2, + points[0].y - (diameter / 6) + 1, + base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6) + 7, + ), + max: Vec3::new( + points[0].x + 2, + points[0].y - (diameter / 6), + base + (6 * up) + (t * (steps - 1) * up) - (diameter / 6) + 8, + ), + }) + .fill(window_ver.clone()); + } + let stairs_decor = painter + .cubic_bezier( + points[0].with_z(base - 4 + (n * 2) + (t * (steps - 1) * up)), + points[1].with_z(base - 4 + (n * 2) + up + (t * (steps - 1) * up)), + points[2] + .with_z(base - 4 + (n * 2) + (2 * up) + (t * (steps - 1) * up)), + points[3] + .with_z(base - 4 + (n * 2) + (3 * up) + (t * (steps - 1) * up)), + 1.0, + ) + .union( + painter.cubic_bezier( + points[3] + .with_z(base - 4 + (n * 2) + (3 * up) + (t * (steps - 1) * up)), + points[4] + .with_z(base - 4 + (n * 2) + (4 * up) + (t * (steps - 1) * up)), + points[5] + .with_z(base - 4 + (n * 2) + (5 * up) + (t * (steps - 1) * up)), + points[0] + .with_z(base - 4 + (n * 2) + (6 * up) + (t * (steps - 1) * up)), + 1.0, + ), + ); + let stairs = painter + .cubic_bezier( + points[0].with_z(base + (n * 2) + (t * (steps - 1) * up)), + points[1].with_z(base + (n * 2) + up + (t * (steps - 1) * up)), + points[2].with_z(base + (n * 2) + (2 * up) + (t * (steps - 1) * up)), + points[3].with_z(base + (n * 2) + (3 * up) + (t * (steps - 1) * up)), + 4.0, + ) + .union(painter.cubic_bezier( + points[3].with_z(base + (n * 2) + (3 * up) + (t * (steps - 1) * up)), + points[4].with_z(base + (n * 2) + (4 * up) + (t * (steps - 1) * up)), + points[5].with_z(base + (n * 2) + (5 * up) + (t * (steps - 1) * up)), + points[0].with_z(base + (n * 2) + (6 * up) + (t * (steps - 1) * up)), + 4.0, + )); + match n { + 0 => { + stairs_decor.fill(gold.clone()); + stairs.fill(white.clone()) + }, + _ => stairs.clear(), + }; + if t == (storeys - 1) { + // room gold decor ring and floor + painter + .cylinder(Aabb { + min: (points[0] - (diameter / 6) + 2) + .with_z(base + (6 * up) + (t * (steps - 1) * up) - 5), + max: (points[0] + (diameter / 6) - 2) + .with_z(base + (6 * up) + (t * (steps - 1) * up) - 4), + }) + .fill(gold_decor.clone()); + painter + .cylinder(Aabb { + min: (points[0] - (diameter / 6) + 3) + .with_z(base + (6 * up) + (t * (steps - 1) * up) - 7), + max: (points[0] + (diameter / 6) - 3) + .with_z(base + (6 * up) + (t * (steps - 1) * up) - 4), + }) + .fill(floor_color.clone()); + // room sprites + painter + .cylinder(Aabb { + min: (points[0] - (diameter / 6) + 3) + .with_z(base + (6 * up) + (t * (steps - 1) * up) - 3), + max: (points[0] + (diameter / 6) - 3) + .with_z(base + (6 * up) + (t * (steps - 1) * up) - 4), + }) + .fill(sprite_fill.clone()); + painter + .cylinder(Aabb { + min: (points[0] - (diameter / 6) + 4) + .with_z(base + (6 * up) + (t * (steps - 1) * up) - 3), + max: (points[0] + (diameter / 6) - 4) + .with_z(base + (6 * up) + (t * (steps - 1) * up) - 4), + }) + .clear(); + // room sea clerics + let room_clerics_pos = + (points[0] + 2).with_z(base + (6 * up) + (t * (steps - 1) * up) - 4); + painter.spawn(EntityInfo::at(room_clerics_pos.as_()).with_asset_expect( + "common.entity.dungeon.sea_chapel.sea_cleric", + &mut rng, + )); + }; + // decor for top rooms + if t == 2 { + let bldg_gold_top1 = Aabb { + min: (points[0] - 2).with_z( + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) - 3, + ), + max: (points[0] + 2).with_z( + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 1, + ), + }; + let bldg_gold_top_pole = Aabb { + min: (points[0] - 1).with_z( + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 1, + ), + max: (points[0] + 1).with_z( + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 7, + ), + }; + let bldg_gold_top_antlers1 = Aabb { + min: Vec3::new( + points[0].x - 2, + points[0].y - 1, + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 1, + ), + max: Vec3::new( + points[0].x + 2, + points[0].y + 1, + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 2, + ), + }; + let bldg_gold_top_antlers2 = painter.aabb(Aabb { + min: Vec3::new( + points[0].x - 3, + points[0].y - 1, + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 2, + ), + + max: Vec3::new( + points[0].x + 3, + points[0].y + 1, + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 3, + ), + }); + let bldg_gold_top_antlers2_clear = painter.aabb(Aabb { + min: Vec3::new( + points[0].x - 2, + points[0].y - 1, + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 2, + ), + + max: Vec3::new( + points[0].x + 2, + points[0].y + 1, + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 3, + ), + }); + let bldg_gold_top_antlers3 = Aabb { + min: Vec3::new( + points[0].x - 3, + points[0].y - 1, + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 4, + ), + max: Vec3::new( + points[0].x + 3, + points[0].y + 1, + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 5, + ), + }; + let bldg_gold_top_antlers4 = painter.aabb(Aabb { + min: Vec3::new( + points[0].x - 5, + points[0].y - 1, + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 5, + ), + + max: Vec3::new( + points[0].x + 5, + points[0].y + 1, + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 6, + ), + }); + let bldg_gold_top_antlers4_clear = painter.aabb(Aabb { + min: Vec3::new( + points[0].x - 2, + points[0].y - 1, + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 5, + ), + + max: Vec3::new( + points[0].x + 2, + points[0].y + 1, + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 6, + ), + }); + let bldg_gold_top_antlers5 = painter.aabb(Aabb { + min: Vec3::new( + points[0].x - 2, + points[0].y - 1, + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 7, + ), + + max: Vec3::new( + points[0].x + 2, + points[0].y + 1, + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 8, + ), + }); + let bldg_gold_top_antlers5_clear = painter.aabb(Aabb { + min: Vec3::new( + points[0].x - 1, + points[0].y - 1, + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 7, + ), + max: Vec3::new( + points[0].x + 1, + points[0].y + 1, + base + 1 + (6 * up) + (t * (steps - 1) * up) + (diameter / 6) + 8, + ), + }); + bldg_gold_top_antlers2.fill(gold.clone()); + bldg_gold_top_antlers2_clear.clear(); + bldg_gold_top_antlers4.fill(gold.clone()); + bldg_gold_top_antlers4_clear.clear(); + bldg_gold_top_antlers5.fill(gold.clone()); + bldg_gold_top_antlers5_clear.clear(); + painter.sphere(bldg_gold_top1).fill(gold.clone()); + painter.aabb(bldg_gold_top_pole).fill(gold.clone()); + painter.aabb(bldg_gold_top_antlers1).fill(gold.clone()); + painter.aabb(bldg_gold_top_antlers3).fill(gold.clone()); + }; + } } } - // top floor lanterns - for dir in SQUARE_4 { - for d in 0..2 { - let sq_corner = Vec2::new(center.x - 3 - d, center.y - (diameter / 8) - 2 - d); - let pos = Vec3::new( - sq_corner.x + (dir.y * (5 + (2 * d))), - sq_corner.y + (dir.x * ((diameter / 4) + 2 + (2 * d))), - base - (diameter / 8) + diameter + 2, - ); - painter.sprite(pos, SpriteKind::SeashellLantern); - } - } - // main room emblems 1 - for d in 0..2 { - let emblem_pos = Vec3::new( - center.x - d, - center.y + (diameter / 3) + 6 - (d * (2 * (diameter / 3) + 10)), - base + (diameter / 4) + 1, - ); - painter.rotated_sprite(emblem_pos, SpriteKind::SeaDecorEmblem, 4 - (4 * d) as u8); - } - // main room emblems 2 - for d in 0..2 { - let emblem_pos = Vec3::new( - center.x - (diameter / 3) - 7 + (d * (2 * (diameter / 3) + 13)), - center.y - d, - base + (diameter / 4) + 1, - ); - painter.rotated_sprite(emblem_pos, SpriteKind::SeaDecorEmblem, 6 - (4 * d) as u8); - } - // first floor emblems / top floor emblems - for d in 0..2 { - for e in 0..2 { - let emblem_pos = Vec3::new( - center.x - d, - center.y - (diameter / 8) - 4 + (d * ((diameter / 4) + 6)), - base + (diameter / 2) + 1 + (e * (diameter / 2)), - ); - painter.rotated_sprite(emblem_pos, SpriteKind::SeaDecorEmblem, 4 - (4 * d) as u8); - } - } + // water basin + painter + .sphere_with_radius( + center.with_z(base - (2 * diameter) + (diameter / 4)), + (diameter + (diameter / 5) + 1) as f32, + ) + .fill(white.clone()); + let water_basin = painter.sphere_with_radius( + center.with_z(base - (2 * diameter) + (diameter / 4) + 1), + (diameter + (diameter / 5)) as f32, + ); + water_basin.fill(water.clone()); + // clear some water + water_basin + .intersect( + painter.aabb(Aabb { + min: (center - (diameter + (diameter / 5))) + .with_z(base - (4 * (diameter / 4)) + 1), + max: (center + (diameter + (diameter / 5))) + .with_z(base - diameter + (diameter / 5) + (diameter / 4) + 1), + }), + ) + .clear(); + // water basin gold ring + painter + .cylinder_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2)), + (diameter - 4) as f32, + 1.0, + ) + .fill(gold.clone()); + painter + .cylinder_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2)), + (diameter - 5) as f32, + 1.0, + ) + .fill(water.clone()); + + // underwater chamber + painter + .sphere_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2)), + ((diameter / 2) + 2) as f32, + ) + .fill(white.clone()); + + painter + .sphere_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2)), + (diameter / 2) as f32, + ) + .fill(water.clone()); + + // underwater chamber entries + painter + .aabb(Aabb { + min: Vec3::new( + center.x - (diameter / 2) - 2, + center.y - 2, + base - (3 * diameter) + (diameter / 3) - 8, + ), + max: Vec3::new( + center.x + (diameter / 2) + 2, + center.y + 2, + base - (3 * diameter) + (diameter / 3) + 4, + ), + }) + .fill(water.clone()); + // underwater chamber entries + painter + .aabb(Aabb { + min: Vec3::new( + center.x - 2, + center.y - (diameter / 2) - 2, + base - (3 * diameter) + (diameter / 3) - 8, + ), + max: Vec3::new( + center.x + 2, + center.y + (diameter / 2) + 2, + base - (3 * diameter) + (diameter / 3) + 4, + ), + }) + .fill(water); + // underwater chamber top + painter + .sphere_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2)), + ((diameter / 2) + 2) as f32, + ) + .intersect( + painter.aabb(Aabb { + min: (center - (diameter / 2) - 3) + .with_z(base - (3 * diameter) + (diameter / 2) - 1), + max: (center + (diameter / 2) + 3).with_z(base - (3 * diameter) + diameter + 2), + }), + ) + .fill(top.clone()); + // clear underwater chamber + painter + .sphere_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2)), + (diameter / 2) as f32, + ) + .intersect( + painter.aabb(Aabb { + min: (center - (diameter / 2) - 3) + .with_z(base - (3 * diameter) + (diameter / 2) - 1), + max: (center + (diameter / 2) + 3).with_z(base - (3 * diameter) + diameter + 2), + }), + ) + .clear(); + // underwater chamber gold ring and floors + painter + .cylinder_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2)), + ((diameter / 2) + 2) as f32, + 1.0, + ) + .fill(gold.clone()); + painter + .cylinder_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2)), + ((diameter / 2) + 1) as f32, + 1.0, + ) + .fill(floor_color.clone()); + painter + .cylinder_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2) - 1), + ((diameter / 2) + 1) as f32, + 1.0, + ) + .fill(floor_color.clone()); + // organ in underwater chamber + let underwater_organ_pos = + (center - (diameter / 4)).with_z(base - (3 * diameter) + (diameter / 2) + 1); + painter.spawn( + EntityInfo::at(underwater_organ_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.organ", &mut rng), + ); + // underwater chamber decor ring + painter + .cylinder_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2) + 1), + (diameter / 2) as f32, + 1.0, + ) + .fill(gold_decor.clone()); + painter + .cylinder_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2) + 1), + ((diameter / 2) - 1) as f32, + 1.0, + ) + .clear(); + + // underwater chamber sprites + painter + .cylinder_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2) + 1), + ((diameter / 2) - 1) as f32, + 1.0, + ) + .fill(sprite_fill); + painter + .cylinder_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2) + 1), + ((diameter / 2) - 2) as f32, + 1.0, + ) + .clear(); + // underwater chamber hanging emblem + painter.rotated_sprite( + center.with_z(base - (3 * diameter) + (diameter / 2) + (diameter / 4)), + SpriteKind::SeaDecorEmblem, + 2_u8, + ); + painter + .aabb(Aabb { + min: Vec3::new( + center.x, + center.y, + base - (3 * diameter) + (diameter / 2) + (diameter / 4) + 1, + ), + max: Vec3::new( + center.x + 1, + center.y + 1, + base - (3 * diameter) + diameter + 1, + ), + }) + .fill(gold_chain); + // underwater chamber dagon + let cellar_miniboss_pos = (center + 6).with_z(base - (3 * diameter) + (diameter / 2) + 1); + painter.spawn( + EntityInfo::at(cellar_miniboss_pos.as_()) + .with_asset_expect("common.entity.dungeon.sea_chapel.dagon", &mut rng), + ); + // underwater chamber floor entry + painter + .cylinder_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2)), + 3.0, + 1.0, + ) + .fill(white.clone()); + painter + .cylinder_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2) + 3), + 3.0, + 1.0, + ) + .fill(gold_decor.clone()); + painter + .cylinder_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2)), + 3.0, + 3.0, + ) + .fill(white.clone()); + painter + .cylinder_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2) - 1), + 3.0, + 1.0, + ) + .fill(gold.clone()); + painter + .cylinder_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 2) - 1), + 2.0, + 7.0, + ) + .clear(); + // water basin ground floor + painter + .cylinder_with_radius( + center.with_z(base - (3 * diameter) + (diameter / 3) - 9), + (diameter / 2) as f32, + 1.0, + ) + .fill(floor_color.clone()); // side buildings hut, pavillon, tower - let bldg_corner = center - (diameter / 2); - for dir in SQUARE_4 { - let bldg_center = bldg_corner + dir * diameter; - let bldg_variant = (RandomField::new(0).get((bldg_corner - dir).with_z(base))) % 10; + for dir in DIAGONALS { + let bldg_center = center + dir * (2 * (diameter / 3)); + let bldg_variant = (RandomField::new(0).get((bldg_center).with_z(base))) % 10; let tower_height = (diameter / 4) + (3 * (bldg_variant as i32)); let bldg_diameter = diameter; let bldg_cellar = Aabb { @@ -3642,59 +1890,51 @@ impl Structure for SeaChapel { base + (bldg_diameter / 15) + 6, ), }; - let bldg_room_windows = painter - .aabb(Aabb { - min: Vec3::new( - bldg_center.x - 1, - bldg_center.y - (bldg_diameter / 4), - base - (bldg_diameter / 15) + (bldg_diameter / 4) - 2, - ), - max: Vec3::new( - bldg_center.x + 1, - bldg_center.y + (bldg_diameter / 4), - base - (bldg_diameter / 15) + (bldg_diameter / 4) - 1, - ), - }) - .without(painter.aabb(Aabb { - min: Vec3::new( - bldg_center.x - 1, - bldg_center.y - (bldg_diameter / 4) + 1, - base - (bldg_diameter / 15) + (bldg_diameter / 4) - 2, - ), - max: Vec3::new( - bldg_center.x + 1, - bldg_center.y + (bldg_diameter / 4) - 1, - base - (bldg_diameter / 15) + (bldg_diameter / 4) - 1, - ), - })); - let bldg_top = painter + let bldg_room_windows_1 = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - 1, + bldg_center.y - (bldg_diameter / 4), + base - (bldg_diameter / 15) + (bldg_diameter / 4) - 2, + ), + max: Vec3::new( + bldg_center.x + 1, + bldg_center.y - (bldg_diameter / 4) + 1, + base - (bldg_diameter / 15) + (bldg_diameter / 4) - 1, + ), + }); + let bldg_room_windows_2 = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - 1, + bldg_center.y + (bldg_diameter / 4) - 1, + base - (bldg_diameter / 15) + (bldg_diameter / 4) - 2, + ), + max: Vec3::new( + bldg_center.x + 1, + bldg_center.y + (bldg_diameter / 4), + base - (bldg_diameter / 15) + (bldg_diameter / 4) - 1, + ), + }); + let bldg_top_half = painter.aabb(Aabb { + min: (bldg_center - (bldg_diameter / 4)) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4)), + max: (bldg_center + (bldg_diameter / 4)) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)), + }); + let bldg_washed_top = painter .sphere(Aabb { min: (bldg_center - (bldg_diameter / 4)).with_z(base - (bldg_diameter / 15)), max: (bldg_center + (bldg_diameter / 4)) .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)), }) - .without( - painter.cylinder(Aabb { - min: (bldg_center - (bldg_diameter / 4)) - .with_z(base - (bldg_diameter / 15)), - max: (bldg_center + (bldg_diameter / 4)) - .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4)), - }), - ); - let bldg_washed_top = painter + .intersect(bldg_top_half); + let bldg_top = painter .sphere(Aabb { - min: (bldg_center - (bldg_diameter / 4)).with_z(base - (bldg_diameter / 15)), - max: (bldg_center + (bldg_diameter / 4) - 1) + min: (bldg_center - (bldg_diameter / 4) + 1) + .with_z(base - (bldg_diameter / 15) + 1), + max: (bldg_center + (bldg_diameter / 4)) .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)), }) - .without( - painter.cylinder(Aabb { - min: (bldg_center - (bldg_diameter / 4)) - .with_z(base - (bldg_diameter / 15)), - max: (bldg_center + (bldg_diameter / 4)) - .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4)), - }), - ); + .intersect(bldg_top_half); let bldg_room_goldring = painter.cylinder(Aabb { min: (bldg_center - (bldg_diameter / 4)) .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 1), @@ -3732,74 +1972,71 @@ impl Structure for SeaChapel { base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6), ), }; - let bldg_room2_windows1 = painter - .aabb(Aabb { - min: Vec3::new( - bldg_center.x - 1, - bldg_center.y - (bldg_diameter / 6), - base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, - ), - max: Vec3::new( - bldg_center.x + 1, - bldg_center.y + (bldg_diameter / 6), - base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, - ), - }) - .without(painter.aabb(Aabb { - min: Vec3::new( - bldg_center.x - 1, - bldg_center.y - (bldg_diameter / 6) + 1, - base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, - ), - max: Vec3::new( - bldg_center.x + 1, - bldg_center.y + (bldg_diameter / 6) - 1, - base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, - ), - })); - let bldg_room2_windows2 = painter - .aabb(Aabb { - min: Vec3::new( - bldg_center.x - (bldg_diameter / 6), - bldg_center.y - 1, - base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, - ), - max: Vec3::new( - bldg_center.x + (bldg_diameter / 6), - bldg_center.y + 1, - base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, - ), - }) - .without(painter.aabb(Aabb { - min: Vec3::new( - bldg_center.x - (bldg_diameter / 6) + 1, - bldg_center.y - 1, - base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, - ), - max: Vec3::new( - bldg_center.x + (bldg_diameter / 6) - 1, - bldg_center.y + 1, - base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, - ), - })); + let bldg_room2_windows1 = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - 1, + bldg_center.y - (bldg_diameter / 6), + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, + ), + max: Vec3::new( + bldg_center.x + 1, + bldg_center.y - (bldg_diameter / 6) + 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, + ), + }); + let bldg_room2_windows2 = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - 1, + bldg_center.y + (bldg_diameter / 6) - 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, + ), + max: Vec3::new( + bldg_center.x + 1, + bldg_center.y + (bldg_diameter / 6), + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, + ), + }); + let bldg_room2_windows3 = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - (bldg_diameter / 6), + bldg_center.y - 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, + ), + max: Vec3::new( + bldg_center.x - (bldg_diameter / 6) + 1, + bldg_center.y + 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, + ), + }); + let bldg_room2_windows4 = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x + (bldg_diameter / 6) - 1, + bldg_center.y - 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, + ), + max: Vec3::new( + bldg_center.x + (bldg_diameter / 6), + bldg_center.y + 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, + ), + }); + let bldg_room2_top_half = painter.aabb(Aabb { + min: (bldg_center - (bldg_diameter / 6) + 1) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)), + max: (bldg_center + (bldg_diameter / 6)).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6), + ), + }); let bldg_room2_top = painter .sphere(Aabb { min: (bldg_center - (bldg_diameter / 6) + 1).with_z( - base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6), + base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6) + 1, ), max: (bldg_center + (bldg_diameter / 6)).with_z( base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6), ), }) - .without( - painter.cylinder(Aabb { - min: (bldg_center - (bldg_diameter / 6)).with_z( - base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6), - ), - max: (bldg_center + (bldg_diameter / 6)) - .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)), - }), - ); + .intersect(bldg_room2_top_half); let bldg_room2_washed_top = painter .sphere(Aabb { min: (bldg_center - (bldg_diameter / 6)).with_z( @@ -3809,15 +2046,7 @@ impl Structure for SeaChapel { base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6), ), }) - .without( - painter.cylinder(Aabb { - min: (bldg_center - (bldg_diameter / 6)).with_z( - base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6), - ), - max: (bldg_center + (bldg_diameter / 6)) - .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)), - }), - ); + .intersect(bldg_room2_top_half); let bldg_room2_goldring = painter.cylinder(Aabb { min: (bldg_center - (bldg_diameter / 6)) .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) + 1), @@ -3919,6 +2148,22 @@ impl Structure for SeaChapel { - 2, ), }; + let bldg_room3_washed_top_half = painter.aabb(Aabb { + min: (bldg_center - (bldg_diameter / 7)).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 2, + ), + max: (bldg_center + (bldg_diameter / 7)).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + - 2, + ), + }); let bldg_room3_washed_top = painter .sphere(Aabb { min: (bldg_center - (bldg_diameter / 7)).with_z( @@ -3932,22 +2177,11 @@ impl Structure for SeaChapel { - 2, ), }) - .without(painter.cylinder(Aabb { - min: (bldg_center - (bldg_diameter / 7)).with_z( - base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2, - ), - max: (bldg_center + (bldg_diameter / 7)).with_z( - base - (bldg_diameter / 15) - + tower_height - + (bldg_diameter / 4) - + (bldg_diameter / 7) - - 2, - ), - })); + .intersect(bldg_room3_washed_top_half); let bldg_room3_top = painter .sphere(Aabb { min: (bldg_center - (bldg_diameter / 7) + 1).with_z( - base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2, + base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 1, ), max: (bldg_center + (bldg_diameter / 7)).with_z( base - (bldg_diameter / 15) @@ -3957,18 +2191,7 @@ impl Structure for SeaChapel { - 2, ), }) - .without(painter.cylinder(Aabb { - min: (bldg_center - (bldg_diameter / 7)).with_z( - base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2, - ), - max: (bldg_center + (bldg_diameter / 7)).with_z( - base - (bldg_diameter / 15) - + tower_height - + (bldg_diameter / 4) - + (bldg_diameter / 7) - - 2, - ), - })); + .intersect(bldg_room3_washed_top_half); let bldg_room3_goldring = Aabb { min: (bldg_center - (bldg_diameter / 7)).with_z( base - (bldg_diameter / 15) @@ -3995,39 +2218,38 @@ impl Structure for SeaChapel { - 3, ), }; - let bldg_room3_floor = painter - .sphere(Aabb { - min: (bldg_center - 3).with_z( - base - (bldg_diameter / 15) - + tower_height - + (bldg_diameter / 4) - + (bldg_diameter / 7) - - 8, - ), - max: (bldg_center + 3).with_z( - base - (bldg_diameter / 15) - + tower_height - + (bldg_diameter / 4) - + (bldg_diameter / 7) - - 7, - ), - }) - .without(painter.cylinder(Aabb { - min: (bldg_center - 2).with_z( - base - (bldg_diameter / 15) - + tower_height - + (bldg_diameter / 4) - + (bldg_diameter / 7) - - 8, - ), - max: (bldg_center + 2).with_z( - base - (bldg_diameter / 15) - + tower_height - + (bldg_diameter / 4) - + (bldg_diameter / 7) - - 7, - ), - })); + let bldg_room3_floor = painter.cylinder(Aabb { + min: (bldg_center - 3).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 8, + ), + max: (bldg_center + 3).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 7, + ), + }); + let bldg_room3_floor_clear = painter.cylinder(Aabb { + min: (bldg_center - 2).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 8, + ), + max: (bldg_center + 2).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 7, + ), + }); let bldg_tower_floors_clear = Aabb { min: (bldg_center - 3).with_z(base - (bldg_diameter / 3) + 2), max: (bldg_center + 3).with_z( @@ -4348,7 +2570,7 @@ impl Structure for SeaChapel { ), }; let bldg_tower_rope = Aabb { - min: bldg_center.with_z(base - (bldg_diameter / 3) + 7), + min: bldg_center.with_z(base - (5 * (bldg_diameter / 4)) - 5), max: (bldg_center + 1).with_z( base - (bldg_diameter / 15) + tower_height @@ -4369,18 +2591,10 @@ impl Structure for SeaChapel { .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) - 3), }; let bldg_hut_rope = Aabb { - min: bldg_center.with_z(base - (bldg_diameter / 3) + 7), + min: bldg_center.with_z(base - (5 * (bldg_diameter / 4)) - 5), max: (bldg_center + 1) .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) - 4), }; - let bldg_water_puddle = Aabb { - min: (bldg_center - 5).with_z(base - (bldg_diameter / 3) + 2), - max: (bldg_center + 5).with_z(base - (bldg_diameter / 3) + 3), - }; - let bldg_connect_entry = Aabb { - min: (bldg_center - 4).with_z(base - (bldg_diameter / 3) + 2), - max: (bldg_center + 4).with_z(base - (bldg_diameter / 3) + 3), - }; let bldg_room_lantern_pos = (bldg_center + 2).with_z(base - (bldg_diameter / 15) + 2); let bldg_floor_lantern_pos = (bldg_center + 2).with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2); @@ -4415,17 +2629,6 @@ impl Structure for SeaChapel { bldg_center.y, base - (bldg_diameter / 3) + 3, ); - let bldg_floor2_coral_chest_podium = Aabb { - min: (bldg_center - 5).with_z( - base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 1, - ), - max: (bldg_center - 4).with_z( - base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 2, - ), - }; - let bldg_floor2_coral_chest_pos = (bldg_center - 5).with_z( - base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 2, - ); let bldg_floor_bed_pos = Vec3::new( bldg_center.x - (bldg_diameter / 6), bldg_center.y, @@ -4443,44 +2646,108 @@ impl Structure for SeaChapel { base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6) - 2, ), }; - let bldg_floor2_glass_barriers = Aabb { - min: Vec3::new( - bldg_center.x + 3, - bldg_center.y - 1, - base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 1, - ), - max: Vec3::new( - bldg_center.x + 4, - bldg_center.y + 1, - base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 4, - ), - }; - let bldg_floor2_step = Aabb { - min: Vec3::new( - bldg_center.x + 2, - bldg_center.y - 1, - base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10), - ), - max: Vec3::new( - bldg_center.x + 3, - bldg_center.y + 1, - base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 10) + 1, - ), - }; + + let bldg_underwater_exit_pos_1 = + center + dir * (2 * ((diameter / 3) - (diameter / 10))); + let bldg_underwater_exit_pos_2 = center + dir * (2 * ((diameter / 3) - (diameter / 7))); + let bldg_underwater_tube = painter.cubic_bezier( + bldg_center.with_z(base - (5 * (bldg_diameter / 4)) + 2), + bldg_center.with_z(base - (6 * (bldg_diameter / 4))), + bldg_underwater_exit_pos_1.with_z(base - (6 * (bldg_diameter / 4))), + bldg_underwater_exit_pos_2.with_z(base - (5 * (bldg_diameter / 4))), + ((bldg_diameter / 10) + 1) as f32, + ); + let bldg_underwater_tube_clear = painter.cubic_bezier( + bldg_center.with_z(base - (5 * (bldg_diameter / 4)) + 2), + bldg_center.with_z(base - (6 * (bldg_diameter / 4))), + bldg_underwater_exit_pos_1.with_z(base - (6 * (bldg_diameter / 4))), + bldg_underwater_exit_pos_2.with_z(base - (5 * (bldg_diameter / 4))), + (bldg_diameter / 10) as f32, + ); + let bldg_underwater_exit = painter.cylinder(Aabb { + min: (bldg_underwater_exit_pos_2 - (bldg_diameter / 10) - 1) + .with_z(base - (5 * (bldg_diameter / 4)) + 1), + max: (bldg_underwater_exit_pos_2 + (bldg_diameter / 10) + 1) + .with_z(base - (4 * (bldg_diameter / 4)) + 2), + }); + let bldg_underwater_exit_clear = painter.cylinder(Aabb { + min: (bldg_underwater_exit_pos_2 - (bldg_diameter / 10)) + .with_z(base - (5 * (bldg_diameter / 4)) + 1), + max: (bldg_underwater_exit_pos_2 + (bldg_diameter / 10)) + .with_z(base - (4 * (bldg_diameter / 4)) + 1), + }); let bldg_connect_tube = Aabb { min: (bldg_center - (bldg_diameter / 10)) - .with_z(base - (2 * (bldg_diameter / 3)) + 1), + .with_z(base - (5 * (bldg_diameter / 4)) + 2), max: (bldg_center + (bldg_diameter / 10)).with_z(base - (bldg_diameter / 3) + 1), }; - let bldg_connect_water = Aabb { + let bldg_connect_step_1 = Aabb { min: (bldg_center - (bldg_diameter / 10) + 1) - .with_z(base - (2 * (bldg_diameter / 3)) + 1), + .with_z(base - (2 * (bldg_diameter / 4))), + max: (bldg_center + (bldg_diameter / 10) - 1) + .with_z(base - (2 * (bldg_diameter / 4)) + 1), + }; + let bldg_connect_step_1_clear = Aabb { + min: (bldg_center - (bldg_diameter / 10) + 2) + .with_z(base - (2 * (bldg_diameter / 4))), + max: (bldg_center + (bldg_diameter / 10) - 2) + .with_z(base - (2 * (bldg_diameter / 4)) + 1), + }; + let bldg_connect_step_2 = Aabb { + min: (bldg_center - (bldg_diameter / 10) + 1) + .with_z(base - (3 * (bldg_diameter / 4))), + max: (bldg_center + (bldg_diameter / 10) - 1) + .with_z(base - (3 * (bldg_diameter / 4)) + 1), + }; + let bldg_connect_step_2_clear = Aabb { + min: (bldg_center - (bldg_diameter / 10) + 2) + .with_z(base - (3 * (bldg_diameter / 4))), + max: (bldg_center + (bldg_diameter / 10) - 2) + .with_z(base - (3 * (bldg_diameter / 4)) + 1), + }; + let bldg_connect_step_3 = Aabb { + min: (bldg_center - (bldg_diameter / 10) + 1) + .with_z(base - (4 * (bldg_diameter / 4)) - 3), + max: (bldg_center + (bldg_diameter / 10) - 1) + .with_z(base - (4 * (bldg_diameter / 4)) - 2), + }; + let bldg_connect_step_3_clear = Aabb { + min: (bldg_center - (bldg_diameter / 10) + 2) + .with_z(base - (4 * (bldg_diameter / 4)) - 3), + max: (bldg_center + (bldg_diameter / 10) - 2) + .with_z(base - (4 * (bldg_diameter / 4)) - 2), + }; + let bldg_connect_tube_gold_ring = Aabb { + min: (bldg_underwater_exit_pos_2 - (bldg_diameter / 10) + 1) + .with_z(base - (4 * (bldg_diameter / 4)) + 1), + max: (bldg_underwater_exit_pos_2 + (bldg_diameter / 10) - 1) + .with_z(base - (4 * (bldg_diameter / 4)) + 2), + }; + let bldg_connect_decor_ring = Aabb { + min: (bldg_underwater_exit_pos_2 - (bldg_diameter / 10)) + .with_z(base - (4 * (bldg_diameter / 4))), + max: (bldg_underwater_exit_pos_2 + (bldg_diameter / 10)) + .with_z(base - (4 * (bldg_diameter / 4)) + 1), + }; + let bldg_connect_decor_ring_clear = Aabb { + min: (bldg_underwater_exit_pos_2 - (bldg_diameter / 10) + 1) + .with_z(base - (4 * (bldg_diameter / 4))), + max: (bldg_underwater_exit_pos_2 + (bldg_diameter / 10) - 1) + .with_z(base - (4 * (bldg_diameter / 4)) + 1), + }; + let bldg_connect_clear = Aabb { + min: (bldg_center - (bldg_diameter / 10) + 1) + .with_z(base - (5 * (bldg_diameter / 4)) + 1), max: (bldg_center + (bldg_diameter / 10) - 1) .with_z(base - (bldg_diameter / 3) + 2), }; let bldg_connect_gate = Aabb { - min: (bldg_center - 2).with_z(base - (bldg_diameter / 3) + 2), - max: (bldg_center + 2).with_z(base - (bldg_diameter / 3) + 3), + min: (bldg_underwater_exit_pos_2 - 2).with_z(base - (4 * (bldg_diameter / 4)) + 1), + max: (bldg_underwater_exit_pos_2 + 2).with_z(base - (4 * (bldg_diameter / 4)) + 2), + }; + let bldg_connect_keyhole = Aabb { + min: (bldg_underwater_exit_pos_2 - 1).with_z(base - (4 * (bldg_diameter / 4)) + 1), + max: (bldg_underwater_exit_pos_2).with_z(base - (4 * (bldg_diameter / 4)) + 2), }; let bldg_floor_sea_cleric_pos = (bldg_center + (bldg_diameter / 8)) .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 2); @@ -4492,13 +2759,9 @@ impl Structure for SeaChapel { - 6, ); // bldg cellar Sea Crocodiles - let bldg_cellar_sea_croc_pos = Vec3::new( - bldg_center.x - (bldg_diameter / 8), - bldg_center.y, - base - (bldg_diameter / 3) + 3, - ); + let bldg_cellar_sea_croc_pos = bldg_center.with_z(base - (5 * (bldg_diameter / 4)) - 5); for _ in - 0..(1 + ((RandomField::new(0).get((bldg_cellar_sea_croc_pos).with_z(base))) % 2)) + 0..(2 + ((RandomField::new(0).get((bldg_cellar_sea_croc_pos).with_z(base))) % 2)) { painter.spawn( EntityInfo::at(bldg_cellar_sea_croc_pos.as_()) @@ -4513,21 +2776,37 @@ impl Structure for SeaChapel { painter.sphere(bldg_room).fill(white.clone()); painter.aabb(bldg_hut_entry_clear1).clear(); painter.aabb(bldg_hut_entry_clear2).clear(); - bldg_room_windows.fill(window_ver.clone()); - bldg_top.fill(top.clone()); + bldg_room_windows_1.fill(window_ver.clone()); + bldg_room_windows_2.fill(window_ver.clone()); bldg_washed_top.fill(washed.clone()); + bldg_top.fill(top.clone()); painter.sphere(bldg_room_clear).clear(); bldg_room_goldring.fill(gold.clone()); bldg_room_goldring_clear.clear(); - painter.cylinder(bldg_room_floor).fill(white.clone()); + painter.cylinder(bldg_room_floor).fill(floor_color.clone()); painter.cylinder(bldg_hut_floors_clear).clear(); painter.cylinder(bldg_hut_ropefix1).fill(ropefix1.clone()); painter.aabb(bldg_hut_ropefix2).fill(ropefix2.clone()); - painter.aabb(bldg_hut_rope).fill(rope.clone()); - painter.cylinder(bldg_water_puddle).fill(water.clone()); + bldg_underwater_tube.fill(white.clone()); + bldg_underwater_tube_clear.clear(); + bldg_underwater_exit.fill(white.clone()); + bldg_underwater_exit_clear.clear(); painter.cylinder(bldg_connect_tube).fill(white.clone()); - painter.cylinder(bldg_connect_water).fill(water.clone()); - painter.cylinder(bldg_connect_entry).fill(white.clone()); + painter + .cylinder(bldg_connect_tube_gold_ring) + .fill(gold.clone()); + painter.cylinder(bldg_connect_clear).clear(); + painter + .cylinder(bldg_connect_decor_ring) + .fill(gold_decor.clone()); + painter.cylinder(bldg_connect_decor_ring_clear).clear(); + painter.cylinder(bldg_connect_step_1).fill(white.clone()); + painter.cylinder(bldg_connect_step_1_clear).clear(); + painter.cylinder(bldg_connect_step_2).fill(white.clone()); + painter.cylinder(bldg_connect_step_2_clear).clear(); + painter.cylinder(bldg_connect_step_3).fill(white.clone()); + painter.cylinder(bldg_connect_step_3_clear).clear(); + painter.aabb(bldg_hut_rope).fill(rope.clone()); painter.sprite(bldg_room_lantern_pos, SpriteKind::SeashellLantern); painter.sprite(bldg_floor_lantern_pos, SpriteKind::SeashellLantern); painter.sprite(bldg_cellar_chest_pos, SpriteKind::DungeonChest1); @@ -4557,19 +2836,34 @@ impl Structure for SeaChapel { painter.aabb(bldg_pavillon_entry_clear4).clear(); painter.aabb(bldg_pavillon_entry_clear5).clear(); painter.aabb(bldg_pavillon_entry_clear6).clear(); - bldg_top.fill(top.clone()); bldg_washed_top.fill(washed.clone()); + bldg_top.fill(top.clone()); painter.sphere(bldg_room_clear).clear(); bldg_room_goldring.fill(gold.clone()); bldg_room_goldring_clear.clear(); painter.cylinder(bldg_hut_floors_clear).clear(); painter.cylinder(bldg_hut_ropefix1).fill(ropefix1.clone()); painter.aabb(bldg_hut_ropefix2).fill(ropefix2.clone()); - painter.aabb(bldg_hut_rope).fill(rope.clone()); - painter.cylinder(bldg_water_puddle).fill(water.clone()); + bldg_underwater_tube.fill(white.clone()); + bldg_underwater_tube_clear.clear(); + bldg_underwater_exit.fill(white.clone()); + bldg_underwater_exit_clear.clear(); painter.cylinder(bldg_connect_tube).fill(white.clone()); - painter.cylinder(bldg_connect_water).fill(water.clone()); - painter.cylinder(bldg_connect_entry).fill(white.clone()); + painter + .cylinder(bldg_connect_tube_gold_ring) + .fill(gold.clone()); + painter.cylinder(bldg_connect_clear).clear(); + painter + .cylinder(bldg_connect_decor_ring) + .fill(gold_decor.clone()); + painter.cylinder(bldg_connect_decor_ring_clear).clear(); + painter.cylinder(bldg_connect_step_1).fill(white.clone()); + painter.cylinder(bldg_connect_step_1_clear).clear(); + painter.cylinder(bldg_connect_step_2).fill(white.clone()); + painter.cylinder(bldg_connect_step_2_clear).clear(); + painter.cylinder(bldg_connect_step_3).fill(white.clone()); + painter.cylinder(bldg_connect_step_3_clear).clear(); + painter.aabb(bldg_hut_rope).fill(rope.clone()); painter.sprite(bldg_room_lantern_pos, SpriteKind::SeashellLantern); painter.sprite(bldg_cellar_chest_pos, SpriteKind::DungeonChest1); }, @@ -4580,12 +2874,15 @@ impl Structure for SeaChapel { painter.sphere(bldg_room).fill(white.clone()); painter.aabb(bldg_hut_entry_clear1).clear(); painter.aabb(bldg_hut_entry_clear2).clear(); - bldg_room_windows.fill(window_ver.clone()); - bldg_top.fill(top.clone()); + bldg_room_windows_1.fill(window_ver.clone()); + bldg_room_windows_2.fill(window_ver.clone()); bldg_washed_top.fill(washed.clone()); + bldg_top.fill(top.clone()); painter.sphere(bldg_room2).fill(white.clone()); bldg_room2_windows1.fill(window_ver.clone()); - bldg_room2_windows2.fill(window_ver2.clone()); + bldg_room2_windows2.fill(window_ver.clone()); + bldg_room2_windows3.fill(window_ver2.clone()); + bldg_room2_windows4.fill(window_ver2.clone()); bldg_room2_washed_top.fill(washed.clone()); bldg_room2_top.fill(top.clone()); painter.sphere(bldg_room2_clear).clear(); @@ -4594,8 +2891,8 @@ impl Structure for SeaChapel { painter.sphere(bldg_room_clear).clear(); bldg_room_goldring.fill(gold.clone()); bldg_room_goldring_clear.clear(); - painter.cylinder(bldg_room_floor).fill(white.clone()); - painter.cylinder(bldg_room2_floor).fill(white.clone()); + painter.cylinder(bldg_room_floor).fill(floor_color.clone()); + painter.cylinder(bldg_room2_floor).fill(floor_color.clone()); bldg_tube.fill(white.clone()); bldg_tube_clear.clear(); painter.aabb(bldg_tube_windows1).fill(window_ver2.clone()); @@ -4612,15 +2909,11 @@ impl Structure for SeaChapel { painter.aabb(bldg_room3_entry_clear3).clear(); painter.aabb(bldg_room3_entry_clear4).clear(); painter.cylinder(bldg_floor2_wall).fill(white.clone()); - painter - .aabb(bldg_floor2_glass_barriers) - .fill(glass_barrier.clone()); painter.cylinder(bldg_tower_floors_clear).clear(); - painter.aabb(bldg_floor2_step).fill(gold_decor.clone()); - bldg_room3_floor.fill(white.clone()); + bldg_room3_floor.fill(floor_color.clone()); + bldg_room3_floor_clear.clear(); painter.cylinder(bldg_tower_ropefix1).fill(ropefix1.clone()); painter.aabb(bldg_tower_ropefix2).fill(ropefix2.clone()); - painter.aabb(bldg_tower_rope).fill(rope.clone()); bldg_gold_top_antlers2.fill(gold.clone()); bldg_gold_top_antlers2_clear.clear(); bldg_gold_top_antlers4.fill(gold.clone()); @@ -4631,10 +2924,26 @@ impl Structure for SeaChapel { painter.aabb(bldg_gold_top_pole).fill(gold.clone()); painter.aabb(bldg_gold_top_antlers1).fill(gold.clone()); painter.aabb(bldg_gold_top_antlers3).fill(gold.clone()); - painter.cylinder(bldg_water_puddle).fill(water.clone()); + bldg_underwater_tube.fill(white.clone()); + bldg_underwater_tube_clear.clear(); + bldg_underwater_exit.fill(white.clone()); + bldg_underwater_exit_clear.clear(); painter.cylinder(bldg_connect_tube).fill(white.clone()); - painter.cylinder(bldg_connect_water).fill(water.clone()); - painter.cylinder(bldg_connect_entry).fill(white.clone()); + painter + .cylinder(bldg_connect_tube_gold_ring) + .fill(gold.clone()); + painter.cylinder(bldg_connect_clear).clear(); + painter + .cylinder(bldg_connect_decor_ring) + .fill(gold_decor.clone()); + painter.cylinder(bldg_connect_decor_ring_clear).clear(); + painter.cylinder(bldg_connect_step_1).fill(white.clone()); + painter.cylinder(bldg_connect_step_1_clear).clear(); + painter.cylinder(bldg_connect_step_2).fill(white.clone()); + painter.cylinder(bldg_connect_step_2_clear).clear(); + painter.cylinder(bldg_connect_step_3).fill(white.clone()); + painter.cylinder(bldg_connect_step_3_clear).clear(); + painter.aabb(bldg_tower_rope).fill(rope.clone()); painter.sprite(bldg_room_lantern_pos, SpriteKind::SeashellLantern); painter.sprite(bldg_floor_lantern_pos, SpriteKind::SeashellLantern); painter.sprite(bldg_floor2_lantern_pos, SpriteKind::SeashellLantern); @@ -4642,10 +2951,6 @@ impl Structure for SeaChapel { painter.sprite(bldg_floor3_drawer_pos, SpriteKind::DrawerSmall); painter.sprite(bldg_floor3_potion_pos, SpriteKind::PotionMinor); painter.sprite(bldg_cellar_chest_pos, SpriteKind::DungeonChest1); - painter - .aabb(bldg_floor2_coral_chest_podium) - .fill(gold_decor.clone()); - painter.rotated_sprite(bldg_floor2_coral_chest_pos, SpriteKind::CoralChest, 0); painter.sprite(bldg_floor_bed_pos, SpriteKind::Bed); painter.sprite(bldg_floor_drawer_pos, SpriteKind::DrawerSmall); painter.sprite(bldg_floor_potion_pos, SpriteKind::PotionMinor); @@ -4682,6 +2987,11 @@ impl Structure for SeaChapel { painter .cylinder(bldg_connect_gate) .fill(Fill::Block(Block::air(connect_gate_type))); + if connect_gate_type == SpriteKind::GlassBarrier { + painter + .cylinder(bldg_connect_keyhole) + .fill(glass_keyhole.clone()); + }; } // surrounding buildings foundling, small hut, small pavillon for dir in NEIGHBORS { @@ -4751,38 +3061,28 @@ impl Structure for SeaChapel { su_bldg_base + (su_bldg_diameter / 15) + 2, ), }; - let su_bldg_top = painter + let su_bldg_top_half = painter.aabb(Aabb { + min: (su_bldg_center - (su_bldg_diameter / 6)) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6)), + max: (su_bldg_center + (su_bldg_diameter / 6)) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3)), + }); + let su_bldg_washed_top = painter .sphere(Aabb { min: (su_bldg_center - (su_bldg_diameter / 6)) .with_z(su_bldg_base - (su_bldg_diameter / 15)), max: (su_bldg_center + (su_bldg_diameter / 6)) .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3)), }) - .without( - painter.cylinder(Aabb { - min: (su_bldg_center - (su_bldg_diameter / 6)) - .with_z(su_bldg_base - (su_bldg_diameter / 15)), - max: (su_bldg_center + (su_bldg_diameter / 6)).with_z( - su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6), - ), - }), - ); - let su_bldg_washed_top = painter + .intersect(su_bldg_top_half); + let su_bldg_top = painter .sphere(Aabb { - min: (su_bldg_center - (su_bldg_diameter / 6)) - .with_z(su_bldg_base - (su_bldg_diameter / 15)), - max: (su_bldg_center + (su_bldg_diameter / 6) - 1) + min: (su_bldg_center - (su_bldg_diameter / 6) + 1) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + 1), + max: (su_bldg_center + (su_bldg_diameter / 6)) .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3)), }) - .without( - painter.cylinder(Aabb { - min: (su_bldg_center - (su_bldg_diameter / 6)) - .with_z(su_bldg_base - (su_bldg_diameter / 15)), - max: (su_bldg_center + (su_bldg_diameter / 6)).with_z( - su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6), - ), - }), - ); + .intersect(su_bldg_top_half); let su_bldg_goldring = Aabb { min: (su_bldg_center - (su_bldg_diameter / 6)) .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 1), @@ -4833,7 +3133,7 @@ impl Structure for SeaChapel { .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3) - 3), }; let su_bldg_rope = Aabb { - min: (su_bldg_center).with_z(su_bldg_base - (su_bldg_diameter / 15) + 5), + min: (su_bldg_center).with_z(su_bldg_base - (su_bldg_diameter / 15) + 3), max: (su_bldg_center + 1) .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3) - 4), }; @@ -4909,14 +3209,74 @@ impl Structure for SeaChapel { su_bldg_base + (su_bldg_diameter / 15) + 2, ), }; + let su_bldg_pavillon_entries7 = Aabb { + min: Vec3::new( + su_bldg_center.x - 4, + su_bldg_center.y, + su_bldg_base + (su_bldg_diameter / 15) - 2, + ), + max: Vec3::new( + su_bldg_center.x + 4, + su_bldg_center.y + (su_bldg_diameter / 6), + su_bldg_base + (su_bldg_diameter / 15), + ), + }; + let su_bldg_pavillon_entries8 = Aabb { + min: Vec3::new( + su_bldg_center.x - 2, + su_bldg_center.y, + su_bldg_base + (su_bldg_diameter / 15) + 1, + ), + max: Vec3::new( + su_bldg_center.x + 2, + su_bldg_center.y + (su_bldg_diameter / 6), + su_bldg_base + (su_bldg_diameter / 15) + 2, + ), + }; + let su_bldg_pavillon_barriers_1 = Aabb { + min: Vec3::new( + su_bldg_center.x - 3, + su_bldg_center.y + (su_bldg_diameter / 6) - 3, + su_bldg_base + (su_bldg_diameter / 15), + ), + max: Vec3::new( + su_bldg_center.x + 3, + su_bldg_center.y + (su_bldg_diameter / 6) - 2, + su_bldg_base + (su_bldg_diameter / 15) + 1, + ), + }; + let su_bldg_pavillon_barriers_2 = Aabb { + min: Vec3::new( + su_bldg_center.x - 4, + su_bldg_center.y + (su_bldg_diameter / 6) - 3, + su_bldg_base + (su_bldg_diameter / 15) - 1, + ), + max: Vec3::new( + su_bldg_center.x + 4, + su_bldg_center.y + (su_bldg_diameter / 6) - 2, + su_bldg_base + (su_bldg_diameter / 15), + ), + }; + let su_bldg_pavillon_barriers_keyhole = Aabb { + min: Vec3::new( + su_bldg_center.x - 1, + su_bldg_center.y + (su_bldg_diameter / 6) - 3, + su_bldg_base + (su_bldg_diameter / 15) - 2, + ), + max: Vec3::new( + su_bldg_center.x, + su_bldg_center.y + (su_bldg_diameter / 6) - 2, + su_bldg_base + (su_bldg_diameter / 15) - 1, + ), + }; match su_bldg_variant { 0..=5 => { // common parts for small hut / small pavillon, painter.sphere(su_bldg_bottom1).fill(white.clone()); painter.sphere(su_bldg_bottom2).fill(white.clone()); painter.sphere(su_bldg_room).fill(white.clone()); - su_bldg_top.fill(top.clone()); su_bldg_washed_top.fill(washed.clone()); + su_bldg_top.fill(top.clone()); painter.cylinder(su_bldg_goldring).fill(gold.clone()); painter.sphere(su_bldg_room_clear).clear(); painter.sprite(su_bldg_room_lantern_pos, SpriteKind::SeashellLantern); @@ -4936,13 +3296,40 @@ impl Structure for SeaChapel { painter.sprite(su_bldg_floor_bed_pos, SpriteKind::Bed); }, _ => { - // small pavillon - painter.aabb(su_bldg_pavillon_entries1).clear(); - painter.aabb(su_bldg_pavillon_entries2).clear(); - painter.aabb(su_bldg_pavillon_entries3).clear(); - painter.aabb(su_bldg_pavillon_entries4).clear(); - painter.aabb(su_bldg_pavillon_entries5).clear(); - painter.aabb(su_bldg_pavillon_entries6).clear(); + // small pavillon, some with prisoners + if su_bldg_variant > 4 { + painter.aabb(su_bldg_pavillon_entries2).clear(); + painter.aabb(su_bldg_pavillon_entries7).clear(); + painter.aabb(su_bldg_pavillon_entries5).clear(); + painter.aabb(su_bldg_pavillon_entries8).clear(); + painter + .aabb(su_bldg_pavillon_barriers_1) + .fill(glass_barrier.clone()); + painter + .aabb(su_bldg_pavillon_barriers_2) + .fill(glass_barrier.clone()); + painter + .aabb(su_bldg_pavillon_barriers_keyhole) + .fill(glass_keyhole.clone()); + let prisoner_pos = su_bldg_center.with_z(base + 2); + for _ in 0..(6 + + ((RandomField::new(0).get((prisoner_pos).with_z(base))) % 6)) + { + painter.spawn( + EntityInfo::at(prisoner_pos.as_()).with_asset_expect( + "common.entity.dungeon.sea_chapel.prisoner", + &mut rng, + ), + ) + } + } else { + painter.aabb(su_bldg_pavillon_entries1).clear(); + painter.aabb(su_bldg_pavillon_entries2).clear(); + painter.aabb(su_bldg_pavillon_entries3).clear(); + painter.aabb(su_bldg_pavillon_entries4).clear(); + painter.aabb(su_bldg_pavillon_entries5).clear(); + painter.aabb(su_bldg_pavillon_entries6).clear(); + }; }, } },