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 ( + <> +
+
{e.name}
+
+
+
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 && ( -
- - -
- )}
)}