Balance tweaks

This commit is contained in:
Youssef Fahmy 2022-04-23 14:54:01 +00:00 committed by Samuel Keiffer
parent 967d151312
commit aec866e5ec
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
- [WorldGen] Change path colors
- 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

View File

@ -186,6 +186,8 @@
secondary: "common.abilities.custom.tidalwarrior.totem_wave",
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"): (
primary: "common.abilities.custom.quadmedquick.triplestrike",
secondary: "common.abilities.custom.quadmedquick.dash",
@ -279,30 +281,41 @@
secondary: "common.abilities.custom.theropodbasic.dash",
abilities: [],
),
Custom("Arthropod Basic"): (
primary: "common.abilities.custom.arthropodbasic.singlestrike",
secondary: "common.abilities.custom.arthropodbasic.ensnaringweb",
// Arthropods
Custom("Antlion"): (
primary: "common.abilities.custom.arthropods.antlion.singlestrike",
secondary: "common.abilities.custom.arthropods.antlion.charge",
abilities: [],
),
Custom("Arthropod Leap"): (
primary: "common.abilities.custom.arthropodbasic.singlestrike",
secondary: "common.abilities.custom.arthropodbasic.ensnaringweb",
Custom("Black Widow"): (
primary: "common.abilities.custom.arthropods.blackwidow.singlestrike",
secondary: "common.abilities.custom.arthropods.blackwidow.ensnaringwebs",
abilities: [
(None, "common.abilities.custom.arthropodbasic.leap"),
(None, "common.abilities.custom.arthropods.blackwidow.poisonball"),
],
),
Custom("Arthropod Ranged"): (
primary: "common.abilities.custom.arthropodranged.singlestrike",
secondary: "common.abilities.custom.arthropodranged.ensnaringweb",
Custom("Horn Beetle"): (
primary: "common.abilities.custom.arthropods.hornbeetle.singlestrike",
secondary: "common.abilities.custom.arthropods.hornbeetle.harden",
abilities: [
(None, "common.abilities.custom.arthropodranged.poisonball"),
(None, "common.abilities.custom.arthropods.hornbeetle.leap"),
],
),
Custom("Arthropod Charge"): (
primary: "common.abilities.custom.arthropodcharge.singlestrike",
secondary: "common.abilities.custom.arthropodcharge.charge",
abilities: [],
Custom("Tarantula"): (
primary: "common.abilities.custom.arthropods.tarantula.singlestrike",
secondary: "common.abilities.custom.arthropods.tarantula.ensnaringwebs",
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"): (
primary: "common.abilities.custom.turret.arrows",
secondary: "common.abilities.custom.turret.arrows",

View File

@ -2,27 +2,27 @@ DashMelee(
energy_cost: 0,
melee_constructor: (
kind: Stab(
damage: 12.0,
poise: 25.0,
damage: 15.0,
poise: 20.0,
knockback: 10.0,
energy_regen: 0.0,
),
scaled: Some(Stab(
damage: 50.0,
poise: 100.0,
knockback: 30.0,
damage: 60.0,
poise: 45.0,
knockback: 25.0,
energy_regen: 0.0,
)),
range: 5.0,
angle: 90.0,
),
energy_drain: 0,
forward_speed: 5.0,
forward_speed: 3.0,
buildup_duration: 0.3,
charge_duration: 4.0,
swing_duration: 0.1,
recover_duration: 0.4,
ori_modifier: 0.3,
ori_modifier: 0.1,
charge_through: 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(
buildup_duration: 0.6,
buildup_duration: 0.5,
cast_duration: 0.4,
recover_duration: 0.3,
sprite: EnsnaringWeb,
summon_distance: (0, 8),
sparseness: 0.67,
summon_distance: (0, 10),
sparseness: 0.76,
)

View File

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

View File

@ -2,11 +2,11 @@ ComboMelee(
stage_data: [
(
stage: 1,
base_damage: 60,
base_damage: 25,
damage_increase: 0,
base_poise_damage: 28,
base_poise_damage: 16,
poise_damage_increase: 0,
knockback: 3.0,
knockback: 2.0,
range: 3.0,
angle: 60.0,
base_buildup_duration: 0.4,
@ -14,12 +14,12 @@ ComboMelee(
hit_timing: 0.5,
base_recover_duration: 0.4,
forward_movement: 1.0,
damage_kind: Crushing,
damage_kind: Piercing,
damage_effect: Some(Buff((
kind: Poisoned,
dur_secs: 10.0,
strength: DamageFraction(1.0),
chance: 1.0,
dur_secs: 7.0,
strength: DamageFraction(0.6),
chance: 0.4,
))),
),
],
@ -30,5 +30,5 @@ ComboMelee(
max_speed_increase: 0.0,
scales_from_combo: 0,
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,
melee_constructor: (
kind: Bash(
damage: 120.0,
poise: 60.0,
damage: 30.0,
poise: 20.0,
knockback: 4.0,
energy_regen: 0.0,
),
@ -15,5 +15,5 @@ LeapMelee(
angle: 180.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(
buildup_duration: 0.6,
buildup_duration: 0.5,
cast_duration: 0.4,
recover_duration: 0.3,
sprite: EnsnaringWeb,
summon_distance: (0, 8),
sparseness: 0.67,
summon_distance: (0, 9),
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: 1,
base_damage: 70,
base_damage: 30,
damage_increase: 0,
base_poise_damage: 28,
base_poise_damage: 21,
poise_damage_increase: 0,
knockback: 3.0,
range: 3.0,
@ -14,12 +14,12 @@ ComboMelee(
hit_timing: 0.5,
base_recover_duration: 0.4,
forward_movement: 1.0,
damage_kind: Crushing,
damage_kind: Piercing,
damage_effect: Some(Buff((
kind: Poisoned,
dur_secs: 10.0,
strength: DamageFraction(1.0),
chance: 1.0,
dur_secs: 9.0,
strength: DamageFraction(0.7),
chance: 0.8,
))),
),
],
@ -30,5 +30,5 @@ ComboMelee(
max_speed_increase: 0.0,
scales_from_combo: 0,
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: 1,
base_damage: 40,
base_damage: 22,
damage_increase: 0,
base_poise_damage: 15,
base_poise_damage: 14,
poise_damage_increase: 0,
knockback: 3.0,
range: 3.0,
@ -15,12 +15,6 @@ ComboMelee(
base_recover_duration: 0.4,
forward_movement: 1.0,
damage_kind: Crushing,
damage_effect: Some(Buff((
kind: Poisoned,
dur_secs: 10.0,
strength: DamageFraction(1.0),
chance: 1.0,
))),
),
],
initial_energy_gain: 0,
@ -30,5 +24,5 @@ ComboMelee(
max_speed_increase: 0.0,
scales_from_combo: 0,
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,
recover_duration: 0.8,
projectile: ExplodingPumpkin(
damage: 20.0,
damage: 25.0,
knockback: 25.0,
radius: 5.0,
min_falloff: 0.6,

View File

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

View File

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

View File

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

View File

@ -12,6 +12,12 @@ BasicMelee(
),
range: 5.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,
)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,5 +1,5 @@
ItemDef(
name: "Arthropod Basic",
name: "Black Widow",
description: "testing123",
kind: Tool((
kind: Natural,
@ -15,7 +15,7 @@ ItemDef(
buff_strength: 1.0,
)),
)),
quality: Low,
quality: Epic,
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(
name: "Arthropod Charge",
name: "Horn Beetle",
description: "testing123",
kind: Tool((
kind: Natural,
@ -15,7 +15,7 @@ ItemDef(
buff_strength: 1.0,
)),
)),
quality: Low,
quality: High,
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(
name: "Arthropod Ranged",
name: "Tarantula",
description: "testing123",
kind: Tool((
kind: Natural,
@ -15,7 +15,7 @@ ItemDef(
buff_strength: 1.0,
)),
)),
quality: Low,
quality: Epic,
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.animal_misc.icy_fang")),
(1.0, Item("common.items.crafting_ing.hide.animal_hide")),
(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
(2.0, Nothing),
// 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: (
keyword: "black_widow",
generic: "Blackwidow"
generic: "Black Widow"
),
antlion: (
keyword: "antlion",

View File

@ -74,6 +74,7 @@ const int DRIP = 32;
const int TORNADO = 33;
const int DEATH = 34;
const int ENERGY_BUFFING = 35;
const int WEB_STRAND = 36;
// meters per second squared (acceleration)
const float earth_gravity = 9.807;
@ -579,6 +580,16 @@ void main() {
spin_in_axis(vec3(rand6, rand7, rand8), rand9 * 3)
);
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:
attr = Attr(
linear_motion(

View File

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

View File

@ -9,7 +9,7 @@ SpawnEntry (
(1, (1, 1, "common.entity.wild.aggressive.icedrake")),
(1, (1, 3, "common.entity.wild.aggressive.snow_raptor")),
(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,
day_period: [Night, Morning, Noon, Evening],

View File

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

View File

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

View File

@ -596,19 +596,33 @@ fn default_main_tool(body: &Body) -> Item {
)),
},
Body::Arthropod(arthropod) => match arthropod.species {
arthropod::Species::Hornbeetle
| arthropod::Species::Stagbeetle
| arthropod::Species::Antlion => Some(Item::new_from_asset_expect(
"common.items.npc_weapons.unique.arthropodcharge",
arthropod::Species::Hornbeetle | arthropod::Species::Stagbeetle => {
Some(Item::new_from_asset_expect(
"common.items.npc_weapons.unique.arthropods.hornbeetle",
))
},
arthropod::Species::Cavespider => Some(Item::new_from_asset_expect(
"common.items.npc_weapons.unique.arthropods.cavespider",
)),
arthropod::Species::Cavespider | arthropod::Species::Blackwidow => Some(
Item::new_from_asset_expect("common.items.npc_weapons.unique.arthropodranged"),
),
arthropod::Species::Weevil | arthropod::Species::Tarantula => Some(
Item::new_from_asset_expect("common.items.npc_weapons.unique.arthropodleap"),
arthropod::Species::Sandcrawler | arthropod::Species::Mosscrawler => {
Some(Item::new_from_asset_expect(
"common.items.npc_weapons.unique.arthropods.mosscrawler",
))
},
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(
"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) {

View File

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

View File

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

View File

@ -10,7 +10,7 @@ use common::{
InputKind,
},
path::TraversalConfig,
states::utils::StageSection,
states::{self_buff, sprite_summon, utils::StageSection},
terrain::Block,
util::Dir,
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(
&self,
agent: &mut Agent,
@ -1907,16 +1871,19 @@ impl<'a> AgentData<'a> {
) {
agent.action_state.timer += read_data.dt.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.push_basic_input(InputKind::Secondary);
// 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;
}
} 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
{
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,
agent: &mut Agent,
controller: &mut Controller,
@ -2002,18 +1969,21 @@ impl<'a> AgentData<'a> {
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))
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;
}
} 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.push_basic_input(InputKind::Primary);
} else if rng.gen_bool(0.01)
&& attack_data.angle < 15.0
&& attack_data.dist_sqrd < (6.0 * attack_data.min_attack_dist).powi(2)
&& attack_data.angle < 60.0
&& attack_data.dist_sqrd > (2.0 * attack_data.min_attack_dist).powi(2)
{
controller.push_basic_input(InputKind::Ability(0));
} else {
@ -2028,7 +1998,7 @@ impl<'a> AgentData<'a> {
}
}
pub fn handle_arthropod_charge_attack(
pub fn handle_arthropod_melee_attack(
&self,
agent: &mut Agent,
controller: &mut Controller,
@ -2041,13 +2011,13 @@ impl<'a> AgentData<'a> {
{
// If already charging, keep charging if not in recover
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
if attack_data.angle < 60.0 {
controller.push_basic_input(InputKind::Secondary);
}
} 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.push_basic_input(InputKind::Primary);

View File

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

View File

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

View File

@ -86,6 +86,7 @@ pub enum ParticleMode {
Tornado = 33,
Death = 34,
EnergyBuffing = 35,
WebStrand = 36,
}
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 => {
let mut rng = thread_rng();
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",
}
} 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",
1 => "common.entity.wild.aggressive.cave_salamander",
2 => "common.entity.wild.aggressive.cave_spider",
3 => "common.entity.wild.aggressive.antlion",
4 => "common.entity.wild.peaceful.crawler_molten",
_ => "common.entity.wild.aggressive.asp",
}