Где я такое сказал? Ткните мне на это место. На Спайропедии от силы парочка названий из пиратских уровней.
Я, вообще-то, не это имел в виду. Я хочу сказать, что вы утверждаете, будто у пиратских вариантов больше шансов победить только потому что они пиратские. Хорошо – убрали. Почему теперь вы не можете утверждать, что победят исключительно варианты из «Спайропедии»? Они ведь самые лучшие?
Цитата (DrWho)
Далеко не факт, что все читают комментарии. 100% это не подтверждает слова.
Тогда всё важное – в кратком описании НАД голосованием.
Цитата (DrWho)
А почему бы тогда не стартануть сразу два опроса, где это слово упоминается? Ведь два раза горы не факт, что выиграют.
А раз уж на то пошло, почему бы все разом не стартануть, а? С чего это «горам» такая привилегия. И всё равно очень глубоко по поводу названий так никто и не копал – вдруг там найдётся ещё куча отсылок или зависимостей. Не уж, всё будет очерёдно. Голосования не столько ради выбора названия, а скорее чтобы лишь опросить народ – вдруг умные мысли встретятся.
Цитата (DrWho)
А даже если и выиграют оба раза, можно упростить задачу так: где меньше разница будет в том, насколько горы опередят остальных, там и не будет гор и будет заменено вторым.
Мы что, на ипподроме? Давайте ещё и ставки делать. Голосования – формальная вещь. От конкретных цифр/различий не зависит ничего. Вы что думаете, если дебильный вариант обойдёт гениального на десять голосов – значит всё прахом?
Цитата (aleksusklim)
что думают пираты?
Цитата (DrWho)
Что касается Вектора и Парадокса: не знаю, какая там произошла неразбериха <…> От парадокса: стырено у Вектора, пострадало качество <…> наконец отдельная игра от Парадокса: <…> Плейзеро: без комментариев, ужасный перевод <…> И нашелся еще какой-то неизвестный перевод, <…> У меня на руках только версия от Вектора, Файркросса и от неизвестных. <…>
Боже..
Я вас попросил НАЗВАНИЯ уровней от пиратских переводов выложить!! А не сравнивать студии! Оставьте это для Spyro4evA.
Да мне не образы нужны, а ТЕКСТ оттуда! Я это, кстати, вам поручил.
Цитата (DrWho)
Лично я уже против такого варианта. Это все равно косить пытаться под 1С, которые хоть и перевели хорошо саму игру, а вот с именами не совсем хороший лад произошел. И Искряк, и Огара, чего там только еще не накосячили. Хорошо что имя Спайро не перевели.
Да не сравнивайте нас с пиратами. Если уж мы и переведём ВСЁ, то исключительно так, чтобы понравилось ВСЕМ.
Цитата (ShellyPes)
У меня насчет Sparx свое предложение. Я с детства думал, что стрекоза, которая летает возле Спайро - девочка (ну, потому что стрекоза, не стрекозел же :D)
О-хо. А здесь на форуме я даже читал, что где-то продавец пиратских дисков, указывая на нашего фиолетового дракона, с уверенностью заявил, что это девочка, и что зовут её «Сфайра».
Цитата (ShellyPes)
Да и в пиратке какой-то слышал: Искорка.
Ух, это мне кой-чё другое напоминает..
Цитата (ShellyPes)
Мне нравится. Буду голосовать за нее, даже если это и не очень правильно.
!!
Цитата (ShellyPes)
(Да, кстати, гипотетически можно сделать его и "девочкой", просто в словах Зои "он" поменять на "она", и все...)
Осторожно.
Надо понимать, что этим мы обрекаем себя не только на перевод базовой трилогии, но и всех-всех игр Spyro под все платформы – как существующих, так и тех, которые появятся позже.
Это слишком серьёзно. Я не рискну взять на себя такую ответственность. Мы же не знаем, с чем нам потом придётся столкнуться – вдруг в «пятнадцатом Спайро» наша стрекоза женится? Придётся ж весь сюжет перекраивать…
Да и потом, прозвучала умная мысль, чем же нам ограничить наши взломы. Чтобы мы не ушли в бесконечные модификации: Мы договорились модифицировать игру только для того, чтобы исправить ошибки разработчиков или чтобы добавить то, что они создать забыли либо не смогли добавить сами. И если вы не сможете доказать, что изначально Спаркс задумывался именно как девочка, то делать его таковым будет слишком эгоистично.
Цитата (ShellyPes)
Насчет этого не сомневайтесь. Уже было несколько недоуменных сообщений по поводу "Весны". Но раз нет "Весны", так надо значит другое пиратское название выбирать - "Долина".
Хорошо, я придумал решение. Читайте ниже.
Цитата (ShellyPes)
Вообще, лучше все новые варианты "отлавливать" в вышеупомянутых предопросных обсуждениях. А про ненужность "своего варианта" я давно уже говорил.
Если появляется новый вариант – добавляйте его. И пусть опоздал – автор сам виноват, что не назвал его вовремя.
Цитата (ShellyPes)
Честно говоря, не знаю. Мне кажется, изменять чужие голоса невозможно (по крайней мере такая функция не предусмотрена).
Хорошо, сколько конкретно максимально вариантов можно добавить. Двадцать можно?
Цитата (ShellyPes)
Нет, нет и нет.
А что там вообще есть?
Цитата (ShellyPes)
Да, кстати, ничего, кроме Высоких Гор, Страны Облаков и Облачных Шпилей у нас не появилось? Ах да, увидел еще Заоблачные Вершины. Сипматично. Включать в опрос?
Погодите. Тут однажды нашего японца пробило на возвышенные мысли, и он показал нам, КАК нужно подходить к выбору названий для миров. Кажется, про Cloud Spires там тоже что-то было… Надо бы поискать, серьёзно.
Цитата (ShellyPes)
Да. Это я нашел на сайте DeviantArt. Но такие, к сожалению, есть не ко всем, так что придется и обычные скрины выкладывать.
Что ж просто скрины – можно их «приукрасить» или отфотошопить. Стилизовать…
Цитата (ShellyPes)
Вряд ли на это кто-то будет смотреть.
Ну а кто захочет – посмотрит. Где-нить в уголочке написать… Или в первом же комментарии.
Цитата (ShellyPes)
Да, и еще, Алексей, можете пока Алине не писать, она неделю будет без интернета.
Да я уж и сам понял.
Цитата (nihonjin)
Вы же сами его и придумали!
Ну и что? Раз я не могу придумать лучше…
Цитата (nihonjin)
Что-то я не понял. Мне показалось, что вы неприемлите переводить Spyro потому что там непонятно что означает "S". И я отвечаю, что по такой логике получается, что нельзя переводить Gnasty, пока не удасться понять, почему там именно "G".
Да не «не переводить» эта «S» мне мешает, а переводить как «Согонь» или «Спламень». Просто «Спайро» – есть калькирование оригинала. Как и «Гнасти» – для русского человека не значит ровным счётом ничего.
Причём здесь «Спиро»? А это уже перевод части «pyro» как «пиро» (от той же пиротехники – «пиро» это русское слово, вполне имеющее значение). Но переводя «pyro», мы оставляем «S» и калькируем её, толком не понимая, чего она означает.
Либо переводить всё слово, либо не переводить никакую его часть. Нельзя оставить одну букву из оригинала «просто так», а остаток перевести – как «..пиро», «..огонь», «..пламень» – без разницы.
То же я и предлагаю сделать с Норком: либо как хотите вы, это будет «Гнасти Гнорк», либо, как хочу я, его надо заменить на последовательность букв, которая будет звучать для русского человека так же, как оригинал звучит для английского, например (но конкретно на нём я не настаиваю) «Пимер Скипинорк». Здесь есть и «норк» и «пинок» и «мерзкий». Зато тут не начальной «Г», тупо скопированной с оригинала.
С драконом можно поступить также, если понять, к чему там «S». Если пусть даже это «spirit», то перевод «Огнедух» меня уже устраивает. Но чисто против «огнедуха» могу сказать, что русский «дух» часто употребляется в значении «трус», чего нет ни в английском «spirit», ни в самом персонаже тем более.
Цитата (nihonjin)
После.
Ну вот и всё! Птыц.
Цитата (nihonjin)
Ну, я так понял, что лимит и разница теперь неактуальны. Хотя неплохо бы узнать реальные(экранные) границы.
А вот этим не так всё просто как мне показалось, когда я сказал, что «взломаю каждое название и узнаю реальное место на экране». Толщина букв!
Всё зависит от шрифта (который мы ещё не взломали…)
Во второй строке написано «MNPZ QOLYDEHHOGO CADA», а в первой – «abcdefghigklmnopqrstuvwxyz». В четвёртой столько же букв, но все они «i» – «iiiiiiiiiiiiiiiiiiiiiiiiii»
Видно?
Цитата (ShellyPes)
Что означают вот эти знаки: @, $, #
Цитата (nihonjin)
Вы ленивы или невнимательны?
Надо привыкнуть… добавить все пиратские варианты и тоже их чем-нибудь пометить.
Цитата (steeldragon)
Кошмар. В Латвии он что ли побывал?
Хи-хи-хи.
Цитата (steeldragon)
(Тогда и Хантеру/Охотнику платье дорисуем, чего уж...)
Но тогда Бианку придётся сделать парнем! Как там у вас с модификацией моделей?..
Цитата (steeldragon)
Может быть, еще добавить к этому "Облачная страна"? (Видоизменённый второй вариант. Не "страна, где много облаков", а "страна на облаках")
Больше, больше вариантов!
Цитата (ShellyPes)
Что ж, сегодня начинаем, прошу в группу!
Внимание!
Я хочу уравнять шансы. Что, раз пираты переводили игру, мы теперь должны выкидывать ВСЕ их варианты названий?
Или не все?
А если не все, то какое мы имеем право решать, что оставлять, а что убрать? Тогда и голосований вовсе не надо, просто отметём всё что не хотим видеть.
Голосование кажется и проводится для того, чтобы рассмотреть плюсы и минусы КАЖДОГО варианта.
Перевод пиратский? Отлично, жирный минус ему. Но пусть бьётся наравне со всеми.
Если он такой плохой, то проиграет и в честной битве.
А если нет, то нам стоит подумать над ним ещё раз.
Ой-ой, только не надо говорить, что пиратский перевод победит!
Да пусть победит. Пусть хоть в десять раз обгонит остальных.
Что мы сделаем? Просто проигнорим его.
Да! Победит тот, кто займёт второе место.
Что? Там тоже пират!? Ну ладно: тот, кто третье.
Если мы хотим отметелить вариант – сделаем это ПОСЛЕ, а не до голосования.
Дадим людям возможность всё спокойно обсудить!
Чего? Возмущённые респонденты? О, да они будут счастливы, что мы не выбрали пиратский вариант только потому что он победил.
Вам показать, как это работает?
На текущий момент: «Дом Утреннего Родника» проиграл. «Дом Утренней Долины» пиратский, выбывает автоматом. Остаются «Дом Утреннего Ручья» и «Дом Рассветного Ручья», набравшие (даже за вычетом моего) равное количество голосов. Рассматриваем: у второго сразу преимущество: «sunrise» а не «morning» да две одинаковые буквы в довесок, хоть я на них и не смотрю. Побеждает «Дом Рассветного Ручья»!
Итог: пишите все-все варианты, какие только приходят в голову. Единственное разумное ограничение – максимальное количество пунктов голосования. Если будет превышено – тогда начинайте фильтровать бред… but nobody came
Большинство всё равно останется недовольно. Какой смысл прислушиваться к его мнению?
Мы не будем просто так прислушиваться к чьему-то мнению, мы просто хотим узнать, что думают другие люди. Плоды в виде «Рассветного Ручья» уже есть.
Цитата (Washington)
Если вы настаиваете на голосованиях, не делайте хотя бы этих опросов. Не надо. Пусть лучше будет тема или запись на стене, где надо указать своё мнение и толково обосновать его.
Голосовалки привлекают больше народа! Если надо где-то писать, то не каждый пойдёт. А если же проголосует и удивится результатам, то сразу отпишет своё мнение.
Цитата (Washington)
Так, по крайней мере, будут голосовать люди думающие, а не школьники, тыкающие в первый попавшийся вариант ответа.
Ну ладно, давайте сделаем первым пунктом «Мне всё равно / Хочу узнать результаты».
(ShellyPes, серьёзно, ведь так было сделано на конкурсах «лучшего мира» Spyro1)
Цитата (steeldragon)
Один вопрос: aleksusklim, как вы считаете, что лучше: ваш SmartPatcher или этот комплект для работы с PPF-патчами?
Сравнил. Плюс PPF в том, что он предлагает множество опций конкретно для PS/PS2. Однако я проверял только «General», то есть патч общего назначения.
Минус в том, что сам патчер весит довольно много (даже больше проги, которая создаёт патч). Ещё один минус – что создатель патча и патчер это разные программы.
Огромный плюс PPF – стандартизированность формата, его (кажется) понимает даже Epsxe.
Минус же – использовать патч сложно, нужно указывать пути к файлам, нет консольного потокового режима.
Не проверял насчёт Backup – моя программа делает «отменяющий патч» сходу если состояние файла не соответствует ни оригиналу, ни модификату. То есть не нужно снимать копию со всего файла, просто создаётся новый патч. И это плюс мне, если конечно у PPF нет чего-то подобного.
Быстродействие не лучше моего, так что по скорости наравне.
Размер файла-патча у PPF получается больше (естественно с опцией «undo patch»), чем мой (проверял на самом мощном своём патче «kved.bat» – голосовое произношение номеров STR), но не намного, после архивирования они почти равны.
Сам процесс пропатчивания глубоко не тестировал, если он работает быстрее моего, то только потому что мой предварительно высчитывает CRC сумму файла.
И мне не известен алгоритм, по которому создаётся патч и что будет, если не совпадут размеры файла или различные области будут иметь неожиданные для патчера данные.
Каков мой вердикт? Для наших целей PPF не лучше и не хуже моего. Но свой SmartPatcher я знаю досконально, поэтому к нему у меня гораздо больше доверия, чем к сторонним программам, выполняющим те же функции.
Цитата (DrWho)
Могу отскринить названия, выкладывать при помощи текст-о-вытаскивателя - долго.
Вы что, вообще не читаете те части моих комментариев, где описываются взломы?
На предыдущей стринице:
Цитата (aleksusklim)
Я провёл эксперименты над названиями миров. Убедился, что указатель единственен, плюс они все собраны в одном месте в удобном порядке.
Работать так: через MemGet снимите дамп памяти в любом месте игры (лучше находясь в каком-либо уровне). Скопируйте с образа EXE («SCUS_944.67») и поместите оба файла в одну папку.
Выделите и EXE и дамп, перетащите их мышкой на «Pointers.bat», держа за «SCUS_944.67». Появится «.txt» файл, в котором распечатано всё, что нашла программа.
Специально для вас разжёвываю:
1) Качайте http://klimaleksus2.ucoz.ru/Files/2/Pointers.rar 2) Качайте http://klimaleksus2.ucoz.ru/Files/Mem.rar 3) (Ну сам этот Epsxe уж у вас есть? Если нет, то качайте именно его, ибо в других эмуляторах различается адресация памяти) 4) Эмулируйте образ или откройте его чем-нибудь, чем сможете вытаскивать файлы. 5) Выкопируйте основной EXE, то есть «SCUS_944.67», но на пиратских дисках он может называться по-разному, размер примерно ~370 Кб. 6) Запустите игру в эмуляторе. 7) Зайдите в любой уровень и сверните Epsxe. 8) Откройте MemGet. 9) Нажмите «Применить данные» и «Чтение из памяти в файл» 10) Скопируйте «GetMem.dmp» в папку к «SCUS_944.67». 11) В эту же папку скопируйте «Pointers.exe» и «Pointers.bat» 12) Выделите «SCUS_944.67» и «GetMem.dmp». 13) Перетащите их мышкой на «Pointers.bat» держа за «SCUS_944.67». (Если не получается, просто перетащите «GetMem.dmp» на «Pointers.bat») 14) Должен появиться «.txt» текстовый документ. 15) Если хватит смекалки, то вы найдёте в нём нужные названия миров, если нет – просто заархивируйте и выложите этот файл. 16) Всё закройте и удалите!
Цитата (DrWho)
И мне помогите от неизвестных переводчиков шрифт в атласе в русский превратить. Хекс редактором фиксить - не самый лучший вариант.
Шрифт атласа ещё не взломан.
Цитата (DrWho)
Название могут выбрать дважды, так хотя бы можно будет увидеть, действительно ли уровню подходит "горы".
Вот тогда и задумаемся об этом. Давайте сначала соберём плоды, а уж потом будем решать, какие из них червивые.
Цитата (DrWho)
Текст риппер почему-то ничего не извлекает. К тому же весь-весь текст из всех пираток 3й части - не самый лучший вариант.
Там вощем.. я ещё до конца не придумал, КАК именно извлекать текст. Но гарантирую, что это будет в пару кликов! Пока что вытащите хотя бы названия.
Цитата (DrWho)
Вопрос насколько лучшие. Ведь 100% они не могут везде победить.
И пиратские тоже не могут на 100% везде победить!
Цитата (DrWho)
Вы меня неправильно поняли. Я имел в виду, если в Cloud Spires выиграет вариант с горами и будет опережать другой вариант (которые близко был с ним) к примеру на 5 голосов, а в Midnight Mountain будет опережать вариант с горами на 10 голосов, то приоритет горам надо отдавать в Midnight Mountain.
Приоритет надо отдать тому, кто его достоин по объективным причинам, а не по количеству голосов.
Цитата (DrWho)
1С - не пиратская контора.
Но мы-то всё равно круче?
Если так взять, то и «Карусель» – не пиратская контора. Однако ж…
Цитата (DrWho)
А еще название выходит на другую страницу. Ваш кэп.
Вот именно что! Взломаем шрифт – и буквы будут маленькие. Да узенькие. Зачем такая широкая «П»?
Цитата (DrWho)
Организовать и устроить главное правильно, тогда может и не будет проблем с опросом.
Кстати, надо бы ещё обсуждать тексты вступлений к голосованиям или вообще кто их пишет?
Цитата (DrWho)
Никто и не говорил, что надо в обязательном порядке ВСЕ названия выкидывать. Некоторые еще можно (если не подходит), а какие-то - оставить.
Зачем что-то убирать? Скорее «пиратский» но существовавший де-факто перевод должен быть взят первее, чем кем-то не пойми когда придуманный и не фигурирующий нигде до этого.
Раз перевод когда-то был – надо обсудить его плюсы и минусы, невзирая на то, какой он плохой. Повторюсь, если он реально плохой, то он проиграет! Даже если наберёт абсолютное большинство, он всё равно проиграет.
Цитата (ShellyPes)
Да я и не подумал о переводе последующих "пятнадцати" частей, где Спаркс уже ничего от прошлого себя не сохранил (Басок, кубики, OMG...)
…Что за «кубики»?
Цитата (ShellyPes)
А в оригинальной трилогии, он, по-моему, был каким-то... бесполым)
Верно подмечено!
Цитата (ShellyPes)
Добавлять варианты после старта опроса точно можно. Но зачем двацать-то??
В том смысле, что это можно делать сколько угодно. Если придут двадцать человек с двадцатью вариантами, сможем ли мы вставить их все?
И да, надо предупредить всех о том, что они могут предлагать свои варианты даже во время голосования (и чем раньше предложит, тем лучше) – будем сразу (без задержек, раздумий и даже обсуждений) их добавлять. (В разумных пределах, откровенный спам всё-тки фильтруйте!)
Цитата (ShellyPes)
Этим точно буду заниматься не я.
Предупредите когда у вас не окажется очередной картинки.
Цитата (ShellyPes)
Хорошо, тогда дайте списочек, пожалуйста.
Уф!! Он же висит несколькими сообщениями выше!
Но так и быть. Там необработанная диакритика. Полный перечень автозамены ещё не выписал, но я руководствовался своей же таблицей:
По переводу миров сначала сделаю замечание по общей концепции. Насколько мне видно вы делаете перевод названия либо подгонку под перевод. Но! Это же не тексты диалогов, это - концепция! Главное - передача атмосферы потому делаю ссылку на то, что сотворили японцы с мирами Spyro1: http://s019.radikal.ru/i621/1204/dc/17f8ba57a7b9.png Т.е. в процессе локализации они оставили нетронутыми названия лишь четырёх уровней... остальные переписали под свой лад, хоть и английскими же словами. Что нам мешает это сделать? "Разница"? Сохранение принципов? О да, кстати, вы заметили, что уровень, который тут на форуме считают самым враждебным, японцы назвали "прекрасным"? Потому мне кажется в первую очередь стоит смотреть не на англ название, а на то, что делает мир уникальным... Попробуйте абстрагироваться...А "официальный вариант" оставьте как подсказку. Кстати, а как обстоит ситуация с европейской версией(по названиям уровней)? Ну вот. Теперь конкретно:
Quote (aleksusklim) – Cloud Spires – … – Заоблачные вершины? Почему бы не намного проще – «Высокие Горы» – {0}
Трудно согласиться. В этом уровне, как по мне, больше внимания акцентируется на облаках(например портал в мини игру). Облака, дождь, солнце(в минииграх в том числе). Да это же погода! Об этом нужно сказать, а не то как там высоко... я пытался придумать что-то вроде "метеоцентра", "центр погоды", "регулятор погоды" понимаете направление? Нужно отразить то, что там "создаётся" погода... Но это всё же не простой вопрос не так ли?
Тут можно обыграть лёд...скольжение. Я о том, что даже чтобы попасть к порталу, ведущему на этот уровень, нужно преодолеть ледяное озеро, на протяжении всего уровня встречаются такие "озёра". Потом там находится миниигра с фигурным катанием. Так что направление тут на "Каток"{+3} можно рассмотреть, но это название не совсем вписывается в концепцию.
Вот тут по идеологии не пойму чего в этих башнях "магического"? Динозавры? Явная достопримечательность уровня - статуя колдуньи. Но прямо так писать - слишком много чести. Может лучше что-то абстрактное? Нужно что-то вроде "Знак тщеславия"{+2}. Концепция гаснет...
Где там алтари? Думаю это на них там "лазерные" установки. Они важны конечно... А как насчёт «Холодные края»{0} или «Снежные земли»{0}. Ещё там дают "морозное" дыхание...
"Склеп мумий"{+1} отражает население уровня, по крайней мере основное.
Ну и? Это ещё актуально?
Цитата (ShellyPes)
Открытое и анонимное голосование. Изменять мнение нельзя. Контакт!
А удалять варианты?
Цитата (ShellyPes)
Я, конечно, ничего против, но откуда "пинок"?
Созвучие «Gnorc <> Knock».
Цитата (ShellyPes)
У меня насчет Gnorc'а свой вариант: ГНусный ГНорк.
Подходит (и лучше «Гмерзкого Гнорка»), но:
Цитата (ShellyPes)
Вполне себе приемлемый вариант, с сохранившимися GN и смыслом.
Вот это самое «GN», о чём я и говорил, не нужно сохранять не понимая его значения. Если поймём, почему там «G» – сделаем свой аналог (может статься что он совпадёт с «Г»). А так – либо менять, либо оставить «Гнасти» (чего мне не хотелось бы…) Если «ГНусный» подходит чётко, то «ГНорк» остаётся таким же непонятным.
Цитата (DrWho)
Рано или поздно кто-нибудь да заикнулся бы все равно. К тому же из Толстосума Файркросс как-то сделали в первом предложении девушкой. Правда потом он опять парень.
Значит просто переводили не глядя на сюжет или имена. «You», «I», никаких окончаний глаголов прошедшего времени…. but nobody came
Ну а чё, конец света уже вот прям счас будет, нужно же хоть когда-нибудь мне выложить хоть какую-нибудь из своих игр? Ракета! Лучшая из всех моих 30+ творений (которые останутся навечно никем не увиденны…) потому что мне до сих пор самому интересно её проходить. Очень затягивает… Скриншоты: http://klimaleksus.narod2.ru/Files/rocket.jpg Так. Играете мышкой. Левая кнопка – стрельнуть мусором в позицию курсора; правая – ускорение, независимо от того, куда кликаете. Игрок – ракета, рисуночек часто меняется, как фон и музыка (по большей части стыренная из Crash Bandicoot…) Отскакивает от всего. Цель игры – подняться на самую верхушку коридора, обходя всякое барахло. Чтобы придать ракете движение, надо кликнуть левой кнопкой мыши, наведя курсор куда-нибудь вниз под ракету; тогда из сопла вылетит «снаряд», а благодаря реактивному движению сама ракета немного сдвинется вверх. Поворачивать также – стрелять вправо, чтобы свернуть влево. Если ракета падает, то можно усиленно стрелять вниз, чтобы вновь выровнять её. Если же она хорошо идёт вверх, то можно слегка нажимать правой кнопкой мышки (независимо от положения курсора), чтобы включить паровую машину (типа, собственный движок), который будет разгонять ракету в её направлении; при этом если она у вас идёт криво или вообще вниз, то паровая машина всё только усугубит. С первого раза все путаются в управлении и стреляют вверх – при этом ракета резко падает вниз, ударяется об пол и снова летит вверх; но игрок продолжает тупо кликать, разгоняя ракету до такой невероятной скорости, что управлять игрой практически невозможно! Я же предпочитаю играть медленно и аккуратно. Теперь сложности прохождения. Во-первых, ограничено время пребывания на этаже. Это первая шкала слева экрана. Когда ракета поднимается всё выше, то время прибавляется. Если же вы начинаете топтаться на месте, то время истекает. При этом нужно как можно скорее выровняться и подниматься, иначе засчитают проигрыш. Во-вторых, падать нельзя! Немного опускаться можно, но дальше появится зелёно-красный туман, показывающий конец зоны – нижнюю границу (вообще во многих играх такого типа, от icytower до всяких там мячиков для nokia, нижней границей служит сам экран), и как только ракета его коснётся, наступает проигрыш. В-третьих, патроны ограничены (розовая шкала, первая справа). Они автоматически пополняются, но медленно. Поэтому их надо экономить! По сути, если управлять ракетой только одними патронами, то игру вы вряд ли проёдёте. Потому что если происходит лобовое столкновение с препятствием, то ракета разки отскакивает и начинает с той же скоростью падать вертикально вниз. В этом случает попытка выстрелить ровно под неё – самоубийство, ибо снаряд останется «на уровне» ракеты (наложится на неё как в свободном падении), и пока он не отойдёт выше или ниже, вы вообще больше стрелять не сможете. Единственный выход – пальнуть вбок, чтобы искривить траекторию падения. Стрелять по дуге и плавно выровнять направление по окружности. А вот как раз на это и уйдёт половина дарованных патронов! Получается, что глобальная идея игры – по мере подъёма запоминать положения близлежащих препятствий, чтобы в случае необходимости вывернуть ракету на них, тогда она ещё раз отскочит и снова станет лететь вверх. В-четвёртых, на поле иногда появляется туман, который при соприкосновении с ракетой (а иногда и сам по себе…) взрывается, отнимая половину всех ресурсов – времени и патронов. Пара таких столкновений, и проигрыш неизбежен, ведь на то чтобы лететь выше нет патронов, а на то чтобы остаться нет «времени»… Зато спасает «аптечка» – красный крест, который при касании ракеты (и сам по себе…) лопается, восстанавливая полностью все ресурсы – время и патроны. (После взятия удобно тратить только паровую машину – белая шкала вторая слева – чтобы сохранять полный запас основных патронов). Кстати, игру невозможно пройти, если не подбирать аптечки, поэтому при виде её нужно немедленно хватать. Пропускать можно лишь в том случае, если вы уверены, что у вас достаточно патронов, ведь новая «техпомощь» появится ещё не скоро. Ну а в-пятых, игра усложняется по мере приближения к цели – тумана и мусора больше, а аптечек меньше… Текущий уровень высоты относительно вершины показывает синяя шкала – вторая справа. Это прогресс всей игры, победа наступит когда вы заполните её до конца. Глюки: – Иногда ракета застревает в стенах или препятствиях – пощёлкайте, дабы направить её обратно в игру; застревание в мусоре решается автоматически – игра уничтожит лишнее препятствие, плюс даст вам немного патронов в качестве компенсации. – Окно лучше разворачивать на весь экран, чтобы удобнее было кликать в бока. Пауза в игре – потеря фокуса окна, например, клавиша Windows. – Изредка игра стартует без звука вообще. В этом случае немедленно закройте её и откройте снова, иначе она неизбежно зависнет. Всё! Ссылка: http://klimaleksus.narod2.ru/Files/rocket.rar (5,8 Мб) Исходного кода нет лишь потому, потому что он весит почти столько же, сколько сама игра. Зато я приложил мега-декомпилятор Game Maker 8, и исходник можно получить, перетащив на него EXE.
Ну вот, новый год наступил, и мне захотелось написать что-нибудь соответствующее:
Праздник.
На заснеженных просторах звук колоколов раздался, На санях по лесу утром дед отважно разгонялся, За плечами вёз поклажу, что подарками набита, На оленях с бубенцами едет к полюсу открыто! Всех зверей в пути встречая, поздравляет он украдкой; С бородою в алой шубе возвращается обратно. Только бы успеть! Спешит, На часы всегда глядит. Мастер в этом деле первый Раз в году взлетает смело: Вот он дома – пять минут, Деда в целом свете ждут. Список… всё в порядке: дважды Проверяет – это важно! И пока снежок последний опустится до земли, Он сумеет все подарки по планете развести. Замирает мир и каждый Видит в небе проблеск красный – Праздник! Скоро грянет праздник!
А ещё… написал довольно грустный стих по вот этой картине: Okay, lets move! Посвящается.. автору.
И всё?
Неужели я слышу, что всё безуспешно, Что всё было зря? Так и выйдет конечно… Напрасно надежду я грел на груди, И тени былого уже не спасти.
Гляжу я: всё снова как видывал прежде, Ведь раньше казались вы милой и нежной, Я верил, что ключик смогу подобрать, Но магии след начинал угасать.
Сейчас же я знаю запретную правду, Как люди меняют со временем нравы, Мы встретились б раньше – вопрос бы не встал… Простите меня, значит я опоздал.
Вините меня в том, что правым бываю, Но чаще об этом бесцельно твержу? Ошибок своих я никак не признаю, И мненьем чужим не всегда дорожу?
Ну может быть… Только ведь смысл не в этом, А раз вы сказали – оно так и есть. Сперва очарован я был вашим светом… Отныне всё мраком окутано здесь.
Я стал вам противен, а может, был сразу (Обратное не проходило ни разу) Пожалуй, виновны ни вы и ни я – Понятно, вот так повелела судьба.
И как не старался бы склеить осколки, Уже наперёд не случилось бы толку, И тот конец света, что нас пощадил, На деле тогда для меня наступил.
Я вам благодарен за все те минуты, Что требовал я у вас времени груды, Примите мои извиненья за то, Что был я когда-то и с вами знаком.
И всё? Подождите… лишь раз я ошибся, Когда что-то в вас возродить я решился, Что сердце моё покорило – оно Уж умерло. До нашей встречи, давно…
Ну что ж… берегите себя, и удачи. Пусть сбудутся ваши мечты и задачи, Да чтоб не пришлось вам по жизни идти Ещё раз с такими как я по пути.
И всё? Да я понял… Стараюсь, исправлюсь, Подобных вам нет, куда б я не отправлюсь… И всё? Погодите! Постойте, прошу… Останьтесь!______________ ____________…Это я ухожу.
Дождь пошёл над городом, Я одинок, мне холодно. Дорогами задумчиво Бреду под чёрной тучею. Как оказался здесь? Не знаю, И цель пути не понимаю, Лишь улиц плотный лабиринт Перед глазами вновь стоит. Ну почему же так темно С утра весь день – уже давно. Лишь ярких молний не хватает! Зачем сказал… вот, заряжает. – Вон люди, свет, чуть-чуть осталось! – Мне на минутку показалось. Я тут один… Урок судьбы, Попытка сбить меня с пути. Ты лей, слабак! И вой погромче! Я не боюсь, а бой окончен: Не взять меня преградами – Я здесь ещё, не правда ли?
.
.
Полянка
Полянка в одном заповедном лесочке Уводит тропой меж деревьев рядочком, Где пышны верхушки днём тень создают, А в сумерках тонки стволы свет дают. И птички поют На рассвете весною, А зимами зайцы играют порою, Но в жаркое лето прохладный ручей Отрадою станет усталых очей. Вперёд же за мною – Дорогу открою, Местечко родное Нам станет с тобою! Одно лишь такое: В любой день и час Сердечно готово Принять к себе нас. Деревья, цветы, Утром капли росы, И даже ночами Тут скучно не станет. Не семь Раз услышать – а лишь побывать, И всем Будет ясно, чего ожидать. Прошу, берегите сокровища эти, Они ведь подобным не раз вам ответят: Поделится счастьем для мирной гулянки В одном заповедном лесочке полянка!
.
.
Кто я?
Я тот, кто я есть, Я останусь кем был, Я запомнюсь вам только таким. Будь то грозная месть Или радостей пыл, Я б не стал притворяться другим. Может быть иногда Появлялась черта, Что не видывал прежде народ. Я отвечу, что это Отблеск разума света, Что на крыльях меня вдаль несёт. И, как бы не странно, Но все мною довольны Очень часто и день ото дня. Я открыт – ну и ладно. Я полезен – не спорим. Так примите всецело меня! Я вам отдан до капли, И сегодня и завтра, Я вам нужен? Так вот я – бери. И не стало ни разу Хуже, чем было сразу. Вас устроит ли это? Смотри: Если взялся за дело Не спросив разрешенья, И не ждав приглашенья Навязал вам себя; То попробуйте смело Вы принять предложенье, Я найду вам решенье! Или гоните меня. Будет так продолжаться И не раз разрешаться Дело, где появлялся бы я. Что ж взамен заберу я, И чего попрошу я? Не волнуйтесь, ведь плата проста: Коли принят я в долю, Скажу свою волю: Держите меня до конца. А если прогонят И раньше уволят, Обидите этим меня… Вот всё, что прошу я за помощь, вам ясно? Со мненьем моим не считаться опасно, Иначе войну я могу развязать, Чтоб вам свою правоту доказать. Не бойтесь! Я добр, плохого не вспомню, И скоро готовым к делам буду весь. Лишь подвиг закончу, и стану ждать снова: Пока я доступен – берите, я здесь.
Попробуйте ломануть, или чужой версией переставить. Я вот только точно не помню где находится шрифт атласа: в SCUS или в WAD?
WAD !! Он даже извлечён в теме про Графику.
Цитата (DrWho)
У меня 1.8.0 есть. Или именно ваш нужен?
Лучше мой, чтобы с адресами проблем не было. Или вам придётся взламывать и их, но я сомневаюсь, что у вас это сходу получится. Могу объяснить как))
Цитата (DrWho)
*вопрос на засыпку* А почему не в атлас?
Да потому что названия записаны в EXE (который SCUS) и он грузится в память один раз, и больше из неё никуда не исчезает!
А если вы, кстати, в атлас зайдёте, то возможно даже словите дубликаты надписей.
Цитата (DrWho)
Цитата (aleksusklim)
Специально для вас разжёвываю:
Это, случаем, не тот вариант, который вы мне не рассказали про Спайро 2 от Файркросса (где еще виснет в 3х местах, если хочется задание получить для шара)?
Что-то я связь не уловил, вы в цитате не ошиблись?
Цитата (DrWho)
Само собой, но описанный мной метод - крайний случай, когда оба варианта подходят и у каждого одинаковое кол-во плюсов и минусов. Вот тогда можно моим методом попробовать.
А лучше запустить ещё одно голосование с явным выбором, какому уровню отдать «горы».
Цитата (DrWho)
Цитата (aleksusklim)
16) Всё закройте и удалите!
А вам типа не надо передавать?
Ой, юморист прям. Предыдущий же пункт:
Цитата (aleksusklim)
15) Если хватит смекалки, то вы найдёте в нём нужные названия миров, если нет – просто заархивируйте и выложите этот файл.
Это значит, что к этому моменты вы уже выложите всё что нужно.
Такс, вот списанные со скринов названия:
Мир ранней весны: Дом ранней весны Вилла солнц Страна облаков Кратер молтен Берег раковин Трасса грибов Альпы Шейлы Темница Буза
Мир дневного сада: Дом дневного сада Айсберг Башня ведьм Болото духов Терраса бамбук Трасса кантри База срж. Барда Арена Спайка
Мир вечернего озера: Дом вечернего озера Морозный алтарь Флот Фейерверк завод Вершины Медовая трасса Пост Бентли Яма Скорча
Мир полночной горы: Дом полночной горы: Кристальный остров Руины Гробницы Дино норы Трасса гавань Лаб. Агента9 Дом колдуньи
Мир Спаркса: Ферма кродад Пауки Морские рифы Фабрика жуков
Just as planned, это сокращённый вариант фразы "сказал, что наложил проклятье на меня".
Тем более, там же «One of those dogs with the funny hats put a curse on me…» и нет оборота «сказал, что». Явная утвердительная форма.
Цитата (Washington)
(Записи я таки послушал, но не понял, зачем они здесь. Не суть)
Как это «зачем»? Выяснить, что это должен быть за акцент. Вы предлагаете турецко-грузинский.
В оригинале из Hunted Tomb акцент почти такой же, как в том файле, который показал я (но там по сюжету больше африканско-туземский). Особенно слово «yet» в самом конце…
Алексусклим-сан, пожалуйста, выдайте какой-нибудь квест по моей специальности.
…Мы с Альтеей решили дать вам кучу «ни от чего не зависящего» текста Хантера из Sunny Villa, но только когда мы закончим с ним возиться. А закончим мы скоро!
Сейчас качество звуковой аппаратуры должно быт хуже. Да и сама запись проводилось в довольно странных условиях – в библиотеке… А ещё на той же реплике конец снова смят. but nobody came
"нельзя недословно переводить названия уровней поскольку в них заключён некий тайный смысл".
А тайного смысла нет?
Цитата (nihonjin)
Если вы спрашиваете меня, то отчасти да. В том плане, что называть уровни можно исходя из их атмосферы, а не просто переводить.
!!
Заходите вКонтакт и проагитируйте это там… (Если нету аккаунта – поступите как я – зарегайтесь, поставьте свою аватарку вместо главного фото и в бой!)
Цитата (nihonjin)
Кажется понял.
А я понял, почему ГНорк всё-тки не может быть «ГНусным».
Я же как-то говорил о том, что в оригинале он «Gnasty Gnorc», а читается это как «Гэ-насты-Гэ-норк». Причём сам Спайро постоянно «коверкал» это имя, произнося как «Nasty Norc», где «nasty» – это уже явно переводимое слово. Скорее всего, злодея зовут «Gnorc», и вторая «G» (первая у «Gnasty») уничтожается вместе с появлением «Nasty», то есть это получается двойное оскорбление.
Если мы скажем «Гмерзкий Гнорк», то этот способ проканает.
Однако получившийся «Нусный Норк» из «Гнусного Гнорка» погубит затею! Если конечно всё что я сказал верно, и Спайро его действительно и намеренно оскорблял изменением имени.
Цитата (nihonjin)
Если переставить 2 первые буквы в Spyro, то получится PS - название платформы, где произошёл дебют героя.
Хорошо-о…
Жаль, но у меня есть аргумент, который явно разбивает эту теорию. Если бы SPyro был назван так из-за PS платформы, то везде в игре, или хотя бы только в официальном названии он бы писался так, как написал я – «СПайро»/«SPyro». Чес-слово, будь я разработчиком, который хочет сослаться на платформу, именно так бы и сделал – первые две буквы заглавные! Как PSound…
Цитата (nihonjin)
Ещё, первая буква может быть омонимом горения фитиля, ну то есть "ссссссс ПАЙРО!"
О-о, это ещё лучше.
Хотя мне кажется, это скорее побочный эффект от буквы «S», нежели её основной смысл.
Цитата (nihonjin)
что могло бы говорить о взрывном характере.
По Spyro1?
Цитата (nihonjin)
Тогда я подумал, а вдруг Spyro это искажённый Spiro? Звучит одинаково и подходит по манере к Sparx<->Sparks, Byrd<->Bird.
Кстати, как дела обстоят с Шейлой и Бентли? Всё нормально?
Цитата (nihonjin)
Загуглил и оказалось, что есть такое имя
Я слышал только вариант «спирО» с ударением на конец (название мультика «Спиро и Фантазио»).Упс… хи, ошибся. Там тоже «спИру»! Ваша правда.
Цитата (nihonjin)
Но если Spyro=Spiro, то как же тогда объяснение японцев о "воспламеняющем"?!
Если «spiro» – дышать, а «pyro» – «пиро-», то и получается «Огнедых».
А «пиро» как раз и не огонь как таковой, а то самое «воспламенение».
В объяснении «spiro» было не столько «breathe», сколько «blow» – «дуть».
Не «дышать огнём», а «выдувать огонь», и даже не «огонь», а как бы «жар». И воспламенять им.
Всё. Соединить в одно слово у меня не выходит…
Цитата (nihonjin)
Но если Spyro=Spiro, то как же тогда объяснение японцев о "воспламеняющем"?!
Spyro= spiro*pyro
Цитата (nihonjin)
Поддерживаю. Кстати, в первом мире не будет голосования только по Sheila's Alp?
В том смысле, что единственный перевод очевиден?
И ещё, сделайте нам подбородку всех оригинальных названий уровней Spyro1 с их переводами, всех японских изменённых названий тоже с переводами, и наконец ваши предварительные конечные варианты переводов для нашей версии игры. (Да, я помню что где-то есть ваш список с «Порт Насти», но вдруг вы уже что-то пересмотрели и заменили?)
Цитата (DrWho)
Если глянуть внимательно - нашел. Правда, там текст латиницей.
Конечно. Но обычно, расшифровать кодировку не составляет труда – большинство букв пираты поленились перерисовывать, и они выглядят как русские.
Цитата (DrWho)
Кстати, кажется первая страница атласа хранится в WAD'е тоже.
Да нет же, в WAD хранится ВЕСЬ атлас за исключением всего того, что используется где-то ещё – надписи золотыми буквами! Какое несчастье, что атлас использует их из SCUS, а не хранит свои локальные копии…
Поэтому всё, что не написано на порталах или где-либо (например слово «Содержание») отсутствует в EXE.
Миры источников: Дом Солнечного Истока Вилла Санни Облака Спаик Горячий Кратер Морской Берег Грибной Спидвэй Вершины Шейлы Тюрьма Базза
Миры садов: Дом в Саду Ледяной Пик Заколдованные Башни Болото Спуки Бамбуковая Терраса Страна База серж. Берда Арена Спайка
Миры озёр: Дом у Озера Замороженный Алтарь Потерянный Флот Завод Фейерверков Горы Сладкая Дорога Аванпост Бентлея Пит Скорча
Миры тёмных гор: Дом на Горе Кристальные Острова Руины Кладбище Дино Шахты Гавань Быстрая Лаб. Агента9 Дом Ведьм
Миры Спаркса: Ферма Город Паука Риф Звезды Фабрика Багбот
Супер Бонус: Супер Бонус
Названия сценок:
An Evil Plot Unfolds... A Powerful Villain Emerges... A Desperate Rescue Begins... Bianca Strikes Back Spike Is Born A Monster To End All Monsters The Second Warning Hunter's Tussle An Apology, And Lunch The Escape! No Hard Feelings Byrd, James Byrd A Duplicitous, Larcenous Ursine The Dancing Bear Deja Vu? A Familiar Face Billy In The Wall One Less Noble Warrior THE END
Раскрытие злого плана… Большая опасность… Безнадёжное спасение… Бианка наносит удар Рождение Спайка Монстр побил всех монстров Второе предупреждение Драка Хантера Извинение, и обед Побег! Нет чувств Джеймс Бёрд Воровской, медвежий Танцующий медвед Дежа вю? Знакомое лицо Билли в башне Один благородный воин Конец
…«Дом у Озера», «Дом в Саду» и «Дом на Горе» мне понравились! but nobody came
Сообщение отредактировал aleksusklim - Пятница, 05.07.2013, 14:04
Мир Восхода Солнца: Солнечный Домик Вилла Солнца Облака Кратер Побережье Автострада Гора Шейлы Темница
Миры Садов Полудня: Садовый Домик Снега Башни Болото Терраса Бамбук Автострада База Бэрда Арена
Вечерний Мир Озера: Дом На Озере Алтари Потерянный Флот Завод Петард Гребень Автострада Пост Бентли Шахта
Горнополуночный Мир: Горный Домик Кристальные Острова Руины Могила Шахты Автострада Агент9 Дом Колдуна
Мир Спарка: Ферма Дом Паука Морской Риф Фабрика
Супер Бонусный Мир: Призовой Круг
Названия сценок:
An Evil Plot Unfolds... A Powerful Villain Emerges... A Desperate Rescue Begins... Bianca Strikes Back Spike Is Born A Monster To End All Monsters The Second Warning Hunter's Tussle An Apology, And Lunch The Escape! No Hard Feelings Byrd, James Byrd A Duplicitous, Larcenous Ursine The Dancing Bear Deja Vu? A Familiar Face Billy In The Wall One Less Noble Warrior THE END
Открытие… Появился подонок… Ура! Вперёд… Бьянка вернулась Родился Спарк Последний монстр Вторая опасность Битва Хантера Извиняюсь Переход! Всё в порядке Берд, Джеймс Берд Да чёрт его знает Танцующий медвед Дежа вю? Знакомое лицо Дубина в стене Один честный войн Конец
…Обновлю-ка я Approval, добавлю туда как пиратские переводы, так и раздел для названий сценок… but nobody came
Сообщение отредактировал aleksusklim - Среда, 10.07.2013, 17:37
Да! Я провёл огромнейший взлом игры, и теперь мы можем:
– Извлечь ВЕСЬ текст из игры разом; – Однозначно получить Numeration-сопоставление каждой строки конкретному STR-треку в автоматическом режиме; – Заменить звуковой трек любой реплики на любой другой существующий трек (например, большей длительности)
Началось всё с того, что я решил найти наконец нормальный метод экстракции текста из уровней. Именно по «указателям» или ссылкам. А не просто парсить весь файл как неструктурированную свалку двоичного мусора.
Со времён Вихря я помню, как устроены четвёртые суб-субфайлы, а также оставшиеся подуровни (шестой, восьмой, десятый…) В самом конце – лист ссылок на экземпляры объектов. В каждом субфайле ссылки локальные, то есть дампить совсем не требуется, чтобы узнать, куда они ведут.
Итак, список ссылок, и все они указывают в этот же файл. Некоторые из них в «верхнюю» область, где виртуально размечаются блоки по 88 байт – полные начальные описания живых игровых объектов – их координаты, поворот, масштаб, анимация. Естественно тип и вид, некоторые дополнительные данные, которые уже зависят от самого рода объекта – разумно полагать, что персонаж с текстом должен значительно отличаться от простой бочки с алмазом.
Первые четыре из этих 88-ми байтов – прямой указатель. На некоторые дополнительные данные, которыми владеет этот экземпляр объекта. И вот их структура и тип уже конкретно сильно повязаны на роде объекта – тогда я сравнивал яйцо и Вихрь – последний хранил там свою толщину, высоту и позицию камеры, а яйцо описывало номер дракончика, который из него вылупляется. И данные эти занимают разные недетерминированный объём, который игра определяет, исходя из рода объекта. То есть его тип должен быть известен ещё по 88-ми основным байтам. И да, те прошлогодние исследования показали, что меня некий индекс в допустимых пределах можно превращать одни типы предметов в другие.
И всё бы оказалось очень просто, если бы абсолютно все ссылки из листа в конце вели строго на 88-ми байтовые блоки. Но ведь нет! Некоторые ведут не в верхушку, а в середину файла (где есть уже текст). Они тоже что-то показывают, но доподлинно лишь определено, что и там первые четыре байта – новый указатель на «что-то». И зачастую этими четырьмя байтами и оканчивается весь блок, ибо следующий из листа указывает на последующие же четыре байта, которые представляют собой ещё один указатель на «что-то другое».
Из этого следует, что игра различает 88 / ? / 4 блоки ещё до того, как перейдёт к ним. Либо по сличению адреса (блоки 88 располагаются значительно выше всего остального, причём «пустое пространство» в игре размечается на новые динамические 88-блоки…), либо каким-то другим флажком или списком, действующим не из листа (или есть закономерность, как зная тип всех предыдущий указателей, определить тип очередного). В любом случае, я пока не разгадал эту тайну, и «взлом» сводился к тому, чтобы научиться косвенно разделять указатели на истинно объектные «88» и всё остальное.
На самом деле меня волнуют не сами объекты, а лишь их дополнительные переменные, на которые указывают первые четыре байта (в файле, как я уже сказал, ссылки локальны, а уже в игре они заменяются на полные с «800хххххh»).
Основное наблюдение: все «говорящие» предметы – объекты 88. Ссылки ведут на область из восьми байт, после которых ВСЕГДА следует флаг «FF000000». А строго за ним располагается ссылка на ИМЯ этого персонажа.
Имя – просто текстовая строка с нулём на конце. И сама она идет немного ниже. После ссылки на имя расположенные четырёхбайтные ссылки на все его реплики. Чем последовательность ссылок заканчивается мне не совсем понятно, но можно проверять на нуль или на выход за границы файла, а также на неадекватность результирующей строки, но надо быть осторожным, ибо слишком суровое условие типа «char<32» может смести несколько экзотических строчек, но зато «char>127» работает всегда!
Кстати, строка «реплики» текста – совсем не такая простая, как имя персонажа. Выяснено наблюдениями: первый байт ВСЕГДА показывает, сколько начальных байт «лишних» включая его самого. Самый тривиальный случай: «01ssssss…», где «ss» – байты от строки. Возможны варианты вроде «022Assss…» или «032302ss…» – ну смысл ясен. Непонятно, чему максимально может равняться это число. Были и громадные «яяяя» типа «0901FFFFFFFFFFFFFFsssss…», так что рисково проверять «имя/реплика» через «char[0]<32». Фраза оканчивается нулём как обычная строка.
Что будет, если первый байт «00h» – не знаю, но ничего хорошего. Чтобы показать «пустую» строку используется «01000000h». Бывает и с флагом «FF000000h», это тоже надо отлавливать (а не прыгать чрез 254 символа вперёд…)
Я проводил эксперименты над байтами между первым (длина мусора) и начальным от строки – выяснил, что какая-то часть отвечает за позицию камеры при разговоре с персонажем на этой реплике. Можно было заставить её повернуться вообще в другую строну! Но большинство изменений игра не переживала, падая или зависая. Иногда портилась структура диалога, особенно вручение яиц или «(треугольник) TO TALK» – фразы путались, менялись местами или постоянно произносилась одна и та же.
Ну примерно понятно, там хранится поведение объекта на этой реплике, в частности, номер следующей и условия для её произношения. Если так вспомнить – различных действий может быть очень и очень много – от открытия порталов до появления мостов.
Также я проводил эксперименты над первыми восемью байтами «дополнительных переменных» объекта (после которых идёт «FF000000h» и ссылки на имя да на все реплики). Чего-то особо интересного и поддающегося простому изменению не выискал, но вот затирание первого байта (одного байта!) приводило к тому, что персонаж при разговоре произносил не свой текст из STR! То есть менялся его номер. Ну явно же одно байта мало, у нас ведь более 255 треков в Numeration! Значит, этот байт – индекс в каком-то списке, где треки распределяются уже более детально. Возможно, список должен был быть локален для уровня. Менялись сразу все его реплики, то есть этот байт отвечал за самого персонажа, а не за его текст. Где-то лежат списки, какие треки принадлежат каждому персонажу…
И тут я снова вспомнил про игровой пароль «квадрат-квадрат-круг-круг-квадрат-квадрат-круг-круг»! Который высвечивает диалоги уровня. Он разделяет их на «Type:» и «Msg:». Где фразы из одного «Type» произносит один персонаж. И да, наблюдения подтвердили, что первый байт дополнительных переменных – это и есть «Type». А все фразы персонажа располагаются именно в той последовательности, которую задаёт «Msg».
Меняя «тип», я мог заставить двух персонажей говорить одинаковые реплики, но не мог изменить сами треки по сути, то есть сопоставления «Type+Msg=?» у меня ещё не было.
Ударился в дизассемблирование. Надпись «Type: %d Msg: %d» лежит в SCUS. Нашёл её код, посмотрел где вызывается – лишь один раз в некой функции. Долгими замусориваниями я выяснил, что эта функция отвечает за «паузу» игры. Я посмотрел откуда она вызывается (а это была прикольная switch-select / case ассемблерная конструкция!), пробовал поменять вызов – дошло до того, что вместо меню паузы у меня отрисовывается весь VRAM, но игра на паузу-таки встаёт, и воспроизведение диалогов в чит-меню по-прежнему работает. Выходит, что «Type: %d Msg: %d» лишь рисует на экране тип и номер воспроизводимого трека, но совершенно не связано с его непосредственным воспроизведением.
Заодно проверил, действительно ли у них есть парсер «%d а-ля printf C++ стайл» – и да, оказывается в код игры встроен небольшой printf-щик, который заменяет %d на переданные аргументы. Вроде у него ещё «%08x» есть, я пока не исследовал подробно как он работает, но если удастся приручить эту функцию, то можно будет через неё выводить на экран содержимое интересующих нас регистров во время экспериментов с шифровкой-сжатием текста (только ещё предстоит найти «основной цикл» игры, где отрисовывается КАЖДЫЙ кадр); неплохо бы, а то я уж собирался свой конвертер из числа в строку на ассемблере писать…
Ладно, отвлеклись. Мне нужно было найти то место, откуда «Type: %d Msg: %d» берёт данные. Там постоянно происходила сверка с некой ячейкой, в которой хранился ноль. Другие ссылающиеся на эту ячейку тоже считывали этот ноль, а потом умножали (сдвигали) на большие степени. Я попробовал изменить на единицу или что повыше – все надписи на порталах, в меню, у персонажей, на летательных средствах и прочие – поменялись! Надписи из меню появились на порталах, названия сценок в меню, а некоторые и совсем пропали. Кажется, это какой-то адресный сдвиг. Но раз он нулевой, я мысленно подставил ноль в регистр, куда загружалось значение, и легко вычислил результирующий адрес (заодно и на экран его вывел….), куда обращалась «Type: %d Msg: %d» (по-идее сам ps2dis должен это знать, но из-за скрытого нуля он не мог вычислить выражение – засылающегося не считался).
По тому адресу располагались некоторые указатели – текущий и предыдущий – на данные, а все остальные – на функции. Я попробовал изменить текущий – и ура, «Type: %d Msg: %d» перестал видеть нормальные типы и номера треков. Но мало того, так ещё и все персонажи перестали устно говорить!
Супер. Перехожу по указателю и пытаюсь разгадать формат данных. А это было не сложно: первый байт – «Type», второй байт – «Msg», третий байт – номер XA канала в SPEECH.STR файле (которые у нас <32 в основных треках и >31 в Secret’STR, их ещё можно увидеть в «idx» файле, который создаёт jPSXdec, если открыть сохранённый индекс диска блокнотом), четвёртый байт игнорируется. Далее четыре байта – некая «длительность» трека, и ещё четыре байта – реальный адрес первого сектора данного трека в SPEECH.STR !
Это же то что доктор прописал! Через эту таблицу можно как узнать, так и изменить конкретный номер конкретного трека для конкретной фразы конкретного персонажа! http://klimaleksus2.ucoz.ru/Files/STARS/hack_0.png Итак ещё раз, 12 байт – номер персонажа, номер его реплики, канал XA, длительность в условных единицах и самое главное – LBA первый сектор трека в STR. По сути, нам нужен только он, но игра требует, чтобы номер XA канала совпадал с реальным.
LBA начала секторов конкретных треков тоже можно узнать в .idx сохранёнке jPSXdec, но придётся отнять «90000» от каждого номера – это LBA самого SPEECH.STR, а игра считает сектора по файлу, а не глобально по диску (разумно, если они захотят переместить файл на другой сектор, то придётся лишь где-то поменять смещение, а не в каждом уровне игры!)
Всё прямо-таки прекрасно, осталось узнать, где же лежит эта таблица треков на самом образе, а не в памяти. Нет, в четвёртом суб-субфайле её нет. Логично, ведь она едина на весь уровень, и можно прослушивать треки подуровней из основной локации, значит искать надо среди первых трёх субфайлов.
Ну в самом первом её точно нет, там ведь только звук и графика. Во втором тоже нет… Хорошо бы в третьем – будь я разработчиком, я бы поместил её в пустующую яичную зону! Но этой таблицы нет вообще в субфайле уровня…
Тогда может она в EXE? Нет, там бы это заняло кучу места, ведь на каждый уровень своя таблица, а она обычно не маленькая (кстати, окончанием служат «FFFF0000…», когда и Type и Msg равны 255)
Значит есть где-то субфайл, в котором располагаются таблицы сразу на все уровни – я провёл поиск по WAD, и ничего не нашёл… Да чего уж там, я много-много раз прошаривал весь ISO в надежде найти хоть кусочек это таблицы (вдруг из самого STR берётся?). Но не было ровным счетом ничего.
Значит, таблица генерируется динамически во время игры. Но чёрт, данные-то всё равно берутся откуда-то, не создаются ж из ничего! http://klimaleksus2.ucoz.ru/Files/STARS/hack_1.png Стал искать других ссылающихся на адрес (который указывает на Type=0 и Msg=0 – начало таблицы), но нашёл совсем немного – максимум лишь на чтение. Из-за того, что адресация прокачивается через «вечный ноль» и передаётся в функции, бедный дизассемблер не может обнаружить ссылку и не позволяет мне обойти по всем ссылающимся.
Тогда я стал копать соседние функции (несколько указателей, которые располагались после ссылки на таблицу). Сначала я по коду пытался понять, что они делают. Потом я просто попробовал найти их код – и хоп! Его снова нет…
Ни в SCUS ни в WAD. Ну не могут же ассемблерные функции появится сами собой!? Причём в каждом уровне это в общем случае ДРУГИЕ функции. Значит они откуда-то расшифровываются в память. Но простой поиск не давал ни одного хорошего совпадения.
Тогда я стал занулять вызовы функций или менять их местами. Некоторые вешали игру, но больше 80% проходили безболезненно. Я копал в SunriseSpring, и несколько первых функций отвечали за рождение яйца – если их нарушить, то оно либо не появлялось (от Хантера), либо не рождалось. Несколько следующих функций отвечали за спецэффекты. И вот это было интересно! Пыль, брызги, вспышки, звёзды, осколки, дымок – это такие небольшие спрайты, которые появляются и сразу исчезают. Так вот, после зануления функции они перестали исчезать! Они просто появлялись и оставались в 3D пространстве. Это было круто, никакими скриншотами не объяснить… После Зои, рождения яйца, разбивания банки или даже простого торможения остаются «спецэффекты». И они так и висят в воздухе застывшими как в желе! Можно даже выпускать пламя несколько раз – на концах остаются клубы дыма.
Мне сразу же стало любопытно, что будет, если ОЧЕНЬ много раз вызвать спецэффекты – заполонят ли они всё вокруг, или игра вылетит с нехваткой памяти. Оказалось всё гораздо умнее – когда спецэффектов становилось слишком много (причём независимо от типа – дым, звезда или искра), самые старые начинали исчезать. Но не сами по себе, а строго при появлении новых. Это неплохо раскрывает внутреннюю структуру их хранения. Скорее всего там определённый массив-очередь, и при добавлении новых смещается его индекс верхушки, при уничтожении – индексы высвобождаются. А если не удалять объекты, то индекс пройдёт кругом и начнёт затирать самые старые спецэффекты. Вернее даже не затирать, а лишь переопределять их.
Эффект не долговечен – до перезапуска уровня или выхода в другой, также имеет некоторые плохие побочные действия, но можно и как PEC код выложить…
Все оставшиеся последующие функции так или иначе были связаны с водой – плавание на поверхности, в глубине, поведение камеры в воде, скорость плавания, управление плаваньем, притяжение и столкновения – доходило до того, что прыгнув в ручей дракончик начинал «плавать» в его плоскости по воздуху не падая. И отменить было нельзя, прыжок тоже не работал. Была функция, отвечающая за нажатие треугольника.
Отдельного внимания заслуживает ещё одна функция, которая отвечала за всю живую природу вплоть до Спаркса. Стоило её отключить, как стрекоза замирала на месте и больше не следовала за дракончиком, но при этом оставалась живой и анимация воспроизводилось. Также не работали таблички, герои не разговаривали, надписи на порталах не возникали. Бочки оставались материальными, но не разбивались от огня; при бодании оставались на месте, но Спайро пробегал сквозь них. Овцы мирно щипали травку стоя на одном месте, из тоже нельзя было поразить. Камень, который надо разбить головой чтобы получить яйцо, больше головой не разбивался. Если же потом вернуть вызов функции на место, то все объекты снова оживали, Спаркс прилетал, а овцы разбегались.
Из всего этого я делаю заключение, что в эту область памяти помимо таблицы Type+Msg=STR выгружается ещё и сам код уровня! Конкретно поведение тех или иных объектов. Сами объекты отдельно, а их код здесь.
Поиск чего-либо по этим указателям по-прежнему ничего не давал, и я вдруг попробовал найти сами указатели. Мне казалось, что уж они-то точно должны на лету генерироваться…
Но я нашёл полное совпадение! И оно вело… на следующий субфайл! Все же помнят, что нумерация уровней идёт через один (98, 100, 102…). Так вот, соответствующий блок указателей хранится в самом начале следующего же субфайла (99,101,103…). Причём это начало полностью совпадает с тем, что находится в памяти. http://klimaleksus2.ucoz.ru/Files/STARS/hack_2.png И да, если компарить файл с памятью эмулятора, то «место, где должна быть таблица» оказывается в самом конце последующего субфайла. А при более детальном рассмотрении её даже видно! Однако данные совершено не те…
Это шифровка! Смотрите: http://klimaleksus2.ucoz.ru/Files/STARS/hack_3.png Ясно же, что за «00000000h» отвечает «CCC90880h». Я даже угадал способ шифрации. Сперва грешил на сложение и вычитание, но это оказался старый быстрый симметричный XOR ! все данные по 4 байта ксорились с неким ключом-паттерном, который записан… где бы вы думали? В заголовка файла! Начиная с четвёртого байта. А с двенадцатого байта идёт указатель на таблицу треков…
Мне нужна ссылка на начало шифрованной области. Её нигде не было, но исследовав несколько «следующих» субфайлов от разных уровней, я понял, что она мне и не требуется вовсе. Достаточно пропустить первые четыре байта, потом считать четырёхбайтный ключ, далее считывать по четыре байта и сверять с ключом – пока не совпадает – не трогать. Как только найдено полное совпадение (а это ВСЕГДА начало шифрованной области) – начиная со следующих же четырёх байт просто ксорить каждые считанные четыре байта с ключом. И так до конца файла!
Так мало того, ещё и зашифровывается обратно абсолютно так же – пропускаете декодированный файл через тот же механизм – он считает неизменный ключ и пойдёт его искать, а как найдёт (первое вхождение мы оставили нетронутым) – поксорит все нижеследующее с там же ключом, а в силу симметричности XOR, это восстановит оригинальные данные.
Ура! Теперь мы во-первых, знаем для чего нужные «следующие» субфайлы, а во-вторых, можем как считывать, так и менять сопоставление персонаж+фраза=озвучка. Остаётся открытым вопрос, зачем игра вообще что-то шифрует? Ей же гораздо проще вытащить неизменные данные, как начало этого же файла. Если же разработчики специально хотели скрыть эти данные от взломщиком/переводчиков, то могли бы придумать шифровку поизобретательнее чем банальный XOR, и ещё к примеру, закодировать сами указатели в заголовке, по которым я вычислил субфайл. Единственное, что я знаю, зачем применяют шифровку простым XOR – исключительно для блокирования автоматических попыток сличить данные между файлами. Например, чтобы встроить вирусный код в тело своей программы так, чтобы ни один антивирус его там не обнаружил. Почему XOR? Самый-самый быстрый. Почему не что-то помощнее? Нет смысла – машина и XOR не распознает, а от человека не спасёт и ничто другое…
Возвращаясь к сути полученных данных – для изменения номера STR на свой, нужно во-первых, найти Type персонажа, который его говорит, а также Msg номер реплики (всё это легче сделать в самой игре через тот же чит). Потом узнать начальный сектор целевого трека в SPEECH.STR, а также его XA канал. Остаётся загадочная «длительность» и единицы её измерения. Если поставить «0», то звука мы не услышим, а текст выведется на экран также быстро, как выводится текст от табличек. Если поставить большое число (стандартный разброс от «128» до «4512»), то текст будет выводиться по буковкам очень медленно, и продолжит делать это даже когда звук закончится. Что интересно – число никак не связано с длиной строки – одинаковая «длительность» заставит и длинную и короткую строки выводится на экран ровно нужное количество времени, в том смысле, что короткая строка будет выводиться дольше, а длинная наоборот, быстрее. А это означает, что игра ещё и вычисляет расчётную длину строки перед её выводом, умножает на нужный коэффициент и учитывает «длительность» из таблицы треков. А я-то думал, как все фразы на экране оканчиваются одновременно с голосом? Ну а для проекта перевода это означает, что НЕЛЬЗЯ в отличие от пиратов, завершать строки пробелами, даже если мы уместились в {Разницу} и наш текст оказался короче оригинального. Нужно оборвать строку нулём! Тогда её длина будет соответствовать скорости выведения на экран. А печатным строчкам в меню это хороший повод появиться ровно посередине экрана…
*Продолжение ниже*
Сообщение отредактировал aleksusklim - Среда, 10.07.2013, 01:40
Вспомним, с чего мы начали, а именно – поиск и извлечение строк из данных для объектов. Замечательно, первый байт показывает «Type» героя, потом семь байт неизвестно что, затем «FF000000h», а далее сразу указатель на его имя, за ним – перечисление указателей на реплики.
Чтобы добраться до «Type» из нижнего списка, нужно дважды разыменовать указатели: из листа на 88, оттуда по четырём первым на «Type», и если через семь байт расположен «FF000000h», то скорее всего дальше следует имя и тексты. Однако «FF000000» встречается в объектных (4,6,8,10…) суб-субфайлах очень часто, и велика вероятность холостого срабатывания. Можно ещё и парсить строку по критериям вроде минимальной длины, допустимых символов, чтобы начиналась с заглавных букв.. но всё это уже почти перебор, а я ищу более строгий однозначных метод.
Оказалось, что после указателя на 88-байтовый объект с текстом, через несколько строк в листе обязательно будет указатель на 4 байта, которые ссылаются на ИМЯ этого персонажа! А потом и далее через четыре байта по всем его репликам. Получается, что текст это как бы тоже объект…
Легко запутаться. Суть в том, что на каждую фразу ровно один указатель, он находится выше неё. Рядом с ним есть указатели на имя и остальные фразы. До них идёт «FF000000h» а ещё левее – дополнительные переменные объекта. Основная ссылка в листе ведёт далеко вверх на 88. Оттуда по указателю – на «Type». Если отойти на 12 байт правее, то встретим указатель на имя, НО туда же ведёт одна из последующих ссылок в листе. Для этого нам даже не надо знать объект – разыменовываем первую – попадаем на 4 байта, разыменовываем их – вот и имя персонажа. А если также поступить с несколькими следующими строчками листа, то выйдем на все тексты. Получается, что можно либо найти объект и идти вправо в поисках текстов, либо найти тексты и щупать слева их объект…
Я объединил оба метода! Я храню массив «потенциальных» ссылок на имена. Если разыменовывая предполагаемый объект я обнаруживаю флаг «FF000000h», то помечаю «номером Type» место справа, где должна быть ссылка на имя. И если (и только если) это действительно ссылка на имя, то разыменовывая некоторый следующий объект я обязательно наткнусь на ячейку массива, в которой что-то записано (это номер Type потенциального объекта), а значит, смогу тут же считать и имя, и все реплики (даже не дожидаясь указателей на них, просто помечу как «использованные» на всякий случай), и при этом буду знать Type!
Всю эту систему я отлаживал довольно долго, пока она не стала работать ровно так, как должна – вытаскивать абсолютно все тексты с сохранением Numeration. Оказалось, что иногда ссылки на реплики ведут в пустые ячейки, но их нельзя игнорировать, ибо «Msg» повязан на порядковом номере, и если пустую строку выкинуть, то все последующие номера реплик этого персонажа будут сбиты. «Скачок» Msg наблюдается и в чит-меню в самой игре, так что несуществующие строки (коих например полно на табличках Шейлы начиная со второго мира– они определяют текст, который должен быть показан, если кенгуру «ещё» не спасена, что в принципе невозможно при легальном прохождении; мы хотели туда свой рекламный текст вставить… думаю, что теперь мы сможем вставить туда ещё и свою озвучку – да, кажется таблички тоже могут «говорить»…) я решил заменять на прочерки «-», как и «несуществующие имена» (тех же самых табличек например).
Осталось всего ничего – вытащить LBA начальные сектора всех треков из STR, чтобы сверять с ними содержимое из таблицы сопоставления «Type+Msg». Нет, я больше не хочу доверять ни jPSXdec, ни три часа рипать образ через RipBin. У меня уже есть утилитка для замены треков в STR, я перечитал её код, и написал такую прогу, которая сможет считать XA каналы и LBA начала секторов напрямую из ISO образа! Реально, мне нужно по одному байту с каждого сектора, зачем для этого извлекать весь SPEECH.STR ? Зато нужно знать как структуру формата образа (24/2048/280), так и размер + LBA самого STR файла в нём. Это уже эмулирование и WinHex… Зачем? Все нужные данные лежат в корневом секторе, это номер 22. Там таблица размещения файлов. Вообще документацию ISO9660 надо бы почитать, а не как я – посмотрел и взломал формат самого образа.
Короче, шняга такая. В 22-ом секторе находится описание корневой папки. Первые два байта – длина структуры. За ней следует очередная структура, где первые два байта снова показывает длину. Если длина равна нулю, то список закончился. Структуры описывают либо расположение файла, либо папки, либо текущий/родительский каталог. Четыре байта (после размера структуры) – LBA первый сектор объекта. Потом четыре байта с чем-то непонятным. За ними четыре байта – размер объекта. Ещё 18 байт непонятного назначения, и один байт – длина имени объекта. Следом за ним – само имя, терминированное нулём. После него идёт что-то ещё, но оно мне уже не нужно. «Объект» может быть либо файлом, либо папкой, либо сигнатурой каталога. У последней нулевое имя, так что её отличить легко (она показывает текущий LBA той папки, в которой вы находитесь). Файл от папки отличается чем-то внутренним, во что я не стал вникать, а решил просто сканировать имя – если оно заканчивается на «;1» (вернее просто предпоследний символ – точка с запятой), то это файл, а иначе – папка.
Находя папки нужно рекурсивно перемещаться в их сектора и снова считывать структуры. Поскольку записи каталогов всегда первые две (свой и корневой), то вместо них можно просто по желанию выводить путь текущей папки, а ещё возможно опционально отключать рекурсию или не выводить полные пути.
Правда я не тестил свою программу на образах с каталогами, которые занимают более одного сектора (2048 байт), скорее всего, она не сработает, но вряд ли для PlayStation есть диски, на которых будет ТАК много файлов в одной папке, и уж тем более, в Spyro.
Вроде и всё, но для полной картины я решил придумать способ, как вытащить названия миров из SCUS. Поскольку указатели глобальные, то надеется на них бессмысленно (я не хочу ни хардкорить, ни опционально задавать адрес размещения EXE в памяти игры, ибо у GH он один, а у обычной версии совсем другой). Взял навскидку адрес «4096» и незатейливыми свериваниями (пока четвёртый байт каждого квартета равен 00h или 80h – чистой воды указатели) продвигаюсь к «Pete the Mountain Goat», который пропускаю просто по известной длине, а уж потом считываю список разделённых нулям строк.
Такой же шаткий парсинг пришлось применить и для нахождения таблицы TypeMsg в раскодированном «следующем» субфайле (указатель я опять не мог использовать по тем же причинам) – шёл снизу вверх от Type=255 и Msg=255 пока не встречу Type=0 и Msg=0; и даже для считывания листа ссылок на объекты и строки в объектных суб-субфайлах – не просто снизу вверх игнорить пустоту: в некоторых уровнях там располагались громоздкие указатели на память, так что сначала искал «не ноль», потом что-то «меньше размера файла но больше нуля», а затем уже «ноль», разворачивался и шёл вниз.
Теория закончилась, начинается практика. Я ведь написал аж 10 программ на Delphi ! Некоторые общего назначения, другие чисто под Spyro. Одни могут применяться независимо, а некоторые лишь в связке с остальными.
Общее управление проходит через «.bat» сценарии, и как обычно нужно «перетаскивать».
Файл «Namespace.bat» определяет имена программ, сценариев и рабочих файлов, его вызывает почти каждый скрипт.
Кстати, способ извлечения файлов напрямую из образа тоже пригодился, и он работает не только на BIN/ISO, но и на MDF, надо лишь выставить «24/2048/376». А также, для пиратских образов нужно знать имена файлов «WAD.WAD», «SCUS_944.67» и «SPEECH.STR» (если есть).
Поэтому первый сценарий задаёт параметры для образа. Например для GH это
set ROOTLBA=22 set HEADERSIZE=24 set SECTORSIZE=2048 set FOOTERSIZE=280
set WADNAME="\WAD.WAD" set EXENAME="\SCUS_944.67" set STRNAME="\SPEECH.STR"
Для моего пиратского сборника (он у меня в MDF)
set ROOTLBA=22 set HEADERSIZE=24 set SECTORSIZE=2048 set FOOTERSIZE=376
set WADNAME="\WAD3.WAD" set EXENAME="\SPYRO3.EXE" set STRNAME="\\\"
Основную подготовку выполняет автоматический скрипт «Kernel.bat» Он извлекает таблицу размещения файлов с образа, потом пытается найти в ней «SPEECH.STR», и если это удаётся, то запускает программу, которая извлечёт из образа номера секторов для всех треков. Но этого мало, затем другая программа перестраивает список так, чтобы он соответствовал нашему Numaration (если XA канал ниже 32, то нумеровать с нуля, а если нет, то с тысячи) Далее в той же файловой таблице обнаруживаются SCUS и WAD, а потом извлекаются в рабочую папку (убедитесь, что на жёстком диске достаточно места!)
Остаётся три этапа – работа со SCUS, работа с WAD и сбор общего списка. Их выполняют разные скрипты.
«ScusWork.bat» извлекает из EXE названия всех уровней, а потом пропарсивает их так, чтобы номер «98» стал «098».
«AllLevelsWork.bat» работает с WAD куда комплексное. Он поочерёдно извлекает по два субфайла от 98 до 170 (171) и передаёт их для «OneLevelWork.bat». Тот сначала расшифровывает второй субфайл, потом вытаскивает из него таблицу треков, затем начинает поочередно извлекать из первого субфайла подуровни от основного четвёртого до «пока не перестанет извлекаться», ищет описанным способом все тексты подуровня и вызывает основную программу, которая сольёт их вместе с номерами Str в один большой документ (который каждый раз дополняется, а не перезаписывается).
Остаётся лишь финально пропарсить этот документ, чтобы вставить туда названия уровней и выдать читабельные версии. Сейчас на выходе есть один общий красивый документ с текстами в стиле Хранилища, один простой текстовый список, табличный формат для Numeration, файл для моей базы данных и простой список всех персонажей, разделённый по уровням, а глобальные герои, появляющиеся более чем в двух уровнях, вынесены в его начало.
Там же определяется длительность (для Numeration) каждого трека в STR исходя из количества XA секторов, занимаемых дорожкой. Сразу же пришла простая формула, связывающая размер XA с «длительностью», записанную с таблицу TypeMsg: это количество целы занятых секторов, умноженное на 32. Например, самые короткие реплики занимают пять секторов, значит «длительность» равна «(5-1)*32» = 128; Самая большая фраза Бианки имеет длительность 4512, значит «(4512/32)+1» = 142. Примерная реальная продолжительность трека в секундах вычисляется делением количества секторов на коэффициент «4,6875», погрешность составляет менее двух десятых секунды («с запасом») для первой реплики Бианки и чуть больше 0,7 для самых коротких треков.
*Окончание ниже*
Сообщение отредактировал aleksusklim - Среда, 10.07.2013, 01:34
Ну что ж, осталось лишь описать интерфейсы всех своих программ и скриптов…
«FastExportWad.exe» – клон «FastWad», который может только извлекать субфайлы. Плюс, меньше пишет на консоль. Принимает путь к WAD, имя куда извлечь и номер субфайла.
«SpyroLabels.exe» – вытаскивает названия уровней из EXE. Принимает путь к SCUS, имя для сохранения текстового документа, номер последнего уровня и шаг нумерации. Поскольку располагаются они в обратном порядке, последние два аргумента будут «170 -2» Формат выходного файла: первая строка – номер уровня, следующая строка – полученное название. И так до конца файла (пустая строка).
«SpyroObject.exe» – основной алгоритм поиска объектов и их текста в субфайлах подуровней. Принимает извлечённый четвёртый (шестой, восьмой…) суб-субфайл, имя для выходного документа и максимальную длину строки, которую я определяю как 1024 символа. Формат выходного файла: строгий. 4 символа – разделитель «----» или число – длина строки (десятичный формат с начальными пробелами, не более «9999»). Затем 1 символ табулятора. Далее если это строка с разделителем «----», то три символа – десятичное число – «Type» индекс объекта (не более «255») и два символа переноса строки; если строка начиналась с числа-длины, то после табулятора идут столько (длина) символов – текстовая строка, оканчивающаяся двумя символами переноса строки. Если предыдущая строка была с разделителем и числом «Type», то текущая строка отражает имя объекта. Все следующие строки построены по принципу этой, но в них в корректной последовательности «Msg» указаны все реплики персонажа. До тех пор, пока вместо длины не появится очередной разделитель «----». Файл начинается с разделителя и заканчивается разделителем и табулятором.
«SpyroCodeCrypt.exe» – декодирует и шифрует обратно «следующий» субфайл уровня. Если передан один аргумент – имя субфайла – программа модифицирует его самого, если два аргумента, то первый считывается, а во второй сохраняется результат.
«SpyroCodeCrypt.exe» – Распечатывает таблицу «TypeMsg» из расшифрованного «следующего» субсубфайла. Принимает декодированный субфайл и имя документа для сохранения. Формат выходного файла: строгий, но читаемый. По строкам расписаны значения «Type», «Msg», «Канал XA», «длительность» и «LBA начальный сектор». Потом пустая строка. И так до тех пор, пока не выйдет «255/255/0/0/0» (всегда в конце). Каждая строка после нескольких табуляторов выносит «в центр» экрана те же самые данные, но уже с подписями. Программа также способна принимать свой же изменённый документ, чтобы модифицировать исходный декодированный субфайл. Для этого передайте ей любой третий аргумент (из второго данные пишутся в первый). Внимание, используются только значения из левого столбца в документе! И да, лучше ничего не добавлять и не забирать, а лишь изменять цифры. В конце всегда должен быть «255/255/0/0/0», иначе игре же хуже; а первым должен быть «0/0/…», иначе второй раз не откроется. В теории можно расширить список, но на практике я это не проверял, скорее всего общий размер фигурирует где-то в другом месте.
«CdSector.exe» – десять аргументов… Строит список файлов на образе диска. Первый – путь до образа, второй – имя для сохранения документа. Третий – начальный сектор с корневой папкой (обычно «22»), четвёртый-пятый-шестой – настройки «заголовок-тело-хвост» формата образа. Для ISO это «24», «2048», «280»; для MDF это «24», «2048», «376». Что обозначают эти числа я писал ещё в японской теме для RipBin. Здесь же более общий случай, поэтому «тело» обычно всегда будет «2048». Последние четыре аргумента – опции: «0» отключено, «1» (или что угодно) – включено. Первая – обрабатывать ли все каталоги рекурсивно? (Да – выведет и из всех дочерних, Нет – только из указанного сектора, если третий аргумент «22», то лишь из корневого). Вторая – Показывать ли найденные папки? (Да – обнаруженные папку будут выведены наравне с файлами, Нет – папки может и будут обработаны рекурсивно (предыдущая опция), но не выведутся в документ). Третья – выводить ли имя текущего каталога? (Да – в каждом каталоге перед списком окажется его имя и адрес, Нет – список будет содержать только найденные папки (если предыдущая опция) и файлы). Четвёртая – Отображать ли полные пути? (Да – перед именем каждого файла и папки будет выведен путь до него, начинающийся с «\», Нет – имена будут выводиться так, как они записаны в структуре каталога) Формат выходного файла: зависит от настроек, но принцип такой: первая строка – два числа и символ (через пробелы) : LBA первый сектор объекта, размер объекта в байтах и флаг: «P» для текущего каталога, «F» для найденного файла, «D» для найденной папки. Следующая строка – имя объекта. В конце списка пара чисел «сектор размер» будет «0 0». Рекурсия каталогов проходит только после полной распечатки текущего, то есть сначала перечисляется содержимое имеющейся папки, а за ней программа последовательно переходит по папкам сверху вниз. Файлы имеют в конце имени «;» и цифру, папки ничего, а информация о текущем каталоге оканчивается на «\».
«GetFromDisc.exe» – извлекает файл из образа диска напрямую. Аргументы: путь к образу, имя для сохранения, LBA первый сектор файла, размер файла в байтах, и троица настроек формата образа «24», «2048», «280» (или «24», «2048», «376» для MDF). По сути, извлекать файлы можно с любого типа образов, если они устроены одинаково с ISO/BIN/MDF, если рассмотреть неизвестный формат получше и подобрать эти числа. У программы нет функции засовывания файла обратно в образ, ибо ни к чему хорошему это не приведёт (сгорают контрольные суммы), зато её код до смешного простой.
«StrDump.exe» – распечатывает начала треков и их каналы из STR файла на образе. Аргументы один-в-один такие же, как у предыдущей программы (GetFromDisc). Формат выходного файла: список. Четыре числа в каждой строке: LBA первый сектор трека, его размер в секторах, номер XA канала, «Sector stride» – число, показывающее через сколько других треков перемешены нужные (jPSXdec кстати, это тоже запоминает в свой «idx»). Завершается флагом «0 0 0 0».
«SpeechList.exe» – Считывает выходной документ от предыдущей программы (StrDump) и строит на его основе наш Numeration список. Два аргумента (угадайте какие?) Формат выходного файла: тоже список из четырёх чисел: STR номер трека (в нашем смысле), LBA первый сектор, количество секторов трека, и его XA канал. Кончается ничем.
«TextMerge.exe» – сливает все необходимые данные в единый текстовый документ. Первый аргумент – выходной файл от «SpyroObject.exe»; второй аргумент – выходной файл от «SpyroStrInfo.exe»; третий – выходной файл от «SpeechList.exe»; четвёртый – документ для сохранения: если существует, то происходит дозапись, если нету – создаётся новый; пятый аргумент опциональный – номер уровня WAD (строка) : если передан, то сразу записывается в выходной файл со звёздочки («*098»), если не передан – допись просто происходит через несколько строк – это необходимо чтобы отличать уровни от подуровней – при обработке уровня надо передать его номер и он впишется, а подуровни просто потом допишутся через пары пустых строчек. Формат выходного файла: огромный список! Строки, начинающиеся со звёздочки – начала уровней., они отделяются пустыми строками с обеих сторон (первая строка по идее должна сразу начинаться со звёздочки). Очередная непустая строка – имя персонажа. За ним перечисляются реплики до тех пор, пока не встреться пустая строка; каждая реплика занимает две строчки: на первой четыре числа – наш номер STR, LBA первый сектор трека, размер трека в секторах, и «длительность» фразы из игры (номер канала XA я посчитал лишним и вообще ненужным); а на следующей строке уже сам текст реплики. После пустой строки снова ожидается имя персонажа и его реплики, но: если пустых строк две или более – это разделитель подуровней; если встретилась звёздочка – на этой же строке имя нового уровня. Если фраза не наёдена в STR и не может быть сопоставлена в номером для Numeration – вместо четырёх чисел выводится «0 0 0 0»
«FinalOutput.exe» – Последний монстр, принимает семь аргументов. Первый: имя выхода от предыдущей программы (TextMerge), ещё пять файлов являются выходными: нормальный, текстовый, табличный, список персонажей, код базы данных. Последний седьмой аргумент – текстовый документ из-под «SpyroLabels.exe» (дополнительно прошедший через «FixNames.bat») с названиями уровней, сопоставляемыми с их номерами. Форматы выходных файлов: Нормальный: разделитель уровней «~~~~~~~~» за ним после переноса номер WAD, двоеточие и после пробела название уровня; разделитель подуровней «~~» отдельным абзацем; имена персонажей в круглых скобках с двумя пробелами в начале, за ними строки, начинающиеся с номера STR в квадратных скобках с табулятором на конце, и на этой же строке сам текст реплики. Пустые строки отделяют персонажей с их текстом и разделители. Текстовый формат – простой список: номер STR, номер уровня WAD, имя персонажа, двоеточие с пробелом и текст реплики. Цифры выровнены пробелами, а после них вставлены табуляторы. Табличный – почти как текстовый, но везде стоят «||» для наших wiki-страниц. Под номером уровня WAD через «<br / >» ещё и вставлена приблизительная длительность трека в секундах (формулу я приводил выше). Список героев – всё просто: сначала «глобальные», потом через разделители «~~~ WAD ~~~» локальные (если есть). Формат базы данных пока описывать не буду, расскажу о нём когда про эту самую базу буду говорить.
Ну и все сценарии:
«FinalWork.cmd» – запускает «FinalOutput.exe» и сортирует текстовый и табличный вывод через «Sorting.bat».
«AllLevelsWork.bat» – принимает имя WAD-файла и делает кучу действий, основное – вызов «OneLevelWork.bat» в цикле.
«FixNames.bat» – принимает вывод от «SpyroLabels.exe» и добавляет двузначным цифрам начальный ноль, перезаписывает исходный файл.
«ISO_rip.bat» – принимает ISO образ GH и производит все действия над ним.
«Kernel.bat» – внутренне использование, принимает образ от «ISO_rip.bat».
«MDF_rip.bat» – клон «ISO_rip.bat», настроенный на ParaDoX образ MDF (и там нет SPEECH.STR). Можете заменить переменные в файле под себя.
«Namespace.bat» – вызывается всеми, закрепляет имена файлов, можете отредактировать его.
«OneLevelWork.bat» – принимает три аргумента: первый – субфайл уровня, второй – следующий субфайл, третий – номер основного уровня (ноль в начале для «98» добавляется внутри). Сливает текст из одного уровня куда следует.
«ParseLba.bat» – принимает вывод от «CdSector.exe» и имя интересующего файла (без «;1» на конце). Записывает в переменные %t_lba% и %t_size% сектор и размер если нашёл, и нули, если нет.
«ScusWork.bat» – принимает SCUS и вытаскивает оттуда названия уровней. Сам вызывает «FixNames.bat».
«Sorting.bat» – использует «sort», чтобы отсортировать переданный файл. Перезаписывает его.
Есть ещё несколько самостоятельных батников: (все они принимают один файл и выводят результат по тому же имени с новым добавленным расширением, просто наблюдайте появление нового файла рядом с исходным)
«CdSector_ISO.bat» – перетащите на него образ и он построит список файлов на нём. «CdSector_MDF.bat» – клон для MDF.
«Code_crypt.bat» – перетащите на него «следующий» субфайл, и он его раскодирует/закодирует.
«Get_levels.bat» – перетащите на него SCUS и он вытащит оттуда имена файлов.
«Get_SCUS.bat» – перетащите на него образ GH, и он вытащит оттуда SCUS. «Get_WAD.bat» – клон для WAD.
«Spyro_text.bat» – перетащите на него объектный субфайл, и он вытащит вам текст оттуда.
«Str_export.bat» – перетащите раскодированный «следующий» субфайл и получите TypeMsg таблицу треков. «Str_import.bat» – если изменили вывод предыдущего то можете всавить его обратно – перетаскивать надо по-прежнему за раскодированный «следующий» субфайл.
«StrDump_GH.bat» – перетащите на него образ GH, и он вытащит вам информацию о секторах.
Кстати, многие сценарии ломаются, если не передать какой-то параметр или сделать это неправильно. Никаких звёздочек не пишите, а том там есть команды удаления файлов, будет плохо если попадёт del /f /q * А все программы вообще не запустятся если не соблюдать количество аргументов. Всё что они пишут на консоль – название и статус: «OK !» – доработала до конца, «ERROR !» – возникла ошибка. Никакой справки по аргументам в них нет, лучше читайте вызовы из bat-фалов.
Последнее, что нужно сказать. Я понял, откуда у «панд» так много текста! Помните подуровень, где надо было на лодке защищать от носорогов целую кучу панд? Так разработчики тупо копирнули код одной из «говорящих» панд более десяти раз. При этом в игре текста нет, а в файле тонны его копий… (забавно, мои пираты его даже по-разному переводили!) В подуровне MoltenCrater где надо было прикрутить головы человечкам – всех их зовут «Rocky». Текстов нет, а имена есть. У всех трёх козлов одинаковое имя, текст и номера STR. Но имя меняется во время игры, они берётся из EXE. В MidnightMountain Бианка скопирована дважды, ибо она появляется как в начале уровня, так и возле ворот Колдуньи. И весь её текст тоже сдублирован дважды, со ссылкой на те же треки из STR (если найти где концы какой реплики, то в ненужный текст преспокойно влезут все данные для моего Вихря!) Такое встречается много где, например у Шерифа. А у Зои на табличках для Спаркса есть «Yes.» да «No.» и как ответа на вопросы и как отдельные реплики.
Я провёл эксперименты над Платиной, причём у меня откуда-не-помню есть «.sub» файл, который если положить рядом с образом, то Epsxe эмулирует его как оригинальный диск, и в Cloud Spires не вылетает ошибка. Следовательно я имел возможность дампить память после ошибки защиты и без неё, чтобы найти отличия.
И да, во всём виноват XOR. Но не совсем тот, который расшифровывает «следующий» субфайл. Я поковырялся в коде и понял, что такое «ключ» для расшифровки. Оказывается это просто адрес, на котором нужно перестать ксорить! Система загружает «следующий» субфайл в память по статичному адресу, потом считывает ключ с четвёртого байта, потом прыгает вперёд ровно на «1000h» (4096 байт) и начинает производить XOR всех данных с ключом до тех пор, пока текущий адрес не станет больше или равен значению ключа. По сути наш ключ – это просто размер «следующего» субфайла плюс его адрес загрузки минус количество нулей на конце.
При правильной эмуляции с субканалом я сдампил память и сравнил её с файлом из WAD. Естественно, не совпадало. Тогда я расшифровал его своей программой (можно выпустить новую версию, раз теперь известно назначение ключа) и сравнил ещё раз: основная часть совпала, а небольшой участок остался шифрованным, но не так, как в остальном (WAD и дамп). С этими тремя я сравнил дамп при ошибке защиты, и в нём этот же участок выглядел опять неправильно. Через дизассемблер я нашёл функцию, которая им занимается, и там снова был XOR. Но сама функция находилась в этом же «следующем» субфайле, то есть была расшифрована первым XOR (который с ключом).
Выходит, что система защиты влияет на вторичный ключ, которым уже расшифрованный «следующий» субфайл расшифровывает небольшую часть себя. Откуда он берёт адрес, размер и ключ – не совсем понятно, но скорее всего, они просто вшиты в его тело (которое изначально шифровано первым XOR).
Второе наблюдение: если сохранить savestate при загрузке с субканалом, то потом даже если поменять образ на «нелегальный» и загрузить savestate, то больше ошибок не случится. Из чего я делаю вывод, что игра ОДИН раз сканирует легальность диска, а потом просто обращается к результатам проверки.
В описании libcrypt сказано, что хранит магическое слово игра чёрти где, и просто так в дампе его не будет. Но где-то в эмуляторе оно же есть! Плюс известно, как именно libcrypt сканирует диск – обращаясь к ячейкам-регистрам дисковода, их можно подсветить в ps2dis если загрузить ps1.map через «label definition file» в меню.
В итоге есть три способа обойти libcrypt на Платине: 1) Найти и уничтожить функцию, которая сканирует диск на легальность. Вместо неё написать код, который даст такой результат, будто прежняя функция подтверждает легальность любого диска. 2) Найти место, куда сохраняется магическое слово и само это слово (например, сравнивая память эмулятора в ArtMoney). Потом просто всунуть куда-нибудь функцию, которая положит магическое слово в нужную ячейку или регистр. Либо понять, откуда шифрованная функция в «следующих» субфайлах получает правильный или неправильный ключ, и сделать так, чтобы он всегда был правильным. 3) Полностью разрушить все XOR-шифрования, а в WAD поместить заранее расшифрованные (сдампенные) «следующие» субфайлы – игра будет пытаться их неправильно расшифровать, но мы занулим саму шифровку (поэтому независимо от правильности ключа, функция всё равно ничего не изменит), а поскольку файлы будут загружены уже расшифрованные нами, то всё будет «просто работать». Альтернатива – найти ключи-смещения-размеры для каждого уровня, которые использует вторичный XOR, и «перешифровать» части файлов так, чтобы неверный ключ наоборот становился верным и выдавал корректные данные (это легче чем кажется, XOR же симметричный!)
Результаты испытаний: 1) Найти первую функцию тестирования диска оказалось слишком сложно… Ссылок на аппаратные регистры дисковода очень много – я пытался занулять вызывающие их функции, но игра либо не загружалась совсем, либо наоборот работала абсолютно правильно (я пытался испортить алгоритм сканирования диска, чтобы на «легальном» образе происходила ошибка при входе в Cloud Spires) 2) Я искал через ArtMoney различия в памяти эмулятора при загрузках верного и неверного образов, а также после savestate на легальных и нелегальных запусках. То что нашёл не сработало… Пробовал сверять память, куда частенько идёт обращение в областях возле XOR, но полная её подмена на данные с «нелегального» запуска ничуть не помешали игре зайти в уровень корректно. 3) Предварительная расшифровка WAD может сработать, но есть две проблемы: нужно дампить и дизассемблировать КАЖДЫЙ уровень, что отнимет очень много времени… А во-вторых, ещё не факт что мы вот так просто найдём ВСЕ места, где игра обращается к системе защиты. Может она не только запуски уровней трассирует? (вылетание при касании воды, лавы или проигрышах (Buzz’s Dungeon) – это всё равно пока «следующий» субфайл, ибо там и описано поведение воды, камеры и спецэффектов. Но я имею в виду что-то совершенно другое, например появлении «Зои» понятно где…)
Что хочу сказать – Платину можно взломать. Но я пока не стану этим заниматься. Когда дойдём до перевода Платины – вернусь к взлому. Либо если кому интересно, можете сами попробовать снять libcrypt, или хотя бы проверить гипотезу о полном удалении ксора отовсюду. Насчёт GH – у нас всё в порядке. Даже если за первым ксором скрывается ещё один, то в обычном режиме он нормально расшифровывает критические данные, и игра всегда работает. Откуда берётся Зоя при загрузке подставной сохранёнки с карты памяти? Ещё не знаю, но во-первых я не уверен что это вообще связано с libcrypt, а во-вторых я не буду убирать Зою, мы же хотим в ней послание оставить! but nobody came
Сообщение отредактировал aleksusklim - Четверг, 11.07.2013, 17:29
Посмотрите в голосование и увидите своими глазами то, что хотели. Выигрывает пиратский вариант, Спайропедия на втором месте.
Хоть он и «пиратский» по происхождению, но вполне себе достойный по своей сути.
Цитата (nihonjin)
А вы уже не помните? Не помните беседу про "Зимние алтари"?
Радует, что в голосованиях до них пока далеко…
А умную мысль по ссылке сюда вытащу:
Цитата (Yams)
И ещё _очень_ важный, на мой взгляд, момент: мы должны подбирать перевод названия таким образом, чтобы переведённое название (как и оригинал) было бы _достойным_ не только лишь как для уровня игры, но ещё и как для _настоящего_ пространства для жизни! Подумайте, вот вы сами хотели бы жить в месте, которое называется «Замёрзшие зеркала» или «Холодные края»? Это не самоназвание а какое-то прозвище! Вообще, нужно смотреть как бы в историю: алтари — это основа этого мира. Он строился вокруг них и благодаря им. А зеркальные установки появились позднее, ну уж точно не самыми первыми. И я считаю, что такой подход очень важен при переводе названий ВСЕХ уровней миров! Нужно относиться к игре как к чему-то более настоящему и живому, пытаться поставить себя на место самих жителей этих миров. Научиться смотреть на игру изнутри и чувствовать характер каждого народа таким, каким его создавали Insomniac Games. Тогда получим действительно классный и достойный перевод, в котором будет возможно полноценное погружение (как в оригинале)! Именно так — опосредованно, через погружение — и должна передаваться атмосфера игры, а не напрямую в названиях уровней — никакую атмосферу это не создаст. Просто будет название, по которому я быстро вспомню, что находится в этом уровне. Это не передача атмосферы, а упрощение, симплификация!
Отпостим на spyro3rus ?
Цитата (nihonjin)
Что-то я так отчаянно не хочу связываться с этим вКонтактом... И я там заметил у одного человека такие же мысли как у меня:
Лишь у одного…
Цитата (nihonjin)
Просто в первой части он вроде как больше всего говорит. Мол "Я наваляю Гнасти!" и всё такое.
Да-да, это я точно помню. А во второй Хантер какой-то трусоватый (если пираты не вкорень переврали).
Цитата (nihonjin)
Возможно, эти имена просто отсылки к каким-то значимым для Insomniac личностям. Ну, такие же как называния баллонистов у меня.
Оставляем как есть или будем копать значение имени?
Цитата (nihonjin)
В 『火を吹く者』 слово 吹く как раз и означает дуть, а не дышать:
И что в итоге?
Цитата (nihonjin)
А что для S2 не надо? А то у меня есть.
Надо!! Просто я решил не всё сразу наваливать…
Цитата (nihonjin)
Просто решили взять 2 на себя или нашли где они есть?
И что посылке? Где они?
Цитата (nihonjin)
Sunny Flight Sunny Sky Летнее небо
Почему «летнее», а не «солнечное»? Просто «солнце» у нас теперь свободно, а «лето» никак нет.
Цитата (nihonjin)
Горы скольжений Кристальное небо
Пересекает Crystal Islands и «горы»…
Цитата (nihonjin)
Зелёный сад Боевой сад Магический сад Прекрасный сад Сад снов
Вы точно уверены, что вам нужен «сад»? Если первый мир на сад и похож, то я помню другие были скорее как болота или пустыни…
Цитата (nihonjin)
Хех, ну там и перевод... а <Воровской, медвежий> это вообще как название для блатной песни!
А что? «A Duplicitous, Larcenous Ursine» я и сам перевёл как «Двуличный вороватый медвед» (вся строка «Why, you brassily avericious, duplicitous, larcenous ursine!» – «Да ну, бесстыжий отвратный двуличный вороватый медвед!») Забавно, что у пиратов тоже фигурирует «медвед» а не «медведь». Но у меня-то специально…
Цитата (alteya)
Наконец добралась до форума.
..уф, я же ещё в Тексте не отписался!
Цитата (alteya)
У меня тоже были мысли о том, чтобы проигнорировать этот «хоум» - может ну его, загромождать названия?
Да уж слишком явно они применено в оригинале! Ясно что это не «Домик у ручья» / «Дом в саду» / «Домик у озера» / «Дом на горе». Просто «домом» обозначены домашние миры.
Ещё, на что следует обратить внимание – «Sunrise Spring Worlds» (и все остальные) – будет что-то типа «Миры Рассветного Ручья»? Имея в виду, что в них можно попасть только из «Дома Рассветного Ручья». А то пираты открыли мне глаза на то, что названия домашних уровней могут и не совпадать с переводами названий четырёх миров в итоговом варианте.
Пока всё, о чём я подумал – взять множественное число. Типа «Дом Рассветного Ручья» и «Миры Рассветных Ручьёв», «Дом Полуденного Сада» и «Миры Полуденных Садов», «Дом Вечернего Озера» и «Миры Вечерних Озёр», «Дом Полночной Горы» и «Миры Полночных Гор» – Названия любые, но множественное число сделать таким?
У кого какие мысли?
Цитата (alteya)
И еще, я нашла интересное слово «купель».
Эффект, как от «Шпилей». Или словно «Колита» вместо Толстосума.
Цитата (alteya)
Да ну, это только с кучей «завумных словей» все кажется сложным, а на деле — все чисто на слух на интуитивном уровне. «ПТ-ПТ» само пришло.
В русском-то варианте это заметно, а вот в оригинале?
Цитата (alteya)
Кстати, родился еще вариант «Капитан Птах». Ну это так, до кучи...
Как-то немного пренебрежительно… Зато «Капитан Птах» звучит спокойно, а не как «Капитан Птыц», которого всё хочется произнести как «Капытан птыц»!
Цитата (alteya)
Ога, а затем перейдем на нумерологию — будем раскладывать имена персонажей на числа и искать Тайный Смысл.
Если с такой точки зрения подходить, то перевести вообще будет нельзя, поскольку передать (или хотя бы равноценно заменить) сразу все потенциальные отсылки просто невозможно. Это как прозаический перевод песни, где возле каждой строчки стоит сноска на весомый абзац текста, где объясняется, что на самом деле там имелось в виду.
Цитата (alteya)
Совы, скрещенные с черепахами — запросто.
Черепахами!? Это скорее мы все тут черепахи. (Или вы это и имели в виду?)
Цитата (alteya)
ВЕСЬ текст — нет, не нужен.
К сожалению, я нашёл способ его получения в один клик.
Цитата (alteya)
Кстати, мне очень понравился «Дом Солнечного Истока». Красиво.
А меня прикольнуло «Гавань Быстрая»!
Цитата (alteya)
Кстати, только что появилась мысль — если Cloud Spires — мир, где рождаются облака, может, назвать его «Колыбель облаков»? Или «Облачная колыбель»?
(Из предложенного – второе по концепции)
А так если вспомнить процесс пробуждения тучки под музыку – да, это колыбель! Но в ней куда больше отсебятины, чем в «замках».
Цитата (alteya)
И еще, мне очень нравится, как сейчас сделано — наша свежая запись закрепляется в шапке Спайро Клуба — на самом видном месте.
А как они это сделали? А мы можем так что-нибудь закрепить? А голосование по Хантеру мы сможем (потом!) перепостить себе?
Цитата (alteya)
Но все равно, мне мой вариант больше нравится, он больше похож на Sunny, да и двойное «л» в обоих словах (СоЛЛе ВиЛЛа) придает ему гармоничности.
Да! Меня он устраивает даже не зная «что такое солле» – потому что и «вилла» не особо ассоциируется с чем-нибудь, так что заходи в уровень (он несомненно будет первым практически у всех игроков!) и видим Рим – так сто «Солле Вилла» и может якобы переводится как «солнечная деревушка». Тогда надо и с «Бамбуковой Террасой» что-то китайское выдумать…
Цитата (alteya)
Это почему? У французов, итальянцев и испанцев, если так глянуть, вроде похоже на «Какое-то что-то». А немцы... ну да, они любят сливать несколько слов в одно, такая уж у них особенность.
Ну да, похоже что соблюдается… Просто иногда вместо двух слов (и не только в немецком) стоит лишь одно, но подозрительно длинное…
Цитата (alteya)
Мне очень нравится вариант Егора про Гнусного Гнорка. Можно, кстати, сделать с точностью до наоборот. «Правильным» именем злодея будет «Нусный Норк» - а Спайро сотоварищи будут величать его Гнусным Гнорком.
!!
…я-то почему об этом не подумал?
Цитата (alteya)
У меня есть вариант «Жмерзкий Жморк»
Ну это ва-ащееееее…
Цитата (alteya)
Ну и буква «g» не так уж далека от «ж», иногда ее так и произносят.
Из-за дефекта речи у меня получается выговорить только «Шмерский Шморк»…
Цитата (alteya)
Кратер.
Пираты так капитанят иногда, что оставляют только одно существительное! Знаете, мне кажется, что его можно просто так исключить как «мусор», а не потому что он пиратский. Ну блин, просто «Кратер»… Хуже может быть просто «Жаркий»!
Серьёзно, исключите «кратер», а с ним и все последующие одиночные существительные
Цитата (alteya)
Может, кто еще что-нибудь добавит, а? Мне вот например хочется что-нибудь со словом «Пекло», но не знаю, как лучше его дополнить. Пекло Вулкана? Пекло Кратера?
Плохо, существительное.
Тогда «Вулканическое пекло», чтобы соблюдать концепцию. (Хоть и длинно, но звучит так «титанически»!)
Есть идея для Капитана Птыца/Птаха, в стиле 4 х «получить по Заслугам» или вставки пяти нот во встречу в Агентом:
Коли уж он «капитан», может разок применим это слово в саркастическом значении? Не знаю где (может с феей и разговором про «его пунктуальность», она там неплохо стебается над ним), но нужно, чтобы он словно произнёс что-то очевидное, а ему ответили «Капитан!». Или же, чтобы он сказал что-то очевидное, добавив ремарку в стиле «я же неспроста Капитан!» или закончив фразу выражением «ваш кэп» (это можно даже написать на табличке).
Цитата (alteya)
Может, кто еще что-нибудь добавит, а? Мне вот например хочется что-нибудь со словом «Пекло», но не знаю, как лучше его дополнить. Пекло Вулкана? Пекло Кратера?
Цитата (DrWho)
Надо тогда хотя бы один опрос сделать без выбора ответа (и с учетом пиратских вариантов). Пусть народ выбирает и объясняет свой выбор, а не тыкает в первый попавшийся вариант ответа и забывает про опрос.
Нет! Во-первых, мы уже решили делать сначала обсуждения (и не потому что специально хотим «опрос без вариантов», а лишь потому что этих самых вариантов у нас почти нет), а во-вторых, люди не тыкают в «первый попавшийся»! Высокие Горы же проиграли.
Цитата (DrWho)
Здесь советую не слушать Алексея и сделать как мы писали.
На моей стороне (в плене отношения к тому, что такое «перевод») не только она сама, но и Yams + nihonjin.
Цитата (DrWho)
это лучше, чем наблюдать, что в опросе побеждает пиратский вариант и из-за этого портится вообще весь опрос.
Вы запарили, если вам не нужен «опрос» – забудьте о нём!
Я же хочу видеть мнение ЦУ в цифрах и делать соответствующие выводы.
Цитата (DrWho)
Тем самым, мы увидим, что варианты выбирают действительно по такой-то причине.
У нас и так в голосованиях меньше 2% участников отвечают, а вы хотите сократить их количество до пары десятков человек?
Цитата (alteya)
Просто проблема голосований в том, что если мы не будем выбирать победивший вариант, это будет "нечестно". Мол, "а зачем вообще тогда нас спрашивали, раз вам все равно?".
Это произойдёт ПОТОМ, а результаты нам нужны СЕЙЧАС. Всех примерить всё равно не получится, из-за этого начинаются мировые войны – когда люди не находят одного ответа, который всех устроит.
Смотрите: мы утвердим НАШИ варианты. Кто будет недоволен? Все те, кто голосовали за пиратские. Много народу? Да, не мало. Нет, я пошутил: мы утвердили ВЫБРАННЫЕ пиратские варианты. Кто теперь недоволен? Все те, кто думают головой и поистине ценят игру. А много ли народу? Неважно. Важно то, что к ним следует прислушиваться куда тщательнее, чем ко всем те, кому на игру плевать.
Цитата (alteya)
Э-эм... Может, Жародуй? )
Жародуй жарит Жмерзкого Жморка!
Перевести «Спайро» как «Жародуй»? Слишком комично. Можно потом засунуть в нашу Платиновую пародию – это с радостью. Но на полном серьёзе…
Цитата (alteya)
А потом считаем, какой вариант сколько раз упоминается и смотрим на аргументы.
Вместо или вместе с голосованием?
Цитата (DrWho)
Вообще, в голосовании главная мысль мне понравилась: "если хотите, чтобы у варианта выбранного было больше шансов выиграть, в комментах объясняете свой выбранный ответ". Но т.к. голосования не будет, а будет только опрос, тыкнуть в первый попавшийся ответ не выйдет, и людям придется отписываться какой вариант выбрать. их голос можно учесть к опросу-обсуждению, однако если нет обоснования - никаких бонусов ему не будет (то есть этот голос в обоснованиях не учитывается и тем самым вариант теряет шансы на победу). То есть, можно сделать тут два этапа: народ отписывается о выбранном варианте и по этим данным делаем подсчет голосов без учета того, было написано обоснование или нет. И это - пре-этап. И финальный после пре: подсчет обоснований. На основе этого подсчитываем аргументы, смотрим и делаем вывод что взять в перевод.
Э-хе-хей, помните наш последний «конкурс»? Где Юги просила описывать аргументы, я жаждал страстных баталий, а вообще-то все хотели посчитать голоса, но «просто так» написать нельзя – ругалось АМС, а крупных рецензий не было, ибо «драться» хотел лишь я один.
Короче, ничего у вас не выйдет. Такой как Yams зайдёт и всё ТАК распишет по полочкам, что уже и голосование не понадобиться. Не зайдёт? Тогда несколько (по пальцем посчитаешь) обычных пользователей просто отпишут вам, какие варианты считают неплохими и почему. А как быть с «массой»? Я вам гарантирую, что они вам вообще ничего не напишут! Они даже не станут ничего читать. Это «планктон социальных сетей» – если они хотя бы тыкнут в голосование, это уже чудо. А первые два типа людей, которых я описал, распишут вам варианты даже тогда, когда открыто голосование. Они ничего не изменит!
Вы думаете, что во втором случае обоснований будет больше чем в первом?
Зачем тогда предварительное обсуждение? Чтобы не тупить с вариантами ответов для голосований. Людей наоборот можно попросить пока НЕ обосновывать свои и не критиковать чужие варианты, а выждать открытия официального голосования. В противном случае обязательны ссылки: из голосования в обсуждение и обратно (не с комментов, а из шапки. Её же можно редактировать?)
Психологией пахнет, аж противно… (хоть бы это не репостили в Клуб)
Цитата (alteya)
FEPATCKNJ FEPEB0D
Неплохо!
Ещё идея из того же списка:
Давайте в тексте пирата из Lost Fleet скажем, указывая на останки разбитых кораблей, что кислотное озеро – это кладбище всех русских пиратов, которые переводили игру до нас?
Если что, можно найти «несуществующую» фразу в ресурсах игры, и направить её на текст – в игре он никогда не появится без читерства.
Цитата (DrWho)
Это надо написать 20ым шрифтом, красным цветом, да еще и жирным. Вот тогда, может быть, все заметят. И то, часть все равно не будет читать.
Отвалите от людей. (Подошла бы фраза Жириновского: «Хватить учить друг друга как нужно задавать вопросы! Мы будем задавать вопросы как МЫ хотим, а они пусть отвечают как ОНИ хотят. А потом посмотрим…»)
Цитата (alteya)
Думаю, наиболее активные прочтут.
«Наиболее адекватные» и без подсказок это знают.
Цитата (alteya)
И я надеюсь, это частично снимет вопрос "а в чем смысл голосований?" как некоторые спрашивали.
Ну скажите уже людям правду: «Голосования – маркетинговый ход. Они ни на что не влияют, а просто привлекают людей». Это как цитата из фильма 'Ночь в музее': «– А что делает эта пластина? / – О, благодаря ей каждую ночь мы все оживаем! / – Нет ну правда, зачем она? / – Да ни зачем, это просто украшение… / – Я так и думала.»
Цитата (alteya)
Надо попробовать чисто с обсуждением и комментами один-два мира сделать и посмотреть, что будет.
Не надо! По крайней мере, не на «Кратер Молтен» – хочу чтоб все убедились, что он проиграет.
Текстовое в принципе, можно. Но в каком-то особом случае. Например для боссов. Вариантов там будет крайне мало. А если текстом – стоит рассмотреть как перевод/неперевод «Buzz, Scorch, Spike» и все синонимы/значения «Dungeon, Arena, Pit». Тут даже голосование не нужно, нам бы лишь раз услышать правильный перевод…
Цитата (alteya)
Меня всегда смущало, что в названии выдуманного игрового мира используется топоним реально существующего горного хребта – Альпы.
…Знаете, что вы сейчас сделали? Моё-то ладно и чёрт с пиратским, но вы разнесли даже мнение Спайропедии!
Цитата (alteya)
"alp" - это вовсе никакие не Альпы, а: высокая гора, летнее горное пастбище, горная вершина, альпийские луга. Ну и все встало на свои места. Так что переводить это как «Альпы Шейлы» никак нельзя — надо подобрать русское слово.
ДА!!!
Цитата (alteya)
По идее, самым подходящим будет именно луга/пастбища — мир на удивление зеленый, даже цветы прорисованы, чего я нигде больше не помню. Да и где еще козлам-то быть, кроме как на пастбище?
Верно – козлы, козлы-то! А лоси! Правда луга «немецкие» получаются…
Цитата (alteya)
Горные луга Шейлы? Правда здесь аж три слова...
Три нельзя. А хотя… «Горные луга Шейлы», «База капитана Птыца», «??? ??? Бентли» (я не знаю как это перевести *молчу*) «Лаборатория девятого Агента» (да вы ж меня заразили!!! Почему «Агент9» мы должны переводить и произносить как «АгентДевять»? Может сделаем его «Девятым агентом»? Или того круче: «Агент 009», однако ведь ссылка на Бонда уже сидит в капитане Джеймсе…)
Если везде в мирах «питомцев» соблюдать три слова (несмотря, к чему относится среднее – у 1 и 3 будет к первому, а у 2 и 4 – к третьему), то «Горные луга»-то и подойдут окончательно! Но снова эти «горы»… Можно ли как-то заменить горы?
Цитата (ShellyPes)
А что вы имеете против Охотника? Обосновывайте!
Ладно. Мыслей у меня много, все даже не вспомню.
«Hunter». Это слово нельзя перевести в лоб, не зная объект, к которому оно относится (вообще-то так ничего нельзя переводить…) В русском значении «Охотник» показывает совсем не ту сторону «Hunter», на которую наводит английское слово. Образ охотника – человек с двустволкой с лесу, вынюхивающий след своей жертвы, с набором первой необходимости и коробочком запасных патронов в кармане. Лесник – мудрый и внимательный охранник леса, борец за природу и мастер по выживанию. Ловец – ловкач, умелец, ему всё легко даётся, он живёт на полную катушку.
А вот Хантер – это нечто другое, это образ жизни. Это как «ковбой». Кто такой «cowboy»? Это «пастух»! Но покажите мне хоть одного ковбоя, которого можно назвать простым пастухом?
Или даже наша «Sorceress». Да она ВЕДЬМА !! Но на беду, в русском языке слово «Ведьма» и её образ совершенно не сочетаются с тем современным значением «ведьмы», которое можно видеть например в американских фильмах (да хоть те же «Зачарованные»). У них ведьма даже не обязательно должна быть злая. Русский стереотип ведьмы уже давно не вяжется с тем, что зовётся ведьмой в современной культуре. Например ведьма даже не обязательно должна владеть колдовством – ведьмой можно назвать неприятную женщину, которая вселяет страх и отвращение. «Колдунья» может быть как доброй, так и злой. Причём в сравнении с ведьмой – колдуньи по большей части добрые. «Чародейка» – обычно тоже хорошая, редко где бывает плохая. Наиболее добрый вариант – «Волшебница». Они тоже бывают злыми, но как стереотип, волшебницы хорошие по умолчанию. А ведьмы по умолчанию плохие.
В слове «sorceress» есть какая-то власть и сила. «Колдунья», как мне кажется, всегда мыслит мудро (без разницы, злая или добрая). А «ведьма» делает то, что взбредёт ей в голову, и плевать она на всё хотела.
«lair» – берлога или логово. Для ведьмы-то подходит, а вот колдунья обитала бы скорее во дворце или в башне.
Возвращаясь к нашему Хантеру можно заметить, что он ни на кого не охотится. Он всегда полагается на свою силу и ловкость, он уверен в победе. Он любит спорить и состязаться, сражаться с врагами и всегда готов к битвам да приключениям. Он спортсмен, изобретатель новых игр, первоиспытатель технических средств передвижения и он знает толк в своём деле! Хантер считает, что он лучший, и всегда пытается это доказать, частенько попадая в неприятности. Он способен радоваться даже за Спайро, если тот где-то обошёл его, хотя моментов подколоть друга он никогда не упускает.
Спайро, например, не такой. Он считает, что всесильный и непобедимый, готов громить врагов каждый день без разбора. Он также не может отказать, если его попросят о помощи, и мне вообще кажется, что если бы кто-то плохой попросил его помочь в грязных делах, то он бы и врагу не отказал… дракончик вообще не фильтрует выбор свой/чужой, а просто считает «друзьями» тех, кто просит о помощи, а «врагами» всех тех, на кого его подстрекают.
А «Hunter» – никак не «Охотник». Ему больше бы подошёл «Ловец»…
У кого-то есть мнение, что это не имя, а прозвище или род деятельности? Имя, фамилия, кликуха – если вы не эпопею создаёте, а средненький рассказ – то пояснять «что есть имя героя» излишне. Потому что есть принцип: если о чём-то не было сказано, то это не значит, что этого нет.
Мы не знаем, «Hunter» – это имя или профессия. Это не важно. У него могло быть имя «Чешир», но сам он однажды посчитал, что «Hunter» ему подходит лучше. Если же такое – имя одно, а «друзья зовут меня – …»
Но «Hunter» – может быть и настоящим именем. Ну представьте, рождается маленький гепард, который постоянно норовит куда-то убежать, что-то исследовать, подраться или выдумать игру? Его и назвали «Hunter» (потому что хантер это не охотник, а хантер! Как ковбой…)
Помнится, в списке был Профессор? О, ну да, «Professor» – это не имя. Он реально профессор. Тогда почему мы не слышали его имени? Если мы его не слышали, это не значит что его нет. У него есть имя! Но все знакомые обращаются к нему «Профессор …», потом друзья сократили просто до «Профессор». Ну это как «Док» сокращение от «Доктор». Или к Бёрду могут обращаться «Капитан». Или «Джеймс» – то что его зовут Джеймс и он капитан (сержант, не суть…) не значит же, что у него нет фамилии, она же есть!
Неплохое сравнение: Холмс – «Ватсон, а почему у Вас такое странное имя: "Доктор"?»
Взломать можно, но уже смысла нет, ибо выпилена эта самая проверка со всеми последствиями и теперь платиновая версия проходима, хоть конвертируй в ISO или в MDF/MDS.
Неужели!? Что ж, я этого не знал. Сам Yams просил меня когда-нибудь её взломать…
Цитата (DrWho)
Зоя, которая говорит, что у тебя неправильно-хакнутая версия?
Да, система защиты отключена, но не удалена из GH, поэтому её можно заставить включится, причём для этого не нужно воздействие извне – достаточно загрузить игру с особой сохранёнки с карты памяти через игровое меню. В чём «особенность» сохранёнки я пока не выяснил, но у меня таковая есть, и глюков она плодит сразу массу, исключая лишь псевдоуровни четвёртого мира, вечнозелёного Спаркса и главный вылет на Колдунье. Зойка + нелепый Толстосум продающий несуществующих животных + пустые таблички на порталах присутствуют!
Цитата (DrWho)
А в котором можно шрифт извлечь и вставить в GH? Я хочу просто потестировать этот момент в атласе, меню пауза? субтитрах и катсценах.
Не путайте игровой шрифт и шрифт в атласе. Второй пока не взломан, и лично я его не исследовал и в глаза через PVV не видал…
Цитата (DrWho)
И чем, я пробовал тайловым (как-то там) штукой сделать - но там даже эксешника нет - а расписанный метод я не понял совсем.
Хм… А на кой он ужал его через UPX !? Типа чтоб никто не докопался до самих изменений?
Цитата (steeldragon)
Могу выложить остальное, если надо.
Хе-хе, нет уж, это я выложу остальное.
Итак, вначале я решил сэмулировать фикс и посмотреть, реально ли он работает. Да! Тогда я сдампил память и восстановил из него несжатый EXE. Поскольку тот забит мусором, я сравнивал его с оригинальным и подчистил структуру. Даже заголовок оставил: http://klimaleksus2.ucoz.ru/Files/REPEAT/lib_01.png
Я потестил и оказалось, что даже без этих изменений защита не активируется. Тогда я срезал и копирайт из заголовка, и вот эту ерунду в конце. Осталось всего 24 различных байта…
На самом деле это шифровка! На скриншоте показан алгоритм, который её расшифровывает. Видите огромные синие цифры выше строки «80067b3c»? Это не код, это полный бред. Код начинается ниже, и в нём:
В «t0» загружается указатель на начало (точку входа) шифрованной функции. В «v0» загружается ключ для шифрования. В «v1» загружается некое число, служащее вторым ключом. В «t6» загружается адрес, с которого нужно расшифровывать. В «t7» заносится размер шифрованной области в квартетах (размер в байтах делённый на 4).
Далее (выделено красным слева) начинается процедура расшифровки: В «t2» считывается квартет по «t6». Из «t7» вычитается единица. «t2» ксорится с ключом «v0» (t2=t2 xor v0) «t2» сохраняется по «t6». К «t6» прибавляется четыре (один квартет). (Далее две строки меняются местами из-за запоздалого прыжка) «v0» приравнивается разности «v1» и «v0» (v0=v1-v0), то есть изменяется сам ключ, вычитаясь из неизменного вторичного ключа. Если «t7» не равно нулю, то процедура расшифровки повторяется. Иначе происходит прыжок в «t0».
Чтобы увидеть, что на самом деле скрывается в шифрованной функции и что там изменил brill, мне пришлось дословно повторить процедуру расшифровки функции:
offset:=$5802C; count:=$C4;
key:=$0C636362; value:=$682C06DF;
stream.Seek(offset,soFromBeginning); save.Seek(offset,soFromBeginning); Inc(count,offset); while(offset<count) do begin stream.Read(buf,4); buf:=buf xor key; save.Write(buf,4); Inc(offset,1); key:=value-key; end;
…Знаете, это самый красивый ассемблер, который я видел.
Что делается в самом верху не так важно. Видите выделенную строку? Это прыжок обратно в функцию расшифровки!! Перед ним лишь меняется значение «t0» – прыжка выхода.
Другими словами, после расшифровки кода система прыгает в только что раскодированную функцию, исполняет её, потом выбирает дальнейший адрес выхода (а это регистр «ra», скорее всего в нём значение PC, которое было перед первым прыжком, как если бы вместо «jr t0» было «jr ra») и ещё раз исполняет функцию расшифровки! Которая теперь, естественно, закодирует секретную функцию обратно. И как будто ничего не было!
…Это просто гениально. Секретная функция невидима, не дизассемблируема, и даже если вы сдампите память игры в любой момент – вы её всё равно не найдёте и не дизассемблируете. Потому что она расшифровывается, выполняется и тут же зашифровывается обратно…
Три прыжка после выделенной строки. Все ведут на нижнюю сроку с меткой. Все три ветки перепрыгивают через такой код: Считать один байт в «a0» по адресу «a1». Загрузить в верхнюю часть «a2» константу «1f00». Сложить «a2» с «a0» (хоть там и «or», это просто сложение).
Прыжков нет! «a0» всегда загружается из «a1», но и эту строчку можно было удалить, ибо значение «a0» просто игнорируется – он явно прописал в «a2» не просто «1f000000 + xxxx», а константу «1f00dd11». Видимо в ней и кроется результат проверки диска libCrypt, и это число обозначает что диск лицензионный.
Другой же вопрос, как он к этому пришёл и как выудил это значение… А что сам код – так его можно было переписать тысячью способов, например не удалять прыжки, а просто направить их ближе или вообще загружать магическую константу ниже по коду.
В самих прыжках сравниваются некоторые биты в нескольких регистрах, определённые должны быть единичными, другие нулевыми. Без тотального изучения этой функции, а также всех, что вызывает она и вызывают её, я не могу сказать ничего больше, и главное – как же именно работает LibCrypt.
Она вызывает некую процедуру «60698» подряд несколько раз с разными аргументами. Причём возврат из неё происходит не через «ra» (возможно чтобы не использовать стек вовсе), а явно через другой регистр, обозначающий точку входа в продолжение этой же функции (выделен красным).
Ну почему я никак не могу найти справку по всем ключевым словам дизассемблера!? Я же вообще не в курсе, что дает «mtc0 a1, EntryLo1» или «mfc0 a0,Count» – я даже не соображу, это присваивание регистров или их выгрузка …
Ну всё, анализ закончен. Не дало пока ничего практического, то есть я ещё не смогу сходу взломать LibCrypt любой другой игры… Единственное, что я пока понял – надо всегда искать подозрительный XOR !
Там в «SCES_028.35\» : «Original» – оригинальный файл; «Brill» – тот, который вы мне дали (был ужат через UPX); «Decoded» – он же, но уже распакованный и подогнанный под оригинал, но ещё с копирайтом хакера и непонятной модификацией в конце. «Clean» – оригинальный файл, в который встроены только нужные изменения 24 байт шифрованной функции. Именно это главное – его надо прожигать! «Original_xor» – оригинальный файл с расшифрованной функцией (для исследований, прожигать бесполезно!) «Clean_xor» – изменённый файл с расшифрованной функцией.
В папке «xor\» есть программа «platinum.exe» – перетащите на неё оригинальный или изменённый (но не ужатый UPX !) файл, и получите вместо него версию с расшифрованной функцией (*_xor). Перетащите ещё раз, и она закодирует её обратно. Все параметры (ключи, смещения и алгоритм) я захардкорил, так что ни для чего другого её использовать не получится, но зато рядом есть исходный код!
Там всё, инструкция внутри. Quick&Smart патчеры + возможность патчить только SCES. Сделано для конечного юзера, полученный образ можно без ошибок эмулировать на виртуальных дисководах или даже прожечь на PlayStation!
*только ответы без рецензий на переводы исключая сценки*
Цитата (DrWho)
Если бы актеры участвовали в этом - 56 ОЯВЫ (ШАРЫ) не было бы. Это единственная мелочь, которую Вектор не смогли перевели.
Непохоже, что они её не смогли перевести – скорее не смогли закодировать и корректно внедрить в игру. Ну уж наверное это делали не актёры!
Цитата (DrWho)
так и есть, только не с проста же встречаются переводы с синхронизированной озвучкой и текстом.
Всё зависит то ли от того, у кого какая совесть, то ли от того, кому и сколько заплатят…
Цитата (DrWho)
В переводах.
Если текста много, а времени мало – нет возможности досконально перепроверить всё.
Цитата (DrWho)
Причина простая: актеру может не понравиться его переведенный кусок, он обратится сюда и опять же как вариант, никто не договорится как переводить, потому что каждая сторона будет аргументировать как переводить этот самый кусок так или иначе.
Вы хотите сказать, что актёр отвергнет вариант переводчиков и согласится только на собственный перевод!? Но мы же всегда сможем уступить и поменять текст, подогнав его под озвучку. Либо же поменяем актёра – мы-то главнее, мы решаем, мы взламываем, мы выпустим перевод. Не будет же обиженный актёр воровать у нас ВСЁ, чтобы самому состряпать угодный себе образ игры?
О-хо, я представляю, какие титанические будут споры о переводе имён всех персонажей MLP:FiM ! И даже не важно, у кого какие аргументы – это будет битва стенка на стенку, которая ни при каких условиях не сможет завершиться так, чтобы не отколоть тучу фанатов, которым затея не понравится, и которые сделают всё чтобы помешать переводчикам.
Примирять их бесполезно, только время уйдёт. Поэтому в ихнем случае я бы сразу предложил делать ДВА перевода – с теми, кто хочет переводить имена, и с теми, кто признаёт лишь транслит (это как в волейболе, когда половина игроков предпочитают командную игру с набросами и пасами, а остальные приучены играть только сами за себя и ни кому не отдавать мяч – решение элементарное: вот и поделитесь на две команды да играйте против вдруг друга во имя своего стиля!)
Потому что львиная доля текстов не повязана на именах, и вот её-то и нужно переводить общими силами. И даже актёры смогут озвучить дважды те фразы, где употребляются имена!
И выпустить две фанатские озвучки, различающиеся переводами имён и шутками, на них основывающимися.
Цитата (DrWho)
Потому и нужно утвердить весь переведенный текст не только с обычным народом, но и с актерами, что будут озвучивать.
Вы что думаете, раз у нас постоянные актёрские правки, то мы с ними не договоримся? Правки у нас чисто из-за того, что текст НАМИ был фигово переведён…
Цитата (DrWho)
Всю пройдет, а потом решит узнать откуда же эта "Огара" появилась.
А её «по лицу» узнать никак нельзя?
Цитата (DrWho)
"а зачем имя Спайро переводить? Идете по стопам 1С?".
Так вы же сами хвалите этих бухгалтеров (почище ваших любимых математиков), за то что они «официальные»?
Цитата (DrWho)
Никто никого заставлять отписываться не будет.
«Заставлять» было в кавычках, но мне лень расписывать, что же это означает…
Цитата (steeldragon)
Ну, думаю, Google Code с его API всё же не потянет. А вот разместить на каком-нибудь отдельном сайте... В теории, как я уже говорил, возможно усё. Через POST и GET, да. Авторизацию, думаю, тоже возможно сделать. Другое дело, что сам я в этом не так хорошо разбираюсь... Но на крайний случай есть тот же гугл и википедия.
Насчёт Ucoz я вам скажу, что я своими силами взломал «мини-чат» и сделал так, чтобы его прочитать можно было только зная определённый пароль. Это сложней чем кажется, попробуйте открыть хоть наш же http://www.spyro-realms.com/mchat , а потом пересмотрите список шаблонов на него: http://klimaleksus2.ucoz.ru/Files/2/mchat.png , учитывая что «$USER_ID$ (если гость – то 0)» – это не тот, кто читает чат, а тот, кто написал сообщение! И как сделать секретный приватный чат? А я сделал. Давно, но до сих пор руки не дошли опубликовать код…
Опыт такой – если что-то очень хочется, то и Ucoz можно заставить это сделать, но сил уйдёт больше, чем согласитесь отдать.
Что нам придумал я – база данных в виде БОЛЬШОЙ таблицы html, формат хранения – XML, сейчас хочу частично перевести в JSON, ибо весь игровой текст браузеру парсить невероятно долго… Справки пока нет (и комментариев в коде тоже), потому что база ещё не работает так быстро, как мне требуется. Сначала она висла при каждом изменении, но я смекнул, что при добавлении не нужно перерисовывать всю таблицу, достаточно лишь вставлять новые строки. Полная перерисовка происходила только при удалении. Но я понял, что и удалять можно только нужные строки, так что во время работы она не перерисовывается. Но зато при первом парсинге, открытии или undo-отмене браузер просто встаёт. Я ещё поработаю над оптимизацией, но мне-таки кажется, что хранить в этой базе все виды и варианты всех переводов всех уровней всех миров – идиотизм. Можно хотя бы по базе на уровень ну или на мир…
Потестить можно хоть сейчас: http://spyro3-rus.googlecode.com/svn/trunk/levels/aleksusklim/base.htm Данные только загружаются с сервера, изменения фиксируются лишь локально на компьютере (сохранение на сервер планируется только как простое копирования XML кода базы в нужный документ через SVN или веб-интерфейс Google Code)
Текущая база – лишь SunriseSpring, чей это перевод толком не знаю (но мне он не нравится). Введите «gh.txt» в верхнее поле и нажмите Enter, чтобы увидеть всю мощь сотни килобайт текстов (и это без перевода!). Браузер отвиснет примерно через минуту…
Так что? Дело только за оптимизацией? Или прахом вся затея?
Цитата (steeldragon)
Колёсиком не пробовал, да и не переглючивает у меня так. При открытии в новой вкладке работает.
А я вообще никогда по ссылкам левой кнопкой мышки не нажимаю (если они не через javescript обрабатываются). Обычно колёсиком по ссылке а потом по своей вкладке, чтобы закрыть её. Просто если документ грузится в новую страницу, то там гораздо легче понять, загрузился он или нет: при сбое загрузки в текущей браузер может и оставить то, что было до этого. Ненавижу Хром!!! Он тупица – при нажатии колёсиком грузит документ в новую вкладку, НО при этом не показывает адрес в адресной строке! Там пустота, но если загрузится, то покажет. И чёрт бы с ним, но если НЕ загрузится, то адрес он забудет!! Придурок… Я так иногда по несколько десятков ссылок колёсиком кликаю, и естественно, что больше половины оборвутся, но я же потом просто обновлю эти страницы. Так в Опере. А в Хроме фиг я чё обновлю, он адрес сбрасывает… (и поди потом разбери, какие именно это были страницы)
Цитата (Segoga)
А где нормальная табличка с названиями уровней, которые уже перевели/не переводили??? А если кто взял в работу - то сбоку названия уровня можно ник взявшего прописать.. ники и названия кликабельны ..
Здравствуйте. У нас сплошной бардак!
И нет понятия «взял в работу» – это не перевод комикса. Перевёл уровень – выложил. Можно не опасаться, что одновременно его переведёт кто-то ещё – у нас почти никто ничего не переводит…
Цитата (nihonjin)
Только там не отмечено, что для Sunny Villа есть ещё и версия перевода от alteya.
…При последнем редактировании я его как-то криво поставил. Зато я убрал все «?» после имён! Как считаете, может значки @/$/¶ серым цветом написать? А то уж больно в тексте ориентироваться мешают… (а «#» не надо, она показывает псевдо-буквы, хотя это уже не столько актуально)
Ещё я удалил осудил Numeration. По ссылке доступен, с обычного списка страниц – нет.
Цитата (nihonjin)
В частности, если редактурой, то есть некоторые примечания по ней:
Это такой убогий чеклист, аж стыдно показывать…
Цитата (nihonjin)
Я бы рад, да aleksusklim мне всё никак не ответит, хотя бы о том, какую версию переводить будем.
Япона ж версия! Её ведь ещё не переводили? (Я разве это не упоминал?) Мы переводим именно GH, потому что до нас она не переводилась. То же первой японской частью. И естественно, что вторая японская часть тоже не переводилась! Вот и возьмёмся.
Цитата (nihonjin)
По объёму работ она почти как эта, которая в процессе уже не первый год...
Ну для второй по большей части будет текст а не взлом. Надеюсь…
Цитата (nihonjin)
Это каких двух? 2 и... 1? У меня что, тоже всё так плохо?
А вы думаете, что справитесь в одиночку? Реально конечно, но у вас там бардак не слабее нашего…
Цитата (alteya)
Сначала я и не думала подключаться к процессу, просто читала из любопытства.
Lurk more! Эх, каждый так…
Цитата (alteya)
А может мы даже на этих основных вопросах застопоримся.
Какова оценка продвижению процесса?
Цитата (alteya)
А можно узнать, в чем заключаются плоды той переписки? Если не секрет...
Ну… он предложил создать отдельную группу ВК «Переводы Spyro», чтобы использовать её во всех наших проектах в качестве большой площадки для голосований. И не только по переводам, но и по актёрским пробам! А репостить как на Спайро Клуб, так и на другие группы по Спайро, включая нашу от форума (но я её даже не видел…), чтобы один опрос набирал голоса из различных мест. Он сказал, что кроме стены и обсуждений есть ещё вики-страницы. А где? Старые голосования впоследствии можно повторно репостить на Спайро Клуб, чтобы получить новые голоса, ибо по его словам, активность голосующих не продолжается более 5-7 дней. Также нужно создать страницу, где будут обновляющиеся ссылки на все голосования, а её можно закрепить в списке обсуждений Спайро Клуба, чтобы ссылки не терялись. К голосованиям по актёрским пробам нужно прикреплять как сами пробы, так и оригиналы и даже скриншоты озвучиваемого персонажа. Доступно лишь десять вложений (первое из которых само голосование), но по мне – так всё можно просто поместить ссылками в тексте. Проводить голосования как тыкалки здесь на форуме мы передумали, ввиду большого их числа – а вКонтакт будет для этого идеальным местом! Также он предложил назначить администраторами новой группы несколько людей, которые по его словам, смогут приносить нам большую пользу и никого не оставят без дела.
Ещё разговор был об озвучивании, и Yams отказался принимать в нём участие – он хочет подойти к этому ответственно и не желает нас тормозить, а также считает, что его всё равно голос не подошёл бы ни одному персонажу.
А вы еще верите в его возвращение? А хоть кому-нибудь известно, куда он пропал?
Он всегда возвращался. Его отсутствия становятся всё чаще и дольше, но он возвращается!
Цитата (alteya)
Так стоит ли его ждать?
Нет, но я буду не стоит – он сам сказал. А не отвечает он потому, что не уверен сможет ли продолжить диалог вовремя.
Цитата (alteya)
А вот когда начнешь спрашивать у людей, а чего же они хотят, то тут начнется: тому одно нужно, этому другое подавай — кто во что горазд. А если б был безальтернативный вариант, то этих разноголосиц не было бы, а народ не сильно бы парился по этому поводу.
Моя цель – сделать перевод, который понравится фанатам. «Нравиться фанатам» каким-либо другим способом, кроме как изготовлением перевода, я не планировал. И мне плевать что они скажут на готовый перевод, если он будет объективно ЛУШИЙ – моя совесть чиста!
И ответственность мы возьмём на себя. Мы не ответим «ну это вы так выбрали» на претензию о том, что у нас где-то нехороший перевод! Переводим МЫ, учитывая ИХ мнение. Но переводим-то мы, а не они.
Цитата (alteya)
Вот западет кому-то один определенный вариант (курочки, хантеры-охотники, не важно) — а все остальное по его мнению уже будет «не то». Ну и выше я уже написала о том, что если бы ему без всех этих вопросов-расспросов дали готовый проработанный продукт, то его бы это не сильно волновало.
Вродь, пираты так делали. Но фанатский (а не пиратский) перевод должны делать именно фанаты – прямо или опосредовано.
Можно было бы и вообще ничего ни у кого не спрашивать, а на пару или в одиночку перевести – но это не было бы ЛУЧШИМ переводом в любом случае.
Мы должны спросить. А так нам скажут «вы даже нас не спросили!» А эдак – мы спросим. А если откажем – то откажем обоснованно, а не просто потому что «не спросили».
А как с Каруселью было? Толпы разъярённых фанатов честно и исподтишка, миролюбиво и грозно, спокойно и бешено пытались донести до «психологов, методистов и переводчиков» (а это был, походу, какой-то студент в одном лице), что те просто испортили мультисериал своей бездарной озвучкой (претензий было больше к переводчикам, нежели к актёрам – при таком тексте несовпадения интонации кажутся цветочками…) – просили администрацию организовать прямую связь, чтобы это не была глухая односторонняя критика. Но в итоге критика осталась глухой и односторонней, но якобы доносилась до вышеописанных лиц.
Причём знаете, фанаты конечно были правы, но не более, чем на 80%. Так что если бы переводчики вышли с ними в контакт и ответили, почему того или иного по их мнению не должно быть в тексте, то фанатов они бы во многом победили. А сейчас всё выглядит, словно фанаты полностью правы, хотя это не так. Потому что переводчики с ними не советовались, а если бы советовались, то плюс сразу всем – реплики бы стали качественнее, а фанаты бы наконец умерили пыл, ибо им бы объяснили ошибки их точки зрения.
Что до меня – повторюсь, что особой ненависти к переводчикам Карусели не имею. Ляпы были, но были и отлично переведённые участки. Фанатские критики, почему-то, подсчитывают только ошибки. А я бы смог больше половины ошибок покрыть достоинствами!
Так что если вы считаете, что наши фанаты потом _вдруг_ припомнят нам, что где-то мы не учли их мнение, то почему они бы не смогли нам припомнить, не устраивай мы голосования, что мы их мнения вообще не спрашивали?
Цитата (alteya)
Проблема в том, что не все представители хомо сапиенсов в своих суждениях и предпочтениях исходят из логической аргументации и обоснований. И даже при наличии безупречно обоснованных доводов для каждого переведенного словечка и каждой точечки-запятой могут найтись те, кому не нравится то, се, пятое, двадцатое... Вот не нравится, и хоть вусмерть обоснуйся-обаргументируйся — не дойдет.
А зачем тогда вообще беспокоиться о них?
Цитата (alteya)
А потом уже Крэши и все остальные.
Yams предложил драконам и лисам объединиться, и параллельно развивать проекты переводов. С самым крутым лисом (который с четырьмя цифрами…) я пока не знаком лично, а другой неплохой лис (который друид) на меня нереально обиделся и сам ушёл.
Так что я без понятия, как у них там дела, но даю 95%, что демо-версии CrashBash (в том виде, в каком она сейчас) на нашем образе не будет.
Цитата (alteya)
Э... ну... чертспалиласьтипа того.
Здорово!
Тогда вы наверное заметили, что я поэт, и даже возможно знаете, чем кончилось для меня путешествие в Зазеркалье.
Хоть я и хотел собраться с духом и всё равно публиковать туда свои переводы песен (администрация даже мне это позволила), но я не отправил им ни одного файла за весь прошлый год!
И мне надоело, что они вообще никуда не опубликованы, и никто о них даже не знает… Теперь мне даже плевать на копирайт, просто выложить бы куда-нибудь! Архив: http://klimaleksus2.ucoz.ru/Files/S/lab.rar (если вдруг будете распечатывать – осторожно, это не версии для печати, размер страницы может оказаться совсем не A4)
А вообще-то я бы с радостью с вами что-нибудь коллективно попереводил в стихах))
Цитата (alteya)
Не думала, что на мою проблему так живо откликнутся.
Как раз-таки это я слишком медленно откликался на проблему. Плагины должны были быть уже давно готовы!
Цитата (alteya)
Ну и что? А зачем надо, чтобы везде все повторялось слово в слово? Наоборот — где-то бодаться, где-то толкаться, а где-то — просто рожки.
Тогда надо будет ещё равномерно распределить эти синонимы.
Цитата (alteya)
А я бы это считала по умолчанию «намеренно» - зачем нужен набор каких-то стандартных фраз, если есть много разных хороших вариантов?
Ну просто «charge» это как «glide», а что у нас glide – скольжение или полёт? Может сначала определимся? А то если менять, так придётся везде менять. Или же вы хотите допустить, чтобы дракончик где-то «летал», а где-то «скользил»?
Цитата (alteya)
Ну я дала несколько других вариантов («мы им наподдали», «мы их проучили», «мы им вмазали» ).
Третий не пойдёт, первый неплох, но с психологической точки зрения лучше звучит «мы их проучили» а – это как бы «поучительно» и тавтологично
Цитата (alteya)
Ну, допустим: «ты нигде не видел огромных курочек?». «тебе не попадались огромные курочки?» «тебе огромные курочки не встречались?» «ты не встречал огромных курочек?»
Хочется чего-то добавить. Например «Ты нигде не видел наших огромных курочек?» или «А тебе тут не попадались огромные курочки?» (хотя я бы и сюда «наши» поставил).
Цитата (alteya)
писать что-то типа ^^^, как в ценах Толстосума
Ух, я он них совсем забыл. Я ведь даже пока не знаю, КАК игра вставляет в текст цифру, и откуда она её берёт… Это может испортить мой метод сжатия текста (но не глобально, а лишь для таких фраз).
Цитата (alteya)
Ну «мой домашний мир» мне тоже не нравится.
То же и с «Xxx Yyy Home».
Что будем делать?
Цитата (alteya)
Правда, наверное надо убрать перед ним слово «мой»: просто «в родном мире». Либо отказаться от слова «родной».
Тогда лучше убрать «мир» и привести его конкретное название?
Цитата (alteya)
"Не бойся поджаривать их прямо со скейта."
Несовершенный вид глагола, хорошо.
Цитата (alteya)
Коллективное бессознательное, Карл Юнг, все дела...) А вообще люди, при всей своей уникальности и индивидуальности, в некоторых вещах не так уж сильно отличаются друг от друга.
Последнее, что меня поразило в английском (хоть в оригинале и был типа-техасский акцент) – выражения каламбуры «magic-shmagic» и «puffiness-schmuffiness». Ну что за «Маджик-шмаджик» и «Пафинэс-шмафинэс» !? Магия-Шмагия? Это им чё, «памидор-мамидор культур-мультур йок»? Я думал только узбеки так говорят…
Цитата (alteya)
А Зефир? Задание с семенами, когда мы взбираемся к птичке Джульетте.
О-о, я помню этот уровень. (Семена, кстати, перекликаются с похожим уровнем и Spyro3 тоже) Зефир… мне в этом мире что-то понравилось. Что-то особенное… Только не помню, что именно.
За ним водится сокращать слово “them” на “...'em” по-русски слово «их» ни в каком падеже не сократишь. Может, взамен этого иногда вставлять «тя» вместо «тебя»?
А используем «детскую» конструкцию типа «ихний»? Или для Греты с братиком оставим?
Цитата (Segoga)
Люди! Я тут почитал пару часов форум...
!!
Цитата (Segoga)
Вы "раздеваете" игру так подробно, вытягиваете по частичкам, как конструктор Лего...
Ага))
В принципе, к чему лично я стремлюсь во взломах – понять, что делает КАЖДЫЙ байт на образе диска. Тогда я смогу написать что-то вроде своего эмулятора, который на входе возьмёт WAD, и если и не запустит его как игу, то хотя бы построит все объекты и весь 3D мир всех уровней. На этом можно будет и закончить…
Цитата (Segoga)
Неужели вам не проще сделать новую игру? Объединить всё лучшее, что было в первых 3-х частях. и сделать свой ремикс??
Насколько я понимаю, таких попыток было немало. (и даже моя неудачная…) Мы делаем перевод не чтобы получить новую крутую игру, а чтобы отдать дань этой.
Цитата (steeldragon)
Мы не Франкенштейны-самоучки, из кусков чудищ не лепим.
Он живой!! *прожигает образ* ЖИВОЙ!!!
Цитата (steeldragon)
Хотя, вторая часть с третьей похожи по структуре, и если хотите, можете сами заняться созданием новой игры с помощью наших инструментов. А мы на вас посмотрим...
В любом случае, у нас пока нет ничего такого, на чём можно было бы создать аналог Spyro. Лучше для этого поменять платформу на PC. Эти консоли – нереально! Как им хватало так мало памяти, и ладно PS, а как Dendy и Spectrum? Я понимаю как они работают, но делать игру самому ни за что не рискну! Я даже музыку к ним не смогу написать…
Цитата (gitgeg)
При чем, если тут надо перевести текст и звуки, то в ремейке - создать географию мира, учитывать геймплей и т.д. В общем, это сложнее.
Ремейк «на глаз» никогда не будет точно таким же как оригинал. Чтобы реально правдоподобно повторить, нужно видеть исходный код игры…
Цитата (nihonjin)
Почему у нас там "приоритетным переводом"(@) для "Sunrise Spring Home" является "Дом Утреннего Родника"? Оно же не влезает в рамки/разницу! Для эквиметрики можно заменить "Родника" на "Ключа". Но звучит двусмысленно.
О {Разнице} забудьте раз и навсегда, а собачки можно пока снять со всех названий, по которым стартовали голосования.
Цитата (alteya)
Кстати, ко всем знающим, ВОПРОС: действительно ли все актерские правки содержатся в той теме в текстовом виде, или их надо выискивать в звуковых файлах проб?
Цитата (ShellyPes)
Я думаю, никто туда правки не выкладывает. Я, по крайней мере. Похоже, придется извлекать из звуковых файлов... Могу этим заняться.
Они не как правки а как тексты реплик. А на самом деле проще всего этим заняться мне, ибо мне не придётся скачивать кучу озвучек, ведь они и так все у меня!
Цитата (alteya)
Альтея... Тоже вариант. :)
А задумывалось без мягкого знака?
Цитата (alteya)
Хотелось бы знать, скоро - это когда? Мне-то без разницы, лежит себе и лежит - я свою работу (пока) сделала. Но если закончить сейчас хотя бы скейты, то можно смело дать их на озвучку.
Может будем делать сразу оба скейтпарка? Вдруг там что-то перекликается? Чтобы не поздно было исправить. Оттуда (Enchanted Towers) пока возьмём лишь скейтпарк, уровень же оставим.
Цитата (alteya)
Колдунья: Отлично. Может из тебя что-то и получится. А пока… иди охранять туннели. Останови любого, кто захочет пройти! <…> С 3 слогами можно слово «чудесно», к примеру.
Согласен! Звучать будет хм.. чудесно.
Цитата (alteya)
Шейла: Мне кажется, ты один из тех драконов, так? <…> Может, «тех самых»? Как бы: тех самых легендарных, могучих, загадочных.
Полностью согласен.
Цитата (alteya)
Шейла: Никогда не думала, что увижу. Вы драконы некогда властвовали в этих мирах, и всё такое. Но однажды вы пропали. Пуф! Хм... Первое предложение как-то обрублено. <…>
«Вот уж не думала, что повстречаю»? «Не подумала б, что встречу»?
Цитата (alteya)
Flying sheep, singing forests, wishing stars, you name it! Летающие овцы, поющие леса, звёзды желаний, тебе ли не знать! Вообще вроде как это переводится: и тому подобное; всё остальное; всего не перечесть. Или это намеренно — мол, раз Спайро — дракон, то для него все эти диковины обычное дело?
Flying sheep, singing forests, wishing stars, you name it! Летающие овцы, поющие леса, звёзды желаний, тебе ли не знать! Вообще вроде как это переводится: и тому подобное; всё остальное; всего не перечесть. Или это намеренно — мол, раз Спайро — дракон, то для него все эти диковины обычное дело?
Не пойму, кажется – это ошибка. Сначала было «ты и сам знаешь», но я заметил, что оно повторяет «А ты не знал?». Поэтому я поменял на «тебе ли не знать», но это ведь не изменило повтор!
Ваш вариант с «всего и не перечесть» звучит здорово. Только длинно… Надо пересмотреть по сценке, если ли там время (может быть персонаж не в кадре).
Цитата (alteya)
Шейла: Что ж, мне пора вернуться домой и произвести анализ повреждений. Что-то как-то заумно для Шейлы. Хотя там и в оригинале закрученная фразочка. Но, как я посмотрела, «damage control» - это не анализ, а собственно устранение повреждений. Правда, ощущение, словно речь идет о какой-то машине, а не о мирке. Может, лучше ущерб, урон, разрушения?
Тогда «… и устранить разрушения»? Но ведь не факт, что они там были (нет ни слова о нападении носорогов).
«осмотреть дом на предмет наличия..» не, это тоже не пойдёт.
Есть идея – «… вернуться домой и оценить ущерб» ?
Цитата (alteya)
Хантер: Скажи… мне кажется, или она куда привлекательнее, когда злится? М-м... Думаю, слово «привлекательная» - не то, которым бы Хантер описывал понравившуюся ему девушку. Нужен более простой, разговорный вариант. Миленькая, хорошенькая, симпотная. И зачем сравнительная форма? Может: «или она такая хорошенькая, когда злится»? Или, например "милашка".
Spyro4evA перевёл это как «Когда она злится, она такая вся прикольненькая... Или это я свихнулся?»
Кстати, оттуда же:
Цитата (aleksusklim)
Нам в любом случае хоть раз придётся употреблять эдакое изумление в переводах. Я настаиваю на варианте «!?», если кто-то не согласен – объявляйте голосование.
Цитата (Spyro4evA)
Ну если вы хотите углубиться в эмоциональный оттенок, то... "!?" - аккуратненький вопрос, согласен, гораздо красивее, чем "?!". Это подходит к позитивным изумлениям (Ты что, победил Колдунью!?) "?!" - изумлением это вряд ли назовёшь. Это скорее гнев. (Ты что, не заплатишь мне 9000+ камней за свободу Шейлы?!) Восклицательный знак на конце и не совсем презентабельный вид подчёркивают негатив.
Это гениально! Мне такой выход очень нравится.
По поводу Хантера и Бианки – «такая милашка» подходит.