사용자:Hsl0/연구소/숫자야구 live
개발 재개 기존 위키방식 멀티플레이 게임처럼 접속상태를 크게 신경쓰지 않고 컨펌 없이 클라이언트 별로 각자 판단해서 진행할 예정. 서버에 업로드할 데이터는 가능한 한 사용자의 행동에 대응되는 것으로 최소화함
룰[편집 | 원본 편집]
- 9이닝으로 이루어짐. (9번의 기회)
클래식[편집 | 원본 편집]
- 기존 숫자야구와 동일한 룰
- 두 팀으로 나뉨
- 상대편의 숫자를 알아내면 승리
서바이벌[편집 | 원본 편집]
- 2팀 초과 가능
- 돌아가면서 공격할 숫자를 말하고 (각자의 결과 표시 or 제일 근접한 1인만 표시)
- 숫자가 공개되면 탈락
- 마지막 남은 사람이 승리
기술[편집 | 원본 편집]
- 자바스크립트 기반
- 실시간 채팅/대전은 한 문서를 편집하고 폴링을 통해 이전 리비전을 불러옴으로써 구현 - 외부 서버 없이 리버티게임 서버에서 미디어위키 API만으로 구현! (p.s. 과거 백괴실험실에서 구현한 바 있는데 다 날라감)
- 팀끼리의 대화는 AES 암호화
- 서버에 무리간다면 WebRTC 사용 고려
- 결정된 숫자는 시작 전 SHA 해쉬값을 공개 (commitment scheme) - 오리발 방지
- 레인보우 테이블 핵 사용의 우려가 있으므로 salt 사용
- 브루트 포스의 가능성이 있으므로 salt는 게임이 종료될 때(무한모드는 9이닝 종료때) 공개
- 단, 게임이 종료되고 일정 시간이 지날때까지 salt를 공개하지 않는다면 몰수패
- 레인보우 테이블 핵 사용의 우려가 있으므로 salt 사용
- 각 게임방별로 세 문서를 사용함.
- 정보 문서
- 사용자의 참가/퇴장, 게임 판 시작/종료를 관할 함.
- 올바른 판 문서에 연결할 수 있도록 정보 제공
- 각 리비전은 마지막 리비전만 보고 필요한 정보만 얻을 수 있도록 현재 판 시작 리비전, 제일 오래된 사용자 참가 리비전 번호를 제공
- 판 문서
- 대부분의 활동이 여기서 이루어짐.
- 각 판이 끝나면 교체됨.
- 팀 문서
- 팀전일 경우, 팀 별로 생성되는 팀 문서에서 팀 활동이 이루어짐.
- 정보 문서
데이터[편집 | 원본 편집]
ActionBracket 문법[편집 | 원본 편집]
action {}
- action 부분에 수행할 동작
- {} 부분에 JSON 객체 형식으로 추가 데이터
- 줄바꿈으로 한 리비전에 여러 동작 넣을 수 있음
정보 문서[편집 | 원본 편집]
enter[편집 | 원본 편집]
사용자가 방에 입장을 시도할 때 enter를 보냄
- client: 클라이언트의 버전 - 기존 사용자의 버전이 낮을 경우 새로고침을 시켜 업데이트하도록 함.
- sign: 비밀방에서 비밀번호를 이용한 비밀키를 통해
(사용자 이름)#(config의 비밀 메시지)
를 암호화하여 서명한 것
settle[편집 | 원본 편집]
인원수를 초과하지 않을 경우 입장을 확정함. 팀을 배정함.
- users: 접속한 사용자 수
- team: 팀 번호
correct[편집 | 원본 편집]
특정 사용자에게 info가 잘못됨을 알림.
- user: 사용자 이름
info[편집 | 원본 편집]
정보 문서에서 모든 리비전에 필수적으로 포함되어야 함. 새로 접속한 사용자에게 필요한 정보를 가리키는 리비전 정보 제공.
- cur: 현재 판 정보(move) 리비전
- oldest: 제일 먼저 접속한 사용자의 enter 리비전
- config: 제일 최근의 올바른 방 정보(config) 리비전
kick[편집 | 원본 편집]
특정 사용자의 강퇴 요청, kick이 일정 수 이상일 경우 해당 사용자는 강퇴.
- user: 사용자 이름
- reason: 이유 (hack: 핵이 감지되어 자동 강퇴, vote: 사용자가 직접 투표함)
- msg: 이유 (reason과 다르게 사용자가 직접 입력할 수 있음)
exit[편집 | 원본 편집]
스스로 방을 나감. 게임이 진행중일 때, 마지막 팀원일 경우 먼저 resign을 전송해야 함
move[편집 | 원본 편집]
한 판이 끝났을 때, 판 문서를 변경함
- new: 새로운 판 문서 이름
config[편집 | 원본 편집]
게임 방 설정
판 문서[편집 | 원본 편집]
change[편집 | 원본 편집]
팀을 변경함.
- team: 새로운 팀
ready[편집 | 원본 편집]
시작할 준비가 됨을 알림.
- public: 팀전에서 암호를 만들 공개 키 (판 별 첫번째 준비에서만 사용)
- salt: 팀전에서 목표 숫자의 hash에 사용할 salt 값 (팀에서 마지막으로 준비한 사용자만 사용)
unready[편집 | 원본 편집]
준비를 해제함
start[편집 | 원본 편집]
게임을 시작함. (방장 또는 마지막으로 준비하지 않은 사용자, 방 유형에 따라 둘 중 하나)
- public: 팀전에서 암호를 만들 공개 키
- salt: 팀전에서 목표 숫자의 hash에 사용할 salt 값
choose[편집 | 원본 편집]
자신의 숫자를 결정
- hash: 숫자의 해쉬값
timeout[편집 | 원본 편집]
자신의 턴에서 제한시간이 끝날 때, 아직 접속중임을 나타냄
chat[편집 | 원본 편집]
공개 메시지를 보냄
- msg: 메시지 내용
guess[편집 | 원본 편집]
상대의 숫자 추측
- num: 추측한 숫자
- team: 공격할 팀 (서바이벌 모드)
response[편집 | 원본 편집]
추측에 대한 응답
- 맞을 때
- answer: 추측한 숫자가 정답인지에 대한 여부 (여기서는 true)
- salt: hash에 사용된 salt
- key: 팀간에 사용된 암호 키
- 틀릴 때
- S: 스트라이크 개수
- B: 볼 개수
reveal[편집 | 원본 편집]
게임이 종료될 때 숫자가 공개되지 않은 나머지의 숫자를 공개함
- num: 자신의 숫자
- salt: hash에 사용된 salt
- key: 팀간에 사용된 암호 키
resign[편집 | 원본 편집]
게임을 중도 포기함. 데이터는 reveal과 같음
suspend[편집 | 원본 편집]
게임을 일시 중지함.
- reason: 이유
resume[편집 | 원본 편집]
일시 중지된 게임을 재개함
팀 문서[편집 | 원본 편집]
choose[편집 | 원본 편집]
팀이 사용할 비밀 숫자를 투표함
- num: 숫자
chat[편집 | 원본 편집]
팀끼리의 메시지 전달
- msg: 메시지 내용
guess[편집 | 원본 편집]
추측할 숫자를 투표함
- num: 숫자
공통[편집 | 원본 편집]
공통에 속하는 action은 모든 리비전에 필수로 들어감.
connect[편집 | 원본 편집]
- up: 업로드 소요 시간
- down: 다운로드 소요 시간
#[편집 | 원본 편집]
action 부분에 #으로 시작해서 무작위 문자열이 들어감. 내용이 중복될 때, 리비전이 구분되도록 함.