mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2025-10-19 04:49:28 +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
500
game_scripts/scripts/entities/sunworm.lua
Normal file
500
game_scripts/scripts/entities/sunworm.lua
Normal file
|
@ -0,0 +1,500 @@
|
|||
-- 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
|
||||
|
||||
|
||||
-- entity specific
|
||||
local STATE_SUCK = 1001
|
||||
local STATE_BLOW = 1002
|
||||
|
||||
v.started = false
|
||||
v.chaseDelay = 0
|
||||
v.suckDelay = 0
|
||||
v.full = false
|
||||
v.wasUnderWater = false
|
||||
v.outOfWaterSpeed = 1000
|
||||
v.n = 0
|
||||
v.door = 0
|
||||
v.enter = 0
|
||||
v.maxy = 0
|
||||
|
||||
v.biteDelay = 0
|
||||
v.gruntDelay = 0
|
||||
|
||||
v.suckTime = 6 --3
|
||||
v.blowTime = 4 --2
|
||||
|
||||
v.fireDelayTime = 0.9
|
||||
v.fireDelay = 4
|
||||
|
||||
v.mainHealth = 280
|
||||
v.rageHealth = 200
|
||||
-- NOTE: rage health is not a separate bar, its just a marker of where rage starts
|
||||
|
||||
|
||||
-- stuff.
|
||||
--[[
|
||||
v.mainHealth = 380
|
||||
v.rageHealth = 200
|
||||
]]--
|
||||
|
||||
|
||||
v.waterLevelMin = 0
|
||||
v.waterLevelMax = 0
|
||||
|
||||
v.a = 0
|
||||
|
||||
v.rage = false
|
||||
|
||||
function init(me)
|
||||
--140
|
||||
setupBasicEntity(me,
|
||||
"", -- texture
|
||||
v.mainHealth, -- health
|
||||
1, -- manaballamount
|
||||
2, -- exp
|
||||
1, -- money
|
||||
32, -- collideRadius (only used if hit entities is on)
|
||||
STATE_IDLE, -- initState
|
||||
256, -- sprite width
|
||||
256, -- sprite height
|
||||
0, -- particle "explosion" type, maps to particleEffects.txt -1 = none
|
||||
0, -- 0/1 hit other entities off/on (uses collideRadius)
|
||||
5000 -- updateCull -1: disabled, default: 4000
|
||||
)
|
||||
|
||||
entity_flipVertical(me) -- fix the head orientation
|
||||
|
||||
if entity_isFlag(me, 0) then
|
||||
entity_initSegments(me,
|
||||
5, -- num segments
|
||||
32, -- minDist
|
||||
64, -- maxDist
|
||||
"SunWorm/Body1", -- body tex
|
||||
"SunWorm/Body5", -- tail tex
|
||||
256, -- width
|
||||
256, -- height
|
||||
0, -- taper
|
||||
0 -- reverse segment direction
|
||||
)
|
||||
|
||||
entity_setSegmentTexture(me, 1, "SunWorm/Body2")
|
||||
entity_setSegmentTexture(me, 2, "SunWorm/Body3")
|
||||
entity_setSegmentTexture(me, 3, "SunWorm/Body4")
|
||||
entity_initSkeletal(me, "SunWorm")
|
||||
entity_animate(me, "idle", LOOP_INF)
|
||||
end
|
||||
|
||||
entity_setCanLeaveWater(me, true)
|
||||
|
||||
v.wasUnderWater = entity_isUnderWater(me)
|
||||
|
||||
entity_setTargetRange(me, 1024)
|
||||
entity_setDeathScene(me, true)
|
||||
|
||||
loadSound("waterlevelchange")
|
||||
loadSound("sunworm-bite")
|
||||
loadSound("sunworm-grunt")
|
||||
loadSound("sunworm-roar")
|
||||
loadSound("BossDieSmall")
|
||||
loadSound("BossDieBig")
|
||||
loadSound("hellbeast-shot-skull")
|
||||
--entity_flipVertical(me)
|
||||
|
||||
esetv(me, EV_WEBSLOW, 80)
|
||||
end
|
||||
|
||||
function postInit(me)
|
||||
v.n = getNaija()
|
||||
|
||||
v.enter = getNode("NAIJAENTER")
|
||||
v.door = entity_getNearestEntity(me, "EnergyDoor")
|
||||
entity_setState(v.door, STATE_OPENED)
|
||||
if not entity_isFlag(me, 0) then
|
||||
entity_alpha(me, 0)
|
||||
entity_delete(me)
|
||||
else
|
||||
--setCanWarp(false)
|
||||
end
|
||||
|
||||
local node = getNode("SUNWORMMAX")
|
||||
v.maxy = node_y(node)
|
||||
|
||||
v.waterLevelMin = getNode("sunwormwaterlevelmin")
|
||||
v.waterLevelMax = getNode("sunwormwaterlevelmax")
|
||||
|
||||
if entity_isFlag(me, 1) then
|
||||
setControlHint(getStringBank(41), 0, 0, 0, 10, "", SONG_SUNFORM)
|
||||
voice("Naija_Song_SunForm")
|
||||
entity_setFlag(me, 2)
|
||||
end
|
||||
end
|
||||
|
||||
function update(me, dt)
|
||||
local odt = dt
|
||||
if v.rage then
|
||||
dt = dt * 1.3
|
||||
end
|
||||
if v.started then
|
||||
if entity_isUnderWater(me) ~= v.wasUnderWater and not entity_isState(me, STATE_SUCK) then
|
||||
v.wasUnderWater = entity_isUnderWater(me)
|
||||
spawnParticleEffect("Splash", entity_x(me), entity_y(me))
|
||||
if not entity_isUnderWater(me) then
|
||||
--//entity_setMaxSpeed(me, v.outOfWaterSpeed)
|
||||
entity_setMaxSpeedLerp(me, 2, 0.1)
|
||||
entity_addVel(me, 0, -800)
|
||||
else
|
||||
entity_setMaxSpeedLerp(me, 1, 0.8)
|
||||
end
|
||||
end
|
||||
entity_handleShotCollisions(me)
|
||||
if entity_hasTarget(me) then
|
||||
if entity_isTargetInRange(me, 138) then
|
||||
if avatar_isOnWall() then
|
||||
shakeCamera(2, 2)
|
||||
avatar_fallOffWall()
|
||||
end
|
||||
end
|
||||
if entity_isTargetInRange(me, 96) then
|
||||
entity_hurtTarget(me, 1)
|
||||
entity_pushTarget(me, 400)
|
||||
avatar_fallOffWall()
|
||||
end
|
||||
end
|
||||
if v.chaseDelay > 0 then
|
||||
v.chaseDelay = v.chaseDelay - dt
|
||||
if v.chaseDelay < 0 then
|
||||
v.chaseDelay = 0
|
||||
end
|
||||
end
|
||||
end
|
||||
if entity_isState(me, STATE_IDLE) then
|
||||
v.biteDelay = v.biteDelay + dt
|
||||
if v.biteDelay > 0.6 then
|
||||
local dist = entity_getDistanceToEntity(me, v.n)
|
||||
dist = 1 - (dist / 1024)
|
||||
if dist < 0.01 then dist = 0.01 end
|
||||
if dist > 1 then dist = 1 end
|
||||
playSfx("sunworm-bite", 0, dist)
|
||||
v.biteDelay = 0
|
||||
end
|
||||
|
||||
v.gruntDelay = v.gruntDelay + dt
|
||||
if v.gruntDelay > 2 then
|
||||
local dist = entity_getDistanceToEntity(me, v.n)
|
||||
dist = 1 - (dist / 1024)
|
||||
if dist < 0.01 then dist = 0.01 end
|
||||
if dist > 1 then dist = 1 end
|
||||
playSfx("sunworm-grunt", 0, dist)
|
||||
spawnParticleEffect("bubble-release", entity_x(me), entity_y(me))
|
||||
v.gruntDelay = 0
|
||||
end
|
||||
end
|
||||
if entity_getState(me)==STATE_IDLE or entity_isState(me, STATE_BLOW) then
|
||||
if not v.started then
|
||||
if not entity_hasTarget(me) then
|
||||
--entity_findTarget(me, 2000)
|
||||
--if not v.started then
|
||||
if node_isEntityIn(v.enter, v.n) then
|
||||
v.started = true
|
||||
playSfx("sunworm-roar")
|
||||
shakeCamera(10, 2)
|
||||
entity_setTarget(me, v.n)
|
||||
entity_setState(v.door, STATE_CLOSE)
|
||||
playMusic("bigboss")
|
||||
emote(EMOTE_NAIJAUGH)
|
||||
end
|
||||
end
|
||||
else
|
||||
|
||||
overrideZoom(0.3, 1)
|
||||
--if v.chaseDelay==0 then
|
||||
if not entity_isUnderWater(me) then
|
||||
entity_setMaxSpeed(me, v.outOfWaterSpeed)
|
||||
entity_addVel(me, -2000*dt)
|
||||
end
|
||||
if entity_isUnderWater(me) then
|
||||
if entity_isState(me, STATE_IDLE) then
|
||||
entity_setMaxSpeed(me, 400)
|
||||
entity_moveTowardsTarget(me, dt, 1000)
|
||||
--[[
|
||||
|
||||
if not entity_isTargetInRange(me, 512) then
|
||||
entity_moveTowardsTarget(me, dt, 1000)
|
||||
elseif not entity_isTargetInRange(me, 128) then
|
||||
if entity_x(entity_getTarget(me)) > entity_x(me) then
|
||||
entity_addVel(me, 1000*dt, 0)
|
||||
else
|
||||
entity_addVel(me, -1000*dt, 0)
|
||||
end
|
||||
end
|
||||
]]--
|
||||
--[[
|
||||
if entity_isTargetInRange(me, 1000) then
|
||||
entity_setMaxSpeed(me, 380)
|
||||
entity_moveTowardsTarget(me, dt, 1000)
|
||||
else
|
||||
entity_setMaxSpeed(me, 200)
|
||||
end
|
||||
]]--
|
||||
end
|
||||
entity_doEntityAvoidance(me, dt, 200, 0.1)
|
||||
if entity_getHealth(me) < 4 then
|
||||
entity_doSpellAvoidance(me, dt, 64, 0.5);
|
||||
end
|
||||
|
||||
end
|
||||
--entity_moveTowardsTarget(me, dt, 100)
|
||||
|
||||
--end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
if entity_isUnderWater(me) then
|
||||
entity_doCollisionAvoidance(me, dt, 5, 1)
|
||||
else
|
||||
entity_doCollisionAvoidance(me, dt, 20, 0.2)
|
||||
end
|
||||
entity_updateMovement(me, dt)
|
||||
entity_rotateToVel(me, 0.1)
|
||||
|
||||
if v.started then
|
||||
if v.rage then
|
||||
local mult = 1
|
||||
if entity_getHealth(me) < 75 then
|
||||
mult = 1.5
|
||||
elseif entity_getHealth(me) < 50 then
|
||||
mult = 2.0
|
||||
elseif entity_getHealth(me) < 35 then
|
||||
mult = 10
|
||||
elseif entity_getHealth(me) < 20 then
|
||||
mult = 20
|
||||
end
|
||||
v.fireDelay = v.fireDelay - dt * mult
|
||||
|
||||
if v.fireDelay < 0 then
|
||||
v.fireDelay = 0
|
||||
v.fireDelay = v.fireDelayTime
|
||||
|
||||
local s = createShot("sunworm", me, v.n)
|
||||
shot_setAimVector(s, math.sin(v.a), math.cos(v.a))
|
||||
v.a = v.a + 3.14*0.25
|
||||
end
|
||||
end
|
||||
|
||||
if entity_isState(me, STATE_SUCK) then
|
||||
if not entity_isUnderWater(me) then
|
||||
--entity_setState(me, STATE_IDLE)
|
||||
entity_setPosition(me, entity_x(me), getWaterLevel() + entity_getCollideRadius(me) + 1)
|
||||
entity_addVel(me, 0, 10)
|
||||
else
|
||||
setWaterLevel(getWaterLevel() + 100*dt)
|
||||
if (entity_y(me) - entity_getCollideRadius(me) < getWaterLevel()) then
|
||||
entity_setPosition(me, entity_x(me), getWaterLevel() + entity_getCollideRadius(me) + 1)
|
||||
entity_addVel(me, 0, 10)
|
||||
end
|
||||
if getWaterLevel() > node_y(v.waterLevelMax) then
|
||||
setWaterLevel(node_y(v.waterLevelMax))
|
||||
end
|
||||
entity_pullEntities(me, entity_x(me), entity_y(me), 2000, 1600, odt) -- 1700
|
||||
end
|
||||
end
|
||||
if entity_isState(me, STATE_BLOW) then
|
||||
if not entity_isUnderWater(me) then
|
||||
entity_setPosition(me, entity_x(me), getWaterLevel()+2)
|
||||
entity_addVel(me, 0, 10)
|
||||
end
|
||||
setWaterLevel(getWaterLevel() - 120*dt)
|
||||
if getWaterLevel() < node_y(v.waterLevelMin) then
|
||||
setWaterLevel(node_y(v.waterLevelMin))
|
||||
end
|
||||
|
||||
entity_pullEntities(me, entity_x(me), entity_y(me), 2000, -1600, odt) -- 1700
|
||||
end
|
||||
|
||||
if not entity_isUnderWater(me) then
|
||||
|
||||
else
|
||||
if entity_isState(me, STATE_IDLE) and not v.full and entity_isUnderWater(me) then
|
||||
v.suckDelay = v.suckDelay + dt
|
||||
if v.suckDelay > 8 then
|
||||
v.suckDelay = 0
|
||||
entity_setState(me, STATE_SUCK, v.suckTime)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
if v.full then
|
||||
v.suckDelay = v.suckDelay + dt
|
||||
if v.suckDelay > 10 then
|
||||
if entity_isUnderWater(me) then
|
||||
v.suckDelay = 0
|
||||
entity_setState(me, STATE_BLOW, v.blowTime)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if entity_y(me) < v.maxy then
|
||||
entity_setPosition(me, entity_x(me), v.maxy)
|
||||
local vx = entity_velx(me)
|
||||
local vy = entity_vely(me)
|
||||
if vy < 0 then
|
||||
vy = -vy
|
||||
end
|
||||
entity_clearVel(me)
|
||||
entity_addVel(me, vx, vy)
|
||||
end
|
||||
end
|
||||
|
||||
v.inCutScene = false
|
||||
function enterState(me)
|
||||
if entity_getState(me)==STATE_IDLE then
|
||||
entity_setCanLeaveWater(me, true)
|
||||
entity_animate(me, "idle", LOOP_INF)
|
||||
elseif entity_isState(me, STATE_BLOW) then
|
||||
playSfx("waterlevelchange")
|
||||
entity_animate(me, "blow", LOOP_INF)
|
||||
avatar_fallOffWall()
|
||||
elseif entity_isState(me, STATE_SUCK) then
|
||||
entity_setCanLeaveWater(me, false)
|
||||
playSfx("waterlevelchange")
|
||||
entity_animate(me, "suck", LOOP_INF)
|
||||
avatar_fallOffWall()
|
||||
elseif entity_isState(me, STATE_DEATHSCENE) then
|
||||
if not v.inCutScene then
|
||||
v.inCutScene = true
|
||||
|
||||
entity_setStateTime(me, 99)
|
||||
|
||||
entity_offset(me, -10, 0)
|
||||
entity_offset(me, 10, 0, 0.01, -1, 1)
|
||||
|
||||
shakeCamera(20, 5)
|
||||
|
||||
cam_toEntity(me)
|
||||
|
||||
for i=1,5 do
|
||||
playSfx("BossDieSmall")
|
||||
fade(1, 0.2, 1, 1, 1)
|
||||
watch(0.2)
|
||||
fade(0, 0.2, 1, 1, 1)
|
||||
watch(0.2)
|
||||
end
|
||||
playSfx("sunworm-roar")
|
||||
watch(0.7)
|
||||
|
||||
playSfx("BossDieSmall")
|
||||
fade(1, 0.2, 1, 1, 1)
|
||||
watch(0.2)
|
||||
fade(0, 0.5, 1, 1, 1)
|
||||
watch(0.5)
|
||||
playSfx("BossDieBig")
|
||||
playSfx("sunworm-roar")
|
||||
entity_offset(me, -20, 0)
|
||||
entity_offset(me, 20, 0, 0.01, -1, 1)
|
||||
fade(1, 1, 1, 1, 1)
|
||||
watch(1.2)
|
||||
entity_alpha(me, 0, 1)
|
||||
entity_setPosition(me, 0, 0)
|
||||
fade(0, 0.5, 1, 1, 1)
|
||||
|
||||
setSceneColor(1, 1, 1, 3)
|
||||
|
||||
cam_toEntity(getNaija())
|
||||
|
||||
fadeOutMusic(8)
|
||||
if not isForm(FORM_NORMAL) then
|
||||
changeForm(FORM_NORMAL)
|
||||
end
|
||||
entity_setState(v.door, STATE_OPEN)
|
||||
-- this'll get set by SUNWORMCAVEBRAIN:
|
||||
--setWaterLevel(node_y(getNode("ENDWATERLEVEL")), 3)
|
||||
setFlag(FLAG_BOSS_SUNWORM, 1)
|
||||
entity_setFlag(me, 1)
|
||||
|
||||
|
||||
entity_idle(v.n)
|
||||
watch(2)
|
||||
pickupGem("Boss-SunWorm")
|
||||
entity_idle(v.n)
|
||||
overrideZoom(1, 3)
|
||||
watch(3)
|
||||
emote(EMOTE_NAIJAUGH)
|
||||
entity_animate(v.n, "agony", -1)
|
||||
watch(3)
|
||||
fade2(1, 1, 1, 1, 1)
|
||||
watch(1)
|
||||
entity_setFlag(me, 1)
|
||||
loadMap("SunVision")
|
||||
--[[
|
||||
showImage("Visions/Veil/00")
|
||||
voice("Naija_Vision_SunTemple")
|
||||
watchForVoice()
|
||||
hideImage()
|
||||
learnSong(SONG_SUNFORM)
|
||||
watch(1)
|
||||
entity_idle(v.n)
|
||||
changeForm(FORM_SUN)
|
||||
voice("Naija_Song_SunForm")
|
||||
v.inCutScene = true
|
||||
]]--
|
||||
v.inCutScene = false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function exitState(me)
|
||||
if entity_isState(me, STATE_SUCK) then
|
||||
v.full = true
|
||||
entity_setState(me, STATE_IDLE)
|
||||
elseif entity_isState(me, STATE_BLOW) then
|
||||
v.full = false
|
||||
entity_setState(me, STATE_IDLE)
|
||||
end
|
||||
end
|
||||
|
||||
function damage(me, attacker, bone, damageType, dmg)
|
||||
if v.started and entity_getHealth(me) < v.rageHealth and not v.rage then
|
||||
v.rage = true
|
||||
--entity_setColor(me, 1, 0.5, 0.6, 1)
|
||||
playSfx("sunworm-roar")
|
||||
shakeCamera(10, 3)
|
||||
fade2(1, 0, 1, 1, 1)
|
||||
fade2(0, 1, 1, 1, 1)
|
||||
setSceneColor(1, 0.6, 0.7, 4)
|
||||
playMusic("sunworm")
|
||||
|
||||
local node = getNode("boss2ndwaterlevel")
|
||||
setWaterLevel(node_y(node), 0.1)
|
||||
end
|
||||
if damageType == DT_AVATAR_VINE then
|
||||
entity_changeHealth(me, -0.5)
|
||||
end
|
||||
if v.rage == true and damageType == DT_AVATAR_LIZAP then
|
||||
return false
|
||||
end
|
||||
return v.started
|
||||
end
|
||||
|
||||
function hitSurface(me)
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue