aboutsummaryrefslogtreecommitdiffstats
path: root/js
diff options
context:
space:
mode:
authorpiernov <piernov@piernov.org>2016-05-09 22:06:30 +0200
committerpiernov <piernov@piernov.org>2016-05-09 22:06:30 +0200
commitf10c51f07a755d75a583f85316efbcd3bd1e4b6d (patch)
tree87419a11e12f5b7433459fcb5cb9da5211dcbd9e /js
parent54635d17eef27eb2546d69599e4107b242509ced (diff)
parent2f32bc3153b7f2c2561e4603f912573921e6449f (diff)
downloadcandybox-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.js44
-rw-r--r--js/dungeon.js124
-rw-r--r--js/gui.js10
-rw-r--r--js/perso.js32
-rw-r--r--js/savegame.js66
-rw-r--r--js/shop.js53
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");
+ });
+}
diff --git a/js/gui.js b/js/gui.js
index bdf1710..ee29622 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");
}
}
@@ -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);
+}
diff --git a/js/shop.js b/js/shop.js
index 22ca85f..b6d4cee 100644
--- a/js/shop.js
+++ b/js/shop.js
@@ -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
});
}