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


Форум TeamX » Тех. поддержка » Скрипты (Все вопросы по скриптингу - сюда)

Переход по темам
<< Пред. След. >>
Страницы этой темы [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ] Все собщения

 
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
 

Переход по темам
<< Пред. След. >>
Страницы этой темы [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 ] Все собщения


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