# Работа с глобальными переменными
Wol4ik(syscall,22) — All
2017-07-04 22:37:17


Прочитал всю документацию про переменные типа global, и все места, где упоминаются переменные. Возможно я недопонимаю, так как раньше работал только с процедурными языками, а не с ООП. Вопрос в следующем. Я в самом начале задаю некие глобальные переменные

global {
hot = 100; -- тепло, главный показатель ГГ
power = 100; -- бодрость, главный показатель ГГ
reason = 99; -- рассудок, способность принимать решения, вниманимательность, адекватность
}

Эти переменные используются для свёрнутого описания статуса ГГ, чтобы они появлялись на экране только при двойном клике на объект инвентаря "статус", таки образом

obj { -- описание объекта "статуc ГГ"
nam = 'статус';
dsc = 'Это {статус}, просмотр статуса возможен при двойном клике на надписи "статус"';
tak = 'Просмотр статуса возможен при двойном клике на надписи "статус"';
inv = function(s)
p (hot, '% - тепло^');
p (power, '% - бодрость, способность действовать^');
p (reason, '% - рассудок^');
end
} -- конец описания объекта "статуc ГГ"

И это работает. Однако, часто возникает необходимость, при попадании в какую-либо локацию (room), изменить значения этих переменных. По условию, или принудительно без всяких условий. Я не понял как это делается. Простая запись, типа

hot = 83; -- тепло изменилось со 100 на 83
power = 79; -- бодрость изменилась со 100 на 79
reason = 51; -- рассудок изменился с 99 на 51

Instead3 не выдает ошибки, но и не меняет значения переменных при попадании в эту комнату. Двойной клик на объект инвентаря "статус" выдает на экран первичное значение переменных. Друзья, подскажите, что я делаю не так.

# Re: Работа с глобальными переменными
Wol4ik(syscall,22) — Wol4ik
2017-07-05 05:34:59


>>Instead3 не выдает ошибки, но и не меняет значения переменных при попадании в эту комнату. Двойной клик на объект инвентаря "статус" выдает на экран первичное значение переменных.>>

Бился пол ночи, смотрел коды игр из репозитория. Решил проблему созданием фиктивного описания сцены

dsc = function(s)
hot=72;
power=89;
reason=51;
end;

# Re: Работа с глобальными переменными
Peter(syscall,1) — Wol4ik
2017-07-05 05:54:05


Из документации:

Основное отличие атрибутов от обработчиков событий состоит в том, что обработчики событий могут менять состояние игрового мира, а атрибуты нет. Поэтому, если вы оформляете атрибут (например, 'dsc') в виде функции, помните, что задача атрибута это возврат значения, а не изменение состояния игры! Дело в том, что движок обращается к атрибутам в те моменты времени, которые обычно четко не определены, и не связаны явно с какими-то игровыми процессами!

Если при входе в комнату нужно выполнить какой-то код, оформи его в виде enter или onenter обработчика.

room {
    onenter = function()
        A = 10
    end;
    dsc = ....
}

# Re: Работа с глобальными переменными
Peter(syscall,1) — Peter
2017-07-05 05:56:20


В документации эти обработчики описаны тут: https://github.com/instead-hub/instead/blob/master/doc/stead3.md#Переходы-между-сценами

# Re: Работа с глобальными переменными
Wol4ik(syscall,22) — Peter
2017-07-05 06:46:21


Пётр, большое спасибо за пояснения. Это очень помогло. Продолжаю читать документацию.