Форум TeamX
   Home   Members  
Pages: [1] |   Go Down
 
Author Topic: Почему local_var(0) устанавливается в "-3" ?  (Read 685 times)
Rainman
Пользователь
Posts: 69

301104000
Почему local_var(0) устанавливается в "-3" ?
« on: 16 November 2010, 16:22:14 »

Добрый день!

Возник интересный вопрос: целую неделю я убил на тестировании скрипта "гуляющего криттера" из-за одной проблемы - мы атакуем этого криттера, он убегает, мы выходим из режима боя -> игра виснет, windows реанимируется только перезапуском системы. В итоге выяснилось: в скрипте криттера стояло определение  #define LVAR_home_tile (0), в блоке map_enter_p_proc стояло set_local_var(LVAR_home_tile, tile_num(self_obj)), в timed_event_p_proc стояла проверка на максимальное расстояние между криттером и его родным тайлом. Когда мы атакуем криттера (пытаемся в него стрельнуть, или пнуть или прочая), наша local_var (0) волшебным образом выставляется в "-3", после этого движок, пытаясь вычислить расстояние между "-3" и "tile_num(self_obj)" сходил с ума, вешался сам и вешал windows. По номеру в scripts.lst данный скрипт соответствовал фоллаутовскому acwarior.int... Данный баг любезно повторялся как в mapper2.exe, так и в fallout2.exe.

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

Наш большой пост апокалиптический проект "Олимп 2207"
http://olympus2207.com
Freeman
Пользователь
Posts: 50


Re: Почему local_var(0) устанавливается в "-3" ?
« Reply #1 on: 16 November 2010, 21:36:13 »

Это так задумано разработчиками.
Wasteland Ghost
Администратор
Posts: 869

Маленькое Злое Привидение


Re: Почему local_var(0) устанавливается в "-3" ?
« Reply #2 on: 16 November 2010, 23:00:39 »

ЛВАРЫ 0-5 лучше не трогать. Точнее, лучше изучить, как они используются в стандартных скриптах и использовать их также. Емним, 0-3 отвечают за реакцию НПС, 4 — флаг первого захода в диалог, 5 — враждебность НПС.
Rainman
Пользователь
Posts: 69

301104000
Re: Почему local_var(0) устанавливается в "-3" ?
« Reply #3 on: 17 November 2010, 12:52:04 »

Спасибо за ответы, вы мне очень помогли. Даже не подозревал, что локальные переменные могут изменяться движком, макросы-то все отключены...
Забавно, создал целый аддон, а такой базовой проблемы и не заметил... не удивительно, что там у игроков постоянно вылезали баги.
Еще раз спасибо, постараюсь изучить принципы работы этих вар (в особенности local_var(5)).
Предлагаю пока тему не закрывать, я отпишусь о результатах проверки, это будет более-менее обобщенное заключение по способу использования локальных переменных.

Наш большой пост апокалиптический проект "Олимп 2207"
http://olympus2207.com
Wasteland Ghost
Администратор
Posts: 869

Маленькое Злое Привидение


Re: Почему local_var(0) устанавливается в "-3" ?
« Reply #4 on: 17 November 2010, 12:56:10 »

Вообще, насчёт вар 0-4 уверенности нет. Вот в Ф1 лвар 0 точно меняется движком: она, похоже, каким-то образом завязана на tell-me-about.

PS Речь идёт только о скриптах криттеров.
Rainman
Пользователь
Posts: 69

301104000
Re: Почему local_var(0) устанавливается в "-3" ?
« Reply #5 on: 17 November 2010, 15:18:51 »

Полностью согласен, речь идет об объектах, которые возможно атаковать (к сожалению, в Ф2 это только криттеры).

Провел небольшую проверку на LVAR'ы от (0) по (5) включительно. Провел тест два раза: при начальном значении переменных "0" и при "1". Значения всех переменных отслеживались в каждой процедуре (в talk_p_proc даже в трех местах). Результат - отрицательный, меняется только local_var(0), причем всегда в "-3" в независимости от начального значения.

Заметил интересный факт, опишу его в двух ситуациях (все это - находясь рядом с криттером и ни разу его не атакуя):
1) Вхожу в режим боя -- записываю игру -- выхожу из режима боя -- (снова вхожу в режим боя) -- загружаю только что записанную игру -- выхожу из режима боя. Все работает как должно.
2) Вхожу в режим боя -- записываю игру -- загружаю только что записанную игру -- выхожу из режима боя -> отказ в выходе, нельзя закончить бой рядом с врагами -- заканчиваю ход -> криттер меня атакует.
Заметьте, local_var(0) при этом никак не меняется, как, впрочем, и никакая другая переменная. Wasteland Ghost, проблема случайных встреч с двумя враждующими командами, после записи/загрузки атакующих чузена? Ведь при такой встрече нельзя выполнить схему 1), которую я описал выше.

В любом случае, я пока не понимаю, чему служит local_var(0) и вечером еще буду проверять. На счет остальных переменных у меня сомнений не осталось - они не меняются движком, а скриптово позволяют сохранить отношение НПС к чузену (в том числе и LVAR_hostile)

Наш большой пост апокалиптический проект "Олимп 2207"
http://olympus2207.com
Wasteland Ghost
Администратор
Posts: 869

Маленькое Злое Привидение


Re: Почему local_var(0) устанавливается в "-3" ?
« Reply #6 on: 17 November 2010, 15:22:24 »

Rainman, ты ещё попробуй не просто сейв-лоад делать, а сейвиться, выходить из игры совсем, запускать заново и лоадиться. Вот зуб даю — не придумала я инфу про лвар 5.

ПыСы Надеюсь, все эти эксперименты делаются без sfall?
Fakels
Пользователь
Posts: 337

Модный геймер


Re: Почему local_var(0) устанавливается в "-3" ?
« Reply #7 on: 17 November 2010, 21:55:18 »

Quote from: Rainman on 17 November 2010, 15:18:51
В любом случае, я пока не понимаю, чему служит local_var(0) и вечером еще буду проверять. На счет остальных переменных у меня сомнений не осталось - они не меняются движком, а скриптово позволяют сохранить отношение НПС к чузену (в том числе и LVAR_hostile)
Всем привет!
Переменная с номер 0 используется в макросах из заголовочного файла MODREACT.h
#define LVAR_reaction                   (0)             // Holds reaction number value.
Видимо по этому двиг меняет эту лок. переменую, для нужд этих макросов.

Так что если у нпс в диалоге скрипта используется макросы из MODREACT.h то лучше тогда не использовать еще и переменные с номерами 1-3.

Quote from: Rainman on 17 November 2010, 15:18:51
Заметил интересный факт, опишу его в двух ситуациях (все это - находясь рядом с криттером и ни разу его не атакуя):
2) Вхожу в режим боя -- записываю игру -- загружаю только что записанную игру -- выхожу из режима боя -> отказ в выходе, нельзя закончить бой рядом с врагами -- заканчиваю ход -> криттер меня атакует.
А можно на скрипт глянуть?

Quote
Заметьте, local_var(0) при этом никак не меняется
она меняется только когда ты нпс атакуешь
« Last Edit: 17 November 2010, 22:34:22 by Fakels »

"Необходимо учесть все условия и тогда - нет проблем"
Wasteland Ghost
Администратор
Posts: 869

Маленькое Злое Привидение


Re: Почему local_var(0) устанавливается в "-3" ?
« Reply #8 on: 17 November 2010, 23:15:20 »

Fakels, два за невнимательность:
Quote from: Rainman
макросы-то все отключены...
Fakels
Пользователь
Posts: 337

Модный геймер


Re: Почему local_var(0) устанавливается в "-3" ?
« Reply #9 on: 18 November 2010, 00:19:53 »

Quote from: Wasteland Ghost on 17 November 2010, 23:15:20
Fakels, два за невнимательность:
Quote from: Rainman
макросы-то все отключены...
эмм, это ты к чему?
Нулевая вара она же двиглом меняется, когда пытаешся пнуть нпса в режиме боя.
И я привел возможную версию для чего она меняется т.е. для макросов из MODREACT.h

"Необходимо учесть все условия и тогда - нет проблем"
Rainman
Пользователь
Posts: 69

301104000
Re: Почему local_var(0) устанавливается в "-3" ?
« Reply #10 on: 18 November 2010, 01:11:03 »

Успользуемый для проверки скрипт (перечисленные заголовки не имеют никакого отношения к заголовкам и макросам Фоллаута)

#include "J:\Developement\Scripts\headers\OLYMPUS.h"
#include "J:\Developement\Scripts\headers\OLITEMS.h"
#include "J:\Developement\Scripts\HEADERS\OLCRITRS.h"
#include "J:\Developement\Scripts\HEADERS\OLGVARS.h"

#define scrid               3 // script's ID, line number in "scripts.lst"

#define LVAR_start              ( 6 )
#define LVAR_enemy              ( 7 )
#define LVAR_home_tile          ( 8 )

procedure start;
procedure timed_event_p_proc;
procedure critter_p_proc;
procedure combat_p_proc;
procedure description_p_proc;
procedure look_at_p_proc;
procedure pickup_p_proc;
procedure talk_p_proc;
procedure destroy_p_proc;
procedure use_skill_on_p_proc;
procedure damage_p_proc;
procedure push_p_proc;

procedure DialogStart;
procedure Node999;
procedure Node998;
procedure map_enter_p_proc;
procedure patrol;

procedure start
begin
     if local_var(LVAR_start) == 0 then begin
        set_local_var(LVAR_start, 1);
        set_local_var(0, 1);
        set_local_var(1, 1);
        set_local_var(2, 1);
        set_local_var(3, 1);
        set_local_var(4, 1);
        set_local_var(5, 1);
     end
end

procedure timed_event_p_proc
begin
     if fixed_param == 1 then begin
        animate_move_obj_to_tile(self_obj, tile_num_in_direction(self_tile, 5, 10), 0);
        add_timer_event(self_obj, 90, 2);
     end
     
     if fixed_param == 2 then begin
        animate_move_obj_to_tile(self_obj, local_var(LVAR_home_tile), 0);
        add_timer_event(self_obj, 90, 1);
     end
end

procedure map_enter_p_proc
begin
     display_msg("LVAR_0 = " + local_var(0));
     display_msg("LVAR_1 = " + local_var(1));
     display_msg("LVAR_2 = " + local_var(2));
     display_msg("LVAR_3 = " + local_var(3));
     display_msg("LVAR_4 = " + local_var(4));
     display_msg("LVAR_5 = " + local_var(5));
end

procedure critter_p_proc
begin
     
end

procedure combat_p_proc
begin
     display_msg("LVAR_0 = " + local_var(0));
     display_msg("LVAR_1 = " + local_var(1));
     display_msg("LVAR_2 = " + local_var(2));
     display_msg("LVAR_3 = " + local_var(3));
     display_msg("LVAR_4 = " + local_var(4));
     display_msg("LVAR_5 = " + local_var(5));
end

procedure look_at_p_proc
begin
  //script_overrides;
 
end

procedure description_p_proc
begin
     //script_overrides;
     //set_local_var(LVAR_home_tile, self_tile);
     //add_timer_event(self_obj, 10, 1);
     display_msg("LVAR_0 = " + local_var(0));
     display_msg("LVAR_1 = " + local_var(1));
     display_msg("LVAR_2 = " + local_var(2));
     display_msg("LVAR_3 = " + local_var(3));
     display_msg("LVAR_4 = " + local_var(4));
     display_msg("LVAR_5 = " + local_var(5));
end

procedure pickup_p_proc
begin
  //script_overrides;
  set_enemy_on;
     display_msg("LVAR_0 = " + local_var(0));
     display_msg("LVAR_1 = " + local_var(1));
     display_msg("LVAR_2 = " + local_var(2));
     display_msg("LVAR_3 = " + local_var(3));
     display_msg("LVAR_4 = " + local_var(4));
     display_msg("LVAR_5 = " + local_var(5));
end

procedure push_p_proc
begin
     set_local_var(LVAR_home_tile, self_tile);
     add_timer_event(self_obj, 10, 1);
     display_msg("LVAR_0 = " + local_var(0));
     display_msg("LVAR_1 = " + local_var(1));
     display_msg("LVAR_2 = " + local_var(2));
     display_msg("LVAR_3 = " + local_var(3));
     display_msg("LVAR_4 = " + local_var(4));
     display_msg("LVAR_5 = " + local_var(5));
end

procedure talk_p_proc
begin
    display_msg("LVAR_0 = " + local_var(0));
     display_msg("LVAR_1 = " + local_var(1));
     display_msg("LVAR_2 = " + local_var(2));
     display_msg("LVAR_3 = " + local_var(3));
     display_msg("LVAR_4 = " + local_var(4));
     display_msg("LVAR_5 = " + local_var(5));
    start_gdialog(scrid, self_obj, 4, -1, -1);
       gSay_Start;
         display_msg("LVAR_0 = " + local_var(0));
     display_msg("LVAR_1 = " + local_var(1));
     display_msg("LVAR_2 = " + local_var(2));
     display_msg("LVAR_3 = " + local_var(3));
     display_msg("LVAR_4 = " + local_var(4));
     display_msg("LVAR_5 = " + local_var(5));
         call DialogStart;
       gSay_End;
     end_dialogue;
end

procedure use_skill_on_p_proc
begin
     display_msg("LVAR_0 = " + local_var(0));
     display_msg("LVAR_1 = " + local_var(1));
     display_msg("LVAR_2 = " + local_var(2));
     display_msg("LVAR_3 = " + local_var(3));
     display_msg("LVAR_4 = " + local_var(4));
     display_msg("LVAR_5 = " + local_var(5));
end

procedure damage_p_proc
begin
     display_msg("LVAR_0 = " + local_var(0));
     display_msg("LVAR_1 = " + local_var(1));
     display_msg("LVAR_2 = " + local_var(2));
     display_msg("LVAR_3 = " + local_var(3));
     display_msg("LVAR_4 = " + local_var(4));
     display_msg("LVAR_5 = " + local_var(5));
end

procedure destroy_p_proc
begin
     display_msg("LVAR_0 = " + local_var(0));
     display_msg("LVAR_1 = " + local_var(1));
     display_msg("LVAR_2 = " + local_var(2));
     display_msg("LVAR_3 = " + local_var(3));
     display_msg("LVAR_4 = " + local_var(4));
     display_msg("LVAR_5 = " + local_var(5));
end

procedure DialogStart
begin
     gSay_Reply(scrid, 1);
     gSay_Option(scrid, 2, Node998, 50);
     gSay_Option(scrid, 3, Node998, 50);
end

procedure Node999
begin
     display_msg("LVAR_0 = " + local_var(0));
     display_msg("LVAR_1 = " + local_var(1));
     display_msg("LVAR_2 = " + local_var(2));
     display_msg("LVAR_3 = " + local_var(3));
     display_msg("LVAR_4 = " + local_var(4));
     display_msg("LVAR_5 = " + local_var(5));
end

procedure Node998
begin
     set_enemy_on;
     display_msg("LVAR_0 = " + local_var(0));
     display_msg("LVAR_1 = " + local_var(1));
     display_msg("LVAR_2 = " + local_var(2));
     display_msg("LVAR_3 = " + local_var(3));
     display_msg("LVAR_4 = " + local_var(4));
     display_msg("LVAR_5 = " + local_var(5));
end

procedure patrol
begin
   
end


To Wasteland Ghost: проверил изменение нулевой переменной при случае, когда НПС убегает от чузена(после надевания чузеном брони), сохранял, загружал, выходил из игры в главное меню и в Windows - ничего не меняется: нулевая лвара остается "-3", все остальные не меняются (если НПС по каким-то причинам перехотел нападать на чузена, то после загрузки, даже со значением local_var(0) == -3 он не хочет атаковать чузена). Как использовать нулевую вару? Ничего полезного на ум не приходит, может быть, это просто аппендикс от Ф1, который второму фоллауту вовсе без надобности...

To Fakels: "...я привел возможную версию для чего она меняется т.е. для макросов из MODREACT.h" - не думаю, это было бы просто бессмысленно. В этих макросах лвара 0 имеет те же права, что и лвары 1, 2 и 3, и меняются они, как ты уже сказал, макросами, т.е. - скриптово, и подключать сюда движок было бы просто нецелесообразно (по макросам видно, что лвара 0 содержит степень отношения НПС к чузену, которая может быть от -4 до 4 включительно, и зачем бы БИС'овцам потребовалось хардкодить промежуточное значение???)

Мое заключение: движково local_var(0) может принимать значение "-3", которое не противоречит скриптам, которые используют local_var(0), но и не дополняет эти скрипты специфичными функциями, что означает, что БИС'овцам хардкод этой лвары в движке был не нужен, но и не мешал, поэтому (если local_var(0) действительно использовалась в движке Ф1) эту функцию движка fallout2.exe просто не стали трогать и оставили как есть. Если у вас есть еще мысли по этому поводу - предлагаю обсудить (очень жаль, что не удалось получить никаких изменений local_var(5)...)
« Last Edit: 18 November 2010, 01:30:27 by Rainman »

Наш большой пост апокалиптический проект "Олимп 2207"
http://olympus2207.com
Wasteland Ghost
Администратор
Posts: 869

Маленькое Злое Привидение


Re: Почему local_var(0) устанавливается в "-3" ?
« Reply #11 on: 18 November 2010, 11:02:06 »

Насчёт лвар 5. Я вспомнила вот что. Мы для НВ первое время использовали ЛК, а там двиг какой-то странной ранней версии. Двиглоковырятели смотрели, говорили, что от 1.02d отличается радикально. Возможно, причина в этом.
Pages: [1] |   Go Up