aboutsummaryrefslogtreecommitdiff
path: root/src/party.moon
diff options
context:
space:
mode:
Diffstat (limited to 'src/party.moon')
-rw-r--r--src/party.moon58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/party.moon b/src/party.moon
new file mode 100644
index 0000000..1c2fb7b
--- /dev/null
+++ b/src/party.moon
@@ -0,0 +1,58 @@
+-- Describes a player or enemy's party
+-- Parties can exist without any members
+room = require("room")
+main = require("main")
+char = require("char")
+import Character from char
+import LobbyRoom from room
+mod = ...
+
+class Party
+ new: =>
+ @members = {}
+ @rnode = am.group!
+ @node = am.translate(0,0)
+ @rnode\append(@node)
+ @room = LobbyRoom!
+ member: (uname) =>
+ assert(uname, "cannot find a nil party member")
+ assert(type(uname) == "string", "Member should be called with a peer id")
+ @members[uname]
+ nmembers: () =>
+ i = 0
+ for k,v in pairs(@members)
+ i += 1
+ i
+ add_member: (member) =>
+ assert(member.uname, "cannot add a nil party member")
+ assert(type(member.uname) == "string", "Member should be called with a peer id")
+ @members[member.uname] = member
+ member.party = @
+ @node\append(member.node)
+ remove_member: (member) =>
+ @members[member.uname] = nil
+ member.party = nil
+ @node\remove(member.node)
+ set_room: (nroom) =>
+ @room = nroom
+ for id, char in pairs(@members)
+ char\enter_room(nroom)
+
+ serialize: () =>
+ members = {}
+ for _, member in pairs(@members)
+ members[member.uname] = member\serialize!
+ am.to_json(members)
+
+ deserialize: (data) ->
+ rp = Party!
+ tbl = am.parse_json(data)
+ for uname, payload in pairs(tbl)
+ tchar = Character.deserialize(payload)
+ rp\add_member(tchar)
+ rp
+
+
+
+mod["Party"] = Party
+mod