Need Help or Found an Issue?
Overview
F-Class Simulator is an interactive 3D shooting simulator that recreates the experience of long-range F-Class competition shooting. Practice reading wind (mirage and flags), managing ballistics with spin effects, and making precise shots at standard F-Class distances from 300 to 1000 yards with correct targets and match-style scoring.
Controls
Spotting Scope (Bottom-Left):
- WASD Pan camera
- E/Q Zoom in/out
- Movement scales with FOV (slower when zoomed in)
- Use to read mirage, flags, and observe shot impacts
Rifle Scope (Bottom-Right):
- ↑↓←→ Aim (holdover)
- Shift+↑↓←→ Dial adjustments (1/8 MOA clicks, ±10 MOA limit)
- +/- Zoom in/out
- R Reset (zero dial, initial zoom, center on target)
- Dial position shown in lower right (elevation/windage in MOA)
- SFP: reticle fixed size, hash marks correspond to initial zoom only
- FFP: reticle scales with zoom, hash marks scale proportionally
Firing:
- Space Fire shot (disabled while target is down)
- With the Recoil parameter set, each shot kicks the aim up and settles to a small residual you must correct (hold or re-aim) before the next shot, set it to None to disable
- The Recoil, Show Bullet Trace, and Mirage parameters all take effect immediately, no restart needed
Buttons
- Start Game: Begin the match
- Pause/Resume: Pause/resume match timer and audio
- Restart: Restart match (with confirmation)
- Scorecard: View detailed per-match scores and parameters
- Go For Record: End sighters phase early
- Wind HUD: Toggle wind field visualization on/off
Remote Play (Beta)
Stream the running sim to someone on another computer who can play it, useful for letting a friend take a turn, or playing pair fire across the internet. Your PC does all the rendering; they see a live video and their keystrokes control your sim (with slight input lag).
To host:
- Check Host Remote Play in the config bar before starting (so the match clock doesn't run during setup)
- Copy the invite link and send it to the other player (any way you like)
- They open that link in a browser; when it connects, they can play. Press Start Game when you're both ready
- The viewer can open the Scorecard on their end. Signaling goes through the free PeerJS broker; video, audio, and controls are peer-to-peer once connected
Will it connect? Sometimes, there is no guarantee. Remote Play uses WebRTC with STUN only (no TURN relay). That means we only try a direct path between your machines. It often works on ordinary home Wi‑Fi, but success depends on both networks cooperating: strict NAT, corporate firewalls, VPNs, and cellular/mobile data frequently block or break the link, and we have nothing to fall back on. If it fails or drops, both players should try home Wi‑Fi with VPN off; if it still won't connect, Remote Play may simply not work on those networks.
Reconnecting: if the player drops, your match keeps running, they reopen the same invite link to try again.
Pair Fire: the host plays Player 1 (left) and the viewer plays Player 2 (right). Controls are active only for whoever's turn it is, and the viewer gets their own Go For Record button on their turn. If Player 2 Is set to an AI, the remote client plays the human side against the AI, firing on the human's turn just like a solo string‑fire match.
Audio & quality: game audio (gunshots, wind, scope clicks) streams too, the viewer clicks Enable sound to hear it (browsers block autoplay audio until then). Video sharpness depends on the host's render resolution (window size + graphics preset) and the connection bandwidth.
Graphics Quality
Presets:
- Low: Best performance - shadows disabled, reduced object counts, no antialiasing
- Medium: Balanced quality/performance - soft shadows, full object counts, antialiasing enabled
- High: Best quality - variance shadow maps, maximum detail, highest quality shadows
Settings Controlled:
- Shadow quality (resolution, type, enabled/disabled)
- Antialiasing (MSAA samples, renderer antialiasing)
- Pixel ratio (rendering resolution multiplier)
- Object counts (clouds, trees, mountains, flag segments)
Note: Changes require restarting the game to take effect. Settings are automatically saved and restored on page reload.
Wind Reading
Wind Markers (Flags or Socks):
- Choose flags or wind socks with the Wind Markers setting
- Read marker angle/lift for wind strength: higher = stronger wind
- Flag tip (pointed end) / sock tail shows wind direction
- Flags furl into a 3D shape as wind builds, read the curl and shaded belly to judge the head/tail (toward/away) component, not just left/right
- Sun is positioned at 3 o'clock (right side) so lit face vs. shadow face also indicates direction
- Watch multiple distances for wind shear and gradients
Mirage:
- Zoom in with spotting scope to read heat shimmer
- Light wind: vertical boil
- Moderate wind: leaning shimmer
- Strong wind: mostly horizontal flow
- Modeled as independent slabs of air along the line of sight, each reading its own local wind and running at its own speed
- Near-shooter columns appear large and soft; target-end columns appear small and crisp, same depth-of-field feel as a real spotting scope focused at the target
- Head wind doesn't drag mirage around (heat columns sliding along your line of sight don't shift their apparent position), but cross and vertical wind do
- Set intensity (or turn it off) with the Mirage parameter; takes effect immediately
Wind HUD (Optional):
- Toggle on/off with button during match
- Vertical strip at top-left showing downrange wind progression
- Bottom = shooter position (0 yards), Top = target position
- Color-coded: blue (calm) → red (strong, 7.5+ mph)
- White arrows show wind direction
- Samples 25 downrange positions × 10 crossrange positions
- Updates in real-time as wind changes
Match Structure
Mode (parameter bar): choose String Fire or Pair Fire.
String Fire:
- Configurable: number of matches, record shots per match, and minutes per match (defaults 3 / 20 / 20)
- Match 1: unlimited sighters; later matches: 2 sighters each
- Use "Go For Record" to end the sighters phase early
- A match ends at the record-shot count OR when time expires
- Acknowledge the match-complete dialog to start the next match
- Between matches the wind field is fast-forwarded to simulate the break, the preset (overall conditions) stays the same, but the wind shifts to a fresh state, so re-read it for each new match
- The combined score across all matches is the aggregate
Pair Fire:
- Two players share one rifle, one keyboard, and one target
- Player 1 (left) shoots first, then Player 2 (right), alternating
- Each player: 2 sighters, then record shots (configurable, default 10)
- "Go For Record" skips your remaining sighters and starts record shots
- Time/Turn limits each shot (or Unlimited); running out scores a zero for that shot
- After a shot, the target drops and comes back up with the score, then hands off to the next shooter after a short pause; you can't fire out of turn during the switch
- A HUD per shooter shows each player's clock, shots, and score, with the active shooter highlighted
- Each player keeps their own rifle and spotting scope (aim / dial / zoom) across turns
- Tiebreak: highest total, then most Xs, then sudden death (one alternating shot each; an X beats a non-X 10; repeats until broken)
Pair Fire vs AI: set Player 2 Is to an AI level to duel the computer on the shared target. You keep your sight picture during its turn and watch its shot land. The levels differ in how they read and manage the wind; all of them fire through the same rifle dispersion you do (no artificial wobble), and hold for both wind drift and crosswind jump. Each reads the flags as a lagged average (so it trails switches) and then chases: after each shot it folds a fraction of where the shot landed into a correction for the next, the way you work off the spotter, which over-corrects when the condition has already moved. Easy reads poorly and over-chases, swinging around the wind; Medium is decent; Hard reads accurately, weights the near flags more (they steer the bullet for the rest of its flight), makes small measured corrections, and waits for its condition, though a fast switch or a blown read still catches it now and then. The AI takes a realistic, skill-based pause before each shot (within any Time/Turn limit). Over Remote Play the remote client plays the human side against the AI.
Both modes: the rifle is disabled while the target is down (changing/marking).
Ballistic Parameters
Bullet:
- BC: Ballistic coefficient (aerodynamic efficiency, higher = less drift/drop)
- Drag Function: G7 (modern boat-tail) or G1 (flat-base/older)
- Diameter: Caliber in inches (affects scoring and spin)
- Weight: Bullet weight in grains (for stability factor and spin effects)
- Length: Bullet length in inches (for spin calculations)
Rifle:
- MV: Muzzle velocity in fps (critical for trajectory/time-of-flight)
- MV σ: Velocity standard deviation in fps (lower = more consistent)
- Accuracy: Rifle+shooter precision in MOA (1 MOA ≈ 1" at 100 yards)
- Twist: Barrel twist rate (e.g., 8 for 1:8 twist, calculates spin rate)
- Reticle: SFP (fixed size) or FFP (scales with zoom)
Spin Effects (When Enabled):
- Spin drift (Litz formula) is zeroed during setup
- Crosswind jump applied as a vertical impulse when the wind the bullet sees changes
HUD Display (Top-Right)
String fire mode shows a single panel:
- Match: Current match (e.g. 1/3)
- Timer: Remaining time (minutes:seconds)
- Target: Your target number
- Sighters: Count N/∞ (Match 1) or N/2 (later matches), only shown during sighters
- Shots: Record shots fired / total (turns green when complete)
- Score: Total score and X-count for current match
- Last Shot: Score value (e.g., "X" or "9")
- MV: Muzzle velocity for last shot (fps)
- Impact V: Impact velocity for last shot (fps)
Pair Fire mode shows one compact panel per shooter (Player 1 left, Player 2 right) with their turn clock, shot count, score, and last shot. The active shooter's panel is highlighted.
Scorecard
- Click "Scorecard" button to view detailed match information
- Shows all match parameters (distance, target, wind, ballistics, rifle specs)
- String Fire: breakdown per match (sighters + record shots) with per-match and aggregate totals
- Pair Fire: split per shooter with each player's sighters, record shots, total, and X-count; the winner is highlighted
- Each section has an expandable "Target" diagram showing the impacts on a scaled target (yellow = sighters, red = record shots)
- Available anytime (shows parameters even before first shot)
Per-Shot Analytics: click any scored shot cell to open a detail view for that shot:
- Point of Aim vs Impact target face, green crosshair = your aim (including dial), red dot = the actual impact, with a connector showing the miss
- Trajectory vs Crosswind plot, distance runs up the Y axis (shooter at the bottom, target center at the top); the bullet's lateral path (orange, with the axis spanning the target paper width) and the crosswind it flew through (cyan, on a fixed ±20 mph axis) are overlaid, with a straight dashed line marking the point of aim, so you can see the wind walk the bullet off the line of departure. The scoring-ring borders (X, 10, 9…) are ticked along the top edge so you can read which ring the path arrives in. Both axes stay constant shot to shot; a shot that drifts off the paper clips past the edge
- Stats: scope dial, aim + dial, and impact offset (in MOA), plus the muzzle and impact velocity for the shot (fps)
- Close the detail with its × button, or close the whole card with the × in the header
Technical Details
Ballistics Engine:
- WebAssembly-powered physics simulation (runs in browser)
- RK2 integration of a modified point-mass trajectory
- Iterative zeroing in calm wind conditions
- Spin effects: Litz spin drift (zeroed at sight-in) and crosswind aerodynamic jump
Wind Simulation:
- 2D curl-noise field with multiple octaves and advection
- RMS-normalized for consistent magnitude across presets
- Flags, mirage, and wind HUD sample same unified field
- Mirage is rendered as independent depth slabs along the line of sight; each slab samples wind locally and drifts independently
Known Limitations
This list is not exhaustive. Additional limitations, errors, or inaccuracies may exist.
Entertainment/Educational Simulation: This is a shooting simulation game. While it uses physics-based ballistic calculations, it is designed for entertainment and learning, not for generating real-world firing data.
Ballistics Model: Uses a modified point-mass trajectory with spin drift and crosswind jump based on Bryan Litz's empirical formulas. These are widely-used approximations and may differ from real-world behavior. Because the wind field varies down the range, the crosswind jump is applied continuously as the wind the bullet sees changes. A uniform wind reproduces Litz's published muzzle figure; applying it to downrange wind changes is our own engineering extension, not a published or experimentally validated result.
Wind Model: 2D curl-noise field provides plausible patterns for gameplay but does not model terrain effects, thermals, or turbulence.
Mirage Model: Simplified heat shimmer effect based on wind and distance. Real mirage behavior is more complex and variable.
Full Disclaimers: See the
Terms of Service for complete information.
Tips for Success
- Start with calm wind conditions to learn the basics
- Use the spotting scope to observe flags, mirage, and shot impacts
- Compare mirage and flags at different distances for wind gradients
- Watch the red shot marker to see your last impact
- Make small adjustments to your aim point (1/8 MOA per arrow keypress)
- Pay attention to wind flag behavior along the entire range
- Higher BC bullets drift less in the wind
- Lower MV standard deviation = more consistent impacts
- Practice at shorter distances before attempting 1000 yards