Screenshots in game saves

Started by Silent Bob, Tue 10/04/2018 23:05:33

Previous topic - Next topic

Silent Bob

Hi there everyone :smiley:,

Recently I'm working on Save/Load system in my game. Starting from the beginning - the option 'Save screenshots in save games' available in General options of AGS doesn't do anything, at least with the latest engine version (3.4.1). I don't know if it's a bug or am I missing something? - if it is, then maybe it should be fixed with the next engine's update?. Anyway - it seems to work fine, while adding an extra line of code in Your global script in the section with save function definition, for example:

SaveScreenShot(String.Format("scrnshot%03d.bmp", screenshot));


What I'm trying to achieve is the saving system which creates a screenshot every time I'm saving a game, so that each one would show up next to a given save while loading menu appears. I was looking for similar solutions on the forum, but unfortunately none of them worked :(.

Walt
If you wanna do something - you seek for solution, if you don't want to - you seek for a reason.

Snarky

Just because a game is saved with a screenshot doesn't mean it will automatically be displayed in the load menu. You'll probably have to create your own GUI and write the necessary code to display the screenshot (though it seems probable that someone has released a module for it). The relevant command involved is DynamicSprite.CreateFromSaveGame().

Silent Bob

The point is - game is not saved with a screenshot. That's what I'm trying to say. At least setting up this function in General Settings doesn't do anything. It's more like 'nice to have' in further versions. For now it's enough if it's working with a bit of scripting. As for the saving system I mentioned above - I thought maybe someone did something similar before. I'll try to search smth again.
If you wanna do something - you seek for solution, if you don't want to - you seek for a reason.

Snarky

#3
While it's possible that this function is broken in the most recent version (it has certainly worked in the past), I think it's more likely that you're doing something wrong. You haven't described how you've determined that it's not working, so it's hard to say what that mistake might be.

Edit: Oh, and just in case there's any confusion â€" "saved with screenshot" does not mean the screenshot is stored as a separate file. It's included within the savegame file.

Silent Bob

#4
So, it's compiled with all other save game data in one file? Oh... didn't know that. So then for storing a screenshot as a seperate file the above code line is necessary. It does make sense now. Thanks Snarky :smiley:.
I'd be grateful for any additional help with associating screenshot with a given game save. Maybe someone did something like that before. To clarify, I'm still working on it, but maybe in the meantime someone would share some example.
If you wanna do something - you seek for solution, if you don't want to - you seek for a reason.

Hobo

If I understand you correctly, you want to create a save/load GUI that displays the screenshot of the save location?
If that's the case, then you might want to take a look at the Extended ALARCOST (BASS) 1.4 template, it has a saving system like that.

Khris

#6
If you open up the manual to the mandatory to read Tutorial section (or search it for "screenshot"), you will find:

Setting up the game -> General Settings, which has an explanation of each setting.
Quote from: manualSave screenshots in save games - Saves a mini-screenshot of the player's current position into the save game file. This will create larger save game files, but it will mean that you can use a save game thumbnails GUI to make the save/load interface more professional.

As for associating it with a save game, what exactly do you mean? The default game uses
Code: ags
  SaveGameSlot(gameSlotToSaveInto, txtNewSaveName.Text);
so you can use that number and append it to the filename of your manually saved image. Is that what you mean? What is your end goal here? Why do you need extra screenshots?

Silent Bob

To sum up - I don't need extra screenshots, never did. I just didn't know why screenshots weren't shown in a game folder while the option in General Settings was set to use them. Snarky explained that. Now I just wan't to achieve what's in the example picture:

https://s17.postimg.cc/62x35l2wv/Bez_tytu_u.jpg

My save / load system is already done, but i just wan't to add a fuction that will show next to a given save a screenshot of current game progress.
If you wanna do something - you seek for solution, if you don't want to - you seek for a reason.

Snarky

It's pretty simple, but you do need to use DynamicSprites.

DynamicSprites aren't as difficult as a lot of people think, though. You know how every sprite in AGS has a sprite number? Well, what if you want to use a sprite other than one of the ones you loaded into the AGS Editor ahead of time? Well, what you do is use a DynamicSprite, which is a class that allows you to load other graphics, and assigns them a new sprite number that you can use just like any other AGS sprite.

So basically, you put a button on your save/load GUI in each place a screenshot is supposed to go. (This is because Buttons are the main type of GUI control that you can assign a sprite to.) You declare a DynamicSprite* variable (like DynamicSprite* dsSaveGame1;) for each button (if you have many, it makes sense to declare it as an array, like DynamicSprite* dsSaveGames[10];), outside of any function. These DynamicSprites will store the screenshot graphics that we show on the buttons.

When you display the GUI, you call DynamicSprite.CreateFromSaveGame() for each of the savegames you want to display, and store the result in the corresponding variable, e.g. dsSaveGame1 = DynamicSprite.CreateFromSaveGame(/*function arguments go here*/);. Then you have to assign the sprite index of the dynamic sprite to the button graphic, with something like btnSaveGame1.NormalGraphic = dsSaveGame1.Graphic;. And then they should show up.

Silent Bob

I finally got it working. Thank You all :)

If you wanna do something - you seek for solution, if you don't want to - you seek for a reason.

Cookie_Wood

Hi there !

I'm quite a newbie and English is not my mother tongue, I apologize in advance <3

Re-openning the topic, I'd like to do basically the same thing as Silent Bob wanted to. I'm doing quite well. The thing is working almost perfectly, BUT it works only if I click twice on my save button. Why ? I'd like the screenshot to appears on my dynamicsprite button even if I click only once on the save button. (which sounds legit ?)

Do you have any idea of what i'm missing ? By the way, how can i make disappear the gSave GUI very quickly before the screenshot is taken ? Because right now, i do have a screenshot, but we bearly cant see the background because of my huge save GUI on the foreground. I do know how to make it disappear but, not in that precise case.


Here's some of my code :

Code: ags

//----------------------------------------------------------------------------------------------------
// on_event
//----------------------------------------------------------------------------------------------------

DynamicSprite *buttonSprite1;
DynamicSprite *buttonSprite2;
DynamicSprite *buttonSprite3;

function on_event (EventType event, int data) 
{
buttonSprite1=DynamicSprite.CreateFromSaveGame(1, 200, 120);
if (buttonSprite1 != null) {
bScreenSlot1.NormalGraphic=buttonSprite1.Graphic;
}
buttonSprite2=DynamicSprite.CreateFromSaveGame(2, 200, 120);
if (buttonSprite2 != null) {
bScreenSlot2.NormalGraphic=buttonSprite2.Graphic;  
}

buttonSprite3=DynamicSprite.CreateFromSaveGame(3, 200, 120);
if (buttonSprite3 != null) {
bScreenSlot3.NormalGraphic=buttonSprite3.Graphic;  
}
}


And

Code: ags
  
//----------------------------------------------------------------------------------------------------
// gSave
//----------------------------------------------------------------------------------------------------

function bSaveSlot1_OnClick(GUIControl *control, MouseButton button)
{
SaveGameSlot(1, "Save 1");
}

function bSaveSlot2_OnClick(GUIControl *control, MouseButton button)
{
SaveGameSlot(2, "Save 2");
}

function bSaveSlot3_OnClick(GUIControl *control, MouseButton button)
{
SaveGameSlot(3, "Save 3");
}


Cassiebsg

Well, for removing the gui from the screenshot, just close it right before taking the screenshot, and then reopen it again.  It'll be fast enough for the player not to even notice that happend.  ;)

The rest of your question/problem I'll leave for the experts to answer, cause I don't know the answer...
There are those who believe that life here began out there...

Khris

Why is that code in on_event? You only need to run those commands right before you turn gSave visible.

As for hiding the GUI, have you tried calling gSave.Visible = false; right before calling SaveGameSlot()? The latter command is queued and the game is only saved after the function has finished, so it should work that way. I didn't test it though.

No idea why you need to click twice. We need more details and more code to address that.

Cookie_Wood

#13
Hi !

Thank you for your quick answers :)

I should have misunderstood the manual which mentionned "on_event" concerning the dynamic sprites I think.

I change a little bit of my code, trying to do what you adviced me to do, but I still have the "click twice" problem, and the GUI really doesn't want to desapear... -_-
Kris, what kind of fonctions do you think you need to see to adress that ? I had to start over my game recently, so my "global script" is still very "short".

Here's the whole thing :

Code: ags


//----------------------------------------------------------------------------------------------------
// game_start
//----------------------------------------------------------------------------------------------------
function game_start() 
{
  
}

//----------------------------------------------------------------------------------------------------
// on_event
//----------------------------------------------------------------------------------------------------

DynamicSprite *buttonSprite1;
DynamicSprite *buttonSprite2;
DynamicSprite *buttonSprite3;

function on_event (EventType event, int data) 
{

}


//----------------------------------------------------------------------------------------------------
// repeatedly_execute
//----------------------------------------------------------------------------------------------------
function repeatedly_execute() 
{
  Hotspot* hsurvol = Hotspot.GetAtScreenXY(mouse.x,  mouse.y);
  Object* osurvol = Object.GetAtScreenXY(mouse.x,  mouse.y);
  Character* csurvol = Character.GetAtScreenXY(mouse.x,  mouse.y);
  InventoryItem* isurvol = InventoryItem.GetAtScreenXY(mouse.x, mouse.y);
 
  if (player.ActiveInventory != null) Mouse.Mode = eModeUseinv;
  else if (hsurvol != hotspot[0]) Mouse.Mode = eModeInteract;
  else if (osurvol != null) Mouse.Mode = eModeInteract;
  else if (csurvol != null) Mouse.Mode = eModeInteract;
  else if (isurvol != null) Mouse.Mode = eModeInteract;
  else Mouse.Mode = eModeWalkto;
}

//----------------------------------------------------------------------------------------------------
// repeatedly_execute_always
//----------------------------------------------------------------------------------------------------
function repeatedly_execute_always() 
{
}

//----------------------------------------------------------------------------------------------------
// on_key_press
//----------------------------------------------------------------------------------------------------
function on_key_press(eKeyCode keycode) 
{
  if (IsGamePaused()) keycode = 0;
  
  // "System Keys"
  if (keycode == eKeyCtrlQ) QuitGame(1); // Ctrl-Q
  if (keycode == eKeyF9) RestartGame(); // F9
  if (keycode == eKeyF12) SaveScreenShot("scrnshot.pcx");
  if (keycode == eKeyI) {
  if (gInventoryBar.Visible) gInventoryBar.Visible=false;
  else {
  gInventoryBar.Visible=true;
  gPause.Visible=false;
  }
  }
  if (keycode == eKeyEscape) {
    if (gPause.Visible) gPause.Visible=false;
    else {
      gInventoryBar.Visible=false;
      gPause.Visible=true;
    }
  }

  // Debugger Keys
  if (keycode == eKeyCtrlS) Debug(0,0); // Ctrl-S, give all inventory
  if (keycode == eKeyCtrlV) Debug(1,0); // Ctrl-V, version
  if (keycode == eKeyCtrlA) Debug(2,0); // Ctrl-A, show walkable areas
  if (keycode == eKeyCtrlX) Debug(3,0); // Ctrl-X, teleport to room
}

//----------------------------------------------------------------------------------------------------
// on_mouse_click
//----------------------------------------------------------------------------------------------------
function on_mouse_click(MouseButton button)
{
	// all mouse clicks are handled in TwoClickHandler.asc!
}

//----------------------------------------------------------------------------------------------------
// dialog_request
//----------------------------------------------------------------------------------------------------
function dialog_request(int param) 
{
}


//----------------------------------------------------------------------------------------------------
// gTitle
//----------------------------------------------------------------------------------------------------

function bNewgame_OnClick(GUIControl *control, MouseButton button)
{
player.ChangeRoom(1, 600, 920, eDirectionDownRight);
}

function bLoad1_OnClick(GUIControl *control, MouseButton button)
{
gTitle.Visible=false;
gLoad.Visible=true;
}

function bQuit1_OnClick(GUIControl *control, MouseButton button)
{
QuitGame(0);
}

//----------------------------------------------------------------------------------------------------
// gPause
//----------------------------------------------------------------------------------------------------

function bCommandes_OnClick(GUIControl *control, MouseButton button)
{
gPause.Visible=false;
gControl.Visible=true;
}

function bSave_OnClick(GUIControl *control, MouseButton button)
{
gPause.Visible=false;
gSave.Visible=true;
}

function bReturnTitle_OnClick(GUIControl *control, MouseButton button)
{
gPause.Visible=false;
gConfirm.Visible=true;
}

//----------------------------------------------------------------------------------------------------
// gSave
//----------------------------------------------------------------------------------------------------

function bSaveSlot1_OnClick(GUIControl *control, MouseButton button)
{
gSave.Visible=false;  
buttonSprite1=DynamicSprite.CreateFromSaveGame(1, 200, 120);
if (buttonSprite1 != null) {
bScreenSlot1.NormalGraphic=buttonSprite1.Graphic;
SaveGameSlot(1, "Save 1");
gSave.Visible=true;
}
}

function bSaveSlot2_OnClick(GUIControl *control, MouseButton button)
{
gSave.Visible=false;
buttonSprite2=DynamicSprite.CreateFromSaveGame(2, 200, 120);
if (buttonSprite2 != null) {
bScreenSlot2.NormalGraphic=buttonSprite2.Graphic;
SaveGameSlot(2, "Save 2");
gSave.Visible=true;
}
}

function bSaveSlot3_OnClick(GUIControl *control, MouseButton button)
{
gSave.Visible=false;
buttonSprite3=DynamicSprite.CreateFromSaveGame(3, 200, 120);
if (buttonSprite3 != null) {
bScreenSlot3.NormalGraphic=buttonSprite3.Graphic;
SaveGameSlot(3, "Save 3");
gSave.Visible=true;
}
}

function bCloseSave_OnClick(GUIControl *control, MouseButton button)
{
gSave.Visible=false;
}


//----------------------------------------------------------------------------------------------------
// gLoad
//----------------------------------------------------------------------------------------------------

function bCloseLoad_OnClick(GUIControl *control, MouseButton button)
{
gLoad.Visible=false;
}

//----------------------------------------------------------------------------------------------------
// gControl
//----------------------------------------------------------------------------------------------------

function bQuitControl_OnClick(GUIControl *control, MouseButton button)
{
gControl.Visible=false;
gPause.Visible=true;
}

//----------------------------------------------------------------------------------------------------
// gConfirm
//----------------------------------------------------------------------------------------------------

//----------------------------------------------------------------------------------------------------
// gInventoryBar
//----------------------------------------------------------------------------------------------------
function btnInvScrollLeft_OnClick(GUIControl *control, MouseButton button)
{
	InventoryWindow1.ScrollDown();
}

function btnInvScrollRight_OnClick(GUIControl *control, MouseButton button)
{
	InventoryWindow1.ScrollUp();
}

//----------------------------------------------------------------------------------------------------
// unhandled_event
//----------------------------------------------------------------------------------------------------

function cSuli_Look()
{
player.Say("C'est moi.");
}

function cSuli_Interact()
{
player.Say("Hé ! Arrête, ça chatouille !");
}






Khris

Add this function to the very top of the script:

Code: ags
function ShowSaveGUI() {
  // prepare gSave
  buttonSprite1 = DynamicSprite.CreateFromSaveGame(1, 200, 120);
  if (buttonSprite1 != null) bScreenSlot1.NormalGraphic = buttonSprite1.Graphic;
  buttonSprite2 = DynamicSprite.CreateFromSaveGame(2, 200, 120);
  if (buttonSprite2 != null) bScreenSlot2.NormalGraphic = buttonSprite2.Graphic;
  buttonSprite3 = DynamicSprite.CreateFromSaveGame(3, 200, 120);
  if (buttonSprite3 != null) bScreenSlot3.NormalGraphic = buttonSprite3.Graphic;
  // show it
  gSave.Visible = true;
}


Use this for bSave, the button that opens the Save GUI:

Code: ags
function bSave_OnClick(GUIControl *control, MouseButton button)
{
  gPause.Visible = false;
  ShowSaveGUI();
}


As for the three savegame buttons, they should do this (code for button 1 shown here):

Code: ags
function bSaveSlot1_OnClick(GUIControl *control, MouseButton button)
{
  gSave.Visible = false;  
  SaveGameSlot(1, "Save 1");  // gets queued, only runs after function has finished 
  SetTimer(1, 2);   // schedules displaying the save GUI, which should show the new screenshot
}


Now add this block to your repeatedly_execute:
Code: ags
  if (IsTimerExpired(1)) ShowSaveGUI();


Not tested.

Cookie_Wood

Good lord, Kris, you're a super hero. It works great. There's only one thing that I had to change.

I had to put this into the globalscript header.ash to work. It didn't work if i put it into the globalscript.asc (token showsaveGUI unknown) But it's cleary written "do not put any function here" so... what do I risk ?

Code: ags
function ShowSaveGUI() {
  // prepare gSave
  buttonSprite1 = DynamicSprite.CreateFromSaveGame(1, 200, 120);
  if (buttonSprite1 != null) bScreenSlot1.NormalGraphic = buttonSprite1.Graphic;
  buttonSprite2 = DynamicSprite.CreateFromSaveGame(2, 200, 120);
  if (buttonSprite2 != null) bScreenSlot2.NormalGraphic = buttonSprite2.Graphic;
  buttonSprite3 = DynamicSprite.CreateFromSaveGame(3, 200, 120);
  if (buttonSprite3 != null) bScreenSlot3.NormalGraphic = buttonSprite3.Graphic;
  // show it
  gSave.Visible = true;
}


Thank you so much for your help <3

Snarky

Put the function in the script, but put an "import" in the header â€" this makes it available to room scripts:

Code: ags
import function ShowSaveGUI()

Khris

Do what Snarky said if you need to call the function from a room script.

If not, I suspect you may have missed this part:
Quote from: Khris on Fri 11/01/2019 13:28:26
Add this function to the very top of the script:

Functions have to be declared before they are called; "before" here means "further up the script". Since you added a call to ShowSaveGUI() to repeatedly_execute which is pretty far up the script, you need to make sure that the ShowSaveGUI function declaration is above the repeatedly_execute function declaration.

Cookie_Wood

Thank you so much to all of you ! Kris, Cassiebsg and Snarky ! It's totally perfect now.  :-D


Cookie_Wood

#19
Hi :D

Just coming one very last time on that topic (i promise :D)

I just have one last problem with my Save and Load GUI. My dynamic sprites have a curious behaviour when it comes to delete them. I added 3 little trashbins on my GUI, to delete the saveslot, the screenshot that you guys kindly helped me with and finally a little Date and time label.

It is very weird, but when I try to delete the first ou second save, the 3rd screenshot just "slip" into the 1st screenshot button position !






This is what Khris helped me to do (sorry i misspelled your name last time Khris) + date and time label

Code: ags

DynamicSprite *buttonSprite1;
DynamicSprite *buttonSprite2;
DynamicSprite *buttonSprite3;

DynamicSprite *buttonSpriteLoad1;
DynamicSprite *buttonSpriteLoad2;
DynamicSprite *buttonSpriteLoad3;


function ShowSaveGUI()
{
  // prepare gSave
  buttonSprite1 = DynamicSprite.CreateFromSaveGame(1, 150, 90); 
  if (buttonSprite1 != null) {
  
  bScreenSlot1.NormalGraphic = buttonSprite1.Graphic;
  
  lblDateSave1.Text = Game.GetSaveSlotDescription(1);
  lblDateSave1.TextColor = 3;
  
  }
  
  buttonSprite2 = DynamicSprite.CreateFromSaveGame(2, 150, 90);
  if (buttonSprite2 != null) {
    
  bScreenSlot2.NormalGraphic = buttonSprite2.Graphic;
  
  lblDateSave2.Text = Game.GetSaveSlotDescription(2);
  lblDateSave2.TextColor = 3;
  
  }
  
  
  buttonSprite3 = DynamicSprite.CreateFromSaveGame(3, 150, 90);
  if (buttonSprite3 != null) {
    
  bScreenSlot3.NormalGraphic = buttonSprite3.Graphic;
  
  lblDateSave3.Text = Game.GetSaveSlotDescription(3);
  lblDateSave3.TextColor = 3;

  }

  // show it
  gSave.Visible = true;
}

function ShowLoadGUI()
{
buttonSpriteLoad1 = DynamicSprite.CreateFromSaveGame(1, 150, 90);
if (buttonSpriteLoad1 != null) {
  
  bScreenLoadSlot1.NormalGraphic = buttonSpriteLoad1.Graphic;
  
  lblDateLoad1.Text = Game.GetSaveSlotDescription(1);
  lblDateLoad1.TextColor = 3;
}

buttonSpriteLoad2 = DynamicSprite.CreateFromSaveGame(2, 150, 90);
if (buttonSpriteLoad2 != null) {
  
  bScreenLoadSlot2.NormalGraphic = buttonSpriteLoad2.Graphic;
  
  lblDateLoad2.Text = Game.GetSaveSlotDescription(2);
  lblDateLoad2.TextColor = 3;
}

buttonSpriteLoad3 = DynamicSprite.CreateFromSaveGame(3, 150, 90);
if (buttonSpriteLoad3 != null) {
  
  bScreenLoadSlot3.NormalGraphic = buttonSpriteLoad3.Graphic;
  
  lblDateLoad3.Text = Game.GetSaveSlotDescription(3);
  lblDateLoad3.TextColor = 3;
}
gLoad.Visible = true;
}


Saving or deleting saveslots by clicking on the portrait or the trashbin (and then openning the "confirm gui" before deleting)

Code: ags

//----------------------------------------------------------------------------------------------------
// gSave
//----------------------------------------------------------------------------------------------------


function bSaveSlot1_OnClick(GUIControl *control, MouseButton button)
{
 gSave.Visible = false;
 DateTime *dt = DateTime.Now;
 SaveGameSlot(1, String.Format("%02d/%02d/%04d - %02d:%02d:%02d", dt.DayOfMonth, dt.Month, dt.Year, dt.Hour, dt.Minute, dt.Second));
 lblDateSave1.Visible=true; //////// attention new
 lblDateLoad1.Visible=true;
 Overlay *textOverlaySaving;
 textOverlaySaving = Overlay.CreateTextual(800, 300, 400, eFontfntSpeech, 3, "Partie sauvegardée !");
 Wait(50);
 }



function bSaveSlot2_OnClick(GUIControl *control, MouseButton button)
{
 gSave.Visible = false;  
 DateTime *dt = DateTime.Now;
 SaveGameSlot(2, String.Format("%02d/%02d/%04d - %02d:%02d:%02d", dt.DayOfMonth, dt.Month, dt.Year, dt.Hour, dt.Minute, dt.Second));
 lblDateSave2.Visible=true; //////// attention new
 lblDateLoad2.Visible=true;
 Overlay *textOverlaySaving;
 textOverlaySaving = Overlay.CreateTextual(800, 300, 400, eFontfntSpeech, 3, "Partie sauvegardée !");
 Wait(50);
}

function bSaveSlot3_OnClick(GUIControl *control, MouseButton button)
{
 gSave.Visible = false;  
 DateTime *dt = DateTime.Now;
 SaveGameSlot(3, String.Format("%02d/%02d/%04d - %02d:%02d:%02d", dt.DayOfMonth, dt.Month, dt.Year, dt.Hour, dt.Minute, dt.Second));
 lblDateSave3.Visible=true; //////// attention new
 lblDateLoad3.Visible=true;
 Overlay *textOverlaySaving;
 textOverlaySaving = Overlay.CreateTextual(800, 300, 400, eFontfntSpeech, 3, "Partie sauvegardée !");
 Wait(50);
}

function bCloseSave_OnClick(GUIControl *control, MouseButton button)
{
gSave.Visible=false;
}


function bSaveTrashbin1_OnClick(GUIControl *control, MouseButton button)
{
gSave.Visible=false;  
gConfirm3.Visible=true;
}

function bSaveTrashbin2_OnClick(GUIControl *control, MouseButton button)
{
gSave.Visible=false;
gConfirm4.Visible=true;
}

function bSaveTrashbin3_OnClick(GUIControl *control, MouseButton button)
{
gSave.Visible=false;
gConfirm5.Visible=true;
}


Delete the saveslot, the dynamic sprite and label when "confirm Yes"

Code: ags

//----------------------------------------------------------------------------------------------------
// gConfirm3 DeleteSave1
//----------------------------------------------------------------------------------------------------


function bYesConfirm3_OnClick(GUIControl *control, MouseButton button)
{
DeleteSaveSlot(1);
gConfirm3.Visible=false;
Overlay *textOverlaySaving;
textOverlaySaving = Overlay.CreateTextual(800, 300, 400, eFontfntSpeech, 3, "Partie supprimée !");
Wait(50);

if (buttonSprite1!= null) {
buttonSprite1.Delete();
}

if (buttonSpriteLoad1!= null) {
buttonSpriteLoad1.Delete();
}

lblDateSave1.Visible=false;
lblDateLoad1.Visible=false;
}

function bNoConfirm3_OnClick(GUIControl *control, MouseButton button)
{
gConfirm3.Visible=false;
}


Does someone see why the 3rd screenshot does not want to stay properly on the third button when trying to delete saveslot 1 or 2 ?
I hope I gave enought informations :)
Edit: it's a little bit confusing but : gConfim3 = Save1, gConfirm4= Save2 et gConfirm5 = Save3 (gConfirm 1 et 2 are used to close the game or to return to main menu)

SMF spam blocked by CleanTalk