-- Persona Support --
if not srb2p return end

-- Stats
charStats["morshu"] = {
	name = "Morshu",
	basehp = 68,
	basesp = 45,
	persona = "rubyn",
	melee_natk = "morshu_atk1",
	supercolor_start = SKINCOLOR_SUPERGOLD1,
	atk = 35,
	acc = 85,
	crit = 7,
	wep = "hands_01",
	weptype = WPT_PSYGLOVES,
	anim_stand = {SPR_PLAY, A, 8, "SPR2_STND"},
	anim_stand_hurt = {SPR_PLAY, A, 1, "SPR2_STND"},
	anim_stand_bored = {SPR_PLAY, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, 8, "SPR2_WAIT"},
	anim_guard = {SPR_PLAY, D, 1, "SPR2_RUN_"},
	anim_move = {SPR_PLAY, A, B, C, D, E, F, 2, "SPR2_WALK"},
	anim_run = {SPR_PLAY, A, B, C, D, E, F, 2, "SPR2_RUN_"},
	anim_atk = {SPR_PLAY, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, 2, "SPR2_ROLL"},
	anim_aoa_end = {SPR_PLAY, Z, Y, X, W, V, U, T, S, R, Q, P, O, N, M, L, K, J, I, H, G, F, E, D, C, B, A, 2, "SPR2_ROLL"},
	anim_hurt = {SPR_PLAY, A, 35, "SPR2_PAIN"},
	anim_getdown = {SPR_PLAY, C, 1, "SPR2_PAIN"},
	anim_downloop = {SPR_PLAY, C, 1, "SPR2_PAIN"},
	anim_getup = {SPR_PLAY, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, 1, "SPR2_ROLL"},
	anim_death = {SPR_PLAY, A, 30, "SPR2_DEAD"},
	anim_revive = {SPR_PLAY, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, 1, "SPR2_ROLL"},
	anim_evoker = {SPR_PLAY, Q, 1, "SPR2_DASH"},
	vfx_summon = {"sfx_morsum"},
    vfx_skill = {"sfx_morskl"},
    vfx_item = {"sfx_morsum", "sfx_morskl", "sfx_morcrt"},
    vfx_die = {"sfx_morhel"},
    vfx_heal = {"sfx_morhel"},
    vfx_healself = {"sfx_morhsf"},
    vfx_kill = {"sfx_morcrt"},
    vfx_1more = {"sfx_morhsf"},
    vfx_crit = {"sfx_morcrt"},
    vfx_aoaask = {"sfx_morsum"},
    vfx_aoado = {"sfx_moraoa"},
    vfx_aoarelent = {"sfx_morskl"},
    vfx_miss = {"sfx_morhel"},
    vfx_dodge = {"sfx_mordod"},
    vfx_win = {"sfx_morwin"},
    vfx_levelup = {"sfx_morcrt", "sfx_morhsf"},
	icon = "ICO_MORS",
	hudbust = "H_MORBAR",
	hudaoa = "H_MORAOA",
	aoa_quote = "Come back when \nyou're a little \nMMMMM... skilled!",
	hudcutin = "MORS_A",
	tip = "A utility character with Patra and Recarm skills along with Bless, Magic buffs, and defensive options. Use Lamp Oil to make way for his Fire skills which can dish out a lot of damage thanks to their high Burn chances.",
}

-- Persona
personaList["rubyn"] = {
	name = "Rubyn",
	arcana = ARCANA_FORTUNE,
	sprite = SPR_RUBY,
	startframe = 0,
	anim_idle = {SPR_RUBY, A, 10},
	anim_atk = {SPR_RUBY, B, C, D, E, E, E, E, 2},
	strength = 4,
	magic = 10,
	endurance = 9,
	luck = 11,
	agility = 6,
	weak = ATK_CURSE,
	resist = ATK_FIRE|ATK_BLESS,
	skills = {
		{"wares 1", 1}, {"kouha", 4},
		{"makakaja", 6}, {"patra", 11},
		{"makarakarn", 14}, {"tetrakarn", 18},
		{"recarm", 20}, {"wandbreaker", 22},
		
		{"wares 2", 26, "wares 1"}, {"kouga", 29, "kouha"},
		{"mamakakaja", 32, "makakaja"}, {"me patra", 37, "patra"},
		{"samarecarm", 40, "recarm"},
		
		{"wares 3", 45, "wares 2"}, {"kougaon", 48, "kouga"},
		{"tetraja", 53, "makarakarn"}, {"discount wares", 62, "wares 3"},
		{"trisagion", 65}, {"doublakarn", 85, "tetrakarn"},
	},
}

-- Normal Melee Attack
attackDefs["morshu_atk1"] = {
	name = "Pickpocket",
	type = ATK_PIERCE,
	power = 35,
	accuracy = 85,
	critical = 7, -- was 7
	target = TGT_ENEMY,
	cost = CST_HP,
	cost = 0,
	desc = "Steals SP, EP, and \nMacca from an enemy.",
	anim_norepel = true,	-- do not bounce back our ANIMATION
	physical = true,	-- don't play the summoning anim for phys attacks, duh
	norepel = true,
	anim = 	function(mo, targets, hittargets, timer)
				local target = targets[1]
				local atarget = hittargets[1]
				if timer == 1
					ANIM_set(mo, mo.anim_run, true)
					mo.reachedtarget = false	-- yeah we can use variables here that you like it or not :^)

					local cx = target.x + 168*cos(target.angle + ANG1*20)
					local cy = target.y + 168*sin(target.angle + ANG1*20)
					CAM_goto(server.P_BattleStatus[mo.battlen].cam, cx, cy, target.z + FRACUNIT*30, 70*FRACUNIT)
					CAM_angle(server.P_BattleStatus[mo.battlen].cam, R_PointToAngle2(cx, cy, target.x, target.y))
					S_StartSound(mo, sfx_zoom)
				end

				if not mo.reachedtarget
					mo.angle = R_PointToAngle2(mo.x, mo.y, target.x, target.y)
					P_InstaThrust(mo, mo.angle, FRACUNIT*36)
					if R_PointToDist2(mo.x, mo.y, target.x, target.y) < FRACUNIT*36
						ANIM_set(mo, mo.anim_atk, true)
						P_StartQuake(FRACUNIT*8, 4)
						mo.reachedtarget = true
						P_InstaThrust(mo, mo.angle, -FRACUNIT*6)
						mo.momz = 7*FRACUNIT
						playSound(mo.battlen, sfx_phys)
						for i = 1, 2
							createSplat(mo)
						end
					end
				else

					if P_IsObjectOnGround(mo)
					and not mo.momz
					and not mo.damagetime
						mo.damagetime = 1
						mo.momz = FRACUNIT
						P_InstaThrust(mo, mo.angle, FRACUNIT*90)
						S_StartSound(mo, sfx_spin)

					elseif mo.damagetime
						local trail = P_SpawnMobj(mo.x, mo.y, mo.z, MT_DUMMY)
						trail.color = mo.color
						mo.damagetime = $+1
						if mo.damagetime == 2
							damageObject(atarget)
							damageSP(atarget, 10)
							P_StartQuake(FRACUNIT*7, 4)
							playSound(mo.battlen, sfx_phys)
							for i = 1, 2
								createSplat(mo)
							end
						end
						if mo.damagetime == 10
						and atarget ~= mo
							mo.atk_attacker = mo
							damageSP(mo, -10)
							playSound(mo.battlen, sfx_heal)
							fillEmeraldGauge(mo, 20, true)
							playSound(mo.battlen, sfx_buff2)
							local btl = server.P_BattleStatus[mo.battlen]
							btl.r_money = $+10
							BTL_logMessage(targets[1].battlen, "Earned +10 Macca!")
						elseif mo.damagetime == 50
							mo.reachedtarget = nil
							mo.damagetime = nil
							return true
						end
					end
				end
			end,
	critanim = 	function(mo, targets, hittargets, timer)
					local target = targets[1]
					local atarget = hittargets[1]
					if timer == 1
						ANIM_set(mo, mo.anim_run, true)
						mo.reachedtarget = false	-- yeah we can use variables here that you like it or not :^)

						local cx = target.x + 168*cos(target.angle + ANG1*20)
						local cy = target.y + 168*sin(target.angle + ANG1*20)
						CAM_goto(server.P_BattleStatus[mo.battlen].cam, cx, cy, target.z + FRACUNIT*30, 70*FRACUNIT)
						CAM_angle(server.P_BattleStatus[mo.battlen].cam, R_PointToAngle2(cx, cy, target.x, target.y))
						S_StartSound(mo, sfx_zoom)
					end

					if not mo.reachedtarget
						mo.angle = R_PointToAngle2(mo.x, mo.y, target.x, target.y)
						P_InstaThrust(mo, mo.angle, FRACUNIT*36)
						if R_PointToDist2(mo.x, mo.y, target.x, target.y) < FRACUNIT*36
							ANIM_set(mo, mo.anim_atk, true)
							P_StartQuake(FRACUNIT*8, 4)
							mo.reachedtarget = true
							P_InstaThrust(mo, mo.angle, -FRACUNIT*7)
							mo.momz = 8*FRACUNIT
							playSound(mo.battlen, sfx_phys)
							for i = 1, 2
								createSplat(mo)
							end
						end
					else
						if P_IsObjectOnGround(mo)
						and not mo.momz
						and not mo.damagetime
							-- move camera instantly
							local cam = server.P_BattleStatus[mo.battlen].cam

							local cx = mo.x + 128*cos(mo.angle - ANG1*25)
							local cy = mo.y + 128*sin(mo.angle - ANG1*25)
							P_TeleportMove(cam, cx, cy, mo.z + FRACUNIT*16)
							server.P_BattleStatus[mo.battlen].cam.angle = R_PointToAngle2(cam.x, cam.y, mo.x, mo.y)

							-- now make it zoom out a little
							CAM_goto(cam, cam.x-24*cos(cam.angle), cam.y-24*sin(cam.angle), cam.z+FRACUNIT*5, 1*FRACUNIT)

							-- setup sonic
							mo.damagetime = 1
							mo.momx, mo.momy, mo.momz = 0, 0, 0 -- stop momentum, start spindash
							ANIM_set(mo, mo.anim_special1, true)
							S_StartSound(mo, sfx_spndsh)
						elseif mo.damagetime
							mo.damagetime = $+1
							-- rev animation
							if mo.damagetime == 13 or mo.damagetime == 21 or mo.damagetime == 28
								--local revSounds = {sfx_sncsd1, sfx_sncsd2, sfx_sncsd3}

								mo.rev = $ and $+1 or 1
								S_StartSound(mo, sfx_spndsh)
								-- at 3rd rev speed up use the faster spindash anim
								ANIM_set(mo, mo.rev == 3 and mo.anim_special2 or mo.anim_special1, true)
							end
							-- start spindash
							if mo.damagetime >= 35
								if mo.damagetime == 35 -- nyoom
									-- camera
									local cx = target.x + 512*cos(target.angle + ANG1*20)
									local cy = target.y + 512*sin(target.angle + ANG1*20)
									CAM_goto(server.P_BattleStatus[mo.battlen].cam, cx, cy, target.z + FRACUNIT*30, 128*FRACUNIT)
									CAM_angle(server.P_BattleStatus[mo.battlen].cam, R_PointToAngle2(cx, cy, target.x, target.y), ANG1*16)

									-- sonic
									S_StartSound(mo, sfx_zoom)
									P_InstaThrust(mo, mo.angle, FRACUNIT*120)
									ANIM_set(mo, mo.anim_atk, true)
								else
									local trail = P_SpawnMobj(mo.x, mo.y, mo.z, MT_DUMMY)
									trail.color = mo.color
									if mo.damagetime == 36
										damageObject(atarget)
										damageSP(atarget, 20)
										P_SetObjectMomZ(atarget, 5*FRACUNIT)
										P_StartQuake(FRACUNIT*12, 7)
										playSound(mo.battlen, sfx_phys)
										for i = 1, 4
											createSplat(mo)
										end
									end
									if mo.damagetime == 40
									and atarget ~= mo
										mo.atk_attacker = mo
										damageSP(mo, -20)
										playSound(mo.battlen, sfx_heal)
										fillEmeraldGauge(mo, 40, true)
										playSound(mo.battlen, sfx_buff2)
										local btl = server.P_BattleStatus[mo.battlen]
										btl.r_money = $+20
										BTL_logMessage(targets[1].battlen, "Earned +20 Macca!")
									elseif mo.damagetime == 85
										mo.rev = nil
										mo.reachedtarget = nil
										mo.damagetime = nil
										return true
									end
								end
							end
						end
					end
				end,
}

-- Custom Skills
attackDefs["wares 1"] = {
	name = "Morshu's Wares I",
	type = ATK_PASSIVE,
	desc = "A set of tools that \nare essential for \nadventuring.",
	implicit = "lamp oil 1",
}

attackDefs["lamp oil 1"] = {
	name = "Lamp Oil I",
	type = ATK_SUPPORT,
	costtype = CST_SP,
	cost = 5,
	desc = "Lower an enemy's Fire \nresistance to average \nfor 3 turns.",
	target = TGT_ENEMY,
	debuff = true,
	implicit = "rope 1",
	anim = function(mo, targets, hittargets, timer)
		if timer == 1
			playSound(mo.battlen, sfx_lmpoil)
		end
		for i = 1, #hittargets
			local target = hittargets[i]

			local time = timer - (i-1)*6

			if time == 20
				playSound(mo.battlen, sfx_debuff)
				local orb = P_SpawnMobj(target.x, target.y, target.z, MT_DUMMY)
				orb.sprite = SPR_DBUF
				orb.frame = A|TR_TRANS30
				orb.scale = FRACUNIT*2
				orb.scalespeed = FRACUNIT/32
				orb.destscale = FRACUNIT/6
				orb.tics = 2*TICRATE-15
				orb.color = SKINCOLOR_LIME

			elseif time == 5+2*TICRATE
				buffStat(target, ATK_FIRE, -1)	-- negative values lower a stat
				playSound(mo.battlen, sfx_bufu6)
				for i = 1, 64
					local m = P_SpawnMobj(target.x, target.y, target.z, MT_DUMMY)
					m.sprite = SPR_THOK
					m.frame = A
					m.tics = TICRATE
					m.fuse = TICRATE
					m.destscale = 1
					m.color = SKINCOLOR_LIME
					m.flags = MF_NOCLIPTHING|MF_NOCLIPHEIGHT
					m.momx = P_RandomRange(-64, 64)*FRACUNIT
					m.momy = P_RandomRange(-64, 64)*FRACUNIT
					m.momz = P_RandomRange(0, 64)*FRACUNIT
				end
			end
		end

		if timer == TICRATE*3 + (#hittargets-1)
			return true
		end
	end,
}

attackDefs["rope 1"] = {
	name = "Rope I",
	type = ATK_BLESS,
	power = 100,
	accuracy = 25,
	costtype = CST_SP,
	instakill = true,	-- the enemy is instantly killed without its health being displayed
	luckbased = true,	-- use luck instead of agility
	cost = 10,
	desc = "YEET that enemy outta \nthere! (Low chance)",
	target = TGT_ENEMY,
	implicit = "bomb 1",
	norepel = true,
	anim = function(mo, targets, hittargets, timer)
		if timer == 1
			playSound(mo.battlen, sfx_ropitm)
		end
		local target = hittargets[1]

		if timer == 10
			local x = target.x + 48*cos(target.angle)
			local y = target.y + 48*sin(target.angle)
			playSound(mo.battlen, sfx_ropego)
			target.mudo_dum = P_SpawnMobj(x, y, target.z + FRACUNIT*32, MT_DUMMY)
			target.mudo_dum.state = S_INVISIBLE
			target.mudo_dum.tics = -1
			target.mudo_dum.angle = target.angle

		elseif timer == 25

			local m = P_SpawnMobj(target.mudo_dum.x, target.mudo_dum.y, target.z + FRACUNIT*32, MT_DUMMY)
			m.sprite = SPR_ROPE
			m.frame = A|FF_PAPERSPRITE
			m.angle = target.angle + ANG1*90
			m.tics = -1
			m.scale = FRACUNIT*3/2
			target.mudo = m

			m = P_SpawnMobj(target.mudo_dum.x, target.mudo_dum.y, target.z + FRACUNIT*32, MT_DUMMY)
			m.sprite = SPR_ROPE
			m.frame = A|FF_PAPERSPRITE
			m.angle = mo.angle + ANG1*90
			m.destscale = FRACUNIT*8
			m.scalespeed = FRACUNIT/6
			m.tics = 8

			m = P_SpawnMobj(target.mudo_dum.x, target.mudo_dum.y, target.z + FRACUNIT*32, MT_DUMMY)
			m.sprite = SPR_ROPE
			m.frame = B|FF_TRANS30|FF_PAPERSPRITE
			m.angle = mo.angle + ANG1*90
			m.destscale = FRACUNIT*8
			m.scalespeed = FRACUNIT/6
			m.tics = 8

		elseif timer == 50
			target.mudo.destscale = 1
			target.mudo.tics = 20
		elseif timer == 70
			damageObject(target)
			target.mudo = nil
			P_RemoveMobj(target.mudo_dum)
			target.mudo_dum = nil
		elseif timer == 110
			return true
		end
	end,
}

attackDefs["bomb 1"] = {
	name = "Bomb I",
	type = ATK_FIRE,
	power = 140,
	accuracy = 90,
	costtype = CST_SP,
	cost = 20,
	status = COND_BURN,
	statuschance = 10,
	desc = "50 points of fire dmg \nto all enemies. \nMay inflict burn.",
	target = TGT_ALLENEMIES,
	norepel = true,
	anim = function(mo, targets, hittargets, timer)
		if timer == 1
			playSound(mo.battlen, sfx_bmbitm)
		end
		for k,e in ipairs(hittargets)
			local target = e
			local time = timer - 10*(k-1)
			if time == 10
			or time == 14
				local boom = P_SpawnMobj(target.x+P_RandomRange(-20, 20)*FRACUNIT, target.y+P_RandomRange(-20, 20)*FRACUNIT, target.z+P_RandomRange(-20, 20)*FRACUNIT, MT_BOSSEXPLODE)
				boom.scale = FRACUNIT*3
				boom.state = S_QUICKBOOM1
				playSound(mo.battlen, sfx_fire1)
			elseif time == 30
				local boom = P_SpawnMobj(target.x, target.y, target.z+20*FRACUNIT, MT_BOSSEXPLODE)
				boom.scale = FRACUNIT*4
				boom.state = S_PFIRE1
				playSound(mo.battlen, sfx_fire2)
				playSound(mo.battlen, sfx_fire1)
				damageObject(target, 50)

				localquake(mo.battlen, FRACUNIT*32, 8)

				for i = 1, 8
					local smoke = P_SpawnMobj(boom.x, boom.y, boom.z, MT_SMOKE)
					smoke.scale = FRACUNIT*6
					smoke.momx = P_RandomRange(-5, 5)*FRACUNIT
					smoke.momy = P_RandomRange(-5, 5)*FRACUNIT
					smoke.momz = P_RandomRange(3, 6)*FRACUNIT
				end

				local sm = P_SpawnMobj(target.x, target.y, target.z, MT_SMOLDERING)
				sm.fuse = TICRATE/2
				sm.scale = target.scale*3/2
			end
		end

		if timer == 71 + (#targets-1)*10
			return true
		end
	end,
}

attackDefs["wandbreaker"] = {
	name = "Wandbreaker",
	type = ATK_PASSIVE|ATK_FIRE|ATK_ICE|ATK_WIND|ATK_ELEC|ATK_PSY|ATK_NUCLEAR|ATK_BLESS|ATK_CURSE,
	passive = PSV_SWORDBREAKER,
	desc = "25% chance to reduce Magical \ndamage against the party \nby 50% (Excludes Almighty).",
	power = 50,
	accuracy = 25,
	implicit = "slush fund",
}

attackDefs["wares 2"] = {
	name = "Morshu's Wares II",
	type = ATK_PASSIVE,
	desc = "A set of tools that \nare essential for \nadventuring.",
	implicit = "lamp oil 2a",
}

attackDefs["lamp oil 2a"] = {
	name = "Lamp Oil II",
	type = ATK_SUPPORT,
	costtype = CST_SP,
	cost = 5,
	desc = "Lower all enemies's Fire \nresistance to average \nfor 3 turns.",
	target = TGT_ALLENEMIES,
	debuff = true,
	implicit = "rope 2",

	anim = function(mo, targets, hittargets, timer)
		if timer == 1
			playSound(mo.battlen, sfx_lmpoil)
		end
		for i = 1, #hittargets
			local target = hittargets[i]

			local time = timer - (i-1)*6

			if time == 20
				playSound(mo.battlen, sfx_debuff)
				local orb = P_SpawnMobj(target.x, target.y, target.z, MT_DUMMY)
				orb.sprite = SPR_DBUF
				orb.frame = A|TR_TRANS30
				orb.scale = FRACUNIT*2
				orb.scalespeed = FRACUNIT/32
				orb.destscale = FRACUNIT/6
				orb.tics = 2*TICRATE-15
				orb.color = SKINCOLOR_LIME

			elseif time == 5+2*TICRATE
				buffStat(target, ATK_FIRE, -1)	-- negative values lower a stat
				playSound(mo.battlen, sfx_bufu6)
				for i = 1, 64
					local m = P_SpawnMobj(target.x, target.y, target.z, MT_DUMMY)
					m.sprite = SPR_THOK
					m.frame = A
					m.tics = TICRATE
					m.fuse = TICRATE
					m.destscale = 1
					m.color = SKINCOLOR_LIME
					m.flags = MF_NOCLIPTHING|MF_NOCLIPHEIGHT
					m.momx = P_RandomRange(-64, 64)*FRACUNIT
					m.momy = P_RandomRange(-64, 64)*FRACUNIT
					m.momz = P_RandomRange(0, 64)*FRACUNIT
				end
			end
		end

		if timer == TICRATE*3 + (#hittargets-1)
			return true
		end
	end,
}

attackDefs["rope 2"] = {
	name = "Rope II",
	type = ATK_BLESS,
	power = 100,
	accuracy = 50,
	costtype = CST_SP,
	instakill = true,	-- the enemy is instantly killed without its health being displayed
	luckbased = true,	-- use luck instead of agility
	cost = 10,
	desc = "YEET that enemy outta \nthere! (Medium chance)",
	target = TGT_ENEMY,
	implicit = "bomb 2",
	norepel = true,
	anim = function(mo, targets, hittargets, timer)
		if timer == 1
			playSound(mo.battlen, sfx_ropitm)
		end
		local target = hittargets[1]

		if timer == 10
			local x = target.x + 48*cos(target.angle)
			local y = target.y + 48*sin(target.angle)
			playSound(mo.battlen, sfx_ropego)
			target.mudo_dum = P_SpawnMobj(x, y, target.z + FRACUNIT*32, MT_DUMMY)
			target.mudo_dum.state = S_INVISIBLE
			target.mudo_dum.tics = -1
			target.mudo_dum.angle = target.angle

		elseif timer == 25

			local m = P_SpawnMobj(target.mudo_dum.x, target.mudo_dum.y, target.z + FRACUNIT*32, MT_DUMMY)
			m.sprite = SPR_ROPE
			m.frame = A|FF_PAPERSPRITE
			m.angle = target.angle + ANG1*90
			m.tics = -1
			m.scale = FRACUNIT*3/2
			target.mudo = m

			m = P_SpawnMobj(target.mudo_dum.x, target.mudo_dum.y, target.z + FRACUNIT*32, MT_DUMMY)
			m.sprite = SPR_ROPE
			m.frame = A|FF_PAPERSPRITE
			m.angle = mo.angle + ANG1*90
			m.destscale = FRACUNIT*8
			m.scalespeed = FRACUNIT/6
			m.tics = 8

			m = P_SpawnMobj(target.mudo_dum.x, target.mudo_dum.y, target.z + FRACUNIT*32, MT_DUMMY)
			m.sprite = SPR_ROPE
			m.frame = B|FF_TRANS30|FF_PAPERSPRITE
			m.angle = mo.angle + ANG1*90
			m.destscale = FRACUNIT*8
			m.scalespeed = FRACUNIT/6
			m.tics = 8

		elseif timer == 50
			target.mudo.destscale = 1
			target.mudo.tics = 20
		elseif timer == 70
			damageObject(target)
			target.mudo = nil
			P_RemoveMobj(target.mudo_dum)
			target.mudo_dum = nil
		elseif timer == 110
			return true
		end
	end,
}

attackDefs["bomb 2"] = {
	name = "Bomb II",
	type = ATK_FIRE,
	power = 140,
	accuracy = 90,
	costtype = CST_SP,
	cost = 20,
	status = COND_BURN,
	statuschance = 20,
	desc = "100 points of fire dmg \nto all enemies. \nMay inflict burn.",
	target = TGT_ALLENEMIES,
	norepel = true,
	anim = function(mo, targets, hittargets, timer)
		if timer == 1
			playSound(mo.battlen, sfx_bmbitm)
		end
		for k,e in ipairs(hittargets)
			local target = e
			local time = timer - 10*(k-1)
			if time == 10
			or time == 14
				local boom = P_SpawnMobj(target.x+P_RandomRange(-20, 20)*FRACUNIT, target.y+P_RandomRange(-20, 20)*FRACUNIT, target.z+P_RandomRange(-20, 20)*FRACUNIT, MT_BOSSEXPLODE)
				boom.scale = FRACUNIT*3
				boom.state = S_QUICKBOOM1
				playSound(mo.battlen, sfx_fire1)
			elseif time == 30
				local boom = P_SpawnMobj(target.x, target.y, target.z+20*FRACUNIT, MT_BOSSEXPLODE)
				boom.scale = FRACUNIT*4
				boom.state = S_PFIRE1
				playSound(mo.battlen, sfx_fire2)
				playSound(mo.battlen, sfx_fire1)
				damageObject(target, 100)

				localquake(mo.battlen, FRACUNIT*32, 8)

				for i = 1, 8
					local smoke = P_SpawnMobj(boom.x, boom.y, boom.z, MT_SMOKE)
					smoke.scale = FRACUNIT*6
					smoke.momx = P_RandomRange(-5, 5)*FRACUNIT
					smoke.momy = P_RandomRange(-5, 5)*FRACUNIT
					smoke.momz = P_RandomRange(3, 6)*FRACUNIT
				end

				local sm = P_SpawnMobj(target.x, target.y, target.z, MT_SMOLDERING)
				sm.fuse = TICRATE/2
				sm.scale = target.scale*3/2
			end
		end

		if timer == 71 + (#targets-1)*10
			return true
		end
	end,
}

attackDefs["wares 3"] = {
	name = "Morshu's Wares III",
	type = ATK_PASSIVE,
	desc = "A set of tools that \nare essential for \nadventuring.",
	implicit = "lamp oil 2b",
}

attackDefs["lamp oil 2b"] = {
	name = "Lamp Oil II",
	type = ATK_SUPPORT,
	costtype = CST_SP,
	cost = 5,
	desc = "Lower all enemies's Fire \nresistance to average \nfor 3 turns.",
	target = TGT_ALLENEMIES,
	debuff = true,
	implicit = "rope 3a",
	anim = function(mo, targets, hittargets, timer)
		if timer == 1
			playSound(mo.battlen, sfx_lmpoil)
		end
		for i = 1, #hittargets
			local target = hittargets[i]

			local time = timer - (i-1)*6

			if time == 20
				playSound(mo.battlen, sfx_debuff)
				local orb = P_SpawnMobj(target.x, target.y, target.z, MT_DUMMY)
				orb.sprite = SPR_DBUF
				orb.frame = A|TR_TRANS30
				orb.scale = FRACUNIT*2
				orb.scalespeed = FRACUNIT/32
				orb.destscale = FRACUNIT/6
				orb.tics = 2*TICRATE-15
				orb.color = SKINCOLOR_LIME

			elseif time == 5+2*TICRATE
				buffStat(target, ATK_FIRE, -1)	-- negative values lower a stat
				playSound(mo.battlen, sfx_bufu6)
				for i = 1, 64
					local m = P_SpawnMobj(target.x, target.y, target.z, MT_DUMMY)
					m.sprite = SPR_THOK
					m.frame = A
					m.tics = TICRATE
					m.fuse = TICRATE
					m.destscale = 1
					m.color = SKINCOLOR_LIME
					m.flags = MF_NOCLIPTHING|MF_NOCLIPHEIGHT
					m.momx = P_RandomRange(-64, 64)*FRACUNIT
					m.momy = P_RandomRange(-64, 64)*FRACUNIT
					m.momz = P_RandomRange(0, 64)*FRACUNIT
				end
			end
		end

		if timer == TICRATE*3 + (#hittargets-1)
			return true
		end
	end,
}

attackDefs["rope 3a"] = {
	name = "Rope III",
	type = ATK_BLESS,
	power = 100,
	accuracy = 75,
	costtype = CST_SP,
	instakill = true,	-- the enemy is instantly killed without its health being displayed
	luckbased = true,	-- use luck instead of agility
	cost = 10,
	desc = "YEET that enemy outta \nthere! (High chance)",
	target = TGT_ENEMY,
	implicit = "bomb 3a",
	norepel = true,
	anim = function(mo, targets, hittargets, timer)
		if timer == 1
			playSound(mo.battlen, sfx_ropitm)
		end
		local target = hittargets[1]

		if timer == 10
			local x = target.x + 48*cos(target.angle)
			local y = target.y + 48*sin(target.angle)
			playSound(mo.battlen, sfx_ropego)
			target.mudo_dum = P_SpawnMobj(x, y, target.z + FRACUNIT*32, MT_DUMMY)
			target.mudo_dum.state = S_INVISIBLE
			target.mudo_dum.tics = -1
			target.mudo_dum.angle = target.angle

		elseif timer == 25

			local m = P_SpawnMobj(target.mudo_dum.x, target.mudo_dum.y, target.z + FRACUNIT*32, MT_DUMMY)
			m.sprite = SPR_ROPE
			m.frame = A|FF_PAPERSPRITE
			m.angle = target.angle + ANG1*90
			m.tics = -1
			m.scale = FRACUNIT*3/2
			target.mudo = m

			m = P_SpawnMobj(target.mudo_dum.x, target.mudo_dum.y, target.z + FRACUNIT*32, MT_DUMMY)
			m.sprite = SPR_ROPE
			m.frame = A|FF_PAPERSPRITE
			m.angle = mo.angle + ANG1*90
			m.destscale = FRACUNIT*8
			m.scalespeed = FRACUNIT/6
			m.tics = 8

			m = P_SpawnMobj(target.mudo_dum.x, target.mudo_dum.y, target.z + FRACUNIT*32, MT_DUMMY)
			m.sprite = SPR_ROPE
			m.frame = B|FF_TRANS30|FF_PAPERSPRITE
			m.angle = mo.angle + ANG1*90
			m.destscale = FRACUNIT*8
			m.scalespeed = FRACUNIT/6
			m.tics = 8

		elseif timer == 50
			target.mudo.destscale = 1
			target.mudo.tics = 20
		elseif timer == 70
			damageObject(target)
			target.mudo = nil
			P_RemoveMobj(target.mudo_dum)
			target.mudo_dum = nil
		elseif timer == 110
			return true
		end
	end,
}

attackDefs["bomb 3a"] = {
	name = "Bomb III",
	type = ATK_FIRE,
	power = 140,
	accuracy = 90,
	costtype = CST_SP,
	cost = 20,
	status = COND_BURN,
	statuschance = 30,
	desc = "200 points of fire dmg \nto all enemies. \nMay inflict burn.",
	target = TGT_ALLENEMIES,
	norepel = true,
	anim = function(mo, targets, hittargets, timer)
		if timer == 1
			playSound(mo.battlen, sfx_bmbitm)
		end
		for k,e in ipairs(hittargets)
			local target = e
			local time = timer - 10*(k-1)
			if time == 10
			or time == 14
				local boom = P_SpawnMobj(target.x+P_RandomRange(-20, 20)*FRACUNIT, target.y+P_RandomRange(-20, 20)*FRACUNIT, target.z+P_RandomRange(-20, 20)*FRACUNIT, MT_BOSSEXPLODE)
				boom.scale = FRACUNIT*3
				boom.state = S_QUICKBOOM1
				playSound(mo.battlen, sfx_fire1)
			elseif time == 30
				local boom = P_SpawnMobj(target.x, target.y, target.z+20*FRACUNIT, MT_BOSSEXPLODE)
				boom.scale = FRACUNIT*4
				boom.state = S_PFIRE1
				playSound(mo.battlen, sfx_fire2)
				playSound(mo.battlen, sfx_fire1)
				damageObject(target, 200)

				localquake(mo.battlen, FRACUNIT*32, 8)

				for i = 1, 8
					local smoke = P_SpawnMobj(boom.x, boom.y, boom.z, MT_SMOKE)
					smoke.scale = FRACUNIT*6
					smoke.momx = P_RandomRange(-5, 5)*FRACUNIT
					smoke.momy = P_RandomRange(-5, 5)*FRACUNIT
					smoke.momz = P_RandomRange(3, 6)*FRACUNIT
				end

				local sm = P_SpawnMobj(target.x, target.y, target.z, MT_SMOLDERING)
				sm.fuse = TICRATE/2
				sm.scale = target.scale*3/2
			end
		end

		if timer == 71 + (#targets-1)*10
			return true
		end
	end,
}

attackDefs["discount wares"] = {
	name = "Discount Wares",
	type = ATK_PASSIVE,
	desc = "A set of tools that \nare now less costly to \nuse.",
	implicit = "lamp oil 2c",
}

attackDefs["lamp oil 2c"] = {
	name = "Lamp Oil II",
	type = ATK_SUPPORT,
	costtype = CST_SP,
	cost = 1,
	desc = "Lower all enemies's Fire \nresistance to average \nfor 3 turns.",
	target = TGT_ALLENEMIES,
	debuff = true,
	implicit = "rope 3b",
	anim = function(mo, targets, hittargets, timer)
		if timer == 1
			playSound(mo.battlen, sfx_lmpoil)
		end
		for i = 1, #hittargets
			local target = hittargets[i]

			local time = timer - (i-1)*6

			if time == 20
				playSound(mo.battlen, sfx_debuff)
				local orb = P_SpawnMobj(target.x, target.y, target.z, MT_DUMMY)
				orb.sprite = SPR_DBUF
				orb.frame = A|TR_TRANS30
				orb.scale = FRACUNIT*2
				orb.scalespeed = FRACUNIT/32
				orb.destscale = FRACUNIT/6
				orb.tics = 2*TICRATE-15
				orb.color = SKINCOLOR_LIME

			elseif time == 5+2*TICRATE
				buffStat(target, ATK_FIRE, -1)	-- negative values lower a stat
				playSound(mo.battlen, sfx_bufu6)
				for i = 1, 64
					local m = P_SpawnMobj(target.x, target.y, target.z, MT_DUMMY)
					m.sprite = SPR_THOK
					m.frame = A
					m.tics = TICRATE
					m.fuse = TICRATE
					m.destscale = 1
					m.color = SKINCOLOR_LIME
					m.flags = MF_NOCLIPTHING|MF_NOCLIPHEIGHT
					m.momx = P_RandomRange(-64, 64)*FRACUNIT
					m.momy = P_RandomRange(-64, 64)*FRACUNIT
					m.momz = P_RandomRange(0, 64)*FRACUNIT
				end
			end
		end

		if timer == TICRATE*3 + (#hittargets-1)
			return true
		end
	end,
}

attackDefs["rope 3b"] = {
	name = "Rope III",
	type = ATK_BLESS,
	power = 100,
	accuracy = 75,
	costtype = CST_SP,
	instakill = true,	-- the enemy is instantly killed without its health being displayed
	luckbased = true,	-- use luck instead of agility
	cost = 5,
	desc = "YEET that enemy outta \nthere! (High chance)",
	target = TGT_ENEMY,
	implicit = "bomb 3b",
	norepel = true,
	anim = function(mo, targets, hittargets, timer)
		if timer == 1
			playSound(mo.battlen, sfx_ropitm)
		end
		local target = hittargets[1]

		if timer == 10
			local x = target.x + 48*cos(target.angle)
			local y = target.y + 48*sin(target.angle)
			playSound(mo.battlen, sfx_ropego)
			target.mudo_dum = P_SpawnMobj(x, y, target.z + FRACUNIT*32, MT_DUMMY)
			target.mudo_dum.state = S_INVISIBLE
			target.mudo_dum.tics = -1
			target.mudo_dum.angle = target.angle

		elseif timer == 25

			local m = P_SpawnMobj(target.mudo_dum.x, target.mudo_dum.y, target.z + FRACUNIT*32, MT_DUMMY)
			m.sprite = SPR_ROPE
			m.frame = A|FF_PAPERSPRITE
			m.angle = target.angle + ANG1*90
			m.tics = -1
			m.scale = FRACUNIT*3/2
			target.mudo = m

			m = P_SpawnMobj(target.mudo_dum.x, target.mudo_dum.y, target.z + FRACUNIT*32, MT_DUMMY)
			m.sprite = SPR_ROPE
			m.frame = A|FF_PAPERSPRITE
			m.angle = mo.angle + ANG1*90
			m.destscale = FRACUNIT*8
			m.scalespeed = FRACUNIT/6
			m.tics = 8

			m = P_SpawnMobj(target.mudo_dum.x, target.mudo_dum.y, target.z + FRACUNIT*32, MT_DUMMY)
			m.sprite = SPR_ROPE
			m.frame = B|FF_TRANS30|FF_PAPERSPRITE
			m.angle = mo.angle + ANG1*90
			m.destscale = FRACUNIT*8
			m.scalespeed = FRACUNIT/6
			m.tics = 8

		elseif timer == 50
			target.mudo.destscale = 1
			target.mudo.tics = 20
		elseif timer == 70
			damageObject(target)
			target.mudo = nil
			P_RemoveMobj(target.mudo_dum)
			target.mudo_dum = nil
		elseif timer == 110
			return true
		end
	end,
}

attackDefs["bomb 3b"] = {
	name = "Bomb III",
	type = ATK_FIRE,
	power = 140,
	accuracy = 90,
	costtype = CST_SP,
	cost = 10,
	status = COND_BURN,
	statuschance = 30,
	desc = "200 points of fire dmg \nto all enemies. \nMay inflict burn.",
	target = TGT_ALLENEMIES,
	norepel = true,
	anim = function(mo, targets, hittargets, timer)
		if timer == 1
			playSound(mo.battlen, sfx_bmbitm)
		end
		for k,e in ipairs(hittargets)
			local target = e
			local time = timer - 10*(k-1)
			if time == 10
			or time == 14
				local boom = P_SpawnMobj(target.x+P_RandomRange(-20, 20)*FRACUNIT, target.y+P_RandomRange(-20, 20)*FRACUNIT, target.z+P_RandomRange(-20, 20)*FRACUNIT, MT_BOSSEXPLODE)
				boom.scale = FRACUNIT*3
				boom.state = S_QUICKBOOM1
				playSound(mo.battlen, sfx_fire1)
			elseif time == 30
				local boom = P_SpawnMobj(target.x, target.y, target.z+20*FRACUNIT, MT_BOSSEXPLODE)
				boom.scale = FRACUNIT*4
				boom.state = S_PFIRE1
				playSound(mo.battlen, sfx_fire2)
				playSound(mo.battlen, sfx_fire1)
				damageObject(target, 200)

				localquake(mo.battlen, FRACUNIT*32, 8)

				for i = 1, 8
					local smoke = P_SpawnMobj(boom.x, boom.y, boom.z, MT_SMOKE)
					smoke.scale = FRACUNIT*6
					smoke.momx = P_RandomRange(-5, 5)*FRACUNIT
					smoke.momy = P_RandomRange(-5, 5)*FRACUNIT
					smoke.momz = P_RandomRange(3, 6)*FRACUNIT
				end

				local sm = P_SpawnMobj(target.x, target.y, target.z, MT_SMOLDERING)
				sm.fuse = TICRATE/2
				sm.scale = target.scale*3/2
			end
		end

		if timer == 71 + (#targets-1)*10
			return true
		end
	end,
}

attackDefs["doublakarn"] = {
	name = "Doublakarn",
	type = ATK_SUPPORT,
	costtype = CST_SP,
	cost = 32,
	target = TGT_ALLALLIES,
	desc = "Give a barrier that repels \nmagic and physical attacks \nto all allies",
	superbuff = true,
	anim = 	function(mo, targets, hittargets, timer)

				for i = 1, #targets
					local target = hittargets[i]
					local t = timer - (i-1)*6

					if t >= 10 and t <= 40
						if leveltime%2 == 0
							local s = P_SpawnMobj(target.x, target.y, target.z, MT_DUMMY)
							s.sprite = SPR_MAGN
							s.tics = 1
						end
					elseif t == 41
						local thok = P_SpawnMobj(target.x, target.y, target.z+5*FRACUNIT, MT_DUMMY)
						thok.state = S_INVISIBLE
						thok.tics = 1
						A_OldRingExplode(thok, MT_SUPERSPARK)
						playSound(mo.battlen, sfx_mirror)

						BTL_logMessage(targets[1].battlen, target.name.." has\na barrier")

						target.makarakarn = true
						target.tetrakarn = true
					end
				end

				if timer == 60 + (#hittargets-1)*6
					return true
				end

			end,

}

-- Team Attack
attackDefs["slush fund"] = {
	name = "Slush Fund",
	type = ATK_SUPPORT,
	power = 0,
	accuracy = 999,
	statuschance = 999,
	status = COND_FREEZE,
	costtype = CST_SP,
	luckbased = true,	-- use luck instead of agility
	cost = 12,
	desc = "Team Up (Morshu & Spamton). \nInflicts Freeze on all enemies. \nDeploys Agiverse field.",
	target = TGT_ALLENEMIES,
	nocast = function(targets, n)
		local tgt = targets[n]
		local battlen = tgt.battlen
		local skincheck = "metalsonic"
		local checkteam = tgt.enemies
		local found
		if server.metsonecho == 1
			for i = 1, #checkteam do
				if checkteam[i].skin == skincheck
					found = true
					break
				end
			end
		end
		if not found
			BTL_logMessage(battlen, "Spamton's not here!")
			playSound(battlen, sfx_not)
			return true
		end
	end,
	hudfunc = function(v, mo, timer)
		for i = 1, #mo.allies do
			local target = mo.allies[i]
			local firstt = TICRATE - timer
			local t = (TICRATE - (firstt*2))
			local t2 = (t<<FRACBITS)/3
			local t3 = t2
			local scale = t*FRACUNIT/6
			local trflag = V_70TRANS
			if firstt < 15
				trflag = V_90TRANS - (V_10TRANS)
			end
			if scale > 0
			and timer < TICRATE
				v.drawScaled(160<<FRACBITS, 100<<FRACBITS, scale, v.cachePatch("H_1M_B"), trflag)
				v.drawScaled(160<<FRACBITS, 100<<FRACBITS, scale, v.cachePatch("H_1M_C"))
			end
			t3 = FixedMul(t3, t3)
			t3 = $+ FixedMul(t3, t2)
			local pp = v.cachePatch(charStats[mo.skin] and charStats[mo.skin].hudaoa or "")
			if mo.status_condition == COND_SUPER
			and charStats[mo.skin] and charStats[mo.skin].hudsaoa
				pp = v.cachePatch(charStats[mo.skin].hudsaoa)
			end
			if timer <100
				v.drawScaled((150)<<FRACBITS + t3/3, (80)<<FRACBITS +t3/8, FRACUNIT/2, pp, V_SNAPTOLEFT, v.getColormap(TC_DEFAULT, mo.color))
				pp = v.cachePatch(charStats["metalsonic"] and charStats["metalsonic"].hudaoa or "morshu")
				if target.skin == "metalsonic"
					v.drawScaled((150)<<FRACBITS - t3/3, (80)<<FRACBITS -t3/7, FRACUNIT/2, pp, V_SNAPTOLEFT, v.getColormap(TC_DEFAULT, target.color))
				end
				--v.drawScaled((120)<<FRACBITS -t3/3, (70)<<FRACBITS +t3/8, FRACUNIT/2, v.cachePatch("H_FPASSLAME1"), V_SNAPTOLEFT)
				--v.drawScaled((113)<<FRACBITS +t3/3, (83)<<FRACBITS -t3/7, FRACUNIT/2, v.cachePatch("H_FPASSLAME2"), V_SNAPTOLEFT)
			end
		end
	end,
	anim = function(mo, targets, hittargets, timer)
			for i = 1, #mo.allies do
				local target = mo.allies[i]
				if timer == 1
					if target.skin == "metalsonic"
						VFX_Play(target, VFX_AOADO)
					end
				end
			end
			if timer == 1
				mo.fangle = 0
				mo.fdist = 400
				mo.columns = {}
				playSound(mo.battlen, sfx_aoado)
				VFX_Play(target, VFX_AOADO)
			end
			for i = 1, #hittargets
				local target = hittargets[i]

				local t = timer - (i-1)*6

				if t == 10
					playSound(mo.battlen, sfx_absorb)
				end

				if t <= 30
					local thok = P_SpawnMobj(target.x+P_RandomRange(-70, 70)*FRACUNIT, target.y+P_RandomRange(-70, 70)*FRACUNIT, target.z+P_RandomRange(0, 50)*FRACUNIT, MT_DUMMY)
					thok.state = S_CDUST1
					thok.momz = P_RandomRange(3, 10)*FRACUNIT
					thok.color = SKINCOLOR_ICY
					thok.tics = P_RandomRange(10, 35)
					thok.scale = FRACUNIT*3/2
				end

				if t == 20
					damageObject(target)
					startField(target, FLD_AGIVERSE, 4)
				end
			end

			if timer == 42 + (#hittargets-1)*6
				return true
			end
		end,
}

-- Weapons
weaponsList["hands_01"] = {
	name = "Magic Hands",
	type = WPT_PSYGLOVES,
	rarity = 1,
	element = ATK_PIERCE,
	atk = 300,
	desc = "A pair of magician's gloves \nthat somehow ended up in Morshu's \nLost and Found bin.",
	slot = "expel boost",
}

weaponsList["heated hands"] = {
	name = "Heated Hands",
	type = WPT_PSYGLOVES,
	rarity = 3,
	element = ATK_FIRE,
	atk = 900,
	desc = "A pair of magician's gloves \nthat gives more burn for \nfire-based tricks.",
	ma = 1,
	lu = 1,
	slot = "burn boost",
}

weaponsList["luminous hands"] = {
	name = "Luminous Hands",
	type = WPT_PSYGLOVES,
	rarity = 5,
	element = ATK_BLESS,
	atk = 1500,
	desc = "A pair of magician's gloves \nthat shines more brightly when \nthe spotlight is on.",
	ma = 3,
	lu = 3,
	slot = "bless amp",
}

-- Velvet Shop
table.insert(shopList["velvet_shop_mp1"].weapons, {makeWeapon("hands_01", 10), 800, nil, 4})
table.insert(shopList["velvet_shop_mp1"].weapons, {makeWeapon("heated hands"), 4000, 3})
table.insert(shopList["velvet_shop_mp1"].weapons, {makeWeapon("luminous hands"), 12500, 6})

-- Void Shop
table.insert(shopList["void_shop"].weapons, {makeWeapon("hands_01", 10), 700, nil, 6})
table.insert(shopList["void_shop"].weapons, {makeWeapon("heated hands"), 1500, 6, 12})
table.insert(shopList["void_shop"].weapons, {makeWeapon("luminous hands"), 2000, 12})

-- Vision Quest Stuff
enemyList["ganon"] = {
	name = "Ganon",
	skillchance = 100,
	level = 99,
	hp = 9999,
	sp = 9999,
	strength = 1,
	magic = 50,
	endurance = 99,
	agility = 1,
	luck = 50,
	melee_natk = "slash_1",
	thinker = generalEnemyThinker,
	weak = ATK_BLESS,
	resist = ATK_SLASH|ATK_STRIKE|ATK_PIERCE|ATK_FIRE|ATK_ICE|ATK_WIND|ATK_ELEC|ATK_PSY|ATK_NUCLEAR|ATK_ALMIGHTY,
	repel = ATK_CURSE,
	noroguerandom = true,
	noroguebuff = true,
	anim_stand = {SPR_GANO, A, 8},
	anim_hurt = {SPR_GANO, B, 35},
	anim_evoker = {SPR_GANO, C, 8},
	anim_getdown = {SPR_GANO, D, 1},
	anim_downloop = {SPR_GANO, D, 1},
	anim_death = {SPR_GANO, E, 30},
    vfx_skill = {"sfx_ganywd", "sfx_ganymd"},
    vfx_hurt = {"sfx_ganhrt"},
    vfx_hurtx = {"sfx_ganhrt", "sfx_ganwek", "sfx_ganmss", "sfx_gannoo"},
    vfx_die = {"sfx_gandie"},
    vfx_kill = {"sfx_ganpit", "sfx_gankll"},
    vfx_1more = {"sfx_ganpit", "sfx_ganchn"},
    vfx_miss = {"sfx_ganmss"},
    vfx_dodge = {"sfx_gandod"},
	skills = {"mabufudyne", "maziodyne", "maeigaon", "mamudoon", "life leech", "makakaja", "infuriate", "abysmal surge", "evil smile", "makajamon", "poison mist", "freeze boost", "shock boost", "backup trick", "null rage", "null despair", "null hex", "null silence", "null poison"},
}

BTL_challengebtllist[#BTL_challengebtllist+1] = {
	name = "The GREATEST in Koridai",
	description = {"Ganon has invaded Tartarus for some", "reason. Stop him at once...", "or else you will die! (Morshu required)"},
	level = 99,
	music = "BATKAN",
	time = TICRATE*3000,
	items = {{"hypercombiring", 4}, {"soul food", 4}, {"super1up", 4}, {"me patra gem", 4}, {"homunculus", 12}},
	subpersonas = {},
	waves = {
		{"ganon"}
	},
}