fertig-classic-games/data/superkart-rules.json

142 lines
6.3 KiB
JSON

{
"_readme": [
"Super Kart tuning. Everything the sim reads lives here so the feel can be",
"adjusted without code changes. Distances are world units (tracks live in a",
"4096x4096 world), speeds are units/second, times are milliseconds.",
"After editing, run `node tools/verifySuperKart.js` to re-check invariants."
],
"engineClasses": [
{ "id": "cruiser", "label": "CRUISER CLASS", "desc": "Relaxed speeds, forgiving rivals.", "speedMult": 0.8, "aiSkillMult": 0.75, "rubberBandMult": 1.75 },
{ "id": "racer", "label": "RACER CLASS", "desc": "The intended Super Kart experience.", "speedMult": 1.0, "aiSkillMult": 1.0, "rubberBandMult": 1.0 },
{ "id": "turbo", "label": "TURBO CLASS", "desc": "Everything faster, rivals ruthless.", "speedMult": 1.15, "aiSkillMult": 1.25, "rubberBandMult": 0.25 }
],
"physics": {
"kartRadius": 14,
"baseTopSpeed": 560,
"topSpeedSpread": 160,
"baseAccel": 320,
"accelSpread": 240,
"brakeDecel": 760,
"coastDrag": 1.1,
"reverseTopSpeed": 170,
"turnRateBase": 2.3,
"turnRateSpread": 1.3,
"speedTurnPenalty": 0.55,
"driftTurnMult": 1.6,
"driftSlipRate": 240,
"driftGripSpread": 170,
"miniTurboMinMs": 500,
"miniTurboMaxMs": 1800,
"miniTurboBoostMs": 650,
"miniTurboBoostMultMin": 1.1,
"miniTurboBoostMultMax": 1.4,
"slipDecay": 3.2,
"hopMs": 260,
"hopCooldownMs": 160,
"offroadMultMin": 0.5,
"offroadMultMax": 0.92,
"deepMult": 0.25,
"boostPadMult": 1.4,
"boostPadMs": 900,
"spinMs": 1100,
"spinSpeedMult": 0.35,
"squashMs": 2600,
"squashSpeedMult": 0.5,
"invulnMs": 1600,
"coinTopSpeedBonus": 0.004,
"maxCoins": 10,
"coinsLostOnHit": 2,
"coinPickupRadius": 22,
"wallBumpSpeedLoss": 0.45,
"bumpImpulse": 190,
"respawnMs": 1600,
"offroadRescueMs": 6000,
"gridSpacing": 46,
"itemBoxRespawnMs": 2200,
"itemBoxRadius": 20,
"rouletteMs": 1500,
"rubberBandGain": 0.08,
"rubberBandRange": 1600,
"aiLookaheadMin": 4,
"aiLookaheadMax": 14,
"aiSteerGain": 3.4,
"aiBrakeCurvature": 1.1,
"aiStuckMs": 1500,
"aiReverseMs": 800
},
"items": [
{ "id": "bolt", "name": "Bolt", "type": "projectile", "desc": "Straight shot, bounces off walls three times.",
"params": { "speed": 900, "bounces": 3, "radius": 10, "lifeMs": 6000, "homing": false } },
{ "id": "seeker", "name": "Seeker", "type": "projectile", "desc": "Locks onto the next kart ahead and hunts it down.",
"params": { "speed": 800, "bounces": 0, "radius": 10, "lifeMs": 9000, "homing": true, "homingTurnRate": 3.2 } },
{ "id": "oil", "name": "Oil Slick", "type": "hazard", "desc": "Drop it behind you (or lob it ahead). Spins whoever touches it.",
"params": { "radius": 18, "throwSpeed": 700, "throwMs": 600 } },
{ "id": "turbo", "name": "Turbo Cell", "type": "boost", "desc": "A burst of raw speed. Works everywhere, even off-road.",
"params": { "ms": 1400, "mult": 1.5 } },
{ "id": "overdrive", "name": "Overdrive", "type": "status", "desc": "Invincible and faster for a few glorious seconds.",
"params": { "ms": 7000, "mult": 1.2 } },
{ "id": "emp", "name": "EMP", "type": "global", "desc": "Shrinks and slows every other racer. Heavies reboot last.",
"params": { "ms": 4200, "mult": 0.6, "weightExtraMs": 1600 } },
{ "id": "coins", "name": "Coin Pack", "type": "pickup", "desc": "Two coins, straight into the tank.",
"params": { "coins": 2 } }
],
"itemWeights": {
"_note": "One row per item id; 9 columns = race positions 1st..9th. Leaders get defensive scraps, back markers get the comeback tools.",
"byPosition": {
"bolt": [30, 25, 22, 18, 15, 12, 10, 8, 6],
"seeker": [ 0, 18, 20, 22, 22, 20, 16, 12, 8],
"oil": [30, 20, 15, 12, 8, 6, 4, 3, 2],
"turbo": [ 5, 15, 20, 22, 25, 26, 28, 28, 26],
"overdrive": [ 0, 0, 2, 4, 8, 12, 16, 20, 24],
"emp": [ 0, 0, 1, 2, 4, 8, 12, 16, 22],
"coins": [35, 22, 20, 20, 18, 16, 14, 13, 12]
}
},
"pointsTable": [10, 8, 6, 4, 3, 2, 1, 0, 0],
"themes": {
"_note": "Rasterizer palettes + backdrop fallbacks per location theme. Colors are hex strings. fog should match the backdrop's bottom edge so the draw-distance fade lands on it.",
"beach": {
"name": "Sunwash Shore",
"terrain": "#d9b878", "terrainSpeckle": "#c8a55e", "road": "#8a8378", "roadEdge": "#6e685e",
"offroad": "#e6cd90", "deep": "#1d6e9e", "water": "#2b86bd",
"skyTop": "#7ec8e8", "skyBottom": "#ffe9c2", "fog": "#ffe9c2",
"decor": ["palm", "umbrella", "rock"]
},
"volcano": {
"name": "Cinder Peaks",
"terrain": "#4a3230", "terrainSpeckle": "#5c3a32", "road": "#5e5450", "roadEdge": "#453d3a",
"offroad": "#6e4038", "deep": "#e05a1e", "water": "#ff7a28",
"skyTop": "#2a1418", "skyBottom": "#ff9a52", "fog": "#ff9a52",
"decor": ["boulder", "vent", "spire"]
},
"scrapyard": {
"name": "Smasher's Scrapyard",
"terrain": "#6b5f4c", "terrainSpeckle": "#7a6c55", "road": "#71716e", "roadEdge": "#54544f",
"offroad": "#8a7a5e", "deep": "#3a3a36", "water": "#4a5a52",
"skyTop": "#8a92a0", "skyBottom": "#d8c8a8", "fog": "#d8c8a8",
"decor": ["tirepile", "crane", "wreck"]
},
"swamp": {
"name": "Bayou Bend",
"terrain": "#3f5a35", "terrainSpeckle": "#4a6a3c", "road": "#6e6252", "roadEdge": "#524a3e",
"offroad": "#55703e", "deep": "#233a2e", "water": "#3a5f52",
"skyTop": "#5a7a68", "skyBottom": "#c2d0a8", "fog": "#c2d0a8",
"decor": ["cypress", "reeds", "log"]
},
"speedway": {
"name": "Gerome Speedway",
"terrain": "#4a7a42", "terrainSpeckle": "#548a48", "road": "#565b60", "roadEdge": "#3e4246",
"offroad": "#6a9a58", "deep": "#2e2e2e", "water": "#3a6a9a",
"skyTop": "#6ab0e8", "skyBottom": "#e8f0f8", "fog": "#e8f0f8",
"decor": ["grandstand", "billboard", "flagpole"]
},
"nightcity": {
"name": "Blackwind Boulevard",
"terrain": "#1e2230", "terrainSpeckle": "#2a3044", "road": "#3c4048", "roadEdge": "#2a2d33",
"offroad": "#2e3448", "deep": "#101420", "water": "#182a4a",
"skyTop": "#0a0c18", "skyBottom": "#4a3a6a", "fog": "#4a3a6a",
"decor": ["tower", "neon", "lamppost"]
}
}
}