mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2024-11-16 14:50:01 +00:00
930 lines
24 KiB
Lua
930 lines
24 KiB
Lua
|
-- Copyright (C) 2007, 2010 - Bit-Blot
|
||
|
--
|
||
|
-- This file is part of Aquaria.
|
||
|
--
|
||
|
-- Aquaria is free software; you can redistribute it and/or
|
||
|
-- modify it under the terms of the GNU General Public License
|
||
|
-- as published by the Free Software Foundation; either version 2
|
||
|
-- of the License, or (at your option) any later version.
|
||
|
--
|
||
|
-- This program is distributed in the hope that it will be useful,
|
||
|
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||
|
--
|
||
|
-- See the GNU General Public License for more details.
|
||
|
--
|
||
|
-- You should have received a copy of the GNU General Public License
|
||
|
-- along with this program; if not, write to the Free Software
|
||
|
-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||
|
|
||
|
if not v then v = {} end
|
||
|
if not AQUARIA_VERSION then dofile("scripts/entities/entityinclude.lua") end
|
||
|
|
||
|
v.bone_tongue = 0
|
||
|
v.bone_hand = 0
|
||
|
v.bone_head = 0
|
||
|
v.bone_body = 0
|
||
|
v.bone_upperLeg = 0
|
||
|
v.bone_tongue = 0
|
||
|
v.bone_jaw = 0
|
||
|
v.bone_target = 0
|
||
|
|
||
|
v.naijaPit = 0
|
||
|
|
||
|
v.inHand = false
|
||
|
v.node_right = 0
|
||
|
v.node_left = 0
|
||
|
v.node_hang = 0
|
||
|
v.node_middle = 0
|
||
|
v.node_check = 0
|
||
|
v.node_mermanSpawn = 0
|
||
|
v.node_nostomp = 0
|
||
|
|
||
|
v.handSpin = 0
|
||
|
|
||
|
v.sx = 0
|
||
|
v.sy = 0
|
||
|
|
||
|
v.holding = 0
|
||
|
|
||
|
v.soundDelay = 0
|
||
|
|
||
|
v.skull = false
|
||
|
|
||
|
local STATE_ATTACK1 = 1000
|
||
|
local STATE_ATTACK2 = 1001
|
||
|
local STATE_ATTACK3 = 1002
|
||
|
local STATE_HOLDING = 1003
|
||
|
local STATE_ATTACK4 = 1004
|
||
|
local STATE_ACIDSPRAY = 1005
|
||
|
local STATE_PAIN = 1006
|
||
|
local STATE_DIE = 1007
|
||
|
local STATE_DONE = 1008
|
||
|
local STATE_MOVERIGHT = 1009
|
||
|
local STATE_MOVELEFT = 1010
|
||
|
local STATE_ATTACK5 = 1011
|
||
|
local STATE_TRANSFORM = 1012
|
||
|
local STATE_CREATEMERMAN= 1013
|
||
|
-- yer done!
|
||
|
|
||
|
v.attacksToGo = 3
|
||
|
|
||
|
v.lastAcid = false
|
||
|
|
||
|
v.getHitDelay = 0
|
||
|
|
||
|
-- initial v.attackDelay value set below
|
||
|
v.attackDelay = 0
|
||
|
|
||
|
|
||
|
v.hurtDelay =0
|
||
|
|
||
|
v.hits = 0
|
||
|
v.maxHeadHits = 3
|
||
|
v.headHits = v.maxHeadHits
|
||
|
v.maxHandHits = 6
|
||
|
v.handHits = 0
|
||
|
|
||
|
v.minPullSpd = 100
|
||
|
v.maxPullSpd = 1800
|
||
|
v.pullSpdRate = 1000
|
||
|
|
||
|
v.grabPoint = 0
|
||
|
|
||
|
v.started = false
|
||
|
|
||
|
v.fireDelay = 0
|
||
|
|
||
|
v.n = 0
|
||
|
|
||
|
v.beam = 0
|
||
|
v.canMove = true
|
||
|
|
||
|
v.skullHits = 80
|
||
|
v.lessThan = v.skullHits*0.6
|
||
|
v.finalStage = false
|
||
|
|
||
|
function init(me)
|
||
|
setupBasicEntity(
|
||
|
me,
|
||
|
"", -- texture
|
||
|
90, -- health
|
||
|
1, -- manaballamount
|
||
|
1, -- exp
|
||
|
1, -- money
|
||
|
0, -- collideRadius (only used if hit entities is on)
|
||
|
STATE_IDLE, -- initState
|
||
|
90, -- sprite width
|
||
|
90, -- sprite height
|
||
|
1, -- particle "explosion" type, maps to particleEffects.txt -1 = none
|
||
|
0, -- 0/1 hit other entities off/on (uses collideRadius)
|
||
|
3000, -- updateCull -1: disabled, default: 4000
|
||
|
0
|
||
|
)
|
||
|
|
||
|
entity_initSkeletal(me, "HellBeast")
|
||
|
entity_generateCollisionMask(me)
|
||
|
entity_scale(me, 2.0, 2.0)
|
||
|
|
||
|
--entity_setDamageTarget(me, DT_AVATAR_ENERGYBLAST, false)
|
||
|
entity_setCull(me, false)
|
||
|
|
||
|
--entity_setState(me, STATE_IDLE)
|
||
|
|
||
|
v.bone_tongue = entity_getBoneByName(me, "Tongue")
|
||
|
v.bone_hand = entity_getBoneByName(me, "Hand")
|
||
|
--bone_leftThumb = entity_getBoneByName(me, "LeftThumb")
|
||
|
v.bone_head = entity_getBoneByName(me, "Head")
|
||
|
v.bone_body = entity_getBoneByName(me, "Body")
|
||
|
v.bone_upperLeg = entity_getBoneByName(me, "UpperLeg")
|
||
|
v.bone_tongue = entity_getBoneByName(me, "Tongue")
|
||
|
v.bone_jaw = entity_getBoneByName(me, "Jaw")
|
||
|
|
||
|
v.bone_target = entity_getBoneByName(me, "Target")
|
||
|
|
||
|
bone_setSegs(v.bone_tongue, 2, 12, 0.4, 0.3, -0.02, 0, 8, 0)
|
||
|
|
||
|
v.node_left = entity_getNearestNode(me, "HELLBEAST_LEFT")
|
||
|
v.node_right = entity_getNearestNode(me, "HELLBEAST_RIGHT")
|
||
|
v.node_middle = entity_getNearestNode(me, "HELLBEAST_MIDDLE")
|
||
|
v.node_hang = entity_getNearestNode(me, "HELLBEAST_HANG")
|
||
|
|
||
|
v.node_nostomp = getNode("NOSTOMP")
|
||
|
|
||
|
v.node_check = entity_getNearestNode(me, "HELLBEAST_CHECK")
|
||
|
v.node_mermanSpawn = entity_getNearestNode(me, "MERMAN_SPAWN")
|
||
|
|
||
|
v.grabPoint = entity_getBoneByName(me, "GrabPoint")
|
||
|
bone_alpha(v.grabPoint, 0)
|
||
|
|
||
|
|
||
|
v.naijaPit = getNode("NAIJAPIT")
|
||
|
|
||
|
entity_setState(me, STATE_IDLE)
|
||
|
|
||
|
--entity_setDamageTarget(me, DT_AVATAR_SHOCK, false)
|
||
|
|
||
|
entity_setTargetPriority(me, 2)
|
||
|
entity_setTargetRange(me, 1024)
|
||
|
v.n = getNaija()
|
||
|
|
||
|
v.hits = 3
|
||
|
|
||
|
loadSound("HellBeast-Beam")
|
||
|
loadSound("HellBeast-Die")
|
||
|
loadSound("HellBeast-Idle")
|
||
|
loadSound("HellBeast-Roar")
|
||
|
loadSound("HellBeast-Stomp")
|
||
|
loadSound("HellBeast-Suck")
|
||
|
loadSound("hellbeast-skullhit")
|
||
|
loadSound("merman-bloat-explode")
|
||
|
loadSound("mia-appear")
|
||
|
loadSound("BossDieBig")
|
||
|
loadSound("BossDieSmall")
|
||
|
loadSound("hellbeast-shot")
|
||
|
loadSound("hellbeast-shot-skull")
|
||
|
|
||
|
|
||
|
entity_setDamageTarget(me, DT_AVATAR_PET, false)
|
||
|
end
|
||
|
|
||
|
function postInit(me)
|
||
|
if getFlag(FLAG_BOSS_MITHALA) > 0 then
|
||
|
entity_setState(me, STATE_DONE)
|
||
|
bone_setTexture(v.bone_head, "hellbeast/skull")
|
||
|
bone_setTexture(v.bone_jaw, "hellbeast/skulljaw")
|
||
|
bone_alpha(v.bone_tongue, 0)
|
||
|
entity_animate(me, "done", -1, true)
|
||
|
if entity_isFlag(me, 0) then
|
||
|
voice("naija_song_beastform")
|
||
|
setControlHint(getStringBank(38), 0, 0, 0, 10, "", SONG_BEASTFORM)
|
||
|
entity_setFlag(me, 1)
|
||
|
end
|
||
|
entity_setAllDamageTargets(me, false)
|
||
|
entity_setColor(me, 0.6, 0.2, 0.2)
|
||
|
end
|
||
|
v.sx = entity_x(me)
|
||
|
v.sy = entity_y(me)
|
||
|
|
||
|
-- cache
|
||
|
createEntity("mermanthin", "", -100, -100)
|
||
|
local e = createEntity("mermanthin", "", -100, -100)
|
||
|
entity_setState(e, STATE_BLOATED)
|
||
|
end
|
||
|
|
||
|
function damage(me, attacker, bone, damageType, dmg)
|
||
|
--[[
|
||
|
v.hits = v.hits + 1
|
||
|
if v.hits > 5 then
|
||
|
v.hits = 0
|
||
|
if entity_isState(me, STATE_THREE) then
|
||
|
entity_setState(me, STATE_TWO)
|
||
|
else
|
||
|
entity_setState(me, STATE_THREE)
|
||
|
end
|
||
|
end
|
||
|
return false
|
||
|
]]--
|
||
|
|
||
|
if entity_isState(me, STATE_HOLDING) then
|
||
|
v.handHits = v.handHits - dmg
|
||
|
if v.handHits <= 0 then
|
||
|
-- move to some hurt state instead
|
||
|
v.inHand = false
|
||
|
entity_setState(me, STATE_IDLE)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if v.skull then
|
||
|
if bone == v.bone_head or bone == v.bone_jaw then
|
||
|
debugLog("skull hit")
|
||
|
bone_damageFlash(v.bone_head)
|
||
|
bone_damageFlash(v.bone_jaw)
|
||
|
bone_damageFlash(entity_getBoneByIdx(me, 0))
|
||
|
bone_offset(v.bone_head, 0, 0)
|
||
|
bone_offset(v.bone_head, 20, 0, 0.1, 1, 1)
|
||
|
|
||
|
playSfx("hellbeast-skullhit")
|
||
|
v.skullHits = v.skullHits - dmg
|
||
|
if v.skullHits < v.lessThan and not v.finalStage then
|
||
|
v.finalStage = true
|
||
|
playMusicStraight("mithalapeace")
|
||
|
end
|
||
|
if v.skullHits <= 0 then
|
||
|
entity_setState(me, STATE_DIE)
|
||
|
end
|
||
|
shakeCamera(2, 1)
|
||
|
else
|
||
|
playNoEffect()
|
||
|
end
|
||
|
else
|
||
|
|
||
|
if not (entity_isState(me, STATE_MOVELEFT) or entity_isState(me, STATE_ATTACK4)) then
|
||
|
if (damageType == DT_AVATAR_ENERGYBLAST or damageType == DT_AVATAR_SHOCK) and (bone == v.bone_head or bone == v.bone_jaw or bone == v.bone_tongue) then
|
||
|
v.headHits = v.headHits - dmg
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if not v.skull then
|
||
|
bone_damageFlash(v.bone_head, 1)
|
||
|
bone_damageFlash(v.bone_jaw, 1)
|
||
|
--playNoEffect()
|
||
|
end
|
||
|
|
||
|
entity_heal(me, 999)
|
||
|
|
||
|
|
||
|
-- for debug
|
||
|
--[[
|
||
|
if not entity_isState(me, STATE_DIE) then
|
||
|
entity_setState(me, STATE_DIE)
|
||
|
end
|
||
|
]]--
|
||
|
|
||
|
|
||
|
--bone_damageFlash(bone)
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
function animationKey(me, key)
|
||
|
if entity_isState(me, STATE_PAIN) and key==3 then
|
||
|
shakeCamera(10, 1.5)
|
||
|
end
|
||
|
if ((entity_isState(me, STATE_MOVERIGHT) or entity_isState(me, STATE_MOVELEFT)) and key == 2)
|
||
|
or (entity_isState(me, STATE_ATTACK3) and key == 2)
|
||
|
or ((entity_isState(me, STATE_MOVERIGHT) or entity_isState(me, STATE_MOVELEFT)) and key == 6)
|
||
|
then
|
||
|
playSfx("HellBeast-Stomp")
|
||
|
shakeCamera(30, 0.5)
|
||
|
if not v.skull then
|
||
|
setSceneColor(0.7, 0.7, 0.7)
|
||
|
setSceneColor(1, 1, 1, 0.5)
|
||
|
end
|
||
|
end
|
||
|
if entity_isState(me, STATE_MOVERIGHT) or entity_isState(me, STATE_MOVELEFT) then
|
||
|
if key == 0 or key == 2 or key == 3 or key == 6 or key == 7 then
|
||
|
v.canMove = false
|
||
|
else
|
||
|
v.canMove = true
|
||
|
end
|
||
|
end
|
||
|
if entity_isState(me, STATE_ACIDSPRAY) and key == 3 then
|
||
|
--playSfx("HellBeast-Beam")
|
||
|
local x, y = bone_getPosition(v.bone_tongue)
|
||
|
--v.beam = createBeam(x, y, 90)
|
||
|
end
|
||
|
if entity_isState(me, STATE_CREATEMERMAN) then
|
||
|
v.lastAcid = false
|
||
|
if key == 1 then
|
||
|
local bx, by = bone_getWorldPosition(v.bone_tongue)
|
||
|
spawnParticleEffect("mermanspawn", bx, by)
|
||
|
playSfx("mia-appear")
|
||
|
elseif key == 3 then
|
||
|
local bx, by = bone_getWorldPosition(v.grabPoint)
|
||
|
|
||
|
v.holding = createEntity("mermanthin", "", bx, by)
|
||
|
|
||
|
elseif key == 4 then
|
||
|
v.holding = 0
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function update(me, dt)
|
||
|
if not entity_isState(me, STATE_DONE) and getFlag(FLAG_BOSS_MITHALA) > 0 then
|
||
|
return
|
||
|
end
|
||
|
if not(entity_isState(me, STATE_DONE) or entity_isState(me, STATE_DIE)) then
|
||
|
if entity_isEntityInRange(me, v.n, 2848) then
|
||
|
if not v.started then
|
||
|
emote(EMOTE_NAIJAUGH)
|
||
|
playMusic("Mithala")
|
||
|
playSfx("HellBeast-Roar")
|
||
|
v.started = true
|
||
|
v.attackDelay = -2
|
||
|
local nd = getNode("MERSPAWN")
|
||
|
createEntity("mermanthin", "", node_x(nd), node_y(nd))
|
||
|
end
|
||
|
v.soundDelay = v.soundDelay - dt
|
||
|
if v.soundDelay < 0 then
|
||
|
entity_playSfx(me, "HellBeast-Idle")
|
||
|
v.soundDelay = (math.random(100)/100.0)*1 + 0.5
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
entity_clearTargetPoints(me)
|
||
|
entity_addTargetPoint(me, bone_getWorldPosition(v.bone_head))
|
||
|
entity_addTargetPoint(me, bone_getWorldPosition(v.bone_jaw))
|
||
|
|
||
|
|
||
|
--[[
|
||
|
if isLeftMouse() then
|
||
|
cutscene(me)
|
||
|
end
|
||
|
]]--
|
||
|
--[[
|
||
|
entity_addTargetPoint(me, bone_getWorldPosition(v.bone_body))
|
||
|
entity_addTargetPoint(me, bone_getWorldPosition(v.bone_upperLeg))
|
||
|
]]--
|
||
|
if not entity_isState(me, STATE_DIE) and not entity_isState(me, STATE_DONE) then
|
||
|
overrideZoom(0.3, 1)
|
||
|
|
||
|
--[[
|
||
|
if node_getNumEntitiesIn(v.node_check, "MermanThin")<=0 then
|
||
|
createEntity("MermanThin", "", node_x(v.node_mermanSpawn), node_y(v.node_mermanSpawn))
|
||
|
end
|
||
|
]]--
|
||
|
end
|
||
|
entity_handleShotCollisionsSkeletal(me)
|
||
|
|
||
|
if entity_isState(me, STATE_IDLE) then
|
||
|
if v.headHits <= 0 then
|
||
|
v.headHits = v.maxHeadHits
|
||
|
debugLog("HeadHits exceeded")
|
||
|
|
||
|
if entity_x(me) < node_x(v.node_left)+100 then
|
||
|
if node_getNumEntitiesIn(v.node_check, "MermanThin") > 0 then
|
||
|
entity_setState(me, STATE_ATTACK4, -1, true)
|
||
|
else
|
||
|
entity_setState(me, STATE_MOVERIGHT)
|
||
|
end
|
||
|
else
|
||
|
if node_getNumEntitiesIn(v.node_check, "MermanThin") <= 0 then
|
||
|
entity_setState(me, STATE_MOVERIGHT)
|
||
|
else
|
||
|
entity_setState(me, STATE_MOVELEFT)
|
||
|
end
|
||
|
end
|
||
|
return
|
||
|
end
|
||
|
|
||
|
v.attackDelay = v.attackDelay + dt
|
||
|
if v.attackDelay > 1.8 then
|
||
|
v.attackDelay = (3-v.hits)*0.2
|
||
|
local my_x = entity_x(me)
|
||
|
local my_y = entity_y(me)
|
||
|
|
||
|
if not v.skull then
|
||
|
v.attacksToGo = v.attacksToGo - 1
|
||
|
|
||
|
if node_getNumEntitiesIn(v.node_check, "MermanThin")<=0 then
|
||
|
if v.attacksToGo <= 0 then
|
||
|
v.attacksToGo = v.hits + 3
|
||
|
entity_setState(me, STATE_CREATEMERMAN)
|
||
|
return
|
||
|
end
|
||
|
else
|
||
|
v.attacksToGo = 2
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if node_isEntityIn(v.naijaPit, v.n) then
|
||
|
debugLog("in pit")
|
||
|
if node_isEntityIn(v.node_nostomp, me) then
|
||
|
debugLog("no stomp")
|
||
|
v.lastAcid = false
|
||
|
entity_setState(me, STATE_ATTACK5)
|
||
|
else
|
||
|
debugLog("not no stomp")
|
||
|
if not v.lastAcid then
|
||
|
if chance(50) then
|
||
|
entity_setState(me, STATE_ACIDSPRAY)
|
||
|
v.lastAcid = true
|
||
|
else
|
||
|
v.lastAcid = false
|
||
|
entity_setState(me, STATE_MOVERIGHT)
|
||
|
end
|
||
|
else
|
||
|
v.lastAcid = false
|
||
|
entity_setState(me, STATE_MOVERIGHT)
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
if entity_y(v.n) < my_y+50 and entity_y(v.n) > my_y-200 and entity_x(v.n) < my_x+1024 then
|
||
|
entity_setState(me, STATE_ATTACK2)
|
||
|
elseif entity_y(v.n) >= my_y and entity_x(v.n) < my_x + 750 then
|
||
|
if not node_isEntityIn(v.node_nostomp, me) then
|
||
|
entity_setState(me, STATE_ATTACK3)
|
||
|
else
|
||
|
entity_setState(me, STATE_ATTACK2)
|
||
|
end
|
||
|
elseif entity_y(v.n) < my_y-200 then
|
||
|
if entity_x(v.n) < entity_x(me)+ 300 then
|
||
|
entity_setState(me, STATE_ATTACK1)
|
||
|
else
|
||
|
entity_setState(me, STATE_ACIDSPRAY)
|
||
|
end
|
||
|
--elseif entity_y(v.n) < my_y+800 then
|
||
|
else
|
||
|
|
||
|
if chance(55) then
|
||
|
if my_x < node_x(v.node_right)-100 or v.lastAcid then
|
||
|
v.lastAcid = false
|
||
|
entity_setState(me, STATE_MOVERIGHT)
|
||
|
else
|
||
|
if node_isEntityIn(v.naijaPit, v.n) then
|
||
|
entity_setState(me, STATE_ATTACK5)
|
||
|
v.lastAcid = false
|
||
|
else
|
||
|
v.lastAcid = true
|
||
|
entity_setState(me, STATE_ACIDSPRAY)
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
if not v.lastAcid then
|
||
|
v.lastAcid = true
|
||
|
entity_setState(me, STATE_ACIDSPRAY)
|
||
|
else
|
||
|
entity_setState(me, STATE_MOVERIGHT)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
if entity_isState(me, STATE_ATTACK4) then
|
||
|
v.pullSpd = v.pullSpd + v.pullSpdRate * dt
|
||
|
if v.pullSpd > v.maxPullSpd then
|
||
|
v.pullSpd = v.maxPullSpd
|
||
|
end
|
||
|
local x, y = bone_getWorldPosition(v.bone_tongue)
|
||
|
local radius = 1500
|
||
|
local length = v.pullSpd
|
||
|
entity_pullEntities(me, x, y, radius, length, dt)
|
||
|
|
||
|
if v.getHitDelay > 0 then
|
||
|
v.getHitDelay = v.getHitDelay - dt
|
||
|
else
|
||
|
--ent = entity_getNearestEntity(me, "MermanThin")
|
||
|
local ent = getFirstEntity()
|
||
|
while ent ~= 0 do
|
||
|
if entity_getEntityType(ent)==ET_ENEMY or entity_getEntityType(ent)==ET_AVATAR then
|
||
|
if entity_isPositionInRange(ent, x, y, 180) then
|
||
|
-- chompy
|
||
|
entity_stopPull(ent)
|
||
|
|
||
|
if entity_isState(ent, STATE_BLOATED) then
|
||
|
v.attackDelay = 0
|
||
|
spawnParticleEffect("mermanexplode", entity_x(ent), entity_y(ent))
|
||
|
playSfx("merman-bloat-explode")
|
||
|
entity_delete(ent)
|
||
|
--debugLog(string.format("%s %d", "hits: ", v.hits))
|
||
|
setSceneColor(0.7, 1, 0.5)
|
||
|
setSceneColor(1, 1, 1, 1)
|
||
|
v.hits = v.hits - 1
|
||
|
if v.hits == 1 then
|
||
|
playMusic("mithalaanger")
|
||
|
entity_setColor(me, 1, 0.5, 0.5, 4)
|
||
|
end
|
||
|
v.getHitDelay = 3
|
||
|
if v.hits <= 0 then
|
||
|
--entity_delete(me)
|
||
|
fade2(1, 0, 1, 1, 1)
|
||
|
bone_setTexture(v.bone_head, "hellbeast/skull")
|
||
|
bone_setTexture(v.bone_jaw, "hellbeast/skulljaw")
|
||
|
bone_alpha(v.bone_tongue, 0)
|
||
|
fade2(0, 0.5, 1, 1, 1)
|
||
|
playSfx("mia-appear")
|
||
|
entity_setState(me, STATE_TRANSFORM, -1, true)
|
||
|
return
|
||
|
--entity_setState(me, STATE_DIE)
|
||
|
else
|
||
|
entity_setState(me, STATE_PAIN)
|
||
|
end
|
||
|
bone_damageFlash(v.bone_head)
|
||
|
bone_damageFlash(v.bone_jaw)
|
||
|
bone_damageFlash(v.bone_body)
|
||
|
elseif entity_isName(ent, "mermanthin") then
|
||
|
entity_delete(ent)
|
||
|
else
|
||
|
if entity_getEntityType(ent) == ET_AVATAR then
|
||
|
entity_damage(ent, me, 1)
|
||
|
else
|
||
|
entity_damage(ent, me, 999)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
ent = getNextEntity()
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if entity_isState(me, STATE_ACIDSPRAY) then
|
||
|
if v.beam ~= 0 then
|
||
|
beam_setAngle(v.beam, bone_getWorldRotation(v.bone_tongue)+90)
|
||
|
beam_setPosition(v.beam, bone_getWorldPosition(v.bone_tongue))
|
||
|
end
|
||
|
v.fireDelay = v.fireDelay + dt
|
||
|
local amount = 0.5
|
||
|
if v.skull then
|
||
|
amount = 0.2
|
||
|
end
|
||
|
if v.fireDelay > amount then
|
||
|
v.fireDelay = 0
|
||
|
local x, y = bone_getWorldPosition(v.bone_tongue)
|
||
|
local tx, ty = bone_getWorldPosition(v.bone_target)
|
||
|
local vx = tx - x
|
||
|
local vy = (ty - y)*1.5
|
||
|
if v.skull then
|
||
|
local dx = entity_x(v.n) - x
|
||
|
local dy = entity_y(v.n) - y
|
||
|
vx, vy = vector_normalize(vx, vy)
|
||
|
dx, dy = vector_normalize(dx, dy)
|
||
|
vx = dx
|
||
|
vy = dy
|
||
|
end
|
||
|
if v.skull then
|
||
|
playSfx("hellbeast-shot-skull")
|
||
|
createShot(string.format("hellbeast-skull", 4-v.hits), me, v.n, x, y, vx, vy)
|
||
|
else
|
||
|
playSfx("hellbeast-shot")
|
||
|
createShot(string.format("hellbeast%d", 4-v.hits), me, v.n, x, y, vx, vy)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
--[[
|
||
|
if entity_isState(me, STATE_ACIDSPRAY) then
|
||
|
v.fireDelay = v.fireDelay - dt
|
||
|
if v.fireDelay < 0 then
|
||
|
x,y = bone_getWorldPosition(v.bone_tongue)
|
||
|
entity_setTarget(me, v.n)
|
||
|
entity_fireAtTarget(me, "Purple", 1, 1000, 100, 0, 0, offx, offy, 0, 0, x, y)
|
||
|
v.fireDelay = v.fireDelay + 0.2
|
||
|
end
|
||
|
end
|
||
|
]]--
|
||
|
|
||
|
if v.hurtDelay > 0 then
|
||
|
v.hurtDelay = v.hurtDelay - dt
|
||
|
else
|
||
|
if not v.inHand and
|
||
|
not entity_isState(me, STATE_DONE) and not entity_isState(me, STATE_DIE)
|
||
|
then
|
||
|
local bone = entity_collideSkeletalVsCircle(me, v.n)
|
||
|
if bone ~= 0 then
|
||
|
if not entity_isState(me, STATE_IDLE) then
|
||
|
if bone == v.bone_hand then
|
||
|
if (entity_isState(me, STATE_ATTACK2) or entity_isState(me, STATE_ATTACK5)) then
|
||
|
v.inHand = true
|
||
|
avatar_fallOffWall()
|
||
|
entity_setState(me, STATE_HOLDING)
|
||
|
entity_animate(v.n, "trapped", -1, LAYER_OVERRIDE)
|
||
|
v.handSpin = 4
|
||
|
return
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
if entity_isState(me, STATE_ATTACK4) then
|
||
|
entity_setState(me, STATE_IDLE)
|
||
|
end
|
||
|
if not v.inHand then
|
||
|
if not entity_isState(me, STATE_PAIN) and not entity_isState(me, STATE_DIE) and not entity_isState(me, STATE_CREATEMERMAN)
|
||
|
and not entity_isState(me, STATE_TRANSFORM) then
|
||
|
entity_damage(v.n, me, 1)
|
||
|
end
|
||
|
entity_push(v.n, 1200, 0, 0)
|
||
|
end
|
||
|
end
|
||
|
if entity_x(v.n) < entity_x(me) then
|
||
|
entity_setPosition(v.n, entity_x(me) + 1, entity_y(v.n))
|
||
|
if entity_velx(v.n) < 0 then
|
||
|
local vx = entity_velx(v.n)
|
||
|
local vy = entity_vely(v.n)
|
||
|
if vx < 0 then
|
||
|
vx = -vx
|
||
|
end
|
||
|
entity_clearVel(v.n)
|
||
|
entity_addVel(v.n, vx, vy)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
--[[
|
||
|
if entity_isState(me, STATE_TWO) then
|
||
|
x,y = bone_getWorldPosition(v.bone_tongue)
|
||
|
entity_velTowards(getNaija(), x, y, 1200*dt, 1000)
|
||
|
end
|
||
|
]]--
|
||
|
|
||
|
if v.inHand then
|
||
|
--debugLog(string.format("%s %d", "handHits: ", v.handHits))
|
||
|
entity_setPosition(v.n, bone_getWorldPosition(v.grabPoint))
|
||
|
entity_rotate(v.n, bone_getWorldRotation(v.grabPoint))
|
||
|
entity_flipToEntity(v.n, me)
|
||
|
v.hurtDelay = 1
|
||
|
|
||
|
if avatar_isRolling() then
|
||
|
v.handSpin = v.handSpin - dt
|
||
|
|
||
|
if v.handSpin < 0 then
|
||
|
v.handSpin = 0
|
||
|
v.inHand = false
|
||
|
entity_setState(me, STATE_IDLE)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if entity_isState(me, STATE_IDLE) then
|
||
|
v.inHand = false
|
||
|
entity_idle(v.n)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if v.holding ~= 0 then
|
||
|
entity_setPosition(v.holding, bone_getWorldPosition(v.grabPoint))
|
||
|
entity_rotate(v.n, bone_getWorldRotation(v.grabPoint))
|
||
|
end
|
||
|
|
||
|
local moveSpd = 500
|
||
|
if v.canMove then
|
||
|
if entity_isState(me, STATE_MOVERIGHT) then
|
||
|
entity_setPosition(me, entity_x(me)+moveSpd*dt, entity_y(me))
|
||
|
end
|
||
|
if entity_isState(me, STATE_MOVELEFT) then
|
||
|
entity_setPosition(me, entity_x(me)-moveSpd*1.3*dt, entity_y(me))
|
||
|
end
|
||
|
end
|
||
|
if entity_isState(me, STATE_ATTACK1) or entity_isState(me, STATE_ATTACK2) or entity_isState(me, STATE_ATTACK3) or entity_isState(me, STATE_HOLDING) or entity_isState(me, STATE_ATTACK4) or entity_isState(me, STATE_ACIDSPRAY) or entity_isState(me, STATE_PAIN) then
|
||
|
if not entity_isAnimating(me) then
|
||
|
if entity_isState(me, STATE_PAIN) then
|
||
|
v.lastAcid = true
|
||
|
entity_setState(me, STATE_ACIDSPRAY)
|
||
|
--entity_setState(me, STATE_MOVERIGHT)
|
||
|
v.attackDelay = -1
|
||
|
else
|
||
|
entity_setState(me, STATE_IDLE)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
if entity_isState(me, STATE_DIE) and not entity_isAnimating(me) then
|
||
|
entity_setState(me, STATE_DONE)
|
||
|
end
|
||
|
|
||
|
if entity_isState(me, STATE_MOVERIGHT) and entity_x(me) > node_x(v.node_right) then
|
||
|
entity_setState(me, STATE_IDLE)
|
||
|
end
|
||
|
|
||
|
if entity_isState(me, STATE_MOVELEFT) and entity_x(me) < node_x(v.node_left) then
|
||
|
entity_setState(me, STATE_IDLE)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
v.inCutScene = false
|
||
|
local function cutscene(me)
|
||
|
v.n = getNaija()
|
||
|
if not v.inCutScene then
|
||
|
v.inCutScene = true
|
||
|
|
||
|
|
||
|
setCameraLerpDelay(1)
|
||
|
|
||
|
local pn = getNode("NAIJADONE")
|
||
|
setFlag(FLAG_BOSS_MITHALA, 1)
|
||
|
local ent = getFirstEntity()
|
||
|
while ent ~= 0 do
|
||
|
if entity_isName(ent, "MermanThin") then
|
||
|
entity_setDieTimer(ent, 0.1)
|
||
|
end
|
||
|
ent = getNextEntity()
|
||
|
end
|
||
|
changeForm(FORM_NORMAL)
|
||
|
|
||
|
|
||
|
setSceneColor(0.5, 0.1, 0.1, 1)
|
||
|
entity_idle(v.n)
|
||
|
entity_flipToEntity(v.n, me)
|
||
|
fade2(1, 1, 1, 0, 0)
|
||
|
watch(1)
|
||
|
|
||
|
cam_toNode(getNode("WATCHDIE"))
|
||
|
|
||
|
entity_setPosition(me, v.sx, v.sy)
|
||
|
entity_setPosition(v.n, node_x(pn), node_y(pn))
|
||
|
playMusicOnce("mithalaend")
|
||
|
|
||
|
entity_animate(me, "pain", -1)
|
||
|
|
||
|
fade2(0, 1.5, 1, 0, 0)
|
||
|
watch(2)
|
||
|
playSfx("HellBeast-Die")
|
||
|
shakeCamera(100, 3)
|
||
|
entity_animate(me, "die")
|
||
|
watch(3)
|
||
|
playSfx("BossDieSmall")
|
||
|
fade(1, 0.2, 1, 1, 1)
|
||
|
watch(0.2)
|
||
|
fade(0, 0.5, 1, 1, 1)
|
||
|
watch(0.5)
|
||
|
playSfx("BossDieSmall")
|
||
|
fade(1, 0.2, 1, 1, 1)
|
||
|
watch(0.2)
|
||
|
fade(0, 0.5, 1, 1, 1)
|
||
|
watch(0.5)
|
||
|
entity_color(me, 0.5, 0.5, 0.5, 1.5)
|
||
|
entity_offset(me, 0, 0)
|
||
|
entity_offset(me, 5, 0, 0.05, -1, 1)
|
||
|
playSfx("BossDieSmall")
|
||
|
--playSfx("BossDieBig")
|
||
|
fade(1, 1, 1, 1, 1)
|
||
|
watch(1.2)
|
||
|
fade(0, 0.5, 1, 1, 1)
|
||
|
entity_offset(me, 0, 0, 0.1)
|
||
|
|
||
|
entity_heal(v.n, 1)
|
||
|
entity_idle(v.n)
|
||
|
entity_flipToEntity(v.n, me)
|
||
|
watch(5)
|
||
|
--debugLog("playing agony")
|
||
|
|
||
|
entity_idle(v.n)
|
||
|
emote(EMOTE_NAIJASADSIGH)
|
||
|
|
||
|
cam_toEntity(v.n)
|
||
|
--entity_setPosition(v.n, node_x(pn), node_y(pn), 2, 0, 0, 1)
|
||
|
|
||
|
--cam_toNode(getNode("WATCHDIE"))
|
||
|
setSceneColor(1, 1, 1, 6)
|
||
|
watch(2)
|
||
|
--entity_setPosition(v.n, node_x(pn), node_y(pn), 2, 0, 0, 1)
|
||
|
overrideZoom(0.8, 5)
|
||
|
fade2(1,5,1,1,1)
|
||
|
watch(2)
|
||
|
cam_toEntity(v.n)
|
||
|
entity_animate(v.n, "agony", -1)
|
||
|
watch(4)
|
||
|
--[[
|
||
|
fade2(1, 1, 1, 1, 1)
|
||
|
watch(1)
|
||
|
]]--
|
||
|
setCameraLerpDelay(0)
|
||
|
loadMap("MithalasVision")
|
||
|
|
||
|
--[[
|
||
|
fade(0,0.5,1,1,1)
|
||
|
fade2(0,0.5,1,1,1)
|
||
|
entity_animate(v.n, "agony", LOOP_INF)
|
||
|
|
||
|
showImage("Visions/Mithalas/00")
|
||
|
watch(0.5)
|
||
|
voice("naija_vision_mithalas")
|
||
|
watchForVoice()
|
||
|
hideImage()
|
||
|
learnSong(SONG_BEASTFORM)
|
||
|
watch(1)
|
||
|
entity_idle(v.n)
|
||
|
changeForm(FORM_BEAST)
|
||
|
entity_addVel(v.n, 0, -100)
|
||
|
entity_animate(v.n, "beast", 4)
|
||
|
while entity_isAnimating(v.n) do
|
||
|
watch(FRAME_TIME)
|
||
|
end
|
||
|
voice("naija_song_beastform")
|
||
|
|
||
|
setControlHint(getStringBank(38), 0, 0, 0, 10, "", SONG_BEASTFORM)
|
||
|
|
||
|
overrideZoom(0)
|
||
|
entity_idle(v.n)
|
||
|
|
||
|
setCameraLerpDelay(0)
|
||
|
]]--
|
||
|
--watchForVoice()
|
||
|
-- show help text
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function enterState(me, state)
|
||
|
if entity_isState(me, STATE_IDLE) then
|
||
|
entity_animate(me, "idle", LOOP_INF)
|
||
|
elseif entity_isState(me, STATE_TRANSFORM) then
|
||
|
v.skull = true
|
||
|
entity_setStateTime(me, entity_animate(me, "transform"))
|
||
|
setSceneColor(1, 0.5, 0.5, 2)
|
||
|
v.attackDelay = -1
|
||
|
elseif entity_isState(me, STATE_ATTACK1) then
|
||
|
entity_animate(me, "attack1")
|
||
|
elseif entity_isState(me, STATE_ATTACK2) then
|
||
|
entity_animate(me, "attack2")
|
||
|
elseif entity_isState(me, STATE_ATTACK3) then
|
||
|
entity_animate(me, "attack3")
|
||
|
elseif entity_isState(me, STATE_ATTACK4) then
|
||
|
if v.skull then
|
||
|
entity_setState(me, STATE_IDLE)
|
||
|
else
|
||
|
playSfx("HellBeast-Suck")
|
||
|
v.pullSpd = v.minPullSpd
|
||
|
entity_animate(me, "attack4")
|
||
|
end
|
||
|
elseif entity_isState(me, STATE_ATTACK5) then
|
||
|
entity_setStateTime(me, entity_animate(me, "attack5"))
|
||
|
elseif entity_isState(me, STATE_ACIDSPRAY) then
|
||
|
if v.skull then
|
||
|
local bx, by = bone_getWorldPosition(v.bone_tongue)
|
||
|
spawnParticleEffect("mermanspawn", bx, by)
|
||
|
end
|
||
|
entity_animate(me, "acidSpray")
|
||
|
v.fireDelay = -1.5
|
||
|
elseif entity_isState(me, STATE_PAIN) then
|
||
|
playSfx("HellBeast-Roar")
|
||
|
entity_animate(me, "pain")
|
||
|
elseif entity_isState(me, STATE_HOLDING) then
|
||
|
entity_animate(me, "holding")
|
||
|
v.handHits = v.maxHandHits
|
||
|
elseif entity_isState(me, STATE_DIE) then
|
||
|
|
||
|
cutscene(me)
|
||
|
elseif entity_isState(me, STATE_DONE) then
|
||
|
debugLog("DONE")
|
||
|
overrideZoom(0)
|
||
|
elseif entity_isState(me, STATE_MOVERIGHT) then
|
||
|
v.lastAcid = false
|
||
|
entity_animate(me, "move", -1)
|
||
|
--entity_setPosition(me, entity_x(me)+800, entity_y(me), 3)
|
||
|
entity_setStateTime(me, 3)
|
||
|
elseif entity_isState(me, STATE_MOVELEFT) then
|
||
|
v.attackDelay = v.attackDelay - 1
|
||
|
if v.attackDelay < -1 then
|
||
|
v.attackDelay = -1
|
||
|
end
|
||
|
|
||
|
entity_animate(me, "move", -1)
|
||
|
--entity_setPosition(me, entity_x(me)-800, entity_y(me), 3)
|
||
|
entity_setStateTime(me, 3)
|
||
|
elseif entity_isState(me, STATE_CREATEMERMAN) then
|
||
|
entity_setStateTime(me, entity_animate(me, "create"))
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function exitState(me, state)
|
||
|
if entity_isState(me, STATE_HOLDING) then
|
||
|
if v.inHand then
|
||
|
entity_damage(v.n, me, 1.5, DT_ENEMY)
|
||
|
end
|
||
|
v.inHand = false
|
||
|
entity_idle(v.n)
|
||
|
v.hurtDelay = 2
|
||
|
elseif entity_isState(me, STATE_MOVERIGHT) or entity_isState(me, STATE_MOVELEFT) then
|
||
|
playSfx("HellBeast-Stomp")
|
||
|
shakeCamera(10, 1)
|
||
|
entity_setState(me, STATE_IDLE)
|
||
|
elseif entity_isState(me, STATE_ATTACK4) then
|
||
|
elseif entity_isState(me, STATE_ATTACK5) then
|
||
|
v.attackDelay = -4
|
||
|
entity_setState(me, STATE_IDLE)
|
||
|
elseif entity_isState(me, STATE_ACIDSPRAY) then
|
||
|
if v.beam ~= 0 then
|
||
|
beam_delete(v.beam)
|
||
|
v.beam = 0
|
||
|
end
|
||
|
elseif entity_isState(me, STATE_TRANSFORM) then
|
||
|
entity_setState(me, STATE_ACIDSPRAY)
|
||
|
elseif entity_isState(me, STATE_CREATEMERMAN) then
|
||
|
entity_setState(me, STATE_IDLE)
|
||
|
end
|
||
|
end
|