📄 combat.php
字号:
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'][] = " ";
$_SESSION['disp_msg'][] = " ";
$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 + -