freeslot(
"MT_SONIKAZE2",
"S_SONIDLE",
"S_SONIKAZEFINDTARGET",
"S_SONIKAZEDISTCHECK",
"S_SONIKAZEHEIGHTCHECK",
"S_SONITHRUSTDOWN",
"S_SONISCREAM",
"S_RUN1",
"S_RUN2",
"S_RUN3",
"S_RUN4",
"S_RUN5",
"S_RUN6",
"S_RUN7",
"S_RUN8",
"S_DEAD1",
"S_DEAD2",
"SPR_SNKZA1",
"SPR_SWLKA1",
"sfx_scrom",
"sfx_blowe"
)

sfxinfo[sfx_scrom].caption = "Kamikaze Scream"
sfxinfo[sfx_blowe].caption = "Kamikaze Explosion"

local function A_DamagePlayer(actor)
     P_BlackOw(actor.target.player)
	 P_DamageMobj(actor.target, actor, actor, 1, DMG_CANHURTSELF)
	 P_RemoveMobj(actor)
end

local function TouchExplode(special, toucher)
    if toucher.type == MT_PLAYER and toucher.player then
        if not P_PlayerCanDamage(toucher.player, special) then
            P_BlackOw(toucher.player)
            P_DamageMobj(toucher, special, special, 1, DMG_CANHURTSELF)
        end
    end
end

addHook("TouchSpecial", TouchExplode, MT_SONIKAZE2)

addHook("MobjThinker", function(mo)
  if mo
  and mo.valid
    local z = P_FloorzAtPos(mo.x, mo.y, mo.z, mo.scale)
    mo.z = z
  end
end, MT_SONIKAZE2)

mobjinfo[MT_SONIKAZE2] = {
	--$Name SoniKaze
	--$Sprite SNKZA1
	--$Category SCUM3
doomednum = 2222,
spawnstate = S_SONIDLE,
spawnhealth = 1,
seestate = S_SONIKAZEFINDTARGET,
reactiontime = 32,
deathstate = S_DEAD1,
deathsound = sfx_blowe,
painchance = 200,
speed = 30,
radius = 16*FRACUNIT,
height = 32*FRACUNIT,
mass = 100,
damage = 1024*FRACUNIT,
flags = MF_ENEMY|MF_SPECIAL|MF_SHOOTABLE
}

states[S_SONIDLE] = {
sprite = SPR_SNKZ,
frame = 0,
tics = 35,
nextstate = S_SONIKAZEFINDTARGET,
var1 = 0,
var2 = 0
}

states[S_SONIKAZEFINDTARGET] = {
sprite = SPR_SNKZ,
frame = 0,
tics = 0,
action = A_FindTarget,
nextstate = S_SONIKAZEDISTCHECK,
var1 = MT_PLAYER,
var2 = 0
}

states[S_SONIKAZEDISTCHECK] = {
sprite = SPR_SNKZ,
frame = 0,
tics = 1,
action = A_CheckRange,
nextstate = S_SONIKAZEFINDTARGET,
var1 = 1920,
var2 = S_SONIKAZEHEIGHTCHECK
}

states[S_SONIKAZEHEIGHTCHECK] = {
sprite = SPR_SNKZ,
frame = 0,
tics = 1,
action = A_CheckHeight,
nextstate = S_SONIKAZEDISTCHECK,
var1 = 32,
var2 = S_SONITHRUSTDOWN
}

states[S_SONITHRUSTDOWN] = {
sprite = SPR_SWLK,
frame = 0,
tics = 1,
action = A_ZThrust,
nextstate = S_SONISCREAM,
var1 = -4096,
var2 = 1>>16
}

states[S_SONISCREAM] = {
sprite = SPR_SWLK,
frame = 0,
tics = 1,
action = A_PlaySound,
nextstate = S_RUN1,
var1 = sfx_scrom,
var2 = 1<<16
}

states[S_RUN1] = {
sprite = SPR_SWLK,
frame = 0,
tics = 2,
action = A_HomingChase,
nextstate = S_RUN2,
var1 = 30*FRACUNIT,
var2 = 0
}

states[S_RUN2] = {
sprite = SPR_SWLK,
frame = 1,
tics = 2,
action = A_HomingChase,
nextstate = S_RUN3,
var1 = 30*FRACUNIT,
var2 = 0
}

states[S_RUN3] = {
sprite = SPR_SWLK,
frame = 2,
tics = 2,
action = A_HomingChase,
nextstate = S_RUN4,
var1 = 30*FRACUNIT,
var2 = 0
}

states[S_RUN4] = {
sprite = SPR_SWLK,
frame = 3,
tics = 2,
action = A_HomingChase,
nextstate = S_RUN5,
var1 = 30*FRACUNIT,
var2 = 0
}

states[S_RUN5] = {
sprite = SPR_SWLK,
frame = 4,
tics = 2,
action = A_HomingChase,
nextstate = S_RUN6,
var1 = 30*FRACUNIT,
var2 = 0
}

states[S_RUN6] = {
sprite = SPR_SWLK,
frame = 5,
tics = 2,
action = A_HomingChase,
nextstate = S_RUN7,
var1 = 30*FRACUNIT,
var2 = 0
}

states[S_RUN7] = {
sprite = SPR_SWLK,
frame = 6,
tics = 2,
action = A_HomingChase,
nextstate = S_RUN8,
var1 = 30*FRACUNIT,
var2 = 0
}

states[S_RUN8] = {
sprite = SPR_SWLK,
frame = 7,
tics = 2,
action = A_HomingChase,
nextstate = S_SONIKAZEFINDTARGET,
var1 = 30*FRACUNIT,
var2 = 0
}

states[S_DEAD1] = {
sprite = SPR_SNKZ,
frame = 0,
tics = 2,
action = A_Scream,
nextstate = S_DEAD2,
var1 = 0,
var2 = 0
}

states[S_DEAD2] = {
sprite = SPR_SNKZ,
frame = 0,
tics = 2,
action = A_DamagePlayer,
nextstate = S_NULL,
var1 = 0,
var2 = 0
}