RU 📌 Pinned

Как сделать?

Dark[Ol(U23)leneri] #34 18.04.2010 22:57 6408 comments 2435472 views

Поглядел на RTADS. Прикольно. Бейсик я знал еще со школы. А теперь придётся учить perl, видимо. :)

Nex:

Парсерную игру будет легче сделать на специальном парсерном движке, например RTADS или RInform.

Есть ещё менее популярные, но предположительно более простые в освоении отечественные разработки: 6 дней, TOM.

Aleks Versus Moderator 16.10.2014 10:33 (11 years ago)

NaaMan,
))) я ещё ни одной игры не написал. Пока есть только наброски и незаконченный движок.
Если ты действительно пишешь парсер, то тут надо очень хорошо всё продумать. Предположим у тебя есть четыре объекта: зеркало, чашка, железная дверь и стеклянная дверь. Прописать свойства очень просто. Если идти от твоей модели, можно так:

$property['чашка'] = 'хрупкий; белый; предмет; ёмкость; пустой;'

Другое дело этими свойствами воспользоваться. У меня менюшный движок и количество действий, название действий я задаю сам. То есть у меня есть строгая привязка типового действия к предмету конкретного типа, и игрок не может даже попытаться разбить дверь, если только я ему не позволю. В парсере всё несколько сложнее. “Разбить” в отношении чашки и зеркала означает “уничтожить объект”, иногда “превратить один объект в другой” (чашку или зеркало в “осколки”). Но в отношении стеклянной двери это означает “разблокировать проход”. То есть на одно и то же название действия будут фактически совершенно разные действия. Тебе нужно научить парсер не только проверять по глаголу “разбить”, есть ли у объекта свойство “хрупкий”, но и проверять другие свойства. Например, если герой разобьёт чашку с горячим кофе - он должен обжечься, или испачкать пол, а за стеклянной дверью может не оказаться прохода. И это всё тоже некие свойства объекта, к которому применяется действие. Комбинационный взрыв, чтоб его. Зато ты можешь приписать чашке все свойства стеклянной двери, и когда герой нечаянно её разобьёт, и ему откроется дорога на Багамы, - будет приятный нелогичный нежданчик.))

Алекс, объясни, пожалуйста, как ребенку, для чего ты используешь объект RESPAWNER? Что за данные в нём хранятся? Я так понял, они как-то связаны с предметами, существующими в игре? Как пользоваться этим массивом, с чем сравнивать данные и когда? Какой выигрыш от этого массива?

Aleks Versus Moderator 16.10.2014 14:30 (11 years ago)

NaaMan,
ответил в личку.

Как сделать, чтобы обновились только данные с основного экрана? Чтобы действия и все остальное не менялось, а только значения переменных в основном описании обновились.

RomaDova,

GOTO $CURLOC

Примеров подобного поведения, полно в учебнике.

Но ведь GOTO $CURLOC полностью перезагружает локацию, а мне нужно, чтобы обновилось только окно основного описания.

RomaDova,
в чём проблема-то?

Покажи на конкретном примере, что пытаешься сделать и что не получается.

Создание расы в GrandCivilization возьму в качестве примера. Там есть меню с параметрами. После того как ты нажимаешь плюс или минус, переменная параметра соответственно меняется, но на экране будут отображаться старые данные до тех пор, пока ты не обновишь уровень при помощи GOTO $CURLOC’a или не вернешься на эту локацию позже. Мне надо обновить эти данные, не затрагивая меню выбора действий, так как они тоже перезагружаются вместе с уровнем при использовании GOTO $CURLOC. Есть оператор который обновляет основной экран?

Aleks Versus Moderator 17.10.2014 12:21 (11 years ago)

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, например, возвращает целочисленное значение. У меня же именованные индексы и не хотелось бы записать значение не туда, куда надо…

Aleks Versus Moderator 18.10.2014 19:21 (11 years ago)

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.Вообще у вас чудесный обучающий материал,я,человек с нулевыми знаниями,уже на второй день могу хоть что-то сотворить,но этого мало:тебя обучают простейшим вещам,но чтобы сделать что-то интересное,нужно многое уметь.

Log in or Register to post comments.