|
Aman
Пользователь
Откуда: Киев Регистрация: Апр. 2005
Всего: 208 сообщений
|
По-моему все-таки 1 тик=0,1 сек, 10 тиков = секунда.
----- Ибо логично предположить, что если недостаточно чего-либо для запуска чего-либо, то второе чего-либо, а именно то, для которого не хватает - вообще не должно запускаться. (неизвестный)
|
Отправлено: 18:44 - 26 Фев., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Цитата:
2) Игровой тик = 10 мс. Т.е. 100 тиков = 1 с.
Неверно. В секунде 10 тиков.
|
Отправлено: 18:45 - 26 Фев., 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Спасибо большое. -------------------------------- Пытаюсь организовать в боевом режиме аналог critter_p_proc - чтоб можно было постоянно выполнять определенный блок команд, но вот толи сам корявый то ли: variable st; variable q; procedure combat_p_proc begin if st == 0 then begin st:=1; add_timer_event(self_obj,5,44); отсюда тайм ивент должен добавлятся только при старте боевки так как далее st будет равна 1 и сюда програма заходить не будет end end procedure timed_event_p_proc begin if (fixed_param == 44) then begin q:=q+1; эту и следующую строчку написал для проверки циклится тайм ивент в боевке или нет display_msg("n="+q); add_timer_event(self_obj,5,44); - зацикливание таймивента на себя через каждые 5 тиков *блок команд* как я пологал если сунуть сюда какие то команды то они во время боевки будут переодично выполнятся с установленым в add_timer_event(self_obj,периуд,44) периудом, но на практике выполняется только раз. end end procedure critter_p_proc begin rm_fixed_timer_event(self_obj,44); к_п_п включается как только боевка отключается и потому эту процедуру удобно использовать на остановку зацыкливания тайм ивента после прекращения боевки, заодно тут же нулим переменную st st:=0; end Почему у меня не циклится тайм ивент в боевке? Или тики это игровое а не машинное время, и во время турна они не тикают? А тикают только со сменой турна дискретно? А то у меня q меняется как раз с преходами турнов почемуто.
|
Отправлено: 19:11 - 26 Фев., 2006 | ИСПРАВЛЕНО: Keha - 21:45 - 26 Фев., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
В бою работает только combat_p_proc, емнип.
|
Отправлено: 10:35 - 27 Фев., 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
void AddButtonProc(string btn_name, procedure button_on, procedure button_off, procedure button_press, procedure button_release) - связывает с кнопкой btn_name процедуры для обработки событий Аргументы: btn_name - имя кнопки, например, "test_btn" button_on, button_off, button_press, button_release - имена процедур для обработки наведения, убирания, нажатия и отпускания мыши Можно ли AddButtonProc прилепить к существующим фолаутовским кнопкам? Если можно, то очень интересует названия(btn_name) двух кнопок: 1) левая красная кнопка - изменяет активную руку. 2) кнопка "далее" в открытом инвентаре - которая закрывает окно инвентаря.
|
Отправлено: 15:49 - 27 Фев., 2006 | ИСПРАВЛЕНО: Keha - 15:53 - 27 Фев., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Нет.
|
Отправлено: 16:19 - 27 Фев., 2006
|
|
Mynah
Модератор
Откуда: Пермь Регистрация: Окт. 2004
Всего: 469 сообщений
|
>>В бою работает только combat_p_proc, емнип. Фига:) Таймед евенты работаю тоже. Только странно как-то.
----- Scio me nihil scire
|
Отправлено: 22:01 - 27 Фев., 2006
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
>>Только странно как-то Дык, ход игрока неприкасаем, а остальное струкитурировано по fixed_param(которые для combat_p_proc ). вот они(timer_event) "структурированно" и работают.
|
Отправлено: 0:06 - 28 Фев., 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Тайм ивент в кобмбате работает, проверено на приведенном мной скрипте, правда работает совсем не так, как хотелось бы. Как я понял игра начинает обрабатывать сколько тиков прошло только при нажатии перехода хода. Те тик - это именно игровое время, которое в мирной ситуации тикает непрерывно, а в бою тикает скачками(дискретно) только с нажатием перехода хода. Пока *некст турн* не нажат игровое время замирает и тики не тикают. Было бы уже неплохо, если бы число прошедших тиков было привязано в боевке к числу истраченных экшен пойнтов. Но к сожалению трата экшен пойнтов, на тиканье тиков не влияет, а только *некст турн*. Скорее всего каждый *некст турн* дискретно накидывает к игровому времени определенное число тиков. Чему равно это число в принципе можно попытаться выяснить экспериментально. А из за того что время в тиках меняется дискретно, например если оно меняется с *некст турном* скачком на 10 тиков, то соответственно несколько тайм ивентовых событий из моего скрипта остаются в пролете, и срабатывает только одно из них на каждый турн. Тайм ивент нормально сработает в боевке с часовым механизмом бомб, или каких то аналогичных бомбам ситуаций. Но вот для той задумки, которую я хотел реализовать он не пригоден.
|
Отправлено: 15:18 - 28 Фев., 2006
|
|
Keha
Пользователь Регистрация: Янв. 2006
Всего: 31 сообщение
|
Метод извлечения составных частей из полей прототипа объекта. Возможно кому-то понадобится. Если же данный метод не кому не нужен то пост можно удалить. Если мы хотим получить из прототипа объекта данные какого то определенного поля, то сталкиваемся с тем что proto_data возвращает эти данные в виде числа десятичного формата. А в описании формата файлов прототипов (Формат PRO-файлов Fallout2), поля представлены в виде чисел шестнадцатеричного формата. Причем одним полем - одним шестнадцатеричным числом зашифрованы сразу несколько данных(флагов). Вот способ как из полученного с помощью proto_data десятичного числа получить все эти шестнадцатеричные данные(флаги) по отдельности: dec:= proto_data(int pid, int data_member) flag1:=dec-(dec/16)*16; // последний знак шестнадцатеричного dec flag2:=dec/16-((dec/16)/16)*16; // предпоследний знак шестнадцатеричного dec flag3:=(dec/16)/16-(((dec/16)/16)/16)*16; //третий с конца знак flag4:=((dec/16)/16)/16-((((dec/16)/16)/16)/16)*16; //четвертый с конца знак итд по мат индукции. (Данные формулы работают корректно благодаря тому что в скриптах ssl операция / (деления) является целочисленной) Например мы имеем pid копья, и хотим получить из 7го поля про-файла копья, два флага типов атаки(см Формат PRO-файлов Fallout2): dec:= proto_data(pid копья, 7) flag1:=dec-(dec/16)*16; // Primary Attack Type flag2:=dec/16-((dec/16)/16)*16; // Secondary Attack Type В итоге flag1 станет равным 4ке, что, если сверится с хелпом Формат PRO-файлов, соответствует атаке thrust (колоть); flag2 станет равным 5ке соответствующей атаке throw(метание). Пример куска скрипта, на котором можно проверить работоспособность метода (вставлять в obj_dude_ssl): ----------------------------------------------------------------------- procedure Check_wip; procedure Check_wipon; procedure dec_to_hex; variable wip; // процедура critter_p_proc в obj_dude_ssl уже существует, вам останется вставить в нее //строку call Check_wipon; procedure critter_p_proc begin call Check_wipon; end procedure Check_wipon begin // проверка на изменение экипировки активной руки variable wip1; wip1:=wip; call Check_wip; if not(wip == wip1) then begin display_msg("you ekipirovalis "+proto_data(obj_pid(wip),1)); call dec_to_hex; end end procedure Check_wip begin // запоминание указателя на предмет в активной руке wip:=critter_inven_obj(self_obj,1); if wip == 0 then begin wip:=critter_inven_obj(self_obj,2); end end procedure dec_to_hex begin variable dec; variable at1; variable at2; dec:=proto_data(obj_pid(wip),7); at1:=dec-(dec/16)*16; // использование метода для флага первого типа атаки at2:=dec/16-((dec/16)/16)*16; //для флага второго типа атаки if at1 == 0 then begin display_msg("attack type1 = none"); end else if at1 == 1 then begin display_msg("attack type1 = punch"); end else if at1 == 2 then begin display_msg("attack type1 = kick leg"); end else if at1 == 3 then begin display_msg("attack type1 = swing"); end else if at1 == 4 then begin display_msg("attack type1 = thrust"); end else if at1 == 5 then begin display_msg("attack type1 = throw "); end else if at1 == 6 then begin display_msg("attack type1 = fire single"); end else if at1 == 7 then begin display_msg("attack type1 = fire burst"); end else if at1 == 8 then begin display_msg("attack type1 = fire continuous"); end if at2 == 0 then begin display_msg("attack type2 = none"); end else if at2 == 1 then begin display_msg("attack type2 = punch"); end else if at2 == 2 then begin display_msg("attack type2 = kick leg"); end else if at2 == 3 then begin display_msg("attack type2 = swing"); end else if at2 == 4 then begin display_msg("attack type2 = thrust"); end else if at2 == 5 then begin display_msg("attack type2 = throw "); end else if at2 == 6 then begin display_msg("attack type2 = fire single"); end else if at2 == 7 then begin display_msg("attack type2 = fire burst"); end else if at2 == 8 then begin display_msg("attack type2 = fire continuous"); end end ----------------------------------------------------------------------- Приведенный кусок скрипта в мирном режиме через critter_p_proc и вызываемую из нее Check_wipon постоянно проверяют активную руку на предмет изменения экипировки.( те либо на смену предмета в активной руке, либо на смену самой активной руки). В случае изменения экипировки активной руки приведенный кусок скрипта выводит три сообщения: *вы экипировались +(название предмета) *attack type1 = (тип первой атаки экипированного предмета) *attack type2 = (тип второй атаки экипированного предмета) Могу разъяснить подробней как получаются формулы для flag1, flag2, flag3,... , и все что будет непонятно.
|
Отправлено: 11:23 - 2 Марта, 2006 | ИСПРАВЛЕНО: Keha - 11:48 - 2 Марта, 2006
|
|
|
|