RSS
Pages: 1 2
[>] Работа с глобальными переменными
std.prog
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: Работа с глобальными переменными
std.prog
Wol4ik(syscall,22) — Wol4ik
2017-07-05 05:34:59


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

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

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

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


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

[>] Динамическое описание сцены
std.prog
Wol4ik(syscall,22) — All
2017-07-13 09:40:58


Вопрос. Но пока пояснение. Как правило, в играх на Instead динамическая часть сцены расположена на экране выше, чем основное описание сцены (dsc, decor). То есть при появлении вообщений в динамической части - текст decor смещается вниз, чтобы освободить место для появившейся надписи курсивом.

Как поменять их местами и возможно ли это? Можно ли при помощи кода игры, модулей или настройки темы (голубая сталь, стандартная и т.п.) сделать, чтобы динамическая часть сцены, точнее сообщения в ней, выводились всегда ниже, чем статичный блок описания сцены decor (и, разумеется, ниже блока описания об'ектов)?

[>] Re: Динамическое описание сцены
std.prog
Wol4ik(syscall,22) — Wol4ik
2017-07-13 12:33:59


p.s. если быть точнее, то вопрос связан именно с выводом реакций игры (движка) в виде текста курсивом. Прочёсывая документацию, увидел, что динамическая часть сцены неоднозначное понятие. Я знаю что есть статическая часть (декорации, некоторые даже активные) и динамическая (объекты , которые пока лежат, стоят и т.д, но они могут быть взяты в инвентарь, убраны вообще или видоизменены). Но помимо этих двух частей есть область вывода реакций игры - "вы взяли карандаш", "карандаш, как карандаш" и т.п. Вот эти надписи я хочу попытаться переместить, чтобы они появлялись внизу экрана, а не вверху. Но пока не понял как.

[>] Re: Динамическое описание сцены
std.prog
Wol4ik(syscall,22) — Wol4ik
2017-07-13 12:51:56


p.s. повлияет ли на то, что я описал ранее, изменение вот этой функции в плане последовательности расположения этих областей игрового экрана (глава 21 документации по Inst3 "ФОРМАТИРОВАНИЕ И ОФОРМЛЕНИЕ ВЫВОДА") ?

game.display = function(s, state)
local r, l, av, pv
local reaction = s:reaction() or nil -- реакция
r = std.here()
if state then -- такт игры?
reaction = iface:em(reaction) -- курсив
av, pv = s:events()
av = iface:em(av) -- вывод ”важных” life
pv = iface:em(pv) -- вывод фоновых life
l = s.player:look() -- objects [and scene] -- объекты и сцена
end
l = std.par(std.scene_delim,
reaction or false, av or false, l or false,
pv or false) or ’’
return l
end;

[>] Re: Динамическое описание сцены
std.prog
Wol4ik(syscall,22) — Peter
2017-07-13 13:30:22


Большое спасибо. Да, я неоднократно встречал этот посыл о ненужности вмешательства в дела вывода, он проходит белой нитью. И полностью согласен, за тем я с большим трудом и пришел к Instead, чтобы облегчить себе написание содержательной части игр. В оправдание могу лишь сказать, что в данном случае этого требует игра, другого об'яснения у меня нет))) Все остальные твои замечания в документации по поводу нестандартных требований к платформе, типа разные размеры текста в одном экране и т.п. разделяю.

[>] Re: Динамическое описание сцены
std.prog
Wol4ik(syscall,22) — Peter
2017-07-13 21:51:29


Пётр, я сделал, как того хотел. Твои доводы убедительны, но, как часто бывает, убедить может только свой опыт))) Посмотрел, как это выглядит - хуже, чем я представлял. Тут еще играет роль устройство внимания человека. Когда шапка не меняется, а внизу под неизменным текстом что-то появляется/меняется, взгляд очень неохотно переходит вниз экрана. Мы, как правило, держим внимание вверху экрана, так как там самая важная информация. Да, хорошо, что текст decor отскакивает вниз/прыгает, есть есть некая живость "картинки", хотя добавляется всего 1-2 строчки реакции вверху. В общем, остаюсь на базовых настройках))) Большое спасибо за примеры и пояснения. Продолжаю медленно, но верно работать над игрой.

[>] Работа с об'ектами в сценах, в которые возможно многократное возвращение игрока
std.prog
Wol4ik(syscall,22) — All
2017-07-14 13:26:31


Чем больше делаешь, тем больше вопросов. Я уже читал о порядке работы интерпетатора, и могу работать с предметами и активными декорациями в пределах одной сцены. Тем более есть хорошая тестовая игра/учебник, которая прилагается к Inst3. Однако, пришлось залезать и в новую и в старую документацию, чтобы прочитать о теоретических вопросах. Это было вступление)))

Вопрос в следующем. Могу ли я НЕ внутри описания некой конкретной сцены room {.....} принудительно добавлять и убирать об'екты на эту или иную сцену (room) при помощи или без помощи инвентаря, а одними лишь функциями обработчиков самих об'ектов и декораций?

На сколько я знаю, если я пришел на сцену "лес", в которую при описании room {....} внутри фигурных скобок добавлены ранее сформированные obj "лежит {топор}" и obj "валяется {чурбак}", то я сейчас могу для каждого об'екта иметь возможность изменить динамическую часть сцены. Взять топор в инвентарь, он исчезнет со сцены. И порубать этим топором чурбак, он заменится на "поленья" и "щепки". Это штатно и понятно, и на других похожих случаях мной отработано.

Но если я уйду с этой сцены по way или @ walk, а потом вернусь обратно в нее же с уже другими сюжетными задачами, то снова обнаружу не только лежащий топор, но и неразрубленный чурбак. По этому я и спросил про принудительное управление об'ектами инвентаря и любой другой сцены (не только текущей), возможно ли оно. То есть я хочу не только изменить сцену своими действиями, но и вернувшись в нее, застать прошлые изменения и дополнить их новыми, к примеру я притащил еще и спички, которые где-то выменял на топор, которого не должно уже быть ни в этой сцене, ни в инвентаре, ни вообще в игровом мире.

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

[>] Re: Работа с об'ектами в сценах, в которые возможно многократное возвращение игрока
std.prog
Wol4ik(syscall,22) — Peter
2017-07-14 15:26:15


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

[>] Чтобы избежать ошибок
std.prog
Wol4ik(syscall,22) — All
2017-07-19 12:00:21


В процессе понял, что уверенных знаний в инстэд пока не хватает. Читаю сообщения об ошибках в сюжетах уже опубликованных инстэд-игр и просьбы к авторам поправить нестыковки. Хочу изначально, большую часть ключевых dsc и вообще текстовок связанных с room и obj вводить в виде переменных. А не в виде устойчивых (константных) dsc и decor. Просто, чтобы они были управляемы. Ну, к примеру, decor - "Вы пришли на заснеженную поляну и видите {домик}", потом он сгорает, чтобы не делать перетасовок, я лишь в определенный момент заменю значение строковой переменной и будет уже "....и видите {сгоревший домик}". А все движимые об'екты, да, придется тоже задавать заранее и вводить их при помощи кода (place и остальных конструкций). Пока я мыслю себе так.

[>] Re: Чтобы избежать ошибок
std.prog
Wol4ik(syscall,22) — Peter
2017-07-19 15:45:44


Спасибо. Пойду перечитывать про переменные, так как догадываюсь, что s.borned это хоть и переменная, но и одновременно некое "служебное слово" по отношению к borned. То есть понятно, что дело не в названии, а в том, как добавляется и интерпритируется инстэдом это s.****

[>] Re: Чтобы избежать ошибок
std.prog
Wol4ik(syscall,22) — Peter
2017-07-19 15:50:21


То есть, да, я понял, что в dsc конкретного об'екта мы заносим все возможные формы существования этого об'екта, и уютный и сгоревший, и еще можем добавить другие состояния. Не понял пока куда и зачем вернет нас return.

[>] Re: Чтобы избежать ошибок
std.prog
Wol4ik(syscall,22) — Wol4ik
2017-07-19 16:17:41


Аааа. Прошу прощеня, забыл очевидную вещь)))) если убрать return, но отобразятся сразу оба состояния. А return вернет нас просто в room, где об'ект фигурирует. К сожалению не знал, что Инстэд может реализовывать return без парного отсылающего оператора (типа gosub и подобных). Теперь я еще продвинулся с твоей помощью, спасибо.

[>] Возврат из комнаты в ту, из которой мы попадаем при помощи way
std.prog
Wol4ik(syscall,22) — All
2017-07-22 21:09:58


Ну, собственно в этом и вопрос. У меня есть несколько служебных комнат, в которые нужен доступ из совершенно разных сцен. Как то - Статус (да, я знаю и научился делать статус в инвентаре), текущие задания для ГГ, меню разведения огня, меню сна и т.п. Я это делаю так (лирика сокращена для краткости)

room {-- место ночёвки
nam = 'loc1.episode1';
title = 'Блок радиоуправления';
way = { 'статус', 'задания' }; -- кнопки статус и задания
decor = [[Комната, где доступны статус и задания]];
}

И оно работает, пока я не пытаюсь вернуться обратно....
Вот, одна из служебных комнат выглядит так

room {
nam = 'задания';
title = 'задания';
decor = [[Текущие задания...{@ walkout()|назад}]];
}

Но оно не работает. Я пытался применять функцию from(), но так и не понял, как ее синтаксически прилепить к "@ walk". Помогите найти дорогу обратно из служебной комнаты в любую произвольную, из которой я пришел в эту служебную при помощи way.

[>] Re: Возврат из комнаты в ту, из которой мы попадаем при помощи way
std.prog
Wol4ik(syscall,22) — Peter
2017-07-23 06:13:29


Спасибо, всё заработало!

[>] Важный вопрос
std.prog
Wol4ik(syscall,22) — All
2017-07-25 14:40:35


Пётр, к тебе вопрос. Он может показаться банальным и даже странным. Мне это важно для продумывания дизайна игры и игровой механики. Пытаюсь не выходить из границ целей создания движка Instead (я читал манифест), с другой стороны мне важно как это будет выглядеть для игрока, ну и себе границы задать. Вопрос вот в чем. Какую игру (игры) на Instead (игры не твоего пера) ты считаешь, что они (она) больше всего и полнее реализуют заложенные тобой в движок идеи? Независимо от того, нравится ли тебе сама игра и сюжет или нет. Ну, есть такие, чтобы ты сказал не просто "качественная игра", а типа того, что "да, вот для таких игр я и создавал Instead, и хотелось бы таких игр видеть больше"?

[>] Re: Важный вопрос
std.prog
Wol4ik(syscall,22) — Peter
2017-07-25 20:33:51


Спасибо за пояснения. Посмотрев примеры игр из твоего списка (с комментариями) и уловив суть советов, решил делать так:
*выбрать только то (те способы), что уже знаю, и что спрашивал здесь на ветке.
*постараться сделать игру, пользуясь только знакомыми и отработанными способами, не пытаясь непомерно развивать технологии параллельно развитию сюжету. Делать ровно.
*сосредоточиться на самой игре, варьируя уже известными и отработанными ходами (в кодинге Instead).

В принципе, ты рассказал мне (здесь и в документации) некий минимум, чтобы я мог уже свободно ходить между локациями, менять декорации, брать и выкладывать предметы, заменять их в инвентаре на другие (замена яблока на огрызок при использовании и т.д.), работать с некоторыми функциями. Собственно, да... пора уже переходить к фазе разработки несложной, но законченой игры. Первой игры на Instead.

[>] Выложить объект из инвентаря в произвольную сцену room
std.prog
Wol4ik(syscall,22) — All
2017-08-02 12:08:36


Добрый день. Вопрос в следующем, как работать с функциями place, put или иными, если я не готов конкретно назвать имя комнаты куда хочу положить объект (переместить из инвентаря)? Что я имею - служебный объект инвентаря, который выполняет роль одного из действий (починить, сломать, говорить и т.п.) конкретно "выложить".

obj {-- служебный объект выложить, действие
nam = '-выложить';
pri = -99;
inv = [[Хелен может выкладывать предметы, которые пока ей не нужны.
Следует один раз кликнуть на действии "выложить",
и второй раз кликнуть на нужный предмет в инвентаре.]];
}

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

obj {-- кувалда, физический объект
nam = 'кувалда';
used = function(s)
if s^'выложить' then
place (s, ???????????);
remove(s);
end;
}

То есть вопрос, как вписать в функцию отсылку к ТЕКУЩЕЙ комнате, название которое тоже есть функция?

[>] Re: Выложить объект из инвентаря в произвольную сцену room
std.prog
Wol4ik(syscall,22) — Andrew Lobanov
2017-08-02 15:17:52


Спасибо, друзья. С drop тоже проэкспериментирую. Спасибо Петру за наглядное пояснение, что есть s и w в функциях, а то я часто срисовывал как школьник с доски, без понимания.

[>] Очистка всего и вся, полный рестарт игры
std.prog
Wol4ik(syscall,22) — All
2017-08-10 06:14:42


Добрый день. При создании фатальных концовок возникла необходимость приведения игры к "нулевому состоянию", то есть перегенерации всего игрового мира, возвращения об'ектов на свои места, инициализации всех переменных и т.д. Прошу подсказать, как это сделать в теле описания сцены или иным образом. Может быть есть функция или команда, которая имитирует пункт с меню Stead3 "начать заново"?

[>] Re: Очистка всего и вся, полный рестарт игры
std.prog
Wol4ik(syscall,22) — Peter
2017-08-10 08:40:04


Спасибо, получилось. Создал спец.об'ект и поместил его в комнату одной из концовок:
--
obj { -- об'ект фатальной концовки, при активации перезапускает игру.
nam = 'bad1obj';
dsc = '{Начать заново...}';
act = function()
instead.restart(true);
end;
}
--

[>] Re: Очистка всего и вся, полный рестарт игры
std.prog
Wol4ik(syscall,22) — Wol4ik
2017-08-10 08:43:24


p.s. выкладывал только что код с красивым разбиением и отступами как ты советовал, но в сообщении все отступы с'елись и все ушло влево. (Редактирую и пишу на планшете, редактор Jota++).

[>] Re: Очистка всего и вся, полный рестарт игры
std.prog
Wol4ik(syscall,22) — Andrew Lobanov
2017-08-10 16:03:28


Peter> А так, смотри сам. При вставке кода используй 4 символа =, примерно так:


Да, спасибо, теперь понял. Пётр говорил, но я тогда не так понял (что это именно про вставку в сообщение). Буду знать. Может шпаргалку повесить? И про спойлеры в game. например тоже, а то сообщения рано или поздно утопятся новыми и кто не в курсе опять будет спрашивать одно и тоже. Вообще, я рад здесь находиться, и поучаствую материально по силам.

[>] Re: Очистка всего и вся, полный рестарт игры
std.prog
Wol4ik(syscall,22) — Peter
2017-08-10 17:54:49


Пишу ответить (символ повернутой стрелочки) или новое сообщение. У меня мобильная версия.

[>] Re: Очистка всего и вся, полный рестарт игры
std.prog
Wol4ik(syscall,22) — Wol4ik
2017-08-10 17:56:43


P.S. Ааааа. Вижу. При создании нового сообщения внизу справка, я ее просто не видел, так как не прокручивал вниз, а просто писал в окне ввода. Прошу прощения за невнимательность.

[>] Синтаксис работы с way
std.prog
Wol4ik(syscall,22) — All
2017-08-15 16:38:00


Вопрос про то, как кодом добавлять и убирать со сцены переходы в зависимости от условий. Вот есть прямое добавление в инвентарь предмета
pl.obj:add ’нож’
А как добавлять way на сцену? Так?:
way():add 'локация5'

p.s. и еще вопрос, из учебника не совсем понял, как любое прямое стоковое значение dsc/way представлять в виде переменной? Например
global {
        rrt = 'локация5';
        }

room   {
        nam = 'локация4';
        way = { ..... здесь как-то должно быть значение переменной rrt....?????}
        }
========

[>] Re: Синтаксис работы с way
std.prog
Wol4ik(syscall,22) — Peter
2017-08-15 20:44:36


Спасибо! Ответы исчерпывающи.

[>] Докладываю
std.prog
Wol4ik(syscall,22) — All
2017-10-07 21:55:26


v 3.1.2
При ошибках в расстановке круглых скобок синтаксис сыпется не только в случае с "наружным" кодом типа room {}, но и когда забыта вторая скобка в строковом значении, правильно выделенном знаками '' . Пример
obj {
	nam = 'уйти1';
	dsc = '{^> Выбраться наружу.'; -- вторая фигурная скобка отсутствует.
...
... }
При запуске игры сообщений об ошибке синтаксиса нет, как если бы это было в наружном коде (описание room или obj), но сам факт перехода на сцену, куда помещен такой объект приводит к зависанию игры (под Windows). Что снимается только закрытием этого окна.

[>] p.s. еще
std.prog
Wol4ik(syscall,22) — All
2017-10-08 07:06:30


Вопрос вот в чём, что я делаю не так во здесь. У меня есть глобальная переменная, которая меняется от событий с объектами и на сценах - hot. hotmax - тоже глобальная переменная, но проблема не в ней. Изначальное значение hot задается перед игрой и оно не равно нулю. Допустим, = 20. hotmax тоже 20. Их значение отображается постоянно в инвентаре при помощи объекта Статуса тепла.

obj {
	nam = 'тепло';
	pri = -100;
	disp = function ()
		  p ('тепло ', hot,'/', hotmax);
	       end;
}
У меня много что на hot воздействует, но при вычитании десятичных дробей из hot (например hot = hot - 0.2) всё идет и отображается хорошо, но между нулём и единицей, а особенно когда вычитание ведёт к hot к чистому нулю - hot начинает отображаться в инвентаре некорректно. Измучившись в поисках своей ошибки, я создал объект который КОНТРОЛИРУЕМО и прозрачно вычитает из hot дробные значения. И положил его на сцену.
obj {
	nam = 'вычесть';
	dsc = '{^> Вычесть.}';
	act = function ()
			hot = hot - 0.2;
		  end;
}
Он имитирует падение тепла персонажа по нажатию. Вычитание и отображение hot в инвентаре происходит корректно пока не достигает единицы. Т.е. (19.8 ... 19.6 ... 19.4 ... ... 1.2 ...). Далее, при вычитании из единицы отображается уже число в каком-то некрасивом длинном виде и неточно. пишу в порядке убывания:
1.2 - норм. вычитаю еще 0.2
1 - норм. вычитаю еще 0.2
0.80000000000004- уже не норм. вычитаю еще 0.2
0.60000000000004- уже не норм. вычитаю еще 0.2
0.40000000000004- уже не норм. вычитаю еще 0.2
0.20000000000004- уже не норм. вычитаю еще 0.2
3.7581049383562e-014 - не норм.

Это касается случаев не только с десятыми, но и с сотыми (то есть при вычитании 0.02). В чём моя ошибка, что я сделал не так? Я хочу, чтобы, когда вес предметов (при их отсутствии) был равен нулю, то и объект статуса выводил ноль.

[>] Re: p.s. еще
std.prog
Wol4ik(syscall,22) — Wol4ik
2017-10-08 07:23:21


п.с. При многократном вычитании из целого по 0.5 - Всё отображается корректно и адекватно начинает уходить и отображаться в отрицательных значениях.
2
1.5
1
0.5
0
-0.5
-1
и т.д. всё нормально в общем.
----
Но уже при вычитании 0.4 проблемы (начал последовательно вычитать из двадцати, чтоб к нулю всё было ровно).
20
19.6
19.2
...
...
1.2
0.8
0.4 - далее вычитаю из этой оставшейся 0.4 еще 0.4 и по идее должен получиться чистый ноль, но следующее значение такое...
4.1078251911131

Возможно я не знаю всех свойств переменных и выбрал не тот тип.
У меня она задается так
global {
        hot = 20;
        hotmax = 20;
        ...
        (иные числовые переменные)
        }

[>] Вот. сделал отдельный код для запуска, прошу проверить непосредственно в игровом режиме
std.prog
Wol4ik(syscall,22) — All
2017-10-08 07:46:31


Нажимать придется подольше, идти с 20 по кусочкам в 0.2, и я бы сделал не с 20, а с 2-х, чтобы облегчить тест программы, но обнаружил, что если изначальное число не 20, а например 2 или 3, то характер некрасивого отображения числа в инвентаре меняется. Даю полный текст файла main3.lua
-- $Name:Программа теста дробей$
-- $Version: 0.1$
-- $Author: Wol4ik$

require "fmt";

global {
             hotmax = 20;
             hot = 20;
       }
--
obj {
	nam = 'вычесть';
	dsc = '{Вычесть.}';
	act = function ()
			hot = hot - 0.2;
		  end;
     }
--
obj {
	nam = 'тепло';
	pri = -100;
	disp = function (s)
				p ('тепло ', hot,'/', hotmax);
		   end;
	}
--
room {
		nam = 'main';
		onenter = function (s)
					pl.obj:add 'тепло'; -- помещение в инвентарь статуса тепла.
				  end;
		decor = [[Для уменьшения тепла на 0,2 нажать на "вычесть".]];
		obj = {'вычесть'};
      }
-- конец кода.

[>] Re: Докладываю
std.prog
Wol4ik(syscall,22) — Peter
2017-10-08 09:27:15


Пётр, спасибо. Всё сделал. И то, и то заработало, как надо.

[>] Делюсь
std.prog
Wol4ik(syscall,22) — All
2017-10-08 19:57:42


...в продолжение выше опубликованных сообщений. Если идет работа с выводом дробной переменной, то я понял, что лучше ставить округление заведомо больше.
p ('тепло ', round(hot,2)); -- округление вывода hot c аргументом 2 по совету Петра.
В примере Петра, работало округление round (переменная, 2) при шаге вычитания не более 0.2. Но при шаге вычитания 0.4 округление ...,2 выдает при чистом нуле "-0" (минус ноль). Снимается это установкой избыточного округления ...,3 вместо 2.
p ('тепло ', round(hot,3)); -- округление вывода hot c аргументом 3. Если результат вычитания 
                            -- равен нулю, то выводится чистый обычный ноль без всяких знаков.

[>] Re: Делюсь
std.prog
Wol4ik(syscall,22) — Peter
2017-10-09 06:48:58


Проверил на другом компьютере, там минус ноль не выводилось при старых параметрах. Странно. Обновленный Инстед и код ношу на флешке с собой. Проверю вечером на прежнем ПК, с новой функцией и без нее. Но совершенно точно вчера выдодился минус ноль при нуле и я это устранил изменением аргумента округления с 2 на 3. Тщательно перепроверю все, чтобы исключить неверное понимание.

[>] Re: Делюсь
std.prog
Wol4ik(syscall,22) — Peter
2017-10-09 10:02:33


Пётр, а вдруг не у всех будет Инстед3 обновленный из гита. Я вот пока думаю переделать механику игры и не выводить само число тепла. А сделать так, вычисления с дробями проводить, как и раньше, но выводить результат словами - «холодно», «очень холодно», «прохладно», «жарко» и т.п.

Вопрос вот в чем, если я не вывожу на экран и никак не округляю результаты вычислений с дробями, они эти вычисления остаются точными? Ну то есть если результат вычитания равен нулю, то я могу этот ноль поймать в условии заданном if ... then... ?

П.с. все ранее оговоренные проверки функций я сделаю.

[>] Re: Делюсь
std.prog
Wol4ik(syscall,22) — Peter
2017-10-09 11:13:25


Да, конечно. Займусь сегодня. Раз мы это обсуждаем, спрошу еще одно на будущее. Как сделать вывод фиксированного количества знаков после запятой в дроби, даже если там нули? Да так, чтобы round работал при выводе? (Понял, что round проще делать только для вывода p, pn)
0.2 => 0.200

[>] результваты
std.prog
Wol4ik(syscall,22) — All
2017-10-09 19:19:20


function round(num, numDecimalPlaces)
	local mult = 10^(numDecimalPlaces or 0)
	return math.floor(num * mult + 0.5) / mult
end
--
obj {
	nam = 'тепло';
	pri = -100;
	disp = function (s)
			p ('тепло ', string.format("%.3f", hot),'/', hotmax);
		   end;
     }
Вышеуказанное при вычитании из 24 чисел по 0.6 - при чистом нуле hot выводит -0.000
Далее, всё то же самое только заменена сторочка:
p ('тепло ', string.format("%.3f", round(hot,2)),'/', hotmax);
При достижении чистого нуля выводится всё корректно, т.е. 0.000

[>] Re: результваты
std.prog
Wol4ik(syscall,22) — Peter
2017-10-09 19:41:19


Если бы я был как-бы пользователем очередной новой функции или версии Stead 3.x.x, чисто гипотетически. Мне было бы проще задавать так. Если я хочу, чтобы данная переменная выводилась с нужной постоянной детализацией знаков после запятой, то при первичном присвоении значения сразу их и прописать. Например.
global {
         биткоины = 0.000; -- при любых вычислениях вывод p будет всегда с 3-мя знаками после запятой.
         выстота = 0.00; -- при любых вычислениях вывод p будет всегда с 2-мя знаками после запятой.
         тепло = 0; -- вывод будет иметь столько знаков после запятой,сколько нужно,
                    --- но без лишних нулей: 1.2 ... 1.000000002 ... 1 ... 6 .... 0 ....
        }
Это, разумеется не в плане советов, а на правах вольной фантазии.

[>] Re: Докладываю
std.prog
Wol4ik(syscall,22) — Peter
2017-10-09 21:06:58


На всякий случай, вот еще наблюдение. Stead никак не реагирует на ошибки в фигурных скобках, но теперь уже в случае:
decor = [[...бескрайнее белое поле.^^
	{@ walk e38|> Отправиться к маленькому участку леса.]]; -- вторая фигурная скобка отсутствует.
Ранее же мы обсуждали то же самое но в одинарных кавычках. В этом же аналогичном случае ничего страшного не происходило. Не было зависаний. Просто вместо активной ссылки "> Отправиться..." , на экране отображалась неактивная ссылка "{@ walk e38|> Отправиться к маленькому участку леса."

Сообщений от ошибке синтаксиса @ walk внутри [[]] не выводилось.

[>] Re: результваты
std.prog
Wol4ik(syscall,22) — Peter
2017-10-10 07:04:56


pf станно себя ведет. Вот старый вид, он выводит смесь строковых заготовок и переменных.
p ('тепло ', string.format("%.3f", round(hot,2)),'/', hotmax);
Выводится следующее ..... тепло 19.600/24
При pf же с кодом
p ('тепло ', pf("%.3f", round(hot,2)),'/', hotmax);
"тепло и hot меняются местами, а то, что после hot, вообще не выводится. Выглядит вывод теперь так:
19.4000тепло

[>] Re: результваты
std.prog
Wol4ik(syscall,22) — Peter
2017-10-10 07:30:46


Ага, теперь красиво. Только я пробелы убрал около слэша. То есть есть некие служебные меры
1. %d
2. %.3f
3. еще что-то...
Более мене пончл как их настраивать 3f 2f и тд.

[>] Об'екты на сцене и в инвентаре
std.prog
Wol4ik(syscall,22) — Peter
2017-10-11 13:07:27


Добрый день. Возник еще один вопрос. При создании obj есть такой параметр pri. Он работает не только в инвентаре, но и на сцене. Вопрос вот в чем, если у двух и более выложенных на сцену об!ектов (drop или place) совпадают pri, то как происходит их визуальная компановка при добавлении новых?

То есть например "Лежит {коробка конфет}" (pri = -100) я на нее кликнул и на сцене появляется еще один об!ект "{конфета}" (тоже pri = -100). Вывод динамической части Инстед, что, сдвинет коробку и перед ней слева поставит конфету? Но она вроде позже по времени появилась.... Или как? Мне нужно, чтобы добавляемый об!ект помещался всегда слева перед предыдущими ранее выложенными об!ектами. Возможно ли это?

Вопрос2. Работает или как сделать чтоб заработал act об!екта, уже лежащего в инвентаре? Это лишает его use и inv, ну и пусть.

[>] Re: Об'екты на сцене и в инвентаре
std.prog
Wol4ik(syscall,22) — Peter
2017-10-11 14:59:07


Второй вопрос был про предмет, который лежит только в инвентаре. Я не нашел способ сделать реакцию игры на единичное нажатие на него в инвентаре. act это позволяет сделать, но только когда об!ект лежит на сцене.

Про конфеты, ты, к сожалению, прав. При разном значении pri об!екты на сцене конкурируют и двигают порядок. Но при одинаковом pri, вывод идет как ты сказал, то что позже, то после тгго что было выведено ранее.

[>] Re: Об'екты на сцене и в инвентаре
std.prog
Wol4ik(syscall,22) — Peter
2017-10-11 15:14:18


Спасибо. Теперь мне понятно.

[>] Докладываю
std.prog
Wol4ik(syscall,22) — All
2017-10-14 17:07:31


Обнаружил вот что. Возможно это баг, а возможно это я нарушаю правила использования объектов типа obj. Вот код.
obj {
	nam = 'искать';
	state = 1;
	dsc = function(s)
			local dsc = {
					'{> Попытаться исследовать лес, несмотря на холод.^}',
					'> Лес исследован.{^}' --- !!! вот эта строчка, про нее доклад.
                                     }; 
					p(dsc[s.state])
			end;
	act = function (s)
			p [[Исследовав лес... (длинное описание найденного)]];
			s.state = 2;
			hot = hot - 5;
			return;
			end;
}
Представим, что таких объектов, подобных этому несколько. И если они помещены на сцену, то их dsc располагаются в столбик, так как присутствует символ ^. Почему я сделал '> Лес исследован.{^}' вместо того, чтобы сделать '> Лес исследован.^' ??? Дело в том, что dsc объектов типа obj игнорирует символ ^ если он не помещен в фигурные скобки {}. Возможно, так задумано. Я просто отчитался.

[>] Re: Переводы строк в конце dsc/decor и др. методов
std.prog
Wol4ik(syscall,22) — Peter
2017-10-15 10:11:30


Понял. Буду иметь в виду. Был не прав.

[>] Музыка и звуки
std.prog
Wol4ik(syscall,22) — All
2017-10-19 20:26:41


Прошу прощения, но я не нашел способ воздействия кодом на громкость музыки (music). Делал ее при помощи snd.play.

[>] Re: Музыка и звуки
std.prog
Wol4ik(syscall,22) — Wol4ik
2017-10-19 22:48:45


p.s. Вот, набросал программку.
snd.pan не действует на громкость проигрывания music (оно и логично, так как канал неизвестен),
в документации не сказано, как задавать громкость music. Может есть недокументированная команда для этого?
require "snd" -- модуль музыки и звуков
-- требуется два *.ogg файла с музыкой в корне папки с игрой и файлом main3.lua,
-- для этой программы их имена заданы как 'ice1.ogg' и 'basketcase.ogg'
--
global {
	volume = 50;
}
--
room {
	enter = function()
				put ('Включить музыку');
				put ('Отлючить музыку');
				put ('Включить звук');
				put ('Отлючить звук');
				put ('Увеличить');
				put ('Уменьшить');
				pl.obj:add 'громкость';
			end;
	nam = 'main';
	decor = 'Тест музыки и звуков';
}
--
obj {
	nam = 'Включить музыку';
	dsc = '{Play music^}';
	act = function()
			snd.music('ice1.ogg');
		  end;
}
--
obj {
	nam = 'Отлючить музыку';
	dsc = '{Stop music^}';
	act = function()
			snd.stop_music();
		  end;
	
}
--
obj {
	nam = 'Включить звук';
	dsc = '{Play sound^}';
	act = function()
			snd.play('basketcase.ogg', 1, 0);
		  end;
}
--
obj {
	nam = 'Отлючить звук';
	dsc = '{Stop sound^}';
	act = function()
		    snd.stop(1);
		  end;
}
--
obj {
	nam = 'Увеличить';
	dsc = '{+ volume^}';
	act = function()
		    volume = volume + 10;
		    snd.pan (1, volume, volume);
		    return;
		  end;
	
}
--
obj {
	nam = 'Уменьшить';
	dsc = '{- volume^}';
	act = function()
		    volume = volume - 10;
		    snd.pan (1, volume, volume);
		  end;
}
--
obj {
	nam = 'громкость';
	disp = function()
		    p (volume);
		    return;
		  end;
}

[>] Re: Музыка и звуки
std.prog
Wol4ik(syscall,22) — Peter
2017-10-20 07:39:07


Еще эта программа доказыват возможность управление громкостью заданного звука прямо во время его проигрывания. Это можно использовать например при создании эффекта приближения и удаления от источника звука, а также для плавного "перекатывания" звука с левого на правый динамик и обратно. Можно даже писать трекерную музыку из сеплов при помощи кода Инстед)))
Спасибо за пояснения про music, а то я думал, что опять что-то упустил в докумнтации.

Pages: 1 2