Example #1
0
 /**
  * @method POST
  * @api create
  *
  * ints - race_id, element_id, alignment_id, class_id
  *        element_id, alignment_id, character_might, character_dexterity, character_constitution, character_intelligence, character_wisdom, character_charisma, magic_attack, magic_resistance
  * string - character_name, character_desc
  */
 public function create()
 {
     $userID = User::getID();
     $db = DB::instance();
     $races = new Races();
     $race = $races->getRaceByID($_POST['race_id']);
     $elements = new Elements();
     $element = $elements->getElementByID($_POST['element_id']);
     $alignments = new Alignments();
     $alignment = $alignments->getAlignmentByID($_POST['alignment_id']);
     $classes = new Classes();
     $class = $classes->getClassByID($_POST['class_id']);
     $config = ADR::getGeneralConfig();
     if (!$this->verify_roll($_POST)) {
         return $this->response(array('status' => 0, 'message' => 'Invalid roll'));
     }
     $character_name = $_POST['character_name'];
     $character_desc = $_POST['character_desc'];
     $character_race = $_POST['race_id'];
     $character_class = $_POST['class_id'];
     $character_hp = $class['class_base_hp'];
     $character_hp_max = $class['class_base_hp'];
     $character_mp = $class['class_base_mp'];
     $character_mp_max = $class['class_base_mp'];
     $character_ac = $class['class_base_ac'];
     $character_element = $_POST['element_id'];
     $character_alignment = $_POST['alignment_id'];
     $character_might = $_POST['character_might'] + ($race['race_might_bonus'] - $race['race_might_penalty']);
     $character_dexterity = $_POST['character_dexterity'] + ($race['race_dexterity_bonus'] - $race['race_dexterity_penalty']);
     $character_constitution = $_POST['character_constitution'] + ($race['race_constitution_bonus'] - $race['race_constitution_penalty']);
     $character_intelligence = $_POST['character_intelligence'] + ($race['race_intelligence_bonus'] - $race['race_intelligence_penalty']);
     $character_wisdom = $_POST['character_wisdom'] + ($race['race_wisdom_bonus'] - $race['race_wisdom_penalty']);
     $character_charisma = $_POST['character_charisma'] + ($race['race_charisma_bonus'] - $race['race_charisma_penalty']);
     $character_magic_attack = $_POST['magic_attack'] + ($race['race_magic_attack_bonus'] - $race['race_magic_attack_penalty']);
     $character_magic_resistance = $_POST['magic_resistance'] + ($race['race_magic_resistance_bonus'] - $race['race_magic_resistance_penalty']);
     $character_skill_mining = 1 + ($race['race_skill_mining_bonus'] + $element['element_skill_mining_bonus']);
     $character_skill_stone = 1 + ($race['race_skill_stone_bonus'] + $element['element_skill_stone_bonus']);
     $character_skill_forge = 1 + ($race['race_skill_forge_bonus'] + $element['element_skill_forge_bonus']);
     $character_skill_enchantment = 1 + ($race['race_skill_enchantment_bonus'] + $element['element_skill_enchantment_bonus']);
     $character_skill_trading = 1 + ($race['race_skill_trading_bonus'] + $element['element_skill_trading_bonus']);
     $character_skill_thief = 1 + ($race['race_skill_thief_bonus'] + $element['element_skill_thief_bonus']);
     $character_birth = time();
     $character_battle_limit = $config['character_battle_limit'];
     $character_skill_limit = $config['character_skill_limit'];
     $character_trading_limit = $config['character_trading_limit'];
     $character_thief_limit = $config['character_thief_limit'];
     $character_id = $db->insert('adr_characters', array('userID' => $userID, 'character_name' => $character_name, 'character_desc' => $character_desc, 'character_race' => $character_race, 'character_class' => $character_class, 'character_hp' => $character_hp, 'character_hp_max' => $character_hp_max, 'character_mp' => $character_mp, 'character_mp_max' => $character_mp_max, 'character_ac' => $character_ac, 'character_element' => $character_element, 'character_alignment' => $character_alignment, 'character_might' => $character_might, 'character_dexterity' => $character_dexterity, 'character_constitution' => $character_constitution, 'character_intelligence' => $character_intelligence, 'character_wisdom' => $character_wisdom, 'character_charisma' => $character_charisma, 'character_magic_attack' => $character_magic_attack, 'character_magic_resistance' => $character_magic_resistance, 'character_skill_mining' => $character_skill_mining, 'character_skill_stone' => $character_skill_stone, 'character_skill_forge' => $character_skill_forge, 'character_skill_enchantment' => $character_skill_enchantment, 'character_skill_trading' => $character_skill_trading, 'character_skill_thief' => $character_skill_thief, 'character_birth' => $character_birth, 'character_battle_limit' => $character_battle_limit, 'character_skill_limit' => $character_skill_limit, 'character_trading_limit' => $character_trading_limit, 'character_thief_limit' => $character_thief_limit));
     if ($character_id == false) {
         throw new Exception($db->getErrorMessage());
     }
     return $this->response(array('status' => 1, 'character_id' => $character_id));
 }
Example #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));
         }
     }
 }