Как сделать?
…
Anakox,
похоже твой первый вопрос был неправильно понят. Я тоже подумал, что ты говоришь действительно о том, как сделать дробные числа. А ты оказывается спрашивал о том, как отсчитывать доли. Но я так и не понял, зачем это нужно, - ты не пояснил. Только что в игре день состоит из 1440 минут, а действия могут прерываться… ммм…
То есть к примеру:
энергия растёт 1 ед в час, действие занимает 1584 минуты, что составляет 26 целых часов и 24 минуты сверху.
ты хочешь узнать сколько это будет энергии (0,41666666666666…), чтобы не потерять это значение и приплюсовать его позже? Правильно я понимаю?
По последнему вопросу: возможно тебе нужно это https://qsp.org/forum/62-vzmoznosti-pomogite-razobratsa
Aleks Versus, вроде так, как ты описал. Напишу что у меня происходит: персонажу нужно прочитать книгу. При чтении растут навыки. Всю книгу можно прочитать за сутки и игрок сам выбирает сколько времени ему читать, 5 минут или 2 часа. Один из навыков растёт со скоростью 1 ед. в 20 минут. Надо, чтобы игрок мог читать произвольное количество времени, а прогресс не терялся. Так со всеми событиями в игре. В моём случае в действии “чтение книги” нужно просто вписать set h_m = 20 и сослаться на локацию-обработчик.
Всё, последний вопрос отпадает, нашел решение.
Anakox,
у меня перемещения по миру происходят с учётом времени, некоторые действия тоже как бы отнимают время. Но я не храню доли статов, я считаю сколько прошло времени. Скажем восполнение здоровья 3 единицы в час. Если было затрачено всего 20 минут, восполнение просто не происходит. Если же было затрачено 80 минут, восполняется три единицы и 20 минут сохраняются в остаток, чтобы не потерять. Когда проходит ещё сорок минут, набирается час и вновь происходит восполнение. Однако твой способ мне больше нравится.
Друзья, вот я, допустим, хочу сделать карту местности, задаваемую массивом данных. При этом хочется, чтобы создавать карту я мог без напряга, просто расставляя циферки.
Чтобы в редакторе карта имела какой-то вид типа такого:
00110002000
00220110200
00003033011
И игра считывала эти данные в массив.
Как можно подобное реализовать?
я не совсем давно делал такой функционал
Spoiler
#read_map
$args[0] = trim($args[0])
killvar '$tmp_array'
killvar '$tmp_lines'
:loop
pos = strpos($args[0], '(\r)?\n')
if pos <= 0:
$tmp_str = $args[0]
if $tmp_str <> '':
$tmp_lines[] = $tmp_str
end
else
$tmp_str = $mid($args[0], 1, pos-1)
if $tmp_str <> '':
$tmp_lines[] = $tmp_str
end
$args[0] = $mid($args[0], pos+1)
jump('loop')
end
_tmp_len = arrsize('$tmp_lines')
_i = 0
:loop_i
_j_len = len($tmp_lines[_i])
_j = 1
:loop_j
$tmp_array['<<_i>>_<<_j-1>>'] = $mid($tmp_lines[_i], _j, 1)
_j += 1
if _j <= _j_len: jump('loop_j')
''
_i += 1
if _i < _tmp_len: jump('loop_i')
copyarr $arg[1], '$tmp_array'
-
лока принимает на входе строку с данными и название массива для записи (многомерный массив эмулируется через строки вида ’0_0’, ’0_1’ и тд)
пример использования
$map = '
00110002000
00220110200
00003033011
'
gs 'read_map', $map, '$map_array'
werewolf, Спасибо! Буду разбираться.
Здравствуйте.
Я вот немного разобрался в том, чтобы делать меню для предметов - как-то “осмотреть”, “использовать”, “выбросить” - но не понял, как сделать так, чтобы меню появлялось при нажатии какой-либо строчки в тексте. Это при помощи HTML, да?
Prophet,
да.
! в первой локации:
USEHTML = 1
! в локации с меню:
'<a href="EXEC:MENU ''$Моё_крутое_меню''">вызвать меню</a>'
Нужно внимательно следить за экранированием кавычек и апострофов.
Nex,
Благодарю.
Подскажите как сделать такую ерунду.
Допустим у меня есть 3 переменных (А,В,С)в которых сохранены разные числа. Их значение я не знаю, но хочу отобразить их в порядке убывания
'1. <<first>>'
'2. <<second>>'
'3. <<third>>'
Рассчитывать в лоб даже эти три значения это нагородить огород из if, а если их не 3, а 10 или 20.
Каким образом можно решить такую задачу?
Farfignugen,
для начала тебе нужно изучить циклы и массивы.
Потом:
1. Заполняешь массив значениями в любом порядке.
2. Используешь любой алгоритм сортировки чтобы отсортировать массив, например “сортировку пузырьком”.
3. Выводишь уже отсортированный массив.
Nex:
Farfignugen,
для начала тебе нужно изучить циклы и массивы.Потом:
1. Заполняешь массив значениями в любом порядке.
2. Используешь любой алгоритм сортировки чтобы отсортировать массив, например “сортировку пузырьком”.
3. Выводишь уже отсортированный массив.
Я более или менее в курсе как организованы циклы в qsp и немного знаю массивы. Мне не нужно перебирать сам массив, мне всего лишь для статистики нужно расположить значения по порядку в убывании.
!первая локация
a=RAND(1,100)
b=RAND(1,100)
c=RAND(1,100)
mas[0]=a
mas[1]=b
mas[2]=c
perebor=3
numa=0
numb=0
numc=0
!локация расчета
:loop
if perebor=1:
perebor=0
if numa=0:
tmas[2]=mas[0]
end
if numb=0:
tmas[2]=mas[1]
end
if numc=0:
tmas[2]=mas[2]
end
end
if perebor=2:
perebor=1
if numa=1:
if mas[1]>mas[2]:tmas[1]=mas[1]&numb=1&jump'loop'
if mas[2]>mas[1]:tmas[1]=mas[2]&numc=1&jump'loop'
end
if numb=1:
if mas[0]>mas[2]:tmas[1]=mas[0]&numa=1&jump'loop'
if mas[2]>mas[2]:tmas[1]=mas[2]&numc=1&jump'loop'
end
if numc=1:
if mas[0]>mas[1]:tmas[1]=mas[0]&numa=1&jump'loop'
if mas[1]>mas[0]:tmas[1]=mas[1]&numb=1&jump'loop'
end
end
if perebor=3:
perebor=2
tmas[0]=max (mas[0],mas[1], mas[2])
if tmas[0]=mas[0]:numa=1
if tmas[0]=mas[1]:numb=1
if tmas[0]=mas[2]:numc=1
end
if perebor>0:jump'loop'
numa=0
numb=0
numc=0
perebor=3
'<<mas[0]>> <<mas[1]>> <<mas[2]>>'
'1. <<tmas[0]>>'
'2. <<tmas[1]>>'
'3. <<tmas[2]>>'
Вот с массивами накидал. Но это же громоздко.
В своем примере ты делаешь сортировку в лоб - прямым перебором, при этом размер массива зашит
но если использовать сортировку пузырьком, упомянутую Нексом, то можно сделать универсальную локу, которая сможет сортировать массивы любого размера
вот пример реализации
Spoiler
#sort
copyarr 'tmparr', $args[0]
J = 0
N = ARRSIZE('tmparr')
:for_j
F = 0
M = J
I=J
:for_i
IF tmparr[I]>tmparr[I+1]:
_tmp = tmparr[I]
tmparr[I] = tmparr[I+1]
tmparr[I+1] = _tmp
F=1
end
IF tmparr[I]<tmparr[M]: M=I
I += 1
if I < N-J-1: jump('for_i')
IF F=0: jump('exit_for')
IF M <> J:
_tmp = tmparr[J]
tmparr[J] = tmparr[M]
tmparr[M] = _tmp
end
J += 1
if J < N: jump('for_j')
:exit_for
copyarr $args[0], 'tmparr'
-
в локу первым параметром надо передавать название массива, который надо отсортировать
mas[] = RAND(1,100)
mas[] = RAND(1,100)
mas[] = RAND(1,100)
copyarr 'tmas', 'mas'
gs 'sort', 'tmas'
'<<mas[0]>> <<mas[1]>> <<mas[2]>>'
'1. <<tmas[0]>>'
'2. <<tmas[1]>>'
'3. <<tmas[2]>>'
Спасибо. Действительно работает, только почему то сортирует в другом направлении, от минимума к максимуму.