// Two kingdoms ruled over The Earth:
//
//     HUMANS    and    MONSTERS

freeslot("S_D94XKZ_FALLEN", "S_D94XKZ_SUPERFALLEN")

states[S_D94XKZ_FALLEN] = {
	sprite = SPR_PLAY,
	frame = SPR2_DEAD|A,
	tics = 5,
	nextstate = S_D94XKZ_FALLEN
}

states[S_D94XKZ_SUPERFALLEN] = {
	sprite = SPR_PLAY,
	frame = SPR2_FALL|A,
	tics = 20,
	nextstate = S_PLAY_STND
}

addHook("PlayerThink", function(player)
	if player.mo and player.mo.valid
		if player.playerstate != PST_DEAD
		and not P_IsObjectOnGround(player.mo)
		and not (player.pflags & PF_THOKKED)
		and not player.xkzspinhold
			player.d94xkznogroundedmomz = player.mo.momz
		elseif player.xkzspinhold
		or player.pflags & PF_THOKKED
			player.d94xkznogroundedmomz = 0
		end
		if (player.mo.skin == "dark" or player.mo.skin == "xkz")
		and not (mapheaderinfo[gamemap].typeoflevel & TOL_NIGHTS)
		and not (mapheaderinfo[gamemap].typeoflevel & TOL_XMAS)
			if (player.d94xkznogroundedmomz and (player.d94xkznogroundedmomz < -30*player.mo.scale and P_MobjFlip(player.mo) == 1))
			or (player.d94xkznogroundedmomz and (player.d94xkznogroundedmomz > 30*player.mo.scale and P_MobjFlip(player.mo) == -1))
				if player.playerstate != PST_DEAD
				and not P_PlayerInPain(player)
					if P_IsObjectOnGround(player.mo)
						if not (player.mo.eflags & MFE_UNDERWATER)
							if player.powers[pw_super]
								player.mo.state = S_D94XKZ_SUPERFALLEN
								player.powers[pw_nocontrol] = 20
								for i = 1, 6 do
									local d94xkzfallrock = P_SpawnMobjFromMobj(player.mo, 0, 0, 0, MT_FALLINGROCK)
									d94xkzfallrock.momz = 15*player.mo.scale*P_MobjFlip(player.mo)
									d94xkzfallrock.angle = player.drawangle+ANG60-(ANG60*i)
									d94xkzfallrock.scale = player.mo.scale
									d94xkzfallrock.flags = $|MF_NOCLIPTHING
									P_InstaThrust(d94xkzfallrock, d94xkzfallrock.angle, 10*player.mo.scale)
								end
							else
								player.mo.state = S_D94XKZ_FALLEN
								for i = 1, 6 do
									local d94xkzfallrock = P_SpawnMobjFromMobj(player.mo, 0, 0, 0, MT_FALLINGROCK)
									d94xkzfallrock.fuse = 70
									d94xkzfallrock.momz = 5*player.mo.scale*P_MobjFlip(player.mo)
									d94xkzfallrock.angle = player.drawangle+ANG60-(ANG60*i)
									d94xkzfallrock.scale = player.mo.scale/2
									d94xkzfallrock.flags = $|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOCLIPTHING
									P_InstaThrust(d94xkzfallrock, d94xkzfallrock.angle, 5*player.mo.scale)
								end
								if player.rings > 0
									S_StartSound(player.mo, sfx_antiri, player)
									player.rings = $-1
									local d94xkzfallring = P_SpawnMobjFromMobj(player.mo, 0, 0, 0, MT_FLINGRING)
									d94xkzfallring.fuse = 35
									d94xkzfallring.momz = 10*player.mo.scale*P_MobjFlip(player.mo)
									d94xkzfallring.angle = P_RandomRange(0, 90)*P_RandomRange(0, 4)*ANG1
									d94xkzfallring.scale = player.mo.scale
									d94xkzfallring.flags = $|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOCLIPTHING & ~MF_SPECIAL
									P_InstaThrust(d94xkzfallring, d94xkzfallring.angle, 5*player.mo.scale)
								end
							end
							player.mo.momx = 0
							player.mo.momy = 0
							player.mo.momz = 0
							S_StartSound(player.mo, sfx_crumbl)
							P_StartQuake(10*FRACUNIT, 10)
							for i = 1, 6 do
								local d94xkzfallspark = P_SpawnMobjFromMobj(player.mo, 0, 0, 0, MT_SUPERSPARK)
								d94xkzfallspark.momz = 10*player.mo.scale*P_MobjFlip(player.mo)
								d94xkzfallspark.angle = player.drawangle+ANG60-(ANG60*i)
								d94xkzfallspark.scale = player.mo.scale*2
								P_InstaThrust(d94xkzfallspark, d94xkzfallspark.angle, 20*player.mo.scale)
							end
							player.d94xkznogroundedmomz = 0
							player.mo.rollangle = 0
						else
							player.d94xkznogroundedmomz = 0
							player.mo.rollangle = 0
						end
					else
						if player.powers[pw_super]
							player.mo.state = S_PLAY_FALL
							player.mo.rollangle = 0
						else
							player.mo.state = S_PLAY_DRWN
							player.mo.rollangle = -player.mo.momz
						end
					end
				else
					player.d94xkznogroundedmomz = 0
				end
			end
			if player.mo.state == S_D94XKZ_FALLEN
				player.mo.rollangle = ANGLE_180
				player.d94xkzfallen = true
				player.mo.flags = $|MF_NOCLIPTHING
				player.mo.flags2 = $|MF2_DONTDRAW
				if player.speed
					player.pflags = $|PF_FULLSTASIS
				else
					player.pflags = $|PF_STASIS
				end
				if S_SoundPlaying(player.mo, sfx_crumbl)
					local d94xkzground = P_SpawnMobjFromMobj(player.mo, 0, 0, 0, MT_MINUSDIRT)
					d94xkzground.flags = $|MF_NOGRAVITY
					if P_MobjFlip(player.mo) == -1
						d94xkzground.z = player.mo.z+player.mo.height
					end
					if P_MobjFlip(player.mo) == -1
						d94xkzground.eflags = $|MFE_VERTICALFLIP
					elseif P_MobjFlip(player.mo) == 1
						d94xkzground.eflags = $ & ~MFE_VERTICALFLIP
					end
					d94xkzground.dispoffset = 2
				end
			else
				if player.d94xkzfallen
					player.mo.flags = $ & ~MF_NOCLIPTHING
					player.mo.flags2 = $ & ~MF2_DONTDRAW
					player.pflags = $ & ~PF_FULLSTASIS
					player.pflags = $ & ~PF_STASIS
					player.mo.rollangle = 0
					player.d94xkzfallen = false
				end
			end
		end
	end
end)