diff options
author | piernov <piernov@piernov.org> | 2016-05-09 22:06:30 +0200 |
---|---|---|
committer | piernov <piernov@piernov.org> | 2016-05-09 22:06:30 +0200 |
commit | f10c51f07a755d75a583f85316efbcd3bd1e4b6d (patch) | |
tree | 87419a11e12f5b7433459fcb5cb9da5211dcbd9e /js | |
parent | 54635d17eef27eb2546d69599e4107b242509ced (diff) | |
parent | 2f32bc3153b7f2c2561e4603f912573921e6449f (diff) | |
download | candybox-f10c51f07a755d75a583f85316efbcd3bd1e4b6d.tar.gz candybox-f10c51f07a755d75a583f85316efbcd3bd1e4b6d.tar.bz2 candybox-f10c51f07a755d75a583f85316efbcd3bd1e4b6d.tar.xz candybox-f10c51f07a755d75a583f85316efbcd3bd1e4b6d.zip |
Merge branch 'alexichi' of ssh://piernov.org/srv/git/candybox into alexichi
Diffstat (limited to 'js')
-rw-r--r-- | js/craftmine.js | 44 | ||||
-rw-r--r-- | js/dungeon.js | 124 | ||||
-rw-r--r-- | js/gui.js | 10 | ||||
-rw-r--r-- | js/perso.js | 32 | ||||
-rw-r--r-- | js/savegame.js | 66 | ||||
-rw-r--r-- | js/shop.js | 53 |
6 files changed, 300 insertions, 29 deletions
diff --git a/js/craftmine.js b/js/craftmine.js index 92fa45a..fa70809 100644 --- a/js/craftmine.js +++ b/js/craftmine.js @@ -1,17 +1,27 @@ data = { + name: "You", gold: 0, mine: 0, miners: 0, - level: 1 + level: 3, + hp: 5, + maxHP: 5, + xp: 0, + power: 3, + bonusPower: 0, + icon : "💪" } -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); + var data = ""; + if(xhr.responseText) data = JSON.parse(xhr.responseText); + if(data.info) + showInfo(data.info); if(data.error) { showError(data.error); return; @@ -34,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 @@ -46,11 +66,17 @@ 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) updatePerso(ret.perso); 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 data.miners = parseInt(ret.miners); - updateData("gold","miners"); + updateData("gold", "mine", "miners"); }) } @@ -62,6 +88,8 @@ function updateMine() { function init() { initCraftMine(); - changeTab(); - 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 } diff --git a/js/dungeon.js b/js/dungeon.js new file mode 100644 index 0000000..2921c7d --- /dev/null +++ b/js/dungeon.js @@ -0,0 +1,124 @@ +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 time + debitAccount(ret.cost); + showInfo("You can acces the dungeon now. Good Luck."); + }); +} + +function displayDungeon(nb,f,firstTime){ + var tmphtml = "<br/>"; + tmphtml += "<button id=\"launch\" type=\"button\" class=\"btn btn-success\" onclick=\"launchDungeon("+nb+","+f+","+firstTime+")\">Launch</button>"; + document.getElementById("tab4").innerHTML = tmphtml; +} + +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,nb,f){ + var tmphtml = "<div class=\"row\">"; + tmphtml += "<h4>Battle floor "+ f +"</h4>"; + tmphtml += "<ul class=\"list-inline\">"; + tmphtml += "<li>"; + tmphtml += "<button type=\"button\" class=\"btn btn-success\" id=\"perso\" style=\"margin-left:30px;\"><span class=\"item-icon\">" + data.icon + "</span><br />" + data.name + "<br/> lv: " + data.level + " hp: <span id=\"lifePerso\">" + data.hp + "</span></button>"; + tmphtml += "<button type=\"button\" class=\"btn btn-success\" id=\"mob\" style=\"margin-left:30px;\">" + +"<span class=\"item-icon\">" + ret[nb].icon + "</span><br />" + ret[nb].name + "<br/>" + +" lv: " + ret[nb].level + " hp: <span id=\"lifeMob\">" + ret[nb].hp + "</span></button>"; + tmphtml += "</li>"; + tmphtml += "</ul>"; + tmphtml += "</div>"; + 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 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*powerDiff){ + mobLife--; + document.getElementById("lifeMob").innerHTML = parseInt(mobLife); + } + else{ + persoLife--; + document.getElementById("lifePerso").innerHTML = parseInt(persoLife); + } + battle(ret,nb,f); +} + +function endBattle(v,nb, f, ret){ + window.clearTimeout(timeout); + 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{ + 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 + 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 += "<button type=\"button\" class=\"btn btn-success\" onclick=\"launchDungeon("+nb+","+ f +",false)\">Next Battle</button>" + document.getElementById("tab4").innerHTML = tmphtml; + displayExit(); + sendRequest("craftmine.php", "op=sendDungeonProgress&floor="+f+"&mob="+nb); + } + 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); + }); +} + +function displayExit(){ + var tmphtml = "<br/><br/>"; + tmphtml += "<button type=\"button\" class=\"btn btn-success\" onclick=\"exitDungeon(false)\">Exit</button>"; + document.getElementById("tab4").innerHTML += tmphtml; +} + +function exitDungeon(boss){ + sendRequest("craftmine.php", "op=exitDungeon", function() { + window.clearTimeout(timeout); + if(boss){//if the boss is beaten + levelUp(20);//you earn 20 xp + creditAccount(1000);//you earn 1000 gold coins + var tmphtml = "<h3>You have completed the dungeon! CONGRATULATIONS!</h3>"; + tmphmtl += "<ul>"; + tmphtml += "<li><h4>You have earned 1000 gold coins</h4></li>" + tmphmtl += "<li><h4>You have earned 20 xp</h4></li>"; + tmphmtl += "</ul>"; + document.getElementById("tab4").innerHTML = tmphtml; + } + else document.getElementById("tab4").innerHTML = "<h4>Not available, you have to buy a ticket in the build section.</h4>"; + showInfo("You have left the dungeon"); + }); +} @@ -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"); } } @@ -17,7 +15,7 @@ function changeTab() { function showMessage(type, msg) { var msg_box = document.getElementById(type+"-box"); msg_box.style.display = "initial"; - var msg_list = msg_box.firstElementChild.firstElementChild.firstElementChild; + var msg_list = msg_box.firstElementChild.firstElementChild; msg_list.innerHTML = "<li>" + msg + "</li>\n" + msg_list.innerHTML; window.setTimeout(hideMessage.bind(null, type), MESSAGE_TIMEOUT); @@ -25,7 +23,7 @@ function showMessage(type, msg) { function hideMessage(type) { var msg_box = document.getElementById(type+"-box"); - var msg_list = msg_box.firstElementChild.firstElementChild.firstElementChild; + var msg_list = msg_box.firstElementChild.firstElementChild; var item = msg_list.lastElementChild; msg_list.removeChild(item); diff --git a/js/perso.js b/js/perso.js new file mode 100644 index 0000000..44b82eb --- /dev/null +++ b/js/perso.js @@ -0,0 +1,32 @@ +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; + 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/savegame.js b/js/savegame.js new file mode 100644 index 0000000..98d973b --- /dev/null +++ b/js/savegame.js @@ -0,0 +1,66 @@ +function listSaves() { + sendRequest("craftmine.php", "op=listSaves", function(ret) { + var tmphtml="" + for(var i=0; i<ret.length; i++) { + tmphtml += "<div class=\"input-group\">"; + tmphtml += "<span class=\"input-group-addon\">"; + tmphtml += "<input name=\"saveRadio\" value=\"" + i + "\" type=\"radio\" />"; + tmphtml += "</span>"; + tmphtml += "<input class=\"form-control\" type=\"text\" value=\"" + ret[i] + "\" readonly=\"readonly\" />"; + + tmphtml += "</div>" + } + 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.parentNode.childNodes.item(1).value; + } + return -1; +} + +function loadSave() { + sendRequest("craftmine.php", "op=loadSave&filename="+getCheckedSave(), function(ret) { + initCraftMine(); + }); +} + +function downloadSave() { + var filename = getCheckedSave(); + if(filename == -1) downGame(); + else window.open("craftmine.php?op=downSave&filename="+getCheckedSave(), "_blank"); +} + +function deleteSave() { + sendRequest("craftmine.php", "op=deleteSave&filename="+getCheckedSave(), function(ret) { + listSaves(); + }); +} + +function saveGame() { + sendRequest("craftmine.php", "op=saveGame", function(ret) { + listSaves(); + }); +} + +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) { + listSaves(); + }, true); +} @@ -1,18 +1,25 @@ function displayShop(ret) { - var tmphtml = "<h4> Select an item to buy it:</h4>"; - tmphtml += "<ul class=\"list-inline\">"; - for(var i=0; i < ret.items.length; i++) { - tmphtml += "<li>"; - tmphtml += "<button type=\"submit\" class=\"btn btn-primary\" onclick=\"buyItem('" + ret.items[i].name + "')\"><span class=\"item-icon\">" + ret.items[i].icon + "</span><br />" + ret.items[i].name + "</button>"; - tmphtml += "</li>"; + var tmphtml = "<h3> Select an item to buy it:</h3>"; + for(var key in ret.items){ + if(ret.items.hasOwnProperty(key)){ + var category = ret.items[key]; + tmphtml += "<h4>"+key+"</h4>"; + tmphtml += "<ul class=\"list-inline\">"; + for(var i=0; i < category.length; i++) { + tmphtml += "<li>"; + tmphtml += "<button type=\"button\" class=\"btn btn-success\" onclick=\"buyItem('" + category[i].name + "')\"><span class=\"item-icon\">" + category[i].icon + "</span><br />" + category[i].name + "</button>"; + tmphtml += "</li>"; + } + tmphtml += "</ul>"; + } } - tmphtml += "</ul>" document.getElementById("tab2").innerHTML = tmphtml; } function displayInventory(items) { - for(var i=0; i < items.length; i++) { - addItem(items[i]); + for(var key in items) { + if(items.hasOwnProperty(key)) + addItem(items[key]); } } @@ -20,19 +27,27 @@ 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 = "<li>"; - itemhtml += "<button type=\"button\" class=\"btn btn-primary\" onclick=\"useItem('" + ret.name + "')\"><span class=\"item-icon\">" + ret.icon + "</span><br />" + ret.name + "</button>"; - itemhtml += "</li>"; + var itemhtml = ""; + var itemtag = document.querySelector("[data-name=\""+ret[0].name+"\"]"); + if(!itemtag){ //si c'est la première itération de l'objet + itemhtml += "<li>"; + itemhtml += "<button type=\"button\" class=\"btn btn-success\" onclick=\"useItem('" + ret[0].name + "')\"><span class=\"item-icon\">" + ret[0].icon + "</span><br />" + ret[0].name + "(<span data-name=\""+ ret[0].name + "\">"+ret[1]+"</span>)</button>"; + itemhtml += "</li>"; + } + else{ // si c'est une n-ième itération + itemtag.innerHTML=ret[1]; + } var invcontent = document.getElementById("tab3"); if(invcontent.children.length <= 1) { - var tmphtml = "<h4>Your bag contains the following items:</h4>"; + var tmphtml = "<h3>Your bag contains the following items:</h3>"; tmphtml += "<ul class=\"list-inline\">"; tmphtml += itemhtml; tmphtml += "</ul>" @@ -40,18 +55,26 @@ function addItem(ret) { } else invcontent.getElementsByTagName('ul')[0].innerHTML += itemhtml; - showInfo(ret.desc); + 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); }); } 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 + item.parentNode.parentNode.parentNode.removeChild(item.parentNode.parentNode); // Remove <li> item from the <ul> list }); } |