Balancing

This commit is contained in:
timokoesters 2020-03-26 14:46:08 +01:00
parent a66d6322e6
commit 7039197b83
15 changed files with 68 additions and 57 deletions

View File

@ -2,11 +2,11 @@ Item(
name: "Apple", name: "Apple",
description: "Red and juicy. description: "Red and juicy.
Restores 20 Health.", Restores 2 Health.",
kind: Consumable( kind: Consumable(
kind: Apple, kind: Apple,
effect: Health(( effect: Health((
amount: 20, amount: 2,
cause: Item, cause: Item,
)), )),
), ),

View File

@ -2,11 +2,11 @@ Item(
name: "Dwarven Cheese", name: "Dwarven Cheese",
description: "Aromatic and nutritious. description: "Aromatic and nutritious.
Restores 40 Health.", Restores 15 Health.",
kind: Consumable( kind: Consumable(
kind: Cheese, kind: Cheese,
effect: Health(( effect: Health((
amount: 40, amount: 15,
cause: Item, cause: Item,
)), )),
), ),

View File

@ -6,7 +6,7 @@ Item(
kind: Tool( kind: Tool(
ToolData ( ToolData (
kind: Hammer(BasicHammer), kind: Hammer(BasicHammer),
equip_time_millis: 1000, equip_time_millis: 600,
) )
) )
) )

View File

@ -6,7 +6,7 @@ Item(
kind: Tool( kind: Tool(
ToolData ( ToolData (
kind: Axe(BasicAxe), kind: Axe(BasicAxe),
equip_time_millis: 1000, equip_time_millis: 700,
) )
), ),
) )

View File

@ -6,7 +6,7 @@ Item(
kind: Tool( kind: Tool(
ToolData ( ToolData (
kind: Hammer(BasicHammer), kind: Hammer(BasicHammer),
equip_time_millis: 1000, equip_time_millis: 600,
) )
), ),
) )

View File

@ -56,34 +56,24 @@ impl CharacterAbility {
match self { match self {
CharacterAbility::Roll => { CharacterAbility::Roll => {
data.physics.on_ground data.physics.on_ground
&& !data.physics.in_fluid
&& data.body.is_humanoid() && data.body.is_humanoid()
&& update && update
.energy .energy
.try_change_by(-200, EnergySource::Ability) .try_change_by(-150, EnergySource::Ability)
.is_ok()
},
CharacterAbility::DashMelee { .. } => {
!data.physics.in_fluid
&& update
.energy
.try_change_by(-300, EnergySource::Ability)
.is_ok()
},
CharacterAbility::BasicMelee { energy_cost, .. } => {
!data.physics.in_fluid
&& update
.energy
.try_change_by(-(*energy_cost as i32), EnergySource::Ability)
.is_ok()
},
CharacterAbility::BasicRanged { energy_cost, .. } => {
!data.physics.in_fluid
&& update
.energy
.try_change_by(-(*energy_cost as i32), EnergySource::Ability)
.is_ok() .is_ok()
}, },
CharacterAbility::DashMelee { .. } => update
.energy
.try_change_by(-700, EnergySource::Ability)
.is_ok(),
CharacterAbility::BasicMelee { energy_cost, .. } => update
.energy
.try_change_by(-(*energy_cost as i32), EnergySource::Ability)
.is_ok(),
CharacterAbility::BasicRanged { energy_cost, .. } => update
.energy
.try_change_by(-(*energy_cost as i32), EnergySource::Ability)
.is_ok(),
_ => true, _ => true,
} }
} }
@ -165,7 +155,8 @@ impl From<&CharacterAbility> for CharacterState {
}), }),
CharacterAbility::BasicBlock => CharacterState::BasicBlock, CharacterAbility::BasicBlock => CharacterState::BasicBlock,
CharacterAbility::Roll => CharacterState::Roll(roll::Data { CharacterAbility::Roll => CharacterState::Roll(roll::Data {
remaining_duration: Duration::from_millis(300), remaining_duration: Duration::from_millis(500),
was_wielded: false, // false by default. utils might set it to true
}), }),
CharacterAbility::TimedCombo { CharacterAbility::TimedCombo {
buildup_duration, buildup_duration,

View File

@ -70,7 +70,7 @@ impl ToolData {
use ToolKind::*; use ToolKind::*;
match self.kind { match self.kind {
Sword(_) => vec![TripleStrike { base_damage: 7 }, DashMelee { Sword(_) => vec![TripleStrike { base_damage: 5 }, DashMelee {
buildup_duration: Duration::from_millis(500), buildup_duration: Duration::from_millis(500),
recover_duration: Duration::from_millis(500), recover_duration: Duration::from_millis(500),
base_damage: 20, base_damage: 20,

View File

@ -135,7 +135,7 @@ impl Stats {
} }
// TODO: Delete this once stat points will be a thing // TODO: Delete this once stat points will be a thing
pub fn update_max_hp(&mut self) { self.health.set_maximum(33 + 7 * self.level.amount); } pub fn update_max_hp(&mut self) { self.health.set_maximum(52 + 3 * self.level.amount); }
} }
impl Stats { impl Stats {

View File

@ -26,6 +26,7 @@ impl CharacterBehavior for Data {
let mut update = StateUpdate::from(data); let mut update = StateUpdate::from(data);
handle_move(data, &mut update); handle_move(data, &mut update);
handle_jump(data, &mut update);
if self.buildup_duration != Duration::default() { if self.buildup_duration != Duration::default() {
// Build up // Build up

View File

@ -6,11 +6,13 @@ use crate::{
use std::time::Duration; use std::time::Duration;
use vek::Vec3; use vek::Vec3;
const ROLL_SPEED: f32 = 17.0; const ROLL_SPEED: f32 = 15.0;
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)] #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)]
pub struct Data { pub struct Data {
/// How long the state has until exiting /// How long the state has until exiting
pub remaining_duration: Duration, pub remaining_duration: Duration,
/// Had weapon
pub was_wielded: bool,
} }
impl CharacterBehavior for Data { impl CharacterBehavior for Data {
@ -31,7 +33,11 @@ impl CharacterBehavior for Data {
if self.remaining_duration == Duration::default() { if self.remaining_duration == Duration::default() {
// Roll duration has expired // Roll duration has expired
update.vel.0 *= 0.3; update.vel.0 *= 0.3;
update.character = CharacterState::Idle {}; if self.was_wielded {
update.character = CharacterState::Wielding;
} else {
update.character = CharacterState::Idle;
}
} else { } else {
// Otherwise, tick down remaining_duration // Otherwise, tick down remaining_duration
update.character = CharacterState::Roll(Data { update.character = CharacterState::Roll(Data {
@ -39,6 +45,7 @@ impl CharacterBehavior for Data {
.remaining_duration .remaining_duration
.checked_sub(Duration::from_secs_f32(data.dt.0)) .checked_sub(Duration::from_secs_f32(data.dt.0))
.unwrap_or_default(), .unwrap_or_default(),
was_wielded: self.was_wielded,
}); });
} }

View File

@ -7,9 +7,9 @@ use std::time::Duration;
use vek::vec::{Vec2, Vec3}; use vek::vec::{Vec2, Vec3};
// In millis // In millis
const STAGE_DURATION: u64 = 600; const STAGE_DURATION: u64 = 500;
const INITIAL_ACCEL: f32 = 200.0; const INITIAL_ACCEL: f32 = 90.0;
const BASE_SPEED: f32 = 25.0; const BASE_SPEED: f32 = 25.0;
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)] #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Eq, Hash)]
@ -87,8 +87,13 @@ impl CharacterBehavior for Data {
// Move player forward while in first third of each stage // Move player forward while in first third of each stage
if update.vel.0.magnitude_squared() < BASE_SPEED.powf(2.0) { if update.vel.0.magnitude_squared() < BASE_SPEED.powf(2.0) {
update.vel.0 = update.vel.0 = update.vel.0
update.vel.0 + Vec2::broadcast(data.dt.0) * data.ori.0 * adjusted_accel; + data.dt.0
* (if data.physics.on_ground {
Vec3::new(0.0, 0.0, 500.0) // Jump upwards if on ground
} else {
Vec3::one()
} + adjusted_accel * Vec3::from(data.ori.0.xy()));
let mag2 = update.vel.0.magnitude_squared(); let mag2 = update.vel.0.magnitude_squared();
if mag2 > BASE_SPEED.powf(2.0) { if mag2 > BASE_SPEED.powf(2.0) {
update.vel.0 = update.vel.0.normalized() * BASE_SPEED; update.vel.0 = update.vel.0.normalized() * BASE_SPEED;
@ -115,7 +120,7 @@ impl CharacterBehavior for Data {
max_angle: 180_f32.to_radians(), max_angle: 180_f32.to_radians(),
applied: false, applied: false,
hit_count: 0, hit_count: 0,
knockback: 7.0, knockback: 20.0,
}); });
CharacterState::TripleStrike(Data { CharacterState::TripleStrike(Data {

View File

@ -53,7 +53,7 @@ fn basic_move(data: &JoinData, update: &mut StateUpdate) {
} }
} }
handle_orientation(data, update, 9.0); handle_orientation(data, update, 20.0);
} }
pub fn handle_orientation(data: &JoinData, update: &mut StateUpdate, strength: f32) { pub fn handle_orientation(data: &JoinData, update: &mut StateUpdate, strength: f32) {
@ -215,7 +215,14 @@ pub fn handle_dodge_input(data: &JoinData, update: &mut StateUpdate) {
.and_then(|i| i.dodge_ability.as_ref()) .and_then(|i| i.dodge_ability.as_ref())
.filter(|ability| ability.requirements_paid(data, update)) .filter(|ability| ability.requirements_paid(data, update))
{ {
update.character = ability.into(); if data.character.is_wield() {
update.character = ability.into();
if let CharacterState::Roll(roll) = &mut update.character {
roll.was_wielded = true;
}
} else {
update.character = ability.into();
}
} }
} }
} }

View File

@ -180,7 +180,7 @@ impl<'a> System<'a> for Sys {
inputs.move_dir = Vec2::from(tgt_pos.0 - pos.0) inputs.move_dir = Vec2::from(tgt_pos.0 - pos.0)
.try_normalized() .try_normalized()
.unwrap_or(Vec2::unit_y()) .unwrap_or(Vec2::unit_y())
* 0.01; * 0.7;
inputs.primary.set_state(true); inputs.primary.set_state(true);
} else if dist_sqrd < MAX_CHASE_DIST.powf(2.0) } else if dist_sqrd < MAX_CHASE_DIST.powf(2.0)
|| (dist_sqrd < SIGHT_DIST.powf(2.0) && !*been_close) || (dist_sqrd < SIGHT_DIST.powf(2.0) && !*been_close)

View File

@ -113,40 +113,40 @@ impl<'a> System<'a> for Sys {
&& ori2.angle_between(pos_b2 - pos2) < attack.max_angle + (rad_b / pos2.distance(pos_b2)).atan() && ori2.angle_between(pos_b2 - pos2) < attack.max_angle + (rad_b / pos2.distance(pos_b2)).atan()
{ {
// Weapon gives base damage // Weapon gives base damage
let mut healthchange = attack.base_healthchange; let mut healthchange = attack.base_healthchange as f32;
// NPCs do less damage: //// NPCs do less damage:
if agent_maybe.is_some() { //if agent_maybe.is_some() {
healthchange = (healthchange / 2).min(-1); // healthchange = (healthchange / 1.5).min(-1.0);
} //}
// Don't heal npc's hp // Don't heal npc's hp
if agent_b_maybe.is_some() && healthchange > 0 { if agent_b_maybe.is_some() && healthchange > 0.0 {
healthchange = 0; healthchange = 0.0;
} }
if rand::random() { if rand::random() {
healthchange = (healthchange as f32 * 1.2) as i32; healthchange = healthchange * 1.2;
} }
// Block // Block
if character_b.is_block() if character_b.is_block()
&& ori_b.0.angle_between(pos.0 - pos_b.0) < BLOCK_ANGLE.to_radians() / 2.0 && ori_b.0.angle_between(pos.0 - pos_b.0) < BLOCK_ANGLE.to_radians() / 2.0
{ {
healthchange = (healthchange as f32 * (1.0 - BLOCK_EFFICIENCY)) as i32 healthchange = healthchange * (1.0 - BLOCK_EFFICIENCY)
} }
server_emitter.emit(ServerEvent::Damage { server_emitter.emit(ServerEvent::Damage {
uid: *uid_b, uid: *uid_b,
change: HealthChange { change: HealthChange {
amount: healthchange, amount: healthchange as i32,
cause: HealthSource::Attack { by: *uid }, cause: HealthSource::Attack { by: *uid },
}, },
}); });
if attack.knockback != 0.0 { if attack.knockback != 0.0 {
local_emitter.emit(LocalEvent::KnockUp { local_emitter.emit(LocalEvent::ApplyForce {
entity: b, entity: b,
dir: ori.0, dir: Vec3::slerp(ori.0, Vec3::new(0.0, 0.0, 1.0), 0.5),
force: attack.knockback, force: attack.knockback,
}); });
} }

View File

@ -209,8 +209,8 @@ impl<'a> System<'a> for Sys {
ability1: Some(CharacterAbility::BasicMelee { ability1: Some(CharacterAbility::BasicMelee {
energy_cost: 0, energy_cost: 0,
buildup_duration: Duration::from_millis(0), buildup_duration: Duration::from_millis(0),
recover_duration: Duration::from_millis(300), recover_duration: Duration::from_millis(400),
base_healthchange: -2, base_healthchange: -4,
range: 3.5, range: 3.5,
max_angle: 60.0, max_angle: 60.0,
}), }),