From 1c8629abd2bd8fdcc29fe50d358c176bbfb2e3a3 Mon Sep 17 00:00:00 2001 From: piernov Date: Mon, 25 Apr 2016 12:31:00 +0200 Subject: Account already debited --- inc/shop.inc | 1 - 1 file changed, 1 deletion(-) (limited to 'inc') diff --git a/inc/shop.inc b/inc/shop.inc index 11cf97b..a0f9a8a 100644 --- a/inc/shop.inc +++ b/inc/shop.inc @@ -42,7 +42,6 @@ function buildShop() { } elseif(debitAccount($shop["cost"])) { initShop(); - $_SESSION["mine"]["gold"] -= $shop["cost"]; echo json_encode(sendShop()); } } -- cgit v1.2.3-70-g09d2 From 349c6fe7ecf10e5929dc27c2446853f0fe416077 Mon Sep 17 00:00:00 2001 From: alexichi Date: Wed, 27 Apr 2016 12:59:51 +0200 Subject: add loadShop() and categories in the xml file and modify the presentation of the items in the shop --- data/items.xml | 41 +++++++++++++++++++++++++++++++++++++++++ inc/shop.inc | 36 +++++++++++++++++++++--------------- js/shop.js | 24 ++++++++++++++++-------- 3 files changed, 78 insertions(+), 23 deletions(-) create mode 100644 data/items.xml (limited to 'inc') diff --git a/data/items.xml b/data/items.xml new file mode 100644 index 0000000..528d37a --- /dev/null +++ b/data/items.xml @@ -0,0 +1,41 @@ + + + + + Wooden Sword + 50 + + 10 + + + A sword that beginners need to use to improve their skills + + + Metal Sword + 200 + + 30 + + + A sword which are often use buy skilled knight. The material is very good and the sword is very powerful + + + + + Life Bottle + 100 + + 🍶 + A bottle which can heal you by regaining hp + + + Strength Bottle + 250 + + 20 + + 🍶 + If used, you have 20% more chance to hit your enemy during the battle + + + diff --git a/inc/shop.inc b/inc/shop.inc index 11cf97b..6e30923 100644 --- a/inc/shop.inc +++ b/inc/shop.inc @@ -5,19 +5,26 @@ require_once("account.inc"); require_once("Item.inc"); require_once("Inventory.inc"); -$shop = array( - "cost" => 3, - "items" => array( - new Item("cat", 6, "🐈", "Nyan!"), - new Item("torch", 3, "🔦", "Electric torch"), - ), -); +function loadShop(){ + $items = simplexml_load_file('data/items.xml'); + $shop = array("cost"=>(string)$items["cost"],"items"=>array()); + foreach($items as $cat){ + $category = (string)$cat["name"]; + $shop["items"][$category] = array(); + foreach($cat as $item){ + $shop["items"][$category][] = new Item((string)$item->name,intval($item->cost),(string)$item->icon,(string)$item->description); + } + } + return $shop; +} function getItem($name) { - global $shop; - foreach($shop["items"] as $item) { - if($name == $item->name) { - return $item; + $shop=loadShop(); + foreach($shop["items"] as $cat) { + foreach($cat as $item){ + if($name == $item->name) { + return $item; + } } } sendError("shop_missing_item"); @@ -29,21 +36,20 @@ function initShop() { } function sendShop() { - global $shop; if(!empty($_SESSION["shop"])) - return $shop; + return loadShop(); else return false; } function buildShop() { - global $shop; + $shop=loadShop(); if(!empty($_SESSION["shop"])) { sendError("shop_already_built"); } elseif(debitAccount($shop["cost"])) { initShop(); $_SESSION["mine"]["gold"] -= $shop["cost"]; - echo json_encode(sendShop()); + echo json_encode($shop); } } diff --git a/js/shop.js b/js/shop.js index 22ca85f..efd6ac5 100644 --- a/js/shop.js +++ b/js/shop.js @@ -1,12 +1,20 @@ function displayShop(ret) { - var tmphtml = "

Select an item to buy it:

"; - tmphtml += "" document.getElementById("tab2").innerHTML = tmphtml; } @@ -40,7 +48,7 @@ function addItem(ret) { } else invcontent.getElementsByTagName('ul')[0].innerHTML += itemhtml; - showInfo(ret.desc); + showInfo("The "+ ret.name + " has been successfully purchased"); } function buyItem(name) { -- cgit v1.2.3-70-g09d2 From a639278fcf395dd7349886785d56dee63c3a8774 Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 27 Apr 2016 20:00:13 +0200 Subject: Add sendInfo() from PHP --- inc/messages.inc | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'inc') diff --git a/inc/messages.inc b/inc/messages.inc index d6ea87e..5b1631f 100644 --- a/inc/messages.inc +++ b/inc/messages.inc @@ -8,10 +8,18 @@ $messages = array( "guild_already_built" => "You have aready built a guild." ); -function sendError($msg) { +function sendMessage($type, $msg) { global $messages; $text = $messages[$msg]; - echo json_encode(array("error" => $text)); + echo json_encode(array($type => $text)); +} + +function sendError($msg) { + sendMessage("error", $msg); +} + +function sendInfo($msg) { + sendMessage("info", $msg); } ?> -- cgit v1.2.3-70-g09d2 From 3d59c6ceca1c5b05b304e1f8146e32d701a17acc Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 27 Apr 2016 20:02:28 +0200 Subject: Add addToXML() methods on Inventory and Item objects --- inc/Inventory.inc | 5 +++++ inc/Item.inc | 8 ++++++++ 2 files changed, 13 insertions(+) (limited to 'inc') diff --git a/inc/Inventory.inc b/inc/Inventory.inc index efe54f2..0a93d7f 100644 --- a/inc/Inventory.inc +++ b/inc/Inventory.inc @@ -36,6 +36,11 @@ class Inventory { $inv = self::get(); $inv->_removeItem($item); } + + public function addToXML($root) { + foreach($this->items as $item) + $item->addToXML($root); + } } ?> diff --git a/inc/Item.inc b/inc/Item.inc index bf77818..bef6d00 100644 --- a/inc/Item.inc +++ b/inc/Item.inc @@ -12,6 +12,14 @@ class Item { $this->icon = $icon; $this->desc = $desc; } + + function addToXML($root) { + $item = $root->addChild("item"); + $item->addChild("name", $this->name); + $item->addChild("cost", $this->cost); + $item->addChild("icon", $this->icon); + $item->addChild("desc", $this->desc); + } } ?> -- cgit v1.2.3-70-g09d2 From 5cba16a79d041000fe482ae69e36577220d63d56 Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 27 Apr 2016 20:39:02 +0200 Subject: Add messages for savegame --- inc/messages.inc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'inc') diff --git a/inc/messages.inc b/inc/messages.inc index 5b1631f..9f3a09d 100644 --- a/inc/messages.inc +++ b/inc/messages.inc @@ -5,7 +5,10 @@ $messages = array( "gold_insufficient" => "You don't have enough gold.", "shop_missing_item" => "This item does not exist.", "guild_not_yet_created" => "You need to create a guild first.", - "guild_already_built" => "You have aready built a guild." + "guild_already_built" => "You have aready built a guild.", + + "gamesave_ok" => "Game saved.", + "gamesave_error" => "An error occured when trying to save the game.", ); function sendMessage($type, $msg) { -- cgit v1.2.3-70-g09d2 From 5f3b810b6a141cf70b575430d08c5a57e3acc5ce Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 27 Apr 2016 20:39:59 +0200 Subject: Add savegame.inc with methods for saving the game --- inc/savegame.inc | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 inc/savegame.inc (limited to 'inc') diff --git a/inc/savegame.inc b/inc/savegame.inc new file mode 100644 index 0000000..f3b6da6 --- /dev/null +++ b/inc/savegame.inc @@ -0,0 +1,44 @@ +addToXML($xml->addChild($k)); + } + else + $xml->addChild($k, $v); +} + +function genSave() { + header("Content-Type: application/xml"); + $save = new SimpleXMLElement(""); + + array_walk_recursive($_SESSION, "genXML", $save); + return $save; + echo $save->asXML(); +} + +function genFilename() { + return "craftmine-".date("d-m-Y_H-i-s").".save.xml"; +} + +function saveGame() { + $save = genSave(); + if($save->asXML(SAVEDIR."/".genFilename())) sendInfo("gamesave_ok"); + else sendError("gamesave_error"); +} + +function downSave() { + $save = genSave(); + header("Content-Type: application/xml"); + header("Content-Disposition: attachment; filename=".genFilename()); + header("Pragma: no-cache"); + echo $save->asXML(); +} + +?> -- cgit v1.2.3-70-g09d2 From 29a1138f7d0c0e3b5ca785aef381bae96d282777 Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 27 Apr 2016 20:56:22 +0200 Subject: Remove useless mine.mine in --- inc/mine.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'inc') diff --git a/inc/mine.inc b/inc/mine.inc index 94a2c66..752fc69 100644 --- a/inc/mine.inc +++ b/inc/mine.inc @@ -1,7 +1,7 @@ 0, "gold" => 0, "miners" => 0); + $_SESSION["mine"] = array("gold" => 0, "miners" => 0); } function withdrawMine() { -- cgit v1.2.3-70-g09d2 From 48ca3e8ee63787d567fd0fe1bcfea7158a6f9596 Mon Sep 17 00:00:00 2001 From: alexichi Date: Fri, 29 Apr 2016 21:06:59 +0200 Subject: add the option to not create 2 objects of the same type, doesn't work well --- inc/Inventory.inc | 14 ++++++++++++-- inc/shop.inc | 4 ++-- js/shop.js | 19 +++++++++++++------ 3 files changed, 27 insertions(+), 10 deletions(-) (limited to 'inc') diff --git a/inc/Inventory.inc b/inc/Inventory.inc index efe54f2..3396eb9 100644 --- a/inc/Inventory.inc +++ b/inc/Inventory.inc @@ -20,12 +20,21 @@ class Inventory { } private function _addItem($item) { - $this->items[] = $item; + $counter = 0; + foreach($this->items as $object){ + if($object[0] == $item){ + $counter++; + } + } + $tab = array($item,$counter+1); + $this->items[] = $tab; + return $tab; } public static function addItem($item) { $inv = self::get(); - $inv->_addItem($item); + $tab = $inv->_addItem($item); + return $tab; } private function _removeItem($item) { @@ -36,6 +45,7 @@ class Inventory { $inv = self::get(); $inv->_removeItem($item); } + } ?> diff --git a/inc/shop.inc b/inc/shop.inc index 6e30923..83b08b0 100644 --- a/inc/shop.inc +++ b/inc/shop.inc @@ -56,8 +56,8 @@ function buildShop() { function buyItem() { $item = getItem($_POST["item"]); if($item && debitAccount($item->cost)) { - Inventory::addItem($item); - echo json_encode($item); + $tab = Inventory::addItem($item); + echo json_encode($tab); //renvoyer un tableau avec comme première entrée $item et comme deuxième entrée le nombre } } diff --git a/js/shop.js b/js/shop.js index efd6ac5..00f13af 100644 --- a/js/shop.js +++ b/js/shop.js @@ -28,14 +28,21 @@ function buildShop() { sendRequest("craftmine.php", "op=buildShop", function(ret) { displayShop(ret); debitAccount(ret.cost); + showInfo("Your shop has been successfully created"); }); } function addItem(ret) { - var itemhtml = "
  • "; - itemhtml += ""; - itemhtml += "
  • "; - + var itemhtml = ""; + if(ret[1]==1){ //si c'est la première itération de l'objet + itemhtml += "
  • "; + itemhtml += ""; + itemhtml += "
  • "; + } + else if(ret[1]>1){ // si c'est une n-ième itération + document.getElementById("nbObjet").innerHTML=ret[1]; + } + var invcontent = document.getElementById("tab3"); if(invcontent.children.length <= 1) @@ -48,13 +55,13 @@ function addItem(ret) { } else invcontent.getElementsByTagName('ul')[0].innerHTML += itemhtml; - showInfo("The "+ ret.name + " has been successfully purchased"); + showInfo("The "+ ret[0].name + " has been successfully purchased"); } function buyItem(name) { sendRequest("craftmine.php", "op=buyItem&item="+name, function(ret) { addItem(ret); - debitAccount(ret.cost); + debitAccount(ret[0].cost); }); } -- cgit v1.2.3-70-g09d2 From 31866085151518f468794dc71b541543e6b2f691 Mon Sep 17 00:00:00 2001 From: alexichi Date: Sun, 1 May 2016 11:32:08 +0200 Subject: add the beginning part of the dungeon When you have enough money you can buy a ticket and access the dungeon I made a file monsters.xml . It's a bit like the code with the shop but modified When you press the button launch in the onglet dungeon , it display "Battle!" in the console --- craftmine.php | 3 ++- data/monsters.xml | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ inc/Monster.inc | 19 +++++++++++++++++ inc/dungeon.inc | 39 ++++++++++++++++++++++++++++++++++ inc/messages.inc | 3 ++- index.xhtml | 3 +++ js/dungeon.js | 18 ++++++++++++++++ 7 files changed, 146 insertions(+), 2 deletions(-) create mode 100644 data/monsters.xml create mode 100644 inc/Monster.inc create mode 100644 inc/dungeon.inc create mode 100644 js/dungeon.js (limited to 'inc') diff --git a/craftmine.php b/craftmine.php index 78c5e37..4cd6b00 100644 --- a/craftmine.php +++ b/craftmine.php @@ -4,7 +4,7 @@ require_once("inc/mine.inc"); require_once("inc/guild.inc"); require_once("inc/shop.inc"); require_once("inc/craftmine.inc"); - +require_once("inc/dungeon.inc"); session_start(); // Must be placed *BEFORE* $_SESSION is actually used and *AFTER* all classes are imported /** @@ -42,6 +42,7 @@ switch($op) { case "getCraftMine": sendCraftMine(); break; case "buildShop": buildShop(); break; case "buyItem": buyItem(); break; + case "buildDungeon" : buildDungeon(); break; default: reportBadRequest(); } diff --git a/data/monsters.xml b/data/monsters.xml new file mode 100644 index 0000000..86cf422 --- /dev/null +++ b/data/monsters.xml @@ -0,0 +1,63 @@ + + + + + monster1 + 1 + 2 + m + + + monster2 + 2 + 3 + m + + + monster3 + 3 + 4 + m + + + + + monster4 + 4 + 5 + m + + + monster5 + 5 + 6 + m + + + monster5 + 6 + 7 + m + + + + + monster6 + 8 + 9 + m + + + monster7 + 9 + 10 + m + + + Boss + 10 + 12 + m + + + diff --git a/inc/Monster.inc b/inc/Monster.inc new file mode 100644 index 0000000..fbb0fe9 --- /dev/null +++ b/inc/Monster.inc @@ -0,0 +1,19 @@ +name = $name; + $this->level = $level; + $this->hp = $hp; + $this->icon = $icon; + + } +} + +?> diff --git a/inc/dungeon.inc b/inc/dungeon.inc new file mode 100644 index 0000000..b2277f0 --- /dev/null +++ b/inc/dungeon.inc @@ -0,0 +1,39 @@ +(string)$monsters["cost"],"monsters"=>array()); + foreach($monsters as $f){ + $floor = (string)$f["name"]; + $dungeon["monsters"][$floor] = array(); + foreach($f as $monster){ + $dungeon["monsters"][$floor][] = new Monster((string)$monster->name, + intval($monster->level), + intval($monster->hp), + (string)$monster->icon); + } + } + return $dungeon; +} + +function initDungeon() { + $_SESSION["dungeon"] = true; +} + +function buildDungeon() { + $dungeon=generateMonster(); + if(!empty($_SESSION["dungeon"])) { + sendError("dungeon_already_available"); + } + elseif(debitAccount($dungeon["cost"])) { + initDungeon(); + $_SESSION["mine"]["gold"] -= $dungeon["cost"]; + echo json_encode($dungeon); + } +} + +?> diff --git a/inc/messages.inc b/inc/messages.inc index d6ea87e..c24bd18 100644 --- a/inc/messages.inc +++ b/inc/messages.inc @@ -5,7 +5,8 @@ $messages = array( "gold_insufficient" => "You don't have enough gold.", "shop_missing_item" => "This item does not exist.", "guild_not_yet_created" => "You need to create a guild first.", - "guild_already_built" => "You have aready built a guild." + "guild_already_built" => "You have aready built a guild.", + "dungeon_already_available" => "You can already access the dungeon" ); function sendError($msg) { diff --git a/index.xhtml b/index.xhtml index aa29615..2745c8a 100644 --- a/index.xhtml +++ b/index.xhtml @@ -15,6 +15,8 @@ + +
    @@ -69,6 +71,7 @@
    • +
    diff --git a/js/dungeon.js b/js/dungeon.js new file mode 100644 index 0000000..1760afa --- /dev/null +++ b/js/dungeon.js @@ -0,0 +1,18 @@ +function buildDungeon(){ + sendRequest("craftmine.php", "op=buildDungeon", function(ret) { + displayDungeon(); + debitAccount(ret.cost); + showInfo("You can acces the dungeon now. Good Luck."); + }); +} + +function displayDungeon(){ + var tmphtml = "
    "; + tmphtml += ""; + //tmphtml += ""; + document.getElementById("tab4").innerHTML = tmphtml; +} + +function launchDungeon(){ + console.log("Battle!"); +} -- cgit v1.2.3-70-g09d2 From 64b1663e55544e1ed0e072c4f624688625691c9f Mon Sep 17 00:00:00 2001 From: alexichi Date: Sun, 1 May 2016 13:55:08 +0200 Subject: Add dungeon without fight system You can buy a "ticket" to access the dungeon If you exit you have to buy another ticket Problem when we update the page, the default sentence is displayed while it said that you can access the dungeon --- craftmine.php | 2 ++ data/items.xml | 4 ++-- inc/dungeon.inc | 11 +++++++++++ js/craftmine.js | 5 ++++- js/dungeon.js | 30 +++++++++++++++++++++++++++--- 5 files changed, 46 insertions(+), 6 deletions(-) (limited to 'inc') diff --git a/craftmine.php b/craftmine.php index 4cd6b00..72817cc 100644 --- a/craftmine.php +++ b/craftmine.php @@ -43,6 +43,8 @@ switch($op) { case "buildShop": buildShop(); break; case "buyItem": buyItem(); break; case "buildDungeon" : buildDungeon(); break; + case "launchDungeon" : launchDungeon(); break; + case "exitDungeon" : exitDungeon(); break; default: reportBadRequest(); } diff --git a/data/items.xml b/data/items.xml index 6c19b84..8888796 100644 --- a/data/items.xml +++ b/data/items.xml @@ -25,7 +25,7 @@ Life Bottle 5 - 🍶 + 💧 A bottle which can heal you by regaining hp @@ -34,7 +34,7 @@ 20 - 🍶 + 💧 If used, you have 20% more chance to hit your enemy during the battle diff --git a/inc/dungeon.inc b/inc/dungeon.inc index b2277f0..8c26c92 100644 --- a/inc/dungeon.inc +++ b/inc/dungeon.inc @@ -36,4 +36,15 @@ function buildDungeon() { } } +function launchDungeon(){ + $dungeon=generateMonster(); + $opponent = $dungeon["monsters"]["floor1"]; + echo json_encode($opponent); +} + +function exitDungeon(){ + $_SESSION["dungeon"] = false; + echo json_encode(array("a" => 7));//Cette ligne ne sert qu'à contourner l'erreur créé à cause de sendRequest. A revoir. +} + ?> diff --git a/js/craftmine.js b/js/craftmine.js index 92fa45a..c40106c 100644 --- a/js/craftmine.js +++ b/js/craftmine.js @@ -1,8 +1,11 @@ data = { + name: "You", gold: 0, mine: 0, miners: 0, - level: 1 + level: 1, + hp: 1, + icon : "H" } function sendRequest(url, params, callback) { diff --git a/js/dungeon.js b/js/dungeon.js index 1760afa..d20a3cf 100644 --- a/js/dungeon.js +++ b/js/dungeon.js @@ -8,11 +8,35 @@ function buildDungeon(){ function displayDungeon(){ var tmphtml = "
    "; - tmphtml += ""; - //tmphtml += ""; + tmphtml += ""; document.getElementById("tab4").innerHTML = tmphtml; } function launchDungeon(){ - console.log("Battle!"); + sendRequest("craftmine.php", "op=launchDungeon", function(ret) { + document.getElementById("launch").style.display = "none"; + displayBattle(ret); + }); +} + +function displayBattle(ret){ + var tmphtml = "
    "; + tmphtml += "

    Battle

    "; + tmphtml += "
      "; + tmphtml += "
    • "; + tmphtml += ""; + tmphtml += ""; + tmphtml += "
    • "; + tmphtml += "
    "; + tmphtml += "
    "; + tmphtml += "

    "; + tmphtml += ""; + document.getElementById("tab4").innerHTML = tmphtml; +} + +function exitDungeon(){ + sendRequest("craftmine.php", "op=exitDungeon", function() { + document.getElementById("tab4").innerHTML = "

    Look at how poor you are! You can't access the dungeon, it is only for the elite.

    "; + showInfo("You have left the dungeon"); + }); } -- cgit v1.2.3-70-g09d2 From 76df4eb85cadf9cf548b4aa1cc95970e1d53f48d Mon Sep 17 00:00:00 2001 From: piernov Date: Sun, 1 May 2016 14:52:43 +0200 Subject: Implement loading saved games on server --- craftmine.php | 2 ++ inc/Item.inc | 4 ++++ inc/messages.inc | 1 + inc/savegame.inc | 30 ++++++++++++++++++++++++++++++ 4 files changed, 37 insertions(+) (limited to 'inc') diff --git a/craftmine.php b/craftmine.php index ac187cc..28bb49d 100644 --- a/craftmine.php +++ b/craftmine.php @@ -49,6 +49,8 @@ switch($op) { case "buyItem": buyItem(); break; case "saveGame": saveGame(); break; case "downSave": downSave(); break; + case "listSaves": listSaves(); break; + case "loadSave": loadSave(); break; default: reportBadRequest(); } diff --git a/inc/Item.inc b/inc/Item.inc index bef6d00..8e90998 100644 --- a/inc/Item.inc +++ b/inc/Item.inc @@ -20,6 +20,10 @@ class Item { $item->addChild("icon", $this->icon); $item->addChild("desc", $this->desc); } + + public static function fromXML($xml) { + return new static((string)$xml->name, +(string)$xml->cost /* convert to number */, (string)$xml->icon, (string)$xml->desc); + } } ?> diff --git a/inc/messages.inc b/inc/messages.inc index 9f3a09d..955c0a0 100644 --- a/inc/messages.inc +++ b/inc/messages.inc @@ -9,6 +9,7 @@ $messages = array( "gamesave_ok" => "Game saved.", "gamesave_error" => "An error occured when trying to save the game.", + "gamesave_not_found" => "Couldn't find the specified save file.", ); function sendMessage($type, $msg) { diff --git a/inc/savegame.inc b/inc/savegame.inc index f3b6da6..4646601 100644 --- a/inc/savegame.inc +++ b/inc/savegame.inc @@ -41,4 +41,34 @@ function downSave() { echo $save->asXML(); } +function listSaves() { + chdir(SAVEDIR); // Go to SAVEDIR folder, avoiding leading folder name in file list + echo json_encode(glob("*.save.xml")); +} + +function parseSave($xml, &$table) { // Passing $table by reference + foreach($xml as $k => $v) { + if($v->count() == 0) { // No child, treat as string + $v = (string)$v; + if(is_numeric($v)) $v = +$v; // If it is in fact a number, treat it that way using PHP unary '+' coercion + $table[$k] = $v; + } elseif($k == "inventory") { // Special case for inventory: objects need to be created + foreach($v as $item) Inventory::addItem(Item::fromXML($item)); + } else { // If nested array + $table[$k] = array(); + parseXML($v, $table[$k]); + } // Other types unsupported (unused) + } +} + +function loadSave() { + if(empty($_POST["filename"])) return; + $xml = simplexml_load_file(SAVEDIR . "/" . $_POST["filename"]); + if(empty($xml)) { + sendError("gamesave_not_found"); + return; + } + $_SESSION = array(); // drop current game + parseSave($xml, $_SESSION); +} ?> -- cgit v1.2.3-70-g09d2 From 556adda68fe99e3a88f59803aa9bd8892e4d34cf Mon Sep 17 00:00:00 2001 From: alexichi Date: Mon, 2 May 2016 14:51:37 +0200 Subject: fix shop item count --- inc/Inventory.inc | 8 ++++---- js/shop.js | 9 +++++---- 2 files changed, 9 insertions(+), 8 deletions(-) (limited to 'inc') diff --git a/inc/Inventory.inc b/inc/Inventory.inc index 3396eb9..20c63bf 100644 --- a/inc/Inventory.inc +++ b/inc/Inventory.inc @@ -20,13 +20,13 @@ class Inventory { } private function _addItem($item) { - $counter = 0; - foreach($this->items as $object){ + foreach($this->items as $k => $object){ if($object[0] == $item){ - $counter++; + $this->items[$k][1]++; + return $this->items[$k]; } } - $tab = array($item,$counter+1); + $tab = array($item,1); $this->items[] = $tab; return $tab; } diff --git a/js/shop.js b/js/shop.js index 00f13af..bda3885 100644 --- a/js/shop.js +++ b/js/shop.js @@ -34,13 +34,14 @@ function buildShop() { function addItem(ret) { var itemhtml = ""; - if(ret[1]==1){ //si c'est la première itération de l'objet + var itemtag = document.querySelector("[data-name=\""+ret[0].name+"\"]"); + if(!itemtag){ //si c'est la première itération de l'objet itemhtml += "
  • "; - itemhtml += ""; + itemhtml += ""; itemhtml += "
  • "; } - else if(ret[1]>1){ // si c'est une n-ième itération - document.getElementById("nbObjet").innerHTML=ret[1]; + else{ // si c'est une n-ième itération + itemtag.innerHTML=ret[1]; } var invcontent = document.getElementById("tab3"); -- cgit v1.2.3-70-g09d2 From 888afbab390f227bb89c98847b516897886df3d3 Mon Sep 17 00:00:00 2001 From: piernov Date: Mon, 2 May 2016 15:48:37 +0200 Subject: Fix game save XML generation + add ability to send a previously generated game save --- inc/savegame.inc | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) (limited to 'inc') diff --git a/inc/savegame.inc b/inc/savegame.inc index 4646601..79b1dae 100644 --- a/inc/savegame.inc +++ b/inc/savegame.inc @@ -4,23 +4,22 @@ require_once("inc/messages.inc"); define("SAVEDIR", "data/save"); -function genXML($v, $k, $xml) { - if(is_object($v)) - { - if(is_callable(array($v, "addToXML"))) - $v->addToXML($xml->addChild($k)); +function genXML($table, $xml) { + foreach($table as $k => $v) { + if(is_object($v)) { // Object: either Item or Inventory + if(is_callable(array($v, "addToXML"))) // Check if the object has a addToXML method + $v->addToXML($xml->addChild($k)); + } elseif(is_array($v)) // Nested array + genXML($v, $xml->addChild($k)); + else // Single value (numeric or string) + $xml->addChild($k, $v); } - else - $xml->addChild($k, $v); } function genSave() { - header("Content-Type: application/xml"); $save = new SimpleXMLElement(""); - - array_walk_recursive($_SESSION, "genXML", $save); + genXML($_SESSION, $save); return $save; - echo $save->asXML(); } function genFilename() { @@ -34,11 +33,22 @@ function saveGame() { } function downSave() { - $save = genSave(); - header("Content-Type: application/xml"); - header("Content-Disposition: attachment; filename=".genFilename()); - header("Pragma: no-cache"); - echo $save->asXML(); + $save = ""; + $filename = ""; + + if(empty($_GET["filename"])) { + $filename = genFilename(); + $save = genSave()->asXML(); // Send current game save file if no file specified + } else { + $filename = $_GET["filename"]; + $save = file_get_contents(SAVEDIR . "/" . $filename); + if(empty($save)) return; // Probably file not found + } + + header("Content-Type: application/xml"); // Force browser to intepret the file as XML + header("Content-Disposition: attachment; filename=".$filename); // Force download with specific filename + header("Cache-Control: no-cache"); // Avoid storing save file in proxy/browser cache + echo $save; } function listSaves() { @@ -56,7 +66,7 @@ function parseSave($xml, &$table) { // Passing $table by reference foreach($v as $item) Inventory::addItem(Item::fromXML($item)); } else { // If nested array $table[$k] = array(); - parseXML($v, $table[$k]); + parseSave($v, $table[$k]); } // Other types unsupported (unused) } } -- cgit v1.2.3-70-g09d2 From 0b72114561a685b247922a93c576edabd4d3b09e Mon Sep 17 00:00:00 2001 From: piernov Date: Mon, 2 May 2016 15:59:16 +0200 Subject: Add ability to delete a save Doesn't work because idk which method to use and I don't have the PHP doc right now --- craftmine.php | 1 + inc/messages.inc | 2 ++ inc/savegame.inc | 7 +++++++ js/savegame.js | 3 +++ 4 files changed, 13 insertions(+) (limited to 'inc') diff --git a/craftmine.php b/craftmine.php index 28bb49d..9a5d3d7 100644 --- a/craftmine.php +++ b/craftmine.php @@ -51,6 +51,7 @@ switch($op) { case "downSave": downSave(); break; case "listSaves": listSaves(); break; case "loadSave": loadSave(); break; + case "deleteSave": deleteSave(); break; default: reportBadRequest(); } diff --git a/inc/messages.inc b/inc/messages.inc index 955c0a0..5574bcf 100644 --- a/inc/messages.inc +++ b/inc/messages.inc @@ -10,6 +10,8 @@ $messages = array( "gamesave_ok" => "Game saved.", "gamesave_error" => "An error occured when trying to save the game.", "gamesave_not_found" => "Couldn't find the specified save file.", + "gamesave_delete_error" => "Couldn't delete the specified save file.", + "gamesave_delete_success" => "Game save successfully removed from server", ); function sendMessage($type, $msg) { diff --git a/inc/savegame.inc b/inc/savegame.inc index 79b1dae..eb4134f 100644 --- a/inc/savegame.inc +++ b/inc/savegame.inc @@ -71,6 +71,13 @@ function parseSave($xml, &$table) { // Passing $table by reference } } +function deleteSave() { + if(empty($_POST["filename"])) return; + $filename = $_POST["filename"]; + if(rm_file(SAVEDIR + "/" + $filename)) sendError("gamesave_delete_failed"); // TODO: find the correct method for removing a file… + else sendInfo("gamesave_delete_success"); +} + function loadSave() { if(empty($_POST["filename"])) return; $xml = simplexml_load_file(SAVEDIR . "/" . $_POST["filename"]); diff --git a/js/savegame.js b/js/savegame.js index 438be0a..4a08f91 100644 --- a/js/savegame.js +++ b/js/savegame.js @@ -28,6 +28,9 @@ function downloadSave() { } function deleteSave() { + sendRequest("craftmine.php", "op=deleteSave&filename="+getCheckedSave(), function(ret) { + listSaves(); + }); } function saveGame() { -- cgit v1.2.3-70-g09d2 From 49aaf3ec355f783507875381a426ea350f0cdea1 Mon Sep 17 00:00:00 2001 From: piernov Date: Mon, 2 May 2016 19:22:05 +0200 Subject: Fix delete save game Yep, it was called unlink(). Who would've thought of that? Also, let's use the right operator and not fall for Javascript's silliness --- inc/savegame.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'inc') diff --git a/inc/savegame.inc b/inc/savegame.inc index eb4134f..2f8c70a 100644 --- a/inc/savegame.inc +++ b/inc/savegame.inc @@ -74,7 +74,7 @@ function parseSave($xml, &$table) { // Passing $table by reference function deleteSave() { if(empty($_POST["filename"])) return; $filename = $_POST["filename"]; - if(rm_file(SAVEDIR + "/" + $filename)) sendError("gamesave_delete_failed"); // TODO: find the correct method for removing a file… + if(unlink(SAVEDIR + "/" + $filename)) sendError("gamesave_delete_failed"); else sendInfo("gamesave_delete_success"); } -- cgit v1.2.3-70-g09d2 From 035a477c4f30180edecead29e8bcda34a0725881 Mon Sep 17 00:00:00 2001 From: piernov Date: Mon, 2 May 2016 19:58:11 +0200 Subject: Better when the user isn't allowed of deleting arbitrary files… Thanks PHP for not highligthing the problem and not providing simple solution… MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/savegame.inc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'inc') diff --git a/inc/savegame.inc b/inc/savegame.inc index 2f8c70a..0dfb1c8 100644 --- a/inc/savegame.inc +++ b/inc/savegame.inc @@ -73,8 +73,9 @@ function parseSave($xml, &$table) { // Passing $table by reference function deleteSave() { if(empty($_POST["filename"])) return; - $filename = $_POST["filename"]; - if(unlink(SAVEDIR + "/" + $filename)) sendError("gamesave_delete_failed"); + $path = SAVEDIR . "/" . basename($_POST["filename"]); // remove any leading directory + if(file_exists($path) && unlink($path)) + sendError("gamesave_delete_failed"); else sendInfo("gamesave_delete_success"); } -- cgit v1.2.3-70-g09d2 From bb029a5feff5c3d284ef8d509c116eee345c13b9 Mon Sep 17 00:00:00 2001 From: piernov Date: Mon, 2 May 2016 20:04:15 +0200 Subject: Better when error/info messages aren't swapped --- inc/messages.inc | 2 +- inc/savegame.inc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'inc') diff --git a/inc/messages.inc b/inc/messages.inc index 5574bcf..4938fa1 100644 --- a/inc/messages.inc +++ b/inc/messages.inc @@ -10,7 +10,7 @@ $messages = array( "gamesave_ok" => "Game saved.", "gamesave_error" => "An error occured when trying to save the game.", "gamesave_not_found" => "Couldn't find the specified save file.", - "gamesave_delete_error" => "Couldn't delete the specified save file.", + "gamesave_delete_fail" => "Couldn't delete the specified save file.", "gamesave_delete_success" => "Game save successfully removed from server", ); diff --git a/inc/savegame.inc b/inc/savegame.inc index 0dfb1c8..1fa95b0 100644 --- a/inc/savegame.inc +++ b/inc/savegame.inc @@ -75,8 +75,8 @@ function deleteSave() { if(empty($_POST["filename"])) return; $path = SAVEDIR . "/" . basename($_POST["filename"]); // remove any leading directory if(file_exists($path) && unlink($path)) - sendError("gamesave_delete_failed"); - else sendInfo("gamesave_delete_success"); + sendInfo("gamesave_delete_success"); + else sendError("gamesave_delete_fail"); } function loadSave() { -- cgit v1.2.3-70-g09d2 From add9d3248a5adc02b071a301005c6f11195f7f7b Mon Sep 17 00:00:00 2001 From: alexichi Date: Tue, 3 May 2016 10:33:27 +0200 Subject: add dungeon client side to display it when reload --- inc/craftmine.inc | 4 +++- inc/dungeon.inc | 6 ++++++ js/craftmine.js | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) (limited to 'inc') diff --git a/inc/craftmine.inc b/inc/craftmine.inc index 33a28d7..0d6a445 100644 --- a/inc/craftmine.inc +++ b/inc/craftmine.inc @@ -2,12 +2,14 @@ require_once("mine.inc"); require_once("shop.inc"); +require_once("dungeon.inc"); function sendCraftMine() { $data = array("gold" => sendMine(), "shop" => sendShop(), "inventory" => Inventory::sendContent(), - "miners" => sendMiners() + "miners" => sendMiners(), + "dungeon" => sendDungeon(), ); echo json_encode($data); } diff --git a/inc/dungeon.inc b/inc/dungeon.inc index 8c26c92..81e2ba7 100644 --- a/inc/dungeon.inc +++ b/inc/dungeon.inc @@ -24,6 +24,12 @@ function initDungeon() { $_SESSION["dungeon"] = true; } +function sendDungeon() { + if(!empty($_SESSION["dungeon"])) + return generateMonster(); + else return false; +} + function buildDungeon() { $dungeon=generateMonster(); if(!empty($_SESSION["dungeon"])) { diff --git a/js/craftmine.js b/js/craftmine.js index c40106c..7c37e59 100644 --- a/js/craftmine.js +++ b/js/craftmine.js @@ -52,6 +52,7 @@ function initCraftMine() { data.gold = parseInt(ret.gold); // Server's response is a string if(ret.shop) displayShop(ret.shop); displayInventory(ret.inventory); + if(ret.dungeon) displayDungeon(); data.miners = parseInt(ret.miners); updateData("gold","miners"); }) -- cgit v1.2.3-70-g09d2 From 40b0d42dee76bc62517801aa746371a9ce2895a1 Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 4 May 2016 14:26:57 +0200 Subject: Now possible to add format to sendMessage() strings --- inc/messages.inc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'inc') diff --git a/inc/messages.inc b/inc/messages.inc index 4938fa1..7b952b8 100644 --- a/inc/messages.inc +++ b/inc/messages.inc @@ -14,18 +14,19 @@ $messages = array( "gamesave_delete_success" => "Game save successfully removed from server", ); -function sendMessage($type, $msg) { +function sendMessage($type, $msg, $fmt = null) { global $messages; $text = $messages[$msg]; + if($fmt) $text = vsprintf($text, $fmt); echo json_encode(array($type => $text)); } -function sendError($msg) { - sendMessage("error", $msg); +function sendError($msg, $fmt = null) { + sendMessage("error", $msg, $fmt); } -function sendInfo($msg) { - sendMessage("info", $msg); +function sendInfo($msg, $fmt = null) { + sendMessage("info", $msg, $fmt); } ?> -- cgit v1.2.3-70-g09d2 From 9ce1da5147b3df01812687562faca80623b27a38 Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 4 May 2016 14:27:35 +0200 Subject: Receive uploaded savegame from PHP --- inc/messages.inc | 3 +++ inc/savegame.inc | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+) (limited to 'inc') diff --git a/inc/messages.inc b/inc/messages.inc index 7b952b8..d08331a 100644 --- a/inc/messages.inc +++ b/inc/messages.inc @@ -12,6 +12,9 @@ $messages = array( "gamesave_not_found" => "Couldn't find the specified save file.", "gamesave_delete_fail" => "Couldn't delete the specified save file.", "gamesave_delete_success" => "Game save successfully removed from server", + + "upload_fail" => "Could not upload save file.", + "upload_success" => "Save file uploaded successfully: %s", ); function sendMessage($type, $msg, $fmt = null) { diff --git a/inc/savegame.inc b/inc/savegame.inc index 1fa95b0..8772585 100644 --- a/inc/savegame.inc +++ b/inc/savegame.inc @@ -89,4 +89,24 @@ function loadSave() { $_SESSION = array(); // drop current game parseSave($xml, $_SESSION); } + +function uploadSave() { + $fname = basename($_FILES['savefile']['name']); + $src = $_FILES['savefile']['tmp_name']; + + libxml_use_internal_errors(true); // Ignore errors when loading the received file + $xml = simplexml_load_file($src); + libxml_use_internal_errors(false); + if(!$xml) { + sendError("upload_fail"); + return; + } + $table = array(); + parseSave($xml, $table); // Parse received file + + $save = new SimpleXMLElement(""); + genXML($table, $save); // Regenerate it + if($save->asXML(SAVEDIR."/".$fname)) sendInfo("upload_success", array($fname)); + else sendError("upload_error"); +} ?> -- cgit v1.2.3-70-g09d2 From 676ea92ed1c88b7490feb17f90978f613783293d Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 4 May 2016 14:37:33 +0200 Subject: Missing comma --- inc/messages.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'inc') diff --git a/inc/messages.inc b/inc/messages.inc index c51adba..60ae678 100644 --- a/inc/messages.inc +++ b/inc/messages.inc @@ -6,7 +6,7 @@ $messages = array( "shop_missing_item" => "This item does not exist.", "guild_not_yet_created" => "You need to create a guild first.", "guild_already_built" => "You have aready built a guild.", - "dungeon_already_available" => "You can already access the dungeon" + "dungeon_already_available" => "You can already access the dungeon", "gamesave_ok" => "Game saved.", "gamesave_error" => "An error occured when trying to save the game.", -- cgit v1.2.3-70-g09d2 From 1efc4a15c8ab913bf8bdb1aef9f3b5720b3b7762 Mon Sep 17 00:00:00 2001 From: alexichi Date: Thu, 5 May 2016 20:28:26 +0200 Subject: add dungeon server side and improve some details like the difference between floors --- craftmine.php | 1 + data/items.xml | 4 +-- data/monsters.xml | 2 +- inc/dungeon.inc | 16 ++++++++--- inc/messages.inc | 3 +- js/craftmine.js | 7 +++-- js/dungeon.js | 82 ++++++++++++++++++++++++++++++++++++++++++++++--------- 7 files changed, 90 insertions(+), 25 deletions(-) (limited to 'inc') diff --git a/craftmine.php b/craftmine.php index 242e1fd..43fdc66 100644 --- a/craftmine.php +++ b/craftmine.php @@ -51,6 +51,7 @@ switch($op) { case "buildDungeon" : buildDungeon(); break; case "launchDungeon" : launchDungeon(); break; case "exitDungeon" : exitDungeon(); break; + case "sendDungeonProgress" : sendDungeonProgress(); break; case "saveGame": saveGame(); break; case "downSave": downSave(); break; case "listSaves": listSaves(); break; diff --git a/data/items.xml b/data/items.xml index 8888796..6c19b84 100644 --- a/data/items.xml +++ b/data/items.xml @@ -25,7 +25,7 @@ Life Bottle 5 - 💧 + 🍶 A bottle which can heal you by regaining hp @@ -34,7 +34,7 @@ 20 - 💧 + 🍶 If used, you have 20% more chance to hit your enemy during the battle diff --git a/data/monsters.xml b/data/monsters.xml index 86cf422..630e83a 100644 --- a/data/monsters.xml +++ b/data/monsters.xml @@ -4,7 +4,7 @@ monster1 1 - 2 + 3 m diff --git a/inc/dungeon.inc b/inc/dungeon.inc index 81e2ba7..ebe74b7 100644 --- a/inc/dungeon.inc +++ b/inc/dungeon.inc @@ -21,12 +21,12 @@ function generateMonster(){ } function initDungeon() { - $_SESSION["dungeon"] = true; + $_SESSION["dungeon"]["access"] = true; } function sendDungeon() { if(!empty($_SESSION["dungeon"])) - return generateMonster(); + return $_SESSION["dungeon"]; else return false; } @@ -43,14 +43,22 @@ function buildDungeon() { } function launchDungeon(){ + $f= $_POST["floor"]; $dungeon=generateMonster(); - $opponent = $dungeon["monsters"]["floor1"]; + $opponent = $dungeon["monsters"]["floor".$f]; echo json_encode($opponent); } +function sendDungeonProgress(){ + $f= $_POST["floor"]; + $nb=$_POST["mob"]; + $_SESSION["dungeon"]["flat"] = $f; + $_SESSION["dungeon"]["mob"] = $nb; +} + + function exitDungeon(){ $_SESSION["dungeon"] = false; - echo json_encode(array("a" => 7));//Cette ligne ne sert qu'à contourner l'erreur créé à cause de sendRequest. A revoir. } ?> diff --git a/inc/messages.inc b/inc/messages.inc index c51adba..1f25ed3 100644 --- a/inc/messages.inc +++ b/inc/messages.inc @@ -6,8 +6,7 @@ $messages = array( "shop_missing_item" => "This item does not exist.", "guild_not_yet_created" => "You need to create a guild first.", "guild_already_built" => "You have aready built a guild.", - "dungeon_already_available" => "You can already access the dungeon" - + "dungeon_already_available" => "You can already access the dungeon", "gamesave_ok" => "Game saved.", "gamesave_error" => "An error occured when trying to save the game.", "gamesave_not_found" => "Couldn't find the specified save file.", diff --git a/js/craftmine.js b/js/craftmine.js index ffc9b5e..9af9b9f 100644 --- a/js/craftmine.js +++ b/js/craftmine.js @@ -3,8 +3,8 @@ data = { gold: 0, mine: 0, miners: 0, - level: 1, - hp: 1, + level: 4, + hp: 5, icon : "H" } @@ -56,7 +56,8 @@ function initCraftMine() { data.mine = 0; // Reset mine if(ret.shop) displayShop(ret.shop); displayInventory(ret.inventory); - if(ret.dungeon) displayDungeon(); + if(typeof ret.dungeon.mob == "undefined") displayDungeon(0,1,true); + else displayDungeon(ret.dungeon.mob,ret.dungeon.flat,true); data.miners = parseInt(ret.miners); updateData("gold", "mine", "miners"); }) diff --git a/js/dungeon.js b/js/dungeon.js index d20a3cf..c6ce014 100644 --- a/js/dungeon.js +++ b/js/dungeon.js @@ -1,41 +1,97 @@ +var timeout; + function buildDungeon(){ sendRequest("craftmine.php", "op=buildDungeon", function(ret) { - displayDungeon(); + displayDungeon(0,1,true);//mob 0 in the floor 1 and I access the dungeon for the first dungeon debitAccount(ret.cost); showInfo("You can acces the dungeon now. Good Luck."); }); } -function displayDungeon(){ +function displayDungeon(nb,f,firstTime){ var tmphtml = "
    "; - tmphtml += ""; + tmphtml += ""; document.getElementById("tab4").innerHTML = tmphtml; } -function launchDungeon(){ - sendRequest("craftmine.php", "op=launchDungeon", function(ret) { - document.getElementById("launch").style.display = "none"; - displayBattle(ret); +function launchDungeon(nb,f,firstTime){ + sendRequest("craftmine.php", "op=launchDungeon&floor="+f, function(ret) { + if(nb==0 && firstTime){ + document.getElementById("launch").style.display = "none"; + } + displayBattle(ret,nb,f); }); } -function displayBattle(ret){ +function displayBattle(ret,nb,f){ var tmphtml = "
    "; - tmphtml += "

    Battle

    "; + tmphtml += "

    Battle floor "+ f +"

    "; tmphtml += "
      "; tmphtml += "
    • "; - tmphtml += ""; - tmphtml += ""; + tmphtml += ""; + tmphtml += ""; tmphtml += "
    • "; tmphtml += "
    "; tmphtml += "
    "; - tmphtml += "

    "; - tmphtml += ""; document.getElementById("tab4").innerHTML = tmphtml; + displayExit(); + battle(ret,nb,f); +} + +function battle(ret,nb,f){ + timeout=window.setTimeout(strike, 1000, ret, nb, f); +} + +function strike(ret,nb, f){ + var lvDiff = data.level-parseInt(ret[0].level); + var hitRate = Math.floor((Math.random() * 100) + 1); + var mobLife = document.getElementById("lifeMob").innerHTML; + var persoLife = document.getElementById("lifePerso").innerHTML; + if(mobLife == 0){ + endBattle("perso",nb,f); + return; + } + else if(persoLife == 0){ + endBattle("mob",nb); + return; + } + if(hitRate<50+10*lvDiff){ + mobLife--; + document.getElementById("lifeMob").innerHTML = parseInt(mobLife); + } + else{ + persoLife--; + document.getElementById("lifePerso").innerHTML = parseInt(persoLife); + } + battle(ret,nb,f); +} + +function endBattle(v,nb, f){ + window.clearTimeout(timeout); + if(v=="mob")exitDungeon();//if you die in the dungeon, you are immediately sent out of the dungeon + nb++;//go to the next mob in the same floor + if(nb>=3){//floor changing + nb=0;//reset the number of the mob + f++;//increment the number of the floor + } + var tmphtml = "Le " + v + " a gagné."; + tmphtml += "" + document.getElementById("tab4").innerHTML = tmphtml; + displayExit(); + sendRequest("craftmine.php", "op=sendDungeonProgress&floor="+f+"&mob="+nb); +} + +function displayExit(){ + var tmphtml = "

    "; + tmphtml += ""; + document.getElementById("tab4").innerHTML += tmphtml; } function exitDungeon(){ sendRequest("craftmine.php", "op=exitDungeon", function() { + window.clearTimeout(timeout); document.getElementById("tab4").innerHTML = "

    Look at how poor you are! You can't access the dungeon, it is only for the elite.

    "; showInfo("You have left the dungeon"); }); -- cgit v1.2.3-70-g09d2 From f171811a44364f605712aff1ca0808bfe570ef6e Mon Sep 17 00:00:00 2001 From: alexichi Date: Thu, 5 May 2016 23:06:29 +0200 Subject: add xp system and perso server side --- craftmine.php | 3 +++ data/monsters.xml | 9 +++++++++ inc/Monster.inc | 4 +++- inc/craftmine.inc | 2 ++ inc/dungeon.inc | 5 +++-- inc/perso.inc | 17 +++++++++++++++++ index.xhtml | 4 ++++ js/craftmine.js | 13 +++++++++++-- js/dungeon.js | 38 ++++++++++++++++++++++++++------------ js/perso.js | 5 +++++ 10 files changed, 83 insertions(+), 17 deletions(-) create mode 100644 inc/perso.inc create mode 100644 js/perso.js (limited to 'inc') diff --git a/craftmine.php b/craftmine.php index 43fdc66..d47989c 100644 --- a/craftmine.php +++ b/craftmine.php @@ -6,6 +6,7 @@ require_once("inc/shop.inc"); require_once("inc/craftmine.inc"); require_once("inc/dungeon.inc"); require_once("inc/savegame.inc"); +require_once("inc/perso.inc"); session_start(); // Must be placed *BEFORE* $_SESSION is actually used and *AFTER* all classes are imported @@ -52,6 +53,8 @@ switch($op) { case "launchDungeon" : launchDungeon(); break; case "exitDungeon" : exitDungeon(); break; case "sendDungeonProgress" : sendDungeonProgress(); break; + case "updatePerso" : updatePerso(); break; + case "sendPerso" : sendPerso(); break; case "saveGame": saveGame(); break; case "downSave": downSave(); break; case "listSaves": listSaves(); break; diff --git a/data/monsters.xml b/data/monsters.xml index 630e83a..ab29364 100644 --- a/data/monsters.xml +++ b/data/monsters.xml @@ -5,18 +5,21 @@ monster1 1 3 + 1 m
    monster2 2 3 + 2 m monster3 3 4 + 3 m @@ -25,18 +28,21 @@ monster4 4 5 + 4 m monster5 5 6 + 5 m monster5 6 7 + 6 m @@ -45,18 +51,21 @@ monster6 8 9 + 8 m monster7 9 10 + 9 m Boss 10 12 + 10 m diff --git a/inc/Monster.inc b/inc/Monster.inc index fbb0fe9..c7063ec 100644 --- a/inc/Monster.inc +++ b/inc/Monster.inc @@ -5,12 +5,14 @@ class Monster { public $icon = ""; public $desc = ""; public $hp = 1; + public $xp = 0; public $level = 1; - function __construct($name, $level, $hp, $icon) { + function __construct($name, $level, $hp, $xp, $icon) { $this->name = $name; $this->level = $level; $this->hp = $hp; + $this->xp = $xp; $this->icon = $icon; } diff --git a/inc/craftmine.inc b/inc/craftmine.inc index 0d6a445..f5dbbb1 100644 --- a/inc/craftmine.inc +++ b/inc/craftmine.inc @@ -3,6 +3,7 @@ require_once("mine.inc"); require_once("shop.inc"); require_once("dungeon.inc"); +require_once("perso.inc"); function sendCraftMine() { $data = array("gold" => sendMine(), @@ -10,6 +11,7 @@ function sendCraftMine() { "inventory" => Inventory::sendContent(), "miners" => sendMiners(), "dungeon" => sendDungeon(), + "perso" => sendPerso(), ); echo json_encode($data); } diff --git a/inc/dungeon.inc b/inc/dungeon.inc index ebe74b7..c023cf8 100644 --- a/inc/dungeon.inc +++ b/inc/dungeon.inc @@ -12,8 +12,9 @@ function generateMonster(){ $dungeon["monsters"][$floor] = array(); foreach($f as $monster){ $dungeon["monsters"][$floor][] = new Monster((string)$monster->name, - intval($monster->level), - intval($monster->hp), + intval($monster->level), + intval($monster->hp), + intval($monster->xp), (string)$monster->icon); } } diff --git a/inc/perso.inc b/inc/perso.inc new file mode 100644 index 0000000..075f8ae --- /dev/null +++ b/inc/perso.inc @@ -0,0 +1,17 @@ + diff --git a/index.xhtml b/index.xhtml index ed3e7a6..7921cab 100644 --- a/index.xhtml +++ b/index.xhtml @@ -17,12 +17,16 @@ +

    CraftMine

    +
    + HP : 5/ LV : 1/ exp : 0 +
    diff --git a/js/craftmine.js b/js/craftmine.js index 9af9b9f..c7a396f 100644 --- a/js/craftmine.js +++ b/js/craftmine.js @@ -5,6 +5,7 @@ data = { miners: 0, level: 4, hp: 5, + xp: 0, icon : "H" } @@ -52,12 +53,20 @@ function withdrawMine() { function initCraftMine() { sendRequest("craftmine.php", "op=getCraftMine", function(ret) { + console.log(ret.perso); data.gold = parseInt(ret.gold); // Server's response is a string data.mine = 0; // Reset mine + if(ret.perso){ + data.hp = ret.perso.hp; + data.xp = ret.perso.xp; + data.level = ret.perso.lv; + displayPerso(ret.perso.hp,ret.perso.xp,ret.perso.lv); + } if(ret.shop) displayShop(ret.shop); displayInventory(ret.inventory); - if(typeof ret.dungeon.mob == "undefined") displayDungeon(0,1,true); - else displayDungeon(ret.dungeon.mob,ret.dungeon.flat,true); + if(ret.dungeon == false){}//if we have left the donjon + else if(typeof ret.dungeon.mob == "undefined") displayDungeon(0,1,true); //if we have reload just after buying the ticket + else displayDungeon(ret.dungeon.mob,ret.dungeon.flat,true);//if we have reload in the middle of the dungeon data.miners = parseInt(ret.miners); updateData("gold", "mine", "miners"); }) diff --git a/js/dungeon.js b/js/dungeon.js index c6ce014..65d1081 100644 --- a/js/dungeon.js +++ b/js/dungeon.js @@ -50,11 +50,12 @@ function strike(ret,nb, f){ var mobLife = document.getElementById("lifeMob").innerHTML; var persoLife = document.getElementById("lifePerso").innerHTML; if(mobLife == 0){ - endBattle("perso",nb,f); + data.hp = persoLife; + endBattle("perso",nb,f,ret); return; } else if(persoLife == 0){ - endBattle("mob",nb); + endBattle("mob",nb,f,ret); return; } if(hitRate<50+10*lvDiff){ @@ -68,19 +69,32 @@ function strike(ret,nb, f){ battle(ret,nb,f); } -function endBattle(v,nb, f){ +function endBattle(v,nb, f, ret){ window.clearTimeout(timeout); if(v=="mob")exitDungeon();//if you die in the dungeon, you are immediately sent out of the dungeon - nb++;//go to the next mob in the same floor - if(nb>=3){//floor changing - nb=0;//reset the number of the mob - f++;//increment the number of the floor + //To level up you have to obtain 2 xp to go to lv 3, 3 to go to lv 4, etc + //A mob level 2 , if defeated gives you 2 xp, ...etc + else{ + data.xp += ret[nb].xp; + if(data.xp>=data.level){ + data.xp-=data.level; + data.level++; + //need to send the xp to the server + sendRequest("craftmine.php", "op=updatePerso&hp="+data.hp+"&xp="+data.xp+"&lv="+data.level, function(){ + displayPerso(data.hp,data.xp,data.level); + }); + } + nb++;//go to the next mob in the same floor + if(nb>=3){//floor changing + nb=0;//reset the number of the mob + f++;//increment the number of the floor + } + var tmphtml = "Le " + v + " a gagné."; + tmphtml += "" + document.getElementById("tab4").innerHTML = tmphtml; + displayExit(); + sendRequest("craftmine.php", "op=sendDungeonProgress&floor="+f+"&mob="+nb); } - var tmphtml = "Le " + v + " a gagné."; - tmphtml += "" - document.getElementById("tab4").innerHTML = tmphtml; - displayExit(); - sendRequest("craftmine.php", "op=sendDungeonProgress&floor="+f+"&mob="+nb); } function displayExit(){ diff --git a/js/perso.js b/js/perso.js new file mode 100644 index 0000000..365cf54 --- /dev/null +++ b/js/perso.js @@ -0,0 +1,5 @@ +function displayPerso(hp,xp,lv){ + document.getElementById("hp").innerHTML = hp; + document.getElementById("lv").innerHTML = lv; + document.getElementById("xp").innerHTML = xp; +} -- cgit v1.2.3-70-g09d2 From ee02581b7fabd087fc4056bda739c88656fbca14 Mon Sep 17 00:00:00 2001 From: alexichi Date: Sat, 7 May 2016 10:13:20 +0200 Subject: add the display of the perso characteristics below the title --- inc/perso.inc | 12 +++++++++--- js/craftmine.js | 2 +- js/dungeon.js | 18 +++++++++++++----- 3 files changed, 23 insertions(+), 9 deletions(-) (limited to 'inc') diff --git a/inc/perso.inc b/inc/perso.inc index 075f8ae..4fb05ef 100644 --- a/inc/perso.inc +++ b/inc/perso.inc @@ -1,8 +1,8 @@ diff --git a/js/craftmine.js b/js/craftmine.js index c7a396f..a8619df 100644 --- a/js/craftmine.js +++ b/js/craftmine.js @@ -3,7 +3,7 @@ data = { gold: 0, mine: 0, miners: 0, - level: 4, + level: 3, hp: 5, xp: 0, icon : "H" diff --git a/js/dungeon.js b/js/dungeon.js index 65d1081..30808ff 100644 --- a/js/dungeon.js +++ b/js/dungeon.js @@ -71,11 +71,11 @@ function strike(ret,nb, f){ function endBattle(v,nb, f, ret){ window.clearTimeout(timeout); - if(v=="mob")exitDungeon();//if you die in the dungeon, you are immediately sent out of the dungeon + if(v=="mob")exitDungeon(false);//if you die in the dungeon, you are immediately sent out of the dungeon //To level up you have to obtain 2 xp to go to lv 3, 3 to go to lv 4, etc //A mob level 2 , if defeated gives you 2 xp, ...etc else{ - data.xp += ret[nb].xp; + data.xp += parseInt(ret[nb].xp); if(data.xp>=data.level){ data.xp-=data.level; data.level++; @@ -88,6 +88,10 @@ function endBattle(v,nb, f, ret){ if(nb>=3){//floor changing nb=0;//reset the number of the mob f++;//increment the number of the floor + if(f>=4){ + exitDungeon(true);//true means that you have completed the dungeon and not just die or exit by yourself + return; + } } var tmphtml = "Le " + v + " a gagné."; tmphtml += "" @@ -95,18 +99,22 @@ function endBattle(v,nb, f, ret){ displayExit(); sendRequest("craftmine.php", "op=sendDungeonProgress&floor="+f+"&mob="+nb); } + sendRequest("craftmine.php", "op=updatePerso&hp="+data.hp+"&xp="+data.xp+"&lv="+data.level, function(){ + displayPerso(data.hp,data.xp,data.level); + }); } function displayExit(){ var tmphtml = "

    "; - tmphtml += ""; + tmphtml += ""; document.getElementById("tab4").innerHTML += tmphtml; } -function exitDungeon(){ +function exitDungeon(boss){ sendRequest("craftmine.php", "op=exitDungeon", function() { window.clearTimeout(timeout); - document.getElementById("tab4").innerHTML = "

    Look at how poor you are! You can't access the dungeon, it is only for the elite.

    "; + document.getElementById("tab4").innerHTML = "

    Not available, you have to buy a ticket in the build section.

    "; + if(boss) showInfo("You have beaten the final boss! CONGRATULATIONS!"); showInfo("You have left the dungeon"); }); } -- cgit v1.2.3-70-g09d2 From 79cfbb29042fd60dfbc76a6810f75cce21d3ffe0 Mon Sep 17 00:00:00 2001 From: alexichi Date: Sat, 7 May 2016 12:08:36 +0200 Subject: add the use of the life bottle --- craftmine.php | 1 + inc/Inventory.inc | 17 +++++++++++++++++ inc/perso.inc | 2 +- inc/shop.inc | 6 ++++++ js/craftmine.js | 2 +- js/dungeon.js | 3 ++- js/shop.js | 18 +++++++++++++++++- 7 files changed, 45 insertions(+), 4 deletions(-) (limited to 'inc') diff --git a/craftmine.php b/craftmine.php index d47989c..9a8806b 100644 --- a/craftmine.php +++ b/craftmine.php @@ -49,6 +49,7 @@ switch($op) { case "getCraftMine": sendCraftMine(); break; case "buildShop": buildShop(); break; case "buyItem": buyItem(); break; + case "useItem": useItem(); break; case "buildDungeon" : buildDungeon(); break; case "launchDungeon" : launchDungeon(); break; case "exitDungeon" : exitDungeon(); break; diff --git a/inc/Inventory.inc b/inc/Inventory.inc index 024a4fe..747c4db 100644 --- a/inc/Inventory.inc +++ b/inc/Inventory.inc @@ -46,6 +46,23 @@ class Inventory { $inv->_removeItem($item); } + private function _useItem($item) { + foreach($this->items as $k => $object){ + if($object[0] == $item){ + if($this->items[$k][1]>0)$this->items[$k][1]--; + //if($this->items[$k][1] == 0) _removeItem($item); + return $this->items[$k]; + } + } + return false; + } + + public static function useItem($item) { + $inv = self::get(); + $it = $inv->_useItem($item); + return $it; + } + public function addToXML($root) { foreach($this->items as $item) $item->addToXML($root); diff --git a/inc/perso.inc b/inc/perso.inc index 4fb05ef..0362d8c 100644 --- a/inc/perso.inc +++ b/inc/perso.inc @@ -10,7 +10,7 @@ function updatePerso(){ $xp = $_POST["xp"]; $lv = $_POST["lv"]; $_SESSION["perso"]["hp"] = $hp; - $_SESSION["perso"]["xp"] = $xp; + $_SESSION["perso"]["xp"] = intval($xp); $_SESSION["perso"]["lv"] = $lv; } diff --git a/inc/shop.inc b/inc/shop.inc index 49ee20b..32ecea2 100644 --- a/inc/shop.inc +++ b/inc/shop.inc @@ -60,5 +60,11 @@ function buyItem() { } } +function useItem(){ + $item = getItem($_POST["item"]); + $it = Inventory::useItem($item); + echo json_encode($it); +} + ?> diff --git a/js/craftmine.js b/js/craftmine.js index a8619df..70becec 100644 --- a/js/craftmine.js +++ b/js/craftmine.js @@ -63,7 +63,7 @@ function initCraftMine() { displayPerso(ret.perso.hp,ret.perso.xp,ret.perso.lv); } if(ret.shop) displayShop(ret.shop); - displayInventory(ret.inventory); + if(ret.inventory) displayInventory(ret.inventory); if(ret.dungeon == false){}//if we have left the donjon else if(typeof ret.dungeon.mob == "undefined") displayDungeon(0,1,true); //if we have reload just after buying the ticket else displayDungeon(ret.dungeon.mob,ret.dungeon.flat,true);//if we have reload in the middle of the dungeon diff --git a/js/dungeon.js b/js/dungeon.js index 30808ff..982dcf6 100644 --- a/js/dungeon.js +++ b/js/dungeon.js @@ -55,6 +55,7 @@ function strike(ret,nb, f){ return; } else if(persoLife == 0){ + data.hp = 1; endBattle("mob",nb,f,ret); return; } @@ -100,7 +101,7 @@ function endBattle(v,nb, f, ret){ sendRequest("craftmine.php", "op=sendDungeonProgress&floor="+f+"&mob="+nb); } sendRequest("craftmine.php", "op=updatePerso&hp="+data.hp+"&xp="+data.xp+"&lv="+data.level, function(){ - displayPerso(data.hp,data.xp,data.level); + displayPerso(data.hp,parseInt(data.xp),data.level); }); } diff --git a/js/shop.js b/js/shop.js index bda3885..efb347a 100644 --- a/js/shop.js +++ b/js/shop.js @@ -37,7 +37,7 @@ function addItem(ret) { var itemtag = document.querySelector("[data-name=\""+ret[0].name+"\"]"); if(!itemtag){ //si c'est la première itération de l'objet itemhtml += "
  • "; - itemhtml += ""; + itemhtml += ""; itemhtml += "
  • "; } else{ // si c'est une n-ième itération @@ -68,6 +68,22 @@ function buyItem(name) { function useItem(name) { sendRequest("craftmine.php", "op=useItem&item="+name, function(ret) { + if(parseInt(ret[1])>=0){ + var nb = parseInt(document.getElementById("nbItem").innerHTML); + if(nb>0){ + nb--; + switch(ret[0].name){ + case "Life Bottle": data.hp = parseInt(data.hp) + 3; break; + case "Strength Bottle" : break; // to do + case "Wooden Sword" : break; //to do + case "Metal Sword" : break; //to do + } + } + document.getElementById("nbItem").innerHTML = nb; + sendRequest("craftmine.php", "op=updatePerso&hp="+data.hp+"&xp="+data.xp+"&lv="+data.level, function(){ + displayPerso(data.hp,data.xp,data.level); + }); + } }); } -- cgit v1.2.3-70-g09d2 From 02c2b49b4a85704d7c16a91e55d24d5af64808ee Mon Sep 17 00:00:00 2001 From: piernov Date: Sun, 8 May 2016 13:41:42 +0200 Subject: Add multiple item support to savegame + fix missing includes --- inc/Inventory.inc | 2 +- inc/Item.inc | 3 ++- inc/savegame.inc | 7 ++++++- 3 files changed, 9 insertions(+), 3 deletions(-) (limited to 'inc') diff --git a/inc/Inventory.inc b/inc/Inventory.inc index 747c4db..751f728 100644 --- a/inc/Inventory.inc +++ b/inc/Inventory.inc @@ -65,7 +65,7 @@ class Inventory { public function addToXML($root) { foreach($this->items as $item) - $item->addToXML($root); + $item[0]->addToXML($root, $item[1]); } } diff --git a/inc/Item.inc b/inc/Item.inc index 8e90998..907872e 100644 --- a/inc/Item.inc +++ b/inc/Item.inc @@ -13,12 +13,13 @@ class Item { $this->desc = $desc; } - function addToXML($root) { + function addToXML($root, $count) { $item = $root->addChild("item"); $item->addChild("name", $this->name); $item->addChild("cost", $this->cost); $item->addChild("icon", $this->icon); $item->addChild("desc", $this->desc); + $item->addChild("count", $count); } public static function fromXML($xml) { diff --git a/inc/savegame.inc b/inc/savegame.inc index 8772585..6d92af2 100644 --- a/inc/savegame.inc +++ b/inc/savegame.inc @@ -1,6 +1,8 @@ count; $i++) // Add the right count of items to Inventory + Inventory::addItem(Item::fromXML($item)); + } } else { // If nested array $table[$k] = array(); parseSave($v, $table[$k]); -- cgit v1.2.3-70-g09d2 From f734770dd4fe464a8c263218efa90fd487c6a608 Mon Sep 17 00:00:00 2001 From: piernov Date: Sun, 8 May 2016 14:41:25 +0200 Subject: Add feature attribute to Item class + add consume() method to use those features + use coercion on updatePerso() values --- inc/Item.inc | 15 ++++++++++++++- inc/perso.inc | 13 ++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) (limited to 'inc') diff --git a/inc/Item.inc b/inc/Item.inc index 907872e..f01b709 100644 --- a/inc/Item.inc +++ b/inc/Item.inc @@ -1,16 +1,29 @@ name = $name; $this->cost = $cost; $this->icon = $icon; $this->desc = $desc; + $this->feat = $feat; + } + + function consume() { + foreach($this->feat as $k => $v) { + switch($k) { + case "hp": increasePerso("hp", +$v); break; + case "power": break; + } + } } function addToXML($root, $count) { diff --git a/inc/perso.inc b/inc/perso.inc index 0362d8c..f455173 100644 --- a/inc/perso.inc +++ b/inc/perso.inc @@ -1,17 +1,24 @@ Date: Sun, 8 May 2016 14:41:56 +0200 Subject: Fix Item deletion in Inventory + add call to consume() --- inc/Inventory.inc | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'inc') diff --git a/inc/Inventory.inc b/inc/Inventory.inc index 751f728..c4096b7 100644 --- a/inc/Inventory.inc +++ b/inc/Inventory.inc @@ -38,7 +38,12 @@ class Inventory { } private function _removeItem($item) { - unset($this->items[array_search($item, $this->items)]); + foreach($this->items as $k => $object) { + if($object[0] == $item) { + unset($this->items[$k]); + return; + } + } } public static function removeItem($item) { @@ -48,10 +53,15 @@ class Inventory { private function _useItem($item) { foreach($this->items as $k => $object){ - if($object[0] == $item){ - if($this->items[$k][1]>0)$this->items[$k][1]--; - //if($this->items[$k][1] == 0) _removeItem($item); - return $this->items[$k]; + if($object[0] == $item) { + $nb = $this->items[$k][1]; + if($nb > 0) { + $this->items[$k][0]->consume(); + $this->items[$k][1]--; + if($nb <= 0) $this->_removeItem($item); + return array($object[0], $nb-1); + } + else $this->_removeItem($item); } } return false; -- cgit v1.2.3-70-g09d2 From cdba8c2fd7785b0a6506d1369d790bbd1d8542ad Mon Sep 17 00:00:00 2001 From: piernov Date: Sun, 8 May 2016 14:42:30 +0200 Subject: Read features from XML + send updated perso stats on useItem() --- inc/shop.inc | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'inc') diff --git a/inc/shop.inc b/inc/shop.inc index 32ecea2..69161e1 100644 --- a/inc/shop.inc +++ b/inc/shop.inc @@ -4,6 +4,7 @@ require_once("messages.inc"); require_once("account.inc"); require_once("Item.inc"); require_once("Inventory.inc"); +require_once("perso.inc"); function loadShop(){ $items = simplexml_load_file('data/items.xml'); @@ -12,7 +13,15 @@ function loadShop(){ $category = (string)$cat["name"]; $shop["items"][$category] = array(); foreach($cat as $item){ - $shop["items"][$category][] = new Item((string)$item->name,intval($item->cost),(string)$item->icon,(string)$item->description); + $feats = array(); + foreach($item->features[0] as $k => $v) + $feats[(string)$k] = (string)$v; + $shop["items"][$category][] = new Item( + (string)$item->name, + intval($item->cost), + (string)$item->icon, + (string)$item->description, + $feats); } } return $shop; @@ -63,7 +72,7 @@ function buyItem() { function useItem(){ $item = getItem($_POST["item"]); $it = Inventory::useItem($item); - echo json_encode($it); + echo json_encode(array("perso" => sendPerso(), "item" => $it)); } -- cgit v1.2.3-70-g09d2 From 818a88625577b4422f82af6fda3718b43b84fb6d Mon Sep 17 00:00:00 2001 From: piernov Date: Sun, 8 May 2016 15:09:55 +0200 Subject: Items feature support on save/load game --- inc/Item.inc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'inc') diff --git a/inc/Item.inc b/inc/Item.inc index f01b709..8eebbf8 100644 --- a/inc/Item.inc +++ b/inc/Item.inc @@ -32,11 +32,18 @@ class Item { $item->addChild("cost", $this->cost); $item->addChild("icon", $this->icon); $item->addChild("desc", $this->desc); + $xmlfeat = $item->addChild("feat"); + foreach($this->feat as $k => $v) + $xmlfeat->addChild($k, $v); $item->addChild("count", $count); } public static function fromXML($xml) { - return new static((string)$xml->name, +(string)$xml->cost /* convert to number */, (string)$xml->icon, (string)$xml->desc); + $feats = array(); + foreach($xml->feat[0] as $k => $v) + $feats[(string)$k] = (string)$v; + + return new static((string)$xml->name, +(string)$xml->cost /* convert to number */, (string)$xml->icon, (string)$xml->desc, $feats); } } -- cgit v1.2.3-70-g09d2 From f1677164c3f46785f6d9380b68cdeba58a680404 Mon Sep 17 00:00:00 2001 From: piernov Date: Sun, 8 May 2016 15:31:33 +0200 Subject: Fix Item deletion in Inventory again --- inc/Inventory.inc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'inc') diff --git a/inc/Inventory.inc b/inc/Inventory.inc index c4096b7..2be48f8 100644 --- a/inc/Inventory.inc +++ b/inc/Inventory.inc @@ -58,10 +58,9 @@ class Inventory { if($nb > 0) { $this->items[$k][0]->consume(); $this->items[$k][1]--; - if($nb <= 0) $this->_removeItem($item); - return array($object[0], $nb-1); } - else $this->_removeItem($item); + if($nb-1 <= 0) $this->_removeItem($item); + return array($object[0], $nb-1); } } return false; -- cgit v1.2.3-70-g09d2 From 2f32bc3153b7f2c2561e4603f912573921e6449f Mon Sep 17 00:00:00 2001 From: alexichi Date: Mon, 9 May 2016 20:26:51 +0200 Subject: add the use of the objects and the feature power and maxHP --- data/items.xml | 9 ++++++--- data/monsters.xml | 33 +++++++++++++++++++++------------ inc/Inventory.inc | 14 +++++++++----- inc/Item.inc | 2 +- inc/Monster.inc | 4 +++- inc/dungeon.inc | 3 ++- inc/perso.inc | 33 +++++++++++++++++++++++++++++++++ index.xhtml | 10 +++++++++- js/craftmine.js | 17 +++++++++++++++-- js/dungeon.js | 35 +++++++++++++++++++---------------- js/perso.js | 24 ++++++++++++++++++++++-- js/shop.js | 2 -- 12 files changed, 140 insertions(+), 46 deletions(-) (limited to 'inc') diff --git a/data/items.xml b/data/items.xml index 9489b1a..4448b1c 100644 --- a/data/items.xml +++ b/data/items.xml @@ -5,7 +5,8 @@ Wooden Sword 10 - 10 + +1 + 1 A sword that beginners need to use to improve their skills @@ -14,7 +15,8 @@ Metal Sword 15 - 30 + +3 + 1 A sword which are often use buy skilled knight. The material is very good and the sword is very powerful @@ -34,7 +36,8 @@ Strength Bottle 10 - 20 + +2 + 3 🍶 If used, you have 20% more chance to hit your enemy during the battle diff --git a/data/monsters.xml b/data/monsters.xml index ab29364..a8dc2f7 100644 --- a/data/monsters.xml +++ b/data/monsters.xml @@ -6,21 +6,24 @@ 1 3 1 - m + 1 + 👾 monster2 2 3 2 - m + 2 + 👾 monster3 3 4 3 - m + 3 + 👾 @@ -29,44 +32,50 @@ 4 5 4 - m + 4 + 👾 monster5 5 6 5 - m + 5 + 👾 - monster5 + monster6 6 7 6 - m + 6 + 👾 - monster6 + monster7 8 9 8 - m + 8 + 👾 - monster7 + monster8 9 10 9 - m + 9 + 👾 Boss 10 12 10 - m + 14 + 👾 diff --git a/inc/Inventory.inc b/inc/Inventory.inc index 2be48f8..3e0137d 100644 --- a/inc/Inventory.inc +++ b/inc/Inventory.inc @@ -1,5 +1,7 @@ items as $k => $object){ if($object[0] == $item) { $nb = $this->items[$k][1]; - if($nb > 0) { - $this->items[$k][0]->consume(); - $this->items[$k][1]--; + if(limitUse($this->items[$k][0])){ + if($nb > 0) { + $this->items[$k][0]->consume(); + $this->items[$k][1]--; + } + if($nb-1 <= 0) $this->_removeItem($item); + return array($object[0], $nb-1); } - if($nb-1 <= 0) $this->_removeItem($item); - return array($object[0], $nb-1); } } return false; diff --git a/inc/Item.inc b/inc/Item.inc index 8eebbf8..a8ee302 100644 --- a/inc/Item.inc +++ b/inc/Item.inc @@ -21,7 +21,7 @@ class Item { foreach($this->feat as $k => $v) { switch($k) { case "hp": increasePerso("hp", +$v); break; - case "power": break; + case "power": increasePerso("bonusPower", +$v); break; } } } diff --git a/inc/Monster.inc b/inc/Monster.inc index c7063ec..ae48691 100644 --- a/inc/Monster.inc +++ b/inc/Monster.inc @@ -7,12 +7,14 @@ class Monster { public $hp = 1; public $xp = 0; public $level = 1; + public $power = 1; - function __construct($name, $level, $hp, $xp, $icon) { + function __construct($name, $level, $hp, $xp, $power, $icon) { $this->name = $name; $this->level = $level; $this->hp = $hp; $this->xp = $xp; + $this->power = $power; $this->icon = $icon; } diff --git a/inc/dungeon.inc b/inc/dungeon.inc index c023cf8..521303e 100644 --- a/inc/dungeon.inc +++ b/inc/dungeon.inc @@ -14,7 +14,8 @@ function generateMonster(){ $dungeon["monsters"][$floor][] = new Monster((string)$monster->name, intval($monster->level), intval($monster->hp), - intval($monster->xp), + intval($monster->xp), + intval($monster->power), (string)$monster->icon); } } diff --git a/inc/perso.inc b/inc/perso.inc index f455173..0a32b64 100644 --- a/inc/perso.inc +++ b/inc/perso.inc @@ -10,21 +10,54 @@ function increasePerso($prop, $num) { if(empty($_SESSION["perso"])) initPerso(); $_SESSION["perso"][$prop] += $num; + if($_SESSION["perso"]["hp"] > $_SESSION["perso"]["maxHP"]){//if you want to heal even if you have less than 3 hp to heal, heal until the max is attained + $diff = $_SESSION["perso"]["hp"] - $_SESSION["perso"]["maxHP"]; + $_SESSION["perso"]["hp"] -= $diff; + } +} + +/** + *traite le fait que wooden sword n'est pas cumulable + *metal sword non plus + *life bottle cumulable 3 fois + *si on clique sur wooden sword alors que on avait une metal sword, le bonusPower passe de +3 à +1 + */ +function limitUse($item){ + $n = $item->name; + if($n =="Life Bottle")return true; + if(empty($_SESSION[$n])){ + $_SESSION[$n]=1; + return true; + } + else{ + $_SESSION[$n]++; + if($_SESSION[$n] >= $item->feat["limit"])return false; + else return true; + } } function updatePerso(){ $hp = $_POST["hp"]; + $maxHP = $_POST["maxHP"]; $xp = $_POST["xp"]; $lv = $_POST["lv"]; + $power = $_POST["power"]; + $bonusPower = $_POST["bonusPower"]; $_SESSION["perso"]["hp"] = +$hp; + $_SESSION["perso"]["maxHP"] = +$maxHP; $_SESSION["perso"]["xp"] = +$xp; $_SESSION["perso"]["lv"] = +$lv; + $_SESSION["perso"]["power"] = +$power; + $_SESSION["perso"]["bonusPower"] = +$bonusPower; } function initPerso(){ $_SESSION["perso"]["hp"] = 5; + $_SESSION["perso"]["maxHP"] = 5; $_SESSION["perso"]["xp"] = 0; $_SESSION["perso"]["lv"] = 3; + $_SESSION["perso"]["power"] = 3; + $_SESSION["perso"]["bonusPower"] = 0; } ?> diff --git a/index.xhtml b/index.xhtml index 1ea1bfe..eba0f43 100644 --- a/index.xhtml +++ b/index.xhtml @@ -30,9 +30,17 @@
      -
    • HP5
    • +
    • HP + 5 / + 5 + +
    • LV1
    • Exp0
    • +
    • Power + 1 + + 0 +
      diff --git a/js/craftmine.js b/js/craftmine.js index 77cafee..fa70809 100644 --- a/js/craftmine.js +++ b/js/craftmine.js @@ -5,8 +5,11 @@ data = { miners: 0, level: 3, hp: 5, + maxHP: 5, xp: 0, - icon : "H" + power: 3, + bonusPower: 0, + icon : "💪" } function sendRequest(url, params, callback, isFile) { @@ -41,6 +44,16 @@ function debitAccount(amount) { updateData("gold"); } +function creditAccount(amount){ + data.gold += amount; + sendRequest("craftmine.php", "op=withdrawMine&amount="+amount, function(xhr) { + var gold = parseInt(xhr); + if(isNaN(gold)) return; + data.gold = gold; + updateData("gold"); + }); +} + function withdrawMine() { sendRequest("craftmine.php", "op=withdrawMine&amount="+data.mine, function(xhr) { var gold = parseInt(xhr); // Server's response is a string @@ -53,7 +66,7 @@ function withdrawMine() { function initCraftMine() { sendRequest("craftmine.php", "op=getCraftMine", function(ret) { - console.log(ret.perso); + //console.log(ret.perso); data.gold = parseInt(ret.gold); // Server's response is a string data.mine = 0; // Reset mine if(ret.perso) updatePerso(ret.perso); diff --git a/js/dungeon.js b/js/dungeon.js index 6ebf4dd..2921c7d 100644 --- a/js/dungeon.js +++ b/js/dungeon.js @@ -2,7 +2,7 @@ var timeout; function buildDungeon(){ sendRequest("craftmine.php", "op=buildDungeon", function(ret) { - displayDungeon(0,1,true);//mob 0 in the floor 1 and I access the dungeon for the first dungeon + displayDungeon(0,1,true);//mob 0 in the floor 1 and I access the dungeon for the first time debitAccount(ret.cost); showInfo("You can acces the dungeon now. Good Luck."); }); @@ -45,21 +45,23 @@ function battle(ret,nb,f){ } function strike(ret,nb, f){ - var lvDiff = data.level-parseInt(ret[0].level); + var powerDiff = (data.power+data.bonusPower)-parseInt(ret[nb].power); var hitRate = Math.floor((Math.random() * 100) + 1); var mobLife = document.getElementById("lifeMob").innerHTML; var persoLife = document.getElementById("lifePerso").innerHTML; if(mobLife == 0){ data.hp = persoLife; + data.bonusPower = 0; //à revoir car l'épée doit continuer à apporter un bonus endBattle("perso",nb,f,ret); return; } else if(persoLife == 0){ data.hp = 1; + data.bonusPower = 0;//when you die you lose your sword and all your power bonus endBattle("mob",nb,f,ret); return; } - if(hitRate<50+10*lvDiff){ + if(hitRate<50+10*powerDiff){ mobLife--; document.getElementById("lifeMob").innerHTML = parseInt(mobLife); } @@ -76,15 +78,7 @@ function endBattle(v,nb, f, ret){ //To level up you have to obtain 2 xp to go to lv 3, 3 to go to lv 4, etc //A mob level 2 , if defeated gives you 2 xp, ...etc else{ - data.xp += parseInt(ret[nb].xp); - if(data.xp>=data.level){ - data.xp-=data.level; - data.level++; - //need to send the xp to the server - sendRequest("craftmine.php", "op=updatePerso&hp="+data.hp+"&xp="+data.xp+"&lv="+data.level, function(){ - displayPerso(data.hp,data.xp,data.level); - }); - } + levelUp(ret[nb].xp); nb++;//go to the next mob in the same floor if(nb>=3){//floor changing nb=0;//reset the number of the mob @@ -100,8 +94,8 @@ function endBattle(v,nb, f, ret){ displayExit(); sendRequest("craftmine.php", "op=sendDungeonProgress&floor="+f+"&mob="+nb); } - sendRequest("craftmine.php", "op=updatePerso&hp="+data.hp+"&xp="+data.xp+"&lv="+data.level, function(){ - displayPerso(data.hp,parseInt(data.xp),data.level); + sendRequest("craftmine.php", "op=updatePerso&hp="+data.hp+"&maxHP="+data.maxHP+"&xp="+data.xp+"&lv="+data.level+"&power="+data.power+"&bonusPower="+data.bonusPower, function(){ + displayPerso(data.hp,data.maxHP,data.xp,data.level,data.power,data.bonusPower); }); } @@ -114,8 +108,17 @@ function displayExit(){ function exitDungeon(boss){ sendRequest("craftmine.php", "op=exitDungeon", function() { window.clearTimeout(timeout); - document.getElementById("tab4").innerHTML = "

      Not available, you have to buy a ticket in the build section.

      "; - if(boss) showInfo("You have beaten the final boss! CONGRATULATIONS!"); + if(boss){//if the boss is beaten + levelUp(20);//you earn 20 xp + creditAccount(1000);//you earn 1000 gold coins + var tmphtml = "

      You have completed the dungeon! CONGRATULATIONS!

      "; + tmphmtl += "
        "; + tmphtml += "
      • You have earned 1000 gold coins

      • " + tmphmtl += "
      • You have earned 20 xp

      • "; + tmphmtl += "
      "; + document.getElementById("tab4").innerHTML = tmphtml; + } + else document.getElementById("tab4").innerHTML = "

      Not available, you have to buy a ticket in the build section.

      "; showInfo("You have left the dungeon"); }); } diff --git a/js/perso.js b/js/perso.js index 02a8892..44b82eb 100644 --- a/js/perso.js +++ b/js/perso.js @@ -1,12 +1,32 @@ -function displayPerso(hp,xp,lv){ +function displayPerso(hp,maxHP,xp,lv,power,bonusPower){ document.getElementById("hp").innerHTML = hp; + document.getElementById("maxHP").innerHTML = maxHP; document.getElementById("lv").innerHTML = lv; document.getElementById("xp").innerHTML = xp; + document.getElementById("power").innerHTML = power; + document.getElementById("bonusPower").innerHTML = bonusPower; } function updatePerso(perso) { data.hp = perso.hp; + data.maxHP = perso.maxHP; data.xp = perso.xp; data.level = perso.lv; - displayPerso(perso.hp, perso.xp, perso.lv); + data.power = perso.power; + data.bonusPower = perso.bonusPower; + displayPerso(perso.hp, perso.maxHP, perso.xp, perso.lv, perso.power, perso.bonusPower); +} + +function levelUp(xp){ + data.xp += parseInt(xp); + while(data.xp>=data.level){ + data.xp-=data.level; + data.level++; + data.power++; + data.maxHP+=2; + } + //need to send the xp to the server + sendRequest("craftmine.php", "op=updatePerso&hp="+data.hp+"&maxHP="+data.maxHP+"&xp="+data.xp+"&lv="+data.level+"&power="+data.power+"&bonusPower="+bonusPower, function(){ + displayPerso(data.hp,data.maxHP,data.maxHP,data.xp,data.level,data.power,data.bonusPower); + }); } diff --git a/js/shop.js b/js/shop.js index a520a38..b6d4cee 100644 --- a/js/shop.js +++ b/js/shop.js @@ -69,10 +69,8 @@ function useItem(name) { sendRequest("craftmine.php", "op=useItem&item="+name, function(ret) { if(!ret.item) return; if(ret.perso) updatePerso(ret.perso); - var item = document.querySelector("[data-name=\""+ret.item[0].name+"\"]"); var nb = ret.item[1]; - if(nb>=1) item.innerHTML = nb; else -- cgit v1.2.3-70-g09d2