summaryrefslogtreecommitdiff
path: root/src/controllers/fish.moon
blob: 9ba2d83a97fa13d39d2ee00503c4b5d4fc7fdddf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
ecs = require("ecs")
world = require("world")
controller = {}

class FishControllerComponent extends ecs.Component
	new: () =>
		--print("Fish controller started")
		@node = am.group!
	join: (entity) =>
		super(entity)
		graphic = entity\get("graphic")
		assert(graphic, "Fish controller must have a graphic")
		pred_component = entity\get("pred")
		assert(pred_component, "Fish controller must have a predicted component")
		net_component = entity\get("net")
		assert(net_component, "Fish controller must have a net component")
		@net = net_component
		graphic.node\append(@node)
		comp = @
		locpicker = coroutine.create(() =>
			comp\pick_next_location!
			coroutine.yield!
		)
		--either "swimming", "waiting", or "catching"
		@state = "swimming"
		@node\action(coroutine.create(() =>
			while comp.state == "swimming"
				comp.state = "waiting"
				start_wait = world.sync_time!
				while world.sync_time! - start_wait < 4
					--TODO: look for nearby hooks and get caught
					coroutine.yield!
				if comp.state == "waiting"
					comp\pick_next_location!
					comp.state = "swimming"
					while math.distance(pred_component.properties.pos, net_component.properties.next_loc) > 0.01
						--print("At ", pred_component.properties.pos, "waiting to get to next location, ", net_component.properties.next_loc, "it is ", math.distance(pred_component.properties.pos, net_component.properties.next_loc), " away")
						coroutine.yield!

		))
	pick_next_location: () =>
		-- Pick somewhere to swim based on where we are?
		-- This can only be done on the host.
		if @net.properties.pos.x > 10 -- pick somewhere to the right
			@net.properties.next_loc = vec2(
				math.random(10.3,12),
				math.random(-10,10)
			)
			@net.properties.next_loc_time = world.sync_time!
		--@net.properties.next_loc = @net.properties.pos + vec2(0,1)
		--@net.properties.next_loc_time = world.sync_time!
		--print("Picking next location, it was ", @net.properties.next_loc)

{:FishControllerComponent}