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(-) 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-54-g00ecf From b141eb3d70b3dc2d75ee8f2bf2edba1fed71f5b6 Mon Sep 17 00:00:00 2001 From: piernov Date: Mon, 25 Apr 2016 13:47:13 +0200 Subject: Add Symbola font for items icons --- css/Symbola.ttf | Bin 0 -> 2188952 bytes css/craftmine.css | 6 ++++++ 2 files changed, 6 insertions(+) create mode 100644 css/Symbola.ttf diff --git a/css/Symbola.ttf b/css/Symbola.ttf new file mode 100644 index 0000000..51d9a88 Binary files /dev/null and b/css/Symbola.ttf differ diff --git a/css/craftmine.css b/css/craftmine.css index 2a51ff7..a3ab87d 100644 --- a/css/craftmine.css +++ b/css/craftmine.css @@ -1,3 +1,8 @@ +@font-face { + font-family: "Symbola"; + font-weight: bold; + src: url('Symbola.ttf'); +} .tab-pane { display: none; } @@ -6,4 +11,5 @@ } .item-icon { font-size: 3em; + font-family: "Symbola"; } -- cgit v1.2.3-54-g00ecf 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 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 += "
    "; - for(var i=0; i < ret.items.length; i++) { - tmphtml += "
  • "; - tmphtml += ""; - tmphtml += "
  • "; + var tmphtml = "

    Select an item to buy it:

    "; + for(var key in ret.items){ + if(ret.items.hasOwnProperty(key)){ + var category = ret.items[key]; + tmphtml += "
    "; + tmphtml += "

    "+key+"

    "; + tmphtml += "
      "; + for(var i=0; i < category.length; i++) { + tmphtml += "
    • "; + tmphtml += ""; + tmphtml += "
    • "; + } + tmphtml += "
    "; + tmphtml += "
    "; + } } - 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-54-g00ecf From 3c3d48c02730a826c7677dad2aaa01caf8e6de8b Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 27 Apr 2016 19:34:56 +0200 Subject: Also handle GET request for op in craftmine.php --- craftmine.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/craftmine.php b/craftmine.php index 78c5e37..dd2aa9e 100644 --- a/craftmine.php +++ b/craftmine.php @@ -7,6 +7,8 @@ require_once("inc/craftmine.inc"); session_start(); // Must be placed *BEFORE* $_SESSION is actually used and *AFTER* all classes are imported +$op = ""; + /** * Indique au client une message requete. */ @@ -27,14 +29,16 @@ function reportBadRequest() { exit(); } if (!isset($_POST["op"])) { - reportBadRequest(); -} + if(!isset($_GET["op"])) + reportBadRequest(); + else + $op = $_GET["op"]; +} else $op = $_POST["op"]; /** * On récupère l'opération à exécuter et on le fait. */ -$op = $_POST["op"]; switch($op) { case "withdrawMine": withdrawMine(); break; case "createGuild": createGuild(); break; -- cgit v1.2.3-54-g00ecf From 2b0a84a41eeb90094d42c3c516bf99837d08a745 Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 27 Apr 2016 19:47:34 +0200 Subject: Automatically show received info --- js/craftmine.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/js/craftmine.js b/js/craftmine.js index 92fa45a..28583dd 100644 --- a/js/craftmine.js +++ b/js/craftmine.js @@ -12,6 +12,8 @@ function sendRequest(url, params, callback) { xhr.onreadystatechange = function() { if(xhr.readyState == XMLHttpRequest.DONE && xhr.status == "200") { var data = JSON.parse(xhr.responseText); + if(data.info) + showInfo(data.info); if(data.error) { showError(data.error); return; -- cgit v1.2.3-54-g00ecf From 0133251e523b1c984b2b5cdb60c7392c18e6bd73 Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 27 Apr 2016 19:51:32 +0200 Subject: Add button for saving on server/downloading the game --- index.xhtml | 2 ++ js/craftmine.js | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/index.xhtml b/index.xhtml index aa29615..d12585f 100644 --- a/index.xhtml +++ b/index.xhtml @@ -32,6 +32,8 @@
+ +
diff --git a/js/craftmine.js b/js/craftmine.js index 92fa45a..13dd0a2 100644 --- a/js/craftmine.js +++ b/js/craftmine.js @@ -60,6 +60,14 @@ function updateMine() { updateData("mine"); } +function saveGame() { + sendRequest("craftmine.php", "op=saveGame"); +} + +function downGame() { + window.open("craftmine.php?op=downGame", "_blank"); +} + function init() { initCraftMine(); changeTab(); -- cgit v1.2.3-54-g00ecf 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(-) 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-54-g00ecf 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(+) 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-54-g00ecf 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(-) 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-54-g00ecf From 043009630b775251ea20dcfb9316ac68585d1d3a Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 27 Apr 2016 20:39:23 +0200 Subject: Savegame PHP action handling --- craftmine.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/craftmine.php b/craftmine.php index dd2aa9e..ac187cc 100644 --- a/craftmine.php +++ b/craftmine.php @@ -4,6 +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/savegame.inc"); session_start(); // Must be placed *BEFORE* $_SESSION is actually used and *AFTER* all classes are imported @@ -46,6 +47,8 @@ switch($op) { case "getCraftMine": sendCraftMine(); break; case "buildShop": buildShop(); break; case "buyItem": buyItem(); break; + case "saveGame": saveGame(); break; + case "downSave": downSave(); break; default: reportBadRequest(); } -- cgit v1.2.3-54-g00ecf 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 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-54-g00ecf From caf62cfe0e439fc13f7c297954c4aeb21112a2ec Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 27 Apr 2016 20:46:27 +0200 Subject: Add data/save directory --- data/save/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 data/save/.gitignore diff --git a/data/save/.gitignore b/data/save/.gitignore new file mode 100644 index 0000000..4fcbff5 --- /dev/null +++ b/data/save/.gitignore @@ -0,0 +1 @@ +*.save.xml -- cgit v1.2.3-54-g00ecf From bac3c105884f7045c78584638c7381bfe3d00de2 Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 27 Apr 2016 20:52:47 +0200 Subject: Improve item list appearance --- css/craftmine.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/css/craftmine.css b/css/craftmine.css index a3ab87d..c459baa 100644 --- a/css/craftmine.css +++ b/css/craftmine.css @@ -9,7 +9,13 @@ .tab-pane:target { display: block; } +.list-inline > li { + padding-top: 5px; + padding-bottom: 5px; +} .item-icon { + display:inline-block; + width: 1em; font-size: 3em; font-family: "Symbola"; } -- cgit v1.2.3-54-g00ecf 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(-) 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-54-g00ecf From 3c297defe63a2af75cc7aafcfa5cf74dd1f2c20a Mon Sep 17 00:00:00 2001 From: alexichi Date: Fri, 29 Apr 2016 21:04:45 +0200 Subject: I lower the prices because it was getting on my nerves --- data/items.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/items.xml b/data/items.xml index 528d37a..6c19b84 100644 --- a/data/items.xml +++ b/data/items.xml @@ -3,7 +3,7 @@ Wooden Sword - 50 + 10 10 @@ -12,7 +12,7 @@ Metal Sword - 200 + 15 30 @@ -23,14 +23,14 @@ Life Bottle - 100 + 5 🍶 A bottle which can heal you by regaining hp Strength Bottle - 250 + 10 20 -- cgit v1.2.3-54-g00ecf 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(-) 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-54-g00ecf 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 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-54-g00ecf 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(-) 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-54-g00ecf 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(+) 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-54-g00ecf 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(-) 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-54-g00ecf From b60d56327a1b8531d15348034889e67f8b49444d Mon Sep 17 00:00:00 2001 From: piernov Date: Mon, 2 May 2016 15:44:28 +0200 Subject: Allow empty data from server --- js/craftmine.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/craftmine.js b/js/craftmine.js index 8af8296..608efb7 100644 --- a/js/craftmine.js +++ b/js/craftmine.js @@ -11,7 +11,8 @@ function sendRequest(url, params, callback) { xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.onreadystatechange = function() { if(xhr.readyState == XMLHttpRequest.DONE && xhr.status == "200") { - var data = JSON.parse(xhr.responseText); + var data = ""; + if(xhr.responseText) data = JSON.parse(xhr.responseText); if(data.info) showInfo(data.info); if(data.error) { -- cgit v1.2.3-54-g00ecf From 6bff76321ab05d6193bc1d35327cb44128f9ed66 Mon Sep 17 00:00:00 2001 From: piernov Date: Mon, 2 May 2016 15:45:44 +0200 Subject: Force reset mine on game reload --- js/craftmine.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/craftmine.js b/js/craftmine.js index 608efb7..d649305 100644 --- a/js/craftmine.js +++ b/js/craftmine.js @@ -50,10 +50,11 @@ function withdrawMine() { function initCraftMine() { sendRequest("craftmine.php", "op=getCraftMine", function(ret) { data.gold = parseInt(ret.gold); // Server's response is a string + data.mine = 0; // Reset mine if(ret.shop) displayShop(ret.shop); displayInventory(ret.inventory); data.miners = parseInt(ret.miners); - updateData("gold","miners"); + updateData("gold", "mine", "miners"); }) } -- cgit v1.2.3-54-g00ecf 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(-) 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-54-g00ecf From f53549e4c2668ca268c8e31ef4c7cf3718fe08b5 Mon Sep 17 00:00:00 2001 From: piernov Date: Mon, 2 May 2016 15:50:14 +0200 Subject: Move saveGame()/downGame() to its own JS file --- index.xhtml | 1 + js/craftmine.js | 8 -------- js/savegame.js | 7 +++++++ 3 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 js/savegame.js diff --git a/index.xhtml b/index.xhtml index d12585f..e879cf1 100644 --- a/index.xhtml +++ b/index.xhtml @@ -15,6 +15,7 @@ +
    diff --git a/js/craftmine.js b/js/craftmine.js index 13dd0a2..92fa45a 100644 --- a/js/craftmine.js +++ b/js/craftmine.js @@ -60,14 +60,6 @@ function updateMine() { updateData("mine"); } -function saveGame() { - sendRequest("craftmine.php", "op=saveGame"); -} - -function downGame() { - window.open("craftmine.php?op=downGame", "_blank"); -} - function init() { initCraftMine(); changeTab(); diff --git a/js/savegame.js b/js/savegame.js new file mode 100644 index 0000000..2a83f77 --- /dev/null +++ b/js/savegame.js @@ -0,0 +1,7 @@ +function saveGame() { + sendRequest("craftmine.php", "op=saveGame"); +} + +function downGame() { + window.open("craftmine.php?op=downSave", "_blank"); +} -- cgit v1.2.3-54-g00ecf From 8c0851a7d4db8be1bac99e034c745a45c64cc3ba Mon Sep 17 00:00:00 2001 From: piernov Date: Mon, 2 May 2016 15:51:08 +0200 Subject: Add various JS functions to work with game save --- js/savegame.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/js/savegame.js b/js/savegame.js index 2a83f77..438be0a 100644 --- a/js/savegame.js +++ b/js/savegame.js @@ -1,3 +1,35 @@ +function listSaves() { + sendRequest("craftmine.php", "op=listSaves", function(ret) { + var tmphtml="" + for(var i=0; i" + ret[i] + "\n"; + } + console.log(tmphtml); + document.getElementById("listsaves").innerHTML = tmphtml; + }); +} + +function getCheckedSave() { + var radios = document.getElementsByName('saveRadio'); + for (var i = 0, length = radios.length; i < length; i++) { + if (radios[i].checked) return radios[i].parentNode.textContent; + } + return -1; +} + +function loadSave() { + sendRequest("craftmine.php", "op=loadSave&filename="+getCheckedSave(), function(ret) { + initCraftMine(); + }); +} + +function downloadSave() { + window.open("craftmine.php?op=downSave&filename="+getCheckedSave(), "_blank"); +} + +function deleteSave() { +} + function saveGame() { sendRequest("craftmine.php", "op=saveGame"); } -- cgit v1.2.3-54-g00ecf From c6e05fbec675d1f60e6adb2b29d6fed4f888fb1d Mon Sep 17 00:00:00 2001 From: piernov Date: Mon, 2 May 2016 15:51:43 +0200 Subject: Add Save tab --- index.xhtml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/index.xhtml b/index.xhtml index e879cf1..6627ec5 100644 --- a/index.xhtml +++ b/index.xhtml @@ -65,6 +65,7 @@
  • Shop
  • Inventory
  • Dungeon
  • +
    @@ -83,11 +84,18 @@

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

    +
    +

    Saved games:

    +
    +
    +
      +
    • +
    • +
    • +
    +
    - - -
    -- cgit v1.2.3-54-g00ecf 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(+) 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-54-g00ecf 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(-) 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-54-g00ecf 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(-) 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-54-g00ecf 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(-) 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-54-g00ecf From cbfbedcaceccda890a7f15cb806561ede72e8044 Mon Sep 17 00:00:00 2001 From: piernov Date: Mon, 2 May 2016 20:14:17 +0200 Subject: Allow multiple classes on tabs --- js/gui.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/js/gui.js b/js/gui.js index bdf1710..89fa0fa 100644 --- a/js/gui.js +++ b/js/gui.js @@ -6,10 +6,8 @@ function changeTab() { var id = window.location.hash.substr(4); var tabs = document.querySelectorAll("#tabs-panel > ul > li"); for(var i=0; i < tabs.length; i++) { - if(i == id-1) - tabs[i].className = "active"; - else - tabs[i].className = ""; + if(i == id-1) tabs[i].classList.add("active"); // Doesn't work with IE < 10 (and Opera Mini), but who cares? + else tabs[i].classList.remove("active"); } } -- cgit v1.2.3-54-g00ecf 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(-) 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-54-g00ecf From 036d5a2e88232e966cfd0cc82277d5fba13e71ff Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 4 May 2016 14:25:50 +0200 Subject: Add upload button for save + move save/download button --- index.xhtml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/index.xhtml b/index.xhtml index 6627ec5..5e0752a 100644 --- a/index.xhtml +++ b/index.xhtml @@ -33,8 +33,6 @@
    - -
    @@ -90,7 +88,11 @@
    • +
    • +
    • +
    • +
    -- cgit v1.2.3-54-g00ecf 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(-) 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-54-g00ecf 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(+) 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-54-g00ecf From 80f61cc5216fe020f82fc303317e4098acb5d21d Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 4 May 2016 14:27:59 +0200 Subject: AJAX upload file --- js/savegame.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/js/savegame.js b/js/savegame.js index 4a08f91..d5a9ba1 100644 --- a/js/savegame.js +++ b/js/savegame.js @@ -24,7 +24,9 @@ function loadSave() { } function downloadSave() { - window.open("craftmine.php?op=downSave&filename="+getCheckedSave(), "_blank"); + var filename = getCheckedSave(); + if(filename == -1) downGame(); + else window.open("craftmine.php?op=downSave&filename="+getCheckedSave(), "_blank"); } function deleteSave() { @@ -40,3 +42,18 @@ function saveGame() { function downGame() { window.open("craftmine.php?op=downSave", "_blank"); } + +function uploadSave() { + var selectedFile = document.getElementById("selectedFile"); + if(selectedFile.files[0].size > 2000000) { + showError("File is too big."); + return; + } + + var form = new FormData(); // Doesn't work with IE < 10 (and Opera Mini), but, as always, who cares? + form.append("savefile", selectedFile.files[0]); + + sendRequest("upload.php", form, function(ret) { + console.log(ret); + }, true); +} -- cgit v1.2.3-54-g00ecf From 3a8e674e0cba99d32cdd012ac9ac593f27c9a35c Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 4 May 2016 14:28:20 +0200 Subject: PHP front page for upload --- upload.php | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 upload.php diff --git a/upload.php b/upload.php new file mode 100644 index 0000000..a6e1637 --- /dev/null +++ b/upload.php @@ -0,0 +1,6 @@ + -- cgit v1.2.3-54-g00ecf From ec7771705d62d09fcd142c87f4941604f31c1d76 Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 4 May 2016 14:32:49 +0200 Subject: Don't send content-type when uploading file + update saves list when loading page --- js/craftmine.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/js/craftmine.js b/js/craftmine.js index 92fa45a..4e6490f 100644 --- a/js/craftmine.js +++ b/js/craftmine.js @@ -5,10 +5,10 @@ data = { level: 1 } -function sendRequest(url, params, callback) { +function sendRequest(url, params, callback, isFile) { var xhr = new XMLHttpRequest(); xhr.open("POST", url); - xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + if(!isFile) xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.onreadystatechange = function() { if(xhr.readyState == XMLHttpRequest.DONE && xhr.status == "200") { var data = JSON.parse(xhr.responseText); @@ -63,5 +63,6 @@ function updateMine() { function init() { initCraftMine(); changeTab(); + listSaves(); window.setInterval(updateMine, 1000); } -- cgit v1.2.3-54-g00ecf 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(-) 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-54-g00ecf From b994c39019ff6a74870dda3b8c78326ef917ded4 Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 4 May 2016 14:49:09 +0200 Subject: Remove useless data-toggle attribute --- index.xhtml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/index.xhtml b/index.xhtml index 9260134..dea1e22 100644 --- a/index.xhtml +++ b/index.xhtml @@ -60,11 +60,11 @@
    -- cgit v1.2.3-54-g00ecf From fcf504d0cb37545d6157f384eccdfd82daaa55e4 Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 4 May 2016 14:51:09 +0200 Subject: Remove useless role attributeé MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.xhtml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/index.xhtml b/index.xhtml index dea1e22..bd2cdf3 100644 --- a/index.xhtml +++ b/index.xhtml @@ -60,11 +60,11 @@
    -- cgit v1.2.3-54-g00ecf From 35ec65de0869c77fc66bf3f2702c561efd98f4af Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 4 May 2016 14:52:35 +0200 Subject: Move onhashchange event hook from XHTML to JavaScript Add some comments --- index.xhtml | 2 +- js/craftmine.js | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/index.xhtml b/index.xhtml index bd2cdf3..f242f76 100644 --- a/index.xhtml +++ b/index.xhtml @@ -18,7 +18,7 @@ - +

    CraftMine

    diff --git a/js/craftmine.js b/js/craftmine.js index 61abbf7..0e95aa3 100644 --- a/js/craftmine.js +++ b/js/craftmine.js @@ -70,7 +70,8 @@ function updateMine() { function init() { initCraftMine(); - changeTab(); - listSaves(); - window.setInterval(updateMine, 1000); + changeTab(); // Switch to tab specified in URL + listSaves(); // Update save list on page load + window.setInterval(updateMine, 1000); // Increase mine amount every 1 second + window.onhashchange = changeTab; // Hook changeTab from js/gui.js to hashchange event } -- cgit v1.2.3-54-g00ecf From 2587d9627294ef3324a88aa6d11be48c72e397f3 Mon Sep 17 00:00:00 2001 From: piernov Date: Wed, 4 May 2016 14:57:54 +0200 Subject: Form → list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.xhtml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/index.xhtml b/index.xhtml index f242f76..77ddf23 100644 --- a/index.xhtml +++ b/index.xhtml @@ -31,10 +31,10 @@ 0

    Miners : 0

    -
    - - -
    +
      +
    • +
    • +