Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
 /**
  * @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>";
    }
}
Ejemplo n.º 4
0
     $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;
}
Ejemplo n.º 6
0
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);
}
Ejemplo n.º 7
0
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;
}
Ejemplo n.º 8
0
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;
}
Ejemplo n.º 9
0
             $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') {
Ejemplo n.º 10
0
} 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') {