HSPTV 부서의 start입니다.삭감술

올해(2016년)의 HSP 프로젝트 경연 저도 수상작을 결정하고 한 단락에 이르면 HSPTV 부문의 개인기를 쓰고 싶습니다.
실제 내용은 투고한 HSPTV 프로그램의 출처와 설명입니다.
게다가 이 보도는 Hot Soup Processor Advent Calendar 2016의 9일째 보도다.
HSPTV 부서는?
HSP 프로그램 경연대회에서 HSPTV 브라우저에서 실행되는 프로그램을 게시하는 부서입니다.
투고제한 사항가 있는데 이 제한 범위 내에서 공을 들여야 한다.
  • start.ax의 파일 크기는 6000바이트 이하입니다.
  • 지정된 이외의 소재(이미지, 소리 등)는 준비하지 않습니다.
  • OBAQ.DLL 이외의 확장 기능을 사용하지 않습니다.잠깐만...
  • 또한 순위 기능hsptv.as을 사용할 수 있다(링크 주소는 2011년 정보).
    차트에 포함된 리뷰 정보를 기존 리뷰가 아닌 데이터 영역으로 활용함으로써 위대전형 게임과 채팅 앱을 구현할 수 있다.
    원본 파일
    올해 HSP 프로그램 경연 투고 절차를 붙이다.
  • 작은 이야기 」( 출처 )
    start.Ax 내의 RPG 를 강제로 밀어 넣습니다.
    대화(예: KAWA Hakakakakakakakanadenari)를 반각 가명으로 입력하여 필드의 데이터를 자동으로 생성합니다.
  • 잡화점 경쟁 」( 출처 )
    순위 기능을 이용한 경영 시뮬레이션(?).
    괜찮은 ★에 따라 가게를 평가한다.
    다른 점포의 편집, 공개 기능 등.
  • 원본 파일을 보면서 start를 합니다.다음은 예를 들어ax의 삭감술을 설명한다.
    데이터 자동 생성
    방대한 양의 데이터는 start다.ax내 자동 생성 없이 사이즈 대폭 감소.
    예를 들어 알고리즘을 통해 자동으로 미로를 생성한다.
    하지만 자동으로 생성되는 프로그램 자체의 크기도 고려할 필요가 있다.
    짧은 이야기 맵은 데이터로 만들어지지 않고 자동으로 만들어진다.
    지상 영역은 이미지 소재인'bg04.jpg'로 생성됩니다.
    field_gen.hsp
    /*
    0…黒(壁)初期化時
    1…
    2…
    3…
    4…
    5…
    ど6…海
    う7…海浜,洞窟の地面
    屈8…石,洞窟の壁
    9…草原
    A…道
    B…林
    */
    //(中略)
    celload dir_exe+"\\hsptv\\bg04.jpg",3   //※dir_tvマクロを用いると、パス指定を短くできる
    //(中略)
    gsel 3
    repeat 96,8
        cnt2 = cnt
        repeat 96,8
            pget cnt*3+20,cnt2*3+125
            map(cnt,cnt2) = 0x0b - ( (ginfo_r+ginfo_g+ginfo_b)/19)\6
        loop
    loop
    
    디지털 레이아웃 맵에 필드 맵을 저장합니다.
    생성 알고리즘은 시험 실행 오류에서 발견되었다.
    필드 상황에 맞춰'가운데 섬에 마왕이 있다'는 이야기를 설정했다.
    생성된 원시 이미지와 함께 배열하면 분위기도 상응하는 비슷해진다.

    지하 감옥은 무작위로 만들어진 것이다.
    미로 생성 알고리즘을 사용하는 것은 재미있어 보이지만 단편 이야기에서는 크기가 작아지는 프로그램(좋은 미로가 아니다)을 구성하기에 상당히 적합하다.
    지하 감옥에 도시를 지었다고 생각하니 정말 다행이다.
    '주민들이 지하로 도망간다'는 이야기 배경에서 지하 미로와 도시를 동시에 사용한다.
    여러 줄 문자열은mes
    여러 줄 문자열을 표시할 때
    1line_1mes.hsp
    pos 480,0
    mes "雑貨屋競争"
    mes ""
    mes "人気ランキング"
    
    행별로 정의된 것이 아니라 행 분리자 "\n"을 사용합니다.
    multiline_1mes.hsp
    pos 480,0
    mes "雑貨屋競争\n\n人気ランキング"
    
    명령과 문자열.
    또한pos 명령으로 위치를 조정하지 말고 빈칸과 줄 바꾸기에 따라 조정해야 한다.
    이 예라면'인기 차트'위치에서 줄 바꿈을 쓴다.
    그러나 빈칸과 줄 바꾸기마다 1바이트를 먹어야 하기 때문에 현재 위치에서 너무 먼 곳에pos를 사용한다.
    에피소드의 괴물은 AA로 표현한다.
    각본상 이해하기 어려운 기술인데 어쩔 수 없네요.
    monster_aa.hsp
    monster_char = " ____\n≦ ・/|/| ̄≡\n  ̄ ̄ └ ̄└ ̄"/*バッタ、ドクカマキリ*/
    

    문자열 정렬을 하나로 병합
    이것은 모든 문자열의 배열에 적용되지 않지만, 문자열의 길이가 대체적으로 같을 때 유용할 것이다.
    예를 들어 단편 이야기의 항목 이름은 다음과 같다.
    itemlist_array.hsp
    object_name = "--------","話ス調ベル","宿屋    ","疲レドリンク","カギ    ","リピート薬 ","モンスの印 "
    
    및 배열 정의
    itemlist_1variable.hsp
    object_name = "--------話ス調ベル宿屋    疲レドリンクカギ    リピート薬 モンスの印 "
    
    및 고정 길이의 문자열
    그룹 정의에서 데이터를 구분하면 (쉼표) 용량이 상당할 것 같다.
    그러나 문자 열이 고정 길이로 바뀌면 어쨌든 긴 항목 이름과 맞물려야 하기 때문에 불필요한 공간을 채울 수 있다.
    또한 문자열을 추출하려면strmid를 사용하십시오
    itemlist_extract.hsp
    strmid(object_name,i*8,8)
    
    간단한 그룹 인용에서 사이즈를 선택하십시오.
    이런 방법을 사용할 수 있는 문자열 데이터는 유한하다.
    문자열에 수치 데이터를 잃어버리다
    이것은 개인이 추천하는 방법이다.
    6비트(0-63) 범위 내의 수치형 수조 데이터를 문자열 데이터에 넣습니다.
    예를 들어, 정의, 참조가 몬스터 색상표를 결정하는 데이터
    intdata_str.hsp
    monster_color = "-(DyE'D!?"//データ定義
    //(中略)
    color64 read_str_data(monster_color,monster_no)//データ参照
    //(中略)
    #deffunc color64 int c
        c_sub = c - 0x20
        color (c_sub>>4)*85,((c_sub>>2)&3)*85,(c_sub&3)*85
        return
    
    #defcfunc read_str_data var read_str_data_array,int read_str_data_ofset//※関数名はそのままstart.axに埋め込まれるので、短いほうがいい
        read_str_data_sub = peek(read_str_data_array,read_str_data_ofset)
        if read_str_data_sub>='。'{
            return read_str_data_sub-'。'+0x41
        }else{
            return read_str_data_sub-'0'
        }
    
    을 입력합니다.번잡한 원본 파일의 예가 되었지만, 아래의 절차로 데이터를 처리합니다.
    (1) 숫자 데이터에 문자 코드'0'을 붙여 1문자로 표시한다.
    (2)peek 명령을 통해 문자열에서 문자를 추출하고 문자 코드'0'빼기로 디코딩한다.
    0에서 시작하는 64자(6비트에 해당) 중 스크립트에 표현할 수 없는 문자가 없는 것 같습니다.그러므로
    str_decode.hsp
    peek(monster_color,monster_no)-'0'
    
    하지만 참조할 수 있습니다. -'0'은 목이기 때문에 전용read입니다.str_데이터 함수를 정의했습니다.
    또한,readstr_데이터 함수는 거의 7자리 데이터에 대응한다.
    시프트-JIS의 반각 가나의 영역을 굳이 활용하겠다면 약 7위권의 문자를 준비할 수 있다는 것이다.
    몇 개의 문자가 부족하기 때문에 엄밀히 말하면 7자리가 아니며 HSPTV랭킹 서버에 사용할 수 없습니다.
    서버의 주석 영역에 반각 가명을 사용할 수 없을 것 같습니다.
    read_str_데이터 함수는 6자리 범위 내에서 안정적으로 사용할 수 있지만 7자리 데이터는 아래 지도 데이터에서만 사용된다.
    경기장에 누가 있는지, 무슨 말을 하는지 등의 메시지가 담겨 있다.
    map_data.hsp
    map_data = "F=タ11000=テ31;:08j328W3=`32?83<_262809T270009M18000A:190009L4:400Ha53894Ha145b0Fe33F?4Y81;300X@33N84Qm262b0dX34DA0ェD1>000ョセ4:600`ョ35;<0hェ1A000gk36FS70000000゚"/*フィールド*/
    
    hsptv 디렉터리의 소재에 접근할 때
    여러 개의 소재를 사용할 때 기본 현재 디렉터리를 유지합니다
    deault_pass.hsp
    
    #define SE_IINE 2
    mmload dir_tv+"se_tyuiin.wav",SE_IINE
    #define SE_PUT 3
    mmload dir_tv+"se_foot.wav",SE_PUT
    
    현재 디렉터리를 이동하는 것보다 용량을 줄일 수 있다.
    chdir.hsp
    
    #define SE_IINE 2
    chdir dir_tv
    mmload "se_tyuiin.wav",SE_IINE
    #define SE_PUT 3
    mmload "se_foot.wav",SE_PUT
    
    참고, 매크로 dir-tv는 hspdef다.as에 따라dirinfo(5)로 정의됩니다.
    새 명령/함수 이름 줄이기

    바이너리 편집기 Stirling start를 사용합니다.ax에서 알 수 있듯이 #deffunc·#defcfunc가 정의한 명령명, 함수명은 이렇게 삽입되어 있다.
    짧은 이야기에는 지루한 이름이 있는데 잡화점 경쟁에서 문자의 명령, 함수명을 정의했다.
    1_defname.hsp
    #defcfunc c int c_index,int c_ofset //visit,iine専用
        //(省略)
    #deffunc u int u_index,int u_ofset,int u_option //visit,iine専用
        //(省略)
    #defcfunc r int r_index,int r_peekofset //comment専用
        //(省略)
    #deffunc w int w_data   //send_comment専用
        //(省略)
    #deffunc s array s_array    //バブルソート専用
        //(省略)
    
    cel* 명령 그룹으로 이미지 소재 그리기
    아는 사람에게는 당연한 일이지만, 같은 크기의 이미지 소재(아이콘 등)는cel* 지령군으로 그려진다.
    단편 이야기의 개발 초기에celput의 존재를 모르고 gcopy로 묘사했다.
    물론celput의 용량은 작아졌다.
    끝말
    start.가능한 한 ax의 사이즈를 줄여 대규모 게임을 만드는 것도 재미있지만 게임성과 게임의 균형이 중요하다.
    나의 투고 프로젝트에는 단편 이야기와 잡화점의 경쟁이 불친절한 점이 많다.
    HSPTV 프로그램의 크기에 따라 정리하는 것도 중요하다.

    좋은 웹페이지 즐겨찾기