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