# Tactical FPS (fps.tactical) ## What it is for Plays a native tactical first-person match: movement, hitscan weapons, teams, bots, an economy, plant and defuse, and round transitions. It needs `runtime.core`, `game.engine`; installing it brings them in. ## Turn it on Install the kit in a project, then change a setting (the values shown are its defaults): ```text gripforge_gamekit_install { project_id: "gkp_…", id: "fps.tactical" } gripforge_gamekit_configure { project_id: "gkp_…", id: "fps.tactical", config: { "rules": {}, "siteRadius": 3 } } ``` ## First example This is the body of the passing test `presentation_getters_are_read_only_and_describe_the_match`; the helper functions it calls are defined at the top of the same test file. ```rust #[test] fn presentation_getters_are_read_only_and_describe_the_match() { let mut s = session(&[]); let before = call(&mut s, "fps.match", "simInfo", json!([])).unwrap(); let plan = call(&mut s, "fps.match", "presentation", json!([])).unwrap(); let view = call(&mut s, "fps.match", "view", json!([])).unwrap(); assert!(plan["map"]["boxes"].as_array().unwrap().len() > 0); assert_eq!(plan["local"], before["localActorId"]); assert!(view["grenades"].is_array()); assert_eq!( call(&mut s, "fps.match", "simInfo", json!([])).unwrap(), before ); } ``` ## Settings and defaults Descriptions come from the kit manifest and stay in English. | Setting | Type | Default | Range or values | Meaning | |---|---|---|---|---| | `rules` | object | `{}` | | Bounded FpsRules overrides on top of the kit base rules (round buy 18 s, duration 100 s, target 5, start money 4000; bots normal,… | | `siteRadius` | number | `3` | 0.5–20 | Radius of the bomb-site zones published for other kits, metres. | | `eventBuffer` | integer | `512` | 16–4096 | Match events kept between two drainEvents reads. | | `map` | string | `"sunport_docks"` | | | | `team` | string | `"T"` | `T`, `CT` | | | `presentation` | object | — | | | ## Services, events, variables - Service `fps.match`: - Service `movement.fps`: - Service `camera.first_person`: - Service `combat.hitscan`: - Service `animation.viewmodel`: - Service `grenades.tactical`: - Service `ai.tactical`: - Service `objective.bomb`: - Events emitted: - `fps.shot` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.damage` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.kill` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.round_start` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.round_end` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.bomb_plant` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.bomb_defuse` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.bomb_explode` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.match_start` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.match_end` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.respawn` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.objective_capture` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.loadout_selected` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.step` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.slide` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.vault` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.equip` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.fire_mode` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.reload_start` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.magazine_insert` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.reload_end` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.he` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.flash` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.smoke` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.stun` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - `fps.incendiary` (`type`, `actor`, `target`, `point`, `origin`, `normal`, `material`, `weapon`) - Variables: - `fps.phase` (string) — Round phase - `fps.mode` (string) — Match mode - `fps.round` (number) — Round - `player.health` (number) — Health - `player.respawn_remaining` (number) — Respawn countdown ## Hooks and modding - Hooks (a game or a mod can intercept them): - `fps.round.start` (fields a tap may change: `buy`) — A new round of a bomb match is about to start (the five seconds after a round are over; not the first round of a match). - `fps.round.end` (fields a tap may change: `team`) — A round of a bomb match is won, before the score, the money and fps.round_end: team is the winner (a tap may give the round to the other team). - `fps.match.end` (cancellable) — The match is about to end: the round target is reached (bomb mode, after fps.round_end), or the clock or the score limit of a deathmatch or domination match (team is empty on a draw). - `fps.bomb.plant` (fields a tap may change: `fuse`; cancellable) — An attacker finished planting the bomb at a site: fuse is the time before it explodes, seconds. - `fps.bomb.defuse` (cancellable) — A defender finished defusing the planted bomb (remaining: seconds left on the fuse). - Moddable settings: `rules`, `siteRadius`, `map`, `team`, `presentation` - Moddable collections: `tactical_maps` ## Engines Declared targets: `web`, `godot`, `unity`, `unreal`, `rust`. `gripforge kit api fps.tactical` lists the exact settings and services of your version. ## Versions Kit version 1.16.0.