RU 📌 Pinned

Как сделать?

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

7Юрий3,
Дык на главной, слева сверху.
https://discord.gg/SMvzEFm

Aleks Versus Moderator 14.12.2021 17:11 (4 years ago)

7Юрий3,
есть вероятность, что от игры мало что осталось. Сам не раз терял таким образом многомесячные наработки. Очень рекомендую, если не перейти на работу с исходниками и сохранением всех изменений в удалённом репозитории, хотя бы самому перед каждым сеансом разработки архивировать всю игру, или завести аккаунт на облаке, поддерживающем автоматическую синхронизацию. Чтобы всегда имелись резервные копии файлов. Ещё неплохо бы разбивать игру на модули, а не хранить все её составляющие в одном файле. Потерять неделю работы не так обидно, как месяц. Месяц - не так обидно, как год. А год - не так обидно, как вообще всё.
https://youtu.be/jgAnP4Hrfvk

Aleks Versus,
Спасибо за совет. Теперь буду умнее) Ни когда такого не было и вот опять случилось))

Добрый день!
у меня появился новый, вполне вероятно, дурацкий вопрос :) Я пытаюсь сделать эмулятор киностудии, игрок снимает фильмы и, само собой, без оборудования никак. Оно нужно не только как атрибут, но и для последующего определения качества фильма, то есть, характеристики оборудования пойдут в общую формулу качества продукта.

У каждый элемент оборудования это набор характеристик: текстовой и числовых:

$item[1]='Камера1' !название
itmqual=5 !качество
itmdown=15 !срок службы 
itmprice=150 !цена

теперь мне надо сделать какую-то универсальную форму, чтобы в финальной формуле определения качества подставлялись данные того оборудования, которое пользователь выбрал для конкретного фильма (например, itmqual[itm])

Вопрос мой такой: могу ли я характеристикам оборудования в качестве индекса как-то присвоить данные массива $item? Я понимаю, что формула itm=$item не работает, но, может, есть какие-то “переходники”?

Спасибо!

jazzy77,

$item[1]='Камера1' !название
itmqual['Камера1']=5 !качество
itmdown['Камера1']=15 !срок службы
itmprice['Камера1']=150 !цена

Потом

itmqual[$item[1]]
itmdown[$item[1]]
itmprice[$item[1]]

Так надо было?

dmvikar,
я в силу полного своего неумения программировать плохо объясняю :) Проблема в том, что у меня будет формула, определяющая качество продукта. В ней будут несколько характеристик и выглядеть она будет как-то так:

качество_сценария+опыт_режиссера+опыт_актера1+опыт_актера2+...+качество_оборудования

В том варианте, который вы предлагаете, мне нужно будет писать много IF - в зависимости от того, какое конкретно оборудование использовано. А я хотел бы сделать какой-то универсальный оператор itmqual[itm], который понимал бы, что ему надо взять данные из определенного массива. Например, у меня есть:

itmqual[$item[1]]=10
itmqual[$item[2]]=50
itmqual[$item[3]]=100

и игрок использует для съемки $item[2]
как мне показать системе, что она должна для универсальной формулы itmqual[itm] забрать данные из itmqual[$item[2]]=50?

Надеюсь, у меня получилось объяснить :) простите за корявость :)

jazzy77,
А как ты определяешь, какой итем используется?

Так и запишешь
качество_сценария+опыт_режиссера+опыт_актера1+опыт_актера2+…+itmqual[$item[2]]

dmvikar,
предполагал это делать через

itmactive[$item[2]]=1

Так и запишешь
качество_сценария+опыт_режиссера+опыт_актера1+опыт_актера2+…+itmqual[$item[2]]

я пытаюсь уйти от большого количества IF-ов, потому что оборудования будет довольно много, а в этом варианте IF неизбежен.

jazzy77,
Тебе нужно что-то типа
$use_item=$item[1]
Таким образом, ты получишь имя используемого предмета, которое в последствии будешь использовать, как индекс в формуле.
itmqual[$use_item]
Можно было и как я выше писал, там не нужно никаких if. Но ты должен знать, какой итем используешь.

Приветствую. Необходимо прописать НПС на локации в определенное время, и соответственно их перемещение. Читал тему на форму на счет этого, но у меня есть собственный вариант:
Можно прописать НПС и возможность вступить с ними в диалог в виде простого условия через If hour и тд. Соответственно в определенные промежутки времени эта опция будет доступна, а в другие нет.
Вопрос собственно вот в чем: Не приведет ли это потом к различным ошибкам в накоплении переменных? Поскольку с НПС можно будет торговать, улучшать репутацию (что записывается в простейшие переменные РепутацияТорговца=РепутацияТорговца+1). Каким образом еще можно прописать НПС на локации, без обработки множества локаций через gs? В моем варианте существует отдельная локация с именем нпс, к которой осуществляется переход через действие, и собственно локация в которой этот НПС доступен в определенное время. Заранее спасибо

Доброго времени суток, Piksha.

Вопрос собственно вот в чем: Не приведет ли это потом к различным ошибкам в накоплении переменных?

Не приведет. Порог переменных более чем высокий. Даже при неграмотном алгоритме достигнуть его трудно.
Отдельно можете сделать условие вроде: если значение выше максимума - значение выравнивается к максимальному.

Каким образом еще можно прописать НПС на локации, без обработки множества локаций через gs?

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

If hour > 9 and hour < 18:
If Разговор_с_Мишель = 0:
    Act 'Поговорить с Мишель':
       Разговор_с_Мишель = 1
    GOTO $Curloc
    End
Else
   Act 'Поговорить о погоде':
   [код разговора]
   End
   Act 'Торговать':
   [код торговли]
   End
   Act 'Попрощаться':
   Разговор_с_Мишель = 0
   GOTO $Curloc
   End
End
End

В данном варианте всё еще более упрощено до одной локации. Нужно понимать, что и GOSUB - всего лишь метод вызова разделенного кода. Так, весь код можно держать на отдельной локации и вызывать через действие или гиперссылку. Правда, по-сути вы “сохраните” только переменную-флажок взаимодействия с персонажем.

Если я не смог ответить - уточняйте.

Спасибо за ваш ответ. Дополнительный вопрос по условиям If.
Есть код вида:

If Переменная 1=>0 and Переменная 1<=20: Ивент = rand (1,2) 
If Переменная 1=>20 and Переменная 1<=40:  Ивент = rand (1,4)
If Переменная 1=>40 and Переменная 1<=60: Ивент = rand (1,6)
If Переменная 1=>60 and Переменная 1<=80: Ивент= rand (1,8)
If Переменная 1=>80 and Переменная 1<=100: Ивент = rand (1,10)

Он устанавливает пределы, для рандомизации и последующего случайного события. К примеру в пределах 0-20, может случится только событие 1,2 а в пределах 80-100 от 1 до 10.
Но вот проблема, мне необходимо внести в этот код еще критерий времени. Как я понимаю более 3х параметров, даже через and внести в условие If невозможно (в одной строке кода), что приводит к тому, что критерий времени получится внести только НАД данным кодом, что то типа такого:

If Час=>6 and Час <=20:
 If Переменная 1=>0 and Переменная 1<=20: Ивент = rand (1,2) 
 If Переменная 1=>20 and Переменная 1<=40:  Ивент = rand (1,4)
 If Переменная 1=>40 and Переменная 1<=60: Ивент = rand (1,6)
 If Переменная 1=>60 and Переменная 1<=80: Ивент= rand (1,8)
 If Переменная 1=>80 and Переменная 1<=100: Ивент = rand (1,10)

Вопрос собственно вот в чем: А нужно ли вообще при задавать два условия для создания предела?
К примеру в строчке

If Переменная 1=>0 and Переменная 1<=20: Ивент = rand (1,2)

Предел 0-20. Можно ли оставить If Переменная 1=>0 и так далее? Получится что при значании переменной 1 = 100, будут выполнятся все условия и рандомизация произойдет несколько раз, но для нас то какая разница? если последняя рандомизация все равно будет между 1-10?
Т.е упросить код и сделать следующее:
If Переменная 1=>0: Ивент = rand (1,2)
If Переменная 1=>20: Ивент = rand (1,4)
If Переменная 1=>40: Ивент = rand (1,6)
If Переменная 1=>60: Ивент= rand (1,8)
If Переменная 1=>80: Ивент = rand (1,10)
Небольшое пояснение: Этот код - механизм генерации случайного ивента. Он записан на локации самого ивента (ИвентКоридор)
Сам шанс на ивент, генерируется в процессе перехода. (так как он происходит как бы между локацией 1 и локацией 2) с помощью команды rand.
Дополнительно буду рад примерам кода, либо вашим идеям как задать увеличение количества возможных ивентов в зависимости от значения переменной.


Вопрос 2, сугубо теоретический: $ONNEWLOC=“Локация”, задает служебную локацию с именем “Локация”, обработка которой происходит КАЖДЫЙ РАЗ при смене локации, через gt? Именно поэтому на неё выносят различные параметры обновляемые между переходами? К примеру статистику, время и прочее?

Piksha:

Как я понимаю более 3х параметров, даже через and внести в условие If невозможно (в одной строке кода)

Можно.

Piksha:

что приводит к тому, что критерий времени получится внести только НАД данным кодом, что то типа такого:

Только - нет, можно третьим параметров добавлять, но не нужно. твой вариант - это оптимизация.

Piksha:

Вопрос собственно вот в чем: А нужно ли вообще при задавать два условия для создания предела?

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

Piksha:

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

Определи условия при которых должен срабатывать ивент и его вероятность. От этого будет зависеть код.

Piksha:

Вопрос 2, сугубо теоретический: $ONNEWLOC=“Локация”, задает служебную локацию с именем “Локация”, обработка которой происходит КАЖДЫЙ РАЗ при смене локации, через gt? Именно поэтому на неё выносят различные параметры обновляемые между переходами? К примеру статистику, время и прочее?

Да.

Aleks Versus Moderator 06.02.2022 12:21 (4 years ago)

Piksha:

Т.е упросить код и сделать следующее:
If Переменная 1=>0: Ивент = rand (1,2)
If Переменная 1=>20: Ивент = rand (1,4)
If Переменная 1=>40: Ивент = rand (1,6)
If Переменная 1=>60: Ивент= rand (1,8)
If Переменная 1=>80: Ивент = rand (1,10)

Есть возможность сделать исключающее условие в твоём случае:

if переменная_1>=80:
   ивент=rand(1,10)
elseif переменная_1>=60:
    ивент=rand(1,8)
...и т.д.

это будет, во-первых, более читаемо, а во-вторых, более правильно и позволит избежать багов в дальнейшем.

Piksha:

If Переменная 1=>0: Ивент = rand (1,2)
If Переменная 1=>20: Ивент = rand (1,4)
If Переменная 1=>40: Ивент = rand (1,6)
If Переменная 1=>60: Ивент= rand (1,8)
If Переменная 1=>80: Ивент = rand (1,10)

ивент = rand(1,((min(переменная,99)/20)*2)+2)

Log in or Register to post comments.