static void saveGameInSlot() { saveGame(menu.index - 1); freeMessageQueue(); setInfoBoxMessage(60, 255, 255, 255, _("Game Saved")); pauseGame(); }
void freeLevelResources() { /* Free the entities */ freeEntities(); /* Free the decorations */ freeDecorations(); /* Free the animations */ freeAnimations(); /* Free the sounds */ freeSounds(); if (game.overrideMusic == FALSE) { /* Free music */ freeMusic(); } /* Free the map data */ freeMap(); /* Free the sprites */ freeSprites(); /* Free the triggers */ freeTriggers(); /* Free the properties */ freeProperties(); /* Free the targets */ freeTargets(); /* Free the message queue */ freeMessageQueue(); /* Free the scripts */ freeScript(); }
static void loadGameInSlot() { if (loadGame(menu.index - 1) == TRUE) { menu.returnAction = NULL; freeMessageQueue(); setInfoBoxMessage(60, 255, 255, 255, _("Game Loaded")); game.paused = FALSE; } else { game.menu = initOKMenu(_("Failed to load game"), &showIOMenu); game.drawMenu = &drawOKMenu; } }
static void continueGame() { if (loadGame(getMostRecentSave()) == TRUE) { menu.index = 0; menu.returnAction = NULL; freeMessageQueue(); setInfoBoxMessage(60, 255, 255, 255, _("Game Loaded")); game.paused = FALSE; } else { game.menu = initOKMenu(_("Failed to load game"), &showIOMenu); game.drawMenu = &drawOKMenu; } }
void fireMapTrigger(char *name) { int i; char message[MAX_MESSAGE_LENGTH]; if (strlen(name) == 0) { return; } for (i=0;i<MAX_TRIGGERS;i++) { if (trigger[i].inUse == TRUE && strcmpignorecase(trigger[i].triggerName, name) == 0) { trigger[i].count++; if (trigger[i].targetType == UPDATE_OBJECTIVE) { snprintf(message, MAX_MESSAGE_LENGTH, "%s (%d / %d)", _(trigger[i].targetName), trigger[i].count, trigger[i].total); freeMessageQueue(); setInfoBoxMessage(60, 255, 255, 255, message); } if (trigger[i].count == trigger[i].total) { switch (trigger[i].targetType) { case UPDATE_OBJECTIVE: updateObjective(trigger[i].targetName); break; case ACTIVATE_ENTITY: activateEntitiesWithRequiredName(trigger[i].targetName, TRUE); break; case DEACTIVATE_ENTITY: activateEntitiesWithRequiredName(trigger[i].targetName, FALSE); break; case RUN_SCRIPT: runScript(trigger[i].targetName); break; case KILL_ENTITY: killEntity(trigger[i].targetName); break; case REMOVE_INVENTORY_ITEM: removeInventoryItemByObjectiveName(trigger[i].targetName); break; default: break; } trigger[i].inUse = FALSE; } } } }
int loadGame(int slot) { char itemName[MAX_MESSAGE_LENGTH], mapName[MAX_MESSAGE_LENGTH], backup[MAX_PATH_LENGTH]; char saveFile[MAX_PATH_LENGTH], *line, *savePtr, completion[5]; double version = 0; float percentage, steps; unsigned char *buffer; int patchGame = FALSE, foundResources; FILE *fp; savePtr = NULL; snprintf(saveFile, sizeof(saveFile), "%ssave%d", gameSavePath, slot); fp = fopen(saveFile, "rb"); if (fp == NULL) { return FALSE; } fclose(fp); freeGameResources(); initGame(); buffer = decompressFile(saveFile); line = strtok_r((char *)buffer, "\n", &savePtr); foundResources = FALSE; while (line != NULL) { if (line[strlen(line) - 1] == '\n') { line[strlen(line) - 1] = '\0'; } if (line[strlen(line) - 1] == '\r') { line[strlen(line) - 1] = '\0'; } sscanf(line, "%s", itemName); if (strcmpignorecase("VERSION", itemName) == 0) { sscanf(line, "%*s %s\n", itemName); version = atof(itemName); if (version > VERSION) { printf("Save file version is newer than game version. This game might not work correctly.\n"); } } else if (strcmpignorecase("PLAY_TIME", itemName) == 0) { sscanf(line, "%*s %ld\n", &game.playTime); } else if (strcmpignorecase("PLAYER_KILLS", itemName) == 0) { sscanf(line, "%*s %d\n", &game.kills); } else if (strcmpignorecase("BATS_DROWNED", itemName) == 0) { sscanf(line, "%*s %d\n", &game.batsDrowned); } else if (strcmpignorecase("TIMES_EATEN", itemName) == 0) { sscanf(line, "%*s %d\n", &game.timesEaten); } else if (strcmpignorecase("DISTANCE_TRAVELLED", itemName) == 0) { sscanf(line, "%*s %u\n", &game.distanceTravelled); } else if (strcmpignorecase("ATTACKS_BLOCKED", itemName) == 0) { sscanf(line, "%*s %d\n", &game.attacksBlocked); } else if (strcmpignorecase("SLIME_TIME", itemName) == 0) { sscanf(line, "%*s %d\n", &game.timeSpentAsSlime); } else if (strcmpignorecase("ARROWS_FIRED", itemName) == 0) { sscanf(line, "%*s %d\n", &game.arrowsFired); } else if (strcmpignorecase("SECRETS_FOUND", itemName) == 0) { sscanf(line, "%*s %d\n", &game.secretsFound); } else if (strcmpignorecase("CONTINUES", itemName) == 0) { sscanf(line, "%*s %d\n", &game.continues); } else if (strcmpignorecase("CHEATING", itemName) == 0) { sscanf(line, "%*s %d\n", &game.cheating); } else if (strcmpignorecase("PLAYER_LOCATION", itemName) == 0) { if (version < VERSION) { patchGame = TRUE; break; } sscanf(line, "%*s %s\n", itemName); loadMap(itemName, FALSE); snprintf(mapName, sizeof(mapName), "MAP_NAME %s", itemName); } else if (strcmpignorecase(line, mapName) == 0) { foundResources = TRUE; loadResources(savePtr); } line = strtok_r(NULL, "\n", &savePtr); } if (patchGame == TRUE) { free(buffer); steps = (VERSION * 100) - (version * 100); steps = 100 / steps; percentage = 0; version += 0.01; /* Back up the original save file */ snprintf(backup, sizeof(backup), "%s.bak", saveFile); copyFile(saveFile, backup); showPatchMessage("0%"); while (TRUE) { getInput(IN_TITLE); patchSaveGame(saveFile, version); version += 0.01; percentage += steps; snprintf(completion, 5, "%d%%", (int)percentage); if ((int)(version * 100) > (int)(VERSION * 100)) { break; } showPatchMessage(completion); } return loadGame(slot); } /* Fudge to make a game saved in the new Village map still load OK */ if (foundResources == FALSE) { sscanf(mapName, "%*s %s\n", itemName); loadMap(itemName, TRUE); } free(buffer); copyFile(saveFile, tempFile); buffer = decompressFile(tempFile); free(buffer); cameraSnapToTargetEntity(); freeMessageQueue(); temporaryDataExists = TRUE; return TRUE; }
int loadContinueData() { char itemName[MAX_MESSAGE_LENGTH], mapName[MAX_MESSAGE_LENGTH]; char saveFile[MAX_PATH_LENGTH], *line, *savePtr; unsigned char *buffer; FILE *fp; savePtr = NULL; snprintf(saveFile, sizeof(saveFile), "%scontinuesave", gameSavePath); fp = fopen(saveFile, "rb"); if (fp == NULL) { return FALSE; } fclose(fp); freeGameResources(); initGame(); game.canContinue = TRUE; buffer = decompressFile(saveFile); if (strlen((char *)buffer) == 0) { showErrorAndExit("Something went wrong when decompressing the continue file"); } line = strtok_r((char *)buffer, "\n", &savePtr); while (line != NULL) { if (line[strlen(line) - 1] == '\n') { line[strlen(line) - 1] = '\0'; } if (line[strlen(line) - 1] == '\r') { line[strlen(line) - 1] = '\0'; } sscanf(line, "%s", itemName); if (strcmpignorecase("PLAY_TIME", itemName) == 0) { sscanf(line, "%*s %ld\n", &game.playTime); } else if (strcmpignorecase("PLAYER_KILLS", itemName) == 0) { sscanf(line, "%*s %d\n", &game.kills); } else if (strcmpignorecase("BATS_DROWNED", itemName) == 0) { sscanf(line, "%*s %d\n", &game.batsDrowned); } else if (strcmpignorecase("TIMES_EATEN", itemName) == 0) { sscanf(line, "%*s %d\n", &game.timesEaten); } else if (strcmpignorecase("DISTANCE_TRAVELLED", itemName) == 0) { sscanf(line, "%*s %u\n", &game.distanceTravelled); } else if (strcmpignorecase("ATTACKS_BLOCKED", itemName) == 0) { sscanf(line, "%*s %d\n", &game.attacksBlocked); } else if (strcmpignorecase("SLIME_TIME", itemName) == 0) { sscanf(line, "%*s %d\n", &game.timeSpentAsSlime); } else if (strcmpignorecase("ARROWS_FIRED", itemName) == 0) { sscanf(line, "%*s %d\n", &game.arrowsFired); } else if (strcmpignorecase("SECRETS_FOUND", itemName) == 0) { sscanf(line, "%*s %d\n", &game.secretsFound); } else if (strcmpignorecase("CONTINUES", itemName) == 0) { sscanf(line, "%*s %d\n", &game.continues); } else if (strcmpignorecase("CHEATING", itemName) == 0) { sscanf(line, "%*s %d\n", &game.cheating); } else if (strcmpignorecase("PLAYER_LOCATION", itemName) == 0) { sscanf(line, "%*s %s\n", itemName); loadMap(itemName, FALSE); snprintf(mapName, sizeof(mapName), "MAP_NAME %s", itemName); } else if (strcmpignorecase(line, mapName) == 0) { loadResources(savePtr); } line = strtok_r(NULL, "\n", &savePtr); } free(buffer); copyFile(saveFile, tempFile); buffer = decompressFile(tempFile); free(buffer); cameraSnapToTargetEntity(); freeMessageQueue(); return TRUE; }