diff options
| author | Paul Gilbert | 2019-07-03 22:22:13 -0700 | 
|---|---|---|
| committer | Paul Gilbert | 2019-07-06 15:27:09 -0700 | 
| commit | c5214f6d349df9bc4ec088bbbca3543e47b22744 (patch) | |
| tree | 3efa78f8063858233d7a1fcc85ee35316f2b4a52 | |
| parent | b634a97f41877b233a654dc204a2c9760f9ad2f6 (diff) | |
| download | scummvm-rg350-c5214f6d349df9bc4ec088bbbca3543e47b22744.tar.gz scummvm-rg350-c5214f6d349df9bc4ec088bbbca3543e47b22744.tar.bz2 scummvm-rg350-c5214f6d349df9bc4ec088bbbca3543e47b22744.zip  | |
GLK: ALAN3: Making GlkIO base class
| -rw-r--r-- | engines/glk/alan3/alan3.cpp | 30 | ||||
| -rw-r--r-- | engines/glk/alan3/alan3.h | 5 | ||||
| -rw-r--r-- | engines/glk/alan3/debug.cpp | 2 | ||||
| -rw-r--r-- | engines/glk/alan3/glkio.cpp | 109 | ||||
| -rw-r--r-- | engines/glk/alan3/glkio.h | 54 | ||||
| -rw-r--r-- | engines/glk/alan3/inter.cpp | 6 | ||||
| -rw-r--r-- | engines/glk/alan3/output.cpp | 22 | ||||
| -rw-r--r-- | engines/glk/alan3/scan.cpp | 8 | ||||
| -rw-r--r-- | engines/glk/alan3/utils.cpp | 6 | 
9 files changed, 136 insertions, 106 deletions
diff --git a/engines/glk/alan3/alan3.cpp b/engines/glk/alan3/alan3.cpp index 52a6e25739..990874ee58 100644 --- a/engines/glk/alan3/alan3.cpp +++ b/engines/glk/alan3/alan3.cpp @@ -29,7 +29,6 @@  #include "glk/alan3/save.h"  #include "glk/alan3/syserr.h"  #include "common/system.h" -#include "common/config-manager.h"  #include "common/translation.h"  #include "common/error.h"  #include "common/scummsys.h" @@ -42,8 +41,8 @@ namespace Alan3 {  Alan3 *g_vm = nullptr; -Alan3::Alan3(OSystem *syst, const GlkGameDescription &gameDesc) : GlkAPI(syst, gameDesc), -	vm_exited_cleanly(false), _saveSlot(-1), _pendingLook(false) { +Alan3::Alan3(OSystem *syst, const GlkGameDescription &gameDesc) : GlkIO(syst, gameDesc), +	vm_exited_cleanly(false), _pendingLook(false) {  	g_vm = this;  	// main @@ -87,29 +86,14 @@ void Alan3::runGame() {  }  bool Alan3::initialize() { +	if (!GlkIO::initialize()) +		syserr("FATAL ERROR: Cannot open initial window"); +  	// Set up adventure name  	_advName = getFilename();  	if (_advName.size() > 4 && _advName[_advName.size() - 4] == '.')  		_advName = Common::String(_advName.c_str(), _advName.size() - 4); -	// first, open a window for error output -	glkMainWin = g_vm->glk_window_open(0, 0, 0, wintype_TextBuffer, 0); -	if (glkMainWin == nullptr) -		syserr("FATAL ERROR: Cannot open initial window"); - -	g_vm->glk_stylehint_set(wintype_TextGrid, style_User1, stylehint_ReverseColor, 1); -	glkStatusWin = g_vm->glk_window_open(glkMainWin, winmethod_Above | -	                                     winmethod_Fixed, 1, wintype_TextGrid, 0); -	g_vm->glk_set_window(glkMainWin); - -	// Set up the code file to point to the already opened game file -	codfil = &_gameFile; - -	if (_gameFile.size() < 8) { -	    GUIErrorMessage(_("This is too short to be a valid Alan3 file.")); -	    return false; -	} -  	// In Alan 3, the text data comes from the adventure file itself  	Common::File *txt = new Common::File();  	if (!txt->open(getFilename())) { @@ -119,8 +103,8 @@ bool Alan3::initialize() {  	}  	textFile = txt; -	// Check for a save being loaded directly from the launcher -	_saveSlot = ConfMan.hasKey("save_slot") ? ConfMan.getInt("save_slot") : -1; +	// Set up the code file to point to the already opened game file +	codfil = &_gameFile;  	return true;  } diff --git a/engines/glk/alan3/alan3.h b/engines/glk/alan3/alan3.h index 73a9a03d0b..ffb6282ece 100644 --- a/engines/glk/alan3/alan3.h +++ b/engines/glk/alan3/alan3.h @@ -23,7 +23,7 @@  #ifndef GLK_ALAN3  #define GLK_ALAN3 -#include "glk/glk_api.h" +#include "glk/alan3/glkio.h"  namespace Glk {  namespace Alan3 { @@ -31,11 +31,10 @@ namespace Alan3 {  /**   * Alan3 game interpreter   */ -class Alan3 : public GlkAPI { +class Alan3 : public GlkIO {  public:  	bool vm_exited_cleanly;  	Common::String _advName; -	int _saveSlot;  	bool _pendingLook;  private:  	/** diff --git a/engines/glk/alan3/debug.cpp b/engines/glk/alan3/debug.cpp index 94f5bb4a96..4705010829 100644 --- a/engines/glk/alan3/debug.cpp +++ b/engines/glk/alan3/debug.cpp @@ -742,7 +742,7 @@ static void readCommand(CONTEXT, char buf[], size_t maxLen) {  	do {  		output("adbg> "); -		FUNC2(readline, flag, buf, maxLen) +		FUNC2(g_io->readLine, flag, buf, maxLen)  		if (!flag) {  			newline();  			quitGame(); diff --git a/engines/glk/alan3/glkio.cpp b/engines/glk/alan3/glkio.cpp index ccf2a6716d..15c3278916 100644 --- a/engines/glk/alan3/glkio.cpp +++ b/engines/glk/alan3/glkio.cpp @@ -26,17 +26,38 @@  #include "glk/alan3/instance.h"  #include "glk/alan3/options.h"  #include "glk/alan3/output.h" +#include "common/config-manager.h"  namespace Glk {  namespace Alan3 { -winid_t glkMainWin; -winid_t glkStatusWin; -bool onStatusLine; +GlkIO *g_io; -void glkio_printf(const char *fmt, ...) { +GlkIO::GlkIO(OSystem *syst, const GlkGameDescription &gameDesc) : GlkAPI(syst, gameDesc), +		glkMainWin(nullptr), glkStatusWin(nullptr), onStatusLine(false), _saveSlot(-1) { +	g_io = this; +} + +bool GlkIO::initialize() { +	// first, open a window for error output +	glkMainWin = glk_window_open(0, 0, 0, wintype_TextBuffer, 0); +	if (glkMainWin == nullptr) +		return false; + +	glk_stylehint_set(wintype_TextGrid, style_User1, stylehint_ReverseColor, 1); +	glkStatusWin = glk_window_open(glkMainWin, winmethod_Above | +		winmethod_Fixed, 1, wintype_TextGrid, 0); +	glk_set_window(glkMainWin); + +	// Check for a save being loaded directly from the launcher +	_saveSlot = ConfMan.hasKey("save_slot") ? ConfMan.getInt("save_slot") : -1; + +	return true; +} + +void GlkIO::print(const char *fmt, ...) {  	// If there's a savegame being loaded from the launcher, ignore any text out -	if (g_vm->_saveSlot != -1) +	if (_saveSlot != -1)  		return;  	va_list argp; @@ -44,7 +65,7 @@ void glkio_printf(const char *fmt, ...) {  	if (glkMainWin) {  		char buf[1024]; /* FIXME: buf size should be foolproof */  		vsprintf(buf, fmt, argp); -		g_vm->glk_put_string(buf); +		glk_put_string(buf);  	} else {  		// assume stdio is available in this case only  		Common::String str = Common::String::vformat(fmt, argp); @@ -54,54 +75,54 @@ void glkio_printf(const char *fmt, ...) {  	va_end(argp);  } -void showImage(int image, int align) { +void GlkIO::showImage(int image, int align) {  	uint ecode; -	if ((g_vm->glk_gestalt(gestalt_Graphics, 0) == 1) && -		(g_vm->glk_gestalt(gestalt_DrawImage, wintype_TextBuffer) == 1)) { -		g_vm->glk_window_flow_break(glkMainWin); +	if ((glk_gestalt(gestalt_Graphics, 0) == 1) && +		(glk_gestalt(gestalt_DrawImage, wintype_TextBuffer) == 1)) { +		glk_window_flow_break(glkMainWin);  		printf("\n"); -		ecode = g_vm->glk_image_draw(glkMainWin, image, imagealign_MarginLeft, 0); +		ecode = glk_image_draw(glkMainWin, image, imagealign_MarginLeft, 0);  		(void)ecode;  	}  } -void playSound(int sound) { +void GlkIO::playSound(int sound) {  #ifdef GLK_MODULE_SOUND  	static schanid_t soundChannel = NULL; -	if (g_vm->glk_gestalt(gestalt_Sound, 0) == 1) { +	if (glk_gestalt(gestalt_Sound, 0) == 1) {  		if (soundChannel == NULL) -			soundChannel = g_vm->glk_schannel_create(0); +			soundChannel = glk_schannel_create(0);  		if (soundChannel != NULL) { -			g_vm->glk_schannel_stop(soundChannel); -			(void)g_vm->glk_schannel_play(soundChannel, sound); +			glk_schannel_stop(soundChannel); +			(void)glk_schannel_play(soundChannel, sound);  		}  	}  #endif  } -void setStyle(int style) { +void GlkIO::setStyle(int style) {  	switch (style) {  	case NORMAL_STYLE: -		g_vm->glk_set_style(style_Normal); +		glk_set_style(style_Normal);  		break;  	case EMPHASIZED_STYLE: -		g_vm->glk_set_style(style_Emphasized); +		glk_set_style(style_Emphasized);  		break;  	case PREFORMATTED_STYLE: -		g_vm->glk_set_style(style_Preformatted); +		glk_set_style(style_Preformatted);  		break;  	case ALERT_STYLE: -		g_vm->glk_set_style(style_Alert); +		glk_set_style(style_Alert);  		break;  	case QUOTE_STYLE: -		g_vm->glk_set_style(style_BlockQuote); +		glk_set_style(style_BlockQuote);  		break;  	}  } -void statusline(CONTEXT) { +void GlkIO::statusLine(CONTEXT) {  	uint32 glkWidth;  	char line[100];  	int pcol = col; @@ -110,13 +131,13 @@ void statusline(CONTEXT) {  	if (glkStatusWin == NULL)  		return; -	g_vm->glk_set_window(glkStatusWin); -	g_vm->glk_window_clear(glkStatusWin); -	g_vm->glk_window_get_size(glkStatusWin, &glkWidth, NULL); +	glk_set_window(glkStatusWin); +	glk_window_clear(glkStatusWin); +	glk_window_get_size(glkStatusWin, &glkWidth, NULL);  	onStatusLine = TRUE;  	col = 1; -	g_vm->glk_window_move_cursor(glkStatusWin, 1, 0); +	glk_window_move_cursor(glkStatusWin, 1, 0);  	CALL1(sayInstance, where(HERO, /*TRUE*/ TRANSITIVE))  		// TODO Add status message1  & 2 as author customizable messages @@ -124,14 +145,14 @@ void statusline(CONTEXT) {  			sprintf(line, "Score %d(%d)/%d moves", current.score, (int)header->maximumScore, current.tick);  		else  			sprintf(line, "%d moves", current.tick); -	g_vm->glk_window_move_cursor(glkStatusWin, glkWidth - strlen(line) - 1, 0); -	g_vm->glk_put_string(line); +	glk_window_move_cursor(glkStatusWin, glkWidth - strlen(line) - 1, 0); +	glk_put_string(line);  	needSpace = FALSE;  	col = pcol;  	onStatusLine = FALSE; -	g_vm->glk_set_window(glkMainWin); +	glk_set_window(glkMainWin);  } @@ -144,32 +165,32 @@ void statusline(CONTEXT) {  */  /* TODO - length of user buffer should be used */ -bool readline(CONTEXT, char *buffer, size_t maxLen) { +bool GlkIO::readLine(CONTEXT, char *buffer, size_t maxLen) {  	event_t event;  	static bool readingCommands = FALSE;  	static frefid_t commandFileRef;  	static strid_t commandFile;  	if (readingCommands) { -		if (g_vm->glk_get_line_stream(commandFile, buffer, maxLen) == 0) { -			g_vm->glk_stream_close(commandFile, NULL); +		if (glk_get_line_stream(commandFile, buffer, maxLen) == 0) { +			glk_stream_close(commandFile, NULL);  			readingCommands = FALSE;  		} else { -			g_vm->glk_set_style(style_Input); +			glk_set_style(style_Input);  			printf(buffer); -			g_vm->glk_set_style(style_Normal); +			glk_set_style(style_Normal);  		}  	} else { -		g_vm->glk_request_line_event(glkMainWin, buffer, maxLen, 0); +		glk_request_line_event(glkMainWin, buffer, maxLen, 0);  		do { -			g_vm->glk_select(&event); -			if (g_vm->shouldQuit()) +			glk_select(&event); +			if (shouldQuit())  				LONG_JUMP0  			switch (event.type) {  			case evtype_Arrange: -				R0CALL0(statusline) +				R0CALL0(g_io->statusLine)  				break;  			default: @@ -178,14 +199,14 @@ bool readline(CONTEXT, char *buffer, size_t maxLen) {  		} while (event.type != evtype_LineInput);  		if (buffer[0] == '@') {  			buffer[event.val1] = 0; -			commandFileRef = g_vm->glk_fileref_create_by_name(fileusage_InputRecord + fileusage_TextMode, &buffer[1], 0); -			commandFile = g_vm->glk_stream_open_file(commandFileRef, filemode_Read, 0); +			commandFileRef = glk_fileref_create_by_name(fileusage_InputRecord + fileusage_TextMode, &buffer[1], 0); +			commandFile = glk_stream_open_file(commandFileRef, filemode_Read, 0);  			if (commandFile != NULL) -				if (g_vm->glk_get_line_stream(commandFile, buffer, maxLen) != 0) { +				if (glk_get_line_stream(commandFile, buffer, maxLen) != 0) {  					readingCommands = TRUE; -					g_vm->glk_set_style(style_Input); +					glk_set_style(style_Input);  					printf(buffer); -					g_vm->glk_set_style(style_Normal); +					glk_set_style(style_Normal);  				}  		} else  			buffer[event.val1] = 0; diff --git a/engines/glk/alan3/glkio.h b/engines/glk/alan3/glkio.h index 8876aec821..55c8ab6cab 100644 --- a/engines/glk/alan3/glkio.h +++ b/engines/glk/alan3/glkio.h @@ -23,30 +23,58 @@  #ifndef GLK_ALAN3_GLKIO  #define GLK_ALAN3_GLKIO -#include "glk/alan3/alan3.h" -#include "glk/alan3/jumps.h" +#include "glk/glk_api.h"  #include "glk/windows.h" +#include "glk/alan3/jumps.h"  namespace Glk {  namespace Alan3 { -extern winid_t glkMainWin; -extern winid_t glkStatusWin; -extern bool onStatusLine; +class GlkIO : public GlkAPI { +private: +	winid_t glkMainWin; +	winid_t glkStatusWin; +	int _saveSlot; +public: +	bool onStatusLine; +protected: +	/** +	 * Does initialization +	 */ +	bool initialize(); +public: +	/** +	 * Constructor +	 */ +	GlkIO(OSystem *syst, const GlkGameDescription &gameDesc); -#undef printf -#define printf glkio_printf -extern void glkio_printf(const char *, ...); +	void print(const char *, ...); + +	void showImage(int image, int align); -extern void showImage(int image, int align); +	void playSound(int sound); -extern void playSound(int sound); +	void setStyle(int style); -extern void setStyle(int style); +	void statusLine(CONTEXT); -extern void statusline(CONTEXT); +	bool readLine(CONTEXT, char *usrBuf, size_t maxLen); -extern bool readline(CONTEXT, char *usrBuf, size_t maxLen); +	void clear() { +		glk_window_clear(glkMainWin); +	} + +	void flowBreak() { +		/* Make a new paragraph, i.e one empty line (one or two newlines). */ +		if (glk_gestalt(gestalt_Graphics, 0) == 1) +			glk_window_flow_break(glkMainWin); +	} +}; + +extern GlkIO *g_io; + +#undef printf +#define printf g_io->print  } // End of namespace Alan3  } // End of namespace Glk diff --git a/engines/glk/alan3/inter.cpp b/engines/glk/alan3/inter.cpp index 002a580e4c..5ee5ea976e 100644 --- a/engines/glk/alan3/inter.cpp +++ b/engines/glk/alan3/inter.cpp @@ -559,7 +559,7 @@ void interpret(CONTEXT, Aaddr adr) {  				if (traceInstructionOption) {  					printf("STYLE \t%7ld\t\t\"", (long)style);  				} -				setStyle(style); +				g_io->setStyle(style);  				break;  			} @@ -829,14 +829,14 @@ void interpret(CONTEXT, Aaddr adr) {  				Aint align = pop(stack);  				if (traceInstructionOption)  					printf("SHOW \t%7ld, %7ld\t\t\t\t", (long)image, (long)align); -				showImage(image, align); +				g_io->showImage(image, align);  				break;  			}  			case I_PLAY: {  				Aint sound = pop(stack);  				if (traceInstructionOption)  					printf("PLAY \t%7ld\t\t\t\t", (long)sound); -				playSound(sound); +				g_io->playSound(sound);  				break;  			}  			case I_LOCATE: { diff --git a/engines/glk/alan3/output.cpp b/engines/glk/alan3/output.cpp index 405ca2e270..0d946114dc 100644 --- a/engines/glk/alan3/output.cpp +++ b/engines/glk/alan3/output.cpp @@ -78,13 +78,13 @@ static int updateColumn(int currentColumn, const char *string) {  /*======================================================================*/  void setSubHeaderStyle(void) { -	g_vm->glk_set_style(style_Subheader); +	g_io->glk_set_style(style_Subheader);  }  /*======================================================================*/  void setNormalStyle(void) { -	g_vm->glk_set_style(style_Normal); +	g_io->glk_set_style(style_Normal);  }  /*======================================================================*/ @@ -97,9 +97,7 @@ void newline(void) {  /*======================================================================*/  void para(void) { -	/* Make a new paragraph, i.e one empty line (one or two newlines). */ -	if (g_vm->glk_gestalt(gestalt_Graphics, 0) == 1) -		g_vm->glk_window_flow_break(glkMainWin); +	g_io->flowBreak();  	if (col != 1)  		newline(); @@ -110,7 +108,7 @@ void para(void) {  /*======================================================================*/  void clear(void) { -	g_vm->glk_window_clear(glkMainWin); +	g_io->clear();  } @@ -135,7 +133,7 @@ void printAndLog(const char *string) {  	char *stringPart;  	printf("%s", string); -	if (!onStatusLine && transcriptOption) { +	if (!g_io->onStatusLine && transcriptOption) {  		// TODO Is this assuming only 70-char wide windows for GLK?  		if ((int)strlen(string) > 70 - column) {  			stringCopy = strdup(string);  /* Make sure we can write NULLs */ @@ -144,16 +142,16 @@ void printAndLog(const char *string) {  				int p;  				for (p = 70 - column; p > 0 && !isspace((int)stringPart[p]); p--);  				stringPart[p] = '\0'; -				g_vm->glk_put_string_stream(logFile, stringPart); -				g_vm->glk_put_char_stream(logFile, '\n'); +				g_io->glk_put_string_stream(logFile, stringPart); +				g_io->glk_put_char_stream(logFile, '\n');  				column = 0;  				stringPart = &stringPart[p + 1];  			} -			g_vm->glk_put_string_stream(logFile, stringPart); +			g_io->glk_put_string_stream(logFile, stringPart);  			column = updateColumn(column, stringPart);  			free(stringCopy);  		} else { -			g_vm->glk_put_string_stream(logFile, string); +			g_io->glk_put_string_stream(logFile, string);  			column = updateColumn(column, string);  		}  	} @@ -442,7 +440,7 @@ bool confirm(CONTEXT, MsgKind msgno) {  	   it could be affirmative, but for now any input is NOT! */  	printMessage(msgno); -	R0FUNC2(readline, flag, buf, 80) +	R0FUNC2(g_io->readLine, flag, buf, 80)  	if (!flag)  		return TRUE;  	col = 1; diff --git a/engines/glk/alan3/scan.cpp b/engines/glk/alan3/scan.cpp index 0875acbcc6..8f3ab80cbd 100644 --- a/engines/glk/alan3/scan.cpp +++ b/engines/glk/alan3/scan.cpp @@ -135,7 +135,7 @@ static char *gettoken(char *txtBuf) {  static void getLine(CONTEXT) {  	para();  	do { -		CALL0(statusline) +		CALL0(g_io->statusLine)  		if (header->prompt) {  			anyOutput = FALSE; @@ -148,7 +148,7 @@ static void getLine(CONTEXT) {  			printAndLog("> ");  		bool flag; -		FUNC2(readline, flag, buf, 255); +		FUNC2(g_io->readLine, flag, buf, 255);  		if (!flag) {  			newline();  			quitGame(); @@ -158,8 +158,8 @@ static void getLine(CONTEXT) {  		anyOutput = FALSE;  		if (transcriptOption || logOption) {  			// TODO: Refactor out the logging to log.c? -			g_vm->glk_put_string_stream(logFile, buf); -			g_vm->glk_put_char_stream(logFile, '\n'); +			g_io->glk_put_string_stream(logFile, buf); +			g_io->glk_put_char_stream(logFile, '\n');  		}  		/* If the player input an empty command he forfeited his command */  		if (strlen(buf) == 0) { diff --git a/engines/glk/alan3/utils.cpp b/engines/glk/alan3/utils.cpp index 38176e1924..acbf8e490a 100644 --- a/engines/glk/alan3/utils.cpp +++ b/engines/glk/alan3/utils.cpp @@ -52,7 +52,7 @@ void terminate(CONTEXT, int code) {  	if (memory)  		deallocate(memory); -	g_vm->glk_exit(); +	g_io->glk_exit();  	LONG_JUMP  } @@ -75,7 +75,7 @@ void usage(const char *programName) {  	printf("    %s [<switches>] <adventure>\n\n", programName);  	printf("where the possible optional switches are:\n"); -	g_vm->glk_set_style(style_Preformatted); +	g_io->glk_set_style(style_Preformatted);  	printf("    -v       verbose mode\n");  	printf("    -l       log transcript to a file\n");  	printf("    -c       log player commands to a file\n"); @@ -84,7 +84,7 @@ void usage(const char *programName) {  	printf("    -t[<n>]  trace game execution, higher <n> gives more trace\n");  	printf("    -i       ignore version and checksum errors\n");  	printf("    -r       make regression test easier (don't timestamp, page break, randomize...)\n"); -	g_vm->glk_set_style(style_Normal); +	g_io->glk_set_style(style_Normal);  }  | 
