» TeamX (Архив Форума)«


Форум TeamX » Исследования » Наработки за неделю (Оптом)

Переход по темам
<< Пред. След. >>
Единственная страница этой темы

 
Raven
Пользователь

Откуда: Владик
Регистрация: Февр. 2004

Всего: 408 сообщений

А вот кому свежих функций (IDA Pro - сказка, даже для такого ламера как я):
-------------------------------------
skill_contest [3];
sfx_build_scenery_name [3];
sfx_build_ambient_name [1];
sfx_build_interface_name [1];
sfx_build_item_name [1];
sfx_build_open_name [2];
int roll_dice [2];
int reaction_influence [3];
make_daytime [0];
game_time_in_seconds [0];
void addbuttonflag [2];
void addregionflag [2];
void addregionrightproc [3];
void addbuttonrightproc [3];
-------------------------------------
Кста, среди статсов Чуза есть и reaction [-20;20].

По поводу скриптинга айтемов. Нашёл следующее (логически, естественно):
-------------------------------------
//protinst_use_item_ proc
switch(obj_item_subtype(item)){
case [0,1,4,6] : display_msg("That does nothing."); break; //proto.msg, line 582
case 2 : return -1; break;
case [3,5] :
 <...>
 //Последовательно пытается юзать объект как:
 //книгу (двиг)
 //flare (двиг)
 //misc item (скрипт)
 //radio == misc item (скрипт)
 //explosive (двиг)
 //как объект с зарядами (двиг)
}
-------------------------------------

Итого: похоже, обрабатывать use можно только для misc-шмоток И оружия. При этом с оружием могут возникать проблемы (возможно, item_m_uses_charges относится как раз к стволам).

Про mapper2.cfg. Возможно, все уже это знают :-), но для меня стало новостью. В [debug] можно поставить заменить mode=environment на mode=log и во время прогона Мапера в debug.log будет писаться всякое интересное. Количество интересного напрямую зависит от стопки флагов:
-------------------------------------
output_map_data_info=1 //дампит список используемых фрм-ок
show_load_info=1 //инфу о процессе инициализации мапера
show_script_messages=1 //копирует вывод display_msg
show_tile_num=1 //? не знаю
-------------------------------------

Кроме log можно пользовать screen и mono. Чего они дают - непонятно. Хотя, mono выбивает Мапер в аут. Так и задумывалось? :-) И, наконец, супер-штука: mode=gnw. При этом в мапере появляется debug-окошко, которое услужливо подсказывает PID каждого кликнутого объекта, номер каждого кликнутого тайла и т.д. и т.п. Удобно - но навязчиво. Его можно перемещать и закрывать, но оно постоянно выскакивает чуть что произойдёт. А что самое интересное - строки вида "Invalid arg 4 given to sayscrollup" при вылете скрипта.

Перки. Найдено методом тупого тыка - просто гонял ИДУ и Фол, смотрел на память и т.д. Обнаружил всё это в окошке "IDA View ESP". Насколько я понял. это содержимое памяти. Откуда, из каких таблиц, по каким смещениям берётся эта инфа я сказать не могу - ламер в этом деле. Абель, Анхорит - объясните, плз, как можно обнаружить местонахождение этих таблиц напрямую в экзешнике.

Теперь - что, собственно, нашёл. Массив структур. Имя - _perk_data. Адресс (в памяти) - 0x0055B5A0. Каждый перк описывается 19-ю dd полями:
1. указатель на строку с именем
2. указатель на строку с описанием
3. 48h (72) для Awarness, +1 для каждого последующего
4. сколько раз можно взять перк
5. минимальный уровень
6. какой стат (STAT_ из define.h) модифицируется (-1=0x0FFFFFFFF ежели никакой)
7. на сколько модифицируется
8. номер скила (SKILL_), если перк завязан на минимальное значение скила (-1 если нет)
9. требуемое значение скила
10. [0/1/2] Если требований по скилам нет - 0. Если требование по одному скилу - 0. Если по двум - 1 или 2, принцип выбора не понял.
11. аналогично 8, ещё один скил
12. аналогично 9
13-19. требования по статсам (13 - Strenght, 19 - Luck)

Число перков (77h) прошито намертво, чеки происходят в огромном количестве процедур. Наличие перков, которые дают не бонус к скилам, а что-нибудь другое, проверяется *напрямую в коде соответствующих процедур*. Например, наличие Bonus HtH attacks (1) и Bonus rate of fire (5) проверяются *при каждом вызове* item_w_mp_cost (вычисляет AP для атаки) и каждый раз от необходимого кол-ва AP честно скручивается по единичке.

Итого: ситуация с перками довольно плачевна. Для добавления своих придётся:
1. обильно патчить двиг, заменяя все эти 77h на нужное значение
2. искать способ добавления новых элементов в массив perk_data

Эта процедура (к счастью, одноразовая) позволит нам в дальнейшем добавлять перки из серии "плюс-к-скилу". Реализация перков с более сложным эффектом потребует модификации двига (т.е. написания ассемблерных вставок в и так не слишком читабельные процедуры). То есть это, мягко говоря, сложнореализуемо. С другой стороны - всё-таки реализуемо: IDA, Hiew и много-много зелёного чая :-)

P.S. Вот та-а-а-акенное спасибище Абелю за mapper_names.idc

Отправлено: 12:28 - 14 Фев., 2005
Ray
Модератор

Откуда: Донецк,Украина
Регистрация: Янв. 2004

Всего: 746 сообщений

>>И, наконец, супер-штука: mode=gnw. При этом в мапере появляется debug-окошко, которое услужливо подсказывает PID каждого кликнутого объекта, номер каждого кликнутого тайла и т.д. и т.п

Штука действительно супер, но вот только PID'ы у меня не показывает. А было бы супер - я уже задолбался их руками считать. (Да, кстати я параметры поставил)

P.S. А вот свитч - это класс. Я надеялся, что от С она осталась, но вот наверняка не знал. Может это где-то и говорилось, но я пропустил. Если нет - то спасибо за инфу.  Теперь будем юзать.

-----
Не бывает невозможных задач – бывает мало времени.

Отправлено: 12:48 - 14 Фев., 2005
Raven
Пользователь

Откуда: Владик
Регистрация: Февр. 2004

Всего: 408 сообщений

>>А вот свитч - это класс

В Фоле нет switch-а! Это я в Си-подобном синтаксисе писал.

Вообще, switch легко организовать:
--------------------------------
variable switch_var;
#define switch(x) switch_var:=x; if(x!=x) then begin display_msg("Bug") else  begin
#define case(x) end if switxh_var==x then begin
--------------------------------

switch(my_var)
case(1) display_msg("One");
case(2) display_msg("Two");
case(3) display_msg("Three");
end

А для показа пидов поставь
show_pid_numbers=1
в секции [mapper] mapper2.cfg.

Отправлено: 12:53 - 14 Фев., 2005
Wasteland Ghost
Маленькое Злое Привидение

Откуда: Россия, Самара
Регистрация: Дек. 2002

Всего: 2251 сообщение

game_time_in_seconds уже описан в ФОП и обновлённой доке:
int game_time_in_seconds - возвращает текущее игровое время (время, прошедшее от начала игры) в секундах
Аргументы:
нет
Возвращаемое значение:
текущее игровое время в секундах

Отправлено: 14:09 - 14 Фев., 2005
 

Переход по темам
<< Пред. След. >>
Единственная страница этой темы


Powered by Ikonboard 2.1.9 RUS
Modified by RU.Board Team
© 2000 Ikonboard.com