+
Pre-Production Done
Start: [Today] — End: +30 Days
Design docs, game concept, visual target, core loop
+
Blockout Maps & Prototypes In Progress
+31 Days — +75 Days
Build test maps, whitebox environments, establish movement/combat feel
+
Core Mechanics Development Not Started
+76 Days — +135 Days
Implement combat, shard-switching, attunement system
+
First Playable (Vertical Slice) Not Started
+136 Days — +165 Days
Basic UI, combat, single map, testable state
+
Story & World Design Not Started
+166 Days — +210 Days
Write lore, quests, dialogue, map flow
+
Environment Art & Level Design Not Started
+211 Days — +285 Days
Model, texture, and populate maps
+
Multiplayer Networking Setup Not Started
+286 Days — +330 Days
Mirror or FishNet implementation, lobby & match start logic
+
UI/UX Polish Not Started
+331 Days — +360 Days
Final HUD, menus, pause screens
+
Sound, Music & VFX Not Started
+361 Days — +390 Days
Placeholders replaced with final effects, transitions
+
Beta Playtesting Not Started
+391 Days — +420 Days
Gather feedback on PvP and solo campaign
+
Final Polish & Optimization Not Started
+421 Days — +450 Days
Bug fixing, performance, controller support
+
Marketing & Steam Page Prep Not Started
+451 Days — +471 Days
Trailer, screenshots, copywriting
+
Launch Not Started
+472 Days — +479 Days
Push to Steam, promote, manage release
+
+
+
diff --git a/roadmap.json b/roadmap.json
new file mode 100644
index 0000000..ce09e12
--- /dev/null
+++ b/roadmap.json
@@ -0,0 +1,15 @@
+[
+ { "id": 1, "title": "Pre-Production", "status": "done" },
+ { "id": 2, "title": "Blockout Maps & Prototypes", "status": "in progress" },
+ { "id": 3, "title": "Core Mechanics Development", "status": "not started" },
+ { "id": 4, "title": "First Playable (Vertical Slice)", "status": "not started" },
+ { "id": 5, "title": "Story & World Design", "status": "not started" },
+ { "id": 6, "title": "Environment Art & Level Design", "status": "not started" },
+ { "id": 7, "title": "Multiplayer Networking Setup", "status": "not started" },
+ { "id": 8, "title": "UI/UX Polish", "status": "not started" },
+ { "id": 9, "title": "Sound, Music & VFX", "status": "not started" },
+ { "id": 10, "title": "Beta Playtesting", "status": "not started" },
+ { "id": 11, "title": "Final Polish & Optimization", "status": "not started" },
+ { "id": 12, "title": "Marketing & Steam Page Prep", "status": "not started" },
+ { "id": 13, "title": "Launch", "status": "not started" }
+]
diff --git a/server.js b/server.js
new file mode 100644
index 0000000..0a647db
--- /dev/null
+++ b/server.js
@@ -0,0 +1,68 @@
+// server.js (Node.js + Express backend)
+const express = require('express');
+const fs = require('fs');
+const path = require('path');
+const bodyParser = require('body-parser');
+const cookieParser = require('cookie-parser');
+const jwt = require('jsonwebtoken');
+const app = express();
+
+const SECRET_KEY = 'your_super_secret_key';
+const PASSWORD = 'shardwalker2025'; // set your password here
+const PORT = 3000;
+
+app.use(express.static('public'));
+app.use(bodyParser.json());
+app.use(cookieParser());
+
+// Serve login check
+app.get('/check-auth', (req, res) => {
+ const token = req.cookies.token;
+ if (!token) return res.status(401).json({ authenticated: false });
+
+ try {
+ jwt.verify(token, SECRET_KEY);
+ res.json({ authenticated: true });
+ } catch (err) {
+ res.status(403).json({ authenticated: false });
+ }
+});
+
+// Login route
+app.post('/login', (req, res) => {
+ const { password } = req.body;
+ if (password === PASSWORD) {
+ const token = jwt.sign({ user: 'admin' }, SECRET_KEY, { expiresIn: '1d' });
+ res.cookie('token', token, { httpOnly: true });
+ res.json({ success: true });
+ } else {
+ res.status(403).json({ success: false });
+ }
+});
+
+// Get current roadmap
+app.get('/api/roadmap', (req, res) => {
+ const data = fs.readFileSync(path.join(__dirname, 'roadmap.json'));
+ res.json(JSON.parse(data));
+});
+
+// Update roadmap status
+app.post('/api/roadmap', (req, res) => {
+ const token = req.cookies.token;
+ if (!token || !jwt.verify(token, SECRET_KEY)) {
+ return res.status(403).json({ success: false });
+ }
+ const { id, status } = req.body;
+ const filePath = path.join(__dirname, 'roadmap.json');
+ const roadmap = JSON.parse(fs.readFileSync(filePath));
+ const phase = roadmap.find(p => p.id === id);
+ if (phase) {
+ phase.status = status;
+ fs.writeFileSync(filePath, JSON.stringify(roadmap, null, 2));
+ res.json({ success: true });
+ } else {
+ res.status(404).json({ success: false });
+ }
+});
+
+app.listen(PORT, () => console.log(`Server running at http://localhost:${PORT}`));
diff --git a/servermanager.html b/servermanager.html
index 587cbad..730f17b 100644
--- a/servermanager.html
+++ b/servermanager.html
@@ -11,7 +11,8 @@