Commit Graph
1272 Commits
Author SHA1 Message Date
Mark Greene a5eac5572e Fix: remove background sliver under equalizer toggle gradient
On some browsers a thin sliver of the Insanity banner showed through along the rounded edges of the equalizer toggle, most visibly on the right where the gradient is opaque. The banner and the gradient were painted on two separately clipped elements, so their anti-aliased edges didn't line up.

- Moved the gradient onto the outer box as the top layer of its `backgroundImage`, above the banner
- Removed the separate gradient layer from the inner flex

Fixes #297
2026-10-05 17:20:52 +13:00
tresabhi 7cb3df3da2 reload 2026-10-04 18:16:08 -05:00
tresabhi 474e71843d assaultDamageCoefficient 2026-10-04 17:57:12 -05:00
tresabhi 16637dac71 applySpallLiner 2026-10-04 17:53:57 -05:00
tresabhi 1a19cff268 applyDynamicArmor 2026-10-04 17:25:20 -05:00
tresabhi 870f7d799b applyReactiveArmor 2026-10-04 17:22:23 -05:00
tresabhi 4e1219486d penetration 2026-10-04 17:08:03 -05:00
tresabhi bf132a7387 start of scripts 2026-10-04 16:42:35 -05:00
tresabhi b4175dc60d Merge branch 'main' into data-driven 2026-10-04 16:34:02 -05:00
tresabhi 6ebb2810ad Merge branch 'main' into data-driven 2026-10-04 16:33:53 -05:00
tresabhi 60a92fbfdf pixel perfect fix 2026-10-04 14:13:55 -05:00
Mark Greene 643e1dd352 Fix: crop transparent padding from fade flags
The fade flag images are 2:1 but the flag only fills the left part, with the rest transparent. That made `cover` + `center` in the tech tree node crop and offset the visible flag.

- Trim the transparent border from the fade flag in the `/flags/fade/[id].webp` route using `sharp`
- Revert the tech tree node back to `cover` + `center`, since the image is now just the flag
2026-10-05 08:10:52 +13:00
TrèsAbhi 5ba62d2952 Merge branch 'main' into translate-margin 2026-10-04 14:09:20 -05:00
TrèsAbhi 1bdd8bab9e Merge branch 'main' into filter-defaults 2026-10-04 14:07:27 -05:00
TrèsAbhi 95d6d8a1ae Merge branch 'main' into stale-info 2026-10-04 14:06:06 -05:00
TrèsAbhi c310e8475e Merge branch 'main' into reload-visualiser 2026-10-04 14:04:17 -05:00
TrèsAbhi e090aee984 Merge pull request #277 from Hitjack007/search-issues 2026-10-04 14:03:54 -05:00
tresabhi f3a8f2faab only supply full name if it's different 2026-10-04 14:03:32 -05:00
TrèsAbhi 0539d69c7f Merge pull request #276 from Hitjack007/tank-title-and-loading-bars-difference 2026-10-04 13:57:50 -05:00
TrèsAbhi 89b8f25918 Merge branch 'main' into gun-depression-visualiser 2026-10-04 13:52:37 -05:00
tresabhi 9a659845f5 make spall icon not a button 2026-10-04 13:51:53 -05:00
TrèsAbhi b880b8cdbd Merge branch 'main' into spall-liner-in-tankopdiea-model-viewer 2026-10-04 13:47:04 -05:00
tresabhi 6be4ff97f3 env 2026-10-04 13:36:33 -05:00
Mark Greene fbba0bf13b Fix: constrain playlist filter width
The filters on the playlist page stretched into one long strip beside the tank pool, squeezing the pool into the remaining space.

**Changes**
- Place the filters and the generate button in a fixed-width column (`22rem`) on medium screens and up so the filter buttons wrap compactly
- Stretch the generate button to the column width
- Let the tank pool take the remaining width
- Tighten the gap between the two columns
- Keep the existing stacked layout on small screens
2026-10-04 20:07:52 +13:00
Mark Greene c2c586c2e7 Fix: scroll track textures at the same rate
Dragging a tank's track scrolled its roughness/metalness texture at twice the speed of the base color and normal textures, so highlights drifted off the track links.

**Cause**
- `translateTexture` added the scroll offset to `roughnessMap` and `metalnessMap` separately
- glTF has a single metallic-roughness texture, and the loader assigns that same texture object to both slots, so it received the offset twice

**Changes**
- Collect the track's maps in a `Set` before scrolling so a texture shared between slots is offset exactly once
2026-10-04 20:00:51 +13:00
Mark Greene aaf0e52be4 Fix: restore redirect to the user's preferred locale
Users were no longer sent to their preferred locale. `LocaleRedirector` was emptied in `115fa5aca` after its previous versions caused repeated redirects, and nothing replaced it.

**Cause**
- The earlier logic compared the best locale (a string) against the current locale entry (an object), so the check was always true on non-default locale pages
- That made the redirect fire repeatedly, which led to the logic being removed entirely

**Changes**
- Derive the current locale from the URL, treating the default locale as unprefixed to match how pages are generated
- Redirect only when the best locale differs from the current locale, so it stops after one hop
- Redirect users with a saved `preferred-locale` from any page
- Redirect users without a saved preference from default-locale URLs only, using their browser language, so shared locale links are respected
- Preserve the rest of the path when swapping the locale prefix
- Skip `/api` paths
2026-10-04 19:47:20 +13:00
Mark Greene 6907e5fb7a Fix: mixer buttons clipping at the screen edges on small phones
The mixer's hull/turret/gun row is about 440px wide at its fixed sizes and is centered with `left: 50%` and `translateX(-50%)`, so on phones narrower than that it overflowed past both edges.

Use smaller button sizes on phones and scale the tank images with the viewport (`clamp(2rem, 11vw, 4em)`), with smaller separators and gaps. From 520px up the layout is unchanged.
2026-10-04 15:17:51 +13:00
Mark Greene e5e2f2505c Fix: static armor controls peeking in at the screen edge
The static armor panel hid itself with a fixed `right: -6rem`. In languages with longer labels (e.g. Spanish) the panel is wider than that, so part of it stayed visible at the edge.

Anchor the panel at `right: 0` and slide it out with a transform based on its own width (`translateX(calc(100% + var(--space-4)))`) when static armor isn't active, so it always clears the edge regardless of label length.
2026-10-04 14:50:10 +13:00
Mark Greene b4770c1497 Fix: uneven margin around the help translate link
The "Help translate BlitzKit" link on the home page had only a bottom margin, so it sat flush against the hero above while the tool grid below added extra space.

Add a top margin so the space above matches the space below, leaving the bottom margin unchanged.
2026-10-04 14:44:39 +13:00
Mark Greene cef393473f Fix: testing and unlocked filters off by default and exclusive
Both buttons in the testing and unlocked filter pairs started on, so showing only one kind meant turning the other kind off.

Start all four filters off, treat a pair with neither button on as showing everything, and make the buttons in each pair mutually exclusive: turning one on turns its partner off, and clicking an active one turns it off. The playlist page now sets the unlocked filter on (and locked off) explicitly, since the old default no longer provides that.
2026-10-04 14:39:30 +13:00
Mark Greene 6fb14d5544 Fix: footer game version and CDN label
The footer showed the game's full version with its build number and labelled the environment as "CDN".

Show only the part of the game version before the underscore (e.g. 11.20), and rename the "CDN" label to "Branch" since it shows the environment/branch the site was built from.
2026-10-04 14:36:18 +13:00
Mark Greene 2e46ba79cf Fix: reload times show one decimal from a shared constant
The reload visualizer and the Firepower reload rows showed two decimals.

Add an exported `RELOAD_PRECISION` (1) in the reload visualizer and use it for the visualizer's times and placeholders and for the Firepower reload rows (per-shell reloads, reload and intra-clip).
2026-10-04 14:33:24 +13:00
Mark Greene 6153beced6 Fix: search redirecting early and missing full tank names
**Enter key**
- Enter redirected to the previous results' first tank while a search was still buffering, because the key handler captured a stale `searching` value.
- Enter on an empty field redirected to the first tank of the unfiltered list (Sheridan).
- The handler now reads live filter state and only acts when there is a settled search, matching the quick-link button.

**Full names in search**
- Search only knew short tank names, so queries like "super pershing" found nothing when the game stores a short form.
- Add an optional `name_full` to `TankDefinition`, filled from the game's full name when a short name exists, and index it (plus an accent-stripped copy) in `fetchTankNames` / `SEARCH_KEYS`.
- Displayed names are unchanged. Full names become searchable once the definitions are regenerated on the next build.
2026-10-04 14:24:02 +13:00
Mark Greene 90006dfd2a Fix: loading bar too close to tank title
The hero loading bar was offset below the title by half the font size plus a fixed 16px. The title is centered as a line box, so its descenders and heavy caps reach lower than half the font size, and the fixed gap didn't grow with the title.

Offset the bar by 0.75 of the font size instead, so the gap scales with the title.
2026-10-04 14:14:57 +13:00
Mark Greene 98b555fa7e Fix: gun depression visualizer ignoring turret mount tilt
The gun flexibility visualizer at the bottom of the Tankopedia Firepower section computed depression/elevation purely from the raw gun `pitch.min`/`pitch.max` values, ignoring `initial_turret_rotation.pitch` (the tank's baked-in turret mount tilt). Every other place that reports gun depression/elevation already accounts for this offset; the visualizer was the outlier.

On tanks with a level turret mount the offset is zero, so it was invisible almost everywhere. Minotauro's turret sits pitched 3° forward, which made the visualizer's min/max/pitch stats and wedge shape disagree with the Firepower stats directly above it (e.g. 7°/-18° instead of 10°/15°).

**Changes:**
- `GunFlexibilityVisualizer/index.tsx`: fold the turret's initial pitch offset into `minPitch`, `maxPitch` and the displayed `pitch` stat, and into the drawn limit shape, the pitch dot and the pointer mapping, so the dashed neutrality circle sits at the displayed 0°.
- `GunFlexibilityVisualizer/components/CanvasContent.tsx`: nest the gun mesh inside a turret group carrying the same static tilt as its base rotation, so the mini 3D preview's live drag-pitch composes on top of it, mirroring `useTankTransform.ts`.
2026-10-04 13:38:20 +13:00
Mark Greene 0bdb66742b Feature: Add Spall Liner toggle to Tankopedia model viewer
## Summary
- Add a Spall Liner toggle button to the Tankopedia model viewer, placed alongside the existing Calibrated Shells / Enhanced Armor buttons. It's only shown for tanks that can actually equip Spall Liner.
- The toggle reads/writes the same `Duel.protagonist.provisions` array as the Provisions tab, so both stay in sync automatically.
- If a provision slot is free, clicking equips Spall Liner immediately. If all slots are full, a popover shows icons with a shuffle arrow so you can pick which active provision to swap out in one step.
- Buttons use the same medium rounding as the consumable buttons on the tank page.
- When Spall Liner is equipped, the Dynamic Armor 3D viewer's click-damage tooltip now applies the same 20% HE damage reduction Spall Liner grants in-game.
- Refactored the hardcoded `-0.2` HE damage coefficient in `tankCharacteristics.ts` into a shared constant so the Compare tool and the 3D viewer use a single source of truth.

## Scope
This only affects the single-tank Tankopedia page. The Firepower stats table (the viewed tank's own outgoing gun damage) is intentionally untouched, since a defensive damage reduction would be semantically backwards there. The Dynamic Armor viewer's click tooltip is the only place a "damage taken by this tank" number exists, so that's where the reduction is wired in.
2026-10-04 13:27:34 +13:00
TrèsAbhi 3b0af110d2 Merge branch 'main' into peekabo-dpm 2026-10-02 15:22:06 -07:00
TrèsAbhi 6319d6fbd0 Merge pull request #269 from Hitjack007/equaliser-beta-flag 2026-10-02 15:05:56 -07:00
tresabhi a5321ebde3 game mode banner with string ids 2026-10-02 17:05:25 -05:00
tresabhi b7ac038ace Merge branch 'main' of https://github.com/blitzkit/blitzkit 2026-10-02 16:56:05 -05:00
tresabhi 1a2caf120b remove some dead code 2026-10-02 16:55:53 -05:00
TrèsAbhi 377bbabb02 Merge pull request #270 from Hitjack007/contact-shadows-fix 2026-10-02 14:55:05 -07:00
tresabhi f7db1280cf use useRef instead of useState 2026-10-02 16:34:12 -05:00
Mark Greene 0941c23a3c Fix dynamic armor overlay vanishing on re-render
PrimaryArmorSceneComponent rebuilt its ShaderMaterial every render with null uniforms that were only set once on mount. Create it once with useState instead.
2026-10-02 19:24:43 +13:00
Mark Greene 73975a5d83 Fix contact shadows growing across modes
Armor left gl.autoClear off after its frame, so ContactShadows accumulated onto an uncleared target. Restore it at the end of the frame.
2026-10-02 18:34:50 +13:00
Mark Greene 7f9ee1f907 Remove equalizer beta badge 2026-10-02 18:27:10 +13:00
tresabhi 238674bd96 groups 2026-10-01 20:11:12 -05:00
tresabhi af85fb74cb haha characteristics render! 2026-10-01 15:52:14 -05:00
tresabhi bd42cb44e4 equipment looks 2026-10-01 11:59:19 -05:00
tresabhi 1f767af0b5 angles 2026-09-30 20:59:18 -05:00