|
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
|
|
|
|