Как сделать?
…
Алекс, а такой вопрос: у разных объектов - разные свойства. Дверь можно открыть, зеркало - разбить. Если попытаться применить “разбить” к “двери”, то ничего не выйдет. Как прописать такие свойства, если можно?
И: можно ли глянуть на какой-нибудь код твоей игры, чтобы попытаться разобраться?
Поглядел на RTADS. Прикольно. Бейсик я знал еще со школы. А теперь придётся учить perl, видимо. :)
Nex:
Парсерную игру будет легче сделать на специальном парсерном движке, например RTADS или RInform.
Есть ещё менее популярные, но предположительно более простые в освоении отечественные разработки: 6 дней, TOM.
NaaMan,
))) я ещё ни одной игры не написал. Пока есть только наброски и незаконченный движок.
Если ты действительно пишешь парсер, то тут надо очень хорошо всё продумать. Предположим у тебя есть четыре объекта: зеркало, чашка, железная дверь и стеклянная дверь. Прописать свойства очень просто. Если идти от твоей модели, можно так:
$property['чашка'] = 'хрупкий; белый; предмет; ёмкость; пустой;'
Другое дело этими свойствами воспользоваться. У меня менюшный движок и количество действий, название действий я задаю сам. То есть у меня есть строгая привязка типового действия к предмету конкретного типа, и игрок не может даже попытаться разбить дверь, если только я ему не позволю. В парсере всё несколько сложнее. “Разбить” в отношении чашки и зеркала означает “уничтожить объект”, иногда “превратить один объект в другой” (чашку или зеркало в “осколки”). Но в отношении стеклянной двери это означает “разблокировать проход”. То есть на одно и то же название действия будут фактически совершенно разные действия. Тебе нужно научить парсер не только проверять по глаголу “разбить”, есть ли у объекта свойство “хрупкий”, но и проверять другие свойства. Например, если герой разобьёт чашку с горячим кофе - он должен обжечься, или испачкать пол, а за стеклянной дверью может не оказаться прохода. И это всё тоже некие свойства объекта, к которому применяется действие. Комбинационный взрыв, чтоб его. Зато ты можешь приписать чашке все свойства стеклянной двери, и когда герой нечаянно её разобьёт, и ему откроется дорога на Багамы, - будет приятный нелогичный нежданчик.))
Алекс, объясни, пожалуйста, как ребенку, для чего ты используешь объект RESPAWNER? Что за данные в нём хранятся? Я так понял, они как-то связаны с предметами, существующими в игре? Как пользоваться этим массивом, с чем сравнивать данные и когда? Какой выигрыш от этого массива?
NaaMan,
ответил в личку.
Как сделать, чтобы обновились только данные с основного экрана? Чтобы действия и все остальное не менялось, а только значения переменных в основном описании обновились.
RomaDova,
GOTO $CURLOC
Примеров подобного поведения, полно в учебнике.
Но ведь GOTO $CURLOC полностью перезагружает локацию, а мне нужно, чтобы обновилось только окно основного описания.
RomaDova,
в чём проблема-то?
Покажи на конкретном примере, что пытаешься сделать и что не получается.
Создание расы в GrandCivilization возьму в качестве примера. Там есть меню с параметрами. После того как ты нажимаешь плюс или минус, переменная параметра соответственно меняется, но на экране будут отображаться старые данные до тех пор, пока ты не обновишь уровень при помощи GOTO $CURLOC’a или не вернешься на эту локацию позже. Мне надо обновить эти данные, не затрагивая меню выбора действий, так как они тоже перезагружаются вместе с уровнем при использовании GOTO $CURLOC. Есть оператор который обновляет основной экран?
RomaDova,
есть много способов.
Например, разделить локацию на две. На одной код, на другой описание. Причём на локации с описанием в самом начале *clr.
В нужном месте просто вызываешь локацию с описанием через GS.
RomaDova,
ясно.
Та проблема, с которой ты столкнулся в “Цивилизации”, это необходимость работы одной локации в нескольких режимах.
Для этого нужно завести специальную переменную, которая будет отвечать за переключение режима. В зависимости от состояния этой переменной, выводить описание локации и действия.
Вот переработанная по этому локация из “Цивилизации”. Заметь, дублирования текста уже нет, так же как операторов CLR и CLA. Всё изменение происходит чётко по “GOTO $CURLOC”.
IF $режим = '':
'<font color=#4CFF00>МЕНЮ ЭВОЛЮЦИИ</font>
Баллы: <font color=#DD52ED><<баллы>> ?</font>
Мозг: <font color=#00FFFF><<мозг>></font>
Сердце: <font color=#00FFFF><<сердце>></font>
Пищевод: <font color=#00FFFF><<пищевод>></font>
Покров: <font color=#00FFFF><<покров>></font>'
$backimage=0
IF баллы=0:
ACT "Готово":
gt "Создание2"
END
ELSE
ACT 'Мозг':
$режим = 'мозг'
GOTO $CURLOC
END
ACT 'Сердце':
$режим = 'сердце'
GOTO $CURLOC
END
ACT 'Пищевод':
$режим = 'пищевод'
GOTO $CURLOC
END
ACT 'Покров':
$режим = 'покров'
GOTO $CURLOC
END
END
ELSE IF $режим = 'мозг':
$backimage="co/neuro.png"
"Нейронные ткани -
развитость мозга расы.
Отвечает за колличество
высокоинтеллектуальных
представителей.
Развитость: <<мозг>>
Баллы: <<баллы>> ?"
ACT "+":
IF баллы>0:
баллы=баллы-1
мозг=мозг+1
GOTO $CURLOC
ELSE
MSG "Не хватает баллов Эволюции"
END
END
ACT "-":
IF мозг>1:
баллы=баллы+1
мозг=мозг-1
GOTO $CURLOC
ELSE
MSG "Деградация невозможна"
END
END
ACT "Готово":
$режим = ''
GOTO $CURLOC
END
ELSE IF $режим = 'сердце':
... аналогично ...
ELSE IF $режим = 'пищевод':
... аналогично ...
ELSE IF $режим = 'покров':
... аналогично ...
END
Доброго времени суток, друзья. Скажите, можно ли каким-либо способом узнать текстовый индекс элемента массива. Функция ARRCOMP, например, возвращает целочисленное значение. У меня же именованные индексы и не хотелось бы записать значение не туда, куда надо…
NaaMan,
Olegus t.Gl.:
Zores:
Хотелось бы уточнить один момент с оператором KILLVAR. В частности, удаления из массива значения с определённым индексом.
Если, для примера, у меня есть процедура для удаления некоторых значений из массива. Значения передаются через аргументы. Индексация массива сложная, т.е. индекс состоит как из самого аргумента, так и из статичной строки (например, ‘<<ARGS[0]>>_A’). Как тогда удалить нужный элемент, ведь в KILLVAR для значения аргумента строка не подходит?
Нужно создать локацию с именем “УдалитьИзМассиваПоКлючу” и следующим кодом:
! Параметры ! 1. 0 - Имя массива (тип: строка) ! 2. 1 - Строковый ключ удаляемого элемента (тип: строка) !---------- dynamic "$<<$ARGS[0]>>[$ARGS[0]] = '!@#$%^del^%$#@!'", $ARGS[1] killvar $ARGS[0], arrpos('$' + $ARGS[0], '!@#$%^del^%$#@!') !----------После чего можно удалить элемент со строковым индексом из массива с помощью команды
GS 'УдалитьИзМассиваПоКлючу', 'ИмяМассива', 'ЗначениеСтроковогоИндекса'
Получить текстовое значение индекса скорее всего нельзя, если только ты не ведёшь запись индексов в другой массив. По-моему так.