» 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 ] Все собщения

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

Откуда: Military Base
Регистрация: Апр. 2004

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

>>display_msg("PID:"+obj_pid(self_obj);
Зачем всё так усложнять?
Можно же просто написать:
tile_contains_pid_obj(int tile, int elev, obj_pid(self_obj);
Ну это неважно.
Перходим к основной части:
Да, у меня действительно есть три frm-ки: первая - шлагбаум поднят, вторая - он опускается, третья - он опущен.
Кстати, у шлагбаума же есть основа, на которой держится палка. Так вот, под этой основой и находится тайл, на котором стоит шлагбаум.
Я хотел сделать так, чтобы когда шлагбаум опускался, под его палкой появлялись невидимые блокеры, а когда он поднимался, блокеры бы удалялись.
Могу для понятности послать FRM-ки!
ЗЫ
А как привязывать FRM-ки к определённым действиям ты так и не сказал. Первый случай для криттеров!
Я использую комп. Запускается анимированное поднимание шлагбаума. Удаляются блокеры.

-----
В мире есть две точки зрения: неправильная и моя.

Отправлено: 10:57 - 2 Мая, 2004
Raven
Пользователь

Откуда: Владик
Регистрация: Февр. 2004

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

>>Зачем всё так усложнять?
>>Можно же просто написать:
>>tile_contains_pid_obj(int tile, int elev, obj_pid(self_obj));

8-| Воттена. Ты сам понял, чего написал? Тебе нужно указать pid двери, а obj_pid(self_obj) вернет тебе pid твоего компа. Этот код работать не будет. PID двери в скрипте компа брать неоткуда - PID можно получить толко если есть указатель на объект. А мы всю эту возню и затеяли ради получения этого самого указателя. Т.е. PID должен быть задан изначально. Получить его проще всего методами, указанными в предыдущем постинге.

Второй вопрос.

Ты не понял. Проиграть frm-ку (саму по себе) нельзя. Можно проиграть анимацию какого-либо объекта. Т.е. сначала тебе нужно сделать scenery-прототип и анимировать его своими frm-ками.

Пошагово:
1. Делаешь из трёх своих frm-ок одну анимированную (с помощью gif2frm, наверное. Точно не знаю). У тебя должна получиться полная анимашка открытия или закрытия шлагбаума с минимум тремя кадрами.
2. Прописываешь получившуюся frm в data\art\scenery\scenery.lst
3. Создаёшь в Мапере новый scenery-прототип. Выбираешь для него свою frm. Сохраняешь прототип. Мапер сам заапдейтит нужные файлы.
4. Размещяешь свой шлагбаум. У тебя получается статичный объект, используется первый кадр твоей frm-ки.
5. В скрипте компа пишешь следующее (я полагаю, что на первой фрмке у тебя закрытый шлагбаум):

  для открытия: animate_stand_obj(tile_contains_pid_obj(tile,elev,PID)) - простая прокрутка твоей анимации

  для закрытия: animate_stand_reverse_obj(tile_contains_pid_obj(tile,elev,PID)) - обратная прокрутка

  + удаление/добавление блокеров.

Т.е при открытии прокрутится вся твоя анимашка и произойдёт остановка на последнем кадре. При закрытии анимашка крутится задом наперёд и сотановка происходит на первом кадре.

Удалять/создавать блокеры можно. Их PID, ЕМНИП, 33554499. Для удаления/создания блокера нужно знать его координаты. Их можно прописать "жёстко",а можно вычислять смещение относительно тайла шлагбаума. Первый способ проще и надёжнее, но делает скрипт "одноразовым".

Удалить блокер: destroy_object(tile_contains_pid_obj(координаты,elevation,33554499));
Создать блокер: create_object(33554499,координаты,elevation);

Убедись, что ты изначально располагаешь в Мапере под шлагбаумом блокеры с именно с этим PIDом! Блокеров разных много - повесишь не те - работать не будет.


Для тех, кто не знает как создавать/редактировать объекты в Мапере - читайте Maper as Proto Editor.

Отправлено: 9:47 - 3 Мая, 2004
GaroldPredator
Пользователь

Откуда: Military Base
Регистрация: Апр. 2004

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

Мдя... Ошибочка с пидом вышла...
Ну ладно, неважно, с этим я уже разобрался!
Теперь другой прикол.
Я хочу, чтобы Чузен появлялся в левом углу карты, а не в середине.
Я прописываю  номер тайла в city.txt, а когда захожу на карту...
Темная ночь...
Короче, чёрный экран, и по нему блуждает Чузен!
Я так думаю, я чего-то не доделал!!!

-----
В мире есть две точки зрения: неправильная и моя.

Отправлено: 19:12 - 5 Мая, 2004
Raven
Пользователь

Откуда: Владик
Регистрация: Февр. 2004

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

Навскидку:
1. сделал какую-нибудь бяку с прототипами (напр., удалил pro-шники вручную сделанных объектов, оставив сами объекты на карте)
2. то же самое - но со скриптами
3. закидываешь чуза за пределы карты - т.е. оюласть карты 100x100, сама карта, например, представляет из себя квадрат 20x20 в середине  - а ты закидываешь Чуза в (1,1)

Более подробно отвечу если запостишь кусок кода с перемещением, назовёшь карту и скажешь чего ты с ней делал.

Отправлено: 6:30 - 6 Мая, 2004
Wasteland Ghost
Маленькое Злое Привидение

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

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

Три последние цифры - elevation, tile_num, orientation. Ты уровень (elevation) правильный указал? Учти, кстати, что в отсчёт уровня в city.txt идёт с нуля.

Отправлено: 9:43 - 6 Мая, 2004
Jo Jim
Пользователь

Регистрация: Март 2004

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

Спасибо, Рэйвен.

*Здесь переменные вида gang_x_member_y заполняются указателями на членов банд. Для Лары и Марка всегда y:=1, для остальных - как придётся. Эти вары импортируются в скрипте Лары и остальных критеров *
А как определяется, что указатель уже занят другим членом команды и нужно использовать другой указатель?

*---den.h line:863---
if (local_var(LVAR_Home_Tile) == 0) then begin
  if (self_gang == gang_2) then begin
     check_take_home_tile(1)
     else check_take_home_tile(2)
     else check_take_home_tile(3)
     else check_take_home_tile(4)
     else check_take_home_tile(5)
     if (local_var(LVAR_Home_Tile) == 0) then begin
        random_tile_in_box(22340, 22332, 24132, 23940);
        set_local_var(LVAR_Home_Tile, global_temp);
        set_local_var(LVAR_Home_Rotation, random(2,4));
     end
  end else begin
     set_local_var(LVAR_Home_Tile, self_tile);
  end
end
--------------------

check_take_home_tile(x) устанавливает LVAR_Home_Tile мембера Лариной банды номер x равному текущему положению соответствующего по номеру мембера банды Тайлера. Когда бой закончен - check_take_home_tile перестаёт работать, а переменным *
Где здесь проверка на то, что бой окончен? (надо сказать очень интересные ИФы. Разве второй ИФ не выполнится, если выполняеются условия первого ИФа?)

*LVAR_Home_Tile присваивается случайное значение из квадрата с координатами (22340, 22332, 24132, 23940)*
Да, понятно. Но для Лары это НЕ рандом. Если играть в версию 1.0 или на скриптах БИСа, но Лара ВСЕГДА встает на место Тайлера и всегда разворачивается в одну сторону лицом. То есть, я делаю вывод, что для Лары должно быть _явное_ определение либо координат или указание на координаты Тайлера.( А где тогда координаты Тайлера? я тоже найти не могу.)

Я ещё раз уточняю вопрос: Для Лары есть _конкретные координаты_ куда ей вставать, после завершения боя (для Лары это не рандом). Я их найти не могу. Это точно есть в скриптах БИСа.

Отправлено: 13:30 - 6 Мая, 2004
Raven
Пользователь

Откуда: Владик
Регистрация: Февр. 2004

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

to Jo Jim

>>Где здесь проверка на то, что бой окончен? [про макрос check_take_home_tile(x)]

Вот здесь.
if (gang_1_member_##x != 0) then begin

Пояснение:
Изначально (точнее, после срабатывания map_enter_p_proc для всех членов банды) все переменные gang_1_member_x содержат указатели на членов банда Тайлера, т.е. отличны от нуля. Соответственно, когда критер гибнет - срабатывает макрос dest_gang_member, обнуляющий переменную с указателем на данного критера. Если критер мёртв - то переменная равна нулю. Т.е. фактически проверка делается на то жив ли данный критер или нет. Когда все критеры мертвы - все переменные gang_1_member_x установлены в ноль (на самом деле, не все - см. ниже) и в check_take_home_tile(x) для любого x не будет срабатывать if (gang_1_member_##x != 0).

>>Разве второй ИФ не выполнится, если выполняеются условия первого ИФа?

Недопонимание с твоей стороны. Может, ты не знаешь, что ##x означает подстановку переданого параметра?
Т.е. для
check_take_home_tile(1)
будет
if (gang_1_member_1 != 0) then begin
и для
check_take_home_tile(2)
будет
if (gang_1_member_2 != 0) then begin
Т.к. gang_1_member_1 и gang_1_member_2 - разные вары, то очевидно, что, вообще говоря, из истинности check_take_home_tile(1) не следует истинность check_take_home_tile(2).

Или ты просто воспринимаешь check_take_home_tile как процедуру, а не макрос? После раскрытия дефайнов препроцессором данный код выглядит так:
______________________________________________________________________
if (self_gang == gang_2) then begin
  if (self_obj == gang_2_member_1) then begin
     if (gang_1_member_1 != 0) then begin
        set_local_var(LVAR_Home_Tile, tile_num(gang_1_member_1));
        set_local_var(LVAR_Home_Rotation, has_trait(TRAIT_OBJECT, gang_1_member_1, OBJECT_CUR_ROT));
     end
  end else if (self_obj == gang_2_member_2) then begin
     if (gang_1_member_2 != 0) then begin
        set_local_var(LVAR_Home_Tile, tile_num(gang_1_member_2));
        set_local_var(LVAR_Home_Rotation, has_trait(TRAIT_OBJECT, gang_1_member_2, OBJECT_CUR_ROT));
     end
  end else <...>
______________________________________________________________________


>>А как определяется, что указатель уже занят другим членом команды и нужно использовать другой указатель?

Все эти вары заполняются в gang_member_map_enter:
______________________________________________________________________
<...>
if (NAME == SCRIPT_DCTYLER) then gang_1_member_1 := self_obj;
else if (NAME == SCRIPT_DCMARC) then gang_1_member_2 := self_obj;
else if (gang_1_member_3 == 0) then gang_1_member_3 := self_obj;
else if (gang_1_member_4 == 0) then gang_1_member_4 := self_obj;
else if (gang_1_member_5 == 0) then gang_1_member_5 := self_obj;
<...>
______________________________________________________________________

Вот тут кроется ответ на твой изначальный вопрос, который я в прошлый раз проглядел :-)

Изначально все эти вары обнулены. При заходе на карту у всех критеров из банд срабатывает map_enter_p_proc(gang_member_map_enter) - у кого-то раньше, у кого-то позже. Как видишь, gang_1_member_1 зарезервирована под Тайлера (а не под Марка, как я сказал в прошлый раз), gang_1_member_2 - под Марка. Остальные три свободны. У кого раньше сработает map_enter - тот и захапает себе "старшую" вару и запишет в нее указатель на себя. Т.е. gang_1_member_3 уже будет отлично от нуля и для следующего "обычного" члена банды первые три условия не выполняются. Поэтому он получает вару gang_1_member_4 и пишет указатель туда.

>>Для Лары есть _конкретные координаты_ куда ей вставать, после завершения боя

Я сказал что после окончания боя все gang_1_member_x обнулены. Это не так. gang_1_member_1 принадлежит Тайлеру - а он в бойне не участвует. Но указатель-то под него выделяется! Т.е. для Тайлера в какой-то момент вызывается check_set_obj_visiblity(self_obj,false) [вот с этим я сам не разобрался - но это не так важно] и он "исчезает" с карты, оставаясь в игре. Соответственно, т.к. и у Лары и у Тайлера первые номера, то check_take_home_tile(1) для Лары (и только для неё) работать будет. И её LVAR_Home_Title установится равным местоположению Тайлера (хотя самого Тайлера как бы и нет) - т.е. его изначально заданным в Мапере координатам - 24534. После боя при следующем заходе на карту Тайлер самоуничтожается. Но Лара уже стоит на его месте, так что всё в порядке.

Вот такие чудесные парни писали скрипты в BIS - без допинга (3-4 кружки зелёного чая в моём случае) не разберёшь... :-)

Отправлено: 15:39 - 7 Мая, 2004
Jo Jim
Пользователь

Регистрация: Март 2004

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

Что ж, быстро медленно ли мы продвигаемся к ответу.
Еще раз спасибо. Мне прямо жалко тебя, ты так развернуто пишешь. Зато понятно .

*Недопонимание с твоей стороны. Может, ты не знаешь, что ##x означает подстановку переданого параметра? * Нет, я не разворачивание макросов имел ввиду. Именно тот кусок кода, который я цитировал, меня очень смутил. Подобные кострукции в скриптах я встречаю постоянно
If x= 0 then
 .......
 if x = 0 then
   .......
 end if
 .......
end if
Ну согласись глупо?! Но да я не о том. (это о том же, под чем были БИСовцы, когда писали скрипты )

*После боя при следующем заходе на карту Тайлер самоуничтожается. Но Лара уже стоит на его месте, так что всё в порядке. *
Нет, не нужно заходить выходить\заходить на локацию, чтобы Лара встала у дверей. Как только я закрывается кнопка End, банда Лары занимает свои места, и Лара в том числе. Тайлер должен уничтожаться по событию завершения боя, а не по update_map.
Ох, вот она координата. Я счастлив. Таким образом это значение храниться в master.dat/maps/denbus2.map, а не в скрипте?
Tnx a lot!

Отправлено: 18:27 - 7 Мая, 2004
Raven
Пользователь

Откуда: Владик
Регистрация: Февр. 2004

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

Неужто все вопросы по скриптам получили исчерпывающие ответы?

Jo Jim, Garold? Помощь больше не нужна? Или всё живое затихло в предверии сессии ? :-)

Отправлено: 6:07 - 18 Мая, 2004
Jo Jim
Пользователь

Регистрация: Март 2004

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

Да нет. Просто не хотелось  мешать тебе загорать. У нас Питере как всегда +10 и дождь. (ррр)

Продолжал заниматься вопросами, появились некоторые комментарии
*Я сказал что после окончания боя все gang_1_member_x обнулены. Это не так. gang_1_member_1 принадлежит Тайлеру - а он в бойне не участвует. Но указатель-то под него выделяется! Т.е. для Тайлера в какой-то момент вызывается check_set_obj_visiblity(self_obj,false) [вот с этим я сам не разобрался - но это не так важно] *
Это важно, я разобрался.
--------------------
if (op_global_var(454) == 9) then
   begin
      ...................
     if (468 == 467) then
       if (op_global_var(471) == 1) then
         op_critter_add_trait(op_self_obj(), 1, 6, 0);
       else if ((op_global_var(468) > (3 + ((op_global_var(446) bwand -2147483648) != 0 == 0))) or (910 == 911)) then
     ........................
           if (910 == 911) then
             op_set_global_var(446, op_global_var(446) bwor -2147483648);
           if (gang_1_member_1 == op_self_obj()) then
             gang_1_member_1 := 0;

-----------------
Тайлер уничтожается сразу при заходе на карту, когда соглашаешься помочь Ларе в разборке. Поэтому gang_1_member_1 = 0 становится первым.
Но это оказалось действительно не важным, так как в процедуре map_update (кот. выполняется каждую минуту, если я не ошибаюсь, или 250 тиков игры).
указано следующее.
------------------
 if (468 == 468) then
 begin
   if (op_local_var(5) == 0) then
   begin
     if (op_self_obj() == gang_2_member_1) then
       if (gang_1_member_1 != 0) then
       begin
         op_set_local_var(5, op_tile_num(gang_1_member_1));
         op_set_local_var(6, op_has_trait(1, gang_1_member_1, 10));
       end
------------------
Это значит, что home_tile'ы сохраняться задолго до начала разборок. То есть все члены банды Лары займут места членов банды Тайлера, после их "вынесения"
НО, вот собственно, что я хотел найти. В скриптах бандитов в игре и в БИСе есть отличие. В игровом скрипте присутствует в процедуре map_update:
-------------------
 if (468 == 468) then
 begin
 .......................
   if (gang_2_member_5 == 0) then
   begin
     gang_2_member_5 := gang_2_member_4;
     gang_2_member_4 := 0;
   end
   ........................... (тоже самое для 4,3)
   if (gang_2_member_2 == 0) then
   begin
     gang_2_member_2 := gang_2_member_1;
     gang_2_member_1 := 0;
   end
 end
 else
 begin
   if (op_local_var(5) == 0) then
     op_set_local_var(5, op_tile_num(op_self_obj()));
   if (gang_1_member_5 == 0) then
   begin
     gang_1_member_5 := gang_1_member_4;
     gang_1_member_4 := 0;
   end
   .......................(тоже самое для 3,4)
   if (gang_1_member_2 == 0) then
   begin
     gang_1_member_2 := gang_1_member_1;
     gang_1_member_1 := 0;
   end
 end

-------------------
В силу того, что   gang_2_member_5 =0 всегда, так как банда Лары состоит из 4 человек, gang_2_member_1 становиться в любом случае gang_1_member_2, следовательно Лара никогда уже не встанет на место Тайлера.
Дальше больше. Смысл вышеуказанного добаления для меня не совсем ясен. Что он делает по моей логике. Он должен "кучковать" указатели ещё живых членов обеих банд, при этом ненулевые указатели стягиваются к "хвосту" списка указателей gang_x_member_y. Естественно, что при таких передачах указателей, НАВЕРНОЕ, потеряются ранее полученные значения home_tile. Если я прав, то далее я рассуждаю так: чтобы не возникало ситуаций, когда при раздаче home_tile'ов пара бандитов из противоположных банд не "промахивались" мимо друг друга. Поясню примером
Банда Лары                               Банда Тайлера
gang2(home_tile = 0)                     0 (убит)
0(погиб)                                         gang1(home_tile)
...                                                      ....
Так тайл gang1 пропадет, а gang2 получит тайл рандомом, а, НАВЕРНОЕ, должен (по логике) тайл от живого gang1 передаться живому gang2, что и достигается "скучиванием" указателей живых членов банд. Но это только мои догадки. Для чего так сделали?!

Как я сказал, в Бисе этого нет, поэтому Бандиты Лары на локации с церковью один раз получают тайлы членов банды Тайлера и сохраняют эти тайлы  до самой смерти.
Ваши мысли, уважаемый загорелый Рэйвен? )

Отправлено: 12:56 - 18 Мая, 2004
 

Переход по темам
<< Пред. След. >>
Страницы этой темы [ 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