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/Item.inc | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'inc/Item.inc') 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 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/Item.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 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/Item.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/Item.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 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/Item.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 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/Item.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