|
Lancelot
Пользователь Регистрация: Окт. 2004
Всего: 8 сообщений
|
Я тут подумал, а нельзя ли изменить навык "Ловушки" или он прошит в движок? Есть ли возможность изменить его так - что когда используешь его на себя, под игроком появляется ловушка. Которую гипотетически можно будет использовать для минирования врагов бегущих на чузена.
|
Отправлено: 16:34 - 6 Апр., 2005
|
|
|
Tehnokrat
Модератор
Откуда: Новосибирск Регистрация: Окт. 2003
Всего: 489 сообщений
|
Вообще-то ловушки наступательного (ногой наступательного ) действия ставятся в редакторе карт и во время игры поставлены быть не могут. Но с помощью скриптов можно сделать нечто подобное, однако гиммор ещё тот... хотя лично я не пробовал.
----- Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.
|
Отправлено: 23:59 - 6 Апр., 2005
|
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Можно. Достаточно немного включить воображение. Я просто когда-то об этом думал, да руки не дошли. Может потом возьмусь. А идея довольно проста. Что нам мешает создавать не spatial script, а обычный предмет. Сделать его вид на земле под вид ловушки. Обозначить спец. действия (при попадании перс. в радиус уничтожать объект и производить взрыв). В инвентарь не класть, можно придумать что-нибудь. Как устанавливать тоже можно придумать.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 11:48 - 7 Апр., 2005
|
|
Tehnokrat
Модератор
Откуда: Новосибирск Регистрация: Окт. 2003
Всего: 489 сообщений
|
А ещё предупреждать чузена при приближении к ловушке, проверять навык "Ловушки" при попытке разминирования и соответственно реагировать на это действие. Теоретически выглядит неплохо, осталось только придумать наилучший способ установки и маскировки.
----- Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.
|
Отправлено: 23:33 - 7 Апр., 2005
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Цитата:
Можно. Достаточно немного включить воображение. Я просто когда-то об этом думал, да руки не дошли. Может потом возьмусь. А идея довольно проста. Что нам мешает создавать не spatial script, а обычный предмет. Сделать его вид на земле под вид ловушки. Обозначить спец. действия -при попадании перс. в радиус уничтожать объект и производить взрыв). В инвентарь не класть, можно придумать что-нибудь. Как устанавливать тоже можно придумать.
Интересует как вычислить этот "радиус" и нанести любому критеру в его пределах повреждения, если ловушка радиоуправляемая, а тогда ведь critter_dmg(source_obj, random(10, 40), 0 bwor 256 bwor 512); не прокатит.
|
Отправлено: 8:39 - 20 Янв., 2006 | ИСПРАВЛЕНО: Dar - 8:41 - 20 Янв., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Да, главной проблемой станет вычисление всех объектов, которым надо наносить дамаг. В принципе, функции перебора в Фоле есть. Но десять раз в секунду... Это будет слайдшоу .
|
Отправлено: 13:12 - 20 Янв., 2006
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Так все таки можно подробнее? Я попытался так: variable pid_Critter := 16777216; variable N := 0; ................ ................ while (N < 473) do begin pid_Critter := pid_Critter +1; IF (tile_distance_objs(self_obj, tile_contains_pid_obj(tile_num(self_obj), dude_obj, pid_Critter)) <= 6 ) then begin critter_dmg(tile_contains_pid_obj(self_obj, dude_obj, pid_Critter), random(80, 200), 0 bwor 256 bwor 512); end IF (tile_distance_objs(self_obj, tile_contains_pid_obj(tile_num_in_direction(tile_num(self_obj), 0, 1), dude_obj, pid_Critter)) <= 6 ) then begin critter_dmg(tile_contains_pid_obj(self_obj, dude_obj, pid_Critter), random(80, 200), 0 bwor 256 bwor 512); end IF (tile_distance_objs(self_obj, tile_contains_pid_obj(tile_num_in_direction(tile_num(self_obj), 1, 1), dude_obj, pid_Critter)) <= 6 ) then begin critter_dmg(tile_contains_pid_obj(self_obj, dude_obj, pid_Critter), random(80, 200), 0 bwor 256 bwor 512); end IF (tile_distance_objs(self_obj, tile_contains_pid_obj(tile_num_in_direction(tile_num(self_obj), 2, 1), dude_obj, pid_Critter)) <= 6 ) then begin critter_dmg(tile_contains_pid_obj(self_obj, dude_obj, pid_Critter), random(80, 200), 0 bwor 256 bwor 512); end IF (tile_distance_objs(self_obj, tile_contains_pid_obj(tile_num_in_direction(tile_num(self_obj), 3, 1), dude_obj, pid_Critter)) <= 6 ) then begin critter_dmg(tile_contains_pid_obj(self_obj, dude_obj, pid_Critter), random(80, 200), 0 bwor 256 bwor 512); end IF (tile_distance_objs(self_obj, tile_contains_pid_obj(tile_num_in_direction(tile_num(self_obj), 4, 1), dude_obj, pid_Critter)) <= 6 ) then begin critter_dmg(tile_contains_pid_obj(self_obj, dude_obj, pid_Critter), random(80, 200), 0 bwor 256 bwor 512); end IF (tile_distance_objs(self_obj, tile_contains_pid_obj(tile_num_in_direction(tile_num(self_obj), 5, 1), dude_obj, pid_Critter)) <= 6 ) then begin critter_dmg(tile_contains_pid_obj(self_obj, dude_obj, pid_Critter), random(80, 200), 0 bwor 256 bwor 512); end N := N + 1; end ........... Но эффекта ни какого в смысле урона критерам. Где я затупил? PS Взрывчатка - это анимированный сценари обьект.
|
Отправлено: 23:40 - 20 Янв., 2006 | ИСПРАВЛЕНО: Dar - 23:41 - 20 Янв., 2006
|
|
Wasteland Ghost
Маленькое Злое Привидение
Откуда: Россия, Самара Регистрация: Дек. 2002
Всего: 2251 сообщение
|
Название темы изменено на более подходящее.
|
Отправлено: 10:05 - 21 Янв., 2006
|
|
Dar
Пользователь
Откуда: Воронеж Регистрация: Дек. 2004
Всего: 289 сообщений
|
Радиоуправляемая взрывчатка: нанесение повреждений.:) Самые интересные моменты. Первое никаких +199, -199 -1,+1 -200, +200 и других при вычислении тайла. только (tile_num_in_direction((tile_num(self_obj)), X, Y))!!! Пример: if ( tile_contains_obj_pid((tile_num_in_direction((tile_num(self_obj)), 0, 1)), elevation(self_obj), pid_Critter_2) == true ) then begin critter_dmg(tile_contains_pid_obj(tile_num_in_direction((tile_num(self_obj)), 0, 1), elevation(self_obj), pid_Critter_2), random(1000, 5000), 6 bwor 256 bwor 6); give_exp_points(500); display_msg("Yes, +500 exp"); end и так на все направления от 0 до 5 включительно и потребный радиус. Второе нужно что перебор вариантов(Pid критеров ) шел быстро. Примечание:( у меня с радиус в три гекса) Можно конечно critter_p_proc - хотя она слабовата заметно для 800 разных пидов на с обсчетом только одного гекса, но при этом вы можете Сделать разную по времени проигрыша анимацию. Взрываться кролики будут немного не одновременно - но на мину пойдет. +++ -сы вы эту мину сможете растреливать(сам не пробывал, но критер-мина кажется мне реальной). procedure timed_event_p_proc - не наш выбор жутко медленно максимальная скорость один тик: add_timer_event(self_obj, 1, 1); при add_timer_event(self_obj, 0, 1); или add_timer_event(self_obj,1/X, 1) мапер вешает систему почти намертво ( ну диспечер я могу вызвать(в WIN2000про)но бестолку его вызов) и остается и тогда "Cемь бед один ответ - Reset". Что ж пойдем другим путем. Пример. procedure tile_damage_1 begin /* if ( tile_contains_obj_pid(tile_num(self_obj), elevation(self_obj), pid_Critter_2) == true ) then begin critter_dmg(tile_contains_pid_obj(tile_num(self_obj), elevation(self_obj), pid_Critter_2), random(1000, 5000), 6 bwor 256 bwor 6); give_exp_points(500); display_msg("Yes, +500 exp"); end */ if (pid_Critter_2 == 16777500) then begin set_local_var(2, 0); set_local_var(3, 0); pid_Critter_2 :=0 ; add_timer_event(self_obj, 2, 2); end else if (pid_Critter_2 < 16777500) then begin set_local_var(3, pid_Critter_1 + 1); pid_Critter_2:= pid_Critter_1 + pid_Critter; display_msg("T_1N=" + pid_Critter_2); call tile_damage_1; end end т.е самовызов процедуры - ух скорость перебора такова что непозволяет в итоге сделать скриншот т.е уменя есть скриншоты до и после - но нет самых красивых "в процессе". Заметим что максимальный PID в 16777500 (диапазон от 16777217 до 16777500 включительно ) не случаен а именно я не смог в рамках одной процедуры взять значение большее 16777558 - обычно стоп происходит на 16777555. Ладушки создаем procedure tile_damage_2 begin end Вызываем ее из procedure tile_damage_1 и обламываемся. Мы неизбежно упремся в стоп на 16777555-16777558 Pid. [далее следует самая непреводимая игра слов в любом спектре] Я разрулил это так из procedure tile_damage_1 вызываем procedure timed_event_p_proc через add_timer_event(self_obj, 8, 2); (восемь тиков это не обязательно) из нее промежуточную из промежуточной уже tile_damage_2 в двух процедурах между tile_damage_1 иtile_damage_2 обнулял var-ы. Пример: if (fixed_param == 2) then begin rm_timer_event(self_obj); set_local_var(2, 0); set_local_var(3, 0); pid_Critter_2 :=0 ; call dinamit_destroy; у меня промежуточная и дестрояшая ОбьекТ. Возможно вторая промежуточная не нужна и достаточно только procedure timed_event_p_proc - не проверял. Но вот наоборот без первой вызываемой add_timer_event(self_obj, 8, 2); то есть с вызовом напрямую второй(там обнуляем вары), а затем procedure tile_damage_2 облом, также облом при попытке обнулить в рамках одной процедуры. и тогда мы преспокойно досчитаем уже от 16777500 до 16777800, а может и побольше - не пробывал. Вот такой вот шаманизм. :-)
|
Отправлено: 10:29 - 25 Янв., 2006 | ИСПРАВЛЕНО: Dar - 10:32 - 25 Янв., 2006
|
|
|
|