create-smore-game 2.1.0 → 2.2.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/package.json +1 -1
- package/templates.js +51 -7
package/package.json
CHANGED
package/templates.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// pnpm-workspace.yaml is no longer generated.
|
|
4
4
|
// npm workspaces are configured in root package.json instead.
|
|
5
5
|
|
|
6
|
-
const SDK_VERSION = '^2.
|
|
6
|
+
const SDK_VERSION = '^2.2.0';
|
|
7
7
|
|
|
8
8
|
export function rootPackageJson(name) {
|
|
9
9
|
return JSON.stringify(
|
|
@@ -373,6 +373,7 @@ export function App() {
|
|
|
373
373
|
const [roomCode, setRoomCode] = useState('');
|
|
374
374
|
const [controllers, setControllers] = useState<ControllerInfo[]>([]);
|
|
375
375
|
const [taps, setTaps] = useState<{ playerIndex: number; time: number }[]>([]);
|
|
376
|
+
const [customStates, setCustomStates] = useState<Record<number, Record<string, unknown>>>({});
|
|
376
377
|
|
|
377
378
|
useEffect(() => {
|
|
378
379
|
let mounted = true;
|
|
@@ -412,6 +413,11 @@ export function App() {
|
|
|
412
413
|
setControllers([...screen.controllers]);
|
|
413
414
|
});
|
|
414
415
|
|
|
416
|
+
screen.onCustomStateChange((playerIndex, state) => {
|
|
417
|
+
if (!mounted) return;
|
|
418
|
+
setCustomStates((prev) => ({ ...prev, [playerIndex]: state }));
|
|
419
|
+
});
|
|
420
|
+
|
|
415
421
|
screenRef.current = screen;
|
|
416
422
|
|
|
417
423
|
// Use screen.on(event, handler) / screen.off(event, handler) for dynamic event listeners.
|
|
@@ -715,7 +721,7 @@ import { App } from './App';
|
|
|
715
721
|
createRoot(document.getElementById('root')!).render(<App />);
|
|
716
722
|
`,
|
|
717
723
|
"src/App.tsx": `import { createController } from '@smoregg/sdk';
|
|
718
|
-
import type { Controller } from '@smoregg/sdk';
|
|
724
|
+
import type { Controller, ControllerInfo } from '@smoregg/sdk';
|
|
719
725
|
import { useEffect, useRef, useState } from 'react';
|
|
720
726
|
|
|
721
727
|
interface GameEvents {
|
|
@@ -727,6 +733,7 @@ interface GameEvents {
|
|
|
727
733
|
export function App() {
|
|
728
734
|
const controllerRef = useRef<Controller | null>(null);
|
|
729
735
|
const [myIndex, setMyIndex] = useState(-1);
|
|
736
|
+
const [me, setMe] = useState<ControllerInfo | null>(null);
|
|
730
737
|
const [count, setCount] = useState(0);
|
|
731
738
|
const [isReady, setIsReady] = useState(false);
|
|
732
739
|
|
|
@@ -745,6 +752,7 @@ export function App() {
|
|
|
745
752
|
controller.onAllReady(() => {
|
|
746
753
|
if (!mounted) return;
|
|
747
754
|
setMyIndex(controller.myPlayerIndex);
|
|
755
|
+
setMe(controller.me);
|
|
748
756
|
setIsReady(true);
|
|
749
757
|
});
|
|
750
758
|
|
|
@@ -779,7 +787,7 @@ export function App() {
|
|
|
779
787
|
touchAction: 'manipulation', userSelect: 'none',
|
|
780
788
|
}}>
|
|
781
789
|
{isReady && (
|
|
782
|
-
<div style={{ fontSize: '16px', opacity: 0.6 }}>Player {myIndex}</div>
|
|
790
|
+
<div style={{ fontSize: '16px', opacity: 0.6 }}>{me?.name ?? \`Player \${myIndex}\`}</div>
|
|
783
791
|
)}
|
|
784
792
|
<div style={{ fontSize: '48px', fontWeight: 'bold' }}>{count}</div>
|
|
785
793
|
<button
|
|
@@ -897,7 +905,7 @@ const controller = createController<GameEvents>({ debug: true });
|
|
|
897
905
|
// To control autoReady: createScreen({ autoReady: false }) or createController({ autoReady: false })
|
|
898
906
|
|
|
899
907
|
controller.onAllReady(() => {
|
|
900
|
-
playerInfoEl.textContent = \`Player \${controller.myPlayerIndex}\`;
|
|
908
|
+
playerInfoEl.textContent = controller.me?.name ?? \`Player \${controller.myPlayerIndex}\`;
|
|
901
909
|
});
|
|
902
910
|
|
|
903
911
|
controller.on('score-update', (data) => {
|
|
@@ -996,6 +1004,7 @@ const room = {
|
|
|
996
1004
|
gameId: '',
|
|
997
1005
|
status: 'waiting',
|
|
998
1006
|
readyIds: new Set(),
|
|
1007
|
+
customStates: new Map(), // playerIndex -> state object
|
|
999
1008
|
};
|
|
1000
1009
|
|
|
1001
1010
|
function toPlayerDTO(p) {
|
|
@@ -1142,6 +1151,20 @@ async function main() {
|
|
|
1142
1151
|
io.to(room.code).emit('smore:game-over', data);
|
|
1143
1152
|
});
|
|
1144
1153
|
|
|
1154
|
+
socket.on('smore:set-custom-state', (data) => {
|
|
1155
|
+
if (socket.role !== 'player') return;
|
|
1156
|
+
const prev = room.customStates.get(socket.playerIndex) || {};
|
|
1157
|
+
const next = Object.assign({}, prev, data && typeof data === 'object' ? data : {});
|
|
1158
|
+
room.customStates.set(socket.playerIndex, next);
|
|
1159
|
+
io.to(room.code).emit('smore:custom-state-changed', { playerIndex: socket.playerIndex, state: next });
|
|
1160
|
+
});
|
|
1161
|
+
|
|
1162
|
+
socket.on('smore:get-custom-states', () => {
|
|
1163
|
+
const states = {};
|
|
1164
|
+
room.customStates.forEach((state, playerIndex) => { states[playerIndex] = state; });
|
|
1165
|
+
socket.emit('smore:custom-states', { states });
|
|
1166
|
+
});
|
|
1167
|
+
|
|
1145
1168
|
socket.on('smore:return-to-selection', () => {
|
|
1146
1169
|
room.status = 'waiting';
|
|
1147
1170
|
room.gameId = '';
|
|
@@ -1163,6 +1186,7 @@ async function main() {
|
|
|
1163
1186
|
room.gameId = '';
|
|
1164
1187
|
room.status = 'waiting';
|
|
1165
1188
|
room.readyIds = new Set();
|
|
1189
|
+
room.customStates = new Map();
|
|
1166
1190
|
console.log(' [reset] Room reset by host');
|
|
1167
1191
|
if (typeof callback === 'function') callback({ success: true });
|
|
1168
1192
|
});
|
|
@@ -1537,7 +1561,7 @@ export function devHarness(gameId) {
|
|
|
1537
1561
|
var screenSysEvents = [
|
|
1538
1562
|
'smore:player-joined', 'smore:player-left', 'smore:player-disconnected', 'smore:player-reconnected',
|
|
1539
1563
|
'smore:player-character-updated', 'smore:rate-limited', 'smore:game-over', 'smore:all-ready',
|
|
1540
|
-
'smore:self-disconnected', 'smore:self-reconnected'
|
|
1564
|
+
'smore:self-disconnected', 'smore:self-reconnected', 'smore:custom-state-changed', 'smore:custom-states'
|
|
1541
1565
|
];
|
|
1542
1566
|
screenSysEvents.forEach(function(sysEvent) {
|
|
1543
1567
|
screenSocket.on(sysEvent, function(data) {
|
|
@@ -1619,7 +1643,7 @@ export function devHarness(gameId) {
|
|
|
1619
1643
|
'smore:game-over',
|
|
1620
1644
|
'smore:player-joined', 'smore:player-left', 'smore:player-disconnected', 'smore:player-reconnected',
|
|
1621
1645
|
'smore:player-character-updated', 'smore:rate-limited', 'smore:all-ready',
|
|
1622
|
-
'smore:self-disconnected', 'smore:self-reconnected'
|
|
1646
|
+
'smore:self-disconnected', 'smore:self-reconnected', 'smore:custom-state-changed', 'smore:custom-states'
|
|
1623
1647
|
];
|
|
1624
1648
|
ctrlSysEvents.forEach(function(sysEvent) {
|
|
1625
1649
|
controllerSocket.on(sysEvent, function(data) {
|
|
@@ -1735,6 +1759,16 @@ export function devHarness(gameId) {
|
|
|
1735
1759
|
return;
|
|
1736
1760
|
}
|
|
1737
1761
|
|
|
1762
|
+
// Relay custom state events to server
|
|
1763
|
+
if (event === 'smore:set-custom-state') {
|
|
1764
|
+
player.socket.emit('smore:set-custom-state', data || {});
|
|
1765
|
+
return;
|
|
1766
|
+
}
|
|
1767
|
+
if (event === 'smore:get-custom-states') {
|
|
1768
|
+
player.socket.emit('smore:get-custom-states');
|
|
1769
|
+
return;
|
|
1770
|
+
}
|
|
1771
|
+
|
|
1738
1772
|
// Block smore:* events
|
|
1739
1773
|
if (event.startsWith('smore:')) return;
|
|
1740
1774
|
|
|
@@ -1948,7 +1982,7 @@ export function devControllerPage(gameId) {
|
|
|
1948
1982
|
'smore:game-over',
|
|
1949
1983
|
'smore:player-joined', 'smore:player-left', 'smore:player-disconnected', 'smore:player-reconnected',
|
|
1950
1984
|
'smore:player-character-updated', 'smore:rate-limited', 'smore:all-ready',
|
|
1951
|
-
'smore:self-disconnected', 'smore:self-reconnected'
|
|
1985
|
+
'smore:self-disconnected', 'smore:self-reconnected', 'smore:custom-state-changed', 'smore:custom-states'
|
|
1952
1986
|
];
|
|
1953
1987
|
sysEvents.forEach(function(sysEvent) {
|
|
1954
1988
|
socket.on(sysEvent, function(data) {
|
|
@@ -2010,6 +2044,16 @@ export function devControllerPage(gameId) {
|
|
|
2010
2044
|
return;
|
|
2011
2045
|
}
|
|
2012
2046
|
|
|
2047
|
+
// Relay custom state events to server
|
|
2048
|
+
if (event === 'smore:set-custom-state') {
|
|
2049
|
+
socket.emit('smore:set-custom-state', data || {});
|
|
2050
|
+
return;
|
|
2051
|
+
}
|
|
2052
|
+
if (event === 'smore:get-custom-states') {
|
|
2053
|
+
socket.emit('smore:get-custom-states');
|
|
2054
|
+
return;
|
|
2055
|
+
}
|
|
2056
|
+
|
|
2013
2057
|
// Block smore:* events
|
|
2014
2058
|
if (event.startsWith('smore:')) return;
|
|
2015
2059
|
|