?? cbctrl.cpp
字號:
/////////////////
// CBCtrl.cpp : 《赤壁》全局控制數據結構
// CBCtrl.cpp : << chibi >> global contral data structure
//
// v0010 : Oct.3.1996
// v0011 : Oct.18.1996
// v0012 : Jan.25.1997
// v0013 : Feb.5.1997
// v0020 : Mar.29.1997, add most controls
// v0021 : Apr.2.1997, add deploy asserts
// v0030 : May.16.1997, add Block(), OpenDoor(), etc. changed a lot
// v0031 : Sep.11.1997, changed a lot
//
// 編寫 : 劉剛
// written by : Liu Gang
//
// 編譯器 : Visual C++ 4.2
// Compiler : Visual C++ 4.2
//
// 版權 : 北京前導軟件有限公司 1996-1997
// Copyright : WayAhead Co.Ltd. 1996-1997
/////////////////
// 此文件包含游戲的控制結構(命令,狀態,幀)的產生,以及對任務緩沖區隊列的操作
#include "stdafx.h"
#include "CBCtrl.h"
#ifndef _CTRL_DEBUG
#include "Assert.h"
#include "CBMap.h"
#include "CBData.h"
#include "CBGame.h" // 使用GAME.Me用來判斷是否是游戲者
#include "CBMouse.h"
#include "CbEyes.h" // 檢測函數
#include "CBShadow.h" // SHADOW_IfEnabled()
//#include "CBRun.h" // RUN_CREATE_IfEnoughMoney()
#include "CBRDelay.h"
#include "DDCompo.h"
// LHJ
#include "marco.h"
#include "interfa1.h"
#include "interfac.h"
#include "cbprompt.h"
// LHJ
// TY
#include "TbnBase.h"
#include "Temperor.h"
// TY
#include "CBBuild.h"
#include "CBRDelay.h" // defines
#include "CBOther.h"
#include "CBDraw.h" // DRAW_JumpScreen()
#endif
// debug only
#include <stdio.h>
//////////////////////
// externals
// defined in CBDraw.cpp
extern RECT DRAW_rcScreen; // defined in CBDraw.cpp
extern POINT DRAW_ptScreenOffset; // defined in CBDraw.cpp
extern int MAP_nLocationNum[4]; // defined in CBMap.cpp
extern POINT MAP_ptLocation[2][MAP_LOCATION_MAX]; // defined in CBMap.cpp
// defined in CBDraw.cpp
// 被選中為目的地的單元,要閃爍顯示它的邊界
extern int DRAW_BLINK_nCounter;
extern int DRAW_BLINK_nDelay;
extern BOOL DRAW_BLINK_bDraw;
extern WORD DRAW_BLINK_nID;
extern int DRAW_BLINK_nSave;
//////////////////////
//////////////////////
// defines
#define CTRL_TIMEDELAY_COMMAND 200 // 兩個右鍵命令的間隔時間(毫秒)
#define CTRL_TIMEDELAY_MOUSE 2 // 目標右鍵點擊后所遺留下來的痕跡
//////////////////////
//////////////////////
// 命令處理流水線,關于命令流水線的所有函數都是本文件內部的
// 全局量
// 指示任務隊列的尾端位置
// points to the Task List's tail
int CTRL_nTaskTail[GAME_PLAYER_MAX]={0,0,0,0,0};
// 指向下一個有效命令的位置
int CTRL_nTaskHead[GAME_PLAYER_MAX]={0,0,0,0,0};
// First demension: 0-4 are the Waiting List of player 0-4
// 第一個下標:0-4代表游戲者0-4的等待隊列
struct CTRL_TASK_STRUCT CTRL_TaskList[GAME_PLAYER_MAX][CTRL_TASK_LIST_MAX+CTRL_TASK_LIST_MAX];
// 用來保存當前的命令組
struct CTRL_TASK_SAVE_CMDUNIT CTRL_TASK_saveCmdUnit;
//////////////////////
// local functions
// get contents from Task List
// nPlayer : player's ID, 0-4 are player 0-4
// pTask : the Task you got
// return vlaue : TRUE if get one
extern BOOL CTRL_TASK_LIST_Peek( int nPlayer, struct CTRL_TASK_STRUCT *pTask ); // 取得任務返回真
// store contents to Task List
// nPlayer : player's ID, 0-4 are player 0-4
// pTask : the Task you want to send
// return vlaue : TRUE if there is room for the Task
extern BOOL CTRL_TASK_LIST_Send( int nPlayer, CONST struct CTRL_TASK_STRUCT *pTask ); // 發送任務返回真
extern BOOL CTRL_TASK_LIST_SendEx( int nPlayer, CONST struct CTRL_TASK_STRUCT *pTask, int nIndex ,int nTail);
// copy list
// nFrom : ID for Task List to copy from
// nTo : ID for Task List to copy to
extern void CTRL_TASK_LIST_Copy( int bTo, int nFrom );
// clear list
// nList : number of list to cleared
extern void CTRL_TASK_LIST_Clear( int nList );
//////////////////////
//////////////////////
// 鼠標痕跡
void CTRL_MOUSE_Clip( int nX, int nY );
//////////////////////
//////////////////////
// 音效
// 選中某個單元后
// nFile : 單元的文件號
void CTRL_SOUND_select( int nFile );
// 對某個單元下達命令后
// nFile : 單元的文件號
void CTRL_SOUND_doIt( int nFile );
//////////////////////
//////////////////////
// 調試命令用
BOOL CTRL_bDebugCommand = FALSE;
BOOL CTRL_bDebugDie = FALSE;
//////////////////////
///////////////////////////////////Donghai//////////////////////////////////////
#include "network.h"
extern BYTE DP_SendMessageBuff[BUFFER_MAX_BYTE];
extern int DP_NetworkInterface(int Action, HWND MainWndHandle);
int CB_SendTaskMessage(int nPlayer, CONST struct CTRL_TASK_STRUCT *pTask);
extern int CB_Counter;
///////////////////////////////////Donghai//////////////////////////////////////
//////////////////////
// 任務處理
//////////////////////
// get contents from Task List
// nPlayer : player's ID, 1-4 are player 1-4, 0 is my Waiting List
// pTask : the Task you got
// return value : TRUE if get one
inline BOOL CTRL_TASK_LIST_Peek( int nPlayer, struct CTRL_TASK_STRUCT *pTask )
{
// 判斷隊列是否是空的
if( CTRL_nTaskTail[nPlayer] == CTRL_nTaskHead[nPlayer] )
return FALSE;
int nHead = CTRL_nTaskHead[nPlayer];
struct CTRL_TASK_STRUCT *pTaskSrc = &CTRL_TaskList[nPlayer][nHead];
//Assert( pTaskSrc->nTaskID != QUXIAO );
// 從任務隊列中讀取
CTRL_TASK_Copy( pTask, pTaskSrc );
// 從隊列中刪除
CTRL_TASK_Clear( pTaskSrc );
// 頭指針移動
nHead++;
if( nHead == CTRL_TASK_LIST_MAX )
{
nHead = 0;
}
CTRL_nTaskHead[nPlayer] = nHead;
return TRUE;
}
// store contents to Task List
// nPlayer : player's ID, 1-4 are player 1-4, 0 is my Waiting List
// pTask : the Task you want to send
// return vlaue : TRUE if there is room for the Task
inline BOOL CTRL_TASK_LIST_Send( int nPlayer, CONST struct CTRL_TASK_STRUCT *pTask )
{
// 隊列尾指針移動
int nTail = CTRL_nTaskTail[nPlayer];
nTail++;
if( nTail == CTRL_TASK_LIST_MAX )
nTail = 0;
// 判斷隊列是否已滿
if( nTail == CTRL_nTaskHead[nPlayer] )
return FALSE;
// 存儲任務到隊列中
struct CTRL_TASK_STRUCT *pTaskDest = &CTRL_TaskList[nPlayer][CTRL_nTaskTail[nPlayer]];
CTRL_TASK_Copy( pTaskDest, pTask );
CTRL_nTaskTail[nPlayer]=nTail;
return TRUE;
}
// store contents to Task List
// nPlayer : player's ID, 1-4 are player 1-4, 0 is my Waiting List
// pTask : the Task you want to send
// return vlaue : TRUE if there is room for the Task
inline BOOL CTRL_TASK_LIST_SendEx( int nPlayer, CONST struct CTRL_TASK_STRUCT *pTask, int nIndex ,int nTail)
{
// 存儲任務到隊列中
struct CTRL_TASK_STRUCT *pTaskDest = &CTRL_TaskList[nPlayer][nIndex];
CTRL_TASK_Copy( pTaskDest, pTask );
CTRL_nTaskTail[nPlayer]=nTail;
/////////////////////////////Donghai/////////////////////////////
// char test32[255];
// wsprintf((char *)test32,"================================%d!!!================================\n",CB_Counter);
// WriteLogFile("Test_Sendex.log",(char *)test32);
/////////////////////////////Donghai/////////////////////////////
return TRUE;
}
// copy
// nFrom : ID for Task List to copy from
// nTo : ID for Task List to copy to
inline void CTRL_TASK_LIST_Copy( int nTo, int nFrom )
{
memcpy( CTRL_TaskList[nTo], CTRL_TaskList[nFrom], sizeof(struct CTRL_TASK_STRUCT)*CTRL_TASK_LIST_MAX );
}
// clear list
// nList : number of list to cleared
inline void CTRL_TASK_LIST_Clear( int nList )
{
memset( CTRL_TaskList[nList], 0, sizeof(struct CTRL_TASK_STRUCT)*CTRL_TASK_LIST_MAX );
}
//////////////////////
//////////////////////
// 命令的產生
#ifdef _DEBUG
// 當調用CTRL_TASK_LIST_Send()時,即對任務隊列進行讀操作時,
// 一定不要進行寫操作。保證在處理命令時的同步性。
// 當調用CTRL_TASK_Main()時,該Flag標志為真,
// 當調用CTRL_TASK_LIST_Send()時,判斷該標志量。
BOOL CTRL_TASK_Reading = FALSE;
#endif // _DEBUG
// mouse hit result
// 命令的主體的計數器
int CTRL_nHitCounter=0;
// contains the units player want to send command to
// 命令的主體
// 只有nID有用
struct CTRL_TASK_STRUCT CTRL_hitSrc[CTRL_TASK_LIST_MAX-1];
// the target unit
// 命令的客體,命令的內容也存放在此
struct CTRL_TASK_STRUCT CTRL_hitDest;
// Set Task from Task List to unit
// task : Task to be set
void CTRL_TASK_SetToUnit( struct CTRL_TASK_STRUCT task );
//////////////////////
//////////////////////
// get soldier number that focus on
// 得到處于焦點狀態的士兵的數量
// return : soldier number, in person
int CTRL_GetFocusSoldierNumber()
{
// 得到士兵數
int nCount=0;
for( int i=0; i< CTRL_nHitCounter; i++ )
{
Assert( CTRL_hitSrc[i].nID != MAP_DATA_NONE );
struct UNIT_STRUCT *pUnit = MAP_GetUnit( CTRL_hitSrc[i].nID );
// 極少出現的現象,士兵已經準備死亡,可是還沒有從選中數組中清空
if( EYE_IfUnitIsDead( pUnit ) )
break;
// if( pUnit == NULL )
// WriteLogFile( "Test.log", "CTRL_GetFocusSoldierNumber()\n" );
Assert( pUnit );
Assert( pUnit->nType != 0 );
if( EYE_IfUnitIsSoldier( pUnit ) )
nCount += pUnit->nLife;
Assert( nCount >= 0 && nCount <= 99999 );
}
return nCount;
}
// clear assembling parameters
// 清除CTRL_hitSrc的內容
// bForce : 強迫清除所有內容
// bForce : 為真時,強迫清空任務隊列中的所有結點;
// 否則,只有該任務不完整時才會被清空。
void CTRL_TASK_ClearAssembleSrc( BOOL bForce /*=FALSE*/ )
{
// clear Focus to units, clear hittest source objects
int nCounter = CTRL_nHitCounter;
for( int i=0; i< nCounter; i++ )
{
if( CTRL_hitSrc[i].bDone && !bForce ) continue;
Assert( CTRL_hitSrc[i].nID != MAP_DATA_NONE );
struct UNIT_STRUCT *pUnit = MAP_GetUnit( CTRL_hitSrc[i].nID );
Assert(pUnit);
pUnit->Draw.bUpdate = FALSE; // 去掉選中框
// clear source objects
CTRL_TASK_Clear( &CTRL_hitSrc[i] );
CTRL_nHitCounter --;
}
// clear build drawings
if( BUILD_IfEnable() )
BUILD_Enable( FALSE );
// CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_NONE;
// CTRL_TASK_saveCmdUnit.Ex = 0xFFFFFFFF;
// CTRL_TASK_saveCmdUnit.Busy = 0;
#ifdef _DEBUG
if( bForce ) Assert( CTRL_nHitCounter == 0 );
#endif
}
void CTRL_TASK_ClearAssembleDest()
{
// clear command
// clear hittest destination object and command
CTRL_TASK_Clear( &CTRL_hitDest );
// reset command unit array
/* if( CTRL_TASK_saveCmdUnit.Busy == 1 )
{
FACE_ShowCommandUnit( COMMANDUNIT_CANCEL, 0xFFFF ); // clear command sets
}
else
{
FACE_ShowCommandUnit( CTRL_TASK_saveCmdUnit.Cmd, CTRL_TASK_saveCmdUnit.Ex ); // clear command sets
}
*/
// 重新設置鼠標光標形狀
MOUSE_SetState( MOUSE_STATE_NONE );
}
// 設置建筑的命令組
//void CTRL_TASK_BuildCommand( int nFile )
void CTRL_TASK_BuildCommand( struct UNIT_STRUCT *pUnit )
{
Assert( EYE_IfUnitIsBuild( pUnit ) );
switch( pUnit->Draw.nFile )
{
case 0: // 帥帳1
CTRL_TASK_saveCmdUnit.Cmd = COMMANDUNIT_CHAO_MAINBUILDING;
// 基本配置
CTRL_TASK_saveCmdUnit.Ex = 0x0001;
//if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] == 0
if( pUnit->Build.dwUpgrade[0] == 0
&& GAME.Players[GAME.nMe].nTechLvl >= 2
&& BuildPoint[GAME.nMe][MUCAICHANG].hPos == CBTRUE
&& BuildPoint[GAME.nMe][WUQICHANG].hPos == CBTRUE )
{ // 當前等級是0,最高等級大于1,有木材場,有武器場
CTRL_TASK_saveCmdUnit.Ex = 0x0003; //0011
}
//else if( GAME.Players[GAME.nMe].nGrade[PLAYER_GRADE_MAIN] == 1
else if( pUnit->Build.dwUpgrade[0] == 1
&& GAME.Players[GAME.nMe].nTechLvl >= 3
&& BuildPoint[GAME.nMe][QIBINGSUO].hPos == CBTRUE
&& BuildPoint[GAME.nMe][CHEBINGSUO].hPos == CBTRUE )
{ // 當前等級是1,最高等級大于2,有騎兵所,有車兵所
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -