Skip to content

Commit b0c4c0a

Browse files
triabolicalsRaytwo
andauthored
Config/YesNo Dialog Expansion, Fully defined Structs, Stream additions, DynValue fix and more (#42)
* Dictionary Changes + SpriteAtlas Update * Typo in AtlasManager struct name and Dictionary for CommonRewardSequence * DVC additions * DVC additions * update * Stream, ConfigBasicMenu Addition, Keyboard * update cargo toml to version 0.11.0 --------- Co-authored-by: Raytwo <[email protected]>
1 parent a43c2bf commit b0c4c0a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+1748
-163
lines changed

Cargo.toml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
[package]
22
name = "engage"
3-
version = "0.10.0"
3+
version = "0.11.0"
44
edition = "2021"
55

66
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
77

88
[dependencies]
9+
num-traits = "0.2"
10+
num-derive = "0.4"
911
skyline = "0.5"
1012
unity = { version = "0.3.0", git = "https://github.com/DivineDragonFanClub/unity" }
1113
modular-bitfield = "0.11.2"
12-
once_cell = "1.17.0"
1314
bitflags = "2.4.0"
14-
lazysimd = { git = "https://github.com/Raytwo/lazysimd" }
15+
lazysimd = { git = "https://github.com/Raytwo/lazysimd" }

src/ai.rs

Whitespace-only changes.

src/battle.rs

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use unity::il2cpp::object::Array;
22
use unity::prelude::*;
3-
use crate::gamedata::{item::UnitItem, terrain::TerrainData, unit::Unit, WeaponMask};
3+
use crate::gamedata::{item::UnitItem, terrain::TerrainData, unit::Unit, WeaponMask, skill::SkillArray};
44

55
#[unity::class("App", "CapabilityInt")]
66
pub struct CapabilityInt {
@@ -15,39 +15,74 @@ pub struct BattleDetail {
1515
#[unity::class("App", "BattleInfoSide")]
1616
pub struct BattleInfoSide {
1717
//junk : [u8; 0x48],
18-
info: u64,
18+
info: &'static mut BattleInfo,
1919
pub side_type : i32,
2020
__ : i32,
2121
pub unit: Option<&'static Unit>,
22-
pub unit_item: &'static UnitItem,
22+
pub unit_item: Option<&'static UnitItem>,
2323
pub specified_item: &'static UnitItem,
2424
pub x: i32,
2525
pub z: i32,
2626
pub terrain: &'static TerrainData,
2727
pub overlap: &'static TerrainData,
28-
pub status: &'static WeaponMask,
28+
pub status: &'static mut WeaponMask,
2929
pub detail: &'static BattleDetail,
3030
hierarchy: u64,
3131
support: u64,
3232
pub parent: &'static BattleInfoSide,
3333
pub reverse: &'static BattleInfoSide,
34+
destroy: *const u8,
35+
pub mask_skill: &'static SkillArray,
36+
pub level: i32,
37+
pub hp: i32,
38+
pub gain_exp: i32,
39+
pub gain_gold: i32,
40+
pub drop_item_ratio: f32,
41+
pub pick_up_item: i32,
42+
pub damage: i32,
43+
pub heal: i32,
44+
pub battle_times: i32,
45+
pub total_order: i32,
46+
pub total_action: i32,
47+
pub total_attack: i32,
48+
pub total_damage: i32,
49+
pub total_result: i32,
50+
pub temporary: i32,
51+
pub stun: i32,
52+
pub engage_count: i32,
53+
pub engage_first_count: i32,
54+
pub blown_distance: i32,
55+
pub weapon_expend: i32,
56+
pub expend_count: i32,
3457
}
3558

3659
#[unity::class("App", "BattleInfo")]
3760
pub struct BattleInfo {}
3861

62+
impl BattleInfo {
63+
pub fn get_unit(&self, side: i32) -> Option<&'static Unit> {
64+
unsafe {
65+
battle_info_get_unit(self, side, None)
66+
}
67+
}
68+
}
3969
#[unity::class("App", "BattleCalculator")]
4070
pub struct BattleCalculator {
4171
pub mode: i32,
4272
pub info: &'static BattleInfo,
4373
}
4474
impl BattleCalculator {
4575
pub fn get_dead_side(&self) -> i32 { unsafe { battlecalcultor_get_deadside(self, None) }}
76+
pub fn get_side(&self, side: i32) -> Option<&'static mut BattleInfoSide> {
77+
unsafe { battle_calculator_get_side(self, side, None) }
78+
}
4679
}
4780

4881
#[unity::from_offset("App", "BattleCalculator", "GetDeadSide")]
4982
fn battlecalcultor_get_deadside(this: &BattleCalculator,method_info: OptionalMethod) -> i32;
5083

51-
5284
#[skyline::from_offset(0x01e7f750)]
53-
pub fn battle_info_get_unit(this: &BattleInfo, index: i32, method_info: OptionalMethod) -> &Unit;
85+
pub fn battle_info_get_unit(this: &BattleInfo, index: i32, method_info: OptionalMethod) -> Option<&'static Unit>;
86+
87+
#[skyline::from_offset(0x0246f1a0)]
88+
pub fn battle_calculator_get_side(this: &BattleCalculator, side: i32, method_info: OptionalMethod) -> Option<&'static mut BattleInfoSide>;

src/bit.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
use unity::il2cpp::object::Array;
2+
use unity::prelude::*;
3+
4+
#[unity::class("App", "BitStruct")]
5+
pub struct BitStruct {
6+
pub bits: &'static Array<u8>,
7+
}
8+
9+
// BitStructFields is the only part of the whole class that gets used in functions
10+
impl BitStructFields {
11+
pub fn get(&self, index: i32) -> bool {
12+
unsafe { bitstruct_get(&self, index, None) }
13+
}
14+
pub fn set(&self, index: i32, value: bool) {
15+
unsafe { bitstruct_set(&self, index, value, None); }
16+
}
17+
pub fn set_by_toggle(&self, index: i32) {
18+
unsafe { bitstruct_set_toggle(&self, index, None); }
19+
}
20+
}
21+
22+
#[skyline::from_offset(0x02988ee0)]
23+
fn bitstruct_get(this: &BitStructFields, index: i32, method_info: OptionalMethod) -> bool;
24+
25+
#[skyline::from_offset(0x2988f30)]
26+
fn bitstruct_set(this: &BitStructFields, index: i32, enable: bool, method_info: OptionalMethod) -> bool;
27+
28+
#[skyline::from_offset(0x02988fb0)]
29+
fn bitstruct_set_toggle(this: &BitStructFields, index: i32, method_info: OptionalMethod) -> bool;

src/combat.rs

Lines changed: 91 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
//! Types and methods to query the state of [`Unit`](crate::gamedata::unit::Unit)s in battle.
22
3+
use unity::engine::Color;
4+
use unity::il2cpp::object::Array;
35
use unity::prelude::*;
6+
use unity::system::List;
7+
use crate::battle::BattleCalculator;
8+
use crate::force::Force;
9+
use crate::gamedata::{JobData, PersonData};
10+
use crate::gamedata::assettable::{AssetTableResult, AssetTableSound};
11+
use crate::gamedata::item::UnitItem;
412
use crate::gamedata::unit::Unit;
513

614
#[unity::class("Combat", "Character")]
@@ -116,11 +124,86 @@ bitflags::bitflags! {
116124

117125
#[unity::class("Combat", "CharacterGameStatus")]
118126
pub struct CharacterGameStatus {
119-
appearance: [u8; 0x18],
120-
pub unit: &'static mut Unit,
127+
pub appearance: &'static mut CharacterAppearance,
128+
pub emblem_identifier: Option<&'static Il2CppString>,
129+
pub side: i32,
130+
pub stun: bool,
131+
pub unit: Option<&'static Unit>,
132+
pub person: Option<&'static PersonData>,
133+
pub job: Option<&'static JobData>,
134+
pub force: Option<&'static Force>,
135+
pub name: Option<&'static Il2CppString>,
136+
pub max_hp: i32,
137+
pub hp: i32,
138+
pub max_stun: i32,
139+
pub stun_value: i32,
140+
pub engage_count: i32,
141+
pub map_x: i32,
142+
pub map_y: i32,
143+
pub battle_x: i32,
144+
pub battle_y: i32,
145+
pub weapon: Option<&'static UnitItem>,
121146
// too lazy to do the rest for now
122147
}
148+
impl CharacterGameStatus {
149+
pub fn import(&self, side: i32, calc: &BattleCalculator, side_type: i32, map_distance: i32) {
150+
unsafe {
151+
combat_character_game_status_import(self, side, calc, side_type, map_distance, None);
152+
}
153+
}
154+
}
155+
156+
#[unity::class("Combat", "CombatRecord")]
157+
pub struct CombatRecord {
158+
pub is_enemy_attack: i32,
159+
pub combat_style: i32,
160+
pub calculator: &'static BattleCalculator,
161+
pub sim_calculator: &'static BattleCalculator,
162+
pub game_status: &'static mut Array<&'static mut CharacterGameStatus>,
163+
pub chain_atk: &'static mut Array<&'static mut CharacterGameStatus>,
164+
pub dragonize: &'static mut Array<&'static mut CharacterGameStatus>,
165+
location: *const u8,
166+
passive_skills: *const u8,
167+
phase_array: &'static Array<&'static Phase>,
168+
pub map_distance: i32,
169+
pub chain_attack_count: i32,
170+
pub finish_style: i32,
171+
}
172+
173+
#[unity::class("Combat", "CharacterAppearance")]
174+
pub struct CharacterAppearance {
175+
pub assets: &'static Array<CharacterAssetT>,
176+
pub animset_names: &'static List<Il2CppString>,
177+
pub acc_target: &'static Array<&'static Il2CppString>,
178+
pub mask_color_100: Color,
179+
pub mask_color_075: Color,
180+
pub mask_color_050: Color,
181+
pub mask_color_025: Color,
182+
pub skin_color: Color,
183+
pub grad_color: Color,
184+
pub hair_color: Color,
185+
pub toon_shadow_color: Color,
186+
pub sound: AssetTableSound,
187+
proporion: *const u8,
188+
animset: *const u8,
189+
weapon_style: i32,
190+
}
123191

192+
impl CharacterAppearance {
193+
pub fn create_from_result(result: &AssetTableResult, distance: i32) -> &'static mut CharacterAppearance {
194+
unsafe {
195+
create_from_result(result, distance, None)
196+
}
197+
}
198+
}
199+
200+
#[unity::class("Combat", "CharacterAsset")]
201+
pub struct CharacterAssetT {
202+
pub asset_type: i32,
203+
pub name: Option<&'static Il2CppString>,
204+
pub addr_path: Option<&'static Il2CppString>,
205+
//...
206+
}
124207
#[repr(C)]
125208
#[derive(Debug)]
126209
/// Used by the game to determine the sound effects to play during damage for zoomed-in combat.
@@ -250,3 +333,9 @@ pub fn side_is_master(i: i32, method_info: OptionalMethod) -> bool;
250333
// Combat.Side$$IsChainAtk 710247cb00 bool Combat.Side$$IsChainAtk(int32_t i, MethodInfo * method) 16
251334
#[unity::from_offset("Combat", "Side", "IsChainAtk")]
252335
pub fn side_is_chain_atk(i: i32, method_info: OptionalMethod) -> bool;
336+
337+
#[skyline::from_offset(0x027e0880)]
338+
fn combat_character_game_status_import(this:&CharacterGameStatus, side: i32, calc: &BattleCalculator, side_type: i32, distance: i32, method_info: OptionalMethod);
339+
340+
#[skyline::from_offset(0x02b0ed80)]
341+
fn create_from_result(result: &AssetTableResult, map_distance: i32, method_info: OptionalMethod) -> &'static mut CharacterAppearance;

src/dialog/yesno.rs

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use unity::prelude::*;
22

33
use super::{BasicDialogItem, BasicDialogItemFields};
4-
use crate::{menu::BasicMenuResult, proc::Bindable};
4+
use crate::{mess::Mess, menu::BasicMenuResult, proc::Bindable};
55

66
#[repr(C)]
77
pub struct YesNoDialog(super::BasicDialog<BasicDialogItem>);
@@ -20,12 +20,21 @@ impl YesNoDialog {
2020
.get_class_mut()
2121
.get_virtual_method_mut("ACall")
2222
.map(|method| method.method_ptr = Methods::on_first_choice as _);
23+
first_item
24+
.get_class_mut()
25+
.get_virtual_method_mut("BCall")
26+
.map(|method| method.method_ptr = Methods::bcall_first as _);
2327

2428
second_item
2529
.get_class_mut()
2630
.get_virtual_method_mut("ACall")
2731
.map(|method| method.method_ptr = Methods::on_second_choice as _);
2832

33+
second_item
34+
.get_class_mut()
35+
.get_virtual_method_mut("BCall")
36+
.map(|method| method.method_ptr = Methods::bcall_second as _);
37+
2938
unsafe {
3039
yesnodialog_createbind(proc, message.as_ref().into(), first_item, second_item, None);
3140
}
@@ -39,10 +48,16 @@ pub trait TwoChoiceDialogMethods {
3948
extern "C" fn on_second_choice(_this: &mut BasicDialogItemNo, _method_info: OptionalMethod) -> BasicMenuResult {
4049
BasicMenuResult::new().with_close_this(true)
4150
}
51+
extern "C" fn bcall_first(_this: &mut BasicDialogItemYes, _method_info: OptionalMethod) -> BasicMenuResult {
52+
BasicMenuResult::new().with_close_this(true).with_se_cancel(true)
53+
}
54+
extern "C" fn bcall_second(_this: &mut BasicDialogItemNo, _method_info: OptionalMethod) -> BasicMenuResult {
55+
BasicMenuResult::new().with_close_this(true).with_se_cancel(true)
56+
}
4257
}
4358

4459
#[unity::from_offset("App", "YesNoDialog", "CreateBind")]
45-
extern "C" fn yesnodialog_createbind<P: Bindable>(
60+
pub extern "C" fn yesnodialog_createbind<P: Bindable>(
4661
proc: &P,
4762
mess: &Il2CppString,
4863
yes_item: &BasicDialogItemYes,
@@ -66,10 +81,12 @@ impl BasicDialogItemYes {
6681
pub fn new(text: impl AsRef<str>) -> &'static mut BasicDialogItemYes {
6782
let item = BasicDialogItemYes::instantiate().unwrap();
6883

69-
unsafe {
70-
dialog_item_yes_ctor(item, text.into(), None);
71-
}
72-
84+
unsafe { dialog_item_yes_ctor(item, text.into(), None); }
85+
item
86+
}
87+
pub fn new_from_mess(mess: impl AsRef<str>) -> &'static mut BasicDialogItemYes {
88+
let item = BasicDialogItemYes::instantiate().unwrap();
89+
unsafe { dialog_item_yes_ctor(item, Mess::get(mess), None); }
7390
item
7491
}
7592
}
@@ -83,11 +100,12 @@ pub struct BasicDialogItemNo {
83100
impl BasicDialogItemNo {
84101
pub fn new(text: impl AsRef<str>) -> &'static mut BasicDialogItemNo {
85102
let item = BasicDialogItemNo::instantiate().unwrap();
86-
87-
unsafe {
88-
dialog_item_no_ctor(item, text.into(), None);
89-
}
90-
103+
unsafe { dialog_item_no_ctor(item, text.into(), None); }
104+
item
105+
}
106+
pub fn new_from_mess(mess: impl AsRef<str>) -> &'static mut BasicDialogItemNo {
107+
let item = BasicDialogItemNo::instantiate().unwrap();
108+
unsafe { dialog_item_no_ctor(item, Mess::get(mess), None); }
91109
item
92110
}
93111
}

0 commit comments

Comments
 (0)