From eb75ee5b3355dca6a483c6d6c7f082298b2dd87c Mon Sep 17 00:00:00 2001 From: Joan Date: Sat, 7 Feb 2026 22:00:14 +0100 Subject: [PATCH] feat: Implement Inventory Grid View and GameButton --- pwa/public/audio/audios.txt | 2 + pwa/public/audio/sfx/step.wav | Bin 0 -> 192078 bytes pwa/src/components/Game.css | 250 ++++++------ pwa/src/components/Game.tsx | 1 + pwa/src/components/GameHeader.css | 14 +- pwa/src/components/common/GameButton.css | 117 ++++++ pwa/src/components/common/GameButton.tsx | 38 ++ pwa/src/components/common/GameDropdown.css | 97 +++++ pwa/src/components/common/GameDropdown.tsx | 99 +++++ pwa/src/components/common/GameTooltip.tsx | 2 +- pwa/src/components/game/Combat.tsx | 20 +- pwa/src/components/game/CombatEffects.css | 19 +- .../components/game/CombatInventoryModal.css | 12 +- pwa/src/components/game/CombatView.tsx | 52 ++- pwa/src/components/game/InventoryModal.css | 216 ++++++++-- pwa/src/components/game/InventoryModal.tsx | 372 +++++++++++++++++- pwa/src/components/game/LocationView.tsx | 20 +- pwa/src/components/game/PlayerSidebar.tsx | 16 - pwa/src/components/game/Workbench.css | 13 +- pwa/src/components/game/game_pickup.css | 4 +- .../components/game/hooks/useGameEngine.ts | 50 ++- pwa/src/index.css | 3 +- 22 files changed, 1161 insertions(+), 256 deletions(-) create mode 100644 pwa/public/audio/sfx/step.wav create mode 100644 pwa/src/components/common/GameButton.css create mode 100644 pwa/src/components/common/GameButton.tsx create mode 100644 pwa/src/components/common/GameDropdown.css create mode 100644 pwa/src/components/common/GameDropdown.tsx diff --git a/pwa/public/audio/audios.txt b/pwa/public/audio/audios.txt index 962ea36..e1416a5 100644 --- a/pwa/public/audio/audios.txt +++ b/pwa/public/audio/audios.txt @@ -10,6 +10,8 @@ hit.wav (When anyone takes damage) victory.wav (Combat won) defeat.wav (Combat lost) flee.wav (Successfully ran away) +step.wav (Movement between locations) + Combat - Player Weapons The system detects keywords in the weapon name to pick the sound. If no match is found, it plays the default. diff --git a/pwa/public/audio/sfx/step.wav b/pwa/public/audio/sfx/step.wav new file mode 100644 index 0000000000000000000000000000000000000000..4f81ee41ff53fb7da8a16e67147eea40dbc4533e GIT binary patch literal 192078 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%0A8H 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 await actions.handleCraft(itemId.toString())} onRepair={(uniqueItemId: string, inventoryId: number) => actions.handleRepairFromMenu(Number(uniqueItemId), inventoryId)} onUncraft={(uniqueItemId: string, inventoryId: number) => actions.handleUncraft(Number(uniqueItemId), inventoryId)} + failedActionItemId={state.failedActionItemId} /> )} diff --git a/pwa/src/components/GameHeader.css b/pwa/src/components/GameHeader.css index 19c3d67..6bfdbbf 100644 --- a/pwa/src/components/GameHeader.css +++ b/pwa/src/components/GameHeader.css @@ -32,7 +32,7 @@ background: linear-gradient(135deg, rgba(225, 29, 72, 0.1) 0%, transparent 100%); border: 1px solid rgba(225, 29, 72, 0.3); /* Angled Cut */ - clip-path: polygon(15px 0, 100% 0, 100% 100%, 0 100%, 0 15px); + clip-path: var(--game-clip-path); border-left: 3px solid var(--game-color-primary); position: relative; } @@ -85,7 +85,7 @@ justify-content: center; gap: 0.5rem; /* Tech Shape: Angled top-left and bottom-right */ - clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px); + clip-path: var(--game-clip-path); position: relative; } @@ -132,7 +132,7 @@ padding: 0 12px; background-color: rgba(0, 0, 0, 0.6); border: 1px solid rgba(76, 209, 55, 0.3); - clip-path: polygon(8px 0, 100% 0, 100% 100%, 0 100%, 0 8px); + clip-path: var(--game-clip-path-sm); font-size: 0.8rem; color: #aaddaa; font-family: monospace; @@ -177,7 +177,7 @@ font-weight: 700; transition: all 0.2s; /* Same tech shape */ - clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px); + clip-path: var(--game-clip-path-sm); text-transform: uppercase; display: flex; align-items: center; @@ -209,7 +209,7 @@ font-size: 1rem; transition: all 0.2s; /* Angled corners */ - clip-path: polygon(6px 0, 100% 0, 100% calc(100% - 6px), calc(100% - 6px) 100%, 0 100%, 0 6px); + clip-path: var(--game-clip-path-sm); } .header-icon-btn:hover { @@ -223,7 +223,7 @@ .game-header .language-btn { height: 36px; border-radius: 0; - clip-path: polygon(6px 0, 100% 0, 100% calc(100% - 6px), calc(100% - 6px) 100%, 0 100%, 0 6px); + clip-path: var(--game-clip-path-sm); background: rgba(255, 255, 255, 0.03); border: 1px solid rgba(255, 255, 255, 0.15); } @@ -237,7 +237,7 @@ border-radius: 0; border: 1px solid var(--game-border-color); background: rgba(10, 10, 15, 0.95); - clip-path: polygon(0 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%); + clip-path: var(--game-clip-path); } /* Separator line */ diff --git a/pwa/src/components/common/GameButton.css b/pwa/src/components/common/GameButton.css new file mode 100644 index 0000000..6ddff7e --- /dev/null +++ b/pwa/src/components/common/GameButton.css @@ -0,0 +1,117 @@ +.game-btn { + border: none; + color: white; + cursor: pointer; + font-weight: 600; + font-family: var(--game-font-main); + transition: all 0.2s ease; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.5rem; + clip-path: var(--game-clip-path-sm); + text-transform: uppercase; + letter-spacing: 0.5px; + position: relative; + overflow: hidden; +} + +.game-btn:disabled { + opacity: 0.6; + cursor: not-allowed; + filter: grayscale(0.8); +} + +.game-btn:not(:disabled):hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); +} + +.game-btn:not(:disabled):active { + transform: translateY(0); +} + +/* Sizes */ +.game-btn.sm { + padding: 0.3rem 0.6rem; + font-size: 0.8rem; +} + +.game-btn.md { + padding: 0.5rem 1rem; + font-size: 0.9rem; +} + +.game-btn.lg { + padding: 0.8rem 1.5rem; + font-size: 1rem; +} + +/* Variants */ + +/* Primary - Blue (Default) */ +.game-btn.primary { + background: linear-gradient(135deg, #6bb9f0, #89d4ff); + box-shadow: 0 2px 8px rgba(107, 185, 240, 0.3); +} + +.game-btn.primary:not(:disabled):hover { + background: linear-gradient(135deg, #89d4ff, #6bb9f0); + box-shadow: 0 4px 12px rgba(107, 185, 240, 0.5); +} + +/* Secondary - Grey/Dark */ +.game-btn.secondary { + background: linear-gradient(135deg, #4a5568, #718096); + box-shadow: 0 2px 8px rgba(74, 85, 104, 0.3); + color: #e2e8f0; +} + +.game-btn.secondary:not(:disabled):hover { + background: linear-gradient(135deg, #718096, #4a5568); + box-shadow: 0 4px 12px rgba(74, 85, 104, 0.5); +} + +/* Success - Green */ +.game-btn.success { + background: linear-gradient(135deg, #4caf50, #66bb6a); + box-shadow: 0 2px 8px rgba(76, 175, 80, 0.3); +} + +.game-btn.success:not(:disabled):hover { + background: linear-gradient(135deg, #66bb6a, #4caf50); + box-shadow: 0 4px 12px rgba(76, 175, 80, 0.5); +} + +/* Danger - Red */ +.game-btn.danger { + background: linear-gradient(135deg, #f44336, #ef5350); + box-shadow: 0 2px 8px rgba(244, 67, 54, 0.3); +} + +.game-btn.danger:not(:disabled):hover { + background: linear-gradient(135deg, #ef5350, #f44336); + box-shadow: 0 4px 12px rgba(244, 67, 54, 0.5); +} + +/* Info - Cyan/Teal (Equip/Unequip often uses this) */ +.game-btn.info { + background: linear-gradient(135deg, #00bcd4, #26c6da); + box-shadow: 0 2px 8px rgba(0, 188, 212, 0.3); +} + +.game-btn.info:not(:disabled):hover { + background: linear-gradient(135deg, #26c6da, #00bcd4); + box-shadow: 0 4px 12px rgba(0, 188, 212, 0.5); +} + +/* Warning - Orange/Yellow */ +.game-btn.warning { + background: linear-gradient(135deg, #ff9800, #ffa726); + box-shadow: 0 2px 8px rgba(255, 152, 0, 0.3); +} + +.game-btn.warning:not(:disabled):hover { + background: linear-gradient(135deg, #ffa726, #ff9800); + box-shadow: 0 4px 12px rgba(255, 152, 0, 0.5); +} \ No newline at end of file diff --git a/pwa/src/components/common/GameButton.tsx b/pwa/src/components/common/GameButton.tsx new file mode 100644 index 0000000..70a06dd --- /dev/null +++ b/pwa/src/components/common/GameButton.tsx @@ -0,0 +1,38 @@ +import React, { ReactNode } from 'react'; +import './GameButton.css'; + +interface GameButtonProps { + children: ReactNode; + onClick?: (e: React.MouseEvent) => void; + variant?: 'primary' | 'secondary' | 'success' | 'danger' | 'info' | 'warning'; + size?: 'sm' | 'md' | 'lg'; + disabled?: boolean; + className?: string; + style?: React.CSSProperties; +} + +export const GameButton: React.FC = ({ + children, + onClick, + variant = 'primary', + size = 'md', + disabled = false, + className = '', + style +}) => { + const handleClick = (e: React.MouseEvent) => { + if (disabled) return; + if (onClick) onClick(e); + }; + + return ( + + ); +}; diff --git a/pwa/src/components/common/GameDropdown.css b/pwa/src/components/common/GameDropdown.css new file mode 100644 index 0000000..8fc09b8 --- /dev/null +++ b/pwa/src/components/common/GameDropdown.css @@ -0,0 +1,97 @@ +.game-dropdown-menu { + position: fixed; + z-index: 10000; + background: var(--game-bg-panel, #1a202c); + border: 1px solid var(--game-border-color, #4a5568); + box-shadow: var(--game-shadow-modal, 0 10px 15px -3px rgba(0, 0, 0, 0.5)); + padding: 0.5rem; + display: flex; + flex-direction: column; + gap: 0.25rem; + clip-path: var(--game-clip-path); + animation: dropdownFadeIn 0.1s ease-out; + max-height: 300px; + overflow-y: auto; +} + +@keyframes dropdownFadeIn { + from { + opacity: 0; + transform: translateY(-5px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +.game-dropdown-item { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.6rem 0.8rem; + background: transparent; + border: none; + color: var(--game-text-secondary, #a0aec0); + cursor: pointer; + font-size: 0.9rem; + font-weight: 500; + text-align: left; + transition: all 0.2s; + border-radius: 4px; + /* Optional if not using clip-path on items */ + width: 100%; +} + +.game-dropdown-item:hover { + background: rgba(255, 255, 255, 0.08); + color: var(--game-text-primary, #fff); +} + +.game-dropdown-item:disabled { + opacity: 0.5; + cursor: not-allowed; + background: transparent; +} + +.game-dropdown-item.danger { + color: #f56565; +} + +.game-dropdown-item.danger:hover { + background: rgba(245, 101, 101, 0.15); +} + +.game-dropdown-item.success { + color: #48bb78; +} + +.game-dropdown-item.success:hover { + background: rgba(72, 187, 120, 0.15); +} + +.game-dropdown-item.info { + color: #4299e1; +} + +.game-dropdown-item.info:hover { + background: rgba(66, 153, 225, 0.15); +} + +.game-dropdown-divider { + height: 1px; + background: var(--game-border-color, #4a5568); + margin: 0.25rem 0; +} + +.game-dropdown-header { + padding: 0.5rem 0.8rem; + font-size: 0.75rem; + font-weight: 600; + color: var(--game-text-muted, #718096); + text-transform: uppercase; + letter-spacing: 0.05em; + border-bottom: 1px solid var(--game-border-color, #4a5568); + margin-bottom: 0.25rem; +} \ No newline at end of file diff --git a/pwa/src/components/common/GameDropdown.tsx b/pwa/src/components/common/GameDropdown.tsx new file mode 100644 index 0000000..a80a20e --- /dev/null +++ b/pwa/src/components/common/GameDropdown.tsx @@ -0,0 +1,99 @@ +import React, { useEffect, useRef } from 'react'; +import { createPortal } from 'react-dom'; +import './GameDropdown.css'; + +interface GameDropdownProps { + isOpen: boolean; + onClose: () => void; + position: { x: number; y: number }; + children: React.ReactNode; + className?: string; + width?: string; +} + +/** + * GameDropdown + * + * A reusable dropdown component that renders outside the DOM hierarchy + * to avoid z-index/overflow issues. + * Closes when clicking outside. + */ +export const GameDropdown: React.FC = ({ + isOpen, + onClose, + position, + children, + className = '', + width = '200px' +}) => { + const dropdownRef = useRef(null); + + // Handle click outside + useEffect(() => { + if (!isOpen) return; + + const handleClickOutside = (event: MouseEvent) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { + onClose(); + } + }; + + // Use mousedown to catch clicks before they might trigger other things + document.addEventListener('mousedown', handleClickOutside); + + // Handle scroll to update position or close? + // For now, simpler to just close on scroll or let it float (fixed pos) + const handleScroll = () => { + // Optional: onClose(); + }; + window.addEventListener('scroll', handleScroll, true); + + return () => { + document.removeEventListener('mousedown', handleClickOutside); + window.removeEventListener('scroll', handleScroll, true); + }; + }, [isOpen, onClose]); + + if (!isOpen) return null; + + // Adjust position to keep within viewport + let { x, y } = position; + + // Simple adjustment logic (can be improved with measuring ref) + // We'll trust the parent passed reasonable coords, but ensure it doesn't go off-screen right/bottom + if (typeof window !== 'undefined') { + const viewportWidth = window.innerWidth; + const viewportHeight = window.innerHeight; + + // Approximate width if not measured yet (or use min-width) + const estimatedWidth = parseInt(width) || 200; + const estimatedHeight = 200; // Guess for now + + if (x + estimatedWidth > viewportWidth) { + x = viewportWidth - estimatedWidth - 10; + } + + if (y + estimatedHeight > viewportHeight) { + // Flip up if space + y = y - estimatedHeight; + // Or just limit to bottom + if (y < 0) y = 10; + } + } + + return createPortal( +

, + document.body + ); +}; diff --git a/pwa/src/components/common/GameTooltip.tsx b/pwa/src/components/common/GameTooltip.tsx index 08fae6d..e11e1c5 100644 --- a/pwa/src/components/common/GameTooltip.tsx +++ b/pwa/src/components/common/GameTooltip.tsx @@ -73,7 +73,7 @@ export const GameTooltip: React.FC = ({ content, children, cla
= ({ } } - // Handle combat_over from WebSocket - if (initialCombatData?.combat_over) { - const pvp = initialCombatData?.pvp_combat; - const myId = pvp?.is_attacker - ? pvp?.attacker?.id - : pvp?.defender?.id; + // Handle combat_over from WebSocket or initial state (including fled states which might not set combat_over flag explicitly in all paths) + const pvp = initialCombatData?.pvp_combat; + const myId = pvp?.is_attacker + ? pvp?.attacker?.id + : pvp?.defender?.id; - // Check if someone fled - const iAmAttacker = pvp?.is_attacker; - const opponentFled = iAmAttacker ? pvp?.defender_fled : pvp?.attacker_fled; - const iFled = iAmAttacker ? pvp?.attacker_fled : pvp?.defender_fled; + // Check if someone fled (Robust check for both combat_over=true AND implicit state) + const iAmAttacker = pvp?.is_attacker; + const opponentFled = iAmAttacker ? pvp?.defender_fled : pvp?.attacker_fled; + const iFled = iAmAttacker ? pvp?.attacker_fled : pvp?.defender_fled; + if (initialCombatData?.combat_over || opponentFled || iFled) { if (opponentFled) { // Opponent fled - I "win" by default setCombatResult('victory'); diff --git a/pwa/src/components/game/CombatEffects.css b/pwa/src/components/game/CombatEffects.css index 2c2c26d..595694f 100644 --- a/pwa/src/components/game/CombatEffects.css +++ b/pwa/src/components/game/CombatEffects.css @@ -7,11 +7,11 @@ /* More transparent/themed background */ background: rgba(20, 20, 20, 0.6); backdrop-filter: blur(5px); - border-radius: 12px; padding: 1rem; color: white; position: relative; - overflow: hidden; + /* overflow: hidden; Removed to allow floating text to be seen */ + clip-path: var(--game-clip-path); border: 1px solid rgba(255, 255, 255, 0.1); } @@ -118,10 +118,10 @@ width: 100%; height: 16px; background: rgba(255, 255, 255, 0.1); - border-radius: 8px; margin-top: 5px; position: relative; overflow: hidden; + clip-path: var(--game-clip-path-sm); } .health-bar-fill { @@ -197,12 +197,12 @@ /* Combat Log */ .combat-log-container { background: rgba(0, 0, 0, 0.5); - border-radius: 8px; padding: 0.5rem; margin-top: 1rem; height: 150px; overflow-y: auto; font-size: 0.9rem; + clip-path: var(--game-clip-path-sm); } .log-message { @@ -236,7 +236,7 @@ width: 100%; height: 100%; pointer-events: none; - z-index: 10; + z-index: 1000; } .floating-text { @@ -246,6 +246,8 @@ animation: float-up 5s forwards; pointer-events: none; text-shadow: 2px 2px 0 #000; + z-index: 2000; + /* Ensure on top of everything */ } .type-damage { @@ -346,10 +348,10 @@ transform: translate(-50%, -50%); background: rgba(0, 0, 0, 0.8); padding: 1rem 2rem; - border-radius: 20px; font-size: 1.5rem; animation: pulse 1s infinite; z-index: 20; + clip-path: var(--game-clip-path-sm); } @keyframes pulse { @@ -419,10 +421,10 @@ .stat-block { background: rgba(0, 0, 0, 0.4); padding: 0.5rem 1rem; - border-radius: 8px; border: 1px solid rgba(255, 255, 255, 0.1); box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); position: relative; + clip-path: var(--game-clip-path-sm); } .stat-block.enemy { @@ -463,13 +465,12 @@ height: 12px; /* Slightly thinner than header */ background: rgba(0, 0, 0, 0.6); - border-radius: 6px; overflow: hidden; position: relative; + clip-path: var(--game-clip-path-sm); } .progress-fill { height: 100%; - border-radius: 6px; transition: width 0.3s ease-out; } \ No newline at end of file diff --git a/pwa/src/components/game/CombatInventoryModal.css b/pwa/src/components/game/CombatInventoryModal.css index 95e3444..274b38c 100644 --- a/pwa/src/components/game/CombatInventoryModal.css +++ b/pwa/src/components/game/CombatInventoryModal.css @@ -78,7 +78,7 @@ margin-bottom: 1.5rem; background: rgba(0, 0, 0, 0.2); border: 1px solid #3a4b5c; - border-radius: 8px; + clip-path: var(--game-clip-path-sm); color: #fff; font-size: 1rem; outline: none; @@ -118,7 +118,7 @@ flex-direction: row; background-color: rgba(26, 32, 44, 0.8); border: 1px solid #2d3748; - border-radius: 0.5rem; + clip-path: var(--game-clip-path); padding: 0.75rem; gap: 1rem; align-items: stretch; @@ -142,7 +142,7 @@ align-items: center; justify-content: center; background: rgba(0, 0, 0, 0.3); - border-radius: 6px; + clip-path: var(--game-clip-path); border: 1px solid #4a5568; } @@ -172,7 +172,7 @@ color: #fff; font-size: 0.75rem; padding: 2px 6px; - border-radius: 10px; + clip-path: var(--game-clip-path-sm); font-weight: bold; } @@ -217,7 +217,7 @@ .stat-badge { padding: 0.25rem 0.5rem; - border-radius: 0.375rem; + clip-path: var(--game-clip-path-sm); border: 1px solid; display: flex; align-items: center; @@ -305,7 +305,7 @@ color: #48bb78; border: 1px solid rgba(72, 187, 120, 0.4); padding: 0.5rem 1rem; - border-radius: 6px; + clip-path: var(--game-clip-path-sm); cursor: pointer; font-weight: bold; margin-left: 0.5rem; diff --git a/pwa/src/components/game/CombatView.tsx b/pwa/src/components/game/CombatView.tsx index f218206..1e5c935 100644 --- a/pwa/src/components/game/CombatView.tsx +++ b/pwa/src/components/game/CombatView.tsx @@ -156,17 +156,46 @@ export const CombatView: React.FC = ({
{/* 2. HP Bars (Character Sheet Style) - Staggered Lines */} -
+
+ + {/* Floating Text - Enemy (Left 60%) */} +
+ {floatingTexts.filter(ft => ft.origin === 'enemy').map(ft => ( +
+ {ft.text} +
+ ))} +
+ + {/* Floating Text - Player (Right 60%) */} +
+ {floatingTexts.filter(ft => ft.origin === 'player').map(ft => ( +
+ {ft.text} +
+ ))} +
{/* Enemy HP (Left) */}
-
- {floatingTexts.filter(ft => ft.origin === 'enemy').map(ft => ( -
- {ft.text} -
- ))} -
= ({ {/* Player HP (Right) */}
-
- {floatingTexts.filter(ft => ft.origin === 'player').map(ft => ( -
- {ft.text} -
- ))} -
(() => { + return (localStorage.getItem('inventoryViewMode') as 'list' | 'grid') || 'list'; + }); + + // Dropdown State + const [activeDropdown, setActiveDropdown] = useState(null); // Uses item.id (inventory ID) + const [dropdownPos, setDropdownPos] = useState({ x: 0, y: 0 }); + // Play sound on mount useEffect(() => { playSfx('/audio/sfx/inventory_open.wav') @@ -49,6 +61,26 @@ function InventoryModal({ // But for "close" button click we can play it. }, []) + const toggleViewMode = () => { + const newMode = viewMode === 'list' ? 'grid' : 'list'; + setViewMode(newMode); + localStorage.setItem('inventoryViewMode', newMode); + playSfx('/audio/sfx/click.wav'); // Or a generic interaction sound + }; + + const handleItemClick = (e: MouseEvent, item: any) => { + if (viewMode === 'grid') { + e.stopPropagation(); + // Toggle dropdown + if (activeDropdown === item.id) { + setActiveDropdown(null); + } else { + setDropdownPos({ x: e.clientX, y: e.clientY }); + setActiveDropdown(item.id); + } + } + }; + const handleClose = () => { playSfx('/audio/sfx/inventory_close.wav') onClose() @@ -349,6 +381,312 @@ function InventoryModal({ ) } + const renderGridItem = (item: any, i: number) => { + // Prepare actions for this item + const statusEffect = item.effects?.status_effect; + const isEffectActive = statusEffect && playerState.status_effects.some((e: any) => { + const effectName = typeof e.effect_name === 'string' ? e.effect_name : e.effect_name['en']; + const itemName = typeof statusEffect.name === 'string' ? statusEffect.name : statusEffect.name['en']; + return effectName === itemName; + }); + + const maxDurability = item.max_durability; + const currentDurability = item.durability; + const hasDurability = maxDurability && maxDurability > 0; + + const tooltipContent = ( +
+
+ {item.emoji} {getTranslatedText(item.name)} +
+ {item.description &&
{getTranslatedText(item.description)}
} + +
+
āš–ļø {item.weight}kg {item.quantity > 1 && `(x${item.quantity})`}
+
šŸ“¦ {item.volume}L {item.quantity > 1 && `(x${item.quantity})`}
+
+ + {/* Stats Row - Button-like Badges */} +
+ {/* Capacity */} + {(item.unique_stats?.weight_capacity || item.stats?.weight_capacity) && ( + + āš–ļø +{item.unique_stats?.weight_capacity || item.stats?.weight_capacity}kg + + )} + {(item.unique_stats?.volume_capacity || item.stats?.volume_capacity) && ( + + šŸ“¦ +{item.unique_stats?.volume_capacity || item.stats?.volume_capacity}L + + )} + + {/* Combat */} + {(item.unique_stats?.damage_min || item.stats?.damage_min) && ( + + āš”ļø {item.unique_stats?.damage_min || item.stats?.damage_min}-{item.unique_stats?.damage_max || item.stats?.damage_max} + + )} + {(item.unique_stats?.armor || item.stats?.armor) && ( + + šŸ›”ļø +{item.unique_stats?.armor || item.stats?.armor} + + )} + {(item.unique_stats?.armor_penetration || item.stats?.armor_penetration) && ( + + šŸ’” +{item.unique_stats?.armor_penetration || item.stats?.armor_penetration} {t('stats.pen')} + + )} + {(item.unique_stats?.crit_chance || item.stats?.crit_chance) && ( + + šŸŽÆ +{Math.round((item.unique_stats?.crit_chance || item.stats?.crit_chance) * 100)}% {t('stats.crit')} + + )} + {(item.unique_stats?.accuracy || item.stats?.accuracy) && ( + + šŸ‘ļø +{Math.round((item.unique_stats?.accuracy || item.stats?.accuracy) * 100)}% {t('stats.acc')} + + )} + {(item.unique_stats?.dodge_chance || item.stats?.dodge_chance) && ( + + šŸ’Ø +{Math.round((item.unique_stats?.dodge_chance || item.stats?.dodge_chance) * 100)}% Dodge + + )} + {(item.unique_stats?.lifesteal || item.stats?.lifesteal) && ( + + šŸ§› +{Math.round((item.unique_stats?.lifesteal || item.stats?.lifesteal) * 100)}% {t('stats.life')} + + )} + + {/* Attributes */} + {(item.unique_stats?.strength_bonus || item.stats?.strength_bonus) && ( + + šŸ’Ŗ +{item.unique_stats?.strength_bonus || item.stats?.strength_bonus} {t('stats.str')} + + )} + {(item.unique_stats?.agility_bonus || item.stats?.agility_bonus) && ( + + šŸƒ +{item.unique_stats?.agility_bonus || item.stats?.agility_bonus} {t('stats.agi')} + + )} + {(item.unique_stats?.endurance_bonus || item.stats?.endurance_bonus) && ( + + šŸ‹ļø +{item.unique_stats?.endurance_bonus || item.stats?.endurance_bonus} {t('stats.end')} + + )} + {(item.unique_stats?.hp_bonus || item.stats?.hp_bonus) && ( + + ā¤ļø +{item.unique_stats?.hp_bonus || item.stats?.hp_bonus} {t('stats.hpMax')} + + )} + {(item.unique_stats?.stamina_bonus || item.stats?.stamina_bonus) && ( + + ⚔ +{item.unique_stats?.stamina_bonus || item.stats?.stamina_bonus} {t('stats.stmMax')} + + )} + + {/* Consumables */} + {item.hp_restore && ( + + ā¤ļø +{item.hp_restore} HP + + )} + {item.stamina_restore && ( + + ⚔ +{item.stamina_restore} Stm + + )} + + {/* Status Effects */} + {item.effects?.status_effect && ( + + )} + + {item.effects?.cures && item.effects.cures.length > 0 && ( + + šŸ’Š {t('game.cures')}: {item.effects.cures.map((c: string) => t(`game.effects.${c}`, c)).join(', ')} + + )} + +
+ + {/* Durability Bar */} + {hasDurability && ( +
+
+ {t('game.durability')} + + {currentDurability} / {maxDurability} + +
+
+
+
+
+ )} +
+ ); + + return ( +
+ +
handleItemClick(e, item)} + > + {/* Image/Icon */} +
+ {item.image_path ? ( + {getTranslatedText(item.name)} { + (e.target as HTMLImageElement).style.display = 'none'; + const icon = (e.target as HTMLImageElement).nextElementSibling; + if (icon) icon.classList.remove('hidden'); + }} + /> + ) : null} +
+ {item.emoji || 'šŸ“¦'} +
+
+ + {/* Quantity Badge */} + {item.quantity > 1 &&
x{item.quantity}
} + + {/* Equipped Indicator */} + {item.is_equipped &&
E
} +
+
+ + {/* Dropdown Menu */} + {activeDropdown === item.id && ( + setActiveDropdown(null)} + position={dropdownPos} + width="180px" + > +
+ {getTranslatedText(item.name)} +
+ + {item.consumable && ( + { + if (!isEffectActive) { + playSfx('/audio/sfx/use.wav'); + onUseItem(item.item_id, item.id); + setActiveDropdown(null); + } + }} + style={{ width: '100%', justifyContent: 'flex-start' }} + > + {t('game.use')} + + )} + + {item.equippable && !item.is_equipped && ( + { + playSfx('/audio/sfx/equip.wav'); + onEquipItem(item.id); + setActiveDropdown(null); + }} + style={{ width: '100%', justifyContent: 'flex-start' }} + > + {t('game.equip')} + + )} + + {item.is_equipped && ( + { + playSfx('/audio/sfx/unequip.wav'); + onUnequipItem(item.slot); + setActiveDropdown(null); + }} + style={{ width: '100%', justifyContent: 'flex-start' }} + > + {t('game.unequip')} + + )} + + {(item.consumable || (item.equippable && !item.is_equipped) || item.is_equipped) && +
+ } + + { + playSfx('/audio/sfx/drop.wav'); + onDropItem(item.item_id, item.id, 1); + setActiveDropdown(null); + }} + style={{ width: '100%', justifyContent: 'flex-start' }} + > + {t('game.drop')} (x1) + + + {item.quantity >= 5 && ( + { + playSfx('/audio/sfx/drop.wav'); + onDropItem(item.item_id, item.id, 5); + setActiveDropdown(null); + }} + style={{ width: '100%', justifyContent: 'flex-start' }} + > + {t('game.drop')} (x5) + + )} + + {item.quantity > 1 && ( + { + playSfx('/audio/sfx/drop.wav'); + onDropItem(item.item_id, item.id, item.quantity); + setActiveDropdown(null); + }} + style={{ width: '100%', justifyContent: 'flex-start' }} + > + {t('game.drop')} ({t('common.all')}) + + )} + + + )} +
+ ); + }; + return (
) => { if (e.target === e.currentTarget) handleClose() @@ -437,6 +775,17 @@ function InventoryModal({ value={inventoryFilter} onChange={(e: ChangeEvent) => onSetInventoryFilter(e.target.value)} /> + + {/* View Mode Toggle */} +
+ +
@@ -452,14 +801,17 @@ function InventoryModal({ {filteredItems.some((item: any) => item.is_equipped) && ( <>
āš”ļø {t('game.equipped')}
- {filteredItems.filter((item: any) => item.is_equipped).map((item: any, i: number) => renderItemCard(item, i))} +
+ {filteredItems.filter((item: any) => item.is_equipped).map((item: any, i: number) => + viewMode === 'list' ? renderItemCard(item, i) : renderGridItem(item, i) + )} +
)} {/* Backpack - grouped by categories */} {filteredItems.some((item: any) => !item.is_equipped) && ( <> -
šŸŽ’ {t('game.backpack')}
{/* Group backpack items by category */} {categories .filter(cat => cat.id !== 'all') // Exclude 'all' from subcategories @@ -470,12 +822,16 @@ function InventoryModal({ if (categoryItems.length === 0) return null; return (
-
+
{cat.icon} {cat.label} ({categoryItems.length})
- {categoryItems.map((item: any, i: number) => renderItemCard(item, i))} +
+ {categoryItems.map((item: any, i: number) => + viewMode === 'list' ? renderItemCard(item, i) : renderGridItem(item, i) + )} +
); })} @@ -484,7 +840,11 @@ function InventoryModal({ ) : ( /* Single category */ - filteredItems.map((item: any, i: number) => renderItemCard(item, i)) +
+ {filteredItems.map((item: any, i: number) => + viewMode === 'list' ? renderItemCard(item, i) : renderGridItem(item, i) + )} +
) )}
diff --git a/pwa/src/components/game/LocationView.tsx b/pwa/src/components/game/LocationView.tsx index 3ad4050..5d26a40 100644 --- a/pwa/src/components/game/LocationView.tsx +++ b/pwa/src/components/game/LocationView.tsx @@ -44,11 +44,12 @@ interface LocationViewProps { onCraft: (itemId: number) => void onRepair: (uniqueItemId: string, inventoryId: number) => void onUncraft: (uniqueItemId: string, inventoryId: number) => void + failedActionItemId: string | number | null } function LocationView({ location, - message, + locationMessages, expandedCorpse, corpseDetails, @@ -58,13 +59,14 @@ function LocationView({ workbenchTab, craftableItems, repairableItems, + failedActionItemId, uncraftableItems, craftFilter, repairFilter, uncraftFilter, craftCategoryFilter, profile, - onSetMessage, + onInitiateCombat, onInitiatePvP, onPickup, @@ -156,11 +158,11 @@ function LocationView({
- {message && ( + {/* {message && (
onSetMessage('')}> {message}
- )} + )} */} {locationMessages.length > 0 && (
@@ -313,8 +315,10 @@ function LocationView({

{t('location.itemsOnGround')}

{location.items.map((item: any, i: number) => { + // Use loose equality to handle potential string/number mismatches + const isShaking = failedActionItemId == item.id; return ( -
+
{item.description &&
{getTranslatedText(item.description)}
} @@ -377,7 +381,7 @@ function LocationView({ diff --git a/pwa/src/components/game/Workbench.css b/pwa/src/components/game/Workbench.css index 3352f1f..c7c1dca 100644 --- a/pwa/src/components/game/Workbench.css +++ b/pwa/src/components/game/Workbench.css @@ -201,7 +201,7 @@ padding: 0.75rem; background: var(--game-bg-card); border: 1px solid var(--game-border-color); - border-radius: var(--game-radius-md); + clip-path: var(--game-clip-path); cursor: pointer; transition: all 0.2s; gap: 0.5rem; @@ -331,15 +331,16 @@ align-items: center; justify-content: center; background: rgba(0, 0, 0, 0.3); - border-radius: 6px; border: 1px solid #4a5568; margin-right: 0.75rem; + clip-path: var(--game-clip-path-sm); } .item-thumb-img { max-width: 100%; max-height: 100%; object-fit: contain; + clip-path: var(--game-clip-path-sm); } .item-thumb-emoji { @@ -473,7 +474,7 @@ width: 120px; height: 120px; margin: 0 auto 1.5rem auto; - border-radius: var(--game-radius-md); + clip-path: var(--game-clip-path); overflow: hidden; border: 2px solid var(--game-border-color); background: var(--game-bg-input); @@ -504,7 +505,7 @@ max-width: 600px; background: rgba(255, 255, 255, 0.03); border: 1px solid rgba(255, 255, 255, 0.05); - border-radius: 8px; + clip-path: var(--game-clip-path); padding: 1.5rem; margin-bottom: 2rem; } @@ -543,7 +544,7 @@ .uncraft-btn { width: 100%; padding: 1rem; - border-radius: 8px; + clip-path: var(--game-clip-path); border: none; font-weight: bold; cursor: pointer; @@ -609,7 +610,7 @@ .item-card-equipped { font-size: 0.7rem; padding: 2px 6px; - border-radius: 4px; + clip-path: var(--game-clip-path-sm); background: rgba(66, 153, 225, 0.2); color: #63b3ed; border: 1px solid rgba(66, 153, 225, 0.4); diff --git a/pwa/src/components/game/game_pickup.css b/pwa/src/components/game/game_pickup.css index 03c8775..3d705d4 100644 --- a/pwa/src/components/game/game_pickup.css +++ b/pwa/src/components/game/game_pickup.css @@ -4,7 +4,7 @@ gap: 2px; background: rgba(0, 0, 0, 0.2); padding: 2px; - border-radius: 6px; + clip-path: var(--game-clip-path-sm); border: 1px solid rgba(72, 187, 120, 0.4); /* Green border */ align-items: center; @@ -18,9 +18,9 @@ padding: 0.3rem 0.6rem; font-size: 0.75rem; font-weight: 600; - border-radius: 4px; cursor: pointer; transition: all 0.2s; + clip-path: var(--game-clip-path-sm); white-space: nowrap; } diff --git a/pwa/src/components/game/hooks/useGameEngine.ts b/pwa/src/components/game/hooks/useGameEngine.ts index 69fbf5e..12aca9d 100644 --- a/pwa/src/components/game/hooks/useGameEngine.ts +++ b/pwa/src/components/game/hooks/useGameEngine.ts @@ -2,6 +2,7 @@ import { useState, useEffect, useRef, useCallback } from 'react' import { useTranslation } from 'react-i18next' import api from '../../../services/api' +import { useAudio } from '../../../contexts/AudioContext' import type { PlayerState, Location, @@ -36,6 +37,7 @@ export interface GameEngineState { corpseDetails: any movementCooldown: number equipment: Equipment + failedActionItemId: string | number | null // For shake animation // Workbench state showCraftingMenu: boolean @@ -145,6 +147,7 @@ export function useGameEngine( _handleWebSocketMessage: (message: any) => Promise ): [GameEngineState, GameEngineActions] { const { t } = useTranslation() + const { playSfx } = useAudio() // All state declarations const [playerState, setPlayerState] = useState(null) const [location, setLocation] = useState(null) @@ -160,6 +163,7 @@ export function useGameEngine( const [expandedCorpse, setExpandedCorpse] = useState(null) const [corpseDetails, setCorpseDetails] = useState(null) const [movementCooldown, setMovementCooldown] = useState(0) + const [failedActionItemId, setFailedActionItemId] = useState(null) // const [enemyTurnMessage, setEnemyTurnMessage] = useState('') // Moved to Combat.tsx const [equipment, setEquipment] = useState({}) @@ -389,6 +393,7 @@ export function useGameEngine( setMessage('Moving...') const response = await api.post('/api/game/move', { direction }) setMessage(response.data.message) + playSfx('/audio/sfx/step.wav') setLocationMessages([]) if (response.data.encounter && response.data.encounter.triggered) { @@ -429,10 +434,16 @@ export function useGameEngine( try { const response = await api.post('/api/game/pickup', { item_id: itemId, quantity }) addLocationMessage(response.data.message || 'Item picked up!') + playSfx('/audio/sfx/pickup.wav') + setFailedActionItemId(null) fetchGameData() } catch (error: any) { - setMessage(error.response?.data?.detail || 'Failed to pick up item') - fetchGameData() + addLocationMessage(error.response?.data?.detail || 'Failed to pick up item') + setFailedActionItemId(itemId) + // Reset shake after animation + setTimeout(() => setFailedActionItemId(null), 500) + // On error (e.g. full inventory), we don't strictly need to refresh game data immediately + // and it might interfere with the animation if it triggers a re-render. } } @@ -515,6 +526,7 @@ export function useGameEngine( corpseDetails, movementCooldown, equipment, + failedActionItemId, showCraftingMenu, showRepairMenu, craftableItems, @@ -642,12 +654,12 @@ export function useGameEngine( const handleCraft = async (itemId: string) => { try { - setMessage('Crafting...') + // setMessage('Crafting...') // Loading state ok to keep specific or remove? Let's remove to avoid spam const response = await api.post('/api/game/craft_item', { item_id: itemId }) - setMessage(response.data.message || 'Item crafted!') + addLocationMessage(response.data.message || 'Item crafted!') await refreshWorkbenchData() } catch (error: any) { - setMessage(error.response?.data?.detail || 'Failed to craft item') + addLocationMessage(error.response?.data?.detail || 'Failed to craft item') } } @@ -660,27 +672,27 @@ export function useGameEngine( setWorkbenchTab('repair') setLoadedTabs(new Set(['repair'])) } catch (error: any) { - setMessage(error.response?.data?.detail || 'Failed to load repair menu') + addLocationMessage(error.response?.data?.detail || 'Failed to load repair menu') } } const handleRepairFromMenu = async (uniqueItemId: number, inventoryId?: number) => { try { - setMessage('Repairing...') + // setMessage('Repairing...') const response = await api.post('/api/game/repair_item', { unique_item_id: uniqueItemId, inventory_id: inventoryId }) - setMessage(response.data.message || 'Item repaired!') + addLocationMessage(response.data.message || 'Item repaired!') await refreshWorkbenchData() } catch (error: any) { - setMessage(error.response?.data?.detail || 'Failed to repair item') + addLocationMessage(error.response?.data?.detail || 'Failed to repair item') } } const handleUncraft = async (uniqueItemId: number, inventoryId: number) => { try { - setMessage('Salvaging...') + // setMessage('Salvaging...') const response = await api.post('/api/game/uncraft_item', { unique_item_id: uniqueItemId, inventory_id: inventoryId @@ -693,10 +705,10 @@ export function useGameEngine( if (data.materials_lost && data.materials_lost.length > 0) { msg += '\nāš ļø Lost: ' + data.materials_lost.map((m: any) => `${m.emoji} ${m.name} x${m.quantity}`).join(', ') } - setMessage(msg) + addLocationMessage(msg) await refreshWorkbenchData() } catch (error: any) { - setMessage(error.response?.data?.detail || 'Failed to uncraft item') + addLocationMessage(error.response?.data?.detail || 'Failed to uncraft item') } } @@ -850,10 +862,10 @@ export function useGameEngine( if (data.hp_change) { msg += `\nā¤ļø HP: ${data.hp_change > 0 ? '+' : ''}${data.hp_change}` } - setMessage(msg) + addLocationMessage(msg) fetchGameData() } catch (error: any) { - setMessage(error.response?.data?.detail || 'Interaction failed') + addLocationMessage(error.response?.data?.detail || 'Interaction failed') } } @@ -875,7 +887,7 @@ export function useGameEngine( item_index: itemIndex }) - setMessage(response.data.message) + addLocationMessage(response.data.message) setTimeout(() => { }, 5000) if (response.data.corpse_empty) { @@ -893,7 +905,7 @@ export function useGameEngine( fetchGameData() } catch (error: any) { - setMessage(error.response?.data?.detail || 'Failed to loot corpse') + addLocationMessage(error.response?.data?.detail || 'Failed to loot corpse') } } @@ -903,12 +915,12 @@ export function useGameEngine( const handleSpendPoint = async (stat: string) => { try { - setMessage(`Increasing ${stat}...`) + // setMessage(`Increasing ${stat}...`) const response = await api.post(`/api/game/spend_point?stat=${stat}`) - setMessage(response.data.message || 'Stat increased!') + addLocationMessage(response.data.message || 'Stat increased!') fetchGameData() } catch (error: any) { - setMessage(error.response?.data?.detail || 'Failed to spend point') + addLocationMessage(error.response?.data?.detail || 'Failed to spend point') } } diff --git a/pwa/src/index.css b/pwa/src/index.css index 6bec3ac..de05416 100644 --- a/pwa/src/index.css +++ b/pwa/src/index.css @@ -23,6 +23,7 @@ --game-radius-md: 0px; --game-clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px); --game-clip-path-sm: polygon(4px 0, 100% 0, 100% calc(100% - 4px), calc(100% - 4px) 100%, 0 100%, 0 4px); + --game-clip-path-no-br: polygon(10px 0, 100% 0, 100% 100%, 0 100%, 0 10px); /* --- Typography --- */ --game-font-main: 'Saira Condensed', system-ui, sans-serif; @@ -156,7 +157,7 @@ align-items: center; justify-content: center; aspect-ratio: 1; - clip-path: var(--game-clip-path-sm); + clip-path: var(--game-clip-path); } .game-slot:hover {