Skip to content

Commit 6953b02

Browse files
committed
Allow modifying skill points of character
1 parent 9a43124 commit 6953b02

File tree

4 files changed

+98
-12
lines changed

4 files changed

+98
-12
lines changed

bl3_save_edit_core/src/bl3_save/character_data.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ pub struct CharacterData {
4040
pub character: Character,
4141
player_class: PlayerClass,
4242
player_level: i32,
43+
ability_points: i32,
4344
guardian_rank: i32,
4445
head_skin_selected: GameDataKv,
4546
character_skin_selected: GameDataKv,
@@ -64,7 +65,15 @@ impl CharacterData {
6465
.map(|p| p.player_class_path.as_str())
6566
.context("failed to read player class")?,
6667
)?;
68+
6769
let player_level = experience_to_level(character.experience_points)?;
70+
71+
let ability_points = character
72+
.ability_data
73+
.as_ref()
74+
.context("failed to read Player ability data")?
75+
.ability_points;
76+
6877
let guardian_rank = character
6978
.guardian_rank_character_data
7079
.as_ref()
@@ -348,6 +357,7 @@ impl CharacterData {
348357
character,
349358
player_class,
350359
player_level,
360+
ability_points,
351361
guardian_rank,
352362
head_skin_selected,
353363
character_skin_selected,
@@ -448,6 +458,26 @@ impl CharacterData {
448458
Ok(())
449459
}
450460

461+
pub fn ability_points(&self) -> i32 {
462+
self.ability_points
463+
}
464+
465+
pub fn set_ability_points(&mut self, ability_points: i32) -> Result<()> {
466+
let ability_data = self
467+
.character
468+
.ability_data
469+
.as_mut()
470+
.context("failed to read Player ability data")?;
471+
472+
if ability_points != ability_data.ability_points {
473+
ability_data.ability_points = ability_points;
474+
475+
self.ability_points = ability_points;
476+
}
477+
478+
Ok(())
479+
}
480+
451481
pub fn guardian_rank(&self) -> i32 {
452482
self.guardian_rank
453483
}

bl3_save_edit_ui/src/bl3_ui.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ impl Application for Bl3Application {
362362
.character_state
363363
.name_input = name_input;
364364
}
365-
SaveCharacterInteractionMessage::XpLevel(level) => {
365+
SaveCharacterInteractionMessage::Level(level) => {
366366
let xp_points = if level > 0 {
367367
REQUIRED_XP_LIST[level as usize - 1][0]
368368
} else {
@@ -378,7 +378,7 @@ impl Application for Bl3Application {
378378

379379
character_state.experience_points_input = xp_points;
380380
}
381-
SaveCharacterInteractionMessage::XpPoints(xp) => {
381+
SaveCharacterInteractionMessage::ExperiencePoints(xp) => {
382382
let level = experience_to_level(xp as i32).unwrap_or(1);
383383

384384
let character_state = &mut self
@@ -390,6 +390,12 @@ impl Application for Bl3Application {
390390

391391
character_state.level_input = level;
392392
}
393+
SaveCharacterInteractionMessage::AbilityPoints(points) => {
394+
self.manage_save_state
395+
.save_view_state
396+
.character_state
397+
.ability_points_input = points;
398+
}
393399
SaveCharacterInteractionMessage::SduMessage(sdu_message) => {
394400
let sdu_unlocker = &mut self
395401
.manage_save_state

bl3_save_edit_ui/src/state_mappers/manage_save/character.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ pub fn map_save_to_character_state(manage_save_state: &mut ManageSaveState) {
3131
.character_state
3232
.experience_points_input = save.character_data.character.experience_points;
3333

34+
manage_save_state
35+
.save_view_state
36+
.character_state
37+
.ability_points_input = save.character_data.ability_points();
38+
3439
manage_save_state
3540
.save_view_state
3641
.character_state
@@ -178,6 +183,13 @@ pub fn map_character_state_to_save(
178183
.player_class_selected_class,
179184
)?;
180185

186+
save.character_data.set_ability_points(
187+
manage_save_state
188+
.save_view_state
189+
.character_state
190+
.ability_points_input,
191+
)?;
192+
181193
save.character_data.set_head_skin_selected(
182194
&manage_save_state
183195
.save_view_state

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

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ pub struct CharacterState {
3434
pub level_input: i32,
3535
pub xp_level_input_state: text_input::State,
3636
pub experience_points_input: i32,
37-
pub xp_points_input_state: text_input::State,
37+
pub experience_points_input_state: text_input::State,
38+
pub ability_points_input: i32,
39+
pub ability_points_input_state: text_input::State,
3840
pub skin_selectors: SkinSelectors,
3941
pub gear_unlocker: GearUnlocker,
4042
pub ammo_setter: AmmoSetter,
@@ -44,8 +46,9 @@ pub struct CharacterState {
4446
#[derive(Debug, Clone)]
4547
pub enum SaveCharacterInteractionMessage {
4648
Name(String),
47-
XpLevel(i32),
48-
XpPoints(i32),
49+
Level(i32),
50+
ExperiencePoints(i32),
51+
AbilityPoints(i32),
4952
PlayerClassSelected(PlayerClass),
5053
SkinMessage(CharacterSkinSelectedMessage),
5154
GearMessage(CharacterGearUnlockedMessage),
@@ -176,7 +179,7 @@ pub fn view(character_state: &mut CharacterState) -> Container<Bl3Message> {
176179
.push(player_class)
177180
.spacing(20);
178181

179-
let xp_level = Container::new(
182+
let level = Container::new(
180183
LabelledElement::create(
181184
"Level",
182185
Length::Units(60),
@@ -189,7 +192,7 @@ pub fn view(character_state: &mut CharacterState) -> Container<Bl3Message> {
189192
|v| {
190193
InteractionMessage::ManageSaveInteraction(
191194
ManageSaveInteractionMessage::Character(
192-
SaveCharacterInteractionMessage::XpLevel(v),
195+
SaveCharacterInteractionMessage::Level(v),
193196
),
194197
)
195198
},
@@ -216,20 +219,20 @@ pub fn view(character_state: &mut CharacterState) -> Container<Bl3Message> {
216219
.height(Length::Units(36))
217220
.style(Bl3UiStyle);
218221

219-
let xp_points = Container::new(
222+
let experience_points = Container::new(
220223
LabelledElement::create(
221224
"Experience",
222225
Length::Units(95),
223226
Tooltip::new(
224227
NumberInput::new(
225-
&mut character_state.xp_points_input_state,
228+
&mut character_state.experience_points_input_state,
226229
character_state.experience_points_input,
227230
0,
228231
Some(REQUIRED_XP_LIST[MAX_CHARACTER_LEVEL - 1][0]),
229232
|v| {
230233
InteractionMessage::ManageSaveInteraction(
231234
ManageSaveInteractionMessage::Character(
232-
SaveCharacterInteractionMessage::XpPoints(v),
235+
SaveCharacterInteractionMessage::ExperiencePoints(v),
233236
),
234237
)
235238
},
@@ -256,7 +259,42 @@ pub fn view(character_state: &mut CharacterState) -> Container<Bl3Message> {
256259
.height(Length::Units(36))
257260
.style(Bl3UiStyle);
258261

259-
let xp_row = Row::new().push(xp_level).push(xp_points).spacing(20);
262+
let ability_points = Container::new(
263+
LabelledElement::create(
264+
"Ability Points",
265+
Length::Units(130),
266+
NumberInput::new(
267+
&mut character_state.ability_points_input_state,
268+
character_state.ability_points_input,
269+
0,
270+
Some(i32::MAX),
271+
|v| {
272+
InteractionMessage::ManageSaveInteraction(
273+
ManageSaveInteractionMessage::Character(
274+
SaveCharacterInteractionMessage::AbilityPoints(v),
275+
),
276+
)
277+
},
278+
)
279+
.0
280+
.font(JETBRAINS_MONO)
281+
.padding(10)
282+
.size(17)
283+
.style(Bl3UiStyle)
284+
.into_element(),
285+
)
286+
.spacing(15)
287+
.align_items(Align::Center),
288+
)
289+
.width(Length::Fill)
290+
.height(Length::Units(36))
291+
.style(Bl3UiStyle);
292+
293+
let experience_and_level_row = Row::new()
294+
.push(level)
295+
.push(experience_points)
296+
.push(ability_points)
297+
.spacing(20);
260298

261299
let skin_unlocker = character_state.skin_selectors.view(&selected_class);
262300

@@ -283,7 +321,7 @@ pub fn view(character_state: &mut CharacterState) -> Container<Bl3Message> {
283321

284322
let all_contents = Column::new()
285323
.push(name_class_row)
286-
.push(xp_row)
324+
.push(experience_and_level_row)
287325
.push(skin_unlocker)
288326
.push(slot_sdu_row)
289327
.spacing(20);

0 commit comments

Comments
 (0)