Merge remote-tracking branch 'upstream/master'

This commit is contained in:
Lorenzooone 2019-09-29 22:52:55 +02:00
commit 2552445fcc
35 changed files with 4576 additions and 278 deletions

View File

@ -1,6 +1,10 @@
Hacking, script tool, script compiler/decompiler:
JeffMan
Hacking:
Lorenzooone
PhoenixBound
Text conversion:
JeffMan
Lorenzooone

View File

@ -15,9 +15,13 @@ $input_c_files =
"src/c/vwf.c",
"src/c/locs.c",
"src/c/goods.c",
"src/c/fileselect.c"
"src/c/fileselect.c",
"src/c/status.c",
"src/c/battle.c",
"src/c/equip.c",
"src/c/psi.c"
$base_c_address = 0x8100000;
$base_c_address = 0x83755B8;
$scripttool_cmd = "bin/ScriptTool/ScriptTool.dll"
$gcc_cmd = "arm-none-eabi-gcc"
$ld_cmd = "arm-none-eabi-ld"

101
src/c/battle.c Normal file
View File

@ -0,0 +1,101 @@
#include "window.h"
#include "battle.h"
#include "number-selector.h"
#include "locs.h"
//Prints enemy target window
void printTargetOfAttack(short a, short target)
{
WINDOW *window = getWindow(3);
m2_setupwindow(window, 0x9, 0x3, 0x14, 0x2);
initWindow_buffer(window, NULL, 0);
printstr_buffer(window, m12_battle_commands_str11, 0, 0, false); //To
if(target != -1)
{
printstr_hlight_buffer(window, m12_battle_commands_str14, 8, 0, false);// " "
short *pointer = (short*)(0x20248E0 + 0x83E);
byte *pointer2 = (byte*)(pointer);
short value = *pointer;
m2_setupbattlename((a * value) + target + 1);
byte* str = ((*((byte**)0x3005220)) + 0x4C0);
printstr_buffer(window, str, 2, 0, false);
if(a != 0)
pointer2 += 0x2E;
else
pointer2 += 0x26;
byte val = *(pointer2 + target);
unsigned short ailmentTile = ailmentTileSetup((byte*)(0x2020CCF + (val * 0x94)), 0);
if(ailmentTile >= 1)
{
map_tile(ailmentTile, window->window_x + 0x13, window->window_y);
map_tile(ailmentTile + 0x20, window->window_x + 0x13, window->window_y + 1);
}
else
{
map_tile(0x1FF, window->window_x + 0x13, window->window_y);
map_tile(0x1FF, window->window_x + 0x13, window->window_y + 1);
}
}
else
{
if(a == 0) //a is the row here
printstr_buffer(window, m12_battle_commands_str12, 2, 0, false); //the Front Row
else
printstr_buffer(window, m12_battle_commands_str13, 2, 0, false); //the Back Row
}
}
//Only implements up to Goods right now
void printBattleMenu(byte validXs, byte validYs, byte highlighted)
{
unsigned short* drawValue = (unsigned short*)0x2025122;
byte *str;
WINDOW* window = getWindow(0);
if(validXs & 1)
{
if(validYs & 1)
{
print_blankstr_buffer(2,1,5,(byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
if((*drawValue) == 2)
{
print_blankstr_buffer(7,1,5,(byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
str = m12_battle_commands_str10; //Do Nothing
}
else if((*drawValue) == 1)
str = m12_battle_commands_str6; //Shoot
else
str = m12_battle_commands_str0; //Bash
printstr_hlight_buffer(window, str, 1, 0, highlighted & 1);
}
if(validYs & 2)
{
print_blankstr_buffer(2,3,5,(byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
if((*active_window_party_member) != 2)
printstr_hlight_buffer(window, m12_battle_commands_str3, 1, 1, highlighted & 2); //PSI
else
printstr_hlight_buffer(window, m12_battle_commands_str7, 1, 1, highlighted & 2); //Spy
}
}
if(validXs & 2)
{
if(validYs & 1)
{
if((*drawValue) != 2)
{
print_blankstr_buffer(7,1,5,(byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
printstr_hlight_buffer(window, m12_battle_commands_str1, 6, 0, highlighted & 4); //Goods
}
}
if(validYs & 2)
{
print_blankstr_buffer(7,3,5,(byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
if((*drawValue) != 2)
{
printstr_hlight_buffer(window, m12_battle_commands_str4, 6, 1, highlighted & 8); //Defend
}
}
}
}

21
src/c/battle.h Normal file
View File

@ -0,0 +1,21 @@
#ifndef HEADER_BATTLE_INCLUDED
#define HEADER_BATTLE_INCLUDED
#include "vwf.h"
void printTargetOfAttack(short a, short target);
void printBattleMenu(byte validXs, byte validYs, byte highlighted);
extern byte m12_battle_commands_str0[];
extern byte m12_battle_commands_str1[];
extern byte m12_battle_commands_str3[];
extern byte m12_battle_commands_str4[];
extern byte m12_battle_commands_str6[];
extern byte m12_battle_commands_str7[];
extern byte m12_battle_commands_str10[];
extern byte m12_battle_commands_str11[];
extern byte m12_battle_commands_str12[];
extern byte m12_battle_commands_str13[];
extern byte m12_battle_commands_str14[];
#endif

547
src/c/equip.c Normal file
View File

@ -0,0 +1,547 @@
#include "window.h"
#include "equip.h"
#include "number-selector.h"
#include "locs.h"
int equipReadInput(WINDOW* window) //Returns the character whose window we're going in, ACTION_NONE if nothing happens or ACTION_STEPOUT if going out of this window
{
unsigned short previousCharacter = *active_window_party_member;
int currentCharacter = previousCharacter;
PAD_STATE state = *pad_state;
PAD_STATE state_shadow = *pad_state_shadow;
bool printed = false; //Used to avoid sound issues. If we printed, we don't make sounds
if(state.right && !window->hold)
currentCharacter += 1;
if(state.left && !window->hold)
currentCharacter -= 1;
if((state.left || state.right) && !window->hold)
{
window->unknown7 = 0;
if(state.left)
{
if(currentCharacter < 0)
currentCharacter = 3;
int foundChar = currentCharacter;
for(int i = 0; i < 4; i++)
{
if (foundChar < 0)
foundChar = 3;
if ((*pc_flags)[foundChar])
break;
foundChar--;
}
currentCharacter = foundChar;
}
else
{
if(currentCharacter > 3)
currentCharacter = 0;
int foundChar = currentCharacter;
for(int i = 0; i < 4; i++)
{
if (foundChar > 3)
foundChar = 0;
if ((*pc_flags)[foundChar])
break;
foundChar++;
}
currentCharacter = foundChar;
}
(*active_window_party_member) = currentCharacter;
if(currentCharacter != previousCharacter) //Print only if needed
{
equipPrint(window);
printed = true;
}
}
if(state_shadow.right || state_shadow.left)
{
if(state.right || state.left)
{
if(currentCharacter != previousCharacter)
m2_soundeffect(0x131);
}
window->hold = true;
}
else
window->hold = false;
if(state.b || state.select)
{
if(!printed)
m2_soundeffect(0x12E);
window->counter = 0;
return ACTION_STEPOUT;
}
else if(state.a || state.l)
{
if(!printed)
m2_soundeffect(0x12D);
if((*pc_count) > 1)
{
unsigned short *arrangementBase = (*tilemap_pointer) + (((window->window_y - 1) << 5) + window->window_x + window->window_width - 4);
unsigned short topTile = ((*tile_offset) + 0x96) | (*palette_mask) | 0x800;
(*arrangementBase) = topTile;
(*(arrangementBase + 1)) = topTile;
(*(arrangementBase + 2)) = topTile;
(*(arrangementBase + 3)) = topTile;
}
window->counter = 0;
return 1;
}
window->counter++;
if (*pc_count > 1)
{
// We're doing a bit of simplification here.
// The Japanese version tries to highlight the arrow you pressed.
// It only shows for a couple frames and it looks weird, so we're
// just going to show the arrows and not bother with the direction indicator.
draw_window_arrows(window, window->counter < 8);
}
if (window->counter > 16)
window->counter = 0;
return ACTION_NONE;
}
void equippablePrint(WINDOW* window) //Prints equippable items (The innermost equip window)
{
unsigned short savedValue = 0;
byte* freeSpace = free_strings_pointers[3];
byte *none = m2_strlookup((int*)0x8B17EE4, (byte*)0x8B17424, 0x2C);
PC *character_data = &(m2_ness_data[*active_window_party_member]);
unsigned short* something = (unsigned short*)0x3005224;
unsigned short* something2 = (unsigned short*)0x300522C;
for(int i = 0; i < 7; i++)
freeSpace[i] = 0;
freeSpace[7] = 0xFF;
int* headerAddress = (int*)(((int)vram) + ((*something2) << 0xE) + ((*tile_offset) << 5));
map_tile(0xB3, window->window_x, window->window_y - 1);
unsigned short val = *something;
if(!window->vwf_skip)
clear_window_header(headerAddress, 8, 0x10, 0x11);
unsigned short* lastUsed = print_equip_header(*something, (unsigned short*)((*tilemap_pointer) + (((window->window_y - 1) << 5) + window->window_x + 1)), headerAddress, window);
window->vwf_skip = true;
if(window->cursor_x > 6) //Mode which prints only 5 items in M12. Used if one has more than 8 items of an equippable kind.
{
clearWindowTiles_buffer(window);
short counter = 0;
while(counter < 5)
{
int value = (window->cursor_x_base * 5) + counter;
byte equippables;
if(value <= 0xD)
equippables = *(window->number_text_area + 4 + value);
else
equippables = 0xFF;
if(equippables == 0xFF)
{
freeSpace[counter] = 0xFD;
printstr_buffer(window, none, 1, counter, false);
break;
}
else
{
byte *item = m2_strlookup((int*)0x8B1AF94, (byte*)0x8B1A694, character_data->goods[equippables - 1]);
byte x = 1;
if(m2_isequipped(equippables))
{
map_special_character(0x1DE,(window->window_x + 1), (counter << 1) + 1); //Print the E
x++;
}
printstr_buffer(window, item, x, counter, false);
freeSpace[counter] = equippables;
counter++;
}
}
byte* str = NULL;
switch(val)
{
case 3:
str = m12_other_str9; //->Weapons
break;
case 4:
str = m12_other_str10; //->Body
break;
case 5:
str = m12_other_str11; //->Arms
break;
case 6:
str = m12_other_str12; //->Other
break;
default:
break;
}
if(str != NULL)
savedValue = printstr_buffer(window, str, 1, 6, false); //Prints the string, savedValue is used to understand where to print "(X)"
int tmp = m2_div(window->cursor_x, 5);
str = NULL;
if(tmp <= window->cursor_x_base)
str = m2_strlookup((int*)0x8B17EE4, (byte*)0x8B17424, 0x8C);
else
str = m2_strlookup((int*)0x8B17EE4, (byte*)0x8B17424, 0x8D + window->cursor_x_base);
printstr_hlight_pixels_buffer(window, str, savedValue, 6 << 4, false); //Prints "(X)"
freeSpace[5] = 0;
freeSpace[6] = 0xFE;
freeSpace[7] = 0xFF;
}
else //Prints up to 7 equippable items. It's the same as the above cycle, without the cursor_x_base stuff.
{
short counter = 0;
while(counter < 7)
{
byte equippables = *(window->number_text_area + 4 + counter);
if(equippables == 0xFF)
{
freeSpace[counter] = 0xFD;
freeSpace[counter + 1] = 0xFF; //Different from the cycle above
printstr_buffer(window, none, 1, counter, false);
break;
}
else
{
byte *item = m2_strlookup((int*)0x8B1AF94, (byte*)0x8B1A694, character_data->goods[equippables - 1]);
byte x = 1;
if(m2_isequipped(equippables))
{
map_special_character(0x1DE,(window->window_x + 1), (counter << 1) + 1); //Print the E
x++;
}
printstr_buffer(window, item, x, counter, false);
freeSpace[counter] = equippables;
counter++;
}
}
}
window->loaded_code = 0;
}
int equippableReadInput(WINDOW* window) //Manages input in equipment-choice innermost window. Returns the equippable item the cursor is on or ACTION_STEPOUT
{
byte* freeSpace = free_strings_pointers[3];
PC *character_data = &(m2_ness_data[*active_window_party_member]);
bool printed = (window->loaded_code == 1);
// Get weird sign height value
unsigned short height = window->window_height;
unsigned int height_sign_bit = height >> 15;
unsigned int weird_value = (((height + height_sign_bit) << 15) >> 16);
// Clear cursor tiles
map_tile(0x1FF, window->window_x, window->window_y + window->cursor_y * 2);
map_tile(0x1FF, window->window_x, window->window_y + window->cursor_y * 2 + 1);
if(window->loaded_code == 1) //We're printing
equippablePrint(window);
PAD_STATE state = *pad_state;
PAD_STATE state_shadow = *pad_state_shadow;
unsigned short possibleEquippablesCount = window->cursor_x;
short previousY = window->cursor_y;
short currentY = window->cursor_y;
int counter = 0;
//Loads the total amount of items
if(possibleEquippablesCount > 6)
counter = 7;
else if(weird_value > 0)
while(counter < weird_value && freeSpace[counter] != 0xFF)
counter++;
if(state.up)
{
currentY--;
if(currentY < 0)
{
if(window->hold)
currentY = 0;
else
currentY = counter - 1;
}
else
while(freeSpace[currentY] == 0)
currentY--;
}
if(state.down)
{
currentY++;
if(currentY >= counter)
{
if(window->hold)
currentY = counter - 1;
else
currentY = 0;
}
else
while(freeSpace[currentY] == 0)
currentY++;
}
if(state_shadow.up || state_shadow.down)
{
window->counter = 0;
if(previousY != currentY)
m2_soundeffect(0x12F);
window->hold = true;
window->cursor_y = currentY;
}
else
window->hold = false;
if(state.b || state.select)
{
window->counter = 0;
m2_soundeffect(0x12E);
return ACTION_STEPOUT;
}
if((state.a || state.l) && !printed) //Avoid sound issues when going into the window
{
window->counter = 0xFFFF;
if(freeSpace[window->cursor_y] == 0xFE)
{
m2_soundeffect(0x12D); //Do the sound only if we're changing the page. Otherwise the original code will do the appropriate sound
window->counter = 0;
window->cursor_x_base++;
if(m2_div(window->cursor_x, 5) < window->cursor_x_base)
window->cursor_x_base = 0;
return 0xFE; //Change window counter
}
if(window->cursor_y + 1 < counter)
return freeSpace[window->cursor_y]; //Equipment
return 0xFD; //None
}
if (window->counter != 0xFFFF)
{
window->counter++;
// Draw cursor for current item
map_special_character((window->counter <= 7) ? 0x99 : 0x9A,
window->window_x,
window->window_y + window->cursor_y * 2);
if (window->counter > 0x10)
window->counter = 0;
}
if(window->cursor_y + 1 < counter)
return freeSpace[window->cursor_y];
return 0xFD; //None
}
//Simplified inner equip routine (The original routine had a pointer to a table of valid cursor positions as a parameter)
int innerEquipInput(WINDOW* window)
{
bool printing = !window->vwf_skip;
window->vwf_skip = true;
PAD_STATE state = *pad_state;
PAD_STATE state_shadow = *pad_state_shadow;
short previousY = window->cursor_y;
short currentY = window->cursor_y;
// Clear cursor tiles
map_tile(0x1FF, window->window_x, window->window_y + window->cursor_y * 2);
map_tile(0x1FF, window->window_x, window->window_y + window->cursor_y * 2 + 1);
if(state.up) //This has been simplified
{
currentY--;
if(currentY < 0)
{
if(window->hold)
currentY = 0;
else
currentY = 3;
}
}
if(state.down) //This has been simplified
{
currentY++;
if(currentY >= 4)
{
if(window->hold)
currentY = 3;
else
currentY = 0;
}
}
//The game does stuff when pressing left or right, however for the equipment window this is not needed
if(state.right) //This routine in particular did both the main overworld window and the inner equip window
{
}
if(state.left)
{
}
if(state_shadow.up || state_shadow.down)
{
window->counter = 0;
if(previousY != currentY)
m2_soundeffect(0x12F);
window->hold = true;
window->cursor_y = currentY;
}
else
window->hold = false;
if((state.b || state.select) && (!printing))
{
window->counter = 0;
m2_soundeffect(0x12E);
window->vwf_skip = false;
return ACTION_STEPOUT;
}
if((state.a || state.l) && (!printing))
{
window->counter = 0xFFFF;
m2_soundeffect(0x12D);
window->vwf_skip = false;
return (window->cursor_y << 1) + ACTION_STEPIN;
}
if (window->counter != 0xFFFF)
{
window->counter++;
// Draw cursor
map_special_character((window->counter <= 7) ? 0x99 : 0x9A,
window->window_x,
window->window_y + window->cursor_y * 2);
if (window->counter > 0x10)
window->counter = 0;
}
return ACTION_NONE;
}
void equipPrint(WINDOW* window) //Prints equipment
{
m2_hpwindow_up(*active_window_party_member);
// Draw window header
map_tile(0xB3, window->window_x, window->window_y - 1);
clear_name_header(window);
copy_name_header(window, *active_window_party_member);
PC *character_data = &(m2_ness_data[*active_window_party_member]);
byte *nothing = m2_strlookup((int*)0x8B17EE4, (byte*)0x8B17424, 0x2A);
byte *item;
//Clear the previous equipment
print_blankstr_buffer(window->window_x + 6, 1, 0xC, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
print_blankstr_buffer(window->window_x + 6, 3, 0xC, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
print_blankstr_buffer(window->window_x + 6, 5, 0xC, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
print_blankstr_buffer(window->window_x + 6, 7, 0xC, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
//Clear the previous numbers
print_blankstr_buffer(8, 0xB, 0x8, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
print_blankstr_buffer(8, 0xD, 0x8, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
//Reprint the ":"s
print_character_with_callback_1bpp_buffer(decode_character(0x6A), ((window->window_x + 6) << 3), (0x1 << 3), (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)), &get_tile_number_with_offset, 0, *tilemap_pointer, 32, 0xC);
print_character_with_callback_1bpp_buffer(decode_character(0x6A), ((window->window_x + 6) << 3), (0x3 << 3), (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)), &get_tile_number_with_offset, 0, *tilemap_pointer, 32, 0xC);
print_character_with_callback_1bpp_buffer(decode_character(0x6A), ((window->window_x + 6) << 3), (0x5 << 3), (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)), &get_tile_number_with_offset, 0, *tilemap_pointer, 32, 0xC);
print_character_with_callback_1bpp_buffer(decode_character(0x6A), ((window->window_x + 6) << 3), (0x7 << 3), (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)), &get_tile_number_with_offset, 0, *tilemap_pointer, 32, 0xC);
//Print the equipment
if(character_data->equipment[0] == 0) //Weapon
print_string_in_buffer(nothing, (((window->window_x + 7)) << 3) - 2, (0x1) << 3, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
else
{
item = m2_strlookup((int*)0x8B1AF94, (byte*)0x8B1A694, character_data->goods[character_data->equipment[0] - 1]);
map_special_character(0x1DE,(window->window_x + 7), 0x1); //Print the E
printstr_buffer(window, item, 8, 0, false);
}
if(character_data->equipment[1] == 0) //Body
print_string_in_buffer(nothing, (((window->window_x + 7)) << 3) - 2, (0x3) << 3, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
else
{
item = m2_strlookup((int*)0x8B1AF94, (byte*)0x8B1A694, character_data->goods[character_data->equipment[1] - 1]);
map_special_character(0x1DE,(window->window_x + 7), 0x3); //Print the E
printstr_buffer(window, item, 8, 1, false);
}
if(character_data->equipment[2] == 0) //Arms
print_string_in_buffer(nothing, (((window->window_x + 7)) << 3) - 2, (0x5) << 3, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
else
{
item = m2_strlookup((int*)0x8B1AF94, (byte*)0x8B1A694, character_data->goods[character_data->equipment[2] - 1]);
map_special_character(0x1DE,(window->window_x + 7), 0x5); //Print the E
printstr_buffer(window, item, 8, 2, false);
}
if(character_data->equipment[3] == 0) //Other
print_string_in_buffer(nothing, (((window->window_x + 7)) << 3) - 2, (0x7) << 3, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
else
{
item = m2_strlookup((int*)0x8B1AF94, (byte*)0x8B1A694, character_data->goods[character_data->equipment[3] - 1]);
map_special_character(0x1DE,(window->window_x + 7), 0x7); //Print the E
printstr_buffer(window, item, 8, 3, false);
}
}
//Prints the numbers in the window in a formatted way
void printNumberEquip(WINDOW* window, byte* str, unsigned short x, unsigned short y, bool highlight)
{
while((*str) == 0x50)
{
x += 6;
str++;
}
printstr_hlight_pixels_buffer(window, str, x, y, highlight);
}
//Prints Offense: and Defense:
void printEquipWindowNumberText(WINDOW* window)
{
handle_first_window_buffer(window, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
printstr_hlight_pixels_buffer(window, window->text_start, 0, 3, false);
}
//Prints the arrow for the numbers in the Offense/Defense menu
void printEquipNumbersArrow(WINDOW* window)
{
printTinyArrow((window->window_x + 9) << 3, (window->window_y + 0) << 3);
printTinyArrow((window->window_x + 9) << 3, (window->window_y + 2) << 3);
}

20
src/c/equip.h Normal file
View File

@ -0,0 +1,20 @@
#ifndef HEADER_EQUIP_INCLUDED
#define HEADER_EQUIP_INCLUDED
#include "vwf.h"
void equipPrint(WINDOW* window);
int equipReadInput(WINDOW* window);
void equippablePrint(WINDOW* window);
int equippableReadInput(WINDOW* window);
int innerEquipInput(WINDOW* window);
void printEquipWindowNumberText(WINDOW* window);
void printEquipNumbersArrow(WINDOW* window);
extern byte m12_other_str9[];
extern byte m12_other_str10[];
extern byte m12_other_str11[];
extern byte m12_other_str12[];
#endif

View File

@ -10,7 +10,14 @@ bool __attribute__((naked)) m2_isequipped(int item_index) {}
void __attribute__((naked)) m2_soundeffect(int index) {}
int __attribute__((naked)) m2_div(int dividend, int divisor) {}
int __attribute__((naked)) m2_remainder(int dividend, int divisor) {}
void __attribute__((naked)) m2_formatnumber(int value, byte* strDest, int length) {}
int __attribute__((naked)) m2_sub_a334c(int value) {}
int __attribute__((naked)) m2_sub_a3384(int value) {}
void __attribute__((naked)) m2_sub_d3c50() {}
void __attribute__((naked)) m2_sub_d6844() {}
int __attribute__((naked)) m2_setupwindow(WINDOW* window, short window_x, short window_y, short window_width, short window_height) {}
int __attribute__((naked)) m2_clearwindowtiles(WINDOW* window) {}
int __attribute__((naked)) customcodes_parse_generic(int code, char* parserAddress, WINDOW* window, int* dest) {}
void __attribute__((naked)) m2_printstr(WINDOW* window, byte* str, unsigned short x, unsigned short y, bool highlight) {}
void __attribute__((naked)) m2_setupbattlename(short value) {}
void __attribute__((naked)) store_pixels_overworld() {}

View File

@ -189,7 +189,7 @@ void print_file_string(int x, int y, int length, byte *str, int window_selector,
fileselect_pixels_location,
&get_tile_number_file_select,
tilesetDestPtr,
width);
width, 0x10);
pixelX += pixels;
}

View File

@ -110,14 +110,15 @@ int goods_outer_process(WINDOW* window, int y_offset, bool give)
}
*active_window_party_member = current_pc;
m2_hpwindow_up(current_pc);
clear_name_header(window);
copy_name_header(window, current_pc);
// Print item names
if (!window->vwf_skip)
{
goods_print_items(window, current_items, y_offset);
m2_hpwindow_up(current_pc); //Why were these done repeatedly? I made it so they're done only when printing, however if there is a reason why they shouldn't, feel free to put them back
clear_name_header(window);
copy_name_header(window, current_pc);
store_pixels_overworld();
window->vwf_skip = true;
}
@ -417,10 +418,13 @@ int goods_inner_process(WINDOW *window, unsigned short *items)
clear_name_header(window);
copy_name_header(window, *active_window_party_member);
m2_clearwindowtiles(window);
clearWindowTiles_buffer(window);
if (weird_value > 0)
{
goods_print_items(window, items, 0);
store_pixels_overworld();
}
}
if (state_shadow.up || state_shadow.down || state_shadow.left || state_shadow.right)
@ -479,6 +483,7 @@ int goods_inner_process(WINDOW *window, unsigned short *items)
// Erases the slot before printing. Prints blanks for null items.
void goods_print_items(WINDOW *window, unsigned short *items, int y_offset)
{
byte* dest = (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER));
int item_x = (window->window_x << 3) + 8;
int item_y = (window->window_y + y_offset) << 3;
@ -488,7 +493,7 @@ void goods_print_items(WINDOW *window, unsigned short *items, int y_offset)
int x = item_x + ((i & 1) * 88);
int y = item_y + ((i >> 1) * 16);
print_blankstr(x >> 3, y >> 3, 11);
print_blankstr_buffer(x >> 3, y >> 3, 11, dest);
if (item > 0)
{
@ -501,7 +506,7 @@ void goods_print_items(WINDOW *window, unsigned short *items, int y_offset)
}
byte *item_str = m2_strlookup(m2_items_offsets, m2_items_strings, item);
print_string(item_str, x + x_offset, y);
print_string_in_buffer(item_str, x + x_offset, y, dest);
}
}
}

View File

@ -12,13 +12,6 @@ typedef enum DIRECTION_MOVED
DIRECTION_LEFT
} MOVED;
typedef enum GOODS_ACTION
{
ACTION_NONE = 0,
ACTION_STEPIN = 1,
ACTION_STEPOUT = -1
} GOODS_ACTION;
int goods_outer_process(WINDOW* window, int y_offset, bool give);
int goods_inner_process(WINDOW *window, unsigned short *items);
void goods_print_items(WINDOW *window, unsigned short *items, int y_offset);
@ -35,7 +28,6 @@ void setup_User_Dead(byte *String, int *index, byte user, byte target, byte item
void setup_Both_Dead(byte *String, int *index, byte user, byte target, byte item);
void give_print(byte item, byte target, byte source, WINDOW *window, byte *str);
extern bool m2_isequipped(int item_index);
extern void m2_soundeffect(int index);
extern int m2_div(int dividend, int divisor);
extern int m2_sub_a334c(int value);

View File

@ -1,21 +1,29 @@
#include "locs.h"
int *fileselect_pixels_location = (int*) 0x2015000;
byte *cursorValues = (byte*) 0x3000A00;
int *window_flags = (int*) 0x300130C;
byte *character_general_data = (byte*) 0x3001D40;
PC (*pc_stats)[4] = (PC(*)[4]) 0x3001D54;
int *cash_on_hand = (int*) 0x30023D0;
byte *pc_count = (byte*) 0x3001F0B;
bool (*pc_flags)[4] = (bool(*)[4]) 0x3001F0C;
byte *pc_names = (byte*) 0x3001F10;
PAD_STATE *pad_state = (PAD_STATE*) 0x3002500;
PAD_STATE *pad_state_shadow = (PAD_STATE*) 0x3002504;
byte *script_readability = (byte*) 0x3004F08;
unsigned short *tile_offset = (unsigned short*) 0x30051EC;
int *first_window_flag = (int*) 0x30051F0;
byte **free_strings_pointers = (byte**) 0x3005200;
int **buffer_pointer = (int**) 0x3005220;
unsigned short *palette_mask = (unsigned short*) 0x3005228;
WINDOW **window_pointers = (WINDOW**) 0x3005230;
short *active_window_party_member = (short*) 0x3005264;
unsigned short **tilemap_pointer = (unsigned short**)0x3005270;
int *fileselect_pixels_location = (int*) 0x2015000;
unsigned short **tilemap_pointer = (unsigned short**) 0x3005270;
int *vram = (int*) 0x6000000;
int *m2_misc_offsets = (int*) 0x8B17EE4;
byte *m2_misc_strings = (byte*) 0x8B17424;
int *m2_items_offsets = (int*) 0x8B1AF94;
byte *m2_items_strings = (byte*) 0x8B1A694;
unsigned short *name_header_tiles = (unsigned short*) 0x8B1B8B0;
PSIPrintInfo *psi_print_info = (PSIPrintInfo*) 0x8B2A9C0;

View File

@ -4,25 +4,35 @@
#include "types.h"
#include "pc.h"
#include "input.h"
#include "window.h"
#include "psi.h"
extern int *fileselect_pixels_location;
extern byte *cursorValues;
extern int *window_flags;
extern PC (*pc_stats)[4];
extern int *cash_on_hand;
extern byte *pc_count;
extern bool (*pc_flags)[4];
extern byte *pc_names;
extern PAD_STATE *pad_state;
extern PAD_STATE *pad_state_shadow;
extern byte *script_readability;
extern unsigned short *tile_offset;
extern int *first_window_flag;
extern byte **free_strings_pointers;
extern int **buffer_pointer;
extern unsigned short *palette_mask;
extern WINDOW **window_pointers;
extern short *active_window_party_member;
extern unsigned short **tilemap_pointer;
extern int *fileselect_pixels_location;
extern int *vram;
extern int *m2_misc_offsets;
extern byte *m2_misc_strings;
extern int *m2_items_offsets;
extern byte *m2_items_strings;
extern unsigned short *name_header_tiles;
extern byte *character_general_data;
extern PSIPrintInfo *psi_print_info;
#endif

View File

@ -12,17 +12,37 @@ typedef enum AILMENT
NAUSEOUS = 4,
POISONED = 5,
SUNSTROKE = 6,
SNIFFLING = 7,
MASHROOMIZED = 8,
POSSESSED = 9,
HOMESICK = 0xA,
SNIFFLING = 7
} AILMENT;
typedef enum AILMENT2
{
MASHROOMIZED = 1,
POSSESSED = 2
} AILMENT2;
typedef enum AILMENT3
{
SLEEP = 1,
CRYING = 2
} AILMENT3;
typedef enum CHARACTER
{
NESS = 0,
PAULA = 1,
JEFF = 2,
POO = 3
} CHARACTER;
typedef struct PC {
unsigned short goods[14];
int experience;
//0x20
byte unknown[12];
int level;
short level;
short unknown2a;
//0x30
unsigned short hp_max;
unsigned short hp_current;
byte hp_unknown[2]; // possibly a rolling flag + a fractional value
@ -31,13 +51,14 @@ typedef struct PC {
unsigned short pp_current;
byte pp_unknown[2];
unsigned short pp_rolling;
//0x40
AILMENT ailment;
bool mashroomized;
bool sleep;
AILMENT2 ailment2;
AILMENT3 ailment3;
bool strange;
bool cant_concentrate;
bool homesick;
byte unknown2[2];
bool unknown2[2];
byte offense_base;
byte defense_base;
byte speed_base;
@ -46,6 +67,7 @@ typedef struct PC {
byte vitality_base;
byte iq_base;
byte offense_effective;
//0x50
byte defense_effective;
byte speed_effective;
byte guts_effective;
@ -53,6 +75,7 @@ typedef struct PC {
byte vitality_effective;
byte iq_effective;
byte unknown3[11];
//0x61
byte equipment[4];
byte unknown4[7];
} PC;

512
src/c/psi.c Normal file
View File

@ -0,0 +1,512 @@
#include "window.h"
#include "psi.h"
#include "number-selector.h"
#include "locs.h"
void psiWindow_buffer(CHARACTER psiCharacter, PSIWindow typeOfWindow, PSIClasses printableClasses)
{
PC *char_data = &(m2_ness_data[psiCharacter]);
PSIPrintInfo *printInfo;
int level = 0;
int thing2 = 0;
byte *str = 0;
byte *boolCmpWindowType = (byte*)(&(typeOfWindow));
byte *boolCmpPrintableClasses = (byte*)(&(printableClasses));
byte (*possibleTargets)[3][4] = (byte(*)[3][4])cursorValues;
WINDOW *window = getWindow(7);
SpecialPSIFlag *SpecialPSIFlags = (SpecialPSIFlag*)(character_general_data + 0x22A);
bool print[0x11];
for(int i = 0; i < 0x11; i ++)
print[i] = true;
for(int i = 0; i < 4; i++)
{
(*possibleTargets)[0][i] = 0;
(*possibleTargets)[1][i] = 0;
(*possibleTargets)[2][i] = 0;
}
if(psiCharacter == POO && typeOfWindow.Classes_Window && printableClasses.Offense)
{
if(SpecialPSIFlags->Poo_Starstorm_Alpha)
{
printInfo = &(psi_print_info[20]);
psiPrint_buffer(20 + 1, window, print[6 - 1], printInfo);
print[6 - 1] = false;
}
if(SpecialPSIFlags->Poo_Starstorm_Omega)
{
printInfo = &(psi_print_info[21]);
psiPrint_buffer(21 + 1, window, print[6 - 1], printInfo);
print[6 - 1] = false;
}
}
printInfo = &(psi_print_info[0]);
for(int i = 0; printInfo->PSIID != 0; i++)
{
if(psiCharacter != JEFF)
{
int val = psiCharacter == POO ? 2 : psiCharacter;
level = printInfo->levelLearnt[val];
}
if(level != 0)
{
byte *boolCmpWindowTypePrintInfo = (byte*)(&(printInfo->windowType));
if((*boolCmpWindowType) & (*boolCmpWindowTypePrintInfo))
{
if(char_data->level >= level)
{
byte *boolCmpPrintableClassesPrintInfo = (byte*)(&(printInfo->possibleClasses));
if((*boolCmpPrintableClasses) & (*boolCmpPrintableClassesPrintInfo))
{
psiPrint_buffer(i + 1, window, print[printInfo->PSIID - 1], printInfo);
print[printInfo->PSIID - 1] = false;
}
}
}
}
printInfo = &(psi_print_info[i + 1]);
}
if(psiCharacter == NESS && typeOfWindow.Character_Window && printableClasses.Other)
{
if(SpecialPSIFlags->Ness_Teleport_Alpha)
{
printInfo = &(psi_print_info[0x32]);
psiPrint_buffer(0x32 + 1, window, print[0x11 - 1], printInfo);
print[0x11 - 1] = false;
}
if(SpecialPSIFlags->Ness_Teleport_Beta)
{
printInfo = &(psi_print_info[0x33]);
psiPrint_buffer(0x33 + 1, window, print[0x11 - 1], printInfo);
print[0x11 - 1] = false;
}
}
}
void psiTargetWindow_buffer(byte target)
{
WINDOW *window = getWindow(0x9); //Target Window
PSIPrintInfo *printInfo = &(psi_print_info[target - 1]);
byte *string_group1 = (byte*)(0x8B204E4);
byte extract = (printInfo->PSIID);
byte *baseStrPointer = (byte*)(&psitext);
byte value = 0;
byte value2 = 0;
byte *str = 0;
if(extract != 4)
{
value = (*(string_group1 + (printInfo->PSIPrintInfoID * 12)));
value = (value * 0x64);
value2 = (*(string_group1 + (printInfo->PSIPrintInfoID * 12) + 1));
value2 = (value2 * 0x14);
str = baseStrPointer + (0x11 * 0x14) + value + value2; //It doesn't use the pointer to the description the struct has but it obtains it like this...
}
else
str = baseStrPointer + (0x11 * 0x14);
printstr_hlight_buffer(window, str, 0, 0, 0);
str = m2_strlookup((int*)0x8B17EE4, (byte*)0x8B17424, 0x1B);
printstr_buffer(window, str, 0, 1, 0);
value = (*(string_group1 + (printInfo->PSIPrintInfoID * 12) + 3));
str = (window->number_text_area + 0x12);
m2_formatnumber(value, str, 2);
(*(window->number_text_area + 0x14)) = 0;
(*(window->number_text_area + 0x15)) = 0xFF;
printstr_buffer(window, str, 7, 1, 0);
}
void psiPrint_buffer(byte value, WINDOW* window, bool printPSILine, PSIPrintInfo *printInfo)
{
byte *str = 0;
byte *baseStrPointer = (byte*)(&psitext);
byte (*possibleTargets)[3][4] = (byte(*)[3][4])cursorValues;
if(printPSILine)
{
byte PSIID = printInfo->PSIID;
str = baseStrPointer + ((PSIID - 1) * 0x14);
printstr_hlight_buffer(window, str, 0, printInfo->YPrinting, 0);
if(PSIID == 1)
{
str = (byte*)(m2_ness_name + (7 * 4) + (8 * 2)); //Go to Rockin's name
print_string_in_buffer(str, 0x71, ((printInfo->YPrinting) + window->window_y) << 3, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
}
}
byte symbol = printInfo->symbol;
str = (byte*)(0x8B1B904 + (symbol * 3));
printstr_hlight_buffer(window, str, printInfo->XSymbol + 1, printInfo->YPrinting, 0);
int targetX = (((printInfo->XSymbol - 9) >> 0x1F) + printInfo->XSymbol - 9) >> 1;
(*possibleTargets)[printInfo->YPrinting][targetX] = value;
}
int PSITargetWindowInput(WINDOW* window)
{
if (!(window->flags_unknown3a & 0x10))
{
window->flags_unknown3a |= 0x10;
// Draw window header
map_tile(0xB3, window->window_x, window->window_y - 1);
clear_name_header(window);
copy_name_header(window, *active_window_party_member);
}
return PSITargetInput(window);
}
int PSITargetInput(WINDOW* window)
{
short topX = window->cursor_x;
short topY = window->cursor_y;
short beforeX = topX;
short beforeY = topY;
short currentX = beforeX;
short currentY = beforeY;
byte (*possibleTargets)[3][4] = (byte(*)[3][4])cursorValues;
byte target = (*possibleTargets)[currentY][currentX];
if(target == 0)
{
currentX = 0;
for(currentY = 0; currentY < 3 && (*possibleTargets)[currentY][currentX] == 0; currentY++)
{
for(currentX = 0; currentX < 4 && (*possibleTargets)[currentY][currentX] == 0; currentX++);
if(currentX == 4)
currentX = 0;
}
if(currentY < 3)
{
topX = currentX;
topY = currentY;
beforeX = currentX;
beforeY = currentY;
}
else
return ACTION_ERROR;
}
map_tile(0x1FF, window->window_x + (currentX * 2) + 9, window->window_y + currentY * 2);
map_tile(0x1FF, window->window_x + (currentX * 2) + 9, window->window_y + currentY * 2 + 1);
PAD_STATE state = *pad_state;
PAD_STATE state_shadow = *pad_state_shadow;
if(state.up)
{
currentY--;
if(currentY < 0 && window->hold)
currentY = 0;
else if(currentY < 0)
{
currentY = 2;
while((*possibleTargets)[currentY][currentX] == 0)
currentY--;
}
else
{
for(int i = 0; (*possibleTargets)[currentY][currentX] == 0 && i <= 2;)
{
if((*possibleTargets)[currentY][currentX] != 0)
break;
currentX--;
if(currentX < 0)
{
i++;
currentY--;
currentX = beforeX;
}
if(currentY < 0)
currentY = 2;
}
}
}
beforeX = currentX;
beforeY = currentY;
if(state.down)
{
currentY++;
if(currentY > 2 && window->hold)
currentY = 2;
else if(currentY > 2)
{
currentY = 0;
while((*possibleTargets)[currentY][currentX] == 0)
currentY++;
}
else
{
for(int i = 0; (*possibleTargets)[currentY][currentX] == 0 && i <= 2;)
{
if((*possibleTargets)[currentY][currentX] != 0)
break;
currentX--;
if(currentX < 0)
{
i++;
currentY++;
currentX = beforeX;
}
if(currentY > 2)
{
if(window->hold)
{
currentY = beforeY;
currentX = beforeX;
break;
}
currentY = 0;
}
}
}
}
beforeX = currentX;
beforeY = currentY;
if(state.right)
{
currentX++;
if(state_shadow.up && window->hold)
currentX--;
else if(currentX > 3)
{
if(window->hold)
currentX = 3;
else
{
currentX = 0;
while((*possibleTargets)[currentY][currentX] == 0)
currentX++;
}
}
else
{
if((*possibleTargets)[currentY][currentX] != 0);
else
{
if(state_shadow.down || state_shadow.up)
currentX = beforeX;
else if(currentY == 0)
{
short tmpX = currentX;
while(currentY <= 1)
{
currentX = tmpX;
while(currentX < 3)
{
if((*possibleTargets)[currentY][currentX] != 0)
break;
currentX++;
}
if((*possibleTargets)[currentY][currentX] != 0)
break;
currentY++;
}
if(currentY == 2)
{
currentY = beforeY;
if(window->hold)
currentX = beforeX;
else
{
currentX = 0;
while((*possibleTargets)[currentY][currentX] == 0)
currentX++;
}
}
}
else
{
short tmpX = currentX;
for(currentY = 2; currentY >= 0; currentY--)
{
currentX = tmpX;
while(currentX < 3)
{
if((*possibleTargets)[currentY][currentX] != 0)
break;
currentX++;
}
if((*possibleTargets)[currentY][currentX] != 0)
break;
}
if(currentY < 0)
{
currentY = beforeY;
if(window->hold)
currentX = beforeX;
else
{
currentX = 0;
while((*possibleTargets)[currentY][currentX] == 0)
currentX++;
}
}
}
}
}
}
beforeX = currentX;
beforeY = currentY;
if(state.left)
{
currentX--;
if(state_shadow.up && window->hold)
currentX++;
else if(currentX < 0)
{
if(window->hold)
currentX = 0;
else
{
currentX = 3;
while((*possibleTargets)[currentY][currentX] == 0)
currentX--;
}
}
else
{
if((*possibleTargets)[currentY][currentX] != 0);
else
{
if(state_shadow.down || state_shadow.up)
currentX = beforeX;
else if(currentY == 0)
{
short tmpX = currentX;
while(currentY <= 1)
{
currentX = tmpX;
while(currentX > 0)
{
if((*possibleTargets)[currentY][currentX] != 0)
break;
currentX--;
}
if((*possibleTargets)[currentY][currentX] != 0)
break;
currentY++;
}
if(currentY == 2)
{
currentY = beforeY;
if(window->hold)
currentX = beforeX;
else
{
currentX = 3;
while((*possibleTargets)[currentY][currentX] == 0)
currentX--;
}
}
}
else
{
short tmpX = currentX;
for(currentY = 2; currentY >= 0; currentY--)
{
currentX = tmpX;
while(currentX > 0)
{
if((*possibleTargets)[currentY][currentX] != 0)
break;
currentX--;
}
if((*possibleTargets)[currentY][currentX] != 0)
break;
}
if(currentY < 0)
{
currentY = beforeY;
if(window->hold)
currentX = beforeX;
else
{
currentX = 3;
while((*possibleTargets)[currentY][currentX] == 0)
currentX--;
}
}
}
}
}
}
window->cursor_x = currentX;
window->cursor_y = currentY;
target = (*possibleTargets)[currentY][currentX];
if(currentX != topX || currentY != topY)
window->vwf_skip = false;
bool beforeVWF = window->vwf_skip;
if(!window->vwf_skip)
{
clear_window_buffer(getWindow(9), (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
psiTargetWindow_buffer(target);
window->vwf_skip = true;
}
if(state_shadow.right || state_shadow.left || state_shadow.up || state_shadow.down)
{
window->counter = 0;
int flag = *window_flags;
if(state.up || state.down)
{
if(currentY != topY)
m2_soundeffect(0x12F);
}
if(state.left || state.right)
{
if(currentX != topX)
m2_soundeffect(0x12E);
}
window->hold = true;
}
else
window->hold = false;
if((state.b || state.select) && (beforeVWF))
{
m2_soundeffect(0x12E);
window->counter = 0;
return ACTION_STEPOUT;
}
window->cursor_x_delta = target;
if((state.a || state.l) && (beforeVWF))
{
m2_soundeffect(0x12D);
window->counter = 0xFFFF;
return target;
}
if (window->counter != 0xFFFF)
{
window->counter++;
// Draw cursor for current item
map_special_character((window->counter <= 7) ? 0x99 : 0x9A,
window->window_x + (window->cursor_x * 2) + 9,
window->window_y + window->cursor_y * 2);
if (window->counter > 0x10)
window->counter = 0;
}
return ACTION_NONE;
}

49
src/c/psi.h Normal file
View File

@ -0,0 +1,49 @@
#ifndef HEADER_PSI_INCLUDED
#define HEADER_PSI_INCLUDED
#include "vwf.h"
typedef struct PSIClasses {
bool Offense : 1;
bool Recover : 1;
bool Assist : 1;
bool Other : 1;
} PSIClasses;
typedef struct PSIWindow
{
bool Character_Window : 1;
bool Classes_Window : 1;
} PSIWindow;
typedef struct PSIPrintInfo {
byte PSIID;
byte symbol;
PSIClasses possibleClasses;
PSIWindow windowType;
unsigned short PSIPrintInfoID;
byte levelLearnt[3];
byte XSymbol;
unsigned short YPrinting;
byte *description;
} PSIPrintInfo;
typedef struct SpecialPSIFlag {
bool Ness_Teleport_Alpha : 1;
bool Poo_Starstorm_Alpha : 1;
bool Poo_Starstorm_Omega : 1;
bool Ness_Teleport_Beta : 1;
} SpecialPSIFlag;
void psiWindow_buffer(CHARACTER psiCharacter, PSIWindow typeOfWindow, PSIClasses printableClasses);
void psiTargetWindow_buffer(byte target);
void psiPrint_buffer(byte value, WINDOW* window, bool printPSILine, PSIPrintInfo *printInfo);
int PSITargetWindowInput(WINDOW* window);
int PSITargetInput(WINDOW* window);
extern PSIPrintInfo m2_psi_print_table[];
extern int psitext;
#endif

275
src/c/status.c Normal file
View File

@ -0,0 +1,275 @@
#include "window.h"
#include "status.h"
#include "number-selector.h"
#include "locs.h"
void printNumberOfStatus(int maxLength, int value, int blankX, int y, int strX, int width)
{
byte str[0x10];
int end = setNumber_getLength(value, str, maxLength);
str[end] = 0;
str[end + 1] = 0xFF;
print_blankstr_buffer(blankX, y, width, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
int x = (strX - (end * 6));
print_string_in_buffer(str, x, y << 3, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
}
void printStatusSymbolArrangement(unsigned short symbolTile, WINDOW* window)
{
map_tile(symbolTile, window->window_x + 0xA, window->window_y + 2);
if(symbolTile == 0x1FF)
symbolTile -= 0x20;
map_tile(symbolTile + 0x20, window->window_x + 0xA, window->window_y + 3);
}
void printStatusString(WINDOW* window, int value)
{
byte *str = m2_strlookup((int*)0x8B17EE4, (byte*)0x8B17424, value);
printstr_hlight_buffer(window, str, 1, 1, 0);
}
int statusNumbersPrint(WINDOW* window, bool doNotPrint)
{
if ((!(window->flags_unknown3a & 0x10)) && !doNotPrint)
{
window->flags_unknown3a |= 0x10;
// Draw window header
map_tile(0xB3, window->window_x, window->window_y - 1);
clear_name_header(window);
copy_name_header(window, *active_window_party_member);
}
if(!doNotPrint)
{
m2_hpwindow_up(*active_window_party_member);
PC *character_data = &(m2_ness_data[*active_window_party_member]);
printNumberOfStatus(2, character_data->level, 0x5, 1, 0x38, 3);
printNumberOfStatus(3, character_data->hp_max, 0x10, 7, 0x93, 3);
printNumberOfStatus(3, character_data->hp_rolling, 0xC, 7, 0x78, 3);
printNumberOfStatus(3, character_data->pp_max, 0x10, 9, 0x93, 3);
printNumberOfStatus(3, character_data->pp_rolling, 0xC, 9, 0x78, 3);
printNumberOfStatus(7, character_data->experience, 0xC, 0xB, 0x93, 7);
if(character_data->level < 99)
{
unsigned int *experienceLevelTable = (unsigned int*)0x8B1EC20;
unsigned int experienceLevelUp = *(experienceLevelTable + ((*active_window_party_member) * 100) + character_data->level + 1);
printNumberOfStatus(7, experienceLevelUp - character_data->experience, 2, 0xD, 0x3D, 6);
}
else
print_blankstr_buffer(2, 0xD, 6, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
printNumberOfStatus(3, character_data->offense_effective, 0x19, 0x1, 0xE1, 4);
printNumberOfStatus(3, character_data->defense_effective, 0x19, 0x3, 0xE1, 4);
printNumberOfStatus(3, character_data->speed_effective, 0x19, 0x5, 0xE1, 4);
printNumberOfStatus(3, character_data->guts_effective, 0x19, 0x7, 0xE1, 4);
printNumberOfStatus(3, character_data->vitality_effective, 0x19, 0x9, 0xE1, 4);
printNumberOfStatus(3, character_data->iq_effective, 0x19, 0xB, 0xE1, 4);
printNumberOfStatus(3, character_data->luck_effective, 0x19, 0xD, 0xE1, 4);
print_blankstr_buffer(5, 0xF, 0x14, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
if((*active_window_party_member) != JEFF)
{
byte *str = m2_strlookup((int*)0x8B17EE4, (byte*)0x8B17424, 0x13);
print_string_in_buffer(str, 0x2C, (0xF) << 3, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
}
print_blankstr_buffer(1, 0x3, 0xA, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
unsigned short symbolTile = ailmentTileSetup(&(character_data->ailment), 0);
if(symbolTile == 0)
{
printStatusSymbolArrangement(0x1FF, window);
}
if(character_data->ailment != CONSCIOUS)
printStatusString(window, 0x7F + character_data->ailment);
else if(character_data->ailment2 != CONSCIOUS)
printStatusString(window, 0x86 + character_data->ailment2);
else if(character_data->homesick)
printStatusString(window, 0x89);
if(character_data->ailment != CONSCIOUS || character_data->ailment2 != CONSCIOUS || character_data->ailment3 != CONSCIOUS || character_data->strange || character_data->cant_concentrate || character_data->unknown2[0])
{
if(symbolTile == 0)
return 0;
printStatusSymbolArrangement(symbolTile, window);
return 0;
}
}
return -1;
}
int statusReadInput(WINDOW* window)
{
unsigned short previousCharacter = *active_window_party_member;
int currentCharacter = previousCharacter;
PAD_STATE state = *pad_state;
PAD_STATE state_shadow = *pad_state_shadow;
if(state.right && !window->hold)
currentCharacter += 1;
if(state.left && !window->hold)
currentCharacter -= 1;
if((state.left || state.right) && !window->hold)
{
window->unknown7 = 0;
if(state.left)
{
if(currentCharacter < 0)
currentCharacter = 3;
int foundChar = currentCharacter;
for(int i = 0; i < 4; i++)
{
if (foundChar < 0)
foundChar = 3;
if ((*pc_flags)[foundChar])
break;
foundChar--;
}
currentCharacter = foundChar;
}
else
{
if(currentCharacter > 3)
currentCharacter = 0;
int foundChar = currentCharacter;
for(int i = 0; i < 4; i++)
{
if (foundChar > 3)
foundChar = 0;
if ((*pc_flags)[foundChar])
break;
foundChar++;
}
currentCharacter = foundChar;
}
m2_hpwindow_up(currentCharacter);
clear_name_header(window);
copy_name_header(window, currentCharacter);
(*active_window_party_member) = currentCharacter;
if(currentCharacter != previousCharacter)
statusNumbersPrint(window, false);
}
if(state_shadow.right || state_shadow.left)
{
if(state.right || state.left)
{
int flag = *window_flags;
if(flag & 0x800)
{
if(currentCharacter != previousCharacter)
m2_soundeffect(0x131);
}
else if(currentCharacter != previousCharacter)
m2_soundeffect(0x12E);
}
window->hold = true;
}
else
window->hold = false;
if(state.b || state.select)
{
m2_soundeffect(0x12E);
window->counter = 0;
return ACTION_STEPOUT;
}
else if(state.a || state.l)
{
m2_soundeffect(0x12D);
if(currentCharacter != JEFF)
{
if((*pc_count) > 1)
{
unsigned short *arrangementBase = (*tilemap_pointer) + (((window->window_y - 1) << 5) + window->window_x + window->window_width - 4);
unsigned short topTile = ((*tile_offset) + 0x96) | (*palette_mask) | 0x800;
(*arrangementBase) = topTile;
(*(arrangementBase + 1)) = topTile;
(*(arrangementBase + 2)) = topTile;
(*(arrangementBase + 3)) = topTile;
}
window->counter = 0;
return 1;
}
else
return 0;
}
window->counter++;
if (*pc_count > 1)
{
// We're doing a bit of simplification here.
// The Japanese version tries to highlight the arrow you pressed.
// It only shows for a couple frames and it looks weird, so we're
// just going to show the arrows and not bother with the direction indicator.
draw_window_arrows(window, window->counter < 8);
}
if (window->counter > 16)
window->counter = 0;
return ACTION_NONE;
}
int statusWindowNumbers(WINDOW* window, bool doNotPrint)
{
if(statusNumbersPrint(window, doNotPrint) == 0)
return 0;
return statusReadInput(window);
}
int statusWindowText(WINDOW* window)
{
if(window->redraw)
buffer_drawwindow(window, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
if(window->loaded_code != 0 && ((*script_readability) == 0))
{
window->delay = 0;
while(true)
{
while(window->text_y >= window->window_height || window->window_y + window->text_y > 0x1F)
properScroll(window, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
byte *str = window->text_start + window->text_offset;
if((*(str + 1)) == 0xFF)
{
int returnedLength = customcodes_parse_generic(*str, str, window, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
if(returnedLength != 0)
{
if(returnedLength < 0)
returnedLength = 0;
window->text_offset += returnedLength;
}
else
{
if((*str) == 1)
{
window->text_y += 2;
window->text_x = 0;
window->text_offset += 2;
}
else if((*str) == 0)
{
window->loaded_code = 0;
break;
}
else
window->text_offset++;
}
}
else
{
if(window->text_x >= window->window_width || window->window_x + window->text_x > 0x1F)
{
window->text_y += 2;
window->text_x = 0;
}
weld_entry_custom_buffer(window, str, 0, 0xF, (byte*)(OVERWORLD_BUFFER - ((*tile_offset) * TILESET_OFFSET_BUFFER_MULTIPLIER)));
window->text_offset++;
}
}
}
return 0;
}

14
src/c/status.h Normal file
View File

@ -0,0 +1,14 @@
#ifndef HEADER_STATUS_INCLUDED
#define HEADER_STATUS_INCLUDED
#include "vwf.h"
void printNumberOfStatus(int maxLength, int value, int blankX, int y, int strX, int width);
void printStatusSymbolArrangement(unsigned short symbolTile, WINDOW* window);
void printStatusString(WINDOW* window, int value);
int statusNumbersPrint(WINDOW* window, bool doNotPrint);
int statusReadInput(WINDOW* window);
int statusWindowNumbers(WINDOW* window, bool doNotPrint);
int statusWindowText(WINDOW* window);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -7,6 +7,7 @@
#define TRUE 1
#define FALSE 0
#define TILESET_OFFSET_BUFFER_MULTIPLIER 0x8
#define CHAR_OFFSET 0x50
#define CHAR_END 0x60
#define YOUWON_START 0x64
@ -21,17 +22,24 @@
#define WINDOW_HEADER_Y 0x11
#define WINDOW_HEADER_TILE (WINDOW_HEADER_X + (WINDOW_HEADER_Y * 32))
#define OVERWORLD_BUFFER 0x200F200
#define CUSTOMCC_SET_X 0x5F
#define CUSTOMCC_ADD_X 0x60
byte decode_character(byte chr);
byte encode_ascii(char chr);
int get_tile_number(int x, int y);
int get_tile_number_with_offset(int x, int y);
int get_tile_number_buffer(int x, int y);
int get_tile_number_with_offset_buffer(int x, int y);
int ascii_strlen(char *str);
int wrapper_count_pixels_to_tiles(byte *str, int length);
int count_pixels_to_tiles(byte *str, int length, int startingPos);
int expand_bit_depth(byte row, int foreground);
byte reduce_bit_depth(int row, int foreground);
int count_pixels_to_tiles_normal_string(byte *str, int startingPos);
int expand_bit_depth(byte row, byte foreground);
byte reduce_bit_depth(int row, int foregroundRow);
void reduce_bit_depth_sp(int* TileRows, int* bufferValues);
byte print_character(byte chr, int x, int y);
byte print_character_formatted(byte chr, int x, int y, int font, int foreground);
byte print_character_to_window(byte chr, WINDOW* window);
@ -39,10 +47,13 @@ void print_special_character(int tile, int x, int y);
void map_special_character(unsigned short tile, int x, int y);
void map_tile(unsigned short tile, int x, int y);
byte print_character_with_callback(byte chr, int x, int y, int font, int foreground,
int *dest, int (*getTileCallback)(int, int), unsigned short *tilemapPtr, int tilemapWidth);
int *dest, int (*getTileCallback)(int, int), unsigned short *tilemapPtr, int tilemapWidth, byte doubleTileHeight);
byte print_character_with_callback_1bpp_buffer(byte chr, int x, int y, byte *dest, int (*getTileCallback)(int, int), int font,
unsigned short *tilemapPtr, int tilemapWidth, byte doubleTileHeight);
byte print_character_to_ram(byte chr, int *dest, int xOffset, int font, int foreground);
int print_window_header_string(int *dest, byte *str, int x, int y);
void clear_window_header(int *dest, int length, int x, int y);
int print_window_number_header_string(int *dest, byte *str, int x, int y);
unsigned short* print_equip_header(int type, unsigned short *tilemap, unsigned int *dest,
WINDOW *window);
unsigned short format_tile(unsigned short tile, bool flip_x, bool flip_y);
@ -74,11 +85,53 @@ void copy_name(byte *str, byte *source, int *index, int pos);
byte getSex(byte character);
void getPossessive(byte character, byte *str, int *index);
void getPronoun(byte character, byte *str, int *index);
void setupShortMainMenu_Talk_to_Goods(char *String);
int get_pointer_jump_back(byte *character);
void print_letter_in_buffer(WINDOW* window, byte* character, byte *dest);
void weld_entry_custom_buffer(WINDOW *window, byte *str, int font, int foreground, byte* dest);
byte print_character_formatted_buffer(byte chr, int x, int y, int font, int foreground, byte *dest);
int print_window_with_buffer(WINDOW* window);
byte print_character_with_codes(WINDOW* window, byte* dest);
int buffer_reset_window(WINDOW* window, bool skip_redraw, byte* dest);
void handle_first_window_buffer(WINDOW* window, byte* dest);
void clear_window_buffer(WINDOW *window, byte* dest);
void clear_rect_buffer(int x, int y, int width, int height, byte* dest);
void clear_tile_buffer(int x, int y, byte* dest);
int buffer_drawwindow(WINDOW* window, byte* dest);
void scrolltext_buffer(WINDOW* window, byte* dest);
void properScroll(WINDOW* window, byte* dest);
int jumpToOffset(byte* character);
void copy_tile_buffer(int xSource, int ySource, int xDest, int yDest, byte *dest);
void copy_tile_up_buffer(int x, int y, byte *dest);
void setStuffWindow_Graphics();
void clearWindowTiles_buffer(WINDOW* window);
int initWindow_buffer(WINDOW* window, byte* text_start, unsigned short delay_between_prints);
int initWindow_cursor_buffer(WINDOW* window, byte* text_start, unsigned short cursor_x_delta, unsigned short unknown7a, unsigned short cursor_x_base);
void print_blankstr_buffer(int x, int y, int width, byte *dest);
void print_blankstr_window_buffer(int x, int y, int width, WINDOW* window);
int print_alphabet_buffer(WINDOW* window);
unsigned short ailmentTileSetup(byte *ailmentBase, unsigned short defaultVal);
int setNumber_getLength(int value, byte *str, int maxLength);
int print_string_in_buffer(byte *str, int x, int y, byte *dest);
void printCashWindow();
WINDOW* getWindow(int index);
void printTinyArrow(int x, int y);
int printstr_buffer(WINDOW* window, byte* str, unsigned short x, unsigned short y, bool highlight);
int highlight_string(WINDOW* window, byte* str, unsigned short x, unsigned short y, bool highlight);
void highlight_talk_to();
unsigned short printstr_hlight_buffer(WINDOW* window, byte* str, unsigned short x, unsigned short y, bool highlight);
unsigned short printstr_hlight_pixels_buffer(WINDOW* window, byte* str, unsigned short x, unsigned short y, bool highlight);
void load_pixels_overworld_buffer();
void store_pixels_overworld_buffer(int totalYs);
void store_pixels_overworld_buffer_totalTiles(int totalTiles);
extern unsigned short m2_coord_table_fast_progression[];
extern unsigned short m2_coord_table[];
extern byte m2_ness_name[];
extern int m2_bits_to_nybbles[];
extern int m2_bits_to_nybbles_fast[];
extern byte m2_nybbles_to_bits[];
extern byte optimized_byte_4bpp_to_1bpp_table[];
extern byte *m2_font_table[];
extern byte m2_font_widths[];
extern byte m2_font_heights[];
@ -88,9 +141,15 @@ extern byte m12_other_str6[];
extern byte m12_other_str7[];
extern byte m12_other_str8[];
extern byte m2_cstm_last_printed[];
extern byte *m2_script_readability;
extern int overworld_buffer;
extern PC m2_ness_data[];
extern int m2_arrow_tile[];
extern bool m2_isequipped(int item_index);
extern void cpufastset(void *source, void *dest, int mode);
extern byte* m2_strlookup(int *offset_table, byte *strings, int index);
extern void m2_formatnumber(int value, byte* strDest, int length);
extern int bin_to_bcd(int value, int* digit_count);
extern int m2_drawwindow(WINDOW* window);
extern int m2_resetwindow(WINDOW* window, bool skip_redraw);
@ -99,3 +158,9 @@ extern int m2_div(int dividend, int divisor);
extern int m2_remainder(int dividend, int divisor);
extern void m2_soundeffect(int index);
extern void m2_printstr(WINDOW* window, byte* str, unsigned short x, unsigned short y, bool highlight);
extern int customcodes_parse_generic(int code, char* parserAddress, WINDOW* window, byte* dest);
extern void m2_sub_d3c50();
extern void m2_sub_d6844();
extern int m2_setupwindow(WINDOW* window, short window_x, short window_y, short window_width, short window_height);
extern void m2_setupbattlename(short value);
extern void store_pixels_overworld();

View File

@ -1,5 +1,16 @@
#ifndef HEADER_WINDOW_INCLUDED
#define HEADER_WINDOW_INCLUDED
#include "types.h"
typedef enum WINDOW_ACTION
{
ACTION_NONE = 0,
ACTION_STEPIN = 1,
ACTION_STEPOUT = -1,
ACTION_ERROR = -2
} WINDOW_ACTION;
typedef struct WINDOW {
// 0x00
bool enable : 1; // 0x0001 Indicates that the window is enabled.
@ -20,20 +31,20 @@ typedef struct WINDOW {
byte* menu_text;
// 0x10
int unknown2;
byte* number_text_area;
int text_offset;
int unknown3;
int text_offset2;
// 0x20
unsigned short window_area;
short window_area;
unsigned short window_x;
unsigned short window_y;
unsigned short window_width;
unsigned short window_height;
unsigned short text_x;
unsigned short text_y;
unsigned short unknown4;
unsigned short delay_between_prints;
// 0x30
unsigned short delay;
@ -49,7 +60,10 @@ typedef struct WINDOW {
unsigned short cursor_x_base;
byte cursor_x_delta;
byte unknown9a;
int unknown9;
byte loaded_code;
byte unknown9[3];
int unknown10;
int unknown11;
} WINDOW;
#endif

View File

@ -0,0 +1 @@
DDDDODDDôDDD˙DDDDODDOODDôODD˙ODDDôDDOôDDôôDD˙ôDDD˙DDO˙DDô˙DD˙˙DDDDODODODôDOD˙DODDOODOOODôOOD˙OODDôODOôODôôOD˙ôODD˙ODO˙ODô˙OD˙˙ODDDôDODôDôDôD˙DôDDOôDOOôDôOôD˙OôDDôôDOôôDôôôD˙ôôDD˙ôDO˙ôDô˙ôD˙˙ôDDD˙DOD˙DôD˙D˙D˙DDO˙DOO˙DôO˙D˙O˙DDô˙DOô˙Dôô˙D˙ô˙DD˙˙DO˙˙Dô˙˙D˙˙˙DDDDOODDOôDDO˙DDODODOOODOôODO˙ODODôDOOôDOôôDO˙ôDOD˙DOO˙DOô˙DO˙˙DODDOOODOOôDOO˙DOODOOOOOOOôOOO˙OOODôOOOôOOôôOO˙ôOOD˙OOO˙OOô˙OO˙˙OODDôOODôOôDôO˙DôODOôOOOôOôOôO˙OôODôôOOôôOôôôO˙ôôOD˙ôOO˙ôOô˙ôO˙˙ôODD˙OOD˙OôD˙O˙D˙ODO˙OOO˙OôO˙O˙O˙ODô˙OOô˙Oôô˙O˙ô˙OD˙˙OO˙˙Oô˙˙O˙˙˙ODDDôODDôôDDô˙DDôDODôOODôôODô˙ODôDôDôOôDôôôDô˙ôDôD˙DôO˙Dôô˙Dô˙˙DôDDOôODOôôDOô˙DOôDOOôOOOôôOOô˙OOôDôOôOôOôôôOô˙ôOôD˙OôO˙Oôô˙Oô˙˙OôDDôôODôôôDôô˙DôôDOôôOOôôôOôô˙OôôDôôôOôôôôôôô˙ôôôD˙ôôO˙ôôô˙ôô˙˙ôôDD˙ôOD˙ôôD˙ô˙D˙ôDO˙ôOO˙ôôO˙ô˙O˙ôDô˙ôOô˙ôôô˙ô˙ô˙ôD˙˙ôO˙˙ôô˙˙ô˙˙˙ôDDD˙ODD˙ôDD˙˙DD˙DOD˙OOD˙ôOD˙˙OD˙DôD˙OôD˙ôôD˙˙ôD˙D˙D˙O˙D˙ô˙D˙˙˙D˙DDO˙ODO˙ôDO˙˙DO˙DOO˙OOO˙ôOO˙˙OO˙DôO˙OôO˙ôôO˙˙ôO˙D˙O˙O˙O˙ô˙O˙˙˙O˙DDô˙ODô˙ôDô˙˙Dô˙DOô˙OOô˙ôOô˙˙Oô˙Dôô˙Oôô˙ôôô˙˙ôô˙D˙ô˙O˙ô˙ô˙ô˙˙˙ô˙DD˙˙OD˙˙ôD˙˙˙D˙˙DO˙˙OO˙˙ôO˙˙˙O˙˙Dô˙˙Oô˙˙ôô˙˙˙ô˙˙D˙˙˙O˙˙˙ô˙˙˙˙˙˙˙

Binary file not shown.

View File

@ -0,0 +1 @@
33333333333333333333333333333333

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,16 +1,24 @@
//==============================================================================
// void parse(int code, char* parserAddress, WINDOW* window)
// int parse_generic(int code, char* parserAddress, WINDOW* window, byte* dest)
// In:
// r0: code
// r1: parser address
// r2: window
// r3: memory_destionation for handle_first_window_buffer
// Out:
// r0: control code length (0 if not matched)
//==============================================================================
customcodes_parse:
push {r3,lr}
ldr r3,=#0x6000000
bl customcodes_parse_generic
pop {r3,pc}
customcodes_parse_generic:
push {r1-r5,lr}
mov r5,r3
mov r3,0
mov r4,r0
@ -22,7 +30,8 @@ bne @@next
// 60 FF should be treated as a renderable code
push {r0-r3}
mov r0,r2
bl handle_first_window
mov r1,r5
bl handle_first_window_buffer
pop {r0-r3}
mov r3,3
@ -60,8 +69,9 @@ bne @@next2
// 5F FF should be treated as a renderable code
push {r0-r3}
mov r1,r5
mov r0,r2
bl handle_first_window
bl handle_first_window_buffer
pop {r0-r3}
mov r3,3
@ -101,12 +111,13 @@ b @@end
//--------------------------------
// 5D FF: Print give text
cmp r4,0x5D
bne @@end
bne @@next4
// 5D FF should be treated as a renderable code
push {r0-r3}
mov r1,r5
mov r0,r2
bl handle_first_window
bl handle_first_window_buffer
pop {r0-r3}
ldr r3,=#0x30009FB
@ -145,6 +156,40 @@ bl give_print
pop {r0}
mov r3,#0
sub r3,r3,#1 //r3 is now -1
b @@end
@@next4:
//--------------------------------
// 5C FF: Load buffer
cmp r4,#0x5C
bne @@next5
bl load_pixels_overworld
b @@end
@@next5:
//--------------------------------
// 5B FF: Print main window (if enabled) without restore of window buffer
cmp r4,#0x5B
bne @@next6
bl generic_reprinting_first_menu_talk_to_highlight
mov r3,#2
b @@end
@@next6:
//--------------------------------
// 5A FF: Restore the dialogue window
cmp r4,#0x5A
bne @@end
ldr r0,=#0x3005230
ldr r0,[r0,#8]
mov r1,#0
strh r1,[r0,#0x2A]
strh r1,[r0,#0x2C]
strb r1,[r0,#3]
bl m2_drawwindow
mov r3,#2
//--------------------------------
@@end:

View File

@ -18,6 +18,9 @@
.org 0x8B13424 :: .incbin "data/m2-mainfont3-empty.bin"
.org 0x8B088A4 :: .incbin "data/m2-shifted-cursor.bin"
.org 0x8B03384 :: .incbin "data/m2-header-bg.bin"
.org 0x8B03964 :: .incbin "data/m2-header-bg-sigle-tile.bin"
.org 0x8B03D64 :: .incbin "data/m2-header-bg-sigle-tile.bin"
.org 0x8B03DE4 :: .incbin "data/m2-status-symbols.bin"
// Greek letters
.org 0x8B1B907 :: db 0x8B // alpha
@ -49,49 +52,329 @@ mov r3,6
.include "m2-status-initial.asm"
.include "m2-status-switch.asm"
//---------------------------------------------------------
// Main window hacks
//---------------------------------------------------------
.org 0x80B7D9A :: bl b7d9a_main_window_manage_input
.org 0x80B7DD2 :: bl printCashWindow
//.org 0x80B8A36 :: bl initWindow_buffer //Money window
//.org 0x80B8A3C :: bl print_window_with_buffer
.org 0x80B8890 :: bl print_window_with_buffer :: bl b8894_printCashWindowAndStore //Main window + Cash Window out of Status menu
.org 0x80B8664 :: bl print_window_with_buffer :: bl b8894_printCashWindowAndStore //Main window + Cash Window out of PSI menu
.org 0x80B8740 :: bl print_window_with_buffer :: bl b8894_printCashWindowAndStore //Main window + Cash Window out of Equip menu
.org 0x80B859C :: bl print_window_with_buffer :: bl b8894_printCashWindowAndStore //Main window + Cash Window out of Goods menu
.org 0x80B831A :: bl initWindow_buffer
.org 0x80B8320 :: bl b8320_statusWindowTextStore
//---------------------------------------------------------
// Overworld main window/PSI class window input management hacks
//---------------------------------------------------------
.org 0x80BEAA6 :: bl beaa6_fix_sounds
.org 0x80BEA88 :: bl bea88_fix_sounds
//---------------------------------------------------------
// Main battle window hacks
//---------------------------------------------------------
.org 0x80DC22A :: bl dc22a_load_buffer_battle
.org 0x80DC8C8 :: lsl r1,r0,#4 :: nop //Fixes wrong pointer
.org 0x80DC8DE :: nop :: nop //Removes useless print
//---------------------------------------------------------
// PSI battle window hacks
//---------------------------------------------------------
.org 0x80E00C8 :: bl e02c6_print_target_store
.org 0x80E02C6 :: bl e02c6_print_target_store
.org 0x80E0762 :: bl initWindow_buffer
.org 0x80E0776 :: bl print_window_with_buffer
.org 0x80E07C2 :: bl clearWindowTiles_buffer
.org 0x80E0892 :: bl initWindow_buffer
.org 0x80E08A6 :: bl print_window_with_buffer
.org 0x80E0990 :: bl initWindow_buffer
.org 0x80E0A30 :: bl initWindow_buffer
.org 0x80E0A54 :: bl print_window_with_buffer
.org 0x80C24A2 :: bl printstr_hlight_buffer
.org 0x80C24B4 :: bl printstr_hlight_buffer
.org 0x80C24CC :: bl printstr_hlight_buffer
.org 0x80C2500 :: bl printstr_hlight_buffer
.org 0x80C2518 :: bl printstr_hlight_buffer
.org 0x80E08D8 :: bl e06ec_redraw_bash_psi_goods_defend
//---------------------------------------------------------
// BAC18 hacks (status window)
//---------------------------------------------------------
.org 0x80BACFC :: bl bac18_redraw_status
.org 0x80BAC46 :: nop :: nop
.org 0x80BAC6E :: bl bac6e_statusWindowNumbersInputManagement
.org 0x80BAD7E :: bl printstr_buffer
.org 0x80BAD88 :: bl initWindow_buffer
.org 0x80BAD92 :: bl initWindow_buffer
.org 0x80BACFC :: bl bac18_redraw_status_store
.org 0x80BADE6 :: bl bac18_redraw_status
.org 0x80BACEA :: bl bacea_status_psi_window
.org 0x80BACBA :: bl print_window_with_buffer
.org 0x80BACC4 :: bl initWindow_buffer
.org 0x80BAD1A :: bl clearWindowTiles_buffer
.org 0x80BADF6 :: bl initWindow_buffer
.org 0x80BACEE :: bl bac18_clear_psi
.org 0x80BADB0 :: bl badb0_status_inner_window
.org 0x80BADCC :: b 0x80BADD8
//---------------------------------------------------------
// Normal PSI window hacks
//---------------------------------------------------------
.org 0x80B8C34 :: bl initWindow_buffer
.org 0x80B8C42 :: bl baec6_psi_window_print_buffer
.org 0x80B8C7E :: bl initWindow_buffer
.org 0x80B8C8C :: nop :: nop
.org 0x80B8CA8 :: bl initWindow_buffer
.org 0x80B8CAE :: bl print_window_with_buffer
.org 0x80B8CEA :: bl baec6_psi_window_print_buffer
.org 0x80B8D0C :: bl initWindow_buffer
.org 0x80B8D16 :: bl initWindow_buffer
.org 0x80B8D22 :: bl psiWindow_buffer
.org 0x80B8E44 :: bl initWindow_buffer
.org 0x80B8E62 :: bl baec6_psi_window_print_buffer
.org 0x80B9222 :: bl initWindow_buffer
.org 0x80B922E :: bl psiTargetWindow_buffer
.org 0x80B916E :: bl initWindow_buffer
.org 0x80B9174 :: bl print_window_with_buffer
.org 0x80B9238 :: bl initWindow_buffer
.org 0x80B9256 :: bl baec6_psi_window_print_buffer
.org 0x80BA9FA :: bl initWindow_buffer
.org 0x80BAA00 :: bl print_window_with_buffer
.org 0x80BAB64 :: bl initWindow_buffer
.org 0x80BABA6 :: bl printstr_hlight_buffer
.org 0x80BA8AC :: bl ba8ac_load_targets_print
.org 0x80B9100 :: bl initWindow_buffer
.org 0x80B910C :: bl initWindow_buffer
.org 0x80B9118 :: bl psiTargetWindow_buffer
.org 0x80B9122 :: bl initWindow_buffer
.org 0x80B9142 :: bl baec6_psi_window_print_buffer
//---------------------------------------------------------
// Teleport window hacks
//---------------------------------------------------------
.org 0x80B9030 :: bl initWindow_buffer//Opening teleport window - "Where?"
.org 0x80B9036 :: bl print_window_with_buffer
.org 0x80B9040 :: bl b9040_special_string
.org 0x80B90D4 :: bl initWindow_buffer //Going back from teleport to the PSI window
.org 0x80B90DE :: bl initWindow_buffer
.org 0x80C5D1C :: bl initWindow_buffer //Initializes the actual teleport window
.org 0x80C5EB0 :: bl printstr_hlight_buffer
.org 0x80C5F46 :: bl printstr_hlight_buffer
.org 0x80C5F80 :: bl c5f80_printstr_hlight_buffer_store_buffer // Multiple pages initial case
.org 0x80C5EB0 :: bl printstr_hlight_buffer
.org 0x80C6134 :: bl clearWindowTiles_buffer
.org 0x80C61C8 :: lsl r0,r5,#3 :: add r0,r0,r5 :: nop //Proper string address
.org 0x80C6224 :: bl printstr_hlight_buffer
.org 0x80C625E :: bl c5f80_printstr_hlight_buffer_store_buffer // Multiple pages changing pages
.org 0x80C5F04 :: bl c5f04_store_if_done //Only one page case
//---------------------------------------------------------
// Class PSI window hacks
//---------------------------------------------------------
.org 0x80BAE1C :: bl print_window_with_buffer
.org 0x80BAEC6 :: bl baec6_psi_window_print_buffer
.org 0x80BAED4 :: bl baec6_psi_window_print_buffer
.org 0x80BAEE2 :: bl baec6_psi_window_print_buffer
.org 0x80BAEF0 :: bl baec6_psi_window_print_buffer
//---------------------------------------------------------
// Equip window generic hacks
//---------------------------------------------------------
.org 0x80BB02C :: bl innerEquipInput
.org 0x80B8066 :: bl printstr_hlight_buffer
.org 0x80B8074 :: mov r3,#0x12
.org 0x80B80A2 :: mov r1,#3 :: mov r2,#0xB :: mov r3,#0xD
.org 0x80B8092 :: bl initWindow_buffer //Initialize equipment window
.org 0x80B8098 :: bl print_window_with_buffer
.org 0x80B80BE :: bl initWindow_buffer
.org 0x80B80C4 :: bl printEquipWindowNumberText
.org 0x80B80EA :: mov r2,#0x37 :: mov r3,#3 :: bl printNumberEquip //Offense Number
.org 0x80B8112 :: mov r2,#0x37 :: mov r3,#0x13 :: bl printNumberEquip //Defense Number
.org 0x80B8138 :: bl initWindow_buffer
.org 0x80B813E :: bl print_window_with_buffer
.org 0x80B814A :: bl equipPrint
.org 0x80B8152 :: bl innerEquipInput
.org 0x80B81A2 :: bl initWindow_buffer
.org 0x80B81A8 :: bl print_window_with_buffer
.org 0x80B81BC :: bl equipPrint
.org 0x80B81CC :: bl print_equip_base_numbers
.org 0x80BAF96 :: bl initWindow_buffer //Go to inner window from outer window
.org 0x80BAF9C :: bl baf9c_print_window_store_buffer
.org 0x80BAFE6 :: mov r2,#0x37 :: mov r3,#3 :: bl printNumberEquip //Offense Number
.org 0x80BB00C :: mov r2,#0x37
.org 0x80BB17C :: bl equippableReadInput
.org 0x80BB198 :: bl printEquipNumbersArrow :: bl store_pixels_overworld :: b 0x80BB1AE //Offense Number
.org 0x80BB1A6 :: mov r2,#0x4C :: mov r3,#0x13 :: bl bb1aa_printnumberequip_store //Defense Number
.org 0x80BB05E :: bl initWindow_buffer
.org 0x80BB066 :: bl print_window_with_buffer
.org 0x80BB08A :: nop :: nop //Remove highlighting
.org 0x80BB0A8 :: bl initWindow_buffer
.org 0x80BB24C :: bl initWindow_buffer //Go back to outer window - Also does going back to inner (not innermost) window from weapons - not touched equipment
.org 0x80BB254 :: bl print_window_with_buffer
.org 0x80BB2C2 :: bl initWindow_buffer
.org 0x80BB2CA :: bl print_window_with_buffer
.org 0x80BB2E0 :: bl initWindow_buffer
.org 0x80BB2E8 :: bl print_window_with_buffer
.org 0x80BB2F6 :: bl equipPrint
.org 0x80BB300 :: bl innerEquipInput
.org 0x80BB33C :: mov r2,#0x37 :: mov r3,#3 :: bl printNumberEquip
.org 0x80BB36C :: mov r2,#0x37 :: mov r3,#0x13 :: bl printNumberEquip
.org 0x80BB3FC :: bl initWindow_buffer //Go back to inner (not innermost) window from weapons - removed equipment
.org 0x80BB404 :: bl print_window_with_buffer
.org 0x80BB41A :: bl initWindow_buffer
.org 0x80BB422 :: bl print_window_with_buffer
.org 0x80BB430 :: bl equipPrint
.org 0x80BB43A :: bl innerEquipInput
.org 0x80BB476 :: mov r2,#0x37 :: mov r3,#3 :: bl printNumberEquip
.org 0x80BB4A6 :: mov r2,#0x37 :: mov r3,#0x13 :: bl printNumberEquip
.org 0x80BB532 :: bl initWindow_buffer //Go back to inner (not innermost) window from weapons - equipped a weapon
.org 0x80BB53A :: bl print_window_with_buffer
.org 0x80BB550 :: bl initWindow_buffer
.org 0x80BB558 :: bl print_window_with_buffer
.org 0x80BB566 :: bl equipPrint
.org 0x80BB570 :: bl innerEquipInput
.org 0x80BB5AC :: mov r2,#0x37 :: mov r3,#3 :: bl printNumberEquip
.org 0x80BB5DC :: mov r2,#0x37 :: mov r3,#0x13 :: bl printNumberEquip
.org 0x80BB9E4 :: bl initWindow_buffer //Go back to inner (not innermost) window from defensive equipment - not touched equipment
.org 0x80BB9EC :: bl print_window_with_buffer
.org 0x80BBA02 :: bl initWindow_buffer
.org 0x80BBA0A :: bl print_window_with_buffer
.org 0x80BBA18 :: bl equipPrint
.org 0x80BBA22 :: bl innerEquipInput
.org 0x80BBA5E :: mov r2,#0x37 :: mov r3,#3 :: bl printNumberEquip
.org 0x80BBA8E :: mov r2,#0x37 :: mov r3,#0x13 :: bl printNumberEquip
.org 0x80BBB2C :: bl initWindow_buffer //Go back to inner (not innermost) window from defensive equipment - removed equipment
.org 0x80BBB34 :: bl print_window_with_buffer
.org 0x80BBB4A :: bl initWindow_buffer
.org 0x80BBB52 :: bl print_window_with_buffer
.org 0x80BBB60 :: bl equipPrint
.org 0x80BBB6A :: bl innerEquipInput
.org 0x80BBBA6 :: mov r2,#0x37 :: mov r3,#3 :: bl printNumberEquip
.org 0x80BBBD6 :: mov r2,#0x37 :: mov r3,#0x13 :: bl printNumberEquip
.org 0x80BBC8A :: bl initWindow_buffer //Go back to inner (not innermost) window from defensive equipment - equipped something
.org 0x80BBC92 :: bl print_window_with_buffer
.org 0x80BBCA8 :: bl initWindow_buffer
.org 0x80BBCB0 :: bl print_window_with_buffer
.org 0x80BBCBE :: bl equipPrint
.org 0x80BBCC8 :: bl innerEquipInput
.org 0x80BBD04 :: mov r2,#0x37 :: mov r3,#3 :: bl printNumberEquip
.org 0x80BBD34 :: mov r2,#0x37 :: mov r3,#0x13 :: bl printNumberEquip
//When first entering the innermost menu
.org 0x80BB6E0 :: mov r2,#0x54 :: mov r3,#3 :: bl printNumberEquip //Change second offense number's position - Weapon
.org 0x80BB710 :: mov r2,#0x54 :: mov r3,#0x13 :: bl bb1aa_printnumberequip_store //Change second defense number's position - Weapon
.org 0x80BB820 :: mov r2,#0x54 :: mov r3,#0x13 :: bl printNumberEquip //Change second defense number's position - Body
.org 0x80BB950 :: mov r2,#0x54 :: mov r3,#0x13 :: bl printNumberEquip //Change second defense number's position - Arms
.org 0x80BBE8E :: mov r2,#0x54 :: mov r3,#0x13 :: bl printNumberEquip //Change second defense number's position - Other
.org 0x80BBEBE :: mov r2,#0x54 :: mov r3,#3 :: bl bb1aa_printnumberequip_store //Change second offense number's position - Other
//When changing selection in the innermost menu
.org 0x80BBDF0 :: mov r2,#0x54 :: mov r3,#0x13 :: bl printNumberEquip //Change second defense number's position - Defensive Equipment
.org 0x80BBE20 :: mov r2,#0x54 :: mov r3,#3 :: bl bb1aa_printnumberequip_store //Change second offense number's position - Defensive Equipment
//---------------------------------------------------------
// Goods window hacks
//---------------------------------------------------------
.org 0x80B7F4E :: bl c5f80_printstr_hlight_buffer_store_buffer //Prints the balance window
.org 0x80B7F72 :: bl initWindow_cursor_buffer //Sets up the goods window
.org 0x80B97A8 :: bl initWindow_buffer //Prints "Who?" going into the window
.org 0x80B97AE :: bl baf9c_print_window_store_buffer_top
.org 0x80B992A :: bl initWindow_buffer //Prints "Who?" coming from the inner window
.org 0x80B9930 :: bl baf9c_print_window_store_buffer_top
.org 0x80B986E :: bl initWindow_buffer
.org 0x80B98B8 :: bl b98b8_print_window_store_buffer_needed //Prints "Which?" going into the window
.org 0x80B99A0 :: bl highlight_string //Highlight chosen item
.org 0x80B9A4C :: bl baf9c_print_window_store_buffer_needed //Prints "Use\nDrop\n,etc." going into the window
.org 0x80B9ADE :: bl initWindow_buffer
.org 0x80BA688 :: bl baf9c_print_window_store_buffer_top //Prints "Use\nDrop\n,etc." going out of the give window
.org 0x80BA340 :: bl initWindow_buffer //Prints "Who?" going into the window
.org 0x80BA346 :: bl print_window_with_buffer
.org 0x80BA37A :: bl initWindow_buffer //initiates the Give window
.org 0x80BA7FA :: bl initWindow_buffer //initiates the inventory window out of help
.org 0x80BA810 :: bl initWindow_buffer //initiates the options window out of help
//---------------------------------------------------------
// Goods window hacks - Stored Goods
//---------------------------------------------------------
//Choose inventory
.org 0x80BCDB4 :: bl initWindow_buffer
//First enter window - More than one page
.org 0x80C63BC :: bl initWindow_buffer
.org 0x80C63CC :: bl printstr_hlight_buffer //->Stored Goods(X)
.org 0x80C6412 :: bl printstr_hlight_buffer //Left part of the inventory
.org 0x80C643E :: bl printstr_hlight_buffer //Right part of the inventory
//First enter window - Only one page
.org 0x80C6492 :: bl initWindow_buffer
.org 0x80C64DA :: bl printstr_hlight_buffer //Left part of the inventory
.org 0x80C6518 :: bl printstr_hlight_buffer //Right part of the inventory
.org 0x80C694A :: bl clearWindowTiles_buffer
//When pressing arrow to switch page
.org 0x80C69D8 :: mov r0,#0x12 //Proper address to "->Stored Goods(3)" string
.org 0x80C69EE :: bl printstr_hlight_buffer //->Stored Goods(X)
.org 0x80C6A6C :: bl printstr_hlight_buffer //Left part of the inventory
.org 0x80C6AA4 :: bl printstr_hlight_buffer //Right part of the inventory
.org 0x80C6AC0 :: bl c6ac0_store_buffer_stored_goods_switch_page
//---------------------------------------------------------
// Goods window hacks - in battle
//---------------------------------------------------------
.org 0x80E05C0 :: lsl r1,r0,#4 :: nop //Fixes wrong pointer
.org 0x80E05D8 :: nop :: nop //Removes useless print
.org 0x80E0C46 :: bl initWindow_cursor_buffer //initiates the goods window in battle
.org 0x80E0CE4 :: bl e0ce4_redraw_battle_window_first_four //Reprints the background window for the target choosing items
.org 0x80E0D1E :: bl printstr_hlight_buffer //Prints the chosen item
.org 0x80E0EFA :: bl initWindow_buffer :: ldr r0,[r4,#0xC] :: bl print_window_with_buffer //Out of ally target window
.org 0x80E0FAA :: bl e0faa_redraw_battle_window_first_two
//---------------------------------------------------------
// BAEF8 hacks (equip window)
//---------------------------------------------------------
// Erase offense change
.macro erase_offense
.macro erase_offense_buffer
mov r0,0xC
mov r1,0xB
mov r2,4
bl print_blankstr
bl bb21c_print_blankstr_buffer
.endmacro
.macro erase_defense
.macro erase_defense_buffer
mov r0,0xC
mov r1,0xD
mov r2,4
bl print_blankstr
bl bb21c_print_blankstr_buffer
.endmacro
.org 0x80BB216 :: erase_offense
.org 0x80BB38C :: erase_offense
.org 0x80BB4C6 :: erase_offense
.org 0x80BB5FC :: erase_offense
.org 0x80BBAAE :: erase_offense
.org 0x80BBBF6 :: erase_offense
.org 0x80BBD54 :: erase_offense
.macro erase_defense_buffer_store
mov r0,0xC
mov r1,0xD
mov r2,4
bl bb21c_print_blankstr_buffer_store
.endmacro
.org 0x80BB216 :: erase_offense_buffer
.org 0x80BB38C :: erase_offense_buffer
.org 0x80BB4C6 :: erase_offense_buffer
.org 0x80BB5FC :: erase_offense_buffer
.org 0x80BBAAE :: erase_offense_buffer
.org 0x80BBBF6 :: erase_offense_buffer
.org 0x80BBD54 :: erase_offense_buffer
// Erase defense change
.org 0x80BB226 :: erase_defense
.org 0x80BBABE :: erase_defense
.org 0x80BBC06 :: erase_defense
.org 0x80BBD64 :: erase_defense
.org 0x80BB226 :: erase_defense_buffer
.org 0x80BBABE :: erase_defense_buffer_store
.org 0x80BBC06 :: erase_defense_buffer_store
.org 0x80BBD64 :: erase_defense_buffer_store
// Erase offense/defense after changing equipment
.org 0x80BB3E2 :: bl baef8_reequip_erase
@ -153,14 +436,14 @@ bl print_string
.org 0x80C23AE :: lsr r6,r3,0xD // tiles-to-pixels
.org 0x80C23CE :: bl c239c_print_psi :: nop :: nop :: nop
.org 0x80C23DA :: add r4,17 // pixel width of "PSI "
.org 0x80C23F0 :: bl print_string_hlight_pixels // print rockin'
.org 0x80C23F0 :: bl printstr_hlight_pixels_buffer // print rockin'
.org 0x80C2402 :: mov r0,3 :: lsl r0,r0,0x10 // pixel width of space
.org 0x80C242E :: mov r0,0x14 // new PSI name entry length
.org 0x80C2448
bl print_string_hlight_pixels // print PSI name
bl printstr_hlight_pixels_buffer // print PSI name
mov r2,r1 // record X width
add r2,3 // add a space
.org 0x80C2468 :: bl print_string_hlight_pixels
.org 0x80C2468 :: bl printstr_hlight_pixels_buffer
//---------------------------------------------------------
// PSI target window hacks
@ -198,6 +481,9 @@ mov r0,0x50
//Do not redraw unless it is needed
.org 0x80B8CD2 :: bl b8cd2_psi_window
//Fix multiple sounds issue when going inside the psi window
.org 0x80B8D40 :: bl b8d40_psi_going_inner_window
//Sets up for the target window
.org 0x80B8DB4 :: bl b8db4_psi_inner_window
@ -206,7 +492,7 @@ mov r0,0x50
// Redraw main menu when entering PSI target window
.org 0x80B8CF8 :: bl b8bbc_redraw_menu_13to2 // 1 to 2
.org 0x80B920C :: bl b8bbc_redraw_menu_13to2 // 3 to 2
.org 0x80B920C :: bl b8bbc_redraw_menu_13to2_store // 3 to 2
//---------------------------------------------------------
// E06EC hacks (PSI window in battle)
@ -371,12 +657,26 @@ add r0,7
lsr r0,r0,3 // pixels to tiles
pop {pc}
//---------------------------------------------------------
// Change checkerboard printing to properly handle statuses
//---------------------------------------------------------
.org 0x80D68C2 :: bl dead_name
.org 0x80D6960 :: bl sick_name
.org 0x80D6A8A :: bl alive_name
.org 0x80D6B5E :: bl dead_name
.org 0x80D6BFA :: bl sick_name
.org 0x80D6DAC :: bl d6dac_alive_name
.org m2_stat_symb_checker :: .incbin "data/m2-status-symbols-checkerboard.bin"
//---------------------------------------------------------
// CABF8 hacks (print checkerboard string)
//---------------------------------------------------------
.org 0x80CABF8 :: push {r4-r7,lr}
.org 0x80CAC0C
.org 0x80CAC0A
mov r6,1
mov r7,0
add sp,-4
b @@print_checkerboard_check
@ -780,12 +1080,6 @@ bl ba7be_reprint_first_menu
.org 0x80B9AA2
bl b9aa2_reprint_first_menu
//---------------------------------------------------------
// C6BA2 hacks (Fixes main window after exiting the Stored Goods window)
//---------------------------------------------------------
.org 0x80C6BA2
bl c6ba2_reprint_first_menu
//---------------------------------------------------------
// BCEB0 hacks (Fixes main window after exiting the pickup menu)
//---------------------------------------------------------
@ -930,7 +1224,7 @@ nop
//---------------------------------------------------------
.org 0x80C5DE0 :: bl c65da_clean_print //To:
.org 0x80C5E30 :: bl c6190_clean_print //Number on first entering the menu
.org 0x80C6190 :: bl c6190_clean_print //Number on page change
.org 0x80C6190 :: bl c6190_buffer_number //Number on page change
.org 0x80C5E04 :: nop :: strh r0,[r4,#0] :: add r4,#2 :: nop ::nop //Remove extra tile
//---------------------------------------------------------
@ -1203,6 +1497,7 @@ nop
//.org 0x80BD9F6 :: mov r2,#0x16 //Jeff
//.org 0x80BDA02 :: mov r2,#0x1B //Poo
//---------------------------------------------------------
// Movement code hacks
//---------------------------------------------------------
@ -1213,7 +1508,6 @@ nop
// Carpainter's timing fix
.org 0x802A75F :: db 0x30 //Add 8 extra frames before the game can start reading again.
//==============================================================================
// File select hacks
//==============================================================================
@ -1256,6 +1550,7 @@ nop
//Text Speed options
.org 0x8003BBC :: bl _4092_print_window_store //Printing + storing pixels
.org 0x8003C44 :: mov r3,#4 //Make highlighting the same speed for all text speeds
.org 0x8003FA2 :: bl _4092_print_window
.org 0x8003F8C :: mov r3,#4 //Print highlight of 4 tiles maximum
.org 0x8003E86 :: bl _3e86_special_setup //Avoid printing when not necessary
@ -1331,10 +1626,20 @@ nop
//==============================================================================
// Overworld player name alphabet
//==============================================================================
//"Register your name" in buffer
.org 0x80C6C54 :: bl printstr_buffer
//BLANK name in buffer
.org 0x80C6C7A :: bl printstr_buffer
//First time entering the menu's alphabet
.org 0x80C6D72 :: bl initWindow_buffer :: ldr r0,[r5,#0x10] :: bl c6d78_print_slphabet_store
//Player name printing - character is added
.org 0x80C75B4 :: bl c75b4_overworld_naming_top_printing :: b 0x80C777A
//Player name printing - character is deleted via add
//Player name printing - character is deleted via b button
.org 0x80C780E :: bl c780e_overworld_naming_top_printing :: b 0x80C789A
//Player name printing - character is deleted via backspace
@ -1361,6 +1666,13 @@ nop
//Choose character table based on alphabet loaded in
.org 0x80C7578 :: bl c7578_load_letters
//==============================================================================
// Move stuff around in order to make space for the code
//==============================================================================
.org 0x82D92D4 :: dw moved_graphics_table :: dw moved_graphics_table + 0x1CD2C
.org 0x82D9BBC :: dw moved_graphics_table + 0x26618 :: dw moved_graphics_table + 0x3F818
//==============================================================================
// Data files
//==============================================================================
@ -1375,6 +1687,10 @@ m2_overworld_alphabet_table:
.org 0x8B2C000
//This table MUST be 4-bytes padded
moved_graphics_table:
.incbin "data/moved-graphics-table.bin"
// Box font relocation
m2_font_relocate:
.incbin "data/m2-font-relocate.bin"
@ -1383,6 +1699,10 @@ m2_font_relocate:
m2_coord_table:
.incbin "data/m2-coord-table.bin"
// Co-ordinate table, version which has 5 bits used for how many consecutive tiles there are after each tile
m2_coord_table_fast_progression:
.incbin "data/m2-coord-table-fast-progression.bin"
// EB fonts
m2_font_table:
dw m2_font_main
@ -1433,6 +1753,9 @@ m2_widths_tiny:
m2_bits_to_nybbles:
.incbin "data/m2-bits-to-nybbles.bin"
m2_bits_to_nybbles_fast:
.incbin "data/m2-bits-to-nybbles-fast.bin"
m2_nybbles_to_bits:
.incbin "data/m2-nybbles-to-bits.bin"
@ -1472,11 +1795,16 @@ flyover_coffee:
m2_coord_table_file:
.incbin "data/m2-coord-table-file-select.bin"
optimized_byte_4bpp_to_1bpp_table:
.incbin "data/optimized-byte-4bpp-to-1bpp-table.bin"
//==============================================================================
// Existing subroutines/data
//==============================================================================
.definelabel buffer_subtractor ,0x0000800
.definelabel overworld_buffer ,0x200F200
.definelabel m2_ness_data ,0x3001D54
.definelabel m2_ness_name ,0x3001F10
.definelabel m2_old_paula_name ,0x3001F16
@ -1516,10 +1844,12 @@ m2_coord_table_file:
.definelabel m2_setup_window ,0x80BD844
.definelabel m2_strlookup ,0x80BE260
.definelabel m2_initwindow ,0x80BE458
.definelabel m2_initwindow_cursor ,0x80BE4C8
.definelabel m2_statuswindow_numbers,0x80C0A5C
.definelabel m2_psiwindow ,0x80C1FBC
.definelabel m2_drawwindow ,0x80C87D0
.definelabel m2_print_window ,0x80C8BE4
.definelabel m2_print_alphabet ,0x80C8FFC
.definelabel m2_printstr ,0x80C9634
.definelabel m2_printstr_hlight ,0x80C96F0
.definelabel m2_printnextch ,0x80C980C
@ -1527,13 +1857,19 @@ m2_coord_table_file:
.definelabel m2_formatnumber ,0x80CA65C
.definelabel m2_clearwindowtiles ,0x80CA834
.definelabel m2_menuwindow ,0x80C1C98
.definelabel m2_setupwindow ,0x80BE188
.definelabel m2_resetwindow ,0x80BE490
.definelabel m2_sub_d3c50 ,0x80D3C50
.definelabel m2_hpwindow_up ,0x80D3F0C
.definelabel m2_curhpwindow_down ,0x80D41D8
.definelabel m2_sub_d6844 ,0x80D6844
.definelabel m2_setupbattlename ,0x80DCD00
.definelabel m2_stat_symb_checker ,0x8B0EDA4
.definelabel m2_div ,0x80F49D8
.definelabel m2_remainder ,0x80F4A70
.definelabel m2_default_names ,0x82B9330
.definelabel m2_items ,0x8B1D62C
.definelabel m2_default_names ,0x82B9330
.definelabel m2_psi_print_table ,0x8B2A9C0
//==============================================================================
// Code files

File diff suppressed because it is too large Load Diff

View File

@ -433,7 +433,7 @@ namespace ScriptTool
static void CompileM12()
{
int baseAddress = 0xB80000;
int baseAddress = 0xC10000;
int referenceAddress = baseAddress;
var buffer = new List<byte>();
@ -495,7 +495,7 @@ namespace ScriptTool
static void CompileM12Misc()
{
int referenceAddress = 0xB70000;
int referenceAddress = 0xC00000;
// Item names
CompileM12MiscStringCollection("m12-itemnames", ref referenceAddress);
@ -527,10 +527,11 @@ namespace ScriptTool
IncludeFile.WriteLine();
IncludeFile.WriteLine("// Fix pointers to \"PSI \"");
IncludeFile.WriteLine(".definelabel psitext, 0x{0:X8}", psiPointer | 0x8000000);
foreach (var address in updateAddresses)
{
IncludeFile.WriteLine(String.Format(".org 0x{0:X} :: dw 0x{1:X8}",
address | 0x8000000, psiPointer | 0x8000000));
IncludeFile.WriteLine(String.Format(".org 0x{0:X} :: dw psitext",
address | 0x8000000));
}
// PSI targets
@ -693,6 +694,7 @@ namespace ScriptTool
{
var str = hardcodedStrings[i];
offsetFile.WriteLine($".definelabel {name.Replace('-', '_')}_str{i},0x{referenceAddress | 0x8000000:X}");
foreach (int ptr in str.PointerLocations)
{
offsetFile.WriteLine(String.Format(".org 0x{0:X} :: dw 0x{1:X8}",

View File

@ -1804,5 +1804,71 @@
"PointerLocation": 951280,
"OldPointer": 493444,
"Label": "L9000"
},
{
"Index": 301,
"PointerLocation": 658200,
"OldPointer": 534706,
"Label": "L3774"
},
{
"Index": 302,
"PointerLocation": 658224,
"OldPointer": 532274,
"Label": "L3772"
},
{
"Index": 303,
"PointerLocation": 658248,
"OldPointer": 531267,
"Label": "L3773"
},
{
"Index": 304,
"PointerLocation": 658252,
"OldPointer": 533006,
"Label": "L32003"
},
{
"Index": 305,
"PointerLocation": 616180,
"OldPointer": 279156,
"Label": "L314"
},
{
"Index": 306,
"PointerLocation": 616184,
"OldPointer": 441774,
"Label": "L1031"
},
{
"Index": 307,
"PointerLocation": 616220,
"OldPointer": 324778,
"Label": "L610"
},
{
"Index": 308,
"PointerLocation": 616240,
"OldPointer": 325844,
"Label": "L615"
},
{
"Index": 309,
"PointerLocation": 616260,
"OldPointer": 326292,
"Label": "L616"
},
{
"Index": 310,
"PointerLocation": 197030,
"OldPointer": 471486,
"Label": "L32000"
},
{
"Index": 311,
"PointerLocation": 616200,
"OldPointer": 323841,
"Label": "L603"
}
]

View File

@ -266,49 +266,49 @@
"OffsetLocation": 11632508,
"OldPointer": 11630256,
"Old": " ぶき :[01 FF] ボディ:[01 FF] うで :[01 FF] そのた:[00 FF]",
"New": "[5F FF 08]Weapon:[01 FF][5F FF 08]Body:[01 FF][5F FF 08]Arms:[01 FF][5F FF 08]Other:[00 FF]"
"New": "[5F FF 0E]Weapon[01 FF][5F FF 1A]Body[01 FF][5F FF 17]Arms[01 FF][5F FF 17]Other[00 FF]"
},
{
"Index": 38,
"OffsetLocation": 11632512,
"OldPointer": 11630284,
"Old": "ぶき[00 FF]",
"New": "Weapon[00 FF]"
"New": "[5F FF 0E]Weapon[00 FF]"
},
{
"Index": 39,
"OffsetLocation": 11632516,
"OldPointer": 11630288,
"Old": "ボディ[00 FF]",
"New": "Body[00 FF]"
"New": "[5F FF 1A]Body[00 FF]"
},
{
"Index": 40,
"OffsetLocation": 11632520,
"OldPointer": 11630293,
"Old": "うで[00 FF]",
"New": "Arms[00 FF]"
"New": "[5F FF 17]Arms[00 FF]"
},
{
"Index": 41,
"OffsetLocation": 11632524,
"OldPointer": 11630297,
"Old": "そのた[00 FF]",
"New": "Other[00 FF]"
"New": "[5F FF 17]Other[00 FF]"
},
{
"Index": 42,
"OffsetLocation": 11632528,
"OldPointer": 11630302,
"Old": "(なし) [00 FF]",
"New": "(None)[00 FF]"
"New": "(Nothing)[00 FF]"
},
{
"Index": 43,
"OffsetLocation": 11632532,
"OldPointer": 11630314,
"Old": " オフェンス:[01 FF]ディフェンス:[00 FF]",
"New": "[5F FF 08]Offense:[01 FF][5F FF 08]Defense:[00 FF]"
"New": "Offense:[01 FF]Defense:[00 FF]"
},
{
"Index": 44,

View File

@ -1854,7 +1854,7 @@
^L1859^[1C FF B0 01 _L5453_]@No problem here.[1D FF][00 FF]
^L1860^[68 FF][1C FF 04 03 _L2214_][1C FF 49 00 _L5152_][A8 FF 01][8A FF][8D FF 01 00][9A FF 01 00][81 FF _L5153_]@Hello?[02 FF]@...Is that you, [0D FF][1B FF 0A 00]?[02 FF]@Why are you disguising your[01 FF] voice like that?[02 FF]@Who are you pretending to be?[02 FF]@Oh, well. It's not a big deal.[02 FF]@I suppose you need to have a[01 FF] sense of humor at a time like[01 FF] this.[02 FF][80 FF _L5154_]
^L1861^[68 FF][8D FF 01 00][A8 FF 00][9A FF 01 00][82 FF _L5466_][1C FF 49 00 _L5467_][83 FF B0 02][82 FF _L5468_][92 FF 01 06 02][81 FF _L5469_][92 FF 01 01 08][81 FF _L5470_][1C FF B1 02 _L5471_][F6 FF 07 00][95 FF 07 _L5472_ _L5472_ _L5473_ _L5473_ _L5474_ _L5474_ _L5475_][00 FF]^L5472^@[0D FF]?[02 FF]@.....[02 FF]@Don't say a word; I know[01 FF] exactly what you're thinking.[02 FF]@My son, who'd have thought[01 FF] he was such a brave kid?[02 FF]@Oh, yeah... you're a hero,[01 FF] honey!...[02 FF]@Click! Beep-beep-beep...[1D FF][D4 FF 0B 00][00 FF]
^L1862^[68 FF][1C FF 02 03 _L2214_][1C FF 49 00 _L5169_][1C FF B5 00 _L5170_][1C FF 85 02 _L5170_][1C FF B6 02 _L5170_][1C FF B7 02 _L5170_][86 FF _L3541_][81 FF _L5170_][1C FF B4 02 _L5171_][1C FF B5 02 _L5172_][86 FF _L5173_]^L5258^[86 FF _L5174_][03 FF 11 00][04 FF _L5175_][05 FF _L5176_]^L5182^[86 FF _L5177_][86 FF _L5178_][00 FF]^L5175^[F4 FF 01 00 01 00][DD FF 02 00 00 00 00 00 00 00][81 FF _L5179_][86 FF _L5180_][08 FF 85 02][CF FF 03 00][86 FF _L5178_][08 FF F2 02][00 FF]
^L1862^[68 FF][1C FF 02 03 _L2214_][1C FF 49 00 _L5169_][1C FF B5 00 _L5170_][1C FF 85 02 _L5170_][1C FF B6 02 _L5170_][1C FF B7 02 _L5170_][86 FF _L3541_][81 FF _L5170_][1C FF B4 02 _L5171_][1C FF B5 02 _L5172_][86 FF _L5173_]^L5258^[86 FF _L5174_][03 FF 11 00][04 FF _L5175_][05 FF _L5176_]^L5182^[86 FF _L5177_][86 FF _L5178_][00 FF]^L5175^[F4 FF 01 00 01 00][DD FF 02 00 00 00 00 00 00 00][81 FF _L5179_][86 FF _L5180_][08 FF 85 02][CF FF 03 00][86 FF _L5178_][08 FF F2 02][00 FF]^L5866^[5B FF][5A FF][86 FF _L5177_][86 FF _L5178_][00 FF]
^L1863^[68 FF]@Hello! This is Mach Pizza![01 FF][1C FF 49 00 _L5261_][86 FF _L3541_][81 FF _L5262_][1C FF B4 00 _L5262_]^L5267^ What would you like to order?[22 FF][01 FF][E7 FF 00 00][8A FF][8B FF][95 FF 03 _L5263_ _L5264_ _L5265_]^L5269^@Call again![02 FF][80 FF _L5266_]
^L1864^[68 FF][1C FF 49 00 _L5465_][8D FF 01 00][87 FF]@Hello,[1B FF 0F 00] this is the Stoic Club.[02 FF]@Oh,[1B FF 0F 00] [90 FF 00][1A FF 01 00], [87 FF][86 FF _sirmaam_]![1B FF 14 00][01 FF] Would you like to make a[01 FF] reservation?[02 FF]@Certainly.[02 FF]@We are looking forward to[01 FF] having you here.[1B FF 0F 00] Thank you.[02 FF]@Click! Beep-beep-beep... [1D FF][D4 FF 0B 00][08 FF 51 01][00 FF]
^L1865^[00 FF]
@ -2156,7 +2156,7 @@
^L2137^[09 FF 88 02][08 FF E5 00][86 FF _L4899_][09 FF E5 00][86 FF _L4024_][00 FF]
^L2138^[86 FF _L4937_][09 FF BE 01][09 FF 86 02][09 FF 87 02][09 FF 88 02]@Hello![01 FF] (gasp... pant...)[02 FF]@I saw your sign[01 FF] (gasp... pant...),[02 FF]@and thought I should stop by[01 FF] and buy something.[02 FF]@I tried and tried to find it[01 FF] (gasp... pant...)[01 FF] but no such luck.[02 FF]@I think you should give this up[01 FF] and go home.[02 FF]@If you took your business more[01 FF] seriously,[02 FF]@you would be more considerate[01 FF] of your customers![02 FF][86 FF _L4938_][09 FF F2 02][00 FF]
^L2139^[00 FF]
^L2140^[86 FF _L4002_][09 FF B5 00][09 FF 85 02][86 FF _L4937_]@Hello![01 FF] This is Escargo Express.[01 FF] (hee, ha, he, ha)[02 FF]@I just (hee, ha, he, ha)[01 FF] couldn't find your location...[02 FF]@...You must be somewhere[01 FF] really strange.[01 FF] (hee, ha, he, ha)[02 FF]@I've decided, honestly, that...[01 FF] I should give up.[02 FF]@I'm outta here.[01 FF] (hee, ha, he, ha)[02 FF]@Sometimes this happens,[01 FF] you know?[02 FF][86 FF _L4938_][86 FF _L4024_][00 FF]
^L2140^[86 FF _L4002_]^L32003^[09 FF B5 00][09 FF 85 02][86 FF _L4937_]@Hello![01 FF] This is Escargo Express.[01 FF] (hee, ha, he, ha)[02 FF]@I just (hee, ha, he, ha)[01 FF] couldn't find your location...[02 FF]@...You must be somewhere[01 FF] really strange.[01 FF] (hee, ha, he, ha)[02 FF]@I've decided, honestly, that...[01 FF] I should give up.[02 FF]@I'm outta here.[01 FF] (hee, ha, he, ha)[02 FF]@Sometimes this happens,[01 FF] you know?[02 FF][86 FF _L4938_][86 FF _L4024_][00 FF]
^L2141^[09 FF B4 00][09 FF B3 00][86 FF _L4937_]@Hello![01 FF] This is Mach Pizza.[01 FF] (hee, ha, he, ha)[02 FF]@...You must be somewhere[01 FF] really strange,[01 FF] (hee, ha, he, ha)...[02 FF]@I couldn't deliver the pizza.[01 FF] The pizza got really cold and[01 FF] hard, and my legs are tired...[02 FF]@I am going to give up and[01 FF] go back.[02 FF]@...I hope I can find the way[01 FF] home...[01 FF] (hee, ha, he, ha)[02 FF][86 FF _L4938_][86 FF _L4024_][00 FF]
^L2142^[5D FF][00 FF]
^L2143^[00 FF]
@ -2227,7 +2227,7 @@
^L2231^@Oh, it's my line now? Ooops!^L3409^[86 FF _L2485_][04 FF _L2240_][05 FF _L5243_]^L5243^@What the hey?[01 FF] Well, see you![1D FF][00 FF]
^L2232^[D4 FF 05 00][01 FF]@You have too much stuff.[1D FF][00 FF]
^L2233^[D4 FF 74 00][1B FF 3C 00][86 FF _L5525_][00 FF]
^L2236^[86 FF _L4952_][82 FF _L5246_][F4 FF 01 00 01 00][DD FF 02 00 00 00 00 00 00 00][81 FF _L5247_]@What do you want to store?[02 FF][69 FF][86 FF _L2489_][82 FF _L5248_][88 FF][F4 FF 00 00 00 00][81 FF _L5249_][89 FF][AB FF 00 00][D4 FF 76 00]@The [90 FF 00][1A FF 02 00]?[01 FF] Don't worry, I'll keep it safe.[1B FF 0F 00][02 FF][89 FF][F3 FF 00 00 00 00]^L5250^@Do you have anything else that[01 FF] you want me to store?[03 FF 00 00][04 FF _L2236_][05 FF _L5248_][80 FF _L5248_]^L5247^@I'm sorry.[01 FF] My locker is full.[02 FF][80 FF _L5248_]
^L2236^[86 FF _L4952_][82 FF _L5246_][F4 FF 01 00 01 00][DD FF 02 00 00 00 00 00 00 00][81 FF _L5247_]@What do you want to store?[02 FF][69 FF][86 FF _L2489_][82 FF _L5865_][88 FF][F4 FF 00 00 00 00][81 FF _L5249_][89 FF][AB FF 00 00][D4 FF 76 00][5A FF]@The [90 FF 00][1A FF 02 00]?[01 FF] Don't worry, I'll keep it safe.[1B FF 0F 00][02 FF][89 FF][F3 FF 00 00 00 00]^L5250^@Do you have anything else that[01 FF] you want me to store?[03 FF 00 00][04 FF _L2236_][05 FF _L5248_][80 FF _L5248_]^L5247^@I'm sorry.[01 FF] My locker is full.[02 FF][80 FF _L5248_]
^L2237^@Ooops![1B FF 14 00] You seem to be[01 FF] carrying too much stuff[01 FF] already![1D FF][00 FF]
^L2238^[D4 FF 74 00][1B FF 3C 00][8A FF][C6 FF][D4 FF 66 00][1B FF 64 00][8B FF][86 FF _L5525_][00 FF]
^L2240^@What do you want me to do?^L5255^[03 FF 12 00][04 FF _L2236_][05 FF _L5244_][1C FF 49 00 _L5245_]@Well, take care and I'll talk to[01 FF] you later![1D FF][00 FF]^L5245^@Well, take care and talk to you[01 FF] later![02 FF]@Oh, I said <take care>![02 FF]@It just slipped out of my mouth,[02 FF]@just like I was talking to you[01 FF] when you were gone...[1D FF][00 FF]
@ -4540,14 +4540,14 @@
^L5037^[BC FF F5 00][A8 FF 01][87 FF][00 FF]
^L5038^[9A FF 00 00]
^L5039^[00 FF]
^L5041^[8D FF 01 00][A8 FF 00][8A FF][8B FF][8B FF][B6 FF 02 00][8A FF][8B FF][82 FF _L5043_][87 FF][00 FF]
^L5041^[8D FF 01 00][A8 FF 00][8A FF][8B FF][8B FF][5C FF][B6 FF 02 00][5B FF][5A FF][8A FF][8B FF][82 FF _L5043_][87 FF][00 FF]
[A8 FF 00][82 FF _L5042_][82 FF _L2489_][82 FF _L2489_]^L5042^[87 FF][00 FF]
^L5043^[00 FF]
^L5044^[8D FF 01 00][A8 FF 00][8A FF][8B FF][8B FF][B6 FF 02 00][8A FF][8B FF][82 FF _L5046_][87 FF][00 FF]
[A8 FF 00][82 FF _L5045_][82 FF _L3640_][82 FF _L3640_]^L5045^[C7 FF][87 FF][00 FF]
^L5046^[00 FF]
^L5047^[8B FF][00 FF]
^L5048^[87 FF][62 FF][87 FF][8A FF][82 FF _L5047_][87 FF][91 FF 00][81 FF _L5047_][8B FF][87 FF][89 FF][80 FF _L5048_]
^L5047^[8B FF][00 FF]^L5864^[8B FF][5B FF][5A FF][00 FF]
^L5048^[87 FF][62 FF][87 FF][8A FF][82 FF _L5047_][87 FF][91 FF 00][81 FF _L5864_][8B FF][87 FF][89 FF][80 FF _L5048_]
^L5049^[A8 FF 01][88 FF]@I can examine one of you for[01 FF] $[B8 FF 00][1A FF 04 00].[9C FF][69 FF][03 FF 15 00][86 FF _L4957_][95 FF 02 _L5354_ _L5355_]^L5355^@You really don't need any[01 FF] treatment?[01 FF] All right.^L5367^[86 FF _L5356_][1D FF][00 FF]^L5354^[99 FF 00 00 00 00][81 FF _L5357_][96 FF 02][81 FF _L5358_]@Who is sick?[69 FF][EC FF][01 FF][82 FF _L5355_]^L5366^[88 FF][ED FF 00 00 01 00][95 FF 08 _L5359_ _L5360_ _L5361_ _L5361_ _L5362_ _L5363_ _L5364_ _L5365_]^L5358^[8D FF 01 00][80 FF _L5366_]
^L5051^[A8 FF 01][86 FF _L5371_][82 FF _L5372_]@Who do you want to see?[69 FF][EC FF][01 FF][82 FF _L5373_][88 FF][92 FF 00 01 02][82 FF _L5374_][89 FF][87 FF]@[90 FF 00][1A FF 01 00] was just brought[01 FF] in, and is still unconscious.[02 FF][87 FF]@Please pay $[B8 FF 00][1A FF 04 00] for[01 FF] the doctor's fee.[03 FF 00 00][86 FF _L4957_][95 FF 02 _L5375_ _L5376_]^L5376^@Your friend, right?... It's very[01 FF] serious.[1D FF][00 FF]^L5375^[99 FF 00 00 00 00][81 FF _L5377_][9B FF 00 00 00 00][9C FF][89 FF][EE FF 00 00 01 00 01 00][89 FF][EE FF 00 00 02 00 01 00][89 FF][EE FF 00 00 06 00 01 00][89 FF][87 FF][F7 FF 00 00 64 00][F8 FF 00 00 64 00][D4 FF 25 00][1B FF 32 00]@I'm so glad that you recovered,[01 FF] [90 FF 00][1A FF 01 00].[02 FF]@Come back any time you need.[1D FF][00 FF]
^L5053^[BF FF][BC FF 01 00]^L5447^[A8 FF 01][96 FF 00][81 FF _L5445_][8D FF 00 00][82 FF _L5446_][92 FF 00 02 02][81 FF _L5446_][C0 FF][80 FF _L5447_]
@ -4629,7 +4629,7 @@
^L5172^@This is about the delivery of the[01 FF] <[90 FF A9][1A FF 02 00]>?[03 FF 00 00][04 FF _L5259_][05 FF _L5260_]^L5260^@Oh, that's not what you want?[02 FF][80 FF _L5258_]^L5259^@We'll send someone right away.[02 FF][86 FF _L5178_][08 FF B7 02][CF FF 0A 00][08 FF F2 02][00 FF]
^L5173^@Hello! This is Escargo Express.[02 FF][BC FF 01 00][86 FF _L2177_][81 FF _L5196_]@Oh, is that you, [0D FF]?[01 FF] Big Bro![02 FF]@It's me, Tracy.[02 FF]@I'm working part-time for[01 FF] Escargo Express.[02 FF]^L5196^[00 FF]
^L5174^[1C FF 49 00 _L5197_]@What can I do for you?[00 FF]
^L5176^[BC FF 01 00][F5 FF][82 FF _L5183_][86 FF _L5184_]^L5194^[F1 FF][82 FF _L5182_][87 FF][88 FF][7A FF 00 00][87 FF]@[90 FF 00][1A FF 02 00]?[01 FF] Do you need anything else?[89 FF][79 FF FF 00 00 00][86 FF _L2485_][04 FF _L5185_][05 FF _L5186_][80 FF _L5186_]
^L5176^[BC FF 01 00][F5 FF][82 FF _L5183_][86 FF _L5184_]^L5194^[F1 FF][82 FF _L5866_][87 FF][88 FF][7A FF 00 00][87 FF][5B FF][5A FF]@[90 FF 00][1A FF 02 00]?[01 FF] Do you need anything else?[89 FF][79 FF FF 00 00 00][86 FF _L2485_][04 FF _L5185_][05 FF _L5186_][80 FF _L5186_]
^L5177^[1C FF 49 00 _L5198_][BC FF 01 00][86 FF _L2177_][81 FF _L5199_]@Come again.[02 FF][00 FF]
^L5178^[D4 FF 0B 00]@(Click!)[1D FF][00 FF]
^L5179^[86 FF _L5181_][80 FF _L5182_]
@ -4637,8 +4637,8 @@
^L5181^[1C FF 49 00 _L5201_]@I'm very sorry.[01 FF] Our storage lockers are all full[01 FF] right now.[02 FF][00 FF]
^L5183^[86 FF _L5193_][80 FF _L5182_]
^L5184^[1C FF 49 00 _L5202_]@You would like us to deliver[01 FF] something? We can deliver up[01 FF] to three things.[02 FF]@Please select the goods you[01 FF] want.[02 FF][00 FF]
^L5185^[BC FF 01 00][F5 FF][82 FF _L5187_]@Select an item.[02 FF][F1 FF][82 FF _L5186_][87 FF][88 FF][7A FF 00 00][87 FF]@[90 FF 00][1A FF 02 00]?[01 FF] Do you need anything else?[86 FF _L2485_][04 FF _L5188_][05 FF _L5186_][80 FF _L5186_]
^L5188^[BC FF 01 00][F5 FF][82 FF _L5187_]@Select an item.[02 FF][F1 FF][82 FF _L5186_][87 FF][88 FF][7A FF 00 00][87 FF]@[90 FF 00][1A FF 02 00]?[02 FF][89 FF][79 FF FF 00 00 00]^L5186^@Just to confirm, you're[01 FF] expecting delivery of the[02 FF][78 FF 01 00 00 00]@[90 FF 00][1A FF 02 00][78 FF 02 00 00 00][82 FF _L5189_][01 FF] [90 FF 00][1A FF 02 00][78 FF 03 00 00 00][82 FF _L5189_][01 FF] and [90 FF 00][1A FF 02 00].^L5189^[02 FF]@Is that correct?[86 FF _L2485_][04 FF _L5190_][05 FF _L5191_][80 FF _L5191_]
^L5185^[BC FF 01 00][F5 FF][82 FF _L5187_]@Select an item.[02 FF][F1 FF][82 FF _L5867_][87 FF][88 FF][7A FF 00 00][87 FF][5B FF][5A FF]@[90 FF 00][1A FF 02 00]?[01 FF][89 FF][79 FF FF 00 00 00] Do you need anything else?[86 FF _L2485_][04 FF _L5188_][05 FF _L5186_][80 FF _L5186_]
^L5188^[BC FF 01 00][F5 FF][82 FF _L5187_]@Select an item.[02 FF][F1 FF][82 FF _L5867_][87 FF][88 FF][7A FF 00 00][87 FF][5B FF][5A FF]@[90 FF 00][1A FF 02 00]?[02 FF][89 FF][79 FF FF 00 00 00]^L5186^@Just to confirm, you're[01 FF] expecting delivery of the[02 FF][78 FF 01 00 00 00]@[90 FF 00][1A FF 02 00][78 FF 02 00 00 00][82 FF _L5189_][01 FF] [90 FF 00][1A FF 02 00][78 FF 03 00 00 00][82 FF _L5189_][01 FF] and [90 FF 00][1A FF 02 00].^L5189^[02 FF]@Is that correct?[86 FF _L2485_][04 FF _L5190_][05 FF _L5191_][80 FF _L5191_]^L5867^[5B FF][5A FF][80 FF _L5186_]
^L5187^[8D FF 01 00][87 FF]@We're not storing any of[01 FF] [90 FF 00][1A FF 01 00]'s stuff right now.[02 FF][80 FF _L5186_]
^L5190^[86 FF _L5192_][08 FF B5 00][CF FF 02 00][86 FF _L5178_][08 FF F2 02][00 FF]
^L5191^[86 FF _L4002_]@Well, please start over again.[02 FF][80 FF _L5194_]
@ -4676,10 +4676,10 @@
^L5238^@I don't think you can carry[01 FF] everything.[02 FF][78 FF 01 00 01 00]@Well, I'll leave just[01 FF] the [90 FF 00][1A FF 02 00].[02 FF][86 FF _L5240_][78 FF 02 00 01 00][77 FF 00 00][78 FF 03 00 01 00][82 FF _L5241_][77 FF 00 00]^L5241^[00 FF]
^L5239^@I don't think you can carry[01 FF] everything.[02 FF][78 FF 01 00 01 00]@Well, I'll leave just[01 FF] the [90 FF 00][1A FF 02 00][01 FF] and[78 FF 02 00 01 00] the [90 FF 00][1A FF 02 00].[02 FF][86 FF _L5240_][78 FF 03 00 01 00][77 FF 00 00][00 FF]
^L5240^[83 FF 49 00][BD FF 01 _L5223_][9C FF][D4 FF 76 00]@OK, here we are.[01 FF] Thank you![1D FF][C6 FF][86 FF _L4023_][86 FF _L4910_][00 FF]
^L5244^[BC FF 01 00][F5 FF][82 FF _L5251_][91 FF FF][82 FF _L5252_]@What would you like[01 FF] returned?[02 FF][69 FF]^L5254^[F1 FF][82 FF _L5248_][87 FF][88 FF][86 FF _L5048_][82 FF _L5253_][8A FF][8B FF][D4 FF 74 00][F2 FF 00 00 00 00][AB FF 00 00]@The [90 FF 00][1A FF 02 00]?[01 FF] Take good care of it.[02 FF]@Is there anything else you want[01 FF] returned?[03 FF 00 00][04 FF _L5244_][05 FF _L5248_][80 FF _L5248_]^L5253^[87 FF][69 FF][80 FF _L5254_]
^L5244^[BC FF 01 00][F5 FF][82 FF _L5251_][91 FF FF][82 FF _L5252_]@What would you like[01 FF] returned?[02 FF][69 FF]^L5254^[F1 FF][82 FF _L5865_][87 FF][88 FF][86 FF _L5048_][82 FF _L5253_][8A FF][8B FF][D4 FF 74 00][F2 FF 00 00 00 00][AB FF 00 00]@The [90 FF 00][1A FF 02 00]?[01 FF] Take good care of it.[02 FF]@Is there anything else you want[01 FF] returned?[03 FF 00 00][04 FF _L5244_][05 FF _L5248_][80 FF _L5248_]^L5253^[87 FF][69 FF][80 FF _L5254_]
^L5246^@I don't think you have anything[01 FF] to store.[02 FF][80 FF _L5248_]
^L5248^@Do you need anything else from[01 FF] me?[80 FF _L5255_]
^L5249^@I think you should hang on to[01 FF] that.[02 FF][80 FF _L5250_]
^L5865^[5B FF][5A FF]^L5248^@Do you need anything else from[01 FF] me?[80 FF _L5255_]
^L5249^[5A FF]@I think you should hang on to[01 FF] that.[02 FF][80 FF _L5250_]
^L5251^@I'm not storing any of your[01 FF] stuff.[02 FF][80 FF _L5248_]
^L5252^@I think you are already carrying[01 FF] too many things.[02 FF][80 FF _L5248_]
^L5261^[22 FF]@Our delivery men got tired and[01 FF] quit.[02 FF]@So, we decided to close the[01 FF] shop.[02 FF]@Thank you for consistently[01 FF] using us for all of your pizza[01 FF] needs.[1B FF 14 00][01 FF][D4 FF 0B 00] (Click!)[1D FF][00 FF]
@ -4956,7 +4956,7 @@
^L5603^[B2 FF 02 00 CC 00][1B FF 0F 00][C3 FF 01 01 02 00][D8 FF 01 00 00 00][C3 FF 03 01 02 00][D8 FF 03 00 00 00][1B FF 2D 00][6B FF 03 00][B5 FF 02 00][FC FF 27 00][1B FF 01 00][A0 FF D0 07 8E 00 01 00][9E FF][AA FF D0 07][CB FF 01 00 06 00][CB FF 03 00 06 00][1B FF B4 00]@.....[1D FF][C6 FF][1B FF 3C 00][CC FF 01 00 01 00][CC FF 03 00 01 00][1B FF B4 00][A9 FF D0 07][9E FF][FC FF 28 00][1B FF 01 00]@Oooh... I was a little dizzy,[1B FF 0F 00] but[01 FF] now I'm okay.[02 FF]@...to get to Summers... we[01 FF] need to go back to Threed.[02 FF]@Yep, somehow I know that's[01 FF] where we must go...[1D FF][C6 FF][09 FF 2F 00][08 FF 30 00][08 FF 05 03][08 FF 8F 00][86 FF _L3558_][08 FF 18 02][00 FF]
^L5604^[09 FF 02 00][A6 FF 36 00 C4 01][A6 FF 37 00 C5 01][A6 FF 39 00 C6 01][A6 FF 38 00 C7 01][A6 FF 3A 00 C8 01]@Wow![1B FF 14 00] You guys did a lot while I[01 FF] was in the bathroom! Ha ha ha[01 FF] ha...[02 FF]@You want to get to Threed as[01 FF] soon as possible?[02 FF]@We can take you to Threed in[01 FF] our tour bus.[02 FF]@I'll get the bus and wait for you[01 FF] just outside the building...[02 FF][C6 FF][08 FF 3D 01][09 FF 3E 01][08 FF 02 00][9E FF][9D FF 01 33 _L4162_][00 FF]
^L5605^[09 FF 18 02][9D FF 01 04 _L5606_][08 FF 0B 00][00 FF]
^L5606^[86 FF _L3558_]^L9001^[FC FF 05 00][B0 FF C0 03 CB 00][1B FF 3C 00][B3 FF C0 03][A1 FF C0 03 C9 01][9E FF][A4 FF C0 03][C3 FF 01 02 C0 03][D8 FF 01 00 00 00][C3 FF 02 02 C0 03][D8 FF 02 00 00 00][C3 FF 03 02 C0 03][D8 FF 03 00 00 00]@Heh heh heh...[01 FF] There's no need to wait...[02 FF][C6 FF][A0 FF D0 07 CB 01 01 00][C9 FF D0 07][EB FF FF 00][A3 FF C0 03][9E FF][1B FF 3C 00][A5 FF D0 07 06 00][CA FF][A0 FF D3 07 04 03 01 00][A0 FF D0 07 CD 01 01 00][C9 FF D0 07][EB FF FF 00][9E FF][CB FF FF 00 06 00][09 FF 18 02][08 FF 17 02][C5 FF][EA FF FF 00][09 FF 3D 01][A1 FF C0 03 CE 01][9E FF]@All right... on to Threed![02 FF][C6 FF][A1 FF E2 03 CF 01][1B FF 3C 00][E6 FF E2 03][EB FF FF 00][6E FF 01 00][00 FF]
^L5606^[86 FF _L3558_]^L9001^[FC FF 05 00][B0 FF C0 03 CB 00][1B FF 3C 00][B3 FF C0 03][A1 FF C0 03 C9 01][9E FF][A4 FF C0 03][C3 FF 01 02 C0 03][D8 FF 01 00 00 00][C3 FF 02 02 C0 03][D8 FF 02 00 00 00][C3 FF 03 02 C0 03][D8 FF 03 00 00 00]@Heh heh heh...[01 FF] There's no need to wait...[02 FF][C6 FF][A0 FF D0 07 CB 01 01 00][C9 FF D0 07][EB FF FF 00][A3 FF C0 03][9E FF][1B FF 3C 00][A5 FF D0 07 06 00][CA FF]^L32000^[A0 FF D3 07 04 03 01 00][A0 FF D0 07 CD 01 01 00][C9 FF D0 07][EB FF FF 00][9E FF][CB FF FF 00 06 00][09 FF 18 02][08 FF 17 02][C5 FF][EA FF FF 00][09 FF 3D 01][A1 FF C0 03 CE 01][9E FF]@All right... on to Threed![02 FF][C6 FF][A1 FF E2 03 CF 01][1B FF 3C 00][E6 FF E2 03][EB FF FF 00][6E FF 01 00][00 FF]
^L5607^[9D FF 01 28 _L4238_][00 FF]
^L5608^[A2 FF _L5609_][00 FF]
^L5609^[EA FF FF 00][FC FF 05 00][8D FF 01 00][A4 FF EC 01][A4 FF ED 01][A4 FF EE 01][A4 FF EF 01][A4 FF F0 01][1B FF 1E 00][A3 FF EC 01][A3 FF ED 01][A3 FF EE 01][A3 FF EF 01][A3 FF F0 01][1B FF 0A 00][A4 FF EC 01][A4 FF ED 01][A4 FF EE 01][A4 FF EF 01][A4 FF F0 01][B2 FF 00 00 CC 00][1B FF 3C 00][B5 FF 00 00][A3 FF ED 01][A3 FF EE 01][A3 FF EF 01][A3 FF F0 01][6B FF 02 00][1B FF 0A 00][C4 FF 00 C1][A0 FF D0 07 8B 00 01 00][9E FF][1B FF 78 00]@(Oh,[1B FF 05 00] oh...[1B FF 14 00] you're losing[01 FF] consciousness...[02 FF]@What could be the fate of[01 FF] [0D FF] and his friend?)[1D FF][C6 FF][1B FF 01 00][86 FF _L2866_][86 FF _L2200_][08 FF 0B 00][CB FF FF 00 06 00][14 FF 10 00][A0 FF 25 01 8C 00 FF 00][A0 FF 26 01 8D 00 FF 00][EA FF FF 00][1B FF F0 00][A5 FF 25 01 06 00][CC FF 01 00 01 00][D8 FF 01 00 05 00][1B FF 1E 00][C3 FF 01 03 26 01][D8 FF 01 00 00 00][1B FF 14 00][A5 FF 26 01 06 00][A0 FF 01 00 0C 00 01 00][DA FF 01 00 07 00][1B FF 3C 00][A6 FF 01 00 15 00][9E FF][A5 FF 01 00 06 00][CC FF FF 00 01 00][EB FF FF 00][D8 FF 01 00 05 00][00 FF]

View File

@ -3601,7 +3601,7 @@
^L5603^[B2 FF 02 00 CC 00][1B FF 0F 00][C3 FF 01 01 02 00][D8 FF 01 00 00 00][C3 FF 03 01 02 00][D8 FF 03 00 00 00][1B FF 2D 00][6B FF 03 00][B5 FF 02 00][FC FF 27 00][1B FF 01 00][A0 FF D0 07 8E 00 01 00][9E FF][AA FF D0 07][CB FF 01 00 06 00][CB FF 03 00 06 00][1B FF B4 00]◆¨¨¨。[1D FF][C6 FF][1B FF 3C 00][CC FF 01 00 01 00][CC FF 03 00 01 00][1B FF B4 00][A9 FF D0 07][9E FF][FC FF 28 00][1B FF 01 00]◆ちょっと めまいがしただけよ。[01 FF] だいじょうぶ。[02 FF]◆¨¨サマ-ズに[01 FF] いくためには¨¨。[02 FF]◆スリ-クに[01 FF] もどるひつようがあるわ。[02 FF]◆いま つよく[01 FF] それを かんじたの。[1D FF][C6 FF][09 FF 2F 00][08 FF 30 00][08 FF 05 03][08 FF 8F 00][86 FF _L3558_][08 FF 18 02][00 FF]
^L5604^[09 FF 02 00][A6 FF 36 00 C4 01][A6 FF 37 00 C5 01][A6 FF 39 00 C6 01][A6 FF 38 00 C7 01][A6 FF 3A 00 C8 01][1B FF 1E 00]◆な-んだ[01 FF] トイレにいってるあいだに[01 FF] だいかつやく しやがって![02 FF]◆ハハハ[02 FF]◆なになに? [0E FF]ちゃん[01 FF] いまから スリ-クに[01 FF] いきたいって?[02 FF]◆OK![02 FF]◆おれたちの トラベリング・バスで[01 FF] スリ-クまで おくるぜ。[02 FF]◆ひとあしさきに[01 FF] くるまを まわしとく。[1B FF 14 00][01 FF] ビルの そとで まってるぜ![02 FF][C6 FF][08 FF 3D 01][09 FF 3E 01][08 FF 02 00][9E FF][9D FF 01 33 _L4162_][00 FF]
^L694^◆オ-ケ-![01 FF] ノリノリで バスにのれ![02 FF][C6 FF][00 FF]
^L5606^[86 FF _L3558_]^L9001^[FC FF 05 00][B0 FF C0 03 CB 00][1B FF 3C 00][B3 FF C0 03][A1 FF C0 03 C9 01][9E FF][A4 FF C0 03][C3 FF 01 02 C0 03][D8 FF 01 00 00 00][C3 FF 02 02 C0 03][D8 FF 02 00 00 00][C3 FF 03 02 C0 03][D8 FF 03 00 00 00]◆カッカッカッ[01 FF] えんりょは いらんわい![02 FF][C6 FF][A0 FF D0 07 CB 01 01 00][C9 FF D0 07][EB FF FF 00][A3 FF C0 03][9E FF][1B FF 3C 00][A5 FF D0 07 06 00][CA FF][A0 FF D3 07 04 03 01 00][A0 FF D0 07 CD 01 01 00][C9 FF D0 07][EB FF FF 00][9E FF][CB FF FF 00 06 00][09 FF 18 02][08 FF 17 02][C5 FF][EA FF FF 00][09 FF 3D 01][A1 FF C0 03 CE 01][9E FF]◆さあ スリ-クめざして[01 FF] しゅっぱつだ![02 FF][C6 FF][A1 FF E2 03 CF 01][1B FF 3C 00][E6 FF E2 03][EB FF FF 00][6E FF 01 00][00 FF]
^L5606^[86 FF _L3558_]^L9001^[FC FF 05 00][B0 FF C0 03 CB 00][1B FF 3C 00][B3 FF C0 03][A1 FF C0 03 C9 01][9E FF][A4 FF C0 03][C3 FF 01 02 C0 03][D8 FF 01 00 00 00][C3 FF 02 02 C0 03][D8 FF 02 00 00 00][C3 FF 03 02 C0 03][D8 FF 03 00 00 00]◆カッカッカッ[01 FF] えんりょは いらんわい![02 FF][C6 FF][A0 FF D0 07 CB 01 01 00][C9 FF D0 07][EB FF FF 00][A3 FF C0 03][9E FF][1B FF 3C 00][A5 FF D0 07 06 00][CA FF]^L32000^[A0 FF D3 07 04 03 01 00][A0 FF D0 07 CD 01 01 00][C9 FF D0 07][EB FF FF 00][9E FF][CB FF FF 00 06 00][09 FF 18 02][08 FF 17 02][C5 FF][EA FF FF 00][09 FF 3D 01][A1 FF C0 03 CE 01][9E FF]◆さあ スリ-クめざして[01 FF] しゅっぱつだ![02 FF][C6 FF][A1 FF E2 03 CF 01][1B FF 3C 00][E6 FF E2 03][EB FF FF 00][6E FF 01 00][00 FF]
^L1648^[CA FF][14 FF 2D 00][A0 FF 62 01 D0 01 FF 00][C9 FF 62 01][00 FF]
^L1636^[CA FF][14 FF 2E 00][A0 FF 62 01 D1 01 FF 00][C9 FF 62 01][00 FF]
^L1637^[CA FF][14 FF 2F 00][A0 FF 62 01 D2 01 FF 00][C9 FF 62 01][00 FF]
@ -4744,7 +4744,7 @@
^L5238^◆あれ ぜんぶは[01 FF] もてないみたいですね。[02 FF][78 FF 01 00 01 00]◆じゃ [90 FF 00][1A FF 02 00]だけ[01 FF] おわたししておきます。[02 FF][86 FF _L5240_][78 FF 02 00 01 00][77 FF 00 00][78 FF 03 00 01 00][82 FF _L5241_][77 FF 00 00]^L5241^[00 FF]
^L5239^◆あれ ぜんぶは[01 FF] もてないみたいですね。[02 FF][78 FF 01 00 01 00]◆じゃ [90 FF 00][1A FF 02 00]と[01 FF][78 FF 02 00 01 00] [90 FF 00][1A FF 02 00]だけ[01 FF] おわたししておきます。[02 FF][86 FF _L5240_][78 FF 03 00 01 00][77 FF 00 00][00 FF]
^L5235^◆あれ? おかね たりないですね。[01 FF] じゃ また よろしく。[86 FF _L4002_][C6 FF][86 FF _L4023_][86 FF _L4910_][00 FF]
^L2140^[86 FF _L4002_][09 FF B5 00][09 FF 85 02][86 FF _L4937_]◆もしも-し[01 FF] エスカルゴうんそうで-す。[1B FF 14 00][01 FF] (ハアハア)[02 FF]◆おたくさまが(ハアハア)[01 FF] おいでになるばしょが[1B FF 0F 00][01 FF] みつからなくて¨¨[02 FF]◆¨¨きっと へんなところに[01 FF] いるんでしょうねぇ。[1B FF 14 00][01 FF] (ハアハア)[02 FF]◆わたし もう まごころこめて[01 FF] ¨¨あきらめましたから。[1B FF 14 00][01 FF] かえります。(ハアハア)[02 FF]◆こういうことも[01 FF] たまには あるんですねぇ。[02 FF][86 FF _L4938_][86 FF _L4024_][00 FF]
^L2140^[86 FF _L4002_]^L32003^[09 FF B5 00][09 FF 85 02][86 FF _L4937_]◆もしも-し[01 FF] エスカルゴうんそうで-す。[1B FF 14 00][01 FF] (ハアハア)[02 FF]◆おたくさまが(ハアハア)[01 FF] おいでになるばしょが[1B FF 0F 00][01 FF] みつからなくて¨¨[02 FF]◆¨¨きっと へんなところに[01 FF] いるんでしょうねぇ。[1B FF 14 00][01 FF] (ハアハア)[02 FF]◆わたし もう まごころこめて[01 FF] ¨¨あきらめましたから。[1B FF 14 00][01 FF] かえります。(ハアハア)[02 FF]◆こういうことも[01 FF] たまには あるんですねぇ。[02 FF][86 FF _L4938_][86 FF _L4024_][00 FF]
^L5178^[D4 FF 0B 00]◆ガチャン ツ-ツ-ツ-。[1D FF][00 FF]
^L5240^[83 FF 49 00][BD FF 01 _L5223_][9C FF][D4 FF 76 00]◆ハイ たしかに。[01 FF] ありやと やんした-。[1D FF][C6 FF][86 FF _L4023_][86 FF _L4910_][00 FF]
^L5223^[BA FF 12 00 00 00][00 FF]