📄 missions.cpp
字号:
syncScriptEvents();
enemy[WC_KLINE].active = 1;
enemy[WC_KLINE].x = player.x + 1000;
enemy[WC_KLINE].y = player.y;
enemy[WC_KLINE].flags += FL_IMMORTAL + FL_NOFIRE;
setTarget(WC_KLINE);
loadMusic("music/TranceGeneration.mod");
Mix_PlayMusic(engine.music, -1);
}
}
return allDone;
}
signed char allMissionsCompleted()
{
for (int i = 0 ; i < 3 ; i++)
{
if (currentMission.completed1[i] == OB_INCOMPLETE)
{
if ((currentMission.primaryType[i] == M_DESTROY_ALL_TARGETS) && (engine.allAliensDead) && (currentMission.remainingObjectives1 + currentMission.remainingObjectives2 == 1))
{
currentMission.completed1[i] = 2;
checkTimer();
}
}
}
for (int i = 0 ; i < 3 ; i++)
{
if (currentMission.completed2[i] == OB_INCOMPLETE)
{
if ((currentMission.secondaryType[i] == M_DESTROY_ALL_TARGETS) && (engine.allAliensDead) && (currentMission.remainingObjectives1 + currentMission.remainingObjectives2 == 1))
{
currentMission.completed2[i] = 2;
checkTimer();
}
}
}
for (int i = 0 ; i < 3 ; i++)
{
if (currentMission.completed1[i] == 2)
{
if (currentMission.remainingObjectives1 > 1)
{
if ((currentGame.area != 17) || ((currentGame.area == 17) && (i != 1)))
setInfoLine("*** Primary Objective Completed ***", FONT_GREEN);
else
setInfoLine(">>> Primary Objective Failed <<<", FONT_RED);
currentMission.completed1[i] = OB_COMPLETED;
}
else
{
if (currentGame.area != MAX_MISSIONS - 1)
setInfoLine("*** All Primary Objectives Completed ***", FONT_GREEN);
else
setInfoLine("*** Interception Destroyed ***", FONT_GREEN);
currentMission.completed1[i] = OB_COMPLETED;
// do some area specific things
if ((currentGame.area == 5) || (currentGame.area == 10) || (currentGame.area == 18) || (currentGame.area == 24))
{
if (currentMission.remainingObjectives2 == 0)
{
killAllAliens();
engine.addAliens = -1;
}
}
if (currentGame.area == 25)
setRadioMessage(FACE_CHRIS, "You guys stay here and keep things under control. I'm going after Kethlan!", 1);
}
}
if (currentMission.completed2[i] == 2)
{
if (currentMission.remainingObjectives2 > 1)
{
setInfoLine("*** Secondary Objective Completed ***", FONT_GREEN);
currentMission.completed2[i] = OB_COMPLETED;
}
else
{
setInfoLine("*** All Secondary Objectives Completed ***", FONT_GREEN);
currentMission.completed2[i] = OB_COMPLETED;
// do some area specific things
if ((currentGame.area == 10) && (currentMission.remainingObjectives1 == 0))
{
killAllAliens();
engine.addAliens = -1;
}
}
}
if (currentMission.completed1[i] == -2)
{
setInfoLine(">>> MISSION FAILED <<<", FONT_RED);
currentMission.completed1[i] = OB_FAILED;
}
if (currentMission.completed2[i] == -2)
{
setInfoLine(">>> Secondary Objective Failed <<<", FONT_RED);
currentMission.completed2[i] = OB_FAILED;
}
}
signed char remaining = 0;
signed char add = 0;
signed char allDone = 1;
// Zero objective list for a recount
currentMission.remainingObjectives1 = currentMission.remainingObjectives2 = 0;
for (int i = 0 ; i < 3 ; i++)
{
if (currentMission.primaryType[i] != NONE)
{
if (currentMission.completed1[i] == 0)
{
currentMission.remainingObjectives1++;
if (currentMission.primaryType[i] == M_DESTROY_ALL_TARGETS)
add = 1;
allDone = 0;
}
if (currentMission.completed1[i] < 0)
return 0;
}
if (currentMission.secondaryType[i] != NONE)
{
if (currentMission.completed2[i] == 0)
{
currentMission.remainingObjectives2++;
if (currentMission.secondaryType[i] == M_DESTROY_ALL_TARGETS)
add = 1;
allDone = 0;
}
}
}
if (allDone)
allDone = revealHiddenObjectives();
remaining = currentMission.remainingObjectives1 + currentMission.remainingObjectives2;
// We've only got one objective left and it's destroy all targets,
// so stop adding aliens (otherwise it might be impossible to finish!)
if ((add == 1) && (remaining == 1))
engine.addAliens = -1;
return allDone;
}
signed char missionFailed()
{
for (int i = 0 ; i < 3 ; i++)
{
if (currentMission.completed1[i] < 0)
{
return 1;
}
}
return 0;
}
void drawBriefScreen()
{
SDL_Rect r = {0, 0, 800, 2};
for (int i = 0 ; i < 120 ; i++)
{
r.y = (i * 2) + 60;
SDL_FillRect(graphics.screen, &r, SDL_MapRGB(graphics.screen->format, 0, i, 0));
r.y = (300 + (i * 2));
SDL_FillRect(graphics.screen, &r, SDL_MapRGB(graphics.screen->format, 0, (120 - i), 0));
}
graphics.blevelRect(140, 70, 500, 20, 0x00, 0x77, 0x00);
graphics.blevelRect(140, 90, 500, 130, 0x00, 0x33, 0x00);
graphics.drawString("Primary Objectives", 150, 74, FONT_WHITE);
for (int i = 0 ; i < 3 ; i++)
{
if ((currentMission.primaryType[i] != NONE) && (currentMission.completed1[i] != OB_HIDDEN))
{
graphics.drawString(currentMission.primaryObjective[i], 160, 114 + (i * 30), FONT_WHITE);
}
}
if (currentMission.secondaryType[0] != NONE)
{
graphics.blevelRect(140, 230, 500, 20, 0x00, 0x77, 0x77);
graphics.blevelRect(140, 250, 500, 130, 0x00, 0x33, 0x33);
graphics.drawString("Secondary Objectives", 150, 234, FONT_WHITE);
for (int i = 0 ; i < 3 ; i++)
{
if (currentMission.secondaryType[i] != NONE)
{
graphics.drawString(currentMission.secondaryObjective[i], 160, 274 + (i * 30), FONT_WHITE);
currentGame.secondaryMissions++;
}
}
}
graphics.blevelRect(140, 390, 500, 20, 0x77, 0x77, 0x00);
graphics.blevelRect(140, 410, 500, 130, 0x33, 0x33, 0x00);
graphics.drawString("Additional Information", 150, 394, FONT_WHITE);
}
/*
Simply displays a screen with all the mission information on it, pulled
back from the data stored in the currentMission object. The music for the
mission begins playing here.
*/
void missionBriefScreen()
{
graphics.clearScreen(graphics.black);
graphics.updateScreen();
SDL_Delay(1000);
if (currentGame.area != MAX_MISSIONS - 1)
{
graphics.clearScreen(graphics.black);
drawBriefScreen();
if (currentMission.timeLimit1[0] > 0)
{
char temp[50];
strcpy(temp, "");
sprintf(temp, "TIME LIMIT: %d minutes", currentMission.timeLimit1[0]);
graphics.drawString(temp, -1, 500, FONT_RED);
}
switch (currentGame.area)
{
case 9:
case 10:
case 15:
case 16:
case 18:
case 24:
case 26:
graphics.drawString("Phoebe Lexx will not be present", 160, 420, FONT_WHITE);
if (currentGame.hasWingMate2)
graphics.drawString("Ursula Lexx will not be present", 160, 450, FONT_WHITE);
break;
}
if ((currentGame.area == 9) || (currentGame.area == 17) || (currentGame.area == 25))
graphics.drawString("Sid Wilson will join you on this mission", 160, 480, FONT_WHITE);
graphics.updateScreen();
}
loadGameGraphics();
graphics.textSurface(4, "Shield", 25, 550, FONT_WHITE);
graphics.textSurface(5, "Plasma:", 250, 550, FONT_WHITE);
if (player.weaponType[1] == W_CHARGER)
graphics.textSurface(6, "Charge", 385, 550, FONT_WHITE);
else if (player.weaponType[1] == W_LASER)
graphics.textSurface(6, "Heat", 405, 550, FONT_WHITE);
else
graphics.textSurface(6, "Rockets:", 385, 550, FONT_WHITE);
graphics.textSurface(7, "Target", 550, 550, FONT_WHITE);
graphics.textSurface(8, "Cash: $", 25, 20, FONT_WHITE);
graphics.textSurface(9, "Objectives Remaining:", 550, 20, FONT_WHITE);
graphics.textSurface(10, "Time Remaining - ", 260, 20, FONT_WHITE);
graphics.textSurface(11, "Power", 25, 570, FONT_WHITE);
graphics.textSurface(12, "Output", 250, 570, FONT_WHITE);
graphics.textSurface(13, "Cooler", 485, 570, FONT_WHITE);
playRandomTrack();
if (currentGame.area != MAX_MISSIONS - 1)
{
graphics.drawString("PRESS CTRL TO CONTINUE...", -1, 550, FONT_WHITE);
graphics.updateScreen();
SDL_PumpEvents();
engine.done = 0;
engine.keyState[SDLK_LCTRL] = engine.keyState[SDLK_RCTRL] = 0;
while (true)
{
graphics.updateScreen();
getPlayerInput();
if ((engine.keyState[SDLK_LCTRL]) || (engine.keyState[SDLK_RCTRL]))
break;
}
graphics.clearScreen(graphics.black);
graphics.updateScreen();
graphics.clearScreen(graphics.black);
SDL_Delay(1000);
}
engine.gameSection = SECTION_GAME;
}
/*
Display a screen showing all the information from the mission
the player has just done. This includes objectives that have been
completed and failed. A mission timer is also displayed at the bottom
of the screen.
*/
void missionFinishedScreen()
{
if (currentGame.area != MAX_MISSIONS - 1)
{
graphics.clearScreen(graphics.black);
graphics.updateScreen();
SDL_Delay(1000);
if (currentGame.shots > 0)
currentGame.accuracy = (currentGame.hits * 100) / currentGame.shots;
graphics.clearScreen(graphics.black);
drawBriefScreen();
char temp[100];
for (int i = 0 ; i < 3 ; i++)
{
if (currentMission.primaryType[i] != NONE)
{
if ((currentGame.area != 17) || ((currentGame.area == 17) && (i != 1)))
graphics.drawString("COMPLETED", 550, 114 + (i * 30), FONT_GREEN);
else
graphics.drawString("FAILED", 550, 114 + (i * 30), FONT_RED);
}
}
if (currentMission.secondaryType[0] != NONE)
{
for (int i = 0 ; i < 3 ; i++)
{
if (currentMission.secondaryType[i] != NONE)
{
sprintf(temp, currentMission.secondaryObjective[i]);
if (currentMission.completed2[i] >= 1)
{
graphics.drawString("COMPLETED", 550, 274 + (i * 30), FONT_GREEN);
currentGame.secondaryMissionsCompleted++;
}
else
{
graphics.drawString("FAILED", 550, 274 + (i * 30), FONT_RED);
}
}
}
}
if (currentMission.remainingObjectives1 + currentMission.remainingObjectives2 == 0)
{
sprintf(temp, "Shield Bonus: $%.3d", (player.shield * 10));
graphics.drawString(temp, -1, 430, FONT_WHITE);
currentGame.cash += (player.shield * 10);
currentGame.cashEarned += (player.shield * 10);
}
currentGame.timeTaken += engine.timeTaken;
signed char clock = 0;
while (engine.timeTaken > 3599)
{
clock++;
engine.timeTaken -= 3600;
}
sprintf(temp, "Mission Time: %.2d", clock);
clock = 0;
while (engine.timeTaken > 59)
{
clock++;
engine.timeTaken -= 60;
}
sprintf(temp, "%s:%.2d:%.2d", temp, clock, engine.timeTaken);
graphics.drawString(temp, -1, 500, FONT_WHITE);
// Do some mission specific stuff here...
if (currentGame.area == 1)
currentGame.cash -= 500;
else if (currentGame.area == 13)
currentGame.hasWingMate2 = 1;
else if (currentGame.area == 16)
currentGame.cash -= 2000;
checkForBossMission();
graphics.updateScreen();
SDL_PumpEvents();
engine.done = 0;
engine.keyState[SDLK_LCTRL] = engine.keyState[SDLK_RCTRL] = 0;
while (true)
{
graphics.updateScreen();
getPlayerInput();
if ((engine.keyState[SDLK_LCTRL]) || (engine.keyState[SDLK_RCTRL]))
break;
}
}
Mix_HaltMusic();
}
#if USEPACK
void loadMissions()
{
clearAllMissions();
FILE *fp;
int dataLocation;
char filename[65];
char objective[255];
int type, target, value, time, complete, add;
for (int i = 0 ; i < MAX_MISSIONS ; i++)
{
strcpy(filename, "");
sprintf(filename, "data/mission%.2d.dat", i);
#if USEPACK
dataLocation = locateDataInPak(filename, 1);
fp = fopen(PACKLOCATION, "rb");
fseek(fp, dataLocation, SEEK_SET);
#else
fp = fopen(filename, "rb");
#endif
for (int j = 0 ; j < 3 ; j++)
{
fscanf(fp, "%[^\n]%*c", objective);
fscanf(fp, "%d", &type);
fscanf(fp, "%d", &target);
fscanf(fp, "%d", &value);
fscanf(fp, "%d", &time);
fscanf(fp, "%d%*c", &complete);
strcpy(missions[i].primaryObjective[j], objective);
missions[i].primaryType[j] = type;
missions[i].target1[j] = target;
missions[i].targetValue1[j] = value;
missions[i].timeLimit1[j] = time;
missions[i].completed1[j] = complete;
}
for (int j = 0 ; j < 3 ; j++)
{
fscanf(fp, "%[^\n]%*c", objective);
fscanf(fp, "%d", &type);
fscanf(fp, "%d", &target);
fscanf(fp, "%d", &value);
fscanf(fp, "%d", &time);
fscanf(fp, "%d%*c", &complete);
strcpy(missions[i].secondaryObjective[j], objective);
missions[i].secondaryType[j] = type;
missions[i].target2[j] = target;
missions[i].targetValue2[j] = value;
missions[i].timeLimit2[j] = time;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -