![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
Rash_forever |
![]()
Сообщение
#1
|
Member ![]() ![]() Группа: Authorized Сообщений: 16 Регистрация: 6-August 19 Пользователь №: 18,033 Спасибо сказали: 4 раз(а) ![]() |
Всем привет! Ребят такой вопрос кто знает как хранится графика в PS1 кроме TIM, хотел попробовать как то русский припилить в игру Clock Tower(фан в детстве был) собсна вопрос есть в игре архивы в них картинки, возможно модели и т.д. Текстуры вижу через тайловый редактор все нормально но если бы был TIM были бы и заголовки формата но их нет как узнать что за формат текстур и как можно распаковать для просмотра? Могу приложить пример архива или псевдоархива! Поможет кто?
|
![]() ![]() |
-=CHE@TER=- |
![]()
Сообщение
#2
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
Выложенный файл можно распаковать на отдельные составляющие вот так:
binunpak.c CODE #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <string.h> #include <stdint.h> #pragma pack(push, 1) typedef struct { uint32_t offs; uint32_t size; uint32_t zero; /* always zero? */ uint16_t number; /* number in group */ uint16_t last; /* last in group: 1 - yes; 0 - no */ } bin_item; #pragma pack(pop) int main(void) { uint32_t i, j, k, count; bin_item *list; FILE *fl, *f; char s[16]; void *p; fl = fopen("D1A.BIN", "rb"); if (!fl) { return(1); } fread(&count, 4, 1, fl); fseek(fl, 16, SEEK_SET); list = (bin_item *) malloc(count * sizeof(list[0])); if (!list) { fclose(fl); return(2); } /* relative offset */ k = 16 + (count * sizeof(list[0])); fread(list, sizeof(list[0]), count, fl); for (i = 0; i < count; i++) { sprintf(s, "%03u-____.DAT", i); p = malloc(list[i].size); if (p) { fseek(fl, list[i].offs + k, SEEK_SET); fread(p, list[i].size, 1, fl); memcpy(&s[4], p, 4); for (j = 0; j < 4; j++) { /* alpha or number */ if (isalnum(s[4 + j])) { continue; } s[4 + j] = '_'; } f = fopen(s, "wb"); if (f) { fwrite(p, list[i].size, 1, f); fclose(f); } free(p); } printf("%s\n", s); } free(list); fclose(fl); printf("\ndone\n\n"); return(0); } Как я понял, там всё: изображения, звуки, музыка, архитектура комнаты и прочее. Картинки, походу, в TIG0 файлах, но что это за формат я не в курсе. Подозреваю, что у TIG0 примерно такой формат: char[4] - TIG0 - сигнатура uint32_t - смещение до палитры uint32_t - смещение до палитры (опять, не знаю почему их два) uint16_t - количество записей в первой таблице uint16_t - количество записей во второй таблице uint16_t - количество записей в третьей таблице uint16_t - всегда ноль (выравнивание? количество записей в четвёртой? таблица опциональна?) далее идут две таблицы каждая запись в которой 8 байт: uint16_t - неизвестно uint16_t - неизвестно (иногда равно предыдущему значению) uint32_t - всегда ноль (?) каждая запись в третьей таблице 12 байт: uint32_t - смещение? uint16_t - ширина? uint16_t - высота? uint32_t - номер? Потом идёт палитра (см. смещение из заголовка) и уже сами изображения. Палитра, как я вижу, 768 байт (по 3 байта на цвет, но прядок (RGB, BGR и т.д.) не проверял). Кстати говоря, изображение, всё же, на мой взгляд, 8 бит, а не 4, ибо 768/3 = 256 цветов. Ах, да, crystaltile2 запустить не смог - оно почему-то падает с ошибкой обращения к нулевому (?) адресу. Спасибо сказали:
|
![]() ![]() |
Упрощённая версия | Сейчас: 1st May 2025 - 01:11 |