Суббота, 20 Апреля 2024, 08:03

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Движки для браузерных игр » нужен совет по формуле расчета боя
нужен совет по формуле расчета боя
creativengisedДата: Четверг, 23 Января 2014, 18:00 | Сообщение # 1
был не раз
Сейчас нет на сайте
Добрый день уважаемые гуру!

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

Итак. Скажу чего у меня имеется.

1. Есть БД с таблицей users, где помимо регистрационных данных хранятся всевозможные параметры игрока. Полей много. Но если я правильно понимаю, то в расчете урона и отъема хп и выноса, будут задействованы такие как:
Сила = 3
Ловкость = 3
Инстинкт = 3
Жизнь = 3
*(3 - стартовое значение навыка, которое игрок будет увеличивать)

Жизнеспособность - зависит от Жизнь*6 + то, что дадут предметы
Выносливость - зависит от Сила*6 + то, что дадут предметы

Урон(Мин-Макс) = 1-2 + то, что дадут предметы

Защита_головы + то, что дадут предметы
Защита_корпуса + то, что дадут предметы
Защита_пояса + то, что дадут предметы
Защита_ног + то, что дадут предметы

Крит - базовый берет от Инстинкт*3 + то, что дадут предметы
АнтиКрит - базовый берет от Инстинкт*3 + то, что дадут предметы
Уворот - базовый берет от Ловкость*3 + то, что дадут предметы
АнтиУворот - базовый берет от Ловкость*3 + то, что дадут предметы

Это так сказать те параметры, которые я уже создал и более менее прописал как они считаются, что от чего зависит. (очень надеюсь, что двигаюсь в +/- верном направлении)

Что еще есть? Есть форма, в которой игрок делает выбор. Куда ударить (1 вариант) Что защитить (2 варианта) и в какой позиции он находится в Атакующей или Защитной

После чего из формы через POST уходят данные и попадают на страницу боя.

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

Мне видится картина примерно так (подчеркиваю примерно!!! и именно потому пишу сообщение о помощи)

ЕСЛИ игрок1 походил (т.е. выставил ход) проверяем попал игрок1 или промазал (5% вероятность, что игрок2 увернется)+(Уворот игрок2 + влияние от позиции Защита)-(АнтиУворот игрока1 + влияние от позиции Атака) по логике при защитной стойке уворот должен работать лучше, так же как АнтиУворот при атакующей

ЕСЛИ игрок1 попал, то проверяем обычный удар или критический (5% вероятность, что удар критический)+(Крит игрока1 + влияние от позиции Атака)-(АнтиКрит игрока2 + влияние от позиции Защита) так же как и с уворотом, Крит скорее прилетит при атаке, а ослабить его может как раз Защита соперника

ЕСЛИ удар Крит, урон игрока1 = ВОТ ТУТ у меня как раз сложность... sad и так, и этак пробовал, что-то все не то. Нужен совет опытных игроделов
ЕСЛИ удар Обычный (не Крит) ну вообщем то же нужен совет

+ у меня есть 2 блока, которые выставил игрок, надо бы как то и их учесть, только в каком моменте? допустим удар игрока 1 пришелся в блок 1(голова) переменную по броне я знаю она = $defense_head и значение берет из БД. Вопрос в том, где ее лучше подставить и как правильно вычислить влияние брони. Предположим 2 варианта. Броня_головы = 0 (вообще нет шляпы) и Броня_головы = 5 (надета какая-то шапка). Насколько я правильно понимаю, броня поглощает урон но не выше, своего значения и не всегда на свое максимальное значение, а скорее всего от 1 до своего значения.. Ну эт я так думаю, вот тут нужен ваш совет.

ЕСЛИ удар пробил броню - условие при котором удар пробивает броню (то же надо) дальше понятно, что нужно отнять от Здоровья игрока2 тот урон игрока1 который получился в финале + отнять у обоих немного Выносливости
ЕСЛИ удар не пробил броню - условие при котором считается блокировка удара, ну и в любом случае отнять немного выносливости

Теперь. Пожалуй самое геморойное для моего пока неопытного разума. Вот допустим игрок1 завершил свой ход. Так же просчитали и игрока2. Есть некоторые данные и события. Размер урона, сколько хп осталось после удара, куда били, с атаки или с защиты, и все такое.

Все эти данные хотелось бы поместить в лог боя. Понимаю это mysql_query("UPDATE tablename SET .............."); Обновить то не вопрос. Но. Хотелось бы получить лог, который можно будет закрепить за игроками, которые в нем участвовали (где-то в завершенных боях) и главное не просто вбить туда события, а и вывести их потом с оформлением.

Поясню.

Допустим вбить в текстовое поле строку лога наподобии:

00:00:00 Игрок1 ударил с атаки, но Игрок2 увернулся
00:00:00 Игрок1 ударил с атаки, и Игрок2 от защиты нанес критический удар в корпус -10 (8/18)

и потом вывести его в лог НЕ проблема, но он выведется именно так, как и здесь, в черном варианте без оформления, а хотелось бы получить нечто такое:

00:00:00 Игрок1 ударил с атаки, но Игрок2 увернулся
00:00:00 Игрок1 ударил с атаки, и Игрок2 от защиты нанес критический удар в корпус -10 (8/18)

ВОТ тут я немного ломаю мозг. Как это получше создать? Нужен совет. Считаю лог боя неотъемлемой частью боя, и потому хотелось бы прикрутить его для дальнейших анализов.

Заранее благодарен за советы. И еще раз говорю, мне не нужен готовый код. А вот правильное направление мысли бы очень даже было надо wink Заранее спасибо!

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


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

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


Сообщение отредактировал creativengised - Четверг, 23 Января 2014, 18:23
maker-rusДата: Четверг, 23 Января 2014, 22:53 | Сообщение # 2
Гений
Сейчас нет на сайте
Урон по игроку вычисляется стандартно так = урон + (если крит > 0)крит - броня, уклонение вычисляется перед ударом.
То есть выглядит это так, до того, как будет вычисляться удар проверяем уклонение если > 0, то вычисляем урон. От урона отнимаем броню. Сам урон например, если он находится в промежутке, то есть так 10-18, то случайно от 10 до 18 выбираем число и обозначаем за урон.
Лог можно выводить через тот же
Код
echo "";
только со вставками html.
Код
echo "hello <font color='red'>world</font>"

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


Сообщение отредактировал maker-rus - Четверг, 23 Января 2014, 23:04
creativengisedДата: Пятница, 24 Января 2014, 01:25 | Сообщение # 3
был не раз
Сейчас нет на сайте
maker-rus, спасибо в целом за ответ, но самое забавное то, что все, что вы ответили и я знаю. Вопрос же я задавал в целом для другого, как найти под мою конструкцию оптимальное решение? Ведь формул урона пожалуй столько же сколько типов игр, и если взять игру где на исход влият все юниты то формула будет одна, а если взять как например Carnage или БК, то там считается иначе. У меня скорее ближе к Carnage конструкция.

впрочем вот наваял сам, с комментариями чего для чего

Код
//если игрок 1 и игрок 2 походили
if((!empty($u1_attack))AND(!empty($u1_defense1))AND(!empty($u1_defense2))AND(!empty($u1_position))
AND(!empty($u2_attack))AND(!empty($u2_defense1))AND(!empty($u2_defense2))AND(!empty($u2_position))){
if($u1_position==1)$u1_critical_hit*=2; //позиция Атака дает прирост Криту *2
if($u1_position==1)$u1_anti_dexterity*=2; //позиция Атака дает прирост АнтиУвороту *2
if($u1_position==2)$u1_anti_critical_hit*=2; //позиция Защита дает прирост АнтиКриту *2
if($u1_position==2)$u1_dexterity*=2; //позиция Защита дает прирост Увороту *2
if($u2_position==1)$u2_critical_hit*=2; //позиция Атака дает прирост Криту *2
if($u2_position==1)$u2_anti_dexterity*=2; //позиция Атака дает прирост АнтиУвороту *2
if($u2_position==2)$u2_anti_critical_hit*=2; //позиция Защита дает прирост АнтиКриту *2
if($u2_position==2)$u2_dexterity*=2; //позиция Защита дает прирост Увороту *2

//ИГРОК1
$u1_event1="$u1_login ударил";
    //проверка попал игрок1 в противника или нет
    $dexterity=rand(1,100); //определим случайное значение уворота
    $trigger=rand(1,($u2_dexterity-$u1_anti_dexterity)); //триггер = Уворот игрока2 - АнтиУворот игрока1
    //уворот сработает либо при 5%
    if($dexterity<=5){
    $u1_event2=", но $u2_login увернулся";
    }
    //либо если значение триггера окажется выше случайного числа
    elseif($dexterity<=$trigger){    
    $u1_event2=", но $u2_login увернулся";
    }
    //проверка обычный удар или критический
    else{
     $critical_hit=rand(1,100); //определим случайное значение уворота
     $trigger2=rand(1,($u1_critical_hit-$u2_anti_critical_hit)); //триггер = Крит игрока1 - АнтиКрит игрока2
     //крит сработает либо при 5%
     if($critical_hit<=5){
      //если удар попал в блок1
      if($u1_attack==$u2_defense1){
      $u1_event2=", но $u2_login заблокировал удар";
      }
      //если удар попал в блок2
      elseif($u1_attack==$u2_defense2){
      $u1_event2=", но $u2_login заблокировал удар";
      }
      else{
      //урон = от (мин_урон + 75% текущей выносливости) до (макс_урон + 25% текущей выносливости)    
      $damage=(rand(($u1_min_damage+(($u1_current_endurance/100)*75)),(($u1_max_damage+($u1_current_endurance/100)*25))))*2;
      $u1_event3=" и нанес критический урон -$damage";
      }
     }
     //либо если значение триггера окажется выше случайного числа
     elseif($critical_hit<=$trigger2){
      //если удар попал в блок1
      if($u1_attack==$u2_defense1){
      $u1_event2=", но $u2_login заблокировал удар";
      }
      //если удар попал в блок2
      elseif($u1_attack==$u2_defense2){
      $u1_event2=", но $u2_login заблокировал удар";
      }
      else{
      //урон = от (мин_урон + 75% текущей выносливости) до (макс_урон + 25% текущей выносливости)    
      $damage=(rand(($u1_min_damage+(($u1_current_endurance/100)*75)),(($u1_max_damage+($u1_current_endurance/100)*25))))*2;
      $u1_event3=" и нанес критический урон -$damage";
      }
     }
     else{
      //если удар попал в блок1
      if($u1_attack==$u2_defense1){
      $u1_event3=", но $u2_login заблокировал удар";
      }
      //если удар попал в блок2
      elseif($u1_attack==$u2_defense2){
      $u1_event3=", но $u2_login заблокировал удар";
      }
      else{
      //урон = от (мин_урон + 75% текущей выносливости) до (макс_урон + 25% текущей выносливости)    
      $damage=rand(($u1_min_damage+(($u1_current_endurance/100)*75)),(($u1_max_damage+($u1_current_endurance/100)*25)));
      $u1_event3=" и нанес урон -$damage";
      }
     }
    }
//ИГРОК2
}


ИГРОК2 пока не прописывал, еще с 1м не полностью разобрался, но надеюсь разберусь. Но все же буду очень благодарен за дельные советы в этом направлении. Ведь наверняка есть люди, которые эти алгоритмы уже прописывали и знают о подводных камушках. Заранее спасибо, за совет, а не за ссылку на гугл.

maker-rus а насчет вывода лога, то как бы не вижу проблем как его показать в хтмл или пхп коде, сложность в другом, как корректно создать таблицу в БД и какие туда вложить поля кроме id-поединка?

Может быть надо связывать несколько таблиц? У кого есть опыт буду рад выслушать концепцию. Понимаю, что лог должен дописываться в таблицу и выводится по строчно с сортировкой по времени. Ок. Еще раз говорю, чернобелую запись лога я могу соорудить, вписав в текст без всяких переменных просто текст и выведя его потом из БД. Это не проблема.

НО! Хочется получить лог с переменными, которые можно оформить различными стилями. А для этого я так понимаю, уже простого текста не достаточно. Да и потом ведь в поединке может участвовать более, чем 2 участника, отсюда и вопрос с перспективой, как грамотно выстроить таблицу для лога боя?


Сообщение отредактировал creativengised - Пятница, 24 Января 2014, 01:37
lvovandДата: Пятница, 24 Января 2014, 02:55 | Сообщение # 4
старожил
Сейчас нет на сайте
заменил бы кучу if на switch - case, правильнее и удобнее

Для логов можешь задать в таблице id игроков, кто кого ударил, и числовые значения типов ходов и результатов ходов, а соответствующий им текст в файле конфига или в другой таблице, и не надо будет кучу лишнего текста сохранять


Разработка и продвижение сайтов. Дизайн
creativengisedДата: Пятница, 24 Января 2014, 08:09 | Сообщение # 5
был не раз
Сейчас нет на сайте
lvovand, если я понял правильно (насчет логов) то это должно выглядеть примерно так?

id login hod event1 event2 event3 event4 event5
1 vasya 1 2 1 0 1 22

где каждое число под эвентом(событием) = какой-то фразе например ударил, увернулся, нанес урон, значение урона и тп

а потом это считать в обычный лог и вывести, подставляя нужные слова и фразы

так?
lvovandДата: Пятница, 24 Января 2014, 12:11 | Сообщение # 6
старожил
Сейчас нет на сайте
creativengised, да, сдинственно я думал что и второй игрок туда же

id id_player1 event_player1 id_player2 event_player2

1 10 100 1 1 2 2
условно, Вася ударил а Петя увернулся.

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


Разработка и продвижение сайтов. Дизайн
creativengisedДата: Пятница, 24 Января 2014, 12:52 | Сообщение # 7
был не раз
Сейчас нет на сайте
lvovand, была задумка сделать отдельно таблицу char (персонаж) но честно говоря смены чаров не подразумевается, и чтобы не накосячить с данными решил хранить их в таблице юзеров, идейку с логом понял - огромное спасибо, постараюсь реализовать!

Действительно ларчик просто открывался smile

Хотя наверно поспешил ((( вот смотри допустим есть ход Васи и такая строка (row) Вася ударил а Петя увернулся. а следующий ход Вася попадает и уже получается Вася ударил и нанес урон ХХХХ т.е. еще одна строка (row) вот тут я честно говоря теряюсь, по идее в одной временной таблице боя такое можно реализовать, добавляя нужные строки, но я не думаю, что резонно создавать под каждый поединок таблицу.

Видимо я не до конца понял конструкцию БД. Хотя идея в целом понятна и действительно удобна, подменять текст числовыми значениями.

Прошу если не затрудтнит lvovand, можно схематично изобразить таблицу и что откуда вызывается?

Может быть я немного коряво понимаю, но структура БД должна быть такой:

таблица Battles где id = просто id записи как таковой... дальше id_battle (где записывается уникальный номер поединка) и дальше события Event1 Event2 Event3 и тд... а параллельно сделать таблицу куда добавлять id (тот самый уникальный id поединка) user1_id user2_id тогда можно повытаскивать, но почему то мне кажется, что это утопия, т.к. если юзеров в бою окажется больше 2х, то куда вписывать третьего? А если 100 юзеров в каком нибудь хаоте? Может быть наоборот у юзера хранить где-то запись о проведеном поединке? Но тогда это уже 3я дополнительная таблица причем каждому юзеру


Сообщение отредактировал creativengised - Пятница, 24 Января 2014, 13:32
lvovandДата: Пятница, 24 Января 2014, 13:29 | Сообщение # 8
старожил
Сейчас нет на сайте
схема примерно уже наверно понятна,
а чтобы был урон или уворот, добавишь просто еще полей для результата хода

id id_player1 event_player1 res_player1 id_player2 event_player2 res_player2

и результат урон, или уворот пишешь в те поля,
из-за пары полей новую таблицу скорее всего нерезонно


Разработка и продвижение сайтов. Дизайн
creativengisedДата: Пятница, 24 Января 2014, 16:38 | Сообщение # 9
был не раз
Сейчас нет на сайте


lvovand, все получилось, осталось мелочи доработать, но главное, что хотел получилось wink спасибо за совет!
Форум игроделов » Движки для разработки игр и сложные системы разработки » Движки для браузерных игр » нужен совет по формуле расчета боя
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг