Skip to content

Easter egg: Athega Space - #57

Merged
lizell merged 12 commits into
mainfrom
feature/space-easter-egg
Oct 7, 2026
Merged

lizell merged 12 commits into
mainfrom
feature/space-easter-egg

Conversation

@lizell

@lizell lizell commented Oct 2, 2026 •

Copy link
Copy Markdown
Member

Athega Space (draft)

Hemligt spel på egen branch; inte publicerat på main. Starta med fem snabba klick på startsidans logga eller Konamikoden.

Spel

  • Skepp med motorljud, skott, animerad förstörelse och partiklar.
  • Navigationsskott (N/NAV) följer interna länkar och behåller spelet vid sidbyte. Även menyn är skjutbar.
  • Långsam scroll ned/upp som vänder vid sidans kanter. Värden kan pausa. Byt uppdrag finns alltid kvar; full rensning öppnar uppdragsväljaren.
  • Powerups: trippelskott, snabbeld, sköld, reparation, turbo, gemensam gravitation och snabbscroll. Upp till ×5 kombo och tidsbonus för att rensa sidan.
  • Valbar friendly fire och kollisionsskador. 100 skrov, återkomst efter 3 sekunder och tillfälligt skydd.
  • Växlingsbart mörkt läge med stjärnor/nebulosa. Mobilkontroller och reducerad rörelse.
  • Esc/Avsluta återställer sidan; efter virtuella sidbyten laddas destinationen som vanlig sida.

Upp till fyra spelare

  1. Välj Spela tillsammans, ange valfritt pilotnamn och klicka Skapa rum.
  2. Skicka samma inbjudningslänk till upp till tre kompisar.
  3. Kompisarna öppnar länken, skriver sina namn och väljer Anslut. Ingen svarskod.

PeerJS Cloud sköter kostnadsfri signalering; WebRTC skickar speldata mellan webbläsarna. Värden avgör träffar/poäng och samordnar sidbyten. Spelarna har färgade skepp, namn vid skeppen och en gemensam spelarlista. Powerups är individuella.

Endast triggerdetektorn laddas vid vanlig sidvisning. Spelmoduler, ljud och CSS laddas vid aktivering. Den lokalt serverade PeerJS-bundlen och nätverksanslutningen startar först vid Skapa rum/Anslut, även när lobbyn öppnats via inbjudan.

Ingen TURN finns, så vissa nätverk kan inte ansluta. Värden måste ha spelet öppet; efter att värden lämnat fortsätter gästerna i sololäge. Pilotnamn hålls i minnet och delas med deltagarna samt ingår i signaleringen. En localhost-länk fungerar endast på samma dator.

Verifierat

  • Bygge, 39 tester och sidkontroll av 255 sidor.
  • Dator, mobil (inklusive 320 px) och liggande format i Chromium.
  • Båda triggers, styrning/eld, ljudets livscykel, återställning av DOM/fokus, omstart.
  • Powerup-upplockning, kombo, animationer och full rensning.
  • Webbläsartest av skott mot annan pilot, sköld/reparation, respawn, sidkollision, gravitation och regelsynk till sen anslutning.
  • Scroll: normalfart, snabbscroll, synk, kantvändning och paus.
  • Förenklad lobby med livebesättning, värdmarkering och mobilvy.
  • Navigationsskott mot menylänk, förstörd meny, uppdragsbyte och tur/retur.
  • Riktig PeerJS Cloud/WebRTC mellan fyra separata browserkontexter: inbjudan, pilotnamn, gemensamma poäng (1500 hos alla), sidbyte utan avbrott, full lobby och återanvändning av ledig plats.
  • Nätverkskontroll av lazy loading före aktivering och före Skapa rum/Anslut.
  • Tester för inbjudningslänkar, främmande origin och normalisering av pilotnamn.

Inte provat på fysisk iPhone/Safari eller mellan två olika internetanslutningar. Prototypen är co-op och saknar tävlingsskydd mot fusk. Full användarguide finns i README.md.

Gemensam spelvärld och kamera

  • Gemensam sidlayout på 1280 × 800 i en separat spelvy. På mindre skärmar följer kameran skeppet; HUD och mobilkontroller behåller sin storlek.
  • Radar och kantmarkörer för övriga piloter. Originalsidans DOM bevaras bakom spelvyn.
  • Nya inbjudningar använder alltid startsidan som lobby. Äldre länkar med exempelvis /blogg/#space=… fungerar också; gästen följer värdens aktuella sida efter anslutning.
  • Spelvyn väntar på DOM, CSS och fonter, utan att blockeras av bloggarkivets samtliga bilder.
  • Friendly fire-skott stoppas vid kompisskepp. Värden kontrollerar skottägare/livslängd och spelregel; mottagaren tillämpar skada/skydd och skickar tillbaka gemensam träffeffekt.
  • Olika ljud för gravitation och snabbscroll samt slutsignal. Ljud initieras vid skapa/anslut, så även en pilot som ännu inte skjutit hör rumseffekter.

Verifierat i Chromium med fyra olika skärmar (1440 × 1000, 390 × 844, 844 × 390 och 1024 × 768): identisk sidlayout, skeppsträff, följande kamera, gemensam scroll/gravitation/ljud, sidbyte och avslut. Separat test av inbjudan från bloggarkivet, inklusive äldre länkar med undersida. Efter uppdateringen behöver redan öppna spel laddas om och en ny inbjudan skapas.

Lobby, ronder och skador

  • Pilotnamnet sparas lokalt och återställs vid nästa besök/inbjudan; tomt fält tar bort det. Blockerad lagring hindrar inte spelet.
  • Anslutna piloter väntar i lobbyn tills värden väljer Starta spelet. Sen anslutning följer en redan startad rond.
  • 120-sekundersronder med kills/dödsfall och gemensamt slutresultat. Flest kills vinner; lika många ger delad seger. Värden tar alla tillbaka till lobbyn för ny rond.
  • Skepp studsar mot varandra när kollisionsregeln är på; sköld skyddar mot skada men hindrar inte studsen. Värden samordnar skadan på båda skeppen.
  • Krasch vid noll skrov ger en synlig explosion och ett särskilt explosionsljud hos alla. Miljökrascher/skeppskollisioner ger dödsfall men ingen kill.
  • Sidobjekt tål 1–4 träffar efter typ. Urklippta kanter, toning, splitter och kvarvarande tålighet visar skadan. Poäng ges först vid full förstörelse. Delvis skadade objekt synkas även till sena anslutningar.

Verifierat i webbläsare: namnets beständighet och blockerad storage; väntelobby och värdstart; skeppskollision med/utan sköld; exakt en kill/död per nedskjutning och kraschljud hos båda; samma vinnare vid tidsgränsen; återställning inför ny rond; objektskador stegvis, synk och sen anslutning. Bygge, 39 tester och sidkontroll av 255 sidor går igenom.

Minor, bomber och isolering

  • MIN/BOM som pickups, upp till tre av varje. M/B och touchknappar placerar dem.
  • Minor aktiveras efter 0,6 s och ignorerar sin ägare. Bomber exploderar efter 1 s och kan skada ägaren.
  • Värden samordnar ammunition, utlösning och explosionsskador; friendly fire och sköld gäller. Explosioner skadar också sidobjekt.
  • Diskret konsolledtråd. Browserkontroll bekräftar att vanlig sidvisning bara laddar trigger.js, solo inte laddar PeerJS och avslut återställer sidan.
  • 44 tester godkända, build godkänd, 255 sidor kontrollerade. Två riktiga browserklienter verifierar minor, bombens fördröjning, skada och synkronisering.
  • Arkitekturgranskningen mot main är genomförd; se resultat nedan.

Genomförd granskning mot main

Reviewfixar: 3df4650. Senaste main (076bc759) är inmergad i feature-branchen (2fc592c). Main är inte ändrad/publicerad.

Rättade fynd, i prioritetsordning:

  1. Fördröjda nätverksmeddelanden kunde påverka en ny rond, en ny anslutning eller ett återbesök på samma URL. Alla spelmeddelanden får nu rondnummer och sidrevision; anslutningsbyten ogiltigförklarar gamla meddelandeköer och pågående sidladdningar.
  2. Full sändningsbuffert kunde tyst kasta även skador, explosioner och snapshots. Endast position/scroll får nu hoppas över; för stor kö kopplar ned i stället för att lämna klienterna osynkade. Transporten skiljer dessutom pilotanrop från värdens beslut och städar upp anslutningar som aldrig öppnas.
  3. Misslyckad uppstart kunde lämna spelrester eller en blockerad sida. Spel-CSS inväntas innan sidan görs inert, Escape avbryter laddning och initieringsfel återställer resurserna.
  4. Skott valde DOM-ordning före närmaste träff och fjärrskott saknade skeppets hastighet. Träffar väljs nu längs skottbanan, inklusive hinder framför skepp, och startposition/hastighet synkas.
  5. Menyer pausade lokal simulering medan rondklockan fortsatte. Simuleringen fortsätter nu bakom menyer; tidsbonus, skydd och respawn räknar verklig tid. Gästens omstart väntar på värdens start. Att lämna ett rum rensar tidigare matchtillstånd.

Struktur: Gränssnitt/tema, ritfunktioner och protokollregler ligger i separata moduler. Gemensamt meddelandeformat, dokumenterade modulansvar och reproducerbara browsertester. Rester från tidigare direktmanipulation av sidan och sektorterminologi har tagits bort.

Isolering: Vanlig sidvisning laddar endast trigger.js (cirka 3 kB okomprimerad). Spelkod/CSS/iframe laddas vid aktivering; PeerJS först vid Skapa/Anslut. Vanliga sidans DOM förblir orörd. Avslut återställer inert, fokus och scroll samt stänger ljud, nätverk, timers och lyssnare.

Verifiering: 51 automatiska tester godkända, bygge godkänt, 255 sidor kontrollerade och samtliga 255 URL:er från aktuella main bevarade. Chromium i desktop/mobilstorlek, upprepade starter/avslut, CSS-fel och Escape under laddning. Riktiga två-/trespelartester för lobby, navigering, gamla meddelanden, kills/vinnare/omstart, minor/bomber och objektskador vid sen anslutning. Ett live-test fick anslutningstimeout; samma test gick igenom vid omkörning utan kodändring.

Bedömning: Behåll statiska ES-moduler, separat iframe och PeerJS för denna funktion. Ingen ny spelmotor eller eget serverbygge behövs för nuvarande omfattning. Game.js är fortfarande en relativt stor samordnare; ytterligare spelfunktioner bör fortsätta läggas i avgränsade moduler.

Kända begränsningar: Ingen TURN eller värdmigrering; vissa nätverk kan inte kopplas ihop. Håll värdens flik aktiv eftersom webbläsare begränsar bakgrundsfysik. Klienterna betros för lokal rörelse/skrov, så detta är inte ett fuskresistent tävlingsspel. npm audit har befintliga fynd i byggverktyg; kontroll mot main-lockfilen visar att inga av fynden introducerats av denna branch.

@lizell
lizell marked this pull request as ready for review October 7, 2026 15:33
@lizell
lizell merged commit e70b531 into main Oct 7, 2026
1 check passed
@lizell
lizell deleted the feature/space-easter-egg branch October 7, 2026 15:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant