⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gui.cpp

📁 SNES game emulator. C and asm files.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*	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 + -