현재 프로젝트에서는 User가 게임에 입장하면 DB에 User가 플레이하는 캐릭터의 데이터가 생성된다.

    즉, User 캐릭터 테이블에 정보를 추가하는 것.

    그리고 웹 게임에서 여러가지 선택을 하면 변화하는 능력치가 테이블에, 이 과정에서 많은 자원이 요구된다. (또 코딩하기에 복잡하며, 확장성도 떨어짐.)

     

    그래서 떠올린 방법은 User 캐릭터의 정보를 DB에 저장하는 게 아니라, 게임을 시작할 때 캐릭터 객체를 만들고 DB에서는 캐릭터의 변화량을 저장하고 불러오는 것이다.

     

    텍스트 게임이기 가능한 설계이고, 그렇기에 떠올리기 조금 어려운 발상이었으나 순차적으로 쓰면 다음과 같다.

     

    1. 처음 유저가 게임을 시작하면 JS로 User의 캐릭터 정보를 담을 수 있는 객체를 생성한다.

    2. 유저가 텍스트 게임에서 선택지를 눌러서 특정 스테이터스에 변화가 발생하면, 무슨 변화가 발생했는지, 얼마만큼 발생했는지 그 로그를 DB에 저장한다.

     

    3. 유저가 이후 게임을 종료했다가 다시 접속하게 되는 경우, 초기 스테이터스를 가진 캐릭터 객체를 다시 만든 후, 테이블에서 데이터 변화량 로그를 불러와서 이에 맞게 다시 설정하여 유저에게 보여준다.

     

    이는 기존에 '플레이 로그 보기' 기능을 구현하려고 이미 계획했었기 때문에 더더욱 효율적인 코드라고 할 수 있다.

     

    먼저 타입 선언을 하면서 무슨 데이터가 들어가야할지 생각해보았다.

     

    //선택지 정보만 따로
    export interface OptionLog {
        //다른 interface들은 아이디를 왜 string으로 두었을까?
        id: string;
        
        //에피소드 안에서 몇번제 선택지였는가
        num: number;
    
        //어떤 종류의 스테이터스가 변했는가?
        status: string;
    
        //변화량이 얼마였는가?
        change: number;
    }
    
    //단일 로그 - 이걸 배열로 만들어서 한 게임의 로그로 만들기.
    export interface Log {
        //이 로그의 아이디
        id: string;
    
        //어떤 스토리(에피소드)였는지 그 아이디 저장
        episodeId: string;
    
        //선택지들의 필요한 정보만.
        options: OptionLog[];
    
        //몇번 선택지를 선택했는가? OptionLog[].num 으로 일치하는 선택지 찾는 함수 만들기
        selectNum: number;
    
    }
    
    export interface Character {
        //객체 생성시 고유 id구분은 필요 없을듯?
        
        /*무슨 장르 캐릭터인가? -> 이거에 따라 또 내부의 status 설정사항이 달라질 것 같으니
        스테이터스는 설정 X*/
        genre: string;
    
        //데이터 불러올 때 캐릭터 수치 변화 보여줄 로그
        logs: Log[];
    
    }

     

    '텍스트 어드벤처 게임 프로젝트 > 프로젝트 설계' 카테고리의 다른 글

    빌드 명세서  (1) 2023.05.14
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기