void freeGameResources() { freeLevelResources(); /* Free the Global Triggers */ freeGlobalTriggers(); /* Free the map triggers */ freeMapTriggers(); /* Free the Objectives */ freeObjectives(); /* Free the scripts */ freeScript(); /* Free the inventory */ freeInventory(); /* Free the player */ freePlayer(); /* Clear the boss meter */ freeBossHealthBar(); /* Free the title screen */ freeTitle(); }
void freeAllResources() { int i; freeLevelResources(); /* Free the hud */ freeHud(); /* Free the dialog box */ freeDialogBox(); /* Free the script */ freeScript(); /* Free the game surfaces */ freeGame(); /* Free the font */ closeFont(game.font); closeFont(game.largeFont); /* Clear the collision grid */ freeCollisionGrid(); /* Free the menus */ freeMenus(); /* Free the pak file */ freePakFile(); /* Free the texture cache */ freeTextureCache(); if (key != NULL) { for (i=0;i<MAX_PROPS_FILES;i++) { free(key[i]); } free(key); key = NULL; } if (value != NULL) { for (i=0;i<MAX_PROPS_FILES;i++) { free(value[i]); } free(value); value = NULL; } }
static void patchSaveGame(char *saveFile, double version) { char location[MAX_VALUE_LENGTH], *line, *savePtr, itemName[MAX_MESSAGE_LENGTH], *returnedName, mapName[MAX_VALUE_LENGTH]; unsigned char *buffer, *originalBuffer; int savedLocation = FALSE, saveMap; FILE *newSave; savePtr = NULL; freeGameResources(); newSave = fopen(tempFile, "wb"); buffer = decompressFile(saveFile); originalBuffer = malloc((strlen((char *)buffer) + 1) * sizeof(unsigned char)); if (originalBuffer == NULL) { showErrorAndExit("Failed to allocate %d bytes to patch save game", (int)((strlen((char *)buffer) + 1) * sizeof(unsigned char))); } strcpy((char *)originalBuffer, (char *)buffer); line = strtok_r((char *)buffer, "\n", &savePtr); returnedName = NULL; mapName[0] = '\0'; 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("PLAYER_LOCATION", itemName) == 0) { sscanf(line, "%*s %s\n", location); } else if (strcmpignorecase("MAP_NAME", itemName) == 0) { saveMap = TRUE; if (strlen(mapName) == 0 || strcmpignorecase(line, mapName) == 0) { sscanf(line, "%*s %s\n", itemName); returnedName = loadResources(savePtr); if (returnedName != NULL) { STRNCPY(mapName, returnedName, sizeof(mapName)); } /* Rewind to start */ free(buffer); buffer = malloc((strlen((char *)originalBuffer) + 1) * sizeof(unsigned char)); if (buffer == NULL) { showErrorAndExit("Failed to allocate %d bytes to patch save game", (int)((strlen((char *)originalBuffer) + 1) * sizeof(unsigned char))); } strcpy((char *)buffer, (char *)originalBuffer); line = strtok_r((char *)buffer, "\n", &savePtr); /* Load up the patch file */ saveMap = patchEntities(version, itemName); if (saveMap == FALSE) { snprintf(itemName, sizeof(itemName), "%ld_old", game.playTime * SDL_GetTicks()); } if (savedLocation == FALSE) { fprintf(newSave, "VERSION %0.2f\n", version); fprintf(newSave, "PLAY_TIME %ld\n", game.playTime); fprintf(newSave, "PLAYER_KILLS %d\n", game.kills); fprintf(newSave, "BATS_DROWNED %d\n", game.batsDrowned); fprintf(newSave, "TIMES_EATEN %d\n", game.timesEaten); fprintf(newSave, "DISTANCE_TRAVELLED %u\n", game.distanceTravelled); fprintf(newSave, "ATTACKS_BLOCKED %d\n", game.attacksBlocked); fprintf(newSave, "SLIME_TIME %d\n", game.timeSpentAsSlime); fprintf(newSave, "ARROWS_FIRED %d\n", game.arrowsFired); fprintf(newSave, "SECRETS_FOUND %d\n", game.secretsFound); fprintf(newSave, "CONTINUES %d\n", game.continues); fprintf(newSave, "CHEATING %d\n", game.cheating); fprintf(newSave, "PLAYER_LOCATION %s\n", location); savedLocation = TRUE; } fprintf(newSave, "MAP_NAME %s\n", itemName); if (strcmpignorecase(itemName, location) == 0) { fprintf(newSave, "PLAYER_DATA\n"); writePlayerToFile(newSave); fprintf(newSave, "PLAYER_INVENTORY\n"); writeInventoryToFile(newSave); } fprintf(newSave, "ENTITY_DATA\n"); /* Now write out all of the Entities */ writeEntitiesToFile(newSave); /* Now the targets */ writeTargetsToFile(newSave); /* And the triggers */ writeTriggersToFile(newSave); /* Add the global triggers */ writeGlobalTriggersToFile(newSave); /* Add the map triggers */ writeMapTriggersToFile(newSave); /* Add the objectives */ writeObjectivesToFile(newSave); freeLevelResources(); if (returnedName == NULL) { break; } } } line = strtok_r(NULL, "\n", &savePtr); } free(buffer); free(originalBuffer); fclose(newSave); #if DEV == 1 copyFile(tempFile, "tmpdata"); #endif copyFile(tempFile, saveFile); compressFile(saveFile); }