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

📄 cbgame.cpp

📁 赤壁之战的游戏源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	Lgame_save ( fp ,sizeof ( CTRL_TASK_saveCmdUnit ) ,(char *)&CTRL_TASK_saveCmdUnit );
	#ifdef	_L_DEBUG
	if ((ctrl_task_savecmdunit_lwc =new char [sizeof (CTRL_TASK_saveCmdUnit ) ]) == NULL )
	{
		return ( 0 );
	}
	test ( ctrl_task_savecmdunit_lwc ,sizeof ( CTRL_TASK_saveCmdUnit ) ,(char *)&CTRL_TASK_saveCmdUnit );
	#endif

	//fwrite( &CTRL_TASK_saveCmdUnit, sizeof( CTRL_TASK_saveCmdUnit ), 1, fp );
	// 保存是否执行所有君主的AI,测试版有效
	Lgame_save ( fp, sizeof( RUN_bAUTO ), (char *)&RUN_bAUTO );

	// 保存时间数据
	GetSystemTime( &GAME_Time.Now );
	GAME_Time.Sub = TimeSub( GAME_Time.Now, GAME_Time.Start );
	Lgame_save( fp, sizeof( GAME_Time ), (char*)&GAME_Time );

	// 保存事件数据,Oct.6.1997
	fwrite( EventPos, sizeof( EventPos ), 1, fp );

	// 保存闪烁数据
	fwrite( &DRAW_BLINK_nCounter, sizeof( DRAW_BLINK_nCounter ), 1, fp );
	fwrite( &DRAW_BLINK_nDelay, sizeof( DRAW_BLINK_nDelay ), 1, fp );
	fwrite( &DRAW_BLINK_bDraw, sizeof( DRAW_BLINK_bDraw ), 1, fp );
	fwrite( &DRAW_BLINK_nID, sizeof( DRAW_BLINK_nID ), 1, fp );
	fwrite( &DRAW_BLINK_nSave, sizeof( DRAW_BLINK_nSave ), 1, fp );

	fclose( fp );

	#ifdef	_L_DEBUG
	GAME_Load( nSlot );
	#endif

	return TRUE;
}

// 取盘
// nSlot	:	存盘文件号
BOOL GAME_Load( int nSlot )
{
	char name[32];
	GAME_MakeSaveName( nSlot, ".SAV", name );

	FILE *fp;

	// 结束游戏
	if( GAME_bBegin == TRUE )
		GAME_End( -1 );

	Assert( GAME_bBegin == FALSE );

	// 读取文件
	fp = fopen( name, "rb" );
	if( !fp )
	{
		OutputDebugString( "GAME_Load Error: Cannot open file!\n" );
		return FALSE;
	}

	// 清除单元内容
	//FACE_ShowCommandUnit( COMMANDUNIT_NONE, 0xFFFF );

//	GAME_ReleaseAllUnits();

	// 读存盘头信息
	char strInfo[64];
	BYTE nLen;
	
	fread( &nLen, sizeof(BYTE), 1, fp );
	fread( strInfo, nLen, 1, fp );

	// 读取GAME结构
	Lgame_load ( fp, sizeof ( GAME ), (char *)&GAME );
	#ifdef	_L_DEBUG
	short ijk ;
	ijk=testcmp (game_lwc ,sizeof ( GAME ), (char *)&GAME );
	delete (game_lwc);
	//fread( &GAME, sizeof( GAME ), 1, fp );
	#endif

	// set allies
	// Aug. 28. 1997
	GAME_SetAlly( 0, 1 );
	GAME_SetAlly( 0, 2 );
	GAME_SetAlly( 0, 3 );
	GAME_SetAlly( 0, 4 );

	// 读取MAP_Lib结构
	Lgame_load ( fp, sizeof ( MAP_Lib ), (char *)&MAP_Lib );
	#ifdef	_L_DEBUG
	ijk=testcmp (map_lib_lwc,sizeof ( MAP_Lib ), (char *)&MAP_Lib );
	delete (map_lib_lwc);
	#endif
	//fread( &MAP_Lib, sizeof( MAP_Lib ), 1, fp );

	// 读取DATA结构
	Lgame_load ( fp, sizeof ( DATA_Lib ), (char *)&DATA_Lib );
	#ifdef	_L_DEBUG
	ijk=testcmp (data_lib_lwc,sizeof ( DATA_Lib ), (char *)&DATA_Lib );
	delete (data_lib_lwc);
	//fread( &DATA_Lib, sizeof( DATA_Lib ), 1, fp );
	#endif

	// 读取OTHER结构
	Lgame_load ( fp, sizeof ( int ), (char *)&OTHER_nCounter );
	#ifdef	_L_DEBUG
	ijk=testcmp (other_ncounter_lwc,sizeof ( int ), (char *)&OTHER_nCounter );
	delete (other_ncounter_lwc);
	#endif

	Lgame_load ( fp, sizeof ( OTHER ), (char *)&OTHER );
	#ifdef	_L_DEBUG
	ijk=testcmp (other_lwc,sizeof ( OTHER ), (char *)&OTHER );
	delete (other_lwc);
	//fread( &OTHER_nCounter, sizeof( int ), 1, fp );
	//fread( &OTHER, sizeof( OTHER ), 1, fp );
	#endif	

	// 读取命令队列
	Lgame_load ( fp, sizeof ( CTRL_TaskList ), (char *)&CTRL_TaskList );
	#ifdef	_L_DEBUG
	ijk=testcmp (ctrl_tasklist_lwc,sizeof ( CTRL_TaskList ), (char *)&CTRL_TaskList );
	delete (ctrl_tasklist_lwc);
	//fread( &CTRL_TaskList, sizeof( CTRL_TaskList ), 1, fp );
	#endif

	// Nov.9.1997
	// 为保持存盘的兼容性,需要清除任务队列头指针和尾指针
	for( int i=0; i<GAME_PLAYER_MAX; i++ )
	{
		CTRL_nTaskHead[i] = 0;
		CTRL_nTaskTail[i] = 0;
	}

	// 读取焦点
	Lgame_load ( fp, sizeof ( CTRL_nHitCounter ), (char *)&CTRL_nHitCounter );
	#ifdef	_L_DEBUG
	ijk=testcmp (ctrl_nhitcounter_lwc,sizeof ( CTRL_nHitCounter ), (char *)&CTRL_nHitCounter );
	delete (ctrl_nhitcounter_lwc);
	#endif

	Lgame_load ( fp, sizeof ( CTRL_hitSrc ), (char *)&CTRL_hitSrc );
	#ifdef	_L_DEBUG
	ijk=testcmp (ctrl_hitsrc_lwc,sizeof ( CTRL_hitSrc ), (char *)&CTRL_hitSrc );
	delete (ctrl_hitsrc_lwc);
	//fread( &CTRL_nHitCounter, sizeof( CTRL_nHitCounter ), 1, fp );
	//fread( &CTRL_hitSrc, sizeof( CTRL_hitSrc ), 1, fp );
	#endif
	CTRL_TASK_Clear( &CTRL_hitDest );

	// 读取战场图文件名
	Lgame_load ( fp, sizeof ( BYTE ), (char *)&nLen );
	#ifdef	_L_DEBUG
	ijk=testcmp (byte_lwc,sizeof ( BYTE ), (char *)&nLen );
	delete (byte_lwc);
	#endif

	Lgame_load ( fp, sizeof ( nLen ), GAME.strNameMED );
	#ifdef	_L_DEBUG
	ijk=testcmp (strnamemed_lwc,sizeof ( nLen ), GAME.strNameMED );
	delete (strnamemed_lwc);
	//fread( &nLen, sizeof( BYTE ), 1, fp );
	//fread( GAME.strNameMED, nLen, 1, fp );
	#endif

	// 读取阴影数组
	Lgame_load ( fp, sizeof ( MAP_wRegionData ), (char *)MAP_wRegionData );
	#ifdef	_L_DEBUG
	ijk=testcmp (map_wregiondata_lwc,sizeof ( MAP_wRegionData ), (char *)MAP_wRegionData );
	delete (map_wregiondata_lwc);
	#endif

	Lgame_load ( fp, sizeof ( cMap_shadowEx ), (char *)cMap_shadowEx );
	#ifdef	_L_DEBUG
	ijk=testcmp (cmap_shadowex_lwc,sizeof ( cMap_shadowEx ), (char *)cMap_shadowEx );
	delete (cmap_shadowex_lwc);
	//fread( MAP_wRegionData, sizeof( MAP_wRegionData ), 1, fp );
	//fread( cMap_shadowEx, sizeof( cMap_shadowEx ), 1, fp );
	#endif

	// 读取UNIT数组
	Lgame_load ( fp, sizeof ( MAP_wUnitData ), (char *)MAP_wUnitData );
	#ifdef	_L_DEBUG
	ijk=testcmp (map_wunitdata_lwc,sizeof ( MAP_wUnitData ), (char *)MAP_wUnitData );
	delete (map_wunitdata_lwc);
	//fread( MAP_wUnitData, sizeof( MAP_wUnitData ), 1, fp );
	#endif

	// 读取地形数组(第一层即可)
	Lgame_load ( fp, sizeof ( MAP_wGroundData ), (char *)MAP_wGroundData);
	#ifdef	_L_DEBUG
	ijk=testcmp (map_wgrounddata_lwc,sizeof ( MAP_wGroundData ), (char *)MAP_wGroundData);
	delete (map_wgrounddata_lwc);
	//fread( MAP_wGroundData, sizeof( MAP_wGroundData ), 1, fp );
	#endif

	// 读取计算机策略
	Lgame_load ( fp, sizeof ( SaveArr ), (char *)SaveArr );
	#ifdef	_L_DEBUG
	ijk=testcmp (savearr_lwc,sizeof ( SaveArr ), (char *)SaveArr );
	delete (savearr_lwc);
	#endif
	//fread( SaveArr, sizeof( SaveArr ), 1, fp );
	LoadAIPos();

	// 重新读取缩略图
	MINI_Load();
	MINI_DrawAll( TRUE );

	// 读取当前屏幕位置
	POINT ptStart;	
	Lgame_load ( fp, sizeof ( int ), (char *)&ptStart.x );
	#ifdef	_L_DEBUG
	ijk=testcmp (noffx_lwc,sizeof ( int ), (char *)&ptStart.x );
	delete (noffx_lwc);
	#endif

	Lgame_load ( fp, sizeof ( int ), (char *)&ptStart.y );
	#ifdef	_L_DEBUG
	ijk=testcmp (noffy_lwc,sizeof ( int ), (char *)&ptStart.y );
	delete (noffy_lwc);	
	//fread( &ptStart.x, sizeof( int ), 1, fp );
	//fread( &ptStart.y, sizeof( int ), 1, fp );
	#endif
	DRAW_JumpScreen( ptStart );

	// 设置屏幕左边部队按钮
	for( i=0; i<PLAYER_GROUP_MAX-1; i++ )
	{
		if( GAME.Players[GAME.nMe].wGroup[i] != MAP_DATA_NONE )
			FACE_SetNumberButtonState( i, BUTTON_UP, FALSE );
		else
			FACE_SetNumberButtonState( i, BUTTON_DISABLE, FALSE );
	}
	if( GAME.Players[GAME.nMe].wGroup[i] != MAP_DATA_NONE )
		FACE_SetNumberButtonState( i, BUTTON_UP, TRUE );
	else
		FACE_SetNumberButtonState( i, BUTTON_DISABLE, TRUE );

	// 读取信息显示栏
	struct	PROMPT_BLOCK	temp;
	Lgame_load ( fp, sizeof ( PROMPT_BLOCK ), (char *)&temp );
	#ifdef	_L_DEBUG
	ijk=testcmp (face_current_prompt_block_lwc,sizeof ( PROMPT_BLOCK ), (char *)&temp );
	delete (face_current_prompt_block_lwc);
	//fread(	&temp, sizeof( PROMPT_BLOCK ), 1, fp );
	#endif
	// 读取信息显示栏
	FACE_SetCurrentPromptBlock( temp );

	// 读取命令组
	int nUnitID;
	DWORD dwFlag;
	Lgame_load ( fp, sizeof ( int ), (char *)&nUnitID );
	#ifdef	_L_DEBUG
	ijk=testcmp (face_currentcommandunitid_lwc,sizeof ( int ), (char *)&nUnitID );
	delete (face_currentcommandunitid_lwc);
	#endif

	Lgame_load ( fp, sizeof ( DWORD ), (char *)&dwFlag );
	#ifdef	_L_DEBUG
	ijk=testcmp (face_currentcommandunitflag_lwc ,sizeof ( DWORD ), (char *)&dwFlag );
	delete (face_currentcommandunitflag_lwc );	
	//fread( &nUnitID, sizeof( int ), 1, fp );
	//fread(	&dwFlag, sizeof( DWORD ), 1, fp );
	#endif
	FACE_ShowCommandUnit( nUnitID, dwFlag );

	// 读取当前的命令组
	Lgame_load ( fp, sizeof ( CTRL_TASK_saveCmdUnit ), (char *)&CTRL_TASK_saveCmdUnit );
	//	fread( &CTRL_TASK_saveCmdUnit, sizeof( CTRL_TASK_saveCmdUnit ), 1, fp );

	// 读取是否执行所有君主的AI,测试版有效
	Lgame_load ( fp, sizeof( RUN_bAUTO ), (char *)&RUN_bAUTO );
	
	// 读取时间数据
	Lgame_load ( fp, sizeof( GAME_Time ), (char*)&GAME_Time );
	GetSystemTime( &GAME_Time.Now );
	GAME_Time.Start = TimeSub( GAME_Time.Now, GAME_Time.Sub );

	// 读取事件数据,Oct.6.1997
	fread( EventPos, sizeof( EventPos ), 1, fp );

	// 读取闪烁数据
	fread( &DRAW_BLINK_nCounter, sizeof( DRAW_BLINK_nCounter ), 1, fp );
	fread( &DRAW_BLINK_nDelay, sizeof( DRAW_BLINK_nDelay ), 1, fp );
	fread( &DRAW_BLINK_bDraw, sizeof( DRAW_BLINK_bDraw ), 1, fp );
	fread( &DRAW_BLINK_nID, sizeof( DRAW_BLINK_nID ), 1, fp );
	fread( &DRAW_BLINK_nSave, sizeof( DRAW_BLINK_nSave ), 1, fp );

	fclose( fp );

	// read general information
	// 设置当前将领数据号
	GAME_nSlot = nSlot;

	// 背景音乐
	DATA_WAVE_MusicPlay( GAME.nMusicID );

	GAME_bBegin = TRUE;	// set flag
	return TRUE;
}
///////////

///////////
// 得到存盘信息
// nSlot	:	存盘文件号
// strInfo	:	从存盘文件里得到的存盘信息
BOOL GAME_GetSaveInfo( int nSlot, LPSTR strInfo )
{
	char name[32];
	GAME_MakeSaveName( nSlot, ".SAV", name );

	FILE *fp;

	fp = fopen( name, "rb" );
	if( !fp )
	{
		OutputDebugString( "GAME_GetSaveInfo Error: Cannot open file!\n" );
		return FALSE;
	}

	BYTE nLen;
	fread( &nLen, sizeof(BYTE), 1, fp );
	fread( strInfo, nLen, 1, fp );
	strInfo[nLen] = 0;

	fclose( fp );
	return TRUE;
}

// 设置存盘信息
// strInfo	:	计算出来的存盘信息,此信息用将被存储到存盘文件上
BOOL GAME_CalcSaveInfo( LPSTR strInfo )
{
	//strcpy( strInfo, "This is a Save file test!" );
	strcpy( strInfo, " " );
	if( GAME_nDisk == 1 )
	{
		strcat( strInfo, "A " );
	}
	else if( GAME_nDisk == 2 )
	{
		strcat( strInfo, "B " );
	}
	else
	{
		strcat( strInfo, " " );
	}
	strcat( strInfo, GAME.strName );
	strcat( strInfo, "  " );
	GetSystemTime( &GAME_Time.Now );
	GAME_Time.Sub = TimeSub( GAME_Time.Now, GAME_Time.Start );
	if( GAME_Time.Sub.wHour >= 24 )
	{
		OutputDebugString( "GAME Calc save info error, Hour!\n" );
	}
	else if( GAME_Time.Sub.wHour > 0 )
	{
		char tmp[4];
		wsprintf( tmp, "%02d", GAME_Time.Sub.wHour );
		strcat( strInfo, tmp );
		strcat( strInfo, ":" );
	}
	if( GAME_Time.Sub.wMinute >= 60 )
	{
		OutputDebugString( "GAME Calc save info error, Minute\n" );
	}
	else if( GAME_Time.Sub.wMinute >= 0 )
	{
		char tmp[4];
		//itoa( GAME_Time.Sub.wMinute, tmp, 10 );
		wsprintf( tmp, "%02d", GAME_Time.Sub.wMinute );
		strcat( strInfo, tmp );
		strcat( strInfo, ":" );
	}
	if( GAME_Time.Sub.wSecond >= 60 )
	{
		OutputDebugString( "GAME Calc save info error, Second\n" );
	}
	else if( GAME_Time.Sub.wSecond >= 0 )
	{
		char tmp[4];
		//itoa( GAME_Time.Sub.wSecond, tmp, 10 );
		wsprintf( tmp, "%02d", GAME_Time.Sub.wSecond );
		strcat( strInfo, tmp );
	}

	return TRUE;
}
///////////

///////////
// 游戏开始
BOOL GAME_Begin( int nGameID )
{

	if( GAME_bBegin == TRUE )
	{
		GAME_End( nGameID );
	}

	Assert( GAME_bBegin == FALSE );

// 初始化数据
	// initialize game players data
	GAME_InitGamePlayers();

	// initialize battle map data, ground, unit, region
	MAP_InitGUR();
	SHADOW_Clear();

	// reset mouse state
	MOUSE_SetState( MOUSE_STATE_NONE, TRUE );

	// reset control
	CTRL_InitCtrl();

	// reset other
	OTHER_InitOther();

	// 初始化事件,Oct.7.1997
	void EVENT_Init();

	// -- TY
	//君主AI初始化函数。
	TY_EmprerorAIPosClear();
	// -- TY

	// 清除命令组
	FACE_ShowCommandUnit( COMMANDUNIT_NONE, 0xFFFF );
	// initialize command units
	CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_NONE;
	CTRL_TASK_saveCmdUnit.Ex = 0xFFFFFFFF;
	CTRL_TASK_saveCmdUnit.Busy = 0;
	CTRL_TASK_ClearAssembleSrc( TRUE );
	CTRL_TASK_ClearAssembleDest();

	// 清除信息栏
	struct	PROMPT_BLOCK	temp;
	temp.PromptBlockId = PROMPT_NONE;	
	FACE_ShowPromptBlock( temp );

	// 初始化战斗记分,Nov.6.1997
	memset( &RUN_CountDown, 0, sizeof( RUN_CountDown ) );

	// read files

// 读取战场文件
	if( GAME_bDebugStage == TRUE )
	{
		FILE *fp = fopen( "stage.set", "rt" );
		if( fp )
		{
			fscanf( fp, "%d", &GAME.nID );
			fclose( fp );
		}
		GAME_bDebugStage = FALSE;
	}
	else
	{
		GAME.nID = nGameID;
	}

	// 重新读取将领固定数据
	DATA_ReloadDATAFile( hwndGame );
	if( nGameID != 0 && nGameID != 17 )	// 不是第一关则不读原来的将领设置。
	{	// 更新将领的改变数据,级别和经验
		GAME_GetGenInfo( GAME_nSlot );
	}
	else
	{
		GAME_nSlot = 99;
	}

	// load Game data, must after load shadow surfaces
	if( ! ::GAME_ReadBTLFile( hwndGame, GAME.nID, GAME.strNameBTL, GAME.strPathDAT ) ) 
	{
		OutputDebugString( "DRAW_LoadMaps Error(8): Read Battle data file error!\n" );
		return FALSE;
	}

⌨️ 快捷键说明

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