Skip to content

Commit 7c94d1d

Browse files
committed
init
1 parent d1b0324 commit 7c94d1d

File tree

4 files changed

+132
-34
lines changed

4 files changed

+132
-34
lines changed

dynamic/src/consts.rs

+8
Original file line numberDiff line numberDiff line change
@@ -638,12 +638,20 @@ pub mod vars {
638638
pub mod instance {
639639
// flags
640640
pub const DISABLE_SPECIAL_HI: i32 = 0x01FF; //Weird value to avoid conflicts with copy ability values
641+
642+
// copy ability
643+
// flags
644+
pub const SHOULD_CYCLE_MATERIAL: i32 = 0x01F4;
645+
646+
// ints
647+
pub const MATERIAL_INDEX: i32 = 0x01F5;
641648
}
642649
pub mod status {
643650
// copy ability
644651
// flags
645652
pub use super::super::mario::status::IS_SPECIAL_N_FIREBRAND;
646653
pub use super::super::mariod::status::CHILL_PILL;
654+
pub const MINING_TIMER: i32 = 0x11F4;
647655
}
648656
}
649657

fighters/kirby/src/opff.rs

+21
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,24 @@ unsafe fn trail_magic_cycle(fighter: &mut L2CFighterCommon, boma: &mut BattleObj
411411
}
412412
}
413413

414+
// handles kirby's mining behavior when copying steve
415+
unsafe fn pickel_mining(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectModuleAccessor) {
416+
if WorkModule::get_int(boma, *FIGHTER_KIRBY_INSTANCE_WORK_ID_INT_COPY_CHARA) == *FIGHTER_KIND_PICKEL {
417+
if VarModule::get_int(boma.object(), vars::kirby::instance::MATERIAL_INDEX) as i32 > 99 {
418+
VarModule::set_int(boma.object(), vars::kirby::instance::MATERIAL_INDEX, 0);
419+
}
420+
421+
// wait 2 frames before letting the material table advance, preventing any jumps in entries
422+
if !VarModule::is_flag(boma.object(), vars::kirby::instance::SHOULD_CYCLE_MATERIAL) {
423+
if VarModule::get_int(boma.object(), vars::kirby::status::MINING_TIMER) == 0 {
424+
VarModule::on_flag(boma.object(), vars::kirby::instance::SHOULD_CYCLE_MATERIAL);
425+
} else {
426+
VarModule::dec_int(boma.object(), vars::kirby::status::MINING_TIMER);
427+
}
428+
}
429+
}
430+
}
431+
414432
// Bite Early Throw and Turnaround
415433
unsafe fn bite_early_throw_turnaround(boma: &mut BattleObjectModuleAccessor, status_kind: i32, stick_x: f32, facing: f32, frame: f32) {
416434
if StatusModule::is_changing(boma) {
@@ -1156,6 +1174,9 @@ pub unsafe fn moveset(fighter: &mut L2CFighterCommon, boma: &mut BattleObjectMod
11561174
// Sora Magic Cycle Adjustment
11571175
trail_magic_cycle(fighter, boma, frame);
11581176

1177+
// Steve Mining
1178+
pickel_mining(fighter, boma);
1179+
11591180
// Bite Early Throw and Turnaround
11601181
bite_early_throw_turnaround(boma, status_kind, stick_x, facing, frame);
11611182

fighters/pickel/src/material_table.rs

+61-33
Original file line numberDiff line numberDiff line change
@@ -27,43 +27,71 @@ pub unsafe extern "C" fn material_table_hook(fighter: &mut Fighter, arg2: u64, a
2727
];
2828

2929
let pickel = &mut (*fighter).battle_object;
30-
let index = VarModule::get_int(pickel, vars::pickel::instance::MATERIAL_INDEX) as i32;
31-
let material = material_table[index as usize] as u32; // stores current table index to return
32-
if VarModule::is_flag(pickel, vars::pickel::instance::SHOULD_CYCLE_MATERIAL) {
33-
if material == (gold as u32) { // add redstone to gold entries
34-
let pickel_boma = pickel.module_accessor;
35-
let current_redstone = WorkModule::get_int(pickel_boma, *FIGHTER_PICKEL_INSTANCE_WORK_ID_INT_MATERIAL_NUM_RED_STONE);
36-
let max_redstone = WorkModule::get_param_int(pickel_boma, hash40("param_private"), hash40("material_red_stone_max"));
37-
let mut gain_amount = 6; // number of redstone steve should receive when mining gold
38-
if (current_redstone + gain_amount) <= max_redstone {
39-
FighterSpecializer_Pickel::add_material_num(pickel_boma, *FIGHTER_PICKEL_MATERIAL_KIND_RED_STONE, gain_amount);
40-
} else if current_redstone != max_redstone {
41-
gain_amount = max_redstone - current_redstone;
42-
FighterSpecializer_Pickel::add_material_num(pickel_boma, *FIGHTER_PICKEL_MATERIAL_KIND_RED_STONE, gain_amount);
30+
let kind = pickel.kind as i32;
31+
if kind != *FIGHTER_KIND_KIRBY {
32+
let index = VarModule::get_int(pickel, vars::pickel::instance::MATERIAL_INDEX) as i32;
33+
let material = material_table[index as usize] as u32; // stores current table index to return
34+
if VarModule::is_flag(pickel, vars::pickel::instance::SHOULD_CYCLE_MATERIAL) {
35+
if material == (gold as u32) { // add redstone to gold entries
36+
let pickel_boma = pickel.module_accessor;
37+
let current_redstone = WorkModule::get_int(pickel_boma, *FIGHTER_PICKEL_INSTANCE_WORK_ID_INT_MATERIAL_NUM_RED_STONE);
38+
let max_redstone = WorkModule::get_param_int(pickel_boma, hash40("param_private"), hash40("material_red_stone_max"));
39+
let mut gain_amount = 6; // number of redstone steve should receive when mining gold
40+
if (current_redstone + gain_amount) <= max_redstone {
41+
FighterSpecializer_Pickel::add_material_num(pickel_boma, *FIGHTER_PICKEL_MATERIAL_KIND_RED_STONE, gain_amount);
42+
} else if current_redstone != max_redstone {
43+
gain_amount = max_redstone - current_redstone;
44+
FighterSpecializer_Pickel::add_material_num(pickel_boma, *FIGHTER_PICKEL_MATERIAL_KIND_RED_STONE, gain_amount);
45+
}
4346
}
47+
if (0..99).contains(&index) { // continue the cycle
48+
VarModule::inc_int(pickel, vars::pickel::instance::MATERIAL_INDEX);
49+
} else { // reset the cycle
50+
VarModule::set_int(pickel, vars::pickel::instance::MATERIAL_INDEX, 0);
51+
}
52+
VarModule::off_flag(pickel, vars::pickel::instance::SHOULD_CYCLE_MATERIAL);
53+
VarModule::set_int(pickel, vars::pickel::status::MINING_TIMER, 2);
54+
// logging for debug purposes
55+
// let mut mat_name = "nothing lol";
56+
// if material == 0 { mat_name = "dirt"; }
57+
// else if material == 1 { mat_name = "wood"; }
58+
// else if material == 2 { mat_name = "stone"; }
59+
// else if material == 3 { mat_name = "iron"; }
60+
// else if material == 4 { mat_name = "gold"; }
61+
// else if material == 5 { mat_name = "redstone"; }
62+
// else if material == 6 { mat_name = "diamond"; }
63+
// else { mat_name = "...what?"; }
64+
// println!("Steve mines entry {}/100, which is {}.", (index +1), mat_name);
65+
}
66+
67+
return material;
68+
} else { // alternative logic for kirby
69+
let index = VarModule::get_int(pickel, vars::kirby::instance::MATERIAL_INDEX) as i32;
70+
let material = material_table[index as usize] as u32; // stores current table index to return
71+
if VarModule::is_flag(pickel, vars::kirby::instance::SHOULD_CYCLE_MATERIAL) {
72+
if (0..99).contains(&index) { // continue the cycle
73+
VarModule::inc_int(pickel, vars::kirby::instance::MATERIAL_INDEX);
74+
} else { // reset the cycle
75+
VarModule::set_int(pickel, vars::kirby::instance::MATERIAL_INDEX, 0);
76+
}
77+
VarModule::off_flag(pickel, vars::kirby::instance::SHOULD_CYCLE_MATERIAL);
78+
VarModule::set_int(pickel, vars::kirby::status::MINING_TIMER, 2);
79+
// logging for debug purposes
80+
// let mut mat_name = "nothing lol";
81+
// if material == 0 { mat_name = "dirt"; }
82+
// else if material == 1 { mat_name = "wood"; }
83+
// else if material == 2 { mat_name = "stone"; }
84+
// else if material == 3 { mat_name = "iron"; }
85+
// else if material == 4 { mat_name = "gold. He gets iron instead"; }
86+
// else if material == 6 { mat_name = "diamond. He gets iron instead"; }
87+
// else { mat_name = "...what?"; }
88+
// println!("Kirby mines entry {}/100, which is {}.", (index +1), mat_name);
4489
}
45-
if (0..99).contains(&index) { // continue the cycle
46-
VarModule::inc_int(pickel, vars::pickel::instance::MATERIAL_INDEX);
47-
} else { // reset the cycle
48-
VarModule::set_int(pickel, vars::pickel::instance::MATERIAL_INDEX, 0);
90+
if material == (4 | 6) {
91+
return 3; // give kirby iron instead of gold/diamond
4992
}
50-
VarModule::off_flag(pickel, vars::pickel::instance::SHOULD_CYCLE_MATERIAL);
51-
VarModule::set_int(pickel, vars::pickel::status::MINING_TIMER, 2);
52-
// logging for debug purposes
53-
// let mut mat_name = "nothing lol";
54-
// if material == 0 { mat_name = "dirt"; }
55-
// else if material == 1 { mat_name = "wood"; }
56-
// else if material == 2 { mat_name = "stone"; }
57-
// else if material == 3 { mat_name = "iron"; }
58-
// else if material == 4 { mat_name = "gold"; }
59-
// else if material == 5 { mat_name = "redstone"; }
60-
// else if material == 6 { mat_name = "diamond"; }
61-
// else { mat_name = "...what?"; }
62-
// println!("Steve mines entry {}/100, which is {}.", (index +1), mat_name);
93+
return material;
6394
}
64-
65-
66-
return material;
6795
}
6896

6997
// overrides stage id check for things such as mining speed

fighters/pickel/src/status.rs

+42-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ pub fn install() {
99
guarddamage_end,
1010
guard,
1111
rebirth,
12+
entry,
1213
attack_air_lw_start_main,
1314
special_s_pre,
1415
pre_jump
@@ -74,7 +75,7 @@ pub unsafe fn rebirth(fighter: &mut L2CFighterCommon) -> L2CValue {
7475
let dirt = WorkModule::get_int(fighter.boma(), *FIGHTER_PICKEL_INSTANCE_WORK_ID_INT_MATERIAL_NUM_GRADE_1);
7576
let wood = WorkModule::get_int(fighter.boma(), *FIGHTER_PICKEL_INSTANCE_WORK_ID_INT_MATERIAL_NUM_WOOD);
7677
let stone = WorkModule::get_int(fighter.boma(), *FIGHTER_PICKEL_INSTANCE_WORK_ID_INT_MATERIAL_NUM_STONE);
77-
let iron =WorkModule::get_int(fighter.boma(), *FIGHTER_PICKEL_INSTANCE_WORK_ID_INT_MATERIAL_NUM_IRON);
78+
let iron = WorkModule::get_int(fighter.boma(), *FIGHTER_PICKEL_INSTANCE_WORK_ID_INT_MATERIAL_NUM_IRON);
7879
let gold = WorkModule::get_int(fighter.boma(), *FIGHTER_PICKEL_INSTANCE_WORK_ID_INT_MATERIAL_NUM_GOLD);
7980
let diamond = WorkModule::get_int(fighter.boma(), *FIGHTER_PICKEL_INSTANCE_WORK_ID_INT_MATERIAL_NUM_DIAMOND);
8081
let redstone = WorkModule::get_int(fighter.boma(), *FIGHTER_PICKEL_INSTANCE_WORK_ID_INT_MATERIAL_NUM_RED_STONE);
@@ -103,6 +104,46 @@ pub unsafe fn rebirth(fighter: &mut L2CFighterCommon) -> L2CValue {
103104
return original!(fighter);
104105
}
105106

107+
// handles materials when steve is entering the match, to account for salty runbacks
108+
#[status_script(agent = "pickel", status = FIGHTER_STATUS_KIND_ENTRY, condition = LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN)]
109+
pub unsafe fn entry(fighter: &mut L2CFighterCommon) -> L2CValue {
110+
let dirt = WorkModule::get_int(fighter.boma(), *FIGHTER_PICKEL_INSTANCE_WORK_ID_INT_MATERIAL_NUM_GRADE_1);
111+
let wood = WorkModule::get_int(fighter.boma(), *FIGHTER_PICKEL_INSTANCE_WORK_ID_INT_MATERIAL_NUM_WOOD);
112+
let stone = WorkModule::get_int(fighter.boma(), *FIGHTER_PICKEL_INSTANCE_WORK_ID_INT_MATERIAL_NUM_STONE);
113+
let iron = WorkModule::get_int(fighter.boma(), *FIGHTER_PICKEL_INSTANCE_WORK_ID_INT_MATERIAL_NUM_IRON);
114+
let gold = WorkModule::get_int(fighter.boma(), *FIGHTER_PICKEL_INSTANCE_WORK_ID_INT_MATERIAL_NUM_GOLD);
115+
let diamond = WorkModule::get_int(fighter.boma(), *FIGHTER_PICKEL_INSTANCE_WORK_ID_INT_MATERIAL_NUM_DIAMOND);
116+
let redstone = WorkModule::get_int(fighter.boma(), *FIGHTER_PICKEL_INSTANCE_WORK_ID_INT_MATERIAL_NUM_RED_STONE);
117+
let remove_mats: [[i32;2];4] = [ // these materials will be removed on entry
118+
[*FIGHTER_PICKEL_MATERIAL_KIND_STONE, stone],
119+
[*FIGHTER_PICKEL_MATERIAL_KIND_IRON, iron],
120+
[*FIGHTER_PICKEL_MATERIAL_KIND_GOLD, dirt],
121+
[*FIGHTER_PICKEL_MATERIAL_KIND_DIAMOND, wood]];
122+
for material in remove_mats {
123+
let (kind, has) = (material[0], material[1]);
124+
if has > 0 {
125+
FighterSpecializer_Pickel::sub_material_num(fighter.boma(), kind, has);
126+
}
127+
}
128+
let init_dirt = WorkModule::get_param_int(fighter.boma(), hash40("param_private"), hash40("start_material_grade_1_num"));
129+
let init_wood = WorkModule::get_param_int(fighter.boma(), hash40("param_private"), hash40("start_material_wood_num"));
130+
let init_rstn = WorkModule::get_param_int(fighter.boma(), hash40("param_private"), hash40("start_material_red_stone_num"));
131+
let init_mats: [[i32;3];3] = [ // these materials will be reverted to the initial amount defined in params
132+
[*FIGHTER_PICKEL_MATERIAL_KIND_GRADE_1, dirt, init_dirt],
133+
[*FIGHTER_PICKEL_MATERIAL_KIND_WOOD, wood, init_wood],
134+
[*FIGHTER_PICKEL_MATERIAL_KIND_RED_STONE, redstone, init_rstn]];
135+
for material in init_mats {
136+
let (kind, has, init) = (material[0], material[1], material[2]);
137+
if has > init {
138+
FighterSpecializer_Pickel::sub_material_num(fighter.boma(), kind, (has - init));
139+
} else if has < init {
140+
FighterSpecializer_Pickel::add_material_num(fighter.boma(), kind, (init - has));
141+
}
142+
}
143+
144+
return original!(fighter);
145+
}
146+
106147
#[status_script(agent = "pickel", status = FIGHTER_PICKEL_STATUS_KIND_ATTACK_AIR_LW_START, condition = LUA_SCRIPT_STATUS_FUNC_STATUS_MAIN)]
107148
unsafe fn attack_air_lw_start_main(fighter: &mut L2CFighterCommon) -> L2CValue {
108149
if pickel_attack_que(fighter).get_bool() {

0 commit comments

Comments
 (0)