diff options
Diffstat (limited to 'server/server.lua')
-rw-r--r-- | server/server.lua | 111 |
1 files changed, 111 insertions, 0 deletions
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 |