From e5e4d3d42fdc1a16c890b9910fc2381443cfa0a2 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Mon, 27 May 2019 23:39:18 -0600 Subject: [PATCH] Add classes Place, Player, PlayerStats, Energy; add player_stats table --- api/apisettings.php | 6 ++ database.mwb | Bin 23361 -> 24379 bytes database/migrate_v1.sql | 20 ++++- lib/Energy.lib.php | 53 +++++++++++++ lib/Place.lib.php | 166 ++++++++++++++++++++++++++++++++++++++++ lib/Player.lib.php | 164 +++++++++++++++++++++++++++++++++++++++ lib/PlayerStats.lib.php | 102 ++++++++++++++++++++++++ 7 files changed, 510 insertions(+), 1 deletion(-) create mode 100644 lib/Energy.lib.php create mode 100644 lib/Place.lib.php create mode 100644 lib/Player.lib.php create mode 100644 lib/PlayerStats.lib.php diff --git a/api/apisettings.php b/api/apisettings.php index 89f689f..319ceaf 100644 --- a/api/apisettings.php +++ b/api/apisettings.php @@ -65,6 +65,12 @@ $APIS = [ "id" => "/[0-9]+/" ] ], + "placeact" => [ + "load" => "placeact.php", + "vars" => [ + "id" => "/[0-9]+/" + ] + ], "getchat" => [ "load" => "getchat.php", "vars" => [ diff --git a/database.mwb b/database.mwb index 0751eb3a055512161b9b7f7958d8a890c93fcacd..8a7db55899fbd82d97b031f016646d672869ccfb 100644 GIT binary patch literal 24379 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 literal 23361 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 = $energy; + $this->maxenergy = $max; + } + + public function getEnergy(): int { + return $this->energy; + } + + public function setEnergy(int $energy) { + if ($energy <= 0) { + $energy = 0; + } + if ($energy > $this->maxenergy) { + $energy = $this->maxenergy; + } + $this->energy = $energy; + } + + public function getMaxEnergy(): int { + return $this->maxenergy; + } + + public function setMaxEnergy(int $maxenergy) { + if ($maxenergy < 0) { + $maxenergy = 0; + } + if ($this->energy > $maxenergy) { + $this->energy = $maxenergy; + } + $this->maxenergy = $maxenergy; + } + +} diff --git a/lib/Place.lib.php b/lib/Place.lib.php new file mode 100644 index 0000000..24dab32 --- /dev/null +++ b/lib/Place.lib.php @@ -0,0 +1,166 @@ +osmid = $osmid; + $this->energy = new Energy(0, 100); + + if ($database->has("locations", ["osmid" => $osmid])) { + $game = $database->get("locations", ["locationid", "teamid", "ownerid", "osmid", "currentlife", "maxlife", "data", "lastactivity"], ["osmid" => $osmid]); + + $this->teamid = $game["teamid"]; + $this->ownerid = $game["ownerid"]; + $this->energy->setMaxEnergy($game["maxlife"]); + $this->energy->setEnergy($game["currentlife"]); + $this->data = $game["data"]; + $this->lastactivity = strtotime($game["lastactivity"]); + $this->gameexists = true; + } else { + $this->gameexists = false; + } + } + + /** + * Fetch IRL location data from the mapping server + * @global array $SETTINGS + * @return boolean True if successful, false on failure + */ + public function fetchIRLData(): bool { + global $SETTINGS; + + try { + $poiurl = $SETTINGS["poi"]["server"] . "?osmid=" . $this->osmid; + + $place = json_decode(file_get_contents($poiurl), true); + if ($place["type"] == "Feature") { + $this->name = $place["properties"]["name"]; + $this->longitude = $place["geometry"]["coordinates"][0]; + $this->latitude = $place["geometry"]["coordinates"][1]; + $this->placeexists = true; + return true; + } else { + $this->placeexists = false; + return false; + } + } catch (Exception $ex) { + $this->placeexists = false; + return false; + } + } + + /** + * Check if this place is claimed by a player/team. + * @return bool + */ + public function isClaimed(): bool { + if (empty($this->teamid)) { + return false; + } + if (empty($this->ownerid)) { + return false; + } + if ($this->energy->getEnergy() == 0) { + return false; + } + return true; + } + + /** + * Add the specified amount of energy to the place. + * @param int $diff + */ + public function changeEnergy(int $diff) { + $this->energy->setEnergy($this->energy->getEnergy() + $diff); + if ($this->energy->getEnergy() == 0) { + $this->unclaim(); + } + } + + public function getTeamID(): int { + return $this->teamid; + } + + /** + * Set the last activity on this place to now. + */ + public function updateLastActivity() { + $this->lastactivity = time(); + } + + /** + * Claim a place for the specified User. + * @param \Player $owner + */ + public function claim(\Player $owner) { + $this->energy = new Energy(25, 100); + $this->ownerid = $owner->getUID(); + $this->teamid = $owner->getTeamID(); + $this->updateLastActivity(); + } + + public function unclaim() { + $this->energy = new Energy(0, 0); + $this->ownerid = null; + $this->teamid = null; + $this->updateLastActivity(); + } + + public function save() { + global $database; + if ($this->gameexists) { + $database->update("locations", [ + "teamid" => $this->teamid, + "ownerid" => $this->ownerid, + "currentlife" => $this->energy->getEnergy(), + "maxlife" => $this->energy->getMaxEnergy(), + "lastactivity" => date("Y-m-d H:i:s", $this->lastactivity) + ], [ + "osmid" => $this->osmid + ] + ); + } else { + $database->insert("locations", [ + "teamid" => $this->teamid, + "ownerid" => $this->ownerid, + "currentlife" => $this->energy->getEnergy(), + "maxlife" => $this->energy->getMaxEnergy(), + "lastactivity" => date("Y-m-d H:i:s", $this->lastactivity), + "osmid" => $this->osmid + ]); + $this->gameexists = true; + } + } + +} diff --git a/lib/Player.lib.php b/lib/Player.lib.php new file mode 100644 index 0000000..9446bed --- /dev/null +++ b/lib/Player.lib.php @@ -0,0 +1,164 @@ +exists()) { + throw new InvalidArgumentException("User must exist."); + } + $this->user = $user; + + $this->energy = new Energy(100, 100); + $this->stats = new PlayerStats($user); + + if ($database->has("players", ["accountid" => $user->getUID()])) { + $profile = $database->get("players", ["accountid (id)", "nickname (name)", "level", "energy", "maxenergy", "teamid", "lastping", "stealth"], ["accountid" => $user->getUID()]); + $this->name = $profile["name"]; + $this->level = $profile["level"] * 1.0; + $this->energy->setMaxEnergy($profile["maxenergy"]); + $this->energy->setEnergy($profile["energy"]); + $this->teamid = $profile["teamid"]; + $this->lastping = strtotime($profile["lastping"]); + $this->stealth = $profile["stealth"] == true; + $this->exists = true; + } else { + $this->exists = false; + } + } + + public function exists(): bool { + return $this->exists; + } + + public function toArray(): array { + //"accountid (id)", "nickname (name)", "level", "energy", "maxenergy", "teamid" + return [ + "id" => $this->getUID(), + "name" => $this->name, + "level" => floor($this->level), + "energy" => $this->energy->getEnergy(), + "maxenergy" => $this->energy->getMaxEnergy(), + "teamid" => $this->getTeamID() + ]; + } + + public function getUID(): int { + return $this->user->getUID(); + } + + public function getLevel(): float { + return $this->level; + } + + public function getTeamID(): int { + return $this->teamid; + } + + public function setTeamID(int $id) { + $this->teamid = $id; + } + + public function getCredits(): int { + return $this->credits; + } + + /** + * Add the specified amount of energy to the player. + * @param int $diff + */ + public function changeEnergy(int $diff) { + $this->energy->setEnergy($this->energy->getEnergy() + $diff); + } + + /** + * Set the player's last ping time to now. + */ + public function doPing() { + $this->lastping = time(); + } + + /** + * Add experience to the user's level for doing something. + */ + public function addExp() { + $exp = pow(pow(floor($this->level * 1.0) + 1, 2), -1.2); + $this->level = $this->level + $exp; + $this->recalculateStats(); + } + + public function recalculateStats() { + $healthpercent = ($this->energy->getEnergy() * 1.0) / ($this->energy->getMaxEnergy() * 1.0); + + $maxenergy = $this->energy->getMaxEnergy(); + $this->energy->setMaxEnergy(floor($this->level) * 100); + + // If the max energy increased, adjust the current energy + // to the same percentage as it was before + if ($this->energy->getMaxEnergy() != $maxenergy) { + $this->energy->setEnergy($this->energy->getMaxEnergy() * $healthpercent); + } + } + + public function createPlayer() { + global $database; + + if ($this->exists) { + throw new Exception("This player already exists."); + } + $database->insert("players", [ + "accountid" => $this->user->getUID(), + "level" => $this->getLevel(), + "energy" => $this->energy->getEnergy(), + "maxenergy" => $this->energy->getMaxEnergy(), + "credits" => $this->getCredits(), + "lastping" => date("Y-m-d H:i:s", $this->lastping), + "teamid" => $this->getTeamID(), + "nickname" => $this->user->getName() + ]); + $this->stats->save(); + $this->exists = true; + } + + public function save() { + global $database; + if (!$this->exists) { + $this->createPlayer(); + return; + } + + $database->update("players", + [ + "level" => $this->getLevel(), + "energy" => $this->energy->getEnergy(), + "maxenergy" => $this->energy->getMaxEnergy(), + "credits" => $this->getCredits(), + "lastping" => date("Y-m-d H:i:s", $this->lastping), + "teamid" => $this->getTeamID(), + "nickname" => $this->user->getName() + ], + [ + "accountid" => $this->user->getUID() + ] + ); + $this->stats->save(); + } + +} diff --git a/lib/PlayerStats.lib.php b/lib/PlayerStats.lib.php new file mode 100644 index 0000000..d6becbb --- /dev/null +++ b/lib/PlayerStats.lib.php @@ -0,0 +1,102 @@ +userid = $user->getUID(); + + if ($database->has("player_stats", ["accountid" => $this->userid])) { + $stats = $database->get("player_stats", ["claims", "attacks", "defends", "scans", "distancekm"], ["accountid" => $this->userid]); + $this->claims = $stats["claims"]; + $this->attacks = $stats["attacks"]; + $this->defends = $stats["defends"]; + $this->scans = $stats["scans"]; + $this->distancekm = $stats["distancekm"]; + } + } + + public function getStat(int $stat) { + switch ($stat) { + case PlayerStats::CLAIMS: + return $this->claims; + case PlayerStats::ATTACKS: + return $this->attacks; + case PlayerStats::DEFENDS: + return $this->defends; + case PlayerStats::SCANS: + return $this->scans; + case PlayerStats::DISTANCEKM: + return $this->distancekm; + default: + return null; + } + } + + public function updateStat(int $stat, $diff) { + switch ($stat) { + case PlayerStats::CLAIMS: + $this->claims += $diff; + break; + case PlayerStats::ATTACKS: + $this->attacks += $diff; + break; + case PlayerStats::DEFENDS: + $this->defends += $diff; + break; + case PlayerStats::SCANS: + $this->scans += $diff; + break; + case PlayerStats::DISTANCEKM: + $this->distancekm += $diff; + break; + } + } + + public function save() { + global $database; + if ($database->has("player_stats", ["accountid" => $this->userid])) { + $database->update("player_stats", [ + "claims" => $this->claims, + "attacks" => $this->attacks, + "defends" => $this->defends, + "scans" => $this->scans, + "distancekm" => $this->distancekm + ], [ + "accountid" => $this->userid + ] + ); + } else { + $database->insert("player_stats", [ + "accountid" => $this->userid, + "claims" => $this->claims, + "attacks" => $this->attacks, + "defends" => $this->defends, + "scans" => $this->scans, + "distancekm" => $this->distancekm + ] + ); + } + } + +}