[r][i][color=gray][url=http://klimaleksus.narod2.ru/Other/realms/174.txt]#174[/url], 15.09.12[/color][/i][/r] [quote=nihonjin]Мм ладно, вернусь к этому вопросу как только доковыряю SCPS.[/quote] А вы всё вытаскиваете и вытаскиваете из него всё новые и новые реплики… [quote=nihonjin]Насколько я помню это случилось толи при редактировании сообщения толи при "взятии предела", но однозначно при исправлении/добавлении информации. И да, всё у меня отображалось как на скрине,[/quote] Получается, что вы сбили всю фрумно-таблично-блочную структуру всех последующих комментариев на странице? [quote=nihonjin], поэтому я быстренько запечатлел такое чудо и поспешил вернуться(как при нажатии на [Backspace]) и поправил сообщение. Вообщем, продлилось это, наверное, около 10 минут.[/quote] Странный форум! Теги плохо защищены, например, не закрытый [ B ] или [ I ] может повлиять на все дальнейшие комментарии и надписи, хотя должен пресекаться автоматически. И широкие картинки страницу иногда раздвигают. [quote=nihonjin]На данный момент в основном центре моей деятельности 38 папок в которых 1589 файлов и занимает всё это 178мб. Хорошее пространство?[/quote] [s]Ну и бардак![/s] А почему так много весит? Со скриншотами вместе? Они хоть не BMP? [quote=nihonjin]А ведь ещё не лишне сопровождать таблички скринами(и их у меня по два на табличку - с надписью и с окрестностями), дабы предотвратить недопонимание.[/quote] Надо было додуматься сразу делать 512x256 ! [quote=nihonjin]И что значит: [quote=aleksusklim]придумайте символ переноса строки, любой[/quote] ?[/quote] Конец строки. Сейчас в чудо-кодировке, как вы её называете, этим символом служит FFh, то есть русская «я» строчная. Если вам потребуется записать табличку [u]в одну строку[/u], то вам придётся чем-то указывать место переноса. Разумеется, буква «я» как таковая не подойдёт, поскольку в этот момент таблички будут ещё написаны на кириллице. Значит нужно что-то вроде «/» или «\» или «&» – вам лучше знать, какой не будет встречаться в переводах (не в коде, а только в переводах). [quote=nihonjin]я думал, что фазаII - последняя.[/quote] У нас уже рамки в который раз раздвигаются, ослабляя ограничения на текст. А раз уж мы ещё и на стихи позарились, то хранить итоговые результаты всё равно где-то придётся. Не затирать же ими вторую фазу! [quote=nihonjin]Ну да, я же представил скрины. Т.к. решил, что так быстрее, чем с описанием.[/quote] Что мне понравилось в первой демке – так это быстрая смерть от воды, если Спаркса уже нет. Плюс ещё пузырики вылетают! Так быстро – замечательно; сделать бы так нам… [quote=nihonjin]С каких пор отечественные книги пишут на японском? Под "Лирика - для чтения" я имел ввиду "Лирика - для чтения на японском".[/quote] Вот так и знал, а… [quote=nihonjin]Мне итак кажется, что я забываю японский пока работаю над переводом Спайро. А вы в какой раз уже делаете меня иродом каким-то.[/quote] *тихо хихикает* Да просто мне непонятны люди, которые учат языки не в такой последовательности: Родной > Местный > Английский > Любой. (хотя я сам-то местного не знаю…) Многие сейчас почему-то изучают французский вместо английского. Ну зачем? Если полмира написано на английском языке, не лучше ли сперва именно его приручить, а потом уже браться за любой другой по желанию? [quote=nihonjin]Ну не скажите. Ваша тема довольно популярна(если смотреть на число просмотров).[/quote] [r]«смотреть на число просмотров и просматривать число смотрящих чисел»[/r] Я нисколько не понимаю, как работает счётчик просмотров темы. Когда я проверял ответы с ещё живого Siemens C60 (у которого за раз в экран не влазиет больше 12 Кб HTML кода…), я открывал список тем и «смотрел на число просмотров», сравнивая его с предыдущим запомненным состоянием. И если оно не изменилось с прошлого раза, значит заходить в саму тему бессмысленно. (Или ориентироваться на «число ответов», но может случиться так, что последний пользователь изменит свой последний пост. А так – самый верный метод – проверять автора последнего сообщения). [quote=nihonjin]Захожу я на "Спайропедию"(если даже не спайропедия, то точно какая-то wiki по Спайро) а там - три(кажется) баннера. Один Insomniaс, а остальные не помню(может издательств "легенды"). И что-то там по английски написано в духе "...всвязи с нарушением авторских прав..." <…> жаль скрин не сделал![/quote] Да тут не скрин надо делать, а спешно копировать всех и вся! [quote=nihonjin]Ну нет, там просто часто встречаются такие слова как Memory Card, Save, Load, Data и т.п. А так там катакана/хирагана встречаются примерно 50/50.[/quote] Из-за этой черты слова кажутся длиннее, и занимают больше места… [quote=nihonjin][quote=aleksusklim]А в Spyro1 разве есть вих…[/quote] Это вы так прикалываетесь, да? Потому что: [quote=aleksusklim]«вихрь» vs. «восходящий воздушный поток» = «фигня» vs. «супер японское настроение» ![/quote][/quote] Ай… Не, я.. Я не знаю что сказать. Спалился вообще с потрохами… Зато я сразу же нашёл один вихрь и влетел в него. Разница в том, что камера даёт затенение и показывает лишь вылет, без провожания вверх дракончика? И так происходит абсолютно на каждом вихре, или же небольшие работают как обычно? [quote=nihonjin]Может вы заметили, что я изменил цвет "обращения к модераторам" с красного на зелёный?[/quote] Нет. Да. Но я думал, потому что это мне нравится зелёный цвет… [quote=nihonjin]применение синего и красного цветов позволено лишь АМС[/quote] Неправда. По сути (особо не вникая в правила), можно сказать, что АМС позволено применять красный и синий цвет [b]везде где им захочется[/b]. А пользователи в обычных случаях не имеют права использовать такие цвета. Но при этом само применение красного/синего цвета не запрещено! Если оно адекватно. Если ни один другой цвет не подойдёт для данной цели, кроме как синий или красный. Если использование полностью оправдано. Тому на самом форуме есть десятки подтверждений, где был использован и красный и синий цвет, но настолько продуманно, что ни у кого рука не поднимется делать замечание. В принципе, ограничения на любые цвета и красный/синий в частности – лишь немного повышенные требования к оформлению текста, к обычному форматированию. Просто усиленная строгость, а если взять по факту (а не по весу/силе), то одинаковые ограничения стоят на все виды форматирования. Например, нельзя писать всё заглавными буквами. Или белым цветом. Или жирным. Или всё подчёркнутым курсивом. Или увеличивать размер текста. Или же уменьшать его. Центровать текст или сдвигать его по правому краю. Постоянно вставлять изображения. Но всё это можно делать! Если не злоупотреблять. Жирность, курсив, зачёркивание и регистр – особые виды акцентирования отрывков текста. Размер – явное выделение, с расчётом на то, что более пары строчек увеличивать никто не станет. Отцентрировать можно стих или заголовок. Изображения можно вставлять как смайлики например. Поэтому всё разрешено! Надо просто знать место и меру. [r]([i]писать красным – равно что материться. Постоянно нельзя, а изредка не помешает![/i])[/r] [quote=nihonjin]Или в подписи разрешено цветовое разгуляйство?[/quote] [s]По-моему, да…[/s] На худой конец в правилах же не написано, ЧТО именно считать красным цветом – FF0000 ? Ну так я предложил не его. Красный оттенок? И насколько же должна отличаться его численная составляющая? А насыщенность? Тёмно-синий разве считается за обычный синий? Если что – можно придраться к правилам, как я придрался к конкурсу. Нужен лишь прецедент… [quote=nihonjin]Я неправильно понял ваше "где конкретно сказано". Счёл за то, что вы спрашиваете "где это есть в игре?". В то время как похоже подразумевается "в каких источниках описывают цветные сферы?". Я искал на русской и английской спайропедиях, а так же в той вики, по которой вы спрашивали "Так «possibly» или достоверно?". Кстати, в последней написано про сферы в Skylanders'ах.[/quote] Да! И: [quote=nihonjin]«Хоть сам правь» подразумевает "хоть сам редактируй статью по сферам на спайропедии".[/quote] Пф, я понял!! Но раз вы сказали, мол «…написано, что сферы не только зелёные – хоть сам правь…», значит, что [b]вы сами[/b] [u]не видели и не знаете[/u] [i]незелёных сфер[/i]. Поэтому я и спросил, «где конкретно сказано» (то есть где надпись про незелёные шары) и «а какими ещё» (то есть какие ещё цвета кроме зелёного там даны); черта «/» обозначала, что если вы не дадите ответа на второй вопрос, то по ответу на первый я сам смогу его узнать, прочитав статью; поэтому мне нужен был ответ на любой из этих вопросов. Так что же значит «хоть сам правь»? [quote=nihonjin]Уу, боюсь это выше моих возможностей.[/quote] Наверно всё просто – стандартное blend-смешивание. Как делает Game-Maker или вообще кто угодно. А теперь: [hr] Нет! Мне не хватило терпения закончить ответы как полагается, потому что я сейчас побудился (предыдущей цитатой) к новым дизассемблерическим экспериментам, и если не поделюсь итогами немедленно, то могу просто забыть, что из чего я смог получить. Давайте сначала все результаты стопкой продемонстрирую: [spoiler=скриншоты!]. http://klimaleksus.narod2.ru/Files/JAP/letters_1.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_2.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_3.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_4.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_5.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_6.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_7.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_8.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_9.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_10.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_11.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_12.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_13.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_14.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_15.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_16.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_17.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_18.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_19.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_20.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_21.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_22.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_23.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_24.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_25.jpg http://klimaleksus.narod2.ru/Files/JAP/letters_26.jpg . [/spoiler] (указывать в тексте буду по номеру) Ну так я не понял, [b]nihonjin[/b], вы можете/хотите/умеете/будете интересоваться и работать на ps2dis? Взламывать игровой код вместе со мной? Потому что я когда преступаю ко взлому, я могу продвинутся далеко-далеко так, что в конце останется лишь сухой результат без знания всех этапов процесса. Мне неохота останавливаться на полпути, чтобы сказать о том, что именно осталось закончить – я лучше сразу закончу! Но тогда придётся совершать тот же повторный взлом, чтобы вспомнить какие-то промежуточные результаты. Другое дело вы. Вы сейчас в табличках просто мастер – по вашим результатам и подробнейшим описаниям можно даже хоть сейчас составить полный план-характеристику, чтобы обосновать, что откуда следует. Вы успеваете не только проделать огромную работу, но ещё и выложить её в полноценном виде! Не то что я – либо молча хакерничаю и экспериментирую, либо только описываю уже совершённые подвиги – но не одновременно. Так может хакером Spyro1 станете вы? [spoiler]Уф, ну это те же расширяющиеся возможности. Когда у меня был Game Maker 7 Lite, я хотел иметь Pro, но не имел. Поэтому мне пришлось работать с тем, что есть, и писать игры в определённых рамках. Когда появился Pro, мои возможности резко расширились, я уже мог совершать нечто запредельное! А с приходом Game Maker 8 я стал ещё могущественнее. Но суть не в этом. А в том, что когда был седьмой – я оставался рад и доволен тем, что есть. Но появился восьмой – и я перестал понимать, каким образом я мог вообще пользоваться таким отсталым седьмым! Я жадный. Я хочу больше! Пока был Lite, я использовал его на 100%. Я мог всё в своих пределах, но не собирался их превышать. Появился Pro – и я уже свободен. Но снова (как газ) занимаю весь предоставленный объём, опять упираясь в непреодолимые рамки. И теперь меня уже не заставить писать на Pro, используя его как Lite, то есть не на полную мощность. Другой пример. Интернет! Я на 25 Кб/сек сейчас выжимаю из него всё что только выжимается, мой КПД навскидку – более 85% ! И я остаюсь в покое и умиротворённости. Что будет со мной, если мой интернет станет вдруг высокоскоростным и безлимитным!? Я же и его захочу максимально использовать, что чревато большими замашками, нерациональностью и пренебрежением к тем аспектам, о которых трепетно забочусь сейчас. [r]Рыцарь убивает дракона, превращаясь в нового дракона![/r] Ближе к нам: Длина текста в Spyro3, да и Spyro1. Поначалу мы не могли её менять. И всё было прекрасно – укладывайся себе в рамки, жертвуй точностью перевода, экономь кодировку. Цель была проста и понятна. Но вот я взломал эту самую длину. Что произошло? Теперь мы не ограничены в рамках? Ложь! Рамки просто стали гораздо шире. Теперь длина ограничивается визуальным отображением на экране, шириною букв, физическим местом на диске (более 700Мб текста не влезет ну никак, разве что взломать CD и превратив его в DVD, причём не меняя формат записи…) – ограничивается всё равно. Однако теперь мы МОЖЕМ писать тексты длиннее прежних – значит нужно опять заполнить все существующие рамки, причём чем ближе к ним, тем «лучше»… Изображения. Заставки. Сценки. А финальные титры – я почти что могу заменять одни миры в них на другие; но ещё немного – и я смогу даже управлять движением и направлением камеры! К чему это приведёт? К тому, что я ВЫНУЖДЕН буду придумать для камеры новый лучший маршрут… Теперь в Spyro1 я взломал ширину букв, получив не настолько ограниченное пространство для текста во многих игровых местах. Что это дало? Не благодать! А муки – по поводу того, как же использовать это самое новое пространство наиболее рационально. Блин, дойдёт до того, что мы всю игру под себя перепишем, не оставив в ней ничего заводского. Это прекрасная цель, но за неё придётся щедро платить силами и временем. Сейчас я взломал цвета букв. Что это даст? Многочасовые раздумья о том, какими же своими цветами следует заменить заводские, чтобы было максимально «хорошо». Чем больше у нас возможностей, тем нам же хуже! Змея кусает себя за хвост! Чем больше мы раздвигаем рамки, тем больше труда приходится затрачивать, чтобы достойно использовать освободившееся пространство, чтобы в конечном итоге снова раздвинуть рамки… Мне надоело гнаться за своей тенью. А сейчас я приручил божественное оружие – дизассемблер. С его помощью я могу ВСЁ. И я хочу всё. Но знаю точно – если я получу это «всё», то непременно захочу больше… …Люди, среди вас есть кто-нибудь без таких заморочек? nihonjin? Делайте то же, что и я, но с включённым тормозом в голове. Иначе игру мы не переведём. Ни «сейчас», ни «когда»…[/spoiler] Вы разобрались с ps2dis? Читать, в принципе, нужно лишь две статьи – про мнемонику MIPS и про горячие клавиши в программе. Для изменения чего-то на лету ArtMoney не подходит (по непонятным причинам). Хорошо (у меня по крайней мере) работает мой MemGet с настройками по умолчанию. Ещё раз, действия для изменения ячейки налету: 0) Подготовка: открыть ps2dis, WinHex, MemGet и Epsxe. В каждую программу соответственно загрузить нужный файл: в эмулятор – игру, сохранится F1; в MemGet подтвердить и прочитать, получив дамп памяти; его же загрузить в ps2dis, проанализировать, и в WinHex тоже загрузить дамп. 1) Загрузиться в Epsxe (F3) и быстро свернуть его. 2) Переключится в MemGet и считать. 3) Перейти в ps2dis, продолжая рассуждения; придумать опыт – скопировать адрес ячейки. 4) Перейти в WinHex, по имеющемуся offset записать какие-то данные, согласно задумке; сохранить. 5) Вернуться в MemGet и записать обратно в процесс изменённый дамп. 6) Развернуть Epsxe, чтобы проверить результат (хорошо бы в документе запись об этом сделать, иначе после десятка итераций совершенно запутаетесь в результатах) 7) Перейти к пункту 1. Причём Epsxe по ходу дела (с 2 по 5) лучше вообще не трогать – не переключаться в его окно даже при остановленной эмуляции! А теперь давайте я расскажу (хотя почти забыл…), как я нашёл ширину тайлов для букв. Сначала я попытался оттолкнуться от какой-нибудь японской надписи, но не таблички. Потому что табличка отрисовывается по-особому, побуквенно. В то время как фразы из меню паузы рисуются целиком. Но мне с первого раза не повезло, потому что я напоролся на «Выход?» с вопросительным знаком на конце, которого не было в SCPS. Я принялся искать его по субфайлам, потом в ОЗУ, потом нашёл уже в самом её конце, куда он копируется каждым шагом. Ну короче, это оказался неудачный пример. Определил надпись в EXE. Сдампил память и через WinHex отыскал нахождение тех же данных уже в ОЗУ (2Мб). Этот же дамп памяти загрузил в дизассемблер, по нулевому адресу. [u][b]*Окончание ниже*[/b][/u] [u][b]*Начало выше*[/b][/u] Фишка в том, что ps2dis имеет два параллельных адресных пространства – начинающиеся с «00000000» и с «80000000». В них хранится одно и то же. Причём за правильностью ссылок следит он сам! Мне сначала казалось, что это приведёт к путанице, но на самом деле так удобнее. Просто сразу следует перейти к «80000000», чтобы оказаться в «реальных» адресах. Ну а в WinHex нумерация как обычно начнётся с нуля. Поэтому можно [b]просто стирать или добавлять «800»[/b] (или 8000, смотря сколько разрядов занято; короче – все нули) в начале любого адреса, чтобы транспортировать его между WinHex и ps2dis. Ну так вот, а перешёл в ps2dis по адресу начала СТРОКИ. Он показал непонятный мнемонический код, который не имеет логического смысла, потому что является не кодом, а надписью. Поэтому нужно удержать кнопку «B», чтобы интерпретировать его как двоичные данные, а не ассемблер. Выделяю первую строку (Space) и прошариваюсь по рефералам (F3). У каждого нужно осмотреть окрестности, чтобы попытаться понять структуру и назначение кода. Ну короче, я заметил, что функция «80022868» повторятся ОЧЕНЬ часто. Там были и другие функции, но они располагались как-то разрозненно, а вот именно эта – везде. Ну я и решил её рассмотреть получше. Вначале там задавались множество констант. По-идее ведь система должна знать: – Во-первых, координаты на экране для рисования; – Во-вторых, координаты каждого тайла буквы из GPU; – В-третьих, сопоставление между байтами субфайла/EXE и отдельными тайлами; – В-четвёртых, режим смешивания, цвет и местонахождение палитры. Следовательно, где-то [i]недалеко[/i] от места ссылки на надпись, должны задаваться в явном виде хотя бы некоторые из этих констант. Ужасно повезло, что за них как раз и отвечает золотая 22868. Ух, лишь пройтись по её рефералам – откуда только нет на неё ссылок! Дерзнул изменить значение одного регистра – ура, ширина поменялась! А всё далее – плод продолжительных исследований и взломов. nihonjin, вы готовы стать мной? Действуйте как я и рассуждайте как я. Тогда сможете взломать вообще всё что угодно, и определить свойства любой надписи. Зачем? Ну например, в спидвеях или меню подкорректировать выравнивание. Отцентровать текст «разбухших» от нашего вмешательства табличек. В атласе разметить столбцы по-другому, чтобы перед «/» не оставалось столько пустого места. Короче, достоинств куча ([s]и забудьте про то, что написано под спойлером, я пошутил![/s]). Очень трудно досконально описать мышление прошедших (успешных) взломов, поэтому давайте я проведу ещё один, но незаконченный. Просто так, без развития (ведь иначе добьюсь какого-то результата, но при этом сразу забуду способ его достижения!) http://klimaleksus.narod2.ru/Files/JAP/letters_27.png Это часть вашего скриншота. (Кажется, то место, где вы описали некую «камеру» и «замену стрекозы», а может я и напутал, неважно). Чё там написано не знаю. Зато могу примерно поискать текст в EXE. http://klimaleksus.narod2.ru/Files/JAP/letters_28.png Ну вот он текст. Теперь дамплю память и нахожу его там (ну я сделал «Copy hex values», а потом «Find hex values») http://klimaleksus.narod2.ru/Files/JAP/letters_29.png Как видите, то же самое, но другой offset: был «689F4», стал «781F4» (все адреса следует держать в шестнадцатиричной форме, потому что ps2dis только с ними работает) Беру этот адрес и превращаю в реальный: «800781F4». Перехожу в дизассемблер (в который загружен тот же дапм и уже «проанализирован» через меню) и прыгаю к этому адресу (клавиша «G» или в меню): http://klimaleksus.narod2.ru/Files/JAP/letters_30.png (Кстати, в меню «View > Kanji Code Set > SHIFT JIS» надо отметить, иначе вверху не будут показываться кириллические байты). Ну понятно да, что этот зверский код типа «(lwc2) a2, $bdd3(t7)» – это не код, а всего лишь ошибочная интерпретация строковой надписи. Поэтому удерживаю «B» и вижу следующее: http://klimaleksus.narod2.ru/Files/JAP/letters_31.png Вот это уже яснее. Причёт в третьем столбце отмечены строки, на которые _могут_ существовать ссылки с других мест. И действительно, они указывают только на начала записей. Мы как раз находимся на одной из них. Нажимаю пробел (строка становится серая) и «F3» – попадаю к первому ссылающемуся: http://klimaleksus.narod2.ru/Files/JAP/letters_32.png Первому и единственному, что прекрасно. Если немного осмотреться и пройти вверх: http://klimaleksus.narod2.ru/Files/JAP/letters_33.png Это функция номер «1D5E4». Ни о чем не говорит. Поэтому лучше смотреть на предыдущий скриншот. Оператор загружает адрес нашей строки в регистр «a0». Причём ниже по коду он никак не используется. А следующим же оператором идёт вызов функции «176C0». Взгляните на код дальше – эта же функция вызывается целых три раза, причём: http://klimaleksus.narod2.ru/Files/JAP/letters_34.png Синим выделена строка, [i]очень похожая[/i] на ту, с которой мы начали, потому что она загружает что-то в регистр «a0», после чего – выполняет функцию «176C0», которая выделена серым. (Вообще-то не совсем так: сперва считывается байт по адресу «80082DE8» (две строки выше) в регистр «v0», потом исполняется синяя строка, затем система прыгает к функции если байт равен нулю; а иначе предварительно перезаписывает содержимое «a0» другим адресом) Перейдём-ка (кнопка стрелкаВправо) от синей строки на её назначение: http://klimaleksus.narod2.ru/Files/JAP/letters_35.png Мы оказались там, где были изначально, то есть на надписях, однако уже на другой строке. Эти адреса (a0) грузят японские слова, но передают их в функцию «176C0» сразу, без обработки здесь. Возвращаемся и переходим к этой самой функции: http://klimaleksus.narod2.ru/Files/JAP/letters_36.png Синее – первый адрес (начало) функции; серое – новая функция, перед которой расположен возврат «jr ra» (правда после него ещё один оператор, но мы-то знаем, что он успеет исполниться до того, как система покинет функцию) Исследовать что-то такое небольшое, как эта «176C0» мне по душе. Начнём! Листинг: 800176c0: lbu v0, $0000(a0) 800176c4: nop 800176c8: beq v0, zero, $800176e8 800176cc: nop 800176d0: addiu a0, a0, $0001 800176d4: sb v0, $0000(a1) 800176d8: lbu v0, $0000(a0) 800176dc: nop 800176e0: bne v0, zero, $800176d0 800176e4: addiu a1, a1, $0001 800176e8: jr ra 800176ec: sb zero, $0000(a1) Вспоминаем, что в «a0» передаётся адрес первого символа в тексте фразы. Итак, сначала в регистр «v0» загружается (LBU – предполагаю, Load Byte Unsigned) первый байт фразы. Потом он сравнивается с нулём, и если это так, то происходит переход к строке «…e8» (ну 800176e8), что является конечной точкой функции – выход. Но наш первый байт заведомо не нулевой, так что выполнение продолжается ровно. К значению «a0» прибавляется единица, то есть адрес отныне указывает на второй символ надписи. Теперь байт из «v0» (первый символ) сохраняется по адресу, записанному в «a1», а я не знаю что там. Ну предположим, что в «a1» уже был сохранён некий адрес заранее. Дальше в «v0» загружается новый байт по «a0», а это второй символ. И если он не равен нулю, то система переходит к строке «…d0» (новое прибавление к «a0» единицы), но предварительно регистр «a1» тоже инкрементируется, то есть происходит одновременный сдвиг как источника данных, так и назначения, в которое они перезаписываются. Получается, что надпись [b]копируется[/b] с адреса «a0» на адрес «a1» до тех пор, пока не встретится нулевой завершающий байт. После чего «a1» ещё раз инкрементируется (может специально, может случайно), и система встречает JR RA – выход из функции. Теория такова, что данная функция реализует копирование имеющейся надписи в какую-то область ОЗУ. Возможно, для последующего изменения или рисования оттуда. Ладно, мы выяснили, что делает «176C0», пора хоть вскользь взглянуть на окончание «1D5E4»: http://klimaleksus.narod2.ru/Files/JAP/letters_37.png Ну, как видно, функция длинная и непонятная. А под концом запускаются ещё некоторые и различные и одинаковые функции. Их бы тоже можно исследовать… Ну а чуть повыше в коде: http://klimaleksus.narod2.ru/Files/JAP/letters_38.png Рисовалка! Та самая функция «22868», где расположена ширина букв и вся отрисовка. Настало время проверить теорию о том, что «176C0» просто копирует строку символов из одной части памяти в другую. Вспоминаю, что «Выход?» именно копируется из SCPS в конец ОЗУ. Так может это тоже происходит вызовом копировальщика? А как проверить? Запороть сам копировальщик! Либо занулить середину, либо повесить JR RA в начало. Адрес начала – «800176C0». Переходим в WinHex по «176C0» в файле дампа памяти: http://klimaleksus.narod2.ru/Files/JAP/letters_39.png Курсор на начале функции, выделен JR RA из предыдущей функции выше (два оператора назад; при сверке двоичных данных не забудьте, что ps2dis выводит байты задом наперёд, то есть «03E00008» обозначает «08 00 E0 03»). Смысл в том, чтобы скопировать это число «08 00 E0 03» («65011720» в десятичной) и записать его по адресу начала функции. А раз следующий же оператор – ноль (NOP), то система при попадании в функцию просто немедленно покинет её. Вот так: http://klimaleksus.narod2.ru/Files/JAP/letters_40.png А чтобы загрузить это в эмулятор, я воспользовался уже описанным методом через MemGet. Эмулирую: http://klimaleksus.narod2.ru/Files/JAP/letters_41.jpg В самом меню всё в порядке. А если войти в подменю: http://klimaleksus.narod2.ru/Files/JAP/letters_42.jpg Пусто! Как я и предполагал. Однако ни на таблички, ни на многое другое это не повлияло. Всё что я нашёл – только вот этот «Выход?»… Интересно то, что если выйти из подменю и войти в него снова (заставить перерисовать надпись), то «мусорный» символ может поменяться: http://klimaleksus.narod2.ru/Files/JAP/letters_43.jpg В большинстве случаев фигурировали только они. Но однажды (без выхода из эмулятора, просто долго тыкал в меню) выскочило это: http://klimaleksus.narod2.ru/Files/JAP/letters_44.jpg Взлом закончен. Результаты «открыты» – то есть пока практического применения этому нет, но оно может появиться после; либо моё описание станет служить неплохой демонстрацией примера верного хода мыслей. Что ещё можно там доломать? Проверить ссылающихся на саму «1D5E4» или проанализировать функции в её конце – работка всегда найдётся! Ну а теперь перехожу к описанию того, что же я смог открыть в «22868» – рисовалке. Модифицированный скриншот: http://klimaleksus.narod2.ru/Files/JAP/letters_45.png Первая строка функции производит какие-то действия над «a3» (который передан как аргумент), а именно извлекает из него верхние два байта в «t0». На второй строке из «a3» удаляются верхние байты (логическое И на $FFFF как раз и обрежет старшие два байта, которые через SRL уже сохранены в «t0»). Таким образом в одном аргументе «a3» функция получает сразу два значения. Далее идёт загрузка в «t0» и «t1» ширины и высоты букв. Но поскольку есть два набора катаканы, для больших букв вступают в силу другие параметры, которые активируются в зависимости от флага «t0» (верхних байт бывшего «a3»). Больше ни для чего «t0» не используется, потому что его содержимое явно перезаписывается константой ширины, которая (наверно) не меняется в коде ниже. Затем в «at» загружается определённый адрес, «79598» (80079598). Регистр «a3» (переданный; два младших байта) сдвигается на два бита влево, то есть из «1» превращается в «4»; из «2» – в «8», из «3» – «C» (12). Очевидно, значение a3 передаёт сдвиг строки или считываемого значения, причём сразу на четыре байта. И тут же прибавляется к «at», сохраняясь обратно в «a3»! Теперь «a3» может принимать либо исходное значение от a»t», либо больше (в зависимости от бывшего), но шаг кратен четырём. Корочь, тупо арифметика: t0=int(a3/65535) a3=a3 mod 65536 at=80079598 a3=a3*4 a3=a3+at А потом сразу же «a3» перезаписывается теми четырьмя байтами, на которые указывает. Что бы это могло быть? Как видно по скриншоту, я заменил строку «andi a3, a3, $ffff» (в которой a3 принимала переданное ранее неизвестное значение в диапазоне от 0 до 65535) на «addi a3, zero, $0001» (то есть явное присвоение того значения, которое я выберу). В WinHex это ячейка: http://klimaleksus.narod2.ru/Files/JAP/letters_46.png Запустил с разными значениями (первые два байта), и смог заставить появляется всем надписям с одним цветом! (девятый скришнот из-под спойлера) Цвета последовательные, как и при @ABCD… Тогда куда же указывает «at»? Посмотрим: http://klimaleksus.narod2.ru/Files/JAP/letters_47.png И естественно, это не ассемблер (хотя бы потому, что «zero» первым аргументом в любом случае работать не будет!). В WinHex: http://klimaleksus.narod2.ru/Files/JAP/letters_48.png Это цвета!! Явные определения цветов. Мало того, они ещё и в стандартном формате RGB от 255! Можно задать [b]абсолютно[/b] любой цвет смешивания с любыми значениями 00-FF (0-255) – обычный компьютерный цвет. Эксперименты над цветами показаны в спойлере под номерами 11, 12, 13, 14, 15. Как видно, они слишком яркие, если брать по максимуму. Белый вообще засвечивается. А чёрный абсолютно чёрен! Поэтому их следует менять в разумных пределах. На скриншоте 17 я отредактировал белый цвет выделения, что доказывает, что каждый цвет настраивается независимо от других. За что отвечает последний байт цветов «2C» (44) ? Без понятия. Но он одинаков для каждого цвета, а если его заменить, то буквы либо вообще пропадут (как на скринах 5 и 6) или вызовут графические глюки (7, 16). Однако до полного вылетания из эмулятора почти не доходило. Функция безопасна и стабильна с этой точки зрения, поэтому можно ставить самые дерзкие опыты – в худшем случае буквы просто не будут отображаться. Последующие присвоения неких адресов регистрам t3, t5, t8 ,t9 я тоже частично исследовал. Если просто испортить их, то вместо букв будут эти серые прямоугольнички. Однако ежели изменять константы в небольших пределах, то получается новая полуглючная перетасовка тайлов символов (скриншоты 1, 2, 3, 4). Интереснее стало, когда я догадался перейти по адресу и посмотреть на данные: http://klimaleksus.narod2.ru/Files/JAP/letters_49.png Плохо, что я не помню конкретно своих выводов, потому что я только скриншотил всё время (а сейчас пойди разбери, какой скрин что показывает – это придётся заново опыт ставить!) Выделено – цифры (и может быть, символы типа скобок). Выше после цветов – как помнится, сопоставление дополнительного набора. Ниже по данным (большой блок) – вся азбука стандартного набора. [b]Это и есть координаты тайлов, соответствующих символам![/b] Тут можно поменять ВСЮ таблицу перекодировки на нашу собственную, если понять, как именно она устроена. Я же просто применил «fill encrypted data» и поглядел на результат (скриншоты 23, 24, 25); можно видеть, что полоски громкости однажды не затронулись (26). Как получены 20, 21 и 22 – честно не помню, но кажется, что я менял какой-то непонятный адресок одного из регистров… (возможно, «t9») Ещё надо сказать про строки: lui t8, $8008 addiu t8, t8, $f328 lw t8, $0000(t8) Что делает этот код? 1) Грузит 8008 в t8. 2) Изменяет его на «8007F328» 3) Считывает оттуда четыре байта, и перезаписывает ими же t8. ОК? Его нелегко исследовать! Сначала перейдите к этой строке. Потом нажмите стрелкуВправо, чтобы оказаться у данных (если загружен не дамп памяти, а сам EXE, то там будет пусто). Увидите ассемблер код, который НЕ ПОЗВОЛИТ определить и перейти по нужному (вторичному) адресу. Для решения проблемы нажмите «W» и вернитесь на строку. Ещё раз стрелкаВправо – и вы в нужной области! Поясняющий скриншот: http://klimaleksus.narod2.ru/Files/JAP/letters_50.png В принципе, дальнейшее содержимое функции очень сложно и объёмисто, чтобы его вот так просто заменять и отслеживать изменения; да и может оно нам вовсе не понадобится. Однако суть кода знать не помешает. Всё сказанное о взломах цветов и таблицы символов, а также их ширины, может в теории быть актуально для Spyro3, мне надо бы этим заняться… А пока, вам неплохо бы найти аргументы, которые отвечают за позицию рисования текста (точка на экране), потому что эта функция, похоже, рисует либо только одну надпись (каждую надпись, но по очереди), либо вообще одну букву! Причём не столько рисует, сколько копирует в какую-то область ОЗУ расшифрованные данные о том, где брать тайлы, какого цвета, ширины и так далее. Интересно бы узнать, почему цифры [u]у[/u]же (компактнее) всех, как именно накладывается докутен, как определяются отдельные палитры для букв и значков кнопок, почему тайловый набор перевёрнут (явно ли задаётся поворот картинок; или же он выдался просто случайный, а разработчики подстроили под него свой набор шрифта) Если будут трудности – спрашивайте! P.S У вас PSound выдирает треки сценок Spyro3 из WAD? Хоть частично? [hr] [quote=Spyro4evA]ХВАТИТ МЕНЯ ИГНОРИРОВАТЬ!!![/quote] [quote=DrWho]Да он по-моему всех, кроме этой темы, игнорирует. :([/quote] [quote=DrWho]Мы к aleksusklim обращались, а он ни тут, ни в соседних темах не отвечает. И даже в лс не отвечает.[/quote] [quote=nihonjin]Мм... и мне он в ЛС отвечает...[/quote] Хосподи, да успокойтесь вы!! [color=white]Дискретная математика по 4 или 5 пар в день ежедневно с понедельника по субботу + пятичасовые тренировки типа ВКОШП каждое воскресенье – приходится фильтровать список тем для очередного комментария…[/color]