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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/templates.js +51 -7
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-smore-game",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "create-smore-game": "./index.js"
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.1.0';
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