From 56e460a99e1726506490dbe3d99e6c3427253db5 Mon Sep 17 00:00:00 2001 From: Spencer Vaughn Date: Fri, 17 Nov 2023 21:55:56 -0600 Subject: [PATCH 1/6] added ui for no save file screen --- src/raylibhelper.c | 9 +++++---- src/screens/FileSelectScreen.c | 14 +++++++------- src/screens/SingleFileSelectScreen.c | 15 +++++++++------ 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/raylibhelper.c b/src/raylibhelper.c index ebb5133..d75bbd7 100644 --- a/src/raylibhelper.c +++ b/src/raylibhelper.c @@ -174,17 +174,18 @@ void update_selected_indexes_with_selection(int *selected_saves_index, int *mous void draw_no_save_files(char *save_path) { - ClearBackground(RAYWHITE); + ClearBackground(RED); + DrawRectangle(20, 150, SCREEN_WIDTH - 40, SCREEN_HEIGHT - 300, (Color){0,0,0,50}); if (no_dir_err) { Vector2 text_center = SCREEN_CENTER("Save folder doesn't exist!", 20); - DrawText("Save folder doesn't exist!", text_center.x, text_center.y, 20, BLACK); + shadow_text("Save folder doesn't exist!", text_center.x, text_center.y, 20, WHITE); } else { - DrawText("No save files found in save folder", 190, 200, 20, BLACK); + shadow_text("No save files found in save folder", 190, 200, 20, WHITE); } - DrawText(TextFormat("%s", save_path), SCREEN_CENTER(save_path, 20).x, 275, 20, BLACK); + shadow_text(TextFormat("%s", save_path), SCREEN_CENTER(save_path, 20).x, 275, 20, WHITE); } void draw_top_banner(const char *text, const int *banner_position_offset) diff --git a/src/screens/FileSelectScreen.c b/src/screens/FileSelectScreen.c index 26523a5..d645d36 100644 --- a/src/screens/FileSelectScreen.c +++ b/src/screens/FileSelectScreen.c @@ -101,15 +101,15 @@ void draw_file_select(struct save_file_data *save_file_data, char *player1_save_ } handle_list_scroll(&y_offset, save_file_data->num_saves, corrupted_count, &mouses_down_index, &is_moving_scroll, &banner_position_offset); + } - // Top Banner - draw_top_banner("Select two save files to trade between", &banner_position_offset); + // Top Banner + draw_top_banner("Select two save files to trade between", &banner_position_offset); - // Bottom bar - DrawRectangleRec(bottom_bar_rec, WHITE); - DrawLineEx((Vector2){bottom_bar_rec.x, bottom_bar_rec.y}, (Vector2){bottom_bar_rec.width, bottom_bar_rec.y}, 15, BLACK); - DrawText("Trade >", trade_button_rec.x + 15, trade_button_rec.y + 10, 20, has_selected_two_saves ? ui_selection == E_UI_TRADE ? LIGHTGRAY : BLACK : LIGHTGRAY); - } + // Bottom bar + DrawRectangleRec(bottom_bar_rec, WHITE); + DrawLineEx((Vector2){bottom_bar_rec.x, bottom_bar_rec.y}, (Vector2){bottom_bar_rec.width, bottom_bar_rec.y}, 15, BLACK); + DrawText("Trade >", trade_button_rec.x + 15, trade_button_rec.y + 10, 20, has_selected_two_saves ? ui_selection == E_UI_TRADE ? LIGHTGRAY : BLACK : LIGHTGRAY); // Back button const Rectangle back_button_rec = (Rectangle){BACK_BUTTON_X - 15, BACK_BUTTON_Y + 8, BUTTON_WIDTH, BUTTON_HEIGHT}; diff --git a/src/screens/SingleFileSelectScreen.c b/src/screens/SingleFileSelectScreen.c index 9b6208d..f0b4095 100644 --- a/src/screens/SingleFileSelectScreen.c +++ b/src/screens/SingleFileSelectScreen.c @@ -98,13 +98,16 @@ void draw_file_select_single(struct save_file_data *save_file_data, PokemonSave } handle_list_scroll(&y_offset, save_file_data->num_saves, corrupted_count, &mouses_down_index, &is_moving_scroll, &banner_position_offset); - - draw_top_banner("Select a save file to access your party", &banner_position_offset); - // Bottom bar - DrawRectangleRec(bottom_bar_rec, WHITE); - DrawLineEx((Vector2){bottom_bar_rec.x, bottom_bar_rec.y}, (Vector2){bottom_bar_rec.width, bottom_bar_rec.y}, 15, BLACK); - DrawText("Evolve >", evolve_button_rec.x + 15, evolve_button_rec.y + 10, 20, has_selected_save ? ui_selection == E_UI_EVOLVE ? LIGHTGRAY : BLACK : LIGHTGRAY); } + + // Top Banner + draw_top_banner("Select a save file to access your party", &banner_position_offset); + + // Bottom bar + DrawRectangleRec(bottom_bar_rec, WHITE); + DrawLineEx((Vector2){bottom_bar_rec.x, bottom_bar_rec.y}, (Vector2){bottom_bar_rec.width, bottom_bar_rec.y}, 15, BLACK); + DrawText("Evolve >", evolve_button_rec.x + 15, evolve_button_rec.y + 10, 20, has_selected_save ? ui_selection == E_UI_EVOLVE ? LIGHTGRAY : BLACK : LIGHTGRAY); + // Back button const Rectangle back_button_rec = (Rectangle){BACK_BUTTON_X - 15, BACK_BUTTON_Y + 8, BUTTON_WIDTH, BUTTON_HEIGHT}; DrawText("< Back", back_button_rec.x + 15, back_button_rec.y + 10, 20, ui_selection == E_UI_BACK ? LIGHTGRAY : BLACK); From ff77a6f9f16bcd79e14ceae1679c5061494ccc75 Mon Sep 17 00:00:00 2001 From: Spencer Vaughn Date: Sat, 18 Nov 2023 17:03:13 -0600 Subject: [PATCH 2/6] added evolve ui --- .DS_Store | Bin 14340 -> 14340 bytes include/pksavhelper.h | 1 + include/raylibhelper.h | 2 +- saves/Pokemon - Blue Evolve.sav | Bin 0 -> 32768 bytes saves/Pokemon - Crystal Evolve.sav | Bin 0 -> 32768 bytes src/pksavhelper.c | 8 +- src/raylibhelper.c | 2 +- src/screens/EvolveScreen.c | 223 +++++++++++++++++++++++------ src/screens/TradeScreen.c | 8 +- 9 files changed, 193 insertions(+), 51 deletions(-) create mode 100644 saves/Pokemon - Blue Evolve.sav create mode 100644 saves/Pokemon - Crystal Evolve.sav diff --git a/.DS_Store b/.DS_Store index 67fc44683334f482351ca959b3044434ba1352ad..26a527a6536527c6419ba8acabfa7f7e3c4178d2 100644 GIT binary patch delta 58 zcmV-A0LA}=aD;G>PXQ~jP`eKS6_X4Q8?#*ynE?nkI58|BG&eP~{t*ohk$^U{3n1PI QvmY7k29ba=vj;H!2Oen>;s5{u delta 88 zcmZoEXepTBF8U^hRb*km37X>o3bOon8Je1<%Rc!qR_R3NR#P|T1qSwcZ^v!=jw rMh;UWGaUs}1B1!2iqezirBybw3!UTL%&l;bWAkPSIrh!$27lQB<6IXV diff --git a/include/pksavhelper.h b/include/pksavhelper.h index 068a9de..607d0ce 100644 --- a/include/pksavhelper.h +++ b/include/pksavhelper.h @@ -91,6 +91,7 @@ enum eligible_evolution_status check_trade_evolution_gen2(PokemonSave *pkmn_save void evolve_party_pokemon_at_index(PokemonSave *pkmn_save, uint8_t pkmn_party_index); void generate_random_number_step(void); void update_pkmn_DVs(PokemonSave *pkmn_save, uint8_t pkmn_party_index); +void update_pkmn_stats(PokemonSave *pkmn_save, uint8_t pkmn_party_index); bool get_is_random_DVs_disabled(void); void set_is_random_DVs_disabled(bool is_disabled); bool get_is_item_required(void); diff --git a/include/raylibhelper.h b/include/raylibhelper.h index a879700..b927197 100644 --- a/include/raylibhelper.h +++ b/include/raylibhelper.h @@ -37,7 +37,7 @@ void draw_file_select(struct save_file_data *save_file_data, char *player1_save_ void draw_trade(PokemonSave *save_player1, PokemonSave *save_player2, char *player1_save_path, char *player2_save_path, struct TrainerSelection trainer_selection[2], struct trainer_info *trainer1, struct trainer_info *trainer2, bool *is_same_generation, GameScreen *current_screen, Texture2D *trade_texture); void draw_file_select_single(struct save_file_data *save_file_data, PokemonSave *save_player1, char *player1_save_path, struct trainer_info *trainer1, struct TrainerSelection *trainer_selection, enum single_player_menu_types menu_type, GameScreen *current_screen); void draw_bills_pc(PokemonSave *pkmn_save, char *save_path, struct trainer_info *trainer, struct TrainerSelection *trainerSelection, GameScreen *current_screen); -void draw_evolve(PokemonSave *pkmn_save, char *save_path, struct trainer_info *trainer, GameScreen *current_screen); +void draw_evolve(PokemonSave *pkmn_save, char *save_path, struct trainer_info *trainer, GameScreen *current_screen, Texture2D *evolve_texture); void handle_list_scroll(int *y_offset, const int num_saves, const int corrupted_count, int *mouses_down_index, bool *is_moving_scroll, int *banner_position_offset); void update_selected_indexes_with_selection(int *selected_saves_index, int *mouses_down_index, bool *is_moving_scroll); void draw_no_save_files(char *save_path); diff --git a/saves/Pokemon - Blue Evolve.sav b/saves/Pokemon - Blue Evolve.sav new file mode 100644 index 0000000000000000000000000000000000000000..4111f3f18a387f04abc12fdcdcf7358ef0244cbe GIT binary patch literal 32768 zcmeI&Uq~EB90%~d_;noDE4>?tWy*s}N8G1$O4Z{_Fs*zJk7WHj#Y zDGdxIj-EPvbNPaaR63QOPR6DmrSF#e2ktkGhr{6q_ii;Fe_THh4=j7r`ApLcwpWB7 zc7)=0Mh~7&gyu6=PME1c%omRy2_#mI-P{q3$r6)fMOSrIQ)NY@B_@6xCToS7%jMA= zjOh;9<#Coci)@O{XzO1$&jpPa^KZnsSAZsWN)jes%q zTOxThc`AAMmz&>Oty$w{CW0wn+L>~ujcFsfJ9ct<%OiKX;_ip#Klx_{KDocAY2Wx? z;q7Ao{K46K4Y$rV^5cV#9rfJ9EwXZzQU5O{g+s%&RH-55W_S?>7=p z?oW@~?XNwlndDD{?n%3yp8P(}-ws}%uz9DewoY(5z{ee4gX9TGDcq$O?3H)!d!0UR z6ctOlOk7upJBq2+R!lGHKB}vgrTSI2@)-zoxtM2rv8TMORDXV{?ie~YA$?nib;#F{IAY)YwNDj z4bk&_Jkt=D=jj)uGRcw5z~8uJ?HjjgLT*_0D}H5I^~=rDusW>tdfi%T;x%=S`{NC}Dq zeO)7QdTO0h_TUtgtj{`|J&O5_wvl+rDn9E?OD`_U&mXpP&yW>uZ5!=8+p6r*np+G* z)j7SFxgcfEZACNLZ0o~9!#y9SlQr%=KxR$=wRyfSdM0O;w-2h2J0#QE_oy zMOEGyAH7&vZjEsd*~k!|YwlrkTRq`(u?xNfzOS-kWf4%2i8dTmB+lhu>ngJK+HwYe zd{DFX literal 0 HcmV?d00001 diff --git a/saves/Pokemon - Crystal Evolve.sav b/saves/Pokemon - Crystal Evolve.sav new file mode 100644 index 0000000000000000000000000000000000000000..aa72860acaa55380538437b8a5fde74097cf0ba5 GIT binary patch literal 32768 zcmeHPU2GIp6h3!ncBkEL_oqk#wRBq`7NXQbP*TM1R*l32;$UJ3i4l|sLlx6#Bu0!o zZijYZ+by#j%lcprwr+jA zqpu(B$;pO_a>F+nDYqxT>FaMh3@MZZ#8KLyic*0xN(p^MVJx6Dgk$ZUZR>mXz~JEM zWLSF_TQ$+xv*%C|$ z1WG&+Pbd-`XQ{0yy{WZ)9lun9s#Yyli@eCc=I8h|{wGhNSpJc?!l$_%UBoYor*q)% z)ub;aq&?A|2*=IDI2A&G5Fi9Rf`GYb(S;Bo1PB2_U?n1eud7S7=T2{r)Vl+3ZUW~ld=j+^TWIoWcskAz5=!QNd zZu*!yTDu81?A-X+HVB6OVwchIJZEEft57*^I}x$?#9pKXQ4~lfg%`}8 z>g@EbQPAeH-|`D6LSj8pti%{IB`Ix0KQ`kR3JQsxPNIj?Z?ha~1n}`tEuKFpB-U}W z-wxIjz^)w7PxM#(LSo6uo8qBK5D>1XN$K0||TZEV`BGz;ABS9>iHd%qK z>Hj=~<3U3M_K;QkKd!9BcXN{SMH3LzFU&u0ka_#mkF>bj6ASBxr`>ZGl7)5mn)h!V zkc43UtQ+cA-@Z1gVY^tgv7EMUcl~N^KK4^OpnPed_i}XG+Lzarf93q#z_;xWK>Dev z3qdF=&~xoFbZE9Syq`NWr3wp`imhC?mA`G}A6u!~$_-nYwiRwGQ`dwhBAcOwVuluq z8Cob-XfqEPqz?z+lL7d2K>ln1UONIukKood10yt4ojaS^X8{*!e%}MwWQJz){7$u& z?vG5RgqgM0Lbgh*)gO?+A5i2F$gu|=N5qT!vGhc3%0|9 z&=0$={;&ZTuf1@BiA{JlN(h>v38gs*o%<~R`yJ5|!vAR)l0^y;lmIA}G{dG_{mU1H z|89rBf;}4WClG~B3?cG4G#meFWdj+fBxf!c9H*Fe={G)8`xsik<6)_ktt}Zn$`-sF`m&?Rh`iFp{!6; zbv!dPtQSo+ua6ZBy&!Z$D-<-*Ni`?%EEqFd{=OO2QgC;1*4XU=1G8u{w%>V5+3qX! zUfUC$H-D?tDg_KJJ3eB8J-eZkc5e}QvM;r-bZ=8w?x!Q+A^u1F&l}4x@jv2!iwzc7SFWMqH%l)C)y=PoDz zv;0Ly$N(2h`eqOA^XXz?L^qIFsN=b8W@02`WK}hv%}tEwPU$MBxv|U{i*}%cQ5?>V z3E#Y~4H=rKx7u!9E-Zc*#gn2W9!ki->hixRJTcQw{0~ud62F>7{BOBA&VPPh@6Hrk zUC(xs+8gwi1dyovy=Cte*n%9{{y9|E+VxNl4-BSOHd2+(@s z)sdsT2?6&ZK{>LLKD+&QRU-#-~k@6-4+=c+XZ@O(nC?7(=y9m&F z;@z>M%n1RvAwcVi+eU=)Aq2dO0Iet99XraL5O5m;w4S(aL?|CZz`F?0dg9%&qs$2b Qw;@2^|F5Vo|M8dk7mz#^+W-In literal 0 HcmV?d00001 diff --git a/src/pksavhelper.c b/src/pksavhelper.c index fd63f0e..0a5bf25 100644 --- a/src/pksavhelper.c +++ b/src/pksavhelper.c @@ -52,11 +52,8 @@ pksavhelper_error update_seen_owned_pkmn(PokemonSave *pkmn_save, uint8_t pokemon error_handler(pksav_error, "Error setting owned pokedex bit"); } } - if (pksav_error != PKSAV_ERROR_NONE) - { - return error_update_pokedex; - } - return error_none; + + return pksav_error == PKSAV_ERROR_NONE ? error_none : error_update_pokedex; } void swap_party_pkmn_at_indices(struct pksav_gen2_save *save, uint8_t pkmn_party_index1, uint8_t pkmn_party_index2) @@ -362,6 +359,7 @@ void update_pkmn_stats(PokemonSave *pkmn_save, uint8_t pkmn_party_index) pkmn_save->save.gen1_save.pokemon_storage.p_party->party[pkmn_party_index].party_data.spd = pksav_bigendian16(pkmn_stats[PKSAV_GEN1_STAT_SPEED]); pkmn_save->save.gen1_save.pokemon_storage.p_party->party[pkmn_party_index].party_data.spcl = pksav_bigendian16(pkmn_stats[PKSAV_GEN1_STAT_SPECIAL]); pkmn_save->save.gen1_save.pokemon_storage.p_party->party[pkmn_party_index].party_data.max_hp = pksav_bigendian16(pkmn_stats[PKSAV_GEN1_STAT_HP]); + pkmn_save->save.gen1_save.pokemon_storage.p_party->party[pkmn_party_index].pc_data.current_hp = pkmn_save->save.gen1_save.pokemon_storage.p_party->party[pkmn_party_index].party_data.max_hp; } else { diff --git a/src/raylibhelper.c b/src/raylibhelper.c index d75bbd7..4e4527b 100644 --- a/src/raylibhelper.c +++ b/src/raylibhelper.c @@ -308,7 +308,7 @@ void draw_raylib_screen_loop( draw_file_select_single(save_file_data, pkmn_save_player1, player1_save_path, trainer1, &trainerSelection[0], SINGLE_PLAYER_MENU_TYPE_EVOLVE, ¤t_screen); break; case SCREEN_EVOLVE: - draw_evolve(pkmn_save_player1, player1_save_path, trainer1, ¤t_screen); + draw_evolve(pkmn_save_player1, player1_save_path, trainer1, ¤t_screen, &textures[T_EVOLVE]); break; case SCREEN_ABOUT: draw_about(¤t_screen, is_build_prerelease); diff --git a/src/screens/EvolveScreen.c b/src/screens/EvolveScreen.c index 3ed7e23..8591fde 100644 --- a/src/screens/EvolveScreen.c +++ b/src/screens/EvolveScreen.c @@ -1,11 +1,67 @@ #include "raylibhelper.h" #include "pksavfilehelper.h" -void draw_evolve(PokemonSave *pkmn_save, char *save_path, struct trainer_info *trainer, GameScreen *current_screen) +void _debug__generate_evolve_pkmn_gen1(PokemonSave *pkmn_save, char *save_path, struct trainer_info *trainer) { - SaveGenerationType save_generation_type = pkmn_save->save_generation_type; - static enum ui_selections + pkmn_save->save.gen1_save.pokemon_storage.p_party->species[0] = SI_KADABRA; + pkmn_save->save.gen1_save.pokemon_storage.p_party->species[1] = SI_MACHOKE; + pkmn_save->save.gen1_save.pokemon_storage.p_party->species[2] = SI_GRAVELER; + pkmn_save->save.gen1_save.pokemon_storage.p_party->species[3] = SI_HAUNTER; + + pksav_gen1_export_text("KADABRA", pkmn_save->save.gen1_save.pokemon_storage.p_party->nicknames[0], PKMN_NAME_TEXT_MAX); + pkmn_save->save.gen1_save.pokemon_storage.p_party->nicknames[0][strlen("KADABRA")] = 0x50; + pksav_gen1_export_text("MACHOKE", pkmn_save->save.gen1_save.pokemon_storage.p_party->nicknames[1], PKMN_NAME_TEXT_MAX); + pkmn_save->save.gen1_save.pokemon_storage.p_party->nicknames[1][strlen("MACHOKE")] = 0x50; + pksav_gen1_export_text("GRAVELER", pkmn_save->save.gen1_save.pokemon_storage.p_party->nicknames[2], PKMN_NAME_TEXT_MAX); + pkmn_save->save.gen1_save.pokemon_storage.p_party->nicknames[2][strlen("GRAVELER")] = 0x50; + pksav_gen1_export_text("HAUNTER", pkmn_save->save.gen1_save.pokemon_storage.p_party->nicknames[3], PKMN_NAME_TEXT_MAX); + pkmn_save->save.gen1_save.pokemon_storage.p_party->nicknames[3][strlen("HAUNTER")] = 0x50; + + for (int i = 0; i < 4; i++) + { + update_pkmn_DVs(pkmn_save, i); + update_pkmn_stats(pkmn_save, i); + update_seen_owned_pkmn(pkmn_save, i); + } + save_savefile_to_path(pkmn_save, save_path); + create_trainer(pkmn_save, trainer); +} +void _debug__generate_evolve_pkmn_gen2(PokemonSave *pkmn_save, char *save_path, struct trainer_info *trainer) +{ + pkmn_save->save.gen2_save.pokemon_storage.p_party->species[0] = SCYTHER; + pkmn_save->save.gen2_save.pokemon_storage.p_party->species[1] = POLIWHIRL; + pkmn_save->save.gen2_save.pokemon_storage.p_party->species[2] = SLOWPOKE; + pkmn_save->save.gen2_save.pokemon_storage.p_party->species[3] = ONIX; + pkmn_save->save.gen2_save.pokemon_storage.p_party->species[4] = PORYGON; + pkmn_save->save.gen2_save.pokemon_storage.p_party->species[5] = SEADRA; + + pksav_gen2_export_text("SCYTHER", pkmn_save->save.gen2_save.pokemon_storage.p_party->nicknames[0], PKMN_NAME_TEXT_MAX); + pkmn_save->save.gen2_save.pokemon_storage.p_party->nicknames[0][strlen("SCYTHER")] = 0x50; + pksav_gen2_export_text("POLIWHIRL", pkmn_save->save.gen2_save.pokemon_storage.p_party->nicknames[1], PKMN_NAME_TEXT_MAX); + pkmn_save->save.gen2_save.pokemon_storage.p_party->nicknames[1][strlen("POLIWHIRL")] = 0x50; + pksav_gen2_export_text("SLOWPOKE", pkmn_save->save.gen2_save.pokemon_storage.p_party->nicknames[2], PKMN_NAME_TEXT_MAX); + pkmn_save->save.gen2_save.pokemon_storage.p_party->nicknames[2][strlen("SLOWPOKE")] = 0x50; + pksav_gen2_export_text("ONIX", pkmn_save->save.gen2_save.pokemon_storage.p_party->nicknames[3], PKMN_NAME_TEXT_MAX); + pkmn_save->save.gen2_save.pokemon_storage.p_party->nicknames[3][strlen("ONIX")] = 0x50; + pksav_gen2_export_text("PORYGON", pkmn_save->save.gen2_save.pokemon_storage.p_party->nicknames[4], PKMN_NAME_TEXT_MAX); + pkmn_save->save.gen2_save.pokemon_storage.p_party->nicknames[4][strlen("PORYGON")] = 0x50; + pksav_gen2_export_text("SEADRA", pkmn_save->save.gen2_save.pokemon_storage.p_party->nicknames[5], PKMN_NAME_TEXT_MAX); + pkmn_save->save.gen2_save.pokemon_storage.p_party->nicknames[5][strlen("SEADRA")] = 0x50; + + for (int i = 0; i < 6; i++) { + update_pkmn_DVs(pkmn_save, i); + update_pkmn_stats(pkmn_save, i); + update_seen_owned_pkmn(pkmn_save, i); + } + save_savefile_to_path(pkmn_save, save_path); + create_trainer(pkmn_save, trainer); +} + +void draw_evolve(PokemonSave *pkmn_save, char *save_path, struct trainer_info *trainer, GameScreen *current_screen, Texture2D *evolve_texture) +{ + SaveGenerationType save_generation_type = pkmn_save->save_generation_type; + static enum ui_selections { E_UI_NONE = -1, E_UI_BACK, E_UI_EVOLVE @@ -15,52 +71,70 @@ void draw_evolve(PokemonSave *pkmn_save, char *save_path, struct trainer_info *t generate_rand_num_step(save_generation_type); BeginDrawing(); - ClearBackground(RAYWHITE); - DrawText("Trade Evolve", 50, 50, 20, BLACK); + ClearBackground(RED); + draw_background_grid(); + DrawTextureEx(*evolve_texture, (Vector2){50, 10}, 0, 0.4, WHITE); - int party_count = 0; const int NONE = -1; static int selected_index = NONE; - static int result = 0; + static enum eligible_trade_status trade_eligible = E_EVO_STATUS_ELIGIBLE; char pokemon_nickname[PKMN_NAME_TEXT_MAX + 1] = "\0"; int eligible_pokemon_count = 0; const int TRAINER_NAME_X = 50; - const int TRAINER_NAME_Y = 100; + const int TRAINER_NAME_Y = 115; + static bool is_trade_eligible = false; + int party_count = 0; if (save_generation_type == SAVE_GENERATION_1) party_count = pkmn_save->save.gen1_save.pokemon_storage.p_party->count; else if (save_generation_type == SAVE_GENERATION_2) party_count = pkmn_save->save.gen2_save.pokemon_storage.p_party->count; + + // Details Panel Rectangle + Rectangle container_rec; + container_rec.x = TRAINER_NAME_X - 3; + container_rec.y = TRAINER_NAME_Y - 10; + container_rec.width = 200; + container_rec.height = 300; + + // Draw rectangle with transparent background blue + DrawRectangleRec(container_rec, (Color){0, 100, 255, 158}); + + // draw border + DrawRectangleLinesEx((Rectangle){container_rec.x - 4, container_rec.y - 4, container_rec.width + 8, container_rec.height + 8}, 1, BLACK); + DrawRectangleLinesEx((Rectangle){container_rec.x - 3, container_rec.y - 3, container_rec.width + 6, container_rec.height + 6}, 3, WHITE); + DrawRectangleLinesEx((Rectangle){container_rec.x, container_rec.y, container_rec.width, container_rec.height}, 1, BLACK); + // Create the trainer name and id strings for Raylib drawing char trainer_name[15] = "\0"; create_trainer_name_str(trainer, trainer_name); char trainer_id[11] = "\0"; create_trainer_id_str(trainer, trainer_id); - DrawText(trainer_name, TRAINER_NAME_X, TRAINER_NAME_Y, 20, BLACK); - DrawText(trainer_id, TRAINER_NAME_X, TRAINER_NAME_Y + 25, 20, BLACK); + shadow_text(trainer_name, TRAINER_NAME_X + 10, TRAINER_NAME_Y, 20, WHITE); + shadow_text(trainer_id, TRAINER_NAME_X + 10, TRAINER_NAME_Y + 25, 20, WHITE); // Search party for pkmn eligible for trade evolution for (int i = 0; i < party_count; i++) { if (save_generation_type == SAVE_GENERATION_1) { - result = check_trade_evolution_gen1(pkmn_save, i); + trade_eligible = check_trade_evolution_gen1(pkmn_save, i); eligible_pokemon_count++; pksav_gen1_import_text(pkmn_save->save.gen1_save.pokemon_storage.p_party->nicknames[i], pokemon_nickname, PKMN_NAME_TEXT_MAX); - draw_pkmn_button((Rectangle){TRAINER_NAME_X, TRAINER_NAME_Y + 75 + (i * 30), 200, 30}, i, pokemon_nickname, selected_index == i || result == E_EVO_STATUS_NOT_ELIGIBLE); + draw_pkmn_button((Rectangle){TRAINER_NAME_X, TRAINER_NAME_Y + 75 + (i * 30), 200, 30}, i, pokemon_nickname, selected_index == i || trade_eligible == E_EVO_STATUS_NOT_ELIGIBLE); } else if (save_generation_type == SAVE_GENERATION_2) { - result = check_trade_evolution_gen2(pkmn_save, i); + trade_eligible = check_trade_evolution_gen2(pkmn_save, i); eligible_pokemon_count++; pksav_gen2_import_text(pkmn_save->save.gen2_save.pokemon_storage.p_party->nicknames[i], pokemon_nickname, PKMN_NAME_TEXT_MAX); - draw_pkmn_button((Rectangle){TRAINER_NAME_X, TRAINER_NAME_Y + 75 + (i * 30), MeasureText(pokemon_nickname, 20) + 10, 30}, i, pokemon_nickname, selected_index == i || result == E_EVO_STATUS_NOT_ELIGIBLE); - if (result == E_EVO_STATUS_MISSING_ITEM) - DrawText("Missing required item!", 75 + MeasureText(pokemon_nickname, 20), TRAINER_NAME_Y + 75 + (i * 30), 20, RED); + draw_pkmn_button((Rectangle){TRAINER_NAME_X, TRAINER_NAME_Y + 75 + (i * 30), MeasureText(pokemon_nickname, 20) + 10, 30}, i, pokemon_nickname, selected_index == i || trade_eligible == E_EVO_STATUS_NOT_ELIGIBLE); + if (trade_eligible == E_EVO_STATUS_MISSING_ITEM) + shadow_text("Missing required item!", 75 + MeasureText(pokemon_nickname, 20), TRAINER_NAME_Y + 75 + (i * 30), 20, RED); } // Selected pokemon button - if (CheckCollisionPointRec(GetMousePosition(), (Rectangle){TRAINER_NAME_X, TRAINER_NAME_Y + 75 + (i * 30), 200, 30}) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON) && result == E_EVO_STATUS_ELIGIBLE) + if (CheckCollisionPointRec(GetMousePosition(), (Rectangle){TRAINER_NAME_X, TRAINER_NAME_Y + 75 + (i * 30), 200, 30}) && IsMouseButtonPressed(MOUSE_LEFT_BUTTON)) { // Unselect if already selected if (selected_index == i) @@ -71,40 +145,108 @@ void draw_evolve(PokemonSave *pkmn_save, char *save_path, struct trainer_info *t else { selected_index = i; + if (save_generation_type == SAVE_GENERATION_1) + is_trade_eligible = check_trade_evolution_gen1(pkmn_save, selected_index); + else if (save_generation_type == SAVE_GENERATION_2) + is_trade_eligible = check_trade_evolution_gen2(pkmn_save, selected_index); } } } - // Draw selected nickname to the right of the screen - char selected_nickname[PKMN_NAME_TEXT_MAX + 1] = "\0"; - if (save_generation_type == SAVE_GENERATION_1 && selected_index != NONE) - { - pksav_gen1_import_text(pkmn_save->save.gen1_save.pokemon_storage.p_party->nicknames[selected_index], selected_nickname, PKMN_NAME_TEXT_MAX); - } - else if (save_generation_type == SAVE_GENERATION_2 && selected_index != NONE) - { - pksav_gen2_import_text(pkmn_save->save.gen2_save.pokemon_storage.p_party->nicknames[selected_index], selected_nickname, PKMN_NAME_TEXT_MAX); - } - if (selected_index != NONE) - DrawText(selected_nickname, NEXT_BUTTON_X, SCREEN_HEIGHT_TEXT_CENTER(20), 20, BLACK); + const int x_offset = SCREEN_WIDTH - 400; - // No eligible pokemon message - if (eligible_pokemon_count == 0) + int text_pos_x = container_rec.x + x_offset + 70; + int warn_text_pos_x = container_rec.x + x_offset + 30; + int stat_text_pos_x = container_rec.x + x_offset + 150; + int dv_text_pos_x = container_rec.x + x_offset + 210; + + // Draw the selected pokemon nickname + if (selected_index != NONE) { - const char *no_pkmn = "No pokemon eligible for trade evolution"; - Vector2 text_center = SCREEN_CENTER(no_pkmn, 20); - DrawText(no_pkmn, text_center.x, text_center.y, 20, BLACK); + DrawRectangle(container_rec.x + x_offset, container_rec.y - 10, container_rec.width * 1.5, container_rec.height, (Color){0, 0, 0, 75}); + + // Name of the pokemon selected from list + static char selected_pokemon_nickname[PKMN_NAME_TEXT_MAX + 1] = "\0"; + if (pkmn_save->save_generation_type == SAVE_GENERATION_1) + { + pksav_gen1_import_text(pkmn_save->save.gen1_save.pokemon_storage.p_party->nicknames[selected_index], selected_pokemon_nickname, PKMN_NAME_TEXT_MAX); + struct pksav_gen1_party_pokemon party_pkmn = pkmn_save->save.gen1_save.pokemon_storage.p_party->party[selected_index]; + // Draw level + shadow_text(TextFormat("Level %u", party_pkmn.party_data.level), text_pos_x, container_rec.y + 40, 20, WHITE); + shadow_text("Stats", stat_text_pos_x - 15, container_rec.y + 70, 20, WHITE); + shadow_text("DVs", dv_text_pos_x, container_rec.y + 70, 20, WHITE); + // Draw stats + shadow_text("HP:", text_pos_x, container_rec.y + 100, 20, WHITE); + shadow_text(TextFormat("%d", pksav_bigendian16(party_pkmn.party_data.max_hp)), stat_text_pos_x, container_rec.y + 100, 20, WHITE); + shadow_text("Atk:", text_pos_x, container_rec.y + 130, 20, WHITE); + shadow_text(TextFormat("%d", pksav_bigendian16(party_pkmn.party_data.atk)), stat_text_pos_x, container_rec.y + 130, 20, WHITE); + shadow_text("Def:", text_pos_x, container_rec.y + 160, 20, WHITE); + shadow_text(TextFormat("%d", pksav_bigendian16(party_pkmn.party_data.def)), stat_text_pos_x, container_rec.y + 160, 20, WHITE); + shadow_text("Spd:", text_pos_x, container_rec.y + 190, 20, WHITE); + shadow_text(TextFormat("%d", pksav_bigendian16(party_pkmn.party_data.spd)), stat_text_pos_x, container_rec.y + 190, 20, WHITE); + shadow_text("Spcl:", text_pos_x, container_rec.y + 220, 20, WHITE); + shadow_text(TextFormat("%d", pksav_bigendian16(party_pkmn.party_data.spcl)), stat_text_pos_x, container_rec.y + 220, 20, WHITE); + + // Draw DVs inline with stats + uint8_t pkmn_dv[PKSAV_NUM_GB_IVS]; + pksav_get_gb_IVs(&party_pkmn.pc_data.iv_data, pkmn_dv, sizeof(pkmn_dv)); + shadow_text(TextFormat("%d", pkmn_dv[PKSAV_GB_IV_HP]), dv_text_pos_x, container_rec.y + 100, 20, WHITE); + shadow_text(TextFormat("%d", pkmn_dv[PKSAV_GB_IV_ATTACK]), dv_text_pos_x, container_rec.y + 130, 20, WHITE); + shadow_text(TextFormat("%d", pkmn_dv[PKSAV_GB_IV_DEFENSE]), dv_text_pos_x, container_rec.y + 160, 20, WHITE); + shadow_text(TextFormat("%d", pkmn_dv[PKSAV_GB_IV_SPEED]), dv_text_pos_x, container_rec.y + 190, 20, WHITE); + shadow_text(TextFormat("%d", pkmn_dv[PKSAV_GB_IV_SPECIAL]), dv_text_pos_x, container_rec.y + 220, 20, WHITE); + } + else if (pkmn_save->save_generation_type == SAVE_GENERATION_2) + { + pksav_gen1_import_text(pkmn_save->save.gen2_save.pokemon_storage.p_party->nicknames[selected_index], selected_pokemon_nickname, PKMN_NAME_TEXT_MAX); + struct pksav_gen2_party_pokemon party_pkmn = pkmn_save->save.gen2_save.pokemon_storage.p_party->party[selected_index]; + // Draw level + shadow_text(TextFormat("Level %u", party_pkmn.pc_data.level), text_pos_x, container_rec.y + 40, 20, WHITE); + shadow_text("Stats", stat_text_pos_x - 15, container_rec.y + 70, 20, WHITE); + shadow_text("IVs", dv_text_pos_x, container_rec.y + 70, 20, WHITE); + // Draw stats + shadow_text("HP:", text_pos_x, container_rec.y + 100, 20, WHITE); + shadow_text(TextFormat("%d", pksav_bigendian16(party_pkmn.party_data.max_hp)), stat_text_pos_x, container_rec.y + 100, 20, WHITE); + shadow_text("Atk:", text_pos_x, container_rec.y + 130, 20, WHITE); + shadow_text(TextFormat("%d", pksav_bigendian16(party_pkmn.party_data.atk)), stat_text_pos_x, container_rec.y + 130, 20, WHITE); + shadow_text("Def:", text_pos_x, container_rec.y + 160, 20, WHITE); + shadow_text(TextFormat("%d", pksav_bigendian16(party_pkmn.party_data.def)), stat_text_pos_x, container_rec.y + 160, 20, WHITE); + shadow_text("Spd:", text_pos_x, container_rec.y + 190, 20, WHITE); + shadow_text(TextFormat("%d", pksav_bigendian16(party_pkmn.party_data.spd)), stat_text_pos_x, container_rec.y + 190, 20, WHITE); + shadow_text("Sp.A:", text_pos_x, container_rec.y + 220, 20, WHITE); + shadow_text(TextFormat("%d", pksav_bigendian16(party_pkmn.party_data.spatk)), stat_text_pos_x, container_rec.y + 220, 20, WHITE); + shadow_text("Sp.D:", text_pos_x, container_rec.y + 250, 20, WHITE); + shadow_text(TextFormat("%d", pksav_bigendian16(party_pkmn.party_data.spdef)), stat_text_pos_x, container_rec.y + 250, 20, WHITE); + + // Draw DVs + uint8_t pkmn_dv[PKSAV_NUM_GB_IVS]; + pksav_get_gb_IVs(&party_pkmn.pc_data.iv_data, pkmn_dv, sizeof(pkmn_dv)); + shadow_text(TextFormat("%d", pkmn_dv[PKSAV_GB_IV_HP]), dv_text_pos_x, container_rec.y + 100, 20, WHITE); + shadow_text(TextFormat("%d", pkmn_dv[PKSAV_GB_IV_ATTACK]), dv_text_pos_x, container_rec.y + 130, 20, WHITE); + shadow_text(TextFormat("%d", pkmn_dv[PKSAV_GB_IV_DEFENSE]), dv_text_pos_x, container_rec.y + 160, 20, WHITE); + shadow_text(TextFormat("%d", pkmn_dv[PKSAV_GB_IV_SPEED]), dv_text_pos_x, container_rec.y + 190, 20, WHITE); + shadow_text(TextFormat("%d", pkmn_dv[PKSAV_GB_IV_SPECIAL]), dv_text_pos_x, container_rec.y + 220, 20, WHITE); + shadow_text(TextFormat("%d", pkmn_dv[PKSAV_GB_IV_SPECIAL]), dv_text_pos_x, container_rec.y + 250, 20, WHITE); + } + // Draw nickname + shadow_text(selected_pokemon_nickname, text_pos_x, container_rec.y + 10, 20, WHITE); } + + // Bottom bar + const Rectangle bottom_bar_rec = (Rectangle){0, SCREEN_HEIGHT - 50, SCREEN_WIDTH, 100}; + DrawRectangleRec(bottom_bar_rec, WHITE); + DrawLineEx((Vector2){bottom_bar_rec.x, bottom_bar_rec.y}, (Vector2){bottom_bar_rec.width, bottom_bar_rec.y}, 15, BLACK); + // Evolve button (next button) - const Rectangle evolve_button_rec = (Rectangle){NEXT_BUTTON_X - 15, NEXT_BUTTON_Y - 30, BUTTON_WIDTH, BUTTON_HEIGHT}; - DrawText("Evolve!", NEXT_BUTTON_X, NEXT_BUTTON_Y, 20, selected_index != NONE ? BLACK : LIGHTGRAY); + const Rectangle evolve_button_rec = (Rectangle){NEXT_BUTTON_X - 15, NEXT_BUTTON_Y + 8, BUTTON_WIDTH, BUTTON_HEIGHT}; + DrawText("Evolve !", evolve_button_rec.x + 15, evolve_button_rec.y + 10, 20, selected_index != NONE ? is_trade_eligible ? BLACK : LIGHTGRAY : LIGHTGRAY); + + const Rectangle back_button_rec = (Rectangle){BACK_BUTTON_X - 15, BACK_BUTTON_Y + 8, BUTTON_WIDTH, BUTTON_HEIGHT}; + DrawText("< Back", back_button_rec.x + 15, back_button_rec.y + 10, 20, ui_selection == E_UI_BACK ? LIGHTGRAY : BLACK); - const Rectangle back_button_rec = (Rectangle){BACK_BUTTON_X - 15, BACK_BUTTON_Y - 30, BUTTON_WIDTH, BUTTON_HEIGHT}; - DrawText("< Back", BACK_BUTTON_X, BACK_BUTTON_Y, 20, ui_selection == E_UI_BACK ? LIGHTGRAY : BLACK); - if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { - if (CheckCollisionPointRec(GetMousePosition(), evolve_button_rec)) + if (CheckCollisionPointRec(GetMousePosition(), evolve_button_rec) && is_trade_eligible) { ui_selection = E_UI_EVOLVE; } @@ -137,6 +279,7 @@ void draw_evolve(PokemonSave *pkmn_save, char *save_path, struct trainer_info *t save_savefile_to_path(pkmn_save, save_path); selected_index = NONE; + is_trade_eligible = false; } else { diff --git a/src/screens/TradeScreen.c b/src/screens/TradeScreen.c index fb775e8..11b085d 100644 --- a/src/screens/TradeScreen.c +++ b/src/screens/TradeScreen.c @@ -21,8 +21,8 @@ void draw_trade(PokemonSave *save_player1, PokemonSave *save_player2, char *play DrawTextureEx(*trade_texture, (Vector2){50, 10}, 0, 0.4, WHITE); bool is_valid_trade[2] = {true, true}; - draw_trainer_info(trainer1, 25, (SCREEN_HEIGHT - 100)/2 - 75, trainerSelection, *is_same_generation, is_valid_trade); - draw_trainer_info(trainer2, SCREEN_WIDTH - 178, (SCREEN_HEIGHT - 100)/2-75, trainerSelection, *is_same_generation, is_valid_trade); + draw_trainer_info(trainer1, 25, (SCREEN_HEIGHT - 100) / 2 - 75, trainerSelection, *is_same_generation, is_valid_trade); + draw_trainer_info(trainer2, SCREEN_WIDTH - 178, (SCREEN_HEIGHT - 100) / 2 - 75, trainerSelection, *is_same_generation, is_valid_trade); bool can_submit_trade = trainerSelection[0].pkmn_party_index != -1 && trainerSelection[1].pkmn_party_index != -1 && is_valid_trade[0] == true && is_valid_trade[1] == true; // Bottom bar @@ -51,7 +51,7 @@ void draw_trade(PokemonSave *save_player1, PokemonSave *save_player2, char *play ui_selection = BUTTON_NONE; } } - + static pksavhelper_error pksavhelper_error = error_none; if (IsMouseButtonReleased(MOUSE_BUTTON_LEFT) && ui_selection != BUTTON_NONE) { @@ -151,7 +151,7 @@ void draw_trade(PokemonSave *save_player1, PokemonSave *save_player2, char *play default: break; } - + show_trade_toast = !draw_toast_message(toast_message, TOAST_SHORT, TOAST_INFO); } else From 215910ed85990963f6c00579b86d0174c49fd8bd Mon Sep 17 00:00:00 2001 From: Spencer Vaughn Date: Sat, 18 Nov 2023 20:36:13 -0600 Subject: [PATCH 3/6] updated readme with new screens --- readme.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index f518337..43888f9 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,7 @@ # Pokerom Trader - Pokémon Save File Trading GUI -![Pokerom Trader](https://user-images.githubusercontent.com/25937456/277514322-288a8da9-fb6f-4ae1-8adb-00ccaed6683d.gif) +![main_menu](https://github.com/savaughn/pokerom-trader/assets/25937456/78ef12ba-b04c-471d-a1b2-36bc55ab731e) + # [![GitHub release (latest by date)](https://img.shields.io/github/v/release/savaughn/pokerom-trader)](https://github.com/savaughn/pokerom-trader/releases) [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/savaughn/pokerom-trader/build-macos.yml?branch=main)](https://github.com/savaughn/pokerom-trader/actions) [![GitHub issues](https://img.shields.io/github/issues/savaughn/pokerom-trader)](https://github.com/savaughn/pokerom-trader/issues) [![GitHub](https://img.shields.io/github/license/savaughn/pokerom-trader)](https://github.com/savaughn/pokerom-trader/blob/main/LICENSE) [![GitHub all releases](https://img.shields.io/github/downloads/savaughn/pokerom-trader/total)](https://github.com/savaughn/pokerom-trader/releases) @@ -16,7 +17,7 @@ There is no backup system implemented yet. Make backup saves before using this o - Bill's PC - Allows a user to view and manage their Pokémon boxes and party (in progress) ### Settings -![settings menu](https://user-images.githubusercontent.com/25937456/277552973-c1d28185-c347-463c-bf33-b7b782f6f32e.png) +![settings menu](https://user-images.githubusercontent.com/25937456/284032112-e4d14a96-731e-4255-88a3-2acabdd73b94.png) - Change save files folder with absolute path to folder - Default is ~/Library/PokeromTrader/saves (MacOS) - Default is ~/.pokeromtrader/ (Linux) @@ -47,6 +48,7 @@ There is no backup system implemented yet. Make backup saves before using this o ## What's not working - See [issues tab](https://github.com/savaughn/pokerom-trader/issues) for current bugs +- No JP Region support ## Discord https://discord.gg/JUzzegS3AP From c7b117c5a56c8ee471449310c15d730310098250 Mon Sep 17 00:00:00 2001 From: Spencer Vaughn Date: Sat, 18 Nov 2023 22:23:16 -0600 Subject: [PATCH 4/6] added initial values to char arrays --- .DS_Store | Bin 14340 -> 14340 bytes src/components/TrainerInfo.c | 2 +- src/pksavhelper.c | 40 +++++++++++++++++------------------ 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.DS_Store b/.DS_Store index 26a527a6536527c6419ba8acabfa7f7e3c4178d2..bf46dac05c6d3c07099b2971d80215911997fe16 100644 GIT binary patch delta 81 zcmZoEXepTBF8U^hRb*km37X>o3bOon8Je1<%Rc!qR_R3NR#P|T1qSwcZ^v!=j2 kMn<#Av5L}@<)u|NvkRT$-OR0Uk7M&@2|4!7>;`|?0bxNE)c^nh delta 51 zcmV-30L=e{aD;G>PXQ~jP`eKS6_X4Q8?#*ypaB6jv;Gkc4v~O1vkM^J2(up<>;{p5 JGP4IT{RhE85sUx; diff --git a/src/components/TrainerInfo.c b/src/components/TrainerInfo.c index ee22775..2773e15 100644 --- a/src/components/TrainerInfo.c +++ b/src/components/TrainerInfo.c @@ -161,7 +161,7 @@ void draw_trainer_info(struct trainer_info *trainer, int x, int y, struct Traine if (current_trainer_index != -1 && trainer_selection[current_trainer_index].pkmn_party_index != -1 && is_panel_out) { // Name of the pokemon selected from list - static char selected_pokemon_nickname[PKMN_NAME_TEXT_MAX + 1] = "\0"; + char selected_pokemon_nickname[PKMN_NAME_TEXT_MAX + 1] = "\0"; if (trainer_generation == SAVE_GENERATION_1) { pksav_gen1_import_text(trainer->pokemon_party.gen1_pokemon_party.nicknames[trainer_selection[current_trainer_index].pkmn_party_index], selected_pokemon_nickname, PKMN_NAME_TEXT_MAX); diff --git a/src/pksavhelper.c b/src/pksavhelper.c index 0a5bf25..a49ebf0 100644 --- a/src/pksavhelper.c +++ b/src/pksavhelper.c @@ -59,8 +59,8 @@ pksavhelper_error update_seen_owned_pkmn(PokemonSave *pkmn_save, uint8_t pokemon void swap_party_pkmn_at_indices(struct pksav_gen2_save *save, uint8_t pkmn_party_index1, uint8_t pkmn_party_index2) { // swap nickname - char tmp_nickname1[PKMN_NAME_TEXT_MAX + 1]; - char tmp_nickname2[PKMN_NAME_TEXT_MAX + 1]; + char tmp_nickname1[PKMN_NAME_TEXT_MAX + 1] = "\0"; + char tmp_nickname2[PKMN_NAME_TEXT_MAX + 1] = "\0"; pksav_gen2_import_text(save->pokemon_storage.p_party->nicknames[pkmn_party_index1], tmp_nickname1, PKMN_NAME_TEXT_MAX); pksav_gen2_import_text(save->pokemon_storage.p_party->nicknames[pkmn_party_index2], tmp_nickname2, PKMN_NAME_TEXT_MAX); pksav_gen2_export_text(tmp_nickname2, save->pokemon_storage.p_party->nicknames[pkmn_party_index1], PKMN_NAME_TEXT_MAX); @@ -79,8 +79,8 @@ void swap_party_pkmn_at_indices(struct pksav_gen2_save *save, uint8_t pkmn_party save->pokemon_storage.p_party->species[pkmn_party_index2] = tmp_species; // swap otnames - char tmp_otname1[TRAINER_NAME_TEXT_MAX + 1]; - char tmp_otname2[TRAINER_NAME_TEXT_MAX + 1]; + char tmp_otname1[TRAINER_NAME_TEXT_MAX + 1] = "\0"; + char tmp_otname2[TRAINER_NAME_TEXT_MAX + 1] = "\0"; pksav_gen2_import_text(save->pokemon_storage.p_party->otnames[pkmn_party_index1], tmp_otname1, TRAINER_NAME_TEXT_MAX); pksav_gen2_import_text(save->pokemon_storage.p_party->otnames[pkmn_party_index2], tmp_otname2, TRAINER_NAME_TEXT_MAX); pksav_gen2_export_text(tmp_otname2, save->pokemon_storage.p_party->otnames[pkmn_party_index1], TRAINER_NAME_TEXT_MAX); @@ -99,7 +99,7 @@ void create_trainer(PokemonSave *pkmn_save, struct trainer_info *trainer) case SAVE_GENERATION_1: { // Trainer name - char trainer_name[TRAINER_NAME_TEXT_MAX + 1]; + char trainer_name[TRAINER_NAME_TEXT_MAX + 1] = "\0"; pksav_gen1_import_text(pkmn_save->save.gen1_save.trainer_info.p_name, trainer_name, TRAINER_NAME_TEXT_MAX); // Trainer Id @@ -119,7 +119,7 @@ void create_trainer(PokemonSave *pkmn_save, struct trainer_info *trainer) case SAVE_GENERATION_2: { // Trainer name - char trainer_name[TRAINER_NAME_TEXT_MAX + 1]; + char trainer_name[TRAINER_NAME_TEXT_MAX + 1] = "\0"; pksav_gen2_import_text(pkmn_save->save.gen2_save.trainer_info.p_name, trainer_name, TRAINER_NAME_TEXT_MAX); // Update the trainer struct @@ -451,9 +451,9 @@ enum eligible_trade_status check_trade_eligibility(struct trainer_info *trainer, bool check_if_reds_pikachu(const PokemonSave *pkmn_save, const uint8_t pkmn_party_index) { - char tmp_otname_pkmn[PKMN_NAME_TEXT_MAX + 1]; + char tmp_otname_pkmn[PKMN_NAME_TEXT_MAX + 1] = "\0"; pksav_gen1_import_text(pkmn_save->save.gen1_save.pokemon_storage.p_party->otnames[pkmn_party_index], tmp_otname_pkmn, PKMN_NAME_TEXT_MAX); - char tmp_otname_trainer[PKMN_NAME_TEXT_MAX + 1]; + char tmp_otname_trainer[PKMN_NAME_TEXT_MAX + 1] = "\0"; pksav_gen1_import_text(pkmn_save->save.gen1_save.trainer_info.p_name, tmp_otname_trainer, PKMN_NAME_TEXT_MAX); return pkmn_save->save.gen1_save.pokemon_storage.p_party->party[pkmn_party_index].pc_data.species == SI_PIKACHU && // Is a Pikachu pkmn_save->save.gen1_save.save_type == PKSAV_GEN1_SAVE_TYPE_YELLOW && // Is from Yellow @@ -485,8 +485,8 @@ pksavhelper_error swap_pkmn_at_index_between_saves_cross_gen(PokemonSave *player } // swap nickname - char tmp_nickname1[PKMN_NAME_TEXT_MAX + 1]; - char tmp_nickname2[PKMN_NAME_TEXT_MAX + 1]; + char tmp_nickname1[PKMN_NAME_TEXT_MAX + 1] = "\0"; + char tmp_nickname2[PKMN_NAME_TEXT_MAX + 1] = "\0"; pksav_error = pksav_gen1_import_text(player_gen1->save.gen1_save.pokemon_storage.p_party->nicknames[pkmn_party_index1], tmp_nickname1, PKMN_NAME_TEXT_MAX); if (pksav_error != PKSAV_ERROR_NONE) { @@ -608,8 +608,8 @@ pksavhelper_error swap_pkmn_at_index_between_saves_cross_gen(PokemonSave *player player_gen2->save.gen2_save.pokemon_storage.p_party->species[pkmn_party_index2] = species_gen1_to_gen2[tmp_species_gen1]; // swap otnames - char tmp_otname_gen1[TRAINER_NAME_TEXT_MAX + 1]; - char tmp_otname_gen2[TRAINER_NAME_TEXT_MAX + 1]; + char tmp_otname_gen1[TRAINER_NAME_TEXT_MAX + 1] = "\0"; + char tmp_otname_gen2[TRAINER_NAME_TEXT_MAX + 1] = "\0"; pksav_error = pksav_gen1_import_text(player_gen1->save.gen1_save.pokemon_storage.p_party->otnames[pkmn_party_index1], tmp_otname_gen1, TRAINER_NAME_TEXT_MAX); if (pksav_error != PKSAV_ERROR_NONE) { @@ -652,8 +652,8 @@ pksavhelper_error swap_pkmn_at_index_between_saves(PokemonSave *player1_save, Po enum pksav_error pksav_error; // swap nickname - char tmp_nickname1[PKMN_NAME_TEXT_MAX + 1]; - char tmp_nickname2[PKMN_NAME_TEXT_MAX + 1]; + char tmp_nickname1[PKMN_NAME_TEXT_MAX + 1] = "\0"; + char tmp_nickname2[PKMN_NAME_TEXT_MAX + 1] = "\0"; if (player1_save->save_generation_type == SAVE_GENERATION_1) { pksav_error = pksav_gen1_import_text(player1_save->save.gen1_save.pokemon_storage.p_party->nicknames[pkmn_party_index1], tmp_nickname1, PKMN_NAME_TEXT_MAX); @@ -734,8 +734,8 @@ pksavhelper_error swap_pkmn_at_index_between_saves(PokemonSave *player1_save, Po } // swap otnames - char tmp_otname1[TRAINER_NAME_TEXT_MAX + 1]; - char tmp_otname2[TRAINER_NAME_TEXT_MAX + 1]; + char tmp_otname1[TRAINER_NAME_TEXT_MAX + 1] = "\0"; + char tmp_otname2[TRAINER_NAME_TEXT_MAX + 1] = "\0"; if (player1_save->save_generation_type == SAVE_GENERATION_1) { pksav_error = pksav_gen1_import_text(player1_save->save.gen1_save.pokemon_storage.p_party->otnames[pkmn_party_index1], tmp_otname1, TRAINER_NAME_TEXT_MAX); @@ -817,9 +817,9 @@ void evolve_party_pokemon_at_index(PokemonSave *pkmn_save, uint8_t pkmn_party_in uint8_t pkmn_species_index = pkmn_save->save.gen1_save.pokemon_storage.p_party->species[pkmn_party_index]; // Get the data for the pokemon's evolution - char evolution_name[PKMN_NAME_TEXT_MAX + 1]; + char evolution_name[PKMN_NAME_TEXT_MAX + 1] = "\0"; strcpy(evolution_name, pkmn_evolution_pairs_gen1[pkmn_species_index].evolution_name); - char species_name[PKMN_NAME_TEXT_MAX + 1]; + char species_name[PKMN_NAME_TEXT_MAX + 1] = "\0"; strcpy(species_name, pkmn_evolution_pairs_gen1[pkmn_species_index].species_name); uint8_t evolution_index = pkmn_evolution_pairs_gen1[pkmn_species_index].evolution_index; @@ -831,7 +831,7 @@ void evolve_party_pokemon_at_index(PokemonSave *pkmn_save, uint8_t pkmn_party_in update_pkmn_stats(pkmn_save, pkmn_party_index); // Get the pokemon's nickname - char pkmn_save_nickname[PKMN_NAME_TEXT_MAX + 1]; + char pkmn_save_nickname[PKMN_NAME_TEXT_MAX + 1] = "\0"; pksav_gen1_import_text(pkmn_save->save.gen1_save.pokemon_storage.p_party->nicknames[pkmn_party_index], pkmn_save_nickname, PKMN_NAME_TEXT_MAX); // Check if pokemon does not have custom nickname @@ -877,7 +877,7 @@ void evolve_party_pokemon_at_index(PokemonSave *pkmn_save, uint8_t pkmn_party_in update_pkmn_stats(pkmn_save, pkmn_party_index); // Get the pokemon's nickname - char pkmn_save_nickname[PKMN_NAME_TEXT_MAX + 1]; + char pkmn_save_nickname[PKMN_NAME_TEXT_MAX + 1] = "\0"; pksav_gen2_import_text(pkmn_save->save.gen2_save.pokemon_storage.p_party->nicknames[pkmn_party_index], pkmn_save_nickname, PKMN_NAME_TEXT_MAX); // Check if pokemon does not have custom nickname From 1385444c213f653d2ac212a2fc3a2cb1f94ac255 Mon Sep 17 00:00:00 2001 From: Spencer Vaughn Date: Sat, 18 Nov 2023 23:31:37 -0600 Subject: [PATCH 5/6] added demo gifs to readme --- readme.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/readme.md b/readme.md index 43888f9..0096940 100644 --- a/readme.md +++ b/readme.md @@ -90,3 +90,13 @@ This project is licensed under the [MIT License](LICENSE). ## Disclaimer Pokerom Trader is an unofficial application and is not affiliated with or endorsed by Nintendo, Game Freak, Creatures, The Pokémon Company, or any related entities. Pokémon and Pokémon character names are trademarks of Nintendo, Game Freak, Creatures, and The Pokémon Company. All trademarks, character names, and other intellectual property used in this application are used for identification and informational purposes only. The use of these names and marks is believed to qualify as fair use under trademark law. Pokerom Trader is not endorsed by or affiliated with any of the aforementioned entities. Pokerom Trader is provided "as is" without warranty of any kind, and the developers make no warranties, express or implied, regarding the accuracy or completeness of the content provided in this application. + +## Demos +### Trade + +![trade_demo](https://github.com/savaughn/pokerom-trader/assets/25937456/d33ebe5f-d3ab-4b58-b67e-9cc4a8c7633f) + +### Evolve + +![evolve_demo](https://github.com/savaughn/pokerom-trader/assets/25937456/4e97170c-d3ed-44ee-9fe5-19c5c25792ee) + From d6ac94884c6217614aa906a749cafa9442c5d00e Mon Sep 17 00:00:00 2001 From: Spencer Vaughn Date: Sat, 18 Nov 2023 23:42:40 -0600 Subject: [PATCH 6/6] updated evolve flow --- include/common.h | 3 ++- src/pksavhelper.c | 14 ++------------ src/screens/EvolveScreen.c | 12 ++++++++++++ 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/include/common.h b/include/common.h index 4bb2fb3..2c732ff 100644 --- a/include/common.h +++ b/include/common.h @@ -142,7 +142,8 @@ typedef enum { error_swap_pkmn, error_update_save, error_update_pokedex, - error_update_files + error_update_files, + error_evolve_pkmn, } pksavhelper_error; #endif // COMMON_H diff --git a/src/pksavhelper.c b/src/pksavhelper.c index a49ebf0..ef470d1 100644 --- a/src/pksavhelper.c +++ b/src/pksavhelper.c @@ -827,9 +827,6 @@ void evolve_party_pokemon_at_index(PokemonSave *pkmn_save, uint8_t pkmn_party_in pkmn_save->save.gen1_save.pokemon_storage.p_party->species[pkmn_party_index] = evolution_index; pkmn_save->save.gen1_save.pokemon_storage.p_party->party[pkmn_party_index].pc_data.species = evolution_index; - // Calculates and updates stats - update_pkmn_stats(pkmn_save, pkmn_party_index); - // Get the pokemon's nickname char pkmn_save_nickname[PKMN_NAME_TEXT_MAX + 1] = "\0"; pksav_gen1_import_text(pkmn_save->save.gen1_save.pokemon_storage.p_party->nicknames[pkmn_party_index], pkmn_save_nickname, PKMN_NAME_TEXT_MAX); @@ -852,8 +849,6 @@ void evolve_party_pokemon_at_index(PokemonSave *pkmn_save, uint8_t pkmn_party_in pkmn_save->save.gen1_save.pokemon_storage.p_party->party[pkmn_party_index].pc_data.catch_rate = pkmn_base_stats_gen1[evolution_index].catch_rate; // Update condition to none pkmn_save->save.gen1_save.pokemon_storage.p_party->party[pkmn_party_index].pc_data.condition = PKSAV_GB_CONDITION_NONE; - // Update health to max hp - pkmn_save->save.gen1_save.pokemon_storage.p_party->party[pkmn_party_index].pc_data.current_hp = pkmn_save->save.gen1_save.pokemon_storage.p_party->party[pkmn_party_index].party_data.max_hp; // TODO: Update moves based on learn set and level // engine/pokemon/evos_moves.asm // pkmn_save->save.gen1_save.pokemon_storage.p_party->party[pkmn_party_index].pc_data.moves; @@ -863,9 +858,9 @@ void evolve_party_pokemon_at_index(PokemonSave *pkmn_save, uint8_t pkmn_party_in // Get the species index of the pokemon being evolved uint8_t pkmn_species_index = pkmn_save->save.gen2_save.pokemon_storage.p_party->species[pkmn_party_index]; // Get the data for the pokemon's evolution - char evolution_name[PKMN_NAME_TEXT_MAX + 1]; + char evolution_name[PKMN_NAME_TEXT_MAX + 1] = "\0"; strcpy(evolution_name, pkmn_evolution_pairs_gen2[pkmn_species_index].evolution_name); - char species_name[PKMN_NAME_TEXT_MAX + 1]; + char species_name[PKMN_NAME_TEXT_MAX + 1] = "\0"; strcpy(species_name, pkmn_evolution_pairs_gen2[pkmn_species_index].species_name); uint8_t evolution_index = pkmn_evolution_pairs_gen2[pkmn_species_index].evolution_index; @@ -873,9 +868,6 @@ void evolve_party_pokemon_at_index(PokemonSave *pkmn_save, uint8_t pkmn_party_in pkmn_save->save.gen2_save.pokemon_storage.p_party->species[pkmn_party_index] = evolution_index; pkmn_save->save.gen2_save.pokemon_storage.p_party->party[pkmn_party_index].pc_data.species = evolution_index; - // Calculates and updates stats - update_pkmn_stats(pkmn_save, pkmn_party_index); - // Get the pokemon's nickname char pkmn_save_nickname[PKMN_NAME_TEXT_MAX + 1] = "\0"; pksav_gen2_import_text(pkmn_save->save.gen2_save.pokemon_storage.p_party->nicknames[pkmn_party_index], pkmn_save_nickname, PKMN_NAME_TEXT_MAX); @@ -893,8 +885,6 @@ void evolve_party_pokemon_at_index(PokemonSave *pkmn_save, uint8_t pkmn_party_in // Update condition to none pkmn_save->save.gen2_save.pokemon_storage.p_party->party[pkmn_party_index].party_data.condition = PKSAV_CONDITION_NONE; - // Update health to max hp - pkmn_save->save.gen2_save.pokemon_storage.p_party->party[pkmn_party_index].party_data.current_hp = pkmn_save->save.gen2_save.pokemon_storage.p_party->party[pkmn_party_index].party_data.max_hp; // TODO: Update moves based on learn set and level // engine/pokemon/evos_moves.asm // pkmn_save->save.gen2_save.pokemon_storage.p_party->party[pkmn_party_index].pc_data.moves; diff --git a/src/screens/EvolveScreen.c b/src/screens/EvolveScreen.c index 8591fde..751b2b4 100644 --- a/src/screens/EvolveScreen.c +++ b/src/screens/EvolveScreen.c @@ -83,6 +83,8 @@ void draw_evolve(PokemonSave *pkmn_save, char *save_path, struct trainer_info *t const int TRAINER_NAME_X = 50; const int TRAINER_NAME_Y = 115; static bool is_trade_eligible = false; + static bool show_evolve_toast = false; + static bool show_saving_icon = false; int party_count = 0; if (save_generation_type == SAVE_GENERATION_1) @@ -275,8 +277,13 @@ void draw_evolve(PokemonSave *pkmn_save, char *save_path, struct trainer_info *t update_seen_owned_pkmn(pkmn_save, selected_index); // Generates and assigns random dvs on simulated trade back to OT update_pkmn_DVs(pkmn_save, selected_index); + // Update stats based on new dvs + update_pkmn_stats(pkmn_save, selected_index); // Finalize pkmn data changes + show_saving_icon = true; save_savefile_to_path(pkmn_save, save_path); + // Refresh trainer data + create_trainer(pkmn_save, trainer); selected_index = NONE; is_trade_eligible = false; @@ -302,5 +309,10 @@ void draw_evolve(PokemonSave *pkmn_save, char *save_path, struct trainer_info *t } } + if (show_saving_icon) + { + show_saving_icon = draw_save_icon(SCREEN_WIDTH - 50, 10, show_saving_icon); + } + EndDrawing(); }