- Nazwa: Sweeper RPG
- Typ: Jednoplikowa gra HTML (index.html, ~3660 linii)
- Jezyk UI: Polski (caly tekst po polsku, humor w stylu Munchkina)
- Stack technologiczny: Czysty HTML + CSS + JavaScript (zero zaleznosci)
| Plik | Opis |
|---|---|
index.html |
Cala gra (~3660 linii: CSS + JS w jednym pliku) |
Lochy, Łupy i Lamy.mp3 |
Muzyka eksploracji (ambient) |
Lovers in the Dungeon.mp3 |
Muzyka walki (combat) |
- Body: full viewport, ciemny motyw (
#0a0a1a) - Layout glowny:
.game-screen(flex: left-panel 220px | center-panel flex:1 | right-panel 240px) .board: CSS Grid, dynamiczny rozmiar komorek (28-72px).cell-*: Style komorek (hidden, revealed, player, exit, monster, boss, treasure, gold, shop, npc).paperdoll: 8 slotow ekwipunku pozycjonowanych absolutnie.combat-overlay: Fullscreen overlay z canvas.combat-arena: Dynamiczna szerokosc/wysokosc (CSS-skalowany canvas 500x350)- Animacje:
bossGlow,treasureGlow,popIn - Responsive: @media (max-width: 900px) zmniejsza panele
$(),rng(),pick(),clamp(),lerp()calcCellSize()- oblicza rozmiar komorki planszy na podstawie dostepnej przestrzenicalcCombatSize()- oblicza rozmiar areny walki (proporcja 10:7, max 900px)
- SFX: Web Audio API (OscillatorNode) - 12 typow dzwiekow
hit,attack,crit,miss,pickup,equip,victory,defeat,levelup,quest,step,dodge,shop
- Muzyka: HTML5 Audio z crossfade
bgMusicAudio-> "Lochy, Łupy i Lamy.mp3" (ambient, vol 0.3, loop)combatMusicAudio-> "Lovers in the Dungeon.mp3" (combat, vol 0.35, loop)crossfadeTo(target)- 20 krokow przez 1 sekunde (setInterval)startCombatMusic()/stopCombatMusic()- wywolywane przy wejsciu/wyjsciu z walki
27 potworow w 6 tierach:
| Tier | Danger | Potwory | Opis |
|---|---|---|---|
| 0 | 0-1 | Karaluch, Maly Szczur, Grzyb, Robak, Stonozka | Tutorial, bardzo slabe |
| 1 | 1-2 | Sluz, Szczur, Nietoperz, Pajak, Mala Sluz | Latwe |
| 2 | 3-4 | Szkielet, Goblin, Zombie, Wilk | Srednie |
| 3 | 4-6 | Ork, Duch, Mroczny Mag, Troll, Bandyta | Trudne |
| 4 | 6-7 | Ognisty Zywiolak, Lodowy Zywiolak, Golem, Wampir, Bazyliszek | Bardzo trudne |
| 5 | 8-10 | Upior, Smocze Piskle, Demon, Lich, Smok | Najtrudniejsze |
Kazdy potwor ma: name, icon (emoji), danger, hp, atk, def, spd, desc, tier, patterns[]
Wzorce ataku (projectile patterns):
scatter- losowe kierunkiburst- eksplozja ze srodkafan- wachlarz z katawave- falowe pociskispiral- spirala ze srodkarain- deszcz z goryline- linia pociskowcharge- szybkie ladowaniehoming- naprowadzajace (turnRate)phase- migajace (przechodzace/nie)expand- rozszerzajacy sie pierscienbeam- laser obracajacy sieshockwave- fala uderzeniowa
~70 przedmiotow w 8 slotach:
| Slot | Klucz | Specjalne |
|---|---|---|
| Bron | weapon | atkType (timing/rapid/charge/magic), onHit |
| Zbroja | armor | - |
| Helm | helmet | - |
| Akcesorium | accessory | - |
| Tarcza | shield | - |
| Buty | boots | spd idzie do dodgeSpd |
| Karwasze | bracers | - |
| Specjalny | special | - |
Rzadkosci: common (szary), uncommon (zielony), rare (niebieski), epic (fioletowy), legendary (zloty)
Staty przedmiotow: str, def, spd, hp, luck, ability
Typy ataku broni (atkType):
timing- miecze: pasek z markerem, traf w streferapid- sztylety: klikaj SPACJE jak najszybciejcharge- topory: laduj i zwolnij w zlotej strefiemagic- rozdzki: rysuj rune klikajac punkty na canvasie
Efekty onHit: poison, stun, weaken, bleedM
5 Bossow:
- Krol Goblinow (tier 2, HP 120)
- Nekromanta (tier 3, HP 160)
- Ognisty Wladca (tier 4, HP 200)
- Straznik Otchlani (tier 5, HP 280)
- Cien Zar'Kotha (tier 5, HP 350)
Debuffs na gracza (od potworow): Trucizna, Spowolnienie, Oslabianie, Krwawienie Debuffs na potwory (od gracza): Trucizna, Ogluszenie, Oslabienie, Krwawienie
8 run do minigry magicznego ataku: Ignis, Aqua, Terra, Ventus, Fulgur, Umbra, Lux, Mortem
- Kazda runa to lista punktow {x, y} na canvasie 500x350
- Gracz klika punkty po kolei w czasowym limicie
Stale ulepszenia (PERM_UPGRADES) - kupowane za Punkty Duszy miedzy runami:
- Wytrzymalosc (+5 HP, max 20)
- Moc Duszy (+1 STR, max 15)
- Odpornosc (+1 DEF, max 15)
- Precyzja (+1 atkSpd, max 10)
- Refleks (+1 dodgeSpd, max 10)
- Fortuna (+1 luck, max 10)
- Regeneracja (+1 HP za odkryte pole, max 5)
Umiejetnosci (ABILITY_INFO) - 20 umiejetnosci:
- magicBolt, freeze, burn, holyStrike, lifeSteal, meteor
- magicShield, fireResist, shadowCloak, rage, stealth, command
- dash, regen, fireShield, immortal, warCry, ironSkin, haste, curse
8 NPC z dialogami w stylu Munchkina:
- Borek 🧔 - Stary Wojak
- Mirela 👩🔬 - Naukowiec (canReveal: true)
- Grzegorz 🧑🦳 - Kupiec
- Xardas 🧙♂️ - Mag (canReveal: true)
- Kasia 👧 - Dziecko
- Aelindra 🧝♀️ - Elfka
- Bromir ⛏️ - Krasnolud
- Sir Aldric 👻 - Duch
Kazdy NPC ma:
lines[]- 3 linijki dialoguquestLine- tekst questa (z placeholderami $MONSTER_PL, $MONSTER_D, $TARGET)rewardLine- dialog po odbiorze nagrodypostQuestLine- dialog po ukonczonym quesciequest- {type:'killSpecific', target: N, reward: {gold, revealMap}}
Sklep: 3-6 losowych przedmiotow + mikstura zdrowia, kupno/sprzedaz (40% wartosci)
7 ksztaltow map: rect, cave, cross, lshape, diamond, corridors, islands
generateMapMask(w, h, shape)tworzy boolowska maske- cave: random walk od centrum
- islands: dwie wyspy polaczone waskim mostem
Save (localStorage):
save = {
soulPoints: 0,
totalRuns: 0,
bestLevel: 0,
bestKills: 0,
upgrades: {hp, str, def, atkSpd, dodgeSpd, luck, regen}
}Game state (per-run):
game = {
screen: 'board', // menu, board, combat, gameover, levelcomplete, itemfound, shop, dialogue
level, board[][], boardW, boardH, playerPos,
player: {maxHp, hp, str, def, atkSpd, dodgeSpd, luck, regen},
equipment: {weapon, armor, helmet, accessory, shield, boots, bracers, special},
inventory: [], gold, monstersKilled, cellsExplored, equipmentFound,
log: [], quests: [], questsCompleted,
dialogueState, shopState, mapMask, goldCollected, treasurePos,
levelNodes: {}, currentNodeId, nextNodeCounter
}Migracja save: stare spd -> atkSpd + dodgeSpd
- Rozmiar:
min(18, 9+lvl)xmin(14, 7+lvl) - Losowy ksztalt mapy (lvl 1 = rect, potem losowy)
- Gestosc potworow: 0.16 (lvl1) -> 0.45 (lvl6+)
- Rozmieszczanie: klastry (70% przy centrach, 30% losowo)
- Skalowanie statow potworow: HP/DEF * (1 + (lvl-1)*0.25), ATK * (1 + (lvl-1)*0.3)
- Boss co 2 poziomy od lvl 2, skalowanie: HP/DEF * (1 + (lvl-1)*0.25), ATK * (1 + (lvl-1)*0.35)
- Wazony dobor tierow: lvl 1-2 preferuje slabe (4:1), lvl 3-4 srednie, lvl 5+ trudne
- 1-2 wyjsc (branching od lvl 2), wejscie powrotne
- Skarb: 1 na level (50% szans od lvl 2)
- Ekwipunek: 3 bazowe na lvl 1-2, potem 2 + lvl/2
- NPC: 1-3 losowych
- Sklep: 66% szans
placeTreasure()- rzadki/epicki/legendarny przedmiot z bonusemgetAvailableEquipment(level)- filtruje przedmioty po rzadkosci wedlug poziomusaveLevelState()/loadLevelState()- zapisuje/wczytuje stan poziomu do node'a- System branchingu: grafy wezlow, kazdy wezel = jeden odwiedzony poziom
- Oblicza finalne staty gracza z bazy + ekwipunku
- spd broni -> atkSpd, spd butow -> dodgeSpd, reszta -> split 50/50
- Zbiera abilities z ekwipunku
isAdjacent(x,y)- 8-kierunkowy ruch (siatka)movePlayer(x,y)- odkrywanie pol, walka, zbieranie, NPC, sklep, wyjsciarevealSafeNeighbors()- kaskadowe odkrywanie pustych pol (jak Saper)toggleFlag()- flagowanie potencjalnych potworow (prawy klik)recalcDangersFor()- przelicza liczby niebezpieczenstwa (jak Saper)- Wyjscia ->
saveLevelState()-> nowy lub zapisany level - Wejscia -> powrot do rodzica w grafie
CombatState zawiera:
- Pozycje gracza (px, py), rozmiar (pSize=12), predkosc
- Pociski (projectiles[])
- Stan minigry ataku (dla kazdego atkType)
- Cooldowny umiejetnosci
- Efekty statusowe (frozen, burning, rage, haste, defBoost, monsterAtkReduction, defReduction)
- Debuffs (playerDebuffs, monsterDebuffs)
- Floating damage numbers, combat journal
Fazy walki:
- intro (1.5s) - tekst "Walka!"
- dodge (5s + danger*600ms) - unikanie pociskow
- Gracz steruje WASD/strzalki
- Pociski generowane wedlug patterns[] potwora
- Predkosc gracza: 2 + dodgeSpd*0.3
- Predkosc pociskow skalowana: bazowa * (1 + monster.spd*0.1)
- Trafienie: dmg = max(1, monster.atk - player.def)
- Beam: laser z centrum areny
- attack - minigra ataku wedlug atkType broni
- timing: marker biegnie po pasku, SPACE w odpowiednim momencie
- rapid: kliker SPACE w limit czasu
- charge: naladuj do zlotej strefy i SPACE
- magic: klikaj punkty runy na canvasie
- victory/defeat - koniec walki
Kalkulacja obrazen (dealDamage):
- Bazowy dmg = player.str * multiplier (0.2-2.0 w zaleznosci od jakosci ataku)
- Crit chance: 10% + luck*2%
- Obrona potwora odjeta od dmg
- onHit efekty (poison, stun, weaken, bleedM)
Dash (umiejetnosc unik):
- 30 losowych kandydatow, scoring: odleglosc od pociskow, trajektoria, odleglosc od krawedzi
- Teleport do najlepszej pozycji + 500ms invincibility
combatVictory():
- Gold drop: bazowy + danger*5 + losowy bonus
- Quest progress: killSpecific sprawdza nazwe potwora
- Boss daje podwojny progress
- 1.5s delay, potem powrot na plansze + stopCombatMusic()
combatDefeat():
- Soul Points = lvl3 + kills2 + quests*10
- Zapisz do save, pokaz game over
System questow:
getQuestMonster(level)- losuje docelowego potwora z dostepnych tierowfillQuestText(text, monsterName, target)- zamienia $MONSTER_PL, $MONSTER_D, $TARGETacceptQuest()- przypisuje quest z wylosowanym potworemcheckQuestCompletion()- ustawiareadyForRewardgdy progress >= targetclaimQuestReward(npcId)- daje nagrode, oznacza jako completed- Cykl: pending -> readyForReward (wroc do NPC) -> completed
3-kolumnowy layout:
- Lewy panel: staty gracza, HP bar, zadania, umiejetnosci, dziennik
- Centrum: plansza z dynamicznym rozmiarem komorek (
calcCellSize()) - Prawy panel: paperdoll (8 slotow), ekwipunek tooltips, plecak
Komorki planszy:
- wall: szara, niekliklana
- hidden: ciemna, klikalna (odkryj)
- revealed: rozne typy (monster, gold, exit, entrance, equipment, shop, npc, empty+danger count)
- player: zielona ze emoji 🧙
- Tooltips na hover (staty potworow, nazwy przedmiotow, info o NPC)
Sklep:
- Zakladki: Kup / Sprzedaj
- Przedmioty z cenami, mikstura zdrowia
- Sprzedaz za 40% ceny bazowej
Dialog NPC:
- Stan: linie dialogu -> oferta questa -> quest zaakceptowany / odrzucony
- readyForReward: dialog nagrody z przyciskiem "Odbierz"
- completed: post-quest dialog
Quest Complete popup:
- Overlay z info "Wroc do X po nagrode!"
renderCombatScreen(app):
- Combat header: HP obu stron
- Stat Compare panel: 3 kolumny (gracz | nazwa | potwor) z podswietlaniem fazy
- Speed banner: SZYBSZY/WOLNIEJSZY z kolorami
- Canvas arena (500x350 internal, CSS-skalowany przez calcCombatSize)
- Attack bar (timing/rapid/charge/magic)
- Ability buttons, combat info, combat journal
renderCombat():
- requestAnimationFrame loop
- Rysuje na canvasie: tlo, siatka, beam, pociski, gracz, runy magiczne, floating dmg
- Per-frame updates: HP bars, stat panel, speed banner, attack bars, ability buttons
Klawiatura:
- WASD / strzalki: ruch gracza w walce (dodge)
- SPACE / Enter: atak w fazie ataku
- Klik na canvas: magia (rune points)
Mouse:
- Klik na komorke: ruch
- Prawy klik: flagowanie
- Klik na canvas: magic rune click (skalowane przez getBoundingClientRect)
Window resize:
- 150ms debounce -> render()
| Stat | Wartosc |
|---|---|
| STR | 5 (+upgrade) |
| DEF | 3 (+upgrade) |
| atkSpd | 2 (+upgrade) |
| dodgeSpd | 2 (+upgrade) |
| HP | 50 (+upgrade*5) |
| Luck | 1 (+upgrade) |
| Parametr | Formula |
|---|---|
| HP, DEF | bazowe * (1 + (lvl-1) * 0.25) |
| ATK | bazowe * (1 + (lvl-1) * 0.3) |
| Boss HP, DEF | bazowe * (1 + (lvl-1) * 0.25) |
| Boss ATK | bazowe * (1 + (lvl-1) * 0.35) |
| Level | Gestosc |
|---|---|
| 1 | 0.16 |
| 2 | 0.20 |
| 3 | 0.25 |
| 4-5 | 0.30 |
| 6+ | 0.30 + (lvl-5)*0.03, max 0.45 |
| Level | Tier 0-1 | Tier 2 | Tier 3+ |
|---|---|---|---|
| 1-2 | waga 4 | waga 1 | - |
| 3-4 | waga 2 | waga 3 | waga 1 |
| 5+ | waga 1 | waga 1 | waga 2 |
- Leczenie miedzy poziomami: 30% maxHP
- Ekwipunek na lvl 1-2: 3 bazowe (potem 2)
- Zloto na lvl 1-2: 3 bazowe (potem 2)
- Boss spawn: co 2 levele od lvl 2
- Sklep: 66% szans na pojawienie sie
- Komorki maja
dangerCount(ile potworow w sasiedztwie 8-kierunkowym) - Kolorowanie: d1=niebieski, d2=zielony, d3=zolty, d4=pomaranczowy, d5=czerwony
- Kaskadowe odkrywanie pustych pol (jak Saper)
- Flagowanie prawym klikiem
- Kazdy level moze miec 1-2 wyjscia
- Drzewo wezlow:
game.levelNodes[id]= {depth, parentId, board, ...} - Wejscia powrotne na poprzedni level
saveLevelState()/loadLevelState()zachowuje stan kazdego odwiedzonego poziomu
- Paperdoll z 8 slotami
- Kliknij slot aby zdekwipowac
- Kliknij przedmiot w plecaku aby ekwipowac
- Tooltips z pelnymi statami
- Item found overlay: "Zabierz" lub "Wymien na zloto"
- Gracz rozmawia z NPC (3 linie dialogu)
- NPC oferuje quest (killSpecific: zabij N sztuk konkretnego potwora)
- Potwor docelowy losowany z dostepnych tierow (
getQuestMonster) - Tekst questa wypelniony ($MONSTER_PL, $MONSTER_D, $TARGET)
- Quest progress rosnie po zabiciu wlasciwego potwora
- Po osiagnieciu celu: "Wroc do NPC po nagrode!" (status: readyForReward)
- Powrot do NPC: dialog nagrody, przycisk "Odbierz"
- Po odebraniu: post-quest dialog (zabawny, Munchkin-style)
- Losowy asortyment (3-6 przedmiotow + mikstura)
- Zakladki Kup/Sprzedaj
- Mikstura: leczy 25 + lvl*5 HP
- Sprzedaz za 40% wartosci bazowej
- Wszystkie opisy w stylu Munchkina (sarkastyczny, absurdalny humor)
- Przyklad potwora: "Zombie - Wolny, glupi i smierdzi. Jak kolega z pracy w poniedzialek."
- Przyklad przedmiotu: "Berlo Arcymaga - Sprowadza meteory. Overreaction? Moze troche."
- NPC maja charakterystyczne osobowosci i zabawne dialogi
- Quest dialogi i post-quest komentarze poglebiaja historie i humor