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"
msgstr ""
msgid "Missions+"
msgstr ""
msgid "Chapters:"
msgstr ""
@ -340,6 +343,9 @@ msgstr ""
msgid "<< Back \\Back to the previous screen"
msgstr ""
msgid "+\\Missions with bonus content and optional challenges"
msgstr ""
msgid "Play\\Start mission!"
msgstr ""
@ -583,6 +589,15 @@ msgstr ""
msgid "Invert\\Invert values on this axis"
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"
msgstr ""

View File

@ -190,6 +190,7 @@ void InitializeEventTypeTexts()
EVENT_TYPE_TEXT[EVENT_INTERFACE_ABORT] = "EVENT_INTERFACE_ABORT";
EVENT_TYPE_TEXT[EVENT_INTERFACE_USER] = "EVENT_INTERFACE_USER";
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_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_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_GLINTr] = "EVENT_INTERFACE_GLINTr";
EVENT_TYPE_TEXT[EVENT_INTERFACE_GLINTu] = "EVENT_INTERFACE_GLINTu";

View File

@ -225,6 +225,7 @@ enum EventType
EVENT_INTERFACE_ABORT = 412,
EVENT_INTERFACE_USER = 413,
EVENT_INTERFACE_SATCOM = 414,
EVENT_INTERFACE_PLUS = 415,
EVENT_INTERFACE_CHAP = 420,
EVENT_INTERFACE_LIST = 421,
@ -311,6 +312,10 @@ enum EventType
EVENT_INTERFACE_JOYSTICK_CAM_Y_INVERT = 573,
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_GLINTr = 591,
EVENT_INTERFACE_GLINTu = 592,

View File

@ -77,6 +77,7 @@ void InitializeRestext()
stringsText[RT_TITLE_PERSO] = TR("Customize your appearance");
stringsText[RT_TITLE_WRITE] = TR("Save the current 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_PLANETS] = TR("Planets:");
@ -181,6 +182,7 @@ void InitializeRestext()
stringsEvent[EVENT_INTERFACE_ABORT] = TR("\\Return to 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_PLUS] = TR("+\\Missions with bonus content and optional challenges");
stringsEvent[EVENT_INTERFACE_PLAY] = TR("Play\\Start mission!");
stringsEvent[EVENT_INTERFACE_SETUPd] = TR("Device\\Driver and resolution 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_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_NOK] = TR("OK\\Choose the selected player");
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_READ = 51,
RT_TITLE_USER = 52,
RT_TITLE_PLUS = 53,
RT_PLAY_CHAP_CHAPTERS = 60,
RT_PLAY_CHAP_PLANETS = 61,

View File

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

View File

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

View File

@ -2461,6 +2461,7 @@ bool CRobotMain::EventFrame(const Event &event)
{
if (m_levelCategory == LevelCategory::Missions ||
m_levelCategory == LevelCategory::FreeGame ||
m_levelCategory == LevelCategory::GamePlus ||
m_levelCategory == LevelCategory::CustomLevels)
{
if (!IOIsBusy() && m_missionType != MISSION_CODE_BATTLE)
@ -3781,6 +3782,12 @@ void CRobotMain::CreateScene(bool soluce, bool fixScene, bool resetObject)
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)
{
m_short->SetMode(false); // vehicles?
@ -5347,6 +5354,16 @@ bool CRobotMain::GetTrainerPilot()
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
bool CRobotMain::GetFixScene()
{

View File

@ -266,6 +266,8 @@ public:
const std::string& GetScriptName();
const std::string& GetScriptFile();
bool GetTrainerPilot();
bool GetPlusTrainer();
bool GetPlusExplorer();
bool GetFixScene();
bool GetShowSoluce();
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));
// Creates the neutron gun.
if ( option != 2 ) // with backpack?
if ( option != 2 && !m_main->GetPlusExplorer()) // with backpack?
{
rank = m_engine->CreateObject();
m_engine->SetObjectType(rank, Gfx::ENG_OBJTYPE_DESCENDANT);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -762,6 +762,21 @@ bool CMainUserInterface::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()
{
if (m_phase == PHASE_APPERANCE)

View File

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

View File

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

View File

@ -48,6 +48,9 @@ CScreenLevelList::CScreenLevelList(CMainDialog* mainDialog)
: m_dialog(mainDialog),
m_category{},
m_sceneSoluce{false},
m_plusTrainer{false},
m_plusResearch{false},
m_plusExplorer{false},
m_maxList{0},
m_accessChap{0}
{
@ -86,6 +89,7 @@ void CScreenLevelList::CreateInterface()
if ( m_category == LevelCategory::Missions ) res = RT_TITLE_MISSION;
if ( m_category == LevelCategory::FreeGame ) res = RT_TITLE_FREE;
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;
GetResource(RES_TEXT, res, name);
pw->SetName(name);
@ -109,6 +113,7 @@ void CScreenLevelList::CreateInterface()
res = RT_PLAY_CHAP_CHAPTERS;
if ( m_category == LevelCategory::Missions ) 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;
GetResource(RES_TEXT, res, 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::Missions ) res = RT_PLAY_LIST_MISSIONS;
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);
pl = pw->CreateLabel(pos, ddim, 0, EVENT_LABEL12, name);
pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT);
@ -179,6 +185,7 @@ void CScreenLevelList::CreateInterface()
// Button displays the "soluce":
if ( m_category != LevelCategory::Exercises &&
m_category != LevelCategory::GamePlus &&
m_category != LevelCategory::FreeGame )
{
pos.x = ox+sx*9.5f;
@ -191,10 +198,36 @@ void CScreenLevelList::CreateInterface()
}
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);
if ( m_category == LevelCategory::Missions ||
m_category == LevelCategory::FreeGame ||
m_category == LevelCategory::GamePlus ||
m_category == LevelCategory::CustomLevels )
{
pos.x = ox+sx*9.5f;
@ -295,6 +328,27 @@ bool CScreenLevelList::EventProcess(const Event &event)
pb->SetState(STATE_CHECK, m_sceneSoluce);
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:
m_main->SetLevel(m_category, m_chap[m_category]+1, m_sel[m_category]+1);
m_main->ChangePhase(PHASE_SIMUL);
@ -331,6 +385,21 @@ bool CScreenLevelList::GetSceneSoluce()
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.
void CScreenLevelList::UpdateSceneChap(int &chap)
@ -392,7 +461,7 @@ void CScreenLevelList::UpdateSceneChap(int &chap)
pl->SetCheck(j, bPassed);
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 ++;
break;
@ -459,7 +528,7 @@ void CScreenLevelList::UpdateSceneList(int chap, int &sel)
pl->SetCheck(j, bPassed);
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;
}

View File

@ -43,6 +43,9 @@ public:
void SetSelection(LevelCategory category, int chap, int rank);
bool GetSceneSoluce();
bool GetPlusTrainer();
bool GetPlusResearch();
bool GetPlusExplorer();
void AllMissionUpdate();
void ShowSoluceUpdate();
@ -65,6 +68,9 @@ protected:
LevelCategory m_category;
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_sel; // chosen mission (0..98)

View File

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