Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
c0b212a
chore: convert the medal icons to the served asset tree
NicolasArthurDev Sep 13, 2026
d29778e
chore: convert the music and sound effects to opus
NicolasArthurDev Sep 13, 2026
8c389c6
chore: publish the narrator voicepacks to the served asset tree
NicolasArthurDev Sep 13, 2026
b3eda40
build: count webm and opus in the bundle measurement
NicolasArthurDev Sep 13, 2026
ae5ab6c
feat: add the medal catalogue and its rarity table
NicolasArthurDev Sep 13, 2026
7fa0e75
feat: keep the recent kills that a multikill needs
NicolasArthurDev Sep 13, 2026
04a04df
feat: carry the hit height on the kill event
NicolasArthurDev Sep 13, 2026
0fc9a76
feat: award medals over a kill
NicolasArthurDev Sep 13, 2026
1dd02d7
feat: show the medal feed at the top of the visor
NicolasArthurDev Sep 13, 2026
0ba539c
feat: add the web audio mixer
NicolasArthurDev Sep 13, 2026
acf6fe6
feat: choose the music for the match phase
NicolasArthurDev Sep 13, 2026
a0b59d4
feat: cue the arena sound effects from the weapon and the character
NicolasArthurDev Sep 13, 2026
8ab995a
feat: queue the narrator voicelines by medal rarity
NicolasArthurDev Sep 13, 2026
22676ff
feat: add volume and narrator voice to the player settings
NicolasArthurDev Sep 13, 2026
8224ee4
feat: wire the audio into the boot flow
NicolasArthurDev Sep 13, 2026
0766c3a
docs: record the medal points on the hundred scale
NicolasArthurDev Sep 13, 2026
fdf78d9
fix: stop a footstep loop only after it has started
NicolasArthurDev Sep 13, 2026
3cf2ad4
fix: keep a stale crossfade timer from cutting the new track
NicolasArthurDev Sep 13, 2026
19a50de
docs: revoke the gdd sentence that medals replace
NicolasArthurDev Sep 13, 2026
677cd39
fix: outline the medal toast so it reads over the light arena
NicolasArthurDev Sep 13, 2026
bb62f83
fix: restart the match clock when the player deploys
NicolasArthurDev Sep 13, 2026
ca141ac
fix: pay the multikill ladder against what the chain already paid
NicolasArthurDev Sep 13, 2026
834570a
fix: charge the payback bonus once per death
NicolasArthurDev Sep 13, 2026
9479904
docs: restore the specFor docblock dropped in the settings table
NicolasArthurDev Sep 13, 2026
278465f
refactor: keep one medal icon url, in the module that owns the feed
NicolasArthurDev Sep 13, 2026
edabf1a
fix: keep a failing audio context from freezing the menu
NicolasArthurDev Sep 13, 2026
6c46c8d
fix: let an old medal toast fade instead of replaying it
NicolasArthurDev Sep 13, 2026
414d4ef
fix: hold the narrator line that beats its own manifest
NicolasArthurDev Sep 13, 2026
bd951d7
docs: correct which end of the medal feed the rarest lands on
NicolasArthurDev Sep 13, 2026
fc58038
docs: record that the sound effects came free of charge
NicolasArthurDev Sep 13, 2026
1c05a2d
feat: show one big medal at a time and move the score to the reticle
NicolasArthurDev Sep 13, 2026
b074723
docs: describe the two places a medal shows up
NicolasArthurDev Sep 13, 2026
1068e48
feat: enlarge the medal and match the tally to the score size
NicolasArthurDev Sep 13, 2026
dfab536
feat: set the combat readout in a condensed face
NicolasArthurDev Sep 13, 2026
1bcc7ee
Revert "feat: set the combat readout in a condensed face"
NicolasArthurDev Sep 13, 2026
cde8e0c
fix: convert the medal icons at the size the toast shows them
NicolasArthurDev Sep 13, 2026
b66e3a2
feat: leave the medal art alone and name it under the score
NicolasArthurDev Sep 13, 2026
325c0d6
feat: scale the medal entry animation with its rarity
NicolasArthurDev Sep 13, 2026
eab0bff
feat: give each medal rarity its own kind of motion
NicolasArthurDev Sep 13, 2026
22581ca
fix: leave nothing but light behind a legendary medal
NicolasArthurDev Sep 13, 2026
bf3f373
feat: widen the mixer to delay, offset and playback rate
NicolasArthurDev Sep 14, 2026
830a913
fix: align the bolt and the reload with what the animation shows
NicolasArthurDev Sep 14, 2026
b3207aa
fix: take the walking cadence from the running take, slowed
NicolasArthurDev Sep 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added audio/sfx/landing-after-jump.wav
Binary file not shown.
Binary file added audio/sfx/reload.wav
Binary file not shown.
Binary file added audio/sfx/running.wav
Binary file not shown.
Binary file added audio/sfx/scope.wav
Binary file not shown.
Binary file added audio/sfx/shot-reload.wav
Binary file not shown.
Binary file added audio/sfx/shot-sniper.wav
Binary file not shown.
Binary file added audio/sfx/song-medal.wav
Binary file not shown.
Binary file added audio/sfx/song-medal2.wav
Binary file not shown.
Binary file added audio/sfx/walking.wav
Binary file not shown.
16 changes: 16 additions & 0 deletions config/gameplay.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,5 +54,21 @@
"playersPerRoom": 8,
"pointsPerKill": 100,
"trainingDummies": 6
},
"medals": {
"bonusComum": 20,
"bonusIncomum": 50,
"bonusRara": 100,
"bonusLendaria": 250,
"bonusKillChain": 400,
"doubleKillWindowS": 5,
"tripleKillWindowS": 8,
"overkillWindowS": 12,
"killChainWindowS": 15,
"longshotM": 60,
"spinDeg": 360,
"buzzkillStreak": 5,
"headshotHeightRatio": 0.66,
"backstabAngleDeg": 120
}
}
60 changes: 52 additions & 8 deletions docs/asset-licenses.md
Original file line number Diff line number Diff line change
Expand Up @@ -371,16 +371,60 @@ alternativa sem essa restrição é qualquer voz `en_US` de dataset CC0 do mesmo
| `audio/musics/Chrome_Perimeter.mp3` | idem | idem | — |
| `audio/musics/Protocol_Seven.mp3` | idem | idem | — |

Três faixas, 192 kbps, 7,0 MB somadas — **não convertidas ainda**. O que entrar no jogo
precisa caber no orçamento do [nfr](nfr.md) junto do resto, e mp3 de 192 kbps estéreo é o
formato errado para isso: opus de 96 kbps corta o peso por dois sem diferença audível em
música de fundo.
Três faixas de 65 s, 67 s e 171 s. A origem continua sendo o mp3 de 192 kbps, 7,0 MB
somados; o que o navegador baixa é opus de 96 kbps em webm, **3,5 MB somados**, refeito por
[`scripts/convert-audio.mjs`](../scripts/convert-audio.mjs). A conta já estava escrita aqui
antes de valer: opus de 96 kbps corta o peso por dois sem diferença audível em música de
fundo.

## medalhas
Os 3,5 MB **não entram no caminho crítico** do pilar 2. A música toca por streaming, de um
elemento `<audio>`, e começa no primeiro gesto do jogador — não há espera pelo download
inteiro em momento nenhum.

## efeitos sonoros

| asset | origem | licença | atribuição |
|---|---|---|---|
| `images/medals/headshot.webp` | produção própria | do projeto | — |
| `audio/sfx/*.wav`, nove | banco de som gratuito, baixados pela equipe | **indefinida** | — |

Os arquivos foram obtidos **sem custo**. Isso resolve o preço e não resolve a licença: baixar
de graça não diz se o termo de uso permite redistribuir, que é a pergunta que a ADR 0004 faz.
Ela segue valendo aqui do jeito que já vale para as katanas e para os timbres do narrador —
**risco aceito para o trabalho acadêmico e para a feira**, e revogado se o jogo sair disso.

O que a metadata de cada arquivo preserva, e que é o fio para reencontrar a origem se for
preciso trocar algum:

| arquivo | metadata |
|---|---|
| `scope.wav` | `artist=Jake Bekker` |
| `song-medal2.wav` | `title=MicroWave bell`, `artist=AiM` |
| `shot-reload.wav` | `encoder=FL Studio 11` |
| `walking.wav` | `encoded_by=Pro Tools`, `date=2014-04-09` |
| `running.wav` | `date=2015-11-11` |
| `landing-after-jump.wav`, `reload.wav`, `shot-sniper.wav`, `song-medal.wav` | sem tag |

Origem em `assets/images/medals/incomum/headshot.png`, 1254 px, fora do git. O convertido é
128 px em webp, como manda [`docs/medals.md`](medals.md), e pesa 6,0 kB.
**Medido**: 4,0 MB de wav viram **180 kB** de opus mono a 64 kbps. Nenhum deles é posicional
— são o tiro, o passo e a luneta do próprio jogador —, então estéreo neles seria o dobro do
byte por nada.

## medalhas

| asset | origem | licença | atribuição |
|---|---|---|---|
| `images/medals/<slug>.webp`, dezessete | produção própria | do projeto | — |

Origem em `assets/images/medals/<raridade>/<slug>.png`, ~1250 px e 35 MB somados, fora do
git. O convertido é 384 px em webp, como manda [`docs/medals.md`](medals.md), e
[`scripts/convert-medals.mjs`](../scripts/convert-medals.mjs) é quem refaz o conjunto
inteiro a partir da origem.

**Medido**: 17 ícones, 860 kB somados, o maior sendo `kill-chain.webp` com 71 kB. O toast do
hud mostra a medalha a até 320 px, então 384 é o menor tamanho que nunca exige upscale — a
qualidade da filigrana de metal é o que se perde antes de qualquer outra coisa. Os 860 kB
entram **depois** que o jogador ganha o controle, fora do caminho crítico que o pilar 2
mede.

O arquivo de origem do `airborne` está com o nome trocado (`airbone.png`). O script mapeia o
nome errado para o slug certo em vez de renomear a origem, porque o vault de onde ela vem é
de fora do repositório.
6 changes: 3 additions & 3 deletions docs/gdd.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ o jogador abre um link, apelido gerado aleatóriamente e entra partida em andame

o jogador tem a possiblilidade de salvar dados criando e logando com um conta

o loop é: nascer, buscar linha de tiro, matar ou morrer, voltar. cada kill vale um ponto e é a única fonte de pontuação. ao fim dos cinco minutos ganha quem tem mais pontos, e empate fica empate. a partida seguinte começa com o mesmo grupo.
o loop é: nascer, buscar linha de tiro, matar ou morrer, voltar. kill vale 100 pontos, e as medalhas de [`medals.md`](medals.md) somam por cima dela — é a única outra fonte de pontuação, e nenhuma delas compra nada. ao fim dos cinco minutos ganha quem tem mais pontos, e empate fica empate. a partida seguinte começa com o mesmo grupo.

a arena é única, fechada por geometria e tem três camadas: becos embaixo (distância curta), passarelas no meio (rota principal de trânsito, uso mais frequente do gancho), telhados em cima (linhas de tiro longas, jogador exposto). cada camada tem pelo menos duas rotas de subida que não exigem gancho, e toda linha de tiro longa tem cobertura intermediária. doze pontos de spawn distribuídos pelas três camadas.

Expand Down Expand Up @@ -141,12 +141,12 @@ a narrativa é ambiental: outdoor, pichação e letreiro. não há campanha, npc

## Gameplay (Brief)

até oito jogadores em free-for-all livre de cinco minutos numa arena vertical de três camadas. sniper, pulo duplo e gancho, mais uma faca para o corpo a corpo. respawn rápido, sem invulnerabilidade. kill vale um ponto e é a única pontuação.
até oito jogadores em free-for-all livre de cinco minutos numa arena vertical de três camadas. sniper, pulo duplo e gancho, mais uma faca para o corpo a corpo. respawn rápido, sem invulnerabilidade. kill vale 100 pontos, mais o bônus da medalha que ela ganhar.

## Gameplay (Detailed)
- entrada: link, campo de apelido com a lista de controles ao lado, botão de jogar. alocação em sala de até oito jogadores, entrando na partida em andamento.
- controles: wasd move, mouse mira, botão esquerdo atira, botão direito liga e desliga a mira telescópica, espaço pula (duas vezes), tecla dedicada para gancho, tecla dedicada para faca, tab mostra o placar.
- loop: cronômetro de cinco minutos, placar por tab, killfeed no canto. kill vale um ponto. sem dano de queda e sem limite de mapa a respeitar, porque a arena é fechada por geometria.
- loop: cronômetro de cinco minutos, placar por tab, killfeed no canto, feed de medalhas no topo central. kill vale 100 pontos. sem dano de queda e sem limite de mapa a respeitar, porque a arena é fechada por geometria.
- arena: três camadas (becos, passarelas, telhados), pelo menos duas rotas de subida por camada sem gancho, cobertura intermediária em toda linha de tiro longa, doze spawns distribuídos.
- hud: retículo, indicador de recarga, cronômetro, killfeed.
- feedback de tiro: hitmarker no acerto, zunido de bala no quase-acerto.
Expand Down
Loading