function adr_battle_make_def($ac, $dex) { $ac = intval($ac); $dex = intval($dex); // Make calculation $def = ceil($ac + $ac * 0.5 + adr_modifier_calc($dex)); return $def; }
/** * @method POST * @api opponent_turn */ public function opponent_turn() { $bat = $this->getBattleList(); if ($bat == false) { return $this->response(array('status' => 0, 'message' => 'There is no active battle!')); } $adr_general = ADR::getGeneralConfig(); $characters = new Character(); $challenger = $characters->getCharacterByID($_POST['character_id']); $monsters = new Monsters(); $monster = $monsters->getMonsterByID($bat['battle_opponent_id']); $monster_name = adr_get_lang($monster['monster_name']); $character_name = $challenger['character_name']; $monster['monster_crit_hit_mod'] = 2; $monster['monster_crit_hit'] = 20; $monster['monster_int'] = 10 + rand(1, $monster['monster_level']) * 2; //temp calc $monster['monster_str'] = 10 + rand(1, $monster['monster_level']) * 2; //temp calc $user_ma = $bat['battle_challenger_magic_attack']; $user_md = $bat['battle_challenger_magic_resistance']; $monster_ma = $bat['battle_opponent_magic_attack']; $monster_md = $bat['battle_opponent_magic_resistance']; $challenger_element = $challenger['character_element']; $opponent_element = $monster['monster_base_element']; $battle_round = $bat['battle_round']; $battle_message = array(); $def = false; if ($def != TRUE) { $power = ceil($monster['monster_level'] * rand(1, 3)); } else { $power = floor($monster['monster_level'] * rand(1, 3) / 2); } // Has the monster the ability to steal from user? $thief_chance = 0; //NEED ITEMS $thief_chance = rand(1,20); if ($adr_general['thief_enable'] == '1' && $thief_chance == '20') { /*$sql = "SELECT item_id, item_name FROM " . ADR_SHOPS_ITEMS_TABLE . " WHERE item_monster_thief = '0' AND item_in_warehouse = '0' AND item_in_shop = '0' AND item_duration > '0' AND item_owner_id = '$user_id' AND item_id NOT IN ($helm_equip, $armour_equip, $gloves_equip, $buckler_equip, $amulet_equip, $ring_equip) ORDER BY rand() LIMIT 1"; if(!($result = $db->sql_query($sql))){ message_die(GENERAL_ERROR, 'Could not query items for monster item steal', '', __LINE__, __FILE__, $sql);} $item_to_steal = $db->sql_fetchrow($result); // Rand to check type of thief attack $success_chance = rand(1,20); $rand = rand(1,20); ##=== START: steal item checks $challenger_item_spot_check = (20 + adr_modifier_calc($challenger['character_skill_thief'])); $monster_item_attempt = (((($rand + adr_modifier_calc($monster['monster_thief_skill'])) > $challenger_item_spot_check) && ($rand != '1')) || ($rand == '20')) ? TRUE : FALSE; ##=== END: steal item checks ##=== START: steal points checks $challenger_points_spot_check = (10 + adr_modifier_calc($challenger['character_skill_thief'])); $monster_points_attempt = (((($rand + $monster['monster_thief_skill']) > $challenger_points_spot_check) && ($rand != '1')) || ($rand == '20')) ? TRUE : FALSE; ##=== END: steal points checks if(($success_chance == '20') && ($monster_item_attempt == TRUE) && ($item_to_steal['item_name'] != '')){ $damage = 0; // Mark the item as stolen $sql = "UPDATE " . ADR_SHOPS_ITEMS_TABLE . " SET item_monster_thief = 1 WHERE item_owner_id = '$user_id' AND item_id = '" . $item_to_steal['item_id'] . "'"; if(!($result = $db->sql_query($sql))){ message_die(GENERAL_ERROR, 'Could not update stolen item by monster', '', __LINE__, __FILE__, $sql);} array_push($battle_message, sprintf(ADR::Lang('Adr_battle_opponent_thief_success'), $monster_name, adr_get_lang($item_to_steal['item_name']), $character_name)); } elseif(($success_chance >= '15') && ($success_chance != '20') && ($user_points > '0') && ($monster_points_attempt == TRUE)){ $damage = 0; $points_stolen = floor(($user_points / 100) *$adr_general['thief_points']); subtract_reward($user_id, $points_stolen); array_push($battle_message, sprintf(ADR::Lang('Adr_battle_opponent_thief_points'), $monster_name, $points_stolen, get_reward_name(), $character_name)); } else{ $damage = 0; array_push($battle_message, sprintf(ADR::Lang('Adr_battle_opponent_thief_failure'), $monster_name, adr_get_lang($item_to_steal['item_name']), $character_name)); }*/ } else { $attack_type = rand(1, 20); ##=== START: Critical hit code $threat_range = $monster['monster_crit_hit']; // list($crit_result, $power) = explode('-', adr_battle_make_crit_roll($bat['battle_opponent_att'], $monster['monster_level'], $bat['battle_challenger_def'], 0, $power, 0, $threat_range, 0)); ##=== END: Critical hit code if ($bat['battle_opponent_mp'] > '0' && $bat['battle_opponent_mp'] >= $bat['battle_opponent_mp_power'] && $attack_type > '16') { $damage = 1; $power = ceil($power + adr_modifier_calc($bat['battle_opponent_mp_power'])); $elements = new Elements(); $monster_elemental = $elements->getElementByID($opponent_element); // Sort out magic check & opponents saving throw $dice = rand(1, 20); $magic_check = ceil($dice + $bat['battle_opponent_mp_power'] + adr_modifier_calc($monster['monster_int'])); $fort_save = 11 + adr_modifier_calc($challenger['character_wisdom']); $success = $magic_check >= $fort_save && $dice != '1' || $dice >= $threat_range ? TRUE : FALSE; if ($success === TRUE) { // Prefix msg if crit hit if ($dice >= $threat_range) { array_push($battle_message, ADR::Lang('Adr_battle_critical_hit')); } // Work out attack type if ($challenger_element === $monster_elemental['element_oppose_weak']) { $damage = ceil($power * ($monster_elemental['element_oppose_strong_dmg'] / 100)); } elseif ($challenger_element === $opponent_element) { $damage = ceil($power * ($monster_elemental['element_oppose_same_dmg'] / 100)); } elseif ($challenger_element === $monster_elemental['element_oppose_strong']) { $damage = ceil($power * ($monster_elemental['element_oppose_weak_dmg'] / 100)); } else { $damage = ceil($power); } // Fix dmg value $damage = $damage < '1' ? rand(1, 3) : $damage; $damage = $dice >= $threat_range ? $damage * $monster['monster_crit_hit_mod'] : $damage; $damage = $damage > $challenger['character_hp'] ? $challenger['character_hp'] : $damage; // Fix attack msg type if ($monster['monster_base_custom_spell'] != '') { array_push($battle_message, sprintf(ADR::Lang('Adr_battle_opponent_spell_success'), $monster_name, $monster['monster_base_custom_spell'], $character_name, $damage)); } else { array_push($battle_message, sprintf(ADR::Lang('Adr_battle_opponent_spell_success2'), $monster_name, $character_name, $damage)); } } else { $damage = 0; array_push($battle_message, sprintf(ADR::Lang('Adr_battle_opponent_spell_failure'), $monster_name, $character_name)); } // Remove monster MP $opponent_mp_remaining = $bat['battle_opponent_mp'] - $bat['battle_opponent_mp_power']; $this->updateBattleList(array('battle_opponent_mp' => $opponent_mp_remaining)); } else { // Let's check if the attack succeeds $dice = rand(1, 20); $success = $bat['battle_opponent_att'] + $dice >= $bat['battle_challenger_def'] + adr_modifier_calc($challenger['character_dexterity']) && $dice != '1' || $dice >= $threat_range ? TRUE : FALSE; $power = ceil($power / 2 + adr_modifier_calc($monster['monster_str'])); $damage = 1; if ($success == TRUE) { // Attack success , calculate the damage . Critical dice roll is still success $damage = $power < '1' ? rand(1, 3) : $power; $damage = $dice >= $threat_range ? ceil($damage * $monster['monster_crit_hit_mod']) : ceil($damage); $damage = $damage > $challenger['character_hp'] ? $challenger['character_hp'] : $damage; if ($dice >= $threat_range) { array_push($battle_message, ADR::Lang('Adr_battle_critical_hit')); } array_push($battle_message, sprintf(ADR::Lang('Adr_battle_opponent_attack_success'), $monster_name, $character_name, $damage)); } else { $damage = 0; array_push($battle_message, sprintf(ADR::Lang('Adr_battle_opponent_attack_failure'), $monster_name, $character_name)); } } $bat['battle_opponent_dmg'] = $damage; // Prevent instant kills at start of battle $challenger_hp = $challenger['character_hp'] - $damage; if ($bat['battle_round'] == 0 && $challenger_hp < 1) { $challenger_hp = 1; } $db = DB::instance(); $db->update('adr_characters', array('character_hp' => $challenger_hp), array('character_id' => $bat['battle_challenger_id'])); if ($challenger_hp <= 0) { $return = $this->lose($bat, $monster, $challenger); $return['message'] = array_merge($battle_message, $return['message']); return $this->response($return); } else { return $this->response(array('status' => 1, 'message' => $battle_message, 'damage' => $damage, 'challenger_hp' => $challenger_hp)); } } }
function adr_attack_bare() { global $monster, $bat, $adr_user, $opponent_element, $item, $db, $lang, $user_id, $power, $crit_result; global $challenger, $battle_message, $user_action, $monster_action, $attack_img, $attackwith_overlay; global $damage, $dice; $monster_def_dice = rand(1, 10); $monster_modifier = rand(1, 10); // this is temp. until proper monster characteristics are added to ADR // V: temporary modified to 10 -- see below $bare_dice = rand(1, 20); // Grab modifers $bare_power = adr_modifier_calc($challenger['character_might']); // weaprof (yes, even for bare hand) $attbonus = adr_weapon_skill_check($user_id); if ($bare_dice + $bare_power > $monster_def_dice + $monster_modifier && $bare_dice != '1' || $bare_dice == '20') { rabbit_pet_regen(); adr_use_hp_amulet(); adr_use_mp_ring(); // Attack success , calculate the damage . Critical dice roll is still success $damage = $bare_dice == '20' && $crit_roll == '20' ? $bare_power * 2 : $bare_power; // weap prof $damage = ceil($damage * $attbonus); // V: sigh. $damage = $damage < 1 ? 1 : $damage; $damage = $damage > $bat['battle_opponent_hp'] ? $bat['battle_opponent_hp'] : $damage; $battle_message .= $crit_result ? $lang['Adr_battle_critical_hit'] . "<br>" : ''; $battle_message .= sprintf($lang['Adr_battle_attack_bare'], $challenger['character_name'], floor($attbonus), $damage, $monster['monster_name']) . "<br>"; } else { $battle_message .= sprintf($lang['Adr_battle_attack_bare_fail'], $challenger['character_name'], $monster['monster_name']) . "<br>"; } }
$item['item_name'] = '<font color="' . $element_name['element_colour'] . '">' . adr_get_lang($item['item_name']) . '</font>'; } else { $item['item_name'] = adr_get_lang($item['item_name']); } ##=== START: Critical hit code $threat_range = $item['item_type_use'] == '6' ? '19' : '20'; // magic weaps get slightly better threat range $crit_result = adr_battle_make_crit_roll($current_att, $current_infos['character_level'], $opponent_def, $item['item_type_use'], $power, $quality, $threat_range); ##=== END: Critical hit code // Bare hands strike! if ($item['item_name'] == '') { // Opponent roll $opponent_def_dice = rand(1, 20); // Grab modifers $str_modifier = 1 + adr_modifier_calc($current_str); $dex_modifier = 1 + adr_modifier_calc($opponent_dex); if ($dice + $str_modifier >= $opponent_def_dice + $dex_modifier && $dice > '1' || $dice == '20') { // Attack success, calculate the damage. Critical dice roll is still success $damage = rand(1, 3); $damage = $damage > $opponent_hp ? $opponent_hp : $damage; $battle_message .= sprintf($lang['Adr_pvp_attack_bare_success'], $current_name, $opponent_name, $damage) . '<br />'; } else { $damage = 0; $battle_message .= sprintf($lang['Adr_pvp_attack_bare_fail'], $current_name, $opponent_name) . '<br />'; } } else { if ($diff == TRUE && $dice != '1' || $dice >= $threat_range) { // Prefix msg if crit hit $battle_message .= $crit_result === TRUE ? '<br>' . $lang['Adr_battle_critical_hit'] . '</b><br />' : ''; $damage = 0; // Work out attack type
function adr_battle_equip_initialise($user_id, $armor, $buckler, $helm, $gloves, $amulet, $ring) { global $db, $lang, $adr_general, $template, $board_config; $user_id = intval($user_id); $armor = intval($armor); $buckler = intval($buckler); $helm = intval($helm); $gloves = intval($gloves); $amulet = intval($amulet); $ring = intval($ring); // Get the user infos $char = adr_get_user_infos($user_id); ### START restriction checks ### $item_sql = adr_make_restrict_sql($char); ### END restriction checks ### // Be sure he has a character if (!is_numeric($char['character_id'])) { adr_previous(Adr_your_character_lack, adr_character, ''); } // Calculate the base stats $hp = 0; $mp = 0; $level = $char['character_level']; $char_element = $char['character_element']; $char_mp = $char['character_mp']; // Create base attack & defence stats $att = adr_battle_make_att($char['character_might'], $char['character_constitution']); $ma = adr_battle_make_magic_att($char['character_intelligence']); $def = adr_battle_make_def($char['character_ac'], $char['character_dexterity']); $md = adr_battle_make_magic_def($char['character_wisdom']); if ($armor) { $sql = "SELECT * FROM " . ADR_SHOPS_ITEMS_TABLE . "\n\t\t\tWHERE item_in_shop = '0'\n\t\t\tAND item_owner_id = '{$user_id}'\n\t\t\tAND item_in_warehouse = '0'\n\t\t\t{$item_sql}\n\t\t\tAND item_id = '{$armor}'"; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query battle list', '', __LINE__, __FILE__, $sql); } $item = $db->sql_fetchrow($result); $armor_id = $item['item_id']; $def = $def + ($item['item_power'] + $item['item_add_power']); adr_use_item($armor, $user_id); } if ($buckler) { $sql = "SELECT * FROM " . ADR_SHOPS_ITEMS_TABLE . "\n\t\t\tWHERE item_in_shop = '0'\n\t\t\tAND item_owner_id = '{$user_id}'\n\t\t\tAND item_in_warehouse = '0'\n\t\t\t{$item_sql}\n\t\t\tAND item_id = '{$buckler}'"; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query battle list', '', __LINE__, __FILE__, $sql); } $item = $db->sql_fetchrow($result); $buckler_id = $item['item_id']; $def = $def + ($item['item_power'] + $item['item_add_power']); adr_use_item($buckler, $user_id); } if ($gloves) { $sql = "SELECT * FROM " . ADR_SHOPS_ITEMS_TABLE . "\n\t\t\tWHERE item_in_shop = '0'\n\t\t\tAND item_owner_id = '{$user_id}'\n\t\t\tAND item_in_warehouse = '0'\n\t\t\t{$item_sql}\n\t\t\tAND item_id = '{$gloves}'"; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query battle list', '', __LINE__, __FILE__, $sql); } $item = $db->sql_fetchrow($result); $gloves_id = $item['item_id']; $def = $def + ($item['item_power'] + $item['item_add_power']); adr_use_item($gloves, $user_id); } if ($helm) { $sql = "SELECT * FROM " . ADR_SHOPS_ITEMS_TABLE . "\n\t\t\tWHERE item_in_shop = '0'\n\t\t\tAND item_owner_id = '{$user_id}'\n\t\t\tAND item_in_warehouse = '0'\n\t\t\t{$item_sql}\n\t\t\tAND item_id = '{$helm}'"; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query battle list', '', __LINE__, __FILE__, $sql); } $item = $db->sql_fetchrow($result); $helm_id = $item['item_id']; $def = $def + ($item['item_power'] + $item['item_add_power']); adr_use_item($helm, $user_id); } // Now we modify mp and hp regeneration with amulets and rings if ($amulet) { $sql = " SELECT * FROM " . ADR_SHOPS_ITEMS_TABLE . "\n\t\t\tWHERE item_in_shop = '0'\n\t\t\tAND item_owner_id = '{$user_id}'\n\t\t\tAND item_in_warehouse = '0'\n\t\t\t{$item_sql}\n\t\t\tAND item_id = '{$amulet}'"; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query battle list', '', __LINE__, __FILE__, $sql); } $item = $db->sql_fetchrow($result); $amulet_id = $item['item_id']; $hp = $hp + $item['item_power']; adr_use_item($amulet, $user_id); } if ($ring) { $sql = "SELECT * FROM " . ADR_SHOPS_ITEMS_TABLE . "\n\t\t\tWHERE item_in_shop = '0'\n\t\t\tAND item_owner_id = '{$user_id}'\n\t\t\tAND item_in_warehouse = '0'\n\t\t\t{$item_sql}\n\t\t\tAND item_id = '{$ring}'"; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query battle list', '', __LINE__, __FILE__, $sql); } $item = $db->sql_fetchrow($result); $ring_id = $item['item_id']; $mp = $mp + $item['item_power']; adr_use_item($ring, $user_id); } ##=== START: new monster rand selection code as posted by Sederien ===## // Let's care about the opponent now $sql = " SELECT * FROM " . ADR_BATTLE_MONSTERS_TABLE . "\n\t\tWHERE monster_level <= '{$level}'\n\t\tORDER BY RAND() LIMIT 1"; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query monsters list', '', __LINE__, __FILE__, $sql); } $monsters = $db->sql_fetchrow($result); // Be sure monsters of the user level exists if (!$monsters) { adr_previous(Adr_no_monsters, adr_character, ''); } // Get this monster base stats $monster_id = $monsters['monster_id']; $monster_level = $monsters['monster_level']; $monster_base_hp = $monsters['monster_base_hp']; $monster_base_att = $monsters['monster_base_att']; $monster_base_def = $monsters['monster_base_def']; $monster_base_element = $monsters['monster_base_element']; $monster_base_mp = $monsters['monster_base_mp']; $monster_base_mp_power = $monsters['monster_base_mp_power']; $monster_base_ma = $monsters['monster_base_magic_attack']; $monster_base_md = $monsters['monster_base_magic_resistance']; $monster_base_sp = $monsters['monster_base_sp']; ##=== END: new monster selection code by Sederien ===## // If the user is higher level than the monster , update the monster stats if ($monster_level < $level) { if ($adr_general['battle_calc_type']) { // Xanathis's alternative battle modifier calculation for monster battles $modifier = ($adr_general['battle_monster_stats_modifier'] - 100) / 100 * ($level - $monster_level) + 1; } else { $modifier = $adr_general['battle_monster_stats_modifier'] / 100 * ($level - $monster_level); } $monster_base_hp = ceil($monster_base_hp * $modifier); $monster_base_att = ceil($monster_base_att * $modifier); $monster_base_def = ceil($monster_base_def * $modifier); $monster_base_mp = ceil($monster_base_mp * $modifier); $monster_base_ma = ceil($monster_base_ma * $modifier); $monster_base_md = ceil($monster_base_md * $modifier); $monster_base_sp = ceil($monster_base_sp * $modifier); } ##=== START array for equipment id's ## $equip_array = intval($helm_id) . '-' . intval($armor_id) . '-' . intval($gloves_id) . '-' . intval($buckler_id) . '-' . intval($amulet_id) . '-' . intval($ring_id) . '-' . intval($hp) . '-' . intval($mp); ##=== END array for equipment id's ## ##=== START: Initiative Checks // 1d20 roll. Highest starts. $monster_dex = 10 + rand(1, $monster_level) * 2; //temp $challenger_init_check = rand(1, 20) + adr_modifier_calc($char['character_dexterity']); $monster_init_check = rand(1, 20) + adr_modifier_calc($monster_dex); // Check who will start ELSE do a rand to determine. if ($challenger_init_check >= $monster_init_check) { $turn = 1; } else { $turn = 2; } ##=== END: Initiative Checks // Finally insert all theses values into the database $sql = "INSERT INTO " . ADR_BATTLE_LIST_TABLE . "\n\t\t(battle_type, battle_start, battle_turn, battle_result, battle_text, battle_challenger_id, battle_challenger_hp, battle_challenger_mp, battle_challenger_att, battle_challenger_def, battle_challenger_element, battle_challenger_magic_attack, battle_challenger_magic_resistance, battle_challenger_equipment_info, battle_opponent_id, battle_opponent_hp, battle_opponent_hp_max, battle_opponent_mp, battle_opponent_mp_max, battle_opponent_mp_power, battle_opponent_att, battle_opponent_def, battle_opponent_element, battle_opponent_magic_attack, battle_opponent_magic_resistance, battle_opponent_sp)\n\t\tVALUES(1, " . time() . ", {$turn}, 0, '', {$user_id}, {$hp}, {$mp}, {$att}, {$def}, {$char_element}, {$ma}, {$md}, '{$equip_array}', {$monster_id}, {$monster_base_hp}, {$monster_base_hp}, {$monster_base_mp}, {$monster_base_mp}, {$monster_base_mp_power}, {$monster_base_att}, {$monster_base_def}, {$monster_base_element}, {$monster_base_ma}, {$monster_base_md}, {$monster_base_sp})"; $result = $db->sql_query($sql); if (!$result) { message_die(GENERAL_ERROR, "Couldn't insert new battle", "", __LINE__, __FILE__, $sql); } return; }
function adr_battle_equip_initialise($user_id, $armor, $buckler, $helm, $gloves, $amulet, $ring, $greave, $boot) { global $db, $lang, $adr_general, $template, $board_config, $phpEx; $user_id = intval($user_id); $armor = intval($armor); $buckler = intval($buckler); $helm = intval($helm); $gloves = intval($gloves); $amulet = intval($amulet); $ring = intval($ring); // Get the user infos $char = adr_get_user_infos($user_id); ### START restriction checks ### $item_sql = adr_make_restrict_sql($char); ### END restriction checks ### // Be sure he has a character if (!is_numeric($char['character_id'])) { adr_previous(Adr_your_character_lack, adr_character, ''); } // Calculate the base stats $hp = 0; $mp = 0; $level = $char['character_level']; $char_element = $char['character_element']; $char_mp = $char['character_mp']; // Create base attack & defence stats $att = adr_battle_make_att($char['character_might'], $char['character_constitution']); $ma = adr_battle_make_magic_att($char['character_intelligence']); $def = adr_battle_make_def($char['character_ac'], $char['character_dexterity']); $md = adr_battle_make_magic_def($char['character_wisdom']); // Modify stats depending to zone element $zone_user = adr_get_user_infos($user_id); $actual_zone = $zone_user['character_area']; $sql = "SELECT * FROM " . ADR_ZONES_TABLE . "\r\n\t\tWHERE zone_id = {$actual_zone}"; $result = $db->sql_query($sql); if (!$result) { message_die(GENERAL_ERROR, 'Could not obtain zones information', "", __LINE__, __FILE__, $sql); } $zone_check = $db->sql_fetchrow($result); if ($board_config['zone_bonus_enable'] == '1' && $zone_check['zone_element'] == '$char_element') { $bonus_att = $board_config['zone_bonus_att']; $bonus_def = $board_config['zone_bonus_def']; $att = ($char['character_might'] + $char['character_constitution']) * 2 + $bonus_att; $def = $char['character_dexterity'] + $char['character_wisdom'] + $char['character_ac'] + $bonus_def; } // Start party $party = $char['character_party']; if ($party > 0) { $sql = " SELECT character_party FROM " . ADR_CHARACTERS_TABLE . "\r\n\t\t\t WHERE character_party = {$party} "; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query count for info page', '', __LINE__, __FILE__, $sql); } $count_members = $db->sql_numrows($result); } elseif ($party = 0) { $sql = " SELECT character_party FROM " . ADR_CHARACTERS_TABLE . "\r\n\t\t\t WHERE character_party = 0 "; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query count for info page', '', __LINE__, __FILE__, $sql); } $count_members = $db->sql_numrows($result); } // Boost ATT $att = $att + $count_members + $count_members + $count_members; $att = round($att); // Boost DEF $def = $def + $count_members + $count_members + $count_members + $count_members + $count_members; $def = round($def); // Boost MA $ma = $ma + $count_members + $count_members + $count_members; $ma = round($ma); // Boost MD $md = $md + $count_members + $count_members + $count_members + $count_members + $count_members; $md = round($md); // End Party if ($armor) { $sql = "SELECT * FROM " . ADR_SHOPS_ITEMS_TABLE . "\r\n\t\t\tWHERE item_in_shop = '0'\r\n\t\t\tAND item_owner_id = '{$user_id}'\r\n\t\t\tAND item_in_warehouse = '0'\r\n\t\t\t{$item_sql}\r\n\t\t\tAND item_id = '{$armor}'"; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query battle list', '', __LINE__, __FILE__, $sql); } $item = $db->sql_fetchrow($result); $armor_id = $item['item_id']; $def = $def + ($item['item_power'] + $item['item_add_power']); adr_use_item($armor, $user_id); $armour_name = adr_get_lang($item['item_name']); } $def = $def + $adr_general['shield_bonus'] * $char['character_skill_shield_level']; if ($buckler) { $sql = "SELECT * FROM " . ADR_SHOPS_ITEMS_TABLE . "\r\n\t\t\tWHERE item_in_shop = '0'\r\n\t\t\tAND item_owner_id = '{$user_id}'\r\n\t\t\tAND item_in_warehouse = '0'\r\n\t\t\t{$item_sql}\r\n\t\t\tAND item_id = '{$buckler}'"; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query battle list', '', __LINE__, __FILE__, $sql); } $item = $db->sql_fetchrow($result); $buckler_id = $item['item_id']; $def = $def + ($item['item_power'] + $item['item_add_power']); adr_use_item($buckler, $user_id); $buckler_name = adr_get_lang($item['item_name']); } if ($gloves) { $sql = "SELECT * FROM " . ADR_SHOPS_ITEMS_TABLE . "\r\n\t\t\tWHERE item_in_shop = '0'\r\n\t\t\tAND item_owner_id = '{$user_id}'\r\n\t\t\tAND item_in_warehouse = '0'\r\n\t\t\t{$item_sql}\r\n\t\t\tAND item_id = '{$gloves}'"; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query battle list', '', __LINE__, __FILE__, $sql); } $item = $db->sql_fetchrow($result); $gloves_id = $item['item_id']; $def = $def + ($item['item_power'] + $item['item_add_power']); adr_use_item($gloves, $user_id); $gloves_name = adr_get_lang($item['item_name']); } if ($helm) { $sql = "SELECT * FROM " . ADR_SHOPS_ITEMS_TABLE . "\r\n\t\t\tWHERE item_in_shop = '0'\r\n\t\t\tAND item_owner_id = '{$user_id}'\r\n\t\t\tAND item_in_warehouse = '0'\r\n\t\t\t{$item_sql}\r\n\t\t\tAND item_id = '{$helm}'"; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query battle list', '', __LINE__, __FILE__, $sql); } $item = $db->sql_fetchrow($result); $helm_id = $item['item_id']; $def = $def + ($item['item_power'] + $item['item_add_power']); adr_use_item($helm, $user_id); $helm_name = adr_get_lang($item['item_name']); } // Now we modify mp and hp regeneration with amulets and rings if ($amulet) { $sql = " SELECT * FROM " . ADR_SHOPS_ITEMS_TABLE . "\r\n\t\t\tWHERE item_in_shop = '0'\r\n\t\t\tAND item_owner_id = '{$user_id}'\r\n\t\t\tAND item_in_warehouse = '0'\r\n\t\t\t{$item_sql}\r\n\t\t\tAND item_id = '{$amulet}'"; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query battle list', '', __LINE__, __FILE__, $sql); } $item = $db->sql_fetchrow($result); $amulet_id = $item['item_id']; $hp = $hp + $item['item_power']; adr_use_item($amulet, $user_id); $amulet_name = adr_get_lang($item['item_name']); } if ($ring) { $sql = "SELECT * FROM " . ADR_SHOPS_ITEMS_TABLE . "\r\n\t\t\tWHERE item_in_shop = '0'\r\n\t\t\tAND item_owner_id = '{$user_id}'\r\n\t\t\tAND item_in_warehouse = '0'\r\n\t\t\t{$item_sql}\r\n\t\t\tAND item_id = '{$ring}'"; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query battle list', '', __LINE__, __FILE__, $sql); } $item = $db->sql_fetchrow($result); $ring_id = $item['item_id']; $mp = $mp + $item['item_power']; adr_use_item($ring, $user_id); $ring_name = adr_get_lang($item['item_name']); } if ($greave) { $sql = " SELECT item_name , item_power , item_add_power FROM " . ADR_SHOPS_ITEMS_TABLE . "\r\n\t\t\tWHERE item_in_shop = 0 \r\n\t\t\tAND item_owner_id = {$user_id} \r\n\t\t\tAND item_in_warehouse = 0\r\n\t\t\tAND item_id = {$greave} "; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query battle list', '', __LINE__, __FILE__, $sql); } $item = $db->sql_fetchrow($result); $def = $def + $item['item_power'] + $item['item_add_power']; $greave_name = $item['item_name']; adr_use_item($greave, $user_id); $greave_name = adr_get_lang($item['item_name']); } if ($boot) { $sql = " SELECT item_name , item_power , item_add_power FROM " . ADR_SHOPS_ITEMS_TABLE . "\r\n\t\t\tWHERE item_in_shop = 0 \r\n\t\t\tAND item_owner_id = {$user_id} \r\n\t\t\tAND item_in_warehouse = 0\r\n\t\t\tAND item_id = {$boot} "; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query battle list', '', __LINE__, __FILE__, $sql); } $item = $db->sql_fetchrow($result); $def = $def + $item['item_power'] + $item['item_add_power']; $boot_name = $item['item_name']; adr_use_item($boot, $user_id); $boot_name = adr_get_lang($item['item_name']); } if ($zone_check['zone_monsters_list'] == '') { adr_previous(Adr_zone_no_monsters, adr_zones, ''); } $monster_area = $zone_check['zone_monsters_list'] == '0' ? "" : "AND monster_id IN (" . $zone_check['zone_monsters_list'] . ")"; ##=== START: new monster rand selection code as posted by Sederien ===## # V: JK. That's zone mod's code :). // Let's care about the opponent now $actual_weather = $zone_user['character_weather']; $actual_season = $board_config['adr_seasons']; $actual_time = $board_config['adr_time']; $sql = " SELECT * FROM " . ADR_BATTLE_MONSTERS_TABLE . "\r\n\t\t\tWHERE monster_level <= {$level} \r\n\t\t\t{$monster_area}\r\n\t\t\tAND ( monster_weather = {$actual_weather} || monster_weather = 0 )\r\n\t\t\tAND (monster_time = {$actual_time} OR monster_time = 0)\r\n\t\t\tAND ( monster_season = {$actual_season} || monster_season = 0 )"; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not query monsters list', '', __LINE__, __FILE__, $sql); } $monsters = $db->sql_fetchrow($result); // Be sure monsters of the user level exists if (!$monsters) { adr_previous(Adr_no_monsters, adr_character, ''); } // Get this monster base stats $monster_id = $monsters['monster_id']; $monster_level = $monsters['monster_level']; $monster_base_hp = $monsters['monster_base_hp']; $monster_base_att = $monsters['monster_base_att']; $monster_base_def = $monsters['monster_base_def']; $monster_base_element = $monsters['monster_base_element']; $monster_base_mp = $monsters['monster_base_mp']; $monster_base_mp_power = $monsters['monster_base_mp_power']; $monster_base_ma = $monsters['monster_base_magic_attack']; $monster_base_md = $monsters['monster_base_magic_resistance']; $monster_base_sp = $monsters['monster_base_sp']; ##=== END: new monster selection code by Sederien ===## // If the user is higher level than the monster , update the monster stats if ($monster_level < $level) { if ($adr_general['battle_calc_type']) { // Xanathis's alternative battle modifier calculation for monster battles $modifier = ($adr_general['battle_monster_stats_modifier'] - 100) / 100 * ($level - $monster_level) + 1; } else { $modifier = $adr_general['battle_monster_stats_modifier'] / 100 * ($level - $monster_level); } $monster_base_hp = ceil($monster_base_hp * $modifier); $monster_base_att = ceil($monster_base_att * $modifier); $monster_base_def = ceil($monster_base_def * $modifier); $monster_base_mp = ceil($monster_base_mp * $modifier); $monster_base_ma = ceil($monster_base_ma * $modifier); $monster_base_md = ceil($monster_base_md * $modifier); $monster_base_sp = ceil($monster_base_sp * $modifier); } ##=== START array for equipment id's ## $equip_array = intval($helm_id) . '-' . intval($armor_id) . '-' . intval($gloves_id) . '-' . intval($buckler_id) . '-' . intval($amulet_id) . '-' . intval($ring_id) . '-' . intval($hp) . '-' . intval($mp) . '-' . intval($greave) . '-' . intval($boot); ##=== END array for equipment id's ## ##=== START: Initiative Checks // 1d20 roll. Highest starts. $monster_dex = 10 + rand(1, $monster_level) * 2; //temp $challenger_init_check = rand(1, 20) + adr_modifier_calc($char['character_dexterity']); $monster_init_check = rand(1, 20) + adr_modifier_calc($monster_dex); // Check who will start ELSE do a rand to determine. if ($challenger_init_check >= $monster_init_check) { $turn = 1; } else { $turn = 2; } ##=== END: Initiative Checks $spell_effects = explode(':', $char['character_spell_pre_effects']); for ($i = 0; $i < count($spell_effects); $i++) { if ($spell_effects[$i] == 'ATT') { $value = $spell_effects[$i + 1]; $att = $att + $value; } if ($spell_effects[$i] == 'DEF') { $value = $spell_effects[$i + 1]; $def = $def + $value; } } //remove spell pre-effects $sql = "UPDATE " . ADR_CHARACTERS_TABLE . "\r\n\t\tSET character_spell_pre_effects = ''\r\n\t\tWHERE character_id = {$user_id} "; if (!$db->sql_query($sql)) { message_die(GENERAL_ERROR, 'Couldn\'t remove characters spell pre effects for battle', '', __LINE__, __FILE__, $sql); } // Finally insert all theses values into the database $sql = "INSERT INTO " . ADR_BATTLE_LIST_TABLE . "\r\n\t\t(battle_type, battle_start, battle_turn, battle_result, battle_text, battle_challenger_id, battle_challenger_hp, battle_challenger_mp, battle_challenger_att, battle_challenger_def, battle_challenger_element, battle_challenger_magic_attack, battle_challenger_magic_resistance, battle_challenger_equipment_info, battle_opponent_id, battle_opponent_hp, battle_opponent_hp_max, battle_opponent_mp, battle_opponent_mp_max, battle_opponent_mp_power, battle_opponent_att, battle_opponent_def, battle_opponent_element, battle_opponent_magic_attack, battle_opponent_magic_resistance, battle_opponent_sp)\r\n\t\tVALUES(1, " . time() . ", {$turn}, 0, '', {$user_id}, {$hp}, {$mp}, {$att}, {$def}, {$char_element}, {$ma}, {$md}, '{$equip_array}', {$monster_id}, {$monster_base_hp}, {$monster_base_hp}, {$monster_base_mp}, {$monster_base_mp}, {$monster_base_mp_power}, {$monster_base_att}, {$monster_base_def}, {$monster_base_element}, {$monster_base_ma}, {$monster_base_md}, {$monster_base_sp})"; $result = $db->sql_query($sql); if (!$result) { message_die(GENERAL_ERROR, "Couldn't insert new battle", "", __LINE__, __FILE__, $sql); } // Do armour set check // Do armour set check include_once $phpbb_root_path . 'adr/includes/adr_functions_armour_sets.' . $phpEx; adr_armour_set_check($user_id, $armour_name, $buckler_name, $gloves_name, $helm_name, $amulet_name, $ring_name, $greave_name, $boot_name); }
function adr_use_skill_thief($user_id, $item_dc) { global $db; $user_id = intval($user_id); $item_dc = intval($item_dc); $success = FALSE; $adr_general = adr_get_general_config(); $adr_user = adr_get_user_infos($user_id); $skill_data = adr_get_skill_data(6); // Work out item steal dc, then roll 1d20 ($rand), then add skill modifier to result $item_steal_chance = adr_steal_dc($item_dc); $rand = rand(1, 20); $item_steal_modifier = $rand + adr_modifier_calc($adr_user['character_skill_thief']); // Success theft of item if ($rand + $item_steal_modifier) is more than item steal dc ($item_steal_chance) if ($item_steal_modifier > $item_steal_chance && $rand != '1' || $rand == '20') { $success = TRUE; // Increases the success uses of this skill and increase level if needed // if(($adr_user['character_skill_thief_uses'] + 1) >= adr_skills_max_req($skill_data['skill_id'], $adr_user['character_skill_thief'])) if ($adr_user['character_skill_thief_uses'] + 1 >= $skill_data['skill_req']) { $sql = "UPDATE " . ADR_CHARACTERS_TABLE . "\n\t\t\t\tSET character_skill_thief_uses = 0,\n\t\t\t\t\tcharacter_skill_thief = (character_skill_thief + 1)\n\t\t\t\tWHERE character_id = '{$user_id}'"; $result = $db->sql_query($sql); if (!$result) { message_die(GENERAL_ERROR, 'Could not obtain skill information', "", __LINE__, __FILE__, $sql); } } else { $sql = "UPDATE " . ADR_CHARACTERS_TABLE . "\n\t\t\t\tSET character_skill_thief_uses = (character_skill_thief_uses + 1)\n\t\t\t\tWHERE character_id = '{$user_id}'"; $result = $db->sql_query($sql); if (!$result) { message_die(GENERAL_ERROR, 'Could not obtain skill information', "", __LINE__, __FILE__, $sql); } } } return $success; }
function adr_weight_stats($level, $race_weight, $race_weight_per_level, $str) { $level = intval($level); $race_weight = intval($race_weight); $race_weight_per_level = intval($race_weight_per_level); $str = adr_modifier_calc($str) * 10; $max_weight = $race_weight + $race_weight * $race_weight_per_level / 100 * $level; return $max_weight + $str; }
$battle_message .= sprintf($lang['Adr_battle_opponent_spell_success2'], $monster_name, $character_name, $damage); } } else { $damage = 0; $battle_message .= sprintf($lang['Adr_battle_opponent_spell_failure'], $monster_name, $character_name); } // Remove monster MP $sql = "UPDATE " . ADR_BATTLE_LIST_TABLE . "\n\t\t\t\t\tSET battle_opponent_mp = (battle_opponent_mp - '" . $bat['battle_opponent_mp_power'] . "')\n\t\t\t\t\tWHERE battle_challenger_id = '{$user_id}'\n\t\t\t\t\t\tAND battle_result = '0'\n\t\t\t\t\t\tAND battle_type = '1'"; if (!($result = $db->sql_query($sql))) { message_die(GENERAL_ERROR, 'Could not update battle', '', __LINE__, __FILE__, $sql); } } else { // Let's check if the attack succeeds $dice = rand(1, 20); $success = $bat['battle_opponent_att'] + $dice >= $bat['battle_challenger_def'] + adr_modifier_calc($challenger['character_dexterity']) && $dice != '1' || $dice >= $threat_range ? TRUE : FALSE; $power = ceil($power / 2 + adr_modifier_calc($monster['monster_str'])); $damage = 1; if ($success == TRUE) { // Attack success , calculate the damage . Critical dice roll is still success $damage = $power < '1' ? rand(1, 3) : $power; $damage = $dice >= $threat_range ? ceil($damage * $monster['monster_crit_hit_mod']) : ceil($damage); $damage = $damage > $challenger['character_hp'] ? $challenger['character_hp'] : $damage; $battle_message .= $dice >= $threat_range ? $lang['Adr_battle_critical_hit'] . ' ' : ''; $battle_message .= sprintf($lang['Adr_battle_opponent_attack_success'], $monster_name, $character_name, $damage); } else { $damage = 0; $battle_message .= sprintf($lang['Adr_battle_opponent_attack_failure'], $monster_name, $character_name); } } // Prevent instant kills at start of battle if ($bat['battle_round'] == '0' && $challenger['character_hp'] - $damage < '1') {
} else { $mode = ""; } if ($mode != "") { switch ($mode) { case 'library_action': //Cost for using library adr_substract_points($user_id, 100, '', 'adr_research'); //Research success calculation $rand = rand(1, 20); //Critical failure if ($rand == '1') { $book_false = true; } else { $book_false = false; $research = $rand + adr_modifier_calc($adr_user['character_intelligence']); if ($research >= '150') { $book_difficulty = '7'; } elseif ($research >= '100' && $research < '150') { $book_difficulty = '6'; } elseif ($research >= '75' && $research < '100') { $book_difficulty = '5'; } elseif ($research >= '45' && $research < '75') { $book_difficulty = '4'; } elseif ($research >= '30' && $research < '45') { $book_difficulty = '3'; } elseif ($research >= '20' && $research < '30') { $book_difficulty = '2'; } elseif ($research >= '12' && $research < '20') { $book_difficulty = '1'; } elseif ($research >= '1' && $research < '12') {