mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2025-10-10 08:23:22 +00:00
initial commit. This is icculus version 5542b94cae02a6333845854bbbd1abe0a259f1a4
This commit is contained in:
commit
3096eaf5e2
2519 changed files with 816064 additions and 0 deletions
929
game_scripts/scripts/entities/hellbeast.lua
Normal file
929
game_scripts/scripts/entities/hellbeast.lua
Normal file
|
@ -0,0 +1,929 @@
|
|||
-- 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
|
Loading…
Add table
Add a link
Reference in a new issue