diff --git a/app/app.vue b/app/app.vue index 995e624..f309eee 100644 --- a/app/app.vue +++ b/app/app.vue @@ -1,64 +1,39 @@ diff --git a/app/assets/css/tailwind.css b/app/assets/css/tailwind.css new file mode 100644 index 0000000..7c897b5 --- /dev/null +++ b/app/assets/css/tailwind.css @@ -0,0 +1,18 @@ +@import "tailwindcss"; + +@theme { + /* Pixel Dungeon Color Palette */ + --color-pixel-white: #e0d8f0; + --color-pixel-black: #1b1026; + --color-pixel-bg: #0f0816; + --color-pixel-primary: #f6b26b; + --color-pixel-secondary: #2ce8f4; + --color-pixel-accent: #d95763; + --color-pixel-green: #99e550; + --color-pixel-yellow: #ffe762; + --color-pixel-purple: #8f80a0; + --color-pixel-dark-purple: #4a3b5e; + --color-pixel-panel: #2b193f; + --color-pixel-panel-dark: #1b1026; + --color-pixel-panel-border: #4a3b5e; +} \ No newline at end of file diff --git a/app/components/pixel/AchievementsOverlay.vue b/app/components/pixel/AchievementsOverlay.vue new file mode 100644 index 0000000..d03f292 --- /dev/null +++ b/app/components/pixel/AchievementsOverlay.vue @@ -0,0 +1,112 @@ + + + diff --git a/app/components/pixel/ActionArea.vue b/app/components/pixel/ActionArea.vue new file mode 100644 index 0000000..96a31da --- /dev/null +++ b/app/components/pixel/ActionArea.vue @@ -0,0 +1,146 @@ + + + diff --git a/app/components/pixel/AdventureOverlay.vue b/app/components/pixel/AdventureOverlay.vue new file mode 100644 index 0000000..397ea42 --- /dev/null +++ b/app/components/pixel/AdventureOverlay.vue @@ -0,0 +1,95 @@ + + + diff --git a/app/components/pixel/BattleArea.vue b/app/components/pixel/BattleArea.vue new file mode 100644 index 0000000..dbf967c --- /dev/null +++ b/app/components/pixel/BattleArea.vue @@ -0,0 +1,99 @@ + + + diff --git a/app/components/pixel/GodSystemOverlay.vue b/app/components/pixel/GodSystemOverlay.vue new file mode 100644 index 0000000..c2458a9 --- /dev/null +++ b/app/components/pixel/GodSystemOverlay.vue @@ -0,0 +1,322 @@ + + + diff --git a/app/components/pixel/InfoPanel.vue b/app/components/pixel/InfoPanel.vue new file mode 100644 index 0000000..1e7cd23 --- /dev/null +++ b/app/components/pixel/InfoPanel.vue @@ -0,0 +1,79 @@ + + + diff --git a/app/components/pixel/InventoryOverlay.vue b/app/components/pixel/InventoryOverlay.vue new file mode 100644 index 0000000..1a5bfb3 --- /dev/null +++ b/app/components/pixel/InventoryOverlay.vue @@ -0,0 +1,209 @@ + + + diff --git a/app/components/pixel/JiaobeiBlocks.vue b/app/components/pixel/JiaobeiBlocks.vue new file mode 100644 index 0000000..e0df6eb --- /dev/null +++ b/app/components/pixel/JiaobeiBlocks.vue @@ -0,0 +1,54 @@ + + + diff --git a/app/components/pixel/PixelAvatar.vue b/app/components/pixel/PixelAvatar.vue new file mode 100644 index 0000000..b2c802c --- /dev/null +++ b/app/components/pixel/PixelAvatar.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/app/components/pixel/PixelButton.vue b/app/components/pixel/PixelButton.vue new file mode 100644 index 0000000..93c83de --- /dev/null +++ b/app/components/pixel/PixelButton.vue @@ -0,0 +1,35 @@ + + + diff --git a/app/components/pixel/PixelFrame.vue b/app/components/pixel/PixelFrame.vue new file mode 100644 index 0000000..14b5471 --- /dev/null +++ b/app/components/pixel/PixelFrame.vue @@ -0,0 +1,40 @@ + + + diff --git a/app/components/pixel/PixelModal.vue b/app/components/pixel/PixelModal.vue new file mode 100644 index 0000000..32305fe --- /dev/null +++ b/app/components/pixel/PixelModal.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/app/components/pixel/PlayerPanel.vue b/app/components/pixel/PlayerPanel.vue new file mode 100644 index 0000000..73524fc --- /dev/null +++ b/app/components/pixel/PlayerPanel.vue @@ -0,0 +1,111 @@ + + + diff --git a/app/components/pixel/RetroCounter.vue b/app/components/pixel/RetroCounter.vue new file mode 100644 index 0000000..1e018b1 --- /dev/null +++ b/app/components/pixel/RetroCounter.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/components/pixel/RetroProgressBar.vue b/app/components/pixel/RetroProgressBar.vue new file mode 100644 index 0000000..f67460c --- /dev/null +++ b/app/components/pixel/RetroProgressBar.vue @@ -0,0 +1,19 @@ + + + diff --git a/app/components/pixel/RetroResourceBar.vue b/app/components/pixel/RetroResourceBar.vue new file mode 100644 index 0000000..a05cd6b --- /dev/null +++ b/app/components/pixel/RetroResourceBar.vue @@ -0,0 +1,43 @@ + + + diff --git a/app/components/pixel/ShopOverlay.vue b/app/components/pixel/ShopOverlay.vue new file mode 100644 index 0000000..3c8d9c1 --- /dev/null +++ b/app/components/pixel/ShopOverlay.vue @@ -0,0 +1,145 @@ + + + diff --git a/app/pages/index.vue b/app/pages/index.vue index e586ca3..62d821f 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -1,458 +1,435 @@ - - - diff --git a/app/pages/old.vue b/app/pages/old.vue deleted file mode 100644 index 6207423..0000000 --- a/app/pages/old.vue +++ /dev/null @@ -1,4810 +0,0 @@ - - - - - - - diff --git a/app/types/pixel.ts b/app/types/pixel.ts new file mode 100644 index 0000000..510e3ba --- /dev/null +++ b/app/types/pixel.ts @@ -0,0 +1,180 @@ +export enum StatType { + HP = 'HP', + SP = 'SP', + ATK = 'ATK', + DEF = 'DEF', + SPD = 'SPD', + LUCK = 'LCK' +} + +export interface EntityStats { + hp: number; + maxHp: number; + sp: number; // Re-purposed for 'Hunger' or general resource if needed + maxSp: number; + lvl: number; + name: string; + class: string; + + // New Pet Fields + hunger?: number; + maxHunger?: number; + happiness?: number; + maxHappiness?: number; + + age?: string; + generation?: number; + height?: string; + weight?: string; + gold?: number; + + fate?: string; // e.g. "Resource Recycling Grandma" + godFavor?: { + name: string; + current: number; + max: number; + }; + + // Detailed Stats + str?: number; + int?: number; + dex?: number; + luck?: number; + atk?: number; + def?: number; + spd?: number; +} + +export interface ActionItem { + id: string; + name: string; + iconName: string; // Mapping to Lucide icon + cooldown: number; + cost: number; +} + +export interface EquipmentSlot { + slot: string; + item: string; +} + +export interface Achievement { + id: string; + title: string; + description: string; + reward?: string; + progress: number; // 0 to 100 percentage + currentValue?: number; + maxValue?: number; + unlocked: boolean; + icon: string; // Helper to map to Lucide icon in component + color?: string; +} + +// --- Inventory System Types --- + +export enum Rarity { + Common = 'Common', + Excellent = 'Excellent', + Rare = 'Rare', + Epic = 'Epic', + Legendary = 'Legendary' +} + +export enum ItemType { + Equipment = 'Equipment', + Consumable = 'Consumable' +} + +export enum ItemCategory { + Food = 'Food', + Medicine = 'Medicine', + Equipment = 'Equipment', + Toy = 'Toy', + Accessory = 'Accessory', + Misc = 'Misc' +} + +export enum EquipSlot { + Weapon = 'Weapon', + Armor = 'Armor', + Hat = 'Hat', + Accessory = 'Accessory', + Charm = 'Charm', + Special = 'Special' +} + +export interface Item { + id: string; + name: string; + type: ItemType; + category?: ItemCategory; // New field for Shop filters + price: number; // New field for Shop + slot?: EquipSlot; // Only for Equipment + rarity: Rarity; + description: string; + statsDescription?: string; // e.g. "DEF +8 MaxHP +10" + effects?: string[]; + icon: string; + quantity?: number; // For consumables + + // State helpers + isEquipped?: boolean; + isAppearance?: boolean; // If true, it's in the appearance slot +} + +// --- God System Types --- + +export enum DeityId { + Mazu = 'Mazu', // 媽祖 + EarthGod = 'EarthGod', // 土地公 + Matchmaker = 'Matchmaker', // 月老 + Wenchang = 'Wenchang' // 文昌 +} + +export enum JiaobeiResult { + Saint = 'Saint', // 聖杯 (One up, one down) - YES + Smile = 'Smile', // 笑杯 (Two flat faces up) - LAUGH/MAYBE + Cry = 'Cry', // 陰杯 (Two round faces up) - NO + None = 'None' +} + +export enum LotPhase { + Idle = 'Idle', + Drawing = 'Drawing', // Shaking the cylinder + PendingVerify = 'PendingVerify', // Lot drawn, needs 3 saint cups + Verifying = 'Verifying', // Tossing blocks + Success = 'Success', // Got 3 saint cups + Failed = 'Failed' // Failed mid-way +} + +export interface Deity { + id: DeityId; + name: string; + title: string; + description: string; + favor: number; + maxFavor: number; + colors: { + skin: string; + hair: string; + outfit: string; + accessory: string; + }; +} + +// --- Adventure System Types --- + +export interface AdventureLocation { + id: string; + name: string; + description: string; + costHunger: number; + costGold: number; + reqStats?: { + str?: number; + int?: number; + }; + difficulty: 'Easy' | 'Medium' | 'Hard'; + enemyName: string; +} diff --git a/components/pixel/ActionMenu.vue b/components/pixel/ActionMenu.vue deleted file mode 100644 index 75f5a26..0000000 --- a/components/pixel/ActionMenu.vue +++ /dev/null @@ -1,114 +0,0 @@ - - - - - diff --git a/components/pixel/InfoPanel.vue b/components/pixel/InfoPanel.vue deleted file mode 100644 index 80b16f1..0000000 --- a/components/pixel/InfoPanel.vue +++ /dev/null @@ -1,153 +0,0 @@ - - - - - diff --git a/components/pixel/InventoryModal.vue b/components/pixel/InventoryModal.vue deleted file mode 100644 index 658b7bc..0000000 --- a/components/pixel/InventoryModal.vue +++ /dev/null @@ -1,468 +0,0 @@ - - - - - diff --git a/components/pixel/PetHUD.vue b/components/pixel/PetHUD.vue deleted file mode 100644 index 7e3f174..0000000 --- a/components/pixel/PetHUD.vue +++ /dev/null @@ -1,230 +0,0 @@ - - - - - diff --git a/components/pixel/PetScreen.vue b/components/pixel/PetScreen.vue deleted file mode 100644 index 5ad20f9..0000000 --- a/components/pixel/PetScreen.vue +++ /dev/null @@ -1,247 +0,0 @@ - - - - - diff --git a/components/pixel/PixelButton.vue b/components/pixel/PixelButton.vue deleted file mode 100644 index 152eefe..0000000 --- a/components/pixel/PixelButton.vue +++ /dev/null @@ -1,107 +0,0 @@ - - - - - diff --git a/components/pixel/PixelCard.vue b/components/pixel/PixelCard.vue deleted file mode 100644 index 072fafa..0000000 --- a/components/pixel/PixelCard.vue +++ /dev/null @@ -1,62 +0,0 @@ - - - - - diff --git a/components/pixel/PixelProgressBar.vue b/components/pixel/PixelProgressBar.vue deleted file mode 100644 index 3b7f8ad..0000000 --- a/components/pixel/PixelProgressBar.vue +++ /dev/null @@ -1,121 +0,0 @@ - - - - - diff --git a/components/pixel/ScrollableScene.vue b/components/pixel/ScrollableScene.vue deleted file mode 100644 index 036d219..0000000 --- a/components/pixel/ScrollableScene.vue +++ /dev/null @@ -1,337 +0,0 @@ - - - - - diff --git a/components/pixel/StatusPanel.vue b/components/pixel/StatusPanel.vue deleted file mode 100644 index e241921..0000000 --- a/components/pixel/StatusPanel.vue +++ /dev/null @@ -1,120 +0,0 @@ - - - - - diff --git a/nuxt.config.ts b/nuxt.config.ts index be40237..4c95a60 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -27,10 +27,12 @@ export default defineNuxtConfig({ head: { viewport: 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover', meta: [ - { name: 'apple-mobile-web-app-capable', content: 'yes' }, + { name: 'mobile-web-app-capable', content: 'yes' }, { name: 'apple-mobile-web-app-status-bar-style', content: 'black-translucent' }, { name: 'theme-color', content: '#6b6250' } ] } - } + }, + + css: ['~/assets/css/tailwind.css'] }) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c561f6d..1876bdf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "@unhead/vue": "^2.0.19", "better-sqlite3": "^12.4.6", "eslint": "^9.39.1", + "lucide-vue-next": "^0.554.0", "nuxt": "^4.2.1", "typescript": "^5.9.3", "vue": "^3.5.24", @@ -11623,6 +11624,15 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-vue-next": { + "version": "0.554.0", + "resolved": "https://registry.npmjs.org/lucide-vue-next/-/lucide-vue-next-0.554.0.tgz", + "integrity": "sha512-nDchDVm/J3mv+7aYtDh7aLkeBVtzDNyaelKEOlhAE0MKMtDfB9fFatx2siqZUBYhLHjMK5DZnaAC/ODT9vQ63Q==", + "license": "ISC", + "peerDependencies": { + "vue": ">=3.0.1" + } + }, "node_modules/magic-regexp": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/magic-regexp/-/magic-regexp-0.10.0.tgz", diff --git a/package.json b/package.json index 02aefcb..0fb0e50 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@unhead/vue": "^2.0.19", "better-sqlite3": "^12.4.6", "eslint": "^9.39.1", + "lucide-vue-next": "^0.554.0", "nuxt": "^4.2.1", "typescript": "^5.9.3", "vue": "^3.5.24", diff --git a/tailwind.config.ts b/tailwind.config.ts new file mode 100644 index 0000000..a248afd --- /dev/null +++ b/tailwind.config.ts @@ -0,0 +1,38 @@ +import type { Config } from 'tailwindcss' + +export default { + content: [ + './components/**/*.{js,vue,ts}', + './layouts/**/*.vue', + './pages/**/*.vue', + './plugins/**/*.{js,ts}', + './app.vue', + './error.vue', + './app/components/**/*.{js,vue,ts}', + './app/layouts/**/*.vue', + './app/pages/**/*.vue', + './app/app.vue' + ], + theme: { + extend: { + colors: { + // Pixel Dungeon Palette + pixel: { + white: '#e0d8f0', + black: '#1b1026', // Dark Purple-Black + bg: '#0f0816', // Darker BG + primary: '#f6b26b', // Orange/Gold + secondary: '#2ce8f4', // Cyan + accent: '#d95763', // Red + green: '#99e550', + yellow: '#ffe762', + purple: '#8f80a0', + darkPurple: '#4a3b5e', + panel: '#2b193f', + panelDark: '#1b1026', + panelBorder: '#4a3b5e' + } + } + } + } +}