Add Missions+ gamemode

pyro-refactor
Fiftytwo 2020-07-20 18:35:31 +02:00
parent 95cab790c1
commit 754dfefefd
22 changed files with 178 additions and 11 deletions

View File

@ -84,6 +84,9 @@ msgstr ""
msgid "Load a saved mission" msgid "Load a saved mission"
msgstr "" msgstr ""
msgid "Missions+"
msgstr ""
msgid "Chapters:" msgid "Chapters:"
msgstr "" msgstr ""
@ -340,6 +343,9 @@ msgstr ""
msgid "<< Back \\Back to the previous screen" msgid "<< Back \\Back to the previous screen"
msgstr "" msgstr ""
msgid "+\\Missions with bonus content and optional challenges"
msgstr ""
msgid "Play\\Start mission!" msgid "Play\\Start mission!"
msgstr "" msgstr ""
@ -583,6 +589,15 @@ msgstr ""
msgid "Invert\\Invert values on this axis" msgid "Invert\\Invert values on this axis"
msgstr "" msgstr ""
msgid "Space Programmer\\Disables radio-control"
msgstr ""
msgid "Space Researcher\\Disables using all previously researched technologies"
msgstr ""
msgid "Space Explorer\\Disables astronaut abilities"
msgstr ""
msgid "\\New player name" msgid "\\New player name"
msgstr "" msgstr ""

View File

@ -190,6 +190,7 @@ void InitializeEventTypeTexts()
EVENT_TYPE_TEXT[EVENT_INTERFACE_ABORT] = "EVENT_INTERFACE_ABORT"; EVENT_TYPE_TEXT[EVENT_INTERFACE_ABORT] = "EVENT_INTERFACE_ABORT";
EVENT_TYPE_TEXT[EVENT_INTERFACE_USER] = "EVENT_INTERFACE_USER"; EVENT_TYPE_TEXT[EVENT_INTERFACE_USER] = "EVENT_INTERFACE_USER";
EVENT_TYPE_TEXT[EVENT_INTERFACE_SATCOM] = "EVENT_INTERFACE_SATCOM"; EVENT_TYPE_TEXT[EVENT_INTERFACE_SATCOM] = "EVENT_INTERFACE_SATCOM";
EVENT_TYPE_TEXT[EVENT_INTERFACE_PLUS] = "EVENT_INTERFACE_PLUS";
EVENT_TYPE_TEXT[EVENT_INTERFACE_CHAP] = "EVENT_INTERFACE_CHAP"; EVENT_TYPE_TEXT[EVENT_INTERFACE_CHAP] = "EVENT_INTERFACE_CHAP";
EVENT_TYPE_TEXT[EVENT_INTERFACE_LIST] = "EVENT_INTERFACE_LIST"; EVENT_TYPE_TEXT[EVENT_INTERFACE_LIST] = "EVENT_INTERFACE_LIST";
@ -272,6 +273,10 @@ void InitializeEventTypeTexts()
EVENT_TYPE_TEXT[EVENT_INTERFACE_JOYSTICK_CAM_Y_INVERT]= "EVENT_INTERFACE_JOYSTICK_CAM_Y_INVERT"; EVENT_TYPE_TEXT[EVENT_INTERFACE_JOYSTICK_CAM_Y_INVERT]= "EVENT_INTERFACE_JOYSTICK_CAM_Y_INVERT";
EVENT_TYPE_TEXT[EVENT_INTERFACE_JOYSTICK_CAM_Z_INVERT]= "EVENT_INTERFACE_JOYSTICK_CAM_Z_INVERT"; EVENT_TYPE_TEXT[EVENT_INTERFACE_JOYSTICK_CAM_Z_INVERT]= "EVENT_INTERFACE_JOYSTICK_CAM_Z_INVERT";
EVENT_TYPE_TEXT[EVENT_INTERFACE_PLUS_TRAINER] = "EVENT_INTERFACE_PLUS_TRAINER";
EVENT_TYPE_TEXT[EVENT_INTERFACE_PLUS_RESEARCH] = "EVENT_INTERFACE_PLUS_RESEARCH";
EVENT_TYPE_TEXT[EVENT_INTERFACE_PLUS_EXPLORER] = "EVENT_INTERFACE_PLUS_EXPLORER";
EVENT_TYPE_TEXT[EVENT_INTERFACE_GLINTl] = "EVENT_INTERFACE_GLINTl"; EVENT_TYPE_TEXT[EVENT_INTERFACE_GLINTl] = "EVENT_INTERFACE_GLINTl";
EVENT_TYPE_TEXT[EVENT_INTERFACE_GLINTr] = "EVENT_INTERFACE_GLINTr"; EVENT_TYPE_TEXT[EVENT_INTERFACE_GLINTr] = "EVENT_INTERFACE_GLINTr";
EVENT_TYPE_TEXT[EVENT_INTERFACE_GLINTu] = "EVENT_INTERFACE_GLINTu"; EVENT_TYPE_TEXT[EVENT_INTERFACE_GLINTu] = "EVENT_INTERFACE_GLINTu";

View File

@ -225,6 +225,7 @@ enum EventType
EVENT_INTERFACE_ABORT = 412, EVENT_INTERFACE_ABORT = 412,
EVENT_INTERFACE_USER = 413, EVENT_INTERFACE_USER = 413,
EVENT_INTERFACE_SATCOM = 414, EVENT_INTERFACE_SATCOM = 414,
EVENT_INTERFACE_PLUS = 415,
EVENT_INTERFACE_CHAP = 420, EVENT_INTERFACE_CHAP = 420,
EVENT_INTERFACE_LIST = 421, EVENT_INTERFACE_LIST = 421,
@ -311,6 +312,10 @@ enum EventType
EVENT_INTERFACE_JOYSTICK_CAM_Y_INVERT = 573, EVENT_INTERFACE_JOYSTICK_CAM_Y_INVERT = 573,
EVENT_INTERFACE_JOYSTICK_CAM_Z_INVERT = 574, EVENT_INTERFACE_JOYSTICK_CAM_Z_INVERT = 574,
EVENT_INTERFACE_PLUS_TRAINER = 575,
EVENT_INTERFACE_PLUS_RESEARCH = 576,
EVENT_INTERFACE_PLUS_EXPLORER = 577,
EVENT_INTERFACE_GLINTl = 590, EVENT_INTERFACE_GLINTl = 590,
EVENT_INTERFACE_GLINTr = 591, EVENT_INTERFACE_GLINTr = 591,
EVENT_INTERFACE_GLINTu = 592, EVENT_INTERFACE_GLINTu = 592,

View File

@ -77,6 +77,7 @@ void InitializeRestext()
stringsText[RT_TITLE_PERSO] = TR("Customize your appearance"); stringsText[RT_TITLE_PERSO] = TR("Customize your appearance");
stringsText[RT_TITLE_WRITE] = TR("Save the current mission"); stringsText[RT_TITLE_WRITE] = TR("Save the current mission");
stringsText[RT_TITLE_READ] = TR("Load a saved mission"); stringsText[RT_TITLE_READ] = TR("Load a saved mission");
stringsText[RT_TITLE_PLUS] = TR("Missions+");
stringsText[RT_PLAY_CHAP_CHAPTERS] = TR("Chapters:"); stringsText[RT_PLAY_CHAP_CHAPTERS] = TR("Chapters:");
stringsText[RT_PLAY_CHAP_PLANETS] = TR("Planets:"); stringsText[RT_PLAY_CHAP_PLANETS] = TR("Planets:");
@ -181,6 +182,7 @@ void InitializeRestext()
stringsEvent[EVENT_INTERFACE_ABORT] = TR("\\Return to Colobot: Gold Edition"); stringsEvent[EVENT_INTERFACE_ABORT] = TR("\\Return to Colobot: Gold Edition");
stringsEvent[EVENT_INTERFACE_QUIT] = TR("Quit\\Quit Colobot: Gold Edition"); stringsEvent[EVENT_INTERFACE_QUIT] = TR("Quit\\Quit Colobot: Gold Edition");
stringsEvent[EVENT_INTERFACE_BACK] = TR("<< Back \\Back to the previous screen"); stringsEvent[EVENT_INTERFACE_BACK] = TR("<< Back \\Back to the previous screen");
stringsEvent[EVENT_INTERFACE_PLUS] = TR("+\\Missions with bonus content and optional challenges");
stringsEvent[EVENT_INTERFACE_PLAY] = TR("Play\\Start mission!"); stringsEvent[EVENT_INTERFACE_PLAY] = TR("Play\\Start mission!");
stringsEvent[EVENT_INTERFACE_SETUPd] = TR("Device\\Driver and resolution settings"); stringsEvent[EVENT_INTERFACE_SETUPd] = TR("Device\\Driver and resolution settings");
stringsEvent[EVENT_INTERFACE_SETUPg] = TR("Graphics\\Graphics settings"); stringsEvent[EVENT_INTERFACE_SETUPg] = TR("Graphics\\Graphics settings");
@ -275,6 +277,10 @@ void InitializeRestext()
stringsEvent[EVENT_INTERFACE_JOYSTICK_CAM_Y_INVERT] = TR("Invert\\Invert values on this axis"); stringsEvent[EVENT_INTERFACE_JOYSTICK_CAM_Y_INVERT] = TR("Invert\\Invert values on this axis");
stringsEvent[EVENT_INTERFACE_JOYSTICK_CAM_Z_INVERT] = TR("Invert\\Invert values on this axis"); stringsEvent[EVENT_INTERFACE_JOYSTICK_CAM_Z_INVERT] = TR("Invert\\Invert values on this axis");
stringsEvent[EVENT_INTERFACE_PLUS_TRAINER] = TR("Space Programmer\\Disables radio-control");
stringsEvent[EVENT_INTERFACE_PLUS_RESEARCH] = TR("Space Researcher\\Disables using all previously researched technologies");
stringsEvent[EVENT_INTERFACE_PLUS_EXPLORER] = TR("Space Explorer\\Disables astronaut abilities");
stringsEvent[EVENT_INTERFACE_NEDIT] = TR("\\New player name"); stringsEvent[EVENT_INTERFACE_NEDIT] = TR("\\New player name");
stringsEvent[EVENT_INTERFACE_NOK] = TR("OK\\Choose the selected player"); stringsEvent[EVENT_INTERFACE_NOK] = TR("OK\\Choose the selected player");
stringsEvent[EVENT_INTERFACE_NDELETE] = TR("Delete player\\Deletes the player from the list"); stringsEvent[EVENT_INTERFACE_NDELETE] = TR("Delete player\\Deletes the player from the list");

View File

@ -71,6 +71,7 @@ enum ResTextType
RT_TITLE_WRITE = 50, RT_TITLE_WRITE = 50,
RT_TITLE_READ = 51, RT_TITLE_READ = 51,
RT_TITLE_USER = 52, RT_TITLE_USER = 52,
RT_TITLE_PLUS = 53,
RT_PLAY_CHAP_CHAPTERS = 60, RT_PLAY_CHAP_CHAPTERS = 60,
RT_PLAY_CHAP_PLANETS = 61, RT_PLAY_CHAP_PLANETS = 61,

View File

@ -29,6 +29,7 @@ const std::map<LevelCategory, std::string> CATEGORY_DIR_MAP = {
{ LevelCategory::Exercises, "exercises" }, { LevelCategory::Exercises, "exercises" },
{ LevelCategory::Challenges, "challenges" }, { LevelCategory::Challenges, "challenges" },
{ LevelCategory::CodeBattles, "battles" }, { LevelCategory::CodeBattles, "battles" },
{ LevelCategory::GamePlus, "plus" },
{ LevelCategory::CustomLevels, "custom" }, { LevelCategory::CustomLevels, "custom" },
}; };

View File

@ -28,6 +28,7 @@ enum class LevelCategory
Missions, Missions,
FreeGame, FreeGame,
CodeBattles, CodeBattles,
GamePlus,
CustomLevels, CustomLevels,
Max, Max,
}; };

View File

@ -2461,6 +2461,7 @@ bool CRobotMain::EventFrame(const Event &event)
{ {
if (m_levelCategory == LevelCategory::Missions || if (m_levelCategory == LevelCategory::Missions ||
m_levelCategory == LevelCategory::FreeGame || m_levelCategory == LevelCategory::FreeGame ||
m_levelCategory == LevelCategory::GamePlus ||
m_levelCategory == LevelCategory::CustomLevels) m_levelCategory == LevelCategory::CustomLevels)
{ {
if (!IOIsBusy() && m_missionType != MISSION_CODE_BATTLE) if (!IOIsBusy() && m_missionType != MISSION_CODE_BATTLE)
@ -3781,6 +3782,12 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
m_build |= BUILD_FLAG; m_build |= BUILD_FLAG;
} }
if (m_levelCategory == LevelCategory::GamePlus && !m_ui->GetPlusResearch() && !resetObject) // new game plus?
{
m_researchDone[0] |= m_playerProfile->GetFreeGameResearchUnlock();
m_build |= m_playerProfile->GetFreeGameBuildUnlock();
}
if (!resetObject) if (!resetObject)
{ {
m_short->SetMode(false); // vehicles? m_short->SetMode(false); // vehicles?
@ -5347,6 +5354,16 @@ bool CRobotMain::GetTrainerPilot()
return m_cheatTrainerPilot; return m_cheatTrainerPilot;
} }
bool CRobotMain::GetPlusTrainer()
{
return m_ui->GetPlusTrainer();
}
bool CRobotMain::GetPlusExplorer()
{
return m_ui->GetPlusExplorer();
}
//! Indicates whether the scene is fixed, without interaction //! Indicates whether the scene is fixed, without interaction
bool CRobotMain::GetFixScene() bool CRobotMain::GetFixScene()
{ {

View File

@ -266,6 +266,8 @@ public:
const std::string& GetScriptName(); const std::string& GetScriptName();
const std::string& GetScriptFile(); const std::string& GetScriptFile();
bool GetTrainerPilot(); bool GetTrainerPilot();
bool GetPlusTrainer();
bool GetPlusExplorer();
bool GetFixScene(); bool GetFixScene();
bool GetShowSoluce(); bool GetShowSoluce();
bool GetSceneSoluce(); bool GetSceneSoluce();

View File

@ -314,7 +314,7 @@ void CMotionHuman::Create(Math::Vector pos, float angle, ObjectType type,
m_object->SetPartRotation(13, Math::Vector(10.0f*Math::PI/180.0f, -5.0f*Math::PI/180.0f, 5.0f*Math::PI/180.0f)); m_object->SetPartRotation(13, Math::Vector(10.0f*Math::PI/180.0f, -5.0f*Math::PI/180.0f, 5.0f*Math::PI/180.0f));
// Creates the neutron gun. // Creates the neutron gun.
if ( option != 2 ) // with backpack? if ( option != 2 && !m_main->GetPlusExplorer()) // with backpack?
{ {
rank = m_engine->CreateObject(); rank = m_engine->CreateObject();
m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT); m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT);

View File

@ -1627,6 +1627,11 @@ bool COldObject::GetTrainer()
return m_bTrainer; return m_bTrainer;
} }
bool COldObject::GetPlusTrainer()
{
return m_main->GetPlusTrainer();
}
void COldObject::SetToy(bool bEnable) void COldObject::SetToy(bool bEnable)
{ {
m_bToy = bEnable; m_bToy = bEnable;

View File

@ -165,6 +165,7 @@ public:
void SetTrainer(bool bEnable) override; void SetTrainer(bool bEnable) override;
bool GetTrainer() override; bool GetTrainer() override;
bool GetPlusTrainer();
void SetToy(bool bEnable); void SetToy(bool bEnable);
bool GetToy(); bool GetToy();

View File

@ -64,7 +64,7 @@ std::unique_ptr<CBaseBuilding> CBaseBuilding::Create(
{ {
auto obj = MakeUnique<CBaseBuilding>(params.id, params.type); auto obj = MakeUnique<CBaseBuilding>(params.id, params.type);
obj->SetTrainer(params.trainer); obj->SetTrainer(params.trainer || obj->GetPlusTrainer());
obj->SetTeam(params.team); obj->SetTeam(params.team);
float height = params.height; float height = params.height;

View File

@ -65,7 +65,7 @@ std::unique_ptr<CBaseRobot> CBaseRobot::Create(
} }
else else
{ {
obj->SetTrainer(params.trainer); obj->SetTrainer(params.trainer || obj->GetPlusTrainer());
} }
obj->SetToy(params.toy); obj->SetToy(params.toy);

View File

@ -52,7 +52,7 @@ std::unique_ptr<CShielder> CShielder::Create(
auto obj = MakeUnique<CShielder>(params.id); auto obj = MakeUnique<CShielder>(params.id);
obj->SetTeam(params.team); obj->SetTeam(params.team);
obj->SetTrainer(params.trainer); obj->SetTrainer(params.trainer || obj->GetPlusTrainer());
obj->SetToy(params.toy); obj->SetToy(params.toy);
auto physics = MakeUnique<CPhysics>(obj.get()); auto physics = MakeUnique<CPhysics>(obj.get());

View File

@ -201,6 +201,7 @@ void CMainDialog::StartPauseMenu()
if ( (m_main->GetLevelCategory() == LevelCategory::Missions || // missions ? if ( (m_main->GetLevelCategory() == LevelCategory::Missions || // missions ?
m_main->GetLevelCategory() == LevelCategory::FreeGame || // free games? m_main->GetLevelCategory() == LevelCategory::FreeGame || // free games?
m_main->GetLevelCategory() == LevelCategory::GamePlus || // new game plus?
m_main->GetLevelCategory() == LevelCategory::CustomLevels ) && // user ? m_main->GetLevelCategory() == LevelCategory::CustomLevels ) && // user ?
m_main->GetMissionType() != MISSION_CODE_BATTLE ) m_main->GetMissionType() != MISSION_CODE_BATTLE )
{ {

View File

@ -762,6 +762,21 @@ bool CMainUserInterface::GetSceneSoluce()
return m_screenLevelList->GetSceneSoluce(); return m_screenLevelList->GetSceneSoluce();
} }
bool CMainUserInterface::GetPlusTrainer()
{
return m_screenLevelList->GetPlusTrainer();
}
bool CMainUserInterface::GetPlusResearch()
{
return m_screenLevelList->GetPlusResearch();
}
bool CMainUserInterface::GetPlusExplorer()
{
return m_screenLevelList->GetPlusExplorer();
}
bool CMainUserInterface::GetGamerOnlyHead() bool CMainUserInterface::GetGamerOnlyHead()
{ {
if (m_phase == PHASE_APPERANCE) if (m_phase == PHASE_APPERANCE)

View File

@ -76,6 +76,9 @@ public:
void ChangePhase(Phase phase); void ChangePhase(Phase phase);
bool GetSceneSoluce(); bool GetSceneSoluce();
bool GetPlusTrainer();
bool GetPlusResearch();
bool GetPlusExplorer();
void UpdateChapterPassed(); void UpdateChapterPassed();
void NextMission(); void NextMission();

View File

@ -943,8 +943,9 @@ bool CObjectInterface::CreateInterface(bool bSelect)
} }
} }
if ( type == OBJECT_HUMAN || if ( (type == OBJECT_HUMAN ||
type == OBJECT_TECH ) type == OBJECT_TECH ) &&
!m_main->GetPlusExplorer() )
{ {
pos.x = ox+sx*7.7f; pos.x = ox+sx*7.7f;
pos.y = oy+sy*0.5f; pos.y = oy+sy*0.5f;
@ -986,7 +987,7 @@ bool CObjectInterface::CreateInterface(bool bSelect)
DefaultEnter(pw, EVENT_OBJECT_MTAKE); DefaultEnter(pw, EVENT_OBJECT_MTAKE);
} }
if ( type == OBJECT_HUMAN ) // builder? if ( type == OBJECT_HUMAN && !m_main->GetPlusExplorer()) // builder?
{ {
pos.x = 1.0f/640.0f; pos.x = 1.0f/640.0f;
pos.y = 4.0f/480.0f; pos.y = 4.0f/480.0f;

View File

@ -48,6 +48,9 @@ CScreenLevelList::CScreenLevelList(CMainDialog* mainDialog)
: m_dialog(mainDialog), : m_dialog(mainDialog),
m_category{}, m_category{},
m_sceneSoluce{false}, m_sceneSoluce{false},
m_plusTrainer{false},
m_plusResearch{false},
m_plusExplorer{false},
m_maxList{0}, m_maxList{0},
m_accessChap{0} m_accessChap{0}
{ {
@ -86,6 +89,7 @@ void CScreenLevelList::CreateInterface()
if ( m_category == LevelCategory::Missions ) res = RT_TITLE_MISSION; if ( m_category == LevelCategory::Missions ) res = RT_TITLE_MISSION;
if ( m_category == LevelCategory::FreeGame ) res = RT_TITLE_FREE; if ( m_category == LevelCategory::FreeGame ) res = RT_TITLE_FREE;
if ( m_category == LevelCategory::CodeBattles ) res = RT_TITLE_CODE_BATTLES; if ( m_category == LevelCategory::CodeBattles ) res = RT_TITLE_CODE_BATTLES;
if ( m_category == LevelCategory::GamePlus ) res = RT_TITLE_PLUS;
if ( m_category == LevelCategory::CustomLevels ) res = RT_TITLE_USER; if ( m_category == LevelCategory::CustomLevels ) res = RT_TITLE_USER;
GetResource(RES_TEXT, res, name); GetResource(RES_TEXT, res, name);
pw->SetName(name); pw->SetName(name);
@ -109,6 +113,7 @@ void CScreenLevelList::CreateInterface()
res = RT_PLAY_CHAP_CHAPTERS; res = RT_PLAY_CHAP_CHAPTERS;
if ( m_category == LevelCategory::Missions ) res = RT_PLAY_CHAP_PLANETS; if ( m_category == LevelCategory::Missions ) res = RT_PLAY_CHAP_PLANETS;
if ( m_category == LevelCategory::FreeGame ) res = RT_PLAY_CHAP_PLANETS; if ( m_category == LevelCategory::FreeGame ) res = RT_PLAY_CHAP_PLANETS;
if ( m_category == LevelCategory::GamePlus ) res = RT_PLAY_CHAP_PLANETS;
if ( m_category == LevelCategory::CustomLevels ) res = RT_PLAY_CHAP_USERLVL; if ( m_category == LevelCategory::CustomLevels ) res = RT_PLAY_CHAP_USERLVL;
GetResource(RES_TEXT, res, name); GetResource(RES_TEXT, res, name);
pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL11, name); pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL11, name);
@ -138,6 +143,7 @@ void CScreenLevelList::CreateInterface()
if ( m_category == LevelCategory::Challenges ) res = RT_PLAY_LIST_CHALLENGES; if ( m_category == LevelCategory::Challenges ) res = RT_PLAY_LIST_CHALLENGES;
if ( m_category == LevelCategory::Missions ) res = RT_PLAY_LIST_MISSIONS; if ( m_category == LevelCategory::Missions ) res = RT_PLAY_LIST_MISSIONS;
if ( m_category == LevelCategory::FreeGame ) res = RT_PLAY_LIST_FREEGAME; if ( m_category == LevelCategory::FreeGame ) res = RT_PLAY_LIST_FREEGAME;
if ( m_category == LevelCategory::GamePlus ) res = RT_PLAY_LIST_MISSIONS;
GetResource(RES_TEXT, res, name); GetResource(RES_TEXT, res, name);
pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name); pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name);
pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT); pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT);
@ -179,6 +185,7 @@ void CScreenLevelList::CreateInterface()
// Button displays the "soluce": // Button displays the "soluce":
if ( m_category != LevelCategory::Exercises && if ( m_category != LevelCategory::Exercises &&
m_category != LevelCategory::GamePlus &&
m_category != LevelCategory::FreeGame ) m_category != LevelCategory::FreeGame )
{ {
pos.x = ox+sx*9.5f; pos.x = ox+sx*9.5f;
@ -191,10 +198,36 @@ void CScreenLevelList::CreateInterface()
} }
m_sceneSoluce = false; m_sceneSoluce = false;
if ( m_category == LevelCategory::GamePlus )
{
pos.x = ox+sx*9.5f;
pos.y = oy+sy*6.1f;
ddim.x = dim.x*3.4f;
ddim.y = dim.y*0.5f;
pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_PLUS_TRAINER);
pc->SetState(STATE_SHADOW);
pc->ClearState(STATE_CHECK);
pos.y = oy+sy*5.5f;
pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_PLUS_RESEARCH);
pc->SetState(STATE_SHADOW);
pc->ClearState(STATE_CHECK);
pos.x = ox+sx*12.9f;
pos.y = oy+sy*6.1f;
pc = pw->CreateCheck(pos, ddim, -1, EVENT_INTERFACE_PLUS_EXPLORER);
pc->SetState(STATE_SHADOW);
pc->ClearState(STATE_CHECK);
}
m_plusTrainer = false;
m_plusResearch = false;
m_plusExplorer = false;
UpdateSceneResume(m_chap[m_category]+1, m_sel[m_category]+1); UpdateSceneResume(m_chap[m_category]+1, m_sel[m_category]+1);
if ( m_category == LevelCategory::Missions || if ( m_category == LevelCategory::Missions ||
m_category == LevelCategory::FreeGame || m_category == LevelCategory::FreeGame ||
m_category == LevelCategory::GamePlus ||
m_category == LevelCategory::CustomLevels ) m_category == LevelCategory::CustomLevels )
{ {
pos.x = ox+sx*9.5f; pos.x = ox+sx*9.5f;
@ -295,6 +328,27 @@ bool CScreenLevelList::EventProcess(const Event &event)
pb->SetState(STATE_CHECK, m_sceneSoluce); pb->SetState(STATE_CHECK, m_sceneSoluce);
break; break;
case EVENT_INTERFACE_PLUS_TRAINER:
pb = static_cast<CButton*>(pw->SearchControl(EVENT_INTERFACE_PLUS_TRAINER));
if ( pb == nullptr ) break;
m_plusTrainer = !m_plusTrainer;
pb->SetState(STATE_CHECK, m_plusTrainer);
break;
case EVENT_INTERFACE_PLUS_RESEARCH:
pb = static_cast<CButton*>(pw->SearchControl(EVENT_INTERFACE_PLUS_RESEARCH));
if ( pb == nullptr ) break;
m_plusResearch = !m_plusResearch;
pb->SetState(STATE_CHECK, m_plusResearch);
break;
case EVENT_INTERFACE_PLUS_EXPLORER:
pb = static_cast<CButton*>(pw->SearchControl(EVENT_INTERFACE_PLUS_EXPLORER));
if ( pb == nullptr ) break;
m_plusExplorer = !m_plusExplorer;
pb->SetState(STATE_CHECK, m_plusExplorer);
break;
case EVENT_INTERFACE_PLAY: case EVENT_INTERFACE_PLAY:
m_main->SetLevel(m_category, m_chap[m_category]+1, m_sel[m_category]+1); m_main->SetLevel(m_category, m_chap[m_category]+1, m_sel[m_category]+1);
m_main->ChangePhase(PHASE_SIMUL); m_main->ChangePhase(PHASE_SIMUL);
@ -331,6 +385,21 @@ bool CScreenLevelList::GetSceneSoluce()
return m_sceneSoluce; return m_sceneSoluce;
} }
bool CScreenLevelList::GetPlusTrainer()
{
return m_plusTrainer;
}
bool CScreenLevelList::GetPlusResearch()
{
return m_plusResearch;
}
bool CScreenLevelList::GetPlusExplorer()
{
return m_plusExplorer;
}
// Updates the chapters of exercises or missions. // Updates the chapters of exercises or missions.
void CScreenLevelList::UpdateSceneChap(int &chap) void CScreenLevelList::UpdateSceneChap(int &chap)
@ -392,7 +461,7 @@ void CScreenLevelList::UpdateSceneChap(int &chap)
pl->SetCheck(j, bPassed); pl->SetCheck(j, bPassed);
pl->SetEnable(j, true); pl->SetEnable(j, true);
if ( m_category == LevelCategory::Missions && !m_main->GetShowAll() && !bPassed ) if ( (m_category == LevelCategory::Missions || m_category == LevelCategory::GamePlus) && !m_main->GetShowAll() && !bPassed )
{ {
j ++; j ++;
break; break;
@ -459,7 +528,7 @@ void CScreenLevelList::UpdateSceneList(int chap, int &sel)
pl->SetCheck(j, bPassed); pl->SetCheck(j, bPassed);
pl->SetEnable(j, true); pl->SetEnable(j, true);
if ( m_category == LevelCategory::Missions && !m_main->GetShowAll() && !bPassed ) if ( (m_category == LevelCategory::Missions || m_category == LevelCategory::GamePlus) && !m_main->GetShowAll() && !bPassed )
{ {
readAll = false; readAll = false;
} }

View File

@ -43,6 +43,9 @@ public:
void SetSelection(LevelCategory category, int chap, int rank); void SetSelection(LevelCategory category, int chap, int rank);
bool GetSceneSoluce(); bool GetSceneSoluce();
bool GetPlusTrainer();
bool GetPlusResearch();
bool GetPlusExplorer();
void AllMissionUpdate(); void AllMissionUpdate();
void ShowSoluceUpdate(); void ShowSoluceUpdate();
@ -65,6 +68,9 @@ protected:
LevelCategory m_category; LevelCategory m_category;
bool m_sceneSoluce; bool m_sceneSoluce;
bool m_plusTrainer;
bool m_plusResearch;
bool m_plusExplorer;
std::map<LevelCategory, int> m_chap; // selected chapter (0..8) std::map<LevelCategory, int> m_chap; // selected chapter (0..8)
std::map<LevelCategory, int> m_sel; // chosen mission (0..98) std::map<LevelCategory, int> m_sel; // chosen mission (0..98)

View File

@ -91,14 +91,22 @@ void CScreenMainMenu::CreateInterface()
pg = pw->CreateGroup(pos, ddim, 26, EVENT_LABEL1); // quit pg = pw->CreateGroup(pos, ddim, 26, EVENT_LABEL1); // quit
pg->SetState(STATE_SHADOW); pg->SetState(STATE_SHADOW);
ddim.x = 0.18f; ddim.x = 0.12f;
ddim.y = dim.y*0.8f; ddim.y = dim.y*0.8f;
pos.x = 0.41f; pos.x = 0.41f;
pos.y = oy+sy*10.5f; pos.y = oy+sy*10.5f;
pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_MISSION); pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_MISSION);
pb->SetState(STATE_SHADOW); pb->SetState(STATE_SHADOW);
ddim.x = 0.06f;
pos.x = 0.53f;
pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_PLUS);
pb->SetState(STATE_SHADOW);
ddim.x = 0.18f;
pos.x = 0.41f;
pos.y = oy+sy*9.6f; pos.y = oy+sy*9.6f;
pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_FREE); pb = pw->CreateButton(pos, ddim, -1, EVENT_INTERFACE_FREE);
pb->SetState(STATE_SHADOW); pb->SetState(STATE_SHADOW);
@ -218,6 +226,11 @@ bool CScreenMainMenu::EventProcess(const Event &event)
m_main->ChangePhase(PHASE_LEVEL_LIST); m_main->ChangePhase(PHASE_LEVEL_LIST);
break; break;
case EVENT_INTERFACE_PLUS:
m_main->SetLevel(LevelCategory::GamePlus, 0, 0);
m_main->ChangePhase(PHASE_LEVEL_LIST);
break;
case EVENT_INTERFACE_USER: case EVENT_INTERFACE_USER:
m_main->SetLevel(LevelCategory::CustomLevels, 0, 0); m_main->SetLevel(LevelCategory::CustomLevels, 0, 0);
m_main->ChangePhase(PHASE_LEVEL_LIST); m_main->ChangePhase(PHASE_LEVEL_LIST);