From 9089ec4d6a947e27635d2b015e4b3d28e5d77f5d Mon Sep 17 00:00:00 2001 From: Emisse <99158783+Emisse@users.noreply.github.com> Date: Fri, 23 Dec 2022 08:54:44 -0700 Subject: [PATCH 01/30] Bagel Update 15.9 (#13149) --- Resources/Maps/bagel.yml | 4142 ++++++++++++++++++++++---------------- 1 file changed, 2455 insertions(+), 1687 deletions(-) diff --git a/Resources/Maps/bagel.yml b/Resources/Maps/bagel.yml index f0cbc42a1e..a671451a33 100644 --- a/Resources/Maps/bagel.yml +++ b/Resources/Maps/bagel.yml @@ -500,7 +500,7 @@ entities: tiles: FQAAAhUAAAIVAAACFQAAABUAAABYAAAAVwAAAAAAAAAAAAAAAAAAAFcAAABXAAAAVwAAAFcAAABYAAAAPgAAARUAAAAVAAABFQAAARUAAAIVAAADWAAAAFcAAAAAAAAAAAAAAFcAAABYAAAAWAAAAFgAAABXAAAAWAAAAD4AAAAVAAAAFQAAARUAAAEVAAABWAAAAFgAAABXAAAAAAAAAFcAAABYAAAAJQAAACUAAAAlAAAAWAAAAFgAAAA+AAADFQAAAxUAAAAVAAABFQAAAlgAAABXAAAAAAAAAFcAAABYAAAAJQAAACUAAAAlAAAAJQAAACUAAABYAAAAPgAAAFgAAABYAAAAWAAAAFgAAABYAAAAVwAAAAAAAABXAAAAWAAAACUAAAAlAAAAJQAAACUAAAAlAAAAWAAAAD4AAANXAAAAVwAAAFcAAABXAAAAVwAAAAAAAAAAAAAAVwAAAFgAAAAVAAACJQAAACUAAAAlAAAAFQAAAlgAAAA+AAABVwAAAAAAAAAAAAAAAAAAAFcAAABXAAAAVwAAAFgAAABYAAAAWAAAAFgAAAAzAAAAWAAAAFgAAABYAAAAPgAAAVcAAABXAAAAVwAAAFcAAABYAAAAWAAAAFgAAABYAAAAPgAAAj4AAAA+AAABPgAAAT4AAAM+AAACPgAAAz4AAANYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAM+AAAAPgAAAz4AAAE+AAABPgAAAD4AAAA+AAACPgAAAT4AAAM+AAACPgAAAD4AAAM+AAACPgAAAT4AAAE+AAABPgAAAz4AAAM+AAACPgAAAT4AAAM+AAACPgAAAj4AAAM+AAACPgAAAj4AAAA+AAAAPgAAAD4AAAE+AAAAPgAAAj4AAAM+AAABWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAI+AAAAPgAAAT4AAAA+AAABPgAAAlgAAABYAAAAWAAAAFgAAAA+AAADPgAAAD4AAAE+AAACPgAAAlgAAAA+AAADPgAAAFgAAABYAAAAWAAAAFgAAABYAAAAPgAAAz4AAAJYAAAAPgAAAD4AAAI+AAACPgAAAz4AAANYAAAAPgAAAD4AAAM+AAAAWAAAAD4AAAM+AAAAPgAAAT4AAAA+AAADWAAAAD4AAAE+AAACPgAAAz4AAAI+AAAAPgAAAD4AAAI+AAABPgAAAz4AAAI+AAADPgAAAj4AAAA+AAADPgAAAz4AAAM+AAABPgAAAT4AAAE+AAACPgAAA1gAAAA+AAACPgAAAj4AAANYAAAAPgAAAT4AAAA+AAADPgAAAD4AAAJYAAAAPgAAAD4AAAI+AAACPgAAAD4AAABYAAAAPgAAAQ== -1,0: ind: -1,0 - tiles: PgAAAD4AAAI+AAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABYAAAAFQAAARUAAAEVAAABFQAAAz4AAAA+AAADWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABXAAAAWAAAABUAAAEVAAABFQAAARUAAAE+AAAAPgAAA1gAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAABYAAAAVwAAAFgAAABYAAAAFQAAARUAAAIVAAAAPgAAAT4AAAA0AAAANAAAADQAAAAVAAACFQAAAhUAAAM0AAAAWAAAAAAAAABXAAAAWAAAABUAAAAVAAACFQAAAz4AAAI+AAADWAAAACkAAAA0AAAAFQAAABUAAAIVAAADNAAAAFgAAAAAAAAAVwAAAFgAAABYAAAAWAAAAFgAAAA+AAADPgAAA1gAAAApAAAANAAAABUAAAMVAAADFQAAATQAAABYAAAAAAAAAAAAAABXAAAAVwAAAFcAAABXAAAAPgAAAj4AAAJYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFcAAABXAAAAVwAAAAAAAAAAAAAAAAAAAD4AAAM+AAABPgAAAT4AAAI+AAABPgAAAD4AAAI+AAACPgAAAlgAAABYAAAAWAAAAFgAAABXAAAAVwAAAFcAAAA+AAACPgAAAD4AAAE+AAABPgAAAj4AAAI+AAABPgAAAj4AAAE+AAAAPgAAAD4AAAJYAAAAWAAAAFgAAABYAAAAPgAAAj4AAAM+AAACPgAAAj4AAAI+AAACPgAAAz4AAAA+AAACPgAAAj4AAAA+AAADPgAAAz4AAAI+AAADPgAAAD4AAAA+AAADWAAAAFgAAABYAAAAWAAAAD4AAAFYAAAAWAAAAD4AAAE+AAABPgAAAj4AAAI+AAAAPgAAAD4AAAA+AAACPgAAAT4AAAE+AAADWAAAAFUAAAJVAAABVQAAAlgAAABYAAAAWAAAAFgAAAA+AAAAPgAAAT4AAAM+AAADPgAAAT4AAAE+AAAAPgAAAlgAAABVAAADVQAAAVUAAANVAAADVQAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAM+AAADPgAAAj4AAAJYAAAAVQAAA1UAAAFVAAAAVQAAAlUAAAFYAAAAFQAAABUAAAEVAAAAWAAAAD4AAAI+AAADPgAAAFgAAABYAAAAWAAAAFUAAAFVAAACVQAAAVUAAAJVAAAAWAAAABUAAAAVAAABFQAAAT4AAAA+AAAAPgAAAT4AAANYAAAAVQAAAlUAAANVAAABVQAAAlUAAAJVAAACVQAAAFgAAAAVAAABFQAAARUAAAFYAAAAPgAAAQ== + tiles: PgAAAD4AAAI+AAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABYAAAAFQAAARUAAAEVAAABFQAAAz4AAAA+AAADWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABXAAAAWAAAABUAAAEVAAABFQAAARUAAAE+AAAAPgAAA1gAAAA0AAAANAAAADQAAAA0AAAANAAAADQAAABYAAAAVwAAAFgAAABYAAAAFQAAARUAAAIVAAAAPgAAAT4AAAA0AAAANAAAADQAAAAVAAACFQAAAhUAAAM0AAAAWAAAAAAAAABXAAAAWAAAABUAAAAVAAACFQAAAz4AAAI+AAADWAAAADQAAAA0AAAAFQAAABUAAAIVAAADNAAAAFgAAAAAAAAAVwAAAFgAAABYAAAAWAAAAFgAAAA+AAADPgAAA1gAAAApAAAAKQAAABUAAAMVAAADFQAAATQAAABYAAAAAAAAAAAAAABXAAAAVwAAAFcAAABXAAAAPgAAAj4AAAJYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFcAAABXAAAAVwAAAAAAAAAAAAAAAAAAAD4AAAM+AAABPgAAAT4AAAI+AAABPgAAAD4AAAI+AAACPgAAAlgAAABYAAAAWAAAAFgAAABXAAAAVwAAAFcAAAA+AAACPgAAAD4AAAE+AAABPgAAAj4AAAI+AAABPgAAAj4AAAE+AAAAPgAAAD4AAAJYAAAAWAAAAFgAAABYAAAAPgAAAj4AAAM+AAACPgAAAj4AAAI+AAACPgAAAz4AAAA+AAACPgAAAj4AAAA+AAADPgAAAz4AAAI+AAADPgAAAD4AAAA+AAADWAAAAFgAAABYAAAAWAAAAD4AAAFYAAAAWAAAAD4AAAE+AAABPgAAAj4AAAI+AAAAPgAAAD4AAAA+AAACPgAAAT4AAAE+AAADWAAAAFUAAAJVAAABVQAAAlgAAABYAAAAWAAAAFgAAAA+AAAAPgAAAT4AAAM+AAADPgAAAT4AAAE+AAAAPgAAAlgAAABVAAADVQAAAVUAAANVAAADVQAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAM+AAADPgAAAj4AAAJYAAAAVQAAA1UAAAFVAAAAVQAAAlUAAAFYAAAAFQAAABUAAAEVAAAAWAAAAD4AAAI+AAADPgAAAFgAAABYAAAAWAAAAFUAAAFVAAACVQAAAVUAAAJVAAAAWAAAABUAAAAVAAABFQAAAT4AAAA+AAAAPgAAAT4AAANYAAAAVQAAAlUAAANVAAABVQAAAlUAAAJVAAACVQAAAFgAAAAVAAABFQAAARUAAAFYAAAAPgAAAQ== 0,-2: ind: 0,-2 tiles: PgAAAD4AAABYAAAAFQAAABUAAAIVAAACVQAAAFUAAAFVAAACWAAAAFUAAANVAAACVQAAA1UAAAJVAAACFQAAAj4AAAI+AAABWAAAABUAAAMVAAADFQAAAVgAAABYAAAAWAAAAFgAAABWAAABVgAAAlYAAABWAAAAVgAAAxUAAAI+AAAAPgAAABUAAAMVAAAAFQAAABUAAAAVAAABFQAAABUAAANYAAAAWAAAAFgAAAAzAAAAFQAAABUAAAEVAAABPgAAAD4AAANYAAAAFQAAAhUAAAIVAAACFQAAAxUAAAIVAAADWAAAABUAAAEcAAAAHAAAAxwAAAMcAAADHAAAAj4AAAI+AAAAWAAAABUAAAAVAAAAFQAAABUAAAIVAAACFQAAAlgAAAAVAAADHAAAABwAAAMcAAAAHAAAAxwAAAM+AAABPgAAAVgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAFQAAABUAAAMVAAADFQAAABUAAAAVAAAAPgAAAT4AAAFYAAAAMgAAAjIAAAMyAAADMgAAATIAAAIyAAABWAAAAFgAAABYAAAAWAAAAAwAAAFYAAAAWAAAAD4AAAE+AAABPgAAAT4AAAE+AAAAPgAAAT4AAAE+AAABPgAAAz4AAAM+AAAAPgAAAj4AAAI+AAACPgAAAT4AAAI+AAABPgAAAz4AAAM+AAAAPgAAAz4AAAA+AAAAPgAAAD4AAAM+AAABPgAAAT4AAAM+AAAAPgAAAj4AAAI+AAADPgAAAT4AAAA+AAABPgAAAD4AAAA+AAABPgAAAD4AAAI+AAACPgAAAj4AAAM+AAACPgAAAz4AAAM+AAADPgAAAz4AAAE+AAAAWAAAAFgAAABYAAAAWAAAAD4AAAE+AAAAPgAAAD4AAANYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAE+AAACPgAAA1gAAABXAAAAVwAAAFgAAAA+AAAAPgAAAz4AAAA+AAAAPgAAAxUAAAIVAAADFQAAAVgAAAA+AAACPgAAAz4AAAJYAAAAVwAAAFcAAABYAAAAPgAAAz4AAAE+AAABPgAAAVgAAAAVAAACFQAAAhUAAAFYAAAAPgAAAz4AAAA+AAABWAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAABUAAAJYAAAAWAAAAD4AAAA+AAABPgAAA1gAAABXAAAAAAAAAAAAAABXAAAAVwAAAFcAAABYAAAAWAAAAFgAAAA+AAACPgAAA1gAAAA+AAADPgAAAz4AAAFYAAAAVwAAAAAAAAAAAAAAAAAAAAAAAABXAAAAWAAAAFgAAABYAAAAPgAAAj4AAAM+AAACPgAAAw== @@ -533,7 +533,7 @@ entities: tiles: NgAAADYAAAA+AAABNAAAADQAAAA0AAAANAAAADQAAAA+AAABVQAAAlUAAAFVAAABFQAAAFgAAAA+AAABPgAAADYAAAA2AAAAPgAAATQAAAA0AAAANAAAADQAAAA0AAAAPgAAAFUAAAFVAAABVQAAAxUAAAFYAAAAPgAAAj4AAAM2AAAANgAAAD4AAAI0AAAANAAAADQAAAA0AAAANAAAAD4AAANVAAAAVQAAAlUAAAIVAAADWAAAAD4AAAI+AAADWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAPgAAAhUAAAMVAAACWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAAVAAABFQAAAhUAAAFYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEgAAABIAAAASAAAAFgAAAA+AAAAWAAAAFgAAABYAAAAWAAAAFgAAAA+AAACWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAPgAAAj4AAAI+AAABPgAAAD4AAAI+AAACPgAAAz4AAAM+AAACPgAAAD4AAAA+AAAAPgAAAT4AAAM+AAACPgAAAz4AAAE+AAAAPgAAAz4AAAM+AAABPgAAAD4AAAM+AAAAPgAAAT4AAAM+AAAAPgAAAj4AAAI+AAAAPgAAAD4AAAA+AAACPgAAAz4AAAI+AAAAPgAAAz4AAAE+AAACPgAAAj4AAAI+AAAAPgAAAT4AAAA+AAACPgAAAj4AAAE+AAABPgAAAxUAAABYAAAAWAAAAFgAAABYAAAAPgAAAT4AAAI+AAACWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAI+AAAAFQAAA1gAAAAWAAAAVQAAAlUAAABVAAABVQAAAlUAAAMWAAADWAAAAFcAAABXAAAAVwAAAFgAAAA+AAACDgAAABUAAABYAAAAFgAAAlUAAAJVAAABVQAAAFUAAAJVAAACFgAAAFgAAAAAAAAAAAAAAAAAAABYAAAAPgAAAg4AAAA+AAAAWAAAABYAAANVAAADVQAAAVUAAANVAAAAVQAAARYAAABYAAAAVwAAAFcAAABXAAAAWAAAAD4AAAEOAAAAFQAAA1gAAAAWAAACVQAAAlUAAAFVAAAAVQAAA1UAAAMWAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA+AAABPgAAABUAAABYAAAAFgAAAFUAAANVAAAAVQAAA1UAAAJVAAACFgAAAFgAAAAVAAABFQAAAxUAAAFYAAAAPgAAAg== 1,-3: ind: 1,-3 - tiles: WAAAAFgAAABYAAAAWAAAAFgAAABYAAAASAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAWAAAAFgAAABYAAAAQQAAAFgAAABYAAAAWAAAAEgAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABIAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQQAAAFgAAABBAAAAWAAAAFgAAABYAAAASAAAAFgAAABXAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAEEAAABYAAAAWAAAAFgAAABYAAAAWAAAAFcAAABXAAAAVwAAAFcAAABXAAAAAAAAAAAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABIAAAASAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFcAAABXAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABIAAAASAAAAEgAAABIAAAAWAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAABUAAABYAAAAWAAAAFgAAABYAAAAWAAAABUAAAEVAAADFQAAAhUAAAEVAAAAFQAAA1gAAAAVAAADFQAAAxUAAAMVAAACLAAAABUAAAIVAAACFQAAABUAAAMcAAABHAAAABwAAAMcAAACHAAAABwAAAAeAAACDAAAAwwAAAAMAAABDAAAAxUAAAEVAAAARgAAAEYAAAJGAAADHAAAABwAAAEcAAABHAAAARwAAAIcAAACWAAAAAwAAAMMAAAADAAAAQwAAAFYAAAAFQAAA0YAAAIrAAAAKwAAABwAAAAcAAACHAAAAhwAAAAcAAABHAAAAlgAAAAMAAACDAAAAQwAAAMMAAAAWAAAAFgAAABCAAACWAAAAFgAAAAcAAABHAAAAhwAAAMcAAAAHAAAARwAAAJYAAAADAAAAwwAAAAMAAAADAAAA1gAAABGAAADRgAAAEYAAAErAAAAHAAAAhwAAAAcAAACHAAAAxwAAAIcAAACWAAAAAwAAAAMAAABDAAAAgwAAABYAAAARgAAA0YAAABGAAADRgAAAw== + tiles: WAAAAFgAAABYAAAAWAAAAFgAAABYAAAASAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAWAAAAFgAAABYAAAAQQAAAFgAAABYAAAAWAAAAEgAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABIAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQQAAAFgAAABBAAAAWAAAAFgAAABYAAAASAAAAFgAAABXAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAEEAAABYAAAAWAAAAFgAAABYAAAAWAAAAFcAAABXAAAAVwAAAFcAAABXAAAAAAAAAAAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABIAAAASAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFcAAABXAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABIAAAASAAAAEgAAABIAAAAWAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAABUAAABYAAAAWAAAAFgAAABYAAAAWAAAABUAAAEVAAADFQAAAhUAAAEVAAAAFQAAA1gAAAAVAAADFQAAAxUAAAMVAAACFQAAAFgAAAAVAAACFQAAABUAAAMcAAABHAAAABwAAAMcAAACHAAAABwAAAAeAAACDAAAAwwAAAAMAAABDAAAAxUAAAEVAAAARgAAAEYAAAJGAAADHAAAABwAAAEcAAABHAAAARwAAAIcAAACWAAAAAwAAAMMAAAADAAAAQwAAAEVAAAAWAAAAEYAAAIrAAAAKwAAABwAAAAcAAACHAAAAhwAAAAcAAABHAAAAlgAAAAMAAACDAAAAQwAAAMMAAAAWAAAAFgAAABCAAACWAAAAFgAAAAcAAABHAAAAhwAAAMcAAAAHAAAARwAAAJYAAAADAAAAwwAAAAMAAAADAAAA1gAAABGAAADRgAAAEYAAAErAAAAHAAAAhwAAAAcAAACHAAAAxwAAAIcAAACWAAAAAwAAAAMAAABDAAAAgwAAABYAAAARgAAA0YAAABGAAADRgAAAw== -3,0: ind: -3,0 tiles: FQAAAxUAAAEVAAABFQAAA1gAAABLAAAASwAAAFgAAAA+AAACPgAAAD4AAAI+AAACWAAAADYAAAA2AAAANgAAABUAAAFYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAI+AAABPgAAAlgAAAA2AAAANgAAADYAAAAVAAABFQAAAVgAAAAVAAABFQAAABUAAAEVAAAAFQAAAVgAAAA+AAACPgAAAT4AAANYAAAANgAAADYAAAA2AAAAFQAAAhUAAAMVAAADFQAAAhUAAAEVAAADFQAAABUAAAJYAAAAPgAAAz4AAAI+AAADWAAAAFgAAABYAAAAFQAAABUAAAAVAAADWAAAABUAAAMVAAACFQAAARUAAAAVAAAAWAAAAD4AAAI+AAAAPgAAAlgAAAAVAAAAFQAAAxUAAAJYAAAAWAAAAFgAAAAVAAABFQAAARUAAAIVAAACFQAAAFgAAAA+AAADPgAAAj4AAAM+AAACFQAAAxUAAAMVAAAAVwAAAFcAAABYAAAAWAAAABUAAAJYAAAAWAAAAFgAAABYAAAAPgAAAz4AAAE+AAACWAAAAFgAAABYAAAAWAAAAFcAAABXAAAAWAAAAFUAAAJVAAAAVQAAA1gAAABVAAADWAAAAD4AAAA+AAACPgAAAz4AAAM+AAAAPgAAAz4AAABXAAAAVwAAAFgAAABVAAACVQAAAFUAAAIVAAABVQAAAlgAAAA+AAABPgAAAj4AAAA+AAAAPgAAAT4AAAM+AAAAVwAAAFcAAABYAAAAVQAAA1UAAABVAAADWAAAAFUAAAFYAAAAPgAAAj4AAAM+AAACPgAAAD4AAAE+AAACPgAAAVgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAADYAAABYAAAAWAAAAFgAAABYAAAAFQAAAhUAAAEVAAABFQAAABUAAAAVAAAAWAAAABUAAAAVAAACFQAAARUAAAA2AAAANgAAADYAAABYAAAAPgAAAT4AAAA+AAABFQAAAhUAAAMVAAAAFQAAAFgAAAAVAAADFQAAAxUAAAAVAAAANgAAADYAAAA2AAAAWAAAAD4AAAMOAAAAPgAAARUAAAEVAAAAFQAAAxUAAAI+AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAAFgAAAA+AAACDgAAAA4AAAAVAAABFQAAAhUAAAMVAAADWAAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAAPgAAAA4AAAA+AAABWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAE+AAACPgAAAw== @@ -578,13 +578,13 @@ entities: tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAAAAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAAAAAAAAAAABXAAAAVwAAAA== -2,-3: ind: -2,-3 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAVwAAAFgAAABYAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFgAAABYAAAAWAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAWAAAAFgAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABXAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFgAAABYAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABYAAAAWAAAAFgAAABXAAAAAAAAAFcAAABXAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAEgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAABIAAAASAAAAEgAAABIAAAAWAAAAFgAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABYAAAAWAAAAFgAAABYAAAASAAAAEgAAABIAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABIAAAASAAAAEgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAASAAAAEgAAABIAAAASAAAAEgAAABYAAAAWAAAAFgAAABYAAAAWAAAAA== + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAVwAAAFgAAABYAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFgAAABYAAAAWAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAWAAAAFgAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABXAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABYAAAAWAAAAFgAAABXAAAAAAAAAFcAAABXAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAEgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAABIAAAASAAAAEgAAABIAAAAWAAAAFgAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABYAAAAWAAAAFgAAABYAAAASAAAAEgAAABIAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABIAAAASAAAAEgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAASAAAAEgAAABIAAAASAAAAEgAAABYAAAAWAAAAFgAAABYAAAAWAAAAA== -4,-1: ind: -4,-1 tiles: WAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABVAAACVQAAAVgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABIAAAASAAAAFgAAABYAAAAWAAAAFgAAABIAAAASAAAAFgAAABIAAAASAAAAEgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAASAAAAEgAAABIAAAASgAAAUoAAAFYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEoAAANYAAAASgAAAFgAAABIAAAASAAAAFgAAABYAAAAWAAAAFcAAAAAAAAAAAAAAAAAAABYAAAAFQAAARUAAAFYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAADQAAABYAAAAWAAAABUAAAIVAAABVwAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAANAAAADQAAAA0AAAANAAAAFgAAAAVAAACFQAAAlcAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAADQAAAA0AAAANAAAADQAAABYAAAAFQAAAhUAAANXAAAAWAAAAFgAAABYAAAASAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA0AAAAWAAAABUAAAMVAAADVwAAAFgAAABYAAAAWAAAAEgAAABYAAAAWAAAAFgAAABLAAABSwAAAksAAANLAAABSwAAAlgAAAAVAAAAFQAAAFgAAABYAAAAWAAAAFgAAABIAAAAWAAAAFgAAABYAAAASwAAAksAAANLAAADSwAAAksAAAFYAAAAFQAAABUAAAJIAAAAWAAAAFgAAABYAAAASAAAAFgAAABYAAAAWAAAAEsAAAJLAAAASwAAAEsAAANLAAAAWAAAABUAAAEVAAABWAAAAFgAAABYAAAAWAAAAEgAAABYAAAASwAAAEsAAAFLAAADSwAAAEsAAANLAAACSwAAAlgAAAAVAAACFQAAAA== -4,-2: ind: -4,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFgAAABYAAAAWAAAAFgAAABYAAAAQQAAAFgAAABYAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABBAAAAWAAAAEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABYAAAAQQAAAEEAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAAAAAAAAAAAAAAAAAFcAAABYAAAAQQAAAFgAAABYAAAAWAAAAFcAAABXAAAAVwAAAFcAAAAAAAAAAAAAAFcAAAAAAAAAAAAAAFcAAABXAAAAWAAAAFgAAABYAAAAWAAAAFgAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAAAAAAAAAAAAAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAANYAAAAWAAAAFcAAABYAAAAWAAAAFgAAABYAAAASAAAAEgAAABYAAAAWAAAAFgAAAA+AAABWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAANYAAAAWAAAAFgAAABYAAAAWAAAAD4AAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA+AAACPgAAAD4AAANYAAAAWAAAAD4AAAI+AAACPgAAA1gAAABYAAAAWAAAAFgAAABYAAAALgAAAC4AAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAC4AAAAuAAAASAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAuAAAALgAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAALgAAAC4AAABYAAAAWAAAAFgAAABYAAAASAAAAEgAAABIAAAAWAAAAEgAAABIAAAAWAAAAFgAAABYAAAAWAAAAFUAAANVAAADWAAAAFgAAABYAAAAWAAAAEgAAABIAAAASAAAAFgAAABIAAAAWAAAAFgAAABYAAAAWAAAAFgAAABVAAAAVQAAAw== + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAABYAAAAQQAAAFgAAABYAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABBAAAAWAAAAEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABYAAAAQQAAAEEAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABYAAAAQQAAAFgAAABYAAAAWAAAAFcAAABXAAAAVwAAAFcAAAAAAAAAAAAAAFcAAAAAAAAAAAAAAFcAAABXAAAAWAAAAFgAAABYAAAAWAAAAFgAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAAAAAAAAAAAAAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAANYAAAAWAAAAFcAAABYAAAAWAAAAFgAAABYAAAASAAAAEgAAABYAAAAWAAAAFgAAAA+AAABWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAANYAAAAWAAAAFgAAABYAAAAWAAAAD4AAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA+AAACPgAAAD4AAANYAAAAWAAAAD4AAAI+AAACPgAAA1gAAABYAAAAWAAAAFgAAABYAAAALgAAAC4AAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAC4AAAAuAAAASAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAuAAAALgAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAALgAAAC4AAABYAAAAWAAAAFgAAABYAAAASAAAAEgAAABIAAAAWAAAAEgAAABIAAAAWAAAAFgAAABYAAAAWAAAAFUAAANVAAADWAAAAFgAAABYAAAAWAAAAEgAAABIAAAASAAAAFgAAABIAAAAWAAAAFgAAABYAAAAWAAAAFgAAABVAAAAVQAAAw== -6,-1: ind: -6,-1 tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAAAAAAAAVwAAAFcAAABXAAAAAAAAAFcAAABXAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAVwAAAFcAAABXAAAAVwAAAAAAAABXAAAAVwAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAAAAAABXAAAAVwAAAFcAAAAAAAAAVwAAAFcAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAAAAAAAAVwAAAFcAAABXAAAAAAAAAFcAAABXAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAAAAAAFcAAAAAAAAAVwAAAAAAAABXAAAAAAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== @@ -593,10 +593,10 @@ entities: tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAAAAAAAAVwAAAAAAAABXAAAAAAAAAFcAAAAAAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAAAAAAFcAAABXAAAAVwAAAAAAAABXAAAAVwAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAAAAAABXAAAAVwAAAFcAAAAAAAAAVwAAAFcAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABXAAAAVwAAAFcAAABXAAAAAAAAAFcAAABXAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAAAAAAFcAAABXAAAAVwAAAAAAAABXAAAAVwAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABXAAAAVwAAAAAAAABXAAAAVwAAAFcAAAAAAAAAVwAAAFcAAABXAAAAAAAAAAAAAAAAAAAAAAAAAFcAAAAAAAAAVwAAAAAAAAAAAAAAVwAAAFcAAABXAAAAAAAAAFcAAABXAAAAVwAAAAAAAAAAAAAAAAAAAAAAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAAAAAABXAAAAAAAAAAAAAABXAAAAVwAAAFcAAAAAAAAAVwAAAFcAAABXAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABXAAAAVwAAAFcAAAAAAAAAVwAAAFcAAABXAAAAAAAAAFcAAABXAAAAVwAAAA== -4,0: ind: -4,0 - tiles: WAAAAFgAAABYAAAAWAAAAEgAAABYAAAASwAAAksAAANLAAAASwAAAVgAAABLAAACWAAAAFgAAAAVAAAAFQAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAJYAAAAWAAAAFgAAAAVAAACFQAAABUAAAFYAAAAFQAAARUAAAJYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAE+AAADWAAAABUAAAIVAAAAFQAAAxUAAAMVAAACFQAAABUAAAMVAAABWAAAAFgAAABYAAAAWAAAAFgAAAA+AAABPgAAAD4AAAMVAAACFQAAAhUAAAIVAAAAFQAAAhUAAAAVAAACFQAAAFgAAABYAAAAWAAAAFgAAABYAAAAPgAAAz4AAAI+AAABFQAAARUAAAMVAAADFQAAARUAAAEVAAACFQAAABUAAAFYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAM+AAABPgAAABUAAAEVAAACFQAAAhUAAAIVAAACFQAAAhUAAANYAAAASQAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAVAAADFQAAAhUAAABYAAAAWAAAABUAAANYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA+AAADPgAAAj4AAAI+AAACWAAAAA4AAAAVAAABDgAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEgAAABYAAAASwAAAEsAAANLAAABSwAAAFgAAAAOAAAAFQAAAg4AAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEsAAAFLAAABSwAAAEsAAAJYAAAADgAAABUAAAEOAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABLAAADSwAAAEsAAANLAAADWAAAAFgAAAAVAAAAWAAAAFgAAAA+AAABWAAAAFgAAABYAAAAWAAAAFgAAABYAAAASwAAA0sAAAFLAAAASwAAA1gAAAAVAAACFQAAAhUAAAAVAAACWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEsAAABLAAACSwAAAEsAAAAVAAACFQAAAhUAAAIVAAACFQAAA1gAAABYAAAASQAAAD4AAAJYAAAAWAAAAFgAAABLAAAASwAAAUsAAAJLAAACWAAAADQAAAA0AAAANAAAABUAAAJYAAAAWAAAAFgAAABYAAAAQQAAAFgAAABYAAAASwAAAksAAANLAAABSwAAAlgAAAA0AAAANAAAADQAAAAVAAABVwAAAFcAAABXAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAFQAAAhUAAAMVAAACWAAAAA== + tiles: WAAAAFgAAABYAAAAWAAAAEgAAABYAAAASwAAAksAAANLAAAASwAAAVgAAABLAAACWAAAAFgAAAAVAAAAFQAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAJYAAAAWAAAAFgAAAAVAAACFQAAABUAAAFYAAAAFQAAARUAAAJYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAE+AAADWAAAABUAAAIVAAAAFQAAAxUAAAMVAAACFQAAABUAAAMVAAABWAAAAFgAAABYAAAAWAAAAFgAAAA+AAABPgAAAD4AAAMVAAACFQAAAhUAAAIVAAAAFQAAAhUAAAAVAAACFQAAAFgAAABYAAAAWAAAAFgAAABYAAAAPgAAAz4AAAI+AAABFQAAARUAAAMVAAADFQAAARUAAAEVAAACFQAAABUAAAFYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAM+AAABPgAAABUAAAEVAAACFQAAAhUAAAIVAAACFQAAAhUAAANYAAAASQAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAVAAADFQAAAhUAAABYAAAAWAAAABUAAANYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA+AAADPgAAAj4AAAI+AAACWAAAAA4AAAAVAAABDgAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEgAAABYAAAASwAAAEsAAANLAAABSwAAAFgAAAAOAAAAFQAAAg4AAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEsAAAFLAAABSwAAAEsAAAJYAAAADgAAABUAAAEOAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABLAAADSwAAAEsAAANLAAADWAAAAFgAAAAVAAAAWAAAAFgAAAA+AAABWAAAAFgAAABYAAAAWAAAAFgAAABYAAAASwAAA0sAAAFLAAAASwAAA1gAAAAVAAACFQAAAhUAAAAVAAACWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEsAAABLAAACSwAAAEsAAAAVAAACFQAAAhUAAAIVAAACFQAAA1gAAABYAAAASQAAAD4AAAJYAAAAWAAAAFgAAABLAAAASwAAAUsAAAJLAAACWAAAADQAAAA0AAAANAAAABUAAAJYAAAAWAAAAFgAAABYAAAAQQAAAFgAAABYAAAASwAAAksAAANLAAABSwAAAksAAAA0AAAANAAAADQAAAAVAAABVwAAAFcAAABXAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAFQAAAhUAAAMVAAACWAAAAA== -4,-3: ind: -4,-3 - tiles: AAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAFcAAABXAAAAVwAAAFcAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABXAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAVAAACFQAAARUAAAMVAAADFQAAARUAAAI0AAAAVwAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAABUAAAAVAAACFQAAARUAAAIVAAAAWAAAABUAAAMVAAACWAAAAAAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAABUAAAJYAAAAFQAAAVgAAAAVAAACWAAAAFcAAABXAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAVwAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAAAAAAWAAAAFcAAABXAAAAVwAAAFcAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAAAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAAAAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAAAAAAAAAAAAAAAAAFgAAAAAAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABXAAAAVwAAAFcAAABYAAAAAAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABYAAAAWAAAAFgAAABYAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAWAAAAEEAAABBAAAAWAAAAEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAAAAAAAAAAAAAAAAAVwAAAFgAAABBAAAAWAAAAFgAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEEAAABBAAAAWAAAAA== + tiles: AAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAFcAAABXAAAAVwAAAFcAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABXAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAVAAACFQAAARUAAAMVAAADFQAAARUAAAI0AAAAVwAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAABUAAAAVAAACFQAAARUAAAIVAAAAWAAAABUAAAMVAAACWAAAAAAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAABUAAAJYAAAAFQAAAVgAAAAVAAACWAAAAFcAAABXAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAVwAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAAAAAAWAAAAFcAAABXAAAAVwAAAFcAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAAAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAAAAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAAAAAAAAAAAAAAAAAFgAAAAAAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABXAAAAVwAAAFcAAABYAAAAAAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABYAAAAWAAAAFgAAABYAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAWAAAAEEAAABBAAAAWAAAAEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFgAAABBAAAAWAAAAFgAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEEAAABBAAAAWAAAAA== 0,-4: ind: 0,-4 tiles: PgAAAj4AAAA+AAABWAAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAAAAAAAAAAAAAAAAAD4AAAM+AAABWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAA+AAABPgAAAD4AAABYAAAAPgAAAz4AAAI+AAACPgAAAD4AAAM+AAAAPgAAAlgAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAD4AAAE+AAADWAAAAD4AAAM+AAACPgAAAj4AAAEnAAAAPgAAAT4AAABYAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAM+AAADPgAAAD4AAAE+AAABPgAAAj4AAAI+AAACPgAAAj4AAAI+AAACWAAAAAAAAAAAAAAAAAAAAAAAAAA+AAACPgAAAz4AAAJYAAAAPgAAAD4AAAE+AAADPgAAACcAAAA+AAAAPgAAAlgAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAz4AAAI+AAACWAAAAD4AAAI+AAABPgAAAz4AAAM+AAAAPgAAAj4AAANYAAAAVwAAAAAAAAAAAAAAAAAAAD4AAAA+AAADPgAAAlgAAAA+AAADPgAAAj4AAAE+AAACJwAAAD4AAAA+AAAAWAAAAAAAAAAAAAAAAAAAAAAAAAA+AAADPgAAAT4AAAA+AAAAPgAAAT4AAAE+AAACPgAAAz4AAAI+AAACPgAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAj4AAAM+AAACWAAAAD4AAAI+AAAAPgAAAiUAAAAlAAAAJQAAAD4AAANYAAAAAAAAAAAAAAAAAAAAVwAAAD4AAAM+AAAAPgAAAlgAAAA+AAAAPgAAAz4AAAElAAAAJQAAACUAAAA+AAAAWAAAAAAAAAAAAAAAAAAAAFcAAAA+AAADPgAAAlgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABXAAAAVwAAAFcAAABXAAAAPgAAAT4AAAE+AAABWAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAA+AAACPgAAAlgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEgAAABIAAAASAAAAFgAAAA+AAABPgAAAD4AAANYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAPgAAAj4AAAA+AAABWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAASAAAAEgAAABIAAAAWAAAAA== @@ -617,7 +617,7 @@ entities: tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABXAAAAVwAAAFcAAAAAAAAAVwAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAAAAAAAAAAAAAAAAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAAAAAAAAAAAAAAAAAABXAAAAAAAAAAAAAAAAAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAAAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABXAAAAWAAAAD4AAAE+AAACPgAAAz4AAAI+AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAAAAAAAAAAAAAFgAAAA+AAACPgAAAz4AAAE+AAAAPgAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAPgAAAT4AAAI+AAADPgAAAj4AAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAD4AAAA+AAACWAAAAD4AAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAAA+AAADWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAPgAAA1gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABYAAAAWAAAAFgAAABYAAAAWAAAADsAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAADsAAAA7AAAAOwAAADsAAAA3AAAAOwAAAA== -3,-3: ind: -3,-3 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAAAAAAAAAAAAVwAAAFgAAABYAAAAWAAAAFgAAAAAAAAAAAAAABUAAAEVAAABVQAAAVUAAAJVAAABWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAFQAAADoAAAA6AAAAWAAAAAAAAAAVAAACWAAAAFgAAABYAAAAWAAAABUAAAEzAAAAMwAAADMAAAAzAAAAMwAAABUAAAM6AAAAOgAAAFgAAAAAAAAAWAAAAFgAAAAVAAACFQAAAhUAAAAVAAABWAAAAFgAAABYAAAAWAAAAFgAAAAVAAADOgAAADoAAABYAAAAAAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAAAAAAAAAAAFcAAABYAAAAWAAAAFgAAABYAAAAAAAAAAAAAAAzAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAMwAAAFgAAAAAAAAAAAAAAAAAAABXAAAAVwAAAFcAAABXAAAAAAAAAFcAAABXAAAAVwAAAFcAAABXAAAAWAAAADMAAABYAAAAAAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAzAAAAWAAAAFcAAABXAAAAVwAAAFgAAABVAAADVQAAAFgAAABYAAAAAQAAAAEAAAABAAAAWAAAAFgAAABYAAAAMwAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABVAAACWAAAAAEAAAABAAAAAQAAAFgAAABYAAAASAAAAFgAAABYAAAAWAAAAEEAAABYAAAAWAAAAFUAAAJYAAAAWAAAAFgAAAABAAAAAQAAAAEAAABYAAAAWAAAAFgAAABYAAAAWAAAAEEAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEEAAABBAAAAQQAAAEEAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAA== + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAAAAAAAAAAAAVwAAAFgAAABYAAAAWAAAAFgAAAAAAAAAAAAAABUAAAEVAAABVQAAAVUAAAJVAAABWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAFQAAADoAAAA6AAAAWAAAAAAAAAAVAAACWAAAAFgAAABYAAAAWAAAABUAAAEzAAAAMwAAADMAAAAzAAAAMwAAABUAAAM6AAAAOgAAAFgAAAAAAAAAWAAAAFgAAAAVAAACFQAAAhUAAAAVAAABWAAAAFgAAABYAAAAWAAAAFgAAAAVAAADOgAAADoAAABYAAAAAAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAAAAAAAAAAAFcAAABYAAAAWAAAAFgAAABYAAAAAAAAAAAAAAAzAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMwAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAADMAAABYAAAAAAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAzAAAAWAAAAFcAAABXAAAAVwAAAFgAAABVAAADVQAAAFgAAABYAAAAAQAAAAEAAAABAAAAWAAAAFgAAABYAAAAMwAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABVAAACWAAAAAEAAAABAAAAAQAAAFgAAABYAAAASAAAAFgAAABYAAAAWAAAAEEAAABYAAAAWAAAAFUAAAJYAAAAWAAAAFgAAAABAAAAAQAAAAEAAABYAAAAWAAAAFgAAABYAAAAWAAAAEEAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEEAAABBAAAAQQAAAEEAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAA== -1,1: ind: -1,1 tiles: PgAAAT4AAAA+AAADVQAAA1UAAANVAAACVQAAA1UAAANVAAACVQAAAFgAAAAVAAACFQAAAhUAAAFYAAAAWAAAAD4AAAA+AAADWAAAAFUAAANVAAAAVQAAAlUAAAJVAAABVQAAAVUAAABYAAAAPgAAAj4AAAE+AAAAPgAAAT4AAAI+AAADPgAAAlgAAABVAAABVQAAA1UAAABVAAABVQAAAVUAAAJVAAADWAAAAD4AAAM+AAACPgAAAj4AAAE+AAADPgAAAD4AAAJYAAAAVQAAAlUAAABVAAADVQAAAFUAAABVAAADVQAAAFgAAAA+AAACPgAAAz4AAAI+AAABPgAAAj4AAAE+AAAAWAAAAFUAAABVAAABVQAAAFUAAAMVAAABFQAAAxUAAAJYAAAAPgAAAz4AAAA+AAACPgAAAz4AAAI+AAACPgAAA1gAAABVAAADVQAAAFUAAAJVAAADFQAAAhUAAAEVAAABWAAAAD4AAAM+AAAAPgAAAD4AAAA+AAAAPgAAAD4AAAFYAAAAVQAAAVUAAAFVAAADVQAAABUAAAAVAAADFQAAAFgAAABYAAAAPgAAAD4AAAJYAAAAWAAAAD4AAAA+AAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAALgAAAFgAAABYAAAAPgAAAj4AAAI+AAADPgAAAz4AAAM+AAAAPgAAAFgAAABYAAAASAAAAEgAAABYAAAALgAAAC4AAAAuAAAAWAAAAD4AAAA+AAACPgAAAhUAAAMVAAADPgAAAj4AAAJYAAAAWAAAAFgAAABYAAAAWAAAAC4AAAAuAAAALgAAAFgAAAA+AAADPgAAAD4AAAAVAAADWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAPgAAAz4AAAE+AAABWAAAAFgAAAA+AAADPgAAAVgAAAA+AAACPgAAAz4AAAE+AAABPgAAAD4AAAI+AAAAPgAAAj4AAAA+AAAAPgAAAxUAAAIVAAABPgAAAj4AAAA+AAABPgAAAT4AAAA+AAABPgAAAD4AAAM+AAADPgAAAT4AAAM+AAAAPgAAAj4AAAM+AAACPgAAAj4AAAM+AAADWAAAAD4AAAM+AAAAPgAAARUAAAEVAAACFQAAARUAAAEVAAAAFQAAAxUAAAIVAAAAFQAAABUAAAI+AAABPgAAA1gAAAA+AAAAPgAAAT4AAABYAAAAWAAAAFgAAAA0AAAANAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAPgAAAD4AAAI+AAABWAAAADQAAAA0AAAANAAAADQAAAA0AAAANAAAAFgAAAA+AAABPgAAAA== @@ -662,10 +662,10 @@ entities: tiles: PgAAAz4AAAA+AAAAPgAAAlgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAM+AAACPgAAAT4AAANYAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAA+AAADPgAAAD4AAAE+AAADWAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAFgAAAA+AAABWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAI+AAACPgAAAT4AAAM+AAAAPgAAAT4AAAE+AAACPgAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAPgAAAj4AAAA+AAAAPgAAAj4AAAM+AAADPgAAAD4AAANYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAz4AAAM+AAADPgAAAj4AAAI+AAACPgAAAz4AAAE+AAADWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0AAAA9AAAAPQAAAFgAAAA+AAAAPgAAAj4AAAM+AAAAPgAAAVgAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAPgAAAD4AAAI+AAABPgAAAD4AAAA+AAAAPgAAAz4AAAJYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAj4AAAE+AAACPgAAAz4AAAM+AAABPgAAAT4AAAM+AAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AAAA+AAAAPgAAAj4AAAJEAAABPgAAA0QAAAE+AAADPgAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAABPgAAAT4AAAFYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAAAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0AAAA9AAAAPQAAAFgAAABYAAAAWAAAAFgAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABXAAAAWAAAAFgAAABYAAAAWAAAAFgAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== -3,1: ind: -3,1 - tiles: WAAAAEEAAAA+AAABWAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAAWAAAAFgAAABYAAAAWAAAAD4AAABYAAAAQQAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAVQAAAFUAAABVAAACWAAAAD4AAAI+AAAAPgAAAFgAAAAtAAAALQAAAFgAAAAuAAAALgAAAC4AAABYAAAAVQAAAlUAAABVAAADVQAAAFUAAAE+AAACPgAAAz4AAAFYAAAALQAAAC0AAABYAAAALgAAAC4AAAAuAAAAWAAAAFUAAANVAAAAVQAAA1UAAABYAAAAPgAAAT4AAAA+AAABWAAAAC0AAAAtAAAAWAAAAC4AAAAuAAAALgAAAFgAAABVAAAAWAAAAFgAAABYAAAAWAAAAD4AAAA+AAACPgAAAFgAAABYAAAALQAAAFgAAABYAAAAVQAAAlgAAABYAAAAWAAAAFUAAAJVAAADVQAAAVgAAAA+AAABPgAAAz4AAAM+AAABPgAAAT4AAAI+AAACPgAAAj4AAAI+AAAAPgAAAj4AAANVAAABVQAAAVUAAAJVAAAAPgAAAT4AAAA+AAABPgAAAD4AAAA+AAAAIwAAACMAAAAjAAAAIwAAACMAAAA+AAACVQAAAFUAAAJVAAAAWAAAAD4AAAA+AAABPgAAAz4AAAE+AAABPgAAAT4AAAI+AAABPgAAAD4AAAI+AAADPgAAAVgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAABUAAAIVAAACFQAAABUAAAEVAAADFQAAABUAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAAAAAAAAVwAAAAAAAABXAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABIAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAVwAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAASAAAAA== + tiles: WAAAAEEAAABYAAAAWAAAAFgAAABYAAAAWAAAAEgAAABIAAAASAAAAEgAAABIAAAAWAAAAFgAAABYAAAAWAAAAD4AAAA+AAAAQQAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAVQAAAFUAAABVAAACWAAAAD4AAAI+AAAAPgAAAFgAAAAtAAAALQAAAFgAAAAuAAAALgAAAC4AAABYAAAAVQAAAlUAAABVAAADVQAAAFUAAAE+AAACPgAAAz4AAAFYAAAALQAAAC0AAABYAAAALgAAAC4AAAAuAAAAWAAAAFUAAANVAAAAVQAAA1UAAABYAAAAPgAAAT4AAAA+AAABWAAAAC0AAAAtAAAAWAAAAC4AAAAuAAAALgAAAFgAAABVAAAAWAAAAFgAAABYAAAAWAAAAD4AAAA+AAACPgAAAFgAAABYAAAALQAAAFgAAABYAAAAVQAAAlgAAABYAAAAWAAAAFUAAAJVAAADVQAAAVgAAAA+AAABPgAAAz4AAAM+AAABPgAAAT4AAAI+AAACPgAAAj4AAAI+AAAAPgAAAj4AAANVAAABVQAAAVUAAAJVAAAAPgAAAT4AAAA+AAABPgAAAD4AAAA+AAAAIwAAACMAAAAjAAAAIwAAACMAAAA+AAACVQAAAFUAAAJVAAAAWAAAAD4AAAA+AAABPgAAAz4AAAE+AAABPgAAAT4AAAI+AAABPgAAAD4AAAI+AAADPgAAAVgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAABUAAAIVAAACFQAAABUAAAEVAAADFQAAABUAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFcAAAAAAAAAVwAAAAAAAABXAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABIAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAVwAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAASAAAAA== -4,1: ind: -4,1 - tiles: WAAAAFgAAABYAAAAWAAAAEEAAABYAAAAPgAAAFgAAAA+AAAAQQAAAFgAAABYAAAASwAAAksAAABLAAADWAAAABUAAAIVAAABFQAAABUAAAM+AAAAWAAAAFgAAAA+AAAAPgAAAz4AAAA+AAAAWAAAAEsAAAJLAAACSwAAAlgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAAAAAAFcAAABXAAAAWAAAAFgAAABYAAAAQQAAAFgAAABYAAAAVQAAAlUAAAJYAAAAAAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAIwAAAD4AAAFVAAACVQAAA1UAAANVAAABWAAAAAAAAAAAAAAAAAAAAFgAAAAuAAAALgAAAC4AAABYAAAAWAAAACMAAAA+AAADWAAAAFUAAANVAAACVQAAA1gAAAAAAAAAAAAAAAAAAABYAAAALgAAAC4AAABYAAAAWAAAAD4AAAAjAAAAQQAAAD4AAABYAAAAWAAAAFgAAABYAAAAVwAAAFcAAABXAAAAWAAAAC4AAAAuAAAALgAAAC4AAAA+AAABIwAAAFgAAABYAAAAVQAAAVUAAAJVAAACWAAAAAAAAAAAAAAAAAAAAFgAAAAuAAAALgAAAC4AAABYAAAAQQAAACMAAABYAAAAVQAAAFUAAABVAAAAVQAAAFgAAAAAAAAAAAAAAAAAAABYAAAALgAAAC4AAAAuAAAAWAAAAFgAAAA+AAACPgAAAVgAAABVAAABWAAAAFgAAABYAAAAAAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA+AAACWAAAAFgAAABYAAAAWAAAAFcAAABXAAAAVwAAAFgAAABXAAAAAAAAAFcAAABYAAAAWAAAAFgAAABYAAAAWAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAVwAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABXAAAAVwAAAFgAAABYAAAAWAAAAFgAAABYAAAAVwAAAFcAAABXAAAAVwAAAFcAAAAAAAAAAAAAAFcAAAAAAAAAAAAAAAAAAABXAAAAVwAAAFcAAABXAAAAVwAAAAAAAAAAAAAAAAAAAAAAAABXAAAAAAAAAAAAAABXAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABXAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAAAAAAAAAAAAVwAAAA== + tiles: WAAAAFgAAABYAAAAWAAAAEEAAABYAAAAPgAAAFgAAAA+AAAAQQAAAFgAAABYAAAASwAAAksAAABLAAADWAAAABUAAAIVAAABFQAAABUAAAM+AAAAWAAAAFgAAAA+AAAAPgAAAz4AAAA+AAAAPgAAAEsAAAJLAAACSwAAAj4AAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAAAAAAFcAAABXAAAAWAAAAFgAAABYAAAAQQAAAFgAAABYAAAAVQAAAlUAAAJYAAAAAAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAIwAAAD4AAAFVAAACVQAAA1UAAANVAAABWAAAAAAAAAAAAAAAAAAAAFgAAAAuAAAALgAAAC4AAABYAAAAWAAAACMAAAA+AAADWAAAAFUAAANVAAACVQAAA1gAAAAAAAAAAAAAAAAAAABYAAAALgAAAC4AAABYAAAAWAAAAD4AAAAjAAAAQQAAAD4AAABYAAAAWAAAAFgAAABYAAAAVwAAAFcAAABXAAAAWAAAAC4AAAAuAAAALgAAAC4AAAA+AAABIwAAAFgAAABYAAAAVQAAAVUAAAJVAAACWAAAAAAAAAAAAAAAAAAAAFgAAAAuAAAALgAAAC4AAABYAAAAQQAAACMAAABYAAAAVQAAAFUAAABVAAAAVQAAAFgAAAAAAAAAAAAAAAAAAABYAAAALgAAAC4AAAAuAAAAWAAAAFgAAAA+AAACPgAAAVgAAABVAAABWAAAAFgAAABYAAAAAAAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA+AAACWAAAAFgAAABYAAAAWAAAAFcAAABXAAAAVwAAAFgAAABXAAAAAAAAAFcAAABYAAAAWAAAAFgAAABYAAAAWAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAVwAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAABXAAAAVwAAAFgAAABYAAAAWAAAAFgAAABYAAAAVwAAAFcAAABXAAAAVwAAAFcAAAAAAAAAAAAAAFcAAAAAAAAAAAAAAAAAAABXAAAAVwAAAFcAAABXAAAAVwAAAAAAAAAAAAAAAAAAAAAAAABXAAAAAAAAAAAAAABXAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABXAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAAAAAAAAAAAAVwAAAA== -2,1: ind: -2,1 tiles: WAAAAFgAAABYAAAAFgAAAlUAAAJVAAAAVQAAAlUAAAJVAAABFgAAAlgAAAAVAAABFQAAAhUAAAFYAAAAPgAAAFgAAABYAAAAWAAAABYAAAFVAAABVQAAAFUAAANVAAAAVQAAAxYAAAMuAAAALgAAAC4AAAAuAAAAWAAAAD4AAAJYAAAAWAAAAFgAAAAWAAACVQAAAVUAAAJVAAADVQAAA1UAAAEWAAACWAAAAC4AAAAuAAAALgAAAFgAAAA+AAADVQAAAVUAAAJYAAAAFgAAAVUAAAFVAAADVQAAAFUAAABVAAAAFgAAAlgAAABYAAAAWAAAABUAAAFYAAAAPgAAAFUAAANVAAACWAAAABYAAAFVAAABVQAAAFUAAANVAAAAVQAAAhYAAAAVAAACFQAAAhUAAAAVAAABWAAAAD4AAAJVAAADVQAAAFgAAAAWAAAAVQAAAFUAAAFVAAADVQAAA1UAAAAWAAABWAAAABUAAAIVAAADFQAAAVgAAAA+AAADVQAAAlgAAABYAAAAWAAAAFgAAAA+AAACPgAAAT4AAANYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAPgAAAD4AAAA+AAABPgAAAD4AAAA+AAACPgAAAz4AAAI+AAABPgAAAj4AAAA+AAAAPgAAAj4AAAM+AAABPgAAAD4AAAI+AAABPgAAAyMAAAAjAAAAIwAAACMAAAAjAAAAPgAAAz4AAAM+AAACPgAAAz4AAAA+AAAAPgAAAD4AAAA+AAAAPgAAAz4AAAI+AAADPgAAAD4AAAE+AAADPgAAAT4AAAM+AAAAPgAAAT4AAAM+AAABPgAAAj4AAAE+AAAAPgAAABUAAAIVAAACFQAAAhUAAAAVAAADFQAAABUAAAMVAAACWAAAAD4AAAE+AAADPgAAA1gAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAPgAAAVgAAABYAAAAPgAAAD4AAAA+AAAAVwAAAFcAAABXAAAAAAAAAFcAAAAAAAAAVwAAAFcAAABYAAAAPgAAAz4AAAE+AAADPgAAAT4AAAM+AAADPgAAAVgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAI+AAABPgAAAT4AAAM+AAAAPgAAAj4AAAI+AAACPgAAAz4AAAA+AAAAPgAAAD4AAAM+AAAAPgAAAT4AAAI+AAABPgAAAz4AAAM+AAADPgAAAj4AAAE+AAACPgAAAT4AAAA+AAAAPgAAAT4AAAA+AAAAPgAAAT4AAAA+AAABPgAAAz4AAAA+AAADWAAAAFgAAABYAAAAWAAAAA== @@ -1711,171 +1711,171 @@ entities: color: '#52B4E996' id: QuarterTileOverlayGreyscale180 coordinates: 37,-25 - 1314: + 1298: color: '#A4610696' id: HalfTileOverlayGreyscale270 coordinates: 36,-2 - 1315: + 1299: color: '#A4610696' id: HalfTileOverlayGreyscale270 coordinates: 36,-1 - 1316: + 1300: color: '#A4610696' id: QuarterTileOverlayGreyscale180 coordinates: 41,-2 - 1317: + 1301: color: '#A4610696' id: QuarterTileOverlayGreyscale180 coordinates: 41,-1 - 1319: + 1303: color: '#A4610696' id: QuarterTileOverlayGreyscale270 coordinates: 45,-2 - 1320: + 1304: color: '#A4610696' id: QuarterTileOverlayGreyscale270 coordinates: 45,-1 - 1325: + 1309: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: Arrows coordinates: 49,-1 - 1331: + 1315: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: 51,-1 - 1332: + 1316: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: 51,-2 - 1353: + 1337: cleanable: True color: '#FFFFFFFF' id: DirtHeavy coordinates: 49,-1 - 1360: + 1344: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: 48,-1 - 1361: + 1345: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 47,-1 - 1362: + 1346: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 48,-2 - 1363: + 1347: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 49,-2 - 1379: + 1363: cleanable: True color: '#FFFFFFFF' id: DirtHeavy coordinates: 41,-1 - 1380: + 1364: cleanable: True color: '#FFFFFFFF' id: DirtHeavy coordinates: 42,-2 - 1381: + 1365: cleanable: True color: '#FFFFFFFF' id: DirtHeavy coordinates: 41,-2 - 1382: + 1366: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: 40,-1 - 1383: + 1367: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: 39,-2 - 1384: + 1368: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 37,-1 - 1385: + 1369: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 39,-1 - 1386: + 1370: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 40,-2 - 1590: + 1573: color: '#FFFFFFFF' id: BrickTileWhiteCornerSw coordinates: 38,-32 - 1591: + 1574: color: '#FFFFFFFF' id: BrickTileWhiteCornerNw coordinates: 38,-28 - 1592: + 1575: color: '#FFFFFFFF' id: BrickTileWhiteCornerSe coordinates: 40,-32 - 1593: + 1576: color: '#FFFFFFFF' id: BrickTileWhiteCornerNe coordinates: 40,-28 - 1594: + 1577: color: '#FFFFFFFF' id: BrickTileWhiteLineS coordinates: 39,-32 - 1595: + 1578: color: '#FFFFFFFF' id: BrickTileWhiteLineW coordinates: 38,-31 - 1596: + 1579: color: '#FFFFFFFF' id: BrickTileWhiteLineW coordinates: 38,-30 - 1597: + 1580: color: '#FFFFFFFF' id: BrickTileWhiteLineW coordinates: 38,-29 - 1598: + 1581: color: '#FFFFFFFF' id: BrickTileWhiteLineE coordinates: 40,-31 - 1599: + 1582: color: '#FFFFFFFF' id: BrickTileWhiteLineE coordinates: 40,-30 - 1600: + 1583: color: '#FFFFFFFF' id: BrickTileWhiteLineE coordinates: 40,-29 - 1601: + 1584: color: '#FFFFFFFF' id: BrickTileWhiteLineN coordinates: 39,-28 - 1864: + 1847: color: '#0E7F1B82' id: QuarterTileOverlayGreyscale90 coordinates: 32,-23 - 1865: + 1848: color: '#0E7F1B82' id: QuarterTileOverlayGreyscale90 coordinates: 34,-23 - 1870: + 1853: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 33,-23 - 1871: + 1854: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 35,-23 @@ -2236,470 +2236,470 @@ entities: color: '#FFFFFFFF' id: Bot coordinates: 3,11 - 928: + 913: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 17,0 - 929: + 914: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 17,1 - 930: + 915: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 16,2 - 934: + 919: color: '#FFFFFFFF' id: Grasse2 coordinates: 9.31053,4.0426216 - 935: + 920: color: '#FFFFFFFF' id: Grasse2 coordinates: 11.357405,4.8394966 - 936: + 921: color: '#FFFFFFFF' id: Grasse1 coordinates: 10.37303,4.2613716 - 937: + 922: color: '#FFFFFFFF' id: Grasse1 coordinates: 11.919905,3.4176216 - 938: + 923: color: '#FFFFFFFF' id: Grassd3 coordinates: 11.107405,3.8082466 - 939: + 924: color: '#FFFFFFFF' id: Grassd2 coordinates: 10.02928,3.2613716 - 940: + 925: color: '#FFFFFFFF' id: Grassd1 coordinates: 11.06053,2.6519966 - 941: + 926: color: '#FFFFFFFF' id: Flowersy2 coordinates: 12.076155,3.7926216 - 942: + 927: color: '#FFFFFFFF' id: Flowersy4 coordinates: 11.34178,4.3394966 - 943: + 928: color: '#FFFFFFFF' id: Bushi3 coordinates: 12.107405,4.5426216 - 944: + 929: color: '#FFFFFFFF' id: Bushi4 coordinates: 11.013655,3.2457466 - 945: + 930: color: '#FFFFFFFF' id: Bushi1 coordinates: 8.857405,4.0894966 - 1025: + 1010: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: 0,24 - 1026: + 1011: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: 1,24 - 1028: + 1013: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: 2,25 - 1031: + 1016: angle: 3.141592653589793 rad color: '#FFFFFFFF' id: WarningLineCorner coordinates: 2,24 - 1032: + 1017: color: '#EFB34196' id: CheckerNWSE coordinates: 10,17 - 1033: + 1018: color: '#EFB34196' id: CheckerNWSE coordinates: 9,17 - 1034: + 1019: color: '#EFB34196' id: CheckerNWSE coordinates: 8,17 - 1035: + 1020: color: '#EFB34196' id: CheckerNWSE coordinates: 8,18 - 1036: + 1021: color: '#EFB34196' id: CheckerNWSE coordinates: 9,18 - 1037: + 1022: color: '#EFB34196' id: CheckerNWSE coordinates: 10,18 - 1038: + 1023: color: '#EFB34196' id: CheckerNWSE coordinates: 10,19 - 1039: + 1024: color: '#EFB34196' id: CheckerNWSE coordinates: 9,19 - 1040: + 1025: color: '#EFB34196' id: CheckerNWSE coordinates: 8,19 - 1041: + 1026: color: '#EFB34196' id: CheckerNWSE coordinates: 8,20 - 1042: + 1027: color: '#EFB34196' id: CheckerNWSE coordinates: 8,21 - 1043: + 1028: color: '#EFB34196' id: CheckerNWSE coordinates: 9,21 - 1044: + 1029: color: '#EFB34196' id: CheckerNWSE coordinates: 9,20 - 1045: + 1030: color: '#EFB34196' id: CheckerNWSE coordinates: 10,20 - 1046: + 1031: color: '#EFB34196' id: CheckerNWSE coordinates: 10,21 - 1047: + 1032: color: '#EFB34196' id: HalfTileOverlayGreyscale90 coordinates: 6,18 - 1048: + 1033: color: '#EFB34196' id: HalfTileOverlayGreyscale90 coordinates: 6,20 - 1049: + 1034: color: '#EFB34196' id: ThreeQuarterTileOverlayGreyscale90 coordinates: 6,21 - 1050: + 1035: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: 4,17 - 1051: + 1036: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: 3,17 - 1052: + 1037: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: 2,17 - 1053: + 1038: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: 1,17 - 1054: + 1039: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: 0,17 - 1063: + 1048: color: '#EFB34196' id: HalfTileOverlayGreyscale coordinates: 5,21 - 1064: + 1049: color: '#EFB34196' id: HalfTileOverlayGreyscale coordinates: 4,21 - 1065: + 1050: color: '#EFB34196' id: HalfTileOverlayGreyscale coordinates: 3,21 - 1066: + 1051: color: '#EFB34196' id: HalfTileOverlayGreyscale coordinates: 2,21 - 1067: + 1052: color: '#EFB34196' id: HalfTileOverlayGreyscale coordinates: 1,21 - 1068: + 1053: color: '#EFB34196' id: HalfTileOverlayGreyscale coordinates: 0,21 - 1080: + 1065: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: 0,23 - 1081: + 1066: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: 1,23 - 1082: + 1067: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: 2,23 - 1088: + 1073: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: 4,23 - 1089: + 1074: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: 5,23 - 1090: + 1075: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: 6,23 - 1091: + 1076: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: 7,23 - 1092: + 1077: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: 8,23 - 1191: + 1175: color: '#334E6DC8' id: FullTileOverlayGreyscale coordinates: 0,3 - 1192: + 1176: color: '#334E6DC8' id: FullTileOverlayGreyscale coordinates: 1,3 - 1193: + 1177: color: '#334E6DC8' id: FullTileOverlayGreyscale coordinates: 2,3 - 1194: + 1178: color: '#334E6DC8' id: FullTileOverlayGreyscale coordinates: 3,3 - 1198: + 1182: color: '#334E6DC8' id: HalfTileOverlayGreyscale90 coordinates: 3,2 - 1201: + 1185: color: '#334E6DC8' id: ThreeQuarterTileOverlayGreyscale90 coordinates: 4,1 - 1202: + 1186: color: '#334E6DC8' id: QuarterTileOverlayGreyscale90 coordinates: 3,1 - 1206: + 1190: color: '#334E6DC8' id: QuarterTileOverlayGreyscale90 coordinates: 4,0 - 1212: + 1196: color: '#FFFFFFFF' id: Bot coordinates: 3,15 - 1339: + 1323: color: '#FFFFFFFF' id: Bot coordinates: 22,18 - 1340: + 1324: color: '#FFFFFFFF' id: Bot coordinates: 22,19 - 1341: + 1325: color: '#FFFFFFFF' id: Bot coordinates: 20,18 - 1342: + 1326: color: '#FFFFFFFF' id: Bot coordinates: 20,19 - 1343: + 1327: color: '#FFFFFFFF' id: ArrowsGreyscale coordinates: 23,17 - 1344: + 1328: color: '#FFFFFFFF' id: WarningLine coordinates: 24,15 - 1345: + 1329: color: '#FFFFFFFF' id: WarningLine coordinates: 23,15 - 1346: + 1330: color: '#FFFFFFFF' id: WarningLine coordinates: 22,15 - 1431: + 1415: color: '#A4610696' id: QuarterTileOverlayGreyscale90 coordinates: 31,9 - 1432: + 1416: color: '#A4610696' id: QuarterTileOverlayGreyscale90 coordinates: 30,9 - 1433: + 1417: color: '#A4610696' id: QuarterTileOverlayGreyscale90 coordinates: 29,9 - 1434: + 1418: color: '#A4610696' id: QuarterTileOverlayGreyscale coordinates: 27,9 - 1435: + 1419: color: '#A4610696' id: QuarterTileOverlayGreyscale coordinates: 25,9 - 1436: + 1420: color: '#A4610696' id: QuarterTileOverlayGreyscale coordinates: 26,9 - 1437: + 1421: color: '#A4610696' id: QuarterTileOverlayGreyscale coordinates: 21,9 - 1438: + 1422: color: '#A4610696' id: QuarterTileOverlayGreyscale coordinates: 20,9 - 1439: + 1423: color: '#A4610696' id: QuarterTileOverlayGreyscale coordinates: 19,9 - 1443: + 1427: color: '#A4610696' id: QuarterTileOverlayGreyscale180 coordinates: 31,7 - 1444: + 1428: color: '#A4610696' id: QuarterTileOverlayGreyscale180 coordinates: 30,7 - 1445: + 1429: color: '#A4610696' id: QuarterTileOverlayGreyscale180 coordinates: 29,7 - 1446: + 1430: color: '#A4610696' id: QuarterTileOverlayGreyscale180 coordinates: 28,7 - 1536: + 1519: color: '#FFFFFFFF' id: Flowersy4 coordinates: 9.393604,3.3875775 - 1586: + 1569: color: '#FFFFFFFF' id: SpaceStationSign4 coordinates: 0,10 - 1587: + 1570: color: '#FFFFFFFF' id: SpaceStationSign5 coordinates: 1,10 - 1588: + 1571: color: '#FFFFFFFF' id: SpaceStationSign6 coordinates: 2,10 - 1589: + 1572: color: '#FFFFFFFF' id: SpaceStationSign7 coordinates: 3,10 - 1703: + 1686: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: 11,19 - 1704: + 1687: color: '#EFB34196' id: ThreeQuarterTileOverlayGreyscale180 coordinates: 6,17 - 1706: + 1689: color: '#79150096' id: QuarterTileOverlayGreyscale270 coordinates: 1,9 - 1707: + 1690: color: '#79150096' id: QuarterTileOverlayGreyscale270 coordinates: 3,9 - 1708: + 1691: color: '#79150096' id: QuarterTileOverlayGreyscale270 coordinates: 5,9 - 1709: + 1692: color: '#79150096' id: QuarterTileOverlayGreyscale270 coordinates: 6,8 - 1710: + 1693: color: '#79150096' id: QuarterTileOverlayGreyscale270 coordinates: 8,8 - 1711: + 1694: color: '#79150096' id: QuarterTileOverlayGreyscale270 coordinates: 9,7 - 1725: + 1708: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale270 coordinates: 2,9 - 1726: + 1709: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale270 coordinates: 4,9 - 1727: + 1710: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale270 coordinates: 5,8 - 1728: + 1711: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale270 coordinates: 7,8 - 1729: + 1712: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale270 coordinates: 8,7 - 1730: + 1713: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale270 coordinates: 10,7 - 1731: + 1714: color: '#0E7F1B88' id: HalfTileOverlayGreyscale180 coordinates: 0,9 - 1783: + 1766: color: '#FFFFFFFF' id: BrickTileSteelLineW coordinates: 18,12 - 1784: + 1767: color: '#FFFFFFFF' id: BrickTileWhiteLineW coordinates: 19,13 - 1785: + 1768: color: '#FFFFFFFF' id: BrickTileWhiteLineE coordinates: 20,12 - 1786: + 1769: color: '#FFFFFFFF' id: BrickTileWhiteLineE coordinates: 20,13 - 1787: + 1770: color: '#FFFFFFFF' id: BrickTileWhiteLineE coordinates: 20,14 - 1788: + 1771: color: '#FFFFFFFF' id: BrickTileWhiteCornerSw coordinates: 19,11 - 1789: + 1772: color: '#FFFFFFFF' id: BrickTileWhiteCornerSe coordinates: 20,11 - 1790: + 1773: color: '#FFFFFFFF' id: BrickTileWhiteCornerNw coordinates: 19,14 - 1791: + 1774: color: '#FFFFFFFF' id: BrickTileWhiteCornerNe coordinates: 20,14 @@ -2762,943 +2762,943 @@ entities: color: '#FFFFFFFF' id: StandClear coordinates: -23,-20 - 1917: - color: '#FFFFFFFF' - id: DirtLight - coordinates: -31,-17 - 1912: - color: '#FFFFFFFF' - id: DirtLight - coordinates: -29,-21 - 1909: - color: '#FFFFFFFF' - id: DirtMedium - coordinates: -31,-20 - 625: + 621: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -24,-21 - 626: + 622: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -24,-20 - 627: + 623: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -24,-19 - 1916: - color: '#FFFFFFFF' - id: DirtLight - coordinates: -32,-20 - 629: + 624: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale270 coordinates: -24,-21 - 630: + 625: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -25,-21 - 631: + 626: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -26,-21 - 632: + 627: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -27,-21 - 633: + 628: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -28,-21 - 634: + 629: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -29,-21 - 638: + 633: color: '#DE3A3A96' id: FullTileOverlayGreyscale coordinates: -21,-13 - 639: + 634: color: '#DE3A3A96' id: FullTileOverlayGreyscale coordinates: -21,-10 - 640: + 635: color: '#DE3A3A96' id: FullTileOverlayGreyscale coordinates: -21,-7 - 641: + 636: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -22,-14 - 642: + 637: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -22,-13 - 643: + 638: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -22,-12 - 644: + 639: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -22,-11 - 645: + 640: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -22,-10 - 646: + 641: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -22,-9 - 647: + 642: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -22,-8 - 648: + 643: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -22,-7 - 649: + 644: color: '#DE3A3A96' id: HalfTileOverlayGreyscale270 coordinates: -32,-14 - 650: + 645: color: '#DE3A3A96' id: HalfTileOverlayGreyscale270 coordinates: -32,-13 - 651: + 646: color: '#DE3A3A96' id: HalfTileOverlayGreyscale270 coordinates: -32,-12 - 652: + 647: color: '#DE3A3A96' id: HalfTileOverlayGreyscale270 coordinates: -32,-11 - 653: + 648: color: '#DE3A3A96' id: HalfTileOverlayGreyscale270 coordinates: -32,-10 - 654: + 649: color: '#DE3A3A96' id: HalfTileOverlayGreyscale270 coordinates: -32,-9 - 655: + 650: color: '#DE3A3A96' id: HalfTileOverlayGreyscale270 coordinates: -32,-8 - 656: + 651: color: '#DE3A3A96' id: ThreeQuarterTileOverlayGreyscale coordinates: -32,-7 - 657: + 652: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale coordinates: -31,-7 - 658: + 653: color: '#DE3A3A96' id: HalfTileOverlayGreyscale270 coordinates: -31,-6 - 659: + 654: color: '#DE3A3A96' id: HalfTileOverlayGreyscale270 coordinates: -31,-5 - 660: + 655: color: '#DE3A3A96' id: HalfTileOverlayGreyscale270 coordinates: -31,-4 - 661: + 656: color: '#DE3A3A96' id: ThreeQuarterTileOverlayGreyscale coordinates: -31,-3 - 662: + 657: color: '#DE3A3A96' id: FullTileOverlayGreyscale coordinates: -31,-2 - 663: + 658: color: '#DE3A3A96' id: HalfTileOverlayGreyscale coordinates: -30,-3 - 664: + 659: color: '#DE3A3A96' id: HalfTileOverlayGreyscale coordinates: -29,-3 - 665: + 660: color: '#DE3A3A96' id: HalfTileOverlayGreyscale coordinates: -28,-3 - 666: + 661: color: '#DE3A3A96' id: HalfTileOverlayGreyscale coordinates: -27,-3 - 667: + 662: color: '#DE3A3A96' id: HalfTileOverlayGreyscale coordinates: -26,-3 - 668: + 663: color: '#DE3A3A96' id: HalfTileOverlayGreyscale coordinates: -25,-3 - 669: + 664: color: '#DE3A3A96' id: HalfTileOverlayGreyscale coordinates: -24,-3 - 670: + 665: color: '#DE3A3A96' id: HalfTileOverlayGreyscale coordinates: -23,-3 - 671: + 666: color: '#DE3A3A96' id: ThreeQuarterTileOverlayGreyscale90 coordinates: -22,-3 - 672: + 667: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -22,-6 - 673: + 668: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -22,-5 - 674: + 669: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -22,-4 - 675: + 670: color: '#DE3A3A96' id: FullTileOverlayGreyscale coordinates: -21,-4 - 676: + 671: color: '#DE3A3A96' id: CheckerNESW coordinates: -20,-5 - 677: + 672: color: '#DE3A3A96' id: CheckerNESW coordinates: -20,-4 - 678: + 673: color: '#DE3A3A96' id: CheckerNESW coordinates: -20,-3 - 679: + 674: color: '#DE3A3A96' id: CheckerNESW coordinates: -19,-3 - 680: + 675: color: '#DE3A3A96' id: CheckerNESW coordinates: -19,-4 - 681: + 676: color: '#DE3A3A96' id: CheckerNESW coordinates: -19,-5 - 685: + 680: color: '#DE3A3A96' id: ThreeQuarterTileOverlayGreyscale180 coordinates: -31,-1 - 686: + 681: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -32,-1 - 696: + 691: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -26,-6 - 697: + 692: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -27,-6 - 698: + 693: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -28,-6 - 699: + 694: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale180 coordinates: -29,-6 - 700: + 695: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale270 coordinates: -25,-6 - 701: + 696: color: '#FFFFFFFF' id: Bot coordinates: -25,-6 - 1913: - color: '#FFFFFFFF' - id: DirtLight - coordinates: -21,-19 - 1911: - color: '#FFFFFFFF' - id: DirtLight - coordinates: -27,-21 - 1904: - color: '#DE3A3A96' - id: QuarterTileOverlayGreyscale270 - coordinates: -30,-17 - 705: + 697: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -24,-21 - 706: + 698: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -24,-20 - 707: + 699: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -24,-19 - 708: + 700: color: '#DE3A3A96' id: FullTileOverlayGreyscale coordinates: -26,-18 - 709: + 701: color: '#DE3A3A96' id: FullTileOverlayGreyscale coordinates: -28,-18 - 710: + 702: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -23,-17 - 711: + 703: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -24,-17 - 712: + 704: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -25,-17 - 713: + 705: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -26,-17 - 714: + 706: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -27,-17 - 715: + 707: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -28,-17 - 716: + 708: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -29,-17 - 1894: - color: '#DE3A3A96' - id: HalfTileOverlayGreyscale180 - coordinates: -30,-21 - 1903: - color: '#DE3A3A96' - id: QuarterTileOverlayGreyscale270 - coordinates: -31,-16 - 719: + 709: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale90 coordinates: -23,-17 - 1902: - color: '#DE3A3A96' - id: QuarterTileOverlayGreyscale270 - coordinates: -31,-17 - 1895: - color: '#DE3A3A96' - id: HalfTileOverlayGreyscale180 - coordinates: -31,-21 - 722: + 710: color: '#DE3A3A96' id: HalfTileOverlayGreyscale270 coordinates: -31,-15 - 723: + 711: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -23,-16 - 724: + 712: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -23,-15 - 725: + 713: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale180 coordinates: -23,-14 - 726: + 714: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale270 coordinates: -22,-14 - 727: + 715: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale270 coordinates: -31,-14 - 728: + 716: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale180 coordinates: -32,-14 - 729: + 717: color: '#FFFFFFFF' id: DirtMedium coordinates: -26,-19 - 730: + 718: color: '#FFFFFFFF' id: DirtMedium coordinates: -25,-20 - 731: + 719: color: '#FFFFFFFF' id: DirtMedium coordinates: -28,-19 - 732: + 720: color: '#FFFFFFFF' id: DirtMedium coordinates: -28,-17 - 733: + 721: color: '#FFFFFFFF' id: DirtMedium coordinates: -31,-3 - 734: + 722: color: '#FFFFFFFF' id: DirtMedium coordinates: -22,-4 - 735: + 723: color: '#FFFFFFFF' id: DirtMedium coordinates: -23,-5 - 736: + 724: color: '#FFFFFFFF' id: DirtLight coordinates: -23,-6 - 737: + 725: color: '#FFFFFFFF' id: DirtLight coordinates: -22,-5 - 738: + 726: color: '#FFFFFFFF' id: DirtLight coordinates: -23,-8 - 739: + 727: color: '#FFFFFFFF' id: DirtLight coordinates: -31,-4 - 740: + 728: color: '#FFFFFFFF' id: DirtLight coordinates: -30,-5 - 741: + 729: color: '#FFFFFFFF' id: DirtLight coordinates: -28,-20 - 1910: - color: '#FFFFFFFF' - id: DirtLight - coordinates: -30,-20 - 743: + 730: color: '#FFFFFFFF' id: DirtLight coordinates: -25,-19 - 744: + 731: color: '#FFFFFFFF' id: DirtLight coordinates: -24,-20 - 745: + 732: color: '#FFFFFFFF' id: DirtLight coordinates: -29,-16 - 746: + 733: color: '#FFFFFFFF' id: DirtLight coordinates: -30,-15 - 747: + 734: color: '#FFFFFFFF' id: DirtLight coordinates: -27,-17 - 748: + 735: color: '#FFFFFFFF' id: DirtLight coordinates: -29,-17 - 749: + 736: color: '#FFFFFFFF' id: DirtLight coordinates: -26,-17 - 750: + 737: color: '#FFFFFFFF' id: DirtLight coordinates: -24,-15 - 751: + 738: color: '#FFFFFFFF' id: DirtLight coordinates: -23,-12 - 752: + 739: color: '#FFFFFFFF' id: DirtLight coordinates: -32,-11 - 753: + 740: color: '#DE3A3A96' id: HalfTileOverlayGreyscale coordinates: -27,-14 - 754: + 741: color: '#DE3A3A96' id: HalfTileOverlayGreyscale coordinates: -26,-14 - 755: + 742: color: '#DE3A3A96' id: HalfTileOverlayGreyscale coordinates: -28,-14 - 756: + 743: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale coordinates: -25,-14 - 757: + 744: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale90 coordinates: -29,-14 - 760: + 745: color: '#DE3A3A96' id: FullTileOverlayGreyscale coordinates: -22,-21 - 761: + 746: color: '#DE3A3A96' id: FullTileOverlayGreyscale coordinates: -22,-19 - 948: + 933: angle: -3.141592653589793 rad color: '#DE3A3A96' id: WarningLine coordinates: -7,-19 - 949: + 934: angle: -3.141592653589793 rad color: '#DE3A3A96' id: WarningLine coordinates: -8,-19 - 950: + 935: angle: -3.141592653589793 rad color: '#DE3A3A96' id: WarningLine coordinates: -9,-19 - 951: + 936: angle: -3.141592653589793 rad color: '#DE3A3A96' id: WarningLine coordinates: -10,-19 - 952: + 937: angle: -3.141592653589793 rad color: '#DE3A3A96' id: WarningLine coordinates: -11,-19 - 953: + 938: color: '#FFFFFFFF' id: StandClear coordinates: -9,-21 - 1172: + 1156: color: '#334E6DC8' id: QuarterTileOverlayGreyscale coordinates: -1,-8 - 1173: + 1157: color: '#334E6DC8' id: QuarterTileOverlayGreyscale coordinates: -1,-7 - 1174: + 1158: color: '#334E6DC8' id: QuarterTileOverlayGreyscale coordinates: -1,-6 - 1175: + 1159: color: '#334E6DC8' id: QuarterTileOverlayGreyscale coordinates: -1,-5 - 1176: + 1160: color: '#334E6DC8' id: QuarterTileOverlayGreyscale coordinates: -1,-4 - 1177: + 1161: color: '#334E6DC8' id: QuarterTileOverlayGreyscale coordinates: -1,-3 - 1184: + 1168: color: '#FFFFFFFF' id: Grasse3 coordinates: -6.001801,-6.928444 - 1185: + 1169: color: '#FFFFFFFF' id: Grasse3 coordinates: -6.017426,-6.131569 - 1186: + 1170: color: '#FFFFFFFF' id: Flowersy4 coordinates: -5.970551,-6.928444 - 1187: + 1171: color: '#FFFFFFFF' id: Flowersy4 coordinates: -5.986176,-6.053444 - 1188: + 1172: color: '#FFFFFFFF' id: Grassb4 coordinates: -5.939301,-7.022194 - 1189: + 1173: color: '#FFFFFFFF' id: Bushb2 coordinates: -6.033051,-6.006569 - 1190: + 1174: color: '#FFFFFFFF' id: Bushn1 coordinates: -6.033051,-6.444069 - 1208: + 1192: color: '#FFFFFFFF' id: Bot coordinates: -6,-27 - 1209: + 1193: color: '#FFFFFFFF' id: Bot coordinates: -15,-10 - 1463: + 1447: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale coordinates: -17,-18 - 1464: + 1448: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale coordinates: -17,-17 - 1465: + 1449: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale coordinates: -17,-16 - 1466: + 1450: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale coordinates: -17,-15 - 1467: + 1451: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale coordinates: -17,-14 - 1468: + 1452: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale coordinates: -17,-13 - 1469: + 1453: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale coordinates: -17,-12 - 1470: + 1454: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale coordinates: -17,-11 - 1471: + 1455: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale coordinates: -17,-10 - 1472: + 1456: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale coordinates: -17,-9 - 1473: + 1457: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale coordinates: -17,-8 - 1474: + 1458: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale coordinates: -17,-7 - 1475: + 1459: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale coordinates: -17,-6 - 1495: + 1479: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -19,-20 - 1496: + 1480: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -17,-14 - 1497: + 1481: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -17,-7 - 1498: + 1482: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -16,-5 - 1511: + 1495: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale270 coordinates: -18,-1 - 1529: + 1512: color: '#FFFFFFFF' id: WarnLineN coordinates: -25,-1 - 1530: + 1513: color: '#FFFFFFFF' id: WarnLineN coordinates: -26,-1 - 1531: + 1514: color: '#FFFFFFFF' id: WarnLineN coordinates: -27,-1 - 1532: + 1515: color: '#FFFFFFFF' id: WarnLineN coordinates: -28,-1 - 1533: + 1516: color: '#FFFFFFFF' id: WarnLineN coordinates: -29,-1 - 1624: + 1607: color: '#FFFFFFFF' id: WoodTrimThinLineN coordinates: -3,-9 - 1625: + 1608: color: '#FFFFFFFF' id: BrickTileWhiteLineS coordinates: -3,-9 - 1626: + 1609: color: '#FFFFFFFF' id: VentSmall coordinates: -3,-9 - 1627: + 1610: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: -6,-5 - 1628: + 1611: color: '#FFFFFFFF' id: WoodTrimThinLineW coordinates: -6,-5 - 1629: + 1612: color: '#FFFFFFFF' id: WoodTrimThinLineS coordinates: -3,-3 - 1630: + 1613: color: '#FFFFFFFF' id: WoodTrimThinLineS coordinates: -4,-3 - 1631: + 1614: color: '#FFFFFFFF' id: WoodTrimThinLineS coordinates: -5,-3 - 1632: + 1615: color: '#FFFFFFFF' id: WoodTrimThinLineS coordinates: -7,-3 - 1633: + 1616: color: '#FFFFFFFF' id: WoodTrimThinLineS coordinates: -8,-3 - 1634: + 1617: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale coordinates: -1,-21 - 1635: + 1618: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale coordinates: -1,-19 - 1636: + 1619: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale coordinates: -1,-17 - 1637: + 1620: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale coordinates: -1,-15 - 1638: + 1621: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale coordinates: -1,-13 - 1639: + 1622: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale coordinates: -1,-11 - 1652: + 1635: color: '#79150096' id: QuarterTileOverlayGreyscale coordinates: -1,-12 - 1653: + 1636: color: '#79150096' id: QuarterTileOverlayGreyscale coordinates: -1,-10 - 1654: + 1637: color: '#79150096' id: QuarterTileOverlayGreyscale coordinates: -1,-14 - 1655: + 1638: color: '#79150096' id: QuarterTileOverlayGreyscale coordinates: -1,-16 - 1656: + 1639: color: '#79150096' id: QuarterTileOverlayGreyscale coordinates: -1,-18 - 1657: + 1640: color: '#79150096' id: QuarterTileOverlayGreyscale coordinates: -1,-20 - 1792: + 1775: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: -24,-31 - 1793: + 1776: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: -24,-30 - 1794: + 1777: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: -24,-29 - 1795: + 1778: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: -24,-28 - 1796: + 1779: color: '#FFFFFFFF' id: WoodTrimThinLineN coordinates: -24,-28 - 1797: + 1780: color: '#FFFFFFFF' id: WoodTrimThinLineN coordinates: -25,-28 - 1798: + 1781: color: '#FFFFFFFF' id: WoodTrimThinLineN coordinates: -26,-28 - 1799: + 1782: color: '#FFFFFFFF' id: WoodTrimThinLineN coordinates: -27,-28 - 1800: + 1783: color: '#FFFFFFFF' id: WoodTrimThinInnerSw coordinates: -23,-27 - 1819: + 1802: color: '#79150096' id: QuarterTileOverlayGreyscale coordinates: -3,-23 - 1820: + 1803: color: '#79150096' id: QuarterTileOverlayGreyscale coordinates: -5,-23 - 1821: + 1804: color: '#79150096' id: QuarterTileOverlayGreyscale coordinates: -7,-23 - 1822: + 1805: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: -10,-23 - 1823: + 1806: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: -12,-23 - 1824: + 1807: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: -14,-23 - 1825: + 1808: color: '#0E7F1B7F' id: QuarterTileOverlayGreyscale coordinates: -4,-23 - 1826: + 1809: color: '#0E7F1B7F' id: QuarterTileOverlayGreyscale coordinates: -2,-23 - 1827: + 1810: color: '#0E7F1B7F' id: QuarterTileOverlayGreyscale coordinates: -6,-23 - 1828: + 1811: color: '#0E7F1B7F' id: QuarterTileOverlayGreyscale coordinates: -8,-23 - 1829: + 1812: color: '#0E7F1B7F' id: QuarterTileOverlayGreyscale90 coordinates: -11,-23 - 1830: + 1813: color: '#0E7F1B7F' id: QuarterTileOverlayGreyscale90 coordinates: -13,-23 - 1831: + 1814: color: '#0E7F1B7F' id: QuarterTileOverlayGreyscale coordinates: -26,-23 - 1832: + 1815: color: '#0E7F1B7F' id: QuarterTileOverlayGreyscale coordinates: -24,-23 - 1833: + 1816: color: '#0E7F1B7F' id: QuarterTileOverlayGreyscale coordinates: -22,-23 - 1834: + 1817: color: '#0E7F1B7F' id: QuarterTileOverlayGreyscale90 coordinates: -28,-23 - 1835: + 1818: color: '#0E7F1B7F' id: QuarterTileOverlayGreyscale90 coordinates: -30,-23 - 1836: + 1819: color: '#0E7F1B7F' id: QuarterTileOverlayGreyscale90 coordinates: -32,-23 - 1837: + 1820: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: -31,-23 - 1838: + 1821: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: -29,-23 - 1839: + 1822: color: '#79150096' id: QuarterTileOverlayGreyscale coordinates: -25,-23 - 1840: + 1823: color: '#79150096' id: QuarterTileOverlayGreyscale coordinates: -23,-23 - 1872: + 1855: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -9,-25 - 1873: + 1856: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -8,-25 - 1874: + 1857: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -8,-25 - 1875: + 1858: cleanable: True color: '#FFFFFFFF' id: DirtHeavy coordinates: -5,-25 - 1876: + 1859: cleanable: True color: '#FFFFFFFF' id: DirtHeavy coordinates: -4,-25 - 1877: + 1860: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: -3,-25 - 1878: + 1861: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: -6,-25 - 1879: + 1862: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -4,-24 - 1880: + 1863: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -1,-25 + 1877: + color: '#DE3A3A96' + id: HalfTileOverlayGreyscale180 + coordinates: -30,-21 + 1878: + color: '#DE3A3A96' + id: HalfTileOverlayGreyscale180 + coordinates: -31,-21 + 1885: + color: '#DE3A3A96' + id: QuarterTileOverlayGreyscale270 + coordinates: -31,-17 + 1886: + color: '#DE3A3A96' + id: QuarterTileOverlayGreyscale270 + coordinates: -31,-16 + 1887: + color: '#DE3A3A96' + id: QuarterTileOverlayGreyscale270 + coordinates: -30,-17 + 1892: + color: '#FFFFFFFF' + id: DirtMedium + coordinates: -31,-20 + 1893: + color: '#FFFFFFFF' + id: DirtLight + coordinates: -30,-20 + 1894: + color: '#FFFFFFFF' + id: DirtLight + coordinates: -27,-21 + 1895: + color: '#FFFFFFFF' + id: DirtLight + coordinates: -29,-21 + 1896: + color: '#FFFFFFFF' + id: DirtLight + coordinates: -21,-19 + 1899: + color: '#FFFFFFFF' + id: DirtLight + coordinates: -32,-20 + 1900: + color: '#FFFFFFFF' + id: DirtLight + coordinates: -31,-17 -1,-2: 85: color: '#FFFFFFFF' @@ -3966,11 +3966,11 @@ entities: color: '#FFFFFFFF' id: Bot coordinates: -2,-45 - 908: + 893: color: '#FFFFFFFF' id: WarnBox coordinates: -18,-58 - 1517: + 1501: color: '#FFFFFFFF' id: Bot coordinates: -9,-38 @@ -4082,11 +4082,11 @@ entities: color: '#D4D4D428' id: CheckerNESW coordinates: -4,-69 - 907: + 892: color: '#FFFFFFFF' id: WarnBox coordinates: -9,-68 - 909: + 894: color: '#FFFFFFFF' id: Bot coordinates: -5,-72 @@ -4192,831 +4192,831 @@ entities: color: '#EFB34196' id: QuarterTileOverlayGreyscale coordinates: -1,11 - 682: + 677: color: '#DE3A3A96' id: ThreeQuarterTileOverlayGreyscale90 coordinates: -31,2 - 693: + 688: color: '#DE3A3A96' id: HalfTileOverlayGreyscale coordinates: -32,2 - 694: + 689: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -31,0 - 695: + 690: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 coordinates: -31,1 - 777: + 762: color: '#FFFFFFFF' id: WarningLine coordinates: -32,11 - 780: + 765: color: '#FFFFFFFF' id: WarningLineCornerFlipped coordinates: -31,11 - 954: + 939: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: Arrows coordinates: -4,13 - 955: + 940: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: Arrows coordinates: -4,14 - 956: + 941: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: Arrows coordinates: -4,15 - 957: + 942: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: Arrows coordinates: -4,16 - 968: + 953: color: '#EFB34196' id: FullTileOverlayGreyscale coordinates: -15,27 - 969: + 954: color: '#EFB34196' id: FullTileOverlayGreyscale coordinates: -16,27 - 970: + 955: color: '#EFB34196' id: FullTileOverlayGreyscale coordinates: -17,27 - 971: + 956: color: '#EFB34196' id: FullTileOverlayGreyscale coordinates: -18,27 - 972: + 957: color: '#EFB34196' id: FullTileOverlayGreyscale coordinates: -19,27 - 973: + 958: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -15,28 - 974: + 959: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -16,28 - 975: + 960: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -17,28 - 976: + 961: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -19,28 - 977: + 962: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -18,28 - 978: + 963: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -20,28 - 979: + 964: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -21,28 - 980: + 965: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -22,28 - 981: + 966: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -23,28 - 982: + 967: color: '#EFB34196' id: HalfTileOverlayGreyscale coordinates: -15,30 - 983: + 968: color: '#EFB34196' id: HalfTileOverlayGreyscale coordinates: -18,30 - 984: + 969: color: '#EFB34196' id: HalfTileOverlayGreyscale coordinates: -19,30 - 985: + 970: color: '#EFB34196' id: QuarterTileOverlayGreyscale90 coordinates: -21,30 - 986: + 971: color: '#EFB34196' id: HalfTileOverlayGreyscale90 coordinates: -21,31 - 996: + 981: cleanable: True color: '#FFFFFFFF' id: DirtHeavy coordinates: -22,28 - 997: + 982: cleanable: True color: '#FFFFFFFF' id: DirtHeavy coordinates: -19,27 - 998: + 983: cleanable: True color: '#FFFFFFFF' id: DirtHeavy coordinates: -15,28 - 999: + 984: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: -18,27 - 1000: + 985: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: -21,28 - 1001: + 986: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: -23,30 - 1002: + 987: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: -22,29 - 1003: + 988: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: -16,28 - 1004: + 989: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: -25,31 - 1005: + 990: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -26,31 - 1006: + 991: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -27,30 - 1007: + 992: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -23,31 - 1008: + 993: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -23,29 - 1009: + 994: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -21,29 - 1010: + 995: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -20,28 - 1011: + 996: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -17,28 - 1012: + 997: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -18,29 - 1014: + 999: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -22,27 - 1015: + 1000: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -24,30 - 1016: + 1001: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -29,31 - 1017: + 1002: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -15,25 - 1018: + 1003: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -16,25 - 1027: + 1012: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -1,24 - 1029: + 1014: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -2,25 - 1030: + 1015: angle: 3.141592653589793 rad color: '#FFFFFFFF' id: WarningLineCornerFlipped coordinates: -2,24 - 1055: + 1040: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -2,17 - 1056: + 1041: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -1,17 - 1057: + 1042: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -3,17 - 1058: + 1043: color: '#EFB34196' id: ThreeQuarterTileOverlayGreyscale270 coordinates: -5,17 - 1059: + 1044: color: '#EFB34196' id: HalfTileOverlayGreyscale270 coordinates: -5,18 - 1060: + 1045: color: '#EFB34196' id: HalfTileOverlayGreyscale270 coordinates: -5,19 - 1061: + 1046: color: '#EFB34196' id: HalfTileOverlayGreyscale270 coordinates: -5,20 - 1062: + 1047: color: '#EFB34196' id: ThreeQuarterTileOverlayGreyscale coordinates: -5,21 - 1069: + 1054: color: '#EFB34196' id: HalfTileOverlayGreyscale coordinates: -1,21 - 1070: + 1055: color: '#EFB34196' id: HalfTileOverlayGreyscale coordinates: -2,21 - 1071: + 1056: color: '#EFB34196' id: QuarterTileOverlayGreyscale coordinates: -4,21 - 1072: + 1057: color: '#EFB34196' id: QuarterTileOverlayGreyscale90 coordinates: -3,21 - 1073: + 1058: color: '#EFB34196' id: HalfTileOverlayGreyscale90 coordinates: -3,22 - 1074: + 1059: color: '#EFB34196' id: HalfTileOverlayGreyscale270 coordinates: -4,22 - 1075: + 1060: color: '#EFB34196' id: QuarterTileOverlayGreyscale270 coordinates: -4,23 - 1076: + 1061: color: '#EFB34196' id: ThreeQuarterTileOverlayGreyscale270 coordinates: -5,23 - 1077: + 1062: color: '#EFB34196' id: QuarterTileOverlayGreyscale180 coordinates: -3,23 - 1078: + 1063: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -2,23 - 1079: + 1064: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -1,23 - 1093: + 1078: color: '#EFB34196' id: HalfTileOverlayGreyscale270 coordinates: -5,24 - 1094: + 1079: color: '#EFB34196' id: HalfTileOverlayGreyscale270 coordinates: -5,25 - 1095: + 1080: color: '#EFB34196' id: HalfTileOverlayGreyscale270 coordinates: -5,26 - 1096: + 1081: color: '#EFB34196' id: QuarterTileOverlayGreyscale270 coordinates: -5,27 - 1097: + 1082: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -6,27 - 1098: + 1083: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -7,27 - 1099: + 1084: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -8,27 - 1100: + 1085: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -9,27 - 1101: + 1086: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -10,27 - 1102: + 1087: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -11,27 - 1103: + 1088: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -12,27 - 1104: + 1089: color: '#EFB34196' id: HalfTileOverlayGreyscale180 coordinates: -13,27 - 1105: + 1090: color: '#FFFFFFFF' id: WarningLine coordinates: -6,31 - 1106: + 1091: color: '#FFFFFFFF' id: WarningLine coordinates: -7,31 - 1107: + 1092: color: '#FFFFFFFF' id: WarningLineCorner coordinates: -8,31 - 1108: + 1093: color: '#FFFFFFFF' id: WarningLineCornerFlipped coordinates: -5,31 - 1109: + 1094: color: '#FFFFFFFF' id: Caution coordinates: -7,31 - 1110: + 1095: color: '#FFFFFFFF' id: StandClear coordinates: -6,31 - 1151: + 1136: color: '#FFFFFFFF' id: DirtLight coordinates: -23,26 - 1152: + 1137: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -16,12 - 1153: + 1138: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -16,23 - 1154: + 1139: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -23,24 - 1918: - color: '#FFFFFFFF' - id: WarnCornerSmallNE - coordinates: -12,2 - 1195: + 1179: color: '#334E6DC8' id: FullTileOverlayGreyscale coordinates: -1,3 - 1196: + 1180: color: '#334E6DC8' id: FullTileOverlayGreyscale coordinates: -2,3 - 1197: + 1181: color: '#334E6DC8' id: FullTileOverlayGreyscale coordinates: -3,3 - 1199: + 1183: color: '#334E6DC8' id: HalfTileOverlayGreyscale270 coordinates: -4,1 - 1200: + 1184: color: '#334E6DC8' id: HalfTileOverlayGreyscale270 coordinates: -3,2 - 1203: + 1187: color: '#334E6DC8' id: QuarterTileOverlayGreyscale90 coordinates: -4,1 - 1204: + 1188: color: '#334E6DC8' id: QuarterTileOverlayGreyscale coordinates: -3,1 - 1205: + 1189: color: '#334E6DC8' id: QuarterTileOverlayGreyscale coordinates: -4,0 - 1210: + 1194: color: '#FFFFFFFF' id: Bot coordinates: -13,11 - 1211: + 1195: color: '#FFFFFFFF' id: Bot coordinates: -19,27 - 1213: + 1197: color: '#FFFFFFFF' id: Bot coordinates: -32,26 - 1229: + 1213: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -32,9 - 1230: + 1214: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -31,9 - 1231: + 1215: color: '#D381C996' id: QuarterTileOverlayGreyscale coordinates: -30,9 - 1453: + 1437: color: '#FFFFFFFF' id: Delivery coordinates: -22,26 - 1454: + 1438: color: '#FFFFFFFF' id: StandClear coordinates: -21,26 - 1455: + 1439: color: '#FFFFFFFF' id: StandClear coordinates: -23,26 - 1456: + 1440: color: '#FFFFFFFF' id: Arrows coordinates: -22,28 - 1457: + 1441: color: '#EFB34196' id: QuarterTileOverlayGreyscale90 coordinates: -15,25 - 1458: + 1442: color: '#EFB34196' id: QuarterTileOverlayGreyscale90 coordinates: -16,25 - 1459: + 1443: color: '#EFB34196' id: QuarterTileOverlayGreyscale90 coordinates: -17,25 - 1460: + 1444: color: '#EFB34196' id: QuarterTileOverlayGreyscale90 coordinates: -18,25 - 1461: + 1445: color: '#EFB34196' id: QuarterTileOverlayGreyscale90 coordinates: -19,25 - 1462: + 1446: color: '#EFB34196' id: QuarterTileOverlayGreyscale90 coordinates: -20,25 - 1489: + 1473: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -15,25 - 1490: + 1474: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -22,25 - 1491: + 1475: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -17,18 - 1499: + 1483: color: '#334E6DC8' id: HalfTileOverlayGreyscale90 coordinates: -15,3 - 1500: + 1484: color: '#334E6DC8' id: QuarterTileOverlayGreyscale180 coordinates: -15,4 - 1501: + 1485: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -15,3 - 1502: + 1486: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLineCornerFlipped coordinates: -15,4 - 1503: + 1487: color: '#334E6DC8' id: QuarterTileOverlayGreyscale90 coordinates: -15,2 - 1504: + 1488: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLineCorner coordinates: -15,2 - 1505: + 1489: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: -16,6 - 1506: + 1490: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -16,7 - 1507: + 1491: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: -14,7 - 1508: + 1492: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -16,4 - 1509: + 1493: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -15,9 - 1510: + 1494: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -16,0 - 1512: + 1496: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale270 coordinates: -18,0 - 1513: + 1497: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale coordinates: -18,1 - 1514: + 1498: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale coordinates: -18,2 - 1525: + 1509: color: '#FFFFFFFF' id: WarnLineW coordinates: -9,2 - 1526: + 1510: color: '#FFFFFFFF' id: WarnLineW coordinates: -10,2 - 1527: + 1511: color: '#FFFFFFFF' id: WarnLineW coordinates: -11,2 - 1549: + 1532: color: '#DE3A3A96' id: CheckerNWSE coordinates: -17,30 - 1550: + 1533: color: '#DE3A3A96' id: CheckerNWSE coordinates: -16,30 - 1551: + 1534: color: '#EFB34196' id: QuarterTileOverlayGreyscale90 coordinates: -17,30 - 1552: + 1535: color: '#EFB34196' id: QuarterTileOverlayGreyscale90 coordinates: -16,30 - 1553: + 1536: color: '#FFFFFFFF' id: Bot coordinates: -17,30 - 1554: + 1537: color: '#FFFFFFFF' id: Bot coordinates: -16,30 - 1555: + 1538: color: '#52B4E996' id: CheckerNWSE coordinates: -20,30 - 1556: + 1539: color: '#EFB34196' id: QuarterTileOverlayGreyscale90 coordinates: -20,30 - 1557: + 1540: color: '#FFFFFFFF' id: Bot coordinates: -20,30 - 1583: + 1566: color: '#FFFFFFFF' id: SpaceStationSign1 coordinates: -3,10 - 1584: + 1567: color: '#FFFFFFFF' id: SpaceStationSign2 coordinates: -2,10 - 1585: + 1568: color: '#FFFFFFFF' id: SpaceStationSign3 coordinates: -1,10 - 1602: + 1585: color: '#FFFFFFFF' id: WoodTrimThinLineW coordinates: -23,11 - 1603: + 1586: color: '#FFFFFFFF' id: WoodTrimThinLineW coordinates: -23,12 - 1604: + 1587: color: '#FFFFFFFF' id: WoodTrimThinLineW coordinates: -23,13 - 1605: + 1588: color: '#FFFFFFFF' id: WoodTrimThinLineW coordinates: -23,14 - 1606: + 1589: color: '#FFFFFFFF' id: WoodTrimThinLineW coordinates: -23,15 - 1607: + 1590: color: '#FFFFFFFF' id: WoodTrimThinLineW coordinates: -23,16 - 1608: + 1591: color: '#FFFFFFFF' id: WoodTrimThinLineW coordinates: -23,17 - 1609: + 1592: color: '#FFFFFFFF' id: WoodTrimThinLineW coordinates: -23,18 - 1610: + 1593: color: '#FFFFFFFF' id: WoodTrimThinLineW coordinates: -23,19 - 1611: + 1594: color: '#FFFFFFFF' id: WoodTrimThinLineW coordinates: -23,20 - 1612: + 1595: color: '#FFFFFFFF' id: WoodTrimThinLineW coordinates: -23,21 - 1613: + 1596: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: -29,11 - 1614: + 1597: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: -29,12 - 1615: + 1598: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: -29,13 - 1616: + 1599: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: -29,14 - 1617: + 1600: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: -29,15 - 1618: + 1601: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: -29,16 - 1619: + 1602: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: -29,17 - 1620: + 1603: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: -29,18 - 1621: + 1604: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: -29,19 - 1622: + 1605: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: -29,20 - 1623: + 1606: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: -29,21 - 1705: + 1688: color: '#79150096' id: QuarterTileOverlayGreyscale180 coordinates: -1,9 - 1712: + 1695: color: '#79150096' id: QuarterTileOverlayGreyscale180 coordinates: -3,9 - 1713: + 1696: color: '#79150096' id: QuarterTileOverlayGreyscale180 coordinates: -5,9 - 1714: + 1697: color: '#79150096' id: QuarterTileOverlayGreyscale180 coordinates: -6,8 - 1715: + 1698: color: '#79150096' id: QuarterTileOverlayGreyscale180 coordinates: -8,8 - 1716: + 1699: color: '#79150096' id: QuarterTileOverlayGreyscale180 coordinates: -9,7 - 1717: + 1700: color: '#79150096' id: QuarterTileOverlayGreyscale180 coordinates: -11,7 - 1718: + 1701: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale180 coordinates: -2,9 - 1719: + 1702: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale180 coordinates: -4,9 - 1720: + 1703: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale180 coordinates: -5,8 - 1721: + 1704: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale180 coordinates: -7,8 - 1722: + 1705: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale180 coordinates: -8,7 - 1723: + 1706: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale180 coordinates: -10,7 - 1724: + 1707: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale180 coordinates: -12,7 - 1890: + 1873: color: '#FFFFFFFF' id: WarnCornerSmallNW coordinates: -8,2 - 1891: + 1874: color: '#FFFFFFFF' id: WarnLineS coordinates: -8,3 - 1892: + 1875: color: '#FFFFFFFF' id: WarnLineS coordinates: -8,4 - 1893: + 1876: color: '#FFFFFFFF' id: WarnLineS coordinates: -8,5 - 1919: + 1901: + color: '#FFFFFFFF' + id: WarnCornerSmallNE + coordinates: -12,2 + 1902: color: '#FFFFFFFF' id: WarnLineE coordinates: -12,3 - 1920: + 1903: color: '#FFFFFFFF' id: WarnLineE coordinates: -12,4 - 1921: + 1904: color: '#FFFFFFFF' id: WarnLineE coordinates: -12,5 @@ -5343,41 +5343,41 @@ entities: color: '#FFFFFFFF' id: Flowersy4 coordinates: 8.885967,-53.959545 - 910: + 895: color: '#FFFFFFFF' id: Bot coordinates: 4,-62 - 932: + 917: cleanable: True color: '#FFFFFFFF' id: Grasse2 coordinates: 8,-55 - 933: + 918: cleanable: True color: '#FFFFFFFF' id: Grassd3 coordinates: 7,-55 - 946: + 931: color: '#FFFFFFFF' id: Grasse3 coordinates: 8.798644,-54.89343 - 947: + 932: color: '#FFFFFFFF' id: Flowersy4 coordinates: 8.829894,-54.596554 - 1518: + 1502: color: '#FFFFFFFF' id: WarnLineS coordinates: 3,-40 - 1519: + 1503: color: '#FFFFFFFF' id: WarnLineS coordinates: 3,-39 - 1520: + 1504: color: '#FFFFFFFF' id: WarnLineS coordinates: 3,-38 - 1521: + 1505: color: '#FFFFFFFF' id: WarnLineS coordinates: 3,-37 @@ -5601,330 +5601,330 @@ entities: color: '#52B4E996' id: FullTileOverlayGreyscale coordinates: 31,-20 - 911: + 896: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 11,-21 - 912: + 897: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 12,-21 - 913: + 898: color: '#D4D4D428' id: CheckerNWSE coordinates: 14,-14 - 914: + 899: color: '#D4D4D428' id: CheckerNWSE coordinates: 14,-13 - 915: + 900: color: '#D4D4D428' id: CheckerNWSE coordinates: 14,-12 - 916: + 901: color: '#D4D4D428' id: QuarterTileOverlayGreyscale coordinates: 15,-14 - 917: + 902: color: '#D4D4D428' id: QuarterTileOverlayGreyscale coordinates: 15,-13 - 918: + 903: color: '#D4D4D428' id: QuarterTileOverlayGreyscale coordinates: 15,-12 - 919: + 904: color: '#D4D4D428' id: QuarterTileOverlayGreyscale coordinates: 15,-11 - 920: + 905: color: '#D4D4D428' id: QuarterTileOverlayGreyscale coordinates: 15,-15 - 921: + 906: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: 14,-14 - 922: + 907: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 15,-14 - 923: + 908: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 15,-15 - 924: + 909: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 15,-12 - 925: + 910: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 15,-11 - 926: + 911: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 16,-9 - 927: + 912: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 17,-2 - 931: + 916: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 16,-5 - 1178: + 1162: color: '#334E6DC8' id: QuarterTileOverlayGreyscale90 coordinates: 1,-8 - 1179: + 1163: color: '#334E6DC8' id: QuarterTileOverlayGreyscale90 coordinates: 1,-7 - 1180: + 1164: color: '#334E6DC8' id: QuarterTileOverlayGreyscale90 coordinates: 1,-6 - 1181: + 1165: color: '#334E6DC8' id: QuarterTileOverlayGreyscale90 coordinates: 1,-5 - 1182: + 1166: color: '#334E6DC8' id: QuarterTileOverlayGreyscale90 coordinates: 1,-4 - 1183: + 1167: color: '#334E6DC8' id: QuarterTileOverlayGreyscale90 coordinates: 1,-3 - 1207: + 1191: color: '#FFFFFFFF' id: Bot coordinates: 2,-1 - 1410: + 1394: cleanable: True color: '#DE3A3A18' id: splatter coordinates: 19,-8 - 1522: + 1506: color: '#FFFFFFFF' id: WarnLineS coordinates: 3,-8 - 1523: + 1507: color: '#FFFFFFFF' id: WarnLineS coordinates: 3,-7 - 1524: + 1508: color: '#FFFFFFFF' id: WarnLineS coordinates: 3,-6 - 1640: + 1623: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale90 coordinates: 1,-20 - 1641: + 1624: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale90 coordinates: 1,-18 - 1642: + 1625: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale90 coordinates: 1,-16 - 1643: + 1626: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale90 coordinates: 1,-14 - 1644: + 1627: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale90 coordinates: 1,-12 - 1645: + 1628: color: '#0E7F1B88' id: QuarterTileOverlayGreyscale90 coordinates: 1,-10 - 1646: + 1629: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 1,-21 - 1647: + 1630: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 1,-19 - 1648: + 1631: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 1,-17 - 1649: + 1632: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 1,-15 - 1650: + 1633: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 1,-13 - 1651: + 1634: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 1,-11 - 1841: + 1824: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 3,-23 - 1842: + 1825: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 5,-23 - 1843: + 1826: color: '#79150096' id: QuarterTileOverlayGreyscale270 coordinates: 6,-22 - 1844: + 1827: color: '#79150096' id: CheckerNESW coordinates: 6,-20 - 1845: + 1828: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 8,-20 - 1846: + 1829: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 9,-21 - 1847: + 1830: color: '#0E7F1B76' id: QuarterTileOverlayGreyscale90 coordinates: 4,-23 - 1848: + 1831: color: '#0E7F1B76' id: QuarterTileOverlayGreyscale90 coordinates: 2,-23 - 1849: + 1832: color: '#0E7F1B76' id: QuarterTileOverlayGreyscale270 coordinates: 6,-21 - 1850: + 1833: color: '#0E7F1B76' id: QuarterTileOverlayGreyscale90 coordinates: 7,-20 - 1851: + 1834: color: '#0E7F1B76' id: QuarterTileOverlayGreyscale90 coordinates: 9,-20 - 1852: + 1835: color: '#0E7F1B76' id: QuarterTileOverlayGreyscale90 coordinates: 9,-22 - 1853: + 1836: color: '#0E7F1B76' id: QuarterTileOverlayGreyscale90 coordinates: 10,-23 - 1854: + 1837: color: '#0E7F1B76' id: QuarterTileOverlayGreyscale90 coordinates: 12,-23 - 1855: + 1838: color: '#0E7F1B76' id: QuarterTileOverlayGreyscale90 coordinates: 14,-23 - 1856: + 1839: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 11,-23 - 1857: + 1840: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 13,-23 - 1858: + 1841: color: '#79150096' id: QuarterTileOverlayGreyscale coordinates: 19,-23 - 1859: + 1842: color: '#0E7F1B82' id: QuarterTileOverlayGreyscale coordinates: 18,-23 - 1860: + 1843: color: '#0E7F1B82' id: QuarterTileOverlayGreyscale90 coordinates: 24,-23 - 1861: + 1844: color: '#0E7F1B82' id: QuarterTileOverlayGreyscale90 coordinates: 26,-23 - 1862: + 1845: color: '#0E7F1B82' id: QuarterTileOverlayGreyscale90 coordinates: 28,-23 - 1863: + 1846: color: '#0E7F1B82' id: QuarterTileOverlayGreyscale90 coordinates: 30,-23 - 1866: + 1849: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 25,-23 - 1867: + 1850: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 27,-23 - 1868: + 1851: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 29,-23 - 1869: + 1852: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 31,-23 - 1881: + 1864: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 4,-23 - 1882: + 1865: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 7,-21 - 1883: + 1866: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 9,-21 - 1884: + 1867: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 9,-22 - 1885: + 1868: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 10,-23 - 1886: + 1869: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 16,-25 - 1887: + 1870: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 16,-25 - 1888: + 1871: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 13,-25 - 1889: + 1872: color: '#FFFFFFFF' id: Bot coordinates: 6,-20 @@ -6009,418 +6009,418 @@ entities: color: '#D4D4D428' id: HalfTileOverlayGreyscale90 coordinates: -37,-1 - 635: + 630: color: '#DE3A3A96' id: FullTileOverlayGreyscale coordinates: -33,-13 - 636: + 631: color: '#DE3A3A96' id: FullTileOverlayGreyscale coordinates: -33,-10 - 637: + 632: color: '#DE3A3A96' id: FullTileOverlayGreyscale coordinates: -33,-7 - 684: + 679: color: '#DE3A3A96' id: ThreeQuarterTileOverlayGreyscale270 coordinates: -35,-1 - 687: + 682: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -33,-1 - 688: + 683: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 coordinates: -34,-1 - 762: + 747: color: '#FFFFFFFF' id: WarningLine coordinates: -58,-1 - 763: + 748: color: '#FFFFFFFF' id: WarningLine coordinates: -57,-1 - 764: + 749: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -56,-4 - 765: + 750: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -56,-3 - 766: + 751: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -56,-2 - 767: + 752: color: '#FFFFFFFF' id: WarningLineCornerFlipped coordinates: -56,-1 - 784: + 769: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -42,-2 - 785: + 770: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -43,-2 - 787: + 772: color: '#D381C996' id: ThreeQuarterTileOverlayGreyscale90 coordinates: -52,-1 - 788: + 773: color: '#D381C996' id: HalfTileOverlayGreyscale90 coordinates: -52,-4 - 789: + 774: color: '#D381C996' id: HalfTileOverlayGreyscale90 coordinates: -52,-3 - 790: + 775: color: '#D381C996' id: HalfTileOverlayGreyscale90 coordinates: -52,-2 - 791: + 776: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -53,-1 - 792: + 777: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -54,-1 - 793: + 778: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -55,-1 - 794: + 779: color: '#D381C996' id: QuarterTileOverlayGreyscale90 coordinates: -56,-1 - 822: + 807: color: '#D381C996' id: QuarterTileOverlayGreyscale coordinates: -40,-4 - 823: + 808: color: '#D381C996' id: QuarterTileOverlayGreyscale coordinates: -40,-5 - 824: + 809: color: '#D381C996' id: QuarterTileOverlayGreyscale coordinates: -40,-6 - 825: + 810: color: '#D381C996' id: QuarterTileOverlayGreyscale coordinates: -40,-7 - 826: + 811: color: '#D381C996' id: QuarterTileOverlayGreyscale coordinates: -40,-8 - 827: + 812: color: '#D381C93E' id: HalfTileOverlayGreyscale270 coordinates: -46,-7 - 828: + 813: color: '#D381C93E' id: HalfTileOverlayGreyscale270 coordinates: -46,-8 - 829: + 814: color: '#D381C93E' id: HalfTileOverlayGreyscale270 coordinates: -46,-9 - 830: + 815: color: '#D381C93E' id: HalfTileOverlayGreyscale270 coordinates: -46,-10 - 831: + 816: color: '#D381C93E' id: HalfTileOverlayGreyscale270 coordinates: -46,-5 - 832: + 817: color: '#D381C93E' id: ThreeQuarterTileOverlayGreyscale coordinates: -46,-4 - 833: + 818: color: '#D381C93E' id: ThreeQuarterTileOverlayGreyscale90 coordinates: -42,-4 - 834: + 819: color: '#D381C93E' id: ThreeQuarterTileOverlayGreyscale180 coordinates: -42,-11 - 835: + 820: color: '#D381C93E' id: ThreeQuarterTileOverlayGreyscale270 coordinates: -46,-11 - 836: + 821: color: '#D381C93E' id: HalfTileOverlayGreyscale180 coordinates: -45,-11 - 837: + 822: color: '#D381C93E' id: HalfTileOverlayGreyscale180 coordinates: -44,-11 - 838: + 823: color: '#D381C93E' id: HalfTileOverlayGreyscale180 coordinates: -43,-11 - 839: + 824: color: '#D381C93E' id: HalfTileOverlayGreyscale coordinates: -43,-4 - 840: + 825: color: '#D381C93E' id: HalfTileOverlayGreyscale coordinates: -44,-4 - 841: + 826: color: '#D381C93E' id: HalfTileOverlayGreyscale coordinates: -45,-4 - 842: + 827: color: '#D381C93E' id: HalfTileOverlayGreyscale90 coordinates: -42,-5 - 843: + 828: color: '#D381C93E' id: HalfTileOverlayGreyscale90 coordinates: -42,-6 - 844: + 829: color: '#D381C93E' id: HalfTileOverlayGreyscale90 coordinates: -42,-7 - 845: + 830: color: '#D381C93E' id: HalfTileOverlayGreyscale90 coordinates: -42,-8 - 846: + 831: color: '#D381C93E' id: HalfTileOverlayGreyscale90 coordinates: -42,-9 - 847: + 832: color: '#D381C93E' id: HalfTileOverlayGreyscale90 coordinates: -42,-10 - 848: + 833: color: '#D381C93E' id: HalfTileOverlayGreyscale270 coordinates: -41,-11 - 849: + 834: color: '#D381C93E' id: HalfTileOverlayGreyscale270 coordinates: -41,-10 - 868: + 853: color: '#FFFFFFFF' id: StandClear coordinates: -40,-1 - 904: + 889: color: '#FFFFFFFF' id: Bot coordinates: -44,-4 - 1476: + 1460: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale90 coordinates: -37,-18 - 1477: + 1461: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale90 coordinates: -37,-17 - 1478: + 1462: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale90 coordinates: -37,-16 - 1479: + 1463: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale90 coordinates: -37,-15 - 1480: + 1464: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale90 coordinates: -37,-14 - 1481: + 1465: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale90 coordinates: -37,-13 - 1482: + 1466: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale90 coordinates: -37,-12 - 1483: + 1467: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale90 coordinates: -37,-11 - 1484: + 1468: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale90 coordinates: -37,-10 - 1485: + 1469: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale90 coordinates: -37,-9 - 1486: + 1470: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale90 coordinates: -37,-8 - 1487: + 1471: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale90 coordinates: -37,-7 - 1488: + 1472: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale90 coordinates: -37,-6 - 1493: + 1477: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -37,-11 - 1494: + 1478: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -37,-15 - 1732: + 1715: color: '#D381C925' id: BrickTileWhiteLineW coordinates: -50,-9 - 1733: + 1716: color: '#D381C925' id: BrickTileWhiteLineW coordinates: -50,-8 - 1734: + 1717: color: '#D381C925' id: BrickTileWhiteLineW coordinates: -50,-7 - 1735: + 1718: color: '#D381C925' id: BrickTileWhiteLineW coordinates: -50,-6 - 1736: + 1719: color: '#D381C925' id: BrickTileWhiteLineW coordinates: -50,-5 - 1737: + 1720: color: '#D381C925' id: BrickTileWhiteLineW coordinates: -50,-4 - 1738: + 1721: color: '#D381C925' id: BrickTileWhiteLineW coordinates: -50,-3 - 1739: + 1722: color: '#D381C925' id: BrickTileWhiteLineW coordinates: -50,-2 - 1740: + 1723: color: '#D381C925' id: BrickTileWhiteLineW coordinates: -50,-1 - 1742: + 1725: color: '#D381C925' id: BrickTileWhiteLineE coordinates: -48,-9 - 1743: + 1726: color: '#D381C925' id: BrickTileWhiteLineE coordinates: -48,-8 - 1744: + 1727: color: '#D381C925' id: BrickTileWhiteLineE coordinates: -48,-7 - 1745: + 1728: color: '#D381C925' id: BrickTileWhiteLineE coordinates: -48,-5 - 1746: + 1729: color: '#D381C925' id: BrickTileWhiteLineE coordinates: -48,-4 - 1747: + 1730: color: '#D381C925' id: BrickTileWhiteLineE coordinates: -48,-3 - 1748: + 1731: color: '#D381C925' id: BrickTileWhiteInnerSe coordinates: -48,-2 - 1749: + 1732: color: '#D381C925' id: BrickTileWhiteLineS coordinates: -47,-2 - 1750: + 1733: color: '#D381C925' id: BrickTileWhiteLineS coordinates: -46,-2 - 1751: + 1734: color: '#D381C925' id: BrickTileWhiteLineS coordinates: -45,-2 - 1775: + 1758: color: '#D381C925' id: BrickTileWhiteInnerSe coordinates: -48,-6 - 1776: + 1759: color: '#D381C925' id: BrickTileWhiteInnerNe coordinates: -48,-6 - 1777: + 1760: color: '#D381C925' id: BrickTileWhiteLineS coordinates: -47,-6 - 1778: + 1761: color: '#D381C925' id: BrickTileWhiteLineN coordinates: -47,-6 - 1896: + 1879: color: '#DE3A3A96' id: BrickTileWhiteLineW coordinates: -35,-21 - 1897: + 1880: color: '#DE3A3A96' id: BrickTileWhiteLineW coordinates: -35,-20 - 1898: + 1881: color: '#DE3A3A96' id: BrickTileWhiteLineW coordinates: -35,-19 - 1899: + 1882: color: '#DE3A3A96' id: BrickTileWhiteLineW coordinates: -35,-18 - 1900: + 1883: color: '#DE3A3A96' id: BrickTileWhiteLineW coordinates: -35,-17 - 1901: + 1884: color: '#DE3A3A96' id: BrickTileWhiteLineW coordinates: -35,-16 - 1905: + 1888: color: '#DE3A3A96' id: BrickTileWhiteLineE coordinates: -33,-21 - 1906: + 1889: color: '#DE3A3A96' id: BrickTileWhiteLineE coordinates: -33,-19 - 1907: + 1890: color: '#DE3A3A96' id: BrickTileWhiteLineE coordinates: -33,-18 - 1908: + 1891: color: '#DE3A3A96' id: BrickTileWhiteLineE coordinates: -33,-16 - 1914: + 1897: color: '#FFFFFFFF' id: DirtLight coordinates: -33,-20 - 1915: + 1898: color: '#FFFFFFFF' id: DirtLight coordinates: -33,-17 @@ -6445,823 +6445,831 @@ entities: color: '#FFFFFFFF' id: DirtLight coordinates: -37,0 - 683: + 678: color: '#DE3A3A96' id: ThreeQuarterTileOverlayGreyscale coordinates: -35,2 - 689: + 684: color: '#DE3A3A96' id: HalfTileOverlayGreyscale270 coordinates: -35,0 - 690: + 685: color: '#DE3A3A96' id: HalfTileOverlayGreyscale270 coordinates: -35,1 - 691: + 686: color: '#DE3A3A96' id: HalfTileOverlayGreyscale coordinates: -34,2 - 692: + 687: color: '#DE3A3A96' id: HalfTileOverlayGreyscale coordinates: -33,2 - 768: + 753: color: '#FFFFFFFF' id: Bot coordinates: -59,2 - 769: + 754: color: '#FFFFFFFF' id: Bot coordinates: -59,3 - 770: + 755: color: '#FFFFFFFF' id: Bot coordinates: -59,4 - 771: + 756: color: '#FFFFFFFF' id: Bot coordinates: -59,5 - 772: + 757: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: Arrows coordinates: -58,2 - 773: + 758: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: Arrows coordinates: -58,3 - 774: + 759: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: Arrows coordinates: -58,4 - 775: + 760: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: Arrows coordinates: -58,5 - 776: + 761: color: '#FFFFFFFF' id: StandClear coordinates: -53,1 - 778: + 763: color: '#FFFFFFFF' id: WarningLine coordinates: -33,11 - 779: + 764: color: '#FFFFFFFF' id: WarningLine coordinates: -34,11 - 781: + 766: color: '#FFFFFFFF' id: WarningLineCorner coordinates: -35,11 - 782: + 767: color: '#FFFFFFFF' id: WarningLine coordinates: -43,0 - 783: + 768: color: '#FFFFFFFF' id: WarningLine coordinates: -42,0 - 786: + 771: color: '#D381C996' id: ThreeQuarterTileOverlayGreyscale90 coordinates: -56,0 - 795: + 780: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -57,0 - 796: + 781: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -58,0 - 797: + 782: color: '#D381C996' id: FullTileOverlayGreyscale coordinates: -53,0 - 798: + 783: color: '#D381C996' id: ThreeQuarterTileOverlayGreyscale270 coordinates: -39,11 - 799: + 784: color: '#D381C996' id: ThreeQuarterTileOverlayGreyscale270 coordinates: -43,13 - 800: + 785: color: '#D381C996' id: ThreeQuarterTileOverlayGreyscale coordinates: -43,14 - 801: + 786: color: '#D381C996' id: ThreeQuarterTileOverlayGreyscale180 coordinates: -37,11 - 802: + 787: color: '#D381C996' id: ThreeQuarterTileOverlayGreyscale90 coordinates: -37,14 - 803: + 788: color: '#D381C996' id: HalfTileOverlayGreyscale90 coordinates: -37,12 - 804: + 789: color: '#D381C996' id: HalfTileOverlayGreyscale90 coordinates: -37,13 - 805: + 790: color: '#D381C996' id: HalfTileOverlayGreyscale180 coordinates: -38,11 - 806: + 791: color: '#D381C996' id: HalfTileOverlayGreyscale180 coordinates: -42,13 - 807: + 792: color: '#D381C996' id: HalfTileOverlayGreyscale180 coordinates: -41,13 - 808: + 793: color: '#D381C996' id: HalfTileOverlayGreyscale180 coordinates: -40,13 - 809: + 794: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -42,14 - 810: + 795: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -41,14 - 811: + 796: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -40,14 - 812: + 797: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -39,14 - 813: + 798: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -38,14 - 814: + 799: color: '#D381C996' id: HalfTileOverlayGreyscale270 coordinates: -39,12 - 815: + 800: color: '#D381C996' id: QuarterTileOverlayGreyscale270 coordinates: -39,13 - 816: + 801: color: '#D381C996' id: FullTileOverlayGreyscale coordinates: -36,14 - 817: + 802: color: '#D381C996' id: QuarterTileOverlayGreyscale coordinates: -35,11 - 818: + 803: color: '#D381C996' id: QuarterTileOverlayGreyscale coordinates: -35,12 - 819: + 804: color: '#D381C996' id: QuarterTileOverlayGreyscale coordinates: -35,13 - 820: + 805: color: '#D381C996' id: QuarterTileOverlayGreyscale coordinates: -35,14 - 821: + 806: color: '#D381C996' id: QuarterTileOverlayGreyscale coordinates: -35,15 - 850: + 835: color: '#D381C93E' id: FullTileOverlayGreyscale coordinates: -46,3 - 851: + 836: color: '#D381C93E' id: CheckerNWSE coordinates: -45,2 - 852: + 837: color: '#D381C93E' id: CheckerNWSE coordinates: -45,3 - 853: + 838: color: '#D381C93E' id: CheckerNWSE coordinates: -44,3 - 854: + 839: color: '#D381C93E' id: CheckerNWSE coordinates: -44,2 - 855: + 840: color: '#D381C93E' id: CheckerNWSE coordinates: -43,2 - 856: + 841: color: '#D381C93E' id: CheckerNWSE coordinates: -43,3 - 857: + 842: color: '#D381C93E' id: CheckerNWSE coordinates: -42,3 - 858: + 843: color: '#D381C93E' id: CheckerNWSE coordinates: -42,2 - 859: + 844: color: '#D381C93E' id: CheckerNWSE coordinates: -42,4 - 860: + 845: color: '#D381C93E' id: CheckerNWSE coordinates: -43,4 - 861: + 846: color: '#D381C93E' id: CheckerNWSE coordinates: -44,4 - 862: + 847: color: '#D381C93E' id: CheckerNWSE coordinates: -45,4 - 863: + 848: color: '#D381C93E' id: CheckerNWSE coordinates: -45,5 - 864: + 849: color: '#D381C93E' id: CheckerNWSE coordinates: -44,5 - 865: + 850: color: '#D381C93E' id: CheckerNWSE coordinates: -43,5 - 866: + 851: color: '#D381C93E' id: CheckerNWSE coordinates: -42,5 - 867: + 852: color: '#D381C93E' id: HalfTileOverlayGreyscale180 coordinates: -36,2 - 869: + 854: color: '#D381C93E' id: FullTileOverlayGreyscale coordinates: -56,6 - 870: + 855: color: '#D381C93E' id: FullTileOverlayGreyscale coordinates: -55,6 - 871: + 856: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -54,7 - 872: + 857: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -55,7 - 873: + 858: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -56,7 - 874: + 859: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -57,7 - 875: + 860: color: '#D381C996' id: CheckerNWSE coordinates: -54,8 - 876: + 861: color: '#D381C996' id: CheckerNWSE coordinates: -55,8 - 877: + 862: color: '#D381C996' id: CheckerNWSE coordinates: -56,8 - 878: + 863: color: '#D381C996' id: CheckerNWSE coordinates: -57,8 - 879: + 864: color: '#D381C996' id: CheckerNWSE coordinates: -57,9 - 880: + 865: color: '#D381C996' id: CheckerNWSE coordinates: -56,9 - 881: + 866: color: '#D381C996' id: CheckerNWSE coordinates: -55,9 - 882: + 867: color: '#D381C996' id: CheckerNWSE coordinates: -54,9 - 883: + 868: color: '#D381C996' id: CheckerNWSE coordinates: -54,10 - 884: + 869: color: '#D381C996' id: CheckerNWSE coordinates: -55,10 - 885: + 870: color: '#D381C996' id: CheckerNWSE coordinates: -56,10 - 886: + 871: color: '#D381C996' id: CheckerNWSE coordinates: -57,10 - 887: + 872: color: '#D381C996' id: CheckerNWSE coordinates: -57,11 - 888: + 873: color: '#D381C996' id: CheckerNWSE coordinates: -56,11 - 889: + 874: color: '#D381C996' id: CheckerNWSE coordinates: -55,11 - 890: + 875: color: '#D381C996' id: CheckerNWSE coordinates: -54,11 - 891: + 876: color: '#D381C996' id: CheckerNWSE coordinates: -54,12 - 892: + 877: color: '#D381C996' id: CheckerNWSE coordinates: -55,12 - 893: + 878: color: '#D381C996' id: CheckerNWSE coordinates: -56,12 - 894: + 879: color: '#D381C996' id: CheckerNWSE coordinates: -57,12 - 895: + 880: color: '#D381C996' id: CheckerNWSE coordinates: -57,13 - 896: + 881: color: '#D381C996' id: CheckerNWSE coordinates: -57,14 - 897: + 882: color: '#D381C996' id: CheckerNWSE coordinates: -56,14 - 898: + 883: color: '#D381C996' id: CheckerNWSE coordinates: -56,13 - 899: + 884: color: '#D381C996' id: CheckerNWSE coordinates: -55,13 - 900: + 885: color: '#D381C996' id: CheckerNWSE coordinates: -55,14 - 901: + 886: color: '#D381C996' id: CheckerNWSE coordinates: -55,14 - 902: + 887: color: '#D381C996' id: CheckerNWSE coordinates: -54,13 - 903: + 888: color: '#FFFFFFFF' id: Bot coordinates: -57,14 - 905: + 890: color: '#FFFFFFFF' id: Bot coordinates: -37,11 - 906: + 891: color: '#FFFFFFFF' id: Bot coordinates: -37,1 - 1155: + 1140: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -39,24 - 1156: + 1141: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -42,22 - 1157: + 1142: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -43,21 - 1158: + 1143: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -56,16 - 1159: + 1144: cleanable: True color: '#FFFFFFFF' id: DirtHeavy coordinates: -59,19 - 1160: + 1145: cleanable: True color: '#FFFFFFFF' id: DirtHeavy coordinates: -60,22 - 1161: + 1146: cleanable: True color: '#FFFFFFFF' id: DirtHeavy coordinates: -60,23 - 1162: + 1147: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: -58,21 - 1163: + 1148: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: -59,25 - 1164: + 1149: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -58,20 - 1165: + 1150: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -59,18 - 1166: + 1151: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -60,17 - 1167: + 1152: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -59,25 - 1168: + 1153: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -60,24 - 1169: + 1154: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -56,24 - 1170: + 1155: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -57,20 - 1214: + 1198: color: '#D381C996' id: HalfTileOverlayGreyscale270 coordinates: -39,2 - 1215: + 1199: color: '#D381C996' id: HalfTileOverlayGreyscale270 coordinates: -39,3 - 1216: + 1200: color: '#D381C996' id: HalfTileOverlayGreyscale270 coordinates: -39,4 - 1217: + 1201: color: '#D381C996' id: HalfTileOverlayGreyscale270 coordinates: -39,5 - 1218: + 1202: color: '#D381C996' id: HalfTileOverlayGreyscale270 coordinates: -39,6 - 1219: + 1203: color: '#D381C996' id: HalfTileOverlayGreyscale270 coordinates: -39,7 - 1220: + 1204: color: '#D381C996' id: HalfTileOverlayGreyscale270 coordinates: -39,8 - 1221: + 1205: color: '#D381C996' id: FullTileOverlayGreyscale coordinates: -39,10 - 1222: + 1206: color: '#D381C996' id: ThreeQuarterTileOverlayGreyscale coordinates: -39,9 - 1223: + 1207: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -38,9 - 1224: + 1208: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -37,9 - 1225: + 1209: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -36,9 - 1226: + 1210: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -35,9 - 1227: + 1211: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -34,9 - 1228: + 1212: color: '#D381C996' id: HalfTileOverlayGreyscale coordinates: -33,9 - 1232: + 1216: color: '#D381C996' id: QuarterTileOverlayGreyscale coordinates: -39,1 - 1233: + 1217: color: '#FFFFFFFF' id: LoadingArea coordinates: -33,9 - 1234: + 1218: color: '#FFFFFFFF' id: DirtHeavy coordinates: -39,9 - 1235: + 1219: color: '#FFFFFFFF' id: DirtMedium coordinates: -39,8 - 1236: + 1220: color: '#FFFFFFFF' id: DirtMedium coordinates: -38,7 - 1237: + 1221: color: '#FFFFFFFF' id: DirtMedium coordinates: -39,10 - 1238: + 1222: color: '#FFFFFFFF' id: DirtMedium coordinates: -39,11 - 1239: + 1223: color: '#FFFFFFFF' id: DirtLight coordinates: -38,8 - 1240: + 1224: color: '#FFFFFFFF' id: DirtLight coordinates: -39,7 - 1241: + 1225: color: '#FFFFFFFF' id: DirtLight coordinates: -38,6 - 1242: + 1226: color: '#FFFFFFFF' id: DirtLight coordinates: -38,5 - 1243: + 1227: color: '#FFFFFFFF' id: DirtLight coordinates: -37,8 - 1244: + 1228: color: '#FFFFFFFF' id: DirtLight coordinates: -35,9 - 1245: + 1229: color: '#FFFFFFFF' id: DirtLight coordinates: -34,9 - 1246: + 1230: color: '#FFFFFFFF' id: DirtLight coordinates: -33,8 - 1247: + 1231: color: '#FFFFFFFF' id: DirtLight coordinates: -39,12 - 1416: + 1400: color: '#334E6DC8' id: CheckerNWSE coordinates: -63,17 - 1417: + 1401: color: '#334E6DC8' id: CheckerNWSE coordinates: -64,17 - 1423: + 1407: color: '#334E6DC8' id: CheckerNWSE coordinates: -62,17 - 1492: + 1476: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -37,4 - 1741: + 1724: color: '#D381C925' id: BrickTileWhiteLineW coordinates: -50,0 - 1752: + 1735: color: '#D381C925' id: BrickTileWhiteLineN coordinates: -45,0 - 1753: + 1736: color: '#D381C925' id: BrickTileWhiteLineN coordinates: -47,0 - 1754: + 1737: color: '#D381C925' id: BrickTileWhiteLineN coordinates: -46,0 - 1755: + 1738: color: '#D381C925' id: BrickTileWhiteInnerNe coordinates: -48,0 - 1756: + 1739: color: '#D381C925' id: BrickTileWhiteLineE coordinates: -48,1 - 1757: + 1740: color: '#D381C925' id: BrickTileWhiteInnerSe coordinates: -48,2 - 1758: + 1741: color: '#D381C925' id: BrickTileWhiteLineS coordinates: -47,2 - 1759: + 1742: color: '#D381C925' id: BrickTileWhiteLineS coordinates: -51,2 - 1760: + 1743: color: '#D381C925' id: BrickTileWhiteLineS coordinates: -55,2 - 1761: + 1744: color: '#D381C925' id: BrickTileWhiteCornerSw coordinates: -56,2 - 1762: + 1745: color: '#D381C925' id: BrickTileWhiteInnerSw coordinates: -50,2 - 1763: + 1746: color: '#D381C925' id: BrickTileWhiteLineW coordinates: -50,1 - 1764: + 1747: color: '#D381C925' id: BrickTileWhiteLineN coordinates: -47,4 - 1765: + 1748: color: '#D381C925' id: BrickTileWhiteLineN coordinates: -48,4 - 1766: + 1749: color: '#D381C925' id: BrickTileWhiteLineN coordinates: -49,4 - 1767: + 1750: color: '#D381C925' id: BrickTileWhiteInnerNe coordinates: -50,4 - 1768: + 1751: color: '#D381C925' id: BrickTileWhiteCornerNe coordinates: -50,5 - 1769: + 1752: color: '#D381C925' id: BrickTileWhiteLineN coordinates: -52,5 - 1770: + 1753: color: '#D381C925' id: BrickTileWhiteLineN coordinates: -53,5 - 1771: + 1754: color: '#D381C925' id: BrickTileWhiteLineN coordinates: -54,5 - 1772: + 1755: color: '#FFFFFFFF' id: WarnLineN coordinates: -52,2 - 1773: + 1756: color: '#FFFFFFFF' id: WarnLineN coordinates: -53,2 - 1774: + 1757: color: '#FFFFFFFF' id: WarnLineN coordinates: -54,2 - 1779: + 1762: color: '#D381C925' id: BrickTileWhiteLineS coordinates: -44,6 - 1780: + 1763: color: '#FFFFFFFF' id: WoodTrimThinLineN coordinates: -44,6 - 1781: + 1764: color: '#FFFFFFFF' id: WoodTrimThinLineE coordinates: -42,8 - 1782: + 1765: color: '#FFFFFFFF' id: WoodTrimThinLineW coordinates: -42,8 - 1801: + 1784: color: '#D381C996' id: BrickTileSteelLineS coordinates: -45,11 - 1802: + 1785: color: '#D381C996' id: BrickTileSteelLineS coordinates: -46,11 - 1803: + 1786: color: '#D381C996' id: BrickTileSteelLineS coordinates: -47,11 - 1804: + 1787: color: '#D381C996' id: BrickTileSteelLineS coordinates: -48,11 - 1805: + 1788: color: '#D381C996' id: BrickTileSteelLineS coordinates: -49,11 - 1806: + 1789: color: '#D381C996' id: BrickTileSteelLineS coordinates: -50,11 - 1807: + 1790: color: '#D381C996' id: BrickTileSteelLineS coordinates: -52,11 - 1808: + 1791: color: '#D381C996' id: BrickTileSteelLineN coordinates: -45,14 - 1809: + 1792: color: '#D381C996' id: BrickTileSteelLineN coordinates: -46,14 - 1810: + 1793: color: '#D381C996' id: BrickTileSteelLineN coordinates: -47,14 - 1811: + 1794: color: '#D381C996' id: BrickTileSteelLineN coordinates: -48,14 - 1812: + 1795: color: '#D381C996' id: BrickTileSteelLineN coordinates: -49,14 - 1813: + 1796: color: '#D381C996' id: CheckerNWSE coordinates: -50,16 - 1814: + 1797: color: '#D381C996' id: CheckerNWSE coordinates: -50,17 - 1815: + 1798: color: '#D381C996' id: CheckerNWSE coordinates: -51,17 - 1816: + 1799: color: '#D381C996' id: CheckerNWSE coordinates: -51,16 - 1817: + 1800: color: '#D381C996' id: CheckerNWSE coordinates: -52,16 - 1818: + 1801: color: '#D381C996' id: CheckerNWSE coordinates: -52,17 + 1905: + color: '#D381C996' + id: CheckerNWSE + coordinates: -54,14 + 1906: + color: '#D381C996' + id: CheckerNWSE + coordinates: -53,14 -2,-2: 252: angle: 3.141592653589793 rad @@ -7481,1373 +7489,1373 @@ entities: id: DirtHeavy coordinates: -68,-42 -1,1: - 958: + 943: color: '#FFFFFFFF' id: Delivery coordinates: -25,35 - 959: + 944: color: '#FFFFFFFF' id: Delivery coordinates: -25,36 - 960: + 945: color: '#FFFFFFFF' id: Delivery coordinates: -26,36 - 961: + 946: color: '#FFFFFFFF' id: Delivery coordinates: -26,35 - 962: + 947: color: '#FFFFFFFF' id: Bot coordinates: -27,35 - 963: + 948: color: '#FFFFFFFF' id: Bot coordinates: -28,35 - 964: + 949: color: '#FFFFFFFF' id: Bot coordinates: -29,35 - 965: + 950: color: '#FFFFFFFF' id: Bot coordinates: -29,36 - 966: + 951: color: '#FFFFFFFF' id: Bot coordinates: -28,36 - 967: + 952: color: '#FFFFFFFF' id: Bot coordinates: -27,36 - 987: + 972: color: '#EFB34196' id: HalfTileOverlayGreyscale90 coordinates: -21,32 - 988: + 973: color: '#EFB34196' id: FullTileOverlayGreyscale coordinates: -25,32 - 989: + 974: color: '#EFB34196' id: FullTileOverlayGreyscale coordinates: -26,32 - 990: + 975: color: '#EFB34196' id: FullTileOverlayGreyscale coordinates: -27,32 - 991: + 976: color: '#EFB34196' id: FullTileOverlayGreyscale coordinates: -28,32 - 992: + 977: color: '#EFB34196' id: FullTileOverlayGreyscale coordinates: -29,32 - 993: + 978: color: '#EFB34196' id: FullTileOverlayGreyscale coordinates: -30,32 - 994: + 979: color: '#EFB34196' id: FullTileOverlayGreyscale coordinates: -31,32 - 995: + 980: color: '#EFB34196' id: HalfTileOverlayGreyscale270 coordinates: -23,32 - 1013: + 998: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: -22,32 - 1019: + 1004: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -21,32 - 1020: + 1005: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -22,32 - 1021: + 1006: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -23,32 - 1022: + 1007: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -13,32 - 1023: + 1008: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -12,32 - 1024: + 1009: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -11,32 - 1111: + 1096: color: '#FFFFFFFF' id: Grasse3 coordinates: -9.011966,34.12809 - 1112: + 1097: color: '#FFFFFFFF' id: Bushb3 coordinates: -8.918216,35.06559 - 1113: + 1098: color: '#FFFFFFFF' id: Flowerspv3 coordinates: -8.949466,34.143715 - 1114: + 1099: color: '#FFFFFFFF' id: Grasse2 coordinates: -8.980716,36.081215 - 1115: + 1100: color: '#FFFFFFFF' id: Flowersy2 coordinates: -9.011966,36.081215 - 1116: + 1101: color: '#FFFFFFFF' id: Bushi3 coordinates: -9.121341,33.831215 - 1117: + 1102: color: '#FFFFFFFF' id: Bushi1 coordinates: -8.808841,36.12809 - 1118: + 1103: color: '#FFFFFFFF' id: Grassb2 coordinates: -8.918216,34.34684 - 1119: + 1104: color: '#FFFFFFFF' id: Bushi2 coordinates: -9.136966,33.87809 - 1120: + 1105: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -16,48 - 1121: + 1106: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -16,49 - 1122: + 1107: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: WarnCorner coordinates: -16,50 - 1123: + 1108: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -15,51 - 1124: + 1109: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLineCornerFlipped coordinates: -15,50 - 1125: + 1110: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -18,48 - 1126: + 1111: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -18,49 - 1127: + 1112: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarnCornerFlipped coordinates: -18,50 - 1128: + 1113: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -19,51 - 1129: + 1114: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLineCorner coordinates: -19,50 - 1130: + 1115: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -14,48 - 1131: + 1116: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -14,49 - 1132: + 1117: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -14,50 - 1133: + 1118: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -14,51 - 1134: + 1119: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -20,48 - 1135: + 1120: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -20,49 - 1136: + 1121: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -20,50 - 1137: + 1122: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -20,51 - 1138: + 1123: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -11,36 - 1139: + 1124: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -12,36 - 1140: + 1125: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -13,36 - 1141: + 1126: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -14,36 - 1142: + 1127: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -15,36 - 1143: + 1128: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -16,36 - 1144: + 1129: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -17,36 - 1145: + 1130: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -18,36 - 1146: + 1131: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -19,36 - 1147: + 1132: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -20,36 - 1148: + 1133: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -21,36 - 1149: + 1134: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -22,36 - 1150: + 1135: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: WarningLine coordinates: -23,36 - 1537: + 1520: color: '#FFFFFFFF' id: WarnLineW coordinates: -25,34 - 1538: + 1521: color: '#FFFFFFFF' id: WarnLineW coordinates: -26,34 - 1539: + 1522: color: '#FFFFFFFF' id: WarnLineW coordinates: -27,34 - 1540: + 1523: color: '#FFFFFFFF' id: WarnLineW coordinates: -28,34 - 1541: + 1524: color: '#FFFFFFFF' id: WarnLineW coordinates: -29,34 - 1542: + 1525: color: '#FFFFFFFF' id: WarnLineE coordinates: -30,36 - 1543: + 1526: color: '#FFFFFFFF' id: WarnCornerSmallNE coordinates: -30,34 - 1544: + 1527: color: '#FFFFFFFF' id: WarnLineS coordinates: -24,34 - 1545: + 1528: color: '#FFFFFFFF' id: WarnLineS coordinates: -24,35 - 1546: + 1529: color: '#FFFFFFFF' id: WarnLineS coordinates: -24,36 - 1547: + 1530: color: '#FFFFFFFF' id: Arrows coordinates: -30,36 - 1548: + 1531: color: '#FFFFFFFF' id: WarnLineE coordinates: -30,35 - 1558: + 1541: color: '#FFFFFFFF' id: WarnLineS coordinates: -30,34 - 1559: + 1542: color: '#FFFFFFFF' id: WarnLineS coordinates: -30,35 - 1560: + 1543: color: '#FFFFFFFF' id: WarnLineN coordinates: -31,36 - 1561: + 1544: color: '#FFFFFFFF' id: WarnCornerSmallSW coordinates: -30,36 - 1562: + 1545: color: '#FFFFFFFF' id: Bot coordinates: -31,34 - 1563: + 1546: color: '#FFFFFFFF' id: Bot coordinates: -31,35 0,1: - 1083: + 1068: color: '#EFB34196' id: HalfTileOverlayGreyscale coordinates: 8,32 - 1084: + 1069: color: '#EFB34196' id: HalfTileOverlayGreyscale coordinates: 7,32 - 1085: + 1070: color: '#EFB34196' id: HalfTileOverlayGreyscale coordinates: 6,32 - 1086: + 1071: color: '#EFB34196' id: HalfTileOverlayGreyscale coordinates: 5,32 - 1087: + 1072: color: '#EFB34196' id: HalfTileOverlayGreyscale coordinates: 4,32 1,0: - 1248: + 1232: color: '#A4610696' id: CheckerNWSE coordinates: 48,16 - 1249: + 1233: color: '#A4610696' id: CheckerNWSE coordinates: 47,16 - 1250: + 1234: color: '#A4610696' id: CheckerNWSE coordinates: 47,17 - 1251: + 1235: color: '#A4610696' id: CheckerNWSE coordinates: 47,18 - 1252: + 1236: color: '#A4610696' id: CheckerNWSE coordinates: 48,18 - 1253: + 1237: color: '#A4610696' id: CheckerNWSE coordinates: 48,17 - 1254: + 1238: color: '#A4610696' id: CheckerNWSE coordinates: 49,16 - 1255: + 1239: color: '#A4610696' id: CheckerNWSE coordinates: 49,17 - 1256: + 1240: color: '#A4610696' id: CheckerNWSE coordinates: 49,18 - 1257: + 1241: color: '#A4610696' id: CheckerNWSE coordinates: 50,18 - 1258: + 1242: color: '#A4610696' id: CheckerNWSE coordinates: 50,17 - 1259: + 1243: color: '#A4610696' id: CheckerNWSE coordinates: 51,18 - 1260: + 1244: color: '#A4610696' id: CheckerNWSE coordinates: 51,17 - 1261: + 1245: color: '#A4610696' id: FullTileOverlayGreyscale coordinates: 48,15 - 1262: + 1246: color: '#A4610696' id: HalfTileOverlayGreyscale180 coordinates: 45,12 - 1263: + 1247: color: '#A4610696' id: HalfTileOverlayGreyscale180 coordinates: 44,12 - 1264: + 1248: color: '#A4610696' id: HalfTileOverlayGreyscale180 coordinates: 43,12 - 1265: + 1249: color: '#A4610696' id: FullTileOverlayGreyscale coordinates: 44,11 - 1266: + 1250: color: '#A4610696' id: HalfTileOverlayGreyscale coordinates: 46,10 - 1267: + 1251: color: '#A4610696' id: HalfTileOverlayGreyscale coordinates: 45,10 - 1268: + 1252: color: '#A4610696' id: HalfTileOverlayGreyscale coordinates: 44,10 - 1269: + 1253: color: '#A4610696' id: HalfTileOverlayGreyscale coordinates: 43,10 - 1270: + 1254: color: '#A4610696' id: HalfTileOverlayGreyscale90 coordinates: 41,5 - 1271: + 1255: color: '#A4610696' id: HalfTileOverlayGreyscale90 coordinates: 41,6 - 1272: + 1256: color: '#A4610696' id: HalfTileOverlayGreyscale90 coordinates: 41,7 - 1273: + 1257: color: '#A4610696' id: HalfTileOverlayGreyscale90 coordinates: 41,8 - 1274: + 1258: color: '#A4610696' id: HalfTileOverlayGreyscale90 coordinates: 41,9 - 1275: + 1259: color: '#A4610696' id: HalfTileOverlayGreyscale90 coordinates: 41,10 - 1276: + 1260: color: '#A4610696' id: FullTileOverlayGreyscale coordinates: 42,6 - 1277: + 1261: color: '#A4610696' id: FullTileOverlayGreyscale coordinates: 42,5 - 1278: + 1262: color: '#A4610696' id: ThreeQuarterTileOverlayGreyscale270 coordinates: 43,5 - 1279: + 1263: color: '#A4610696' id: HalfTileOverlayGreyscale270 coordinates: 43,6 - 1280: + 1264: color: '#A4610696' id: HalfTileOverlayGreyscale270 coordinates: 43,7 - 1281: + 1265: color: '#A4610696' id: HalfTileOverlayGreyscale270 coordinates: 43,8 - 1282: + 1266: color: '#A4610696' id: HalfTileOverlayGreyscale270 coordinates: 43,9 - 1283: + 1267: color: '#A4610696' id: QuarterTileOverlayGreyscale270 coordinates: 43,10 - 1284: + 1268: color: '#A4610696' id: HalfTileOverlayGreyscale180 coordinates: 44,5 - 1285: + 1269: color: '#A4610696' id: HalfTileOverlayGreyscale180 coordinates: 45,5 - 1286: + 1270: color: '#A4610696' id: ThreeQuarterTileOverlayGreyscale180 coordinates: 46,5 - 1287: + 1271: color: '#A4610696' id: QuarterTileOverlayGreyscale180 coordinates: 46,10 - 1288: + 1272: color: '#A4610696' id: HalfTileOverlayGreyscale90 coordinates: 46,6 - 1289: + 1273: color: '#A4610696' id: HalfTileOverlayGreyscale90 coordinates: 46,7 - 1290: + 1274: color: '#A4610696' id: HalfTileOverlayGreyscale90 coordinates: 46,8 - 1291: + 1275: color: '#A4610696' id: HalfTileOverlayGreyscale90 coordinates: 46,9 - 1292: + 1276: color: '#A4610696' id: FullTileOverlayGreyscale coordinates: 44,4 - 1293: + 1277: color: '#A4610696' id: HalfTileOverlayGreyscale coordinates: 40,3 - 1294: + 1278: color: '#A4610696' id: HalfTileOverlayGreyscale coordinates: 41,3 - 1295: + 1279: color: '#A4610696' id: HalfTileOverlayGreyscale coordinates: 42,3 - 1296: + 1280: color: '#A4610696' id: HalfTileOverlayGreyscale coordinates: 43,3 - 1297: + 1281: color: '#A4610696' id: HalfTileOverlayGreyscale coordinates: 44,3 - 1298: + 1282: color: '#A4610696' id: HalfTileOverlayGreyscale coordinates: 45,3 - 1299: + 1283: color: '#A4610696' id: HalfTileOverlayGreyscale coordinates: 46,3 - 1300: + 1284: color: '#A4610696' id: QuarterTileOverlayGreyscale coordinates: 47,3 - 1301: + 1285: color: '#A4610696' id: FullTileOverlayGreyscale coordinates: 47,8 - 1302: + 1286: color: '#A4610696' id: FullTileOverlayGreyscale coordinates: 47,7 - 1303: + 1287: color: '#A4610696' id: HalfTileOverlayGreyscale270 coordinates: 48,6 - 1304: + 1288: color: '#A4610696' id: HalfTileOverlayGreyscale270 coordinates: 48,7 - 1305: + 1289: color: '#A4610696' id: HalfTileOverlayGreyscale270 coordinates: 48,8 - 1306: + 1290: color: '#A4610696' id: HalfTileOverlayGreyscale270 coordinates: 48,9 - 1307: + 1291: color: '#A4610696' id: HalfTileOverlayGreyscale270 coordinates: 48,10 - 1308: + 1292: color: '#A4610696' id: HalfTileOverlayGreyscale270 coordinates: 48,5 - 1309: + 1293: color: '#A4610696' id: QuarterTileOverlayGreyscale coordinates: 48,4 - 1310: + 1294: color: '#A4610696' id: HalfTileOverlayGreyscale180 coordinates: 47,12 - 1311: + 1295: color: '#A4610696' id: QuarterTileOverlayGreyscale270 coordinates: 48,12 - 1312: + 1296: color: '#A4610696' id: HalfTileOverlayGreyscale270 coordinates: 36,1 - 1313: + 1297: color: '#A4610696' id: HalfTileOverlayGreyscale270 coordinates: 36,2 - 1318: + 1302: color: '#A4610696' id: QuarterTileOverlayGreyscale180 coordinates: 41,0 - 1321: + 1305: color: '#A4610696' id: QuarterTileOverlayGreyscale270 coordinates: 45,0 - 1322: + 1306: color: '#A4610696' id: QuarterTileOverlayGreyscale270 coordinates: 45,1 - 1323: + 1307: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: LoadingArea coordinates: 54,11 - 1324: + 1308: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: Arrows coordinates: 49,3 - 1326: + 1310: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: 51,0 - 1327: + 1311: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: 51,1 - 1328: + 1312: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: 51,2 - 1329: + 1313: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: 51,3 - 1330: + 1314: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: 51,4 - 1333: + 1317: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: 56,11 - 1334: + 1318: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: 56,12 - 1335: + 1319: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: 56,13 - 1336: + 1320: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: 56,14 - 1337: + 1321: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: 56,15 - 1338: + 1322: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLineCorner coordinates: 56,10 - 1347: + 1331: color: '#A4610696' id: HalfTileOverlayGreyscale coordinates: 47,14 - 1348: + 1332: color: '#A4610696' id: HalfTileOverlayGreyscale coordinates: 48,14 - 1349: + 1333: color: '#A4610696' id: HalfTileOverlayGreyscale coordinates: 49,14 - 1350: + 1334: color: '#A4610696' id: QuarterTileOverlayGreyscale coordinates: 50,14 - 1351: + 1335: cleanable: True color: '#FFFFFFFF' id: DirtHeavy coordinates: 51,0 - 1352: + 1336: cleanable: True color: '#FFFFFFFF' id: DirtHeavy coordinates: 50,0 - 1354: + 1338: cleanable: True color: '#FFFFFFFF' id: DirtHeavy coordinates: 49,3 - 1355: + 1339: cleanable: True color: '#FFFFFFFF' id: DirtHeavy coordinates: 47,2 - 1356: + 1340: cleanable: True color: '#FFFFFFFF' id: DirtHeavy coordinates: 44,3 - 1357: + 1341: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: 50,2 - 1358: + 1342: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: 50,4 - 1359: + 1343: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: 49,0 - 1364: + 1348: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 51,1 - 1365: + 1349: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 50,1 - 1366: + 1350: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 51,2 - 1367: + 1351: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 51,4 - 1368: + 1352: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 48,3 - 1369: + 1353: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 48,2 - 1370: + 1354: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 46,2 - 1371: + 1355: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 46,1 - 1372: + 1356: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 47,0 - 1373: + 1357: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 44,2 - 1374: + 1358: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 43,3 - 1375: + 1359: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 45,3 - 1376: + 1360: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 44,4 - 1377: + 1361: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 41,0 - 1378: + 1362: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 40,0 - 1387: + 1371: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 41,0 - 1388: + 1372: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 41,2 - 1389: + 1373: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 42,2 - 1390: + 1374: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 49,4 - 1391: + 1375: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 49,6 - 1392: + 1376: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 43,5 - 1393: + 1377: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 43,6 - 1394: + 1378: cleanable: True color: '#FFFFFFFF' id: DirtMedium coordinates: 56,12 - 1395: + 1379: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 55,12 - 1396: + 1380: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 54,11 - 1397: + 1381: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 53,11 - 1398: + 1382: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 55,13 - 1399: + 1383: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 55,9 - 1400: + 1384: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 49,14 - 1401: + 1385: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 50,13 - 1402: + 1386: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 44,10 - 1403: + 1387: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 45,9 - 1404: + 1388: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 41,6 - 1405: + 1389: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 41,5 - 1406: + 1390: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 40,5 - 1407: + 1391: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 37,4 - 1408: + 1392: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 36,5 - 1409: + 1393: cleanable: True color: '#FFFFFFFF' id: DirtLight coordinates: 37,2 - 1427: + 1411: color: '#A4610696' id: QuarterTileOverlayGreyscale180 coordinates: 41,11 - 1428: + 1412: color: '#A4610696' id: QuarterTileOverlayGreyscale90 coordinates: 34,9 - 1429: + 1413: color: '#A4610696' id: QuarterTileOverlayGreyscale90 coordinates: 33,9 - 1430: + 1414: color: '#A4610696' id: QuarterTileOverlayGreyscale90 coordinates: 32,9 - 1440: + 1424: color: '#A4610696' id: QuarterTileOverlayGreyscale180 coordinates: 34,7 - 1441: + 1425: color: '#A4610696' id: QuarterTileOverlayGreyscale180 coordinates: 33,7 - 1442: + 1426: color: '#A4610696' id: QuarterTileOverlayGreyscale180 coordinates: 32,7 - 1447: + 1431: color: '#A4610696' id: QuarterTileOverlayGreyscale270 coordinates: 36,4 - 1448: + 1432: color: '#A4610696' id: QuarterTileOverlayGreyscale180 coordinates: 38,4 - 1449: + 1433: color: '#A4610696' id: QuarterTileOverlayGreyscale180 coordinates: 41,13 - 1450: + 1434: color: '#A4610696' id: QuarterTileOverlayGreyscale180 coordinates: 41,14 - 1451: + 1435: color: '#A4610696' id: QuarterTileOverlayGreyscale180 coordinates: 41,15 - 1452: + 1436: color: '#A4610696' id: QuarterTileOverlayGreyscale180 coordinates: 41,16 - 1515: + 1499: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: LoadingArea coordinates: 43,6 - 1516: + 1500: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: Arrows coordinates: 41,6 - 1534: + 1517: color: '#A4610696' id: CheckerNWSE coordinates: 50,16 - 1535: + 1518: color: '#A4610696' id: CheckerNWSE coordinates: 51,16 - 1658: + 1641: color: '#FFFFFFFF' id: WoodTrimThinLineN coordinates: 45,12 - 1659: + 1642: color: '#FFFFFFFF' id: WoodTrimThinLineN coordinates: 44,12 - 1660: + 1643: color: '#FFFFFFFF' id: WoodTrimThinLineN coordinates: 43,12 - 1661: + 1644: color: '#FFFFFFFF' id: Bot coordinates: 54,26 - 1662: + 1645: color: '#FFFFFFFF' id: Bot coordinates: 52,26 - 1663: + 1646: color: '#FFFFFFFF' id: Bot coordinates: 44,26 - 1664: + 1647: color: '#FFFFFFFF' id: Bot coordinates: 46,26 - 1665: + 1648: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: Arrows coordinates: 54,25 - 1666: + 1649: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: Arrows coordinates: 52,25 - 1667: + 1650: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: Arrows coordinates: 46,25 - 1668: + 1651: angle: -3.141592653589793 rad color: '#FFFFFFFF' id: Arrows coordinates: 44,25 - 1669: + 1652: color: '#79150096' id: QuarterTileOverlayGreyscale180 coordinates: 51,20 - 1670: + 1653: color: '#79150096' id: QuarterTileOverlayGreyscale180 coordinates: 53,20 - 1671: + 1654: color: '#79150096' id: QuarterTileOverlayGreyscale180 coordinates: 55,20 - 1672: + 1655: color: '#79150096' id: QuarterTileOverlayGreyscale270 coordinates: 47,20 - 1673: + 1656: color: '#79150096' id: QuarterTileOverlayGreyscale270 coordinates: 45,20 - 1674: + 1657: color: '#79150096' id: QuarterTileOverlayGreyscale270 coordinates: 43,20 - 1675: + 1658: color: '#0E7F1B8B' id: QuarterTileOverlayGreyscale270 coordinates: 46,20 - 1676: + 1659: color: '#0E7F1B8B' id: QuarterTileOverlayGreyscale270 coordinates: 44,20 - 1677: + 1660: color: '#0E7F1B8B' id: QuarterTileOverlayGreyscale270 coordinates: 42,20 - 1678: + 1661: color: '#0E7F1B8B' id: QuarterTileOverlayGreyscale180 coordinates: 52,20 - 1679: + 1662: color: '#0E7F1B8B' id: QuarterTileOverlayGreyscale180 coordinates: 54,20 - 1680: + 1663: color: '#0E7F1B8B' id: QuarterTileOverlayGreyscale180 coordinates: 56,20 - 1681: + 1664: color: '#FFFFFFFF' id: grasssnow coordinates: 48,23 - 1682: + 1665: color: '#FFFFFFFF' id: grasssnow coordinates: 49,23 - 1683: + 1666: color: '#FFFFFFFF' id: grasssnow coordinates: 50,23 - 1684: + 1667: color: '#FFFFFFFF' id: grasssnow11 coordinates: 50,23 - 1685: + 1668: color: '#FFFFFFFF' id: grasssnow13 coordinates: 48,23 - 1686: + 1669: color: '#FFFFFFFF' id: grasssnowb1 coordinates: 49,23 - 1687: + 1670: color: '#FFFFFFFF' id: bushsnowa2 coordinates: 48,23 - 1688: + 1671: color: '#FFFFFFFF' id: bushsnowb2 coordinates: 50,23 - 1689: + 1672: color: '#FFFFFFFF' id: grasssnow01 coordinates: 48,29 - 1690: + 1673: color: '#FFFFFFFF' id: grasssnow06 coordinates: 49,29 - 1691: + 1674: color: '#FFFFFFFF' id: grasssnow13 coordinates: 50,29 - 1692: + 1675: color: '#FFFFFFFF' id: bushsnowb2 coordinates: 49.737263,28.879223 - 1693: + 1676: color: '#FFFFFFFF' id: bushsnowb2 coordinates: 48.190388,28.926098 - 1694: + 1677: color: '#0E7F1B8B' id: QuarterTileOverlayGreyscale90 coordinates: 53,26 - 1695: + 1678: color: '#0E7F1B8B' id: QuarterTileOverlayGreyscale90 coordinates: 55,26 - 1696: + 1679: color: '#0E7F1B8B' id: QuarterTileOverlayGreyscale90 coordinates: 51,26 - 1697: + 1680: color: '#0E7F1B8B' id: QuarterTileOverlayGreyscale coordinates: 47,26 - 1698: + 1681: color: '#0E7F1B8B' id: QuarterTileOverlayGreyscale coordinates: 45,26 - 1699: + 1682: color: '#0E7F1B8B' id: QuarterTileOverlayGreyscale coordinates: 43,26 - 1700: + 1683: color: '#79150096' id: QuarterTileOverlayGreyscale coordinates: 48,27 - 1701: + 1684: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 50,27 - 1702: + 1685: color: '#79150096' id: QuarterTileOverlayGreyscale90 coordinates: 56,26 -3,0: - 1411: + 1395: color: '#334E6DC8' id: QuarterTileOverlayGreyscale270 coordinates: -74,16 - 1412: + 1396: color: '#334E6DC8' id: QuarterTileOverlayGreyscale270 coordinates: -73,16 - 1413: + 1397: color: '#334E6DC8' id: QuarterTileOverlayGreyscale270 coordinates: -72,16 - 1414: + 1398: color: '#334E6DC8' id: QuarterTileOverlayGreyscale coordinates: -74,18 - 1415: + 1399: color: '#334E6DC8' id: QuarterTileOverlayGreyscale coordinates: -73,18 - 1418: + 1402: color: '#334E6DC8' id: CheckerNWSE coordinates: -65,17 - 1419: + 1403: color: '#334E6DC8' id: CheckerNWSE coordinates: -66,17 - 1420: + 1404: color: '#334E6DC8' id: CheckerNWSE coordinates: -67,17 - 1421: + 1405: color: '#334E6DC8' id: CheckerNWSE coordinates: -68,17 - 1422: + 1406: color: '#334E6DC8' id: CheckerNWSE coordinates: -69,17 - 1424: + 1408: color: '#334E6DC8' id: CheckerNWSE coordinates: -70,17 - 1425: + 1409: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLine coordinates: -72,20 - 1426: + 1410: angle: -1.5707963267948966 rad color: '#FFFFFFFF' id: WarningLineCornerFlipped coordinates: -72,19 -4,0: - 1564: + 1547: color: '#FFFFFFFF' id: Bot coordinates: -105,17 - 1565: + 1548: color: '#FFFFFFFF' id: Bot coordinates: -119,17 - 1566: + 1549: color: '#FFFFFFFF' id: Bot coordinates: -98,17 - 1567: + 1550: color: '#FFFFFFFF' id: WarnLineW coordinates: -117,15 - 1568: + 1551: color: '#FFFFFFFF' id: WarnLineW coordinates: -118,15 - 1569: + 1552: color: '#FFFFFFFF' id: WarnLineW coordinates: -119,15 - 1570: + 1553: color: '#FFFFFFFF' id: WarnLineW coordinates: -120,15 - 1571: + 1554: color: '#FFFFFFFF' id: WarnLineW coordinates: -121,15 - 1572: + 1555: color: '#FFFFFFFF' id: WarnLineN coordinates: -117,18 - 1573: + 1556: color: '#FFFFFFFF' id: WarnLineN coordinates: -118,18 - 1574: + 1557: color: '#FFFFFFFF' id: WarnLineN coordinates: -119,18 - 1575: + 1558: color: '#FFFFFFFF' id: WarnLineN coordinates: -120,18 - 1576: + 1559: color: '#FFFFFFFF' id: WarnLineN coordinates: -121,18 - 1577: + 1560: color: '#FFFFFFFF' id: WarnLineE coordinates: -100,20 - 1578: + 1561: color: '#FFFFFFFF' id: WarnLineE coordinates: -100,21 -2,1: - 1579: + 1562: color: '#FFFFFFFF' id: WarnLineW coordinates: -62,40 - 1580: + 1563: color: '#FFFFFFFF' id: WarnLineW coordinates: -63,40 - 1581: + 1564: color: '#FFFFFFFF' id: WarnLineW coordinates: -64,40 - 1582: + 1565: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: Arrows @@ -11357,9 +11365,9 @@ entities: -20,-8: 1 -20,-7: 0 -20,-6: 0 - -20,-5: 1 + -20,-5: 4 -20,-4: 0 - -20,-3: 1 + -20,-3: 4 -20,-2: 0 -20,-1: 1 -19,-16: 0 @@ -11373,7 +11381,7 @@ entities: -19,-8: 0 -19,-7: 0 -19,-6: 0 - -19,-5: 1 + -19,-5: 4 -19,-4: 0 -19,-3: 0 -19,-2: 0 @@ -11634,7 +11642,7 @@ entities: 24,-41: 0 24,-40: 0 24,-39: 0 - 24,-38: 1 + 24,-38: 5 24,-37: 0 24,-36: 0 24,-35: 0 @@ -12990,7 +12998,7 @@ entities: 53,-23: 0 53,-22: 0 53,-21: 1 - 53,-20: 1 + 53,-20: 4 53,-19: 0 53,-18: 0 53,-17: 0 @@ -14076,8 +14084,8 @@ entities: -54,-10: 0 -54,-9: 0 -54,-8: 0 - -54,-7: 4 - -54,-6: 4 + -54,-7: 6 + -54,-6: 6 -54,-5: 0 -54,-3: 0 -54,-2: 0 @@ -16533,8 +16541,8 @@ entities: -32,42: 0 -32,43: 0 -32,44: 0 - -32,45: 4 - -32,46: 4 + -32,45: 6 + -32,46: 6 -32,47: 0 -31,34: 0 -31,35: 0 @@ -16547,8 +16555,8 @@ entities: -31,42: 0 -31,43: 0 -31,44: 0 - -31,45: 4 - -31,46: 4 + -31,45: 6 + -31,46: 6 -31,47: 0 -30,42: 0 -29,35: 0 @@ -16668,11 +16676,11 @@ entities: 18,19: 0 18,20: 0 -47,42: 0 - -46,42: 4 + -46,42: 6 -45,41: 0 - -45,42: 4 + -45,42: 6 -45,43: 0 - -44,42: 4 + -44,42: 6 -43,42: 0 -42,40: 0 -42,41: 0 @@ -16736,8 +16744,8 @@ entities: -33,42: 0 -33,43: 0 -33,44: 0 - -33,45: 4 - -33,46: 4 + -33,45: 6 + -33,46: 6 -33,47: 0 -32,48: 0 -32,49: 0 @@ -18256,9 +18264,9 @@ entities: -27,56: 0 -27,57: 0 -27,58: 0 - -27,59: 4 - -27,60: 4 - -27,61: 4 + -27,59: 6 + -27,60: 6 + -27,61: 6 -26,50: 0 -26,51: 0 -26,52: 0 @@ -18268,9 +18276,9 @@ entities: -26,56: 0 -26,57: 0 -26,58: 0 - -26,59: 4 - -26,60: 4 - -26,61: 4 + -26,59: 6 + -26,60: 6 + -26,61: 6 -25,50: 0 -25,51: 0 -25,52: 0 @@ -18280,9 +18288,9 @@ entities: -25,56: 0 -25,57: 0 -25,58: 0 - -25,59: 4 - -25,60: 4 - -25,61: 4 + -25,59: 6 + -25,60: 6 + -25,61: 6 -24,50: 0 -24,51: 0 -24,52: 0 @@ -19606,11 +19614,11 @@ entities: -67,-43: 0 -67,-42: 0 -66,-44: 0 - -66,-43: 6 + -66,-43: 7 -66,-42: 0 -66,-41: 0 -65,-44: 0 - -65,-43: 6 + -65,-43: 7 -65,-42: 0 -65,-41: 0 -35,74: 0 @@ -19814,7 +19822,7 @@ entities: 68,-31: 0 68,-30: 0 68,-29: 0 - 68,-28: 7 + 68,-28: 8 68,-27: 0 68,-26: 0 68,-25: 0 @@ -21435,8 +21443,8 @@ entities: -56,-3: 0 -56,-1: 0 -55,-9: 0 - -55,-7: 4 - -55,-6: 4 + -55,-7: 6 + -55,-6: 6 -55,-5: 0 -55,-4: 0 -55,-3: 0 @@ -21534,8 +21542,8 @@ entities: -53,-11: 0 -53,-10: 0 -53,-9: 0 - -53,-7: 4 - -53,-6: 4 + -53,-7: 6 + -53,-6: 6 -53,-4: 0 -53,-3: 0 -53,-2: 0 @@ -21544,8 +21552,8 @@ entities: -52,-10: 0 -52,-9: 0 -52,-8: 0 - -52,-7: 4 - -52,-6: 4 + -52,-7: 6 + -52,-6: 6 -52,-4: 0 -52,-3: 0 -52,-2: 0 @@ -22285,42 +22293,42 @@ entities: -48,45: 0 -47,40: 0 -47,45: 0 - -46,32: 8 + -46,32: 9 -46,33: 0 - -46,34: 6 + -46,34: 7 -46,35: 0 - -46,36: 4 + -46,36: 6 -46,37: 0 - -46,38: 4 + -46,38: 6 -46,39: 0 - -46,40: 7 + -46,40: 8 -46,41: 0 -46,43: 0 - -46,44: 4 + -46,44: 6 -46,45: 0 - -45,32: 8 + -45,32: 9 -45,33: 0 - -45,34: 6 + -45,34: 7 -45,35: 0 - -45,36: 4 + -45,36: 6 -45,37: 0 - -45,38: 4 + -45,38: 6 -45,39: 0 - -45,40: 7 - -45,44: 4 + -45,40: 8 + -45,44: 6 -45,45: 0 - -44,32: 8 + -44,32: 9 -44,33: 0 - -44,34: 6 + -44,34: 7 -44,35: 0 - -44,36: 4 + -44,36: 6 -44,37: 0 - -44,38: 4 + -44,38: 6 -44,39: 0 - -44,40: 7 + -44,40: 8 -44,41: 0 -44,43: 0 - -44,44: 4 + -44,44: 6 -44,45: 0 -43,32: 0 -43,33: 0 @@ -25804,10 +25812,10 @@ entities: -65,45: 0 -65,46: 0 -65,47: 0 - -7,1: 4 - -7,3: 4 - -7,4: 4 - -58,-34: 4 + -7,1: 6 + -7,3: 6 + -7,4: 6 + -58,-34: 6 uniqueMixes: - volume: 2500 temperature: 293.15 @@ -25827,8 +25835,8 @@ entities: - volume: 2500 temperature: 293.15 moles: - - 21.213781 - - 79.80423 + - 20.619795 + - 77.56971 - 0 - 0 - 0 @@ -25857,6 +25865,21 @@ entities: - volume: 2500 temperature: 235 moles: + - 20.619795 + - 77.56971 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - volume: 2500 + temperature: 293.15 + moles: - 21.213781 - 79.80423 - 0 @@ -25872,8 +25895,8 @@ entities: - volume: 2500 temperature: 293.15 moles: - - 0 - - 0 + - 20.04244 + - 75.39776 - 0 - 0 - 0 @@ -25887,8 +25910,8 @@ entities: - volume: 2500 temperature: 293.15 moles: - - 20.619795 - - 77.56971 + - 0 + - 0 - 0 - 0 - 0 @@ -25947,7 +25970,7 @@ entities: type: GridAtmosphere - type: OccluderTree - type: Shuttle - - nextUpdate: 2454.7230939 + - nextUpdate: 2652.7153491 type: GridPathfinding - type: RadiationGridResistance - nextShake: 0 @@ -35977,6 +36000,7 @@ entities: type: Transform - canCollide: False type: Physics + - type: InsideEntityStorage - uid: 1450 type: JetpackMini components: @@ -38393,10 +38417,9 @@ entities: parent: 60 type: Transform - uid: 1795 - type: SinkWide + type: DisposalPipe components: - - rot: -1.5707963267948966 rad - pos: 26.5,-35.5 + - pos: 29.5,-35.5 parent: 60 type: Transform - uid: 1796 @@ -40391,7 +40414,7 @@ entities: parent: 60 type: Transform - uid: 2057 - type: WallReinforced + type: ReinforcedWindow components: - pos: -30.5,-27.5 parent: 60 @@ -41542,8 +41565,8 @@ entities: - uid: 2216 type: DisposalTrunk components: - - rot: 1.5707963267948966 rad - pos: 28.5,-35.5 + - rot: -1.5707963267948966 rad + pos: 33.5,-37.5 parent: 60 type: Transform - uid: 2217 @@ -42161,15 +42184,16 @@ entities: parent: 60 type: Transform - uid: 2306 - type: WallSolid + type: DisposalBend components: - - pos: 27.5,-35.5 + - rot: 3.141592653589793 rad + pos: 29.5,-37.5 parent: 60 type: Transform - uid: 2307 - type: WallSolid + type: DisposalPipe components: - - pos: 27.5,-37.5 + - pos: 29.5,-36.5 parent: 60 type: Transform - uid: 2308 @@ -42745,8 +42769,8 @@ entities: - uid: 2386 type: Poweredlight components: - - rot: -1.5707963267948966 rad - pos: 26.5,-34.5 + - rot: 3.141592653589793 rad + pos: -33.5,-20.5 parent: 60 type: Transform - powerLoad: 0 @@ -42785,11 +42809,10 @@ entities: - powerLoad: 0 type: ApcPowerReceiver - uid: 2391 - type: AirlockMaintHydroLocked + type: DisposalPipe components: - - name: Botany Maint - type: MetaData - - pos: 28.5,-38.5 + - rot: 1.5707963267948966 rad + pos: 30.5,-37.5 parent: 60 type: Transform - uid: 2392 @@ -42805,9 +42828,10 @@ entities: parent: 60 type: Transform - uid: 2394 - type: WallSolid + type: WindowTintedDirectional components: - - pos: 31.5,-38.5 + - rot: 1.5707963267948966 rad + pos: 38.5,-39.5 parent: 60 type: Transform - uid: 2395 @@ -43111,9 +43135,10 @@ entities: parent: 60 type: Transform - uid: 2440 - type: DisposalUnit + type: DisposalPipe components: - - pos: 28.5,-35.5 + - rot: 1.5707963267948966 rad + pos: 31.5,-37.5 parent: 60 type: Transform - uid: 2441 @@ -43984,10 +44009,10 @@ entities: parent: 60 type: Transform - uid: 2553 - type: DisposalBend + type: DisposalPipe components: - - rot: -1.5707963267948966 rad - pos: 29.5,-35.5 + - rot: 1.5707963267948966 rad + pos: 32.5,-37.5 parent: 60 type: Transform - uid: 2554 @@ -44179,9 +44204,9 @@ entities: - color: '#0335FCFF' type: AtmosPipeColor - uid: 2582 - type: AirlockFreezerKitchenHydroLocked + type: WallSolid components: - - pos: 27.5,-36.5 + - pos: 28.5,-38.5 parent: 60 type: Transform - uid: 2583 @@ -44391,9 +44416,8 @@ entities: type: VendingMachineDinnerware components: - flags: SessionSpecific - name: Dinnerware type: MetaData - - pos: 25.5,-37.5 + - pos: 27.5,-36.5 parent: 60 type: Transform - uid: 2616 @@ -45298,35 +45322,36 @@ entities: parent: 60 type: Transform - uid: 2753 - type: WindowDirectional + type: AirCanister components: - - rot: 1.5707963267948966 rad - pos: 29.5,-39.5 + - pos: 38.5,-39.5 parent: 60 type: Transform - uid: 2754 - type: WindowDirectional + type: AirlockMaintHydroLocked components: - - rot: -1.5707963267948966 rad - pos: 33.5,-39.5 + - name: Botany Maint + type: MetaData + - pos: 31.5,-38.5 parent: 60 type: Transform - uid: 2755 - type: OxygenCanister + type: NitrogenCanister components: - - pos: 30.5,-39.5 + - pos: 37.5,-39.5 parent: 60 type: Transform - uid: 2756 - type: NitrogenCanister + type: WindowTintedDirectional components: - - pos: 31.5,-39.5 + - rot: -1.5707963267948966 rad + pos: 36.5,-39.5 parent: 60 type: Transform - uid: 2757 - type: AirCanister + type: OxygenCanister components: - - pos: 32.5,-39.5 + - pos: 36.5,-39.5 parent: 60 type: Transform - uid: 2758 @@ -51436,9 +51461,9 @@ entities: parent: 60 type: Transform - uid: 3646 - type: RandomPosterLegit + type: Grille components: - - pos: -30.5,-27.5 + - pos: -40.5,-26.5 parent: 60 type: Transform - uid: 3647 @@ -51690,7 +51715,7 @@ entities: - uid: 3686 type: AirlockHeadOfPersonnelLocked components: - - name: eva + - name: EVA Storage type: MetaData - pos: 2.5,-37.5 parent: 60 @@ -54203,9 +54228,9 @@ entities: parent: 60 type: Transform - uid: 4037 - type: Grille + type: IntercomMedical components: - - pos: -36.5,-29.5 + - pos: 35.5,-21.5 parent: 60 type: Transform - uid: 4038 @@ -54431,9 +54456,10 @@ entities: parent: 60 type: Transform - uid: 4072 - type: ReinforcedWindow + type: IntercomMedical components: - - pos: -36.5,-29.5 + - rot: 1.5707963267948966 rad + pos: 42.5,-33.5 parent: 60 type: Transform - uid: 4073 @@ -54528,7 +54554,7 @@ entities: parent: 60 type: Transform - uid: 4086 - type: WallReinforced + type: ReinforcedWindow components: - pos: -40.5,-26.5 parent: 60 @@ -55701,8 +55727,10 @@ entities: parent: 60 type: Transform - uid: 4253 - type: WallSolid + type: AirlockBrigLocked components: + - name: Lawyer Room Maint + type: MetaData - pos: -50.5,-19.5 parent: 60 type: Transform @@ -57478,13 +57506,11 @@ entities: parent: 60 type: Transform - uid: 4522 - type: PoweredSmallLight + type: CrateNPCCow components: - - pos: 33.5,-39.5 + - pos: 24.5,-37.5 parent: 60 type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - uid: 4523 type: WallReinforced components: @@ -58079,29 +58105,134 @@ entities: parent: 60 type: Transform - uid: 4609 - type: AirlockGlass - components: - - pos: -17.5,-58.5 - parent: 60 - type: Transform -- uid: 4610 - type: AirlockGlass - components: - - pos: -17.5,-59.5 - parent: 60 - type: Transform -- uid: 4611 - type: AirlockGlass + type: AirlockGlassShuttle components: - pos: -8.5,-58.5 parent: 60 type: Transform -- uid: 4612 - type: AirlockGlass + - fixtures: + - density: 100 + shape: !type:PolygonShape + vertices: + - 0.49,-0.49 + - 0.49,0.49 + - -0.49,0.49 + - -0.49,-0.49 + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - Opaque + - shape: !type:PhysShapeCircle + position: 0,-0.5 + radius: 0.2 + hard: False + id: docking + type: Fixtures +- uid: 4610 + type: AirlockGlassShuttle components: - - pos: -8.5,-59.5 + - pos: -17.5,-58.5 parent: 60 type: Transform + - fixtures: + - density: 100 + shape: !type:PolygonShape + vertices: + - 0.49,-0.49 + - 0.49,0.49 + - -0.49,0.49 + - -0.49,-0.49 + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - Opaque + - shape: !type:PhysShapeCircle + position: 0,-0.5 + radius: 0.2 + hard: False + id: docking + type: Fixtures +- uid: 4611 + type: AirlockGlassShuttle + components: + - pos: -8.5,-65.5 + parent: 60 + type: Transform + - fixtures: + - density: 100 + shape: !type:PolygonShape + vertices: + - 0.49,-0.49 + - 0.49,0.49 + - -0.49,0.49 + - -0.49,-0.49 + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - Opaque + - shape: !type:PhysShapeCircle + position: 0,-0.5 + radius: 0.2 + hard: False + id: docking + type: Fixtures +- uid: 4612 + type: AirlockGlassShuttle + components: + - rot: 3.141592653589793 rad + pos: -8.5,-66.5 + parent: 60 + type: Transform + - fixtures: + - density: 100 + shape: !type:PolygonShape + vertices: + - 0.49,-0.49 + - 0.49,0.49 + - -0.49,0.49 + - -0.49,-0.49 + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - Opaque + - shape: !type:PhysShapeCircle + position: 0,-0.5 + radius: 0.2 + hard: False + id: docking + type: Fixtures - uid: 4613 type: WallReinforced components: @@ -58223,29 +58354,136 @@ entities: parent: 60 type: Transform - uid: 4633 - type: AirlockGlass - components: - - pos: -8.5,-65.5 - parent: 60 - type: Transform -- uid: 4634 - type: AirlockGlass - components: - - pos: -8.5,-66.5 - parent: 60 - type: Transform -- uid: 4635 - type: AirlockGlass + type: AirlockGlassShuttle components: - pos: -17.5,-65.5 parent: 60 type: Transform -- uid: 4636 - type: AirlockGlass + - fixtures: + - density: 100 + shape: !type:PolygonShape + vertices: + - 0.49,-0.49 + - 0.49,0.49 + - -0.49,0.49 + - -0.49,-0.49 + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - Opaque + - shape: !type:PhysShapeCircle + position: 0,-0.5 + radius: 0.2 + hard: False + id: docking + type: Fixtures +- uid: 4634 + type: AirlockGlassShuttle components: - - pos: -17.5,-66.5 + - rot: 3.141592653589793 rad + pos: -17.5,-66.5 parent: 60 type: Transform + - fixtures: + - density: 100 + shape: !type:PolygonShape + vertices: + - 0.49,-0.49 + - 0.49,0.49 + - -0.49,0.49 + - -0.49,-0.49 + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - Opaque + - shape: !type:PhysShapeCircle + position: 0,-0.5 + radius: 0.2 + hard: False + id: docking + type: Fixtures +- uid: 4635 + type: AirlockGlassShuttle + components: + - rot: 3.141592653589793 rad + pos: -17.5,-59.5 + parent: 60 + type: Transform + - fixtures: + - density: 100 + shape: !type:PolygonShape + vertices: + - 0.49,-0.49 + - 0.49,0.49 + - -0.49,0.49 + - -0.49,-0.49 + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - Opaque + - shape: !type:PhysShapeCircle + position: 0,-0.5 + radius: 0.2 + hard: False + id: docking + type: Fixtures +- uid: 4636 + type: AirlockGlassShuttle + components: + - rot: 3.141592653589793 rad + pos: -8.5,-59.5 + parent: 60 + type: Transform + - fixtures: + - density: 100 + shape: !type:PolygonShape + vertices: + - 0.49,-0.49 + - 0.49,0.49 + - -0.49,0.49 + - -0.49,-0.49 + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - Opaque + - shape: !type:PhysShapeCircle + position: 0,-0.5 + radius: 0.2 + hard: False + id: docking + type: Fixtures - uid: 4637 type: WallReinforced components: @@ -61425,27 +61663,29 @@ entities: parent: 60 type: Transform - uid: 5085 - type: AirlockGlass + type: IntercomService components: - - pos: -8.5,-56.5 + - rot: 3.141592653589793 rad + pos: 30.5,-34.5 parent: 60 type: Transform - uid: 5086 - type: AirlockGlass + type: IntercomService components: - - pos: -17.5,-56.5 + - rot: -1.5707963267948966 rad + pos: 28.5,-35.5 parent: 60 type: Transform - uid: 5087 - type: AirlockGlass + type: AirlockExternalGlass components: - - pos: -17.5,-68.5 + - pos: -8.5,-68.5 parent: 60 type: Transform - uid: 5088 - type: AirlockGlass + type: AirlockExternalGlass components: - - pos: -8.5,-68.5 + - pos: -17.5,-56.5 parent: 60 type: Transform - uid: 5089 @@ -62849,7 +63089,7 @@ entities: parent: 60 type: Transform - uid: 5294 - type: ReinforcedWindow + type: WallReinforced components: - pos: -36.5,-28.5 parent: 60 @@ -62965,15 +63205,16 @@ entities: parent: 60 type: Transform - uid: 5312 - type: WallReinforced + type: AirlockExternalGlass components: - - pos: -30.5,-39.5 + - pos: -31.5,-38.5 parent: 60 type: Transform - uid: 5313 - type: WallReinforced + type: IntercomAll components: - - pos: -32.5,-39.5 + - rot: -1.5707963267948966 rad + pos: -1.5,-7.5 parent: 60 type: Transform - uid: 5314 @@ -62983,9 +63224,9 @@ entities: parent: 60 type: Transform - uid: 5315 - type: AirlockExternalLocked + type: IntercomEngineering components: - - pos: -31.5,-39.5 + - pos: -28.5,33.5 parent: 60 type: Transform - uid: 5316 @@ -69167,15 +69408,15 @@ entities: parent: 60 type: Transform - uid: 6151 - type: WallReinforced + type: ReinforcedWindow components: - - pos: -1.5,-78.5 + - pos: 2.5,-78.5 parent: 60 type: Transform - uid: 6152 - type: WallReinforced + type: ReinforcedWindow components: - - pos: 2.5,-78.5 + - pos: -1.5,-78.5 parent: 60 type: Transform - uid: 6153 @@ -69185,44 +69426,19 @@ entities: parent: 60 type: Transform - uid: 6154 - type: AirlockExternalGlassShuttleLocked + type: Grille components: - - pos: 0.5,-81.5 + - pos: -1.5,-78.5 parent: 60 type: Transform - - fixtures: - - shape: !type:PolygonShape - vertices: - - 0.49,-0.49 - - 0.49,0.49 - - -0.49,0.49 - - -0.49,-0.49 - mask: - - Impassable - - MidImpassable - - HighImpassable - - LowImpassable - - InteractImpassable - layer: - - MidImpassable - - HighImpassable - - BulletImpassable - - InteractImpassable - - Opaque - - shape: !type:PhysShapeCircle - position: 0,-0.5 - radius: 0.2 - hard: False - id: docking - type: Fixtures - uid: 6155 - type: WallReinforced + type: Grille components: - - pos: -0.5,-81.5 + - pos: 2.5,-78.5 parent: 60 type: Transform - uid: 6156 - type: WallReinforced + type: ReinforcedWindow components: - pos: 1.5,-81.5 parent: 60 @@ -69390,9 +69606,9 @@ entities: parent: 60 type: Transform - uid: 6183 - type: AirlockExternalGlassLocked + type: ReinforcedWindow components: - - pos: 0.5,-80.5 + - pos: -0.5,-81.5 parent: 60 type: Transform - uid: 6184 @@ -70132,9 +70348,10 @@ entities: - color: '#0335FCFF' type: AtmosPipeColor - uid: 6286 - type: Catwalk + type: IntercomEngineering components: - - pos: -57.5,-31.5 + - rot: 1.5707963267948966 rad + pos: -5.5,18.5 parent: 60 type: Transform - uid: 6287 @@ -74367,7 +74584,7 @@ entities: parent: 60 type: Transform - uid: 6926 - type: ReinforcedWindow + type: WallReinforced components: - pos: 46.5,14.5 parent: 60 @@ -76293,15 +76510,13 @@ entities: - color: '#0335FCFF' type: AtmosPipeColor - uid: 7216 - type: CrateNPCCow + type: VendingMachineChefvend components: - - pos: 24.5,-37.5 + - flags: SessionSpecific + type: MetaData + - pos: 27.5,-37.5 parent: 60 type: Transform - - containers: - - EntityStorageComponent - - entity_storage - type: Construction - uid: 7217 type: BoxLightMixed components: @@ -78635,9 +78850,10 @@ entities: - color: '#FF1212FF' type: AtmosPipeColor - uid: 7565 - type: Catwalk + type: IntercomScience components: - - pos: -57.5,-29.5 + - rot: 1.5707963267948966 rad + pos: -50.5,-3.5 parent: 60 type: Transform - uid: 7566 @@ -81501,10 +81717,10 @@ entities: - containers: entity_storage: !type:Container ents: - - 1449 - - 9064 - - 8980 - 8378 + - 8980 + - 9064 + - 1449 type: ContainerContainer - uid: 7983 type: Bookshelf @@ -82984,9 +83200,9 @@ entities: parent: 60 type: Transform - uid: 8199 - type: Grille + type: WallReinforced components: - - pos: -36.5,-28.5 + - pos: -36.5,-29.5 parent: 60 type: Transform - uid: 8200 @@ -84177,6 +84393,7 @@ entities: type: Transform - canCollide: False type: Physics + - type: InsideEntityStorage - uid: 8379 type: DisposalPipe components: @@ -85347,15 +85564,17 @@ entities: parent: 60 type: Transform - uid: 8564 - type: Catwalk + type: Intercom components: - - pos: -57.5,-28.5 + - rot: 1.5707963267948966 rad + pos: -29.5,16.5 parent: 60 type: Transform - uid: 8565 - type: Catwalk + type: IntercomSecurity components: - - pos: -57.5,-30.5 + - rot: -1.5707963267948966 rad + pos: -7.5,-15.5 parent: 60 type: Transform - uid: 8566 @@ -87976,9 +88195,9 @@ entities: parent: 60 type: Transform - uid: 8978 - type: RubberStampCentcom + type: AirlockExternalGlass components: - - pos: 7.49703,-69.46169 + - pos: -17.5,-68.5 parent: 60 type: Transform - uid: 8979 @@ -87996,6 +88215,7 @@ entities: type: Transform - canCollide: False type: Physics + - type: InsideEntityStorage - uid: 8981 type: WallReinforced components: @@ -88147,7 +88367,7 @@ entities: - uid: 9005 type: ClothingShoesChef components: - - pos: 26.515617,-37.848625 + - pos: 25.52703,-37.72007 parent: 60 type: Transform - uid: 9006 @@ -88563,28 +88783,31 @@ entities: type: Transform - canCollide: False type: Physics + - type: InsideEntityStorage - uid: 9065 - type: FirelockGlass + type: AirlockExternalGlass components: - - pos: -17.5,-67.5 + - pos: -8.5,-56.5 parent: 60 type: Transform - uid: 9066 - type: FirelockGlass + type: IntercomMedical components: - - pos: -8.5,-67.5 + - rot: -1.5707963267948966 rad + pos: 46.5,-11.5 parent: 60 type: Transform - uid: 9067 - type: FirelockGlass + type: IntercomService components: - - pos: -8.5,-57.5 + - rot: 3.141592653589793 rad + pos: 11.5,-33.5 parent: 60 type: Transform - uid: 9068 - type: FirelockGlass + type: DisposalUnit components: - - pos: -17.5,-57.5 + - pos: -94.5,17.5 parent: 60 type: Transform - uid: 9069 @@ -89362,9 +89585,9 @@ entities: parent: 60 type: Transform - uid: 9183 - type: ReinforcedWindow + type: WindoorScienceLocked components: - - pos: 46.5,12.5 + - pos: -50.5,13.5 parent: 60 type: Transform - uid: 9184 @@ -91118,9 +91341,9 @@ entities: parent: 60 type: Transform - uid: 9450 - type: ReinforcedWindow + type: IntercomScience components: - - pos: -52.5,14.5 + - pos: -39.5,-2.5 parent: 60 type: Transform - uid: 9451 @@ -91923,9 +92146,10 @@ entities: parent: 60 type: Transform - uid: 9571 - type: TableReinforced + type: APCBasic components: - - pos: -53.5,14.5 + - rot: 3.141592653589793 rad + pos: -42.5,-11.5 parent: 60 type: Transform - uid: 9572 @@ -92787,9 +93011,9 @@ entities: parent: 60 type: Transform - uid: 9693 - type: APCBasic + type: CableMV components: - - pos: -42.5,-11.5 + - pos: 17.5,20.5 parent: 60 type: Transform - uid: 9694 @@ -96483,9 +96707,9 @@ entities: parent: 60 type: Transform - uid: 10308 - type: CableApcExtension + type: CableMV components: - - pos: -53.5,12.5 + - pos: 18.5,20.5 parent: 60 type: Transform - uid: 10309 @@ -96520,9 +96744,10 @@ entities: parent: 60 type: Transform - uid: 10314 - type: CableApcExtension + type: APCBasic components: - - pos: -50.5,11.5 + - rot: -1.5707963267948966 rad + pos: 18.5,20.5 parent: 60 type: Transform - uid: 10315 @@ -96916,9 +97141,10 @@ entities: parent: 60 type: Transform - uid: 10380 - type: CableApcExtension + type: APCBasic components: - - pos: -42.5,13.5 + - rot: 3.141592653589793 rad + pos: 29.5,-38.5 parent: 60 type: Transform - uid: 10381 @@ -102184,9 +102410,9 @@ entities: parent: 60 type: Transform - uid: 11240 - type: APCBasic + type: WallSolid components: - - pos: 29.5,-38.5 + - pos: 28.5,-36.5 parent: 60 type: Transform - uid: 11241 @@ -102442,15 +102668,15 @@ entities: parent: 60 type: Transform - uid: 11283 - type: CableApcExtension + type: CableMV components: - - pos: 28.5,-36.5 + - pos: 28.5,-40.5 parent: 60 type: Transform - uid: 11284 - type: CableApcExtension + type: CableMV components: - - pos: 27.5,-36.5 + - pos: 27.5,-40.5 parent: 60 type: Transform - uid: 11285 @@ -102562,9 +102788,9 @@ entities: parent: 60 type: Transform - uid: 11303 - type: CableApcExtension + type: CableMV components: - - pos: 26.5,-32.5 + - pos: 26.5,-40.5 parent: 60 type: Transform - uid: 11304 @@ -102574,15 +102800,15 @@ entities: parent: 60 type: Transform - uid: 11305 - type: CableApcExtension + type: CableMV components: - - pos: 27.5,-32.5 + - pos: 26.5,-39.5 parent: 60 type: Transform - uid: 11306 - type: CableApcExtension + type: AirlockScienceGlassLocked components: - - pos: 28.5,-32.5 + - pos: -52.5,14.5 parent: 60 type: Transform - uid: 11307 @@ -103505,9 +103731,9 @@ entities: parent: 60 type: Transform - uid: 11455 - type: Grille + type: AirlockMaintGlassLocked components: - - pos: -52.5,14.5 + - pos: -52.5,17.5 parent: 60 type: Transform - uid: 11456 @@ -103604,7 +103830,7 @@ entities: parent: 60 type: Transform - uid: 11468 - type: AirlockMaintLocked + type: AirlockMaintGlassLocked components: - pos: -48.5,17.5 parent: 60 @@ -103629,11 +103855,13 @@ entities: parent: 60 type: Transform - uid: 11472 - type: AirlockMaintLocked + type: FaxMachineBase components: - - pos: -52.5,17.5 + - pos: -53.5,9.5 parent: 60 type: Transform + - name: Science + type: FaxMachine - uid: 11473 type: WallSolid components: @@ -103641,9 +103869,9 @@ entities: parent: 60 type: Transform - uid: 11474 - type: WindoorScienceLocked + type: DisposalUnit components: - - pos: -50.5,13.5 + - pos: -73.5,18.5 parent: 60 type: Transform - uid: 11475 @@ -113999,15 +114227,16 @@ entities: parent: 60 type: Transform - uid: 13117 - type: Grille + type: WallReinforced components: - pos: 46.5,12.5 parent: 60 type: Transform - uid: 13118 - type: Grille + type: IntercomSecurity components: - - pos: 46.5,14.5 + - rot: 1.5707963267948966 rad + pos: -27.5,-27.5 parent: 60 type: Transform - uid: 13119 @@ -115422,15 +115651,16 @@ entities: parent: 60 type: Transform - uid: 13296 - type: CableApcExtension + type: IntercomSecurity components: - - pos: 16.5,22.5 + - rot: 3.141592653589793 rad + pos: -28.5,-6.5 parent: 60 type: Transform - uid: 13297 - type: CableApcExtension + type: Grille components: - - pos: 16.5,21.5 + - pos: -30.5,-27.5 parent: 60 type: Transform - uid: 13298 @@ -117200,9 +117430,9 @@ entities: parent: 60 type: Transform - uid: 13577 - type: RandomPosterAny + type: Grille components: - - pos: -40.5,-26.5 + - pos: 1.5,-81.5 parent: 60 type: Transform - uid: 13578 @@ -117287,10 +117517,9 @@ entities: - color: '#0335FCFF' type: AtmosPipeColor - uid: 13590 - type: WindoorCommandLocked + type: IntercomEngineering components: - - rot: -1.5707963267948966 rad - pos: 3.5,-37.5 + - pos: -1.5,12.5 parent: 60 type: Transform - uid: 13591 @@ -120426,9 +120655,10 @@ entities: parent: 60 type: Transform - uid: 14055 - type: SignSecureSmall + type: IntercomAll components: - - pos: -1.5,12.5 + - rot: -1.5707963267948966 rad + pos: 5.5,-0.5 parent: 60 type: Transform - uid: 14056 @@ -134807,9 +135037,9 @@ entities: parent: 60 type: Transform - uid: 16144 - type: RandomInstruments + type: Catwalk components: - - pos: -39.5,-26.5 + - pos: -43.5,17.5 parent: 60 type: Transform - uid: 16145 @@ -145077,11 +145307,13 @@ entities: parent: 60 type: Transform - uid: 17698 - type: Catwalk + type: FaxMachineCaptain components: - - pos: -43.5,17.5 + - pos: 2.5,3.5 parent: 60 type: Transform + - name: Bridge + type: FaxMachine - uid: 17699 type: ShuttersRadiationOpen components: @@ -146735,13 +146967,12 @@ entities: parent: 60 type: Transform - uid: 17936 - type: FaxMachineCentcom + type: CableTerminal components: - - pos: 2.5,3.5 + - rot: 3.141592653589793 rad + pos: -12.5,4.5 parent: 60 type: Transform - - name: Bridge - type: FaxMachine - uid: 17937 type: WallReinforced components: @@ -146779,9 +147010,11 @@ entities: parent: 60 type: Transform - uid: 17943 - type: CableMV + type: SubstationBasic components: - - pos: -12.5,5.5 + - name: Grav Gen Sub + type: MetaData + - pos: -11.5,5.5 parent: 60 type: Transform - uid: 17944 @@ -146791,24 +147024,19 @@ entities: parent: 60 type: Transform - uid: 17945 - type: SMESBasic + type: CableHV components: - - name: Grav Gen SMES - type: MetaData - - pos: -12.5,4.5 + - pos: -11.5,5.5 parent: 60 type: Transform - uid: 17946 - type: CableTerminal + type: SMESBasic components: - - rot: 3.141592653589793 rad - pos: -12.5,3.5 + - name: GravGenSMES + type: MetaData + - pos: -12.5,5.5 parent: 60 type: Transform - - canCollide: False - type: Physics - - fixtures: [] - type: Fixtures - uid: 17947 type: CableHV components: @@ -146954,11 +147182,10 @@ entities: parent: 60 type: Transform - uid: 17971 - type: SubstationBasic + type: APCBasic components: - - name: Grav Gen Sub - type: MetaData - - pos: -12.5,5.5 + - rot: 3.141592653589793 rad + pos: -2.5,-1.5 parent: 60 type: Transform - uid: 17972 @@ -149039,9 +149266,9 @@ entities: - color: '#0335FCFF' type: AtmosPipeColor - uid: 18281 - type: APCBasic + type: WallSolid components: - - pos: -2.5,-1.5 + - pos: 28.5,-37.5 parent: 60 type: Transform - uid: 18282 @@ -149315,9 +149542,10 @@ entities: parent: 60 type: Transform - uid: 18327 - type: CableApcExtension + type: DisposalBend components: - - pos: 0.5,-2.5 + - rot: 1.5707963267948966 rad + pos: -74.5,18.5 parent: 60 type: Transform - uid: 18328 @@ -169893,9 +170121,10 @@ entities: parent: 60 type: Transform - uid: 21413 - type: PosterContrabandSmoke + type: DisposalTrunk components: - - pos: 31.5,-38.5 + - rot: 1.5707963267948966 rad + pos: -94.5,17.5 parent: 60 type: Transform - uid: 21414 @@ -170651,11 +170880,6 @@ entities: - devices: - 21508 - invalid - - invalid - - invalid - - invalid - - invalid - - invalid - 5940 - 6097 - 6098 @@ -170669,18 +170893,11 @@ entities: - devices: - 21508 - invalid - - invalid - - invalid - - invalid - - invalid - - invalid - 5940 - 6097 - 6098 - 6002 - 5962 - - invalid - - invalid - 6093 - 5961 type: DeviceList @@ -171947,8 +172164,8 @@ entities: - 5033 - 5034 - 5035 - - 9066 - - 9065 + - invalid + - invalid - 21608 type: DeviceList - uid: 21607 @@ -171961,8 +172178,8 @@ entities: - 5033 - 5034 - 5035 - - 9066 - - 9065 + - invalid + - invalid - 21608 - 4947 - 4950 @@ -171991,8 +172208,8 @@ entities: - 5039 - 5040 - 5041 - - 9067 - - 9068 + - invalid + - invalid - 4949 - 4948 type: DeviceList @@ -172008,8 +172225,8 @@ entities: - 5039 - 5040 - 5041 - - 9067 - - 9068 + - invalid + - invalid type: DeviceList - uid: 21612 type: AirAlarm @@ -172385,6 +172602,9 @@ entities: - 21642 - 17630 - 17629 + - 23764 + - 23765 + - 23766 type: DeviceList - uid: 21642 type: AirSensor @@ -173518,19 +173738,12 @@ entities: uid: 21762 type: SignalReceiver - uid: 21756 - type: ShuttersNormalOpen + type: DisposalTrunk components: - - rot: 1.5707963267948966 rad - pos: 46.5,12.5 + - rot: -1.5707963267948966 rad + pos: -73.5,18.5 parent: 60 type: Transform - - inputs: - Open: [] - Close: [] - Toggle: - - port: Pressed - uid: 21762 - type: SignalReceiver - uid: 21757 type: Mirror components: @@ -173577,19 +173790,12 @@ entities: uid: 21762 type: SignalReceiver - uid: 21761 - type: ShuttersNormalOpen + type: IntercomScience components: - - rot: 1.5707963267948966 rad - pos: 46.5,14.5 + - rot: 3.141592653589793 rad + pos: -49.5,10.5 parent: 60 type: Transform - - inputs: - Open: [] - Close: [] - Toggle: - - port: Pressed - uid: 21762 - type: SignalReceiver - uid: 21762 type: SignalButton components: @@ -173606,10 +173812,6 @@ entities: uid: 21754 - port: Toggle uid: 21755 - - port: Toggle - uid: 21761 - - port: Toggle - uid: 21756 - port: Toggle uid: 21759 - port: Toggle @@ -184924,13 +185126,11 @@ entities: - name: Medical type: FaxMachine - uid: 23423 - type: FaxMachineBase + type: IntercomEngineering components: - - pos: -53.5,14.5 + - pos: -18.5,38.5 parent: 60 type: Transform - - name: Science - type: FaxMachine - uid: 23424 type: Table components: @@ -187186,4 +187386,572 @@ entities: - pos: -31.5,15.5 parent: 60 type: Transform +- uid: 23764 + type: FirelockGlass + components: + - pos: -16.5,22.5 + parent: 60 + type: Transform +- uid: 23765 + type: FirelockGlass + components: + - pos: -15.5,22.5 + parent: 60 + type: Transform +- uid: 23766 + type: FirelockGlass + components: + - pos: -14.5,22.5 + parent: 60 + type: Transform +- uid: 23767 + type: FireAlarm + components: + - rot: 1.5707963267948966 rad + pos: -17.5,14.5 + parent: 60 + type: Transform +- uid: 23768 + type: AirAlarm + components: + - rot: 1.5707963267948966 rad + pos: -17.5,15.5 + parent: 60 + type: Transform + - devices: + - 23764 + - 23765 + - 23766 + - 21643 + - 17627 + - 17632 + type: DeviceList +- uid: 23769 + type: SpawnMobAlexander + components: + - pos: 24.5,-32.5 + parent: 60 + type: Transform +- uid: 23770 + type: APCBasic + components: + - rot: 1.5707963267948966 rad + pos: -1.5,-11.5 + parent: 60 + type: Transform +- uid: 23771 + type: CableApcExtension + components: + - pos: -1.5,-11.5 + parent: 60 + type: Transform +- uid: 23772 + type: CableApcExtension + components: + - pos: -0.5,-11.5 + parent: 60 + type: Transform +- uid: 23773 + type: CableApcExtension + components: + - pos: 0.5,-11.5 + parent: 60 + type: Transform +- uid: 23774 + type: CableMV + components: + - pos: -1.5,-11.5 + parent: 60 + type: Transform +- uid: 23775 + type: CableMV + components: + - pos: -0.5,-11.5 + parent: 60 + type: Transform +- uid: 23776 + type: CableMV + components: + - pos: 0.5,-11.5 + parent: 60 + type: Transform +- uid: 23777 + type: CableMV + components: + - pos: 0.5,-10.5 + parent: 60 + type: Transform +- uid: 23778 + type: CableMV + components: + - pos: 0.5,-9.5 + parent: 60 + type: Transform +- uid: 23779 + type: CableMV + components: + - pos: 0.5,-8.5 + parent: 60 + type: Transform +- uid: 23780 + type: CableMV + components: + - pos: 0.5,-7.5 + parent: 60 + type: Transform +- uid: 23781 + type: CableMV + components: + - pos: 0.5,-6.5 + parent: 60 + type: Transform +- uid: 23782 + type: CableMV + components: + - pos: 0.5,-5.5 + parent: 60 + type: Transform +- uid: 23783 + type: CableMV + components: + - pos: 0.5,-4.5 + parent: 60 + type: Transform +- uid: 23784 + type: CableMV + components: + - pos: 0.5,-3.5 + parent: 60 + type: Transform +- uid: 23785 + type: CableMV + components: + - pos: 0.5,-2.5 + parent: 60 + type: Transform +- uid: 23786 + type: CableMV + components: + - pos: 0.5,-1.5 + parent: 60 + type: Transform +- uid: 23787 + type: WallSolid + components: + - pos: 28.5,-35.5 + parent: 60 + type: Transform +- uid: 23788 + type: APCBasic + components: + - pos: 27.5,-34.5 + parent: 60 + type: Transform +- uid: 23789 + type: CableMV + components: + - pos: 26.5,-38.5 + parent: 60 + type: Transform +- uid: 23790 + type: CableMV + components: + - pos: 26.5,-37.5 + parent: 60 + type: Transform +- uid: 23791 + type: CableMV + components: + - pos: 26.5,-36.5 + parent: 60 + type: Transform +- uid: 23792 + type: CableMV + components: + - pos: 26.5,-35.5 + parent: 60 + type: Transform +- uid: 23793 + type: CableMV + components: + - pos: 27.5,-35.5 + parent: 60 + type: Transform +- uid: 23794 + type: CableMV + components: + - pos: 27.5,-34.5 + parent: 60 + type: Transform +- uid: 23795 + type: CableApcExtension + components: + - pos: 27.5,-36.5 + parent: 60 + type: Transform +- uid: 23796 + type: CableApcExtension + components: + - pos: 27.5,-35.5 + parent: 60 + type: Transform +- uid: 23797 + type: CableApcExtension + components: + - pos: 27.5,-34.5 + parent: 60 + type: Transform +- uid: 23798 + type: CableApcExtension + components: + - pos: 26.5,-32.5 + parent: 60 + type: Transform +- uid: 23799 + type: DisposalBend + components: + - rot: -1.5707963267948966 rad + pos: -74.5,17.5 + parent: 60 + type: Transform +- uid: 23800 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -75.5,17.5 + parent: 60 + type: Transform +- uid: 23801 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -76.5,17.5 + parent: 60 + type: Transform +- uid: 23802 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -77.5,17.5 + parent: 60 + type: Transform +- uid: 23803 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -78.5,17.5 + parent: 60 + type: Transform +- uid: 23804 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -79.5,17.5 + parent: 60 + type: Transform +- uid: 23805 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -80.5,17.5 + parent: 60 + type: Transform +- uid: 23806 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -81.5,17.5 + parent: 60 + type: Transform +- uid: 23807 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -82.5,17.5 + parent: 60 + type: Transform +- uid: 23808 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -83.5,17.5 + parent: 60 + type: Transform +- uid: 23809 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -84.5,17.5 + parent: 60 + type: Transform +- uid: 23810 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -85.5,17.5 + parent: 60 + type: Transform +- uid: 23811 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -86.5,17.5 + parent: 60 + type: Transform +- uid: 23812 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -87.5,17.5 + parent: 60 + type: Transform +- uid: 23813 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -88.5,17.5 + parent: 60 + type: Transform +- uid: 23814 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -89.5,17.5 + parent: 60 + type: Transform +- uid: 23815 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -90.5,17.5 + parent: 60 + type: Transform +- uid: 23816 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -91.5,17.5 + parent: 60 + type: Transform +- uid: 23817 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -92.5,17.5 + parent: 60 + type: Transform +- uid: 23818 + type: DisposalPipe + components: + - rot: -1.5707963267948966 rad + pos: -93.5,17.5 + parent: 60 + type: Transform +- uid: 23819 + type: APCBasic + components: + - pos: -48.5,15.5 + parent: 60 + type: Transform +- uid: 23820 + type: CableMV + components: + - pos: -48.5,12.5 + parent: 60 + type: Transform +- uid: 23821 + type: CableMV + components: + - pos: -48.5,13.5 + parent: 60 + type: Transform +- uid: 23822 + type: CableMV + components: + - pos: -48.5,14.5 + parent: 60 + type: Transform +- uid: 23823 + type: CableMV + components: + - pos: -48.5,15.5 + parent: 60 + type: Transform +- uid: 23824 + type: CableApcExtension + components: + - pos: -48.5,12.5 + parent: 60 + type: Transform +- uid: 23825 + type: CableApcExtension + components: + - pos: -48.5,13.5 + parent: 60 + type: Transform +- uid: 23826 + type: CableApcExtension + components: + - pos: -48.5,14.5 + parent: 60 + type: Transform +- uid: 23827 + type: CableApcExtension + components: + - pos: -48.5,15.5 + parent: 60 + type: Transform +- uid: 23828 + type: CableApcExtension + components: + - pos: -47.5,13.5 + parent: 60 + type: Transform +- uid: 23829 + type: CableApcExtension + components: + - pos: 18.5,20.5 + parent: 60 + type: Transform +- uid: 23830 + type: IntercomSecurity + components: + - pos: -17.5,-17.5 + parent: 60 + type: Transform +- uid: 23831 + type: Intercom + components: + - rot: 3.141592653589793 rad + pos: -37.5,22.5 + parent: 60 + type: Transform +- uid: 23832 + type: Intercom + components: + - pos: 19.5,-21.5 + parent: 60 + type: Transform +- uid: 23833 + type: IntercomSupply + components: + - rot: 1.5707963267948966 rad + pos: 35.5,6.5 + parent: 60 + type: Transform +- uid: 23834 + type: IntercomSupply + components: + - rot: 3.141592653589793 rad + pos: 48.5,11.5 + parent: 60 + type: Transform +- uid: 23835 + type: IntercomCommand + components: + - pos: 34.5,-11.5 + parent: 60 + type: Transform +- uid: 23836 + type: IntercomCommand + components: + - rot: 1.5707963267948966 rad + pos: -23.5,-0.5 + parent: 60 + type: Transform +- uid: 23837 + type: IntercomCommand + components: + - rot: -1.5707963267948966 rad + pos: -41.5,7.5 + parent: 60 + type: Transform +- uid: 23838 + type: IntercomCommand + components: + - pos: 9.5,22.5 + parent: 60 + type: Transform +- uid: 23839 + type: IntercomCommand + components: + - pos: -110.5,27.5 + parent: 60 + type: Transform +- uid: 23840 + type: Intercom + components: + - rot: 3.141592653589793 rad + pos: -43.5,-22.5 + parent: 60 + type: Transform +- uid: 23841 + type: Intercom + components: + - pos: -33.5,-21.5 + parent: 60 + type: Transform +- uid: 23842 + type: Intercom + components: + - pos: -9.5,-52.5 + parent: 60 + type: Transform +- uid: 23843 + type: Intercom + components: + - rot: 1.5707963267948966 rad + pos: -1.5,-36.5 + parent: 60 + type: Transform +- uid: 23844 + type: IntercomService + components: + - pos: -10.5,-25.5 + parent: 60 + type: Transform +- uid: 23845 + type: Grille + components: + - pos: -0.5,-81.5 + parent: 60 + type: Transform +- uid: 23846 + type: AirlockExternalShuttleLocked + components: + - pos: 0.5,-81.5 + parent: 60 + type: Transform + - fixtures: + - density: 100 + shape: !type:PolygonShape + vertices: + - 0.49,-0.49 + - 0.49,0.49 + - -0.49,0.49 + - -0.49,-0.49 + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - Opaque + - shape: !type:PhysShapeCircle + position: 0,-0.5 + radius: 0.2 + hard: False + id: docking + type: Fixtures +- uid: 23847 + type: IntercomEngineering + components: + - pos: -19.5,26.5 + parent: 60 + type: Transform ... From 92f806439e274028a5dec73cd7d4323d5edc2900 Mon Sep 17 00:00:00 2001 From: Vordenburg <114301317+Vordenburg@users.noreply.github.com> Date: Fri, 23 Dec 2022 14:51:19 -0500 Subject: [PATCH 02/30] Order decals in the placer window for mappers. (#13153) --- Content.Client/Decals/UI/DecalPlacerWindow.xaml.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Client/Decals/UI/DecalPlacerWindow.xaml.cs b/Content.Client/Decals/UI/DecalPlacerWindow.xaml.cs index 51f48e6927..78e0725d9f 100644 --- a/Content.Client/Decals/UI/DecalPlacerWindow.xaml.cs +++ b/Content.Client/Decals/UI/DecalPlacerWindow.xaml.cs @@ -20,7 +20,7 @@ public sealed partial class DecalPlacerWindow : DefaultWindow private PaletteColorPicker? _picker; - private Dictionary? _decals; + private SortedDictionary? _decals; private string? _selected; private Color _color = Color.White; private bool _useColor; @@ -170,7 +170,7 @@ public sealed partial class DecalPlacerWindow : DefaultWindow public void Populate(IEnumerable prototypes) { - _decals = new Dictionary(); + _decals = new SortedDictionary(); foreach (var decalPrototype in prototypes) { if (decalPrototype.ShowMenu) From a1350df01a4dd547d499fc1ec0bc580ac260ed2b Mon Sep 17 00:00:00 2001 From: Kara Date: Fri, 23 Dec 2022 17:36:12 -0600 Subject: [PATCH 03/30] Job + department descriptions (#13157) Co-authored-by: Sissel --- Content.Shared/Roles/DepartmentPrototype.cs | 13 ++++++ .../Locale/en-US/job/department-desc.ftl | 7 ++++ .../Locale/en-US/job/job-description.ftl | 42 +++++++++++++++++++ Resources/Locale/en-US/job/job-names.ftl | 4 +- .../Roles/Jobs/Cargo/cargo_technician.yml | 1 + .../Roles/Jobs/Cargo/quartermaster.yml | 1 + .../Roles/Jobs/Cargo/salvage_specialist.yml | 1 + .../Roles/Jobs/Civilian/assistant.yml | 1 + .../Roles/Jobs/Civilian/bartender.yml | 1 + .../Roles/Jobs/Civilian/botanist.yml | 1 + .../Roles/Jobs/Civilian/chaplain.yml | 1 + .../Prototypes/Roles/Jobs/Civilian/chef.yml | 1 + .../Prototypes/Roles/Jobs/Civilian/clown.yml | 1 + .../Roles/Jobs/Civilian/janitor.yml | 1 + .../Prototypes/Roles/Jobs/Civilian/lawyer.yml | 1 + .../Roles/Jobs/Civilian/librarian.yml | 1 + .../Prototypes/Roles/Jobs/Civilian/mime.yml | 1 + .../Roles/Jobs/Civilian/musician.yml | 1 + .../Roles/Jobs/Civilian/service_worker.yml | 1 + .../Prototypes/Roles/Jobs/Command/captain.yml | 1 + .../Roles/Jobs/Command/centcom_official.yml | 1 + .../Roles/Jobs/Command/head_of_personnel.yml | 1 + .../Engineering/atmospheric_technician.yml | 1 + .../Roles/Jobs/Engineering/chief_engineer.yml | 1 + .../Jobs/Engineering/station_engineer.yml | 1 + .../Jobs/Engineering/technical_assistant.yml | 3 +- .../Roles/Jobs/Fun/emergencyresponseteam.yml | 5 +++ .../Prototypes/Roles/Jobs/Medical/chemist.yml | 1 + .../Jobs/Medical/chief_medical_officer.yml | 1 + .../Roles/Jobs/Medical/medical_doctor.yml | 1 + .../Roles/Jobs/Medical/medical_intern.yml | 1 + .../Roles/Jobs/Science/research_director.yml | 1 + .../Roles/Jobs/Science/scientist.yml | 1 + .../Roles/Jobs/Security/detective.yml | 1 + .../Roles/Jobs/Security/head_of_security.yml | 1 + .../Roles/Jobs/Security/security_cadet.yml | 1 + .../Roles/Jobs/Security/security_officer.yml | 1 + .../Prototypes/Roles/Jobs/Security/warden.yml | 1 + .../Prototypes/Roles/Jobs/Wildcards/boxer.yml | 1 + .../Roles/Jobs/Wildcards/psychologist.yml | 1 + .../Roles/Jobs/Wildcards/reporter.yml | 1 + .../Roles/Jobs/Wildcards/zookeeper.yml | 1 + .../Prototypes/Roles/Jobs/departments.yml | 14 +++++++ 43 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 Resources/Locale/en-US/job/department-desc.ftl create mode 100644 Resources/Locale/en-US/job/job-description.ftl diff --git a/Content.Shared/Roles/DepartmentPrototype.cs b/Content.Shared/Roles/DepartmentPrototype.cs index 91232be950..5262cb88f4 100644 --- a/Content.Shared/Roles/DepartmentPrototype.cs +++ b/Content.Shared/Roles/DepartmentPrototype.cs @@ -1,3 +1,4 @@ +using System.Linq; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; @@ -8,6 +9,18 @@ public sealed class DepartmentPrototype : IPrototype { [IdDataFieldAttribute] public string ID { get; } = default!; + /// + /// A description string to display in the character menu as an explanation of the department's function. + /// + [DataField("description", required: true)] + public string Description = default!; + + /// + /// A color representing this department to use for text. + /// + [DataField("color", required: true)] + public Color Color = default!; + [ViewVariables(VVAccess.ReadWrite), DataField("roles", customTypeSerializer: typeof(PrototypeIdListSerializer))] public List Roles = new(); diff --git a/Resources/Locale/en-US/job/department-desc.ftl b/Resources/Locale/en-US/job/department-desc.ftl new file mode 100644 index 0000000000..6584ee7293 --- /dev/null +++ b/Resources/Locale/en-US/job/department-desc.ftl @@ -0,0 +1,7 @@ +department-Cargo-description = Purchase and deliver useful supplies to the crew. +department-Civilian-description = Perform small helpful tasks to keep the station sane. +department-Command-description = Manage the crew and keep them working efficiently. +department-Engineering-description = Keep the station operational. +department-Medical-description = Keep the crew healthy. +department-Security-description = Keep the peace around the station. +department-Science-description = Research new technologies and dangerous artifacts. diff --git a/Resources/Locale/en-US/job/job-description.ftl b/Resources/Locale/en-US/job/job-description.ftl new file mode 100644 index 0000000000..15270ac74a --- /dev/null +++ b/Resources/Locale/en-US/job/job-description.ftl @@ -0,0 +1,42 @@ +job-description-technical-assistant = Learn the basics of managing the station's engine, as well as repairing the station's hull & power. +job-description-atmostech = Optimize the station's atmospherics setup, and synthesize rare gases to use or sell. +job-description-bartender = Manage the bar and keep it lively, give out drinks, and listen to the crew's stories. +job-description-botanist = Grow food for the chef, drugs for medbay, and other plants to keep yourself entertained. +job-description-boxer = Fight your way to the top! Challenge the head of personnel and get brigged when you win. Not available on all maps! +job-description-cadet = Learn the basics of arresting criminals and managing the brig. +job-description-captain = Keep the station running, delegate work to the other heads of staff, and exert your will. +job-description-cargotech = Deal with requisitions and deliveries for emergencies, pilot the cargo shuttle, and work with others to make ludicrous amounts of cash. +job-description-ce = Manage the engineering department to ensure power, atmospherics, and the hull are in perfect shape. +job-description-centcomoff = Act as an ambassador to the newest state-of-the-art space station in Nanotrasen's fleet. +job-description-chaplain = Preach the good word of your deity and religion, and conduct spiritual healing. +job-description-chef = Keep the station fed with a variety of food items, butcher dead animals to ensure miasma doesn't leak, and help keep the bar lively. +job-description-chemist = Produce medicinal drugs for the doctors to use, research ethically dubious rare chemicals, and produce weapons of war when enemies of the station arrive. +job-description-clown = Entertain the crew through elaborate slapstick routines or terrible jokes. +job-description-cmo = Manage the resources and personnel of the medical department to keep the crew alive and disease-free. +job-description-detective = Investigate crime scenes using forensic tools, ensure that the guilty party is found, and have a couple smokes. +job-description-doctor = Diagnose and heal crewmembers through medicinal chemicals, vaccinations, and disease cures, along with cloning the dead. +job-description-engineer = Keep the station's main engine & solars active, optimize the power network, and make emergency repairs using your hardsuit. +job-description-ertengineer = Ensure that the station has power and clean air. +job-description-ertjanitor = Ensure that the station is properly cleaned--for morale. +job-description-ertleader = Lead the Emergency Response Team in dealing with threats to Nanotrasen assets. +job-description-ertmedic = Ensure that the crew of the station is kept alive and healthy. +job-description-ertsecurity = Ensure that any active threats to the station are put to rest. +job-description-hop = Handle access reassignment fairly using your ID console, manage the service department, and keep Ian safe. +job-description-hos = Manage your security force and keep them efficient, quell dissent, and keep the other heads of staff safe. +job-description-intern = Learn the basics of administering medicine, cloning the dead, and creating chemicals. +job-description-janitor = Keep the station clean of any trash or slipping hazards, and help deal with rat infestations. +job-description-lawyer = Ensure that every prisoner or criminal receives a fair judgment and trial if necessary. +job-description-librarian = Manage the library, give out knowledge to any who seek it, and report on activities aboard the station. +job-description-mime = Entertain the crew through non-vocal means, and engage with light rivalry with the clown. +job-description-musician = Entertain the crew with your unique musical talent, and acquire new instruments to mess around with. +job-description-passenger = Enjoy your stay aboard the station with no obligations! +job-description-psychologist = Provide emotional support to traumatized crew. Not available on all maps! +job-description-qm = Manage the supplies of the station & the cargo department, keep the salvage specialists working, make sure all orders are fulfilled, and keep the money flowing. +job-description-rd = Manage the science department, unlocking technologies, acquiring & researching artifacts, and performing experiments. +job-description-reporter = Entertain & inform the crew with your vibrant journalism through wireless cameras and the radio. Not available on all maps! +job-description-salvagespec = Use the salvage magnet to draw in derelicts & asteroids to loot and enrich the station, and fight off any space fauna along the way. +job-description-scientist = Research alien artifacts, unlock new technologies, upgrade machines around the station, and make everything run more efficiently. +job-description-security = Catch criminals and enemies of the station, enforce the law, and ensure that the station does not fall into disarray. +job-description-serviceworker = Learn the basics of bartending, cooking, and growing plants. +job-description-warden = Patrol the security department, ensure that no one is stealing from the armory, and make sure that all prisoners are processed and let out when their time is up. +job-description-zookeeper = Put on a joyful display of cute animals and space carps for all the crew to see. Not available on all maps! diff --git a/Resources/Locale/en-US/job/job-names.ftl b/Resources/Locale/en-US/job/job-names.ftl index 0af9d8a16c..e08a09928e 100644 --- a/Resources/Locale/en-US/job/job-names.ftl +++ b/Resources/Locale/en-US/job/job-names.ftl @@ -10,7 +10,7 @@ job-name-intern = medical intern job-name-doctor = medical doctor job-name-cmo = chief medical officer job-name-chemist = chemist -job-name-assistant = technical assistant +job-name-technical-assistant = technical assistant job-name-engineer = station engineer job-name-atmostech = atmospheric technician job-name-hop = head of personnel @@ -83,4 +83,4 @@ JobStationEngineer = station engineer JobTechnicalAssistant = technical assistant JobWarden = warden JobBoxer = boxer -JobZookeeper = zookeeper \ No newline at end of file +JobZookeeper = zookeeper diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml b/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml index 210b409704..f2c71cfd0b 100644 --- a/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml +++ b/Resources/Prototypes/Roles/Jobs/Cargo/cargo_technician.yml @@ -1,6 +1,7 @@ - type: job id: CargoTechnician name: job-name-cargotech + description: job-description-cargotech playTimeTracker: JobCargoTechnician startingGear: CargoTechGear icon: "CargoTechnician" diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml index 6e1d21c906..85de82dbea 100644 --- a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml +++ b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml @@ -1,6 +1,7 @@ - type: job id: Quartermaster name: job-name-qm + description: job-description-qm playTimeTracker: JobQuartermaster requirements: - !type:RoleTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml b/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml index b60d2160f7..369a91625e 100644 --- a/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml +++ b/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml @@ -1,6 +1,7 @@ - type: job id: SalvageSpecialist name: job-name-salvagespec + description: job-description-salvagespec playTimeTracker: JobSalvageSpecialist requirements: - !type:DepartmentTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/assistant.yml b/Resources/Prototypes/Roles/Jobs/Civilian/assistant.yml index 4cf71fa489..965adcd82c 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/assistant.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/assistant.yml @@ -1,6 +1,7 @@ - type: job id: Passenger name: job-name-passenger + description: job-description-passenger playTimeTracker: JobPassenger startingGear: PassengerGear icon: "Passenger" diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml b/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml index c7be4202a9..de08bbd18c 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml @@ -1,6 +1,7 @@ - type: job id: Bartender name: job-name-bartender + description: job-description-bartender playTimeTracker: JobBartender requirements: - !type:DepartmentTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/botanist.yml b/Resources/Prototypes/Roles/Jobs/Civilian/botanist.yml index 86c67c0c82..fe4e93cc0b 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/botanist.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/botanist.yml @@ -1,6 +1,7 @@ - type: job id: Botanist name: job-name-botanist + description: job-description-botanist playTimeTracker: JobBotanist startingGear: BotanistGear icon: "Botanist" diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml index 519607b444..3840b9ca00 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml @@ -1,6 +1,7 @@ - type: job id: Chaplain name: job-name-chaplain + description: job-description-chaplain playTimeTracker: JobChaplain startingGear: ChaplainGear icon: "Chaplain" diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml b/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml index e1b666d044..22bfb78cd7 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml @@ -1,6 +1,7 @@ - type: job id: Chef name: job-name-chef + description: job-description-chef playTimeTracker: JobChef requirements: - !type:DepartmentTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml b/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml index 24d172c7d2..c388a9eb77 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml @@ -1,6 +1,7 @@ - type: job id: Clown name: job-name-clown + description: job-description-clown playTimeTracker: JobClown startingGear: ClownGear icon: "Clown" diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/janitor.yml b/Resources/Prototypes/Roles/Jobs/Civilian/janitor.yml index 2a430603fb..4f668d3dd8 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/janitor.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/janitor.yml @@ -1,6 +1,7 @@ - type: job id: Janitor name: job-name-janitor + description: job-description-janitor playTimeTracker: JobJanitor startingGear: JanitorGear icon: "Janitor" diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml index 544ec79234..92becdd8c3 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml @@ -1,6 +1,7 @@ - type: job id: Lawyer name: job-name-lawyer + description: job-description-lawyer playTimeTracker: JobLawyer startingGear: LawyerGear icon: "Lawyer" diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml index 76592f8362..b80827dfa9 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml @@ -1,6 +1,7 @@ - type: job id: Librarian name: job-name-librarian + description: job-description-librarian playTimeTracker: JobLibrarian startingGear: LibrarianGear icon: "Librarian" diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml b/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml index f4619ba434..92b3906442 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml @@ -1,6 +1,7 @@ - type: job id: Mime name: job-name-mime + description: job-description-mime playTimeTracker: JobMime startingGear: MimeGear icon: "Mime" diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml b/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml index 4446632b12..655b8972eb 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml @@ -1,6 +1,7 @@ - type: job id: Musician name: job-name-musician + description: job-description-musician playTimeTracker: JobMusician startingGear: MusicianGear icon: "Musician" diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml b/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml index 7456870e2f..7320d6f78c 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml @@ -1,6 +1,7 @@ - type: job id: ServiceWorker name: job-name-serviceworker + description: job-description-serviceworker playTimeTracker: JobServiceWorker startingGear: ServiceWorkerGear icon: "ServiceWorker" diff --git a/Resources/Prototypes/Roles/Jobs/Command/captain.yml b/Resources/Prototypes/Roles/Jobs/Command/captain.yml index 9201a85000..d06a97c7c5 100644 --- a/Resources/Prototypes/Roles/Jobs/Command/captain.yml +++ b/Resources/Prototypes/Roles/Jobs/Command/captain.yml @@ -1,6 +1,7 @@ - type: job id: Captain name: job-name-captain + description: job-description-captain playTimeTracker: JobCaptain requirements: - !type:DepartmentTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Command/centcom_official.yml b/Resources/Prototypes/Roles/Jobs/Command/centcom_official.yml index 7521452732..7ca8ab116c 100644 --- a/Resources/Prototypes/Roles/Jobs/Command/centcom_official.yml +++ b/Resources/Prototypes/Roles/Jobs/Command/centcom_official.yml @@ -1,6 +1,7 @@ - type: job id: CentralCommandOfficial name: job-name-centcomoff + description: job-description-centcomoff playTimeTracker: JobCentralCommandOfficial setPreference: false startingGear: CentcomGear diff --git a/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml b/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml index 383e00fb94..a35abbd1a5 100644 --- a/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml +++ b/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml @@ -1,6 +1,7 @@ - type: job id: HeadOfPersonnel name: job-name-hop + description: job-description-hop playTimeTracker: JobHeadOfPersonnel requirements: - !type:DepartmentTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml b/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml index fba22c6b24..55f6e47378 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml @@ -1,6 +1,7 @@ - type: job id: AtmosphericTechnician name: job-name-atmostech + description: job-description-atmostech playTimeTracker: JobAtmosphericTechnician requirements: - !type:DepartmentTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml index 813f2f6c5a..7eb3b43cce 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml @@ -1,6 +1,7 @@ - type: job id: ChiefEngineer name: job-name-ce + description: job-description-ce playTimeTracker: JobChiefEngineer requirements: - !type:RoleTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml index 81e5d1ee93..0b90792ca8 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml @@ -1,6 +1,7 @@ - type: job id: StationEngineer name: job-name-engineer + description: job-description-engineer playTimeTracker: JobStationEngineer requirements: - !type:DepartmentTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml b/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml index 08195b66e0..de00b5604b 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml @@ -1,6 +1,7 @@ - type: job id: TechnicalAssistant - name: job-name-assistant + name: job-name-technical-assistant + description: job-description-technical-assistant playTimeTracker: JobTechnicalAssistant requirements: - !type:DepartmentTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Fun/emergencyresponseteam.yml b/Resources/Prototypes/Roles/Jobs/Fun/emergencyresponseteam.yml index dad35f3d0a..7712a57494 100644 --- a/Resources/Prototypes/Roles/Jobs/Fun/emergencyresponseteam.yml +++ b/Resources/Prototypes/Roles/Jobs/Fun/emergencyresponseteam.yml @@ -2,6 +2,7 @@ - type: job id: ERTLeader name: job-name-ertleader + description: job-description-ertleader playTimeTracker: JobERTLeader setPreference: false startingGear: ERTLeaderGearEVA @@ -46,6 +47,7 @@ - type: job id: ERTEngineer name: job-name-ertengineer + description: job-description-ertengineer playTimeTracker: JobERTEngineer setPreference: false startingGear: ERTEngineerGearEVA @@ -90,6 +92,7 @@ - type: job id: ERTSecurity name: job-name-ertsecurity + description: job-description-ertsecurity playTimeTracker: JobERTSecurity setPreference: false startingGear: ERTEngineerGearEVA @@ -134,6 +137,7 @@ - type: job id: ERTMedical name: job-name-ertmedic + description: job-description-ertmedic playTimeTracker: JobERTMedical setPreference: false startingGear: ERTMedicalGearEVA @@ -180,6 +184,7 @@ - type: job id: ERTJanitor name: job-name-ertjanitor + description: job-description-ertjanitor playTimeTracker: JobERTJanitor setPreference: false startingGear: ERTJanitorGearEVA diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml index 370b5fc2cc..390dc010a6 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml @@ -1,6 +1,7 @@ - type: job id: Chemist name: job-name-chemist + description: job-description-chemist playTimeTracker: JobChemist requirements: - !type:DepartmentTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml index bb7a13cc7d..5d6331b59f 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml @@ -3,6 +3,7 @@ - type: job id: ChiefMedicalOfficer name: job-name-cmo + description: job-description-cmo playTimeTracker: JobChiefMedicalOfficer requirements: - !type:DepartmentTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml index 1f8f4a2527..849ba9d017 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml @@ -1,6 +1,7 @@ - type: job id: MedicalDoctor name: job-name-doctor + description: job-description-doctor playTimeTracker: JobMedicalDoctor requirements: - !type:DepartmentTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml index 0bc75a83dc..2395a2d732 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml @@ -1,6 +1,7 @@ - type: job id: MedicalIntern name: job-name-intern + description: job-description-intern playTimeTracker: JobMedicalIntern requirements: - !type:DepartmentTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml index 2f5e4bf65b..9ef5261ef1 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml @@ -1,6 +1,7 @@ - type: job id: ResearchDirector name: job-name-rd + description: job-description-rd playTimeTracker: JobResearchDirector requirements: - !type:DepartmentTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Science/scientist.yml b/Resources/Prototypes/Roles/Jobs/Science/scientist.yml index ab497fc231..3f00cb2199 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/scientist.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/scientist.yml @@ -1,6 +1,7 @@ - type: job id: Scientist name: job-name-scientist + description: job-description-scientist playTimeTracker: JobScientist startingGear: ScientistGear icon: "Scientist" diff --git a/Resources/Prototypes/Roles/Jobs/Security/detective.yml b/Resources/Prototypes/Roles/Jobs/Security/detective.yml index abc9e00362..392442df77 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/detective.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/detective.yml @@ -1,6 +1,7 @@ - type: job id: Detective name: job-name-detective + description: job-description-detective playTimeTracker: JobDetective requirements: - !type:DepartmentTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml index eb0ab319cb..f4e42e2c16 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml @@ -1,6 +1,7 @@ - type: job id: HeadOfSecurity name: job-name-hos + description: job-description-hos playTimeTracker: JobHeadOfSecurity requirements: - !type:RoleTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml b/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml index fd254dcb76..7e5fb6c1e2 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml @@ -1,6 +1,7 @@ - type: job id: SecurityCadet name: job-name-cadet + description: job-description-cadet playTimeTracker: JobSecurityCadet requirements: - !type:DepartmentTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml index d3112de22b..a55d88be9d 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml @@ -1,6 +1,7 @@ - type: job id: SecurityOfficer name: job-name-security + description: job-description-security playTimeTracker: JobSecurityOfficer requirements: - !type:DepartmentTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Security/warden.yml b/Resources/Prototypes/Roles/Jobs/Security/warden.yml index 4fbe108711..8768c2873b 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/warden.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/warden.yml @@ -1,6 +1,7 @@ - type: job id: Warden name: job-name-warden + description: job-description-warden playTimeTracker: JobWarden requirements: - !type:DepartmentTimeRequirement diff --git a/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml b/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml index e2570daa05..52396a1be5 100644 --- a/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml +++ b/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml @@ -1,6 +1,7 @@ - type: job id: Boxer name: job-name-boxer + description: job-description-boxer playTimeTracker: JobBoxer startingGear: BoxerGear setPreference: false diff --git a/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml b/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml index 46ca4c92bd..b28c805d22 100644 --- a/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml +++ b/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml @@ -1,6 +1,7 @@ - type: job id: Psychologist name: job-name-psychologist + description: job-description-psychologist playTimeTracker: JobPsychologist startingGear: PsychologistGear icon: "Psychologist" diff --git a/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml b/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml index d4fa71fc7e..42a7dcbed3 100644 --- a/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml +++ b/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml @@ -1,6 +1,7 @@ - type: job id: Reporter name: job-name-reporter + description: job-description-reporter playTimeTracker: JobReporter startingGear: ReporterGear icon: "Reporter" diff --git a/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml b/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml index a45a331039..0790fad2a6 100644 --- a/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml +++ b/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml @@ -1,6 +1,7 @@ - type: job id: Zookeeper name: job-name-zookeeper + description: job-description-zookeeper playTimeTracker: JobZookeeper startingGear: ZookeeperGear icon: "Zookeeper" diff --git a/Resources/Prototypes/Roles/Jobs/departments.yml b/Resources/Prototypes/Roles/Jobs/departments.yml index 0aaa19e876..79867645d9 100644 --- a/Resources/Prototypes/Roles/Jobs/departments.yml +++ b/Resources/Prototypes/Roles/Jobs/departments.yml @@ -1,5 +1,7 @@ - type: department id: Cargo + description: department-Cargo-description + color: "#A46106" roles: - CargoTechnician - Quartermaster @@ -7,6 +9,8 @@ - type: department id: Civilian + description: department-Civilian-description + color: "#9FED58" roles: - Bartender - Botanist @@ -29,6 +33,8 @@ - type: department id: Command + description: department-Command-description + color: "#334E6D" roles: - Captain - CentralCommandOfficial @@ -41,6 +47,8 @@ - type: department id: Engineering + description: department-Engineering-description + color: "#EFB341" roles: - AtmosphericTechnician - ChiefEngineer @@ -49,6 +57,8 @@ - type: department id: Medical + description: department-Medical-description + color: "#52B4E9" roles: - Chemist - ChiefMedicalOfficer @@ -58,6 +68,8 @@ - type: department id: Security + description: department-Command-description + color: "#DE3A3A" roles: - HeadOfSecurity - SecurityCadet @@ -67,6 +79,8 @@ - type: department id: Science + description: department-Command-description + color: "#D381C9" roles: - ResearchDirector - Scientist From ba053b660c5247526aa4b7e5efe49fed3d938f27 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 23 Dec 2022 18:37:16 -0500 Subject: [PATCH 04/30] Automatic changelog update --- Resources/Changelog/Changelog.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c63a6679a2..5b2e6ae2ab 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,9 +1,4 @@ Entries: -- author: ShadowCommander - changes: - - {message: Tile prying no longer spawns the tile item in the wall., type: Fix} - id: 2299 - time: '2022-09-14T07:07:44.0000000+00:00' - author: Macoron changes: - {message: Added chameleon clothing that can mimic any uniform. Watch out for suspicious @@ -2939,3 +2934,8 @@ Entries: - {message: Fixed IFF consoles being able to be opened without power., type: Fix} id: 2798 time: '2022-12-22T02:43:46.0000000+00:00' +- author: mirrorcult + changes: + - {message: Jobs now have tooltip descriptions in the lobby., type: Add} + id: 2799 + time: '2022-12-23T23:36:12.0000000+00:00' From e884be64fa00f8ddba6ca653cdf9aefa2ee4efd7 Mon Sep 17 00:00:00 2001 From: Emisse <99158783+Emisse@users.noreply.github.com> Date: Fri, 23 Dec 2022 17:33:12 -0700 Subject: [PATCH 05/30] Omega Update 1.3 (#13156) --- Resources/Maps/omega.yml | 1236 +++++++++++++++++++++++++++++--------- 1 file changed, 963 insertions(+), 273 deletions(-) diff --git a/Resources/Maps/omega.yml b/Resources/Maps/omega.yml index 9794326160..67a107e518 100644 --- a/Resources/Maps/omega.yml +++ b/Resources/Maps/omega.yml @@ -121,7 +121,7 @@ entities: tiles: SwAAAUsAAABYAAAASwAAAksAAAFLAAADSwAAAEsAAAJYAAAAPgAAAD4AAAIuAAAALgAAAC4AAAAuAAAALgAAAFgAAABYAAAAWAAAAEsAAABLAAADSwAAAUsAAAFLAAACWAAAAD4AAAE+AAADWAAAAFgAAABYAAAAWAAAAFgAAAAVAAAAFQAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA+AAADPgAAAj4AAAE+AAAAPgAAAz4AAAM+AAAAPgAAAz4AAAI+AAACPgAAAz4AAAI+AAACPgAAAT4AAAE+AAACPgAAAz4AAAM+AAADPgAAAD4AAAA+AAACPgAAAz4AAAI+AAAAPgAAAT4AAAE+AAADPgAAAD4AAAA+AAABPgAAAD4AAAA+AAAAPgAAAT4AAAE+AAABPgAAAj4AAABYAAAAWAAAAFgAAABYAAAAWAAAACsAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAA+AAABPgAAAT4AAAM+AAAAFQAAARUAAAEVAAACFQAAAhUAAAArAAAAFQAAACUAAAAlAAAAJQAAAFgAAABYAAAADAAAAAwAAAMMAAAAWAAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAAlAAAAJQAAAFgAAABYAAAADAAAAwwAAAIMAAACDAAAAwwAAAAVAAAAFQAAARUAAAMVAAABFQAAACsAAAArAAAAKwAAACsAAAA+AAABDAAAAQwAAAE+AAADPgAAAz4AAAMMAAADKwAAACsAAAArAAAAKwAAACsAAAArAAAAKwAAACsAAAArAAAAPgAAAAwAAAE+AAACPgAAAT4AAAA+AAAAPgAAARUAAAIVAAACFQAAARUAAAEVAAADFQAAARUAAAAVAAABFQAAAD4AAAEMAAACPgAAAj4AAAM+AAACPgAAAT4AAAJYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAADAAAAD4AAAM+AAACPgAAAT4AAAI+AAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAAwAAAE+AAADPgAAAz4AAAA+AAAAPgAAAy4AAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAMAAACPgAAAz4AAAI+AAAAPgAAAz4AAAAuAAAALgAAAFgAAABYAAAAWAAAABUAAAMVAAABFQAAARUAAANYAAAADAAAAT4AAAI+AAAAPgAAAT4AAAA+AAAALgAAAC4AAABYAAAAWAAAAFgAAAAVAAAAVQAAAlUAAAEVAAAAFQAAAAwAAAE+AAAAPgAAAz4AAAA+AAACPgAAAw== -2,1: ind: -2,1 - tiles: PgAAAT4AAAA+AAABPgAAAD4AAAA+AAACPgAAAlgAAAA+AAACPgAAA1UAAAFVAAACVQAAAlUAAANVAAAAVQAAAj4AAAE+AAAAPgAAAD4AAAJYAAAAPgAAAD4AAANYAAAAPgAAAz4AAANYAAAAVQAAA1UAAANVAAACVQAAAFUAAAM+AAACPgAAAj4AAAE+AAABWAAAAFgAAABYAAAAWAAAAD4AAAM+AAABWAAAAFgAAABYAAAAWAAAAFUAAAJYAAAAPgAAAD4AAAI+AAABPgAAAj4AAAI+AAABPgAAAFgAAAA+AAABPgAAAj4AAAE+AAADPgAAAj4AAAA+AAAAPgAAAj4AAAM+AAAAPgAAAj4AAAJYAAAAPgAAAT4AAABYAAAAPgAAAT4AAAE+AAACPgAAAT4AAAE+AAABPgAAAD4AAAFYAAAAFQAAAhUAAAJYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAuAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAFQAAARUAAAMVAAACFQAAAVgAAAAVAAAAFQAAAFgAAAAVAAAALgAAAC4AAAAuAAAALgAAAFgAAABYAAAAWAAAAFgAAAAVAAADFQAAAlgAAABYAAAAFQAAAhUAAABYAAAAFQAAAC4AAAAuAAAALgAAAC4AAABYAAAAWAAAAFgAAAAVAAABFQAAAhUAAAAVAAABFQAAARUAAAAVAAABWAAAABUAAAIuAAAALgAAAC4AAAAuAAAAWAAAAFgAAAAVAAACWAAAAD4AAAJYAAAAWAAAAFgAAAA+AAADWAAAAFgAAAAVAAABVQAAAlUAAANVAAACVQAAA1gAAABYAAAAWAAAAD4AAAA+AAADPgAAA1gAAAA+AAADPgAAAj4AAAFYAAAAWAAAAFUAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA+AAAAPgAAAz4AAANYAAAAPgAAAD4AAAA+AAAAWAAAABUAAAJVAAACVQAAAzYAAAA2AAAAWAAAAFgAAABYAAAAWAAAAD4AAANYAAAAWAAAAFgAAAA+AAADWAAAAFgAAAAVAAAAVQAAAVUAAABYAAAANgAAAFgAAABYAAAAWAAAAD4AAAM+AAACPgAAAz4AAAM+AAADPgAAARUAAAJYAAAAWAAAAFgAAABYAAAAWAAAADYAAABYAAAASAAAAFgAAAA+AAABPgAAAz4AAAI+AAACPgAAAj4AAAEVAAAAWAAAAAQAAAIAAAAABAAAAVgAAABYAAAAWAAAAFgAAABYAAAAPgAAAz4AAAM+AAAAPgAAAT4AAAA+AAAAFQAAAVgAAAAEAAAAAAAAAAQAAAIEAAAABAAAAAQAAAEEAAACBAAAAg== + tiles: PgAAAT4AAAA+AAABPgAAAD4AAAA+AAACPgAAAlgAAAA+AAACPgAAA1UAAAFVAAACVQAAAlUAAANVAAAAVQAAAj4AAAE+AAAAPgAAAD4AAAJYAAAAPgAAAD4AAANYAAAAPgAAAz4AAANYAAAAVQAAA1UAAANVAAACVQAAAFUAAAM+AAACPgAAAj4AAAE+AAABWAAAAFgAAABYAAAAWAAAAD4AAAM+AAABWAAAAFgAAABYAAAAWAAAAFUAAAJYAAAAPgAAAD4AAAI+AAABPgAAAj4AAAI+AAABPgAAAFgAAAA+AAABPgAAAj4AAAE+AAADPgAAAj4AAAA+AAAAPgAAAj4AAAM+AAAAPgAAAj4AAAJYAAAAPgAAAT4AAABYAAAAPgAAAT4AAAE+AAACPgAAAT4AAAE+AAABPgAAAD4AAAFYAAAAFQAAAhUAAAJYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAuAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAFQAAARUAAAMVAAACFQAAAVgAAAAVAAAAFQAAAFgAAAAVAAAALgAAAC4AAAAuAAAALgAAAFgAAABYAAAAWAAAAFgAAAAVAAADFQAAAlgAAABYAAAAFQAAAhUAAAAVAAAAFQAAAC4AAAAuAAAALgAAAC4AAABYAAAAWAAAAFgAAAAVAAABFQAAAhUAAAAVAAABFQAAARUAAAAVAAABWAAAABUAAAIuAAAALgAAAC4AAAAuAAAAWAAAAFgAAAAVAAACWAAAAD4AAAJYAAAAWAAAAFgAAAA+AAADWAAAAFgAAAAVAAABVQAAAlUAAANVAAACVQAAA1gAAABYAAAAWAAAAD4AAAA+AAADPgAAA1gAAAA+AAADPgAAAj4AAAFYAAAAWAAAAFUAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA+AAAAPgAAAz4AAANYAAAAPgAAAD4AAAA+AAAAWAAAABUAAAJVAAACVQAAAzYAAAA2AAAAWAAAAFgAAABYAAAAWAAAAD4AAANYAAAAWAAAAFgAAAA+AAADWAAAAFgAAAAVAAAAVQAAAVUAAABYAAAANgAAAFgAAABYAAAAWAAAAD4AAAM+AAACPgAAAz4AAAM+AAADPgAAARUAAAJYAAAAWAAAAFgAAABYAAAAWAAAADYAAABYAAAASAAAAFgAAAA+AAABPgAAAz4AAAI+AAACPgAAAj4AAAEVAAAAWAAAAAQAAAIAAAAABAAAAVgAAABYAAAAWAAAAFgAAABYAAAAPgAAAz4AAAM+AAAAPgAAAT4AAAA+AAAAFQAAAVgAAAAEAAAAAAAAAAQAAAIEAAAABAAAAAQAAAEEAAACBAAAAg== -2,0: ind: -2,0 tiles: WAAAAFgAAABYAAAAWAAAAFgAAAA+AAACPgAAAlgAAAA+AAACPgAAAj4AAAI+AAADWAAAAFUAAANYAAAAWAAAAD4AAAE+AAAAPgAAAj4AAAJYAAAAPgAAAD4AAAA+AAADPgAAAD4AAAI+AAABPgAAAz4AAAE+AAACLQAAAFgAAAA+AAACPgAAAj4AAAM+AAABWAAAAD4AAAI+AAAAPgAAAz4AAAM+AAADPgAAAj4AAAA+AAABPgAAAi0AAAAtAAAAPgAAAD4AAAM+AAABPgAAA1gAAAA+AAADPgAAAlgAAAAVAAABFQAAABUAAAMgAAAAWAAAAC4AAABYAAAAWAAAAD4AAAA+AAABPgAAAj4AAANYAAAAPgAAAj4AAAJYAAAAFQAAAxUAAAAVAAADIAAAAFgAAAAuAAAALgAAAFgAAAA+AAAAPgAAAz4AAAM+AAACWAAAAD4AAAE+AAABWAAAACAAAAAgAAAAIAAAACAAAABYAAAALgAAAC4AAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA+AAAAPgAAA1gAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAVAAADPgAAAD4AAAI+AAACPgAAAz4AAANYAAAAPgAAAD4AAAI+AAADPgAAAz4AAANYAAAAWAAAAFgAAABYAAAAFQAAAD4AAAM+AAAAPgAAAj4AAAE+AAABWAAAAD4AAAI+AAABPgAAAD4AAAE+AAABWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA+AAAAPgAAAz4AAAM+AAABPgAAAj4AAAA+AAADPgAAAj4AAAI+AAABPgAAAT4AAABYAAAAPgAAAz4AAAJYAAAAPgAAAT4AAAM+AAACPgAAAj4AAAA+AAABPgAAAz4AAAA+AAACPgAAAz4AAAI+AAAAPgAAAD4AAAM+AAAAWAAAAD4AAAA+AAADWAAAAD4AAAM+AAAAPgAAAz4AAAM+AAAAFQAAAT4AAAI+AAAAPgAAAVgAAABYAAAAWAAAAFgAAAA+AAABPgAAAFgAAAA+AAABPgAAAD4AAAA+AAADPgAAABUAAAA+AAACPgAAAj4AAAM+AAACPgAAAD4AAAA+AAADPgAAAD4AAAJYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAVAAABPgAAAz4AAAM+AAABPgAAAj4AAAM+AAACPgAAAD4AAAI+AAACWAAAAFUAAANVAAAAVQAAAVUAAANVAAAAPgAAAj4AAAM+AAACPgAAAVgAAABYAAAAWAAAAFgAAAA+AAADPgAAAlgAAABVAAAAVQAAAlUAAABVAAABVQAAAw== @@ -169,13 +169,13 @@ entities: tiles: WAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAPgAAAz4AAAM+AAACPgAAAT4AAAE+AAAAPgAAA1gAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAM+AAABWAAAAFgAAAA+AAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA+AAACPgAAA1gAAAA+AAAAPgAAAz4AAANYAAAASwAAAksAAABYAAAAPgAAAT4AAAM+AAACPgAAAz4AAANYAAAAPgAAAD4AAAJYAAAAPgAAAD4AAAA+AAADWAAAAEsAAABLAAADWAAAAEsAAAJLAAACSwAAA0sAAAJLAAAAWAAAAD4AAAI+AAABWAAAAD4AAAA+AAADPgAAAFgAAABYAAAASwAAAFgAAABLAAAASwAAA0sAAAJLAAAASwAAAFgAAAA+AAAAPgAAAVgAAAA+AAABPgAAAj4AAAFYAAAASwAAA0sAAAFLAAADSwAAAUsAAAJLAAADSwAAA0sAAAFYAAAAPgAAAD4AAAM+AAABPgAAAT4AAAI+AAACWAAAAEsAAANLAAAASwAAAUsAAANLAAADSwAAAEsAAAJLAAADWAAAAD4AAAE+AAAAWAAAAD4AAAI+AAACPgAAAlgAAABLAAADSwAAAVgAAABLAAACSwAAAVgAAABYAAAAWAAAAFgAAAA+AAADPgAAAVgAAABYAAAAWAAAAFgAAABYAAAASwAAAksAAANYAAAASwAAAEsAAAJLAAAASwAAAEsAAABLAAACPgAAAz4AAAE+AAADPgAAAD4AAAA+AAADPgAAAEsAAAFLAAACWAAAAEsAAABLAAAASwAAAEsAAAFLAAADSwAAAj4AAAA+AAADPgAAAj4AAAE+AAAAPgAAAT4AAANLAAADWAAAAFgAAABLAAADSwAAAUsAAAJLAAACSwAAAFgAAAA+AAABPgAAA1gAAABYAAAAWAAAAFgAAABYAAAASwAAA0sAAANYAAAAWAAAAFgAAABYAAAASwAAAlgAAABYAAAAPgAAAT4AAAEuAAAALgAAAC4AAAAuAAAALgAAAEsAAAJLAAABWAAAAEsAAAFLAAABSwAAAEsAAANLAAADWAAAAD4AAAA+AAADLgAAAC4AAAAuAAAALgAAAC4AAABLAAAASwAAAFgAAABLAAADSwAAAEsAAABLAAACSwAAAlgAAAA+AAACPgAAAy4AAAAuAAAALgAAAC4AAAAuAAAASwAAAEsAAAFYAAAASwAAAUsAAABLAAAASwAAA0sAAANYAAAAPgAAAD4AAAIuAAAALgAAAC4AAAAuAAAALgAAAA== -1,-3: ind: -1,-3 - tiles: AAAAAFgAAAAlAAAAPgAAAj4AAAA+AAADPgAAASUAAABYAAAAWAAAADsAAAA3AAAAOwAAACgAAAA7AAAANwAAAAAAAABYAAAAJQAAAD4AAAM+AAADPgAAAT4AAAIlAAAAWAAAAFgAAAA7AAAANwAAADsAAAAoAAAAOwAAADcAAAAAAAAAWAAAACUAAAA+AAABPgAAAz4AAAE+AAADJQAAAFgAAABYAAAAOwAAADcAAAA7AAAAKAAAADsAAAA3AAAAAAAAAFgAAABYAAAAWAAAAD4AAAA+AAAAWAAAAFgAAABYAAAAWAAAADsAAAA3AAAAOwAAAFgAAAA7AAAANwAAAAAAAABYAAAAWAAAAFgAAAA+AAACPgAAAVgAAABYAAAAWAAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAAAAAAWAAAAFgAAABYAAAAPgAAAT4AAAJYAAAAWAAAAFgAAABYAAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAAAAAAAAAAABXAAAAWAAAAD4AAAM+AAADWAAAAFcAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAAAAAAAAAAAAVwAAAFgAAAA+AAABPgAAAlgAAABXAAAAAAAAAFgAAABYAAAAIQAAACEAAABYAAAAIQAAACEAAAAAAAAAAAAAAFcAAABYAAAAPgAAAD4AAANYAAAAVwAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAAAAAAAAAAABXAAAAWAAAAD4AAAI+AAACWAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAAA+AAAAPgAAAlgAAABXAAAAVwAAAFcAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAAABFQAAARUAAAJYAAAAPgAAAT4AAAFYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAFQAAARUAAAIVAAACWAAAAD4AAAE+AAAAPgAAAT4AAAA+AAABPgAAAT4AAAE+AAADPgAAAz4AAAE+AAADPgAAAi4AAAAuAAAAFQAAAhUAAAA+AAACPgAAAT4AAAM+AAAAPgAAAT4AAAM+AAADPgAAAj4AAAI+AAACPgAAAD4AAAAVAAAAFQAAAxUAAAJYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA+AAAAPgAAAFgAAABYAAAAWAAAAFgAAABYAAAAFQAAAxUAAAAVAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAPgAAAT4AAAA+AAAAPgAAAD4AAAI+AAABPgAAAg== + tiles: AAAAAFcAAAAlAAAAPgAAAj4AAAA+AAADPgAAASUAAABXAAAAWAAAADsAAAA3AAAAOwAAACgAAAA7AAAANwAAAAAAAABXAAAAJQAAAD4AAAM+AAADPgAAAT4AAAIlAAAAVwAAAFgAAAA7AAAANwAAADsAAAAoAAAAOwAAADcAAAAAAAAAVwAAACUAAAA+AAABPgAAAz4AAAE+AAADJQAAAFcAAABYAAAAOwAAADcAAAA7AAAAKAAAADsAAAA3AAAAAAAAAFgAAABYAAAAWAAAAD4AAAA+AAAAWAAAAFgAAABYAAAAWAAAADsAAAA3AAAAOwAAAFgAAAA7AAAANwAAAAAAAABYAAAAWAAAAFgAAAA+AAACPgAAAVgAAABYAAAAWAAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAAAAAAWAAAAFgAAABYAAAAPgAAAT4AAAJYAAAAWAAAAFgAAABYAAAAOwAAADsAAAA7AAAAOwAAADsAAAA7AAAAAAAAAAAAAABXAAAAWAAAAD4AAAM+AAADWAAAAFcAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAAAAAAAAAAAAVwAAAFgAAAA+AAABPgAAAlgAAABXAAAAAAAAAFgAAABYAAAAIQAAACEAAABYAAAAIQAAACEAAAAAAAAAAAAAAFcAAABYAAAAPgAAAD4AAANYAAAAVwAAAAAAAAAAAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAAAAAAAAAAABXAAAAWAAAAD4AAAI+AAACWAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAAA+AAAAPgAAAlgAAABXAAAAVwAAAFcAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAAABFQAAARUAAAJYAAAAPgAAAT4AAAFYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAFQAAARUAAAIVAAACWAAAAD4AAAE+AAAAPgAAAT4AAAA+AAABPgAAAT4AAAE+AAADPgAAAz4AAAE+AAADPgAAAi4AAAAuAAAAFQAAAhUAAAA+AAACPgAAAT4AAAM+AAAAPgAAAT4AAAM+AAADPgAAAj4AAAI+AAACPgAAAD4AAAAVAAAAFQAAAxUAAAJYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA+AAAAPgAAAFgAAABYAAAAWAAAAFgAAABYAAAAFQAAAxUAAAAVAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAPgAAAT4AAAA+AAAAPgAAAD4AAAI+AAABPgAAAg== 0,-3: ind: 0,-3 tiles: OwAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAEAAABBAAAAAQAAAIAAAAAAAAAAAAAAAA7AAAAWAAAAAAAAAAAAAAAAAAAAAQAAAFYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAAEAAACBAAAAAQAAAIEAAACOwAAAFgAAAAAAAAAAAAAAAQAAAIEAAABWAAAAFgAAABLAAACSwAAAksAAAJYAAAABAAAAgQAAAAEAAACBAAAADcAAABYAAAAAAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABLAAABWAAAAFgAAABYAAAAWAAAAFgAAAA7AAAAWAAAAAAAAABYAAAAFQAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAFQAAABUAAANYAAAAWAAAAFgAAAAAAAAAWAAAABUAAAMpAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAABUAAAEVAAADWAAAAFgAAABYAAAAAAAAAFgAAABYAAAAWAAAAFgAAAA+AAACWAAAAFgAAABLAAADWAAAABUAAAEVAAADWAAAAFgAAABYAAAAAAAAAFcAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAAAAAAAAAAABXAAAAWAAAAFgAAAAVAAAAWAAAAFgAAABYAAAAWAAAAD4AAANYAAAAWAAAABUAAAEVAAADWAAAAFcAAABXAAAAVwAAAFgAAAAVAAACFQAAAVgAAABYAAAAWAAAAFgAAAA+AAACWAAAAFgAAABYAAAAFQAAA1gAAABYAAAAWAAAAFgAAABYAAAAFQAAAVgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAPgAAAj4AAAI+AAADWAAAAFgAAABYAAAAWAAAAFgAAAA+AAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAD4AAAM+AAABPgAAAlgAAAAVAAAAWAAAAFgAAABYAAAAPgAAAVgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAAA+AAABPgAAAlgAAABYAAAAFQAAACkAAABYAAAAPgAAAT4AAANYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAPgAAAT4AAAA+AAADWAAAABUAAAAVAAACWAAAAD4AAAI+AAACPgAAAVgAAABYAAAAWAAAAFgAAABYAAAAWAAAAA== -1,-4: ind: -1,-4 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAAAAAAAAAAAAAFcAAABXAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAAAAAAAAAAAAAAAAAFcAAABYAAAAWAAAAFgAAABYAAAAVwAAAAAAAAAAAAAAAAAAAFgAAABYAAAAOwAAAFgAAABYAAAAAAAAAAAAAABXAAAAWAAAAD4AAAI+AAACWAAAAFcAAAAAAAAAAAAAAAAAAABYAAAAOwAAADcAAAA7AAAAWAAAAAAAAAAAAAAAVwAAAFgAAAA+AAACPgAAA1gAAABXAAAAAAAAAAAAAAAAAAAAWAAAADsAAAA3AAAAOwAAAFgAAAAAAAAAAAAAAFcAAABYAAAAPgAAAj4AAABYAAAAVwAAAAAAAABYAAAAWAAAAFgAAABYAAAANwAAAFgAAABYAAAAAAAAAFgAAABYAAAAWAAAAD4AAAM+AAACWAAAAFgAAABYAAAAWAAAADsAAAA7AAAAOwAAADcAAAA7AAAAOwAAAAAAAABYAAAAWAAAAFgAAAA+AAAAPgAAAFgAAABYAAAAWAAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAAAAAAWAAAAFgAAABYAAAAPgAAAD4AAABYAAAAWAAAAFgAAABYAAAAOwAAADcAAAA7AAAAWAAAADsAAAA3AAAAAAAAAFgAAAAlAAAAPgAAAD4AAAM+AAACPgAAAyUAAABYAAAAWAAAADsAAAA3AAAAOwAAACgAAAA7AAAANwAAAA== + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAVwAAAFcAAAAAAAAAAAAAAFcAAABXAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXAAAAAAAAAAAAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAAAAAAAAAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAFcAAAAAAAAAAAAAAFcAAABXAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAAAAAAAAAAAAAAAAAFcAAABYAAAAWAAAAFgAAABYAAAAVwAAAAAAAAAAAAAAAAAAAFgAAABYAAAAOwAAAFgAAABYAAAAAAAAAAAAAABXAAAAWAAAAD4AAAI+AAACWAAAAFcAAAAAAAAAAAAAAAAAAABYAAAAOwAAADcAAAA7AAAAWAAAAAAAAAAAAAAAVwAAAFgAAAA+AAACPgAAA1gAAABXAAAAAAAAAAAAAAAAAAAAWAAAADsAAAA3AAAAOwAAAFgAAAAAAAAAAAAAAFcAAABYAAAAPgAAAj4AAABYAAAAVwAAAAAAAABYAAAAWAAAAFgAAABYAAAANwAAAFgAAABYAAAAAAAAAFgAAABYAAAAWAAAAD4AAAM+AAACWAAAAFgAAABYAAAAWAAAADsAAAA7AAAAOwAAADcAAAA7AAAAOwAAAAAAAABYAAAAWAAAAFgAAAA+AAAAPgAAAFgAAABYAAAAWAAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAAAAAAAWAAAAFgAAABYAAAAPgAAAD4AAABYAAAAWAAAAFgAAABYAAAAOwAAADcAAAA7AAAAWAAAADsAAAA3AAAAAAAAAFcAAAAlAAAAPgAAAD4AAAM+AAACPgAAAyUAAABXAAAAWAAAADsAAAA3AAAAOwAAACgAAAA7AAAANwAAAA== 0,-4: ind: 0,-4 tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOwAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7AAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOwAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== @@ -247,7 +247,6 @@ entities: type: Fixtures - gravityShakeSound: !type:SoundPathSpecifier path: /Audio/Effects/alert.ogg - enabled: True type: Gravity - chunkCollection: -1,-1: @@ -3855,18 +3854,10 @@ entities: color: '#FFFFFFFF' id: Grasse2 coordinates: -13.997947,-48.558342 - 375: - color: '#FFFFFFFF' - id: Flowersbr3 - coordinates: -14.013572,-46.714592 376: color: '#FFFFFFFF' id: Flowersy4 coordinates: -13.997947,-48.917717 - 377: - color: '#FFFFFFFF' - id: Bushi4 - coordinates: -14.013572,-46.261467 378: color: '#FFFFFFFF' id: Bushi3 @@ -5148,7 +5139,7 @@ entities: 4,-7: 2 4,-6: 2 5,-10: 0 - 5,-4: 0 + 5,-4: 4 5,-3: 0 6,-2: 0 6,-1: 0 @@ -6601,7 +6592,7 @@ entities: 5,24: 0 5,25: 0 5,26: 0 - 5,27: 4 + 5,27: 5 5,28: 1 5,29: 0 5,30: 0 @@ -6895,7 +6886,7 @@ entities: -16,-14: 1 -15,-14: 0 -14,-14: 0 - -13,-14: 5 + -13,-14: 6 -12,-14: 0 -11,-14: 0 -10,-14: 0 @@ -7416,7 +7407,7 @@ entities: 21,27: 0 21,28: 0 21,29: 0 - 22,16: 6 + 22,16: 7 22,17: 0 22,18: 0 22,19: 0 @@ -7524,7 +7515,7 @@ entities: 27,12: 0 27,13: 1 27,14: 0 - 27,15: 7 + 27,15: 4 28,12: 0 28,13: 0 28,14: 0 @@ -7560,7 +7551,7 @@ entities: 2,55: 0 2,56: 0 3,48: 0 - 3,49: 0 + 3,49: 4 3,50: 0 3,51: 0 3,52: 0 @@ -11727,7 +11718,7 @@ entities: -37,31: 0 -36,23: 0 -36,24: 0 - -36,25: 0 + -36,25: 4 -36,26: 0 -36,27: 0 -36,28: 0 @@ -12624,8 +12615,8 @@ entities: - volume: 2500 temperature: 293.15 moles: - - 18.405577 - - 69.24003 + - 17.89022 + - 67.30131 - 0 - 0 - 0 @@ -12654,8 +12645,23 @@ entities: - volume: 2500 temperature: 235 moles: - - 18.405577 - - 69.24003 + - 17.89022 + - 67.30131 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - volume: 2500 + temperature: 293.15 + moles: + - 21.213781 + - 79.80423 - 0 - 0 - 0 @@ -12699,23 +12705,8 @@ entities: - volume: 2500 temperature: 293.15 moles: - - 15.521976 - - 58.3922 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 293.15 - moles: - - 21.213781 - - 79.80423 + - 14.664915 + - 55.168015 - 0 - 0 - 0 @@ -12896,8 +12887,13 @@ entities: type: BecomesStation - type: OccluderTree - type: Shuttle - - type: GridPathfinding + - nextUpdate: 2220.8615545 + type: GridPathfinding - type: RadiationGridResistance + - nextShake: 0 + shakeTimes: 10 + type: GravityShake + - type: GasTileOverlay - uid: 1 type: WallSolid components: @@ -16065,7 +16061,7 @@ entities: components: - type: MetaData - type: Transform - - index: 8 + - index: 4 type: Map - type: PhysicsMap - type: Broadphase @@ -18282,13 +18278,15 @@ entities: parent: 0 type: Transform - uid: 732 - type: OxygenCanister + type: VendingMachineTankDispenserEVA components: + - flags: SessionSpecific + type: MetaData - pos: 9.5,14.5 parent: 0 type: Transform - uid: 733 - type: WeldingFuelTankFull + type: OxygenCanister components: - pos: 9.5,17.5 parent: 0 @@ -19314,14 +19312,12 @@ entities: - color: '#0335FCFF' type: AtmosPipeColor - uid: 865 - type: GasVentScrubber + type: CarpetGreen components: - rot: 1.5707963267948966 rad - pos: -2.5,4.5 + pos: -3.5,4.5 parent: 0 type: Transform - - color: '#FF1212FF' - type: AtmosPipeColor - uid: 866 type: GasPipeStraight components: @@ -21037,9 +21033,11 @@ entities: parent: 0 type: Transform - uid: 1124 - type: Table + type: VendingMachineChefvend components: - - pos: 5.5,-3.5 + - flags: SessionSpecific + type: MetaData + - pos: 3.5,-3.5 parent: 0 type: Transform - uid: 1125 @@ -29804,6 +29802,8 @@ entities: - uid: 2456 type: AirlockCommandGlassLocked components: + - name: AI Sat + type: MetaData - pos: 4.5,32.5 parent: 0 type: Transform @@ -30039,17 +30039,19 @@ entities: - fixtures: [] type: Fixtures - uid: 2492 - type: Windoor + type: CrateNPCCow components: - - pos: 10.5,30.5 + - pos: 5.5,-3.5 parent: 0 type: Transform - uid: 2493 - type: Windoor + type: FaxMachineBase components: - - pos: -15.5,29.5 + - pos: 20.5,21.5 parent: 0 type: Transform + - name: Cargo + type: FaxMachine - uid: 2494 type: SoapDeluxe components: @@ -31356,7 +31358,7 @@ entities: - uid: 2685 type: BoxFolderBlue components: - - pos: -1.4733105,34.577606 + - pos: 1.5282507,34.656113 parent: 0 type: Transform - uid: 2686 @@ -36455,9 +36457,9 @@ entities: parent: 0 type: Transform - uid: 3412 - type: CrateNPCCow + type: JetpackMini components: - - pos: 3.5,-3.5 + - pos: 17.49418,49.5522 parent: 0 type: Transform - uid: 3413 @@ -36706,9 +36708,9 @@ entities: parent: 0 type: Transform - uid: 3453 - type: Windoor + type: WelderIndustrialAdvanced components: - - pos: 19.5,36.5 + - pos: 35.616592,-30.437298 parent: 0 type: Transform - uid: 3454 @@ -37662,9 +37664,9 @@ entities: parent: 0 type: Transform - uid: 3611 - type: MedkitCombatFilled + type: DrinkLithiumFlask components: - - pos: 17.551802,49.386093 + - pos: -18.350801,33.411205 parent: 0 type: Transform - uid: 3612 @@ -38040,15 +38042,15 @@ entities: parent: 0 type: Transform - uid: 3674 - type: ClothingHandsGlovesRobohands + type: ClosetFireFilled components: - - pos: 4.4398556,50.62741 + - pos: 3.5,49.5 parent: 0 type: Transform - uid: 3675 type: FoodBurgerRobot components: - - pos: 6.5072346,44.398685 + - pos: 5.460861,44.505184 parent: 0 type: Transform - uid: 3676 @@ -38058,15 +38060,15 @@ entities: parent: 0 type: Transform - uid: 3677 - type: DrinkBeepskySmashGlass + type: FireExtinguisher components: - - pos: 3.5142555,50.455536 + - pos: 3.3851929,50.52095 parent: 0 type: Transform - uid: 3678 - type: ClothingHeadHatCardborg + type: WaterTankHighCapacity components: - - pos: 4.4840555,51.48844 + - pos: 4.5,51.5 parent: 0 type: Transform - uid: 3679 @@ -40101,21 +40103,21 @@ entities: - powerLoad: 0 type: ApcPowerReceiver - uid: 3975 - type: ClothingOuterVestKevlar + type: FireExtinguisher components: - - pos: 17.567427,49.417343 + - pos: 3.6195679,50.3647 parent: 0 type: Transform - uid: 3976 - type: ClothingShoesBootsJack + type: AsteroidRock components: - - pos: 17.490387,49.33922 + - pos: -36.5,27.5 parent: 0 type: Transform - uid: 3977 - type: MaintenanceWeaponSpawner + type: IntercomService components: - - pos: 3.5,49.5 + - pos: -22.5,-5.5 parent: 0 type: Transform - uid: 3978 @@ -42000,9 +42002,10 @@ entities: - color: '#0335FCFF' type: AtmosPipeColor - uid: 4232 - type: RockGuitarInstrument + type: IntercomService components: - - pos: -36.752556,25.675106 + - rot: 3.141592653589793 rad + pos: 7.5,5.5 parent: 0 type: Transform - uid: 4233 @@ -44860,27 +44863,30 @@ entities: parent: 0 type: Transform - uid: 4673 - type: ReinforcedWindow + type: IntercomService components: - - pos: -7.5,-48.5 + - rot: -1.5707963267948966 rad + pos: 8.5,-0.5 parent: 0 type: Transform - uid: 4674 - type: ReinforcedWindow + type: IntercomService components: - - pos: -7.5,-47.5 + - pos: -12.5,-4.5 parent: 0 type: Transform - uid: 4675 - type: ReinforcedWindow + type: WindowReinforcedDirectional components: - - pos: -7.5,-46.5 + - rot: 1.5707963267948966 rad + pos: -8.5,-45.5 parent: 0 type: Transform - uid: 4676 - type: ReinforcedWindow + type: WindowReinforcedDirectional components: - - pos: -7.5,-45.5 + - rot: 1.5707963267948966 rad + pos: -8.5,-46.5 parent: 0 type: Transform - uid: 4677 @@ -45052,29 +45058,85 @@ entities: parent: 0 type: Transform - uid: 4705 - type: ReinforcedWindow + type: WindowReinforcedDirectional components: - - pos: -14.5,-48.5 + - rot: 1.5707963267948966 rad + pos: -8.5,-47.5 parent: 0 type: Transform - uid: 4706 - type: ReinforcedWindow + type: WindowReinforcedDirectional components: - - pos: -14.5,-47.5 + - rot: 1.5707963267948966 rad + pos: -8.5,-48.5 parent: 0 type: Transform - uid: 4707 - type: ReinforcedWindow + type: AirlockGlassShuttle components: - - pos: -14.5,-46.5 + - rot: 1.5707963267948966 rad + pos: -7.5,-50.5 parent: 0 type: Transform + - fixtures: + - density: 100 + shape: !type:PolygonShape + vertices: + - 0.49,-0.49 + - 0.49,0.49 + - -0.49,0.49 + - -0.49,-0.49 + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - Opaque + - shape: !type:PhysShapeCircle + position: 0,-0.5 + radius: 0.2 + hard: False + id: docking + type: Fixtures - uid: 4708 - type: ReinforcedWindow + type: AirlockExternalGlassShuttleLocked components: - - pos: -14.5,-45.5 + - rot: 1.5707963267948966 rad + pos: 1.5,-43.5 parent: 0 type: Transform + - fixtures: + - density: 100 + shape: !type:PolygonShape + vertices: + - 0.49,-0.49 + - 0.49,0.49 + - -0.49,0.49 + - -0.49,-0.49 + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - Opaque + - shape: !type:PhysShapeCircle + position: 0,-0.5 + radius: 0.2 + hard: False + id: docking + type: Fixtures - uid: 4709 type: ReinforcedWindow components: @@ -45100,11 +45162,38 @@ entities: parent: 0 type: Transform - uid: 4713 - type: AirlockExternalGlass + type: AirlockExternalGlassShuttleLocked components: - - pos: -7.5,-50.5 + - rot: 1.5707963267948966 rad + pos: 1.5,-50.5 parent: 0 type: Transform + - fixtures: + - density: 100 + shape: !type:PolygonShape + vertices: + - 0.49,-0.49 + - 0.49,0.49 + - -0.49,0.49 + - -0.49,-0.49 + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - Opaque + - shape: !type:PhysShapeCircle + position: 0,-0.5 + radius: 0.2 + hard: False + id: docking + type: Fixtures - uid: 4714 type: AirlockGlass components: @@ -45118,15 +45207,42 @@ entities: parent: 0 type: Transform - uid: 4716 - type: AirlockExternalGlassLocked + type: AirlockGlassShuttle components: - - pos: -14.5,-50.5 + - rot: 1.5707963267948966 rad + pos: -7.5,-43.5 parent: 0 type: Transform + - fixtures: + - density: 100 + shape: !type:PolygonShape + vertices: + - 0.49,-0.49 + - 0.49,0.49 + - -0.49,0.49 + - -0.49,-0.49 + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - Opaque + - shape: !type:PhysShapeCircle + position: 0,-0.5 + radius: 0.2 + hard: False + id: docking + type: Fixtures - uid: 4717 - type: AirlockExternalGlassLocked + type: IntercomMedical components: - - pos: -14.5,-43.5 + - pos: -15.5,-14.5 parent: 0 type: Transform - uid: 4718 @@ -45136,9 +45252,10 @@ entities: parent: 0 type: Transform - uid: 4719 - type: AirlockExternalGlass + type: IntercomMedical components: - - pos: -7.5,-43.5 + - rot: 1.5707963267948966 rad + pos: -23.5,-24.5 parent: 0 type: Transform - uid: 4720 @@ -45238,27 +45355,83 @@ entities: parent: 0 type: Transform - uid: 4736 - type: Grille + type: AirlockExternalGlassShuttleLocked components: - - pos: -7.5,-48.5 + - rot: -1.5707963267948966 rad + pos: -14.5,-43.5 parent: 0 type: Transform + - fixtures: + - density: 100 + shape: !type:PolygonShape + vertices: + - 0.49,-0.49 + - 0.49,0.49 + - -0.49,0.49 + - -0.49,-0.49 + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - Opaque + - shape: !type:PhysShapeCircle + position: 0,-0.5 + radius: 0.2 + hard: False + id: docking + type: Fixtures - uid: 4737 - type: Grille + type: AirlockExternalGlassShuttleLocked components: - - pos: -7.5,-47.5 + - rot: -1.5707963267948966 rad + pos: -14.5,-50.5 parent: 0 type: Transform + - fixtures: + - density: 100 + shape: !type:PolygonShape + vertices: + - 0.49,-0.49 + - 0.49,0.49 + - -0.49,0.49 + - -0.49,-0.49 + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - Opaque + - shape: !type:PhysShapeCircle + position: 0,-0.5 + radius: 0.2 + hard: False + id: docking + type: Fixtures - uid: 4738 - type: Grille + type: WindowReinforcedDirectional components: - - pos: -7.5,-46.5 + - rot: -1.5707963267948966 rad + pos: -13.5,-48.5 parent: 0 type: Transform - uid: 4739 - type: Grille + type: WindowReinforcedDirectional components: - - pos: -7.5,-45.5 + - rot: -1.5707963267948966 rad + pos: -13.5,-47.5 parent: 0 type: Transform - uid: 4740 @@ -45346,27 +45519,31 @@ entities: parent: 0 type: Transform - uid: 4754 - type: Grille + type: WindowReinforcedDirectional components: - - pos: -14.5,-45.5 + - rot: -1.5707963267948966 rad + pos: -13.5,-46.5 parent: 0 type: Transform - uid: 4755 - type: Grille + type: WindowReinforcedDirectional components: - - pos: -14.5,-46.5 + - rot: -1.5707963267948966 rad + pos: -13.5,-45.5 parent: 0 type: Transform - uid: 4756 - type: Grille + type: ShuttleWindow components: - - pos: -14.5,-47.5 + - rot: -1.5707963267948966 rad + pos: -1.5,-52.5 parent: 0 type: Transform - uid: 4757 - type: Grille + type: ShuttleWindow components: - - pos: -14.5,-48.5 + - rot: -1.5707963267948966 rad + pos: -3.5,-52.5 parent: 0 type: Transform - uid: 4758 @@ -45821,15 +45998,17 @@ entities: parent: 0 type: Transform - uid: 4833 - type: ReinforcedWindow + type: IntercomCommand components: - - pos: -3.5,-52.5 + - rot: 1.5707963267948966 rad + pos: -27.5,-26.5 parent: 0 type: Transform - uid: 4834 - type: ReinforcedWindow + type: IntercomCommand components: - - pos: -1.5,-52.5 + - rot: -1.5707963267948966 rad + pos: 29.5,-19.5 parent: 0 type: Transform - uid: 4835 @@ -45909,115 +46088,106 @@ entities: parent: 0 type: Transform - uid: 4847 - type: WindowReinforcedDirectional + type: IntercomCommand components: - - rot: -1.5707963267948966 rad - pos: -6.5,-48.5 + - pos: 6.5,30.5 parent: 0 type: Transform - uid: 4848 - type: WindowReinforcedDirectional + type: IntercomCommand components: - - rot: -1.5707963267948966 rad - pos: -6.5,-47.5 + - pos: 17.5,36.5 parent: 0 type: Transform - uid: 4849 - type: WindowReinforcedDirectional + type: IntercomSupply components: - rot: -1.5707963267948966 rad - pos: -6.5,-46.5 + pos: 21.5,20.5 parent: 0 type: Transform - uid: 4850 - type: WindowReinforcedDirectional + type: IntercomAll components: - - rot: -1.5707963267948966 rad - pos: -6.5,-45.5 + - rot: 3.141592653589793 rad + pos: 1.5,31.5 parent: 0 type: Transform - uid: 4851 - type: WindowReinforcedDirectional + type: IntercomAll components: - rot: 1.5707963267948966 rad - pos: -6.5,-45.5 + pos: -16.5,23.5 parent: 0 type: Transform - uid: 4852 - type: WindowReinforcedDirectional + type: IntercomMedical components: - - rot: 1.5707963267948966 rad - pos: -6.5,-46.5 + - rot: -1.5707963267948966 rad + pos: -35.5,-35.5 parent: 0 type: Transform - uid: 4853 - type: WindowReinforcedDirectional + type: IntercomCommand components: - - rot: 1.5707963267948966 rad - pos: -6.5,-47.5 + - pos: -19.5,26.5 parent: 0 type: Transform - uid: 4854 - type: WindowReinforcedDirectional + type: IntercomSecurity components: - - rot: 1.5707963267948966 rad - pos: -6.5,-48.5 + - rot: 3.141592653589793 rad + pos: -35.5,9.5 parent: 0 type: Transform - uid: 4855 - type: WindowReinforcedDirectional + type: ShuttleWindow components: - - rot: -1.5707963267948966 rad - pos: 1.5,-48.5 + - pos: 1.5,-45.5 parent: 0 type: Transform - uid: 4856 - type: WindowReinforcedDirectional + type: ShuttleWindow components: - - rot: -1.5707963267948966 rad - pos: 1.5,-47.5 + - pos: 1.5,-46.5 parent: 0 type: Transform - uid: 4857 - type: WindowReinforcedDirectional + type: ShuttleWindow components: - - rot: -1.5707963267948966 rad - pos: 1.5,-46.5 + - pos: 1.5,-47.5 parent: 0 type: Transform - uid: 4858 - type: WindowReinforcedDirectional + type: ShuttleWindow components: - - rot: -1.5707963267948966 rad - pos: 1.5,-45.5 + - pos: 1.5,-48.5 parent: 0 type: Transform - uid: 4859 - type: WindowReinforcedDirectional + type: ShuttleWindow components: - - rot: 1.5707963267948966 rad - pos: 1.5,-45.5 + - pos: -6.5,-45.5 parent: 0 type: Transform - uid: 4860 - type: WindowReinforcedDirectional + type: ShuttleWindow components: - - rot: 1.5707963267948966 rad - pos: 1.5,-46.5 + - pos: -6.5,-46.5 parent: 0 type: Transform - uid: 4861 - type: WindowReinforcedDirectional + type: WallShuttle components: - - rot: 1.5707963267948966 rad - pos: 1.5,-47.5 + - rot: -1.5707963267948966 rad + pos: -5.5,-40.5 parent: 0 type: Transform - uid: 4862 - type: WindowReinforcedDirectional + type: WallShuttle components: - - rot: 1.5707963267948966 rad - pos: 1.5,-48.5 + - rot: -1.5707963267948966 rad + pos: 0.5,-40.5 parent: 0 type: Transform - uid: 4863 @@ -46091,51 +46261,57 @@ entities: parent: 0 type: Transform - uid: 4866 - type: WallSolid + type: WallShuttle components: - - pos: -6.5,-40.5 + - rot: -1.5707963267948966 rad + pos: -2.5,-39.5 parent: 0 type: Transform - uid: 4867 - type: WallSolid + type: WallShuttle components: - - pos: -5.5,-40.5 + - rot: -1.5707963267948966 rad + pos: -2.5,-40.5 parent: 0 type: Transform - uid: 4868 - type: WallSolid + type: WallShuttle components: - - pos: -2.5,-40.5 + - rot: -1.5707963267948966 rad + pos: -6.5,-40.5 parent: 0 type: Transform - uid: 4869 - type: WallSolid + type: WallShuttle components: - - pos: -2.5,-39.5 + - rot: -1.5707963267948966 rad + pos: 1.5,-40.5 parent: 0 type: Transform - uid: 4870 - type: WallSolid + type: ShuttleWindow components: - - pos: 0.5,-40.5 + - pos: -6.5,-47.5 parent: 0 type: Transform - uid: 4871 - type: WallSolid + type: ShuttleWindow components: - - pos: 1.5,-40.5 + - pos: -6.5,-48.5 parent: 0 type: Transform - uid: 4872 - type: ReinforcedWindow + type: ShuttleWindow components: - - pos: 1.5,-43.5 + - rot: -1.5707963267948966 rad + pos: -4.5,-41.5 parent: 0 type: Transform - uid: 4873 - type: ReinforcedWindow + type: ShuttleWindow components: - - pos: 1.5,-50.5 + - rot: -1.5707963267948966 rad + pos: -3.5,-41.5 parent: 0 type: Transform - uid: 4874 @@ -46536,27 +46712,31 @@ entities: parent: 0 type: Transform - uid: 4933 - type: ReinforcedWindow + type: ShuttleWindow components: - - pos: -4.5,-41.5 + - rot: -1.5707963267948966 rad + pos: -1.5,-41.5 parent: 0 type: Transform - uid: 4934 - type: ReinforcedWindow + type: ShuttleWindow components: - - pos: -3.5,-41.5 + - rot: -1.5707963267948966 rad + pos: -0.5,-41.5 parent: 0 type: Transform - uid: 4935 - type: ReinforcedWindow + type: Intercom components: - - pos: -1.5,-41.5 + - rot: -1.5707963267948966 rad + pos: -9.5,-40.5 parent: 0 type: Transform - uid: 4936 - type: ReinforcedWindow + type: IntercomMedical components: - - pos: -0.5,-41.5 + - rot: 3.141592653589793 rad + pos: -10.5,-23.5 parent: 0 type: Transform - uid: 4937 @@ -47104,21 +47284,23 @@ entities: parent: 0 type: Transform - uid: 5025 - type: WindowReinforcedDirectional + type: Intercom components: - - pos: -3.5,-40.5 + - rot: 3.141592653589793 rad + pos: -4.5,-52.5 parent: 0 type: Transform - uid: 5026 - type: WindowReinforcedDirectional + type: BlockGameArcade components: - - pos: -4.5,-40.5 + - rot: -1.5707963267948966 rad + pos: -9.5,-47.5 parent: 0 type: Transform - uid: 5027 - type: WindowReinforcedDirectional + type: WallReinforced components: - - pos: -0.5,-40.5 + - pos: -38.5,19.5 parent: 0 type: Transform - uid: 5028 @@ -47146,9 +47328,9 @@ entities: parent: 0 type: Transform - uid: 5032 - type: WindowReinforcedDirectional + type: AsteroidRock components: - - pos: -1.5,-40.5 + - pos: -36.5,32.5 parent: 0 type: Transform - uid: 5033 @@ -48257,9 +48439,9 @@ entities: - color: '#FF1212FF' type: AtmosPipeColor - uid: 5174 - type: WallReinforced + type: AirlockCommandLocked components: - - pos: -38.5,19.5 + - pos: -24.5,23.5 parent: 0 type: Transform - uid: 5175 @@ -55739,11 +55921,14 @@ entities: - powerLoad: 0 type: ApcPowerReceiver - uid: 6280 - type: ClothingUniformJumpsuitNanotrasen + type: PoweredSmallLight components: - - pos: -36.536194,32.49803 + - rot: 1.5707963267948966 rad + pos: -31.5,24.5 parent: 0 type: Transform + - powerLoad: 0 + type: ApcPowerReceiver - uid: 6281 type: PoweredSmallLight components: @@ -55816,9 +56001,19 @@ entities: - uid: 6291 type: Lamp components: - - pos: 25.611652,-17.593801 + - pos: 25.537617,-17.441427 parent: 0 type: Transform + - toggleAction: + icon: + sprite: Objects/Tools/flashlight.rsi + state: flashlight + iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png + name: action-name-toggle-light + description: action-description-toggle-light + keywords: [] + event: !type:ToggleActionEvent {} + type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot {} cell_slot: !type:ContainerSlot {} @@ -64998,9 +65193,9 @@ entities: parent: 0 type: Transform - uid: 7655 - type: WallReinforced + type: KvassTankFull components: - - pos: -24.5,23.5 + - pos: -17.5,33.5 parent: 0 type: Transform - uid: 7656 @@ -68987,9 +69182,10 @@ entities: - fixtures: [] type: Fixtures - uid: 8246 - type: Windoor + type: CarpetGreen components: - - pos: -19.5,29.5 + - rot: 1.5707963267948966 rad + pos: -3.5,5.5 parent: 0 type: Transform - uid: 8247 @@ -70225,13 +70421,11 @@ entities: stash: !type:ContainerSlot {} type: ContainerContainer - uid: 8415 - type: Poweredlight + type: MaterialWoodPlank components: - - pos: -28.5,24.5 + - pos: -49.460716,-16.464205 parent: 0 type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - uid: 8416 type: Poweredlight components: @@ -70680,9 +70874,9 @@ entities: parent: 0 type: Transform - uid: 8482 - type: BoxShotgunFlare + type: Barricade components: - - pos: -17.573923,33.53872 + - pos: -50.5,-16.5 parent: 0 type: Transform - uid: 8483 @@ -83175,21 +83369,21 @@ entities: parent: 0 type: Transform - uid: 10440 - type: IHSVoidsuit + type: Grille components: - - pos: -48.497345,-16.462507 + - pos: -13.5,-59.5 parent: 0 type: Transform - uid: 10441 - type: AsteroidRock + type: Grille components: - - pos: -49.5,-16.5 + - pos: -14.5,-59.5 parent: 0 type: Transform - uid: 10442 - type: AsteroidRock + type: Grille components: - - pos: -50.5,-16.5 + - pos: -12.5,-59.5 parent: 0 type: Transform - uid: 10443 @@ -83205,15 +83399,16 @@ entities: parent: 0 type: Transform - uid: 10445 - type: AsteroidRock + type: RandomArtifactSpawner components: - - pos: -53.5,-16.5 + - pos: -52.5,-17.5 parent: 0 type: Transform - uid: 10446 - type: MedkitO2 + type: CarpetGreen components: - - pos: -54.49649,-16.63995 + - rot: 1.5707963267948966 rad + pos: -1.5,5.5 parent: 0 type: Transform - uid: 10447 @@ -83235,15 +83430,15 @@ entities: parent: 0 type: Transform - uid: 10450 - type: AsteroidRock + type: FloraTreeChristmas02 components: - - pos: -53.5,-17.5 + - pos: -2.5523157,5.454746 parent: 0 type: Transform - uid: 10451 - type: AsteroidRock + type: SalvageMaterialCrateSpawner components: - - pos: -52.5,-17.5 + - pos: -52.5,-19.5 parent: 0 type: Transform - uid: 10452 @@ -83289,15 +83484,15 @@ entities: parent: 0 type: Transform - uid: 10459 - type: AsteroidRock + type: BannerRevolution components: - - pos: -52.5,-18.5 + - pos: -57.5,-12.5 parent: 0 type: Transform - uid: 10460 type: AsteroidRock components: - - pos: -53.5,-18.5 + - pos: -35.5,29.5 parent: 0 type: Transform - uid: 10461 @@ -83313,9 +83508,9 @@ entities: parent: 0 type: Transform - uid: 10463 - type: CrateFilledSpawner + type: AsteroidRock components: - - pos: -52.5,-19.5 + - pos: -36.5,28.5 parent: 0 type: Transform - uid: 10464 @@ -83381,7 +83576,7 @@ entities: - uid: 10474 type: AsteroidRock components: - - pos: -57.5,-12.5 + - pos: -35.5,28.5 parent: 0 type: Transform - uid: 10475 @@ -86569,9 +86764,9 @@ entities: parent: 0 type: Transform - uid: 10946 - type: AsteroidRock + type: GeneratorRTG components: - - pos: -34.5,25.5 + - pos: -40.5,22.5 parent: 0 type: Transform - uid: 10947 @@ -86649,7 +86844,7 @@ entities: - uid: 10959 type: ShuttleConsoleCircuitboard components: - - pos: -35.561836,29.400969 + - pos: -34.25,25.263674 parent: 0 type: Transform - uid: 10960 @@ -86659,15 +86854,15 @@ entities: parent: 0 type: Transform - uid: 10961 - type: AsteroidRock + type: FloorTileItemShuttleWhite components: - - pos: -35.5,26.5 + - pos: -35.581154,26.501883 parent: 0 type: Transform - uid: 10962 - type: AsteroidRock + type: FloorTileItemShuttleWhite components: - - pos: -35.5,25.5 + - pos: -35.581154,26.501883 parent: 0 type: Transform - uid: 10963 @@ -86701,9 +86896,9 @@ entities: parent: 0 type: Transform - uid: 10968 - type: GeneratorUranium + type: ClothingUniformJumpsuitPsychologist components: - - pos: -40.5,23.5 + - pos: -36.533836,29.489151 parent: 0 type: Transform - uid: 10969 @@ -86773,27 +86968,27 @@ entities: parent: 0 type: Transform - uid: 10980 - type: CableApcStack1 + type: CultAltarSpawner components: - - pos: -37.32746,25.213469 + - pos: -36.5,30.5 parent: 0 type: Transform - uid: 10981 - type: CableMVStack + type: FloorTileItemShuttleWhite components: - - pos: -36.10871,28.338469 + - pos: -35.581154,26.501883 parent: 0 type: Transform - uid: 10982 type: AsteroidRock components: - - pos: -36.5,29.5 + - pos: -40.5,23.5 parent: 0 type: Transform - uid: 10983 type: AsteroidRock components: - - pos: -36.5,30.5 + - pos: -39.5,18.5 parent: 0 type: Transform - uid: 10984 @@ -86871,7 +87066,7 @@ entities: - uid: 10996 type: ClothingOuterHardsuitEVAPrisoner components: - - pos: -25.468088,24.650969 + - pos: -31.569149,26.70803 parent: 0 type: Transform - uid: 10997 @@ -86881,9 +87076,9 @@ entities: parent: 0 type: Transform - uid: 10998 - type: AsteroidRock + type: KitchenKnife components: - - pos: -38.5,25.5 + - pos: -36.20571,29.520401 parent: 0 type: Transform - uid: 10999 @@ -86979,13 +87174,13 @@ entities: - uid: 11014 type: AsteroidRock components: - - pos: -40.5,22.5 + - pos: -37.5,24.5 parent: 0 type: Transform - uid: 11015 - type: ClothingShoesSpaceNinja + type: ClothingMaskGasExplorer components: - - pos: -39.476425,18.487703 + - pos: 35.488716,-30.534061 parent: 0 type: Transform - uid: 11016 @@ -88578,9 +88773,9 @@ entities: parent: 0 type: Transform - uid: 11262 - type: ClothingMaskGasExplorer + type: OrganHumanBrain components: - - pos: -35.455574,27.420141 + - pos: -53.301483,-16.086002 parent: 0 type: Transform - uid: 11263 @@ -91108,15 +91303,18 @@ entities: cell_slot: !type:ContainerSlot {} type: ContainerContainer - uid: 11674 - type: MachineFrameDestroyed + type: PoweredSmallLight components: - - pos: -37.5,24.5 + - rot: -1.5707963267948966 rad + pos: -25.5,24.5 parent: 0 type: Transform + - powerLoad: 0 + type: ApcPowerReceiver - uid: 11675 type: ClothingHeadHatPirate components: - - pos: -18.620798,33.51112 + - pos: -17.677834,32.905758 parent: 0 type: Transform - uid: 11676 @@ -91192,9 +91390,10 @@ entities: parent: 0 type: Transform - uid: 11688 - type: ClothingNeckCloakMiner + type: AtmosDeviceFanTiny components: - - pos: 35.51915,-30.467968 + - rot: -1.5707963267948966 rad + pos: 1.5,-43.5 parent: 0 type: Transform - uid: 11689 @@ -91562,9 +91761,10 @@ entities: cell_slot: !type:ContainerSlot {} type: ContainerContainer - uid: 11745 - type: ClothingHandsGlovesIhscombat + type: AtmosDeviceFanTiny components: - - pos: -48.517,-16.613438 + - rot: -1.5707963267948966 rad + pos: 1.5,-50.5 parent: 0 type: Transform - uid: 11746 @@ -92715,14 +92915,11 @@ entities: - powerLoad: 0 type: ApcPowerReceiver - uid: 11925 - type: Poweredlight + type: DisposalUnit components: - - rot: -1.5707963267948966 rad - pos: -25.5,23.5 + - pos: 6.5,32.5 parent: 0 type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - uid: 11926 type: Poweredlight components: @@ -96052,7 +96249,7 @@ entities: - 1937 - 818 - 815 - - 865 + - invalid - 817 - 816 - 864 @@ -96287,15 +96484,16 @@ entities: - 5225 type: DeviceList - uid: 12323 - type: AtmosDeviceFanTiny + type: ComputerTechnologyDiskTerminal components: - - pos: -6.5,-43.5 + - pos: 5.5,-14.5 parent: 0 type: Transform - uid: 12324 - type: AtmosDeviceFanTiny + type: IntercomCommand components: - - pos: -6.5,-50.5 + - rot: 1.5707963267948966 rad + pos: -51.5,-8.5 parent: 0 type: Transform - uid: 12325 @@ -96839,4 +97037,496 @@ entities: type: Transform - name: Bridge type: FaxMachine +- uid: 12389 + type: IntercomEngineering + components: + - rot: -1.5707963267948966 rad + pos: -43.5,-9.5 + parent: 0 + type: Transform +- uid: 12390 + type: IntercomEngineering + components: + - rot: 3.141592653589793 rad + pos: -43.5,-0.5 + parent: 0 + type: Transform +- uid: 12391 + type: Intercom + components: + - pos: -17.5,3.5 + parent: 0 + type: Transform +- uid: 12392 + type: Intercom + components: + - pos: 5.5,23.5 + parent: 0 + type: Transform +- uid: 12393 + type: Intercom + components: + - rot: -1.5707963267948966 rad + pos: 26.5,-5.5 + parent: 0 + type: Transform +- uid: 12394 + type: IntercomScience + components: + - rot: 1.5707963267948966 rad + pos: 8.5,-18.5 + parent: 0 + type: Transform +- uid: 12395 + type: IntercomScience + components: + - rot: -1.5707963267948966 rad + pos: 30.5,-23.5 + parent: 0 + type: Transform +- uid: 12396 + type: Intercom + components: + - rot: 1.5707963267948966 rad + pos: -6.5,1.5 + parent: 0 + type: Transform +- uid: 12397 + type: Intercom + components: + - pos: -4.5,21.5 + parent: 0 + type: Transform +- uid: 12398 + type: AirCanister + components: + - pos: -34.5,-3.5 + parent: 0 + type: Transform +- uid: 12399 + type: AirCanister + components: + - pos: -34.5,-2.5 + parent: 0 + type: Transform +- uid: 12400 + type: IntercomCommand + components: + - pos: 11.5,54.5 + parent: 0 + type: Transform +- uid: 12401 + type: DisposalPipe + components: + - rot: 3.141592653589793 rad + pos: 6.5,33.5 + parent: 0 + type: Transform +- uid: 12402 + type: DisposalUnit + components: + - pos: 6.5,44.5 + parent: 0 + type: Transform +- uid: 12403 + type: DisposalTrunk + components: + - pos: 6.5,44.5 + parent: 0 + type: Transform +- uid: 12404 + type: DisposalTrunk + components: + - rot: 3.141592653589793 rad + pos: 6.5,32.5 + parent: 0 + type: Transform +- uid: 12405 + type: DisposalPipe + components: + - rot: 3.141592653589793 rad + pos: 6.5,34.5 + parent: 0 + type: Transform +- uid: 12406 + type: DisposalPipe + components: + - rot: 3.141592653589793 rad + pos: 6.5,35.5 + parent: 0 + type: Transform +- uid: 12407 + type: DisposalPipe + components: + - rot: 3.141592653589793 rad + pos: 6.5,36.5 + parent: 0 + type: Transform +- uid: 12408 + type: DisposalPipe + components: + - rot: 3.141592653589793 rad + pos: 6.5,37.5 + parent: 0 + type: Transform +- uid: 12409 + type: DisposalPipe + components: + - rot: 3.141592653589793 rad + pos: 6.5,38.5 + parent: 0 + type: Transform +- uid: 12410 + type: DisposalPipe + components: + - rot: 3.141592653589793 rad + pos: 6.5,39.5 + parent: 0 + type: Transform +- uid: 12411 + type: DisposalPipe + components: + - rot: 3.141592653589793 rad + pos: 6.5,40.5 + parent: 0 + type: Transform +- uid: 12412 + type: DisposalPipe + components: + - rot: 3.141592653589793 rad + pos: 6.5,41.5 + parent: 0 + type: Transform +- uid: 12413 + type: DisposalPipe + components: + - rot: 3.141592653589793 rad + pos: 6.5,42.5 + parent: 0 + type: Transform +- uid: 12414 + type: DisposalPipe + components: + - rot: 3.141592653589793 rad + pos: 6.5,43.5 + parent: 0 + type: Transform +- uid: 12415 + type: Grille + components: + - pos: -9.5,-59.5 + parent: 0 + type: Transform +- uid: 12416 + type: Grille + components: + - pos: -8.5,-59.5 + parent: 0 + type: Transform +- uid: 12417 + type: Grille + components: + - pos: -7.5,-59.5 + parent: 0 + type: Transform +- uid: 12418 + type: GasVentScrubber + components: + - rot: 1.5707963267948966 rad + pos: -2.5,4.5 + parent: 0 + type: Transform +- uid: 12419 + type: CarpetGreen + components: + - rot: 1.5707963267948966 rad + pos: -2.5,4.5 + parent: 0 + type: Transform +- uid: 12420 + type: CarpetGreen + components: + - rot: 1.5707963267948966 rad + pos: -2.5,5.5 + parent: 0 + type: Transform +- uid: 12421 + type: CarpetGreen + components: + - rot: 1.5707963267948966 rad + pos: -1.5,4.5 + parent: 0 + type: Transform +- uid: 12422 + type: TargetHuman + components: + - pos: -54.5,-16.5 + parent: 0 + type: Transform +- uid: 12423 + type: TorsoHuman + components: + - pos: -53.589386,-16.742252 + parent: 0 + type: Transform +- uid: 12424 + type: ClothingOuterHardsuitSpatio + components: + - pos: -52.87503,-18.445377 + parent: 0 + type: Transform +- uid: 12425 + type: MaintenanceWeaponSpawner + components: + - pos: -53.5,-18.5 + parent: 0 + type: Transform +- uid: 12426 + type: SpawnMobAlexander + components: + - pos: 6.5,-0.5 + parent: 0 + type: Transform +- uid: 12427 + type: CrateNPCHamlet + components: + - pos: -1.5,34.5 + parent: 0 + type: Transform +- uid: 12428 + type: FaxMachineBase + components: + - pos: -32.5,-15.5 + parent: 0 + type: Transform + - name: Library + type: FaxMachine +- uid: 12429 + type: ClothingNeckCloakMiner + components: + - pos: -48.41308,-16.456617 + parent: 0 + type: Transform +- uid: 12430 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12431 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12432 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12433 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12434 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12435 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12436 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12437 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12438 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12439 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12440 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12441 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12442 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12443 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12444 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12445 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12446 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12447 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12448 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12449 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12450 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12451 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12452 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.501883 + parent: 0 + type: Transform +- uid: 12453 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.517508 + parent: 0 + type: Transform +- uid: 12454 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.517508 + parent: 0 + type: Transform +- uid: 12455 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.517508 + parent: 0 + type: Transform +- uid: 12456 + type: FloorTileItemShuttleWhite + components: + - pos: -35.581154,26.517508 + parent: 0 + type: Transform +- uid: 12457 + type: ResearchDisk + components: + - pos: -35.5391,27.461937 + parent: 0 + type: Transform +- uid: 12458 + type: IngotGold1 + components: + - pos: -38.5391,25.681717 + parent: 0 + type: Transform +- uid: 12459 + type: IngotGold1 + components: + - pos: -38.5391,25.681717 + parent: 0 + type: Transform +- uid: 12460 + type: IngotGold1 + components: + - pos: -38.38285,25.619217 + parent: 0 + type: Transform +- uid: 12461 + type: IngotGold1 + components: + - pos: -38.2891,25.541092 + parent: 0 + type: Transform +- uid: 12462 + type: StorageCanister + components: + - pos: -36.5,26.5 + parent: 0 + type: Transform +- uid: 12463 + type: CrateScience + components: + - pos: -35.5,25.5 + parent: 0 + type: Transform +- uid: 12464 + type: MaintenanceToolSpawner + components: + - pos: -37.5,25.5 + parent: 0 + type: Transform +- uid: 12465 + type: ClothingShoesLeather + components: + - pos: -36.627586,29.207901 + parent: 0 + type: Transform +- uid: 12466 + type: DrinkLithiumFlask + components: + - pos: -18.56759,33.562008 + parent: 0 + type: Transform ... From b78ca238c69292c2b962fadab391f78e77a87e57 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 24 Dec 2022 12:37:58 +1100 Subject: [PATCH 06/30] Add parallel NPC steering back in (#13159) --- Content.Server/NPC/HTN/HTNSystem.cs | 14 ++++++++++++++ Content.Server/NPC/Systems/NPCSteeringSystem.cs | 13 ++++++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/Content.Server/NPC/HTN/HTNSystem.cs b/Content.Server/NPC/HTN/HTNSystem.cs index f0a0a13f33..5039419f9e 100644 --- a/Content.Server/NPC/HTN/HTNSystem.cs +++ b/Content.Server/NPC/HTN/HTNSystem.cs @@ -61,6 +61,20 @@ public sealed class HTNSystem : EntitySystem private void OnLoad() { + // Clear all NPCs in case they're hanging onto stale tasks + foreach (var comp in EntityQuery(true)) + { + comp.PlanningToken?.Cancel(); + comp.PlanningToken = null; + + if (comp.Plan != null) + { + var currentOperator = comp.Plan.CurrentOperator; + currentOperator.Shutdown(comp.Blackboard, HTNOperatorStatus.Failed); + comp.Plan = null; + } + } + // Add dependencies for all operators. // We put code on operators as I couldn't think of a clean way to put it on systems. foreach (var compound in _prototypeManager.EnumeratePrototypes()) diff --git a/Content.Server/NPC/Systems/NPCSteeringSystem.cs b/Content.Server/NPC/Systems/NPCSteeringSystem.cs index 3080ae28e6..a364556648 100644 --- a/Content.Server/NPC/Systems/NPCSteeringSystem.cs +++ b/Content.Server/NPC/Systems/NPCSteeringSystem.cs @@ -204,12 +204,19 @@ namespace Content.Server.NPC.Systems var npcs = EntityQuery() .ToArray(); - - foreach (var (steering, _, mover, xform) in npcs) + var options = new ParallelOptions { + MaxDegreeOfParallelism = _parallel.ParallelProcessCount, + }; + + Parallel.For(0, npcs.Length, options, i => + { + var (steering, _, mover, xform) = npcs[i]; + Steer(steering, mover, xform, modifierQuery, bodyQuery, xformQuery, frameTime); steering.LastSteer = mover.CurTickSprintMovement; - } + }); + if (_subscribedSessions.Count > 0) { From 4a37f7b917fd212a0c51373047aeaf6de145284c Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 24 Dec 2022 12:54:28 +1100 Subject: [PATCH 07/30] Adjust NPC steering a bit (#13162) --- Content.Server/NPC/Systems/NPCSteeringSystem.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Content.Server/NPC/Systems/NPCSteeringSystem.cs b/Content.Server/NPC/Systems/NPCSteeringSystem.cs index a364556648..db2105d394 100644 --- a/Content.Server/NPC/Systems/NPCSteeringSystem.cs +++ b/Content.Server/NPC/Systems/NPCSteeringSystem.cs @@ -41,7 +41,6 @@ namespace Content.Server.NPC.Systems [Dependency] private readonly IAdminManager _admin = default!; [Dependency] private readonly IConfigurationManager _configManager = default!; - [Dependency] private readonly IDependencyCollection _dependencies = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IParallelManager _parallel = default!; @@ -79,8 +78,8 @@ namespace Content.Server.NPC.Systems } UpdatesBefore.Add(typeof(SharedPhysicsSystem)); - _configManager.OnValueChanged(CCVars.NPCEnabled, SetNPCEnabled); - _configManager.OnValueChanged(CCVars.NPCPathfinding, SetNPCPathfinding); + _configManager.OnValueChanged(CCVars.NPCEnabled, SetNPCEnabled, true); + _configManager.OnValueChanged(CCVars.NPCPathfinding, SetNPCPathfinding, true); SubscribeLocalEvent(OnSteeringShutdown); SubscribeNetworkEvent(OnDebugRequest); @@ -90,9 +89,11 @@ namespace Content.Server.NPC.Systems { if (!obj) { - foreach (var (_, mover) in EntityQuery()) + foreach (var (comp, mover) in EntityQuery()) { mover.CurTickSprintMovement = Vector2.Zero; + comp.PathfindToken?.Cancel(); + comp.PathfindToken = null; } } @@ -117,6 +118,7 @@ namespace Content.Server.NPC.Systems { base.Shutdown(); _configManager.UnsubValueChanged(CCVars.NPCEnabled, SetNPCEnabled); + _configManager.UnsubValueChanged(CCVars.NPCPathfinding, SetNPCPathfinding); } private void OnDebugRequest(RequestNPCSteeringDebugEvent msg, EntitySessionEventArgs args) From 6c04811e66e46ef637d02cf09a1d41adcdc0d440 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Fri, 23 Dec 2022 23:55:31 -0500 Subject: [PATCH 08/30] remove a bunch of instances of component reference (#13164) --- Content.Client/Buckle/BuckleComponent.cs | 11 ---- Content.Client/Buckle/BuckleSystem.cs | 24 ++------ Content.Client/Buckle/Strap/StrapComponent.cs | 10 ---- .../CartridgeLoader/CartridgeLoaderSystem.cs | 7 --- .../UI/ConfigurationBoundUserInterface.cs | 2 +- .../Configurable/UI/ConfigurationMenu.cs | 2 +- .../Components/EnsnareableComponent.cs | 13 ----- .../Components/EnsnaringComponent.cs | 6 -- Content.Client/Ensnaring/EnsnareableSystem.cs | 2 +- .../Inventory/StrippableBoundUserInterface.cs | 2 +- .../Movement/Components/ClimbableComponent.cs | 9 --- .../Movement/Components/ClimbingComponent.cs | 9 --- .../Movement/Systems/ClimbSystem.cs | 5 +- .../Components/ContainmentFieldComponent.cs | 7 --- .../ContainmentFieldGeneratorComponent.cs | 6 -- .../Tests/Buckle/BuckleTest.cs | 2 +- .../Components/Movement/ClimbUnitTest.cs | 1 + .../Administration/Systems/AdminVerbSystem.cs | 3 +- Content.Server/Alert/Click/RemoveEnsnare.cs | 2 +- Content.Server/Bed/BedSystem.cs | 1 - .../Buckle/Components/BuckleComponent.cs | 38 ------------- .../Buckle/Components/StrapComponent.cs | 57 ------------------- .../Buckle/Systems/BuckleSystem.Buckle.cs | 2 - .../Buckle/Systems/BuckleSystem.Strap.cs | 1 - .../CartridgeLoaderComponent.cs | 18 ------ .../CartridgeLoader/CartridgeLoaderSystem.cs | 4 +- Content.Server/Climbing/ClimbSystem.cs | 12 ++-- .../Climbing/Components/ClimbableComponent.cs | 49 ---------------- .../Climbing/Components/ClimbingComponent.cs | 35 ------------ .../Configurable/ConfigurationComponent.cs | 16 ------ .../Configurable/ConfigurationSystem.cs | 3 +- .../Disease/Cures/DiseaseBedrestCure.cs | 2 +- .../Components/EnsnareableComponent.cs | 13 ----- .../Components/EnsnaringComponent.cs | 38 ------------- .../Ensnaring/EnsnareableSystem.Ensnaring.cs | 2 - Content.Server/Ensnaring/EnsnareableSystem.cs | 2 - Content.Server/Foldable/FoldableSystem.cs | 2 +- .../Systems/ShuttleSystem.FasterThanLight.cs | 3 +- .../ContainmentFieldGeneratorSystem.cs | 5 -- .../EntitySystems/ContainmentFieldSystem.cs | 4 +- Content.Server/Strip/StrippableSystem.cs | 3 +- Content.Server/Toilet/ToiletSystem.cs | 2 +- ...dBuckleComponent.cs => BuckleComponent.cs} | 39 +++++++++++-- ...redStrapComponent.cs => StrapComponent.cs} | 53 ++++++++++++++++- .../Buckle/SharedBuckleSystem.Buckle.cs | 28 ++++----- .../Buckle/SharedBuckleSystem.Strap.cs | 18 +++--- ...mponent.cs => CartridgeLoaderComponent.cs} | 15 ++++- .../SharedCartridgeLoaderSystem.cs | 20 +++---- Content.Shared/Climbing/ClimbableComponent.cs | 55 ++++++++++++++++++ ...mbingComponent.cs => ClimbingComponent.cs} | 11 ++-- Content.Shared/Climbing/SharedClimbSystem.cs | 10 ++-- .../Climbing/SharedClimbableComponent.cs | 12 ---- ...Component.cs => ConfigurationComponent.cs} | 13 ++++- ...leComponent.cs => EnsnareableComponent.cs} | 18 +++++- ...ringComponent.cs => EnsnaringComponent.cs} | 47 +++++++++++++-- .../Ensnaring/SharedEnsnareableSystem.cs | 26 ++++----- .../Interaction/RotateToFaceSystem.cs | 2 +- .../Systems/SharedPullingSystem.Actions.cs | 2 +- .../Components/ContainmentFieldComponent.cs | 9 ++- .../ContainmentFieldGeneratorComponent.cs | 39 +++++++++++-- .../SharedContainmentFieldComponent.cs | 2 - ...haredContainmentFieldGeneratorComponent.cs | 30 ---------- .../EntitySystems/SharedEventHorizonSystem.cs | 4 +- Content.Shared/Vehicle/SharedVehicleSystem.cs | 4 +- 64 files changed, 355 insertions(+), 537 deletions(-) delete mode 100644 Content.Client/Buckle/BuckleComponent.cs delete mode 100644 Content.Client/Buckle/Strap/StrapComponent.cs delete mode 100644 Content.Client/Ensnaring/Components/EnsnareableComponent.cs delete mode 100644 Content.Client/Movement/Components/ClimbableComponent.cs delete mode 100644 Content.Client/Movement/Components/ClimbingComponent.cs delete mode 100644 Content.Client/Singularity/Components/ContainmentFieldComponent.cs delete mode 100644 Content.Client/Singularity/Components/ContainmentFieldGeneratorComponent.cs delete mode 100644 Content.Server/Buckle/Components/BuckleComponent.cs delete mode 100644 Content.Server/Buckle/Components/StrapComponent.cs delete mode 100644 Content.Server/CartridgeLoader/CartridgeLoaderComponent.cs delete mode 100644 Content.Server/Climbing/Components/ClimbableComponent.cs delete mode 100644 Content.Server/Climbing/Components/ClimbingComponent.cs delete mode 100644 Content.Server/Configurable/ConfigurationComponent.cs delete mode 100644 Content.Server/Ensnaring/Components/EnsnareableComponent.cs rename Content.Shared/Buckle/Components/{SharedBuckleComponent.cs => BuckleComponent.cs} (52%) rename Content.Shared/Buckle/Components/{SharedStrapComponent.cs => StrapComponent.cs} (58%) rename Content.Shared/CartridgeLoader/{SharedCartridgeLoaderComponent.cs => CartridgeLoaderComponent.cs} (66%) create mode 100644 Content.Shared/Climbing/ClimbableComponent.cs rename Content.Shared/Climbing/{SharedClimbingComponent.cs => ClimbingComponent.cs} (76%) delete mode 100644 Content.Shared/Climbing/SharedClimbableComponent.cs rename Content.Shared/Configurable/{SharedConfigurationComponent.cs => ConfigurationComponent.cs} (75%) rename Content.Shared/Ensnaring/Components/{SharedEnsnareableComponent.cs => EnsnareableComponent.cs} (73%) rename Content.Shared/Ensnaring/Components/{SharedEnsnaringComponent.cs => EnsnaringComponent.cs} (58%) rename {Content.Server => Content.Shared}/Singularity/Components/ContainmentFieldComponent.cs (69%) rename {Content.Server => Content.Shared}/Singularity/Components/ContainmentFieldGeneratorComponent.cs (82%) delete mode 100644 Content.Shared/Singularity/Components/SharedContainmentFieldComponent.cs delete mode 100644 Content.Shared/Singularity/Components/SharedContainmentFieldGeneratorComponent.cs diff --git a/Content.Client/Buckle/BuckleComponent.cs b/Content.Client/Buckle/BuckleComponent.cs deleted file mode 100644 index 69ad94b7d0..0000000000 --- a/Content.Client/Buckle/BuckleComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Content.Shared.Buckle.Components; - -namespace Content.Client.Buckle; - -[RegisterComponent] -[ComponentReference(typeof(SharedBuckleComponent))] -[Access(typeof(BuckleSystem))] -public sealed class BuckleComponent : SharedBuckleComponent -{ - public int? OriginalDrawDepth { get; set; } -} diff --git a/Content.Client/Buckle/BuckleSystem.cs b/Content.Client/Buckle/BuckleSystem.cs index 0279001d10..4b89d9b106 100644 --- a/Content.Client/Buckle/BuckleSystem.cs +++ b/Content.Client/Buckle/BuckleSystem.cs @@ -1,4 +1,3 @@ -using Content.Client.Buckle.Strap; using Content.Client.Rotation; using Content.Shared.ActionBlocker; using Content.Shared.Buckle; @@ -12,15 +11,14 @@ namespace Content.Client.Buckle internal sealed class BuckleSystem : SharedBuckleSystem { [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; - [Dependency] private readonly AppearanceSystem AppearanceSystem = default!; - [Dependency] private readonly RotationVisualizerSystem RotationVisualizerSystem = default!; + [Dependency] private readonly AppearanceSystem _appearanceSystem = default!; + [Dependency] private readonly RotationVisualizerSystem _rotationVisualizerSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnBuckleHandleState); - SubscribeLocalEvent(OnStrapHandleState); SubscribeLocalEvent(OnAppearanceChange); } @@ -65,22 +63,10 @@ namespace Content.Client.Buckle } } - private void OnStrapHandleState(EntityUid uid, StrapComponent component, ref ComponentHandleState args) - { - if (args.Current is not StrapComponentState state) - return; - - component.Position = state.Position; - component.BuckleOffsetUnclamped = state.BuckleOffsetClamped; - component.BuckledEntities.Clear(); - component.BuckledEntities.UnionWith(state.BuckledEntities); - component.MaxBuckleDistance = state.MaxBuckleDistance; - } - private void OnAppearanceChange(EntityUid uid, BuckleComponent component, ref AppearanceChangeEvent args) { - if (!AppearanceSystem.TryGetData(uid, StrapVisuals.RotationAngle, out var angle, args.Component) || - !AppearanceSystem.TryGetData(uid, BuckleVisuals.Buckled, out var buckled, args.Component) || + if (!_appearanceSystem.TryGetData(uid, StrapVisuals.RotationAngle, out var angle, args.Component) || + !_appearanceSystem.TryGetData(uid, BuckleVisuals.Buckled, out var buckled, args.Component) || !buckled || args.Sprite == null) { @@ -88,7 +74,7 @@ namespace Content.Client.Buckle } // Animate strapping yourself to something at a given angle - RotationVisualizerSystem.AnimateSpriteRotation(args.Sprite, Angle.FromDegrees(angle), 0.125f); + _rotationVisualizerSystem.AnimateSpriteRotation(args.Sprite, Angle.FromDegrees(angle), 0.125f); } } } diff --git a/Content.Client/Buckle/Strap/StrapComponent.cs b/Content.Client/Buckle/Strap/StrapComponent.cs deleted file mode 100644 index 1168fff8ea..0000000000 --- a/Content.Client/Buckle/Strap/StrapComponent.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Content.Shared.Buckle.Components; - -namespace Content.Client.Buckle.Strap; - -[RegisterComponent] -[ComponentReference(typeof(SharedStrapComponent))] -[Access(typeof(BuckleSystem))] -public sealed class StrapComponent : SharedStrapComponent -{ -} diff --git a/Content.Client/CartridgeLoader/CartridgeLoaderSystem.cs b/Content.Client/CartridgeLoader/CartridgeLoaderSystem.cs index 46e28d9142..e06a547814 100644 --- a/Content.Client/CartridgeLoader/CartridgeLoaderSystem.cs +++ b/Content.Client/CartridgeLoader/CartridgeLoaderSystem.cs @@ -6,10 +6,3 @@ public sealed class CartridgeLoaderSystem : SharedCartridgeLoaderSystem { //Empty client system for component replication } - -[RegisterComponent] -[ComponentReference(typeof(SharedCartridgeLoaderComponent))] -public sealed class CartridgeLoaderComponent : SharedCartridgeLoaderComponent -{ - -} diff --git a/Content.Client/Configurable/UI/ConfigurationBoundUserInterface.cs b/Content.Client/Configurable/UI/ConfigurationBoundUserInterface.cs index 9ec62e01a0..f114f0cc11 100644 --- a/Content.Client/Configurable/UI/ConfigurationBoundUserInterface.cs +++ b/Content.Client/Configurable/UI/ConfigurationBoundUserInterface.cs @@ -2,7 +2,7 @@ using System.Text.RegularExpressions; using Robust.Client.GameObjects; using Robust.Shared.GameObjects; -using static Content.Shared.Configurable.SharedConfigurationComponent; +using static Content.Shared.Configurable.ConfigurationComponent; namespace Content.Client.Configurable.UI { diff --git a/Content.Client/Configurable/UI/ConfigurationMenu.cs b/Content.Client/Configurable/UI/ConfigurationMenu.cs index 4b94e3055e..dc1e939eba 100644 --- a/Content.Client/Configurable/UI/ConfigurationMenu.cs +++ b/Content.Client/Configurable/UI/ConfigurationMenu.cs @@ -4,7 +4,7 @@ using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Shared.Localization; using Robust.Shared.Maths; -using static Content.Shared.Configurable.SharedConfigurationComponent; +using static Content.Shared.Configurable.ConfigurationComponent; using static Robust.Client.UserInterface.Controls.BaseButton; using static Robust.Client.UserInterface.Controls.BoxContainer; diff --git a/Content.Client/Ensnaring/Components/EnsnareableComponent.cs b/Content.Client/Ensnaring/Components/EnsnareableComponent.cs deleted file mode 100644 index 7035dcfad8..0000000000 --- a/Content.Client/Ensnaring/Components/EnsnareableComponent.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Content.Shared.Ensnaring.Components; - -namespace Content.Client.Ensnaring.Components; -[RegisterComponent] -[ComponentReference(typeof(SharedEnsnareableComponent))] -public sealed class EnsnareableComponent : SharedEnsnareableComponent -{ - [DataField("sprite")] - public string? Sprite; - - [DataField("state")] - public string? State; -} diff --git a/Content.Client/Ensnaring/Components/EnsnaringComponent.cs b/Content.Client/Ensnaring/Components/EnsnaringComponent.cs index 83c7e1199d..63c8d0dfbe 100644 --- a/Content.Client/Ensnaring/Components/EnsnaringComponent.cs +++ b/Content.Client/Ensnaring/Components/EnsnaringComponent.cs @@ -1,9 +1,3 @@ using Content.Shared.Ensnaring.Components; -namespace Content.Client.Ensnaring.Components; -[RegisterComponent] -[ComponentReference(typeof(SharedEnsnaringComponent))] -public sealed class EnsnaringComponent : SharedEnsnaringComponent -{ -} diff --git a/Content.Client/Ensnaring/EnsnareableSystem.cs b/Content.Client/Ensnaring/EnsnareableSystem.cs index 9ccb5dcba5..dd4c76e6b1 100644 --- a/Content.Client/Ensnaring/EnsnareableSystem.cs +++ b/Content.Client/Ensnaring/EnsnareableSystem.cs @@ -1,5 +1,5 @@ -using Content.Client.Ensnaring.Components; using Content.Shared.Ensnaring; +using Content.Shared.Ensnaring.Components; using Robust.Client.GameObjects; namespace Content.Client.Ensnaring.Visualizers; diff --git a/Content.Client/Inventory/StrippableBoundUserInterface.cs b/Content.Client/Inventory/StrippableBoundUserInterface.cs index 1a971d4e3c..2d0f0ee554 100644 --- a/Content.Client/Inventory/StrippableBoundUserInterface.cs +++ b/Content.Client/Inventory/StrippableBoundUserInterface.cs @@ -120,7 +120,7 @@ namespace Content.Client.Inventory } // snare-removal button. This is just the old button before the change to item slots. It is pretty out of place. - if (_entMan.TryGetComponent(Owner.Owner, out SharedEnsnareableComponent? snare) && snare.IsEnsnared) + if (_entMan.TryGetComponent(Owner.Owner, out EnsnareableComponent? snare) && snare.IsEnsnared) { var button = new Button() { diff --git a/Content.Client/Movement/Components/ClimbableComponent.cs b/Content.Client/Movement/Components/ClimbableComponent.cs deleted file mode 100644 index 1c695ac792..0000000000 --- a/Content.Client/Movement/Components/ClimbableComponent.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Content.Client.Movement.Systems; -using Content.Shared.Climbing; - -namespace Content.Client.Movement.Components; - -[RegisterComponent] -[Access(typeof(ClimbSystem))] -[ComponentReference(typeof(SharedClimbableComponent))] -public sealed class ClimbableComponent : SharedClimbableComponent { } diff --git a/Content.Client/Movement/Components/ClimbingComponent.cs b/Content.Client/Movement/Components/ClimbingComponent.cs deleted file mode 100644 index ef5ada9529..0000000000 --- a/Content.Client/Movement/Components/ClimbingComponent.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Content.Client.Movement.Systems; -using Content.Shared.Climbing; - -namespace Content.Client.Movement.Components; - -[RegisterComponent] -[Access(typeof(ClimbSystem))] -[ComponentReference(typeof(SharedClimbingComponent))] -public sealed class ClimbingComponent : SharedClimbingComponent { } diff --git a/Content.Client/Movement/Systems/ClimbSystem.cs b/Content.Client/Movement/Systems/ClimbSystem.cs index 0354ee020e..1f7b757ba4 100644 --- a/Content.Client/Movement/Systems/ClimbSystem.cs +++ b/Content.Client/Movement/Systems/ClimbSystem.cs @@ -1,5 +1,4 @@ using Content.Client.Interactable; -using Content.Client.Movement.Components; using Content.Shared.Climbing; using Content.Shared.DragDrop; using Robust.Shared.GameStates; @@ -18,14 +17,14 @@ public sealed class ClimbSystem : SharedClimbSystem private static void OnClimbingState(EntityUid uid, ClimbingComponent component, ref ComponentHandleState args) { - if (args.Current is not SharedClimbingComponent.ClimbModeComponentState climbModeState) + if (args.Current is not ClimbingComponent.ClimbModeComponentState climbModeState) return; component.IsClimbing = climbModeState.Climbing; component.OwnerIsTransitioning = climbModeState.IsTransitioning; } - protected override void OnCanDragDropOn(EntityUid uid, SharedClimbableComponent component, CanDragDropOnEvent args) + protected override void OnCanDragDropOn(EntityUid uid, ClimbableComponent component, CanDragDropOnEvent args) { base.OnCanDragDropOn(uid, component, args); diff --git a/Content.Client/Singularity/Components/ContainmentFieldComponent.cs b/Content.Client/Singularity/Components/ContainmentFieldComponent.cs deleted file mode 100644 index e90c9ee598..0000000000 --- a/Content.Client/Singularity/Components/ContainmentFieldComponent.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Content.Shared.Singularity.Components; - -namespace Content.Client.Singularity.Components; - -[RegisterComponent] -[ComponentReference(typeof(SharedContainmentFieldComponent))] -public sealed class ContainmentFieldComponent : SharedContainmentFieldComponent { } diff --git a/Content.Client/Singularity/Components/ContainmentFieldGeneratorComponent.cs b/Content.Client/Singularity/Components/ContainmentFieldGeneratorComponent.cs deleted file mode 100644 index ee30bafbac..0000000000 --- a/Content.Client/Singularity/Components/ContainmentFieldGeneratorComponent.cs +++ /dev/null @@ -1,6 +0,0 @@ -using Content.Shared.Singularity.Components; - -namespace Content.Client.Singularity.Components; -[RegisterComponent] -[ComponentReference(typeof(SharedContainmentFieldGeneratorComponent))] -public sealed class ContainmentFieldGeneratorComponent : SharedContainmentFieldGeneratorComponent { } diff --git a/Content.IntegrationTests/Tests/Buckle/BuckleTest.cs b/Content.IntegrationTests/Tests/Buckle/BuckleTest.cs index 7dce7b339c..28d15580d1 100644 --- a/Content.IntegrationTests/Tests/Buckle/BuckleTest.cs +++ b/Content.IntegrationTests/Tests/Buckle/BuckleTest.cs @@ -1,11 +1,11 @@ using System.Threading.Tasks; using Content.Server.Body.Systems; -using Content.Server.Buckle.Components; using Content.Server.Buckle.Systems; using Content.Server.Hands.Components; using Content.Shared.ActionBlocker; using Content.Shared.Body.Components; using Content.Shared.Body.Part; +using Content.Shared.Buckle.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.Standing; using NUnit.Framework; diff --git a/Content.IntegrationTests/Tests/GameObjects/Components/Movement/ClimbUnitTest.cs b/Content.IntegrationTests/Tests/GameObjects/Components/Movement/ClimbUnitTest.cs index 5033c50e31..3897a149a5 100644 --- a/Content.IntegrationTests/Tests/GameObjects/Components/Movement/ClimbUnitTest.cs +++ b/Content.IntegrationTests/Tests/GameObjects/Components/Movement/ClimbUnitTest.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; using Content.Server.Climbing.Components; +using Content.Shared.Climbing; using NUnit.Framework; using Robust.Shared.GameObjects; using Robust.Shared.IoC; diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.cs b/Content.Server/Administration/Systems/AdminVerbSystem.cs index 6d36c52d1a..b920216b05 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.cs @@ -14,6 +14,7 @@ using Content.Server.Prayer; using Content.Server.Xenoarchaeology.XenoArtifacts; using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; using Content.Shared.Administration; +using Content.Shared.Configurable; using Content.Shared.Database; using Content.Shared.GameTicking; using Content.Shared.Interaction.Helpers; @@ -27,7 +28,7 @@ using Robust.Shared.Console; using Robust.Shared.Map; using Robust.Shared.Prototypes; using Robust.Shared.Timing; -using static Content.Shared.Configurable.SharedConfigurationComponent; +using static Content.Shared.Configurable.ConfigurationComponent; namespace Content.Server.Administration.Systems { diff --git a/Content.Server/Alert/Click/RemoveEnsnare.cs b/Content.Server/Alert/Click/RemoveEnsnare.cs index bfac76c594..7d519a6b73 100644 --- a/Content.Server/Alert/Click/RemoveEnsnare.cs +++ b/Content.Server/Alert/Click/RemoveEnsnare.cs @@ -1,6 +1,6 @@ using Content.Server.Ensnaring; -using Content.Server.Ensnaring.Components; using Content.Shared.Alert; +using Content.Shared.Ensnaring.Components; using JetBrains.Annotations; namespace Content.Server.Alert.Click; diff --git a/Content.Server/Bed/BedSystem.cs b/Content.Server/Bed/BedSystem.cs index 027e6609ba..f33cd7b147 100644 --- a/Content.Server/Bed/BedSystem.cs +++ b/Content.Server/Bed/BedSystem.cs @@ -2,7 +2,6 @@ using Content.Server.Actions; using Content.Server.Bed.Components; using Content.Server.Bed.Sleep; using Content.Server.Body.Systems; -using Content.Server.Buckle.Components; using Content.Server.MobState; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; diff --git a/Content.Server/Buckle/Components/BuckleComponent.cs b/Content.Server/Buckle/Components/BuckleComponent.cs deleted file mode 100644 index 9f003f219d..0000000000 --- a/Content.Server/Buckle/Components/BuckleComponent.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Content.Server.Buckle.Systems; -using Content.Shared.Buckle.Components; - -namespace Content.Server.Buckle.Components; - -/// -/// Component that handles sitting entities into s. -/// -[RegisterComponent] -[ComponentReference(typeof(SharedBuckleComponent))] -[Access(typeof(BuckleSystem))] -public sealed class BuckleComponent : SharedBuckleComponent -{ - /// - /// The amount of time that must pass for this entity to - /// be able to unbuckle after recently buckling. - /// - [DataField("delay")] - public TimeSpan UnbuckleDelay = TimeSpan.FromSeconds(0.25f); - - /// - /// The time that this entity buckled at. - /// - [ViewVariables] public TimeSpan BuckleTime; - - /// - /// The strap that this component is buckled to. - /// - [ViewVariables] - public StrapComponent? BuckledTo { get; set; } - - /// - /// The amount of space that this entity occupies in a - /// . - /// - [DataField("size")] - public int Size = 100; -} diff --git a/Content.Server/Buckle/Components/StrapComponent.cs b/Content.Server/Buckle/Components/StrapComponent.cs deleted file mode 100644 index e3b892bab4..0000000000 --- a/Content.Server/Buckle/Components/StrapComponent.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Content.Server.Buckle.Systems; -using Content.Shared.Alert; -using Content.Shared.Buckle.Components; -using Robust.Shared.Audio; - -namespace Content.Server.Buckle.Components; - -[RegisterComponent] -[ComponentReference(typeof(SharedStrapComponent))] -[Access(typeof(BuckleSystem))] -public sealed class StrapComponent : SharedStrapComponent -{ - /// - /// The angle in degrees to rotate the player by when they get strapped - /// - [DataField("rotation")] - public int Rotation { get; set; } - - /// - /// The size of the strap which is compared against when buckling entities - /// - [DataField("size")] - public int Size { get; set; } = 100; - - /// - /// If disabled, nothing can be buckled on this object, and it will unbuckle anything that's already buckled - /// - public bool Enabled { get; set; } = true; - - /// - /// You can specify the offset the entity will have after unbuckling. - /// - [DataField("unbuckleOffset", required: false)] - public Vector2 UnbuckleOffset = Vector2.Zero; - /// - /// The sound to be played when a mob is buckled - /// - [DataField("buckleSound")] - public SoundSpecifier BuckleSound { get; } = new SoundPathSpecifier("/Audio/Effects/buckle.ogg"); - - /// - /// The sound to be played when a mob is unbuckled - /// - [DataField("unbuckleSound")] - public SoundSpecifier UnbuckleSound { get; } = new SoundPathSpecifier("/Audio/Effects/unbuckle.ogg"); - - /// - /// ID of the alert to show when buckled - /// - [DataField("buckledAlertType")] - public AlertType BuckledAlertType { get; } = AlertType.Buckled; - - /// - /// The sum of the sizes of all the buckled entities in this strap - /// - public int OccupiedSize { get; set; } -} diff --git a/Content.Server/Buckle/Systems/BuckleSystem.Buckle.cs b/Content.Server/Buckle/Systems/BuckleSystem.Buckle.cs index b63ca679bb..fc50dbff5a 100644 --- a/Content.Server/Buckle/Systems/BuckleSystem.Buckle.cs +++ b/Content.Server/Buckle/Systems/BuckleSystem.Buckle.cs @@ -1,5 +1,4 @@ using System.Diagnostics.CodeAnalysis; -using Content.Server.Buckle.Components; using Content.Server.Storage.Components; using Content.Shared.Alert; using Content.Shared.Bed.Sleep; @@ -14,7 +13,6 @@ using Content.Shared.Stunnable; using Content.Shared.Vehicle.Components; using Content.Shared.Verbs; using Robust.Shared.GameStates; -using Robust.Shared.Player; namespace Content.Server.Buckle.Systems; diff --git a/Content.Server/Buckle/Systems/BuckleSystem.Strap.cs b/Content.Server/Buckle/Systems/BuckleSystem.Strap.cs index e2e55d5ba7..65e15f0fc2 100644 --- a/Content.Server/Buckle/Systems/BuckleSystem.Strap.cs +++ b/Content.Server/Buckle/Systems/BuckleSystem.Strap.cs @@ -1,5 +1,4 @@ using System.Linq; -using Content.Server.Buckle.Components; using Content.Server.Construction.Completions; using Content.Shared.Buckle.Components; using Content.Shared.Destructible; diff --git a/Content.Server/CartridgeLoader/CartridgeLoaderComponent.cs b/Content.Server/CartridgeLoader/CartridgeLoaderComponent.cs deleted file mode 100644 index 1d6b4adc20..0000000000 --- a/Content.Server/CartridgeLoader/CartridgeLoaderComponent.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Content.Shared.CartridgeLoader; -using Robust.Shared.Serialization.TypeSerializers.Implementations; - -namespace Content.Server.CartridgeLoader; - -[RegisterComponent] -[ComponentReference(typeof(SharedCartridgeLoaderComponent))] -public sealed class CartridgeLoaderComponent : SharedCartridgeLoaderComponent -{ - /// - /// The maximum amount of programs that can be installed on the cartridge loader entity - /// - [DataField("diskSpace")] - public int DiskSpace = 5; - - [DataField("uiKey", readOnly: true, required: true, customTypeSerializer: typeof(EnumSerializer))] - public Enum UiKey = default!; -} diff --git a/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs b/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs index a524aaa8a2..f001a6b02d 100644 --- a/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs +++ b/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs @@ -241,13 +241,13 @@ public sealed class CartridgeLoaderSystem : SharedCartridgeLoaderSystem loader.BackgroundPrograms.Remove(cartridgeUid); } - protected override void OnItemInserted(EntityUid uid, SharedCartridgeLoaderComponent loader, EntInsertedIntoContainerMessage args) + protected override void OnItemInserted(EntityUid uid, Shared.CartridgeLoader.CartridgeLoaderComponent loader, EntInsertedIntoContainerMessage args) { RaiseLocalEvent(args.Entity, new CartridgeAddedEvent(uid)); base.OnItemInserted(uid, loader, args); } - protected override void OnItemRemoved(EntityUid uid, SharedCartridgeLoaderComponent loader, EntRemovedFromContainerMessage args) + protected override void OnItemRemoved(EntityUid uid, Shared.CartridgeLoader.CartridgeLoaderComponent loader, EntRemovedFromContainerMessage args) { var deactivate = loader.BackgroundPrograms.Remove(args.Entity); diff --git a/Content.Server/Climbing/ClimbSystem.cs b/Content.Server/Climbing/ClimbSystem.cs index 1534133b13..b8b0ac2628 100644 --- a/Content.Server/Climbing/ClimbSystem.cs +++ b/Content.Server/Climbing/ClimbSystem.cs @@ -66,7 +66,7 @@ public sealed class ClimbSystem : SharedClimbSystem SubscribeLocalEvent(OnGlassClimbed); } - protected override void OnCanDragDropOn(EntityUid uid, SharedClimbableComponent component, CanDragDropOnEvent args) + protected override void OnCanDragDropOn(EntityUid uid, ClimbableComponent component, CanDragDropOnEvent args) { base.OnCanDragDropOn(uid, component, args); @@ -166,6 +166,7 @@ public sealed class ClimbSystem : SharedClimbSystem return; climbing.IsClimbing = true; + Dirty(climbing); MoveEntityToward(uid, climbable, physics, climbing); // we may potentially need additional logic since we're forcing a player onto a climbable @@ -265,6 +266,7 @@ public sealed class ClimbSystem : SharedClimbSystem climbing.IsClimbing = false; climbing.OwnerIsTransitioning = false; + Dirty(climbing); } /// @@ -275,7 +277,7 @@ public sealed class ClimbSystem : SharedClimbSystem /// The object that is being vaulted /// The reason why it cant be dropped /// - private bool CanVault(SharedClimbableComponent component, EntityUid user, EntityUid target, out string reason) + private bool CanVault(ClimbableComponent component, EntityUid user, EntityUid target, out string reason) { if (!_actionBlockerSystem.CanInteract(user, target)) { @@ -311,7 +313,7 @@ public sealed class ClimbSystem : SharedClimbSystem /// The object that is being vaulted onto /// The reason why it cant be dropped /// - private bool CanVault(SharedClimbableComponent component, EntityUid user, EntityUid dragged, EntityUid target, + private bool CanVault(ClimbableComponent component, EntityUid user, EntityUid dragged, EntityUid target, out string reason) { if (!_actionBlockerSystem.CanInteract(user, dragged) || !_actionBlockerSystem.CanInteract(user, target)) @@ -353,7 +355,7 @@ public sealed class ClimbSystem : SharedClimbSystem private static void OnClimbingGetState(EntityUid uid, ClimbingComponent component, ref ComponentGetState args) { - args.State = new SharedClimbingComponent.ClimbModeComponentState(component.IsClimbing, component.OwnerIsTransitioning); + args.State = new ClimbingComponent.ClimbModeComponentState(component.IsClimbing, component.OwnerIsTransitioning); } private void OnGlassClimbed(EntityUid uid, GlassTableComponent component, ClimbedOnEvent args) @@ -401,7 +403,7 @@ public sealed class ClimbSystem : SharedClimbSystem _actionBlockerSystem.UpdateCanMove(uid); // Transition back to KinematicController after BufferTime - climbing.Owner.SpawnTimer((int) (SharedClimbingComponent.BufferTime * 1000), () => + climbing.Owner.SpawnTimer((int) (ClimbingComponent.BufferTime * 1000), () => { if (climbing.Deleted) return; physics.BodyType = BodyType.KinematicController; diff --git a/Content.Server/Climbing/Components/ClimbableComponent.cs b/Content.Server/Climbing/Components/ClimbableComponent.cs deleted file mode 100644 index 1655b4d225..0000000000 --- a/Content.Server/Climbing/Components/ClimbableComponent.cs +++ /dev/null @@ -1,49 +0,0 @@ -using Content.Shared.CCVar; -using Content.Shared.Climbing; -using Content.Shared.Damage; -using Robust.Shared.Audio; - -namespace Content.Server.Climbing.Components; - -[RegisterComponent] -[ComponentReference(typeof(SharedClimbableComponent))] -public sealed class ClimbableComponent : SharedClimbableComponent -{ - /// - /// The time it takes to climb onto the entity. - /// - [DataField("delay")] - public float ClimbDelay = 0.8f; - - /// - /// If set, people can bonk on this if is set or if they are clumsy. - /// - [DataField("bonk")] public bool Bonk = false; - - /// - /// Chance of bonk triggering if the user is clumsy. - /// - [DataField("bonkClumsyChance")] - public float BonkClumsyChance = 0.75f; - - /// - /// Sound to play when bonking. - /// - /// - [DataField("bonkSound")] - public SoundSpecifier? BonkSound; - - /// - /// How long to stun players on bonk, in seconds. - /// - /// - [DataField("bonkTime")] - public float BonkTime = 2; - - /// - /// How much damage to apply on bonk. - /// - /// - [DataField("bonkDamage")] - public DamageSpecifier? BonkDamage; -} diff --git a/Content.Server/Climbing/Components/ClimbingComponent.cs b/Content.Server/Climbing/Components/ClimbingComponent.cs deleted file mode 100644 index 5eab1b9672..0000000000 --- a/Content.Server/Climbing/Components/ClimbingComponent.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Content.Shared.Climbing; - -namespace Content.Server.Climbing.Components; - -[RegisterComponent] -[ComponentReference(typeof(SharedClimbingComponent))] -[Access(typeof(ClimbSystem))] -public sealed class ClimbingComponent : SharedClimbingComponent -{ - [ViewVariables(VVAccess.ReadWrite)] - public override bool IsClimbing - { - get => base.IsClimbing; - set - { - if (base.IsClimbing == value) return; - base.IsClimbing = value; - Dirty(); - } - } - - public override bool OwnerIsTransitioning - { - get => base.OwnerIsTransitioning; - set - { - if (value == base.OwnerIsTransitioning) return; - base.OwnerIsTransitioning = value; - Dirty(); - } - } - - [ViewVariables] - public Dictionary DisabledFixtureMasks { get; } = new(); -} diff --git a/Content.Server/Configurable/ConfigurationComponent.cs b/Content.Server/Configurable/ConfigurationComponent.cs deleted file mode 100644 index 22d7a0dd0f..0000000000 --- a/Content.Server/Configurable/ConfigurationComponent.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Content.Shared.Configurable; -using Content.Shared.Tools; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - -namespace Content.Server.Configurable; - -[RegisterComponent] -[ComponentReference(typeof(SharedConfigurationComponent))] -public sealed class ConfigurationComponent : SharedConfigurationComponent -{ - [DataField("config")] - public readonly Dictionary Config = new(); - - [DataField("qualityNeeded", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string QualityNeeded = "Pulsing"; -} diff --git a/Content.Server/Configurable/ConfigurationSystem.cs b/Content.Server/Configurable/ConfigurationSystem.cs index 66a2a56b4a..9b43d0f65d 100644 --- a/Content.Server/Configurable/ConfigurationSystem.cs +++ b/Content.Server/Configurable/ConfigurationSystem.cs @@ -1,8 +1,9 @@ +using Content.Shared.Configurable; using Content.Shared.Interaction; using Content.Shared.Tools.Components; using Robust.Server.GameObjects; using Robust.Shared.Containers; -using static Content.Shared.Configurable.SharedConfigurationComponent; +using static Content.Shared.Configurable.ConfigurationComponent; namespace Content.Server.Configurable; diff --git a/Content.Server/Disease/Cures/DiseaseBedrestCure.cs b/Content.Server/Disease/Cures/DiseaseBedrestCure.cs index 2357a46fa0..e5abe041dc 100644 --- a/Content.Server/Disease/Cures/DiseaseBedrestCure.cs +++ b/Content.Server/Disease/Cures/DiseaseBedrestCure.cs @@ -1,6 +1,6 @@ using Content.Server.Bed.Components; -using Content.Server.Buckle.Components; using Content.Shared.Bed.Sleep; +using Content.Shared.Buckle.Components; using Content.Shared.Disease; namespace Content.Server.Disease.Cures diff --git a/Content.Server/Ensnaring/Components/EnsnareableComponent.cs b/Content.Server/Ensnaring/Components/EnsnareableComponent.cs deleted file mode 100644 index c5af4f58f5..0000000000 --- a/Content.Server/Ensnaring/Components/EnsnareableComponent.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Content.Shared.Ensnaring.Components; -using Robust.Shared.Containers; - -namespace Content.Server.Ensnaring.Components; -[RegisterComponent] -[ComponentReference(typeof(SharedEnsnareableComponent))] -public sealed class EnsnareableComponent : SharedEnsnareableComponent -{ - /// - /// The container where the entity will be stored - /// - public Container Container = default!; -} diff --git a/Content.Server/Ensnaring/Components/EnsnaringComponent.cs b/Content.Server/Ensnaring/Components/EnsnaringComponent.cs index 69fa9a241f..da9ad56c5e 100644 --- a/Content.Server/Ensnaring/Components/EnsnaringComponent.cs +++ b/Content.Server/Ensnaring/Components/EnsnaringComponent.cs @@ -1,43 +1,5 @@ using System.Threading; using Content.Shared.Ensnaring.Components; -namespace Content.Server.Ensnaring.Components; -[RegisterComponent] -[ComponentReference(typeof(SharedEnsnaringComponent))] -public sealed class EnsnaringComponent : SharedEnsnaringComponent -{ - /// - /// Should movement cancel breaking out? - /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("canMoveBreakout")] - public bool CanMoveBreakout; - public CancellationTokenSource? CancelToken; -} -/// -/// Used for the do after event to free the entity that owns the -/// -public sealed class FreeEnsnareDoAfterComplete : EntityEventArgs -{ - public readonly EntityUid EnsnaringEntity; - - public FreeEnsnareDoAfterComplete(EntityUid ensnaringEntity) - { - EnsnaringEntity = ensnaringEntity; - } -} - -/// -/// Used for the do after event when it fails to free the entity that owns the -/// -public sealed class FreeEnsnareDoAfterCancel : EntityEventArgs -{ - public readonly EntityUid EnsnaringEntity; - - public FreeEnsnareDoAfterCancel(EntityUid ensnaringEntity) - { - EnsnaringEntity = ensnaringEntity; - } -} diff --git a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs index 3722324292..0bfde38c78 100644 --- a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs +++ b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs @@ -1,12 +1,10 @@ using System.Threading; using Content.Server.DoAfter; -using Content.Server.Ensnaring.Components; using Content.Shared.Alert; using Content.Shared.Ensnaring.Components; using Content.Shared.IdentityManagement; using Content.Shared.StepTrigger.Systems; using Content.Shared.Throwing; -using Robust.Shared.Player; namespace Content.Server.Ensnaring; diff --git a/Content.Server/Ensnaring/EnsnareableSystem.cs b/Content.Server/Ensnaring/EnsnareableSystem.cs index b10dca6709..cbb025459f 100644 --- a/Content.Server/Ensnaring/EnsnareableSystem.cs +++ b/Content.Server/Ensnaring/EnsnareableSystem.cs @@ -1,11 +1,9 @@ -using Content.Server.Ensnaring.Components; using Content.Server.Popups; using Content.Shared.Ensnaring; using Content.Shared.Ensnaring.Components; using Content.Shared.Popups; using Robust.Server.Containers; using Robust.Shared.Containers; -using Robust.Shared.Player; namespace Content.Server.Ensnaring; diff --git a/Content.Server/Foldable/FoldableSystem.cs b/Content.Server/Foldable/FoldableSystem.cs index 7b784bcf93..4b66d2aba0 100644 --- a/Content.Server/Foldable/FoldableSystem.cs +++ b/Content.Server/Foldable/FoldableSystem.cs @@ -1,7 +1,7 @@ using System.Linq; -using Content.Server.Buckle.Components; using Content.Server.Buckle.Systems; using Content.Server.Storage.Components; +using Content.Shared.Buckle.Components; using Content.Shared.Foldable; using Content.Shared.Verbs; using JetBrains.Annotations; diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs index 7e47f9a06b..7015e39cad 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs @@ -1,4 +1,3 @@ -using Content.Server.Buckle.Components; using Content.Server.Doors.Components; using Content.Server.Doors.Systems; using Content.Server.Shuttles.Components; @@ -14,7 +13,7 @@ using Robust.Shared.Player; using Robust.Shared.Utility; using System.Diagnostics.CodeAnalysis; using Content.Server.Shuttles.Events; -using Content.Server.Station.Components; +using Content.Shared.Buckle.Components; using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; diff --git a/Content.Server/Singularity/EntitySystems/ContainmentFieldGeneratorSystem.cs b/Content.Server/Singularity/EntitySystems/ContainmentFieldGeneratorSystem.cs index 94ac8e9e99..c69b730707 100644 --- a/Content.Server/Singularity/EntitySystems/ContainmentFieldGeneratorSystem.cs +++ b/Content.Server/Singularity/EntitySystems/ContainmentFieldGeneratorSystem.cs @@ -1,20 +1,15 @@ -using Content.Server.Singularity.Components; using Content.Server.Singularity.Events; using Content.Shared.Singularity.Components; using Content.Shared.Tag; using Robust.Server.GameObjects; using Robust.Shared.Physics; -using Robust.Shared.Physics.Dynamics; -using System.Linq; using Content.Server.Popups; using Content.Shared.Construction.Components; using Content.Shared.Examine; using Content.Shared.Interaction; using Content.Shared.Popups; -using Content.Shared.Throwing; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; -using Robust.Shared.Player; namespace Content.Server.Singularity.EntitySystems; diff --git a/Content.Server/Singularity/EntitySystems/ContainmentFieldSystem.cs b/Content.Server/Singularity/EntitySystems/ContainmentFieldSystem.cs index 13a82691d1..48487cbb94 100644 --- a/Content.Server/Singularity/EntitySystems/ContainmentFieldSystem.cs +++ b/Content.Server/Singularity/EntitySystems/ContainmentFieldSystem.cs @@ -1,13 +1,11 @@ using Content.Server.Popups; using Content.Server.Shuttles.Components; -using Content.Server.Singularity.Components; -using Content.Server.Singularity.EntitySystems; using Content.Server.Singularity.Events; using Content.Shared.Popups; +using Content.Shared.Singularity.Components; using Content.Shared.Throwing; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; -using Robust.Shared.Player; namespace Content.Server.Singularity.EntitySystems; diff --git a/Content.Server/Strip/StrippableSystem.cs b/Content.Server/Strip/StrippableSystem.cs index e14b85b22b..08c71c8fe7 100644 --- a/Content.Server/Strip/StrippableSystem.cs +++ b/Content.Server/Strip/StrippableSystem.cs @@ -1,7 +1,6 @@ using Content.Server.Cuffs.Components; using Content.Server.DoAfter; using Content.Server.Ensnaring; -using Content.Server.Ensnaring.Components; using Content.Server.Hands.Components; using Content.Shared.CombatMode; using Content.Shared.Hands.Components; @@ -13,10 +12,10 @@ using Content.Shared.Popups; using Content.Shared.Strip.Components; using Content.Shared.Verbs; using Robust.Server.GameObjects; -using Robust.Shared.Player; using System.Threading; using Content.Server.Administration.Logs; using Content.Shared.Database; +using Content.Shared.Ensnaring.Components; namespace Content.Server.Strip { diff --git a/Content.Server/Toilet/ToiletSystem.cs b/Content.Server/Toilet/ToiletSystem.cs index 1bb6de9e48..0bb8b3c7d2 100644 --- a/Content.Server/Toilet/ToiletSystem.cs +++ b/Content.Server/Toilet/ToiletSystem.cs @@ -1,5 +1,4 @@ using Content.Server.Body.Systems; -using Content.Server.Buckle.Components; using Content.Server.Buckle.Systems; using Content.Server.Popups; using Content.Server.Storage.Components; @@ -7,6 +6,7 @@ using Content.Server.Storage.EntitySystems; using Content.Server.Tools; using Content.Shared.Body.Components; using Content.Shared.Body.Part; +using Content.Shared.Buckle.Components; using Content.Shared.Examine; using Content.Shared.IdentityManagement; using Content.Shared.Interaction; diff --git a/Content.Shared/Buckle/Components/SharedBuckleComponent.cs b/Content.Shared/Buckle/Components/BuckleComponent.cs similarity index 52% rename from Content.Shared/Buckle/Components/SharedBuckleComponent.cs rename to Content.Shared/Buckle/Components/BuckleComponent.cs index 026a5b8794..3d7269ce96 100644 --- a/Content.Shared/Buckle/Components/SharedBuckleComponent.cs +++ b/Content.Shared/Buckle/Components/BuckleComponent.cs @@ -4,15 +4,14 @@ using Robust.Shared.Serialization; namespace Content.Shared.Buckle.Components; -[NetworkedComponent] -[Access(typeof(SharedBuckleSystem))] -public abstract class SharedBuckleComponent : Component +[RegisterComponent, NetworkedComponent] +public sealed class BuckleComponent : Component { /// - /// The range from which this entity can buckle to a . + /// The range from which this entity can buckle to a . /// [DataField("range")] - public float Range { get; protected set; } = SharedInteractionSystem.InteractionRange / 1.4f; + public float Range = SharedInteractionSystem.InteractionRange / 1.4f; /// /// True if the entity is buckled, false otherwise. @@ -22,6 +21,36 @@ public abstract class SharedBuckleComponent : Component public EntityUid? LastEntityBuckledTo { get; set; } public bool DontCollide { get; set; } + + /// + /// The amount of time that must pass for this entity to + /// be able to unbuckle after recently buckling. + /// + [DataField("delay")] + public TimeSpan UnbuckleDelay = TimeSpan.FromSeconds(0.25f); + + /// + /// The time that this entity buckled at. + /// + [ViewVariables] public TimeSpan BuckleTime; + + /// + /// The strap that this component is buckled to. + /// + [ViewVariables] + public StrapComponent? BuckledTo { get; set; } + + /// + /// The amount of space that this entity occupies in a + /// . + /// + [DataField("size")] + public int Size = 100; + + /// + /// Used for client rendering + /// + public int? OriginalDrawDepth { get; set; } } [Serializable, NetSerializable] diff --git a/Content.Shared/Buckle/Components/SharedStrapComponent.cs b/Content.Shared/Buckle/Components/StrapComponent.cs similarity index 58% rename from Content.Shared/Buckle/Components/SharedStrapComponent.cs rename to Content.Shared/Buckle/Components/StrapComponent.cs index b769929027..6d070a10af 100644 --- a/Content.Shared/Buckle/Components/SharedStrapComponent.cs +++ b/Content.Shared/Buckle/Components/StrapComponent.cs @@ -1,3 +1,5 @@ +using Content.Shared.Alert; +using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Serialization; @@ -21,9 +23,8 @@ public enum StrapPosition Down } -[NetworkedComponent] -[Access(typeof(SharedBuckleSystem))] -public abstract class SharedStrapComponent : Component +[RegisterComponent, NetworkedComponent] +public sealed class StrapComponent : Component { /// /// The change in position to the strapped mob @@ -58,6 +59,52 @@ public abstract class SharedStrapComponent : Component [DataField("buckleOffset", required: false)] [Access(Other = AccessPermissions.ReadWrite)] public Vector2 BuckleOffsetUnclamped = Vector2.Zero; + + + /// + /// The angle in degrees to rotate the player by when they get strapped + /// + [DataField("rotation")] + public int Rotation { get; set; } + + /// + /// The size of the strap which is compared against when buckling entities + /// + [DataField("size")] + public int Size { get; set; } = 100; + + /// + /// If disabled, nothing can be buckled on this object, and it will unbuckle anything that's already buckled + /// + public bool Enabled { get; set; } = true; + + /// + /// You can specify the offset the entity will have after unbuckling. + /// + [DataField("unbuckleOffset", required: false)] + public Vector2 UnbuckleOffset = Vector2.Zero; + /// + /// The sound to be played when a mob is buckled + /// + [DataField("buckleSound")] + public SoundSpecifier BuckleSound { get; } = new SoundPathSpecifier("/Audio/Effects/buckle.ogg"); + + /// + /// The sound to be played when a mob is unbuckled + /// + [DataField("unbuckleSound")] + public SoundSpecifier UnbuckleSound { get; } = new SoundPathSpecifier("/Audio/Effects/unbuckle.ogg"); + + /// + /// ID of the alert to show when buckled + /// + [DataField("buckledAlertType")] + public AlertType BuckledAlertType { get; } = AlertType.Buckled; + + /// + /// The sum of the sizes of all the buckled entities in this strap + /// + public int OccupiedSize { get; set; } } [Serializable, NetSerializable] diff --git a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs index b136d7892b..972db5b7c9 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs @@ -13,15 +13,15 @@ public abstract partial class SharedBuckleSystem { private void InitializeBuckle() { - SubscribeLocalEvent(PreventCollision); - SubscribeLocalEvent(HandleDown); - SubscribeLocalEvent(HandleStand); - SubscribeLocalEvent(HandleThrowPushback); - SubscribeLocalEvent(HandleMove); - SubscribeLocalEvent(OnBuckleChangeDirectionAttempt); + SubscribeLocalEvent(PreventCollision); + SubscribeLocalEvent(HandleDown); + SubscribeLocalEvent(HandleStand); + SubscribeLocalEvent(HandleThrowPushback); + SubscribeLocalEvent(HandleMove); + SubscribeLocalEvent(OnBuckleChangeDirectionAttempt); } - private void PreventCollision(EntityUid uid, SharedBuckleComponent component, ref PreventCollideEvent args) + private void PreventCollision(EntityUid uid, BuckleComponent component, ref PreventCollideEvent args) { if (args.BodyB.Owner != component.LastEntityBuckledTo) return; @@ -30,25 +30,25 @@ public abstract partial class SharedBuckleSystem args.Cancelled = true; } - private void HandleDown(EntityUid uid, SharedBuckleComponent component, DownAttemptEvent args) + private void HandleDown(EntityUid uid, BuckleComponent component, DownAttemptEvent args) { if (component.Buckled) args.Cancel(); } - private void HandleStand(EntityUid uid, SharedBuckleComponent component, StandAttemptEvent args) + private void HandleStand(EntityUid uid, BuckleComponent component, StandAttemptEvent args) { if (component.Buckled) args.Cancel(); } - private void HandleThrowPushback(EntityUid uid, SharedBuckleComponent component, ThrowPushbackAttemptEvent args) + private void HandleThrowPushback(EntityUid uid, BuckleComponent component, ThrowPushbackAttemptEvent args) { if (component.Buckled) args.Cancel(); } - private void HandleMove(EntityUid uid, SharedBuckleComponent component, UpdateCanMoveEvent args) + private void HandleMove(EntityUid uid, BuckleComponent component, UpdateCanMoveEvent args) { if (component.LifeStage > ComponentLifeStage.Running) return; @@ -58,13 +58,13 @@ public abstract partial class SharedBuckleSystem args.Cancel(); } - private void OnBuckleChangeDirectionAttempt(EntityUid uid, SharedBuckleComponent component, ChangeDirectionAttemptEvent args) + private void OnBuckleChangeDirectionAttempt(EntityUid uid, BuckleComponent component, ChangeDirectionAttemptEvent args) { if (component.Buckled) args.Cancel(); } - public bool IsBuckled(EntityUid uid, SharedBuckleComponent? component = null) + public bool IsBuckled(EntityUid uid, BuckleComponent? component = null) { return Resolve(uid, ref component, false) && component.Buckled; } @@ -75,7 +75,7 @@ public abstract partial class SharedBuckleSystem /// The entity to reattach. /// The strap to reattach to. /// The buckle component of the entity to reattach. - public void ReAttach(EntityUid buckleId, SharedStrapComponent strap, SharedBuckleComponent? buckle = null) + public void ReAttach(EntityUid buckleId, StrapComponent strap, BuckleComponent? buckle = null) { if (!Resolve(buckleId, ref buckle, false)) return; diff --git a/Content.Shared/Buckle/SharedBuckleSystem.Strap.cs b/Content.Shared/Buckle/SharedBuckleSystem.Strap.cs index 58edb3f2d7..8e54bd384e 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.Strap.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.Strap.cs @@ -11,12 +11,12 @@ public abstract partial class SharedBuckleSystem private void InitializeStrap() { - SubscribeLocalEvent(OnStrapRotate); - SubscribeLocalEvent(OnStrapHandleState); - SubscribeLocalEvent(OnStrapCanDragDropOn); + SubscribeLocalEvent(OnStrapRotate); + SubscribeLocalEvent(OnStrapHandleState); + SubscribeLocalEvent(OnStrapCanDragDropOn); } - private void OnStrapHandleState(EntityUid uid, SharedStrapComponent component, ref ComponentHandleState args) + private void OnStrapHandleState(EntityUid uid, StrapComponent component, ref ComponentHandleState args) { if (args.Current is not StrapComponentState state) return; @@ -28,7 +28,7 @@ public abstract partial class SharedBuckleSystem component.MaxBuckleDistance = state.MaxBuckleDistance; } - private void OnStrapRotate(EntityUid uid, SharedStrapComponent component, ref MoveEvent args) + private void OnStrapRotate(EntityUid uid, StrapComponent component, ref MoveEvent args) { // TODO: This looks dirty af. // On rotation of a strap, reattach all buckled entities. @@ -50,7 +50,7 @@ public abstract partial class SharedBuckleSystem foreach (var buckledEntity in component.BuckledEntities) { - if (!EntityManager.TryGetComponent(buckledEntity, out SharedBuckleComponent? buckled)) + if (!EntityManager.TryGetComponent(buckledEntity, out BuckleComponent? buckled)) { continue; } @@ -71,8 +71,8 @@ public abstract partial class SharedBuckleSystem EntityUid user, EntityUid target, EntityUid buckleId, - SharedStrapComponent? strap = null, - SharedBuckleComponent? buckle = null) + StrapComponent? strap = null, + BuckleComponent? buckle = null) { if (!Resolve(strapId, ref strap, false) || !Resolve(buckleId, ref buckle, false)) @@ -85,7 +85,7 @@ public abstract partial class SharedBuckleSystem return _interactions.InRangeUnobstructed(target, buckleId, buckle.Range, predicate: Ignored); } - private void OnStrapCanDragDropOn(EntityUid uid, SharedStrapComponent strap, CanDragDropOnEvent args) + private void OnStrapCanDragDropOn(EntityUid uid, StrapComponent strap, CanDragDropOnEvent args) { args.CanDrop = StrapCanDragDropOn(args.Target, args.User, args.Target, args.Dragged, strap); args.Handled = true; diff --git a/Content.Shared/CartridgeLoader/SharedCartridgeLoaderComponent.cs b/Content.Shared/CartridgeLoader/CartridgeLoaderComponent.cs similarity index 66% rename from Content.Shared/CartridgeLoader/SharedCartridgeLoaderComponent.cs rename to Content.Shared/CartridgeLoader/CartridgeLoaderComponent.cs index b53045082a..0fa946b248 100644 --- a/Content.Shared/CartridgeLoader/SharedCartridgeLoaderComponent.cs +++ b/Content.Shared/CartridgeLoader/CartridgeLoaderComponent.cs @@ -1,9 +1,11 @@ using Content.Shared.Containers.ItemSlots; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization.TypeSerializers.Implementations; namespace Content.Shared.CartridgeLoader; -[Access(typeof(SharedCartridgeLoaderSystem))] -public abstract class SharedCartridgeLoaderComponent : Component +[RegisterComponent, NetworkedComponent] +public sealed class CartridgeLoaderComponent : Component { public const string CartridgeSlotId = "Cartridge-Slot"; @@ -33,4 +35,13 @@ public abstract class SharedCartridgeLoaderComponent : Component /// [DataField("installedCartridges")] public List InstalledPrograms = new(); + + /// + /// The maximum amount of programs that can be installed on the cartridge loader entity + /// + [DataField("diskSpace")] + public int DiskSpace = 5; + + [DataField("uiKey", readOnly: true, required: true, customTypeSerializer: typeof(EnumSerializer))] + public Enum UiKey = default!; } diff --git a/Content.Shared/CartridgeLoader/SharedCartridgeLoaderSystem.cs b/Content.Shared/CartridgeLoader/SharedCartridgeLoaderSystem.cs index a5946de1ba..0bd7c5ec16 100644 --- a/Content.Shared/CartridgeLoader/SharedCartridgeLoaderSystem.cs +++ b/Content.Shared/CartridgeLoader/SharedCartridgeLoaderSystem.cs @@ -14,26 +14,26 @@ public abstract class SharedCartridgeLoaderSystem : EntitySystem { base.Initialize(); - SubscribeLocalEvent(OnComponentInit); - SubscribeLocalEvent(OnComponentRemove); + SubscribeLocalEvent(OnComponentInit); + SubscribeLocalEvent(OnComponentRemove); - SubscribeLocalEvent(OnItemInserted); - SubscribeLocalEvent(OnItemRemoved); + SubscribeLocalEvent(OnItemInserted); + SubscribeLocalEvent(OnItemRemoved); SubscribeLocalEvent(OnGetState); SubscribeLocalEvent(OnHandleState); } - private void OnComponentInit(EntityUid uid, SharedCartridgeLoaderComponent loader, ComponentInit args) + private void OnComponentInit(EntityUid uid, CartridgeLoaderComponent loader, ComponentInit args) { - _itemSlotsSystem.AddItemSlot(uid, SharedCartridgeLoaderComponent.CartridgeSlotId, loader.CartridgeSlot); + _itemSlotsSystem.AddItemSlot(uid, CartridgeLoaderComponent.CartridgeSlotId, loader.CartridgeSlot); } /// /// Marks installed program entities for deletion when the component gets removed /// - private void OnComponentRemove(EntityUid uid, SharedCartridgeLoaderComponent loader, ComponentRemove args) + private void OnComponentRemove(EntityUid uid, CartridgeLoaderComponent loader, ComponentRemove args) { _itemSlotsSystem.RemoveItemSlot(uid, loader.CartridgeSlot); @@ -43,12 +43,12 @@ public abstract class SharedCartridgeLoaderSystem : EntitySystem } } - protected virtual void OnItemInserted(EntityUid uid, SharedCartridgeLoaderComponent loader, EntInsertedIntoContainerMessage args) + protected virtual void OnItemInserted(EntityUid uid, CartridgeLoaderComponent loader, EntInsertedIntoContainerMessage args) { UpdateAppearanceData(uid, loader); } - protected virtual void OnItemRemoved(EntityUid uid, SharedCartridgeLoaderComponent loader, EntRemovedFromContainerMessage args) + protected virtual void OnItemRemoved(EntityUid uid, CartridgeLoaderComponent loader, EntRemovedFromContainerMessage args) { UpdateAppearanceData(uid, loader); } @@ -69,7 +69,7 @@ public abstract class SharedCartridgeLoaderSystem : EntitySystem component.InstallationStatus = state.InstallationStatus; } - private void UpdateAppearanceData(EntityUid uid, SharedCartridgeLoaderComponent loader) + private void UpdateAppearanceData(EntityUid uid, CartridgeLoaderComponent loader) { _appearanceSystem.SetData(uid, CartridgeLoaderVisuals.CartridgeInserted, loader.CartridgeSlot.HasItem); } diff --git a/Content.Shared/Climbing/ClimbableComponent.cs b/Content.Shared/Climbing/ClimbableComponent.cs new file mode 100644 index 0000000000..a185da1905 --- /dev/null +++ b/Content.Shared/Climbing/ClimbableComponent.cs @@ -0,0 +1,55 @@ +using Content.Shared.CCVar; +using Content.Shared.Damage; +using Content.Shared.Interaction; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; + +namespace Content.Shared.Climbing +{ + [RegisterComponent, NetworkedComponent] + public sealed class ClimbableComponent : Component + { + /// + /// The range from which this entity can be climbed. + /// + [DataField("range")] public float Range = SharedInteractionSystem.InteractionRange / 1.4f; + + /// + /// The time it takes to climb onto the entity. + /// + [DataField("delay")] + public float ClimbDelay = 0.8f; + + /// + /// If set, people can bonk on this if is set or if they are clumsy. + /// + [DataField("bonk")] public bool Bonk = false; + + /// + /// Chance of bonk triggering if the user is clumsy. + /// + [DataField("bonkClumsyChance")] + public float BonkClumsyChance = 0.75f; + + /// + /// Sound to play when bonking. + /// + /// + [DataField("bonkSound")] + public SoundSpecifier? BonkSound; + + /// + /// How long to stun players on bonk, in seconds. + /// + /// + [DataField("bonkTime")] + public float BonkTime = 2; + + /// + /// How much damage to apply on bonk. + /// + /// + [DataField("bonkDamage")] + public DamageSpecifier? BonkDamage; + } +} diff --git a/Content.Shared/Climbing/SharedClimbingComponent.cs b/Content.Shared/Climbing/ClimbingComponent.cs similarity index 76% rename from Content.Shared/Climbing/SharedClimbingComponent.cs rename to Content.Shared/Climbing/ClimbingComponent.cs index 23db85df73..bf9745ebd6 100644 --- a/Content.Shared/Climbing/SharedClimbingComponent.cs +++ b/Content.Shared/Climbing/ClimbingComponent.cs @@ -3,26 +3,29 @@ using Robust.Shared.Serialization; namespace Content.Shared.Climbing; -[NetworkedComponent] -public abstract class SharedClimbingComponent : Component +[RegisterComponent, NetworkedComponent] +public sealed class ClimbingComponent : Component { /// /// Whether the owner is climbing on a climbable entity. /// [ViewVariables] - public virtual bool IsClimbing { get; set; } + public bool IsClimbing { get; set; } /// /// Whether the owner is being moved onto the climbed entity. /// [ViewVariables] - public virtual bool OwnerIsTransitioning { get; set; } + public bool OwnerIsTransitioning { get; set; } /// /// We'll launch the mob onto the table and give them at least this amount of time to be on it. /// public const float BufferTime = 0.3f; + [ViewVariables] + public Dictionary DisabledFixtureMasks { get; } = new(); + [Serializable, NetSerializable] public sealed class ClimbModeComponentState : ComponentState { diff --git a/Content.Shared/Climbing/SharedClimbSystem.cs b/Content.Shared/Climbing/SharedClimbSystem.cs index 53e20541f9..1d9ff5f606 100644 --- a/Content.Shared/Climbing/SharedClimbSystem.cs +++ b/Content.Shared/Climbing/SharedClimbSystem.cs @@ -9,11 +9,11 @@ public abstract class SharedClimbSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(HandleMoveAttempt); - SubscribeLocalEvent(OnCanDragDropOn); + SubscribeLocalEvent(HandleMoveAttempt); + SubscribeLocalEvent(OnCanDragDropOn); } - private static void HandleMoveAttempt(EntityUid uid, SharedClimbingComponent component, UpdateCanMoveEvent args) + private static void HandleMoveAttempt(EntityUid uid, ClimbingComponent component, UpdateCanMoveEvent args) { if (component.LifeStage > ComponentLifeStage.Running) return; @@ -22,8 +22,8 @@ public abstract class SharedClimbSystem : EntitySystem args.Cancel(); } - protected virtual void OnCanDragDropOn(EntityUid uid, SharedClimbableComponent component, CanDragDropOnEvent args) + protected virtual void OnCanDragDropOn(EntityUid uid, ClimbableComponent component, CanDragDropOnEvent args) { - args.CanDrop = HasComp(args.Dragged); + args.CanDrop = HasComp(args.Dragged); } } diff --git a/Content.Shared/Climbing/SharedClimbableComponent.cs b/Content.Shared/Climbing/SharedClimbableComponent.cs deleted file mode 100644 index fee70cf1ce..0000000000 --- a/Content.Shared/Climbing/SharedClimbableComponent.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Content.Shared.Interaction; - -namespace Content.Shared.Climbing -{ - public abstract class SharedClimbableComponent : Component - { - /// - /// The range from which this entity can be climbed. - /// - [DataField("range")] public float Range = SharedInteractionSystem.InteractionRange / 1.4f; - } -} diff --git a/Content.Shared/Configurable/SharedConfigurationComponent.cs b/Content.Shared/Configurable/ConfigurationComponent.cs similarity index 75% rename from Content.Shared/Configurable/SharedConfigurationComponent.cs rename to Content.Shared/Configurable/ConfigurationComponent.cs index 965d7a9e5d..57809e5869 100644 --- a/Content.Shared/Configurable/SharedConfigurationComponent.cs +++ b/Content.Shared/Configurable/ConfigurationComponent.cs @@ -1,11 +1,20 @@ using System.Text.RegularExpressions; +using Content.Shared.Tools; +using Robust.Shared.GameStates; using Robust.Shared.Serialization; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.Configurable { - [Virtual] - public class SharedConfigurationComponent : Component + [RegisterComponent, NetworkedComponent] + public sealed class ConfigurationComponent : Component { + [DataField("config")] + public readonly Dictionary Config = new(); + + [DataField("qualityNeeded", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string QualityNeeded = "Pulsing"; + [DataField("validation")] public readonly Regex Validation = new("^[a-zA-Z0-9 ]*$", RegexOptions.Compiled); diff --git a/Content.Shared/Ensnaring/Components/SharedEnsnareableComponent.cs b/Content.Shared/Ensnaring/Components/EnsnareableComponent.cs similarity index 73% rename from Content.Shared/Ensnaring/Components/SharedEnsnareableComponent.cs rename to Content.Shared/Ensnaring/Components/EnsnareableComponent.cs index c472fb8ecc..e0c3806996 100644 --- a/Content.Shared/Ensnaring/Components/SharedEnsnareableComponent.cs +++ b/Content.Shared/Ensnaring/Components/EnsnareableComponent.cs @@ -1,12 +1,13 @@ +using Robust.Shared.Containers; using Robust.Shared.GameStates; using Robust.Shared.Serialization; namespace Content.Shared.Ensnaring.Components; /// -/// Use this on an entity that you would like to be ensnared by anything that has the +/// Use this on an entity that you would like to be ensnared by anything that has the /// -[NetworkedComponent] -public abstract class SharedEnsnareableComponent : Component +[RegisterComponent, NetworkedComponent] +public sealed class EnsnareableComponent : Component { /// /// How much should this slow down the entities walk? @@ -28,6 +29,17 @@ public abstract class SharedEnsnareableComponent : Component [ViewVariables(VVAccess.ReadWrite)] [DataField("isEnsnared")] public bool IsEnsnared; + + /// + /// The container where the entity will be stored + /// + public Container Container = default!; + + [DataField("sprite")] + public string? Sprite; + + [DataField("state")] + public string? State; } [Serializable, NetSerializable] diff --git a/Content.Shared/Ensnaring/Components/SharedEnsnaringComponent.cs b/Content.Shared/Ensnaring/Components/EnsnaringComponent.cs similarity index 58% rename from Content.Shared/Ensnaring/Components/SharedEnsnaringComponent.cs rename to Content.Shared/Ensnaring/Components/EnsnaringComponent.cs index 8c68b4e6a0..1e69cdf263 100644 --- a/Content.Shared/Ensnaring/Components/SharedEnsnaringComponent.cs +++ b/Content.Shared/Ensnaring/Components/EnsnaringComponent.cs @@ -1,8 +1,12 @@ -namespace Content.Shared.Ensnaring.Components; +using System.Threading; +using Robust.Shared.GameStates; + +namespace Content.Shared.Ensnaring.Components; /// /// Use this on something you want to use to ensnare an entity with /// -public abstract class SharedEnsnaringComponent : Component +[RegisterComponent, NetworkedComponent] +public sealed class EnsnaringComponent : Component { /// /// How long it should take to free someone else. @@ -45,10 +49,19 @@ public abstract class SharedEnsnaringComponent : Component [ViewVariables(VVAccess.ReadWrite)] [DataField("ensnared")] public EntityUid? Ensnared; + + /// + /// Should movement cancel breaking out? + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("canMoveBreakout")] + public bool CanMoveBreakout; + + public CancellationTokenSource? CancelToken; } /// -/// Used whenever you want to do something when someone becomes ensnared by the +/// Used whenever you want to do something when someone becomes ensnared by the /// public sealed class EnsnareEvent : EntityEventArgs { @@ -63,9 +76,35 @@ public sealed class EnsnareEvent : EntityEventArgs } /// -/// Used whenever you want to do something when someone is freed by the +/// Used whenever you want to do something when someone is freed by the /// public sealed class EnsnareRemoveEvent : CancellableEntityEventArgs { } + +/// +/// Used for the do after event to free the entity that owns the +/// +public sealed class FreeEnsnareDoAfterComplete : EntityEventArgs +{ + public readonly EntityUid EnsnaringEntity; + + public FreeEnsnareDoAfterComplete(EntityUid ensnaringEntity) + { + EnsnaringEntity = ensnaringEntity; + } +} + +/// +/// Used for the do after event when it fails to free the entity that owns the +/// +public sealed class FreeEnsnareDoAfterCancel : EntityEventArgs +{ + public readonly EntityUid EnsnaringEntity; + + public FreeEnsnareDoAfterCancel(EntityUid ensnaringEntity) + { + EnsnaringEntity = ensnaringEntity; + } +} diff --git a/Content.Shared/Ensnaring/SharedEnsnareableSystem.cs b/Content.Shared/Ensnaring/SharedEnsnareableSystem.cs index df47d41568..f7c4051814 100644 --- a/Content.Shared/Ensnaring/SharedEnsnareableSystem.cs +++ b/Content.Shared/Ensnaring/SharedEnsnareableSystem.cs @@ -13,15 +13,15 @@ public abstract class SharedEnsnareableSystem : EntitySystem { base.Initialize(); - SubscribeLocalEvent(MovementSpeedModify); - SubscribeLocalEvent(OnEnsnare); - SubscribeLocalEvent(OnEnsnareRemove); - SubscribeLocalEvent(OnEnsnareChange); - SubscribeLocalEvent(OnGetState); - SubscribeLocalEvent(OnHandleState); + SubscribeLocalEvent(MovementSpeedModify); + SubscribeLocalEvent(OnEnsnare); + SubscribeLocalEvent(OnEnsnareRemove); + SubscribeLocalEvent(OnEnsnareChange); + SubscribeLocalEvent(OnGetState); + SubscribeLocalEvent(OnHandleState); } - private void OnHandleState(EntityUid uid, SharedEnsnareableComponent component, ref ComponentHandleState args) + private void OnHandleState(EntityUid uid, EnsnareableComponent component, ref ComponentHandleState args) { if (args.Current is not EnsnareableComponentState state) return; @@ -33,12 +33,12 @@ public abstract class SharedEnsnareableSystem : EntitySystem RaiseLocalEvent(uid, new EnsnaredChangedEvent(component.IsEnsnared)); } - private void OnGetState(EntityUid uid, SharedEnsnareableComponent component, ref ComponentGetState args) + private void OnGetState(EntityUid uid, EnsnareableComponent component, ref ComponentGetState args) { args.State = new EnsnareableComponentState(component.IsEnsnared); } - private void OnEnsnare(EntityUid uid, SharedEnsnareableComponent component, EnsnareEvent args) + private void OnEnsnare(EntityUid uid, EnsnareableComponent component, EnsnareEvent args) { component.WalkSpeed = args.WalkSpeed; component.SprintSpeed = args.SprintSpeed; @@ -49,7 +49,7 @@ public abstract class SharedEnsnareableSystem : EntitySystem RaiseLocalEvent(uid, ev); } - private void OnEnsnareRemove(EntityUid uid, SharedEnsnareableComponent component, EnsnareRemoveEvent args) + private void OnEnsnareRemove(EntityUid uid, EnsnareableComponent component, EnsnareRemoveEvent args) { _speedModifier.RefreshMovementSpeedModifiers(uid); @@ -57,17 +57,17 @@ public abstract class SharedEnsnareableSystem : EntitySystem RaiseLocalEvent(uid, ev); } - private void OnEnsnareChange(EntityUid uid, SharedEnsnareableComponent component, EnsnaredChangedEvent args) + private void OnEnsnareChange(EntityUid uid, EnsnareableComponent component, EnsnaredChangedEvent args) { UpdateAppearance(uid, component); } - private void UpdateAppearance(EntityUid uid, SharedEnsnareableComponent component, AppearanceComponent? appearance = null) + private void UpdateAppearance(EntityUid uid, EnsnareableComponent component, AppearanceComponent? appearance = null) { Appearance.SetData(uid, EnsnareableVisuals.IsEnsnared, component.IsEnsnared, appearance); } - private void MovementSpeedModify(EntityUid uid, SharedEnsnareableComponent component, RefreshMovementSpeedModifiersEvent args) + private void MovementSpeedModify(EntityUid uid, EnsnareableComponent component, RefreshMovementSpeedModifiersEvent args) { if (!component.IsEnsnared) return; diff --git a/Content.Shared/Interaction/RotateToFaceSystem.cs b/Content.Shared/Interaction/RotateToFaceSystem.cs index b2e37a8a6b..2f0ae4a416 100644 --- a/Content.Shared/Interaction/RotateToFaceSystem.cs +++ b/Content.Shared/Interaction/RotateToFaceSystem.cs @@ -89,7 +89,7 @@ namespace Content.Shared.Interaction return true; } - if (EntityManager.TryGetComponent(user, out SharedBuckleComponent? buckle) && buckle.Buckled) + if (EntityManager.TryGetComponent(user, out BuckleComponent? buckle) && buckle.Buckled) { var suid = buckle.LastEntityBuckledTo; if (suid != null) diff --git a/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs b/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs index 9782c538ac..780bdc3263 100644 --- a/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs +++ b/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs @@ -59,7 +59,7 @@ namespace Content.Shared.Pulling return false; } - if (EntityManager.TryGetComponent(puller, out var buckle)) + if (EntityManager.TryGetComponent(puller, out var buckle)) { // Prevent people pulling the chair they're on, etc. if (buckle.Buckled && (buckle.LastEntityBuckledTo == pulled)) diff --git a/Content.Server/Singularity/Components/ContainmentFieldComponent.cs b/Content.Shared/Singularity/Components/ContainmentFieldComponent.cs similarity index 69% rename from Content.Server/Singularity/Components/ContainmentFieldComponent.cs rename to Content.Shared/Singularity/Components/ContainmentFieldComponent.cs index 68a4a82c0d..9e2409e890 100644 --- a/Content.Server/Singularity/Components/ContainmentFieldComponent.cs +++ b/Content.Shared/Singularity/Components/ContainmentFieldComponent.cs @@ -1,10 +1,9 @@ -using Content.Shared.Singularity.Components; +using Robust.Shared.GameStates; -namespace Content.Server.Singularity.Components; +namespace Content.Shared.Singularity.Components; -[RegisterComponent] -[ComponentReference(typeof(SharedContainmentFieldComponent))] -public sealed class ContainmentFieldComponent : SharedContainmentFieldComponent +[RegisterComponent, NetworkedComponent] +public sealed class ContainmentFieldComponent : Component { /// /// The throw force for the field if an entity collides with it diff --git a/Content.Server/Singularity/Components/ContainmentFieldGeneratorComponent.cs b/Content.Shared/Singularity/Components/ContainmentFieldGeneratorComponent.cs similarity index 82% rename from Content.Server/Singularity/Components/ContainmentFieldGeneratorComponent.cs rename to Content.Shared/Singularity/Components/ContainmentFieldGeneratorComponent.cs index efed3a9a97..0e2ba6da02 100644 --- a/Content.Server/Singularity/Components/ContainmentFieldGeneratorComponent.cs +++ b/Content.Shared/Singularity/Components/ContainmentFieldGeneratorComponent.cs @@ -1,15 +1,16 @@ using Content.Shared.Physics; -using Content.Shared.Singularity.Components; using Content.Shared.Tag; +using Robust.Shared.GameStates; using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Server.Singularity.Components; -[RegisterComponent] -[ComponentReference(typeof(SharedContainmentFieldGeneratorComponent))] -public sealed class ContainmentFieldGeneratorComponent : SharedContainmentFieldGeneratorComponent +namespace Content.Shared.Singularity.Components; + +[RegisterComponent, NetworkedComponent] +public sealed class ContainmentFieldGeneratorComponent : Component { - private int _powerBuffer; + private int _powerBuffer; /// /// Store power with a cap. Decrease over time if not being powered from source. @@ -100,3 +101,29 @@ public sealed class ContainmentFieldGeneratorComponent : SharedContainmentFieldG [DataField("createdField", customTypeSerializer: typeof(PrototypeIdSerializer))] public string CreatedField = "ContainmentField"; } + +[Serializable, NetSerializable] +public enum ContainmentFieldGeneratorVisuals : byte +{ + PowerLight, + FieldLight, + OnLight, +} + +[Serializable, NetSerializable] +public enum PowerLevelVisuals : byte +{ + NoPower, + LowPower, + MediumPower, + HighPower, +} + +[Serializable, NetSerializable] +public enum FieldLevelVisuals : byte +{ + NoLevel, + On, + OneField, + MultipleFields, +} diff --git a/Content.Shared/Singularity/Components/SharedContainmentFieldComponent.cs b/Content.Shared/Singularity/Components/SharedContainmentFieldComponent.cs deleted file mode 100644 index 3bf970f501..0000000000 --- a/Content.Shared/Singularity/Components/SharedContainmentFieldComponent.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace Content.Shared.Singularity.Components; -public abstract class SharedContainmentFieldComponent : Component { } diff --git a/Content.Shared/Singularity/Components/SharedContainmentFieldGeneratorComponent.cs b/Content.Shared/Singularity/Components/SharedContainmentFieldGeneratorComponent.cs deleted file mode 100644 index 4a3aaab505..0000000000 --- a/Content.Shared/Singularity/Components/SharedContainmentFieldGeneratorComponent.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Robust.Shared.Serialization; - -namespace Content.Shared.Singularity.Components; -public abstract class SharedContainmentFieldGeneratorComponent : Component { } - -[Serializable, NetSerializable] -public enum ContainmentFieldGeneratorVisuals : byte -{ - PowerLight, - FieldLight, - OnLight, -} - -[Serializable, NetSerializable] -public enum PowerLevelVisuals : byte -{ - NoPower, - LowPower, - MediumPower, - HighPower, -} - -[Serializable, NetSerializable] -public enum FieldLevelVisuals : byte -{ - NoLevel, - On, - OneField, - MultipleFields, -} diff --git a/Content.Shared/Singularity/EntitySystems/SharedEventHorizonSystem.cs b/Content.Shared/Singularity/EntitySystems/SharedEventHorizonSystem.cs index 74e278a949..3cf3c5d67c 100644 --- a/Content.Shared/Singularity/EntitySystems/SharedEventHorizonSystem.cs +++ b/Content.Shared/Singularity/EntitySystems/SharedEventHorizonSystem.cs @@ -190,8 +190,8 @@ public abstract class SharedEventHorizonSystem : EntitySystem // If we can, breach containment // otherwise, check if it's containment and just keep the collision - if (EntityManager.HasComponent(otherUid) || - EntityManager.HasComponent(otherUid)) + if (EntityManager.HasComponent(otherUid) || + EntityManager.HasComponent(otherUid)) { if (comp.CanBreachContainment) args.Cancelled = true; diff --git a/Content.Shared/Vehicle/SharedVehicleSystem.cs b/Content.Shared/Vehicle/SharedVehicleSystem.cs index e47c768ec0..9e260a746d 100644 --- a/Content.Shared/Vehicle/SharedVehicleSystem.cs +++ b/Content.Shared/Vehicle/SharedVehicleSystem.cs @@ -118,7 +118,7 @@ public abstract partial class SharedVehicleSystem : EntitySystem UpdateDrawDepth(uid, 2); // This code should be purged anyway but with that being said this doesn't handle components being changed. - if (TryComp(uid, out var strap)) + if (TryComp(uid, out var strap)) { component.BaseBuckleOffset = strap.BuckleOffset; strap.BuckleOffsetUnclamped = Vector2.Zero; @@ -159,7 +159,7 @@ public abstract partial class SharedVehicleSystem : EntitySystem /// protected void UpdateBuckleOffset(TransformComponent xform, VehicleComponent component) { - if (!TryComp(component.Owner, out var strap)) + if (!TryComp(component.Owner, out var strap)) return; // TODO: Strap should handle this but buckle E/C moment. From 7587891d213d73859ae89829caa95548f22e1836 Mon Sep 17 00:00:00 2001 From: Chief-Engineer <119664036+Chief-Engineer@users.noreply.github.com> Date: Sat, 24 Dec 2022 14:50:34 -0600 Subject: [PATCH 09/30] add radio message logs (#13167) --- Content.Server/Radio/EntitySystems/RadioSystem.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Content.Server/Radio/EntitySystems/RadioSystem.cs b/Content.Server/Radio/EntitySystems/RadioSystem.cs index 27c39c168d..328b1a7101 100644 --- a/Content.Server/Radio/EntitySystems/RadioSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioSystem.cs @@ -1,7 +1,9 @@ +using Content.Server.Administration.Logs; using Content.Server.Chat.Systems; using Content.Server.Radio.Components; using Content.Server.VoiceMask; using Content.Shared.Chat; +using Content.Shared.Database; using Content.Shared.IdentityManagement; using Content.Shared.Radio; using Robust.Server.GameObjects; @@ -18,6 +20,7 @@ public sealed class RadioSystem : EntitySystem { [Dependency] private readonly INetManager _netMan = default!; [Dependency] private readonly IReplayRecordingManager _replay = default!; + [Dependency] private readonly IAdminLogManager _adminLogger = default!; // set used to prevent radio feedback loops. private readonly HashSet _messages = new(); @@ -84,6 +87,8 @@ public sealed class RadioSystem : EntitySystem RaiseLocalEvent(radio.Owner, ev); } + _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Radio message from {ToPrettyString(source):sender} on {channel.LocalizedName}: {message}"); + _replay.QueueReplayMessage(chat); _messages.Remove(message); } From f38f9499f353d78ef509f9f467954964e073fc37 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sun, 25 Dec 2022 08:07:00 +1100 Subject: [PATCH 10/30] Use UI scaling for popup overlay (#13169) * Use UI scaling for popup overlay * oop --- Content.Client/Popups/PopupOverlay.cs | 39 +++++++++++++++++++-------- Content.Client/Popups/PopupSystem.cs | 6 ++++- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/Content.Client/Popups/PopupOverlay.cs b/Content.Client/Popups/PopupOverlay.cs index eb837f90cc..f76e024d7f 100644 --- a/Content.Client/Popups/PopupOverlay.cs +++ b/Content.Client/Popups/PopupOverlay.cs @@ -1,6 +1,10 @@ +using Content.Shared.CCVar; using Content.Shared.Popups; using Robust.Client.Graphics; using Robust.Client.ResourceManagement; +using Robust.Client.UserInterface; +using Robust.Shared; +using Robust.Shared.Configuration; using Robust.Shared.Enums; using Robust.Shared.Prototypes; @@ -11,7 +15,9 @@ namespace Content.Client.Popups; /// public sealed class PopupOverlay : Overlay { + private readonly IConfigurationManager _configManager; private readonly IEntityManager _entManager; + private readonly IUserInterfaceManager _uiManager; private readonly PopupSystem _popup; private readonly ShaderInstance _shader; @@ -21,9 +27,17 @@ public sealed class PopupOverlay : Overlay public override OverlaySpace Space => OverlaySpace.ScreenSpace; - public PopupOverlay(IEntityManager entManager, IPrototypeManager protoManager, IResourceCache cache, PopupSystem popup) + public PopupOverlay( + IConfigurationManager configManager, + IEntityManager entManager, + IPrototypeManager protoManager, + IResourceCache cache, + IUserInterfaceManager uiManager, + PopupSystem popup) { + _configManager = configManager; _entManager = entManager; + _uiManager = uiManager; _popup = popup; _shader = protoManager.Index("unshaded").Instance(); @@ -39,14 +53,18 @@ public sealed class PopupOverlay : Overlay args.DrawingHandle.SetTransform(Matrix3.Identity); args.DrawingHandle.UseShader(_shader); + var scale = _configManager.GetCVar(CVars.DisplayUIScale); - DrawWorld(args.ScreenHandle, args); - DrawScreen(args.ScreenHandle, args); + if (scale == 0f) + scale = _uiManager.DefaultUIScale; + + DrawWorld(args.ScreenHandle, args, scale); + DrawScreen(args.ScreenHandle, args, scale); args.DrawingHandle.UseShader(null); } - private void DrawWorld(DrawingHandleScreen worldHandle, OverlayDrawArgs args) + private void DrawWorld(DrawingHandleScreen worldHandle, OverlayDrawArgs args, float scale) { if (_popup.WorldLabels.Count == 0) return; @@ -64,11 +82,11 @@ public sealed class PopupOverlay : Overlay continue; var pos = matrix.Transform(mapPos.Position); - DrawPopup(popup, worldHandle, pos); + DrawPopup(popup, worldHandle, pos, scale); } } - private void DrawScreen(DrawingHandleScreen screenHandle, OverlayDrawArgs args) + private void DrawScreen(DrawingHandleScreen screenHandle, OverlayDrawArgs args, float scale) { foreach (var popup in _popup.CursorLabels) { @@ -76,18 +94,17 @@ public sealed class PopupOverlay : Overlay if (popup.InitialPos.Window != args.ViewportControl?.Window?.Id) continue; - DrawPopup(popup, screenHandle, popup.InitialPos.Position); + DrawPopup(popup, screenHandle, popup.InitialPos.Position, scale); } } - private void DrawPopup(PopupSystem.PopupLabel popup, DrawingHandleScreen handle, Vector2 position) + private void DrawPopup(PopupSystem.PopupLabel popup, DrawingHandleScreen handle, Vector2 position, float scale) { const float alphaMinimum = 0.5f; var alpha = MathF.Min(1f, 1f - (popup.TotalTime - alphaMinimum) / (PopupSystem.PopupLifetime - alphaMinimum)); var updatedPosition = position - new Vector2(0f, 20f * (popup.TotalTime * popup.TotalTime + popup.TotalTime)); var font = _smallFont; - var dimensions = Vector2.Zero; var color = Color.White.WithAlpha(alpha); switch (popup.Type) @@ -113,7 +130,7 @@ public sealed class PopupOverlay : Overlay break; } - dimensions = handle.GetDimensions(font, popup.Text, 1f); - handle.DrawString(font, updatedPosition - dimensions / 2f, popup.Text, color.WithAlpha(alpha)); + var dimensions = handle.GetDimensions(font, popup.Text, scale); + handle.DrawString(font, updatedPosition - dimensions / 2f, popup.Text, scale, color.WithAlpha(alpha)); } } diff --git a/Content.Client/Popups/PopupSystem.cs b/Content.Client/Popups/PopupSystem.cs index dae90602bb..234217d784 100644 --- a/Content.Client/Popups/PopupSystem.cs +++ b/Content.Client/Popups/PopupSystem.cs @@ -4,6 +4,8 @@ using Robust.Client.Graphics; using Robust.Client.Input; using Robust.Client.Player; using Robust.Client.ResourceManagement; +using Robust.Client.UserInterface; +using Robust.Shared.Configuration; using Robust.Shared.Map; using Robust.Shared.Player; using Robust.Shared.Players; @@ -14,11 +16,13 @@ namespace Content.Client.Popups { public sealed class PopupSystem : SharedPopupSystem { + [Dependency] private readonly IConfigurationManager _configManager = default!; [Dependency] private readonly IInputManager _inputManager = default!; [Dependency] private readonly IOverlayManager _overlay = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IResourceCache _resource = default!; + [Dependency] private readonly IUserInterfaceManager _uiManager = default!; public IReadOnlyList WorldLabels => _aliveWorldLabels; public IReadOnlyList CursorLabels => _aliveCursorLabels; @@ -35,7 +39,7 @@ namespace Content.Client.Popups SubscribeNetworkEvent(OnPopupEntityEvent); SubscribeNetworkEvent(OnRoundRestart); _overlay - .AddOverlay(new PopupOverlay(EntityManager, _prototype, _resource, this)); + .AddOverlay(new PopupOverlay(_configManager, EntityManager, _prototype, _resource, _uiManager, this)); } public override void Shutdown() From cc01ed7d19314fdd7497cd4ca9fc0e1aabb7d664 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 24 Dec 2022 16:08:04 -0500 Subject: [PATCH 11/30] Automatic changelog update --- Resources/Changelog/Changelog.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 5b2e6ae2ab..d1e66218db 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Macoron - changes: - - {message: Added chameleon clothing that can mimic any uniform. Watch out for suspicious - syndicate imposters., type: Add} - id: 2300 - time: '2022-09-14T08:42:14.0000000+00:00' - author: AJCM-git changes: - {message: In-Character names now get proper casing automatically, type: Tweak} @@ -2939,3 +2933,8 @@ Entries: - {message: Jobs now have tooltip descriptions in the lobby., type: Add} id: 2799 time: '2022-12-23T23:36:12.0000000+00:00' +- author: metalgearsloth + changes: + - {message: Popups will use your UI scaling now., type: Fix} + id: 2800 + time: '2022-12-24T21:07:00.0000000+00:00' From 21d1b885d6e7b0b2d7eadc9e1d0bc49abeaf3b3d Mon Sep 17 00:00:00 2001 From: Vordenburg <114301317+Vordenburg@users.noreply.github.com> Date: Sat, 24 Dec 2022 16:22:02 -0500 Subject: [PATCH 12/30] Add a gift-giving christmas tree to nukie planet. (#13172) --- Resources/Maps/nukieplanet.yml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/Resources/Maps/nukieplanet.yml b/Resources/Maps/nukieplanet.yml index f9e606224b..d97cbb1e6a 100644 --- a/Resources/Maps/nukieplanet.yml +++ b/Resources/Maps/nukieplanet.yml @@ -826,7 +826,6 @@ entities: type: Fixtures - gravityShakeSound: !type:SoundPathSpecifier path: /Audio/Effects/alert.ogg - enabled: True type: Gravity - chunkCollection: 0,-1: @@ -5768,8 +5767,8 @@ entities: - volume: 2500 temperature: 293.15 moles: - - 18.405577 - - 69.24003 + - 17.89022 + - 67.30131 - 0 - 0 - 0 @@ -5784,7 +5783,12 @@ entities: - type: RadiationGridResistance - type: OccluderTree - type: Shuttle - - type: GridPathfinding + - nextUpdate: 34.6548388 + type: GridPathfinding + - nextShake: 0 + shakeTimes: 10 + type: GravityShake + - type: GasTileOverlay - uid: 105 type: WallPlastitanium components: @@ -13433,6 +13437,12 @@ entities: - 0 - 0 type: MapAtmosphere +- uid: 1296 + type: FloraTreeChristmas02 + components: + - pos: 5.5,-3.5 + parent: 104 + type: Transform - uid: 1320 type: SurveillanceCameraGeneral components: From a5f17a590fba815dd5ce58b391b3a67f314a8064 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sun, 25 Dec 2022 08:24:43 +1100 Subject: [PATCH 13/30] Fix tethergun (#13163) --- .../Weapons/Ranged/Systems/TetherGunSystem.cs | 12 +++--------- Content.IntegrationTests/Tests/PrototypeSaveTest.cs | 1 - .../Weapons/Ranged/Systems/TetherGunSystem.cs | 5 ++++- Resources/Prototypes/Entities/Virtual/tether.yml | 6 ++++++ 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Content.Client/Weapons/Ranged/Systems/TetherGunSystem.cs b/Content.Client/Weapons/Ranged/Systems/TetherGunSystem.cs index 9c3e214e19..9b56fdd8d7 100644 --- a/Content.Client/Weapons/Ranged/Systems/TetherGunSystem.cs +++ b/Content.Client/Weapons/Ranged/Systems/TetherGunSystem.cs @@ -17,7 +17,6 @@ public sealed class TetherGunSystem : SharedTetherGunSystem [Dependency] private readonly IEyeManager _eyeManager = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IInputManager _inputManager = default!; - [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly InputSystem _inputSystem = default!; public bool Enabled { get; set; } @@ -85,15 +84,10 @@ public sealed class TetherGunSystem : SharedTetherGunSystem if (gameState is GameplayState game) { - EntityUid? uid; + var uid = game.GetEntityUnderPosition(mousePos); - foreach (var ent in _lookup.GetEntitiesIntersecting(mousePos, LookupFlags.Approximate | LookupFlags.Static)) - { - uid = game.GetEntityUnderPosition(mousePos); - - if (uid != null) - StartDragging(uid.Value, mousePos); - } + if (uid != null) + StartDragging(uid.Value, mousePos); } if (_dragging == null) diff --git a/Content.IntegrationTests/Tests/PrototypeSaveTest.cs b/Content.IntegrationTests/Tests/PrototypeSaveTest.cs index 9388a8a1ef..86cd8cbc18 100644 --- a/Content.IntegrationTests/Tests/PrototypeSaveTest.cs +++ b/Content.IntegrationTests/Tests/PrototypeSaveTest.cs @@ -54,7 +54,6 @@ public sealed class PrototypeSaveTest "SignalSwitch", "SignalButton", "ApcNetSwitch", - "TetherEntity", "SignalButtonExt1", "SignalButtonExt2", "SignalButtonExt3", diff --git a/Content.Server/Weapons/Ranged/Systems/TetherGunSystem.cs b/Content.Server/Weapons/Ranged/Systems/TetherGunSystem.cs index 113a58f44c..5b9b73fdca 100644 --- a/Content.Server/Weapons/Ranged/Systems/TetherGunSystem.cs +++ b/Content.Server/Weapons/Ranged/Systems/TetherGunSystem.cs @@ -21,6 +21,7 @@ public sealed class TetherGunSystem : SharedTetherGunSystem [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly SharedJointSystem _joints = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; private readonly Dictionary _tethered = new(); private readonly HashSet _draggers = new(); @@ -113,6 +114,8 @@ public sealed class TetherGunSystem : SharedTetherGunSystem body.BodyStatus = BodyStatus.InAir; } + _physics.WakeBody(bodyA); + _physics.WakeBody(bodyB); var joint = _joints.CreateMouseJoint(bodyA.Owner, bodyB.Owner, id: JointId); SharedJointSystem.LinearStiffness(5f, 0.7f, bodyA.Mass, bodyB.Mass, out var stiffness, out var damping); @@ -183,7 +186,7 @@ public sealed class TetherGunSystem : SharedTetherGunSystem // Force it awake, always if (bodyQuery.TryGetComponent(entity.Entity, out var body)) { - body.WakeBody(); + _physics.WakeBody(body); } } diff --git a/Resources/Prototypes/Entities/Virtual/tether.yml b/Resources/Prototypes/Entities/Virtual/tether.yml index 31695f220e..bab8124738 100644 --- a/Resources/Prototypes/Entities/Virtual/tether.yml +++ b/Resources/Prototypes/Entities/Virtual/tether.yml @@ -3,4 +3,10 @@ noSpawn: true components: - type: Physics + bodyType: Dynamic - type: Fixtures + fixtures: + - shape: + !type:PhysShapeCircle + radius: 0.35 + id: tether From 455939afc13129be0cdff94057f771c2933169cf Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sun, 25 Dec 2022 08:31:11 +1100 Subject: [PATCH 14/30] Call reload protoypes on admin changes (#13160) * Call reload protoypes on admin changes Fixes NPCs not working after engine change. * Also chems * other fixes --- .../Managers/GamePrototypeLoadManager.cs | 17 ++++++------- .../GamePrototypeLoadManager.cs | 25 +++++++++++-------- .../EntitySystems/ChemicalReactionSystem.cs | 2 +- .../IGamePrototypeLoadManager.cs | 2 -- .../Reaction/SharedChemicalReactionSystem.cs | 12 ++++++--- 5 files changed, 30 insertions(+), 28 deletions(-) diff --git a/Content.Client/Administration/Managers/GamePrototypeLoadManager.cs b/Content.Client/Administration/Managers/GamePrototypeLoadManager.cs index 2958cd71fa..504b35cad2 100644 --- a/Content.Client/Administration/Managers/GamePrototypeLoadManager.cs +++ b/Content.Client/Administration/Managers/GamePrototypeLoadManager.cs @@ -1,8 +1,4 @@ -using System; using Content.Shared.Administration; -using Robust.Shared.IoC; -using Robust.Shared.Localization; -using Robust.Shared.Log; using Robust.Shared.Network; using Robust.Shared.Prototypes; @@ -21,19 +17,20 @@ public sealed class GamePrototypeLoadManager : IGamePrototypeLoadManager private void LoadGamePrototype(GamePrototypeLoadMessage message) { - _prototypeManager.LoadString(message.PrototypeData, true); + var changed = new Dictionary>(); + _prototypeManager.LoadString(message.PrototypeData, true, changed); _prototypeManager.ResolveResults(); + _prototypeManager.ReloadPrototypes(changed); _localizationManager.ReloadLocalizations(); - GamePrototypeLoaded?.Invoke(); Logger.InfoS("adminbus", "Loaded adminbus prototype data."); } public void SendGamePrototype(string prototype) { - var msg = _netManager.CreateNetMessage(); - msg.PrototypeData = prototype; + var msg = new GamePrototypeLoadMessage + { + PrototypeData = prototype + }; _netManager.ClientSendMessage(msg); } - - public event Action? GamePrototypeLoaded; } diff --git a/Content.Server/Administration/GamePrototypeLoadManager.cs b/Content.Server/Administration/GamePrototypeLoadManager.cs index e955931815..77a4550a15 100644 --- a/Content.Server/Administration/GamePrototypeLoadManager.cs +++ b/Content.Server/Administration/GamePrototypeLoadManager.cs @@ -17,7 +17,7 @@ public sealed class GamePrototypeLoadManager : IGamePrototypeLoadManager [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly ILocalizationManager _localizationManager = default!; - private readonly List LoadedPrototypes = new(); + private readonly List _loadedPrototypes = new(); public void Initialize() { @@ -30,8 +30,6 @@ public sealed class GamePrototypeLoadManager : IGamePrototypeLoadManager } - public event Action? GamePrototypeLoaded; - private void ClientLoadsPrototype(GamePrototypeLoadMessage message) { var player = _playerManager.GetSessionByChannel(message.MsgChannel); @@ -48,23 +46,28 @@ public sealed class GamePrototypeLoadManager : IGamePrototypeLoadManager private void LoadPrototypeData(string prototypeData) { - LoadedPrototypes.Add(prototypeData); - var msg = new GamePrototypeLoadMessage(); - msg.PrototypeData = prototypeData; + _loadedPrototypes.Add(prototypeData); + var msg = new GamePrototypeLoadMessage + { + PrototypeData = prototypeData + }; _netManager.ServerSendToAll(msg); // everyone load it up! - _prototypeManager.LoadString(prototypeData, true); // server needs it too. + var changed = new Dictionary>(); + _prototypeManager.LoadString(prototypeData, true, changed); // server needs it too. _prototypeManager.ResolveResults(); + _prototypeManager.ReloadPrototypes(changed); _localizationManager.ReloadLocalizations(); - GamePrototypeLoaded?.Invoke(); } private void NetManagerOnConnected(object? sender, NetChannelArgs e) { // Just dump all the prototypes on connect, before them missing could be an issue. - foreach (var prototype in LoadedPrototypes) + foreach (var prototype in _loadedPrototypes) { - var msg = new GamePrototypeLoadMessage(); - msg.PrototypeData = prototype; + var msg = new GamePrototypeLoadMessage + { + PrototypeData = prototype + }; e.Channel.SendMessage(msg); } } diff --git a/Content.Server/Chemistry/EntitySystems/ChemicalReactionSystem.cs b/Content.Server/Chemistry/EntitySystems/ChemicalReactionSystem.cs index b4e976c4c0..e7df6c7ed6 100644 --- a/Content.Server/Chemistry/EntitySystems/ChemicalReactionSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/ChemicalReactionSystem.cs @@ -16,7 +16,7 @@ namespace Content.Server.Chemistry.EntitySystems var coordinates = Transform(owner).Coordinates; - _adminLogger.Add(LogType.ChemicalReaction, reaction.Impact, + AdminLogger.Add(LogType.ChemicalReaction, reaction.Impact, $"Chemical reaction {reaction.ID:reaction} occurred with strength {unitReactions:strength} on entity {ToPrettyString(owner):metabolizer} at {coordinates}"); SoundSystem.Play(reaction.Sound.GetSound(), Filter.Pvs(owner, entityManager:EntityManager), owner); diff --git a/Content.Shared/Administration/IGamePrototypeLoadManager.cs b/Content.Shared/Administration/IGamePrototypeLoadManager.cs index 0437190d81..20db4d2b64 100644 --- a/Content.Shared/Administration/IGamePrototypeLoadManager.cs +++ b/Content.Shared/Administration/IGamePrototypeLoadManager.cs @@ -4,6 +4,4 @@ public interface IGamePrototypeLoadManager { public void Initialize(); public void SendGamePrototype(string prototype); - - event Action GamePrototypeLoaded; } diff --git a/Content.Shared/Chemistry/Reaction/SharedChemicalReactionSystem.cs b/Content.Shared/Chemistry/Reaction/SharedChemicalReactionSystem.cs index 6eea76926c..dd2e668c0e 100644 --- a/Content.Shared/Chemistry/Reaction/SharedChemicalReactionSystem.cs +++ b/Content.Shared/Chemistry/Reaction/SharedChemicalReactionSystem.cs @@ -21,8 +21,7 @@ namespace Content.Shared.Chemistry.Reaction [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] protected readonly ISharedAdminLogManager _adminLogger = default!; - [Dependency] private readonly IGamePrototypeLoadManager _gamePrototypeLoadManager = default!; + [Dependency] protected readonly ISharedAdminLogManager AdminLogger = default!; /// /// A cache of all existant chemical reactions indexed by one of their @@ -36,7 +35,12 @@ namespace Content.Shared.Chemistry.Reaction InitializeReactionCache(); _prototypeManager.PrototypesReloaded += OnPrototypesReloaded; - _gamePrototypeLoadManager.GamePrototypeLoaded += InitializeReactionCache; + } + + public override void Shutdown() + { + base.Shutdown(); + _prototypeManager.PrototypesReloaded -= OnPrototypesReloaded; } /// @@ -210,7 +214,7 @@ namespace Content.Shared.Chemistry.Reaction if (effect.ShouldLog) { var entity = args.SolutionEntity; - _adminLogger.Add(LogType.ReagentEffect, effect.LogImpact, + AdminLogger.Add(LogType.ReagentEffect, effect.LogImpact, $"Reaction effect {effect.GetType().Name:effect} of reaction ${reaction.ID:reaction} applied on entity {ToPrettyString(entity):entity} at {Transform(entity).Coordinates:coordinates}"); } From 56bdfad9122fc10616d53ec38827bc071a32e7b9 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Sat, 24 Dec 2022 16:33:08 -0500 Subject: [PATCH 15/30] mech bug fixes (#13155) * mech bug fixes * struct events * fug --- .../EntitySystems/MechGrabberSystem.cs | 15 ++++++----- Content.Server/Mech/Systems/MechSystem.cs | 8 ++++++ Content.Server/Tools/ToolSystem.cs | 27 +++++++++++++++++++ .../Mech/EntitySystems/SharedMechSystem.cs | 5 ++-- Resources/Locale/en-US/mech/mech.ftl | 2 +- 5 files changed, 46 insertions(+), 11 deletions(-) diff --git a/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs b/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs index a225334532..a947d99e93 100644 --- a/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs +++ b/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs @@ -7,6 +7,7 @@ using Content.Server.Mech.Systems; using Content.Shared.Interaction; using Content.Shared.Mech; using Content.Shared.Mech.Equipment.Components; +using Content.Shared.MobState.Components; using Content.Shared.Wall; using Robust.Shared.Containers; using Robust.Shared.Map; @@ -115,17 +116,17 @@ public sealed class MechGrabberSystem : EntitySystem private void OnInteract(EntityUid uid, MechGrabberComponent component, InteractNoHandEvent args) { - if (args.Handled || args.Target == null) + if (args.Handled || args.Target is not {} target) return; - var xform = Transform(args.Target.Value); - if (xform.Anchored || HasComp(args.Target.Value)) + var xform = Transform(target); + if (xform.Anchored || HasComp(target) || HasComp(target)) return; if (component.ItemContainer.ContainedEntities.Count >= component.MaxContents) return; - if (!TryComp(args.User, out var mech)) + if (!TryComp(args.User, out var mech) || mech.PilotSlot.ContainedEntity == target) return; if (mech.Energy + component.GrabEnergyDelta < 0) @@ -134,17 +135,17 @@ public sealed class MechGrabberSystem : EntitySystem if (component.Token != null) return; - if (!_interaction.InRangeUnobstructed(args.User, args.Target.Value)) + if (!_interaction.InRangeUnobstructed(args.User, target)) return; args.Handled = true; component.Token = new(); component.AudioStream = _audio.PlayPvs(component.GrabSound, uid); - _doAfter.DoAfter(new DoAfterEventArgs(args.User, component.GrabDelay, component.Token.Token, args.Target, uid) + _doAfter.DoAfter(new DoAfterEventArgs(args.User, component.GrabDelay, component.Token.Token, target, uid) { BreakOnTargetMove = true, BreakOnUserMove = true, - UsedFinishedEvent = new MechGrabberGrabFinishedEvent(args.Target.Value), + UsedFinishedEvent = new MechGrabberGrabFinishedEvent(target), UsedCancelledEvent = new MechGrabberGrabCancelledEvent() }); } diff --git a/Content.Server/Mech/Systems/MechSystem.cs b/Content.Server/Mech/Systems/MechSystem.cs index b122e05b90..9e82a1085f 100644 --- a/Content.Server/Mech/Systems/MechSystem.cs +++ b/Content.Server/Mech/Systems/MechSystem.cs @@ -4,6 +4,7 @@ using Content.Server.Atmos.EntitySystems; using Content.Server.DoAfter; using Content.Server.Mech.Components; using Content.Server.Power.Components; +using Content.Server.Tools; using Content.Server.Wires; using Content.Shared.Damage; using Content.Shared.FixedPoint; @@ -52,6 +53,7 @@ public sealed class MechSystem : SharedMechSystem SubscribeLocalEvent(OnDamageChanged); SubscribeLocalEvent(OnRemoveEquipmentMessage); + SubscribeLocalEvent(OnToolUseAttempt); SubscribeLocalEvent(OnInhale); SubscribeLocalEvent(OnExhale); SubscribeLocalEvent(OnExpose); @@ -137,6 +139,12 @@ public sealed class MechSystem : SharedMechSystem ToggleMechUi(uid, component); } + private void OnToolUseAttempt(EntityUid uid, MechPilotComponent component, ref ToolUserAttemptUseEvent args) + { + if (args.Target == component.Mech) + args.Cancelled = true; + } + private void OnAlternativeVerb(EntityUid uid, MechComponent component, GetVerbsEvent args) { if (!args.CanAccess || !args.CanInteract || component.Broken) diff --git a/Content.Server/Tools/ToolSystem.cs b/Content.Server/Tools/ToolSystem.cs index f8ddceefe5..3ffdc3680f 100644 --- a/Content.Server/Tools/ToolSystem.cs +++ b/Content.Server/Tools/ToolSystem.cs @@ -119,6 +119,11 @@ namespace Content.Server.Tools if (!Resolve(tool, ref toolComponent, false)) return false; + var ev = new ToolUserAttemptUseEvent(user, target); + RaiseLocalEvent(user, ref ev); + if (ev.Cancelled) + return false; + if (!ToolStartUse(tool, user, fuel, toolQualitiesNeeded, toolComponent)) return false; @@ -173,6 +178,11 @@ namespace Content.Server.Tools if (!Resolve(tool, ref toolComponent, false)) return false; + var ev = new ToolUserAttemptUseEvent(user, target); + RaiseLocalEvent(user, ref ev); + if (ev.Cancelled) + return false; + if (!ToolStartUse(tool, user, fuel, toolQualitiesNeeded, toolComponent)) return false; @@ -306,6 +316,23 @@ namespace Content.Server.Tools } } + /// + /// Event raised on the user of a tool to see if they can actually use it. + /// + [ByRefEvent] + public struct ToolUserAttemptUseEvent + { + public EntityUid User; + public EntityUid? Target; + public bool Cancelled = false; + + public ToolUserAttemptUseEvent(EntityUid user, EntityUid? target) + { + User = user; + Target = target; + } + } + /// /// Attempt event called *after* any do afters to see if the tool usage should succeed or not. /// You can use this event to consume any fuel needed. diff --git a/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs b/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs index d7e63aece8..00737f7443 100644 --- a/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs +++ b/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs @@ -4,9 +4,9 @@ using Content.Shared.Access.Systems; using Content.Shared.ActionBlocker; using Content.Shared.Actions; using Content.Shared.Actions.ActionTypes; -using Content.Shared.Body.Components; using Content.Shared.Destructible; using Content.Shared.FixedPoint; +using Content.Shared.Hands.Components; using Content.Shared.Interaction; using Content.Shared.Interaction.Components; using Content.Shared.Interaction.Events; @@ -18,7 +18,6 @@ using Content.Shared.Popups; using Content.Shared.Weapons.Melee; using Robust.Shared.Containers; using Robust.Shared.GameStates; -using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Timing; @@ -374,7 +373,7 @@ public abstract class SharedMechSystem : EntitySystem if (!Resolve(uid, ref component)) return false; - return IsEmpty(component) && _actionBlocker.CanMove(toInsert) && HasComp(toInsert); + return IsEmpty(component) && _actionBlocker.CanMove(toInsert) && HasComp(toInsert); } /// diff --git a/Resources/Locale/en-US/mech/mech.ftl b/Resources/Locale/en-US/mech/mech.ftl index faf3ef3661..d833cee646 100644 --- a/Resources/Locale/en-US/mech/mech.ftl +++ b/Resources/Locale/en-US/mech/mech.ftl @@ -1,5 +1,5 @@ mech-verb-enter = Enter -mech-verb-exit = Exit +mech-verb-exit = Remove pilot mech-equipment-begin-install = Installing the {THE($item)}... mech-equipment-finish-install = Finished installing the {THE($item)} From 3657e16937c1f2f74557fdd886d1ac060c72ad80 Mon Sep 17 00:00:00 2001 From: keronshb <54602815+keronshb@users.noreply.github.com> Date: Sat, 24 Dec 2022 16:34:11 -0500 Subject: [PATCH 16/30] Fixes a subdermal exception (#13145) * fixes subdermal exception * Changes linq check to a foreach loop to remove the entities, also moves TODO note to containersystem * comment to push change * removes dummy comment --- .../Implants/SharedSubdermalImplantSystem.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Content.Shared/Implants/SharedSubdermalImplantSystem.cs b/Content.Shared/Implants/SharedSubdermalImplantSystem.cs index 58ec2348a2..acdae85da1 100644 --- a/Content.Shared/Implants/SharedSubdermalImplantSystem.cs +++ b/Content.Shared/Implants/SharedSubdermalImplantSystem.cs @@ -1,4 +1,5 @@ -using Content.Shared.Actions; +using System.Linq; +using Content.Shared.Actions; using Content.Shared.Actions.ActionTypes; using Content.Shared.Implants.Components; using Content.Shared.Tag; @@ -67,8 +68,15 @@ public abstract class SharedSubdermalImplantSystem : EntitySystem var entCoords = Transform(component.ImplantedEntity.Value).Coordinates; - // TODO add variant of empty container that dumpes entities into parent containers OR grid OR Map - _container.EmptyContainer(storageImplant, true, entCoords, true, EntityManager); + var containedEntites = storageImplant.ContainedEntities.ToArray(); + + foreach (var entity in containedEntites) + { + if (Terminating(entity)) + continue; + + _container.RemoveEntity(storageImplant.Owner, entity, force: true, destination: entCoords); + } } /// From 6cfdbd6f04c581831cb3af17df9c6f21a7544ee5 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 24 Dec 2022 16:34:11 -0500 Subject: [PATCH 17/30] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d1e66218db..f8edab4489 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,9 +1,4 @@ Entries: -- author: AJCM-git - changes: - - {message: In-Character names now get proper casing automatically, type: Tweak} - id: 2301 - time: '2022-09-14T09:50:15.0000000+00:00' - author: metalgearsloth changes: - {message: Shooting at and shooting from vehicles now works as expected, type: Fix} @@ -2938,3 +2933,12 @@ Entries: - {message: Popups will use your UI scaling now., type: Fix} id: 2800 time: '2022-12-24T21:07:00.0000000+00:00' +- author: EmoGarbage404 + changes: + - {message: Mechs can no longer pick up the pilot inside the mech., type: Fix} + - {message: Mechs can no longer be piloted by non-humanoids., type: Fix} + - {message: Hydraulic clamps can no longer pick up living creatures. (too wriggly), + type: Fix} + - {message: You can no longer repair a mech from inside of it., type: Fix} + id: 2801 + time: '2022-12-24T21:33:08.0000000+00:00' From f5e662846549825f33e7cd55711f24ec6d760faf Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sun, 25 Dec 2022 11:29:52 +1100 Subject: [PATCH 18/30] NPC separation adjustments (#13176) --- Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs b/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs index 34c53b8e98..93302861da 100644 --- a/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs +++ b/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs @@ -394,7 +394,8 @@ public sealed partial class NPCSteeringSystem (layer & otherBody.CollisionMask) == 0x0 || !factionQuery.TryGetComponent(ent, out var otherFaction) || !_faction.IsFriendly(uid, ent, ourFaction, otherFaction) || - Vector2.Dot(otherBody.LinearVelocity, ourVelocity) < 0f) + // Use <= 0 so we ignore stationary friends in case. + Vector2.Dot(otherBody.LinearVelocity, ourVelocity) <= 0f) { continue; } @@ -415,7 +416,7 @@ public sealed partial class NPCSteeringSystem obstacleDirection = offsetRot.RotateVec(obstacleDirection); var norm = obstacleDirection.Normalized; var weight = obstableDistance <= agentRadius ? 1f : (detectionRadius - obstableDistance) / detectionRadius; - weight *= 1.5f; + weight *= 1f; for (var i = 0; i < InterestDirections; i++) { From 98993f5e9d4e7237d01fffb56e0836ef49829970 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sun, 25 Dec 2022 11:30:00 +1100 Subject: [PATCH 19/30] NPC separation adjustments (#13176) From f5b4cadd227c1da14fed431bfaedd39cfab8b895 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 24 Dec 2022 19:31:04 -0500 Subject: [PATCH 20/30] Automatic changelog update --- Resources/Changelog/Changelog.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f8edab4489..830086c93a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,9 +1,4 @@ Entries: -- author: metalgearsloth - changes: - - {message: Shooting at and shooting from vehicles now works as expected, type: Fix} - id: 2302 - time: '2022-09-14T10:03:00.0000000+00:00' - author: themias changes: - {message: 'Trash bags can pick up empty booze bottles, empty ingredient packs, @@ -2942,3 +2937,9 @@ Entries: - {message: You can no longer repair a mech from inside of it., type: Fix} id: 2801 time: '2022-12-24T21:33:08.0000000+00:00' +- author: metalgearsloth + changes: + - {message: NPCs will ignore stationary allies for separation. Pets in particular + will move through other stationary pets., type: Tweak} + id: 2802 + time: '2022-12-25T00:30:01.0000000+00:00' From bc8f3dc0b0b95db31c3bd4dae13602cd138e905e Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sun, 25 Dec 2022 11:35:00 +1100 Subject: [PATCH 21/30] Fix some NPC dancing (#13177) - Bump the collision avoidance range, seemed okay compared to last time I tried. Means they shouldn't get caught by thindows - Removed the steer frequency because I'm pretty sure that lead to dancing in some instances. --- .../NPC/Components/NPCSteeringComponent.cs | 14 -------------- Content.Server/NPC/Systems/NPCSteeringSystem.cs | 9 +++------ 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/Content.Server/NPC/Components/NPCSteeringComponent.cs b/Content.Server/NPC/Components/NPCSteeringComponent.cs index 34b4e7b79b..98f10311ea 100644 --- a/Content.Server/NPC/Components/NPCSteeringComponent.cs +++ b/Content.Server/NPC/Components/NPCSteeringComponent.cs @@ -36,20 +36,6 @@ public sealed class NPCSteeringComponent : Component #endregion - /// - /// How many times per second we're allowed to update our steering frequency. - /// - public const byte SteerFrequency = 10; - - /// - /// Last time the NPC steered. - /// - [ViewVariables] - public TimeSpan LastTimeSteer; - - [ViewVariables] - public Vector2 LastSteer; - /// /// Have we currently requested a path. /// diff --git a/Content.Server/NPC/Systems/NPCSteeringSystem.cs b/Content.Server/NPC/Systems/NPCSteeringSystem.cs index db2105d394..0dc82f8d83 100644 --- a/Content.Server/NPC/Systems/NPCSteeringSystem.cs +++ b/Content.Server/NPC/Systems/NPCSteeringSystem.cs @@ -216,7 +216,6 @@ namespace Content.Server.NPC.Systems var (steering, _, mover, xform) = npcs[i]; Steer(steering, mover, xform, modifierQuery, bodyQuery, xformQuery, frameTime); - steering.LastSteer = mover.CurTickSprintMovement; }); @@ -287,8 +286,7 @@ namespace Content.Server.NPC.Systems return; } - // TODO: Pause time - // Need it on the paused event which needs an engine PR. + /* If you wish to not steer every tick A) Add pause support B) fix overshoots to prevent dancing var nextSteer = steering.LastTimeSteer + TimeSpan.FromSeconds(1f / NPCSteeringComponent.SteerFrequency); if (nextSteer > _timing.CurTime) @@ -296,8 +294,8 @@ namespace Content.Server.NPC.Systems SetDirection(mover, steering, steering.LastSteer, false); return; } + */ - steering.LastTimeSteer = _timing.CurTime; var uid = mover.Owner; var interest = steering.Interest; var danger = steering.Danger; @@ -309,7 +307,6 @@ namespace Content.Server.NPC.Systems var offsetRot = -_mover.GetParentGridAngle(mover); modifierQuery.TryGetComponent(uid, out var modifier); var moveSpeed = GetSprintSpeed(steering.Owner, modifier); - var tickMove = moveSpeed * frameTime; var body = bodyQuery.GetComponent(uid); var dangerPoints = steering.DangerPoints; dangerPoints.Clear(); @@ -331,7 +328,7 @@ namespace Content.Server.NPC.Systems DebugTools.Assert(!float.IsNaN(interest[0])); // Avoid static objects like walls - CollisionAvoidance(uid, offsetRot, worldPos, agentRadius, tickMove, layer, mask, xform, danger, dangerPoints, bodyQuery, xformQuery); + CollisionAvoidance(uid, offsetRot, worldPos, agentRadius, moveSpeed, layer, mask, xform, danger, dangerPoints, bodyQuery, xformQuery); DebugTools.Assert(!float.IsNaN(danger[0])); Separation(uid, offsetRot, worldPos, agentRadius, layer, mask, body, xform, danger, bodyQuery, xformQuery); From 6054e3b17092eb1e16aac2dd1c8fbd265a75fc66 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 24 Dec 2022 19:36:03 -0500 Subject: [PATCH 22/30] Automatic changelog update --- Resources/Changelog/Changelog.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 830086c93a..5c584c1870 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: themias - changes: - - {message: 'Trash bags can pick up empty booze bottles, empty ingredient packs, - and plastic plates', type: Tweak} - id: 2303 - time: '2022-09-14T17:14:55.0000000+00:00' - author: Mervill changes: - {message: Empty Fuel Tank wont explode., type: Add} @@ -2943,3 +2937,9 @@ Entries: will move through other stationary pets., type: Tweak} id: 2802 time: '2022-12-25T00:30:01.0000000+00:00' +- author: metalgearsloth + changes: + - {message: Bump NPC avoidance range and fix some instances of unapproved dancing., + type: Fix} + id: 2803 + time: '2022-12-25T00:35:00.0000000+00:00' From a88d437f52c6640e5abfcfb71e1342f456d37d03 Mon Sep 17 00:00:00 2001 From: Vordenburg <114301317+Vordenburg@users.noreply.github.com> Date: Sat, 24 Dec 2022 19:47:56 -0500 Subject: [PATCH 23/30] Spawn PointingArrow with EntityCoordinates instead of MapCoordinates. (#13133) --- Content.Server/Pointing/EntitySystems/PointingSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Pointing/EntitySystems/PointingSystem.cs b/Content.Server/Pointing/EntitySystems/PointingSystem.cs index f8fce9939f..31a7e59cb0 100644 --- a/Content.Server/Pointing/EntitySystems/PointingSystem.cs +++ b/Content.Server/Pointing/EntitySystems/PointingSystem.cs @@ -144,7 +144,7 @@ namespace Content.Server.Pointing.EntitySystems var mapCoords = coords.ToMap(EntityManager); _rotateToFaceSystem.TryFaceCoordinates(player, mapCoords.Position); - var arrow = EntityManager.SpawnEntity("PointingArrow", mapCoords); + var arrow = EntityManager.SpawnEntity("PointingArrow", coords); if (TryComp(arrow, out var pointing)) { From 5eadce16ecd9904e02c9950fe06f68248389f506 Mon Sep 17 00:00:00 2001 From: Chief-Engineer <119664036+Chief-Engineer@users.noreply.github.com> Date: Sat, 24 Dec 2022 18:59:49 -0600 Subject: [PATCH 24/30] Add present logs (#13144) * add logs for SpawnItemsOnUse * add logs for RandomGift * add and use EntitySpawn log type --- Content.Server/Holiday/Christmas/RandomGiftSystem.cs | 6 +++++- .../Storage/EntitySystems/SpawnItemsOnUseSystem.cs | 4 ++++ Content.Shared.Database/LogType.cs | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Content.Server/Holiday/Christmas/RandomGiftSystem.cs b/Content.Server/Holiday/Christmas/RandomGiftSystem.cs index a830b85721..29ec823aa7 100644 --- a/Content.Server/Holiday/Christmas/RandomGiftSystem.cs +++ b/Content.Server/Holiday/Christmas/RandomGiftSystem.cs @@ -1,4 +1,6 @@ -using Content.Server.Hands.Systems; +using Content.Server.Administration.Logs; +using Content.Server.Hands.Systems; +using Content.Shared.Database; using Content.Shared.Examine; using Content.Shared.Interaction.Events; using Content.Shared.Item; @@ -20,6 +22,7 @@ public sealed class RandomGiftSystem : EntitySystem [Dependency] private readonly IComponentFactory _componentFactory = default!; [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly IAdminLogManager _adminLogger = default!; private readonly List _possibleGiftsSafe = new(); private readonly List _possibleGiftsUnsafe = new(); @@ -54,6 +57,7 @@ public sealed class RandomGiftSystem : EntitySystem var coords = Transform(args.User).Coordinates; var handsEnt = Spawn(component.SelectedEntity, coords); + _adminLogger.Add(LogType.EntitySpawn, LogImpact.Low, $"{ToPrettyString(args.User)} used {ToPrettyString(component.Owner)} which spawned {ToPrettyString(handsEnt)}"); EnsureComp(handsEnt); // For insane mode. if (component.Wrapper is not null) Spawn(component.Wrapper, coords); diff --git a/Content.Server/Storage/EntitySystems/SpawnItemsOnUseSystem.cs b/Content.Server/Storage/EntitySystems/SpawnItemsOnUseSystem.cs index 3a8f67673b..35936fea5c 100644 --- a/Content.Server/Storage/EntitySystems/SpawnItemsOnUseSystem.cs +++ b/Content.Server/Storage/EntitySystems/SpawnItemsOnUseSystem.cs @@ -1,4 +1,6 @@ +using Content.Server.Administration.Logs; using Content.Server.Storage.Components; +using Content.Shared.Database; using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction.Events; using Content.Shared.Storage; @@ -11,6 +13,7 @@ namespace Content.Server.Storage.EntitySystems public sealed class SpawnItemsOnUseSystem : EntitySystem { [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; public override void Initialize() @@ -32,6 +35,7 @@ namespace Content.Server.Storage.EntitySystems foreach (var proto in spawnEntities) { entityToPlaceInHands = Spawn(proto, coords); + _adminLogger.Add(LogType.EntitySpawn, LogImpact.Low, $"{ToPrettyString(args.User)} used {ToPrettyString(component.Owner)} which spawned {ToPrettyString(entityToPlaceInHands.Value)}"); } if (component.Sound != null) diff --git a/Content.Shared.Database/LogType.cs b/Content.Shared.Database/LogType.cs index 25b0f3a833..0a17fec264 100644 --- a/Content.Shared.Database/LogType.cs +++ b/Content.Shared.Database/LogType.cs @@ -79,4 +79,5 @@ public enum LogType LatticeCut = 74, Stripping = 75, Stamina = 76, + EntitySpawn = 77, } From 6d97764e9d25c1889854fd2cd7b44c530f9a79d8 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Sat, 24 Dec 2022 20:59:51 -0500 Subject: [PATCH 25/30] Goodbye Microwave, Hello Hot Plates! (#13061) * hot plates * sprite fix AND i spelled it wrong AND forgot upgrade examine * fix license * IGameTiming is shit like yo mamma * active comp --- .../ActiveSolutionHeaterComponent.cs | 7 ++ .../Components/SolutionHeaterComponent.cs | 19 +++++ .../EntitySystems/SolutionHeaterSystem.cs | 65 ++++++++++++++++++ .../components/solution-heater-component.ftl | 1 + .../Catalog/Research/technologies.yml | 1 + .../Circuitboards/Machine/production.yml | 13 ++++ .../Entities/Structures/Machines/hotplate.yml | 57 +++++++++++++++ .../Entities/Structures/Machines/lathe.yml | 1 + .../Prototypes/Recipes/Lathes/electronics.yml | 9 +++ .../Machines/hotplate.rsi/beaker.png | Bin 0 -> 218 bytes .../Structures/Machines/hotplate.rsi/icon.png | Bin 0 -> 382 bytes .../Machines/hotplate.rsi/meta.json | 1 + .../Structures/Machines/hotplate.rsi/on.png | Bin 0 -> 115 bytes 13 files changed, 174 insertions(+) create mode 100644 Content.Server/Chemistry/Components/ActiveSolutionHeaterComponent.cs create mode 100644 Content.Server/Chemistry/Components/SolutionHeaterComponent.cs create mode 100644 Content.Server/Chemistry/EntitySystems/SolutionHeaterSystem.cs create mode 100644 Resources/Locale/en-US/chemistry/components/solution-heater-component.ftl create mode 100644 Resources/Prototypes/Entities/Structures/Machines/hotplate.yml create mode 100644 Resources/Textures/Structures/Machines/hotplate.rsi/beaker.png create mode 100644 Resources/Textures/Structures/Machines/hotplate.rsi/icon.png create mode 100644 Resources/Textures/Structures/Machines/hotplate.rsi/meta.json create mode 100644 Resources/Textures/Structures/Machines/hotplate.rsi/on.png diff --git a/Content.Server/Chemistry/Components/ActiveSolutionHeaterComponent.cs b/Content.Server/Chemistry/Components/ActiveSolutionHeaterComponent.cs new file mode 100644 index 0000000000..b94855ef39 --- /dev/null +++ b/Content.Server/Chemistry/Components/ActiveSolutionHeaterComponent.cs @@ -0,0 +1,7 @@ +namespace Content.Server.Chemistry.Components; + +[RegisterComponent] +public sealed class ActiveSolutionHeaterComponent : Component +{ + +} diff --git a/Content.Server/Chemistry/Components/SolutionHeaterComponent.cs b/Content.Server/Chemistry/Components/SolutionHeaterComponent.cs new file mode 100644 index 0000000000..888f4d2123 --- /dev/null +++ b/Content.Server/Chemistry/Components/SolutionHeaterComponent.cs @@ -0,0 +1,19 @@ +namespace Content.Server.Chemistry.Components; + +[RegisterComponent] +public sealed class SolutionHeaterComponent : Component +{ + public readonly string BeakerSlotId = "beakerSlot"; + + [DataField("heatPerSecond")] + public float HeatPerSecond = 120; + + [ViewVariables(VVAccess.ReadWrite)] + public float HeatMultiplier = 1; + + [DataField("machinePartHeatPerSecond")] + public string MachinePartHeatPerSecond = "Laser"; + + [DataField("partRatingHeatMultiplier")] + public float PartRatingHeatMultiplier = 1.5f; +} diff --git a/Content.Server/Chemistry/EntitySystems/SolutionHeaterSystem.cs b/Content.Server/Chemistry/EntitySystems/SolutionHeaterSystem.cs new file mode 100644 index 0000000000..47f2d2d981 --- /dev/null +++ b/Content.Server/Chemistry/EntitySystems/SolutionHeaterSystem.cs @@ -0,0 +1,65 @@ +using Content.Server.Chemistry.Components; +using Content.Server.Chemistry.Components.SolutionManager; +using Content.Server.Construction; +using Content.Server.Power.Components; +using Content.Shared.Containers.ItemSlots; + +namespace Content.Server.Chemistry.EntitySystems; + +public sealed class SolutionHeaterSystem : EntitySystem +{ + [Dependency] private readonly ItemSlotsSystem _itemSlots = default!; + [Dependency] private readonly SolutionContainerSystem _solution = default!; + + /// + public override void Initialize() + { + SubscribeLocalEvent(OnPowerChanged); + SubscribeLocalEvent(OnRefreshParts); + SubscribeLocalEvent(OnUpgradeExamine); + } + + private void OnPowerChanged(EntityUid uid, SolutionHeaterComponent component, ref PowerChangedEvent args) + { + if (args.Powered) + { + EnsureComp(uid); + } + else + { + RemComp(uid); + } + } + + private void OnRefreshParts(EntityUid uid, SolutionHeaterComponent component, RefreshPartsEvent args) + { + var heatRating = args.PartRatings[component.MachinePartHeatPerSecond] - 1; + + component.HeatMultiplier = MathF.Pow(component.PartRatingHeatMultiplier, heatRating); + } + + private void OnUpgradeExamine(EntityUid uid, SolutionHeaterComponent component, UpgradeExamineEvent args) + { + args.AddPercentageUpgrade("solution-heater-upgrade-heat", component.HeatMultiplier); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + foreach (var (_, heater) in EntityQuery()) + { + if (_itemSlots.GetItemOrNull(heater.Owner, heater.BeakerSlotId) is not { } item) + continue; + + if (!TryComp(item, out var solution)) + continue; + + var energy = heater.HeatPerSecond * heater.HeatMultiplier * frameTime; + foreach (var s in solution.Solutions.Values) + { + _solution.AddThermalEnergy(solution.Owner, s, energy); + } + } + } +} diff --git a/Resources/Locale/en-US/chemistry/components/solution-heater-component.ftl b/Resources/Locale/en-US/chemistry/components/solution-heater-component.ftl new file mode 100644 index 0000000000..cecf15550c --- /dev/null +++ b/Resources/Locale/en-US/chemistry/components/solution-heater-component.ftl @@ -0,0 +1 @@ +solution-heater-upgrade-heat = Heat strength diff --git a/Resources/Prototypes/Catalog/Research/technologies.yml b/Resources/Prototypes/Catalog/Research/technologies.yml index f62b28da1c..57c8385b1f 100644 --- a/Resources/Prototypes/Catalog/Research/technologies.yml +++ b/Resources/Prototypes/Catalog/Research/technologies.yml @@ -103,6 +103,7 @@ - Dropper - Syringe - ReagentGrinderMachineCircuitboard + - HotplateMachineCircuitboard - PillCanister - ChemistryEmptyBottle01 - ChemicalPayload diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml index 970ae66ce3..becc60ef10 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml @@ -507,6 +507,19 @@ DefaultPrototype: Beaker ExamineName: Glass Beaker +- type: entity + id: HotplateMachineCircuitboard + parent: BaseMachineCircuitboard + name: hotplate machine board + description: A machine printed circuit board for a hotplate + components: + - type: MachineBoard + prototype: ChemistryHotplate + requirements: + Laser: 2 + materialRequirements: + Steel: 2 + - type: entity id: StasisBedMachineCircuitboard parent: BaseMachineCircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Machines/hotplate.yml b/Resources/Prototypes/Entities/Structures/Machines/hotplate.yml new file mode 100644 index 0000000000..837f8cfaf1 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Machines/hotplate.yml @@ -0,0 +1,57 @@ +- type: entity + id: ChemistryHotplate + parent: [ BaseMachinePowered, ConstructibleMachine ] + name: hotplate + description: "The descendent of the microwaves, our newest invention in beaker heating technology: the hotplate!" + components: + - type: Transform + anchored: true + - type: Fixtures + fixtures: + - shape: + !type:PhysShapeAabb + bounds: "-0.08,-0.35,0.15,0.25" + mask: + - TabletopMachineMask + layer: + - TabletopMachineLayer + - type: Sprite + netsync: false + sprite: Structures/Machines/hotplate.rsi + drawdepth: SmallObjects + snapCardinals: true + layers: + - state: icon + - state: on + map: ["enum.PowerDeviceVisualLayers.Powered"] + shader: unshaded + - type: ApcPowerReceiver + powerLoad: 300 + - type: ItemSlots + slots: + beakerSlot: + whitelist: + components: + - FitsInDispenser + - type: ItemMapper + sprite: Structures/Machines/hotplate.rsi + mapLayers: + beaker: + whitelist: + components: + - FitsInDispenser + - type: SolutionHeater + - type: Machine + board: HotplateMachineCircuitboard + - type: Appearance + - type: ContainerContainer + containers: + beakerSlot: !type:ContainerSlot + machine_board: !type:Container + machine_parts: !type:Container + - type: GenericVisualizer + visuals: + enum.PowerDeviceVisuals.Powered: + enum.PowerDeviceVisualLayers.Powered: + True: { visible: true } + False: { visible: false } diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 8b06f91dca..1a7d84a844 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -287,6 +287,7 @@ - AutolatheMachineCircuitboard - ProtolatheMachineCircuitboard - ReagentGrinderMachineCircuitboard + - HotplateMachineCircuitboard - MicrowaveMachineCircuitboard - UniformPrinterMachineCircuitboard - ShuttleConsoleCircuitboard diff --git a/Resources/Prototypes/Recipes/Lathes/electronics.yml b/Resources/Prototypes/Recipes/Lathes/electronics.yml index 9d7b811a93..8814b7a76f 100644 --- a/Resources/Prototypes/Recipes/Lathes/electronics.yml +++ b/Resources/Prototypes/Recipes/Lathes/electronics.yml @@ -223,6 +223,15 @@ Steel: 100 Glass: 900 +- type: latheRecipe + id: HotplateMachineCircuitboard + icon: { sprite: Objects/Misc/module.rsi, state: id_mod } + result: HotplateMachineCircuitboard + completetime: 4 + materials: + Steel: 100 + Glass: 900 + - type: latheRecipe id: AnalysisComputerCircuitboard icon: { sprite: Objects/Misc/module.rsi, state: cpu_science } diff --git a/Resources/Textures/Structures/Machines/hotplate.rsi/beaker.png b/Resources/Textures/Structures/Machines/hotplate.rsi/beaker.png new file mode 100644 index 0000000000000000000000000000000000000000..1ca59f76996989271e35693001075e6ff706afb8 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Q#@T9Ln2y} z6C_v{Cy4Zv9PsE(@?1PqP33 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/hotplate.rsi/icon.png b/Resources/Textures/Structures/Machines/hotplate.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ee6f0599cf87d16a1c0461580be3efa71877500e GIT binary patch literal 382 zcmV-^0fGLBP)Px$I7vi7R9J=WlRrztKp4hj z3XN_$NTDSmL!pDY^v@@#lR;X&OM}qme$xy0+;h*p?;RKn27_VG9261tgJ508{Kj>) z{#rpl2-e58UFLjdQffmSmU8|_v;m?xW+vs%#xp62;#jLYQZ076UOxLWA-+8xdj6kd z&~_jk4hr35lPHb}hXbun*#Q9I*o-G5#*@*`A%tU-rRvTp11z#R!m+7aLTTboeS#Bj ztNvVOEV8+BuXY4=OYr>o#Qj|l0Hw-gp5dd6XU*&bW zT9UrM0pvGrG#VsHvQ-yB8K5d^gs(4Jlb@PReO1)T2LL!dKO;*es;~4Lovybo@(2wE cgJJJ{0bS8))xYBMBme*a07*qoM6N<$f>l4EumAu6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/hotplate.rsi/meta.json b/Resources/Textures/Structures/Machines/hotplate.rsi/meta.json new file mode 100644 index 0000000000..32cd77a8f6 --- /dev/null +++ b/Resources/Textures/Structures/Machines/hotplate.rsi/meta.json @@ -0,0 +1 @@ +{"license": "CC0-1.0", "copyright": "Created by EmoGarbage","version": 1, "size": {"x": 32, "y": 32}, "states": [{"name": "icon"}, {"name": "beaker"}, {"name": "on"}]} diff --git a/Resources/Textures/Structures/Machines/hotplate.rsi/on.png b/Resources/Textures/Structures/Machines/hotplate.rsi/on.png new file mode 100644 index 0000000000000000000000000000000000000000..20582bf810744201c937c149145caab52e8ada1c GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}x}GkMArY-_ z&oS}>RWTS?MIPY`+o+;=ronK|8~+a+3=DMz&sNFojnR-74ux6Mg~t; KKbLh*2~7Yh%pfNK literal 0 HcmV?d00001 From fddcc0cece1b09aa59effe75dc1e7129aca03118 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 24 Dec 2022 21:00:55 -0500 Subject: [PATCH 26/30] Automatic changelog update --- Resources/Changelog/Changelog.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 5c584c1870..a0ff5dac44 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Mervill - changes: - - {message: Empty Fuel Tank wont explode., type: Add} - - {message: Fuel Tank explosion scales with remaining fuel., type: Add} - id: 2304 - time: '2022-09-14T17:15:55.0000000+00:00' - author: rolfero changes: - {message: You can no longer examine players and other mobs melee damage., type: Fix} @@ -2943,3 +2937,9 @@ Entries: type: Fix} id: 2803 time: '2022-12-25T00:35:00.0000000+00:00' +- author: EmoGarbage404 + changes: + - {message: Added hot plates for heating up beakers. No longer are chemists bound + to the humble microwave., type: Add} + id: 2804 + time: '2022-12-25T01:59:52.0000000+00:00' From faca40b8d518aa7bff4213035fed1e2446bdd3a1 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Sat, 24 Dec 2022 23:28:21 -0500 Subject: [PATCH 27/30] more component ref removal + combining server/client comps (#13178) Co-authored-by: DrSmugleaf --- Content.Client/Flash/FlashSystem.cs | 2 - Content.Client/Flash/FlashableComponent.cs | 12 - Content.Client/Humanoid/HumanoidComponent.cs | 15 -- .../Humanoid/HumanoidVisualizerSystem.cs | 40 +-- .../Projectiles/ProjectileComponent.cs | 8 - .../Components/SingularityComponent.cs | 13 - .../Singularity/Systems/SingularitySystem.cs | 4 +- Content.Client/Stack/StackComponent.cs | 18 -- Content.Client/Stack/StackStatusControl.cs | 1 + Content.Client/Stack/StackSystem.cs | 2 +- .../Tools/Components/MultipleToolComponent.cs | 11 - Content.Client/Tools/ToolSystem.cs | 4 +- .../VendingMachineComponent.cs | 60 ----- .../VendingMachines/VendingMachineSystem.cs | 16 -- .../Ranged/Systems/FlyBySoundSystem.cs | 4 +- .../Systems/AdminVerbSystem.Tools.cs | 1 + Content.Server/Advertise/AdvertiseSystem.cs | 1 + Content.Server/Cargo/Systems/PricingSystem.cs | 1 + Content.Server/Cloning/CloningSystem.cs | 1 + .../Construction/Completions/GivePrototype.cs | 1 + .../Completions/SpawnPrototype.cs | 1 + .../Construction/MachineFrameSystem.cs | 1 + Content.Server/Construction/RefiningSystem.cs | 1 + .../Thresholds/Behaviors/EjectVendorItems.cs | 1 + .../Behaviors/SpawnEntitiesBehavior.cs | 1 + Content.Server/Dragon/DragonSystem.cs | 2 +- .../EntitySystems/SpawnAfterInteractSystem.cs | 2 +- .../Flash/Components/FlashableComponent.cs | 10 - .../GameTicking/Rules/ZombieRuleSystem.cs | 3 +- Content.Server/Hands/Systems/HandsSystem.cs | 1 + .../Humanoid/Components/HumanoidComponent.cs | 38 --- .../Systems/RandomHumanoidAppearanceSystem.cs | 1 + .../IdentityManagement/IdentitySystem.cs | 3 +- .../EntitySystems/ReagentGrinderSystem.cs | 1 + .../MagicMirror/MagicMirrorSystem.cs | 1 + .../BiomassReclaimerSystem.cs | 3 +- Content.Server/Medical/HealingSystem.cs | 2 +- .../Components/ParticleProjectileComponent.cs | 2 +- .../Power/EntitySystems/CableSystem.Placer.cs | 1 + .../Components/ProjectileComponent.cs | 29 --- .../Projectiles/SharedProjectileSystem.cs | 1 - .../EntitySystems/RevenantSystem.Abilities.cs | 1 + .../EntitySystems/EmitterSystem.cs | 3 +- .../EntitySystems/SingularitySystem.cs | 10 +- Content.Server/Stack/StackComponent.cs | 13 - Content.Server/Stack/StackSystem.cs | 6 +- .../Store/Conditions/BuyerSpeciesCondition.cs | 1 + Content.Server/Store/Systems/StoreSystem.cs | 1 + Content.Server/Tiles/FloorTileSystem.cs | 1 + .../Tools/Components/MultipleToolComponent.cs | 9 - .../VendingMachineComponent.cs | 80 ------ .../VendingMachines/VendingMachineSystem.cs | 7 +- .../Ranged/Systems/GunSystem.Battery.cs | 2 +- .../Ranged/Systems/GunSystem.Cartridges.cs | 2 +- .../Weapons/Ranged/Systems/GunSystem.cs | 3 +- .../Steps/MaterialConstructionGraphStep.cs | 6 +- ...ableComponent.cs => FlashableComponent.cs} | 8 +- Content.Shared/Flash/SharedFlashSystem.cs | 4 +- ...anoidComponent.cs => HumanoidComponent.cs} | 40 ++- .../Materials/SharedMaterialStorageSystem.cs | 2 +- ...ileComponent.cs => ProjectileComponent.cs} | 24 +- .../Projectiles/SharedProjectileSystem.cs | 6 +- .../Components/SharedSingularityComponent.cs | 32 --- .../Components/SingularityComponent.cs | 51 ++-- .../EntitySystems/SharedSingularitySystem.cs | 44 ++-- .../Events/SingularityLevelChangedEvent.cs | 4 +- Content.Shared/Stacks/SharedStackSystem.cs | 48 ++-- ...redStackComponent.cs => StackComponent.cs} | 10 +- Content.Shared/Stacks/StackPrototype.cs | 2 +- ...lComponent.cs => MultipleToolComponent.cs} | 20 +- .../Systems/SharedToolSystem.MultipleTool.cs | 20 +- .../SharedVendingMachineComponent.cs | 100 -------- .../SharedVendingMachineSystem.cs | 13 +- .../VendingMachineComponent.cs | 241 ++++++++++++++++++ .../Objects/Consumable/Food/Baked/misc.yml | 3 - .../Smokeables/Cigarettes/rolling_paper.yml | 2 - .../Structures/Machines/vending_machines.yml | 2 +- .../Prototypes/Stacks/consumable_stacks.yml | 6 +- 78 files changed, 504 insertions(+), 643 deletions(-) delete mode 100644 Content.Client/Flash/FlashableComponent.cs delete mode 100644 Content.Client/Humanoid/HumanoidComponent.cs delete mode 100644 Content.Client/Projectiles/ProjectileComponent.cs delete mode 100644 Content.Client/Singularity/Components/SingularityComponent.cs delete mode 100644 Content.Client/Stack/StackComponent.cs delete mode 100644 Content.Client/VendingMachines/VendingMachineComponent.cs delete mode 100644 Content.Server/Flash/Components/FlashableComponent.cs delete mode 100644 Content.Server/Humanoid/Components/HumanoidComponent.cs delete mode 100644 Content.Server/Projectiles/Components/ProjectileComponent.cs delete mode 100644 Content.Server/Stack/StackComponent.cs delete mode 100644 Content.Server/Tools/Components/MultipleToolComponent.cs delete mode 100644 Content.Server/VendingMachines/VendingMachineComponent.cs rename Content.Shared/Flash/{SharedFlashableComponent.cs => FlashableComponent.cs} (70%) rename Content.Shared/Humanoid/{SharedHumanoidComponent.cs => HumanoidComponent.cs} (57%) rename Content.Shared/Projectiles/{SharedProjectileComponent.cs => ProjectileComponent.cs} (50%) delete mode 100644 Content.Shared/Singularity/Components/SharedSingularityComponent.cs rename {Content.Server => Content.Shared}/Singularity/Components/SingularityComponent.cs (55%) rename Content.Shared/Stacks/{SharedStackComponent.cs => StackComponent.cs} (84%) rename Content.Shared/Tools/Components/{SharedMultipleToolComponent.cs => MultipleToolComponent.cs} (67%) delete mode 100644 Content.Shared/VendingMachines/SharedVendingMachineComponent.cs create mode 100644 Content.Shared/VendingMachines/VendingMachineComponent.cs diff --git a/Content.Client/Flash/FlashSystem.cs b/Content.Client/Flash/FlashSystem.cs index 9cdfd61e03..3393662fa4 100644 --- a/Content.Client/Flash/FlashSystem.cs +++ b/Content.Client/Flash/FlashSystem.cs @@ -1,9 +1,7 @@ using Content.Shared.Flash; using Robust.Client.Graphics; using Robust.Client.Player; -using Robust.Shared.GameObjects; using Robust.Shared.GameStates; -using Robust.Shared.IoC; using Robust.Shared.Timing; namespace Content.Client.Flash diff --git a/Content.Client/Flash/FlashableComponent.cs b/Content.Client/Flash/FlashableComponent.cs deleted file mode 100644 index 714d2d7c1c..0000000000 --- a/Content.Client/Flash/FlashableComponent.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Content.Shared.Flash; -using Robust.Shared.Analyzers; -using Robust.Shared.GameObjects; - -namespace Content.Client.Flash -{ - [ComponentReference(typeof(SharedFlashableComponent))] - [RegisterComponent, Access(typeof(FlashSystem))] - public sealed class FlashableComponent : SharedFlashableComponent - { - } -} diff --git a/Content.Client/Humanoid/HumanoidComponent.cs b/Content.Client/Humanoid/HumanoidComponent.cs deleted file mode 100644 index d433013c9d..0000000000 --- a/Content.Client/Humanoid/HumanoidComponent.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Content.Shared.Humanoid; -using Content.Shared.Humanoid.Markings; -using Content.Shared.Humanoid.Prototypes; - -namespace Content.Client.Humanoid; - -[RegisterComponent] -public sealed class HumanoidComponent : SharedHumanoidComponent -{ - [ViewVariables] public List CurrentMarkings = new(); - - public Dictionary BaseLayers = new(); - - public string LastSpecies = default!; -} diff --git a/Content.Client/Humanoid/HumanoidVisualizerSystem.cs b/Content.Client/Humanoid/HumanoidVisualizerSystem.cs index 808a5a1ba7..5539ec27d1 100644 --- a/Content.Client/Humanoid/HumanoidVisualizerSystem.cs +++ b/Content.Client/Humanoid/HumanoidVisualizerSystem.cs @@ -108,23 +108,23 @@ public sealed class HumanoidVisualizerSystem : VisualizerSystem(); - var dirtyRangeStart = humanoid.CurrentMarkings.Count == 0 ? 0 : -1; + var dirtyRangeStart = humanoid.CurrentClientMarkings.Count == 0 ? 0 : -1; // edge cases: - // humanoid.CurrentMarkings < newMarkings.Count + // humanoid.CurrentClientMarkings < newMarkings.Count // - check if count matches this condition before diffing - // - if count is unequal, set dirty range to start from humanoid.CurrentMarkings.Count - // humanoid.CurrentMarkings > newMarkings.Count, no dirty markings + // - if count is unequal, set dirty range to start from humanoid.CurrentClientMarkings.Count + // humanoid.CurrentClientMarkings > newMarkings.Count, no dirty markings // - break count upon meeting this condition - // - clear markings from newMarkings.Count to humanoid.CurrentMarkings.Count - newMarkings.Count + // - clear markings from newMarkings.Count to humanoid.CurrentClientMarkings.Count - newMarkings.Count - for (var i = 0; i < humanoid.CurrentMarkings.Count; i++) + for (var i = 0; i < humanoid.CurrentClientMarkings.Count; i++) { // if we've reached the end of the new set of markings, // then that means it's time to finish @@ -135,7 +135,7 @@ public sealed class HumanoidVisualizerSystem : VisualizerSystem /// A singularity. /// The gravity well radius the singularity should have given its state. - public float GravPulseRange(SharedSingularityComponent singulo) + public float GravPulseRange(SingularityComponent singulo) => BaseGravityWellRadius * (singulo.Level + 1); /// @@ -185,7 +185,7 @@ public abstract class SharedSingularitySystem : EntitySystem /// /// A singularity. /// The base gravitational acceleration the singularity should have given its state. - public (float, float) GravPulseAcceleration(SharedSingularityComponent singulo) + public (float, float) GravPulseAcceleration(SingularityComponent singulo) => (BaseGravityWellAcceleration * singulo.Level, 0f); /// @@ -193,7 +193,7 @@ public abstract class SharedSingularitySystem : EntitySystem /// /// A singularity. /// The event horizon radius the singularity should have given its state. - public float EventHorizonRadius(SharedSingularityComponent singulo) + public float EventHorizonRadius(SingularityComponent singulo) => (float) singulo.Level - 0.5f; /// @@ -201,7 +201,7 @@ public abstract class SharedSingularitySystem : EntitySystem /// /// A singularity. /// Whether the singularity should be able to breach containment. - public bool CanBreachContainment(SharedSingularityComponent singulo) + public bool CanBreachContainment(SingularityComponent singulo) => singulo.Level >= SingularityBreachThreshold; /// @@ -255,7 +255,7 @@ public abstract class SharedSingularitySystem : EntitySystem /// public readonly byte Level; - public SingularityComponentState(SharedSingularityComponent singulo) + public SingularityComponentState(SingularityComponent singulo) { Level = singulo.Level; } @@ -269,7 +269,7 @@ public abstract class SharedSingularitySystem : EntitySystem /// The entity that is becoming a singularity. /// The singularity component that is being added to the entity. /// The event arguments. - protected virtual void OnSingularityStartup(EntityUid uid, SharedSingularityComponent comp, ComponentStartup args) + protected virtual void OnSingularityStartup(EntityUid uid, SingularityComponent comp, ComponentStartup args) { UpdateSingularityLevel(uid, comp); } diff --git a/Content.Shared/Singularity/Events/SingularityLevelChangedEvent.cs b/Content.Shared/Singularity/Events/SingularityLevelChangedEvent.cs index ba23523f84..dd2791f045 100644 --- a/Content.Shared/Singularity/Events/SingularityLevelChangedEvent.cs +++ b/Content.Shared/Singularity/Events/SingularityLevelChangedEvent.cs @@ -20,9 +20,9 @@ public sealed class SingularityLevelChangedEvent : EntityEventArgs /// /// The singularity that just changed level. /// - public readonly SharedSingularityComponent Singularity; + public readonly SingularityComponent Singularity; - public SingularityLevelChangedEvent(byte newValue, byte oldValue, SharedSingularityComponent singularity) + public SingularityLevelChangedEvent(byte newValue, byte oldValue, SingularityComponent singularity) { NewValue = newValue; OldValue = oldValue; diff --git a/Content.Shared/Stacks/SharedStackSystem.cs b/Content.Shared/Stacks/SharedStackSystem.cs index 678ee81fd1..39f9ba4fef 100644 --- a/Content.Shared/Stacks/SharedStackSystem.cs +++ b/Content.Shared/Stacks/SharedStackSystem.cs @@ -26,30 +26,30 @@ namespace Content.Shared.Stacks { base.Initialize(); - SubscribeLocalEvent(OnStackGetState); - SubscribeLocalEvent(OnStackHandleState); - SubscribeLocalEvent(OnStackStarted); - SubscribeLocalEvent(OnStackExamined); - SubscribeLocalEvent(OnStackInteractUsing); + SubscribeLocalEvent(OnStackGetState); + SubscribeLocalEvent(OnStackHandleState); + SubscribeLocalEvent(OnStackStarted); + SubscribeLocalEvent(OnStackExamined); + SubscribeLocalEvent(OnStackInteractUsing); - _vvm.GetTypeHandler() - .AddPath(nameof(SharedStackComponent.Count), (_, comp) => comp.Count, SetCount); + _vvm.GetTypeHandler() + .AddPath(nameof(StackComponent.Count), (_, comp) => comp.Count, SetCount); } public override void Shutdown() { base.Shutdown(); - _vvm.GetTypeHandler() - .RemovePath(nameof(SharedStackComponent.Count)); + _vvm.GetTypeHandler() + .RemovePath(nameof(StackComponent.Count)); } - private void OnStackInteractUsing(EntityUid uid, SharedStackComponent stack, InteractUsingEvent args) + private void OnStackInteractUsing(EntityUid uid, StackComponent stack, InteractUsingEvent args) { if (args.Handled) return; - if (!TryComp(args.Used, out SharedStackComponent? recipientStack)) + if (!TryComp(args.Used, out StackComponent? recipientStack)) return; if (!TryMergeStacks(uid, args.Used, out var transfered, stack, recipientStack)) @@ -92,8 +92,8 @@ namespace Content.Shared.Stacks EntityUid donor, EntityUid recipient, out int transfered, - SharedStackComponent? donorStack = null, - SharedStackComponent? recipientStack = null) + StackComponent? donorStack = null, + StackComponent? recipientStack = null) { transfered = 0; if (!Resolve(recipient, ref recipientStack, false) || !Resolve(donor, ref donorStack, false)) @@ -118,7 +118,7 @@ namespace Content.Shared.Stacks public void TryMergeToHands( EntityUid item, EntityUid user, - SharedStackComponent? itemStack = null, + StackComponent? itemStack = null, SharedHandsComponent? hands = null) { if (!Resolve(user, ref hands, false)) @@ -143,7 +143,7 @@ namespace Content.Shared.Stacks HandsSystem.PickupOrDrop(user, item, handsComp: hands); } - public virtual void SetCount(EntityUid uid, int amount, SharedStackComponent? component = null) + public virtual void SetCount(EntityUid uid, int amount, StackComponent? component = null) { if (!Resolve(uid, ref component)) return; @@ -169,7 +169,7 @@ namespace Content.Shared.Stacks /// /// Try to use an amount of items on this stack. Returns whether this succeeded. /// - public bool Use(EntityUid uid, int amount, SharedStackComponent? stack = null) + public bool Use(EntityUid uid, int amount, StackComponent? stack = null) { if (!Resolve(uid, ref stack)) return false; @@ -199,7 +199,7 @@ namespace Content.Shared.Stacks public int GetMaxCount(string entityId) { var entProto = _prototype.Index(entityId); - entProto.TryGetComponent(out var stackComp); + entProto.TryGetComponent(out var stackComp); return GetMaxCount(stackComp); } @@ -211,7 +211,7 @@ namespace Content.Shared.Stacks [PublicAPI] public int GetMaxCount(EntityUid uid) { - return GetMaxCount(CompOrNull(uid)); + return GetMaxCount(CompOrNull(uid)); } /// @@ -227,7 +227,7 @@ namespace Content.Shared.Stacks /// /// /// - public int GetMaxCount(SharedStackComponent? component) + public int GetMaxCount(StackComponent? component) { if (component == null) return 1; @@ -249,12 +249,12 @@ namespace Content.Shared.Stacks /// /// [PublicAPI] - public int GetAvailableSpace(SharedStackComponent component) + public int GetAvailableSpace(StackComponent component) { return GetMaxCount(component) - component.Count; } - private void OnStackStarted(EntityUid uid, SharedStackComponent component, ComponentStartup args) + private void OnStackStarted(EntityUid uid, StackComponent component, ComponentStartup args) { if (!TryComp(uid, out AppearanceComponent? appearance)) return; @@ -264,12 +264,12 @@ namespace Content.Shared.Stacks Appearance.SetData(uid, StackVisuals.Hide, false, appearance); } - private void OnStackGetState(EntityUid uid, SharedStackComponent component, ref ComponentGetState args) + private void OnStackGetState(EntityUid uid, StackComponent component, ref ComponentGetState args) { args.State = new StackComponentState(component.Count, GetMaxCount(component)); } - private void OnStackHandleState(EntityUid uid, SharedStackComponent component, ref ComponentHandleState args) + private void OnStackHandleState(EntityUid uid, StackComponent component, ref ComponentHandleState args) { if (args.Current is not StackComponentState cast) return; @@ -279,7 +279,7 @@ namespace Content.Shared.Stacks SetCount(uid, cast.Count, component); } - private void OnStackExamined(EntityUid uid, SharedStackComponent component, ExaminedEvent args) + private void OnStackExamined(EntityUid uid, StackComponent component, ExaminedEvent args) { if (!args.IsInDetailsRange) return; diff --git a/Content.Shared/Stacks/SharedStackComponent.cs b/Content.Shared/Stacks/StackComponent.cs similarity index 84% rename from Content.Shared/Stacks/SharedStackComponent.cs rename to Content.Shared/Stacks/StackComponent.cs index 0a243027fe..719229c8a5 100644 --- a/Content.Shared/Stacks/SharedStackComponent.cs +++ b/Content.Shared/Stacks/StackComponent.cs @@ -4,8 +4,8 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototy namespace Content.Shared.Stacks { - [NetworkedComponent, Access(typeof(SharedStackSystem))] - public abstract class SharedStackComponent : Component + [RegisterComponent, NetworkedComponent] + public sealed class StackComponent : Component { [ViewVariables(VVAccess.ReadWrite)] [DataField("stackType", required: true, customTypeSerializer: typeof(PrototypeIdSerializer))] @@ -32,6 +32,12 @@ namespace Content.Shared.Stacks [DataField("unlimited")] [ViewVariables(VVAccess.ReadOnly)] public bool Unlimited { get; set; } + + [ViewVariables(VVAccess.ReadWrite)] + public bool ThrowIndividually { get; set; } = false; + + [ViewVariables] + public bool UiUpdateNeeded { get; set; } } [Serializable, NetSerializable] diff --git a/Content.Shared/Stacks/StackPrototype.cs b/Content.Shared/Stacks/StackPrototype.cs index 6e7c00ea0e..78dee5ddee 100644 --- a/Content.Shared/Stacks/StackPrototype.cs +++ b/Content.Shared/Stacks/StackPrototype.cs @@ -32,7 +32,7 @@ namespace Content.Shared.Stacks /// /// The maximum amount of things that can be in a stack. - /// Can be overriden on + /// Can be overriden on /// if null, simply has unlimited max count. /// [DataField("maxCount")] diff --git a/Content.Shared/Tools/Components/SharedMultipleToolComponent.cs b/Content.Shared/Tools/Components/MultipleToolComponent.cs similarity index 67% rename from Content.Shared/Tools/Components/SharedMultipleToolComponent.cs rename to Content.Shared/Tools/Components/MultipleToolComponent.cs index fd05aa3ba5..b40afbc134 100644 --- a/Content.Shared/Tools/Components/SharedMultipleToolComponent.cs +++ b/Content.Shared/Tools/Components/MultipleToolComponent.cs @@ -5,23 +5,23 @@ using Robust.Shared.Utility; namespace Content.Shared.Tools.Components { - [NetworkedComponent] - public abstract class SharedMultipleToolComponent : Component + [RegisterComponent, NetworkedComponent] + public sealed class MultipleToolComponent : Component { [DataDefinition] public sealed class ToolEntry { [DataField("behavior", required: true)] - public PrototypeFlags Behavior { get; } = new(); + public PrototypeFlags Behavior = new(); [DataField("useSound")] - public SoundSpecifier? Sound { get; } = null; + public SoundSpecifier? Sound; [DataField("changeSound")] - public SoundSpecifier? ChangeSound { get; } = null; + public SoundSpecifier? ChangeSound; [DataField("sprite")] - public SpriteSpecifier? Sprite { get; } = null; + public SpriteSpecifier? Sprite; } [DataField("entries", required: true)] @@ -31,7 +31,13 @@ namespace Content.Shared.Tools.Components public uint CurrentEntry = 0; [ViewVariables] - public string CurrentQualityName = String.Empty; + public string CurrentQualityName = string.Empty; + + [ViewVariables(VVAccess.ReadWrite)] + public bool UiUpdateNeeded; + + [DataField("statusShowBehavior")] + public bool StatusShowBehavior = true; } [NetSerializable, Serializable] diff --git a/Content.Shared/Tools/Systems/SharedToolSystem.MultipleTool.cs b/Content.Shared/Tools/Systems/SharedToolSystem.MultipleTool.cs index 4f71de930e..2bfe09ecbd 100644 --- a/Content.Shared/Tools/Systems/SharedToolSystem.MultipleTool.cs +++ b/Content.Shared/Tools/Systems/SharedToolSystem.MultipleTool.cs @@ -13,13 +13,13 @@ public abstract class SharedToolSystem : EntitySystem public override void Initialize() { - SubscribeLocalEvent(OnMultipleToolStartup); - SubscribeLocalEvent(OnMultipleToolActivated); - SubscribeLocalEvent(OnMultipleToolGetState); - SubscribeLocalEvent(OnMultipleToolHandleState); + SubscribeLocalEvent(OnMultipleToolStartup); + SubscribeLocalEvent(OnMultipleToolActivated); + SubscribeLocalEvent(OnMultipleToolGetState); + SubscribeLocalEvent(OnMultipleToolHandleState); } - private void OnMultipleToolHandleState(EntityUid uid, SharedMultipleToolComponent component, ref ComponentHandleState args) + private void OnMultipleToolHandleState(EntityUid uid, MultipleToolComponent component, ref ComponentHandleState args) { if (args.Current is not MultipleToolComponentState state) return; @@ -28,14 +28,14 @@ public abstract class SharedToolSystem : EntitySystem SetMultipleTool(uid, component); } - private void OnMultipleToolStartup(EntityUid uid, SharedMultipleToolComponent multiple, ComponentStartup args) + private void OnMultipleToolStartup(EntityUid uid, MultipleToolComponent multiple, ComponentStartup args) { // Only set the multiple tool if we have a tool component. if(EntityManager.TryGetComponent(uid, out ToolComponent? tool)) SetMultipleTool(uid, multiple, tool); } - private void OnMultipleToolActivated(EntityUid uid, SharedMultipleToolComponent multiple, ActivateInWorldEvent args) + private void OnMultipleToolActivated(EntityUid uid, MultipleToolComponent multiple, ActivateInWorldEvent args) { if (args.Handled) return; @@ -43,12 +43,12 @@ public abstract class SharedToolSystem : EntitySystem args.Handled = CycleMultipleTool(uid, multiple, args.User); } - private void OnMultipleToolGetState(EntityUid uid, SharedMultipleToolComponent multiple, ref ComponentGetState args) + private void OnMultipleToolGetState(EntityUid uid, MultipleToolComponent multiple, ref ComponentGetState args) { args.State = new MultipleToolComponentState(multiple.CurrentEntry); } - public bool CycleMultipleTool(EntityUid uid, SharedMultipleToolComponent? multiple = null, EntityUid? user = null) + public bool CycleMultipleTool(EntityUid uid, MultipleToolComponent? multiple = null, EntityUid? user = null) { if (!Resolve(uid, ref multiple)) return false; @@ -63,7 +63,7 @@ public abstract class SharedToolSystem : EntitySystem } public virtual void SetMultipleTool(EntityUid uid, - SharedMultipleToolComponent? multiple = null, + MultipleToolComponent? multiple = null, ToolComponent? tool = null, bool playSound = false, EntityUid? user = null) diff --git a/Content.Shared/VendingMachines/SharedVendingMachineComponent.cs b/Content.Shared/VendingMachines/SharedVendingMachineComponent.cs deleted file mode 100644 index c658c308f0..0000000000 --- a/Content.Shared/VendingMachines/SharedVendingMachineComponent.cs +++ /dev/null @@ -1,100 +0,0 @@ -using Content.Shared.Actions; -using Robust.Shared.GameStates; -using Robust.Shared.Serialization; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - -namespace Content.Shared.VendingMachines -{ - [NetworkedComponent()] - public abstract class SharedVendingMachineComponent : Component - { - /// - /// PrototypeID for the vending machine's inventory, see - /// - [DataField("pack", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string PackPrototypeId = string.Empty; - - /// - /// Used by the server to determine how long the vending machine stays in the "Deny" state. - /// Used by the client to determine how long the deny animation should be played. - /// - [DataField("denyDelay")] - public float DenyDelay = 2.0f; - - /// - /// Used by the server to determine how long the vending machine stays in the "Eject" state. - /// The selected item is dispensed afer this delay. - /// Used by the client to determine how long the deny animation should be played. - /// - [DataField("ejectDelay")] - public float EjectDelay = 1.2f; - - [ViewVariables] - public Dictionary Inventory = new(); - - [ViewVariables] - public Dictionary EmaggedInventory = new(); - - [ViewVariables] - public Dictionary ContrabandInventory = new(); - - public bool Emagged; - public bool Contraband; - } - - [Serializable, NetSerializable] - public sealed class VendingMachineInventoryEntry - { - [ViewVariables(VVAccess.ReadWrite)] - public InventoryType Type; - [ViewVariables(VVAccess.ReadWrite)] - public string ID; - [ViewVariables(VVAccess.ReadWrite)] - public uint Amount; - public VendingMachineInventoryEntry(InventoryType type, string id, uint amount) - { - Type = type; - ID = id; - Amount = amount; - } - } - - [Serializable, NetSerializable] - public enum InventoryType : byte - { - Regular, - Emagged, - Contraband - } - - [Serializable, NetSerializable] - public enum VendingMachineVisuals - { - VisualState - } - - [Serializable, NetSerializable] - public enum VendingMachineVisualState - { - Normal, - Off, - Broken, - Eject, - Deny, - } - - [Serializable, NetSerializable] - public enum ContrabandWireKey : byte - { - StatusKey, - TimeoutKey - } - - [Serializable, NetSerializable] - public enum EjectWireKey : byte - { - StatusKey, - } - - public sealed class VendingMachineSelfDispenseEvent : InstantActionEvent { }; -} diff --git a/Content.Shared/VendingMachines/SharedVendingMachineSystem.cs b/Content.Shared/VendingMachines/SharedVendingMachineSystem.cs index 96ba55c899..11436fa57c 100644 --- a/Content.Shared/VendingMachines/SharedVendingMachineSystem.cs +++ b/Content.Shared/VendingMachines/SharedVendingMachineSystem.cs @@ -1,6 +1,5 @@ using Robust.Shared.Prototypes; using System.Linq; -using static Content.Shared.VendingMachines.SharedVendingMachineComponent; namespace Content.Shared.VendingMachines; @@ -11,10 +10,10 @@ public abstract class SharedVendingMachineSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnComponentInit);; + SubscribeLocalEvent(OnComponentInit); } - protected virtual void OnComponentInit(EntityUid uid, SharedVendingMachineComponent component, ComponentInit args) + protected virtual void OnComponentInit(EntityUid uid, VendingMachineComponent component, ComponentInit args) { if (!_prototypeManager.TryIndex(component.PackPrototypeId, out VendingMachineInventoryPrototype? packPrototype)) return; @@ -26,13 +25,13 @@ public abstract class SharedVendingMachineSystem : EntitySystem /// /// Returns all of the vending machine's inventory. Only includes emagged and contraband inventories if - /// and + /// and /// are true respectively. /// /// /// /// - public List GetAllInventory(EntityUid uid, SharedVendingMachineComponent? component = null) + public List GetAllInventory(EntityUid uid, VendingMachineComponent? component = null) { if (!Resolve(uid, ref component)) return new(); @@ -48,7 +47,7 @@ public abstract class SharedVendingMachineSystem : EntitySystem return inventory; } - public List GetAvailableInventory(EntityUid uid, SharedVendingMachineComponent? component = null) + public List GetAvailableInventory(EntityUid uid, VendingMachineComponent? component = null) { if (!Resolve(uid, ref component)) return new(); @@ -58,7 +57,7 @@ public abstract class SharedVendingMachineSystem : EntitySystem private void AddInventoryFromPrototype(EntityUid uid, Dictionary? entries, InventoryType type, - SharedVendingMachineComponent? component = null) + VendingMachineComponent? component = null) { if (!Resolve(uid, ref component) || entries == null) { diff --git a/Content.Shared/VendingMachines/VendingMachineComponent.cs b/Content.Shared/VendingMachines/VendingMachineComponent.cs new file mode 100644 index 0000000000..1ae9562f7b --- /dev/null +++ b/Content.Shared/VendingMachines/VendingMachineComponent.cs @@ -0,0 +1,241 @@ +using Content.Shared.Actions; +using Content.Shared.Actions.ActionTypes; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Shared.VendingMachines +{ + [RegisterComponent, NetworkedComponent] + public sealed class VendingMachineComponent : Component + { + /// + /// PrototypeID for the vending machine's inventory, see + /// + [DataField("pack", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string PackPrototypeId = string.Empty; + + /// + /// Used by the server to determine how long the vending machine stays in the "Deny" state. + /// Used by the client to determine how long the deny animation should be played. + /// + [DataField("denyDelay")] + public float DenyDelay = 2.0f; + + /// + /// Used by the server to determine how long the vending machine stays in the "Eject" state. + /// The selected item is dispensed afer this delay. + /// Used by the client to determine how long the deny animation should be played. + /// + [DataField("ejectDelay")] + public float EjectDelay = 1.2f; + + [ViewVariables] + public Dictionary Inventory = new(); + + [ViewVariables] + public Dictionary EmaggedInventory = new(); + + [ViewVariables] + public Dictionary ContrabandInventory = new(); + + public bool Emagged; + public bool Contraband; + + public bool Ejecting; + public bool Denying; + public bool DispenseOnHitCoolingDown; + + public string? NextItemToEject; + + public bool Broken; + + /// + /// When true, will forcefully throw any object it dispenses + /// + [DataField("speedLimiter")] + public bool CanShoot = false; + + public bool ThrowNextItem = false; + + /// + /// The chance that a vending machine will randomly dispense an item on hit. + /// Chance is 0 if null. + /// + [DataField("dispenseOnHitChance")] + public float? DispenseOnHitChance; + + /// + /// The minimum amount of damage that must be done per hit to have a chance + /// of dispensing an item. + /// + [DataField("dispenseOnHitThreshold")] + public float? DispenseOnHitThreshold; + + /// + /// Amount of time in seconds that need to pass before damage can cause a vending machine to eject again. + /// This value is separate to because that value might be + /// 0 for a vending machine for legitimate reasons (no desired delay/no eject animation) + /// and can be circumvented with forced ejections. + /// + [DataField("dispenseOnHitCooldown")] + public float? DispenseOnHitCooldown = 1.0f; + + /// + /// Sound that plays when ejecting an item + /// + [DataField("soundVend")] + // Grabbed from: https://github.com/discordia-space/CEV-Eris/blob/f702afa271136d093ddeb415423240a2ceb212f0/sound/machines/vending_drop.ogg + public SoundSpecifier SoundVend = new SoundPathSpecifier("/Audio/Machines/machine_vend.ogg"); + + /// + /// Sound that plays when an item can't be ejected + /// + [DataField("soundDeny")] + // Yoinked from: https://github.com/discordia-space/CEV-Eris/blob/35bbad6764b14e15c03a816e3e89aa1751660ba9/sound/machines/Custom_deny.ogg + public SoundSpecifier SoundDeny = new SoundPathSpecifier("/Audio/Machines/custom_deny.ogg"); + + /// + /// The action available to the player controlling the vending machine + /// + [DataField("action", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? Action = "VendingThrow"; + + public float NonLimitedEjectForce = 7.5f; + + public float NonLimitedEjectRange = 5f; + + public float EjectAccumulator = 0f; + public float DenyAccumulator = 0f; + public float DispenseOnHitAccumulator = 0f; + + #region Client Visuals + /// + /// RSI state for when the vending machine is unpowered. + /// Will be displayed on the layer + /// + [DataField("offState")] + public string? OffState; + + /// + /// RSI state for the screen of the vending machine + /// Will be displayed on the layer + /// + [DataField("screenState")] + public string? ScreenState; + + /// + /// RSI state for the vending machine's normal state. Usually a looping animation. + /// Will be displayed on the layer + /// + [DataField("normalState")] + public string? NormalState; + + /// + /// RSI state for the vending machine's eject animation. + /// Will be displayed on the layer + /// + [DataField("ejectState")] + public string? EjectState; + + /// + /// RSI state for the vending machine's deny animation. Will either be played once as sprite flick + /// or looped depending on how is set. + /// Will be displayed on the layer + /// + [DataField("denyState")] + public string? DenyState; + + /// + /// RSI state for when the vending machine is unpowered. + /// Will be displayed on the layer + /// + [DataField("brokenState")] + public string? BrokenState; + + /// + /// If set to true (default) will loop the animation of the for the duration + /// of . If set to false will play a sprite + /// flick animation for the state and then linger on the final frame until the end of the delay. + /// + [DataField("loopDeny")] + public bool LoopDenyAnimation = true; + #endregion + } + + [Serializable, NetSerializable] + public sealed class VendingMachineInventoryEntry + { + [ViewVariables(VVAccess.ReadWrite)] + public InventoryType Type; + [ViewVariables(VVAccess.ReadWrite)] + public string ID; + [ViewVariables(VVAccess.ReadWrite)] + public uint Amount; + public VendingMachineInventoryEntry(InventoryType type, string id, uint amount) + { + Type = type; + ID = id; + Amount = amount; + } + } + + [Serializable, NetSerializable] + public enum InventoryType : byte + { + Regular, + Emagged, + Contraband + } + + [Serializable, NetSerializable] + public enum VendingMachineVisuals + { + VisualState + } + + [Serializable, NetSerializable] + public enum VendingMachineVisualState + { + Normal, + Off, + Broken, + Eject, + Deny, + } + + public enum VendingMachineVisualLayers : byte + { + /// + /// Off / Broken. The other layers will overlay this if the machine is on. + /// + Base, + /// + /// Normal / Deny / Eject + /// + BaseUnshaded, + /// + /// Screens that are persistent (where the machine is not off or broken) + /// + Screen + } + + [Serializable, NetSerializable] + public enum ContrabandWireKey : byte + { + StatusKey, + TimeoutKey + } + + [Serializable, NetSerializable] + public enum EjectWireKey : byte + { + StatusKey, + } + + public sealed class VendingMachineSelfDispenseEvent : InstantActionEvent + { + + }; +} diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml index 5ff77dcc4b..7b1b0c38ab 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml @@ -216,7 +216,6 @@ # trash: FoodPlateSmall - type: Stack stackType: Pancake - max: 9 count: 1 - type: Sprite state: pancakes1 @@ -249,7 +248,6 @@ # trash: FoodPlateSmall - type: Stack stackType: Pancake - max: 3 count: 1 - type: Sprite state: pancakesbb1 @@ -276,7 +274,6 @@ # trash: FoodPlateSmall - type: Stack stackType: Pancake - max: 3 count: 1 - type: Sprite state: pancakescc1 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/rolling_paper.yml b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/rolling_paper.yml index 8c1414892d..e62db9e40f 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/rolling_paper.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Smokeables/Cigarettes/rolling_paper.yml @@ -48,7 +48,6 @@ components: - type: Stack stackType: PaperRolling - max: 5 count: 5 - type: Sprite sprite: Objects/Consumable/Smokeables/Cigarettes/paper.rsi @@ -80,7 +79,6 @@ components: - type: Stack stackType: CigaretteFilter - max: 5 count: 5 - type: Sprite sprite: Objects/Consumable/Smokeables/Cigarettes/paper.rsi diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index c0f13b91e7..1c9047ccb9 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -793,7 +793,7 @@ brokenState: broken normalState: normal-unshaded ejectState: eject-unshaded - ejectdelay: 1.8 + ejectDelay: 1.8 - type: Advertise pack: GoodCleanFunAds - type: Sprite diff --git a/Resources/Prototypes/Stacks/consumable_stacks.yml b/Resources/Prototypes/Stacks/consumable_stacks.yml index 0e83e424e0..b0a07b4645 100644 --- a/Resources/Prototypes/Stacks/consumable_stacks.yml +++ b/Resources/Prototypes/Stacks/consumable_stacks.yml @@ -4,7 +4,7 @@ id: Pancake name: pancake spawn: FoodBakedPancake - maxCount: 30 + maxCount: 3 # Food Containers @@ -22,14 +22,14 @@ name: rolling paper icon: { sprite: /Textures/Objects/Consumable/Smokeables/Cigarettes/paper.rsi, state: cigpaper } spawn: PaperRolling - maxCount: 30 + maxCount: 5 - type: stack id: CigaretteFilter name: cigarette filter icon: { sprite: /Textures/Objects/Consumable/Smokeables/Cigarettes/paper.rsi, state: cigfilter } spawn: CigaretteFilter - maxCount: 30 + maxCount: 5 - type: stack id: GroundTobacco From b7af5e6109b6588f43c9407b92569f04e88dbb3a Mon Sep 17 00:00:00 2001 From: Chief-Engineer <119664036+Chief-Engineer@users.noreply.github.com> Date: Sat, 24 Dec 2022 22:35:03 -0600 Subject: [PATCH 28/30] Fix and improve bluespace lockers (#13139) * add invulnerable plastitanium wall prototype * fix command ClearBluespaceLockerLinks.cs * fix and improve BluespaceLockerSystem.cs * fix normal plastitanium wall suffix * fix capitalization * fix capability to create one way lockers --- .../Commands/ClearBluespaceLockerLinks.cs | 2 +- .../Commands/LinkBluespaceLocker.cs | 8 +- .../Components/BluespaceLockerComponent.cs | 31 ++++++ .../EntitySystems/BluespaceLockerSystem.cs | 96 ++++++++++++++++--- .../Entities/Structures/Walls/walls.yml | 25 +++-- 5 files changed, 142 insertions(+), 20 deletions(-) diff --git a/Content.Server/Administration/Commands/ClearBluespaceLockerLinks.cs b/Content.Server/Administration/Commands/ClearBluespaceLockerLinks.cs index 6e1d1d952e..a0c04da38e 100644 --- a/Content.Server/Administration/Commands/ClearBluespaceLockerLinks.cs +++ b/Content.Server/Administration/Commands/ClearBluespaceLockerLinks.cs @@ -27,7 +27,7 @@ public sealed class ClearBluespaceLockerLinks : IConsoleCommand var entityManager = IoCManager.Resolve(); - if (entityManager.TryGetComponent(entityUid, out var originComponent)) + if (entityManager.TryGetComponent(entityUid, out var originComponent)) entityManager.RemoveComponent(entityUid, originComponent); } } diff --git a/Content.Server/Administration/Commands/LinkBluespaceLocker.cs b/Content.Server/Administration/Commands/LinkBluespaceLocker.cs index eefee173b3..df518cf820 100644 --- a/Content.Server/Administration/Commands/LinkBluespaceLocker.cs +++ b/Content.Server/Administration/Commands/LinkBluespaceLocker.cs @@ -53,10 +53,16 @@ public sealed class LinkBluespaceLocker : IConsoleCommand entityManager.EnsureComponent(originUid, out var originBluespaceComponent); originBluespaceComponent.BluespaceLinks.Add(targetComponent); + entityManager.EnsureComponent(targetUid, out var targetBluespaceComponent); if (bidirectional) { - entityManager.EnsureComponent(targetUid, out var targetBluespaceComponent); targetBluespaceComponent.BluespaceLinks.Add(originComponent); } + else if (targetBluespaceComponent.BluespaceLinks.Count == 0) + { + targetBluespaceComponent.AllowSentient = false; + targetBluespaceComponent.TransportEntities = false; + targetBluespaceComponent.TransportGas = false; + } } } diff --git a/Content.Server/Storage/Components/BluespaceLockerComponent.cs b/Content.Server/Storage/Components/BluespaceLockerComponent.cs index 1bded5d3fa..ad53672f79 100644 --- a/Content.Server/Storage/Components/BluespaceLockerComponent.cs +++ b/Content.Server/Storage/Components/BluespaceLockerComponent.cs @@ -27,4 +27,35 @@ public sealed class BluespaceLockerComponent : Component /// [DataField("bluespaceLinks"), ViewVariables(VVAccess.ReadOnly)] public HashSet BluespaceLinks = new(); + + /// + /// Each time the system attempts to get a link, it will link additional lockers to ensure the minimum amount + /// are linked. + /// + [DataField("minBluespaceLinks"), ViewVariables(VVAccess.ReadWrite)] + public uint MinBluespaceLinks; + + /// + /// Determines if links automatically added are restricted to the same map + /// + [DataField("pickLinksFromSameMap"), ViewVariables(VVAccess.ReadWrite)] + public bool PickLinksFromSameMap; + + /// + /// Determines if links automatically added must have ResistLockerComponent + /// + [DataField("pickLinksFromResistLockers"), ViewVariables(VVAccess.ReadWrite)] + public bool PickLinksFromResistLockers = true; + + /// + /// Determines if links automatically added are restricted to being on a station + /// + [DataField("pickLinksFromStationGrids"), ViewVariables(VVAccess.ReadWrite)] + public bool PickLinksFromStationGrids = true; + + /// + /// Determines if links automatically added are bidirectional + /// + [DataField("autoLinksBidirectional"), ViewVariables(VVAccess.ReadWrite)] + public bool AutoLinksBidirectional; } diff --git a/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs b/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs index 73bb1716b8..e7c41267f3 100644 --- a/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs +++ b/Content.Server/Storage/EntitySystems/BluespaceLockerSystem.cs @@ -1,14 +1,19 @@ using System.Linq; using Content.Server.Lock; using Content.Server.Mind.Components; +using Content.Server.Resist; +using Content.Server.Station.Components; using Content.Server.Storage.Components; using Content.Server.Tools.Systems; -using Microsoft.Extensions.DependencyModel; +using Content.Shared.Coordinates; +using Robust.Shared.Random; namespace Content.Server.Storage.EntitySystems; public sealed class BluespaceLockerSystem : EntitySystem { + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly IRobustRandom _robustRandom = default!; [Dependency] private readonly EntityStorageSystem _entityStorage = default!; [Dependency] private readonly WeldableSystem _weldableSystem = default!; [Dependency] private readonly LockSystem _lockSystem = default!; @@ -17,23 +22,27 @@ public sealed class BluespaceLockerSystem : EntitySystem { base.Initialize(); + SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(PreOpen); SubscribeLocalEvent(PostClose); } + private void OnStartup(EntityUid uid, BluespaceLockerComponent component, ComponentStartup args) + { + GetTargetStorage(component); + } private void PreOpen(EntityUid uid, BluespaceLockerComponent component, StorageBeforeOpenEvent args) { EntityStorageComponent? entityStorageComponent = null; - if (component.BluespaceLinks is not { Count: > 0 }) - return; - if (!Resolve(uid, ref entityStorageComponent)) return; // Select target - var targetContainerStorageComponent = component.BluespaceLinks.ToArray()[new Random().Next(0, component.BluespaceLinks.Count)]; + var targetContainerStorageComponent = GetTargetStorage(component); + if (targetContainerStorageComponent == null) + return; BluespaceLockerComponent? targetContainerBluespaceComponent = null; // Close target if it is open @@ -41,8 +50,7 @@ public sealed class BluespaceLockerSystem : EntitySystem _entityStorage.CloseStorage(targetContainerStorageComponent.Owner, targetContainerStorageComponent); // Apply bluespace effects if target is not a bluespace locker, otherwise let it handle it - if (!Resolve(targetContainerStorageComponent.Owner, ref targetContainerBluespaceComponent, false) || - targetContainerBluespaceComponent.BluespaceLinks is not { Count: > 0 }) + if (!Resolve(targetContainerStorageComponent.Owner, ref targetContainerBluespaceComponent, false)) { // Move contained items if (component.TransportEntities) @@ -62,18 +70,84 @@ public sealed class BluespaceLockerSystem : EntitySystem } } + private bool ValidLink(BluespaceLockerComponent component, EntityStorageComponent link) + { + return link.Owner.Valid && link.LifeStage != ComponentLifeStage.Deleted; + } + + private bool ValidAutolink(BluespaceLockerComponent component, EntityStorageComponent link) + { + if (!ValidLink(component, link)) + return false; + + if (component.PickLinksFromSameMap && + link.Owner.ToCoordinates().GetMapId(_entityManager) == component.Owner.ToCoordinates().GetMapId(_entityManager)) + return false; + + if (component.PickLinksFromStationGrids && + !_entityManager.HasComponent(link.Owner.ToCoordinates().GetGridUid(_entityManager))) + return false; + + if (component.PickLinksFromResistLockers && + !_entityManager.HasComponent(link.Owner)) + return false; + + return true; + } + + private EntityStorageComponent? GetTargetStorage(BluespaceLockerComponent component) + { + while (true) + { + // Ensure MinBluespaceLinks + if (component.BluespaceLinks.Count < component.MinBluespaceLinks) + { + // Get an shuffle the list of all EntityStorages + var storages = _entityManager.EntityQuery().ToArray(); + _robustRandom.Shuffle(storages); + + // Add valid candidates till MinBluespaceLinks is met + foreach (var storage in storages) + { + if (!ValidAutolink(component, storage)) + continue; + + component.BluespaceLinks.Add(storage); + if (component.AutoLinksBidirectional) + { + _entityManager.EnsureComponent(storage.Owner, out var targetBluespaceComponent); + targetBluespaceComponent.BluespaceLinks.Add(_entityManager.GetComponent(component.Owner)); + } + if (component.BluespaceLinks.Count >= component.MinBluespaceLinks) + break; + } + } + + // If there are no possible link targets and no links, return null + if (component.BluespaceLinks.Count == 0) + return null; + + // Attempt to select, validate, and return a link + var links = component.BluespaceLinks.ToArray(); + var link = links[_robustRandom.Next(0, component.BluespaceLinks.Count)]; + if (ValidLink(component, link)) + return link; + component.BluespaceLinks.Remove(link); + } + } + + private void PostClose(EntityUid uid, BluespaceLockerComponent component, StorageAfterCloseEvent args) { EntityStorageComponent? entityStorageComponent = null; - if (component.BluespaceLinks is not { Count: > 0 }) - return; - if (!Resolve(uid, ref entityStorageComponent)) return; // Select target - var targetContainerStorageComponent = component.BluespaceLinks.ToArray()[new Random().Next(0, component.BluespaceLinks.Count)]; + var targetContainerStorageComponent = GetTargetStorage(component); + if (targetContainerStorageComponent == null) + return; // Move contained items if (component.TransportEntities) diff --git a/Resources/Prototypes/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/Entities/Structures/Walls/walls.yml index ed16346326..796e092ba5 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/walls.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/walls.yml @@ -388,17 +388,31 @@ - type: entity parent: BaseWall + id: WallPlastitaniumIndestructible + name: plastitanium wall + suffix: indestructible + components: + - type: Tag + tags: + - Wall + - type: Sprite + sprite: Structures/Walls/plastitanium.rsi + - type: Icon + sprite: Structures/Walls/plastitanium.rsi + - type: IconSmooth + key: walls + base: plastitanium + +- type: entity + parent: WallPlastitaniumIndestructible id: WallPlastitanium name: plastitanium wall + suffix: "" components: - type: Tag tags: - Wall - RCDDeconstructWhitelist - - type: Sprite - sprite: Structures/Walls/plastitanium.rsi - - type: Icon - sprite: Structures/Walls/plastitanium.rsi - type: Destructible thresholds: - trigger: @@ -412,9 +426,6 @@ max: 1 - !type:DoActsBehavior acts: [ "Destruction" ] - - type: IconSmooth - key: walls - base: plastitanium - type: entity parent: BaseWall From d47e001b1840d52c8d9560e3540da7a4f08471a0 Mon Sep 17 00:00:00 2001 From: Francesco Date: Sun, 25 Dec 2022 12:35:51 +0100 Subject: [PATCH 29/30] feat: Medbay cryo pods (#11349) Fixes https://github.com/space-wizards/space-station-14/issues/11245 --- .../Medical/Cryogenics/CryoPodComponent.cs | 7 + .../Medical/Cryogenics/CryoPodSystem.cs | 83 ++++++ .../Medical/Components/CryoPodComponent.cs | 16 ++ .../Medical/CryoPodEjectLockWireAction.cs | 59 ++++ Content.Server/Medical/CryoPodSystem.cs | 267 ++++++++++++++++++ Content.Server/Medical/InsideCryoPodSystem.cs | 47 +++ ...nerTemperatureDamageThresholdsComponent.cs | 13 + .../Components/TemperatureComponent.cs | 12 + .../Temperature/Systems/TemperatureSystem.cs | 170 +++++++++-- .../Cryogenics/ActiveCryoPodComponent.cs | 9 + .../Medical/Cryogenics/CryoPodWireStatus.cs | 10 + .../Cryogenics/InsideCryoPodComponent.cs | 12 + .../Cryogenics/SharedCryoPodComponent.cs | 105 +++++++ .../Medical/Cryogenics/SharedCryoPodSystem.cs | 169 +++++++++++ .../Cryogenics/SharedInsideCryoPodSystem.cs | 29 ++ .../Standing/StandingStateSystem.cs | 14 +- .../medical/components/cryo-pod-component.ftl | 7 + .../Catalog/Research/technologies.yml | 5 +- .../Circuitboards/Machine/production.yml | 18 ++ .../Structures/Machines/Medical/cryo_pod.yml | 104 +++++++ .../Entities/Structures/Machines/lathe.yml | 1 + .../Prototypes/Recipes/Lathes/electronics.yml | 10 + Resources/Prototypes/Wires/layouts.yml | 7 + .../Machines/cryogenics.rsi/cover-off.png | Bin 0 -> 751 bytes .../Machines/cryogenics.rsi/cover-on.png | Bin 0 -> 6278 bytes .../Machines/cryogenics.rsi/meta.json | 41 +++ .../Machines/cryogenics.rsi/pod-off.png | Bin 0 -> 1612 bytes .../Machines/cryogenics.rsi/pod-on.png | Bin 0 -> 2409 bytes .../Machines/cryogenics.rsi/pod-open.png | Bin 0 -> 1554 bytes .../Machines/cryogenics.rsi/pod-panel.png | Bin 0 -> 296 bytes 30 files changed, 1188 insertions(+), 27 deletions(-) create mode 100644 Content.Client/Medical/Cryogenics/CryoPodComponent.cs create mode 100644 Content.Client/Medical/Cryogenics/CryoPodSystem.cs create mode 100644 Content.Server/Medical/Components/CryoPodComponent.cs create mode 100644 Content.Server/Medical/CryoPodEjectLockWireAction.cs create mode 100644 Content.Server/Medical/CryoPodSystem.cs create mode 100644 Content.Server/Medical/InsideCryoPodSystem.cs create mode 100644 Content.Server/Temperature/Components/ContainerTemperatureDamageThresholdsComponent.cs create mode 100644 Content.Shared/Medical/Cryogenics/ActiveCryoPodComponent.cs create mode 100644 Content.Shared/Medical/Cryogenics/CryoPodWireStatus.cs create mode 100644 Content.Shared/Medical/Cryogenics/InsideCryoPodComponent.cs create mode 100644 Content.Shared/Medical/Cryogenics/SharedCryoPodComponent.cs create mode 100644 Content.Shared/Medical/Cryogenics/SharedCryoPodSystem.cs create mode 100644 Content.Shared/Medical/Cryogenics/SharedInsideCryoPodSystem.cs create mode 100644 Resources/Locale/en-US/medical/components/cryo-pod-component.ftl create mode 100644 Resources/Prototypes/Entities/Structures/Machines/Medical/cryo_pod.yml create mode 100644 Resources/Textures/Structures/Machines/cryogenics.rsi/cover-off.png create mode 100644 Resources/Textures/Structures/Machines/cryogenics.rsi/cover-on.png create mode 100644 Resources/Textures/Structures/Machines/cryogenics.rsi/meta.json create mode 100644 Resources/Textures/Structures/Machines/cryogenics.rsi/pod-off.png create mode 100644 Resources/Textures/Structures/Machines/cryogenics.rsi/pod-on.png create mode 100644 Resources/Textures/Structures/Machines/cryogenics.rsi/pod-open.png create mode 100644 Resources/Textures/Structures/Machines/cryogenics.rsi/pod-panel.png diff --git a/Content.Client/Medical/Cryogenics/CryoPodComponent.cs b/Content.Client/Medical/Cryogenics/CryoPodComponent.cs new file mode 100644 index 0000000000..79a5d8a5e3 --- /dev/null +++ b/Content.Client/Medical/Cryogenics/CryoPodComponent.cs @@ -0,0 +1,7 @@ +using Content.Shared.DragDrop; +using Content.Shared.Medical.Cryogenics; + +namespace Content.Client.Medical.Cryogenics; + +[RegisterComponent] +public sealed class CryoPodComponent : SharedCryoPodComponent { } diff --git a/Content.Client/Medical/Cryogenics/CryoPodSystem.cs b/Content.Client/Medical/Cryogenics/CryoPodSystem.cs new file mode 100644 index 0000000000..0c6b86aef9 --- /dev/null +++ b/Content.Client/Medical/Cryogenics/CryoPodSystem.cs @@ -0,0 +1,83 @@ +using Content.Shared.Destructible; +using Content.Shared.Emag.Systems; +using Content.Shared.Medical.Cryogenics; +using Content.Shared.Verbs; +using Robust.Client.GameObjects; +using DrawDepth = Content.Shared.DrawDepth.DrawDepth; + +namespace Content.Client.Medical.Cryogenics; + +public sealed class CryoPodSystem: SharedCryoPodSystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnComponentInit); + SubscribeLocalEvent>(AddAlternativeVerbs); + SubscribeLocalEvent(OnEmagged); + SubscribeLocalEvent(DoInsertCryoPod); + SubscribeLocalEvent(DoInsertCancelCryoPod); + SubscribeLocalEvent(OnCryoPodPryFinished); + SubscribeLocalEvent(OnCryoPodPryInterrupted); + + SubscribeLocalEvent(OnAppearanceChange); + SubscribeLocalEvent(OnCryoPodInsertion); + SubscribeLocalEvent(OnCryoPodRemoval); + } + + private void OnCryoPodInsertion(EntityUid uid, InsideCryoPodComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var spriteComponent)) + { + return; + } + + component.PreviousOffset = spriteComponent.Offset; + spriteComponent.Offset = new Vector2(0, 1); + } + + private void OnCryoPodRemoval(EntityUid uid, InsideCryoPodComponent component, ComponentRemove args) + { + if (!TryComp(uid, out var spriteComponent)) + { + return; + } + + spriteComponent.Offset = component.PreviousOffset; + } + + private void OnAppearanceChange(EntityUid uid, SharedCryoPodComponent component, ref AppearanceChangeEvent args) + { + if (args.Sprite == null) + { + return; + } + + if (!args.Component.TryGetData(SharedCryoPodComponent.CryoPodVisuals.ContainsEntity, out bool isOpen) + || !args.Component.TryGetData(SharedCryoPodComponent.CryoPodVisuals.IsOn, out bool isOn)) + { + return; + } + + if (isOpen) + { + args.Sprite.LayerSetState(CryoPodVisualLayers.Base, "pod-open"); + args.Sprite.LayerSetVisible(CryoPodVisualLayers.Cover, false); + args.Sprite.DrawDepth = (int) DrawDepth.Objects; + } + else + { + args.Sprite.DrawDepth = (int) DrawDepth.Mobs; + args.Sprite.LayerSetState(CryoPodVisualLayers.Base, isOn ? "pod-on" : "pod-off"); + args.Sprite.LayerSetState(CryoPodVisualLayers.Cover, isOn ? "cover-on" : "cover-off"); + args.Sprite.LayerSetVisible(CryoPodVisualLayers.Cover, true); + } + } +} + +public enum CryoPodVisualLayers : byte +{ + Base, + Cover, +} diff --git a/Content.Server/Medical/Components/CryoPodComponent.cs b/Content.Server/Medical/Components/CryoPodComponent.cs new file mode 100644 index 0000000000..6ede61b0e4 --- /dev/null +++ b/Content.Server/Medical/Components/CryoPodComponent.cs @@ -0,0 +1,16 @@ +using Content.Server.Atmos; +using Content.Shared.Atmos; +using Content.Shared.Medical.Cryogenics; + +namespace Content.Server.Medical.Components; + +[RegisterComponent] +public sealed class CryoPodComponent: SharedCryoPodComponent +{ + /// + /// Local air buffer that will be mixed with the pipenet, if one exists, per tick. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("gasMixture")] + public GasMixture Air { get; set; } = new(Atmospherics.OneAtmosphere); +} diff --git a/Content.Server/Medical/CryoPodEjectLockWireAction.cs b/Content.Server/Medical/CryoPodEjectLockWireAction.cs new file mode 100644 index 0000000000..337184ecbd --- /dev/null +++ b/Content.Server/Medical/CryoPodEjectLockWireAction.cs @@ -0,0 +1,59 @@ +using Content.Server.Medical.Components; +using Content.Server.Wires; +using Content.Shared.Medical.Cryogenics; +using Content.Shared.Wires; + +namespace Content.Server.Medical; + +/// +/// Causes a failure in the cryo pod ejection system when cut. A crowbar will be needed to pry open the pod. +/// +[DataDefinition] +public sealed class CryoPodEjectLockWireAction: BaseWireAction +{ + [DataField("color")] + private Color _statusColor = Color.Red; + + [DataField("name")] + private string _text = "LOCK"; + + public override object? StatusKey { get; } = CryoPodWireActionKey.Key; + public override bool Cut(EntityUid user, Wire wire) + { + if (EntityManager.TryGetComponent(wire.Owner, out var cryoPodComponent) && !cryoPodComponent.PermaLocked) + { + cryoPodComponent.Locked = true; + } + + return true; + } + + public override bool Mend(EntityUid user, Wire wire) + { + if (EntityManager.TryGetComponent(wire.Owner, out var cryoPodComponent) && !cryoPodComponent.PermaLocked) + { + cryoPodComponent.Locked = false; + } + + return true; + } + + public override bool Pulse(EntityUid user, Wire wire) + { + return true; + } + + public override StatusLightData? GetStatusLightData(Wire wire) + { + StatusLightState lightState = StatusLightState.Off; + if (EntityManager.TryGetComponent(wire.Owner, out var cryoPodComponent) && cryoPodComponent.Locked) + { + lightState = StatusLightState.On; //TODO figure out why this doesn't get updated when the pod is emagged + } + + return new StatusLightData( + _statusColor, + lightState, + _text); + } +} diff --git a/Content.Server/Medical/CryoPodSystem.cs b/Content.Server/Medical/CryoPodSystem.cs new file mode 100644 index 0000000000..e3ba596258 --- /dev/null +++ b/Content.Server/Medical/CryoPodSystem.cs @@ -0,0 +1,267 @@ +using System.Threading; +using Content.Server.Atmos; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Atmos.Piping.Components; +using Content.Server.Atmos.Piping.Unary.EntitySystems; +using Content.Server.Body.Components; +using Content.Server.Body.Systems; +using Content.Server.Chemistry.Components.SolutionManager; +using Content.Server.Chemistry.EntitySystems; +using Content.Server.Climbing; +using Content.Server.DoAfter; +using Content.Server.Medical.Components; +using Content.Server.NodeContainer; +using Content.Server.NodeContainer.NodeGroups; +using Content.Server.NodeContainer.Nodes; +using Content.Server.Power.Components; +using Content.Server.Tools; +using Content.Server.UserInterface; +using Content.Shared.Chemistry; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Destructible; +using Content.Shared.DragDrop; +using Content.Shared.Emag.Systems; +using Content.Shared.Examine; +using Content.Shared.Interaction; +using Content.Shared.Medical.Cryogenics; +using Content.Shared.MedicalScanner; +using Content.Shared.Tools.Components; +using Content.Shared.Verbs; +using Robust.Server.GameObjects; +using Robust.Shared.Timing; + +namespace Content.Server.Medical; + +public sealed partial class CryoPodSystem: SharedCryoPodSystem +{ + [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; + [Dependency] private readonly GasCanisterSystem _gasCanisterSystem = default!; + [Dependency] private readonly ClimbSystem _climbSystem = default!; + [Dependency] private readonly ItemSlotsSystem _itemSlotsSystem = default!; + [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; + [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; + [Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!; + [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; + [Dependency] private readonly ToolSystem _toolSystem = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly MetaDataSystem _metaDataSystem = default!; + [Dependency] private readonly ReactiveSystem _reactiveSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnComponentInit); + SubscribeLocalEvent>(AddAlternativeVerbs); + SubscribeLocalEvent(OnEmagged); + SubscribeLocalEvent(DoInsertCryoPod); + SubscribeLocalEvent(DoInsertCancelCryoPod); + SubscribeLocalEvent(OnCryoPodPryFinished); + SubscribeLocalEvent(OnCryoPodPryInterrupted); + + SubscribeLocalEvent(OnCryoPodUpdateAtmosphere); + SubscribeLocalEvent(HandleDragDropOn); + SubscribeLocalEvent(OnInteractUsing); + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnPowerChanged); + SubscribeLocalEvent(OnGasAnalyzed); + SubscribeLocalEvent(OnActivateUIAttempt); + SubscribeLocalEvent(OnActivateUI); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var curTime = _gameTiming.CurTime; + var bloodStreamQuery = GetEntityQuery(); + var metaDataQuery = GetEntityQuery(); + var itemSlotsQuery = GetEntityQuery(); + var fitsInDispenserQuery = GetEntityQuery(); + var solutionContainerManagerQuery = GetEntityQuery(); + foreach (var (_, cryoPod) in EntityQuery()) + { + metaDataQuery.TryGetComponent(cryoPod.Owner, out var metaDataComponent); + if (curTime < cryoPod.NextInjectionTime + _metaDataSystem.GetPauseTime(cryoPod.Owner, metaDataComponent)) + continue; + cryoPod.NextInjectionTime = curTime + TimeSpan.FromSeconds(cryoPod.BeakerTransferTime); + + if ( + !itemSlotsQuery.TryGetComponent(cryoPod.Owner, out var itemSlotsComponent) + || !fitsInDispenserQuery.TryGetComponent(cryoPod.Owner, out var fitsInDispenserComponent) + || !solutionContainerManagerQuery.TryGetComponent(cryoPod.Owner, out var solutionContainerManagerComponent)) + { + continue; + } + var container = _itemSlotsSystem.GetItemOrNull(cryoPod.Owner, cryoPod.SolutionContainerName, itemSlotsComponent); + var patient = cryoPod.BodyContainer.ContainedEntity; + if (container != null + && container.Value.Valid + && patient != null + && _solutionContainerSystem.TryGetFitsInDispenser(container.Value, out var containerSolution, dispenserFits: fitsInDispenserComponent, solutionManager: solutionContainerManagerComponent)) + { + if (!bloodStreamQuery.TryGetComponent(patient, out var bloodstream)) + { + continue; + } + + var solutionToInject = _solutionContainerSystem.SplitSolution(container.Value, containerSolution, cryoPod.BeakerTransferAmount); + _bloodstreamSystem.TryAddToChemicals(patient.Value, solutionToInject, bloodstream); + _reactiveSystem.DoEntityReaction(patient.Value, solutionToInject, ReactionMethod.Injection); + } + } + } + + public override void EjectBody(EntityUid uid, SharedCryoPodComponent? cryoPodComponent) + { + if (!Resolve(uid, ref cryoPodComponent)) + return; + if (cryoPodComponent.BodyContainer.ContainedEntity is not {Valid: true} contained) + return; + base.EjectBody(uid, cryoPodComponent); + _climbSystem.ForciblySetClimbing(contained, uid); + } + + #region Interaction + + private void HandleDragDropOn(EntityUid uid, CryoPodComponent cryoPodComponent, DragDropEvent args) + { + if (cryoPodComponent.BodyContainer.ContainedEntity != null) + { + return; + } + + if (cryoPodComponent.DragDropCancelToken != null) + { + cryoPodComponent.DragDropCancelToken.Cancel(); + cryoPodComponent.DragDropCancelToken = null; + return; + } + + cryoPodComponent.DragDropCancelToken = new CancellationTokenSource(); + var doAfterArgs = new DoAfterEventArgs(args.User, cryoPodComponent.EntryDelay, cryoPodComponent.DragDropCancelToken.Token, uid, args.Dragged) + { + BreakOnDamage = true, + BreakOnStun = true, + BreakOnTargetMove = true, + BreakOnUserMove = true, + NeedHand = false, + TargetFinishedEvent = new DoInsertCryoPodEvent(args.Dragged), + TargetCancelledEvent = new DoInsertCancelledCryoPodEvent() + }; + _doAfterSystem.DoAfter(doAfterArgs); + args.Handled = true; + } + + private void OnActivateUIAttempt(EntityUid uid, CryoPodComponent cryoPodComponent, ActivatableUIOpenAttemptEvent args) + { + if (args.Cancelled) + { + return; + } + + var containedEntity = cryoPodComponent.BodyContainer.ContainedEntity; + if (containedEntity == null || containedEntity == args.User || !HasComp(uid)) + { + args.Cancel(); + } + } + + private void OnActivateUI(EntityUid uid, CryoPodComponent cryoPodComponent, AfterActivatableUIOpenEvent args) + { + _userInterfaceSystem.TrySendUiMessage( + uid, + SharedHealthAnalyzerComponent.HealthAnalyzerUiKey.Key, + new SharedHealthAnalyzerComponent.HealthAnalyzerScannedUserMessage(cryoPodComponent.BodyContainer.ContainedEntity)); + } + + private void OnInteractUsing(EntityUid uid, CryoPodComponent cryoPodComponent, InteractUsingEvent args) + { + if (args.Handled || !cryoPodComponent.Locked || cryoPodComponent.BodyContainer.ContainedEntity == null) + return; + + if (TryComp(args.Used, out ToolComponent? tool) + && tool.Qualities.Contains("Prying")) // Why aren't those enums? + { + if (cryoPodComponent.IsPrying) + return; + cryoPodComponent.IsPrying = true; + + _toolSystem.UseTool(args.Used, args.User, uid, 0f, + cryoPodComponent.PryDelay, "Prying", + new CryoPodPryFinished(), new CryoPodPryInterrupted(), uid); + + args.Handled = true; + } + } + + private void OnExamined(EntityUid uid, CryoPodComponent component, ExaminedEvent args) + { + var container = _itemSlotsSystem.GetItemOrNull(component.Owner, component.SolutionContainerName); + if (args.IsInDetailsRange && container != null && _solutionContainerSystem.TryGetFitsInDispenser(container.Value, out var containerSolution)) + { + args.PushMarkup(Loc.GetString("cryo-pod-examine", ("beaker", Name(container.Value)))); + if (containerSolution.CurrentVolume == 0) + { + args.PushMarkup(Loc.GetString("cryo-pod-empty-beaker")); + } + } + } + + private void OnPowerChanged(EntityUid uid, CryoPodComponent component, ref PowerChangedEvent args) + { + // Needed to avoid adding/removing components on a deleted entity + if (Terminating(uid)) + { + return; + } + + if (args.Powered) + { + EnsureComp(uid); + } + else + { + RemComp(uid); + _uiSystem.TryCloseAll(uid, SharedHealthAnalyzerComponent.HealthAnalyzerUiKey.Key); + } + UpdateAppearance(uid, component); + } + + #endregion + + #region Atmos handler + + private void OnCryoPodUpdateAtmosphere(EntityUid uid, CryoPodComponent cryoPod, AtmosDeviceUpdateEvent args) + { + if (!TryComp(uid, out NodeContainerComponent? nodeContainer)) + return; + + if (!nodeContainer.TryGetNode(cryoPod.PortName, out PortablePipeNode? portNode)) + return; + _atmosphereSystem.React(cryoPod.Air, portNode); + + if (portNode.NodeGroup is PipeNet {NodeCount: > 1} net) + { + _gasCanisterSystem.MixContainerWithPipeNet(cryoPod.Air, net.Air); + } + } + + private void OnGasAnalyzed(EntityUid uid, CryoPodComponent component, GasAnalyzerScanEvent args) + { + var gasMixDict = new Dictionary { { Name(uid), component.Air } }; + // If it's connected to a port, include the port side + if (TryComp(uid, out NodeContainerComponent? nodeContainer)) + { + if(nodeContainer.TryGetNode(component.PortName, out PipeNode? port)) + gasMixDict.Add(component.PortName, port.Air); + } + args.GasMixtures = gasMixDict; + } + + + #endregion +} diff --git a/Content.Server/Medical/InsideCryoPodSystem.cs b/Content.Server/Medical/InsideCryoPodSystem.cs new file mode 100644 index 0000000000..a41896b726 --- /dev/null +++ b/Content.Server/Medical/InsideCryoPodSystem.cs @@ -0,0 +1,47 @@ +using Content.Server.Atmos.EntitySystems; +using Content.Server.Medical.Components; +using Content.Shared.Medical.Cryogenics; + +namespace Content.Server.Medical +{ + public sealed partial class CryoPodSystem + { + public override void InitializeInsideCryoPod() + { + base.InitializeInsideCryoPod(); + // Atmos overrides + SubscribeLocalEvent(OnInhaleLocation); + SubscribeLocalEvent(OnExhaleLocation); + SubscribeLocalEvent(OnGetAir); + } + + #region Atmos handlers + + private void OnGetAir(EntityUid uid, InsideCryoPodComponent component, ref AtmosExposedGetAirEvent args) + { + if (TryComp(Transform(uid).ParentUid, out var cryoPodComponent)) + { + args.Gas = cryoPodComponent.Air; + args.Handled = true; + } + } + + private void OnInhaleLocation(EntityUid uid, InsideCryoPodComponent component, InhaleLocationEvent args) + { + if (TryComp(Transform(uid).ParentUid, out var cryoPodComponent)) + { + args.Gas = cryoPodComponent.Air; + } + } + + private void OnExhaleLocation(EntityUid uid, InsideCryoPodComponent component, ExhaleLocationEvent args) + { + if (TryComp(Transform(uid).ParentUid, out var cryoPodComponent)) + { + args.Gas = cryoPodComponent.Air; + } + } + + #endregion + } +} diff --git a/Content.Server/Temperature/Components/ContainerTemperatureDamageThresholdsComponent.cs b/Content.Server/Temperature/Components/ContainerTemperatureDamageThresholdsComponent.cs new file mode 100644 index 0000000000..78a9da8088 --- /dev/null +++ b/Content.Server/Temperature/Components/ContainerTemperatureDamageThresholdsComponent.cs @@ -0,0 +1,13 @@ +namespace Content.Server.Temperature.Components; + +[RegisterComponent] +public sealed class ContainerTemperatureDamageThresholdsComponent: Component +{ + [DataField("heatDamageThreshold")] + [ViewVariables(VVAccess.ReadWrite)] + public float? HeatDamageThreshold; + + [DataField("coldDamageThreshold")] + [ViewVariables(VVAccess.ReadWrite)] + public float? ColdDamageThreshold; +} diff --git a/Content.Server/Temperature/Components/TemperatureComponent.cs b/Content.Server/Temperature/Components/TemperatureComponent.cs index 0a0a77486f..1915c317b2 100644 --- a/Content.Server/Temperature/Components/TemperatureComponent.cs +++ b/Content.Server/Temperature/Components/TemperatureComponent.cs @@ -24,6 +24,18 @@ namespace Content.Server.Temperature.Components [ViewVariables(VVAccess.ReadWrite)] public float ColdDamageThreshold = 260f; + /// + /// Overrides HeatDamageThreshold if the entity's within a parent with the TemperatureDamageThresholdsComponent component. + /// + [ViewVariables(VVAccess.ReadWrite)] + public float? ParentHeatDamageThreshold; + + /// + /// Overrides ColdDamageThreshold if the entity's within a parent with the TemperatureDamageThresholdsComponent component. + /// + [ViewVariables(VVAccess.ReadWrite)] + public float? ParentColdDamageThreshold; + [DataField("specificHeat")] [ViewVariables(VVAccess.ReadWrite)] public float SpecificHeat = 50f; diff --git a/Content.Server/Temperature/Systems/TemperatureSystem.cs b/Content.Server/Temperature/Systems/TemperatureSystem.cs index f249914bf2..b28e7909ec 100644 --- a/Content.Server/Temperature/Systems/TemperatureSystem.cs +++ b/Content.Server/Temperature/Systems/TemperatureSystem.cs @@ -11,8 +11,6 @@ using Content.Shared.Database; using Content.Shared.Inventory; using Content.Shared.Temperature; using Robust.Server.GameObjects; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; namespace Content.Server.Temperature.Systems { @@ -22,7 +20,7 @@ namespace Content.Server.Temperature.Systems [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!; [Dependency] private readonly AlertsSystem _alertsSystem = default!; - [Dependency] private readonly IAdminLogManager _adminLogger= default!; + [Dependency] private readonly IAdminLogManager _adminLogger = default!; /// /// All the components that will have their damage updated at the end of the tick. @@ -40,7 +38,15 @@ namespace Content.Server.Temperature.Systems SubscribeLocalEvent(EnqueueDamage); SubscribeLocalEvent(OnAtmosExposedUpdate); SubscribeLocalEvent(ServerAlert); - SubscribeLocalEvent>(OnTemperatureChangeAttempt); + SubscribeLocalEvent>( + OnTemperatureChangeAttempt); + + // Allows overriding thresholds based on the parent's thresholds. + SubscribeLocalEvent(OnParentChange); + SubscribeLocalEvent( + OnParentThresholdStartup); + SubscribeLocalEvent( + OnParentThresholdShutdown); } public override void Update(float frameTime) @@ -76,11 +82,13 @@ namespace Content.Server.Temperature.Systems float lastTemp = temperature.CurrentTemperature; float delta = temperature.CurrentTemperature - temp; temperature.CurrentTemperature = temp; - RaiseLocalEvent(uid, new OnTemperatureChangeEvent(temperature.CurrentTemperature, lastTemp, delta), true); + RaiseLocalEvent(uid, new OnTemperatureChangeEvent(temperature.CurrentTemperature, lastTemp, delta), + true); } } - public void ChangeHeat(EntityUid uid, float heatAmount, bool ignoreHeatResistance=false, TemperatureComponent? temperature = null) + public void ChangeHeat(EntityUid uid, float heatAmount, bool ignoreHeatResistance = false, + TemperatureComponent? temperature = null) { if (Resolve(uid, ref temperature)) { @@ -95,11 +103,13 @@ namespace Content.Server.Temperature.Systems temperature.CurrentTemperature += heatAmount / temperature.HeatCapacity; float delta = temperature.CurrentTemperature - lastTemp; - RaiseLocalEvent(uid, new OnTemperatureChangeEvent(temperature.CurrentTemperature, lastTemp, delta), true); + RaiseLocalEvent(uid, new OnTemperatureChangeEvent(temperature.CurrentTemperature, lastTemp, delta), + true); } } - private void OnAtmosExposedUpdate(EntityUid uid, TemperatureComponent temperature, ref AtmosExposedUpdateEvent args) + private void OnAtmosExposedUpdate(EntityUid uid, TemperatureComponent temperature, + ref AtmosExposedUpdateEvent args) { var transform = args.Transform; @@ -109,9 +119,11 @@ namespace Content.Server.Temperature.Systems var position = _transformSystem.GetGridOrMapTilePosition(uid, transform); var temperatureDelta = args.GasMixture.Temperature - temperature.CurrentTemperature; - var tileHeatCapacity = _atmosphereSystem.GetTileHeatCapacity(transform.GridUid, transform.MapUid.Value, position); - var heat = temperatureDelta * (tileHeatCapacity * temperature.HeatCapacity / (tileHeatCapacity + temperature.HeatCapacity)); - ChangeHeat(uid, heat * temperature.AtmosTemperatureTransferEfficiency, temperature: temperature ); + var tileHeatCapacity = + _atmosphereSystem.GetTileHeatCapacity(transform.GridUid, transform.MapUid.Value, position); + var heat = temperatureDelta * (tileHeatCapacity * temperature.HeatCapacity / + (tileHeatCapacity + temperature.HeatCapacity)); + ChangeHeat(uid, heat * temperature.AtmosTemperatureTransferEfficiency, temperature: temperature); } private void ServerAlert(EntityUid uid, AlertsComponent status, OnTemperatureChangeEvent args) @@ -173,42 +185,160 @@ namespace Content.Server.Temperature.Systems var y = temperature.DamageCap; var c = y * 2; - if (temperature.CurrentTemperature >= temperature.HeatDamageThreshold) + var heatDamageThreshold = temperature.ParentHeatDamageThreshold ?? temperature.HeatDamageThreshold; + var coldDamageThreshold = temperature.ParentColdDamageThreshold ?? temperature.ColdDamageThreshold; + + if (temperature.CurrentTemperature >= heatDamageThreshold) { if (!temperature.TakingDamage) { - _adminLogger.Add(LogType.Temperature, $"{ToPrettyString(temperature.Owner):entity} started taking high temperature damage"); + _adminLogger.Add(LogType.Temperature, + $"{ToPrettyString(temperature.Owner):entity} started taking high temperature damage"); temperature.TakingDamage = true; } - var diff = Math.Abs(temperature.CurrentTemperature - temperature.HeatDamageThreshold); + var diff = Math.Abs(temperature.CurrentTemperature - heatDamageThreshold); var tempDamage = c / (1 + a * Math.Pow(Math.E, -heatK * diff)) - y; _damageableSystem.TryChangeDamage(uid, temperature.HeatDamage * tempDamage, interruptsDoAfters: false); } - else if (temperature.CurrentTemperature <= temperature.ColdDamageThreshold) + else if (temperature.CurrentTemperature <= coldDamageThreshold) { if (!temperature.TakingDamage) { - _adminLogger.Add(LogType.Temperature, $"{ToPrettyString(temperature.Owner):entity} started taking low temperature damage"); + _adminLogger.Add(LogType.Temperature, + $"{ToPrettyString(temperature.Owner):entity} started taking low temperature damage"); temperature.TakingDamage = true; } - var diff = Math.Abs(temperature.CurrentTemperature - temperature.ColdDamageThreshold); + var diff = Math.Abs(temperature.CurrentTemperature - coldDamageThreshold); var tempDamage = - Math.Sqrt(diff * (Math.Pow(temperature.DamageCap.Double(), 2) / temperature.ColdDamageThreshold)); + Math.Sqrt(diff * (Math.Pow(temperature.DamageCap.Double(), 2) / coldDamageThreshold)); _damageableSystem.TryChangeDamage(uid, temperature.ColdDamage * tempDamage, interruptsDoAfters: false); } else if (temperature.TakingDamage) { - _adminLogger.Add(LogType.Temperature, $"{ToPrettyString(temperature.Owner):entity} stopped taking temperature damage"); + _adminLogger.Add(LogType.Temperature, + $"{ToPrettyString(temperature.Owner):entity} stopped taking temperature damage"); temperature.TakingDamage = false; } } - private void OnTemperatureChangeAttempt(EntityUid uid, TemperatureProtectionComponent component, InventoryRelayedEvent args) + private void OnTemperatureChangeAttempt(EntityUid uid, TemperatureProtectionComponent component, + InventoryRelayedEvent args) { args.Args.TemperatureDelta *= component.Coefficient; } + + private void OnParentChange(EntityUid uid, TemperatureComponent component, + ref EntParentChangedMessage args) + { + var temperatureQuery = GetEntityQuery(); + var transformQuery = GetEntityQuery(); + var thresholdsQuery = GetEntityQuery(); + // We only need to update thresholds if the thresholds changed for the entity's ancestors. + var oldThresholds = args.OldParent != null + ? RecalculateParentThresholds(args.OldParent.Value, transformQuery, thresholdsQuery) + : (null, null); + var newThresholds = RecalculateParentThresholds(transformQuery.GetComponent(uid).ParentUid, transformQuery, thresholdsQuery); + + if (oldThresholds != newThresholds) + { + RecursiveThresholdUpdate(uid, temperatureQuery, transformQuery, thresholdsQuery); + } + } + + private void OnParentThresholdStartup(EntityUid uid, ContainerTemperatureDamageThresholdsComponent component, + ComponentStartup args) + { + RecursiveThresholdUpdate(uid, GetEntityQuery(), GetEntityQuery(), + GetEntityQuery()); + } + + private void OnParentThresholdShutdown(EntityUid uid, ContainerTemperatureDamageThresholdsComponent component, + ComponentShutdown args) + { + RecursiveThresholdUpdate(uid, GetEntityQuery(), GetEntityQuery(), + GetEntityQuery()); + } + + /// + /// Recalculate and apply parent thresholds for the root entity and all its descendant. + /// + /// + /// + /// + /// + private void RecursiveThresholdUpdate(EntityUid root, EntityQuery temperatureQuery, + EntityQuery transformQuery, + EntityQuery tempThresholdsQuery) + { + RecalculateAndApplyParentThresholds(root, temperatureQuery, transformQuery, tempThresholdsQuery); + + foreach (var child in Transform(root).ChildEntities) + { + RecursiveThresholdUpdate(child, temperatureQuery, transformQuery, tempThresholdsQuery); + } + } + + /// + /// Recalculate parent thresholds and apply them on the uid temperature component. + /// + /// + /// + /// + /// + private void RecalculateAndApplyParentThresholds(EntityUid uid, + EntityQuery temperatureQuery, EntityQuery transformQuery, + EntityQuery tempThresholdsQuery) + { + if (!temperatureQuery.TryGetComponent(uid, out var temperature)) + { + return; + } + + var newThresholds = RecalculateParentThresholds(transformQuery.GetComponent(uid).ParentUid, transformQuery, tempThresholdsQuery); + temperature.ParentHeatDamageThreshold = newThresholds.Item1; + temperature.ParentColdDamageThreshold = newThresholds.Item2; + } + + /// + /// Recalculate Parent Heat/Cold DamageThreshold by recursively checking each ancestor and fetching the + /// maximum HeatDamageThreshold and the minimum ColdDamageThreshold if any exists (aka the best value for each). + /// + /// + /// + /// + private (float?, float?) RecalculateParentThresholds( + EntityUid initialParentUid, + EntityQuery transformQuery, + EntityQuery tempThresholdsQuery) + { + // Recursively check parents for the best threshold available + var parentUid = initialParentUid; + float? newHeatThreshold = null; + float? newColdThreshold = null; + while (parentUid.IsValid()) + { + if (tempThresholdsQuery.TryGetComponent(parentUid, out var newThresholds)) + { + if (newThresholds.HeatDamageThreshold != null) + { + newHeatThreshold = Math.Max(newThresholds.HeatDamageThreshold.Value, + newHeatThreshold ?? 0); + } + + if (newThresholds.ColdDamageThreshold != null) + { + newColdThreshold = Math.Min(newThresholds.ColdDamageThreshold.Value, + newColdThreshold ?? float.MaxValue); + } + } + + parentUid = transformQuery.GetComponent(parentUid).ParentUid; + } + + return (newHeatThreshold, newColdThreshold); + } } public sealed class OnTemperatureChangeEvent : EntityEventArgs diff --git a/Content.Shared/Medical/Cryogenics/ActiveCryoPodComponent.cs b/Content.Shared/Medical/Cryogenics/ActiveCryoPodComponent.cs new file mode 100644 index 0000000000..b48353fd77 --- /dev/null +++ b/Content.Shared/Medical/Cryogenics/ActiveCryoPodComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Server.Medical.Components; + +/// +/// Tracking component for an enabled cryo pod (which periodically tries to inject chemicals in the occupant, if one exists) +/// +[RegisterComponent] +public sealed class ActiveCryoPodComponent : Component +{ +} diff --git a/Content.Shared/Medical/Cryogenics/CryoPodWireStatus.cs b/Content.Shared/Medical/Cryogenics/CryoPodWireStatus.cs new file mode 100644 index 0000000000..dfd3ada235 --- /dev/null +++ b/Content.Shared/Medical/Cryogenics/CryoPodWireStatus.cs @@ -0,0 +1,10 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Medical.Cryogenics +{ + [Serializable, NetSerializable] + public enum CryoPodWireActionKey: byte + { + Key + } +} diff --git a/Content.Shared/Medical/Cryogenics/InsideCryoPodComponent.cs b/Content.Shared/Medical/Cryogenics/InsideCryoPodComponent.cs new file mode 100644 index 0000000000..dc5f9b47d8 --- /dev/null +++ b/Content.Shared/Medical/Cryogenics/InsideCryoPodComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Medical.Cryogenics; + +[RegisterComponent] +[NetworkedComponent] +public sealed class InsideCryoPodComponent: Component +{ + [ViewVariables] + [DataField("previousOffset")] + public Vector2 PreviousOffset { get; set; } = new(0, 0); +} diff --git a/Content.Shared/Medical/Cryogenics/SharedCryoPodComponent.cs b/Content.Shared/Medical/Cryogenics/SharedCryoPodComponent.cs new file mode 100644 index 0000000000..b10a929879 --- /dev/null +++ b/Content.Shared/Medical/Cryogenics/SharedCryoPodComponent.cs @@ -0,0 +1,105 @@ +using System.Threading; +using Content.Shared.Body.Components; +using Content.Shared.DragDrop; +using Robust.Shared.Containers; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared.Medical.Cryogenics; + +[NetworkedComponent] +public abstract class SharedCryoPodComponent: Component, IDragDropOn +{ + /// + /// Specifies the name of the atmospherics port to draw gas from. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("port")] + public string PortName { get; set; } = "port"; + + /// + /// Specifies the name of the atmospherics port to draw gas from. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("solutionContainerName")] + public string SolutionContainerName { get; set; } = "beakerSlot"; + + /// + /// How often (seconds) are chemicals transferred from the beaker to the body? + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("beakerTransferTime")] + public float BeakerTransferTime = 1f; + + [ViewVariables(VVAccess.ReadWrite)] + [DataField("nextInjectionTime", customTypeSerializer:typeof(TimeOffsetSerializer))] + public TimeSpan? NextInjectionTime; + + /// + /// How many units to transfer per tick from the beaker to the mob? + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("beakerTransferAmount")] + public float BeakerTransferAmount = 1f; + + /// + /// Delay applied when inserting a mob in the pod. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("entryDelay")] + public float EntryDelay = 2f; + + /// + /// Delay applied when trying to pry open a locked pod. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("pryDelay")] + public float PryDelay = 5f; + + /// + /// Container for mobs inserted in the pod. + /// + [ViewVariables] + public ContainerSlot BodyContainer = default!; + + /// + /// If true, the eject verb will not work on the pod and the user must use a crowbar to pry the pod open. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("locked")] + public bool Locked { get; set; } + + /// + /// Causes the pod to be locked without being fixable by messing with wires. + /// + [ViewVariables(VVAccess.ReadWrite)] + [DataField("permaLocked")] + public bool PermaLocked { get; set; } + + public bool IsPrying { get; set; } + + public CancellationTokenSource? DragDropCancelToken; + + [Serializable, NetSerializable] + public enum CryoPodVisuals : byte + { + ContainsEntity, + IsOn + } + + public bool CanInsert(EntityUid entity) + { + return IoCManager.Resolve().HasComponent(entity); + } + + bool IDragDropOn.CanDragDropOn(DragDropEvent eventArgs) + { + return CanInsert(eventArgs.Dragged); + } + + bool IDragDropOn.DragDropOn(DragDropEvent eventArgs) + { + return false; + } +} diff --git a/Content.Shared/Medical/Cryogenics/SharedCryoPodSystem.cs b/Content.Shared/Medical/Cryogenics/SharedCryoPodSystem.cs new file mode 100644 index 0000000000..b9829f2ec6 --- /dev/null +++ b/Content.Shared/Medical/Cryogenics/SharedCryoPodSystem.cs @@ -0,0 +1,169 @@ +using Content.Server.Medical.Components; +using Content.Shared.Destructible; +using Content.Shared.Emag.Systems; +using Content.Shared.MobState.Components; +using Content.Shared.MobState.EntitySystems; +using Content.Shared.Popups; +using Content.Shared.Standing; +using Content.Shared.Stunnable; +using Content.Shared.Verbs; +using Robust.Shared.Containers; +using Robust.Shared.Player; + +namespace Content.Shared.Medical.Cryogenics; + +public abstract partial class SharedCryoPodSystem: EntitySystem +{ + [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; + [Dependency] private readonly StandingStateSystem _standingStateSystem = default!; + [Dependency] private readonly SharedMobStateSystem _mobStateSystem = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly SharedContainerSystem _containerSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + InitializeInsideCryoPod(); + } + + protected void OnComponentInit(EntityUid uid, SharedCryoPodComponent cryoPodComponent, ComponentInit args) + { + cryoPodComponent.BodyContainer = _containerSystem.EnsureContainer(uid, "scanner-body"); + } + + protected void UpdateAppearance(EntityUid uid, SharedCryoPodComponent? cryoPod = null, AppearanceComponent? appearance = null) + { + if (!Resolve(uid, ref cryoPod)) + return; + var cryoPodEnabled = HasComp(uid); + if (TryComp(uid, out var light)) + { + light.Enabled = cryoPodEnabled && cryoPod.BodyContainer.ContainedEntity != null; + } + + if (!Resolve(uid, ref appearance)) + return; + _appearanceSystem.SetData(uid, SharedCryoPodComponent.CryoPodVisuals.ContainsEntity, cryoPod.BodyContainer.ContainedEntity == null, appearance); + _appearanceSystem.SetData(uid, SharedCryoPodComponent.CryoPodVisuals.IsOn, cryoPodEnabled, appearance); + } + + public void InsertBody(EntityUid uid, EntityUid target, SharedCryoPodComponent cryoPodComponent) + { + if (cryoPodComponent.BodyContainer.ContainedEntity != null) + return; + + if (!HasComp(target)) + return; + + var xform = Transform(target); + cryoPodComponent.BodyContainer.Insert(target, transform: xform); + + EnsureComp(target); + _standingStateSystem.Stand(target, force: true); // Force-stand the mob so that the cryo pod sprite overlays it fully + + UpdateAppearance(uid, cryoPodComponent); + } + + public void TryEjectBody(EntityUid uid, EntityUid userId, SharedCryoPodComponent? cryoPodComponent) + { + if (!Resolve(uid, ref cryoPodComponent)) + { + return; + } + + if (cryoPodComponent.Locked) + { + _popupSystem.PopupEntity(Loc.GetString("cryo-pod-locked"), uid, userId); + return; + } + + EjectBody(uid, cryoPodComponent); + } + + public virtual void EjectBody(EntityUid uid, SharedCryoPodComponent? cryoPodComponent) + { + if (!Resolve(uid, ref cryoPodComponent)) + return; + + if (cryoPodComponent.BodyContainer.ContainedEntity is not {Valid: true} contained) + return; + + cryoPodComponent.BodyContainer.Remove(contained); + // InsideCryoPodComponent is removed automatically in its EntGotRemovedFromContainerMessage listener + // RemComp(contained); + + // Restore the correct position of the patient. Checking the components manually feels hacky, but I did not find a better way for now. + if (HasComp(contained) || _mobStateSystem.IsIncapacitated(contained)) + { + _standingStateSystem.Down(contained); + } + else + { + _standingStateSystem.Stand(contained); + } + + UpdateAppearance(uid, cryoPodComponent); + } + + protected void AddAlternativeVerbs(EntityUid uid, SharedCryoPodComponent cryoPodComponent, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + // Eject verb + if (cryoPodComponent.BodyContainer.ContainedEntity != null) + { + args.Verbs.Add(new AlternativeVerb + { + Text = Loc.GetString("cryo-pod-verb-noun-occupant"), + Category = VerbCategory.Eject, + Priority = 1, // Promote to top to make ejecting the ALT-click action + Act = () => TryEjectBody(uid, args.User, cryoPodComponent) + }); + } + } + + protected void OnEmagged(EntityUid uid, SharedCryoPodComponent? cryoPodComponent, GotEmaggedEvent args) + { + if (!Resolve(uid, ref cryoPodComponent)) + { + return; + } + + cryoPodComponent.PermaLocked = true; + cryoPodComponent.Locked = true; + args.Handled = true; + } + + protected void DoInsertCryoPod(EntityUid uid, SharedCryoPodComponent cryoPodComponent, DoInsertCryoPodEvent args) + { + cryoPodComponent.DragDropCancelToken = null; + InsertBody(uid, args.ToInsert, cryoPodComponent); + } + + protected void DoInsertCancelCryoPod(EntityUid uid, SharedCryoPodComponent cryoPodComponent, DoInsertCancelledCryoPodEvent args) + { + cryoPodComponent.DragDropCancelToken = null; + } + + protected void OnCryoPodPryFinished(EntityUid uid, SharedCryoPodComponent cryoPodComponent, CryoPodPryFinished args) + { + cryoPodComponent.IsPrying = false; + EjectBody(uid, cryoPodComponent); + } + + protected void OnCryoPodPryInterrupted(EntityUid uid, SharedCryoPodComponent cryoPodComponent, CryoPodPryInterrupted args) + { + cryoPodComponent.IsPrying = false; + } + + #region Event records + + protected record DoInsertCryoPodEvent(EntityUid ToInsert); + protected record DoInsertCancelledCryoPodEvent; + protected record CryoPodPryFinished; + protected record CryoPodPryInterrupted; + + #endregion +} diff --git a/Content.Shared/Medical/Cryogenics/SharedInsideCryoPodSystem.cs b/Content.Shared/Medical/Cryogenics/SharedInsideCryoPodSystem.cs new file mode 100644 index 0000000000..da3604e6e5 --- /dev/null +++ b/Content.Shared/Medical/Cryogenics/SharedInsideCryoPodSystem.cs @@ -0,0 +1,29 @@ +using Content.Shared.Standing; +using Robust.Shared.Containers; + +namespace Content.Shared.Medical.Cryogenics; + +public abstract partial class SharedCryoPodSystem +{ + public virtual void InitializeInsideCryoPod() + { + SubscribeLocalEvent(HandleDown); + SubscribeLocalEvent(OnEntGotRemovedFromContainer); + } + + // Must stand in the cryo pod + private void HandleDown(EntityUid uid, InsideCryoPodComponent component, DownAttemptEvent args) + { + args.Cancel(); + } + + private void OnEntGotRemovedFromContainer(EntityUid uid, InsideCryoPodComponent component, EntGotRemovedFromContainerMessage args) + { + if (Terminating(uid)) + { + return; + } + + RemComp(uid); + } +} diff --git a/Content.Shared/Standing/StandingStateSystem.cs b/Content.Shared/Standing/StandingStateSystem.cs index f646f91de4..b7c17b1848 100644 --- a/Content.Shared/Standing/StandingStateSystem.cs +++ b/Content.Shared/Standing/StandingStateSystem.cs @@ -116,7 +116,8 @@ namespace Content.Shared.Standing public bool Stand(EntityUid uid, StandingStateComponent? standingState = null, - AppearanceComponent? appearance = null) + AppearanceComponent? appearance = null, + bool force = false) { // TODO: This should actually log missing comps... if (!Resolve(uid, ref standingState, false)) @@ -128,11 +129,14 @@ namespace Content.Shared.Standing if (standingState.Standing) return true; - var msg = new StandAttemptEvent(); - RaiseLocalEvent(uid, msg, false); + if (!force) + { + var msg = new StandAttemptEvent(); + RaiseLocalEvent(uid, msg, false); - if (msg.Cancelled) - return false; + if (msg.Cancelled) + return false; + } standingState.Standing = true; Dirty(standingState); diff --git a/Resources/Locale/en-US/medical/components/cryo-pod-component.ftl b/Resources/Locale/en-US/medical/components/cryo-pod-component.ftl new file mode 100644 index 0000000000..53ee8301de --- /dev/null +++ b/Resources/Locale/en-US/medical/components/cryo-pod-component.ftl @@ -0,0 +1,7 @@ +# Ejection verb label. +cryo-pod-verb-noun-occupant = Patient +# Examine text showing whether there's a beaker in the pod and if it is empty. +cryo-pod-examine = There's {INDEFINITE($beaker)} {$beaker} in here. +cryo-pod-empty-beaker = It is empty! +# Shown when a normal ejection through the eject verb is attempted on a locked pod. +cryo-pod-locked = The ejection mechanism is unresponsive! diff --git a/Resources/Prototypes/Catalog/Research/technologies.yml b/Resources/Prototypes/Catalog/Research/technologies.yml index 57c8385b1f..a1967a3fe5 100644 --- a/Resources/Prototypes/Catalog/Research/technologies.yml +++ b/Resources/Prototypes/Catalog/Research/technologies.yml @@ -1,4 +1,4 @@ -# In order to make this list somewhat organized, please place +# In order to make this list somewhat organized, please place # new technologies underneath their overarching "base" technology. # Base Technology @@ -160,6 +160,7 @@ - MedicalScannerMachineCircuitboard - StasisBedMachineCircuitboard - CloningConsoleComputerCircuitboard + - CryoPodMachineCircuitboard # Security Technology Tree @@ -386,7 +387,7 @@ name: technologies-rapid-upgrade id: RapidUpgrade description: technologies-rapid-upgrade-description - icon: + icon: sprite: Objects/Specific/Research/rped.rsi state: icon requiredPoints: 10000 diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml index becc60ef10..251c950d46 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml @@ -268,6 +268,24 @@ Glass: 5 Cable: 1 +- type: entity + id: CryoPodMachineCircuitboard + parent: BaseMachineCircuitboard + name: cryo pod machine board + description: A machine printed circuit board for a cryo pod + components: + - type: Sprite + state: medical + - type: MachineBoard + prototype: CryoPod + requirements: + ScanningModule: 1 + Manipulator: 1 + MatterBin: 2 + materialRequirements: + Glass: 1 + Cable: 1 + - type: entity id: ChemMasterMachineCircuitboard parent: BaseMachineCircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Machines/Medical/cryo_pod.yml b/Resources/Prototypes/Entities/Structures/Machines/Medical/cryo_pod.yml new file mode 100644 index 0000000000..ed4c967df4 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Machines/Medical/cryo_pod.yml @@ -0,0 +1,104 @@ +- type: entity + parent: [BaseStructure, ConstructibleMachine] # Not a BaseMachinePowered since we don't want the anchorable component + id: CryoPod + name: cryo pod + description: A special machine intended to create a safe environment for the use of chemicals that react in cold environments. + components: + - type: Sprite + netsync: false + sprite: Structures/Machines/cryogenics.rsi + drawdepth: Mobs + noRot: true + offset: 0, 0.5 + layers: + - sprite: Structures/Piping/Atmospherics/pipe.rsi + state: pipeHalf + offset: 0, -0.5 + map: [ "enum.PipeVisualLayers.Pipe" ] + - state: pod-open + map: [ "enum.CryoPodVisualLayers.Base" ] + - state: cover-on + map: [ "enum.CryoPodVisualLayers.Cover" ] + visible: false + - state: pod-panel + map: [ "enum.WiresVisualLayers.MaintenancePanel" ] + visible: false + - type: InteractionOutline + - type: Transform + noRot: true + - type: Fixtures + fixtures: + - shape: + !type:PhysShapeAabb + bounds: "-0.5,-0.5,0.5,0.90" + density: 200 + mask: + - MachineMask + layer: + - MachineLayer + - type: ContainerContainer + containers: + scanner-body: + !type:ContainerSlot + showEnts: true + beakerSlot: !type:ContainerSlot {} + machine_board: !type:Container + machine_parts: !type:Container + - type: AtmosDevice + - type: Appearance + - type: Machine + board: CryoPodMachineCircuitboard + - type: WiresVisuals + - type: Wires + BoardName: "Cryo pod" + LayoutId: CryoPod + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 100 + behaviors: + - !type:EmptyAllContainersBehaviour + - !type:ChangeConstructionNodeBehavior + node: machineFrame + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: ApcPowerReceiver + powerLoad: 3000 + - type: ExtensionCableReceiver + - type: NodeContainer + nodes: + port: + !type:PortablePipeNode + nodeGroupID: Pipe + pipeDirection: South + - type: ItemSlots + slots: + beakerSlot: + whitelist: + components: + - FitsInDispenser + - type: UserInterface + interfaces: + - key: enum.HealthAnalyzerUiKey.Key + type: HealthAnalyzerBoundUserInterface + - key: enum.WiresUiKey.Key + type: WiresBoundUserInterface + - type: ActivatableUI + key: enum.HealthAnalyzerUiKey.Key + requireHands: false + - type: ActivatableUIRequiresPower + - type: PointLight + color: "#3a807f" + radius: 2 + energy: 10 + enabled: false + - type: EmptyOnMachineDeconstruct + containers: + - scanner-body + - type: CryoPod + - type: ContainerTemperatureDamageThresholds + coldDamageThreshold: 10 diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 1a7d84a844..a9c19be854 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -268,6 +268,7 @@ - PortableScrubberMachineCircuitBoard - CloningPodMachineCircuitboard - MedicalScannerMachineCircuitboard + - CryoPodMachineCircuitboard - CrewMonitoringComputerCircuitboard - VaccinatorMachineCircuitboard - DiagnoserMachineCircuitboard diff --git a/Resources/Prototypes/Recipes/Lathes/electronics.yml b/Resources/Prototypes/Recipes/Lathes/electronics.yml index 8814b7a76f..2d59384acb 100644 --- a/Resources/Prototypes/Recipes/Lathes/electronics.yml +++ b/Resources/Prototypes/Recipes/Lathes/electronics.yml @@ -91,6 +91,16 @@ Steel: 100 Glass: 900 +- type: latheRecipe + id: CryoPodMachineCircuitboard + icon: Objects/Misc/module.rsi/id_mod.png + result: CryoPodMachineCircuitboard + completetime: 4 + materials: + Steel: 100 + Glass: 900 + Gold: 100 + - type: latheRecipe id: ChemMasterMachineCircuitboard icon: { sprite: Objects/Misc/module.rsi, state: id_mod } diff --git a/Resources/Prototypes/Wires/layouts.yml b/Resources/Prototypes/Wires/layouts.yml index a4eae8c711..e130b561ca 100644 --- a/Resources/Prototypes/Wires/layouts.yml +++ b/Resources/Prototypes/Wires/layouts.yml @@ -68,3 +68,10 @@ dummyWires: 4 wires: - !type:PowerWireAction + +- type: wireLayout + id: CryoPod + dummyWires: 2 + wires: + - !type:PowerWireAction + - !type:CryoPodEjectLockWireAction diff --git a/Resources/Textures/Structures/Machines/cryogenics.rsi/cover-off.png b/Resources/Textures/Structures/Machines/cryogenics.rsi/cover-off.png new file mode 100644 index 0000000000000000000000000000000000000000..e238a66ed25a339f59d0ca2cfa4516b02661ae0e GIT binary patch literal 751 zcmVM<{{rR(Jc-Qvxf^h}FG>d#BpvgJUuJ8oqp0E)npT`S^Ll0=0bsqljZvMjc&`SktRl==38aSdg)Izf6Im1m`Ml55RK{^yI@PiZhD z>zK1h+79x(-Wes^XK_Nlu$8qH;EG!eACInkIG2&0eqG0PXqY5hOSNJ&cME&#HvWC* zdK(*OBC3{?uxyyNMN^C25Bom)VQ+w-0{Ek#`&gB&qt1y>SDQU8uB#0I`~upFmOxFj z7drw*>)h#-99fAnjbt$-vErZJKIOuiKan+q<67U*la65{{~RIUp8s?@@pFQ%s~vDH z0{Og@EpM{PID4}_iR!eT=HrNKk7MQ^Bkhe)_2q>R($aL&=KA6s*7w^>GWZ{D5kv-2 zYXDEg&xE|{Muxvg0(#pwl)1e{FYVm3`jRCE02`+m8s1+ zkL3Rt5Ek6I7PA8}m7H14R$-!6E#8>jPjwD~XoY$)o%wp5DcqLpN3EMXHji*rD(Cn6 z|%f8eIMnyOd@ETT0i8GD(B>4WC zS=jb=-J4Wz=}5Edj>WRzHMV}z`^FZKFHSE^)$Pg!d|sUHHS4E7wGfcm$DpS>Nr|s7&O%sfdG;0Ik?pbnxrD4`(hDi``u0+z~T!n<@D7qT_^uI|(#A-aZAKjTK4sB2*5yc$?Z(W33-UOe={x0#- zHD%G8Soxi66K>W}V#ZZV<_ysA!kWp6jM|^PBkOQsXdMxOmJ3y>Y3gqHqh>|p{gAV_az1pcoH zV&t9veXA?XP-s$elKJlhtkdTUo9;j@J1+G~os3SMa&Q*@i70b|go@_<@KhwHSpybo z%BSIVBcQoTP(eq2{RW5}BOqW)esFThE-?ugqNOTMydVM}q6805sYq~Zm>WRGSz?nV zGjRH^C-*^SQI}g?+I0K{p%J$+aJ$ew?30qMsuB2Mlf-YgsKb*pUw@8v4odYin_mQ! z?`9P~?e3OPS5WxV5G(1Lym(SBw$N+!=r(apT`MKrjngFbd4V%$y+PmD#Z(zDg5=dr zv)1#coWN({QHlO+YC;WBFAvkgD;znfRjy*i#3MT&>J!0}1^C#9Y|%c&J~X{ z!evZF*ACd_KeIdI9F>5a0bFaKvOk`ZTf~@4>iJ3r8|`N&nbt#_r*aDL(<97<@0eK(^6#0l}p6nz31RrP8F@rR(sKVZhi;Xs=u? zE)^Nq6?0z$I$q>X&#f{yNnibvyMj%bJZbE-~3^`#=BDO0yHxPz?45eA!Y z?;yo-$4@@(^bf?@&nje51DkOE8tIZE>tJ(rbjWm=IYVXjzPRb_VxbqJnM?Lb ziJ}EUu=l|bvtO+Fk&f&!BAJF+{NHfM#XW%_ZAp*01d4XSBD*q7Y_(iyxV4LezmU7* zBg@ntis1d<1D^_J9=3QI1$N4`*b}TZmgVDh_ulJvfz%RK$i80IA|N)F@0n$k7T_r& z^t#D6{`H{2qcE^|b>!){;G6Y!F8&qhJ5srrETN8S`>`$sYnwAOMw8gXo^!n7Mn{0mMz79wBG;Nw*uFoUd-q*07knze z*I#z*;HdX82Yf8{uTb>Jq)&iDw)5-2+Emw+39iW8>}W0cVoc zh1mpJzOpthM9!A<)CL_Ba=a6lC0uc{GkrO7npx`B{X6z|FTZA@ESSY9GLmsNS67+x z#av)ryQ!;Gg`S4ROpPlgIMlyq3wIxN{pZy5mBP?sk7aKVi5)5YJ~V?v8+T2FBbxJz zP||TuUeTwJD>XTmx=Jw@-u0Aha%Q+t`|Z9I)qQ&_cDj7YV2`LG(rpC>bvnO)lL6^# zD6X~T`#fZU4l2UPGAABEMfHKv^<9-~*vh?4pSh*}(@)J4W(aZCAK|jU@`KD*zb!?$ zf|>7@a{aoyn3MBZn`j*5w7(1oOVqRL^L;acIQq*ySMLz@Q2q!XD+w(q%<+#FWJwP( z5cCRgyM6Vw$ujdJNBFq>O9bx*=b1~FD2X7}1sCtsAU@@qqS;T`FCz=B8?t2i1lz$} z`kt{L1HGZS82G+(sGdV_;F2t;dW1^GB>7EQa~XruKn@9|*u8XBe)6Zb_^RjhI<(Kd z*-AyD5A5dLMdz@TJJ(Xd$HAlMbJ&hhcpGU>({##nZLC;wjC?m%_X*&eawZH9oc1Bd zu>m!vq^A}SJ`C*1H%FTK>-?ihk)_!NX&3N7NL1k7f=o19lgwuG-;1aa?4?YB!bAVX zv8Lp=tfJqo-mp5ZU%rFcd3%8vjdT`=R+c9!DutJdO5)NyA}^-Pg80YNj_prGA1pqY zwJ>9Yelna^hPW#W(l32hgDin(Em?4?oc0^fJ4juz#nd7eC@$UoGC&&Az81is@#)oQ z&-S0$8e~4HM`lUhIm0RP&7%reo1%`?=cdl=6nMQB1t-j2<6W;;B$=Gw_EKvN=^BVL zC0=S4H|beI*pP@wu|HWpS0!3`O&72uD2_#&WvX|LoNLJ^gs zTE6%2H*nqBRLJ=7I0iL=p7t6B@1t-0iLt%nDYz1GH5+_fa;IJ4IA;Z!FAK3g z{R6D(-6Oy)UX)^^*7hrudz(=PDdE4}iQcj(tLed*A;io7SYSS!A2rDiJ+h|Mz=!)s z!CMh*tnYeaK>T-H5^a3a&PuWogas9^Rmt0M3~pVsG-8soYxB*mcF=;4e|VWUb{au_ zxi@q51OA2U@$K^K1Y?CeCYclZ?-1c~y-i&qH06`?5JCBI^>JYi*y1s8+<^)W@Qb_t zVuo&<**SSSR2J{9bnOhILEhd+)sG`Sbz%vJZ%tfpT5TWe>nDo+u!)E z@-F;nA+Y-WeoO|b5|!3?A6a}&c}54!lR0mEpUj4}d+6@oGmbp3nRf?pi$*yE!#i5u&aH#eXCV@8B|3f z+mL>4N-tY|Qi#LMdO7_=Kt}8hn<1*l*mZ9%UrUHO2b)=r8dpn}xULF_AwjFCK$q}C z;!GRz<@#FILX#y8UP2l_?;XGYgeaV{+^iqEkNIj=(+@s2(N+8ISd>0%M9t#0h$yt=UdcsI^c#9jjEEAv>-ZHF=U82b?>{{s`3XXf}A_9ufhNG*M@sld^k$W{uO*TA4yLjCb8+mv}Kb0SIQ1m&8IA9=1Wi4T7X z)@2_OQx{^c#UEI#Kz@KF=3Z;4#{>%ARhqj)gKNSw4m&zIzfb1C+EuQ5wj$6M&^GjF z)D3(s6<9|h`+lWdo!#C{E*SKp(OW`x<8N~rhV8#vbQFJyPKIWYLCrbdQOy(gUQP^Q z2n)cKwz<;vV{oM^+tX)aYkNbEKeJ^J(}PvR&l@gvh6u~WzX9%wBVf1nY)J7dyzai6 zD;0QTb@j*t#7xzo8vL$w-Ut;KmMn~o*j*Q=Q3<%2#ii{*My4y1k{lliHQm&~!0hSK zyu9M^VIoip>Sl&4ks=&!nhgujwISE|(xS|{4 zdh7sJ?b)-BVF|_8S?tk-12n|EsLQYrLUh zwxrawuuKet+EDCL(APf(Btyr~rvs(e*CRkB} ze8rEJB!fQUm&@^{ZG~@ECI?Uo0&rQRRuUB?;;CHp8(O5 zFm$05e>&e0KpHrFCdvRNy~n}Yj7=9U+8VTbVa3fAvihtatOZeRj8Gp~&M}5zikk!p zug;#U#-BRrGshQ?8j)tUC7U^A}rnADScqGdKY$$+eMZ%s>2ptRP1H?)-U$Soq3bT7}zaj zln~t);h)XjwGw+1k9fw0DKF8@F*UrM?~)j?RAX0{*|$|=XV0a(-rh)L9iH?LKOlOT zKd=47#W~JC?PK+eLK`7-Htueu$e zw6`B-3Bs@Y(owJlA|71BMI76$Av2MeIv4)e5g0mLK(?d<2H{54@eS5I3tqV()%;b! zpqpCc|NrstMQ#ks@%n$8JRC9Uh^w-|U4Q9Q={jTTYc5+pDy zvTmB_+x%T{vq&0d07Jr=IQEuMw;q=;C_2~vM*XcLHd(@4*r^Bs6IEL@_72oRz%I0e z%!RiS8d;CBKSk%#>Dff#*RK9wilWXQ5)DatWeC`QO>hWyv(gHi1OC!c$bolxAxUIy zJkSIs;0pi2dl|_h+v}1*e&}MuhcHa|9S zm3_Q{ZcH1=Ex(is{KVdXcz~#RhXNP5rAJhcP-x`@Uq`72jaP&VpBfdw016A$quhQ+ z{emf945mxECTk zAFt~=^Tsd!UwELg6+Lq8AqE3tJ&_Yr(Ykb*(1ncOGpSEm%&Ykvi`Nf;4N$cH-~QD_@UBc-VgR`F7;1Cpl_%v z8DWs6`1~-mVW|vKOM}6*PRWRZPzo7xw4302{bJvH1m+wD{zCNN-o5uZn08~MJeZaV z3lVo{Sothe7CKYSsBL(^xwehBCpAD(3r z!iZiQgHqi1v5@bS$A~Xv0Z^cUjLJvAHk4rnh4)u$teaCj!p`-n3@EPhlD^huR3c!P zQ}1*^%I_?be%thuLG!RszI%PqzxEG^r-(`UqX@0igArW({~~K+ExEp;D1$jZC*W04vuZj*6 zQbD%!Cw%Ki$Dk0WPOlpJt(((0@m|R@OciQtydO0WzbxlKNc%WNStO%PXEfQ$|GQc7 i{J#q*LwsjWK`-3o-D<-c6c|4i0EYVa^s03nqyGnvn3+NV literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/cryogenics.rsi/meta.json b/Resources/Textures/Structures/Machines/cryogenics.rsi/meta.json new file mode 100644 index 0000000000..8eee377ff7 --- /dev/null +++ b/Resources/Textures/Structures/Machines/cryogenics.rsi/meta.json @@ -0,0 +1,41 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/tgstation/tgstation/commit/033d025f53051dc53ece230f486578be6f05f88f", + "size": { + "x": 32, + "y": 64 + }, + "states": [ + { + "name": "pod-panel" + }, + { + "name": "cover-off" + }, + { + "name": "cover-on", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "pod-open" + }, + { + "name": "pod-on" + }, + { + "name": "pod-off" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/cryogenics.rsi/pod-off.png b/Resources/Textures/Structures/Machines/cryogenics.rsi/pod-off.png new file mode 100644 index 0000000000000000000000000000000000000000..c3194e04516b094d33e58d5de75b2859958aeab5 GIT binary patch literal 1612 zcmV-S2DABzP)osGkEXvmg=ySp1i@KdD{YdyIbI;3!?3YUla8 z!lXjE(b@)JugEl09HF{1SlU!inHC(8IVB`rd?oW z0_>0JSCGQ@eQf(-W<=Jk>6rlt z<=&&V=f!k#ub7ztEQpsN0Ne)dNesQ07-wW40I8!_@+2;38)aK$jO!tq3qaRCSP9j2 z(3_wikW2t$nxC2Vr~%f`ol$Ez43mL4j5Md)sfgzS=&PdQLx%*A**@Hi3{oxW0H$~! zDbQ;Nuf{_F@Jbl1i2A6e(Lge(CIs-}nJ*ui06`EWI7+VyUoFeR>#t&Z6k&HAka_BX zv`-bFr&&~DfcY{kfN&x7dU0j|>DQkgPlVBJXaKsVA|XZ?cxCDjAf_gVS{C~Th#s{Q zfliMiGXox&Q|pvN&jXwgTD#4n z##6E2cFJ@#7J=^g0RWoKRv1+Pc}*JgRozDf`xyuTqwR!gm+sSPN`Iq4n|5c2474zP zf*=0{>C>H#UsUiF&ACC*Va$U%7X4#w&|LXboZmSpWdeOSSCRD{!0%g3Sx;XTr!&M z_S9`1x$6Ig=jVDiO$We;J>SPQU`Yg0zZLTrk?5IBTD6G~`29eQ{ZL5ib9-O_jQFI{ zgqA8I%s}8i5gBi2eAkfl4Iuz8kW@d%P+xlX+ytIX{lpgo2tT99+35@6@*DosNfQr` zjA+*lwGw{%`K=qdzmm<*&&!?F?*Oj70|>!Wt+Mk7vdmloFP2NuK8{0w=y!d6J^weN z_CLQt1zwBVb1#%3ubHsuC(B|0NQtz#Pnl3QH8o|y^fDCP+uMuA*6VdhiarML-up`= zy!QJ&a)5(pW@eyTty(aq^R)eig#{YN$JqDRU){DqA^_|#cj+bA-1ryDqYI0o_(##&&St9r7y#P6)t{sN*RSbqd3r9& zifNekh8%ry&n!kSyC+e~=gmPs1nsyNTln;O^ZY#dUQHb_uy{ zMv-Q2pR_5AmkaeQ029LPjM;FVnbRmukfU~M#T2&yB8cm6SP-RB8FqJTR-28lKN{A9 z+s{qAD;@(dA&SK=Ig6SCNm+0K*$^a2JP{y*2rtLq_y3?{m#@AOo!{QxgvG^0SYBR+ z)zwv4Sy{2p^B4wA6Hf(T2T8Us(SW0H)C&|LBMM`gDD> za{Mco7v(macM_ON05E>%-FN7{yZ312UyteSdv_^TN^4fEvTnN+@KZgE=)BV)*S0C# z+Mq?{W?%)(I1r@(#P|<>_BK6?dokmXq9)LRrqF`aMEvRXw}9Me(1L%S*>o53i) z9#BXh-1`&R_|9*Cnt-VUF*XFN$|r|C8?cv9=N}zXvpGdIez)J*V=y5bRm@Dxqb&yM zl4GTI+!{q;KqpBhfM5RZH#D$`LN*@9k!HYR!+sdj*6tRmDA3PJdrCYeCW`^Zttkc; zQJsNIlC>iMKtE#m>-+bqHr=MMdqlRy%44MsSQKgcV>aTnn#9&PCmaS8Qqb>{I_i)+ zJEs}57{t&2ewThSCJdDfykLd?fQ_&LJzHPX`L;z~r%P_&Q=L5yg8@Yx2D{nhaWSbl zq|mODYuRL-K*J~iw&A&5>NnT}Heg4J0(j1Ji}bq3S4w@2|g28OtEn3Us?!?E}G z_o+5BL$On%u4~gjw?Ca60BHNi`WAipOV{bM$B!st>NofIvN$WwiNV3Xu0@O8>m3|u zaBjU$4GxJ@t5cJI(8E;F%hR)@+-e$1L(uU8+WYupP5UgD;4^-XS)tpg)A8|v2E$oE zw(aOd(+Q}rsEFiSV`i2vx-PYOeh{4ofbKMk&b8aL!wEIdRKC8vL{Bz1sn660VN!bV z5LaO>@VR7bHKYftu*n$=$mY3q4vQDWr(-~|8xr#EL(XdU1S(>tTm?ZcACd_w0~K?= z5Hn+?{lMn2u{vc4AQ9rt6EDrr(bnN1IqXSze4KQ^wEnenFo3bZ!9b%hrdqS6$4h9` zX#gk^TJ3Biu3#l*`V)p?%?i8>nR?9-e+xi6+P2ly&B)eFS*HUq0w_+B%j+EKXDGE( z2JnM%7=y>!>oiAfBTVC3K_vjimUSF0C`;QaD@JHQtr##9a?t6})a-1g1LIDT(kf7L z1$A8S5jPz%2ruEWPPh~d?&Upx0k`kSJ)ZzOVMQoq0EuI>!X$%}Rvh&DS!UO{=?Kkw zOzNo)fyX&9HKp%UinuhZ_atL-AfeW_oZ*|)sLzRK7fMm`0(1HUk7nlVvB@_UfOIz~ z*gQO-^}W5sQ=_3MqxNgufCBCh;&r25)1k;p^(<9@jflnGKW6|v&&#}&gp+Vc>?IU+ zUIzrA06JS0B;7qz7NyHFt|+~b%Png*X+ny~JB-oqoipSBc0o`8MKA~tLvFLU3J5V| z*1hb8hAhBDbb0_nx8#CZZiqL)NfSa2NX#vJSdw_J)c9U7rV%Ca6%VztK;FLUYkuvYG2-)*>AEZC5Sdo4pqw7wLs#n0j2cIy$MLdBPT1Ce zu^7ojfB>yX!m2JP_re;O!B6o<^-O&L%dgN3Pjq6Xl_4>gULX}Apv8L#svwH}voTdzCMmYdh5UOOw({;_XhXXJ5$jPV{0Foyf3|ng$z>ay7 z(sHfQZQMx=AZ}g|W*Ken0i+W`q#|(Dw5uU|ei)@oa7y#DrAVjz0xc7${jvT>}*r$!2~yS8i^ zC*=%a@ky!ccMizs9Zs0iDU_ol$}%jaDeTa3mpopQn{)Hzap|^e)tzWO1HE3_e9|>P zOln(76UHPjgbj?-b9vn0=!j-;f~Hfhh8Pax9xL!T`vJo9lUg<#j=2Kry#O--X6g(A zTQeUO(rc4y%q9oeNdbWRXy9j*$LY2kNhmoWt6z3Lz`20EZZ?{Fye;;yO{Yrx<2EEJ z7gyP)iRTgmb3+;$=SCzh#%bVuR&=M^lLK)0EZ{a<)Z5-BpS>d84gK7q#B4+`;-@Dh zpU0sR{4`h4E!wW4sz2C_0KlJ7zG2(See-obX4SQE#d|_?2_~ZKDq@yo$jRE8Jx31r zk%05z-*;B%&b#kS_E)my`_Em!s^3MNh-)u)G9%d%orVLMZ>1X*q~(>1 z3sjqGX?B7KkLcM4e@pbPu1@|pqV8u8X~tOhzi{J?1WelLLWBhCLNwg(St(22`ws~< z18}|7M>I}G001S>;{NG_yZYVy{Ctk`0gadb+GE<|vxLkY@Pbt4{Rn_>efxXb@JA0n z)Cw?padDA0H#aqnqR>=cb${*JH9b$>iSGA)|Jxjp3;+gPzVZsKuRW!Og+bXVd7*mzJo{$9w1%0H$OBVBD<@_wrLy(|U55TwHi*MKj?(zQU!P$mnIak94hNvR`JhKKvRrSmj^2M_LB zH+T`OS!A4P;Sw>X`#p`0On8tGeG7vYuk^^z!!UFB? z?&O|DB>oWOLvdV@_M-6-049i5YlvKong+^PC;}7#kTTb-Zr!4ll@+>u`*!ZT%n_hf#w!5`h{7u+-js+-yK*8q#I1-RbdZQ>@an>L`f2T)WMr9wQ~pk9Dh z&`Xg}k-~uk@Tb5Lt|$@`;($P0Ku86Iihza!ib<-fiIfI4c4Nmjahlh9y{}<@W6yea zz3Z$aB6ILpjl4UL-}f`WnO%FP5$Li416;iRE(zN9*Uvwe{u6*pZ@g`rzVqg_QX(E> z*M(wqmL$?NF-GxVOBsx=KFmTvd^>5EU=!uSH9`DY(}pv~T0gs;B6L2`v6VAN`@ z25ZFQ1W7ptJBn(}FD^-F|K3~IwRRA`86c!SfEOmt z!Y?zoAzxgFXe7*Pb`%A|S~Jb2p;J?Z>?&1hb9)8x9ThH$DatQ>ry$mO#kaw zujq3NOVXw1CLk0FvGPzz0?RZdUDv_TbwVW5PN_rzXt`ukbKNj#yE>dfp>EILl`tOo zOoL|zsHs(>0ds{i$gu?MSBk2_;Y0l_o?jdP$B-uO$C*FiK`sxob9eM`BDpV!s#=3~ z3&9(Jc2Kn%yDU{IaFE*bO&Iv~cTfPyM6A02itxhe3P9I0aM0=j^Z@?<09}6%nDjfn zs{jYB9zYME2haoX1W>9fZZulTE&6NOG`-)9SZ;az{MOlyN$m`v8ML{dz}QlNT|W^Z z#Qq%tunZWyb2Ff2S-wHB9P4=>(&(qt%6$710BDrr?b9%W~Sc)(R!D*(pBxY=wr*clN@%`QNRewG^dl}aVhG+?_#O@oz{ z7506CaoVW`04b3cuURGlY~xD6;~F&0H`-!fm98bP(YFA+a``GVUbr`Jk2sx9L!r<- zmc_D)5Zvn;H9kJh`tdRz`@0+8I6!OwY%qHAaahf*!0>Py%H?KfHw@1R-ivaZ;wO$C zmE&cKW@(DhHy*)j{cu=2@VaWK&H>HC=rIs?_M-L zcKifXt5p`41BkK#&^!`to(Cn9{j9T>jtq~qlyL)YD#k$oW=7+qPYVEc=AACQ_>x^& z$mcwR8oK5f2?lkWa;1--WPhmT`wI+WE&tF7z;*h}Q!qG`g2BN72PJ}tLAN$rA4jpC z8>3F0eu8~&Y;3dm2qDS=u(R_BlE&M&ZK5_-;7>ifaW&rK*lX zB9Umx%B`P&aHJeldgZkyESlmUnwCqezVTZCQ1co4|DxdBME!GkWYo@zC``Me>^MeR z2X7jS@w^tb=XU{r40&e`(oVVTvgbhfW4O7o?%9t4%+CHU(VsWOO~~)XQTWN-#_tiv z=|VpTfC%AkjM;Dp6CWc#Lq2NvS`p1105-(=XB`l!)G(~CmmT+9eEw0m9^CERX?L5q z0EiH>+$86wqJdWy+<;sN;$`j$U_&&f6tnAd8C++%TaTO*fCt+%83No1tOixcc z>Ukdy>Syi?z#&{kgpbBc+_c?jI|672luD&YyZTP_FaA1aoi^=B2><{907*qoM6N<$ Ef=yJ_a{vGU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/cryogenics.rsi/pod-panel.png b/Resources/Textures/Structures/Machines/cryogenics.rsi/pod-panel.png new file mode 100644 index 0000000000000000000000000000000000000000..c0f06cacbc2c8290e77a2f60aa81dc0384266e92 GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!3HF&`%2dVDb50q$YKTtz9S&aI8~cZ8YpJ=D+wCT{`X+OQ8LWm9tOtE>^D0Gb<4D>haYc#a z8t1(>vEK@ddr7GHX=MI>X`ymU4%%YawElgjs+IvlI-m=XEEQRP@N V{x?3m5DoMtgQu&X%Q~loCIIxGYE%FK literal 0 HcmV?d00001 From 9afbdf6a175b25eb764fc9b033f60889ac86d1bb Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 25 Dec 2022 06:36:54 -0500 Subject: [PATCH 30/30] Automatic changelog update --- Resources/Changelog/Changelog.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a0ff5dac44..36be802ae6 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,9 +1,4 @@ Entries: -- author: rolfero - changes: - - {message: You can no longer examine players and other mobs melee damage., type: Fix} - id: 2305 - time: '2022-09-14T17:17:24.0000000+00:00' - author: ShadowCommander changes: - {message: Added verb context menu to player lists in admin menus., type: Add} @@ -2943,3 +2938,10 @@ Entries: to the humble microwave., type: Add} id: 2804 time: '2022-12-25T01:59:52.0000000+00:00' +- author: Carbonhell + changes: + - {message: 'Medbay can now obtain cryo pods, specialized cryogenics machines used + to lower the temperature of a patient to extreme values somewhat safely to use + specific chemicals, such as cryoxadone.', type: Add} + id: 2805 + time: '2022-12-25T11:35:51.0000000+00:00'