12월, 2024의 게시물 표시

RGSS Table 직렬구조 메모

https://github.com/zh99998/OpenRGSS/blob/master/lib/openrgss/table.rb#L49 OpenRGSS의 unpack 코드를 참고하여 Table 구조의 바이트 구조를 정리했다. ... 0x000001D992EEF216  75 3a 0a 54 61 62 6c 65  u:.Table 0x000001D992EEF21E  02   1c 07 03 00 00 00 14   ........ 0x000001D992EEF226  00 00 00 0f 00 00 00 03   ........ 0x000001D992EEF22E  00 00 00 84 03 00 00 4c  ...?...L ... 02  = 총 데이터 크기의, 자료형 크기 (2바이트) 1c 07 = 0x71c = 1820B = 20 + 1800 = 4Byte * 5개 + 2Byte * 900개 = 총 데이터 크기 03 00 00 00  = 0x3 = @size = 3 = 3차원 배열 14  00 00 00  = 0x14 =  @xsize = 20 = 맵 가로 길이 0f 00 00 00  = 0xf =  @ysize = 15 = 맵 세로 길이 03  00 00 00  = 0x3 =  @zsize = 3 = 맵 레이어 개수 84 03 00 00  = 0x384 =  @xsize * @ysize * @zsize =  900 = 타일 id 개수 4c 00 ... =  이후 2바이트씩 900개의 타일 id가 직렬로 나옴 (레이어#1: 300개, 레이어#2: 300개, 레이어#3: 300개) 아래는 Table을 불러오는 코드 작성 후 결과이다. Start reading "marshals/Data/Map001.rxdata" object of class RP...

Ruby Marshal 바이너리 파일을 읽는 C++ 프로그램을 개발 중

이미지
Ruby의 Marshal(직렬화)된 포맷 바이너리를 읽어서 출력하는 C++ 프로그램 을 만들고 있다. 몇몇 루비 토큰(Ruby 자료형을 구분하는 1개의 문자)들은 아직 처리하지 못했다. 대표적으로 USER_DEF 토큰이 그렇다. 토큰 정보는 아래 링크에서 많은 도움을 얻었다. https://docs.ruby-lang.org/en/2.1.0/marshal_rdoc.html 아래는 C++ 출력 결과이다. Start reading "marshals/marshal/game_system_instance.rxdata" object of class Game_System   :@encounter_disabled   false   :@magic_number   66   :@timer   99   :@save_count   77   :@map_interpreter   object of class Interpreter     :@wait_count     0     :@depth     0     :@branch     {     }     :@message_waiting     false     :@child_interpreter     nil     :@event_id     0     :@button_input_variable_id     0     :@main     true     :@move_route_waiting     false     :@map_id     0   :@menu_disabled ...