www.gusucode.com > VC++游戏圣剑英雄传2双刃剑源程序+开发文档-源码程序 > VC++游戏圣剑英雄传2双刃剑源程序+开发文档-源码程序\code\source\MENU\Loadsave.cpp

    //Download by http://www.NewXing.com
//********************************************
//	进度 相关函数
//  创建于2000年10月09日
//********************************************
#include "stdio.h"
#include "..\gamelib\goldpoint2.h"
#include "..\interface\interface2.h"
#include "..\main.h"
#include "..\mapedit\mapedit.h"
#include "..\map.h"
#include "..\role.h"
#include "..\script.h"
#include "menu_inc.h"

CLoadSave::CLoadSave()
{
	Select=0;
	PicWidth=PicHeight=32;
	strcpy(Record[0].Name, "进度一:");
	strcpy(Record[1].Name, "进度二:");
	strcpy(Record[2].Name, "进度三:");
	strcpy(Record[3].Name, "进度四:");
	strcpy(Record[4].Name, "进度五:");
	strcpy(Record[5].Name, "进度六:");
	strcpy(Record[6].Name, "进度七:");
	strcpy(Record[7].Name, "进度八:");
	strcpy(Record[8].Name, "进度九:");
	strcpy(Record[9].Name, "进度十:");
}

CLoadSave::~CLoadSave()
{
}

//读取窗口
void CLoadSave::LoadWindowIni(char *filename, char *index)
{
	LoadListWindowIni(filename, index);
	LoadRecord("save\\sword");
}

//读入记录列表
void CLoadSave::LoadRecord(char *filename)
{
	char temp[MAX_PATH];
	FILE *fp;
	for(int i=0; i<MAX_RECORD; i++)
	{
		sprintf(temp, "%s%d.dat", filename, i);
		if( (fp=fopen(temp, "rb"))==NULL )		//文件存在
		{
			memset(Record[i].About, 0, 32);
			strcpy(Record[i].About, "--------------");
			continue;
		}
		fseek(fp, 16, SEEK_SET);		//跳过文件头
		fread(Record[i].About, 32, 1, fp);	//读出时间,显示到列表窗口
		fclose(fp);
	}
}

//显示
void CLoadSave::ShowLoadSaveWindow(LPDIRECTDRAWSURFACE surf, bool bLoad, int left, int top)
{
	int n;
	static int MouseY=-1;
	//显示列表窗口框
	ShowListWindow(surf, false, left, top);

	//鼠标移动选择
	if( MouseY != point.y )
	{
		MouseY=point.y;
		if( point.x > x && point.x < x+Width-ScrollBar.Width &&
			point.y > y && point.y < y+Height )
		{
			//当前选择
			Select=(point.y-y)/LineHeight + ScrollBar.CurNum;
			if( Select >= 10 )		//越界修正
				Select=9;
		}
	}

	//显示
	int shownum=10;
	for(int i=0; i<shownum; i++)
	{		
		n=ScrollBar.CurNum+i;
		//高亮显示当前选择项目
		if( n==Select )
		{
			//留下位置画滚动条
			if( ScrollBar.PageNum < ScrollBar.MaxNum-ScrollBar.MinNum )
				Bar(surf, x, y+LineHeight*i+2, x+Width-ScrollBar.Width, y+LineHeight*(i+1)-2, SelectColor);
			else
				Bar(surf, x, y+LineHeight*i+2, x+Width-1, y+LineHeight*(i+1)-2, SelectColor);
		}
		//阴影显示文字
		DWORD c=Font.GetColor();
		Font.SetColor(0);
		Font.PrintText(surf, x+Column[1].x+1, y+4+LineHeight*i+1, Record[i].Name);
		Font.PrintText(surf, x+Column[3].x+1, y+4+LineHeight*i+1, Record[i].About);
		Font.SetColor(c);
		Font.PrintText(surf, x+Column[1].x, y+4+LineHeight*i, Record[i].Name);
		Font.PrintText(surf, x+Column[3].x, y+4+LineHeight*i, Record[i].About);
	}
}

//菜单循环
bool CLoadSave::DoMenu(LPDIRECTDRAWSURFACE& surf, bool bLoad, int left, int top)
{
	x=left+32;
	y=top+32;
	Blt(lpDDSBackGround, 0,0, lpDDSBack, RectScreen, false);
	ShowWindow(lpDDSBackGround, true, left, top);

	//菜单循环
	MSG msg;
	while(RunGame)
	{
		if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
		{
            if (!GetMessage(&msg, NULL, 0, 0)) return false;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
		}
		else if(bActive)
		{
			//获取输入信息
			GetInputData();
			
			if( B_UP || mouse == RB_UP ) 
			{
				CMenu::Sound_Cancel.Play();
				if( g_eDisplayState == DS_NIGHT )
					Clrscr(lpDDSPrimary);
				return false;
			}

			//点击确定
			if( mouse == LB_UP )
			{
				if( point.x > x && point.x < x+Width-ScrollBar.Width &&
					point.y > y && point.y < y+Height )
				{
					CMenu::Sound_Click.Play();
					int sel=(point.y-y)/LineHeight + ScrollBar.CurNum;
					if( sel == Select )	//确定
					{
						if( bLoad )		//读档
						{
							if( Record[Select].About[0] != '-' )
							{
								LoadGame(Select);
								return true;
							}
						}
						else			//存档
						{
							SaveGame(Select);
							GameMessage.DoMenu(lpDDSBack, "存储成功!");
							CMenu::ReInitMenu();
							return true;
						}
					}
				}
			}

			//点击确定
			if( A_UP )
			{
				CMenu::Sound_Click.Play();
				if( bLoad )		//读档
				{
					if( Record[Select].About[0] != '-' )
					{
						LoadGame(Select);
						return true;
					}
				}
				else			//存档
				{
					SaveGame(Select);
					GameMessage.DoMenu(lpDDSBack, "存储成功!");
					CMenu::ReInitMenu();
					return true;
				}
			}
			
			//下一个
			if( DOWN_DOWN && Select < ScrollBar.MaxNum-1 )
			{
				CMenu::Sound_Change.Play();
				Select++;
				if( Select >= ScrollBar.CurNum + ScrollBar.PageNum )
					ScrollBar.SetCurNum(ScrollBar.CurNum+1);
			}

			//上一个
			if( UP_DOWN && Select > 0 )
			{
				CMenu::Sound_Change.Play();
				Select--;
				if( Select < ScrollBar.CurNum )
					ScrollBar.SetCurNum(ScrollBar.CurNum-1);
			}
			//显示到surf
			Blt(surf, 0,0, lpDDSBackGround, RectScreen, false);
			ShowLoadSaveWindow(surf, bLoad, left, top);

			ShowMouseCursor(surf, false);
			if( bShowFps)
			{
				nFrames++;
				font.PrintText(surf, 20, 460, "FPS:%d", CountSpeed());
			}
			_UpdateScreen();
		}
		else WaitMessage();	//等待消息
	}

	return false;
}

//读入进度
void CLoadSave::LoadGame(int num)
{
	char *file="save\\sword";
	char temp[MAX_PATH];
	sprintf(temp, "%s%d.dat", file, num);

	FILE *fp;
	if( (fp=fopen(temp, "rb"))==NULL )
	{
		ShowMessage("Load %s error!", file);
		return;
	}

	fseek(fp, 16+32, SEEK_SET);
	fread(&g_ePlayState, 4, 1, fp);
	fread(&g_eDisplayState, 4, 1, fp);
	fread(&RoleNum, 4, 1, fp);
	
	// 读入角色的数据
	for(int i=0; i<RoleNum; i++)
	{
		sprintf(temp, "%s%d.r%d",file, num, i);
		role[i].LoadRole(temp);
	}

	//变量
	Script.LoadVariable(fp);

	//背景音乐
	Music.Stop();
	bool bTemp;
	fread(&bTemp,1,1,fp);
	fread(&CMusic::bPlay, 1, 1, fp);
	fread(Music.MusicFile, sizeof(WCHAR), MAX_PATH, fp);
	fread(&Music.PauseTime, sizeof(MUSIC_TIME), 1, fp);
	fclose(fp);
	if(bTemp)
		Music.LoadMusic(Music.MusicFile);

	//读入当前地图
	sprintf(temp, "%s%d.map",file, num);
	map.Load(temp);
	map.Block[role[0].State.Y*map.Width+role[0].State.X] = 1;
}

//存储进度
void CLoadSave::SaveGame(int num)
{
	char *file="save\\sword";
	char temp[MAX_PATH];
	sprintf(temp, "%s%d.dat", file, num);

	FILE *fp;
	if( (fp=fopen(temp, "wb"))==NULL )
	{
		ShowMessage("Save %s error!", file);
		return;
	}

	fwrite("Sword II record!", 16, 1, fp);
	char time[32];
	GetGameTime(time);
	fwrite(time, 32, 1, fp);
	strcpy(Record[num].About, time);
	fwrite(&g_ePlayState, 4, 1, fp);
	fwrite(&g_eDisplayState, 4, 1, fp);
	fwrite(&RoleNum, 4, 1, fp);
	
	for(int i=0; i<RoleNum; i++)
	{
		sprintf(temp, "%s%d.r%d",file, num, i);
		role[i].SaveRole(temp);
	}

	//变量
	Script.SaveVariable(fp);

	//背景音乐
	fwrite(&CMusic::bMusic,1, 1, fp);
	fwrite(&CMusic::bPlay, 1, 1, fp);
	fwrite(Music.MusicFile, sizeof(WCHAR), MAX_PATH, fp);
	fwrite(&Music.PauseTime, sizeof(MUSIC_TIME), 1, fp);

	fclose(fp);

	//保存当前地图
	sprintf(temp, "%s%d.map",file, num);
	map.Save(temp);
}

//获取时间
void CLoadSave::GetGameTime(char *Tmp)
{
	SYSTEMTIME st;
	GetLocalTime(&st);
	char show[2][5];
	//两位的月份
	if( st.wMonth > 9 ) 
		sprintf(show[0], "%d", st.wMonth);
	else 
		sprintf(show[0], "0%d", st.wMonth);
	//两位的日期
	if( st.wDay > 9 ) 
		sprintf(show[1], "%d", st.wDay);
	else 
		sprintf(show[1], "0%d", st.wDay);
	//两位的小时
	if( st.wHour > 9 ) 
		sprintf(show[2], "%d", st.wHour);
	else 
		sprintf(show[2], "0%d", st.wHour);
	//两位的分钟
	if( st.wMinute > 9 ) 
		sprintf(show[3], "%d", st.wMinute);
	else 
		sprintf(show[3], "0%d", st.wMinute);
	//两位的秒数
	if( st.wSecond > 9 ) 
		sprintf(show[4], "%d", st.wSecond);
	else 
		sprintf(show[4], "0%d", st.wSecond);

	sprintf(Tmp, "%s.%s %s:%s:%s", show[0], show[1], show[2], show[3], show[4]);
}