Merge pull request #150 from Lorenzooone/psi_battle_nopp_fix
Fix windows when the "Not enough PP!" message shows up in battle
This commit is contained in:
commit
8f24089e13
|
@ -36,6 +36,7 @@ $input_c_files =
|
||||||
|
|
||||||
$input_c_test_files =
|
$input_c_test_files =
|
||||||
"src/c/tests/main_test.c",
|
"src/c/tests/main_test.c",
|
||||||
|
"src/c/tests/utils.c",
|
||||||
"src/c/tests/battle_test.c",
|
"src/c/tests/battle_test.c",
|
||||||
"src/c/tests/debug_printf/test_print.c",
|
"src/c/tests/debug_printf/test_print.c",
|
||||||
"src/c/tests/debug_printf/mgba.c",
|
"src/c/tests/debug_printf/mgba.c",
|
||||||
|
|
|
@ -37,3 +37,4 @@ byte* __attribute__((naked)) m2_malloc(int size) {}
|
||||||
void __attribute__((naked)) m2_free(int* address) {}
|
void __attribute__((naked)) m2_free(int* address) {}
|
||||||
void __attribute__((naked)) m2_title_teardown() {}
|
void __attribute__((naked)) m2_title_teardown() {}
|
||||||
void __attribute__((naked)) vblank() {}
|
void __attribute__((naked)) vblank() {}
|
||||||
|
void __attribute__((naked)) reg_ram_reset(int flag) {}
|
|
@ -1,8 +1,6 @@
|
||||||
#include "battle_test.h"
|
#include "battle_test.h"
|
||||||
|
#include "utils.h"
|
||||||
#include "debug_printf/test_print.h"
|
#include "debug_printf/test_print.h"
|
||||||
#include "../locs.h"
|
|
||||||
|
|
||||||
bool text_stayed_inside(WINDOW* window);
|
|
||||||
|
|
||||||
void test_encounter_text()
|
void test_encounter_text()
|
||||||
{
|
{
|
||||||
|
@ -44,7 +42,7 @@ void test_death_text()
|
||||||
assert_message(text_stayed_inside(window_pointers[2]), "Death text for Enemy %d", j);
|
assert_message(text_stayed_inside(window_pointers[2]), "Death text for Enemy %d", j);
|
||||||
}
|
}
|
||||||
|
|
||||||
m2_btl_user_ptr->letter = 0x17;
|
m2_btl_user_ptr->letter = W_LETTER - INITIAL_SYMBOL_ENEMY;
|
||||||
m2_btl_user_ptr->unknown_3[0] = 0;
|
m2_btl_user_ptr->unknown_3[0] = 0;
|
||||||
|
|
||||||
for(int j = 0; j <= 230; j++)
|
for(int j = 0; j <= 230; j++)
|
||||||
|
@ -58,38 +56,10 @@ void test_death_text()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool text_stayed_inside(WINDOW* window)
|
static void _setup()
|
||||||
{
|
|
||||||
for(int i = 0; i < window->window_height; i++)
|
|
||||||
if((*tilemap_pointer)[(0x20*(window->window_y + i))+window->window_x + window->window_width] != RIGHT_BORDER_TILE)
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setup_ness_name()
|
|
||||||
{
|
|
||||||
for(int i = 0; i < 5; i++)
|
|
||||||
*(pc_names + i) = W_LETTER;
|
|
||||||
*(pc_names + 5) = 0;
|
|
||||||
*(pc_names + 6) = 0xFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setup_king_name()
|
|
||||||
{
|
|
||||||
for(int i = 0; i < 6; i++)
|
|
||||||
*(pc_names + KING_OFFSET + i) = W_LETTER;
|
|
||||||
*(pc_names + KING_OFFSET + 6) = 0;
|
|
||||||
*(pc_names + KING_OFFSET + 7) = 0xFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setup_battle_tests()
|
|
||||||
{
|
{
|
||||||
(window_pointers[2]) = (struct WINDOW*)0x2029F88;
|
(window_pointers[2]) = (struct WINDOW*)0x2029F88;
|
||||||
(window_pointers[2])->window_x = 4;
|
m2_setupwindow((window_pointers[2]), 4, 1, 0x16, 4);
|
||||||
(window_pointers[2])->window_y = 1;
|
|
||||||
(window_pointers[2])->window_width = 0x16;
|
|
||||||
(window_pointers[2])->window_height = 4;
|
|
||||||
(window_pointers[2])->window_area = (window_pointers[2])->window_width * (window_pointers[2])->window_height;
|
|
||||||
m2_btl_user_ptr = (BATTLE_DATA*)0x2021110;
|
m2_btl_user_ptr = (BATTLE_DATA*)0x2021110;
|
||||||
m2_btl_target_ptr = (BATTLE_DATA*)0x2021110;
|
m2_btl_target_ptr = (BATTLE_DATA*)0x2021110;
|
||||||
setup_ness_name();
|
setup_ness_name();
|
||||||
|
@ -103,14 +73,8 @@ void setup_battle_tests()
|
||||||
m2_script_readability = false;
|
m2_script_readability = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_battle_tests()
|
|
||||||
{
|
|
||||||
test_encounter_text();
|
|
||||||
test_death_text();
|
|
||||||
}
|
|
||||||
|
|
||||||
void start_battle_tests()
|
void start_battle_tests()
|
||||||
{
|
{
|
||||||
setup_battle_tests();
|
run_test(test_encounter_text);
|
||||||
do_battle_tests();
|
run_test(test_death_text);
|
||||||
}
|
}
|
|
@ -1,9 +1,7 @@
|
||||||
#include "../battle_data.h"
|
#include "../battle_data.h"
|
||||||
#include "debug_printf/test_print.h"
|
#include "debug_printf/test_print.h"
|
||||||
|
|
||||||
#define W_LETTER 0x87
|
#define INITIAL_SYMBOL_ENEMY 0x70
|
||||||
#define KING_OFFSET 0x1C
|
|
||||||
#define RIGHT_BORDER_TILE 0x0095
|
|
||||||
|
|
||||||
void start_battle_tests();
|
void start_battle_tests();
|
||||||
|
|
||||||
|
|
|
@ -6,24 +6,10 @@ void start_tests()
|
||||||
{
|
{
|
||||||
start_session();
|
start_session();
|
||||||
|
|
||||||
blank_memory();
|
|
||||||
start_battle_tests();
|
start_battle_tests();
|
||||||
|
|
||||||
blank_memory();
|
|
||||||
|
|
||||||
end_session();
|
end_session();
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
vblank();
|
vblank();
|
||||||
}
|
}
|
||||||
|
|
||||||
void blank_memory()
|
|
||||||
{
|
|
||||||
int blank_value = 0;
|
|
||||||
cpufastset(&blank_value, (void*)EWRAM, CPUFASTSET_FILL | (EWRAM_SIZE >> 2));
|
|
||||||
cpufastset(&blank_value, (void*)IWRAM, CPUFASTSET_FILL | (IWRAM_SIZE >> 3));
|
|
||||||
cpufastset(&blank_value, (void*)IO, CPUFASTSET_FILL | (IO_SIZE >> 2));
|
|
||||||
cpufastset(&blank_value, (void*)PALETTES, CPUFASTSET_FILL | (PALETTES_SIZE >> 2));
|
|
||||||
cpufastset(&blank_value, (void*)VRAM, CPUFASTSET_FILL | (VRAM_SIZE >> 2));
|
|
||||||
cpufastset(&blank_value, (void*)OBJECTS, CPUFASTSET_FILL | (OBJECTS_SIZE >> 2));
|
|
||||||
}
|
|
|
@ -1,21 +1,5 @@
|
||||||
#include "debug_printf/test_print.h"
|
#include "debug_printf/test_print.h"
|
||||||
|
|
||||||
#define CPUFASTSET_FILL (0x1000000)
|
|
||||||
#define EWRAM (0x2000000)
|
|
||||||
#define EWRAM_SIZE (0x40000)
|
|
||||||
#define IWRAM (0x3000000)
|
|
||||||
#define IWRAM_SIZE (0x8000)
|
|
||||||
#define IO (0x4000000)
|
|
||||||
#define IO_SIZE (0x400)
|
|
||||||
#define PALETTES (0x5000000)
|
|
||||||
#define PALETTES_SIZE (0x400)
|
|
||||||
#define VRAM (0x6000000)
|
|
||||||
#define VRAM_SIZE (0x18000)
|
|
||||||
#define OBJECTS (0x7000000)
|
|
||||||
#define OBJECTS_SIZE (0x400)
|
|
||||||
|
|
||||||
void start_tests();
|
void start_tests();
|
||||||
void blank_memory();
|
|
||||||
|
|
||||||
extern void vblank();
|
extern void vblank();
|
||||||
extern void cpufastset(void *source, void *dest, int mode);
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
#define CPUFASTSET_FILL (0x1000000)
|
||||||
|
#define IWRAM (0x3000000)
|
||||||
|
#define IWRAM_SIZE (0x8000-0x2000)
|
||||||
|
|
||||||
|
#define NON_IWRAM_RESET 0xFD
|
||||||
|
|
||||||
|
#define RIGHT_BORDER_TILE 0x0095
|
||||||
|
|
||||||
|
void blank_memory()
|
||||||
|
{
|
||||||
|
int blank_value = 0;
|
||||||
|
cpufastset(&blank_value, (void*)IWRAM, CPUFASTSET_FILL | (IWRAM_SIZE >> 2));
|
||||||
|
reg_ram_reset(NON_IWRAM_RESET);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup_ness_name()
|
||||||
|
{
|
||||||
|
for(int i = 0; i < 5; i++)
|
||||||
|
*(pc_names + i) = W_LETTER;
|
||||||
|
*(pc_names + 5) = 0;
|
||||||
|
*(pc_names + 6) = 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup_king_name()
|
||||||
|
{
|
||||||
|
for(int i = 0; i < 6; i++)
|
||||||
|
*(pc_names + KING_OFFSET + i) = W_LETTER;
|
||||||
|
*(pc_names + KING_OFFSET + 6) = 0;
|
||||||
|
*(pc_names + KING_OFFSET + 7) = 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool text_stayed_inside(WINDOW* window)
|
||||||
|
{
|
||||||
|
if(window->redraw)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
for(int i = 0; i < window->window_height; i++)
|
||||||
|
if((*tilemap_pointer)[(0x20*(window->window_y + i))+window->window_x + window->window_width] != RIGHT_BORDER_TILE)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
#ifndef TEST_UTILS
|
||||||
|
#define TEST_UTILS
|
||||||
|
|
||||||
|
#include "../window.h"
|
||||||
|
#include "../locs.h"
|
||||||
|
|
||||||
|
#define W_LETTER 0x87
|
||||||
|
#define KING_OFFSET 0x1C
|
||||||
|
|
||||||
|
#define run_test(func) \
|
||||||
|
blank_memory();\
|
||||||
|
_setup();\
|
||||||
|
func();
|
||||||
|
|
||||||
|
void setup_ness_name();
|
||||||
|
void setup_king_name();
|
||||||
|
void blank_memory();
|
||||||
|
bool text_stayed_inside(WINDOW* window);
|
||||||
|
|
||||||
|
extern void cpufastset(void *source, void *dest, int mode);
|
||||||
|
extern void reg_ram_reset(int flag);
|
||||||
|
extern int m2_setupwindow(WINDOW* window, short window_x, short window_y, short window_width, short window_height);
|
||||||
|
|
||||||
|
#endif
|
|
@ -526,6 +526,17 @@ mov r0,0x50
|
||||||
//Do not redraw unless it is needed
|
//Do not redraw unless it is needed
|
||||||
.org 0x80E079A :: bl e079a_battle_psi_window
|
.org 0x80E079A :: bl e079a_battle_psi_window
|
||||||
|
|
||||||
|
//Handle background window
|
||||||
|
.org 0x80E079E :: bl e06ec_clear_window
|
||||||
|
.org 0x80E0888 :: bl e06ec_redraw_psi
|
||||||
|
.org 0x80E0A16 :: bl e06ec_redraw_bash_psi
|
||||||
|
|
||||||
|
//Handle coming back from the "Not enough PP!" window
|
||||||
|
.org 0x80E0B10 :: bl initWindow_buffer
|
||||||
|
.org 0x80E0B2A :: bl initWindow_cursor_buffer
|
||||||
|
.org 0x80E0B30 :: bl print_window_with_buffer
|
||||||
|
.org 0x80E0B34 :: bl e0b34_psi_not_enough_pp_reverse_windows :: b 0x80E0B52
|
||||||
|
|
||||||
//---------------------------------------------------------
|
//---------------------------------------------------------
|
||||||
// C4B2C hacks (Equip window render)
|
// C4B2C hacks (Equip window render)
|
||||||
//---------------------------------------------------------
|
//---------------------------------------------------------
|
||||||
|
@ -853,10 +864,6 @@ b 0x80D3A14
|
||||||
.org 0x80DCC36 :: mov r2,2 // "to X" position
|
.org 0x80DCC36 :: mov r2,2 // "to X" position
|
||||||
.org 0x80DCCE0 :: mov r2,2 // "to the Front Row" position
|
.org 0x80DCCE0 :: mov r2,2 // "to the Front Row" position
|
||||||
|
|
||||||
.org 0x80E079E :: bl e06ec_clear_window
|
|
||||||
.org 0x80E0888 :: bl e06ec_redraw_psi
|
|
||||||
.org 0x80E0A16 :: bl e06ec_redraw_bash_psi
|
|
||||||
|
|
||||||
//---------------------------------------------------------
|
//---------------------------------------------------------
|
||||||
// Equipment number printing in dialogue window
|
// Equipment number printing in dialogue window
|
||||||
//---------------------------------------------------------
|
//---------------------------------------------------------
|
||||||
|
@ -2384,11 +2391,14 @@ disclaimer_map:
|
||||||
.definelabel m2_psitargetwindow ,0x80B8AE0
|
.definelabel m2_psitargetwindow ,0x80B8AE0
|
||||||
.definelabel m2_isequipped ,0x80BC670
|
.definelabel m2_isequipped ,0x80BC670
|
||||||
.definelabel m2_swapwindowbuf ,0x80BD7AC
|
.definelabel m2_swapwindowbuf ,0x80BD7AC
|
||||||
.definelabel m2_setup_window ,0x80BD844
|
.definelabel m2_setup_bg_window ,0x80BD844
|
||||||
|
.definelabel m2_setupwindow ,0x80BE188
|
||||||
.definelabel m2_strlookup ,0x80BE260
|
.definelabel m2_strlookup ,0x80BE260
|
||||||
.definelabel m2_initwindow ,0x80BE458
|
.definelabel m2_initwindow ,0x80BE458
|
||||||
|
.definelabel m2_resetwindow ,0x80BE490
|
||||||
.definelabel m2_initwindow_cursor ,0x80BE4C8
|
.definelabel m2_initwindow_cursor ,0x80BE4C8
|
||||||
.definelabel m2_statuswindow_numbers,0x80C0A5C
|
.definelabel m2_statuswindow_numbers,0x80C0A5C
|
||||||
|
.definelabel m2_menuwindow ,0x80C1C98
|
||||||
.definelabel m2_psiwindow ,0x80C1FBC
|
.definelabel m2_psiwindow ,0x80C1FBC
|
||||||
.definelabel m2_drawwindow ,0x80C87D0
|
.definelabel m2_drawwindow ,0x80C87D0
|
||||||
.definelabel m2_print_window ,0x80C8BE4
|
.definelabel m2_print_window ,0x80C8BE4
|
||||||
|
@ -2399,9 +2409,6 @@ disclaimer_map:
|
||||||
.definelabel m2_scrolltext ,0x80CA4BC
|
.definelabel m2_scrolltext ,0x80CA4BC
|
||||||
.definelabel m2_formatnumber ,0x80CA65C
|
.definelabel m2_formatnumber ,0x80CA65C
|
||||||
.definelabel m2_clearwindowtiles ,0x80CA834
|
.definelabel m2_clearwindowtiles ,0x80CA834
|
||||||
.definelabel m2_menuwindow ,0x80C1C98
|
|
||||||
.definelabel m2_setupwindow ,0x80BE188
|
|
||||||
.definelabel m2_resetwindow ,0x80BE490
|
|
||||||
.definelabel m2_sub_d3c50 ,0x80D3C50
|
.definelabel m2_sub_d3c50 ,0x80D3C50
|
||||||
.definelabel m2_hpwindow_up ,0x80D3F0C
|
.definelabel m2_hpwindow_up ,0x80D3F0C
|
||||||
.definelabel m2_curhpwindow_down ,0x80D41D8
|
.definelabel m2_curhpwindow_down ,0x80D41D8
|
||||||
|
@ -2412,6 +2419,7 @@ disclaimer_map:
|
||||||
.definelabel m2_set_target_name ,0x80DAE00
|
.definelabel m2_set_target_name ,0x80DAE00
|
||||||
.definelabel m2_setupbattlename ,0x80DCD00
|
.definelabel m2_setupbattlename ,0x80DCD00
|
||||||
.definelabel m2_stat_symb_checker ,0x8B0EDA4
|
.definelabel m2_stat_symb_checker ,0x8B0EDA4
|
||||||
|
.definelabel reg_ram_reset ,0x80F47CC
|
||||||
.definelabel vblank ,0x80F47E4
|
.definelabel vblank ,0x80F47E4
|
||||||
.definelabel m2_div ,0x80F49D8
|
.definelabel m2_div ,0x80F49D8
|
||||||
.definelabel m2_remainder ,0x80F4A70
|
.definelabel m2_remainder ,0x80F4A70
|
||||||
|
|
|
@ -2297,21 +2297,21 @@ pop {r4,pc}
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
//It sets things up to make it so the target window is only printed once
|
//It sets things up to make it so the target window is only printed once
|
||||||
e0854_psi_inner_window_battle:
|
e0854_psi_inner_window_battle:
|
||||||
push {lr}
|
push {r4,lr}
|
||||||
ldrb r1,[r0,#3]
|
mov r4,r0
|
||||||
|
ldrb r1,[r4,#3]
|
||||||
push {r1}
|
push {r1}
|
||||||
ldrh r1,[r0,#0x36] //Stores the cursor's Y of the window
|
ldrh r1,[r4,#0x36] //Stores the cursor's Y of the window
|
||||||
push {r1}
|
push {r1}
|
||||||
ldrh r1,[r0,#0x34] //Stores the cursor's X of the window
|
ldrh r1,[r4,#0x34] //Stores the cursor's X of the window
|
||||||
push {r1}
|
push {r1}
|
||||||
bl PSITargetWindowInput //Input management, target printing and header printing function. Now the function takes the cursor's Y and X as arguments too in the stack
|
bl PSITargetWindowInput //Input management, target printing and header printing function. Now the function takes the cursor's Y and X as arguments too in the stack
|
||||||
pop {r2}
|
pop {r2}
|
||||||
ldr r3,[r4,0x24] //Target window
|
ldrh r1,[r4,#0x34] //Stores the cursor's X of the window
|
||||||
ldrh r1,[r3,#0x34] //Stores the cursor's X of the window
|
|
||||||
cmp r1,r2
|
cmp r1,r2
|
||||||
bne @@store_buffer_first
|
bne @@store_buffer_first
|
||||||
pop {r2}
|
pop {r2}
|
||||||
ldrh r1,[r3,#0x36] //Stores the cursor's Y of the window
|
ldrh r1,[r4,#0x36] //Stores the cursor's Y of the window
|
||||||
cmp r1,r2
|
cmp r1,r2
|
||||||
bne @@store_buffer_second
|
bne @@store_buffer_second
|
||||||
pop {r2}
|
pop {r2}
|
||||||
|
@ -2334,11 +2334,34 @@ bl store_pixels_overworld_psi_window
|
||||||
cmp r0,#0
|
cmp r0,#0
|
||||||
beq @@ending
|
beq @@ending
|
||||||
|
|
||||||
mov r2,#0 //Sets vwf_skip to false since the window is change
|
mov r2,#0 //Sets vwf_skip to false since the window is changed
|
||||||
ldr r1,[r5,0x24] //Target window
|
strb r2,[r4,#3]
|
||||||
strb r2,[r1,#3]
|
|
||||||
|
|
||||||
@@ending:
|
@@ending:
|
||||||
|
pop {r4,pc}
|
||||||
|
|
||||||
|
.pool
|
||||||
|
|
||||||
|
//==============================================================================
|
||||||
|
//Reverses the order in which the target window and the psi window are printed
|
||||||
|
//when the "Not enough PP!" message goes away in battle in order to make it so
|
||||||
|
//the graphics are properly stored.
|
||||||
|
e0b34_psi_not_enough_pp_reverse_windows:
|
||||||
|
push {lr}
|
||||||
|
ldr r0,[r4,#0x24] //Initializes the target window
|
||||||
|
mov r1,#0
|
||||||
|
mov r2,#0
|
||||||
|
bl initWindow_buffer
|
||||||
|
ldr r0,[r4,#0x1C] //Target window printing
|
||||||
|
bl 0x80C438C
|
||||||
|
|
||||||
|
ldr r0,[r4,#0x20] //PSI window printing, grab the type from the types menu
|
||||||
|
ldrh r0,[r0,#0x36]
|
||||||
|
add r0,#1
|
||||||
|
lsl r0,r0,#0x10
|
||||||
|
asr r0,r0,#0x10
|
||||||
|
bl 0x80BAE98 //Do the printing
|
||||||
|
|
||||||
pop {pc}
|
pop {pc}
|
||||||
|
|
||||||
.pool
|
.pool
|
||||||
|
|
|
@ -628,7 +628,7 @@
|
||||||
"OffsetLocation": 11632708,
|
"OffsetLocation": 11632708,
|
||||||
"OldPointer": 11631182,
|
"OldPointer": 11631182,
|
||||||
"Old": "だれに?[00 FF]",
|
"Old": "だれに?[00 FF]",
|
||||||
"New": "Who?[00 FF]"
|
"New": "Whom?[00 FF]"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Index": 88,
|
"Index": 88,
|
||||||
|
|
Loading…
Reference in New Issue