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
Arcania Cost: 0
Mana Cost: 0
Mana Cost: 0
Arcania Cost: 0
Arcania Cost: 0
Mana Cost: 0
Mana Cost: 0