Подразумевается, что Вы хорошо знакомы с байткодом.
Пару моментов (типа используемые сокращения)
Из-за наличия нескольких версий игры, целевые файлы могут иметь разные имена. Под GameScreen.class я подразумеваю самый большой класс в игре
Изменение вкусняшек.
В общем так: для всех действий нам понадобится редактор class файлов. Например ByteCode Editor (тормознутый ФМ, но сама прога мощная), какой-нибудь файломенеджер и собстна сам Гиш.
Самих вкусняшек в игре, если я не ошибаюсь, штук 7-8. Как я выяснил, всего в игре их может быть 35, но не более одной на уровень!
Извлекаем из игры main.class (один из самых вкусных в игре, так там же задаются звуки), байткодером находим метод <clinit> и листаем с конца. на строке 174 находится строка объявления массива размером 35 чисел. Далее идет строчка iconst_0 - это порядковый номер уровня. Следующая строка - код вкусняшки. Если ее нет, то прописано iconst_0, если есть - sipush 1234 (ну собстна сам код). Ну вы уже поняли, что вам делать
Смотрим выше: массив, размером 5, с непонятными номерами. Это при каком по счету секрете открываются площадки (в версии для самсы. В других версиях это могут быть сначала дополнительные карты для мультиплеера).
Еще выше: еще один массив на 35 чисел. Это сколько секретов в каждом уровне (общее, я так понял, тупо складывается.). Тут тоже все ясно. Больше тут ковырять нечего. -Примечание: секретов на уровне НЕ МОЖЕТ БЫТЬ БОЛЬШЕ, чем задано здесь. Но может быть меньше.
Ковыряние текстов
Со слов Кирмана я знал, что параметры текстов хранятся в gamescreen.class. И тоже в методе <clinit>. В котором 10000 с х**ом строк.
На строке ~850 задается массив размером 159. Каждая строка имеет значение от 80 до 87. Это привязание к такому-то лицу. Таблица значении дана ниже. Потом идет еще массив такого же размера, но уже булиновского типа. При значении в нем переменной 1 происходит автовызов следующего текста. Ну то есть текстовая метка 80 имеет значение 1, значит она вызовет метку 81. (для тех, кто еще не понял - именно так и реализованы диалоги!)
(не забываем, что нумерация в классе начинается с нуля!) -Примечание: если вы, почему-то, не влезаете в изначальное число текстов, то можно их увеличить, просто расширив границы "массива".
Использование подсказок
Чуть выше этих двух массивов в gamescreen.class находится массив из 184 чисел (эта цифра поначалу меня смущала, она просто взята из старой версии). Значения, которые там стоят отвечают за подсветку определенной клавиши. Используя сумму можно вывести неограниченное число клавиш. 1 - (предположительно) 0 2 - 1 4 - 2 8 - 3 16 - 4 32 - 5 64 - 6 128 - 7 256 - 8 512 - 9 1024 - * 2048 - #
Например, 1032 выводит одновременно * и 3.
-ПРИМЕЧАНИЕ: на практике, не все эти кнопки можно вывести. У некоторых отсутствует изображение и упоминание в коде.
(карта: (указаны строки)) <=863 buttons 865-1507 chars 1508-2149 dialogs 2150-2364 BG_TILE_IS_TRANSPARENT 10169-10220 LOADING_TILESET 2378-10168 LOADING_TILES (уровни, порциями по 4 тайла. Четыре измерения: сверху вниз, справа налево, от дальнего к ближнему, по номеру)
Камера
-Примечание: начиная с этого момента ГОРАЗДО удобнее работать с компа. Также может потребоваться преверификация (именно из-за этого Gishcraft 0.0.5c и не работал) Здесь понадобится еще и ClassEditor. В gamescreen.class берем седьмой по счету метод "а". Ищем 45-ую строчку. Она большая. lookupswitch pad=2 def=347, 15, 23:131, 35:140, 47:148, 52:157, 55:166, 72:174, 97:183, 108:219, 112:192, 113:201, 115:210, 116:219, 130:280, 152:329, 158:338 например. *def - сколько байтов до конца всего этого дела (не трогаем()). *15 - сколько всего активных камер (не трогаем()). *число до двоеточия - ID текста, когда врубать камеру. *число после - на сколько байт перескакивать вперед (не трогаем()). Думаю здесь ясно.
bipush 16 /коорда по х (считается от левого края) istore_2 /не трогаем bipush 11 /коорда по у (считается от ВЕРХНЕГО края (все существующие редакторы считают от нижнего, поэтому надо ее вычислять)) istore_3 /не трогаем goto 212 /перескок в конец всего этого дела (не трогаем()) Здесь тоже все ясно. В принципе это все. Но если наше число не входит в iconst_x (а там только до 5)? Или мы добавляем новую камеру? Тогда нам нужно вручную поменять все перескоки по байтам (везде эти строки отмечены как (не трогаем()). Здесь нам и поможет класс эдитор. Ну думаю вы поймете как с этим работать. Скажу лишь, где еще надо подкорректировать значения: строка 38 Вроде это все.
Скрипты
Все слишком сложно В основном, все к тому, что необходимо найти айди текста, который вызывает код, и сменить его.
Работа с images(2).map
Для начала надо узнать как вообще идет работа с графикой в Гише. Каждое изображение имеет свой НЕ порядковый номер, по которому и вызывается картинка. Этот номер уникален для каждого изображения. Далее, точнее сначала. Графика загружается из .img - файлов. При этом из .map файлов и берутся номера картинок (для открытой версии от Киримана механизм тот же). Ну и теперь сама струтура. (Для ковыряния необходим НЕХ-редактор!) Поясню на конкретном примере. 00 62 00 FF 00 FE 00 FD 00 FC 00 FB 00 F9 00 F8 00 07 00 08 00 ED 00 E6 00 F4 00 F5 00 F6 00 F7 00 EE 00 EF 00 F0 00 F1 00 F2 00 F3 00 00 00 01 00 02 00 03 00 04 00 05 00 06 00 2E 00 2F 00 30 00 31 00 4D 00 4E 00 4F 00 EB 00 6D 00 7B 00 7C 00 78 00 79 00 7A 00 77 00 6E 00 6F 00 70 00 71 00 72 00 73 00 74 00 75 00 76 00 7D 00 7E 00 7F 00 80 00 81 00 82 00 83 00 84 00 86 00 87 00 88 00 8C 00 8D 00 8E 00 8F 00 90 00 91 00 92 00 93 00 94 00 96 00 97 00 98 00 99 00 5A 00 0A 00 0B 00 0C 00 0D 00 0E 00 0F 00 10 00 E7 00 E8 00 E9 00 49 00 4A 00 4B 00 50 00 51 00 52 00 53 00 54 00 55 00 56 00 57 Первые два байта - это общее число изображений, номера которых забиты далее. Можно легко вычислить по формуле ("ОР"-2)/2 , где "ОР"- общий размер .map файла. (везде в файле по понятным причинам шестнадцатеричная система счисления) Все что дальше - последовательно номера картинок. Напрмер логотип "Hardware" имеет номер 255, а картинка №98 (у меня - изображение "*") имеет номер 87 (тут я уже пишу в десятичной). Самые внимательные могли заметить, что в images.map и images2.map некоторые номера повторяются. Тут есть одна тонкость: у всех картинок, вбитые в images2, реальный номер на 256 больше, чем указанный. То есть, если там есть изображение с номером 278 (есть и такие), то из игры он вызывается номером 534. Это все, что я хотел тут написать.
Восстановление лавы
(Подразумевается, что вы знаете, как работать с .map файлами) Предыстория: в Гише образца 2008 года была адская зона, которая содержала ЛАВУ. Но у той версии отсутствует нормальный редактор и некоторые плюшки. Теперь же мы имеем Гиш Релоадед, с редактором, открытыми изображениями... И БЕЗ ЛАВЫ!!! Точнее она есть. Но если она попадает в поле зрения, то исчезают все объекты переднего фона, а также есть мертвый вис в диалогах. Методом научного тыка было установлено, что этот глюк возникает только из-за... отсутствия соответствующего изображения в архиве игры. А там уже я изучил код игры и понял, как это исправить. В общем пихаем наше изображение в архив игры, даем ему имя по порядковому номеру (разумеется последнему). Затем открываем images2.map, прибавляем 1 к значению в начале файла, а в конец дописываем "00 BB" (число установлено экспериментально). Вообще в новой версии есть еще 3 неиспользованных тайла переднего фона (их номера устанавливаются, предположительно просто идут подряд), одно из которых анимировано (но использовать его без вмешательства в код затруднительно, так как оно немного "наезжает" и использует последние картинки с переднего фона. Есть еще и 4 с заднего, их номера тоже неизвестны, но я не уверен, что редактор позволяет их ставить -Примечание: в Gishcraft'e 0.0.5d лава уже добавлена таким образом. Также там уже есть этот самый анимированныи тайл (без анимации причем :D), но он сделан вместо изображений веревок. Его айди 680 если че, надо через байткод сменить так, чтобы было 4 свободных места. -Примечание 2: так как img не поддерживает полупрозрачность, в некоторых версиях вода хранится отдельно. Лаву нужно впихивать туда же (36_alpha.png)
Замена графы (для версий с закрытой графикой)
Значит так, .img не такой и няша, ибо -Сохраняет пнгэшки только созданные определенным способом -И не больше 8 кб (пичаль) потрачено, можно и больше
Смотрим, какого размера наша картинка. Если меньше 8192 байтов (ну +-10 байт), то продолжаем.
Если же больше, то пробуем следующее:
Цитата
Берем PNGOut (он тут есть) и прогоняем картинку через него. Она немного убавит в весе, но радость не в этом. Он склеивает чанк IDAT, который GIMP разделяет на кусочки. Когда пропустили, то пробуем запаковать ту отдельную картинку (расписано ниже). Смотрим на IMG. Его размер должен быть ненамного меньше картинки. Если он весит меньше килобайта, то дело дрянь, ужимайте. Если как и надо, то пробуем распаковать. Если на выходе вышло то же, что и на входе - ура, можно сувать в игру.
Запускаем pack.exe Вписываем необходимые данные
И жмем Ентер
Теперь наш архив можно впихнуть в игру и мы сломаем игру
Распаковщиком пользоваться несложно, посему описывать не буду :гг:
ОФИЦИАЛЬНЫЙ УПАКОВЩИК Основной код вытащен без изменений из упаковшика, которым делали оригинальную игру, была дописана прослойка (спасибо aNNiMON'у!), позволяющая использовать его без сношений с ant.
Утилита является консольной, так сделано исходя из соображений автоматизации. Можно распаковать даже jar, оставив только b.class. 1. Кладете исполняемый файл в папку с картинками 2. Создаете там же bat файл с любым именем 3.1. Если оставили jar, то пишете следующее
3.2. Если распаковали и перенесли только b.class, то
Код
java b КОЛИЧЕСТВО_КАРТИНОК ВЫХОДНОЙ_ФАЙЛ pause
4. Для упаковки достаточно запустить. 5. В консоль будет выведен результат упаковки. Напротив каждой картинки будет цифра. 5.0 0 - все отлично. 5.1 1 - не удалось прочесть файл 5.2 2 - не удалось записать файл 5.3 3 - не найден чанк заголовка (IHDR) ((файл поврежден?)) 5.4 4 - не найден чанк палитры (PLTE) ((изображение не индексированное?)) 5.5 5 - не найден чанк с данными (IDAT) ((файл поврежден?)) 5.6 6 - неверный тип чанка с прозрачностью (tRNS) ((полупрозрачность на картинке?))
ДОБАВЛЕНИЕ графики
Может произойти так, что отведенных 53 для заднего, 73 для среднего и 56 для переднего слоя не хватит (зажрался), то можно вставить собственные тайлы. Для начала, вставим их в редактор. 1. Берем изображение. 2. В зависимости от слоя кладем в папку img_bg(mg)(fg) 3. Переименовываем по порядку 4... 5. ПРОФИТ Но сложнее добавить изображение прямо в игру. Задний слой Последнее изображение заднего фона имеет индекс 328, первое среднего - 407, итого можно впихнуть дополнительно 78 изображений. Каждому изображению мы задаем индекс в images2.map, причем в том порядке, в каком мы используем их в редакторе. Сия процедура описана выше. Помимо этого, в самом коде хранится, прозрачный тайл или нет. Если мы добавляем изображения, то мы должны задать и это тоже. Лезем в gamescreen.class, <clinit>, ищем массив на 53 элемента. Нам нужно будет приписать что-то типа dup bipush, хх (ПОРЯДКОВЫЙ номер изображения среди заднего фона) iconst_0 bastore Средний слой Невозможно Дальний слой Просто добавляем изображение с соответствующим айди в игру. Но нужно быть аккуратным, свободного места там не очень много. Тайл все равно не выводится. Что делать? -Возможно, индекс изображения не добавлен в .map файл -Число в первых двух байтах меньше, чем общее число изображений -Изображение должно быть правильно вставлено в игру, подробнее - работа с img (если такая проблема действительно имеет место, то будет своеобразный вывод в лог) -Не был добавлен дополнительный код в класс-файл
Редактирование текста в меню
Несмотря на то, что технология была отработана, исходя из определенных соображений эта часть широко не раскрывалась. Дело в том, что основные игровые тексты (не сюжет) проверяются по контрольной сумме в конце файла. 5byte.exe Как использовать:
1. Распаковать рядом с файлом текстов 2. Затереть в файле текстов последние 5 символов (квадратики и то, что после них) 3. Создать bat.file с текстом
Код
5byte ВХОДНОЙ_ФАЙЛ ВЫХОДНОЙ_ФАЙЛ
3.1 Входные и выходные файлы должны быть различными, нельзя писать одно и то же имя!
Ну в общем это все Спасибо за чтение и удачи. И я не говорил, что будет легко
Lite_one, по номерам текстов в GameScreen, основная масса там. Еще по номерам уровней надо смотреть (свинство в том, что они могут совпадать). Но эта переменная одна на все случаи жизни. В общем, надо прогнать все ключевые номера текстов и подогнать под старую версию. Тогда и сработает
Lite_one, таааак-с... вообще, я это не особо ковырял, но общий принцип такой: есть переменная, которая хранит этап сражения с боссом. В какие-то моменты она увеличивается на 1 (и это, причем, делает текстовая метка, вызывать ее может что-то свое). Конкретно у Геры есть 3 модели поведения, их можно кидать между собой
Цитата
И можно ли поменять индексы текстур которые нужно взять из среднего слоя для ближнего, те которые позиционируются как скрытые проходы?
я думаю можно, но лично я обычно просто подгонял средний слой так, чтобы нужные мне тайлы шли на ближний фон
St@SyaN, и последние два вопроса. Как устроены уровни с боссами (кроме honeybucket'a) ? И можно ли поменять индексы текстур которые нужно взять из среднего слоя для ближнего, те которые позиционируются как скрытые проходы?
Lite_one, я ща смотрю в код... вряд ли, при запуске создается векторная модель уровня в плане столкновений... я вообще не пойму, как туда пропихивается что-то иной формы. Надо попробовать найти колючки.
Код
if (game.gameScreen.tileset != 0 && game.tiles[0][i][j]== 11) game.tiles[0] = 51; // add light transparent background tile when in egypt/hell
глянь-ка, что дает установка 11-го тайла (темный). Мне что-т кажется, что это очередная штука, которая не была реализована
Мод игры Monty Python's Cow Tossing Знаменитые птички теперь и на Nokia 9.4!!! Это СЛУЧИЛОСЬ!!! Думаю игра не требует представления... но все же кратко надо пробежаться;)