barkour/style.css
w1n5t0n f57c1f16f8 feat: top-down 'Dogpit' arena mode (dota-like view)
Second game mode selectable at dog select (host-authoritative online):
- js/sim_arena.js: top-down sim, same export surface as sim.js — x/y plane
  plus a z hop axis (Space / comma); KOs by knocking dogs into abyss pits
- js/mapgen_arena.js: mirrored symmetric arenas — walls, pits, center
  clearing, guaranteed spawn-to-center corridors, crystals/spikes/launch
  pads, mirrored saw pairs; fallback pit pair since pits are the only KO
  mechanic
- specials re-imagined per dog: zoom dash, ram + hop-slam, zip-leash
  slingshot, blink, hover (floats over pits/saws/spikes)
- render: arena tiles with wall shadows + void pits, top-down dog drawing
  with z-lift over a ground shadow; new fall event/sfx
- B.HOP input bit so 'up' can mean north in top-down (Space also jumps in
  side view); mode toggle UI + mode carried in start/rematch net messages

Tested: arena mapgen determinism/symmetry/connectivity + chaotic matches +
pit/hop scenarios headless; local chaos + full P2P arena match (host mode
flip syncs to client) in two headless browsers with zero page errors.
2026-06-10 15:23:22 +02:00

157 lines
3.9 KiB
CSS

* { box-sizing: border-box; margin: 0; padding: 0; }
html, body {
height: 100%;
background: #07090f;
color: #e8eaf6;
font-family: 'Courier New', monospace;
overflow: hidden;
}
#wrap {
position: relative;
width: 100vw; height: 100vh;
display: flex; align-items: center; justify-content: center;
}
#cv {
width: min(100vw, calc(100vh * 16 / 9));
height: min(100vh, calc(100vw * 9 / 16));
image-rendering: pixelated;
background: #0b1026;
transition: filter 0.3s;
}
#cv.dim { filter: brightness(0.35) blur(2px); }
#ui { position: absolute; inset: 0; pointer-events: none; }
#ui .screen { pointer-events: auto; }
#ui .screen.passthrough { pointer-events: none; }
.screen {
position: absolute; inset: 0;
display: flex; flex-direction: column;
align-items: center; justify-content: center;
gap: 14px;
text-align: center;
}
.hidden { display: none !important; }
h1 {
font-size: clamp(40px, 9vw, 96px);
letter-spacing: 0.08em;
color: #ffd740;
text-shadow: 4px 4px 0 #7a3b10, 8px 8px 0 #00000088;
}
h1 span { color: #4fc3f7; text-shadow: 4px 4px 0 #01579b, 8px 8px 0 #00000088; }
h2 { font-size: 28px; color: #ffd740; }
.tagline { opacity: 0.7; margin-bottom: 16px; }
button {
font: inherit;
font-size: 18px;
padding: 12px 28px;
min-width: 320px;
background: #1b2845;
color: #e8eaf6;
border: 2px solid #4fc3f7;
border-radius: 6px;
cursor: pointer;
transition: transform 0.06s, background 0.15s;
}
button:hover:not(:disabled) { background: #27375c; transform: translateY(-2px); }
button:disabled { opacity: 0.4; cursor: default; }
button.ghost { border-color: #555; min-width: 160px; font-size: 14px; }
.row { display: flex; gap: 12px; }
.row button { min-width: 180px; }
input {
font: inherit;
font-size: 28px;
letter-spacing: 0.4em;
text-transform: uppercase;
text-align: center;
width: 280px;
padding: 10px;
background: #11182d;
color: #ffd740;
border: 2px solid #4fc3f7;
border-radius: 6px;
}
.bigkey {
font-size: 56px;
letter-spacing: 0.3em;
color: #ffd740;
background: #11182d;
border: 2px dashed #ffd740;
border-radius: 8px;
padding: 12px 32px;
user-select: all;
}
.status { min-height: 1.4em; color: #9be7ff; }
.status.err { color: #ff8a80; }
.hint { opacity: 0.6; font-size: 13px; max-width: 420px; }
.help {
margin-top: 28px;
font-size: 13px;
opacity: 0.65;
line-height: 1.8;
}
/* char select */
.screen.wide { justify-content: center; }
.modebtn {
min-width: 220px;
font-size: 15px;
border-color: #555;
opacity: 0.6;
}
.modebtn small { display: block; font-size: 10px; opacity: 0.7; }
.modebtn.sel { border-color: #ffd740; color: #ffd740; opacity: 1; }
#mode-hint { margin-top: -6px; }
#char-grid {
display: flex; gap: 10px;
flex-wrap: wrap; justify-content: center;
max-width: 1100px;
}
.card {
width: 195px;
background: #11182dee;
border: 2px solid;
border-radius: 8px;
padding: 10px;
cursor: pointer;
transition: transform 0.08s;
display: flex; flex-direction: column; gap: 5px;
align-items: center;
}
.card:hover { transform: translateY(-4px) scale(1.02); }
.card-head { font-size: 20px; font-weight: bold; }
.card-breed { font-size: 11px; opacity: 0.6; }
.card-desc { font-size: 11px; opacity: 0.85; min-height: 3em; }
.card-moves { font-size: 10px; text-align: left; opacity: 0.7; padding-left: 14px; }
.card-moves li { margin: 2px 0; }
.card-tags { min-height: 20px; display: flex; gap: 6px; }
.tag {
font-size: 11px; font-weight: bold;
padding: 2px 8px; border-radius: 10px;
}
.tag.p1 { background: #4fc3f7; color: #07090f; }
.tag.p2 { background: #ff8a65; color: #07090f; }
#mute {
position: absolute; top: 10px; right: 14px;
font-size: 18px; opacity: 0.6;
pointer-events: none;
}
#pause-tag, #room-key-tag {
position: absolute; top: 10px; left: 50%;
transform: translateX(-50%);
background: #000000aa;
padding: 4px 16px;
border-radius: 12px;
font-size: 14px;
}
#room-key-tag b { color: #ffd740; letter-spacing: 0.2em; }