Implement special Japanese characters

This commit is contained in:
Lorenzooone 2023-02-02 03:53:25 +01:00
parent 284cc63b1a
commit b757cd5c0b
8 changed files with 76 additions and 28 deletions

View File

@ -32,6 +32,7 @@
#define MIN_WAITCYCLE 1
#define BASE_SCREEN 0
#define TRADE_CANCEL_SCREEN 1
#define INFO_SCREEN 3
void main_menu_init(struct game_data_t*, u8, u8, u8, u8*);
@ -207,11 +208,16 @@ void trade_options_init(u8 cursor_x_pos, u8* submenu_cursor_x_pos) {
}
void trade_menu_init(struct game_data_t* game_data, u8 target, u8 region, u8 master, u8 curr_gen, u8 own_menu, u8* cursor_y_pos, u8* cursor_x_pos) {
set_bg_pos(BASE_SCREEN, X_OFFSET_TRADE_MENU, Y_OFFSET_TRADE_MENU);
curr_state = TRADING_MENU;
*cursor_y_pos = 0;
*cursor_x_pos = 0;
prepare_options_trade(game_data, curr_gen, own_menu);
print_trade_menu(game_data, 1, curr_gen, 1, own_menu);
set_screen(TRADE_CANCEL_SCREEN);
print_trade_menu_cancel(1);
enable_screen(TRADE_CANCEL_SCREEN);
set_screen(BASE_SCREEN);
set_party_sprite_counter();
cursor_update_trading_menu(*cursor_y_pos, *cursor_x_pos);
check_bad_trade_received(game_data, target, region, master, curr_gen, own_menu, cursor_y_pos);
@ -224,6 +230,7 @@ void start_trade_init(struct game_data_t* game_data, u8 target, u8 region, u8 ma
load_comm_buffer(game_data, curr_gen, region);
init_start_state();
set_screen(BASE_SCREEN);
set_bg_pos(BASE_SCREEN, 0, 0);
print_start_trade();
disable_all_screens_but_current();
reset_sprites_to_cursor();
@ -239,6 +246,7 @@ void main_menu_init(struct game_data_t* game_data, u8 target, u8 region, u8 mast
curr_state = MAIN_MENU;
prepare_main_options(game_data);
set_screen(BASE_SCREEN);
set_bg_pos(BASE_SCREEN, 0, 0);
print_main_menu(1, target, region, master);
disable_all_screens_but_current();
reset_sprites_to_cursor();
@ -271,6 +279,10 @@ void return_to_trade_menu(struct game_data_t* game_data, u8 target, u8 region, u
disable_all_screens_but_current();
disable_all_cursors();
enable_all_valid_sprites();
set_screen(TRADE_CANCEL_SCREEN);
print_trade_menu_cancel(1);
enable_screen(TRADE_CANCEL_SCREEN);
set_screen(BASE_SCREEN);
cursor_update_trading_menu(*cursor_y_pos, *cursor_x_pos);
check_bad_trade_received(game_data, target, region, master, curr_gen, own_menu, cursor_y_pos);
prepare_flush();
@ -413,6 +425,10 @@ int main(void)
case TRADING_MENU:
returned_val = handle_input_trading_menu(&cursor_y_pos, &cursor_x_pos, keys, curr_gen, own_menu);
print_trade_menu(game_data, update, curr_gen, 0, own_menu);
set_screen(TRADE_CANCEL_SCREEN);
print_trade_menu_cancel(update);
enable_screen(TRADE_CANCEL_SCREEN);
set_screen(BASE_SCREEN);
cursor_update_trading_menu(cursor_y_pos, cursor_x_pos);
curr_mon = returned_val -1;

View File

@ -99,12 +99,21 @@ void print_trade_menu(struct game_data_t* game_data, u8 update, u8 curr_gen, u8
// I tried just using printf here with left padding, but it's EXTREMELY slow
PRINT_FUNCTION("\x01", get_pokemon_name_raw(mon));
if(load_sprites)
load_pokemon_sprite_raw(mon, BASE_Y_SPRITE_TRADE_MENU + (i*BASE_Y_SPRITE_INCREMENT_TRADE_MENU), (((X_TILES >> 1) << 3)*j) + BASE_X_SPRITE_TRADE_MENU);
load_pokemon_sprite_raw(mon, BASE_Y_SPRITE_TRADE_MENU + (i*BASE_Y_SPRITE_INCREMENT_TRADE_MENU), (((X_LIMIT >> 1) << 3)*j) + BASE_X_SPRITE_TRADE_MENU);
}
}
}
}
void print_trade_menu_cancel(u8 update) {
if(!update)
return;
reset_screen(BLANK_FILL);
set_text_y(Y_LIMIT-1);
PRINT_FUNCTION(" Cancel");
set_text_x(2);
PRINT_FUNCTION("Cancel");
}
void print_offer_screen(struct game_data_t* game_data, u8 own_mon, u8 other_mon) {

View File

@ -5,19 +5,9 @@
#include "gen3_save.h"
#include "multiboot_handler.h"
#define X_TILES 30
#define BASE_Y_SPRITE_TRADE_MENU 0
#define BASE_Y_SPRITE_INCREMENT_TRADE_MENU 24
#define BASE_X_SPRITE_TRADE_MENU 8
#define BASE_Y_SPRITE_INFO_PAGE 0
#define BASE_X_SPRITE_INFO_PAGE 0
#define BASE_Y_SPRITE_OFFER_MENU 0
#define BASE_X_SPRITE_OFFER_MENU 0
void print_game_info(struct game_data_t*, int);
void print_trade_menu(struct game_data_t*, u8, u8, u8, u8);
void print_trade_menu_cancel(u8);
void print_pokemon_pages(u8, u8, struct gen3_mon_data_unenc*, u8);
void print_main_menu(u8, u8, u8, u8);
void print_multiboot_mid_process(u8);

View File

@ -28,10 +28,6 @@
#define FONT_POS VRAM_START
#define JP_FONT_POS (FONT_POS + FONT_SIZE)
#define NUMBERS_POS (VRAM_END - (10000*2))
#define SCREEN_REAL_WIDTH 0x100
#define SCREEN_REAL_HEIGHT 0x100
#define X_SIZE (SCREEN_REAL_WIDTH>>3)
#define Y_SIZE (SCREEN_REAL_HEIGHT>>3)
#define X_OFFSET_POS 0
#define Y_OFFSET_POS 1
@ -244,6 +240,13 @@ u8 write_char(u16 character) {
return 0;
}
void write_above_char(u16 character) {
u8 y_pos_altered = y_pos-1;
if(!y_pos)
y_pos_altered = Y_SIZE-1;
screen[x_pos+(y_pos_altered*X_SIZE)] = character | (PALETTE << 12);
}
int sub_printf(u8* string) {
while((*string) != '\0')
if(write_char(*(string++)))
@ -254,7 +257,13 @@ int sub_printf_gen3(u8* string, u8 size_max, u8 is_jp) {
u8 curr_pos = 0;
while((*string) != GEN3_EOL) {
if(is_jp) {
if(write_char((*(string++))+FONT_TILES))
// TODO: Fix the above characters' positions, then remove the swaps
u8 character = *(string++);
if((character >= GEN3_FIRST_TICKS_START && character <= GEN3_FIRST_TICKS_END) || (character >= GEN3_SECOND_TICKS_START && character <= GEN3_SECOND_TICKS_END))
write_above_char((GENERIC_TICKS_CHAR+FONT_TILES)|VSWAP_TILE|HSWAP_TILE);
else if((character >= GEN3_FIRST_CIRCLE_START && character <= GEN3_FIRST_CIRCLE_END) || (character >= GEN3_SECOND_CIRCLE_START && character <= GEN3_SECOND_CIRCLE_END))
write_above_char((GENERIC_CIRCLE_CHAR+FONT_TILES)|VSWAP_TILE|HSWAP_TILE);
if(write_char(character+FONT_TILES))
return 0;
}
else if(write_char(text_gen3_to_general_int_bin[*(string++)]))

View File

@ -6,8 +6,10 @@
#define PRINT_FUNCTION fast_printf
#define X_LIMIT (SCREEN_WIDTH>>3)
#define Y_LIMIT (SCREEN_HEIGHT>>3)
#define X_SIZE 0x20
#define Y_SIZE 0x20
#define SCREEN_REAL_WIDTH 0x100
#define SCREEN_REAL_HEIGHT 0x100
#define X_SIZE (SCREEN_REAL_WIDTH>>3)
#define Y_SIZE (SCREEN_REAL_HEIGHT>>3)
#define PALETTE 0xF

View File

@ -11,6 +11,8 @@
#define OAM_ADDR 0x7000000
#define CPUFASTSET_FILL (0x1000000)
#define SPRITE_ALT_TILE_DISTANCE 0x10
#define DISABLE_SPRITE (1<<9)
#define OFF_SCREEN_SPRITE SCREEN_HEIGHT
@ -208,13 +210,12 @@ void reset_sprites_to_party(){
}
void move_sprites(u8 counter){
u8 counter_kind = counter & 8;
if(!(counter & 7)) {
for(int i = inner_cursor_sprite+1; i < __inner_sprite_counter; i++) {
u16 obj_attr_2 = *((u16*)(OAM_ADDR + (8*i) + 4));
if(obj_attr_2 & 0x10)
obj_attr_2 &= ~0x10;
else
obj_attr_2 |= 0x10;
u16 obj_attr_2 = (*((u16*)(OAM_ADDR + (8*i) + 4))) & ~SPRITE_ALT_TILE_DISTANCE;
if(counter_kind)
obj_attr_2 |= SPRITE_ALT_TILE_DISTANCE;
*((u16*)(OAM_ADDR + (8*i) + 4)) = obj_attr_2;
}
}

View File

@ -1,10 +1,18 @@
#ifndef SPRITE_HANDLER__
#define SPRITE_HANDLER__
#define BASE_Y_CURSOR_TRADING_MENU 16
#define BASE_X_CURSOR_TRADING_MENU 1
#define BASE_Y_SPRITE_INFO_PAGE 0
#define BASE_X_SPRITE_INFO_PAGE 0
#define X_OFFSET_TRADE_MENU 0
#define Y_OFFSET_TRADE_MENU -3
#define BASE_Y_CURSOR_TRADING_MENU (16 - Y_OFFSET_TRADE_MENU)
#define BASE_X_CURSOR_TRADING_MENU (1 - X_OFFSET_TRADE_MENU)
#define BASE_Y_CURSOR_INCREMENT_TRADING_MENU 24
#define BASE_X_CURSOR_INCREMENT_TRADING_MENU 120
#define BASE_Y_SPRITE_TRADE_MENU (0 - Y_OFFSET_TRADE_MENU)
#define BASE_Y_SPRITE_INCREMENT_TRADE_MENU 24
#define BASE_X_SPRITE_TRADE_MENU (8 - X_OFFSET_TRADE_MENU)
#define CURSOR_Y_POS_CANCEL 152
#define CURSOR_X_POS_CANCEL 2
@ -16,6 +24,8 @@
#define BASE_X_CURSOR_INCREMENT_TRADE_OPTIONS 120
#define BASE_Y_CURSOR_TRADE_OPTIONS 152
#define BASE_Y_SPRITE_OFFER_MENU 0
#define BASE_X_SPRITE_OFFER_MENU 0
#define BASE_X_CURSOR_OFFER_OPTIONS 10
#define BASE_Y_CURSOR_OFFER_OPTIONS 128
#define BASE_X_CURSOR_INCREMENT_OFFER_OPTIONS 64

View File

@ -7,6 +7,17 @@
#define GENERIC_F_GENDER 0x89
#define GENERIC_U_GENDER GENERIC_SPACE
#define GEN3_FIRST_TICKS_START 0x37
#define GEN3_FIRST_TICKS_END 0x4A
#define GEN3_FIRST_CIRCLE_START 0x4B
#define GEN3_FIRST_CIRCLE_END 0x4F
#define GEN3_SECOND_TICKS_START 0x87
#define GEN3_SECOND_TICKS_END 0x9A
#define GEN3_SECOND_CIRCLE_START 0x9B
#define GEN3_SECOND_CIRCLE_END 0x9F
#define GENERIC_TICKS_CHAR 0xFD
#define GENERIC_CIRCLE_CHAR 0xFE
#define GEN3_EOL 0xFF
#define GEN2_EOL 0x50
#define GENERIC_EOL 0
@ -48,4 +59,4 @@ void text_gen3_to_generic(u8*, u8*, u8, u8, u8, u8);
void text_gen3_to_gen12(u8*, u8*, u8, u8, u8, u8);
void text_gen12_to_gen3(u8*, u8*, u8, u8, u8, u8);
#endif
#endif