📄 gui.cpp
字号:
/* GUI.CPP
Lots of GUI stuff.
*/
#include "Common.hpp"
#include <DOS.H>
#include <DIRECT.H>
#include <STDARG.H>
#include <IO.H>
#include <fcntl.h>
#include <errno.h>
#include "GrEngine.hpp"
#include "FileMan.hpp"
#include "GUI.hpp"
#include "CPU.hpp"
#include "SPC700.hpp"
// GUI settings
byte background = 2;
boolean escquits = true;
boolean confirmexit = true;
byte ramcheatmarker [128*1024/8]; // bit=0 when memory is ruled out
boolean msgboxesc;
struct colorset defset = {
0, 1, 0, 1,
12, 12, 0, 11,
1, 3
}, valentineset = {
7, 1, 6, 5,
8, 8, 7, 12,
11, 5
}, christmasset = {
2, 7, 7, 6,
12, 10, 5, 7,
4, 9
}, fallset = {
6, 6, 0, 7,
15, 5, 5, 1,
10, 0
}, coolset = {
1, 0, 12, 13,
11, 9, 14, 0,
6, 3
}, yellowset = {
5, 0, 14, 15,
0, 1, 15, 0,
14, 14
};
struct colorset set = defset;
// Messages
#define OPENWINDOW 0
// No arguments
#define CLOSEWINDOW 1
// No arguments
#define NEWGUIFRAME 2
// No arguments
#define CONTROLCHANGE 3
// cnum = Control that was changed; value = sub control
#define KEYPRESS 4
// cnum = control with focus; value = sub control
#define KEYRELEASE 5
// cnum = control with focus; value = sub control
#define KEYCHAR 6
// cnum = control with focus; value = sub control
#define MOUSEPRESS 7
// value = 1 if it concerns the right button; 0 for left button
#define MOUSERELEASE 8
// value = 1 if it concerns the right button; 0 for left button
struct guicontrol maincontrols [NUMMAINCONTROLS] = {
{ BUTTON, { "Return to game","","","","","" }, // 0
{ 5,0,0,0,0,0 }, { 15,0,0,0,0,0 }, 110, 15,
1, 0, 0, 0, true
},
{ BUTTON, { "Load ROM","","","","","" }, // 1
{ 5,0,0,0,0,0 }, { 32,0,0,0,0,0 }, 110, 15,
1, 0, 0, 0, true
},
{ BUTTON, { "Startup options","","","","","" }, // 2
{ 5,0,0,0,0,0 }, { 49,0,0,0,0,0 }, 110, 15,
1, 0, 0, 0, true
},
{ BUTTON, { "In-game options","","","","","" }, // 3
{ 5,0,0,0,0,0 }, { 66,0,0,0,0,0 }, 110, 15,
1, 0, 0, 0, true
},
{ BUTTON, { "Joypad settings","","","","","" }, // 4
{ 5,0,0,0,0,0 }, { 83,0,0,0,0,0 }, 110, 15,
1, 0, 0, 0, true
},
{ BUTTON, { "Cheat Codes","","","","","" }, // 5
{ 5,0,0,0,0,0 }, { 100,0,0,0,0,0 }, 110, 15,
1, 0, 0, 0, true
},
{ BUTTON, { "Save/Load","","","","","" }, // 6
{ 5,0,0,0,0,0 }, { 117,0,0,0,0,0 }, 110, 15,
1, 0, 0, 0, true
},
{ BUTTON, { "GUI settings","","","","","" }, // 7
{ 5,0,0,0,0,0 }, { 134,0,0,0,0,0 }, 110, 15,
1, 0, 0, 0, true
},
{ BUTTON, { "Quit","","","","","" }, // 8
{ 5,0,0,0,0,0 }, { 151,0,0,0,0,0 }, 94, 15,
1, 0, 0, 0, true
},
{ BUTTON, { "X","","","","","" }, // 9
{ 100,0,0,0,0,0 }, { 151,0,0,0,0,0 }, 15, 15,
1, 0, 0, 0, true
},
{ TEXT, { "Written by Qwertie","\x01 1998 [FPS:xyz]","","","","" },
{ 5,5,0,0,0,0 }, { 168,176,0,0,0,0 }, 0, 0,
2, 0, 0, 0, false
}
};
void mainwindowproc (int msg, int cnum, int v1)
{
switch (msg) {
case CONTROLCHANGE:
switch (cnum) {
case 0: returntogame = true; break;
case 1: showwindow (7); break;
case 2: showwindow (2); break;
case 3: showwindow (3); break;
case 4: showwindow (4); break;
case 5: showwindow (6); break;
case 6: showwindow (1); break;
case 7: showwindow (5); break;
case 8:
if (romloaded && romrunning && confirmexit)
messagebox ("ESC Cancels Quit", "Are you sure you want to exit?");
else
msgboxesc = false;
if (!msgboxesc) {
killwindow (0);
quitemu = true;
}
break;
case 9:
if (confirmexit)
messagebox ("ESC Cancels Quit", "Exit without saving SRAM?");
else
msgboxesc = false;
if (!msgboxesc) {
loadsram ();
killwindow (0);
quitemu = true;
}
break;
}
case NEWGUIFRAME:
if (curgsnum == 0) {
maincontrols[0].disabled = true;
maincontrols[2].disabled = true;
maincontrols[3].disabled = true;
maincontrols[5].disabled = true;
maincontrols[9].disabled = true;
} else {
maincontrols[0].disabled = false;
maincontrols[2].disabled = false;
maincontrols[3].disabled = false;
maincontrols[5].disabled = false;
maincontrols[9].disabled = false;
}
break;
}
defwindowproc (mainwindow, msg, cnum, v1);
}
struct guiwindow mainwindow = {
"SNEqr: Main Menu",
maincontrols, mainwindowproc,
NUMMAINCONTROLS,
false, 10, 44, 120, 190
};
struct guicontrol slc [NUMSAVELOADCONTROLS] = {
{ BUTTON, { "Save","Load","","","","" }, // Slot 1
{ 50,80,0,0,0,0 }, { 15,15,0,0,0,0 }, 30, 12,
2, 0, 0, 0, false
},
{ BUTTON, { "Save","Load","","","","" }, // Slot 2
{ 50,80,0,0,0,0 }, { 27,27,0,0,0,0 }, 30, 12,
2, 0, 0, 0, false
},
{ BUTTON, { "Save","Load","","","","" }, // Slot 3
{ 50,80,0,0,0,0 }, { 39,39,0,0,0,0 }, 30, 12,
2, 0, 0, 0, false
},
{ BUTTON, { "Save","Load","","","","" }, // Slot 4
{ 50,80,0,0,0,0 }, { 51,51,0,0,0,0 }, 30, 12,
2, 0, 0, 0, false
},
{ BUTTON, { "Save","Load","","","","" }, // Slot 5
{ 50,80,0,0,0,0 }, { 63,63,0,0,0,0 }, 30, 12,
2, 0, 0, 0, false
},
{ BUTTON, { "Save","Load","","","","" }, // Slot 6
{ 50,80,0,0,0,0 }, { 75,75,0,0,0,0 }, 30, 12,
2, 0, 0, 0, false
},
{ BUTTON, { "Save","Load","","","","" }, // Slot 7
{ 50,80,0,0,0,0 }, { 87,87,0,0,0,0 }, 30, 12,
2, 0, 0, 0, false
},
{ BUTTON, { "Save","Load","","","","" }, // Slot 8
{ 50,80,0,0,0,0 }, { 99,99,0,0,0,0 }, 30, 12,
2, 0, 0, 0, false
},
{ BUTTON, { "Save","Load","","","","" }, // Slot 9
{ 50,80,0,0,0,0 }, { 111,111,0,0,0,0 }, 30, 12,
2, 0, 0, 0, false
},
{ BUTTON, { "Save","Load","","","","" }, // Slot 0
{ 50,80,0,0,0,0 }, { 123,123,0,0,0,0 }, 30, 12,
2, 0, 0, 0, false
},
{ TEXT, { "Slot #1","Slot #2","Slot #3","Slot #4","Slot #5","" },
{ 5,5,5,5,5,0 }, { 18,30,42,54,66,0 }, 0, 0,
5, 0, 0, 0, false
},
{ TEXT, { "Slot #6","Slot #7","Slot #8","Slot #9","Slot #0","" },
{ 5,5,5,5,5,0 }, { 78,90,102,114,126,0 }, 0, 0,
5, 0, 0, 0, false
},
{ CHECK, { "Auto-backtrack (F10)","","","","","" },
{ 115,0,0,0,0,0 }, { 15,0,0,0,0,0 }, 0, 0,
1, 0, 0, 0, false
},
{ TEXT, { "Time","SRAM save directory","Instant save directory","Screen shot directory","Number","" },
{ 123,115,115,115,123,0 }, { 25,44,64,84,33,0 }, 30, 11,
5, 0, 0, 0, false
},
{ SLIDER, { " sec.","","","","","" },
{ 150,0,0,0,0,0 }, { 23,0,0,0,0,0 }, 50, 0,
0, 4, 120, 1, false
},
{ SLIDER, { "x","","","","","" },
{ 160,0,0,0,0,0 }, { 33,0,0,0,0,0 }, 40, 0,
1, 1, 9, 1, false
},
{ INPUT, { "\0SR2345678901234567890123456789012345678901234567890123456789","","","","","" }, // SRAM save dir
{ 115,0,0,0,0,0 }, { 52,0,0,0,0,0 }, 125, 11,
1, 0, 60, 0, false
},
{ INPUT, { "\0\0I2345678901234567890123456789012345678901234567890123456789","","","","","" }, // Instant save dir
{ 115,0,0,0,0,0 }, { 72,0,0,0,0,0 }, 125, 11,
1, 0, 60, 0, false
},
{ INPUT, { "\0SS12345678901234567890123456789012345678901234567890123456789","","","","","" }, // Screen shot dir
{ 115,0,0,0,0,0 }, { 92,0,0,0,0,0 }, 125, 11,
1, 0, 60, 0, false
},
{ TEXT, { "SRAM","PCX Snapshot","","","","" },
{ 145,145,0,0,0,0 }, { 117,129,0,0,0,0 }, 0, 0,
2, 0, 0, 0, false
},
{ CHECK, { "Disallow hotkeys F5/F7","","","","","" },
{ 115,0,0,0,0,0 }, { 105,0,0,0,0,0 }, 0, 0,
1, 0, 0, 0, false
},
{ BUTTON, { "Save","Reload","","","","" }, // SRAM
{ 180,210,0,0,0,0 }, { 114,114,0,0,0,0 }, 30, 12,
2, 0, 0, 0, false
},
{ BUTTON, { "Save","","","","","" }, // PCX Snapshot
{ 210,0,0,0,0,0 }, { 126,0,0,0,0,0 }, 30, 12,
1, 0, 0, 0, false
}
};
void saveloadwindowproc (int msg, int cnum, int v1)
{
const static int cautoback = 12, cbacktime = 14, cbacknum = 15, csramdir = 16, cinstdir = 17, csshotdir = 18, cdisallow = 20, csramsaveload = 21, csshotsave = 22;
int x;
switch (msg) {
case OPENWINDOW:
strcpy (slc[csramdir].text[0], sramdir);
strcpy (slc[cinstdir].text[0], instdir);
strcpy (slc[csshotdir].text[0],sshotdir);
break;
case NEWGUIFRAME:
strcpy (sramdir, slc[csramdir].text[0]);
strcpy (instdir, slc[cinstdir].text[0]);
strcpy (sshotdir,slc[csshotdir].text[0]);
trimfilespec (sramdir);
trimfilespec (instdir);
trimfilespec (sshotdir);
slc[cautoback].choice = autobacktrack;
slc[cbacktime].choice = backtracktime;
slc[cbacknum].choice = backtracknum;
slc[cdisallow].choice = disallowinst;
if (curgsnum == 0) {
for (x = 0; x < 10; x++)
slc[x].disabled = true;
slc[csramsaveload].disabled = true;
} else {
for (x = 0; x < 10; x++)
slc[x].disabled = false;
slc[csramsaveload].disabled = false;
}
break;
case CONTROLCHANGE:
autobacktrack = slc[cautoback].choice;
backtracktime = slc[cbacktime].choice;
if (backtracknum != slc[cbacknum].choice) {
backtracknum = slc[cbacknum].choice;
alloc_autobacktrack (backtracknum);
}
disallowinst = slc[cdisallow].choice;
if (cnum < 10) {
if (v1 == 0 && !romrunning) {
messagebox ("Instant Save", "Can't save game when it isn't running.");
} else if (v1 == 0) {
if (cnum == 9) x = instantsave (0);
else x = instantsave (cnum + 1);
if (x != OKAY)
messagebox ("Instant Save", "Unable to save game state.");
} else if (v1 == 1 && !romloaded) {
messagebox ("Instant Load", "Can't load state when no ROM is loaded.");
} else if (v1 == 1) {
if (cnum == 9) x = instantload (0);
else x = instantload (cnum + 1);
if (x != OKAY)
messagebox ("Instant Load", "Unable to load game state.");
}
}
if (cnum == csramsaveload) {
if (!romloaded) {
messagebox ("SRAM Save/Load", "Error: No ROM loaded.");
} else if (v1 == 0) {
savesram ();
} else if (v1 == 1) {
loadsram ();
}
}
if (cnum == cautoback) {
if (slc[cautoback].choice == false) {
dealloc_autobacktrack();
addmessage ("Memory for auto-backtrack removed");
} else {
alloc_autobacktrack(backtracknum);
}
}
break;
}
defwindowproc (saveloadwindow, msg, cnum, v1);
}
struct guiwindow saveloadwindow = {
"Save/Load",
slc, saveloadwindowproc,
NUMSAVELOADCONTROLS,
false, 40, 10, 247, 143
};
struct guicontrol suc [NUMSTARTUPCONTROLS] = {
{ RADIO, { "Auto","HiROM","LoROM","","","" },
{ 5,45,85,0,0,0 }, { 15,15,15,0,0,0 }, 0, 0,
3, 0, 0, 0, false
},
{ RADIO, { "Auto","NTSC","PAL","","","" },
{ 5,45,85,0,0,0 }, { 25,25,25,0,0,0 }, 0, 0,
3, 0, 0, 0, false
},
{ CHECK, { "Interleaved format (ND)","","","","","" },
{ 13,0,0,0,0,0 }, { 35,0,0,0,0,0 }, 0, 0,
1, 0, 0, 0, false
},
{ RADIO, { "Emulate sound processor (ND)","SPC Skip","","","","" },
{ 5,5,0,0,0,0 }, { 45,73,0,0,0,0 }, 0, 0,
2, 0, 0, 0, false
},
{ SLIDER, { " KHz","","","","","" },
{ 13,0,0,0,0,0 }, { 54,0,0,0,0,0 }, 70, 0,
0, 8, 44, 1, false
},
{ CHECK, { "Stereo","","","","","" },
{ 13,0,0,0,0,0 }, { 63,0,0,0,0,0 }, 0, 0,
1, 0, 0, 0, false
},
{ TEXT, { "Method:","","","","","" },
{ 50,0,0,0,0,0 }, { 73,0,0,0,0,0 }, 0, 0,
1, 0, 0, 0, false
},
{ SLIDER, { "","","","","","" },
{ 85,0,0,0,0,0 }, { 73,0,0,0,0,0 }, 30, 0,
1, 0, 1, 1, false
},
{ BUTTON, { "Reset Game","","","","","" },
{ 50,0,0,0,0,0 }, { 82,0,0,0,0,0 }, 80, 13,
1, 0, 0, 0, false
},
{ CHECK, { "Ignore FastROM flag","","","","","" },
{ 5,0,0,0,0,0 }, { 98,0,0,0,0,0 }, 0, 0,
1, 0, 0, 0, false
}
};
void startupwindowproc (int msg, int cnum, int v1)
{
const static int cforcerom = 0, cforcecountry = 1, cinterleaved = 2, csound = 3, ckhz = 4, cstereo = 5, cskipmethod = 7, creset = 8, cignorefastrom = 9;
switch (msg) {
case OPENWINDOW:
strcpy (startupwindow.title+9, curgs->filename);
break;
case NEWGUIFRAME:
suc[cforcerom].choice = curgs->forcerom;
suc[cforcecountry].choice = curgs->forcecountry;
suc[cinterleaved].choice = false;
suc[cinterleaved].disabled = true;
suc[csound].choice = 1;
suc[csound].disabled = true;
suc[ckhz].choice = soundkhz;
suc[cstereo].choice = stereosound;
suc[cskipmethod].choice = curgs->spcskipmethod;
suc[cignorefastrom].choice = curgs->ignorefastrom;
break;
case CONTROLCHANGE:
curgs->forcerom = suc[cforcerom].choice;
curgs->forcecountry = suc[cforcecountry].choice;
curgs->interleaved = suc[cinterleaved].choice;
curgs->emulatespc = !suc[csound].choice;
soundkhz = suc[ckhz].choice;
stereosound = suc[cstereo].choice;
curgs->spcskipmethod = suc[cskipmethod].choice;
curgs->ignorefastrom = suc[cignorefastrom].choice;
if (cnum == creset) {
resetsystem (true); // warm boot
}
break;
}
defwindowproc (startupwindow, msg, cnum, v1);
}
struct guiwindow startupwindow = {
"Startup: [?]",
suc, startupwindowproc,
NUMSTARTUPCONTROLS,
false, 40, 10, 135, 110
};
struct guicontrol igc [NUMINGAMECONTROLS] = {
{ RADIO, { "Skip frames","Auto-regulate","","","","" },
{ 5,80,0,0,0,0 }, { 15,15,0,0,0,0 }, 0, 0,
2, 0, 0, 0, false
},
{ SLIDER, { " fr.","","","","","" },
{ 13,0,0,0,0,0 }, { 25,0,0,0,0,0 }, 45, 0,
0, 0, 9, 1, false
},
{ SLIDER, { "%","","","","","" },
{ 88,0,0,0,0,0 }, { 25,0,0,0,0,0 }, 50, 0,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -