Merge pull request #1406 from colobot/dev-gameplus

Add Missions+ gamemode, add new CBOT categories and functions, update Sniffers
pyro-refactor
Emxx52 2021-03-30 21:05:34 +02:00 committed by GitHub
commit fabbdda964
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
40 changed files with 627 additions and 90 deletions

2
data

@ -1 +1 @@
Subproject commit 069fc5bd15b87aaf5b1b301a787f05a99dfc3856 Subproject commit 87aeb32afbc7e4135a5a3533998a9274d9de30a3

View File

@ -84,6 +84,9 @@ msgstr ""
msgid "Load a saved mission" msgid "Load a saved mission"
msgstr "" msgstr ""
msgid "Missions+"
msgstr ""
msgid "Mods" msgid "Mods"
msgstr "" msgstr ""
@ -399,6 +402,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 ""
@ -660,6 +666,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 ""
@ -831,7 +846,7 @@ msgstr ""
msgid "Build a exchange post" msgid "Build a exchange post"
msgstr "" msgstr ""
msgid "Build a destroyer" msgid "Build a vault"
msgstr "" msgstr ""
msgid "Show if the ground is flat" msgid "Show if the ground is flat"

View File

@ -32,6 +32,9 @@ msgstr "Chybí \"]\""
msgid "%s: %d pts" msgid "%s: %d pts"
msgstr "%s: %d bodů" msgstr "%s: %d bodů"
msgid "+\\Missions with bonus content and optional challenges"
msgstr ""
msgid "..behind" msgid "..behind"
msgstr "...za sebou" msgstr "...za sebou"
@ -200,9 +203,6 @@ msgstr "Postavit obrannou věž"
msgid "Build a derrick" msgid "Build a derrick"
msgstr "Postavit vrtnou věž" msgstr "Postavit vrtnou věž"
msgid "Build a destroyer"
msgstr "Postavit drtič"
msgid "Build a exchange post" msgid "Build a exchange post"
msgstr "Postavit komunikační stanici" msgstr "Postavit komunikační stanici"
@ -275,6 +275,9 @@ msgstr "Vyrobit pásový kanón"
msgid "Build a tracked sniffer" msgid "Build a tracked sniffer"
msgstr "Vyrobit pásový detektor" msgstr "Vyrobit pásový detektor"
msgid "Build a vault"
msgstr ""
msgid "Build a wheeled builder" msgid "Build a wheeled builder"
msgstr "" msgstr ""
@ -928,6 +931,9 @@ msgstr "Mise"
msgid "Missions on this planet:" msgid "Missions on this planet:"
msgstr "Mise na této planetě:" msgstr "Mise na této planetě:"
msgid "Missions+"
msgstr "Mise+"
msgid "Missions\\Select mission" msgid "Missions\\Select mission"
msgstr "Mise\\Vyberte misi" msgstr "Mise\\Vyberte misi"
@ -1513,6 +1519,15 @@ msgstr "Zvukové efekty:\\Hlasitost motorů, hlasů, střelby, atd."
msgid "Sound\\Music and game sound volume" msgid "Sound\\Music and game sound volume"
msgstr "Zvuk\\Hlasitost hudby a zvukových efektů" msgstr "Zvuk\\Hlasitost hudby a zvukových efektů"
msgid "Space Explorer\\Disables astronaut abilities"
msgstr ""
msgid "Space Programmer\\Disables radio-control"
msgstr ""
msgid "Space Researcher\\Disables using all previously researched technologies"
msgstr ""
msgid "Spaceship" msgid "Spaceship"
msgstr "Raketa" msgstr "Raketa"
@ -1998,3 +2013,6 @@ msgstr "colobot.info"
msgid "epsitec.com" msgid "epsitec.com"
msgstr "epsitec.com" msgstr "epsitec.com"
#~ msgid "Build a destroyer"
#~ msgstr "Postavit drtič"

View File

@ -33,6 +33,9 @@ msgstr "Es fehlt eine geschlossene eckige Klammer \" ] \""
msgid "%s: %d pts" msgid "%s: %d pts"
msgstr "" msgstr ""
msgid "+\\Missions with bonus content and optional challenges"
msgstr ""
msgid "..behind" msgid "..behind"
msgstr "..hinten" msgstr "..hinten"
@ -201,9 +204,6 @@ msgstr "Baut einen Geschützturm"
msgid "Build a derrick" msgid "Build a derrick"
msgstr "Baut einen Bohrturm" msgstr "Baut einen Bohrturm"
msgid "Build a destroyer"
msgstr "Baue einen Zerstörer"
msgid "Build a exchange post" msgid "Build a exchange post"
msgstr "Baut einen Infoserver" msgstr "Baut einen Infoserver"
@ -276,6 +276,9 @@ msgstr "Baut einen Kettenshooter"
msgid "Build a tracked sniffer" msgid "Build a tracked sniffer"
msgstr "Baut einen Kettenschnüffler" msgstr "Baut einen Kettenschnüffler"
msgid "Build a vault"
msgstr ""
msgid "Build a wheeled builder" msgid "Build a wheeled builder"
msgstr "" msgstr ""
@ -944,6 +947,9 @@ msgstr "Missionen"
msgid "Missions on this planet:" msgid "Missions on this planet:"
msgstr "Liste der Missionen des Planeten:" msgstr "Liste der Missionen des Planeten:"
msgid "Missions+"
msgstr "Missionen+"
msgid "Missions\\Select mission" msgid "Missions\\Select mission"
msgstr "Missionen\\Aufbruch ins Weltall" msgstr "Missionen\\Aufbruch ins Weltall"
@ -1530,6 +1536,15 @@ msgstr "Geräusche:\\Lautstärke Motoren, Stimmen, usw."
msgid "Sound\\Music and game sound volume" msgid "Sound\\Music and game sound volume"
msgstr "Geräusche\\Lautstärke Geräusche und Musik" msgstr "Geräusche\\Lautstärke Geräusche und Musik"
msgid "Space Explorer\\Disables astronaut abilities"
msgstr ""
msgid "Space Programmer\\Disables radio-control"
msgstr ""
msgid "Space Researcher\\Disables using all previously researched technologies"
msgstr ""
msgid "Spaceship" msgid "Spaceship"
msgstr "Raumschiff" msgstr "Raumschiff"
@ -2029,6 +2044,9 @@ msgstr "epsitec.com"
#~ msgid "3D sound\\3D positioning of the sound" #~ msgid "3D sound\\3D positioning of the sound"
#~ msgstr "3D-Geräusche\\Orten der Geräusche im Raum" #~ msgstr "3D-Geräusche\\Orten der Geräusche im Raum"
#~ msgid "Build a destroyer"
#~ msgstr "Baue einen Zerstörer"
#~ msgid "Building too close" #~ msgid "Building too close"
#~ msgstr "Gebäude zu nahe" #~ msgstr "Gebäude zu nahe"

View File

@ -32,6 +32,9 @@ msgstr "\" ] \" manquant"
msgid "%s: %d pts" msgid "%s: %d pts"
msgstr "%s: %d points" msgstr "%s: %d points"
msgid "+\\Missions with bonus content and optional challenges"
msgstr ""
msgid "..behind" msgid "..behind"
msgstr "..derrière" msgstr "..derrière"
@ -203,9 +206,6 @@ msgstr "Construire une tour"
msgid "Build a derrick" msgid "Build a derrick"
msgstr "Construire un derrick" msgstr "Construire un derrick"
msgid "Build a destroyer"
msgstr "Construire un destructeur"
msgid "Build a exchange post" msgid "Build a exchange post"
msgstr "Construire une station relais" msgstr "Construire une station relais"
@ -278,6 +278,9 @@ msgstr "Fabriquer un tireur à chenilles"
msgid "Build a tracked sniffer" msgid "Build a tracked sniffer"
msgstr "Fabriquer un renifleur à chenilles" msgstr "Fabriquer un renifleur à chenilles"
msgid "Build a vault"
msgstr ""
msgid "Build a wheeled builder" msgid "Build a wheeled builder"
msgstr "" msgstr ""
@ -946,6 +949,9 @@ msgstr "Missions"
msgid "Missions on this planet:" msgid "Missions on this planet:"
msgstr "Liste des missions du chapitre :" msgstr "Liste des missions du chapitre :"
msgid "Missions+"
msgstr "Missions+"
msgid "Missions\\Select mission" msgid "Missions\\Select mission"
msgstr "Missions\\La grande aventure" msgstr "Missions\\La grande aventure"
@ -1532,6 +1538,15 @@ msgstr "Sons :\\Volume des moteurs, voix, etc."
msgid "Sound\\Music and game sound volume" msgid "Sound\\Music and game sound volume"
msgstr "Son\\Volumes des sons & musiques" msgstr "Son\\Volumes des sons & musiques"
msgid "Space Explorer\\Disables astronaut abilities"
msgstr ""
msgid "Space Programmer\\Disables radio-control"
msgstr ""
msgid "Space Researcher\\Disables using all previously researched technologies"
msgstr ""
msgid "Spaceship" msgid "Spaceship"
msgstr "Vaisseau spatial" msgstr "Vaisseau spatial"
@ -2028,6 +2043,9 @@ msgstr "epsitec.com"
#~ msgid "3D sound\\3D positioning of the sound" #~ msgid "3D sound\\3D positioning of the sound"
#~ msgstr "Bruitages 3D\\Positionnement sonore dans l'espace" #~ msgstr "Bruitages 3D\\Positionnement sonore dans l'espace"
#~ msgid "Build a destroyer"
#~ msgstr "Construire un destructeur"
#~ msgid "Building too close" #~ msgid "Building too close"
#~ msgstr "Bâtiment trop proche" #~ msgstr "Bâtiment trop proche"

View File

@ -31,6 +31,9 @@ msgstr "Brak \" ] \""
msgid "%s: %d pts" msgid "%s: %d pts"
msgstr "%s: %d pkt" msgstr "%s: %d pkt"
msgid "+\\Missions with bonus content and optional challenges"
msgstr ""
msgid "..behind" msgid "..behind"
msgstr "..za" msgstr "..za"
@ -199,9 +202,6 @@ msgstr "Zbuduj wieżę obronną"
msgid "Build a derrick" msgid "Build a derrick"
msgstr "Zbuduj kopalnię" msgstr "Zbuduj kopalnię"
msgid "Build a destroyer"
msgstr "Zbuduj niszczarkę"
msgid "Build a exchange post" msgid "Build a exchange post"
msgstr "Zbuduj stację przekaźnikową" msgstr "Zbuduj stację przekaźnikową"
@ -274,6 +274,9 @@ msgstr "Zbuduj działo na gąsienicach"
msgid "Build a tracked sniffer" msgid "Build a tracked sniffer"
msgstr "Zbuduj szperacz na gąsienicach" msgstr "Zbuduj szperacz na gąsienicach"
msgid "Build a vault"
msgstr ""
msgid "Build a wheeled builder" msgid "Build a wheeled builder"
msgstr "" msgstr ""
@ -927,6 +930,9 @@ msgstr "Misje"
msgid "Missions on this planet:" msgid "Missions on this planet:"
msgstr "Misje na tej planecie:" msgstr "Misje na tej planecie:"
msgid "Missions+"
msgstr "Misje+"
msgid "Missions\\Select mission" msgid "Missions\\Select mission"
msgstr "Misje\\Wybierz misję" msgstr "Misje\\Wybierz misję"
@ -1512,6 +1518,15 @@ msgstr "Efekty dźwiękowe:\\Głośność silników, głosów, strzałów, itp."
msgid "Sound\\Music and game sound volume" msgid "Sound\\Music and game sound volume"
msgstr "Dźwięk\\Głośność muzyki i dźwięków gry" msgstr "Dźwięk\\Głośność muzyki i dźwięków gry"
msgid "Space Explorer\\Disables astronaut abilities"
msgstr ""
msgid "Space Programmer\\Disables radio-control"
msgstr ""
msgid "Space Researcher\\Disables using all previously researched technologies"
msgstr ""
msgid "Spaceship" msgid "Spaceship"
msgstr "Statek kosmiczny" msgstr "Statek kosmiczny"
@ -2007,6 +2022,9 @@ msgstr "epsitec.com"
#~ msgid "3D sound\\3D positioning of the sound" #~ msgid "3D sound\\3D positioning of the sound"
#~ msgstr "Dźwięk 3D\\Przestrzenne pozycjonowanie dźwięków" #~ msgstr "Dźwięk 3D\\Przestrzenne pozycjonowanie dźwięków"
#~ msgid "Build a destroyer"
#~ msgstr "Zbuduj niszczarkę"
#~ msgid "Building too close" #~ msgid "Building too close"
#~ msgstr "Budynek za blisko" #~ msgstr "Budynek za blisko"

View File

@ -29,6 +29,9 @@ msgstr "\" ] \" faltando"
msgid "%s: %d pts" msgid "%s: %d pts"
msgstr "" msgstr ""
msgid "+\\Missions with bonus content and optional challenges"
msgstr ""
msgid "..behind" msgid "..behind"
msgstr "..atrás" msgstr "..atrás"
@ -197,9 +200,6 @@ msgstr "Construir uma torre de defesa"
msgid "Build a derrick" msgid "Build a derrick"
msgstr "Construir um extrator" msgstr "Construir um extrator"
msgid "Build a destroyer"
msgstr "Construir um destruidor"
msgid "Build a exchange post" msgid "Build a exchange post"
msgstr "Construir um posto de troca" msgstr "Construir um posto de troca"
@ -272,6 +272,9 @@ msgstr "Construir um atirador com esteiras"
msgid "Build a tracked sniffer" msgid "Build a tracked sniffer"
msgstr "Construir um farejador com esteiras" msgstr "Construir um farejador com esteiras"
msgid "Build a vault"
msgstr ""
msgid "Build a wheeled builder" msgid "Build a wheeled builder"
msgstr "" msgstr ""
@ -941,6 +944,9 @@ msgstr "Missões"
msgid "Missions on this planet:" msgid "Missions on this planet:"
msgstr "Lista de missões neste planeta:" msgstr "Lista de missões neste planeta:"
msgid "Missions+"
msgstr "Missões+"
msgid "Missions\\Select mission" msgid "Missions\\Select mission"
msgstr "Missões\\Selecione uma missão" msgstr "Missões\\Selecione uma missão"
@ -1527,6 +1533,15 @@ msgstr "Efeitos sonoros:\\Volume dos motores, voz, tiros, etc."
msgid "Sound\\Music and game sound volume" msgid "Sound\\Music and game sound volume"
msgstr "Som\\Volume do som das músicas e do jogo" msgstr "Som\\Volume do som das músicas e do jogo"
msgid "Space Explorer\\Disables astronaut abilities"
msgstr ""
msgid "Space Programmer\\Disables radio-control"
msgstr ""
msgid "Space Researcher\\Disables using all previously researched technologies"
msgstr ""
msgid "Spaceship" msgid "Spaceship"
msgstr "Nave espacial" msgstr "Nave espacial"
@ -2026,6 +2041,9 @@ msgstr "epsitec.com"
#~ msgid "3D sound\\3D positioning of the sound" #~ msgid "3D sound\\3D positioning of the sound"
#~ msgstr "Bruitages 3D\\Positionnement sonore dans l'espace" #~ msgstr "Bruitages 3D\\Positionnement sonore dans l'espace"
#~ msgid "Build a destroyer"
#~ msgstr "Construir um destruidor"
#~ msgid "Building too close" #~ msgid "Building too close"
#~ msgstr "Bâtiment trop proche" #~ msgstr "Bâtiment trop proche"

View File

@ -31,6 +31,9 @@ msgstr "Отсутствует \"]\" "
msgid "%s: %d pts" msgid "%s: %d pts"
msgstr "" msgstr ""
msgid "+\\Missions with bonus content and optional challenges"
msgstr ""
msgid "..behind" msgid "..behind"
msgstr "Сзади" msgstr "Сзади"
@ -200,9 +203,6 @@ msgstr "Построить защитную башню"
msgid "Build a derrick" msgid "Build a derrick"
msgstr "Построить буровую вышку" msgstr "Построить буровую вышку"
msgid "Build a destroyer"
msgstr "Построить уничтожитель"
msgid "Build a exchange post" msgid "Build a exchange post"
msgstr "Построить пост по обмену сообщениями" msgstr "Построить пост по обмену сообщениями"
@ -275,6 +275,9 @@ msgstr "Собрать гусеничного стрелка"
msgid "Build a tracked sniffer" msgid "Build a tracked sniffer"
msgstr "Собрать гусеничного искателя" msgstr "Собрать гусеничного искателя"
msgid "Build a vault"
msgstr ""
msgid "Build a wheeled builder" msgid "Build a wheeled builder"
msgstr "" msgstr ""
@ -950,6 +953,9 @@ msgstr "Миссии"
msgid "Missions on this planet:" msgid "Missions on this planet:"
msgstr "Миссии на этой планете:" msgstr "Миссии на этой планете:"
msgid "Missions+"
msgstr "Миссии+"
msgid "Missions\\Select mission" msgid "Missions\\Select mission"
msgstr "Миссии\\Выбор миссии" msgstr "Миссии\\Выбор миссии"
@ -1542,6 +1548,15 @@ msgstr "Общий звук:\\Гормкость двигателя, голос
msgid "Sound\\Music and game sound volume" msgid "Sound\\Music and game sound volume"
msgstr "Звук\\Громкость музыки и звуков" msgstr "Звук\\Громкость музыки и звуков"
msgid "Space Explorer\\Disables astronaut abilities"
msgstr ""
msgid "Space Programmer\\Disables radio-control"
msgstr ""
msgid "Space Researcher\\Disables using all previously researched technologies"
msgstr ""
msgid "Spaceship" msgid "Spaceship"
msgstr "Космический корабль" msgstr "Космический корабль"
@ -2042,6 +2057,9 @@ msgstr "epsitec.com"
#~ msgid "3D sound\\3D positioning of the sound" #~ msgid "3D sound\\3D positioning of the sound"
#~ msgstr "3D-звук\\Стерео звук" #~ msgstr "3D-звук\\Стерео звук"
#~ msgid "Build a destroyer"
#~ msgstr "Построить уничтожитель"
#~ msgid "Building too close" #~ msgid "Building too close"
#~ 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_MODS] = "EVENT_INTERFACE_MODS"; EVENT_TYPE_TEXT[EVENT_INTERFACE_MODS] = "EVENT_INTERFACE_MODS";
EVENT_TYPE_TEXT[EVENT_INTERFACE_CHAP] = "EVENT_INTERFACE_CHAP"; EVENT_TYPE_TEXT[EVENT_INTERFACE_CHAP] = "EVENT_INTERFACE_CHAP";
@ -273,6 +274,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_MOD_LIST] = "EVENT_INTERFACE_MOD_LIST"; EVENT_TYPE_TEXT[EVENT_INTERFACE_MOD_LIST] = "EVENT_INTERFACE_MOD_LIST";
EVENT_TYPE_TEXT[EVENT_INTERFACE_WORKSHOP] = "EVENT_INTERFACE_WORKSHOP"; EVENT_TYPE_TEXT[EVENT_INTERFACE_WORKSHOP] = "EVENT_INTERFACE_WORKSHOP";
EVENT_TYPE_TEXT[EVENT_INTERFACE_MODS_DIR] = "EVENT_INTERFACE_MODS_DIR"; EVENT_TYPE_TEXT[EVENT_INTERFACE_MODS_DIR] = "EVENT_INTERFACE_MODS_DIR";
@ -416,7 +421,7 @@ void InitializeEventTypeTexts()
EVENT_TYPE_TEXT[EVENT_OBJECT_BNUCLEAR] = "EVENT_OBJECT_BNUCLEAR"; EVENT_TYPE_TEXT[EVENT_OBJECT_BNUCLEAR] = "EVENT_OBJECT_BNUCLEAR";
EVENT_TYPE_TEXT[EVENT_OBJECT_BPARA] = "EVENT_OBJECT_BPARA"; EVENT_TYPE_TEXT[EVENT_OBJECT_BPARA] = "EVENT_OBJECT_BPARA";
EVENT_TYPE_TEXT[EVENT_OBJECT_BINFO] = "EVENT_OBJECT_BINFO"; EVENT_TYPE_TEXT[EVENT_OBJECT_BINFO] = "EVENT_OBJECT_BINFO";
EVENT_TYPE_TEXT[EVENT_OBJECT_BDESTROYER] = "EVENT_OBJECT_BDESTROYER"; EVENT_TYPE_TEXT[EVENT_OBJECT_BSAFE] = "EVENT_OBJECT_BSAFE";
EVENT_TYPE_TEXT[EVENT_OBJECT_GFLAT] = "EVENT_OBJECT_GFLAT"; EVENT_TYPE_TEXT[EVENT_OBJECT_GFLAT] = "EVENT_OBJECT_GFLAT";
EVENT_TYPE_TEXT[EVENT_OBJECT_FCREATE] = "EVENT_OBJECT_FCREATE"; EVENT_TYPE_TEXT[EVENT_OBJECT_FCREATE] = "EVENT_OBJECT_FCREATE";
EVENT_TYPE_TEXT[EVENT_OBJECT_FDELETE] = "EVENT_OBJECT_FDELETE"; EVENT_TYPE_TEXT[EVENT_OBJECT_FDELETE] = "EVENT_OBJECT_FDELETE";

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_MODS = 416, EVENT_INTERFACE_MODS = 416,
EVENT_INTERFACE_CHAP = 420, EVENT_INTERFACE_CHAP = 420,
@ -312,6 +313,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_MOD_LIST = 580, EVENT_INTERFACE_MOD_LIST = 580,
EVENT_INTERFACE_WORKSHOP = 581, EVENT_INTERFACE_WORKSHOP = 581,
EVENT_INTERFACE_MODS_DIR = 582, EVENT_INTERFACE_MODS_DIR = 582,
@ -481,7 +486,7 @@ enum EventType
EVENT_OBJECT_BNUCLEAR = 1060, EVENT_OBJECT_BNUCLEAR = 1060,
EVENT_OBJECT_BPARA = 1061, EVENT_OBJECT_BPARA = 1061,
EVENT_OBJECT_BINFO = 1062, EVENT_OBJECT_BINFO = 1062,
EVENT_OBJECT_BDESTROYER = 1063, EVENT_OBJECT_BSAFE = 1063,
EVENT_OBJECT_GFLAT = 1070, EVENT_OBJECT_GFLAT = 1070,
EVENT_OBJECT_FCREATE = 1071, EVENT_OBJECT_FCREATE = 1071,
EVENT_OBJECT_FDELETE = 1072, EVENT_OBJECT_FDELETE = 1072,

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_TITLE_MODS] = TR("Mods"); stringsText[RT_TITLE_MODS] = TR("Mods");
stringsText[RT_PLAY_CHAP_CHAPTERS] = TR("Chapters:"); stringsText[RT_PLAY_CHAP_CHAPTERS] = TR("Chapters:");
@ -199,6 +200,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_WORKSHOP] = TR("Workshop\\Open the workshop to search for mods"); stringsEvent[EVENT_INTERFACE_WORKSHOP] = TR("Workshop\\Open the workshop to search for mods");
stringsEvent[EVENT_INTERFACE_MODS_DIR] = TR("Open Directory\\Open the mods directory"); stringsEvent[EVENT_INTERFACE_MODS_DIR] = TR("Open Directory\\Open the mods directory");
@ -299,6 +301,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");
@ -365,7 +371,7 @@ void InitializeRestext()
stringsEvent[EVENT_OBJECT_BNUCLEAR] = TR("Build a nuclear power plant"); stringsEvent[EVENT_OBJECT_BNUCLEAR] = TR("Build a nuclear power plant");
stringsEvent[EVENT_OBJECT_BPARA] = TR("Build a lightning conductor"); stringsEvent[EVENT_OBJECT_BPARA] = TR("Build a lightning conductor");
stringsEvent[EVENT_OBJECT_BINFO] = TR("Build a exchange post"); stringsEvent[EVENT_OBJECT_BINFO] = TR("Build a exchange post");
stringsEvent[EVENT_OBJECT_BDESTROYER] = TR("Build a destroyer"); stringsEvent[EVENT_OBJECT_BSAFE] = TR("Build a vault");
stringsEvent[EVENT_OBJECT_GFLAT] = TR("Show if the ground is flat"); stringsEvent[EVENT_OBJECT_GFLAT] = TR("Show if the ground is flat");
stringsEvent[EVENT_OBJECT_FCREATE] = TR("Plant a flag"); stringsEvent[EVENT_OBJECT_FCREATE] = TR("Plant a flag");
stringsEvent[EVENT_OBJECT_FDELETE] = TR("Remove a flag"); stringsEvent[EVENT_OBJECT_FDELETE] = TR("Remove a flag");

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_TITLE_MODS = 54, RT_TITLE_MODS = 54,
RT_PLAY_CHAP_CHAPTERS = 60, RT_PLAY_CHAP_CHAPTERS = 60,

View File

@ -41,7 +41,8 @@ enum BuildType
BUILD_LABO = (1<<10), //! < AutoLab BUILD_LABO = (1<<10), //! < AutoLab
BUILD_PARA = (1<<11), //! < PowerCaptor BUILD_PARA = (1<<11), //! < PowerCaptor
BUILD_INFO = (1<<12), //! < ExchangePost BUILD_INFO = (1<<12), //! < ExchangePost
BUILD_DESTROYER = (1<<13), //! < Destroyer BUILD_SAFE = (1<<13), //! < Vault
BUILD_DESTROYER = (1<<14), //! < Destroyer
BUILD_GFLAT = (1<<16), //! < checking flat ground BUILD_GFLAT = (1<<16), //! < checking flat ground
BUILD_FLAG = (1<<17) //! < putting / removing flags BUILD_FLAG = (1<<17) //! < putting / removing flags
}; };

View File

@ -25,10 +25,11 @@
// TODO: I'm not sure about "challenges" + "custom". It may be messing things up already right now. // TODO: I'm not sure about "challenges" + "custom". It may be messing things up already right now.
const std::map<LevelCategory, std::string> CATEGORY_DIR_MAP = { const std::map<LevelCategory, std::string> CATEGORY_DIR_MAP = {
{ LevelCategory::Missions, "missions" }, { LevelCategory::Missions, "missions" },
{ LevelCategory::FreeGame, "freemissions" }, { LevelCategory::FreeGame, "free" },
{ 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

@ -885,6 +885,7 @@ int CLevelParserParam::ToBuildFlag(std::string value)
if (value == "AutoLab" ) return BUILD_LABO; if (value == "AutoLab" ) return BUILD_LABO;
if (value == "PowerCaptor" ) return BUILD_PARA; if (value == "PowerCaptor" ) return BUILD_PARA;
if (value == "ExchangePost" ) return BUILD_INFO; if (value == "ExchangePost" ) return BUILD_INFO;
if (value == "Vault" ) return BUILD_SAFE;
if (value == "Destroyer" ) return BUILD_DESTROYER; if (value == "Destroyer" ) return BUILD_DESTROYER;
if (value == "FlatGround" ) return BUILD_GFLAT; if (value == "FlatGround" ) return BUILD_GFLAT;
if (value == "Flag" ) return BUILD_FLAG; if (value == "Flag" ) return BUILD_FLAG;

View File

@ -2462,6 +2462,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)
@ -3784,6 +3785,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?
@ -5351,6 +5358,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()
{ {
@ -5874,6 +5891,7 @@ bool CRobotMain::IsBuildingEnabled(ObjectType type)
if(type == OBJECT_NUCLEAR) return IsBuildingEnabled(BUILD_NUCLEAR); if(type == OBJECT_NUCLEAR) return IsBuildingEnabled(BUILD_NUCLEAR);
if(type == OBJECT_INFO) return IsBuildingEnabled(BUILD_INFO); if(type == OBJECT_INFO) return IsBuildingEnabled(BUILD_INFO);
if(type == OBJECT_PARA) return IsBuildingEnabled(BUILD_PARA); if(type == OBJECT_PARA) return IsBuildingEnabled(BUILD_PARA);
if(type == OBJECT_SAFE) return IsBuildingEnabled(BUILD_SAFE);
if(type == OBJECT_DESTROYER) return IsBuildingEnabled(BUILD_DESTROYER); if(type == OBJECT_DESTROYER) return IsBuildingEnabled(BUILD_DESTROYER);
return false; return false;
@ -5944,6 +5962,8 @@ Error CRobotMain::CanFactoryError(ObjectType type, int team)
if (type == OBJECT_MOBILEst && !IsResearchDone(RESEARCH_SUBM, team)) return ERR_BUILD_DISABLED; if (type == OBJECT_MOBILEst && !IsResearchDone(RESEARCH_SUBM, team)) return ERR_BUILD_DISABLED;
if (type == OBJECT_MOBILEtg && !IsResearchDone(RESEARCH_TARGET, team)) return ERR_BUILD_RESEARCH; if (type == OBJECT_MOBILEtg && !IsResearchDone(RESEARCH_TARGET, team)) return ERR_BUILD_RESEARCH;
if (tool == ToolType::Other && drive == DriveType::Other && type != OBJECT_MOBILEtg) return ERR_WRONG_OBJ;
return ERR_OK; return ERR_OK;
} }

View File

@ -267,6 +267,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

@ -27,21 +27,22 @@ std::string TraceColorName(TraceColor color)
{ {
switch(color) switch(color)
{ {
case TraceColor::Blue: return "Blue";
case TraceColor::Red: return "Red";
case TraceColor::Green: return "Green";
case TraceColor::Yellow: return "Yellow";
case TraceColor::Violet: return "Violet";
case TraceColor::White: return "White"; case TraceColor::White: return "White";
case TraceColor::Black: return "Black"; case TraceColor::Black: return "Black";
case TraceColor::Gray: return "Gray"; case TraceColor::Gray: return "Gray";
case TraceColor::LightGray: return "LightGray"; case TraceColor::LightGray: return "LightGray";
case TraceColor::Red: return "Red";
case TraceColor::Pink: return "Pink"; case TraceColor::Pink: return "Pink";
case TraceColor::Purple: return "Purple"; case TraceColor::Purple: return "Purple";
case TraceColor::Orange: return "Orange"; case TraceColor::Orange: return "Orange";
case TraceColor::Yellow: return "Yellow";
case TraceColor::Beige: return "Beige"; case TraceColor::Beige: return "Beige";
case TraceColor::Brown: return "Brown"; case TraceColor::Brown: return "Brown";
case TraceColor::Skin: return "Skin"; case TraceColor::Skin: return "Skin";
case TraceColor::Green: return "Green";
case TraceColor::LightGreen: return "LightGreen"; case TraceColor::LightGreen: return "LightGreen";
case TraceColor::Blue: return "Blue";
case TraceColor::LightBlue: return "LightBlue"; case TraceColor::LightBlue: return "LightBlue";
case TraceColor::RedArrow: return "RedArrow"; case TraceColor::RedArrow: return "RedArrow";
case TraceColor::BlackArrow: return "BlackArrow"; case TraceColor::BlackArrow: return "BlackArrow";
@ -55,21 +56,22 @@ Gfx::Color TraceColorColor(TraceColor color)
{ {
switch(color) switch(color)
{ {
case TraceColor::Blue: return Gfx::Color(0.000f, 0.000f, 0.753f, 1.0f);
case TraceColor::Red: return Gfx::Color(1.000f, 0.000f, 0.000f, 1.0f);
case TraceColor::Green: return Gfx::Color(0.000f, 0.627f, 0.000f, 1.0f);
case TraceColor::Yellow: return Gfx::Color(1.000f, 1.000f, 0.000f, 1.0f);
case TraceColor::Violet: return Gfx::Color(0.820f, 0.000f, 0.997f, 1.0f);
case TraceColor::White: return Gfx::Color(1.000f, 1.000f, 1.000f, 1.0f); case TraceColor::White: return Gfx::Color(1.000f, 1.000f, 1.000f, 1.0f);
case TraceColor::Black: return Gfx::Color(0.000f, 0.000f, 0.000f, 1.0f); case TraceColor::Black: return Gfx::Color(0.000f, 0.000f, 0.000f, 1.0f);
case TraceColor::Gray: return Gfx::Color(0.549f, 0.549f, 0.549f, 1.0f); case TraceColor::Gray: return Gfx::Color(0.549f, 0.549f, 0.549f, 1.0f);
case TraceColor::LightGray: return Gfx::Color(0.753f, 0.753f, 0.753f, 1.0f); case TraceColor::LightGray: return Gfx::Color(0.753f, 0.753f, 0.753f, 1.0f);
case TraceColor::Red: return Gfx::Color(1.000f, 0.000f, 0.000f, 1.0f);
case TraceColor::Pink: return Gfx::Color(1.000f, 0.627f, 0.753f, 1.0f); case TraceColor::Pink: return Gfx::Color(1.000f, 0.627f, 0.753f, 1.0f);
case TraceColor::Purple: return Gfx::Color(0.878f, 0.000f, 0.753f, 1.0f); case TraceColor::Purple: return Gfx::Color(0.878f, 0.000f, 0.753f, 1.0f);
case TraceColor::Orange: return Gfx::Color(1.000f, 0.627f, 0.000f, 1.0f); case TraceColor::Orange: return Gfx::Color(1.000f, 0.627f, 0.000f, 1.0f);
case TraceColor::Yellow: return Gfx::Color(1.000f, 1.000f, 0.000f, 1.0f);
case TraceColor::Beige: return Gfx::Color(0.878f, 0.753f, 0.000f, 1.0f); case TraceColor::Beige: return Gfx::Color(0.878f, 0.753f, 0.000f, 1.0f);
case TraceColor::Brown: return Gfx::Color(0.627f, 0.361f, 0.000f, 1.0f); case TraceColor::Brown: return Gfx::Color(0.627f, 0.361f, 0.000f, 1.0f);
case TraceColor::Skin: return Gfx::Color(0.961f, 0.839f, 0.714f, 1.0f); case TraceColor::Skin: return Gfx::Color(0.961f, 0.839f, 0.714f, 1.0f);
case TraceColor::Green: return Gfx::Color(0.000f, 0.627f, 0.000f, 1.0f);
case TraceColor::LightGreen: return Gfx::Color(0.000f, 1.000f, 0.000f, 1.0f); case TraceColor::LightGreen: return Gfx::Color(0.000f, 1.000f, 0.000f, 1.0f);
case TraceColor::Blue: return Gfx::Color(0.000f, 0.000f, 0.753f, 1.0f);
case TraceColor::LightBlue: return Gfx::Color(0.000f, 0.871f, 1.000f, 1.0f); case TraceColor::LightBlue: return Gfx::Color(0.000f, 0.871f, 1.000f, 1.0f);
case TraceColor::BlackArrow: return TraceColorColor(TraceColor::Black); case TraceColor::BlackArrow: return TraceColorColor(TraceColor::Black);
case TraceColor::RedArrow: return TraceColorColor(TraceColor::Red); //TODO: We could probably have all the colors available as arrows now case TraceColor::RedArrow: return TraceColorColor(TraceColor::Red); //TODO: We could probably have all the colors available as arrows now

View File

@ -32,24 +32,25 @@ enum class TraceColor
{ {
Default = -1, Default = -1,
White = 0, Blue = 0,
Black = 1, Red = 1,
Gray = 2, Green = 2,
LightGray = 3, Yellow = 3,
Red = 4, Violet = 4,
Pink = 5, White = 5,
Purple = 6, Black = 6,
Orange = 7, Gray = 7,
Yellow = 8, LightGray = 8,
Beige = 9, Pink = 9,
Brown = 10, Purple = 10,
Skin = 11, Orange = 11,
Green = 12, Beige = 12,
LightGreen = 13, Brown = 13,
Blue = 14, Skin = 14,
LightBlue = 15, LightGreen = 15,
BlackArrow = 16, LightBlue = 16,
RedArrow = 17, BlackArrow = 17,
RedArrow = 18,
Max, Max,
}; };
//! Convert TraceColor to a std::string //! Convert TraceColor to a std::string

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

@ -315,7 +315,7 @@ std::vector<CObject*> CObjectManager::RadarAll(CObject* pThis, Math::Vector this
oType == OBJECT_RUINmobiler1 || oType == OBJECT_RUINmobiler1 ||
oType == OBJECT_RUINmobiler2 ) oType == OBJECT_RUINmobiler2 )
{ {
oType = OBJECT_RUINmobilew1; // any ruin oType = OBJECT_RUINmobilew1; // any wreck
} }
if ( oType == OBJECT_BARRIER2 || if ( oType == OBJECT_BARRIER2 ||
@ -325,6 +325,33 @@ std::vector<CObject*> CObjectManager::RadarAll(CObject* pThis, Math::Vector this
{ {
oType = OBJECT_BARRIER1; // any barrier oType = OBJECT_BARRIER1; // any barrier
} }
if ( oType == OBJECT_RUINdoor ||
oType == OBJECT_RUINsupport ||
oType == OBJECT_RUINradar ||
oType == OBJECT_RUINconvert ) // ruins?
{
oType = OBJECT_RUINfactory; // any ruin
}
if ( oType == OBJECT_PLANT1 ||
oType == OBJECT_PLANT2 ||
oType == OBJECT_PLANT3 ||
oType == OBJECT_PLANT4 ||
oType == OBJECT_PLANT15 ||
oType == OBJECT_PLANT16 ||
oType == OBJECT_PLANT17 ||
oType == OBJECT_PLANT18 ) // bushes?
{
oType = OBJECT_PLANT0; // any bush
}
if ( oType == OBJECT_QUARTZ1 ||
oType == OBJECT_QUARTZ2 ||
oType == OBJECT_QUARTZ3 ) // crystals?
{
oType = OBJECT_QUARTZ0; // any crystal
}
// END OF TODO // END OF TODO
} }

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

@ -111,6 +111,7 @@ void CTaskBuild::CreateBuilding(Math::Vector pos, float angle, bool trainer)
if ( m_type == OBJECT_NUCLEAR ) m_buildingHeight = 40.0f; if ( m_type == OBJECT_NUCLEAR ) m_buildingHeight = 40.0f;
if ( m_type == OBJECT_PARA ) m_buildingHeight = 68.0f; if ( m_type == OBJECT_PARA ) m_buildingHeight = 68.0f;
if ( m_type == OBJECT_INFO ) m_buildingHeight = 19.0f; if ( m_type == OBJECT_INFO ) m_buildingHeight = 19.0f;
if ( m_type == OBJECT_SAFE ) m_buildingHeight = 16.0f;
if ( m_type == OBJECT_DESTROYER) m_buildingHeight = 35.0f; if ( m_type == OBJECT_DESTROYER) m_buildingHeight = 35.0f;
if ( m_type == OBJECT_HUSTON ) m_buildingHeight = 45.0f; if ( m_type == OBJECT_HUSTON ) m_buildingHeight = 45.0f;
m_buildingHeight *= 0.25f; m_buildingHeight *= 0.25f;
@ -682,6 +683,7 @@ Error CTaskBuild::FlatFloor()
if ( m_type == OBJECT_NUCLEAR ) radius = 20.0f; if ( m_type == OBJECT_NUCLEAR ) radius = 20.0f;
if ( m_type == OBJECT_PARA ) radius = 20.0f; if ( m_type == OBJECT_PARA ) radius = 20.0f;
if ( m_type == OBJECT_INFO ) radius = 5.0f; if ( m_type == OBJECT_INFO ) radius = 5.0f;
if ( m_type == OBJECT_SAFE ) radius = 20.0f;
if ( m_type == OBJECT_DESTROYER) radius = 20.0f; if ( m_type == OBJECT_DESTROYER) radius = 20.0f;
//if ( radius == 0.0f ) return ERR_UNKNOWN; //if ( radius == 0.0f ) return ERR_UNKNOWN;

View File

@ -23,6 +23,7 @@
#include "common/global.h" #include "common/global.h"
#include "graphics/engine/particle.h" #include "graphics/engine/particle.h"
#include "graphics/engine/pyro_manager.h"
#include "graphics/engine/terrain.h" #include "graphics/engine/terrain.h"
#include "level/robotmain.h" #include "level/robotmain.h"
@ -88,6 +89,6 @@ void CTaskDeleteMark::DeleteMark()
if (obj != nullptr) if (obj != nullptr)
{ {
CObjectManager::GetInstancePointer()->DeleteObject(obj); m_engine->GetPyroManager()->Create(Gfx::PT_WPCHECK, obj);
} }
} }

View File

@ -61,6 +61,24 @@ bool CTaskFlag::EventProcess(const Event &event)
m_time += event.rTime; m_time += event.rTime;
ObjectType type = m_object->GetType();
if ( type == OBJECT_MOBILEfs ||
type == OBJECT_MOBILEts ||
type == OBJECT_MOBILEws ||
type == OBJECT_MOBILEis )
{
float angle = 110.0f*Math::PI/180.0f;
float diff = -10.0f*Math::PI/180.0f;
if ( m_time <= 0.5f )
{
m_object->SetPartRotationZ(1, angle+diff*m_time*2.0f);
}
else if ( m_time >= 1.5f && m_time < 2.0f )
{
m_object->SetPartRotationZ(1, angle+diff*(2.0f-m_time)*2.0f);
}
}
return true; return true;
} }
@ -104,7 +122,32 @@ Error CTaskFlag::Start(TaskFlagOrder order, int rank)
m_bError = false; m_bError = false;
m_motion->SetAction(MHS_FLAG); // sets/removes flag switch ( m_object->GetType() ) // sets/removes flag
{
case OBJECT_HUMAN:
case OBJECT_TECH:
m_motion->SetAction(MHS_FLAG);
break;
case OBJECT_MOBILEws:
case OBJECT_MOBILEts:
case OBJECT_MOBILEfs:
case OBJECT_MOBILEis:
{
int i = m_sound->Play(SOUND_MANIP, m_object->GetPosition(), 0.0f, 0.3f, true);
m_sound->AddEnvelope(i, 0.5f, 1.0f, 0.1f, SOPER_CONTINUE);
m_sound->AddEnvelope(i, 0.5f, 1.0f, 0.3f, SOPER_CONTINUE);
m_sound->AddEnvelope(i, 0.0f, 0.3f, 0.1f, SOPER_CONTINUE);
m_sound->AddEnvelope(i, 0.0f, 0.3f, 1.0f, SOPER_CONTINUE);
m_sound->AddEnvelope(i, 0.5f, 1.0f, 0.1f, SOPER_CONTINUE);
m_sound->AddEnvelope(i, 0.5f, 1.0f, 0.3f, SOPER_CONTINUE);
m_sound->AddEnvelope(i, 0.0f, 0.3f, 0.1f, SOPER_STOP);
break;
}
default:
break;
}
m_camera->StartCentering(m_object, Math::PI*0.3f, 99.9f, 0.0f, 0.5f); m_camera->StartCentering(m_object, Math::PI*0.3f, 99.9f, 0.0f, 0.5f);
return ERR_OK; return ERR_OK;
@ -127,7 +170,23 @@ Error CTaskFlag::IsEnded()
bool CTaskFlag::Abort() bool CTaskFlag::Abort()
{ {
m_motion->SetAction(-1); switch ( m_object->GetType() )
{
case OBJECT_HUMAN:
case OBJECT_TECH:
m_motion->SetAction(-1);
break;
case OBJECT_MOBILEws:
case OBJECT_MOBILEts:
case OBJECT_MOBILEfs:
case OBJECT_MOBILEis:
m_object->SetPartRotationZ(1, 110.0f*Math::PI/180.0f);
break;
default:
break;
}
m_camera->StopCentering(m_object, 2.0f); m_camera->StopCentering(m_object, 2.0f);
return true; return true;
} }
@ -190,7 +249,18 @@ Error CTaskFlag::CreateFlag(int rank)
}; };
Math::Matrix* mat = m_object->GetWorldMatrix(0); Math::Matrix* mat = m_object->GetWorldMatrix(0);
Math::Vector pos = Transform(*mat, Math::Vector(4.0f, 0.0f, 0.0f)); Math::Vector pos;
switch ( m_object->GetType() )
{
case OBJECT_HUMAN:
case OBJECT_TECH:
pos = Transform(*mat, Math::Vector(4.0f, 0.0f, 0.0f));
break;
default:
pos = Transform(*mat, Math::Vector(6.0f, 0.0f, 0.0f));
break;
}
CObject* pObj = SearchNearest(pos, OBJECT_NULL); CObject* pObj = SearchNearest(pos, OBJECT_NULL);
if ( pObj != nullptr ) if ( pObj != nullptr )

View File

@ -125,6 +125,12 @@ const char* GetObjectName(ObjectType type)
if ( type == OBJECT_BEE ) return "AlienWasp"; if ( type == OBJECT_BEE ) return "AlienWasp";
if ( type == OBJECT_WORM ) return "AlienWorm"; if ( type == OBJECT_WORM ) return "AlienWorm";
if ( type == OBJECT_RUINmobilew1) return "Wreck"; if ( type == OBJECT_RUINmobilew1) return "Wreck";
if ( type == OBJECT_RUINfactory ) return "Ruin";
if ( type == OBJECT_PLANT0 ) return "Bush";
if ( type == OBJECT_ROOT5 ) return "GraviPlant";
if ( type == OBJECT_QUARTZ0 ) return "Crystal";
if ( type == OBJECT_MUSHROOM1 ) return "BrownMushroom";
if ( type == OBJECT_MUSHROOM2 ) return "GreenMushroom";
return ""; return "";
} }
@ -233,6 +239,12 @@ std::string GetHelpFilename(ObjectType type)
if ( type == OBJECT_BEE ) helpfile = "object/wasp"; if ( type == OBJECT_BEE ) helpfile = "object/wasp";
if ( type == OBJECT_WORM ) helpfile = "object/worm"; if ( type == OBJECT_WORM ) helpfile = "object/worm";
if ( type == OBJECT_RUINmobilew1) helpfile = "object/wreck"; if ( type == OBJECT_RUINmobilew1) helpfile = "object/wreck";
if ( type == OBJECT_RUINfactory ) helpfile = "object/ruin";
if ( type == OBJECT_PLANT0 ) helpfile = "object/bush";
if ( type == OBJECT_ROOT5 ) helpfile = "object/gravi";
if ( type == OBJECT_QUARTZ0 ) helpfile = "object/crystal";
if ( type == OBJECT_MUSHROOM1 ) helpfile = "object/bromush";
if ( type == OBJECT_MUSHROOM2 ) helpfile = "object/gremush";
if (helpfile.empty()) if (helpfile.empty())
return ""; return "";
@ -310,6 +322,8 @@ std::string GetHelpFilename(const char *token)
if ( strcmp(token, "researched" ) == 0 ) helpfile = "cbot/researched"; if ( strcmp(token, "researched" ) == 0 ) helpfile = "cbot/researched";
if ( strcmp(token, "buildingenabled") == 0 ) helpfile = "cbot/buildingenabled"; if ( strcmp(token, "buildingenabled") == 0 ) helpfile = "cbot/buildingenabled";
if ( strcmp(token, "build" ) == 0 ) helpfile = "cbot/build"; if ( strcmp(token, "build" ) == 0 ) helpfile = "cbot/build";
if ( strcmp(token, "flag" ) == 0 ) helpfile = "cbot/flag";
if ( strcmp(token, "deflag" ) == 0 ) helpfile = "cbot/deflag";
if ( strcmp(token, "wait" ) == 0 ) helpfile = "cbot/wait"; if ( strcmp(token, "wait" ) == 0 ) helpfile = "cbot/wait";
if ( strcmp(token, "move" ) == 0 ) helpfile = "cbot/move"; if ( strcmp(token, "move" ) == 0 ) helpfile = "cbot/move";
if ( strcmp(token, "turn" ) == 0 ) helpfile = "cbot/turn"; if ( strcmp(token, "turn" ) == 0 ) helpfile = "cbot/turn";
@ -332,23 +346,24 @@ std::string GetHelpFilename(const char *token)
if ( strcmp(token, "topo" ) == 0 ) helpfile = "cbot/topo"; if ( strcmp(token, "topo" ) == 0 ) helpfile = "cbot/topo";
if ( strcmp(token, "message" ) == 0 ) helpfile = "cbot/message"; if ( strcmp(token, "message" ) == 0 ) helpfile = "cbot/message";
if ( strcmp(token, "abstime" ) == 0 ) helpfile = "cbot/abstime"; if ( strcmp(token, "abstime" ) == 0 ) helpfile = "cbot/abstime";
if ( strcmp(token, "Blue" ) == 0 ) helpfile = "cbot/flag";
if ( strcmp(token, "Red" ) == 0 ) helpfile = "cbot/flag";
if ( strcmp(token, "Green" ) == 0 ) helpfile = "cbot/flag";
if ( strcmp(token, "Yellow" ) == 0 ) helpfile = "cbot/flag";
if ( strcmp(token, "Violet" ) == 0 ) helpfile = "cbot/flag";
if ( strcmp(token, "BlackArrow" ) == 0 ) helpfile = "cbot/pendown"; if ( strcmp(token, "BlackArrow" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "RedArrow" ) == 0 ) helpfile = "cbot/pendown"; if ( strcmp(token, "RedArrow" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "White" ) == 0 ) helpfile = "cbot/pendown"; if ( strcmp(token, "White" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "Black" ) == 0 ) helpfile = "cbot/pendown"; if ( strcmp(token, "Black" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "Gray" ) == 0 ) helpfile = "cbot/pendown"; if ( strcmp(token, "Gray" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "LightGray" ) == 0 ) helpfile = "cbot/pendown"; if ( strcmp(token, "LightGray" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "Red" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "Pink" ) == 0 ) helpfile = "cbot/pendown"; if ( strcmp(token, "Pink" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "Purple" ) == 0 ) helpfile = "cbot/pendown"; if ( strcmp(token, "Purple" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "Orange" ) == 0 ) helpfile = "cbot/pendown"; if ( strcmp(token, "Orange" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "Yellow" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "Beige" ) == 0 ) helpfile = "cbot/pendown"; if ( strcmp(token, "Beige" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "Brown" ) == 0 ) helpfile = "cbot/pendown"; if ( strcmp(token, "Brown" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "Skin" ) == 0 ) helpfile = "cbot/pendown"; if ( strcmp(token, "Skin" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "Green" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "LightGreen" ) == 0 ) helpfile = "cbot/pendown"; if ( strcmp(token, "LightGreen" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "Blue" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "LightBlue" ) == 0 ) helpfile = "cbot/pendown"; if ( strcmp(token, "LightBlue" ) == 0 ) helpfile = "cbot/pendown";
if ( strcmp(token, "InFront" ) == 0 ) helpfile = "cbot/grab"; if ( strcmp(token, "InFront" ) == 0 ) helpfile = "cbot/grab";
if ( strcmp(token, "Behind" ) == 0 ) helpfile = "cbot/grab"; if ( strcmp(token, "Behind" ) == 0 ) helpfile = "cbot/grab";
@ -470,6 +485,8 @@ bool IsFunction(const char *token)
if ( strcmp(token, "researched" ) == 0 ) return true; if ( strcmp(token, "researched" ) == 0 ) return true;
if ( strcmp(token, "buildingenabled") == 0 ) return true; if ( strcmp(token, "buildingenabled") == 0 ) return true;
if ( strcmp(token, "build" ) == 0 ) return true; if ( strcmp(token, "build" ) == 0 ) return true;
if ( strcmp(token, "flag" ) == 0 ) return true;
if ( strcmp(token, "deflag" ) == 0 ) return true;
if ( strcmp(token, "wait" ) == 0 ) return true; if ( strcmp(token, "wait" ) == 0 ) return true;
if ( strcmp(token, "move" ) == 0 ) return true; if ( strcmp(token, "move" ) == 0 ) return true;
if ( strcmp(token, "turn" ) == 0 ) return true; if ( strcmp(token, "turn" ) == 0 ) return true;
@ -576,6 +593,8 @@ const char* GetHelpText(const char *token)
if ( strcmp(token, "researched" ) == 0 ) return "researched ( research );"; if ( strcmp(token, "researched" ) == 0 ) return "researched ( research );";
if ( strcmp(token, "buildingenabled") == 0 ) return "buildingenabled ( category );"; if ( strcmp(token, "buildingenabled") == 0 ) return "buildingenabled ( category );";
if ( strcmp(token, "build" ) == 0 ) return "build ( category );"; if ( strcmp(token, "build" ) == 0 ) return "build ( category );";
if ( strcmp(token, "flag" ) == 0 ) return "flag ( color );";
if ( strcmp(token, "deflag" ) == 0 ) return "deflag ( );";
if ( strcmp(token, "wait" ) == 0 ) return "wait ( time );"; if ( strcmp(token, "wait" ) == 0 ) return "wait ( time );";
if ( strcmp(token, "move" ) == 0 ) return "move ( distance );"; if ( strcmp(token, "move" ) == 0 ) return "move ( distance );";
if ( strcmp(token, "turn" ) == 0 ) return "turn ( angle );"; if ( strcmp(token, "turn" ) == 0 ) return "turn ( angle );";

View File

@ -595,7 +595,8 @@ bool CScriptFunctions::rResearch(CBotVar* var, CBotVar* result, int& exception,
{ {
bool ok = false; bool ok = false;
if ( type == RESEARCH_iPAW || if ( type == RESEARCH_iPAW ||
type == RESEARCH_iGUN ) type == RESEARCH_iGUN ||
type == RESEARCH_TARGET )
{ {
if ( center->GetType() != OBJECT_LABO ) if ( center->GetType() != OBJECT_LABO )
err = ERR_WRONG_OBJ; err = ERR_WRONG_OBJ;
@ -1443,6 +1444,102 @@ bool CScriptFunctions::rBuild(CBotVar* var, CBotVar* result, int& exception, voi
} }
// Instruction "flag(color)"
bool CScriptFunctions::rFlag(CBotVar* var, CBotVar* result, int& exception, void* user)
{
CScript* script = static_cast<CScript*>(user);
CObject* pThis = script->m_object;
ObjectType oType;
int color;
Error err;
exception = 0;
if ( !script->m_taskExecutor->IsForegroundTask() )
{
oType = pThis->GetType();
if ( oType != OBJECT_MOBILEfs && // allowed only for sniffer bots && humans
oType != OBJECT_MOBILEts &&
oType != OBJECT_MOBILEws &&
oType != OBJECT_MOBILEis &&
oType != OBJECT_HUMAN &&
oType != OBJECT_TECH )
{
err = ERR_WRONG_BOT; // Wrong object
}
else
{
if ( var == nullptr )
{
color = 0;
}
else
{
color = var->GetValInt();
if ( color < 0 || color > static_cast<int>(TraceColor::Violet) ) color = 0;
}
err = script->m_taskExecutor->StartTaskFlag(TFL_CREATE, color);
}
if ( err != ERR_OK )
{
script->m_taskExecutor->StopForegroundTask();
result->SetValInt(err); // shows the error
if ( script->m_errMode == ERM_STOP )
{
exception = err;
return false;
}
return true;
}
}
return WaitForForegroundTask(script, result, exception);
}
// Instruction "deflag()"
bool CScriptFunctions::rDeflag(CBotVar* var, CBotVar* result, int& exception, void* user)
{
CScript* script = static_cast<CScript*>(user);
CObject* pThis = script->m_object;
ObjectType oType;
Error err;
exception = 0;
if ( !script->m_taskExecutor->IsForegroundTask() )
{
oType = pThis->GetType();
if ( oType != OBJECT_MOBILEfs && // allowed only for sniffer bots && humans
oType != OBJECT_MOBILEts &&
oType != OBJECT_MOBILEws &&
oType != OBJECT_MOBILEis &&
oType != OBJECT_HUMAN &&
oType != OBJECT_TECH )
{
err = ERR_WRONG_BOT; // Wrong object
}
else
{
err = script->m_taskExecutor->StartTaskFlag(TFL_DELETE, 0);
}
if ( err != ERR_OK )
{
script->m_taskExecutor->StopForegroundTask();
result->SetValInt(err); // shows the error
if ( script->m_errMode == ERM_STOP )
{
exception = err;
return false;
}
return true;
}
}
return WaitForForegroundTask(script, result, exception);
}
// Compilation of the instruction "produce(pos, angle, type[, scriptName[, power]])" // Compilation of the instruction "produce(pos, angle, type[, scriptName[, power]])"
// or "produce(type[, power])". // or "produce(type[, power])".
@ -3377,6 +3474,7 @@ void CScriptFunctions::Init()
CBotProgram::DefineNum("BuildAutoLab", BUILD_LABO); CBotProgram::DefineNum("BuildAutoLab", BUILD_LABO);
CBotProgram::DefineNum("BuildPowerCaptor", BUILD_PARA); CBotProgram::DefineNum("BuildPowerCaptor", BUILD_PARA);
CBotProgram::DefineNum("BuildExchangePost", BUILD_INFO); CBotProgram::DefineNum("BuildExchangePost", BUILD_INFO);
CBotProgram::DefineNum("BuildVault", BUILD_SAFE);
CBotProgram::DefineNum("BuildDestroyer", BUILD_DESTROYER); CBotProgram::DefineNum("BuildDestroyer", BUILD_DESTROYER);
CBotProgram::DefineNum("FlatGround", BUILD_GFLAT); CBotProgram::DefineNum("FlatGround", BUILD_GFLAT);
CBotProgram::DefineNum("UseFlags", BUILD_FLAG); CBotProgram::DefineNum("UseFlags", BUILD_FLAG);
@ -3444,6 +3542,8 @@ void CScriptFunctions::Init()
CBotProgram::AddFunction("buildingenabled", rBuildingEnabled, cOneIntReturnBool); CBotProgram::AddFunction("buildingenabled", rBuildingEnabled, cOneIntReturnBool);
CBotProgram::AddFunction("build", rBuild, cOneInt); CBotProgram::AddFunction("build", rBuild, cOneInt);
CBotProgram::AddFunction("flag", rFlag, cGrabDrop);
CBotProgram::AddFunction("deflag", rDeflag, cNull);
CBotProgram::AddFunction("retobject", rGetObject, cGetObject); CBotProgram::AddFunction("retobject", rGetObject, cGetObject);
CBotProgram::AddFunction("retobjectbyid", rGetObjectById, cGetObject); CBotProgram::AddFunction("retobjectbyid", rGetObjectById, cGetObject);

View File

@ -110,6 +110,8 @@ private:
static bool rResearched(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user); static bool rResearched(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);
static bool rBuildingEnabled(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user); static bool rBuildingEnabled(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);
static bool rBuild(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user); static bool rBuild(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);
static bool rFlag(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);
static bool rDeflag(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);
static bool rProduce(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user); static bool rProduce(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);
static bool rDistance(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user); static bool rDistance(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);
static bool rDistance2d(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user); static bool rDistance2d(CBot::CBotVar* var, CBot::CBotVar* result, int& exception, void* user);

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

@ -769,6 +769,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

@ -77,6 +77,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

@ -536,9 +536,9 @@ bool CObjectInterface::EventProcess(const Event &event)
{ {
err = m_taskExecutor->StartTaskBuild(OBJECT_INFO); err = m_taskExecutor->StartTaskBuild(OBJECT_INFO);
} }
if ( action == EVENT_OBJECT_BDESTROYER ) if ( action == EVENT_OBJECT_BSAFE )
{ {
err = m_taskExecutor->StartTaskBuild(OBJECT_DESTROYER); err = m_taskExecutor->StartTaskBuild(OBJECT_SAFE);
} }
if ( action == EVENT_OBJECT_GFLAT ) if ( action == EVENT_OBJECT_GFLAT )
@ -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;
@ -1064,8 +1065,8 @@ bool CObjectInterface::CreateInterface(bool bSelect)
pos.x = ox+sx*5.4f; pos.x = ox+sx*5.4f;
pos.y = oy+sy*0.1f; pos.y = oy+sy*0.1f;
pw->CreateButton(pos, ddim, 128+41, EVENT_OBJECT_BDESTROYER); pw->CreateButton(pos, ddim, 128+47, EVENT_OBJECT_BSAFE);
DeadInterface(pw, EVENT_OBJECT_BDESTROYER, m_main->CanBuild(OBJECT_DESTROYER, m_object->GetTeam())); DeadInterface(pw, EVENT_OBJECT_BSAFE, m_main->CanBuild(OBJECT_SAFE, m_object->GetTeam()));
if ( m_main->IsBuildingEnabled(BUILD_GFLAT) ) if ( m_main->IsBuildingEnabled(BUILD_GFLAT) )
{ {
@ -1116,16 +1117,39 @@ bool CObjectInterface::CreateInterface(bool bSelect)
pw->CreateButton(pos, dim, 40, EVENT_OBJECT_SEARCH); pw->CreateButton(pos, dim, 40, EVENT_OBJECT_SEARCH);
DefaultEnter(pw, EVENT_OBJECT_SEARCH); DefaultEnter(pw, EVENT_OBJECT_SEARCH);
if ( m_main->IsBuildingEnabled(BUILD_GFLAT) ) pos.x = ox+sx*9.0f;
{
pos.x = ox+sx*9.0f;
pos.y = oy+sy*0.5f;
pw->CreateButton(pos, dim, 111, EVENT_OBJECT_GFLAT);
}
pos.x = ox+sx*10.1f;
pos.y = oy+sy*0.5f; pos.y = oy+sy*0.5f;
pw->CreateButton(pos, dim, 11, EVENT_OBJECT_DELSEARCH); pw->CreateButton(pos, dim, 11, EVENT_OBJECT_DELSEARCH);
if ( m_main->IsBuildingEnabled(BUILD_FLAG) )
{
pos.x = ox+sx*10.1f;
pos.y = oy+sy*0.5f;
pw->CreateButton(pos, dim, 64+54, EVENT_OBJECT_FCREATE);
pos.x = ox+sx*11.1f;
pos.y = oy+sy*0.5f;
pw->CreateButton(pos, dim, 64+55, EVENT_OBJECT_FDELETE);
ddim.x = dim.x*0.4f;
ddim.y = dim.y*0.4f;
pos.x = ox+sx*10.1f;
pos.y = oy+sy*2.0f-ddim.y;
pc = pw->CreateColor(pos, ddim, -1, EVENT_OBJECT_FCOLORb);
pc->SetColor(Gfx::Color(0.28f, 0.56f, 1.0f, 0.0f));
pos.x += ddim.x;
pc = pw->CreateColor(pos, ddim, -1, EVENT_OBJECT_FCOLORr);
pc->SetColor(Gfx::Color(1.0f, 0.0f, 0.0f, 0.0f));
pos.x += ddim.x;
pc = pw->CreateColor(pos, ddim, -1, EVENT_OBJECT_FCOLORg);
pc->SetColor(Gfx::Color(0.0f, 0.8f, 0.0f, 0.0f));
pos.x += ddim.x;
pc = pw->CreateColor(pos, ddim, -1, EVENT_OBJECT_FCOLORy);
pc->SetColor(Gfx::Color(1.0f, 0.93f, 0.0f, 0.0f)); //0x00ffec00
pos.x += ddim.x;
pc = pw->CreateColor(pos, ddim, -1, EVENT_OBJECT_FCOLORv);
pc->SetColor(Gfx::Color(0.82f, 0.004f, 0.99f, 0.0f)); //0x00d101fe
}
} }
if ( type == OBJECT_MOBILErt && // Terraformer? if ( type == OBJECT_MOBILErt && // Terraformer?
@ -1496,9 +1520,15 @@ bool CObjectInterface::CreateInterface(bool bSelect)
DeadInterface(pw, EVENT_OBJECT_BPARA, m_main->CanBuild(OBJECT_PARA, m_object->GetTeam())); DeadInterface(pw, EVENT_OBJECT_BPARA, m_main->CanBuild(OBJECT_PARA, m_object->GetTeam()));
pos.x = ox+sx*5.4f; pos.x = ox+sx*5.4f;
pw->CreateButton(pos, ddim, 128+41, EVENT_OBJECT_BDESTROYER); pw->CreateButton(pos, ddim, 128+47, EVENT_OBJECT_BSAFE);
DeadInterface(pw, EVENT_OBJECT_BDESTROYER, m_main->CanBuild(OBJECT_DESTROYER, m_object->GetTeam())); DeadInterface(pw, EVENT_OBJECT_BSAFE, m_main->CanBuild(OBJECT_SAFE, m_object->GetTeam()));
if ( m_main->IsBuildingEnabled(BUILD_GFLAT) )
{
pos.x = ox+sx*9.0f;
pos.y = oy+sy*0.5f;
pw->CreateButton(pos, dim, 64+47, EVENT_OBJECT_GFLAT);
}
} }
UpdateInterface(); UpdateInterface();
m_lastUpdateTime = 0.0f; m_lastUpdateTime = 0.0f;
@ -1793,11 +1823,15 @@ void CObjectInterface::UpdateInterface()
EnableInterface(pw, EVENT_OBJECT_BNUCLEAR, bEnable); EnableInterface(pw, EVENT_OBJECT_BNUCLEAR, bEnable);
EnableInterface(pw, EVENT_OBJECT_BPARA, bEnable); EnableInterface(pw, EVENT_OBJECT_BPARA, bEnable);
EnableInterface(pw, EVENT_OBJECT_BINFO, bEnable); EnableInterface(pw, EVENT_OBJECT_BINFO, bEnable);
EnableInterface(pw, EVENT_OBJECT_BDESTROYER,bEnable); EnableInterface(pw, EVENT_OBJECT_BSAFE, bEnable);
} }
if ( type == OBJECT_HUMAN || // builder? if ( type == OBJECT_HUMAN || // can create flags?
type == OBJECT_TECH ) type == OBJECT_TECH ||
type == OBJECT_MOBILEfs ||
type == OBJECT_MOBILEts ||
type == OBJECT_MOBILEws ||
type == OBJECT_MOBILEis )
{ {
CheckInterface(pw, EVENT_OBJECT_FCOLORb, m_flagColor==0); CheckInterface(pw, EVENT_OBJECT_FCOLORb, m_flagColor==0);
CheckInterface(pw, EVENT_OBJECT_FCOLORr, m_flagColor==1); CheckInterface(pw, EVENT_OBJECT_FCOLORr, m_flagColor==1);
@ -1866,7 +1900,7 @@ void CObjectInterface::UpdateInterface()
pb->SetState(STATE_VISIBLE, m_buildInterface); pb->SetState(STATE_VISIBLE, m_buildInterface);
pb = static_cast< CButton* >(pw->SearchControl(EVENT_OBJECT_BPARA)); pb = static_cast< CButton* >(pw->SearchControl(EVENT_OBJECT_BPARA));
pb->SetState(STATE_VISIBLE, m_buildInterface); pb->SetState(STATE_VISIBLE, m_buildInterface);
pb = static_cast< CButton* >(pw->SearchControl(EVENT_OBJECT_BDESTROYER)); pb = static_cast< CButton* >(pw->SearchControl(EVENT_OBJECT_BSAFE));
pb->SetState(STATE_VISIBLE, m_buildInterface); pb->SetState(STATE_VISIBLE, m_buildInterface);
pb = static_cast< CButton* >(pw->SearchControl(EVENT_OBJECT_BINFO)); pb = static_cast< CButton* >(pw->SearchControl(EVENT_OBJECT_BINFO));
pb->SetState(STATE_VISIBLE, m_buildInterface); pb->SetState(STATE_VISIBLE, m_buildInterface);

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);
@ -225,6 +233,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);