mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2024-11-25 17:53:47 +00:00
1340 lines
33 KiB
Lua
1340 lines
33 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
|
|
|
|
-- ================================================================================================
|
|
-- Merman / Thin
|
|
-- ================================================================================================
|
|
|
|
v.honeyPower = 0
|
|
|
|
v.swimTime = 0
|
|
v.swimTimer = v.swimTime - v.swimTime/4
|
|
v.dirTimer = 0
|
|
v.dir = 0
|
|
|
|
v.gvel = false
|
|
|
|
v.forcedHug = false
|
|
|
|
v.incut = false
|
|
|
|
v.seen = false
|
|
v.inVeil01 = false
|
|
|
|
v.bone_helmet = 0
|
|
v.bone_head = 0
|
|
v.bone_fish1 = 0
|
|
v.bone_fish2 = 0
|
|
v.bone_hand = 0
|
|
v.bone_arm = 0
|
|
v.bone_weaponGlow = 0
|
|
v.bone_leftHand = 0
|
|
|
|
v.bone_llarm = 0
|
|
v.bone_ularm = 0
|
|
|
|
v.switchGiggle = false
|
|
|
|
v.pathDelay = 0
|
|
|
|
v.naijaOut = -25
|
|
v.hugOut = 0
|
|
v.curNote = -1
|
|
|
|
v.followDelay = 0
|
|
|
|
v.chaseTime = 0
|
|
v.expressionTimer = 0
|
|
|
|
local STATE_HANG = 1000
|
|
local STATE_SWIM = 1001
|
|
local STATE_BURST = 1002
|
|
local STATE_CHASED = 1003
|
|
local STATE_RUNTOCAVE = 1004
|
|
local STATE_BEFOREMEET = 1005
|
|
local STATE_FADEOUT = 1006
|
|
local STATE_FOLLOWING = 1007
|
|
local STATE_CORNERED = 1008
|
|
local STATE_CHASEFOOD = 1009
|
|
local STATE_EAT = 1010
|
|
local STATE_PATH = 1011
|
|
|
|
v.naijaLastHealth = 0
|
|
v.nearEnemyTimer = 0
|
|
v.nearNaijaTimer = 0
|
|
v.headDelay = 1
|
|
|
|
v.flipDelay = 0
|
|
|
|
v.n = 0
|
|
|
|
v.zapDelay = 0.1
|
|
|
|
v.breathTimer = 0
|
|
|
|
v.ing = 0
|
|
|
|
local function distFlipTo(me, ent)
|
|
if math.abs(entity_x(me)-entity_x(ent)) > 32 then
|
|
entity_flipToEntity(me, ent)
|
|
end
|
|
end
|
|
|
|
local function setNaijaHugPosition(me)
|
|
entity_setPosition(v.n, entity_x(me)+v.hugOut, entity_y(me))
|
|
local fh = entity_isfh(me)
|
|
if fh then
|
|
fh = false
|
|
else
|
|
fh = true
|
|
end
|
|
entity_setRidingData(me, entity_x(me)+v.hugOut, entity_y(me), 0, fh)
|
|
end
|
|
|
|
local function flipHug(me)
|
|
debugLog("flipHug")
|
|
if v.hugOut < 0 then
|
|
v.hugOut = -v.naijaOut
|
|
else
|
|
v.hugOut = v.naijaOut
|
|
end
|
|
setNaijaHugPosition(me)
|
|
entity_flipToEntity(me, v.n)
|
|
entity_flipToEntity(v.n, me)
|
|
end
|
|
|
|
local function endHug(me)
|
|
if entity_getRiding(v.n) == me then
|
|
entity_setRiding(v.n, 0)
|
|
entity_idle(v.n)
|
|
end
|
|
if entity_isState(me, STATE_HUG) then
|
|
if not isForm(FORM_DUAL) then
|
|
entity_setState(me, STATE_IDLE)
|
|
end
|
|
end
|
|
end
|
|
|
|
function activate(me)
|
|
--debugLog("Li: activate")
|
|
if entity_isState(me, STATE_HUG) then
|
|
endHug(me)
|
|
else
|
|
|
|
if isFlag(FLAG_LI, 101) or isFlag(FLAG_LI, 102) then
|
|
--debugLog("setting li to follow")
|
|
fade(1, 1)
|
|
entity_idle(v.n)
|
|
watch(1)
|
|
if not v.switchGiggle then
|
|
emote(EMOTE_NAIJAGIGGLE)
|
|
v.switchGiggle = true
|
|
end
|
|
watch(0.3)
|
|
playSfx("changeclothes2")
|
|
setFlag(FLAG_LI, 100)
|
|
entity_setActivationType(me, AT_NONE)
|
|
entity_setState(me, STATE_IDLE)
|
|
bone_alpha(v.bone_helmet, 0, 0.5)
|
|
watch(0.5)
|
|
fade(0,1)
|
|
watch(1)
|
|
setLi(me)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function expression(me, ep, t)
|
|
v.expressionTimer = t
|
|
bone_showFrame(v.bone_head, ep)
|
|
--[[
|
|
if ep == "" then
|
|
bone_setTexture(v.bone_head, "Li/Head")
|
|
else
|
|
ep = string.format("%s%s", "Li/Head-", ep)
|
|
bone_setTexture(v.bone_head, ep)
|
|
end
|
|
]]--
|
|
end
|
|
|
|
function init(me)
|
|
|
|
--[[
|
|
if isFlag(FLAG_LI, 0) or isFlag(FLAG_LI, 1) then
|
|
debugLog("SETTING BEFOREMEET")
|
|
entity_setState(me, STATE_BEFOREMEET)
|
|
elseif isFlag(FLAG_LI, 101) or isFlag(FLAG_LI, 102) then
|
|
entity_setState(me, STATE_BEFOREMEET)
|
|
else
|
|
--debugLog(string.format("Got head: %d", v.bone_head))
|
|
bone_alpha(v.bone_helmet, 0, 0.1)
|
|
entity_setState(me, STATE_IDLE)
|
|
end
|
|
]]--
|
|
|
|
setupBasicEntity(me,
|
|
"", -- texture
|
|
32, -- health
|
|
1, -- manaballamount
|
|
1, -- exp
|
|
1, -- money
|
|
28, -- collideRadius (only used if hit entities is on)
|
|
STATE_IDLE, -- initState
|
|
64, -- sprite width
|
|
64, -- sprite height
|
|
1, -- particle "explosion" type, maps to particleEffects.txt -1 = none
|
|
1, -- 0/1 hit other entities off/on (uses collideRadius)
|
|
4000 -- updateCull -1: disabled, default: 4000
|
|
)
|
|
|
|
entity_initSkeletal(me, "Li")
|
|
entity_setDeathParticleEffect(me, "TinyGreenExplode")
|
|
|
|
entity_scale(me, 0.5, 0.5)
|
|
|
|
v.bone_helmet = entity_getBoneByName(me, "Helmet")
|
|
v.bone_head = entity_getBoneByName(me, "Head")
|
|
v.bone_fish1 = entity_getBoneByName(me, "Fish1")
|
|
v.bone_fish2 = entity_getBoneByName(me, "Fish2")
|
|
v.bone_hand = entity_getBoneByName(me, "RightArm")
|
|
v.bone_arm = entity_getBoneByName(me, "RightArm2")
|
|
v.bone_weaponGlow = entity_getBoneByName(me, "WeaponGlow")
|
|
bone_setBlendType(v.bone_weaponGlow, BLEND_ADD)
|
|
bone_alpha(v.bone_fish1)
|
|
bone_alpha(v.bone_fish2)
|
|
|
|
v.bone_llarm = entity_getBoneByName(me, "LLArm")
|
|
v.bone_ularm = entity_getBoneByName(me, "ULArm")
|
|
v.bone_leftHand = entity_getBoneByName(me, "LeftArm")
|
|
|
|
|
|
entity_setEntityType(me, ET_NEUTRAL)
|
|
|
|
--entity_setSpiritFreeze(me, false)
|
|
|
|
entity_setBeautyFlip(me, false)
|
|
entity_setDamageTarget(me, DT_AVATAR_LANCEATTACH, false)
|
|
entity_setDamageTarget(me, DT_AVATAR_LANCE, false)
|
|
|
|
esetv(me, EV_ENTITYDIED, 1)
|
|
|
|
|
|
v.inVeil01 = isMapName("veil01")
|
|
|
|
|
|
--entity_setRenderPass(me, 1)
|
|
|
|
end
|
|
|
|
function entityDied(me, ent)
|
|
if v.ing ~= 0 and ent == v.ing then
|
|
entity_setState(me, STATE_IDLE)
|
|
v.ing = 0
|
|
end
|
|
end
|
|
|
|
local function pathCheck(me, dt)
|
|
-- messes up on small passages etc
|
|
--[[
|
|
if v.pathDelay > 0 then
|
|
v.pathDelay = v.pathDelay - dt
|
|
end
|
|
if v.pathDelay <= 0 then
|
|
v.pathDelay = 3
|
|
entity_setState(me, STATE_PATH)
|
|
return true
|
|
end
|
|
]]--
|
|
return false
|
|
end
|
|
|
|
local function refreshWeaponGlow(me)
|
|
local t = 0.5
|
|
local f = 3
|
|
if isFlag(FLAG_LICOMBAT, 1) then
|
|
bone_alpha(v.bone_weaponGlow, 1, 0.5)
|
|
bone_setColor(v.bone_weaponGlow, 1, 0.5, 0.5, t)
|
|
else
|
|
bone_alpha(v.bone_weaponGlow, 0.5, 0.5)
|
|
bone_setColor(v.bone_weaponGlow, 0.5, 0.5, 1, t)
|
|
end
|
|
--[[
|
|
bone_scale(v.bone_weaponGlow, v.bwgsz, v.bwgsz)
|
|
bone_scale(v.bone_weaponGlow, v.bwgsz*f, v.bwgsz*f, t*0.75, 1, 1)
|
|
]]--
|
|
end
|
|
|
|
|
|
function postInit(me)
|
|
v.n = getNaija()
|
|
v.naijaLastHealth = entity_getHealth(v.n)
|
|
v.bwgsz = bone_getScale(v.bone_weaponGlow)
|
|
refreshWeaponGlow(me)
|
|
|
|
if isFlag(FLAG_LI, 0) or isFlag(FLAG_LI, 1) then
|
|
--debugLog("SETTING BEFOREMEET")
|
|
entity_setState(me, STATE_BEFOREMEET, -1, true)
|
|
elseif isFlag(FLAG_LI, 101) or isFlag(FLAG_LI, 102) then
|
|
entity_setState(me, STATE_BEFOREMEET, -1, true)
|
|
elseif isFlag(FLAG_LI, 200) then
|
|
bone_alpha(v.bone_helmet, 0, 0.1)
|
|
-- overridable, do nothing
|
|
else
|
|
bone_alpha(v.bone_helmet, 0, 0.1)
|
|
entity_setState(me, STATE_IDLE, -1, true)
|
|
end
|
|
|
|
|
|
if isMapName("licave") then
|
|
entity_moveToBack(me)
|
|
end
|
|
end
|
|
|
|
local function zap(me)
|
|
--debugLog("Zap!")
|
|
--local attackRange = 256
|
|
local attackRange = 800
|
|
local chaseRange = 300
|
|
local attacked = false
|
|
|
|
local fx, fy = bone_getWorldPosition(v.bone_hand)
|
|
local ent = getFirstEntity()
|
|
while ent ~= 0 do
|
|
if entity_isValidTarget(ent) then
|
|
if entity_isDamageTarget(ent, DT_AVATAR_LIZAP, true) then
|
|
--entity_setTarget(me, ent)
|
|
if entity_isEntityInRange(me, ent, chaseRange) and not entity_isEntityInRange(me, ent, attackRange) then
|
|
--entity_moveTowardsTarget(me, 1, 300)
|
|
--entity_setMaxSpeedLerp(me, 1.1, 0.5)
|
|
--entity_flipToEntity(me, ent)
|
|
elseif entity_isEntityInRange(me, ent, attackRange) and not entity_isDead(ent) then
|
|
-- zap this one
|
|
--entity_damage(ent, me, 1.0, DT_AVATAR_LIZAP)
|
|
entity_animate(me, "fire", 0, LAYER_UPPERBODY)
|
|
local s = createShot("Li", me, ent, fx, fy)
|
|
endHug(me)
|
|
|
|
local ax, ay = bone_getWorldPosition(v.bone_arm)
|
|
local dx = entity_x(ent) - ax
|
|
local dy = entity_y(ent) - ay
|
|
shot_setAimVector(s, dx, dy)
|
|
|
|
--softFlipTo(me, ent)
|
|
|
|
--entity_setMaxSpeedLerp(me, 1, 0.5)
|
|
attacked = true
|
|
break
|
|
end
|
|
end
|
|
end
|
|
ent = getNextEntity()
|
|
end
|
|
entity_setTarget(me, getNaija())
|
|
--[[
|
|
if attacked then
|
|
spawnParticleEffect("LiZap", fx, fy)
|
|
end
|
|
]]--
|
|
end
|
|
|
|
local function cutscene(me)
|
|
setCutscene(1,1)
|
|
fadeOutMusic(4)
|
|
--watch(2)
|
|
--changeForm(FORM_NORMAL)
|
|
|
|
setBeacon(BEACON_LI, false)
|
|
|
|
toggleInput(0)
|
|
overrideZoom(0.8, 5)
|
|
entity_animate(me, "helmetFlyOff", 0, 3)
|
|
entity_idle(v.n)
|
|
|
|
voiceInterupt("NAIJA_LIBINDSONG1")
|
|
|
|
|
|
watch(3)
|
|
|
|
bone_alpha(v.bone_helmet, 0, 0.5)
|
|
|
|
local node = entity_getNearestNode(me, "NAIJALI")
|
|
entity_swimToNode(v.n, node)
|
|
|
|
entity_animate(me, "choke", LOOP_INF)
|
|
|
|
expression(me, EXPRESSION_HURT, 99)
|
|
|
|
entity_watchForPath(v.n)
|
|
|
|
entity_flipToEntity(me, v.n)
|
|
entity_flipToEntity(v.n, me)
|
|
|
|
watchForVoice()
|
|
|
|
|
|
|
|
|
|
watch(2)
|
|
|
|
voice("NAIJA_LIBINDSONG2")
|
|
-- naija floats forwards, kisses
|
|
entity_setPosition(v.n, entity_x(me)-30, entity_y(me), 1, 0, 0, 1)
|
|
entity_animate(v.n, "kissLi")
|
|
cam_toNode(getNode("KISSCAM"))
|
|
watch(1)
|
|
expression(me, EXPRESSION_NORMAL, 99)
|
|
entity_animate(me, "getKissed")
|
|
entity_setPosition(v.n, entity_x(me)-23, entity_y(me), 1, 0, 0, 1)
|
|
watch(1)
|
|
--[[
|
|
entity_animate(v.n, "getKissed", LOOP_INF)
|
|
while entity_isAnimating(v.n) do
|
|
watch(FRAME_TIME)
|
|
end
|
|
]]--
|
|
--[[
|
|
entity_offset(v.n, 0, 8, 2, -1, 1)
|
|
entity_offset(me, 0, 8, 2, -1, 1)
|
|
]]--
|
|
setNaijaHeadTexture("blink")
|
|
expression(me, EXPRESSION_SURPRISE, 2)
|
|
entity_animate(v.n, "kissLiLoop", LOOP_INF)
|
|
entity_animate(me, "kissLiLoop", LOOP_INF)
|
|
--entity_animate(v.n, "getKissedLoop", LOOP_INF)
|
|
|
|
watchForVoice()
|
|
|
|
-- music
|
|
playMusic("Moment")
|
|
|
|
-- particle effects start
|
|
local kissNode = entity_getNearestNode(me, "KISSPRT")
|
|
spawnParticleEffect("Kiss", node_x(kissNode), node_y(kissNode))
|
|
|
|
watch(3)
|
|
|
|
voice("NAIJA_LIBINDSONG3")
|
|
|
|
watch(3)
|
|
|
|
watchForVoice()
|
|
watch(3)
|
|
|
|
voice("NAIJA_LIBINDSONG4")
|
|
watchForVoice()
|
|
|
|
watch(2)
|
|
-- drift apart
|
|
|
|
voice("NAIJA_LIBINDSONG5")
|
|
watch(3)
|
|
--entity_addVel(me, 200, 0)
|
|
entity_setPosition(me, entity_x(me)+200, entity_y(me), 10, 0, 0, 1)
|
|
entity_setPosition(v.n, entity_x(v.n)-250, entity_y(v.n), 10, 0, 0, 1)
|
|
|
|
entity_animate(v.n, "kissFloat")
|
|
entity_animate(me, "kissFloat")
|
|
|
|
--entity_addVel(v.n, -200, 0)
|
|
--watchForVoice()
|
|
|
|
--watch()
|
|
watch(1)
|
|
|
|
|
|
|
|
voice("NAIJA_LIBINDSONG6")
|
|
|
|
watch(1)
|
|
|
|
--watchForVoice()
|
|
|
|
fade(1, 5)
|
|
watch(3)
|
|
|
|
fadeOutMusic(8)
|
|
watch(8)
|
|
|
|
watch(1)
|
|
|
|
entity_offset(v.n)
|
|
entity_offset(me)
|
|
|
|
cam_toEntity(v.n)
|
|
-- cutscene 2 goes here
|
|
|
|
-- warp li outta here
|
|
entity_setPosition(me, 0, 0)
|
|
|
|
-- warp naija to sleep position
|
|
setNaijaHeadTexture("")
|
|
local sleepNode = getNode("NAIJAWAKE")
|
|
entity_setPosition(v.n, node_x(sleepNode), node_y(sleepNode))
|
|
entity_animate(v.n, "sleep", -1)
|
|
node = getNode("PUPPETLI")
|
|
entity_setPosition(me, node_x(node), node_y(node))
|
|
entity_flipToEntity(v.n, me)
|
|
entity_flipToEntity(me, v.n)
|
|
|
|
entity_animate(me, "idle", -1)
|
|
|
|
-- skip that interp
|
|
watch(0.5)
|
|
|
|
fade(0, 5)
|
|
watch(6)
|
|
voice("Naija_NaijaAwakes1")
|
|
entity_animate(v.n, "slowWakeUp")
|
|
while entity_isAnimating(v.n) do
|
|
watch(FRAME_TIME)
|
|
end
|
|
entity_animate(v.n, "idle", -1)
|
|
|
|
watchForVoice()
|
|
watch(1)
|
|
|
|
node = getNode("NAIJAGETUP")
|
|
entity_setPosition(v.n, node_x(node), node_y(node), -500, 0, 0, 1)
|
|
|
|
entity_stopAllAnimations(me)
|
|
entity_swimToNode(me, getNode("LISAYHI"))
|
|
entity_animate(me, "swim", -1)
|
|
voice("Naija_NaijaAwakes2")
|
|
watch(2)
|
|
entity_flipToEntity(me, v.n)
|
|
cam_toEntity(me)
|
|
entity_flipToEntity(me, v.n)
|
|
watchForVoice()
|
|
entity_flipToEntity(me, v.n)
|
|
watch(1)
|
|
voice("Naija_NaijaAwakes3")
|
|
watch(1)
|
|
cam_toEntity(v.n)
|
|
watch(3)
|
|
entity_animate(v.n, "ashamed", -1, LAYER_UPPERBODY)
|
|
watchForVoice()
|
|
entity_swimToNode(me, getNode("LIGETFISH"))
|
|
|
|
entity_watchForPath(me)
|
|
|
|
bone_alpha(v.bone_fish1, 1)
|
|
bone_alpha(v.bone_fish2, 1)
|
|
|
|
entity_swimToNode(me, getNode("LISAYHI"))
|
|
voice("Naija_NaijaAwakes4")
|
|
watchForVoice()
|
|
entity_animate(me, "holdFish", -1, LAYER_UPPERBODY)
|
|
expression(me, EXPRESSION_HAPPY, 5)
|
|
entity_stopAllAnimations(v.n)
|
|
entity_idle(v.n)
|
|
cam_toEntity(me)
|
|
watch(2)
|
|
|
|
fade(1, 1.5)
|
|
watch(1.5)
|
|
|
|
--bone_alpha(v.bone_fish1)
|
|
bone_alpha(v.bone_fish2)
|
|
local n_fish2 = entity_getBoneByName(v.n, "Fish2")
|
|
bone_alpha(n_fish2, 1)
|
|
|
|
|
|
cam_toEntity(v.n)
|
|
entity_stopAllAnimations(v.n)
|
|
entity_idle(v.n)
|
|
entity_stopAllAnimations(me)
|
|
|
|
esetv(v.n, EV_LOOKAT, 0)
|
|
|
|
local naijaSit = getNode("NAIJASIT")
|
|
local liSit = getNode("LISIT")
|
|
entity_setPosition(v.n, node_x(naijaSit), node_y(naijaSit))
|
|
entity_setPosition(me, node_x(liSit), node_y(liSit))
|
|
entity_animate(me, "sitAndEat", -1)
|
|
entity_animate(v.n, "sitAndEat", -1)
|
|
|
|
cam_toNode(getNode("EATCAM"))
|
|
watch(1)
|
|
|
|
fade(0, 1.5)
|
|
watch(1.5)
|
|
|
|
voice("Naija_NaijaAwakes5")
|
|
watchForVoice()
|
|
|
|
fade(1, 3)
|
|
watch(3)
|
|
|
|
bone_alpha(v.bone_fish1)
|
|
bone_alpha(n_fish2)
|
|
|
|
cam_toEntity(v.n)
|
|
|
|
|
|
entity_idle(v.n)
|
|
-- and then:
|
|
|
|
playMusic("LiCave")
|
|
watch(1)
|
|
|
|
voice("Naija_NaijaAwakes6")
|
|
setFlag(FLAG_LI, 100)
|
|
entity_setState(me, STATE_IDLE)
|
|
-- get to end nodes
|
|
|
|
esetv(v.n, EV_LOOKAT, 1)
|
|
|
|
-- end test
|
|
fade(0, 1)
|
|
watch(1)
|
|
toggleInput(1)
|
|
|
|
overrideZoom(0)
|
|
|
|
setCutscene(0)
|
|
|
|
learnSong(SONG_LI)
|
|
|
|
setControlHint(getStringBank(42), 0, 0, 0, 10, "", SONG_LI)
|
|
|
|
setLi(me)
|
|
end
|
|
|
|
function shiftWorlds(me, old, new)
|
|
if hasLi() then
|
|
--[[
|
|
if new == WT_SPIRIT then
|
|
entity_alpha(me, 0.1)
|
|
else
|
|
entity_alpha(me, 1)
|
|
end
|
|
x,y = entity_getPosition(v.n)
|
|
entity_setPosition(me, x+1, y+1)
|
|
]]--
|
|
end
|
|
|
|
-- resuming the hug after spirit return is not easily possible,
|
|
-- as the game has additional code that repositions Li then.
|
|
-- so we just end the hug; this allows moving in spirit form. -- FG
|
|
if entity_isState(me, STATE_HUG) then
|
|
endHug(me)
|
|
end
|
|
end
|
|
|
|
function song(me, song)
|
|
--debugLog("Li: Sung song!")
|
|
if entity_isState(me, STATE_HUG) then
|
|
if song == SONG_SHIELD then
|
|
flipHug(me)
|
|
end
|
|
if song == SONG_LI then
|
|
entity_setState(me, STATE_IDLE)
|
|
end
|
|
end
|
|
|
|
if entity_isState(me, STATE_CORNERED) then
|
|
--debugLog("i'm cornered and you sun a song")
|
|
if song == SONG_BIND then
|
|
--debugLog("it was bind")
|
|
--debugLog(string.format("FLAG_LI: %d", getFlag(FLAG_LI)))
|
|
if isFlag(FLAG_LI, 1) then
|
|
--debugLog("calling cutscene")
|
|
cutscene(me)
|
|
end
|
|
end
|
|
else
|
|
if song == SONG_ENERGYFORM then
|
|
v.nearNaijaTimer = 0
|
|
expression(me, EXPRESSION_SURPRISE, 1.5)
|
|
entity_flipToEntity(me, v.n)
|
|
--entity_moveTowardsTarget(me, 1, -1000)
|
|
elseif song == SONG_BEASTFORM then
|
|
v.nearNaijaTimer = 0
|
|
expression(me, EXPRESSION_ANGRY, 4)
|
|
entity_flipToEntity(me, v.n)
|
|
elseif song == SONG_NATUREFORM then
|
|
v.nearNaijaTimer = 2
|
|
expression(me, EXPRESSION_HAPPY, 3)
|
|
entity_flipToEntity(me, v.n)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function softFlipTo(me, ent)
|
|
if v.flipDelay < 0 then
|
|
entity_flipToEntity(me, ent)
|
|
v.flipDelay = 1
|
|
end
|
|
end
|
|
|
|
function update(me, dt)
|
|
if isForm(FORM_DUAL) then return end
|
|
if v.incut then return end
|
|
if entity_isState(me, STATE_WAIT) then return end
|
|
if entity_isState(me, STATE_TRAPPEDINCREATOR) then return end
|
|
if entity_isState(me, STATE_OPEN) then return end
|
|
if entity_isState(me, STATE_CLOSE) then return end
|
|
|
|
if entity_isState(me, STATE_PUPPET) then return end
|
|
|
|
|
|
if not hasLi() and not v.seen then
|
|
if v.inVeil01 then
|
|
if entity_isEntityInRange(me, v.n, 600) then
|
|
v.seen = true
|
|
musicVolume(0.1, 0.5)
|
|
entity_idle(v.n)
|
|
entity_flipToEntity(v.n, me)
|
|
--playSfx("naijachildgiggle")
|
|
cam_toEntity(me)
|
|
setGameSpeed(0.5, 1)
|
|
--playSfx("heartbeat")
|
|
wait(1.5)
|
|
playSfx("heartbeat")
|
|
wait(0.75)
|
|
playSfx("heartbeat")
|
|
wait(0.5)
|
|
--playSfx("heartbeat")
|
|
setGameSpeed(1, 1)
|
|
cam_toEntity(v.n)
|
|
musicVolume(1, 1)
|
|
|
|
end
|
|
end
|
|
end
|
|
|
|
--debugLog(string.format("liupdate state: %d", entity_getState(me)))
|
|
|
|
local liPower = getLiPower()
|
|
if liPower > 0 then
|
|
debugLog("liPower!")
|
|
entity_setColor(me, 0.6, 0.7, 1.0, 0.1)
|
|
else
|
|
entity_setColor(me, 1,1,1,0.1)
|
|
end
|
|
|
|
if entity_isState(me, STATE_CARRIED) then
|
|
bone_alpha(v.bone_helmet, 0)
|
|
--entity_setPosition(me, entity_x(v.n)+24, entity_y(v.n))
|
|
return
|
|
end
|
|
--entity_touchAvatarDamage(me, 32, 1, 1200)
|
|
--entity_handleShotCollisions(me)
|
|
|
|
if v.bone_head ~= 0 then
|
|
entity_setLookAtPoint(me, bone_getWorldPosition(v.bone_head))
|
|
end
|
|
entity_updateCurrents(me, dt)
|
|
|
|
local spdf = 1
|
|
if liPower > 0 then
|
|
spdf = 8
|
|
end
|
|
|
|
v.flipDelay = v.flipDelay - dt*spdf
|
|
if v.flipDelay < 0 then
|
|
v.flipDelay = 0
|
|
end
|
|
--if isFlag(FLAG_LI, 100) then
|
|
if hasLi() and not entity_isState(me, STATE_CHASEFOOD) then
|
|
if v.headDelay > 0 then
|
|
v.headDelay = v.headDelay - dt
|
|
else
|
|
v.ent = entity_getNearestEntity(me)
|
|
if eisv(v.ent, EV_TYPEID, EVT_PET) then
|
|
v.ent = v.n
|
|
end
|
|
if v.ent ~= 0 and entity_isEntityInRange(me, v.ent, 256) then
|
|
if not entity_isState(me, STATE_HUG) then
|
|
if entity_getEntityType(v.ent) == ET_INGREDIENT then
|
|
if ing_hasIET(v.ent, IET_LI) then
|
|
|
|
-- move toward
|
|
expression(me, EXPRESSION_HAPPY, 2)
|
|
--entity_moveTowards(me, entity_x(v.ent), entity_y(v.ent), dt, 500)
|
|
entity_setTarget(me, v.ent)
|
|
--entity_updateMovement(me, dt)
|
|
if not entity_isState(me, STATE_CHASEFOOD) and v.ent ~= 0 then
|
|
v.ing = v.ent
|
|
entity_setState(me, STATE_CHASEFOOD)
|
|
end
|
|
end
|
|
elseif entity_getEntityType(v.ent) == ET_ENEMY and entity_isEntityInRange(me, v.ent, 128) then
|
|
if eisv(v.ent, EV_TYPEID, EVT_PET) then
|
|
v.ent = 0
|
|
else
|
|
v.nearEnemyTimer = v.nearEnemyTimer + dt*2
|
|
v.nearNaijaTimer = v.nearNaijaTimer - dt
|
|
if v.nearEnemyTimer > 10 then
|
|
expression(me, EXPRESSION_ANGRY, 2)
|
|
v.nearEnemyTimer = 10
|
|
else
|
|
expression(me, EXPRESSION_SURPRISE, 1)
|
|
end
|
|
entity_setNaijaReaction(me, "")
|
|
end
|
|
elseif entity_getEntityType(v.ent) == ET_AVATAR and entity_isEntityInRange(me, v.ent, 128) then
|
|
--softFlipTo(me, v.ent)
|
|
distFlipTo(me, v.ent)
|
|
if entity_getHealth(v.ent) > 2 and isForm(FORM_NORMAL) and not avatar_isSinging() then
|
|
v.nearNaijaTimer = v.nearNaijaTimer + dt*2
|
|
if v.nearNaijaTimer > 4 then
|
|
expression(me, EXPRESSION_HAPPY, 1)
|
|
end
|
|
if v.nearNaijaTimer > 5 then
|
|
entity_setNaijaReaction(me, "smile")
|
|
end
|
|
if v.nearNaijaTimer > 14 then
|
|
v.nearNaijaTimer = 0+math.random(2)
|
|
entity_setNaijaReaction(me, "")
|
|
end
|
|
|
|
if avatar_getStillTimer() > 4 and not avatar_isOnWall() and v.nearNaijaTimer > 8 then
|
|
if not isInputEnabled() or avatar_isSinging() then
|
|
v.nearNaijaTimer = 0
|
|
else
|
|
if entity_getRiding(getNaija()) == 0 then
|
|
entity_setState(me, STATE_HUG)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
--entity_stopAllAnimations(me)
|
|
else
|
|
v.ent = 0
|
|
end
|
|
if v.ent ~= 0 then
|
|
bone_setAnimated(v.bone_head, ANIM_POS)
|
|
bone_lookAtEntity(v.bone_head, v.ent, 0.3, -10, 30, -90)
|
|
else
|
|
bone_setAnimated(v.bone_head, ANIM_ALL)
|
|
entity_setNaijaReaction(me, "")
|
|
end
|
|
end
|
|
v.nearEnemyTimer = v.nearEnemyTimer - dt
|
|
if v.nearEnemyTimer < 0 then v.nearEnemyTimer = 0 end
|
|
v.nearNaijaTimer = v.nearNaijaTimer - dt
|
|
if v.nearNaijaTimer < 0 then v.nearNaijaTimer = 0 end
|
|
|
|
if entity_getHealth(v.n) > v.naijaLastHealth then
|
|
expression(me, EXPRESSION_HAPPY, 2)
|
|
end
|
|
v.naijaLastHealth = entity_getHealth(v.n)
|
|
if entity_getHealth(v.n) < 1 then
|
|
expression(me, EXPRESSION_HURT, 2)
|
|
end
|
|
if isFlag(FLAG_LICOMBAT, 1) and not entity_isState(me, STATE_PUPPET) then
|
|
if v.zapDelay > 0 then
|
|
v.zapDelay = v.zapDelay - dt
|
|
if v.zapDelay < 0 then
|
|
zap(me)
|
|
v.zapDelay = 1.2
|
|
--v.zapDelay = 0.001
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
if v.expressionTimer > 0 then
|
|
v.expressionTimer = v.expressionTimer - dt
|
|
if v.expressionTimer < 0 then
|
|
v.expressionTimer = 0
|
|
expression(me, EXPRESSION_NORMAL, 0)
|
|
end
|
|
end
|
|
if entity_isState(me, STATE_IDLE) then
|
|
entity_setTarget(me, v.n)
|
|
v.followDelay = v.followDelay - dt
|
|
if v.followDelay < 0 then
|
|
v.followDelay = 0
|
|
end
|
|
if entity_isEntityInRange(me, v.n, 1024) and not entity_isEntityInRange(me, v.n, 256) and not avatar_isOnWall() and entity_isUnderWater(v.n) then
|
|
if v.followDelay <= 0 then
|
|
entity_setState(me, STATE_FOLLOWING)
|
|
end
|
|
end
|
|
entity_doSpellAvoidance(me, dt, 128, 0.1)
|
|
--entity_doEntityAvoidance(me, dt, 64, 0.5)
|
|
if entity_isEntityInRange(me, v.n, 20) then
|
|
entity_moveTowardsTarget(me, dt, -150)
|
|
end
|
|
elseif entity_isState(me, STATE_PATH) then
|
|
--debugLog("updating state path")
|
|
if entity_isFollowingPath(me) then
|
|
if entity_isEntityInRange(me, v.n, 300) then
|
|
entity_stopFollowingPath(me)
|
|
entity_moveTowardsTarget(me, 1, 500)
|
|
entity_setState(me, STATE_FOLLOWING)
|
|
end
|
|
|
|
--entity_setState(me, STATE_FOLLOWING)
|
|
else
|
|
entity_moveTowardsTarget(me, 1, 500)
|
|
entity_setState(me, STATE_FOLLOWING)
|
|
end
|
|
elseif entity_isState(me, STATE_FOLLOWING) then
|
|
--debugLog("updating following")
|
|
local amt = 800
|
|
--not avatar_isOnWall() and
|
|
|
|
entity_doCollisionAvoidance(me, dt, 4, 1, 100, 1, true)
|
|
|
|
entity_setTarget(me, v.n)
|
|
if entity_isUnderWater(v.n) then
|
|
if entity_isEntityInRange(me, v.n, 180) then
|
|
entity_setMaxSpeedLerp(me, 0.2, 1)
|
|
else
|
|
entity_setMaxSpeedLerp(me, 1, 0.2)
|
|
end
|
|
|
|
if entity_isEntityInRange(me, v.n, 180) then
|
|
entity_doFriction(me, dt, 200)
|
|
if ((math.abs(entity_velx(v.n)) < 10 and math.abs(entity_vely(v.n)) < 10) or avatar_isOnWall()) then
|
|
entity_setState(me, STATE_IDLE)
|
|
end
|
|
elseif entity_isEntityInRange(me, v.n, 250) then
|
|
--entity_moveAroundTarget(me, dt, amt*0.8)
|
|
entity_moveTowardsTarget(me, dt, amt)
|
|
elseif entity_isEntityInRange(me, v.n, 512) then
|
|
entity_moveTowardsTarget(me, dt, amt*2)
|
|
elseif not entity_isEntityInRange(me, v.n, 1024) then
|
|
if entity_isUnderWater(v.n) and not avatar_isOnWall() then
|
|
if not pathCheck(me, dt) then
|
|
entity_moveTowardsTarget(me, dt, amt)
|
|
end
|
|
else
|
|
entity_moveTowardsTarget(me, dt, amt)
|
|
end
|
|
else
|
|
entity_moveTowardsTarget(me, dt, amt)
|
|
end
|
|
else
|
|
entity_setState(me, STATE_IDLE)
|
|
end
|
|
-- hmm?
|
|
--entity_doSpellAvoidance(me, dt, 128, 0.2)
|
|
|
|
|
|
--entity_doCollisionAvoidance(me, dt, 8, 0.05)
|
|
|
|
if entity_doCollisionAvoidance(me, dt, 5, 0.1) then
|
|
--entity_moveTowardsTarget(me, dt, 250)
|
|
end
|
|
--[[
|
|
if entity_doCollisionAvoidance(me, dt, 1, 1) then
|
|
entity_moveTowardsTarget(me, dt, 200)
|
|
end
|
|
]]--
|
|
|
|
if math.abs(entity_velx(me)) < 1 and math.abs(entity_vely(me)) < 1 then
|
|
--debugLog("get unstuck")
|
|
entity_setMaxSpeedLerp(me, 1)
|
|
entity_moveTowardsTarget(me, 1, 500)
|
|
end
|
|
--debugLog(string.format("li v(%d, %d)", entity_velx(me), entity_vely(me)))
|
|
elseif entity_isState(me, STATE_CHASEFOOD) then
|
|
if v.ing == 0 then
|
|
entity_setState(me, STATE_IDLE)
|
|
else
|
|
local amt = 500
|
|
|
|
entity_moveTowards(me, entity_x(v.ing), entity_y(v.ing), dt, amt)
|
|
|
|
--entity_doSpellAvoidance(me, dt, 128, 0.2))
|
|
entity_doCollisionAvoidance(me, dt, 3, 0.1)
|
|
if v.ing ~= 0 and entity_isEntityInRange(me, v.ing, 32) then
|
|
-- do yum type things
|
|
entity_delete(v.ent)
|
|
v.ent = 0
|
|
v.ing = 0
|
|
entity_setState(me, STATE_EAT)
|
|
expression(me, EXPRESSION_HAPPY, 2)
|
|
|
|
--debugLog("setting li power!")
|
|
setLiPower(1, 30)
|
|
end
|
|
end
|
|
|
|
elseif entity_isState(me, STATE_BEFOREMEET) then
|
|
--debugLog("updating before meet")
|
|
v.dirTimer = v.dirTimer + dt
|
|
if v.dirTimer > 3 then
|
|
v.dirTimer = 0
|
|
if v.dir > 0 then
|
|
v.dir = 0
|
|
else
|
|
v.dir = 1
|
|
end
|
|
end
|
|
local spd = 300
|
|
if v.dir > 0 then
|
|
spd = -spd
|
|
end
|
|
entity_addVel(me, spd, 0)
|
|
entity_doEntityAvoidance(me, dt, 256, 0.1)
|
|
entity_doCollisionAvoidance(me, dt, 6, 0.5)
|
|
|
|
if getFlag(FLAG_LI) < 100 then
|
|
if entity_isEntityInRange(me, getNaija(), 150) then
|
|
entity_setState(me, STATE_CHASED)
|
|
end
|
|
end
|
|
|
|
--debugLog(string.format("vel: %d", entity_velx(me)))
|
|
elseif entity_isState(me, STATE_CHASED) then
|
|
v.chaseTime = v.chaseTime + dt
|
|
-- 10
|
|
if v.chaseTime > 1 then
|
|
entity_setState(me, STATE_RUNTOCAVE)
|
|
end
|
|
entity_moveTowardsTarget(me, dt, -500)
|
|
entity_doCollisionAvoidance(me, dt, 6, 0.5)
|
|
elseif entity_isState(me, STATE_RUNTOCAVE) then
|
|
local liin = getNode("LI_IN")
|
|
if not entity_isEntityInRange(me, getNaija(), 1000) and not node_isEntityIn(liin, me) then
|
|
entity_stopFollowingPath(me)
|
|
entity_setState(me, STATE_BEFOREMEET)
|
|
else
|
|
if not entity_isFollowingPath(me) then
|
|
if isFlag(FLAG_LI, 0) then
|
|
entity_setState(me, STATE_FADEOUT)
|
|
elseif isFlag(FLAG_LI, 1) then
|
|
entity_setState(me, STATE_CORNERED)
|
|
end
|
|
end
|
|
end
|
|
elseif entity_isState(me, STATE_HUG) then
|
|
--debugLog("state hug")
|
|
entity_setMaxSpeedLerp(me, 2)
|
|
expression(me, EXPRESSION_HAPPY, 0.5)
|
|
if entity_getRiding(v.n) == me then
|
|
entity_animate(v.n, "hugLi", 0, 3)
|
|
if v.curNote ~= -1 then
|
|
local vx, vy = getNoteVector(v.curNote, 400*dt)
|
|
entity_addVel(me, vx, vy)
|
|
end
|
|
entity_doCollisionAvoidance(me, dt, 5, 0.1)
|
|
entity_doCollisionAvoidance(me, dt, 1, 1)
|
|
entity_doFriction(me, dt, 100)
|
|
entity_updateMovement(me, dt)
|
|
|
|
setNaijaHugPosition(me)
|
|
|
|
entity_updateLocalWarpAreas(me, true)
|
|
|
|
bone_setRenderPass(v.bone_llarm, 3)
|
|
bone_setRenderPass(v.bone_ularm, 3)
|
|
bone_setRenderPass(v.bone_leftHand, 3)
|
|
|
|
if not v.forcedHug then
|
|
if not isForm(FORM_NORMAL) or not isInputEnabled() or entity_isFollowingPath(v.n) or avatar_getStillTimer() < 1 or v.honeyPower ~= entity_getHealthPerc(v.n) then
|
|
endHug(me)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
--[[
|
|
ent = entity_getNearestEntity(me, "", 400, ET_ENEMY)
|
|
if ent ~= 0 then
|
|
expression(me, EXPRESSION_ANGRY, 1)
|
|
entity_setState(me, STATE_IDLE)
|
|
entity_flipToEntity(me, ent)
|
|
entity_flipToEntity(v.n, ent)
|
|
end
|
|
]]--
|
|
else
|
|
--debugLog("naija is not riding")
|
|
entity_setRiding(v.n, me)
|
|
end
|
|
--entity_setPosition(v.n, )
|
|
|
|
|
|
end
|
|
|
|
if not entity_isState(me, STATE_FADEOUT) and not entity_isState(me, STATE_HUG) and not entity_isState(me, STATE_PATH) then
|
|
if (math.abs(entity_velx(me))) > 10 then
|
|
entity_flipToVel(me)
|
|
end
|
|
if not entity_isState(me, STATE_IDLE) then
|
|
entity_rotateToVel(me, 0.1)
|
|
end
|
|
if math.abs(entity_velx(me)) > 20 or math.abs(entity_vely(me)) > 20 then
|
|
entity_doFriction(me, dt, 150)
|
|
v.gvel = true
|
|
else
|
|
if v.gvel then
|
|
entity_clearVel(me)
|
|
v.gvel = false
|
|
else
|
|
entity_doFriction(me, dt, 40)
|
|
end
|
|
end
|
|
entity_updateMovement(me, dt)
|
|
end
|
|
|
|
if not entity_isUnderWater(me) then
|
|
local w = getWaterLevel()
|
|
if math.abs(w - entity_y(me)) <= 40 then
|
|
entity_setPosition(me, entity_x(me), w+40)
|
|
entity_clearVel(me)
|
|
else
|
|
if entity_isUnderWater(v.n) then
|
|
entity_setPosition(me, entity_x(v.n), entity_y(v.n))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function damage(me, attacker, bone, damageType, dmg)
|
|
return false
|
|
end
|
|
|
|
function enterState(me, state)
|
|
--debugLog(string.format(%s%d, "li state: ", entity_getState(me)))
|
|
local timer = 0
|
|
if entity_isState(me, STATE_IDLE) then
|
|
debugLog("idle")
|
|
entity_rotate(me,0,0.5)
|
|
entity_setMaxSpeed(me, 200)
|
|
entity_animate(me, "idle", LOOP_INF)
|
|
if v.n ~= 0 then
|
|
entity_flipToEntity(me, v.n)
|
|
end
|
|
if not(isFlag(FLAG_LI, 101) or isFlag(FLAG_LI, 102)) and getFlag(FLAG_LI) >= 100 then
|
|
if v.bone_helmet ~= 0 then
|
|
--debugLog("setting helmet alpha to 0")
|
|
bone_alpha(v.bone_helmet, 0)
|
|
end
|
|
end
|
|
elseif entity_isState(me, STATE_CARRIED) then
|
|
entity_rotate(me, 0)
|
|
--entity_rotate(me, 360, 5, -1)
|
|
--entity_stopAllAnimations(me)
|
|
if entity_isfh(me) then entity_fh(me) end
|
|
bone_setAnimated(v.bone_head, ANIM_ALL)
|
|
--entity_animate(me, "trappedInCreator", -1)
|
|
elseif entity_getState(me)==STATE_BEFOREMEET then
|
|
--debugLog("beforemeet")
|
|
v.chaseTime = v.chaseTime - 3
|
|
entity_rotate(me,0,0.5)
|
|
entity_setMaxSpeed(me, 200)
|
|
entity_animate(me, "idle", LOOP_INF)
|
|
|
|
if isFlag(FLAG_LI, 101) or isFlag(FLAG_LI, 102) then
|
|
bone_alpha(v.bone_helmet, 1)
|
|
entity_setActivationType(me, AT_CLICK)
|
|
end
|
|
elseif entity_isState(me, STATE_CHASED) then
|
|
--debugLog("chased")
|
|
entity_setMaxSpeed(me, 500)
|
|
entity_setTarget(me, getNaija())
|
|
elseif entity_isState(me, STATE_FOLLOWING) then
|
|
--debugLog("following")
|
|
v.followDelay = 0.2
|
|
entity_animate(me, "swim", LOOP_INF)
|
|
entity_setMaxSpeed(me, 600)
|
|
|
|
entity_setMaxSpeedLerp(me, 1, 0.1)
|
|
elseif entity_isState(me, STATE_CHASEFOOD) then
|
|
--debugLog("chase food")
|
|
entity_animate(me, "swim", LOOP_INF)
|
|
entity_setMaxSpeed(me, 650)
|
|
elseif entity_isState(me, STATE_EAT) then
|
|
--debugLog("eat")
|
|
entity_animate(me, "eat", LOOP_INF)
|
|
entity_rotate(me,0,0.5)
|
|
entity_setMaxSpeed(me, 200)
|
|
entity_setStateTime(me, 3)
|
|
elseif entity_isState(me, STATE_RUNTOCAVE) then
|
|
--debugLog("runtocave")
|
|
entity_setMaxSpeed(me, 700)
|
|
local node = getNode("LICAVE")
|
|
if node ~= 0 then
|
|
entity_swimToNode(me, node, SPEED_LITOCAVE)
|
|
if not entity_isFollowingPath(me) then
|
|
entity_setState(me, STATE_CHASED)
|
|
end
|
|
end
|
|
elseif entity_getState(me)==STATE_SWIM then
|
|
--debugLog("swim")
|
|
entity_animate(me, "swim", LOOP_INF)
|
|
elseif entity_isState(me, STATE_FADEOUT) then
|
|
--debugLog("fadeout")
|
|
--debugLog("setting flag to 1")
|
|
setFlag(FLAG_LI, 1)
|
|
entity_alpha(me, 0, 1)
|
|
-- Make sure we don't see the head through the fading helmet.
|
|
bone_showFrame(v.bone_head, -1)
|
|
elseif entity_getState(me)==STATE_BURST then
|
|
debugLog("burst")
|
|
entity_animate(me, "burst")
|
|
--entity_doSpellAvoidance(me, 1, 256, 1.0)
|
|
entity_doEntityAvoidance(me, 1, 256, 1.0)
|
|
entity_doCollisionAvoidance(me, 1, 256, 1.0)
|
|
elseif entity_isState(me, STATE_CORNERED) then
|
|
debugLog("cornered")
|
|
voice("NAIJA_TRAPPEDLI")
|
|
entity_flipToEntity(me, getNaija())
|
|
--entity_setActivation(me, AT_CLICK, 64, 512)
|
|
elseif entity_isState(me, STATE_WAIT) then
|
|
debugLog("wait")
|
|
elseif entity_isState(me, STATE_HUG) then
|
|
v.incut = true
|
|
debugLog("HUG!")
|
|
|
|
entity_flipToEntity(me, v.n)
|
|
entity_flipToEntity(v.n, me)
|
|
|
|
v.nearNaijaTimer = 0
|
|
v.hugOut = v.naijaOut
|
|
if entity_isfh(me) then
|
|
v.hugOut = -v.hugOut
|
|
end
|
|
|
|
entity_setNaijaReaction(me, "")
|
|
-- FIXME: There's no "shock" expression; what was intended? --achurch
|
|
--expression(me, shock, 1) -- removed for now to prevent warnings in strict mode --fg
|
|
|
|
entity_clearVel(me)
|
|
entity_clearVel(v.n)
|
|
|
|
entity_idle(v.n)
|
|
entity_setPosition(v.n, entity_x(me)+v.hugOut, entity_y(me), 1, 0, 0, 1)
|
|
watch(1)
|
|
|
|
v.honeyPower = entity_getHealthPerc(v.n)
|
|
|
|
entity_setRiding(v.n, me)
|
|
|
|
entity_flipToEntity(me, v.n)
|
|
entity_flipToEntity(v.n, me)
|
|
|
|
entity_setNaijaReaction(me, "smile")
|
|
|
|
entity_animate(me, "hugNaija")
|
|
|
|
entity_offset(me, 0, 0, 0)
|
|
entity_offset(v.n, 0, 0, 0)
|
|
|
|
entity_offset(me, 0, 10, 1, -1, 1, 1)
|
|
entity_offset(v.n, 0, 10, 1, -1, 1, 1)
|
|
|
|
entity_setActivationType(me, AT_CLICK)
|
|
|
|
if not v.forcedHug then
|
|
if chance(75) then
|
|
if chance(50) then
|
|
emote(EMOTE_NAIJAGIGGLE)
|
|
else
|
|
emote(EMOTE_NAIJASIGH)
|
|
end
|
|
end
|
|
end
|
|
v.incut = false
|
|
elseif entity_isState(me, STATE_PATH) then
|
|
debugLog("enter state path")
|
|
entity_swimToPosition(me, entity_x(v.n), entity_y(v.n), SPEED_NORMAL)
|
|
elseif entity_isState(me, STATE_TRAPPEDINCREATOR) then
|
|
entity_rotate(me, 0)
|
|
--entity_rotate(me, 360, 5, -1)
|
|
entity_stopAllAnimations(me)
|
|
if entity_isfh(me) then entity_fh(me) end
|
|
bone_setAnimated(v.bone_head, ANIM_ALL)
|
|
entity_animate(me, "trappedInCreator", -1)
|
|
--[[
|
|
entity_offset(me, 0)
|
|
entity_offset(me, 0, 30, 1, 0, 0, 1)
|
|
]]--
|
|
elseif entity_isState(me, STATE_OPEN) then
|
|
entity_rotate(me, 0)
|
|
--entity_rotate(me, 360, 5, -1)
|
|
entity_stopAllAnimations(me)
|
|
if entity_isfh(me) then entity_fh(me) end
|
|
bone_setAnimated(v.bone_head, ANIM_ALL)
|
|
entity_animate(me, "idle", -1)
|
|
elseif entity_isState(me, STATE_CLOSE) then
|
|
-- when getting sucked into the creator
|
|
entity_rotate(me, 0)
|
|
entity_stopAllAnimations(me)
|
|
if entity_isfh(me) then entity_fh(me) end
|
|
bone_setAnimated(v.bone_head, ANIM_ALL)
|
|
entity_animate(me, "suckedin", -1)
|
|
elseif entity_isState(me, STATE_PUPPET) then
|
|
entity_idle(me, "idle", -1)
|
|
end
|
|
end
|
|
|
|
function exitState(me)
|
|
if entity_isState(me, STATE_BURST) then
|
|
entity_setState(me, STATE_SWIM)
|
|
elseif entity_isState(me, STATE_HUG) then
|
|
entity_setMaxSpeedLerp(me, 1, 0.5)
|
|
debugLog("hug off")
|
|
entity_offset(me, 0, 0, 0)
|
|
entity_offset(v.n, 0, 0, 0)
|
|
|
|
bone_setRenderPass(v.bone_llarm, 1)
|
|
bone_setRenderPass(v.bone_ularm, 1)
|
|
bone_setRenderPass(v.bone_leftHand, 1)
|
|
|
|
endHug(me)
|
|
|
|
entity_setActivationType(me, AT_NONE)
|
|
elseif entity_isState(me, STATE_EAT) then
|
|
entity_setState(me, STATE_IDLE)
|
|
end
|
|
end
|
|
|
|
function hitSurface(me)
|
|
end
|
|
|
|
function msg(me, msg, val)
|
|
-- switch to and from combat mode
|
|
if msg == "c" then
|
|
refreshWeaponGlow(me)
|
|
entity_animate(me, "switchCombat", 0, LAYER_UPPERBODY)
|
|
elseif msg == "forcehug" then
|
|
v.forcedHug = true
|
|
entity_setState(me, STATE_HUG, -1, 1)
|
|
elseif msg == "endhug" then
|
|
v.forcedHug = false
|
|
endHug(me)
|
|
elseif msg == "expression" then
|
|
expression(me, val, 2)
|
|
end
|
|
end
|
|
|
|
function songNote(me, note)
|
|
v.curNote = note
|
|
end
|
|
|
|
function songNoteDone(me, note, len)
|
|
v.curNote = -1
|
|
end
|