2011-08-03 20:05:33 +00:00
|
|
|
-- 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
|
|
|
|
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
|
Fixed some script interface functions, error handling & code cleanups
== Script interface changes: ==
Removed entity_setClampOnSwitchDir(), which was a no-op.
Added entity_getFlag() function, for fairness, as nodes already have one.
Added node_getLabel() function, which does not return the _full_ node string, but only the first part before parameters.
dofile() supports relative paths now, and it is no longer necessary to use appendUserDataPath() + full path from a mod.
entity_color() does now support all interpolation functions that similar vector-manipulation functions support (loop, ping-pong, ease).
added entity_getVel() function (an entity_setVel() can be emulated with entity_clearVel(), followed by entity_addVel()).
*_getNearestNode() and *_getNearestEntity() allow an optional ignore parameter.
node_getNearestNode() allowed to specify a node to exclude from the search,
the others not -- now the interface is more consistent.
Deprecated entity_[incr/decr]TargetLeaches(entity) - the attached leach amount was never handled
by any entity other than Naija. Replaced them with avatar_[incr/decr]Leaches(), but kept the old
ames for now, too. Should be removed in a while.
== Script interface & related fixes: ==
Added bool loudScriptErrors to control displaying script syntax error and global variable usage warnings.
So far, syntax errors always went do debugLog(), but it is less time consuming when writing scripts
to have them displayed right away.
*_getNearestNode now scan by label, and not full name.
This allows searching for nodes but ignoring its parameters. The original game scripts never search
for nodes that have parameters, so this does not break anything,
but allows modding without an exploding amount of specialized node scripts.
entity_setBoneLock() failed for certain entites with throwLuaErrors=true,
allowing to burst through them (gears, grouper, big mithalas jelly, probably more).
Removed unnecessary int-casts in entity_setHealth(), entity_changeHealth(), and a few others,
which truncated float fractional parts.
Fixed possible crashes in many functions due to missing NULL-pointer checks,
if wrong data were passed to Lua.
Optimized entity_getNearestEntity() a little - do nocasecmp() after checking all other params
UPPERCASE global variables as used in mod include files are now tolerated, even with all warnings on.
This makes sense because it was impossible to include a custom flags definition file
(which _must_ have globals, otherwise the including scripts won't see them) in a mod without beeing buried in spam.
They won't change, or clobber any states, and UPPERCASE sort of implies a constant/#define, imho.
Added better control over warnings about not-existing files. map_*.lua and premap_*.lua files are optional,
and no warning should be given if they do not exist. Missing Entity scripts and mod-init.lua must be
warned about, however.
Fixed a crash in global variable access warning (NULL pushed into std::ostringstream)
Fixed 2 random warnings i found in scrips
== Misc stuff: ==
Related to the changes above, cleaned out unused variables from the Entity class,
and removed the code that had to do with them somehow. Some parts of the removed code
were still in use, although totally unnecessary.
Saves a few bytes of memory per entity, and less code that can cause headache.
2011-09-18 21:12:02 +00:00
|
|
|
--expression(me, shock, 1) -- removed for now to prevent warnings in strict mode --fg
|
2011-08-03 20:05:33 +00:00
|
|
|
|
|
|
|
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
|