From 4d63369a29dfb60db9337168b4592ff98eb45306 Mon Sep 17 00:00:00 2001 From: EnderIce2 Date: Sat, 14 Dec 2024 23:34:38 +0200 Subject: [PATCH] Update Files --- .gitignore | 3 + LICENSE | 2 +- README.md | 5 +- config/base_romanian.lang | 510 +++ config/lang_main/romanian.lang | 2089 +++++++++ entry.hpc | 10 + resources.cfg | 4 + script/modules/MenuHandler.hps | 7259 ++++++++++++++++++++++++++++++++ 8 files changed, 9880 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 config/base_romanian.lang create mode 100644 config/lang_main/romanian.lang create mode 100644 entry.hpc create mode 100644 resources.cfg create mode 100755 script/modules/MenuHandler.hps diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a4da035 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.map_cache +*.preload_cache + diff --git a/LICENSE b/LICENSE index bb9664f..49cb4aa 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (C) 2024 by enderice2 enderice2@no-reply@enderice2.com +Copyright (C) 2024 by enderice2 enderice2@protonmail.com Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. diff --git a/README.md b/README.md index fdc5c9e..12d9684 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ # RomanianMod -Romanian translation mod for SOMA \ No newline at end of file +Romanian translation mod for SOMA + +⚠️ Translated with ChatGPT, so it's not 100% accurate. + diff --git a/config/base_romanian.lang b/config/base_romanian.lang new file mode 100644 index 0000000..a0d48a5 --- /dev/null +++ b/config/base_romanian.lang @@ -0,0 +1,510 @@ + + + + Avertizare + Da + Nu + OK + Anulează + Nimic + Se salvează + Se încarcă + + + CONTINUĂ + JOC NOU + ÎNCARCĂ JOC + OPȚIUNI + IEȘIRE + SCHIMBĂ PROFIL + ÎNAPOI + MOD DE JOC: + NORMAL + SIGUR + ÎNCEPE JOCUL + Monștrii sunt periculoși și te pot ucide. Trebuie să gândești și să te furișezi pentru a supraviețui. Așa a fost conceput jocul inițial. + Monștrii sunt în continuare înfricoșători, dar nu te pot ucide. Nu trebuie să te îngrijorezi de furișare în timpul jocului. + ÎNTOARCE-TE LA JOC + SALVEAZĂ ȘI IEȘI + CONTROALE + VIDEO + AUDIO + URMĂRIRE CU OCHIUL (TOBII) + INTRARE + GAMMA + AVANSAT + SENSIBILITATE MOUSE + SENSIBILITATE CONTROLLER + INVERSEAZĂ AXA Y A MOUSE-ULUI + INVERSEAZĂ AXA Y A CONTROLLER-ULUI + VIBRAȚIE + MOUSE FLUID + ACTIVEAZĂ URMĂRIREA OCHILOR + CRUCE MAI MARE + RECEPTIVITATE + VIZIUNE EXTINSĂ + VITEZA VIZIUNII EXTINSE + UNGHIILE MAXIME ALE VIZIUNII EXTINSE + CONTROLEAZĂ LANTERNA + MEDIU REACTIV + IA REACTIVĂ + DETECTARE SETĂRI OPTIME + ACEASTA VA SUPRASCRIE SETĂRILE CURENTE. CONTINUĂ? + REZOLUȚIE + ECRAN COMPLET + MOD DE AFIȘARE + ÎN FEREASTRĂ + FĂRĂ MARGINI + V-SYNC + ADAPTIV + CALITATE TEXTURI + RATA DE REÎMPROSPĂTARE + FILTRU TEXTURI + REFLEXIE + REFRACTIE + TESSELARE TEREN + BILINIAR + TRILINIAR + AFx2 + AFx4 + AFx8 + AFx16 + SSAO + BLOOM + AFIȘARE + REDERIZARE + FOV ORIZONTAL + EFECT POST-PROCESARE + ANTI-ALIASING + CALITATE UMBRE + PROFUNDIMEA CÂMPULUI + VOLUM + SUBTITRARE + SUBTITRARE DETALIATĂ + APLICĂ SCHIMBĂRI? + REPORNIRE NECESARĂ PENTRU APLICAREA SCHIMBĂRILOR + VREI SĂ PĂSTREZI ACESTE SETĂRI DE AFIȘARE? + APLICĂ SCHIMBĂRI? + SIGUR VREI SĂ IEȘI? + SIGUR VREI SĂ IEȘI LA MENIU? + SIGUR VREI SĂ IEȘI FĂRĂ A SALVA? + ÎNCEPEREA UNUI JOC NOU VA SUPRASCRIE SALVAREA CURENTĂ. CONTINUĂ? + ÎNCARCĂ JOC? + ACCEPTĂ + FOARTE RIDICAT + RIDICAT + MEDIU + SCĂZUT + OPRIT + FXAA + PORNEȘTE + DA + NU + OK + acceptă + înapoi + selectează + Ajustați gamma astfel încât să puteți distinge abia detaliile de pe afișul cu robotul din stânga. + JOC + INDICAȚII + LIMBĂ + APĂSAȚI ORICE TASTĂ PENTRU A ATRIBUI O ACȚIUNE + APĂSAȚI SUS PE STICK PENTRU A ATRIBUI + APĂSAȚI DREAPTA PE STICK PENTRU A ATRIBUI + ASIGNĂRI TASTE + REVENIRE LA IMPLICIT + REVENIRE LA IMPLICIT? + OPȚIUNI MOUSE + OPȚIUNI CONTROLLER + MAPARE CONTROLLER + ASIGNĂRI PERSONALIZATE + ACEEAȘI TASTĂ ATRIBUITĂ MAI MULTOR ACȚIUNI. CONTINUĂ? + Apasă X pentru a continua + Apasă A pentru a continua + START + ȘTERGE + BLOOM + EFECTE DE DISTORSIUNE VIDEO + SEPARARE CULOARE + TIP DE DIFUZOR + TELEVIZOR MIC + TELEVIZOR MEDIU + HOME CINEMA + CĂȘTI + REMOTEPLAY + MOD DE NOAPTE + STIL CRUCE + ICONIȚE DE INTERACȚIUNE DETALIATE + ICONIȚE DE INTERACȚIUNE SIMPLE + DETECTARE AUTOMATĂ A SETĂRILOR + Nu puteți continua până când jocul nu a fost descărcat complet + Se pare că driverele grafice sunt depășite. Actualizați-le pentru o performanță optimă + + + Încarcă Joc + Nu există joc de încărcat + Încărcați jocul salvat? + ÎNCĂRCARE EȘUATĂ: FIȘIER CORUPT + ÎNCĂRCARE EȘUATĂ: FIȘIER CORUPT + ÎNCĂRCARE EȘUATĂ: VERSIUNE INVALIDĂ + ÎNCĂRCARE EȘUATĂ: FIȘIER INEXISTENT + ÎNCĂRCARE EȘUATĂ: HARTĂ INEXISTENTĂ + FIȘIERUL DE SALVARE A FOST ȘTERS + PROFILUL A FOST ȘTERS + OK + + + Configurare Taste + Categorie + Mișcare + Acțiuni + Diverse + Acțiune + Principal + Secundar + Setează tastele implicite + Sigur dorești să încarci tastele implicite? + Există definiții de control duplicate. Ești sigur că vrei să le păstrezi? + Controller-ul a fost deconectat, te rog reconectează-l + + + BackSpace + Tab + Șterge + Return + Pauză + Escape + Spațiu + Exclamație + Ghiloace + Raș + Dolar + Ampersand + Citat + Paranteză stânga + Paranteză dreapta + Asterisc + Virgulă + Slash + Colon + Punct și virgulă + Mai puțin + Mai mult + Întrebare + @ + Paranteză stânga + BackSlash + Paranteză dreapta + Semn de acoperire + Liniuță jos + BackQuote + A + B + C + D + E + F + G + H + I + J + K + L + M + N + O + P + Q + R + S + T + U + V + W + X + Y + Z + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + NumPad 0 + NumPad 1 + NumPad 2 + NumPad 3 + NumPad 4 + NumPad 5 + NumPad 6 + NumPad 7 + NumPad 8 + NumPad 9 + Șterge + Punct + Împărțire + Înmulțire + Minus + Plus + Enter + Egal + Sus + Jos + Dreapta + Stânga + Insert + Acasă + Sfârșit + Pagină sus + Pagină jos + NumLock + CapsLock + ScrollLock + Shift dreapta + Shift stânga + Control dreapta + Alt dreapta + Alt stânga + Meta dreapta + Meta stânga + Super stânga + Super dreapta + Mod + Ajutor + Print + SysReq + Pauză + Meniu + Putere + Euro + Nimic + Mouse stânga + Mouse mijloc + Mouse dreapta + Roată sus + Roată jos + Control stânga + NumPad Punct + NumPad Împărțire + NumPad Înmulțire + NumPad Minus + NumPad Plus + NumPad Enter + NumPad Egal + F1 + F2 + F3 + F4 + F5 + F6 + F7 + F8 + F9 + F10 + F11 + F12 + F13 + F14 + F15 + Buton 0 + Buton 1 + Buton 2 + Buton 3 + Buton 4 + Buton 5 + Buton 6 + Buton 7 + Buton 8 + Buton 9 + Buton 10 + Buton 11 + Buton 12 + Buton 13 + Buton 14 + Buton 15 + Buton 16 + Buton 17 + Buton 18 + Buton 19 + Buton 20 + Buton 21 + Buton 22 + Buton 23 + Buton 24 + Buton 25 + Buton 26 + Buton 27 + Buton 28 + Buton 29 + Ax 0+ + Ax 0- + Ax 1+ + Ax 1- + Ax 2+ + Ax 2- + Ax 3+ + Ax 3- + Ax 4+ + Ax 4- + Ax 5+ + Ax 5- + Ax 6+ + Ax 6- + Ax 7+ + Ax 7- + Ax 8+ + Ax 8- + Ax 9+ + Ax 9- + Stick 0 + Stick 1 + Stick 2 + Stick 3 + Stick 4 + Stick 5 + Stick 6 + Stick 7 + Stick 8 + Stick 9 + + + Înainte + Înapoi + Dreapta + Stânga + Înclină Dreapta + Înclină Stânga + Înclinare Analogică + Fugi + Căzut + Sari + Aruncă + Interacționează + Anulează Interacțiune + Aruncă + Examinează + Rotește + Lanternă + Inventar + Jurnal + Secundar + Deschide Textul Recent + Aruncă sau împinge un obiect aflat în prezent în mână. + Mergi înapoi + Activează/dezactivează căzutul. + Mergi înainte + Interacționează cu obiectele din joc. + Deschide ecranul Inventarului. + Deschide ecranul Jurnalului. + Sari. + Deschide sau pune lanternă jos. + Înclină capul la stânga, util pentru a arunca o privire pe lângă colțuri. + Înclină capul la dreapta, util pentru a arunca o privire pe lângă colțuri. + Mergi la stânga. + Deschide lista de memento-uri. Util pentru a verifica atunci când ești blocat. + Deschide cel mai recent text citit (notiță sau jurnal). + Mergi la dreapta. + Ține apăsat în timp ce miști mouse-ul pentru a roti obiectul aflat în mână. + Ține apăsat în timp ce te miști pentru a alerga. + Comutare Mira + Comută mira pe ecran. + Mișcare + Privire + Rotește Sus + Rotește Jos + Rotește Stânga + Rotește Dreapta + Confirmare Meniu + Anulare Meniu + Meniu Sus + Meniu Jos + Meniu Stânga + Meniu Dreapta + Înapoi Meniu + Deschide Meniu + + + Oprit + Pornit + Arată setări de bază + Arată setări avansate + General + Dispozitiv video: + Calitate: + Detectare + Opțiuni grafice + Calitate umbre: + Rezoluție umbre: + Rezoluție SSAO + Netezire margini + Paralaxă: + Opțiuni sunet + Dispozitiv: + Lansează jocul + Placa video nu este compatibilă + Placa video nu este listată, presupunând setări medii + Placa video nu este listată, folosind setările pentru cel mai apropiat echivalent: + Personalizat + Incompatibil + + + Continuă + Jurnal intern de date, #902901[br][br]WAU Systems, Pathos-II Core Design System[br][br]Sisteme externe: nu mai sunt active[br]-> Acțiune: Rutează toate resursele către mediul local.[br][br]Misiune principală anulată[br]-> Execută backup[br][br]Stare structurală: slabă[br]Stare echipaj: în declin rapid.[br]-> Activare mod de urgență... 100%[br]-> AVERTISMENT CODEBASE, respinge, continuă[br]-> Activare acces complet. + + + English + Deutsch + Español + Français + Ruski + Polski + Italiano + Svenska + Suomi + Dansk + Norsk + Islenska + [u268]eština + Magyar + Português brasileiro + Română + + + Nu este loc pentru a urca. + + + Gol. + + + Apasă un buton pentru a continua... + + + Nu ești conectat + Trebuie să fii conectat la Xbox Live pentru a juca. + Trebuie să fii conectat ca {gamertag} pentru a continua să joci. Te conectezi acum? + + diff --git a/config/lang_main/romanian.lang b/config/lang_main/romanian.lang new file mode 100644 index 0000000..c489032 --- /dev/null +++ b/config/lang_main/romanian.lang @@ -0,0 +1,2089 @@ + + + + + + + + Ai murit + Apasă orice buton pentru a încerca din nou... + + + + Apasă orice buton pentru a continua... + + + + INDICATIV + ALERTĂ + PERICOL + INFORMAȚII + + + + Folosește mouse-ul pentru a te uita în jur. + Pentru a te mișca, folosește tastele de mișcare ($Input{Forward} $Input{Backward} $Input{Left} $Input{Right}) + Pentru a deschide uși și containere, interacționează mai întâi cu ele și trage de mouse. + Pentru a folosi un obiect pe care l-ai dobândit, apasă $Input{Interact} atunci când obiectul este afișat pe ecran. + Apasă $Input{Throw} în timp ce ții un obiect pentru a-l arunca. + Poți apăsa și menține $Input{InteractRotate} și mișca mouse-ul pentru a roti obiectele. + Poți folosi $Input{ScrollDown} sau $Input{ScrollUp} în timp ce ții un obiect pentru a-l muta mai aproape sau mai departe. + Mișcă mouse-ul în cercuri în timp ce ții o rotiță pentru a o întoarce. + Folosește mouse-ul în timp ce ții un sertar pentru a-l trage/împinge. + Vizualizează textul folosind $Input{Interact} + Folosește mouse-ul pentru a roti / $Input{InteractCancel} pentru a ieși. + Mișcă mouse-ul în timp ce apesi $Input{InteractRotate} pentru a roti obiectul. + Vizualizează textul folosind $Input{Interact} + Obiectele pot fi interacționate folosind $Input{Interact} + Obiectele pot fi ridicate cu butonul de interacțiune $Input{Interact} + Apasă și ține $Input{Run} în timp ce te miști pentru a alerga. + Apasă $Input{Jump} pentru a sări. + Folosește $Input{OpenInventory} pentru a vedea inventarul tău. + Mișcarea în timp ce te apleci (Apasă $Input{Crouch}) face mai puțin zgomot și reduce șansele de a fi observat. + Pentru a porni/opri lanterna, apasă $Input{Flashlight} + Apasă $Input{LeanLeft} sau $Input{LeanRight} pentru a te apleca la stânga sau la dreapta + $Input{LeanLeft} - $Input{Jump} - $Input{Crouch} - $Input{OpenInventory} - $Input{Run} - $Input{Forward} + + + + + Folosește $GAInput{GamepadLook} pentru a te uita în jur. + Pentru a te mișca, folosește stick-ul ($GAInput{GamepadMove}) + Pentru a deschide uși și containere, interacționează mai întâi cu ele și trage folosind $GAInput{GamepadLook} + Apasă $Input{Throw} în timp ce ții un obiect pentru a-l arunca. + Poți roti obiectul folosind $GLayout{DPAD} + Mișcă $GAInput{GamepadLook} în cercuri în timp ce ții o rotiță pentru a o întoarce. + Mișcă $GAInput{GamepadLook} în timp ce ții un sertar pentru a-l trage/împinge. + Apasă și ține $Input{AnalogLean} și mișcă $GAInput{GamepadMove} la stânga sau la dreapta pentru a te apleca + Folosește $GLayout{DPAD} pentru a roti / $Input{InteractCancel} pentru a ieși. + Folosește $GLayout{DPAD} pentru a roti. + + + + + Prolog + Apartamentul lui Simon + Metroul + Laboratorul lui Munshi + Trezirea + Site Upsilon + În afacerea Upsilon + Stația de transport Upsilon + Site Lambda + The CURIE + Site Delta + În afacerea Theta + Intrarea Theta + Laboratoarele Theta + Mentenanța Theta + În afacerea Omicron + Site Omicron + Coborârea + Drumul către Tau + Site Tau + Site Alpha + Site Phi + The ARK + Spațiu + + + + + Simon a promis că se va prezenta la o programare pentru un scaner cerebral. Pentru cele mai bune rezultate, trebuie să bea un lichid de trasor. + Simon a băut un lichid de trasor în pregătirea pentru scanarea sa cerebrală. + Simon a luat metroul până la PACE Laboratories din centrul Toronto-ului, unde are o programare pentru scanarea cerebrală. + După ce a fost scanat cerebral, Simon s-a trezit într-un loc necunoscut. + Simon a găsit un mic dispozitiv portabil numit omnitool. + Simon a actualizat omnitool-ul și acum poate deschide anumite uși. + După ce a fost scanat cerebral, Simon s-a trezit într-un loc necunoscut. + Simon a reușit să ia legătura cu un străin printr-un radio defect. I s-a spus să găsească Comm Center, o cameră cu un tavan cu cupolă, pentru a putea vorbi din nou. + Simon caută o stație de navetă care să-l ducă la Lambda, unde Catherine a spus că îl va aștepta. + Simon încearcă să pornească o navetă care să-l ducă la Lambda, unde trebuie să o întâlnească pe Catherine, femeia de la radio. + Naveta lui Simon s-a prăbușit și acum trebuie să găsească o altă modalitate de a ajunge la Lambda, locul unde Catherine, femeia de la radio, îl așteaptă. + Simon a ieșit din nou în ocean și trebuie să găsească Lambda, locul unde Catherine, femeia de la radio, îl așteaptă. + Catherine s-a dovedit a fi un robot – un robot defect – iar Simon acum trebuie să transfere datele ei în omnitool-ul său. + Catherine vrea ca Simon să o ajute să afle ce s-a întâmplat cu ceva numit proiectul ARK. Ea vrea ca Simon să acceseze un computer din apropiere și să raporteze descoperirile sale. + Proiectul ARK al lui Catherine era destinat să salveze umanitatea, dar este prins adânc în abis. Pentru a-l salva, trebuie să găsească o cale spre Theta, unde vor ajunge la DUNBAT, singurul vehicul care poate suporta presiunea abisului. + Proiectul ARK al lui Catherine era destinat să salveze umanitatea, dar este prins adânc în abis. Trebuie să ajungă la Theta și să găsească DUNBAT, singurul vehicul care poate suporta presiunea abisului. Pentru a ajunge acolo, Simon speră să găsească epava CURIEI și să fure un vas de urgență. + Simon a găsit epava CURIEI, un mare vas pe fundul mării. În ea speră să găsească un vas de urgență pentru a călători spre Theta. + Simon și Catherine se îndreaptă spre Theta pentru a ajunge la DUNBAT, un vehicul creat pentru medii de presiune extreme. Doar cu DUNBAT vor putea pătrunde în abis și găsi ARK-ul pierdut. + Simon a aterizat în apropierea unui loc numit Delta. Încă încearcă să ajungă la ARK, dar pentru a face asta, trebuie mai întâi să ajungă la Theta. + Simon a chemat un dirijabil, un vehicul subacvatic de transport. Catherine spune că l-ar putea opera dacă nu ar fi chip-ul ei defect. Simon trebuie să obțină unul nou de la un robot din zonă înainte de a putea pleca. + După ce a înlocuit chip-ul defect al lui Catherine, cei doi pot în sfârșit să continue spre Theta cu dirijabilul. + Simon și Catherine se îndreaptă spre Theta, unde speră să găsească DUNBAT, un vehicul creat pentru medii de presiune extreme. Doar cu DUNBAT vor putea pătrunde în abis și găsi ARK-ul pierdut. + Simon și Catherine au ajuns la Theta și acum trebuie să găsească DUNBAT, un vehicul creat pentru medii de presiune extreme. Doar cu DUNBAT vor putea pătrunde în abis și găsi ARK-ul pierdut. + Simon și Catherine au găsit DUNBAT-ul, dar a fost pus sub carantină și trebuie să găsească pe cineva care să știe un cod de securitate pentru a putea obține acces. Doar cu DUNBAT vor putea pătrunde în abis și găsi ARK-ul pierdut. + Simon a găsit o scanare a unui recrut de securitate, Brandon Wan, și speră să găsească o modalitate de a extrage un cod de la el, astfel încât Catherine să poată accesa DUNBAT. Doar cu DUNBAT vor putea pătrunde în abis și găsi ARK-ul pierdut. + Simon încearcă să afle mai multe informații despre cine a fost Brandon Wan, pentru a-l convinge mai ușor pe simulacrul său să îi ofere codul de securitate necesar pentru a accesa DUNBAT. Doar cu DUNBAT vor putea pătrunde în abis și găsi ARK-ul pierdut. + Simon și Catherine încearcă să convingă simulacrul lui Brandon Wan să le ofere codul de securitate necesar pentru a accesa DUNBAT. Până acum, "Brandon" a fost suspicios față de mediile prezentate. Trebuie să rezolve această problemă deoarece DUNBAT este singurul vehicul care le poate permite să ajungă la ARK. + Simon și Catherine au păcălit simulacrul lui Brandon să împărtășească codul de securitate necesar pentru a accesa DUNBAT. Acum pot în sfârșit să-l folosească pentru a călători în abis și a găsi ARK-ul pierdut. + DUNBAT a fost corupt de WAU. Nu există nicio modalitate de a-l salva.[br]Simon și Catherine vor trebui să găsească o altă modalitate de a pătrunde în abis și a găsi ARK-ul. + DUNBAT a fost corupt de WAU. Nu există nicio modalitate de a-l salva.[br]Simon și Catherine vor trebui să găsească o altă modalitate de a pătrunde în abis și a găsi ARK-ul. + Planul de a duce DUNBAT-ul în abis a eșuat. Simon și Catherine au decis să meargă la Omicron și să folosească Climber-ul în schimb, dar mai întâi Catherine are nevoie de ajutorul lui Simon pentru a înțelege cum funcționează ARK-ul. + Planul de a duce DUNBAT-ul în abis a eșuat. Simon și Catherine au decis să meargă la Omicron și să folosească Climber-ul în schimb, dar mai întâi Simon trebuie să găsească o cale de ieșire din Theta. + Simon este pierdut undeva în interiorul Theta, căutând o cale de ieșire. + Simon este pierdut undeva în interiorul Theta, vânat de creaturi ciudate. + Simon a scăpat din Theta și în sfârșit poate ajunge la Omicron, unde poate găsi un Power Suit care să reziste presiunii abisului. + Simon a găsit Omicron, unde trebuie să caute un Power Suit care să reziste presiunii abisului. Dar mai întâi trebuie să găsească o cale de intrare. + Simon a intrat în Omicron. Înainte de a putea călători cu Climber-ul în abis, are nevoie de un Power Suit pentru a supraviețui presiunii. + Simon a găsit un Power Suit cu un cadavru în interior. Acum trebuie să-l adapteze pentru ca Catherine să poată transfera mintea lui în el și să poată continua călătoria în abis. Sunt necesare trei părți: gel de structură, un cortex chip de la un robot și un power pack. + Catherine a transferat cu succes mintea lui Simon într-un corp nou, capabil să suporte presiuni extreme. Sunt acum gata pentru abis. + Cu un corp nou și mai puternic, Simon și Catherine vor călători cu Climber-ul în abis și vor căuta ARK-ul pierdut. + Simon este pe Climber, îndreptându-se spre fundul oceanului. Apoi va trebui să traverseze mediul dur al abisului pentru a ajunge la Tau, unde se spune că se află ARK-ul. + Simon a ajuns la fundul abisului și acum va trebui să traverseze mediul dur pentru a ajunge la Tau, unde se spune că se află ARK-ul. + Simon a găsit calea în Tau, unde se presupune că se află ARK-ul. Trebuie să găsească ARK-ul și să-l transporte la Phi, unde poate fi lansat în spațiu. + Simon a găsit în sfârșit ARK-ul și trebuie acum să-l ducă cu el la Phi, unde îl va lansa în spațiu. + ARK-ul este pe drum către Phi cu un tramvai automatizat. Simon trebuie doar să se asigure că ajunge și el acolo. + Simon a scăpat de secretul Alpha, inima WAU, și a ajuns la Phi. Este timpul să se reunească cu ARK-ul și să-l lanseze în spațiu folosind Omega Space Gun. + Simon a ajuns la site-ul Phi, unde intenționează să lanseze ARK-ul în spațiu folosind Omega Space Gun. + Simon a transferat cu succes mintea sa în ARK. + + + + + OK + Anulare + Înapoi + Joacă + Oprire + Redare + C + Șterge + Eroare + Următorul + Anterior + + + + EROARE + OK + + v. 3.02 + Control Blocare Uși + BLOCAT + DEBLOCAT + N/A + DEFECȚIUNE SISTEM! LIMITA DE BLOCARE ACTIVĂ. + RESURSE RAMASE: + % + INFORMAȚII + MESAJELOR + INBOX + CIORNE + TRIMISE + TRIMITE + CITITOR + PLAYER AUDIO + + Date corupte detectate[br]Restaurare fișiere? + Restaurare... + Recuperare parțială a datelor reușită! + + ACCES REFUZAT + OFLINE + ACCES ALOCAT + SWIPE OMNITOOL + + STATUS + DIFF. DE PRESIUNE + IEȘIRE + INTRARE + UȘĂ DE PRESIUNE + + + + + ÎNAPOI + PLAYER AUDIO + CITITOR LOGURI + MESSENGER + v. 3.02 + CONVERSAȚII + ATAȘAMENTE + TRIMITE + ȘTERGE + OK + + + + treemail 0.1 + INBOX + CIORNE + TRIMISE + CĂTRE: + DE LA: + SUBIECT: + DATA: + TRIMITE EMAIL + Da + Nu + Sigur vrei să trimiți? + Sâmbătă, 2 Mai 2015 + + + + + NECUNOSCUT + Jesse - The Grimoire + David Munshi + Durata: + Apel ratat + Refuzat + Apel încheiat + Sunând... + + 09:21 + 10:12 + 10:50 + + + + Haimatsu Power Suits: Utilizare corectă[br]Pentru siguranța ta și a colegilor tăi![br]1: Puneți pe voi costumul din neopren și hamul de corp.[br]2: Verificați HPS-ul pentru orice daune vizibile.[br]3: Începeți cu picioarele, fixați piesele pe hamul vostru și urcați treptat. Blocați toate piesele pe măsură ce mergeți. Lăsați un partener să vă ajute cu piesa de spate și torsul.[br]4: Apăsați butonul "Secure" de pe piesa de braț. Ar trebui să auziți cum se sigilează costumul.[br]5: Costumul va începe apoi să echilibreze presiunea și să se conecteze la butelia de oxigen.[br]6: Dacă costumul nu se sigilează, flexați amortizoarele și încercați din nou. Dacă tot nu funcționează, nu încercați să-l reparați singuri! Contactați întreținerea.[br]Notă: HPS-urile sunt foarte grele și costumul va compensa. Veți fi efectiv mai puternici decât credeți. Aveți grijă![br]Antrenamentul regulat se aplică: Nu vă țineți respirația, nu stați prea mult afară, nu scufundați prea adânc, nu scufundați cu echipamente defecte. + Listă de verificare[br]Supraviețuiește proiectului ARK[br]Opriți oamenii să nu se sinucidă[br]Trimiteți C și echipa[br]Păstrați oamenii în siguranță[br]Bucurați-vă de restul Armagedonului + Akers nu este singur[br]cel puțin 3 creaturi proxy[br]verificați și sigilați ușile[br]mergeți la subsol[br]shuttle către Omicron + + + + "Realitatea este ceea ce, atunci când încetezi să crezi în ea, nu dispare." + - Philip K. Dick + + + + Amintește-ți, Jesse![br]Ia medicamentele[br]Flori pentru înmormântare + Însănătoșire grabnică.[br][br]Cu drag, Mama + CINEMA VARIETY[br]Revista Ultimate despre filme[br][br]- Filme de vară[br]- Japanimation: Mai mare ca niciodată[br]- Cascadorii vs CGI[br]- Ce este un film "Bottle"? + Massive Recoil 2: Execuție Perfectă[br]În cinematografe din 13 decembrie + Cartografierea Minților[br]Albert Isaacson + Lăudat pe scară largă ca unul dintre cele mai cuprinzătoare și accesibile texte despre anatomia creierului uman, funcțiile sale și percepția noastră asupra conștiinței.[br][br]Aflați cum creierul depinde de corpul său, de ce creierul nu este pur și simplu un computer și o mulțime de alte fapte interesante care vă vor face capul să vibreze.[br][br]Această ediție include și două capitole noi despre dezvoltarea creierului și cum influențează comportamentul nostru în diferite etape ale vieții. + Trimite e-mail + INBOX + CONCEPTE + TRIMISE + Sesiunea Neurograph + Prescripție nouă + Sâmbăta liberă + David Munshi + Sesiunea Neurograph + 30 aprilie 2015 + Mulțumim din nou pentru participarea la cercetarea noastră. Scanarea va fi efectuată la Pace Laboratories în Toronto, dar deoarece suntem oaspeți, accesul nostru este puțin imprevizibil. Voi încerca să programez o sesiune de scanare pentru sâmbătă. Te voi contacta când va fi confirmat.[br][br]Cu stimă, David Munshi + Dr. Erin Peake + Prescripție nouă + 28 aprilie 2015 + Dragă domnule Jarrett,[br][br]Mă bucur să aud că durerile de cap au devenit mai rare. Testele recente arată că creierul dumneavoastră se recuperează încet, dar este încă prea devreme pentru a spune cât de bine se va adapta la daune. Sângerarea va continua cel puțin câteva luni și va trebui să veniți la spital de câteva ori pentru a drenajul cavității pentru a preveni acumularea de presiune din sânge.[br]Deoarece stresul excesiv ar putea fi fatal, v-am scris o prescripție pentru Prazosin pentru a vă ajuta cu coșmarurile. Vă rog să citiți instrucțiunile și să luați medicamentul corespunzător.[br]Încercați să vă odihniți mult și ne vedem săptămâna viitoare.[br][br]Cu stimă,[br]Dr. Erin Peake + Jesse - The Grimoire + Sâmbăta liberă + 1 mai 2015 + Salut, Jesse,[br][br]Probabil ai uitat, așa că îți reamintesc că am programare la doctor mâine, adică nu vin la muncă![br][br]Asta înseamnă că trebuie să te asiguri că ajungi la timp pentru a deschide magazinul. Și te rog să desfaci cutiile din spatele ghișeului, încep să devină un pericol la locul de muncă. De asemenea, cărțile se vând mult mai bine dacă sunt puse pe rafturi unde oamenii pot să le vadă.[br][br]Mult succes (vei avea nevoie de el)[br]- Simon + treemail 0.1 + Simon.Jarrett@email.net + Accident în centrul orașului ucide o tânără[br]Vineri, 10 aprilie 2015[br][br]TORONTO - Ieri, o șoferiță distrată de copiii ei a trecut pe roșu, provocând un accident în intersecția dintre Bloor Street și Spadina Road. Mama și copiii ei, călătorind într-un SUV robust, au fost loviți, dar nu au avut răni grave. Cealaltă parte nu a fost atât de norocoasă. Când mașina a lovit partea pasagerului, Ashley Hall, 23 de ani, a suferit răni grave și s-a sufocat din cauza sângelui prins în plămâni până când a ajuns ambulanța. Prietenul ei și șoferul, Simon Jarrett, 26 de ani, a supraviețuit, dar cu rezultate complicate ce se presupune că îi vor lăsa daune cerebrale permanente.[br][br]Șoferul SUV-ului, al cărui nume nu a fost făcut public de către poliție, susține că a fost un accident și aproape imposibil de evitat. + HOOKED[br]Robyn McConnell + Mark și Diana Miller au reușit în sfârșit să-și îndeplinească visul. Au reușit să pună bani deoparte pentru vacanța în Hawaii despre care tot vorbeau. Dar pe măsură ce soarele apune pe plaja Waikiki în acea primă zi, paradisul lui Mark și Diana se transformă într-un coșmar când înotătorii sunt prinși de mii de fire subțiri care se întind de undeva din adâncurile apei. Încet, înotătorii sunt smulși urlând în apa întunecată. Încercând să fugă din fața pericolului, fiul lor de șapte ani, Charlie, este prins de tentaculele vicioase.[br]Suspans, mister și groază absolută. Hooked te va captura. + Massive Recoil + John Hue este un polițist corupt care lucrează în Hong Kong.[br]Într-o zi, viața lui este dată peste cap când o întâlnește pe Amber, o misterioasă străină care este ținută prizonieră de Triada Dragonul Aurie.[br]Pregătește-te să mergi pe cont propriu, pentru că este timpul să te opui triadei, poliției și forțelor supranaturale din subteran.[br][br]Pregătește-te pentru Massive Recoil. + + + + Sună-l pe Dr. Munshi? + Apel încheiat + Se sună... + Paul Berg + PROBĂ ȘI EROARE + Pune-ți bisturiul la loc - Creierul se poate vindeca singur![br]"Creierul are o calitate transformatoare uimitoare - o plasticitate - care îi permite să compenseze și chiar să se vindece," explică Paul Berg, student la neuroștiințe la Universitatea York din Toronto. Este această calitate pe care Berg și colegul său David Munshi, student la informatică, speră să o încurajeze. "Este vorba despre a face creierul să facă lucrul corect. Și sperăm să realizăm acest lucru cu lucruri simple precum: exerciții, terapie și medicamente ușoare."[br]Dar Munshi și Berg nu caută o panacee miraculoasă, este vorba despre găsirea tratamentului optim pentru fiecare pacient. Încep prin a înregistra ceva numit neurograf Nakajima. "Este ca o imagine care indică direcția," spune Munshi, "În loc de o scanare statică a creierului, neurograful poate să ne spună încotro se îndreaptă creierul tău." + Nu este o prognoză pe termen lung, ci vorbim de milisecunde, dar cu modelul informatic corect, Berg și Munshi pot aplica tot felul de tratamente fără a risca daune reale asupra creierului. "Am putea încerca să-i administrăm creierului o supradoză de analgezice în timp ce alergăm un maraton," sugerează Berg, "Este doar un model informatic. Suntem capabili să eșuăm în tratarea ta de un milion de ori doar pentru a găsi calea corectă." Și când găsesc tratamentul optim, abia atunci îl aplică pacientului real. Este încă în stadii incipiente, dar proiectul lor a atras atenția Laboratoarelor PACE, care au promis să le ofere suport cu echipamente și spațiu de lucru. "Suntem foarte norocoși să avem tot acest suport," spune Berg, "Acum trebuie doar să ieșim din lumina reflectoarelor și să facem efectiv munca." + CONECTARE + Nume utilizator + Parolă + MattL + YorkDavidM + INBOX + TRIMISE + Scanează acum! + Pregătește-ți lucrurile + Suntem blocați + David Munshi + SUBIECT: Scanează acum! + 2 Mai 2015 + Paul! Unde ești?![br][br]Mai avem câteva ore. Am luat legătura cu Simon Jarrett. Hai să facem asta. Am văzut laptopul tău la recepție. Ești deja aici?[br][br]Sună-mă cât mai repede! + David Munshi + SUBIECT: Pregătește-ți lucrurile + 27 Aprilie 2015 + Bună Paul,[br]Am vorbit cu PACE despre folosirea laboratorului săptămâna aceasta. Am reușit să rezerv scanerul pentru mâine dimineață și din nou vineri. Nu este mult, dar au spus că putem folosi zona de recepție goală ca birou. Asta ne-ar permite să folosim calculatoarele lor pentru a rula modelele și, de asemenea, dacă apare un loc liber, putem intra și folosi scanerul imediat.[br][br]M-am gândit că am putea face câteva teste mâine. Am putea face o scanare unul altuia pentru a învăța echipamentul. Se spune că este destul de ușor. Vineri sper să vină Dr. Erin Peake cu cineva. Are un pacient care a fost recent într-un accident de mașină. Ar trebui să fie interesant.[br][br]- David + David Munshi + SUBIECT: Suntem blocați + 30 Aprilie 2015 + Am găsit puțin timp suplimentar în laborator astăzi. Din păcate nimeni nu ne-a spus despre schimbarea codului. Așa că am sunat la Securitate, am vorbit cu profesorul Wei ca să susțină proiectul nostru și am reușit să iau legătura cu cineva de la departamentul juridic PACE care ne-a dat din nou permisiunea de a folosi laboratorul.[br][br]Nu am voie să repet codul în e-mailuri sau mesaje, dar voi lăsa o notă sau ceva în caz că uităm.[br][br]- Paul + paul.berg@yorkuni.ca + + + + + Înapoi + Stare Sistem + 3progresS6ScAN-SJ + XImAdsWcA-U? + 0?abF3A#.-U + Omnitool + Inventar + + INVENTAR: Costume Ductile de bază 1-6[br][br]BDS #1 - OK[br]BDS #2 - OK[br]BDS #3 - Contaminare necunoscută![br]BDS #4 - OK[br]BDS #5 - În utilizare[br]BDS #6 - În utilizare[br][br][br]Notă: Toate costumele Haimatsu Power sunt depozitate la Omicron + + Gestionare Cip Unelte + Gestionare Cip Cortex + Orientare + Dezblocare Cutie Unelte + + Actualizează + OMNITOOL v2.5[br][br]Omnitool este o interfață avansată pentru accesarea, gestionarea și controlul sistemelor informatizate. Inteligența integrată include un set deschis de comportamente și protocoale pentru a permite utilizatorului să automatizeze acțiunile de rutină prin diagrame logice de bază. De-a lungul timpului, Omnitool se va adapta automat pentru a acoperi comportamentele subconștiente, optimizând activitatea și minimizând erorile utilizatorului. Omnitool are un semnal de mică rază util pentru acțiuni de bază sau automatizate, cum ar fi deschiderea ușilor, iar pentru operațiuni complexe, Omnitool trebuie conectat fizic la un terminal sau stație de lucru.[br][br]Pentru a actualiza dispozitivul, introduceți operatorii în slotul Principal sau Auxiliar. Slotul Principal are un conector standard C(11-21), care permite utilizatorului să monteze majoritatea cipurilor de Cortex pe piață în Omnitool. Rețineți că introducerea unei A.I. suplimentare va înlocui inteligența integrată. Slotul Auxiliar este un conector multi-modal care se potrivește cu o gamă largă de modele de cipuri de unelte, inclusiv, dar fără a se limita la: A1(113-398B), A2(090-101X), HaiTT(1-9), JuCi(3-29). + + Niciun Omnitool găsit + Bine ai revenit, Louise Meuron (UPSILON).[br][br]Omnitool-ul tău este în stare perfectă, dar nu este echipat cu un Cip Unelte.[br][br]Reține că, fără un cip de unealtă, kitul tău FST nu va fi disponibil, inclusiv accesul tău la securitatea intersite.[br][br]Pentru a continua să folosești privilegiile tale desemnate, te rugăm să introduci un Cip Unelte și să rulezi o Actualizare. + Bine ai revenit, Louise Meuron (UPSILON).[br][br]Omnitool-ul tău este în stare perfectă și echipat cu un Cip Unelte.[br][br]Rulează o Actualizare pentru a confirma instalarea kitului FST și cotele de securitate actualizate. + + Niciun Omnitool găsit + Bine ai revenit, Louise Meuron (UPSILON).[br][br]Omnitool-ul tău este în stare perfectă, dar nu este echipat cu un Cip Cortex personalizat.[br][br>Momentan ești servit de inteligența integrată implicită: "Helper Jane". Reține că instalarea unui Cip Cortex va înlocui ajutorul și poate modifica semnificativ experiența ta de utilizator. + + [ 2103 / 05 / 09 ][br] + UPSILON#7185783[br] + Rulează configurare...[br] + AVERTISMENT: Accesul de la distanță refuzat[br] + AVERTISMENT: Serverele offline[br] + AVERTISMENT: Puterea principală suspendată[br] + -> Inițiază configurare WAU A.41iu[br] + ... program nesigur ...[br] + ... refuzat ...[br] + Sisteme de urgență: 13 zile rămase + + + + [ 2104 / 05 / 09 ][br] + UPSILON#61633[br] + %&(/)[br] + thetaCache:graphs:legacy - DM_SJ[br] + desfășoară...[br] + Sub_Simon Jarrett[br] + 28xY, scanare terminal[br] + Aut_DavidMunshi2015v1[br] + Toronto[br] + =6(2@(573/3/&6[br] + -> ApPS[br] + ... operațiune indisponibilă ...[br] + ->4416cWAUcf77[br] + ... complet ... + + + + Totul arată la fel. Tăcerea sună la fel. Ca și cum nimic nu s-ar fi întâmplat. Doar arată cât de independenți suntem cu adevărat. E ca și cum am fi pe lumi diferite. + Cutremurele au făcut ca viața animală să se adune aproape pentru câteva zile, dar apoi totul s-a liniștit și au plecat. Acum sunt înapoi și diferiți. Sunt murdăriți cu un gel negru gros de structură pe care nu-l pot scutura. Păsările marine, somehow cred că nu vor găsi ajutor în WAU. + + Înapoi și diferiți[br]Gel gros de structură pe care nu-l pot scutura[br]Peștii bizarri ai WAU + Ca și cum nimic nu s-ar fi întâmplat[br]Totul arată la fel[br]Toată tăcerea e la fel + + Configurarea Omnitool + Actualizarea cifrelor de securitate + Chipul uneltelor actualizat.[br]Vă rugăm să îndepărtați Omnitool + + CORTEX CHIP: Nu este introdus + + + + Scanează Omnitool + Citire + BLOCAT + CONSOLE DE SERVICIU[br][br]Introduceți Omnitool pentru a accesa + AUTOMATIZAT[br][br]Deblocați terminalul din Consola de Serviciu + + CI CHIP: Nepus + CI CHIP: HaiTT-7 (Actualizare necesară!) + + Locul pilotului #3 - Upsilon + Rapoarte + Locul pilotului #3 - Upsilon FĂRĂ CONEXIUNE + Niciun pilot găsit + + În progres + Construiește rețeaua + Starea pilotului + Sincronizează Blackbox-ul pilotului + Starea conexiunii + + Raport pilot #01053 + + PILOT: Carl Semken[br]SUPORT: Amy Azzaro[br]VEHICUL: Tugger (UH-3)[br][br]TASK: Înlocuiește scuturile de căldură (Southern Flue)[br]REZULTAT: Succes (producția restaurată)[br][br]OBSERVAȚII:[br]Semken a raportat niveluri necharacteristice de greață după misiune. Diagnosticul arată un vârf de electromagnetism în jurul căștii pilotului, care se crede că a fost cauza simptomelor lui Semken. Nu există indicii privind ceea ce a creat această anomalie. + + ATENȚIE! + Sistemul pilotului a devenit tot mai nesigur. Toți cei care l-au folosit în ultimele luni au avut dureri de cap și episoade de greață. Săptămâna trecută, Gavin a fost lovit timp de 30 de ore când a încercat să dirijeze un cluster auxiliar. Acest lucru nu este acceptabil. Vom rezolva această problemă, dar pentru moment voi opri utilizarea sistemului pilotului. Asta înseamnă că va trebui să faceți mai multă muncă fizică, efectuând operațiuni prin programare sau muncă fizică. Nimeni nu este mulțumit de aceasta, așa că nu mai faceți plângeri.[br][br]Jane Adams, Factor Principal + + CONSOLE DE SERVICIU[br][br]INSTALATOR CHIP OMNITOOL[br][br]Construiți, formați și optimizați Omnitool-ul cu instrumente și asistenți personalizați. + CUTIE DE UNELTE + + + + + Lisabona, Portugalia + Cadiz, Spania + Site Upsilon + Site Theta + Site Lambda + Site Delta + Site Omicron + Site Tau + Site Phi + Site Omega + + Nu atingeți scurgerea de gel din structură. Nu se poate confirma efectul asupra WAU. Problema a fost raportată la SSE Wolchezk. + + Putere: Restabilită[br]Timp de inactivitate înregistrat:[br] 143 zile, 11 ore, 37 minute[br]Producție de energie: 426 Megawați + Standard Upsilon[br]Presiune: 2.017 bar[br]Oxigen: Indisponibil[br]Diagnostic stație: Indisponibil + Structură[br]Integritatea Hăllei Interioare: Breșe multiple sector A, D, G, J, K[br]Structura de bază:[br].... Substrat: Perforație minoră[br].... Armură: Zona U4-U5 abandonată[br]Slujbe de presiune: Blocată S3[br]Chassis Doc: Confiscată D1, D2 + PRODUCȚIE + SISTEME + STRUCTURĂ + REDUCERE + Starea Transformatorului: + + Semnal radio blocat[br]Putere insuficientă + Fără semnal + + Upsilon Auto-procesare + Către: Wolchezk, Heather[br]Subiect: Upsilon Auto-procesare[br][br]Am reușit să conectăm majoritatea turbinelor de rezervă și să activăm toate generatoarele. Upsilon ar trebui să poată produce energie pentru cel puțin un deceniu înainte să începem să consumăm prin coșuri.[br][br]Veștile proaste sunt că mașinile devin tot mai defecte. Am încercat să găsim o modalitate de a le opri pe toate, dar având în vedere cantitatea enormă de unități de la Upsilon, nu arată bine. Mă îngrijorează serios că ar putea întrerupe producția de energie când vom pleca.[br][br]Aveți idei?[br][br]Amy Azzaro + 2103-05-03 @ 15:41:02 + Re: Upsilon Auto-procesare + De la: Wolchezk, Heather[br]Subiect: Upsilon Auto-procesare[br][br>Felicitări. Încercați să puneți în funcțiune toate turbinile de rezervă și să reduceți producția la 60%. Cu toate evacuările, putem supraviețui pe o vibrație scăzută și constantă. Nu trebuie să forțăm sistemul. Ar trebui să putem obține 20 - 25 de ani de producție înainte să trebuiască să revenim la turbine.[br][br>Roboții devin tot mai imprevizibili pe întreaga stație Pathos-II și din păcate nu există un întrerupător universal de oprire. Având în vedere că nu vom mai reveni la Upsilon, ați putea încerca să izolați sectoare pentru a preveni ajungerea ajutoarelor în zonele sensibile.[br][br]Wolchezk + 2103-05-03 @ 16:09:24 + Re: Re: Upsilon Auto-procesare + Către: Wolchezk, Heather[br]Subiect: Upsilon Auto-procesare[br][br>Producția de energie a fost asigurată.[br]Am sigilat fabricile pentru a menține uzina în funcțiune. Toate sistemele superflue au fost oprite.[br]Dacă cineva va trebui vreodată să se întoarcă, să știe că regulatorul de flux de energie este pe cale să cedeze. Dacă apucați întrerupătorul, probabil va fi o situație din care nu mai aveți cale de întoarcere.[br][br>Suntem gata să plecăm.[br]Carl + - + STATUS: CĂSĂTORIE + TRIMITE + Se trimite... + Personal Upsilon + FACTURĂ PRINCIPALĂ[br]Adams, Jane (Loc: Theta)[br][br]DISPECER[br]Jonsdottir, Vigdis (Loc: Theta)[br][br]INGINER GEO-TEHNIC[br]Rogers, Baxter (Loc: Theta)[br][br]TEHNICIENI DE SERVICIU PE CAMPIU[br]Azzaro Amy (Loc: Upsilon - Stația Shuttle B)[br]Finley, Gavin (Loc: Theta)[br]Meuron, Louise (Loc: Theta)[br][br]CĂPCĂI[br]Semken, Carl (Loc: Upsilon - Control Deck)[br]Shankar, Aashish (Loc: Theta) + Cameră Termică + Depozitare + Control Flux + Centru de Comunicații + Fabrica de Construcții + Sifon + PORNIT + OPRIT + N/A + PUTERE INSUFICIENTĂ[br]Soluție nu găsită + PUTERE INSUFICIENTĂ[br]Soluție găsită: Opriți una dintre secțiunile evidențiate [br] pentru a direcționa energia către Centrul de Comunicații + Autentificare invalidă! + Emailul nu a fost trimis![br]Conexiunea nu a putut fi stabilită + INFO + Starea energiei s-a schimbat! + EMAIL + MANAGER ENERGIE + PERSONAL + CONEXIUNE + DECONEXIUNE + UTILIZATOR: + ID#: + JAdams + AAzzaro + GFinley + VJonsdottir + LMeuron + BRogers + CSemken + AShankar + Schimbă + BINE AȚI VENIT + Conectat ca Amy Azzaro. + Conectat ca Carl Semken. + + STATUS + JURNAL DE EVENIMENTE + IEȘIREA DE PUTERE + Capacitate maximă: 710 Megawați[br]Nivel de producție: 60%[br]Frecvență: 30 Hz[br]Tensiune: 690 V + 2102-10-29 @ 05:41:13 - Eșec scut termic (fumat)[br]2102-12-11 @ 16:09:24 - Supraîncălzire turbină[br]2103-01-12 @ 05:31:57 - Cutremurul perturbează canalul de pe platou (impact)[br]2103-01-12 @ 05:33:39 - Pană Lambda (represalii)[br]2103-01-12 @ 06:01:23 - Pană Omicron (represalii)[br]2103-01-12 @ 06:01:51 - Pană severă Delta (represalii)[br]2103-01-19 @ 09:11:42 - Eșec scut termic (fumat) + + JURNAL DE ACTIVITATE + Jurnal: Pornire sistem [br]BootException: Nu s-a putut încărca secvența de boot (la Boot.cs:1447) [br]FormatException: Intrarea nu a fost în formatul corect. Analiza a eșuat (la Parser.cs:2112) [br]Jurnal: Sistemul a eșuat [br]ArgumentException: Index în afacerea intervalului (la Parser.cs:2113)[br]Jurnal: Reboot în 5...[br]Jurnal: Reboot în 4...[br]Jurnal: Reboot în 3...[br]Jurnal: Reboot în 2...[br]Jurnal: Reboot în 1... + ONLINE + OFFLINE + AVERTISMENT + Control Linia de Producție + Status: Funcționare + Status: Oprit + Producție + Transmisie + Jurnale + Înapoi + STABILIRE CONEXIUNE COMUNICAȚII CU: + Theta + Omicron + Mu + Necunoscut + Lambda + Tau + Phi + Procesul de blocare a fost inițiat[br]Verificați terminalul pentru detalii + RESETARE NECESARĂ + SISTEM ONLINE + DEFECȚIUNE SISTEM + O scurtă introducere în CCRV-7 "Blackbox" + Această Blackbox este un instrument de precizie conceput pentru a observa condiția generală. Măsoară o gamă largă de date, de la temperatura corpului până la activitatea undelor cerebrale. Aceste informații sunt transmise constant unității de pază WAU a Pathos-II pentru ca stația să poată furniza climatul adecvat în fiecare situație. Pentru o performanță optimă, urmați cu atenție instrucțiunile autoinjectorului pentru a asigura aplicarea corectă a implantului. + Africa + Europa + America de Nord + Oceanul Atlantic + Evacuare! + Azzaro și Semken au adunat tot ce au nevoie în camera de comunicații, așa că tot ce este aici poate fi luat.[br][br]Theta a cerut:[br]1. Tot ce este comestibil: miso, cafea, orez, etc.[br]2. Toate pachetele de energie funcționale[br]3. Medicamente incl. Truse de prim ajutor[br]4. Omnitools și instrumente de precizie[br]5. Produse de igienă: săpun, pastă de dinți, etc.[br][br]În afară de acestea, aduceți orice va ajuta să rămâneți în viață și să vă mențineți moralul ridicat.[br]Adams + Stație de putere + Administrație + Comunicare + Fabrică + SECVENȚĂ MANUALĂ DE ÎNDRUMARE + S1 + S2 + TURBINE + PUTERE PRINCIPALĂ + RĂCIRE + rpm + SISTEME DE COMUNICAȚII + ONLINE + OFFLINE + UȘI + BLOCAT + DEBLOCARE + DEBLOCAT + Așteptând + Stații + Status + Citește asta![br]Am pus sub presiune sistemul. Dacă tragi levierul, nu mai există întoarcere. Asigură-te că vrei asta destul de mult. + SEMKEN, CARL[br]ID: 0722 + AZZARO, AMY[br]ID: 0735 + Upsilon - 99m - Ch:2201[br]Theta - 153m - Ch:2202[br]Lambda - 96m - Ch:2203[br]Delta - 64m - Ch:2204[br]Omicron - 115m - Ch:2205[br]Tau - 4114m - Ch:2206[br]Phi - 3802m - Ch:2207[br]Omega - 0m - Ch:2208 + Canalul nu este recunoscut + Imposibil de stabilit o conexiune + Imposibil de apelat [Site Upsilon] din [Site Upsilon] + UTILITAR COM + ID CONTACT + Se stabilește... + EROARE LINK + + Înregistrări + 2103-04-27 @ 10:51:26 + 2103-04-28 @ 08:52:22 + 2103-04-29 @ 22:42:19 + 2103-05-04 @ 14:11:54 + Date corupte detectate![br]Apăsați OK pentru a încerca reconstruirea. + Se restaurează... + Reconstrucție parțială reușită! + + Theta - Întoarce-te![br]Am sigilat Upsilon pentru a-l menține în funcțiune. Nu o strica.[br][br]A. Azzaro[br][br]Carl nu a fost vina mea. + + NEW YORK[br]Status: Offline[br]Ultimul contact: 2103, 10 ianuarie - 19:24:05[br]Mesaj:[br]Jonsy,[br][br]Biroul se închide și toată lumea este evacuată. Din partea tuturor de aici, vreau să spun că a fost o onoare să lucrez cu tine și cu Upsilon. Drum bun și noroc cu apocalipsa.[br][br]- Ben + CADIZ (Auxiliar)[br]Status: Offline[br]Ultimul contact: 2103, 12 ianuarie - 05:12:09[br]Mesaj:[br]Jonsy,[br]Știu că ai o șansă mult mai bună de supraviețuire, dar noi avem priveliștea mai bună.[br][br]Salud! + LONDRA[br]Status: Offline[br]Ultimul contact: 2103, 11 ianuarie - 12:00:00[br]Mesaj:[br]Stimată doamnă Vigdis Jonsdottir,[br][br]Cu mare tristețe trebuie să vă informez că biroul se va închide și nu va mai putea susține Upsilon și Pathos-II. Aș dori să profit de această ocazie pentru a vă mulțumi dumneavoastră, supervizorului dumneavoastră Jane Adams și restului personalului. Sunteți un grup extraordinar și cu mare încredere pot spune că acolo unde cădem, voi continuați cu curaj.[br][br]Cu sinceritate,[br]Directorul sistemului James Bloom + LISABONA (Principal)[br]Status: Offline[br]Ultimul contact: 2103, 12 ianuarie - 04:52:02[br]Mesaj:[br]Actualizare despre măsurile de apărare.[br]Ultimele eforturi ale comunității globale pentru a preveni coliziunea au eșuat. Pathos-II ar trebui să facă ultimele eforturi pentru a face față cutremurului inevitabil după impact. Ora estimată pentru impact: 05:13.[br]-LIS + + Link LUMAR întrerupt[br]Intrare manuală necesară + Conectat + Site-uri + 2201: Upsilon - 99m + 2202: Theta - 153m + 2203: Lambda - 96m + 2204: Delta - 64m + 2205: Omicron - 115m + 2206: Tau - 4114m + 2207: Phi - 3802m + 2208: Omega - 0m + Aliniere + + BINE AȚI VENIT LA SITE UPSILON[br]Furnizând energie pentru întreg Pathos-II[br][br] - Cea mai mare centrală geotermală din lume[br] - Rafinarie de gaze naturale[br] - Fabrica de construcții[br][br]Vă dorim un sejur plăcut! + + + MANIFEST + EVENIMENT DE IMPACT + VIDEO + MANIFEST: SHUTTLE "BEAT"[br]Ruta: Ups-B / Theta Pr[br]Data plecării: -[br][br]ARTICOLE (BILET)[br]LW Tether, 250m (#187)[br]Raport pericol (#11)[br]Kit ajutor, x4 (#899)[br]Auto-Inflator. x3 (#91) + Pathos-II MEMO - "EVENIMENT DE IMPACT"[br][br]În dimineața zilei de 12 ianuarie (05:13), cometa Telos a căzut în Oceanul Pacific. Impactul este considerat una dintre cele mai mari coliziuni înregistrate vreodată pe Pământ. Toate dovezile indică faptul că suprafața a devenit complet sterpă și nu mai poate susține viața. Locația unică a Pathos-II a oferit o siguranță fără precedent pentru personalul nostru. S-au observat unele daune structurale, dar nu s-au raportat victime. Cea mai mare pierdere a fost stația meteorologică și de comunicații situată pe platforma de suprafață Omega (nepersonalizată), care în condițiile actuale este un preț mic de plătit.[br]Theta va organiza o întâlnire de urgență pentru a discuta viitorul Pathos-II și, în cele din urmă, al umanității. Mai multe detalii vor urma.[br][br]Supraveghetor K. Fourqurean + + PUTERE INSUFICIENTĂ + PUTERE PE ON + DOAR DE URGENȚĂ + PUTERE PE OFF + + UPSILON SHUTTLE STATION B + SURSA DE ENERGIE: + SISTEME DE BAZĂ: + ȘINELOR(SHUTTLE): + SISTEME DE SIGURANȚĂ: + ALIMENTAT + OFFLINE + STABIL + INSTABIL + REZERVE + + HARTA DE TRANZIT + UPSILON A + UPSILON B + LAMBDA + THETA + OMICRON + DELTA + TAU + PHI + Centrală Termică & Fabricare[br]Adâncime: 99 metri [Epipe][br]Personal: 8 + Recoltare & Rafinare Gaz[br]Adâncime: 107 metri [Epipe][br]Personal: - + Terminal Transport[br]& Centru Vizitatori[br]Adâncime: 96 metri [Epipe][br]Personal: 4 + Administrație, Control Misiune, Asamblare încărcătură[br]Adâncime: 153 metri [Epipe][br]Personal: 24 + MedRes, Biosfera X, ACR[br]Adâncime: 185 metri [Epipe][br]Personal: 12 + Rigger & Carcasă[br]Adâncime: 64 metri [Epipe][br]Personal: 4 + Operațiuni Omega[br]Adâncime: 4114 metri [Abyss][br]Personal: 8 + Tunul Spațial Omega[br]Adâncime: 3902 metri [Bathy][br]Personal: - + EROARE + Destinația este indisponibilă[br]din cauza unor probleme tehnice.[br][br]Vă rugăm să încercați o altă destinație. + Shuttle gata de plecare + Shuttle deja la Upsilon B + EROARE + Confirmă destinația + AVERTIZARE + INFORMAȚII + Sisteme OK + Plecând[br]Upsilon B + Avertizare![br]Linia blocată + Coliziune iminentă! + Desfășurare[br]frâne de urgență + Frâne de urgență desfășurate + Eroare de alimentare![br]Frână de urgență + Frână de urgență + Tren plecând + Plecând: + Putere + Putere[br]Instabilă + ETA: + Adâncime: + SUSPECȚIE DE FUGĂ: PRESIUNE SCĂZUTĂ + SEQUENCE IN PROGRESS + EȘTI AICI + Pathos-II: Uși etanșeabile[br]Set de reparație[br][br]- Pompa duplex x2[br]- Detergent multipurpose x1[br]- Pachet valve x5[br]- Garnituri x10[br]- Cheie impact x1[br]- Țevi adaptabile x4 + + + + OK + Date Recuperate: ARK + Lambda + Sondaj de opinie + Mediile ARK + Schite ARK + Sondaj de calibrare v0.3 + Tracker ARK + Interviul #1 + Interviul #2 + Interviul #3 + Robin Bass + Ian Pedersen + Mark Sarang + 7 iulie 2103 + 8 iulie 2103 + 9 iulie 2103 + Nume: + Dată: + Joacă + Fișiere + Subiect + Imagini + Anterior + Următor + ITEM: CYAN v2[br]- 5.11 kilometri pătrați[br]- Spațiu modular + ITEM: KEYWOOD v4[br]- 12.2 kilometri pătrați[br]- Pădure de foioase mixtă + ITEM: AUROUS v2[br]- 2 kilometri pătrați[br]- Parc urban + Sondaj de calibrare v0.3 + Bun venit![br][br]Dacă citiți acest mesaj, ați intrat cu succes în ARK. Acest sondaj este conceput pentru a oferi dezvoltatorilor o mai bună înțelegere a experienței dumneavoastră subiective și cum să îmbunătățească bunăstarea dumneavoastră.[br][br]Vă rugăm să continuați cu sondajul. + Continuare + Întrebarea următoare + Întrebare + Răspunsuri + 1. Cum ați descrie starea dumneavoastră fizică? + Mă simt normal. + Mă simt revigorat - o versiune mai bună a mea. + Mă simt alienat - sunt un vizitator într-un alt corp. + Mă simt fals - nu mai sunt o persoană reală. + 2. Cum ați descrie starea dumneavoastră mentală? + Mă simt normal. + Mă simt deconectat - o separare între minte și corp. + Mă simt schimbat - o schimbare de caracter. + Mă simt pierdut - nu mai exist. + 3. Cum ați descrie simțurile dumneavoastră? + Așa cum mă așteptam - normal. + Mă simt mai sensibil și conștient de împrejurimile mele. + Mă simt blocat - parcă simțurile îmi sunt amorțite. + Îmi lipsește unul sau mai multe dintre simțurile mele naturale. + 4. Cum ați descrie senzația noii condiții? + Este plăcută. + Nu îmi place - ceva nu este în regulă. + Este derutantă - totul pare construit. + Este deprimant - nu pot scăpa de senzația că totul este fals. + 5. Vă deranjează faptul că nu mai sunteți strict uman? + Nu, mă simt bine. + Parțial, simt că m-am pierdut pe mine însumi. + Da, plâng după existența mea anterioară. + Nu îmi pasă ce formă am, atâta timp cât pot continua. + 6. Cum percepeți noua dumneavoastră existență? + Este o continuare directă a vechii mele persoane. + Ca un nou capitol din viața mea. + Este ca și cum aș fi născut din nou - o refacere completă. + Este ceva complet diferit și nu are nimic de-a face cu vechea mea persoană. + 7. Credeți că această nouă existență va fi o viață demnă de trăit? + Da, la fel de mult ca și viața mea anterioară. + Da, dar cu mai puțin sens. + Poate că putem găsi un nou sens în această lume. + Nu, este prea departe de realitate și tot ce știu. + 8. Ați prefera să fiți îndepărtat din proiect și să acceptați moartea? + Nu. + Poate - trebuie să mă gândesc. + Da. + Se salvează + Alertă + Răspunsurile dumneavoastră au fost salvate. Vă mulțumim că ați participat.[br]- Echipa ARK + Scanare pentru ARK... + ARK nu este în zona selectată + ARK în sector + Selectați un sector pentru scanare + Rezultate + ARK localizat:[br]Pathos-II[br]Site Tau (Infirmerie)[br][br]Lat 35N 13'2.26"[br]Long 36W 1'46.78" + Introduceți Omnitool pentru a opera + EROARE - Chip Cortex necesar pentru autocontrol. + Bun venit, L. Meuron (UPSILON) + EROARE - Chip Cortex necesar + Chris,[br]Am stat toată noaptea. Părea o pierdere de timp să dorm. Am TV-ul pornit în fundal, prezentatorii de știri acoperă cometa care se apropie ca și cum ar număra pentru Revelion. Știu că e ciudat să îmi doresc să fii aici cu mine. Presupun că dacă cineva are o șansă să supraviețuiască acestui lucru, ar fi voi cei de sub valuri. Sper să reușiți să mergeți mai departe, dacă aceasta este o viață demnă de trăit.[br][br]Se pare că totul o ia la vale. Mai bine dau trimite înainte ca unda de șoc să ajungă la noi.[br][br]Sunt mândru de tine, băiete.[br]Tatăl tău + + + + + Vas de Urgență + Proceduri de Siguranță #12: Menținere[br][br]În situații de urgență, ușile blindate se vor sigila automat pentru a face sistemul de suport vital mai eficient. Activează modul de menținere pentru zonele care sunt utilizate doar pentru păstrarea alimentelor sau a altor obiecte sensibile la climă, cum ar fi plantele sau medicamentele. + Pagina Anterioară + Pagina Următoare + + Lisabona (Principal) + Cadiz (Auxiliar) + Brest + Casablanca + Dublin + Plymouth + Rabat + Tangier + Pathos II - Lambda + Lisabona (Principal)[br][br]Război Civil + Cadiz (Auxiliar)[br][br]Devastat de incendii + Brest[br][br]Forțe paramilitare ostile + Casablanca[br][br]Zonă de război + Dublin[br]Devastat de WMD[br]Lovit de radiații + Plymouth[br][br]Genocid + Rabat[br][br]Pustiu + Tangier[br][br]Mai multe grupuri armate implicate în lupte + Pathos II - Lambda[br][br]Ultima șansă? + + EFICIENȚA RĂCIRII + 99% + 81% + 68% + 0% + + TEMP. REACTOR + Stabil + Stabil + NECESARĂ SERVIRE + ABANDONAȚI NAVETA + + + + Gyrostabilizator + Ieșire de energie + Stare motor + Defecțiune critică! + Hartă + Eroare + OK + Înapoi + Play + Stop + Următorul + Precedentul + Expediere + Zepelini + Antenă + Solicită transport + Radio + Ecou + Abandonează + Șterge + Redare + Transmite + Trimite + Trimite mesaj + Evaluare proiect + Cod de acces invalid! + Imposibil de stabilit conexiunea + Zeppelinul nu răspunde + Nava se află deja în apropierea Delta. + Nava este deja ancorată la Delta. + Restaurare parțială a datelor reușită! + Imposibil de stabilit conexiunea[br]Mesajul nu a fost trimis + Eroare: Defecțiune motor + Avertizare: Date corupte + Restaurare + Progres: + Fișiere restaurate + Delta:Theta 2103-08-14 + Delta:Theta 2104-01-15 + Buffer audio corupt[br]Restaurăm fișierele? + Restaurare... + 2 fișiere recuperate + DEFECȚIUNE HARDWARE![br][br]E:2038[br]Componente lipsă sau deteriorate. + Fișiere restaurate + Jurnal acces + Mesaje + Hartă zonă + Jurnal + zeppelin_control -remote[br]2104-01-15 [zeppelin_control] acces la distanță refuzat (err: 92874)[br]2104-01-15 >zeppelin_control -remote -admin[br]2104-01-15 [zeppelin_control] acces la distanță refuzat (err: 92886)[br]2104-01-15 [zeppelin_control] FR_OVERRIDE-MK[br]2104-01-15 [main] comandă invalidă[br]2104-01-15 [zeppelin_control] FR_OVERRIDE-KOMOREBI[br]2104-01-15 [main] drepturi responder suspendate (Err: 3948)[br]2104-01-15 >FUCKYOUAKERS!!![br]2104-01-15 [main] comandă invalidă]]> + Mesaje + Mesaje (1) + Zep! + Către: Strasky.Theta[br]Subiect: Zep![br][br]Akers face niște lucruri ciudate. Tocmai a adus Zeppelinul înapoi la Theta. Nu-l lăsa să acosteze. Oprește-l! + Nu sunt mesaje! + ZOOM OUT + ZOOM IN + 2103-05-23: Defecțiune. Haimatsu Sat. (din Phi)[br]2103-06-10: Componente cadru (către Lambda)[br]2103-06-19: Cartuș Pascal (către Theta)[br]2103-07-10: Fuselaj (din Lambda)[br]2103-08-03: Carapace "ARK" (către Phi)[br]2103-08-14: Evacuare Delta (către Theta)[br]2104-01-15: Grup de cercetare Komorebi (din Theta)[br]2104-01-15: Nespecificat (către Theta) + Zeppelin - 049 + 049 + 049 + Status: Inactiv + Status: În mișcare + Zeppelin - 840 + 840 + 840 + Status: - + Zeppelin - 216 + 216 + 216 + Status: - + Puterea semnalului + Eroare: Pozițiile de transport s-au pierdut[br]Ajustați manual antena + Antena(e) aliniate incorect! + Legătură stabilită + Cod de acces: + Contactați terminalul + Stabilirea legăturii... + Legătură stabilită! + Trimitere solicitare de transport... + Zeppelin_049 nu răspunde. + Se reîncercă... + Zeppelin 049 - Afirmativ + Zeppelin 049 - În apropiere + Zeppelin 049 - Aparent la doc + UH Manual + Mesaje + Jurnal de acces + Șah + Fișier parțial corupt! + 2103-08-12 + 2103-08-13 + 2103-08-14 + 2103-12-25 + + Mă scuipă pe tine, Cronstedt. Nu plec nicăieri.[br]>Nu ai autoritatea să mă faci să plec.[br]>[br]>Terry[br][br]Aceasta nu sunt ordinele mele, idiotule, eu doar sunt mesagerul. Vrei să rămâi? Pot câștiga niște timp dacă vrei să stai în mizeria ta, dar echipa ta se mută mâine.[br][br]Cronstedt]]> + + + + Joc nou + Continuă + Ieșire + Statistici[br]Jocuri: 1610[br]Câștigate: 1000[br]Pierdute: 610 + Statistici[br]Jocuri: 0[br]Câștigate: 0[br]Pierdute: 0 + Eroare: Oponent corupt + Scanner de frecvență + Înregistrări + De la: 25MHz + Până la: 941MHz + Începe scanarea + Oprește scanarea + Semnale găsite: 0 + Este interesant să văd cum WAU revendică Delta. Acum șase luni m-aș fi îngrijorat. Aș fi avut-o pe Goya și pe Wan să curețe sângele negru din mecanisme. Acum, suprafețele lor cruste par să completeze, chiar să eclipseze ceea ce a fost Delta. + Reflecția mea în sângele negru al Gardianului nostru șoptește. Trebuie să îi salvez din acest iad. Lasă-i să doarmă. Închide-i în visurile clare pe care le-am văzut. + Lumina îmi dă dureri ochilor. El îmi spune că nu am nevoie de această carne vitreoasă în craniul meu pentru a vedea salvarea. O voi îndepărta cu plăcere. Voi opri această carne din a obstrucționa misiunea divină. + grade + Canal + Fără semnal + Legătura stabilită + K8 (UH8) + BULL (UH3) + TOPA (m-UH9) + QUALIA (RV2) + K8 (UH8)[br]Inteligență: Complexă AN-7U[br]Clasă: Ajutor Universal Ușor[br]Pilot la distanță: N/A[br][br]Notă[br]Deși K8 nu are un modul vocal, este capabil să comunice prin sunete și lumini simplificate. + BULL (UH3)[br]Inteligență: Complexă AN-5U[br]Clasă: Lucrător Mediu[br]Pilot la distanță: Susținut + TOPA (m-UH9)[br]Inteligență: Complexă AN-7U[br]Clasă: Mini UH[br]Pilot la distanță: N/A + QUALIA (RV2)[br]Inteligență: De bază A-2U[br]Clasă: Vezel de Cercetare[br]Pilot la distanță: Obligatoriu[br][br]Notă[br]Vezelul are doar inteligență de bază. Este necesar un pilot pentru a utiliza pe deplin echipamentele sale. + + + + Destinație: Theta + Distanță: %distm Adâncime: %depthm + + + + + Fișiere + Eroare + Înapoi + OK + Abandonează + Eroare de conexiune! + Se încarcă + Depanare + Se verifică sursa... + Cod eroare: 06FF0A12[br]Nu se poate conecta la mainframe[br][br]Vă rugăm să resetați routerul din seiful de sub-nivel sau să contactați întreținerea. + Se încarcă... + Încărcare completă! + Informații + Scanări + Încarcă + Opțiuni + Mediu + Modul + Informații simulare + Rulează + PROIECTOR SCANARE ACTIV[br]Introduceți un cip care conține date de scanare... + Slot 1: Cip + Slot 2: Cip + Se încarcă datele de scanare... + Se încarcă datele de mediu... + + Abilități: + Scanare încărcată: + Mediu: + Modul de suport: + LINDWALL, Sarah + BATCH 4[br]Tip: Neurograf Nakajima comprimat[br](timp continuu, 3ms)[br]Capturat: 7 iulie, 2103[br]Autor: Catherine Chun[br][br]SUBIECT[br]Nume: Sarah Lindwall[br]Sex: F[br]Naștere: 25 nov. 2074[br]Moarte: --, --[br]Naționalitate: Groenlandeză[br][br]OBSERVAȚII[br]A spus că va ajuta la livrarea ARK. + SARANG, Mark + BATCH 7[br]Tip: Neurograf Nakajima comprimat[br](timp continuu, 3ms)[br]Capturat: 12 iulie, 2103[br]Autor: Catherine Chun[br][br]SUBIECT[br]Nume: Mark Sarang[br]Sex: M[br]Naștere: 21 sept. 2061[br]Moarte: 12 iulie, 2103[br]Naționalitate: Coreean[br][br]OBSERVAȚII[br]S-a sinucis din cauza "Continuării"? Strohmeier este foarte supărat, a întărit securitatea. Proiectul ARK este suspendat. + WAN, Brandon + BATCH 24[br]Tip: Neurograf Nakajima comprimat[br](timp continuu, 3ms)[br]Capturat: 25 august, 2103[br]Autor: Catherine Chun[br][br]SUBIECT[br]Nume: Brandon Wan[br]Sex: M[br]Naștere: 16 oct. 2070[br]Moarte: --, --[br]Naționalitate: Chinez din Sichuan[br][br]OBSERVAȚII[br]Refugiat Delta, lucrător cu construcții. Acum lucrează pentru Strohmeier. + BASS, Robin + BATCH 25[br]Tip: Neurograf Nakajima comprimat[br](timp continuu, 3ms)[br]Capturat: 26 august, 2103[br]Autor: Catherine Chun[br][br]SUBIECT[br]Nume: Robin Bass[br]Sex: F[br]Naștere: 10 dec. 2072[br]Moarte: 26 august, 2103[br]Naționalitate: American din D.C.[br][br]OBSERVAȚII[br]Altă sinucidere din cauza "continuării". Strohmeier m-a blocat din laboratorul meu din nou! + KOMOREBI, Maggie + BATCH 14[br]Tip: Neurograf Nakajima comprimat[br](timp continuu, 3ms)[br]Capturat: 8 august, 2103[br]Autor: Catherine Chun[br][br]SUBIECT[br]Nume: Maggie Komorebi[br]Sex: F[br]Naștere: 4 ian. 2067[br]Moarte: --, --[br]Naționalitate: Chineză din H.K.[br][br]OBSERVAȚII[br]Ne semănăm atât de mult! Într-o altă viață sunt sigură că am fi cele mai bune prietene. + WOLCHEZK, Heather + BATCH 6[br]Tip: Neurograf Nakajima comprimat[br](timp continuu, 3ms)[br]Capturat: 10 iulie, 2103[br]Autor: Catherine Chun[br][br]SUBIECT[br]Nume: Heather Wolchezk[br]Sex: F[br]Naștere: 4 ian. 2063[br]Moarte: --, --[br]Naționalitate: Poloneză din Silezia[br][br]OBSERVAȚII[br]M-a ajutat să tai scurgerea de undă din cască. Dacă este ceva, ar trebui să facă "mahmureala" post-scanare mai puțin severă. + STRASKY, Peter + BATCH 12[br]Tip: Neurograf Nakajima comprimat[br](timp continuu, 3ms)[br]Capturat: 4 august, 2103[br]Autor: Catherine Chun[br][br]SUBIECT[br]Nume: Peter Strasky[br]Sex: M[br]Naștere: 11 mar. 2068[br]Moarte: --, --[br]Naționalitate: Englez din nord[br][br]OBSERVAȚII[br]Strasky a fost vesel și amuzant ca întotdeauna. + KOSTER, Alice + BATCH 23[br]Tip: Neurograf Nakajima comprimat[br](timp continuu, 3ms)[br]Capturat: 24 august, 2103[br]Autor: Catherine Chun[br][br]SUBIECT[br]Nume: Alice Koster[br]Sex: F[br]Naștere: 1 iun. 2069[br]Moarte: --, --[br]Naționalitate: Canadiană[br][br]OBSERVAȚII[br]A spus că va ajuta la construirea ARK-ului, dar nu îl va transporta până la Phi. + Nimic + Plajă + Cabana de schi + Camera de scanare + Nimic + Alice + Oprire + Oprire în curs... + Limita de stres a subiectului a fost depășită - oprire în curs! + Brandon,[br]Sunt într-o mare confuzie gândindu-mă la scanare. Toată lumea este atât de curajoasă. Toți zâmbesc, fără regrete. Știi cum ai spus că mă vei ține de mână în timpul scanării? Dacă oferta este valabilă, o accept cu recunoștință. Dacă o facem împreună, am putea suferi împreună și de mahmureala post-scanare. Se spune că durează câteva zile să ne recuperăm.[br]Săruturi, Alice. + Brandon Wan + THETA - CONTROLUL VIEȚII ȘI AL MEDIULUI (WAU)[br]================================[br]CLIMA: Funcțională[br] - Presiune: 11.2 psi [br] - Temperatura: 6°C [br] - Umiditate(RH): 62% [br]AER: Sănătos [br] - Procesor CO2: Activ 78% [br] - Amestecător de gaze: Activ 94% [br]APĂ: Conservată [br] - Purificatoare: Active 31%[br]GESTIONARE DE DEȘEURI: Deficitară [br] - Reciclare: Activă 2% [br] - Recuperare energie: 17% + Înregistrări Audio + READY + SISTEME ACTIVE + TESTE ÎN CURS... + TOATE SISTEMELE SUNT OK! + SE PREGĂTEȘTE ELIBERAREA... + GATA PENTRU ELIBERARE! + ELIBERARE ÎN CURS... + EȘEC CRITIC! + Local (34% liber) + Scanări + Imogen Reed + BATCH 9[br]Tip: Neurograf Nakajima comprimat[br](timp continuu, 3ms)[br]Capturat: 31 iulie, 2103[br]Autor: Catherine Chun[br][br]SUBIECT[br]Nume: Imogen Reed[br]Sex: F[br]Naștere: 4 mai, 2072[br]Moarte: --, --[br]Naționalitate: Equo-Americană + Guy Konrad + BATCH 30[br]Tip: Neurograf Nakajima comprimat[br](timp continuu, 3ms)[br]Capturat: 7 octombrie, 2103[br]Autor: Catherine Chun[br][br]SUBIECT[br]Nume: Guy Konrad[br]Sex: M[br]Naștere: 31 ian. 2062[br]Moarte: --, --[br]Naționalitate: Englez din nord + Medii de test + Rezervor cu apă + Rezervor de oțel umplut cu apă - Limitator senzorial + Cameră de scanare + Cu scaun pentru pilot - Continuare mai bună![br]Nu este necesar pentru ARK + Plajă + Test exterior agreabil - Aplicat în ARK + Versailles + Test interior agreabil - Excelent[br]Date reconstruite de WAU. Nu folosiți. + Chip (01% liber) + Chip (44% liber) + Chip (37% liber) + Scanări + Fișier binar.[br]Format necunoscut.[br]Fișier corupt sau compilat pentru un sistem diferit. + Javid Goya + Louise Meuron + Brandon Wan + Nicolai Ivashin + Maggie Komorebi + Nadine Masters + Peter Strasky + Alice Koster + Mediile + Plajă + Test exterior agreabil - Aplicat în ARK + Cabana de schi + Test interior agreabil - Aruncat + Cameră de scanare + Cameră de scanare Theta - Continuare mai bună.[br]Nu este necesar pentru ARK. + Post-Scan - 2 mai 2015 + Roadmap - 20 mai 2015 + Ultima înregistrare - 1 iunie 2015 + Se încarcă dispozitivul extern... + Transfer fișier + Transfer rețea + Copiază în [NIMIC] + Copiază în Chip + TRANSFERUL A FOST REFUZAT[br]Fișier restricționat. + Nu s-a detectat niciun dispozitiv extern! + Nu există suficient spațiu liber pe Chip. + TRANSFERUL A FOST REFUZAT[br]Date corupte. + Chip-ul conține deja acest fișier. + Se copiază datele în Chip... + 14 aug. 2103 + 25 aug. 2103 + 7 oct. 2103 + 15 ian. 2104 + Akers a acceptat în sfârșit să evacueze Delta. Goya, Krier și cu mine ne-am mutat astăzi în Theta. Akers a spus că va rămâne o perioadă mai lungă. Nebunul acela. Mă mândresc cu munca mea, dar, Dumnezeule, locul ăla este groaznic de când suprafața a încetat să mai trimită piese. + Am făcut scanarea ARK împreună cu Alice. Strohmeier mi-a spus că mahmureala mă va omorî practic. Ce idiot. La început am fost bine, dar după câteva ore am avut o durere de cap îngrozitoare. Cea mai mare durere a fost fata aia, Chun, este atât de incomodă tot timpul încât îmi face pielea să se încrețească. + Strohmeier a înnebunit și a oprit toate scanările viitoare pentru proiectul ARK. Se pare că Konrad voia să se implice în continuitate și s-a electrocutat chiar în scaunul pilot după scanare. Ceva îmi spune că vom primi noi cifre de securitate. + Tocmai am auzit că echipa de cercetare Komorebi va merge la Delta să-l ia pe Akers. A fost singur de luni de zile. Nu îmi pot imagina ce a făcut. + SCANARE LOG + PROGRAM + LOG SCAN ARK [2103][br]---------------[br][br]Chun, Catherine [4 Iul][br]Ivashkin, Nicolai [5 Iul][br]Hill, Jasper [6 Iul][br]Lindwall, Sarah [7 Iul][br]Pedersen, Ian [8 Iul][br]Wolchezk, Heather [10 Iul][br]Sarang, Mark [12 Iul] ((Sinucidere))[br][br]Proiectul ARK pe pauză, deoarece Strohmeier investighează moartea lui Sarang[br][br]Alvaro, Emma [29 Iul][br]Reed, Imogen [31 Iul][br]Meuron, Louise [1 Aug] ((Sinucidere))[br]Davis, Jessica [3 Aug][br]Strasky, Peter [4 Aug][br]Grau, Nathan [5 Aug] ((Sinucidere))[br]Komorebi, Maggie [8 Aug][br]Masters, Nadine [9 Aug][br]Hart, Vanessa [10 Aug][br]Fourqurean, Keith [11 Aug][br]Finley, Gavin [12 Aug] ((Sinucidere))[br]Rogers, Baxter [17 Aug][br]Josic, Chris [18 Aug][br]Goya, Javid [19 Aug][br]Krier, Astrid [20 Aug] ((Sinucidere))[br]Koster, Alice [24 Aug][br]Wan, Brandon [25 Aug][br]Bass, Robin [26 Aug] ((Sinucidere))[br][br]Strohmeier m-a mustrat - încă o moarte și suntem afară.[br][br]Cronstedt, Dorian [29 Aug][br]Fisher, Martin [30 Aug][br]Jonsdottir, Vigdis [31 Aug][br]Frost, Matthew [1 Sep][br]Konrad, Guy [2 Sep] ((Sinucidere))[br][br]Proiectul ARK pe pauză - pe termen nedefinit. + SCANĂRI PROGRAMATE[br]---------------[br][br]Defreine, Joaquin [Sep ?][br]Strohmeier, John [Sep ?][br]Thabo, Richard [Sep ?][br]Adams, Jane [Sep ?][br]Shankar, Aashish [Sep ?][br]Daviau, Marishika [Sep ?][br]Evans, Shawn [Sep ?] + + STRES + JURNAL + AR-CAPSULĂ + 6 Iunie, 2103 + 14 Iunie, 2103 + 21 Iunie, 2103 + 22 Iunie, 2103 + 3 Iulie, 2103 + 12 Iulie, 2103 + Imogen Reed a testat o mașină astăzi. Era evident coruptă de WAU, dar mai important este că a fost asamblată într-un mod aparent primitiv. Ca și cum cineva ar fi creat-o special pentru ca WAU să o fure. Când a fost activată, mașina a imitat camera și pe Reed împreună cu ea. La un moment dat a fost scanată și apoi încărcată ca o simulare în spațiul digital. Prezentarea a șocat-o pe Reed și a fost rapid oprită.[br]Mă sperie cât de mult îmi amintește de capsula mea AR. + După ce am disecat mașina "Vivarium" pe care Reed a activat-o, este clar că WAU a copiat proiectul meu de capsulă pentru a construi scena care să țină simularea lui Reed. Este de fapt foarte similară în construcție, cu o singură diferență. În timp ce capsula mea adăpostește oameni plat, construiți din neurograme de model, scanarea creierului Vivarium continuă să trăiască. Nu este limitată de conținutul său, din scanarea inițială a creierului lui Reed a ieșit. Reed din Vivarium era o copie perfectă. + Am găsit-o. Pot salva umanitatea. Pot construi o capsulă de realitate artificială care să adăpostească toți membrii Pathos-II. Nu pot înțelege cum a funcționat cu Vivarium, dar pot replica tehnica de scanare a WAU folosind scaunele Pilot. Ele sunt deja pregătite cu tipul de tamburi electromagnetici necesari. + A fost chiar mai ușor decât am crezut. Scaunele Pilot sunt deja setate pentru a permite difracția și energia mare necesare pentru a captura scanarea. Suspectez că WAU a folosit scaunul pentru a fura scanări de la noi de mult timp. Cred că asta explică Mockingbirds. WAU trebuie să fi furat scanări de la oameni folosind scaunul Pilot și le-a folosit ca bază pentru inteligența mașinilor. + Cu o reacție surprinzător de pozitivă din partea echipei, am început oficial proiectul ARK. Trebuie să scanăm toți oamenii pe care îi putem găsi și să-i încărcăm în capsulă. Apoi o vom lansa în spațiu folosind tunul spațial. Este frumos să te gândești că ceva va supraviețui astfel. + Mark Sarang s-a sinucis după scanarea sa. A sugerat tuturor să se sinucidă, deoarece într-un fel i-ar permite să ajungă la ARK. Nu sunt sigur cum ar funcționa asta. A declanșat multe discuții între personal și aparent este vina mea într-un fel. Strohmeier nu este mulțumit de mine. Sper să se liniștească. + Stare conexiune + Pregătire resetare + Timp de acțiune expirat în: + Resetare gata + EROARE REȚEA[br][br]Nu se poate conecta la mainframe[br][br]Vă rugăm să resetați routerul + Se pregătește resetarea routerului[br][br]VĂ RUGĂM SĂ AȘTEPTAȚI[br]Confirmare manuală necesară! + Comutați butonul pentru a confirma resetarea + ROUTER ACTIV[br][br]Mainframe: Online + Confirmați resetarea sistemului + Resetarea a expirat. Nu uitați să comutați butonul înapoi după finalizarea pregătirilor. + Pregătirile pentru resetare au fost anulate de utilizator. + + Starea site-ului + Harta + Personal + Starea site-ului + THETA[br]-----------------------[br]Toate sistemele funcționale[br][br]HULL[br] Substrat: Intact (aprox. 99%)[br] Armură: Intact (aprox. 84%)[br]SUPORT DE VIAȚĂ (WAU)[br] Aer = Curat (mediu)[br] Temperatura = 13°C[br] Presiune: 2.102 bar[br][br]Ultima diagnosticare: 2104 / 01 / 16 + Personal ( 2104 / 01 / 01 ) + THETA - Principal [br]-----------------------[br]ALVARO, Emma - Expert în Astrodinamică[br]BASS, Robin - Tehnician Service pe teren ((Decedat))[br]CHUN, Catherine - Inginer Sisteme Inteligență ((Dispărut))[br]CRONSTEDT, Dorian - Supervizor Administrativ ((Decedat))[br]DAVIS, Jessica - Inginer Structural ((Decedat))[br]DEFREINE, Joaquin - Tehnician Service pe teren[br]EVANS, Shawn - Tehnician Service pe teren[br]FISHER, Martin - Wrangler ((Decedat))[br]FOURQUREAN, Keith - Supraveghetor[br]FROST, Matthew - Expert Biomimetics[br]HILL, Jasper - Coordonator Software ((Dispărut))[br]IVASHKIN, Nicolai - Arhitect Sistem ((Dispărut))[br]KOMOREBI, Maggie - Prim răspunsător[br]KONRAD, Guy - Wrangler ((Decedat))[br]KOSTER, Alice - Manager Încărcătură[br]LINDWALL, Sarah - Tehnician Încărcătură ((Dispărut))[br]MASTERS, Nadine - Medic[br]PEDERSEN, Ian - Inginer Software ((Dispărut))[br]REED, Imogen - Inginer Mecatronică ((Dispărut))[br]SARANG, Mark - Analist Inteligență ((Decedat))[br]STRASKY, Peter - Dispatcher[br]STROHMEIER, John - Operativ Securitate[br]THABO, Richard - Inginer Mecatronică[br]WOLCHEZK, Heather - Inginer Servicii Site[br][br]OASPEȚI [br]-----------------------[br]ADAMS, Jane - Factor Șef - UPSILON[br]DAVIAU, Marishika - Wrangler - LAMBDA[br]FINLEY, Gavin - Tehnician F.S. - UPSILON ((Decedat))[br]GOYA, Javid - Wrangler - DELTA[br]GRAU, Nathan - Căpitan Port - LAMBDA ((Decedat))[br]HART, Vanessa - Dispatcher - LAMBDA[br]JONSDOTTIR, Vigdis - Dispatcher - UPSILON[br]JOSIC, Chris - LAMBDA[br]KRIER, Astrid - Tehnician F.S. - DELTA ((Decedat))[br]MEURON, Louise - Tehnician F.S.T. - UPSILON ((Decedat))[br]ROGERS, Baxter - Inginer Geotehnic - UPSILON[br]SHANKAR, Aashish - Wrangler - UPSILON[br]WAN, Brandon - Wrangler - DELTA + Harta Site-ului + Nivelul principal + Nivel -1 + Nivel -2 + + Șterge datele + Oprire + Șterge + Formatare cip în curs... + + Note + Richard mi-a dat un set de șabloane AI pe care nu le-am văzut înainte. Am desfăcut unul dintre ele pentru a face un nou prieten pentru Capsule Catherine și gașca ei de moșteniri.[br][br]Noua metodă de a simula turbulența face ca sistemul meteorologic să fie mult mai bun.[br][br]Am implementat-o pe Reed, nu a mers bine.[br][br]Nouă încercare cu Reed.[br][br]Reed nu se înțelege bine cu ceilalți. Este prea reală. + + Dragi prieteni,[br][br]Când veți citi asta, voi fi intrat în ARK. După cum am explicat, acest lucru se realizează prin încetarea vieții în timp ce scanarea ta este completată. Pentru a nu o speria pe Catherine, o voi face în secret, punând săruri de cianură în gumă de mestecat și plasând-o în gură înainte de a o întâlni. Când o voi auzi anunțând finalizarea, voi mușca, provocându-mi rapid sfârșitul.[br][br]Când veți descoperi adevărul din spatele morții mele, să știți că nu este nicio tragedie de plâns, pentru că sunt victorioasă. Vă sfătuiesc pe toți să faceți același lucru și să mă însoțiți în ARK.[br][br]Cu sinceritate,[br] Mark Sarang + + Natura Identității[br]Pavlina Martinu + Întrebări despre sine - Cine ești? Ce înseamnă să fii om? Corpul sau împrejurimile tale te limitează sau te definesc? Toate aceste idei sunt foarte greu de abordat fără ca întrebările tale să fie invalidate de partea practică sau mistificate de cei cu o viziune spirituală.[br]În această carte, Pavlina Martinu, profesoară de filosofie la Universitatea Charles din Praga, te ghidează prin istoria marilor gânditori și ce au avut de spus despre identitate. + + Oricum toți murim. Sunt toată în joc.[br]Mi-am pus încrederea în Sarang și continuitate. + Scanări Legacy + NanComp + THE NANAMI-COMPOSITION[br]Tip: Neurograf Nakajima comprimat (timp continuu, 21ms)[br]Capturat: 12 martie 2014[br]Autor: Nakajima Shin[br][br]SUBIECT[br]Nume: "Nanami"[br]Sex: F[br]Naștere: 11 decembrie 1997[br]Deces: 17 iulie 2021[br]Naționalitate: Japoneză + Berg + THE PACE FILES: BERG[br]Tip: Neurograf Nakajima comprimat (timp continuu, 6ms)[br]Capturat: 28 aprilie 2015[br]Autor: David Munshi[br][br]SUBIECT[br]Nume: Paul Berg[br]Sex: M[br]Naștere: 27 noiembrie 1984[br]Deces: 2 august 2069[br]Naționalitate: Canadiană + Munshi + THE PACE FILES: MUNSHI[br]Tip: Neurograf Nakajima comprimat (timp continuu, 4ms)[br]Capturat: 28 aprilie 2015[br]Autor: Paul Berg[br][br]SUBIECT[br]Nume: David Munshi[br]Sex: M[br]Naștere: 4 octombrie 1980[br]Deces: 23 mai 2078[br]Naționalitate: Canadiană + Jarrett + THE PACE FILES: SIMON JARRETT[br]Tip: Neurograf Nakajima comprimat (timp continuu, 5ms)[br]Capturat: 2 mai 2015[br]Autor: David Munshi[br][br]SUBIECT[br]Nume: Simon Jarrett[br]Sex: M[br]Naștere: 16 iulie 1988[br]Deces: 1 iunie 2015[br]Naționalitate: Canadiană + + Șterge Datele + Ștergere... + Indisponibil + + Se încarcă... + + Interior DUNBAT + + Cartagina[br][br]7 martie 2102[br][br]Mark Sarang[br]Analist de Informații[br]Theta[br]Pathos-II[br][br]Domnule Sarang, compania este foarte mulțumită să afle despre succesul dumneavoastră în a face ca WAU să devină o prezență la nivel de stație. Sperăm că apreciați ce oportunitate unică reprezintă acest lucru și că veți face tot ce vă stă în putere pentru a explora și înțelege pe deplin acest mister. Pentru a face acest lucru, trebuie să vă asigurați că Dr. Johan Ross poate dirija și studia WAU din Alpha fără interferențe externe. În caz de urgență, puteți ordona Juliei Dahl de la Omicron să elimine forțat orice opoziție, dar vă rugăm să depuneți un efort pentru a evita acțiuni extreme.[br]WAU este o chestiune importantă și costisitoare și sperăm să urmăm un dezvoltare constantă, fără obstacole.[br][br]Consiliul de Supraveghere + + + + Înapoi + DOCUMENTE + LOCALIZATOR ARK + Decizia mea + Am decis să finalizez ARK-ul cu scanările pe care le avem. Îmi pare rău pentru toți cei care au vrut să participe, dar nu au avut ocazia să se scaneze înainte ca proiectul să fie pus pe pauză. Au trecut două luni de când nu am mai adăugat o scanare și nu văd cum aș putea să recuperez sprijinul pe care l-ați arătat toți când am început proiectul. Îmi pare rău. Nu am vrut ca nimeni să își piardă viața. Nu a fost niciodată intenția mea să înșel pe cineva. Am vrut doar să salvez ceva.[br][br]Dr. Catherine Chun + Ce a mai rămas + *Aplicați modulul de interfață[br]*Sigilați capsula ARK[br]*Solicitați permisiune de la FourQ[br]*Informați-l pe Ivashkin, Lindwall, Pedersen și Hill[br]*Luați naveta către Omicron[br]*Ridicați costumele de protecție[br]*Călătoriți cu Climber-ul în abis[br]*Regrupați-vă la Tau[br]*Îndreptați-vă către locul de lansare[br]*Încărcați "glonțul"[br]*Lansați ARK + SONDAJ ATITUDINE ARK + Aplicație de examinare v 1.12 + SONDAJ ATITUDINE ARK[br]Pentru a evalua opinia personalului, vă rugăm să completați acest scurt sondaj. + Începe Examinarea + ÎNTREBARE + RĂSPUNSURI + Recent s-a decis ca proiectul ARK să devină ultimul angajament oficial al Pathos-II. Personalul a fost încurajat să își continue îndatoririle, în ciuda stării catastrofale a pământului.[br][br]Cred că proiectul ARK este pasul cel mai logic pentru salvarea omenirii și că ar trebui să investim tot timpul și resursele necesare pentru a-l finaliza. + Pentru a îmbarca pasagerii, fiecare trebuie să fie supus unei proceduri de electromagnetism folosind un scaun pilot. Aceste sesiuni de scanare sunt cunoscute pentru că provoacă greață și dureri de cap, uneori durând până la 3 zile.[br][br]Cred că disconfortul fizic temporar, oricât de sever ar fi, este un preț mic de plătit pentru a salva omenirea. + ARK-ul este construit pentru a acomoda o sondă Ranger Mk VII, ceea ce înseamnă că ar putea fi lansat în spațiu cu ajutorul armei spațiale Omega și ar putea supraviețui tehnic mii de ani, trăind din lumina soarelui nostru și a stelelor îndepărtate.[br][br]Cred că ARK-ul ar trebui să părăsească pământul și să fie lansat în spațiu. + Digitalizarea umanității reprezintă o oportunitate de a face un salt cuantic în evoluția noastră. Oamenii din ARK vor fi, din necesitate, generați din codul genetic existent, dar ar putea fi modificați pentru a permite schimbări cosmetice, pentru a încetini îmbătrânirea și chiar pentru a preveni moartea.[br][br]Cred că riscul de a ne pierde umanitatea este real dacă ne-am desființa bolile și mortalitatea. + Mai sunt doar 58 de oameni în viață care pot fi stocați în ARK. O modalitate de a diversifica și extinde populația ar fi să introducem inteligențe artificiale care să apară în toate felurile ca ființe umane, dar cu sensibilități de copil și naive. Pe măsură ce continuăm să explorăm natura inteligenței, am putea găsi o modalitate de a le face mai inteligente în viitor.[br][br]Cred că chiar și un grup inferior de oameni artificiali ar aduce beneficii societății noastre. + Sunt de acord foarte mult + Sunt de acord + Nu sunt de acord + Nu sunt deloc de acord + Se salvează + REZULTATE + Vă mulțumim pentru participare. Iată cum au votat colegii dumneavoastră: + -Aprobarea ARK-ului- + -Durere pentru câștig- + -Eternitatea printre stele- + -Evoluție artificială- + -Tovarăși inferiori- + Akers - 16 Ianuarie 2104 + TERRY AKERS[br]Vârstă: 66 Sex: M[br][br]Unul dintre cele mai grave cazuri pe care le-am văzut și cel mai probabil vina lui. S-a orbit și și-a blocat intestinele cu gel structural. M-aș mira să se trezească vreodată din comă.[br][br]M-a făcut să mă gândesc la povestea absurdă a lui Hart despre ce s-a întâmplat la Lambda. Poate chiar WAU poate schimba și reconstrui h_ + Hart - 20 Decembrie 2103 + VANESSA HART[br]Vârstă: 28 Sex: F[br][br]Hart pare să fie într-o stare bună, având în vedere circumstanțele. Doar vânătăi și hipotermie ușoară cauzată de plimbarea lungă. Este greu de corroborat povestea ei, deoarece este singura care s-a întors. + Chun - 1 Noiembrie 2103 + CATHERINE CHUN[br]Vârstă: 37 Sex: F[br][br]După cum ne-am obișnuit, Chun este tăcută și face tot posibilul să evite contactul vizual. Nu vrea să fie aici, dar Strohmeier cere o altă evaluare. Chun nu este încăpățânată sau necinstită, dar ar prefera să nu vorbească dacă poate evita asta. Îi este greu să relaționeze cu oamenii în general, inclusiv cu medicii. Catherine Chun este slabă în caracter, victima perfectă pentru a fi dominată și împinsă de alții. Este un șoricel speriat pe care nu vreau să-l supăr - așa că stăm liniștiți și trece timpul. + Konrad - 7 Octombrie 2103 + GUY KONRAD[br]Vârstă: 41 Sex: M[br][br]Konrad este mort. Și-a fiert creierul până la pulpă cu un W-Rem (maser) după scanarea neuro ARK. Clar un alt entuziast al "Continuității" care s-a sinucis pentru a-și lua locul pe ARK. + Mail trimis + Conectat ca[br][br]N.Masters[br][br]Inactiv de 113 zile + Conectat ca[br][br]N.Masters + Se trimite... + Trimise + Înregistrări jurnale + Rulează diagnostic + Meniu principal + Actualizează cipul de conexiune + Începe simularea + Pauză simulare + Resetează simularea + Anulează blocarea ușii + Jurnalele ofițerilor + Control cheie + Înregistrări de securitate + Șterge + OK + + Trimite + Cip de conexiune + Mesaje de securitate + [br][br]Alertă! Sala de conferințe - 22 Noiembrie 2103[br][br][br]Alertă! Stație navetă - 12 Decembrie 2103[br][br][br]Alertă! Zonă comună - 29 Decembrie 2103[br][br][br]Alertă! Hangar mașini - 11 Ianuarie 2104[br]Scurgere mare de gel structural a cauzat preluarea controlului de către WAU asupra DUNBAT-ului. S-a impus carantină pentru a evita o dezvoltare ulterioară. Ultimul lucru de care avem nevoie este o altă mașină vorbitoare.]]> + + ASAMBLARE PAYLOAD + LABORATOR MEDICAL + CAMERA DE EXAMINARE + SALA DE CONFERINȚE + CABINETUL DOCTORULUI + CARCASĂ + MANAGEMENT OMEGA + PAYLOAD + SECURITATE + DEPOZIT + + DEPOZIT + PAYLOAD[br][br]A. Koster[br]J. Hill[br]S. Lindwall + CARCASĂ[br][br]J. Davis[br]N. Ivashkin + MANAGEMENT OMEGA[br]I. Pedersen[br]M. Sarang[br]H. Wolchezk[br]C. Chun + CABINETUL DOCTORULUI[br][br]N. Masters + LABORATOR MEDICAL[br][br]M. Frost + SECURITATE[br][br]J. Strohmeier + SALA DE CONFERINȚE + CAMERA DE EXAMINARE + DISPECERAT[br][br]P. Strasky + EROARE SISTEM + + LABORATOR + MENTENANȚĂ + STAȚIE TRANSPORT + + MANAGEMENT OMEGA[br][br]I. Pedersen[br]M. Sarang[br]H. Wolchezk[br]C. Chun + + Ușa 42B, blocaj ridicat + Fără cip introdus + CIP PANOU (Conector)[br][br]Chei de securitate: 023-027[br]C819738-23[br][br]PERMISIUNE[br]Cifru standard Theta[br]SECOP-JSTROHMEIER + EROARE: CHEIA A EXPIRAT[br]Vă rugăm să actualizați... + CIP CONECTOR ACTUALIZAT[br]Cip gata pentru utilizare + Cip conector detectat! + Se încarcă + Se încarcă cipul conector... + Se actualizează cifrul de securitate... + Număr serial + Tip intrare: Înregistrare[br][br]Autor: Strohmeier, John[br][br]Subiect: Akers - Decizie finală[br][br]Importanță: Critică + Intrare recentă + Móduri disponibile + SISTEME + SCENE + OBIECTE + sys_fizica_rigidă + sys_fizica_mol + sys_fizica_fluida + sys_fizica_buoy + sys_wmod_atmo + sys_interfață_scan + sys_wmod_căldură + sys_wmod_lumină_dinamică + sys_gen_veg_basic + sys_gen_veg_avansat + scn_câmp_grâu + scn_pădure + pkg_soma_hum + stc_env_drum_pământ + ent_pk_1_bancă_v2 + ent_pk_barcă + env_mod_râu + ent_pk_1_scaun + stc_env_cabină_exterior + env_mod_lac + ent_foliage_sml + ext_soare_prânz + ext_lună_plină + ext_nori_dinamică + NULL + tip_sursă_lumină + tip_apă + tip_vegetatie + Stare + Nu au fost detectate erori! + REQ. + sim_base REQ. tip_soma + sim_base REQ. tip_scenă + CORUPȚIE MEMORIE DECTATĂ! + Vă rugăm să reduceți amprenta de memorie + MEMORIE + SCANĂRI + "Nanami" + Berg, Paul + Munshi, David + Jarrett, Simon + DUMMY + ÎNCĂRCARE + Simularea Vivarium + + + - + COMPILARE... + URMĂTORUL + Versiune scanare incompatibilă [V:LEGACY] + Aproape 43,75% (896TB) Memorie coruptă[br]Reconfigurare simulare necesară... + ARK BUILD NR. 34124 + COMPILAT: C.CHUN, THETA + VERIFICARE MEMORIE: + TB + EROARE MEMORIE SISTEM + DETECTARE STOCARE... + /dev/sda1 montat + mount -o loop,encryption=aes arkALPHA3.img /media/main + Decriptare volum.... + Pornire ARK alpha v3 + NU SUNT CONECTATE DISPOZITIVE + EXECUTĂ DIAGNOSTIC + MODUL ÎNCĂRCAT + TIMPUL LUMII + ARK Alpha v3 + ALLOCAREA RESURSELOR + VERIFICAREA INTEGRITĂȚII NEUROSCAN + + EROARE DE SECURITATE[br][br]CHEIA A EXPIRAT - ACTUALIZAȚI CIPUL + CHEIA A FOST ACCEPTATĂ[br][br]ÎNCHIDEȚI CLEMELE ȘI PANOURILE + EROARE DE SECURITATE[br][br]INTRODUCEȚI CIPUL CONECTOR + Pregătiți ARK cu transmisorul de semnal + Pachete de energie[br]Unelte (FST-Kit)[br]Oxigen suplimentar[br]Permisiuni P-II + 1. Shuttle către Omicron. + 2. Schimbați la HPS. Călătoriți cu Climberul în abis. + 3. Verificați pe Tau - mai trăiește cineva? + 4. Accesați tunelul către Phi - Lansați ARK! + Nu vă apropiați de ventilatoare + Poate ne aude[br]Vibrații? + Nu sunt permise contaminante străine dincolo de acest punct + Cameră curată[br]Costume de cameră curată, ochelari și măști sunt obligatorii! + Suprafața Theta[br]Laborator[br]Mentenață[br]Stația Shuttle + + + CORTEX Carthage MK II + BLACKBOX Buffer Personal v4 + Citire buffer... + Semnătură Theta + SURSA DE ENERGIE[br]Energy Pal S3 + COMPOUND Costum Ductil de Bază + COMPOUND Gel Structural + FEMELĂ[br]REED,[br]Imogen + + OFFLINE + GATA + + + BRANDON[br]WAN + + SUFERINȚA CELUI MAI PUTERNIC + + + Conectivitate remarcabilă (lucru de tip patch neural) + Consum de gel (Akers) + Ne vedem la parter[br]la shuttle + Inițial reconstructiv[br]Creștere nenaturală[br]Încercări simbiotice + + + + + + DEFECȚIUNE DE ENERGIE[br][br]Reîncărcați bateria de serviciu + UȘĂ DE SECURITATE[br]DEBLUATĂ + + + + OK + Anulare + Eroare + Succes + Cod invalid! + Înapoi + DEFECȚIUNE DE ENERGIE + Intrări + + Buffer Radio + Omicron + 2104-01-16 + CARAȚINĂ + Accesibil + Radio / LUMAR + Control ACR la distanță + Status Blackbox + Hartă Blackbox + Actualizări Sistem + + Timestamp: 2098-10-09[br]User: WOLCHEZK[br][br]Note: Actualizare permite Blackboxes. Fail-safe CRTH4 (Carthage) implementat. + Timestamp: 2099-07-11[br]User: GOLASKI[br][br]Note: Extensie standard x4B (Haimatsu) + Timestamp: 2099-08-05[br]User: GOLASKI[br][br]Note: Calibrator de zonă pentru ACR. + Timestamp: 2103-01-14[br]User: GOLASKI[br][br]Note: Unelte de diagnostic pentru planul de contingență post-impact. + Temp_Validate =? =?[br]Apasă () = U U 78_WAUx77 + Timestamp: 2103-12-20[br]User: SORVARI[br][br]Note: Lucruri necesare pentru a pune macaraua înapoi în funcțiune. Totul depinde acum de Alan. + Timestamp: 2104-01-06[br]User: SORVARI[br][br]Note: Actualizare de securitate inutilă pentru șobolanii de laborator paranoici. Oamenii morți nu mușcă. + 2098-10-09 + 2099-07-11 + 2099-08-05 + 2103-01-14 + + 2103-12-20 + 2104-01-07 + Deschide + Închide + Status + UbVZrmsP + Carantină - Imposibil de deschis ușa. + DEFECȚIUNE MECANICĂ[br][br]Folosiți intrarea alternativă + [Carantină Omicron[br]Inițiat: 2104-01-16[br]Cod de urgență: N/A] + [Carantina Omicron ridicată] + Carantina Omicron ridicată + GATA + UMPLERE + SPĂLARE + FINALIZAT + Specii + Populație + 0 + Diagnostic nereușit (E:116C)[br]Numărul populației nesigur + Tarpon Atlantic + (Megalops atlanticus) + Scad cu puncte + (Caranx rhonchus) + Cobia + (Rachycentron canadum) + Stea de mare atlantică + (Uranoscopus scaber) + Tigru de nisip cu ochi mari + (Odontaspis noronhai) + Ilisha africana + (Ilisha africana) + Rudderfish + (Centrolophus niger) + Moray polygonal + (Gymnothorax polygonius) + Hering Atlantic + (Clupea harengus) + Leerfish + (Lichia amia) + Înainte de spălare, asigurați-vă că deschideți supapele și porniți pompa! + Mesaj transmis[br]De la: J. Strohmeier[br][br]Adam Golaski este ordonat să vină la Theta cât mai curând posibil. Urgent! + Gask, am încercat să aflu despre ce este vorba, dar nu mi-au spus nimic. Tot ce știu este că au întrebat dacă ești dispărut sau mort. Ceva i-a speriat. Cred că ar trebui să faci ceea ce îți spun.[br][br]Herbie + + + + + gel de structură + configurare: placă de circuit împărțită, microbaterie + mai puțin decât ideal + ... la Theta + ... șoc sistemic (Moarte) + verificați rezultatele anterioare + circuit imitat + testați formula + + BINE AȚI VENIT LA SITE-UL OMICRON[br] - Facilități de cercetare medicală[br] - Maricultură avansată[br] - Acasă pentru ACR (Abyss Climber Rig)[br][br]Vă dorim un sejur plăcut! + + 2104-01-16 - Ieșire: Theta + 2103-12-25 - Intrare: ACR + 2103-12-11 - Ieșire: Tau + 2103-12-28 - Ieșire: Tau + 2103-12-28 - Ieșire: Phi + ????-??-?? - Transmisie către Phi + + Informații ACR + ACR "The Climber"[br]A2088[br][br]Lungime cablu: 4019m[br]Personal: 6[br]Mărfuri: 1500kg + Stare ACR + Poziție: Omicron[br]Ultima utilizare: 135 zile (Serviciul A5)[br]Operator: Waldeck, Alan[br]Stare: Gata + Jurnal de utilizare + 2103-08-03[br]Operator: Alan[br]Tip: Descent[br]Verificare bi-săptămânală - Lansky și Holland au coborât.[br][br]2103-08-03[br]Operator: Alan[br]Tip: Ascent[br]Verificare bi-săptămânală - Lansky și Holland s-au întors, au dat semnalul pozitiv.[br][br]2103-09-13[br]Operator: Sorvari[br]Tip: Descent[br]Evacuare TAU - Dahl și Waldeck au fost asignați pentru a evacua pe toată lumea din Tau.[br][br]2103-09-13[br]Operator: Sorvari[br]Tip: Ascent[br]Evacuare TAU - Dahl și Waldeck s-au întors singuri. Evacuarea a eșuat.[br][br]2103-11-05[br]Operator: Alan[br]Tip: Descent[br]Evans și Defreine din Theta au coborât în zona de miez pentru a repara sondă LUMAR defectă.[br][br]2013-11-05[br]Operator: Alan[br]Tip: Ascent[br]Evans și Defreine s-au întors cu un pește mare care semăna cu un demon. Eames m-a făcut să-l aduc în Omicron.[br][br]2103-12-25[br]Operator: Alan[br]Tip: Descent[br]Catherine Chun și prietenii ei transportă mașina ARK către pușca spatială.[br][br]2103-12-27[br]Operator: Alan[br]Tip: Ascent[br]Am ridicat liftul înapoi astăzi conform programului. Mă așteptam ca Chun și gașca să apară, dar am găsit un bărbat mort în cușcă. M-a speriat groaznic. + + CITITOR JURNAL + ROUGHY + ROUGHY[br]Jacob Halperin[br][br]Un Roughy Orange neobișnuit de sedat a fost găsit plutind în afacerea substației Omicron. Avea o creștere remarcabilă de os care părea să interfereze cu percepția sa. L-am adus înăuntru pentru a-l studia, dar s-a înțepenit și a murit în proces. În timpul studiului postmortem, creatura a revenit la viață în afacerea apei. A continuat să se miște câteva minute, așa că l-am returnat într-un acvariu. A început instantaneu să lovească sticla și s-a lovit de moarte înainte să pot să-l mut. + SHELLEY + SHELLEY - Decedată la sosire[br]Claudia Eames[br][br]Darby și Waldeck au identificat-o ca fiind cea care sabota sonda LUMAR la aproximativ 900 de metri adâncime. Este un Rudderfish de 150 cm lungime care arată ca și cum s-ar fi fuzionat cu alt tip de pește sau rechin. Este cea mai ciudată formă de mutație pe care am văzut-o până acum. Este clar că situația se agravează. Ceva cauzează asta și nu cred nimic din ce spune Orvari despre fallout-ul radioactiv. + JOHAN ROSS + JOHAN ROSS - Decedat la sosire[br]Claudia Eames[br][br]Bărbatul mort găsit dimineața aceasta pe Climber a fost identificat ca fiind Johan Ross, psihologul A.I. care lucra la Tau. Nici măcar nu pot să încep să îmi imaginez ce s-a întâmplat în abis și, sincer, nu vreau să risc să pierd personalul trimițându-i acolo. Dacă echipa ARK este vie, ceea ce am mari dubii, va trebui să găsească o cale să ne dea un semn. Nu vom coborî din nou acolo fără un motiv bine întemeiat. + + ENERGY PAL + ENERGY PAL S3[br][br]Pachete de litiu-sulfur reîncărcabile de înaltă performanță - 515Wh[br][br]Conector standard S3 Haimatsu pentru unelte de mașină, X0-rigs și costume de putere. Când sunt descărcate, reîncărcați pachetul într-un Haimatsu Charge N5 sau alt încărcător compatibil S3. + + SALVEAZĂ-ȚI VIAȚA + IA TOATE + IA OTRAVA + NU EXISTĂ ÎNTOARCERE + FUGI PENTRU VIAȚA TA + + BLOCARE GLOBALĂ ACTIVĂ[br]ANULARE LA CONSOLE CAMERĂ DIVE + BLOCARE OMICRON + Blocarea locală a fost ridicată + Îndepărtarea blocării + Rute de alimentare manuale + Eroare la îndepărtarea blocării + Așteptați diagnosticul + Defecțiune localizată - F3 - Camera de putere + CAUZĂ: Suprasarcină sistemică + + DIAGNOSTIC + Localizare defecțiune + + SE ÎNCARCĂ + Lansarea utilitarului de rute + + Reîncercați + Meniu Principal + Resetați secvența + Prezentare generală stație + Anulare + + Inferior + Secțiune mijlocie + Superior + + Floarea selectată este incorectă + + Introduceți pachetul de energie pentru a încărca + Puterea nu este rutată corect. Rutați la ZONA 3 + Ușa unității de încărcare nu este sigilată + Încărcare pachet + Se încarcă + Pachetul este complet încărcat. Îndepărtați când sunteți gata. + + DESCHIDE/Închide + EROARE[br][br]Cip de control[br]Defecțiune[br][br]Servicii necesare + STARE[br][br]Temp: -20C[br]Gel necalibrat + + CELULĂ 1 + CELULĂ 2 + CELULĂ 3 + + Conectivitate + Lisa Cameron[br]2103-03-23[br][br]Gelul de structură a fost încărcat și continuă să funcționeze o perioadă chiar și după ce este îndepărtat de la sursa de energie. Dacă este aplicat pe circuite, pare să ajute la conectivitate. + Funcționalitate + Lisa Cameron[br]2103-03-25[br][br]Se pare că nu este vorba doar de conectivitate, ci chiar și de funcționalitate. Gelul poate face mașinării simple să funcționeze și să acționeze mai eficient. Cu toate acestea, modificările pe care WAU le-a făcut asupra gelului sunt pline de informații suplimentare care nu au sens neapărat - atunci când este aplicat pe ceva mai complicat, gelul acționează ca o tumoare asupra gazdei, distrugând-o treptat. Am putea folosi gelul în avantajul nostru, dar trebuie să fie necalibrat pentru a elimina codul defect. + Patologie + Jacob Halperin[br]2103-05-07[br][br]Am aplicat gelul pe un șoarece mort. Gelul a făcut ca șoarecele să pară viu. A fost pus în același habitat cu un șoarece viu. Șoarecele reanimat era apatic, în timp ce șoarecele viu părea stresat. După 15 minute, șoarecele reanimat a atacat și a ucis șoarecele viu. După o jumătate de oră, șoarecele reanimat a încetat să se miște. Corpul a devenit solid pe măsură ce gelul s-a întărit în interiorul său. + Progres + Jacob Halperin[br]2103-07-09[br][br]Am reanimat un alt șoarece cu gel de structură. De data aceasta, gelul a fost necalibrat, așa cum a fost produs de Eames. Rezultatele au fost impresionante. Creatura pare catatonică, dar este mai mult un somnambul. Pentru a evita întărirea acestuia ca înainte, au fost folosite electromagneți pentru a produce un curent electric slab în animal. Acest lucru ne-a oferit și posibilitatea de a o controla parțial. + Analiză chimică + Paula Lansky[br]2103-12-12[br][br]Gelul de structură rămâne neschimbat la nivel fundamental. Este încă același gel reticulat cu grafen aliniat într-o matrice polinesaturată, care a fost instalat în Pathos-II acum câțiva ani. Problema nu este gelul, ci controlerul său, WAU. Gelul nu a dobândit noi proprietăți. WAU îl folosește în moduri în care noi nu ne-am fi gândit vreodată. + Rezultate studiu + Claudia Eames[br]2103-12-19[br][br]Dovezi copleșitoare concluzionează că toate creaturile deformate, peștii, rechinii și chiar ajutoarele, au fost manipulate de WAU prin gelul de structură. Acestea au fost expuse într-un mod sau altul la gel încărcat și, la rândul lor, au fost lovite de creșteri canceroase care le afectează întreaga ființă. Este greu să întrebi de ce atunci când vorbești despre o inteligență artificială, dar totul a început la scurt timp după ce cometă a distrus suprafața. Nu pot spune cu siguranță dacă este vorba de un cod defectuos sau de o moarte programată cu milă, dar se pare că nu ne va face lucrurile mai ușoare pentru a supraviețui. + + HPS - Informații + Un costum de putere pentru presiune înaltă garantat pentru a rezista temperaturilor între 50°C și -75°C, menținând o temperatură constantă de 40°C (implicită) în interior. Costumul va proteja automat purtătorul de presiune și va menține 1 ATM normal până la o adâncime de 5000m. Controlerul de la bord monitorizează starea fizică a purtătorului și este capabil să minimizeze riscul de șoc, hiperventilație și chiar deshidratare. + HPS - Utilizare + Costumul se asamblează ușor prin inele rotative la gât și la încheieturi care fixează mănușile și casca în loc. Rețineți că articulațiile nu se vor sigila decât dacă Controlerul poate identifica un purtător printr-un set de sisteme senzoriale. Costume pot fi atribuite personalului specific, dar implicit costumul va accepta pe oricine. + HPS - Controler + Controlerul este computerul de bord care monitorizează pulsul, activitatea cerebrală, temperatura corpului și stresul prin conductivitatea pielii. Folosește aceste informații pentru a oferi purtătorului cea mai sigură experiență. + + Introduceți numărul de serie + + Inițializare Costum de Putere + Răspuns galvanic al pielii + Sursă de energie + Activitate corticală + Temperatura corpului + EȘEC + OK + NU S-A PUTUT ACTIVA COSTUMUL DE PUTERE + EROARE LA COSTUM, ATENȚIE NECESARĂ + Pregătirea diagnosticelor + + Haimatsu Power Suit + Urmărire HPS + Activare HPS + Reformatare + Acceptă + Anulează + Copiază imaginea + Test circuit + Verificare RAM + Test stocare + Rulează mai multe diagnostice + POD A + POD B + POD C + POD D + POD E + POD F + EROARE: Costum de putere lipsă + Unitate AI neidentificată de cititor + Spațiu insuficient + Spațiu insuficient pentru imagine + Spațiu insuficient pentru FS + Sistem de fișiere + Se încarcă + Se încarcă + Se copiază imaginea + Pregătirea sistemului de fișiere + Se rulează diagnosticul + Diagnostic complet + Este sigur să eliminați unitatea AI + Configurare parametri + FRECVENȚĂ + DEVIERE + AMPLITUDINE + 1024 LE + 2048 LE + 1024 BE + 2048 BE + 4D5A + D54B + 5D4F + 5D4E + - + + + Pachet S + Pachet D + Furtun continuu + Furtun co-dependent + Linear + Pseudo aleatoriu + Blocare parametri + Link stabilit.[br]Pregătit pentru transfer. + EROARE: Neconcordanță semnal + Link la distanță activ + Execută: drenaj_baterie + STATUS:[br] Link activ[br] Toate sistemele sunt OK + STATUS:[br] Link activ[br] Atenție: Defecțiune baterie! + + COMUNICAȚII + MOTOR + OPTICĂ + + EJECTARE + CIP CORTEX + DIAGNOSTICE + + Asamblare Cortex eliminată.[br]Fără semnal la gazdă + + Fișiere + _root (12% liber) + Robotică + K8(UH8) + Înălțime: 42cm[br]Greutate: 2.1kg[br]Viteză maximă: 15m/s[br]Senzori: 33[br]Poate fi echipat cu mai multe unelte, inclusiv, flacără, cheie auto și extensii de releu. + Bull(UH3) + Înălțime: 115cm[br]Greutate: 90kg[br]Viteză maximă: 12m/s[br]Senzori: 14[br]Echipat cu două brațe omnidirecționale cu precizie supraomenească. În combinație cu motorul vortex, această unitate poate transporta 2 tone metrice de greutate. + Zeppelin(Z-PL1n) + Înălțime: 740cm[br]Greutate: 2500kg[br]Viteză maximă: 4m/s[br]Senzori: 3[br]Echipat cu 2 camere video 4K pentru inspecție și monitorizare continuă. Echipamentele sale sunt complet autonome și includ o gamă largă de scule pentru întreținerea platformelor. + Aquarius(A-Q2) + Înălțime: 28cm[br]Greutate: 2.2kg[br]Viteză maximă: 8m/s[br]Senzori: 5[br]Echipat cu senzori avansați pentru detectarea mediului și monitorizarea în timp real a gazdei. + Gustav(U9) + Înălțime: 185cm[br]Greutate: 148kg[br]Viteză maximă: 14m/s[br]Senzori: 11[br]Un robot cu brațe omnidirecționale, capabil de interacțiuni precise și calculări avansate în timpul manipulării materialelor delicate. + + Raport Neexpediat #1 + Raport Neexpediat #2 + Raport Neexpediat #3 + Evacuare TAU + Pe 13 septembrie, Vic Auclair a ordonat personalului de la Tau să evacueze și să se deplaseze pe platou. Împreună cu inginerul Alan Waldeck, am coborât în abis pentru a ajuta evacuarea. Urmând protocolul, am așteptat pe platforma Climber timp de 140 de minute și am făcut mai multe încercări de a contacta Tau. Am decis să mă îndrept spre locul respectiv, gândindu-mă că aș putea să-i interceptez. Atunci am observat luminile de ghidaj clipind și curând întreaga cale s-a stins – Sectorul Omega a fost înghițit de întuneric. Am continuat cu farul meu până când am auzit țipete pe radio-ul de mică rază. Sunetul a continuat, întrerupt din când în când. Pe măsură ce mă grăbeam să mă apropii pentru a investiga, am dat peste corpul mutilat al lucrătorului pe câmp Espinosa – ceva mare aproape că o tăiase în două. Am considerat importanța salvării Tau și mai ales a lui Ross, întrucât auzeam colegii lui Espinosa masacrați la radio. Văzând că nu există vreo modalitate de a îmbunătăți situația, m-am grăbit să mă întorc la Climber și am lăsat oamenii de la Tau în fața soartei lor. + TAU (Note Carth.) + Cu ceva noroc, Ross a reușit să se întoarcă la Tau și poate să-și continue munca la Alpha. Pentru a evita noi perturbări, am decis să raportez evacuarea ca un eșec complet, sperând că aceasta va opri Theta să încerce o altă evacuare. Claudia Eames, managerul de la Omicron, a ordonat deja Climber-ului să rămână pe platou pentru moment. Raportul meu despre fauna sălbatică sălbatică i-a speriat pe toți suficient pentru a opri chiar și pe Waldeck și Darby să întrețină sondele LUMAR. E un lucru bun că Golaski nu este pe site, pentru că am un sentiment că nu ar fi fost de acord.[br]Restricțiile au ieșit puțin mai severe decât mă așteptam, dar mă voi descurca. Atâta timp cât Ross rămâne lăsat în pace să lucreze cu WAU. + CARTHAGE + Julia Dahl[br]Johan Ross[br]Mark Sarang + + Celulă nesigură. Vă rugăm să închideți sertarul și să încercați din nou. + EROARE + + + CALIBRARE COMPLETĂ + CALIBRARE ÎN CURS... + + Listă de verificare a echipei ARK + Satisfacție testate și pregătite[br][Jasper confirmă][br][br]Scanările Omicron sunt în ARK[br][Catherine confirmă][br][br]Echipament încărcat și rații suplimentare[br][Ivashkin confirmă][br][br]Climber calibrat pentru greutate[br][Alan confirmă][br][br]Operatorul de macara este pregătit[br][Alan confirmă][br][br]Omicron în așteptare pentru ridicare în două zile[br][Eames confirmă] + + Raleigh Herber + Dispecer (Omicron) + + Trebuie să oprim asta + Oprește WAU + Ia virusul + Distruge WAU + Suferim + Un coșmar etern + Ia gelul + Ascultă-mă + + Inima Alpha! + Este bolnav + Alpha are nevoie de medicamente + Omicron + Tau + Alpha? + Phi + ÎN ABIS, IA-LA LA ALPHA ÎN ABIS + GĂSEȘTE TAU GĂSEȘTE ALPHA IA GELUL LA ALPHA + + + + + ACR + Coboară + Urcă + Oprește + Pasageri + 1 + 2 + 3 + 4 + 5 + 6 + ADÂNCIME: %fm + PRESIUNE: %fatm + VITEZĂ: %fm/s + Contact sondă + Distanță: %fm + Zona iluminată + (Epipelagică : 0m - 200m) + :: Bogată în lumină și oxigen[br]:: Platoul principal Pathos-II + Zona de amurg + (Mesopelagică : 200m - 1000m) + :: Lumină slabă, lipsă de oxigen[br]:: Fără locații permanente + Zona de miezul nopții + (Bathypelagică : 1000m - 3000m) + :: Întuneric perpetuu[br]:: Fără locații permanente + Abisul + (Abyssopelagică : 3000m - 6000m) + :: Creasta Atlanticului se nivelizează[br]:: Locațiile Phi și Tau + Lumea adâncă + (Hadalpelagică : 6000m - 11000m) + + + EROARE[br]Link LUMAR necesar pentru a apela Climber + Se apropie + Am ancorat + Pericol![br]Zona nesigură[br]Rămâi aproape de lumini. + Prezentare generală ACR Landing + Platforma ACR + Cabina de operare + Depozit + Releu de alimentare + Stație de service + Tau + Comutator principal[br]6600 V + Jurnal ACR + Autentificare + Jurnal ACR + 2103-08-03 ARR + 2103-08-03 DEP + 2103-09-13 ARR + 2103-09-13 DEP + 2103-12-26 ARR + 2103-12-28 DEP + 2103-08-03 @ 11:23:54 ARR[br]SEMNEAZĂ: Julia Dahl | Richard Holland[br] * Colectare de mostre[br] * Verificări fizice + 2103-08-03 @ 18:02:28 DEP[br]SEMNEAZĂ: Julia Dahl | Richard Holland[br] * Verificare + 2103-09-13 @ 11:31:51 ARR[br]SEMNEAZĂ: Alan Waldeck | Julia Dahl[br] * Evacuare Tau + 2103-09-13 @ 14:27:10 DEP[br]SEMNEAZĂ: Alan Waldeck | Julia Dahl[br] * Eșuat + 2103-12-26 @ 14:01:08 ARR[br]SEMNEAZĂ: Catherine Chun | Ian Pedersen | Sarah Lindwall | Nicolai Ivashkin | Jasper Hill[br] * Transportarea ARK către Phi + 2103-12-27 @ 08:00:00 DEP[br]SEMNEAZĂ: Alan Waldeck (de la distanță) + Inventar + Jurnale misiune + Statistici + Jurnale misiune + Observația #134 + Observația #172 + Observația #188 + 2103-01-07 :: Observația #134[br]CONFIGURARE[br]Momeală: Calmar uscat (1 kg), 60 bucăți Anema LAL[br]Camere: Quad HDR, lumină scăzută[br][br]REZULTATE[br]Țintă: Rechin cu branhii (150 cm)[br]Descriere:[br]Rechin rar s-a apropiat de momeala luminoasă.[br]A făcut cercuri pentru a mânca calmarul uscat.[br]Puțin probabil ca acesta să frecventeze această adâncime. O anomalie.[br]/S.Glasser + 2103-07-14 :: Observația #172[br]CONFIGURARE[br]Momeală: LBT(L) - Marlin albastru Atlantic (42 kg), 40 bucăți Anema RAL[br]Camere: Quad HDR, lumină medie[br][br]REZULTATE[br]Țintă: Calmar uriaș (1200 cm)[br]Descriere:[br]Mantaua de dimensiunea unui om, 170 - 200 cm.[br]Lungimea estimată a întregii ființe: 10 - 12 metri.[br]Atacul frenetic a sfâșiat marlinul. Imediat ce am aprins luminile, a fugit rapid din zonă. Clar un alt specimen afectat de gelul structural care se scurge.[br]Parțial acoperit cu solzi și cu o structură osoasă nou-formata ieșind din manta.[br]/S.Glasser + 2103-09-01 :: Observația #188[br]CONFIGURARE[br]Momeală: LBT(L) - 15 bucăți Anema LAL, 25 bucăți Anema RAL[br]Camere: Quad HDR, lumină medie, ISO vectorizat[br][br]REZULTATE[br]Țintă: Necunoscut (40 cm)[br]Descriere:[br]Creaturile deformate de gel sunt maniacale și vor ataca orice. În continuare greu de determinat cum WAU a afectat comportamentul lor dincolo de agresivitatea aparentă și afinitatea cu lumina. Creaturile par să vâneze ceva anume, ceva ce nu este prezent în acest ecosistem.[br]/S.Glasser + Inventar[br]==================[br]Momeală artificială luminoasă Anema, 120 bucăți[br]Momeală artificială reflectorizantă Anema, 80 bucăți[br]Calmar uscat, 0 kg[br]Fulgi de pește, 0 kg[br]Minnows înghețați, 0 kg[br]Juipo, 0 kg[br]Extract de ciupercă, 0 bucăți[br]Stoc de plankton, 0 bucăți[br]Cassava pudră, 0 kg[br]Ouă pudră, 0 kg[br]Rezervor momeală vie (mare), gol[br]Rezervor momeală vie (mic), gol[br]Rezervor momeală vie (mic), gol + Statistici + Articol #1 + Articol #2 + Articol #3 + Balena cu cocoașă + Megaptera novaeangliae + Calmar + Loligo vulgaris + Pește lingură + Centrophryne spinulosa + 2101 + 2102 + 2103 + 2104 + 2105 + + Observator + Tau + ACR Landing + Retragere + Nu se poate recupera datele + Control + Status + (Beacon Offline) + + Putere insuficientă + + Pericol![br]Rămâi aproape de lumini[br]Albastru duce la TAU[br]Roșu duce la Climber + + + + + Închis dintr-un motiv întemeiat. Ține minte acest lucru în timp ce configurezi de la distanță încuietorile. + ALIMENTE[br]Aho-Agua[br]Cafea[br]Carne uscată[br]Suc[br]Miso[br]Nori[br]NutraSub[br]Lapte praf[br]Mese de tip shaker[br]Ceai[br][br]Calamar uscat[br]Mărunțișuri[br]Pastă de reparat[br]Intravenos? + NOTE POST-IMPACT[br]12 ian: Daune structurale minore, radioul a căzut[br]17 ian: Comunicațiile au fost restaurate - Omicron și restul Pathos-II sunt în regulă![br]3 apr: Radioul între locații nu funcționează, sondelor LUMAR le pierd semnalul.[br]Fix urgent necesar: Tau nu poate prelua Climber până nu se restabilește conexiunea![br]11 apr: Vizită SSE Wolchezk, Dahl și Holland. S-a stabilit un sistem de vizite bilunare până la restabilirea comunicatiilor (LUMAR) la 100%.[br]13 sep: Evacuare din Tau. Plecăm toți spre Omicron.[br]15 sep: Atacați de monștri și fără radio - suntem în rahat. + Am crezut că am auzit ieri vocea lui Sendeyo la radio. Groaznic. E mai mort decât mort.[br]Ross spune că suntem deprimați. Mare surpriză. Doctorul Johan Ross, se comportă profesional, dar îl văd cum se schimbă. Crede că totul e o prostie. Că suntem nimic. Că totul e fără sens. Dacă vezi asta, du-te dracului Ross! + Promit să păstrez ARK-ul în siguranță cu orice preț. Să curăț tot gelul de structură pe care-l văd. Să-l păstrez în siguranță. Să-l țin departe de mâinile WAU.[br][br]Aucliar[br]Espinosa[br]Hill[br]Pedersen[br]Lindwall[br]Ivashkin + ÎNCĂRCARE... + EROARE![br][br]NIVELURI DE PUTERE INSTABILE + DESCHIS + AVERTISMENT RADIATIV! + BLOCAȚI LA DISTANȚĂ + DEBLOCAT + ÎN CURS DE CLĂTIRE... + EROARE! + AȘTEPTĂM CARGO... + CARGO ATASAT + NU S-AU DETECTAT CARGO! + UMPLEM CAMERA DE DEPRESURIZARE + DEFECȚIUNE MECANISM DE INUNDARE! + SECVENȚĂ OPRITĂ![br]IMPOSIBIL DE ECHILIBRAT PRESIUNEA! + DIFERENȚĂ DE PRESIUNE + ÎN AFARĂ + ÎN INTERIOR + INACTIV + ÎNCHIDERE UȘĂ + DESCHIDERE UȘĂ + GOLIRE CAMERA DE DEPRESURIZARE + STARE + CARGO + ID: ARK001[br]TIP: ÎNCĂRCAȚI[br]GREUTATE: 20kg[br][br]UTILIZATOR: CCHUN + CONFIGURAȚIE + ATAȘEAZĂ + DETAȘEAZĂ + EROARE 94[br]Eșec în configurare + STARE COSTUM + JURNAL DE ACCES + URMĂRIRE + HPS #1 - Semnal pierdut[br][br]HPS #2 - Semnal pierdut[br][br]HPS #3 - ACTIV (TAU)[br][br]HPS #4 - Semnal pierdut + 23-10-2103: HPS1 - V. Auclair[br]18-11-2103: HPS3 - J. Yoshida[br]19-11-2103: HPS3 - A. Coetzee[br]26-12-2103: HPS2 - S. Glasser[br]26-12-2103: HPS4 - J. Ross[br]27-12-2103: HPS1 - N. Tsiolkovsky[br]02-01-2104: HPS3 - A. Coetzee[br]11-04-2104: HPS3 - /4subjWAUr/[br]12-04-2104: HPS3 - J. Yoshida + ACCES REACTOR + INFORMAȚII PUTERE SITE + HARTĂ LOCALĂ + JURNAL DE ACCES + INTRODUCEȚI CODUL COMANDĂ + STARE + ISTORIC IESIRE + INFORMAȚII REACTOR + Specificați Reactor: + Cod Comandă + Comandă Executată + Vă rugăm să așteptați... + Decontaminare pregătită! Ambele chei ale reactorului trebuie utilizate în camera reactorului pentru a executa. + Bateria este acum ocolită și poate fi eliminată în siguranță. + Bateria nu mai este ocolită. + Bufferul cinetic a fost golit. Vă rugăm să permiteți câteva secunde pentru ca turbinele să se stabilizeze. + Inelul reactorului a fost resetat! + REACTOR: + EFECT: + FRECVENȚĂ: + TENSIUNE: + OPRIRE: + PUTERE DE REZERVĂ: + ONLINE + OFFLINE + ACTIV + INACTIV + N/A + Cod comandă invalid. + Modulele de diagnostic sunt dezactivate. + Reactorul trebuie oprit înainte de a curăța turbinele. + Generatorul este deja pornit. + Decontaminarea este deja în așteptare. Vă rugăm să folosiți cheile în camera reactorului pentru a o executa. + Decontaminarea este în curs... + Nu este necesară decontaminarea. Nivelurile de radiație sunt normale. + Comanda este dezactivată în timp ce reactorul este online. + Nu s-a găsit niciun reactor corespunzător numărului specificat. + Comanda este dezactivată în timp ce reactorul este online. + Nu s-a putut stabili conexiunea cu REACTOR2550! + INFORMAȚII REACTOR:[br]Turbina de fluctuație cinetică închide activitatea termică într-o sursă de energie electrică. + AVERTISMENT DE RADIATIE! + 02-12-2103: Jin Yoshida[br]13-12-2103: Jin Yoshida[br]23-12-2103: Jin Yoshida[br]26-12-2103: Jin Yoshida + TRANSMISIE + JURNAL COMUNICĂRI + STATUS PHI + UPSILON + THETA + LAMBDA + DELTA + OMICRON + PHI + OMEGA + LISBONA + CADIZ + Nu se poate stabili conexiunea! + 09-01-2103 - Ieșire: Omicron - Herber[br]11-01-2103 - Intrare: Omicron - Herber[br]17-01-2103 - Ieșire: Omicron - Herber[br]24-01-2103 - Intrare: Phi - Tsiolkovsky[br]12-02-2103 - Ieșire: Omicron - Herber[br]04-03-2103 - Ieșire: Omicron - Herber[br]26-03-2103 - Ieșire: Phi - Yoshida[br]02-04-2103 - Ieșire: Omicron - Herber + VERIFICAȚI STATUSUL + INFORMAȚII + TUNNELURI DE ACCES + PHI PROPRIU + OMEGA SG + TUNNELURI DE ACCES (Phi/Tau) - Instabile + PHI[br]Locație de lansare: OK[br]Controlul Misiunii: OK[br]Asamblor: OK[br][br]Site complet operațional + OMEGA GUN SPAȚIAL[br]Baril flexibil: 7290m[br]Capacitate maximă încărcătură: 10 tone[br]Viteză maximă: 42 000 km/h + UȘI AIRLOCK + MEDIA + DOCUMENTE RECENTE + FILM + MUSICĂ + FOTOGRAFII + + HRANA DE URGENȚĂ[br]de Nadine Masters[br][br]O privire detaliată asupra substanțelor chimice și compușilor comuni găsiți la Pathos-II care ar putea să te țină în viață în situații de urgență.[br][br]Ultima accesare de: Sarah Lindwall + NUTRIȚIE PRIN VENE[br]de Richard Holland[br][br]Un ghid despre cum să îți hrănești colegii inconștienți sau în comă prin perfuzie intravenoasă.[br][br]Ultima accesare de: Sarah Lindwall + MODIFICĂRI POST-CONSTRUCȚIE[br]de Astrid Krier[br][br]Metode pentru a face loc unui încărcăturii suplimentare după ce carcasele au fost construite și lăsate la Delta.[br][br]Ultima accesare de: Catherine Chun + HRANA DE URGENȚĂ + NUTRIȚIE + MODIFICĂRI + Corupție de date detectată! + + ÎNCHIDERILE UȘILOR + Control Uși + DISPATCH[br]Sendeyo, Abbo + IEȘIRE către[br]Frontal - T1 + DEPOZIT + CABINĂ A[br]Ross, Johan + CABINĂ B[br]Coetzee, Antjie[br]Espinosa, Renata + CABINĂ C[br]Auclair, Vic + CABINĂ D[br]Glasser, Steve[br]Yoshida, Jin + BAIE + INFIRMERIE[br](Neocupată) + IEȘIRE către[br]Phi/Gun Spațial[br](Lock Air) + Închisă + Deschisă + EROARE + + INTERCOM + Dispatch + Control Reactor + Zona Comună + Infirmerie + Biroul lui Auclair + Sună + Închide + + Control Airlock + PRINCIPAL + SECUNDAR + + Suport Vital: + Activ + Dezactivat + Dezactivează + Avertisment + Doriți să dezactivați suportul vital? + + STATUT ARK:[br][br]FUNCȚIONEAZĂ + STATUT ARK:[br][br]PORNIT[br]ZIUA 312 - 10:07:31 + EJECTARE + + LOGAT: JASPER HILL + THETA[br]Totul a decurs bine. Toți membrii echipajului au fost scanati și înregistrați în ARK. Încărcăm naveta spre Omicron. Plecăm cât mai curând posibil. + OMICRON[br]Eames și echipajul său ne-au primit cu brațele deschise. Scanările au decurs bine, ar trebui să avem majoritatea lor. + TAU[br]Am găsit cinci membri supraviețuitori la Tau. Au fost blocați aici luni întregi, fără contact radio sau hrană adecvată. Am reușit să-i scanăm pe toți, deși suspectez că sosirea lor va crea probleme în ARK, deoarece se simt abandonați de Omicron. Sper doar ca toată lumea să poată ierta unul altuia. + PHI[br]S-au întâmplat probleme. Nu am reușit să lansăm. Ne întoarcem la Tau să vedem ce putem face. + + LOGAT: CATHERINE CHUN + FIȘIERE + THETA[br]Am finalizat toate lucrurile necesare. Mâine vom pleca cu naveta spre Omicron. Niciodată nu am fost la celelalte locații, în afară de Lambda. Ar trebui să fie interesant. Sper că înțeleg ceea ce încercăm să facem. + OMICRON[br]Au existat întrebări despre ARK și ce este acesta, dar Jasper a reușit rapid să le explice ideea. Nu sunt sigur că aș fi reușit eu. Mă bucur că nu sunt singură în asta. A durat ceva, dar echipajul a fost scanat cu succes odată ce am conectat corespunzător scaunul pilotului. + ACR[br]Coborârea a fost puțin instabilă, dar fără pericole majore. Acum devine dificil cu ARK-ul. Este greu și, fără navete, trebuie să-l ducem până la Tau. + TAU[br]Auclair și ceilalți au fost luați prin surprindere. Nu se așteptau să ajungem. Cred că au trecut prin multe lucruri dificile. + PHI[br]Pe drum spre Phi. Tau a fost lovită serios. Eram îngrijorată că airlock-ul ar putea să cedeze la ieșire. Trebuie să fim atenți când ne întoarcem. + + JURNAL + ÎNREGISTRĂRI + 2103-09-13 + 2103-11-19 + 2103-12-25 + 2103-12-26 + Speram să văd Omicron astăzi. Evacuarea ordonată de cei de la Theta a fost un dar, o scuză pentru a părăsi Alpha și a abandona WAU. Pe măsură ce furtuna s-a risipit, am fost atacați de monștri pe care WAU-i „ajutase” să apară. Am fost ambuscați și ne-am retras spre Tau. Glasser, Kovsky, Coetzee și eu am supraviețuit. Auclair este la infirmerie, dar nu arată bine. + Coetzee a făcut o încercare, să verifice Observation pentru orice ar putea semăna cu hrană. A ieși afară este extrem de periculos. E ca și cum ai merge să cumperi țigări în mijlocul unui uragan. S-a întors cu niște firimituri. Toți știm că era gol. Cred că doar dorea o șansă de a muri fără să-și asume responsabilitatea de a o face singură. + Oamenii de pe Platou au apărut. Era un grup de ingineri de la Theta care ne-au spus că vor să folosească Omega Space Gun pentru a lansa ceva numit ARK. Este o lume artificială care conține scanări cerebrale ale oamenilor care lucrau la Pathos-II. Ideea este ridicolă, dar simpatică. Toți am fost de acord să facem o scanare pentru a participa la acest „pos-mortem”. + Unii ingineri s-au întors de la Phi. Se pare că au amânat lansarea ARK-ului. Toți erau într-o stare proastă și greu de obținut răspunsuri clare. Cu excepția unui lucru foarte important: Toți doreau să rămână la Tau pentru a rezolva această afacere cu ARK, dar programaseră ca Climber să-i preia mâine. Cineva ar trebui să prindă acel Climber pentru a alerta Omicron despre ce se întâmplă. Noroc că Glasser și cu mine am reușit să preluăm această misiune. În sfârșit voi putea să-i avertizez pe Dahl și Sarang despre situația critică de la Alpha. + Echilibru + Post-impact + Creștere sălbatică + Terariu + Terminare + + Pattern WAU replicat în Struct Gel: aproximativ C2933-53 A5530-32 G9531-44 U3635-66[br][br]Spike C & U să regreseze[br][br]WAU mai mult decât gelul -> Entitate[br][br]Extins de gel[br]Vector de creștere ≈ 51c:1000q[br]forță contrară[br][br]Otrăvește amprenta![br]Sterilizează lotul -> hrănește inima[br][br]Forțează WAU să se autodistrugă[br][br]Trebuie să ajungem la Omicron + + + + Stare WAU + Fișierele cazului + Control Acces + + CAZ#002: Echilibru [2102:10:12] - Dr. Ross + CAZ#012: Post-Impact [2103:01:21] - Dr. Ross + CAZ#013: Creștere Sălbatică [2103:03:10] - Dr. Ross + CAZ#017: Terariu [2103:04:02] - Dr. Ross + CAZ#023: The Warden, Găzduitorul Nostru [2103:11:07] - Dr. Ross + + Precedent + Următor + + WAU (Unitatea Găzduitorului) - 2104:05:10[br]================================[br]CLIMAT-CORE[br] - Presiune: 51.6 psi [br] - Temperatură: 4 C [br] - Umiditate(RH): 89% [br]PATRON[br] - Discret: C1045 / A8264 / G3153 / U3084 [br] - Momentum: A3:U4 / Gx:Cy / G1:G2 / Cx:U7 [br]CREȘTERE[br] - Ciclu (estimativ): 114 trilioane[br] - Vector cuantificat: 51c:1000q[br] - Creștere relativă: 40151%[br]PROGNOZA[br] - Valori comune: 0.4% (Deviație masivă) [br] - Analiza predictivă: N/A (entitate nesigură) + + Nu se poate continua[br][br]Acces Alpha necesar + Sigiliu de securitate aplicat[br][br]Redirecționare... + Suprascriere manuală securitate + Alpha - Camera WAU[br][br]Acces acordat + + + + Hartă Site + Prezentare Generală OSG + Transport Tunel + Activitate Personal + Jurnal Lansare + Configurare încărcătură + Omega Space Gun + Revistă cochilie + Controale lansare + TT1 - Phi Cargo Bay [br]Conținut: ARK [br]Status: Necesită descărcare manuală + TT1 - Phi Cargo Bay [br]Conținut: - [br]Status: Gata de utilizare + Intrare + Ieșire + Activitate + 2104-05-11: ENT - R. Herber[br]2103-12-27: ENT - I. Pedersen[br]2103-12-27: ENT - S. Lindwall[br]2103-12-27: ENT - C. Chun[br]2103-12-27: ENT - N. Ivashkin[br]2103-12-27: ENT - J. Hill + 2103-12-27: EXT - I. Pedersen[br]2103-12-27: EXT - S. Lindwall[br]2103-12-27: EXT - N. Ivashkin[br]2103-12-27: EXT - J. Hill + 2104-05-11 :: ...vizita nesemnata a lui R. Herber...[br]2103-12-27 :: Lansarea ARK[br]2103-11-14 :: Ultima vizită + Săptămâna #488 + Săptămâna #489 + Săptămâna #490 + Săptămâna #491 + Proiect: TACT-SX[br]Proprietar: Haimatsu[br]Tip: Nave de platformă orbitală[br]Lansare: 2102-12-19 @ 13:00:00[br]***MISIUNE FINALIZATĂ***[br][br]Proiect: ENDO[br]Proprietar: Luna Prospex[br]Tip: Satelit de observare[br]Lansare: 2103-12-20 @ 13:30:00[br]***MISIUNE FINALIZATĂ*** + Proiect: TACT-SX[br]Proprietar: Haimatsu[br]Tip: Nave de platformă orbitală[br]Lansare: 2102-12-26 @ 13:00:00[br]***MISIUNE FINALIZATĂ***[br][br]Proiect: REVEAL[br]Proprietar: Sino-Indian Federation[br]Tip: Satelit de comunicații[br]Lansare: 2102-12-27 @ 13:00:00[br]***MISIUNE FINALIZATĂ*** + Proiect: TACT-SX[br]Proprietar: Haimatsu[br]Tip: Nave de platformă orbitală[br]Lansare: 2103-01-02 @ 14:00:00[br]***MISIUNE FINALIZATĂ***[br][br]Proiect: AUGE[br]Proprietar: Zentraler Deutscher Kern [br]Tip: Satelit de recunoaștere[br]Lansare: 2103-01-03 @ 13:00:00[br]***MISIUNE FINALIZATĂ*** + Proiect: TACT-SX[br]Proprietar: Haimatsu[br]Tip: Nave de platformă orbitală[br]Lansare: 2103-01-09 @ 12:30:00[br]***PE HOLD***[br][br]Proiect: KARMAN[br]Proprietar: Atmos Surveyor[br]Tip: Satelit meteorologic[br]Lansare: 2103-01-11 @ 13:00:00[br]***PE HOLD***[br][br]După zece ani de operare impecabilă, Omega Space Gun se va închide, dar a fost nevoie de o apocalipsă pentru a deveni redundantă.[br]- Vic Auclair + + Răscumpărările au fost deja mutate în Tau. Întoarce-te acolo dacă îți este foame. - Kovsky + Folosește pachete de energie pentru a forța încuietorile afectate de întreruperile de curent. - Kovsky + + Fără Încărcătură + Încărcătură Detectată + Închidere Bay Încărcătură + Proiectil Sigilat + Proiectil în tranzit + Complet + + ÎNCĂRCĂTURA + COCHILIE DE LIVRARE + OMEGA SPACEGUN + PHI (LOCUL LANSĂRII) + OMEGA (PLATFORMĂ DE SUPRAFAȚĂ) + DEPLOYMENT COMPLET + + Un satelit este încărcat într-o cochilie. + Cochilia este accelerată de electromagneți pe lungimea conductei. + Se câștigă suficientă viteză pentru a scăpa de gravitația terestră înainte de efracție. + Ajungând în spațiu, satelitul va arunca cochilia și se va desfășura. + Motoarele de pe navă stabilesc satelitul într-o orbită. + + EȘTI AICI + CONTROL AUX. + DEPOZIT + ÎNCĂRCĂTURA + + Scanare Program Inițializare... + Scanare Program În Derulare + Scanare Program Finalizat + Inițiere uplink... + Pregătire șablon SOMA... + Trimitere șablon SOMA... + Inițiere capturare... + Pregătit pentru capturare:3 + Pregătit pentru capturare:2 + Pregătit pentru capturare:1 + Capturare + Finalizat + Simon J + Catherine C + FINALIZAT + + Lansare + În Lansare + + VERIFICARE SISTEM + SISTEME PRINCIPALE: + DEPLASARE PANOU SOLAR: + GENERARE ENERGIE: + BOOSTER PRINCIPAL: + BATERII REZERVE: + SISTEME SECUNDAR: + COMUNICAȚIE: + SENSOR VIZUAL: + PLUGIN (ident.: ARK): + BOOSTER SECUNDAR: + VERIFICARE... + OK + + EȘEC CRITIC + Eroare EXT_READCTX570: Cip Cortex corupt. + Vă rugăm să încercați din nou. + + + diff --git a/entry.hpc b/entry.hpc new file mode 100644 index 0000000..6b7ddbe --- /dev/null +++ b/entry.hpc @@ -0,0 +1,10 @@ + + diff --git a/resources.cfg b/resources.cfg new file mode 100644 index 0000000..67f2495 --- /dev/null +++ b/resources.cfg @@ -0,0 +1,4 @@ + + + + diff --git a/script/modules/MenuHandler.hps b/script/modules/MenuHandler.hps new file mode 100755 index 0000000..32bebef --- /dev/null +++ b/script/modules/MenuHandler.hps @@ -0,0 +1,7259 @@ +#include "interfaces/UserModule_Interface.hps" +#include "modules/ModuleInterfaces.hps" +#include "base/InputHandler_Types.hps" +#include "helpers/helper_imgui_options.hps" +#include "helpers/helper_imgui.hps" +#include "helpers/helper_game.hps" +#include "helpers/helper_audio.hps" +#include "helpers/helper_font.hps" + +//--------------------------------------------------- + +enum eMainMenuGroup +{ + eMainMenuGroup_Main, + eMainMenuGroup_StartGame, + eMainMenuGroup_LoadGame, + eMainMenuGroup_Options, + eMainMenuGroup_Options_Audio, + eMainMenuGroup_Options_Video, + eMainMenuGroup_Options_Video_Display, + eMainMenuGroup_Options_Video_PostEffect, + eMainMenuGroup_Options_Video_World, + eMainMenuGroup_Options_Video_Gamma, + eMainMenuGroup_Options_Input, + eMainMenuGroup_Options_Input_Keybind, + eMainMenuGroup_Options_Input_Mouse, + eMainMenuGroup_Options_Input_Gamepad, + eMainMenuGroup_Options_Input_GamepadMapping, + eMainMenuGroup_Options_Input_EyeTracking, + eMainMenuGroup_Options_Gameplay, + eMainMenuGroup_NewGame_ModeSelection, + eMainMenuGroup_LastEnum, +} + +enum eGraphicSettings +{ + eGraphicSettings_Low, + eGraphicSettings_Medium, + eGraphicSettings_High, + eGraphicSettings_LastEnum, +} + + +//----------------------------------------- + +//-------------------------------------------------------------// +// Data for menu, values based on 1280x720 resolution +//-------------------------------------------------------------// + +const cVector2f kMainMenuButtonPos = cVector2f(136, 275); +const cVector2f kTitlePos = cVector2f(100, 67); +const cVector2f kTitleSize = cVector2f(4 * 173, 173); +const cColor kMainMenuButtonBgColor = cColor(69.0 / 255.0, 139.0 / 255.0, 139.0 / 255.0, 1); + +//----------------------------------------- + +const cVector2f kOptionsBgPos = cVector2f(100, 260); +const cVector2f kOptionsBgSize = cVector2f(680, 255); +const cVector2f kOptionsAudioBgSize = cVector2f(680, 220); +const cVector2f kOptionsVideoBgSize = cVector2f(680, 295); +const cVector2f kOptionsGameplayBgSize = cVector2f(680, 255); +const cVector2f kOptionsGameplayPS4BgSize = cVector2f(680, 145); +const cVector2f kOptionsEyetrackingBgSize = cVector2f(680, 448); +const cVector2f kLoadWindowBgSize = cVector2f(680, 370); +const cVector2f kOptionsVideoPostEffectBgSize = cVector2f(680, 220); +const cVector2f kOptionsVideoWorldBgSize = cVector2f(680, 295); +const cVector2f kOptionsVideoDisplayBgSize = cVector2f(680, 335); +const cVector2f kOptionsVideoGammaBgSize = cVector2f(680, 140); +const cVector2f kOptionsBgBorderSize = cVector2f(680, 42.5); +const cVector2f kInputBgSize = cVector2f(680, 220); +const cVector2f kInputEyeTrackingBgSize = cVector2f(680, 255); +const cVector2f kInputGamepadBgSize = cVector2f(680, 258); +const cVector2f kInputPS4BgSize = cVector2f(680, 220); +const cVector2f kKeybindWindowBgSize = cVector2f(680, 380); +const cVector2f kOptionsMappingBgSize = cVector2f(820, 370); + +const cVector2f kGameModeBgPos = cVector2f(100, 260); +const cVector2f kGameModeBgSize = cVector2f(663, 260); +const cVector2f kGameModeArrowPosRight = cVector2f(700, 276); +const cVector2f kGameModeArrowPosLeft = cVector2f(388, 276); +const cVector2f kGameModeArrowSize = cVector2f(32 * 0.9f, 64 * 0.8f); + +const cVector2f kGammaBgSize = cVector2f(680, 220); + +const cVector2f kOptionMenu_KeybindBgPos = cVector2f(350, 335); +const cVector2f kOptionMenu_KeybindBgSize = cVector2f(550, 35); +const cVector2f kOptionMenu_KeybindBgBorderSize = cVector2f(550, 42.5); +const cVector2f kOptionMenu_PressXPos = cVector2f(250, 345); + +//----------------------------------------- + +const cVector2f kSaveSlotSpacing = cVector2f(175, 0); +const cVector2f kSaveSlotPos = cVector2f(0, 275); + +//----------------------------------------- + +const cVector2f kLoadBgPos = cVector2f(110, 270); +const cVector2f kLoadBgSize = cVector2f(623, 305); +const cVector2f kLoadScrollPos = cVector2f(718, 275); +const cVector2f kLoadScrollSize = cVector2f(10, 295); +const float kLoadSpacing = 30; + +//----------------------------------------- + +const cVector2f kKeybindBgPos = cVector2f(110, 270); +const cVector2f kKeybindBgSize = cVector2f(623, 275); +const cVector2f kKeybindScrollPos = cVector2f(718, 275); +const cVector2f kKeybindScrollSize = cVector2f(10, 265); +const float kKeybindSpacing = 30; + +//----------------------------------------- + +const cVector2f kMappingPos = cVector2f(170, 260); +const cVector2f kMappingSize = cVector2f(640, 320); + +const cVector2f kMappingArrowPosRight = cVector2f(130, 400); +const cVector2f kMappingArrowPosLeft = cVector2f(180+640+30, 400); +const cVector2f kMappingArrowSize = cVector2f(32, 64); +const cVector2f kMappingButtonPosRight = cVector2f(-1024+180, 260); +const cVector2f kMappingButtonPosLeft = cVector2f(180+680, 260); +const cVector2f kMappingButtonSize = cVector2f(1024, 320); + +//----------------------------------------- + +float gfNewGameFadeOutTime=4; + +//----------------------------------------- + +const cColor kSelectedColor = cColor(1.0 / 255.0, 1); +const cColor kDeselectedColor = cColor(1, 1); +const cColor kDisabledColor = cColor(58.0 / 255.0, 1); + +//----------------------------------------- + +class cBindableAction +{ + cBindableAction(){} + cBindableAction(tString asAction, bool abAnalog = false) + { + msAction = asAction; + mbAnalog = abAnalog; + } + + tString msAction; + bool mbAnalog; +}; + +//----------------------------------------- + +class cImGuiParticleEmitter +{ + cImGuiParticleEmitter() + { + mColorStartMin = cColor(1,1); + mColorStartMax = cColor(1,0); + mColorMulStart = cColor(1,1); + mColorMulMiddle = cColor(1,1); + mColorMulEnd = cColor(1,1); + } + array mvGfx; + cVector3f mvMin = cVector3f(0,0,0); + cVector3f mvMax = cVector3f(0,0,0); + cVector3f mvVelocityMin = cVector3f(0,0,0); + cVector3f mvVelocityMax = cVector3f(0,0,0); + + float mfSizeMin = 1.0f; + float mfSizeMax = 1.0f; + + uint mlMaxParticles = 10; + float mfParticlesPerSec = 10.0f; + float mfNewParticleTime = 0.0f; + + float mfMinLife = 10.0f; + float mfMaxLife = 10.0f; + + cColor mColorStartMin = cColor(1,1); + cColor mColorStartMax = cColor(1,1); + + cColor mColorMulStart = cColor(1,1); + cColor mColorMulMiddle = cColor(1,1); + cColor mColorMulEnd = cColor(1,1); + float mfColorMulMiddleStartTime = 0.25f; + float mfColorMulEndStartTime = 0.75f; + + //bool mbDebug = false; + + //------------------------------------------------------ + + array mvParticleGfxIndices; + array mvParticleLifeValues; + array mvParticleLifeStepMuls; + array mvParticlePositions; + array mvParticleVelocities; + array mvParticleSizes; + array mvParticleStartColors; + array mvParticleColors; + + //------------------------------------------------------ + + void Update(float afTimeStep) + { + mfNewParticleTime -= afTimeStep; + + if(mfNewParticleTime<=0.0f && mvParticleLifeValues.length() vParticlesToRemove; + for(int i=0; i vParticleSizes; + for(int i=0; i=mvGfx.length()) continue; + + ImGui_DrawGfx(mvGfx[lGfxIndex], + mvParticlePositions[i], + vParticleSizes[lGfxIndex]*mvParticleSizes[i], + mvParticleColors[i]); + } + + ImGui_SetAlignment(eImGuiAlign_TopLeft); + } + + //------------------------------------------------------ + + bool ParticleIsDead(int alIdx) + { + return mvParticleLifeValues[alIdx]>=1.0f; + } + + //------------------------------------------------------ +}; + +//----------------------------------------- + +///////////////////////////////////////// +// Last on SOMA Screen +class cLastOnSomaScreen +{ + cLastOnSomaScreen() + { + CleanUp(); + } + + void LoadingStarted() + { + mbLoading_Started = true; + } + void Start(const tString &in asEntry) + { + if(IsActive()) return; + + msEntry = asEntry; + if(msEntry.length()>0) + { + msText = cLux_Translate("LastOnSomaText", asEntry); + if(msText.length()==0) + { + msEntry = ""; + } + else + { + @mpScriptImGui = cLux_CreateScriptImGui("LastOnSoma", true); + + cImGuiGfx defPointer(); + defPointer.mColor = cColor(0.0f,0.0f); + + mpScriptImGui.mpImGui.SetDefaultMouse(defPointer); + mpScriptImGui.mpImGui.SetDefaultFont(cImGuiFont(Helper_Font_GetFontName(eLuxFontType_Default_Small), cVector2f(17) )); + mpScriptImGui.mpImGui.SetShowMouse(false); + + mbFontSizeNeedsAdjust = true; + mfFontHeight = 26.0f; + + LoadScreen_SetForceBackground(false); + LoadScreen_SetUseSmallIcon(true); + + mpScriptImGui.mpImGui.AddTimer("Enable", 0.5f); + } + } + + if(IsActive()==false) + { + cLux_GetSaveHandler().ContinueLoading(true); + + LoadScreen_SetForceBackground(false); + LoadScreen_SetUseSmallIcon(false); + + CleanUp(); + } + } + + void CleanUp() + { + msText = ""; + @mpScriptImGui = null; + + mbLoading_Started = false; + mbLoading_LoadHeaderDone = false; + mbLoading_LoadGameDone = false; + mbLoading_LoadScreenHidden = false; + mbDismiss = false; + } + + bool IsActive() + { + return mpScriptImGui !is null; + } + + void Update(float afTimeStep) + { + if(mbLoading_Started==false) + return; + + if(mbLoading_LoadHeaderDone==false) + { + mbLoading_LoadHeaderDone = cLux_GetSaveHandler().IsDoneLoadingHeader(); + if(mbLoading_LoadHeaderDone) + { + Start(cScript_GetGlobalVarString("LastOnSomaText")); + } + } + + if(IsActive()==false) return; + + cImGui @mpImGui = mpScriptImGui.mpImGui; + + //////////////////////////////////////////// + // So timers and stuff work + mpImGui.Begin(afTimeStep); + { + //////////////////////////////////////// + // Check flags + if(mbLoading_LoadGameDone==false) + { + mbLoading_LoadGameDone = cLux_GetSaveHandler().IsDoneLoadingSavedGame(); + + if(mbLoading_LoadGameDone) + { + //cLux_AddDebugMessage("Saved game is done loading - waiting for loadscreen to go"); + + //cLux_SetGamePaused(true); + } + } + else if(mbLoading_LoadScreenHidden==false) + { + mbLoading_LoadScreenHidden = LoadScreen_IsVisible()==false; + + if(mbLoading_LoadScreenHidden) + { + //cLux_AddDebugMessage("Loadscreen gone - prompting to continue"); + + mpImGui.SetStateFloat("PromptAlpha", 0.0f); + mpImGui.FadeStateFloat("PromptAlpha", 1.0f, 0.5f); + } + } + else if(mbDismiss==false) + { + tString sKeyPress = cLux_GetInputHandler().GetLatestKeyPressed(); + if(sKeyPress.length()!=0) + { + mbDismiss = true; + + //cLux_AddDebugMessage("Dismissing"); + + // Start fadeout + mpImGui.FadeStateFloat("Alpha", 0.0, 0.25f); + + cLux_GetSaveHandler().StartLoadedGame(); + //cLux_SetGamePaused(false); + + cSoundEntry @pEntry = @cSound_GetEntry("loadscreen_background"); + if(pEntry !is null) + pEntry.FadeOut(1.0f/3.0f); + } + } + + //////////////////////////////////// + // Check timers + if(mpImGui.TimerOver("Enable")) + { + mpImGui.SetStateFloat("Alpha", 0.0f); + mpImGui.FadeStateFloat("Alpha", 1.0f, 1.0f); + Music_StopAll(2.0f); + Sound_Stop("MenuBGNoise",2.0f); + cSound_PlayGuiStream("loadscreen_background", true, 0.15f, cVector3f(0,0,0), eSoundEntryType_Safe); + //cSound_GetEntry("loadscreen_background").FadeIn(0.15f, 1.0f/3.0f); + //Music_PlayExt("loadscreen_background", true, 0.15f, 1.0f, 3.0f, 0.0f, eMusicPrio_BgAmb, true); + } + + ///////////////////////////////////// + // Check fadings + if(mpImGui.FadeOver("Alpha")) + { + if(mbDismiss) + { + CleanUp(); + return; + } + else + { + cLux_GetSaveHandler().ContinueLoading(false); + } + } + + ///////////////////////////////////////// + // Draw the screen + + // Bottom layer : black, covering the whole screen + cImGuiGfx gfxBlack; + gfxBlack.mColor = cColor(0,1); + mpImGui.DoImage(gfxBlack, cLux_GetHudVirtualStartPos()+cVector3f(0,0,10.0f), cLux_GetHudVirtualSize()); + + // Set up group (will only take center screen if we are on a multiscreen setup + mpImGui.GroupBegin(cLux_GetHudVirtualCenterScreenStartPos(), cLux_GetHudVirtualCenterScreenSize(), true); + { + float fZ = 415.0f; + float fBGZ = 401.15f; // 400.9f is LoadHandler black bg, 401.1f is whatever and 401.5f is brain icon + + float fAlpha = mpImGui.GetStateFloat("Alpha"); + + mpImGui.SetModColorMul(cColor(1,fAlpha)); + + // Bottom layer overlay: loading screen background + cImGuiGfx gfxBG("loadscreen/backdrop.dds", eImGuiGfx_Texture); + cVector2f vGfxBGSize = GetRatioCorrectSizeByNrmWidth(gfxBG, 1.0f); + + gfxBG.mColor = cColor(0.6f, 1.0f); + mpImGui.SetAlignment(eImGuiAlign_CenterCenter); + mpImGui.DoImage(gfxBG, NrmPos(0.5f, 0.5f, fBGZ), vGfxBGSize); + + // Last on SOMA screenshot + cImGuiGfx gfxScreenshot(msEntry, eImGuiGfx_Texture); + cVector3f vGfxScreenshotPos = NrmPos(0.25f, 1.0f/7.0f, fZ); + cVector2f vGfxScreenshotSize = GetRatioCorrectSizeByNrmWidth(gfxScreenshot, 0.5f); + + mpImGui.SetAlignment(eImGuiAlign_TopLeft); + mpImGui.DoImage(gfxScreenshot, vGfxScreenshotPos, vGfxScreenshotSize); + + // Set loading bar position + cVector3f vLoadingBarPos = vGfxScreenshotPos; + vLoadingBarPos.x += cLux_GetHudVirtualCenterScreenStartPos().x; + cLux_LoadScreenSetBarPosAndSize(cVector2f(vLoadingBarPos.x, vLoadingBarPos.y + vGfxScreenshotSize.y - 4.2f), cVector2f(vGfxScreenshotSize.x, 4.2f)); + + cVector3f vLinePos = vGfxScreenshotPos; + vLinePos.y += vGfxScreenshotSize.y + 15.0f; + + // Text data and setup + cImGuiTextFrameData textFrameData; + textFrameData.mbUseBackgroundGfx = false; + textFrameData.mFont.SetFile(Helper_Font_GetFontName(eLuxFontType_Sansation_Medium)); + textFrameData.mFont.mvSize = cVector2f(mfFontHeight); + textFrameData.mFont.mColor = cColor(1,1); + + cVector3f vTextFramePos = vLinePos + cVector3f(15.0f,0,0); + cVector2f vTextFrameSize(vGfxScreenshotPos.x + vGfxScreenshotSize.x - vTextFramePos.x, NrmSize(0.0f, 0.95f).y-vLinePos.y); + + if(mbFontSizeNeedsAdjust) + { + mbFontSizeNeedsAdjust = false; + + array vLines; + GetFontWordWrapRowsW(textFrameData.mFont, 1.0f, msText, vTextFrameSize.x, vLines); + + lNumMaxLines = cMath_Abs(vTextFrameSize.y/(mfFontHeight)); + lNumLinesInText = vLines.length(); + + if(lNumLinesInText>lNumMaxLines) + { + float fHeightIntervalStart = 0.0f; + float fHeightIntervalEnd = mfFontHeight; + float fHeightIntervalMid; + + while(lNumLinesInText!=lNumMaxLines) + { + fHeightIntervalMid = (fHeightIntervalStart+fHeightIntervalEnd)*0.5f; + mfFontHeight = fHeightIntervalMid; + + textFrameData.mFont.mvSize = cVector2f(mfFontHeight); + + GetFontWordWrapRowsW(textFrameData.mFont, 1.0f, msText, vTextFrameSize.x, vLines); + + lNumMaxLines = cMath_Abs(vTextFrameSize.y/(mfFontHeight)); + lNumLinesInText = vLines.length(); + + if(lNumLinesInText vBits; + mvRefresh.resize(0); + mvRefreshValues.resize(0); + + cSystem_GetAvailableVideoModes(mvResolutionSizes, vBits, mvRefresh, 32, 15, true); + + for(int i = 0; i < mvResolutionSizes.size(); ++i) + { + mvResolutionValues.push_back(""+mvResolutionSizes[i].x + "x"+mvResolutionSizes[i].y); + } + + for(int i = 0; i < mvRefresh.size(); ++i) + { + mvRefreshValues.push_back(""+mvRefresh[i]); + } + + if(mvLangFiles.size() == 0) + { + ////////////// + // Get lang files + mvLangFiles.push_back("brazilian_portuguese"); + mvLangFiles.push_back("english"); + mvLangFiles.push_back("french"); + mvLangFiles.push_back("german"); + mvLangFiles.push_back("italian"); + mvLangFiles.push_back("russian"); + mvLangFiles.push_back("romanian"); + mvLangFiles.push_back("spanish"); + mvLangFiles.push_back("simplified_chinese"); + } + + ///////////////////// + // Actions + array vActions = + { + cBindableAction("Forward"), + cBindableAction("Backward"), + cBindableAction("Left"), + cBindableAction("Right"), + cBindableAction("Jump"), + cBindableAction("Crouch"), + cBindableAction("Run"), + cBindableAction("LeanRight"), + cBindableAction("LeanLeft"), + cBindableAction("Interact"), + cBindableAction("InteractCancel"), + cBindableAction("InteractRotate"), + cBindableAction("Flashlight"), + cBindableAction("OpenInventory"), + cBindableAction("Throw") + // Removed to make binding simpler + //cBindableAction("Examine") + }; + + mvActions = vActions; + + array vGamepadActions = + { + cBindableAction("GamepadMove", true), + cBindableAction("GamepadLook", true), + cBindableAction("Jump"), + cBindableAction("Crouch"), + cBindableAction("Run"), + cBindableAction("OpenInventory"), + cBindableAction("Interact"), + cBindableAction("Flashlight"), + // Removed to make binding simpler + //cBindableAction("Examine"), + cBindableAction("InteractCancel"), + cBindableAction("AnalogLean"), + cBindableAction("Throw"), + cBindableAction("GamepadRotateUp"), + cBindableAction("GamepadRotateDown"), + cBindableAction("GamepadRotateLeft"), + cBindableAction("GamepadRotateRight"), + cBindableAction("MenuConfirm"), + cBindableAction("MenuCancel"), + cBindableAction("MenuUp"), + cBindableAction("MenuDown"), + cBindableAction("MenuLeft"), + cBindableAction("MenuRight"), + cBindableAction("MenuScrollUp"), + cBindableAction("MenuScrollDown"), + cBindableAction("GamepadBack"), + cBindableAction("OpenMenu") + }; + mvGamepadActions = vGamepadActions; + + mCurrentBGPhase = eMainMenuPhase(mpConfig.GetInt("Game", "MenuPhase", eMainMenuPhase_Initial_To_1_3)); + + mbInitiated = true; + } + + void OnMapEnter(cLuxMap @apMap) + { + Initiate(apMap); + + + } + + void OnMapLeave(cLuxMap @apMap) + { + mbPauseMenuEnabled = true; + mbShowEngagement = false; + mbPremenuActive = false; + } + + //------------------------------------------------------------ + + void PreloadData(cLuxMap@ apMap) + { + ////////////////////////// + //Preload the pause menu + ImGui_PreloadImage("menu_corner_tr.tga", eImGuiGfx_Image); + ImGui_PreloadImage("menu_border_top.tga", eImGuiGfx_Image); + ImGui_PreloadImage("menu_corner_tl.tga", eImGuiGfx_Image); + ImGui_PreloadImage("menu_border_left.tga", eImGuiGfx_Image); + ImGui_PreloadImage("menu_border_right.tga", eImGuiGfx_Image); + ImGui_PreloadImage("menu_corner_bl.tga", eImGuiGfx_Image); + ImGui_PreloadImage("menu_corner_br.tga", eImGuiGfx_Image); + ImGui_PreloadImage("menu_border_bottom.tga", eImGuiGfx_Image); + ImGui_PreloadImage("submenu_game.tga", eImGuiGfx_Image); + ImGui_PreloadImage("submenu_options.tga", eImGuiGfx_Image); + ImGui_PreloadImage("submenu_input.tga", eImGuiGfx_Image); + ImGui_PreloadImage("submenu_video.tga", eImGuiGfx_Image); + ImGui_PreloadImage("submenu_display.tga", eImGuiGfx_Image); + ImGui_PreloadImage("submenu_rendering.tga", eImGuiGfx_Image); + ImGui_PreloadImage("submenu_audio.tga", eImGuiGfx_Image); + + ImGui_PreloadImage("imgui_pointer_normal.tga", eImGuiGfx_Image); + ImGui_PreloadImage("startmenu_button_long_jitter1", eImGuiGfx_Texture); + ImGui_PreloadImage("startmenu_button_long_jitter2", eImGuiGfx_Texture); + ImGui_PreloadImage("startmenu_button_long_jitter3", eImGuiGfx_Texture); + ImGui_PreloadImage("startmenu_button_long_jitter4", eImGuiGfx_Texture); + ImGui_PreloadImage("startmenu_button_long", eImGuiGfx_Texture); + ImGui_PreloadImage("startmenu_options_button_long", eImGuiGfx_Texture); + ImGui_PreloadImage("startmenu_options_button_meter", eImGuiGfx_Texture); + ImGui_PreloadImage("startmenu_options_button_dropdown", eImGuiGfx_Texture); + ImGui_PreloadImage("startmenu_options_button_long_inverted", eImGuiGfx_Texture); + + ImGui_PreloadImage("startmenu_options_msgbox_button_left.tga"); + ImGui_PreloadImage("startmenu_options_msgbox_button_right.tga"); + + ImGui_PreloadImage("startmenu_options_button_on", eImGuiGfx_Image); + ImGui_PreloadImage("startmenu_options_button_off", eImGuiGfx_Image); + ImGui_PreloadImage("startmenu_options_arrow", eImGuiGfx_Image); + + ImGui_PreloadImage(Platform_IsPS4() ? "startmenu_button_x" : "startmenu_button_xbox_A", eImGuiGfx_Image); + ImGui_PreloadImage(Platform_IsPS4() ? "startmenu_button_circle" : "startmenu_button_xbox_B", eImGuiGfx_Image); + ImGui_PreloadImage("startmenu_button_direction2", eImGuiGfx_Image); + + Sound_PreloadGroup("special_fx/frontend", true); + } + + void CreateWorldEntities(cLuxMap @apMap) + { + + } + void DestroyWorldEntities(cLuxMap @apMap) + { + + } + + //------------------------------------------------------------ + + ///////////////////////////////////////// + // GENERAL + ///////////////////////////////////////// + + //------------------------------------------------------------ + + void OnEnterContainer(const tString&in asOldContainer) + { + + } + void OnLeaveContainer(const tString&in asNewContainer) + { + + } + + //------------------------------------------------------------ + + void Update(float afTimeStep) + { + } + + void PostUpdate(float afTimeStep) + { + } + + void Reset() + { + } + void VariableUpdate(float afDeltaTime) + { + + } + + //------------------------------------------------------------ + + ///////////////////////////////////////// + // ACTIONS + ///////////////////////////////////////// + + //------------------------------------------------------------ + + void OnGui(float afTimeStep) + { + if(mbInitiated == false && cLux_GetCurrentMap() !is null) + { + Initiate(cLux_GetCurrentMap()); + } + + /////////////////////////////////// + // Display ScriptDebug ON message, to ease confusion + if(cLux_ScriptDebugOn()) + { + ImGui_SetTransCategory(""); + + ImGui_GroupBegin(cLux_GetHudVirtualCenterScreenStartPos(), cLux_GetHudVirtualCenterScreenSize()); + + cImGuiLabelData labelData; + labelData.mColorBase = cColor(1.0f,0.3f,1.0f); + ImGui_DoLabelExt("ScriptDebug ON", labelData, cVector3f(5.0f,ImGui_GetCurrentGroupSize().y-20.0f,100.0f), -1,1.0f); + + /////////////////////////////////// + // Display exploration mode message + if (cLux_GetExplorationModeActive()) + { + ImGui_DoLabelExt("ExplorationMode ON", labelData, cVector3f(105.0f,ImGui_GetCurrentGroupSize().y-20.0f,100.0f)); + } + + ImGui_GroupEnd(); + } + + ////////////////////////////////// + // Check for load save error + tString sError; + if(cLux_GetSaveHandler().HasLoadError(sError)) + { + msLoadSaveError = sError; + mbProfileError = false; + + if(mbMenuActive == false) + { + if(mbMainMenuActive) ShowMainMenu(true); + else SetMenuActive(true); + } + + if(msLoadSaveError == "NoSpace") msLoadSaveError = ""; //solved on a OS level + if(msLoadSaveError == "PlayGo") + { + mbShowPlayGo = true; + msLoadSaveError = ""; + } + } + + if(cLux_HasConfigLoadError(sError)) + { + msLoadSaveError = sError; + mbProfileError = true; + + if(mbMenuActive == false) + { + if(mbMainMenuActive) ShowMainMenu(true); + else SetMenuActive(true); + } + } + + ////////////////////////////////////// + // LAST ON SOMA screen handling + gLastOnSomaScreen.Update(afTimeStep); + + if(gLastOnSomaScreen.IsActive() || mbMenuActive == false) + return; + + + if(mbMainMenuActive && mbHasSaveFiles == false) + { + ///////////// + // Save files + if(cLux_GetSaveHandler().GetSaveFiles(mvSaveNames, mvSaveDates, mvSaveFiles)) + { + mbHasSaveFiles = true; + mbCanContinue = mvSaveFiles.size() > 0; + + // Set focus here + msFocusNextFrame = mbCanContinue ? "Continue" : "NewGame"; + + if(mbCanContinue) + { + msContinueFile = mvSaveFiles[0]; + + /////////// + // Remove "CheckPoint" from save file list + for(int i = 0; i < mvSaveFiles.size(); ++i) + { + if(mvSaveNames[i] == tWString("CheckPoint")) + { + for(int j = i + 1; j < mvSaveFiles.size(); ++j) + { + mvSaveFiles[j-1] = mvSaveFiles[j]; + mvSaveDates[j-1] = mvSaveDates[j]; + mvSaveNames[j-1] = mvSaveNames[j]; + } + + mvSaveFiles.resize(mvSaveFiles.size()-1); + mvSaveDates.resize(mvSaveDates.size()-1); + mvSaveNames.resize(mvSaveNames.size()-1); + + break; + } + } + } + } + else + { + // Don't let menu continue until saves have been checked + //cLux_AddDebugMessage("Saves not retrieved yet..."); + return; + } + } + + + ////////////////////////////////// + // Main alpha + if(mbPremenuActive) + mfMainAlpha = cMath_IncreaseTo(mfMainAlpha, afTimeStep*0.5f, 0.0f); + else + mfMainAlpha = cMath_IncreaseTo(mfMainAlpha, afTimeStep*0.5f, 1.0f); + + ///////////////////////////////////// + //Renders a in game mouse pointer. + cImGuiGfx mouseGfx("imgui_pointer_normal.tga"); + mouseGfx.mColor = cColor_White; + if(ImGui_GetMouseVisible() && mbMouseVisible) + ImGui_DoMouse(mouseGfx, cVector3f_Zero); + + ///////////////////////////////////// + //Setup Properties + cGuiSet@ pSet = cLux_GetCurrentImGui().GetSet(); + mvSize = pSet.GetVirtualSize(); + mvOffset = pSet.GetVirtualSizeOffset(); + mvAspectRatio = cGraphics_GetLowLevel().GetScreenSizeFloat(); + mvAspectRatio /= mvAspectRatio.y; + mlActionHorizontal = 0; + + ImGui_SetTransCategory("Menu"); + + @mpConfig = cLux_GetUserConfig(); + @mpKeyConfig = cLux_GetKeyConfig(); + + ///////////////////////////////////// + //Set frame focus + if(msFocusNextFrame != "") + { + ////////// + // Setup focus when changing groups + ImGui_SetFocus(msFocusNextFrame); + msFocusNextFrame = ""; + } + + ///////////////////////////////////// + // MainMenu-Button Press Check + if(mbMenuButtonPressed && mbPremenuActive == false && mbShowEngagement == false) + { + mbMenuButtonPressed = false; + if(mCurrentGroup == eMainMenuGroup_Main && ((mbShowApplyChanges || mbShowApplyKeyChanges || mbShowDuplicateKeys || mbShowReset || mbShowRestartWarning || mbShowExit || mbShowPlayGo || mbShowNewGame || mbShowLoadGame || mfKeepDisplaySetting > 0 || mlActionToBind > 0) == false)) + { + if(mbMainMenuActive == false) + { + ///////////// + // Disable menu + SetMenuActive(false); + return; + } + else + { + //////////// + // Show exit menu + //mlClickedMainMenuButton = 4; + //ImGui_AddTimer("ButtonClicked", 0.15); + //cLux_AddTodoMessage("Sound: Menu main button pressed"); + } + } + else + { + ////////////// + // Map menu button to back button + cLux_GetCurrentImGui().SendAction(eImGuiAction_Cancel, true, true); + } + } + mbMenuButtonPressed = false; + + + ////////////////////////////////////////////// + // Message box + if( mbShowApplyChanges || mbShowDuplicateKeys || + mbShowApplyKeyChanges || mbShowReset || + mbShowRestartWarning || mbShowExit || mbShowPlayGo || + mbShowNewGame || mbShowLoadGame || + mbShowDetectSettings || + mfKeepDisplaySetting > 0 || mlActionToBind > 0 || + (msLoadSaveError.length() > 0 && mbPremenuActive == false)) + { + //////////////// + // Display message box and disable input for any other widgets + ShowMessageBoxes(); + ImGui_SetModUseInput(false); + } + /////////////// + // Catch left and right input + else + { + float fStartingTimer = 0.35f; + float fFinalTimer = 0.25; + float fTimerReductionFactor = 0.8f; + + { + if(ImGui_ActionTriggered(eImGuiAction_Right, true)) + { + mlActionHorizontal++; + + ImGui_SetStateFloat("HoriPressTimer", fStartingTimer); + ImGui_AddTimer("RightPressed", fStartingTimer); + } + + if(ImGui_ActionTriggered(eImGuiAction_Left, true)) + { + mlActionHorizontal--; + + ImGui_SetStateFloat("HoriPressTimer", fStartingTimer); + ImGui_AddTimer("LeftPressed", fStartingTimer); + } + } + + if(ImGui_TimerExists("RightPressed")) + { + if(ImGui_ActionIsDown(eImGuiAction_Right)==false) + { + ImGui_StopTimer("RightPressed"); + } + else + { + if(ImGui_TimerOver("RightPressed")) + { + mlActionHorizontal++; + + float fTimer = ImGui_GetStateFloat("HoriPressTimer"); + fTimer *= fTimerReductionFactor; + if(fTimer 0) + { + mlIgnoreInput--; + ImGui_SetModUseInput(false); + ImGui_ActionTriggered(eImGuiAction_Cancel, true); + } + + ///////////// + // Draw & Update Background + GuiBackground(afTimeStep); + + ///////////// + // Fade screen and execute action + if( ImGui_TimerExists("NewGame") || + ImGui_TimerExists("Continue") || + ImGui_TimerExists("LoadGame") || + ImGui_TimerExists("ExitToMainMenu") || + ImGui_TimerExists("ExitToTitle") || + ImGui_TimerExists("ExitGame")) + { + ///////////// + // Fade to black + if(ImGui_TimerExists("ExitGame")) + mfFadeOut += afTimeStep / mfExitGameFadeLength; + else if(ImGui_TimerExists("NewGame")) + mfFadeOut += afTimeStep / gfNewGameFadeOutTime; + else + mfFadeOut += afTimeStep / mfFadeLength; + + if(mfFadeOut>1) mfFadeOut=1; + + cImGuiGfx gfx; + ImGui_DrawGfx(gfx, ImGui_NrmPos(0,0, 60.0f), ImGui_NrmSize(1.0), cColor(0, mfFadeOut)); + ImGui_SetModUseInput(false); + + /////////////////////////// + // Action: New Game + if(ImGui_TimerOver("NewGame")) + { + ImGui_StopTimer("NewGame"); + SetMenuActive(false); + mbGameOver = false; + msPreviousSaveLoaded = ""; + + cLux_StartNewGame(); + + + return; + } + + /////////////////////////// + // Action: Continue + if(ImGui_TimerOver("Continue")) + { + ImGui_StopTimer("Continue"); + StartSavedGameLoad(msContinueFile); + + return; + } + + /////////////////////////// + // Action: Load Game + if(ImGui_TimerOver("LoadGame")) + { + ImGui_StopTimer("LoadGame"); + StartSavedGameLoad(mvSaveFiles[mlSaveFileToLoad]); + + return; + } + + /////////////////////////// + // Action: Exit To Main menu + if(ImGui_TimerOver("ExitToMainMenu")) + { + ImGui_StopTimer("ExitToMainMenu"); + mbGameOver = false; + cLux_GetEffectHandler().FadeOut(0.0); + + cLux_StartMap(cLux_GetMainMenuFile()); + msPreviousSaveLoaded = ""; + + LoadScreen_SetUseSmallIcon(false); + SetMenuActive(false); + + return; + } + + /////////////////////////// + // Action: Exit To Title + if(ImGui_TimerOver("ExitToTitle")) + { + ImGui_StopTimer("ExitToTitle"); + mbGameOver = false; + + msPreviousSaveLoaded = ""; + + ShowMainMenu(true); + Users_ObtainFirstUser(); + mbHasSaveFiles = false; + + return; + } + + if(ImGui_TimerOver("ExitGame")) + { + ImGui_StopTimer("ExitGame"); + mbGameOver = false; + cLux_GetEffectHandler().FadeOut(0.0); + SetMenuActive(false); + cLux_Exit(); + + return; + } + } + ///////////// + // Set focus back to this set! + else + { + if(cLux_GetGuiHandler().GetGameHudInputFocus() == false) + { + cLux_GetGuiHandler().SetGameHudInputFocus(true); + } + } + + ///////////// + // Fade to black + if(mfFadeIn > 0.0f) + { + mfFadeIn -= afTimeStep / mfFadeLength; + cImGuiGfx gfx; + ImGui_DrawGfx(gfx, ImGui_NrmPos(0,0,60), ImGui_NrmSize(1.0), cColor(0, mfFadeIn)); + } + + if(mbPremenuActive==false) + OptionMenu_SetModColor(cColor(1, mfMainAlpha)); + + + ///////////// + // Draw current state + switch(mCurrentGroup) + { + //////////////// + // Main menu + case eMainMenuGroup_Main: + { + if(mbMainMenuActive) + { + //////////// + // Gamma correction pre menu + if(mbPremenuActive) + { + GuiPreMenu(afTimeStep); + } + ///////////// + // Main menu + else + { + GuiMainMenuSelection(); + } + } + //////////////// + // Pause menu + else + { + GuiPauseMenuSelection(); + } + break; + } + ////////////// + // StartGame + case eMainMenuGroup_StartGame: + { + GuiStartGame();break; + } + ////////////// + // LoadGame + case eMainMenuGroup_LoadGame: + { + GuiLoadGame();break; + } + ////////////// + // Options + case eMainMenuGroup_Options: + { + GuiOptions();break; + } + ////////////// + // Input Options + case eMainMenuGroup_Options_Input: + { + GuiOptionsInput();break; + } + ////////////// + // Keybind + case eMainMenuGroup_Options_Input_Keybind: + { + GuiOptionsInputKeybind();break; + } + ////////////// + // Mouse input Options + case eMainMenuGroup_Options_Input_Mouse: + { + GuiOptionsInputMouse(); break; + } + ////////////// + // Gamepad input options + case eMainMenuGroup_Options_Input_Gamepad: + { + GuiOptionsInputGamepad(); break; + } + ////////////// + // Gamepad mapping + case eMainMenuGroup_Options_Input_GamepadMapping: + { + GuiOptionsInputMapping();break; + } + ////////////// + // Eye tracking Options + case eMainMenuGroup_Options_Input_EyeTracking: + { + GuiOptionsInputEyeTracking();break; + } + ////////////// + // Gameplay Options + case eMainMenuGroup_Options_Gameplay: + { + GuiOptionsGameplay();break; + } + ////////////// + // Video Options + case eMainMenuGroup_Options_Video: + { + GuiOptionsVideo();break; + } + ////////////// + // Display Video Options + case eMainMenuGroup_Options_Video_Display: + { + GuiOptionsVideoDisplay();break; + } + ////////////// + // PostEffect Video Options + case eMainMenuGroup_Options_Video_PostEffect: + { + GuiOptionsVideoPostEffect();break; + } + ////////////// + // World Video Options + case eMainMenuGroup_Options_Video_World: + { + GuiOptionsVideoWorld();break; + } + ////////////// + // Gamma Video Options + case eMainMenuGroup_Options_Video_Gamma: + { + if(mbPauseMenuEnabled) + { + GuiOptionsVideoGamma();break; + } + else + { + GuiGammaCorrection();break; + } + } + ////////////// + // Audio Options + case eMainMenuGroup_Options_Audio: + { + GuiOptionsAudio();break; + } + //////////////// + // Game mode selection + case eMainMenuGroup_NewGame_ModeSelection: + { + GuiGameModeSelection(); break; + } + } + + OptionMenu_SetModColor(cColor(1, 1)); + OptionMenu_ResetExtraWidth(); + + ImGui_SetTransCategory(""); + + if(mbMainMenuActive) + { + cLux_GetCurrentImGui().ClipAreaBegin(cLux_GetHudVirtualCenterScreenStartPos(), cLux_GetHudVirtualCenterScreenSize()); + DrawParticles(afTimeStep); + cLux_GetCurrentImGui().ClipAreaEnd(); + } + } + + //------------------------------------------------------- + + void StartSavedGameLoad(const tWString &in asFile) + { + mbGameOver = false; + cLux_GetSaveHandler().DelayedLoadGameFromFile(asFile, "", "", true, true); + msPreviousSaveLoaded = asFile; + LoadScreen_SetUseSmallIcon(true); + LoadScreen_SetForceBackground(false); + SetMenuActive(false); + + gLastOnSomaScreen.LoadingStarted(); + + //gbMainMenuLoadingSavedGameStarted = true; + //gbMainMenuLoadingSavedGame_LoadHeaderDone = false; + //gbMainMenuLoadingSavedGameDone = false; + } + + //------------------------------------------------------- + + cImGuiParticleEmitter mEmitterLowerHalf; + cImGuiParticleEmitter mEmitterUpperHalf; + cImGuiParticleEmitter mEmitterLarge; + cImGuiParticleEmitter mEmitterSmoke; + bool mbEmitterSet = false; + eMainMenuPhase mCurrentBGPhase = eMainMenuPhase_Initial_To_1_3; + float mfBGAnimationTime = 0.0f; + float mfMinRedLightFlickerTime = 0.5f; + float mfMaxRedLightFlickerTime = 1.0f; + + float mfFrontFaceScale = 0.7f; + float mfBackFaceScale = 0.3f; + + bool mbShowingGammaMenu = false; + + void DrawParticles(float afTimeStep) + { + if(mbEmitterSet==false) + { + mbEmitterSet = true; + + mEmitterLowerHalf.mvGfx.insertLast(cImGuiGfx("dust_light_tiny.dds", eImGuiGfx_Texture)); + + mEmitterLowerHalf.mvMin = OptionMenu_GetBotRightOffset(cVector2f(0,0), 1.0f); + mEmitterLowerHalf.mvMax = OptionMenu_GetBotRightOffset(cVector2f(0,0), 2.0f); + mEmitterLowerHalf.mvMin.y = ImGui_NrmSize(0, 0.5f).y; + mEmitterLowerHalf.mvMax.y = ImGui_NrmSize(0, 1.0f).y; + + mEmitterLowerHalf.mvVelocityMin = cVector3f(-10.0f, 0, 0); + mEmitterLowerHalf.mvVelocityMax = cVector3f(-30.0f, 10, 0); + + mEmitterLowerHalf.mfSizeMin = 0.1f; + mEmitterLowerHalf.mfSizeMax = 0.25f; + mEmitterLowerHalf.mlMaxParticles = 100; + mEmitterLowerHalf.mfParticlesPerSec = 10.0f; + + mEmitterLowerHalf.mfMinLife = 15.0f; + mEmitterLowerHalf.mfMaxLife = 35.0f; + + mEmitterLowerHalf.mColorStartMin = cColor(0.7f,0.25f); + mEmitterLowerHalf.mColorStartMax = cColor(0.7f,0.75f); + mEmitterLowerHalf.mColorMulStart = cColor(1,1); + mEmitterLowerHalf.mColorMulMiddle = cColor(1,1); + mEmitterLowerHalf.mColorMulEnd = cColor(1,0); + + mEmitterLowerHalf.mfColorMulEndStartTime = 0.8f; + + + mEmitterUpperHalf.mvGfx.insertLast(cImGuiGfx("dust_light_tiny.dds", eImGuiGfx_Texture)); + + mEmitterUpperHalf.mvMin = OptionMenu_GetBotRightOffset(cVector2f(0,0), 1.0f); + mEmitterUpperHalf.mvMax = OptionMenu_GetBotRightOffset(cVector2f(0,0), 2.0f); + mEmitterUpperHalf.mvMin.y = ImGui_NrmSize(0, 0.0f).y; + mEmitterUpperHalf.mvMax.y = ImGui_NrmSize(0, 0.5f).y; + + mEmitterUpperHalf.mvVelocityMin = cVector3f(-10.0f, 0, 0); + mEmitterUpperHalf.mvVelocityMax = cVector3f(-30.0f, 10, 0); + + mEmitterUpperHalf.mfSizeMin = 0.1f; + mEmitterUpperHalf.mfSizeMax = 0.25f; + mEmitterUpperHalf.mlMaxParticles = 100; + mEmitterUpperHalf.mfParticlesPerSec = 5.0f; + + mEmitterUpperHalf.mfMinLife = 5.0f; + mEmitterUpperHalf.mfMaxLife = 20.0f; + + mEmitterUpperHalf.mColorStartMin = cColor(0.7f, 0.25f); + mEmitterUpperHalf.mColorStartMax = cColor(0.7f, 0.75f); + mEmitterUpperHalf.mColorMulStart = cColor(1,1); + mEmitterUpperHalf.mColorMulMiddle = cColor(1,1); + mEmitterUpperHalf.mColorMulEnd = cColor(1,0); + + mEmitterUpperHalf.mfColorMulEndStartTime = 0.8f; + + mEmitterLarge.mvGfx.insertLast(cImGuiGfx("dust_light_tiny.dds", eImGuiGfx_Texture)); + + mEmitterLarge.mvMin = OptionMenu_GetBotRightOffset(cVector2f(0,0), 1.0f); + mEmitterLarge.mvMax = OptionMenu_GetBotRightOffset(cVector2f(0,0), 2.0f); + mEmitterLarge.mvMin.y = ImGui_NrmSize(0, 0.0f).y; + mEmitterLarge.mvMax.y = ImGui_NrmSize(0, 1.0f).y; + + mEmitterLarge.mvVelocityMin = cVector3f(-10.0f, 0, 0); + mEmitterLarge.mvVelocityMax = cVector3f(-30.0f, 10, 0); + + mEmitterLarge.mfSizeMin = 0.3f; + mEmitterLarge.mfSizeMax = 0.5f; + mEmitterLarge.mlMaxParticles = 100; + mEmitterLarge.mfParticlesPerSec = 2.0f; + + mEmitterLarge.mfMinLife = 5.0f; + mEmitterLarge.mfMaxLife = 20.0f; + + mEmitterLarge.mColorStartMin = cColor(0.5f,0.25f); + mEmitterLarge.mColorStartMax = cColor(0.5f,0.75f); + mEmitterLarge.mColorMulStart = cColor(1,1); + mEmitterLarge.mColorMulMiddle = cColor(1,1); + mEmitterLarge.mColorMulEnd = cColor(1,0); + + mEmitterLarge.mfColorMulEndStartTime = 0.8f; + + + cImGuiGfx gfxCloudParticle("dust_cloud.dds", eImGuiGfx_Texture); + gfxCloudParticle.mMaterial = eGuiMaterial_Additive; + gfxCloudParticle.mvUVMin = cVector2f(0.0f, 0.0f); + gfxCloudParticle.mvUVMax = cVector2f(0.5f, 0.5f); + mEmitterSmoke.mvGfx.insertLast(gfxCloudParticle); + gfxCloudParticle.mvUVMin = cVector2f(0.0f, 0.5f); + gfxCloudParticle.mvUVMax = cVector2f(0.5f, 1.0f); + mEmitterSmoke.mvGfx.insertLast(gfxCloudParticle); + gfxCloudParticle.mvUVMin = cVector2f(0.5f, 0.0f); + gfxCloudParticle.mvUVMax = cVector2f(1.0f, 0.5f); + mEmitterSmoke.mvGfx.insertLast(gfxCloudParticle); + gfxCloudParticle.mvUVMin = cVector2f(0.5f, 0.5f); + gfxCloudParticle.mvUVMax = cVector2f(1.0f, 1.0f); + mEmitterSmoke.mvGfx.insertLast(gfxCloudParticle); + + mEmitterSmoke.mvMin = OptionMenu_GetBotRightOffset(cVector2f(0,0), 1.0f); + mEmitterSmoke.mvMax = OptionMenu_GetBotRightOffset(cVector2f(0,0), 2.0f); + mEmitterSmoke.mvMin.y = ImGui_NrmSize(0, 0.0f).y; + mEmitterSmoke.mvMax.y = ImGui_NrmSize(0, 1.0f).y; + + mEmitterSmoke.mvVelocityMin = cVector3f(-20.0f, 0, 0); + mEmitterSmoke.mvVelocityMax = cVector3f(-20.0f, 10, 0); + + mEmitterSmoke.mfSizeMin = 1.0f; + mEmitterSmoke.mfSizeMax = 3.0f; + mEmitterSmoke.mlMaxParticles = 50; + mEmitterSmoke.mfParticlesPerSec = 0.5f; + + mEmitterSmoke.mfMinLife = 30.0f; + mEmitterSmoke.mfMaxLife = 100.0f; + + mEmitterSmoke.mColorStartMin = cColor(0.25f,1.0f); + mEmitterSmoke.mColorStartMax = cColor(0.5f,1.0f); + mEmitterSmoke.mColorMulMiddle = cColor(0.5f,0.5f); + mEmitterSmoke.mColorMulEnd = cColor(0,0); + + mEmitterSmoke.mfColorMulEndStartTime = 0.8f; + + for(int i=0; i<1200; ++i) + { + mEmitterUpperHalf.Update(afTimeStep); + mEmitterLowerHalf.Update(afTimeStep); + mEmitterLarge.Update(afTimeStep); + mEmitterSmoke.Update(afTimeStep); + } + } + + mEmitterUpperHalf.Draw(afTimeStep); + mEmitterLowerHalf.Draw(afTimeStep); + mEmitterLarge.Draw(afTimeStep); + mEmitterSmoke.Draw(afTimeStep); + } + + void GuiBackground(float afTimeStep) + { + if(mbMainMenuActive) + { + ///////////////////////////////////// + // Background + cImGuiGfx gfx("menu_background.tga", eImGuiGfx_Texture); + ImGui_DrawGfx(gfx, OptionMenu_GetTopLeftOffset(cVector2f(0,0), -1.0f), OptionMenu_GetScaledSize(cVector2f(1280,720))); + + ///////////////////////////////////// + // Varying elements + + /*(DEBUG) menu stage cycling + if(cLux_ScriptDebugOn()) + { + if(ImGui_TimerExists("PhaseChange")==false) + { + mCurrentBGPhase++; + if(mCurrentBGPhase>eMainMenuPhase_AfterEnd) + mCurrentBGPhase = eMainMenuPhase_Initial_To_1_3; + + ImGui_AddTimer("PhaseChange", 5.0f); + } + }*/ + + tString sPhasePrefix = "p" + mCurrentBGPhase + "_"; + + //if( mbShowingGammaMenu==false && mbPremenuActive==false) + { + // Dirt corners + if(mCurrentBGPhase0) + { + cImGuiGfx gfxTitle("startmenu_title.tga", eImGuiGfx_Texture); + if(ImGui_TimerExists("TitleGlitchWait")==false) + { + ImGui_AddTimer("TitleGlitchWait", cMath_RandRectf(4.0f, 7.0f)); + } + if(ImGui_TimerOver("TitleGlitchWait")) + { + ImGui_SetStateInt("TitleGlitchTimes", cMath_RandRectl(3, 5)); + + //ImGui_FadeStateColor("LightColor", cColor(0.8f, 0.5f), cMath_RandRectf(0.05f, 0.25f), eEasing(cMath_RandRectl(int(eEasing_Linear), int(eEasing_LastEnum)))); + } + + int lTitleDistortTimes = ImGui_GetStateInt("TitleGlitchTimes",0); + + if(lTitleDistortTimes>0 && ImGui_TimerExists("TitleGlitch")==false) + { + ImGui_AddTimer("TitleGlitch", 0); + if(mbBackgroundTitleSounds) + Sound_PlayGui("special_fx/frontend/menu_glitch", 1.0f, eSoundEntryType_Gui); + } + + if(ImGui_TimerOver("TitleGlitch")) + { + if(lTitleDistortTimes>0) + { + ImGui_SetStateInt("TitleGlitchPic", cMath_RandRectl(1,4)); + ImGui_IncStateInt("TitleGlitchTimes", -1); + + ImGui_AddTimer("TitleGlitch", cMath_RandRectf(0.01f, 0.1f)); + } + else + { + ImGui_SetStateInt("TitleGlitchPic", 0); + } + } + + + cColor colorMul(1, mfBackgroundTitleAlpha); + + bool bTitleGlitching = false; + int lTitlePic = ImGui_GetStateInt("TitleGlitchPic", 0); + if(lTitlePic>0) + { + gfxTitle.SetFile("startmenu_title_flicker" + lTitlePic + ".tga"); + + bTitleGlitching = true; + } + + if(ImGui_TimerExists("TitlePulse")==false) + { + ImGui_AddTimer("TitlePulse", cMath_RandRectf(1, 4)); + } + + if(ImGui_TimerOver("TitlePulse")) + { + float fComponent = cMath_RandRectf(0.5f, 3.0f); + cColor goalColor(fComponent, cMath_Clamp(fComponent, 0, 1.0f)); + ImGui_FadeStateColor("TitleColor", goalColor, cMath_RandRectf(0.05f, 0.25f), eEasing(cMath_RandRectl(int(eEasing_Linear), int(eEasing_LastEnum)))); + } + + if(ImGui_FadeOver("TitleColor")) + { + ImGui_SetStateColor("TitleColor", cColor_White); + ImGui_AddTimer("TitlePulseWait", cMath_RandRectf(1.0f, 4.0f)); + } + + cColor titleCol = ImGui_GetStateColor("TitleColor", cColor(1.0, 1.0)); + ImGui_DrawGfx(gfxTitle, OptionMenu_GetTopLeftOffset(kTitlePos, 0.0), OptionMenu_GetScaledSize(kTitleSize), titleCol*colorMul); + + if(bTitleGlitching) + ImGui_DrawGfx(cImGuiGfx("startmenu_title.tga", eImGuiGfx_Texture), OptionMenu_GetTopLeftOffset(kTitlePos+cVector2f(20.0f), 1.0), OptionMenu_GetScaledSize(kTitleSize), cColor(1.0, 0.5f)*colorMul); + } + + mfBGAnimationTime += afTimeStep; + + cVector3f vLightPos = OptionMenu_GetTopLeftOffset(cVector2f(758, 76), 0.0f); + + //////////////////////////////// + // Face Alpa + if(mbBackgroundShowFace) + mfBackgroundFaceAlpha = cMath_IncreaseTo(mfBackgroundFaceAlpha, afTimeStep*0.5, 1.0f); + else + mfBackgroundFaceAlpha = cMath_IncreaseTo(mfBackgroundFaceAlpha, afTimeStep*0.5, 0.0f); + + //////////////////////////////// + // Draw face + if(mfBackgroundFaceAlpha>0) + { + cColor colorMul(mfBackgroundFaceAlpha, mfBackgroundFaceAlpha); + + // Pulsing red light + if(mCurrentBGPhase>eMainMenuPhase_Initial_To_1_3 && mCurrentBGPhase0.01f) + Depth_ImGui_DrawLineDistortedGfx(gfxLight, vLightPos, vLightSize, ImGui_GetStateColor("LightColor", cColor_White), fDistortAmount, 1.0f); + else + * */ + } + else if(mCurrentGroup!=eMainMenuGroup_Options_Video_Gamma) + { + ///////////////////////////////////// + // Background + cImGuiGfx gfx; + ImGui_DrawGfx(gfx, ImGui_NrmPos(0, 0, 19.0), ImGui_NrmSize(1.0), cColor(0, 0.75)); + } + } + + + void GuiBackground_DrawCathFacePart(const cImGuiGfx &in aGfx, + const cVector3f &in avFrontCenterPos, const cVector3f &in avBackCenterPos, + float afFrontScale, float afBackScale, + const cColor &in aFrontCol, const cColor &in aBackCol, + uint alLayers) + { + if(alLayers==0) alLayers = 1; + + cVector2f vOriginalSize = OptionMenu_GetScaledSize(GetUsedGfxSize(aGfx, -1)); + cVector2f vSize = vOriginalSize*afFrontScale; + + ImGui_DrawAlignedGfx(aGfx, avFrontCenterPos, eImGuiAlign_CenterCenter, vSize, aFrontCol); + + if(alLayers==1) return; + + alLayers--; + + cVector3f vDir = avBackCenterPos-avFrontCenterPos; + float fDistance = vDir.Normalize(); + cVector3f vStep = vDir*fDistance/alLayers; + + float fScale = afFrontScale; + float fScaleDiff = afBackScale-afFrontScale; + float fScaleStep = fScaleDiff/alLayers; + + cColor colStep(aBackCol.r-aFrontCol.r, aBackCol.g-aFrontCol.g, aBackCol.b-aFrontCol.b, aBackCol.a-aFrontCol.a); + colStep.r /= alLayers; + colStep.g /= alLayers; + colStep.b /= alLayers; + colStep.a /= alLayers; + + cVector3f vPos = avFrontCenterPos; + cColor col = aFrontCol; + + for(uint i=0; i fMax && (fWidth - fMax) > fExtraWidth) + fExtraWidth = (fWidth - fMax); + + cVector2f vExtraWidth = cVector2f(fExtraWidth, 0.f); + + //////////////// + // Title + OptionMenu_SectionTitle("NewGame", kGameModeBgPos + vExtraWidth, kGameModeBgSize); + ImGui_DrawFrame(mGfxFrame, OptionMenu_GetTopLeftOffset(kGameModeBgPos, 0.0), OptionMenu_GetScaledSize(kGameModeBgSize + vExtraWidth)); + + ////////////////////////// + // Draw mode selector + bool bGameModeSelectorSelected = msSelectedGameModeButton == "RightGameModeButton" || + msSelectedGameModeButton == "LeftGameModeButton"; + if (bGameModeSelectorSelected) + { + cImGuiGfx gfxSelected("startmenu_options_button_long_inverted", eImGuiGfx_Texture); + ImGui_DrawGfx(gfxSelected, OptionMenu_GetTopLeftOffset(kMainMenuButtonPos + cVector2f(-20, -10), 2.f), + OptionMenu_GetScaledSize(kOptionMenu_ButtonBgSize + cVector2f(15, 20) + vExtraWidth), kOptionMenu_ButtonBgColor*gOptionMenu_ModColor); + } + else + { + cImGuiGfx gfx("startmenu_options_button_meter", eImGuiGfx_Texture); + ImGui_DrawGfx(gfx, OptionMenu_GetTopLeftOffset(kMainMenuButtonPos + cVector2f(250, 0) + vExtraWidth, 1.0f), + OptionMenu_GetScaledSize(kOptionMenu_MultiSize + cVector2f(150, 30)), kOptionMenu_ButtonBgColor*gOptionMenu_ModColor); + } + + ////////////////////////// + // Set up button + cImGuiButtonData buttonData; + buttonData.mbUseBackgroundGfx = false; + buttonData.mbUseInFocusGfx = false; + buttonData.mbUseTriggeredGfx = false; + cImGuiGfx gfxArrow("startmenu_options_arrow"); + cColor color(1.f, 1.f); + + //////////////////////// + // Do buttons + color = msSelectedGameModeButton == "RightGameModeButton" ? cColor(1, 1) : cColor(0, 0, 0); + ImGui_DrawGfx(gfxArrow, OptionMenu_GetTopLeftOffset(kGameModeArrowPosRight + vExtraWidth, 3.0), OptionMenu_GetScaledSize(kGameModeArrowSize), color); + + cVector2f vButtonSize = OptionMenu_GetScaledSize(kGameModeArrowSize + cVector2f(145, -2)); + if (mbShowNewGame == false && + (ImGui_DoButtonExt("RightGameModeButton", "", buttonData, OptionMenu_GetTopLeftOffset(kGameModeArrowPosRight - cVector2f(130, 0) + vExtraWidth, 2.0), vButtonSize) || + mlActionHorizontal > 0)) + { + Sound_PlayGui("special_fx/frontend/frontend_menu_change", 1.0f, eSoundEntryType_Gui); + mlSelectedGameMode = mlSelectedGameMode == 1 ? 0 : 1; + msSelectedGameModeButton = "RightGameModeButton"; + } + + if (mbShowNewGame == false) + msSelectedGameModeButton = OptionMenu_UpdateFocus("RightGameModeButton", msSelectedGameModeButton); + + color = msSelectedGameModeButton == "LeftGameModeButton" ? cColor(1, 1) : cColor(0, 0, 0); + ImGui_SetModRotateAngle(180); + ImGui_DrawGfx(gfxArrow, OptionMenu_GetTopLeftOffset(kGameModeArrowPosLeft + vExtraWidth, 3.0), OptionMenu_GetScaledSize(kGameModeArrowSize), color); + ImGui_SetModRotateAngle(0); + + vButtonSize.x += 300.f; + if (mbShowNewGame == false && + (ImGui_DoButtonExt("LeftGameModeButton", "", buttonData, OptionMenu_GetTopLeftOffset(kMainMenuButtonPos + cVector2f(0, 1) + vExtraWidth, 2.0), vButtonSize) || + mlActionHorizontal < 0)) + { + Sound_PlayGui("special_fx/frontend/frontend_menu_change", 1.0f, eSoundEntryType_Gui); + mlSelectedGameMode = mlSelectedGameMode == 1 ? 0 : 1; + msSelectedGameModeButton = "LeftGameModeButton"; + } + + if (mbShowNewGame == false) + msSelectedGameModeButton = OptionMenu_UpdateFocus("LeftGameModeButton", msSelectedGameModeButton); + + ///////////////////// + // Set up label data + cImGuiTextFrameData frameData; + frameData.mFont.SetFile(Helper_Font_GetFontName(eLuxFontType_Sansation_Large_Bold)); + frameData.mFont.mvSize = cVector2f(44, 44); + frameData.mFont.mColor = bGameModeSelectorSelected ? cColor(0, 0, 0) : cColor(1, 1); + frameData.mbUseBackgroundGfx = false; + + + cVector2f vBgSize = OptionMenu_GetScaledSize(kGameModeBgSize * 0.9f); + cVector3f vSelectedModeLabelPos = OptionMenu_GetTopLeftOffset(kMainMenuButtonPos + cVector2f(123, 5) + vExtraWidth / 2.f, 2.0f); + + ////////////////////////// + // Selected game mode title + { + ImGui_DoTextFrameExt("GameMode", cVector2f(0), 3.0, 0.0, frameData, + OptionMenu_GetTopLeftOffset(kMainMenuButtonPos + cVector2f(5, 5), 2.0f), vBgSize + vExtraWidth); + + frameData.mFontAlign = eFontAlign_Center; + frameData.mFont.mColor = cColor(0,0,0);//bGameModeSelectorSelected ? cColor(1,1) : cColor(0,0,0); + tString sCurrMode = mlSelectedGameMode == 0 ? "NormalMode" : "ExplorationMode"; + ImGui_DoTextFrameExt(sCurrMode, cVector2f(0), 3.0, 0.0, frameData, vSelectedModeLabelPos, vBgSize + vExtraWidth); + } + + ///////////////////////// + // Mode description + { + frameData.mFont.SetFile(Helper_Font_GetFontName(eLuxFontType_Sansation_Large)); + frameData.mFont.mvSize = cVector2f(27, 27); + frameData.mFont.mColor = cColor(1, 1); + frameData.mFontAlign = eFontAlign_Left; + + cVector3f vDescPos = OptionMenu_GetTopLeftOffset(kMainMenuButtonPos + cVector2f(0, 52), 2.f); + + tString sSelectedModeDesc = mlSelectedGameMode == 0 ? "NormalModeDescription" : "ExplorationModeDescription"; + ImGui_DoTextFrameExt(sSelectedModeDesc, cVector2f(0, 10), 2.0, 0.0, frameData, vDescPos, vBgSize + vExtraWidth); + } + + ///////////////// + // Start game + { + if (OptionMenu_ButtonMainMenu("StartGame", kMainMenuButtonPos, 4, msSelectedGameModeButton, mlClickedGameModeSelectionButton)) + { + mlClickedGameModeSelectionButton = 0; + } + + if (mbShowNewGame == false) msSelectedGameModeButton = OptionMenu_UpdateFocus("StartGame", msSelectedGameModeButton); + } + + ///////////////// + // Back + { + bool bButton = OptionMenu_ButtonOptions("Back", kMainMenuButtonPos, 5, msSelectedGameModeButton); + bool bGamepad = ImGui_ActionTriggered(eImGuiAction_Cancel, true); + if(bButton || bGamepad) + { + mCurrentGroup = eMainMenuGroup_Main; + msFocusNextFrame = msSelectedMainMenuButton; + + msSelectedGameModeButton = "StartGame"; + mlSelectedGameMode = 0; + //////// + // Reset menu pos + if(bGamepad == false) + { + OptionMenu_GamepadButtons(false); + return; + } + } + + if (mbShowNewGame == false) msSelectedGameModeButton = OptionMenu_UpdateFocus("Back", msSelectedGameModeButton); + } + + /////////////////////////////// + // Selection correction + if (bGameModeSelectorSelected) + { + if (ImGui_ActionTriggered(eImGuiAction_Down)) msFocusNextFrame = msSelectedGameModeButton = "StartGame"; + if (ImGui_ActionTriggered(eImGuiAction_Up)) msFocusNextFrame = msFocusNextFrame = "Back"; + } + + ///////////////////////// + // Button selection + if (ImGui_TimerOver("ButtonClicked")) + { + ///////////////// + // After the delay, perform the button click + ImGui_StopTimer("ButtonClicked"); + + if (mlClickedGameModeSelectionButton == 0) + { + if (mbCanContinue) + { + // Show message box to confirm + mbShowNewGame = true; + msFocusNextFrame = "No"; + msMessageBoxFocus = "No"; + } + else + { + ClickNewGame(); + } + } + + mlClickedGameModeSelectionButton = -1; + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(true); + } + + //------------------------------------------------------- + + void GuiMainMenuSelection() + { + // @jgarcia + if (Platform_IsXBO()) + { + cImGuiLabelData labelData; + labelData.mFont.SetFile(Helper_Font_GetFontName(eLuxFontType_Sansation_Medium)); + labelData.mFont.mvSize = cVector2f(28,28); + labelData.mFont.mColor = cColor(1,1); + labelData.mFontAlign = eFontAlign_Center; + tWString userName = Users_GetCurrentUser(); + cLux_GetCurrentImGui().DoLabel(userName, labelData, OptionMenu_GetTopLeftOffset(cVector2f(0, 0), 0.00001)); + } + + ///////////////// + // Continue + if (mbSaveLoadEnabled == false) + { + } + else if(mbCanContinue && !mbGameOver) + { + if(OptionMenu_ButtonMainMenu("Continue", kMainMenuButtonPos,0, msSelectedMainMenuButton, mlClickedMainMenuButton)) + { + mlClickedMainMenuButton = 0; + Sound_Stop("MenuBGNoise", 2.0f); + Music_StopAll(2.0f); + } + + msSelectedMainMenuButton = OptionMenu_UpdateFocus("Continue", msSelectedMainMenuButton); + } + else + { + ////////////// + // Not possible to continue, disable it and render it as a label instead + cImGuiLabelData labelData; + labelData.mFont.SetFile(Helper_Font_GetFontName(eLuxFontType_Sansation_Large_Bold)); + labelData.mFont.mvSize = cVector2f(36, 36); + labelData.mFont.mColor = kDisabledColor; + + ImGui_DoLabelExt("Continue",labelData, OptionMenu_GetTopLeftOffset(kMainMenuButtonPos, 1.0)); + } + + ///////////////// + // New Game + { + if(OptionMenu_ButtonMainMenu("NewGame", kMainMenuButtonPos, 1, msSelectedMainMenuButton, mlClickedMainMenuButton)) + { + mlClickedMainMenuButton = 1; + } + + msSelectedMainMenuButton = OptionMenu_UpdateFocus("NewGame", msSelectedMainMenuButton); + } + + ///////////////// + // Load Game + { + if (mbSaveLoadEnabled == false) + { + } + else if(mbCanContinue) + { + if(OptionMenu_ButtonMainMenu("LoadGame", kMainMenuButtonPos, 2, msSelectedMainMenuButton, mlClickedMainMenuButton)) + { + mlClickedMainMenuButton = 2; + } + + msSelectedMainMenuButton = OptionMenu_UpdateFocus("LoadGame", msSelectedMainMenuButton); + } + else + { + ////////////// + // No games to load + cImGuiLabelData labelData; + labelData.mFont.SetFile(Helper_Font_GetFontName(eLuxFontType_Sansation_Large_Bold)); + labelData.mFont.mvSize = cVector2f(36, 36); + labelData.mFont.mColor = kDisabledColor; + + ImGui_DoLabelExt("LoadGame",labelData, OptionMenu_GetTopLeftOffset(kMainMenuButtonPos + cVector2f(0, kOptionMenu_ButtonSpacing * 2.0), 1.0)); + } + } + + ///////////////// + // Options + { + if(OptionMenu_ButtonMainMenu("Options", kMainMenuButtonPos, 3, msSelectedMainMenuButton, mlClickedMainMenuButton)) + { + mlClickedMainMenuButton = 3; + } + + msSelectedMainMenuButton = OptionMenu_UpdateFocus("Options", msSelectedMainMenuButton); + } + + ///////////////// + // Exit + if( Platform_IsPS4() == false && Platform_IsXBO() == false ) + { + if(OptionMenu_ButtonMainMenu("Exit", kMainMenuButtonPos, 4, msSelectedMainMenuButton, mlClickedMainMenuButton)) + { + mlClickedMainMenuButton = 4; + } + + msSelectedMainMenuButton = OptionMenu_UpdateFocus("Exit", msSelectedMainMenuButton); + } + + ///////////////// + // Change Profile @jgarcia + if( Platform_IsXBO() ) + { + if(OptionMenu_ButtonMainMenu("ChangeProfile", kMainMenuButtonPos, 4, msSelectedMainMenuButton, mlClickedMainMenuButton)) + { + mlClickedMainMenuButton = 5; + } + + msSelectedMainMenuButton = OptionMenu_UpdateFocus("ChangeProfile", msSelectedMainMenuButton); + } + + if(ImGui_TimerOver("ButtonClicked")) + { + ///////////////// + // After the delay, perform the button click + ImGui_StopTimer("ButtonClicked"); + + switch(mlClickedMainMenuButton) + { + case 0: + /////////// + // Load the last save + ImGui_AddTimer("Continue", mfFadeLength); + cSound_FadeOutAll(eSoundEntryType_WorldAll, 1.0f / mfFadeLength, false); + Music_StopAll(mfFadeLength); + Sound_Stop("MenuBGNoise", 2.0f); + cLux_GetGuiHandler().SetGameHudInputFocus(false); + return; + + //break; + case 1: + // New game + + if(mbCanContinue) + { + if (cLux_GetSupportExplorationMode()) + { + mCurrentGroup = eMainMenuGroup_NewGame_ModeSelection; + msFocusNextFrame = "StartGame"; + } + else + { + // Show message box to confirm + mbShowNewGame = true; + msFocusNextFrame = "No"; + msMessageBoxFocus = "No"; + } + } + else + { + if (cLux_GetSupportExplorationMode()) + { + mCurrentGroup = eMainMenuGroup_NewGame_ModeSelection; + } + else + { + ClickNewGame(); + } + } + break; + case 2: + // Load + mCurrentGroup = eMainMenuGroup_LoadGame; + break; + case 3: + // Open options and set focus + mCurrentGroup = eMainMenuGroup_Options; + + msFocusNextFrame = msSelectedOptionsButton; + + break; + case 4: + // Exit + mbShowExit = true; + msFocusNextFrame = "No"; + msMessageBoxFocus = "No"; + break; + case 5: + // Change profile + Users_ChangeCurrentUser(); + break; + } + + mlClickedMainMenuButton = -1; + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(false); + } + + //------------------------------------------------------- + + void GuiPauseMenuSelection() + { + ///////////////// + // Continue + { + if(OptionMenu_ButtonMainMenu("ReturnToGame", kMainMenuButtonPos,0, msSelectedPauseMenuButton, mlClickedPauseMenuButton)) + { + mlClickedPauseMenuButton = 0; + } + + msSelectedPauseMenuButton = OptionMenu_UpdateFocus("ReturnToGame", msSelectedPauseMenuButton); + } + + ///////////////// + // Options + { + if(OptionMenu_ButtonMainMenu("Options", kMainMenuButtonPos, 1, msSelectedPauseMenuButton, mlClickedPauseMenuButton)) + { + mlClickedPauseMenuButton = 1; + } + + msSelectedPauseMenuButton = OptionMenu_UpdateFocus("Options", msSelectedPauseMenuButton); + } + + + + ///////////////// + // Exit + { + if(OptionMenu_ButtonMainMenu("Exit", kMainMenuButtonPos, 2, msSelectedPauseMenuButton, mlClickedPauseMenuButton)) + { + mlClickedPauseMenuButton = 2; + } + + msSelectedPauseMenuButton = OptionMenu_UpdateFocus("Exit", msSelectedPauseMenuButton); + } + + ///////////////// + // Save and exit + if (mbSaveLoadEnabled == false) + { + } + else if ( (Map_IsChanging()==false)&&(cScript_GetGlobalVarBool("InIntro")==false) ) + { + if(OptionMenu_ButtonMainMenu("SaveAndExit", kMainMenuButtonPos, 3, msSelectedPauseMenuButton, mlClickedPauseMenuButton)) + { + mlClickedPauseMenuButton = 3; + } + + msSelectedPauseMenuButton = OptionMenu_UpdateFocus("SaveAndExit", msSelectedPauseMenuButton); + } + else + { + ////////////// + // Not possible to save and exit, disable it and render it as a label instead + cImGuiLabelData labelData; + labelData.mFont.SetFile(Helper_Font_GetFontName(eLuxFontType_Sansation_Large_Bold)); + labelData.mFont.mvSize = cVector2f(36, 36); + labelData.mFont.mColor = kDisabledColor; + + ImGui_DoLabelExt("SaveAndExit",labelData, OptionMenu_GetTopLeftOffset(kMainMenuButtonPos+ cVector2f(0, kOptionMenu_ButtonSpacing * 3.0f), 1.0)); + } + + ////////////// + // Show playgo? + int lETA = 0; + if(cLux_IsPlayGoReady(lETA) == false && cScript_GetGlobalVarBool("PlayGo")) + { + ////////////// + // Display text telling the player that they cant progress yet + float fPulse = ImGui_FadeOscillateFloat("PlayGoPulse", 1, 0.8f, 1.5); + cImGuiLabelData labelData; + labelData.mFont.SetFile(Helper_Font_GetFontName(eLuxFontType_Sansation_XLarge_Bold)); + labelData.mFont.mvSize = cVector2f(36, 36); + labelData.mFont.mColor = cColor(fPulse,fPulse); + labelData.mFontAlign = eFontAlign_Center; + + ImGui_DoLabelExt("PlayGoInstructions",labelData, OptionMenu_GetTopLeftOffset(kMainMenuButtonPos - cVector2f(0, 100), 1.0), cVector2f(1000, 32)); + + /////////////// + // Time left to progress + tString sCat = ImGui_GetTransCategory(); + ImGui_SetTransCategory(""); + + int lSeconds = lETA % 60; + int lMinutes = (lETA / 60) % 60; + int lHour = (lETA / 3600); + + tString sTime; + + if( Platform_IsXBO() ) + { + if(lETA > 0) sTime += lETA + "%"; + } + else + { + if(lHour > 9) sTime += lHour + ":"; + else if(lHour > 0) sTime += "0"+lHour + ":"; + + if(lMinutes > 9) sTime += lMinutes + ":"; + else if(lMinutes > 0) sTime += "0"+lMinutes + ":"; + + if(lSeconds > 9) sTime += lSeconds; + else if(lSeconds > 0) sTime += "0"+lSeconds; + } + + ImGui_DoLabelExt(sTime,labelData, OptionMenu_GetTopLeftOffset(kMainMenuButtonPos - cVector2f(0, 64), 1.0), cVector2f(1000, 32)); + ImGui_SetTransCategory(sCat); + } + + if(ImGui_ActionTriggered(eImGuiAction_Cancel, true)) + { + ///////////// + // Disable menu + SetMenuActive(false); + return; + } + + if(ImGui_TimerOver("ButtonClicked")) + { + ///////////////// + // After the delay, perform the button click + ImGui_StopTimer("ButtonClicked"); + + switch(mlClickedPauseMenuButton) + { + case 0: + // return to game + SetMenuActive(false); + break; + case 1: + // Options + mCurrentGroup = eMainMenuGroup_Options; + + msFocusNextFrame = msSelectedOptionsButton; + break; + case 3: + mbSaveAndExit = true; + case 2: + // Exit + mbShowExit = true; + msFocusNextFrame = "No"; + msMessageBoxFocus = "No"; + break; + } + + mlClickedPauseMenuButton = -1; + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(false); + + } + + //------------------------------------------------------- + + void GuiOptions() + { + //////////////////////////////////// + // Options background + + //////////////// + // Title + OptionMenu_SectionTitle("Options", kOptionsBgPos, kOptionsBgSize); + + ImGui_DrawFrame(mGfxFrame, OptionMenu_GetTopLeftOffset(kOptionsBgPos, 0.0), OptionMenu_GetScaledSize(kOptionsBgSize)); + + ///////////////// + // Gameplay + { + if(OptionMenu_ButtonOptions("Gameplay", kMainMenuButtonPos, 0, msSelectedOptionsButton)) + { + mCurrentGroup = eMainMenuGroup_Options_Gameplay; + msFocusNextFrame = msSelectedGameplayButton; + } + + msSelectedOptionsButton = OptionMenu_UpdateFocus("Gameplay", msSelectedOptionsButton); + } + + ///////////////// + // Controls + { + if(OptionMenu_ButtonOptions("Controls", kMainMenuButtonPos, 1, msSelectedOptionsButton)) + { + mCurrentGroup = eMainMenuGroup_Options_Input; + msFocusNextFrame = msSelectedInputButton; + } + + msSelectedOptionsButton = OptionMenu_UpdateFocus("Controls", msSelectedOptionsButton); + } + + ///////////////// + // Video + if( Platform_IsPS4() == false && Platform_IsXBO() == false ) + { + if(OptionMenu_ButtonOptions("Video", kMainMenuButtonPos, 2, msSelectedOptionsButton)) + { + mCurrentGroup = eMainMenuGroup_Options_Video; + msFocusNextFrame = msSelectedVideoButton; + } + + msSelectedOptionsButton = OptionMenu_UpdateFocus("Video", msSelectedOptionsButton); + } + else + { + if(OptionMenu_ButtonOptions("Gamma", kMainMenuButtonPos, 2, msSelectedOptionsButton)) + { + mbShowingGammaMenu = true; + /*if(mbMainMenuActive) + { + mCurrentGroup = eMainMenuGroup_Main; + msFocusNextFrame = "Gamma"; + mlCurrentOptionChange = mlOptionChanges; + } + else*/ + { + mCurrentGroup = eMainMenuGroup_Options_Video_Gamma; + msFocusNextFrame = msSelectedVideoGammaButton; + } + } + + msSelectedOptionsButton = OptionMenu_UpdateFocus("Gamma", msSelectedOptionsButton); + } + + ///////////////// + // Audio + { + if(OptionMenu_ButtonOptions("Audio", kMainMenuButtonPos, 3, msSelectedOptionsButton)) + { + mCurrentGroup = eMainMenuGroup_Options_Audio; + msFocusNextFrame = msSelectedAudioButton; + } + + msSelectedOptionsButton = OptionMenu_UpdateFocus("Audio", msSelectedOptionsButton); + } + + ///////////////// + // Back + { + bool bButton = OptionMenu_ButtonOptions("Back", kMainMenuButtonPos, 5, msSelectedOptionsButton); + bool bGamepad = ImGui_ActionTriggered(eImGuiAction_Cancel, true); + if(bButton || bGamepad) + { + mCurrentGroup = eMainMenuGroup_Main; + msFocusNextFrame = mbMainMenuActive ? msSelectedMainMenuButton : msSelectedPauseMenuButton; + + //////// + // Reset menu pos + if(bGamepad == false) + { + OptionMenu_GamepadButtons(false); + msSelectedOptionsButton = "Video"; + return; + } + } + + msSelectedOptionsButton = OptionMenu_UpdateFocus("Back", msSelectedOptionsButton); + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(false); + } + + //------------------------------------------------------- + + void GuiStartGame() + { + ////////////////// + // Draw the save slots + cVector2f vPos = kSaveSlotPos; + vPos.x = (1280.0 / 2.0) * (720.0 / 1280.0) / (cGraphics_GetLowLevel().GetScreenSizeFloat().y / cGraphics_GetLowLevel().GetScreenSizeFloat().x); + float fSpacingMul = 2.0 * vPos.x / 1024.0; + for(int i = 0; i < 5; ++i) + { + OptionMenu_SaveSlot("SaveSlot"+i, vPos + kSaveSlotSpacing * (i - 2.5 + (fSpacingMul - 1.0) / 2.0) * fSpacingMul, (i % 2) == 0 ? "gamma_background" : "", msSelectedStartButton, msSelectedStartButton); + } + + ///////////////// + // Back + { + bool bButton = OptionMenu_ButtonOptions("Back", kMainMenuButtonPos, 8, msSelectedStartButton); + bool bGamepad = ImGui_ActionTriggered(eImGuiAction_Cancel, true); + + if(bButton || bGamepad) + { + mCurrentGroup = eMainMenuGroup_Main; + + msFocusNextFrame = msSelectedMainMenuButton; + ApplySettings(); + + ////////// + // Reset menu pos + if(bGamepad == false) + { + OptionMenu_GamepadButtons(msSelectedStartButton != "Back"); + return; + } + } + + msSelectedStartButton = OptionMenu_UpdateFocus("Back", msSelectedStartButton); + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(msSelectedStartButton != "Back"); + } + + //------------------------------------------------------- + + void GuiLoadGame() + { + + //////////////////////////////////// + // Options background + + ImGui_DrawFrame(mGfxFrame, OptionMenu_GetTopLeftOffset(kOptionsBgPos, 0.0), OptionMenu_GetScaledSize(kLoadWindowBgSize)); + + cImGuiGfx gfx; + ImGui_DrawGfx(gfx, OptionMenu_GetTopLeftOffset(kLoadBgPos, 0.01), OptionMenu_GetScaledSize(kLoadBgSize), cColor(0.0, 1.0)); + + //////////////// + // Title + OptionMenu_SectionTitle("LoadGame", kOptionsBgPos, kLoadWindowBgSize); + + ////////////// + // Catch input + int lActionVertical = 0; + bool bMouseDown = false; + float fPadding = mbScrollingSaveList ? 10000 : 5; + + int lMaxShownItems = 10; + + ////////////////////////////////////////// + // Possible values for lActionVertical: + // 0: nothing to do + // -1: moves focus up one entry + // -2: moves list up by one entry + // +1: moves focus down one entry + // +2: moves list down one entry + if(mbShowLoadGame == false) + { + if(ImGui_ActionTriggered(eImGuiAction_Down, true)) lActionVertical++; + if(ImGui_ActionTriggered(eImGuiAction_Up, true)) lActionVertical--; + if(ImGui_ActionTriggered(eImGuiAction_ScrollDown, true) && (mlSaveFileOffset + mlSelectedLoadButton) < mvSaveNames.size()-1 && mlSelectedLoadButton != lMaxShownItems) lActionVertical+=2; + if(ImGui_ActionTriggered(eImGuiAction_ScrollUp, true) && (mlSaveFileOffset + mlSelectedLoadButton) > 0 && mlSelectedLoadButton != lMaxShownItems) lActionVertical-=2; + bMouseDown = ImGui_ActionIsDown(eImGuiAction_MouseLeft, false); + } + + //////////////// + // Draw a list of all save files + int c = 0; + + for(int i=mlSaveFileOffset; i=0) + { + sDisplayedName = cString_SubW(sDisplayedName, lSubPos+8, -1); + } + + if(OptionMenu_ButtonSaveFile("Save"+c, sDisplayedName, mvSaveDates[i], kLoadBgPos + cVector2f(26, c * kLoadSpacing), + kLoadBgPos + cVector2f(590, c * kLoadSpacing+5), mlSelectedLoadButton == c)) + { + if(bMouseDown == false || OptionMenu_GetMouseInside(kLoadScrollPos - cVector2f(fPadding, 0), + kLoadScrollPos + kLoadScrollSize + cVector2f(10000, 0)).y == -1) + { + mlSaveFileToLoad = i; + mbShowLoadGame = true; + msMessageBoxFocus = "No"; + msFocusNextFrame="No"; + } + } + + if(bMouseDown == false) + { + if (ImGui_PrevBecameInFocus()) + { + mlSelectedLoadButton = c; + } + } + c++; + } + + ////////////// + // Update focus + if(lActionVertical != 0) + { + ////////// + // Select file + if(lActionVertical<0) // Scroll up + { + if(lActionVertical==-1) + { + if (mlSelectedLoadButton==lMaxShownItems) // Back button + { + mlSelectedLoadButton = cMath_Min(mvSaveNames.size() - 1, lMaxShownItems-1); + } + else + { + mlSelectedLoadButton--; + if(mlSelectedLoadButton < 0) + { + if(mlSaveFileOffset > 0) + { + mlSelectedLoadButton = 0; + mlSaveFileOffset--; + } + else + { + mlSelectedLoadButton = lMaxShownItems; + } + } + } + } + else + { + // Scrolling with Wheel + if(mlSaveFileOffset > 0) + { + mlSaveFileOffset--; + } + } + } + else // Scroll down + { + if(lActionVertical==1) + { + if (mlSelectedLoadButton==lMaxShownItems) // Back button + { + mlSelectedLoadButton = 0; + } + else + { + mlSelectedLoadButton++; + if(mlSelectedLoadButton >= cMath_Min(mvSaveNames.size(),lMaxShownItems) ) + { + if(mlSaveFileOffset lMaxShownItems) + { + //////////// + // Update input + float fFiles = mvSaveNames.size(); + int lOldOffset = mlSaveFileOffset; + float fMouseScrollY = OptionMenu_GetMouseInside(kLoadScrollPos - cVector2f(fPadding, 0), kLoadScrollPos + kLoadScrollSize + cVector2f(fPadding, 0)).y; + + if(fMouseScrollY != -1.0) + { + /////////// + // Mouse touching scroll, check if button pressed + if(bMouseDown) + { + mlSaveFileOffset = cMath_RoundToInt((fFiles-lMaxShownItems) * fMouseScrollY); + mbScrollingSaveList = true; + } + } + + if(bMouseDown == false) + { + //////// + // Stopped scrolling + mbScrollingSaveList = false; + } + + mlSaveFileOffset = cMath_Clamp(mlSaveFileOffset, 0, mvSaveNames.size() - lMaxShownItems); + + if(mlSelectedLoadButton >= 0 && mlSelectedLoadButton < 10 && (mlSaveFileOffset - lOldOffset) != 0) + { + int lDiff = (mlSaveFileOffset - lOldOffset); + mlSelectedLoadButton = cMath_Clamp(mlSelectedLoadButton - lDiff, 0, 9); + } + + float fScaleY = 1.0 - (fFiles - 10.0) / fFiles; + float fPosY = 0; + if (fFiles>lMaxShownItems) + fPosY = (mlSaveFileOffset) / (fFiles-lMaxShownItems); + ImGui_DrawGfx(gfx, OptionMenu_GetTopLeftOffset(kLoadScrollPos + kLoadScrollSize * cVector2f(0, (1.0 - fScaleY) * fPosY), 0.01), OptionMenu_GetScaledSize(kLoadScrollSize * cVector2f(1, fScaleY)), ((fMouseScrollY == -1.0f && mbScrollingSaveList == false) || mbShowLoadGame) ? kMainMenuButtonBgColor : cColor(1,1)); + } + + ///////////////// + // Back + { + bool bButton = OptionMenu_ButtonOptions("Back", kMainMenuButtonPos, 8, mlSelectedLoadButton < lMaxShownItems ? ("Save"+mlSelectedLoadButton) : "Back"); + bool bGamepad = ImGui_ActionTriggered(eImGuiAction_Cancel, true); + if(bButton || bGamepad) + { + mCurrentGroup = eMainMenuGroup_Main; + msFocusNextFrame = msSelectedMainMenuButton; + + //////// + // Reset menu pos + if(bGamepad == false) + { + mlSelectedLoadButton = 0; + OptionMenu_GamepadButtons(false); + } + + return; + } + + if(bMouseDown == false) + { + if (ImGui_PrevBecameInFocus()) + { + //cLux_AddTodoMessage("Sound: Menu focus changed"); + Sound_PlayGui("special_fx/frontend/frontend_menu_focus", 1.0f, eSoundEntryType_Gui); + mlSelectedLoadButton = lMaxShownItems; + } + } + } + + /////////// + // Manual focus since we catch input + if(mbShowLoadGame == false) + { + if(mlSelectedLoadButton >= 0 && mlSelectedLoadButton < 10) msFocusNextFrame = "Save"+mlSelectedLoadButton; + else msFocusNextFrame = "Back"; + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(false); + } + + //------------------------------------------------------- + + void GuiOptionsInput() + { + if(Platform_IsPS4() || Platform_IsXBO()) + { + OptionMenu_UpdateExtraWidth("GamepadSens", false); + OptionMenu_UpdateExtraWidth("InvertGamepadY", true); + OptionMenu_UpdateExtraWidth("PadVibration", true); + OptionMenu_UpdateExtraButtonWidth_Toggle(); + } + + //////////////////////////////////// + // Options background + cVector2f vSize = kInputBgSize; + if (Platform_IsPS4() || Platform_IsXBO()) vSize = kInputGamepadBgSize; + else if (EyeTracking_IsAvailable()) vSize = kInputEyeTrackingBgSize; + + ImGui_DrawFrame(mGfxFrame, OptionMenu_GetTopLeftOffset(kOptionsBgPos, 0.0), OptionMenu_GetScaledSize(vSize+cVector2f(OptionMenu_GetExtraWidth(), 0))); + + //////////////// + // Title + OptionMenu_SectionTitle("Controls", kOptionsBgPos, vSize); + + int lY = 0; + + if( Platform_IsPS4() == false && Platform_IsXBO() == false ) + { + ///////////////// + // Controls + { + if(OptionMenu_ButtonOptions("Keybind", kMainMenuButtonPos, lY++, msSelectedInputButton)) + { + mCurrentGroup = eMainMenuGroup_Options_Input_Keybind; + msFocusNextFrame = msSelectedInputButton; + mbKeybindChanged = false; + mbBindingGamepad = false; + mKeyBindBackDest = eMainMenuGroup_Options_Input; + msKeyBindBackFocus = msSelectedInputButton; + + mpKeyConfig.Save(); + } + + msSelectedInputButton = OptionMenu_UpdateFocus("Keybind", msSelectedInputButton); + } + + ///////////////// + // Mouse options + { + if(OptionMenu_ButtonOptions("MouseOptions", kMainMenuButtonPos, lY++, msSelectedInputButton)) + { + mCurrentGroup = eMainMenuGroup_Options_Input_Mouse; + msFocusNextFrame = msSelectedInputMouseButton; + mpKeyConfig.Save(); + } + + msSelectedInputButton = OptionMenu_UpdateFocus("MouseOptions", msSelectedInputButton); + } + + ///////////////// + // Gamepad options + { + if(OptionMenu_ButtonOptions("GamepadOptions", kMainMenuButtonPos, lY++, msSelectedInputButton)) + { + mCurrentGroup = eMainMenuGroup_Options_Input_Gamepad; + msFocusNextFrame = msSelectedInputGamepadButton; + mpKeyConfig.Save(); + } + + msSelectedInputButton = OptionMenu_UpdateFocus("GamepadOptions", msSelectedInputButton); + } + + ///////////////// + // Eye tracking + if (EyeTracking_IsAvailable()) + { + if (OptionMenu_ButtonOptions("EyeTracking", kMainMenuButtonPos, lY++, msSelectedInputButton)) + { + mCurrentGroup = eMainMenuGroup_Options_Input_EyeTracking; + msFocusNextFrame = ""; + mpKeyConfig.Save(); + } + + msSelectedInputButton = OptionMenu_UpdateFocus("EyeTracking", msSelectedInputButton); + } + + } + else + { + // For PS4, show gamepad options + GuiOptionsInputGamepadContents(lY, lY, eMainMenuGroup_Options_Input, msSelectedInputButton, msSelectedInputButton); + } + + ///////////////// + // Back + { + bool bButton = OptionMenu_ButtonOptions("Back", kMainMenuButtonPos, lY + 1, msSelectedInputButton); + bool bGamepad = ImGui_ActionTriggered(eImGuiAction_Cancel, true); + + if(bButton || bGamepad) + { + mCurrentGroup = eMainMenuGroup_Options; + + msFocusNextFrame = msSelectedOptionsButton; + ApplySettings(); + + ////////// + // Reset menu pos + if(bGamepad == false) + { + OptionMenu_GamepadButtons(false); + msSelectedInputButton = "Keybind"; + return; + } + } + + msSelectedInputButton = OptionMenu_UpdateFocus("Back", msSelectedInputButton); + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(false); + } + + //------------------------------------------------------- + + void GuiOptionsInputMouse() + { + ////////////////////////////////////////////////// + // Check if extra width needed for translations + { + OptionMenu_UpdateExtraWidth("MouseSens", false); + OptionMenu_UpdateExtraWidth("InvertMouseY", true); + OptionMenu_UpdateExtraWidth("SmoothMouse", true); + OptionMenu_UpdateExtraButtonWidth_Toggle(); + } + + //////////////////////////////////// + // Options background + cVector2f vSize = kInputBgSize; + + ImGui_DrawFrame(mGfxFrame, OptionMenu_GetTopLeftOffset(kOptionsBgPos, 0.0), OptionMenu_GetScaledSize(vSize+cVector2f(OptionMenu_GetExtraWidth(), 0))); + + //////////////// + // Title + OptionMenu_SectionTitle("MouseOptions", kOptionsBgPos, vSize); + + int lY = 0; + + ///////////////// + // Mouse sensitivity + { + float fValue = mpConfig.GetFloat("Input", "MouseSensitivity", 1.0f); + fValue -= 0.01f; + fValue /= 4.0f; + fValue = OptionMenu_ButtonOptionsSlider("MouseSens", kMainMenuButtonPos, lY++, msSelectedInputMouseButton, fValue, 0.2f / 4.0f, mlActionHorizontal, ""); + fValue *= 4.0f; + fValue += 0.01f; + mpConfig.SetFloat("Input", "MouseSensitivity", fValue); + + msSelectedInputMouseButton = OptionMenu_UpdateFocus("MouseSens", msSelectedInputMouseButton); + } + + ///////////////// + // Invert Mouse Y + { + bool bValue = mpConfig.GetBool("Input", "InvertMouse", false); + bValue = OptionMenu_ButtonOptionsToggle("InvertMouseY", kMainMenuButtonPos, lY++, msSelectedInputMouseButton, bValue, mlActionHorizontal); + mpConfig.SetBool("Input", "InvertMouse", bValue); + + msSelectedInputMouseButton = OptionMenu_UpdateFocus("InvertMouseY", msSelectedInputMouseButton); + } + + ///////////////// + // Smooth mouse + { + bool bValue = mpConfig.GetBool("Input", "SmoothMouse", true); + bValue = OptionMenu_ButtonOptionsToggle("SmoothMouse", kMainMenuButtonPos, lY++, msSelectedInputMouseButton, bValue, mlActionHorizontal); + mpConfig.SetBool("Input", "SmoothMouse", bValue); + msSelectedInputMouseButton = OptionMenu_UpdateFocus("SmoothMouse", msSelectedInputMouseButton); + } + + ///////////////// + // Back + { + bool bButton = OptionMenu_ButtonOptions("Back", kMainMenuButtonPos, lY + 1, msSelectedInputMouseButton); + bool bGamepad = ImGui_ActionTriggered(eImGuiAction_Cancel, true); + + if(bButton || bGamepad) + { + mCurrentGroup = eMainMenuGroup_Options_Input; + + msFocusNextFrame = msSelectedInputButton; + ApplySettings(); + + ////////// + // Reset menu pos + if(bGamepad == false) + { + OptionMenu_GamepadButtons(msSelectedInputMouseButton != "Back"); + msSelectedInputMouseButton = "MouseSens"; + return; + } + } + + msSelectedInputMouseButton = OptionMenu_UpdateFocus("Back", msSelectedInputMouseButton); + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(msSelectedInputMouseButton != "Back"); + } + + //------------------------------------------------------- + + eMainMenuGroup mGamepadMappingBackDest = eMainMenuGroup_Options_Input_Gamepad; + void GuiOptionsInputGamepadContents(const int &in alInY, int &out alOutY, eMainMenuGroup aMappingBackDest, const tString &in asInSelectedButton, tString &out asOutSelectedButton) + { + int lY = alInY; + + asOutSelectedButton = asInSelectedButton; + + mGamepadMappingBackDest = aMappingBackDest; + ///////////////// + // Mapping + { + if(OptionMenu_ButtonOptions("GamepadMapping", kMainMenuButtonPos, lY++, asOutSelectedButton)) + { + mCurrentGroup = eMainMenuGroup_Options_Input_GamepadMapping; + msFocusNextFrame = "Back"; + mpKeyConfig.Save(); + } + + asOutSelectedButton = OptionMenu_UpdateFocus("GamepadMapping", asOutSelectedButton); + } + + ///////////////// + // Gamepad Sens + { + float fValue = mpConfig.GetFloat("Input", "GamepadSensitivity", 2.0f); + fValue -= 0.01f; + fValue /= 5.0f; + fValue = OptionMenu_ButtonOptionsSlider("GamepadSens", kMainMenuButtonPos, lY++, asOutSelectedButton, fValue, 0.2f / 5.0f, mlActionHorizontal, ""); + fValue *= 5.0f; + fValue += 0.01f; + mpConfig.SetFloat("Input", "GamepadSensitivity", fValue); + + asOutSelectedButton = OptionMenu_UpdateFocus("GamepadSens", asOutSelectedButton); + } + + ///////////////// + // Invert Pad Y + { + bool bValue = mpConfig.GetBool("Input", "InvertPad", false); + bValue = OptionMenu_ButtonOptionsToggle("InvertGamepadY", kMainMenuButtonPos, lY++, asOutSelectedButton, bValue, mlActionHorizontal); + mpConfig.SetBool("Input", "InvertPad", bValue); + + asOutSelectedButton = OptionMenu_UpdateFocus("InvertGamepadY", asOutSelectedButton); + } + + ///////////////// + // Pad vibration + { + bool bValue = mpConfig.GetBool("Input", "Rumble", true); + bValue = OptionMenu_ButtonOptionsToggle("PadVibration", kMainMenuButtonPos, lY++, asOutSelectedButton, bValue, mlActionHorizontal); + mpConfig.SetBool("Input", "Rumble", bValue); + + asOutSelectedButton = OptionMenu_UpdateFocus("PadVibration", asOutSelectedButton); + } + + alOutY = lY; + } + + void GuiOptionsInputGamepad() + { + ////////////////////////////////////////////////// + // Check if extra width needed for translations + { + OptionMenu_UpdateExtraWidth("GamepadSens", false); + OptionMenu_UpdateExtraWidth("InvertGamepadY", true); + OptionMenu_UpdateExtraWidth("PadVibration", true); + OptionMenu_UpdateExtraButtonWidth_Toggle(); + } + + //////////////////////////////////// + // Options background + cVector2f vSize = kInputGamepadBgSize; + + ImGui_DrawFrame(mGfxFrame, OptionMenu_GetTopLeftOffset(kOptionsBgPos, 0.0), OptionMenu_GetScaledSize(vSize + cVector2f(OptionMenu_GetExtraWidth(), 0))); + + //////////////// + // Title + OptionMenu_SectionTitle("GamepadOptions", kOptionsBgPos, vSize); + + int lY = 0; + + GuiOptionsInputGamepadContents(lY, lY, eMainMenuGroup_Options_Input_Gamepad, msSelectedInputGamepadButton, msSelectedInputGamepadButton); + + + bool bShowGamepadButtonArrows = msSelectedInputGamepadButton != "Back" && msSelectedInputGamepadButton != "GamepadMapping"; + ///////////////// + // Back + { + bool bButton = OptionMenu_ButtonOptions("Back", kMainMenuButtonPos, lY + 1, msSelectedInputGamepadButton); + bool bGamepad = ImGui_ActionTriggered(eImGuiAction_Cancel, true); + + + if(bButton || bGamepad) + { + mCurrentGroup = eMainMenuGroup_Options_Input; + + msFocusNextFrame = msSelectedInputButton; + ApplySettings(); + + ////////// + // Reset menu pos + if(bGamepad == false) + { + OptionMenu_GamepadButtons(bShowGamepadButtonArrows); + msSelectedInputGamepadButton = "GamepadMapping"; + return; + } + } + + msSelectedInputGamepadButton = OptionMenu_UpdateFocus("Back", msSelectedInputGamepadButton); + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(bShowGamepadButtonArrows); + } + + //------------------------------------------------------- + + void GuiOptionsInputEyeTracking() + { + //////////////////////////////////// + // Options background + cVector2f vSize = kOptionsEyetrackingBgSize; + cVector2f kBgPos = kOptionsBgPos + cVector2f(0.0f, -68.0f); + cVector2f kMainPos = kMainMenuButtonPos + cVector2f(0.0f, -68.0f); + + ImGui_DrawFrame(mGfxFrame, OptionMenu_GetTopLeftOffset(kBgPos, 0.0), OptionMenu_GetScaledSize(vSize+cVector2f(OptionMenu_GetExtraWidth(), 0))); + + //////////////// + // Title + OptionMenu_SectionTitle("EyeTracking", kBgPos, vSize); + + int lY = 0; + + ///////////////// + // Enable Eye tracking + { + bool bValue = mpConfig.GetBool("Input", "EnableEyeTracking", true); + bValue = OptionMenu_ButtonOptionsToggle("EnableEyeTracking", kMainPos, lY++, msSelectedInputEyeTrackingButton, bValue, mlActionHorizontal); + mpConfig.SetBool("Input", "EnableEyeTracking", bValue); + + msSelectedInputEyeTrackingButton = OptionMenu_UpdateFocus("EnableEyeTracking", msSelectedInputEyeTrackingButton); + } + + ///////////////// + // Bigger crosshair + { + bool bValue = mpConfig.GetBool("Input", "BiggerCrosshair", true); + bValue = OptionMenu_ButtonOptionsToggle("BiggerCrosshair", kMainPos, lY++, msSelectedInputEyeTrackingButton, bValue, mlActionHorizontal); + mpConfig.SetBool("Input", "BiggerCrosshair", bValue); + + msSelectedInputEyeTrackingButton = OptionMenu_UpdateFocus("BiggerCrosshair", msSelectedInputEyeTrackingButton); + } + + ///////////////// + // Extended view speed + { + float fValue = mpConfig.GetFloat("Input", "EyeTrackingResponsiveness", 0.5f); + fValue = OptionMenu_ButtonOptionsSlider("EyeTrackingResponsiveness", kMainPos, lY++, msSelectedInputEyeTrackingButton, fValue, 0.1f, mlActionHorizontal, ""); + mpConfig.SetFloat("Input", "EyeTrackingResponsiveness", fValue); + + msSelectedInputEyeTrackingButton = OptionMenu_UpdateFocus("EyeTrackingResponsiveness", msSelectedInputEyeTrackingButton); + } + + ///////////////// + // Extended view + { + bool bValue = mpConfig.GetBool("Input", "ExtendedView", true); + bValue = OptionMenu_ButtonOptionsToggle("ExtendedView", kMainPos, lY++, msSelectedInputEyeTrackingButton, bValue, mlActionHorizontal); + mpConfig.SetBool("Input", "ExtendedView", bValue); + + msSelectedInputEyeTrackingButton = OptionMenu_UpdateFocus("ExtendedView", msSelectedInputEyeTrackingButton); + } + + ///////////////// + // Extended view speed + { + float fValue = mpConfig.GetFloat("Input", "ExtendedViewSpeed", 0.5f); + fValue = OptionMenu_ButtonOptionsSlider("ExtendedViewSpeed", kMainPos, lY++, msSelectedInputEyeTrackingButton, fValue, 0.1f, mlActionHorizontal, ""); + mpConfig.SetFloat("Input", "ExtendedViewSpeed", fValue); + + msSelectedInputEyeTrackingButton = OptionMenu_UpdateFocus("ExtendedViewSpeed", msSelectedInputEyeTrackingButton); + } + + ///////////////// + // Extended view max angle + { + float fValue = mpConfig.GetFloat("Input", "ExtendedMaxAngle", 0.5f); + fValue = OptionMenu_ButtonOptionsSlider("ExtendedMaxAngle", kMainPos, lY++, msSelectedInputEyeTrackingButton, fValue, 0.1f, mlActionHorizontal, ""); + mpConfig.SetFloat("Input", "ExtendedMaxAngle", fValue); + + msSelectedInputEyeTrackingButton = OptionMenu_UpdateFocus("ExtendedMaxAngle", msSelectedInputEyeTrackingButton); + } + + ///////////////// + // Control flashlight + { + bool bValue = mpConfig.GetBool("Input", "ControlFlashlight", true); + bValue = OptionMenu_ButtonOptionsToggle("ControlFlashlight", kMainPos, lY++, msSelectedInputEyeTrackingButton, bValue, mlActionHorizontal); + mpConfig.SetBool("Input", "ControlFlashlight", bValue); + + msSelectedInputEyeTrackingButton = OptionMenu_UpdateFocus("ControlFlashlight", msSelectedInputEyeTrackingButton); + } + + ///////////////// + // Reactive environment + { + bool bValue = mpConfig.GetBool("Input", "ReactiveEnvironment", true); + bValue = OptionMenu_ButtonOptionsToggle("ReactiveEnvironment", kMainPos, lY++, msSelectedInputEyeTrackingButton, bValue, mlActionHorizontal); + mpConfig.SetBool("Input", "ReactiveEnvironment", bValue); + + msSelectedInputEyeTrackingButton = OptionMenu_UpdateFocus("ReactiveEnvironment", msSelectedInputEyeTrackingButton); + } + + ///////////////// + // Reactive AI + { + bool bValue = mpConfig.GetBool("Input", "ReactiveAi", true); + bValue = OptionMenu_ButtonOptionsToggle("ReactiveAi", kMainPos, lY++, msSelectedInputEyeTrackingButton, bValue, mlActionHorizontal); + mpConfig.SetBool("Input", "ReactiveAi", bValue); + + msSelectedInputEyeTrackingButton = OptionMenu_UpdateFocus("ReactiveAi", msSelectedInputEyeTrackingButton); + } + + ///////////////// + // Back + { + bool bButton = OptionMenu_ButtonOptions("Back", kMainPos, lY + 1, msSelectedInputEyeTrackingButton); + bool bGamepad = ImGui_ActionTriggered(eImGuiAction_Cancel, true); + + if(bButton || bGamepad) + { + mCurrentGroup = eMainMenuGroup_Options_Input; + + msFocusNextFrame = msSelectedInputButton; + ApplySettings(); + + msSelectedInputEyeTrackingButton = ""; + } + + msSelectedInputEyeTrackingButton = OptionMenu_UpdateFocus("Back", msSelectedInputEyeTrackingButton); + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(msSelectedInputEyeTrackingButton != "Back"); + } + + //------------------------------------------------------- + + tString ParseKeybind(tString asBind, bool abAnalog) + { + if(asBind.length() > 0) + { + int lPos = cString_GetFirstCharPos(asBind, '.'); + + if(lPos != -1) + { + tString sType = cString_Sub(asBind, 0, lPos); + + if(sType == "Gamepad") + { + if(abAnalog) + { + tString sAxisNum = cString_Sub(asBind, lPos+8); + sAxisNum = cString_Sub(sAxisNum, 0, cString_GetFirstCharPos(sAxisNum, '.')); + int lAxis = cString_ToInt(sAxisNum, 0); + + return "Stick."+(lAxis / 2); + } + else + { + tString sKey = cString_Sub(asBind, lPos+3); + + return sKey; + } + } + else + { + tString sKey = cString_Sub(asBind, lPos+1); + + return sKey; + } + } + } + + return asBind; + } + + eMainMenuGroup mKeyBindBackDest = eMainMenuGroup_Options_Input; + tString msKeyBindBackFocus = msSelectedInputButton; + void GuiOptionsInputKeybind() + { + //////////////// + // Select which type to bind + array vActions = mbBindingGamepad ? mvGamepadActions : mvActions; + tString sMain = mbBindingGamepad ? "GamepadPrimary" : "Primary"; + tString sSec = mbBindingGamepad ? "GamepadSecondary" : "Secondary"; + + ImGui_SetTransCategory("Actions"); + for(uint i = 0; i < vActions.size(); ++i) + { + OptionMenu_UpdateExtraWidth(vActions[i].msAction, false); + } + + //////////////////////////////////// + // Options background + cImGuiGfx gfx; + ImGui_DrawGfx(gfx, OptionMenu_GetTopLeftOffset(kKeybindBgPos, 0.01), OptionMenu_GetScaledSize(kKeybindBgSize + cVector2f(OptionMenu_GetExtraWidth(), 0)), cColor(0.0, 1.0)); + + ImGui_DrawFrame(mGfxFrame, OptionMenu_GetTopLeftOffset(kOptionsBgPos, 0.0), OptionMenu_GetScaledSize(kKeybindWindowBgSize + cVector2f(OptionMenu_GetExtraWidth(), 0))); + + //////////////// + // Get any duplicates + array vDuplicates0; + array vDuplicates1; + bool bHasDuplicates = false; + + for(uint i = 0; i < vActions.size(); ++i) + { + ////////////// + // Check if this is a duplicate + bool bDuplicate0 = false; + bool bDuplicate1 = false; + + tString sBind = vActions[i].msAction; + tString sPrimary = mpKeyConfig.GetString(sBind, sMain, ""); + tString sSecondary = mpKeyConfig.GetString(sBind, sSec, ""); + + bool bCheck0 = sPrimary.length() != 0; + bool bCheck1 = sSecondary.length() != 0; + + if(bCheck0 || bCheck1) + { + if(sSecondary == sPrimary) + { + bDuplicate0 = true; + bDuplicate1 = true; + } + + for(uint j = 0; j < vActions.size(); ++j) + { + if(i == j) continue; + + sBind = vActions[j].msAction; + + tString sComp0 = mpKeyConfig.GetString(sBind, sMain, ""); + tString sComp1 = mpKeyConfig.GetString(sBind, sSec, ""); + + if(bCheck0 && (sComp0 == sPrimary || sComp1 == sPrimary)) bDuplicate0 = true; + if(bCheck1 && (sComp0 == sSecondary || sComp1 == sSecondary)) bDuplicate1 = true; + + if((bCheck0 == false || bDuplicate0) && (bCheck1 == false || bDuplicate1)) break; + } + } + + vDuplicates0.push_back(bDuplicate0); + vDuplicates1.push_back(bDuplicate1); + if(bDuplicate0 || bDuplicate1) bHasDuplicates = true; + } + + + ////////////// + // Catch input + int lActionVertical = 0; + bool bMouseDown = false; + float fPadding = mbScrollingKeybindList ? 10000 : 5; + int lNumBinds = 9; + + if(mlActionToBind == 0 && mbShowApplyKeyChanges == false && mbShowReset == false) + { + if(ImGui_ActionTriggered(eImGuiAction_Down, true)) lActionVertical++; + if(ImGui_ActionTriggered(eImGuiAction_Up, true)) lActionVertical--; + if(ImGui_ActionTriggered(eImGuiAction_ScrollDown, true) && (mlKeybindOffset + mlSelectedKeybindButton) < vActions.size()-1 && mlSelectedKeybindButton != lNumBinds) lActionVertical++; + if(ImGui_ActionTriggered(eImGuiAction_ScrollUp, true) && (mlKeybindOffset + mlSelectedKeybindButton) > 0 && mlSelectedKeybindButton != lNumBinds) lActionVertical--; + bMouseDown = ImGui_ActionIsDown(eImGuiAction_MouseLeft, false); + } + + //////////////// + // Draw a list of all keybinds + int c = 0; + + for(int i = mlKeybindOffset; i < vActions.size() && c < lNumBinds; ++i) + { + /////////////// + // Get action and parse the bind + tString sBind = vActions[i].msAction; + + tString sPrimary = ParseKeybind(mpKeyConfig.GetString(sBind, sMain, ""), vActions[i].mbAnalog); + tString sSecondary = ParseKeybind(mpKeyConfig.GetString(sBind, sSec, ""), vActions[i].mbAnalog); + + /////////////// + // Draw button, use red color if a duplicate is detected + cColor color0 = vDuplicates0[i] ? cColor(1, 0, 0, 1) : cColor(0,1); + cColor color1 = vDuplicates1[i] ? cColor(1, 0, 0, 1) : cColor(0,1); + int lFocusChange = 0; + int lButton = OptionMenu_ButtonKeybind("Bind"+c, sBind, sPrimary, sSecondary, kKeybindBgPos + cVector2f(26, c * kKeybindSpacing), mlSelectedKeybindButton == c, mlKeybindFocusSlot, lFocusChange, color0, color1); + + if(bMouseDown == false) + { + if (lFocusChange > 0) + { + mlSelectedKeybindButton = c; + mlKeybindFocusSlot = lFocusChange-1; + } + } + + if(lButton > 0 && mlKeybindFocusSlot > 0) + { + if(bMouseDown == false || OptionMenu_GetMouseInside(kKeybindScrollPos - cVector2f(fPadding, 0) + cVector2f(OptionMenu_GetExtraWidth(), 0), + kKeybindScrollPos + kKeybindScrollSize + cVector2f(10000, 0)).y == -1) + { + mlActionToBind = i+1; + msKeybindSlot = mlKeybindFocusSlot == 1 ? sMain : sSec; + msFocusAfterBind = "Bind"+c + msKeybindSlot; + msKeybindFirstState = ""; + } + } + c++; + } + + ////////////// + // Update focus + if(lActionVertical != 0) + { + ////////// + // Select file + if (lActionVertical<0) // Scroll up + { + if (mlSelectedKeybindButton==lNumBinds+1) // Back button + { + mlSelectedKeybindButton = lNumBinds; + } + else if (mlSelectedKeybindButton==lNumBinds) + { + mlSelectedKeybindButton = lNumBinds-1; + } + else + { + mlSelectedKeybindButton--; + if(mlSelectedKeybindButton < 0) + { + if(mlKeybindOffset > 0) + { + mlSelectedKeybindButton = 0; + mlKeybindOffset--; + } + else + { + mlSelectedKeybindButton = lNumBinds+1; + } + } + } + } + else // Scroll down + { + if (mlSelectedKeybindButton==lNumBinds) + { + mlSelectedKeybindButton = lNumBinds+1; + } + else if (mlSelectedKeybindButton==lNumBinds+1) // Back button + { + mlSelectedKeybindButton = 0; + } + else + { + mlSelectedKeybindButton++; + if(mlSelectedKeybindButton >= cMath_Min(vActions.size(),lNumBinds) ) + { + if(mlKeybindOffset lNumBinds) + { + //////////// + // Update input + float fFiles = vActions.size(); + int lOldOffset = mlKeybindOffset; + float fMouseScrollY = OptionMenu_GetMouseInside(kKeybindScrollPos - cVector2f(fPadding, 0) + cVector2f(OptionMenu_GetExtraWidth(), 0), kKeybindScrollPos + kKeybindScrollSize + cVector2f(fPadding, 0) + cVector2f(OptionMenu_GetExtraWidth(), 0)).y; + + if(fMouseScrollY != -1.0) + { + /////////// + // Mouse touching scroll, check if button pressed + if(bMouseDown) + { + mlKeybindOffset = cMath_RoundToInt((fFiles-9) * fMouseScrollY); + mbScrollingKeybindList = true; + } + } + + if(bMouseDown == false) + { + //////// + // Stopped scrolling + mbScrollingKeybindList = false; + } + + mlKeybindOffset = cMath_Clamp(mlKeybindOffset, 0, vActions.size() - lNumBinds); + + if(mlSelectedKeybindButton >= 0 && mlSelectedKeybindButton < lNumBinds && (mlSaveFileOffset - lOldOffset) != 0) + { + int lDiff = (mlKeybindOffset - lOldOffset); + mlSelectedKeybindButton = cMath_Clamp(mlSelectedKeybindButton - lDiff, 0, lNumBinds-1); + } + + float fScaleY = 1.0 - (fFiles - lNumBinds) / fFiles; + float fPosY = 0; + if (fFiles>lNumBinds) + fPosY = (mlKeybindOffset) / (fFiles-lNumBinds); + ImGui_DrawGfx(gfx, OptionMenu_GetTopLeftOffset(kKeybindScrollPos + kKeybindScrollSize * cVector2f(0, (1.0 - fScaleY) * fPosY) + cVector2f(OptionMenu_GetExtraWidth(), 0), 0.01), OptionMenu_GetScaledSize(kKeybindScrollSize * cVector2f(1, fScaleY)), ((fMouseScrollY == -1.0f && mbScrollingKeybindList == false) || (mlActionToBind > 0 || mbShowApplyKeyChanges || mbShowReset)) ? kMainMenuButtonBgColor : cColor(1,1)); + } + + tString sSelected; + if(mlSelectedKeybindButton < lNumBinds) sSelected = ("Bind"+mlSelectedKeybindButton); + else if(mlSelectedKeybindButton == lNumBinds) sSelected = "ResetToDefault"; + else sSelected = "Back"; + + ///////////////// + // Reset to default + { + if(OptionMenu_ButtonOptions("ResetToDefault", kMainMenuButtonPos+ cVector2f(0, 10), 7, sSelected)) + { + mbShowReset = true; + msFocusNextFrame = "No"; + } + + if(bMouseDown == false) + { + if (ImGui_PrevBecameInFocus()) + { + //cLux_AddTodoMessage("Sound: Menu focus changed"); + Sound_PlayGui("special_fx/frontend/frontend_menu_focus", 1.0f, eSoundEntryType_Gui); + mlSelectedKeybindButton = lNumBinds; + } + } + } + + ///////////////// + // Back + { + bool bButton = OptionMenu_ButtonOptions("Back", kMainMenuButtonPos+ cVector2f(0, 10), 8, sSelected); + bool bGamepad = ImGui_ActionTriggered(eImGuiAction_Cancel, true); + if(bButton || bGamepad) + { + if(mbKeybindChanged == false) + { + mCurrentGroup = mKeyBindBackDest; + msFocusNextFrame = msKeyBindBackFocus; + } + else + { + mbShowDuplicateKeys = bHasDuplicates; + mbShowApplyKeyChanges = true; + msFocusNextFrame = "No"; + } + + //////// + // Reset menu pos + if(bGamepad == false) + { + mlSelectedKeybindButton = 0; + } + + OptionMenu_GamepadButtons(true); + return; + } + + if(bMouseDown == false) + { + if (ImGui_PrevBecameInFocus()) + { + //cLux_AddTodoMessage("Sound: Menu focus changed"); + Sound_PlayGui("special_fx/frontend/frontend_menu_focus", 1.0f, eSoundEntryType_Gui); + mlSelectedKeybindButton = lNumBinds+1; + } + } + } + + /////////// + // Manual focus since we catch input + if(mlActionToBind == 0 && mbShowApplyKeyChanges == false && mbShowReset == false) + { + if(mlSelectedKeybindButton >= 0 && mlSelectedKeybindButton < lNumBinds) + { + if(mlKeybindFocusSlot == 0) msFocusNextFrame = "Bind"+mlSelectedKeybindButton; + if(mlKeybindFocusSlot == 1) msFocusNextFrame = "Bind"+mlSelectedKeybindButton+"Primary"; + if(mlKeybindFocusSlot == 2) msFocusNextFrame = "Bind"+mlSelectedKeybindButton+"Secondary"; + } + else if(mlSelectedKeybindButton == lNumBinds) + { + msFocusNextFrame = "ResetToDefault"; + } + else + { + msFocusNextFrame = "Back"; + } + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(true); + + OptionMenu_ResetExtraWidth(); + } + + //------------------------------------------------------- + + tString msOldProfile; + tString msOldPreset; + void GuiOptionsInputMapping() + { + //////////////////////////////////// + // Options background + ImGui_DrawFrame(mGfxFrame, OptionMenu_GetTopLeftOffset(kOptionsBgPos, 0.0), OptionMenu_GetScaledSize(kOptionsMappingBgSize)); + + ///////////////// + // Draw preset + tString sDefault = Platform_IsPS4() ? "PS4 Controller" : "X360 Controller"; + tString sProfile = mpKeyConfig.GetString("GamepadMapping", "Profile", sDefault); + tString sPreset = mpKeyConfig.GetString("GamepadMapping", "Preset", "Right"); + + ///////////// + // Check gamepad input + if(ImGui_ActionTriggered(eImGuiAction_Down, true)) + { + msSelectedInputMappingButton = "Back"; + } + if(ImGui_ActionTriggered(eImGuiAction_Up, true)) + { + //if(sProfile == "Custom") msSelectedInputMappingButton = "CustomPad"; + //else + msSelectedInputMappingButton = "Back"; + } + if(mlActionHorizontal != 0) + { + msFocusNextFrame = msSelectedInputMappingButton = "Back"; + } + + if(ImGui_IsFading("PresetTransition")) + { + float fAlpha = ImGui_GetStateFloat("PresetTransition"); + GuiOptionsInputMappingGamepadProfile(sProfile, sPreset, fAlpha, false); + GuiOptionsInputMappingGamepadProfile(msOldProfile, msOldPreset, 1.0f-(fAlpha*3.0f), false); + } + else + { + GuiOptionsInputMappingGamepadProfile(sProfile, sPreset, 1.0f, false); + } + + ///////////////// + // Left and right buttons + { + //////////////// + // Get current selection + int lId = 0; + array vProfilePresets; + + if(Platform_IsPS4()) + { + vProfilePresets.push_back("PS4 Controller"); vProfilePresets.push_back("Right"); + vProfilePresets.push_back("PS4 Controller"); vProfilePresets.push_back("Left"); + } + else + { + vProfilePresets.push_back("X360 Controller"); vProfilePresets.push_back("Right"); + vProfilePresets.push_back("X360 Controller"); vProfilePresets.push_back("Left"); + } + + for(int i = 0; i < vProfilePresets.size(); i+=2) + { + if(vProfilePresets[i] == sProfile && + vProfilePresets[i+1] == sPreset) + { + lId = i / 2; + break; + } + } + + //////////////// + // Draw arrows + cImGuiButtonData labelData; + labelData.mbUseBackgroundGfx = false; + labelData.mbUseInFocusGfx = false; + labelData.mbUseTriggeredGfx = false; + + //msSelectedInputMappingButton = "Right"; + bool bArrowRightFading = ImGui_IsFading("PresetTransitionRight"); + if(lId > 0 || bArrowRightFading) //right arrow + { + ///////////// + // Draw arrow + tString sArrowGfxFile = "startmenu_options_arrow"; + cColor color(1.0f, 1.0f); + + if(msSelectedInputMappingButton=="Right" || bArrowRightFading) + { + sArrowGfxFile += "_active"; + + if(bArrowRightFading) + color.a = ImGui_GetStateFloat("PresetTransitionRight"); + } + else + { + sArrowGfxFile += "_inactive"; + } + + cImGuiGfx gfxArrow(sArrowGfxFile); + + //cColor color = msSelectedInputMappingButton == "Right" ? cColor(1,1) : cColor(0.5f,1); + + ImGui_SetModRotateAngle(180); + ImGui_DrawGfx(gfxArrow, OptionMenu_GetTopLeftOffset(kMappingArrowPosRight, 2.0), OptionMenu_GetScaledSize(kMappingArrowSize), color); + ImGui_SetModRotateAngle(0.0); + + // And button to click + if(bArrowRightFading==false && ImGui_DoButtonExt("Right", "",labelData, OptionMenu_GetTopLeftOffset(kMappingButtonPosRight, 1.0), OptionMenu_GetScaledSize(kMappingButtonSize)) || mlActionHorizontal < 0) + { + ///////////// + // Set next preset + lId--; + mpKeyConfig.SetString("GamepadMapping", "Profile", vProfilePresets[lId * 2]); + mpKeyConfig.SetString("GamepadMapping", "Preset", vProfilePresets[lId * 2 + 1]); + mbKeybindChanged = true; + + msOldProfile = sProfile; + msOldPreset = sPreset; + + ImGui_SetStateFloat("PresetTransition", 0.0f); + ImGui_FadeStateFloat("PresetTransition", 1.0f, 0.75f); + + ImGui_SetStateFloat("PresetTransitionRight", 1.0f); + ImGui_FadeStateFloat("PresetTransitionRight", 0.0f, 0.5f); + } + + if(mlActionHorizontal == 0) msSelectedInputMappingButton = OptionMenu_UpdateFocus("Right", msSelectedInputMappingButton); + } + + bool bArrowLeftFading = ImGui_IsFading("PresetTransitionLeft"); + if(lId < vProfilePresets.size() / 2 - 1 || bArrowLeftFading) + { + ///////////// + // Draw arrow + tString sArrowGfxFile = "startmenu_options_arrow"; + cColor color(1.0f, 1.0f); + + if(msSelectedInputMappingButton=="Left" || bArrowLeftFading) + { + sArrowGfxFile += "_active"; + + if(bArrowLeftFading) + color.a = ImGui_GetStateFloat("PresetTransitionLeft"); + } + else + { + sArrowGfxFile += "_inactive"; + } + + cImGuiGfx gfxArrow(sArrowGfxFile); + + //cColor color = msSelectedInputMappingButton == "Left" ? cColor(1,1) : cColor(0.5f,1); + ImGui_DrawGfx(gfxArrow, OptionMenu_GetTopLeftOffset(kMappingArrowPosLeft, 2.0), OptionMenu_GetScaledSize(kMappingArrowSize), color); + + // And button to click + if(bArrowLeftFading==false && ImGui_DoButtonExt("Left", "",labelData, OptionMenu_GetTopLeftOffset(kMappingButtonPosLeft, 1.0), OptionMenu_GetScaledSize(kMappingButtonSize)) || mlActionHorizontal > 0) + { + ///////////// + // Set next preset + lId++; + mpKeyConfig.SetString("GamepadMapping", "Profile", vProfilePresets[lId * 2]); + mpKeyConfig.SetString("GamepadMapping", "Preset", vProfilePresets[lId * 2 + 1]); + mbKeybindChanged = true; + + msOldProfile = sProfile; + msOldPreset = sPreset; + + ImGui_SetStateFloat("PresetTransition", 0.0f); + ImGui_FadeStateFloat("PresetTransition", 1.0f, 0.75f); + + ImGui_SetStateFloat("PresetTransitionLeft", 1.0f); + ImGui_FadeStateFloat("PresetTransitionLeft", 0.0f, 0.5f); + } + + if(mlActionHorizontal == 0) msSelectedInputMappingButton = OptionMenu_UpdateFocus("Left", msSelectedInputMappingButton); + } + } + + ///////////////// + // Back + { + bool bButton = OptionMenu_ButtonOptions("Back", kMainMenuButtonPos, 8, msSelectedInputMappingButton); + bool bGamepad = ImGui_ActionTriggered(eImGuiAction_Cancel, true); + + if(bButton || bGamepad) + { + if(mbKeybindChanged == false) + { + mCurrentGroup = mGamepadMappingBackDest; + msFocusNextFrame = msSelectedInputButton; + } + else + { + mbShowApplyKeyChanges = true; + msFocusNextFrame = "No"; + } + + ////////// + // Reset menu poos + if(bGamepad == false) + { + OptionMenu_GamepadButtons(false); + msSelectedInputMappingButton = "Back"; + return; + } + } + + msSelectedInputMappingButton = OptionMenu_UpdateFocus("Back", msSelectedInputMappingButton); + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(true); + } + + cVector2f mvButtonPos, mvLabelPos; + void GuiOptionsInputMappingGamepadProfile(const tString &in asProfile, const tString &in asPreset, float afAlpha, bool abFadeController) + { + cVector3f vReferencePos = OptionMenu_GetTopLeftOffset(kMappingPos, 1.0); + cVector2f vFrameSize = OptionMenu_GetScaledSize(kMappingSize); + + cVector2f vControllerSize = vFrameSize; + float fControllerAlpha = 0.3f; + + float fGfxHeight = vFrameSize.y*0.115f; + float fEntrySeparation = fGfxHeight*1.0f; + + if(Platform_IsPS4() || Platform_IsXBO()) + { + vControllerSize *= 0.5f; + fControllerAlpha = 0.8f; + + fGfxHeight = vFrameSize.y*0.12f; + fEntrySeparation = fGfxHeight*1.0f; + } + + + + cImGuiGfx gfxController; + array vControlGroupPositions; + + GetGamepadProfileLayout(asProfile, gfxController, vControlGroupPositions, vReferencePos, vFrameSize, fGfxHeight, fEntrySeparation); + + ImGui_SetModColorMul(cColor(1, fControllerAlpha*afAlpha)); + ImGui_SetAlignment(eImGuiAlign_CenterCenter); + ImGui_DoImage(gfxController, vReferencePos+cVector3f(vFrameSize.x, vFrameSize.y,0)*0.5f, vControllerSize); + ImGui_SetAlignment(eImGuiAlign_TopLeft); + + ImGui_SetModColorMul(cColor(1, afAlpha)); + + vReferencePos.z += 1.0f; + + cImGuiLabelData labelData; + labelData.mFont.SetFile(Helper_Font_GetFontName(eLuxFontType_Sansation_Medium)); + labelData.mFont.mvSize = cVector2f(fGfxHeight/2.6f); + labelData.mFont.mColor = cColor(1,1); + labelData.mFontAlign = eFontAlign_Center; + + // Left shoulder buttons + cVector3f vPos = vControlGroupPositions[0]; + + DrawGamepadButtonActionPair(asProfile, asPreset, "Gamepad.0.Axis.4.Positive", labelData, vPos, fGfxHeight, false); + vPos.y += fEntrySeparation; + DrawGamepadButtonActionPair(asProfile, asPreset, "Gamepad.0.Button.9", labelData, vPos, fGfxHeight, false); + + // Right shoulder buttons + vPos = vControlGroupPositions[1]; + DrawGamepadButtonActionPair(asProfile, asPreset, "Gamepad.0.Axis.5.Positive", labelData, vPos, fGfxHeight); + vPos.y += fEntrySeparation; + DrawGamepadButtonActionPair(asProfile, asPreset, "Gamepad.0.Button.10", labelData, vPos, fGfxHeight); + + vPos = vControlGroupPositions[2]; + DrawGamepadButtonActionPair(asProfile, asPreset, "Gamepad.0.Button.4", labelData, vPos, fGfxHeight, false); + + vPos = vControlGroupPositions[3]; + DrawGamepadButtonActionPair(asProfile, asPreset, "Gamepad.0.Button.6", labelData, vPos, fGfxHeight); + + vPos = vControlGroupPositions[4]; + DrawGamepadButtonActionPair(asProfile, asPreset, "Gamepad.0.Button.11", labelData, vPos, fGfxHeight, false); + vPos.y += fEntrySeparation; + DrawGamepadButtonActionPair(asProfile, asPreset, "Gamepad.0.Button.12", labelData, vPos, fGfxHeight, false); + vPos.y += fEntrySeparation; + DrawGamepadButtonActionPair(asProfile, asPreset, "Gamepad.0.Button.13", labelData, vPos, fGfxHeight, false); + vPos.y += fEntrySeparation; + DrawGamepadButtonActionPair(asProfile, asPreset, "Gamepad.0.Button.14", labelData, vPos, fGfxHeight, false); + + vPos = vControlGroupPositions[5]; + DrawGamepadButtonActionPair(asProfile, asPreset, "Gamepad.0.Axis.0.Positive.Axis.1.Negative", labelData, vPos, fGfxHeight, false); + + vPos = vControlGroupPositions[6]; + DrawGamepadButtonActionPair(asProfile, asPreset, "Gamepad.0.Axis.2.Positive.Axis.3.Negative", labelData, vPos, fGfxHeight); + + vPos = vControlGroupPositions[7]; + DrawGamepadButtonActionPair(asProfile, asPreset, "Gamepad.0.Button.0", labelData, vPos, fGfxHeight); + vPos.y += fEntrySeparation; + DrawGamepadButtonActionPair(asProfile, asPreset, "Gamepad.0.Button.1", labelData, vPos, fGfxHeight); + vPos.y += fEntrySeparation; + DrawGamepadButtonActionPair(asProfile, asPreset, "Gamepad.0.Button.3", labelData, vPos, fGfxHeight); + + ImGui_ResetModifiers(); + } + + void GetGamepadProfileLayout(const tString &in asProfile, cImGuiGfx &out aGfxController, array &out avControlGroupPositions, const cVector3f &in avReferencePos, const cVector2f &in avReferenceSize, float afGfxHeight, float afEntrySeparation) + { + if(asProfile=="X360 Controller") + { + aGfxController = cImGuiGfx("controller_XBOX.tga", eImGuiGfx_Texture); + + avControlGroupPositions.push_back(avReferencePos+cVector3f(avReferenceSize.x*0.25f, afGfxHeight, 0)); // 0 Left shoulder + avControlGroupPositions.push_back(avReferencePos+cVector3f(avReferenceSize.x*0.75f, afGfxHeight, 0)); // 1 Right shoulder + avControlGroupPositions.push_back(avReferencePos+cVector3f(avReferenceSize.x*0.475f, afGfxHeight, 0)); // 2 Back + avControlGroupPositions.push_back(avReferencePos+cVector3f(avReferenceSize.x*0.525f, afGfxHeight, 0)); // 3 Start + avControlGroupPositions.push_back(avControlGroupPositions[0]+cVector3f(0,afEntrySeparation*4.0f,0.0f)); // 4 DPAD + avControlGroupPositions.push_back(avControlGroupPositions[0]+cVector3f(0,afEntrySeparation*2.5f,0.0f)); // 5 Left stick + avControlGroupPositions.push_back(avReferencePos+cVector3f(avReferenceSize.x*0.575f, avReferenceSize.y*0.9f, 0)); // 6 Right stick + avControlGroupPositions.push_back(avControlGroupPositions[1]+cVector3f(0, afGfxHeight+afEntrySeparation*2.0f, 0)); // 7 Action button block + } + else if(asProfile=="PS4 Controller") + { + aGfxController = cImGuiGfx("controller_PS4", eImGuiGfx_Texture); + + avControlGroupPositions.push_back(avReferencePos+cVector3f(avReferenceSize.x*0.25f, afGfxHeight, 0)); // 0 Left shoulder + avControlGroupPositions.push_back(avReferencePos+cVector3f(avReferenceSize.x*0.75f, afGfxHeight, 0)); // 1 Right shoulder + avControlGroupPositions.push_back(avReferencePos+cVector3f(avReferenceSize.x*0.475f, afGfxHeight, 0)); // 2 Back + avControlGroupPositions.push_back(avReferencePos+cVector3f(avReferenceSize.x*0.525f, afGfxHeight, 0)); // 3 Start + avControlGroupPositions.push_back(avControlGroupPositions[0]+cVector3f(0, afEntrySeparation*3.0f,0.0f)); // 4 DPAD + avControlGroupPositions.push_back(avReferencePos+cVector3f(avReferenceSize.x*0.425f, avReferenceSize.y*0.9f,0.0f)); // 5 Left stick + avControlGroupPositions.push_back(avReferencePos+cVector3f(avReferenceSize.x*0.575f, avReferenceSize.y*0.9f, 0)); // 6 Right stick + avControlGroupPositions.push_back(avControlGroupPositions[1]+cVector3f(0, afGfxHeight+afEntrySeparation*2.0f, 0)); // 7 Action button block + } + else + { + aGfxController = cImGuiGfx(); + aGfxController.mColor = cColor(0.3f, 0.3f); + + avControlGroupPositions.push_back(avReferencePos+cVector3f(avReferenceSize.x*0.25f, afGfxHeight, 0)); // 0 Left shoulder + avControlGroupPositions.push_back(avReferencePos+cVector3f(avReferenceSize.x*0.75f, afGfxHeight, 0)); // 1 Right shoulder + avControlGroupPositions.push_back(avReferencePos+cVector3f(avReferenceSize.x*0.475f, afGfxHeight, 0)); // 2 Back + avControlGroupPositions.push_back(avReferencePos+cVector3f(avReferenceSize.x*0.525f, afGfxHeight, 0)); // 3 Start + avControlGroupPositions.push_back(avControlGroupPositions[0]+cVector3f(0, afEntrySeparation*3.0f,0.0f)); // 4 DPAD + avControlGroupPositions.push_back(avReferencePos+cVector3f(avReferenceSize.x*0.425f, avReferenceSize.y*0.9f,0.0f)); // 5 Left stick + avControlGroupPositions.push_back(avReferencePos+cVector3f(avReferenceSize.x*0.575f, avReferenceSize.y*0.9f, 0)); // 6 Right stick + avControlGroupPositions.push_back(avControlGroupPositions[1]+cVector3f(0, afGfxHeight+afEntrySeparation*2.0f, 0)); // 7 Action button block + } + } + + void DrawGamepadButtonActionPair(const tString &in asProfile, const tString &in asPreset, const tString &in asGamepadString, + const cImGuiLabelData &in aLabelData, const cVector3f &in avPosition, float afGfxHeight, bool abLeftToRight=true) + { + tString sActions; + cLux_GetInputHandler().GetActionsAssociatedToGamepadControl(asProfile, asPreset, asGamepadString, sActions); + + if(sActions.length()==0) return; + + float fLabelSeparation = afGfxHeight*1.25f; + + array vActions; + cString_GetStringVec(sActions, vActions, "/"); + + float fLabelMaxLength = -1.0f; + //tWString sLabel; + array vActionLabels; + for(int i=0; i vGfxParts; + cString_GetStringVec(sInputLayoutString, vGfxParts, ","); + + cVector3f vPosition = avPosition; + vPosition.z += vGfxParts.length()*0.01f; + + eImGuiAlign align = eImGuiAlign_CenterRight; + if(abLeftToRight) + { + align = eImGuiAlign_CenterLeft; + } + else + { + align = eImGuiAlign_CenterRight; + } + + ImGui_SetAlignment(align); + + for(int i=0; i vDisplayValues = { "Fullscreen", "Windowed", "Borderless" }; + array vVSyncValues = { "On", "Adaptive", "Off" }; + array vAAValues = { "Off", "FXAA" }; + + OptionMenu_UpdateExtraWidth("Resolution", false); + OptionMenu_UpdateExtraWidth("DisplayMode", false); + OptionMenu_UpdateExtraWidth("VSync", false); + OptionMenu_UpdateExtraWidth("RefreshRate", false); + OptionMenu_UpdateExtraWidth("AA", false); + OptionMenu_UpdateExtraWidth("FOV", false); + OptionMenu_UpdateExtraButtonWidth_MultiSelection(vDisplayValues); + OptionMenu_UpdateExtraButtonWidth_MultiSelection(vVSyncValues); + OptionMenu_UpdateExtraButtonWidth_MultiSelection(vAAValues); + + + //////////////////////////////////// + // Options background + ImGui_DrawFrame(mGfxFrame, OptionMenu_GetTopLeftOffset(kOptionsBgPos, 0.0), OptionMenu_GetScaledSize(kOptionsVideoDisplayBgSize+cVector2f(OptionMenu_GetExtraWidth(), 0))); + + //////////////// + // Title + OptionMenu_SectionTitle("Display", kOptionsBgPos, kOptionsVideoDisplayBgSize); + + int lY = 0; + + ///////////////// + // Resolution + { + ///////////// + // Get current resolution and update config + int lResolution = GetCurrentResolution(); + int lNewResolution = OptionMenu_ButtonOptionsMultiSelect("Resolution", kMainMenuButtonPos, lY, msSelectedVideoDisplayButton, mvResolutionValues, lResolution, false, mlActionHorizontal, ""); + + if(lResolution != lNewResolution) + { + mlOptionChanges++; + SetCurrentResolution(lNewResolution); + } + + msSelectedVideoDisplayButton = OptionMenu_UpdateFocus("Resolution", msSelectedVideoDisplayButton); + } + + ///////////////// + // Display Mode + lY++; + { + ////////////// + // Draw button and update config + + tString sValue = cString_ToLowerCase(mpConfig.GetString("Screen", "FullScreen", "true")); + + int lValue = (sValue == "true") ? 0 : (sValue == "borderless" ? 2 : 1); + int lNewValue = OptionMenu_ButtonOptionsMultiSelect("DisplayMode", kMainMenuButtonPos, lY, msSelectedVideoDisplayButton, vDisplayValues, lValue, false, mlActionHorizontal); + + if(lValue != lNewValue) + { + mlOptionChanges++; + mpConfig.SetString("Screen", "FullScreen", (lNewValue == 0) ? "true" : + (lNewValue == 1 ? "false" : "borderless")); + } + + msSelectedVideoDisplayButton = OptionMenu_UpdateFocus("DisplayMode", msSelectedVideoDisplayButton); + } + + ///////////////// + // V-sync + lY++; + { + ////////////// + // Draw button and update config + tString sValue = cString_ToLowerCase(mpConfig.GetString("Screen", "Vsync", "true")); + + int lValue = (sValue == "true") ? 0 : (sValue == "adaptive" ? 1 : 2); + int lNewValue = OptionMenu_ButtonOptionsMultiSelect("VSync", kMainMenuButtonPos, lY, msSelectedVideoDisplayButton, vVSyncValues, lValue, false, mlActionHorizontal); + + if(lValue != lNewValue) + { + mlOptionChanges++; + mpConfig.SetString("Screen", "Vsync", (lNewValue == 0) ? "true" : + (lNewValue == 1 ? "adaptive" : "false")); + } + + msSelectedVideoDisplayButton = OptionMenu_UpdateFocus("VSync", msSelectedVideoDisplayButton); + } + + ///////////////// + // Refresh rate + lY++; + { + ////////////// + // Draw button and update config + array vValues = { "On", "Adaptive", "Off" }; + tString sValue = cString_ToLowerCase(mpConfig.GetString("Screen", "Vsync", "true")); + + int lValue = GetCurrentRefreshRate(); + int lNewValue = OptionMenu_ButtonOptionsMultiSelect("RefreshRate", kMainMenuButtonPos, lY, msSelectedVideoDisplayButton, mvRefreshValues, lValue, false, mlActionHorizontal, ""); + + if(lValue != lNewValue) + { + mlOptionChanges++; + SetCurrentRefreshRate(lNewValue); + } + + msSelectedVideoDisplayButton = OptionMenu_UpdateFocus("RefreshRate", msSelectedVideoDisplayButton); + } + + ///////////////// + // AA + lY++; + { + ///////////// + // Draw multi select box and update config + tString sValue = mpConfig.GetString("Graphics", "AntiAliasing", "FXAA"); + + int lValue = (sValue == "FXAA") ? 1 : 0; + int lNewValue = OptionMenu_ButtonOptionsMultiSelect("AA", kMainMenuButtonPos, lY, msSelectedVideoDisplayButton, vAAValues, lValue, true, mlActionHorizontal); + + if(lValue != lNewValue) + { + mlOptionChanges++; + mpConfig.SetString("Graphics", "AntiAliasing", vAAValues[lNewValue]); + } + + msSelectedVideoDisplayButton = OptionMenu_UpdateFocus("AA", msSelectedVideoDisplayButton); + } + + ///////////////// + // FOV + lY++; + { + float fFOVMin = 50; + float fFOVMax = 83; + float fValue = mpConfig.GetFloat("Gameplay", "FOV", 70); + + float fAspectRatio = mpConfig.GetFloat("Screen", "Width", 1920) / mpConfig.GetFloat("Screen", "Height", 1080); + float fHorizontalFov = 2.0f * cMath_ATan(cMath_Tan(cMath_ToRad(fValue) / 2.0f) * fAspectRatio); + tString sTextValue = "" + cMath_RoundToInt(cMath_ToDeg(fHorizontalFov)); + + fValue = (fValue - fFOVMin) / (fFOVMax - fFOVMin); + float fNewValue = OptionMenu_ButtonOptionsSlider("FOV", kMainMenuButtonPos, lY, msSelectedVideoDisplayButton, fValue, 0.2f / 4.0f, mlActionHorizontal, sTextValue); + + if(fValue != fNewValue) + { + mlOptionChanges++; + fNewValue = fNewValue * (fFOVMax - fFOVMin) + fFOVMin; + mpConfig.SetFloat("Gameplay", "FOV", fNewValue); + } + + msSelectedVideoDisplayButton = OptionMenu_UpdateFocus("FOV", msSelectedVideoDisplayButton); + } + + ///////////////// + // Back + lY++; + lY++; + { + bool bButton = OptionMenu_ButtonOptions("Back", kMainMenuButtonPos, lY, msSelectedVideoDisplayButton); + bool bGamepad = ImGui_ActionTriggered(eImGuiAction_Cancel, true); + + if(bButton || bGamepad) + { + if(mlCurrentOptionChange != mlOptionChanges) + { + // Changes has been made + mbShowApplyChanges = true; + msFocusNextFrame = "NO"; + } + else + { + // No changes + mCurrentGroup = eMainMenuGroup_Options_Video; + + msFocusNextFrame = msSelectedVideoButton; + } + + ////////// + // Reset menu poos + if(bGamepad == false) + { + OptionMenu_GamepadButtons(msSelectedVideoDisplayButton != "Back"); + msSelectedVideoDisplayButton = "Resolution"; + return; + } + } + + msSelectedVideoDisplayButton = OptionMenu_UpdateFocus("Back", msSelectedVideoDisplayButton); + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(msSelectedVideoDisplayButton != "Back"); + } + + void GuiOptionsVideoWorld() + { + array vTextureValues = { "High", "Medium", "Low" }; + array vTextureFilterValues = { "Bilinear", "Trilinear", "Anis2x", "Anis4x", "Anis8x", "Anis16x" }; + array vShadowValues = { "Off", "Low", "Medium", "High", "VeryHigh" }; + OptionMenu_UpdateExtraWidth("TextureQuality", false); + OptionMenu_UpdateExtraWidth("TextureFiltering", false); + OptionMenu_UpdateExtraWidth("ShadowQuality", false); + OptionMenu_UpdateExtraWidth("Reflection", true); + OptionMenu_UpdateExtraWidth("Refraction", true); + OptionMenu_UpdateExtraButtonWidth_Toggle(); + OptionMenu_UpdateExtraButtonWidth_MultiSelection(vTextureValues); + OptionMenu_UpdateExtraButtonWidth_MultiSelection(vTextureFilterValues); + OptionMenu_UpdateExtraButtonWidth_MultiSelection(vShadowValues); + + //////////////////////////////////// + // Options background + ImGui_DrawFrame(mGfxFrame, OptionMenu_GetTopLeftOffset(kOptionsBgPos, 0.0), OptionMenu_GetScaledSize(kOptionsVideoWorldBgSize+cVector2f(OptionMenu_GetExtraWidth(), 0))); + + //////////////// + // Title + OptionMenu_SectionTitle("Rendering", kOptionsBgPos, kOptionsVideoWorldBgSize); + + int lY = 0; + + ///////////////// + // Textures + { + ///////////// + // Draw multi select box and update config + int lValue = mpConfig.GetInt("Graphics", "TextureQuality", 0); + int lNewValue = OptionMenu_ButtonOptionsMultiSelect("TextureQuality", kMainMenuButtonPos, lY, msSelectedVideoWorldButton, vTextureValues, lValue, true, mlActionHorizontal); + + if(lValue != lNewValue) + { + mpConfig.SetInt("Graphics", "TextureQuality", lNewValue); + mlOptionChanges++; + } + + msSelectedVideoWorldButton = OptionMenu_UpdateFocus("TextureQuality", msSelectedVideoWorldButton); + } + + ///////////////// + // Textures Filtering + lY++; + { + ///////////// + // Draw multi select box and update config + int lFilter = mpConfig.GetInt("Graphics", "TextureFilter", 0); + int lAnis = mpConfig.GetInt("Graphics", "TextureAnisotropy", 0); + + int lValue = 0; + + if(lAnis < 2) + { + lValue = lFilter == 2 ? 1 : 0; + } + else + { + if(lAnis == 2) lValue = 2; + else if(lAnis == 4) lValue = 3; + else if(lAnis == 8) lValue = 4; + else lValue = 5; + } + + int lNewValue = OptionMenu_ButtonOptionsMultiSelect("TextureFiltering", kMainMenuButtonPos, lY, msSelectedVideoWorldButton, vTextureFilterValues, lValue, false, mlActionHorizontal); + + if(lValue != lNewValue) + { + switch(lNewValue) + { + case 0: + lAnis = 1; + lFilter = 1; + break; + case 1: + lAnis = 1; + lFilter = 2; + break; + case 2: + lAnis = 2; + lFilter = 2; + break; + case 3: + lAnis = 4; + lFilter = 2; + break; + case 4: + lAnis = 8; + lFilter = 2; + break; + case 5: + lAnis = 16; + lFilter = 2; + break; + } + + + mpConfig.SetInt("Graphics", "TextureFilter", lFilter); + mpConfig.SetInt("Graphics", "TextureAnisotropy", lAnis); + mlOptionChanges++; + } + + msSelectedVideoWorldButton = OptionMenu_UpdateFocus("TextureFiltering", msSelectedVideoWorldButton); + } + + ///////////////// + // Shadows + lY++; + { + ///////////// + // Draw multi select and update config + int lShadowActive = mpConfig.GetBool("Graphics", "ShadowsActive", true) ? 1 : 0; + int lShadowQuality = mpConfig.GetInt("Graphics", "ShadowResolution", 2); + int lValue = lShadowActive * (lShadowQuality+1); + int lNewValue = OptionMenu_ButtonOptionsMultiSelect("ShadowQuality", kMainMenuButtonPos, lY, msSelectedVideoWorldButton, vShadowValues, lValue, false, mlActionHorizontal); + + if(lValue != lNewValue) + { + if(lNewValue == 0) + { + mpConfig.SetBool("Graphics", "ShadowsActive", false); + } + else + { + mpConfig.SetBool("Graphics", "ShadowsActive", true); + mpConfig.SetInt("Graphics", "ShadowResolution", lNewValue-1); + } + mlOptionChanges++; + } + + msSelectedVideoWorldButton = OptionMenu_UpdateFocus("ShadowQuality", msSelectedVideoWorldButton); + } + + ///////////////// + // Reflection + lY++; + { + ////////////// + // Draw button and update config + bool bValue = mpConfig.GetBool("Graphics", "WorldReflection", true); + bool bNewValue = OptionMenu_ButtonOptionsToggle("Reflection", kMainMenuButtonPos, lY, msSelectedVideoWorldButton, bValue, mlActionHorizontal); + + if(bValue != bNewValue) + { + mpConfig.SetBool("Graphics", "WorldReflection", bNewValue); + mlOptionChanges++; + } + + msSelectedVideoWorldButton = OptionMenu_UpdateFocus("Reflection", msSelectedVideoWorldButton); + } + + ///////////////// + // Refraction + lY++; + { + ////////////// + // Draw button and update config + bool bValue = mpConfig.GetBool("Graphics", "Refraction", true); + bool bNewValue = OptionMenu_ButtonOptionsToggle("Refraction", kMainMenuButtonPos, lY, msSelectedVideoWorldButton, bValue, mlActionHorizontal); + + if(bValue != bNewValue) + { + mpConfig.SetBool("Graphics", "Refraction", bNewValue); + mlOptionChanges++; + } + + msSelectedVideoWorldButton = OptionMenu_UpdateFocus("Refraction", msSelectedVideoWorldButton); + } + /* + ///////////////// + // Tesselation + lY++; + { + ///////////// + // Draw multi select and update config + array vValues = { "Off", "Low", "Medium", "High" }; + int lValue = mpConfig.GetInt("Graphics", "TerrainTessellation", 0); + int lNewValue = OptionMenu_ButtonOptionsMultiSelect("TerrainTessellation", kMainMenuButtonPos, lY, msSelectedVideoWorldButton, vValues, lValue, false, mlActionHorizontal); + + if(lValue != lNewValue) + { + mpConfig.SetInt("Graphics", "TerrainTessellation", lNewValue); + mlOptionChanges++; + } + + msSelectedVideoWorldButton = OptionMenu_UpdateFocus("TerrainTessellation", msSelectedVideoWorldButton); + } + */ + ///////////////// + // Back + lY++; + lY++; + { + bool bButton = OptionMenu_ButtonOptions("Back", kMainMenuButtonPos, lY, msSelectedVideoWorldButton); + bool bGamepad = ImGui_ActionTriggered(eImGuiAction_Cancel, true); + + if(bButton || bGamepad) + { + if(mlCurrentOptionChange != mlOptionChanges) + { + // Changes has been made + mbShowApplyChanges = true; + msFocusNextFrame = "NO"; + } + else + { + // No changes + mCurrentGroup = eMainMenuGroup_Options_Video; + msFocusNextFrame = msSelectedVideoButton; + } + + ////////// + // Reset menu poos + if(bGamepad == false) + { + OptionMenu_GamepadButtons(msSelectedVideoWorldButton != "Back"); + msSelectedVideoWorldButton = "TextureQuality"; + return; + } + } + + msSelectedVideoWorldButton = OptionMenu_UpdateFocus("Back", msSelectedVideoWorldButton); + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(msSelectedVideoWorldButton != "Back"); + } + + + void GuiOptionsVideoPostEffect() + { + array vDOFValues = {"Low", "Medium", "High"}; + OptionMenu_UpdateExtraWidth("DepthOfField", false); + OptionMenu_UpdateExtraWidth("SSAO", true); + OptionMenu_UpdateExtraWidth("Bloom", true); + OptionMenu_UpdateExtraButtonWidth_Toggle(); + OptionMenu_UpdateExtraButtonWidth_MultiSelection(vDOFValues); + + //////////////////////////////////// + // Options background + ImGui_DrawFrame(mGfxFrame, OptionMenu_GetTopLeftOffset(kOptionsBgPos, 0.0), OptionMenu_GetScaledSize(kOptionsVideoPostEffectBgSize+cVector2f(OptionMenu_GetExtraWidth(), 0))); + + //////////////// + // Title + OptionMenu_SectionTitle("PostEffect", kOptionsBgPos, kOptionsVideoPostEffectBgSize); + + int lY = 0; + + ///////////////// + // DOF + { + ///////////// + // Draw multi select box and update config + int lValue = mpConfig.GetInt("Graphics", "DepthOfFieldQuality", 2); + int lNewValue = OptionMenu_ButtonOptionsMultiSelect("DepthOfField", kMainMenuButtonPos, lY, msSelectedVideoPostEffectButton, vDOFValues, lValue, false, mlActionHorizontal); + + if(lValue != lNewValue) + { + mpConfig.SetInt("Graphics", "DepthOfFieldQuality", lNewValue); + mlOptionChanges++; + } + + msSelectedVideoPostEffectButton = OptionMenu_UpdateFocus("DepthOfField", msSelectedVideoPostEffectButton); + } + + + ///////////////// + // SSAO + lY++; + { + ////////////// + // Draw button and update config + bool bValue = mpConfig.GetBool("Graphics", "SSAOActive", true); + bool bNewValue = OptionMenu_ButtonOptionsToggle("SSAO", kMainMenuButtonPos, lY, msSelectedVideoPostEffectButton, bValue, mlActionHorizontal); + + if(bValue != bNewValue) + { + mpConfig.SetBool("Graphics", "SSAOActive", bNewValue); + mlOptionChanges++; + } + + msSelectedVideoPostEffectButton = OptionMenu_UpdateFocus("SSAO", msSelectedVideoPostEffectButton); + } + + ///////////////// + // Bloom + lY++; + { + ////////////// + // Draw button and update config + bool bValue = mpConfig.GetBool("Graphics", "BloomActive", true); + bool bNewValue = OptionMenu_ButtonOptionsToggle("Bloom", kMainMenuButtonPos, lY, msSelectedVideoPostEffectButton, bValue, mlActionHorizontal); + + if(bValue != bNewValue) + { + mpConfig.SetBool("Graphics", "BloomActive", bNewValue); + mlOptionChanges++; + } + + msSelectedVideoPostEffectButton = OptionMenu_UpdateFocus("Bloom", msSelectedVideoPostEffectButton); + } + + ///////////////// + // Back + lY++; + lY++; + { + bool bButton = OptionMenu_ButtonOptions("Back", kMainMenuButtonPos, lY, msSelectedVideoPostEffectButton); + bool bGamepad = ImGui_ActionTriggered(eImGuiAction_Cancel, true); + + if(bButton || bGamepad) + { + if(mlCurrentOptionChange != mlOptionChanges) + { + // Changes has been made + mbShowApplyChanges = true; + msFocusNextFrame = "NO"; + } + else + { + // No changes + mCurrentGroup = eMainMenuGroup_Options_Video; + msFocusNextFrame = msSelectedVideoButton; + } + + ////////// + // Reset menu poos + if(bGamepad == false) + { + OptionMenu_GamepadButtons(msSelectedVideoPostEffectButton != "Back"); + msSelectedVideoPostEffectButton = "DepthOfField"; + return; + } + } + + msSelectedVideoPostEffectButton = OptionMenu_UpdateFocus("Back", msSelectedVideoPostEffectButton); + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(msSelectedVideoPostEffectButton != "Back"); + } + + void GuiOptionsVideoGamma() + { + //////////////////////////////////// + // Options background + ImGui_DrawFrame(mGfxFrame, OptionMenu_GetTopLeftOffset(kOptionsBgPos, 0.0), OptionMenu_GetScaledSize(kOptionsVideoGammaBgSize)); + + //////////////// + // Title + OptionMenu_SectionTitle("Gamma", kOptionsBgPos, kOptionsVideoGammaBgSize); + + int lY = 0; + + ///////////////// + // Gamma + { + float fValue = (mpConfig.GetFloat("Graphics", "Brightness", 1.0f) - 0.3f) / (2.0f - 0.6f); + float fNewValue = OptionMenu_ButtonOptionsSlider("Gamma", kMainMenuButtonPos, lY, msSelectedVideoGammaButton, fValue, 0.05f, mlActionHorizontal, ""); + + if(fNewValue != fValue) + { + mpConfig.SetFloat("Graphics", "Brightness", (fNewValue * (2.0f - 0.6f) + 0.3f)); + ApplySettings(false); + } + + msSelectedVideoGammaButton = OptionMenu_UpdateFocus("Gamma", msSelectedVideoGammaButton); + } + + + ///////////////// + // Back + lY++; + lY++; + { + bool bButton = OptionMenu_ButtonOptions("Back", kMainMenuButtonPos, lY, msSelectedVideoGammaButton); + bool bGamepad = ImGui_ActionTriggered(eImGuiAction_Cancel, true); + + if(bButton || bGamepad) + { + if(Platform_IsPS4() || Platform_IsXBO()) + { + mCurrentGroup = eMainMenuGroup_Options; + msFocusNextFrame = msSelectedOptionsButton; + } + else + { + mCurrentGroup = eMainMenuGroup_Options_Video; + msFocusNextFrame = msSelectedVideoButton; + } + + ApplySettings(); + + ////////// + // Reset menu poos + if(bGamepad == false) + { + if(Platform_IsPS4()|| Platform_IsXBO()) + { + msSelectedOptionsButton = "Gamma"; + } + else + { + msSelectedVideoGammaButton = "Gamma"; + } + + OptionMenu_GamepadButtons(msSelectedVideoGammaButton != "Back"); + return; + } + } + + msSelectedVideoGammaButton = OptionMenu_UpdateFocus("Back", msSelectedVideoGammaButton); + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(msSelectedVideoGammaButton != "Back"); + } + + int GetCurrentResolution() + { + cVector2l vResolution = cVector2l(mpConfig.GetInt("Screen", "Width", 1280), + mpConfig.GetInt("Screen", "Height", 720)); + + if(vResolution.x == -1 || vResolution.y == -1) + { + vResolution.x = cGraphics_GetLowLevel().GetScreenSizeInt().x; + vResolution.y = cGraphics_GetLowLevel().GetScreenSizeInt().y; + } + + for(int i = 0; i < mvResolutionSizes.size(); ++i) + { + if(vResolution == mvResolutionSizes[i]) + { + return i; + } + } + + //////////// + // Custom resolution + mvResolutionSizes.push_back(vResolution); + mvResolutionValues.push_back(""+vResolution.x + "x"+vResolution.y); + + return mvResolutionValues.size()-1; + } + + void SetCurrentResolution(int aID) + { + aID = (aID + mvResolutionSizes.size()) % mvResolutionSizes.size(); + + mpConfig.SetInt("Screen", "Width", mvResolutionSizes[aID].x); + mpConfig.SetInt("Screen", "Height", mvResolutionSizes[aID].y); + } + + int GetCurrentRefreshRate() + { + int lRate = mpConfig.GetInt("Screen", "RefreshRate", 0); + + if(lRate == 0) + { + lRate = mvRefresh[mvRefresh.size()-1]; + } + + for(int i = 0; i < mvRefresh.size(); ++i) + { + if(lRate == mvRefresh[i]) + { + return i; + } + } + + //////////// + // Custom resolution + mvRefresh.push_back(lRate); + mvRefreshValues.push_back(""+lRate); + + return mvRefreshValues.size()-1; + } + + void SetCurrentRefreshRate(int aID) + { + aID = (aID + mvRefresh.size()) % mvRefresh.size(); + + mpConfig.SetInt("Screen", "RefreshRate", mvRefresh[aID]); + } + + //------------------------------------------------------ + + int GetBaseQualityAMD(tString asPrefix, int alCardNumber) + { + if(asPrefix == "HD") + { + if(alCardNumber < 5000) return 0; + if(alCardNumber < 6600) return 1; + if(alCardNumber < 7600) return 2; + if(alCardNumber < 8600) return 3; + if(alCardNumber < 9600) return 3; + } + else if(asPrefix == "R5") + { + return 1; + } + else if(asPrefix == "R7") + { + return 3; + } + else if(asPrefix == "R9") + { + return 4; + } + + return -1; + } + + int GetBaseQualityNvidia(int alCardNumber) + { + if(alCardNumber < 100 || alCardNumber > 1000) return -1; + + if(alCardNumber < 450) return 0; + if(alCardNumber < 550) return 1; + if(alCardNumber < 650) return 2; + if(alCardNumber < 750) return 3; + if(alCardNumber < 850) return 3; + if(alCardNumber < 1000) return 4; + + return -1; + } + + void GetQualityAndMemoryFromRenderer(int&out alQuality, int&out alVRAM) + { + ///////////// + // Get and parse graphics info + tString sGraphicsInfo = cGraphics_GetLowLevel().GetGraphicsInfo(); + Log("GraphicsInfo: " + sGraphicsInfo + "\n"); + array vInfo; + cString_GetStringVec(sGraphicsInfo, vInfo, ";"); + + alQuality = -1; + alVRAM = -1; + + if(vInfo.size() >= 5) + { + ///////////////// + // Parse vram + array vVRAM; + cString_GetStringVec(vInfo[4], vVRAM, " "); + + if(vVRAM.size() == 3) + { + alVRAM = cString_ToInt(vVRAM[1], -1); + } + else + { + // VRAM Parse failed, no need to continue + return; + } + + /////////////////// + // Get info about card + array vCardName; + cString_GetStringVec(vInfo[1], vCardName, " ,/\\"); + tString sModelPrefix; + int lVersion = 0; + bool bLaptop = false; + + for(uint i = 0; i < vCardName.size(); ++i) + { + ////////////// + // Check for mobile GPU + int lPos = cString_GetFirstCharPos(vCardName[i], 'M'); + + if(lPos == -1) + { + ////////////// + // Normal gpu + lVersion = cString_ToInt(vCardName[i], 0); + } + else + { + ////////////// + // Check if its at the start or end + if(lPos == 0) + { + lVersion = cString_ToInt(cString_Sub(vCardName[i], 1), 0); + + if(lVersion != 0) bLaptop = true; + } + else if(lPos == vCardName[i].length() - 1) + { + lVersion = cString_ToInt(cString_Sub(vCardName[i], 0, lPos), 0); + + if(lVersion != 0) bLaptop = true; + } + } + + if(lVersion != 0) break; + + sModelPrefix = vCardName[i]; + } + + ////////////// + // Convert card to quality setting + if(cString_GetFirstStringPos(vInfo[0], "NVIDIA") != -1) + { + alQuality = GetBaseQualityNvidia(lVersion); + } + else if(cString_GetFirstStringPos(vInfo[0], "AMD") != -1 || + cString_GetFirstStringPos(vInfo[0], "ATI") != -1) + { + alQuality = GetBaseQualityAMD(sModelPrefix, lVersion); + } + else if(cString_GetFirstStringPos(vInfo[0], "Intel") != -1) + { + // Special case for intel cards + alQuality = 0; + alVRAM = 1024; + } + + ////////////// + // Downgrade quality one level for laptops + if(bLaptop) + { + alQuality = cMath_Max(alQuality - 1, 0); + } + } + } + + void AutoDetectSettings(bool abSkipOnHigh) + { + if(Platform_IsPS4() || Platform_IsXBO()) return; + + ///////////////////// + // Parse string to get quality and vram; + int lBaseQuality; + int lVRAM; + GetQualityAndMemoryFromRenderer(lBaseQuality, lVRAM); + + ///////////////// + // Get qúality based on vram and GPU card + eGraphicSettings setting = eGraphicSettings_High; + + if(lVRAM > 0) //valid VRAM? + { + switch(lBaseQuality) + { + case 0: + if(lVRAM < 1024) setting = eGraphicSettings_Low; + else if(lVRAM < 2048) setting = eGraphicSettings_Low; + else setting = eGraphicSettings_Medium; + break; + case 1: + if(lVRAM <= 1024) setting = eGraphicSettings_Low; + else if(lVRAM < 2048) setting = eGraphicSettings_Medium; + else setting = eGraphicSettings_Medium; + break; + case 2: + if(lVRAM <= 512) setting = eGraphicSettings_Low; + else if(lVRAM < 1024) setting = eGraphicSettings_Medium; + else if(lVRAM < 2048) setting = eGraphicSettings_Medium; + else setting = eGraphicSettings_High; + break; + case 3: + if(lVRAM < 512) setting = eGraphicSettings_Low; + else if(lVRAM < 1024) setting = eGraphicSettings_Medium; + else if(lVRAM < 2048) setting = eGraphicSettings_High; + else setting = eGraphicSettings_High; + break; + case 4: + if(lVRAM < 512) setting = eGraphicSettings_Low; + else if(lVRAM < 1024) setting = eGraphicSettings_Medium; + else if(lVRAM < 2048) setting = eGraphicSettings_High; + else setting = eGraphicSettings_High; + break; + default: + setting = eGraphicSettings_High; //Set to high if unsure + break; + } + } + + tString sQuality; + if(setting == eGraphicSettings_Low) sQuality = "Low"; + if(setting == eGraphicSettings_Medium) sQuality = "Medium"; + if(setting == eGraphicSettings_High) sQuality = "High"; + + Log("AutoDetect Quality: " + sQuality + "; Base "+ lBaseQuality + "; VRAM " + lVRAM + " mb\n"); + + //////////////////// + // Update config based on quality selected + switch(setting) + { + case eGraphicSettings_High: + if(abSkipOnHigh) return; + + mpConfig.SetString("Graphics", "AntiAliasing", "FXAA"); + mpConfig.SetInt("Graphics", "TextureFilter", 2); + mpConfig.SetInt("Graphics", "TextureAnisotropy", 16); + mpConfig.SetBool("Graphics", "ShadowsActive", true); + mpConfig.SetInt("Graphics", "ShadowResolution", 2); + mpConfig.SetBool("Graphics", "WorldReflection", true); + mpConfig.SetBool("Graphics", "Refraction", true); + mpConfig.SetInt("Graphics", "DepthOfFieldQuality", 2); + mpConfig.SetBool("Graphics", "SSAOActive", true); + mpConfig.SetBool("Graphics", "BloomActive", true); + if(mpConfig.GetInt("Screen", "RefreshRate", 0) == 30) mpConfig.SetInt("Screen", "RefreshRate", 60); + if(lBaseQuality >= 4) mpConfig.SetString("Screen", "Vsync", "true"); + else mpConfig.SetString("Screen", "Vsync", "off"); + break; + case eGraphicSettings_Medium: + mpConfig.SetString("Graphics", "AntiAliasing", "Off"); + mpConfig.SetInt("Graphics", "TextureFilter", 2); + mpConfig.SetInt("Graphics", "TextureAnisotropy", 2); + mpConfig.SetBool("Graphics", "ShadowsActive", true); + mpConfig.SetInt("Graphics", "ShadowResolution", 1); + mpConfig.SetBool("Graphics", "WorldReflection", false); + mpConfig.SetBool("Graphics", "Refraction", true); + mpConfig.SetInt("Graphics", "DepthOfFieldQuality", 1); + mpConfig.SetBool("Graphics", "SSAOActive", true); + mpConfig.SetBool("Graphics", "BloomActive", true); + if(mpConfig.GetInt("Screen", "RefreshRate", 0) == 30) mpConfig.SetInt("Screen", "RefreshRate", 60); + mpConfig.SetString("Screen", "Vsync", "false"); + break; + case eGraphicSettings_Low: + mpConfig.SetString("Graphics", "AntiAliasing", "Off"); + mpConfig.SetInt("Graphics", "TextureFilter", 2); + mpConfig.SetInt("Graphics", "TextureAnisotropy", 0); + mpConfig.SetBool("Graphics", "ShadowsActive", false); + mpConfig.SetInt("Graphics", "ShadowResolution", 0); + mpConfig.SetBool("Graphics", "WorldReflection", false); + mpConfig.SetBool("Graphics", "Refraction", false); + mpConfig.SetInt("Graphics", "DepthOfFieldQuality", 0); + mpConfig.SetBool("Graphics", "SSAOActive", false); + mpConfig.SetBool("Graphics", "BloomActive", false); + mpConfig.SetInt("Screen", "RefreshRate", 30); + mpConfig.SetString("Screen", "Vsync", "false"); + break; + } + + + ////////////////// + // Update texture quality based on just the VRAM + if(lVRAM > 0) //valid VRAM? + { + if(lVRAM >= 1700) mpConfig.SetInt("Graphics", "TextureQuality", 0); //high + else if(lVRAM >= 512) mpConfig.SetInt("Graphics", "TextureQuality", 1); //medium + else mpConfig.SetInt("Graphics", "TextureQuality", 2); //low + } + + /////////////// + // Apply config + ApplySettings(true); + mlCurrentResolution = GetCurrentResolution(); //keep track of resolution to be able to revert if invalid is selected + } + + //------------------------------------------------------ + + void GuiOptionsAudio() + { + + //////////////////////////////////// + // Options background + cVector2f vBgSize = kOptionsAudioBgSize; + array vSpeakerValues = {"SmallTV", "MediumTV", "HomeCinema", "Headphones", "RemotePlay", "NightMode"}; + if(Platform_IsPS4() || Platform_IsXBO()) + { + vBgSize.y += 35; + OptionMenu_UpdateExtraButtonWidth_MultiSelection(vSpeakerValues); + OptionMenu_UpdateExtraWidth("SpeakerType", false); + } + OptionMenu_UpdateExtraWidth("Volume", false); + OptionMenu_UpdateExtraWidth("Subtitles", true); + OptionMenu_UpdateExtraWidth("HearingAid", true); + OptionMenu_UpdateExtraButtonWidth_Toggle(); + + ImGui_DrawFrame(mGfxFrame, OptionMenu_GetTopLeftOffset(kOptionsBgPos, 0.0), OptionMenu_GetScaledSize(vBgSize+cVector2f(OptionMenu_GetExtraWidth(), 0))); + + //////////////// + // Audio + OptionMenu_SectionTitle("Audio", kOptionsBgPos, vBgSize); + + int lY=0; + + ///////////////// + // Speaker type + if(Platform_IsPS4() || Platform_IsXBO()) + { + ///////////// + // Draw multi select box and update config + tString sValue = mpConfig.GetString("Sound", "SpeakerType", "HomeCinema"); + int lValue =-1; + for(int i=0;i 0) + { + MessageBoxKeepResolution(); + } + else if(mlActionToBind > 0) + { + MessageBoxKeybind(); + } + else if(mbShowRestartWarning) + { + MessageBoxRestartWarning(); + } + else if(mbShowExit) + { + if(mbMainMenuActive) + { + MessageBoxExitFromMainMenu(); + } + else + { + MessageBoxExitFromPauseMenu(); + } + } + else if(mbShowPlayGo) + { + MessageBoxPlayGo(); + } + else if(mbShowNewGame) + { + MessageBoxNewGame(); + } + else if(mbShowLoadGame) + { + MessageBoxLoadGame(); + } + else if(msLoadSaveError.length() > 0) + { + MessageBoxLoadError(); + } + else if(mbShowDetectSettings) + { + MessageBoxDetectSettings(); + } + } + + void MessageBoxApplyChanges() + { + //////////////// + // Apply changes message box + int lSelect = OptionMenu_MessageBox_Proper("ApplyChanges", "Yes", "No", msMessageBoxFocus, msMessageBoxFocus); + ImGui_SetModUseInput(false); //disable input for any other widgets + + if(lSelect == -1) + { + ApplySettings(); + + if(Platform_IsPS4() || Platform_IsXBO()) + { + mCurrentGroup = eMainMenuGroup_Options; + msFocusNextFrame = msSelectedOptionsButton; + } + else + { + mCurrentGroup = eMainMenuGroup_Options_Video; + msFocusNextFrame = msSelectedVideoButton; + } + + mbShowRestartWarning = mbRestartWarning; + mbShowApplyChanges = false; + + if(GetCurrentResolution() != mlCurrentResolution && Platform_IsPS4() == false && Platform_IsXBO() == false ) + { + //////////// + // If resolution has changed + mfKeepDisplaySetting = 15; + } + + if(mfKeepDisplaySetting > 0) msFocusNextFrame = "No"; + else if(mbShowRestartWarning == false) msFocusNextFrame = msSelectedVideoButton; + else if(mbShowRestartWarning) msFocusNextFrame = "Ok"; + } + else if(lSelect == 1) + { + DiscardSettings(); + + if(Platform_IsPS4() || Platform_IsXBO()) + { + mCurrentGroup = eMainMenuGroup_Options; + msFocusNextFrame = msSelectedOptionsButton; + } + else + { + mCurrentGroup = eMainMenuGroup_Options_Video; + msFocusNextFrame = msSelectedVideoButton; + } + + mbShowApplyChanges = false; + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(true); + } + + void MessageBoxApplyKeyChanges() + { + //////////////// + // Apply changes message box + int lSelect = OptionMenu_MessageBox_Proper("ApplyChanges", "Yes", "No", msMessageBoxFocus, msMessageBoxFocus); + ImGui_SetModUseInput(false); //disable input for any other widgets + + if(lSelect == -1) + { + ApplyKeybinds(); + + mCurrentGroup = eMainMenuGroup_Options_Input; + msFocusNextFrame = msSelectedInputButton; + mbShowApplyKeyChanges = false; + } + else if(lSelect == 1) + { + DiscardKeybinds(); + + mCurrentGroup = eMainMenuGroup_Options_Input; + msFocusNextFrame = msSelectedInputButton; + mbShowApplyKeyChanges = false; + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(true); + } + + void MessageBoxDuplicateKeys() + { + //////////////// + // Apply changes message box + int lSelect = OptionMenu_MessageBox_Proper("DuplicateKeys", "Yes", "No", msMessageBoxFocus, msMessageBoxFocus); + ImGui_SetModUseInput(false); //disable input for any other widgets + + if(lSelect == -1) + { + msFocusNextFrame = "Yes"; + mbShowDuplicateKeys = false; + } + else if(lSelect == 1) + { + msFocusNextFrame = "Back"; + mbShowDuplicateKeys = false; + mbShowApplyKeyChanges = false; + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(true); + } + + void MessageBoxResetKeys() + { + //////////////// + // Apply changes message box + int lSelect = OptionMenu_MessageBox_Proper("ResetToDefaultMessage", "Yes", "No", msMessageBoxFocus, msMessageBoxFocus); + ImGui_SetModUseInput(false); //disable input for any other widgets + + if(lSelect == -1) + { + // Erase all settings + if(mbBindingGamepad) + { + for(int i = 0; i < mvGamepadActions.size(); ++i) + { + mpKeyConfig.EraseValue(mvGamepadActions[i].msAction, "GamepadPrimary"); + mpKeyConfig.EraseValue(mvGamepadActions[i].msAction, "GamepadSecondary"); + } + } + else + { + for(int i = 0; i < mvActions.size(); ++i) + { + mpKeyConfig.EraseValue(mvActions[i].msAction, "Primary"); + mpKeyConfig.EraseValue(mvActions[i].msAction, "Secondary"); + } + } + + // Get default settings by reloading key config + cLux_GetInputHandler().LoadKeyConfig(); + + mbKeybindChanged = true; + msFocusNextFrame = "ResetToDefault"; + mbShowReset = false; + + ///////////// + // Reloading keys will make actions trigger again, so ignore next frame + mlIgnoreInput = 3; + } + else if(lSelect == 1) + { + msFocusNextFrame = "ResetToDefault"; + mbShowReset = false; + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(true); + } + + void MessageBoxRestartWarning() + { + ////////////// + // Restart warning message box + int lSelect = OptionMenu_MessageBox_Proper("RestartRequired", "Ok", msMessageBoxFocus, msMessageBoxFocus); + ImGui_SetModUseInput(false); //disable input for any other widgets + + + if(lSelect == 1) + { + mbShowRestartWarning = false; + msFocusNextFrame = msSelectedVideoButton; + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(false); + } + + void MessageBoxKeepResolution() + { + ////////////// + // Restart warning message box + int lSelect = OptionMenu_MessageBox_Proper("KeepSettings", "Yes", "No", msMessageBoxFocus, msMessageBoxFocus, cString_To16Char(""+cMath_RoundToInt(mfKeepDisplaySetting+0.5))); + ImGui_SetModUseInput(false); //disable input for any other widgets + + mfKeepDisplaySetting -= 1.0 / 60.0; + + if(lSelect == -1) + { + // Keep settings + if(mbShowRestartWarning) msFocusNextFrame = "Ok"; + else msFocusNextFrame = msSelectedVideoButton; + + mfKeepDisplaySetting = 0; + } + else if(lSelect == 1 || mfKeepDisplaySetting <= 0) + { + ////////// + // Revert to old settings + mpConfig.SetString("Screen", "FullScreen", msCurrentDisplayMode); + SetCurrentResolution(mlCurrentResolution); + ApplySettings(); + + if(mbShowRestartWarning) msFocusNextFrame = "Ok"; + else msFocusNextFrame = msSelectedVideoButton; + + mfKeepDisplaySetting = 0; + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(false); + } + + void MessageBoxPlayGo() + { + //////////////// + // Get time left + int lETA = 0; + cLux_IsPlayGoReady(lETA); + + int lSeconds = lETA % 60; + int lMinutes = (lETA / 60) % 60; + int lHour = (lETA / 3600); + + tString sTime; + + if( Platform_IsXBO() ) + { + if(lETA > 0) sTime += lETA + "%"; + } + else + { + if(lHour > 9) sTime += lHour + ":"; + else if(lHour > 0) sTime += "0"+lHour + ":"; + + if(lMinutes > 9) sTime += lMinutes + ":"; + else if(lMinutes > 0) sTime += "0"+lMinutes + ":"; + + if(lSeconds > 9) sTime += lSeconds; + else if(lSeconds > 0) sTime += "0"+lSeconds; + } + + if(lETA == 0) + { + mfPlayGoTimer -= 1.0f / 30.0f; + sTime = ""; + } + else + { + mfPlayGoTimer = 3.0f; + } + + ////////////// + // Restart warning message box + int lSelect = OptionMenu_MessageBox_Proper("PlayGoInstructions", "Ok", "", msMessageBoxFocus, msMessageBoxFocus, cString_To16Char(sTime)); + ImGui_SetModUseInput(false); //disable input for any other widgets + + if(lSelect == 1 || mfPlayGoTimer < 0) + { + mbShowPlayGo = false; + msFocusNextFrame = msSelectedMainMenuButton; + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(false); + } + + void MessageBoxKeybind() + { + //////////////////////////////////// + // Darken other widgets + cImGuiGfx gfx; + ImGui_DrawGfx(gfx, ImGui_NrmPos(0,0,24.5f), ImGui_NrmSize(2.0), cColor(0.0, 0.75)); + + //////////////////////////////////// + // Options background + ImGui_DrawFrame(mGfxFrame, OptionMenu_GetTopLeftOffset(kOptionsBgPos, 0.0), OptionMenu_GetScaledSize(kOptionMenu_KeybindBgSize)); + + /////////////// + // Draw title + cImGuiLabelData labelData; + labelData.mFont.SetFile(Helper_Font_GetFontName(eLuxFontType_Sansation_Large_Bold)); + labelData.mFont.mvSize = cVector2f(36, 36); + labelData.mFont.mColor = cColor(1,1); + labelData.mFontAlign = eFontAlign_Center; + + ////////////// + // Get data based on bind type + bool bAnalog = mbBindingGamepad ? mvGamepadActions[mlActionToBind-1].mbAnalog : mvActions[mlActionToBind-1].mbAnalog; + tString sAction = mbBindingGamepad ? mvGamepadActions[mlActionToBind-1].msAction : mvActions[mlActionToBind-1].msAction; + + if(bAnalog) + { + tString sLabel = msKeybindFirstState.length() == 0 ? "PressRightGamepad" : "PressUpGamepad"; + + ImGui_DoLabelExt(sLabel,labelData, OptionMenu_GetTopLeftOffset(kOptionMenu_KeybindBgPos + cVector2f(kOptionMenu_KeybindBgSize.x * 0.45,15), 5.5), 0); + } + else + { + ImGui_DoLabelExt("PressAnyKey",labelData, OptionMenu_GetTopLeftOffset(kOptionMenu_KeybindBgPos + cVector2f(kOptionMenu_KeybindBgSize.x * 0.45,15), 5.5), 0); + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(false); + + /////////////// + // Check if keybind button was pressed + tString sKeyPressed = cLux_GetInputHandler().GetLatestKeyPressed(); + + if(sKeyPressed.length() > 0) + { + ///////////// + // Disable cancel + ImGui_ActionTriggered(eImGuiAction_Cancel, true); + + if(sKeyPressed != "Keyboard.Escape") + { + ////////////// + // Check for valid keys + if(mbBindingGamepad) + { + // Only allow gamepad 0 + if(cString_GetFirstStringPos(sKeyPressed, "Gamepad.0") == -1) + { + return; + } + } + else + { + // Only allow mouse or keyboard + if(cString_GetFirstStringPos(sKeyPressed, "Gamepad") >= 0) + { + return; + } + } + + if(bAnalog) + { + ///////////////// + // Analog requires two binds in a row and must be from gamepad + if(cString_GetFirstStringPos(sKeyPressed, "Gamepad") != -1 && + cString_GetFirstStringPos(sKeyPressed, "Axis") != -1) + { + if(msKeybindFirstState.length() == 0) + { + msKeybindFirstState = sKeyPressed; + return; + } + else if(sKeyPressed != msKeybindFirstState) + { + sKeyPressed = msKeybindFirstState +"."+ ParseKeybind(sKeyPressed, false); + } + else + { + return; //Skip binding if its the same axis again + } + } + else + { + return; //Skip binding if not a gamepad axis + } + } + + + mpKeyConfig.SetString(sAction, msKeybindSlot, sKeyPressed); + mbKeybindChanged = true; + mlIgnoreInput = 3; + } + + mlActionToBind = 0; + msFocusNextFrame = msFocusAfterBind; + } + } + + void MessageBoxExitFromPauseMenu() + { + ////////////// + // Restart warning message box + bool bExitToMenu = mpConfig.GetBool("Main", "ShowMenu", true); + tString sMessageBoxText = "ExitNoSaveToMenuMessageBox"; + if(bExitToMenu) + { + if(mbSaveAndExit) + sMessageBoxText = "ExitToMenuMessageBox"; + } + else + { + if(mbSaveAndExit) + sMessageBoxText = "ExitMessageBox"; + } + int lSelect = OptionMenu_MessageBox_Proper(sMessageBoxText, "Yes", "No", msMessageBoxFocus, msMessageBoxFocus); + ImGui_SetModUseInput(false); //disable input for any other widgets + + if(lSelect == 1) + { + /////////// + // Cancel + if(mbSaveAndExit) + msFocusNextFrame = "SaveAndExit"; + else + msFocusNextFrame = "Exit"; + + mbShowExit = false; + mbSaveAndExit = false; + + } + else if(lSelect == -1) + { + /////////// + // Check for exit to menu or exit game + if(bExitToMenu) + { + //mbMenuActive = false; + LoadScreen_SetUseSmallIcon(false); + cLux_GetGuiHandler().SetGameHudInputFocus(false); + + if(mbSaveAndExit && Map_IsChanging() == false) + { + Game_AutoSave(false, false); + } + + ImGui_AddTimer("ExitToMainMenu", mfFadeLength); + Map_FadeOut(mfFadeLength); + Music_StopAll(mfFadeLength); + Sound_Stop("MenuBGNoise", mfFadeLength); + } + else + { + if(mbSaveAndExit && Map_IsChanging() == false) + { + Game_AutoSave(false, false); + } + + //mbMenuActive = false; + //if(mpConfig.GetBool("Main", "ShowMenu", true) == false) cLux_Exit(); + + ImGui_AddTimer("ExitGame", mfExitGameFadeLength); + Map_FadeOut(mfExitGameFadeLength); + Music_StopAll(mfExitGameFadeLength); + Sound_Stop("MenuBGNoise", mfFadeLength); + } + + return; + } + } + + void MessageBoxExitFromMainMenu() + { + ////////////// + // Restart warning message box + int lSelect = OptionMenu_MessageBox_Proper("ExitMessageBox", "Yes", "No", msMessageBoxFocus, msMessageBoxFocus); + ImGui_SetModUseInput(false); //disable input for any other widgets + + if(lSelect == 1) + { + /////////// + // Cancel + mbShowExit = false; + mbSaveAndExit = false; + msFocusNextFrame = "Exit"; + } + else if(lSelect == -1) + { + /////////// + // Exit the game + //SetMenuActive(false); + //cLux_Exit(); + + cLux_GetGuiHandler().SetGameHudInputFocus(false); + + ImGui_AddTimer("ExitGame", mfExitGameFadeLength); + Map_FadeOut(mfExitGameFadeLength); + Music_StopAll(mfExitGameFadeLength); + Sound_Stop("MenuBGNoise", mfExitGameFadeLength); + + return; + } + } + + void MessageBoxNewGame() + { + ////////////// + // Restart warning message box + int lSelect = OptionMenu_MessageBox_Proper("OverwriteGame", "Yes", "No", msMessageBoxFocus, msMessageBoxFocus); + + if(lSelect == 1) + { + /////////// + // Cancel + mbShowNewGame = false; + msFocusNextFrame = cLux_GetSupportExplorationMode() ? "StartGame" : "NewGame"; + } + else if(lSelect == -1) + { + /////////// + // Load the game + ClickNewGame(); + + cLux_GetGuiHandler().SetGameHudInputFocus(false); + return; + } + } + + void MessageBoxLoadGame() + { + ////////////// + // Restart warning message box + int lSelect = OptionMenu_MessageBox_Proper("LoadMessageBox", "Yes", "No", msMessageBoxFocus, msMessageBoxFocus); + ImGui_SetModUseInput(false); //disable input for any other widgets + + if(lSelect == 1) + { + /////////// + // Cancel + mbShowLoadGame = false; + + if(mCurrentGroup == eMainMenuGroup_LoadGame) + { + if(mlSelectedLoadButton >= 0 && mlSelectedLoadButton < 10) msFocusNextFrame = "Save"+mlSelectedLoadButton; + else msFocusNextFrame = "Back"; + } + else + { + msFocusNextFrame = "Continue"; + } + } + else if(lSelect == -1) + { + /////////// + // Load the game + ImGui_AddTimer("LoadGame", mfFadeLength); + cSound_FadeOutAll(eSoundEntryType_WorldAll, 1.0f / mfFadeLength, false); + Music_StopAll(mfFadeLength); + Sound_Stop("MenuBGNoise", mfFadeLength); + mbShowLoadGame = false; + cLux_GetGuiHandler().SetGameHudInputFocus(false); + return; + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(false); + } + + void MessageBoxLoadError() + { + ////////////// + // Restart warning message box + ImGui_SetTransCategory("LoadGame"); + int lSelect = OptionMenu_MessageBox_Proper(msLoadSaveError, "Ok", "", msMessageBoxFocus, msMessageBoxFocus, ImGui_Translate(mbProfileError ? "DeleteProfile" : "DeleteSave")); + ImGui_SetModUseInput(false); //disable input for any other widgets + ImGui_SetTransCategory("Menu"); + + if(lSelect == 1) + { + msLoadSaveError = ""; + + if(mbProfileError == false && cString_To8Char(msPreviousSaveLoaded) != "") + { + ////////////////// + //Delete the save file + cLux_GetSaveHandler().DeleteSaveFile(msPreviousSaveLoaded); + + for(int i = 0; i < mvSaveFiles.size(); ++i) + { + if(cString_To8Char(mvSaveFiles[i]) == + cString_To8Char(msPreviousSaveLoaded)) + { + for(int j = i + 1; j < mvSaveFiles.size(); ++j) + { + mvSaveFiles[j-1] = mvSaveFiles[j]; + mvSaveDates[j-1] = mvSaveDates[j]; + mvSaveNames[j-1] = mvSaveNames[j]; + } + + mvSaveFiles.resize(mvSaveFiles.size()-1); + mvSaveDates.resize(mvSaveDates.size()-1); + mvSaveNames.resize(mvSaveNames.size()-1); + + break; + } + } + + if(cString_To8Char(msContinueFile) == cString_To8Char(msPreviousSaveLoaded)) msContinueFile = ""; + msPreviousSaveLoaded = ""; + + mbCanContinue = mvSaveFiles.size() > 0; + + if(mbCanContinue) + { + msContinueFile = mvSaveFiles[0]; + + /////////// + // Remove "CheckPoint" from save file list + for(int i = 0; i < mvSaveFiles.size(); ++i) + { + if(mvSaveNames[i] == tWString("CheckPoint")) + { + for(int j = i + 1; j < mvSaveFiles.size(); ++j) + { + mvSaveFiles[j-1] = mvSaveFiles[j]; + mvSaveDates[j-1] = mvSaveDates[j]; + mvSaveNames[j-1] = mvSaveNames[j]; + } + + mvSaveFiles.resize(mvSaveFiles.size()-1); + mvSaveDates.resize(mvSaveDates.size()-1); + mvSaveNames.resize(mvSaveNames.size()-1); + + break; + } + } + } + } + } + + /////////// + // Show gamepad legacy + if(mbProfileError == false) OptionMenu_GamepadButtons(false); + } + + void MessageBoxDetectSettings() + { + //////////////// + // Apply changes message box + int lSelect = OptionMenu_MessageBox_Proper("DetectSettingsPrompt", "Yes", "No", msMessageBoxFocus, msMessageBoxFocus); + ImGui_SetModUseInput(false); //disable input for any other widgets + + if(lSelect == -1) + { + AutoDetectSettings(false); + mbShowDetectSettings = false; + } + else if(lSelect == 1) + { + mbShowDetectSettings = false; + } + + /////////// + // Show gamepad legacy + OptionMenu_GamepadButtons(true); + } + + //------------------------------------------------------ + + void GuiGammaCorrection() + { + array vSpeakerValues = {"SmallTV", "MediumTV", "HomeCinema", "Headphones", "RemotePlay", "NightMode"}; + OptionMenu_UpdateExtraWidth("Gamma", false); + if ((Platform_IsPS4() || Platform_IsXBO()) && mbPremenuActive) + { + OptionMenu_UpdateExtraWidth("SpeakerType", false); + OptionMenu_UpdateExtraButtonWidth_MultiSelection(vSpeakerValues); + } + + ///////////// + // Accept pressed + bool bAccept = ImGui_ActionTriggered(eImGuiAction_Confirm, true); + bool bCancelled = ImGui_ActionTriggered(eImGuiAction_Cancel, true); + + ///////////// + // Setup + cVector2f vAspect = cGraphics_GetLowLevel().GetScreenSizeFloat(); + float fAspect = vAspect.x/vAspect.y; + if(fAspect>=3.75f) + fAspect/=3.0f; + + float fAspectCorrection = 0.5625 * fAspect; + + cGuiSet@ pSet = cLux_GetCurrentImGui().GetSet(); + cVector2f vSize = pSet.GetVirtualSize(); + + bool bShowAcceptOnly = mbPremenuActive; + + float fAlpha = mbPremenuActive ? mfPreMenuFadeAmount : 1; + OptionMenu_SetModColor(cColor(1, fAlpha)); + + ///////////////////////////////////// + // Background + cImGuiGfx gfx("gamma_background.tga", eImGuiGfx_Texture); + cVector2f vBgSize = OptionMenu_GetScaledSize(cVector2f(1280, 720) * 0.67) * cVector2f(fAspectCorrection); + cVector3f vBgPos = OptionMenu_GetCenterOffset(cVector2f(0), 5.2) - cVector3f(vBgSize.x * 0.5, vBgSize.y * 0.75, 0.0); + ImGui_DrawGfx(gfx, vBgPos, vBgSize, cColor(1, fAlpha)); + + ///////////////////// + // Help text + { + cImGuiTextFrameData frameData; + frameData.mFont.SetFile(Helper_Font_GetFontName(eLuxFontType_Sansation_Large_Bold)); + frameData.mFont.mvSize = cVector2f(24, 24); + frameData.mFont.mColor = cColor(1,fAlpha); + frameData.mbUseBackgroundGfx = false; + frameData.mFontAlign = eFontAlign_Left; + + ImGui_DoTextFrameExt("GammaInstructions0", cVector2f(0), 2.0, 0.0, frameData, OptionMenu_GetCenterOffset(cVector2f(0), 5.3) + cVector3f(vBgSize.x *-0.5, vBgSize.y * 0.17, 0), vBgSize); + } + + //////////////// + // Setup variables + float fOffsetX = (vBgPos.x - OptionMenu_GetTopLeftOffset(kMainMenuButtonPos, 0.0f).x) * vAspect.x / vAspect.y * 720 / vSize.x; + + int lY = 5; + + //////////////// + // Slider + { + float fValue = (mpConfig.GetFloat("Graphics", "Brightness", 1.0f) - 0.3f) / (2.0f - 0.6f); + float fNewValue = OptionMenu_ButtonOptionsSlider("Gamma", kMainMenuButtonPos + cVector2f(fOffsetX, 20), lY++, msSelectedGammaButton, fValue, 0.05f, mlActionHorizontal, ""); + + if(fNewValue != fValue) + { + mpConfig.SetFloat("Graphics", "Brightness", (fNewValue * (2.0f - 0.6f) + 0.3f)); + cGraphics_GetLowLevel().SetBrightness((fNewValue * (2.0f - 0.6f) + 0.3f)); + mlOptionChanges++; + } + + msSelectedGammaButton = OptionMenu_UpdateFocus("Gamma", msSelectedGammaButton); + } + + //////////////// + // Speaker type + if((Platform_IsPS4() || Platform_IsXBO()) && mbPremenuActive) + { + ///////////// + // Draw multi select box and update config + tString sValue = mpConfig.GetString("Sound", "SpeakerType", "HomeCinema"); + int lValue =-1; + for(int i=0;i0 ? (mlPreMenuState==0 ? 0.4f : 1.0f) : + (mlPreMenuState==2 ? 1.0f : 0.5f); + mfPreMenuFadeAmount = cMath_IncreaseTo(mfPreMenuFadeAmount, afTimeStep*fMul, mfPreMenuFadeDest); + + if(mfPreMenuFadeAmount==0 && mfPreMenuFadeDest==0) + { + mlPreMenuState++; + mfPreMenuFadeDest =1; + + if(mlPreMenuState==0) + { + ImGui_AddTimer("FGLogoOver", 3); + Sound_PlayGui("special_fx/frontend/FG_Menu_Sting", 1.0f, eSoundEntryType_Gui); + Music_PlayExt("IngameMenu_Music", true, 0.45f, 0.8f, 6.0f, 0.0f, eMusicPrio_OverrideAll, false); + Sound_CreateAtEntity("MenuBGNoise", "special_fx/frontend/main_menu_bg", "Player", 6.0f, false, 1.0f); + } + + if(mlPreMenuState==1) + { + if (!Platform_IsXBO() && !Platform_IsPS4()) + mbMouseVisible = true; + + if(mbShowEngagement) + { + mbBackgroundShowFace = true; + Music_PlayExt("IngameMenu_Music", true, 0.35f, 0.8f, 3.0f, 0.0f, eMusicPrio_OverrideAll, false); + + Sound_CreateAtEntity("MenuBGNoise", "special_fx/frontend/main_menu_bg", "Player", 6.0f, false, 1.0f); + } + else + mlPreMenuState++; + } + + if(mlPreMenuState==2) + { + mbMouseVisible = true; + + if(Platform_IsXBO()) + { + mbBackgroundShowFace = true; + Music_PlayExt("IngameMenu_Music", true, 0.35f, 0.8f, 3.0f, 0.0f, eMusicPrio_OverrideAll, false); + + Sound_CreateAtEntity("MenuBGNoise", "special_fx/frontend/main_menu_bg", "Player", 6.0f, false, 1.0f); + } + else + mlPreMenuState++; + } + + if(mlPreMenuState==3) + { + if(mbFirstGameStart && mbShowPreMenu) + { + Music_PlayExt("IngameMenu_Music", true, 0.35f, 0.8f, 6.0f, 0.0f, eMusicPrio_OverrideAll, false); + mbBackgroundShowFace = true; + + Sound_CreateAtEntity("MenuBGNoise", "special_fx/frontend/main_menu_bg", "Player", 6.0f, false, 1.0f); + } + else + { + msFocusNextFrame = msSelectedMainMenuButton; + mbPremenuActive = false; + mbBackgroundShowFace = true; + mbBackgroundShowTitle = true; + + if(mCurrentBGPhase == eMainMenuPhase_AfterEnd) + { + Music_PlayExt("Completion_MenuMusic", true, mfMenuCompMusicVol, 1.0f, 6.0f, 0.0f, eMusicPrio_OverrideAll, false); + Sound_CreateAtEntity("MenuBGNoise", "special_fx/frontend/main_menu_bg", "Player", 6.0f, false, 0.75f); + } + else + { + Music_PlayExt("Menu_Music", true, mfMenuMusicVol, 1.0f, 6.0f, 0.0f, eMusicPrio_OverrideAll, false); + Sound_CreateAtEntity("MenuBGNoise", "special_fx/frontend/main_menu_bg", "Player", 6.0f, false, 1.0f); + } + + return;//So we do not show the gamma setup! + } + } + + if(mlPreMenuState==4) + { + msFocusNextFrame = msSelectedMainMenuButton; + mbPremenuActive = false; + mbBackgroundShowFace = true; + mbBackgroundShowTitle = true; + + if(mCurrentBGPhase == eMainMenuPhase_AfterEnd) + { + Music_PlayExt("Completion_MenuMusic", true, mfMenuCompMusicVol, 1.0f, 6.0f, 0.0f, eMusicPrio_OverrideAll, false); + Sound_CreateAtEntity("MenuBGNoise", "special_fx/frontend/main_menu_bg", "Player", 6.0f, false, 0.75f); + } + else + { + Music_PlayExt("Menu_Music", true, mfMenuMusicVol, 1.0f, 6.0f, 0.0f, eMusicPrio_OverrideAll, false); + Sound_CreateAtEntity("MenuBGNoise", "special_fx/frontend/main_menu_bg", "Player", 6.0f, false, 1.0f); + } + } + } + + /////////////////////// + // Black screen + if(mlPreMenuState==-1) + { + cImGuiGfx gfxBlack; + ImGui_DrawGfx(gfxBlack, ImGui_NrmPos(0,0,20.1f), ImGui_NrmSize(1.0), cColor(0,mfPreMenuFadeAmount)); + } + /////////////////////// + // FG Logo + if(mlPreMenuState==0) + { + cImGuiGfx gfx("frictional_games_logo.dds", eImGuiGfx_Texture); + cVector2f vBgSize = OptionMenu_GetScaledSize(cVector2f(1024, 351) * 0.87); + cVector3f vBgPos = OptionMenu_GetCenterOffset(cVector2f(0), 10.2) - cVector3f(vBgSize.x * 0.5, vBgSize.y * 0.5, 0.0); + ImGui_DrawGfx(gfx, vBgPos, vBgSize, cColor(1, mfPreMenuFadeAmount)); + + if(ImGui_TimerOver("FGLogoOver")) + { + mfPreMenuFadeDest =0; + } + } + /////////////////////// + // FG Logo + else if(mlPreMenuState==1) + { + GuiEngagement(); + } + /////////////////////// + // User Selection + else if(mlPreMenuState==2) + { + GuiUserSelection(); + } + /////////////////////// + // Gamma + else if(mlPreMenuState==3) + { + // Show profile save error + if(msLoadSaveError.length() > 0) + { + MessageBoxLoadError(); + ImGui_SetModUseInput(false); + } + + GuiGammaCorrection(); + } + } + + //------------------------------------------------------ + + void GuiEngagement() + { + cImGuiLabelData labelData; + labelData.mFont.SetFile(Helper_Font_GetFontName(eLuxFontType_Sansation_XLarge_Bold)); + labelData.mFont.mvSize = cVector2f(46, 46); + labelData.mFont.mColor = cColor(1, mfPreMenuFadeAmount); + + ImGui_DoLabelExt( Platform_IsXBO()?"PressA":"PressX",labelData, OptionMenu_GetTopLeftOffset(kOptionMenu_PressXPos, 1.0)); + + //////////// + // Wait for keypress + tString sKeyPressed = cLux_GetInputHandler().GetLatestKeyPressed(); + + if(sKeyPressed.length() > 0) + { + int lPos = cString_GetFirstStringPos(sKeyPressed, "Gamepad"); + int lEndPos = cString_GetFirstStringPos(sKeyPressed, "Button.0"); + if(lPos != -1 && lEndPos != -1) + { + ///////////////// + // Get the device id from the gamepad that pressed the button + tString sNum = cString_Sub(sKeyPressed, 8); + int lDotPos = cString_GetFirstCharPos(sNum, '.'); + int lNum = cString_ToInt(cString_Sub(sNum, 0, lDotPos), 0 ); + + ///////////// + // Set that gamepad as the primary one + cLux_GetInputHandler().SetPrimaryGamepad(lNum); + Users_ObtainFirstUser(); + + ///////////// + // We have a new user now, reload saves + mbHasSaveFiles = false; + + mfPreMenuFadeDest=0; + } + } + } + + //------------------------------------------------------ + + void GuiUserSelection() + { + // @jgarcia + + cImGuiLabelData labelData; + labelData.mFont.SetFile(Helper_Font_GetFontName(eLuxFontType_Sansation_XLarge_Bold)); + labelData.mFont.mvSize = cVector2f(46, 46); + labelData.mFont.mColor = cColor(1, mfPreMenuFadeAmount); + + tWString userName = "USER SELECTION"; + cLux_GetCurrentImGui().DoLabel(userName, labelData, OptionMenu_GetTopLeftOffset(kOptionMenu_PressXPos, 1.0)); + + mfPreMenuFadeDest=0; + } + + //------------------------------------------------------ + + void ApplySettings(bool abSave = true) + { + ///////////// + // Saves the config + if(abSave && cLux_GetSaveConfigAtExit()) mpConfig.Save(); + + ///////////// + // Applies the changes to the engine and displays a message box if restart is needed + mbRestartWarning = cLux_ApplyUserConfig(); + } + + void DiscardSettings() + { + /////////// + // Load settings + mpConfig.Load(); + + cGraphics_GetLowLevel().SetBrightness(mpConfig.GetFloat("Graphics", "Brightness", 1.0)); + } + + //------------------------------------------------------ + + void ApplyKeybinds() + { + ///////////// + // Saves the config + mpKeyConfig.Save(); + + cLux_GetInputHandler().LoadKeyConfig(); + + ///////////// + // Reloading keys will make actions trigger again, so ignore next frame + mlIgnoreInput = 3; + mbKeybindChanged = false; + } + + void DiscardKeybinds() + { + /////////// + // Load settings + mpKeyConfig.Load(); + mbKeybindChanged = false; + } + + //------------------------------------------------------------ + + void OnDraw(float afFrameTime) + { + + } + void OnPostRender(float afFrameTime) + { + + } + + //------------------------------------------------------------ + + ///////////////////////////////////////// + // ACTIONS + ///////////////////////////////////////// + + //------------------------------------------------------------ + + void OnAction(int alAction, bool abPressed) + { + if(abPressed) + { + if(alAction == eAction_OpenMenu && LoadScreen_IsVisible() == false) + { + if(mbMenuActive == false && mbPauseMenuEnabled) + { + mbMainMenuActive = false; + SetMenuActive(true); + } + else + { + mbMenuButtonPressed = true; + } + } + } + + // Block all input + } + + + void OnAnalogInput(int alAnalogId, const cVector3f &in avAmount) + { + + } + + //------------------------------------------------------------ + + void OnExitPressed() + { + + } + + //------------------------------------------------------------ + + void AppGotInputFocus() + { + + } + void AppLostInputFocus() + { + + } + + ///////////////////////////////////////// + // GLOBAL + ///////////////////////////////////////// + + //------------------------------------------------------------ + + bool mbMainMenuActive = false; + bool mbMenuActive = false; + bool mbPauseMenuEnabled = true; + bool mbMenuButtonPressed = false; + bool mbCanContinue = false; + bool mbGameOver = false; + bool mbSaveLoadEnabled = true; + + //------------------------------------------------------------ + + bool mbRestartWarning = false; + bool mbShowRestartWarning = false; + bool mbShowApplyChanges = false; + bool mbShowExit = false; + bool mbShowPlayGo = false; + bool mbShowNewGame = false; + bool mbShowLoadGame = false; + bool mbShowApplyKeyChanges = false; + bool mbShowPreMenu = false; + bool mbPremenuActive=false; + bool mbFirstGameStart = false; + bool mbShowReset = false; + bool mbShowDuplicateKeys = false; + bool mbShowEngagement = false; + float mfKeepDisplaySetting = 0.0f; + bool mbShowDetectSettings = false; + + bool mbSaveAndExit = false; + + float mfPlayGoTimer = 0.0f; + + cImGuiFrameGfx mGfxFrame; + //cImGuiWindowData mWindowData; + + tString msMessageBoxFocus = "No"; + + [volatile] cConfigFile@ mpConfig; + [volatile] cConfigFile@ mpKeyConfig; + + int mlActionHorizontal; + + int mlClickedPauseMenuButton; + int mlClickedMainMenuButton; + int mlClickedGameModeSelectionButton; + + int mlCurrentResolution; + tString msCurrentDisplayMode; + + tString msSelectedMainMenuButton; + tString msSelectedStartButton; + tString msSelectedPauseMenuButton; + tString msSelectedOptionsButton; + tString msSelectedGammaButton; + tString msSelectedInputButton; + tString msSelectedInputMouseButton; + tString msSelectedInputGamepadButton; + tString msSelectedInputMappingButton; + tString msSelectedInputEyeTrackingButton; + tString msSelectedVideoButton; + tString msSelectedVideoDisplayButton; + tString msSelectedVideoPostEffectButton; + tString msSelectedVideoWorldButton; + tString msSelectedVideoGammaButton; + tString msSelectedAudioButton; + tString msSelectedGameplayButton; + tString msSelectedGameModeButton; + int mlSelectedLoadButton = 0; + int mlSelectedKeybindButton = 0; + int mlSelectedGameMode = 0; + + bool mbBackgroundTitleSounds =true; + bool mbBackgroundShowTitle =true; + bool mbBackgroundShowFace =true; + float mfBackgroundTitleAlpha=0; + float mfBackgroundFaceAlpha=0; + + float mfMainAlpha=1; + + bool mbMouseVisible=true; + + int mlPreMenuState=0; + bool mbInitPreMenu = true; + float mfPreMenuFadeAmount=0; + float mfPreMenuFadeDest=0; + + int mlOptionChanges = 0; + int mlCurrentOptionChange; + + float mfFadeOut = 0.0f; + float mfFadeIn = 0.0f; + + float mfFadeLength = 0.5f; + float mfExitGameFadeLength = 1.0f; + + tString msFocusNextFrame; + + eMainMenuGroup mCurrentGroup; + + cVector2f mvAspectRatio; + cVector2f mvSize; + cVector2f mvOffset; + + array mvResolutionSizes; + array mvResolutionValues; + array mvRefresh; + array mvRefreshValues; + int mlSelectedResolution; + + array mvSaveNames; + array mvSaveDates; + array mvSaveFiles; + bool mbHasSaveFiles = false; + int mlSaveFileOffset=0; + int mlSaveFileToLoad=0; + bool mbScrollingSaveList=false; + tString msLoadSaveError; + bool mbProfileError; + tWString msPreviousSaveLoaded; + tWString msContinueFile; + + array mvLangFiles; + + float mfDisableEscapeCount = 1.0; + + //////////////// + // Keybinding + array mvActions; + array mvGamepadActions; + int mlActionToBind=0; + tString msKeybindSlot = "Primary"; + bool mbScrollingKeybindList=false; + int mlKeybindOffset=0; + int mlKeybindFocusSlot = 0; + tString msFocusAfterBind; + bool mbKeybindChanged; + int mlIgnoreInput = 0; + tString msKeybindFirstState; + bool mbBindingGamepad = false; + + bool mbInitiated = false; + + //------------------------------------------------------------ +}