Возникла парочка вопросов по круптару:
1) Есть ли возможность автоматом добавлять нули в конец файла, если места в оригинале не хватает?
2) Есть у меня, к примеру, игра в двухбайтовой кодировке и за окончание строки отвечает код h0000, но круптар все время теряет 1 ноль и приходится ставить h000000 - тогда все нормально. Но когда в файле встречается штук 8 этих нулей подряд - один или два все время теряются и приходится дописывать вручную. Как быть? :)
Цитата: Alex от 20 февраля 2009, 14:02:55
1) Есть ли возможность автоматом добавлять нули в конец файла, если места в оригинале не хватает?
Есть. Просто указать в "Блоки для текста" начальный и конечный адрес блока, куда нужно вставить текст.
Цитата: Alex от 20 февраля 2009, 14:02:55
2) Есть у меня, к примеру, игра в двухбайтовой кодировке и за окончание строки отвечает код h0000, но круптар все время теряет 1 ноль и приходится ставить h000000 - тогда все нормально. Но когда в файле встречается штук 8 этих нулей подряд - один или два все время теряются и приходится дописывать вручную. Как быть? :)
А это по-моему было только в шестой и пятой версии. Мне казалось, в седьмой это исправлено...
ЦитироватьЕсть. Просто указать в "Блоки для текста" начальный и конечный адрес блока, куда нужно вставить текст.
Если указать в блоках адрес больше, чем есть файле, то круптар просто не видит файл куда вставлять текст.
ЦитироватьА это по-моему было только в шестой и пятой версии. Мне казалось, в седьмой это исправлено...
У меня такое творится в последней версии с сайта. Ну да ладно, я уже привык )
Цитировать
Если указать в блоках адрес больше, чем есть файле, то круптар просто не видит файл куда вставлять текст.
Всё он прекрасно видит. Постоянно вставляю за пределы оригинального рамера без всяких проблем.
Пример:
Размер рома $200000.
Хотим расширить его на 65536 байт.
Добавляем диапазон 200000-20FFFF и пользуемся.
Ром расширяется. Текст вставляется в указанный диапазон, если пойнтеры позволяют конечно. Если они двухбайтовые и находятся далеко от этого места, то естественно нужно менять код игры.
Цитировать
У меня такое творится в последней версии с сайта. Ну да ладно, я уже привык )
Если кодировка двухбайтовая, поставь ptAlign = 2. Должно помочь.
И не забудь о моей КНОПОЧКЕ! :)
Не хочет что-то он у меня работать. При увеличении диапазона пишет "Файл не найден" и наглухо виснет. Поинтеры 4-байтовые, все должно, по идее, вставляться.
А если поставить PtAlign=2, то вместо текста извлекается не пойми что.
Найдена ошибка со всем этим. Сейчас исправляю.
Качайте новую версию:
http://magicteam.net/progs/Kruptar.v7.0.0.85.rar
Только, если там будут какие-то новые ошибки, прошу сразу сообщить. :)
Теперь все отлично работает, но кое-что все же осталось )
У меня в роме есть 5 поинтеров подряд, указывающих на $00000000, а так как код окончания строки $0000, то и видит он, похоже, только первую пару нулей. Вторую пару вставлять не хочет.
Ну это уже добавь дополнительный код окончание со значением 00000000.
И про кнопочки не забыл. Уря! *F_COOL*
Привет Джин!
У меня возникли проблемы с 7 Круптаром. Надеюсь, ты мне поможешь. :)
В общем, игра Neutopia (U). Я составил проект, подключив пойнтеры в файле. Потому как они расположены не упорядоченно, а с разными интервалами между друг другом.
Вставил немного текста. Решил проверить. И вот, выявилось, что после первого диалога со старушкой, в конце остается мусор... Лишние пробелы и точка, и даже запятая. И ещё даже не окончен диалог. Вот скрин.
(http://s52.radikal.ru/i135/0903/87/e4eeada1cb18.png)
Стопбайт - F2, байт переноса строки - F1. Я решил проверить всё ли верно делает Круптар, открыв ром в хексредакторе. Но там с первого взгляда всё правильно. Идёт текст, за ним стопбайт и следующий текст и никаких пробелов и прочего. И пойнтеры верно пересчитаны. Вот пару скринов.
(http://i081.radikal.ru/0903/72/24abd88818a8t.jpg) (http://radikal.ru/F/i081.radikal.ru/0903/72/24abd88818a8.jpg.html)
(http://i074.radikal.ru/0903/fb/993820ed176dt.jpg) (http://radikal.ru/F/i074.radikal.ru/0903/fb/993820ed176d.jpg.html)
Откуда берутся эти лишние пробелы? ::)
P.S. Я вот тоже хотел написать про быстрый запуск эмуля, а ты уже подправил. Спасибо. *FRIENDS*
Ещё интересует, нельзя ли сделать ,чтобы окно, которое появляется после пересчета пойнтеров, исчезало автоматически, как в 6 версии. Чтобы не приходилось жать крестик постоянно.
И можно ли в 7 версии вытащить в файл? То есть не просто копируя, а опцией, типо вынуть текст. Ну это мелочи.
Первый взгляд ламера и первая мысль было о том, что проблема в том, что длина переведенных строк больше среднего значения оригинальных строк, которые нельзя превышать, т.е. максимум символов, которые можно написать в строке. :)
P.S. Я как админ могу писать самые сумасшедшие идеи. %)
P.S.S. У папки прикольное название "Игровой портал"! :) Звучит то как! :)
И ещё в древовидной структуре в самом левом окне добавить яркий цвет выделенному элементу, а то выберешь например фразу - а поинтер выбранный отображён сереньким цветом, не видно какой именно из списка выбран...
Группы
поинтеры
Лист1
00В560
00В562
00В564
00В566
Я вот об этих поинтерах, в левом окне древовидной структуры, да и вообще обо всех элементах...
В смысле цвет пропадает с потерей фокуса, а надо чтобы он оставался...
JP: Володя, не хулигань. (:
ЦитироватьПервый взгляд ламера и первая мысль было о том, что проблема в том, что длина переведенных строк больше среднего значения оригинальных строк, которые нельзя превышать, т.е. максимум символов, которые можно написать в строке. Улыбка
Твой ламерский взгляд, вероятно, мне не поможет. Максимальная длина символов в строке- 30. И если ты что-то превысишь, то текст просто выводится на другой строке.Так в многих играх. Здесь ничего не превышено.
На скриншоте явно видно, что текст закончился на "любовь Принцессы", а пробелы и символы почему-то остались. Если вставлять аналогичный текст хексредактором, то такой траблы нет. Как только процессор считает F2, диалоговое окно должно быть закрыто.
Возможно перед или после F2 должно быть ещё что-нибудь?
Нет. Я по-моему разобрался. :) Круптар ставит нули в конец участка переводимого текста, если остается свободное место. Так вот, а байт пробела в этой игре $CF. И на нули она как-то неадекватно реагирует. Заменив нули в свободном месте на CF, всё стало нормально, за исключением нескольких пойнтеров. Но это уже, видимо, мой косяк. Исправлю.
Появился еще один вопрос по поинтерам:
Имеем 4-байтный поинтер со значением 00000001h, адрес строки, на которую указывает поинтер - 0187E9h.
Чтобы посчитать смещение, нужно вычесть 0187E9h-01000000h,но это получается отрицательное число и я никак не могу записать его в круптар :(
Хекс-числа с минусом пишутся таким образом: hFFFFFFFF - это -1 %)
Цитировать0187E9h-01000000h
Может не $01000000 (потому что это целых 16 мегабайт), а всего лишь $01????
А вообще отрицательные значения легко вводить, просто это надо делать в десятичном виде:
вводишь -123, получаешь hFFFFFF85.
А, все, разобрался :) Просто нужно было поставить Motorola TRUE :)
Теперь проблема с окончанием строки...
За окончание строки отвечает байт $00, но в тексте выделение цветом записывается последовательностью байт $1A06FF000001. Так вот, после первых же нулей круптар считает, что строка закончилась и дальше ничего не показывает.
Можно ли это как-то обойти? Может, добавить эту последовательность в исключения?
Если в таблице символов написать 1A06FF000001=<Red>, то круптар все равно считает, что строка закончилась после первых нулей.
Alex, а ты скажешь что за РОМ? ;)
Это Zelda Twilight Princess на Куб. Хочу вот помочь Антону проект для Круптара сделать.
Если 00 - стопбайт, то текст перестанет считываться в любом месте, где встретится этот байт. Чтобы считать такой текст полностью, нужно писать отдельный плагин, который будет учитывать комбинации с этим байтом.
Цитата: Alex от 05 мая 2009, 16:30:35
За окончание строки отвечает байт $00
Я уточню - не за окончание строки, а за окончание блока текста/начало следующего (диалога, названия действия и т.п.)
За перенос строки отвечает байт 0A.
Типа так:
Обычный диалог:
Предыдущий диалог<00>Текст, текст<0А>
Вторая строка, текст.<00>Следующий диалог...Диалог с цветом:
Предыдущий диалог<00><1A06FF000001>Текст красного цвета, текст<0A>
вторая строка текст красного цвета<1A06FF000000>, текст обычного белого цвета,<0A>
третья строка обычного текста.<00>Следующий диалог...Еще бывает несколько нулевых байтов между диалогами:
Предыдущий диалог.<00><00><00><00><00>Следующий диалог.Хотя это наверное не важно )
А может кто-нибудь помочь написать этот плагин, если я дам все комбинации?
Там ведь по идее не сложно, просто добавить их в исключения...
Цитата: Anton от 06 мая 2009, 09:54:03
Цитата: Alex от 05 мая 2009, 16:30:35
За окончание строки отвечает байт $00
Я уточню - не за окончание строки, а за окончание блока текста/начало следующего (диалога, названия действия и т.п.)
За перенос строки отвечает байт 0A.
Я про стопбайт и говорю.
Цитировать
А может кто-нибудь помочь написать этот плагин, если я дам все комбинации?
Там ведь по идее не сложно, просто добавить их в исключения...
Качаем исходники плагинов: http://griever.magicteam.net/files/Kruptar_PlugSrc.rar
Читаем документацию: http://magicteam.net/docs/kruptar/doc.htm
И пишем.
Цитата: Джинни от 07 мая 2009, 07:19:03
И пишем.
Увы, с программированием у меня полный ноль.
Антон, ну ответ Саши ты понял. *CONNIE*
Тебе прямая дорога к Михаилу Ужасному. Если пропросишь, может он тебе и напишет плагин, правда для начала может дать кусочек текста для тестрования твоих переводческих талантов, чтобы он не усомнился, что тратит свои силы на написания плагина не напрасно. ;D
Кто такой Михаил Ужасный? )
Цитата: JurasskPark от 07 мая 2009, 11:40:29
тестрования твоих переводческих талантов
А че их тестировать.
Пусть в Окарину поиграет.
И вот к Твайлайт принцесс первый диалог готов: http://zelda64rus.ucoz.ru/forum/19-49-1
Цитата: Anton от 07 мая 2009, 15:01:27
Кто такой Михаил Ужасный? )
+500 LOL
Но на вопрос всё же отвечу. :)
Правильный ответ: HoRRoR
Цитата: JurasskPark от 07 мая 2009, 16:55:45
LOL
Да ладно тебе. Я что с ним общался, что ли?
Откуда я знаю.
Спасибо Гриверу за плагин :)
Вообще, во многих играх может понадобиться запись таких последовательностей. Неплохо бы сделать их запись попроще, а не через Delphi o_O
Цитата: Alex от 12 мая 2009, 22:13:52
Неплохо бы сделать их запись попроще, а не через Delphi o_O
Ты имеешь в виду какой-нибудь текстовый файл, в котором можно указать просто необходимые тебе значения?
Тогда нужно в Kruptar'e код менять т.е. писать Kruptar 8 :)
Цитата: JurasskPark от 07 мая 2009, 11:40:29
правда для начала может дать кусочек текста для тестрования твоих переводческих талантов, чтобы он не усомнился, что тратит свои силы на написания плагина не напрасно.
Ну его таланты можно проверить, поиграв в обе переведенные зельды на N64
*OFFTOP*
Цитата: PicaSSO от 17 мая 2009, 13:09:58
Цитата: JurasskPark от 07 мая 2009, 11:40:29
правда для начала может дать кусочек текста для тестрования твоих переводческих талантов, чтобы он не усомнился, что тратит свои силы на написания плагина не напрасно.
Ну его таланты можно проверить, поиграв в обе переведенные зельды на N64
PicaSSO, ты как всегда не понял ответ.
А смысл в моих словах такой, что с Ужастиком сложно найти общий язык. И если его попросить с чем-то помочь, то вместо помощи он может поумничать, унизить и не помочь.
Что в случае с Антоном и произошло.
http://www.shedevr.org.ru/forum/viewtopic.php?t=3875
ЦитироватьСлушай, Хоррор... Дружище...
Ты можешь общаться по-человечески и не умничать?
Объясни нормально, как подгонять размер образа файлами-пустышками, а не "кто сказал" и про "железную дорогу"... Ладно?
Я не программер и по математике у меня твердая двойка. Я не понимаю многого. Но я понимаю, когда объясняют по-человечески.
Если ты что-то знаешь и готов посоветовать что-то дельное - посоветуй. Буду очень благодарен. Если нет - не отвечай лучше.
А вот Alex помогает Антону без всяких выкрутасов.
Ну почему-же. Хоррор пожелал мне удачи :)
Разберемся без Хоррора, раз у него амбиции )
А Алексу огромное спасибо, разобрался со всем, намутил плагины, все прислал и объяснил по людски.
Сижу теперь, о пойнтерах не думаю, открыл круптар и перевожу )
PicaSSO (>обе переведенные зельды на N64) - только окарину.. )
Мажору ж готтаХ с Алексом перевели. И надо сказать, отлично перевели )
> PicaSSO, ты как всегда не понял ответ.
Да все я понял =) Антон уж точно не станет переводить хуже, чем переводил. А ХоРРоР - да, спеси много. А ведь ему так же отвечали когда он начинал в свое время +)
Я просто не очень понимаю людей, у которых знания в какой-то области выше, чем у тебя,
и они стараются это всем видом показать.
Будет ли в крупыче поддержка мультиязычности??? Хотя бы в меню... А то у меня есть друг буржуинский, так вот - трудно ему понять русское меню проги... Вот бы английский был... Нажал кнопку - англ, нажал другую - русский...
Пусть учит русский язык. ;D А то мы в иностранных прогах видите ли должны разбираться, а они в наших нет. ;)
Володь, там не так уж и много надписей, чтобы понимать.
А может он не понимает КАК работает программа, а не то какие надписи? :) А то я тоже не понимаю, как работает эта программа. LOL
Цитировать
Будет ли в крупыче поддержка мультиязычности??? Хотя бы в меню... А то у меня есть друг буржуинский, так вот - трудно ему понять русское меню проги... Вот бы английский был... Нажал кнопку - англ, нажал другую - русский...
Будет, будет :)
цЫтата: "Будет, будет"
Шашлык из тебя будет ;о))))))))))))))))))))))))))))
Не будет ли так любезен многоуважаемый джинн...
А можно в 7 круптаре вытащить текст без использования поинтеров? :) Или как это сделать в 6?
Цитата: Alex от 30 мая 2009, 00:47:14
А можно в 7 круптаре вытащить текст без использования поинтеров? :) Или как это сделать в 6?
:o Я знаю как вытащить текст из проекта круптара, но "вытащить текст без использования поинтеров" - это что-то новенькое.
А поподробнее можно?
Цитата: Alex от 30 мая 2009, 00:47:14
А можно в 7 круптаре вытащить текст без использования поинтеров? :) Или как это сделать в 6?
Да можно конечно, даже в пятом можно было. Размер пойнтеров 0 поставить и всё.
Согласен с Володей +) Ибо ели-ели заметно... не удобно =) (хотя бы зеленым выделялось =))))))))))))) )
ОФФТОП
Саня, поздравляю с победой Круптара на конкурсе :Ъ
Цитата: GD от 31 мая 2009, 21:11:23
Согласен с Володей +) Ибо ели-ели заметно... не удобно =) (хотя бы зеленым выделялось =))))))))))))) )
Ты про что?
Цитата: GD от 31 мая 2009, 21:11:23
Саня, поздравляю с победой Круптара на конкурсе :Ъ
Спасибо :)
блин! глюканул! думал пост Гайва последний.... :-[
ЦитироватьИ ещё в древовидной структуре в самом левом окне добавить яркий цвет выделенному элементу, а то выберешь например фразу - а поинтер выбранный отображён сереньким цветом, не видно какой именно из списка выбран...
Группы
поинтеры
Лист1
00В560
00В562
00В564
00В566
Я вот об этих поинтерах, в левом окне древовидной структуры, да и вообще обо всех элементах...
В смысле цвет пропадает с потерей фокуса, а надо чтобы он оставался...
сорри за флуд...
P.S. Первое предупреждение
Цитировать
Я вот об этих поинтерах, в левом окне древовидной структуры, да и вообще обо всех элементах...
В смысле цвет пропадает с потерей фокуса, а надо чтобы он оставался...
Если хочется узнать какому пойнтеру принадлежит определённая строчка, нужно просто нажать на эту строчку двойным щелчком мышки и пойнтер выделится в дереве.
Кстати, в новой версии Круптара в ReadMe_Eng.txt в Features забыли текст выровнить на 79 символов как в ReadMe_Rus.txt. ;)
Цитировать
Kruptar 7 allows extracting and editing text resources of almost any format,
including dictionary compression schemes (DTE, MTE). Text data compressed by
any other algorithm can be extracted into clear and easy to edit plain text,
but this process requires plug-in creation, which supposes you can code Object
Pascal dlls. For the user's convenience multiple groups of text blocks can be
created during extraction process. Each block can have different text data
formats, encoding tables and pointers formats, which allows storing all your
text in one project file. Kruptar 7 has convenient editing environment: tabs,
text visualization, and functional search, ability to work with different
encodings: SHIFT-JIS, UTF-16, etc. All these editing functions makes Kruptar a
lot better replacement for your notepad. But you can extract text into simple
*.txt file anytime: Kruptar 7 project file (*.kpx) is a simple ZIP archive,
which also contains encoding tables (*.tbl) and plain text files (*.txt)
inside. Kruptar 7 is notable for an excellent pointer usage. Of course all
pointers are recalculated automatically during text insertion and text strings
are inserted optimally into given space. The Kruptar's flexible system which
works with pointers also needs to be pointed out: almost all possible pointer
formats are implemented here. Text insertion is a one click business and it is
committed pretty fast (the process is constantly optimizing from version to
version). That allows you to view the result instantly. Unfortunately main
disadvantage of Kruptar 7 is lack of full and detailed documentation in
English.
Аватарка у тебя забавная :D
Джинни, я пишу тебе по поводу моей древней доки по Круптару7. Планируется ли выкладка её на сайт или нет? Если что, то сейчас я её дописываю, учитывая изменения в новых версиях Круптара. Жду ответа.
Вспомнил свою наработку. LOL
Был бы у меня текст, а так я бы оформил. :) Но писать про то, что не понимаешь, это невозможно. ;D
З.Ы. >_< Дурацкие мои ошибки. Особенно "ться".
Начал переводить игру одну, так вот, нашёл поинтеры, они
обычные - двухбайтный, вида:
37A0 45A0 4DA0 и т.д. смещение у них h4010
А сам текст такого вида:
/00/06/ПРИВЕТ/00/04/ПОКА/00/07/ПАРОВОЗ/08/04/ЩИТ1/08/04/ЩИТ
2/09/06/МАГИЯ1/09/06/МАГИЯ2
/00/06/ПРИВЕТ
/00/04/ПОКА
/00/07/ПАРОВОЗ
/08/04/ЩИТ1
/08/04/ЩИТ2
/09/06/МАГИЯ1
/09/06/МАГИЯ2
Где число перед словом - длина самого слова.
В таблице поинтеров каждый поинтер указывает на символ,
который стоит перед символом длины слова... Т.е. в
/00/06/ПРИВЕТ он указывает на /00 , А в /09/06/МАГИЯ2 он
указывает на /09
Как видно, символов окончания строки нет! Как составить
проект к такой игре? не писать же каждое слово отдельно...
Надо составлять к крупычу плагин? Или можно как-то
стандартными методами обойтись?
В принципе я могу все поинтеры загрузить из файла, но как
быть с разной длиной строк? Как заставить крупыч вынимать
длину строк, руководствуясь символом перед самим словом?
Конечно нужно писать плагин.
Сначала читаешь первый байт (что он означает?), записываешь его в переменную, потом байт длины слова, потом само слово указанной длины. Тот первый байт и саму строку объединяешь в одну выходную строку.
Беда, что я это не умею... Пока нашёл такой выход, я после последнего предложения беру последовательность символов, нопример 010305638563 и обьявляю её кодом окончания строки. И вынимаю поинтеры, при этом получается:
1 поинтер:
/00/06/ПРИВЕТ
/00/04/ПОКА
/00/07/ПАРОВОЗ
/08/04/ЩИТ1
/08/04/ЩИТ2
/09/06/МАГИЯ1
/09/06/МАГИЯ2
2 поинтер:
/00/04/ПОКА
/00/07/ПАРОВОЗ
/08/04/ЩИТ1
/08/04/ЩИТ2
/09/06/МАГИЯ1
/09/06/МАГИЯ2 3
3 поинтер:
/00/07/ПАРОВОЗ
/08/04/ЩИТ1
/08/04/ЩИТ2
/09/06/МАГИЯ1
/09/06/МАГИЯ2
И т.д. - потом я просто стираю всё лишнее... Но работы много, стирать приходится ОЧЕНЬ многое...
Ты программы пишешь? Пишешь. В архиве с круптаром есть исходники самого простого плагина. Берёшь его и изменяешь как тебе надо. Какие именно процедуры изменять и для чего написано тут: http://magicteam.net/docs/kruptar/doc.htm
Эх, если бы стандартно отнимать от значени пойнтера hC00000(snes hirom) или h800000, было бы вообще круто...
Или это можно в плагине намудрить?
Hirom то можно легко стандартными средствами реализовать, а вот lorom пока нет.
А как hirom реализзовать?
А то делаю так, только два первый байта беру, а третий не трогаю, просто reference добавляю сколько нужно...
А третий байт тупо добавляю=)
Если я не ошибаюсь, в HIROM обычная адресация, просто C0000000 добавляется к смещению.
Если честно?=)
Не катит=)
Джинн
Поскажи, пожалуйста, умеет ли Круптар работать с поинтерами, расположенными в нестандартном порядке: П1 П2 П3 [пропуск в 2 байта] П4 П5 П6 [пропуск в 2 байта] ... или
П1 [пропуск 1 байт] П2 П3 [пропуск 6 байт] П4 [пропуск 1 байт] ...
или надо писать свой плагин?
Заранее спасибо.
Просто добавлять отдельно каждый пойнтер.
удобнее в текстовике адреса написать, а потом вставить, а то по одному муторно добавлять, скроллбар приходиться отматывать на начало+)
Конечно удобно. Это тоже называется "добавление отдельно".
Я просто дополнил к твоему указанию ;D
Джинни, gegmopo3 большое спасибо за помощь.
Решил освоить круптар и перевести с помощью него игрушку на сегу (Decap Attack).
Так вот, в статье нашел немного непонятного:
4. Кратность.
При пересчёте, каждый пойнтер будет кратным одному из выбранных значений (1, 2, 4, 8). Кратность на 2, 4 и 8 используется только в некоторых играх для GBA.
(Можно поподробнее? :))
8. Signed.
Пойнтеры типа signed int (c++) или integer (pascal/delphi),
то есть они могут указывать как вперёд от начала отсчёта, так и назад.
(На каких платформах это используется?)
Цитата: Cool-Spot от 15 июня 2010, 00:32:524. Кратность.
При пересчёте, каждый пойнтер будет кратным одному из выбранных значений (1, 2, 4, Крутой. Кратность на 2, 4 и 8 используется только в некоторых играх для GBA.
(Можно поподробнее? Улыбка)
Адрес строки кратен введённому значению. Если 2, то $1C00, $1C02, $1C04... Если 4, то $1C00, $1C04, $1C08
Цитата: Cool-Spot от 15 июня 2010, 00:32:528. Signed.
Пойнтеры типа signed int (c++) или integer (pascal/delphi),
то есть они могут указывать как вперёд от начала отсчёта, так и назад.
(На каких платформах это используется?)
На любых.
Цитата: Джинни от 14 июня 2010, 16:57:16На любых.
А в случае игры Decap Attack? Как они вообще различаются?
В этой игре обычные пойнтеры.
Судя по всему, хорошая прога этот Круптар, вот только я не могу понять как работать ей, никто не мог бы создать полную инструкцию по Круптару? та что на сайте не совсем полная, а создать пошаговую инструкцию с картинками желательно, например, откройте то, и скрин, появится то, и скрин, ну можно скрины не так часто.
Это просто злой рок Круптара. Пока это не удалось ещё никому. :)
Вообще в ней нет ничего такого сложного, главное - знать основы ромхакинга. Документ к шестому Круптару подходит, кстати, во многом и к седьмому. Дополнительная информация по указателям и т.д. находится в документе "Написание плагинов для Kruptar 7".
Цитата: Satan от 22 июня 2010, 21:29:47вот только я не могу понять как работать ей
А вот тут надо искать проблемы не в отсутствии инструкции, а кое в чём другом...
Вот интересно вот это вот:
(http://img340.imageshack.us/img340/3254/wftc.th.png) (http://img340.imageshack.us/img340/3254/wftc.png)
баг или фича? Случайно нажал какое-то сочетание клавиш(сам не понял какое) и фраза стала как на иврите или арабрском: при нажатии «?» курсор двигается влево, а если «?», то вправо. Или может быть это фича(или баг) Виндоўса?
Апдейт: это случилось не только с одной фразой, а вообще со всем текстом перевода в Круптаре.
Меню по правой кнопке мышки, а в нём опция. Стандартная.
Вернее была когда-то, её меню программы перекрывает.
Можно увидеть в окне поиска. Но там не указано какой-нибудь комбинации клавиш, которая может её включать/выключать.
Спасибо за наводку.
Комбинацию клавиш быстро нагуглить не смог, но эксперименты с нотепадом, показали что нужно закрыть и открыть Круптар (а не только проект, как я пробовал раньше).
Джинни, а как определять эти поинтеры типа signed int (c++) или integer (pascal/delphi).
Вчера сидел и почти во всем разобрался! Помогла и утилитка Griever's Pointer Searcher. В общем-то в проге и нет ничего особо сложного. Надо только уметь поинтеры находить и с хекс-редом уметь работать :)
singed int - это когда диапазон значений $FFFFFFFF..$80000000 представляет собой отрицательные значения -1..-2147483648.
Цитата: ???4 от 03 июля 2010, 04:11:42Или может быть это фича(или баг) Виндоўса?
Именно так. Если такое беспокоит, то следует отключить поддержку возможности ввода текста справа налево.
WinXP:
Кнопка "Пуск" -> "Панель управления" -> "Язык и региональные стандарты" -> Вкладка "Языки" -> Раздел "Дополнительная языковая поддержка" -> Снимите флажок опции "Установить поддержку языков с письмом справа-налево и сложным письмом (включая тайский)" -> Перегрузите компьютер
Скажите что нужно писать в папке диапазон адресов? И на примере покажите, как это должно выглядеть.
Нужно писать адрес (адреса) начала и конца блока в роме, в который будет вставляться текст. Например 16000-17FFF
Цитата: Джинни от 18 ноября 2010, 14:35:58Нужно писать адрес (адреса) начала и конца блока в роме, в который будет вставляться текст. Например 16000-17FFF
Под началом и кончом ты конкретно что имеешь ввиду?
Байт перед первой буквой в блоке и стоп байт в конце блока,
или первую и боследную буквы в блоке?
и еще - интервал между поинтерами составляет 10 позиций(но ведь в каждой по два байта), значит мне надо писать 10 или 20?
Еще один вопрос:
когда добавляешь поинтеры в List, появляется окно со строками начальный адрес(сюда понятно, пишем первый поинтер) и конечный адресс - вот сюда что писать надо?
Не удивляйтесь что у меня так много вопросов. Просто проект я давно составил и поинтеры нашел, но текст в результате не появляется. Без помощи мне никак не обойтись.
Добавлено позже:
Джинни , а у тебя аська есть?
Никакого конкретного байта. Блок(и) - это любое место в роме. Адресами задаётся диапазон. Адреса могут быть как в пределах оригинального текста, так и где угодно в роме, если позволяет адресация.
Цитата: ToledO от 18 ноября 2010, 23:06:59и еще - интервал между поинтерами составляет 10 позиций(но ведь в каждой по два байта), значит мне надо писать 10 или 20?
Интервал считается в байтах, то есть 20.
Цитата: ToledO от 18 ноября 2010, 23:06:59конечный адресс - вот сюда что писать надо?
Адрес последнего пойнтера.
Цитата: ToledO от 18 ноября 2010, 23:06:59Не удивляйтесь что у меня так много вопросов. Просто проект я давно составил и поинтеры нашел, но текст в результате не появляется. Без помощи мне никак не обойтись.
Чему тут удивляться, ты не первый.
Джинн, сделай какую-нибудь небольшую фичу в Круптаре и зарелизь мини-версию. Пожалуйста. Очень прошу.
Можешь даже не писать, что за фича, в чейнджлоге, вместо этого написать: "скрытая фича для Эндрю. Найдёт - получит ещё мини-фичу".
Фигасе! :o
Джинни а как узнать что в роме есть еще место для перевода? У меня в роме после блока текста идет большое пространство из ff.
диапазон адресов указывается 7 цифрами. Мой диапазон e569-f14e, значит пиасть надо так - 000у569-000а14у или так e569000-f14e000 ?
что означает ptAlign и какой пункт указывает кратность?
Цитата: ToledO от 29 ноября 2010, 21:32:15значит пиасть надо так - 000у569-000а14у или так e569000-f14e000
Первое.
Цитата: ToledO от 29 ноября 2010, 21:32:15какой пункт указывает кратность?
ptMultiply
Цитата: ToledO от 29 ноября 2010, 21:32:15что означает ptAlign
Оно вроде должно быть равно 2, если кодировка двухбайтовая.
Oraculum может я задам банальный вопрос, но как высчитать кратность поинтера? Не, ну как вообще кратность высчитывается знаю, но ведь здесь же система Hex - калькулятор выдает Hex значение,когда делишь поинтер на какое нибудь число, а не числовой вариант.
Цитата: из http://magicteam.net/krupdoc.htm
При пересчёте, каждый пойнтер будет кратным одному из выбранных значений (1, 2, 4, 8). Кратность на 2, 4 и 8 используется только в некоторых играх для GBA.
Цитата: Джинни от 15 июня 2010, 00:57:16Цитата: Cool-Spot от 15 Июнь 2010, 07:32:52
4. Кратность.
При пересчёте, каждый пойнтер будет кратным одному из выбранных значений (1, 2, 4, Крутой. Кратность на 2, 4 и 8 используется только в некоторых играх для GBA.
(Можно поподробнее? Улыбка)
Адрес строки кратен введённому значению. Если 2, то $1C00, $1C02, $1C04... Если 4, то $1C00, $1C04, $1C08
Цитата: ToledO от 29 ноября 2010, 21:32:15Джинни а как узнать что в роме есть еще место для перевода?
Вопрос видимо остался незамеченным LOL
Вернемся к нашим баранам - ни хрена у меня все равно не получается!!!!!!! Я уже задолбался!!!!! Не появляется текст!!!!!Пожалуйста кто - нибудь, если у вас есть время, гляньте на мой проект и скажите, что я делаю не так?
Вот поинтеры:
59A5
A6A6
FFA9
21AA
CBAA
D0AD
94B0Вот проект:
1) В ptStringLength нужно 0, а не 1024.
2) Код окончания строки - FF, а не 01.
3) Коды разрыва строки: 00, 01
Цитата: ToledO от 03 декабря 2010, 07:17:46Джинни а как узнать что в роме есть еще место для перевода?
Открыть ром и поискать свободное место глазками.
Цитата: Oraculum от 03 декабря 2010, 04:10:37
1) В ptStringLength нужно 0, а не 1024.
2) Код окончания строки - FF, а не 01.
3) Коды разрыва строки: 00, 01
Как так? FF ведь здесь стоп-байт, а про то что код разрыва строки может быть не один я не знал.
Цитата: Джинни от 03 декабря 2010, 07:57:29
Цитата: ToledO от 03 декабря 2010, 07:17:46Джинни а как узнать что в роме есть еще место для перевода?
Открыть ром и поискать свободное место глазками.
Логично, только как должно выглядеть это место? Я же говорю, после текста там много места с FF, это оно?
Oraculum а у тебя текст появился? Что то все равно не получается.
Цитата: ToledO от 03 декабря 2010, 08:56:50а про то что код разрыва строки может быть не один я не знал.
Один из концов строки может быть просто переходом на следующую строку, а другой, например, переводить на новую "страницу". Кстати, концов текста тоже может быть несколько.
Понятно, просто мне казалось,что перенос на новую страницу это и есть окончание строки
Цитата: ToledO от 03 декабря 2010, 16:56:50Я же говорю, после текста там много места с FF, это оно?
Ну а ты как думаешь?
Но так как игра на NES, ты не сможешь вставить текст в любое свободное место рома. Потому что адресация не позволяет.
Цитата: ToledO от 03 декабря 2010, 08:56:50Oraculum а у тебя текст появился?
Да. Правой кнопкой мыши щёлкаешь на список поинтеров (List1) -> "Добавить поинтеры...", начальный адрес вводишь hE519, конечный - hE567.
а откуда ты эти адреса взял?
Цитата: ToledO от 03 декабря 2010, 22:51:27а откуда ты эти адреса взял?
Не задавай глупых вопросов :)
Цитата: ToledO от 03 декабря 2010, 14:51:27а откуда ты эти адреса взял?
По картам нагадал. *F_LOL*
Тьфю ты елки палки!!!!!!!!!!! Я думал в окне надо писать сами поинтеры, а не их адреса.
Всег мозги себе прокомпосировал!
(http://i13.fastpic.ru/big/2010/1207/4e/20a7652276b99f8fc0392b084ad73d4e.jpg)
Надо было лысому косичку Джина пририсовать))))
Народ, я понимаю я вас уже всех достал, но у кого же еще просить помощи по круптару? Вот такие пироги(громко не ругаться - не знаю как делать увеличение картинки при наведении).
http://xmages.net/storage/10/1/0/9/7/upload/5da43c82.png (http://xmages.net/storage/10/1/0/9/7/upload/5da43c82.png)
Что за символы, понять не могу. ессесно при переводе какша какая то выходит, ну не совсем - в каждом слове 1-2 буквы отсутствуют.
Квадратики - это коды разрыва строки. У меня, например, они не отображаются.
И таблицу нужно правильно составлять, не использовать + вместо пробела.
Цитата: Джинни от 18 декабря 2010, 12:50:52И таблицу нужно правильно составлять, не использовать + вместо пробела.
А какая разница?
И что мне с этими квадратиками делать? я же указал коды разрыва строки.
Ничего не делать, это только отображение.
Цитата: Джинни от 18 декабря 2010, 13:25:10
Ничего не делать, это только отображение.
Однако на результат перевода влияет.
Цитата: ToledO от 19 декабря 2010, 20:33:59Однако на результат перевода влияет.
Это как, например? :)
Цитата: nikita600 от 19 декабря 2010, 21:34:49Ответ #108 : 18 Декабрь 2010, 12:47:05
Ответ #108 : 18 Декабрь 2010, 12:47:05
Покажи скрин уже запущенной игры что ли, а то лично для меня в круптаре всё правильно :)
Цитата: ToledO от 20 декабря 2010, 03:33:59Однако на результат перевода влияет.
Влияют другие настройки. И неправильно составленная таблица, возможно.
Кстати, а что означает значение 0x27?
Оно меня как-то тревожит. Уж больно часто повторяется в тексте :)
Цитата: nikita600 от 20 декабря 2010, 11:45:25Кстати, а что означает значение 0x27?
Это у тебя надо спрашивать :) В разных играх одни и те же коды выводят разные вещи. Вообще это может быть чем угодно: символом, словом, иконкой персонажа, переносом строки, паузой, изменением цвета текста и т.д. и т.п.
Что это такое можно узнать методом научного тыка - убери его из текста, или наоборот добавь и посмотри, что изменится при выводе текста на экран. Лично я, когда составляю таблицы, обязательно пробую вставлять в текст все 256 кодов :)
Цитата: TrickZter от 20 декабря 2010, 17:10:12Это у тебя надо спрашивать
А он тут при чём? :) Это у Toledo надо спрашивать. Никита и сам в хакинге разбирается неплохо. :)
Добавлено позже:
Судя по всему, код /27 - это апостроф. :)
Самое интересное это то, что апостроф у меня в таблице под кодом 26.
И после этого, вы дальше буде те утверждать что -
Цитата: nikita600 от 19 декабря 2010, 23:57:25лично для меня в круптаре всё правильно
Раз 27 в между словами I'd, I'll, значит 27 - это код апострофа. Я ещё раз повторяю, что ты неправильно составил таблицу.
Не ну я что слепой по вашему - в таблице черным по белому написано (в обоих таблицах) - 26-'
Ну раз уж ты настаиваешь, проверю их заново. Все равно пока занят другим переводом, а в этом с графикой надо будет помучиться.
Цитата: ToledO от 21 декабря 2010, 02:14:28Не ну я что слепой по вашему - в таблице черным по белому написано (в обоих таблицах) - 26-'
У тебя в таблице чёрным по белому так написано, потому что её составлял ты (или какой-то другой человек).
Раз ты видишь, что в тексте вместо апострофа стоит код /27, значит это правильный код апострофа.
В новой версии реализован формат пойнтеров SNES Lo-ROM.
Цитата: Джинни от 01 января 2011, 16:38:49В новой версии реализован формат пойнтеров SNES Lo-ROM.
Лучше бы новая версия документации была :P
Цитата: TrickZter от 01 января 2011, 23:50:49Это как? Сумасшедший
ROM'ы SNES бывают Lo-ROM и Hi-ROM.
В Lo-ROM пойнтеры вычисляются так:
LoROMptr = $8000 + (file_offset and $7FFF) + (file_offset shr 15) shl 16;
file_offset = LoROMptr.Lo and $7FFF + LoROMptr.Hi shl 15;
LoROMptr.Lo - это младший word пойнтера
LoROMptr.Hi - старший word
А не проще было с LongWord сделать?
Цитата: TrickZter от 02 января 2011, 17:50:32А не проще было с LongWord сделать?
Ты о чём? Я просто формулу объясняю.
Если LoROMptr использовать без Lo и Hi, то будет так:
LoROMptr and $7FFF + (LoROMptr shr 16) shl 15;
Что удлиняет её.
Об этом:
ЦитироватьLoROMptr.Lo - это младший word пойнтера
LoROMptr.Hi - старший word
Я так понял, что поинтеры тут четырёхбайтовые, тогда проще работать с LongWord, чем с Word. Или тут старший и младший Word'ы расположены как-то необычно (в обратном порядке или вообще в разных частях рома)?
Цитата: TrickZter от 02 января 2011, 12:16:21
Я так понял, что поинтеры тут четырёхбайтовые, тогда проще работать с LongWord, чем с Word.
Не проще.
Цитата: Джинни от 02 января 2011, 19:12:33Если LoROMptr использовать без Lo и Hi, то будет так:
LoROMptr and $7FFF + (LoROMptr shr 16) shl 15;
Что удлиняет её.
Отдельно:
file_offset = LoROMptr.Lo and $7FFF + LoROMptr.Hi shl 15;
А с LongWord - лишние расчёты:
file_offset = LoROMptr and $7FFF + (LoROMptr shr 16) shl 15;
Расположены в роме часто отдельно.
Мда, на одну операцию меньше :)
Только вот не пойму, какую роль играет старший бит младшего Word'а. Судя по формулам, он всегда равен единице.
Да, всегда единице, такая система.
Начали переводить с помощью Kruptar, все супер, но хотелось бы ряд мелочей которые весьма бы облегчили перевод (реально в разы).
Основная проблема - каждый раз нужно контролировать ширину строки. Причем это делается так - переводишь, компилишь (это я так назвал процесс вставки текста в игру и пересчет поинтеров), запускаешь игру и находишь там диалог чтобы проверить не вылезло ли чего.
Тестить в конце-концов то конечно придется все равно, однако чтобы уменьшить количество итераций можно было бы встроить в программу возможность для каждого символа задавать ширину и автоматически считать её для строки. Ну и выводить её около количества символов. Было бы так удобно!
Второе пожелание, которое украсило бы жизнь переводчика - это всем знакомые "метки". Т.е. для каждой строки хотелось бы уметь выставлять "цветовую" метку, при этом слева от номера строки будет показываться квадратик того цвета который был выбран.
Было бы классно отмечать трудные фразы, чтобы можно было бы быстро вернуться к ним (иногда не хочется гробить вечер ради одной фразы, а есть желание закончить большой блок). К тому же такие метки могли бы облегчить работу нескольких переводчиков использующих один проект. Загрузил другой переводчик и сразу видит, где ему ещё работа есть :) В общем область применения большая... Думаю не зря эти метки можно встретить практически везде
Ещё одна идея - кнопка фильтрации "отображать только не переведенные". Нажимаем её - и вуаля - отображаются только те строки на которые ещё не ступала ног... упс, ну думаю понятно о чем я хотел сказать :) Аналогично можно сделать фильтр "по меткам"
И... спасибо за такую замечательную программу Джинни! Может у меня бы хватило терпения вставлять в игру текст полу-автоматическими методами, но это точно бы затянуло перевод на пару лет)
Цитата: inside от 08 ноября 2011, 09:06:24Основная проблема - каждый раз нужно контролировать ширину строки.
К этому советую привыкнуть.
А всякие метки - это интересно.
Цитата: ДжинниК этому советую привыкнуть.
Нууу... есть же блок загрузки таблиц? Таблица ширин по сути аналогичная была бы т.е.
00=0
01=4
...
39=10
3A=8
3B=8
...
FF=0
6 // число без указания байта задает ширину для всех не заданных в таблице символов
...Ну и подсчет ширины строки - банальный цикл, разве сложно сделать? :) Профит реально ощутимый будет. Ускорение перевода как минимум в 2 раза! Наверное для рядового перевода это не ощутимо, но во всяких РПГ чтобы дойти до определенной фразы - нужно порой постараться. Ведь не все фразы доступны. Конечно save-load помогает, но и его нельзя всегда применить.
ps. Сам программист. Были бы сорцы - допилил (все равно пока супруга переводит хакать особо нечего, заставку разве?). Но кто же мне их даст, мечты... :) Или нет?
Всё это понятно и ясно. Просто не собираюсь этого делать. :)
Цитата: inside от 08 ноября 2011, 20:24:11Были бы сорцы - допилил (все равно пока супруга переводит хакать особо нечего, заставку разве?). Но кто же мне их даст, мечты... Улыбка Или нет?
Я могу их дать, но они на Delphi.
Цитата: Джинни от 08 ноября 2011, 12:35:10Я могу их дать, но они на Delphi.
И они без комментариев - без вагона водки не разобраться :D
Цитата: ДжинниЯ могу их дать, но они на Delphi.
Знаком... хотя признаться Delphi - это самое малоизученное для меня. Отправь пожалуйста на insideone #собака# rambler #точка# ru ... Метки мне тоже попытаться сделать или не стоит так глубоко зарываться? (:
Цитата: TriсkZterИ они без комментариев - без вагона водки не разобраться :D
Вот к чему не привыкать - так это к коду без комментариев :) Ведь последние полтора года я работаю PHP-программистом
ps. это я не про свой код пишу, 90% приходится сайты допиливать... ну а с каким кодом приходится иметь дело можно посмотреть например на http://govnokod.ru/php :-|
Иногда бывает так, что проще всё написать с нуля, чем разобраться в чужом коде :) Это я на себе испытал уже)
Цитата: inside от 08 ноября 2011, 17:12:09Вот к чему не привыкать - так это к коду без комментариев Улыбка Ведь последние полтора года я работаю PHP-программистом
Где ж ты был, когда мы сайт писали? Столько добра пропало зря. >:(
Цитата: JurasskPark от 08 ноября 2011, 16:16:05Где ж ты был, когда мы сайт писали? Столько добра пропало зря.
LOL Так надо будет - новое напишем, обращайся :)
Ты сделал бы доброе дело, если бы сломал сайт.
Всегда лучше, когда твой сайт ломает добрый человек, который потом скажет, где дырку залатать.
Можно сломать так, что никакую дыру уже потом и не залатать.
Цитата: ToledO от 10 ноября 2011, 19:40:37
Можно сломать так, что никакую дыру уже потом и не залатать.
А бэкапы на что? :)
Народ, не забывайте одну вещь, что из backup'a хорошо разворачивать то, что 100% неиспорчено.
А если в backup'e уже есть эта проблема, то смысла от него почти нет.
Добавлено позже после небольших раздумий:
Цитата: inside от 08 ноября 2011, 15:24:11Ну и подсчет ширины строки - банальный цикл, разве сложно сделать? Улыбка
Кстати, TriсkZter, ты понял намёк? :)
Цитата: JurasskPark от 10 ноября 2011, 20:18:50Кстати, TriсkZter, ты понял намёк? :)
А чего тут понимать? Операция действительно элементарнейшая :)
Извините, вы длину строки обсуждаете? %)
Цитата: Hatsuyuki от 11 ноября 2011, 00:05:45
Извините, вы длину строки обсуждаете? %)
Нет, ширину... в пикселях. :)
Цитата: Hatsuyuki от 11 ноября 2011, 00:05:45Извините, вы длину строки обсуждаете?
Хочу сделать подсчет ширины (в пикселях) результирующей строки чтобы не проверять каждый раз запуская ром.
Строка -> Заменяем символы по таблице -> Список байтов -> Цикл по байтам -> Найти для каждого байта из массива ширин размер -> Суммируем -> ??? -> Профит
(:
Сложнее все это в интерфейс впихнуть, это окошкодергание ааахххх, WinAPI и то проще, так что не скоро разберусь даже с этим :(
ценителей троллинга
Вообще говоря, в типографике это называется "длиной строки" (line length) и измеряется в миллиметрах (пикселях, пунктах).
(http://slovari.yandex.ru/illustrations/milchin/pictures/milch-192-.jpg)
Цитата: http://slovari.yandex.ru/%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BB%D0%B8%D0%BD%D1%8C%D1%8F%D0%B6/%D0%98%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D0%BA%D0%B8%D0%B9%20%D1%81%D0%BB%D0%BE%D0%B2%D0%B0%D1%80%D1%8C/%D0%9A%D0%B5%D0%B3%D0%BB%D1%8C%20%28%D0%BA%D0%B5%D0%B3%D0%B5%D0%BB%D1%8C%29/К шрифтовому оформлению доп. и вспом. текста объемом более 2000 знаков в изданиях группы А СанПиН предъявляют требования, установленные для осн. текста этих изданий. При К. шрифта в них более 10 п. необходимо, чтобы минимальная длина строки была не менее 3 3/4 кв. (68 мм).
Длину строки определяют, измеряя линейкой одну полноформатную строку на каждой из 10 контролируемых страниц. Отклонение длины строки от установленного санитарными правилами допускается не более чем на 10%.
Англоязычные источники (пока) не привожу %)
А мне, кстати, можно исходники Круптара? Сейчас как проведу аудит кода! Вот только Кнута дочитаю 8)
В программировании длиной строки называют количество символов в ней.
Цитата: Hatsuyuki от 11 ноября 2011, 03:37:07Вообще говоря, в типографике это называется "длиной строки" (line length) и измеряется в миллиметрах (пикселях, пунктах).
Казалось бы, причём тут типография? :D
В программировании это называется шириной строки, про длину тебе Джин уже сказал.
Вот кусок справки из Delphi в качестве доказательства (а то ж не поверишь):
(http://img833.imageshack.us/img833/4880/unled2ema.png)
Речь идёт о графическом представлении текста, поэтому уместно использовать термины типографики ::)
Где определена-то "ширина строки"? В справке VCL?
В более-менее теоретизированных работах по программированию вообще графикой не заморачиваются. Прикладуха проклятая :P
Цитата: Hatsuyuki от 11 ноября 2011, 19:05:37
Речь идёт о графическом представлении текста, поэтому уместно использовать термины типографики ::)
С типографическими терминами иди в другие разделы форума. В программировании (а мы сейчас обсуждаем именно его) это называется шириной. Длиной же называется количество символов в строке.
Цитата: Hatsuyuki от 11 ноября 2011, 19:05:37Где определена-то "ширина строки"? В справке VCL?
В любой нормальной документации по программированию, в том числе и в VCL справке.
Цитата: Hatsuyuki от 12 ноября 2011, 03:05:37Речь идёт о графическом представлении текста, поэтому уместно использовать термины типографики Строит глазки
Есть у тебя string length - количество символов в строке. И string width - ширина области в пикселях, которую занимает строка. Так что какие тут могут быть термины типографики?
А почему нельзя реализовать выдирание текста тупо по поинтерам? Каждый раз писать плагин, где стоп-байт участвует в кодах игры, - занятие весьма сомнительное...
Цитата: Alex от 13 ноября 2011, 21:31:39А почему нельзя реализовать выдирание текста тупо по поинтерам? Каждый раз писать плагин, где стоп-байт участвует в кодах игры, - занятие весьма сомнительное...
Что значит "тупо по поинтерам"? Как по-твоему круптар узнает, что строка закончилась? Если конец строки можно однозначно отличить от исполняемого кода, то круптар и так выдерет всё как надо. Если отличить невозможно, то без спецсредств (плагина или специальной проги) не обойтись.
Цитата: Alex от 13 ноября 2011, 21:31:39Каждый раз писать плагин, где стоп-байт участвует в кодах игры, - занятие весьма сомнительное...
Где ты этот "каждый раз" видел? Круптар умеет выдирать текст из 99.9% игр без всяких дополнительных плагинов.
Цитата: TriсkZter от 13 ноября 2011, 22:32:05Где ты этот "каждый раз" видел?
Из тех проектов, что делал для меня Алекс - это Zelda Ocarina (N64) и Zelda Twilight Princess (GC/Wii).
Вот в твайлайт принцесс, например:
код пиктограммы кнопки,: 1A050000
(стопбайт - 00)
ну и почти во всех кодах "00" есть:
1A06
00003702=<$Count_05>
1A06FF
000000=<$White>
1A06FF
000001=<$Red>
1A06FF000002=<$Green>
1A06FF000003=<$Blue>
1A06FF000004=<$Yellow>
1A06FF000006=<$Purple>
1A06FF000007=<$Silver>
В "Окарине" (стопбайт = 02):
0E
02=[fade:02] (один из параметров времени отображения плашки с текстом, если не ошибаюсь)
13
02=[icon_3] - пиктограмма одного из предметов при его получении.
1E
02=[score_2] - количество очков в одной из мини-игр
Phantom Hourglass (NDS) (стопбайт: 0000):
1A0008FF
00000000={Tag 168}
1A0008FF
00000100={Tag 169}
(и таких кодов штук 200)
Мне еще ни разу не встречалась игра, где стоп-байт не использовался бы в спец. кодах игры.
ЦитироватьЧто значит "тупо по поинтерам"? Как по-твоему круптар узнает, что строка закончилась? Если конец строки можно однозначно отличить от исполняемого кода, то круптар и так выдерет всё как надо. Если отличить невозможно, то без спецсредств (плагина или специальной проги) не обойтись.
Так поинтеры для того и нужны, чтобы указывать длину строки. Вот по этой длине текст и выдирать. Считываем первый поинтер и последующий - получаем длину строки, ну и пошло-поехало :)
Цитата: Anton от 13 ноября 2011, 23:30:55
В "Окарине" (стопбайт = 02):
0E02=[fade:02] (один из параметров времени отображения плашки с текстом, если не ошибаюсь)
1302=[icon_3] - пиктограмма одного из предметов при его получении.
1E02=[score_2] - количество очков в одной из мини-игр
И из-за такой ерунды вы писали плагины? *facepalm* Это никакой не исполняемый код, а обычные спецсимволы. С ними круптар и так умеет корректно работать, надо просто перечислить их в таблице:
0E02=[fade:02]
1302=[icon_3]
1E02=[score_2]
Если так сделать, он не будет считать их стоп-байтами.
В других играх так же можно обойтись составлением нормальной таблицы.
Примерно так:
1A06=<Сolor>
FF000004=<$Yellow>
FF000006=<$Purple>
FF000007=<$Silver>
Если их 200 штук, значит нужно перечислить все 200 - сложного в этом ничего нет.
Цитата: Alex от 14 ноября 2011, 00:56:50Так поинтеры для того и нужны, чтобы указывать длину строки. Вот по этой длине текст и выдирать. Считываем первый поинтер и последующий - получаем длину строки, ну и пошло-поехало :)
Поинтеры нужны для определения
начала строки, определять конец по ним зачастую невозможно.
Во-первых, на одну и ту же строку может ссылаться несколько поинтеров.
Во-вторых, между строк может располагаться исполняемый код (а не то, что вы тут написали), на который тоже есть свои поинтеры.
В-третьих, как ты узнаешь где кончается последняя строка?
Цитата: Alex от 14 ноября 2011, 08:56:50Так поинтеры для того и нужны, чтобы указывать длину строки
Пойнтеры нужны для того, чтобы указывать на то, где строка находится. Длину строки обычно не указывают, а если указывают, то отдельным значением рядом со строкой или рядом с пойнтером.
Цитата: Alex от 14 ноября 2011, 08:56:50Вот по этой длине текст и выдирать. Считываем первый поинтер и последующий - получаем длину строки, ну и пошло-поехало Улыбка
Пойнтеры очень часто не идут по порядку. Редко можно вычислить длину строки таким образом.
Добавлено позже после небольших раздумий:
Цитата: TriсkZter от 14 ноября 2011, 15:10:51С ними круптар и так умеет корректно работать, надо просто перечислить их в таблице:
0E02=[fade:02]
1302=[icon_3]
1E02=[score_2]
Если так сделать, он не будет считать их стоп-байтами.
В других играх так же можно обойтись составлением нормальной таблицы.
Примерно так:
1A06=<Сolor>
FF000004=<$Yellow>
FF000006=<$Purple>
FF000007=<$Silver>
Когда стандартные плагины круптара встречают стопбайт, считывание останавливается, даже если этот байт находится в одном из контрольных кодов.
Вы не можете написать универсальный плагин, который будет понимать, где надо останавливаться, а где не надо, потому что таблица не передаётся плагину как параметр. А если бы передавалась, нужно было бы каждый код проверять при извлечении. В круптаре извлечение идёт отдельно, быстрым циклом плагина, а декодирование по таблице - отдельно, внутри программы.
Цитата: Джинни от 14 ноября 2011, 08:44:26В круптаре извлечение идёт отдельно, быстрым циклом плагина, а декодирование по таблице - отдельно, внутри программы.
Понятно, значит такая фишка не прокатит. *F_DISAPPOINTED*
Я в своих программах делаю иначе: полностью гружу файл в оперативку, после чего декодирую код в текст. Конец строки ищет сама декодирующая функция.
Просто плагины в круптаре предназначены именно для извлечения/декомпрессии строк, чтобы потом их можно было декодировать любой таблицей в самой программе.
Цитата: Джинни от 14 ноября 2011, 09:03:13Просто плагины в круптаре предназначены именно для извлечения/декомпрессии строк, чтобы потом их можно было декодировать любой таблицей в самой программе.
Понятно. А можно сделать плагин с настраиваемым списком исключений? Чтобы он пропускал стоп-байты, которые являются частью комбинаций, входящих в чёрный список? Такой плагин на корню решил бы проблему.
Можно написать плагин, который будет загружать параметры из отдельного файла настроек.
Джинни, можешь рассказать, как правильно парсить kdt-файл в проекте Kruptar 7 с учётом ранних версий?
Пишу кое-какой инструментарий в качестве диплома, хочу добавить возможности экспорта/импорта. :)
8 байт: подпись; // 'KRUPTAR7'
x байт: имя исходного рома; // строка в особом формате
x байт: имя изменяемого рома; // строка в особом формате
4 байта:
Значение первых двух бит:
(0: ANSI кодировка windows по умолчанию;
1: кодировка UTF-16;
2: кодировка SHIFT_JIS;
3: настоящая кодировка указана в следующих 16 битах значения);
Если бит номер 24 значения равен 1, то:
4 байта: флаги проекта; // описание флагов позже
Иначе:
флаги = 0
4 байта: количество таблиц;
Цикл считывания таблиц:
{
x байт: имя таблицы; // строка в особом формате (в кодировке UTF-8, если в комментарии к архиву DOS_FNames = false)
Загрузка таблицы;
}
4 байта: количество групп;
Цикл считывания групп:
{
x байт: имя группы; // строка в особом формате (в кодировке UTF-8, если в комментарии к архиву DOSFNames = false)
загрузка txt файла группы в память;
x байт: имя плагина; // строка в особом формате
4 байта: если не ноль, то:
{
4 байта: максимальный размер слова;
4 байта: номер таблицы;
4 байта: (0: little endian; иначе: big endian);
4 байта: начало отсчёта для кодов таблицы словаря;
4 байта: размер кода таблицы словаря;
4 байта: длина строки;
x байт: строка с первыми байтами, с которых будет начинаться код таблицы словаря;
}
4 байта: количество диапазонов для вставки текста;
массив диапазонов:
{
4 байта: начальный адрес;
4 байта: количество байт;
}
4 байта: количество списков;
Цикл считывания списков:
{
x байт: имя списка; // уникодовая строка в особом формате
4 байта: номер таблицы для декодирования текста;
4 байта: номер таблицы для кодирования текста;
4 байта: номер группы словаря;
4 байта: последняя выбранная строка для отображения в программе;
4 байта: ptStringLength;
4 байта: ptReference;
4 байта: ptPointerSize;
4 байта: ptAlignment (для выравнивания строк при вставке);
4 байта: ptCharSize (1: обычная строка: 2: уникодо-подобная);
4 байта: ptInterval;
4 байта: ptShiftLeft (для сдвига значений пойнтеров);
4 байта:
Если бит 31 равен нулю, то:
{
бит 0: endian (little/big);
4 байта: ptAutoPtrStart (0: ничего; 1: ptReference равен адресу каждого из пойнтеров);
4 байта: ptSplittedPtrs (0: ничего; 1: байты пойнтера находятся в разных местах);
4 байта: ptAutoStart (0: ничего; 1: ptReference равен адресу таблицы пойнтеров);
}
Иначе:
{
бит 0: endian (little/big);
бит 1: ptAutoPtrStart;
бит 2: ptSplittedPtrs;
бит 3: ptAutoStart;
бит 4: ptPtrToPtr (указатель на указатель);
бит 5: ptSeekSame (поиск одинаковых строк при вставке);
бит 6: ptNotInSource (строка не извлекается);
бит 7: загрузка дополнительных значений для вставки;
{
4 байта: ptDestReference;
4 байта: ptDestPointerSize;
4 байта: ptDestStringLength;
4 байта: ptDestAlignment;
4 байта: ptDestCharSize;
4 байта: ptDestAutoPtrStart;
4 байта:
{
бит 0: ptDestSplittedPtrs;
бит 1: ptDestSnesLoRom;
}
}
бит 8: ptSnesLoRom;
}
4 байта: количество "околопойнтерных переменных";
4 байта: количество байт перед пойнтером;
4 байта: количество занимаемых байт после пойнтера;
4 байта: количество занимаемых байт перед пойнтером;
Цикл чтения информации о переменных:
{
x байт: имя переменной; // строка в особом формате
4 байта: (0: после пойнтера; 1: перед пойнтером)
4 байта: тип переменной (0: Byte; 1: Word; 2: ShortInt; 3: SmallInt; 4: LongInt);
4 байта: флаги (бит 0: endian (little/big); бит 1: переменная содержит длину строки);
}
4 байта: количество пойнтеров в списке
Цикл считывания пойнтеров и строк:
{
4 байта: значение пойнтера
4 байта: pnPtrPos
4 байта: pnReference
4 байта:
{
бит 0: pnFixed (0: ничего; 1: пойнтер не изменяется)
Если бит 31 равен 1:
{
4 байта: pnDestPtrPos
4 байта: pnDestReference
}
Иначе:
{
pnDestPtrPos = pnPtrPos
pnDestReference = pnReference
}
}
4 байта: номер таблицы для декодирования строки
4 байта: номер таблицы для кодирования строки
4 байта: длина блока значений переменных
x байт: значения "околопойнтерных переменных"
4 байта: количество строковых элементов в текстовом файле
Загрузка оригинальной строки (строк) из рома с помощью плагина;
Загрузка изменённой строки (строк) из буфера с текстом.
}
} // конец считывания списка
} // конец считывания группы
------------------------------------------------------
Описание строки в особом формате:
1 байт:
если равен единице, то:
4 байта: длина строки
x байт: строка
иначе:
x байт: строка включая первый байт до нуля
------------------------------------------------------
Описание уникодовой строки в особом формате:
2 байта:
если равно единице, то:
4 байта: длина строки
x байт: строка в формате UTF-8
иначе:
x байт: строка включая первые два байт в формате UTF-16 до нуля
------------------------------------------------------
Флаги проекта
бит 0: не показывать в тексте первый в списке CRLF-код
бит 1: не учитывать код окончания строки при создании таблицы словаря
Почему никто не использует тэг код?
Это не код.
Спасибо большое! :)
Не за что :)
Цитата: Джинни от 27 февраля 2012, 11:53:24Это не код.
Зато листать меньше и скопировать текст удобнее. :P
Цитата: JurasskPark от 27 февраля 2012, 18:43:46Зато листать меньше и скопировать текст удобнее. :P
Неудобно, хочется как-то на весь экран это растянуть.
Цитата: Oraculum от 27 февраля 2012, 19:38:34Неудобно, хочется как-то на весь экран это растянуть.
Тогда не используй код. Делов-то.
Цитата: JurasskPark от 27 февраля 2012, 20:16:46Тогда не используй код. Делов-то.
Для большого количества некодового текста неудобно, я про это.
Ещё раз, но по-русски, пожалуйста. Ничего не понял, что ты сказал.
Я имею в виду то, что сообщение Джинна с использованием тега "код" читать неудобно, так как там не код, а текст, и + его много.
Так и не вернул ты нумерацию строк человеческую в обновленном круптаре, Джин...
Ну неужели это так трудно сделать? Дико неудобно без нумерации. Что за нелюбовь к удобному интерфейсу?
Храню у себя версию 7.0.0.85, как реликвию, блин...
У нас был поэтому поводу разговор. Я бы написал то, что Джинни про эту нумерацию строк думает, но думаю обидется. >:D
Да не будет нумерации, сколько можно повторять?:)
Я просто причины не могу понять, почему этого нельзя сделать, а также твоего упорства по этому поводу.
Это что, технически трудно?
Тем более ты как-то говорил, что возможно "такой интерфейс когда-нибудь и вернется".
Нет, это не трудно. Просто мне не до него. Если я обновляю что-то, то обновляю вещи, которые считаю более приоритетными. )))
А я у себя храню как реликвию версию с "синэдитом". И ничего - не жалуюсь ;о)))))))))))))))))))))))))))))
Помогите пожалуйста восстановить файл. Нажал сохранение и через сек.5 задел питание в ноуте. И файл почему-то за 5сек. не успел сохранится...
В общем я через рекавери нашел файл, какой был перед записью, но он не хочет загружаться, пишет Файл "РўРёС,СЂС‹.txt" не найден в файле проекта. Через винрар когда открываю файл, все файлы проекта не повреждены, и проверкой архива тоже ошибок нету. Хз что делать... практически весь текст вставил уже...
Повод сделать проект заново, делая списки вместо групп и нормально переводя. :D
Я вот только-что сам все восстановил хекс редактором. Всем спасибо : ) Я уже так доделаю как есть, и так много времени на все уходит..
Если можно удалите пожалуйста вложение что выше.
[Дата добавления: 27 июля 2012, 19:35:53]
Если у меня в таблице идут буквы
FA00=
FB00=
FC00=
FD00=
FE00=
FF00=
То потом каким кодом удут символы?
Цитата: Voodoo от 27 июля 2012, 03:55:04То потом каким кодом удут символы?
Зачем нужно, чтобы они дальше шли?
В шрифте идут японские символы, вместо них я написал кое какие слова, какие нужно заменить на то, что не влазит нормально в строку.
[Дата добавления: 28 июля 2012, 19:21:24]
Это в крупаторе сортировка не работает, или оно что-то другое должно сортировать?
Джинни, а можно в крупыче относительные поинтеры подключать? Просвяти как. Поинтеры двухбайтные, пример из рома:
/28/22ФРАЗА1/FE /44/22ФРАЗА2/FE /A5/22ФРАЗА3/FE
Цитата: Guyver от 02 августа 2012, 18:25:54Джинни, а можно в крупыче относительные поинтеры подключать? Просвяти как. Поинтеры двухбайтные, пример из рома:
/28/22ФРАЗА1/FE /44/22ФРАЗА2/FE /A5/22ФРАЗА3/FE
Хоть я и не Джинни. Если ты имеешь в виду поинтеры, которые отсчитывают адрес от себя, то есть свойство ptAutoPtrStart, если имеешь в виду что-то другое, поясни.
Адрес отсчитывается от самой первой буквы первого слова в блоке с текстом...
Цитата: Guyver от 02 августа 2012, 19:02:54
Адрес отсчитывается от самой первой буквы первого слова в блоке с текстом...
Ну так в ptReference написать число, которое является (адрес "самой первой буквы первого слова в блоке с текстом") минус (значение поинтера).
Цитата: Guyver от 02 августа 2012, 18:25:54Джинни, а можно в крупыче относительные поинтеры подключать? Просвяти как. Поинтеры двухбайтные, пример из рома:
/28/22ФРАЗА1/FE /44/22ФРАЗА2/FE /A5/22ФРАЗА3/FE
Относительные пойнтеры можно было подключать с самой первой версии программы. Что точно ты имеешь в виду, мне неизвестно. Пример непонятный.
Вот что мне не нравится в крупаторе и удлиняет работу, и думаю другим тоже, может Джинни возмет на заметку :
1. Нельзя выделить все вместе в списке и удалить не нужные поинтеры, а не клацать по одном.
2. Тоже самое нельзя сделать в правой стороне, нельзя удалить быстро выбранные места (там вообще нельзя удалить).
3. При переключении окон с открытыми проектами, проект свертывается, и нужно все время раскрывать и заново ити в нужное место (или искать).
4. Нельзя сразу в листе с поинтерам поменять таблицу всем значениям, нужно клацать пол часа по значению и заменять таблицу.
5. Нельзя просто продублировать группу, или перетащить с одного места в другое.
[Дата добавления: 09 августа 2012, 02:54:28]
И еще слабо видно выделенный объект, былоб неплохо поменять цвет, чтоб бросался в глаза, а то приходится приглядоватся.
Цитата: Voodoo от 09 августа 2012, 02:50:58И еще слабо видно выделенный объект, былоб неплохо поменять цвет, чтоб бросался в глаза, а то приходится приглядоватся.
Цвет выделения меняется в свойствах оформления windows.
не туда написал.. удалите пожалуйста..
Почти первый раз работаю с круптаром.
1) Написал плагин для расжатия текстовых строк и перекодировки, подключил.
2) Строки разбросаны по всему рому (SMD). Поэтому о таблице указателей говорить не приходится. Адрес строки передается в регистр напрямую. Поэтому пока поставил все по нулям;
3) Как теперь добавить данную строку в проект?
Цитата: Dr. MefistO от 10 января 2013, 00:27:18Почти первый раз работаю с круптаром.
1) Написал плагин для расжатия текстовых строк и перекодировки, подключил.
2) Строки разбросаны по всему рому (SMD). Поэтому о таблице указателей говорить не приходится. Адрес строки передается в регистр напрямую. Поэтому пока поставил все по нулям;
3) Как теперь добавить данную строку в проект?
Что мешает переконвертировать в BIN и работать с нормальным ромом?
Я с ним и работаю. Но строки пожаты.
Цитата: Dr. MefistO от 10 января 2013, 00:50:41Я с ним и работаю. Но строки пожаты.
Не в один же блок сжаты. Добавляешь поинтеры по отдельности, удобнее всего загружать список поинтеров из файла (правой кнопкой на List).
Ууу... А я про что?) Вопрос мой прочитай: как добавить отдельно строку (поинтер)? Если можно - в картинках.
Цитата: Dr. MefistO от 10 января 2013, 01:05:06
Ууу... А я про что?) Вопрос мой прочитай: как добавить отдельно строку (поинтер)? Если можно - в картинках.
Написал непонятно - сам виноват. :P
Спойлер
(http://s019.radikal.ru/i626/1301/d9/975b75870bc9.png)
Oraculum, >:D Какие поинтеры? Какие адреса указывать? Какие параметры на группу и т.д.? Конкретики, плиз.
Цитата: Dr. MefistO от 10 января 2013, 01:12:29Oraculum, >:D Какие поинтеры? Какие адреса указывать? Какие параметры на группу и т.д.? Конкретики, плиз.
Пойнтеры найди сначала все в роме, сформируй их список в текстовом файле, потом используй в круптаре.
Параметры:
ptPointerSize = 4 вероятнее всего
ptBIG_ENDIAN = true
А указатель, получается, будет на то место, где он передается в регистр?
Я пытаюсь добавить диапазон поинтеров тех, которые есть в одной таблице. Жму
1) Добавить поинтеры в созданной группе. Вылезает окошко начального и конечного адреса. Пытаюсь вводить в хексе - пишет, что неправильное десятичное значение. Пытаюсь в дек - вылетает.
Цитата: Dr. MefistO от 10 января 2013, 13:39:32А указатель, получается, будет на то место, где он передается в регистр?
Указатель будет на строку (=адресу строки), в хекс-редакторе код глянешь и увидишь свои указатели. Запишешь адреса всех указателей в файл и загрузишь в Круптар.
Цитата: Джинни от 10 января 2013, 04:48:15ptPointerSize = 4 вероятнее всего
ptBIG_ENDIAN = true
Добавлю:
ptPointerSize = 2
ptBIG_ENDIAN = true
ptAutoReference = true
Это для тех, что не табличные ты мне говоришь, но они все равно четырехбайтные на сеге. Почему двухбайтные ты мне говоришь?
А если есть указатели, которые сгруппированы в таблицу, какие параметры надо?
Вопросов больше нет.( Я вроде написал, что работаю считай первый раз в круптаре, а вы мне пишете, как уже умеющему работать. Отсутствие справки и старая статья знаний не прибавляют.
Цитата: Dr. MefistO от 10 января 2013, 14:25:38Вопросов больше нет.( Я вроде написал, что работаю считай первый раз в круптаре, а вы мне пишете, как уже умеющему работать. Отсутствие справки и старая статья знаний не прибавляют.
Да писать надо понятно, что тебе конкретно надо, блин.
Цитата: Dr. MefistO от 10 января 2013, 14:14:50Почему двухбайтные ты мне говоришь?
Бывают 4-байтные, бывают 2-байтые.
Смотрю, ты к сообщению ещё добавил.
Цитата: Dr. MefistO от 10 января 2013, 13:39:32Я пытаюсь добавить диапазон поинтеров тех, которые есть в одной таблице. Жму
1) Добавить поинтеры в созданной группе. Вылезает окошко начального и конечного адреса. Пытаюсь вводить в хексе - пишет, что неправильное десятичное значение. Пытаюсь в дек - вылетает.
Если пишешь в хексе, то вроде надо h
на конце (позже попр.). Вводить адреса первого и последнего поинтеров.
Пробовал - то же самое пишет.
Ты мы мог бы по удаленному доступу показать - я все поясню. Войди в аську, там поговорим. Ок?
h вначале надо писать
Разобрался как отлаживать. Но от ошибки избавиться не могу. Почему-то вылетает даже на шаблонном куске кода из плагина NULL. Вот здесь:
With Result^.Add^ do
begin
P := Addr(ROM^[X]);
В общем, выяснил, что летит при получении байта из потока в функции Function GetStrings(X, Sz: Integer): PTextStrings; stdcall;:
B := ROM^[X]; //B - Byte
(http://rghost.ru/42886485/image.png)
Отладчик, в данном месте при наведении на ROM^[X] показывает находящийся там байт, но присвоение не происходит - идет вылет.
Вылетает, потому что параметры пойнтеров неправильные указаны и сами пойнтеры.
Исправил предыдущий пост, почитай.
Потому что пытается читать за пределами рома, так как параметры пойнтеров указаны неверно. А это место не выделено в памяти.
(http://rghost.ru/42886653/image.png)
На скрине в X - как раз смещение начала текста - оно считано по поинтеру. Размер тоже правильный - однобайтный. Так что я не знаю, что не так.
В роме именно этот байт по этому смещению и лежит:
(http://rghost.ru/42886723/image.png)
За пределами рома оно не может читать, т.к. есть проверка в плагине. Писано не мной ведь)
If (X >= RomSize) or (X < 0) then Exit;
[Дата добавления: 10 января 2013, 20:11:10]
Дело было в размере массива ROM. Там макс ширина стояла WORD. Я растянул до 1MB.
В аське меня найди 475891500.
Объясню всякие мелочи, типа менюшечек и общих принципов работы в Круптаре.
Спрашивать на форуме всё подряд не стоит. ;)
Кстати, тут вспомнил кое-что)
Если обрывание строки у нас $D3.
Есть Мте( или прочее) E5D3 = 'blablabla'
То он строку обрывает после этого мте, и не показывает дальше текст после E5D3
Это да. В таких случаях свой плагин нужен.
у меня такая проблема..... поинтеры ссылаются на поинтеры, а уже они на текст. и такая же беда с графикой, какой программой можно так же красиво, как круптаром, графику "каталогизировать" ))) ?
00000000 01 02 03 40 ...
...
01020340 22 33 44 50 10 .... тут 10 это длинна в символах
...
22334450 A B C E X Y T % F D 00
можно ли круптаром "достать" текст из таких "двухуровневых" поинтеров?
Если пойнтеры такого же формата, как те, которые на них ссылаются, то в круптаре есть свойство ptPtr2ptr.
и первый и второй поинтеры Long, т.е. 4 байта. но рядом со вторыми, которые непосредственно на текст указывают, есть длинна строки. пошел пробовать
а что можно сделать во избежание
Test des fonctions
sous contr?le/00
{END}
/00/00
{END}
/00/00
{END}
/00/00
{END}
/00Checking control
functions/00
{END}
/00/00
{END}
/00Selbsttest
laufend/00
{END}
больше всего, мне не нравится
/00Checking control
functions/00
т.е. Kruptar очень сильно любит нечетные адреса начала строки. и "рубит" строку по первому же 00 00, очень хотелось бы... чтобы сам текст был до первого 00 00, а длинна строки соответствовала последнему, т.е. до начала следующей
[Дата добавления: 07 июля 2013, 19:30:30]
собственно, сам дамп
54 00 65 00 73 00 74 00 20 00 64 00 65 00 73 00
20 00 66 00 6F 00 6E 00 63 00 74 00 69 00 6F 00
6E 00 73 00 0D 00 73 00 6F 00 75 00 73 00 20 00
63 00 6F 00 6E 00 74 00 72 00 F4 00 6C 00 65 00
00 00 00 00 00 00 00 00 43 00 68 00 65 00 63 00
6B 00 69 00 6E 00 67 00 20 00 63 00 6F 00 6E 00
74 00 72 00 6F 00 6C 00 0D 00 66 00 75 00 6E 00
63 00 74 00 69 00 6F 00 6E 00 73 00 00 00 00 00
53 00 65 00 6C 00 62 00 73 00 74 00 74 00 65 00
73 00 74 00 0D 00 6C 00 61 00 75 00 66 00 65 00
6E 00 64 00 00 00 00 00
[Дата добавления: 08 июля 2013, 01:55:05]
можно узнать, что значат эти параметры, начиная с 3его
При компиляции любого плагина в Delphi XE2 в Круптаре часто выскакивает "Invalid pointer operation".
Из Needs.pas:
destructor TTextStrings.Done;
var
N: PTextString;
begin
while Root <> NIL do
begin
N := Root^.Next;
Root^.Str := '';
Dispose(Root);
Root := N;
end;
Count := 0;
Cur := NIL;
end;
Поменял из интереса "Root <> NIL" на "Root^.Next <> NIL", ошибка не выскакивает, но, естественно, утекает память.
Почему так? *SCRATCH*
Тут не про эту ситуацию?
Цитата: http://delphi.about.com/od/objectpascalide/l/aa103003b.htmThe "Invalid pointer operation" exception only occurs when a module attempts to free the last allocated block of another module's free list, and, failing to recognize an invalid element, attempts to merge the free block with (what seems to be) a marker element (or might simply be garbage), which causes the error.
Сложности с написанием плагина? Блин я бы помог если бы хоть немного шарил((
Может, ещё это поможет:
Цитата: http://edn.embarcadero.com/article/33416#28ChangedBehaviourFrom the above notes it should be clear that the new memory manager is less tolerant of heap corruption bugs caused by the application. The upside to this is that this should make it easier to catch bugs during the development cycle. The downside being that it could make life more frustrating for customers having to use an application containing such bugs.
The old memory manager that was used by Delphi 2005 (and earlier Delphi versions) is available on CodeCentral in the form of a replacement memory manager module. This module may be useful in comparing the performance of the old and new memory managers, and can also be used in cases where the behaviour of the old memory manager is desired above the behavior of the new one.
Можно старый менеджер памяти попробовать, если не хочется возиться с поиском возможного бага ::)
Цитата: greengh0st от 26 октября 2013, 17:45:13Сложности с написанием плагина? Блин я бы помог если бы хоть немного шарил((
После более внимательного прочтения поста Оракулума мне кажется, что сложности с миграцией на новую версию ;)
Цитата: Hatsuyuki от 26 октября 2013, 17:55:34From the above notes it should be clear that the new memory manager is less tolerant of heap corruption bugs caused by the application.
Склоняюсь более к этому, т.к.
Цитата: Oraculum от 26 октября 2013, 16:42:28Поменял из интереса "Root <> NIL" на "Root^.Next <> NIL", ошибка не выскакивает, но, естественно, утекает память.
Цитата: Hatsuyuki от 26 октября 2013, 17:55:34Можно старый менеджер памяти попробовать, если не хочется возиться с поиском возможного бага ::)
Не хочу возиться с пробованием старого менеджера. :D
[Дата добавления: 26 октября 2013, 18:38:16]
Дружно проверяем код на возможные ошибки :) :
PTextStrings = ^TTextStrings;
TTextStrings = object
Root, Cur: PTextString;
Count: LongInt;
constructor Init;
function Add: PTextString;
function Get(I: LongInt): PTextString;
destructor Done;
end;
constructor TTextStrings.Init;
begin
Root := NIL;
Cur := NIL;
Count := 0;
end;
function TTextStrings.Add: PTextString;
begin
New(Result);
If Root = NIL then Root := Result Else Cur^.Next := Result;
Cur := Result;
Inc(Count);
Result^.Str := '';
Result^.Next := NIL;
end;
destructor TTextStrings.Done;
var
N: PTextString;
begin
while Root <> NIL do
begin
N := Root^.Next;
Root^.Str := '';
Dispose(Root);
Root := N;
end;
Count := 0;
Cur := NIL;
end;
После ещё более внимательного чтения понял, что дело, похоже, не в коде Оракулума :-[
Цитата: Oraculum от 26 октября 2013, 16:42:28любого плагина
И сам Круптар, и стандартные плагины написаны Джинни. Тугодум я ;D
[Дата добавления: 26 октября 2013, 18:42:21]
Цитата: Oraculum от 26 октября 2013, 18:26:36Дружно проверяем код на возможные ошибки
А ошибка точно локализована там? Может, она в исходниках Круптара, которые всем подряд не дают :P
Цитата: Hatsuyuki от 26 октября 2013, 18:40:25
Цитата: Oraculum от 26 октября 2013, 18:26:36Дружно проверяем код на возможные ошибки
А ошибка точно локализована там? Может, она в исходниках Круптара, которые всем подряд не дают :P
Я и не писал, что она там. Я написал: "Дружно проверяем код на
возможные ошибки".
И чего, чего, чего готов!!!!))))????
Просмотрел. Ошибок в синтаксисе не нашёл. Так что ошибка наверное где-то в логике, но я не вижу :)
Может, проблема в том, что делается Dispose конечного элемента в тот момент, когда на него ещё указывает Cur? Может, так делать запретили, чтобы было меньше ошибок?
Цитата: Hatsuyuki от 26 октября 2013, 23:18:14Может, проблема в том, что делается Dispose конечного элемента в тот момент, когда на него ещё указывает Cur? Может, так делать запретили, чтобы было меньше ошибок?
Не помогло.
Качаю Delphi 7. *F_SMOKE*
Жаль, что не помогло. Больше в приведённом коде ничего усмотреть не могу. Да и не мог Джинни накосячить в таком простом месте, наверное. А ты и Круптар пересобирал в новой версии или только плагины? :)
Цитата: Hatsuyuki от 27 октября 2013, 01:54:29А ты и Круптар пересобирал в новой версии или только плагины? :)
Исходников Круптара у меня нет. Только плагин NULL и переписанный мной под FM3 плагин NULL.
А библиотеки, собранные в новых версиях, часто совместимы с приложениями, собранными в старых? Я с такими ситуациями не сталкивался, поэтому интересно узнать на будущее :)
Думал, что это Трикстер согласился с ФМ3 помочь. Всё оказалось гораздо проще. Закабалили нас ;D
Не он вроде не умеет писать плагины. Хотя я могу сильно ошибаться, но он редко появляется, а какой хакер)))
Лучше взять старый менеджер памяти, я думаю.
Цитата: greengh0st от 28 октября 2013, 00:51:14Не он вроде не умеет писать плагины. Хотя я могу сильно ошибаться, но он редко появляется, а какой хакер)))
Ну, библиотеку на Delphi Трикстер в состоянии написать, полагаю. Именно Круптар он, может, и не разбирал :)
Джинни, очень удачно в Круптаре используется моноширинный шрифт. Сейчас выравниваю пробелами и не надо каждый скрин проверять. Сам бы, наверное, долго до такого додумывался *F_COOL*
(http://magicteam.net/forum/index.php?action=dlattach;topic=21.0;attach=1811)
Может быть, у тебя уже спрашивали про следующую возможность. В Notepad++, например, отображается количество выделенных
байтов. По-моему, было бы здорово, если бы в Круптаре отображалось количество выделенных
символов. Если бы развитие Круптара продолжилось, то эта фича
не была бы добавлена из-за:
а) сильного влияния на быстродействие?
б) сложности имплементации?
в) вредности? ;D
(http://magicteam.net/forum/index.php?action=dlattach;topic=21.0;attach=1813)
Да сам пользуюсь таким блокнотом и там это удобно очень.
Прочитал, что в Notepad++ 6.4.4 изменили способ подсчёта. Те, кому нужны символы, а не байты, могут обновиться ;)
Цитата: http://notepad-plus-plus.org/download/v6.4.4.htmlChange behaviour: statusbar reports the number of selected characters instead of number of bytes now.
[Дата добавления: 28 октября 2013, 22:19:16]
Вообще, в Notepad++ можно вывести всё сразу, но для этого нужно каждый раз вызывать отдельное окно, что не так удобно: http://sourceforge.net/apps/mediawiki/notepad-plus/index.php?title=Statistics
И там не совсем удачный плагин орфографии.
Всем доброго времени суток. Начал писать плагин, для перевода, и появилась пара вопросов. Как получить символ из загруженной строки в плагине (именно символ который в текстовом файле, а не его выходной код из таблицы). И как записывать коды полученные из внешнего файла в выходной поток. Просто документации на Круптар почти нет, поэтому и вопросы. Если не сложно подскажите, пожалуйста.
В плагине нет доступа к символам из таблицы. Можно декодировать исходные данные представив одни коды другими кодами. Потом программа транслирует коды в читабельный текст с помощью таблиц.
Как писать плагины, подробно рассказано здесь:
http://magicteam.net/?page=documents&show=Написание плагинов для Kruptar 7 (http://magicteam.net/?page=documents&show=%D0%9D%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%BB%D0%B0%D0%B3%D0%B8%D0%BD%D0%BE%D0%B2%20%D0%B4%D0%BB%D1%8F%20Kruptar%207)
Я уже понял, что нельзя получать символы в плагине, но спасибо за ответ. У меня теперь другая проблема, более труднорешаемая. Нужно немного изменить SeekSame, чтобы поиск велся не только одинаковых строк, но и частей строк (например одна строка "мама мыла раму", а вторая "мыла раму"). И по аналогии с оригинальным SeekSame строка не записывалась бы отдельно, а высчитывался бы поитнер на вторую строку = длинна строки 1 минус длинна строки 2 плюс адрес начала строки 1. Решил изменить код Круптара и столкнулся с трудностями. Версия 7.2.1.30 компилируется, но там какая то беда с поинтерами, возможно из-за ошибки в строке procedure PointersSortActionUpdate(Sender: TObject), скрин в аттаче (1). А версия 7.1.1.24 не компилируется из-за отсутствия функции WideFileNameToAnsi, в каком то модуле, и еще пара ошибок в аттаче (2,3). Помогите, пожалуйста, исправить ошибки и скомпилировать, или может быть есть исходники, которые можно спокойно компилировать, наример Версий 7.1.1.10-7.1.1.17.
Репозиторий обновлён. Теперь собирается на Delphi 7 без проблем. Нужно открыть Kruptar7.bpg собрать и установить компоненты TntUnicodeControls_D7, MyLib, KruptarComponentsD7, LocalizerControls.
Сборка на Delphi XE7 неправильно работает из-за нового формата строк, я думаю.
Теперь компилируется нормально, спасибо большое. Только вот Круптар в этой версии после пересчета строки записывает не по порядку, а в разнобой (адрес присваивается странно). Так и должно быть да?
Да, так и должно быть. Там особый вид сортировки.
Из-за этой особенности я в своё время отказался от новой версии Круптара. :)
А не у кого не осталось исходников более старых версий Круптара? Просто в этой у меня проекты не сохраняются, а старые версии уже скомпилированные немного не подходят, нужно кое-что изменить.
В репозитории все версии.
Спасибо за помощь, разобрался)
Сам уже разобрался. Вопрос снимается.
Вопрос по последнему круптару, можно ли что-то сделать чтобы он пересчитывал пойнтеры последовательно? А то, после пересчёта, у меня строки в блоках разбросаны рандомно а так же таблица указателей разбросана. Пойнтеры 2-ух байтные, самый первый 0000, а при пересчёте 37A4, а после него уже ит 2239 (как пример). В общем таблица уже не по позростанию получаеться
FoX написал руководство к Круптару на форуме "Шедевра" (об этом давно знаете, наверное).
Я сверстал это все в один PDF, чтобы это выглядело цельным документом. Можете (нужно!) разместить тут на Мэджике, если хотите. )
Выложил у себя, забирайте: http://shedevr.org.ru/zelda64rus/downloads.html#text
Приеду из командировки и добавлю на сайт. Если никто не опередит меня. :)
Пока добавлял новость и вспоминал как это делать (http://magicteam.net/index.php?page=news (http://magicteam.net/index.php?page=news)), нашёл баг в админке. ;D