@littlepartytime/dev-kit 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -3
- package/dist/cli.js.map +1 -1
- package/dist/commands/dev.d.ts +6 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +59 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/server/engine-loader.d.ts +11 -0
- package/dist/server/engine-loader.d.ts.map +1 -0
- package/dist/server/engine-loader.js +45 -0
- package/dist/server/engine-loader.js.map +1 -0
- package/dist/server/game-room.d.ts +25 -0
- package/dist/server/game-room.d.ts.map +1 -0
- package/dist/server/game-room.js +78 -0
- package/dist/server/game-room.js.map +1 -0
- package/dist/server/socket-server.d.ts +16 -0
- package/dist/server/socket-server.d.ts.map +1 -0
- package/dist/server/socket-server.js +167 -0
- package/dist/server/socket-server.js.map +1 -0
- package/dist/webapp/App.d.ts +3 -0
- package/dist/webapp/App.d.ts.map +1 -0
- package/dist/webapp/App.js +70 -0
- package/dist/webapp/App.js.map +1 -0
- package/dist/webapp/App.tsx +40 -0
- package/dist/webapp/index.html +16 -0
- package/dist/webapp/main.d.ts +2 -0
- package/dist/webapp/main.d.ts.map +1 -0
- package/dist/webapp/main.js +12 -0
- package/dist/webapp/main.js.map +1 -0
- package/dist/webapp/main.tsx +9 -0
- package/dist/webapp/pages/Debug.d.ts +3 -0
- package/dist/webapp/pages/Debug.d.ts.map +1 -0
- package/dist/webapp/pages/Debug.js +69 -0
- package/dist/webapp/pages/Debug.js.map +1 -0
- package/dist/webapp/pages/Debug.tsx +40 -0
- package/dist/webapp/pages/Play.d.ts +3 -0
- package/dist/webapp/pages/Play.d.ts.map +1 -0
- package/dist/webapp/pages/Play.js +129 -0
- package/dist/webapp/pages/Play.js.map +1 -0
- package/dist/webapp/pages/Play.tsx +137 -0
- package/dist/webapp/pages/Preview.d.ts +3 -0
- package/dist/webapp/pages/Preview.d.ts.map +1 -0
- package/dist/webapp/pages/Preview.js +118 -0
- package/dist/webapp/pages/Preview.js.map +1 -0
- package/dist/webapp/pages/Preview.tsx +112 -0
- package/package.json +13 -3
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import React, { useState, useEffect, useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
export default function Preview() {
|
|
4
|
+
const [state, setState] = useState<any>({ phase: 'playing', players: [], data: {} });
|
|
5
|
+
const [stateJson, setStateJson] = useState('');
|
|
6
|
+
const [playerIndex, setPlayerIndex] = useState(0);
|
|
7
|
+
const [actions, setActions] = useState<any[]>([]);
|
|
8
|
+
const [GameRenderer, setGameRenderer] = useState<React.ComponentType<any> | null>(null);
|
|
9
|
+
|
|
10
|
+
// Load renderer dynamically
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
import('/src/renderer.tsx').then((mod) => {
|
|
13
|
+
setGameRenderer(() => mod.default || mod.Renderer);
|
|
14
|
+
}).catch((err) => {
|
|
15
|
+
console.error('Failed to load renderer:', err);
|
|
16
|
+
});
|
|
17
|
+
}, []);
|
|
18
|
+
|
|
19
|
+
// Mock players
|
|
20
|
+
const mockPlayers = [
|
|
21
|
+
{ id: 'player-1', nickname: 'Alice', avatarUrl: null, isHost: true },
|
|
22
|
+
{ id: 'player-2', nickname: 'Bob', avatarUrl: null, isHost: false },
|
|
23
|
+
{ id: 'player-3', nickname: 'Carol', avatarUrl: null, isHost: false },
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
// Mock platform
|
|
27
|
+
const platform = {
|
|
28
|
+
getPlayers: () => mockPlayers,
|
|
29
|
+
getLocalPlayer: () => mockPlayers[playerIndex],
|
|
30
|
+
send: (action: any) => {
|
|
31
|
+
setActions((prev) => [...prev, { time: new Date().toISOString(), player: mockPlayers[playerIndex].nickname, action }]);
|
|
32
|
+
},
|
|
33
|
+
on: () => {},
|
|
34
|
+
off: () => {},
|
|
35
|
+
reportResult: () => {},
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const updateState = useCallback(() => {
|
|
39
|
+
try {
|
|
40
|
+
const parsed = JSON.parse(stateJson);
|
|
41
|
+
setState(parsed);
|
|
42
|
+
} catch (e) {
|
|
43
|
+
// ignore
|
|
44
|
+
}
|
|
45
|
+
}, [stateJson]);
|
|
46
|
+
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
setStateJson(JSON.stringify(state, null, 2));
|
|
49
|
+
}, []);
|
|
50
|
+
|
|
51
|
+
return (
|
|
52
|
+
<div className="flex gap-4 h-[calc(100vh-80px)]">
|
|
53
|
+
{/* Renderer */}
|
|
54
|
+
<div className="flex-1 bg-zinc-900 rounded-lg overflow-auto">
|
|
55
|
+
{GameRenderer ? (
|
|
56
|
+
<GameRenderer platform={platform} state={state} />
|
|
57
|
+
) : (
|
|
58
|
+
<div className="p-4 text-zinc-500">Loading renderer...</div>
|
|
59
|
+
)}
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
{/* Control Panel */}
|
|
63
|
+
<div className="w-80 flex flex-col gap-4">
|
|
64
|
+
{/* Player Switcher */}
|
|
65
|
+
<div className="bg-zinc-900 rounded-lg p-3">
|
|
66
|
+
<h3 className="text-sm font-bold text-zinc-400 mb-2">Current Player</h3>
|
|
67
|
+
<select
|
|
68
|
+
value={playerIndex}
|
|
69
|
+
onChange={(e) => setPlayerIndex(Number(e.target.value))}
|
|
70
|
+
className="w-full bg-zinc-800 border border-zinc-700 rounded px-2 py-1"
|
|
71
|
+
>
|
|
72
|
+
{mockPlayers.map((p, i) => (
|
|
73
|
+
<option key={p.id} value={i}>{p.nickname}</option>
|
|
74
|
+
))}
|
|
75
|
+
</select>
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
{/* State Editor */}
|
|
79
|
+
<div className="bg-zinc-900 rounded-lg p-3 flex-1 flex flex-col">
|
|
80
|
+
<h3 className="text-sm font-bold text-zinc-400 mb-2">Game State</h3>
|
|
81
|
+
<textarea
|
|
82
|
+
value={stateJson}
|
|
83
|
+
onChange={(e) => setStateJson(e.target.value)}
|
|
84
|
+
className="flex-1 bg-zinc-800 border border-zinc-700 rounded p-2 font-mono text-xs resize-none"
|
|
85
|
+
/>
|
|
86
|
+
<button
|
|
87
|
+
onClick={updateState}
|
|
88
|
+
className="mt-2 bg-amber-600 hover:bg-amber-500 text-white px-3 py-1 rounded text-sm"
|
|
89
|
+
>
|
|
90
|
+
Apply State
|
|
91
|
+
</button>
|
|
92
|
+
</div>
|
|
93
|
+
|
|
94
|
+
{/* Action Log */}
|
|
95
|
+
<div className="bg-zinc-900 rounded-lg p-3 h-48 overflow-auto">
|
|
96
|
+
<h3 className="text-sm font-bold text-zinc-400 mb-2">Action Log</h3>
|
|
97
|
+
{actions.length === 0 ? (
|
|
98
|
+
<p className="text-zinc-500 text-xs">No actions yet</p>
|
|
99
|
+
) : (
|
|
100
|
+
<div className="space-y-1">
|
|
101
|
+
{actions.map((a, i) => (
|
|
102
|
+
<div key={i} className="text-xs font-mono bg-zinc-800 rounded p-1">
|
|
103
|
+
<span className="text-amber-400">{a.player}</span>: {JSON.stringify(a.action)}
|
|
104
|
+
</div>
|
|
105
|
+
))}
|
|
106
|
+
</div>
|
|
107
|
+
)}
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
);
|
|
112
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@littlepartytime/dev-kit",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Development toolkit CLI for Little Party Time game developers",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"lpt-dev-kit": "./dist/cli.js"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
|
-
"build": "tsc",
|
|
11
|
+
"build": "tsc && cp -r src/webapp dist/",
|
|
12
12
|
"dev": "tsc --watch",
|
|
13
13
|
"test": "vitest run",
|
|
14
14
|
"test:watch": "vitest"
|
|
@@ -22,11 +22,21 @@
|
|
|
22
22
|
"directory": "packages/dev-kit"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"
|
|
25
|
+
"@vitejs/plugin-react": "^5",
|
|
26
|
+
"archiver": "^7",
|
|
27
|
+
"chokidar": "^4",
|
|
28
|
+
"express": "^5",
|
|
29
|
+
"react": "^19",
|
|
30
|
+
"react-dom": "^19",
|
|
31
|
+
"socket.io": "^4",
|
|
32
|
+
"vite": "^7"
|
|
26
33
|
},
|
|
27
34
|
"devDependencies": {
|
|
28
35
|
"@types/archiver": "^6",
|
|
36
|
+
"@types/express": "^5",
|
|
29
37
|
"@types/node": "^22",
|
|
38
|
+
"@types/react": "^19",
|
|
39
|
+
"@types/react-dom": "^19",
|
|
30
40
|
"typescript": "^5",
|
|
31
41
|
"vitest": "^3"
|
|
32
42
|
}
|