diff --git a/src/fight.php b/src/fight.php
index d198a77..ae61938 100644
--- a/src/fight.php
+++ b/src/fight.php
@@ -9,357 +9,209 @@ function fight()
{
global $userrow;
if ($userrow["currentaction"] != "Fighting") display("Cheat attempt detected.
Get a life, loser.", "Error");
- $pagearray = array();
+
+ $pagearray = ["magiclist" => "", "yourturn" => "", "monsterturn" => "", "monsterhp" => "", "command" => ""];
$playerisdead = 0;
- $pagearray["magiclist"] = "";
+ // Populate magic list
$userspells = explode(",", $userrow["spells"]);
- $spellquery = db()->query('SELECT id, name FROM spells ORDER BY id;');
+ $spellquery = db()->query('SELECT id, name FROM spells ORDER BY id;');
while ($spellrow = $spellquery->fetchArray(SQLITE3_ASSOC)) {
- $spell = false;
- foreach ($userspells as $b) if ($b == $spellrow["id"]) $spell = true;
- if ($spell == true) $pagearray["magiclist"] .= "\n";
- unset($spell);
+ if (in_array($spellrow["id"], $userspells)) {
+ $pagearray["magiclist"] .= "\n";
+ }
}
- if ($pagearray["magiclist"] == "") $pagearray["magiclist"] = "\n";
+ $pagearray["magiclist"] = $pagearray["magiclist"] ?: "\n";
$magiclist = $pagearray["magiclist"];
- $chancetoswingfirst = 1;
-
- // First, check to see if we need to pick a monster.
+ // Determine initial combat parameters
+ $chancetoswingfirst = rand(1, 10) + (int)ceil(sqrt($userrow["dexterity"]));
if ($userrow["currentfight"] == 1) {
+ $maxlevel = (int)floor(max(abs($userrow["latitude"]) + 5, abs($userrow["longitude"]) + 5) / 5);
+ $minlevel = max(1, $maxlevel - 2);
- if ($userrow["latitude"] < 0) { $userrow["latitude"] *= -1; } // Equalize negatives.
- if ($userrow["longitude"] < 0) { $userrow["longitude"] *= -1; } // Ditto.
- $maxlevel = floor(max($userrow["latitude"]+5, $userrow["longitude"]+5) / 5); // One mlevel per five spaces.
- if ($maxlevel < 1) { $maxlevel = 1; }
- $minlevel = $maxlevel - 2;
- if ($minlevel < 1) { $minlevel = 1; }
+ $monsterrow = db()->query('SELECT * FROM monsters WHERE level >= ? AND level <= ? ORDER BY RANDOM() LIMIT 1;', [
+ $minlevel, $maxlevel
+ ])->fetchArray(SQLITE3_ASSOC);
-
- // Pick a monster.
- $monsterrow = db()->query('SELECT * FROM monsters WHERE level >= ? AND level <= ? ORDER BY RANDOM() LIMIT 1;', [
- $minlevel, $maxlevel
- ])->fetchArray(SQLITE3_ASSOC);
$userrow["currentmonster"] = $monsterrow["id"];
- $userrow["currentmonsterhp"] = rand((($monsterrow["maxhp"]/5)*4),$monsterrow["maxhp"]);
+ $userrow["currentmonsterhp"] = rand((int)(($monsterrow["maxhp"]/5)*4), $monsterrow["maxhp"]);
$userrow["currentmonstersleep"] = 0;
$userrow["currentmonsterimmune"] = $monsterrow["immune"];
- $chancetoswingfirst = rand(1,10) + ceil(sqrt($userrow["dexterity"]));
- if ($chancetoswingfirst > (rand(1,7) + ceil(sqrt($monsterrow["maxdam"])))) { $chancetoswingfirst = 1; } else { $chancetoswingfirst = 0; }
-
- unset($monsterquery);
- unset($monsterrow);
+ $chancetoswingfirst = ($chancetoswingfirst > (rand(1,7) + (int)ceil(sqrt($monsterrow["maxdam"])))) ? 1 : 0;
}
- // Next, get the monster statistics.
- $monsterrow = get_monster($userrow['currentmonster']);
+ // Get monster statistics
+ $monsterrow = get_monster($userrow['currentmonster']);
$pagearray["monstername"] = $monsterrow["name"];
- // Do run stuff.
+ // Run action
if (isset($_POST["run"])) {
-
- $chancetorun = rand(4,10) + ceil(sqrt($userrow["dexterity"]));
- if ($chancetorun > (rand(1,5) + ceil(sqrt($monsterrow["maxdam"])))) { $chancetorun = 1; } else { $chancetorun = 0; }
-
- if ($chancetorun == 0) {
+ $chancetorun = rand(4,10) + (int)ceil(sqrt($userrow["dexterity"]));
+ if ($chancetorun <= (rand(1,5) + (int)ceil(sqrt($monsterrow["maxdam"])))) {
$pagearray["yourturn"] = "You tried to run away, but were blocked in front!
";
$pagearray["monsterhp"] = "Monster's HP: " . $userrow["currentmonsterhp"] . "
";
- $pagearray["monsterturn"] = "";
- if ($userrow["currentmonstersleep"] != 0) { // Check to wake up.
- $chancetowake = rand(1,15);
- if ($chancetowake > $userrow["currentmonstersleep"]) {
- $userrow["currentmonstersleep"] = 0;
- $pagearray["monsterturn"] .= "The monster has woken up.
";
- } else {
- $pagearray["monsterturn"] .= "The monster is still asleep.
";
- }
- }
- if ($userrow["currentmonstersleep"] == 0) { // Only do this if the monster is awake.
- $tohit = ceil(rand($monsterrow["maxdam"]*.5,$monsterrow["maxdam"]));
- $toblock = ceil(rand($userrow["defensepower"]*.75,$userrow["defensepower"])/4);
- $tododge = rand(1,150);
- if ($tododge <= sqrt($userrow["dexterity"])) {
- $tohit = 0; $pagearray["monsterturn"] .= "You dodge the monster's attack. No damage has been scored.
";
- $persondamage = 0;
- } else {
- $persondamage = $tohit - $toblock;
- if ($persondamage < 1) { $persondamage = 1; }
- if ($userrow["currentuberdefense"] != 0) {
- $persondamage -= ceil($persondamage * ($userrow["currentuberdefense"]/100));
- }
- if ($persondamage < 1) { $persondamage = 1; }
- }
- $pagearray["monsterturn"] .= "The monster attacks you for $persondamage damage.
";
- $userrow["currenthp"] -= $persondamage;
- if ($userrow["currenthp"] <= 0) {
- $newgold = ceil($userrow["gold"]/2);
- $newhp = ceil($userrow["maxhp"]/4);
- db()->query("UPDATE users SET currenthp=?, currentaction='In Town', currentmonster=0, currentmonsterhp=0, currentmonstersleep=0, currentmonsterimmune=0, currentfight=0, latitude=0, longitude=0, gold=? WHERE id=?;", [
- $newhp, $newgold, $userrow['id']
- ]);
- $playerisdead = 1;
- }
- }
- }
- db()->query("UPDATE users SET currentaction='Exploring' WHERE id=?;", [$userrow['id']]);
- redirect('index.php');
+ // Monster turn logic (similar to original function)
+ $pagearray["monsterturn"] = handleMonsterTurn($userrow, $monsterrow);
- // Do fight stuff.
- } elseif (isset($_POST["fight"])) {
-
- // Your turn.
- $pagearray["yourturn"] = "";
- $tohit = ceil(rand($userrow["attackpower"]*.75,$userrow["attackpower"])/3);
- $toexcellent = rand(1,150);
- if ($toexcellent <= sqrt($userrow["strength"])) { $tohit *= 2; $pagearray["yourturn"] .= "Excellent hit!
"; }
- $toblock = ceil(rand($monsterrow["armor"]*.75,$monsterrow["armor"])/3);
- $tododge = rand(1,200);
- if ($tododge <= sqrt($monsterrow["armor"])) {
- $tohit = 0; $pagearray["yourturn"] .= "The monster is dodging. No damage has been scored.
";
- $monsterdamage = 0;
- } else {
- $monsterdamage = $tohit - $toblock;
- if ($monsterdamage < 1) { $monsterdamage = 1; }
- if ($userrow["currentuberdamage"] != 0) {
- $monsterdamage += ceil($monsterdamage * ($userrow["currentuberdamage"]/100));
- }
+ db()->query("UPDATE users SET currentaction='Exploring' WHERE id=?;", [$userrow['id']]);
+ redirect('index.php');
}
- $pagearray["yourturn"] .= "You attack the monster for $monsterdamage damage.
";
- $userrow["currentmonsterhp"] -= $monsterdamage;
- $pagearray["monsterhp"] = "Monster's HP: " . $userrow["currentmonsterhp"] . "
";
- if ($userrow["currentmonsterhp"] <= 0) {
- db()->query('UPDATE users SET currentmonsterhp=0 WHERE id=?;', [$userrow['id']]);
- redirect('index.php?do=victory');
- }
-
- // Monster's turn.
- $pagearray["monsterturn"] = "";
- if ($userrow["currentmonstersleep"] != 0) { // Check to wake up.
- $chancetowake = rand(1,15);
- if ($chancetowake > $userrow["currentmonstersleep"]) {
- $userrow["currentmonstersleep"] = 0;
- $pagearray["monsterturn"] .= "The monster has woken up.
";
- } else {
- $pagearray["monsterturn"] .= "The monster is still asleep.
";
- }
- }
- if ($userrow["currentmonstersleep"] == 0) { // Only do this if the monster is awake.
- $tohit = ceil(rand($monsterrow["maxdam"]*.5,$monsterrow["maxdam"]));
- $toblock = ceil(rand($userrow["defensepower"]*.75,$userrow["defensepower"])/4);
- $tododge = rand(1,150);
- if ($tododge <= sqrt($userrow["dexterity"])) {
- $tohit = 0; $pagearray["monsterturn"] .= "You dodge the monster's attack. No damage has been scored.
";
- $persondamage = 0;
- } else {
- $persondamage = $tohit - $toblock;
- if ($persondamage < 1) { $persondamage = 1; }
- if ($userrow["currentuberdefense"] != 0) {
- $persondamage -= ceil($persondamage * ($userrow["currentuberdefense"]/100));
- }
- if ($persondamage < 1) { $persondamage = 1; }
- }
- $pagearray["monsterturn"] .= "The monster attacks you for $persondamage damage.
";
- $userrow["currenthp"] -= $persondamage;
- if ($userrow["currenthp"] <= 0) {
- $newgold = ceil($userrow["gold"]/2);
- $newhp = ceil($userrow["maxhp"]/4);
- db()->query("UPDATE users SET currenthp=?, currentaction='In Town', currentmonster=0, currentmonsterhp=0, currentmonstersleep=0, currentmonsterimmune=0, currentfight=0, latitude=0, longitude=0, gold=? WHERE id=?;", [
- $newhp, $newgold, $userrow['id']
- ]);
- $playerisdead = 1;
- }
- }
-
- // Do spell stuff.
- } elseif (isset($_POST["spell"])) {
-
- // Your turn.
- $pickedspell = $_POST["userspell"];
- if ($pickedspell == 0) { display("You must select a spell first. Please go back and try again.", "Error"); die(); }
-
- $newspellrow = get_spell($pickedspell);
- $spell = false;
- foreach($userspells as $a => $b) {
- if ($b == $pickedspell) { $spell = true; }
- }
- if ($spell != true) { display("You have not yet learned this spell. Please go back and try again.", "Error"); die(); }
- if ($userrow["currentmp"] < $newspellrow["mp"]) { display("You do not have enough Magic Points to cast this spell. Please go back and try again.", "Error"); die(); }
-
- if ($newspellrow["type"] == 1) { // Heal spell.
- $newhp = $userrow["currenthp"] + $newspellrow["attribute"];
- if ($userrow["maxhp"] < $newhp) { $newspellrow["attribute"] = $userrow["maxhp"] - $userrow["currenthp"]; $newhp = $userrow["currenthp"] + $newspellrow["attribute"]; }
- $userrow["currenthp"] = $newhp;
- $userrow["currentmp"] -= $newspellrow["mp"];
- $pagearray["yourturn"] = "You have cast the ".$newspellrow["name"]." spell, and gained ".$newspellrow["attribute"]." Hit Points.
";
- } elseif ($newspellrow["type"] == 2) { // Hurt spell.
- if ($userrow["currentmonsterimmune"] == 0) {
- $monsterdamage = rand((($newspellrow["attribute"]/6)*5), $newspellrow["attribute"]);
- $userrow["currentmonsterhp"] -= $monsterdamage;
- $pagearray["yourturn"] = "You have cast the ".$newspellrow["name"]." spell for $monsterdamage damage.
";
- } else {
- $pagearray["yourturn"] = "You have cast the ".$newspellrow["name"]." spell, but the monster is immune to it.
";
- }
- $userrow["currentmp"] -= $newspellrow["mp"];
- } elseif ($newspellrow["type"] == 3) { // Sleep spell.
- if ($userrow["currentmonsterimmune"] != 2) {
- $userrow["currentmonstersleep"] = $newspellrow["attribute"];
- $pagearray["yourturn"] = "You have cast the ".$newspellrow["name"]." spell. The monster is asleep.
";
- } else {
- $pagearray["yourturn"] = "You have cast the ".$newspellrow["name"]." spell, but the monster is immune to it.
";
- }
- $userrow["currentmp"] -= $newspellrow["mp"];
- } elseif ($newspellrow["type"] == 4) { // +Damage spell.
- $userrow["currentuberdamage"] = $newspellrow["attribute"];
- $userrow["currentmp"] -= $newspellrow["mp"];
- $pagearray["yourturn"] = "You have cast the ".$newspellrow["name"]." spell, and will gain ".$newspellrow["attribute"]."% damage until the end of this fight.
";
- } elseif ($newspellrow["type"] == 5) { // +Defense spell.
- $userrow["currentuberdefense"] = $newspellrow["attribute"];
- $userrow["currentmp"] -= $newspellrow["mp"];
- $pagearray["yourturn"] = "You have cast the ".$newspellrow["name"]." spell, and will gain ".$newspellrow["attribute"]."% defense until the end of this fight.
";
- }
-
- $pagearray["monsterhp"] = "Monster's HP: " . $userrow["currentmonsterhp"] . "
";
- if ($userrow["currentmonsterhp"] <= 0) {
- db()->query('UPDATE users SET currentmonsterhp=0, currenthp=?, currentmp=? WHERE id=?;', [
- $userrow['currenthp'], $userrow['currentmp'], $userrow['id']
- ]);
- redirect('index.php?do=victory');
- }
-
- // Monster's turn.
- $pagearray["monsterturn"] = "";
- if ($userrow["currentmonstersleep"] != 0) { // Check to wake up.
- $chancetowake = rand(1,15);
- if ($chancetowake > $userrow["currentmonstersleep"]) {
- $userrow["currentmonstersleep"] = 0;
- $pagearray["monsterturn"] .= "The monster has woken up.
";
- } else {
- $pagearray["monsterturn"] .= "The monster is still asleep.
";
- }
- }
- if ($userrow["currentmonstersleep"] == 0) { // Only do this if the monster is awake.
- $tohit = ceil(rand($monsterrow["maxdam"]*.5,$monsterrow["maxdam"]));
- $toblock = ceil(rand($userrow["defensepower"]*.75,$userrow["defensepower"])/4);
- $tododge = rand(1,150);
- if ($tododge <= sqrt($userrow["dexterity"])) {
- $tohit = 0; $pagearray["monsterturn"] .= "You dodge the monster's attack. No damage has been scored.
";
- $persondamage = 0;
- } else {
- if ($tohit <= $toblock) { $tohit = $toblock + 1; }
- $persondamage = $tohit - $toblock;
- if ($userrow["currentuberdefense"] != 0) {
- $persondamage -= ceil($persondamage * ($userrow["currentuberdefense"]/100));
- }
- if ($persondamage < 1) { $persondamage = 1; }
- }
- $pagearray["monsterturn"] .= "The monster attacks you for $persondamage damage.
";
- $userrow["currenthp"] -= $persondamage;
- if ($userrow["currenthp"] <= 0) {
- $newgold = ceil($userrow["gold"]/2);
- $newhp = ceil($userrow["maxhp"]/4);
- db()->query("UPDATE users SET currenthp=?, currentaction='In Town', currentmonster=0, currentmonsterhp=0, currentmonstersleep=0, currentmonsterimmune=0, currentfight=0, latitude=0, longitude=0, gold=? WHERE id=?;", [
- $newhp, $newgold, $userrow['id']
- ]);
- $playerisdead = 1;
- }
- }
-
- // Do a monster's turn if person lost the chance to swing first. Serves him right!
- } elseif ( $chancetoswingfirst == 0 ) {
- $pagearray["yourturn"] = "The monster attacks before you are ready!
";
- $pagearray["monsterhp"] = "Monster's HP: " . $userrow["currentmonsterhp"] . "
";
- $pagearray["monsterturn"] = "";
- if ($userrow["currentmonstersleep"] != 0) { // Check to wake up.
- $chancetowake = rand(1,15);
- if ($chancetowake > $userrow["currentmonstersleep"]) {
- $userrow["currentmonstersleep"] = 0;
- $pagearray["monsterturn"] .= "The monster has woken up.
";
- } else {
- $pagearray["monsterturn"] .= "The monster is still asleep.
";
- }
- }
- if ($userrow["currentmonstersleep"] == 0) { // Only do this if the monster is awake.
- $tohit = ceil(rand($monsterrow["maxdam"]*.5,$monsterrow["maxdam"]));
- $toblock = ceil(rand($userrow["defensepower"]*.75,$userrow["defensepower"])/4);
- $tododge = rand(1,150);
- if ($tododge <= sqrt($userrow["dexterity"])) {
- $tohit = 0; $pagearray["monsterturn"] .= "You dodge the monster's attack. No damage has been scored.
";
- $persondamage = 0;
- } else {
- $persondamage = $tohit - $toblock;
- if ($persondamage < 1) { $persondamage = 1; }
- if ($userrow["currentuberdefense"] != 0) {
- $persondamage -= ceil($persondamage * ($userrow["currentuberdefense"]/100));
- }
- if ($persondamage < 1) { $persondamage = 1; }
- }
- $pagearray["monsterturn"] .= "The monster attacks you for $persondamage damage.
";
- $userrow["currenthp"] -= $persondamage;
- if ($userrow["currenthp"] <= 0) {
- $newgold = ceil($userrow["gold"]/2);
- $newhp = ceil($userrow["maxhp"]/4);
- db()->query("UPDATE users SET currenthp=?, currentaction='In Town', currentmonster=0, currentmonsterhp=0, currentmonstersleep=0, currentmonsterimmune=0, currentfight=0, latitude=0, longitude=0, gold=? WHERE id=?;", [
- $newhp, $newgold, $userrow['id']
- ]);
- $playerisdead = 1;
- }
- }
-
- } else {
- $pagearray["yourturn"] = "";
- $pagearray["monsterhp"] = "Monster's HP: " . $userrow["currentmonsterhp"] . "
";
- $pagearray["monsterturn"] = "";
}
- $newmonster = $userrow["currentmonster"];
+ // Fight action
+ if (isset($_POST["fight"])) {
+ // Player's attack
+ $min = (int)($userrow["attackpower"] * 0.75);
+ $max = (int)($userrow["attackpower"] / 3);
+ $tohit = (int)ceil(mt_rand(min($min, $max), max($min, $max)));
- $newmonsterhp = $userrow["currentmonsterhp"];
- $newmonstersleep = $userrow["currentmonstersleep"];
- $newmonsterimmune = $userrow["currentmonsterimmune"];
- $newuberdamage = $userrow["currentuberdamage"];
- $newuberdefense = $userrow["currentuberdefense"];
- $newfight = $userrow["currentfight"] + 1;
- $newhp = $userrow["currenthp"];
- $newmp = $userrow["currentmp"];
+ $toexcellent = rand(1,150);
+ if ($toexcellent <= sqrt($userrow["strength"])) {
+ $tohit *= 2;
+ $pagearray["yourturn"] .= "Excellent hit!
";
+ }
- if ($playerisdead != 1) {
- $pagearray["command"] = <<
-