From dc358df6a900e2dde18e1ce3dfdf3a5a8344e571 Mon Sep 17 00:00:00 2001 From: devapromix Date: Thu, 10 Nov 2022 14:44:53 +0200 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- worlds/elvion/includes/class.location.php | 27 +- worlds/elvion/includes/class.user.php | 14 +- worlds/lizardry/includes/class.battle.php | 329 +++++++++ worlds/lizardry/includes/class.boss.php | 39 + worlds/lizardry/includes/class.enemy.php | 140 ++++ worlds/lizardry/includes/class.event.php | 30 + worlds/lizardry/includes/class.item.php | 669 ++++++++++++++++++ worlds/lizardry/includes/class.location.php | 386 ++++++++++ worlds/lizardry/includes/class.magic.php | 61 ++ worlds/lizardry/includes/class.player.php | 37 + worlds/lizardry/includes/class.server.php | 9 + worlds/lizardry/includes/class.user.php | 72 ++ worlds/lizardry/locations/outlands.php | 5 + worlds/lizardry/registration/registration.php | 4 +- 14 files changed, 1807 insertions(+), 15 deletions(-) create mode 100644 worlds/lizardry/includes/class.battle.php create mode 100644 worlds/lizardry/includes/class.boss.php create mode 100644 worlds/lizardry/includes/class.enemy.php create mode 100644 worlds/lizardry/includes/class.event.php create mode 100644 worlds/lizardry/includes/class.item.php create mode 100644 worlds/lizardry/includes/class.location.php create mode 100644 worlds/lizardry/includes/class.magic.php create mode 100644 worlds/lizardry/includes/class.player.php create mode 100644 worlds/lizardry/includes/class.server.php create mode 100644 worlds/lizardry/includes/class.user.php diff --git a/worlds/elvion/includes/class.location.php b/worlds/elvion/includes/class.location.php index 4d1d4c7..4691012 100644 --- a/worlds/elvion/includes/class.location.php +++ b/worlds/elvion/includes/class.location.php @@ -2,14 +2,17 @@ class Location { - public const SHOP_ARMOR = 1; - public const SHOP_WEAPON = 2; - public const SHOP_ALCHEMY = 3; - public const SHOP_MAGIC = 4; - public const TAVERN = 7; - public const BANK = 9; + public const SHOP_ARMOR = 1; + public const SHOP_WEAPON = 2; + public const SHOP_ALCHEMY = 3; + public const SHOP_MAGIC = 4; + public const TAVERN = 7; + public const BANK = 9; + + public const REGION_VILMAR = 1; + public const REGION_EYRINOR = 11; - public const RAND_PLACE_COUNT = 7; + public const RAND_PLACE_COUNT = 7; public function __construct() { @@ -367,6 +370,16 @@ public function get_welcome_phrase($category_ident, $flag = true) { return $phrase['text']; } + public static function get_race_start_location($charrace) { + switch($charrace) { + case Player::RACE_ELF: + return self::REGION_EYRINOR; + break; + default: + return self::REGION_VILMAR; + break; + } + } } diff --git a/worlds/elvion/includes/class.user.php b/worlds/elvion/includes/class.user.php index 88746e6..da0c7b3 100644 --- a/worlds/elvion/includes/class.user.php +++ b/worlds/elvion/includes/class.user.php @@ -2,7 +2,7 @@ class User { - static function init($username, $userpass) { + public static function init($username, $userpass) { global $tb_user, $connection; self::check_login_data($username, $userpass); $query = 'SELECT * FROM '.$tb_user." WHERE user_name='".$username."' AND user_pass='".$userpass."'"; @@ -11,14 +11,14 @@ static function init($username, $userpass) { return $result->fetch_assoc(); } - static function session() { + public static function session() { global $user; $user['user_session'] = time(); User::update("user_session='".$user['user_session']."'"); return $user['user_session']; } - static function check_user($user_name) { + public static function check_user($user_name) { global $connection, $tb_user; $query = "SELECT user_name FROM ".$tb_user." WHERE user_name='".$user_name."'"; $user = mysqli_query($connection, $query) or die('{"error":"Ошибка сохранения данных: '.mysqli_error($connection).'"}'); @@ -29,7 +29,7 @@ static function check_user($user_name) { } } - static function check_char($char_name) { + public static function check_char($char_name) { global $user; if (strtolower($user['char_name']) == strtolower($char_name)) { return true; @@ -38,7 +38,7 @@ static function check_char($char_name) { } } - static function update($s) { + public static function update($s) { global $user, $tb_user, $connection; $query = "UPDATE ".$tb_user." SET ".$s." WHERE user_name='".$user['user_name']."'"; if (!mysqli_query($connection, $query)) { @@ -46,7 +46,7 @@ static function update($s) { } } - static private function check_login_data($username, $userpass) { + public static function check_login_data($username, $userpass) { if ($username == '') die('{"error":"Введите имя учетной записи!"}'); if (strlen($username) < 4) die('{"error":"Имя учетной записи не должно быть короче 4 символов!"}'); if (strlen($username) > 24) die('{"error":"Имя учетной записи должно быть длиннее 24 символов!"}'); @@ -55,7 +55,7 @@ static private function check_login_data($username, $userpass) { if (strlen($userpass) > 24) die('{"error":"Пароль не должен быть длиннее 24 символов!"}'); } - static public function check_registration_data($username, $userpass, $charname) { + public static function check_registration_data($username, $userpass, $charname) { if ($username == '') die('{"error":"Введите имя учетной записи!"}'); if (strlen($username) < 4) die('{"error":"Имя учетной записи не должно быть короче 4 символов!"}'); if (strlen($username) > 24) die('{"error":"Имя учетной записи должно быть длиннее 24 символов!"}'); diff --git a/worlds/lizardry/includes/class.battle.php b/worlds/lizardry/includes/class.battle.php new file mode 100644 index 0000000..2d33ed2 --- /dev/null +++ b/worlds/lizardry/includes/class.battle.php @@ -0,0 +1,329 @@ +$statistics = array(); + $this->rounds = 0; + + } + + public function start_battle() { + global $user; + + if ($user['char_life_cur'] <= 0) + die('{"error":"Вам сначала нужно вернуться к жизни!"}'); + if ($user['enemy_life_cur'] <= 0) + die('{"error":"Враг и так мертв!"}'); + + $r = ''; + + $this->rounds = 1; + $this->statistics['char_damages'] = 0; + $this->statistics['enemy_damages'] = 0; + $this->statistics['char_dodges'] = 0; + $this->statistics['char_parries'] = 0; + $this->statistics['char_hits'] = 0; + $this->statistics['enemy_hits'] = 0; + $this->statistics['char_misses'] = 0; + $this->statistics['enemy_misses'] = 0; + + $c = rand(0, 2); + $r .= 'Вы вступаете в схватку с '.$user['enemy_name'].'.#'; + if (($c == 0) && ($user['enemy_boss'] == 0)) + $r .= 'Вы первыми бросаетесь в атаку!#'; + else + $r .= $user['enemy_name'].' первым бросается в атаку!#'; + + while(true) { + + $r .= '--- '.strval($this->rounds).'-й раунд: ---#'; + if ($c == 0) { + $r .= $this->player_battle_round(); + $r .= $this->enemy_battle_round(); + } else { + $r .= $this->enemy_battle_round(); + $r .= $this->player_battle_round(); + } + + if (($user['char_life_cur'] < round($user['char_life_max'] / 10)) + &&($user['char_life_cur'] > 0)&&($user['enemy_life_cur'] > 0)) { + $r .= 'Понимая, что результат боя складывается не в вашу пользу, вы пытаетесь уклониться от боя...#'; + if (rand(1, 100) <= (($user['skill_run'] * 5) + 25)) { + $r .= 'Вы отступаете!#'; + break; + } else + $r .= 'Неудачно! '.$user['enemy_name'].' снова бросается в атаку! Поединок продолжается...#'; + } + + if ($user['char_life_cur'] <= 0) { + $user['char_life_cur'] = 0; + $user['char_mana_cur'] = 0; + $user['stat_deads']++; + $user['char_exp'] -= round($user['char_exp'] / 5); + $user['char_gold'] -= round($user['char_gold'] / 7); + $r .= $this->str_line(); + $r .= 'Вы потеряли пятую часть опыта и седьмую часть золота.#'; + Event::add(3, $user['char_name'], 1, $user['char_gender'], '', $user['char_region_location_name']); + break; + } + + if ($user['enemy_life_cur'] <= 0) { + $user['enemy_life_cur'] = 0; + $user['stat_kills']++; + $r .= $this->str_line(); + $user['class']['item']->gen_loot(); + if ($user['enemy_boss'] > 0) { + Boss::kill($user['char_region']); + $r .= 'Вы победили босса! Вы добыли ценный трофей!#'; + } else + $user['class']['location']->gen_random_place(); + $gold = $this->get_value($user['enemy_gold']); + if ($gold > 0) + $gold += ($user['char_region_level'] * ($user['skill_gold'] * rand(3, 5))); + $user['char_gold'] += $gold; + $exp = $this->get_value($user['enemy_exp']); + $user['char_exp'] += $exp; + if ($exp > 0) + $r .= 'Вы получаете '.$exp.' опыта.#'; + if ($gold <= 0) + $r .= 'Вы роетесь в останках '.$user['enemy_name'].', но не находите золота.#'; + else + $r .= 'Вы обшариваете останки '.$user['enemy_name'].' и подбираете '.$gold.' золота.#'; + if ($user['loot_slot_1'] > 0) { + $r .= 'Ваше внимание привлекает '.$user['loot_slot_1_name'].'.#'; + } else if ($user['current_random_place'] > 0) { + $r .= 'Ваше внимание привлекает загадочная локация, которую вы только что обнаружили...#'; + } + if ($user['enemy_champion'] == 1) + Event::add(4, $user['char_name'], 1, $user['char_gender'], $user['enemy_name'], $user['char_region_location_name']); + break; + } + $this->rounds++; + $c = rand(0, 2); + + } + + $r .= $this->str_line(); + $r .= "Всего раундов: ".$this->rounds."#"; + $r .= "Сумма урона: ".$this->statistics['char_damages']." (".$user['char_name'].") / ".$this->statistics['enemy_damages']." (".$user['enemy_name'].")#"; + $r .= "Попадания: ".$this->statistics['char_hits']." (".$user['char_name'].") / ".$this->statistics['enemy_hits']." (".$user['enemy_name'].")#"; + $r .= "Промахи: ".$this->statistics['char_misses']." (".$user['char_name'].") / ".$this->statistics['enemy_misses']." (".$user['enemy_name'].")#"; + $r .= "Уклонения: ".$this->statistics['char_dodges']." Парирования: ".$this->statistics['char_parries']."#"; + + if ($this->ch_level_exp()) { + $r .= $this->str_line(); + $r .= 'Вы стали намного опытнее для текущего уровня и поэтому получаете меньше опыта и золота! Нужно посетить Квартал Гильдий и повысить уровень!#'; + } + + $user['char_effect'] = 0; + + $user['battlelog'] = $r; + + } + + private function player_battle_round() { + global $user; + + $r = ''; + + if (($user['char_life_cur'] > 0) && ($user['enemy_life_cur'] > 0)) { + if ($user['char_effect'] == Magic::PLAYER_EFFECT_REGEN) + $r .= $this->regen(); + if (rand(1, $user['enemy_armor']) <= rand(1, $user['char_armor'])) { + if ($user['char_effect'] == Magic::PLAYER_EFFECT_BLESS) + $d = $user['char_damage_max']; + else + $d = rand($user['char_damage_min'], $user['char_damage_max']); + $d = $this->get_real_damage($d, $user['enemy_armor'], $user['char_level'], $user['enemy_level']); + $this->statistics['char_hits']++; + if ($d <= 0) { + $r .= 'Вы не можете пробить защиту '.$user['enemy_name'].'.#'; + } else { + if (rand(1, 100) <= $user['skill_bewil']) { + $d = $this->get_bewildering_strike_damage($d); + $this->statistics['char_damages'] += $d; + $user['enemy_life_cur'] -= $d; + if ($user['enemy_life_cur'] > 0) { + $r .= 'Вы наносите ошеломляющий удар и раните '.$user['enemy_name'].' на '.$d.' HP! '.$user['enemy_name'].' в смятении.#'; + $r .= $this->player_battle_round(); + } else { + $r .= 'Вы наносите ошеломляющий удар на '.$d.' HP и убиваете '.$user['enemy_name'].'.#'; + } + return $r; + } else if (rand(1, 100) <= 5) { + $d = $this->get_glancing_blow_damage($d); + $this->statistics['char_damages'] += $d; + $user['enemy_life_cur'] -= $d; + if ($user['enemy_life_cur'] > 0) { + $r .= 'Вы наносите скользящий удар и раните '.$user['enemy_name'].' на '.$d.' HP.#'; + } else { + $r .= 'Вы наносите скользящий удар на '.$d.' HP и убиваете '.$user['enemy_name'].'.#'; + } + return $r; + } else if (rand(1, 100) <= 1) { + $d += rand($user['char_damage_max'], $user['char_damage_max'] * 2); + $this->statistics['char_damages'] += $d; + $user['enemy_life_cur'] -= $d; + if ($user['enemy_life_cur'] > 0) { + $r .= 'Вы наносите критический удар и раните '.$user['enemy_name'].' на '.$d.' HP!#'; + } else { + $r .= 'Вы наносите критический удар на '.$d.' HP и убиваете '.$user['enemy_name'].'!#'; + } + } else { + $crushing_blow_damage = $this->get_crushing_blow_damage($d); + if ((rand(1, 100) <= 0)&&($crushing_blow_damage >= $user['enemy_life_cur'])) { + $this->statistics['char_damages'] += $crushing_blow_damage; + $user['enemy_life_cur'] = 0; + $r .= 'Вы наносите сокрушающий удар на '.$crushing_blow_damage.' HP и убиваете '.$user['enemy_name'].'!#'; + return $r; + } + $this->statistics['char_damages'] += $d; + $user['enemy_life_cur'] -= $d; + if ($user['enemy_life_cur'] > 0) { + $r .= 'Вы раните '.$user['enemy_name'].' на '.$d.' HP.#'; + } else { + $r .= 'Вы наносите удар на '.$d.' HP и убиваете '.$user['enemy_name'].'.#'; + } + } + } + } else { + $r .= 'Вы пытаетесь атаковать, но промахиваетесь по '.$user['enemy_name'].'.#'; + $this->statistics['char_misses']++; + } + } + + return $r; + + } + + private function enemy_battle_round() { + global $user; + + $r = ''; + + if (($user['enemy_life_cur'] > 0) && ($user['char_life_cur'] > 0)) { + if (rand(1, $user['char_armor'] + 1) <= rand(1, $user['enemy_armor'])) { + if (rand(1, 100) > $user['skill_dodge']) { + if (rand(1, 100) > $user['skill_parry']) { + if (rand(1, 100) > 10) { // todo: Расовый навык уклонения у людей, ящеров и эльфов + if (rand(1, 3) > 1) + $d = rand($user['enemy_damage_min'], $user['enemy_damage_max']); + else + $d = $user['enemy_damage_min']; + $d = $this->get_real_damage($d, $user['char_armor'], $user['enemy_level'], $user['char_level']); + $this->statistics['enemy_hits']++; + if ($d <= 0) { + $r .= $user['enemy_name'].' атакует, но не может пробить вашу защиту.#'; + $d = 0; + } else { + if (rand(1, 100) <= 15) { + $d = $this->get_glancing_blow_damage($d); + $this->statistics['enemy_damages'] += $d; + $user['char_life_cur'] -= $d; + if ($user['char_life_cur'] > 0) { + $r .= $user['enemy_name'].' наносит скользящий удар и ранит вас на '.$d.' HP.#'; + } else { + $r .= $user['enemy_name'].' наносит скользящий удар на '.$d.' HP и убивает вас.#'; + } + return $r; + } + $this->statistics['enemy_damages'] += $d; + $user['char_life_cur'] -= $d; + if ($user['char_life_cur'] > 0) { + $r .= $user['enemy_name'].' ранит вас на '.$d.' HP.#'; + } else { + $r .= $user['enemy_name'].' наносит удар на '.$d.' HP и убивает вас.#'; + } + } + } else { + $r .= $user['enemy_name'].' пытается атаковать, но ваш расовый навык позволяет уклониться от атаки!#'; + $this->statistics['char_dodges']++; + } + } else { + $r .= 'Вы парируете атаку '.$user['enemy_name'].'.#'; + $this->statistics['char_parries']++; + } + } else { + $r .= 'Вы ловко уклоняетесь от атаки '.$user['enemy_name'].'.#'; + $this->statistics['char_dodges']++; + } + } else { + $r .= $user['enemy_name'].' промахивается по вам.#'; + $this->statistics['enemy_misses']++; + } + } + + return $r; + + } + + private function str_line() { + return '--------------------------------------------------------#'; + } + + private function get_real_damage($atk_damage, $def_armor, $atk_level, $def_level) { + return $atk_damage - round($atk_damage * $def_armor / 100); + } + + private function get_glancing_blow_damage($damage){ + $r = round($damage / rand(2, 3)); + if ($r < 1) + $r = 1; + return $r; + } + + private function regen() { + global $user; + $r = ''; + if ($user['char_life_cur'] < $user['char_life_max']) { + $user['char_life_cur']++; + $r .= 'Вы восстановили 1 HP.#'; + } + return $r; + } + + private function get_crushing_blow_damage($damage) { + return $damage * rand(3, 5); + } + + private function get_bewildering_strike_damage($damage) { + return rand(round($damage * 0.75), round($damage * 1.2)); + } + + private function get_value($value) { + global $user; + + if ($user['enemy_level'] < $user['char_level'] - 1) { + $v = $user['char_level'] - $user['enemy_level']; + $r = round($value / $v); + if ($r < 1) + $r = 1; + } else + $r = $value; + + if (($r > 0) && ($this->ch_level_exp())) { + $r = rand(round($r / 5), round($r / 2)); + if ($r < 1) + $r = 1; + } + + return $r; + } + + private function ch_level_exp() { + global $user; + + $r = false; + if ($user['char_exp'] > $user['class']['player']->get_level_exp($user['char_level'] + 1)) + $r = true; + return $r; + } + + } + +?> \ No newline at end of file diff --git a/worlds/lizardry/includes/class.boss.php b/worlds/lizardry/includes/class.boss.php new file mode 100644 index 0000000..b259109 --- /dev/null +++ b/worlds/lizardry/includes/class.boss.php @@ -0,0 +1,39 @@ + \ No newline at end of file diff --git a/worlds/lizardry/includes/class.enemy.php b/worlds/lizardry/includes/class.enemy.php new file mode 100644 index 0000000..a2dc875 --- /dev/null +++ b/worlds/lizardry/includes/class.enemy.php @@ -0,0 +1,140 @@ +fetch_assoc(); + + $un_champion_name = ''; + while ($un_champion_name == '') { + $query = "SELECT enemy_rand_name FROM ".$tb_enemy." ORDER BY RAND() LIMIT 1"; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $un_enemy = $result->fetch_assoc(); + $un_champion_name = trim($un_enemy['enemy_rand_name']); + } + + $user['enemy_boss'] = 0; + $user['enemy_champion'] = 0; + + $user['enemy_name'] = $enemy['enemy_name']; + + if ($enemy_elite > 0) + $user['enemy_champion'] = $enemy_elite; + + if ($user['enemy_champion'] > 0) { + switch($user['enemy_champion']) { + case 1: // Уникальный + $user['enemy_name'] = $enemy['enemy_uniq_name']; + $user['enemy_name'] .= ' '.$un_enemy['enemy_rand_name'].' (Элита)'; + break; + default: + $elite_name = array(2 => "Крупень", + 3 => "Здоровяк", + 4 => "Голиаф", + 5 => "Убийца", + 6 => "Громила", + 7 => "Берсерк", + 8 => "Твердолоб", + 9 => "Титан", + 10 => "Колосс"); + $user['enemy_name'] .= ' ('.$elite_name[$user['enemy_champion']].')'; + break; + } + } + + if ($enemy_ident >= Boss::START_ID) Boss::gen($enemy); + + $user['enemy_image'] = $enemy['enemy_image']; + $user['enemy_level'] = $enemy['enemy_level']; + // Life + $user['enemy_life_max'] = ($user['class']['player']->get_life($enemy['enemy_level']) - 5) + rand(1, 10); + if ($user['enemy_champion'] == 2) + $user['enemy_life_max'] = round($user['enemy_life_max'] * 1.3); + if (($user['enemy_champion'] == 3) or ($user['enemy_champion'] == 1)) + $user['enemy_life_max'] = round($user['enemy_life_max'] * 1.4); + if ($user['enemy_champion'] == 4) + $user['enemy_life_max'] = round($user['enemy_life_max'] * 1.5); + $user['enemy_life_cur'] = $user['enemy_life_max']; + // Damage + $user['enemy_damage_min'] = round($enemy['enemy_level'] * 0.5) - 1; + $user['enemy_damage_max'] = round($enemy['enemy_level'] * 0.5) + 1; + if ($user['enemy_champion'] == 1) { + // Уникальный + $user['enemy_damage_max'] = round($user['enemy_damage_max'] * (1 + (rand(1, 3) * 0.1))); + } + if ($user['enemy_champion'] == 5) + $user['enemy_damage_max'] = round($user['enemy_damage_max'] * 1.1); + if ($user['enemy_champion'] == 6) + $user['enemy_damage_max'] = round($user['enemy_damage_max'] * 1.2); + if ($user['enemy_champion'] == 7) + $user['enemy_damage_max'] = round($user['enemy_damage_max'] * 1.3); + if ($user['enemy_damage_max'] < 2) + $user['enemy_damage_max'] = 2; + if ($user['enemy_damage_min'] < 1) + $user['enemy_damage_min'] = 1; + // Armour + $user['enemy_armor'] = round($enemy['enemy_level'] * 0.5); + if ($user['enemy_champion'] == 1) { + // Уникальный + $user['enemy_armor'] = round($user['enemy_armor'] * (1 + (rand(1, 3) * 0.1))); + } + if ($user['enemy_champion'] == 8) + $user['enemy_armor'] = round($user['enemy_armor'] * 1.1); + if ($user['enemy_champion'] == 9) + $user['enemy_armor'] = round($user['enemy_armor'] * 1.2); + if ($user['enemy_champion'] == 10) + $user['enemy_armor'] = round($user['enemy_armor'] * 1.3); + // Experience + $user['enemy_exp'] = round($enemy['enemy_level'] * 3) + rand(round($enemy['enemy_level'] * 0.1), round($enemy['enemy_level'] * 0.3)); + if ($user['enemy_champion'] == 1) + $user['enemy_exp'] = round($user['enemy_exp'] * 1.7); + if ($user['enemy_champion'] >= 2) + $user['enemy_exp'] = round($user['enemy_exp'] * 1.3); + // Gold + $user['enemy_gold'] = round($enemy['enemy_level'] * 2.5) + rand(1, 20); + if ($user['enemy_champion'] == 1) + $user['enemy_gold'] += $enemy['enemy_level'] * 12; + if ($user['enemy_champion'] >= 2) + $user['enemy_gold'] += $enemy['enemy_level'] * 7; + $user['current_random_place'] = 0; + User::update("enemy_ident=".$enemy_ident.",enemy_name='".$user['enemy_name']."',enemy_image='".$user['enemy_image']."',enemy_level=".$user['enemy_level'].",enemy_boss=".$user['enemy_boss'].",enemy_champion=".$user['enemy_champion'].",enemy_life_max=".$user['enemy_life_max'].",enemy_life_cur=".$user['enemy_life_cur'].",enemy_damage_min=".$user['enemy_damage_min'].",enemy_damage_max=".$user['enemy_damage_max'].",enemy_armor=".$user['enemy_armor'].",enemy_exp=".$user['enemy_exp'].",enemy_gold=".$user['enemy_gold'].",loot_slot_1=0,loot_slot_1_name='',current_random_place=".$user['current_random_place']); + } + + static public function add($enemy_slot, $enemy_ident, $enemy_elite = 0) { + global $user, $tb_enemy, $connection; + + $query = "SELECT * FROM ".$tb_enemy." WHERE enemy_ident=".$enemy_ident; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $enemy = $result->fetch_assoc(); + + $user['enemy_slot_'.strval($enemy_slot)] = $enemy_ident; + $user['enemy_slot_'.strval($enemy_slot).'_image'] = $enemy['enemy_image']; + $user['enemy_slot_'.strval($enemy_slot).'_level'] = $enemy['enemy_level']; + if (($enemy_ident > Boss::START_ID) && ($enemy_ident < self::EMPTY_ID)) + $enemy_elite = 1; + $user['enemy_slot_'.strval($enemy_slot).'_elite'] = $enemy_elite; + User::update("current_outlands='".$user['current_outlands']."',enemy_slot_".strval($enemy_slot)."=".$user['enemy_slot_'.strval($enemy_slot)].",enemy_slot_".strval($enemy_slot)."_image='".$user['enemy_slot_'.strval($enemy_slot).'_image']."',enemy_slot_".strval($enemy_slot)."_level=".$user['enemy_slot_'.strval($enemy_slot).'_level'].",enemy_slot_".strval($enemy_slot)."_elite=".$user['enemy_slot_'.strval($enemy_slot).'_elite']); + } + + static public function get_enemies() { + global $tb_enemy, $connection; + + $query = "SELECT enemy_image FROM ".$tb_enemy; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $enemies = $result->fetch_all(MYSQLI_ASSOC); + + return json_encode($enemies, JSON_UNESCAPED_UNICODE); + } + + } + +?> \ No newline at end of file diff --git a/worlds/lizardry/includes/class.event.php b/worlds/lizardry/includes/class.event.php new file mode 100644 index 0000000..a10ef07 --- /dev/null +++ b/worlds/lizardry/includes/class.event.php @@ -0,0 +1,30 @@ +fetch_all(MYSQLI_ASSOC); + return json_encode($events, JSON_UNESCAPED_UNICODE); + } + + } + +?> \ No newline at end of file diff --git a/worlds/lizardry/includes/class.item.php b/worlds/lizardry/includes/class.item.php new file mode 100644 index 0000000..8a484f7 --- /dev/null +++ b/worlds/lizardry/includes/class.item.php @@ -0,0 +1,669 @@ + $user['char_level']) + $r = $user['char_level']; + return $r; + } + + public function pickup_all() { + global $user, $tb_item, $connection; + + $r = ''; + + return $r; + } + + public function get_slot_ident($item_slot) { + global $user; + return $user['item_slot_'.strval($item_slot)]; + } + + public function has_item($id) { + global $user; + $inventory = $user['char_inventory']; + $pos = strripos($inventory, '"id":"'.$id.'"'); + if ($pos === false) { + return false; + } else { + return true; + } + } + + public function gold_trade($type) { + global $user, $tb_item, $connection; + + $query = "SELECT * FROM ".$tb_item." WHERE item_type=".$type; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $items = mysqli_fetch_all($result, MYSQLI_ASSOC); + + $gold = 0; + foreach ($items as $item) { + $id = $item['item_ident']; + if ($this->has_item($id)) { + $count = $this->amount($id); + if ($count > 0) { + $price = $price = $this->get_price($type, $item['item_price'], $count); + $user['char_gold'] += $price; + $gold += $price; + $this->modify($id, -$count); + } + } + } + + User::update("char_gold=".$user['char_gold']); + + return $gold; + } + + public function buy_empty_elixir($count = 1) { + global $user; + if ($user['char_gold'] < 100) die('{"info":"Нужно не менее 100 золотых монет!"}'); + $this->add(self::ELIXIR_EMPTY, $count); + $user['char_gold'] -= 100; + User::update("char_gold=".$user['char_gold']); + $user['log'] = 'Вы купили Пустой Флакон.'; + } + + private function add($id, $count = 1) { + global $user; + if ($this->has_item($id)) { + $this->modify($id, $count); + } else { + $items = json_decode($user['char_inventory'], true); + $n = count($items); + $items[$n]['id'] = $id; + $items[$n]['count'] = $count; + $user['char_inventory'] = json_encode($items, JSON_UNESCAPED_UNICODE); + User::update("char_inventory='".$user['char_inventory']."'"); + } + } + + public function make_elixir($elix_id, $t, $ing1_name, $ing1_id, $ing1_amount, $ing2_name, $ing2_id, $ing2_amount) { + if ($this->has_item(self::ELIXIR_EMPTY)) { + if ($this->has_item($ing1_id)) { + $amount = $this->amount($ing1_id); + if ($amount >= $ing1_amount) { + if ($this->has_item($ing2_id)) { + $amount = $this->amount($ing2_id); + if ($amount >= $ing2_amount) { + $this->modify($ing1_id, -$ing1_amount); + $this->modify($ing2_id, -$ing2_amount); + $this->modify(self::ELIXIR_EMPTY, -1); + $this->add($elix_id); + return $t; + } die('{"info":"Нужно большеe количество компонента - '.$ing2_name.'!"}'); + } die('{"info":"Нужен компонент - '.$ing2_name.'!"}'); + } die('{"info":"Нужно большеe количество компонента - '.$ing1_name.'!"}'); + } die('{"info":"Нужен компонент - '.$ing1_name.'!"}'); + } else die('{"info":"Нужен Пустой Флакон!"}'); + } + + public function item_info($item_ident) { + global $user, $tb_item, $connection; + if ($user['char_life_cur'] <= 0) die('{"error":"Вам сначала нужно вернуться к жизни!"}'); + + $query = "SELECT * FROM ".$tb_item." WHERE item_ident=".$item_ident; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $item = $result->fetch_assoc(); + + $ef = ''; + $eq = ''; + switch($item['item_type']) { + case self::CAT_ARMOR: + $ef = 'Броня: '.$item['item_armor']; + $eq = 'Доспех.'; + break; + case self::CAT_WEAPON: + $ef = 'Урон: '.$item['item_damage_min'].'-'.$item['item_damage_max']; + $eq = 'Одноручный Меч.'; + break; + case self::CAT_ELIXIR_HP: + $ef = 'Полностью исцеляет от ран.'; + $eq = 'Целительный Эликсир.'; + break; + case self::CAT_ELIXIR_MP: + $ef = 'Восполняет всю ману.'; + $eq = 'Магический Эликсир.'; + break; + case self::CAT_ELIXIR_ST: + $ef = 'Исцеляет и увеличивает запас здоровья на 20%.'; + $eq = 'Магический Эликсир.'; + break; + case self::CAT_ELIXIR_RF: + $ef = 'Восполнение здоровья и маны.'; + $eq = 'Магический Эликсир.'; + break; + case self::CAT_ELIXIR_TROLL: + $ef = 'Регенерация здоровья.'; + $eq = 'Целительный Эликсир.'; + break; + case self::CAT_TROPHY: + $ef = 'Часть тела монстра.'; + $eq = 'Трофей.'; + break; + case self::CAT_SCROLL_TP: + $ef = 'Открывает портал в город. Мана: '.Magic::MANA_SCROLL_TP; + $eq = 'Магический свиток.'; + break; + case self::CAT_SCROLL_HEAL: + $ef = 'Полностью исцеляет от ран. Мана: '.Magic::MANA_SCROLL_HEAL; + $eq = 'Магический свиток.'; + break; + case self::CAT_SCROLL_BLESS: + $ef = 'Весь урон становится максимальным. Мана: '.Magic::MANA_SCROLL_BLESS; + $eq = 'Магический свиток.'; + break; + case self::CAT_ELIXIR_EMPTY: + $ef = 'Необходим для создания эликсиров.'; + $eq = ''; + break; + case self::CAT_ING: + $ef = 'Алхимический ингредиент для зелий.'; + $eq = 'Ингредиент.'; + break; + case self::CAT_FOOD: + $ef = 'Провизия.'; + $eq = ''; + break; + case 76: + $ef = 'Открывает замки.'; + $eq = ''; + break; + case 77: + $ef = 'Источник света.'; + $eq = ''; + break; + } + if ($ef == '') + die('{"item":""}'); + else + if ($eq != '') + die('{"item":"'.$item['item_name'].'\n'.$eq.' Уровень предмета: '.$item['item_level'].'\n'.$ef.'"}'); + else + die('{"item":"'.$item['item_name'].'\nУровень предмета: '.$this->get_region_item_level($item['item_level']).'\n'.$ef.'"}'); + } + + private function item_values($item_ident) { + global $user, $tb_item, $connection; + $query = "SELECT * FROM ".$tb_item." WHERE item_ident=".$item_ident; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $item = $result->fetch_assoc(); + switch($item['item_type']) { + case self::CAT_ARMOR: + return $item['item_name'].','.$item['item_armor'].','.$item['item_level'].','.$item['item_price']; + break; + case self::CAT_WEAPON: + return $item['item_name'].','.$item['item_damage_min'].'-'.$item['item_damage_max'].','.$item['item_level'].','.$item['item_price']; + break; + default: + return $item['item_name'].','.strval($item['item_level']).','.$this->get_region_item_level($item['item_level']).','.$item['item_price']; + break; + } + } + + public function add_item_to_shop($item_slot, $item_ident) { + global $user; + $user['item_slot_'.strval($item_slot)] = $item_ident; + $user['item_slot_'.strval($item_slot).'_values'] = $this->item_values($item_ident); + User::update('item_slot_'.strval($item_slot).'='.$user['item_slot_'.strval($item_slot)]); + } + + public function use_item($item_ident) { + global $user, $tb_item, $connection; + if ($user['char_life_cur'] <= 0) die('{"error":"Вам сначала нужно вернуться к жизни!"}'); + + $query = "SELECT * FROM ".$tb_item." WHERE item_ident=".$item_ident; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $item = $result->fetch_assoc(); + + $result = ''; + + if ($user['char_level'] < $this->get_region_item_level($item['item_level'])) die('{"info":"Нужен уровень выше!"}'); + + switch($item['item_type']) { + case self::CAT_ELIXIR_HP: + $this->modify($item_ident, -1); + $item_level = $item['item_level']; + $user['class']['player']->heal(); + User::update("char_life_cur=".$user['char_life_cur']); + $result = ',"char_life_cur":"'.$user['char_life_cur'].'","char_life_max":"'.$user['char_life_max'].'"'; + break; + case self::CAT_ELIXIR_MP: + $this->modify($item_ident, -1); + $item_level = $item['item_level']; + $user['char_mana_cur'] = $user['char_mana_max']; + User::update("char_mana_cur=".$user['char_mana_cur']); + $result = ',"char_mana_cur":"'.$user['char_mana_cur'].'","char_mana_max":"'.$user['char_mana_max'].'"'; + break; + case self::CAT_ELIXIR_ST: + $this->modify($item_ident, -1); + $item_level = $item['item_level']; + $user['char_life_cur'] = $user['char_life_max'] + round($user['char_life_max'] / 5); + User::update("char_life_cur=".$user['char_life_cur']); + $result = ',"char_life_cur":"'.$user['char_life_cur'].'","char_life_max":"'.$user['char_life_max'].'"'; + break; + case self::CAT_ELIXIR_RF: + $this->modify($item_ident, -1); + $item_level = $item['item_level']; + $user['class']['player']->heal(); + $user['char_mana_cur'] = $user['char_mana_max']; + User::update("char_life_cur=".$user['char_life_cur'].",char_mana_cur=".$user['char_mana_cur']); + $result = ',"char_life_cur":"'.$user['char_life_cur'].'","char_life_max":"'.$user['char_life_max'].'","char_mana_cur":"'.$user['char_mana_cur'].'","char_mana_max":"'.$user['char_mana_max'].'"'; + break; + case self::CAT_ELIXIR_TROLL: + $this->modify($item_ident, -1); + $user['char_effect'] = Magic::PLAYER_EFFECT_REGEN; + User::update("char_effect=".$user['char_effect']); + $result = ',"char_effect":"'.$user['char_effect'].'"'; + break; + case self::CAT_SCROLL_TP: + $result = $user['class']['magic']->use_scroll_tp($item_ident); + break; + case self::CAT_SCROLL_HEAL: + $result = $user['class']['magic']->use_scroll_heal($item_ident); + break; + case self::CAT_SCROLL_BLESS: + $result = $user['class']['magic']->use_scroll_bless($item_ident); + break; + case self::CAT_FOOD: + if ($user['char_food'] >= 7) die('{"info":"У вас полный запас провизии!"}'); + $this->modify($item_ident, -1); + $user['char_food']++; + User::update("char_food=".$user['char_food']); + $result = ',"char_food":"'.$user['char_food'].'"'; + break; + } + return $result; + } + + public function inv_item_list($type) { + global $user, $tb_item, $connection; + + $query = "SELECT * FROM ".$tb_item." WHERE item_type=".$type; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $items = mysqli_fetch_all($result, MYSQLI_ASSOC); + + $r = ''; + $t = ''; + $gold = 0; + foreach ($items as $item) { + $id = $item['item_ident']; + if ($user['class']['item']->has_item($id)) { + $count = $this->amount($id); + $price = $user['class']['item']->get_price($type, $item['item_price'], $count); + $t .= $item['item_name'].' '.$count.'x - '.$price.' зол.#'; + $gold += $price; + } + } + + if ($t != '') { + switch($type) { + case self::CAT_ARMOR: + $r .= 'Ваши брони:'; + break; + case self::CAT_WEAPON: + $r .= 'Ваше оружие:'; + break; + case self::CAT_TROPHY: + $r .= 'Ваши трофеи:'; + break; + case self::CAT_ING: + $r .= 'Ваши ингредиенты:'; + break; + } + $r .= '#============#'.$t.'============#Всего: '.$gold.' зол.'; + } + + return $r; + } + + private function get_region_item_level($item_level) { + $result = 1; + if ($item_level > 1) + $result = ($item_level - 1) * 12; + return $result; + } + + public function save_loot_slot($item_ident, $item_name, $item_type, $item_slot = 1) { + global $user; + + $user['loot_slot_'.strval($item_slot)] = $item_ident; + $user['loot_slot_'.strval($item_slot).'_name'] = $item_name; + $user['loot_slot_'.strval($item_slot).'_type'] = $item_type; + + if ($user['loot_slot_'.strval($item_slot)] > 0) + User::update("loot_slot_".strval($item_slot)."=".$user['loot_slot_'.strval($item_slot)].",loot_slot_".strval($item_slot)."_type=".$user['loot_slot_'.strval($item_slot).'_type'].",loot_slot_".strval($item_slot)."_name='".$user['loot_slot_'.strval($item_slot).'_name']."'"); + } + + private function gen_random_loot($loot_type_array, $loot_level) { + global $user, $tb_item, $connection; + + $loot_type = $loot_type_array[array_rand($loot_type_array)]; + + $query = "SELECT item_ident,item_name,item_level FROM ".$tb_item." WHERE item_level=".$loot_level." AND item_type=".$loot_type." ORDER BY RAND() LIMIT 1"; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $item = $result->fetch_assoc(); + + $this->save_loot_slot($item['item_ident'], $item['item_name'], $loot_type); + } + + private function gen_trophy_loot() { + global $user, $tb_item, $tb_enemy, $connection; + + $query = "SELECT enemy_trophy FROM ".$tb_enemy." WHERE enemy_ident=".$user['enemy_ident']; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $enemy = $result->fetch_assoc(); + + $trophy_ident = $enemy['enemy_trophy']; + if ($trophy_ident > 0) { + $query = "SELECT item_name FROM ".$tb_item." WHERE item_ident=".$trophy_ident; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $item = $result->fetch_assoc(); + + $this->save_loot_slot($trophy_ident, $item['item_name'], self::CAT_TROPHY); + } + } + + private function gen_equip_loot() { + global $user; + $loot_level = $this->get_loot_level(); + if ($loot_level % 2 != 0) + $this->gen_random_loot([self::CAT_ARMOR], $loot_level); + else + $this->gen_random_loot([self::CAT_WEAPON], $loot_level); + } + + private function gen_else_loot() { + $this->gen_random_loot([ + self::CAT_ELIXIR_HP, + self::CAT_ELIXIR_MP, + self::CAT_ELIXIR_ST, + self::CAT_ELIXIR_RF, + self::CAT_ELIXIR_TROLL, + self::CAT_SCROLL_TP, + self::CAT_SCROLL_HEAL, + self::CAT_SCROLL_BLESS, + self::CAT_ELIXIR_EMPTY, + self::CAT_ING + ], 1); + } + + private function gen_alch_loot() { + $this->gen_random_loot([ + self::CAT_ELIXIR_HP, + self::CAT_ELIXIR_MP, + self::CAT_ELIXIR_ST, + self::CAT_ELIXIR_RF, + self::CAT_ELIXIR_TROLL, + self::CAT_ELIXIR_EMPTY + ], 1); + } + + private function gen_mage_loot() { + $this->gen_random_loot([ + self::CAT_ELIXIR_MP, + self::CAT_SCROLL_TP, + self::CAT_SCROLL_HEAL, + self::CAT_SCROLL_BLESS + ], 1); + } + + public function gen_herb_loot() { + $this->gen_random_loot([self::CAT_ING], 1); + } + + public function gen_loot() { + global $user; + + // Обычные враги + if (($user['enemy_boss'] == 0) && ($user['enemy_champion'] == 0)) { + // Трофеи + if (rand(1, 4) == 1) { + $this->gen_trophy_loot(); + } else + // Обычный лут: зелья, свитки, травы + if (rand(1, 10) == 1) { + $this->gen_else_loot(); + } else + // Экипировка + if (rand(1, 100) == 1) { + $this->gen_equip_loot(); + } + // Чемпионы + } elseif (($user['enemy_champion'] > 1) && ($user['enemy_boss'] == 0)) { + // Экипировка + if (rand(1, 20) == 1) { + $this->gen_equip_loot(); + } else { + $this->gen_else_loot(); + } + // Уникальные + } elseif (($user['enemy_champion'] == 1) && ($user['enemy_boss'] == 0)) { + // Экипировка + $this->gen_equip_loot(); + // Босс + } elseif ($user['enemy_boss'] > 0) { + // Экипировка + $this->gen_equip_loot(); + } + } + + public function equip_item($item_ident, $item_amount = 1) { + global $user, $tb_item, $connection; + $query = "SELECT * FROM ".$tb_item." WHERE item_ident=".$item_ident; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $item = $result->fetch_assoc(); + + if ($user['char_gold'] < ($item['item_price'] * $item_amount)) die('{"info":"Нужно больше золота!"}'); + if ($user['char_level'] < $item['item_level']) die('{"info":"Нужен уровень выше!"}'); + + switch($item['item_type']) { + case self::CAT_ARMOR: + $this->add($user['char_equip_armor_ident']); + $user['char_equip_armor_name'] = $item['item_name']; + $user['char_equip_armor_ident'] = $item['item_ident']; + $user['char_gold'] -= $item['item_price']; + $user['char_armor'] = $item['item_armor']; + User::update("char_equip_armor_name='".$user['char_equip_armor_name']."',char_equip_armor_ident=".$user['char_equip_armor_ident'].",char_armor=".$user['char_armor'].",char_gold=".$user['char_gold']); + Event::add(2, $user['char_name'], 1, $user['char_gender'], $item['item_name']); + break; + case self::CAT_WEAPON: + $this->add($user['char_equip_weapon_ident']); + $user['char_equip_weapon_name'] = $item['item_name']; + $user['char_equip_weapon_ident'] = $item['item_ident']; + $user['char_gold'] -= $item['item_price']; + $user['char_damage_min'] = $item['item_damage_min']; + $user['char_damage_max'] = $item['item_damage_max']; + User::update("char_equip_weapon_name='".$user['char_equip_weapon_name']."',char_equip_weapon_ident=".$user['char_equip_weapon_ident'].",char_damage_min=".$user['char_damage_min'].",char_damage_max=".$user['char_damage_max'].",char_gold=".$user['char_gold']); + Event::add(2, $user['char_name'], 1, $user['char_gender'], $item['item_name']); + break; + default: + $user['char_gold'] -= $item['item_price'] * $item_amount; + $this->add($item_ident, $item_amount); + User::update("char_gold=".$user['char_gold']); + break; + } + } + + public function pickup_equip_item() { + global $user, $tb_item, $connection; + $query = "SELECT * FROM ".$tb_item." WHERE item_ident=".$user['loot_slot_1']; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $item = $result->fetch_assoc(); + + if ($user['char_level'] < $item['item_level']) die('{"info":"Нужен уровень выше!"}'); + + $r = ''; + switch($item['item_type']) { + case self::CAT_ARMOR: + if ($item['item_ident'] > $user['char_equip_armor_ident']) { + $this->add($user['char_equip_armor_ident']); + $r .= 'Вы снимаете свой старый '.$user['char_equip_armor_name']; + $user['char_equip_armor_name'] = $item['item_name']; + $user['char_equip_armor_ident'] = $item['item_ident']; + $user['char_armor'] = $item['item_armor']; + User::update("char_equip_armor_name='".$user['char_equip_armor_name']."',char_equip_armor_ident=".$user['char_equip_armor_ident'].",char_armor=".$user['char_armor'].",loot_slot_1=0,loot_slot_1=''"); + $r .= ' и надеваете новый '.$user['char_equip_armor_name'].'.'; + Event::add(2, $user['char_name'], 1, $user['char_gender'], $item['item_name']); + } else { + $r = 'Вы забираете '.$item['item_name'].' себе.'; + $this->add($item['item_ident']); + } + break; + case self::CAT_WEAPON: + if ($item['item_ident'] > $user['char_equip_weapon_ident']) { + $this->add($user['char_equip_weapon_ident']); + $r .= 'Вы бросаете свой старый '.$user['char_equip_weapon_name']; + $user['char_equip_weapon_name'] = $item['item_name']; + $user['char_equip_weapon_ident'] = $item['item_ident']; + $user['char_damage_min'] = $item['item_damage_min']; + $user['char_damage_max'] = $item['item_damage_max']; + User::update("char_equip_weapon_name='".$user['char_equip_weapon_name']."',char_equip_weapon_ident=".$user['char_equip_weapon_ident'].",char_damage_min=".$user['char_damage_min'].",char_damage_max=".$user['char_damage_max'].",loot_slot_1=0,loot_slot_1=''"); + $r .= ' и берете в руки новый '.$user['char_equip_weapon_name'].'.'; + Event::add(2, $user['char_name'], 1, $user['char_gender'], $item['item_name']); + } else { + $r = 'Вы забираете '.$item['item_name'].' себе.'; + $this->add($item['item_ident']); + } + break; + default: + $r = 'Вы забираете '.$item['item_name'].' себе.'; + $this->add($item['item_ident']); + break; + } + return $r; + } + + private function amount($id) { + global $user; + $result = 0; + $items = json_decode($user['char_inventory'], true); + for($i = 0; $i < count($items); $i++) { + $item = $items[$i]; + $item_id = $item['id']; + if ($item_id == $id) { + $result = $item['count']; + break; + } + } + return $result; + } + + public function modify($id, $value) { + global $user; + $items = json_decode($user['char_inventory'], true); + for($i = 0; $i < count($items); $i++) { + $item = $items[$i]; + $item_id = $item['id']; + if ($item_id == $id) { + $count = $item['count']; + $count += $value; + if ($count <= 0) { + unset($items[$i]); + } else { + $items[$i]['count'] = $count; + } + $items = array_values($items); + $user['char_inventory'] = json_encode($items, JSON_UNESCAPED_UNICODE); + User::update("char_inventory='".$user['char_inventory']."'"); + break; + } + } + } + + public static function get_items() { + global $tb_item, $connection; + + $query = "SELECT * FROM ".$tb_item; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $items = $result->fetch_all(MYSQLI_ASSOC); + + return json_encode($items, JSON_UNESCAPED_UNICODE); + } + + } + +?> \ No newline at end of file diff --git a/worlds/lizardry/includes/class.location.php b/worlds/lizardry/includes/class.location.php new file mode 100644 index 0000000..4691012 --- /dev/null +++ b/worlds/lizardry/includes/class.location.php @@ -0,0 +1,386 @@ +go_to_the_gate('Идти к воротам в город'); + } + + public function go_to_the_town($t = 'Вернуться в город', $n = 0) { + Location::addlink($t, 'index.php?action=town', $n); + } + + public function go_to_the_graveyard($t = 'Идти на кладбище', $n = 0) { + Location::addlink($t, 'index.php?action=graveyard', $n); + } + + public function go_to_the_gate($t = 'Идти в сторону города', $n = 0) { + Location::addlink($t, 'index.php?action=gate', $n); + } + + public static function pickup_link() { + Location::addlink('Взять!', 'index.php?action=pickup_loot&lootslot=1', 1); + } + + public function check_travel_req($level, $food, $gold) { + global $user; + if ($user['char_life_cur'] <= 0) die('{"error":"Вам сначала нужно вернуться к жизни!"}'); + if ($user['char_level'] < $level) die('{"info":"Для путешествия в другой регион нужен '.$level.'-й уровень!"}'); + if ($user['char_food'] < $food) die('{"info":"Возьмите в дорогу не менее '.$food.'-х мешков провизии!"}'); + if ($user['char_gold'] < $gold) die('{"info":"Возьмите в дорогу не менее '.$gold.' золотых монет!"}'); + } + + public function travel_req($level, $food, $gold) { + return ' Но нужно выполнить определенные условия:#Уровень героя - не менее '.$level.'-го.#С собой иметь не менее '.$food.'-x пакетов с провиантом.#Стоимость путешествия - '.$gold.' золотых монет.'; + } + + public function get_region_town_name($region_ident) { + global $user, $tb_regions, $connection; + $query = "SELECT * FROM ".$tb_regions." WHERE region_ident=".$region_ident; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $region = $result->fetch_assoc(); + return $region['region_town_name']; + } + + public function change_region($region_ident, $food, $gold) { + global $user, $tb_regions, $connection; + $query = "SELECT * FROM ".$tb_regions." WHERE region_ident=".$region_ident; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $region = $result->fetch_assoc(); + $user['char_life_cur'] = $user['char_life_max']; + $user['char_mana_cur'] = $user['char_mana_max']; + $user['char_region'] = $region['region_ident']; + $user['char_region_level'] = $region['region_level']; + $user['char_region_town_name'] = $region['region_town_name']; + $user['char_gold'] -= $gold; + $user['char_food'] -= $food; + User::update("char_life_cur=".$user['char_life_cur'].",char_mana_cur=".$user['char_mana_cur'].",char_gold=".$user['char_gold'].",char_food=".$user['char_food'].",char_region=".$user['char_region'].",char_region_level=".$user['char_region_level'].",char_region_town_name='".$user['char_region_town_name']."'"); + } + + public static function get_location($location_ident) { + global $connection, $tb_locations; + $query = "SELECT * FROM ".$tb_locations." WHERE location_ident='".$location_ident."'"; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + return $result->fetch_assoc(); + } + + public function outland($location_ident, $enemies, $prev_location = [], $next_location = [], $is_boss = false) { + global $user, $res; + $user['current_outlands'] = $location_ident; + $this->add_enemies($enemies, $is_boss); + $location = self::get_location($location_ident); + $user['title'] = $location['location_name']; + $user['char_region_location_name'] = $location['location_name']; + User::update("char_region_location_name='".$user['char_region_location_name']."'"); + + if ($user['char_life_cur'] > 0) { + $user['description'] = $location['location_description']; + } else $this->shades(); + $user['frame'] = 'outlands'; + $user['links'] = array(); + $n = 0; + if ($user['char_life_cur'] > 0) { + if (count($prev_location) > 0) { + Location::addlink($prev_location[0], $prev_location[1], $n); + $n++; + } + if (count($prev_location) == 0) { + $this->go_to_the_gate(); + $n++; + } + if (count($next_location) > 0) { + Location::addlink($next_location[0], $next_location[1], $n); + $n++; + } + } else + $this->go_to_the_graveyard(); + + $res = json_encode($user, JSON_UNESCAPED_UNICODE); + + } + + public function travel_to($action, $do, $regions) { + global $user; + + $travel = false; + $travel_level = 1; + + for ($i = 0; $i < count($regions); $i++) { + if (($user['char_region'] == $regions[$i]) || ($user['char_region'] == $regions[$i] + 1)) { + $travel_level = $regions[$i] * 12; + $travel_food = 3; + } + + } + + $travel_gold = $this->travel_price($travel_level); + + for ($i = 0; $i < count($regions); $i++) { + if (($do == $regions[$i])||($do == $regions[$i] + 1)) { + $this->check_travel_req($travel_level, $travel_food, $travel_gold); + $travel = true; + $this->change_region($do, $travel_food, $travel_gold); + } + } + + if (!$travel) { + if ($action == 'stables') + $user['title'] = 'Конюшни'; + if ($action == 'harbor') + $user['title'] = 'Гавань'; + if ($action == 'dir_tower') + $user['title'] = 'Башня Дирижаблей'; + if ($action == 'fly') + $user['title'] = 'Утес Ветрокрылов'; + if ($action == 'portal') + $user['title'] = 'Магический Портал'; + if ($user['char_life_cur'] > 0) { + for ($i = 0; $i < count($regions); $i++) { + if (($user['char_region'] == $regions[$i])||($user['char_region'] == $regions[$i] + 1)) { + if ($action == 'stables') + $user['description'] = 'В городских конюшнях всегда можно найти караванщика, который за звонкую монету готов отвезти вас хоть на край света.'; + if ($action == 'harbor') + $user['description'] = 'В гавани не многолюдно, но все заняты работой. Здесь достаточно легко отыскать корабль, капитан которого согласится взять вас на борт.'; + if ($action == 'dir_tower') + $user['description'] = 'На вершине башни пришвартованы несколько дирижаблей и достаточно легко отыскать пилота готового отвезти вас в другой регион.'; + if ($action == 'fly') + $user['description'] = 'На Утесе всегда много свободных ветрокрылов и не так сложно отыскать погонщика, который согласится отвезти вас в другой город.'; + if ($action == 'portal') + $user['description'] = 'У Портала всегда можно отыскать мага, который за некоторое денежное вознаграждение согласится отправить вас в другой город.'; + $user['description'] .= $this->travel_req($travel_level, $travel_food, $travel_gold); + break; + } + } + + } else $this->shades(); + + $user['links'] = array(); + if ($user['char_life_cur'] > 0) { + + $this->go_to_the_gate(); + for ($i = 0; $i < count($regions); $i++) { + if ($user['char_region'] == $regions[$i]) { + $r = strval($regions[$i] + 1); + Location::addlink('Путешествие в '.$this->get_region_town_name($r), 'index.php?action='.$action.'&do='.$r.'', 1); + } + if ($user['char_region'] == $regions[$i] + 1) { + $r = strval($regions[$i]); + Location::addlink('Путешествие в '.$this->get_region_town_name($r), 'index.php?action='.$action.'&do='.$r.'', 1); + } + } + + } else $this->go_to_the_graveyard(); + + } else $this->after_travel(); + + $res = json_encode($user, JSON_UNESCAPED_UNICODE); + + return $res; + } + + public function travel_price($level) { + return $level * 10; + } + + public static function get_title_and_description($location_ident) { + global $user; + $location = Location::get_location($location_ident); + $user['title'] = $location['location_name']; + $user['description'] = $location['location_description']; + } + + public function random_place() { + global $user; + + $user['links'] = array(); + Location::addlink('Назад', 'index.php?action='.$user['current_outlands']); + $frame = 'battle'; + + switch ($user['current_random_place']) { + case 1: + $user['title'] = 'Лагерь старого алхимика'; + $user['description'] = 'Вы проходите несколько десятков шагов и останавливаетесь у старого вагончика. Недалеко пасется пони, горит костер. У костра сидит старый гном и приветливо машет вам рукой:#-Приветствую, путник!Будь гостем в моем лагере. Я вижу ты ранен - вот возьми эликсир...#Старик протягивает вам эликсир и вы, залпом выпив содержимое флакончика, чувствуете, как уходит усталость и заживляются раны.#-Садись рядом, угощайся и расскажи, что с тобой произошло.#Вы присаживаетесь у костра, достаете и свои припасы и начинаете рассказ...'; + $user['class']['player']->rest(); + User::update("char_life_cur=".$user['char_life_cur'].",char_mana_cur=".$user['char_mana_cur']); + break; + case 2: + $user['title'] = 'Камнепад!!!'; + $user['description'] = 'Вы проходите несколько десятков шагов и внезапно слышите странный гул. Обвал! - краем сознания вдруг осознаете вы и бросаетесь в сторону...'; + $dam = rand($user['char_region_level'] * 3, $user['char_region_level'] * 5); + $user['char_life_cur'] -= $dam; + if ($user['char_life_cur'] > 0) { + $user['description'] .= ' Грохочущая лавина камней проносится совсем рядом, лишь слегка зацепив вас. Вам чудом удалось избежать смерти!'; + } else { + $user['char_life_cur'] = 0; + $user['description'] .= ' Но уже слишком поздно и вы оказываетесь на пути гремящей каменной массы. Вы погибли!'; + } + User::update("char_life_cur=".$user['char_life_cur']); + break; + case 3: + $user['title'] = 'Невидимый вор!'; + $user['description'] = 'Вы прошли всего несколько десятков шагов, когда заметили какое-то движение. Вор! Вы хватились кошелька на поясе и с сожалением обнаружили, что вас ограбили.'; + $gold = rand($user['char_region_level'] * 30, $user['char_region_level'] * 70); + if ($user['char_gold'] > $gold) { + $user['char_gold'] -= $gold; + $user['description'] .= ' Вору удалось украсть у вас '.$gold.' золотых монет.'; + } else { + $user['char_gold'] = 0; + $user['description'] .= ' Вор украл у вас все золото.'; + } + User::update("char_gold=".$user['char_gold']); + break; + case 4: + $user['class']['item']->gen_alch_loot(); + $user['title'] = 'Сундук алхимика!'; + $user['description'] = 'Пройдя всего несколько десятков шагов, вы внезапно наткнулись на старый сундук. Путем нехитрых манипуляций с замком вы открываете сундук и видите, что в нем лежит '.$user['loot_slot_1_name'].'.'; + $frame = 'get_loot'; + Location::pickup_link(); + break; + case 5: + $user['class']['item']->gen_mage_loot(); + $user['title'] = 'Сундук мага!'; + $user['description'] = 'Недалеко от места сражения вы внезапно увидели старый сундук. Замок на нем настолько стар, что легко рассыпается в пыль от одного прикосновения. Вы открываете сундук и видите, что в нем лежит '.$user['loot_slot_1_name'].'.'; + $frame = 'get_loot'; + Location::pickup_link(); + break; + case 6: + $user['class']['item']->gen_herb_loot(); + $user['title'] = 'Сумка травника!'; + $user['description'] = 'Решив присесть отдохнуть после тяжелого боя, вы внезапно замечаете на земле небольшую серую сумку, какую обычно используют алхимики для сбора трав и алхимических ингридиентов. Вы открываете сумку и видите, что в ней находится '.$user['loot_slot_1_name'].'.'; + $frame = 'get_loot'; + Location::pickup_link(); + break; + case 7: + $gold = rand($user['char_region_level'] * 50, $user['char_region_level'] * 90); + $user['title'] = 'Сундук с золотом!'; + $user['description'] = 'Вы оглядываете местность после битвы и вдалеке замечаете небольшой сундучок. Подойдя поближе вы видите, что на судучке изображен имперский герб. Кто-то очень важный обронил его здесь. Замок на сундучке выглядит не слишком сложным и после пяти минут сопротивления поддается. Вы открываете сундук и видите, что в нем находится '.strval($gold).' золотых монет. Вы забираете все золото себе.'; + User::update("char_gold=".$user['char_gold']); + break; + } + return $frame; + } + + public function gen_random_place() { + global $user, $connection; + + $user['current_random_place'] = 0; + if (rand(1, 5) == 1) + $user['current_random_place'] = rand(1, self::RAND_PLACE_COUNT); + + User::update("current_random_place=".$user['current_random_place']); + } + + public function rest_in_tavern_cost() { + global $user; + return round($user['char_region_level'] * 10) + round(($user['char_region_level'] * 10) / 2); + } + + public function food_in_tavern_cost() { + global $user; + return $user['char_region_level'] * 10; + } + + private function add_enemies($enemy_idents, $is_boss = false) { + global $user; + for($i = 1; $i <= 3; $i++) { + $r = $enemy_idents[array_rand($enemy_idents)]; + if ($is_boss == true) { + if ($i == 1) + $r = $enemy_idents[array_rand($enemy_idents)]; + else + $r = Enemy::EMPTY_ID; + if (Boss::is_killed($user['char_region'])) + $r = Enemy::EMPTY_ID; + } + $e = 0; + if (rand(1, 20) == 1) + $e = rand(1, 10); + if ($r == Enemy::EMPTY_ID) + $e = 0; + Enemy::add($i, $r, $e); + } + } + + public function get_tavern_name() { + global $user, $tb_regions, $connection; + $query = "SELECT * FROM ".$tb_regions." WHERE region_ident=".$user['char_region']; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $region = $result->fetch_assoc(); + return $region['region_tavern_name']; + } + + public function get_graveyard_description() { + global $user, $tb_regions, $connection; + $query = "SELECT region_graveyard_description FROM ".$tb_regions." WHERE region_ident=".$user['char_region']; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $region = $result->fetch_assoc(); + return $region['region_graveyard_description']; + } + + public function get_town_description() { + global $user, $tb_regions, $connection; + $query = "SELECT region_town_description FROM ".$tb_regions." WHERE region_ident=".$user['char_region']; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $region = $result->fetch_assoc(); + return $region['region_town_description']; + } + + public function get_welcome_phrase($category_ident, $flag = true) { + global $connection, $tb_phrases; + $v = ($flag)?" OR category=0":""; + $query = "SELECT text FROM ".$tb_phrases." WHERE category=".$category_ident.$v." ORDER BY RAND() LIMIT 1"; + $result = mysqli_query($connection, $query) + or die('{"error":"Ошибка считывания данных: '.mysqli_error($connection).'"}'); + $phrase = $result->fetch_assoc(); + return $phrase['text']; + } + + public static function get_race_start_location($charrace) { + switch($charrace) { + case Player::RACE_ELF: + return self::REGION_EYRINOR; + break; + default: + return self::REGION_VILMAR; + break; + } + } + + } + +?> \ No newline at end of file diff --git a/worlds/lizardry/includes/class.magic.php b/worlds/lizardry/includes/class.magic.php new file mode 100644 index 0000000..89fa598 --- /dev/null +++ b/worlds/lizardry/includes/class.magic.php @@ -0,0 +1,61 @@ += $mana) { + $user['class']['item']->modify($item_ident, -1); + $user['char_mana_cur'] -= $mana; + $user['char_effect'] = $effect; + User::update("char_effect=".$user['char_effect']); + $result = ',"char_effect":"'.$user['char_effect'].'","char_mana_cur":"'.$user['char_mana_cur'].'","char_mana_max":"'.$user['char_mana_max'].'"'; + return $result; + } else $this->need_mana($mana); + } + + public function use_scroll_tp($item_ident) { + global $user; + $mana = self::MANA_SCROLL_TP; + if ($user['char_mana_cur'] >= $mana) { + $user['class']['item']->modify($item_ident, -1); + $user['char_mana_cur'] -= $mana; + User::update("char_mana_cur=".$user['char_mana_cur']); + $result = ',"action":"Перед вами открывается магический портал!|Войти!|index.php?action=magictower","char_mana_cur":"'.$user['char_mana_cur'].'","char_mana_max":"'.$user['char_mana_max'].'"'; + return $result; + } else $this->need_mana($mana); + } + + public function use_scroll_heal($item_ident) { + global $user; + $mana = self::MANA_SCROLL_HEAL; + if ($user['char_mana_cur'] >= $mana) { + $user['class']['item']->modify($item_ident, -1); + $user['char_mana_cur'] -= $mana; + $user['class']['player']->heal(); + User::update("char_life_cur=".$user['char_life_cur'].",char_mana_cur=".$user['char_mana_cur']); + $result = ',"char_life_cur":"'.$user['char_life_cur'].'","char_life_max":"'.$user['char_life_max'].'","char_mana_cur":"'.$user['char_mana_cur'].'","char_mana_max":"'.$user['char_mana_max'].'"'; + return $result; + } else $this->need_mana($mana); + } + + } + +?> \ No newline at end of file diff --git a/worlds/lizardry/includes/class.player.php b/worlds/lizardry/includes/class.player.php new file mode 100644 index 0000000..8022968 --- /dev/null +++ b/worlds/lizardry/includes/class.player.php @@ -0,0 +1,37 @@ +heal(); + $user['char_mana_cur'] += rand(2, 3); + if ($user['char_mana_cur'] > $user['char_mana_max']) + $user['char_mana_cur'] = $user['char_mana_max']; + } + + } + +?> \ No newline at end of file diff --git a/worlds/lizardry/includes/class.server.php b/worlds/lizardry/includes/class.server.php new file mode 100644 index 0000000..9364d71 --- /dev/null +++ b/worlds/lizardry/includes/class.server.php @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/worlds/lizardry/includes/class.user.php b/worlds/lizardry/includes/class.user.php new file mode 100644 index 0000000..da0c7b3 --- /dev/null +++ b/worlds/lizardry/includes/class.user.php @@ -0,0 +1,72 @@ +fetch_assoc(); + } + + public static function session() { + global $user; + $user['user_session'] = time(); + User::update("user_session='".$user['user_session']."'"); + return $user['user_session']; + } + + public static function check_user($user_name) { + global $connection, $tb_user; + $query = "SELECT user_name FROM ".$tb_user." WHERE user_name='".$user_name."'"; + $user = mysqli_query($connection, $query) or die('{"error":"Ошибка сохранения данных: '.mysqli_error($connection).'"}'); + if(mysqli_num_rows($user) > 0) { + return true; + } else { + return false; + } + } + + public static function check_char($char_name) { + global $user; + if (strtolower($user['char_name']) == strtolower($char_name)) { + return true; + } else { + return false; + } + } + + public static function update($s) { + global $user, $tb_user, $connection; + $query = "UPDATE ".$tb_user." SET ".$s." WHERE user_name='".$user['user_name']."'"; + if (!mysqli_query($connection, $query)) { + die('{"error":"Ошибка сохранения данных: '.mysqli_error($connection).'"}'); + } + } + + public static function check_login_data($username, $userpass) { + if ($username == '') die('{"error":"Введите имя учетной записи!"}'); + if (strlen($username) < 4) die('{"error":"Имя учетной записи не должно быть короче 4 символов!"}'); + if (strlen($username) > 24) die('{"error":"Имя учетной записи должно быть длиннее 24 символов!"}'); + if ($userpass == '') die('{"error":"Введите пароль!"}'); + if (strlen($userpass) < 4) die('{"error":"Пароль не должен быть короче 4 символов!"}'); + if (strlen($userpass) > 24) die('{"error":"Пароль не должен быть длиннее 24 символов!"}'); + } + + public static function check_registration_data($username, $userpass, $charname) { + if ($username == '') die('{"error":"Введите имя учетной записи!"}'); + if (strlen($username) < 4) die('{"error":"Имя учетной записи не должно быть короче 4 символов!"}'); + if (strlen($username) > 24) die('{"error":"Имя учетной записи должно быть длиннее 24 символов!"}'); + if ($userpass == '') die('{"error":"Введите пароль!"}'); + if (strlen($userpass) < 4) die('{"error":"Пароль не должен быть короче 4 символов!"}'); + if (strlen($userpass) > 24) die('{"error":"Пароль не должен быть длиннее 24 символов!"}'); + if ($charname == '') die('{"error":"Введите имя персонажа!"}'); + if (strlen($charname) < 4) die('{"error":"Имя персонажа не должно быть короче 4 символов!"}'); + if (strlen($charname) > 24) die('{"error":"Имя персонажа не должно быть длиннее 24 символов!"}'); + } + + } + +?> \ No newline at end of file diff --git a/worlds/lizardry/locations/outlands.php b/worlds/lizardry/locations/outlands.php index ffe71cb..e3db8fb 100644 --- a/worlds/lizardry/locations/outlands.php +++ b/worlds/lizardry/locations/outlands.php @@ -58,5 +58,10 @@ if ($action == '+') $user['class']['location']->outland($action, [122,123,124]); if ($action == '+') $user['class']['location']->outland($action, [125,126,127]); if ($action == '+') $user['class']['location']->outland($action, [128,129,130]); +// #11 +if ($action == '+') $user['class']['location']->outland($action, [131,132,133,134]); +if ($action == '+') $user['class']['location']->outland($action, [135,136,137]); +if ($action == '+') $user['class']['location']->outland($action, [138,139,140]); +if ($action == '+') $user['class']['location']->outland($action, [141,142,143]); ?> \ No newline at end of file diff --git a/worlds/lizardry/registration/registration.php b/worlds/lizardry/registration/registration.php index 992a35b..c281794 100644 --- a/worlds/lizardry/registration/registration.php +++ b/worlds/lizardry/registration/registration.php @@ -6,6 +6,8 @@ require_once('../common/dbtables.php'); require_once('../'.IPATH.'class.event.php'); require_once('../'.IPATH.'class.user.php'); +require_once('../'.IPATH.'class.player.php'); +require_once('../'.IPATH.'class.location.php'); $action = $_GET['action']; $username = $_GET['username']; @@ -25,7 +27,7 @@ if (User::check_user($username) == true) { $res = '{"error":"Пользователь с таким именем существует!"}'; } else{ - $query = "INSERT INTO ".$tb_user." (user_name, user_pass, char_name, char_gender, char_race) VALUES ('".$username."', '".$userpass."', '".$charname."', ".$chargender.", ".$charrace.")"; + $query = "INSERT INTO ".$tb_user." (user_name, user_pass, char_name, char_gender, char_race, char_region) VALUES ('".$username."', '".$userpass."', '".$charname."', ".$chargender.", ".$charrace.", ".Location::get_race_start_location($charrace).")"; if (mysqli_query($connection, $query)) { Event::add(0, $charname, 1, $chargender); $res = '{"registration":"ok"}';