mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2024-11-27 02:33:50 +00:00
390 lines
9.2 KiB
Lua
390 lines
9.2 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.n = 0
|
||
|
|
||
|
-- intro animation sequence:
|
||
|
local STATE_INTRO = 1000
|
||
|
local STATE_INTRO2 = 1001
|
||
|
local STATE_INTRO3 = 1002
|
||
|
-- creator is getting ready to sing:
|
||
|
local STATE_SING = 1003
|
||
|
-- creator is singing a song:
|
||
|
local STATE_PLAYSEG = 1004
|
||
|
-- creator is in pain:
|
||
|
local STATE_PAIN = 1005
|
||
|
-- naija sings a wrong note:
|
||
|
local STATE_WRONG = 1006
|
||
|
|
||
|
local STATE_SPAWNSPHERES = 1007
|
||
|
|
||
|
v.delay = 0
|
||
|
|
||
|
v.songNotes = nil
|
||
|
|
||
|
v.songSize = 0
|
||
|
v.curNote = 1
|
||
|
v.noteDelay = 0
|
||
|
v.songLevel = 3
|
||
|
v.waitTime = 5
|
||
|
v.userNote = 1
|
||
|
v.maxHits = 5
|
||
|
v.hits = v.maxHits
|
||
|
-- counts # of successful songs between song levels
|
||
|
v.songsDone = 0
|
||
|
|
||
|
|
||
|
v.setSongSize = 3
|
||
|
|
||
|
v.bone_head = 0
|
||
|
|
||
|
v.died = 0
|
||
|
|
||
|
local function getHitPerc()
|
||
|
return v.hits/v.maxHits
|
||
|
end
|
||
|
|
||
|
function init(me)
|
||
|
v.songNotes = {}
|
||
|
|
||
|
setupEntity(me)
|
||
|
entity_setEntityType(me, ET_ENEMY)
|
||
|
entity_initSkeletal(me, "CreatorForm5")
|
||
|
entity_setAllDamageTargets(me, false)
|
||
|
|
||
|
--entity_generateCollisionMask(me)
|
||
|
|
||
|
entity_setState(me, STATE_INTRO)
|
||
|
entity_alpha(me, 0)
|
||
|
|
||
|
entity_scale(me, 0.5, 0.5)
|
||
|
entity_setCullRadius(me, 1024)
|
||
|
|
||
|
v.bone_head = entity_getBoneByName(me, "Head")
|
||
|
|
||
|
esetv(me, EV_ENTITYDIED, 1)
|
||
|
|
||
|
loadSound("quakeloop1")
|
||
|
loadSound("quakeloop2")
|
||
|
loadSound("quakeloop3")
|
||
|
|
||
|
entity_setDamageTarget(me, DT_AVATAR_PET, false)
|
||
|
|
||
|
loadSound("hellbeast-shot")
|
||
|
end
|
||
|
|
||
|
function entityDied(me)
|
||
|
end
|
||
|
|
||
|
function postInit(me)
|
||
|
v.n = getNaija()
|
||
|
local node = getNode("NAIJA5")
|
||
|
entity_setPosition(v.n, node_x(node), node_y(node), 2, 0, 0, 1)
|
||
|
entity_flipToEntity(v.n, me)
|
||
|
entity_setTarget(me, v.n)
|
||
|
|
||
|
local node = getNode("LIDOOR2")
|
||
|
local door = node_getNearestEntity(node, "FinalDoor")
|
||
|
entity_setState(door, STATE_CLOSED)
|
||
|
|
||
|
musicVolume(1, 1)
|
||
|
playMusic("worship4")
|
||
|
end
|
||
|
|
||
|
|
||
|
local function generateSong(size)
|
||
|
debugLog("generating song")
|
||
|
v.songSize = size
|
||
|
for i=1,size do
|
||
|
v.songNotes[i] = math.random(8)-1
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function update(me, dt)
|
||
|
if entity_isState(me, STATE_IDLE) then
|
||
|
v.delay = v.delay + dt
|
||
|
if v.delay > 2 then
|
||
|
v.delay = 0
|
||
|
entity_setState(me, STATE_SING)
|
||
|
end
|
||
|
elseif entity_isState(me, STATE_WAIT) then
|
||
|
local shots = 0
|
||
|
local e = getFirstEntity()
|
||
|
while e ~= 0 do
|
||
|
if eisv(e, EV_TYPEID, EVT_DARKLISHOT) then
|
||
|
shots = shots + 1
|
||
|
end
|
||
|
e = getNextEntity()
|
||
|
end
|
||
|
if shots == 0 then
|
||
|
entity_setState(me, STATE_IDLE)
|
||
|
end
|
||
|
elseif entity_isState(me, STATE_PLAYSEG) then
|
||
|
v.noteDelay = v.noteDelay + dt
|
||
|
if v.noteDelay > 0.5 - (v.songLevel*0.02) then
|
||
|
debugLog(string.format("singing note: %d", v.songNotes[v.curNote]))
|
||
|
v.noteDelay = 0
|
||
|
|
||
|
local sfx = playSfx(getNoteName(v.songNotes[v.curNote], "low-"))
|
||
|
fadeSfx(sfx, 2)
|
||
|
|
||
|
playSfx("")
|
||
|
|
||
|
local x, y = entity_getPosition(me)
|
||
|
local dx, dy = getNoteVector(v.songNotes[v.curNote], 256)
|
||
|
x = x + dx
|
||
|
y = y + dy
|
||
|
|
||
|
local t = 1
|
||
|
|
||
|
local noteQuad = createQuad(string.format("Song/NoteSymbol%d", v.songNotes[v.curNote]), 6)
|
||
|
quad_alpha(noteQuad, 0)
|
||
|
quad_alpha(noteQuad, 1, 0.1)
|
||
|
quad_scale(noteQuad, 3, 3)
|
||
|
quad_scale(noteQuad, 6, 6, t, 0, 0, 1)
|
||
|
quad_color(noteQuad, getNoteColor(v.songNotes[v.curNote]))
|
||
|
local node = getNode(string.format("SN%d", v.songNotes[v.curNote]))
|
||
|
quad_setPosition(noteQuad, node_x(node), node_y(node))
|
||
|
quad_delete(noteQuad, t)
|
||
|
|
||
|
if v.curNote >= v.songSize then
|
||
|
entity_setState(me, STATE_SPAWNSPHERES, -1)
|
||
|
else
|
||
|
v.curNote = v.curNote + 1
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
overrideZoom(0.5)
|
||
|
end
|
||
|
|
||
|
function msg(me, msg)
|
||
|
if entity_isState(me, STATE_WAIT) then
|
||
|
if msg == "died" then
|
||
|
v.died = v.died + 1
|
||
|
if v.died == 3 then
|
||
|
entity_setState(me, STATE_PAIN)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
v.incut = false
|
||
|
|
||
|
function enterState(me)
|
||
|
if entity_isState(me, STATE_IDLE) then
|
||
|
v.died = 0
|
||
|
entity_animate(me, "idle", -1)
|
||
|
|
||
|
local e = getFirstEntity()
|
||
|
while e ~=0 do
|
||
|
if eisv(e, EV_TYPEID, EVT_DARKLISHOT) then
|
||
|
|
||
|
end
|
||
|
e = getNextEntity()
|
||
|
end
|
||
|
|
||
|
elseif entity_isState(me, STATE_INTRO) then
|
||
|
entity_idle(v.n)
|
||
|
disableInput()
|
||
|
cam_toEntity(me)
|
||
|
|
||
|
entity_alpha(me, 0)
|
||
|
entity_alpha(me, 1, 2)
|
||
|
entity_setStateTime(me, 2)
|
||
|
elseif entity_isState(me, STATE_INTRO2) then
|
||
|
entity_setStateTime(me, entity_animate(me, "jumpOut"))
|
||
|
elseif entity_isState(me, STATE_INTRO3) then
|
||
|
entity_setStateTime(me, entity_animate(me, "land"))
|
||
|
elseif entity_isState(me, STATE_SING) then
|
||
|
-- animate?
|
||
|
entity_setStateTime(me, 0.1)
|
||
|
elseif entity_isState(me, STATE_PLAYSEG) then
|
||
|
v.curNote = 1
|
||
|
generateSong(v.setSongSize)
|
||
|
elseif entity_isState(me, STATE_WAIT) then
|
||
|
v.userNote = 1
|
||
|
elseif entity_isState(me, STATE_PAIN) then
|
||
|
--bone_damageFlash(me, entity_getBoneByIdx(me, 0))
|
||
|
|
||
|
for i=0,50 do
|
||
|
bone_damageFlash(entity_getBoneByIdx(me, i))
|
||
|
end
|
||
|
|
||
|
entity_setStateTime(me, entity_animate(me, "pain"))
|
||
|
elseif entity_isState(me, STATE_WRONG) then
|
||
|
entity_setStateTime(me, entity_animate(me, "wrong"))
|
||
|
elseif entity_isState(me, STATE_ATTACK) then
|
||
|
entity_setStateTime(me, entity_animate(me, "attack"))
|
||
|
for i=1,3 do
|
||
|
local sn = math.random(8)-1
|
||
|
local node = getNode(string.format("SN%d", sn))
|
||
|
createEntity("Mutilus", "", node_x(node), node_y(node))
|
||
|
end
|
||
|
elseif entity_isState(me, STATE_TRANSITION) then
|
||
|
if not v.incut then
|
||
|
entity_setStateTime(me, 99)
|
||
|
v.incut = true
|
||
|
entity_idle(v.n)
|
||
|
cam_toEntity(me)
|
||
|
overrideZoom(0.9)
|
||
|
watch(entity_animate(me, "die"))
|
||
|
watch(3)
|
||
|
overrideZoom(0.8)
|
||
|
shakeCamera(2, 4)
|
||
|
local loop = playSfx("quakeloop1")
|
||
|
watch(4)
|
||
|
overrideZoom(0.7)
|
||
|
shakeCamera(20, 4)
|
||
|
fadeSfx(loop, 0.5)
|
||
|
local loop = playSfx("quakeloop2")
|
||
|
watch(4)
|
||
|
overrideZoom(0.6)
|
||
|
fade2(1, 4, 1, 1, 1)
|
||
|
shakeCamera(100, 4)
|
||
|
fadeSfx(loop, 0.5)
|
||
|
local loop = playSfx("quakeloop3")
|
||
|
watch(4)
|
||
|
entity_setStateTime(me, 0.1)
|
||
|
v.incut = false
|
||
|
fadeSfx(loop, 4)
|
||
|
end
|
||
|
elseif entity_isState(me, STATE_DELAY) then
|
||
|
entity_animate(me, "idle", -1)
|
||
|
elseif entity_isState(me, STATE_SPAWNSPHERES) then
|
||
|
entity_setStateTime(me, entity_animate(me, "attack"))
|
||
|
end
|
||
|
end
|
||
|
|
||
|
v.ic = false
|
||
|
|
||
|
function exitState(me)
|
||
|
if entity_isState(me, STATE_INTRO) then
|
||
|
entity_setState(me, STATE_INTRO2)
|
||
|
elseif entity_isState(me, STATE_SPAWNSPHERES) then
|
||
|
if not v.ic then
|
||
|
v.ic = true
|
||
|
|
||
|
for n=1,v.songSize do
|
||
|
local x, y = entity_getPosition(me)
|
||
|
local dx, dy = getNoteVector(v.songNotes[n], 440)
|
||
|
x = x + dx
|
||
|
y = y + dy
|
||
|
|
||
|
local e = createEntity("dark-li-shot", "", x, y)
|
||
|
entity_msg(e, "note", v.songNotes[n])
|
||
|
entity_msg(e, "sd", n*(1.0-((1.0-getHitPerc())*0.1)))
|
||
|
|
||
|
entity_setMaxSpeedLerp(e, 1.0+((1.0-getHitPerc())*0.5))
|
||
|
|
||
|
--[[
|
||
|
local t = 3- (3-songLevel)*0.5
|
||
|
if t <= 0 then
|
||
|
t = 0.5
|
||
|
end
|
||
|
]]--
|
||
|
--wait(1)
|
||
|
end
|
||
|
|
||
|
entity_setState(me, STATE_WAIT)
|
||
|
|
||
|
v.ic = false
|
||
|
end
|
||
|
elseif entity_isState(me, STATE_INTRO2) then
|
||
|
entity_setState(me, STATE_INTRO3)
|
||
|
elseif entity_isState(me, STATE_INTRO3) then
|
||
|
entity_idle(v.n)
|
||
|
enableInput()
|
||
|
cam_toEntity(v.n)
|
||
|
|
||
|
entity_setState(me, STATE_IDLE)
|
||
|
--[[
|
||
|
elseif entity_isState(me, STATE_WAIT) then
|
||
|
entity_setState(me, STATE_ATTACK)
|
||
|
]]--
|
||
|
elseif entity_isState(me, STATE_TRANSITION) then
|
||
|
-- transition to finalboss02
|
||
|
loadMap("FinalBoss02", "ENTER")
|
||
|
elseif entity_isState(me, STATE_SING) then
|
||
|
entity_setState(me, STATE_PLAYSEG)
|
||
|
elseif entity_isState(me, STATE_PAIN) then
|
||
|
v.songLevel = v.songLevel + 1
|
||
|
v.hits = v.hits - 1
|
||
|
debugLog("test")
|
||
|
if v.hits <= 0 then
|
||
|
entity_setState(me, STATE_TRANSITION)
|
||
|
else
|
||
|
entity_setState(me, STATE_IDLE)
|
||
|
end
|
||
|
elseif entity_isState(me, STATE_WRONG) then
|
||
|
entity_setState(me, STATE_ATTACK)
|
||
|
elseif entity_isState(me, STATE_ATTACK) then
|
||
|
local bx, by = bone_getWorldPosition(v.bone_head)
|
||
|
for i=1,3,1 do
|
||
|
createEntity("Mutilus", "", bx, by)
|
||
|
end
|
||
|
entity_setState(me, STATE_DELAY, 8)
|
||
|
elseif entity_isState(me, STATE_DELAY) then
|
||
|
entity_setState(me, STATE_IDLE)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
function damage(me, attacker, bone, damageType, dmg)
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
function animationKey(me, key)
|
||
|
end
|
||
|
|
||
|
function hitSurface(me)
|
||
|
end
|
||
|
|
||
|
function songNote(me, note)
|
||
|
-- song spheres handle the work now
|
||
|
--[[
|
||
|
if entity_isState(me, STATE_WAIT) then
|
||
|
if note == v.songNotes[v.userNote] then
|
||
|
v.userNote = v.userNote + 1
|
||
|
if v.userNote > v.songSize then
|
||
|
v.songsDone = v.songsDone + 1
|
||
|
if v.songsDone >= 3 then
|
||
|
v.songLevel = v.songLevel + 1
|
||
|
v.songsDone = 0
|
||
|
end
|
||
|
entity_setState(me, STATE_PAIN)
|
||
|
end
|
||
|
else
|
||
|
entity_setState(me, STATE_WRONG)
|
||
|
end
|
||
|
end
|
||
|
]]--
|
||
|
end
|
||
|
|
||
|
function songNoteDone(me, note)
|
||
|
end
|
||
|
|
||
|
function song(me, song)
|
||
|
end
|
||
|
|
||
|
function activate(me)
|
||
|
end
|
||
|
|