diff --git a/assets/common/abilities/ability_set_manifest.ron b/assets/common/abilities/ability_set_manifest.ron index cdbfd1ac58..4a089589b7 100644 --- a/assets/common/abilities/ability_set_manifest.ron +++ b/assets/common/abilities/ability_set_manifest.ron @@ -38,7 +38,6 @@ primary: "common.abilities.spear.doublestrike", secondary: "common.abilities.spear.dash", abilities: [], - ), Custom("Hammer Simple"): ( primary: "common.abilities.hammersimple.doublestrike", @@ -53,8 +52,7 @@ Custom("Sword Simple"): ( primary: "common.abilities.swordsimple.doublestrike", secondary: "common.abilities.swordsimple.dash", - abilities: [ - ], + abilities: [], ), Custom("Staff Simple"): ( primary: "common.abilities.staffsimple.firebomb", diff --git a/assets/common/entity/dungeon/tier-5/cultist.ron b/assets/common/entity/dungeon/tier-5/cultist.ron new file mode 100644 index 0000000000..8b19091d2d --- /dev/null +++ b/assets/common/entity/dungeon/tier-5/cultist.ron @@ -0,0 +1,18 @@ +EntityConfig ( + name: Some("Cultist"), + body: Some(RandomWith("humanoid")), + + loot: Some(LootTable("common.loot_tables.dungeon.tier-5.enemy")), + + main_tool: Some(Choice([ + (1.0, Some(Item("common.items.weapons.axe_1h.orichalcum-0"))), + (2.0, Some(Item("common.items.weapons.sword.cultist"))), + (1.0, Some(Item("common.items.weapons.hammer.cultist_purp_2h-0"))), + (1.0, Some(Item("common.items.weapons.hammer_1h.orichalcum-0"))), + (1.0, Some(Item("common.items.weapons.bow.velorite"))), + ])), + second_tool: None, + + loadout_asset: Some("common.loadout.dungeon.tier-5.cultist"), + skillset_asset: Some("common.skillset.dungeon.tier-5.enemy"), +) diff --git a/assets/common/entity/dungeon/tier-5/warlock.ron b/assets/common/entity/dungeon/tier-5/warlock.ron index 0932bd714c..6ee268d287 100644 --- a/assets/common/entity/dungeon/tier-5/warlock.ron +++ b/assets/common/entity/dungeon/tier-5/warlock.ron @@ -1,12 +1,12 @@ EntityConfig ( name: Some("Cultist Warlock"), - body: Some(RandomWith("humanoid")), + body: Some(RandomWith("cultist_warlord")), loot: Some(LootTable("common.loot_tables.dungeon.tier-5.enemy")), main_tool: Some(Item("common.items.weapons.staff.cultist_staff")), second_tool: None, - loadout_asset: Some("common.loadout.dungeon.tier-5.warlock"), + loadout_asset: None, skillset_asset: Some("common.skillset.dungeon.tier-5.enemy"), ) diff --git a/assets/common/entity/dungeon/tier-5/warlord.ron b/assets/common/entity/dungeon/tier-5/warlord.ron index b85cb504de..4f7c0c4327 100644 --- a/assets/common/entity/dungeon/tier-5/warlord.ron +++ b/assets/common/entity/dungeon/tier-5/warlord.ron @@ -1,18 +1,16 @@ EntityConfig ( name: Some("Cultist Warlord"), - body: Some(RandomWith("humanoid")), + body: Some(RandomWith("cultist_warlord")), loot: Some(LootTable("common.loot_tables.dungeon.tier-5.enemy")), main_tool: Some(Choice([ - (1.0, Some(Item("common.items.weapons.axe_1h.orichalcum-0"))), - (2.0, Some(Item("common.items.weapons.sword.cultist"))), - (1.0, Some(Item("common.items.weapons.hammer.cultist_purp_2h-0"))), - (1.0, Some(Item("common.items.weapons.hammer_1h.orichalcum-0"))), - (1.0, Some(Item("common.items.weapons.bow.velorite"))), + (2.0, Some(Item("common.items.weapons.sword.bipedlarge-cultist"))), + (1.0, Some(Item("common.items.weapons.hammer.bipedlarge-cultist_purp_2h-0"))), + (1.0, Some(Item("common.items.weapons.bow.bipedlarge-velorite"))), ])), second_tool: None, - loadout_asset: Some("common.loadout.dungeon.tier-5.warlord"), + loadout_asset: None, skillset_asset: Some("common.skillset.dungeon.tier-5.enemy"), ) diff --git a/assets/common/items/crafting_ing/hide/rugged_hide.ron b/assets/common/items/crafting_ing/hide/rugged_hide.ron index 0c8bcc29d7..3a2f8ae583 100644 --- a/assets/common/items/crafting_ing/hide/rugged_hide.ron +++ b/assets/common/items/crafting_ing/hide/rugged_hide.ron @@ -4,7 +4,7 @@ ItemDef( kind: Ingredient( kind: "RuggedHide", ), - quality: Common, + quality: Epic, tags: [ Material(Leather) ], diff --git a/assets/common/items/weapons/bow/bipedlarge-velorite.ron b/assets/common/items/weapons/bow/bipedlarge-velorite.ron new file mode 100644 index 0000000000..f9fe278cf3 --- /dev/null +++ b/assets/common/items/weapons/bow/bipedlarge-velorite.ron @@ -0,0 +1,18 @@ +ItemDef( + name: "Velorite Bow (bipedlarge)", + description: "Infused with Velorite power.", + kind: Tool(( + kind: Bow, + hands: Two, + stats: Direct(( + equip_time_secs: 0.4, + power: 2.0, + poise_strength: 1.1, + speed: 1.0, + crit_chance: 0.140625, + )), + )), + quality: Epic, + tags: [], + ability_spec: Some(Custom("Bow Simple")), +) \ No newline at end of file diff --git a/assets/common/items/weapons/hammer/bipedlarge-cultist_purp_2h-0.ron b/assets/common/items/weapons/hammer/bipedlarge-cultist_purp_2h-0.ron new file mode 100644 index 0000000000..a68c9c4a58 --- /dev/null +++ b/assets/common/items/weapons/hammer/bipedlarge-cultist_purp_2h-0.ron @@ -0,0 +1,18 @@ +ItemDef( + name: "Magical Cultist Warhammer (bipedlarge)", + description: "This belonged to an evil Cult Leader.", + kind: Tool(( + kind: Hammer, + hands: Two, + stats: Direct(( + equip_time_secs: 0.5, + power: 2.0, + poise_strength: 1.0, + speed: 1.0, + crit_chance: 0.140625, + )), + )), + quality: Epic, + tags: [], + ability_spec: Some(Custom("Hammer Simple")), +) \ No newline at end of file diff --git a/assets/common/items/weapons/staff/bipedlarge_cultist_staff.ron b/assets/common/items/weapons/staff/bipedlarge_cultist_staff.ron new file mode 100644 index 0000000000..f0ac7f7bf3 --- /dev/null +++ b/assets/common/items/weapons/staff/bipedlarge_cultist_staff.ron @@ -0,0 +1,18 @@ +ItemDef( + name: "Cultist Staff (bipedlarge)", + description: "The fire gives off no heat.", + kind: Tool(( + kind: Staff, + hands: Two, + stats: Direct(( + equip_time_secs: 0.3, + power: 2.0, + poise_strength: 1.0, + speed: 1.0, + crit_chance: 0.140625, + )), + )), + quality: Epic, + tags: [], + ability_spec: Some(Custom("Staff Simple")), +) \ No newline at end of file diff --git a/assets/common/items/weapons/sword/bipedlarge-cultist.ron b/assets/common/items/weapons/sword/bipedlarge-cultist.ron new file mode 100644 index 0000000000..1f33916eb1 --- /dev/null +++ b/assets/common/items/weapons/sword/bipedlarge-cultist.ron @@ -0,0 +1,18 @@ +ItemDef( + name: "Magical Cultist Greatsword (bipedlarge)", + description: "This belonged to an evil Cult Leader.", + kind: Tool(( + kind: Sword, + hands: Two, + stats: Direct(( + equip_time_secs: 0.5, + power: 2.0, + poise_strength: 1.0, + speed: 1.0, + crit_chance: 0.140625, + )), + )), + quality: Epic, + tags: [], + ability_spec: Some(Custom("Sword Simple")), +) \ No newline at end of file diff --git a/assets/common/loadout/dungeon/tier-5/cultist.ron b/assets/common/loadout/dungeon/tier-5/cultist.ron new file mode 100644 index 0000000000..426a32c963 --- /dev/null +++ b/assets/common/loadout/dungeon/tier-5/cultist.ron @@ -0,0 +1,17 @@ +({ + Armor(Shoulders): Item("common.items.armor.cultist.shoulder"), + Armor(Chest): Item("common.items.armor.cultist.chest"), + Armor(Belt): Item("common.items.armor.cultist.belt"), + Armor(Hands): Item("common.items.armor.cultist.hand"), + Armor(Legs): Item("common.items.armor.cultist.pants"), + Armor(Feet): Item("common.items.armor.cultist.foot"), + + Armor(Back): Item("common.items.armor.misc.back.dungeon_purple"), + + Lantern: Choice([ + (1.0, Some(Item("common.items.lantern.black_0"))), + (2.0, None), + ]), + + Glider: Item("common.items.glider.glider_purp"), +}) diff --git a/assets/common/loadout/dungeon/tier-5/warlock.ron b/assets/common/loadout/dungeon/tier-5/warlock.ron deleted file mode 100644 index bcc428fbda..0000000000 --- a/assets/common/loadout/dungeon/tier-5/warlock.ron +++ /dev/null @@ -1,17 +0,0 @@ -({ - Armor(Shoulders): Item("common.items.armor.warlock.shoulder"), - Armor(Chest): Item("common.items.armor.warlock.chest"), - Armor(Belt): Item("common.items.armor.warlock.belt"), - Armor(Hands): Item("common.items.armor.warlock.hand"), - Armor(Legs): Item("common.items.armor.warlock.pants"), - Armor(Feet): Item("common.items.armor.warlock.foot"), - - Armor(Back): Item("common.items.armor.warlock.back"), - - Lantern: Choice([ - (1.0, Some(Item("common.items.lantern.black_0"))), - (2.0, None), - ]), - - Glider: Item("common.items.glider.glider_purp"), -}) diff --git a/assets/common/loadout/dungeon/tier-5/warlord.ron b/assets/common/loadout/dungeon/tier-5/warlord.ron deleted file mode 100644 index 2d83fef3fa..0000000000 --- a/assets/common/loadout/dungeon/tier-5/warlord.ron +++ /dev/null @@ -1,17 +0,0 @@ -({ - Armor(Shoulders): Item("common.items.armor.warlord.shoulder"), - Armor(Chest): Item("common.items.armor.warlord.chest"), - Armor(Belt): Item("common.items.armor.warlord.belt"), - Armor(Hands): Item("common.items.armor.warlord.hand"), - Armor(Legs): Item("common.items.armor.warlord.pants"), - Armor(Feet): Item("common.items.armor.warlord.foot"), - - Armor(Back): Item("common.items.armor.warlord.back"), - - Lantern: Choice([ - (1.0, Some(Item("common.items.lantern.black_0"))), - (2.0, None), - ]), - - Glider: Item("common.items.glider.glider_purp"), -}) diff --git a/assets/common/loot_tables/creature/quad_medium/horned.ron b/assets/common/loot_tables/creature/quad_medium/horned.ron new file mode 100644 index 0000000000..d3767b3bc1 --- /dev/null +++ b/assets/common/loot_tables/creature/quad_medium/horned.ron @@ -0,0 +1,4 @@ +[ + (1.0, Item("common.items.crafting_ing.hide.rugged_hide")), + (1.0, Item("common.items.crafting_ing.animal_misc.large_horn")), +] \ No newline at end of file diff --git a/assets/common/loot_tables/creature/quad_medium/mammoth.ron b/assets/common/loot_tables/creature/quad_medium/mammoth.ron new file mode 100644 index 0000000000..73dd2ad8a6 --- /dev/null +++ b/assets/common/loot_tables/creature/quad_medium/mammoth.ron @@ -0,0 +1,4 @@ +[ + (1.0, ItemQuantity("common.items.crafting_ing.hide.tough_hide", 2, 3)), + (1.0, ItemQuantity("common.items.crafting_ing.animal_misc.large_horn", 2, 3)), +] \ 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 4cf216a2b6..f2210787e1 100644 --- a/assets/voxygen/voxel/biped_weapon_manifest.ron +++ b/assets/voxygen/voxel/biped_weapon_manifest.ron @@ -1070,6 +1070,22 @@ vox_spec: ("weapon.hammer.2hhammer_oni_red", (-3.0, -4.5, -12.0)), color: None ), + "common.items.weapons.sword.bipedlarge-cultist": ( + vox_spec: ("weapon.sword.cultist", (-1.5, -4.0, -6.0)), + color: None + ), + "common.items.weapons.hammer.bipedlarge-cultist_purp_2h-0": ( + vox_spec: ("weapon.hammer.cult_purp-0", (-3.5, -4.5, -5.0)), + color: None + ), + "common.items.weapons.bow.bipedlarge-velorite": ( + vox_spec: ("weapon.bow.velorite", (-1.5, -4.0, -15.0)), + color: None + ), + "common.items.weapons.staff.bipedlarge-cultist_staff": ( + vox_spec: ("weapon.staff.firestaff_cultist", (-2.5, -2.5, -4.0)), + color: None + ), //BIPEDSMALL "common.items.npc_weapons.biped_small.adlet.adlet_bow": ( vox_spec: ("weapon.biped_small.bow.adlet", (-1.5, -3.0, -5.0)), diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs index 923347e2ba..96ffd4263f 100644 --- a/common/src/comp/body.rs +++ b/common/src/comp/body.rs @@ -306,7 +306,7 @@ impl Body { biped_large::Species::Slysaurok => Vec3::new(4.0, 3.0, 3.4), biped_large::Species::Werewolf => Vec3::new(4.0, 3.0, 3.5), biped_large::Species::Harvester => Vec3::new(4.6, 3.0, 5.4), - + biped_large::Species::Cultistwarlord => Vec3::new(3.0, 3.0, 4.5), _ => Vec3::new(4.6, 3.0, 6.0), }, Body::BipedSmall(body) => match body.species { diff --git a/common/src/comp/inventory/loadout_builder.rs b/common/src/comp/inventory/loadout_builder.rs index 5571bf7ef9..759b4ece11 100644 --- a/common/src/comp/inventory/loadout_builder.rs +++ b/common/src/comp/inventory/loadout_builder.rs @@ -184,9 +184,7 @@ fn default_main_tool(body: &Body) -> Item { quadruped_medium::Species::Tuskram | quadruped_medium::Species::Roshwalr | quadruped_medium::Species::Moose - | quadruped_medium::Species::Dreadhorn - | quadruped_medium::Species::Mammoth - | quadruped_medium::Species::Ngoubou => Some(Item::new_from_asset_expect( + | quadruped_medium::Species::Dreadhorn => Some(Item::new_from_asset_expect( "common.items.npc_weapons.unique.quadmedcharge", )), quadruped_medium::Species::Highland @@ -296,9 +294,12 @@ fn default_main_tool(body: &Body) -> Item { (biped_large::Species::Blueoni, _) => Some(Item::new_from_asset_expect( "common.items.npc_weapons.axe.oni_blue_axe", )), - (biped_large::Species::Redoni | biped_large::Species::Cultistwarlord, _) => Some( - Item::new_from_asset_expect("common.items.npc_weapons.hammer.oni_red_hammer"), - ), + (biped_large::Species::Redoni, _) => Some(Item::new_from_asset_expect( + "common.items.npc_weapons.hammer.oni_red_hammer", + )), + (biped_large::Species::Cultistwarlord, _) => Some(Item::new_from_asset_expect( + "common.items.weapons.sword.bipedlarge-cultist", + )), }, Body::Object(body) => match body { object::Body::Crossbow => Some(Item::new_from_asset_expect( diff --git a/server/src/events/entity_manipulation.rs b/server/src/events/entity_manipulation.rs index 1dfba60f4e..4f640bd1bc 100644 --- a/server/src/events/entity_manipulation.rs +++ b/server/src/events/entity_manipulation.rs @@ -421,6 +421,12 @@ pub fn handle_destroy(server: &mut Server, entity: EcsEntity, cause: HealthSourc | quadruped_medium::Species::Yak => { "common.loot_tables.creature.quad_medium.gentle" }, + quadruped_medium::Species::Ngoubou => { + "common.loot_tables.creature.quad_medium.horned" + }, + quadruped_medium::Species::Mammoth => { + "common.loot_tables.creature.quad_medium.mammoth" + }, _ => "common.loot_tables.creature.quad_medium.fanged", }, Some(common::comp::Body::BirdMedium(_)) => { diff --git a/server/src/migrations/V41_remove_warlock_warlord.sql b/server/src/migrations/V41_remove_warlock_warlord.sql new file mode 100644 index 0000000000..e445c8a50d --- /dev/null +++ b/server/src/migrations/V41_remove_warlock_warlord.sql @@ -0,0 +1,33 @@ +-- xx +UPDATE item +SET item_definition_id = 'common.items.armor.warlock.shoulder' WHERE item_definition_id = 'common.items.armor.cultist.shoulder'; +UPDATE item +SET item_definition_id = 'common.items.armor.warlock.chest' WHERE item_definition_id = 'common.items.armor.cultist.chest'; +UPDATE item +SET item_definition_id = 'common.items.armor.warlock.belt' WHERE item_definition_id = 'common.items.armor.cultist.belt'; +UPDATE item +SET item_definition_id = 'common.items.armor.warlock.hand' WHERE item_definition_id = 'common.items.armor.cultist.hand'; +UPDATE item +SET item_definition_id = 'common.items.armor.warlock.pants' WHERE item_definition_id = 'common.items.armor.cultist.pants'; +UPDATE item +SET item_definition_id = 'common.items.armor.warlock.foot' WHERE item_definition_id = 'common.items.armor.cultist.foot'; +UPDATE item +SET item_definition_id = 'common.items.armor.warlock.back' WHERE item_definition_id = 'common.items.armor.misc.back.dungeon_purple'; +UPDATE item +SET item_definition_id = 'common.items.armor.warlock.head' WHERE item_definition_id = 'common.items.armor.cultist.head'; +UPDATE item +SET item_definition_id = 'common.items.armor.warlord.shoulder' WHERE item_definition_id = 'common.items.armor.cultist.shoulder'; +UPDATE item +SET item_definition_id = 'common.items.armor.warlord.chest' WHERE item_definition_id = 'common.items.armor.cultist.chest'; +UPDATE item +SET item_definition_id = 'common.items.armor.warlord.belt' WHERE item_definition_id = 'common.items.armor.cultist.belt'; +UPDATE item +SET item_definition_id = 'common.items.armor.warlord.hand' WHERE item_definition_id = 'common.items.armor.cultist.hand'; +UPDATE item +SET item_definition_id = 'common.items.armor.warlord.pants' WHERE item_definition_id = 'common.items.armor.cultist.pants'; +UPDATE item +SET item_definition_id = 'common.items.armor.warlord.foot' WHERE item_definition_id = 'common.items.armor.cultist.foot'; +UPDATE item +SET item_definition_id = 'common.items.armor.warlord.back' WHERE item_definition_id = 'common.items.armor.misc.back.dungeon_purple'; +UPDATE item +SET item_definition_id = 'common.items.armor.warlord.head' WHERE item_definition_id = 'common.items.armor.cultist.head'; \ No newline at end of file diff --git a/voxygen/anim/src/biped_large/mod.rs b/voxygen/anim/src/biped_large/mod.rs index 74548f9e7c..567df6f2b7 100644 --- a/voxygen/anim/src/biped_large/mod.rs +++ b/voxygen/anim/src/biped_large/mod.rs @@ -157,6 +157,7 @@ pub struct SkeletonAttr { bc: (f32, f32, f32, f32, f32, f32), beast: bool, float: bool, + height: f32, } impl<'a> std::convert::TryFrom<&'a comp::Body> for SkeletonAttr { @@ -199,6 +200,7 @@ impl Default for SkeletonAttr { bc: (0.0, 0.0, 0.0, 0.0, 0.0, 0.0), beast: false, float: false, + height: 0.0, } } } @@ -443,7 +445,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { (Harvester, _) => (7.5, 0.0), (Blueoni, _) => (12.5, 0.0), (Redoni, _) => (12.5, 0.0), - (Cultistwarlord, _) => (12.5, 0.0), + (Cultistwarlord, _) => (8.0, 0.0), }, shl: match (body.species, body.body_type) { (Dullahan, _) => (-4.75, -11.0, 8.5, 1.47, -0.2, 0.0), @@ -504,6 +506,7 @@ impl<'a> From<&'a Body> for SkeletonAttr { }, beast: matches!((body.species, body.body_type), (Werewolf, _)), float: matches!((body.species, body.body_type), (Mindflayer, _)), + height: comp::Body::BipedLarge(*body).dimensions().z, } } } diff --git a/voxygen/anim/src/biped_large/shockwave.rs b/voxygen/anim/src/biped_large/shockwave.rs index 81d373014a..07614db1d6 100644 --- a/voxygen/anim/src/biped_large/shockwave.rs +++ b/voxygen/anim/src/biped_large/shockwave.rs @@ -62,7 +62,7 @@ impl Animation for ShockwaveAnimation { next.hand_r.orientation = Quaternion::rotation_x(0.0); match active_tool_kind { - Some(ToolKind::Sceptre) => { + Some(ToolKind::Sceptre | ToolKind::Staff) => { next.head.position = Vec3::new(0.0, s_a.head.0, s_a.head.1); next.hand_l.position = Vec3::new(s_a.sthl.0, s_a.sthl.1, s_a.sthl.2); diff --git a/voxygen/anim/src/biped_large/shoot.rs b/voxygen/anim/src/biped_large/shoot.rs index c5fba1b268..bcebd91075 100644 --- a/voxygen/anim/src/biped_large/shoot.rs +++ b/voxygen/anim/src/biped_large/shoot.rs @@ -156,18 +156,19 @@ impl Animation for ShootAnimation { next.control.position = Vec3::new( -1.0 + move1 * 2.0, 6.0 + s_a.grip.0 / 1.2 + move1 * 7.0, - -5.0 + -s_a.grip.0 / 2.0 + move1 * 8.0, + -5.0 + -s_a.grip.0 / 2.0 + move1 * s_a.height * 2.8, ); next.control_l.orientation = - Quaternion::rotation_x(PI / 2.0 + move2 * 0.4) * Quaternion::rotation_y(-0.2); + Quaternion::rotation_x(move1 * 0.2 + PI / 2.0 + move2 * 0.4) + * Quaternion::rotation_y(-0.2); next.control_r.orientation = Quaternion::rotation_x(PI / 2.2 + move1 * 0.4) - * Quaternion::rotation_y(0.2) + * Quaternion::rotation_y(0.4) * Quaternion::rotation_z(0.0); next.control.orientation = Quaternion::rotation_x(-0.2) * Quaternion::rotation_y(1.0 + move1 * -0.4) - * Quaternion::rotation_z(-0.3); + * Quaternion::rotation_z(-0.1); next.head.orientation = Quaternion::rotation_z(move1 * 0.25); next.shoulder_l.position = Vec3::new( -s_a.shoulder.0, @@ -175,7 +176,7 @@ impl Animation for ShootAnimation { s_a.shoulder.2 - foothorir * 1.0, ); next.shoulder_l.orientation = - Quaternion::rotation_x(move1 * 0.8 + 1.2 * speednorm + (footrotr * -0.2)); + Quaternion::rotation_x(move1 * 1.2 + 1.2 * speednorm + (footrotr * -0.2)); next.shoulder_r.position = Vec3::new( s_a.shoulder.0, diff --git a/world/src/site/dungeon/mod.rs b/world/src/site/dungeon/mod.rs index bfbfe39a9d..fa228fa181 100644 --- a/world/src/site/dungeon/mod.rs +++ b/world/src/site/dungeon/mod.rs @@ -990,7 +990,8 @@ fn enemy_5(dynamic_rng: &mut impl Rng, entity: EntityInfo) -> EntityInfo { .with_body(comp::Body::Object(comp::object::Body::Crossbow)) .with_asset_expect("common.entity.dungeon.tier-5.turret"), 1 => entity.with_asset_expect("common.entity.dungeon.tier-5.warlock"), - _ => entity.with_asset_expect("common.entity.dungeon.tier-5.warlord"), + 2 => entity.with_asset_expect("common.entity.dungeon.tier-5.warlord"), + _ => entity.with_asset_expect("common.entity.dungeon.tier-5.cultist"), } }