Как сделать?
…
Например, для того, чтобы статы росли не +1, а +0,1 или +0,015. У меня в игре 1440 минут в сутках, а по времени игра занимает несколько месяцев. Просчёт ведётся ежеминутно. В некоторых случаях действие прерывается и надо, чтобы дробные не терялись.
Anakox,
Все “статы” ты должен вести в целых числах. То есть, во всех переменных хранятся целые числа, во всех формулах участвуют целые числа. А делить на соотв. количество разрядов и при необходимости отсекать дробную часть - только при выводе информации игроку и больше нигде.
Пример:
Требуется вести учёт энергии, с точностью до тысячных.
Изначально энергия 100,000 (сто целых ноль тысячных). Так как учёт ведётся в целых числах, умножаем все используемые константы на 1000 (требуемая точность).
энергия = 100000
Далее, нам нужно чтобы в результате какого-то действия отнялось 0,1 единиц энергии. Умножая на 1000, получаем 100.
энергия = энергия - 100
Пример для других констант. Проверка, что энергия меньше единицы (1,0). Точно так же умножаем константу на 1000.
IF энергия < 1000:
В формулах, где участвует эта переменная, ничего умножать на 1000 и делить не надо, т.к. умножение делается только для констант (явно заданных значений, а не переменных).
реальная_энергия = энергия * сила_талисмана
Исключением являются формулы, где этот параметр является коэффициентом. Например, сила критического удара находится в прямой зависимости от энергии. Тогда мы должны произвести действие в числителе, а поделить на точность - в знаменателе. Деление в таком случае всегда производится последним действием, чтобы не потерять точность вычислений.
критический_удар = (сила * энергия) / 1000
Разберём подробно. При силе 20 и энергии 0,5 получаем:
критический_удар = (20 * 500) / 1000 = 10000 / 1000 = 10
Если зависимость обратная, то числитель и знаменатель меняем местами. Допустим, шанс промахнуться имеет обратную зависимость от энергии. При этом 5% шанса есть даже при полной энергии.
IF энергия = 0:
промах = 100
ELSE
промах = 5 + ((100 * 1000) / энергия)
END
Делить для вывода дробных разрядов требуется только при выводе информации игроку.
*PL 'Энергия: ' + энергия / 1000 + ',' + энергия mod 1000
Очень много написано, спасибо. Но неужели вы подумали, что я, будь даже 8 летним ребёнком, не додумался бы просто умножить всё в 1000 раз? Это самое простое решение, которое только может прийти в голову. У него есть огромный недостаток: 1000000 - числа с 6 нулями на каждом шагу. Нолики визуально сливаются, огромными числами оперировать неудобно: не заметил один нолик и всё, все расчёты улетают в космос в самый неподходящий момент.
Я в процессе создания игры нашел 4 пути обойти ограничение, но 2 из них были слишком громоздкие, третье рассчитывалось программой слишком долго. Вот сейчас переделываю игру и привожу все формулы к четвёртому решению.
Уверен, что разработчики, которые делали не поделки на коленках для 10 минут игры, а более-менее серьёзные игры, сталкивались с этой проблемой и уже нашли решения до которых я не додумался. Вот и спрашиваю.
Anakox,
чтобы не путаться в нулях, заведи одну переменную и подставляй везде где должна быть указана точность.
! 0.1
Q / 10
! 0.13
(Q * 13) / 100
! 100
Q * 100
! вывод
*PL 'Энергия: ' + энергия / Q + ',' + энергия mod Q
неужели… не додумался бы просто умножить всё в 1000 раз
Учитывая, что выше написано
использую mod, но конструкция выглядит громоздко
то ты не придерживаешься описанных мной правил, а изобретаешь свои.
Вы.. наверное на “вы” обращаться не следует. Ты явно издеваешься. Твой совет сравним по смыслу с советом как чистить картофель в ответ на вопрос о тонкостях приготовления изысканного блюда. Картофель чистить я умею, элементарные конструкция уровня детского сада меня не интересуют.
p.s.: С твоей конструкции я начинал когда только скачал qgen. Потом, когда она стала слишком простой и не подходила для решения сложных задач, я перешел на неудобную хрень с mod. Потом понял, что хрень - лишь частичное решение и не позволяет реализовать многие задумки, но из-за желания поучаствовать в конкурсе пришлось на ней посидеть, ибо не было времени всё переделывать. Сейчас игру выслал на конкурс и первым делом исправляю костяк. В принципе, решение нашел неплохое. Всего 2 локации-счётчика и одна на обнуление. Если в них нет ошибок, то далее всю игру можно делать без опасения где-то забыть мелочь.
Просил лучший способ, я его рассказал. Что с этим делать, решай сам.
у меня добавляемые объекты в доме я хочу сделать чтоб он проверял стоит ли уже предмет в доме если стоит то делался доствуп действие посмотреть стул. при нажатие на которой вылезала картинка в отдельном окне
if ar=1:
act 'посмотреть на стул' :
view [$1/1.jpg]
end
end
FIdan,
IF стул_в_доме = 0:
ACT 'Поставить стул в дом':
стул_в_доме = 1
PL 'Вы поставили стул в дом'
GOTO $CURLOC
END
END
IF стул_в_доме = 1:
ACT 'Посмотреть на стул':
VIEW 'stul.jpg'
END
END
спасиба) я неправильно использовал view)
вопрос)
у меня условие
if at=1 ' стол у окна ((посмотреть|мебель,стол))':
end
по идее если стол есть то должна появлятся надпись стол у окна посмотреть где при нажатии посмотреть должен переходить в локацию мебель к метке стол
if $ARGS[0]='стол':
$metka = $ARGS[0]
$loc = $CURLOC
view '1/2.jpg'
if $ARGS[0]='стул':
$metka = $ARGS[0]
$loc = $CURLOC
view '1/1.jpg'
if $ARGS[0]='кровать':
$metka = $ARGS[0]
$loc = $CURLOC
view '1/3.jpg'
if $ARGS[0]='дверь':
$metka = $ARGS[0]
$loc = $CURLOC
view '1/4.jpg'
if $ARGS[0]='ставни':
$metka = $ARGS[0]
$loc = $CURLOC
view '1/5.jpg'
вот моя локация по задумке тыкаешь посмотреть и во вспомогаптельном окне появляется картинка
но я опять чтото сделал нетак)
и второй вопрос)
IF OBJ 'стол' and at=0:
ACT 'Поставить стол у окна':
DELOBJ 'стол'
дом=дом+1
at=1
msg 'Стол хорошо вписался в обстановку'
DELACT 'Поставить стол у окна'
END
END
что надо добавить к этой команде чтобы основное окно с описание локации обновилось
и появлялись надписи “стол у окна посмотреть”
1. Оператора вывода текста ты зачем-то запихнул внутрь условия. Надо так:
if at=1:
' стол у окна ((посмотреть|мебель,стол))'
end
2.
должен переходить в локацию мебель к метке стол
Во-первых, где END’ы от всех этих многострочных IF’ов?
Во-вторых, ты забыл осуществить собственно сам переход на метку. Это делается оператором JUMP.
3.
что надо добавить к этой команде чтобы основное окно с описание локации обновилось
GOTO $CURLOC
И DELACT не нужен.
Nex:
Во-вторых, ты забыл осуществить собственно сам переход на метку. Это делается оператором JUMP.
как это сделать?)
FIdan,
JUMP 'имя_метки'
...
:имя_метки
Ну или так:
JUMP $переменная_в_которой_хранится_имя_метки
Anakox:
Твой совет сравним по смыслу с советом как чистить картофель в ответ на вопрос о тонкостях приготовления изысканного блюда. Картофель чистить я умею, элементарные конструкция уровня детского сада меня не интересуют.
Не умеешь чистить картофель, не сможешь приготовить изысканного блюда. :/ Как-то так.
Вообще, если мне не изменяет память, на форуме где-то болтается библиотека, работающая с дробными числами (Олегус вроде писал, или Мастерсет?). Если лень самому чистить картошку, всегда можно взять уже очищенную, и даже сваренную, и даже сбитую в пюре. Хотя я бы рекомендовал тебе самому сварганить небольшую библиотечку для вычислений - хорошая разминка для мозгов. :)
P.S.: Чуть не забыл. Естественно в QSP это не “настоящие числа”, а просто строки вида “000.000”. Для собственных нужд я тоже написал несколько функций, работающих с такими числами. Если есть необходимость, могу поделиться
Да я сделал уже как мне надо ещё до того, как получил первый ответ.
if h_m > 0:
set h[h_m] = h[h_m] + 1
if h[h_m] >= h_m: set h = h + 1 & set h[h_m] = h[h_m] - h_m
end
это в служебной локации приписал и в действиях нужно только h_m указывать. Просто надеялся, что кто-то знает лучший способ.
Возможно ли в классическом плейере выполнить автоматический вызов определённой игры при запуске плейера? Есть ли такая переменная в конфиге, в которую можно было бы написать путь/название игры?