v0.1.0 — M1: Project Setup + Tilemap + Combat + Backend
Frontend: - HTML5 Canvas isometric tilemap renderer - Eichenhafen starting city (procedural) - Click-to-move A* pathfinding - Player stats, HP/SP/EXP bars, skill bar, minimap - 3 NPCs (merchant, class master, innkeeper) - 6 monster spawns with aggro AI - Combat: auto-attack, damage numbers, EXP/gold - Player death + respawn Backend: - FastAPI server with SQLite - Ollama LLM bridge for events + dialogue - Event validation (no soft-lock) - NPC dialogue generation Design: - Full DESIGN.md with architecture, formulas, milestones - 6 base classes + 6 advanced classes - 3 fixed cities, dynamic events
This commit is contained in:
@@ -0,0 +1,173 @@
|
||||
/* Aether Chronicles — Stylesheet */
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
|
||||
body {
|
||||
background: #0a0a0a;
|
||||
color: #e0e0e0;
|
||||
font-family: 'Segoe UI', Tahoma, sans-serif;
|
||||
overflow: hidden;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
#game-container {
|
||||
position: relative;
|
||||
width: 960px;
|
||||
height: 640px;
|
||||
margin: 0 auto;
|
||||
border: 2px solid #333;
|
||||
}
|
||||
|
||||
#game-canvas {
|
||||
display: block;
|
||||
cursor: crosshair;
|
||||
background: #1a1a2e;
|
||||
}
|
||||
|
||||
#ui-overlay {
|
||||
position: absolute;
|
||||
top: 0; left: 0;
|
||||
width: 100%; height: 100%;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
/* Status Bars */
|
||||
#status-bars {
|
||||
position: absolute;
|
||||
top: 10px; left: 10px;
|
||||
width: 200px;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
.bar-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.bar-label {
|
||||
width: 30px;
|
||||
font-size: 11px;
|
||||
font-weight: bold;
|
||||
color: #aaa;
|
||||
text-align: right;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.bar-container {
|
||||
flex: 1;
|
||||
height: 14px;
|
||||
background: #1a1a1a;
|
||||
border: 1px solid #444;
|
||||
border-radius: 2px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.bar-fill {
|
||||
height: 100%;
|
||||
transition: width 0.3s ease;
|
||||
}
|
||||
|
||||
.hp-fill { background: linear-gradient(to right, #c44, #e55); }
|
||||
.sp-fill { background: linear-gradient(to right, #44c, #66e); }
|
||||
.exp-fill { background: linear-gradient(to right, #cc4, #ee5); }
|
||||
|
||||
.bar-text {
|
||||
position: absolute;
|
||||
top: 0; left: 0; right: 0;
|
||||
text-align: center;
|
||||
font-size: 10px;
|
||||
line-height: 14px;
|
||||
color: #fff;
|
||||
text-shadow: 1px 1px 1px #000;
|
||||
}
|
||||
|
||||
/* Skill Bar */
|
||||
#skill-bar {
|
||||
position: absolute;
|
||||
bottom: 10px; left: 50%;
|
||||
transform: translateX(-50%);
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
.skill-slot {
|
||||
width: 40px; height: 40px;
|
||||
background: rgba(20,20,30,0.85);
|
||||
border: 1px solid #555;
|
||||
border-radius: 3px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 14px;
|
||||
color: #888;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.skill-slot:hover {
|
||||
border-color: #88aaff;
|
||||
background: rgba(40,40,60,0.9);
|
||||
}
|
||||
|
||||
.skill-slot.active {
|
||||
border-color: #ffcc44;
|
||||
background: rgba(60,50,20,0.9);
|
||||
}
|
||||
|
||||
.skill-slot.on-cooldown {
|
||||
opacity: 0.4;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
/* Minimap */
|
||||
#minimap-container {
|
||||
position: absolute;
|
||||
top: 10px; right: 10px;
|
||||
width: 120px; height: 120px;
|
||||
border: 1px solid #555;
|
||||
background: rgba(0,0,0,0.7);
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
#minimap { display: block; }
|
||||
|
||||
/* Event Log */
|
||||
#event-log {
|
||||
position: absolute;
|
||||
bottom: 60px; left: 10px;
|
||||
width: 300px; height: 100px;
|
||||
background: rgba(0,0,0,0.6);
|
||||
border: 1px solid #333;
|
||||
border-radius: 3px;
|
||||
overflow: hidden;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
#event-messages {
|
||||
padding: 5px;
|
||||
font-size: 12px;
|
||||
max-height: 100%;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.event-msg {
|
||||
margin-bottom: 2px;
|
||||
color: #ccc;
|
||||
}
|
||||
.event-msg.system { color: #ffcc44; }
|
||||
.event-msg.combat { color: #ff6666; }
|
||||
.event-msg.quest { color: #66ff66; }
|
||||
.event-msg.llm { color: #aa88ff; }
|
||||
|
||||
/* Character Info */
|
||||
#char-info {
|
||||
position: absolute;
|
||||
top: 10px; left: 220px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
#char-name { font-size: 14px; font-weight: bold; color: #ffcc44; }
|
||||
#char-level { font-size: 12px; color: #aaa; }
|
||||
#char-class { font-size: 11px; color: #88aaff; }
|
||||
Reference in New Issue
Block a user