사용자:Hsl0/연구소/숫자야구 live

리버티게임, 모두가 만들어가는 자유로운 게임

개발 재개 기존 위키방식 멀티플레이 게임처럼 접속상태를 크게 신경쓰지 않고 컨펌 없이 클라이언트 별로 각자 판단해서 진행할 예정. 서버에 업로드할 데이터는 가능한 한 사용자의 행동에 대응되는 것으로 최소화함

[편집 | 원본 편집]

  • 9이닝으로 이루어짐. (9번의 기회)

클래식[편집 | 원본 편집]

  • 기존 숫자야구와 동일한 룰
  • 두 팀으로 나뉨
  • 상대편의 숫자를 알아내면 승리

서바이벌[편집 | 원본 편집]

  • 2팀 초과 가능
  • 돌아가면서 공격할 숫자를 말하고 (각자의 결과 표시 or 제일 근접한 1인만 표시)
  • 숫자가 공개되면 탈락
  • 마지막 남은 사람이 승리

기술[편집 | 원본 편집]

  • 자바스크립트 기반
  • 실시간 채팅/대전은 한 문서를 편집하고 폴링을 통해 이전 리비전을 불러옴으로써 구현 - 외부 서버 없이 리버티게임 서버에서 미디어위키 API만으로 구현! (p.s. 과거 백괴실험실에서 구현한 바 있는데 다 날라감)
  • 팀끼리의 대화는 AES 암호화
    • 서버에 무리간다면 WebRTC 사용 고려
  • 결정된 숫자는 시작 전 SHA 해쉬값을 공개 (commitment scheme) - 오리발 방지
    • 레인보우 테이블 핵 사용의 우려가 있으므로 salt 사용
      • 브루트 포스의 가능성이 있으므로 salt는 게임이 종료될 때(무한모드는 9이닝 종료때) 공개
      • 단, 게임이 종료되고 일정 시간이 지날때까지 salt를 공개하지 않는다면 몰수패
  • 각 게임방별로 세 문서를 사용함.
    1. 정보 문서
      • 사용자의 참가/퇴장, 게임 판 시작/종료를 관할 함.
      • 올바른 판 문서에 연결할 수 있도록 정보 제공
      • 각 리비전은 마지막 리비전만 보고 필요한 정보만 얻을 수 있도록 현재 판 시작 리비전, 제일 오래된 사용자 참가 리비전 번호를 제공
    2. 판 문서
      • 대부분의 활동이 여기서 이루어짐.
      • 각 판이 끝나면 교체됨.
    3. 팀 문서
      • 팀전일 경우, 팀 별로 생성되는 팀 문서에서 팀 활동이 이루어짐.

데이터[편집 | 원본 편집]

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 부분에 #으로 시작해서 무작위 문자열이 들어감. 내용이 중복될 때, 리비전이 구분되도록 함.