Welcome!
Final Burn Neo => FBN Development => Topic started by: cjom on May 21, 2022, 06:01:19 AM
-
(https://j.gifs.com/mqVw49.gif)
- scrolling list;
- activated cheats listed in green;
- check boxes for cheat's options.
In the file https://github.com/libretro/FBNeo/blob/master/src/burner/sdl/sdl2_gui_ingame.cpp (https://github.com/libretro/FBNeo/blob/master/src/burner/sdl/sdl2_gui_ingame.cpp) we need to add all this code:
#define CHEATOPTIONSMENU 8
#define MAXLINESMENU 21
int firstMenuLine = 0;
UINT16 current_selected_cheat = 0;
int cheatoptionscount = 0;
struct MenuItem cheatOptionsMenu[64];
int CheatMenuSelected();
int CheatMenuOptionsSelected();
bool isCheatActivated[CHEAT_MAX_OPTIONS] = {false}; // Array to keed track of activated cheats and use a different color in list
int IgnoreSelection()
{
return 0;
}
int SelectedCheatOption()
{
CheatEnable(current_selected_cheat, current_selected_item);
CheatMenuSelected();
return 0;
}
int CheatMenuOptionsSelected()
{
current_selected_cheat = current_selected_item;
current_selected_item = 0;
current_menu = CHEATOPTIONSMENU;
cheatoptionscount = 0;
CheatInfo* pCurrentCheat = pCheatInfo;
for (int c = 0; c < current_selected_cheat; c++) {
pCurrentCheat = pCurrentCheat->pNext;
} // Skip to selected cheat number
for (int c = 0; pCurrentCheat->pOption[c]; c++) {
if (_tcslen(pCurrentCheat->pOption[c]->szOptionName) && strcmp(pCurrentCheat->pOption[c]->szOptionName, " ")) {
// Look for check boxes...
if ((pCurrentCheat->pOption[c]->szOptionName[0] == '[') && (pCurrentCheat->pOption[c]->szOptionName[2] == ']') && (pCurrentCheat->pOption[c]->szOptionName[3] == ' ')) {
if (c == pCurrentCheat->nCurrent) pCurrentCheat->pOption[c]->szOptionName[1] = 'X'; // Active cheat option
else pCurrentCheat->pOption[c]->szOptionName[1] = ' '; // Not active option
} else {
// Add check boxes
char tmpoptionname[CHEAT_MAX_NAME+10] = {0};
if (c == pCurrentCheat->nCurrent) strcpy(tmpoptionname, "[X] \0"); // Active cheat option
else strcpy(tmpoptionname, "[ ] \0"); // Not active option
strcat(tmpoptionname, pCurrentCheat->pOption[c]->szOptionName);
strcpy(pCurrentCheat->pOption[c]->szOptionName, tmpoptionname);
}
cheatOptionsMenu[c] = (MenuItem){pCurrentCheat->pOption[c]->szOptionName, SelectedCheatOption, NULL};
} else cheatOptionsMenu[c] = (MenuItem){" \0", IgnoreSelection, NULL}; // Ignore cheats options without name
cheatoptionscount++;
}
cheatOptionsMenu[cheatoptionscount] = (MenuItem){"BACK \0", CheatMenuSelected, NULL};
cheatoptionscount++;
return 0;
}
Also, the function CheatMenuSelectd() in https://github.com/libretro/FBNeo/blob/0c0ecfead98c4201d6c8bfc5407d16b01fc5a3d3/src/burner/sdl/sdl2_gui_ingame.cpp#L74 (https://github.com/libretro/FBNeo/blob/0c0ecfead98c4201d6c8bfc5407d16b01fc5a3d3/src/burner/sdl/sdl2_gui_ingame.cpp#L74) needs to be like this:
int CheatMenuSelected()
{
current_selected_item = 0;
current_menu = CHEATMENU;
cheatcount = 0;
int i = 0;
CheatInfo* pCurrentCheat = pCheatInfo;
while (pCurrentCheat) {
if (_tcslen(pCurrentCheat->szCheatName) && strcmp(pCurrentCheat->szCheatName, " ")) {
cheatMenu[i] = (MenuItem){pCurrentCheat->szCheatName, CheatMenuOptionsSelected, NULL};
if (pCurrentCheat->nCurrent) isCheatActivated[i] = true;
else isCheatActivated[i] = false;
} else cheatMenu[i] = (MenuItem){" \0", IgnoreSelection, NULL}; // Ignore cheats without name
pCurrentCheat = pCurrentCheat->pNext;
i++;
}
cheatMenu[i] = (MenuItem){"BACK \0", MainMenuSelected, NULL};
cheatcount = i + 1;
return 0;
}
Also edit the ingame_gui_render() function at https://github.com/libretro/FBNeo/blob/0c0ecfead98c4201d6c8bfc5407d16b01fc5a3d3/src/burner/sdl/sdl2_gui_ingame.cpp#L165 (https://github.com/libretro/FBNeo/blob/0c0ecfead98c4201d6c8bfc5407d16b01fc5a3d3/src/burner/sdl/sdl2_gui_ingame.cpp#L165) to:
void ingame_gui_render()
{
SDL_SetRenderDrawColor(sdlRenderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
SDL_RenderClear(sdlRenderer);
SDL_RenderCopy(sdlRenderer, screenshotTexture, &title_texture_rect, &dest_title_texture_rect);
incolor(fbn_color, /* unused */ 0);
inprint(sdlRenderer, "FinalBurn Neo", 10, 10);
inprint(sdlRenderer, "=============", 10, 20);
switch (current_menu)
{
case MAINMENU:
current_item_count = MAINMENU_COUNT;
current_menu_items = mainMenu;
break;
case DIPMENU:
current_item_count = DIPMENU_COUNT;
current_menu_items = dipMenu;
break;
case CONTROLLERMENU:
current_item_count = CONTROLLERMENU_COUNT;
current_menu_items = controllerMenu;
break;
case CHEATMENU:
current_item_count = cheatcount;
current_menu_items = cheatMenu;
break;
case CHEATOPTIONSMENU:
current_item_count = cheatoptionscount;
current_menu_items = cheatOptionsMenu;
break;
}
int c = 0;
// Keep selected line always visible in screen
if (current_selected_item > firstMenuLine + MAXLINESMENU) firstMenuLine = current_selected_item - MAXLINESMENU;
else if (current_selected_item < firstMenuLine) firstMenuLine = current_selected_item;
incolor(normal_color, /* unused */ 0);
if (firstMenuLine > 0) inprint(sdlRenderer, "( ... more ... )", 10, 30+(10*c));
for(int i=firstMenuLine; ((i < current_item_count) && (i < firstMenuLine + MAXLINESMENU + 1)); i ++)
{
if (i ==current_selected_item)
{
calcSelectedItemColor();
}
else if ((current_menu == CHEATMENU) && isCheatActivated[i])
{
incolor(0x009000, /* unused */ 0);
}
else
{
incolor(normal_color, /* unused */ 0);
}
c++;
inprint(sdlRenderer,current_menu_items[i].name , 10, 30+(10*c));
}
incolor(normal_color, /* unused */ 0);
if (current_item_count > firstMenuLine + MAXLINESMENU + 1 ) inprint(sdlRenderer, "( ... more ... )", 10, 40+(10*c));
SDL_RenderPresent(sdlRenderer);
}
And finally, we can't just return from cheats menu directly to game, because we we call again the ingame menu it will be empty and not usable. So, it's necessary to add MainMenuSelected(); just after case SDLK_TAB: in https://github.com/libretro/FBNeo/blob/0c0ecfead98c4201d6c8bfc5407d16b01fc5a3d3/src/burner/sdl/sdl2_gui_ingame.cpp#L224 (https://github.com/libretro/FBNeo/blob/0c0ecfead98c4201d6c8bfc5407d16b01fc5a3d3/src/burner/sdl/sdl2_gui_ingame.cpp#L224)
I have some other changes but that's because I completely disabled keyboard support and rely only on gamepad.
-
Wow, this is really awesome!
I don't know enough about the SDL2 version to make changes confidently,
Could you zip & attach the pre-modified source to a message here and I'll check it into the repo?
best regards,
- dink
-
DIP switches also working!
I need to improve the resetting game after DIPs changing and will try doing PR on git.
-
Nice work!
-
Alright!
I finally got game controller buttons (re)mapping working...
(https://j.gifs.com/VvyRPv.gif)
Next step is to prepare the push requests.
-
cjom awesome :)
-
Great work! very nice !
//off topic
I take this opportunity to say, because I know it has no relation (but it would be very practical), is it possible to make a system which would make it possible to create all the dats via a command line (the method that was shown previously in another topic is not conclusive at all). Given the number of people who use git binaries that would be great ;)
//off topic end
^^
-
I'm not sure if I understand what you want, because standalone version has a command line parameter to extract dats:
Usage: fbneo [-cd] [-joy] [-menu] [-unibios] [-novsync] [-integerscale] [-fullscreen] [-dat] [-autosave] [-nearest] [-linear] [-best] <romname>