feat(offline): hotseat creation roster + host-participate flow
NewGame offline 'with friends' now builds a local pass-and-play game: - lib/roster.ts: keep-last-valid name + roster->seats (unit-tested). - NewGame.svelte: master host-PIN gate (rows disabled until set), 'are you playing too?' prompt seating the host at row 0, 2-4 player rows with inline name validation + optional per-seat PIN, add/remove (remove behind the master PIN), variant + multiple-words, Start. - PinPad: verification via a verify(pin) callback (UI-held lock at creation, source-held in-game) instead of a lock prop. - i18n: hotseat.* (en + ru); the offline mode selector is now shown offline.
This commit is contained in:
@@ -398,6 +398,16 @@ export const en = {
|
||||
'pin.wrong': 'Wrong PIN',
|
||||
'pin.setNew': 'Set a new PIN',
|
||||
'pin.remove': 'Remove PIN',
|
||||
|
||||
'hotseat.hostPin': 'Host password',
|
||||
'hotseat.setPin': 'Password',
|
||||
'hotseat.changePin': 'Change',
|
||||
'hotseat.playerName': 'Player name',
|
||||
'hotseat.addPlayer': 'Add player',
|
||||
'hotseat.removePlayer': 'Remove player',
|
||||
'hotseat.hostPlaysTitle': 'Are you playing too?',
|
||||
'hotseat.hostPlaysYes': 'Yes, I play',
|
||||
'hotseat.hostPlaysNo': 'No',
|
||||
} as const;
|
||||
|
||||
export type MessageKey = keyof typeof en;
|
||||
|
||||
@@ -398,4 +398,14 @@ export const ru: Record<MessageKey, string> = {
|
||||
'pin.wrong': 'Неверный PIN',
|
||||
'pin.setNew': 'Задать новый PIN',
|
||||
'pin.remove': 'Удалить пароль',
|
||||
|
||||
'hotseat.hostPin': 'Пароль ведущего',
|
||||
'hotseat.setPin': 'Пароль',
|
||||
'hotseat.changePin': 'Изменить',
|
||||
'hotseat.playerName': 'Имя игрока',
|
||||
'hotseat.addPlayer': 'Добавить игрока',
|
||||
'hotseat.removePlayer': 'Удалить игрока',
|
||||
'hotseat.hostPlaysTitle': 'Принимаете участие в игре?',
|
||||
'hotseat.hostPlaysYes': 'Да, играю',
|
||||
'hotseat.hostPlaysNo': 'Нет',
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user