⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 combat.php

📁 三國好好 子
💻 PHP
📖 第 1 页 / 共 3 页
字号:

   if($comb_act == 'flee'){
        // Flee Code
        $char_flee_roll = ($character->dexterity + $character->level + diceroll());
        $opp_flee_roll  = ($oppcharacter->dexterity + $oppcharacter->level + diceroll());

        DEBUG AND $_SESSION['disp_msg'][] = "DEBUG: Flee roll $char_flee_roll > $opp_flee_roll?";
        if($char_flee_roll > $opp_flee_roll  OR  rand(1,100)<10 ) {
            //move character to random adjacent location
            for($i=0;$i<24;++$i){
               	if($character->relocate(rand(1,8))){
                    break;
                }
            }
            //Character Flees
            $link= endfight();
            jsChangeLocation($link);
        } else {
            jsChangeLocation("combat.php?comb_act=npc_attack&fleefail=1");
        }
   }

   // BEGIN ATTACK CODE
	if($comb_act == 'both_attack' OR $comb_act == 'char_attack' OR $comb_act == 'magic_attack') {

		//Check Stamina points
		if ($character->stamina_points <= 0) {
			$_SESSION['disp_msg'][] = $lang_comb["stam_noo"];
		} else {

            //CHARACTER ATTACKS

        	// are we using up a scroll/magic ?
    		if($comb_act == 'magic_attack'){
    			$res=mysql_query("SELECT name,min_damage,max_damage,damage_mess,req_skill FROM phaos_spells_items WHERE id = $spellid");
    			list($name,$min_damage,$max_damage,$damage_mess,$req_skill) = mysql_fetch_array($res);

    			// Remove scroll from inventory
    			$sql = "DELETE FROM phaos_char_inventory WHERE id = '$invid'";
    			mysql_query($sql) or die ("Error in query: $query. " . mysql_error());

                if($character->wisdom + rand(1,$character->wisdom) < $req_skill){
                    $defenders = array();
                    $_SESSION['disp_msg'][] = $lang_magic["spell_fumble"];
                }else{
                    // set area effect
                    $numdefenders=  $damage_mess* (1+(int)($character->wisdom/9+rand(0,99)*0.01));
                    if($numdefenders>0) {
                        if($numdefenders>=count($opponents)){
                            $defenders= &$opponents;
                        }else{
                            $defenders=  array_rand_assoc_array($opponents, $numdefenders);
                        }
                    }
                    //always attack the one the character is engaged with
                    $defenders[$oppcharacter->id] = &$oppcharacter;
                }
    		}else{
                $defenders= array( $oppcharacter->id => &$oppcharacter );
            }

            foreach(array_keys($defenders) as $defenderkey) {
                $defender= &$defenders[$defenderkey];
                if($defender->hit_points<=0){
        		  if(DEBUG) {$_SESSION['disp_msg'][] = "**DEBUG: defender[$defenderkey]=".print_r($defender,true);}
                }else{
        		// Determine char attack value
                $_SESSION['char_attack']= $character->attack_roll($comb_act);
        		if(DEBUG>=1) {$_SESSION['disp_msg'][] = "**DEBUG: char_attack = ".$_SESSION['char_attack'];}
        		// Determine opponent defense value
                $_SESSION['opp_defence']= $defender->defence_roll($comb_act);
           		if(DEBUG>=1) {$_SESSION['disp_msg'][] = "**DEBUG: opp_def = ".$_SESSION['opp_defence'];}

        		//Check hit to opponent
                $damage_multiplier= $_SESSION['char_attack']-$_SESSION['opp_defence'];

          		if($damage_multiplier<0) { // Missed
        			$_SESSION['disp_msg'][] = $lang_comb["u_miss"];
        		}

        		if(!$damage_multiplier) { // Tie (missed)
        			$_SESSION['disp_msg'][] = $defender->name." ".$lang_comb["def_ur_att"];
        		}

          	    if(DEBUG>=1) {$_SESSION['disp_msg'][] = "**DEBUG: damage multiplier = ".$damage_multiplier;}
        		if( $damage_multiplier>0 ) {	// Hit
        			// Do and show damage to Opponent
        			if ($comb_act == "magic_attack") {	// magic damage
        				$_SESSION['dmg_to_opp'] = roll_damage(root_damage($min_damage*$damage_multiplier),root_damage($max_damage*$damage_multiplier))+$character->wisdom;
        			} else {	// normal damage
                        //FIXME: this is odd, attack_min,max turn up the second time
        				$_SESSION['dmg_to_opp'] = roll_damage(root_damage($character->attack_min()*$damage_multiplier)-$defender->defense_min()/2,root_damage($character->attack_max()*$damage_multiplier)-$defender->defense_min());
                        if($character->race=='Vampire'){
               				$_SESSION['disp_msg'][] = "$lang_comb[suck_opp_blood]";
                            $character->stamina_points+= $_SESSION['dmg_to_opp'];
                        }
        			}
        			if(DEBUG>=1) {$_SESSION['disp_msg'][] = "**DEBUG: dmg_to_opp = ".$_SESSION['dmg_to_opp'];}
        			if($_SESSION['dmg_to_opp'] <= 0) {$_SESSION['dmg_to_opp'] = 1; }

        			$defender->hit_points   = $defender->hit_points   - $_SESSION['dmg_to_opp'];
       				$_SESSION['disp_msg'][] = "$lang_comb[att_hit_foor] $_SESSION[dmg_to_opp]";

            		//Update Opponent Hit Points in the DataBase
            		$sql = ("UPDATE phaos_characters SET hit_points = ".$defender->hit_points." WHERE id = ".$defender->id."");
            		$res = mysql_query($sql);
                    if(!$res){ showError(__FILE__,__LINE__,__FUNCTION__); exit; };

                    //update opponent character

        			// FIXME: when   ($damage_mess == 1)  this whole section needs to loop
        			if ($defender->hit_points <= 0) {	//An opponent has been killed
        				if($defender->hit_points < 0) { $defender->hit_points = 0; }
        				$_SESSION['disp_msg'][] = $lang_comb["kill_a"]." ".$defender->name;

                        if($defender->id == $_SESSION['opponent_id']){
                            $_SESSION['opponent_id']= 0;
            				unset($_SESSION['opponent_id']);	// clear current opp
                        }

            			$ret = $defender->kill_characterid();
                   		if(DEBUG>=1) {$_SESSION['disp_msg'][] = "**DEBUG: killing oppponent";}

        				// add monsters to replace dead one
        				for($i = 1; $i <= 2; $i++) {	//FIXME: 2 monsters for now, but this WILL over populate!
        					npcgen()  and  DEBUG and $_SESSION['disp_msg'][] = "**DEBUG: npcgen is success";
        				}

        				//Receive Gold
        				$_SESSION['gold_rec'] = $_SESSION['fightbonus']* $defender->gold;
        				$character->gold += $_SESSION['gold_rec'];
        				$_SESSION['disp_msg'][] = "$lang_fun[gai_gold] $_SESSION[gold_rec]";

        				//Receive Experience
        				$_SESSION['xp_rec'] = (int)($defender->max_hp/2+$character->wisdom);
        				$_SESSION['xp_rec'] *= $_SESSION['fightbonus'];
        				$character->xp += $_SESSION['xp_rec'];
        				$_SESSION['disp_msg'][] = "$lang_fun[gai_xp] $_SESSION[xp_rec]";

        				//Update Character rewards to the DataBase
        				$res=mysql_query("UPDATE phaos_characters SET gold=".$character->gold.", xp=".$character->xp." WHERE id='$PHP_PHAOS_CHARID'");
                		$res = mysql_query($sql);
                        if(!$res){ showError(__FILE__,__LINE__,__FUNCTION__); exit; };

                        $character->all_skillsup($comb_act,$lang_fun);

        				refsidebar();

        				$list=whos_here($character->location);

                        if($defender->id == $oppcharacter->id){
                            //the opponent we are engaged with has been killed
                            $_SESSION['endcombat']= true;
                        }
        			}//killed opponent
        		}//hit opponent
                }//living defender
            }//foreach defender
        }  //end "has enough stamina"

        $_SESSION['disp_msg'][] = "&nbsp";
        $_SESSION['disp_msg'][] = "&nbsp";

       $character->update_stamina();

   } // end all char attack code

   if( ($comb_act == 'both_attack' OR $comb_act == 'npc_attack' OR $comb_act == 'magic_attack') AND $_SESSION['endcombat'] == false) {

      //OPPONENT ATTACKS
      if(isset($npcfirstatt)) {
         $_SESSION['disp_msg'][] = $lang_comb["under_att"];
         unset($npcfirstatt);
      }

      if(isset($fleefail)) {
         $_SESSION['disp_msg'][] = $lang_comb["fail_flee"]." ".sayOpponents();
         unset($fleefail);
	DEBUG and $_SESSION['disp_msg'][] = "**DEBUG: Flee = Char: ".($character->dexterity+$character->level)."+(2-30)  /  MOB: ".($oppcharacter->dexterity+$oppcharacter->level)."+(2-30)";
      }


    // let each opponent attack
    foreach(array_keys($opponents) as $opponentskey) {
        $attackingcharacter= &$opponents[$opponentskey];
        if($attackingcharacter->hit_points<=0){
             if(DEBUG) {$_SESSION['disp_msg'][] = "**DEBUG: $attackingcharacter->name #$attackingcharacter->id is dead";}
            unset($opponents[$opponentskey]);
        }else{
         if(DEBUG>=1) {$_SESSION['disp_msg'][] = "**DEBUG: $attackingcharacter->name #$attackingcharacter->id, STR = $attackingcharacter->strength, fight = $attackingcharacter->fight";}

         $_SESSION['opp_attack'] = $attackingcharacter->attack_roll($comb_act);
         if(DEBUG>=1) {$_SESSION['disp_msg'][] = "**DEBUG: opp_attack = ".$_SESSION['opp_attack'];}

         //Set Characters defence
		 $_SESSION['char_def'] = $character->defence_roll($comb_act);
         if(DEBUG>=1) {$_SESSION['disp_msg'][] = "**DEBUG: char_def = ".$_SESSION['char_def'];}

         $damage_multiplier= $_SESSION['opp_attack']-$_SESSION['char_def'];

         if($damage_multiplier<0) {
         // Missed
            $_SESSION['disp_msg'][] = $attackingcharacter->name." 没有击中你!";
         }

         //Check hit to Character
         if(!$damage_multiplier) {
         // Deadlock
            $_SESSION['disp_msg'][] = $lang_comb["def_en"]." ".$attackingcharacter->name."";
         }

 	     if(DEBUG>=1) {$_SESSION['disp_msg'][] = "**DEBUG: damage multiplier = ".$damage_multiplier;}
         if($damage_multiplier>0) {
            // Do and show damage to Character
            DEBUG AND $_SESSION['disp_msg'][] = "**DEBUG: char defense_min =  ".$character->defense_min();
			$_SESSION['dmg_to_char'] = roll_damage(root_damage($attackingcharacter->attack_min()*$damage_multiplier) - $character->defense_min()/2 ,root_damage($attackingcharacter->attack_max()*$damage_multiplier) - $character->defense_min() );
            DEBUG AND $_SESSION['disp_msg'][] = "**DEBUG: dmg_to_char = ".$_SESSION['dmg_to_char'];
            if($_SESSION['dmg_to_char'] <= 0) {$_SESSION['dmg_to_char'] = 1; }
            $character->hit_points = $character->hit_points - $_SESSION['dmg_to_char'];

            $_SESSION['disp_msg'][] = $attackingcharacter->name." ".$lang_comb["hit_for_u"]." ".$_SESSION['dmg_to_char'];

            if($character->hit_points <= 0) {
                $character->hit_points = 0;
                $_SESSION['disp_msg'][] = $attackingcharacter->name." ".$lang_comb["kill_u_man"];

        		//Let NPC Receive Gold
        		$attackingcharacter->gold += (int)($character->gold*.15);
        		$character->gold = (int)($character->gold*.85);  // FIXME: player should really lose ALL gold carrying... this is temp (should set to 0)

        		$attackingcharacter->xp += ((int)($character->max_hp/1)+$attackingcharacter->wisdom)*$_SESSION['fightbonus'];	//   (max_hp/1) for now (NPC's need to gain faster)
        		$character->xp -= (int)($character->xp/100);		// for now, player only looses 1% XP

        		// Update database with win/loss for player/NPC
        		$req=mysql_query("UPDATE phaos_characters SET gold = ".$character->gold.", xp = ".$character->xp." WHERE id = '".$character->id."'");
                if (!$req) { showError(__FILE__,__LINE__,__FUNCTION__); exit;}

        		$req=mysql_query("UPDATE phaos_characters SET gold = ".$attackingcharacter->gold.", xp = ".$attackingcharacter->xp." WHERE id = '".$attackingcharacter->id."'");
                if (!$req) { showError(__FILE__,__LINE__,__FUNCTION__); exit;}

                $attackingcharacter->all_skillsup("",$lang_fun_opp);

                unset($_SESSION['opponent_id']);

        		// when dead, go to Gornath (easy city of undead) to start over
        		if (! mysql_query("UPDATE phaos_characters SET location = 4072 WHERE id = '$PHP_PHAOS_CHARID'") ) {  showError(__FILE__,__LINE__,__FUNCTION__); die; }

                $break_loop= true;
            }

            //Update Character Hit Points in the DataBase
            $query = ("UPDATE phaos_characters SET hit_points = ".$character->hit_points." WHERE id = '$PHP_PHAOS_CHARID'");
            $req = mysql_query($query);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -