Skip to content

Commit 2bbbb78

Browse files
authored
Merge pull request #25 from ZakisM/development
Fix ability points after changing character level/experience
2 parents 4f4e7f2 + ab3cae6 commit 2bbbb78

File tree

4 files changed

+60
-39
lines changed

4 files changed

+60
-39
lines changed

bl3_save_edit_core/src/bl3_save/character_data.rs

Lines changed: 57 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ use crate::protos::oak_shared::{
3131
};
3232
use crate::vehicle_data::{VehicleName, VehicleStats};
3333

34+
pub const MAX_CHARACTER_LEVEL: usize = 72;
35+
3436
#[derive(Derivative)]
3537
#[derivative(Debug, Clone, Default, Eq, PartialEq, Ord, PartialOrd)]
3638
pub struct CharacterData {
@@ -367,25 +369,33 @@ impl CharacterData {
367369
}
368370

369371
pub fn set_player_class(&mut self, player_class: PlayerClass) -> Result<()> {
370-
let player_class_data = self
371-
.character
372-
.player_class_data
373-
.as_mut()
374-
.with_context(|| "failed to read Player Class data")?;
372+
if player_class != self.player_class {
373+
let player_class_data = self
374+
.character
375+
.player_class_data
376+
.as_mut()
377+
.with_context(|| "failed to read Player Class data")?;
375378

376-
player_class_data.player_class_path = player_class.get_serializations()[0].to_string();
379+
player_class_data.player_class_path = player_class.get_serializations()[0].to_string();
377380

378-
let ability_data = self
379-
.character
380-
.ability_data
381-
.as_mut()
382-
.context("failed to read Player ability data")?;
381+
let ability_data = self
382+
.character
383+
.ability_data
384+
.as_mut()
385+
.context("failed to read Player ability data")?;
383386

384-
if self.player_level > 2 {
385-
ability_data.ability_points = self.player_level - 2;
386-
}
387+
//Reset our skill tree also
388+
ability_data
389+
.tree_item_list
390+
.iter_mut()
391+
.for_each(|ti| ti.points = 0);
387392

388-
self.player_class = player_class;
393+
if self.player_level > 2 {
394+
ability_data.ability_points = self.player_level - 2;
395+
}
396+
397+
self.player_class = player_class;
398+
}
389399

390400
Ok(())
391401
}
@@ -395,31 +405,43 @@ impl CharacterData {
395405
}
396406

397407
pub fn set_player_level(&mut self, experience_points: i32) -> Result<()> {
398-
self.player_level = experience_to_level(experience_points).with_context(|| {
399-
format!(
400-
"failed to set level for experience points: {}",
401-
experience_points
402-
)
403-
})?;
408+
if experience_points != self.character.experience_points {
409+
self.player_level = experience_to_level(experience_points).with_context(|| {
410+
format!(
411+
"failed to set level for experience points: {}",
412+
experience_points
413+
)
414+
})?;
404415

405-
self.character.experience_points = experience_points;
416+
self.character.experience_points = experience_points;
406417

407-
self.set_game_stat(LEVEL_STAT, self.player_level);
418+
self.set_game_stat(LEVEL_STAT, self.player_level);
408419

409-
let ability_data = self
410-
.character
411-
.ability_data
412-
.as_mut()
413-
.context("failed to read Player ability data")?;
420+
let ability_data = self
421+
.character
422+
.ability_data
423+
.as_mut()
424+
.context("failed to read Player ability data")?;
414425

415-
//Unlock skill tree
416-
if self.player_level > 1 && ability_data.tree_grade == 0 {
417-
ability_data.tree_grade = 2;
418-
}
426+
//Reset existing skill tree
427+
ability_data
428+
.tree_item_list
429+
.iter_mut()
430+
.for_each(|ti| ti.points = 0);
419431

420-
for (challenge_level, challenge_obj) in LEVEL_CHALLENGES {
421-
if self.player_level >= challenge_level {
422-
self.unlock_challenge_obj(challenge_obj, 1, 0)?;
432+
//Unlock skill tree
433+
if self.player_level > 1 && ability_data.tree_grade == 0 {
434+
ability_data.tree_grade = 2;
435+
}
436+
437+
if self.player_level > 2 {
438+
ability_data.ability_points = self.player_level - 2;
439+
}
440+
441+
for (challenge_level, challenge_obj) in LEVEL_CHALLENGES {
442+
if self.player_level >= challenge_level {
443+
self.unlock_challenge_obj(challenge_obj, 1, 0)?;
444+
}
423445
}
424446
}
425447

bl3_save_edit_ui/src/views/item_editor/editor.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use iced::{
44
};
55

66
use bl3_save_edit_core::bl3_item::{BalancePart, Bl3Item, InvDataPart, ManufacturerPart};
7+
use bl3_save_edit_core::bl3_save::character_data::MAX_CHARACTER_LEVEL;
78
use bl3_save_edit_core::resources::{
89
INVENTORY_BALANCE_PARTS, INVENTORY_INV_DATA_PARTS, INVENTORY_MANUFACTURER_PARTS,
910
INVENTORY_PARTS_ALL_CATEGORIZED, INVENTORY_SERIAL_DB_PARTS_CATEGORIZED,
@@ -15,7 +16,6 @@ use crate::resources::fonts::{JETBRAINS_MONO, JETBRAINS_MONO_BOLD};
1516
use crate::views::item_editor::available_parts::AvailableParts;
1617
use crate::views::item_editor::current_parts::CurrentParts;
1718
use crate::views::item_editor::ItemEditorInteractionMessage;
18-
use crate::views::manage_save::character::MAX_CHARACTER_LEVEL;
1919
use crate::views::InteractionExt;
2020
use crate::widgets::labelled_element::LabelledElement;
2121
use crate::widgets::number_input::NumberInput;

bl3_save_edit_ui/src/views/item_editor/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use bl3_save_edit_core::bl3_item::{
1212
MAX_BL3_ITEM_PARTS,
1313
};
1414
use bl3_save_edit_core::bl3_profile::Bl3Profile;
15+
use bl3_save_edit_core::bl3_save::character_data::MAX_CHARACTER_LEVEL;
1516
use bl3_save_edit_core::bl3_save::Bl3Save;
1617
use bl3_save_edit_core::resources::INVENTORY_SERIAL_DB;
1718

@@ -22,7 +23,6 @@ use crate::views::item_editor::available_parts::AvailablePartTypeIndex;
2223
use crate::views::item_editor::current_parts::CurrentPartTypeIndex;
2324
use crate::views::item_editor::item_editor_list_item::ItemEditorListItem;
2425
use crate::views::item_editor::parts_tab_bar::{AvailablePartType, CurrentPartType};
25-
use crate::views::manage_save::character::MAX_CHARACTER_LEVEL;
2626
use crate::views::InteractionExt;
2727
use crate::widgets::labelled_element::LabelledElement;
2828
use crate::widgets::notification::{Notification, NotificationSentiment};

bl3_save_edit_ui/src/views/manage_save/character/mod.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use iced::{
22
pick_list, text_input, tooltip, Align, Column, Container, Length, PickList, Row, Tooltip,
33
};
44

5+
use bl3_save_edit_core::bl3_save::character_data::MAX_CHARACTER_LEVEL;
56
use bl3_save_edit_core::bl3_save::player_class::PlayerClass;
67
use bl3_save_edit_core::bl3_save::util::REQUIRED_XP_LIST;
78
use bl3_save_edit_core::game_data::GameDataKv;
@@ -24,8 +25,6 @@ mod gear;
2425
mod sdu;
2526
mod skins;
2627

27-
pub const MAX_CHARACTER_LEVEL: usize = 72;
28-
2928
#[derive(Debug, Default)]
3029
pub struct CharacterState {
3130
pub name_input: String,

0 commit comments

Comments
 (0)