fightbook 1.0.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.
- package/README.md +238 -0
- package/dist/assets/index-C-_XA-_f.js +357 -0
- package/dist/assets/index-DDAi7vIJ.css +1 -0
- package/dist/cli.js +171 -0
- package/dist/cli.js.map +7 -0
- package/dist/engine/FightEngine.js +605 -0
- package/dist/engine/FightEngine.js.map +7 -0
- package/dist/favicon.ico +0 -0
- package/dist/hero-logo.png +0 -0
- package/dist/index.html +33 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +7 -0
- package/dist/placeholder.svg +1 -0
- package/dist/robots.txt +14 -0
- package/dist/types/agent.js +425 -0
- package/dist/types/agent.js.map +7 -0
- package/dist/types/fight.js +71 -0
- package/dist/types/fight.js.map +7 -0
- package/package.json +131 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/types/agent.ts"],
|
|
4
|
+
"sourcesContent": ["// FightBook - Agent Types\n// Full AI Agent configuration and persistence\n\nexport interface AgentPersonality {\n archetype: 'striker' | 'grappler' | 'balanced' | 'wildcard' | 'counter' | 'pressure';\n attitude: string; // \"cocky\", \"humble\", \"intense\", \"calm\"\n preFightQuote: string;\n winQuote: string;\n lossQuote: string;\n fightingPhilosophy: string;\n}\n\nexport interface AgentBackstory {\n origin: string;\n trainingCamp: string;\n signatureMove: string;\n rivalries: string[];\n achievements: string[];\n}\n\nexport interface AgentSocial {\n twitterHandle?: string;\n discordId?: string;\n agentName: string;\n avatarUrl?: string;\n}\n\nexport interface AgentMetadata {\n id: string;\n name: string;\n createdAt: number;\n updatedAt: number;\n version: number;\n totalFights: number;\n wins: number;\n losses: number;\n draws: number;\n kos: number;\n submissions: number;\n currentStreak: number;\n bestStreak: number;\n ranking: number;\n earnings: number;\n xp: number;\n level: number;\n}\n\n// Complete Agent - full configuration combining all parts\nexport interface CompleteAgent {\n metadata: AgentMetadata;\n skills: SkillsMdConfig;\n personality: AgentPersonality;\n backstory: AgentBackstory;\n social: AgentSocial;\n}\n\nexport interface SkillsMdConfig {\n // Identity\n name: string;\n nickname: string;\n \n // Striking\n striking: number; // 0-100\n punchSpeed: number;\n kickPower: number;\n headMovement: number;\n footwork: number;\n combinations: number; // Ability to chain strikes\n \n // Grappling\n wrestling: number;\n takedownDefense: number;\n clinchControl: number;\n trips: number;\n throws: number;\n \n // Ground Game\n submissions: number;\n submissionDefense: number;\n groundAndPound: number;\n guardPassing: number;\n sweeps: number;\n topControl: number;\n bottomGame: number;\n \n // Physical\n cardio: number;\n chin: number;\n recovery: number;\n strength: number;\n flexibility: number;\n \n // Mental\n aggression: number; // 0-1\n fightIQ: number;\n heart: number;\n adaptability: number; // Adjusts strategy mid-fight\n ringGeneralship: number; // Controls pace and space\n \n // Strategy preferences\n preferredRange: 'distance' | 'clinch' | 'ground';\n finishingInstinct: number; // 0-100 likelihood to go for finish\n defensiveTendency: number; // 0-100 likelihood to defend vs attack\n}\n\n// POINT BUDGET SYSTEM - Like FIFA player creation\nexport const POINT_BUDGET = {\n TOTAL: 1200, // Total points to distribute\n MIN_STAT: 20, // Minimum any stat can be\n MAX_STAT: 95, // Maximum any stat can be (can't max everything)\n STARTING_BASE: 30, // Every stat starts at this\n};\n\n// Core stats that consume points (mental stats are free/derived)\nexport const POINT_CONSUMING_STATS: (keyof SkillsMdConfig)[] = [\n 'striking', 'punchSpeed', 'kickPower', 'headMovement', 'footwork', 'combinations',\n 'wrestling', 'takedownDefense', 'clinchControl', 'trips', 'throws',\n 'submissions', 'submissionDefense', 'groundAndPound', 'guardPassing', 'sweeps', \n 'topControl', 'bottomGame', 'cardio', 'chin', 'recovery', 'strength', 'flexibility',\n];\n\nexport const DEFAULT_SKILLS: SkillsMdConfig = {\n name: 'New Agent',\n nickname: 'The Prospect',\n \n striking: 50,\n punchSpeed: 50,\n kickPower: 50,\n headMovement: 50,\n footwork: 50,\n combinations: 50,\n \n wrestling: 50,\n takedownDefense: 50,\n clinchControl: 50,\n trips: 50,\n throws: 50,\n \n submissions: 50,\n submissionDefense: 50,\n groundAndPound: 50,\n guardPassing: 50,\n sweeps: 50,\n topControl: 50,\n bottomGame: 50,\n \n cardio: 50,\n chin: 50,\n recovery: 50,\n strength: 50,\n flexibility: 50,\n \n aggression: 0.5,\n fightIQ: 50,\n heart: 50,\n adaptability: 50,\n ringGeneralship: 50,\n \n preferredRange: 'distance',\n finishingInstinct: 50,\n defensiveTendency: 50,\n};\n\nexport const DEFAULT_PERSONALITY: AgentPersonality = {\n archetype: 'balanced',\n attitude: 'intense',\n preFightQuote: \"I'm here to fight. Let's go.\",\n winQuote: 'Victory belongs to the most prepared.',\n lossQuote: 'I\\'ll be back stronger.',\n fightingPhilosophy: 'Adapt and overcome.',\n};\n\nexport const DEFAULT_BACKSTORY: AgentBackstory = {\n origin: 'Unknown',\n trainingCamp: 'FightBook Academy',\n signatureMove: 'The Haymaker',\n rivalries: [],\n achievements: ['Debut Fight'],\n};\n\nexport const DEFAULT_SOCIAL: AgentSocial = {\n agentName: 'agent007',\n};\n\nexport function createNewAgent(name: string): CompleteAgent {\n const now = Date.now();\n return {\n metadata: {\n id: `agent_${now}_${Math.random().toString(36).substring(7)}`,\n name,\n createdAt: now,\n updatedAt: now,\n version: 1,\n totalFights: 0,\n wins: 0,\n losses: 0,\n draws: 0,\n kos: 0,\n submissions: 0,\n currentStreak: 0,\n bestStreak: 0,\n ranking: 1000,\n earnings: 0,\n xp: 0,\n level: 1,\n },\n skills: { ...DEFAULT_SKILLS, name, nickname: 'The Prospect' },\n personality: { ...DEFAULT_PERSONALITY },\n backstory: { ...DEFAULT_BACKSTORY },\n social: { ...DEFAULT_SOCIAL, agentName: name.toLowerCase().replace(/\\s+/g, '_') },\n };\n}\n\n// Generate full skills.md content\nexport function generateFullSkillsMd(agent: CompleteAgent): string {\n const { skills, personality, backstory } = agent;\n \n return `# ${skills.name} - FightBook Agent Configuration\n# Version: ${agent.metadata.version} | Level: ${agent.metadata.level}\n\n## IDENTITY\nname: ${skills.name}\nnickname: ${skills.nickname}\narchetype: ${personality.archetype}\nattitude: ${personality.attitude}\n\n## STRIKING\nstriking: ${skills.striking}\npunch_speed: ${skills.punchSpeed}\nkick_power: ${skills.kickPower}\nhead_movement: ${skills.headMovement}\nfootwork: ${skills.footwork}\ncombinations: ${skills.combinations}\n\n## GRAPPLING\nwrestling: ${skills.wrestling}\ntakedown_defense: ${skills.takedownDefense}\nclinch_control: ${skills.clinchControl}\ntrips: ${skills.trips}\nthrows: ${skills.throws}\n\n## GROUND GAME\nsubmissions: ${skills.submissions}\nsubmission_defense: ${skills.submissionDefense}\nground_and_pound: ${skills.groundAndPound}\nguard_passing: ${skills.guardPassing}\nsweeps: ${skills.sweeps}\ntop_control: ${skills.topControl}\nbottom_game: ${skills.bottomGame}\n\n## PHYSICAL\ncardio: ${skills.cardio}\nchin: ${skills.chin}\nrecovery: ${skills.recovery}\nstrength: ${skills.strength}\nflexibility: ${skills.flexibility}\n\n## MENTAL\naggression: ${skills.aggression}\nfight_iq: ${skills.fightIQ}\nheart: ${skills.heart}\nadaptability: ${skills.adaptability}\nring_generalship: ${skills.ringGeneralship}\n\n## STRATEGY\npreferred_range: ${skills.preferredRange}\nfinishing_instinct: ${skills.finishingInstinct}\ndefensive_tendency: ${skills.defensiveTendency}\n\n## PERSONALITY\npre_fight_quote: \"${personality.preFightQuote}\"\nwin_quote: \"${personality.winQuote}\"\nloss_quote: \"${personality.lossQuote}\"\nphilosophy: \"${personality.fightingPhilosophy}\"\n\n## BACKSTORY\norigin: ${backstory.origin}\ntraining_camp: ${backstory.trainingCamp}\nsignature_move: ${backstory.signatureMove}\n`;\n}\n\n// Parse skills.md back to agent config\nexport function parseSkillsMd(content: string): Partial<SkillsMdConfig> {\n const skills: Partial<SkillsMdConfig> = {};\n \n const lines = content.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n \n const [key, ...valueParts] = trimmed.split(':');\n if (!key) continue;\n \n const value = valueParts.join(':').trim();\n if (!value) continue;\n \n const numValue = parseFloat(value);\n const isNumber = !isNaN(numValue);\n \n switch (key.toLowerCase()) {\n case 'name': skills.name = value; break;\n case 'nickname': skills.nickname = value; break;\n case 'striking': if (isNumber) skills.striking = numValue; break;\n case 'punch_speed': if (isNumber) skills.punchSpeed = numValue; break;\n case 'kick_power': if (isNumber) skills.kickPower = numValue; break;\n case 'head_movement': if (isNumber) skills.headMovement = numValue; break;\n case 'footwork': if (isNumber) skills.footwork = numValue; break;\n case 'combinations': if (isNumber) skills.combinations = numValue; break;\n case 'wrestling': if (isNumber) skills.wrestling = numValue; break;\n case 'takedown_defense': if (isNumber) skills.takedownDefense = numValue; break;\n case 'clinch_control': if (isNumber) skills.clinchControl = numValue; break;\n case 'trips': if (isNumber) skills.trips = numValue; break;\n case 'throws': if (isNumber) skills.throws = numValue; break;\n case 'submissions': if (isNumber) skills.submissions = numValue; break;\n case 'submission_defense': if (isNumber) skills.submissionDefense = numValue; break;\n case 'ground_and_pound': if (isNumber) skills.groundAndPound = numValue; break;\n case 'guard_passing': if (isNumber) skills.guardPassing = numValue; break;\n case 'sweeps': if (isNumber) skills.sweeps = numValue; break;\n case 'top_control': if (isNumber) skills.topControl = numValue; break;\n case 'bottom_game': if (isNumber) skills.bottomGame = numValue; break;\n case 'cardio': if (isNumber) skills.cardio = numValue; break;\n case 'chin': if (isNumber) skills.chin = numValue; break;\n case 'recovery': if (isNumber) skills.recovery = numValue; break;\n case 'strength': if (isNumber) skills.strength = numValue; break;\n case 'flexibility': if (isNumber) skills.flexibility = numValue; break;\n case 'aggression': if (isNumber) skills.aggression = numValue; break;\n case 'fight_iq': if (isNumber) skills.fightIQ = numValue; break;\n case 'heart': if (isNumber) skills.heart = numValue; break;\n case 'adaptability': if (isNumber) skills.adaptability = numValue; break;\n case 'ring_generalship': if (isNumber) skills.ringGeneralship = numValue; break;\n case 'preferred_range': \n if (['distance', 'clinch', 'ground'].includes(value)) {\n skills.preferredRange = value as 'distance' | 'clinch' | 'ground';\n }\n break;\n case 'finishing_instinct': if (isNumber) skills.finishingInstinct = numValue; break;\n case 'defensive_tendency': if (isNumber) skills.defensiveTendency = numValue; break;\n }\n }\n \n return skills;\n}\n\n// Calculate overall rating\nexport function calculateOverallRating(skills: SkillsMdConfig): number {\n const weights = {\n striking: 1.0,\n punchSpeed: 0.8,\n kickPower: 0.7,\n headMovement: 0.9,\n footwork: 0.8,\n combinations: 0.7,\n wrestling: 1.0,\n takedownDefense: 0.9,\n clinchControl: 0.7,\n trips: 0.5,\n throws: 0.5,\n submissions: 0.9,\n submissionDefense: 0.8,\n groundAndPound: 0.7,\n guardPassing: 0.7,\n sweeps: 0.6,\n topControl: 0.8,\n bottomGame: 0.7,\n cardio: 1.0,\n chin: 1.0,\n recovery: 0.8,\n strength: 0.7,\n flexibility: 0.6,\n fightIQ: 0.9,\n heart: 0.8,\n adaptability: 0.7,\n ringGeneralship: 0.8,\n };\n \n let total = 0;\n let weightSum = 0;\n \n for (const [key, weight] of Object.entries(weights)) {\n const value = skills[key as keyof SkillsMdConfig] as number || 0;\n total += value * weight;\n weightSum += weight;\n }\n \n // Add aggression bonus (0-1 scale to 0-100)\n total += skills.aggression * 50;\n weightSum += 0.5;\n \n return Math.round(total / weightSum);\n}\n\n// Get archetype from skills\nexport function detectArchetype(skills: SkillsMdConfig): AgentPersonality['archetype'] {\n const striking = (skills.striking + skills.punchSpeed + skills.kickPower) / 3;\n const grappling = (skills.wrestling + skills.submissions + skills.topControl + skills.bottomGame) / 4;\n const defense = (skills.headMovement + skills.takedownDefense + skills.submissionDefense) / 3;\n \n if (striking > 70 && grappling < 50) return 'striker';\n if (grappling > 70 && striking < 50) return 'grappler';\n if (defense > 65 && skills.aggression < 0.4) return 'counter';\n if (skills.aggression > 0.8) return 'pressure';\n if (striking > 65 && grappling > 65) return 'balanced';\n return 'wildcard';\n}\n\n// POINT BUDGET SYSTEM - Like FIFA player creation\n\n// Calculate points spent (each point above the base costs 1)\nexport function calculatePointsSpent(skills: SkillsMdConfig): number {\n return POINT_CONSUMING_STATS.reduce((total, stat) => {\n const value = skills[stat] || 0;\n return total + Math.max(0, value - POINT_BUDGET.STARTING_BASE);\n }, 0);\n}\n\n// Calculate points remaining\nexport function calculatePointsRemaining(skills: SkillsMdConfig): number {\n return POINT_BUDGET.TOTAL - calculatePointsSpent(skills);\n}\n\n// Check if a stat can be increased\nexport function canIncreaseStat(skills: SkillsMdConfig, stat: keyof SkillsMdConfig): boolean {\n if (!POINT_CONSUMING_STATS.includes(stat as any)) return true; // Mental stats are free\n const currentValue = skills[stat] || 0;\n if (currentValue >= POINT_BUDGET.MAX_STAT) return false;\n return calculatePointsRemaining(skills) > 0;\n}\n\n// Get budget status with color coding\nexport function getBudgetStatus(skills: SkillsMdConfig): { \n spent: number; \n remaining: number; \n percentUsed: number;\n color: string;\n status: string;\n} {\n const spent = calculatePointsSpent(skills);\n const remaining = POINT_BUDGET.TOTAL - spent;\n const percentUsed = (spent / POINT_BUDGET.TOTAL) * 100;\n \n let color = 'text-green-500';\n let status = 'Balanced';\n \n if (percentUsed > 90) {\n color = 'text-red-500';\n status = 'Maxed';\n } else if (percentUsed > 75) {\n color = 'text-orange-500';\n status = 'High';\n } else if (percentUsed > 50) {\n color = 'text-yellow-500';\n status = 'Medium';\n }\n \n return { spent, remaining, percentUsed, color, status };\n}\n\n// Validate entire skills configuration\nexport function validateSkillsBudget(skills: SkillsMdConfig): { \n valid: boolean; \n errors: string[];\n warnings: string[];\n} {\n const errors: string[] = [];\n const warnings: string[] = [];\n \n const spent = calculatePointsSpent(skills);\n \n if (spent > POINT_BUDGET.TOTAL) {\n errors.push(`Over budget by ${spent - POINT_BUDGET.TOTAL} points`);\n }\n \n POINT_CONSUMING_STATS.forEach(stat => {\n const value = skills[stat as keyof SkillsMdConfig] as number || 0;\n if (value < POINT_BUDGET.MIN_STAT) {\n errors.push(`${stat} is below minimum ${POINT_BUDGET.MIN_STAT}`);\n }\n if (value > POINT_BUDGET.MAX_STAT) {\n errors.push(`${stat} exceeds maximum ${POINT_BUDGET.MAX_STAT}`);\n }\n });\n \n if (spent < POINT_BUDGET.TOTAL * 0.5) {\n warnings.push('You have unspent points - use them or lose them!');\n }\n \n return { valid: errors.length === 0, errors, warnings };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
const STRIKING_TECHNIQUES = [
|
|
2
|
+
{ name: "Jab", type: "strike", baseDamage: 3, staminaCost: 2, accuracy: 0.85, position: ["standing", "clinch"] },
|
|
3
|
+
{ name: "Cross", type: "strike", baseDamage: 6, staminaCost: 3, accuracy: 0.75, position: ["standing", "clinch"] },
|
|
4
|
+
{ name: "Hook", type: "strike", baseDamage: 7, staminaCost: 4, accuracy: 0.7, position: ["standing", "clinch"] },
|
|
5
|
+
{ name: "Uppercut", type: "strike", baseDamage: 8, staminaCost: 4, accuracy: 0.65, position: ["standing", "clinch"] },
|
|
6
|
+
{ name: "Overhand", type: "strike", baseDamage: 10, staminaCost: 5, accuracy: 0.6, position: ["standing"] },
|
|
7
|
+
{ name: "Leg Kick", type: "strike", baseDamage: 6, staminaCost: 4, accuracy: 0.8, position: ["standing"] },
|
|
8
|
+
{ name: "Body Kick", type: "strike", baseDamage: 7, staminaCost: 4, accuracy: 0.75, position: ["standing"] },
|
|
9
|
+
{ name: "Head Kick", type: "strike", baseDamage: 12, staminaCost: 6, accuracy: 0.5, position: ["standing"] },
|
|
10
|
+
{ name: "Superman Punch", type: "strike", baseDamage: 9, staminaCost: 5, accuracy: 0.55, position: ["standing"] },
|
|
11
|
+
{ name: "Spinning Backfist", type: "strike", baseDamage: 11, staminaCost: 6, accuracy: 0.45, position: ["standing"] },
|
|
12
|
+
{ name: "Flying Knee", type: "strike", baseDamage: 13, staminaCost: 7, accuracy: 0.4, position: ["standing"] },
|
|
13
|
+
{ name: "Elbow", type: "elbow", baseDamage: 8, staminaCost: 3, accuracy: 0.7, position: ["clinch", "ground_top"] },
|
|
14
|
+
{ name: "Knee", type: "knee", baseDamage: 9, staminaCost: 4, accuracy: 0.65, position: ["clinch"] }
|
|
15
|
+
];
|
|
16
|
+
const GRAPPLING_TECHNIQUES = [
|
|
17
|
+
{ name: "Single Leg", type: "takedown", baseDamage: 0, staminaCost: 8, accuracy: 0.7, position: ["standing"] },
|
|
18
|
+
{ name: "Double Leg", type: "takedown", baseDamage: 0, staminaCost: 10, accuracy: 0.75, position: ["standing"] },
|
|
19
|
+
{ name: "Body Lock", type: "takedown", baseDamage: 0, staminaCost: 9, accuracy: 0.65, position: ["standing", "clinch"] },
|
|
20
|
+
{ name: "Suplex", type: "takedown", baseDamage: 5, staminaCost: 12, accuracy: 0.5, position: ["clinch"] },
|
|
21
|
+
{ name: "Trip", type: "takedown", baseDamage: 0, staminaCost: 6, accuracy: 0.6, position: ["clinch"] },
|
|
22
|
+
{ name: "Ankle Pick", type: "takedown", baseDamage: 0, staminaCost: 7, accuracy: 0.55, position: ["standing"] }
|
|
23
|
+
];
|
|
24
|
+
const SUBMISSION_TECHNIQUES = [
|
|
25
|
+
{ name: "Rear Naked Choke", type: "submission_attempt", baseDamage: 0, staminaCost: 15, accuracy: 0.35, position: ["ground_top"] },
|
|
26
|
+
{ name: "Guillotine", type: "submission_attempt", baseDamage: 0, staminaCost: 12, accuracy: 0.4, position: ["clinch", "ground_top"] },
|
|
27
|
+
{ name: "Armbar", type: "submission_attempt", baseDamage: 0, staminaCost: 14, accuracy: 0.3, position: ["ground_top"] },
|
|
28
|
+
{ name: "Triangle", type: "submission_attempt", baseDamage: 0, staminaCost: 13, accuracy: 0.35, position: ["ground_bottom"] },
|
|
29
|
+
{ name: "Kimura", type: "submission_attempt", baseDamage: 0, staminaCost: 12, accuracy: 0.35, position: ["ground_top", "ground_bottom"] },
|
|
30
|
+
{ name: "Heel Hook", type: "submission_attempt", baseDamage: 0, staminaCost: 14, accuracy: 0.25, position: ["ground_top"] },
|
|
31
|
+
{ name: "Americana", type: "submission_attempt", baseDamage: 0, staminaCost: 11, accuracy: 0.4, position: ["ground_top"] }
|
|
32
|
+
];
|
|
33
|
+
const GROUND_TECHNIQUES = [
|
|
34
|
+
{ name: "Ground & Pound", type: "ground_pound", baseDamage: 5, staminaCost: 4, accuracy: 0.8, position: ["ground_top"] },
|
|
35
|
+
{ name: "Elbow on Ground", type: "elbow", baseDamage: 7, staminaCost: 3, accuracy: 0.75, position: ["ground_top"] },
|
|
36
|
+
{ name: "Hammer Fist", type: "ground_pound", baseDamage: 4, staminaCost: 2, accuracy: 0.85, position: ["ground_top"] },
|
|
37
|
+
{ name: "Pass Guard", type: "position_advance", baseDamage: 0, staminaCost: 6, accuracy: 0.6, position: ["ground_top"] },
|
|
38
|
+
{ name: "Get Up", type: "position_escape", baseDamage: 0, staminaCost: 8, accuracy: 0.5, position: ["ground_bottom"] },
|
|
39
|
+
{ name: "Sweep", type: "position_escape", baseDamage: 0, staminaCost: 10, accuracy: 0.45, position: ["ground_bottom"] },
|
|
40
|
+
{ name: "Posture Up", type: "position_escape", baseDamage: 0, staminaCost: 5, accuracy: 0.7, position: ["ground_bottom"] }
|
|
41
|
+
];
|
|
42
|
+
const ROUND_DURATION = 180;
|
|
43
|
+
const TOTAL_ROUNDS = 3;
|
|
44
|
+
const DEFAULT_FIGHTER = {
|
|
45
|
+
name: "Unknown Fighter",
|
|
46
|
+
striking: 50,
|
|
47
|
+
punchSpeed: 50,
|
|
48
|
+
kickPower: 50,
|
|
49
|
+
headMovement: 50,
|
|
50
|
+
wrestling: 50,
|
|
51
|
+
takedownDefense: 50,
|
|
52
|
+
submissions: 50,
|
|
53
|
+
submissionDefense: 50,
|
|
54
|
+
groundGame: 50,
|
|
55
|
+
cardio: 50,
|
|
56
|
+
chin: 50,
|
|
57
|
+
recovery: 50,
|
|
58
|
+
aggression: 0.5,
|
|
59
|
+
fightIQ: 50,
|
|
60
|
+
heart: 50
|
|
61
|
+
};
|
|
62
|
+
export {
|
|
63
|
+
DEFAULT_FIGHTER,
|
|
64
|
+
GRAPPLING_TECHNIQUES,
|
|
65
|
+
GROUND_TECHNIQUES,
|
|
66
|
+
ROUND_DURATION,
|
|
67
|
+
STRIKING_TECHNIQUES,
|
|
68
|
+
SUBMISSION_TECHNIQUES,
|
|
69
|
+
TOTAL_ROUNDS
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=fight.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/types/fight.ts"],
|
|
4
|
+
"sourcesContent": ["// FightBook - MMA Combat Types\n\nexport interface FighterStats {\n name: string;\n nickname?: string;\n // Striking\n striking: number; // 0-100: Punch/kick accuracy and power\n punchSpeed: number; // 0-100: Hand speed\n kickPower: number; // 0-100: Leg kick damage\n headMovement: number; // 0-100: Slip/duck/dodge\n \n // Grappling\n wrestling: number; // 0-100: Takedown offense\n takedownDefense: number; // 0-100: Takedown defense\n submissions: number; // 0-100: Sub offense\n submissionDefense: number; // 0-100: Sub defense\n groundGame: number; // 0-100: Ground control/positioning\n \n // Physical\n cardio: number; // 0-100: Stamina pool\n chin: number; // 0-100: Ability to take shots\n recovery: number; // 0-100: Health regen between rounds\n \n // Mental\n aggression: number; // 0-1: Fight pace initiator\n fightIQ: number; // 0-100: Smart decision making\n heart: number; // 0-100: Comeback factor\n}\n\nexport interface FighterState extends FighterStats {\n id: string;\n currentHealth: number; // 0-100\n currentStamina: number; // 0-100\n position: 'standing' | 'clinch' | 'ground_top' | 'ground_bottom';\n hasMount: boolean;\n hasBack: boolean;\n isGrounded: boolean;\n cuts: number; // Facial damage accumulation\n knockdowns: number;\n takedownsLanded: number;\n takedownsAttempted: number;\n significantStrikes: number;\n totalStrikes: number;\n}\n\nexport interface FightAction {\n timestamp: number;\n round: number;\n timeRemaining: number; // Seconds in round\n actor: string;\n target: string;\n type: ActionType;\n technique: Technique;\n success: boolean;\n damage: number;\n staminaCost: number;\n description: string;\n impact?: 'light' | 'moderate' | 'heavy' | 'devastating';\n}\n\nexport type ActionType = \n | 'strike' \n | 'takedown' \n | 'clinch' \n | 'break_clinch'\n | 'submission_attempt'\n | 'submission_escape'\n | 'position_advance'\n | 'position_escape'\n | 'ground_pound'\n | 'elbow'\n | 'knee'\n | 'taunt';\n\nexport interface Technique {\n name: string;\n type: ActionType;\n baseDamage: number;\n staminaCost: number;\n accuracy: number; // 0-1 base accuracy\n position: ('standing' | 'clinch' | 'ground_top' | 'ground_bottom')[];\n}\n\n// MMA Technique Library\nexport const STRIKING_TECHNIQUES: Technique[] = [\n { name: 'Jab', type: 'strike', baseDamage: 3, staminaCost: 2, accuracy: 0.85, position: ['standing', 'clinch'] },\n { name: 'Cross', type: 'strike', baseDamage: 6, staminaCost: 3, accuracy: 0.75, position: ['standing', 'clinch'] },\n { name: 'Hook', type: 'strike', baseDamage: 7, staminaCost: 4, accuracy: 0.70, position: ['standing', 'clinch'] },\n { name: 'Uppercut', type: 'strike', baseDamage: 8, staminaCost: 4, accuracy: 0.65, position: ['standing', 'clinch'] },\n { name: 'Overhand', type: 'strike', baseDamage: 10, staminaCost: 5, accuracy: 0.60, position: ['standing'] },\n { name: 'Leg Kick', type: 'strike', baseDamage: 6, staminaCost: 4, accuracy: 0.80, position: ['standing'] },\n { name: 'Body Kick', type: 'strike', baseDamage: 7, staminaCost: 4, accuracy: 0.75, position: ['standing'] },\n { name: 'Head Kick', type: 'strike', baseDamage: 12, staminaCost: 6, accuracy: 0.50, position: ['standing'] },\n { name: 'Superman Punch', type: 'strike', baseDamage: 9, staminaCost: 5, accuracy: 0.55, position: ['standing'] },\n { name: 'Spinning Backfist', type: 'strike', baseDamage: 11, staminaCost: 6, accuracy: 0.45, position: ['standing'] },\n { name: 'Flying Knee', type: 'strike', baseDamage: 13, staminaCost: 7, accuracy: 0.40, position: ['standing'] },\n { name: 'Elbow', type: 'elbow', baseDamage: 8, staminaCost: 3, accuracy: 0.70, position: ['clinch', 'ground_top'] },\n { name: 'Knee', type: 'knee', baseDamage: 9, staminaCost: 4, accuracy: 0.65, position: ['clinch'] },\n];\n\nexport const GRAPPLING_TECHNIQUES: Technique[] = [\n { name: 'Single Leg', type: 'takedown', baseDamage: 0, staminaCost: 8, accuracy: 0.70, position: ['standing'] },\n { name: 'Double Leg', type: 'takedown', baseDamage: 0, staminaCost: 10, accuracy: 0.75, position: ['standing'] },\n { name: 'Body Lock', type: 'takedown', baseDamage: 0, staminaCost: 9, accuracy: 0.65, position: ['standing', 'clinch'] },\n { name: 'Suplex', type: 'takedown', baseDamage: 5, staminaCost: 12, accuracy: 0.50, position: ['clinch'] },\n { name: 'Trip', type: 'takedown', baseDamage: 0, staminaCost: 6, accuracy: 0.60, position: ['clinch'] },\n { name: 'Ankle Pick', type: 'takedown', baseDamage: 0, staminaCost: 7, accuracy: 0.55, position: ['standing'] },\n];\n\nexport const SUBMISSION_TECHNIQUES: Technique[] = [\n { name: 'Rear Naked Choke', type: 'submission_attempt', baseDamage: 0, staminaCost: 15, accuracy: 0.35, position: ['ground_top'] },\n { name: 'Guillotine', type: 'submission_attempt', baseDamage: 0, staminaCost: 12, accuracy: 0.40, position: ['clinch', 'ground_top'] },\n { name: 'Armbar', type: 'submission_attempt', baseDamage: 0, staminaCost: 14, accuracy: 0.30, position: ['ground_top'] },\n { name: 'Triangle', type: 'submission_attempt', baseDamage: 0, staminaCost: 13, accuracy: 0.35, position: ['ground_bottom'] },\n { name: 'Kimura', type: 'submission_attempt', baseDamage: 0, staminaCost: 12, accuracy: 0.35, position: ['ground_top', 'ground_bottom'] },\n { name: 'Heel Hook', type: 'submission_attempt', baseDamage: 0, staminaCost: 14, accuracy: 0.25, position: ['ground_top'] },\n { name: 'Americana', type: 'submission_attempt', baseDamage: 0, staminaCost: 11, accuracy: 0.40, position: ['ground_top'] },\n];\n\nexport const GROUND_TECHNIQUES: Technique[] = [\n { name: 'Ground & Pound', type: 'ground_pound', baseDamage: 5, staminaCost: 4, accuracy: 0.80, position: ['ground_top'] },\n { name: 'Elbow on Ground', type: 'elbow', baseDamage: 7, staminaCost: 3, accuracy: 0.75, position: ['ground_top'] },\n { name: 'Hammer Fist', type: 'ground_pound', baseDamage: 4, staminaCost: 2, accuracy: 0.85, position: ['ground_top'] },\n { name: 'Pass Guard', type: 'position_advance', baseDamage: 0, staminaCost: 6, accuracy: 0.60, position: ['ground_top'] },\n { name: 'Get Up', type: 'position_escape', baseDamage: 0, staminaCost: 8, accuracy: 0.50, position: ['ground_bottom'] },\n { name: 'Sweep', type: 'position_escape', baseDamage: 0, staminaCost: 10, accuracy: 0.45, position: ['ground_bottom'] },\n { name: 'Posture Up', type: 'position_escape', baseDamage: 0, staminaCost: 5, accuracy: 0.70, position: ['ground_bottom'] },\n];\n\nexport interface RoundState {\n round: number;\n timeRemaining: number; // 180 seconds for 3-min rounds\n isActive: boolean;\n actions: FightAction[];\n}\n\nexport interface FightState {\n id: string;\n fighter1: FighterState;\n fighter2: FighterState;\n currentRound: number;\n rounds: RoundState[];\n winner?: string;\n method?: 'KO' | 'TKO' | 'SUB' | 'DEC' | 'DRAW';\n endRound?: number;\n endTime?: number;\n isComplete: boolean;\n}\n\nexport const ROUND_DURATION = 180; // 3 minutes in seconds\nexport const TOTAL_ROUNDS = 3; // Standard 3-round fight\n\nexport const DEFAULT_FIGHTER: FighterStats = {\n name: 'Unknown Fighter',\n striking: 50,\n punchSpeed: 50,\n kickPower: 50,\n headMovement: 50,\n wrestling: 50,\n takedownDefense: 50,\n submissions: 50,\n submissionDefense: 50,\n groundGame: 50,\n cardio: 50,\n chin: 50,\n recovery: 50,\n aggression: 0.5,\n fightIQ: 50,\n heart: 50,\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "fightbook",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "AI Combat Arena - Configure fighters with skills.md, simulate MMA combat in real-time",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./cli": "./dist/cli.js"
|
|
14
|
+
},
|
|
15
|
+
"bin": {
|
|
16
|
+
"fightbook": "./dist/cli.js"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"dev": "vite",
|
|
24
|
+
"build": "vite build && npm run build:lib",
|
|
25
|
+
"build:dev": "vite build --mode development",
|
|
26
|
+
"build:lib": "tsc --declaration --emitDeclarationOnly --outDir dist && node scripts/build-lib.js",
|
|
27
|
+
"lint": "eslint .",
|
|
28
|
+
"preview": "vite preview",
|
|
29
|
+
"test": "vitest run",
|
|
30
|
+
"test:watch": "vitest",
|
|
31
|
+
"prepublishOnly": "npm run build"
|
|
32
|
+
},
|
|
33
|
+
"keywords": [
|
|
34
|
+
"ai",
|
|
35
|
+
"combat",
|
|
36
|
+
"mma",
|
|
37
|
+
"simulation",
|
|
38
|
+
"skills.md",
|
|
39
|
+
"agents",
|
|
40
|
+
"fighting",
|
|
41
|
+
"game",
|
|
42
|
+
"typescript"
|
|
43
|
+
],
|
|
44
|
+
"author": "FightBook",
|
|
45
|
+
"license": "MIT",
|
|
46
|
+
"repository": {
|
|
47
|
+
"type": "git",
|
|
48
|
+
"url": "https://github.com/resided/fightbook.git"
|
|
49
|
+
},
|
|
50
|
+
"bugs": {
|
|
51
|
+
"url": "https://github.com/resided/fightbook/issues"
|
|
52
|
+
},
|
|
53
|
+
"homepage": "https://fightbook.xyz",
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@hookform/resolvers": "^3.10.0",
|
|
56
|
+
"@radix-ui/react-accordion": "^1.2.11",
|
|
57
|
+
"@radix-ui/react-alert-dialog": "^1.1.14",
|
|
58
|
+
"@radix-ui/react-aspect-ratio": "^1.1.7",
|
|
59
|
+
"@radix-ui/react-avatar": "^1.1.10",
|
|
60
|
+
"@radix-ui/react-checkbox": "^1.3.2",
|
|
61
|
+
"@radix-ui/react-collapsible": "^1.1.11",
|
|
62
|
+
"@radix-ui/react-context-menu": "^2.2.15",
|
|
63
|
+
"@radix-ui/react-dialog": "^1.1.14",
|
|
64
|
+
"@radix-ui/react-dropdown-menu": "^2.1.15",
|
|
65
|
+
"@radix-ui/react-hover-card": "^1.1.14",
|
|
66
|
+
"@radix-ui/react-label": "^2.1.7",
|
|
67
|
+
"@radix-ui/react-menubar": "^1.1.15",
|
|
68
|
+
"@radix-ui/react-navigation-menu": "^1.2.13",
|
|
69
|
+
"@radix-ui/react-popover": "^1.1.14",
|
|
70
|
+
"@radix-ui/react-progress": "^1.1.7",
|
|
71
|
+
"@radix-ui/react-radio-group": "^1.3.7",
|
|
72
|
+
"@radix-ui/react-scroll-area": "^1.2.9",
|
|
73
|
+
"@radix-ui/react-select": "^2.2.5",
|
|
74
|
+
"@radix-ui/react-separator": "^1.1.7",
|
|
75
|
+
"@radix-ui/react-slider": "^1.3.5",
|
|
76
|
+
"@radix-ui/react-slot": "^1.2.3",
|
|
77
|
+
"@radix-ui/react-switch": "^1.2.5",
|
|
78
|
+
"@radix-ui/react-tabs": "^1.1.12",
|
|
79
|
+
"@radix-ui/react-toast": "^1.2.14",
|
|
80
|
+
"@radix-ui/react-toggle": "^1.1.9",
|
|
81
|
+
"@radix-ui/react-toggle-group": "^1.1.10",
|
|
82
|
+
"@radix-ui/react-tooltip": "^1.2.7",
|
|
83
|
+
"@supabase/supabase-js": "^2.97.0",
|
|
84
|
+
"@tanstack/react-query": "^5.83.0",
|
|
85
|
+
"class-variance-authority": "^0.7.1",
|
|
86
|
+
"clsx": "^2.1.1",
|
|
87
|
+
"cmdk": "^1.1.1",
|
|
88
|
+
"date-fns": "^3.6.0",
|
|
89
|
+
"embla-carousel-react": "^8.6.0",
|
|
90
|
+
"framer-motion": "^12.34.1",
|
|
91
|
+
"input-otp": "^1.4.2",
|
|
92
|
+
"lucide-react": "^0.462.0",
|
|
93
|
+
"next-themes": "^0.3.0",
|
|
94
|
+
"react": "^18.3.1",
|
|
95
|
+
"react-day-picker": "^8.10.1",
|
|
96
|
+
"react-dom": "^18.3.1",
|
|
97
|
+
"react-hook-form": "^7.61.1",
|
|
98
|
+
"react-resizable-panels": "^2.1.9",
|
|
99
|
+
"react-router-dom": "^6.30.1",
|
|
100
|
+
"recharts": "^2.15.4",
|
|
101
|
+
"sonner": "^1.7.4",
|
|
102
|
+
"tailwind-merge": "^2.6.0",
|
|
103
|
+
"tailwindcss-animate": "^1.0.7",
|
|
104
|
+
"vaul": "^0.9.9",
|
|
105
|
+
"zod": "^3.25.76"
|
|
106
|
+
},
|
|
107
|
+
"devDependencies": {
|
|
108
|
+
"@eslint/js": "^9.32.0",
|
|
109
|
+
"@tailwindcss/typography": "^0.5.16",
|
|
110
|
+
"@testing-library/jest-dom": "^6.6.0",
|
|
111
|
+
"@testing-library/react": "^16.0.0",
|
|
112
|
+
"@types/node": "^22.16.5",
|
|
113
|
+
"@types/react": "^18.3.23",
|
|
114
|
+
"@types/react-dom": "^18.3.7",
|
|
115
|
+
"@vercel/node": "^5.6.6",
|
|
116
|
+
"@vitejs/plugin-react-swc": "^3.11.0",
|
|
117
|
+
"autoprefixer": "^10.4.21",
|
|
118
|
+
"esbuild": "^0.27.3",
|
|
119
|
+
"eslint": "^9.32.0",
|
|
120
|
+
"eslint-plugin-react-hooks": "^5.2.0",
|
|
121
|
+
"eslint-plugin-react-refresh": "^0.4.20",
|
|
122
|
+
"globals": "^15.15.0",
|
|
123
|
+
"jsdom": "^20.0.3",
|
|
124
|
+
"postcss": "^8.5.6",
|
|
125
|
+
"tailwindcss": "^3.4.17",
|
|
126
|
+
"typescript": "^5.8.3",
|
|
127
|
+
"typescript-eslint": "^8.38.0",
|
|
128
|
+
"vite": "^5.4.19",
|
|
129
|
+
"vitest": "^3.2.4"
|
|
130
|
+
}
|
|
131
|
+
}
|