summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
l---------server/common1
-rw-r--r--server/server.lua111
2 files changed, 112 insertions, 0 deletions
diff --git a/server/common b/server/common
new file mode 120000
index 0000000..60d3b0a
--- /dev/null
+++ b/server/common
@@ -0,0 +1 @@
+../common \ No newline at end of file
diff --git a/server/server.lua b/server/server.lua
new file mode 100644
index 0000000..4db0207
--- /dev/null
+++ b/server/server.lua
@@ -0,0 +1,111 @@
+local enet = require"enet"
+local words = require"common.words"
+local unpack = unpack or table.unpack
+
+math.randomseed(os.time())
+
+local host = enet.host_create("*:8473")
+print(host)
+
+-- sequential list of all players
+local playerlist = {}
+
+-- this is maybe suboptimal
+-- but it is simplest for now
+local function player_by_id(id)
+ for i,pl in ipairs(playerlist) do
+ if pl.id == id then return pl, i end
+ end
+ return nil
+end
+local function player_by_peer(peer)
+ for i,pl in ipairs(playerlist) do
+ if pl.peer == peer then return pl, i end
+ end
+ return nil
+end
+
+
+local function gen_id()
+ local x = math.random(100000)
+ -- if players[x] then error("cough") end
+ return x
+end
+local function random_color()
+ return {math.random(),math.random(),math.random()}
+end
+local function make_player(peer)
+ return {pos={100,100},color=random_color(),peer=peer}
+end
+
+-- maybe json could be used for this
+-- or something
+local function player_info_part(player)
+ return words.join(
+ player.id,
+ player.pos[1],
+ player.pos[2],
+ player.color[1],
+ player.color[2],
+ player.color[3])
+end
+local function player_join_packet(player)
+ return "join "..player_info_part(player)
+end
+local function player_you_packet(player)
+ return "you "..player_info_part(player)
+end
+local function player_leave_packet(player)
+ return words.join("leave",player.id)
+end
+local function player_move_packet(player,x,y)
+ return words.join("move",player.id,x,y)
+end
+
+while true do
+ local ev = host:service(100)
+ if ev then
+ if ev.type == "connect" then
+ local player = make_player(ev.peer)
+ table.insert(playerlist,player)
+ player.id = #playerlist
+ print("connect",player.peer,player.id)
+ player.peer:send(player_you_packet(player))
+
+ for i,otherplayer in ipairs(playerlist) do
+ if otherplayer ~= player then
+ -- tell new player about each other player
+ player.peer:send(player_join_packet(otherplayer))
+ -- tell each other player about new player
+ otherplayer.peer:send(player_join_packet(player))
+ end
+ end
+ elseif ev.type == "disconnect" then
+ local player, idx = player_by_peer(ev.peer)
+ if not player then error("sneeze "..ev.peer) end
+ table.remove(playerlist,idx)
+ for i,otherplayer in ipairs(playerlist) do
+ otherplayer.peer:send(player_leave_packet(player))
+ end
+ elseif ev.type == "receive" then
+ local player = player_by_peer(ev.peer)
+ if not player then error("sneezey "..ev.peer) end
+ local w = words.split(ev.data)
+ local op = w[1]
+ if op == "ppos" then
+ local _,x,y,a = unpack(w)
+ player.pos[1] = tonumber(x)
+ player.pos[2] = tonumber(y)
+ print(player.id,"-->",player.pos[1],player.pos[2])
+ for i,otherplayer in ipairs(playerlist) do
+ if otherplayer ~= player then
+ otherplayer.peer:send(player_move_packet(player,x,y))
+ end
+ end
+ end
+
+ end
+ -- for k,v in pairs(ev) do io.write(tostring(k),":",tostring(v)," ") end
+ -- print()
+ end
+end