Pelin sisältö ja asetukset
Tällä sivulla kerrotaan, miten tutkimamme kaksi Dauntless-versiota tallentavat sisältönsä (kartat, äänet, kuvat ja muut pelin osat), missä paketoidut asetukset ovat (pelin mukana toimitetut, valmiiksi käsitellyt asetustiedostot), miten niitä luetaan ilman pelin omia työkaluja, mitkä karttapolut ovat tärkeitä ja mitä käyttäjän oma asetustiedosto voi ohittaa. Emme koskaan muuta pelin mukana tulleita tiedostoja. Kaikki tässä kuvattu on joko luettu noista tiedostoista tai tehty käyttäjäkohtaisen asetuskansion kautta tai niiden viereen sijoitetulla irrallisella tiedostolla (kuten alempana kuvatulla CA-kokoelmalla).
Tällä sivustolla ja lähdekoodissa ei ole pelitiedostoja, ja tällä sivulla toistetaan vain lyhyitä otteita, joita jonkin asian selittäminen vaatii. Kummankin version paketoiduissa asetuksissa on tunnistetietoja, joita ei olisi koskaan pitänyt julkaista. Katso Salaisuudet paketoiduissa asetuksissa.
Sisällys
Versiot yhdellä silmäyksellä
| 2.1.1 (joulukuu 2024, viimeinen) | 1.4.4 (lokakuu 2020) | |
|---|---|---|
| Pelimoottori | Unreal Engine 5 | Unreal Engine 4 |
| Pakettien tallennus | IoStore: .utoc- ja .ucas-parit, kunkin vieressä .pak (paitsi global) | Pelkät perinteiset .pak-tiedostot |
| Pak-versio | 11 (polkutiiviste- ja täysi hakemistoindeksi) | 9 (vanhanmallinen indeksi) |
| Indeksin salaus | Ei ole | Ei ole |
| Pakkaus | Oodle (tutkimamme asetuslohkot ovat Kraken-muotoa), linkitetty staattisesti exe-tiedostoon | zlib (85/86 pak-tiedostoa) |
Säiliöt kansiossa Archon/Content/Paks | 157 .utoc/.ucas-paria: 156 säiliötä sekä global. 156 .pak-tiedostosta 141 on 339 tavun tynkiä | 86 .pak-tiedostoa, 112 396 merkintää |
| Paketoidut asetukset | Archon_50-WindowsClient.pak (90 KB, 30 .ini-tiedostoa) | Archon_35-WindowsClient.pak |
| CA-kokoelma | Archon_0-WindowsClient.pak → Archon/Content/Certificates/cacert.pem | Archon_0-WindowsClient.pak → Archon/Content/Certificates/cacert.pem |
| Kartat | IoStore-säiliöt Archon_Maps_0..2 | Pak-tiedostot Archon_Maps_0..2 |
Molemmat versiot nimeävät säiliönsä (isot tiedostot, joihin pelin sisältö on pakattu) samalla tavalla: Archon_N, sitten Archon_Architecture_N, Archon_ArmourA/B/C_N, Archon_Atmospheres, Archon_Audio_N, Archon_Effects_N, Archon_Engine, Archon_Intl, Archon_Landscape, Archon_Maps_N, Archon_NPCs_N, Archon_Player_N, Archon_Rock_N, Archon_UI_N ja Archon_Water. 2.1.1 lisää säiliön Archon_MoviesHP. Liitoskohdat (mount points) ovat suhteessa asennuksen juurikansioon ja vaihtelevat säiliöittäin (esimerkiksi ../../../Archon/ version 2.1.1 asetuspakkauksessa tai ../../../Archon/Content/Maps/ karttasäiliössä), mutta sääntö on kaikkialla sama: pelimoottorin pakettipolku /Game/X on säiliön sisällä tiedosto Archon/Content/X.
2.1.1: pak v11 ja IoStore
Useimmat .pak-tiedostot ovat tyhjiä tynkiä
Versiossa 2.1.1 paketoidut pelipaketit (.uasset, .umap ja niin edelleen) ovat IoStore-säiliöissä: .utoc-sisällysluettelossa ja .ucas-datatiedostossa. Jokaisen säiliön vieressä on myös .pak. Kansion Archon/Content/Paks 156 säiliöstä 141:n kohdalla tuo .pak on 339 tavun tynkä: kelvollinen pak v11 -alatunniste (221 tavua), pieni indeksi eikä lainkaan tiedostodataa. Työkalut, jotka lukevat vain .pak-tiedostoja, eivät siksi näe kartoista mitään. Ramsgaten paketit ovat tiedostossa Archon_Maps_2-WindowsClient.ucas (71 MB), eivät sen vieressä olevassa 339 tavun .pak-tiedostossa.
Loput 15 pak-tiedostoa sisältävät tiedostoja, jotka eivät ole Unreal-paketteja ja joita IoStore ei siksi tallenna:
| Pak | Sisältö |
|---|---|
Archon_Audio_0..4 | Wwise-äänipankit ja -media: yhteensä 864 .bnk- ja 10 123 .wem-tiedostoa, noin 1,2 GB |
Archon_21, 22, 24, 25, 46 | .mp4-videot: alkuelokuva useana resoluutiona sekä aseiden esittely- ja kykyvideot. Tallennettu pakkaamattomina |
Archon_Intl_0 | ICU-data ja lokalisointi (.res, .locres, .ufont) |
Archon_Engine_0 | Pelimoottorin Slate-kuvat, lisäosien kuvaukset, moottorin .ini-tiedostot |
Archon_0 | Archon.uproject, lisäosien kuvaukset, Oodle-sanakirjat, CA-kokoelma cacert.pem |
Archon_44 | Varjostinputkien välimuisti (.upipelinecache) |
Archon_50 | 30 paketoitua .ini-tiedostoa |
Korjaus: yhdessä välivaiheen muistiinpanoistamme väitettiin, että jokainen Archon_N-pak paitsi Archon_0 olisi tynkä. Se oli väärin. Viisitoista ei ole, ja Archon_50 on koko asennuksen hyödyllisin tiedosto.
Säiliöiden liput
Kaikki 157 .utoc-tiedostoa ovat TOC-versiota 5. Yksikään säiliö ei ole salattu tai allekirjoitettu. 152:lla on liput 0x9 (pakattu ja indeksoitu), neljällä 0x8 (indeksoitu, tallennettu pakkaamattomana; nämä ovat neljä äänisäiliöistä) ja yhdellä, global.utoc, 0x0. Pelin oma loki vahvistaa, ettei mitään ole allekirjoitettu: käynnistyessään se tulostaa jokaisesta säiliöstä rivin LogIoDispatcher: Display: Toc signature hash: 0000….
IoStoren hakemistoindeksin lukeminen
.utoc alkaa tunnistetavuilla -==--==--==--==- ja versiotavulla. Siinä ei ole paloille omia tiedostonimiä, mutta indeksoiduissa säiliöissä on hakemistoindeksi, joka yhdistää polut TOC-merkintöihin. Kirjoitimme sen läpikäymiseen työkalun utocdir.py. Näille TOC v5 -tiedostoille toimiva rakenne:
- Otsake. Siirtymästä 20 alkaen tulee yhdeksän
uint32-kenttää: otsakkeen koko, merkintöjen määrä, pakattujen lohkojen määrä, pakatun lohkon merkinnän koko, pakkausmenetelmien määrä, menetelmän nimen pituus, pakkauslohkon koko, hakemistoindeksin koko ja osioiden määrä. Lipputavu on siirtymässä 80. - Ohita kiinteät taulukot, jotka tulevat otsakkeen jälkeen: palojen tunnisteet (12 tavua merkintää kohden), siirtymä ja pituus (10 tavua merkintää kohden), täydellisen tiivistyksen siemenet ja sitten luettelo paloista, joilla ei ole täydellistä tiivistettä. Sen jälkeen tulevat pakattujen lohkojen merkinnät ja pakkausmenetelmien nimet. Lisäksi on allekirjoituslohko, mutta vain, jos Signed-lippu
0x04on asetettu. - Hakemistoindeksi tulee seuraavaksi, ja sen pituus on
dir_index_sizetavua. Siinä on:- liitoskohdan
FString; - hakemistomerkintöjä, kussakin neljä
uint32-arvoa: nimi, ensimmäinen lapsi, seuraava sisarus, ensimmäinen tiedosto; - tiedostomerkintöjä, kussakin kolme
uint32-arvoa: nimi, seuraava tiedosto, TOC-merkinnän indeksi; - merkkijonotaulukko.
0xFFFFFFFFtarkoittaa “ei mitään”. Kulje hakemistosta 0 alkaen ja yhdistä nimiä sitä mukaa. - liitoskohdan
def walk(di, prefix):
while di != NONE:
name, child, sibling, first_file = dirs[di]
here = prefix if name == NONE else f"{prefix}{strings[name]}/"
fi = first_file
while fi != NONE:
fname, next_file, toc_index = files[fi]
out.append(here + strings[fname])
fi = next_file
if child != NONE:
walk(child, here)
di = sibling
Näin selvitimme Ramsgaten tarkan pakettipolun ja sen säiliön, jossa se on. Ohjelmatiedoston merkkijonoissa polkua ei ole, eivätkä tynkä-.pak-tiedostojen indeksit luettele sitä. (Paketoidut asetukset kyllä nimeävät sen avaimella ServerDefaultMap, minkä huomasimme vasta myöhemmin.)
Tiedoston irrottamiseen säiliöstä käytämme toista työkalua, iox.py. Kaksi kenttärakennetta on siinä tärkeitä. Jokainen 10 tavun siirtymä ja pituus -merkintä on kaksi 5-tavuista big-endian-lukua. Jokainen 12 tavun pakatun lohkon merkintä on little-endian: 5 tavun siirtymä, 3 tavun pakattu koko, 3 tavun pakkaamaton koko ja 1 tavun pakkausmenetelmän indeksi.
Oodle ilman Oodle-DLL:ää
2.1.1 pakkaa pak-tiedostonsa ja säiliönsä Oodlella (jokainen tutkimamme asetuslohko on Kraken-muotoa), eikä pelin mukana tule yhtään oo2core_*.dll-tiedostoa: Oodle on linkitetty staattisesti tiedostoon Dauntless-Win64-Shipping.exe. Tavalliset pak-työkalut (repak, FModel, ZenTools, UnrealPak) odottavat erillistä Oodle-DLL:ää (ohjelmakirjastoa), joten ne eivät avaa näitä tiedostoja, ellei sellaista löydä muualta. Me emme löytäneet.
Sen sijaan käänsimme powzix/ooz-ohjelman, avoimen lähdekoodin Kraken-purkajan, Linuxin jaetuksi kirjastoksi ja kutsumme sitä Pythonista ctypes-moduulin kautta:
- Poista ohjelman
main()ja se osa, joka lataa tiedostonoo2core_7_win64.dll. - Lisää pieni
stdafx.h-välikerros. Se muuntaa MSVC:n sisäänrakennetut funktiot (_BitScanReverse,_BitScanForward,_rotl,_byteswap_*,__forceinline) GCC:n ja SSE:n vastineiksi. - Käännä komennolla
g++ -O2 -fPIC -msse4.1 -shared ... -o libooz.so.
DefaultEngine.ini-tiedoston pakattu sisältö on yksi ainoa Kraken-lohko. Se alkaa tavuilla 8C 06.
Huomioita pak v11 -indeksistä
Archon_50-WindowsClient.pak on tavallinen pak v11. Siinä on 221 tavun alatunniste: salauksen GUID, salatun indeksin lippu, tunnistetavut 0x5A6F12E1, versio, indeksin siirtymä ja koko, indeksin SHA-1 sekä viisi 32 tavun pakkausmenetelmän nimeä (Oodle, sitten tyhjiä). Indeksi on salaamaton, ja siinä on polkutiivisteindeksi, täysi hakemistoindeksi ja möhkäle bittitasolla pakattuja “koodattuja” merkintöjä.
Yksi yksityiskohta turmelee käsin kirjoitetun purkajan huomaamatta. Koodatun merkinnän lippusanan alimmat kuusi bittiä kertovat pakkauslohkon koon 2 KiB:n yksikköinä. Kun kaikki kuusi bittiä ovat päällä (0x3F), todellinen lohkokoko tulee uint32-arvona heti lippusanan jälkeen, ennen siirtymäkenttää. Jos luet kentät siinä järjestyksessä, jota muu rakenne antaa odottaa, saat siirtymän, joka osoittaa tiedoston lopun yli, ja koot menevät ristiin. Tiedostolle DefaultDeviceProfiles.ini käy juuri näin: siinä on kaksi Oodle-lohkoa, joiden lohkokoko on 1 MiB.
ooz-purkajalla ja tällä kenttäjärjestyksellä kaikki 30 asetustiedostoa tulivat ulos ehjinä: kunkin koko vastaa sen merkinnässä ilmoitettua pakkaamatonta kokoa, eikä yhdessäkään ole tulostumattomia tavuja.
1.4.4: pak v9 ja zlib
1.4.4 on IoStorea vanhempi. Kaikki on 86 perinteisessä pak-tiedostossa:
- Kaikki 86 ovat pak-versiota 9, ja niissä on vanhanmallinen (ei “jäädytetty”) salaamaton indeksi.
- 85 käyttää zlib-pakkausta. Yksi ei ilmoita pakkausmenetelmää lainkaan.
- Merkintöjä on yhteensä 112 396, enimmäkseen
.uasset/.uexp/.ubulk. Loppuihin kuuluu 11 301.wem- ja 898.bnk-äänitiedostoa, 225.umap-karttaa, 135.mp4-videota ja 62.ini-tiedostoa.
Luemme niitä työkalulla pak9.py (list, find, get). Vanhanmallinen indeksi on liitoskohdan FString, merkintöjen määrä ja sitten jokaisesta merkinnästä tiedostonimi ja FPakEntry:
- siirtymä, koko ja pakkaamaton koko (kolme
int64-arvoa); - pakkausmenetelmän indeksi (
uint32); - SHA-1 (20 tavua);
- pakatuilla tiedostoilla lohkojen määrä ja
(start, end)-parit; - lipputavu ja pakkauslohkon koko (
uint32).
Sama merkintä toistuu tiedostodatan edessä sisäisenä otsakkeena. Version 9 pak-tiedoston alatunniste lisää indeksin tiivisteen perään “jäädytetty indeksi” -tavun. Se oli 0 jokaisessa version 1.4.4 pak-tiedostossa.
Paketoidut asetukset ovat tiedostossa Archon_35-WindowsClient.pak: DefaultEngine.ini (71 981 tavua) ja DefaultGame.ini (50 377 tavua), molemmat zlib-pakattuja. Tekijänoikeusrivillä lukee 2020, kuten tälle versiolle kuuluukin.
Mitä paketoidut asetukset sisältävät
Version 2.1.1 asetuspakkauksessa on 30 tiedostoa. Tärkeimmät ovat DefaultEngine.ini (81 338 tavua), DefaultGame.ini (69 668 tavua), DefaultInput.ini, DefaultGameplayTags.ini, DefaultScalability.ini ja DefaultDeviceProfiles.ini (1,17 MB). Alusta- ja kokoonpanokerrokset ovat kansioissa Windows/, WindowsClient/, Win64/, Shipping/ ja niin edelleen. BinaryConfig.ini-tiedostoa ei ole missään (paketoidut paketointiasetukset sanovat bMakeBinaryConfig=False). Ohjelmatiedostossa on sellaisen lataaja ({PROJECT}Config/BinaryConfig.ini), joten jos binäärimuotoiset asetukset olisi toimitettu, ini-kerrokset olisi ohitettu. Koska niitä ei toimitettu, tavallinen ini-hierarkia käydään läpi käynnistyksessä, ja siksi käyttäjän omat ohitukset ylipäätään toimivat.
[OnlineSubsystemPhoenix]: taustapalvelun päätepistetaulukko
Tärkein osio on [OnlineSubsystemPhoenix] tiedostossa DefaultGame.ini, ei DefaultEngine.ini. Se on asiakasohjelman (pelaajan koneella toimivan peliohjelman) taulukko Phoenixin taustapalvelun osoitteista. Taustapalvelu tarkoittaa pelin verkkopalveluja, jotka toimivat yhtiön palvelimilla.
| 2.1.1 | 1.4.4 | |
|---|---|---|
| Sijainti | DefaultGame.ini rivit 236–441 | DefaultGame.ini rivit 254–426 |
| Avaimet | 203, joista 199 on osoitteita (URL) | 171, joista 167 on osoitteita (URL) |
Neljä avainta, jotka eivät ole osoitteita, ovat samat kummassakin versiossa: HTTP-uudelleenyritysten määrä ja aikakatkaisu sekä kaksi telemetrian niputusrajaa.
Arvot ovat osoitepohjia (URL-malleja). Julkaistu asiakasohjelma täyttää kohdan {environment} arvolla prod, minkä näimme version 2.1.1 todellisessa liikenteessä. Muut paikkamerkit se täyttää pyyntöä tehdessään:
[OnlineSubsystemPhoenix]
AuthEndpoint = "https://auth-{environment}.steelyard.ca/game/login"
CharacterEndpoint = "https://dauntless-{environment}.steelyard.ca/character"
GetActiveLoadoutEndpoint = "https://loadout-{environment}.steelyard.ca/loadout/{account_id}/{character_id}"
QueryLoginQueueEndpoint = "https://login-queue-{environment}.steelyard.ca/login"
MatchmakingEndpoint = "https://mm2-{environment}.steelyard.ca"
Palvelinnimet noudattavat kaavaa <service>-{environment}.steelyard.ca. Kummassakin versiossa palvelut ovat auth, gamesession, login-queue, dauntless, loadout, progression, mm2, presence, social, guild, mailbox, store, subscription, leaderboards, motd, cohort, breadcrumbs, tracking, telemetry-ingest ja profanity-filter. 2.1.1 lisää palvelut gauntlet ja migration. Muutama avain osoittaa muualle: cdn.playdauntless.com, store.playdauntless.com, steelyard.online, game-tools.1e100.steelyard.ca, Phoenixin sisäinen testikaupan palvelin sekä alempana kuvattu Slack-webhook.
Kun versioita verrataan avain avaimelta, niillä on 170 yhteistä avainta, ja niistä 167:n arvot ovat tavulleen samat. Kolme eroavaa liittyvät äänichattiin. 1.4.4 liittyy Vivox-kanaville (mm2/vivox/join/... sekä VoiceChatLoginEndpoint, ainoa avain, joka on vain versiossa 1.4.4). 2.1.1 käyttää Epicin äänipalvelua (mm2/evoice/join/...). Ne 33 avainta, jotka ovat vain versiossa 2.1.1, kattavat vuoden 2020 jälkeen lisättyjä ominaisuuksia, kuten Gauntletin, faktiot, aarrearkut (loot boxes), Steam-kaupan ostot, Trials-tulostaulukot, tilin siirron, päivitysmuistiinpanot ja porttikieltotarkistuksen.
Nämä päätepisteet (verkko-osoitteet, joihin peli lähettää pyyntönsä) osoittavat, että taustapalvelu on Phoenixin oma, räätälöity REST-rajapinta. Se ei ole PlayFab, vaikka jotkin yhteisön muistiinpanot niin väittivät. Sivu Taustapalvelun rajapinta käsittelee vastausten muotoja.
Muita hyödyllisiä osioita
[OnlineSubsystem] DefaultPlatformService=Phoenixlöytyy kummankin versionDefaultEngine.ini-tiedostosta. Phoenixin oma alijärjestelmä on ensisijainen.- 2.1.1:ssä on lohko
[/Script/OnlineSubsystemEOS.EOSSettings]. SiinäbShouldEnforceBeingLaunchedByEGSon jo valmiiksiFalsejabUseEAS=True. - 1.4.4:ssä ei ole EOS-osiota lainkaan. Se käyttää sen sijaan Epicin vanhempia
OnlineSubsystemMcp-palveluja, joiden avaimetDomain,RedirectUrljaProtocolUndauntedin DLL kirjoittaa uudelleen ajon aikana. -
[/Script/EngineSettings.GameMapsSettings]tiedostossaDefaultEngine.inion sama kummassakin versiossa:GameInstanceClass=/Game/Blueprints/MyGameInstance.MyGameInstance_C GameDefaultMap=/Game/Maps/Map_LoginMenu ServerDefaultMap=/Game/Maps/ramsgate/ramsgate_01_persistent GlobalDefaultGameMode=/Game/Blueprints/BPGM_Archon_Prototype.BPGM_Archon_Prototype_C DefaultLoadout=tiedostossaDefaultGame.ini(2.1.1 rivi 172, 1.4.4 rivi 181) nimeää harjoitusaseenWP_EB_TRAININGja lyhdynLT_BASIC. Kun käynnistimme version 2.1.1 suoraan kaupunkiin, ilmestymistarkistus odotti asetta ja lyhtyä. Asiakasohjelman oma aloituslahja ei sisällä näitä kahta, luultavasti koska julkaistussa pelissä ne annettiin opetusosiossa, jonka ohitimme. Palvelimemme piti antaa ne.- AFK-aikakatkaisut (kuinka kauan pelaaja saa olla toimettomana) ovat samat kummassakin versiossa: 600 s kaupungissa (
ArchonGameMode_City), 180 s metsästyssaarilla (ArchonGameMode_Island) ja0opetusosion pelitilassa (BPGM_ArchonIslandTutorial). [RamsgateRework] CityMap=...ramsgate_01_persistentnäyttää editorin tai testauksen asetukselta (varmistamaton). Se on osioiden[CombatDemo]ja[PS5AudioTestMap]vieressä, joissa on samaCityMap-avain, heti asetuksenbReturnToRamsgateEnabledInEditorjälkeen, jaShipping/UserGame.inityhjentää[CombatDemo]-osionCityMap-arvon. Version 2.1.1 ohjelmatiedostosta löysimme merkkijonoonRamsgateReworkvain yhden viittauksen, ja se kuuluu ominaisuusluokkaan (URamsgateReworkFeature) eikä koodiin, joka lukisi tätä osiota.
Salaisuudet paketoiduissa asetuksissa
Phoenix toimitti tunnistetietoja selväkielisinä paketoiduissa asetuksissa. Emme ole käyttäneet niistä yhtäkään, eikä niitä toisteta tällä sivustolla.
- Molemmat versiot:
PhoenixEventsMessageEndpointosiossa[OnlineSubsystemPhoenix]osoittaa palveluunhooks.slack.com. Mukana oli toimiva Slack-webhook-osoite. Sitä ei toisteta tässä. - 2.1.1: EOS-asetuksissa ovat Epic Online Services -palvelun asiakastunnukset ja salausavain. Niitä ei toisteta tässä.
Jos purat asetukset itse, pidä nämä arvot poissa kaikesta, mitä julkaiset.
Tärkeät karttapolut
Unrealin pakettipolut: /Game/ vastaa säiliöiden sisällä polkua Archon/Content/. Jotkin kohdat, kuten Undauntedin metsästystaulukko ja CityMap, käyttävät objektipolkumuotoa path.name, esimerkiksi /Game/Maps/islands/1702/cora_jamima.cora_jamima.
| Kartta | Pakettipolku | 2.1.1-säiliö | 1.4.4-säiliö | Huomioita |
|---|---|---|---|---|
| Kirjautumisvalikko | /Game/Maps/Map_LoginMenu | Archon_Maps_2 | Archon_Maps_2 | GameDefaultMap. Kirjautuminen ja hahmon valinta tapahtuvat tämän kartan sisällä |
| Ramsgate | /Game/Maps/ramsgate/ramsgate_01_persistent | Archon_Maps_2 | Archon_Maps_2 | Pysyvä taso. Muut ramsgate_01_*-kartat (basaari, satama, pubi, valmistusalue, NPC:t, näköalat…) ovat virtaavia alitasoja, jotka ladataan tarpeen mukaan |
| Version 1.4.4 opetussaari | /Game/Maps/islands/1705/dia_moss_triforce | Archon_Maps_0 | Archon_Maps_0 | Meidän 1.4.4-palvelimellamme uudet hahmot ohjataan tänne opetusosion Gnasherin /Game/Monsters/mcrollin/mcbeaver_tutorial_bp kanssa |
| Harjoitusdojo (Training Dojo) | /Game/Maps/islands/dojo/training_dojo_persistent | Archon_Maps_2 | Archon_Maps_1 | Haaramme käynnistää sen tarvittaessa |
| Trials-areena | /Game/Maps/islands/arenas/arena_ramsgate_00 | Archon_Maps_2 | Archon_Maps_1 | Undaunted käyttää sitä Trials-haasteisiin |
| Metsästyssaaret | /Game/Maps/islands/<nnnn>/<name> | Esimerkiksi 1705/dia_snow_big, 1803/frida_moss_falls, 1806/gaia_moss_cave. Undauntedin metsästystaulukko luettelee ne, joita se käyttää |
Molemmissa versioissa on myös /Game/Maps/tutorial/-karttaperhe (island_tutorial_00_*, city_00_art_tutorial_vista), jota 1.4.4-palvelimemme ei käytä. 2.1.1 lisää kartan /Game/Maps/islands/adventure/Moss_Triforce/adventure_moss_triforce_tutorial, jota versiossa 1.4.4 ei ole. Emme ole varmistaneet, mitä karttaa version 2.1.1 opetusosio todella käyttää.
Paketoiduissa asetuksissa on pelitilaosiot seuraaville: /Game/Blueprints/GameMode/BPGM_City.BPGM_City_C (kaupunki; käytimme sitä version 2.1.1 kaupunkikäynnistyksessä), BPGM_ArchonIslandTutorial, BPGM_ArchonIslandArena ja BPGM_ArchonEscalation.
Käyttäjän asetuskansio
Unreal asettaa paketoitujen oletusasetusten päälle kirjoitettavan, käyttäjäkohtaisen asetuskerroksen. Dauntlessissa kumpikin versio käyttää samaa kansiota:
%LOCALAPPDATA%\Archon\Saved\Config\WindowsClient\
Engine.ini Game.ini Input.ini RuntimeOptions.ini GameUserSettings.ini (and others)
Tähän asetettu avain ohittaa paketoidun arvon. Meidän 2.1.1-koneellamme Game.ini, Input.ini ja RuntimeOptions.ini olivat pelin ensimmäisten käynnistysten jälkeen kahden tavun tyhjiä tiedostoja, vapaasti käytettävissä. Peli kirjoittaa GameUserSettings.ini-tiedoston asetusvalikostaan.
Kantapään kautta opitut säännöt
- Molemmat versiot jakavat tämän kansion. Koska projektin nimi on kummassakin
Archon, 1.4.4 ja 2.1.1 lukevat samoja tiedostoja. Jäljelle jääneet version 2.1.1 ohitukset (GameDefaultMap,LocalMapOptions,[OnlineSubsystemPhoenix]) ohittaisivat version 1.4.4 kirjautumisen tai ohjaisivat sen muualle, joten ennen ensimmäistä 1.4.4-käynnistystä siirsimme version 2.1.1 asetukset sivuun nimelläWindowsClient.211(sekatilaa emme testanneet). Kaikki saman Windows-tilin prosessit lukevat tätä kansiota, myös pyörittämämme 1.4.4-pelipalvelimet. - Laita jokainen avain hierarkiaa vastaavaan tiedostoon.
[OnlineSubsystemPhoenix]on Game-asetus, joten sen ohitukset kuuluvat tiedostoonGame.ini. TiedostossaEngine.inine jätetään huomiotta. - Laita jokainen URL lainausmerkkeihin. Ini-jäsennin pudottaa lainausmerkittömästä arvosta kaiken kohdasta
//eteenpäin. Eräässä varhaisessa kokeilussamme oli 163 lainausmerkitöntä osoitetta version 2.1.1 käyttäjänEngine.ini-tiedostossa. Kun peli tallensi tiedoston uudelleen, jokainen arvo oli katkennut muotoonhttps:. Paketoidut asetukset laittavat kaikki osoitteensa lainausmerkkeihin, ja niin teemme mekin. - Ota varmuuskopio ennen muokkaamista. Virheellinen
GameDefaultMapestää pelin käynnistymisen ilmoitukseen “The default map … could not be found. Exiting.” Tämä ikkuna tulee aina, kun aloituskartan lataaminen epäonnistuu, ei vain silloin, kun kartta puuttuu. - Korjaus: alussa päättelimme, että irralliset ini-tiedostot jätetään huomiotta. Testi oli virheellinen. Se laittoi Game-avaimia tiedostoon
Engine.ini, se “muutti” asetustabShouldEnforceBeingLaunchedByEGS, joka oli jo valmiiksiFalse, ja se mittasiLauncherCheck-tarkistusta, joka lukee vain komentorivivalitsimia kuten-EpicPortaleikä asetuksia lainkaan. Käyttäjän asetuskerros toimii kummassakin versiossa.
Mitä sillä voi muuttaa
| Asetus | Tiedosto | Versio | Vaikutus |
|---|---|---|---|
[SystemSettings]: r.Streaming.PoolSize, r.Streaming.LimitPoolSizeToVRAM, sg.*Quality, r.ScreenPercentage, r.MipMapLODBias, gc.* | Engine.ini | molemmat | Ohittaa asetusvalikon. Versiossa 2.1.1 rajattu muistivaranto ja matalat sg.*-arvot pudottivat erillisen kaupunkikäynnistyksen muistinkäytön noin 9 GB:stä 2,8 GB:hen. Versiossa 1.4.4 asiakasohjelman käynnistimemme käyttää samaa osiota päinvastaiseen suuntaan: se pakottaa Cinematic-laadun natiiviresoluutiolla |
[Core.System] HangsAreFatal=False, HangDuration=600 | Engine.ini | 2.1.1 (testattu) | Estää jumittumisen tunnistinta lopettamasta prosessia tutkimuksen aikana. Käytetään yhdessä valitsimien -nothreadtimeout -noheartbeatthread kanssa |
[/Script/EngineSettings.GameMapsSettings] GameDefaultMap=/Game/Maps/ramsgate/ramsgate_01_persistent | Engine.ini | 2.1.1 | Käynnistää pelin suoraan Ramsgateen. Kaupunki piirtyy näkyviin, mutta Map_LoginMenu-kartan sisäinen kirjautuminen ei koskaan käynnisty, joten tiliä ja pelaajan hahmoa (pawn) ei ole |
LocalMapOptions=?CharacterId=<id> | Engine.ini | 2.1.1 | Asiakasohjelma lukee tämän: pyynnöissä kulkee sen jälkeen tuo hahmotunniste. Arvoja ?AuthToken= ja ?AccountId= se ei lue. ?listen saa käynnistyksen epäonnistumaan |
GlobalDefaultGameMode=/Game/blueprints/gamemode/BPGM_City.BPGM_City_C | Engine.ini | 2.1.1 | Pelitila, kun peli käynnistetään suoraan kaupunkiin |
[/Script/Archon.ArchonPlayerController] PlayerStartEventTimeout=600.0 | Game.ini | 2.1.1 | Pidentää 120 sekunnin varmistusajastinta, joka päättyy ilmoitukseen “You have been signed out” |
[OnlineSubsystemPhoenix] *Endpoint="http://127.0.0.1:61000/..." (167 avainta, kaikki lainausmerkeissä) | Game.ini | 1.4.4-pelipalvelimet | Ohjaa pelipalvelinprosessimme metagame-palvelimeemme (taustapalvelu, joka korvaa Phoenixin verkkopalvelut). Palvelintilassa Undauntedin DLL ei ohjaa päätepisteitä uudelleen, joten juuri tämä ohitus saa palvelimen taustapalvelukutsut perille metagame-palvelimeen. Asiakasohjelma ei tarvitse tästä mitään: DLL koukuttaa funktion FConfigCacheIni::GetString ja vaihtaa osoitteet muistissa |
Mitä sillä ei voi tehdä
- Avata konsolia versiossa 2.1.1.
DefaultInput.iniluettelee yhäConsoleKeys-näppäimet ja lähes 900ManualAutoCompleteList-huijauskomentomerkintää, mutta konsoli on jätetty pois julkaisuversion käännöksestä.+ConsoleKeys=tiedostossaInput.iniei tee mitään. Versiossa 1.4.4 Undauntedin kanssa DLL luo konsolin itse ja sitoo sen F2-näppäimeen. - Saada tavallista asiakasohjelmaa toimimaan isäntänä.
?listenepäonnistuu versiossa 2.1.1, koska kuuntelun aloituskohta (UWorld::Listen) on tässä pelkässä asiakasversiossa korvattu tyhjällä tyngällä. Tulkitsimme sen ensin niin, että “moninpeli on mahdoton”. Se oli väärin. Alla oleva verkkokerros on ehjä, ja ohjelmaan ujutettu DLL voi ohjata sitä. Juuri näin Undaunted pyörittää 1.4.4-pelipalvelimia. Katso Näin moninpeli toimii. - Ohittaa
-EpicPortal-valitsinta versiossa 2.1.1.LauncherChecklukee vain komentorivivalitsimia. - Antaa tilille identiteettiä. Versiossa 2.1.1 identiteetti tulee vain oikeasta kirjautumisesta
Map_LoginMenu-kartassa.
CA-kokoelma
Molemmat versiot pitävät CA-kokoelmaa cacert.pem (luetteloa varmentajista, joihin peli luottaa salatuissa HTTPS-yhteyksissä) Archon_0-pakkauksen sisällä. Kun ajoimme versiota 2.1.1 omaa HTTPS-taustapalveluamme vasten, peli otti käyttöön irrallisen tiedoston <game folder>\Engine\Content\Certificates\cacert.pem, jossa oli oma yksityinen varmentajamme. Pak-tiedosto jäi siis koskemattomaksi, ja samoin Windowsin varmennevarasto. Versiossa 1.4.4 tätä ei tarvita. Undauntedin DLL kirjoittaa jokaisen päätepisteen uudelleen tavalliseksi HTTP-osoitteeksi, joka osoittaa metagame-palvelimeen.
Työkalut
Nämä skriptit toimivat Linux (WSL) -tutkimusympäristössämme. Yksikään niistä ei tarvitse Oodle-DLL:ää tai pelin koodia:
| Työkalu | Versio | Tarkoitus |
|---|---|---|
libooz.so | 2.1.1 | powzix/ooz käännettynä jaetuksi kirjastoksi pienen MSVC-välikerroksen kanssa |
unpak2.py | 2.1.1 | Lukee ja purkaa pak v11 -tiedostoja (koodatut merkinnät, Oodle-lohkot) |
utocdir.py | 2.1.1 | Tulostaa jokaisen polun .utoc-hakemistoindeksistä |
iox.py | 2.1.1 | Irrottaa tiedoston .utoc/.ucas-parista nimen perusteella |
pak9.py | 1.4.4 | list, find ja get pak v8/v9 -tiedostoille, joissa on vanhanmallinen indeksi (zlib, Oodle tai pakkaamaton) |
xref.py | 2.1.1 | Etsii ohjelmatiedostosta koodiviittaukset merkkijonoon ja purkaa konekielen niiden ympäriltä. Käytimme sitä näillä sivuilla mainittuihin asetusavaimiin ja lokiviesteihin |
Ohjelmatiedoston puolen yksityiskohdat, kuten mitä asetusavaimia koodi oikeasti lukee ja mitä valitsimia se hyväksyy, ovat sivulla Asiakasohjelman sisäosat. Se, miten varmistimme näiden tiedostojen aitouden, kerrotaan sivulla Pelitiedostojen tarkistaminen.