diff options
Diffstat (limited to 'engines/glk/jacl/utils.cpp')
-rw-r--r-- | engines/glk/jacl/utils.cpp | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/engines/glk/jacl/utils.cpp b/engines/glk/jacl/utils.cpp new file mode 100644 index 0000000000..700d64c436 --- /dev/null +++ b/engines/glk/jacl/utils.cpp @@ -0,0 +1,246 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "glk/jacl/jacl.h" +#include "glk/jacl/language.h" +#include "glk/jacl/types.h" +#include "glk/jacl/prototypes.h" + +namespace Glk { +namespace JACL { + +extern char function_name[]; + +extern struct object_type *object[]; +extern struct variable_type *variable[]; + +extern int objects; +extern int player; + +extern char game_file[]; +extern char game_path[]; +extern char prefix[]; +extern char blorb[]; +extern char bookmark[]; +extern char walkthru[]; +extern char include_directory[]; +extern char temp_directory[]; +extern char data_directory[]; +extern char temp_buffer[]; + +void eachturn() { + /* INCREMENT THE TOTAL NUMBER OF MOVES MADE AND CALL THE 'EACHTURN' + * FUNCTION FOR THE CURRENT LOCATION AND THE GLOBAL 'EACHTURN' + * FUNCTION. THESE FUNCTIONS CONTAIN ANY CODE THAT SIMULATED EVENTS + * OCCURING DUE TO THE PASSING OF TIME */ + TOTAL_MOVES->value++; + execute("+eachturn"); + strcpy(function_name, "eachturn_"); + strcat(function_name, object[HERE]->label); + execute(function_name); + execute("+system_eachturn"); + + /* SET TIME TO FALSE SO THAT NO MORE eachturn FUNCTIONS ARE EXECUTED + * UNTIL EITHER THE COMMAND PROMPT IS RETURNED TO (AND TIME IS SET + * TO TRUE AGAIN, OR IT IS MANUALLY SET TO TRUE BY A VERB THAT CALLS + * MORE THAN ONE proxy COMMAND. THIS IS BECAUSE OTHERWISE A VERB THAT + * USES A proxy COMMAND TO TRANSLATE THE VERB IS RESULT IN TWO MOVES + * (OR MORE) HAVING PASSED FOR THE ONE ACTION. */ + TIME->value = FALSE; +} + +int get_here() { + /* THIS FUNCTION RETURNS THE VALUE OF 'here' IN A SAFE, ERROR CHECKED + * WAY */ + if (player < 1 || player > objects) { + badplrrun(player); + terminate(44); + } else if (object[player]->PARENT < 1 || object[player]->PARENT > objects || object[player]->PARENT == player) { + badparrun(); + terminate(44); + } else { + return (object[player]->PARENT); + } + + /* SHOULDN'T GET HERE, JUST TRYING TO KEEP VisualC++ HAPPY */ + return 1; +} + +char *strip_return(char *string) { + /* STRIP ANY TRAILING RETURN OR NEWLINE OFF THE END OF A STRING */ + int index; + int length = strlen(string); + + for (index = 0; index < length; index++) { + switch (string[index]) { + case '\r': + case '\n': + string[index] = 0; + break; + } + } + + return (char *) string; +} + +int random_number() { + return g_vm->getRandomNumber(0x7fffffff); +} + +void create_paths(char *full_path) { + int index; + char *last_slash; + + /* SAVE A COPY OF THE SUPPLIED GAMEFILE NAME */ + strcpy(game_file, full_path); + + /* FIND THE LAST SLASH IN THE SPECIFIED GAME PATH AND REMOVE THE GAME + * FILE SUFFIX IF ANY EXISTS */ + last_slash = (char *) NULL; + + /* GET A POINTER TO THE LAST SLASH IN THE FULL PATH */ + last_slash = strrchr(full_path, DIR_SEPARATOR); + + for (index = strlen(full_path); index >= 0; index--) { + if (full_path[index] == DIR_SEPARATOR) { + /* NO '.' WAS FOUND BEFORE THE LAST SLASH WAS REACHED, + * THERE IS NO FILE EXTENSION */ + break; + } else if (full_path[index] == '.') { + full_path[index] = 0; + break; + } + } + + /* STORE THE GAME PATH AND THE GAME FILENAME PARTS SEPARATELY */ + if (last_slash == (char *) NULL) { + /* GAME MUST BE IN CURRENT DIRECTORY SO THERE WILL BE NO GAME PATH */ + strcpy(prefix, full_path); + game_path[0] = 0; + + /* THIS ADDITION OF ./ TO THE FRONT OF THE GAMEFILE IF IT IS IN THE + * CURRENT DIRECTORY IS REQUIRED TO KEEP Gargoyle HAPPY. */ +#ifdef __NDS__ + sprintf(temp_buffer, "%c%s", DIR_SEPARATOR, game_file); +#else + sprintf(temp_buffer, ".%c%s", DIR_SEPARATOR, game_file); +#endif + strcpy(game_file, temp_buffer); + } else { + /* STORE THE DIRECTORY THE GAME FILE IS IN WITH THE TRAILING + * SLASH IF THERE IS ONE */ + last_slash++; + strcpy(prefix, last_slash); + *last_slash = '\0'; + strcpy(game_path, full_path); + } + +#ifdef GLK + /* SET DEFAULT WALKTHRU FILE NAME */ + sprintf(walkthru, "%s.walkthru", prefix); + + /* SET DEFAULT SAVED GAME FILE NAME */ + sprintf(bookmark, "%s.bookmark", prefix); + + /* SET DEFAULT BLORB FILE NAME */ + sprintf(blorb, "%s.blorb", prefix); +#endif + + /* SET DEFAULT FILE LOCATIONS IF NOT SET BY THE USER IN CONFIG */ + if (include_directory[0] == 0) { + strcpy(include_directory, game_path); + strcat(include_directory, INCLUDE_DIR); + } + + if (temp_directory[0] == 0) { + strcpy(temp_directory, game_path); + strcat(temp_directory, TEMP_DIR); + } + + if (data_directory[0] == 0) { + strcpy(data_directory, game_path); + strcat(data_directory, DATA_DIR); + } +} + +int jacl_whitespace(int character) { + /* CHECK IF A CHARACTER IS CONSIDERED WHITE SPACE IN THE JACL LANGUAGE */ + switch (character) { + case ':': + case '\t': + case ' ': + return (TRUE); + default: + return (FALSE); + } +} + +char *stripwhite(char *string) { + int i; + + /* STRIP WHITESPACE FROM THE START AND END OF STRING. */ + while (jacl_whitespace(*string)) string++; + + i = strlen(string) - 1; + + while (i >= 0 && ((jacl_whitespace(*(string + i))) || *(string + i) == '\n' || *(string + i) == '\r')) i--; + +#ifdef WIN32 + i++; + *(string + i) = '\r'; +#endif + i++; + *(string + i) = '\n'; + i++; + *(string + i) = '\0'; + + return string; +} + +void jacl_encrypt(char *string) { + int index, length; + + length = strlen(string); + + for (index = 0; index < length; index++) { + if (string[index] == '\n' || string[index] == '\r') { + return; + } + string[index] = string[index] ^ 255; + } +} + +void jacl_decrypt(char *string) { + int index, length; + + length = strlen(string); + + for (index = 0; index < length; index++) { + if (string[index] == '\n' || string[index] == '\r') { + return; + } + string[index] = string[index] ^ 255; + } +} + +} // End of namespace JACL +} // End of namespace Glk |