Split The code is public; the app answers only to the crew.
README's *What is real and what is not* is one 84-line paragraph: give it the structure the rest of the file has #243
Check · Review · Land · Live done — Landed and live in production.
scout/cs:scout/176-readme-s-what-is-real-and-what-is-not-is → main 1 commit fork
1 file
changed +111
−101
README.md +111 −101
| @@ -43,28 +43,29 @@ wants one, but the running server never reads it. | ||
| 43 | 43 | |
| 44 | 44 | ## What is real and what is not |
| 45 | 45 | |
| 46 | - **Real.** The game: WebGL2 written by hand, a fixed 64 Hz simulation, Source-style | |
| 47 | movement (ground friction, air acceleration, an 18-unit step, strafe jumping, | |
| 48 | and the **crouch-jump**: a jump peaks at 57 units, 7 short of the 64-unit | |
| 49 | crates both maps are full of, but duck in the air and the legs tuck up under | |
| 50 | a head that stays put, so the feet clear 75 and you land on top — jump | |
| 51 | without ducking and the crate is still in your way. The jump itself is no | |
| 52 | higher; standing back up in the air is refused while the legs have nowhere | |
| 53 | to go, the same way it is under a low ceiling. **The bots do not jump**, so | |
| 54 | a crate top is a place a bot will not follow you to: one sent after | |
| 55 | something up there, the bomb included, walks to the foot of the crate and | |
| 56 | waits), | |
| 57 | CS damage with range falloff, armour and hitgroups, a knife that pays for a flank | |
| 58 | — 55 in the chest, 180 in the back, where "the back" is CS's own test of standing | |
| 59 | within 61.65° of straight behind someone and armour stops the same share either | |
| 60 | way, so one stab from behind ends a full-health player with a vest on — | |
| 61 | deterministic spray patterns, a draw on every weapon — 0.4 s on the knife up | |
| 62 | to 1.25 s on the AWP, before which the trigger and the scope do nothing, | |
| 63 | which is what makes the three carry speeds a choice — | |
| 64 | a 1:55 round with a 40-second bomb, plant and defuse timers, kill rewards and | |
| 65 | loss bonuses. Cover is not all equal: a bullet goes **through a crate** if | |
| 66 | the round is strong enough for the thickness it meets. Crates are the only | |
| 67 | penetrable material — walls, floors, the site plates and metal stop | |
| 46 | - **Real.** | |
| 47 | ||
| 48 | **The guns and penetration.** The game: WebGL2 written by hand, a fixed 64 Hz | |
| 49 | simulation, Source-style movement (ground friction, air acceleration, an | |
| 50 | 18-unit step, strafe jumping, and the **crouch-jump**: a jump peaks at 57 | |
| 51 | units, 7 short of the 64-unit crates both maps are full of, but duck in the | |
| 52 | air and the legs tuck up under a head that stays put, so the feet clear 75 | |
| 53 | and you land on top — jump without ducking and the crate is still in your | |
| 54 | way. The jump itself is no higher; standing back up in the air is refused | |
| 55 | while the legs have nowhere to go, the same way it is under a low ceiling. | |
| 56 | **The bots do not jump**, so a crate top is a place a bot will not follow you | |
| 57 | to: one sent after something up there, the bomb included, walks to the foot | |
| 58 | of the crate and waits), CS damage with range falloff, armour and hitgroups, | |
| 59 | a knife that pays for a flank — 55 in the chest, 180 in the back, where "the | |
| 60 | back" is CS's own test of standing within 61.65° of straight behind someone | |
| 61 | and armour stops the same share either way, so one stab from behind ends a | |
| 62 | full-health player with a vest on — deterministic spray patterns, a draw on | |
| 63 | every weapon — 0.4 s on the knife up to 1.25 s on the AWP, before which the | |
| 64 | trigger and the scope do nothing, which is what makes the three carry speeds | |
| 65 | a choice — a 1:55 round with a 40-second bomb, plant and defuse timers, kill | |
| 66 | rewards and loss bonuses. Cover is not all equal: a bullet goes **through a | |
| 67 | crate** if the round is strong enough for the thickness it meets. Crates are | |
| 68 | the only penetrable material — walls, floors, the site plates and metal stop | |
| 68 | 69 | everything — and every crate on either map is 128 units across, so the AWP |
| 69 | 70 | (230 units), AK-47 (175), M4A4 (165) and Desert Eagle (150) punch one |
| 70 | 71 | face-on while the Glock (48), USP (55) and MP9 (60) manage nothing but a |
| @@ -76,52 +77,59 @@ wants one, but the running server never reads it. | ||
| 76 | 77 | surely as a wall, and the far side of a punched crate is marked where the |
| 77 | 78 | bullet went in as well as where it stopped. The bots do not know any of |
| 78 | 79 | this: their sight is still blocked by a crate, so shooting one off a box |
| 79 | they think is cover is yours to use. The economy has CS's loop: weapons drop. A player killed leaves | |
| 80 | the gun they were holding on the floor with whatever was left in the magazine | |
| 81 | — a knife never drops, and someone killed holding one leaves their primary — | |
| 82 | and it can be picked up. With no primary you take it by walking over it; with | |
| 83 | one already, <kbd>E</kbd> swaps, and the gun you were holding lands at your | |
| 84 | feet. There is no team rule: a CT who finds an AK-47 keeps it. The floor is | |
| 85 | swept at the start of the next round, and whatever you are carrying then comes | |
| 86 | back with a full magazine. There is one piece of utility: an **HE grenade**, | |
| 87 | $300 in the buy menu, one in a pocket at a time. <kbd>4</kbd> puts it in your | |
| 88 | hand and fire throws it — out of your eye, a little above where you are | |
| 89 | looking, carrying whatever speed you were already running at. It falls under | |
| 90 | the same 800 u/s² the rest of the game does, bounces off walls and crates | |
| 91 | keeping 45% of the speed it hit them with, and goes off **1.6 seconds** after | |
| 92 | it left your hand wherever it is by then. The blast is **98 damage at its | |
| 93 | centre, falling linearly to nothing at 350 units**, halved by armour (which | |
| 94 | takes half of what it stops), and it does nothing at all through a wall — the | |
| 95 | same sight line a bot sees you with, its centre to your eye. It cannot hurt | |
| 96 | your own side, and it can very much kill you. A grenade thrown is gone; one | |
| 97 | kept is still yours next round, the same rule the guns follow. The bots do not | |
| 98 | buy or throw one: their fight was learned in an arena that has no grenades in | |
| 99 | it, and they keep buying guns. Hit feedback runs both ways: a hit marker and a beep when you hit | |
| 100 | someone — four ticks around the crosshair, red for a headshot, and for the hit | |
| 101 | that **finished** them a heavier mark, held twice as long, closed into an X | |
| 102 | through the middle, so the fifth bullet does not look like the four before it; | |
| 103 | your own grenade confirms the same way, once for each enemy the blast caught; | |
| 104 | a round a **teammate** stops sparks on their body, marks a plus in your side's | |
| 105 | colour with no beep, and says "Blocked by <name>" once a burst — still no | |
| 106 | friendly fire — | |
| 107 | and when you are hit a view punch away from the shot, a wedge around | |
| 108 | the crosshair pointing at whoever fired, a vignette that reddens as your health | |
| 109 | falls and a pain sound. A hit also **tags**, for everyone the same way: | |
| 110 | each point of damage takes 1% of the victim's ground speed, never more | |
| 111 | than half of it however many land, and it runs back at the full 100% a | |
| 112 | second — 30 in the chest holds a runner to 175 u/s and is gone in 0.3 s — | |
| 113 | while a player in the air is not tagged at all, and a new round starts | |
| 114 | everyone untagged. A **fall** costs health the way CS's does: nothing | |
| 115 | landing under 580 u/s, then 0.0888 a point for every u/s past it, rounded to | |
| 116 | whole points, on the one tick the fall ends — armour is no help, the ledger | |
| 117 | and the round report put it down to *a fall*, a death to one reads as a fall | |
| 118 | in the kill feed and pays nobody, and you feel it as the same flinch, | |
| 119 | vignette and pain sound a hit gives, with no wedge because it came from | |
| 120 | straight below. The honest part: nothing on `de_forge` or `de_cinder` is | |
| 121 | tall enough to reach it. The highest floor anyone can stand on is a crate | |
| 122 | top at 128 units, which lands at about 452 u/s; a drop needs roughly 210 | |
| 123 | units before it costs anything (320 costs 12). The rule is here so the | |
| 124 | simulation is whole, and so taller geometry gets it for free. The gun says what it is doing, too. Every shot lights | |
| 80 | they think is cover is yours to use. | |
| 81 | ||
| 82 | **The drop economy.** The economy has CS's loop: weapons drop. A player | |
| 83 | killed leaves the gun they were holding on the floor with whatever was left | |
| 84 | in the magazine — a knife never drops, and someone killed holding one leaves | |
| 85 | their primary — and it can be picked up. With no primary you take it by | |
| 86 | walking over it; with one already, <kbd>E</kbd> swaps, and the gun you were | |
| 87 | holding lands at your feet. There is no team rule: a CT who finds an AK-47 | |
| 88 | keeps it. The floor is swept at the start of the next round, and whatever | |
| 89 | you are carrying then comes back with a full magazine. | |
| 90 | ||
| 91 | **Utility.** There is one piece of utility: an **HE grenade**, $300 in the | |
| 92 | buy menu, one in a pocket at a time. <kbd>4</kbd> puts it in your hand and | |
| 93 | fire throws it — out of your eye, a little above where you are looking, | |
| 94 | carrying whatever speed you were already running at. It falls under the | |
| 95 | same 800 u/s² the rest of the game does, bounces off walls and crates | |
| 96 | keeping 45% of the speed it hit them with, and goes off **1.6 seconds** | |
| 97 | after it left your hand wherever it is by then. The blast is **98 damage at | |
| 98 | its centre, falling linearly to nothing at 350 units**, halved by armour | |
| 99 | (which takes half of what it stops), and it does nothing at all through a | |
| 100 | wall — the same sight line a bot sees you with, its centre to your eye. It | |
| 101 | cannot hurt your own side, and it can very much kill you. A grenade thrown | |
| 102 | is gone; one kept is still yours next round, the same rule the guns follow. | |
| 103 | The bots do not buy or throw one: their fight was learned in an arena that | |
| 104 | has no grenades in it, and they keep buying guns. | |
| 105 | ||
| 106 | **Feedback.** Hit feedback runs both ways: a hit marker and a beep when you | |
| 107 | hit someone — four ticks around the crosshair, red for a headshot, and for | |
| 108 | the hit that **finished** them a heavier mark, held twice as long, closed | |
| 109 | into an X through the middle, so the fifth bullet does not look like the | |
| 110 | four before it; your own grenade confirms the same way, once for each enemy | |
| 111 | the blast caught; a round a **teammate** stops sparks on their body, marks a | |
| 112 | plus in your side's colour with no beep, and says "Blocked by <name>" once a | |
| 113 | burst — still no friendly fire — and when you are hit a view punch away from | |
| 114 | the shot, a wedge around the crosshair pointing at whoever fired, a vignette | |
| 115 | that reddens as your health falls and a pain sound. A hit also **tags**, for | |
| 116 | everyone the same way: each point of damage takes 1% of the victim's ground | |
| 117 | speed, never more than half of it however many land, and it runs back at | |
| 118 | the full 100% a second — 30 in the chest holds a runner to 175 u/s and is | |
| 119 | gone in 0.3 s — while a player in the air is not tagged at all, and a new | |
| 120 | round starts everyone untagged. A **fall** costs health the way CS's does: | |
| 121 | nothing landing under 580 u/s, then 0.0888 a point for every u/s past it, | |
| 122 | rounded to whole points, on the one tick the fall ends — armour is no help, | |
| 123 | the ledger and the round report put it down to *a fall*, a death to one | |
| 124 | reads as a fall in the kill feed and pays nobody, and you feel it as the | |
| 125 | same flinch, vignette and pain sound a hit gives, with no wedge because it | |
| 126 | came from straight below. The honest part: nothing on `de_forge` or | |
| 127 | `de_cinder` is tall enough to reach it. The highest floor anyone can stand | |
| 128 | on is a crate top at 128 units, which lands at about 452 u/s; a drop needs | |
| 129 | roughly 210 units before it costs anything (320 costs 12). The rule is here | |
| 130 | so the simulation is whole, and so taller geometry gets it for free. | |
| 131 | ||
| 132 | **Sound and bodies.** The gun says what it is doing, too. Every shot lights | |
| 125 | 133 | a **muzzle flash** — a star of additive light at the end of the barrel, sized |
| 126 | 134 | by the weapon and gone in three frames — on the gun in your hands and on |
| 127 | 135 | every other gun on the map, so a firefight across the site reads as people |
| @@ -139,39 +147,41 @@ wants one, but the running server never reads it. | ||
| 139 | 147 | nothing. Both of those are animation and nothing else — the switch itself is |
| 140 | 148 | still instantaneous, as it always was, so a gun still on its way up fires the |
| 141 | 149 | moment the simulation says it may, and no bot, no `observe.ts` input and no |
| 142 | rule of the round can tell the difference. Every world sound is panned around the listener's | |
| 143 | view and fades with distance — a shot or a footstep to your left plays from | |
| 144 | the left channel, to your right the right — and a running player who is not | |
| 145 | walking, ducking or airborne leaves footsteps this way too, so someone | |
| 146 | closing in from behind is something you hear before you see. **Legs swing on | |
| 147 | that same stride**: the ground a player has covered is the phase the other | |
| 148 | nine bodies are posed from, so an enemy crossing a doorway reads as someone | |
| 149 | running and a player at a dead stop is still. One stride of ground is one | |
| 150 | *step* — a cycle of legs is two of them, right foot then left — so the legs | |
| 151 | alternate at exactly the cadence you hear and the swing is widest at the | |
| 152 | footfall. It is one draw each, hinged in the vertex shader, and the | |
| 153 | simulation neither sets it nor reads it — a walker's legs move on a stride | |
| 154 | nobody hears. The gun rides the upper body, so a running player's muzzle | |
| 155 | flash comes off the end of the barrel their lean has moved rather than where | |
| 156 | the gun was modelled. The pose is a picture and nothing else: hitboxes are | |
| 157 | axis-aligned on a player's position and know nothing about it, so a sprinting | |
| 158 | enemy's swung foot is drawn further out than the box a bullet finds it in. | |
| 159 | The head is the exception, because the head is the shot worth taking — it is | |
| 160 | left out of the lean, so what you aim at and what you hit are the same box. | |
| 161 | A planted bomb | |
| 162 | beeps: about once a second right after the plant, quickening to a few a | |
| 163 | second — and rising in pitch — as the fuse runs out, so a CT can walk to the | |
| 164 | site by ear with no map open. The plant, the defuse, the detonation and a | |
| 165 | trigger pulled on an empty magazine each have their own sound too. Going off | |
| 166 | is the same blast rule the HE uses — falling linearly from full at the | |
| 167 | centre to nothing at **900 units**, halved by armour — with its own, much | |
| 168 | larger, centre damage: close enough in it kills through full kevlar, far | |
| 169 | enough out you end the round alive and hurt. A wall does nothing to stop | |
| 170 | it — the bomb ignores cover in CS, and this does too — and nobody is | |
| 171 | credited for the kill, the way blowing yourself up with your own grenade | |
| 172 | never is. | |
| 173 | A footstep only carries so far, but the bomb's beep and the blast that ends it | |
| 174 | carry across the whole map. The leaderboard is a real SQLite table under | |
| 150 | rule of the round can tell the difference. Every world sound is panned | |
| 151 | around the listener's view and fades with distance — a shot or a footstep to | |
| 152 | your left plays from the left channel, to your right the right — and a | |
| 153 | running player who is not walking, ducking or airborne leaves footsteps this | |
| 154 | way too, so someone closing in from behind is something you hear before you | |
| 155 | see. **Legs swing on that same stride**: the ground a player has covered is | |
| 156 | the phase the other nine bodies are posed from, so an enemy crossing a | |
| 157 | doorway reads as someone running and a player at a dead stop is still. One | |
| 158 | stride of ground is one *step* — a cycle of legs is two of them, right foot | |
| 159 | then left — so the legs alternate at exactly the cadence you hear and the | |
| 160 | swing is widest at the footfall. It is one draw each, hinged in the vertex | |
| 161 | shader, and the simulation neither sets it nor reads it — a walker's legs | |
| 162 | move on a stride nobody hears. The gun rides the upper body, so a running | |
| 163 | player's muzzle flash comes off the end of the barrel their lean has moved | |
| 164 | rather than where the gun was modelled. The pose is a picture and nothing | |
| 165 | else: hitboxes are axis-aligned on a player's position and know nothing | |
| 166 | about it, so a sprinting enemy's swung foot is drawn further out than the | |
| 167 | box a bullet finds it in. The head is the exception, because the head is the | |
| 168 | shot worth taking — it is left out of the lean, so what you aim at and what | |
| 169 | you hit are the same box. | |
| 170 | ||
| 171 | **The bomb.** A planted bomb beeps: about once a second right after the | |
| 172 | plant, quickening to a few a second — and rising in pitch — as the fuse runs | |
| 173 | out, so a CT can walk to the site by ear with no map open. The plant, the | |
| 174 | defuse, the detonation and a trigger pulled on an empty magazine each have | |
| 175 | their own sound too. Going off is the same blast rule the HE uses — falling | |
| 176 | linearly from full at the centre to nothing at **900 units**, halved by | |
| 177 | armour — with its own, much larger, centre damage: close enough in it kills | |
| 178 | through full kevlar, far enough out you end the round alive and hurt. A wall | |
| 179 | does nothing to stop it — the bomb ignores cover in CS, and this does too — | |
| 180 | and nobody is credited for the kill, the way blowing yourself up with your | |
| 181 | own grenade never is. A footstep only carries so far, but the bomb's beep | |
| 182 | and the blast that ends it carry across the whole map. | |
| 183 | ||
| 184 | **The leaderboard.** The leaderboard is a real SQLite table under | |
| 175 | 185 | `FORGE_APP_DATA`, also served as plain JSON from `GET /api/leaderboard` for |
| 176 | 186 | the terminal or any other client — with a `guest` flag per row instead of the |
| 177 | 187 | identity it comes from, because a guest's identity is the session cookie that |