📄 campaign.cpp
字号:
{
FindMissionInBriefing(CB_MISSION_SCREEN);
}
UpdateMissionWindow(CB_MISSION_SCREEN);
CheckCampaignFlyButton();
TheCampaign.GetBullseyeLocation(&x,&y);
gMapMgr->SetBullsEye(x * FEET_PER_KM,(TheCampaign.TheaterSizeY-y) * FEET_PER_KM);
SetMapSettings();
ReadyToPlayMovie=TRUE;
PlayCampaignMusic();
StartMovieQ();
}
//
// DO NOT USE THIS FUNCTION FOR CAMPAIGN
//
void TacticalEngagementSetup() // Everything that needs to be done to start the campaign (except loading the window)
{
C_Window *win;
C_TreeList *tree;
C_Bitmap *bmp;
C_Button *btn;
C_EditBox *ebox;
C_ListBox *lbox;
C_Clock *clk;
GridIndex x,y;
InCleanup=0;
gMusic->ClearQ();
gMusic->FadeOut_Stop();
gMusic->ToggleStream();
StupidHackToCloseCSECT=0;
StopLookingforMission=0;
CurMapTool=NULL;
ClearMapToolStates(TAC_FULLMAP_WIN);
ClearMapToolStates(TAC_EDIT_WIN);
ClearMapToolStates(TAC_PUA_MAP);
SetupMapMgr();
SetupOOBWindow();
TallyPlayerSquadrons();
// Mode 0=Play,1=Edit)
if(TheCampaign.Flags & CAMP_TACTICAL_EDIT)
{
SetupTacEngMenus(1);
win=gMainHandler->FindWindow(TAC_VC_WIN);
if(win)
{
ebox=(C_EditBox*)win->FindControl(PTS_REQ_VICTORY);
if(ebox)
ebox->SetFlagBitOn(C_BIT_ENABLED);
lbox=(C_ListBox*)win->FindControl(TAC_TYPE);
if(lbox)
lbox->SetFlagBitOn(C_BIT_ENABLED);
clk=(C_Clock*)win->FindControl(START_TIME);
if(clk)
{
clk->SetTime(TheCampaign.GetTEStartTime()/VU_TICS_PER_SECOND);
clk->SetFlagBitOn(C_BIT_ENABLED);
}
clk=(C_Clock*)win->FindControl(TIME_LIMIT);
if(clk)
{
clk->SetTime(TheCampaign.GetTETimeLimitTime()/VU_TICS_PER_SECOND);
clk->SetFlagBitOn(C_BIT_ENABLED);
}
if(gVCTree)
gVCTree->SetFlagBitOn(C_BIT_ENABLED);
win->UnHideCluster(100);
}
}
else
{
SetupTacEngMenus(0);
win=gMainHandler->FindWindow(TAC_VC_WIN);
if(win)
{
ebox=(C_EditBox*)win->FindControl(PTS_REQ_VICTORY);
if(ebox)
ebox->SetFlagBitOff(C_BIT_ENABLED);
lbox=(C_ListBox*)win->FindControl(TAC_TYPE);
if(lbox)
lbox->SetFlagBitOff(C_BIT_ENABLED);
clk=(C_Clock*)win->FindControl(START_TIME);
if(clk)
{
clk->SetTime(TheCampaign.GetTEStartTime()/VU_TICS_PER_SECOND);
clk->SetFlagBitOn(C_BIT_ENABLED);
}
clk=(C_Clock*)win->FindControl(TIME_LIMIT);
if(clk)
{
clk->SetTime(TheCampaign.GetTETimeLimitTime()/VU_TICS_PER_SECOND);
clk->SetFlagBitOn(C_BIT_ENABLED);
}
if(gVCTree)
gVCTree->SetFlagBitOff(C_BIT_ENABLED);
win->HideCluster(100);
}
win=gMainHandler->FindWindow(TAC_END_WIN);
if(win)
{
ebox=(C_EditBox*)win->FindControl(PTS_REQ_VICTORY);
if(ebox)
ebox->SetFlagBitOff(C_BIT_ENABLED);
clk=(C_Clock*)win->FindControl(TIME_LIMIT);
if(clk)
{
clk->SetTime(TheCampaign.GetTETimeLimitTime()/VU_TICS_PER_SECOND);
clk->SetFlagBitOn(C_BIT_ENABLED);
}
}
}
win=gMainHandler->FindWindow(TAC_EDIT_WIN);
if(win)
SetupMover(win,MAP_POP,gMapMgr_TACmover);
win=gMainHandler->FindWindow(TAC_VC_WIN);
if(win)
SetupMover(win,MAP_POP,gMapMgr_TACmover);
win=gMainHandler->FindWindow(TAC_PUA_MAP);
if(win)
{
SetupMover(win,MAP_POP,gMapMgr_TACmover);
gMapMgr->SetWindow(win);
gMapMgr->SetupOverlay();
}
win=gMainHandler->FindWindow(TAC_FULLMAP_WIN);
if(win)
SetupMover(win,MAP_POP,gMapMgr_TACmover);
win=gMainHandler->FindWindow(TAC_AIRCRAFT);
if(win)
{
tree=(C_TreeList*)win->FindControl(MISSION_LIST_TREE);
SetupGPS(tree);
}
win=gMainHandler->FindWindow(TAC_EDIT_SCREEN);
if(win)
{
FalconLocalSession->SetPlayerFlight(NULL);
btn=(C_Button*)win->FindControl(CO_MAIN_CTRL);
if(btn)
{
if(!gCommsMgr->Online())
btn->SetFlagBitOff(C_BIT_ENABLED);
else
btn->SetFlagBitOn(C_BIT_ENABLED);
}
}
win=gMainHandler->FindWindow(TAC_PLAY_SCREEN);
if(win)
{
FalconLocalSession->SetPlayerFlight(NULL);
btn=(C_Button*)win->FindControl(CO_MAIN_CTRL);
if(btn)
{
if(!gCommsMgr->Online())
btn->SetFlagBitOff(C_BIT_ENABLED);
else
btn->SetFlagBitOn(C_BIT_ENABLED);
}
}
win=gMainHandler->FindWindow(TAC_MISSION_SUA);
if(win)
{
bmp=(C_Bitmap*)win->FindControl(TAC_OVERLAY);
if(bmp)
bmp->SetImage(gOccupationMap);
}
win=gMainHandler->FindWindow(TAC_MISSION_SUA);
if(win)
{
short i,j;
C_Blip *blip;
blip=(C_Blip*)win->FindControl(9000000);
if(blip)
{
for(i=0;i<8;i++)
{
if(TeamInfo[i] && TeamInfo[i]->flags & TEAM_ACTIVE)
{
for(j=0;j<8;j++)
blip->SetImage(BLIP_IDS[TeamInfo[i]->GetColor()][j],static_cast<uchar>(i),static_cast<uchar>(j));
}
else
{
for(j=0;j<8;j++)
blip->SetImage(BLIP_IDS[0][j],static_cast<uchar>(i),static_cast<uchar>(j));
}
}
}
}
InitNewFlash();
RefreshMapEventList(TAC_MISSION_SUA, 1);
SetSingle_Comms_Ctrls();
gSelectedFlightID=FalconNullId;
gLoadoutFlightID=FalconNullId;
gActiveFlightID=FalconNullId;
gActiveWPNum=0;
gCurrentFlightID=FalconNullId;
gPlayerFlightID=FalconNullId;
gPlayerPlane=-1;
mcnt=0;
atocnt=0;
uintcnt=0;
gLastUpdateGround=0l;
gLastUpdateAir=0l;
if (TheCampaign.Flags & CAMP_TACTICAL_EDIT)
{
gMoveBattalion = TRUE;
gGps->SetTeamNo(-1); // Perfect Intel
}
else if(tactical_is_training ())
{
gMoveBattalion = FALSE;
gGps->SetTeamNo(-1); // Perfect Intel
gSelectedTeam=FalconLocalSession->GetTeam();
}
else
{
gMoveBattalion = FALSE;
gGps->SetTeamNo(FalconLocalSession->GetTeam()); // See ONLY what is spotted
gSelectedTeam=FalconLocalSession->GetTeam();
}
if(TacLastGroup)
do_tactical_debrief();
gGps->Update();
gMainHandler->AddUserCallback(TacEngListCB);
gMainHandler->AddUserCallback(CampaignSoundEventCB);
CheckCampaignFlyButton();
if (!gTimeModeServer)
{
FindMissionInBriefing(TAC_AIRCRAFT);
}
UpdateMissionWindow(TAC_AIRCRAFT);
// gATOAll->SetMenu (AIRUNIT_MENU);
// gATOPackage->SetMenu (AIRUNIT_MENU);
TheCampaign.GetBullseyeLocation(&x,&y);
gMapMgr->SetBullsEye(x * FEET_PER_KM,(TheCampaign.TheaterSizeY-y) * FEET_PER_KM);
SetMapSettings();
InitVCArgLists();
add_all_vcs_to_ui ();
gRefreshScoresList=1;
PlayCampaignMusic();
if(ShowGameOverWindow)
PostMessage(gMainHandler->GetAppWnd(),FM_OPEN_GAME_OVER_WIN,game_TacticalEngagement,0);
}
void LoadCampaignWindows()
{
long ID;
C_Window *win;
C_TimerHook *tmr;
if(CPLoaded) return;
CampEventSoundID=0;
if( _LOAD_ART_RESOURCES_)
gMainParser->LoadImageList("art\\cp_res.lst");
else
gMainParser->LoadImageList("art\\cp_art.lst");
gMainParser->LoadSoundList("art\\cp_snd.lst");
gMainParser->LoadWindowList("art\\cp_scf.lst");
ID=gMainParser->GetFirstWindowLoaded();
while(ID)
{
HookupCampaignControls(ID);
ID=gMainParser->GetNextWindowLoaded();
}
LoadCommonWindows();
CPLoaded++;
win=gMainHandler->FindWindow(CB_MAIN_SCREEN);
if(win)
{
tmr=new C_TimerHook;
tmr->Setup(C_DONT_CARE,C_TYPE_TIMER);
tmr->SetUpdateCallback(GenericTimerCB);
tmr->SetRefreshCallback(BlinkCommsButtonTimerCB);
tmr->SetUserNumber(_UI95_TIMER_DELAY_,1*_UI95_TICKS_PER_SECOND_); // Timer activates every 2 seconds (Only when this window is open)
win->AddControl(tmr);
}
}
int mcnt=0;
int atocnt=0;
int uintcnt=0;
void CampaignListCB()
{
if(uintcnt < 1)
{
UpdateIntel(CB_INTEL_WIN);
uintcnt=20;
}
uintcnt--;
if(NewEvents)
{
NewEvents=FALSE;
RefreshEventList();
RefreshMapEventList(CP_SUA, 0);
}
if(mcnt < 1)
{
if(gGps)
{
Flight flt;
gGps->Update();
flt=(Flight)vuDatabase->Find(gCurrentFlightID);
if(flt)
{
if(flt->GetTotalVehicles() < 1 || flt->Dead())
{
if (!gTimeModeServer)
{
FindMissionInBriefing(CB_MISSION_SCREEN);
}
UpdateMissionWindow(CB_MISSION_SCREEN);
}
}
else
{
if (!gTimeModeServer)
{
FindMissionInBriefing(CB_MISSION_SCREEN);
UpdateMissionWindow(CB_MISSION_SCREEN);
}
}
}
if(gMapMgr)
gMapMgr->RemoveOldWaypoints();
mcnt=5;
}
mcnt--;
}
void TacEngListCB()
{
if(NewEvents)
{
NewEvents=FALSE;
RefreshMapEventList(TAC_MISSION_SUA, 1);
}
if(mcnt < 1)
{
if(gGps)
{
Flight flt;
gGps->Update();
UpdateVCs();
flt=(Flight)vuDatabase->Find(gCurrentFlightID);
if(flt)
{
if(flt->GetTotalVehicles() < 1 || flt->Dead())
{
if (!gTimeModeServer)
{
FindMissionInBriefing(TAC_AIRCRAFT);
}
UpdateMissionWindow(TAC_AIRCRAFT);
}
}
else
{
if (!gTimeModeServer)
{
FindMissionInBriefing(TAC_AIRCRAFT);
UpdateMissionWindow(TAC_AIRCRAFT);
}
}
}
if(gMapMgr)
gMapMgr->RemoveOldWaypoints();
mcnt=5;
}
mcnt--;
}
void CampaignSoundEventCB()
{
if(CampEventSoundID > 0)
{
gSoundMgr->PlaySound(CampEventSoundID);
CampEventSoundID=0;
}
}
static void OpenFlightPlanWindowCB(long,short hittype,C_Base *control)
{
C_Window *win;
WayPoint wp;
Flight flt;
if(hittype != C_TYPE_LMOUSEUP)
return;
flt=(Flight)vuDatabase->Find(gActiveFlightID);
if(!flt)
return;
win=gMainHandler->FindWindow(FLIGHT_PLAN_WIN);
if(win)
{
if(!(gMainHandler->GetWindowFlags(FLIGHT_PLAN_WIN) & C_BIT_ENABLED))
{
wp=flt->GetFirstUnitWP();
if(wp)
{
UpdateWaypointWindowInfo(win,wp,1);
gMainHandler->EnableWindowGroup(control->GetGroup());
}
}
else
gMainHandler->WindowToFront(win);
}
}
// "Fly" button
void CampaignButtonCB(long,short hittype,C_Base *)
{
Flight fl;
int pilotSlot,entryType;
WayPoint wp;
C_Window *win;
C_Button *btn;
// Check for correct mouse click and campaign over state
if(hittype != C_TYPE_LMOUSEUP || TheCampaign.EndgameResult)
return;
if(TheCampaign.EndgameResult)
{
AreYouSure(TXT_ERROR,TXT_GAME_OVER,NULL,CloseWindowCB);
return;
}
fl = FalconLocalSession->GetPlayerFlight();
pilotSlot = FalconLocalSession->GetPilotSlot();
if(!fl || pilotSlot == 255)
{
// PETER TODO: Clear mission window's selection TOO!
FalconLocalSession->SetPlayerFlight(NULL);
FalconLocalSession->SetPilotSlot(255);
return;
}
ReadyToPlayMovie=FALSE;
TheCampaign.MissionEvaluator->PreMissionEval(fl,static_cast<uchar>(pilotSlot));
// KCK HACK TO ISOLATE KNEEBOARD CRASH BUG
// if (!TheCampaign.MissionEvaluator->player_pilot)
// *((unsigned int *) 0x00) = 0;
// END HACK
#ifdef DEBUG
gPlayerPilotLock = 1;
#endif
ShiAssert (TheCampaign.MissionEvaluator->player_pilot);
// Trigger the campaign to compress time and takeoff.
entryType = CompressCampaignUntilTakeoff(fl);
wp=fl->GetFirstUnitWP();
if(wp)
{
if(TheCampaign.CurrentTime < wp->GetWPArrivalTime())
{
// Open Countdown window if we're waiting for takeoff
win=gMainHandler->FindWindow(CP_COUNTDOWN_WIN);
if(win && entryType < 0)
{
gMainHandler->EnterCritical();
btn=(C_Button*)win->FindControl(WAIT_TAXI);
if(btn)
{
if ((gCommsMgr) && (gCommsMgr->Online ()))
{
btn->SetFlagBitOn (C_BIT_INVISIBLE);
}
else
{
btn->SetFlagBitOff (C_BIT_INVISIBLE);
if(PlayerOptions.GetTaxiFlag())
btn->SetState(1);
else
btn->SetState(0);
}
btn->Refresh();
}
btn=(C_Button*)win->FindControl(WAIT_TAKEOFF);
if(btn)
{
if ((gCommsMgr) && (gCommsMgr->Online ()))
{
btn->SetFlagBitOn (C_BIT_INVISIBLE);
}
else
{
btn->SetFlagBitOff (C_BIT_INVISIBLE);
if(PlayerOptions.GetTaxiFlag())
btn->SetState(0);
else
btn->SetState(1);
}
btn->Refresh();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -