summaryrefslogtreecommitdiff
path: root/client/main.lua
blob: 4375ed3e4a0089b869b7ffcfe056859993da980f (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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
local enet = require"enet"
local words = require"common.words"


local PLAYER_SIZE = 30

local local_player = false

-- {
-- 	pos={100,100},
-- 	color={love.math.colorFromBytes(0xdf,0x73,0xff)},
-- }

local host,peer

local function draw_player(pl,me)
	local hplsz = PLAYER_SIZE/2
	love.graphics.setColor(pl.color)
	love.graphics.rectangle("fill",pl.pos[1]-hplsz,pl.pos[2]-hplsz,PLAYER_SIZE,PLAYER_SIZE)
	love.graphics.setColor(0,0,0)
	love.graphics.print(tostring(pl.id),pl.pos[1],pl.pos[2])
	if me then
		love.graphics.setColor(1,1,1)
		love.graphics.rectangle("line",pl.pos[1]-hplsz,pl.pos[2]-hplsz,PLAYER_SIZE,PLAYER_SIZE)
	end
end

local remote_players = {}

local function update_local_player(pl,dt)
	local SPEED = 300 -- pixels/sec
	local function kd(code)
		if love.keyboard.isScancodeDown(code) then return 1 else return 0 end
	end
	local dx = kd"d"-kd"a"
	local dy = kd"s"-kd"w"

	if dx == 0 and dy == 0 then
		pl.pos_dirty = false
		return
	end

	if dx ~= 0 and dy ~= 0 then
		dx = dx / math.sqrt(2)
		dy = dy / math.sqrt(2)
	end

	pl.pos[1] = pl.pos[1] + SPEED * dt * dx
	pl.pos[2] = pl.pos[2] + SPEED * dt * dy
	pl.pos_dirty = true
end

local function sync_local_player(pl,peer)
	-- send updated info about local player to server
	if pl.pos_dirty then
		peer:send(words.join("ppos",pl.pos[1],pl.pos[2]))
	end
end

function love.update(dt)
	if local_player then
		update_local_player(local_player,dt)
		sync_local_player(local_player,peer)
	end
	repeat
		local ev = host:service()
		if ev and ev.type == "receive" then
			local w = words.split(ev.data)
			local op = w[1]
			if op == "join" then
				local id,x,y,r,g,b = unpack(w,2)
				-- blegh
				id=tonumber(id)
				x=tonumber(x)
				y=tonumber(y)
				r=tonumber(r)
				g=tonumber(g)
				b=tonumber(b)
				remote_players[id] = {pos={x,y},color={r,g,b},id=id}
			elseif op == "leave" then
				local id = tonumber(w[2])
				remote_players[id]=nil
			elseif op == "move" then
				local id,x,y = unpack(w,2)
				id=tonumber(id)
				x=tonumber(x)
				y=tonumber(y)
				assert(remote_players[id],"wheeze")
				remote_players[id].pos[1] = x
				remote_players[id].pos[2] = y
			elseif op == "you" then
				local id,x,y,r,g,b = unpack(w,2)
				id=tonumber(id)
				x=tonumber(x)
				y=tonumber(y)
				r=tonumber(r)
				g=tonumber(g)
				b=tonumber(b)
				local_player = {pos={x,y},color={r,g,b},id=id}
			end
		end
	until not ev
end

function love.draw()
	if local_player then
		draw_player(local_player,true)
	end
	for _,pl in pairs(remote_players) do
		draw_player(pl)
	end
end

function love.load()
	host = enet.host_create()
	peer = host:connect("localhost:8473")
end

function love.quit()
	peer:disconnect()
	host:flush()
end