1
0
Fork 0
mirror of https://github.com/AquariaOSE/Aquaria.git synced 2024-11-16 14:50:01 +00:00
Aquaria/game_scripts/scripts/entities/cc_sunkencity.lua

677 lines
15 KiB
Lua
Raw Normal View History

-- 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
v.node_start = 0
v.node_climbdown = 0
v.node_runaway = 0
v.node_inhole = 0
v.node_gf = 0
v.node_bullies = 0
v.node_mom = 0
v.node_gotogf = 0
v.node_insectcheck = 0
v.node_anima = 0
v.node_bosswait = 0
v.node_girldoor = 0
v.girldoor = 0
v.bone_flowers = 0
v.mom = 0
v.gf = 0
v.clay = 0
v.leadDelay = 0
v.following = 0
v.spawnedInsects = false
local STATE_CREATE = 1000
v.inAbyss = false
v.glow = 0
v.waitForSceneDelay = 0
v.abyssEndNode = 0
function init(me)
setupEntity(me)
entity_setEntityType(me, ET_NEUTRAL)
entity_initSkeletal(me, "CC")
entity_setAllDamageTargets(me, false)
entity_scale(me, 0.6, 0.6)
--[[
entity_setBlendType(me, BLEND_ADD)
entity_alpha(me, 0.5)
entity_alpha(me, 1, 1, -1, 1, 1)
]]--
entity_setState(me, STATE_IDLE)
v.node_start = getNode("START")
v.node_climbdown = getNode("CLIMBDOWN")
v.node_runaway = getNode("RUNAWAY")
v.node_inhole = getNode("INHOLE")
v.node_gf = getNode("GF")
v.node_bullies = getNode("BULLIES")
v.node_anima = getNode("ANIMA")
v.node_gotogf = getNode("GOTOGF")
v.node_insectcheck = getNode("INSECTCHECK")
v.node_mom = getNode("MOM")
v.node_bosswait = getNode("BOSSWAIT")
--[[
local node_girldoor = getNode("GIRLDOOR")
v.girldoor = node_getNearestEntity(node_girldoor)
entity_setState(v.girldoor, STATE_OPEN, -1, 1)
]]--
entity_setBeautyFlip(me, false)
entity_fh(me)
entity_setCullRadius(me, 256)
v.abyssEndNode = getNode("CCTONGUE")
end
local function updateLocation(me)
debugLog("updateLocation")
local f = getFlag(FLAG_SUNKENCITY_PUZZLE)
if isMapName("BoilerRoom") then
--debugLog("IN BOILER ROOM")
if f < SUNKENCITY_BOSSWAIT then
--debugLog("setting position 0, 0")
entity_setPosition(me, 0, 0)
elseif f == SUNKENCITY_BOSSWAIT then
--debugLog("setting position to bosswait")
entity_setPosition(me, node_getPosition(v.node_bosswait))
elseif f >= SUNKENCITY_BOSSDONE then
entity_setPosition(me, 0, 0)
end
entity_animate(me, "cry", -1)
elseif isMapName("Abyss01") then
if f==SUNKENCITY_BOSSDONE then
if v.glow == 0 then
v.glow = createQuad("Naija/LightFormGlow", 13)
quad_scale(v.glow, 12, 12)
end
--e = entity_getNearestEntity(me, "FinalTongue")
--entity_setState(e, STATE_OPEN)
local nd = getNode("CCLEADSTART")
entity_setPosition(me, node_x(nd), node_y(nd))
entity_animate(me, "float", -1)
entity_flipToEntity(me, v.n)
entity_flipToEntity(v.n, me)
v.leadDelay = 4
v.abyssEndNode = getNode("CCTONGUE")
v.inAbyss = true
v.waitForSceneDelay = 3
else
entity_alpha(me, 0)
entity_setPosition(me, 0, 0)
end
elseif isMapName("SunkenCity01") then
if f==SUNKENCITY_START then
entity_animate(me, "draw", -1)
entity_setPosition(me, node_getPosition(v.node_start))
elseif f==SUNKENCITY_CLIMBDOWN then
entity_setPosition(me, node_getPosition(v.node_climbdown))
entity_fhTo(me, true)
entity_animate(me, "readyToClimb", LOOP_INF)
elseif f==SUNKENCITY_RUNAWAY then
entity_setPosition(me, node_getPosition(v.node_runaway))
entity_animate(me, "cry", -1)
elseif f==SUNKENCITY_INHOLE then
entity_setPosition(me, node_getPosition(v.node_inhole))
entity_animate(me, "cry", -1)
elseif f==SUNKENCITY_GF then
--debugLog("setting gf to state done")
--entity_setState(gf, STATE_DONE)
entity_setPosition(me, node_getPosition(v.node_gf))
entity_animate(me, "cry", -1)
entity_fh(me)
elseif f==SUNKENCITY_BULLIES then
entity_setPosition(me, node_getPosition(v.node_bullies))
entity_animate(me, "cry", -1)
elseif f==SUNKENCITY_ANIMA then
entity_setPosition(me, node_getPosition(v.node_anima))
entity_animate(me, "cry", -1)
elseif f == SUNKENCITY_BOSSWAIT then
entity_setPosition(me, 0, 0)
end
if f >= SUNKENCITY_INHOLE then
if v.mom == 0 then
v.mom = createEntity("CC_Mother", "", node_x(v.node_mom), node_y(v.node_mom))
entity_fh(v.mom)
end
end
if f >= SUNKENCITY_GF then
if v.mom ~= 0 then
entity_setState(v.mom, STATE_SING)
end
end
if f>=SUNKENCITY_BOSSWAIT then
local door = node_getNearestEntity(v.node_anima, "EnergyDoor")
if not entity_isState(door, STATE_OPENED) then
entity_setState(door, STATE_OPENED)
end
if f == SUNKENCITY_BOSSDONE then
debugLog("BOSS DONE!")
entity_setState(me, STATE_FOLLOW, -1, 1)
else
entity_alpha(me, 0.1)
entity_setPosition(me, 0, 0)
end
end
else
if f == SUNKENCITY_BOSSDONE then
debugLog("BOSS DONE!")
entity_setState(me, STATE_FOLLOW, -1, 1)
else
entity_setPosition(me, 0, 0)
end
end
end
function postInit(me)
v.n = getNaija()
v.gf = getEntity("CC_GF")
updateLocation(me)
end
-- Both exist. Different spelling. Yay for consistency.
-- Keeping them both, should ensure behavior as it used to be, just without warnings. -- FG
v.incutscene = false
v.inCutScene = false
local function cutsceneintro(me, node)
v.incutscene = true
entity_idle(v.n)
entity_flipToEntity(v.n, me)
watch(1)
if node ~= 0 then
cam_toNode(node)
watch(1)
end
end
local function cutsceneextro(me)
cam_toEntity(v.n)
v.incutscene = false
end
local function cutscene1(me)
cutsceneintro(me, v.node_start)
cam_toEntity(me)
overrideZoom(1, 3)
watch(3)
entity_fh(me)
--watch(0.5)
entity_followPath(me, v.node_start)
entity_animate(me, "runLow", -1)
--overrideZoom(0.6, 2)
watch(1)
cam_toEntity(getNaija())
while entity_isFollowingPath(me) do watch(FRAME_TIME) end
setFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_CLIMBDOWN)
updateLocation(me)
overrideZoom(0)
cutsceneextro(me)
end
local function cutscene2(me)
cutsceneintro(me, v.node_climbdown)
entity_followPath(me, v.node_climbdown, SPEED_SLOW)
entity_animate(me, "climbDown", -1)
while entity_isFollowingPath(me) do watch(FRAME_TIME) end
setFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_RUNAWAY)
updateLocation(me)
cutsceneextro(me)
end
local function cutscene3(me)
cutsceneintro(me, v.node_runaway)
entity_followPath(me, v.node_runaway)
entity_animate(me, "runLow", -1)
while entity_isFollowingPath(me) do watch(FRAME_TIME) end
setFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_INHOLE)
voiceOnce("Naija_CreatorChildDarkness")
updateLocation(me)
cutsceneextro(me)
end
-- reunited with mom
local function cutscene4(me)
cutsceneintro(me, v.node_mom)
entity_setState(v.mom, STATE_SING)
debugLog("learn anima")
learnSong(SONG_ANIMA)
watch(2)
entity_setPosition(me, node_x(v.node_gotogf), node_y(v.node_gotogf), 1, 0, 0, 1)
while entity_isInterpolating(me) do watch(FRAME_TIME) end
entity_followPath(me, v.node_gotogf)
entity_animate(me, "runLow", -1)
while entity_isFollowingPath(me) do watch(FRAME_TIME) end
setFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_GF)
updateLocation(me)
cutsceneextro(me)
end
local function cutscene5(me)
entity_setState(v.gf, STATE_DONE)
cutsceneintro(me, v.node_gf)
--msg("THEY BREAK UP!!!")
watch(1)
local land = entity_getNearestNode(me, "CCGFLAND")
entity_setPosition(v.gf, node_x(land), node_y(land), 1)
watch(entity_animate(v.gf, "land"))
local bone_flowers = entity_getBoneByName(v.gf, "Flowers")
bone_alpha(bone_flowers, 0, 1)
watch(1)
entity_animate(v.gf, "idle", -1)
watch(0.1)
watch(entity_animate(v.gf, "reach"))
entity_followPath(me, v.node_gf)
entity_animate(me, "runLow", -1)
while entity_isFollowingPath(me) do watch(FRAME_TIME) end
setFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_BULLIES)
updateLocation(me)
cutsceneextro(me)
end
local function cutscene6(me)
cutsceneintro(me, getNode("KIDSCAM"))
watch(1)
local e = getFirstEntity()
while e ~= 0 do
if entity_isName(e, "CC_Kid") then
entity_setState(e, STATE_TRANSFORM)
end
e = getNextEntity()
end
watch(3)
while node_getNumEntitiesIn(v.node_insectcheck, "Scavenger") < 1 do
watch(1)
end
watch(2.5)
--while entity_isFollowingPath(me) do watch(FRAME_TIME) end
updateLocation(me)
cutsceneextro(me)
end
local function cutscene7(me)
entity_setState(v.gf, STATE_DONE)
cutsceneintro(me, v.node_bullies)
watch(1)
entity_followPath(me, v.node_bullies)
entity_animate(me, "runLow", -1)
while entity_isFollowingPath(me) do watch(FRAME_TIME) end
setFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_ANIMA)
updateLocation(me)
cutsceneextro(me)
end
local function cutscene8(me)
cutsceneintro(me, v.node_anima)
watch(1)
local door = entity_getNearestEntity(me, "EnergyDoor")
if door ~= 0 then
entity_setState(door, STATE_OPEN)
end
watch(3)
entity_followPath(me, v.node_anima)
entity_animate(me, "runLow", -1)
while entity_isFollowingPath(me) do watch(FRAME_TIME) end
setFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_BOSSWAIT)
updateLocation(me)
cutsceneextro(me)
end
function update(me, dt)
if v.incutscene then return end
if entity_isState(me, STATE_FOLLOW) then
local xoff = 64
local yoff = 64
if entity_isfh(v.n) then
xoff = -xoff
end
entity_flipToEntity(me, v.n)
entity_setPosition(me, entity_x(v.n)+xoff, entity_y(v.n)+yoff, 0.8)
return
end
if isFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_START) then
--start = getNode("start")
if node_isEntityIn(v.node_start, v.n) then
cutscene1(me)
end
end
if entity_isEntityInRange(me, v.n, 256) then
--if isFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_START) then
--cutscene1(me)
--else
if isFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_CLIMBDOWN) then
cutscene2(me)
elseif isFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_RUNAWAY) then
cutscene3(me)
end
if isFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_BULLIES) and not v.spawnedInsects then
v.spawnedInsects = true
cutscene6(me)
end
end
if isFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_BULLIES) and v.spawnedInsects then
local num = node_getNumEntitiesIn(v.node_insectcheck, "Scavenger")
if num <= 0 then
cutscene7(me)
end
end
if isFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_GF) then
if entity_isEntityInRange(me, v.gf, 200) then
cutscene5(me)
end
end
if isFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_INHOLE) then
if v.following == 0 then
if entity_isEntityInRange(me, v.n, 100) and getForm() == FORM_SUN then
v.following = 1
entity_animate(me, "float", -1)
end
else
if not entity_isEntityInRange(me, v.n, 128) then
local vx, vy = entity_getVectorToEntity(me, v.n)
vx, vy = vector_setLength(vx, vy, 200*dt)
entity_addVel(me, vx, vy)
entity_doCollisionAvoidance(me, dt, 2, 1)
entity_flipToEntity(me, v.n)
else
entity_doFriction(me, dt, 400)
end
entity_updateMovement(me, dt)
if node_isEntityIn(v.node_mom, me) then
cutscene4(me)
else
if not entity_isEntityInRange(me, v.n, 450) then
entity_clearVel(me)
updateLocation(me)
v.following = 0
end
end
end
end
if entity_isState(me, STATE_CREATE) then
entity_setPosition(v.clay, entity_x(me)+32, entity_y(me))
entity_clearVel(v.clay)
else
local f = getFlag(FLAG_SUNKENCITY_PUZZLE)
if f >= SUNKENCITY_BOSSWAIT and f < SUNKENCITY_CLAYDONE then
v.clay = entity_getNearestEntity(me, "Clay")
if v.clay ~= 0 and entity_isEntityInRange(me, v.clay, 128) then
entity_setProperty(v.clay, EP_MOVABLE, false)
entity_clearVel(v.clay)
entity_setPosition(v.clay, entity_x(me)+32, entity_y(me), 1)
entity_setState(me, STATE_CREATE)
setFlag(FLAG_SUNKENCITY_PUZZLE, f+1)
debugLog(string.format("flag is now %d", getFlag(FLAG_SUNKENCITY_PUZZLE)))
end
end
end
if v.glow ~= 0 then
quad_setPosition(v.glow, entity_getPosition(me))
end
--[[
if v.leadDelay > 0 then
if entity_isEntityInRange(me, v.n, 512) then
v.leadDelay = v.leadDelay - dt
if v.leadDelay < 0 then
v.leadDelay = 0
entity_swimToNode(me, v.abyssEndNode)
end
end
end
]]--
if v.inAbyss then
--[[
if entity_isEntityInRange(me, v.n, 512) then
e = entity_getNearestEntity(me, "FinalTongue")
entity_setPosition(me, node_x(v.nd), node_y(v.nd))
v.inAbyss = false
end
]]--
--[[
if entity_isFollowingPath(me) and not entity_isEntityInRange(me, v.n, 1024) then
entity_stopFollowingPath(me)
entity_rotate(me, 0, 1, 0, 0, 1)
--leadDelay = 1
end
]]--
if isFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_BOSSDONE) then
--debugLog("bossdone")
v.n = getNaija()
entity_flipToEntity(me, v.n)
v.waitForSceneDelay = v.waitForSceneDelay - dt
if v.waitForSceneDelay < 0 and not v.inCutScene then
v.inCutScene = true
local e = entity_getNearestEntity(me, "finaltongue")
cam_toEntity(me)
entity_idle(v.n)
entity_flipToEntity(v.n, me)
watch(2)
entity_idle(v.n)
emote(EMOTE_NAIJAUGH)
entity_alpha(me, 0, 2)
fade2(1, 1, 1, 1, 1)
watch(1)
entity_setPosition(me, node_x(v.abyssEndNode), node_y(v.abyssEndNode))
entity_flipToEntity(me, e)
watch(1)
fade2(0, 1, 1, 1, 1)
watch(1)
entity_alpha(me, 1, 2)
watch(2)
entity_setState(e, STATE_OPEN)
cam_toNode(getNode("TongueCam"))
watch(4)
cam_toEntity(me)
watch(1)
fade2(1, 1, 1, 1, 1)
watch(1)
cam_toEntity(v.n)
watch(1)
fade2(0, 1, 1, 1, 1)
watch(1)
setFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_FINALTONGUE)
v.inCutScene = false
end
end
--[[
if not entity_isFollowingPath(me) then
entity_flipToEntity(me, v.n)
if node_isEntityIn(v.abyssEndNode, me) then
if entity_isEntityInRange(me, v.n, 512) then
local e = entity_getNearestEntity(me, "finaltongue")
if e ~= 0 then
entity_setState(e, STATE_OPEN)
end
end
end
end
]]--
end
end
function enterState(me)
if entity_isState(me, STATE_IDLE) then
--entity_animate(me, "float", -1)
elseif entity_isState(me, STATE_CREATE) then
entity_animate(me, "create", -1)
entity_setStateTime(me, 4)
elseif entity_isState(me, STATE_FOLLOW) then
entity_setPosition(me, entity_x(v.n), entity_y(v.n))
entity_animate(me, "float", -1)
end
end
function exitState(me)
if entity_isState(me, STATE_CREATE) then
entity_animate(me, "idle", -1)
entity_delete(v.clay, 0.5)
if isFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_CLAY3) then
setFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_CLAYDONE)
entity_alpha(me, 0, 2)
entity_setPosition(me, 0, 0, 10)
end
local statue = entity_getNearestEntity(me, "ClayStatue")
if statue ~= 0 then
entity_msg(statue, "p")
end
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)
end
function songNoteDone(me, note)
end
function song(me, song)
if song == SONG_ANIMA and isFlag(FLAG_SUNKENCITY_PUZZLE, SUNKENCITY_ANIMA) then
cutscene8(me)
end
end
function activate(me)
end