Как сделать?
…
extensive:
1)Как сделать в игре смену дня и ночи,чтобы на каждое действие уходило какое-то время.
Ответ есть в FAQ: Как сделать время?
Открывай пример, запускай, читай, разбирай код. Что будет непонятно, спрашивай.
extensive:
Например в 21:00 базар закрывается,а в 7 открывается.
дни = время / (24*60)
часы = (время - дни*24*60) / 60
IF (часы >= 7) AND (часы < 21):
'С базара слышится оживлённый гомон. Торговцы, зазывалы, покупатели, попрошайки. Ворота приветливо распахнуты.'
ACT 'Зайти':
GOTO 'Базар'
END
ELSE
'Базар закрыт. Приду утром.'
END
extensive:
И самое главное - отсчёт дней недели.
! В начале игры
$неделя[1] = 'Понедельник'
$неделя[2] = 'Вторник'
$неделя[3] = 'Среда'
$неделя[4] = 'Четверг'
$неделя[5] = 'Пятница'
$неделя[6] = 'Суббота'
$неделя[7] = 'Воскресенье'
! В месте с расчётом текущего дня недели
дни = время / (24*60)
день_недели = (дни MOD 7) + 1
'Сегодня <<$неделя[день_недели]>>.'
IF день_недели = 3:
'Извините, среда - санитарный день.'
END
extensive:
3)Как мне прописать зависимость вероятности от навыков.Например,если навык ловли рыбы = 7,то вероятность поймать рыбу была бы 20% + <<Навык ловли рыбы>> = 27%
Это ж просто. Вероятность попадания в одно число из ста как минимум один к ста. Значит попадание в двадцать семь чисел из ста - это грубо 27%.
! задаём вероятность (в тысячных долях):
вероятность = 200
! задаём навык (в тысячных долях):
навык_ловли = 70
! выбрасываем случайное число от 1 до 1000
случай = RAND (1,1000)
! сравниваем выпавшее значение со значением вероятность+навык
if случай > вероятность + навык_ловли:
! если выпавшее число больше 270 - не повезло
*pl "Ты не поймал рыбу"
else
! если меньше - повезло
*pl "Ты поймал рыбу"
end
extensive:
Ещё в некоторых играх я видел,что есть не три,а 4
В классическом плеере 4 окошка по-умолчанию.
Aleks Versus,
5.
Большое всем спасибо! :) Пойду разбираться
P.S.Ещё один тупой вопрос:У меня такой алгоритм:
ACT’Охотиться на уток’:
If Ружье >= 1:
ADDOBJ’Утка’
ELSE
‘Из пальца никого не затрелишь:нужно ружье’
end
end
Проблема такая:когда у тебя нету ружья тебе выскакивает то,что я написал,но если нажать два и больше раз,то ’тот текст “Из пальца никого не затрелишь:нужно ружье” беспонечными строчками проецируется вниз,Хотелось бы,чтобы только 1 раз.Пробовал $Curloc , GOTO Curloc , GOTO ‘Озеро’(изначальная локация),но тогда текст вообще не появляется.
Самое простое решение - убрать это действие:
ACT'Охотиться на уток':
If Ружье >= 1:
ADDOBJ'Утка'
ELSE
'Из пальца никого не затрелишь:нужно ружье'
DELACT $selact
end
end
Самый простой вариант:
ACT 'Охотиться на уток':
IF Ружье >= 1:
ADDOBJ 'Утка'
ELSE
*CLR
'Из пальца никого не заcтрелишь: нужно ружье.'
XGOTO $CURLOC
END
END
Если нужно, чтобы действие исчезало после выдачи предупреждения, добавляем переменную:
IF (нужно_ружье = 0) OR (Ружье >= 1):
ACT 'Охотиться на уток':
IF Ружье >= 1:
ADDOBJ 'Утка'
ELSE
нужно_ружье = 1
*CLR
'Из пальца никого не заcтрелишь: нужно ружье.'
XGOTO $CURLOC
END
END
END
Вариант Ньюсаша подойдёт только в том случае, если допустимо, что при любом обновлении локации (будь то переход с другой локации, либо перезаход на текущую по GOTO $CURLOC), действие появится заново.
Nex,
пятое - поле ввода? Забываю его считать.
подскажите пожалуйста как установить максимальное и минимальное значения для жизни, маны и т.д.?
ЗакТеррен:
подскажите пожалуйста как установить максимальное и минимальное значения для жизни, маны и т.д.?
Легко. Создай локацию счетчик, в которой выставь
if HP>максимальное_HP:
HP=максимальное_HP
end
спасибо
RomaDova:
Создай локацию счетчик
На форуме вопрос уже много раз обсуждался. Подход с локацией-счетчиком, хоть и выглядит простым и понятным, но ошибочен.
Нормальным путём будет сделать, например, локацию “change_HP” с кодом
HP = HP + args[0]
if HP > max_HP: HP = max_HP
if HP < min_HP: HP = min_HP
и менять здоровье вызовом этой локации:
!Добавим 10 HP
GS 'change_HP', 10
!Отберём 20 HP
GS 'change_HP', -20
Когда по игровой механике допустим кратковременный выход параметра за границу (например, было 10/10, вылечили на 5 и ударили на 12 в течение одного хода 10+5=15, 15-12=3 или 10-12=-2, -2+5=3), то нужен другой подход - сделать локацию ‘check_HP’ и выполнять её перед моментом, когда HP должно укладываться в рамки.
спасибо
а еще такой вопрос: количество денег в дополнительном описании не меняется, а в основном описании меняется
подскажите в чем может быть причина, почему в дополнительном не меняется?
ЗакТеррен,
основное описание меняется при каждом обновлении локации. При переходе на эту локацию с другой, или при перезаходе на текущую (”GOTO $CURLOC”).
Дополнительное описание, обновляется только принудительно. Для его обновления нужно специально написать вызов очистки окна и заполнить по новой.
Nex,
спасибо, мне это помогло) получился вот такой код:
Spoiler
if money>=10:
act 'Купить воду':
Вода+=1
money-=10
clear
pl'Вас зовут <<$Имя>> <<$Фам>>.'
pl'В кошельке <<money>> денег.'
pl'Здоровье <<HP>>.'
pl'Голод: <<Сытость>>.'
pl'Жажда: <<Жажда>>.'
pl'Бодрость <<Сон>>.'
end
end
Вопрос: можно ли вот эту часть заменить одним словом/кодом ибо если все это каждый раз писать, то получится много текста((
Spoiler
pl'Вас зовут <<$Имя>> <<$Фам>>.'
pl'В кошельке <<money>> денег.'
pl'Здоровье <<HP>>.'
pl'Голод: <<Сытость>>.'
pl'Жажда: <<Жажда>>.'
pl'Бодрость <<Сон>>.'
ЗакТеррен,
одним - нет, двумя - можно.
Помести код вывода в отдельную локацию. Например, назовём локацию “статус”. Кстати, “CLEAR” туда же стоит поместить.
Далее, где нужно обновить статус, пишешь вызов этой локации:
GS "статус"