@littlepartytime/dev-kit 1.12.0 → 1.12.1
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.
|
@@ -11,11 +11,12 @@ const btnAmber: React.CSSProperties = { background: '#d97706', color: '#fff', bo
|
|
|
11
11
|
const btnZinc: React.CSSProperties = { background: '#3f3f46', color: '#fff', border: 'none', padding: '4px 12px', borderRadius: 4, fontSize: 13, cursor: 'pointer', width: '100%' };
|
|
12
12
|
|
|
13
13
|
export default function Preview() {
|
|
14
|
-
const [playerCount, setPlayerCount] = useState(
|
|
14
|
+
const [playerCount, setPlayerCount] = useState<number | null>(null);
|
|
15
15
|
const [playerIndex, setPlayerIndex] = useState(0);
|
|
16
16
|
const [actions, setActions] = useState<any[]>([]);
|
|
17
17
|
const [GameRenderer, setGameRenderer] = useState<React.ComponentType<any> | null>(null);
|
|
18
18
|
const [engine, setEngine] = useState<any>(null);
|
|
19
|
+
const [config, setConfig] = useState<{ minPlayers?: number; maxPlayers?: number } | null>(null);
|
|
19
20
|
const [fullState, setFullState] = useState<any>(null);
|
|
20
21
|
const [viewState, setViewState] = useState<any>(null);
|
|
21
22
|
const [gameOver, setGameOver] = useState(false);
|
|
@@ -31,6 +32,7 @@ export default function Preview() {
|
|
|
31
32
|
|
|
32
33
|
// Generate mock players
|
|
33
34
|
const mockPlayers = useMemo(() => {
|
|
35
|
+
if (playerCount === null) return [];
|
|
34
36
|
return Array.from({ length: playerCount }, (_, i) => ({
|
|
35
37
|
id: `player-${i + 1}`,
|
|
36
38
|
nickname: PLAYER_NAMES[i] || `Player ${i + 1}`,
|
|
@@ -42,15 +44,25 @@ export default function Preview() {
|
|
|
42
44
|
const mockPlayersRef = useRef(mockPlayers);
|
|
43
45
|
mockPlayersRef.current = mockPlayers;
|
|
44
46
|
|
|
45
|
-
|
|
47
|
+
const minPlayers = config?.minPlayers ?? 2;
|
|
48
|
+
const maxPlayers = config?.maxPlayers ?? 32;
|
|
49
|
+
|
|
50
|
+
// Load renderer, engine, and config dynamically
|
|
46
51
|
useEffect(() => {
|
|
47
52
|
import('/src/index.ts').then((mod) => {
|
|
48
53
|
setGameRenderer(() => mod.Renderer || mod.default);
|
|
49
54
|
if (mod.engine) {
|
|
50
55
|
setEngine(mod.engine);
|
|
51
56
|
}
|
|
57
|
+
if (mod.config) {
|
|
58
|
+
setConfig(mod.config);
|
|
59
|
+
setPlayerCount(mod.config.minPlayers ?? 3);
|
|
60
|
+
} else {
|
|
61
|
+
setPlayerCount(3);
|
|
62
|
+
}
|
|
52
63
|
}).catch((err) => {
|
|
53
64
|
console.error('Failed to load game module:', err);
|
|
65
|
+
setPlayerCount(3);
|
|
54
66
|
// Fallback: try loading renderer directly
|
|
55
67
|
import('/src/renderer.tsx').then((mod) => {
|
|
56
68
|
setGameRenderer(() => mod.default || mod.Renderer);
|
|
@@ -62,7 +74,7 @@ export default function Preview() {
|
|
|
62
74
|
|
|
63
75
|
// Initialize game when engine loads or player count changes
|
|
64
76
|
useEffect(() => {
|
|
65
|
-
if (!engine) return;
|
|
77
|
+
if (!engine || mockPlayers.length === 0) return;
|
|
66
78
|
const initialState = engine.init(mockPlayers);
|
|
67
79
|
setFullState(initialState);
|
|
68
80
|
setGameOver(false);
|
|
@@ -166,7 +178,7 @@ export default function Preview() {
|
|
|
166
178
|
|
|
167
179
|
// Clamp playerIndex when playerCount decreases
|
|
168
180
|
useEffect(() => {
|
|
169
|
-
if (playerIndex >= playerCount) {
|
|
181
|
+
if (playerCount !== null && playerIndex >= playerCount) {
|
|
170
182
|
setPlayerIndex(0);
|
|
171
183
|
}
|
|
172
184
|
}, [playerCount, playerIndex]);
|
|
@@ -213,10 +225,10 @@ export default function Preview() {
|
|
|
213
225
|
<h3 style={label}>Player Count</h3>
|
|
214
226
|
<input
|
|
215
227
|
type="number"
|
|
216
|
-
min={
|
|
217
|
-
max={
|
|
218
|
-
value={playerCount}
|
|
219
|
-
onChange={(e) => setPlayerCount(Math.max(
|
|
228
|
+
min={minPlayers}
|
|
229
|
+
max={maxPlayers}
|
|
230
|
+
value={playerCount ?? ''}
|
|
231
|
+
onChange={(e) => setPlayerCount(Math.max(minPlayers, Math.min(maxPlayers, Number(e.target.value))))}
|
|
220
232
|
className="dk-input"
|
|
221
233
|
style={inputBase}
|
|
222
234
|
/>
|