@adatechnology/game-weapons-three 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../../game-weapons/src/data/calibers.json","../../game-weapons/src/data/weapons.json","../../game-weapons/src/locale.ts","../../game-weapons/src/rng.ts","../../game-weapons/src/weapon.ts","../../game-weapons/src/arsenal.ts","../src/audio.ts","../src/props.ts","../src/fx.ts","../src/area.ts"],"sourcesContent":["/**\n * @adatechnology/game-weapons-three: the three.js side of @adatechnology/game-weapons. Low-poly weapon models, the weapon in the hands with\n * fire and reload motion, ejected casings and dropped magazines, synthesized sounds, and the weapons test area as a `TestableModule`\n * (any host of @adatechnology/game-contracts, like the test room, loads it with `loadModule`).\n */\nexport { createWeaponsTestModule, weaponsLayout, WEAPON_ITEM_PREFIX, COUNTER_ITEM_ID } from './area'\nexport type { WeaponsTestModuleOptions } from './area'\nexport { createWeaponFx } from './fx'\nexport type { WeaponFx, WeaponFxOptions } from './fx'\nexport { createWeaponAudio } from './audio'\nexport type { WeaponAudio } from './audio'\nexport { buildWeaponModel, buildProp, weaponProp, BODY_ACTIONS } from './props'\nexport type { WeaponProp } from './props'\n","[\n {\n \"id\": \"22lr\",\n \"label\": \".22 LR\",\n \"diameter\": 5.7,\n \"bulletGrams\": 2.6,\n \"muzzleSpeed\": 350,\n \"dragPer100m\": 0.15,\n \"kind\": \"rimfire\"\n },\n {\n \"id\": \"9x19\",\n \"label\": \"9×19 mm\",\n \"diameter\": 9,\n \"bulletGrams\": 7.5,\n \"muzzleSpeed\": 365,\n \"dragPer100m\": 0.2,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"38spl\",\n \"label\": \".38 Special\",\n \"diameter\": 9.1,\n \"bulletGrams\": 10.2,\n \"muzzleSpeed\": 247,\n \"dragPer100m\": 0.2,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"357mag\",\n \"label\": \".357 Magnum\",\n \"diameter\": 9.1,\n \"bulletGrams\": 10.2,\n \"muzzleSpeed\": 396,\n \"dragPer100m\": 0.18,\n \"kind\": \"hp\"\n },\n {\n \"id\": \"40sw\",\n \"label\": \".40 S&W\",\n \"diameter\": 10.2,\n \"bulletGrams\": 11.7,\n \"muzzleSpeed\": 310,\n \"dragPer100m\": 0.2,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"45acp\",\n \"label\": \".45 ACP\",\n \"diameter\": 11.5,\n \"bulletGrams\": 14.9,\n \"muzzleSpeed\": 254,\n \"dragPer100m\": 0.2,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"380acp\",\n \"label\": \".380 ACP\",\n \"diameter\": 9,\n \"bulletGrams\": 6.2,\n \"muzzleSpeed\": 295,\n \"dragPer100m\": 0.22,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"5_56x45\",\n \"label\": \"5.56×45 mm\",\n \"diameter\": 5.7,\n \"bulletGrams\": 4,\n \"muzzleSpeed\": 935,\n \"dragPer100m\": 0.1,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"7_62x39\",\n \"label\": \"7.62×39 mm\",\n \"diameter\": 7.9,\n \"bulletGrams\": 8,\n \"muzzleSpeed\": 725,\n \"dragPer100m\": 0.1,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"7_62x51\",\n \"label\": \"7.62×51 mm (.308)\",\n \"diameter\": 7.8,\n \"bulletGrams\": 9.7,\n \"muzzleSpeed\": 850,\n \"dragPer100m\": 0.08,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"338lapua\",\n \"label\": \".338 Lapua Magnum\",\n \"diameter\": 8.6,\n \"bulletGrams\": 16.2,\n \"muzzleSpeed\": 903,\n \"dragPer100m\": 0.06,\n \"kind\": \"fmj\"\n },\n {\n \"id\": \"50bmg\",\n \"label\": \".50 BMG\",\n \"diameter\": 12.7,\n \"bulletGrams\": 42,\n \"muzzleSpeed\": 925,\n \"dragPer100m\": 0.05,\n \"kind\": \"ap\"\n },\n {\n \"id\": \"12ga_00buck\",\n \"label\": \"12 ga 00 buck\",\n \"diameter\": 8.4,\n \"bulletGrams\": 3.5,\n \"muzzleSpeed\": 414,\n \"pellets\": 9,\n \"dragPer100m\": 0.45,\n \"kind\": \"buck\"\n },\n {\n \"id\": \"12ga_slug\",\n \"label\": \"12 ga slug\",\n \"diameter\": 18.5,\n \"bulletGrams\": 28,\n \"muzzleSpeed\": 463,\n \"dragPer100m\": 0.3,\n \"kind\": \"slug\"\n },\n {\n \"id\": \"12ga_birdshot\",\n \"label\": \"12 ga birdshot\",\n \"diameter\": 2.4,\n \"bulletGrams\": 0.2,\n \"muzzleSpeed\": 400,\n \"pellets\": 90,\n \"dragPer100m\": 0.6,\n \"kind\": \"birdshot\"\n },\n {\n \"id\": \"20ga_buck\",\n \"label\": \"20 ga buck\",\n \"diameter\": 6.9,\n \"bulletGrams\": 1.3,\n \"muzzleSpeed\": 400,\n \"pellets\": 20,\n \"dragPer100m\": 0.5,\n \"kind\": \"buck\"\n },\n {\n \"id\": \"arrow\",\n \"label\": \"Arrow (compound bow)\",\n \"diameter\": 7,\n \"bulletGrams\": 25,\n \"muzzleSpeed\": 90,\n \"dragPer100m\": 0.12,\n \"kind\": \"arrow\"\n },\n {\n \"id\": \"crossbow_bolt\",\n \"label\": \"Crossbow bolt\",\n \"diameter\": 8,\n \"bulletGrams\": 20,\n \"muzzleSpeed\": 122,\n \"dragPer100m\": 0.12,\n \"kind\": \"bolt\"\n }\n]\n","[\n {\n \"id\": \"hand\",\n \"name\": \"Hand\",\n \"category\": \"hand\",\n \"action\": {\n \"kind\": \"hand\",\n \"reach\": 2\n },\n \"mass\": 0,\n \"tags\": [\n \"grab\"\n ]\n },\n {\n \"id\": \"kick\",\n \"name\": \"Kick\",\n \"category\": \"melee_blunt\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"blunt\",\n \"energy\": 250,\n \"radius\": 0.08,\n \"reach\": 1.1,\n \"rpm\": 60,\n \"noise\": 8\n },\n \"mass\": 0\n },\n {\n \"id\": \"shove\",\n \"name\": \"Shove\",\n \"category\": \"melee_blunt\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"blunt\",\n \"energy\": 80,\n \"radius\": 0.1,\n \"reach\": 1.5,\n \"rpm\": 90,\n \"noise\": 5\n },\n \"mass\": 0\n },\n {\n \"id\": \"pistol_9mm\",\n \"name\": \"9 mm service pistol\",\n \"category\": \"pistol\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"9x19\",\n \"rpm\": 300,\n \"modes\": [\n \"semi\"\n ],\n \"magazine\": 15,\n \"reload\": 2,\n \"barrel\": 1,\n \"spreadDeg\": 1,\n \"bloomDeg\": 0.6,\n \"recoveryDegPerS\": 4,\n \"recoil\": [\n 1.2,\n 0.4\n ],\n \"range\": 50,\n \"noise\": 150\n },\n \"mass\": 0.9,\n \"tags\": [\n \"sidearm\"\n ]\n },\n {\n \"id\": \"pistol_45\",\n \"name\": \".45 ACP pistol\",\n \"category\": \"pistol\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"45acp\",\n \"rpm\": 280,\n \"modes\": [\n \"semi\"\n ],\n \"magazine\": 8,\n \"reload\": 2.2,\n \"barrel\": 1,\n \"spreadDeg\": 1.1,\n \"bloomDeg\": 0.8,\n \"recoveryDegPerS\": 4,\n \"recoil\": [\n 1.8,\n 0.6\n ],\n \"range\": 50,\n \"noise\": 160\n },\n \"mass\": 1.1,\n \"tags\": [\n \"sidearm\"\n ]\n },\n {\n \"id\": \"pistol_22\",\n \"name\": \".22 LR pistol\",\n \"category\": \"pistol\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"22lr\",\n \"rpm\": 360,\n \"modes\": [\n \"semi\"\n ],\n \"magazine\": 10,\n \"reload\": 1.8,\n \"barrel\": 1,\n \"spreadDeg\": 0.9,\n \"bloomDeg\": 0.3,\n \"recoveryDegPerS\": 5,\n \"recoil\": [\n 0.5,\n 0.2\n ],\n \"range\": 40,\n \"noise\": 90\n },\n \"mass\": 0.7,\n \"tags\": [\n \"sidearm\"\n ]\n },\n {\n \"id\": \"revolver_357\",\n \"name\": \".357 Magnum revolver\",\n \"category\": \"revolver\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"357mag\",\n \"rpm\": 150,\n \"modes\": [\n \"single\"\n ],\n \"magazine\": 6,\n \"reload\": 4,\n \"barrel\": 1.05,\n \"spreadDeg\": 0.8,\n \"bloomDeg\": 1,\n \"recoveryDegPerS\": 3,\n \"recoil\": [\n 3,\n 0.9\n ],\n \"range\": 60,\n \"noise\": 220\n },\n \"mass\": 1.2,\n \"tags\": [\n \"sidearm\"\n ]\n },\n {\n \"id\": \"revolver_38\",\n \"name\": \".38 Special revolver\",\n \"category\": \"revolver\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"38spl\",\n \"rpm\": 160,\n \"modes\": [\n \"single\"\n ],\n \"magazine\": 6,\n \"reload\": 3.8,\n \"barrel\": 0.95,\n \"spreadDeg\": 0.9,\n \"bloomDeg\": 0.7,\n \"recoveryDegPerS\": 3.5,\n \"recoil\": [\n 1.6,\n 0.5\n ],\n \"range\": 45,\n \"noise\": 170\n },\n \"mass\": 0.9,\n \"tags\": [\n \"sidearm\"\n ]\n },\n {\n \"id\": \"smg_9mm\",\n \"name\": \"9 mm submachine gun\",\n \"category\": \"smg\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"9x19\",\n \"rpm\": 800,\n \"modes\": [\n \"auto\",\n \"burst\",\n \"semi\"\n ],\n \"burst\": 3,\n \"magazine\": 30,\n \"reload\": 2.4,\n \"barrel\": 1.1,\n \"spreadDeg\": 1.5,\n \"bloomDeg\": 0.35,\n \"recoveryDegPerS\": 6,\n \"recoil\": [\n 0.9,\n 0.5\n ],\n \"range\": 80,\n \"noise\": 180\n },\n \"mass\": 2.6,\n \"tags\": [\n \"automatic\"\n ]\n },\n {\n \"id\": \"carbine_22\",\n \"name\": \".22 LR carbine\",\n \"category\": \"carbine\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"22lr\",\n \"rpm\": 300,\n \"modes\": [\n \"semi\"\n ],\n \"magazine\": 10,\n \"reload\": 2.2,\n \"barrel\": 1.4,\n \"spreadDeg\": 0.5,\n \"bloomDeg\": 0.15,\n \"recoveryDegPerS\": 5,\n \"recoil\": [\n 0.4,\n 0.15\n ],\n \"range\": 80,\n \"noise\": 100\n },\n \"mass\": 2.4,\n \"tags\": [\n \"small_game\"\n ]\n },\n {\n \"id\": \"rifle_5_56\",\n \"name\": \"5.56 mm assault rifle\",\n \"category\": \"rifle\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"5_56x45\",\n \"rpm\": 750,\n \"modes\": [\n \"auto\",\n \"burst\",\n \"semi\"\n ],\n \"burst\": 3,\n \"magazine\": 30,\n \"reload\": 2.5,\n \"barrel\": 1,\n \"spreadDeg\": 0.6,\n \"bloomDeg\": 0.25,\n \"recoveryDegPerS\": 5,\n \"recoil\": [\n 1,\n 0.6\n ],\n \"range\": 400,\n \"noise\": 300\n },\n \"mass\": 3.4,\n \"tags\": [\n \"automatic\"\n ]\n },\n {\n \"id\": \"rifle_7_62x39\",\n \"name\": \"7.62×39 mm assault rifle\",\n \"category\": \"rifle\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"7_62x39\",\n \"rpm\": 600,\n \"modes\": [\n \"auto\",\n \"semi\"\n ],\n \"magazine\": 30,\n \"reload\": 2.8,\n \"barrel\": 1,\n \"spreadDeg\": 0.8,\n \"bloomDeg\": 0.35,\n \"recoveryDegPerS\": 4.5,\n \"recoil\": [\n 1.5,\n 0.8\n ],\n \"range\": 350,\n \"noise\": 320\n },\n \"mass\": 3.8,\n \"tags\": [\n \"automatic\"\n ]\n },\n {\n \"id\": \"rifle_bolt_308\",\n \"name\": \".308 bolt-action rifle\",\n \"category\": \"rifle\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"7_62x51\",\n \"rpm\": 40,\n \"modes\": [\n \"bolt\"\n ],\n \"magazine\": 5,\n \"reload\": 3.5,\n \"barrel\": 1.05,\n \"spreadDeg\": 0.25,\n \"bloomDeg\": 0.3,\n \"recoveryDegPerS\": 3,\n \"recoil\": [\n 3,\n 0.5\n ],\n \"range\": 800,\n \"noise\": 350\n },\n \"mass\": 4,\n \"tags\": [\n \"hunting\"\n ]\n },\n {\n \"id\": \"sniper_338\",\n \"name\": \".338 Lapua sniper rifle\",\n \"category\": \"sniper\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"338lapua\",\n \"rpm\": 35,\n \"modes\": [\n \"bolt\"\n ],\n \"magazine\": 5,\n \"reload\": 4,\n \"barrel\": 1.05,\n \"spreadDeg\": 0.1,\n \"bloomDeg\": 0.3,\n \"recoveryDegPerS\": 2.5,\n \"recoil\": [\n 4.5,\n 0.7\n ],\n \"range\": 1500,\n \"noise\": 450\n },\n \"mass\": 6.5,\n \"tags\": [\n \"long_range\"\n ]\n },\n {\n \"id\": \"anti_materiel_50\",\n \"name\": \".50 BMG anti-materiel rifle\",\n \"category\": \"sniper\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"50bmg\",\n \"rpm\": 30,\n \"modes\": [\n \"semi\"\n ],\n \"magazine\": 10,\n \"reload\": 4.5,\n \"barrel\": 1.05,\n \"spreadDeg\": 0.15,\n \"bloomDeg\": 0.5,\n \"recoveryDegPerS\": 2,\n \"recoil\": [\n 7,\n 1.2\n ],\n \"range\": 1800,\n \"noise\": 600\n },\n \"mass\": 12.5,\n \"tags\": [\n \"long_range\",\n \"heavy\"\n ]\n },\n {\n \"id\": \"shotgun_pump_12\",\n \"name\": \"12 gauge pump-action shotgun\",\n \"category\": \"shotgun\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"12ga_00buck\",\n \"rpm\": 60,\n \"modes\": [\n \"pump\"\n ],\n \"magazine\": 6,\n \"reload\": 0.6,\n \"perRound\": true,\n \"barrel\": 1,\n \"spreadDeg\": 1,\n \"bloomDeg\": 0.5,\n \"recoveryDegPerS\": 3,\n \"pelletSpreadDeg\": 3,\n \"recoil\": [\n 4,\n 1\n ],\n \"range\": 40,\n \"noise\": 400\n },\n \"mass\": 3.2,\n \"tags\": [\n \"shotgun\"\n ]\n },\n {\n \"id\": \"shotgun_double_12\",\n \"name\": \"12 gauge double-barrel shotgun\",\n \"category\": \"shotgun\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"12ga_00buck\",\n \"rpm\": 120,\n \"modes\": [\n \"break\"\n ],\n \"magazine\": 2,\n \"reload\": 3.5,\n \"barrel\": 1,\n \"spreadDeg\": 1,\n \"bloomDeg\": 0.5,\n \"recoveryDegPerS\": 3,\n \"pelletSpreadDeg\": 3,\n \"recoil\": [\n 4.5,\n 1.2\n ],\n \"range\": 35,\n \"noise\": 400\n },\n \"mass\": 3,\n \"tags\": [\n \"shotgun\"\n ]\n },\n {\n \"id\": \"shotgun_semi_12\",\n \"name\": \"12 gauge semi-automatic shotgun\",\n \"category\": \"shotgun\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"12ga_00buck\",\n \"rpm\": 180,\n \"modes\": [\n \"semi\"\n ],\n \"magazine\": 5,\n \"reload\": 0.7,\n \"perRound\": true,\n \"barrel\": 1,\n \"spreadDeg\": 1,\n \"bloomDeg\": 0.5,\n \"recoveryDegPerS\": 3,\n \"pelletSpreadDeg\": 3,\n \"recoil\": [\n 3.4,\n 1\n ],\n \"range\": 40,\n \"noise\": 400\n },\n \"mass\": 3.4,\n \"tags\": [\n \"shotgun\"\n ]\n },\n {\n \"id\": \"bow_compound\",\n \"name\": \"Compound bow\",\n \"category\": \"bow\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"arrow\",\n \"rpm\": 20,\n \"modes\": [\n \"single\"\n ],\n \"magazine\": 1,\n \"reload\": 1.5,\n \"barrel\": 1,\n \"spreadDeg\": 0.4,\n \"bloomDeg\": 0.4,\n \"recoveryDegPerS\": 2,\n \"recoil\": [\n 0.3,\n 0.1\n ],\n \"range\": 60,\n \"noise\": 20\n },\n \"mass\": 1.8,\n \"tags\": [\n \"silent\"\n ]\n },\n {\n \"id\": \"crossbow\",\n \"name\": \"Crossbow\",\n \"category\": \"crossbow\",\n \"action\": {\n \"kind\": \"firearm\",\n \"caliber\": \"crossbow_bolt\",\n \"rpm\": 8,\n \"modes\": [\n \"single\"\n ],\n \"magazine\": 1,\n \"reload\": 4,\n \"barrel\": 1,\n \"spreadDeg\": 0.3,\n \"bloomDeg\": 0.3,\n \"recoveryDegPerS\": 2,\n \"recoil\": [\n 0.5,\n 0.1\n ],\n \"range\": 70,\n \"noise\": 25\n },\n \"mass\": 3,\n \"tags\": [\n \"silent\"\n ]\n },\n {\n \"id\": \"hammer\",\n \"name\": \"Hammer\",\n \"category\": \"melee_blunt\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"blunt\",\n \"energy\": 60,\n \"radius\": 0.08,\n \"reach\": 0.7,\n \"rpm\": 70,\n \"noise\": 6\n },\n \"mass\": 1\n },\n {\n \"id\": \"sledgehammer\",\n \"name\": \"Sledgehammer\",\n \"category\": \"melee_blunt\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"blunt\",\n \"energy\": 300,\n \"radius\": 0.15,\n \"reach\": 1.1,\n \"rpm\": 30,\n \"noise\": 8\n },\n \"mass\": 5.5,\n \"tags\": [\n \"heavy\"\n ]\n },\n {\n \"id\": \"baseball_bat\",\n \"name\": \"Baseball bat\",\n \"category\": \"melee_blunt\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"blunt\",\n \"energy\": 150,\n \"radius\": 0.1,\n \"reach\": 1,\n \"rpm\": 60,\n \"noise\": 7\n },\n \"mass\": 0.9\n },\n {\n \"id\": \"crowbar\",\n \"name\": \"Crowbar\",\n \"category\": \"melee_blunt\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"blunt\",\n \"energy\": 120,\n \"radius\": 0.08,\n \"reach\": 0.9,\n \"rpm\": 60,\n \"noise\": 7\n },\n \"mass\": 2,\n \"tags\": [\n \"pry\"\n ]\n },\n {\n \"id\": \"machete\",\n \"name\": \"Machete\",\n \"category\": \"melee_blade\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"slash\",\n \"energy\": 140,\n \"radius\": 0.06,\n \"reach\": 0.8,\n \"rpm\": 80,\n \"noise\": 6\n },\n \"mass\": 0.8\n },\n {\n \"id\": \"axe\",\n \"name\": \"Axe\",\n \"category\": \"melee_blade\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"slash\",\n \"energy\": 250,\n \"radius\": 0.08,\n \"reach\": 0.9,\n \"rpm\": 45,\n \"noise\": 8\n },\n \"mass\": 1.6\n },\n {\n \"id\": \"knife\",\n \"name\": \"Knife\",\n \"category\": \"melee_blade\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"slash\",\n \"energy\": 40,\n \"radius\": 0.03,\n \"reach\": 0.4,\n \"rpm\": 100,\n \"noise\": 5\n },\n \"mass\": 0.2\n },\n {\n \"id\": \"fists\",\n \"name\": \"Fists\",\n \"category\": \"melee_blunt\",\n \"action\": {\n \"kind\": \"melee\",\n \"damage\": \"blunt\",\n \"energy\": 25,\n \"radius\": 0.1,\n \"reach\": 0.6,\n \"rpm\": 120,\n \"noise\": 5\n },\n \"mass\": 0\n },\n {\n \"id\": \"lighter\",\n \"name\": \"Lighter\",\n \"category\": \"flame\",\n \"action\": {\n \"kind\": \"flame\",\n \"temperature\": 400,\n \"radius\": 0.03,\n \"range\": 0.15,\n \"fuelPerSecond\": 0.02,\n \"fuel\": 60,\n \"noise\": 0\n },\n \"mass\": 0.05,\n \"tags\": [\n \"fire\"\n ]\n },\n {\n \"id\": \"flamethrower\",\n \"name\": \"Flamethrower\",\n \"category\": \"flame\",\n \"action\": {\n \"kind\": \"flame\",\n \"temperature\": 900,\n \"radius\": 0.6,\n \"range\": 6,\n \"fuelPerSecond\": 1,\n \"fuel\": 20,\n \"cone\": true,\n \"noise\": 20\n },\n \"mass\": 15,\n \"tags\": [\n \"fire\"\n ]\n },\n {\n \"id\": \"molotov\",\n \"name\": \"Molotov cocktail\",\n \"category\": \"throwable\",\n \"action\": {\n \"kind\": \"throwable\",\n \"energy\": 500,\n \"radius\": 1.5,\n \"fuse\": 0,\n \"throwSpeed\": 12,\n \"fire\": {\n \"temperature\": 700,\n \"radius\": 1.5,\n \"seconds\": 12\n },\n \"noise\": 60\n },\n \"mass\": 0.8,\n \"tags\": [\n \"fire\",\n \"improvised\"\n ]\n },\n {\n \"id\": \"cutting_torch\",\n \"name\": \"Oxy-fuel cutting torch\",\n \"category\": \"heat\",\n \"action\": {\n \"kind\": \"heat\",\n \"temperature\": 3000,\n \"radius\": 0.02,\n \"range\": 0.25,\n \"fuelPerSecond\": 0.05,\n \"fuel\": 30,\n \"noise\": 15\n },\n \"mass\": 4,\n \"tags\": [\n \"fire\",\n \"cutting\"\n ]\n },\n {\n \"id\": \"blowtorch\",\n \"name\": \"Blowtorch\",\n \"category\": \"heat\",\n \"action\": {\n \"kind\": \"heat\",\n \"temperature\": 1300,\n \"radius\": 0.04,\n \"range\": 0.3,\n \"fuelPerSecond\": 0.04,\n \"fuel\": 30,\n \"noise\": 10\n },\n \"mass\": 0.6,\n \"tags\": [\n \"fire\"\n ]\n },\n {\n \"id\": \"frag_grenade\",\n \"name\": \"Fragmentation grenade\",\n \"category\": \"throwable\",\n \"action\": {\n \"kind\": \"throwable\",\n \"energy\": 200000,\n \"radius\": 6,\n \"fuse\": 4,\n \"throwSpeed\": 15,\n \"noise\": 400\n },\n \"mass\": 0.45,\n \"tags\": [\n \"explosive\"\n ]\n },\n {\n \"id\": \"pipe_bomb\",\n \"name\": \"Pipe bomb\",\n \"category\": \"throwable\",\n \"action\": {\n \"kind\": \"throwable\",\n \"energy\": 100000,\n \"radius\": 4,\n \"fuse\": 3,\n \"throwSpeed\": 13,\n \"noise\": 350\n },\n \"mass\": 0.7,\n \"tags\": [\n \"explosive\",\n \"improvised\"\n ]\n },\n {\n \"id\": \"screwdriver\",\n \"name\": \"Screwdriver\",\n \"category\": \"tool\",\n \"action\": {\n \"kind\": \"tool\",\n \"tool\": \"screwdriver\",\n \"reach\": 0.5,\n \"noise\": 5\n },\n \"mass\": 0.15\n },\n {\n \"id\": \"wrench\",\n \"name\": \"Wrench\",\n \"category\": \"tool\",\n \"action\": {\n \"kind\": \"tool\",\n \"tool\": \"wrench\",\n \"reach\": 0.6,\n \"noise\": 6\n },\n \"mass\": 0.5\n },\n {\n \"id\": \"pry_bar\",\n \"name\": \"Pry bar\",\n \"category\": \"tool\",\n \"action\": {\n \"kind\": \"tool\",\n \"tool\": \"pry_bar\",\n \"reach\": 0.8,\n \"noise\": 8\n },\n \"mass\": 0.8\n },\n {\n \"id\": \"hacksaw\",\n \"name\": \"Hacksaw\",\n \"category\": \"tool\",\n \"action\": {\n \"kind\": \"tool\",\n \"tool\": \"saw\",\n \"reach\": 0.7,\n \"noise\": 10\n },\n \"mass\": 0.6\n },\n {\n \"id\": \"utility_knife\",\n \"name\": \"Utility knife\",\n \"category\": \"tool\",\n \"action\": {\n \"kind\": \"tool\",\n \"tool\": \"knife\",\n \"reach\": 0.3,\n \"noise\": 3\n },\n \"mass\": 0.1\n },\n {\n \"id\": \"claw_hammer\",\n \"name\": \"Claw hammer\",\n \"category\": \"tool\",\n \"action\": {\n \"kind\": \"tool\",\n \"tool\": \"hammer\",\n \"reach\": 0.5,\n \"noise\": 8\n },\n \"mass\": 0.7\n },\n {\n \"id\": \"extinguisher\",\n \"name\": \"Fire extinguisher\",\n \"category\": \"extinguisher\",\n \"action\": {\n \"kind\": \"extinguisher\",\n \"range\": 4,\n \"coolC\": 300,\n \"charge\": 12,\n \"noise\": 25\n },\n \"mass\": 5,\n \"tags\": [\n \"safety\"\n ]\n }\n]\n","/** Locales shipped with the package. Unknown locales fall back to `en`. */\nexport type WeaponsLocale = 'en' | 'pt-BR'\n\nexport interface WeaponsStrings {\n /** Display name of each weapon id. */\n weapons: Record<string, string>\n /** Display name of each fire mode. */\n modes: Record<string, string>\n /** Display name of each weapon category. */\n categories: Record<string, string>\n}\n\nconst modesEn = { single: 'single action', semi: 'semi-automatic', burst: 'burst', auto: 'automatic', pump: 'pump action', bolt: 'bolt action', lever: 'lever action', break: 'break action' }\nconst categoriesEn = {\n pistol: 'pistol', revolver: 'revolver', smg: 'submachine gun', rifle: 'rifle', carbine: 'carbine', sniper: 'sniper rifle', shotgun: 'shotgun',\n bow: 'bow', crossbow: 'crossbow', melee_blunt: 'blunt melee', melee_blade: 'bladed melee', flame: 'flame', heat: 'heat', throwable: 'throwable',\n tool: 'tool', extinguisher: 'extinguisher', hand: 'hand',\n}\n\nexport const locales: Record<WeaponsLocale, WeaponsStrings> = {\n en: {\n weapons: {\n hand: 'Hand', kick: 'Kick', shove: 'Shove', pistol_9mm: '9 mm service pistol', pistol_45: '.45 ACP pistol', pistol_22: '.22 LR pistol', revolver_357: '.357 Magnum revolver',\n revolver_38: '.38 Special revolver', smg_9mm: '9 mm submachine gun', carbine_22: '.22 LR carbine', rifle_5_56: '5.56 mm assault rifle',\n rifle_7_62x39: '7.62×39 mm assault rifle', rifle_bolt_308: '.308 bolt-action rifle', sniper_338: '.338 Lapua sniper rifle',\n anti_materiel_50: '.50 BMG anti-materiel rifle', shotgun_pump_12: '12 gauge pump-action shotgun', shotgun_double_12: '12 gauge double-barrel shotgun',\n shotgun_semi_12: '12 gauge semi-automatic shotgun', bow_compound: 'Compound bow', crossbow: 'Crossbow', hammer: 'Hammer', sledgehammer: 'Sledgehammer',\n baseball_bat: 'Baseball bat', crowbar: 'Crowbar', machete: 'Machete', axe: 'Axe', knife: 'Knife', fists: 'Fists', lighter: 'Lighter',\n flamethrower: 'Flamethrower', molotov: 'Molotov cocktail', cutting_torch: 'Oxy-fuel cutting torch', blowtorch: 'Blowtorch',\n frag_grenade: 'Fragmentation grenade', pipe_bomb: 'Pipe bomb', screwdriver: 'Screwdriver', wrench: 'Wrench', pry_bar: 'Pry bar', hacksaw: 'Hacksaw',\n utility_knife: 'Utility knife', claw_hammer: 'Claw hammer', extinguisher: 'Fire extinguisher',\n },\n modes: modesEn,\n categories: categoriesEn,\n },\n 'pt-BR': {\n weapons: {\n hand: 'mão', kick: 'chute', shove: 'empurrão', pistol_9mm: 'pistola 9 mm', pistol_45: 'pistola .45', pistol_22: 'pistola .22', revolver_357: 'revólver .357', revolver_38: 'revólver .38',\n smg_9mm: 'submetralhadora 9 mm', carbine_22: 'carabina .22', rifle_5_56: 'fuzil 5,56', rifle_7_62x39: 'fuzil 7,62×39', rifle_bolt_308: 'fuzil de ferrolho .308',\n sniper_338: 'fuzil de precisão .338', anti_materiel_50: 'fuzil antimaterial .50', shotgun_pump_12: 'espingarda de repetição calibre 12',\n shotgun_double_12: 'espingarda de dois canos calibre 12', shotgun_semi_12: 'espingarda semiautomática calibre 12', bow_compound: 'arco composto',\n crossbow: 'besta', hammer: 'martelo', sledgehammer: 'marreta', baseball_bat: 'taco de beisebol', crowbar: 'pé de cabra', machete: 'facão', axe: 'machado',\n knife: 'faca', fists: 'punhos', lighter: 'isqueiro', flamethrower: 'lança-chamas', molotov: 'coquetel molotov', cutting_torch: 'maçarico de corte',\n blowtorch: 'maçarico', frag_grenade: 'granada de fragmentação', pipe_bomb: 'bomba caseira', screwdriver: 'chave de fenda', wrench: 'chave inglesa',\n pry_bar: 'alavanca', hacksaw: 'serra de arco', utility_knife: 'estilete', claw_hammer: 'martelo de unha', extinguisher: 'extintor',\n },\n modes: { single: 'tiro único', semi: 'semiautomático', burst: 'rajada', auto: 'automático', pump: 'repetição', bolt: 'ferrolho', lever: 'alavanca', break: 'basculante' },\n categories: {\n pistol: 'pistola', revolver: 'revólver', smg: 'submetralhadora', rifle: 'fuzil', carbine: 'carabina', sniper: 'fuzil de precisão', shotgun: 'espingarda',\n bow: 'arco', crossbow: 'besta', melee_blunt: 'corpo a corpo contundente', melee_blade: 'corpo a corpo cortante', flame: 'chama', heat: 'calor',\n throwable: 'arremessável', tool: 'ferramenta', extinguisher: 'extintor', hand: 'mão',\n },\n },\n}\n\nexport const resolveStrings = (locale: string | undefined): WeaponsStrings => locales[(locale as WeaponsLocale) ?? 'en'] ?? locales.en\n","import type { Vec3 } from './types'\n\n/** Deterministic mulberry32 generator; returns floats in [0, 1). */\nexport const createRng = (seed: number): (() => number) => {\n let a = seed >>> 0\n return () => {\n a = (a + 0x6d2b79f5) >>> 0\n let t = a\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\nexport const normalize = (v: Vec3): Vec3 => {\n const l = Math.hypot(v[0], v[1], v[2])\n return l > 1e-12 ? [v[0] / l, v[1] / l, v[2] / l] : [0, 0, -1]\n}\n\nconst cross = (a: Vec3, b: Vec3): Vec3 => [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]\n\n/** Uniform direction inside a cone of half-angle `deg` around the unit vector `dir` (uniform over the solid angle). */\nexport const sampleCone = (dir: Vec3, deg: number, rng: () => number): Vec3 => {\n if (deg <= 0) return dir\n const cosMax = Math.cos((deg * Math.PI) / 180)\n const cosT = 1 - rng() * (1 - cosMax)\n const sinT = Math.sqrt(Math.max(0, 1 - cosT * cosT))\n const phi = rng() * Math.PI * 2\n const helper: Vec3 = Math.abs(dir[1]) < 0.9 ? [0, 1, 0] : [1, 0, 0]\n const u = normalize(cross(helper, dir))\n const v = cross(dir, u)\n const cx = Math.cos(phi) * sinT\n const cy = Math.sin(phi) * sinT\n return normalize([\n u[0] * cx + v[0] * cy + dir[0] * cosT,\n u[1] * cx + v[1] * cy + dir[1] * cosT,\n u[2] * cx + v[2] * cy + dir[2] * cosT,\n ])\n}\n","import { createRng, normalize, sampleCone } from './rng'\nimport type {\n CaliberDef,\n FireMode,\n Shot,\n TriggerResult,\n Use,\n Vec3,\n WeaponAction,\n WeaponDef,\n WeaponState,\n} from './types'\n\nconst EPS = 1e-9\nconst DEFAULT_THROWABLES = 3\n/** Total spread (base + bloom) never exceeds this many times the base spread. */\nexport const BLOOM_CAP = 4\n/** Fraction of the throw speed added upwards so a throw arcs. */\nconst THROW_LIFT = 0.15\n\n/** Muzzle energy in joules of ONE projectile (a bullet, or one pellet): 0.5 × mass × speed², speed scaled by the barrel factor. */\nexport const muzzleEnergy = (caliber: CaliberDef, barrel = 1): number => {\n const v = caliber.muzzleSpeed * barrel\n return 0.5 * (caliber.bulletGrams / 1000) * v * v\n}\n\nexport interface WeaponStateInit {\n def: WeaponDef\n caliber: CaliberDef | null\n seed: number\n reserve?: number\n}\n\nconst result = (status: TriggerResult['status'], extra: Partial<TriggerResult> = {}): TriggerResult => ({\n shots: [],\n uses: [],\n status,\n recoil: [0, 0],\n noise: 0,\n ...extra,\n})\n\n/** Runtime of one weapon. See `WeaponState` for the contract. */\nexport class WeaponRuntime implements WeaponState {\n readonly def: WeaponDef\n readonly caliber: CaliberDef | null\n reserve: number\n mode: FireMode\n private _ammo: number\n private readonly _capacity: number\n private readonly action: WeaponAction\n private readonly rng: () => number\n private readonly initialReserve: number\n\n private clock = 0\n /** Time already advanced by the other of update / trigger in the same frame (so calling both does not count `dt` twice). */\n private pend: { src: 'update' | 'trigger'; amt: number } | null = null\n private readyAt = 0\n private latched = false\n\n private _reloading = false\n private reloadEnd = 0\n\n /** Bloom degrees at `extraClock`. */\n private extra = 0\n private extraClock = 0\n\n constructor(init: WeaponStateInit) {\n this.def = init.def\n this.caliber = init.caliber\n this.action = init.def.action\n this.rng = createRng(init.seed)\n const a = this.action\n this.mode = a.kind === 'firearm' ? a.modes[0] ?? 'single' : 'single'\n switch (a.kind) {\n case 'firearm':\n this._capacity = a.magazine\n break\n case 'flame':\n case 'heat':\n this._capacity = a.fuel\n break\n case 'extinguisher':\n this._capacity = a.charge\n break\n case 'throwable':\n this._capacity = a.count ?? DEFAULT_THROWABLES\n break\n default:\n this._capacity = 0\n }\n this._ammo = this._capacity\n this.initialReserve = init.reserve ?? (a.kind === 'firearm' ? a.magazine * 3 : 0)\n this.reserve = this.initialReserve\n }\n\n get ammo(): number {\n return this._ammo\n }\n get capacity(): number {\n return this._capacity\n }\n get reloading(): boolean {\n return this._reloading\n }\n get spread(): number {\n if (this.action.kind !== 'firearm') return 0\n return this.action.spreadDeg + this.extraAt(this.clock)\n }\n\n private extraAt(t: number): number {\n if (this.action.kind !== 'firearm') return 0\n const rec = this.action.recoveryDegPerS ?? 4\n return Math.max(0, this.extra - rec * Math.max(0, t - this.extraClock))\n }\n\n // --- time -----------------------------------------------------------------------------------------------------------------------\n\n update(dt: number): void {\n const d = Math.max(0, dt)\n let eff = d\n if (this.pend && this.pend.src === 'trigger') {\n eff = Math.max(0, d - this.pend.amt)\n this.pend = null\n } else {\n this.pend = { src: 'update', amt: d }\n }\n this.clock += eff\n this.settle(this.clock)\n }\n\n /** Complete the reload steps that finish at or before `t`. */\n private settle(t: number): void {\n const a = this.action\n if (a.kind !== 'firearm') return\n while (this._reloading && this.reloadEnd <= t + EPS) {\n if (a.perRound) {\n if (this.reserve > 0 && this._ammo < this._capacity) {\n this._ammo += 1\n this.reserve -= 1\n }\n if (this._ammo >= this._capacity || this.reserve <= 0) this._reloading = false\n else this.reloadEnd += a.reload\n } else {\n const take = Math.min(this._capacity - this._ammo, this.reserve)\n this._ammo += take\n this.reserve -= take\n this._reloading = false\n }\n }\n }\n\n // --- commands -------------------------------------------------------------------------------------------------------------------\n\n release(): void {\n this.latched = false\n }\n\n reload(): boolean {\n const a = this.action\n if (a.kind === 'throwable') {\n if (this._ammo >= this._capacity || this.reserve <= 0) return false\n this._ammo += 1\n this.reserve -= 1\n return true\n }\n if (a.kind !== 'firearm' || this._reloading) return false\n if (this._ammo >= this._capacity || this.reserve <= 0) return false\n this._reloading = true\n this.reloadEnd = this.clock + a.reload\n return true\n }\n\n cycleMode(): FireMode {\n if (this.action.kind !== 'firearm') return this.mode\n const modes = this.action.modes\n const i = modes.indexOf(this.mode)\n this.mode = modes[(i + 1) % modes.length] ?? this.mode\n return this.mode\n }\n\n refill(): void {\n this._ammo = this._capacity\n this.reserve = this.initialReserve\n this._reloading = false\n this.readyAt = this.clock\n this.latched = false\n this.extra = 0\n }\n\n // --- trigger --------------------------------------------------------------------------------------------------------------------\n\n trigger(origin: Vec3, direction: Vec3, dt: number, held = false, source?: string): TriggerResult {\n const d = Math.max(0, dt)\n let overlap = 0\n if (this.pend && this.pend.src === 'update') {\n overlap = Math.min(this.pend.amt, d)\n this.pend = null\n } else {\n this.pend = { src: 'trigger', amt: d }\n }\n const start = this.clock - overlap\n const end = start + d\n this.settle(start)\n\n const dir = normalize(direction)\n let res: TriggerResult\n const a = this.action\n switch (a.kind) {\n case 'firearm':\n res = this.fireFirearm(a, origin, dir, start, end, held, source)\n break\n case 'melee':\n res = this.fireMelee(a, origin, dir, start, end)\n break\n case 'flame':\n case 'heat':\n res = this.fireFuel(a, origin, dir, d)\n break\n case 'extinguisher':\n res = this.fireExtinguisher(a, origin, dir, d)\n break\n case 'throwable':\n res = this.fireThrowable(a, origin, dir, held)\n break\n case 'tool':\n res = d > 0 ? result('ok', { uses: [{ kind: 'tool', tool: a.tool, reach: a.reach, duration: d, origin, direction: dir }], noise: a.noise }) : result('ok')\n break\n case 'hand':\n res = this.oncePerPull(held)\n ? result('ok', { uses: [{ kind: 'hand', reach: a.reach, origin, direction: dir }] })\n : result('cooldown')\n break\n }\n this.clock = Math.max(this.clock, end)\n this.settle(this.clock)\n return res\n }\n\n /** Semi-style gating: a held trigger that already fired does nothing until `release()` or a new pull (`held` false). */\n private oncePerPull(held: boolean): boolean {\n if (!held) this.latched = false\n if (this.latched) return false\n this.latched = true\n return true\n }\n\n private fireFirearm(a: Extract<WeaponAction, { kind: 'firearm' }>, origin: Vec3, dir: Vec3, start: number, end: number, held: boolean, source?: string): TriggerResult {\n if (this._reloading) {\n if (a.perRound && this._ammo > 0) this._reloading = false // a tube reload is interrupted by the trigger\n else return result('reloading')\n }\n const auto = this.mode === 'auto'\n if (!auto && !this.oncePerPull(held)) return result('cooldown')\n if (this._ammo <= 0) return result('empty')\n\n const iv = 60 / a.rpm\n const t0 = Math.max(start, this.readyAt)\n if (t0 > end + EPS) return result('cooldown')\n\n const res = result('ok')\n const fire = (t: number): void => {\n this.fireOne(a, origin, dir, t, res, source)\n }\n if (auto) {\n for (let t = t0, n = 0; this._ammo > 0 && (n === 0 ? t <= end + EPS : t < end - EPS); t += iv, n++) fire(t)\n } else if (this.mode === 'burst') {\n const count = Math.min(a.burst ?? 3, this._ammo)\n for (let k = 0; k < count; k++) fire(t0 + k * iv)\n } else {\n fire(t0)\n }\n return res\n }\n\n private fireOne(a: Extract<WeaponAction, { kind: 'firearm' }>, origin: Vec3, dir: Vec3, t: number, res: TriggerResult, source?: string): void {\n const cal = this.caliber as CaliberDef\n const barrel = a.barrel ?? 1\n const speed = cal.muzzleSpeed * barrel\n const energy = muzzleEnergy(cal, barrel)\n const drag = cal.dragPer100m ?? 0.1\n const energyAt = (distance: number): number => {\n const f = Math.pow(1 - drag, Math.max(0, distance) / 100)\n return energy * f * f\n }\n const bloomNow = this.extraAt(t)\n const spread = a.spreadDeg + bloomNow\n const aim = sampleCone(dir, spread, this.rng)\n const pellets = cal.pellets ?? 1\n const pelletSpread = pellets > 1 ? a.pelletSpreadDeg ?? 3 : 0\n for (let p = 0; p < pellets; p++) {\n const shot: Shot = {\n origin: [origin[0], origin[1], origin[2]],\n direction: sampleCone(aim, pelletSpread, this.rng),\n energy,\n caliber: cal.diameter,\n caliberId: cal.id,\n speed,\n energyAt,\n pellet: p,\n weapon: this.def.id,\n }\n if (source !== undefined) shot.source = source\n res.shots.push(shot)\n }\n this._ammo -= 1\n this.readyAt = t + 60 / a.rpm\n this.extra = Math.min(bloomNow + (a.bloomDeg ?? 0), a.spreadDeg * (BLOOM_CAP - 1))\n this.extraClock = t\n res.recoil = [res.recoil[0] + a.recoil[0], res.recoil[1] + (this.rng() * 2 - 1) * a.recoil[1]]\n res.noise = a.noise\n }\n\n private fireMelee(a: Extract<WeaponAction, { kind: 'melee' }>, origin: Vec3, dir: Vec3, start: number, end: number): TriggerResult {\n const t0 = Math.max(start, this.readyAt)\n if (t0 > end + EPS) return result('cooldown')\n this.readyAt = t0 + 60 / a.rpm\n const use: Use = { kind: 'melee', damage: a.damage, energy: a.energy, radius: a.radius, reach: a.reach, origin, direction: dir }\n return result('ok', { uses: [use], noise: a.noise })\n }\n\n private fireFuel(a: Extract<WeaponAction, { kind: 'flame' | 'heat' }>, origin: Vec3, dir: Vec3, dt: number): TriggerResult {\n if (this._ammo <= EPS) return result('no_fuel')\n if (dt <= 0) return result('ok')\n const need = a.fuelPerSecond * dt\n let duration = dt\n if (need > this._ammo) {\n duration = dt * (this._ammo / need)\n this._ammo = 0\n } else {\n this._ammo -= need\n }\n const use: Use =\n a.kind === 'flame'\n ? { kind: 'flame', temperature: a.temperature, radius: a.radius, range: a.range, cone: a.cone ?? false, duration, origin, direction: dir }\n : { kind: 'heat', temperature: a.temperature, radius: a.radius, range: a.range, duration, origin, direction: dir }\n return result('ok', { uses: [use], noise: a.noise })\n }\n\n private fireExtinguisher(a: Extract<WeaponAction, { kind: 'extinguisher' }>, origin: Vec3, dir: Vec3, dt: number): TriggerResult {\n if (this._ammo <= EPS) return result('no_fuel')\n if (dt <= 0) return result('ok')\n const duration = Math.min(dt, this._ammo)\n this._ammo -= duration\n return result('ok', { uses: [{ kind: 'extinguish', range: a.range, coolC: a.coolC, duration, origin, direction: dir }], noise: a.noise })\n }\n\n private fireThrowable(a: Extract<WeaponAction, { kind: 'throwable' }>, origin: Vec3, dir: Vec3, held: boolean): TriggerResult {\n if (!this.oncePerPull(held)) return result('cooldown')\n if (this._ammo <= 0) return result('empty')\n this._ammo -= 1\n const velocity: Vec3 = [dir[0] * a.throwSpeed, dir[1] * a.throwSpeed + a.throwSpeed * THROW_LIFT, dir[2] * a.throwSpeed]\n const use: Use = { kind: 'throw', energy: a.energy, radius: a.radius, fuse: a.fuse, velocity, origin }\n if (a.fire) use.fire = { ...a.fire }\n return result('ok', { uses: [use], noise: a.noise })\n }\n}\n","import calibersJson from './data/calibers.json'\nimport weaponsJson from './data/weapons.json'\nimport { resolveStrings } from './locale'\nimport type { Arsenal, ArsenalOptions, CaliberDef, CaliberId, WeaponCategory, WeaponDef, WeaponId, WeaponState } from './types'\nimport { muzzleEnergy, WeaponRuntime } from './weapon'\n\nexport const CALIBERS = calibersJson as unknown as CaliberDef[]\nexport const WEAPONS = weaponsJson as unknown as WeaponDef[]\n\n/** A reasonable starting kit for a test room or a sandbox. */\nexport const DEFAULT_LOADOUT: WeaponId[] = [\n 'hand', 'kick', 'shove', 'pistol_9mm', 'revolver_357', 'shotgun_pump_12', 'rifle_5_56', 'rifle_bolt_308', 'hammer', 'axe', 'machete', 'utility_knife', 'crowbar', 'lighter', 'flamethrower',\n 'cutting_torch', 'molotov', 'frag_grenade', 'screwdriver', 'wrench', 'pry_bar', 'hacksaw', 'extinguisher',\n]\n\nexport { muzzleEnergy }\n\n/** Create an arsenal: the built-in calibres and weapons merged (by id) with the ones in `options`. */\nexport const createArsenal = (options: ArsenalOptions = {}): Arsenal => {\n const calibers = new Map<CaliberId, CaliberDef>()\n for (const c of [...CALIBERS, ...(options.calibers ?? [])]) calibers.set(c.id, c)\n const weapons = new Map<WeaponId, WeaponDef>()\n for (const w of [...WEAPONS, ...(options.weapons ?? [])]) weapons.set(w.id, w)\n const strings = resolveStrings(options.locale)\n const baseSeed = options.seed ?? 1\n let counter = 0\n\n const create = (id: WeaponId, opts: { seed?: number; reserve?: number } = {}): WeaponState => {\n const def = weapons.get(id)\n if (!def) throw new Error(`game-weapons: unknown weapon \"${id}\"`)\n let caliber: CaliberDef | null = null\n if (def.action.kind === 'firearm') {\n caliber = calibers.get(def.action.caliber) ?? null\n if (!caliber) throw new Error(`game-weapons: weapon \"${id}\" uses unknown calibre \"${def.action.caliber}\"`)\n }\n counter += 1\n const seed = opts.seed ?? (baseSeed + Math.imul(counter, 0x9e3779b1)) >>> 0\n return new WeaponRuntime({ def, caliber, seed, reserve: opts.reserve })\n }\n\n return {\n calibers,\n weapons,\n create,\n muzzleEnergy(caliber, barrel = 1) {\n const c = calibers.get(caliber)\n if (!c) throw new Error(`game-weapons: unknown calibre \"${caliber}\"`)\n return muzzleEnergy(c, barrel)\n },\n name(id) {\n const w = weapons.get(id)\n if (w) return strings.weapons[id] ?? w.name ?? id\n return strings.modes[id] ?? strings.categories[id] ?? calibers.get(id)?.label ?? id\n },\n list(category?: WeaponCategory) {\n const all = [...weapons.values()]\n return category ? all.filter((w) => w.category === category) : all\n },\n }\n}\n","// Weapon sounds synthesized with WebAudio: no sound files, so the kit stays offline and small. Every call is a no-op where there is no\n// AudioContext (tests, workers), and the context is only created on the first sound, which comes from a click or a key (browsers allow it).\n\n/** Sounds the weapon presentation plays. */\nexport interface WeaponAudio {\n /** A shot: louder and longer the more muzzle energy (joules). */\n shot(energyJ: number, category: string): void\n /** Dry click of an empty weapon. */\n click(): void\n /** Magazine out, or the first shell in. */\n reloadStart(category: string): void\n /** Magazine seated and the action racked. */\n reloadEnd(category: string): void\n /** The pump or lever cycling after a shot. */\n cycle(): void\n /** A casing bouncing on the floor. */\n clink(): void\n /** A magazine landing on the floor. */\n thud(): void\n /** Master volume, 0 to 1. */\n setVolume(volume: number): void\n dispose(): void\n}\n\ntype AudioContextCtor = new () => AudioContext\n\nconst NOISE_SECONDS = 0.6\n\nexport function createWeaponAudio(volume = 0.6): WeaponAudio {\n const Ctor = (globalThis as { AudioContext?: AudioContextCtor; webkitAudioContext?: AudioContextCtor }).AudioContext ?? (globalThis as { webkitAudioContext?: AudioContextCtor }).webkitAudioContext\n let ctx: AudioContext | null = null\n let master: GainNode | null = null\n let noise: AudioBuffer | null = null\n let level = volume\n\n const ready = (): AudioContext | null => {\n if (!Ctor) return null\n if (!ctx) {\n ctx = new Ctor()\n master = ctx.createGain()\n master.gain.value = level\n master.connect(ctx.destination)\n noise = ctx.createBuffer(1, Math.floor(ctx.sampleRate * NOISE_SECONDS), ctx.sampleRate)\n const data = noise.getChannelData(0)\n for (let i = 0; i < data.length; i++) data[i] = Math.random() * 2 - 1\n }\n if (ctx.state === 'suspended') void ctx.resume()\n return ctx\n }\n\n // a filtered noise burst with a fast attack and an exponential tail\n const burst = (options: { at?: number; seconds: number; gain: number; filter: BiquadFilterType; frequency: number; q?: number }): void => {\n const audio = ready()\n if (!audio || !noise || !master) return\n const start = audio.currentTime + (options.at ?? 0)\n const source = audio.createBufferSource()\n source.buffer = noise\n const filter = audio.createBiquadFilter()\n filter.type = options.filter\n filter.frequency.value = options.frequency\n filter.Q.value = options.q ?? 0.8\n const gain = audio.createGain()\n gain.gain.setValueAtTime(0.0001, start)\n gain.gain.exponentialRampToValueAtTime(options.gain, start + 0.004)\n gain.gain.exponentialRampToValueAtTime(0.0001, start + options.seconds)\n source.connect(filter).connect(gain).connect(master)\n source.start(start)\n source.stop(start + options.seconds + 0.05)\n }\n\n const tone = (options: { at?: number; seconds: number; gain: number; frequency: number; to?: number; type?: OscillatorType }): void => {\n const audio = ready()\n if (!audio || !master) return\n const start = audio.currentTime + (options.at ?? 0)\n const osc = audio.createOscillator()\n osc.type = options.type ?? 'sine'\n osc.frequency.setValueAtTime(options.frequency, start)\n if (options.to) osc.frequency.exponentialRampToValueAtTime(options.to, start + options.seconds)\n const gain = audio.createGain()\n gain.gain.setValueAtTime(0.0001, start)\n gain.gain.exponentialRampToValueAtTime(options.gain, start + 0.003)\n gain.gain.exponentialRampToValueAtTime(0.0001, start + options.seconds)\n osc.connect(gain).connect(master)\n osc.start(start)\n osc.stop(start + options.seconds + 0.05)\n }\n\n const metal = (at: number, frequency: number, gain: number): void => {\n burst({ at, seconds: 0.05, gain, filter: 'highpass', frequency, q: 2 })\n tone({ at, seconds: 0.04, gain: gain * 0.6, frequency: frequency * 0.6, type: 'square' })\n }\n\n return {\n shot(energyJ, category) {\n // 200 J (.22) to 15 000 J (.50 BMG) mapped to 0..1\n const k = Math.min(1, Math.max(0, Math.log10(Math.max(energyJ, 50) / 50) / 2.5))\n const shotgun = category === 'shotgun'\n burst({ seconds: 0.12 + k * 0.35 + (shotgun ? 0.1 : 0), gain: 0.5 + k * 0.5, filter: 'lowpass', frequency: 4200 - k * 2600 })\n burst({ seconds: 0.03, gain: 0.6, filter: 'highpass', frequency: 3000 })\n tone({ seconds: 0.14 + k * 0.2, gain: 0.35 + k * 0.4, frequency: 140 - k * 70, to: 40 })\n },\n click() {\n metal(0, 2600, 0.25)\n },\n reloadStart(category) {\n metal(0, 1500, 0.35)\n if (category !== 'shotgun' && category !== 'revolver') metal(0.12, 900, 0.2)\n },\n reloadEnd(category) {\n metal(0, 1100, 0.45)\n if (category !== 'revolver') metal(0.18, 1900, 0.4)\n },\n cycle() {\n metal(0.22, 900, 0.35)\n metal(0.36, 1300, 0.35)\n },\n clink() {\n const f = 3200 + Math.random() * 2000\n tone({ seconds: 0.09, gain: 0.12, frequency: f })\n tone({ seconds: 0.06, gain: 0.06, frequency: f * 2.7 })\n },\n thud() {\n burst({ seconds: 0.09, gain: 0.35, filter: 'lowpass', frequency: 380 })\n },\n setVolume(next) {\n level = Math.max(0, Math.min(1, next))\n if (master) master.gain.value = level\n },\n dispose() {\n void ctx?.close()\n ctx = null\n master = null\n noise = null\n },\n }\n}\n","import type * as THREE_NS from 'three'\nimport type { DestructibleSpec, JointSpec, PartSpec, Vec3 } from '@adatechnology/game-contracts'\nimport type { WeaponDef } from '@adatechnology/game-weapons'\n\n/** A low-poly prop: its destruction spec (box parts only) and one colour per part. */\nexport interface WeaponProp {\n spec: DestructibleSpec\n colors: Record<string, number>\n}\n\ntype Extra = Partial<Omit<PartSpec, 'id' | 'material' | 'shape' | 'position'>>\nconst box = (id: string, material: string, size: Vec3, position: Vec3, extra: Extra = {}): PartSpec => ({ id, material, shape: { kind: 'box', size }, position, ...extra })\nconst joint = (a: string, b: string, kind: JointSpec['kind']): JointSpec => ({ a, b, kind })\n\n// A grip and a body lying flat end to end, long axis along +x, the muzzle or head at +x. One thickness for both parts so the prop lies flat,\n// and the parts touch without overlapping: overlapping parts are pushed apart by the physics and the prop slides away.\nconst handled = (name: string, handle: [string, Vec3], head: [string, Vec3]): WeaponProp => {\n const [handleMaterial, rawHandle] = handle\n const [headMaterial, rawHead] = head\n const thickness = Math.max(rawHandle[1], rawHead[1])\n const handleSize: Vec3 = [rawHandle[0], thickness, rawHandle[2]]\n const headSize: Vec3 = [rawHead[0], thickness, rawHead[2]]\n const shift = (handleSize[0] - headSize[0]) / 2\n return {\n spec: {\n name,\n parts: [box('handle', handleMaterial, handleSize, [-handleSize[0] / 2 + shift, thickness / 2, 0]), box('head', headMaterial, headSize, [headSize[0] / 2 + shift, thickness / 2, 0])],\n joints: [joint('handle', 'head', 'screw')],\n tags: ['weapon'],\n },\n colors: { handle: handleMaterial === 'steel' ? 0x3a3d42 : handleMaterial === 'plastic' ? 0x2b2d30 : 0x7a5530, head: headMaterial === 'steel' ? 0x8f969e : headMaterial === 'copper' ? 0xb87333 : 0x6b4a2a },\n }\n}\nconst solid = (name: string, material: string, size: Vec3, color: number): WeaponProp => ({\n spec: { name, parts: [box('body', material, size, [0, size[1] / 2, 0])], joints: [], tags: ['weapon'] },\n colors: { body: color },\n})\n\nconst SHAPES: Record<string, (name: string, id: string) => WeaponProp> = {\n pistol: (n) => handled(n, ['plastic', [0.06, 0.03, 0.11]], ['steel', [0.2, 0.03, 0.04]]),\n revolver: (n) => handled(n, ['wood_soft', [0.06, 0.035, 0.11]], ['steel', [0.24, 0.04, 0.05]]),\n smg: (n) => handled(n, ['plastic', [0.2, 0.05, 0.14]], ['steel', [0.45, 0.05, 0.06]]),\n carbine: (n) => handled(n, ['wood_soft', [0.35, 0.05, 0.12]], ['steel', [0.6, 0.04, 0.05]]),\n rifle: (n) => handled(n, ['wood_soft', [0.35, 0.06, 0.13]], ['steel', [0.75, 0.05, 0.07]]),\n sniper: (n) => handled(n, ['plastic', [0.4, 0.06, 0.14]], ['steel', [0.95, 0.06, 0.08]]),\n shotgun: (n) => handled(n, ['wood_soft', [0.38, 0.06, 0.13]], ['steel', [0.7, 0.05, 0.06]]),\n bow: (n) => solid(n, 'wood_soft', [0.95, 0.03, 0.22], 0x5a3d22),\n crossbow: (n) => handled(n, ['wood_soft', [0.6, 0.06, 0.08]], ['steel', [0.12, 0.04, 0.26]]),\n melee_blunt: (n, id) =>\n id === 'baseball_bat'\n ? solid(n, 'wood_soft', [0.84, 0.06, 0.06], 0xb08550)\n : handled(n, ['wood_soft', [id === 'sledgehammer' ? 0.8 : 0.32, 0.03, 0.03]], ['steel', id === 'sledgehammer' ? [0.08, 0.08, 0.2] : [0.06, 0.04, 0.12]]),\n melee_blade: (n, id) => handled(n, ['wood_soft', [0.13, 0.03, 0.03]], ['steel', id === 'axe' ? [0.5, 0.03, 0.16] : id === 'knife' ? [0.16, 0.01, 0.03] : [0.45, 0.01, 0.05]]),\n tool: (n) => handled(n, ['plastic', [0.12, 0.025, 0.03]], ['steel', [0.16, 0.02, 0.03]]),\n flame: (n, id) => (id === 'flamethrower' ? handled(n, ['steel', [0.3, 0.14, 0.14]], ['steel', [0.6, 0.05, 0.05]]) : solid(n, 'plastic', [0.08, 0.02, 0.04], 0xd9482b)),\n heat: (n) => handled(n, ['steel', [0.2, 0.08, 0.08]], ['copper', [0.25, 0.03, 0.03]]),\n throwable: (n, id) => (id === 'molotov' ? solid(n, 'glass', [0.25, 0.07, 0.07], 0x7fd6b0) : solid(n, 'steel', [id === 'pipe_bomb' ? 0.25 : 0.1, 0.06, 0.06], 0x4c5a3a)),\n extinguisher: (n) => solid(n, 'steel', [0.5, 0.15, 0.15], 0xc0392b),\n}\n\n/** Body actions of the arsenal: nothing to hold or lay on a counter. */\nexport const BODY_ACTIONS: ReadonlySet<string> = new Set(['hand', 'kick', 'shove', 'fists'])\n\n// Real weights from the arsenal data: solid steel boxes would weigh several times more, go past a carry limit and stop being props.\nconst withMass = (prop: WeaponProp, kg: number): WeaponProp => {\n const volumes = prop.spec.parts.map((part) => (part.shape.kind === 'box' ? part.shape.size[0] * part.shape.size[1] * part.shape.size[2] : 0))\n const total = volumes.reduce((sum, volume) => sum + volume, 0) || 1\n return { ...prop, spec: { ...prop.spec, parts: prop.spec.parts.map((part, index) => ({ ...part, mass: (kg * volumes[index]) / total })) } }\n}\n\n/** The prop of a weapon: low-poly parts by category, the real mass of the weapon spread over them. */\nexport function weaponProp(def: Pick<WeaponDef, 'id' | 'category' | 'mass'>, name = def.id): WeaponProp {\n const shape = SHAPES[def.category] ?? SHAPES.tool\n return withMass(shape(name, def.id), def.mass)\n}\n\n/** One mesh per box part, named after the part (what destruction renderers bind to), in a group with its origin on the floor. */\nexport function buildProp(THREE: typeof THREE_NS, prop: WeaponProp): THREE_NS.Group {\n const group = new THREE.Group()\n group.name = prop.spec.name ?? 'weapon'\n for (const part of prop.spec.parts) {\n if (part.shape.kind !== 'box') continue\n const [w, h, d] = part.shape.size\n const material = new THREE.MeshStandardMaterial({ color: prop.colors[part.id] ?? 0x777777, roughness: 0.6, metalness: part.material === 'steel' ? 0.6 : 0.05 })\n const mesh = new THREE.Mesh(new THREE.BoxGeometry(w, h, d), material)\n mesh.name = part.id\n mesh.position.set(part.position[0], part.position[1], part.position[2])\n mesh.castShadow = true\n mesh.receiveShadow = true\n group.add(mesh)\n }\n return group\n}\n\n/** The model of a weapon for the hands or a shelf: the same prop the counters show. */\nexport function buildWeaponModel(THREE: typeof THREE_NS, def: Pick<WeaponDef, 'id' | 'category' | 'mass'>): THREE_NS.Group {\n return buildProp(THREE, weaponProp(def))\n}\n","import type * as THREE_NS from 'three'\nimport type { HostEvent, HostTool } from '@adatechnology/game-contracts'\nimport type { Arsenal, WeaponDef } from '@adatechnology/game-weapons'\nimport type { WeaponAudio } from './audio'\nimport { BODY_ACTIONS, buildWeaponModel } from './props'\n\nexport interface WeaponFxOptions {\n THREE: typeof THREE_NS\n scene: THREE_NS.Scene\n camera: THREE_NS.Camera\n arsenal: Arsenal\n /** Height things rest on at (x, z): casings and magazines land there. */\n groundAt: (x: number, z: number) => number\n /** Sounds (`createWeaponAudio`); null or absent: silent. */\n audio?: WeaponAudio | null\n}\n\n/** The weapon in the hands, its fire and reload motion, ejected casings and dropped magazines, and their sounds. */\nexport interface WeaponFx {\n /** Feed every tool event of the host, with the tool as it is after the event. */\n handle(event: HostEvent, tool: HostTool): void\n update(dt: number): void\n /** Weapon shown in the hands, or null. */\n readonly inHand: string | null\n /** Casings and magazines currently on the floor or in the air. */\n readonly casings: number\n readonly magazines: number\n dispose(): void\n}\n\n/** Weapons that throw the spent case out on every shot. Revolvers keep them in the cylinder; break-actions open on reload. */\nconst EJECTS_ON_SHOT = new Set(['pistol', 'smg', 'carbine', 'rifle', 'sniper', 'shotgun'])\n/** Weapons whose reload drops a magazine. */\nconst DROPS_MAGAZINE = new Set(['pistol', 'smg', 'carbine', 'rifle', 'sniper'])\n/** Manual actions that cycle (pump, bolt) after each shot: the sound of the cycle. */\nconst CYCLES = new Set(['shotgun_pump_12', 'rifle_bolt_308'])\nconst MAX_CASINGS = 120\nconst MAX_MAGAZINES = 12\nconst LIFETIME_S = 25\nconst HAND_OFFSET: [number, number, number] = [0.2, -0.2, -0.42]\nconst GRAVITY = 9.81\n\ninterface Body {\n mesh: THREE_NS.Mesh\n velocity: THREE_NS.Vector3\n spin: THREE_NS.Vector3\n radius: number\n age: number\n resting: boolean\n bounces: number\n kind: 'casing' | 'magazine'\n}\n\nexport function createWeaponFx(options: WeaponFxOptions): WeaponFx {\n const { THREE, scene, camera, arsenal, groundAt } = options\n const audio = options.audio ?? null\n const bodies: Body[] = []\n const brass = new THREE.MeshStandardMaterial({ color: 0xc9a24a, metalness: 0.8, roughness: 0.35 })\n const shell = new THREE.MeshStandardMaterial({ color: 0xa8322b, roughness: 0.6 })\n const steel = new THREE.MeshStandardMaterial({ color: 0x2f3237, metalness: 0.5, roughness: 0.5 })\n const hand = new THREE.Group()\n hand.name = 'weapon-in-hand'\n scene.add(hand)\n let model: THREE_NS.Object3D | null = null\n let inHand: string | null = null\n let def: WeaponDef | null = null\n let kick = 0\n let dip = 0\n let reloading = false\n const v = new THREE.Vector3()\n const q = new THREE.Quaternion()\n const pointForward = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI / 2)\n\n const equip = (weapon: string): void => {\n if (model) hand.remove(model)\n model = null\n inHand = null\n def = arsenal.weapons.get(weapon) ?? null\n if (!def || BODY_ACTIONS.has(def.id)) return\n model = buildWeaponModel(THREE, def)\n const length = new THREE.Box3().setFromObject(model).getSize(v).x\n // long guns are drawn smaller so they do not fill the view\n model.scale.setScalar(length > 0.8 ? 0.55 : length > 0.4 ? 0.75 : 1)\n model.quaternion.copy(pointForward)\n hand.add(model)\n inHand = def.id\n }\n\n // a point on the gun in camera space, turned into the world\n const handPoint = (x: number, y: number, z: number, out: THREE_NS.Vector3): THREE_NS.Vector3 =>\n out.set(HAND_OFFSET[0] + x, HAND_OFFSET[1] + y, HAND_OFFSET[2] + z).applyQuaternion(camera.quaternion).add(camera.position)\n\n const throwBody = (kind: Body['kind'], mesh: THREE_NS.Mesh, from: THREE_NS.Vector3, velocity: THREE_NS.Vector3, radius: number): void => {\n const limit = kind === 'casing' ? MAX_CASINGS : MAX_MAGAZINES\n const same = bodies.filter((b) => b.kind === kind)\n if (same.length >= limit) removeBody(same[0])\n mesh.position.copy(from)\n mesh.castShadow = true\n scene.add(mesh)\n bodies.push({ mesh, velocity, spin: new THREE.Vector3(Math.random() * 20 - 10, Math.random() * 30 - 15, Math.random() * 20 - 10), radius, age: 0, resting: false, bounces: 0, kind })\n }\n\n const ejectCasing = (caliberMm: number, isShell: boolean, downward: boolean): void => {\n const radius = isShell ? 0.0105 : Math.max(0.003, (caliberMm / 1000) * 0.6)\n const length = isShell ? 0.068 : Math.min(0.07, Math.max(0.015, (caliberMm / 1000) * 2.6))\n const mesh = new THREE.Mesh(new THREE.CylinderGeometry(radius, radius, length, 8), isShell ? shell : brass)\n mesh.name = 'casing'\n const from = handPoint(0.03, 0.03, 0.05, new THREE.Vector3())\n const right = new THREE.Vector3(1, 0, 0).applyQuaternion(camera.quaternion)\n const up = new THREE.Vector3(0, 1, 0)\n const velocity = downward\n ? up.clone().multiplyScalar(-0.5).addScaledVector(right, (Math.random() - 0.5) * 0.4)\n : right.multiplyScalar(1.6 + Math.random() * 0.8).addScaledVector(up, 1.4 + Math.random() * 0.8)\n throwBody('casing', mesh, from, velocity, radius)\n }\n\n const dropMagazine = (category: string): void => {\n const long = category === 'rifle' || category === 'sniper' || category === 'carbine'\n const size: [number, number, number] = long ? [0.03, 0.17, 0.07] : [0.025, 0.11, 0.035]\n const mesh = new THREE.Mesh(new THREE.BoxGeometry(...size), steel)\n mesh.name = 'magazine'\n const from = handPoint(0, -0.06, 0, new THREE.Vector3())\n throwBody('magazine', mesh, from, new THREE.Vector3(0, -0.4, 0), size[1] / 2)\n audio?.reloadStart(category)\n }\n\n const caliberOf = (weapon: WeaponDef): number => {\n if (weapon.action.kind !== 'firearm') return 9\n return arsenal.calibers.get(weapon.action.caliber)?.diameter ?? 9\n }\n\n function removeBody(body: Body): void {\n body.mesh.removeFromParent()\n body.mesh.geometry.dispose()\n bodies.splice(bodies.indexOf(body), 1)\n }\n\n const onShot = (weapon: WeaponDef): void => {\n kick = 1\n const caliber = weapon.action.kind === 'firearm' ? arsenal.calibers.get(weapon.action.caliber) : undefined\n const energy = caliber ? 0.5 * (caliber.bulletGrams / 1000) * caliber.muzzleSpeed ** 2 * (caliber.pellets ?? 1) : 300\n audio?.shot(energy, weapon.category)\n if (CYCLES.has(weapon.id)) audio?.cycle()\n if (EJECTS_ON_SHOT.has(weapon.category) && weapon.id !== 'shotgun_double_12') ejectCasing(caliberOf(weapon), weapon.category === 'shotgun', false)\n }\n\n const onReloadStart = (weapon: WeaponDef, tool: HostTool): void => {\n if (DROPS_MAGAZINE.has(weapon.category)) dropMagazine(weapon.category)\n else audio?.reloadStart(weapon.category)\n // revolvers and break-action shotguns dump their spent cases when opened\n if (weapon.category === 'revolver' || weapon.id === 'shotgun_double_12') {\n const spent = Math.max(1, tool.capacity - tool.ammo)\n for (let i = 0; i < spent; i++) ejectCasing(caliberOf(weapon), weapon.category === 'shotgun', true)\n }\n }\n\n const stepBody = (body: Body, dt: number): void => {\n body.age += dt\n if (body.resting) return\n body.velocity.y -= GRAVITY * dt\n body.mesh.position.addScaledVector(body.velocity, dt)\n body.mesh.rotation.x += body.spin.x * dt\n body.mesh.rotation.y += body.spin.y * dt\n body.mesh.rotation.z += body.spin.z * dt\n const floor = groundAt(body.mesh.position.x, body.mesh.position.z) + body.radius\n if (body.mesh.position.y > floor) return\n body.mesh.position.y = floor\n if (Math.abs(body.velocity.y) > 0.7 && body.bounces < 4) {\n body.bounces++\n body.velocity.y = -body.velocity.y * 0.35\n body.velocity.x *= 0.55\n body.velocity.z *= 0.55\n body.spin.multiplyScalar(0.5)\n if (body.kind === 'casing') audio?.clink()\n else audio?.thud()\n return\n }\n if (body.kind === 'magazine' && body.bounces === 0) audio?.thud()\n body.resting = true\n body.mesh.rotation.x = Math.PI / 2\n body.mesh.rotation.z = 0\n }\n\n return {\n handle(event, tool) {\n const weapon = arsenal.weapons.get(event.weapon)\n if (event.type === 'tool') equip(event.weapon)\n if (!weapon) return\n if (event.type === 'shot') onShot(weapon)\n else if (event.type === 'empty') audio?.click()\n else if (event.type === 'reload' && event.phase === 'start') onReloadStart(weapon, tool)\n else if (event.type === 'reload' && event.phase === 'end') audio?.reloadEnd(weapon.category)\n reloading = tool.reloading\n },\n update(dt) {\n kick *= Math.exp(-dt * 14)\n dip += ((reloading ? 1 : 0) - dip) * Math.min(1, dt * 8)\n if (inHand) {\n handPoint(0, -0.12 * dip, 0.05 * kick, hand.position)\n q.setFromEuler(new THREE.Euler(0.14 * kick - 0.25 * dip, 0, 0.6 * dip))\n hand.quaternion.copy(camera.quaternion).multiply(q)\n }\n for (const body of [...bodies]) {\n stepBody(body, dt)\n if (body.age > LIFETIME_S) removeBody(body)\n }\n },\n get inHand() {\n return inHand\n },\n get casings() {\n return bodies.filter((b) => b.kind === 'casing').length\n },\n get magazines() {\n return bodies.filter((b) => b.kind === 'magazine').length\n },\n dispose() {\n for (const body of [...bodies]) removeBody(body)\n hand.removeFromParent()\n brass.dispose()\n shell.dispose()\n steel.dispose()\n },\n }\n}\n","import type * as THREE_NS from 'three'\nimport type { AreaPlacement, DestructibleSpec, ModuleArea, TestableItem, TestableModule, Vec3 } from '@adatechnology/game-contracts'\nimport { createArsenal } from '@adatechnology/game-weapons'\nimport type { Arsenal } from '@adatechnology/game-weapons'\nimport { createWeaponAudio } from './audio'\nimport type { WeaponAudio } from './audio'\nimport { createWeaponFx } from './fx'\nimport type { WeaponFx } from './fx'\nimport { BODY_ACTIONS, buildProp, weaponProp } from './props'\nimport type { WeaponProp } from './props'\n\nexport interface WeaponsTestModuleOptions {\n /** `en` or `pt-BR` (default). */\n locale?: string\n /** The arsenal to lay out (default `createArsenal` with the locale). */\n arsenal?: Arsenal\n /** Play sounds (default true; silent anyway where there is no AudioContext). */\n sound?: boolean\n}\n\n/** Prefix of the item ids of the weapon props (`weapon_pistol_9mm`). */\nexport const WEAPON_ITEM_PREFIX = 'weapon_'\n// must not start with WEAPON_ITEM_PREFIX: hosts and tests tell the props apart by it\nexport const COUNTER_ITEM_ID = 'counter_weapons'\n\nconst COUNTER = { length: 4.8, depth: 1.6, height: 0.9 }\nconst COUNTER_X = [-6.5, -9, -11.5]\nconst COUNTER_Z = -1\n// props closer than this to a counter end have nothing next to them on one side\nconst END_MARGIN = 0.6\nconst SLOT_GAP = 0.3\n// targets in front of the brick wall of the room, at shooting distances\nconst TARGETS: Array<{ id: string; at: Vec3 }> = [\n { id: 'target_steel_plate', at: [-1.5, 0, -7] },\n { id: 'target_plywood', at: [0, 0, -7] },\n { id: 'target_concrete', at: [1.5, 0, -7] },\n]\n\nconst TEXT: Record<string, { group: string; name: string; counter: string; targets: Record<string, string>; reloadStart: string; reloadEnd: string }> = {\n en: {\n group: 'Weapons',\n name: 'Weapons area',\n counter: 'Weapon counter',\n targets: { target_steel_plate: 'Steel plate target', target_plywood: 'Plywood target', target_concrete: 'Concrete block target' },\n reloadStart: 'Reload started: {weapon} ({ammo}/{capacity})',\n reloadEnd: 'Reload done: {weapon} ({ammo}/{capacity})',\n },\n 'pt-BR': {\n group: 'Armas',\n name: 'Área de armas',\n counter: 'Balcão de armas',\n targets: { target_steel_plate: 'Alvo: chapa de aço', target_plywood: 'Alvo: compensado', target_concrete: 'Alvo: bloco de concreto' },\n reloadStart: 'Recarga iniciada: {weapon} ({ammo}/{capacity})',\n reloadEnd: 'Recarga completa: {weapon} ({ammo}/{capacity})',\n },\n}\nconst textOf = (locale: string): (typeof TEXT)['en'] => TEXT[locale] ?? TEXT.en\nconst fill = (template: string, vars: Record<string, string | number>): string => template.replace(/\\{(\\w+)\\}/g, (_, key: string) => String(vars[key] ?? ''))\n\nconst counterProp = (name: string): WeaponProp => {\n const { length, depth, height } = COUNTER\n return {\n spec: {\n name,\n parts: [\n { id: 'top', material: 'wood_soft', shape: { kind: 'box', size: [depth, 0.05, length] }, position: [0, height - 0.025, 0] },\n { id: 'side_a', material: 'plywood', shape: { kind: 'box', size: [depth - 0.1, height - 0.05, 0.05] }, position: [0, (height - 0.05) / 2, -length / 2 + 0.05], anchored: true },\n { id: 'side_b', material: 'plywood', shape: { kind: 'box', size: [depth - 0.1, height - 0.05, 0.05] }, position: [0, (height - 0.05) / 2, length / 2 - 0.05], anchored: true },\n ],\n joints: [\n { a: 'top', b: 'side_a', kind: 'screw' },\n { a: 'top', b: 'side_b', kind: 'screw' },\n ],\n tags: ['furniture'],\n },\n colors: { top: 0x8a5a30, side_a: 0x6b4426, side_b: 0x6b4426 },\n }\n}\n\nconst targetProp = (id: string, name: string): WeaponProp => {\n const face: Record<string, [string, Vec3, number]> = {\n target_steel_plate: ['steel', [0.5, 0.5, 0.01], 0xb5bcc4],\n target_plywood: ['plywood', [0.6, 0.8, 0.018], 0xc9a26b],\n target_concrete: ['concrete', [0.4, 0.2, 0.2], 0x9a9a94],\n }\n const [material, size, color] = face[id]\n const spec: DestructibleSpec = {\n name,\n parts: [\n { id: 'post', material: 'steel', shape: { kind: 'box', size: [0.05, 1.1, 0.05] }, position: [0, 0.55, -0.05], anchored: true },\n { id: 'face', material, shape: { kind: 'box', size }, position: [0, 1.1 + size[1] / 2, 0] },\n ],\n joints: [{ a: 'post', b: 'face', kind: 'bolt' }],\n tags: ['target'],\n }\n return { spec, colors: { post: 0x3a3d42, face: color } }\n}\n\nconst asItem = (id: string, name: string, prop: WeaponProp, extra: Partial<TestableItem> = {}): TestableItem => ({\n id,\n name,\n build: (THREE: unknown) => buildProp(THREE as typeof THREE_NS, prop),\n spec: prop.spec,\n ...extra,\n})\n\n/** Where the counters go and where each weapon lies on them: three counters on the free left side of the room, props across them. */\nexport function weaponsLayout(weaponItemIds: string[]): AreaPlacement[] {\n const perCounter = Math.floor((COUNTER.length - 2 * END_MARGIN) / SLOT_GAP) + 1\n const counters = COUNTER_X.slice(0, Math.max(1, Math.ceil(weaponItemIds.length / perCounter)))\n const placements: AreaPlacement[] = counters.map((x) => ({ item: COUNTER_ITEM_ID, position: [x, 0, COUNTER_Z], surface: { halfSize: [COUNTER.depth / 2, COUNTER.length / 2], height: COUNTER.height } }))\n weaponItemIds.forEach((item, index) => {\n const x = counters[Math.min(counters.length - 1, Math.floor(index / perCounter))]\n const z = COUNTER_Z - COUNTER.length / 2 + END_MARGIN + (index % perCounter) * SLOT_GAP\n // long props side by side overlap in the gentle piece separation of the renderer: asleep, they stay until grabbed\n placements.push({ item, position: [x, COUNTER.height + 0.01, z], asleep: true })\n })\n for (const target of TARGETS) placements.push({ item: target.id, position: target.at })\n return placements\n}\n\n/**\n * The weapons test area as a `TestableModule` of @adatechnology/game-contracts: one prop per weapon of the arsenal on counters (aim at one and\n * press H to equip it), targets at shooting distance, and, through `attach`, the weapon in the hands with its fire and reload motion,\n * ejected casings, dropped magazines and sounds, driven by the host's tool events.\n */\nexport function createWeaponsTestModule(options: WeaponsTestModuleOptions = {}): TestableModule & { readonly audio: WeaponAudio | null; readonly fx: WeaponFx | null } {\n const locale = options.locale ?? 'pt-BR'\n const arsenal = options.arsenal ?? createArsenal({ locale })\n const text = textOf(locale)\n const audio = options.sound === false ? null : createWeaponAudio()\n const weaponDefs = [...arsenal.weapons.values()].filter((def) => !BODY_ACTIONS.has(def.id))\n const weaponIds = weaponDefs.map((def) => `${WEAPON_ITEM_PREFIX}${def.id}`)\n let fx: WeaponFx | null = null\n return {\n id: 'weapons_area',\n name: text.name,\n group: text.group,\n audio,\n get fx() {\n return fx\n },\n items: () => [\n ...weaponDefs.map((def) => asItem(`${WEAPON_ITEM_PREFIX}${def.id}`, arsenal.name(def.id), weaponProp(def, arsenal.name(def.id)), { weapon: def.id, movable: true })),\n asItem(COUNTER_ITEM_ID, text.counter, counterProp(text.counter), { movable: false }),\n ...TARGETS.map((target) => asItem(target.id, text.targets[target.id], targetProp(target.id, text.targets[target.id]), { movable: false })),\n ],\n area: (): ModuleArea => ({ placements: weaponsLayout(weaponIds), view: { eye: [-3.4, 1.7, 2.6], target: [-9, 0.9, -1.2] } }),\n attach(host) {\n const created = createWeaponFx({\n THREE: host.THREE as typeof THREE_NS,\n scene: host.scene as THREE_NS.Scene,\n camera: host.camera as THREE_NS.Camera,\n arsenal,\n groundAt: host.groundAt,\n audio,\n })\n fx = created\n const offEvents = host.on((event) => {\n const tool = host.tool()\n created.handle(event, tool)\n if (event.type === 'reload') host.log(fill(event.phase === 'start' ? text.reloadStart : text.reloadEnd, { weapon: arsenal.name(event.weapon), ammo: tool.ammo, capacity: tool.capacity }), { weapon: event.weapon, phase: event.phase })\n })\n const offFrame = host.onFrame((dt) => created.update(dt))\n created.handle({ type: 'tool', weapon: host.tool().weapon }, host.tool())\n return () => {\n offEvents()\n offFrame()\n created.dispose()\n audio?.dispose()\n fx = null\n }\n },\n }\n}\n"],"mappings":"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Z,iBAAmB;QACnB,QAAU;UACR;UACA;QACF;QACA,OAAS;QACT,OAAS;MACX;MACA,MAAQ;MACR,MAAQ;QACN;MACF;IACF;IACA;MACE,IAAM;MACN,MAAQ;MACR,UAAY;MACZ,QAAU;QACR,MAAQ;QACR,SAAW;QACX,KAAO;QACP,OAAS;UACP;UACA;UACA;QACF;QACA,OAAS;QACT,UAAY;QACZ,QAAU;QACV,QAAU;QACV,WAAa;QACb,UAAY;QACZ,iBAAmB;QACnB,QAAU;UACR;UACA;QACF;QACA,OAAS;QACT,OAAS;MACX;MACA,MAAQ;MACR,MAAQ;QACN;MACF;IACF;IACA;MACE,IAAM;MACN,MAAQ;MACR,UAAY;MACZ,QAAU;QACR,MAAQ;QACR,SAAW;QACX,KAAO;QACP,OAAS;UACP;UACA;QACF;QACA,UAAY;QACZ,QAAU;QACV,QAAU;QACV,WAAa;QACb,UAAY;QACZ,iBAAmB;QACnB,QAAU;UACR;UACA;QACF;QACA,OAAS;QACT,OAAS;MACX;MACA,MAAQ;MACR,MAAQ;QACN;MACF;IACF;IACA;MACE,IAAM;MACN,MAAQ;MACR,UAAY;MACZ,QAAU;QACR,MAAQ;QACR,SAAW;QACX,KAAO;QACP,OAAS;UACP;QACF;QACA,UAAY;QACZ,QAAU;QACV,QAAU;QACV,WAAa;QACb,UAAY;QACZ,iBAAmB;QACnB,QAAU;UACR;UACA;QACF;QACA,OAAS;QACT,OAAS;MACX;MACA,MAAQ;MACR,MAAQ;QACN;MACF;IACF;IACA;MACE,IAAM;MACN,MAAQ;MACR,UAAY;MACZ,QAAU;QACR,MAAQ;QACR,SAAW;QACX,KAAO;QACP,OAAS;UACP;QACF;QACA,UAAY;QACZ,QAAU;QACV,QAAU;QACV,WAAa;QACb,UAAY;QACZ,iBAAmB;QACnB,QAAU;UACR;UACA;QACF;QACA,OAAS;QACT,OAAS;MACX;MACA,MAAQ;MACR,MAAQ;QACN;MACF;IACF;IACA;MACE,IAAM;MACN,MAAQ;MACR,UAAY;MACZ,QAAU;QACR,MAAQ;QACR,SAAW;QACX,KAAO;QACP,OAAS;UACP;QACF;QACA,UAAY;QAC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","names":[]}