Merge branch 'balance_tweaks' into 'master'

Balance tweaks

See merge request veloren/veloren!3257
This commit is contained in:
Samuel Keiffer 2022-04-23 14:54:01 +00:00
commit c6066d7f3f
75 changed files with 449 additions and 224 deletions

View File

@ -114,6 +114,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Creatures will now defend their pets - Creatures will now defend their pets
- [WorldGen] Change path colors - [WorldGen] Change path colors
- Render item drops instead of placeholder textures - Render item drops instead of placeholder textures
- Arthropods are rebalanced
- Slight hat item rebalance (hats are more specialized and befitting of their rarity rank)
- Harvester boss buffed in stats
### Removed ### Removed

View File

@ -186,6 +186,8 @@
secondary: "common.abilities.custom.tidalwarrior.totem_wave", secondary: "common.abilities.custom.tidalwarrior.totem_wave",
abilities: [], abilities: [],
), ),
// Note: Consider making a ranking system once we get more entities
// TODO: Make all purple item droppers have purple CR and a unique skillset
Custom("Quad Med Quick"): ( Custom("Quad Med Quick"): (
primary: "common.abilities.custom.quadmedquick.triplestrike", primary: "common.abilities.custom.quadmedquick.triplestrike",
secondary: "common.abilities.custom.quadmedquick.dash", secondary: "common.abilities.custom.quadmedquick.dash",
@ -279,30 +281,41 @@
secondary: "common.abilities.custom.theropodbasic.dash", secondary: "common.abilities.custom.theropodbasic.dash",
abilities: [], abilities: [],
), ),
Custom("Arthropod Basic"): ( // Arthropods
primary: "common.abilities.custom.arthropodbasic.singlestrike", Custom("Antlion"): (
secondary: "common.abilities.custom.arthropodbasic.ensnaringweb", primary: "common.abilities.custom.arthropods.antlion.singlestrike",
secondary: "common.abilities.custom.arthropods.antlion.charge",
abilities: [], abilities: [],
), ),
Custom("Arthropod Leap"): ( Custom("Black Widow"): (
primary: "common.abilities.custom.arthropodbasic.singlestrike", primary: "common.abilities.custom.arthropods.blackwidow.singlestrike",
secondary: "common.abilities.custom.arthropodbasic.ensnaringweb", secondary: "common.abilities.custom.arthropods.blackwidow.ensnaringwebs",
abilities: [ abilities: [
(None, "common.abilities.custom.arthropodbasic.leap"), (None, "common.abilities.custom.arthropods.blackwidow.poisonball"),
], ],
), ),
Custom("Arthropod Ranged"): ( Custom("Horn Beetle"): (
primary: "common.abilities.custom.arthropodranged.singlestrike", primary: "common.abilities.custom.arthropods.hornbeetle.singlestrike",
secondary: "common.abilities.custom.arthropodranged.ensnaringweb", secondary: "common.abilities.custom.arthropods.hornbeetle.harden",
abilities: [ abilities: [
(None, "common.abilities.custom.arthropodranged.poisonball"), (None, "common.abilities.custom.arthropods.hornbeetle.leap"),
], ],
), ),
Custom("Arthropod Charge"): ( Custom("Tarantula"): (
primary: "common.abilities.custom.arthropodcharge.singlestrike", primary: "common.abilities.custom.arthropods.tarantula.singlestrike",
secondary: "common.abilities.custom.arthropodcharge.charge", secondary: "common.abilities.custom.arthropods.tarantula.ensnaringwebs",
abilities: [], abilities: [
(None, "common.abilities.custom.arthropods.tarantula.leap"),
],
), ),
Custom("Weevil"): (
primary: "common.abilities.custom.arthropods.weevil.singlestrike",
secondary: "common.abilities.custom.arthropods.weevil.harden",
abilities: [
(None, "common.abilities.custom.arthropods.weevil.threadshot"),
],
),
/// TODO: Organize the rest into further catagories and give purple tier droppers+ custom skillsets
Custom("Turret"): ( Custom("Turret"): (
primary: "common.abilities.custom.turret.arrows", primary: "common.abilities.custom.turret.arrows",
secondary: "common.abilities.custom.turret.arrows", secondary: "common.abilities.custom.turret.arrows",

View File

@ -2,27 +2,27 @@ DashMelee(
energy_cost: 0, energy_cost: 0,
melee_constructor: ( melee_constructor: (
kind: Stab( kind: Stab(
damage: 12.0, damage: 15.0,
poise: 25.0, poise: 20.0,
knockback: 10.0, knockback: 10.0,
energy_regen: 0.0, energy_regen: 0.0,
), ),
scaled: Some(Stab( scaled: Some(Stab(
damage: 50.0, damage: 60.0,
poise: 100.0, poise: 45.0,
knockback: 30.0, knockback: 25.0,
energy_regen: 0.0, energy_regen: 0.0,
)), )),
range: 5.0, range: 5.0,
angle: 90.0, angle: 90.0,
), ),
energy_drain: 0, energy_drain: 0,
forward_speed: 5.0, forward_speed: 3.0,
buildup_duration: 0.3, buildup_duration: 0.3,
charge_duration: 4.0, charge_duration: 4.0,
swing_duration: 0.1, swing_duration: 0.1,
recover_duration: 0.4, recover_duration: 0.4,
ori_modifier: 0.3, ori_modifier: 0.1,
charge_through: false, charge_through: false,
is_interruptible: false, is_interruptible: false,
) )

View File

@ -0,0 +1,34 @@
ComboMelee(
stage_data: [
(
stage: 1,
base_damage: 37,
damage_increase: 0,
base_poise_damage: 27.5,
poise_damage_increase: 0,
knockback: 9.0,
range: 3.0,
angle: 60.0,
base_buildup_duration: 0.7,
base_swing_duration: 0.1,
hit_timing: 0.5,
base_recover_duration: 0.4,
forward_movement: 1.0,
damage_kind: Crushing,
damage_effect: Some(Buff((
kind: Ensnared,
dur_secs: 6.0,
strength: DamageFraction(0.1),
chance: 0.6,
))),
),
],
initial_energy_gain: 0,
max_energy_gain: 0,
energy_increase: 0,
speed_increase: 0.0,
max_speed_increase: 0.0,
scales_from_combo: 0,
is_interruptible: false,
ori_modifier: 0.8,
)

View File

@ -1,8 +1,8 @@
SpriteSummon( SpriteSummon(
buildup_duration: 0.6, buildup_duration: 0.5,
cast_duration: 0.4, cast_duration: 0.4,
recover_duration: 0.3, recover_duration: 0.3,
sprite: EnsnaringWeb, sprite: EnsnaringWeb,
summon_distance: (0, 8), summon_distance: (0, 10),
sparseness: 0.67, sparseness: 0.76,
) )

View File

@ -1,19 +1,19 @@
BasicRanged( BasicRanged(
energy_cost: 0, energy_cost: 0,
buildup_duration: 0.8, buildup_duration: 0.6,
recover_duration: 0.35, recover_duration: 0.35,
projectile: Poisonball( projectile: Poisonball(
damage: 26.0, damage: 25.0,
radius: 5.0, radius: 3.0,
energy_regen: 0, energy_regen: 0,
min_falloff: 0.5, min_falloff: 0.2,
), ),
projectile_body: Object(SpitPoison), projectile_body: Object(SpitPoison),
/*projectile_light: Some(LightEmitter { /*projectile_light: Some(LightEmitter {
col: (1.0, 0.75, 0.11).into(), col: (1.0, 0.75, 0.11).into(),
..Default::default() ..Default::default()
}),*/ }),*/
projectile_speed: 70.0, projectile_speed: 260.0,
num_projectiles: 3, num_projectiles: 3,
projectile_spread: 0.2, projectile_spread: 0.3,
) )

View File

@ -2,11 +2,11 @@ ComboMelee(
stage_data: [ stage_data: [
( (
stage: 1, stage: 1,
base_damage: 60, base_damage: 25,
damage_increase: 0, damage_increase: 0,
base_poise_damage: 28, base_poise_damage: 16,
poise_damage_increase: 0, poise_damage_increase: 0,
knockback: 3.0, knockback: 2.0,
range: 3.0, range: 3.0,
angle: 60.0, angle: 60.0,
base_buildup_duration: 0.4, base_buildup_duration: 0.4,
@ -14,12 +14,12 @@ ComboMelee(
hit_timing: 0.5, hit_timing: 0.5,
base_recover_duration: 0.4, base_recover_duration: 0.4,
forward_movement: 1.0, forward_movement: 1.0,
damage_kind: Crushing, damage_kind: Piercing,
damage_effect: Some(Buff(( damage_effect: Some(Buff((
kind: Poisoned, kind: Poisoned,
dur_secs: 10.0, dur_secs: 7.0,
strength: DamageFraction(1.0), strength: DamageFraction(0.6),
chance: 1.0, chance: 0.4,
))), ))),
), ),
], ],
@ -30,5 +30,5 @@ ComboMelee(
max_speed_increase: 0.0, max_speed_increase: 0.0,
scales_from_combo: 0, scales_from_combo: 0,
is_interruptible: false, is_interruptible: false,
ori_modifier: 0.7, ori_modifier: 0.8,
) )

View File

@ -0,0 +1,9 @@
SelfBuff(
buildup_duration: 0.4,
cast_duration: 0.8,
recover_duration: 0.3,
buff_kind: ProtectingWard,
buff_strength: 1.5,
buff_duration: Some(10.0),
energy_cost: 0,
)

View File

@ -6,8 +6,8 @@ LeapMelee(
recover_duration: 0.2, recover_duration: 0.2,
melee_constructor: ( melee_constructor: (
kind: Bash( kind: Bash(
damage: 120.0, damage: 30.0,
poise: 60.0, poise: 20.0,
knockback: 4.0, knockback: 4.0,
energy_regen: 0.0, energy_regen: 0.0,
), ),
@ -15,5 +15,5 @@ LeapMelee(
angle: 180.0, angle: 180.0,
), ),
forward_leap_strength: 40.0, forward_leap_strength: 40.0,
vertical_leap_strength: 10.0, vertical_leap_strength: 7.5,
) )

View File

@ -0,0 +1,28 @@
ComboMelee(
stage_data: [
(
stage: 1,
base_damage: 27,
damage_increase: 0,
base_poise_damage: 20,
poise_damage_increase: 0,
knockback: 5.0,
range: 3.0,
angle: 60.0,
base_buildup_duration: 0.4,
base_swing_duration: 0.1,
hit_timing: 0.5,
base_recover_duration: 0.4,
forward_movement: 1.0,
damage_kind: Crushing,
),
],
initial_energy_gain: 0,
max_energy_gain: 0,
energy_increase: 0,
speed_increase: 0.0,
max_speed_increase: 0.0,
scales_from_combo: 0,
is_interruptible: false,
ori_modifier: 0.5,
)

View File

@ -1,8 +1,8 @@
SpriteSummon( SpriteSummon(
buildup_duration: 0.6, buildup_duration: 0.5,
cast_duration: 0.4, cast_duration: 0.4,
recover_duration: 0.3, recover_duration: 0.3,
sprite: EnsnaringWeb, sprite: EnsnaringWeb,
summon_distance: (0, 8), summon_distance: (0, 9),
sparseness: 0.67, sparseness: 0.8,
) )

View File

@ -0,0 +1,19 @@
LeapMelee(
energy_cost: 0,
buildup_duration: 0.5,
movement_duration: 0.4,
swing_duration: 0.075,
recover_duration: 0.2,
melee_constructor: (
kind: Bash(
damage: 35.0,
poise: 30.0,
knockback: 1.0,
energy_regen: 0.0,
),
range: 4.5,
angle: 180.0,
),
forward_leap_strength: 25.0,
vertical_leap_strength: 10.0,
)

View File

@ -2,9 +2,9 @@ ComboMelee(
stage_data: [ stage_data: [
( (
stage: 1, stage: 1,
base_damage: 70, base_damage: 30,
damage_increase: 0, damage_increase: 0,
base_poise_damage: 28, base_poise_damage: 21,
poise_damage_increase: 0, poise_damage_increase: 0,
knockback: 3.0, knockback: 3.0,
range: 3.0, range: 3.0,
@ -14,12 +14,12 @@ ComboMelee(
hit_timing: 0.5, hit_timing: 0.5,
base_recover_duration: 0.4, base_recover_duration: 0.4,
forward_movement: 1.0, forward_movement: 1.0,
damage_kind: Crushing, damage_kind: Piercing,
damage_effect: Some(Buff(( damage_effect: Some(Buff((
kind: Poisoned, kind: Poisoned,
dur_secs: 10.0, dur_secs: 9.0,
strength: DamageFraction(1.0), strength: DamageFraction(0.7),
chance: 1.0, chance: 0.8,
))), ))),
), ),
], ],
@ -30,5 +30,5 @@ ComboMelee(
max_speed_increase: 0.0, max_speed_increase: 0.0,
scales_from_combo: 0, scales_from_combo: 0,
is_interruptible: false, is_interruptible: false,
ori_modifier: 0.7, ori_modifier: 0.8,
) )

View File

@ -0,0 +1,9 @@
SelfBuff(
buildup_duration: 0.4,
cast_duration: 0.8,
recover_duration: 0.3,
buff_kind: ProtectingWard,
buff_strength: 1.2,
buff_duration: Some(10.0),
energy_cost: 0,
)

View File

@ -2,9 +2,9 @@ ComboMelee(
stage_data: [ stage_data: [
( (
stage: 1, stage: 1,
base_damage: 40, base_damage: 22,
damage_increase: 0, damage_increase: 0,
base_poise_damage: 15, base_poise_damage: 14,
poise_damage_increase: 0, poise_damage_increase: 0,
knockback: 3.0, knockback: 3.0,
range: 3.0, range: 3.0,
@ -15,12 +15,6 @@ ComboMelee(
base_recover_duration: 0.4, base_recover_duration: 0.4,
forward_movement: 1.0, forward_movement: 1.0,
damage_kind: Crushing, damage_kind: Crushing,
damage_effect: Some(Buff((
kind: Poisoned,
dur_secs: 10.0,
strength: DamageFraction(1.0),
chance: 1.0,
))),
), ),
], ],
initial_energy_gain: 0, initial_energy_gain: 0,
@ -30,5 +24,5 @@ ComboMelee(
max_speed_increase: 0.0, max_speed_increase: 0.0,
scales_from_combo: 0, scales_from_combo: 0,
is_interruptible: false, is_interruptible: false,
ori_modifier: 0.7, ori_modifier: 0.6,
) )

View File

@ -0,0 +1,19 @@
BasicBeam(
buildup_duration: 0.2,
recover_duration: 0.2,
beam_duration: 1.0,
damage: 0.6,
tick_rate: 15.0,
range: 30.0,
max_angle: 1.0,
damage_effect: Some(Buff((
kind: Frozen,
dur_secs: 4.0,
strength: DamageFraction(1.0),
chance: 1.0,
))),
energy_regen: 0.0,
energy_drain: 0,
ori_rate: 0.95,
specifier: WebStrand,
)

View File

@ -3,7 +3,7 @@ BasicRanged(
buildup_duration: 0.5, buildup_duration: 0.5,
recover_duration: 0.8, recover_duration: 0.8,
projectile: ExplodingPumpkin( projectile: ExplodingPumpkin(
damage: 20.0, damage: 25.0,
knockback: 25.0, knockback: 25.0,
radius: 5.0, radius: 5.0,
min_falloff: 0.6, min_falloff: 0.6,

View File

@ -1,19 +1,19 @@
BasicBeam( BasicBeam(
buildup_duration: 0.5, buildup_duration: 0.7,
recover_duration: 0.5, recover_duration: 0.6,
beam_duration: 1.0, beam_duration: 1.0,
damage: 4.0, damage: 6.0,
tick_rate: 1.5, tick_rate: 1.5,
range: 20.0, range: 20.0,
max_angle: 15.0, max_angle: 15.0,
damage_effect: Some(Buff(( damage_effect: Some(Buff((
kind: Burning, kind: Burning,
dur_secs: 10.0, dur_secs: 10.0,
strength: DamageFraction(0.5), strength: DamageFraction(1.0),
chance: 0.25, chance: 1.0,
))), ))),
energy_regen: 0, energy_regen: 0,
energy_drain: 0, energy_drain: 0,
ori_rate: 0.2, ori_rate: 0.3,
specifier: Flamethrower, specifier: Flamethrower,
) )

View File

@ -1,11 +1,11 @@
BasicMelee( BasicMelee(
energy_cost: 0, energy_cost: 0,
buildup_duration: 0.7, buildup_duration: 0.6,
swing_duration: 0.1, swing_duration: 0.1,
recover_duration: 0.6, recover_duration: 0.6,
melee_constructor: ( melee_constructor: (
kind: Slash( kind: Slash(
damage: 7.0, damage: 14.0,
poise: 10.0, poise: 10.0,
knockback: 10.0, knockback: 10.0,
energy_regen: 0.0, energy_regen: 0.0,

View File

@ -14,6 +14,6 @@ BasicBeam(
))), ))),
energy_regen: 0, energy_regen: 0,
energy_drain: 0, energy_drain: 0,
ori_rate: 0.2, ori_rate: 0.5,
specifier: Cultist, specifier: Cultist,
) )

View File

@ -12,6 +12,12 @@ BasicMelee(
), ),
range: 5.0, range: 5.0,
angle: 60.0, angle: 60.0,
damage_effect: Some(Buff((
kind: Crippled,
dur_secs: 10.0,
strength: Value(0.5),
chance: 1.0,
))),
), ),
ori_modifier: 1.0, ori_modifier: 1.0,
) )

View File

@ -4,7 +4,7 @@
name: Name("Gnarling Chieftain"), name: Name("Gnarling Chieftain"),
body: RandomWith("gnarling"), body: RandomWith("gnarling"),
alignment: Alignment(Enemy), alignment: Alignment(Enemy),
loot: LootTable("common.loot_tables.dungeon.tier-0.boss"), loot: LootTable("common.loot_tables.dungeon.tier-0.chieftain"),
inventory: ( inventory: (
loadout: Inline(( loadout: Inline((
inherit: Asset("common.loadout.dungeon.gnarling.chieftain"), inherit: Asset("common.loadout.dungeon.gnarling.chieftain"),

View File

@ -3,7 +3,7 @@
name: Name("Harvester"), name: Name("Harvester"),
body: RandomWith("harvester"), body: RandomWith("harvester"),
alignment: Alignment(Enemy), alignment: Alignment(Enemy),
loot: LootTable("common.loot_tables.dungeon.tier-0.boss"), loot: LootTable("common.loot_tables.dungeon.tier-0.harvester"),
inventory: ( inventory: (
loadout: FromBody, loadout: FromBody,
), ),

View File

@ -3,7 +3,7 @@
name: Automatic, name: Automatic,
body: RandomWith("antlion"), body: RandomWith("antlion"),
alignment: Alignment(Enemy), alignment: Alignment(Enemy),
loot: LootTable("common.loot_tables.creature.arthropod.carapace"), loot: LootTable("common.loot_tables.creature.arthropod.antlion"),
inventory: ( inventory: (
loadout: FromBody, loadout: FromBody,
), ),

View File

@ -6,7 +6,7 @@
body_type: Male, body_type: Male,
))), ))),
alignment: Alignment(Enemy), alignment: Alignment(Enemy),
loot: LootTable("common.loot_tables.creature.quad_medium.ice"), loot: LootTable("common.loot_tables.creature.quad_medium.roshwalr"),
inventory: ( inventory: (
loadout: FromBody, loadout: FromBody,
), ),

View File

@ -3,7 +3,7 @@
name: Automatic, name: Automatic,
body: RandomWith("tarantula"), body: RandomWith("tarantula"),
alignment: Alignment(Enemy), alignment: Alignment(Enemy),
loot: LootTable("common.loot_tables.creature.arthropod.web"), loot: LootTable("common.loot_tables.creature.arthropod.tarantula"),
inventory: ( inventory: (
loadout: FromBody, loadout: FromBody,
), ),

View File

@ -4,11 +4,10 @@ ItemDef(
kind: Armor(( kind: Armor((
kind: Head("Merchant"), kind: Head("Merchant"),
stats: ( stats: (
protection: Some(Normal(6.0)), protection: Some(Normal(5.0)),
poise_resilience: Some(Normal(4.0)), poise_resilience: Some(Normal(2.0)),
energy_max: Some(12.0), energy_max: Some(11.0),
energy_reward: Some(0.25), energy_reward: Some(0.065),
crit_power: Some(0.015),
), ),
)), )),
quality: Epic, quality: Epic,

View File

@ -4,9 +4,7 @@ ItemDef(
kind: Armor(( kind: Armor((
kind: Head("BambooTwig"), kind: Head("BambooTwig"),
stats: ( stats: (
poise_resilience: Some(Normal(2.0)), energy_reward: Some(0.033),
energy_reward: Some(0.06),
crit_power: Some(0.005),
), ),
)), )),
quality: Common, quality: Common,

View File

@ -4,7 +4,7 @@ ItemDef(
kind: Armor(( kind: Armor((
kind: Head("Red"), kind: Head("Red"),
stats: ( stats: (
crit_power: Some(0.08), crit_power: Some(0.008),
stealth: Some(0.15), stealth: Some(0.15),
), ),
)), )),

View File

@ -4,7 +4,7 @@ ItemDef(
kind: Armor(( kind: Armor((
kind: Head("Thief"), kind: Head("Thief"),
stats: ( stats: (
crit_power: Some(0.07), crit_power: Some(0.006),
stealth: Some(0.18), stealth: Some(0.18),
), ),
)), )),

View File

@ -7,8 +7,7 @@ ItemDef(
protection: Some(Normal(12.0)), protection: Some(Normal(12.0)),
poise_resilience: Some(Normal(2.0)), poise_resilience: Some(Normal(2.0)),
energy_max: Some(5.0), energy_max: Some(5.0),
energy_reward: Some(0.05), crit_power: Some(0.03),
crit_power: Some(0.01),
), ),
)), )),
quality: Epic, quality: Epic,

View File

@ -6,7 +6,7 @@ ItemDef(
stats: ( stats: (
protection: Some(Normal(5.0)), protection: Some(Normal(5.0)),
poise_resilience: Some(Normal(-1.0)), poise_resilience: Some(Normal(-1.0)),
crit_power: Some(0.007), crit_power: Some(0.014),
stealth: Some(0.35), stealth: Some(0.35),
), ),
)), )),

View File

@ -4,9 +4,8 @@ ItemDef(
kind: Armor(( kind: Armor((
kind: Head("Hood"), kind: Head("Hood"),
stats: ( stats: (
protection: Some(Normal(6.0)), protection: Some(Normal(3.0)),
poise_resilience: Some(Normal(1.0)), crit_power: Some(0.021),
crit_power: Some(0.01),
stealth: Some(0.22), stealth: Some(0.22),
), ),
)), )),

View File

@ -4,10 +4,9 @@ ItemDef(
kind: Armor(( kind: Armor((
kind: Head("DarkHood"), kind: Head("DarkHood"),
stats: ( stats: (
protection: Some(Normal(7.0)), protection: Some(Normal(6.0)),
poise_resilience: Some(Normal(1.0)), poise_resilience: Some(Normal(1.0)),
crit_power: Some(0.008), stealth: Some(0.2),
stealth: Some(0.15),
), ),
)), )),
quality: Moderate, quality: Moderate,

View File

@ -4,10 +4,9 @@ ItemDef(
kind: Armor(( kind: Armor((
kind: Head("Mitre"), kind: Head("Mitre"),
stats: ( stats: (
protection: Some(Normal(4.0)), poise_resilience: Some(Normal(1.5)),
energy_max: Some(8.0), energy_max: Some(7.0),
energy_reward: Some(0.1), energy_reward: Some(0.06),
crit_power: Some(0.01),
), ),
)), )),
quality: High, quality: High,

View File

@ -6,7 +6,7 @@ ItemDef(
stats: ( stats: (
protection: Some(Normal(9.0)), protection: Some(Normal(9.0)),
poise_resilience: Some(Normal(3.0)), poise_resilience: Some(Normal(3.0)),
crit_power: Some(0.01), crit_power: Some(0.073),
stealth: Some(-0.5), stealth: Some(-0.5),
), ),
)), )),

View File

@ -5,7 +5,7 @@ ItemDef(
kind: Head("Straw"), kind: Head("Straw"),
stats: ( stats: (
energy_max: Some(4.0), energy_max: Some(4.0),
energy_reward: Some(0.04), energy_reward: Some(0.02),
), ),
)), )),
quality: Common, quality: Common,

View File

@ -4,12 +4,9 @@ ItemDef(
kind: Armor(( kind: Armor((
kind: Head("WanderersHat"), kind: Head("WanderersHat"),
stats: ( stats: (
protection: Some(Normal(3.0)),
poise_resilience: Some(Normal(1.0)), poise_resilience: Some(Normal(1.0)),
energy_max: Some(1.0), crit_power: Some(0.033),
energy_reward: Some(0.02), stealth: Some(0.2),
crit_power: Some(0.01),
stealth: Some(0.05),
), ),
)), )),
quality: High, quality: High,

View File

@ -5,11 +5,10 @@ ItemDef(
kind: Head("WingedCoronet"), kind: Head("WingedCoronet"),
stats: ( stats: (
protection: Some(Normal(2.0)), protection: Some(Normal(2.0)),
poise_resilience: Some(Normal(0.0)), energy_max: Some(4.0),
energy_max: Some(8.0), energy_reward: Some(0.037),
energy_reward: Some(0.05),
crit_power: Some(0.015), crit_power: Some(0.015),
stealth: Some(0.5), stealth: Some(0.18),
), ),
)), )),
quality: High, quality: High,

View File

@ -5,10 +5,8 @@ ItemDef(
kind: Head("Pirate"), kind: Head("Pirate"),
stats: ( stats: (
protection: Some(Normal(4.0)), protection: Some(Normal(4.0)),
poise_resilience: Some(Normal(1.0)), energy_reward: Some(0.025),
energy_max: Some(1.0), crit_power: Some(0.1),
energy_reward: Some(0.015),
crit_power: Some(0.02),
), ),
)), )),
quality: High, quality: High,

View File

@ -4,11 +4,10 @@ ItemDef(
kind: Armor(( kind: Armor((
kind: Head("Witch"), kind: Head("Witch"),
stats: ( stats: (
protection: Some(Normal(4.0)), protection: Some(Normal(2.0)),
poise_resilience: Some(Normal(3.0)), poise_resilience: Some(Normal(1.5)),
energy_max: Some(12.0), energy_max: Some(8.0),
energy_reward: Some(0.4), energy_reward: Some(0.084),
crit_power: Some(0.01),
), ),
)), )),
quality: Epic, quality: Epic,

View File

@ -9,6 +9,6 @@ ItemDef(
flicker_thousandths: 600, flicker_thousandths: 600,
), ),
), ),
quality: Legendary, quality: High,
tags: [Utility], tags: [Utility],
) )

View File

@ -4,7 +4,7 @@ ItemDef(
kind: Armor(( kind: Armor((
kind: Chest("Arthropod"), kind: Chest("Arthropod"),
stats: ( stats: (
protection: Some(Normal(100.0)), protection: Some(Normal(60.0)),
poise_resilience: Some(Normal(1.0)), poise_resilience: Some(Normal(1.0)),
), ),
)), )),

View File

@ -4,7 +4,7 @@ ItemDef(
kind: Armor(( kind: Armor((
kind: Chest("QuadrupedLowShell"), kind: Chest("QuadrupedLowShell"),
stats: ( stats: (
protection: Some(Normal(750.0)), protection: Some(Normal(320.0)),
poise_resilience: Some(Normal(0.0)), poise_resilience: Some(Normal(0.0)),
), ),
)), )),

View File

@ -1,5 +1,5 @@
ItemDef( ItemDef(
name: "Arthropod Leap", name: "Antlion",
description: "testing123", description: "testing123",
kind: Tool(( kind: Tool((
kind: Natural, kind: Natural,
@ -15,7 +15,7 @@ ItemDef(
buff_strength: 1.0, buff_strength: 1.0,
)), )),
)), )),
quality: Low, quality: Epic,
tags: [], tags: [],
ability_spec: Some(Custom("Arthropod Leap")), ability_spec: Some(Custom("Antlion")),
) )

View File

@ -1,5 +1,5 @@
ItemDef( ItemDef(
name: "Arthropod Basic", name: "Black Widow",
description: "testing123", description: "testing123",
kind: Tool(( kind: Tool((
kind: Natural, kind: Natural,
@ -15,7 +15,7 @@ ItemDef(
buff_strength: 1.0, buff_strength: 1.0,
)), )),
)), )),
quality: Low, quality: Epic,
tags: [], tags: [],
ability_spec: Some(Custom("Arthropod Basic")), ability_spec: Some(Custom("Black Widow")),
) )

View File

@ -0,0 +1,21 @@
ItemDef(
name: "Cave Spider",
description: "testing123",
kind: Tool((
kind: Natural,
hands: Two,
stats: Direct((
equip_time_secs: 0.01,
power: 0.6,
effect_power: 1.0,
speed: 0.6,
crit_chance: 0.1,
range: 0.8,
energy_efficiency: 1.0,
buff_strength: 0.9,
)),
)),
quality: Moderate,
tags: [],
ability_spec: Some(Custom("Black Widow")),
)

View File

@ -1,5 +1,5 @@
ItemDef( ItemDef(
name: "Arthropod Charge", name: "Horn Beetle",
description: "testing123", description: "testing123",
kind: Tool(( kind: Tool((
kind: Natural, kind: Natural,
@ -15,7 +15,7 @@ ItemDef(
buff_strength: 1.0, buff_strength: 1.0,
)), )),
)), )),
quality: Low, quality: High,
tags: [], tags: [],
ability_spec: Some(Custom("Arthropod Charge")), ability_spec: Some(Custom("Horn Beetle")),
) )

View File

@ -0,0 +1,21 @@
ItemDef(
name: "Leaf Beetle",
description: "testing123",
kind: Tool((
kind: Natural,
hands: Two,
stats: Direct((
equip_time_secs: 0.01,
power: 0.86,
effect_power: 1.0,
speed: 0.86,
crit_chance: 0.1,
range: 1.0,
energy_efficiency: 1.0,
buff_strength: 0.875,
)),
)),
quality: High,
tags: [],
ability_spec: Some(Custom("Antlion")),
)

View File

@ -0,0 +1,21 @@
ItemDef(
name: "Moss Crawler",
description: "testing123",
kind: Tool((
kind: Natural,
hands: Two,
stats: Direct((
equip_time_secs: 0.01,
power: 0.72,
effect_power: 1.0,
speed: 0.72,
crit_chance: 0.1,
range: 0.8,
energy_efficiency: 1.0,
buff_strength: 0.6,
)),
)),
quality: Moderate,
tags: [],
ability_spec: Some(Custom("Weevil")),
)

View File

@ -1,5 +1,5 @@
ItemDef( ItemDef(
name: "Arthropod Ranged", name: "Tarantula",
description: "testing123", description: "testing123",
kind: Tool(( kind: Tool((
kind: Natural, kind: Natural,
@ -15,7 +15,7 @@ ItemDef(
buff_strength: 1.0, buff_strength: 1.0,
)), )),
)), )),
quality: Low, quality: Epic,
tags: [], tags: [],
ability_spec: Some(Custom("Arthropod Ranged")), ability_spec: Some(Custom("Tarantula")),
) )

View File

@ -0,0 +1,21 @@
ItemDef(
name: "Weevil",
description: "testing123",
kind: Tool((
kind: Natural,
hands: Two,
stats: Direct((
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("Weevil")),
)

View File

@ -0,0 +1,3 @@
[
(1.0, ItemQuantity("common.items.crafting_ing.hide.carapace", 2, 5)),
]

View File

@ -0,0 +1,3 @@
[
(1.0, ItemQuantity("common.items.crafting_ing.sticky_thread", 2, 5)),
]

View File

@ -1,4 +1,4 @@
[ [
(1.0, Item("common.items.crafting_ing.hide.rugged_hide")), (1.0, Item("common.items.crafting_ing.hide.animal_hide")),
(1.0, Item("common.items.crafting_ing.animal_misc.icy_fang")), (1.0, ItemQuantity("common.items.crafting_ing.animal_misc.icy_fang", 1, 2)),
] ]

View File

@ -0,0 +1,4 @@
[
(1.0, Item("common.items.crafting_ing.hide.rugged_hide")),
(1.0, ItemQuantity("common.items.crafting_ing.animal_misc.icy_fang", 1, 2)),
]

View File

@ -0,0 +1,9 @@
[
// Weapons
(5.0, LootTable("common.loot_tables.weapons.tier-3")),
// Armor
(5.0, LootTable("common.loot_tables.armor.tier-3")),
// Misc
(3.0, Item("common.items.armor.misc.neck.scratched")),
(2.0, Item("common.items.lantern.pumpkin")),
]

View File

@ -6,5 +6,5 @@
// Nothing // Nothing
(2.0, Nothing), (2.0, Nothing),
// Placeholder Drop Location // Placeholder Drop Location
(1.0, Item("common.items.crafting_ing.sticky_thread")), (1.0, Item("common.items.crafting_ing.leather.simple_leather")),
] ]

View File

@ -1233,7 +1233,7 @@
), ),
black_widow: ( black_widow: (
keyword: "black_widow", keyword: "black_widow",
generic: "Blackwidow" generic: "Black Widow"
), ),
antlion: ( antlion: (
keyword: "antlion", keyword: "antlion",

View File

@ -74,6 +74,7 @@ const int DRIP = 32;
const int TORNADO = 33; const int TORNADO = 33;
const int DEATH = 34; const int DEATH = 34;
const int ENERGY_BUFFING = 35; const int ENERGY_BUFFING = 35;
const int WEB_STRAND = 36;
// meters per second squared (acceleration) // meters per second squared (acceleration)
const float earth_gravity = 9.807; const float earth_gravity = 9.807;
@ -579,6 +580,16 @@ void main() {
spin_in_axis(vec3(rand6, rand7, rand8), rand9 * 3) spin_in_axis(vec3(rand6, rand7, rand8), rand9 * 3)
); );
break; break;
case WEB_STRAND:
f_reflect = 0.0;
perp_axis = normalize(cross(inst_dir, vec3(0.0, 0.0, 1.0)));
attr = Attr(
inst_dir * percent(),
vec3(1.0, 1.0, 50.0),
vec4(vec3(2.0), 1),
spin_in_axis(perp_axis, asin(inst_dir.z / length(inst_dir)) + PI / 2.0)
);
break;
default: default:
attr = Attr( attr = Attr(
linear_motion( linear_motion(

View File

@ -31,6 +31,7 @@ SpawnEntry (
(2, (1, 1, "common.entity.wild.peaceful.hirdrasil")), (2, (1, 1, "common.entity.wild.peaceful.hirdrasil")),
(2, (1, 1, "common.entity.wild.peaceful.truffler")), (2, (1, 1, "common.entity.wild.peaceful.truffler")),
(2, (1, 1, "common.entity.wild.peaceful.leaf_beetle")), (2, (1, 1, "common.entity.wild.peaceful.leaf_beetle")),
(2, (1, 1, "common.entity.wild.aggressive.weevil")),
], ],
is_underwater: false, is_underwater: false,
day_period: [Morning, Noon, Evening], day_period: [Morning, Noon, Evening],

View File

@ -10,6 +10,7 @@ SpawnEntry (
(1, (1, 1, "common.entity.wild.aggressive.deadwood")), (1, (1, 1, "common.entity.wild.aggressive.deadwood")),
(1, (1, 1, "common.entity.wild.aggressive.saber")), (1, (1, 1, "common.entity.wild.aggressive.saber")),
(1, (1, 1, "common.entity.wild.aggressive.weevil")), (1, (1, 1, "common.entity.wild.aggressive.weevil")),
(1, (1, 1, "common.entity.wild.peaceful.leaf_beetle")),
], ],
is_underwater: false, is_underwater: false,
day_period: [Night, Morning, Noon, Evening], day_period: [Night, Morning, Noon, Evening],

View File

@ -9,7 +9,7 @@ SpawnEntry (
(1, (1, 1, "common.entity.wild.aggressive.icedrake")), (1, (1, 1, "common.entity.wild.aggressive.icedrake")),
(1, (1, 3, "common.entity.wild.aggressive.snow_raptor")), (1, (1, 3, "common.entity.wild.aggressive.snow_raptor")),
(1, (1, 3, "common.entity.wild.aggressive.roshwalr")), (1, (1, 3, "common.entity.wild.aggressive.roshwalr")),
(5, (1, 5, "common.entity.wild.peaceful.penguin")), (5, (5, 20, "common.entity.wild.peaceful.penguin")),
], ],
is_underwater: false, is_underwater: false,
day_period: [Night, Morning, Noon, Evening], day_period: [Night, Morning, Noon, Evening],

View File

@ -54,4 +54,5 @@ pub enum FrontendSpecifier {
ClayGolem, ClayGolem,
Bubbles, Bubbles,
Frost, Frost,
WebStrand,
} }

View File

@ -687,7 +687,7 @@ impl Body {
biped_large::Species::Tidalwarrior => 1600, biped_large::Species::Tidalwarrior => 1600,
biped_large::Species::Yeti => 1200, biped_large::Species::Yeti => 1200,
biped_large::Species::Minotaur => 3000, biped_large::Species::Minotaur => 3000,
biped_large::Species::Harvester => 500, biped_large::Species::Harvester => 1500,
biped_large::Species::Blueoni => 240, biped_large::Species::Blueoni => 240,
biped_large::Species::Redoni => 240, biped_large::Species::Redoni => 240,
biped_large::Species::Huskbrute => 800, biped_large::Species::Huskbrute => 800,

View File

@ -596,19 +596,33 @@ fn default_main_tool(body: &Body) -> Item {
)), )),
}, },
Body::Arthropod(arthropod) => match arthropod.species { Body::Arthropod(arthropod) => match arthropod.species {
arthropod::Species::Hornbeetle arthropod::Species::Hornbeetle | arthropod::Species::Stagbeetle => {
| arthropod::Species::Stagbeetle Some(Item::new_from_asset_expect(
| arthropod::Species::Antlion => Some(Item::new_from_asset_expect( "common.items.npc_weapons.unique.arthropods.hornbeetle",
"common.items.npc_weapons.unique.arthropodcharge", ))
},
arthropod::Species::Cavespider => Some(Item::new_from_asset_expect(
"common.items.npc_weapons.unique.arthropods.cavespider",
)), )),
arthropod::Species::Cavespider | arthropod::Species::Blackwidow => Some( arthropod::Species::Sandcrawler | arthropod::Species::Mosscrawler => {
Item::new_from_asset_expect("common.items.npc_weapons.unique.arthropodranged"), Some(Item::new_from_asset_expect(
), "common.items.npc_weapons.unique.arthropods.mosscrawler",
arthropod::Species::Weevil | arthropod::Species::Tarantula => Some( ))
Item::new_from_asset_expect("common.items.npc_weapons.unique.arthropodleap"), },
arthropod::Species::Moltencrawler | arthropod::Species::Weevil => Some(
Item::new_from_asset_expect("common.items.npc_weapons.unique.arthropods.weevil"),
), ),
arthropod::Species::Blackwidow => Some(Item::new_from_asset_expect(
"common.items.npc_weapons.unique.arthropods.blackwidow",
)),
arthropod::Species::Tarantula => Some(Item::new_from_asset_expect(
"common.items.npc_weapons.unique.arthropods.tarantula",
)),
arthropod::Species::Antlion => Some(Item::new_from_asset_expect(
"common.items.npc_weapons.unique.arthropods.antlion",
)),
_ => Some(Item::new_from_asset_expect( _ => Some(Item::new_from_asset_expect(
"common.items.npc_weapons.unique.arthropodbasic", "common.items.npc_weapons.unique.arthropods.leafbeetle",
)), )),
}, },
Body::BipedLarge(biped_large) => match (biped_large.species, biped_large.body_type) { Body::BipedLarge(biped_large) => match (biped_large.species, biped_large.body_type) {

View File

@ -238,7 +238,7 @@ impl ProjectileConstructor {
CombatEffect::Buff(CombatBuff { CombatEffect::Buff(CombatBuff {
kind: BuffKind::Poisoned, kind: BuffKind::Poisoned,
dur_secs: 5.0, dur_secs: 5.0,
strength: CombatBuffStrength::DamageFraction(0.2 * buff_strength), strength: CombatBuffStrength::DamageFraction(0.8 * buff_strength),
chance: 1.0, chance: 1.0,
}), }),
) )

View File

@ -1805,10 +1805,10 @@ impl<'a> AgentData<'a> {
"Quad Low Quick" => Tactic::QuadLowQuick, "Quad Low Quick" => Tactic::QuadLowQuick,
"Quad Low Basic" => Tactic::QuadLowBasic, "Quad Low Basic" => Tactic::QuadLowBasic,
"Theropod Basic" | "Theropod Bird" => Tactic::Theropod, "Theropod Basic" | "Theropod Bird" => Tactic::Theropod,
"Arthropod Basic" => Tactic::ArthropodBasic, // Arthropods
"Arthropod Charge" => Tactic::ArthropodCharge, "Antlion" => Tactic::ArthropodMelee,
"Arthropod Ranged" => Tactic::ArthropodRanged, "Tarantula" | "Horn Beetle" => Tactic::ArthropodAmbush,
"Arthropod Leap" => Tactic::ArthropodLeap, "Weevil" | "Black Widow" => Tactic::ArthropodRanged,
"Theropod Charge" => Tactic::CircleCharge { "Theropod Charge" => Tactic::CircleCharge {
radius: 6, radius: 6,
circle_time: 1, circle_time: 1,
@ -2102,21 +2102,14 @@ impl<'a> AgentData<'a> {
Tactic::Theropod => { Tactic::Theropod => {
self.handle_theropod_attack(agent, controller, &attack_data, tgt_data, read_data) self.handle_theropod_attack(agent, controller, &attack_data, tgt_data, read_data)
}, },
Tactic::ArthropodBasic => self.handle_arthropod_basic_attack( Tactic::ArthropodMelee => self.handle_arthropod_melee_attack(
agent, agent,
controller, controller,
&attack_data, &attack_data,
tgt_data, tgt_data,
read_data, read_data,
), ),
Tactic::ArthropodCharge => self.handle_arthropod_charge_attack( Tactic::ArthropodAmbush => self.handle_arthropod_ambush_attack(
agent,
controller,
&attack_data,
tgt_data,
read_data,
),
Tactic::ArthropodLeap => self.handle_arthropod_leap_attack(
agent, agent,
controller, controller,
&attack_data, &attack_data,

View File

@ -10,7 +10,7 @@ use common::{
InputKind, InputKind,
}, },
path::TraversalConfig, path::TraversalConfig,
states::utils::StageSection, states::{self_buff, sprite_summon, utils::StageSection},
terrain::Block, terrain::Block,
util::Dir, util::Dir,
vol::ReadVol, vol::ReadVol,
@ -1861,42 +1861,6 @@ impl<'a> AgentData<'a> {
); );
} }
pub fn handle_arthropod_basic_attack(
&self,
agent: &mut Agent,
controller: &mut Controller,
attack_data: &AttackData,
tgt_data: &TargetData,
read_data: &ReadData,
) {
agent.action_state.timer += read_data.dt.0;
if agent.action_state.timer > 7.0
&& attack_data.dist_sqrd < (2.0 * attack_data.min_attack_dist).powi(2)
{
controller.inputs.move_dir = Vec2::zero();
controller.push_basic_input(InputKind::Secondary);
// Reset timer
if matches!(self.char_state, CharacterState::SpriteSummon(c) if matches!(c.stage_section, StageSection::Recover))
{
agent.action_state.timer = 0.0;
}
} else if attack_data.angle < 90.0
&& attack_data.dist_sqrd < (1.5 * attack_data.min_attack_dist).powi(2)
{
controller.inputs.move_dir = Vec2::zero();
controller.push_basic_input(InputKind::Primary);
} else {
self.path_toward_target(
agent,
controller,
tgt_data.pos.0,
read_data,
Path::Partial,
None,
);
}
}
pub fn handle_arthropod_ranged_attack( pub fn handle_arthropod_ranged_attack(
&self, &self,
agent: &mut Agent, agent: &mut Agent,
@ -1907,16 +1871,19 @@ impl<'a> AgentData<'a> {
) { ) {
agent.action_state.timer += read_data.dt.0; agent.action_state.timer += read_data.dt.0;
if agent.action_state.timer > 6.0 if agent.action_state.timer > 6.0
&& attack_data.dist_sqrd < (2.0 * attack_data.min_attack_dist).powi(2) && attack_data.dist_sqrd < (1.5 * attack_data.min_attack_dist).powi(2)
{ {
controller.inputs.move_dir = Vec2::zero(); controller.inputs.move_dir = Vec2::zero();
controller.push_basic_input(InputKind::Secondary); controller.push_basic_input(InputKind::Secondary);
// Reset timer // Reset timer
if matches!(self.char_state, CharacterState::SpriteSummon(c) if matches!(c.stage_section, StageSection::Recover)) if matches!(self.char_state,
CharacterState::SpriteSummon(sprite_summon::Data { stage_section, .. })
| CharacterState::SelfBuff(self_buff::Data { stage_section, .. })
if matches!(stage_section, StageSection::Recover))
{ {
agent.action_state.timer = 0.0; agent.action_state.timer = 0.0;
} }
} else if attack_data.dist_sqrd < (3.0 * attack_data.min_attack_dist).powi(2) } else if attack_data.dist_sqrd < (2.5 * attack_data.min_attack_dist).powi(2)
&& attack_data.angle < 90.0 && attack_data.angle < 90.0
{ {
controller.inputs.move_dir = (tgt_data.pos.0 - self.pos.0) controller.inputs.move_dir = (tgt_data.pos.0 - self.pos.0)
@ -1986,7 +1953,7 @@ impl<'a> AgentData<'a> {
} }
} }
pub fn handle_arthropod_leap_attack( pub fn handle_arthropod_ambush_attack(
&self, &self,
agent: &mut Agent, agent: &mut Agent,
controller: &mut Controller, controller: &mut Controller,
@ -2002,18 +1969,21 @@ impl<'a> AgentData<'a> {
controller.inputs.move_dir = Vec2::zero(); controller.inputs.move_dir = Vec2::zero();
controller.push_basic_input(InputKind::Secondary); controller.push_basic_input(InputKind::Secondary);
// Reset timer // Reset timer
if matches!(self.char_state, CharacterState::SpriteSummon(c) if matches!(c.stage_section, StageSection::Recover)) if matches!(self.char_state,
CharacterState::SpriteSummon(sprite_summon::Data { stage_section, .. })
| CharacterState::SelfBuff(self_buff::Data { stage_section, .. })
if matches!(stage_section, StageSection::Recover))
{ {
agent.action_state.timer = 0.0; agent.action_state.timer = 0.0;
} }
} else if attack_data.angle < 90.0 } else if attack_data.angle < 90.0
&& attack_data.dist_sqrd < (1.5 * attack_data.min_attack_dist).powi(2) && attack_data.dist_sqrd < attack_data.min_attack_dist.powi(2)
{ {
controller.inputs.move_dir = Vec2::zero(); controller.inputs.move_dir = Vec2::zero();
controller.push_basic_input(InputKind::Primary); controller.push_basic_input(InputKind::Primary);
} else if rng.gen_bool(0.01) } else if rng.gen_bool(0.01)
&& attack_data.angle < 15.0 && attack_data.angle < 60.0
&& attack_data.dist_sqrd < (6.0 * attack_data.min_attack_dist).powi(2) && attack_data.dist_sqrd > (2.0 * attack_data.min_attack_dist).powi(2)
{ {
controller.push_basic_input(InputKind::Ability(0)); controller.push_basic_input(InputKind::Ability(0));
} else { } else {
@ -2028,7 +1998,7 @@ impl<'a> AgentData<'a> {
} }
} }
pub fn handle_arthropod_charge_attack( pub fn handle_arthropod_melee_attack(
&self, &self,
agent: &mut Agent, agent: &mut Agent,
controller: &mut Controller, controller: &mut Controller,
@ -2041,13 +2011,13 @@ impl<'a> AgentData<'a> {
{ {
// If already charging, keep charging if not in recover // If already charging, keep charging if not in recover
controller.push_basic_input(InputKind::Secondary); controller.push_basic_input(InputKind::Secondary);
} else if attack_data.dist_sqrd > (5.0 * attack_data.min_attack_dist).powi(2) { } else if attack_data.dist_sqrd > (2.5 * attack_data.min_attack_dist).powi(2) {
// Charges at target if they are far enough away // Charges at target if they are far enough away
if attack_data.angle < 60.0 { if attack_data.angle < 60.0 {
controller.push_basic_input(InputKind::Secondary); controller.push_basic_input(InputKind::Secondary);
} }
} else if attack_data.angle < 90.0 } else if attack_data.angle < 90.0
&& attack_data.dist_sqrd < (1.5 * attack_data.min_attack_dist).powi(2) && attack_data.dist_sqrd < attack_data.min_attack_dist.powi(2)
{ {
controller.inputs.move_dir = Vec2::zero(); controller.inputs.move_dir = Vec2::zero();
controller.push_basic_input(InputKind::Primary); controller.push_basic_input(InputKind::Primary);

View File

@ -101,10 +101,9 @@ pub enum Tactic {
BirdLargeBreathe, BirdLargeBreathe,
BirdLargeFire, BirdLargeFire,
BirdLargeBasic, BirdLargeBasic,
ArthropodCharge, ArthropodMelee,
ArthropodBasic,
ArthropodRanged, ArthropodRanged,
ArthropodLeap, ArthropodAmbush,
// Specific species tactics // Specific species tactics
Mindflayer, Mindflayer,

View File

@ -503,7 +503,8 @@ impl SfxMgr {
}, },
beam::FrontendSpecifier::ClayGolem beam::FrontendSpecifier::ClayGolem
| beam::FrontendSpecifier::Bubbles | beam::FrontendSpecifier::Bubbles
| beam::FrontendSpecifier::Frost => {}, | beam::FrontendSpecifier::Frost
| beam::FrontendSpecifier::WebStrand => {},
}, },
Outcome::BreakBlock { pos, .. } => { Outcome::BreakBlock { pos, .. } => {
let sfx_trigger_item = triggers.get_key_value(&SfxEvent::BreakBlock); let sfx_trigger_item = triggers.get_key_value(&SfxEvent::BreakBlock);

View File

@ -86,6 +86,7 @@ pub enum ParticleMode {
Tornado = 33, Tornado = 33,
Death = 34, Death = 34,
EnergyBuffing = 35, EnergyBuffing = 35,
WebStrand = 36,
} }
impl ParticleMode { impl ParticleMode {

View File

@ -842,6 +842,17 @@ impl ParticleMgr {
) )
}) })
}, },
beam::FrontendSpecifier::WebStrand => {
self.particles.resize_with(self.particles.len() + 1, || {
Particle::new_directed(
beam.properties.duration,
time,
ParticleMode::WebStrand,
pos.0,
pos.0 + *ori.look_dir() * range,
)
})
},
beam::FrontendSpecifier::Bubbles => { beam::FrontendSpecifier::Bubbles => {
let mut rng = thread_rng(); let mut rng = thread_rng();
let (from, to) = (Vec3::<f32>::unit_z(), *ori.look_dir()); let (from, to) = (Vec3::<f32>::unit_z(), *ori.look_dir());

View File

@ -468,11 +468,10 @@ pub fn apply_caves_supplement<'a>(
_ => "common.entity.wild.aggressive.batfox", _ => "common.entity.wild.aggressive.batfox",
} }
} else if cave_depth < 120.0 { } else if cave_depth < 120.0 {
match dynamic_rng.gen_range(0..6) { match dynamic_rng.gen_range(0..5) {
0 => "common.entity.wild.aggressive.rocksnapper", 0 => "common.entity.wild.aggressive.rocksnapper",
1 => "common.entity.wild.aggressive.cave_salamander", 1 => "common.entity.wild.aggressive.cave_salamander",
2 => "common.entity.wild.aggressive.cave_spider", 2 => "common.entity.wild.aggressive.cave_spider",
3 => "common.entity.wild.aggressive.antlion",
4 => "common.entity.wild.peaceful.crawler_molten", 4 => "common.entity.wild.peaceful.crawler_molten",
_ => "common.entity.wild.aggressive.asp", _ => "common.entity.wild.aggressive.asp",
} }