Skip to content

Commit f872e5f

Browse files
authored
Balance related tweaks (#118)
* fix enemy levels * tune down item frequency a bit * Don't interrupt movement after bribe/run away * changelog * increase hp for all classes * chest equipment level based on distance instead of player level * don't double beat if already dead * changelog
1 parent e64fb05 commit f872e5f

7 files changed

Lines changed: 54 additions & 43 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
* Show items bought and money spent in the buy command output #108
2828
* Show mp cost in magic attacks 9f92efc
2929
* The stat command can be used to describe items and equipment #117
30+
* Equipment level found in chest based on distance instead of player level d22d3b9
31+
* Game balance related tweaks #118
3032

3133
### Fixed
3234
* Reach level 50 and 100 unlock and reward 4128f75
@@ -36,6 +38,7 @@
3638
* Missed levels with class quest completion 1ec760
3739
* Tweak gold found in chests 0317979 83691fa
3840
* Don't add xp beyond the actual inflicted damage (prevents high xp when beating weaker enemies) 812a5f1
41+
* Continue moving through dirs after successful bribe/run away 570a0de
3942

4043
## [0.6.0](https://github.com/facundoolano/rpg-cli/releases/tag/0.6.0) - 2021-08-04
4144
### Added

src/character/classes.yaml

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,116 +1,116 @@
11
- name: warrior
2-
hp: [30, 7]
2+
hp: [50, 10]
33
strength: [12, 3]
44
speed: [11, 2]
55
category: player
66
- name: mage
7-
hp: [20, 4]
7+
hp: [30, 6]
88
mp: [10, 4]
99
strength: [10, 3]
1010
speed: [10, 2]
1111
category: player
1212
- name: thief
13-
hp: [21, 5]
13+
hp: [35, 7]
1414
strength: [7, 2]
1515
speed: [19, 4]
1616
category: player
1717
- name: rat
18-
hp: [10, 3]
18+
hp: [15, 5]
1919
strength: [5, 2]
2020
speed: [16, 2]
2121
category: common
2222
- name: wolf
23-
hp: [15, 3]
23+
hp: [25, 5]
2424
strength: [8, 2]
2525
speed: [12, 2]
2626
category: common
2727
- name: snake
28-
hp: [13, 3]
28+
hp: [23, 7]
2929
strength: [7, 2]
3030
speed: [6, 2]
3131
inflicts: [poison, 5]
3232
category: common
3333
- name: slime
34-
hp: [80, 3]
34+
hp: [80, 4]
3535
strength: [3, 2]
3636
speed: [4, 2]
3737
inflicts: [poison, 10]
3838
category: common
3939
- name: spider
40-
hp: [10, 3]
40+
hp: [16, 5]
4141
strength: [9, 2]
4242
speed: [12, 2]
4343
inflicts: [poison, 20]
4444
category: common
4545
- name: zombie
46-
hp: [50, 3]
46+
hp: [80, 5]
4747
strength: [8, 2]
4848
speed: [6, 2]
4949
category: rare
5050
- name: orc
51-
hp: [35, 3]
51+
hp: [60, 5]
5252
strength: [13, 2]
5353
speed: [12, 2]
5454
category: rare
5555
- name: skeleton
56-
hp: [30, 3]
56+
hp: [45, 5]
5757
strength: [10, 2]
5858
speed: [10, 2]
5959
category: rare
6060
- name: demon
61-
hp: [50, 3]
61+
hp: [70, 5]
6262
strength: [10, 2]
6363
speed: [18, 2]
6464
inflicts: [burn, 10]
6565
category: rare
6666
- name: vampire
67-
hp: [50, 3]
67+
hp: [70, 5]
6868
strength: [13, 2]
6969
speed: [10, 2]
7070
category: rare
7171
- name: dragon
72-
hp: [100, 3]
72+
hp: [110, 5]
7373
strength: [25, 2]
7474
speed: [8, 2]
7575
inflicts: [burn, 2]
7676
category: rare
7777
- name: golem
78-
hp: [50, 3]
78+
hp: [70, 5]
7979
strength: [45, 2]
8080
speed: [2, 1]
8181
category: rare
8282
- name: sorcerer
83-
hp: [30, 3]
83+
hp: [45, 5]
8484
mp: [13, 1]
8585
strength: [10, 2]
8686
speed: [8, 2]
8787
inflicts: [burn, 5]
8888
category: rare
8989
- name: chimera
90-
hp: [200, 2]
90+
hp: [250, 2]
9191
strength: [90, 2]
9292
speed: [16, 2]
9393
inflicts: [poison, 3]
9494
category: legendary
9595
- name: basilisk
96-
hp: [150, 3]
96+
hp: [180, 3]
9797
strength: [100, 2]
9898
speed: [18, 2]
9999
inflicts: [poison, 2]
100100
category: legendary
101101
- name: minotaur
102-
hp: [100, 3]
102+
hp: [120, 3]
103103
strength: [60, 2]
104104
speed: [40, 2]
105105
category: legendary
106106
- name: balrog
107-
hp: [200, 3]
107+
hp: [270, 3]
108108
strength: [200, 2]
109109
speed: [14, 2]
110110
inflicts: [burn, 3]
111111
category: legendary
112112
- name: phoenix
113-
hp: [350, 3]
113+
hp: [500, 3]
114114
strength: [180, 2]
115115
speed: [28, 2]
116116
inflicts: [burn, 3]

src/character/enemy.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ pub fn spawn(location: &location::Location, player: &Character) -> Option<Charac
2424
.or_else(|| spawn_dev(player, location))
2525
.unwrap_or_else(|| spawn_random(player, &distance));
2626

27+
let level = random().enemy_level(level);
2728
let enemy = Character::new(class, level);
2829
log::enemy_appears(&enemy, location);
2930
Some(enemy)
@@ -43,7 +44,7 @@ fn spawn_gorthaur(player: &Character, location: &location::Location) -> Option<(
4344
class.hp.0 *= 2;
4445
class.strength.0 *= 2;
4546
class.category = Category::Legendary;
46-
Some((class, 100))
47+
Some((class, player.level))
4748
} else {
4849
None
4950
}
@@ -106,7 +107,6 @@ fn spawn_random(player: &Character, distance: &location::Distance) -> (Class, i3
106107
.clone();
107108

108109
let level = std::cmp::max(player.level / 10 + distance.len() - 1, 1);
109-
let level = random().enemy_level(level);
110110
(Class::random(category).clone(), level)
111111
}
112112

src/character/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,9 @@ impl Character {
289289

290290
/// If the double beat ring is equipped, attack the receiver.
291291
pub fn maybe_double_beat(&mut self, receiver: &mut Self) {
292-
if self.left_ring == Some(Ring::Double) || self.right_ring == Some(Ring::Double) {
292+
if receiver.current_hp > 0
293+
&& (self.left_ring == Some(Ring::Double) || self.right_ring == Some(Ring::Double))
294+
{
293295
// assuming it's always the player and we don't need to handle death
294296
let _ = self.attack(receiver);
295297
}

src/game.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,9 @@ impl Game {
9898

9999
if !self.location.is_home() {
100100
if let Some(mut enemy) = enemy::spawn(&self.location, &self.player) {
101-
return self.battle(&mut enemy, run, bribe);
101+
if self.battle(&mut enemy, run, bribe)? {
102+
return Ok(());
103+
}
102104
}
103105
}
104106
}
@@ -218,19 +220,21 @@ impl Game {
218220

219221
/// Attempt to bribe or run away according to the given options,
220222
/// and start a battle if that fails.
223+
/// Return Ok(true) if a battle took place, Ok(false) if it was avoided,
224+
/// Err<Dead> if the character dies.
221225
pub fn battle(
222226
&mut self,
223227
enemy: &mut Character,
224228
run: bool,
225229
bribe: bool,
226-
) -> Result<(), character::Dead> {
230+
) -> Result<bool, character::Dead> {
227231
// don't attempt bribe and run in the same turn
228232
if bribe {
229233
let bribe_cost = self.player.gold_gained(enemy.level) / 2;
230234
if self.gold >= bribe_cost && random().bribe_succeeds() {
231235
self.gold -= bribe_cost;
232236
log::bribe(&self.player, bribe_cost);
233-
return Ok(());
237+
return Ok(false);
234238
};
235239
log::bribe(&self.player, 0);
236240
} else if run {
@@ -242,13 +246,13 @@ impl Game {
242246
);
243247
log::run_away(&self.player, success);
244248
if success {
245-
return Ok(());
249+
return Ok(false);
246250
}
247251
}
248252

249253
if let Ok(xp) = self.run_battle(enemy) {
250254
self.battle_won(enemy, xp);
251-
Ok(())
255+
Ok(true)
252256
} else {
253257
self.battle_lost();
254258
Err(character::Dead)

src/item/chest.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ impl Chest {
5454
chest.gold = game.player.gold_gained(game.player.level + distance.len());
5555
}
5656
if equipment_chest {
57-
let (sword, shield) = random_equipment(game.player.rounded_level());
57+
let (sword, shield) = random_equipment(distance.len());
5858
chest.sword = sword;
5959
chest.shield = shield;
6060
}
@@ -170,9 +170,11 @@ fn maybe_upgrade(current: &mut Option<Equipment>, other: &mut Option<Equipment>)
170170
false
171171
}
172172

173-
fn random_equipment(level: i32) -> (Option<Equipment>, Option<Equipment>) {
173+
fn random_equipment(distance: i32) -> (Option<Equipment>, Option<Equipment>) {
174174
let mut rng = rand::thread_rng();
175175

176+
let level = std::cmp::max(1, (distance / 5) * 5);
177+
176178
vec![
177179
(100, (Some(Equipment::sword(level)), None)),
178180
(80, (None, Some(Equipment::shield(level)))),
@@ -193,11 +195,11 @@ fn random_item(level: i32) -> Box<dyn Item> {
193195
(10, Box::new(Remedy::new())),
194196
(10, Box::new(Escape::new())),
195197
(50, Box::new(Ether::new(level))),
196-
(10, Box::new(stone::Health)),
197-
(10, Box::new(stone::Magic)),
198-
(10, Box::new(stone::Power)),
199-
(10, Box::new(stone::Speed)),
200-
(5, Box::new(stone::Level)),
198+
(5, Box::new(stone::Health)),
199+
(5, Box::new(stone::Magic)),
200+
(5, Box::new(stone::Power)),
201+
(5, Box::new(stone::Speed)),
202+
(1, Box::new(stone::Level)),
201203
];
202204

203205
// make a separate vec with enumerated weights, then remove from the item vec

src/randomizer.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ impl Randomizer for DefaultRandomizer {
170170
let mut rng = rand::thread_rng();
171171

172172
match distance {
173-
location::Distance::Near(_) => false,
173+
location::Distance::Near(_) => rng.gen_ratio(1, 30),
174174
location::Distance::Mid(_) => rng.gen_ratio(3, 30),
175175
location::Distance::Far(_) => rng.gen_ratio(5, 30),
176176
}
@@ -180,19 +180,19 @@ impl Randomizer for DefaultRandomizer {
180180
let mut rng = rand::thread_rng();
181181

182182
match distance {
183-
location::Distance::Near(_) => rng.gen_ratio(1, 30),
184-
location::Distance::Mid(_) => rng.gen_ratio(4, 30),
185-
location::Distance::Far(_) => rng.gen_ratio(6, 30),
183+
location::Distance::Near(_) => false,
184+
location::Distance::Mid(_) => rng.gen_ratio(3, 30),
185+
location::Distance::Far(_) => rng.gen_ratio(5, 30),
186186
}
187187
}
188188

189189
fn item_chest(&self, distance: &location::Distance) -> bool {
190190
let mut rng = rand::thread_rng();
191191

192192
match distance {
193-
location::Distance::Near(_) => rng.gen_ratio(5, 50),
194-
location::Distance::Mid(_) => rng.gen_ratio(10, 50),
195-
location::Distance::Far(_) => rng.gen_ratio(16, 50),
193+
location::Distance::Near(_) => rng.gen_ratio(1, 50),
194+
location::Distance::Mid(_) => rng.gen_ratio(5, 50),
195+
location::Distance::Far(_) => rng.gen_ratio(10, 50),
196196
}
197197
}
198198
}

0 commit comments

Comments
 (0)