1-- Copyright (C) 2007, 2010 - Bit-Blot 2-- 3-- This file is part of Aquaria. 4-- 5-- Aquaria is free software; you can redistribute it and/or 6-- modify it under the terms of the GNU General Public License 7-- as published by the Free Software Foundation; either version 2 8-- of the License, or (at your option) any later version. 9-- 10-- This program is distributed in the hope that it will be useful, 11-- but WITHOUT ANY WARRANTY; without even the implied warranty of 12-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 13-- 14-- See the GNU General Public License for more details. 15-- 16-- You should have received a copy of the GNU General Public License 17-- along with this program; if not, write to the Free Software 18-- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 19 20if not v then v = {} end 21if not AQUARIA_VERSION then dofile("scripts/entities/entityinclude.lua") end 22 23-- =============================================================================================== 24-- SPORE CHILD 25-- ================================================================================================ 26 27v.growth = 0 28v.growTime = 5 29v.growEmitter = 0 30v.seekEnemy = 0 31v.seekEnemyDelay = 1.5 32 33v.minSpeed = 450 34v.maxSpeed = 700 35 36v.backAway = 0 37v.backAwayTime = 0.75 38 39v.myType = 1 40 41v.flowerTimer = 0 42 43local STATE_MOVETOFLOWER = 1000 44local STATE_OPENFLOWER = 1001 45 46v.state2 = 0 47 48function init(me) 49 setupBasicEntity( 50 me, 51 "SporeChildSeed", -- texture 52 16, -- health 53 2, -- manaballamount 54 2, -- exp 55 10, -- money 56 16, -- collideRadius (for hitting entities + spells) 57 STATE_IDLE, -- initState 58 64, -- sprite width 59 64, -- sprite height 60 1, -- particle "explosion" type, 0 = none 61 0, -- 0/1 hit other entities off/on (uses collideRadius) 62 -1, -- updateCull -1: disabled, default: 4000 63 1 64 ) 65 66 entity_initEmitter(me, v.growEmitter, "SporeSeedGrow") 67 68 entity_setCollideRadius(me, 16) 69 entity_setEntityType(me, ET_PET) 70 71 entity_setDamageTarget(me, DT_AVATAR_ENERGYBLAST, false) 72 entity_setDamageTarget(me, DT_AVATAR_SHOCK, false) 73 entity_setDamageTarget(me, DT_AVATAR_VOMIT, false) 74 entity_setDamageTarget(me, DT_AVATAR_SPORECHILD, false) 75 76 entity_setState(me, STATE_SEED) 77 78 v.seekEnemy = v.seekEnemyDelay 79end 80 81function songNote(me, note) 82 if note == 0 or note == 1 then 83 -- green 84 v.myType = 1 85 elseif note == 2 or note == 3 then 86 -- blue 87 v.myType = 2 88 elseif note == 4 or note == 5 then 89 -- red 90 v.myType = 0 91 elseif note == 6 or note == 7 then 92 -- yellow 93 v.myType = 3 94 end 95end 96 97local function hatch(me) 98 if v.myType == 0 then 99 entity_setState(me, STATE_SK_RED) 100 elseif v.myType == 1 then 101 entity_setState(me, STATE_SK_GREEN) 102 elseif v.myType == 2 then 103 entity_setState(me, STATE_SK_BLUE) 104 elseif v.myType == 3 then 105 entity_setState(me, STATE_SK_YELLOW) 106 end 107 108end 109 110local function isHatched(me) 111 return (entity_isState(me, STATE_SK_RED) or entity_isState(me, STATE_SK_BLUE) 112 or entity_isState(me, STATE_SK_GREEN) or entity_isState(me, STATE_SK_YELLOW)) 113end 114 115function update(me, dt) 116 registerSporeChildData(me) 117 entity_handleShotCollisions(me) 118 if isHatched(me) then 119 entity_updateCurrents(me, dt) 120 end 121 entity_updateMovement(me, dt) 122 123 if v.state2 == STATE_MOVETOFLOWER then 124 if not entity_isFollowingPath(me) or entity_isEntityInRange(me, v.flower, 128) then 125 v.state2 = STATE_OPENFLOWER 126 entity_animate(me, "openFlower", LOOP_INF) 127 entity_clearVel(me) 128 entity_setTarget(me, v.flower) 129 entity_stopFollowingPath(me) 130 v.flowerTimer = 0 131 end 132 end 133 if v.state2 == STATE_OPENFLOWER then 134 if entity_isState(v.flower, STATE_OPENED) then 135 v.state2 = 0 136 v.flower = 0 137 entity_animate(me, "idle", LOOP_INF) 138 entity_setState(me, entity_getState(me)) 139 else 140 v.flowerTimer = v.flowerTimer + dt 141 if v.flowerTimer < 1 then 142 entity_moveTowardsTarget(me, dt, 100) 143 else 144 entity_moveTowardsTarget(me, dt, -100) 145 end 146 if v.flowerTimer > 2 then 147 v.flowerTimer = 0 148 end 149 end 150 end 151 152 if entity_isState(me, STATE_SEED) then 153 local node = entity_getNearestNode(me, "GSPOT") 154 if node ~= 0 then 155 if node_isEntityIn(node, me) then 156 if v.growing then 157 v.growth = v.growth + dt 158 if v.growth > v.growTime then 159 hatch(me) 160 end 161 else 162 v.growing = true 163 entity_startEmitter(me, v.growEmitter) 164 end 165 else 166 if v.growing then 167 entity_stopEmitter(me, v.growEmitter) 168 end 169 v.growing = false 170 end 171 end 172 --elseif entity_isState(me, STATE_HATCHEDYOUNG) then 173 elseif isHatched(me) and v.state2==0 then 174 if not entity_hasTarget(me) then 175 local ent = entity_getNearestEntity(getNaija(), "SporeChildFlower") 176 if ent ~= 0 then 177 if entity_isEntityInRange(getNaija(), ent, 256) and entity_isState(ent, STATE_IDLE) then 178 v.flower = ent 179 v.state2 = STATE_MOVETOFLOWER 180 entity_swimToPosition(me, entity_getPosition(v.flower)) 181 end 182 end 183 entity_findTarget(me, 800, ET_AVATAR) 184 end 185 if entity_hasTarget(me) then 186 local ent = entity_getNearestEntity(getNaija(), "SporeChildFlower") 187 if ent ~= 0 and entity_isEntityInRange(getNaija(), ent, 64) and entity_isState(ent, STATE_IDLE) then 188 entity_setTarget(me, 0) 189 else 190 if entity_getHealth(entity_getTarget(me)) < 1 then 191 entity_setTarget(me, 0) 192 else 193 local target = entity_getTarget(me) 194 if entity_getEntityType(target)==ET_ENEMY then 195 v.seekEnemy = 0 196 entity_rotateToVel(me, 0) 197 entity_setMaxSpeedLerp(me, 1.0, 0.1) 198 if v.backAway > 0 then 199 v.backAway = v.backAway - dt 200 entity_moveTowardsTarget(me, dt, -2000) 201 if v.backAway < 0 then 202 v.backAway = 0 203 entity_setMaxSpeedLerp(me, 1.0, 0.2) 204 end 205 else 206 entity_moveTowardsTarget(me, dt, 2000) 207 end 208 entity_doCollisionAvoidance(me, dt, 2, 0.5) 209 if entity_isEntityInRange(me, target, 32 + entity_getCollideRadius(target)) then 210 entity_damage(target, me, 1, DT_AVATAR_SPORECHILD) 211 v.backAway = v.backAwayTime 212 entity_moveTowardsTarget(me, 1, -2000) 213 --entity_setMaxSpeedLerp(me, 0.01, 0.01) 214 --entity_setTarget(me, 0) 215 elseif not entity_isTargetInRange(me, 1500) then 216 entity_setTarget(me, 0) 217 end 218 entity_doEntityAvoidance(me, dt, 4, 1) 219 else 220 if entity_isTargetInRange(me, 220) then 221 entity_rotate(me, 0, 1.0) 222 else 223 entity_rotateToVel(me, 0.5) 224 end 225 -- if moving to naija 226 if entity_isEntityInRange(me, target, 200) then 227 if entity_isEntityInRange(me, target, 96) then 228 entity_moveTowardsTarget(me, dt, -100) 229 else 230 entity_moveTowardsTarget(me, dt, 1000) 231 end 232 entity_setMaxSpeedLerp(me, 0.2, 1.0) 233 else 234 entity_moveTowardsTarget(me, dt, 1500) 235 entity_setMaxSpeedLerp(me, 1.4, 0.1) 236 end 237 entity_doCollisionAvoidance(me, dt, 3, 0.5) 238 entity_doEntityAvoidance(me, dt, 32, 0.1) 239 end 240 end 241 end 242 end 243 v.seekEnemy = v.seekEnemy - dt 244 if v.seekEnemy < 0 then 245 if entity_isEntityInRange(me, getNaija(), 1000) then 246 if not entity_isEntityInRange(me, getNaija(), 500) then 247 entity_setMaxSpeedLerp(me, 2.0, 0.2) 248 else 249 entity_setMaxSpeedLerp(me, 1.0, 0.2) 250 end 251 --if entity_isState(me, STATE_SK_GREEN) then 252 entity_findTarget(me, 2000, ET_ENEMY) 253 local ent = entity_getTarget(me) 254 if ent ~=0 then 255 if not entity_isDamageTarget(ent, DT_AVATAR_SPORECHILD) then 256 entity_setTarget(me, 0) 257 entity_setMaxSpeed(me, v.minSpeed) 258 else 259 entity_setMaxSpeed(me, v.maxSpeed) 260 entity_setMaxSpeedLerp(me, 1.2, 0.1) 261 end 262 end 263 --end 264 else 265 entity_setTarget(me, getNaija()) 266 entity_setMaxSpeed(me, v.minSpeed) 267 end 268 v.seekEnemy = v.seekEnemyDelay 269 end 270 end 271end 272 273function hitSurface(me) 274end 275 276function enterState(me) 277 if entity_isState(me, STATE_SEED) then 278 v.growth = 0 279 entity_setProperty(me, EP_MOVABLE, true) 280 entity_setWeight(me, 200) 281 elseif isHatched(me) then 282 entity_setMaxSpeed(me, v.minSpeed) 283 --entity_setColor(me, 1, 0, 0, 0.5) 284 entity_setProperty(me, EP_MOVABLE, false) 285 entity_setWeight(me, 0) 286 if entity_isState(me, STATE_SK_RED) then 287 entity_initSkeletal(me, "SK-Red") 288 elseif entity_isState(me, STATE_SK_GREEN) then 289 entity_initSkeletal(me, "SK-Green") 290 elseif entity_isState(me, STATE_SK_BLUE) then 291 entity_initSkeletal(me, "SK-Blue") 292 elseif entity_isState(me, STATE_SK_YELLOW) then 293 entity_initSkeletal(me, "SK-Yellow") 294 end 295 entity_scale(me, 0.7, 0.7) 296 297 entity_animate(me, "idle", LOOP_INF) 298 elseif entity_isState(me, STATE_IDLE) then 299 entity_setProperty(me, EP_MOVABLE, false) 300 entity_setWeight(me, 0) 301 end 302end 303 304function damage(me, attacker, bone, damageType, dmg) 305 if damageType == DT_AVATAR_ENERGYBLAST then 306 return false 307 end 308 return true 309end 310 311function exitState(me) 312 if entity_isState(me, STATE_SEED) then 313 entity_stopEmitter(me, v.growEmitter) 314 end 315end 316