diff --git a/CHANGELOG.md b/CHANGELOG.md index 444532f..62e69dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,18 @@ # Changelog +**Changes in (pre)-alpha v0.9.2:** + +*Spell Changes!* +- Spell scaling has been changed for all spells. +- Slow no longer halves dexterity, it now lowers it by a set amount, that scales with the spell level and the magic stat. +- Aegis and Rage now last for battle turns, instead of seconds. + +*Inventory Changes!* +- Inventory display is limited to top 50 items. +- Added a button to use all crystals. + +*Bug fixes!* +- Fixed Rage not increasing damage taken. + **Changes in alpha v0.9.1:** *New UI!* diff --git a/assets/js/monsters.js b/assets/js/monsters.js index fa7f0df..5587284 100644 --- a/assets/js/monsters.js +++ b/assets/js/monsters.js @@ -1,446 +1,451 @@ var Monsters = function() { - var inBossBattle = false; - var monsterList = [ - //First Tier - {name:"Rat", killed:0}, - {name:"Bat", killed:0}, - {name:"Slime", killed:0}, - {name:"Kobold", killed:0}, - {name:"Wolf", killed:0}, - {name:"Lizard", killed:0}, - {name:"Goblin", killed:0}, - {name:"Bandit", killed:0}, - {name:"Spider", killed:0}, - {name:"Eagle", killed:0}, - - //Second Tier - {name:"Bear", killed:0}, - {name:"Snake", killed:0}, - {name:"Troll", killed:0}, - {name:"Kobold Warrior", killed:0}, - {name:"Giant Wolf", killed:0}, - {name:"Ghoul", killed:0}, - {name:"Alligator", killed:0}, - {name:"Giant Lizard", killed:0}, - {name:"Giant Rat", killed: 0}, - {name:"Orc Child", killed:0}, - - //Third Tier - {name: "Stone Golem", killed: 0}, - {name: "Lesser Elemental", killed: 0}, - {name: "Kobold Chieftain", killed: 0}, - {name: "Weakened Minotaur", killed: 0}, - {name: "Troll Warrior", killed: 0}, - {name: "Wisp", killed: 0}, - {name: "Dragon Hatchling", killed: 0}, - {name: "Goblin Shaman", killed: 0}, - {name: "Giant Snake", killed: 0}, - {name: "Mummy", killed: 0}, - - //Fourth Tier - {name: "Elemental", killed: 0}, - {name: "Lesser Imp", killed: 0}, - {name: "Lizardman", killed: 0}, - {name: "Orc", killed: 0}, - {name: "Troll Chieftain", killed: 0}, - {name: "Cyclops", killed: 0}, - {name: "Young Vampire", killed: 0}, - {name: "Harpy", killed: 0}, - {name: "Empowered Wisp", killed: 0}, - {name: "Ancient Mummy", killed: 0}, - - //Fifth Tier - {name: "Imp", killed: 0}, - {name: "Orc Soldier", killed: 0}, - {name: "Young Minotaur", killed: 0}, - {name: "Floating Eye", killed: 0}, - {name: "Banshee", killed: 0}, - {name: "Young Dragon", killed: 0}, - {name: "Cyclops Warrior", killed: 0}, - {name: "Lizardman Archer", killed: 0}, - {name: "Living Armor", killed: 0}, - {name: "Frenzied Goblin", killed: 0} - ]; - - var bossList = [ - {name: "The First Guardian, Alstroemeria", currentHealth: 91204, maximumHealth: 91204, strength: 151, dexterity: 151, constitution: 151, status: 0}, - {name: "The Second Guardian, Bouvardia", currentHealth: 372100, maximumHealth: 372100, strength: 305, dexterity: 305, constitution: 305, status: 0}, - {name: "The Third Guardian, Clarkia", currentHealth: 864900, maximumHealth: 864900, strength: 465, dexterity: 465, constitution: 465, status: 0}, - {name: "The Fourth Guardian, Dianthus", currentHealth: 1638400, maximumHealth: 1638400, strength: 640, dexterity: 640, constitution: 640, status: 0}, - {name: "The Fifth Guardian, Erigeron", currentHealth: 2930944, maximumHealth: 2930944, strength: 856, dexterity: 856, constitution: 856, status: 0} - ]; - - var instancedMonster = { - name: "", - currentHealth: 0, - maximumHealth: 0, - strength: 0, - dexterity: 0, - constitution: 0, - status: 0 - }; - - var self = this; - //Save Method - self.save = function() { - var monstersSave = { - savedMonsterList: monsterList, - savedInstancedMonster: instancedMonster, - savedInBossBattle: inBossBattle - }; - localStorage.setItem("monstersSave",JSON.stringify(monstersSave)); - }; - - //Load Method - self.load = function() { - var monstersSave = JSON.parse(localStorage.getItem("monstersSave")); - if (monstersSave) { - if (monstersSave.savedMonsterList !== undefined) { - loadMonsterList(monstersSave.savedMonsterList); - } - if (monstersSave.savedInstancedMonster !== undefined) { - loadInstancedMonster(monstersSave.savedInstancedMonster); - } - if (monstersSave.savedInBossBattle !== undefined) { - inBossBattle = monstersSave.savedInBossBattle; - } - } - }; - - var loadMonsterList = function(savedMonsterList) { - for (var i = 0; i < savedMonsterList.length; i++) { - if (i == monsterList.length) { - break; - } - if (savedMonsterList[i].killed !== undefined) { - monsterList[i].killed = savedMonsterList[i].killed; - } - } - }; - - var loadInstancedMonster = function(savedInstancedMonster) { - if (savedInstancedMonster.name !== undefined) { - instancedMonster.name = savedInstancedMonster.name; - } - if (savedInstancedMonster.currentHealth !== undefined) { - instancedMonster.currentHealth = savedInstancedMonster.currentHealth; - } - if (savedInstancedMonster.maximumHealth !== undefined) { - instancedMonster.maximumHealth = savedInstancedMonster.maximumHealth; - } - if (savedInstancedMonster.strength !== undefined) { - instancedMonster.strength = savedInstancedMonster.strength; - } - if (savedInstancedMonster.dexterity !== undefined) { - instancedMonster.dexterity = savedInstancedMonster.dexterity; - } - if (savedInstancedMonster.constitution !== undefined) { - instancedMonster.constitution = savedInstancedMonster.constitution; - } - if (savedInstancedMonster.status !== undefined) { - instancedMonster.status = savedInstancedMonster.status; - } - }; - - //Getters - self.getMonsterList = function() { - return monsterList; - }; - - self.getInstancedMonster = function() { - return instancedMonster; - }; - - self.getBossMonster = function(number) { - return bossList[number]; - }; - - self.getInBossBattle = function() { - return inBossBattle; - }; - - //Setters - self.setInstancedMonster = function(updatedMonster) { - instancedMonster = updatedMonster; - }; - - self.setInBossBattle = function(boolean) { - inBossBattle = boolean; - }; - - //Other Methods - self.attackMelee = function() { - if(player.getInBattle()) { - self.battle(instancedMonster, false); - } - }; - - self.loadMonsterInfo = function(monster) { - if (monster !== undefined) { - document.getElementById("monstername").innerHTML = monster.name; - document.getElementById("monsterhp").innerHTML = Math.round(monster.currentHealth); - document.getElementById("monsterstr").innerHTML = monster.strength; - document.getElementById("monsterdex").innerHTML = monster.dexterity; - document.getElementById("monstercon").innerHTML = monster.constitution; - document.getElementById("monsterbar").style.width = 100*(monster.currentHealth/monster.maximumHealth) + "%"; - if (!inBossBattle) { - document.getElementById("combatlog").innerHTML = "You are attacked by a " + monster.name + "!
"; - } - else { - document.getElementById("combatlog").innerHTML = "You challenge a floor boss! You begin fighting " + monster.name + "!
"; - } - player.setInBattle(true); - } - else { - document.getElementById("monstername").innerHTML = "None"; - document.getElementById("monsterhp").innerHTML = "0"; - document.getElementById("monsterstr").innerHTML = "0"; - document.getElementById("monsterdex").innerHTML = "0"; - document.getElementById("monstercon").innerHTML = "0"; - document.getElementById("monsterbar").style.width = "0%"; - } - }; - - self.battle = function(monster, spellCast) { - if(!player.getInBattle()) { - player.setInBattle(true); - player.loadRestButton(); - player.loadExploreButton(); - self.loadMonsterInfo(monster); - if (buffs.getCastFireballInBattle()) { - spells.castSpell("fireball"); - } - } - else { - var isDead = false; - if (!spellCast) { - document.getElementById("combatlog").innerHTML = ''; - if (buffs.getCastCureInBattle() && player.getHealthCurrentValue() <= player.getHealthMaximumValue()/2) { - if (!spells.castSpell("cure")) { - isDead = playerAttacks(monster); - } - else { - return true; - } - } - else { - isDead = playerAttacks(monster); - } - } - if (!isDead) { - isDead = monsterAttacks(monster); - } - } - }; - - var playerAttacks = function(monster) { - var damage = damageFormula(player.getStrengthLevel() + player.getStrengthBonus(), player.getDexterityLevel() + player.getDexterityBonus(), monster.constitution, monster.currentHealth); - if (buffs.getRageTimeLeft() !== 0) { - damage *= 5; - } - if (damage >= monster.currentHealth) { - damage = monster.currentHealth; - } - document.getElementById("combatlog").innerHTML += "You dealt " + Math.round(damage) + " damage to the " + monster.name + ".
"; - player.gainExperience(monster, true); - return self.monsterTakeDamage(monster, damage); - }; - - self.monsterTakeDamage = function(monster, damage) { - monster.currentHealth -= damage; - document.getElementById("monsterhp").innerHTML = Math.floor(monster.currentHealth); - document.getElementById("monsterbar").style.width = 100*(monster.currentHealth/monster.maximumHealth) + "%"; - if (monster.currentHealth <= 0) { - monsterDeath(monster); - return true; - } - return false; - }; - - var monsterDeath = function(monster) { - player.setInBattle(false); - if (!inBossBattle) { - document.getElementById("combatlog").innerHTML += "You have defeated the " + monster.name + "!
"; - if (Math.floor(Math.random()*100) < 10) { - monsterCrystalDrop(monster); - inventory.updateInventory(); - } - updateMonsterKilled(monster.name); - } - else { - document.getElementById("combatlog").innerHTML += "You have defeated a floor boss! " + monster.name + " recognizes your strength and allows you to advance."; - tower.setBossFound(false); - tower.setLastBossDefeated(player.getCurrentFloor()); - tower.bossDefeated(); - inBossBattle = false; - } - upgrades.gainExcelia(monster); - player.loadRestButton(); - player.loadExploreButton(); - self.loadMonsterInfo(); - }; - - var monsterCrystalDrop = function(monster) { - var type = Math.floor(Math.random()*5); - var experience = monster.strength + monster.dexterity + monster.constitution; - if (type === 0) { - inventory.createCrystal("Strength", experience); - } - else if (type == 1) { - inventory.createCrystal("Dexterity", experience); - } - else if (type == 2) { - inventory.createCrystal("Constitution", experience); - } - else if (type == 3) { - inventory.createCrystal("Speed", experience); - } - else if (type == 4) { - inventory.createCrystal("Magic", experience); - } - document.getElementById("combatlog").innerHTML += "The " + monster.name + " has left an experience crystal behind!
"; - } - - var updateMonsterKilled = function(name) { - for (var i = 0; i < monsterList.length; i++) { - if (monsterList[i].name == name) { - monsterList[i].killed++; - } - } - }; - - var damageFormula = function(attackerStrength, attackerDexterity, defenderConstitution, defenderHealth) { - var strengthWeigth = 2; - var dexterityWeigth = 0.1; - var constitutionWeigth = 0.5; - var damage = ((attackerStrength * strengthWeigth) - (defenderConstitution * constitutionWeigth)) * (attackerDexterity * dexterityWeigth); - - if (damage < 0) { - damage = 0; - } - else if (damage > defenderHealth) { - damage = defenderHealth; - } - return damage; - }; - - var monsterAttacks = function(monster) { - var damage = damageFormula(monster.strength, monster.dexterity, player.getConstitutionLevel() + player.getConstitutionBonus(), player.getHealthCurrentValue()); - if (buffs.getAegisTimeLeft() === 0) { - var barrier = buffs.getBarrierLeft(); - if (barrier > 0) { - if (barrier >= damage) { - buffs.setBarrierLeft(barrier - damage); - document.getElementById("combatlog").innerHTML += "Your barrier absorbed " + Math.round(damage) + " damage from " + monster.name + "'s attack.
"; - buffs.updateTemporaryBuffs(false); - return false; - } - else { - document.getElementById("combatlog").innerHTML += "Your barrier absorbed " + Math.round(barrier) + " damage from " + monster.name + "'s attack.
"; - document.getElementById("combatlog").innerHTML += "Your barrier has shattered.
"; - damage -= barrier; - buffs.setBarrierLeft(0); - buffs.updateTemporaryBuffs(false); - } - } - player.setHealthCurrentValue(player.getHealthCurrentValue() - damage); - document.getElementById("combatlog").innerHTML += "You took " + Math.round(damage) + " damage from the " + monster.name + "'s attack.
"; - if (player.getHealthCurrentValue() === 0) { - player.death(monster); - return true; - } - } - else { - document.getElementById("combatlog").innerHTML += "Aegis absorbed " + Math.round(damage) + " damage from " + monster.name + "'s attack.
"; - } - player.gainExperience(monster, false); - return false; - }; - - self.battleChance = function(boolean) { - if (boolean) { - rollMonster(); - return true; - } - else { - var check = Math.random()*100; - if (check <= tower.getFloorMonsterDensity(player.getCurrentFloor())) { - rollMonster(); - return true; - } - return false; - } - }; - - var rollMonster = function() { - var tier = Math.floor((player.getCurrentFloor()-1)/10); - var monster = Math.floor(Math.random()*10); - while(monster == 10) { - monster = Math.floor(Math.random()*10); - } - instancedMonster = createMonster((tier*10) + monster); - self.battle(instancedMonster, false); - }; - - var createMonster = function(number) { - var tempMonster = {name: "", currentHealth: 0, maximumHealth:0 , strength: 0, dexterity: 0, constitution: 0, status: 0}; - var statPool = Math.round((player.getCurrentFloor() * 15) + Math.pow(1.1, player.getCurrentFloor() - 1) - 1); - tempMonster.name = monsterList[number].name; - tempMonster.strength++; - tempMonster.dexterity++; - tempMonster.constitution++; - statPool -= 3; - distributeStats(tempMonster, statPool); - tempMonster.maximumHealth = calculateHealth(tempMonster.constitution); - tempMonster.currentHealth = tempMonster.maximumHealth; - return tempMonster; - }; - - var distributeStats = function(monster, statPool) { - var choice; - while (statPool !== 0) { - choice = Math.floor(Math.random()*3); - while (choice == 3) { - choice = Math.floor(Math.random()*3); - } - if (choice === 0) { - monster.strength++; - } - else if (choice == 1) { - monster.dexterity++; - } - else if (choice == 2) { - monster.constitution++; - } - statPool--; - } - }; - - var calculateHealth = function(constitution) { - return (Math.pow(constitution, 2) * 4); - }; - - self.runAway = function() { - if (player.getInBattle()) { - document.getElementById("combatlog").innerHTML = ""; - var runRoll = Math.random() * (instancedMonster.strength + instancedMonster.dexterity + instancedMonster.constitution); - if (runRoll < player.getSpeedLevel()) { - document.getElementById("combatlog").innerHTML += "You escaped from the battle against " + instancedMonster.name + "."; - self.loadMonsterInfo(); - player.setSpeedExperience(player.getSpeedExperience() + runRoll); - player.setInBattle(false); - player.loadExploreButton(); - player.loadRestButton(); - } - else { - document.getElementById("combatlog").innerHTML += "You failed to run away.
"; - self.battle(instancedMonster, true); - } - } - if (inBossBattle) { - inBossBattle = false; - } - } + var inBossBattle = false; + var monsterList = [ + //First Tier + {name:"Rat", killed:0}, + {name:"Bat", killed:0}, + {name:"Slime", killed:0}, + {name:"Kobold", killed:0}, + {name:"Wolf", killed:0}, + {name:"Lizard", killed:0}, + {name:"Goblin", killed:0}, + {name:"Bandit", killed:0}, + {name:"Spider", killed:0}, + {name:"Eagle", killed:0}, + + //Second Tier + {name:"Bear", killed:0}, + {name:"Snake", killed:0}, + {name:"Troll", killed:0}, + {name:"Kobold Warrior", killed:0}, + {name:"Giant Wolf", killed:0}, + {name:"Ghoul", killed:0}, + {name:"Alligator", killed:0}, + {name:"Giant Lizard", killed:0}, + {name:"Giant Rat", killed: 0}, + {name:"Orc Child", killed:0}, + + //Third Tier + {name: "Stone Golem", killed: 0}, + {name: "Lesser Elemental", killed: 0}, + {name: "Kobold Chieftain", killed: 0}, + {name: "Weakened Minotaur", killed: 0}, + {name: "Troll Warrior", killed: 0}, + {name: "Wisp", killed: 0}, + {name: "Dragon Hatchling", killed: 0}, + {name: "Goblin Shaman", killed: 0}, + {name: "Giant Snake", killed: 0}, + {name: "Mummy", killed: 0}, + + //Fourth Tier + {name: "Elemental", killed: 0}, + {name: "Lesser Imp", killed: 0}, + {name: "Lizardman", killed: 0}, + {name: "Orc", killed: 0}, + {name: "Troll Chieftain", killed: 0}, + {name: "Cyclops", killed: 0}, + {name: "Young Vampire", killed: 0}, + {name: "Harpy", killed: 0}, + {name: "Empowered Wisp", killed: 0}, + {name: "Ancient Mummy", killed: 0}, + + //Fifth Tier + {name: "Imp", killed: 0}, + {name: "Orc Soldier", killed: 0}, + {name: "Young Minotaur", killed: 0}, + {name: "Floating Eye", killed: 0}, + {name: "Banshee", killed: 0}, + {name: "Young Dragon", killed: 0}, + {name: "Cyclops Warrior", killed: 0}, + {name: "Lizardman Archer", killed: 0}, + {name: "Living Armor", killed: 0}, + {name: "Frenzied Goblin", killed: 0} + ]; + + var bossList = [ + {name: "The First Guardian, Alstroemeria", currentHealth: 91204, maximumHealth: 91204, strength: 151, dexterity: 151, constitution: 151, status: 0}, + {name: "The Second Guardian, Bouvardia", currentHealth: 372100, maximumHealth: 372100, strength: 305, dexterity: 305, constitution: 305, status: 0}, + {name: "The Third Guardian, Clarkia", currentHealth: 864900, maximumHealth: 864900, strength: 465, dexterity: 465, constitution: 465, status: 0}, + {name: "The Fourth Guardian, Dianthus", currentHealth: 1638400, maximumHealth: 1638400, strength: 640, dexterity: 640, constitution: 640, status: 0}, + {name: "The Fifth Guardian, Erigeron", currentHealth: 2930944, maximumHealth: 2930944, strength: 856, dexterity: 856, constitution: 856, status: 0} + ]; + + var instancedMonster = { + name: "", + currentHealth: 0, + maximumHealth: 0, + strength: 0, + dexterity: 0, + constitution: 0, + status: 0 + }; + + var self = this; + //Save Method + self.save = function() { + var monstersSave = { + savedMonsterList: monsterList, + savedInstancedMonster: instancedMonster, + savedInBossBattle: inBossBattle + }; + localStorage.setItem("monstersSave",JSON.stringify(monstersSave)); + }; + + //Load Method + self.load = function() { + var monstersSave = JSON.parse(localStorage.getItem("monstersSave")); + if (monstersSave) { + if (monstersSave.savedMonsterList !== undefined) { + loadMonsterList(monstersSave.savedMonsterList); + } + if (monstersSave.savedInstancedMonster !== undefined) { + loadInstancedMonster(monstersSave.savedInstancedMonster); + } + if (monstersSave.savedInBossBattle !== undefined) { + inBossBattle = monstersSave.savedInBossBattle; + } + } + }; + + var loadMonsterList = function(savedMonsterList) { + for (var i = 0; i < savedMonsterList.length; i++) { + if (i == monsterList.length) { + break; + } + if (savedMonsterList[i].killed !== undefined) { + monsterList[i].killed = savedMonsterList[i].killed; + } + } + }; + + var loadInstancedMonster = function(savedInstancedMonster) { + if (savedInstancedMonster.name !== undefined) { + instancedMonster.name = savedInstancedMonster.name; + } + if (savedInstancedMonster.currentHealth !== undefined) { + instancedMonster.currentHealth = savedInstancedMonster.currentHealth; + } + if (savedInstancedMonster.maximumHealth !== undefined) { + instancedMonster.maximumHealth = savedInstancedMonster.maximumHealth; + } + if (savedInstancedMonster.strength !== undefined) { + instancedMonster.strength = savedInstancedMonster.strength; + } + if (savedInstancedMonster.dexterity !== undefined) { + instancedMonster.dexterity = savedInstancedMonster.dexterity; + } + if (savedInstancedMonster.constitution !== undefined) { + instancedMonster.constitution = savedInstancedMonster.constitution; + } + if (savedInstancedMonster.status !== undefined) { + instancedMonster.status = savedInstancedMonster.status; + } + }; + + //Getters + self.getMonsterList = function() { + return monsterList; + }; + + self.getInstancedMonster = function() { + return instancedMonster; + }; + + self.getBossMonster = function(number) { + return bossList[number]; + }; + + self.getInBossBattle = function() { + return inBossBattle; + }; + + //Setters + self.setInstancedMonster = function(updatedMonster) { + instancedMonster = updatedMonster; + }; + + self.setInBossBattle = function(boolean) { + inBossBattle = boolean; + }; + + //Other Methods + self.attackMelee = function() { + if(player.getInBattle()) { + self.battle(instancedMonster, false); + } + }; + + self.loadMonsterInfo = function(monster) { + if (monster !== undefined) { + document.getElementById("monstername").innerHTML = monster.name; + document.getElementById("monsterhp").innerHTML = Math.round(monster.currentHealth); + document.getElementById("monsterstr").innerHTML = monster.strength; + document.getElementById("monsterdex").innerHTML = monster.dexterity; + document.getElementById("monstercon").innerHTML = monster.constitution; + document.getElementById("monsterbar").style.width = 100*(monster.currentHealth/monster.maximumHealth) + "%"; + if (!inBossBattle) { + document.getElementById("combatlog").innerHTML = "You are attacked by a " + monster.name + "!
"; + } + else { + document.getElementById("combatlog").innerHTML = "You challenge a floor boss! You begin fighting " + monster.name + "!
"; + } + player.setInBattle(true); + } + else { + document.getElementById("monstername").innerHTML = "None"; + document.getElementById("monsterhp").innerHTML = "0"; + document.getElementById("monsterstr").innerHTML = "0"; + document.getElementById("monsterdex").innerHTML = "0"; + document.getElementById("monstercon").innerHTML = "0"; + document.getElementById("monsterbar").style.width = "0%"; + } + }; + + self.battle = function(monster, spellCast) { + if(!player.getInBattle()) { + player.setInBattle(true); + player.loadRestButton(); + player.loadExploreButton(); + self.loadMonsterInfo(monster); + if (buffs.getCastFireballInBattle()) { + spells.castSpell("fireball"); + } + } + else { + var isDead = false; + if (!spellCast) { + document.getElementById("combatlog").innerHTML = ''; + if (buffs.getCastCureInBattle() && player.getHealthCurrentValue() <= player.getHealthMaximumValue()/2) { + if (!spells.castSpell("cure")) { + isDead = playerAttacks(monster); + } + else { + buffs.updateTemporaryBuffs(true); + return true; + } + } + else { + isDead = playerAttacks(monster); + } + } + if (!isDead) { + isDead = monsterAttacks(monster); + } + } + buffs.updateTemporaryBuffs(true); + }; + + var playerAttacks = function(monster) { + var damage = damageFormula(player.getStrengthLevel() + player.getStrengthBonus(), player.getDexterityLevel() + player.getDexterityBonus(), monster.constitution, monster.currentHealth); + if (buffs.getRageTimeLeft() !== 0) { + damage *= 5; + } + if (damage >= monster.currentHealth) { + damage = monster.currentHealth; + } + document.getElementById("combatlog").innerHTML += "You dealt " + Math.round(damage) + " damage to the " + monster.name + ".
"; + player.gainExperience(monster, true); + return self.monsterTakeDamage(monster, damage); + }; + + self.monsterTakeDamage = function(monster, damage) { + monster.currentHealth -= damage; + document.getElementById("monsterhp").innerHTML = Math.floor(monster.currentHealth); + document.getElementById("monsterbar").style.width = 100*(monster.currentHealth/monster.maximumHealth) + "%"; + if (monster.currentHealth <= 0) { + monsterDeath(monster); + return true; + } + return false; + }; + + var monsterDeath = function(monster) { + player.setInBattle(false); + if (!inBossBattle) { + document.getElementById("combatlog").innerHTML += "You have defeated the " + monster.name + "!
"; + if (Math.floor(Math.random()*100) < 10) { + monsterCrystalDrop(monster); + inventory.updateInventory(); + } + updateMonsterKilled(monster.name); + } + else { + document.getElementById("combatlog").innerHTML += "You have defeated a floor boss! " + monster.name + " recognizes your strength and allows you to advance."; + tower.setBossFound(false); + tower.setLastBossDefeated(player.getCurrentFloor()); + tower.bossDefeated(); + inBossBattle = false; + } + upgrades.gainExcelia(monster); + player.loadRestButton(); + player.loadExploreButton(); + self.loadMonsterInfo(); + }; + + var monsterCrystalDrop = function(monster) { + var type = Math.floor(Math.random()*5); + var experience = monster.strength + monster.dexterity + monster.constitution; + if (type === 0) { + inventory.createCrystal("Strength", experience); + } + else if (type == 1) { + inventory.createCrystal("Dexterity", experience); + } + else if (type == 2) { + inventory.createCrystal("Constitution", experience); + } + else if (type == 3) { + inventory.createCrystal("Speed", experience); + } + else if (type == 4) { + inventory.createCrystal("Magic", experience); + } + document.getElementById("combatlog").innerHTML += "The " + monster.name + " has left an experience crystal behind!
"; + } + + var updateMonsterKilled = function(name) { + for (var i = 0; i < monsterList.length; i++) { + if (monsterList[i].name == name) { + monsterList[i].killed++; + } + } + }; + + var damageFormula = function(attackerStrength, attackerDexterity, defenderConstitution, defenderHealth) { + var strengthWeigth = 2; + var dexterityWeigth = 0.1; + var constitutionWeigth = 0.5; + var damage = ((attackerStrength * strengthWeigth) - (defenderConstitution * constitutionWeigth)) * (attackerDexterity * dexterityWeigth); + + if (damage < 0) { + damage = 0; + } + else if (damage > defenderHealth) { + damage = defenderHealth; + } + return damage; + }; + + var monsterAttacks = function(monster) { + var damage = damageFormula(monster.strength, monster.dexterity, player.getConstitutionLevel() + player.getConstitutionBonus(), player.getHealthCurrentValue()); + if (buffs.getRageTimeLeft() !== 0) { + damage = damage*2; + } + if (buffs.getAegisTimeLeft() === 0) { + var barrier = buffs.getBarrierLeft(); + if (barrier > 0) { + if (barrier >= damage) { + buffs.setBarrierLeft(barrier - damage); + document.getElementById("combatlog").innerHTML += "Your barrier absorbed " + Math.round(damage) + " damage from " + monster.name + "'s attack.
"; + buffs.updateTemporaryBuffs(false); + return false; + } + else { + document.getElementById("combatlog").innerHTML += "Your barrier absorbed " + Math.round(barrier) + " damage from " + monster.name + "'s attack.
"; + document.getElementById("combatlog").innerHTML += "Your barrier has shattered.
"; + damage -= barrier; + buffs.setBarrierLeft(0); + buffs.updateTemporaryBuffs(false); + } + } + player.setHealthCurrentValue(player.getHealthCurrentValue() - damage); + document.getElementById("combatlog").innerHTML += "You took " + Math.round(damage) + " damage from the " + monster.name + "'s attack.
"; + if (player.getHealthCurrentValue() === 0) { + player.death(monster); + return true; + } + } + else { + document.getElementById("combatlog").innerHTML += "Aegis absorbed " + Math.round(damage) + " damage from " + monster.name + "'s attack.
"; + } + player.gainExperience(monster, false); + return false; + }; + + self.battleChance = function(boolean) { + if (boolean) { + rollMonster(); + return true; + } + else { + var check = Math.random()*100; + if (check <= tower.getFloorMonsterDensity(player.getCurrentFloor())) { + rollMonster(); + return true; + } + return false; + } + }; + + var rollMonster = function() { + var tier = Math.floor((player.getCurrentFloor()-1)/10); + var monster = Math.floor(Math.random()*10); + while(monster == 10) { + monster = Math.floor(Math.random()*10); + } + instancedMonster = createMonster((tier*10) + monster); + self.battle(instancedMonster, false); + }; + + var createMonster = function(number) { + var tempMonster = {name: "", currentHealth: 0, maximumHealth:0 , strength: 0, dexterity: 0, constitution: 0, status: 0}; + var statPool = Math.round((player.getCurrentFloor() * 15) + Math.pow(1.1, player.getCurrentFloor() - 1) - 1); + tempMonster.name = monsterList[number].name; + tempMonster.strength++; + tempMonster.dexterity++; + tempMonster.constitution++; + statPool -= 3; + distributeStats(tempMonster, statPool); + tempMonster.maximumHealth = calculateHealth(tempMonster.constitution); + tempMonster.currentHealth = tempMonster.maximumHealth; + return tempMonster; + }; + + var distributeStats = function(monster, statPool) { + var choice; + while (statPool !== 0) { + choice = Math.floor(Math.random()*3); + while (choice == 3) { + choice = Math.floor(Math.random()*3); + } + if (choice === 0) { + monster.strength++; + } + else if (choice == 1) { + monster.dexterity++; + } + else if (choice == 2) { + monster.constitution++; + } + statPool--; + } + }; + + var calculateHealth = function(constitution) { + return (Math.pow(constitution, 2) * 4); + }; + + self.runAway = function() { + if (player.getInBattle()) { + document.getElementById("combatlog").innerHTML = ""; + var runRoll = Math.random() * (instancedMonster.strength + instancedMonster.dexterity + instancedMonster.constitution); + if (runRoll < player.getSpeedLevel()) { + document.getElementById("combatlog").innerHTML += "You escaped from the battle against " + instancedMonster.name + "."; + self.loadMonsterInfo(); + player.setSpeedExperience(player.getSpeedExperience() + runRoll); + player.setInBattle(false); + player.loadExploreButton(); + player.loadRestButton(); + } + else { + document.getElementById("combatlog").innerHTML += "You failed to run away.
"; + self.battle(instancedMonster, true); + } + } + if (inBossBattle) { + inBossBattle = false; + } + } }; var monsters = new Monsters(); \ No newline at end of file diff --git a/assets/js/spells.js b/assets/js/spells.js index fc5e33b..89bd524 100644 --- a/assets/js/spells.js +++ b/assets/js/spells.js @@ -1,500 +1,502 @@ var Spells = function() { - var arcania = 0; - - var spellbook = []; - spellbook.push({name: "Cure", - id: "cure", - type: 0, - requiredMagic: 5, - arcaniaCost: 0, - learned: true, - baseMana: 15, - experience: 0, - nextLevel: 150, - baseNextLevel: 150, - level: 0, - description:""}); - - spellbook.push({name: "Fireball", - id: "fireball", - type: 1, - requiredMagic: 5, - arcaniaCost: 0, - learned: true, - baseMana: 10, - experience: 0, - nextLevel: 100, - baseNextLevel: 100, - level: 0, - description:""}); - - spellbook.push({name: "Transmutation", - id: "transmutation", - type: 3, - requiredMagic: 5, - arcaniaCost: 0, - learned: true, - baseMana: 50, - experience: 0, - nextLevel: 500, - baseNextLevel: 500, - level: 0, - description:""}); - - spellbook.push({name: "Barrier", - id: "barrier", - type: 0, - requiredMagic: 10, - arcaniaCost: 1000, - learned: false, - baseMana: 100, - experience: 0, - nextLevel: 1000, - baseNextLevel: 1000, - level: 0, - description: ""}); - - spellbook.push({name: "Slow", - id: "slow", - type: 2, - requiredMagic: 20, - arcaniaCost: 2000, - learned: false, - baseMana: 400, - experience: 0, - nextLevel: 4000, - baseNextLevel: 4000, - level: 0, - description: ""}); - - spellbook.push({name: "Rage", - id: "rage", - type: 1, - requiredMagic: 25, - arcaniaCost: 2500, - learned: false, - baseMana: 1250, - experience: 0, - nextLevel: 12500, - baseNextLevel: 12500, - level: 0, - description: ""}); - - spellbook.push({name: "Aegis", - id: "aegis", - type: 0, - requiredMagic: 50, - arcaniaCost: 5000, - learned: false, - baseMana: 5000, - experience: 0, - nextLevel: 50000, - baseNextLevel: 50000, - level: 0, - description: ""}); - - var self = this; - //Save Method - self.save = function() { - var spellsSave = { - savedArcania: arcania, - savedSpellbook: spellbook - }; - localStorage.setItem("spellsSave",JSON.stringify(spellsSave)); - }; - - //Load Method - self.load = function() { - var spellsSave = JSON.parse(localStorage.getItem("spellsSave")); - if (spellsSave) { - if (spellsSave.savedArcania !== undefined) { - arcania = spellsSave.savedArcania; - } - if (spellsSave.savedSpellbook !== undefined) { - loadSpellbook(spellsSave.savedSpellbook); - } - } - }; - - var loadSpellbook = function(savedSpellbook) { - var success = false; - for(var i = 0; i < savedSpellbook.length; i++) { - if (i == spellbook.length) { - break; - } - for (var j = 0; j < spellbook.length; j++) { - if (spellbook[j].id == savedSpellbook[i].id) { - success = true; - break; - } - } - if (success) { - if (savedSpellbook[i].learned !== undefined) { - spellbook[j].learned = savedSpellbook[i].learned; - } - if (savedSpellbook[i].experience !== undefined) { - spellbook[j].experience = savedSpellbook[i].experience; - } - if (savedSpellbook[i].nextLevel !== undefined) { - spellbook[j].nextLevel = savedSpellbook[i].nextLevel; - } - if (savedSpellbook[i].level !== undefined) { - spellbook[j].level = savedSpellbook[i].level; - } - } - success = false; - } - }; - - //Getters - - //Setters - self.setArcania = function(number) { - arcania = number; - document.getElementById("arcania").innerHTML = Math.round(100*arcania)/100; - }; - - //Other Methods - var updateSpellDescriptions = function() { - for (var i = 0; i < spellbook.length; i++) { - if (spellbook[i].id == "cure") { - spellbook[i].description = "Heal " + curePotency(spellbook[i]) + " HP"; - } - else if (spellbook[i].id == "fireball") { - spellbook[i].description = "Deal " + fireballPotency(spellbook[i]) + " fire damage."; - } - else if (spellbook[i].id == "barrier") { - spellbook[i].description = "Put up a barrier that will protect you from " + barrierPotency(spellbook[i]) + " damage."; - } - else if (spellbook[i].id == "aegis") { - spellbook[i].description = "Take no damage for " + aegisPotency(spellbook[i]) + " seconds."; - } - else if (spellbook[i].id == "slow") { - spellbook[i].description = "Halve an enemy's DEX."; - } - else if (spellbook[i].id == "rage") { - spellbook[i].description = "Fill yourself with rage for " + ragePotency(spellbook[i]) + " seconds. You deal 5x damage, however, you take 2x damage and cannot cast other spells."; - } - else if (spellbook[i].id == "transmutation") { - spellbook[i].description = "Give material form to the Arcania inside you. Transforms 100 Arcania into " + transmutationPotency(spellbook[i]) + " gold."; - } - } - }; - - var spellType = function(type) { - if (type === 0) { - return "btn-info"; - } - else if (type == 1) { - return "btn-danger"; - } - else if (type == 2) { - return "btn-warning"; - } - else if (type == 3) { - return "btn-success"; - } - }; - - var findSpell = function(spellId) { - for (var i = 0; i < spellbook.length; i++) { - if (spellbook[i].id == spellId) { - return i; - } - } - }; - - var spellCost = function(spell) { - var i; - var cost = spell.baseMana; - if (spell.type == 2) { - for (i = 0; i < spell.level; i++) { - cost -= 0.1 * cost; - } - if (cost <= 10) { - cost = 10; - } - } - else { - for (i = 0; i < spell.level; i++) { - cost += 0.1 * cost; - } - } - return Math.round(cost); - }; - - var levelSpell = function(spell, experience) { - spell.experience += experience; - while (spell.experience >= spell.nextLevel) { - spell.level++; - spell.experience -= spell.nextLevel; - spell.nextLevel = Math.pow(2, spell.level) * spell.baseNextLevel; - self.updateSpellbook(); - } - updateSpellHtml(spell, true); - }; - - self.updateSpellbook = function() { - document.getElementById("spellbook").innerHTML = ''; - for (var i = 0; i <= 3; i++) { - document.getElementById("spellbook" + i).innerHTML = ''; - } - updateSpellDescriptions(); - for (i = 0; i < spellbook.length; i++) { - if (player.getMagicLevel() >= spellbook[i].requiredMagic && spellbook[i].learned === false) { - var spellColor = spellType(spellbook[i].type); - document.getElementById("spellbook").innerHTML += '

Arcania Cost: 0

'; - document.getElementById("spellbook" + spellbook[i].type).innerHTML += '

Arcania Cost: 0

'; - updateSpellHtml(spellbook[i], false); - } - else if (spellbook[i].learned === true) { - var spellColor = spellType(spellbook[i].type); - document.getElementById("spellbook").innerHTML += '
' + 100*spellbook[i].experience/spellbook[i].nextLevel + '%
Level: 0

Mana Cost: 0

'; - document.getElementById("spellbook" + spellbook[i].type).innerHTML += '
' + 100*spellbook[i].experience/spellbook[i].nextLevel + '%
Level: 0

Mana Cost: 0

'; - spellbook[i].learned = true; - updateSpellHtml(spellbook[i], true); - } - } - - $(document).ready(function(){ - $('[data-toggle="tooltip"]').tooltip(); - }); - }; - - var updateSpellHtml = function(spell, hasBought) { - document.getElementById("arcania").innerHTML = Math.round(100*arcania)/100; - if (!hasBought) { - document.getElementById(spell.id + "arcaniacost").innerHTML = spell.arcaniaCost; - document.getElementById(spell.id + "arcaniacostall").innerHTML = spell.arcaniaCost; - } - else { - document.getElementById(spell.id + "costall").innerHTML = spellCost(spell); - document.getElementById(spell.id + "cost").innerHTML = spellCost(spell); - document.getElementById(spell.id + "xpall").style.width = 100*(spell.experience/spell.nextLevel) + "%"; - document.getElementById(spell.id + "progall").innerHTML = Math.round(100 * (100 * (spell.experience/spell.nextLevel)))/100 + "%"; - document.getElementById(spell.id + "levelall").innerHTML = spell.level; - document.getElementById(spell.id + "xp").style.width = 100*(spell.experience/spell.nextLevel) + "%"; - document.getElementById(spell.id + "prog").innerHTML = Math.round(100 * (100 * (spell.experience/spell.nextLevel)))/100 + "%"; - document.getElementById(spell.id + "level").innerHTML = spell.level; - } - }; - - self.isSpellLearned = function(spellId) { - if (spellId === "") { - return true; - } - else { - for (var i = 0; i < spellbook.length; i++) { - if (spellbook[i].id == spellId) { - return spellbook[i].learned; - } - } - return false; - } - }; - - self.castSpell = function(spellId) { - var spell = findSpell(spellId); - var manaCost = spellCost(spellbook[spell]); - - if (player.getManaCurrentValue() >= manaCost && buffs.getRageTimeLeft() === 0 && self.isSpellLearned(spellId)) { - var castSuccessful; - if (spellbook[spell].id == "cure") { - castSuccessful = castCure(spellbook[spell]); - } - else if (spellbook[spell].id == "fireball") { - castSuccessful = castFireball(spellbook[spell]); - } - else if (spellbook[spell].id == "barrier") { - castSuccessful = castBarrier(spellbook[spell]); - } - else if (spellbook[spell].id == "slow") { - castSuccessful = castSlow(spellbook[spell]); - } - else if (spellbook[spell].id == "aegis") { - castSuccessful = castAegis(spellbook[spell]); - } - else if (spellbook[spell].id == "rage") { - castSuccessful = castRage(spellbook[spell]); - } - else if (spellbook[spell].id == "transmutation") { - castSuccessful = castTransmutation(spellbook[spell]); - } - if (castSuccessful) { - if (spellbook[spell].id !== "transmutation") { - arcania += spellbook[spell].level + manaCost/100; - } - player.setManaCurrentValue(player.getManaCurrentValue() - manaCost); - levelSpell(spellbook[spell], buffs.getSpellLevelingMultiplier() * manaCost); - player.setMagicExperience(player.getMagicExperience() + buffs.getLevelingSpeedMultiplier()*(spellbook[spell].level + 1 + manaCost/10)); - return true; - } - } - return false; - }; - - self.buySpell = function(spellId) { - var spell = findSpell(spellId); - if (arcania >= spellbook[spell].arcaniaCost) { - self.setArcania(arcania - spellbook[spell].arcaniaCost); - spellbook[spell].learned = true; - } - self.updateSpellbook(); - } - - var castCure = function(cure) { + var arcania = 0; + + var spellbook = []; + spellbook.push({name: "Cure", + id: "cure", + type: 0, + requiredMagic: 5, + arcaniaCost: 0, + learned: true, + baseMana: 15, + experience: 0, + nextLevel: 150, + baseNextLevel: 150, + level: 0, + description:""}); + + spellbook.push({name: "Fireball", + id: "fireball", + type: 1, + requiredMagic: 5, + arcaniaCost: 0, + learned: true, + baseMana: 10, + experience: 0, + nextLevel: 100, + baseNextLevel: 100, + level: 0, + description:""}); + + spellbook.push({name: "Transmutation", + id: "transmutation", + type: 3, + requiredMagic: 5, + arcaniaCost: 0, + learned: true, + baseMana: 50, + experience: 0, + nextLevel: 500, + baseNextLevel: 500, + level: 0, + description:""}); + + spellbook.push({name: "Barrier", + id: "barrier", + type: 0, + requiredMagic: 10, + arcaniaCost: 1000, + learned: false, + baseMana: 100, + experience: 0, + nextLevel: 1000, + baseNextLevel: 1000, + level: 0, + description: ""}); + + spellbook.push({name: "Slow", + id: "slow", + type: 2, + requiredMagic: 20, + arcaniaCost: 2000, + learned: false, + baseMana: 400, + experience: 0, + nextLevel: 4000, + baseNextLevel: 4000, + level: 0, + description: ""}); + + spellbook.push({name: "Rage", + id: "rage", + type: 1, + requiredMagic: 25, + arcaniaCost: 2500, + learned: false, + baseMana: 1250, + experience: 0, + nextLevel: 12500, + baseNextLevel: 12500, + level: 0, + description: ""}); + + spellbook.push({name: "Aegis", + id: "aegis", + type: 0, + requiredMagic: 50, + arcaniaCost: 5000, + learned: false, + baseMana: 5000, + experience: 0, + nextLevel: 50000, + baseNextLevel: 50000, + level: 0, + description: ""}); + + var self = this; + //Save Method + self.save = function() { + var spellsSave = { + savedArcania: arcania, + savedSpellbook: spellbook + }; + localStorage.setItem("spellsSave",JSON.stringify(spellsSave)); + }; + + //Load Method + self.load = function() { + var spellsSave = JSON.parse(localStorage.getItem("spellsSave")); + if (spellsSave) { + if (spellsSave.savedArcania !== undefined) { + arcania = spellsSave.savedArcania; + } + if (spellsSave.savedSpellbook !== undefined) { + loadSpellbook(spellsSave.savedSpellbook); + } + } + }; + + var loadSpellbook = function(savedSpellbook) { + var success = false; + for(var i = 0; i < savedSpellbook.length; i++) { + if (i == spellbook.length) { + break; + } + for (var j = 0; j < spellbook.length; j++) { + if (spellbook[j].id == savedSpellbook[i].id) { + success = true; + break; + } + } + if (success) { + if (savedSpellbook[i].learned !== undefined) { + spellbook[j].learned = savedSpellbook[i].learned; + } + if (savedSpellbook[i].experience !== undefined) { + spellbook[j].experience = savedSpellbook[i].experience; + } + if (savedSpellbook[i].nextLevel !== undefined) { + spellbook[j].nextLevel = savedSpellbook[i].nextLevel; + } + if (savedSpellbook[i].level !== undefined) { + spellbook[j].level = savedSpellbook[i].level; + } + } + success = false; + } + }; + + //Getters + + //Setters + self.setArcania = function(number) { + arcania = number; + document.getElementById("arcania").innerHTML = Math.round(100*arcania)/100; + }; + + //Other Methods + var updateSpellDescriptions = function() { + for (var i = 0; i < spellbook.length; i++) { + if (spellbook[i].id == "cure") { + spellbook[i].description = "Heal " + curePotency(spellbook[i]) + " HP"; + } + else if (spellbook[i].id == "fireball") { + spellbook[i].description = "Deal " + fireballPotency(spellbook[i]) + " fire damage."; + } + else if (spellbook[i].id == "barrier") { + spellbook[i].description = "Put up a barrier that will protect you from " + barrierPotency(spellbook[i]) + " damage."; + } + else if (spellbook[i].id == "aegis") { + spellbook[i].description = "Take no damage for " + aegisPotency(spellbook[i]) + " turns."; + } + else if (spellbook[i].id == "slow") { + spellbook[i].description = "Lower an enemy's dexterity by " + slowPotency(spellbook[i]) + "."; + } + else if (spellbook[i].id == "rage") { + spellbook[i].description = "Fill yourself with rage for " + ragePotency(spellbook[i]) + " turns. You deal 5x damage, however, you take 2x damage and cannot cast other spells."; + } + else if (spellbook[i].id == "transmutation") { + spellbook[i].description = "Give material form to the Arcania inside you. Transforms 100 Arcania into " + transmutationPotency(spellbook[i]) + " gold."; + } + } + }; + + var spellType = function(type) { + if (type === 0) { + return "btn-info"; + } + else if (type == 1) { + return "btn-danger"; + } + else if (type == 2) { + return "btn-warning"; + } + else if (type == 3) { + return "btn-success"; + } + }; + + var findSpell = function(spellId) { + for (var i = 0; i < spellbook.length; i++) { + if (spellbook[i].id == spellId) { + return i; + } + } + }; + + var spellCost = function(spell) { + var cost = spell.baseMana; + for (var i = 0; i < spell.level; i++) { + cost += 0.1 * cost; + } + return Math.round(cost); + }; + + var levelSpell = function(spell, experience) { + spell.experience += experience; + while (spell.experience >= spell.nextLevel) { + spell.level++; + spell.experience -= spell.nextLevel; + spell.nextLevel = Math.pow(2, spell.level) * spell.baseNextLevel; + self.updateSpellbook(); + } + updateSpellHtml(spell, true); + }; + + self.updateSpellbook = function() { + document.getElementById("spellbook").innerHTML = ''; + for (var i = 0; i <= 3; i++) { + document.getElementById("spellbook" + i).innerHTML = ''; + } + updateSpellDescriptions(); + for (i = 0; i < spellbook.length; i++) { + if (player.getMagicLevel() >= spellbook[i].requiredMagic && spellbook[i].learned === false) { + var spellColor = spellType(spellbook[i].type); + document.getElementById("spellbook").innerHTML += '

Arcania Cost: 0

'; + document.getElementById("spellbook" + spellbook[i].type).innerHTML += '

Arcania Cost: 0

'; + updateSpellHtml(spellbook[i], false); + } + else if (spellbook[i].learned === true) { + var spellColor = spellType(spellbook[i].type); + document.getElementById("spellbook").innerHTML += '
' + 100*spellbook[i].experience/spellbook[i].nextLevel + '%
Level: 0

Mana Cost: 0

'; + document.getElementById("spellbook" + spellbook[i].type).innerHTML += '
' + 100*spellbook[i].experience/spellbook[i].nextLevel + '%
Level: 0

Mana Cost: 0

'; + spellbook[i].learned = true; + updateSpellHtml(spellbook[i], true); + } + } + + $(document).ready(function(){ + $('[data-toggle="tooltip"]').tooltip(); + }); + }; + + var updateSpellHtml = function(spell, hasBought) { + document.getElementById("arcania").innerHTML = Math.round(100*arcania)/100; + if (!hasBought) { + document.getElementById(spell.id + "arcaniacost").innerHTML = spell.arcaniaCost; + document.getElementById(spell.id + "arcaniacostall").innerHTML = spell.arcaniaCost; + } + else { + document.getElementById(spell.id + "costall").innerHTML = spellCost(spell); + document.getElementById(spell.id + "cost").innerHTML = spellCost(spell); + document.getElementById(spell.id + "xpall").style.width = 100*(spell.experience/spell.nextLevel) + "%"; + document.getElementById(spell.id + "progall").innerHTML = Math.round(100 * (100 * (spell.experience/spell.nextLevel)))/100 + "%"; + document.getElementById(spell.id + "levelall").innerHTML = spell.level; + document.getElementById(spell.id + "xp").style.width = 100*(spell.experience/spell.nextLevel) + "%"; + document.getElementById(spell.id + "prog").innerHTML = Math.round(100 * (100 * (spell.experience/spell.nextLevel)))/100 + "%"; + document.getElementById(spell.id + "level").innerHTML = spell.level; + } + }; + + self.isSpellLearned = function(spellId) { + if (spellId === "") { + return true; + } + else { + for (var i = 0; i < spellbook.length; i++) { + if (spellbook[i].id == spellId) { + return spellbook[i].learned; + } + } + return false; + } + }; + + self.castSpell = function(spellId) { + var spell = findSpell(spellId); + var manaCost = spellCost(spellbook[spell]); + + if (player.getManaCurrentValue() >= manaCost && buffs.getRageTimeLeft() === 0 && self.isSpellLearned(spellId)) { + var castSuccessful; + if (spellbook[spell].id == "cure") { + castSuccessful = castCure(spellbook[spell]); + } + else if (spellbook[spell].id == "fireball") { + castSuccessful = castFireball(spellbook[spell]); + } + else if (spellbook[spell].id == "barrier") { + castSuccessful = castBarrier(spellbook[spell]); + } + else if (spellbook[spell].id == "slow") { + castSuccessful = castSlow(spellbook[spell]); + } + else if (spellbook[spell].id == "aegis") { + castSuccessful = castAegis(spellbook[spell]); + } + else if (spellbook[spell].id == "rage") { + castSuccessful = castRage(spellbook[spell]); + } + else if (spellbook[spell].id == "transmutation") { + castSuccessful = castTransmutation(spellbook[spell]); + } + if (castSuccessful) { + if (spellbook[spell].id !== "transmutation") { + arcania += spellbook[spell].level + manaCost/100; + } + player.setManaCurrentValue(player.getManaCurrentValue() - manaCost); + levelSpell(spellbook[spell], buffs.getSpellLevelingMultiplier() * manaCost); + player.setMagicExperience(player.getMagicExperience() + buffs.getLevelingSpeedMultiplier()*(spellbook[spell].level + 1 + manaCost/10)); + return true; + } + } + return false; + }; + + self.buySpell = function(spellId) { + var spell = findSpell(spellId); + if (arcania >= spellbook[spell].arcaniaCost) { + self.setArcania(arcania - spellbook[spell].arcaniaCost); + spellbook[spell].learned = true; + } + self.updateSpellbook(); + } + + var castCure = function(cure) { var currentHealth = player.getHealthCurrentValue(); - var maximumHealth = player.getHealthMaximumValue(); - if (currentHealth == maximumHealth) { - return false; - } - else { - var cureValue = curePotency(cure); - if (maximumHealth - currentHealth < cureValue) { - cureValue = maximumHealth - currentHealth; - } - player.setHealthCurrentValue(currentHealth + cureValue); - if (player.getInBattle()) { - document.getElementById("combatlog").innerHTML = ''; - document.getElementById("combatlog").innerHTML += "You healed yourself for " + Math.round(cureValue) + " HP with Cure.
"; - monsters.battle(monsters.getInstancedMonster(), true); - } - return true; - } - }; - - var curePotency = function(cure) { - var cureBasePotency = 25; - var cureLevelPotency = Math.pow(1.5, cure.level); - var cureMagicPotency = Math.pow(1.1, player.getMagicLevel() + player.getMagicBonus() - 5) - 1; - return Math.floor(cureBasePotency * cureLevelPotency + cureMagicPotency); - }; - - var castFireball = function(fireball) { - if (!player.getInBattle()) { - return false; - } - else { - var monster = monsters.getInstancedMonster(); - var fireballDamage = fireballPotency(fireball); - if (monster.currentHealth <= fireballDamage) { - fireballDamage = monster.currentHealth; - } - document.getElementById("combatlog").innerHTML = ''; - document.getElementById("combatlog").innerHTML += "Your fireball hit the " + monster.name + " for " + Math.floor(fireballDamage) + " damage.
"; - if (!monsters.monsterTakeDamage(monsters.getInstancedMonster(), fireballDamage)) { - monsters.battle(monsters.getInstancedMonster(), true); - } - return true; - } - }; - - var fireballPotency = function(fireball) { - var fireballBasePotency = 15; - var fireballLevelPotency = Math.pow(1.5, fireball.level); - var fireballMagicPotency = Math.pow(1.1, player.getMagicLevel() + player.getMagicBonus() - 5) - 1; - return Math.floor(fireballBasePotency * fireballLevelPotency + fireballMagicPotency); - }; - - var castBarrier = function(barrier) { - var barrierValue = barrierPotency(barrier); - if (buffs.getBarrierLeft() == barrierValue) { - return false; - } - else { - buffs.setBarrierLeft(barrierValue); - buffs.updateTemporaryBuffs(false); - if (player.getInBattle()) { - document.getElementById("combatlog").innerHTML = ''; - document.getElementById("combatlog").innerHTML += "You created a magical barrier.
"; - monsters.battle(monsters.getInstancedMonster(), true); - } - return true; - } - }; - - var barrierPotency = function(barrier) { - var barrierBasePotency = 50; - var barrierLevelPotency = 50 * barrier.level; - var barrierMagicPotency = (10 * (player.getMagicLevel() + player.getMagicBonus() - 10)); - return Math.floor(barrierBasePotency + barrierLevelPotency + barrierMagicPotency); - }; - - var castAegis = function(aegis) { - if (buffs.getAegisTimeLeft() !== 0) { - return false; - } - else { - buffs.setAegisTimeLeft(aegisPotency(aegis)); - buffs.updateTemporaryBuffs(false); - if (player.getInBattle()) { - document.getElementById("combatlog").innerHTML = ''; - document.getElementById("combatlog").innerHTML += "You summon the heavenly shield, Aegis.
"; - monsters.battle(monsters.getInstancedMonster(), true); - } - return true; - } - }; - - var aegisPotency = function(aegis) { - var aegisBasePotency = 5; - var aegisLevelPotency = 5 * aegis.level; - var aegisMagicPotency = player.getMagicLevel() + player.getMagicBonus() - 50; - return Math.floor(aegisBasePotency + aegisLevelPotency + aegisMagicPotency); - }; - - var castSlow = function(slow) { - var monster = monsters.getInstancedMonster(); - if (!player.getInBattle() || monster.dexterity <= 1) { - return false; - } - else { - monster.dexterity = monster.dexterity/2; - document.getElementById("monsterdex").innerHTML = monster.dexterity; - document.getElementById("combatlog").innerHTML = ''; - document.getElementById("combatlog").innerHTML += "You have cast slow on the " + monster.name + ". Its DEX has been halved.
"; - monsters.setInstancedMonster(monster); - monsters.battle(monsters.getInstancedMonster(), true); - return true; - } - }; - - var castRage = function(rage) { - if (!player.getInBattle()) { - return false; - } - else { - buffs.setRageTimeLeft(ragePotency(rage)); - buffs.updateTemporaryBuffs(false); - document.getElementById("combatlog").innerHTML = ''; - document.getElementById("combatlog").innerHTML += "You have entered a state of frenzy!
"; - monsters.battle(monsters.getInstancedMonster(), true); - return true; - } - }; - - var ragePotency = function(rage) { - var rageBasePotency = 5; - var rageLevelPotency = rage.level; - var rageMagicPotency = (0.2 * (player.getMagicLevel() + player.getMagicBonus() - 25)); - return Math.floor(rageBasePotency + rageLevelPotency + rageMagicPotency); - }; - - var castTransmutation = function(transmutation) { - if (arcania < 100 || player.getInBattle()) { - return false; - } - else { - self.setArcania(arcania - 100); - inventory.setGold(inventory.getGold() + transmutationPotency(transmutation)); - return true; - } - }; - - var transmutationPotency = function(transmutation) { - var transmutationLevelPotency = Math.pow(1.5, transmutation.level) - return Math.round(transmutationLevelPotency); - }; + var maximumHealth = player.getHealthMaximumValue(); + if (currentHealth == maximumHealth) { + return false; + } + else { + var cureValue = curePotency(cure); + if (maximumHealth - currentHealth < cureValue) { + cureValue = maximumHealth - currentHealth; + } + player.setHealthCurrentValue(currentHealth + cureValue); + if (player.getInBattle()) { + document.getElementById("combatlog").innerHTML = ''; + document.getElementById("combatlog").innerHTML += "You healed yourself for " + Math.round(cureValue) + " HP with Cure.
"; + monsters.battle(monsters.getInstancedMonster(), true); + } + return true; + } + }; + + var curePotency = function(cure) { + var cureBasePotency = 25; + var cureLevelPotency = 15 * cure.level; + var cureMagicPotency = 3 * (player.getMagicLevel() + player.getMagicBonus() - 5); + return Math.floor(cureBasePotency + cureLevelPotency + cureMagicPotency); + }; + + var castFireball = function(fireball) { + if (!player.getInBattle()) { + return false; + } + else { + var monster = monsters.getInstancedMonster(); + var fireballDamage = fireballPotency(fireball); + if (monster.currentHealth <= fireballDamage) { + fireballDamage = monster.currentHealth; + } + document.getElementById("combatlog").innerHTML = ''; + document.getElementById("combatlog").innerHTML += "Your fireball hit the " + monster.name + " for " + Math.floor(fireballDamage) + " damage.
"; + if (!monsters.monsterTakeDamage(monsters.getInstancedMonster(), fireballDamage)) { + monsters.battle(monsters.getInstancedMonster(), true); + } + return true; + } + }; + + var fireballPotency = function(fireball) { + var fireballBasePotency = 15; + var fireballLevelPotency = 5 * fireball.level; + var fireballMagicPotency = 1 * (player.getMagicLevel() + player.getMagicBonus() - 5); + return Math.floor(fireballBasePotency + fireballLevelPotency + fireballMagicPotency); + }; + + var castBarrier = function(barrier) { + var barrierValue = barrierPotency(barrier); + if (buffs.getBarrierLeft() == barrierValue) { + return false; + } + else { + buffs.setBarrierLeft(barrierValue); + buffs.updateTemporaryBuffs(false); + if (player.getInBattle()) { + document.getElementById("combatlog").innerHTML = ''; + document.getElementById("combatlog").innerHTML += "You created a magical barrier.
"; + monsters.battle(monsters.getInstancedMonster(), true); + } + return true; + } + }; + + var barrierPotency = function(barrier) { + var barrierBasePotency = 50; + var barrierLevelPotency = 50 * barrier.level; + var barrierMagicPotency = 10 * (player.getMagicLevel() + player.getMagicBonus() - 10); + return Math.floor(barrierBasePotency + barrierLevelPotency + barrierMagicPotency); + }; + + var castAegis = function(aegis) { + if (buffs.getAegisTimeLeft() !== 0) { + return false; + } + else { + buffs.setAegisTimeLeft(aegisPotency(aegis)); + buffs.updateTemporaryBuffs(false); + if (player.getInBattle()) { + document.getElementById("combatlog").innerHTML = ''; + document.getElementById("combatlog").innerHTML += "You summon the heavenly shield, Aegis.
"; + monsters.battle(monsters.getInstancedMonster(), true); + } + return true; + } + }; + + var aegisPotency = function(aegis) { + var aegisBasePotency = 5; + var aegisLevelPotency = 1 * aegis.level; + var aegisMagicPotency = 0.2 * (player.getMagicLevel() + player.getMagicBonus() - 50); + return Math.floor(aegisBasePotency + aegisLevelPotency + aegisMagicPotency); + }; + + var castSlow = function(slow) { + var monster = monsters.getInstancedMonster(); + if (!player.getInBattle() || monster.dexterity <= 1) { + return false; + } + else { + var slowEffect = slowPotency(slow); + if (monster.dexterity <= slowEffect) { + slowEffect = monster.dexterity - 1; + } + monster.dexterity -= slowEffect; + document.getElementById("monsterdex").innerHTML = monster.dexterity; + document.getElementById("combatlog").innerHTML = ''; + document.getElementById("combatlog").innerHTML += "You have cast slow on the " + monster.name + ". Its dexterity has been lowered by " + slowEffect + ".
"; + monsters.setInstancedMonster(monster); + monsters.battle(monsters.getInstancedMonster(), true); + return true; + } + }; + + var slowPotency = function(slow) { + var slowBasePotency = 5; + var slowLevelPotency = 1 * slow.level; + var slowMagicPotency = 0.2 * (player.getMagicLevel() + player.getMagicBonus() - 20); + return Math.floor(slowBasePotency + slowLevelPotency + slowMagicPotency); + }; + + var castRage = function(rage) { + if (!player.getInBattle()) { + return false; + } + else { + buffs.setRageTimeLeft(ragePotency(rage)); + buffs.updateTemporaryBuffs(false); + document.getElementById("combatlog").innerHTML = ''; + document.getElementById("combatlog").innerHTML += "You have entered a state of frenzy!
"; + monsters.battle(monsters.getInstancedMonster(), true); + return true; + } + }; + + var ragePotency = function(rage) { + var rageBasePotency = 5; + var rageLevelPotency = 1 * rage.level; + var rageMagicPotency = 0.2 * (player.getMagicLevel() + player.getMagicBonus() - 25); + return Math.floor(rageBasePotency + rageLevelPotency + rageMagicPotency); + }; + + var castTransmutation = function(transmutation) { + if (arcania < 100 || player.getInBattle()) { + return false; + } + else { + self.setArcania(arcania - 100); + inventory.setGold(inventory.getGold() + transmutationPotency(transmutation)); + return true; + } + }; + + var transmutationPotency = function(transmutation) { + var transmutationBasePotency = 1; + var transmutationLevelPotency = 1 * transmutation.level; + var transmutationMagicPotency = 0.2 * (player.getMagicLevel() + player.getMagicBonus() - 5); + return Math.floor(transmutationBasePotency + transmutationLevelPotency + transmutationMagicPotency); + }; }; var spells = new Spells(); \ No newline at end of file diff --git a/assets/js/system.js b/assets/js/system.js index 9e583c5..9a164f8 100644 --- a/assets/js/system.js +++ b/assets/js/system.js @@ -1,91 +1,91 @@ var System = function() { - var ticks = 0; - var refreshSpeed = 1000; + var ticks = 0; + var refreshSpeed = 1000; - var init = false; - var idleMode = false; + var init = false; + var idleMode = false; - var theGame; - var idleHealthSlider; - var idleManaSlider; + var theGame; + var idleHealthSlider; + var idleManaSlider; - var self = this; - //Save Method - var save = function() { - var systemSave = { - savedTicks: ticks - }; - localStorage.setItem("systemSave",JSON.stringify(systemSave)); - }; + var self = this; + //Save Method + var save = function() { + var systemSave = { + savedTicks: ticks + }; + localStorage.setItem("systemSave",JSON.stringify(systemSave)); + }; - var saveAll = function() { - save(); - player.save(); - spells.save(); - upgrades.save(); - buffs.save(); - monsters.save(); - tower.save(); - inventory.save(); - }; + var saveAll = function() { + save(); + player.save(); + spells.save(); + upgrades.save(); + buffs.save(); + monsters.save(); + tower.save(); + inventory.save(); + }; - //Load Method - var load = function() { - var systemSave = JSON.parse(localStorage.getItem("systemSave")); - if (systemSave) { - if (systemSave.savedTicks !== undefined) { - ticks = systemSave.savedTicks; - } - } - }; + //Load Method + var load = function() { + var systemSave = JSON.parse(localStorage.getItem("systemSave")); + if (systemSave) { + if (systemSave.savedTicks !== undefined) { + ticks = systemSave.savedTicks; + } + } + }; - var loadAll = function() { - load(); - player.load(); - spells.load(); - upgrades.load(); - buffs.load(); - monsters.load(); - tower.load(); - inventory.load(); - }; + var loadAll = function() { + load(); + player.load(); + spells.load(); + upgrades.load(); + buffs.load(); + monsters.load(); + tower.load(); + inventory.load(); + }; - //Getters - self.getIdleMode = function() { - return idleMode; - }; + //Getters + self.getIdleMode = function() { + return idleMode; + }; - //Setters + //Setters - //Other Methods - var loadIdleHealthSlider = function() { - idleHealthSlider = new Slider("#idleRest", { - ticks: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100], - ticks_snap_bounds: 10, - value: 100 - }); - }; + //Other Methods + var loadIdleHealthSlider = function() { + idleHealthSlider = new Slider("#idleRest", { + ticks: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100], + ticks_snap_bounds: 10, + value: 100 + }); + }; - var loadIdleManaSlider = function() { - idleManaSlider = new Slider("#idleMpRest", { - ticks: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100], - ticks_snap_bounds: 10, - value: 100 - }); - }; + var loadIdleManaSlider = function() { + idleManaSlider = new Slider("#idleMpRest", { + ticks: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100], + ticks_snap_bounds: 10, + value: 100 + }); + }; - self.runGame = function() { - theGame = window.setInterval(main, refreshSpeed); - }; + self.runGame = function() { + theGame = window.setInterval(main, refreshSpeed); + }; - self.gameSpeed = function(number) { - if (idleMode) { - refreshSpeed = number; - theGame = window.clearInterval(theGame); - self.runGame(); - document.getElementById("speed").innerHTML = 1000/number; - } - }; + self.gameSpeed = function(number) { + if (idleMode) { + refreshSpeed = number; + theGame = window.clearInterval(theGame); + self.runGame(); + document.getElementById("speed").innerHTML = 1000/number; + } + }; self.exportGame = function() { theGame = window.clearInterval(theGame); @@ -134,10 +134,10 @@ var System = function() { this.runGame(); }; - self.hardReset = function() { - theGame = window.clearInterval(theGame); - if (confirm("Are you sure you want to wipe all your progress?")) { - // localStorage.clear(); + self.hardReset = function() { + theGame = window.clearInterval(theGame); + if (confirm("Are you sure you want to wipe all your progress?")) { + // localStorage.clear(); localStorage.removeItem('systemSave'); localStorage.removeItem('playerSave'); localStorage.removeItem('spellsSave'); @@ -147,109 +147,108 @@ var System = function() { localStorage.removeItem('towerSave'); localStorage.removeItem('inventorySave'); - location.reload(); - } - else { - this.runGame(); - } - }; + location.reload(); + } + else { + this.runGame(); + } + }; - var updateTime = function(number) { - document.getElementById("seconds").innerHTML = number % 60; - number = Math.floor(number / 60); - document.getElementById("minutes").innerHTML = number % 60; - number = Math.floor(number / 60); - document.getElementById("hours").innerHTML = number % 24; - number = Math.floor(number / 24); - document.getElementById("days").innerHTML = number; - }; + var updateTime = function(number) { + document.getElementById("seconds").innerHTML = number % 60; + number = Math.floor(number / 60); + document.getElementById("minutes").innerHTML = number % 60; + number = Math.floor(number / 60); + document.getElementById("hours").innerHTML = number % 24; + number = Math.floor(number / 24); + document.getElementById("days").innerHTML = number; + }; - var main = function() { - if (!init) { - startTheEngine(); - } - ticks++; - if (player.getResting()) { - player.rest(); - } - if (idleMode) { - if (!player.getInBattle()) { - if (buffs.getBarrierLeft() === 0 && buffs.getAutoBarrierCast()) { - spells.castSpell("barrier"); - } - if ((100*(player.getHealthCurrentValue()/player.getHealthMaximumValue()) >= idleHealthSlider.getValue()) && (100*(player.getManaCurrentValue()/player.getManaMaximumValue())) >= idleManaSlider.getValue() && !player.getResting()) { - tower.exploreFloor(); - } - else if (!player.getResting() || player.isFullyRested()) { - player.toggleRest(); - } - } - else { - monsters.attackMelee(); - } - } - buffs.updateTemporaryBuffs(true); - updateTime(ticks); - saveAll(); - }; + var main = function() { + if (!init) { + startTheEngine(); + } + ticks++; + if (player.getResting()) { + player.rest(); + } + if (idleMode) { + if (!player.getInBattle()) { + if (buffs.getBarrierLeft() === 0 && buffs.getAutoBarrierCast()) { + spells.castSpell("barrier"); + } + if ((100*(player.getHealthCurrentValue()/player.getHealthMaximumValue()) >= idleHealthSlider.getValue()) && (100*(player.getManaCurrentValue()/player.getManaMaximumValue())) >= idleManaSlider.getValue() && !player.getResting()) { + tower.exploreFloor(); + } + else if (!player.getResting() || player.isFullyRested()) { + player.toggleRest(); + } + } + else { + monsters.attackMelee(); + } + } + updateTime(ticks); + saveAll(); + }; - self.toggleIdle = function() { - if (player.getCurrentFloor() === 0) { - return false; - } - if (idleMode) { - self.gameSpeed(1000); - idleMode = false; - loadIdleButton(); - } - else { - idleMode = true; - loadIdleButton(); - } - }; + self.toggleIdle = function() { + if (player.getCurrentFloor() === 0) { + return false; + } + if (idleMode) { + self.gameSpeed(1000); + idleMode = false; + loadIdleButton(); + } + else { + idleMode = true; + loadIdleButton(); + } + }; - var startTheEngine = function() { - loadAll(); - loadIdleHealthSlider(); - loadIdleManaSlider(); - loadIdleButton(); - player.loadPlayerScreen(); - player.loadExploreButton(); - player.loadRestButton(); - spells.updateSpellbook(); - upgrades.loadExcelia(); - upgrades.updateUpgrades(); - upgrades.loadTimeUpgrades(); - buffs.updateTemporaryBuffs(false); - buffs.updateToggleableBuffs(); - buffs.updatePermanentBuffs(); - if (player.getInBattle()) { - monsters.loadMonsterInfo(monsters.getInstancedMonster()); - } - tower.loadTowerScreen(); - inventory.updateInventoryHTML(); - inventory.updateInventory(); - inventory.updateEquipment(); - self.gameSpeed(1000); - init = true; - }; + var startTheEngine = function() { + loadAll(); + loadIdleHealthSlider(); + loadIdleManaSlider(); + loadIdleButton(); + player.loadPlayerScreen(); + player.loadExploreButton(); + player.loadRestButton(); + spells.updateSpellbook(); + upgrades.loadExcelia(); + upgrades.updateUpgrades(); + upgrades.loadTimeUpgrades(); + buffs.updateTemporaryBuffs(false); + buffs.updateToggleableBuffs(); + buffs.updatePermanentBuffs(); + if (player.getInBattle()) { + monsters.loadMonsterInfo(monsters.getInstancedMonster()); + } + tower.loadTowerScreen(); + inventory.updateInventoryHTML(); + inventory.updateInventory(); + inventory.updateEquipment(); + self.gameSpeed(1000); + init = true; + }; - var loadIdleButton = function() { - if (idleMode) { - document.getElementById("idleSwitch").innerHTML = ''; - } - else { - document.getElementById("idleSwitch").innerHTML = ''; - } - }; + var loadIdleButton = function() { + if (idleMode) { + document.getElementById("idleSwitch").innerHTML = ''; + } + else { + document.getElementById("idleSwitch").innerHTML = ''; + } + }; }; $.get( "https://raw.githubusercontent.com/iCrawlerRPG/iCrawlerRPG.github.io/master/CHANGELOG.md", function( data ) { - var converter = new showdown.Converter(), - md_content = data, - md_to_html = converter.makeHtml( md_content ); - $("#changelog").html( md_to_html ); + var converter = new showdown.Converter(), + md_content = data, + md_to_html = converter.makeHtml( md_content ); + $("#changelog").html( md_to_html ); });