RU 📌 Pinned

Как сделать?

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

Stag_Beetle:

Спрашивается как такое вообще возможно?

У тебя ’10’ и ’8’ сравнились как строки (’8’ больше). Если это действительно происходит по-разному с каждым прогоном, то это баг плеера.
Попробуй использовать функцию VAL при сравнении:

$a=$a-$b 
if VAL($c)>VAL($a) : $c=$a

А вообще - пользоваться строковыми переменными для чисел - это путь генерации багов…

vais:

Кто может мне помощь с боевой системой
Целый день мучаюсь, нечего лучше этого не написала

Здесь нужно плясать от игрока, что он должен видеть.
У тебя по коду каждое новое действие добавляется по нажатию предыдущего, причем предыдущее не пропадает. Тебе явно часть действий нужно написать в параллель.

if былпляж2=0 
  'Вы видите свою жену и дочерей. Это была хорошая новость, а вот новость плохая - их загнал на небольшую скалу большой краб, ни жена, ни дети еще вас пока не увидели' 
  act 'напасть на краба':
    delact 'напасть на краба'
    if 'кокосовый орех': 
      act 'бросить кокосом в краба': 
        крабкокос=rand(1,10) 
        if крабкокос=1: 
          молодойкрабжизнь=молодойкрабжизнь-5 
          'Вы попали кокосовым орехом в краба'
        end
        !Возможно здесь нужно удалить кокос из предметов
      end
    end
    act 'ударить': 
      крабударить=rand(1,10) 
      крабатака1=rand(1,100) 
      крабатака2=rand(1,100) 
      if крабударить=1: 
        молодойкрабжизнь=молодойкрабжизнь-урон 
      end 
      if крабатака1=<15: 
        жизнь=жизнь-молодойкрабурон 
      end 
      if крабатака2=<15: 
        жизнь=жизнь-молодойкрабурон 
      end 
    end 
  end 
end

Ну а с самой математикой боя я не могу ничего посоветовать. Возможно кто-нибудь сможет. :)

if ‘кокосовый орех’:

Это что вообще такое? “Если *отобразить надпись*, то делаем…” Или я что-то не понимаю или это ересь какая-то. Разве там не должно быть:

if кокосовыйорех=1:

vais, EL_RIO прав, скорее всего имелось в виду

if obj('кокосовый орех'):

newsash:

vais, EL_RIO прав, скорее всего имелось в виду

if obj('кокосовый орех'):

Да. Немного ошиблась.
Ну все равно что с этой надписью, что без, боевая система не тянет. Не могу сделать цикличность.

vais:

Да. Немного ошиблась.
Ну все равно что с этой надписью, что без, боевая система не тянет. Не могу сделать цикличность.

Какого рода цикличность? По идее в моём варианте действия ударить и бросок кокоса доступны, т.е. можно их тыкать до конца боя. Чем не цикличность?
Кстати, в каждое действие с уроном нужно прикрутить проверку здоровья с переходом на соответствующую локацию. Например:

.......
      if крабатака2=<15: 
        жизнь=жизнь-молодойкрабурон 
      end 
      if жизнь <= 0: gt 'поражение'
      if молодойкрабжизнь <= 0: gt 'победа'
    end

Короче, по быстрому дописал код с минимальными изменениями. Система проста как два рубля, так что с циклами не стал даже заморачиваться. Они нужны для более сложных боевых систем. Вот код из редактора:

!Недостающая инфа
!---------------------------
addobj'кокосовый орех'
молодойкрабжизнь=15
молодойкрабурон=1
жизнь=15
урон=5
!---------------------------
'Краб: <<молодойкрабжизнь>>' 
'Вы: <<жизнь>>'
*nl

if былпляж2=0:
  'Вы видите свою жену и дочерей. Это была хорошая новость, а вот новость плохая - их загнал на небольшую скалу большой краб, ни жена, ни дети еще вас пока не увидели' 
  act 'напасть на краба': 
    delact $selact
    if obj'Кокосовый орех': 
      act 'Бросить кокосом в краба': 
      delact $selact
      delobj'кокосовый орех'
        крабкокос=rand(1,10)
        !10% шанс попадания 
        if крабкокос=1: 
          молодойкрабжизнь=молодойкрабжизнь-5 
          'Вы попали кокосовым орехом в краба'
          'Краб: <<молодойкрабжизнь>>' 
          'Вы: <<жизнь>>'
         else
          'Вы бросили кокос и промахнулись.'
          'Краб: <<молодойкрабжизнь>>' 
          'Вы: <<жизнь>>' 
        end 
      end 
    end 
    act 'Ударить': 
      крабударить=rand(1,10) 
      крабатака1=rand(1,100) 
      крабатака2=rand(1,100) 
      !10% шанс попадания по крабу
      if крабударить=1: 
        молодойкрабжизнь=молодойкрабжизнь-урон
        'Вы пинаете тварь и попадаете, нанеся <<урон>> ед. урона.' 
        'Краб: <<молодойкрабжизнь>>' 
        'Вы: <<жизнь>>'
      else
        'Вы пытаетесь пнуть тварь, но промахиваетесь.'
        'Краб: <<молодойкрабжизнь>>' 
        'Вы: <<жизнь>>'
      end 
      !15% шанс, что краб вас достанет 1й атакой
      if крабатака1=<15: 
        жизнь=жизнь-молодойкрабурон 
        'Краб огрызается в ответ и первой же атакой наносит вам <<молодойкрабурон>> ед. урона.'
        'Краб: <<молодойкрабжизнь>>' 
        'Вы: <<жизнь>>'
      else
        'В бешенстве краб бросается на вас, но промахивается'
        'Краб: <<молодойкрабжизнь>>' 
        'Вы: <<жизнь>>'
      end 
      !15% шанс, что краб вас достанет 2й атакой
      if крабатака2=<15: 
        жизнь=жизнь-молодойкрабурон 
        'Краб переходит в контратаку и наносит вам <<молодойкрабурон>> ед. урона.'
        'Краб: <<молодойкрабжизнь>>' 
        'Вы: <<жизнь>>'
      else
        'Пытаясь контратаковать, краб бросается на вас, но промахивается'
        'Краб: <<молодойкрабжизнь>>' 
        'Вы: <<жизнь>>'
      end
      if молодойкрабжизнь<=0 and жизнь>0:msg'Вы победили'
      if жизнь<=0:msg'Вы мертвы'
    end 
  end 
end

Сразу замечание по шансам попадания - это кошмар какой-то. Там что, инвалиды дерутся, что попадает только 1 из 10 или 1 из 6,[6] ударов? Подправить бы…

1) Про инвалидов, считайте это мое виденье игры) Не хочу что бы было как у всех. Раз раз и готово. И не хочу что бы было как в Дисах 3 которых убили большие цифры. ставить по 1000хп
2) Что то мне совсем не нравится такая система боя( А именно на ней и застряла(

проблема в том что у меня очень много монстров. есть те кто появляются по событию(после постройки лагеря, пока не уничтожишь 3 колонии крабов будут приходит по три краба от каждой колонии в поисках пищи) одних крабов пять видов. А это только один вид монстров. И писать для каждого код сложно. Может у кого есть готовый код боевой системы которым он может поделиться? Или мысли как упростить боевку

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

Это вставляем на локацию (на тот же пляж, к примеру)

$loc=$curloc

act'Напасть на беззащитное существо':
     !---------------------------
     addobj'какос'
     !---------------------------
     !Параметры ГГ
     hp=15
     damage=5
     !---------------------------
     !Параметры врага
     $vrag_name='Няшный краб'
     vrag_hp=15
     vrag_damage=1
     !---------------------------
     gt'battle'
end

А вот это в локацию “battle”:

cla
clr
*clr

if hp<=0 or vrag_hp<=0:
     !Переход на локацию смерти
     if hp<=0:msg'You Loose!'&gt'death'
     !Выводим сабж и отправляем на локацию, хранящуюся в переменной $loc
     if vrag_hp<=0:msg'You Win!'&gt'<<$loc>>'
else
     'Ваша жизнь: <<hp>>'
     'Жизнь врага (<<$vrag_name>>): <<vrag_hp>>'
     ''
     if obj'какос':
         act'Кинуть какосом':
         cla
             r=rand(1,10)
             if r=1:
                 'Вы попали какосом во врага! Истинный папуас!'
                 vrag_hp=vrag_hp-5
             else
                 'Вы ожидаемо промахнулись мимо врага'
             end
             delobj'какос'
             act'Далее':gt'battle'
         end
     end
     
     act'Удврить':
     cla
         r=rand(1,10)
         if r=1:
             'Вы попадаете и наносите <<damage>> урона'
             vrag_hp-=damage
         else
             'Вы промахиваетесь'
         end
         
         r=rand(1,100)
         if r<=15:
             'Краб бьет вас и отнимает <<vrag_damage>> ед. вашей жалкой жизни.'
             hp-=vrag_damage
         else
             'Враг промахивается'
         end
         
         r=rand(1,100)
         if r<=15:
             'Краб бьет вас и отнимает <<vrag_damage>> ед. вашей жалкой жизни.'
             hp-=vrag_damage
         else
             'Враг промахивается'
         end
         act'Далее':gt'battle'
     end
end

Все довольно просто, если потратить чуть-чуть времени и разобраться. И дополнительные “фичи” (в рамках разумного) добавляются без проблем. Если охота чего-то посложнее, то тут уже каждый сам пилит свой велосипед. Посмотрите как реализованы боевые системы в других играх (коих тут не мало) и выберите наиболее подходящую. А если такой вдруг(!) не найдется, так хотя бы будете знать что и как нужно делать, чтобы получить определенный результат.

EL_RIO:

Посмотрите как реализованы боевые системы в других играх (коих тут не мало) и выберите наиболее подходящую

Тринити :D

vais:

И не хочу что бы было как в Дисах 3 которых убили большие цифры. ставить по 1000хп

А если делать как во вторых дисах?

Игнор поленейший… неужели никто ни разу не пытался прикрутить бесплатный открытый синтезатор речи??? в паре с гарнитурой это же находка просто.

BECEJIb4AK_Y:

Игнор поленейший… неужели никто ни разу не пытался прикрутить бесплатный открытый синтезатор речи??? в паре с гарнитурой это же находка просто.

Чтобы ты не чувствовал себя в игноре: лично я никаких упоминаний синтезаторов речи в сообществе не видел, хотя слышал были попытки адаптировать плеер для слепых. Это всё, что я знаю по этой теме (хотя я тут недавно, могу чего-то не знать).

Байт делал версию классического плеера для консоли, пожалуй её легче всего было бы прикрутить к синтезатору речи. В общем репозитории я исходный код не нашёл, видимо за ним обращаться к Байту.

newsash:

Aleks Versus:

можно и нужно убрать лишние циклы:

Тогда уж и лишние условия убрать. И ошибки вылечить, которые появились от убирания циклов.

Spoiler
VIEW 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
hour_plus = minut / 60         &! сколько полных часов прошло 
minut = minut mod 60           &! приводим минуты в нормальный вид (от 0 до 59)
hour = hour + hour_plus        &! прибавляем к текущему времени, сколько полных часов прошло 

! подсчитываем голод и усталость: 
golod = golod - hour_plus 
son = son - hour_plus 

day_plus = hour / 24    &! сколько полных дней прошло 
hour = hour mod 24      &! приводим часы в норму (от 0 до 23)  
daystart = daystart + day_plus     &! количество дней от начала игры

week = (week + day_plus) mod 7     &! выставляем день недели 

if week = 0:Set $week = 'Воскресенье'   &! Счёт идёт от 0.
if week = 1:Set $week = 'Понедельник' 
if week = 2:Set $week = 'Вторник' 
if week = 3:Set $week = 'Среда' 
if week = 4:Set $week = 'Четверг' 
if week = 5:Set $week = 'Пятница' 
if week = 6:Set $week = 'Суббота' 

day = day - 1          &! Хак для нормальной работы в диапазоне от 1 до 30

 day = day + day_plus   &!    увеличиваем количество текущих дней 
 month_plus = day/30 
 day = day mod 30
 month = month + month_plus 

day = day + 1          &! Хак для нормальной работы в диапазоне от 1 до 30

if month = 0:Set month = 1 
if month = 13:Set month = 1&set year = year + 1 
If month = 1:set $month = 'Январь' 
If month = 2:set $month = 'Февраль' 
If month = 3:set $month = 'Март' 
If month = 4:set $month = 'Апрель' 
If month = 5:set $month = 'Май' 
If month = 6:set $month = 'Июнь' 
If month = 7:set $month = 'Июль' 
If month = 8:set $month = 'Август' 
If month = 9:set $month = 'Сентябрь' 
If month = 10:set $month = 'Октябрь' 
If month = 11:set $month = 'Ноябрь' 
If month = 12:set $month = 'Декабрь' 

if minut < 10:set $nilmin = '0' 
if minut >= 10:set $nilmin = '' 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
!!!!!!!!!КОНЕЦ РАЧЕТА ВРЕМЕНИ 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 



!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
!!!!!!!!!НАЧАЛО ОПИСАНИЯ 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
if opisanie=0:'<center>Время <B><<hour>></B> часов <B><<$nilmin>><<minut>></B> минут. Сейчас <<day>> <<$month>> <<year>>года, <<$week>></center>'

Ну вы сейчас научите. Обращение к этому коду идет при каждом действии. И блоки с циклами нужны для того, что бы туда вставлять проверки действий. Не все может быть кратным часам или минутам. Но так то код рабочий конечно.

vais, в коде что у тебя, еще не хватает некоторых элементов

Spoiler
if sec >= 60:
:loopsec
minut+= 1
sec-=60
!сюда можно втыкать действия происходящие раз в минуту
     if sec >= 60:jump 'loopsec'
end


if minut >= 60:
:loopmin
hour+=1
minut-=60
     !отслеживание сна и голода в этом блоке происходит раз в час
     if Peremotka=0:
     !действия в жизни, блокируется перемоткой, если например захочешь дату сдвинуть, например игрок провел в коме несколько недель, а лень высчитывать, какая дата должна быть.
	 son-=1
         !вот тут проверяется потребление воды и еды. При входе в сон inSleep=1, при выходе из сна inSleep=0, для того что бы игрок не склеивал ласты во время сна.
	 if inSleep=0:energy-=1
	 if inSleep=0:water-=1
     end
     if minut >= 60:jump 'loopmin'
end

if hour >= 24:
:loop
day+=1
!daystart сколько дней прошло с начала игры
daystart+=1
!vidageday сколько дней прожил игрок, вынесено отдельно, потому что, некоторые игровые ситуации могут старить игрока быстрее, чем положено
vidageday+=1
week+=1
hour-=24
!сюда втыкаем действия которые должны произойти раз в сутки
     if hour >= 24:jump 'loop'
end

!эта фигня считает месяцы 30 и 31 день, а не только 30
if month=1 or month=3 or month=5 or month=7 or month=8 or month10 or month=12:
!31
     if day > 31:day-=31&month+=1
elseif month=2:
!28
     if day > 28:day-=28&month+=1
elseif month=0:
month=1
     if day > 31:day-=31&month+=1
elseif month=13:
month=1
     if day > 31:day-=31&month+=1
else
!30
	 if day > 30:day-=30&month+=1
end



if month = 5 and day=12 and drmark=0:
!установка дня рождения
!и не забыть обнулить drmark на следующий день
drmark=1
age+=1
vidage+=1
end


if day = 0:day = 1

if week > 7:
:loopweek
week-=7
     if week > 7:
     jump 'loopweek'
     end
end

if week=0 or week=8:week=1
if week = 1:Set $week = 'Понедельник'
if week = 2:Set $week = 'Вторник'
if week = 3:Set $week = 'Среда'
if week = 4:Set $week = 'Четверг'
if week = 5:Set $week = 'Пятница'
if week = 6:Set $week = 'Суббота'
if week = 7:Set $week = 'Воскресенье'

if month = 0:Set month = 1
if month = 13:Set month = 1
If month = 1:set $month = 'Января'
If month = 2:set $month = 'Февраля'
If month = 3:set $month = 'Марта'
If month = 4:set $month = 'Апреля'
If month = 5:set $month = 'Мая'
If month = 6:set $month = 'Июня'
If month = 7:set $month = 'Июля'
If month = 8:set $month = 'Августа'
If month = 9:set $month = 'Сентября'
If month = 10:set $month = 'Октября'
If month = 11:set $month = 'Ноября'
If month = 12:set $month = 'Декабря'

if minut < 10:set $nilmin = '0'
if minut >= 10:set $nilmin = ''

Вообще, это я написал этот код времени для своей игры. Конечно ньюсаш и алекс версус написали в итоге рабочий код. Внешне он короче, нет циклов. Но дело в том, что циклы в этом коде редко срабатывают, и вообще никак не нагружают систему. Так же в моем расчете времени заранее предусмотрены места куда можно втыкать все, что угодно и не парится совмещением с временными величинами. Я внутри этой структуры даже авто бои рассчитывал с привязкой ко времени. Эта же фигня сделана не просто как счетчик времени, она служит для полного отслеживания всего происходящего в игре.

Log in or Register to post comments.