Finish towns refactor

This commit is contained in:
Sky Johnson 2024-12-12 10:13:29 -06:00
parent ea7e6e8646
commit b2ef29ca9c
3 changed files with 218 additions and 252 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
.installed
database.db
database.db-*

View File

@ -273,3 +273,23 @@ function get_town_by_xy(int $x, int $y): array|false
if ($query === false) return false;
return $query->fetchArray(SQLITE3_ASSOC);
}
/**
* Get a town's data by it's ID.
*/
function get_town_by_id(int $id): array|false
{
$query = db()->query('SELECT * FROM towns WHERE id = ? LIMIT 1;', [$id]);
if ($query === false) return false;
return $query->fetchArray(SQLITE3_ASSOC);
}
/**
* Get an item by it's ID.
*/
function get_item(int $id): array|false
{
$query = db()->query('SELECT * FROM items WHERE id=? LIMIT 1;', [$id]);
if ($query === false) return false;
return $query->fetchArray(SQLITE3_ASSOC);
}

View File

@ -28,40 +28,39 @@ function inn()
redirect('index.php');
} else {
$title = "Inn";
$page = "Resting at the inn will refill your current HP, MP, and TP to their maximum levels.<br /><br />\n";
$page .= "A night's sleep at this Inn will cost you <b>" . $townrow["innprice"] . " gold</b>. Is that ok?<br /><br />\n";
$page .= "<form action=\"index.php?do=inn\" method=\"post\">\n";
$page .= "<input type=\"submit\" name=\"submit\" value=\"Yes\" /> <input type=\"submit\" name=\"cancel\" value=\"No\" />\n";
$page .= "</form>\n";
$page = <<<HTML
Resting at the inn will refill your current HP, MP, and TP to their maximum levels.<br /><br />
A night's sleep at this Inn will cost you <b>{$townrow["innprice"]} gold</b>. Is that ok?<br /><br />
<form action="index.php?do=inn" method="post">
<input type="submit" name="submit" value="Yes" /> <input type="submit" name="cancel" value="No" />
</form>
HTML;
}
display($page, $title);
}
function buy() { // Displays a list of available items for purchase.
/**
* Displays a list of available items for purchase.
*/
function buy()
{
global $userrow;
global $userrow, $numqueries;
$townrow = get_town_by_xy($userrow['longitude'], $userrow['latitude']);
if ($townrow === false) display("Cheat attempt detected.<br /><br />Get a life, loser.", "Error");
$townquery = doquery("SELECT name,itemslist FROM {{table}} WHERE latitude='".$userrow["latitude"]."' AND longitude='".$userrow["longitude"]."' LIMIT 1", "towns");
if (mysql_num_rows($townquery) != 1) { display("Cheat attempt detected.<br /><br />Get a life, loser.", "Error"); }
$townrow = mysql_fetch_array($townquery);
$itemslist = explode(",",$townrow["itemslist"]);
$querystring = "";
foreach($itemslist as $a=>$b) {
$querystring .= "id='$b' OR ";
}
$querystring = rtrim($querystring, " OR ");
$itemsquery = doquery("SELECT * FROM {{table}} WHERE $querystring ORDER BY id", "items");
$items = db()->query("SELECT * FROM items WHERE id IN ({$townrow["itemslist"]});");
$page = "Buying weapons will increase your Attack Power. Buying armor and shields will increase your Defense Power.<br /><br />Click an item name to purchase it.<br /><br />The following items are available at this town:<br /><br />\n";
$page .= "<table width=\"80%\">\n";
while ($itemsrow = mysql_fetch_array($itemsquery)) {
if ($itemsrow["type"] == 1) { $attrib = "Attack Power:"; } else { $attrib = "Defense Power:"; }
while ($itemsrow = $items->fetchArray(SQLITE3_ASSOC)) {
$attrib = ($itemsrow["type"] == 1) ? "Attack Power:" : "Defense Power:";
$page .= "<tr><td width=\"4%\">";
if ($itemsrow["type"] == 1) { $page .= "<img src=\"images/icon_weapon.gif\" alt=\"weapon\" /></td>"; }
if ($itemsrow["type"] == 2) { $page .= "<img src=\"images/icon_armor.gif\" alt=\"armor\" /></td>"; }
if ($itemsrow["type"] == 3) { $page .= "<img src=\"images/icon_shield.gif\" alt=\"shield\" /></td>"; }
$page .= match ($itemsrow["type"]) {
1 => '<img src="images/icon_weapon.gif" alt="weapon" /></td>',
2 => '<img src="images/icon_armor.gif" alt="armor" /></td>',
3 => '<img src="images/icon_shield.gif" alt="shield" /></td>'
};
if ($userrow["weaponid"] == $itemsrow["id"] || $userrow["armorid"] == $itemsrow["id"] || $userrow["shieldid"] == $itemsrow["id"]) {
$page .= "<td width=\"32%\"><span class=\"light\">".$itemsrow["name"]."</span></td><td width=\"32%\"><span class=\"light\">$attrib ".$itemsrow["attribute"]."</span></td><td width=\"32%\"><span class=\"light\">Already purchased</span></td></tr>\n";
} else {
@ -74,210 +73,154 @@ function buy() { // Displays a list of available items for purchase.
$title = "Buy Items";
display($page, $title);
}
function buy2($id) { // Confirm user's intent to purchase item.
/**
* Confirm user's intent to purchase item.
*/
function buy2($id)
{
global $userrow;
global $userrow, $numqueries;
$townquery = doquery("SELECT name,itemslist FROM {{table}} WHERE latitude='".$userrow["latitude"]."' AND longitude='".$userrow["longitude"]."' LIMIT 1", "towns");
if (mysql_num_rows($townquery) != 1) { display("Cheat attempt detected.<br /><br />Get a life, loser.", "Error"); }
$townrow = mysql_fetch_array($townquery);
$townrow = get_town_by_xy($userrow['longitude'], $userrow['latitude']);
if ($townrow === false) display("Cheat attempt detected.<br /><br />Get a life, loser.", "Error");
$townitems = explode(",", $townrow["itemslist"]);
if (! in_array($id, $townitems)) { display("Cheat attempt detected.<br /><br />Get a life, loser.", "Error"); }
if (!in_array($id, $townitems)) display("Cheat attempt detected.<br /><br />Get a life, loser.", "Error");
$itemsquery = doquery("SELECT * FROM {{table}} WHERE id='$id' LIMIT 1", "items");
$itemsrow = mysql_fetch_array($itemsquery);
$item = get_item($id);
if ($userrow["gold"] < $itemsrow["buycost"]) { display("You do not have enough gold to buy this item.<br /><br />You may return to <a href=\"index.php\">town</a>, <a href=\"index.php?do=buy\">store</a>, or use the direction buttons on the left to start exploring.", "Buy Items"); die(); }
if ($userrow["gold"] < $item["buycost"]) {
display("You do not have enough gold to buy this item.<br /><br />You may return to <a href=\"index.php\">town</a>, <a href=\"index.php?do=buy\">store</a>, or use the direction buttons on the left to start exploring.", "Buy Items");
}
if ($itemsrow["type"] == 1) {
if ($userrow["weaponid"] != 0) {
$itemsquery2 = doquery("SELECT * FROM {{table}} WHERE id='".$userrow["weaponid"]."' LIMIT 1", "items");
$itemsrow2 = mysql_fetch_array($itemsquery2);
$page = "If you are buying the ".$itemsrow["name"].", then I will buy your ".$itemsrow2["name"]." for ".ceil($itemsrow2["buycost"]/2)." gold. Is that ok?<br /><br /><form action=\"index.php?do=buy3:$id\" method=\"post\"><input type=\"submit\" name=\"submit\" value=\"Yes\" /> <input type=\"submit\" name=\"cancel\" value=\"No\" /></form>";
$type_to_row_mapping = [1 => 'weaponid', 2 => 'armorid', 3 => 'shieldid'];
$current_equipped_id = $userrow[$type_to_row_mapping[$item['type']] ?? 0];
if ($current_equipped_id != 0) {
$item2 = get_item($current_equipped_id);
$page = "If you are buying the ".$item["name"].", then I will buy your ".$item2["name"]." for ".ceil($item2["buycost"] / 2)." gold. Is that ok?<br /><br /><form action=\"index.php?do=buy3:$id\" method=\"post\"><input type=\"submit\" name=\"submit\" value=\"Yes\" /> <input type=\"submit\" name=\"cancel\" value=\"No\" /></form>";
} else {
$page = "You are buying the ".$itemsrow["name"].", is that ok?<br /><br /><form action=\"index.php?do=buy3:$id\" method=\"post\"><input type=\"submit\" name=\"submit\" value=\"Yes\" /> <input type=\"submit\" name=\"cancel\" value=\"No\" /></form>";
}
} elseif ($itemsrow["type"] == 2) {
if ($userrow["armorid"] != 0) {
$itemsquery2 = doquery("SELECT * FROM {{table}} WHERE id='".$userrow["armorid"]."' LIMIT 1", "items");
$itemsrow2 = mysql_fetch_array($itemsquery2);
$page = "If you are buying the ".$itemsrow["name"].", then I will buy your ".$itemsrow2["name"]." for ".ceil($itemsrow2["buycost"]/2)." gold. Is that ok?<br /><br /><form action=\"index.php?do=buy3:$id\" method=\"post\"><input type=\"submit\" name=\"submit\" value=\"Yes\" /> <input type=\"submit\" name=\"cancel\" value=\"No\" /></form>";
} else {
$page = "You are buying the ".$itemsrow["name"].", is that ok?<br /><br /><form action=\"index.php?do=buy3:$id\" method=\"post\"><input type=\"submit\" name=\"submit\" value=\"Yes\" /> <input type=\"submit\" name=\"cancel\" value=\"No\" /></form>";
}
} elseif ($itemsrow["type"] == 3) {
if ($userrow["shieldid"] != 0) {
$itemsquery2 = doquery("SELECT * FROM {{table}} WHERE id='".$userrow["shieldid"]."' LIMIT 1", "items");
$itemsrow2 = mysql_fetch_array($itemsquery2);
$page = "If you are buying the ".$itemsrow["name"].", then I will buy your ".$itemsrow2["name"]." for ".ceil($itemsrow2["buycost"]/2)." gold. Is that ok?<br /><br /><form action=\"index.php?do=buy3:$id\" method=\"post\"><input type=\"submit\" name=\"submit\" value=\"Yes\" /> <input type=\"submit\" name=\"cancel\" value=\"No\" /></form>";
} else {
$page = "You are buying the ".$itemsrow["name"].", is that ok?<br /><br /><form action=\"index.php?do=buy3:$id\" method=\"post\"><input type=\"submit\" name=\"submit\" value=\"Yes\" /> <input type=\"submit\" name=\"cancel\" value=\"No\" /></form>";
}
$page = "You are buying the ".$item["name"].", is that ok?<br /><br /><form action=\"index.php?do=buy3:$id\" method=\"post\"><input type=\"submit\" name=\"submit\" value=\"Yes\" /> <input type=\"submit\" name=\"cancel\" value=\"No\" /></form>";
}
$title = "Buy Items";
display($page, $title);
display($page, "Buy Items");
}
function buy3($id) { // Update user profile with new item & stats.
/**
* Update user profile with new item & stats.
*/
function buy3($id)
{
if (isset($_POST["cancel"])) { header("Location: index.php"); die(); }
if (isset($_POST["cancel"])) redirect('index.php');
global $userrow;
$townquery = doquery("SELECT name,itemslist FROM {{table}} WHERE latitude='".$userrow["latitude"]."' AND longitude='".$userrow["longitude"]."' LIMIT 1", "towns");
if (mysql_num_rows($townquery) != 1) { display("Cheat attempt detected.<br /><br />Get a life, loser.", "Error"); }
$townrow = mysql_fetch_array($townquery);
$townrow = get_town_by_xy($userrow['longitude'], $userrow['latitude']);
if ($townrow === false) display("Cheat attempt detected.<br /><br />Get a life, loser.", "Error");
$townitems = explode(",", $townrow["itemslist"]);
if (! in_array($id, $townitems)) { display("Cheat attempt detected.<br /><br />Get a life, loser.", "Error"); }
if (!in_array($id, $townitems)) display("Cheat attempt detected.<br /><br />Get a life, loser.", "Error");
$itemsquery = doquery("SELECT * FROM {{table}} WHERE id='$id' LIMIT 1", "items");
$itemsrow = mysql_fetch_array($itemsquery);
$item = get_item($id);
if ($userrow["gold"] < $itemsrow["buycost"]) { display("You do not have enough gold to buy this item.<br /><br />You may return to <a href=\"index.php\">town</a>, <a href=\"index.php?do=buy\">store</a>, or use the direction buttons on the left to start exploring.", "Buy Items"); die(); }
if ($userrow["gold"] < $item["buycost"]) {
display("You do not have enough gold to buy this item.<br /><br />You may return to <a href=\"index.php\">town</a>, <a href=\"index.php?do=buy\">store</a>, or use the direction buttons on the left to start exploring.", "Buy Items");
}
if ($itemsrow["type"] == 1) { // weapon
$type_mapping = [
1 => ['id' => 'weaponid', 'name' => 'weaponname', 'power' => 'attackpower'],
2 => ['id' => 'armorid', 'name' => 'armorname', 'power' => 'defensepower'],
3 => ['id' => 'shieldid', 'name' => 'shieldname', 'power' => 'defensepower']
];
// Check if they already have an item in the slot.
if ($userrow["weaponid"] != 0) {
$itemsquery2 = doquery("SELECT * FROM {{table}} WHERE id='".$userrow["weaponid"]."' LIMIT 1", "items");
$itemsrow2 = mysql_fetch_array($itemsquery2);
// Validate item type
if (!isset($type_mapping[$item["type"]])) {
display("Invalid item type.", "Error");
}
// Retrieve current equipped item or create a default
$current_equip_id = $userrow[$type_mapping[$item["type"]]['id']];
if ($current_equip_id != 0) {
$item2 = get_item($current_equip_id);
} else {
$itemsrow2 = array("attribute"=>0,"buycost"=>0,"special"=>"X");
$item2 = ["attribute" => 0, "buycost" => 0, "special" => "X"];
}
// Special item fields.
$specialchange1 = "";
$specialchange2 = "";
if ($itemsrow["special"] != "X") {
$special = explode(",",$itemsrow["special"]);
$tochange = $special[0];
$userrow[$tochange] = $userrow[$tochange] + $special[1];
$specialchange1 = "$tochange='".$userrow[$tochange]."',";
if ($tochange == "strength") { $userrow["attackpower"] += $special[1]; }
if ($tochange == "dexterity") { $userrow["defensepower"] += $special[1]; }
// Process special item effects
$specialFields = [];
$specialValues = [];
$powerAdjustments = 0;
foreach ([$item, $item2] as $index => $process_item) {
if ($process_item["special"] != "X") {
$special = explode(",", $process_item["special"]);
$toChange = $special[0];
$changeAmount = $index === 0 ? $special[1] : -$special[1];
$userrow[$toChange] += $changeAmount;
$specialFields[] = "$toChange = ?";
$specialValues[] = $userrow[$toChange];
// Adjust attack or defense power
if ($toChange == "strength" || $toChange == "dexterity") {
$powerType = $toChange == "strength" ? "attackpower" : "defensepower";
$powerAdjustments += $changeAmount;
}
}
if ($itemsrow2["special"] != "X") {
$special2 = explode(",",$itemsrow2["special"]);
$tochange2 = $special2[0];
$userrow[$tochange2] = $userrow[$tochange2] - $special2[1];
$specialchange2 = "$tochange2='".$userrow[$tochange2]."',";
if ($tochange2 == "strength") { $userrow["attackpower"] -= $special2[1]; }
if ($tochange2 == "dexterity") { $userrow["defensepower"] -= $special2[1]; }
}
// New stats.
$newgold = $userrow["gold"] + ceil($itemsrow2["buycost"]/2) - $itemsrow["buycost"];
$newattack = $userrow["attackpower"] + $itemsrow["attribute"] - $itemsrow2["attribute"];
$newid = $itemsrow["id"];
$newname = $itemsrow["name"];
$userid = $userrow["id"];
if ($userrow["currenthp"] > $userrow["maxhp"]) { $newhp = $userrow["maxhp"]; } else { $newhp = $userrow["currenthp"]; }
if ($userrow["currentmp"] > $userrow["maxmp"]) { $newmp = $userrow["maxmp"]; } else { $newmp = $userrow["currentmp"]; }
if ($userrow["currenttp"] > $userrow["maxtp"]) { $newtp = $userrow["maxtp"]; } else { $newtp = $userrow["currenttp"]; }
// Determine power and type-specific updates
$currentType = $type_mapping[$item["type"]];
$powerField = $currentType['power'];
$newPower = $userrow[$powerField] + $item["attribute"] - $item2["attribute"];
// Final update.
$updatequery = doquery("UPDATE {{table}} SET $specialchange1 $specialchange2 gold='$newgold', attackpower='$newattack', weaponid='$newid', weaponname='$newname', currenthp='$newhp', currentmp='$newmp', currenttp='$newtp' WHERE id='$userid' LIMIT 1", "users");
// Calculate new gold with trade-in value
$newGold = $userrow["gold"] + ceil($item2["buycost"]/2) - $item["buycost"];
} elseif ($itemsrow["type"] == 2) { // Armor
// Ensure current HP/MP/TP don't exceed max values
$newhp = min($userrow["currenthp"], $userrow["maxhp"]);
$newmp = min($userrow["currentmp"], $userrow["maxmp"]);
$newtp = min($userrow["currenttp"], $userrow["maxtp"]);
// Check if they already have an item in the slot.
if ($userrow["armorid"] != 0) {
$itemsquery2 = doquery("SELECT * FROM {{table}} WHERE id='".$userrow["armorid"]."' LIMIT 1", "items");
$itemsrow2 = mysql_fetch_array($itemsquery2);
} else {
$itemsrow2 = array("attribute"=>0,"buycost"=>0,"special"=>"X");
}
$updateFields = array_merge(
$specialFields,
[
"gold = ?",
"{$powerField} = ?",
"{$currentType['id']} = ?",
"{$currentType['name']} = ?",
"currenthp = ?",
"currentmp = ?",
"currenttp = ?"
]
);
// Special item fields.
$specialchange1 = "";
$specialchange2 = "";
if ($itemsrow["special"] != "X") {
$special = explode(",",$itemsrow["special"]);
$tochange = $special[0];
$userrow[$tochange] = $userrow[$tochange] + $special[1];
$specialchange1 = "$tochange='".$userrow[$tochange]."',";
if ($tochange == "strength") { $userrow["attackpower"] += $special[1]; }
if ($tochange == "dexterity") { $userrow["defensepower"] += $special[1]; }
}
if ($itemsrow2["special"] != "X") {
$special2 = explode(",",$itemsrow2["special"]);
$tochange2 = $special2[0];
$userrow[$tochange2] = $userrow[$tochange2] - $special2[1];
$specialchange2 = "$tochange2='".$userrow[$tochange2]."',";
if ($tochange2 == "strength") { $userrow["attackpower"] -= $special2[1]; }
if ($tochange2 == "dexterity") { $userrow["defensepower"] -= $special2[1]; }
}
$updateValues = array_merge(
$specialValues,
[
$newGold,
$newPower,
$item["id"],
$item["name"],
$newhp,
$newmp,
$newtp,
$userrow["id"]
]
);
// New stats.
$newgold = $userrow["gold"] + ceil($itemsrow2["buycost"]/2) - $itemsrow["buycost"];
$newdefense = $userrow["defensepower"] + $itemsrow["attribute"] - $itemsrow2["attribute"];
$newid = $itemsrow["id"];
$newname = $itemsrow["name"];
$userid = $userrow["id"];
if ($userrow["currenthp"] > $userrow["maxhp"]) { $newhp = $userrow["maxhp"]; } else { $newhp = $userrow["currenthp"]; }
if ($userrow["currentmp"] > $userrow["maxmp"]) { $newmp = $userrow["maxmp"]; } else { $newmp = $userrow["currentmp"]; }
if ($userrow["currenttp"] > $userrow["maxtp"]) { $newtp = $userrow["maxtp"]; } else { $newtp = $userrow["currenttp"]; }
// Final update.
$updatequery = doquery("UPDATE {{table}} SET $specialchange1 $specialchange2 gold='$newgold', defensepower='$newdefense', armorid='$newid', armorname='$newname', currenthp='$newhp', currentmp='$newmp', currenttp='$newtp' WHERE id='$userid' LIMIT 1", "users");
} elseif ($itemsrow["type"] == 3) { // Shield
// Check if they already have an item in the slot.
if ($userrow["shieldid"] != 0) {
$itemsquery2 = doquery("SELECT * FROM {{table}} WHERE id='".$userrow["shieldid"]."' LIMIT 1", "items");
$itemsrow2 = mysql_fetch_array($itemsquery2);
} else {
$itemsrow2 = array("attribute"=>0,"buycost"=>0,"special"=>"X");
}
// Special item fields.
$specialchange1 = "";
$specialchange2 = "";
if ($itemsrow["special"] != "X") {
$special = explode(",",$itemsrow["special"]);
$tochange = $special[0];
$userrow[$tochange] = $userrow[$tochange] + $special[1];
$specialchange1 = "$tochange='".$userrow[$tochange]."',";
if ($tochange == "strength") { $userrow["attackpower"] += $special[1]; }
if ($tochange == "dexterity") { $userrow["defensepower"] += $special[1]; }
}
if ($itemsrow2["special"] != "X") {
$special2 = explode(",",$itemsrow2["special"]);
$tochange2 = $special2[0];
$userrow[$tochange2] = $userrow[$tochange2] - $special2[1];
$specialchange2 = "$tochange2='".$userrow[$tochange2]."',";
if ($tochange2 == "strength") { $userrow["attackpower"] -= $special2[1]; }
if ($tochange2 == "dexterity") { $userrow["defensepower"] -= $special2[1]; }
}
// New stats.
$newgold = $userrow["gold"] + ceil($itemsrow2["buycost"]/2) - $itemsrow["buycost"];
$newdefense = $userrow["defensepower"] + $itemsrow["attribute"] - $itemsrow2["attribute"];
$newid = $itemsrow["id"];
$newname = $itemsrow["name"];
$userid = $userrow["id"];
if ($userrow["currenthp"] > $userrow["maxhp"]) { $newhp = $userrow["maxhp"]; } else { $newhp = $userrow["currenthp"]; }
if ($userrow["currentmp"] > $userrow["maxmp"]) { $newmp = $userrow["maxmp"]; } else { $newmp = $userrow["currentmp"]; }
if ($userrow["currenttp"] > $userrow["maxtp"]) { $newtp = $userrow["maxtp"]; } else { $newtp = $userrow["currenttp"]; }
// Final update.
$updatequery = doquery("UPDATE {{table}} SET $specialchange1 $specialchange2 gold='$newgold', defensepower='$newdefense', shieldid='$newid', shieldname='$newname', currenthp='$newhp', currentmp='$newmp', currenttp='$newtp' WHERE id='$userid' LIMIT 1", "users");
}
$stmt = db()->query("UPDATE users SET " . implode(", ", $updateFields) . " WHERE id = ?;", $updateValues);
if ($stmt === false) exit("Failed to purchase and equip $id. Go back and try again.");
display("Thank you for purchasing this item.<br /><br />You may return to <a href=\"index.php\">town</a>, <a href=\"index.php?do=buy\">store</a>, or use the direction buttons on the left to start exploring.", "Buy Items");
}
function maps() { // List maps the user can buy.
global $userrow, $numqueries;
/**
* List maps the user can buy.
*/
function maps()
{
global $userrow;
$mappedtowns = explode(",", $userrow["towns"]);
@ -285,86 +228,92 @@ function maps() { // List maps the user can buy.
$page .= "Click a town name to purchase its map.<br /><br />\n";
$page .= "<table width=\"90%\">\n";
$townquery = doquery("SELECT * FROM {{table}} ORDER BY id", "towns");
while ($townrow = mysql_fetch_array($townquery)) {
if ($townrow["latitude"] >= 0) { $latitude = $townrow["latitude"] . "N,"; } else { $latitude = ($townrow["latitude"]*-1) . "S,"; }
if ($townrow["longitude"] >= 0) { $longitude = $townrow["longitude"] . "E"; } else { $longitude = ($townrow["longitude"]*-1) . "W"; }
$towns = db()->query('SELECT * FROM towns ORDER BY id;');
while ($townrow = $towns->fetchArray(SQLITE3_ASSOC)) {
$latitude = ($townrow["latitude"] >= 0) ? $townrow["latitude"] . "N," : ($townrow["latitude"] * -1) . "S,";
$longitude = ($townrow["longitude"] >= 0) ? $townrow["longitude"] . "E" : ($townrow["longitude"] * -1) . "W";
$mapped = false;
foreach($mappedtowns as $a => $b) {
if ($b == $townrow["id"]) { $mapped = true; }
}
foreach($mappedtowns as $b) if ($b == $townrow["id"]) $mapped = true;
if ($mapped == false) {
$page .= "<tr><td width=\"25%\"><a href=\"index.php?do=maps2:".$townrow["id"]."\">".$townrow["name"]."</a></td><td width=\"25%\">Price: ".$townrow["mapprice"]." gold</td><td width=\"50%\" colspan=\"2\">Buy map to reveal details.</td></tr>\n";
} else {
$page .= "<tr><td width=\"25%\"><span class=\"light\">".$townrow["name"]."</span></td><td width=\"25%\"><span class=\"light\">Already mapped.</span></td><td width=\"35%\"><span class=\"light\">Location: $latitude $longitude</span></td><td width=\"15%\"><span class=\"light\">TP: ".$townrow["travelpoints"]."</span></td></tr>\n";
}
}
$page .= "</table><br />\n";
$page .= "If you've changed your mind, you may also return back to <a href=\"index.php\">town</a>.\n";
display($page, "Buy Maps");
}
function maps2($id) { // Confirm user's intent to purchase map.
/**
* Confirm user's intent to purchase map.
*/
function maps2($id)
{
global $userrow;
global $userrow, $numqueries;
$townrow = get_town_by_id($id);
$townquery = doquery("SELECT name,mapprice FROM {{table}} WHERE id='$id' LIMIT 1", "towns");
$townrow = mysql_fetch_array($townquery);
if ($userrow["gold"] < $townrow["mapprice"]) { display("You do not have enough gold to buy this map.<br /><br />You may return to <a href=\"index.php\">town</a>, <a href=\"index.php?do=maps\">store</a>, or use the direction buttons on the left to start exploring.", "Buy Maps"); die(); }
if ($userrow["gold"] < $townrow["mapprice"]) {
display("You do not have enough gold to buy this map.<br /><br />You may return to <a href=\"index.php\">town</a>, <a href=\"index.php?do=maps\">store</a>, or use the direction buttons on the left to start exploring.", "Buy Maps");
}
$page = "You are buying the ".$townrow["name"]." map. Is that ok?<br /><br /><form action=\"index.php?do=maps3:$id\" method=\"post\"><input type=\"submit\" name=\"submit\" value=\"Yes\" /> <input type=\"submit\" name=\"cancel\" value=\"No\" /></form>";
display($page, "Buy Maps");
}
function maps3($id) { // Add new map to user's profile.
/**
* Add new map to user's profile.
*/
function maps3($id)
{
if (isset($_POST["cancel"])) redirect('index.php');
if (isset($_POST["cancel"])) { header("Location: index.php"); die(); }
global $userrow;
global $userrow, $numqueries;
$townrow = get_town_by_id($id);
$townquery = doquery("SELECT name,mapprice FROM {{table}} WHERE id='$id' LIMIT 1", "towns");
$townrow = mysql_fetch_array($townquery);
if ($userrow["gold"] < $townrow["mapprice"]) { display("You do not have enough gold to buy this map.<br /><br />You may return to <a href=\"index.php\">town</a>, <a href=\"index.php?do=maps\">store</a>, or use the direction buttons on the left to start exploring.", "Buy Maps"); die(); }
if ($userrow["gold"] < $townrow["mapprice"]) {
display("You do not have enough gold to buy this map.<br /><br />You may return to <a href=\"index.php\">town</a>, <a href=\"index.php?do=maps\">store</a>, or use the direction buttons on the left to start exploring.", "Buy Maps");
}
$mappedtowns = $userrow["towns"].",$id";
$newgold = $userrow["gold"] - $townrow["mapprice"];
$updatequery = doquery("UPDATE {{table}} SET towns='$mappedtowns',gold='$newgold' WHERE id='".$userrow["id"]."' LIMIT 1", "users");
db()->query('UPDATE users SET towns=?, gold=? WHERE id=?;', [$mappedtowns, $newgold, $userrow['id']]);
display("Thank you for purchasing this map.<br /><br />You may return to <a href=\"index.php\">town</a>, <a href=\"index.php?do=maps\">store</a>, or use the direction buttons on the left to start exploring.", "Buy Maps");
}
function travelto($id, $usepoints=true) { // Send a user to a town from the Travel To menu.
/**
* Send a user to a town from the Travel To menu.
*/
function travelto($id, bool $usepoints = true)
{
global $userrow;
global $userrow, $numqueries;
if ($userrow["currentaction"] == "Fighting") redirect('index.php?do=fight');
if ($userrow["currentaction"] == "Fighting") { header("Location: index.php?do=fight"); die(); }
$townrow = get_town_by_id($id);
$townquery = doquery("SELECT name,travelpoints,latitude,longitude FROM {{table}} WHERE id='$id' LIMIT 1", "towns");
$townrow = mysql_fetch_array($townquery);
if ($usepoints==true) {
if ($usepoints) {
if ($userrow["currenttp"] < $townrow["travelpoints"]) {
display("You do not have enough TP to travel here. Please go back and try again when you get more TP.", "Travel To"); die();
display("You do not have enough TP to travel here. Please go back and try again when you get more TP.", "Travel To");
}
$mapped = explode(",",$userrow["towns"]);
if (!in_array($id, $mapped)) { display("Cheat attempt detected.<br /><br />Get a life, loser.", "Error"); }
}
if (($userrow["latitude"] == $townrow["latitude"]) && ($userrow["longitude"] == $townrow["longitude"])) { display("You are already in this town. <a href=\"index.php\">Click here</a> to return to the main town screen.", "Travel To"); die(); }
if (($userrow["latitude"] == $townrow["latitude"]) && ($userrow["longitude"] == $townrow["longitude"])) {
display("You are already in this town. <a href=\"index.php\">Click here</a> to return to the main town screen.", "Travel To");
}
if ($usepoints == true) { $newtp = $userrow["currenttp"] - $townrow["travelpoints"]; } else { $newtp = $userrow["currenttp"]; }
$newtp = ($usepoints) ? $userrow["currenttp"] - $townrow["travelpoints"] : $userrow["currenttp"];
$newlat = $townrow["latitude"];
$newlon = $townrow["longitude"];
@ -373,20 +322,16 @@ function travelto($id, $usepoints=true) { // Send a user to a town from the Trav
// If they got here by exploring, add this town to their map.
$mapped = explode(",",$userrow["towns"]);
$town = false;
foreach($mapped as $a => $b) {
if ($b == $id) { $town = true; }
}
foreach($mapped as $b) if ($b == $id) $town = true;
$mapped = implode(",", $mapped);
if ($town == false) {
$mapped .= ",$id";
$mapped = "towns='".$mapped."',";
} else {
$mapped = "towns='".$mapped."',";
}
if ($town == false) $mapped .= ",$id";
$updatequery = doquery("UPDATE {{table}} SET currentaction='In Town',$mapped currenttp='$newtp',latitude='$newlat',longitude='$newlon' WHERE id='$newid' LIMIT 1", "users");
$mapped = "towns='".$mapped."',";
db()->query("UPDATE users SET currentaction='In Town',$mapped currenttp=?, latitude=?, longitude=? WHERE id=?;", [
$newtp, $newlat, $newlon, $newid
]);
$page = "You have travelled to ".$townrow["name"].". You may now <a href=\"index.php\">enter this town</a>.";
display($page, "Travel To");
}