1
0
Fork 0
mirror of https://github.com/AquariaOSE/Aquaria.git synced 2024-11-26 18:23:49 +00:00
Aquaria/files/scripts/entities/li.lua

1341 lines
33 KiB
Lua
Raw Normal View History

-- Copyright (C) 2007, 2010 - Bit-Blot
--
-- This file is part of Aquaria.
--
-- Aquaria is free software; you can redistribute it and/or
-- modify it under the terms of the GNU General Public License
-- as published by the Free Software Foundation; either version 2
-- of the License, or (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
--
-- See the GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
if not v then v = {} end
if not AQUARIA_VERSION then dofile("scripts/entities/entityinclude.lua") end
-- ================================================================================================
-- 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
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
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