Как сделать?
…
Поглядел на 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 'УдалитьИзМассиваПоКлючу', 'ИмяМассива', 'ЗначениеСтроковогоИндекса'
Получить текстовое значение индекса скорее всего нельзя, если только ты не ведёшь запись индексов в другой массив. По-моему так.
Нужно придерживаться правила. Либо использовать для массива всегда только текстовый индекс, либо всегда только числовой. Тогда нужды в “извлечении текстового индекса” не возникнет.
Что же касается выполнимости самой задачи…
Можно выяснить, какому числовому индексу соответствует известный текстовый индекс. Но текстовый индекс нам должен быть известен заранее.
Также, можно выяснить, присутствует ли вообще в массиве элемент с известным текстовым индексом.
При любом раскладе, автор должен знать заранее значение текстового индекса, чтобы искать его. Извлечь каким-то образом текстовый индекс из массива, кроме как перебором, невозможно. Текстовые индексы хранятся в памяти интерпретатора, но функций чтобы достать их, нет.
Доброго всем времени суток.Итак,мои вопросы:
1)Как сделать в игре смену дня и ночи,чтобы на каждое действие уходило какое-то время.(Только не нужно отсылать меня смотреть раздел время,я его читал,там слишком мало информации)Например в 21:00 базар закрывается,а в 7 открывается.И самое главное - отсчёт дней недели.
2)Также хотелось бы спросить про навыки и вероятности.Например,как прописать возможность нападения на моего героя волков в лесу ночью?Я видел в начале страницы посты про команду RAND или Rnd,но там несовсем понятно обьясняют.
3)Как мне прописать зависимость вероятности от навыков.Например,если навык ловли рыбы = 7,то вероятность поймать рыбу была бы 20% + <<Навык ловли рыбы>> = 27% ?
4)Ещё в некоторых играх я видел,что есть не три,а 4 или 5 окошек ,и именно в них отображается время,навыки и т.д.Это какая-то другая версия плеера или AeroQSP?Или может быть можно сделать какую-нибудь вещь,и из неё смотреть характеристики и время?
P.S.Вообще у вас чудесный обучающий материал,я,человек с нулевыми знаниями,уже на второй день могу хоть что-то сотворить,но этого мало:тебя обучают простейшим вещам,но чтобы сделать что-то интересное,нужно многое уметь.