diff --git a/src/App.jsx b/src/App.jsx
index deb13b3..3fe49e1 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -74,6 +74,8 @@ items.forEach(i => { itemMap[i.id] = i })
const weaponMap = {}
weapons.forEach(w => { weaponMap[w.id] = w })
+weaponMap['left_arm'] = { id: 'left_arm', name: 'Left Arm', damage: 35, condition: 100, maxCondition: 100, passives: ['Brawler'], weight: 0, speed: 14, skills: [{ name: 'Jab', mult: 1.0, damageType: 'blunt', range: 12 }, { name: 'Hook', mult: 1.3, damageType: 'blunt', range: 12 }, { name: 'Kick', mult: 1.5, damageType: 'blunt', range: 14 }, { name: 'Shove', mult: 0, damageType: 'shove', range: 10 }] }
+weaponMap['right_arm'] = { id: 'right_arm', name: 'Right Arm', damage: 35, condition: 100, maxCondition: 100, passives: ['Brawler'], weight: 0, speed: 14, skills: [{ name: 'Jab', mult: 1.0, damageType: 'blunt', range: 12 }, { name: 'Hook', mult: 1.3, damageType: 'blunt', range: 12 }, { name: 'Kick', mult: 1.5, damageType: 'blunt', range: 14 }, { name: 'Shove', mult: 0, damageType: 'shove', range: 10 }] }
const MAX_BODY = { head: 100, torso: 100, leftArm: 100, rightArm: 100, leftLeg: 100, rightLeg: 100 }
const MAX_HP = Object.values(MAX_BODY).reduce((a, b) => a + b, 0)
@@ -245,6 +247,8 @@ function App() {
const [limbSelect, setLimbSelect] = useState(null)
const [selectedTarget, setSelectedTarget] = useState(null)
const [selectedSkill, setSelectedSkill] = useState(null)
+ const [hoveredSkill, setHoveredSkill] = useState(null)
+ const [hoveredEnemy, setHoveredEnemy] = useState(null)
const [selectedEnemy, setSelectedEnemy] = useState(0)
const [targetEnemy, setTargetEnemy] = useState(null)
const [attackEnemy, setAttackEnemy] = useState(null)
@@ -1017,57 +1021,52 @@ function App() {
)}
{limbSelect && (
-
cancelAttack()} style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: 0 }}>
+
cancelAttack()} style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', gap: 8 }}>
e.stopPropagation()}>
-
{(() => {
const weapId = limbSelect
- const isArm = weapId === 'left_arm' || weapId === 'right_arm'
- const weapon = !isArm ? weaponMap[weapId] : null
- const weaponName = isArm ? (weapId === 'left_arm' ? 'Left Arm' : 'Right Arm') : (weapon?.name ?? weapId)
+ const weapon = weaponMap[weapId]
+ const weaponName = weapon?.name ?? weapId
const skills = weapon?.skills ?? []
- if (isArm && !selectedSkill) selectSkill('Punch')
return (
- <>
+
{weaponName}
- {!selectedSkill && skills.length > 0 ? (
-
-
Select Skill
-
- {skills.map((skill, i) => (
-
- ))}
+
+ {skills.length > 0 && (
+
+
Select Skill
+
+ {skills.map((skill, i) => (
+
+ ))}
+
-
- ) : selectedSkill && attackEnemy === null ? (
-
-
Select Enemy
-
- {(combat?.enemies || []).map((enemy, i) => (
-
- ))}
-
-
- ) : (
-
-
- {skills.length > 0 && selectedSkill && (
-
Skill: {selectedSkill}
- )}
- {attackEnemy !== null && combat?.enemies[attackEnemy] && (
-
Target: {combat.enemies[attackEnemy].name}
- )}
- {isArm && (
-
A weak unarmed punch (DMG: 10)
- )}
+ )}
+ {selectedSkill && (
+
+
Select Enemy
+
+ {(combat?.enemies || []).map((enemy, i) => {
+ const inRange = canAttack(limbSelect, selectedSkill, i)
+ return (
+
+ )
+ })}
+
+ )}
+ {attackEnemy !== null && (
Limb
@@ -1092,18 +1091,82 @@ function App() {
})}
+ )}
+
+ {skills.length > 0 && (
+
+ {(() => {
+ if (!selectedSkill && skills.length > 0) {
+ const sName = hoveredSkill
+ const s = skills.find(x => x.name === sName)
+ if (!s) return null
+ const descs = { blunt: 'Blunt force trauma', slash: 'Slashing cut', pierce: 'Piercing strike', shove: 'Knocks the target back' }
+ return (
+ <>
+
+
{s.name}
+
{descs[s.damageType] || s.damageType} attack
+
+
+
Damage: {Math.round((weapon?.damage ?? 0) * s.mult)}
+
Multiplier: {s.mult}x
+
Type: {s.damageType}
+
Range: {s.range}
+
+ >
+ )
+ }
+ if (selectedSkill && attackEnemy === null) {
+ const ei = hoveredEnemy
+ const e = ei !== null && combat?.enemies[ei]
+ if (!e) return null
+ return (
+ <>
+
+
+
HP: {Object.values(e.integrity).reduce((a, b) => a + b, 0)}
+
Head: {e.integrity.head}
+
Torso: {e.integrity.torso}
+
L.Arm: {e.integrity.larm}
+
R.Arm: {e.integrity.rarm}
+
L.Leg: {e.integrity.lleg}
+
R.Leg: {e.integrity.rleg}
+
+ >
+ )
+ }
+ if (selectedSkill && attackEnemy !== null) {
+ const e = combat?.enemies[attackEnemy]
+ const limbKeyMap = { torso: 'torso', head: 'head', leftArm: 'larm', rightArm: 'rarm', leftLeg: 'lleg', rightLeg: 'rleg' }
+ const limbKey = selectedTarget ? (limbKeyMap[selectedTarget] || selectedTarget) : null
+ const hp = limbKey && e ? e.integrity[limbKey] : null
+ return (
+ <>
+
+
{e?.name || ''}
+
Target limb: {selectedTarget || 'None'}
+
+
+
Limb HP: {hp !== null ? hp : '-'}
+
+ >
+ )
+ }
+ return null
+ })()}
+
+ )}
- )}
- >
- )
- })()}
+ )})()}
+
+
+
+
- {selectedTarget && (
-
-
-
-
- )}
)}