~hutzdog/Traitors-in-the-Coven

977775fcdbda6a5374a2289f4a7283831705915c — Danielle Hutzley 10 months ago 89092c9
Update files, remove design documentation and move it to another repo
10 files changed, 38 insertions(+), 182 deletions(-)

M .gitignore
D ARCHITECTURE.mdj
D DESIGN.md
M README.md
M common/src/lib.rs
M server/src/assets.rs
M server/src/auth.rs
M server/src/main.rs
M server/src/net.rs
M server/src/player.rs
M .gitignore => .gitignore +2 -0
@@ 1,1 1,3 @@
/target
/private


D ARCHITECTURE.mdj => ARCHITECTURE.mdj +0 -1
@@ 1,1 0,0 @@
{"_type":"Project","_id":"AAAAAAFF+h6SjaM2Hec=","name":"Traitors in the Coven","ownedElements":[{"_type":"C4Model","_id":"AAAAAAGNC+f27QAcH1U=","_parent":{"$ref":"AAAAAAFF+h6SjaM2Hec="},"name":"C4 Model","ownedElements":[{"_type":"C4Diagram","_id":"AAAAAAGNC+gi5wAhjUU=","_parent":{"$ref":"AAAAAAGNC+f27QAcH1U="},"name":"C4 Model","defaultDiagram":true,"ownedViews":[{"_type":"C4PersonView","_id":"AAAAAAGNC+ppfwBw9tM=","_parent":{"$ref":"AAAAAAGNC+gi5wAhjUU="},"model":{"$ref":"AAAAAAGNC+ppfgBu7eI="},"subViews":[{"_type":"LabelView","_id":"AAAAAAGNC+ppfwBxka0=","_parent":{"$ref":"AAAAAAGNC+ppfwBw9tM="},"fillColor":"#38bcff","font":"Arial;13;1","left":632,"top":108,"width":67.919921875,"height":13,"text":"Player","wordWrap":true},{"_type":"LabelView","_id":"AAAAAAGNC+ppfwByrio=","_parent":{"$ref":"AAAAAAGNC+ppfwBw9tM="},"fillColor":"#38bcff","font":"Arial;13;0","left":632,"top":123,"width":67.919921875,"height":13,"text":"[Person]","wordWrap":true},{"_type":"LabelView","_id":"AAAAAAGNC+ppfwBz15E=","_parent":{"$ref":"AAAAAAGNC+ppfwBw9tM="},"fillColor":"#38bcff","font":"Arial;13;0","left":632,"top":146,"width":67.919921875,"height":26,"text":"A player of the game","wordWrap":true}],"fillColor":"#38bcff","font":"Arial;13;0","left":624,"top":64,"width":83.919921875,"height":116,"nameLabel":{"$ref":"AAAAAAGNC+ppfwBxka0="},"technologyLabel":{"$ref":"AAAAAAGNC+ppfwByrio="},"descriptionLabel":{"$ref":"AAAAAAGNC+ppfwBz15E="}},{"_type":"C4SoftwareSystemView","_id":"AAAAAAGNC+w1aQCDOwE=","_parent":{"$ref":"AAAAAAGNC+gi5wAhjUU="},"model":{"$ref":"AAAAAAGNC+w1aQCBcVw="},"subViews":[{"_type":"LabelView","_id":"AAAAAAGNC+w1aQCEfZI=","_parent":{"$ref":"AAAAAAGNC+w1aQCDOwE="},"fillColor":"#FFFFFF00","font":"Arial;13;1","left":280,"top":304,"width":680,"height":13,"text":"Game","wordWrap":true},{"_type":"LabelView","_id":"AAAAAAGNC+w1aQCFIA0=","_parent":{"$ref":"AAAAAAGNC+w1aQCDOwE="},"fillColor":"#FFFFFF00","font":"Arial;13;0","left":280,"top":319,"width":680,"height":13,"text":"[Software System]","wordWrap":true},{"_type":"LabelView","_id":"AAAAAAGNC+w1aQCGJmQ=","_parent":{"$ref":"AAAAAAGNC+w1aQCDOwE="},"fillColor":"#FFFFFF00","font":"Arial;13;0","left":280,"top":342,"width":680,"wordWrap":true}],"fillColor":"#FFFFFF00","font":"Arial;13;0","left":272,"top":296,"width":696,"height":488,"nameLabel":{"$ref":"AAAAAAGNC+w1aQCEfZI="},"technologyLabel":{"$ref":"AAAAAAGNC+w1aQCFIA0="},"descriptionLabel":{"$ref":"AAAAAAGNC+w1aQCGJmQ="}},{"_type":"C4ContainerView","_id":"AAAAAAGNC+001QCZ2oM=","_parent":{"$ref":"AAAAAAGNC+gi5wAhjUU="},"model":{"$ref":"AAAAAAGNC+001ACXkpo="},"subViews":[{"_type":"LabelView","_id":"AAAAAAGNC+001QCapG4=","_parent":{"$ref":"AAAAAAGNC+001QCZ2oM="},"fillColor":"#a3e0ff","font":"Arial;13;1","left":304,"top":666,"width":136,"height":13,"text":"Database","wordWrap":true},{"_type":"LabelView","_id":"AAAAAAGNC+001QCbuYA=","_parent":{"$ref":"AAAAAAGNC+001QCZ2oM="},"fillColor":"#a3e0ff","font":"Arial;13;0","left":304,"top":681,"width":136,"height":13,"text":"[Container: Sled]","wordWrap":true},{"_type":"LabelView","_id":"AAAAAAGNC+001QCcSfw=","_parent":{"$ref":"AAAAAAGNC+001QCZ2oM="},"fillColor":"#a3e0ff","font":"Arial;13;0","left":304,"top":704,"width":136,"height":52,"text":"Stores user login information, ban statistics, and other information","wordWrap":true}],"fillColor":"#a3e0ff","font":"Arial;13;0","left":296,"top":624,"width":152,"height":140,"nameLabel":{"$ref":"AAAAAAGNC+001QCapG4="},"technologyLabel":{"$ref":"AAAAAAGNC+001QCbuYA="},"descriptionLabel":{"$ref":"AAAAAAGNC+001QCcSfw="}},{"_type":"C4ContainerView","_id":"AAAAAAGNC+65lgCy7oo=","_parent":{"$ref":"AAAAAAGNC+gi5wAhjUU="},"model":{"$ref":"AAAAAAGNC+65lgCwd9k="},"subViews":[{"_type":"LabelView","_id":"AAAAAAGNC+65lwCzewo=","_parent":{"$ref":"AAAAAAGNC+65lgCy7oo="},"fillColor":"#a3e0ff","font":"Arial;13;1","left":576,"top":656,"width":192,"height":13,"text":"Server","wordWrap":true},{"_type":"LabelView","_id":"AAAAAAGNC+65lwC0H+M=","_parent":{"$ref":"AAAAAAGNC+65lgCy7oo="},"fillColor":"#a3e0ff","font":"Arial;13;0","left":576,"top":671,"width":192,"height":13,"text":"[Container: Rust + Bevy]","wordWrap":true},{"_type":"LabelView","_id":"AAAAAAGNC+65lwC15z4=","_parent":{"$ref":"AAAAAAGNC+65lgCy7oo="},"fillColor":"#a3e0ff","font":"Arial;13;0","left":576,"top":694,"width":192,"height":39,"text":"Handles all game logic using minimal, generic information sent from clients","wordWrap":true}],"fillColor":"#a3e0ff","font":"Arial;13;0","left":568,"top":648,"width":208,"height":104,"nameLabel":{"$ref":"AAAAAAGNC+65lwCzewo="},"technologyLabel":{"$ref":"AAAAAAGNC+65lwC0H+M="},"descriptionLabel":{"$ref":"AAAAAAGNC+65lwC15z4="}},{"_type":"C4RelationshipView","_id":"AAAAAAGNC/AODAEquec=","_parent":{"$ref":"AAAAAAGNC+gi5wAhjUU="},"model":{"$ref":"AAAAAAGNC/AODAEoxR8="},"subViews":[{"_type":"EdgeLabelView","_id":"AAAAAAGNC/AODAErn9A=","_parent":{"$ref":"AAAAAAGNC/AODAEquec="},"model":{"$ref":"AAAAAAGNC/AODAEoxR8="},"font":"Arial;13;0","left":475,"top":705,"width":64.7841796875,"height":13,"alpha":1.5707963267948966,"distance":15,"hostEdge":{"$ref":"AAAAAAGNC/AODAEquec="},"edgePosition":1,"text":"Read/Write","wordWrap":true},{"_type":"EdgeLabelView","_id":"AAAAAAGNC/AODAEsNPs=","_parent":{"$ref":"AAAAAAGNC/AODAEquec="},"model":{"$ref":"AAAAAAGNC/AODAEoxR8="},"font":"Arial;13;0","left":457,"top":676,"width":102,"height":13,"alpha":-1.5707963267948966,"distance":15,"hostEdge":{"$ref":"AAAAAAGNC/AODAEquec="},"edgePosition":1,"text":"[Embedded API]","wordWrap":true}],"font":"Arial;13;0","head":{"$ref":"AAAAAAGNC+001QCZ2oM="},"tail":{"$ref":"AAAAAAGNC+65lgCy7oo="},"lineStyle":1,"points":"567:698;449:696","descriptionLabel":{"$ref":"AAAAAAGNC/AODAErn9A="},"technologyLabel":{"$ref":"AAAAAAGNC/AODAEsNPs="}},{"_type":"C4ContainerView","_id":"AAAAAAGNC/e87AFY8PY=","_parent":{"$ref":"AAAAAAGNC+gi5wAhjUU="},"model":{"$ref":"AAAAAAGNC/e87AFWklc="},"subViews":[{"_type":"LabelView","_id":"AAAAAAGNC/e87AFZmNA=","_parent":{"$ref":"AAAAAAGNC/e87AFY8PY="},"fillColor":"#a3e0ff","font":"Arial;13;1","left":576,"top":364,"width":168,"height":13,"text":"Desktop Client","wordWrap":true},{"_type":"LabelView","_id":"AAAAAAGNC/e87AFa2b4=","_parent":{"$ref":"AAAAAAGNC/e87AFY8PY="},"fillColor":"#a3e0ff","font":"Arial;13;0","left":576,"top":379,"width":168,"height":13,"text":"[Container: Rust + Bevy]","wordWrap":true},{"_type":"LabelView","_id":"AAAAAAGNC/e87AFbgaM=","_parent":{"$ref":"AAAAAAGNC/e87AFY8PY="},"fillColor":"#a3e0ff","font":"Arial;13;0","left":576,"top":402,"width":168,"height":26,"text":"Client used by most users on desktop\n","wordWrap":true}],"fillColor":"#a3e0ff","font":"Arial;13;0","left":568,"top":344,"width":184,"height":92,"nameLabel":{"$ref":"AAAAAAGNC/e87AFZmNA="},"technologyLabel":{"$ref":"AAAAAAGNC/e87AFa2b4="},"descriptionLabel":{"$ref":"AAAAAAGNC/e87AFbgaM="}},{"_type":"C4ContainerView","_id":"AAAAAAGNC/h76gFsIUw=","_parent":{"$ref":"AAAAAAGNC+gi5wAhjUU="},"model":{"$ref":"AAAAAAGNC/h76gFqYI4="},"subViews":[{"_type":"LabelView","_id":"AAAAAAGNC/h76gFtR3w=","_parent":{"$ref":"AAAAAAGNC/h76gFsIUw="},"fillColor":"#a3e0ff","font":"Arial;13;1","left":552,"top":504,"width":240,"height":13,"text":"Client Library","wordWrap":true},{"_type":"LabelView","_id":"AAAAAAGNC/h76gFuPjk=","_parent":{"$ref":"AAAAAAGNC/h76gFsIUw="},"fillColor":"#a3e0ff","font":"Arial;13;0","left":552,"top":519,"width":240,"height":13,"text":"[Container: Rust + Bevy]","wordWrap":true},{"_type":"LabelView","_id":"AAAAAAGNC/h76gFvRJ0=","_parent":{"$ref":"AAAAAAGNC/h76gFsIUw="},"fillColor":"#a3e0ff","font":"Arial;13;0","left":552,"top":542,"width":240,"height":26,"text":"Abstraction layer over the Renet based API, used to implement all clients","wordWrap":true}],"fillColor":"#a3e0ff","font":"Arial;13;0","left":544,"top":496,"width":256,"height":96,"nameLabel":{"$ref":"AAAAAAGNC/h76gFtR3w="},"technologyLabel":{"$ref":"AAAAAAGNC/h76gFuPjk="},"descriptionLabel":{"$ref":"AAAAAAGNC/h76gFvRJ0="}},{"_type":"C4RelationshipView","_id":"AAAAAAGNC/khFgGITb0=","_parent":{"$ref":"AAAAAAGNC+gi5wAhjUU="},"model":{"$ref":"AAAAAAGNC/khFgGGZyA="},"subViews":[{"_type":"EdgeLabelView","_id":"AAAAAAGNC/khFgGJMD8=","_parent":{"$ref":"AAAAAAGNC/khFgGITb0="},"model":{"$ref":"AAAAAAGNC/khFgGGZyA="},"font":"Arial;13;0","left":692,"top":602,"width":72,"height":26,"alpha":1.6581308136267014,"distance":56.43580423808985,"hostEdge":{"$ref":"AAAAAAGNC/khFgGITb0="},"edgePosition":1,"text":"Two-way messaging\n","wordWrap":true},{"_type":"EdgeLabelView","_id":"AAAAAAGNC/khFgGK7qY=","_parent":{"$ref":"AAAAAAGNC/khFgGITb0="},"model":{"$ref":"AAAAAAGNC/khFgGGZyA="},"font":"Arial;13;0","left":697,"top":633,"width":41.91357421875,"height":13,"alpha":1.160788193028375,"distance":49.39635614091387,"hostEdge":{"$ref":"AAAAAAGNC/khFgGITb0="},"edgePosition":1,"text":"[Renet]","wordWrap":true}],"font":"Arial;13;0","head":{"$ref":"AAAAAAGNC+65lgCy7oo="},"tail":{"$ref":"AAAAAAGNC/h76gFsIUw="},"lineStyle":1,"points":"672:593;672:647","descriptionLabel":{"$ref":"AAAAAAGNC/khFgGJMD8="},"technologyLabel":{"$ref":"AAAAAAGNC/khFgGK7qY="}},{"_type":"C4RelationshipView","_id":"AAAAAAGNC/vtfgG1xa0=","_parent":{"$ref":"AAAAAAGNC+gi5wAhjUU="},"model":{"$ref":"AAAAAAGNC/vtfQGzckU="},"subViews":[{"_type":"EdgeLabelView","_id":"AAAAAAGNC/vtfgG2JJU=","_parent":{"$ref":"AAAAAAGNC/vtfgG1xa0="},"model":{"$ref":"AAAAAAGNC/vtfQGzckU="},"font":"Arial;13;0","left":626,"top":439,"width":62.8798828125,"height":26,"alpha":-2.9836513683694115,"distance":13.341664064126334,"hostEdge":{"$ref":"AAAAAAGNC/vtfgG1xa0="},"edgePosition":1,"text":"Embedded API","wordWrap":true},{"_type":"EdgeLabelView","_id":"AAAAAAGNC/vtfgG3C0k=","_parent":{"$ref":"AAAAAAGNC/vtfgG1xa0="},"model":{"$ref":"AAAAAAGNC/vtfQGzckU="},"visible":false,"font":"Arial;13;0","left":641,"top":460,"width":8.658203125,"height":13,"alpha":-1.5707963267948966,"distance":15,"hostEdge":{"$ref":"AAAAAAGNC/vtfgG1xa0="},"edgePosition":1,"text":"[]","wordWrap":true}],"font":"Arial;13;0","head":{"$ref":"AAAAAAGNC/h76gFsIUw="},"tail":{"$ref":"AAAAAAGNC/e87AFY8PY="},"points":"660:436;660:496","descriptionLabel":{"$ref":"AAAAAAGNC/vtfgG2JJU="},"technologyLabel":{"$ref":"AAAAAAGNC/vtfgG3C0k="}},{"_type":"C4ContainerView","_id":"AAAAAAGNC/w6NQHT5PE=","_parent":{"$ref":"AAAAAAGNC+gi5wAhjUU="},"model":{"$ref":"AAAAAAGNC/w6NQHR6YU="},"subViews":[{"_type":"LabelView","_id":"AAAAAAGNC/w6NQHUIPg=","_parent":{"$ref":"AAAAAAGNC/w6NQHT5PE="},"fillColor":"#a3e0ff","font":"Arial;13;1","left":344,"top":366,"width":200,"height":13,"text":"Web Client","wordWrap":true},{"_type":"LabelView","_id":"AAAAAAGNC/w6NQHVcks=","_parent":{"$ref":"AAAAAAGNC/w6NQHT5PE="},"fillColor":"#a3e0ff","font":"Arial;13;0","left":344,"top":381,"width":200,"height":13,"text":"[Container: Rust + Bevy + WASM]","wordWrap":true},{"_type":"LabelView","_id":"AAAAAAGNC/w6NQHW914=","_parent":{"$ref":"AAAAAAGNC/w6NQHT5PE="},"fillColor":"#a3e0ff","font":"Arial;13;0","left":344,"top":404,"width":200,"height":26,"text":"A web based client with semi-limited features","wordWrap":true}],"fillColor":"#a3e0ff","font":"Arial;13;0","left":336,"top":336,"width":216,"height":104,"nameLabel":{"$ref":"AAAAAAGNC/w6NQHUIPg="},"technologyLabel":{"$ref":"AAAAAAGNC/w6NQHVcks="},"descriptionLabel":{"$ref":"AAAAAAGNC/w6NQHW914="}},{"_type":"C4RelationshipView","_id":"AAAAAAGNC/0gSQHt0as=","_parent":{"$ref":"AAAAAAGNC+gi5wAhjUU="},"model":{"$ref":"AAAAAAGNC/0gSQHrFZs="},"subViews":[{"_type":"EdgeLabelView","_id":"AAAAAAGNC/0gSQHuYrQ=","_parent":{"$ref":"AAAAAAGNC/0gSQHt0as="},"model":{"$ref":"AAAAAAGNC/0gSQHrFZs="},"font":"Arial;13;0","left":400,"top":487,"width":62.8798828125,"height":26,"alpha":-3.9757327958936273,"distance":58.05170109479997,"hostEdge":{"$ref":"AAAAAAGNC/0gSQHt0as="},"edgePosition":1,"text":"Embedded API","wordWrap":true},{"_type":"EdgeLabelView","_id":"AAAAAAGNC/0gSQHvseE=","_parent":{"$ref":"AAAAAAGNC/0gSQHt0as="},"model":{"$ref":"AAAAAAGNC/0gSQHrFZs="},"visible":false,"font":"Arial;13;0","left":466,"top":553,"width":8.658203125,"height":13,"alpha":-1.5707963267948966,"distance":15,"hostEdge":{"$ref":"AAAAAAGNC/0gSQHt0as="},"edgePosition":1,"text":"[]","wordWrap":true}],"font":"Arial;13;0","head":{"$ref":"AAAAAAGNC/h76gFsIUw="},"tail":{"$ref":"AAAAAAGNC/w6NQHT5PE="},"points":"470:440;470:544;544:544","descriptionLabel":{"$ref":"AAAAAAGNC/0gSQHuYrQ="},"technologyLabel":{"$ref":"AAAAAAGNC/0gSQHvseE="}},{"_type":"C4ContainerView","_id":"AAAAAAGNC/2DkQINnR0=","_parent":{"$ref":"AAAAAAGNC+gi5wAhjUU="},"model":{"$ref":"AAAAAAGNC/2DkQILFU8="},"subViews":[{"_type":"LabelView","_id":"AAAAAAGNC/2DkQIOXAQ=","_parent":{"$ref":"AAAAAAGNC/2DkQINnR0="},"fillColor":"#a3e0ff","font":"Arial;13;1","left":784,"top":374,"width":144,"height":13,"text":"Terminal Client","wordWrap":true},{"_type":"LabelView","_id":"AAAAAAGNC/2DkQIPaMg=","_parent":{"$ref":"AAAAAAGNC/2DkQINnR0="},"fillColor":"#a3e0ff","font":"Arial;13;0","left":784,"top":389,"width":144,"height":13,"text":"[Container: Rust + Bevy]","wordWrap":true},{"_type":"LabelView","_id":"AAAAAAGNC/2DkQIQcK0=","_parent":{"$ref":"AAAAAAGNC/2DkQINnR0="},"fillColor":"#a3e0ff","font":"Arial;13;0","left":784,"top":412,"width":144,"height":26,"text":"A CLI client for terminal users","wordWrap":true}],"fillColor":"#a3e0ff","font":"Arial;13;0","left":776,"top":344,"width":160,"height":102,"nameLabel":{"$ref":"AAAAAAGNC/2DkQIOXAQ="},"technologyLabel":{"$ref":"AAAAAAGNC/2DkQIPaMg="},"descriptionLabel":{"$ref":"AAAAAAGNC/2DkQIQcK0="}},{"_type":"C4RelationshipView","_id":"AAAAAAGNC/7RSwI7r/E=","_parent":{"$ref":"AAAAAAGNC+gi5wAhjUU="},"model":{"$ref":"AAAAAAGNC/7RSwI5KpI="},"subViews":[{"_type":"EdgeLabelView","_id":"AAAAAAGNC/7RSwI8myE=","_parent":{"$ref":"AAAAAAGNC/7RSwI7r/E="},"model":{"$ref":"AAAAAAGNC/7RSwI5KpI="},"font":"Arial;13;0","left":864,"top":480,"width":62.8798828125,"height":26,"alpha":3.9757325407007484,"distance":58.05170109479997,"hostEdge":{"$ref":"AAAAAAGNC/7RSwI7r/E="},"edgePosition":1,"text":"Embedded API","wordWrap":true},{"_type":"EdgeLabelView","_id":"AAAAAAGNC/7RSwI99os=","_parent":{"$ref":"AAAAAAGNC/7RSwI7r/E="},"model":{"$ref":"AAAAAAGNC/7RSwI5KpI="},"visible":false,"font":"Arial;13;0","left":852,"top":515,"width":8.658203125,"height":13,"alpha":-1.5707963267948966,"distance":15,"hostEdge":{"$ref":"AAAAAAGNC/7RSwI7r/E="},"edgePosition":1,"text":"[]","wordWrap":true}],"font":"Arial;13;0","head":{"$ref":"AAAAAAGNC/h76gFsIUw="},"tail":{"$ref":"AAAAAAGNC/2DkQINnR0="},"points":"856:446;856:536;800:536","descriptionLabel":{"$ref":"AAAAAAGNC/7RSwI8myE="},"technologyLabel":{"$ref":"AAAAAAGNC/7RSwI99os="}},{"_type":"C4RelationshipView","_id":"AAAAAAGNC/9K/wJP6jo=","_parent":{"$ref":"AAAAAAGNC+gi5wAhjUU="},"model":{"$ref":"AAAAAAGNC/9K/gJN6p4="},"subViews":[{"_type":"EdgeLabelView","_id":"AAAAAAGNC/9K/wJQImM=","_parent":{"$ref":"AAAAAAGNC/9K/wJP6jo="},"model":{"$ref":"AAAAAAGNC/9K/gJN6p4="},"font":"Arial;13;0","left":513,"top":251,"width":60.7890625,"height":26,"alpha":-0.12249591644775304,"distance":15.620499351813308,"hostEdge":{"$ref":"AAAAAAGNC/9K/wJP6jo="},"edgePosition":1,"text":"Plays on the web","wordWrap":true},{"_type":"EdgeLabelView","_id":"AAAAAAGNC/9K/wJRLDg=","_parent":{"$ref":"AAAAAAGNC/9K/wJP6jo="},"model":{"$ref":"AAAAAAGNC/9K/gJN6p4="},"visible":false,"font":"Arial;13;0","left":539,"top":238,"width":8.658203125,"height":13,"alpha":-1.5707963267948966,"distance":15,"hostEdge":{"$ref":"AAAAAAGNC/9K/wJP6jo="},"edgePosition":1,"text":"[]","wordWrap":true}],"font":"Arial;13;0","head":{"$ref":"AAAAAAGNC/w6NQHT5PE="},"tail":{"$ref":"AAAAAAGNC+ppfwBw9tM="},"lineStyle":1,"points":"623:173;488:335","descriptionLabel":{"$ref":"AAAAAAGNC/9K/wJQImM="},"technologyLabel":{"$ref":"AAAAAAGNC/9K/wJRLDg="}},{"_type":"C4RelationshipView","_id":"AAAAAAGNC/+mkQJfG6Y=","_parent":{"$ref":"AAAAAAGNC+gi5wAhjUU="},"model":{"$ref":"AAAAAAGNC/+mkQJdmpw="},"subViews":[{"_type":"EdgeLabelView","_id":"AAAAAAGNC/+mkQJgVtQ=","_parent":{"$ref":"AAAAAAGNC/+mkQJfG6Y="},"model":{"$ref":"AAAAAAGNC/+mkQJdmpw="},"font":"Arial;13;0","left":611,"top":236,"width":92.47265625,"height":26,"alpha":-2.8112699898457967,"distance":13.341664064126334,"hostEdge":{"$ref":"AAAAAAGNC/+mkQJfG6Y="},"edgePosition":1,"text":"Plays on Steam/GOG/etc","wordWrap":true},{"_type":"EdgeLabelView","_id":"AAAAAAGNC/+mkQJhorg=","_parent":{"$ref":"AAAAAAGNC/+mkQJfG6Y="},"model":{"$ref":"AAAAAAGNC/+mkQJdmpw="},"visible":false,"font":"Arial;13;0","left":643,"top":255,"width":8.658203125,"height":13,"alpha":-1.5707963267948966,"distance":15,"hostEdge":{"$ref":"AAAAAAGNC/+mkQJfG6Y="},"edgePosition":1,"text":"[]","wordWrap":true}],"font":"Arial;13;0","head":{"$ref":"AAAAAAGNC/e87AFY8PY="},"tail":{"$ref":"AAAAAAGNC+ppfwBw9tM="},"lineStyle":1,"points":"664:181;661:343","descriptionLabel":{"$ref":"AAAAAAGNC/+mkQJgVtQ="},"technologyLabel":{"$ref":"AAAAAAGNC/+mkQJhorg="}},{"_type":"C4RelationshipView","_id":"AAAAAAGNC//+MwJuGlA=","_parent":{"$ref":"AAAAAAGNC+gi5wAhjUU="},"model":{"$ref":"AAAAAAGNC//+MgJsrn8="},"subViews":[{"_type":"EdgeLabelView","_id":"AAAAAAGNC//+MwJvH8U=","_parent":{"$ref":"AAAAAAGNC//+MwJuGlA="},"model":{"$ref":"AAAAAAGNC//+MgJsrn8="},"font":"Arial;13;0","left":750,"top":240,"width":51.29541015625,"height":26,"alpha":1.5707963267948966,"distance":15,"hostEdge":{"$ref":"AAAAAAGNC//+MwJuGlA="},"edgePosition":1,"text":"Plays on terminal","wordWrap":true},{"_type":"EdgeLabelView","_id":"AAAAAAGNC//+MwJwPDc=","_parent":{"$ref":"AAAAAAGNC//+MwJuGlA="},"model":{"$ref":"AAAAAAGNC//+MgJsrn8="},"visible":false,"font":"Arial;13;0","left":746,"top":264,"width":8.658203125,"height":13,"alpha":-1.5707963267948966,"distance":15,"hostEdge":{"$ref":"AAAAAAGNC//+MwJuGlA="},"edgePosition":1,"text":"[]","wordWrap":true}],"font":"Arial;13;0","head":{"$ref":"AAAAAAGNC/2DkQINnR0="},"tail":{"$ref":"AAAAAAGNC+ppfwBw9tM="},"lineStyle":1,"points":"706:181;820:343","descriptionLabel":{"$ref":"AAAAAAGNC//+MwJvH8U="},"technologyLabel":{"$ref":"AAAAAAGNC//+MwJwPDc="}}]},{"_type":"C4Person","_id":"AAAAAAGNC+ppfgBu7eI=","_parent":{"$ref":"AAAAAAGNC+f27QAcH1U="},"name":"Player","ownedElements":[{"_type":"C4Relationship","_id":"AAAAAAGNC/9K/gJN6p4=","_parent":{"$ref":"AAAAAAGNC+ppfgBu7eI="},"source":{"$ref":"AAAAAAGNC+ppfgBu7eI="},"target":{"$ref":"AAAAAAGNC/w6NQHR6YU="},"description":"Plays on the web"},{"_type":"C4Relationship","_id":"AAAAAAGNC/+mkQJdmpw=","_parent":{"$ref":"AAAAAAGNC+ppfgBu7eI="},"source":{"$ref":"AAAAAAGNC+ppfgBu7eI="},"target":{"$ref":"AAAAAAGNC/e87AFWklc="},"description":"Plays on Steam/GOG/etc"},{"_type":"C4Relationship","_id":"AAAAAAGNC//+MgJsrn8=","_parent":{"$ref":"AAAAAAGNC+ppfgBu7eI="},"source":{"$ref":"AAAAAAGNC+ppfgBu7eI="},"target":{"$ref":"AAAAAAGNC/2DkQILFU8="},"description":"Plays on terminal"}],"description":"A player of the game"},{"_type":"C4SoftwareSystem","_id":"AAAAAAGNC+w1aQCBcVw=","_parent":{"$ref":"AAAAAAGNC+f27QAcH1U="},"name":"Game","ownedElements":[{"_type":"C4Container","_id":"AAAAAAGNC+001ACXkpo=","_parent":{"$ref":"AAAAAAGNC+w1aQCBcVw="},"name":"Database","technology":"Sled","description":"Stores user login information, ban statistics, and other information","kind":"database"},{"_type":"C4Container","_id":"AAAAAAGNC+65lgCwd9k=","_parent":{"$ref":"AAAAAAGNC+w1aQCBcVw="},"name":"Server","ownedElements":[{"_type":"C4Relationship","_id":"AAAAAAGNC/AODAEoxR8=","_parent":{"$ref":"AAAAAAGNC+65lgCwd9k="},"name":"Sled API","source":{"$ref":"AAAAAAGNC+65lgCwd9k="},"target":{"$ref":"AAAAAAGNC+001ACXkpo="},"technology":"Embedded API","description":"Read/Write"}],"documentation":"The server should do most processing, leaving clients to be little more than just a UI which configures information. This allows for maximum server modding flexibility (with compatibility with vanilla clients) and minimizes room for cheating.","technology":"Rust + Bevy","description":"Handles all game logic using minimal, generic information sent from clients","kind":"server-webapp"},{"_type":"C4Container","_id":"AAAAAAGNC/e87AFWklc=","_parent":{"$ref":"AAAAAAGNC+w1aQCBcVw="},"name":"Desktop Client","ownedElements":[{"_type":"C4Relationship","_id":"AAAAAAGNC/vtfQGzckU=","_parent":{"$ref":"AAAAAAGNC/e87AFWklc="},"name":"Embedded API","source":{"$ref":"AAAAAAGNC/e87AFWklc="},"target":{"$ref":"AAAAAAGNC/h76gFqYI4="},"description":"Embedded API"}],"technology":"Rust + Bevy","description":"Client used by most users on desktop\n","kind":"desktop-app"},{"_type":"C4Container","_id":"AAAAAAGNC/h76gFqYI4=","_parent":{"$ref":"AAAAAAGNC+w1aQCBcVw="},"name":"Client Library","ownedElements":[{"_type":"C4Relationship","_id":"AAAAAAGNC/khFgGGZyA=","_parent":{"$ref":"AAAAAAGNC/h76gFqYI4="},"name":"API Calls","source":{"$ref":"AAAAAAGNC/h76gFqYI4="},"target":{"$ref":"AAAAAAGNC+65lgCwd9k="},"technology":"Renet","description":"Two-way messaging\n"}],"technology":"Rust + Bevy","description":"Abstraction layer over the Renet based API, used to implement all clients","kind":"etc"},{"_type":"C4Container","_id":"AAAAAAGNC/2DkQILFU8=","_parent":{"$ref":"AAAAAAGNC+w1aQCBcVw="},"name":"Terminal Client","ownedElements":[{"_type":"C4Relationship","_id":"AAAAAAGNC/7RSwI5KpI=","_parent":{"$ref":"AAAAAAGNC/2DkQILFU8="},"source":{"$ref":"AAAAAAGNC/2DkQILFU8="},"target":{"$ref":"AAAAAAGNC/h76gFqYI4="},"description":"Embedded API"}],"technology":"Rust + Bevy","description":"A CLI client for terminal users","kind":"console-app"},{"_type":"C4Container","_id":"AAAAAAGNC/w6NQHR6YU=","_parent":{"$ref":"AAAAAAGNC+w1aQCBcVw="},"name":"Web Client","ownedElements":[{"_type":"C4Relationship","_id":"AAAAAAGNC/0gSQHrFZs=","_parent":{"$ref":"AAAAAAGNC/w6NQHR6YU="},"name":"Embedded API","source":{"$ref":"AAAAAAGNC/w6NQHR6YU="},"target":{"$ref":"AAAAAAGNC/h76gFqYI4="},"description":"Embedded API"}],"technology":"Rust + Bevy + WASM","description":"A web based client with semi-limited features","kind":"client-webapp"}]}]},{"_type":"UMLModel","_id":"AAAAAAGNDqynnAKAFn4=","_parent":{"$ref":"AAAAAAFF+h6SjaM2Hec="},"name":"Server Class Model","ownedElements":[{"_type":"UMLClassDiagram","_id":"AAAAAAGNDqynnAKBh7A=","_parent":{"$ref":"AAAAAAGNDqynnAKAFn4="},"name":"Server Classes","documentation":"Data types used in the TITC ECS \nnote: these classes provide rough overviews of the types of entities found in the game and are not fully indicative of the underlying data structures used in practice","ownedViews":[{"_type":"UMLClassView","_id":"AAAAAAGNDrdXTQLkb4M=","_parent":{"$ref":"AAAAAAGNDqynnAKBh7A="},"model":{"$ref":"AAAAAAGNDrdXTALirFQ="},"subViews":[{"_type":"UMLNameCompartmentView","_id":"AAAAAAGNDrdXTQLlVS8=","_parent":{"$ref":"AAAAAAGNDrdXTQLkb4M="},"model":{"$ref":"AAAAAAGNDrdXTALirFQ="},"subViews":[{"_type":"LabelView","_id":"AAAAAAGNDrdXTQLmnpc=","_parent":{"$ref":"AAAAAAGNDrdXTQLlVS8="},"visible":false,"font":"Arial;13;0","left":1024,"top":416,"height":13},{"_type":"LabelView","_id":"AAAAAAGNDrdXTQLnbDY=","_parent":{"$ref":"AAAAAAGNDrdXTQLlVS8="},"font":"Arial;13;1","left":517,"top":231,"width":175,"height":13,"text":"Player"},{"_type":"LabelView","_id":"AAAAAAGNDrdXTQLoS/I=","_parent":{"$ref":"AAAAAAGNDrdXTQLlVS8="},"visible":false,"font":"Arial;13;0","left":1024,"top":416,"width":151.6962890625,"height":13,"text":"(from Server Class Model)"},{"_type":"LabelView","_id":"AAAAAAGNDrdXTQLptmY=","_parent":{"$ref":"AAAAAAGNDrdXTQLlVS8="},"visible":false,"font":"Arial;13;0","left":837,"top":286,"width":215,"height":13,"horizontalAlignment":1}],"font":"Arial;13;0","left":512,"top":224,"width":185,"height":25,"stereotypeLabel":{"$ref":"AAAAAAGNDrdXTQLmnpc="},"nameLabel":{"$ref":"AAAAAAGNDrdXTQLnbDY="},"namespaceLabel":{"$ref":"AAAAAAGNDrdXTQLoS/I="},"propertyLabel":{"$ref":"AAAAAAGNDrdXTQLptmY="}},{"_type":"UMLAttributeCompartmentView","_id":"AAAAAAGNDrdXTQLqbLE=","_parent":{"$ref":"AAAAAAGNDrdXTQLkb4M="},"model":{"$ref":"AAAAAAGNDrdXTALirFQ="},"subViews":[{"_type":"UMLAttributeView","_id":"AAAAAAGNDsiLczj87JI=","_parent":{"$ref":"AAAAAAGNDrdXTQLqbLE="},"model":{"$ref":"AAAAAAGNDsiLbDj5Qz4="},"font":"Arial;13;0","left":517,"top":254,"width":175,"height":13,"text":"+username: string","horizontalAlignment":0},{"_type":"UMLAttributeView","_id":"AAAAAAGNDsi+Cznbd2k=","_parent":{"$ref":"AAAAAAGNDrdXTQLqbLE="},"model":{"$ref":"AAAAAAGNDsi+CDnYNyI="},"visible":false,"font":"Arial;13;0","left":517,"top":269,"width":175,"height":13,"text":"+Attribute1","horizontalAlignment":0}],"font":"Arial;13;0","left":512,"top":249,"width":185,"height":23},{"_type":"UMLOperationCompartmentView","_id":"AAAAAAGNDrdXTQLrmC4=","_parent":{"$ref":"AAAAAAGNDrdXTQLkb4M="},"model":{"$ref":"AAAAAAGNDrdXTALirFQ="},"font":"Arial;13;0","left":512,"top":272,"width":185,"height":10},{"_type":"UMLReceptionCompartmentView","_id":"AAAAAAGNDrdXTQLsh/I=","_parent":{"$ref":"AAAAAAGNDrdXTQLkb4M="},"model":{"$ref":"AAAAAAGNDrdXTALirFQ="},"visible":false,"font":"Arial;13;0","left":512,"top":208,"width":10,"height":10},{"_type":"UMLTemplateParameterCompartmentView","_id":"AAAAAAGNDrdXTQLtsdE=","_parent":{"$ref":"AAAAAAGNDrdXTQLkb4M="},"model":{"$ref":"AAAAAAGNDrdXTALirFQ="},"visible":false,"font":"Arial;13;0","left":512,"top":208,"width":10,"height":10}],"font":"Arial;13;0","containerChangeable":true,"left":512,"top":224,"width":184,"height":104,"nameCompartment":{"$ref":"AAAAAAGNDrdXTQLlVS8="},"attributeCompartment":{"$ref":"AAAAAAGNDrdXTQLqbLE="},"operationCompartment":{"$ref":"AAAAAAGNDrdXTQLrmC4="},"receptionCompartment":{"$ref":"AAAAAAGNDrdXTQLsh/I="},"templateParameterCompartment":{"$ref":"AAAAAAGNDrdXTQLtsdE="}},{"_type":"UMLClassView","_id":"AAAAAAGNDrlt5gNofHs=","_parent":{"$ref":"AAAAAAGNDqynnAKBh7A="},"model":{"$ref":"AAAAAAGNDrlt5gNmie0="},"subViews":[{"_type":"UMLNameCompartmentView","_id":"AAAAAAGNDrlt5gNpP/c=","_parent":{"$ref":"AAAAAAGNDrlt5gNofHs="},"model":{"$ref":"AAAAAAGNDrlt5gNmie0="},"subViews":[{"_type":"LabelView","_id":"AAAAAAGNDrlt5gNqjqI=","_parent":{"$ref":"AAAAAAGNDrlt5gNpP/c="},"visible":false,"font":"Arial;13;0","left":-160,"top":-80,"height":13},{"_type":"LabelView","_id":"AAAAAAGNDrlt5gNr/Ss=","_parent":{"$ref":"AAAAAAGNDrlt5gNpP/c="},"font":"Arial;13;1","left":197,"top":231,"width":167,"height":13,"text":"Client"},{"_type":"LabelView","_id":"AAAAAAGNDrlt5gNsd9Q=","_parent":{"$ref":"AAAAAAGNDrlt5gNpP/c="},"visible":false,"font":"Arial;13;0","left":-160,"top":-80,"width":151.6962890625,"height":13,"text":"(from Server Class Model)"},{"_type":"LabelView","_id":"AAAAAAGNDrlt5gNtoNw=","_parent":{"$ref":"AAAAAAGNDrlt5gNpP/c="},"visible":false,"font":"Arial;13;0","left":-160,"top":-80,"height":13,"horizontalAlignment":1}],"font":"Arial;13;0","left":192,"top":224,"width":177,"height":25,"stereotypeLabel":{"$ref":"AAAAAAGNDrlt5gNqjqI="},"nameLabel":{"$ref":"AAAAAAGNDrlt5gNr/Ss="},"namespaceLabel":{"$ref":"AAAAAAGNDrlt5gNsd9Q="},"propertyLabel":{"$ref":"AAAAAAGNDrlt5gNtoNw="}},{"_type":"UMLAttributeCompartmentView","_id":"AAAAAAGNDrlt5gNuWpg=","_parent":{"$ref":"AAAAAAGNDrlt5gNofHs="},"model":{"$ref":"AAAAAAGNDrlt5gNmie0="},"subViews":[{"_type":"UMLAttributeView","_id":"AAAAAAGNDrmbGwOYNOY=","_parent":{"$ref":"AAAAAAGNDrlt5gNuWpg="},"model":{"$ref":"AAAAAAGNDrmbFAOVhWY="},"font":"Arial;13;0","left":197,"top":254,"width":167,"height":13,"text":"+id: ClientId","horizontalAlignment":0}],"font":"Arial;13;0","left":192,"top":249,"width":177,"height":23},{"_type":"UMLOperationCompartmentView","_id":"AAAAAAGNDrlt5gNvCMQ=","_parent":{"$ref":"AAAAAAGNDrlt5gNofHs="},"model":{"$ref":"AAAAAAGNDrlt5gNmie0="},"font":"Arial;13;0","left":192,"top":272,"width":177,"height":10},{"_type":"UMLReceptionCompartmentView","_id":"AAAAAAGNDrlt5gNwXyM=","_parent":{"$ref":"AAAAAAGNDrlt5gNofHs="},"model":{"$ref":"AAAAAAGNDrlt5gNmie0="},"visible":false,"font":"Arial;13;0","left":-80,"top":-40,"width":10,"height":10},{"_type":"UMLTemplateParameterCompartmentView","_id":"AAAAAAGNDrlt5gNxhHI=","_parent":{"$ref":"AAAAAAGNDrlt5gNofHs="},"model":{"$ref":"AAAAAAGNDrlt5gNmie0="},"visible":false,"font":"Arial;13;0","left":-80,"top":-40,"width":10,"height":10}],"font":"Arial;13;0","containerChangeable":true,"left":192,"top":224,"width":176,"height":104,"nameCompartment":{"$ref":"AAAAAAGNDrlt5gNpP/c="},"attributeCompartment":{"$ref":"AAAAAAGNDrlt5gNuWpg="},"operationCompartment":{"$ref":"AAAAAAGNDrlt5gNvCMQ="},"receptionCompartment":{"$ref":"AAAAAAGNDrlt5gNwXyM="},"templateParameterCompartment":{"$ref":"AAAAAAGNDrlt5gNxhHI="}},{"_type":"UMLEnumerationView","_id":"AAAAAAGNDr6O6xIouus=","_parent":{"$ref":"AAAAAAGNDqynnAKBh7A="},"model":{"$ref":"AAAAAAGNDr6O6xImVHk="},"subViews":[{"_type":"UMLNameCompartmentView","_id":"AAAAAAGNDr6O6xIpu6k=","_parent":{"$ref":"AAAAAAGNDr6O6xIouus="},"model":{"$ref":"AAAAAAGNDr6O6xImVHk="},"subViews":[{"_type":"LabelView","_id":"AAAAAAGNDr6O6xIq4gA=","_parent":{"$ref":"AAAAAAGNDr6O6xIpu6k="},"font":"Arial;13;0","left":541,"top":45,"width":117.34619140625,"height":13,"text":"«enumeration»"},{"_type":"LabelView","_id":"AAAAAAGNDr6O6xIrASw=","_parent":{"$ref":"AAAAAAGNDr6O6xIpu6k="},"font":"Arial;13;1","left":541,"top":60,"width":117.34619140625,"height":13,"text":"PlayerMode"},{"_type":"LabelView","_id":"AAAAAAGNDr6O6xIsSEk=","_parent":{"$ref":"AAAAAAGNDr6O6xIpu6k="},"visible":false,"font":"Arial;13;0","left":1072,"top":80,"width":151.6962890625,"height":13,"text":"(from Server Class Model)"},{"_type":"LabelView","_id":"AAAAAAGNDr6O6xItYVU=","_parent":{"$ref":"AAAAAAGNDr6O6xIpu6k="},"visible":false,"font":"Arial;13;0","left":1072,"top":80,"height":13,"horizontalAlignment":1}],"font":"Arial;13;0","left":536,"top":40,"width":127.34619140625,"height":38,"stereotypeLabel":{"$ref":"AAAAAAGNDr6O6xIq4gA="},"nameLabel":{"$ref":"AAAAAAGNDr6O6xIrASw="},"namespaceLabel":{"$ref":"AAAAAAGNDr6O6xIsSEk="},"propertyLabel":{"$ref":"AAAAAAGNDr6O6xItYVU="}},{"_type":"UMLAttributeCompartmentView","_id":"AAAAAAGNDr6O6xIuq+g=","_parent":{"$ref":"AAAAAAGNDr6O6xIouus="},"model":{"$ref":"AAAAAAGNDr6O6xImVHk="},"visible":false,"font":"Arial;13;0","left":536,"top":40,"width":10,"height":10},{"_type":"UMLOperationCompartmentView","_id":"AAAAAAGNDr6O6xIvvJM=","_parent":{"$ref":"AAAAAAGNDr6O6xIouus="},"model":{"$ref":"AAAAAAGNDr6O6xImVHk="},"visible":false,"font":"Arial;13;0","left":536,"top":40,"width":10,"height":10},{"_type":"UMLReceptionCompartmentView","_id":"AAAAAAGNDr6O6xIwgLI=","_parent":{"$ref":"AAAAAAGNDr6O6xIouus="},"model":{"$ref":"AAAAAAGNDr6O6xImVHk="},"visible":false,"font":"Arial;13;0","left":536,"top":40,"width":10,"height":10},{"_type":"UMLTemplateParameterCompartmentView","_id":"AAAAAAGNDr6O6xIx3xY=","_parent":{"$ref":"AAAAAAGNDr6O6xIouus="},"model":{"$ref":"AAAAAAGNDr6O6xImVHk="},"visible":false,"font":"Arial;13;0","left":536,"top":40,"width":10,"height":10},{"_type":"UMLEnumerationLiteralCompartmentView","_id":"AAAAAAGNDr6O6xIyujY=","_parent":{"$ref":"AAAAAAGNDr6O6xIouus="},"model":{"$ref":"AAAAAAGNDr6O6xImVHk="},"subViews":[{"_type":"UMLEnumerationLiteralView","_id":"AAAAAAGNDtFli1D4POE=","_parent":{"$ref":"AAAAAAGNDr6O6xIyujY="},"model":{"$ref":"AAAAAAGNDtFlhVD1qng="},"font":"Arial;13;0","left":541,"top":83,"width":117.34619140625,"height":13,"text":"Login","horizontalAlignment":0},{"_type":"UMLEnumerationLiteralView","_id":"AAAAAAGNDr7L9hNgCOM=","_parent":{"$ref":"AAAAAAGNDr6O6xIyujY="},"model":{"$ref":"AAAAAAGNDr7L7hNatbk="},"font":"Arial;13;0","left":541,"top":98,"width":117.34619140625,"height":13,"text":"MainMenu","horizontalAlignment":0},{"_type":"UMLEnumerationLiteralView","_id":"AAAAAAGNDr+XzhSP/wo=","_parent":{"$ref":"AAAAAAGNDr6O6xIyujY="},"model":{"$ref":"AAAAAAGNDr+XyhSJgcg="},"font":"Arial;13;0","left":541,"top":113,"width":117.34619140625,"height":13,"text":"InLobby","horizontalAlignment":0},{"_type":"UMLEnumerationLiteralView","_id":"AAAAAAGND1ueMlm7UMc=","_parent":{"$ref":"AAAAAAGNDr6O6xIyujY="},"model":{"$ref":"AAAAAAGND1ueLVm4u3Y="},"visible":false,"font":"Arial;13;0","left":541,"top":128,"width":117.34619140625,"height":13,"text":"Literal1","horizontalAlignment":0}],"font":"Arial;13;0","left":536,"top":78,"width":127.34619140625,"height":53}],"font":"Arial;13;0","containerChangeable":true,"left":536,"top":40,"width":126.34619140625,"height":106,"nameCompartment":{"$ref":"AAAAAAGNDr6O6xIpu6k="},"suppressAttributes":true,"suppressOperations":true,"attributeCompartment":{"$ref":"AAAAAAGNDr6O6xIuq+g="},"operationCompartment":{"$ref":"AAAAAAGNDr6O6xIvvJM="},"receptionCompartment":{"$ref":"AAAAAAGNDr6O6xIwgLI="},"templateParameterCompartment":{"$ref":"AAAAAAGNDr6O6xIx3xY="},"enumerationLiteralCompartment":{"$ref":"AAAAAAGNDr6O6xIyujY="}},{"_type":"UMLAssociationView","_id":"AAAAAAGNDsK74xZM6Ao=","_parent":{"$ref":"AAAAAAGNDqynnAKBh7A="},"model":{"$ref":"AAAAAAGNDsK74xZIfVQ="},"subViews":[{"_type":"EdgeLabelView","_id":"AAAAAAGNDsK74xZNxe4=","_parent":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"model":{"$ref":"AAAAAAGNDsK74xZIfVQ="},"font":"Arial;13;0","left":408,"top":254,"width":40.828125,"height":13,"alpha":-4.037648444665335,"distance":19.209372712298546,"hostEdge":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"edgePosition":1,"text":"+client"},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsK74xZOYao=","_parent":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"model":{"$ref":"AAAAAAGNDsK74xZIfVQ="},"visible":null,"font":"Arial;13;0","left":440,"top":240,"height":13,"alpha":1.5707963267948966,"distance":30,"hostEdge":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"edgePosition":1},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsK74xZPM0U=","_parent":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"model":{"$ref":"AAAAAAGNDsK74xZIfVQ="},"visible":false,"font":"Arial;13;0","left":440,"top":285,"height":13,"alpha":-1.5707963267948966,"distance":15,"hostEdge":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"edgePosition":1},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsK74xZQ+dE=","_parent":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"model":{"$ref":"AAAAAAGNDsK74xZJ340="},"visible":false,"font":"Arial;13;0","left":394,"top":255,"height":13,"alpha":0.5235987755982988,"distance":30,"hostEdge":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"edgePosition":2},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsK74xZRsV0=","_parent":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"model":{"$ref":"AAAAAAGNDsK74xZJ340="},"visible":false,"font":"Arial;13;0","left":397,"top":241,"height":13,"alpha":0.7853981633974483,"distance":40,"hostEdge":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"edgePosition":2},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsK74xZSg4c=","_parent":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"model":{"$ref":"AAAAAAGNDsK74xZJ340="},"visible":false,"font":"Arial;13;0","left":387,"top":282,"width":7.22998046875,"height":13,"alpha":-0.5235987755982988,"distance":25,"hostEdge":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"edgePosition":2,"text":"1"},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsK74xZTaM0=","_parent":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"model":{"$ref":"AAAAAAGNDsK74xZKhj8="},"visible":false,"font":"Arial;13;0","left":485,"top":255,"height":13,"alpha":-0.5235987755982988,"distance":30,"hostEdge":{"$ref":"AAAAAAGNDsK74xZM6Ao="}},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsK74xZU48Q=","_parent":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"model":{"$ref":"AAAAAAGNDsK74xZKhj8="},"visible":false,"font":"Arial;13;0","left":482,"top":241,"height":13,"alpha":-0.7853981633974483,"distance":40,"hostEdge":{"$ref":"AAAAAAGNDsK74xZM6Ao="}},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsK74xZViZQ=","_parent":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"model":{"$ref":"AAAAAAGNDsK74xZKhj8="},"visible":false,"font":"Arial;13;0","left":486,"top":282,"width":7.22998046875,"height":13,"alpha":0.5235987755982988,"distance":25,"hostEdge":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"text":"1"},{"_type":"UMLQualifierCompartmentView","_id":"AAAAAAGNDsK74xZWJEs=","_parent":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"model":{"$ref":"AAAAAAGNDsK74xZJ340="},"visible":false,"font":"Arial;13;0","width":10,"height":10},{"_type":"UMLQualifierCompartmentView","_id":"AAAAAAGNDsK74xZXIr0=","_parent":{"$ref":"AAAAAAGNDsK74xZM6Ao="},"model":{"$ref":"AAAAAAGNDsK74xZKhj8="},"visible":false,"font":"Arial;13;0","width":10,"height":10}],"font":"Arial;13;0","head":{"$ref":"AAAAAAGNDrdXTQLkb4M="},"tail":{"$ref":"AAAAAAGNDrlt5gNofHs="},"lineStyle":1,"points":"369:276;511:276","showVisibility":true,"nameLabel":{"$ref":"AAAAAAGNDsK74xZNxe4="},"stereotypeLabel":{"$ref":"AAAAAAGNDsK74xZOYao="},"propertyLabel":{"$ref":"AAAAAAGNDsK74xZPM0U="},"showEndOrder":"hide","tailRoleNameLabel":{"$ref":"AAAAAAGNDsK74xZQ+dE="},"tailPropertyLabel":{"$ref":"AAAAAAGNDsK74xZRsV0="},"tailMultiplicityLabel":{"$ref":"AAAAAAGNDsK74xZSg4c="},"headRoleNameLabel":{"$ref":"AAAAAAGNDsK74xZTaM0="},"headPropertyLabel":{"$ref":"AAAAAAGNDsK74xZU48Q="},"headMultiplicityLabel":{"$ref":"AAAAAAGNDsK74xZViZQ="},"tailQualifiersCompartment":{"$ref":"AAAAAAGNDsK74xZWJEs="},"headQualifiersCompartment":{"$ref":"AAAAAAGNDsK74xZXIr0="}},{"_type":"UMLAssociationView","_id":"AAAAAAGNDsN/zxmTlRE=","_parent":{"$ref":"AAAAAAGNDqynnAKBh7A="},"model":{"$ref":"AAAAAAGNDsN/zxmPd9I="},"subViews":[{"_type":"EdgeLabelView","_id":"AAAAAAGNDsN/zxmUOCM=","_parent":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"model":{"$ref":"AAAAAAGNDsN/zxmPd9I="},"font":"Arial;13;0","left":575,"top":176,"width":40.11083984375,"height":13,"alpha":-2.15466782179238,"distance":5.830951894845301,"hostEdge":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"edgePosition":1,"text":"+mode"},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsN/zxmV2dw=","_parent":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"model":{"$ref":"AAAAAAGNDsN/zxmPd9I="},"visible":null,"font":"Arial;13;0","left":630,"top":177,"height":13,"alpha":1.5707963267948966,"distance":30,"hostEdge":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"edgePosition":1},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsN/zxmWsTw=","_parent":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"model":{"$ref":"AAAAAAGNDsN/zxmPd9I="},"visible":false,"font":"Arial;13;0","left":586,"top":179,"height":13,"alpha":-1.5707963267948966,"distance":15,"hostEdge":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"edgePosition":1},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsN/0BmXOWE=","_parent":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"model":{"$ref":"AAAAAAGNDsN/zxmQK3w="},"visible":false,"font":"Arial;13;0","left":616,"top":166,"height":13,"alpha":0.5235987755982988,"distance":30,"hostEdge":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"edgePosition":2},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsN/0BmYk/s=","_parent":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"model":{"$ref":"AAAAAAGNDsN/zxmQK3w="},"visible":false,"font":"Arial;13;0","left":629,"top":168,"height":13,"alpha":0.7853981633974483,"distance":40,"hostEdge":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"edgePosition":2},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsN/0BmZPMU=","_parent":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"model":{"$ref":"AAAAAAGNDsN/zxmQK3w="},"visible":false,"font":"Arial;13;0","left":585,"top":163,"width":7.22998046875,"height":13,"alpha":-0.5235987755982988,"distance":25,"hostEdge":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"edgePosition":2,"text":"1"},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsN/0Bmax6w=","_parent":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"model":{"$ref":"AAAAAAGNDsN/zxmRwNs="},"visible":false,"font":"Arial;13;0","left":616,"top":190,"height":13,"alpha":-0.5235987755982988,"distance":30,"hostEdge":{"$ref":"AAAAAAGNDsN/zxmTlRE="}},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsN/0Bmb9Ew=","_parent":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"model":{"$ref":"AAAAAAGNDsN/zxmRwNs="},"visible":false,"font":"Arial;13;0","left":630,"top":187,"height":13,"alpha":-0.7853981633974483,"distance":40,"hostEdge":{"$ref":"AAAAAAGNDsN/zxmTlRE="}},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsN/0BmcIoE=","_parent":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"model":{"$ref":"AAAAAAGNDsN/zxmRwNs="},"visible":false,"font":"Arial;13;0","left":586,"top":195,"width":7.22998046875,"height":13,"alpha":0.5235987755982988,"distance":25,"hostEdge":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"text":"1"},{"_type":"UMLQualifierCompartmentView","_id":"AAAAAAGNDsN/0Bmdq/A=","_parent":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"model":{"$ref":"AAAAAAGNDsN/zxmQK3w="},"visible":false,"font":"Arial;13;0","width":10,"height":10},{"_type":"UMLQualifierCompartmentView","_id":"AAAAAAGNDsN/0Bme1hE=","_parent":{"$ref":"AAAAAAGNDsN/zxmTlRE="},"model":{"$ref":"AAAAAAGNDsN/zxmRwNs="},"visible":false,"font":"Arial;13;0","width":10,"height":10}],"font":"Arial;13;0","head":{"$ref":"AAAAAAGNDrdXTQLkb4M="},"tail":{"$ref":"AAAAAAGNDr6O6xIouus="},"lineStyle":1,"points":"600:147;603:223","showVisibility":true,"nameLabel":{"$ref":"AAAAAAGNDsN/zxmUOCM="},"stereotypeLabel":{"$ref":"AAAAAAGNDsN/zxmV2dw="},"propertyLabel":{"$ref":"AAAAAAGNDsN/zxmWsTw="},"showEndOrder":"hide","tailRoleNameLabel":{"$ref":"AAAAAAGNDsN/0BmXOWE="},"tailPropertyLabel":{"$ref":"AAAAAAGNDsN/0BmYk/s="},"tailMultiplicityLabel":{"$ref":"AAAAAAGNDsN/0BmZPMU="},"headRoleNameLabel":{"$ref":"AAAAAAGNDsN/0Bmax6w="},"headPropertyLabel":{"$ref":"AAAAAAGNDsN/0Bmb9Ew="},"headMultiplicityLabel":{"$ref":"AAAAAAGNDsN/0BmcIoE="},"tailQualifiersCompartment":{"$ref":"AAAAAAGNDsN/0Bmdq/A="},"headQualifiersCompartment":{"$ref":"AAAAAAGNDsN/0Bme1hE="}},{"_type":"UMLClassView","_id":"AAAAAAGNDscRISvAODs=","_parent":{"$ref":"AAAAAAGNDqynnAKBh7A="},"model":{"$ref":"AAAAAAGNDscRICu+F5w="},"subViews":[{"_type":"UMLNameCompartmentView","_id":"AAAAAAGNDscRISvBPAc=","_parent":{"$ref":"AAAAAAGNDscRISvAODs="},"model":{"$ref":"AAAAAAGNDscRICu+F5w="},"subViews":[{"_type":"LabelView","_id":"AAAAAAGNDscRISvCu80=","_parent":{"$ref":"AAAAAAGNDscRISvBPAc="},"visible":false,"font":"Arial;13;0","left":-16,"top":96,"height":13},{"_type":"LabelView","_id":"AAAAAAGNDscRISvDdpU=","_parent":{"$ref":"AAAAAAGNDscRISvBPAc="},"font":"Arial;13;1","left":525,"top":447,"width":159,"height":13,"text":"Lobby"},{"_type":"LabelView","_id":"AAAAAAGNDscRISvEQtU=","_parent":{"$ref":"AAAAAAGNDscRISvBPAc="},"visible":false,"font":"Arial;13;0","left":-16,"top":96,"width":151.6962890625,"height":13,"text":"(from Server Class Model)"},{"_type":"LabelView","_id":"AAAAAAGNDscRISvFb9c=","_parent":{"$ref":"AAAAAAGNDscRISvBPAc="},"visible":false,"font":"Arial;13;0","left":-16,"top":96,"height":13,"horizontalAlignment":1}],"font":"Arial;13;0","left":520,"top":440,"width":169,"height":25,"stereotypeLabel":{"$ref":"AAAAAAGNDscRISvCu80="},"nameLabel":{"$ref":"AAAAAAGNDscRISvDdpU="},"namespaceLabel":{"$ref":"AAAAAAGNDscRISvEQtU="},"propertyLabel":{"$ref":"AAAAAAGNDscRISvFb9c="}},{"_type":"UMLAttributeCompartmentView","_id":"AAAAAAGNDscRISvG9dw=","_parent":{"$ref":"AAAAAAGNDscRISvAODs="},"model":{"$ref":"AAAAAAGNDscRICu+F5w="},"subViews":[{"_type":"UMLAttributeView","_id":"AAAAAAGNDsjuTDsIpBQ=","_parent":{"$ref":"AAAAAAGNDscRISvG9dw="},"model":{"$ref":"AAAAAAGNDsjuRDr/Nlo="},"font":"Arial;13;0","left":525,"top":470,"width":159,"height":13,"text":"+host: &Player","horizontalAlignment":0},{"_type":"UMLAttributeView","_id":"AAAAAAGNDslNgjyTdCg=","_parent":{"$ref":"AAAAAAGNDscRISvG9dw="},"model":{"$ref":"AAAAAAGNDslNfjyKeJA="},"font":"Arial;13;0","left":525,"top":485,"width":159,"height":13,"text":"+id: uuid","horizontalAlignment":0}],"font":"Arial;13;0","left":520,"top":465,"width":169,"height":38},{"_type":"UMLOperationCompartmentView","_id":"AAAAAAGNDscRISvHqFY=","_parent":{"$ref":"AAAAAAGNDscRISvAODs="},"model":{"$ref":"AAAAAAGNDscRICu+F5w="},"font":"Arial;13;0","left":520,"top":503,"width":169,"height":10},{"_type":"UMLReceptionCompartmentView","_id":"AAAAAAGNDscRISvIPhc=","_parent":{"$ref":"AAAAAAGNDscRISvAODs="},"model":{"$ref":"AAAAAAGNDscRICu+F5w="},"visible":false,"font":"Arial;13;0","left":-8,"top":48,"width":10,"height":10},{"_type":"UMLTemplateParameterCompartmentView","_id":"AAAAAAGNDscRISvJnJs=","_parent":{"$ref":"AAAAAAGNDscRISvAODs="},"model":{"$ref":"AAAAAAGNDscRICu+F5w="},"visible":false,"font":"Arial;13;0","left":-8,"top":48,"width":10,"height":10}],"font":"Arial;13;0","containerChangeable":true,"left":520,"top":440,"width":168,"height":160,"nameCompartment":{"$ref":"AAAAAAGNDscRISvBPAc="},"attributeCompartment":{"$ref":"AAAAAAGNDscRISvG9dw="},"operationCompartment":{"$ref":"AAAAAAGNDscRISvHqFY="},"receptionCompartment":{"$ref":"AAAAAAGNDscRISvIPhc="},"templateParameterCompartment":{"$ref":"AAAAAAGNDscRISvJnJs="}},{"_type":"UMLAssociationView","_id":"AAAAAAGNDsdXfSz7nnE=","_parent":{"$ref":"AAAAAAGNDqynnAKBh7A="},"model":{"$ref":"AAAAAAGNDsdXfSz3pxo="},"subViews":[{"_type":"EdgeLabelView","_id":"AAAAAAGNDsdXfSz8TwA=","_parent":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"model":{"$ref":"AAAAAAGNDsdXfSz3pxo="},"font":"Arial;13;0","left":568,"top":383,"width":63.22900390625,"height":13,"alpha":-0.7853973452146299,"distance":7.0710678118654755,"hostEdge":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"edgePosition":1,"text":"+playerList"},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsdXfSz91zY=","_parent":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"model":{"$ref":"AAAAAAGNDsdXfSz3pxo="},"visible":null,"font":"Arial;13;0","left":633,"top":377,"height":13,"alpha":1.5707963267948966,"distance":30,"hostEdge":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"edgePosition":1},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsdXfSz+DY4=","_parent":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"model":{"$ref":"AAAAAAGNDsdXfSz3pxo="},"visible":false,"font":"Arial;13;0","left":589,"top":378,"height":13,"alpha":-1.5707963267948966,"distance":15,"hostEdge":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"edgePosition":1},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsdXfSz/Yy8=","_parent":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"model":{"$ref":"AAAAAAGNDsdXfSz4lCg="},"visible":false,"font":"Arial;13;0","left":619,"top":348,"height":13,"alpha":0.5235987755982988,"distance":30,"hostEdge":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"edgePosition":2},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsdXfS0A5xE=","_parent":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"model":{"$ref":"AAAAAAGNDsdXfSz4lCg="},"visible":false,"font":"Arial;13;0","left":632,"top":351,"height":13,"alpha":0.7853981633974483,"distance":40,"hostEdge":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"edgePosition":2},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsdXfS0Bwhg=","_parent":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"model":{"$ref":"AAAAAAGNDsdXfSz4lCg="},"font":"Arial;13;0","left":576,"top":336,"width":19.5126953125,"height":13,"alpha":-0.9707459590191272,"distance":23.021728866442675,"hostEdge":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"edgePosition":2,"text":"0..*"},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsdXfS0CFd8=","_parent":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"model":{"$ref":"AAAAAAGNDsdXfSz5ouE="},"visible":false,"font":"Arial;13;0","left":619,"top":407,"height":13,"alpha":-0.5235987755982988,"distance":30,"hostEdge":{"$ref":"AAAAAAGNDsdXfSz7nnE="}},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsdXfS0DmuU=","_parent":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"model":{"$ref":"AAAAAAGNDsdXfSz5ouE="},"visible":false,"font":"Arial;13;0","left":632,"top":404,"height":13,"alpha":-0.7853981633974483,"distance":40,"hostEdge":{"$ref":"AAAAAAGNDsdXfSz7nnE="}},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsdXfS0E6tc=","_parent":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"model":{"$ref":"AAAAAAGNDsdXfSz5ouE="},"font":"Arial;13;0","left":588,"top":411,"width":7.22998046875,"height":13,"alpha":0.5235987755982988,"distance":25,"hostEdge":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"text":"1"},{"_type":"UMLQualifierCompartmentView","_id":"AAAAAAGNDsdXfS0FjiE=","_parent":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"model":{"$ref":"AAAAAAGNDsdXfSz4lCg="},"visible":false,"font":"Arial;13;0","width":10,"height":10},{"_type":"UMLQualifierCompartmentView","_id":"AAAAAAGNDsdXfS0GBFo=","_parent":{"$ref":"AAAAAAGNDsdXfSz7nnE="},"model":{"$ref":"AAAAAAGNDsdXfSz5ouE="},"visible":false,"font":"Arial;13;0","width":10,"height":10}],"font":"Arial;13;0","head":{"$ref":"AAAAAAGNDscRISvAODs="},"tail":{"$ref":"AAAAAAGNDrdXTQLkb4M="},"lineStyle":1,"points":"604:329;604:439","showVisibility":true,"nameLabel":{"$ref":"AAAAAAGNDsdXfSz8TwA="},"stereotypeLabel":{"$ref":"AAAAAAGNDsdXfSz91zY="},"propertyLabel":{"$ref":"AAAAAAGNDsdXfSz+DY4="},"showEndOrder":"hide","tailRoleNameLabel":{"$ref":"AAAAAAGNDsdXfSz/Yy8="},"tailPropertyLabel":{"$ref":"AAAAAAGNDsdXfS0A5xE="},"tailMultiplicityLabel":{"$ref":"AAAAAAGNDsdXfS0Bwhg="},"headRoleNameLabel":{"$ref":"AAAAAAGNDsdXfS0CFd8="},"headPropertyLabel":{"$ref":"AAAAAAGNDsdXfS0DmuU="},"headMultiplicityLabel":{"$ref":"AAAAAAGNDsdXfS0E6tc="},"tailQualifiersCompartment":{"$ref":"AAAAAAGNDsdXfS0FjiE="},"headQualifiersCompartment":{"$ref":"AAAAAAGNDsdXfS0GBFo="}},{"_type":"UMLEnumerationView","_id":"AAAAAAGNDsoLLj5NgFs=","_parent":{"$ref":"AAAAAAGNDqynnAKBh7A="},"model":{"$ref":"AAAAAAGNDsoLLj5LYyE="},"subViews":[{"_type":"UMLNameCompartmentView","_id":"AAAAAAGNDsoLLj5OoE0=","_parent":{"$ref":"AAAAAAGNDsoLLj5NgFs="},"model":{"$ref":"AAAAAAGNDsoLLj5LYyE="},"subViews":[{"_type":"LabelView","_id":"AAAAAAGNDsoLLj5PTX4=","_parent":{"$ref":"AAAAAAGNDsoLLj5OoE0="},"font":"Arial;13;0","left":213,"top":461,"width":117.34619140625,"height":13,"text":"«enumeration»"},{"_type":"LabelView","_id":"AAAAAAGNDsoLLj5Qc+M=","_parent":{"$ref":"AAAAAAGNDsoLLj5OoE0="},"font":"Arial;13;1","left":213,"top":476,"width":117.34619140625,"height":13,"text":"LobbyState"},{"_type":"LabelView","_id":"AAAAAAGNDsoLLj5Rwrs=","_parent":{"$ref":"AAAAAAGNDsoLLj5OoE0="},"visible":false,"font":"Arial;13;0","left":416,"top":912,"width":151.6962890625,"height":13,"text":"(from Server Class Model)"},{"_type":"LabelView","_id":"AAAAAAGNDsoLLj5SQPM=","_parent":{"$ref":"AAAAAAGNDsoLLj5OoE0="},"visible":false,"font":"Arial;13;0","left":416,"top":912,"height":13,"horizontalAlignment":1}],"font":"Arial;13;0","left":208,"top":456,"width":127.34619140625,"height":38,"stereotypeLabel":{"$ref":"AAAAAAGNDsoLLj5PTX4="},"nameLabel":{"$ref":"AAAAAAGNDsoLLj5Qc+M="},"namespaceLabel":{"$ref":"AAAAAAGNDsoLLj5Rwrs="},"propertyLabel":{"$ref":"AAAAAAGNDsoLLj5SQPM="}},{"_type":"UMLAttributeCompartmentView","_id":"AAAAAAGNDsoLLj5TFXw=","_parent":{"$ref":"AAAAAAGNDsoLLj5NgFs="},"model":{"$ref":"AAAAAAGNDsoLLj5LYyE="},"visible":false,"font":"Arial;13;0","left":208,"top":456,"width":10,"height":10},{"_type":"UMLOperationCompartmentView","_id":"AAAAAAGNDsoLLj5Ubzg=","_parent":{"$ref":"AAAAAAGNDsoLLj5NgFs="},"model":{"$ref":"AAAAAAGNDsoLLj5LYyE="},"visible":false,"font":"Arial;13;0","left":208,"top":456,"width":10,"height":10},{"_type":"UMLReceptionCompartmentView","_id":"AAAAAAGNDsoLLj5ViPg=","_parent":{"$ref":"AAAAAAGNDsoLLj5NgFs="},"model":{"$ref":"AAAAAAGNDsoLLj5LYyE="},"visible":false,"font":"Arial;13;0","left":208,"top":456,"width":10,"height":10},{"_type":"UMLTemplateParameterCompartmentView","_id":"AAAAAAGNDsoLLj5WJsc=","_parent":{"$ref":"AAAAAAGNDsoLLj5NgFs="},"model":{"$ref":"AAAAAAGNDsoLLj5LYyE="},"visible":false,"font":"Arial;13;0","left":208,"top":456,"width":10,"height":10},{"_type":"UMLEnumerationLiteralCompartmentView","_id":"AAAAAAGNDsoLLj5XpAk=","_parent":{"$ref":"AAAAAAGNDsoLLj5NgFs="},"model":{"$ref":"AAAAAAGNDsoLLj5LYyE="},"subViews":[{"_type":"UMLEnumerationLiteralView","_id":"AAAAAAGNDspQVUOzRXo=","_parent":{"$ref":"AAAAAAGNDsoLLj5XpAk="},"model":{"$ref":"AAAAAAGNDspQTUOnt/s="},"font":"Arial;13;0","left":213,"top":499,"width":117.34619140625,"height":13,"text":"Lobby","horizontalAlignment":0},{"_type":"UMLEnumerationLiteralView","_id":"AAAAAAGNDst3zUY9s2Q=","_parent":{"$ref":"AAAAAAGNDsoLLj5XpAk="},"model":{"$ref":"AAAAAAGNDst3x0YxuXs="},"font":"Arial;13;0","left":213,"top":514,"width":117.34619140625,"height":13,"text":"PickNames","horizontalAlignment":0},{"_type":"UMLEnumerationLiteralView","_id":"AAAAAAGNDsumqUdAn9o=","_parent":{"$ref":"AAAAAAGNDsoLLj5XpAk="},"model":{"$ref":"AAAAAAGNDsumpUc0Waw="},"font":"Arial;13;0","left":213,"top":529,"width":117.34619140625,"height":13,"text":"Day","horizontalAlignment":0},{"_type":"UMLEnumerationLiteralView","_id":"AAAAAAGNDsva60gyDL8=","_parent":{"$ref":"AAAAAAGNDsoLLj5XpAk="},"model":{"$ref":"AAAAAAGNDsva50gmwcM="},"font":"Arial;13;0","left":213,"top":544,"width":117.34619140625,"height":13,"text":"Night","horizontalAlignment":0},{"_type":"UMLEnumerationLiteralView","_id":"AAAAAAGNDswOZkkjqaY=","_parent":{"$ref":"AAAAAAGNDsoLLj5XpAk="},"model":{"$ref":"AAAAAAGNDswOYkkXYJ8="},"font":"Arial;13;0","left":213,"top":559,"width":117.34619140625,"height":13,"text":"Evening","horizontalAlignment":0}],"font":"Arial;13;0","left":208,"top":494,"width":127.34619140625,"height":83}],"font":"Arial;13;0","containerChangeable":true,"left":208,"top":456,"width":126.34619140625,"height":136,"nameCompartment":{"$ref":"AAAAAAGNDsoLLj5OoE0="},"suppressAttributes":true,"suppressOperations":true,"attributeCompartment":{"$ref":"AAAAAAGNDsoLLj5TFXw="},"operationCompartment":{"$ref":"AAAAAAGNDsoLLj5Ubzg="},"receptionCompartment":{"$ref":"AAAAAAGNDsoLLj5ViPg="},"templateParameterCompartment":{"$ref":"AAAAAAGNDsoLLj5WJsc="},"enumerationLiteralCompartment":{"$ref":"AAAAAAGNDsoLLj5XpAk="}},{"_type":"UMLAssociationView","_id":"AAAAAAGNDsxaAkrkIqo=","_parent":{"$ref":"AAAAAAGNDqynnAKBh7A="},"model":{"$ref":"AAAAAAGNDsxaAUrgOfo="},"subViews":[{"_type":"EdgeLabelView","_id":"AAAAAAGNDsxaAkrldWc=","_parent":{"$ref":"AAAAAAGNDsxaAkrkIqo="},"model":{"$ref":"AAAAAAGNDsxaAUrgOfo="},"font":"Arial;13;0","left":409,"top":501,"width":35.775390625,"height":13,"alpha":1.5707963267948966,"distance":15,"hostEdge":{"$ref":"AAAAAAGNDsxaAkrkIqo="},"edgePosition":1,"text":"+state"},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsxaAkrmdAQ=","_parent":{"$ref":"AAAAAAGNDsxaAkrkIqo="},"model":{"$ref":"AAAAAAGNDsxaAUrgOfo="},"visible":null,"font":"Arial;13;0","left":426,"top":486,"height":13,"alpha":1.5707963267948966,"distance":30,"hostEdge":{"$ref":"AAAAAAGNDsxaAkrkIqo="},"edgePosition":1},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsxaAkrnlqI=","_parent":{"$ref":"AAAAAAGNDsxaAkrkIqo="},"model":{"$ref":"AAAAAAGNDsxaAUrgOfo="},"visible":false,"font":"Arial;13;0","left":427,"top":530,"height":13,"alpha":-1.5707963267948966,"distance":15,"hostEdge":{"$ref":"AAAAAAGNDsxaAkrkIqo="},"edgePosition":1},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsxaAkrobXM=","_parent":{"$ref":"AAAAAAGNDsxaAkrkIqo="},"model":{"$ref":"AAAAAAGNDsxaAUrh20M="},"visible":false,"font":"Arial;13;0","left":360,"top":501,"height":13,"alpha":0.5235987755982988,"distance":30,"hostEdge":{"$ref":"AAAAAAGNDsxaAkrkIqo="},"edgePosition":2},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsxaAkrpuiM=","_parent":{"$ref":"AAAAAAGNDsxaAkrkIqo="},"model":{"$ref":"AAAAAAGNDsxaAUrh20M="},"visible":false,"font":"Arial;13;0","left":362,"top":488,"height":13,"alpha":0.7853981633974483,"distance":40,"hostEdge":{"$ref":"AAAAAAGNDsxaAkrkIqo="},"edgePosition":2},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsxaAkrqqI4=","_parent":{"$ref":"AAAAAAGNDsxaAkrkIqo="},"model":{"$ref":"AAAAAAGNDsxaAUrh20M="},"visible":false,"font":"Arial;13;0","left":356,"top":529,"height":13,"alpha":-0.5235987755982988,"distance":25,"hostEdge":{"$ref":"AAAAAAGNDsxaAkrkIqo="},"edgePosition":2},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsxaAkrrNR8=","_parent":{"$ref":"AAAAAAGNDsxaAkrkIqo="},"model":{"$ref":"AAAAAAGNDsxaAkrizjw="},"visible":false,"font":"Arial;13;0","left":492,"top":500,"height":13,"alpha":-0.5235987755982988,"distance":30,"hostEdge":{"$ref":"AAAAAAGNDsxaAkrkIqo="}},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsxaAkrs2vA=","_parent":{"$ref":"AAAAAAGNDsxaAkrkIqo="},"model":{"$ref":"AAAAAAGNDsxaAkrizjw="},"visible":false,"font":"Arial;13;0","left":490,"top":487,"height":13,"alpha":-0.7853981633974483,"distance":40,"hostEdge":{"$ref":"AAAAAAGNDsxaAkrkIqo="}},{"_type":"EdgeLabelView","_id":"AAAAAAGNDsxaAkrtKMQ=","_parent":{"$ref":"AAAAAAGNDsxaAkrkIqo="},"model":{"$ref":"AAAAAAGNDsxaAkrizjw="},"visible":false,"font":"Arial;13;0","left":497,"top":527,"height":13,"alpha":0.5235987755982988,"distance":25,"hostEdge":{"$ref":"AAAAAAGNDsxaAkrkIqo="}},{"_type":"UMLQualifierCompartmentView","_id":"AAAAAAGNDsxaAkruahI=","_parent":{"$ref":"AAAAAAGNDsxaAkrkIqo="},"model":{"$ref":"AAAAAAGNDsxaAUrh20M="},"visible":false,"font":"Arial;13;0","width":10,"height":10},{"_type":"UMLQualifierCompartmentView","_id":"AAAAAAGNDsxaAkrvv0o=","_parent":{"$ref":"AAAAAAGNDsxaAkrkIqo="},"model":{"$ref":"AAAAAAGNDsxaAkrizjw="},"visible":false,"font":"Arial;13;0","width":10,"height":10}],"font":"Arial;13;0","head":{"$ref":"AAAAAAGNDscRISvAODs="},"tail":{"$ref":"AAAAAAGNDsoLLj5NgFs="},"lineStyle":1,"points":"335:523;519:521","showVisibility":true,"nameLabel":{"$ref":"AAAAAAGNDsxaAkrldWc="},"stereotypeLabel":{"$ref":"AAAAAAGNDsxaAkrmdAQ="},"propertyLabel":{"$ref":"AAAAAAGNDsxaAkrnlqI="},"showEndOrder":"hide","tailRoleNameLabel":{"$ref":"AAAAAAGNDsxaAkrobXM="},"tailPropertyLabel":{"$ref":"AAAAAAGNDsxaAkrpuiM="},"tailMultiplicityLabel":{"$ref":"AAAAAAGNDsxaAkrqqI4="},"headRoleNameLabel":{"$ref":"AAAAAAGNDsxaAkrrNR8="},"headPropertyLabel":{"$ref":"AAAAAAGNDsxaAkrs2vA="},"headMultiplicityLabel":{"$ref":"AAAAAAGNDsxaAkrtKMQ="},"tailQualifiersCompartment":{"$ref":"AAAAAAGNDsxaAkruahI="},"headQualifiersCompartment":{"$ref":"AAAAAAGNDsxaAkrvv0o="}}]},{"_type":"UMLClass","_id":"AAAAAAGNDrdXTALirFQ=","_parent":{"$ref":"AAAAAAGNDqynnAKAFn4="},"name":"Player","ownedElements":[{"_type":"UMLAssociation","_id":"AAAAAAGNDsdXfSz3pxo=","_parent":{"$ref":"AAAAAAGNDrdXTALirFQ="},"name":"playerList","end1":{"_type":"UMLAssociationEnd","_id":"AAAAAAGNDsdXfSz4lCg=","_parent":{"$ref":"AAAAAAGNDsdXfSz3pxo="},"reference":{"$ref":"AAAAAAGNDrdXTALirFQ="},"multiplicity":"0..*"},"end2":{"_type":"UMLAssociationEnd","_id":"AAAAAAGNDsdXfSz5ouE=","_parent":{"$ref":"AAAAAAGNDsdXfSz3pxo="},"reference":{"$ref":"AAAAAAGNDscRICu+F5w="},"aggregation":"shared","multiplicity":"1"}}],"documentation":"A player entity which wraps ","attributes":[{"_type":"UMLAttribute","_id":"AAAAAAGNDsiLbDj5Qz4=","_parent":{"$ref":"AAAAAAGNDrdXTALirFQ="},"name":"username","type":"string"},{"_type":"UMLAttribute","_id":"AAAAAAGNDsi+CDnYNyI=","_parent":{"$ref":"AAAAAAGNDrdXTALirFQ="},"name":"Attribute1","type":""}]},{"_type":"UMLClass","_id":"AAAAAAGNDrlt5gNmie0=","_parent":{"$ref":"AAAAAAGNDqynnAKAFn4="},"name":"Client","ownedElements":[{"_type":"UMLAssociation","_id":"AAAAAAGNDrouLAOe/Dw=","_parent":{"$ref":"AAAAAAGNDrlt5gNmie0="},"end1":{"_type":"UMLAssociationEnd","_id":"AAAAAAGNDrouLAOfvGw=","_parent":{"$ref":"AAAAAAGNDrouLAOe/Dw="},"reference":{"$ref":"AAAAAAGNDrlt5gNmie0="},"multiplicity":"1"},"end2":{"_type":"UMLAssociationEnd","_id":"AAAAAAGNDrouLAOguAI=","_parent":{"$ref":"AAAAAAGNDrouLAOe/Dw="},"reference":{"$ref":"AAAAAAGNDrdXTALirFQ="},"multiplicity":"1"}},{"_type":"UMLAssociation","_id":"AAAAAAGNDsK74xZIfVQ=","_parent":{"$ref":"AAAAAAGNDrlt5gNmie0="},"name":"client","end1":{"_type":"UMLAssociationEnd","_id":"AAAAAAGNDsK74xZJ340=","_parent":{"$ref":"AAAAAAGNDsK74xZIfVQ="},"reference":{"$ref":"AAAAAAGNDrlt5gNmie0="}},"end2":{"_type":"UMLAssociationEnd","_id":"AAAAAAGNDsK74xZKhj8=","_parent":{"$ref":"AAAAAAGNDsK74xZIfVQ="},"reference":{"$ref":"AAAAAAGNDrdXTALirFQ="},"aggregation":"composite"}}],"documentation":"A single client connection (using the underlying networking channel)","attributes":[{"_type":"UMLAttribute","_id":"AAAAAAGNDrmbFAOVhWY=","_parent":{"$ref":"AAAAAAGNDrlt5gNmie0="},"name":"id","type":"ClientId"}]},{"_type":"UMLEnumeration","_id":"AAAAAAGNDr6O6xImVHk=","_parent":{"$ref":"AAAAAAGNDqynnAKAFn4="},"name":"PlayerMode","ownedElements":[{"_type":"UMLAssociation","_id":"AAAAAAGNDsN/zxmPd9I=","_parent":{"$ref":"AAAAAAGNDr6O6xImVHk="},"name":"mode","end1":{"_type":"UMLAssociationEnd","_id":"AAAAAAGNDsN/zxmQK3w=","_parent":{"$ref":"AAAAAAGNDsN/zxmPd9I="},"reference":{"$ref":"AAAAAAGNDr6O6xImVHk="}},"end2":{"_type":"UMLAssociationEnd","_id":"AAAAAAGNDsN/zxmRwNs=","_parent":{"$ref":"AAAAAAGNDsN/zxmPd9I="},"reference":{"$ref":"AAAAAAGNDrdXTALirFQ="},"aggregation":"composite"}}],"literals":[{"_type":"UMLEnumerationLiteral","_id":"AAAAAAGNDtFlhVD1qng=","_parent":{"$ref":"AAAAAAGNDr6O6xImVHk="},"name":"Login"},{"_type":"UMLEnumerationLiteral","_id":"AAAAAAGNDr7L7hNatbk=","_parent":{"$ref":"AAAAAAGNDr6O6xImVHk="},"name":"MainMenu","documentation":"State used when the player is in the main menu"},{"_type":"UMLEnumerationLiteral","_id":"AAAAAAGNDr+XyhSJgcg=","_parent":{"$ref":"AAAAAAGNDr6O6xImVHk="},"name":"InLobby","documentation":"Used when a player is in a lobby"},{"_type":"UMLEnumerationLiteral","_id":"AAAAAAGND1ueLVm4u3Y=","_parent":{"$ref":"AAAAAAGNDr6O6xImVHk="},"name":"Literal1"}]},{"_type":"UMLClass","_id":"AAAAAAGNDscRICu+F5w=","_parent":{"$ref":"AAAAAAGNDqynnAKAFn4="},"name":"Lobby","documentation":"A lobby used when playing the game","attributes":[{"_type":"UMLAttribute","_id":"AAAAAAGNDsjuRDr/Nlo=","_parent":{"$ref":"AAAAAAGNDscRICu+F5w="},"name":"host","type":"&Player"},{"_type":"UMLAttribute","_id":"AAAAAAGNDslNfjyKeJA=","_parent":{"$ref":"AAAAAAGNDscRICu+F5w="},"name":"id","type":"uuid"}]},{"_type":"UMLEnumeration","_id":"AAAAAAGNDsoLLj5LYyE=","_parent":{"$ref":"AAAAAAGNDqynnAKAFn4="},"name":"LobbyState","ownedElements":[{"_type":"UMLAssociation","_id":"AAAAAAGNDsxaAUrgOfo=","_parent":{"$ref":"AAAAAAGNDsoLLj5LYyE="},"name":"state","end1":{"_type":"UMLAssociationEnd","_id":"AAAAAAGNDsxaAUrh20M=","_parent":{"$ref":"AAAAAAGNDsxaAUrgOfo="},"reference":{"$ref":"AAAAAAGNDsoLLj5LYyE="}},"end2":{"_type":"UMLAssociationEnd","_id":"AAAAAAGNDsxaAkrizjw=","_parent":{"$ref":"AAAAAAGNDsxaAUrgOfo="},"reference":{"$ref":"AAAAAAGNDscRICu+F5w="},"aggregation":"composite"}}],"literals":[{"_type":"UMLEnumerationLiteral","_id":"AAAAAAGNDspQTUOnt/s=","_parent":{"$ref":"AAAAAAGNDsoLLj5LYyE="},"name":"Lobby"},{"_type":"UMLEnumerationLiteral","_id":"AAAAAAGNDst3x0YxuXs=","_parent":{"$ref":"AAAAAAGNDsoLLj5LYyE="},"name":"PickNames"},{"_type":"UMLEnumerationLiteral","_id":"AAAAAAGNDsumpUc0Waw=","_parent":{"$ref":"AAAAAAGNDsoLLj5LYyE="},"name":"Day"},{"_type":"UMLEnumerationLiteral","_id":"AAAAAAGNDsva50gmwcM=","_parent":{"$ref":"AAAAAAGNDsoLLj5LYyE="},"name":"Night"},{"_type":"UMLEnumerationLiteral","_id":"AAAAAAGNDswOYkkXYJ8=","_parent":{"$ref":"AAAAAAGNDsoLLj5LYyE="},"name":"Evening"}]},{"_type":"UMLClass","_id":"AAAAAAGNEKxrBmLL7D8=","_parent":{"$ref":"AAAAAAGNDqynnAKAFn4="},"name":"PlayerState","attributes":[{"_type":"UMLAttribute","_id":"AAAAAAGNEKyb+WZKA0E=","_parent":{"$ref":"AAAAAAGNEKxrBmLL7D8="},"name":"Attribute1","type":""}]}]},{"_type":"UMLCollaboration","_id":"AAAAAAGNOB5KSGy3V6s=","_parent":{"$ref":"AAAAAAFF+h6SjaM2Hec="},"name":"Collaboration1","ownedElements":[{"_type":"UMLInteraction","_id":"AAAAAAGNOB5KSGy4lQU=","_parent":{"$ref":"AAAAAAGNOB5KSGy3V6s="},"name":"Login Interaction","ownedElements":[{"_type":"UMLSequenceDiagram","_id":"AAAAAAGNOB5KSGy56Pw=","_parent":{"$ref":"AAAAAAGNOB5KSGy4lQU="},"name":"Login Flow","ownedViews":[{"_type":"UMLFrameView","_id":"AAAAAAGNOB5KSGy68ec=","_parent":{"$ref":"AAAAAAGNOB5KSGy56Pw="},"model":{"$ref":"AAAAAAGNOB5KSGy56Pw="},"subViews":[{"_type":"LabelView","_id":"AAAAAAGNOB5KSGy7A/8=","_parent":{"$ref":"AAAAAAGNOB5KSGy68ec="},"font":"Arial;13;0","left":32.72998046875,"top":5,"width":62.8671875,"height":13,"text":"Login Flow"},{"_type":"LabelView","_id":"AAAAAAGNOB5KSGy8oCc=","_parent":{"$ref":"AAAAAAGNOB5KSGy68ec="},"font":"Arial;13;1","left":13,"top":5,"width":13.72998046875,"height":13,"text":"sd"}],"font":"Arial;13;0","left":8,"width":376,"height":232,"nameLabel":{"$ref":"AAAAAAGNOB5KSGy7A/8="},"frameTypeLabel":{"$ref":"AAAAAAGNOB5KSGy8oCc="}},{"_type":"UMLSeqLifelineView","_id":"AAAAAAGNOB+jx2zWUoE=","_parent":{"$ref":"AAAAAAGNOB5KSGy56Pw="},"model":{"$ref":"AAAAAAGNOB+jx2zVvCQ="},"subViews":[{"_type":"UMLNameCompartmentView","_id":"AAAAAAGNOB+jx2zXU8I=","_parent":{"$ref":"AAAAAAGNOB+jx2zWUoE="},"model":{"$ref":"AAAAAAGNOB+jx2zVvCQ="},"subViews":[{"_type":"LabelView","_id":"AAAAAAGNOB+jx2zYLVs=","_parent":{"$ref":"AAAAAAGNOB+jx2zXU8I="},"visible":false,"font":"Arial;13;0","left":48,"height":13},{"_type":"LabelView","_id":"AAAAAAGNOB+jx2zZeaw=","_parent":{"$ref":"AAAAAAGNOB+jx2zXU8I="},"font":"Arial;13;1","left":29,"top":47,"width":63.736328125,"height":13,"text":"Player"},{"_type":"LabelView","_id":"AAAAAAGNOB+jx2zaiO4=","_parent":{"$ref":"AAAAAAGNOB+jx2zXU8I="},"visible":false,"font":"Arial;13;0","left":48,"width":134.392578125,"height":13,"text":"(from Login Interaction)"},{"_type":"LabelView","_id":"AAAAAAGNOB+jx2zbDu0=","_parent":{"$ref":"AAAAAAGNOB+jx2zXU8I="},"visible":false,"font":"Arial;13;0","left":48,"height":13,"horizontalAlignment":1}],"font":"Arial;13;0","left":24,"top":40,"width":73.736328125,"height":40,"stereotypeLabel":{"$ref":"AAAAAAGNOB+jx2zYLVs="},"nameLabel":{"$ref":"AAAAAAGNOB+jx2zZeaw="},"namespaceLabel":{"$ref":"AAAAAAGNOB+jx2zaiO4="},"propertyLabel":{"$ref":"AAAAAAGNOB+jx2zbDu0="}},{"_type":"UMLLinePartView","_id":"AAAAAAGNOB+jx2zcvus=","_parent":{"$ref":"AAAAAAGNOB+jx2zWUoE="},"model":{"$ref":"AAAAAAGNOB+jx2zVvCQ="},"font":"Arial;13;0","left":60,"top":81,"width":1,"height":152}],"font":"Arial;13;0","left":24,"top":40,"width":72.736328125,"height":193,"nameCompartment":{"$ref":"AAAAAAGNOB+jx2zXU8I="},"linePart":{"$ref":"AAAAAAGNOB+jx2zcvus="}},{"_type":"UMLSeqLifelineView","_id":"AAAAAAGNOCAfP2z86cg=","_parent":{"$ref":"AAAAAAGNOB5KSGy56Pw="},"model":{"$ref":"AAAAAAGNOCAfP2z7Llc="},"subViews":[{"_type":"UMLNameCompartmentView","_id":"AAAAAAGNOCAfP2z9elE=","_parent":{"$ref":"AAAAAAGNOCAfP2z86cg="},"model":{"$ref":"AAAAAAGNOCAfP2z7Llc="},"subViews":[{"_type":"LabelView","_id":"AAAAAAGNOCAfP2z+q28=","_parent":{"$ref":"AAAAAAGNOCAfP2z9elE="},"visible":false,"font":"Arial;13;0","left":528,"height":13},{"_type":"LabelView","_id":"AAAAAAGNOCAfP2z//no=","_parent":{"$ref":"AAAAAAGNOCAfP2z9elE="},"font":"Arial;13;1","left":269,"top":47,"width":63.736328125,"height":13,"text":"Server"},{"_type":"LabelView","_id":"AAAAAAGNOCAfP20AhMs=","_parent":{"$ref":"AAAAAAGNOCAfP2z9elE="},"visible":false,"font":"Arial;13;0","left":528,"width":134.392578125,"height":13,"text":"(from Login Interaction)"},{"_type":"LabelView","_id":"AAAAAAGNOCAfP20BnSI=","_parent":{"$ref":"AAAAAAGNOCAfP2z9elE="},"visible":false,"font":"Arial;13;0","left":528,"height":13,"horizontalAlignment":1}],"font":"Arial;13;0","left":264,"top":40,"width":73.736328125,"height":40,"stereotypeLabel":{"$ref":"AAAAAAGNOCAfP2z+q28="},"nameLabel":{"$ref":"AAAAAAGNOCAfP2z//no="},"namespaceLabel":{"$ref":"AAAAAAGNOCAfP20AhMs="},"propertyLabel":{"$ref":"AAAAAAGNOCAfP20BnSI="}},{"_type":"UMLLinePartView","_id":"AAAAAAGNOCAfP20CR5g=","_parent":{"$ref":"AAAAAAGNOCAfP2z86cg="},"model":{"$ref":"AAAAAAGNOCAfP2z7Llc="},"font":"Arial;13;0","left":300,"top":81,"width":1,"height":152}],"font":"Arial;13;0","left":264,"top":40,"width":72.736328125,"height":193,"nameCompartment":{"$ref":"AAAAAAGNOCAfP2z9elE="},"linePart":{"$ref":"AAAAAAGNOCAfP20CR5g="}},{"_type":"UMLSeqMessageView","_id":"AAAAAAGNOCBY+G0exnI=","_parent":{"$ref":"AAAAAAGNOB5KSGy56Pw="},"model":{"$ref":"AAAAAAGNOCBY+G0deWY="},"subViews":[{"_type":"EdgeLabelView","_id":"AAAAAAGNOCBY+G0f+jE=","_parent":{"$ref":"AAAAAAGNOCBY+G0exnI="},"model":{"$ref":"AAAAAAGNOCBY+G0deWY="},"font":"Arial;13;0","left":138,"top":95,"width":78.04443359375,"height":13,"alpha":-1.5707956125091824,"distance":14,"hostEdge":{"$ref":"AAAAAAGNOCBY+G0exnI="},"edgePosition":1,"text":"1 : Login"},{"_type":"EdgeLabelView","_id":"AAAAAAGNOCBY+G0gRIM=","_parent":{"$ref":"AAAAAAGNOCBY+G0exnI="},"model":{"$ref":"AAAAAAGNOCBY+G0deWY="},"visible":false,"font":"Arial;13;0","left":177,"top":57,"height":13,"alpha":1.5707963267948966,"distance":25,"hostEdge":{"$ref":"AAAAAAGNOCBY+G0exnI="},"edgePosition":1},{"_type":"EdgeLabelView","_id":"AAAAAAGNOCBY+G0htK0=","_parent":{"$ref":"AAAAAAGNOCBY+G0exnI="},"model":{"$ref":"AAAAAAGNOCBY+G0deWY="},"visible":false,"font":"Arial;13;0","left":177,"top":92,"height":13,"alpha":-1.5707963267948966,"distance":10,"hostEdge":{"$ref":"AAAAAAGNOCBY+G0exnI="},"edgePosition":1},{"_type":"UMLActivationView","_id":"AAAAAAGNOCBY+G0ibDo=","_parent":{"$ref":"AAAAAAGNOCBY+G0exnI="},"model":{"$ref":"AAAAAAGNOCBY+G0deWY="},"font":"Arial;13;0","left":293,"top":88,"width":14,"height":64}],"font":"Arial;13;0","head":{"$ref":"AAAAAAGNOCAfP20CR5g="},"tail":{"$ref":"AAAAAAGNOB+jx2zcvus="},"points":"61:88;293:88","nameLabel":{"$ref":"AAAAAAGNOCBY+G0f+jE="},"stereotypeLabel":{"$ref":"AAAAAAGNOCBY+G0gRIM="},"propertyLabel":{"$ref":"AAAAAAGNOCBY+G0htK0="},"activation":{"$ref":"AAAAAAGNOCBY+G0ibDo="}},{"_type":"UMLSeqMessageView","_id":"AAAAAAGNQl4Z022K5YY=","_parent":{"$ref":"AAAAAAGNOB5KSGy56Pw="},"model":{"$ref":"AAAAAAGNQl4Z022JyCw="},"subViews":[{"_type":"EdgeLabelView","_id":"AAAAAAGNQl4Z022LXas=","_parent":{"$ref":"AAAAAAGNQl4Z022K5YY="},"model":{"$ref":"AAAAAAGNQl4Z022JyCw="},"font":"Arial;13;0","left":139,"top":128,"width":75.89892578125,"height":13,"alpha":1.4994895726695407,"distance":14.035668847618199,"hostEdge":{"$ref":"AAAAAAGNQl4Z022K5YY="},"edgePosition":1,"text":"2 : Logged In"},{"_type":"EdgeLabelView","_id":"AAAAAAGNQl4Z022MqCc=","_parent":{"$ref":"AAAAAAGNQl4Z022K5YY="},"model":{"$ref":"AAAAAAGNQl4Z022JyCw="},"visible":false,"font":"Arial;13;0","left":176,"top":139,"height":13,"alpha":1.5707963267948966,"distance":25,"hostEdge":{"$ref":"AAAAAAGNQl4Z022K5YY="},"edgePosition":1},{"_type":"EdgeLabelView","_id":"AAAAAAGNQl4Z022NWis=","_parent":{"$ref":"AAAAAAGNQl4Z022K5YY="},"model":{"$ref":"AAAAAAGNQl4Z022JyCw="},"visible":false,"font":"Arial;13;0","left":177,"top":104,"height":13,"alpha":-1.5707963267948966,"distance":10,"hostEdge":{"$ref":"AAAAAAGNQl4Z022K5YY="},"edgePosition":1},{"_type":"UMLActivationView","_id":"AAAAAAGNQl4Z022OOkM=","_parent":{"$ref":"AAAAAAGNQl4Z022K5YY="},"model":{"$ref":"AAAAAAGNQl4Z022JyCw="},"visible":false,"font":"Arial;13;0","left":60,"top":120,"width":14,"height":25}],"font":"Arial;13;0","head":{"$ref":"AAAAAAGNOB+jx2zcvus="},"tail":{"$ref":"AAAAAAGNOCAfP20CR5g="},"points":"293:120;61:120","nameLabel":{"$ref":"AAAAAAGNQl4Z022LXas="},"stereotypeLabel":{"$ref":"AAAAAAGNQl4Z022MqCc="},"propertyLabel":{"$ref":"AAAAAAGNQl4Z022NWis="},"activation":{"$ref":"AAAAAAGNQl4Z022OOkM="}},{"_type":"UMLSeqMessageView","_id":"AAAAAAGNQl6bIm3AJw4=","_parent":{"$ref":"AAAAAAGNOB5KSGy56Pw="},"model":{"$ref":"AAAAAAGNQl6bIm2/EeE="},"subViews":[{"_type":"EdgeLabelView","_id":"AAAAAAGNQl6bIm3BHCU=","_parent":{"$ref":"AAAAAAGNQl6bIm3AJw4="},"model":{"$ref":"AAAAAAGNQl6bIm2/EeE="},"font":"Arial;13;0","left":115,"top":156,"width":154.6162109375,"height":13,"alpha":2.2565263822553954,"distance":14.212670403551895,"hostEdge":{"$ref":"AAAAAAGNQl6bIm3AJw4="},"edgePosition":1,"text":"3 : Sync Server Resources"},{"_type":"EdgeLabelView","_id":"AAAAAAGNQl6bIm3C6nM=","_parent":{"$ref":"AAAAAAGNQl6bIm3AJw4="},"model":{"$ref":"AAAAAAGNQl6bIm2/EeE="},"visible":false,"font":"Arial;13;0","left":182,"top":171,"height":13,"alpha":1.5707963267948966,"distance":25,"hostEdge":{"$ref":"AAAAAAGNQl6bIm3AJw4="},"edgePosition":1},{"_type":"EdgeLabelView","_id":"AAAAAAGNQl6bIm3Dwow=","_parent":{"$ref":"AAAAAAGNQl6bIm3AJw4="},"model":{"$ref":"AAAAAAGNQl6bIm2/EeE="},"visible":false,"font":"Arial;13;0","left":183,"top":136,"height":13,"alpha":-1.5707963267948966,"distance":10,"hostEdge":{"$ref":"AAAAAAGNQl6bIm3AJw4="},"edgePosition":1},{"_type":"UMLActivationView","_id":"AAAAAAGNQl6bIm3E0wA=","_parent":{"$ref":"AAAAAAGNQl6bIm3AJw4="},"model":{"$ref":"AAAAAAGNQl6bIm2/EeE="},"font":"Arial;13;0","left":53,"top":152,"width":14,"height":45}],"font":"Arial;13;0","head":{"$ref":"AAAAAAGNOB+jx2zcvus="},"tail":{"$ref":"AAAAAAGNOCAfP20CR5g="},"points":"300:152;67:152","nameLabel":{"$ref":"AAAAAAGNQl6bIm3BHCU="},"stereotypeLabel":{"$ref":"AAAAAAGNQl6bIm3C6nM="},"propertyLabel":{"$ref":"AAAAAAGNQl6bIm3Dwow="},"activation":{"$ref":"AAAAAAGNQl6bIm3E0wA="}},{"_type":"UMLSeqMessageView","_id":"AAAAAAGNR3rEuW3ohMU=","_parent":{"$ref":"AAAAAAGNOB5KSGy56Pw="},"model":{"$ref":"AAAAAAGNR3rEuW3nhOg="},"subViews":[{"_type":"EdgeLabelView","_id":"AAAAAAGNR3rEuW3pOhw=","_parent":{"$ref":"AAAAAAGNR3rEuW3ohMU="},"model":{"$ref":"AAAAAAGNR3rEuW3nhOg="},"font":"Arial;13;0","left":112,"top":192,"width":127.1943359375,"height":13,"alpha":-2.0899419025797155,"distance":16.1245154965971,"hostEdge":{"$ref":"AAAAAAGNR3rEuW3ohMU="},"edgePosition":1,"text":"4 : Resources Loaded"},{"_type":"EdgeLabelView","_id":"AAAAAAGNR3rEuW3qOfo=","_parent":{"$ref":"AAAAAAGNR3rEuW3ohMU="},"model":{"$ref":"AAAAAAGNR3rEuW3nhOg="},"visible":false,"font":"Arial;13;0","left":183,"top":153,"height":13,"alpha":1.5707963267948966,"distance":25,"hostEdge":{"$ref":"AAAAAAGNR3rEuW3ohMU="},"edgePosition":1},{"_type":"EdgeLabelView","_id":"AAAAAAGNR3rEuW3r4JY=","_parent":{"$ref":"AAAAAAGNR3rEuW3ohMU="},"model":{"$ref":"AAAAAAGNR3rEuW3nhOg="},"visible":false,"font":"Arial;13;0","left":183,"top":188,"height":13,"alpha":-1.5707963267948966,"distance":10,"hostEdge":{"$ref":"AAAAAAGNR3rEuW3ohMU="},"edgePosition":1},{"_type":"UMLActivationView","_id":"AAAAAAGNR3rEuW3saa0=","_parent":{"$ref":"AAAAAAGNR3rEuW3ohMU="},"model":{"$ref":"AAAAAAGNR3rEuW3nhOg="},"visible":false,"font":"Arial;13;0","left":300,"top":184,"width":14,"height":25}],"font":"Arial;13;0","head":{"$ref":"AAAAAAGNOCAfP20CR5g="},"tail":{"$ref":"AAAAAAGNOB+jx2zcvus="},"points":"67:184;300:184","nameLabel":{"$ref":"AAAAAAGNR3rEuW3pOhw="},"stereotypeLabel":{"$ref":"AAAAAAGNR3rEuW3qOfo="},"propertyLabel":{"$ref":"AAAAAAGNR3rEuW3r4JY="},"activation":{"$ref":"AAAAAAGNR3rEuW3saa0="}}]}],"messages":[{"_type":"UMLMessage","_id":"AAAAAAGNOCBY+G0deWY=","_parent":{"$ref":"AAAAAAGNOB5KSGy4lQU="},"name":"Login","source":{"$ref":"AAAAAAGNOB+jx2zVvCQ="},"target":{"$ref":"AAAAAAGNOCAfP2z7Llc="}},{"_type":"UMLMessage","_id":"AAAAAAGNQl4Z022JyCw=","_parent":{"$ref":"AAAAAAGNOB5KSGy4lQU="},"name":"Logged In","source":{"$ref":"AAAAAAGNOCAfP2z7Llc="},"target":{"$ref":"AAAAAAGNOB+jx2zVvCQ="},"messageSort":"reply"},{"_type":"UMLMessage","_id":"AAAAAAGNQl6bIm2/EeE=","_parent":{"$ref":"AAAAAAGNOB5KSGy4lQU="},"name":"Sync Server Resources","source":{"$ref":"AAAAAAGNOCAfP2z7Llc="},"target":{"$ref":"AAAAAAGNOB+jx2zVvCQ="}},{"_type":"UMLMessage","_id":"AAAAAAGNR3rEuW3nhOg=","_parent":{"$ref":"AAAAAAGNOB5KSGy4lQU="},"name":"Resources Loaded","source":{"$ref":"AAAAAAGNOB+jx2zVvCQ="},"target":{"$ref":"AAAAAAGNOCAfP2z7Llc="},"messageSort":"reply"}],"participants":[{"_type":"UMLLifeline","_id":"AAAAAAGNOB+jx2zVvCQ=","_parent":{"$ref":"AAAAAAGNOB5KSGy4lQU="},"name":"Player","isMultiInstance":false},{"_type":"UMLLifeline","_id":"AAAAAAGNOCAfP2z7Llc=","_parent":{"$ref":"AAAAAAGNOB5KSGy4lQU="},"name":"Server","isMultiInstance":false}]}]}],"author":"Hutzdog","version":"v0.0.0-indev"}
\ No newline at end of file

D DESIGN.md => DESIGN.md +0 -145
@@ 1,145 0,0 @@
# Traitors in the Coven Design Doc
## Story
After the murder of several members of a coven of witches, it is revealed that the murder was an inside job. Using powerful magical abilities and your wits, can you figure out who is trustworthy and who should be put to death? Or will your coven be forced to serve as the underlings of the traitors.

## Gameplay loop
- Players join a server (which sends over data such as the role set, anything not strictly client sided is handled by server scripts)
- Players join a lobby on said server, joining a group of upto 13
- Once 13 players have joined, the game starts. The game follows a loop of the following phases until a faction has won
    + Evening phase : If the High Priestess has died, this phase is used to elect a new one
    + Night phase : The players gather to discuss their findings, choosing one person to excommunicate (future idea: and a spell to cast)
        - Spells would be a small modifier to the game selected from a random pool which help coven members during the day
        - More info below
    + Day phase : Players can select their abilities and interact with their factions (if their faction has that ability) during this time
        - More info below

### Night Phase
- During the night phase, the coven stands gathered in a circle
- The coven discusses amongst itself during this phase, deciding who to excommunicate (future idea: and what spell to cast) by vote
    + NOTE: This game does away with trials, instead opting to have an ongoing vote to excommunicate throughout the night. In exchange, the nights may be slightly longer than in other games

## Factions
These are the default factions in the game. These may be customized by server scripts

### Coven
- The uninformed majority faction, who aim to excommunicate all evildoers before they loose control of the game

#### Alignments
- Coven Protective : Roles which provide protection to other coven members
- Coven Investigative : Roles which use their powers to learn more about the intentions of their peers
- Coven Support : Miscellanious traitors who don't fit into any other category

### Sorcerers
- The informed minority faction, who are willing to kill and excommunicate all who would stand in their path to taking control of the coven
- Max of 3-4 in game

#### Alignments
- Sorcerer Killing : Traitors who have the ability to kill by default
- Sorcerer Deception : Traitors who have mastered the art of obscuring what is real and what is fake
- Sorcerer Support : Miscellanious traitors who don't fit into any other category

## Roles
These are the default roles in the game. These may be customized with the server (TODO: add server scripts)

### High Priestess (Any Power, Unique Modifier)
The leader of the Coven, applied as an attribute on top of another role

#### Abilities
Keeps the abilities of their base role

#### Features
- They have 2 votes, and are always the deciding vote for excommunication
- All players know who the High Priestess is, making them confirmed
- If excommunicated or killed, a vote is held to pass the title on to another player.
- Only 1 can be in the game at a time, and the first one is always good

### Green Witch (Coven Protective)
A witch who works with herbs to protect and heal their fellow coven members

#### Abilities
- Heal (infinite) : Create a potion to heal another coven member, giving them +2 defense and cleansing status effects

#### Features
- 0 Atk, 0 Def

### Hedge Witch (Coven Investigative)
A witch who uses their abilities to interact with the spirit world to gather information

#### Abilities
- Divine (infinite) : Divine if at least 1 of a set of 3 chosen players has evil intentions
- Project (2) : Project your spirit into the spirit world, allowing you to interact with the dead
    + Unlike Crystal Witches, Hedge Witches can see who is talking

#### Features
- 0 Atk, 0 Def

### Crystal Witch (Coven Support)
A witch who works with crystals to provide a variety of effects

#### Abilities
- Divine (infinite) : Using Moonstone, divine a set of 3 players with at least 1 evil
- Heal (infinite) : Using Flourite, protect a player with +1 defense
- Communicate (infinite) : Using Angelite, the player may see what the dead are saying (but not who is saying it).
    + All other crystals are locked after activating this ability until the next night

#### Features
- 0 Atk, 0 Def

### Shaman (Coven Support)
A witch who uses altered states of consciousness to mediate interactions between spirits and this world

#### Abilities
- Meditate (infinite) : Select a dead coven member and a target. The ability of the dead player will be used on the target, but the spirit will be drained in the process
    + Drained spirits can no longer be accessed by shamans

#### Features
- 0 Atk, 0 Def

### High Sorcerer (Sorcerer Killing, Unique)
The leader of the sorcerers, holds the ability to kill once per night

#### Abilities
- Attack (infinite) : Chanelling dark magic, perform a level 2 attack on a player

#### Features
- 2 Atk, 1 Def
- Once dead, a new sorcerer is picked based on role in order from the following list:
    + Poisoner
    + Illusionist
    + Necromancer

### Poisoner (Sorcerer Killing, Unique)
A sorcerer trained in the creation of poisons.

#### Abilities
- Poison (3) : Poison another player's water supply, causing them to die the next day if they are not cleansed

#### Features
- 0 Atk, 0 Def

### Illusionist (Sourcerer Deception)
A sorcerer skilled in the manipulation of information

#### Abilities
- Enchant (infinite) : Causes another player to appear as evil to Coven Investigatives
- Illusion (infinite) : Hide the true nature of another sorcerer, making them appear good to Coven Investigatives

#### Features
- 0 Atk, 0 Def

### Necromancer (Sorcerer Support)
A sorcerer who works with the dead, raising them from the grave

#### Abilities
- Raise (infinite) : Raise a dead body as a zombie, forcing it to do your bidding. This will decay the body, making it inaccessible again

#### Features
- 0 Atk, 0 Def

## Architecture
- Traitors in the Coven will use messages to send information to the client as it is made relevent. This is to prevent any one client from having a competitive advantage.
- This crate will use `renet` for now as the main transport protocol, though I may look into other options as they mature.
- The game will run each of the following steps per frame:
    + `Pull` all data from the clients
    + `Update` the server state based on the updated data, queuing up client messages in the process
    + `Push` all queued client messages to the client

M README.md => README.md +1 -1
@@ 10,4 10,4 @@ TODO: proper README
We are not accepting contributions at this time, as I would like to have creative control over the game at the moment and to retain the right to move to a copyleft license in the future. Once the final license is decided upon and this project makes it to a point where I am comfortable doing so, I will allow contributions.

## LICENSING
Currently, this repository is released under an Apache license. This may change in the future, but this repository will remain free software.
Currently, this repository is released under an Apache license. This may change in the future, but this project will remain free software.

M common/src/lib.rs => common/src/lib.rs +2 -2
@@ 69,7 69,7 @@ pub mod proto {
    }
}

/// Data shared between the TITC client and server
/// Data shared between the TIC client and server
pub mod data {
    use uuid::Uuid;



@@ 104,7 104,7 @@ pub mod data {
    }
}

/// Error types for TITC
/// Error types for TIC
pub mod error {
    /// The type of server-side errors
    #[derive(serde::Serialize, serde::Deserialize, thiserror::Error, Debug, Clone, PartialEq, Eq)]

M server/src/assets.rs => server/src/assets.rs +9 -9
@@ 4,7 4,7 @@ use std::cell::LazyCell;
use bevy::prelude::*;
use titc_common::{proto, error::ServerError};

use crate::{net, auth, player, TITCSets};
use crate::{net, auth, player, TICSets};

// EVENTS
/// Event sent when a client has finished synchonizing their assets


@@ 92,8 92,8 @@ pub fn assets_plugin(app: &mut App) {
        .add_systems(
            Update, 
            (
                handle_networking.in_set(TITCSets::Broadcast),
                (send_sync_requests, mark_synced_clients).in_set(TITCSets::Update),
                handle_networking.in_set(TICSets::Broadcast),
                (send_sync_requests, mark_synced_clients).in_set(TICSets::Update),
            )
        );
}


@@ 113,13 113,13 @@ mod tests {
        app
            .configure_sets(
                Update,
                (TITCSets::Pull, TITCSets::Broadcast, TITCSets::Update, TITCSets::Push).chain(),
                (TICSets::Pull, TICSets::Broadcast, TICSets::Update, TICSets::Push).chain(),
            )
            .add_event::<ResourcesSyncedEvent>()
            .add_event::<net::ReceiveMessageEvent>()
            .add_systems(
                Update,
                handle_networking.in_set(TITCSets::Broadcast),
                handle_networking.in_set(TICSets::Broadcast),
            );

        // Setup the test player and client


@@ 163,13 163,13 @@ mod tests {
        app
            .configure_sets(
                Update,
                (TITCSets::Pull, TITCSets::Broadcast, TITCSets::Update, TITCSets::Push).chain(),
                (TICSets::Pull, TICSets::Broadcast, TICSets::Update, TICSets::Push).chain(),
            )
            .add_event::<ResourcesSyncedEvent>()
            .add_event::<net::SendMessageEvent>()
            .add_systems(
                Update,
                send_sync_requests.in_set(TITCSets::Update),
                send_sync_requests.in_set(TICSets::Update),
            );

        // Setup the test player and client


@@ 210,13 210,13 @@ mod tests {
        app
            .configure_sets(
                Update,
                (TITCSets::Pull, TITCSets::Broadcast, TITCSets::Update, TITCSets::Push).chain(),
                (TICSets::Pull, TICSets::Broadcast, TICSets::Update, TICSets::Push).chain(),
            )
            .add_event::<ResourcesSyncedEvent>()
            .add_event::<net::SendMessageEvent>()
            .add_systems(
                Update,
                mark_synced_clients.in_set(TITCSets::Update),
                mark_synced_clients.in_set(TICSets::Update),
            );

        // Setup the test player and client

M server/src/auth.rs => server/src/auth.rs +10 -10
@@ 1,10 1,10 @@
//! Authentication flows for TITC
//! Authentication flows for TIC
use std::cell::LazyCell;

use bevy::prelude::*;
use titc_common::{proto, error::ServerError, data::PlayerState};

use crate::{net, TITCSets, player};
use crate::{net, TICSets, player};

// BUNDLES
/// Information gotten from the login flow on a player


@@ 144,8 144,8 @@ pub fn auth_plugin(app: &mut App) {
        .add_systems(
            Update,
            (
                handle_networking.in_set(TITCSets::Broadcast),
                (handle_login_messages, handle_logout_messages).in_set(TITCSets::Update),
                handle_networking.in_set(TICSets::Broadcast),
                (handle_login_messages, handle_logout_messages).in_set(TICSets::Update),
            )
        );
}


@@ 167,14 167,14 @@ mod tests {
        app
            .configure_sets(
                Update,
                (TITCSets::Pull, TITCSets::Broadcast, TITCSets::Update, TITCSets::Push).chain(),
                (TICSets::Pull, TICSets::Broadcast, TICSets::Update, TICSets::Push).chain(),
            )
            .add_event::<LoginEvent>()
            .add_event::<LogoutEvent>()
            .add_event::<net::ReceiveMessageEvent>()
            .add_systems(
                Update,
                handle_networking.in_set(TITCSets::Broadcast),
                handle_networking.in_set(TICSets::Broadcast),
            );

        // Setup the test player and client


@@ 229,13 229,13 @@ mod tests {
        app
            .configure_sets(
                Update,
                (TITCSets::Pull, TITCSets::Broadcast, TITCSets::Update, TITCSets::Push).chain(),
                (TICSets::Pull, TICSets::Broadcast, TICSets::Update, TICSets::Push).chain(),
            )
            .add_event::<LoginEvent>()
            .add_event::<net::SendMessageEvent>()
            .add_systems(
                Update,
                handle_login_messages.in_set(TITCSets::Update),
                handle_login_messages.in_set(TICSets::Update),
            );

        // Create primary test player object and client


@@ 321,13 321,13 @@ mod tests {
        app
            .configure_sets(
                Update,
                (TITCSets::Pull, TITCSets::Broadcast, TITCSets::Update, TITCSets::Push).chain(),
                (TICSets::Pull, TICSets::Broadcast, TICSets::Update, TICSets::Push).chain(),
            )
            .add_event::<LogoutEvent>()
            .add_event::<net::SendMessageEvent>()
            .add_systems(
                Update,
                handle_logout_messages.in_set(TITCSets::Broadcast),
                handle_logout_messages.in_set(TICSets::Broadcast),
            );

        // Create the test client

M server/src/main.rs => server/src/main.rs +2 -2
@@ 27,7 27,7 @@ cfg_if::cfg_if! {

// SYSTEM SETS
#[derive(SystemSet, Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub enum TITCSets {
pub enum TICSets {
    /// Pull new messages from the clients and broadcast them as events
    Pull,



@@ 53,7 53,7 @@ fn main() {
        ))
        .configure_sets(
            Update,
            (TITCSets::Pull, TITCSets::Broadcast, TITCSets::Update, TITCSets::Push).chain(),
            (TICSets::Pull, TICSets::Broadcast, TICSets::Update, TICSets::Push).chain(),
        )
        .fn_plugin(auth::auth_plugin)
        .fn_plugin(net::net_plugin)

M server/src/net.rs => server/src/net.rs +6 -6
@@ 1,4 1,4 @@
//! The self-contained networking code for TITC
//! The self-contained networking code for TIC
use std::{
    net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket},
    sync::atomic::AtomicU32,


@@ 17,7 17,7 @@ use bevy_renet::{
use seldom_fn_plugin::FnPluginExt;
use titc_common::proto::{ClientMessage, ServerMessage};

use crate::TITCSets;
use crate::TICSets;

// CONSTANTS
// TODO: make into configurable resources


@@ 200,7 200,7 @@ macro_rules! server_throw {

// PLUGINS
pub fn setup_server(app: &mut App) {
    bevy::log::debug!("Starting up the TITC server");
    bevy::log::debug!("Starting up the TIC server");
    app.add_plugins(NetcodeServerPlugin);

    let sv = RenetServer::new(ConnectionConfig {


@@ 235,9 235,9 @@ pub fn net_plugin(app: &mut App) {
        .add_systems(
            Update,
            (
                (handle_server_messages, broadcast_client_message_events).in_set(TITCSets::Pull),
                disconnect_clients.in_set(TITCSets::Update),
                send_server_messages_from_events.after(TITCSets::Push),
                (handle_server_messages, broadcast_client_message_events).in_set(TICSets::Pull),
                disconnect_clients.in_set(TICSets::Update),
                send_server_messages_from_events.after(TICSets::Push),
            ),
        )
        .fn_plugin(setup_server);

M server/src/player.rs => server/src/player.rs +6 -6
@@ 3,7 3,7 @@ use bevy::prelude::*;

use crate::{
    net::{self, Client, NewConnectionEvent},
    TITCSets,
    TICSets,
};
use titc_common::data;



@@ 61,7 61,7 @@ pub fn player_plugin(app: &mut App) {
    app.add_systems(
        Update,
        (
            (spawn_players, despawn_disconnected_players).in_set(TITCSets::Update),
            (spawn_players, despawn_disconnected_players).in_set(TICSets::Update),
        )
    );
}


@@ 88,10 88,10 @@ mod tests {
        app
            .configure_sets(
                Update,
                (TITCSets::Pull, TITCSets::Broadcast, TITCSets::Update, TITCSets::Push).chain(),
                (TICSets::Pull, TICSets::Broadcast, TICSets::Update, TICSets::Push).chain(),
            )
            .add_event::<net::NewConnectionEvent>()
            .add_systems(Update, (spawn_players.in_set(TITCSets::Update),));
            .add_systems(Update, (spawn_players.in_set(TICSets::Update),));

        // Send a new connection event
        let client = Client::new_dummy();


@@ 126,12 126,12 @@ mod tests {
        app
            .configure_sets(
                Update,
                (TITCSets::Pull, TITCSets::Broadcast, TITCSets::Update, TITCSets::Push).chain(),
                (TICSets::Pull, TICSets::Broadcast, TICSets::Update, TICSets::Push).chain(),
            )
            .add_event::<net::DisconnectionEvent>()
            .add_systems(
            Update,
            ((net::disconnect_clients, despawn_disconnected_players).in_set(TITCSets::Update),),
            ((net::disconnect_clients, despawn_disconnected_players).in_set(TICSets::Update),),
        );

        // Create a client for testing