Pixel Combat+

Makes it easier to create new custom enemies for Idle Pixel

Tento skript by neměl být instalován přímo. Jedná se o knihovnu, kterou by měly jiné skripty využívat pomocí meta příkazu // @require https://update.greasyfork.org/scripts/491625/1437608/Pixel%20Combat%2B.js

// ==UserScript==
// @name         Pixel Combat+
// @namespace    http://tampermonkey.net/
// @version      1.0.1
// @description  Makes it easier to create new custom enemies for Idle Pixel
// @author       Dounford
// @license      MIT
// @match        *://idle-pixel.com/login/play*
// @grant        none
// ==/UserScript==

//Default Enemy
let defaultEnemy = {
	name:'Black Cat',
	image:"https://raw.githubusercontent.com/Dounford-Felipe/DHP-Pets/main/images/whiteCatMonster.png",
	hp:100,
	maxHp:100,
	accuracy:3,
	damage:2,
	speed:3,
	defence:5,
	multiPhase: false,
	nextPhase:'',
	arrowImunity:false,
	magicImunity:false,
	needsLight:false,
	weakToFire:false,
	weakToIce:false,
	poisoned: false,
	ghost: false,
	fish: false,
	defender: false,
	lootTable:"",
	lootFunction: "",
	winFunction: "",
	abilities:[]
};
/*abilities: [
	{type: 'heal', limit: -1, chance: 1, cooldown: 3, min:5,max:20, cd:10},
	{type: 'poison', chance: 1, poison:5, cd:5},
	{type: 'damage', limit: -1, chance: 0.25, cooldown: 3, min:5,max:20, cd:3},
	{type: 'kamikaze', chance: 1, cd: 120},
	{type: 'invisibility', limit: -1, chance: 1, cooldown: 30, cd:30},
	{type: 'reflect', limit: -1, chance: 1, cooldown: 15, cd:15}
]*/
//[{item:'',image:'',min:1,max:10,chance:'1/x'}]
//Ranged Weapons
const ranged = ['wooden_bow','long_bow','haunted_bow','balista'];
if (!document.getElementById('panel-customCombat')) {
(function PixelCombatPlus() {
    'use strict';
	const PixelCombatPlus = {
		initialize: function () {
			PixelCombatPlus.newFightPanel();
			PixelCombatPlus.newModals();
			if (IdlePixelPlus) {
				IdlePixelPlus.panels.customCombat = {id:'customCombat',title:'',content:''}
			} else {
				const og_switch_panels = window.switch_panels;
				window.switch_panels = function(id) {
					document.getElementById('panel-customCombat').style.display = "none";
					og_switch_panels.apply(this, arguments);
				}
			}
        },
		//Fighting toggle
		fight: false,
		//Hitsplat Maps
		hitSplatHero: {},
		hitSplatEnemy: {},
		//Timer until fight starts
		startsIn:0,
		//Interval called each second
		ticking:0,
		ticks: 0,
		//Enemy Stats
		enemy: {
			name:'Test',
			image:"",
			hp:10,
			maxHp:10,
			accuracy:3,
			damage:2,
			speed:3,
			defence:5,
			multiPhase: false,
			nextPhase:'',
			arrowImunity:false,
			magicImunity:false,
			needsLight:false,
			weakToFire:false,
			weakToIce:false,
			poisoned: false,
			ghost: false,
			fish: false,
			defender: false,
			lootTable: "",
			lootFunction: "",
			winFunction: "",
		},
		//Hero Stats
		hero: {
			hp:0,
			mana:0,
			revive:0,
			isReflecting:false,
			poisoned: false
		},
		//Spells Cooldown
		healCooldown: 0,
		fireCooldown: 0,
		reflectCooldown: 0,
		invisibilityCooldown: 0,
		heroIsInvisible: 0,
		enemyIsInvisible: 0,
		enemyIsCharging: 0,
		
		testFight: function() {
			PixelCombatPlus.startFight(defaultEnemy)
		},
		
		newModals: function() {
			let lootDiv = `<div style="width: 100%; height: 100%; position: absolute;top:0px; display: none;" id="customCombatModalParent">
				<div style="background-color: black;opacity: 0.7;width: 100%;height: 100%;position: absolute;" onclick="document.getElementById('customCombatModalParent').style.display='none'"></div>
				<div class="modal-content" id="customCombatModal" style="z-index: 11;position: sticky;right: 0px;left: 0px;margin-right: auto;margin-left: auto;width: 35%;border-radius: 5px;top: 100px;">
					<div class="modal-header">
						<h5 class="modal-title text-secondary">LOOT</h5>
						<button type="button" class="btn-close" onclick="document.getElementById('customCombatModalParent').style.display = 'none'"></button>
					</div>
					<div class="modal-body">
						<div id="modal-custom-loot-body">
						</div>
					</div>
					<div class="modal-footer">
						<button onclick="document.getElementById('customCombatModalParent').style.display = 'none'" id="modal-custom-loot-collect-button" class="background-primary"><span class="font-pixel hover">Collect Loot</span></button>
					</div>
				</div>
			</div>`
			document.getElementById('content').insertAdjacentHTML('beforeend', lootDiv);
		},
		
		//Adds the new combat scene
		newFightPanel: function () {
			let customCombatTab = `<div id="panel-customCombat" style="display:none">
				<button onclick="switch_panels('panel-combat')">BACK</button>
				<center>
					<table>
						<tbody>
							<tr>
								<td class="fight-right-border">
								</td>
								<td style="padding-top:20px;" class="canvas-fighting-td fight-top-border">
									<center>
										<span class="hp-progress-bar">
											<span id="custom-hero-progress-bar-hp" class="hp-progress-bar-inner" style="width: 100%;"></span>
											<div class="progress-bar-label">
												<span id="custom_combat_hp">0/0</span>
											</div>
										</span>
										<br>
										<span class="mana-progress-bar">
											<span id="custom-hero-progress-bar-mana" class="mana-progress-bar-inner" style="width: 100%;"></span>
											<div class="progress-bar-label color-cyan">
												<span id="custom_combat_mana">0/0</span>
											</div>
										</span>
									</center>
								</td>
								<td style="padding-bottom:20px;" class="canvas-fighting-td fight-top-border">
									<center>
										<span class="hp-progress-bar">
											<span id="custom-monster-progress-bar-hp" class="hp-progress-bar-inner" style="width: 100%;"></span>
											<div class="progress-bar-label">
												<span id="custom_combat_monster_hp">0/0</span>
											</div>
										</span>
										<br>
									</center>
								</td>
								<td class="fight-left-border">
								</td>
							</tr>
							<tr>
								<td style="vertical-align:top;" class="fight-right-border">
									<div class="fighting-hero-stats-area hover shadow" style="border-right:none;">
										<span id="custom-fighting-hero-label">Player</span>
									</div>
									<div class="td-combat-bottom-panel shadow">
										<div class="td-combat-stat-entry">
											<img class="img-15" src="https://d1xsc8x7nc5q8t.cloudfront.net/images/accuracy_white.png" title="accuracy_white"> 
											<span style="color:white">Accuracy:</span>
											<span id="custom_combat_hero_accuracy">0</span>
										</div>
										<div class="td-combat-stat-entry">
											<img class="img-15" src="https://d1xsc8x7nc5q8t.cloudfront.net/images/melee_damage_white.png" title="melee_damage_white"> 
											<span style="color:white">Damage:</span>
											<span id="custom_combat_hero_melee_damage">0</span>
										</div>
										<div class="td-combat-stat-entry">
											<img class="img-15" src="https://d1xsc8x7nc5q8t.cloudfront.net/images/arrow_damage_white.png" title="arrow_damage_white"> 
											<span style="color:white">Damage:</span>
											<span id="custom_combat_hero_arrow_damage">0</span>
										</div>
										<div class="td-combat-stat-entry">
											<img class="img-15" src="https://d1xsc8x7nc5q8t.cloudfront.net/images/magic_damage_white.png" title="magic_damage_white"> 
											<span style="color:white">Magic:</span>
											<span id="custom_combat_hero_magic_bonus">0</span>
										</div>
										<div class="td-combat-stat-entry">
											<img class="img-15" src="https://d1xsc8x7nc5q8t.cloudfront.net/images/speed_white.png" title="speed_white"> 
											<span style="color:white">Speed:</span>
											<span id="custom_combat_hero_speed">0</span>
										</div>
										<div class="td-combat-stat-entry">
											<img class="img-15" src="https://d1xsc8x7nc5q8t.cloudfront.net/images/defence_white.png" title="defence_white"> 
											<span style="color:white">Defence:</span>
											<span id="custom_combat_hero_defence">0</span>
										</div>
									</div>
									<div style="" id="custom-fighting-spell-heal" onclick="PixelCombatPlus.spell('heal')" class="fighting-spell-area-heal hover shadow">
										<img id="custom-image-heal_spell_icon" src="https://idlepixel.s3.us-east-2.amazonaws.com/images/heal_spell_icon.png" title="heal_spell_icon">
										<span id="custom-fighting-spell-label-heal" style="color: white;">Heal <span class="color-grey" style="color: rgb(128, 128, 128);">(Q)</span></span>
									</div>
									<div style="" id="custom-fighting-spell-fire" onclick="PixelCombatPlus.spell('fire')" class="fighting-spell-area-fire hover shadow">
										<img id="custom-image-fire_spell_icon" src="https://d1xsc8x7nc5q8t.cloudfront.net/images/fire_spell_icon.png" title="fire_spell_icon" class="">
										<span id="custom-fighting-spell-label-fire" style="color: white;">Fire <span class="color-grey" style="color: rgb(128, 128, 128);">(E)</span></span>
									</div>
									<div style="" id="custom-fighting-spell-reflect" onclick="PixelCombatPlus.spell('reflect')" class="fighting-spell-area-fire hover shadow">
										<img id="custom-image-reflect_spell_icon" src="https://d1xsc8x7nc5q8t.cloudfront.net/images/reflect_spell_icon.png" title="reflect_spell_icon" class="">
										<span id="custom-fighting-spell-label-reflect" style="color: white;">Reflect <span class="color-grey" style="color: rgb(128, 128, 128);">(E)</span></span>
									</div>
									<div style="" id="custom-fighting-spell-invisibility" onclick="PixelCombatPlus.spell('invisibility')" class="fighting-spell-area-invisibility hover shadow">
										<img id="custom-image-invisibility_spell_icon" src="https://d1xsc8x7nc5q8t.cloudfront.net/images/invisibility_spell_icon.png" title="invisibility_spell_icon" class="">
										<span id="custom-fighting-spell-label-invisibility" style="color: white;">Invisibility <span class="color-grey" style="color: rgb(128, 128, 128);">(R)</span></span>
									</div>
								</td>
								<td class="canvas-fighting-td fight-bottom-border">
									<div style="display: none;" class="fighting-countdown">FIGHT IN <span id="custom-fighting-countdown">5</span></div>
									<canvas class="canvas-fighting" style="margin-left:100px;margin-right:100px" id="custom-combat-canvas-hero" width="300px" height="600px" original-width="300px" original-height="600px">
									</canvas>
								</td>
								<td class="canvas-fighting-td fight-bottom-border">
									<canvas class="canvas-fighting" id="custom-combat-canvas-monster" width="500px" height="600px" original-width="500px" original-height="600px" style="">
									</canvas>
								</td>
								<td style="vertical-align:top;" class="fight-left-border">
									<div class="fighting-monster-stats-area hover shadow">
										<span id="custom-fighting-monster-label">Enemy Name</span>
									</div>
									<div class="td-combat-bottom-panel shadow" style="border-left:none;">
										<div class="td-combat-stat-entry">
											<img class="img-15" src="https://d1xsc8x7nc5q8t.cloudfront.net/images/accuracy_white.png" title="accuracy_white"> 
											<span style="color:white">Accuracy:</span>
											<span id="custom_combat_monster_accuracy">0</span>
										</div>
										<div class="td-combat-stat-entry">
											<img class="img-15" src="https://d1xsc8x7nc5q8t.cloudfront.net/images/melee_damage_white.png" title="melee_damage_white"> 
											<span style="color:white">Damage:</span>
											<span id="custom_combat_monster_attack">0</span>
										</div>
										<div class="td-combat-stat-entry">
											<img class="img-15" src="https://d1xsc8x7nc5q8t.cloudfront.net/images/speed_white.png" title="speed_white"> 
											<span style="color:white">Speed:</span>
											<span id="custom_combat_monster_speed">3</span>
										</div>
										<div class="td-combat-stat-entry">
											<img class="img-15" src="https://d1xsc8x7nc5q8t.cloudfront.net/images/defence_white.png" title="defence_white"> 
											<span style="color:white">Defence:</span>
											<span id="custom_combat_monster_defence">0</span>
										</div>
									</div>
								</td>
							</tr>
							<tr>
								<td></td>
								<td>
									<center>
										<!-- presets -->
										<div id="custom-combat-presets-area" style="" class="combat-presets-area shadow center">
											<img src="https://d1xsc8x7nc5q8t.cloudfront.net/images/combat_presets.png" class="w20" title="combat_presets"> <u class="color-silver">Presets</u><br><br>
											<img data-tooltip="combat-preset-1" id="custom-in-combat-presets-icon-1" onclick="websocket.send('PRESET_LOAD=1~1')" class="combat-presets-combat-icon hover w30" src="" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true" title="" data-bs-original-title="<span class='color-primary'>PRESETS</span><br /><br />Press 1 to quickload." aria-label="<span class='color-primary'>PRESETS</span><br /><br />Press 1 to quickload." style="background-color: rgb(219, 255, 220);">
											<img data-tooltip="combat-preset-2" id="custom-in-combat-presets-icon-2" onclick="websocket.send('PRESET_LOAD=2~1')" class="combat-presets-combat-icon hover w30" src="" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true" title="" data-bs-original-title="<span class='color-primary'>PRESETS</span><br /><br />Press 2 to quickload." aria-label="<span class='color-primary'>PRESETS</span><br /><br />Press 2 to quickload." style="background-color: rgb(117, 126, 255);">
											<img data-tooltip="combat-preset-3" id="custom-in-combat-presets-icon-3" onclick="websocket.send('PRESET_LOAD=3~1')" class="combat-presets-combat-icon hover w30" src="" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true" title="" data-bs-original-title="<span class='color-primary'>PRESETS</span><br /><br />Press 3 to quickload." aria-label="<span class='color-primary'>PRESETS</span><br /><br />Press 3 to quickload." style="background-color: rgb(219, 255, 220);">
											<img data-tooltip="combat-preset-4" id="custom-in-combat-presets-icon-4" onclick="websocket.send('PRESET_LOAD=4~1')" class="combat-presets-combat-icon hover w30" src="" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true" title="" data-bs-original-title="<span class='color-primary'>PRESETS</span><br /><br />Press 4 to quickload." aria-label="<span class='color-primary'>PRESETS</span><br /><br />Press 4 to quickload." style="background-color: rgb(255, 87, 87);">
											<img data-tooltip="combat-preset-5" id="custom-in-combat-presets-icon-5" onclick="websocket.send('PRESET_LOAD=5~1')" class="combat-presets-combat-icon hover w30" src="" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true" title="" data-bs-original-title="<span class='color-primary'>PRESETS</span><br /><br />Press 5 to quickload." aria-label="<span class='color-primary'>PRESETS</span><br /><br />Press 5 to quickload." style="background-color: rgb(219, 255, 220);">
										</div>
									</center>
									<!-- end presets -->
								</td>
								<td></td>
								<td></td>
							</tr>
						</tbody>
					</table>
				</center>
			</div>`
			document.getElementById('panels').insertAdjacentHTML('beforeend', customCombatTab);
			let combatNot = `<div id="notification-custom-combat" style="display: none;" onclick="switch_panels('panel-customCombat');document.getElementById('menu-bar').style.display = 'none';" class="notification hover">
			  <img src="https://d1xsc8x7nc5q8t.cloudfront.net/images/fight.png" class="w20" title="fight"> 
			  <span style="color:red">IN COMBAT!</span>
			  <span style="color:grey">(Click to resume)</span>
			  <span class="color-white" id="notification-combat"></span>
			</div>`
			document.getElementById('notification-combat').insertAdjacentHTML('afterend', combatNot);
			PixelCombatPlus.heroCanvas = document.getElementById("custom-combat-canvas-hero");
			PixelCombatPlus.heroContext = document.getElementById("custom-combat-canvas-hero").getContext("2d");
			PixelCombatPlus.enemyCanvas = document.getElementById("custom-combat-canvas-monster");
			PixelCombatPlus.enemyContext = document.getElementById("custom-combat-canvas-monster").getContext("2d");
			PixelCombatPlus.enemyImage = new Image();
			document.addEventListener('keydown', function(e) {
				const chatInput = document.getElementById('chat-area-input');
				const customCombatPanel = document.getElementById('panel-customCombat');
				if (!chatInput.matches(':focus') && customCombatPanel.style.display !== "none") {
					switch (e.keyCode) {
						//Presets
						case 49: websocket.send('PRESET_LOAD=1~1'); break;
						case 50: websocket.send('PRESET_LOAD=2~1'); break;
						case 51: websocket.send('PRESET_LOAD=3~1'); break;
						case 52: websocket.send('PRESET_LOAD=4~1'); break;
						case 53: websocket.send('PRESET_LOAD=5~1'); break;
						//Spells
						case 81: PixelCombatPlus.spell('heal'); break;
						case 87: PixelCombatPlus.spell('fire'); break;
						case 69: PixelCombatPlus.spell('reflect'); break;
						case 82: PixelCombatPlus.spell('invisibility'); break;
					}
				}
			});
		},
		
		//Refresh the presets on the custom combat
		refreshPresetIcons: function()  {
			for(let i = 1; i < 6 ; i++)	{
				document.getElementById("custom-in-combat-presets-icon-" + i).src = get_image("images/" + Items.getItem("combat_preset_icon_" + i));
				document.getElementById("custom-in-combat-presets-icon-" + i).style.backgroundColor = Items.getItemString("combat_preset_color_" + i);
			}
		},
		
		//Cooldown function
		cooldown: function(variable,time,id,defaultText) {
			PixelCombatPlus[variable] = time;
			if (typeof id == 'string') {
				document.getElementById(id).innerHTML = time;
				document.getElementById(id).parentNode.style.display = "";
			};
			if (time > 0) {
				setTimeout(function(){
					PixelCombatPlus.cooldown(variable,time-1,id,defaultText);
				},1000)
			} else if (typeof defaultText == 'string') {
				if (defaultText == "hide") {
					document.getElementById(id).parentNode.style.display = "none";
				} else {
					document.getElementById(id).innerHTML = defaultText;
				}
			};
		},
		
		//Cooldown function
		cooldownAbility: function(index,time) {
			if (PixelCombatPlus.fight == false) {PixelCombatPlus.enemy.abilities = []};
			if (PixelCombatPlus.enemy.abilities[index] == undefined) {return};
			PixelCombatPlus.enemy.abilities[index].cd = time;
			if (time > 0) {
				setTimeout(function(){
					PixelCombatPlus.cooldownAbility(index,time-1);
				},1000)
			}
		},
		
		//Spell Casting Function
		spell: function(spellName) {
			if (PixelCombatPlus[spellName+'Cooldown'] == 0) {
				switch (spellName) {
					case "heal":
						if (PixelCombatPlus.hero.mana >= 2) {
							PixelCombatPlus.hero.mana -= 2;
							PixelCombatPlus.hero.hp += 3;
							PixelCombatPlus.hero.hp = Math.min(PixelCombatPlus.hero.hp,var_max_hp);
							PixelCombatPlus.updateStatsBars();
							PixelCombatPlus.addHitSplat("3", 'images/heal_spell.png', 'lime', 'rgba(0,255,0,0.4)', 'blue', 'Hero');
							PixelCombatPlus.cooldown('healCooldown',5,'custom-fighting-spell-label-heal','Heal <span class="color-grey" style="color: rgb(128, 128, 128);">(Q)</span>');
						}
					break;
					case "fire":
						if (PixelCombatPlus.hero.mana >= 3) {
							PixelCombatPlus.hero.mana -= 3;
							let fireDamage = Math.floor(Math.random() * 6) + parseInt(var_magic_bonus);
							if (PixelCombatPlus.enemy.weakToFire == true) {
								fireDamage *= 2
							};
							if (PixelCombatPlus.enemy.magicImunity == false) {
								PixelCombatPlus.enemy.hp -= fireDamage;
								PixelCombatPlus.addHitSplat(fireDamage, 'images/fire_icon.png', 'white', 'rgba(255,0,0,0.4)', 'blue', 'Enemy');
							} else {
								PixelCombatPlus.addHitSplat('IMMUNE', 'images/fire_icon.png', 'white', 'rgba(255,0,0,0.4)', 'blue', 'Enemy');
							};
							PixelCombatPlus.updateStatsBars();
							PixelCombatPlus.cooldown('fireCooldown',5,'custom-fighting-spell-label-fire','Fire <span class="color-grey" style="color: rgb(128, 128, 128);">(W)</span>');
						}
					break;
					case "reflect":
						if (PixelCombatPlus.hero.mana >= 1 && PixelCombatPlus.hero.isReflecting == false) {
							PixelCombatPlus.hero.mana -= 1;
							PixelCombatPlus.hero.isReflecting = true;
							PixelCombatPlus.updateStatsBars();
							PixelCombatPlus.cooldown('reflectCooldown',30,'custom-fighting-spell-label-reflect','Reflect <span class="color-grey" style="color: rgb(128, 128, 128);">(E)</span>');
						}
					break;
					case "invisibility":
						if (PixelCombatPlus.hero.mana >= 2) {
							PixelCombatPlus.hero.mana -= 2;
							PixelCombatPlus.updateStatsBars();
							PixelCombatPlus.cooldown('heroIsInvisible',4);
							PixelCombatPlus.cooldown('invisibilityCooldown',30,'custom-fighting-spell-label-invisibility','Invisibility <span class="color-grey" style="color: rgb(128, 128, 128);">(R)</span>');
						}
					break;
				};
			}
		},
		
		poison: function(receiver,poisonDamage) {
			PixelCombatPlus[receiver].hp -= poisonDamage;
			PixelCombatPlus.addHitSplat(poisonDamage, 'images/poison.png', 'green', 'rgba(255,0,0,0.4)', 'blue', receiver.charAt(0).toLocaleUpperCase() + receiver.slice(1));
			PixelCombatPlus.updateStatsBars();
			if (PixelCombatPlus.hero.hp > 0 && PixelCombatPlus.enemy.hp > 0) {setTimeout(function(){PixelCombatPlus.poison(receiver,poisonDamage)},4000)};
		},
		
		//Enemy Special Attack
		specialAttack: function() {
			if (typeof PixelCombatPlus.enemy.abilities == 'object') {
				PixelCombatPlus.enemy.abilities.forEach(function(ability,index) {
					if (ability.limit == 0 || ability.cd > 0) {
					  return;
					};
					const randomChance = Math.random();
					if (ability.chance > randomChance)  {
						switch (ability.type) {
							case 'heal':
								let healAmount = Math.floor(Math.random() * (ability.max - ability.min + 1) + ability.min)
								PixelCombatPlus.enemy.hp += healAmount;
								PixelCombatPlus.enemy.hp = Math.min(PixelCombatPlus.enemy.hp,PixelCombatPlus.enemy.maxHp);
								PixelCombatPlus.updateStatsBars();
								PixelCombatPlus.addHitSplat(healAmount, 'images/heal_spell.png', 'lime', 'rgba(0,255,0,0.4)', 'blue', 'Enemy');
							break;
							case 'poison':
								if (PixelCombatPlus.hero.poisoned == true) {return}
								PixelCombatPlus.hero.poisoned = true;
								const poisonDamage = ability.poison || 5
								PixelCombatPlus.poison('hero',poisonDamage)
							break;
							case 'damage':
								if (PixelCombatPlus.heroIsInvisible > 0) {
									PixelCombatPlus.addHitSplat("MISSED","images/ghost_icon.png","white","rgba(255,0,0,0.6)","blue","Hero");
								} else {
									let damageDone = Math.floor(Math.random() * (ability.max - ability.min + 1) + ability.min);
									if (PixelCombatPlus.hero.isReflecting == true && damageDone > 0) {
										PixelCombatPlus.enemy.hp -= damageDone;
										PixelCombatPlus.hero.isReflecting = false;
										PixelCombatPlus.addHitSplat(damageDone, "images/reflect_spell.png", 'white', 'rgba(255,0,0,0.6)', 'blue', 'Enemy');
									} else {
										PixelCombatPlus.hero.hp -= damageDone;
										PixelCombatPlus.addHitSplat(damageDone,"images/sword_icon.png","white","rgba(255,0,0,0.6)","blue","Hero");
									}
									PixelCombatPlus.updateStatsBars();
								}
							break;
							case 'chargeDamage':
								if (PixelCombatPlus.enemyIsCharging > 0) {return};
								PixelCombatPlus.cooldown('enemyIsCharging',4);
								setTimeout(function() {
									if (PixelCombatPlus.heroIsInvisible > 0) {
										PixelCombatPlus.addHitSplat("MISSED","images/ghost_icon.png","white","rgba(255,0,0,0.6)","blue","Hero");
									} else {
										let damageDone = Math.floor(Math.random() * (ability.max - ability.min + 1) + ability.min);
										if (PixelCombatPlus.hero.isReflecting == true && damageDone > 0) {
											PixelCombatPlus.enemy.hp -= damageDone;
											PixelCombatPlus.hero.isReflecting = false;
											PixelCombatPlus.addHitSplat(damageDone, "images/reflect_spell.png", 'white', 'rgba(255,0,0,0.6)', 'blue', 'Enemy');
										} else {
											PixelCombatPlus.hero.hp -= damageDone;
											PixelCombatPlus.addHitSplat(damageDone,"images/sword_icon.png","white","rgba(255,0,0,0.6)","blue","Hero");
										}
										PixelCombatPlus.updateStatsBars();
									}
								},4000);
							break;
							case 'lifeSteal':
								if (PixelCombatPlus.heroIsInvisible > 0) {
									PixelCombatPlus.addHitSplat("MISSED","images/ghost_icon.png","white","rgba(255,0,0,0.6)","blue","Hero");
								} else {
									let damageDone = Math.floor(Math.random() * (ability.max - ability.min + 1) + ability.min);
									if (PixelCombatPlus.hero.isReflecting == true && damageDone > 0) {
										PixelCombatPlus.enemy.hp -= damageDone;
										PixelCombatPlus.hero.isReflecting = false;
										PixelCombatPlus.addHitSplat(damageDone, "images/reflect_spell.png", 'white', 'rgba(255,0,0,0.6)', 'blue', 'Enemy');
									} else {
										PixelCombatPlus.hero.hp -= damageDone;
										PixelCombatPlus.enemy.hp += damageDone;
										PixelCombatPlus.enemy.hp = Math.min(PixelCombatPlus.enemy.hp,PixelCombatPlus.enemy.maxHp);
										PixelCombatPlus.addHitSplat(damageDone,"images/sword_icon.png","white","rgba(255,0,0,0.6)","blue","Hero");
										PixelCombatPlus.addHitSplat(damageDone, 'images/heal_spell.png', 'lime', 'rgba(0,255,0,0.4)', 'blue', 'Enemy');
									}
									PixelCombatPlus.updateStatsBars();
								};
							break;
							case 'kamikaze':
								PixelCombatPlus.hero.hp = 0;
								PixelCombatPlus.endFight();
							break;
							case "invisibility":
								if (PixelCombatPlus.enemyIsInvisible > 0) {return}
								let invisibleTime = Math.floor(Math.random() * (ability.max - ability.min + 1) + ability.min);
								PixelCombatPlus.cooldown('enemyIsInvisible',invisibleTime);
							break;
							case "reflect":
								if (PixelCombatPlus.enemy.isReflecting == true) {return};
								PixelCombatPlus.enemy.isReflecting = true;
							break;
							case "fullRestorePlayer":
								PixelCombatPlus.hero.hp = var_max_hp; //Set the current hero hp to max
								PixelCombatPlus.hero.mana = var_max_mana; //Set the current hero mana to max
								PixelCombatPlus.updateStatsBars();
							break;
							case "restorePlayerHP":
								let healAmounts = Math.floor(Math.random() * (ability.max - ability.min + 1) + ability.min)
								PixelCombatPlus.hero.hp += healAmounts;
								PixelCombatPlus.hero.hp = Math.min(PixelCombatPlus.hero.hp,var_max_hp);
								PixelCombatPlus.updateStatsBars();
								PixelCombatPlus.addHitSplat(healAmounts, 'images/heal_spell.png', 'lime', 'rgba(0,255,0,0.4)', 'blue', 'Hero');
							break;
							case "restorePlayerMana":
								let manaAmount = Math.floor(Math.random() * (ability.max - ability.min + 1) + ability.min)
								PixelCombatPlus.hero.mana += manaAmount;
								PixelCombatPlus.hero.mana = Math.min(PixelCombatPlus.hero.mana,var_max_mana);
								PixelCombatPlus.updateStatsBars();
							break;
						};
						if (ability.limit != -1) {
							ability.limit--;
						};
						if (ability.cooldown > 0) {
							PixelCombatPlus.cooldownAbility(index,ability.cooldown)
						};
					};
				});
			}
		},

		//Update the stats bar on combat scene
		updateStatsBars: function() {
			//Hero
			document.getElementById("custom_combat_hp").innerHTML = Math.max(0,PixelCombatPlus.hero.hp) + "/" + var_max_hp; //Set the number on the hero hp bar
			let heroHpPercentage = PixelCombatPlus.hero.hp / var_max_hp * 100;
			document.getElementById("custom-hero-progress-bar-hp").style.width = heroHpPercentage.toFixed() + "%"; // Set the hero hp bar background
			//Mana
			document.getElementById("custom_combat_mana").innerHTML = Math.max(0,PixelCombatPlus.hero.mana) + "/" + var_max_mana; //Set the number on the hero mana bar
			let heroManaPercentage = PixelCombatPlus.hero.mana / var_max_mana * 100;
			document.getElementById("custom-hero-progress-bar-mana").style.width = heroManaPercentage.toFixed() + "%"; // Set the mana hp bar background
			
			//Enemy
			document.getElementById("custom_combat_monster_hp").innerHTML = Math.max(0,PixelCombatPlus.enemy.hp) + "/" + PixelCombatPlus.enemy.maxHp; //Set the number on the enemy hp bar
			let EnemyHpPercentage = PixelCombatPlus.enemy.hp / PixelCombatPlus.enemy.maxHp * 100;
			document.getElementById("custom-monster-progress-bar-hp").style.width = EnemyHpPercentage.toFixed() + "%"; // Set the enemy hp bar background
		},
		
		//Update the enemy stats mid fight, can be used for pvp
		updateEnemyStats: function(foe) {
			PixelCombatPlus.enemyImage.src = foe.image;
			PixelCombatPlus.enemy.abilities = [];
			for (const key in foe) {
				PixelCombatPlus.enemy[key] = foe[key];
			};
			PixelCombatPlus.updateStatsBars();
			PixelCombatPlus.enemy.abilities.forEach(function(ability,index) {if (ability.cd > 0){PixelCombatPlus.cooldownAbility(index,ability.cd)}});
			document.getElementById("custom-fighting-monster-label").innerText = PixelCombatPlus.enemy.name;
			document.getElementById("custom_combat_monster_accuracy").innerText = PixelCombatPlus.enemy.accuracy == -1 ? 1 : PixelCombatPlus.enemy.accuracy;
			document.getElementById("custom_combat_monster_attack").innerText = PixelCombatPlus.enemy.damage;
			document.getElementById("custom_combat_monster_speed").innerText = PixelCombatPlus.enemy.speed;
			document.getElementById("custom_combat_monster_defence").innerText = PixelCombatPlus.enemy.defence;
		},
		
		//Define the enemy image
		setEnemyImage: function(foe) {
			try {
				PixelCombatPlus.enemyImage.src = foe;
			} catch (error) {
				setTimeout(function() {
					try {
						PixelCombatPlus.enemyImage.src = foe;
					} catch (error) {
						PixelCombatPlus.setEnemyImage(foe)
					}
				}, 1000);
			}
		},
		
		//Starts the fight
		startFight: function(foe) {
		if (PixelCombatPlus.fight == false) {
			//Make sure that there is nothing remaining from the last fight
			PixelCombatPlus.enemy.poisoned = false;
			PixelCombatPlus.hero.poisoned = false;
			PixelCombatPlus.hero.isReflecting = false;
			PixelCombatPlus.hitSplatHero = {};
			PixelCombatPlus.hitSplatEnemy = {};
			PixelCombatPlus.hero.revive = 0;
			//Stats Update
			PixelCombatPlus.hero.hp = var_max_hp; //Set the current hero hp to max
			PixelCombatPlus.hero.mana = var_max_mana; //Set the current hero mana to max
			PixelCombatPlus.setEnemyImage(foe.image) //Set the enemy image
			for (const key in foe) {PixelCombatPlus.enemy[key] = foe[key]}; //Set the current enemy
			PixelCombatPlus.enemy.poisoned = false; //Removes poison
			if (PixelCombatPlus.enemy.speed > 6) {PixelCombatPlus.enemy.speed = 6}; // 6 is the max speed
			if (PixelCombatPlus.enemy.hp > PixelCombatPlus.enemy.maxHp) {PixelCombatPlus.enemy.hp = PixelCombatPlus.enemy.maxHp}; // Enemy can't have more than max hp
			
			//UI Update
			PixelCombatPlus.refreshPresetIcons(); //Load the preset icon and color
			PixelCombatPlus.updateStatsBars(); //Updates all stats on UI
			//Hero Stats
			document.getElementById("custom-fighting-hero-label").innerText = var_username;
			document.getElementById("custom_combat_hero_accuracy").innerText = var_accuracy;
			document.getElementById("custom_combat_hero_melee_damage").innerText = var_melee_damage;
			document.getElementById("custom_combat_hero_arrow_damage").innerText = var_arrow_damage;
			document.getElementById("custom_combat_hero_magic_bonus").innerText = var_magic_bonus;
			document.getElementById("custom_combat_hero_speed").innerText = var_speed;
			document.getElementById("custom_combat_hero_defence").innerText = var_defence;
			//Enemy Stats
			document.getElementById("custom-fighting-monster-label").innerText = PixelCombatPlus.enemy.name;
			document.getElementById("custom_combat_monster_accuracy").innerText = PixelCombatPlus.enemy.accuracy == -1 ? 1 : PixelCombatPlus.enemy.accuracy;
			document.getElementById("custom_combat_monster_attack").innerText = PixelCombatPlus.enemy.damage;
			document.getElementById("custom_combat_monster_speed").innerText = PixelCombatPlus.enemy.speed;
			document.getElementById("custom_combat_monster_defence").innerText = PixelCombatPlus.enemy.defence;
			
			switch_panels('panel-customCombat'); //Go to the fight scene
			document.getElementById('menu-bar').style.display = "none"; //Hides lateral bar
			document.getElementById('notification-custom-combat').style.display = "" //Shows the combat notification
			document.getElementById('notification-custom-combat').style.display = "" //Shows the combat notification
			PixelCombatPlus.fight = true; //Starts the fight

			PixelCombatPlus.cooldown('startsIn',5,'custom-fighting-countdown','hide'); //Start the timer to fight
			PixelCombatPlus.ticking = setInterval(function() {
				PixelCombatPlus.tick()
			}, 1000 / 60);
			setTimeout(function(){
				PixelCombatPlus.attack("hero");
				PixelCombatPlus.attack("enemy");
				PixelCombatPlus.enemy.abilities.forEach(function(ability,index) {if (ability.cd > 0){PixelCombatPlus.cooldownAbility(index,ability.cd)}});
			}, 6000);
			
		}
		},
		
		//Hit function
		hitRate: function(defence,accuracy) {
			if (accuracy == -1) {return false};
			let hitRandom = Math.random();
			let hitChance = 0;
			if (((defence / 2) - accuracy) > 4) {
				hitChance = 1 / (Math.max(1, ((defence / 2) - accuracy)) + 1);
			} else if (((defence / 2) - accuracy) <= 0) {
				hitChance = 1;
			} else {
				hitChance = 1 - (((defence / 2) - accuracy) * 2 / 10);
			};
			if (PixelCombatPlus.enemy.needsLight == true && !(var_ring_of_light_equipped == 1 || var_shield == 'lantern')) {hitChance = 0.5};
			return hitRandom <= hitChance
		},
		
		//Attack function 
		attack: function(attacker){
			if (PixelCombatPlus.fight == true) {
			if (attacker == "hero") {
				//Poison
				if (PixelCombatPlus.enemy.poisoned == false && var_weapon.includes('poison')) {
					PixelCombatPlus.enemy.poisoned = true;
					PixelCombatPlus.poison('enemy',5);
				};
				//If hit succeed 
				if (PixelCombatPlus.hitRate(PixelCombatPlus.enemy.defence,var_accuracy)) {
					if (PixelCombatPlus.enemyIsInvisible > 0) {
						PixelCombatPlus.addHitSplat("MISSED","images/ghost_icon.png","white","rgba(255,0,0,0.6)","blue","Enemy");
					} else {
						if (ranged.includes(var_weapon)) {
							if (PixelCombatPlus.enemy.arrowImunity == true) {
								PixelCombatPlus.addHitSplat('IMMUNE', 'images/blocked.png', 'white', 'rgba(255,0,0,0.4)', 'blue', 'Enemy');
							} else {
								let damageDone = Math.floor(Math.random() * parseInt(var_arrow_damage));
								if ((PixelCombatPlus.enemy.weakToFire == true && var_arrows == 'fire_arrows') || (PixelCombatPlus.enemy.weakToIce == true && var_arrows == 'ice_arrows')) {
									damageDone *= 2;
								}
								if (PixelCombatPlus.enemy.isReflecting == true && damageDone > 0) {
									PixelCombatPlus.hero.hp -= damageDone;
									PixelCombatPlus.enemy.isReflecting = false;
									PixelCombatPlus.addHitSplat(damageDone, "images/reflect_spell.png", 'white', 'rgba(255,0,0,0.6)', 'blue', 'Hero');
								} else {
									PixelCombatPlus.enemy.hp -= damageDone;
									PixelCombatPlus.addHitSplat(damageDone, "images/" + Items.getItemString('weapon')+".png", 'white', 'rgba(255,0,0,0.6)', 'blue', 'Enemy');
								}
							};
						} else {
							let damageDone = Math.floor(Math.random() * parseInt(var_melee_damage))
							if (PixelCombatPlus.enemy.ghost == true) {
								if (var_weapon == 'scythe') {damageDone *= 2};
								if (var_weapon == 'double_scythe') {damageDone *= 4};
							} else if (PixelCombatPlus.enemy.fish == true) {
								if (var_weapon.includes('trident')) {damageDone *= 2};
							};
							if (PixelCombatPlus.enemy.isReflecting == true && damageDone > 0) {
								PixelCombatPlus.hero.hp -= damageDone;
								PixelCombatPlus.enemy.isReflecting = false;
								PixelCombatPlus.addHitSplat(damageDone, "images/reflect_spell.png", 'white', 'rgba(255,0,0,0.6)', 'blue', 'Hero');
							} else {
								PixelCombatPlus.enemy.hp -= damageDone;
								PixelCombatPlus.addHitSplat(damageDone, "images/" + Items.getItemString('weapon')+".png", 'white', 'rgba(255,0,0,0.6)', 'blue', 'Enemy');
								if (PixelCombatPlus.enemy.defender == true) {
									PixelCombatPlus.hero.hp -= 1;
									PixelCombatPlus.addHitSplat(1, "images/" + Items.getItemString('weapon')+".png", 'white', 'rgba(255,0,0,0.6)', 'blue', 'Hero');
								};
							};
						};
					}
				} else {
					PixelCombatPlus.addHitSplat("0", "images/blocked.png", 'white', 'rgba(255,0,0,0.6)', 'blue', 'Enemy');
				};
				//Hero attack again
				setTimeout(function(){PixelCombatPlus.attack("hero")},(7-var_speed)*1000)
			} else {
				if (PixelCombatPlus.hitRate(var_defence,PixelCombatPlus.enemy.accuracy)) {
					if (PixelCombatPlus.heroIsInvisible > 0) {
						PixelCombatPlus.addHitSplat("MISSED","images/ghost_icon.png","white","rgba(255,0,0,0.6)","blue","Hero");
					} else {
						let damageDone = Math.floor(Math.random() * PixelCombatPlus.enemy.damage);
						if (PixelCombatPlus.hero.isReflecting == true && damageDone > 0) {
							PixelCombatPlus.enemy.hp -= damageDone;
							PixelCombatPlus.hero.isReflecting = false;
							PixelCombatPlus.addHitSplat(damageDone, "images/reflect_spell.png", 'white', 'rgba(255,0,0,0.6)', 'blue', 'Enemy');
						} else {
							PixelCombatPlus.hero.hp -= damageDone;
							PixelCombatPlus.addHitSplat(damageDone,"images/sword_icon.png","white","rgba(255,0,0,0.6)","blue","Hero");
						}
					}
				} else {
					PixelCombatPlus.addHitSplat("0", "images/blocked.png", 'white', 'rgba(255,0,0,0.6)', 'blue', 'Hero');
				};
				//Enemy attack again
				setTimeout(function(){PixelCombatPlus.attack("enemy")},(7-PixelCombatPlus.enemy.speed)*1000)
			}
			//Update hps
			PixelCombatPlus.updateStatsBars();
			}
		},
		
		//HitSplat Generator
		addHitSplat: function(label, icon, label_color, background_color, border_color, source) {
			let splatX = source == "Hero" ? 150 : 200
			let splatY = source == 450
			let splat = new HitSplat(label, icon, label_color, background_color, border_color, splatX, 450);

			let random_key = rand(1,500000);
			PixelCombatPlus['hitSplat'+source][random_key] = splat;

			setTimeout(
				function(){
					delete PixelCombatPlus['hitSplat'+source][random_key];
				}
			,1000)
		},
		
		//Evething that should be called each second
		tick: function() {
			//UI
			//Hero Stats
			document.getElementById("custom_combat_hero_accuracy").innerText = var_accuracy;
			document.getElementById("custom_combat_hero_melee_damage").innerText = var_melee_damage;
			document.getElementById("custom_combat_hero_arrow_damage").innerText = var_arrow_damage;
			document.getElementById("custom_combat_hero_magic_bonus").innerText = var_magic_bonus;
			document.getElementById("custom_combat_hero_speed").innerText = var_speed;
			document.getElementById("custom_combat_hero_defence").innerText = var_defence;
			PixelCombatPlus.tickCanvas();
			PixelCombatPlus.manageHitplats();
			
			PixelCombatPlus.ticks++
			if (PixelCombatPlus.ticks == 60) {
				if (PixelCombatPlus.enemy.hp <= 0) {
					if (PixelCombatPlus.enemy.multiPhase) {
						PixelCombatPlus.updateEnemyStats(PixelCombatPlus.enemy.nextPhase)
					} else {
						PixelCombatPlus.endFight();
					}
				};
				if (PixelCombatPlus.hero.hp <= 0) {
					if (var_badge_death_1_hp == 1 && PixelCombatPlus.hero.revive == 0) {
						PixelCombatPlus.hero.hp = 1;
						PixelCombatPlus.hero.revive = 1;
						PixelCombatPlus.updateStatsBars();
					} else {
						PixelCombatPlus.endFight();
					}
				};
				if(PixelCombatPlus.startsIn <= 0) {PixelCombatPlus.specialAttack()}
				PixelCombatPlus.ticks = 0;
			};
		},
		
		tickCanvas: function() {
			PixelCombatPlus.heroContext.clearRect(0, 0, PixelCombatPlus.heroCanvas.width, PixelCombatPlus.heroCanvas.height);
			PixelCombatPlus.enemyContext.clearRect(0, 0, PixelCombatPlus.enemyCanvas.width, PixelCombatPlus.enemyCanvas.height);
			if (PixelCombatPlus.heroIsInvisible > 0) {
				PixelCombatPlus.heroContext.fillStyle = "white";
				PixelCombatPlus.heroContext.globalAlpha = 0.1;
				PixelCombatPlus.heroContext.fillRect(155, 20, 50, 50);
				PixelCombatPlus.heroContext.drawImage(Cache.getImage("images/ghost_icon.png","hero_invisible"), 155, 20);
			} else {
				PixelCombatPlus.heroContext.globalAlpha = 1.0;
			};
			if (PixelCombatPlus.enemyIsInvisible > 0) {
				PixelCombatPlus.enemyContext.fillStyle = "white";
				PixelCombatPlus.enemyContext.globalAlpha = 0.1;
				PixelCombatPlus.enemyContext.fillRect(280, 20, 50, 50);
				PixelCombatPlus.enemyContext.drawImage(Cache.getImage("images/ghost_icon.png","hero_invisible"), 280, 20);
			} else {
				PixelCombatPlus.enemyContext.globalAlpha = 1.0;
			};
			if (PixelCombatPlus.hero.isReflecting == true) {
				PixelCombatPlus.heroContext.fillStyle = "white";
				PixelCombatPlus.heroContext.fillRect(95, 20, 50, 50);
				PixelCombatPlus.heroContext.drawImage(Cache.getImage("images/reflect_spell.png","hero_reflecting"), 95, 20);
			};
			if (PixelCombatPlus.enemy.isReflecting == true) {
				PixelCombatPlus.enemyContext.fillStyle = "white";
				PixelCombatPlus.enemyContext.fillRect(170, 20, 50, 50);
				PixelCombatPlus.enemyContext.drawImage(Cache.getImage("images/reflect_spell.png","hero_reflecting"), 170, 20);
			};
			if (PixelCombatPlus.enemyIsCharging > 0) {
				PixelCombatPlus.enemyContext.fillStyle = "white";
				PixelCombatPlus.enemyContext.fillRect(225, 20, 50, 50);
				PixelCombatPlus.enemyContext.fillStyle = "black";
				PixelCombatPlus.enemyContext.font = "50px serif";
				PixelCombatPlus.enemyContext.fillText(PixelCombatPlus.enemyIsCharging, 238, 60);
			};
			PixelCombatPlus.heroContext.drawImage(Cache.getImage("images/hero_head_" + Items.getItemString('head')+".png","hero_fighting_head"), 0, 300);
			PixelCombatPlus.heroContext.drawImage(Cache.getImage("images/hero_body_" + Items.getItemString('body')+".png","hero_fighting_body"), 0, 300);
			PixelCombatPlus.heroContext.drawImage(Cache.getImage("images/hero_gloves_" + Items.getItemString('gloves')+".png","hero_fighting_gloves"), 0, 300);
			PixelCombatPlus.heroContext.drawImage(Cache.getImage("images/hero_legs_" + Items.getItemString('legs')+".png","hero_fighting_legs"), 0, 300);
			PixelCombatPlus.heroContext.drawImage(Cache.getImage("images/hero_boots_" + Items.getItemString('boots')+".png","hero_fighting_boots"), 0, 300);
			PixelCombatPlus.heroContext.drawImage(Cache.getImage("images/hero_amulet_" + Items.getItemString('amulet')+".png","hero_fighting_amulet"), 0, 300);
			PixelCombatPlus.heroContext.drawImage(Cache.getImage("images/hero_shield_" + Items.getItemString('shield')+".png","hero_fighting_shield"), 0, 300);
			PixelCombatPlus.heroContext.drawImage(Cache.getImage("images/hero_weapon_" + Items.getItemString('weapon')+".png","hero_fighting_weapon"), 0, 300);
			if (PixelCombatPlus.enemyImage.height !== 600) {
				let newWidth = 200 / (PixelCombatPlus.enemyImage.height / PixelCombatPlus.enemyImage.width)
				PixelCombatPlus.enemyContext.drawImage(PixelCombatPlus.enemyImage,(500-newWidth)/2,375,newWidth,200);
			} else {
				PixelCombatPlus.enemyContext.drawImage(PixelCombatPlus.enemyImage,0,0);
			}; //Enemy Image
		},
		
		manageHitplats: function() {
			for (let key in PixelCombatPlus.hitSplatHero) {
				PixelCombatPlus.hitSplatHero[key].draw(PixelCombatPlus.heroContext);
			};
			for (let key in PixelCombatPlus.hitSplatEnemy) {
				PixelCombatPlus.hitSplatEnemy[key].draw(PixelCombatPlus.enemyContext);
			};
		},
		
		looting: function() {
			let lootedItems = [];
			let lootedItemsHTML = '';
			document.getElementById('modal-custom-loot-body').innerHTML = ''
			PixelCombatPlus.enemy.lootTable.forEach(function(loot){
				let dropChance = Math.random() * (loot.chance - 1) + 1;
				if (loot.chance == dropChance) {
					let dropAmount = Math.random() * (loot.max - loot.min) + loot.min;
					if (dropAmount == 0) {dropAmount = ''};
					lootedItemsHTML += `<div class="loot" style="background-color:#cce6ff">
						<img src="${loot.image}" class="w50 me-3">${dropAmount} ${loot.item}
					</div>`;
					lootedItems.push({item:loot.item,amount:dropAmount});
				};
			});
			document.getElementById('modal-custom-loot-body').insertAdjacentHTML('beforeend', lootedItemsHTML);
			document.getElementById('customCombatModalParent').style.display = "";
			return lootedItems;
		},
		
		endFight: function() {
			PixelCombatPlus.fight = false;
			clearInterval(PixelCombatPlus.ticking);
			PixelCombatPlus.enemy.poisoned = false;
			PixelCombatPlus.hero.poisoned = false;
			PixelCombatPlus.hero.isReflecting = false;
			PixelCombatPlus.hitSplatHero = {};
			PixelCombatPlus.hitSplatEnemy = {};
			PixelCombatPlus.healCooldown = 0;
			PixelCombatPlus.fireCooldown = 0;
			PixelCombatPlus.reflectCooldown = 0;
			PixelCombatPlus.invisibilityCooldown = 0;
			PixelCombatPlus.heroIsInvisible = 0;
			PixelCombatPlus.hero.revive = 0;
			if (PixelCombatPlus.enemy.hp <= 0) {
				if (typeof PixelCombatPlus.enemy.lootTable == 'object') {
					PixelCombatPlus.enemy.lootFunction(PixelCombatPlus.looting());
				};
				if (typeof PixelCombatPlus.enemy.winFunction == 'function') {
					PixelCombatPlus.enemy.winFunction();
				};
			} else if (PixelCombatPlus.hero.hp <= 0) {
				console.log('loser');
			}
			for (const key in defaultEnemy) {
				PixelCombatPlus.enemy[key] = defaultEnemy[key];
			};
			switch_panels('panel-combat');
			document.getElementById('notification-custom-combat').style.display = "none" //Hide the combat notification
		}
	};
	window.PixelCombatPlus = PixelCombatPlus;
	PixelCombatPlus.initialize();
})()
}