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


Форум TeamX » Тех. поддержка » Реально ли создать полезного партийца? (сначала думать - потом стрелять и т.п.)

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

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

Откуда: Moscow
Регистрация: Июль 2007

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

хочу создать реально ценного партийца!
возникли следующие вопросы:

========================================
1. В комбате каждый партиец может иметь настройку "стрелять очередями" в диапазоне от "всегда, ибо все пофиг" до "смотри, урод, не задень приключенца". Следовательно, он каким-то образом может понять: собирается ли он сейчас всадить всю обойму дюде в задницу или таки можно палить в белый свет как в копеечку. Также криттеры сами умеют определять - достреливает ли их оружие до врага, или сначала надо подбежать поближе. Следовательно, не такие уж они и дебилы. Поэтому захотелось написать следующую процедуру:

1) партиец определяет, куда он сейчас засадит очередь - врагу в морду или дюде в задницу.
2) если второе - он определяет, есть ли рядом с ним такой гекс, с которого можно попасть именно во врага, без глупостей.
3) если нету - просто старается отойти подальше от дюдя или стреляет одиночными, если эта вероятность не очень велика, или вообще пропускает ход, как вариант - выбирает другую жертву.
4) если есть - шагает на этот гекс.
5) и только теперь партиец стреляет.

если можно - то как она должна выглядеть и куда ее встраивать?

========================================
2. можно ли написать такую процедуру:
get_trophy(who, range, money)

аргументы:
who   = self_obj.
range = максимальная дистанция в гексах для обхода.
money = 1/0 - собирать только деньги или все вообще.

действие: партиец после драки (если можно - то лучше бы он еще и сам определял, что драка закончилась и можно заняться этим делом, без приказа игрока) обходит местность обозначенного радиуса и обдирает все трупешники, вынимая у них из стека все предметы, какие там есть (0) или только деньги и стимпаки (1).
обойдя все трупы, останавливается и говорит (floater) "фсо сабрал, да..."

========================================
3. можно ли написать следующую функцию (процедуру):
stand_near(who, type_obj, pid_obj, range)

возвращает: true/false или еще лучше - tile_num с искомым предметом.

аргументы:
who   = dude_obj, self_obj и т.п.
type  = item, critter, scenery и т.п.
pid   = PID вещи (бильярдный стол, автомат нюка-колы и т.п.)
range = максимальная дистанция в гексах до искомого предмета.

Отправлено: 11:38 - 12 Июля, 2007
binyan
Пользователь

Откуда: Israel
Регистрация: Март 2005

Всего: 292 сообщения

Для начала советую вооружиться туториалом по созданию партийца и документацией по бисовским скриптам. Затем включи воображение, и вперед. У тебя все получится, и ты сам найдешь ответы на свои вопросы. Тем более, я вижу, ты тут выкладываешь отрывки из скриптов, так нафиг спрашивать, можно ли так сделать? Попробуй, и узнаешь.

-----
...выражая озадаченность, граничащую с озабоченностью..

Отправлено: 23:23 - 15 Июля, 2007
JSilver
Пользователь

Откуда: Moscow
Регистрация: Июль 2007

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

я уже "попробовал". в результате скрипт ТАК тормозит, что на обычное нажатие мыши Фаллаут реагирует через несколько секунд. потому что я НЕ ЗНАЮ как грамотно получать информацию, лежит/стоит/растет ли что-то на данном тайле или нет. перебором по всем пидам, а вдруг что-то да есть? спасибо, уже не понравилось. уже хотя бы быстрополучаемая инфа, что гекс пустой - уже изрядно сократила бы безобразие, но я не знаю, как написать такое. а если ты уже, как говоришь, сам понял, что за скрипт я пишу, то уж ответь по существу а не давай карнегевских советов.

есть такая вещь как tile_contains_obj(tile,elev [пид пофиг, сойдет любой]) или ее не существует?

Отправлено: 23:42 - 15 Июля, 2007
Dar
Пользователь

Откуда: Воронеж
Регистрация: Дек. 2004

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

tile_get_next_critter  - возрашает указатель на следующего критера на заданом гексе.
Хотя в том случае я предпочел перебор критеров подряд с тормозами, не помню у меня оно вроде не сработало, не так отладил наверно.

Остальное перебором.

Я писал перебор на все сценари и стены  и пихал в critter_p_proc (он вызывал другие процедуры параллельно, там, емним, я по сто сценари и стен обрабатывал в каждой) и не тормозило, хотя иногда "промахивалось". Но если гексов будет дофига типа штук пятьдесят, то может и не помочь. Не знаю - я пробывал с маленьким числом.

В итоге скрипт определял наличие препятствия и запрешал движение для объекта со скростью дюда.
т.е. д.д бегает к нему привязан объект на растоянии двух-трех гексов. при этом задача для объекта не пролазить в мелкие дырки в один хекс и не втыкаться в стены и сценари. А размер объекта больше, чем нормальный немного.

Хм, нашел скрипт. Вот пара кусков оттуда.

#define RULL_MOVE(pid)  if CAR_HEX_Forward(pid) or CAR_HEX_back(pid) then begin         \        
         stop_signal_for_move_anim := 1;                          \                                      
         end  
         
#define RULL_MOVE_back(pid)  if CAR_HEX_back(pid) then begin       \        
         stop_signal_for_move_anim := 1;                          \                                      
         end                    

procedure critter_p_proc
begin
......................
........................
.......................
................
Call set_plase_walls_obj;
Call set_plase_scenari_obj;
Call set_plase_critter_obj;
...................................
..................................
.................................
end

procedure set_plase_walls_obj
begin

pid_walls_1:=pid_walls_1+1;
IF pid_walls_1 == 50331749 then pid_walls_1:=50331649;
RULL_MOVE(pid_walls_1) else begin


pid_walls_2:=pid_walls_2+1;
//display_msg("set_pid = " + pid_walls_2);
IF pid_walls_2 == 50331849 then pid_walls_2:=50331749;
RULL_MOVE(pid_walls_2) else begin
                     

pid_walls_3:=pid_walls_3+1;
//display_msg("set_pid = " + pid_walls_3);
IF pid_walls_3 == 50331949 then pid_walls_3:=50331849;
RULL_MOVE(pid_walls_3) else begin
                   

pid_walls_4:=pid_walls_4+1;
//display_msg("set_pid = " + pid_walls_4);
IF pid_walls_4 == 50332049 then pid_walls_4:=50331949;
RULL_MOVE(pid_walls_4) else begin
                   

pid_walls_5:=pid_walls_5+1;
//display_msg("set_pid = " + pid_walls_5);
IF pid_walls_5 == 50332149 then pid_walls_5:=50332049;
RULL_MOVE(pid_walls_5) else begin


pid_walls_6:=pid_walls_6+1;
//display_msg("set_pid = " + pid_walls_6);
IF pid_walls_6 == 50332249 then pid_walls_6:=50332149;
RULL_MOVE(pid_walls_6) else begin


pid_walls_7:=pid_walls_7+1;
//display_msg("set_pid = " + pid_walls_7);
IF pid_walls_7 == 50332349 then pid_walls_7:=50332249;
RULL_MOVE(pid_walls_7) else begin


pid_walls_8:=pid_walls_8+1;
//display_msg("set_pid = " + pid_walls_8);
IF pid_walls_8 == 50332449 then pid_walls_8:=50332349;
RULL_MOVE(pid_walls_8) else begin


pid_walls_9:=pid_walls_9+1;
//display_msg("set_pid = " + pid_walls_9);
IF pid_walls_9 == 50332549 then pid_walls_9:=50332449;
RULL_MOVE(pid_walls_9) else begin


pid_walls_10:=pid_walls_10+1;
//display_msg("set_pid = " + pid_walls_10);
IF pid_walls_10 == 50332649 then pid_walls_10:=50332549;
RULL_MOVE(pid_walls_10) else begin


pid_walls_11:=pid_walls_11+1;
//display_msg("set_pid = " + pid_walls_11);
IF pid_walls_11 == 50332749 then pid_walls_11:=50332649;
RULL_MOVE(pid_walls_11) else begin


pid_walls_12:=pid_walls_12+1;
//display_msg("set_pid = " + pid_walls_12);
IF pid_walls_12 == 50332849 then pid_walls_12:=50332749;
RULL_MOVE(pid_walls_12) else begin


pid_walls_13:=pid_walls_13+1;
//display_msg("set_pid = " + pid_walls_13);
IF pid_walls_13 == 50332949 then pid_walls_13:=50332849;
RULL_MOVE(pid_walls_13) else begin


pid_walls_14:=pid_walls_14+1;
//display_msg("set_pid = " + pid_walls_14);
IF pid_walls_14 == 50333049 then pid_walls_14:=50332949;
RULL_MOVE(pid_walls_14) else begin


pid_walls_15:=pid_walls_15+1;
//display_msg("set_pid = " + pid_walls_15);
IF pid_walls_15 == 50333149 then pid_walls_15:=50333049;
RULL_MOVE(pid_walls_15) else begin


pid_walls_16:=pid_walls_16+1;
//display_msg("set_pid = " + pid_walls_16);
IF pid_walls_16 == 50333249 then pid_walls_16:=50333149;
RULL_MOVE(pid_walls_16) else begin


pid_walls_17:=pid_walls_17+1;
//display_msg("set_pid = " + pid_walls_17);
IF pid_walls_17 == 50333349 then pid_walls_17:=50333249;
RULL_MOVE(pid_walls_17)

end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end

procedure set_plase_scenari_obj
begin

pid_scenari_1:=pid_scenari_1+1;
IF pid_scenari_1 == 33554475 then pid_scenari_1:=33554482;
IF pid_scenari_1 == 33554495 then pid_scenari_1:=33554496;
IF pid_scenari_1 == 33554503 then pid_scenari_1:=33554504;
IF pid_scenari_1 == 33554514 then pid_scenari_1:=33554519;
IF pid_scenari_1 == 33554534 then pid_scenari_1:=33554433; // вернулись на начало.
RULL_MOVE(pid_scenari_1) else begin

pid_scenari_2:=pid_scenari_2+1;
IF pid_scenari_2 == 33554573 then pid_scenari_2:=33554574;
IF pid_scenari_2 == 33554638 then pid_scenari_2:=33554560;
RULL_MOVE(pid_scenari_2) else begin

pid_scenari_3:=pid_scenari_3+1;
IF pid_scenari_3 == 33554710 then pid_scenari_3:=33554713;
IF pid_scenari_3 == 33554743 then pid_scenari_3:=33554642;
RULL_MOVE(pid_scenari_3) else begin

pid_scenari_a:=pid_scenari_a+1;
IF pid_scenari_a == 33554915 then pid_scenari_a:=33554747;
RULL_MOVE(pid_scenari_a) else begin

pid_scenari_4:=pid_scenari_4+1;
IF pid_scenari_4 == 33554855 then pid_scenari_4:=33554856;
IF pid_scenari_4 == 33554863 then pid_scenari_4:=33554868;
IF pid_scenari_4 == 33554893 then pid_scenari_4:=33554897;
IF pid_scenari_4 == 33554915 then pid_scenari_4:=33554814;
RULL_MOVE(pid_scenari_4) else begin

pid_scenari_5:=pid_scenari_5+1;
IF pid_scenari_5 == 33554954 then pid_scenari_5:=33554957;
IF pid_scenari_5 == 33554965 then pid_scenari_5:=33554969;
IF pid_scenari_5 == 33554976 then pid_scenari_5:=33554978;
IF pid_scenari_5 == 33555005 then pid_scenari_5:=33555008;
IF pid_scenari_5 == 33555015 then pid_scenari_5:=33554919;
RULL_MOVE(pid_scenari_5) else begin

pid_scenari_6:=pid_scenari_6+1;
IF pid_scenari_6 == 33555022 then pid_scenari_6:=33555023;
IF pid_scenari_6 == 33555033 then pid_scenari_6:=33555036;
IF pid_scenari_6 == 33555044 then pid_scenari_6:=33555045;
IF pid_scenari_6 == 33555073 then pid_scenari_6:=33555017;
RULL_MOVE(pid_scenari_6) else begin

pid_scenari_7:=pid_scenari_7+1;
IF pid_scenari_7 == 33555138 then pid_scenari_7:=33555077;
RULL_MOVE(pid_scenari_7) else begin

pid_scenari_8:=pid_scenari_8+1;
IF pid_scenari_8 == 33555310 then pid_scenari_8:=33555181;
RULL_MOVE(pid_scenari_8) else begin

pid_scenari_9:=pid_scenari_9+1;
IF pid_scenari_9 == 33555322 then pid_scenari_9:=33555323;
IF pid_scenari_9 == 33555375 then pid_scenari_9:=33555377;
IF pid_scenari_9 == 33555383 then pid_scenari_9:=33555386;
IF pid_scenari_9 == 33555395 then pid_scenari_9:=33555401;
IF pid_scenari_9 == 33555417 then pid_scenari_9:=33555318;
RULL_MOVE(pid_scenari_9) else begin

pid_scenari_10:=pid_scenari_10+1;
IF pid_scenari_10 == 33555429 then pid_scenari_10:=33555432;
IF pid_scenari_10 == 33555458 then pid_scenari_10:=33555421;
RULL_MOVE(pid_scenari_10) else begin

pid_scenari_11:=pid_scenari_11+1;
IF pid_scenari_11 == 33555582 then pid_scenari_11:=33555584;
IF pid_scenari_11 == 33555620 then pid_scenari_11:=33555621;
IF pid_scenari_11 == 33555661 then pid_scenari_11:=33555662;
IF pid_scenari_11 == 33555679 then pid_scenari_11:=33555573;
RULL_MOVE(pid_scenari_11) else begin

pid_scenari_12:=pid_scenari_12+1;
IF pid_scenari_12 == 33555716 then pid_scenari_12:=33555725;
IF pid_scenari_12 == 33555745 then pid_scenari_12:=33555762;
IF pid_scenari_12 == 33555770 then pid_scenari_12:=33555771;
IF pid_scenari_12 == 33555804 then pid_scenari_12:=33555687;
RULL_MOVE(pid_scenari_12) else begin

pid_scenari_13:=pid_scenari_13+1;
IF pid_scenari_13 == 33555890 then pid_scenari_13:=33555809;
RULL_MOVE(pid_scenari_13) else begin

pid_scenari_14:=pid_scenari_14+1;
IF pid_scenari_14 == 33555998 then pid_scenari_14:=33555898;
RULL_MOVE(pid_scenari_14) else begin

pid_scenari_15:=pid_scenari_15+1;
IF pid_scenari_15 == 33556040 then pid_scenari_15:=33556051;
IF pid_scenari_15 == 33556058 then pid_scenari_15:=33556059;
IF pid_scenari_15 == 33556125 then pid_scenari_15:=33556004;
RULL_MOVE(pid_scenari_15) else begin

pid_scenari_16:=pid_scenari_16+1;
IF pid_scenari_16 == 33556135 then pid_scenari_16:=33556138;
IF pid_scenari_16 == 33556225 then pid_scenari_16:=33556129;
RULL_MOVE(pid_scenari_16) else begin

pid_scenari_17:=pid_scenari_17+1;
IF pid_scenari_17 == 33556283 then pid_scenari_17:=33556236;
RULL_MOVE(pid_scenari_17) else begin

pid_scenari_18:=pid_scenari_18+1;
IF pid_scenari_18 == 33556385 then pid_scenari_18:=33556284;
RULL_MOVE(pid_scenari_18) else begin

pid_scenari_19:=pid_scenari_19+1;
IF pid_scenari_19 == 33556485 then pid_scenari_19:=33556384;
RULL_MOVE(pid_scenari_19) else begin

RULL_MOVE(33554538)
RULL_MOVE(33554800)
RULL_MOVE(33554917)
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end


Отправлено: 3:49 - 16 Июля, 2007
JSilver
Пользователь

Откуда: Moscow
Регистрация: Июль 2007

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

блин! как это оказалось просто! (теперь, когда уже написано и отлажено). пришлось, правда, немного повозиться с тем, чтобы действие не происходило задолго до того, как закончится соответствующая ему анимация, но это уже были пустяки после скриптов "Арены".

если искать криттеров - никакой перебор не нужен, когда я увидел, что это 106 метаруля - я сначала был в ярости - там же требуется ласт криттер, но когда попробовал подставить вместо него нолик - все сработало как нельзя лучше. абсолютно никакой тормозни при радиусе прощадки = 10, что еще больше чем стандартная дистанция "держись далеко". так что если дело касается криттеров - 106 метаруля это и есть искомая мной функция "дай того, кто тут стоит, и наплевать какой у него пид".

попробовал нельзя ли его использовать для предметов и прочего, а не только криттеров - но из этого ничего не вышло. то ли потому что я наглючил, то ли потому что и не должно было получаться - не знаю.

посему возник вопрос: а какие еще метарули бывают? где-нибудь можно про них почитать? поиск нашел только три ветки, но там в основном 107-е использовалось и его соседи. а первые 99 что делают? сколько их всего разных?

где это все почитать?

Отправлено: 17:48 - 16 Июля, 2007
Wasteland Ghost
Маленькое Злое Привидение

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

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

Ёпрст, ссылка прямо под носом, в навигационной панели. Лень-матушка...

Документация.

Отправлено: 11:28 - 20 Июля, 2007
JSilver
Пользователь

Откуда: Moscow
Регистрация: Июль 2007

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

Ань! легко написать "епрст" и "ссылка под носом". но не всегда легко понять, во что именно предлагается оный нос сунуть. Если ты имела в виду BIS-help, то его я как раз уже прочитал и не один раз, подраздел "скриптовые команды" я видел в переведенном (тобой?) хелпе, те метарули, которые 100-108 которые трехаргументные и еще несколько одноаргументных я уже давно тоже нашел в define.h
Если же ты имела в виду что-нибудь типа "Формат AAF-файлов", лежащий там же, то я честно туда нос даже и не собирался засовывать. понадобившиеся мне AI я уже прочитал, в INT даже не лазил. компилятор отработал, ошибок не выдал - ну и слава Богу, мне хватит и этого. а всякие AAF и RIX - я даже и знать не знаю, что за файлы и нафиг они нужны. и раз уж поиск не сказал, что metarule3 в их описалове встречается - то я даже и не собирался их смотреть.

ты что имела в виду? если то, что я помянул, так всякими 106-107 я и так уже пользуюсь, а хныкать стал только из-за того, что мне этого мало. мне, например, нужен аналог 106 (который next_critter) но для предметов. потому как в тупую сам 106 предметы и scenery игнорирует. как я это себе понимаю, потому что в каждом гексе ссылка, заведующая тем, что на нем можно найти, для разных объектов разная, и 106 настроен только на криттеров. законно, логично... но если есть одно, то какой номер у другого?


Как уже говорилось, форумный этикет не предполагает обращения по  реальным именам. Для этого есть логины (aka ники). Alchemist

Отправлено: 4:43 - 21 Июля, 2007 | ИСПРАВЛЕНО: Alchemist - 10:03 - 21 Июля, 2007
Wasteland Ghost
Маленькое Злое Привидение

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

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

Цитата:
посему возник вопрос: а какие еще метарули бывают? где-нибудь можно про них почитать? поиск нашел только три ветки, но там в основном 107-е использовалось и его соседи. а первые 99 что делают? сколько их всего разных?

Исчерпывающий ответ на эти вопросы дан в доке по скриптам. Именно к ней и предлагалось обратиться.

Если ты уже прочитал оную доку и хотел узнать, нет ли других метарулей, которые используются, но там не описаны, то так и следовало спрашивать. Иначе получилось, что ты искал по форуму, нашёл один метаруль 107, а в документацию не смотрел. Формулировка, однако. Если хочешь, чтобы тебя правильно поняли, формулируй свою мысль чётче. Отвечу на предполагаемый вопрос: нет.

PS А обращаться по имени, действительно, не стОит. Сетикет.

Отправлено: 10:43 - 22 Июля, 2007
JSilver
Пользователь

Откуда: Moscow
Регистрация: Июль 2007

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

ну вообще-то я думал, что это фразу:
Цитата:
поиск нашел только три ветки, но там в основном 107-е использовалось и его соседи. а первые 99 что делают? сколько их всего разных?


поймут именно как
"ключи 100-108 видел, не хватило, хочу знать про остальные (например 01-99), если они существуют.

про имена все понял, хотя и в некотором недоумении: откуда бы я их знал, если бы их не употребляли другие?

обобщу вопрос: если я читал какие-то доки, нашел в них нечто, но не нашел (естественно, при условии, что доки читались внимательно, что искалось не только в первой попавшейся доке для чайников а везде где можно и все такое) того, что найти хотел - надо ли это понимать, как то, что мне понадобилось - просто не существует? как, например, аналогичный криттеровскому поиск предметов?

Отправлено: 13:39 - 22 Июля, 2007
Wasteland Ghost
Маленькое Злое Привидение

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

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

Цитата:
надо ли это понимать, как то, что мне понадобилось - просто не существует? как, например, аналогичный криттеровскому поиск предметов?

По всей вероятности да. Возможно, эти метарули не нужны в Фоле и потому просто не реализованы. SSL -- это ведь Star Trek Scripting Language, пришёл он из Klingon Academy. Возможно, это нечто использовалось именно там. Тем не менее, если тебя живо трепещет данный вопрос , -- вперёд и с песней. Эксперимент как метод исследования никто пока ещё не отменял.

Отправлено: 12:07 - 2 Авг., 2007
 

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


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