/ Gendannelse af Waffle Boy Mountain Adventure
Created 2019-05-13 Modified 2019-05-13

4147 Words

Gendannelse af Waffle Boy Mountain Adventure

Oprindeligt postet den 2019-05-13.

Hvis du bare vil vide, hvordan man spiller spillet, eller du bare vil have filerne, skal du springe til bunden af dette indlæg til sektionen 'Afslut'.

Det er mere end en måned siden, jeg har tiltrådt teamet Flashpoint, og det har været konstant interessant.

For øvrig, hvis du er en udvikler og har gamle filer fra Postopia eller andre tidlige websteder, der ikke er blevet arkiveret, skal du nå ud til projektet! En masse af Shockwave-spil på Postopia er ikke blevet arkiveret, og en masse loader XML er gået tabt.

Stædighed er en egenskab, der har tjent mig godt i fortiden. Men det har også tjent mig dårligt, hældt timer og energi i noget, der senere er bedre forsøgt. Og selvfølgelig betyder det, at jeg tynger mod stædige spil, der ikke fungerer.

For dem, der ikke ved, var Waffle Boy’s Mountain Adventure t temmelig berømt webspil. Du kan finde dens efterfølger, Waffle Boy’s Jungle Adventure, , der er tilgængelig selv i dag. Oprindeligt fremstillet af Smashing Ideas for Kraft og vært hostet på Postopia.com, spillet var en imponerende platformspil, der prale af forskellige bevægelser som at klatre vinstokke og ride på motorcykler, både og helikoptere (der langsomt løb tør for gas). Det dukker også gang på gang op Reddit for en nostalgisk erindring.

Spillet havde langt mere indhold end dets efterfølger, 4 niveauer til 3 sammen med animerede intros, et specielt niveauovergangsrum med minispil og tilsyneladende et sidste møde. Det, der sugede, var, at selv om størstedelen af spilindholdet blev arkiveret i Wayback, manglede det den vigtigste del - XML.

Måden Flash har en tendens til at arbejde med mange forskellige SWF-objekter (i det mindste på Postopia) er ved at bruge en ekstern XML til at indlæse aktiverne i den forventede rækkefølge. Problemet er, at waffleboy.xml (ikke shell.xml, der er anført på Lost Media Wiki-siden), loader til spillet, aldrig blev arkiveret af Wayback. Så dybest set er der alt dette gemte indhold og ingen måde at spille det på.

Hvis du jager rundt, finder du alle referencer til Mountain Adventure overskygget af dens efterfølger. Selv spil, der hævder at være Mountain-versionen, ender med at trække Jungle-versionen. Intet andet sted (så vidt jeg ved) havde spejlet eller nogensinde været vært for spillet separat uden at kalde Postopia for filerne. Google-fremføringssteder som Reddit gav ingen nyttige filer eller oplysninger. Ifølge LMW var de kun nået ud til udvikleren for at finde ud af, at de ikke havde filerne. Mange mennesker har forsøgt at genoplive spillet, men selv dem der kom længst nåede kun det mærkelige debugområde.

Naturligvis, i stedet for at være rationel og overlade det til en tilfældig god samaritan at passere den manglende fil, besluttede jeg, at dette var den bedste opgave for en nybegynder-kurator som jeg at tackle.


Så efter den typiske Flashpoint-spiltest kort, genskabte jeg de nødvendige mapper med aktiverne. Ikke kommer til at komme for meget ind i kuratoriets detaljer med dette indlæg (jeg har skrevet om det før), men de nødvendige ting at vide er, at Flashpoint bruger en modificeret Apache-server, så hvis et spil anmoder om aktiver fra dets originale site , omdirigeres det til mapperne på din harddisk (det er op til dig at bruge de 404 fejl til at jage på manglende aktiver).

  1. Den første ting var at finde den side, hvor spillet blev hostet, jagt på spillekildens url og brugte den fulde kæmpe URL fra indlejringen på webstedet:
http://www.Postopia.com/games/vr_loader/vr_base.swf?vrloader=/games/vr_loader/vr_loader.swf&filelist=/games/wbmountadv/waffleboy.xml&filepath=/games/wbmountadv/swf/&vrinfo=/games/wbmountadv/vr_info.xml&urlaction=http://www.Postopia.com/common/gaming/game_action.aspx&game=/games/wbmountadv/waffleboy.swf&width=500&height=320&bgcolor=0xffffff&viewonly=false&urlobject=/common/gaming/game_submit.aspx&urlemail=/common/games/Game_Ecard

Dette giver omdirigeringsserveren alle de nødvendige ekstra opkald (med Shockwave, skal vi definere parametrene ved hjælp af et script, som en af vores hackere har foretaget - da vi ikke har det til Flash, har vi brug for de opkald, der foretages i URL’en).

  1. De første ting, webserveren forsøger at HTTP GET med hensyn til aktiver, var vr_base.swf (som hvis du ignorerer alle parametre inden for den url, vil du se det før det første? At det beder om den swf-fil) og vr_loader. swf. Heldigvis blev disse alle arkiveret, og det ser ud til, at disse filer blev brugt som generisk kode til lancering af spilene på webstedet.
  2. Det første problem, der skete, var en manglende vr_info.xml. Dette er en generisk fil, der er unikt ændret til forskellige spil på Postopia med det formål at tjene enten ekstra liv eller fordele efter posttoken (symboler, der plejede at leveres i kornboksene). Dette var ikke arkiveret, så den bit information om, hvordan webstedet, der bruges til at definere tokens til spillet, er gået tabt. Heldigvis er det ikke et nødvendigt stykke kode, og jeg var i stand til at oprette en dummy-fil til den
  3. Der var også en almindelig fil, der blev brugt til at sende HTTP POST-anmodninger til - Jeg er stadig usikker på formålet med dette, men det blev arkiveret, og selvom det ikke var, kunne en dummy-fil potentielt have været erstattet.
  4. Derefter bad den om waffleboy.swf. Fra at læse den dekompilerede kode (vi kommer til det senere) konkluderede jeg, at dette var fail safe, at hvis spillet blev fejlagtigt, ville det vise en blå baggrund. Dette blev arkiveret, så det var let at placere det i mapperne.

Nu på det virkelig vanskelige spørgsmål:

Ifølge LMW manglede shell.xml. De var korrekte; dog kaldes det waffleboy.xml i URL-parametrene. Dette var den vigtige fil, der ikke blev gemt, hvilket betyder, at jeg ikke vidste, hvilke filer der var nødvendige, og hvad der blev indlæst - dette var den vigtigste fil til at genskabe spillet, og det manglede.

Sådan ser en typisk fillæsser XML ud på webstedet - bemærk den specifikke navngivning af aktiver og ekstra moduler:

Dream XML

Et andet eksempel bortset fra dette er helt anderledes, hvilket angiver, hvilken version af Flash der skal falde tilbage på. De fleste filer ser de foregående ud, men dette er bare for at demonstrere, hvor unikke disse filer kan få:

Sky

Generelt gemte Postopia ikke meget af disse loader XML’er, så jeg havde meget lidt indhold til at gå ud på, hvordan man gendanner denne XML. For at finde de nødvendige spilfiler til Mountain Adventure, havde jeg LMW at takke for denne liste:

Table source

Hvis jeg bruger et af deres links, får jeg en liste over alle aktiver, der er gemt til wbmountadv, den mappe, der blev brugt til at huse de forskellige SWF’er til indlæsning.

I tabellen ovenfor kan vi se, at vi har tre swfs - game.swf (som er hovedspilkoden),gateway.swf (som er det unikke overgangsområde mellem niveauer og har minispil) og intro. swf (introduktionen til spillet). Så på en eller anden måde er vi nødt til at indlæse disse SWF’er i deres rigtige rækkefølge.

Processen med at genskabe XML var ekstremt lang. Det tog mig dage, og det er helt sikkert ikke det samme, som det var. Jeg vil bare sige, at det tog en kæmpe mængde tid med en masse rettergang. Jeg dækker ikke alle de mislykkede XML-rekreationer, kun de, som jeg føler, var vigtige for at forstå strukturen i, hvordan Postopia håndterede disse spil.


Første ting først var der en fælles struktur for XML’erne. Der var en rodnode (sjovt nok, jeg har kun erfaring med JSON, men dette var et stort eventyr i at lære XML-struktur), modulknude og en loader-knude.

<root >
	<module type="object" required="1" baseLevel="2500">
		<comm src="module/comm.swf" />
		<hockeyGame src="module/hockeyGame.swf" />
		<display src="octoDisplay.swf" />
	</module>
	
	<loader baseLevel="400" required="1">
		<loader name="loader0" src="introLoader.swf" />
		<loader src="loaderInGame.swf" />
	</loader>
	
	<content baseLevel="100">
		<content name="stage0" title="Octo Hockey Assets" required="1" src="octostage0.swf" />
		<content name="winGame" title="Game End" src="winGame.swf" />
		<content name="keys" title="Game End" src="unlockDoor.swf" />
		<content name="nickkeys" title="Game End" src="nickKeys.swf" />
		<content name="octoVault" title="Octo Vault" src="scenes/octovault.swf" />
		<content name="octoCastle" title="Octo Castle" src="scenes/octocastle.swf" />
		<content name="octoGarden" title="Octo Garden" src="scenes/octogarden.swf" />
		<content name="octoVillage" title="Octo Village" src="scenes/octoVillage.swf" />
	</content>
</root>

Ovenstående er XML for Octo Hockey (ser ud til at være et andet tabt spil). De specifikke værdier for rod, modul (som type = “objekt”, baseLevel = “2500”), loader (baseLevel = “400”) og indhold (baseLevel = “100”) var de samme i hver enkelt loader XML, jeg kunne find på siden. Så jeg antog, at jeg kunne begynde at opbygge waffleboy.xml ved hjælp af disse værdier.

Moduler ser ud til at være eksterne links til delte objekter i Postopia under en bekvemt navngivet mappe kaldet moduler …. Alle af dem, gemt for en, blev ikke gemt. Hvilket stave dårlige nyheder for de andre spil på webstedet, der afhænger af dem. Heldigvis blev nogle af dem gemt under tilfældige SWF-mapper på webstedet, men det vil tage lidt graving og held at gendanne disse spil.

Desværre havde jeg ingen idé om, hvilke moduler der blev brugt. Som du kan se i eksemplet ovenfor, er nogle specifikke for spil (som hockeyGame.swf, octoDisplay.swf) og nogle var generiske (som comm.swf). Næsten hver XML havde comm.swf (som blev arkiveret), og jeg besluttede at bruge det som midlertidig stand i som et modul.

Loader antog jeg at være ‘intro.swf’ (da ovenstående antyder, at loader er specifik for spillet) og i indholdet kopierede jeg indholdet og brugte et generisk navn med et påkrævet tag.

Og det begyndte at spille intro! I det mindste indtil jeg indså, at springknappen var brudt, og spillet nægtede at spille efter det. Skiftede pladser med Loader, jeg placerede spillet.swf der.

Og det fungerede endnu en gang! Bortset fra at det ikke var noget korrekt niveau. Det viser sig, at hvis XML ikke indlæser filerne korrekt, er det standard til dette underlige debugrum (som du kan gå ud af døren ved at trykke op). Det fører til et andet kontrolpunkt i det første niveau (som stort set kun er halvdelen af ​​et niveau).

Passende ser han ganske selvtilfreds ud på dette tidspunkt: Waffleboy debug

Så på dette tidspunkt havde jeg ingen idé om, hvorvidt introen var loader eller ej. Så ind kommer JPEXS Free Flash Decompiler.

Måske at se på koden ville give mig spor fra, hvad der kommer først.


Her er hvor vi dykker ned i kodelæsning af ActionScript - en arkaisk form for EcmaScript, der bliver forældet.

Den måde, spillet indstiller sine eksterne XML-parametre på, er gennem noget, der kaldes setContent. (Hvordan fandt jeg ud af det? Jeg ctrl-shift-F4-ed navnene intro, gateway, spil, alt hvad der kunne vise mig, når XML bliver sat). setContent ser ikke ud til at være defineret et sted i API-referencerne, så jeg kan kun konkludere, at det kan være en brugerlavet funktion til at skrive til en XML-læsser - dog denne O’Reilly henvisning til XML.nodeValue ser ud til at vise strukturen, som denne brugerfremstillede funktion muligvis følger.

Denne ActionScript-kode kan muligvis også være ældre end AS3, den “moderne” iteration af AS.

Hurtige noter fra dekompilering og læsning af koden:

  • Waffleboy.swf indstiller ikke nogen XML - det ser ud til at læse fra det. Der er en ledetråd til potentielle indholdskoder, der formodes at blive indstillet med denne kode i ramme 1:
    if(this == _level0)
    

    level0 kan enten være en henvisning til game.swf (der kan muligvis angive niveauer som 0,1,2,3,4, hvor 0-3 er de faktiske spilniveauer og 4 er debugafsnittet) ELLER det kan være en ikke-arkiveret, manglende aktiv. Disse navne er meget vigtige for XML. F.eks. Kunne det bruges i en indholdsknute som

     <content name="level0" src="neededasset.swf" />
    

    Navneværdien er meget vigtig for SWF’erne for at kunne skrive og læse fra XML-filen. Det kan også bruges, efter min mening til modulstrukturer, for eksempel:

     <module>
         <level0 src="neededasset.swf" />
     </module>
    

    Hvor navnet er det faktiske tagnavn.

  • Comm.swf (det midlertidige modul, jeg greb) ser ud til at være en generisk struktur til at vise debug-logs til spilene på webstedet.
  • Intro.swf sætter noget kaldet
    Movie.content.setContent("Level1");
    

    Hvilket, hvis du undersøger andre swfs, er, hvordan de indstiller deres swfs i XML. Dette igen, som Waffleboy.swf kan enten være en henvisning til hovedspilobjektet eller et manglende aktiv.

  • Gateway.swf, overgangsniveauet kalder disse kodestykker:
      Movie.content.setContent("Game");
    

    Hvilket helt klart er en henvisning til hovedspilobjektet, fordi når du forlader overgangsniveauet, vender det tilbage til hovedspelet og øger niveauet.


Lad os tale separat om Game.swf.

  1. Det kalder både intro og gateway, hvilket får mig til at tro, at det skulle være loader - med intro og gateway enten som indholdet eller modulerne.

    Movie.Content.setContent("intro");
    Movie.content.setContent("Gateway");
    
  2. Der er meget sandsynligt, at 2 SWF’er er helt tabt. Denne kode vises:

     Movie.content.setContent("Level4Anim");
     Movie.content.setContent("GameEndAnim");
    

    Som en yngre mig, der spillede spillet, nåede jeg aldrig niveau 4. Der er heller ingen tilgængelige playthroughs på YouTube. Men jeg tror, ​​det er sikkert at antage, at der var en animation til at komme ind på 4. niveau og en animation til at passere hele spillet.

  3. Det ser ud til, at Comm.swf er nødvendigt som modul. Koden henviser til et objekt kaldet Comm til at sende spildata til.

    comm.sendScore(GameData.score); 
    

    Af en eller anden grund, hvis jeg lægger det i XML, mislykkes det imidlertid korrekt. Men uden at have noget modul, indlæser Flashpoint aldrig spillet overhovedet. Kun hvis jeg lægger XML i og indstiller stien forkert, indlæser XML nogen af ​​SWF-brikkerne.

  4. Jeg troede, jeg havde mit gennembrud med dette stykke kode inden intro-indholdet:

    if(Key.isDown(16) && Key.isDown(17)){
            if(Key.isDown(49)){
                GameData.level = 1;
            }
            if(Key.isDown(50)){
                GameData.level = 2;
            }
            if(Key.isDown(51)){
                GameData.level = 3;
            }
            if(Key.isDown(52)){
                GameData.level = 4;
            }
    

    Hvilket i forbindelse med koden betyder, at du ved at holde CTRL + SHIFT + A Tastaturnummer, der svarer til spilniveauet, kan skifte til forskellige spiltilstande. Dette virkede ikke - det ville fryse spillet.

Så på dette tidspunkt blev jeg træt af at spille debug-niveauet og prøvede at få spillet til at gå over til Gateway eller gå fra Intro til spillet. Jeg var kun i stand til at komme til et punkt, hvor jeg kunne springe over introduktionen og gå til Gateway, kun for at få den til at gentage denne proces igen, før jeg kom til spillet. Det skiftede ikke ordentligt mellem niveauer. Og spilniveauet og scoringen dukkede ikke op, hvilket jeg formoder at er ekstremt vigtigt for at få gateway-overgangen til arbejde.

Jeg var stort set færdig.


Lige omkring det tidspunkt var da jeg snuble over denne kode inden for ramme 30 af SWF:

    switch(GameData.level)
    {
    case 1:
        StartLevel(1,"Woods_Section1","Start");
        break;
    case 2:
        StartLevel(2,"Caves_Section1","Start");
        break;
    case 3:
        StartLevel(3,"Crystals_Section1","Start");
        break;
    case 4:
        StartLevel(4,"Lair_Section1","Start");
        break;
    default:
        GameSettingDebug = true;
        _global.PostVRTips = false;
        _global.PostBonusRooms = true;
        _global.PostExtraLives = false;
        if(Key.isDown(49))
        {
            StartLevel(1,"Woods_Section1","Checkpoint2");
            break;
        }
        if(Key.isDown(50))
        {
            StartLevel(2,"Caves_Section1","Start");
            break;
        }
        if(Key.isDown(51))
        {
            StartLevel(3,"Crystals_Section1","Start");
            break;
        }
        if(Key.isDown(52))
        {
            StartLevel(4,"Lair_Section1","Start");
            break;
        }
        StartLevel(3,"Bonus_Room_1","StartDoor");
        break;
    }

Så jeg har nævnt, at der var et debugrum, og jeg havde ingen idé om, hvordan man skulle flygte fra det. Og ovenstående kode var nøglen. Af en eller anden grund (at jeg stadig ikke har løst, men jeg formoder, at det skyldes XML-indlæsningen forkert), GameData.Level wsom ikke er indstillet korrekt til spillet, gå til de faktiske niveauer. Så det standardiserede den debugtilstand. Så bagefter kunne jeg lige have opbevaret den kode. AtKey.isDown parameter kastede mig væk - tilsyneladende hvis jeg holder den tilsvarende tast nede FØR spillet lanceres, kaster det mig ind på det rigtige niveau uden debugtilstand. Jeg forsøgte at gøre det, når spillet allerede var indlæst, og som CTRL + SHIFT + tastaturnummer fungerede det ikke.

Men under alle omstændigheder gik jeg rundt om at ændre den faktiske kode ved hjælp afFlasm, den bedste måde jeg fandt at ændre indholdet af objektet. JPEXS kan redigere P-kode, men jeg fandt, at den ikke gemmes korrekt. Jeg slettede fejlfindingsindstillingerne sammen med de ekstra levetider og sådan, og placerede StartLevel(3,"Woods_Section1","Start); i stedet for Bonus_Room_1-funktionen.

Her er hvordan min XML endte med at se ud:

<root _width="600" _height="370">
    <module type="object" required="1" baseLevel="2500">
        <comm src="swf/comm.swf"/>
    </module>
    <loader baseLevel="400" required="1">
        <loader src="game.swf"/>
    </loader>
</root> 

Den kommission, som jeg nævnte før, er ukorrekt forbundet med vilje til at tvinge spillet til at indlæse som en læsser. Hvis du vil have niveau 2, holder du 2 nede på dit tastatur, når du starter det i FPL og så videre.


Selvom jeg er skuffet over, at jeg ikke er i stand til 100% perfekt at genskabe spillet, er jeg glad for, at disse tabte niveauer stadig kan spilles. (Selvom der er Dark Souls ‘stildød, hvor hvis du dør, skal du genstarte).

Som open source-programmør er det undertiden svært at se og forklare det arbejde, vi udfører. Sjældent får vi gøre noget så overbevisende, at ikke-programmerere kan forstå alvoret i det arbejde, vi har udført. Derfor nyder jeg dette samfund, der er masser af variation, interessante udfordringer, en overbevisende grund til at gøre det (gemme ting af historisk betydning), og jeg kan sige, at jeg arbejdede med at redde et spil, der betyder noget for nogen.

Åh, og det er dejligt at vide, at jeg formåede at indhente en bedre oplevelse af XML og dybt ned i subtiliteten ved dekompilering, flexere mine kodelæsefærdigheder og forståelse af ActionScript.

Afslut

Vi savnede ved en fejltagelse Waffle Boy’s Mountain Adventure til vores 6.0-udgivelse på grund af den overvældende mængde uploads af spil! Hvis du ikke kan vente til 6.1, og du har Flashpoint, kan du downloade Waffle boy her.

Igen, for at spille niveauerne - downloadFlashpoint løfteraket , højere end version 6.0. Find Mountain Adventure på listen, download den. FØR du trykker på afspilning, skal du holde det tilsvarende niveau på dit tastatur nede - 2 for niveau 2, 4 for niveau 4 osv. Der er kun 4 niveauer. Så tryk på play. Disse filer er lavet til at blive brugt til Flashpoint specifikt, men du kan muligvis bruge dem andre steder.

Og hvis nogen vil kraftigt ændre ActionScript, så intro og gateway fungerer, skal du slutte dig til vores Discord! (Og tak for at have varet helt til slutningen af ​​dette indlæg!)