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

📄 loadsave.cpp

📁 打飞机的过关游戏(linux)
💻 CPP
字号:
#include "loadSave.h"

/*
Reads in each save game that it finds and gives it an appropriate
description using the area variable contained in the game binary
data. It returns the slot number (1 - 10) of the most recently
used file. On the title screen, this is used to determine whether
a player can "Continue Current Game" and "Load Saved Game".
*/
int initSaveSlots()
{
	char fileName[PATH_MAX];
	int imagePos = 350;
	Game tempGame;
	struct stat fileInfo;
	int modTime = 0;
	int continueSaveIndex = 0;

	FILE *fp;

	//READ SAVE GAME DATA
	for (int i = 0 ; i < 5 ; i++)
	{
		sprintf(fileName, "%ssave%.2d.dat", engine.userHomeDirectory, (i + 1));
		fp = fopen(fileName, "rb");
		if (fp == NULL)
		{
			sprintf(saveSlot[i], "%.2d - Empty", (i + 1));
			if (engine.gameSection == SECTION_TITLE)
				graphics.textSurface(13 + i, saveSlot[i], -1, imagePos, FONT_WHITE);
		}
		else
		{
			if (fread(&tempGame, sizeof(Game), 1, fp) != 1)
			{
				sprintf(saveSlot[i], "%.2d - Corrupt Game Data", (i + 1));
			}
			else
			{
				sprintf(saveSlot[i], "%.2d - %s, %s", (i + 1), systemNames[tempGame.system], tempGame.stationedName);
				if (engine.gameSection == SECTION_TITLE)
					graphics.textSurface(13 + i, saveSlot[i], -1, imagePos, FONT_WHITE);
			}

			if (stat(fileName, &fileInfo) != -1)
			{
				if (fileInfo.st_mtime > modTime)
					{modTime = fileInfo.st_mtime; continueSaveIndex = (i + 1);}
			}

			fclose(fp);
		}
		imagePos += 20;
	}

	return continueSaveIndex;
}

/*
Fill in later...
*/
signed char loadGame(int slot)
{
	char filename[PATH_MAX];
	FILE *fp;
	sprintf(filename, "%ssave%.2d.dat", engine.userHomeDirectory, slot);

	fp = fopen(filename, "rb");

	if (fp == NULL)
		return 0;

	if (fread(&currentGame, sizeof(Game), 1, fp) != 1)
	{
		printf("Save game error. The file was not of the expected format.\n");
		fclose(fp);
		return 0;
	}

	fclose(fp);

	weapon[0] = currentGame.playerWeapon;
	weapon[1] = currentGame.playerWeapon2;
	player = currentGame.thePlayer;

	// Re-init all the planets in this system...
	initPlanetMissions(currentGame.system);

	// ... and then override with completition status
	for (int i = 0 ; i < 10 ; i++)
		systemPlanet[i].missionCompleted = currentGame.missionCompleted[i];

	return 1;
}

void saveGame(int slot)
{
	if ((slot < 1) || (slot > 5))
	{
		printf("Error - Saves may only be 1 to 5\n");
		return;
	}

	FILE *fp;
	char fileName[PATH_MAX];
	sprintf(fileName, "%ssave%.2d.dat", engine.userHomeDirectory, slot);
	fp = fopen(fileName, "wb");

	currentGame.playerWeapon = weapon[0];
	currentGame.playerWeapon2 = weapon[1];
	currentGame.thePlayer = player;
	for (int i = 0 ; i < 10 ; i++)
		currentGame.missionCompleted[i] = systemPlanet[i].missionCompleted;

	if (fp != NULL)
	{
		if (fwrite(&currentGame, sizeof(Game), 1, fp) != 1)
		{
			printf("Error Saving Game to Slot %d\n", slot);
		}
		fclose(fp);
	}
	else
	{
		printf("Error Saving Game to Slot %d\n", slot);
	}

	// Recall to update the save slots... (lazy, yes)
	initSaveSlots();
	engine.keyState[SDLK_LCTRL] = engine.keyState[SDLK_RCTRL] = 0;
}

void createSavesSurface(SDL_Surface *savesSurface, signed char clickedSlot)
{
	graphics.blevelRect(savesSurface, 0, 0, 348, 298, 0x00, 0x00, 0x00);

 	int y = 10;

	for (int i = 0 ; i < 5 ; i++)
	{
		if (clickedSlot == i)
			graphics.blevelRect(savesSurface, 5, y, 338, 25, 0x99, 0x00, 0x00);
		else
			graphics.blevelRect(savesSurface, 5, y, 338, 25, 0x00, 0x00, 0x99);
		graphics.drawString(saveSlot[i], 70, y + 5, FONT_WHITE, savesSurface);
		y += 30;
	}

	graphics.drawString("*** HELP ***", 120, 170, FONT_WHITE, savesSurface);

	switch(clickedSlot)
	{
		case 0:
		case 1:
		case 2:
		case 3:
		case 4:
			graphics.blevelRect(savesSurface, 5, 265, 100, 25, 0x00, 0x99, 0x00);
			graphics.blevelRect(savesSurface, 125, 265, 100, 25, 0x99, 0x99, 0x00);
			graphics.blevelRect(savesSurface, 243, 265, 100, 25, 0x99, 0x00, 0x00);
			graphics.drawString("SAVE", 40, 270, FONT_WHITE, savesSurface);
			graphics.drawString("CANCEL", 150, 270, FONT_WHITE, savesSurface);
			graphics.drawString("DELETE", 270, 270, FONT_WHITE, savesSurface);

			graphics.drawString("SAVE will save the game", 17, 200, FONT_WHITE, savesSurface);
			graphics.drawString("CANCEL will unselect that slot", 17, 220, FONT_WHITE, savesSurface);
			graphics.drawString("DELETE will remove the save", 17, 240, FONT_WHITE, savesSurface);
			break;
		case -1:
			graphics.drawString("First click a Save game slot to use", 17, 200, FONT_WHITE, savesSurface);
			break;
		case -10:
			graphics.drawString("Game Saved", 130, 200, FONT_WHITE, savesSurface);
			break;
		case -11:
			graphics.drawString("Save Deleted", 130, 200, FONT_WHITE, savesSurface);
			break;
	}

	engine.keyState[SDLK_LCTRL] = engine.keyState[SDLK_RCTRL] = 0;
}

/*
Displays the save slot available. For use with an interface that
has the cursor enabled. It returns the index number of the slot clicked
so that the function invoking it can perform a load or save on that slot.
*/
int showSaveSlots(SDL_Surface *savesSurface, signed char saveSlot)
{
	SDL_Rect r;
	r.x = 201;
	r.y = 115;
	r.w = 348;
	r.h = 25;

	int clickedSlot = -1;

	if ((engine.keyState[SDLK_LCTRL]) || (engine.keyState[SDLK_RCTRL]))
	{
		for (int i = 0 ; i < 5 ; i++)
		{
			if (Collision::collision(engine.cursor_x + 13, engine.cursor_y + 13, 6, 6, r.x, r.y, r.w, r.h))
			{
				clickedSlot = i;
				createSavesSurface(savesSurface, i);
			}
			r.y += 30;
		}

		if (Collision::collision(engine.cursor_x + 13, engine.cursor_y + 13, 6, 6, 215, 365, 100, 25))
		{
			saveGame(saveSlot + 1);
			createSavesSurface(savesSurface, -10);
		}

		if (Collision::collision(engine.cursor_x + 13, engine.cursor_y + 13, 6, 6, 335, 365, 100, 25))
			createSavesSurface(savesSurface, -1);

		if (Collision::collision(engine.cursor_x + 13, engine.cursor_y + 13, 6, 6, 453, 365, 100, 25))
		{
			char filename[PATH_MAX];
			sprintf(filename, "%ssave%.2d.dat", engine.userHomeDirectory, (saveSlot + 1));
			remove(filename);
			initSaveSlots();
			createSavesSurface(savesSurface, -11);
		}
	}

	if (clickedSlot > -1)
		saveSlot = clickedSlot;

	return saveSlot;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -