]> git.deb.at Git - rhonda/impostor.git/commitdiff
Source generate map data and enums (#548)
authorjs6pak <me@6pak.dev>
Sat, 16 Dec 2023 22:36:02 +0000 (23:36 +0100)
committerGitHub <noreply@github.com>
Sat, 16 Dec 2023 22:36:02 +0000 (23:36 +0100)
116 files changed:
Dockerfile
src/Impostor.Api.Innersloth.Generator/Extensions.cs [new file with mode: 0644]
src/Impostor.Api.Innersloth.Generator/Generators/BaseGenerator.cs [new file with mode: 0644]
src/Impostor.Api.Innersloth.Generator/Generators/EnumGenerator.cs [new file with mode: 0644]
src/Impostor.Api.Innersloth.Generator/Generators/MapDataGenerator.cs [new file with mode: 0644]
src/Impostor.Api.Innersloth.Generator/Impostor.Api.Innersloth.Generator.csproj [new file with mode: 0644]
src/Impostor.Api.Innersloth.Generator/Properties/launchSettings.json [new file with mode: 0644]
src/Impostor.Api.Innersloth.Generator/SourceGenerator.cs [new file with mode: 0644]
src/Impostor.Api.Innersloth.Generator/Vector2Converter.cs [new file with mode: 0644]
src/Impostor.Api.Innersloth.Generator/packages.lock.json [new file with mode: 0644]
src/Impostor.Api/Events/Game/Player/IPlayerEnterVentEvent.cs
src/Impostor.Api/Events/Game/Player/IPlayerExitVentEvent.cs
src/Impostor.Api/Events/Game/Player/IPlayerVentEvent.cs
src/Impostor.Api/Impostor.Api.csproj
src/Impostor.Api/Innersloth/Customization/ColorType.cs [deleted file]
src/Impostor.Api/Innersloth/Data/SpawnableObjects.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/enums/ColorType.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/enums/DisconnectReasons.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/enums/GameKeywords.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/enums/GameOverReason.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/enums/Platforms.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/enums/RoleTypes.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/enums/RpcCalls.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/enums/StringNames.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/enums/SupportedLangs.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/enums/SystemTypes.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/enums/TaskTypes.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/info.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Airship/doors.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Airship/spawn.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Airship/systems.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Airship/tasks.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Airship/vents.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/April/doors.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/April/spawn.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/April/systems.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/April/tasks.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/April/vents.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Fungle/doors.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Fungle/spawn.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Fungle/systems.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Fungle/tasks.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Fungle/vents.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Mira/doors.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Mira/spawn.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Mira/systems.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Mira/tasks.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Mira/vents.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Polus/doors.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Polus/spawn.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Polus/systems.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Polus/tasks.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Polus/vents.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Skeld/doors.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Skeld/spawn.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Skeld/systems.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Skeld/tasks.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/Data/maps/Skeld/vents.json [new file with mode: 0644]
src/Impostor.Api/Innersloth/DisconnectReason.cs [deleted file]
src/Impostor.Api/Innersloth/GameKeywords.cs [deleted file]
src/Impostor.Api/Innersloth/GameOverReason.cs [deleted file]
src/Impostor.Api/Innersloth/ITask.cs [deleted file]
src/Impostor.Api/Innersloth/IVent.cs [deleted file]
src/Impostor.Api/Innersloth/Language.cs [deleted file]
src/Impostor.Api/Innersloth/MapFlags.cs
src/Impostor.Api/Innersloth/MapTypes.cs
src/Impostor.Api/Innersloth/Maps/AirshipData.cs [deleted file]
src/Impostor.Api/Innersloth/Maps/DoorData.cs [new file with mode: 0644]
src/Impostor.Api/Innersloth/Maps/IMapData.cs [deleted file]
src/Impostor.Api/Innersloth/Maps/MapData.cs [new file with mode: 0644]
src/Impostor.Api/Innersloth/Maps/MiraData.cs [deleted file]
src/Impostor.Api/Innersloth/Maps/PolusData.cs [deleted file]
src/Impostor.Api/Innersloth/Maps/SkeldData.cs [deleted file]
src/Impostor.Api/Innersloth/Maps/TaskData.cs [new file with mode: 0644]
src/Impostor.Api/Innersloth/Maps/Tasks/AirshipTask.cs [deleted file]
src/Impostor.Api/Innersloth/Maps/Tasks/MiraTask.cs [deleted file]
src/Impostor.Api/Innersloth/Maps/Tasks/PolusTask.cs [deleted file]
src/Impostor.Api/Innersloth/Maps/Tasks/SkeldTask.cs [deleted file]
src/Impostor.Api/Innersloth/Maps/VentData.cs [new file with mode: 0644]
src/Impostor.Api/Innersloth/Maps/Vents/AirshipVent.cs [deleted file]
src/Impostor.Api/Innersloth/Maps/Vents/MiraVent.cs [deleted file]
src/Impostor.Api/Innersloth/Maps/Vents/PolusVent.cs [deleted file]
src/Impostor.Api/Innersloth/Maps/Vents/SkeldVent.cs [deleted file]
src/Impostor.Api/Innersloth/Platforms.cs [deleted file]
src/Impostor.Api/Innersloth/RoleTypes.cs [deleted file]
src/Impostor.Api/Innersloth/SystemTypes.cs [deleted file]
src/Impostor.Api/Innersloth/TaskTypes.cs [deleted file]
src/Impostor.Api/Net/Inner/Objects/ITaskInfo.cs
src/Impostor.Api/Net/Inner/RpcCalls.cs [deleted file]
src/Impostor.Api/Net/Messages/Rpcs/Rpc38SetLevel.cs [new file with mode: 0644]
src/Impostor.Api/Net/Messages/Rpcs/Rpc39SetHat.cs [deleted file]
src/Impostor.Api/Net/Messages/Rpcs/Rpc39SetHatStr.cs [new file with mode: 0644]
src/Impostor.Api/Net/Messages/Rpcs/Rpc40SetSkin.cs [deleted file]
src/Impostor.Api/Net/Messages/Rpcs/Rpc40SetSkinStr.cs [new file with mode: 0644]
src/Impostor.Api/Net/Messages/Rpcs/Rpc41SetPet.cs [deleted file]
src/Impostor.Api/Net/Messages/Rpcs/Rpc41SetPetStr.cs [new file with mode: 0644]
src/Impostor.Api/Net/Messages/Rpcs/Rpc42SetVisorStr.cs [new file with mode: 0644]
src/Impostor.Api/Net/Messages/Rpcs/Rpc43SetNamePlateStr.cs [new file with mode: 0644]
src/Impostor.Plugins.Example/Handlers/GameEventListener.cs
src/Impostor.Plugins.Example/Handlers/PlayerEventListener.cs
src/Impostor.Server/Events/Game/Player/PlayerEnterVentEvent.cs
src/Impostor.Server/Events/Game/Player/PlayerExitVentEvent.cs
src/Impostor.Server/Events/Game/Player/PlayerVentEvent.cs
src/Impostor.Server/Net/Client.cs
src/Impostor.Server/Net/Inner/Objects/InnerGameData.TaskInfo.cs
src/Impostor.Server/Net/Inner/Objects/InnerMeetingHud.cs
src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.Api.cs
src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs
src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerAirshipStatus.cs
src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerFungleShipStatus.cs [new file with mode: 0644]
src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerMiraShipStatus.cs
src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerPolusShipStatus.cs
src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerShipStatus.cs
src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerSkeldShipStatus.cs
src/Impostor.Server/Net/State/Game.Data.cs
src/Impostor.sln

index e9c388613eaed1a6b95d1c4fbf2fa8c2b1c9c340..7490b1c85cbb5436407cb0d3ea578e9f846a8247 100644 (file)
@@ -10,6 +10,7 @@ WORKDIR /source
 
 # Copy csproj and restore.
 COPY src/Impostor.Server/Impostor.Server.csproj ./src/Impostor.Server/Impostor.Server.csproj
+COPY src/Impostor.Api.Innersloth.Generator/Impostor.Api.Innersloth.Generator.csproj ./src/Impostor.Api.Innersloth.Generator/Impostor.Api.Innersloth.Generator.csproj
 COPY src/Impostor.Api/Impostor.Api.csproj ./src/Impostor.Api/Impostor.Api.csproj
 COPY src/Directory.Build.props ./src/Directory.Build.props
 
@@ -20,6 +21,7 @@ RUN case "$TARGETARCH" in \
     *) echo "unsupported architecture"; exit 1 ;; \
   esac && \
   dotnet restore -r "$NETCORE_PLATFORM" ./src/Impostor.Server/Impostor.Server.csproj && \
+  dotnet restore -r "$NETCORE_PLATFORM" ./src/Impostor.Api.Innersloth.Generator/Impostor.Api.Innersloth.Generator.csproj && \
   dotnet restore -r "$NETCORE_PLATFORM" ./src/Impostor.Api/Impostor.Api.csproj
 
 # Copy everything else.
diff --git a/src/Impostor.Api.Innersloth.Generator/Extensions.cs b/src/Impostor.Api.Innersloth.Generator/Extensions.cs
new file mode 100644 (file)
index 0000000..942d5cc
--- /dev/null
@@ -0,0 +1,30 @@
+using System.Diagnostics.CodeAnalysis;
+using System.Globalization;
+using System.Numerics;
+
+namespace Impostor.Api.Innersloth.Generator;
+
+internal static class Extensions
+{
+    public static string NormalizePath(this string path)
+    {
+        return path.Replace("\\", "/");
+    }
+
+    public static bool TryTrimStart(this string text, string value, [NotNullWhen(true)] out string? result)
+    {
+        if (text.StartsWith(value))
+        {
+            result = text[value.Length..];
+            return true;
+        }
+
+        result = null;
+        return false;
+    }
+
+    public static string ToCSharpString(this Vector2 value)
+    {
+        return $"new Vector2({value.X.ToString(CultureInfo.InvariantCulture)}f, {value.Y.ToString(CultureInfo.InvariantCulture)}f)";
+    }
+}
diff --git a/src/Impostor.Api.Innersloth.Generator/Generators/BaseGenerator.cs b/src/Impostor.Api.Innersloth.Generator/Generators/BaseGenerator.cs
new file mode 100644 (file)
index 0000000..1582ddb
--- /dev/null
@@ -0,0 +1,22 @@
+using System.Collections.Immutable;
+using System.Linq;
+using Microsoft.CodeAnalysis;
+
+namespace Impostor.Api.Innersloth.Generator.Generators;
+
+public abstract class BaseGenerator
+{
+    protected SourceProductionContext _sourceProductionContext;
+    protected ImmutableArray<(string RelativePath, string Content)> _files;
+
+    protected BaseGenerator(SourceProductionContext sourceProductionContext, ImmutableArray<(string RelativePath, string Content)> files)
+    {
+        _sourceProductionContext = sourceProductionContext;
+        _files = files;
+    }
+
+    protected string GetFileContent(string path)
+    {
+        return _files.Single(x => x.RelativePath == path).Content;
+    }
+}
diff --git a/src/Impostor.Api.Innersloth.Generator/Generators/EnumGenerator.cs b/src/Impostor.Api.Innersloth.Generator/Generators/EnumGenerator.cs
new file mode 100644 (file)
index 0000000..aa5bbf2
--- /dev/null
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Text.Json;
+using CSharpPoet;
+using Microsoft.CodeAnalysis;
+
+namespace Impostor.Api.Innersloth.Generator.Generators;
+
+public sealed class EnumGenerator : BaseGenerator
+{
+    public EnumGenerator(SourceProductionContext sourceProductionContext, ImmutableArray<(string RelativePath, string Content)> files) : base(sourceProductionContext, files)
+    {
+    }
+
+    public void Generate(string name, string? @namespace = null, string? sourceName = null, bool flags = false, CSharpEnumUnderlyingType underlyingType = CSharpEnumUnderlyingType.Int)
+    {
+        var dictionary = JsonSerializer.Deserialize<Dictionary<string, long>>(GetFileContent($"enums/{sourceName ?? name}.json"))!;
+
+        var @enum = new CSharpEnum(name, underlyingType);
+
+        foreach (var pair in dictionary)
+        {
+            var value = flags && pair.Value > 0
+                ? $"1 << {Math.Log(pair.Value, 2)}"
+                : pair.Value.ToString();
+
+            @enum.Members.Add(new CSharpEnum.Member(pair.Key, value));
+        }
+
+        if (flags)
+        {
+            @enum.Attributes.Add(new CSharpAttribute("System.FlagsAttribute"));
+        }
+
+        var source = new CSharpFile(@namespace ?? "Impostor.Api.Innersloth") { @enum }.ToString();
+        _sourceProductionContext.AddSource(name, source);
+    }
+}
diff --git a/src/Impostor.Api.Innersloth.Generator/Generators/MapDataGenerator.cs b/src/Impostor.Api.Innersloth.Generator/Generators/MapDataGenerator.cs
new file mode 100644 (file)
index 0000000..b13144a
--- /dev/null
@@ -0,0 +1,210 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Globalization;
+using System.Numerics;
+using System.Text.Json;
+using CSharpPoet;
+using Microsoft.CodeAnalysis;
+
+namespace Impostor.Api.Innersloth.Generator.Generators;
+
+public sealed class MapDataGenerator : BaseGenerator
+{
+    public MapDataGenerator(SourceProductionContext sourceProductionContext, ImmutableArray<(string RelativePath, string Content)> files) : base(sourceProductionContext, files)
+    {
+    }
+
+    private T? Deserialize<T>(string name, string fileName)
+    {
+        return JsonSerializer.Deserialize<T>(
+            GetFileContent($"maps/{name}/{fileName}.json"),
+            new JsonSerializerOptions
+            {
+                PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
+                Converters =
+                {
+                    new Vector2Converter(),
+                },
+            }
+        );
+    }
+
+    public void Generate(string name)
+    {
+        var className = name + "Data";
+
+        var spawnInfo = Deserialize<SpawnInfo>(name, "spawn")!;
+        var tasks = Deserialize<Dictionary<int, TaskInfo>>(name, "tasks")!;
+        var vents = Deserialize<Dictionary<int, VentInfo>>(name, "vents")!;
+        var doors = Deserialize<Dictionary<int, DoorInfo>>(name, "doors")!;
+
+        var ventsData = new DictionaryData("VentData", "Vents", writer =>
+        {
+            foreach (var pair in vents)
+            {
+                var id = pair.Key;
+                var vent = pair.Value;
+
+                var connections = "";
+                if (vent.Left != null) connections += ", left: " + vent.Left.Value;
+                if (vent.Center != null) connections += ", center: " + vent.Center.Value;
+                if (vent.Right != null) connections += ", right: " + vent.Right.Value;
+
+                writer.WriteLine($"[{id}] = new(this, {id}, \"{vent.Name}\", {vent.Position.ToCSharpString()}{connections}),");
+            }
+        });
+
+        var tasksData = new DictionaryData("TaskData", "Tasks", writer =>
+        {
+            foreach (var pair in tasks)
+            {
+                var id = pair.Key;
+                var task = pair.Value;
+
+                writer.WriteLine($"[{id}] = new({id}, TaskTypes.{task.TaskType}, TaskCategories.{task.Length}Task),");
+            }
+        });
+
+        var doorsData = new DictionaryData("DoorData", "Doors", writer =>
+        {
+            foreach (var pair in doors)
+            {
+                var id = pair.Key;
+                var door = pair.Value;
+
+                writer.WriteLine($"[{id}] = new({id}, SystemTypes.{door.Room}, {door.Position.ToCSharpString()}),");
+            }
+        });
+
+        var constructor = new CSharpMethod(Visibility.Internal, className, ".ctor")
+        {
+            Body = writer =>
+            {
+                ventsData.WriteInitializer(writer);
+                writer.WriteLine();
+                tasksData.WriteInitializer(writer);
+                writer.WriteLine();
+                doorsData.WriteInitializer(writer);
+            },
+        };
+
+        var @class = new CSharpClass(className)
+        {
+            IsSealed = true,
+            Extends = { "MapData" },
+            Members =
+            {
+                constructor,
+
+                ventsData.CreateProperty(),
+                tasksData.CreateProperty(),
+                doorsData.CreateProperty(),
+
+                new CSharpBlankLine(),
+
+                CreateSimpleProperty("float", "SpawnRadius", spawnInfo.SpawnRadius.ToString(CultureInfo.InvariantCulture) + "f"),
+                CreateSimpleProperty("Vector2", "InitialSpawnCenter", spawnInfo.InitialSpawnCenter.ToCSharpString()),
+                CreateSimpleProperty("Vector2", "MeetingSpawnCenter", spawnInfo.MeetingSpawnCenter.ToCSharpString()),
+                CreateSimpleProperty("Vector2", "MeetingSpawnCenter2", spawnInfo.MeetingSpawnCenter2.ToCSharpString()),
+            },
+        };
+
+        var source = new CSharpFile("Impostor.Api.Innersloth.Maps")
+        {
+            Usings = { "System.Collections.Generic", "System.Numerics" },
+            Members = { @class },
+        }.ToString();
+        _sourceProductionContext.AddSource(className, source);
+    }
+
+    private static CSharpProperty CreateSimpleProperty(string type, string name, string value)
+    {
+        return new CSharpProperty(type, name)
+        {
+            Getter = new CSharpProperty.Accessor { Body = writer => writer.Write(value + ";") },
+            IsOverride = true,
+        };
+    }
+
+    private sealed class DictionaryData
+    {
+        private readonly string _keyType;
+        private readonly string _valueType;
+        private readonly string _name;
+        private readonly Action<CodeWriter> _body;
+
+        public DictionaryData(string keyType, string valueType, string name, Action<CodeWriter> body)
+        {
+            _keyType = keyType;
+            _valueType = valueType;
+            _name = name;
+            _body = body;
+        }
+
+        public DictionaryData(string valueType, string name, Action<CodeWriter> body) : this("int", valueType, name, body)
+        {
+        }
+
+        public void WriteInitializer(CodeWriter writer)
+        {
+            writer.WriteLine($"{_name} = new Dictionary<{_keyType}, {_valueType}>");
+            writer.WriteLine("{");
+
+            using (writer.Indent())
+            {
+                _body(writer);
+            }
+
+            writer.WriteLine("}.AsReadOnly();");
+        }
+
+        public CSharpProperty CreateProperty()
+        {
+            return new CSharpProperty($"IReadOnlyDictionary<{_keyType}, {_valueType}>", _name)
+            {
+                Getter = new CSharpProperty.Accessor(),
+                IsOverride = true,
+            };
+        }
+    }
+
+    public sealed class SpawnInfo
+    {
+        public required Vector2 InitialSpawnCenter { get; init; }
+        public required Vector2 MeetingSpawnCenter { get; init; }
+        public required Vector2 MeetingSpawnCenter2 { get; init; }
+        public required float SpawnRadius { get; init; }
+    }
+
+    public sealed class TaskInfo
+    {
+        public required string Type { get; init; }
+        public required string TaskType { get; init; }
+        public required string Length { get; init; }
+        public required TaskConsole[] Consoles { get; init; }
+    }
+
+    public sealed class TaskConsole
+    {
+        public required int Id { get; init; }
+        public required string Room { get; init; }
+        public required Vector2 Position { get; init; }
+        public required float UsableDistance { get; init; }
+    }
+
+    public sealed class VentInfo
+    {
+        public required string Name { get; init; }
+        public required Vector2 Position { get; init; }
+        public required int? Left { get; init; }
+        public required int? Center { get; init; }
+        public required int? Right { get; init; }
+    }
+
+    public sealed class DoorInfo
+    {
+        public required string Room { get; init; }
+        public required Vector2 Position { get; init; }
+    }
+}
diff --git a/src/Impostor.Api.Innersloth.Generator/Impostor.Api.Innersloth.Generator.csproj b/src/Impostor.Api.Innersloth.Generator/Impostor.Api.Innersloth.Generator.csproj
new file mode 100644 (file)
index 0000000..269c3dd
--- /dev/null
@@ -0,0 +1,38 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netstandard2.0</TargetFramework>
+    <LangVersion>latest</LangVersion>
+    <DebugType>embedded</DebugType>
+    <Nullable>enable</Nullable>
+    <EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
+    <IsRoslynComponent>true</IsRoslynComponent>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.7.0" PrivateAssets="all" />
+    <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" PrivateAssets="all" />
+    <PackageReference Include="PolySharp" Version="1.14.0" PrivateAssets="all" />
+
+    <PackageReference Include="System.Text.Json" Version="8.0.0" PrivateAssets="all" GeneratePathProperty="true" />
+    <PackageReference Include="System.Text.Encodings.Web" Version="8.0.0" PrivateAssets="all" GeneratePathProperty="true" />
+    <PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="8.0.0" PrivateAssets="all" GeneratePathProperty="true" />
+
+    <PackageReference Include="CSharpPoet" Version="0.3.0" PrivateAssets="all" GeneratePathProperty="true" />
+  </ItemGroup>
+
+  <PropertyGroup>
+    <GetTargetPathDependsOn>$(GetTargetPathDependsOn);GetDependencyTargetPaths</GetTargetPathDependsOn>
+  </PropertyGroup>
+
+  <Target Name="GetDependencyTargetPaths">
+    <ItemGroup>
+      <TargetPathWithTargetPlatformMoniker Include="$(PkgSystem_Text_Json)\lib\netstandard2.0\*.dll" IncludeRuntimeDependency="false" />
+      <TargetPathWithTargetPlatformMoniker Include="$(PkgSystem_Text_Encodings_Web)\lib\netstandard2.0\*.dll" IncludeRuntimeDependency="false" />
+      <TargetPathWithTargetPlatformMoniker Include="$(PKGMicrosoft_Bcl_AsyncInterfaces)\lib\netstandard2.0\*.dll" IncludeRuntimeDependency="false" />
+
+      <TargetPathWithTargetPlatformMoniker Include="$(PkgCSharpPoet)\lib\netstandard2.0\*.dll" IncludeRuntimeDependency="false" />
+    </ItemGroup>
+  </Target>
+
+</Project>
diff --git a/src/Impostor.Api.Innersloth.Generator/Properties/launchSettings.json b/src/Impostor.Api.Innersloth.Generator/Properties/launchSettings.json
new file mode 100644 (file)
index 0000000..776975f
--- /dev/null
@@ -0,0 +1,9 @@
+{
+  "$schema": "https://json.schemastore.org/launchsettings.json",
+  "profiles": {
+    "Generator": {
+      "commandName": "DebugRoslynComponent",
+      "targetProject": "../Impostor.Api/Impostor.Api.csproj"
+    }
+  }
+}
diff --git a/src/Impostor.Api.Innersloth.Generator/SourceGenerator.cs b/src/Impostor.Api.Innersloth.Generator/SourceGenerator.cs
new file mode 100644 (file)
index 0000000..bf7f005
--- /dev/null
@@ -0,0 +1,98 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+using CSharpPoet;
+using Impostor.Api.Innersloth.Generator.Generators;
+using Microsoft.CodeAnalysis;
+
+namespace Impostor.Api.Innersloth.Generator;
+
+[Generator(LanguageNames.CSharp)]
+public sealed class SourceGenerator : IIncrementalGenerator
+{
+    private const string DataPath = "Innersloth/Data/";
+
+    private readonly record struct Options(string ProjectDirectory)
+    {
+        public bool TryGetRelativePath(string path, [NotNullWhen(true)] out string? relativePath)
+        {
+            if (
+                path.NormalizePath().TryTrimStart(ProjectDirectory, out relativePath) &&
+                relativePath.TryTrimStart(DataPath, out relativePath)
+            )
+            {
+                return true;
+            }
+
+            relativePath = null;
+            return false;
+        }
+    }
+
+    public void Initialize(IncrementalGeneratorInitializationContext context)
+    {
+        var optionsProvider = context.AnalyzerConfigOptionsProvider
+            .Select((analyzerConfigOptions, _) =>
+            {
+                if (!analyzerConfigOptions.GlobalOptions.TryGetValue("build_property.projectdir", out var projectDirectory))
+                {
+                    throw new Exception("Couldn't get project directory");
+                }
+
+                return new Options(projectDirectory.NormalizePath());
+            });
+
+        var filesProvider = context.AdditionalTextsProvider.Combine(optionsProvider)
+            .Where(static pair =>
+            {
+                var (file, options) = pair;
+                return options.TryGetRelativePath(file.Path, out var relativePath) && relativePath.EndsWith(".json");
+            })
+            .Select(static (pair, cancellationToken) =>
+            {
+                var (file, options) = pair;
+
+                if (!options.TryGetRelativePath(file.Path, out var relativePath))
+                {
+                    throw new InvalidOperationException();
+                }
+
+                return (
+                    RelativePath: relativePath,
+                    Content: file.GetText(cancellationToken)!.ToString()
+                );
+            })
+            .Collect();
+
+        context.RegisterSourceOutput(filesProvider, (spc, files) =>
+        {
+            if (files.IsEmpty)
+            {
+                throw new InvalidOperationException($"No json files found in Impostor.Api/{DataPath}");
+            }
+
+            var enumGenerator = new EnumGenerator(spc, files);
+
+            enumGenerator.Generate("ColorType", "Impostor.Api.Innersloth.Customization");
+
+            enumGenerator.Generate("DisconnectReason", sourceName: "DisconnectReasons");
+            enumGenerator.Generate("GameKeywords", flags: true, underlyingType: CSharpEnumUnderlyingType.UnsignedInt);
+            enumGenerator.Generate("GameOverReason", underlyingType: CSharpEnumUnderlyingType.Byte);
+            enumGenerator.Generate("Platforms");
+            enumGenerator.Generate("RoleTypes", underlyingType: CSharpEnumUnderlyingType.UnsignedShort);
+            enumGenerator.Generate("StringNames");
+            enumGenerator.Generate("SystemTypes", underlyingType: CSharpEnumUnderlyingType.Byte);
+            enumGenerator.Generate("Language", sourceName: "SupportedLangs");
+            enumGenerator.Generate("TaskTypes");
+
+            enumGenerator.Generate("RpcCalls", "Impostor.Api.Net.Inner", underlyingType: CSharpEnumUnderlyingType.Byte);
+
+            var mapDataGenerator = new MapDataGenerator(spc, files);
+
+            var mapNames = new[] { "Skeld", "Mira", "April", "Polus", "Airship", "Fungle" };
+            foreach (var mapName in mapNames)
+            {
+                mapDataGenerator.Generate(mapName);
+            }
+        });
+    }
+}
diff --git a/src/Impostor.Api.Innersloth.Generator/Vector2Converter.cs b/src/Impostor.Api.Innersloth.Generator/Vector2Converter.cs
new file mode 100644 (file)
index 0000000..7eeb1cc
--- /dev/null
@@ -0,0 +1,42 @@
+using System;
+using System.Numerics;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace Impostor.Api.Innersloth.Generator;
+
+public class Vector2Converter : JsonConverter<Vector2>
+{
+    public override Vector2 Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+    {
+        if (reader.TokenType != JsonTokenType.StartObject) throw new JsonException();
+
+        float x = 0;
+        float y = 0;
+
+        while (reader.Read())
+        {
+            if (reader.TokenType == JsonTokenType.EndObject) break;
+
+            switch (reader.GetString())
+            {
+                case "x":
+                    reader.Read();
+                    x = reader.GetSingle();
+                    break;
+
+                case "y":
+                    reader.Read();
+                    y = reader.GetSingle();
+                    break;
+            }
+        }
+
+        return new Vector2(x, y);
+    }
+
+    public override void Write(Utf8JsonWriter writer, Vector2 value, JsonSerializerOptions options)
+    {
+        throw new NotSupportedException();
+    }
+}
diff --git a/src/Impostor.Api.Innersloth.Generator/packages.lock.json b/src/Impostor.Api.Innersloth.Generator/packages.lock.json
new file mode 100644 (file)
index 0000000..3a890d8
--- /dev/null
@@ -0,0 +1,156 @@
+{
+  "version": 1,
+  "dependencies": {
+    ".NETStandard,Version=v2.0": {
+      "CSharpPoet": {
+        "type": "Direct",
+        "requested": "[0.3.0, )",
+        "resolved": "0.3.0",
+        "contentHash": "3QDh9rMuiNhMtNWOLj0FItiZruON7lj3zD0CXC9IHq4JWpF5OjbaZ2s1X0u6gftE73KCoTezXIgKvxacps78Fw=="
+      },
+      "Microsoft.Bcl.AsyncInterfaces": {
+        "type": "Direct",
+        "requested": "[8.0.0, )",
+        "resolved": "8.0.0",
+        "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==",
+        "dependencies": {
+          "System.Threading.Tasks.Extensions": "4.5.4"
+        }
+      },
+      "Microsoft.CodeAnalysis.Analyzers": {
+        "type": "Direct",
+        "requested": "[3.3.4, )",
+        "resolved": "3.3.4",
+        "contentHash": "AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g=="
+      },
+      "Microsoft.CodeAnalysis.CSharp": {
+        "type": "Direct",
+        "requested": "[4.7.0, )",
+        "resolved": "4.7.0",
+        "contentHash": "JHCP2L6lB0oJ3tQoHkC67SFZxW+KbJVOnAo+6L01K5r/NlBlSUhTk5nUAldWhTVwGdzqNeHqGtnEqpsCmGSwQA==",
+        "dependencies": {
+          "Microsoft.CodeAnalysis.Common": "[4.7.0]"
+        }
+      },
+      "NETStandard.Library": {
+        "type": "Direct",
+        "requested": "[2.0.3, )",
+        "resolved": "2.0.3",
+        "contentHash": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==",
+        "dependencies": {
+          "Microsoft.NETCore.Platforms": "1.1.0"
+        }
+      },
+      "PolySharp": {
+        "type": "Direct",
+        "requested": "[1.14.0, )",
+        "resolved": "1.14.0",
+        "contentHash": "3K6beiIeVO0hOlHCHv2jgGW7UH3OXsOIiEW60CHpqGvbrHyy4iQfGkCOBtI92PDCaA8XC4ZM3+02g2qenRnHOA=="
+      },
+      "System.Text.Encodings.Web": {
+        "type": "Direct",
+        "requested": "[8.0.0, )",
+        "resolved": "8.0.0",
+        "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==",
+        "dependencies": {
+          "System.Buffers": "4.5.1",
+          "System.Memory": "4.5.5",
+          "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+        }
+      },
+      "System.Text.Json": {
+        "type": "Direct",
+        "requested": "[8.0.0, )",
+        "resolved": "8.0.0",
+        "contentHash": "OdrZO2WjkiEG6ajEFRABTRCi/wuXQPxeV6g8xvUJqdxMvvuCCEk86zPla8UiIQJz3durtUEbNyY/3lIhS0yZvQ==",
+        "dependencies": {
+          "Microsoft.Bcl.AsyncInterfaces": "8.0.0",
+          "System.Buffers": "4.5.1",
+          "System.Memory": "4.5.5",
+          "System.Runtime.CompilerServices.Unsafe": "6.0.0",
+          "System.Text.Encodings.Web": "8.0.0",
+          "System.Threading.Tasks.Extensions": "4.5.4"
+        }
+      },
+      "Microsoft.CodeAnalysis.Common": {
+        "type": "Transitive",
+        "resolved": "4.7.0",
+        "contentHash": "pD5S14xMUebSGYe75kt0q/aaS/ftvktSo/pEv7aX7hNPHfdZS+SZeXvkvcffGxWkunYOyRF9m1oN7zzSdYj9dQ==",
+        "dependencies": {
+          "Microsoft.CodeAnalysis.Analyzers": "3.3.4",
+          "System.Collections.Immutable": "7.0.0",
+          "System.Memory": "4.5.5",
+          "System.Reflection.Metadata": "7.0.0",
+          "System.Runtime.CompilerServices.Unsafe": "6.0.0",
+          "System.Text.Encoding.CodePages": "7.0.0",
+          "System.Threading.Tasks.Extensions": "4.5.4"
+        }
+      },
+      "Microsoft.NETCore.Platforms": {
+        "type": "Transitive",
+        "resolved": "1.1.0",
+        "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A=="
+      },
+      "System.Buffers": {
+        "type": "Transitive",
+        "resolved": "4.5.1",
+        "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg=="
+      },
+      "System.Collections.Immutable": {
+        "type": "Transitive",
+        "resolved": "7.0.0",
+        "contentHash": "dQPcs0U1IKnBdRDBkrCTi1FoajSTBzLcVTpjO4MBCMC7f4pDOIPzgBoX8JjG7X6uZRJ8EBxsi8+DR1JuwjnzOQ==",
+        "dependencies": {
+          "System.Memory": "4.5.5",
+          "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+        }
+      },
+      "System.Memory": {
+        "type": "Transitive",
+        "resolved": "4.5.5",
+        "contentHash": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==",
+        "dependencies": {
+          "System.Buffers": "4.5.1",
+          "System.Numerics.Vectors": "4.4.0",
+          "System.Runtime.CompilerServices.Unsafe": "4.5.3"
+        }
+      },
+      "System.Numerics.Vectors": {
+        "type": "Transitive",
+        "resolved": "4.4.0",
+        "contentHash": "UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ=="
+      },
+      "System.Reflection.Metadata": {
+        "type": "Transitive",
+        "resolved": "7.0.0",
+        "contentHash": "MclTG61lsD9sYdpNz9xsKBzjsmsfCtcMZYXz/IUr2zlhaTaABonlr1ESeompTgM+Xk+IwtGYU7/voh3YWB/fWw==",
+        "dependencies": {
+          "System.Collections.Immutable": "7.0.0",
+          "System.Memory": "4.5.5"
+        }
+      },
+      "System.Runtime.CompilerServices.Unsafe": {
+        "type": "Transitive",
+        "resolved": "6.0.0",
+        "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg=="
+      },
+      "System.Text.Encoding.CodePages": {
+        "type": "Transitive",
+        "resolved": "7.0.0",
+        "contentHash": "LSyCblMpvOe0N3E+8e0skHcrIhgV2huaNcjUUEa8hRtgEAm36aGkRoC8Jxlb6Ra6GSfF29ftduPNywin8XolzQ==",
+        "dependencies": {
+          "System.Memory": "4.5.5",
+          "System.Runtime.CompilerServices.Unsafe": "6.0.0"
+        }
+      },
+      "System.Threading.Tasks.Extensions": {
+        "type": "Transitive",
+        "resolved": "4.5.4",
+        "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==",
+        "dependencies": {
+          "System.Runtime.CompilerServices.Unsafe": "4.5.3"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
index fac832b7d00e41a973922144c908d01087c51d4f..2413401591bb852ef26cd6664b277f88a564722e 100644 (file)
@@ -1,4 +1,4 @@
-using Impostor.Api.Innersloth;
+using Impostor.Api.Innersloth.Maps;
 
 namespace Impostor.Api.Events.Player
 {
@@ -10,6 +10,6 @@ namespace Impostor.Api.Events.Player
         /// <summary>
         ///     Gets the entered vent.
         /// </summary>
-        public IVent Vent { get; }
+        public VentData Vent { get; }
     }
 }
index 84dc1afcc79d4801261240b669108e9629a86ebd..65c3dce98e87f58a4fcfcfb053d1c2868e03d93d 100644 (file)
@@ -1,4 +1,4 @@
-using Impostor.Api.Innersloth;
+using Impostor.Api.Innersloth.Maps;
 
 namespace Impostor.Api.Events.Player
 {
@@ -10,6 +10,6 @@ namespace Impostor.Api.Events.Player
         /// <summary>
         ///     Gets the exited vent.
         /// </summary>
-        public IVent Vent { get; }
+        public VentData Vent { get; }
     }
 }
index 959e753423d318e1fdc7d91d8b53a3ad5b7b2150..cf60c57cba0e1c977c2b73df6024b260943921bd 100644 (file)
@@ -1,4 +1,4 @@
-using Impostor.Api.Innersloth;
+using Impostor.Api.Innersloth.Maps;
 
 namespace Impostor.Api.Events.Player
 {
@@ -10,6 +10,6 @@ namespace Impostor.Api.Events.Player
         /// <summary>
         ///     Gets the vent player moved to.
         /// </summary>
-        public IVent NewVent { get; }
+        public VentData NewVent { get; }
     }
 }
index f3a79c7f57e644dcec0416f728ca255630f2ef72..0b3ab694f6d948e92831f2d0bc5f948bf636ffc3 100644 (file)
@@ -29,6 +29,9 @@
     <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="7.0.0" />
     <PackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.435" PrivateAssets="all" />
     <PackageReference Include="Impostor.Hazel.Abstractions" Version="1.0.0" />
+
+    <ProjectReference Include="..\Impostor.Api.Innersloth.Generator\Impostor.Api.Innersloth.Generator.csproj" ReferenceOutputAssembly="false" OutputItemType="Analyzer" />
+    <AdditionalFiles Include="Innersloth/Data/**/*.json" />
   </ItemGroup>
 
 </Project>
diff --git a/src/Impostor.Api/Innersloth/Customization/ColorType.cs b/src/Impostor.Api/Innersloth/Customization/ColorType.cs
deleted file mode 100644 (file)
index 570071c..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-namespace Impostor.Api.Innersloth.Customization
-{
-    public enum ColorType
-    {
-        Red = 0,
-        Blue = 1,
-        Green = 2,
-        Pink = 3,
-        Orange = 4,
-        Yellow = 5,
-        Black = 6,
-        White = 7,
-        Purple = 8,
-        Brown = 9,
-        Cyan = 10,
-        Lime = 11,
-        Maroon = 12,
-        Rose = 13,
-        Banana = 14,
-        Gray = 15,
-        Tan = 16,
-        Coral = 17,
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/Data/SpawnableObjects.json b/src/Impostor.Api/Innersloth/Data/SpawnableObjects.json
new file mode 100644 (file)
index 0000000..f2b7f74
--- /dev/null
@@ -0,0 +1,14 @@
+{
+  "0": "SkeldShipStatus",
+  "1": "MeetingHud",
+  "2": "LobbyBehaviour",
+  "3": "GameData",
+  "4": "PlayerControl",
+  "5": "MiraShipStatus",
+  "6": "PolusShipStatus",
+  "7": "ShipStatus",
+  "8": "AirshipStatus",
+  "9": "HideAndSeekManager",
+  "10": "NormalGameManager",
+  "13": "FungleShipStatus"
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/enums/ColorType.json b/src/Impostor.Api/Innersloth/Data/enums/ColorType.json
new file mode 100644 (file)
index 0000000..ca4f7f4
--- /dev/null
@@ -0,0 +1,20 @@
+{
+  "Red": 0,
+  "Blue": 1,
+  "Green": 2,
+  "Pink": 3,
+  "Orange": 4,
+  "Yellow": 5,
+  "Black": 6,
+  "White": 7,
+  "Purple": 8,
+  "Brown": 9,
+  "Cyan": 10,
+  "Lime": 11,
+  "Maroon": 12,
+  "Rose": 13,
+  "Banana": 14,
+  "Gray": 15,
+  "Tan": 16,
+  "Coral": 17
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/enums/DisconnectReasons.json b/src/Impostor.Api/Innersloth/Data/enums/DisconnectReasons.json
new file mode 100644 (file)
index 0000000..fd9f2e3
--- /dev/null
@@ -0,0 +1,46 @@
+{
+  "ExitGame": 0,
+  "GameFull": 1,
+  "GameStarted": 2,
+  "GameNotFound": 3,
+  "IncorrectVersion": 5,
+  "Banned": 6,
+  "Kicked": 7,
+  "Custom": 8,
+  "InvalidName": 9,
+  "Hacking": 10,
+  "NotAuthorized": 11,
+  "ConnectionLimit": 12,
+  "Destroy": 16,
+  "Error": 17,
+  "IncorrectGame": 18,
+  "ServerRequest": 19,
+  "ServerFull": 20,
+  "InternalPlayerMissing": 100,
+  "InternalNonceFailure": 101,
+  "InternalConnectionToken": 102,
+  "PlatformLock": 103,
+  "LobbyInactivity": 104,
+  "MatchmakerInactivity": 105,
+  "InvalidGameOptions": 106,
+  "NoServersAvailable": 107,
+  "QuickmatchDisabled": 108,
+  "TooManyGames": 109,
+  "QuickchatLock": 110,
+  "MatchmakerFull": 111,
+  "Sanctions": 112,
+  "ServerError": 113,
+  "SelfPlatformLock": 114,
+  "DuplicateConnectionDetected": 115,
+  "TooManyRequests": 116,
+  "FocusLostBackground": 207,
+  "IntentionalLeaving": 208,
+  "FocusLost": 209,
+  "NewConnection": 210,
+  "PlatformParentalControlsBlock": 211,
+  "PlatformUserBlock": 212,
+  "PlatformFailedToGetUserBlock": 213,
+  "ServerNotFound": 214,
+  "ClientTimeout": 215,
+  "Unknown": 255
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/enums/GameKeywords.json b/src/Impostor.Api/Innersloth/Data/enums/GameKeywords.json
new file mode 100644 (file)
index 0000000..767b75a
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "All": 0,
+  "Other": 1,
+  "SpanishLA": 2,
+  "Korean": 4,
+  "Russian": 8,
+  "Portuguese": 16,
+  "Arabic": 32,
+  "Filipino": 64,
+  "Polish": 128,
+  "English": 256,
+  "Japanese": 512,
+  "SpanishEU": 1024,
+  "Brazilian": 2048,
+  "Dutch": 4096,
+  "French": 8192,
+  "German": 16384,
+  "Italian": 32768,
+  "SChinese": 65536,
+  "TChinese": 131072,
+  "Irish": 262144
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/enums/GameOverReason.json b/src/Impostor.Api/Innersloth/Data/enums/GameOverReason.json
new file mode 100644 (file)
index 0000000..e0fbc2a
--- /dev/null
@@ -0,0 +1,11 @@
+{
+  "HumansByVote": 0,
+  "HumansByTask": 1,
+  "ImpostorByVote": 2,
+  "ImpostorByKill": 3,
+  "ImpostorBySabotage": 4,
+  "ImpostorDisconnect": 5,
+  "HumansDisconnect": 6,
+  "HideAndSeek_ByTimer": 7,
+  "HideAndSeek_ByKills": 8
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/enums/Platforms.json b/src/Impostor.Api/Innersloth/Data/enums/Platforms.json
new file mode 100644 (file)
index 0000000..08f0bcc
--- /dev/null
@@ -0,0 +1,13 @@
+{
+  "Unknown": 0,
+  "StandaloneEpicPC": 1,
+  "StandaloneSteamPC": 2,
+  "StandaloneMac": 3,
+  "StandaloneWin10": 4,
+  "StandaloneItch": 5,
+  "IPhone": 6,
+  "Android": 7,
+  "Switch": 8,
+  "Xbox": 9,
+  "Playstation": 10
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/enums/RoleTypes.json b/src/Impostor.Api/Innersloth/Data/enums/RoleTypes.json
new file mode 100644 (file)
index 0000000..c29784f
--- /dev/null
@@ -0,0 +1,10 @@
+{
+  "Crewmate": 0,
+  "Impostor": 1,
+  "Scientist": 2,
+  "Engineer": 3,
+  "GuardianAngel": 4,
+  "Shapeshifter": 5,
+  "CrewmateGhost": 6,
+  "ImpostorGhost": 7
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/enums/RpcCalls.json b/src/Impostor.Api/Innersloth/Data/enums/RpcCalls.json
new file mode 100644 (file)
index 0000000..eabc4fa
--- /dev/null
@@ -0,0 +1,59 @@
+{
+  "PlayAnimation": 0,
+  "CompleteTask": 1,
+  "SyncSettings": 2,
+  "SetInfected": 3,
+  "Exiled": 4,
+  "CheckName": 5,
+  "SetName": 6,
+  "CheckColor": 7,
+  "SetColor": 8,
+  "SetHat": 9,
+  "SetSkin": 10,
+  "ReportDeadBody": 11,
+  "MurderPlayer": 12,
+  "SendChat": 13,
+  "StartMeeting": 14,
+  "SetScanner": 15,
+  "SendChatNote": 16,
+  "SetPet": 17,
+  "SetStartCounter": 18,
+  "EnterVent": 19,
+  "ExitVent": 20,
+  "SnapTo": 21,
+  "CloseMeeting": 22,
+  "VotingComplete": 23,
+  "CastVote": 24,
+  "ClearVote": 25,
+  "AddVote": 26,
+  "CloseDoorsOfType": 27,
+  "SetTasks": 29,
+  "ClimbLadder": 31,
+  "UsePlatform": 32,
+  "SendQuickChat": 33,
+  "BootFromVent": 34,
+  "UpdateSystem": 35,
+  "SetVisor": 36,
+  "SetNamePlate": 37,
+  "SetLevel": 38,
+  "SetHatStr": 39,
+  "SetSkinStr": 40,
+  "SetPetStr": 41,
+  "SetVisorStr": 42,
+  "SetNamePlateStr": 43,
+  "SetRole": 44,
+  "ProtectPlayer": 45,
+  "Shapeshift": 46,
+  "CheckMurder": 47,
+  "CheckProtect": 48,
+  "Pet": 49,
+  "CancelPet": 50,
+  "CheckZipline": 51,
+  "UseZipline": 52,
+  "TriggerSpores": 53,
+  "CheckSpore": 54,
+  "CheckShapeshift": 55,
+  "RejectShapeshift": 56,
+  "LobbyTimeExpiring": 60,
+  "ExtendLobbyTimer": 61
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/enums/StringNames.json b/src/Impostor.Api/Innersloth/Data/enums/StringNames.json
new file mode 100644 (file)
index 0000000..ead88c2
--- /dev/null
@@ -0,0 +1,1399 @@
+{
+  "None": 0,
+  "BackButton": 1,
+  "AvailableGamesLabel": 2,
+  "CreateGameButton": 3,
+  "FindGameButton": 4,
+  "EnterCode": 5,
+  "GhostIgnoreTasks": 6,
+  "GhostDoTasks": 7,
+  "GhostImpostor": 8,
+  "ImpostorTask": 9,
+  "FakeTasks": 10,
+  "TaskComplete": 11,
+  "ExileTextSP": 12,
+  "ExileTextSN": 13,
+  "ExileTextPP": 14,
+  "ExileTextPN": 15,
+  "NoExileSkip": 16,
+  "NoExileTie": 17,
+  "ImpostorsRemainS": 18,
+  "ImpostorsRemainP": 19,
+  "Hallway": 20,
+  "Storage": 21,
+  "Cafeteria": 22,
+  "Reactor": 23,
+  "UpperEngine": 24,
+  "Nav": 25,
+  "Admin": 26,
+  "Electrical": 27,
+  "LifeSupp": 28,
+  "Shields": 29,
+  "MedBay": 30,
+  "Security": 31,
+  "Weapons": 32,
+  "LowerEngine": 33,
+  "Comms": 34,
+  "Decontamination": 35,
+  "Launchpad": 36,
+  "LockerRoom": 37,
+  "Laboratory": 38,
+  "Balcony": 39,
+  "Office": 40,
+  "Greenhouse": 41,
+  "DivertPowerTo": 42,
+  "AcceptDivertedPower": 43,
+  "SubmitScan": 44,
+  "PrimeShields": 45,
+  "FuelEngines": 46,
+  "ChartCourse": 47,
+  "StartReactor": 48,
+  "SwipeCard": 49,
+  "ClearAsteroids": 50,
+  "UploadData": 51,
+  "DownloadData": 52,
+  "InspectSample": 53,
+  "EmptyChute": 54,
+  "EmptyGarbage": 55,
+  "AlignEngineOutput": 56,
+  "FixWiring": 57,
+  "CalibrateDistributor": 58,
+  "UnlockManifolds": 59,
+  "ResetReactor": 60,
+  "FixLights": 61,
+  "FixComms": 62,
+  "RestoreOxy": 63,
+  "CleanO2Filter": 64,
+  "StabilizeSteering": 65,
+  "AssembleArtifact": 66,
+  "SortSamples": 67,
+  "MeasureWeather": 68,
+  "EnterIdCode": 69,
+  "HowToPlayText1": 70,
+  "HowToPlayText2": 71,
+  "HowToPlayText5": 72,
+  "HowToPlayText6": 73,
+  "HowToPlayText7": 74,
+  "HowToPlayText81": 75,
+  "HowToPlayText82": 76,
+  "NumImpostorsS": 77,
+  "NumImpostorsP": 78,
+  "Crewmate": 79,
+  "Impostor": 80,
+  "Victory": 81,
+  "Defeat": 82,
+  "CrewmatesDisconnected": 83,
+  "ImpostorDisconnected": 84,
+  "HowToPlayText41": 85,
+  "HowToPlayText42": 86,
+  "HowToPlayText43": 87,
+  "HowToPlayText44": 88,
+  "HowToPlayTextMap": 89,
+  "HowToPlayTextCrew1": 90,
+  "HowToPlayTextCrew2": 91,
+  "HowToPlayTextCrew3": 92,
+  "HowToPlayTextCrew4": 93,
+  "HowToPlayTextCrew5": 94,
+  "HowToPlayTextCrew6": 95,
+  "HowToPlayTextImp1": 96,
+  "HowToPlayTextImp2": 97,
+  "HowToPlayTextImp3": 98,
+  "HowToPlayTextImp4": 99,
+  "HowToPlayTextImp5": 100,
+  "HowToPlayTextImp6": 101,
+  "HowToPlayTextImp7": 102,
+  "SettingsGeneral": 103,
+  "SettingsControls": 104,
+  "SettingsSound": 105,
+  "SettingsGraphics": 106,
+  "SettingsData": 107,
+  "SettingsCensorChat": 108,
+  "SettingsMusic": 109,
+  "SettingsSFX": 110,
+  "SettingsOn": 111,
+  "SettingsOff": 112,
+  "SettingsSendTelemetry": 113,
+  "SettingsControlMode": 114,
+  "SettingsTouchMode": 115,
+  "SettingsJoystickMode": 116,
+  "SettingsKeyboardMode": 117,
+  "SettingsFullscreen": 118,
+  "SettingsResolution": 119,
+  "SettingsApply": 120,
+  "SettingsPersonalizeAds": 121,
+  "SettingsLanguage": 122,
+  "SettingsJoystickSize": 123,
+  "SettingsMouseMode": 124,
+  "PlayerColor": 125,
+  "PlayerHat": 126,
+  "PlayerSkin": 127,
+  "PlayerPet": 128,
+  "GameSettings": 129,
+  "GameRecommendedSettings": 130,
+  "GameCustomSettings": 131,
+  "GameMapName": 132,
+  "GameNumImpostors": 133,
+  "GameNumMeetings": 134,
+  "GameDiscussTime": 135,
+  "GameVotingTime": 136,
+  "GamePlayerSpeed": 137,
+  "GameCrewLight": 138,
+  "GameImpostorLight": 139,
+  "GameKillCooldown": 140,
+  "GameKillDistance": 141,
+  "GameCommonTasks": 142,
+  "GameLongTasks": 143,
+  "GameShortTasks": 144,
+  "MatchMapName": 145,
+  "MatchLanguage": 146,
+  "MatchImpostors": 147,
+  "MatchMaxPlayers": 148,
+  "Cancel": 149,
+  "Confirm": 150,
+  "Limit": 151,
+  "RoomCode": 152,
+  "LeaveGame": 153,
+  "ReturnToGame": 154,
+  "LocalHelp": 155,
+  "OnlineHelp": 156,
+  "SettingsVSync": 157,
+  "EmergencyCount": 158,
+  "EmergencyNotReady": 159,
+  "EmergencyDuringCrisis": 160,
+  "EmergencyRequested": 161,
+  "GameEmergencyCooldown": 162,
+  "BuyBeverage": 163,
+  "WeatherEta": 164,
+  "WeatherComplete": 165,
+  "ProcessData": 166,
+  "RunDiagnostics": 167,
+  "WaterPlants": 168,
+  "PickAnomaly": 169,
+  "WaterPlantsGetCan": 170,
+  "AuthOfficeOkay": 171,
+  "AuthCommsOkay": 172,
+  "AuthOfficeActive": 173,
+  "AuthCommsActive": 174,
+  "AuthOfficeNotActive": 175,
+  "AuthCommsNotActive": 176,
+  "SecLogEntry": 177,
+  "EnterName": 178,
+  "SwipeCardPleaseSwipe": 179,
+  "SwipeCardBadRead": 180,
+  "SwipeCardTooFast": 181,
+  "SwipeCardTooSlow": 182,
+  "SwipeCardAccepted": 183,
+  "ReactorHoldToStop": 184,
+  "ReactorWaiting": 185,
+  "ReactorNominal": 186,
+  "MeetingWhoIsTitle": 187,
+  "MeetingVotingBegins": 188,
+  "MeetingVotingEnds": 189,
+  "MeetingVotingResults": 190,
+  "MeetingProceeds": 191,
+  "MeetingHasVoted": 192,
+  "DataPolicyTitle": 193,
+  "DataPolicyText": 194,
+  "DataPolicyWhat": 195,
+  "AdPolicyTitle": 196,
+  "AdPolicyText": 197,
+  "Accept": 198,
+  "RemoveAds": 199,
+  "SwipeCardPleaseInsert": 200,
+  "LogNorth": 201,
+  "LogSouthEast": 202,
+  "LogSouthWest": 203,
+  "SettingShort": 204,
+  "SettingMedium": 205,
+  "SettingLong": 206,
+  "SamplesPress": 207,
+  "SamplesAdding": 208,
+  "SamplesSelect": 209,
+  "SamplesThanks": 210,
+  "SamplesComplete": 211,
+  "AstDestroyed": 212,
+  "TaskTestTitle": 213,
+  "BeginDiagnostics": 214,
+  "UserLeftGame": 215,
+  "GameStarting": 216,
+  "Tasks": 217,
+  "StatsTitle": 218,
+  "StatsBodiesReported": 219,
+  "StatsEmergenciesCalled": 220,
+  "StatsTasksCompleted": 221,
+  "StatsAllTasksCompleted": 222,
+  "StatsSabotagesFixed": 223,
+  "StatsImpostorKills": 224,
+  "StatsTimesMurdered": 225,
+  "StatsTimesEjected": 226,
+  "StatsCrewmateStreak": 227,
+  "StatsGamesImpostor": 228,
+  "StatsGamesCrewmate": 229,
+  "StatsGamesStarted": 230,
+  "StatsGamesFinished": 231,
+  "StatsImpostorVoteWins": 232,
+  "StatsImpostorKillsWins": 233,
+  "StatsImpostorSabotageWins": 234,
+  "StatsCrewmateVoteWins": 235,
+  "StatsCrewmateTaskWins": 236,
+  "MedscanRequested": 237,
+  "MedscanWaitingFor": 238,
+  "MedscanCompleted": 239,
+  "MedscanCompleteIn": 240,
+  "MonitorOxygen": 241,
+  "StoreArtifacts": 242,
+  "FillCanisters": 243,
+  "FixWeatherNode": 244,
+  "InsertKeys": 245,
+  "ResetSeismic": 246,
+  "SeismicHoldToStop": 247,
+  "SeismicNominal": 248,
+  "ScanBoardingPass": 249,
+  "OpenWaterways": 250,
+  "ReplaceWaterJug": 251,
+  "RepairDrill": 252,
+  "AlignTelescope": 253,
+  "RecordTemperature": 254,
+  "RebootWifi": 255,
+  "WifiRebootRequired": 256,
+  "WifiPleasePowerOn": 257,
+  "WifiPleaseWait": 258,
+  "WifiPleaseReturnIn": 259,
+  "WifiRebootComplete": 260,
+  "Outside": 261,
+  "GameSecondsAbbrev": 262,
+  "Engines": 263,
+  "Dropship": 264,
+  "Decontamination2": 265,
+  "Specimens": 266,
+  "BoilerRoom": 267,
+  "GameOverImpostorDead": 268,
+  "GameOverImpostorKills": 269,
+  "GameOverTaskWin": 270,
+  "GameOverSabotage": 271,
+  "GameConfirmImpostor": 272,
+  "GameVisualTasks": 273,
+  "ExileTextNonConfirm": 274,
+  "GameAnonymousVotes": 275,
+  "GameTaskBarMode": 276,
+  "SettingNormalTaskMode": 277,
+  "SettingMeetingTaskMode": 278,
+  "SettingInvisibleTaskMode": 279,
+  "PlainYes": 280,
+  "PlainNo": 281,
+  "PrivacyPolicyTitle": 282,
+  "PrivacyPolicyText": 283,
+  "ManageDataButton": 284,
+  "UnderstandButton": 285,
+  "HowToPlayText2Switch": 286,
+  "ChatRateLimit": 287,
+  "TotalTasksCompleted": 288,
+  "ServerNA": 289,
+  "ServerEU": 290,
+  "ServerAS": 291,
+  "ServerSA": 292,
+  "LangEnglish": 293,
+  "LangFrench": 294,
+  "LangItalian": 295,
+  "LangGerman": 296,
+  "LangSpanish": 297,
+  "LangSpanishLATAM": 298,
+  "LangBrazPort": 299,
+  "LangPort": 300,
+  "LangRussian": 301,
+  "LangJapanese": 302,
+  "LangKorean": 303,
+  "LangDutch": 304,
+  "LangFilipino": 305,
+  "PlayerName": 306,
+  "MyTablet": 307,
+  "Download": 308,
+  "DownloadComplete": 309,
+  "DownloadTestEstTimeS": 310,
+  "DownloadTestEstTimeMS": 311,
+  "DownloadTestEstTimeHMS": 312,
+  "DownloadTestEstTimeDHMS": 313,
+  "Upload": 314,
+  "Headquarters": 315,
+  "GrabCoffee": 316,
+  "TakeBreak": 317,
+  "DontNeedWait": 318,
+  "DoSomethingElse": 319,
+  "NodeTB": 320,
+  "NodeIRO": 321,
+  "NodeGI": 322,
+  "NodePD": 323,
+  "NodeCA": 324,
+  "NodeMLG": 325,
+  "Vending": 326,
+  "OtherLanguage": 327,
+  "ImposterAmtAny": 328,
+  "VitalsORGN": 329,
+  "VitalsBLUE": 330,
+  "VitalsRED": 331,
+  "VitalsBRWN": 332,
+  "VitalsGRN": 333,
+  "VitalsPINK": 334,
+  "VitalsWHTE": 335,
+  "VitalsYLOW": 336,
+  "VitalsBLAK": 337,
+  "VitalsPURP": 338,
+  "VitalsCYAN": 339,
+  "VitalsLIME": 340,
+  "VitalsOK": 341,
+  "VitalsDEAD": 342,
+  "VitalsDC": 343,
+  "ColorOrange": 344,
+  "ColorBlue": 345,
+  "ColorRed": 346,
+  "ColorBrown": 347,
+  "ColorGreen": 348,
+  "ColorPink": 349,
+  "ColorWhite": 350,
+  "ColorYellow": 351,
+  "ColorBlack": 352,
+  "ColorPurple": 353,
+  "ColorCyan": 354,
+  "ColorLime": 355,
+  "MedID": 356,
+  "MedC": 357,
+  "MedHT": 358,
+  "MedBT": 359,
+  "MedWT": 360,
+  "MedETA": 361,
+  "MedHello": 362,
+  "PetFailFetchData": 363,
+  "BadResult": 364,
+  "More": 365,
+  "Processing": 366,
+  "ExitGame": 367,
+  "WaitingForHost": 368,
+  "LeftGameError": 369,
+  "PlayerWasBannedBy": 370,
+  "PlayerWasKickedBy": 371,
+  "CamEast": 372,
+  "CamCentral": 373,
+  "CamNortheast": 374,
+  "CamSouth": 375,
+  "CamSouthwest": 376,
+  "CamNorthwest": 377,
+  "LoadingFailed": 378,
+  "LobbySizeWarning": 379,
+  "Okay": 380,
+  "OkayDontShow": 381,
+  "Nevermind": 382,
+  "Dummy": 383,
+  "Bad": 384,
+  "Status": 385,
+  "Fine": 386,
+  "OK": 387,
+  "PetTryOn": 388,
+  "SecondsAbbv": 389,
+  "SecurityLogsSystem": 390,
+  "SecurityCamsSystem": 391,
+  "AdminMapSystem": 392,
+  "VitalsSystem": 393,
+  "BanButton": 394,
+  "KickButton": 395,
+  "ReportButton": 396,
+  "ReportConfirmation": 397,
+  "ReportBadName": 398,
+  "ReportBadChat": 399,
+  "ReportHacking": 400,
+  "ReportHarassment": 401,
+  "ReportWhy": 402,
+  "Visor": 403,
+  "NamePlate": 404,
+  "Visors": 405,
+  "NamePlates": 406,
+  "Cosmicube": 407,
+  "Cosmicubes": 408,
+  "Activate": 409,
+  "Deactivate": 410,
+  "Owned": 411,
+  "Purchase": 412,
+  "CosmicubeProgression": 413,
+  "ViewCube": 414,
+  "ConfirmPurchaseHeader": 415,
+  "ConfirmPurchaseText": 416,
+  "DeactivateCube": 417,
+  "ActivateCube": 418,
+  "Bundles": 419,
+  "Stars": 420,
+  "PurchasingLabel": 421,
+  "MouseMovement": 422,
+  "KeyboardOptions": 423,
+  "RemapBindings": 424,
+  "KeyboardBindingsHeader": 425,
+  "ExitButton": 426,
+  "PolishRuby": 500,
+  "ResetBreakers": 501,
+  "Decontaminate": 502,
+  "MakeBurger": 503,
+  "UnlockSafe": 504,
+  "SortRecords": 505,
+  "PutAwayPistols": 506,
+  "FixShower": 507,
+  "CleanToilet": 508,
+  "DressMannequin": 509,
+  "PickUpTowels": 510,
+  "RewindTapes": 511,
+  "StartFans": 512,
+  "DevelopPhotos": 513,
+  "GetBiggolSword": 514,
+  "PutAwayRifles": 515,
+  "StopCharles": 516,
+  "AuthLeftOkay": 517,
+  "AuthRightOkay": 518,
+  "AuthLeftActive": 519,
+  "AuthRightActive": 520,
+  "AuthLeftNotActive": 521,
+  "AuthRightNotActive": 522,
+  "LobbyTimerExpiringTitle": 523,
+  "LobbyTimerExpiringMsg": 524,
+  "LobbyTimerExpiringOk": 525,
+  "LobbyTimerExpiringNo": 526,
+  "LobbyTimerExpiringUnit": 527,
+  "LobbyTimerExpiringMsg2": 528,
+  "LobbyTimerExpiringHud": 529,
+  "VaultRoom": 550,
+  "Cockpit": 551,
+  "Armory": 552,
+  "Kitchen": 553,
+  "ViewingDeck": 554,
+  "HallOfPortraits": 555,
+  "Medical": 556,
+  "CargoBay": 557,
+  "Ventilation": 558,
+  "Showers": 559,
+  "Engine": 560,
+  "Brig": 561,
+  "MeetingRoom": 562,
+  "Records": 563,
+  "Lounge": 564,
+  "GapRoom": 565,
+  "MainHall": 566,
+  "RevealCode": 567,
+  "DirtyHeader": 568,
+  "ErrorServerOverload": 700,
+  "ErrorIntentionalLeaving": 701,
+  "ErrorFocusLost": 702,
+  "ErrorBanned": 703,
+  "ErrorKicked": 704,
+  "ErrorBannedNoCode": 705,
+  "ErrorKickedNoCode": 706,
+  "ErrorHacking": 707,
+  "ErrorFullGame": 708,
+  "ErrorStartedGame": 709,
+  "ErrorNotFoundGame": 710,
+  "ErrorInactivity": 711,
+  "ErrorGenericOnlineDisconnect": 712,
+  "ErrorGenericLocalDisconnect": 713,
+  "ErrorInvalidName": 714,
+  "ErrorUnknown": 715,
+  "ErrorIncorrectVersion": 716,
+  "ErrorNotAuthenticated": 717,
+  "ErrorInternalServer": 718,
+  "ErrorPlatformLock": 719,
+  "ErrorLobbyInactivity": 720,
+  "ErrorMatchmakerInactivity": 721,
+  "ErrorInvalidGameOptions": 722,
+  "ErrorNoServersAvailable": 723,
+  "ErrorQuickmatchDisabled": 724,
+  "ErrorTooManyGames": 725,
+  "ErrorDuplicateConnection": 726,
+  "ErrorTooManyRequests": 727,
+  "ErrorSanction": 728,
+  "ErrorClientTimeout": 729,
+  "ErrorClientTimeoutConsole": 730,
+  "VentDirection": 1000,
+  "VentMove": 1001,
+  "MenuNavigate": 1002,
+  "NoTranslation": 1003,
+  "NsoError": 1004,
+  "Roles": 1499,
+  "RolesSettings": 1500,
+  "ScientistRole": 1501,
+  "EngineerRole": 1502,
+  "GuardianAngelRole": 1503,
+  "ShapeshifterRole": 1504,
+  "ScientistBlurb": 1505,
+  "EngineerBlurb": 1506,
+  "GuardianAngelBlurb": 1507,
+  "ShapeshifterBlurb": 1508,
+  "CrewmateBlurb": 1509,
+  "ImpostorBlurb": 1510,
+  "YourRoleIs": 1511,
+  "ShapeshiftAbility": 1512,
+  "VentAbility": 1513,
+  "VitalsAbility": 1514,
+  "ProtectAbility": 1515,
+  "ShapeshiftAbilityUndo": 1516,
+  "RoleChanceAndQuantity": 1517,
+  "ProtectedRecently": 1518,
+  "ShapeshifterDuration": 1519,
+  "ShapeshifterCooldown": 1520,
+  "ShapeshifterLeaveSkin": 1521,
+  "ScientistCooldown": 1522,
+  "GuardianAngelCooldown": 1523,
+  "EngineerCooldown": 1524,
+  "ScientistBlurbMed": 1525,
+  "ScientistBlurbLong": 1526,
+  "EngineerBlurbMed": 1527,
+  "EngineerBlurbLong": 1528,
+  "GuardianAngelBlurbMed": 1529,
+  "GuardianAngelBlurbLong": 1530,
+  "ShapeshifterBlurbMed": 1531,
+  "ShapeshifterBlurbLong": 1532,
+  "RoleHint": 1533,
+  "EngineerInVentCooldown": 1534,
+  "ScientistBatteryCharge": 1535,
+  "GuardianAngelDuration": 1536,
+  "GuardianAngelImpostorSeeProtect": 1537,
+  "StatsRoleWins": 1538,
+  "StatsEngineerVents": 1539,
+  "StatsScientistChargesGained": 1540,
+  "StatsGuardianAngelCrewmatesProtected": 1541,
+  "StatsShapeshifterShiftedKills": 1542,
+  "CrewmateGhostRole": 1543,
+  "ImpostorGhostRole": 1544,
+  "HauntAbilityName": 1545,
+  "SeekButton": 1546,
+  "RolesHelp_CrewmateRole": 1547,
+  "RolesHelp_ImpostorRole": 1548,
+  "RolesHelpIntro_01": 1549,
+  "RolesHelpIntro_02": 1550,
+  "RolesHelp_Scientist_01": 1560,
+  "RolesHelp_Scientist_02": 1561,
+  "RolesHelp_Engineer_01": 1562,
+  "RolesHelp_Engineer_02": 1563,
+  "RolesHelp_GuardianAngel_01": 1564,
+  "RolesHelp_GuardianAngel_02": 1565,
+  "RolesHelp_Shapeshifter_01": 1600,
+  "RolesHelp_Shapeshifter_02": 1601,
+  "RolesHelpOutro_01": 1650,
+  "RolesHelpOutro_02": 1651,
+  "SanctionDuration": 1700,
+  "SanctionPermanent": 1701,
+  "SanctionConduct": 1702,
+  "SanctionImpersonationCeleb": 1703,
+  "SanctionSpamming": 1704,
+  "SanctionInappropriateNameUnsportsmanlike": 1705,
+  "SanctionUnsportsmanlikeConduct": 1706,
+  "SanctionImpersonationDevelopers": 1707,
+  "SanctionInappropriateChatPersonalInfo": 1708,
+  "SanctionInappropriateNameDerogatory": 1709,
+  "SanctionInappropriateNameNsfw": 1710,
+  "SanctionBullying": 1711,
+  "SanctionCheatingHacking": 1712,
+  "SanctionInappropriateChatDating": 1713,
+  "SanctionWeaponizingRules": 1714,
+  "SanctionRepeatOffender3": 1715,
+  "SanctionSexualMisconduct": 1716,
+  "SanctionDoxing": 1717,
+  "SanctionIllegalActivity": 1718,
+  "SanctionHarassment": 1719,
+  "SanctionSelfHarmPromotion": 1720,
+  "SanctionRepeatOffender10": 1721,
+  "SanctionUnknown": 1722,
+  "ScreenShakeOption": 1900,
+  "FeaturedItems": 1901,
+  "FeaturedBundles": 1902,
+  "FeaturedCubes": 1903,
+  "BugReportPopUpAttachScreenshotDesc": 1904,
+  "UserIdTokenError": 1905,
+  "NewGameMode": 1906,
+  "NewModeInfo": 1907,
+  "HideSeekHowToPlayTitleOne": 1908,
+  "HideSeekHowToPlayCaptionOne": 1909,
+  "HideSeekHowToPlayCaptionTwo": 1910,
+  "HideSeekHowToPlayCaptionThree": 1911,
+  "HideSeekHowToPlayPageOne": 1912,
+  "HideSeekHowToPlayImpostorOne": 1913,
+  "HideSeekHowToPlaySubtextOne": 1914,
+  "HideSeekHowToPlayCrewmateInfoOne": 1915,
+  "HideSeekHowToPlayCrewmateInfoTwo": 1916,
+  "HideSeekHowToPlayImpostorInfoOne": 1917,
+  "HideSeekHowToPlayFlashlightDefault": 1918,
+  "HideSeekHowToPlayFinalHide": 1919,
+  "HideSeekHowToPlayFlashlightMobile": 1920,
+  "HideSeekHowToPlayFlashlightSwitch": 1921,
+  "HideSeekHowToPlayFlashlightConsoles": 1922,
+  "HideSeekHowToPlayFlashlightPlayStation": 1923,
+  "QCInputSelf": 1925,
+  "QCInputFavorite": 1926,
+  "QCCrewMyself": 1950,
+  "QCTagSelf": 1951,
+  "QCTagFavorites": 1952,
+  "QCBuilderHeader": 1953,
+  "QCRemarks": 1954,
+  "QCCrewDead": 1955,
+  "QCSelfVoted": 1956,
+  "QCSelfReportedBody": 1957,
+  "QCSelfCams": 1958,
+  "QCCrewReportedBody": 1959,
+  "QCCrewCams": 1960,
+  "QCSelfWasProtected": 1961,
+  "QCCrewWasProtected": 1962,
+  "QCSelfWasntMe": 1963,
+  "QCWhoWasAt": 1964,
+  "QCSelfDoingTask": 1965,
+  "QCWhoIsRole": 1966,
+  "QCSelfFixedSystem": 1967,
+  "QCCrewFixedSystem": 1968,
+  "QCSelfAccAtLocation": 1969,
+  "QCSelfDidTaskAtLocation": 1970,
+  "QCCrewDidTaskAtLocation": 1971,
+  "QCSelfSawCrewVentAtLocation": 1972,
+  "QCSelfDidntVent": 1973,
+  "QCFollowMe": 1974,
+  "QCItsNotMe": 1975,
+  "QCSelfDoneWithTasks": 1976,
+  "QCGhostsDoYourTasks": 1977,
+  "QCSelfNotTheImpostor": 1978,
+  "QCHello": 1979,
+  "QCThanks": 1980,
+  "QCSorry": 1981,
+  "QCGG": 1982,
+  "QCBye": 1983,
+  "QCWhereWasTheBody": 1984,
+  "QCSelfReady": 1985,
+  "QCSelfWasRole": 1986,
+  "QCWhoWasRole": 1987,
+  "QCCoolOutfitCrew": 1988,
+  "QCSelfWasUsingBinoculars": 1989,
+  "QCSelfSawThroughBinoculars": 1990,
+  "QCInTheSporeCloud": 1991,
+  "QCHiddenBySporeCloud": 1992,
+  "CQCrewKilledDeadInSporeCloud": 1993,
+  "QCSelfUsingZipline": 1994,
+  "QCSelfSawWhileUsingZipline": 1995,
+  "QCCrewWasUsingZipline": 1996,
+  "QCDuringMushroomMixup": 1997,
+  "QCLocationLaptop": 2000,
+  "QCSystemsStart": 2004,
+  "QCSystemsKick": 2005,
+  "QCCrewI": 2006,
+  "QCCrewMe": 2007,
+  "QCCrewNoOne": 2008,
+  "QCAccAKilledB": 2009,
+  "QCAccAKilledBNeg": 2010,
+  "QCAccAIsSuspicious": 2011,
+  "QCAccAIsSuspiciousNeg": 2012,
+  "QCAccASawBVent": 2013,
+  "QCAccASawBVentNeg": 2014,
+  "QCAccAWasChasingB": 2015,
+  "QCAccAWasChasingBNeg": 2016,
+  "QCAccAIsLying": 2017,
+  "QCAccAIsLyingNeg": 2018,
+  "QCAccVoteA": 2019,
+  "QCAccVoteANeg": 2020,
+  "QCAccADidntReport": 2021,
+  "QCResYes": 2022,
+  "QCResNo": 2023,
+  "QCResDontKnow": 2024,
+  "QCResDontKnowNeg": 2025,
+  "QCResAWas": 2026,
+  "QCResAWasNeg": 2027,
+  "QCResADid": 2028,
+  "QCResADidNeg": 2029,
+  "QCResVote": 2030,
+  "QCResVoteNeg": 2031,
+  "QCResAWasAtB": 2032,
+  "QCResAWasAtBNeg": 2033,
+  "QCResRip": 2034,
+  "QCResRipNeg": 2035,
+  "QCResLies": 2036,
+  "QCResLiesNeg": 2037,
+  "QCQstWhere": 2038,
+  "QCQstWho": 2039,
+  "QCQstWhoWasWith": 2040,
+  "QCQstWhatWasADoing": 2041,
+  "QCQstWhoDidTask": 2042,
+  "QCQstWhereWasA": 2043,
+  "QCQstBodyOrMeeting": 2044,
+  "QCStaASawB": 2045,
+  "QCStaAWasWithB": 2046,
+  "QCStaADidB": 2047,
+  "QCStaASelfReported": 2048,
+  "QCStaDoubleKill": 2049,
+  "QCStaWasSelfReport": 2050,
+  "QCStaPleaseDoTasks": 2051,
+  "QCStaBodyWasInA": 2052,
+  "QCStaACalledMeeting": 2053,
+  "QCLocation": 2054,
+  "QCSystems": 2055,
+  "QCCrew": 2056,
+  "QCAccusation": 2057,
+  "QCResponse": 2058,
+  "QCQuestion": 2059,
+  "QCStatements": 2060,
+  "ANY": 2061,
+  "ChatType": 2062,
+  "QuickChatOnly": 2063,
+  "FreeChatOnly": 2064,
+  "FreeOrQuickChat": 2065,
+  "DateOfBirth": 2066,
+  "DateOfBirthEnter": 2067,
+  "Month": 2068,
+  "Day": 2069,
+  "Year": 2070,
+  "January": 2071,
+  "February": 2072,
+  "March": 2073,
+  "April": 2074,
+  "May": 2075,
+  "June": 2076,
+  "July": 2077,
+  "August": 2078,
+  "September": 2079,
+  "October": 2080,
+  "November": 2081,
+  "December": 2082,
+  "Submit": 2083,
+  "QCMore": 2084,
+  "Success": 2085,
+  "Failed": 2086,
+  "ErrorCreate": 2087,
+  "SuccessCreate": 2088,
+  "Close": 2089,
+  "ErrorLogIn": 2090,
+  "SuccessLogIn": 2091,
+  "AccountInfo": 2092,
+  "Account": 2093,
+  "UserName": 2094,
+  "Height": 2095,
+  "Weight": 2096,
+  "SignIn": 2097,
+  "CreateAccount": 2098,
+  "RequestPermission": 2099,
+  "RandomizeName": 2100,
+  "AccountLinking": 2101,
+  "ChangeName": 2102,
+  "LogOut": 2103,
+  "GuardianWait": 2104,
+  "EmailEdit": 2105,
+  "EmailResend": 2106,
+  "GuestContinue": 2107,
+  "GuardianEmailSent": 2108,
+  "GuardianCheckEmail": 2109,
+  "EditName": 2110,
+  "Name": 2111,
+  "CreateAccountQuestion": 2112,
+  "DoYouWantCreate": 2113,
+  "PermissionRequired": 2114,
+  "NeedPermissionText": 2115,
+  "GuardianEmailTitle": 2116,
+  "Send": 2117,
+  "NewEmail": 2118,
+  "ConfirmEmail": 2119,
+  "EditEmail": 2120,
+  "Loading": 2121,
+  "Welcome": 2122,
+  "DLLNotFoundAccountError": 2123,
+  "ContinueOffline": 2124,
+  "CreateTryAgain": 2125,
+  "WantToLogIn": 2126,
+  "GoOffline": 2127,
+  "PlayAsGuest": 2128,
+  "LogInTitle": 2129,
+  "LogInInfoText": 2130,
+  "ShowAccountSupportID5": 2131,
+  "ShowAccountSupportID4": 2132,
+  "ShowAccountSupportID3": 2133,
+  "ShowAccountSupportID2": 2134,
+  "ShowAccountSupportID1": 2135,
+  "YouAreNotOnline": 2136,
+  "SaveGameOutOfSpaceMessage": 2137,
+  "SaveGameOutOfSpaceConfirm": 2138,
+  "SaveGameOutOfSpaceCancel": 2139,
+  "EngagementScreen": 2140,
+  "EngagementScreenSignIn": 2141,
+  "FollowUs": 2142,
+  "ColorMaroon": 2143,
+  "ColorRose": 2144,
+  "ColorBanana": 2145,
+  "ColorGray": 2146,
+  "ColorTan": 2147,
+  "ColorSunset": 2148,
+  "QuickChatInstructionsStart": 2149,
+  "QuickChatInstructionsChild": 2150,
+  "QuickChatInstructionsGuest": 2151,
+  "QuickChatInstructionsFull": 2152,
+  "SwitchEShopBrowseAll": 2153,
+  "ColorCoral": 2154,
+  "GuardianEmail": 2155,
+  "LocalButton": 2156,
+  "OnlineButton": 2157,
+  "HowToPlayButton": 2158,
+  "FreePlayButton": 2159,
+  "PublicHeader": 2160,
+  "PrivateHeader": 2161,
+  "HostHeader": 2162,
+  "EmergencyMeeting": 2163,
+  "BodyReported": 2164,
+  "PlayAgain": 2165,
+  "QuitLabel": 2166,
+  "DownloadLabel": 2167,
+  "UploadLabel": 2168,
+  "TimeRemaining": 2169,
+  "AnnouncementLabel": 2170,
+  "StartLabel": 2171,
+  "UseLabel": 2172,
+  "KillLabel": 2173,
+  "SabotageLabel": 2174,
+  "VentLabel": 2175,
+  "OptionsLabel": 2176,
+  "ReportLabel": 2177,
+  "CO2Label": 2178,
+  "NutriLabel": 2179,
+  "RADLabel": 2180,
+  "WaterLabel": 2181,
+  "DiscussLabel": 2182,
+  "DeadLabel": 2183,
+  "SkippedVoting": 2184,
+  "ProceedLabel": 2185,
+  "HolidayHatLabel": 2186,
+  "HatLabel": 2187,
+  "PetLabel": 2188,
+  "SkinLabel": 2189,
+  "DoorlogLabel": 2190,
+  "VitalsLabel": 2191,
+  "InsufficientStorageError": 2192,
+  "NetworkError": 2193,
+  "OtherDownloadError": 2194,
+  "DownloadingLabel": 2195,
+  "DownloadSizeLabel": 2196,
+  "SkipVoteLabel": 2197,
+  "LogInInfoTextSwitch": 2198,
+  "WeatherDataDownload": 2199,
+  "BeginLabel": 2200,
+  "QuietLabel": 2201,
+  "LogLabel": 2202,
+  "ReadingLabel": 2203,
+  "UploadingLabel": 2204,
+  "ConnectionLabel": 2205,
+  "GoodLabel": 2206,
+  "PoorLabel": 2207,
+  "NoneLabel": 2208,
+  "ProgressLabel": 2209,
+  "PerfectLabel": 2210,
+  "NoDeadBodiesFound": 2211,
+  "AirshipBundle": 2212,
+  "PolusBundle": 2213,
+  "PolusSkinBundle": 2214,
+  "MiraBundle": 2215,
+  "MiraSkinBundle": 2216,
+  "PetAlien2": 2217,
+  "PetAlien1": 2218,
+  "PetAnimal": 2219,
+  "PetCrewmate": 2220,
+  "PetStickmin": 2221,
+  "PrisonerSkin": 2222,
+  "Cyborg_RHM": 2223,
+  "CCC_Officer": 2224,
+  "VentCleaning": 2225,
+  "CleanUp": 2226,
+  "ControllerDisconnectedMessage": 2227,
+  "TermsOfUseTitle": 2228,
+  "PPAndToUTitle": 2229,
+  "ComePlayDiscord": 2230,
+  "SupportEmail": 2231,
+  "SupportIDLabel": 2232,
+  "pk05_davehat": 2233,
+  "pk05_Ellie": 2234,
+  "pk05_Svenhat": 2235,
+  "pk05_Burthat": 2236,
+  "pk05_Ellryhat": 2237,
+  "pk05_monocles": 2238,
+  "pk05_cheesetoppat": 2239,
+  "pk05_Macbethhat": 2240,
+  "pk05_HenryToppat": 2241,
+  "pk05_EllieToppat": 2242,
+  "pk05_GeoffreyToppat": 2243,
+  "InviteFriends": 2244,
+  "Continue": 2245,
+  "GameComplete": 2246,
+  "XpGained": 2247,
+  "PodsEarned": 2248,
+  "CosmicubeNodeUnlocked": 2249,
+  "LevelShorthand": 2250,
+  "PrestigeLevelShorthand": 2251,
+  "MaxLevel": 2252,
+  "EquipLabel": 2253,
+  "XpGainedValue": 2254,
+  "PSNErrorSessionFailed": 2255,
+  "PSNErrorSessionJoinFailed": 2256,
+  "PSNErrorSessionGetInfoFailed": 2257,
+  "PSNErrorPSNConnectionLost": 2258,
+  "PSNErrorUserSignedOut": 2259,
+  "CrossPlayTitle": 2260,
+  "CrossPlayAllPlatforms": 2261,
+  "CrossPlaySamePlatform": 2262,
+  "QuickChat": 2263,
+  "TimeOutText": 2264,
+  "RetryText": 2265,
+  "PlayerLevel": 2266,
+  "PlayerXp": 2267,
+  "PlayerLevelExtremeShorthand": 2268,
+  "Max": 2269,
+  "Wardrobe": 2270,
+  "CopiedText": 2271,
+  "LinkAccount": 2272,
+  "CreateNewAccount": 2273,
+  "LinkExistingAccount": 2274,
+  "LinkAccountExplanation": 2275,
+  "LinkAccountCode": 2276,
+  "ErrorLink": 2277,
+  "UnlinkAccount": 2278,
+  "ConfirmUnlinkAccount": 2279,
+  "UnlinkAccountExplain": 2280,
+  "UnlinkAccountExplainConfirm": 2281,
+  "UnlinkError": 2282,
+  "UnlinkSuccess": 2283,
+  "ConfirmLinkExistingAccount": 2284,
+  "LinkExistingAccountExplain": 2285,
+  "LinkExistingAccountExplainConfirm": 2286,
+  "ResetAccount": 2287,
+  "CrossPlayEnabledWarning": 2288,
+  "StoreComingSoon": 2289,
+  "Locked": 2290,
+  "FailPurchase": 2291,
+  "FailPurchaseUnknown": 2292,
+  "FailPurchaseAlreadyOwn": 2293,
+  "FailPurchaseCurrency": 2294,
+  "FailPurchaseCubeOwn": 2295,
+  "ErrorPlatformParentalControlsBlock": 2296,
+  "Crewmates": 2297,
+  "Colors": 2298,
+  "Active": 2299,
+  "Equipped": 2300,
+  "XboxShopBrowseAll": 2302,
+  "PSShopBrowseAll": 2303,
+  "SteamNotInitialized": 2304,
+  "LoggedInErrorStarPurchase": 2305,
+  "StarDisclaimer": 2306,
+  "HowToPlayText_Consoles": 2307,
+  "ErrorQuickChatMode": 2308,
+  "ErrorLobbyUsersBlocked": 2309,
+  "ItchNoStars": 2310,
+  "CheckingPurchasesLabel": 2311,
+  "RedeemPurchasedItemsTitle": 2312,
+  "RedeemPurcahsedItemsExplain": 2313,
+  "RedeemProceed": 2314,
+  "RedeemNotYet": 2315,
+  "AccountIDDisplay": 2316,
+  "RedeemNever": 2317,
+  "AvailableFor": 2318,
+  "GuestProgressionWarning": 2319,
+  "ErrorSelfPlatformLock": 2320,
+  "ErrorCrossPlat": 2321,
+  "SettingsStreamerMode": 2322,
+  "RoomCodeInfo": 2323,
+  "AbbreviatedDay": 2324,
+  "AbbreviatedHour": 2325,
+  "AbbreviatedMinute": 2326,
+  "AbbreviatedSecond": 2327,
+  "StreamingTwitch": 2328,
+  "MapNameSkeld": 2600,
+  "MapNameMira": 2601,
+  "MapNamePolus": 2602,
+  "MapNameAirship": 2603,
+  "MapNameFungle": 2604,
+  "MaxVentUses": 2700,
+  "MaxTimeInVent": 2701,
+  "MinCrewmatesForVitals": 2702,
+  "EscapeTime": 2703,
+  "AllTasksComplete": 2704,
+  "EscapePrompt": 2705,
+  "CrewmateFlashlightSize": 2706,
+  "ImpostorFlashlightSize": 2707,
+  "CrewmateLeadTime": 2708,
+  "CrewmadeHideBlurb": 2709,
+  "ImpostorKillBlurb": 2710,
+  "HideCountdown": 2711,
+  "ScaryMusicDistance": 2712,
+  "ShortTaskTimeValue": 2713,
+  "LongTaskTimeValue": 2714,
+  "CommonTaskTimeValue": 2715,
+  "UseFlashlight": 2716,
+  "FinalEscapeTime": 2717,
+  "VeryScaryMusicDistance": 2718,
+  "SeekerFinalSpeed": 2719,
+  "SeekerFinalVents": 2720,
+  "SeekerFinalMap": 2721,
+  "CrewmateVentCooldown": 2722,
+  "SeekerPings": 2723,
+  "MaxPingTime": 2724,
+  "ShowPingTime": 2725,
+  "MinPingTime": 2726,
+  "ShowCrewmateNames": 2727,
+  "ShowImpostorNames": 2728,
+  "HideActionButton": 2729,
+  "RuleOneCrewmates": 2730,
+  "RuleTwoCrewmates": 2731,
+  "RuleThreeCrewmates": 2732,
+  "RuleOneImpostor": 2733,
+  "RuleTwoImpostor": 2734,
+  "RuleThreeImpostor": 2735,
+  "RuleOneCrewmatesTitle": 2736,
+  "RuleTwoCrewmatesTitle": 2737,
+  "RuleThreeCrewmatesTitle": 2738,
+  "RuleOneImpostorTitle": 2739,
+  "RuleTwoImpostorTitle": 2740,
+  "RoundRobin": 2741,
+  "OptionUnavailablePublicLobby": 2742,
+  "StatsHidenSeekGamesCrewmateSurvived": 2743,
+  "StatsHidenSeekTimesVented": 2744,
+  "StatsTimesPettedPet": 2745,
+  "StatsImpostorKills_HideAndSeek": 2746,
+  "StatsFastestCrewmateWin_HideAndSeek": 2747,
+  "StatsFastestImpostorWin_HideAndSeek": 2748,
+  "StatsHideAndSeekImpostorVictory": 2749,
+  "StatsHideAndSeekCrewmateVictory": 2750,
+  "AmongUsFriends": 2800,
+  "FriendsGuestWarning": 2801,
+  "PlatformFriends": 2802,
+  "BlockedPlayers": 2803,
+  "RecentPlayers": 2804,
+  "LobbyLabel": 2805,
+  "FriendCodeExplanation": 2806,
+  "FriendCodeSuccess": 2807,
+  "FriendRequestReceived": 2808,
+  "FriendRequestSent": 2809,
+  "GameLobbyInviteSent": 2810,
+  "GameLobbyInviteReceived": 2811,
+  "BlockPlayerConfirm": 2812,
+  "RemoveFriendConfirm": 2813,
+  "InviteToLobbyConfirm": 2814,
+  "FriendCodeLabel": 2815,
+  "FriendCodeCreationTitle": 2816,
+  "FriendRequestSentFailed": 2817,
+  "ErrorBadUsername": 2818,
+  "ErrorUserNotFound": 2819,
+  "ErrorThisIsYou": 2820,
+  "ErrorFriendRequestExists": 2821,
+  "ErrorAlreadyFriends": 2822,
+  "GameLobbyInviteSentFailed": 2823,
+  "BlockedPlayerFailed": 2824,
+  "BlockedPlayer": 2825,
+  "AlreadyBlocked": 2826,
+  "FriendList": 2827,
+  "NoNewRequests": 2828,
+  "AddFriendPrompt": 2829,
+  "NewRequests": 2830,
+  "Requests": 2831,
+  "AddFriend": 2832,
+  "StreamWarning": 2833,
+  "FriendsListPermissionsWarning": 2834,
+  "AddFriendConfirm": 2835,
+  "UnfriendConfirm": 2836,
+  "UnblockConfirm": 2837,
+  "SettingsEnableFriendInvites": 2838,
+  "ErrorCrossPlatformCommunication": 2839,
+  "ErrorPlatformFriends": 2840,
+  "ErrorPlayerBlockedYou": 2841,
+  "ErrorRecipientMaxFriendRequests": 2842,
+  "ErrorSenderMaxFriendRequests": 2843,
+  "ErrorMaxFriends": 2844,
+  "ErrorRecipientMaxFriends": 2845,
+  "ParentPortalButton": 2846,
+  "FriendsListEmailSent": 2847,
+  "AndroidAssetBundleWarning": 2848,
+  "FreeChatLinkWarning": 2849,
+  "FriendListUnavailable": 2850,
+  "SignInIssueTitle": 2851,
+  "SignInIssueText": 2852,
+  "Ghost": 2853,
+  "CurrentlyHaunting": 2854,
+  "RestorePurchases": 2855,
+  "QCAccIsRole": 3000,
+  "QCAccIsRoleNeg": 3001,
+  "QCAccShapeshited": 3002,
+  "QCStaShapeshifterSkin": 3003,
+  "QCResIsBeingFramed": 3004,
+  "QCResIsRoleMaybe": 3005,
+  "QCResCloseTo": 3006,
+  "QCResProtected": 3007,
+  "QCRoles": 3008,
+  "ErrorFailedToCreateGame": 3009,
+  "ErrorFailedToJoinCreatedGame": 3010,
+  "ErrorDisconnectBeforeJoining": 3011,
+  "ErrorDisconnectPacket": 3012,
+  "PSEULA_SIEA": 3013,
+  "PSEULA_SIEE": 3014,
+  "ShowAccountID": 3015,
+  "HideAccountID": 3016,
+  "HiddenAccountID": 3017,
+  "ErrorLobbyFailedGettingBlockedUsers": 3018,
+  "SteamOverlayDisabled": 3019,
+  "QCOnlyInfo": 3020,
+  "FreeChatInfo": 3021,
+  "FreeChatWarning": 3022,
+  "TryAgain": 3023,
+  "TempDisabled": 3024,
+  "TempDisabledLinkExplain": 3025,
+  "RedeemPopup": 3026,
+  "RedeemButton": 3027,
+  "Decontamination3": 3028,
+  "MergeGuestAccountText": 3029,
+  "MergeGuestAccountTitle": 3030,
+  "ErrorCommunications": 3031,
+  "ManageAccountTitle": 3032,
+  "ManageAccountText": 3033,
+  "Email": 3034,
+  "BugReportPopUpSubmittedText": 3035,
+  "BugReportPopUpCategoryLabel": 3036,
+  "BugReportPopUpDescriptionLabel": 3037,
+  "BugReportPopUpTitle": 3038,
+  "BugReportCategoryServerIssues": 3039,
+  "BugReportCategoryGameplayIssue": 3040,
+  "BugReportCategoryAccountManagement": 3041,
+  "BugReportCategoryBilling": 3042,
+  "BugReportCategoryGeneral": 3043,
+  "BugReportIssueButton": 3044,
+  "BugReportPopUpSubmissionFailedText": 3045,
+  "BugReportPopUpAttachScreenshotLabel": 3046,
+  "QCQstWhy": 3050,
+  "QCTagAccuse": 3051,
+  "QCTagDefend": 3052,
+  "QCTagQuestion": 3053,
+  "QCTagLobby": 3054,
+  "QCTagImpostor": 3055,
+  "QCTagMeeting": 3056,
+  "QCTagHiding": 3057,
+  "QCTagFlashlight": 3058,
+  "QCTagRoles": 3059,
+  "QCInputRole": 3060,
+  "QCTagTasks": 3061,
+  "QCInputTask": 3062,
+  "QCTagSabotages": 3063,
+  "QCInputSabotages": 3064,
+  "QCTagRemarks": 3065,
+  "QCInputRemark": 3066,
+  "QCInputAccusation": 3067,
+  "QCInputDefense": 3068,
+  "QCTagQuestionSingular": 3069,
+  "QCResAgree": 3070,
+  "QCResDisagree": 3071,
+  "QCResNice": 3072,
+  "QCResUhOh": 3073,
+  "QCResOops": 3074,
+  "QCResExclamationMarks": 3075,
+  "QCResQuestionMarks": 3076,
+  "QCBuildingPlaceholder": 3077,
+  "QCTagQuickRemarks": 3078,
+  "FixWiringName": 3079,
+  "FixLightsName": 3080,
+  "DoorsName": 3081,
+  "Undo": 3095,
+  "Clear": 3096,
+  "DivertPower": 3097,
+  "ResetReactorName": 3098,
+  "RestoreOxyName": 3099,
+  "QCAccADidntReport_QCCrewMe": 3100,
+  "QCStaACalledMeeting_QCCrewMe": 3101,
+  "QCAccAIsLyingNeg_QCCrewMe": 3102,
+  "QCResADid_QCCrewMe": 3103,
+  "QCResADidNeg_QCCrewMe": 3104,
+  "QCResAWas_QCCrewMe": 3105,
+  "QCResAWasNeg_QCCrewMe": 3106,
+  "QCResIsBeingFramed_QCCrewMe": 3107,
+  "QCAccAKilledBNeg_QCCrewMe_ANY": 3108,
+  "QCStaAWasWithB_QCCrewMe_ANY": 3109,
+  "QCStaAWasWithB_ANY_QCCrewMe": 3110,
+  "QCResCloseTo_QCCrewMe_ANY": 3111,
+  "QCAccAWasChasingB_QCCrewMe_ANY": 3112,
+  "QCAccAWasChasingBNeg_QCCrewMe_ANY": 3113,
+  "QCAccAWasChasingB_ANY_QCCrewMe": 3114,
+  "QCAccAWasChasingBNeg_ANY_QCCrewMe": 3115,
+  "QCStaASawB_QCCrewMe_ANY": 3116,
+  "QCAccASawBVent_QCCrewMe_ANY": 3117,
+  "QCAccASawBVentNeg_QCCrewMe_ANY": 3118,
+  "QCAccASawBVentNeg_ANY_QCCrewMe": 3119,
+  "QCResAWasAtB_QCCrewMe_ANY": 3120,
+  "QCResAWasAtBNeg_QCCrewMe_ANY": 3121,
+  "QCStaADidB_QCCrewMe_ANY": 3122,
+  "QCAccIsRole_QCCrewMe_ANY": 3123,
+  "QCAccIsRoleNeg_QCCrewMe_ANY": 3124,
+  "QCResProtected_ANY_QCCrewMe": 3125,
+  "QCCrewSomeone": 3126,
+  "QCResUrWelcome": 3127,
+  "QCResNp": 3128,
+  "QCResYikes": 3129,
+  "QCResRipCrew": 3130,
+  "QCResYeetCrew": 3131,
+  "QCSelfWasOnVitals": 3132,
+  "QCSawDeadCrewOnVitals": 3133,
+  "QCSelfSawTwoCrew": 3134,
+  "QCCrewShapeshifted": 3135,
+  "QCSelfSawCrewDoVisualTask": 3136,
+  "QCSelfWasOnDoorlogs": 3137,
+  "QCSelfWasOnAdmin": 3138,
+  "QCSelfAmVotingCrew": 3139,
+  "QCCrewWasPretendingTasks": 3140,
+  "QCCrewWasPretendingSabotage": 3141,
+  "QCLobbyMoreImpostors": 3142,
+  "QCLobbyLessImpostors": 3143,
+  "QCLobbyConfirmEjects": 3144,
+  "QCLobbyMoreEmergencyMeetings": 3145,
+  "QCLobbyLessEmergencyMeetings": 3146,
+  "QCLobbyAnonymousVotes": 3147,
+  "QCLobbyMoreEmergencyCooldownTime": 3148,
+  "QCLobbyLessEmergencyCooldownTime": 3149,
+  "QCLobbyMoreDiscussionTime": 3150,
+  "QCLobbyLessDiscussionTime": 3151,
+  "QCLobbyMoreVotingTime": 3152,
+  "QCLobbyLessVotingTime": 3153,
+  "QCLobbyFasterPlayerSpeed": 3154,
+  "QCLobbySlowerPlayerSpeed": 3155,
+  "QCLobbyTaskBarUpdates": 3156,
+  "QCLobbyVisualTasks": 3157,
+  "QCLobbyMoreCrewmateVision": 3158,
+  "QCLobbyLessCrewmateVision": 3159,
+  "QCLobbyMoreImpostorVision": 3160,
+  "QCLobbyLessImpostorVision": 3161,
+  "QCLobbyMoreKillCooldownTime": 3162,
+  "QCLobbyLessKillCooldownTime": 3163,
+  "QCLobbyLongerKillDistance": 3164,
+  "QCLobbyShorderKillDistance": 3165,
+  "QCLobbyMoreCommonTasks": 3166,
+  "QCLobbyLessCommonTasks": 3167,
+  "QCLobbyMoreLongTasks": 3168,
+  "QCLobbyLessLongTasks": 3169,
+  "QCLobbyMoreShortTasks": 3170,
+  "QCLobbyLessShortTasks": 3171,
+  "QCLobbyRoleScientists": 3172,
+  "QCLobbyRoleGuardianAngels": 3173,
+  "QCLobbyRoleEngineers": 3174,
+  "QCLobbyRoleShapeshifters": 3175,
+  "QCLobbyRoleNone": 3176,
+  "QCResLess": 3177,
+  "QCResMore": 3178,
+  "QCResNone": 3179,
+  "QCLobbyHNSMoreHideTime": 3180,
+  "QCLobbyHNSLessHideTime": 3181,
+  "QCLobbyHNSMoreFinalHideTime": 3182,
+  "QCLobbyHNSLessFinalHideTime": 3183,
+  "QCLobbyHNSFlashlightMode": 3184,
+  "QCLobbyHNSMoreCrewmateFlashlightSize": 3185,
+  "QCLobbyHNSLessCrewmateFlashlightSize": 3186,
+  "QCLobbyHNSMoreImpostorFlashlightSize": 3187,
+  "QCLobbyHNSLessImpostorFlashlightSize": 3188,
+  "QCLobbyHNSShowNames": 3189,
+  "QCLobbyHNSMoreVents": 3190,
+  "QCLobbyHNSLessVents": 3191,
+  "QCLobbyHNSMoreTimeInVent": 3192,
+  "QCLobbyHNSLessTimeInVent": 3193,
+  "QCLobbyHNSMoreFinalHideImpostorSpeed": 3194,
+  "QCLobbyHNSLessFinalHideImpostorSpeed": 3195,
+  "QCLobbyHNSFinalHideSeekMap": 3196,
+  "QCLobbyHNSFinalHidePings": 3197,
+  "QCLobbyHNSMorePingInterval": 3198,
+  "QCLobbyHNSLessPingInterval": 3199,
+  "SettingsColorblind": 3200,
+  "SettingsHelp": 3201,
+  "SecLogEntryColorblind": 3202,
+  "DeleteAccount": 3203,
+  "DoNotDeleteAccount": 3204,
+  "AccountDeleteHelp": 3205,
+  "AccountUnDeleteHelp": 3206,
+  "ConfirmDelete": 3207,
+  "ConfirmDeleteAccounts": 3208,
+  "ConfirmDeleteAccountsEmpty": 3209,
+  "AccountRequestDelete": 3210,
+  "HasBeenKilled": 3211,
+  "ScrollList": 3300,
+  "ScrollNews": 3301,
+  "AmongUsAnnouncements": 3302,
+  "AnnouncementErrorSubtitle": 3303,
+  "AnnouncementErrorText": 3304,
+  "ReadMoreLabel": 3305,
+  "ReturnToList": 3306,
+  "NavigateLinks": 3307,
+  "AgeVerificationTitle": 3308,
+  "AgeVerificationInfoTitle": 3309,
+  "AgeVerificationInfo": 3310,
+  "AgeVerificationMoreInfo": 3311,
+  "EditLabel": 3312,
+  "VerifyAgeText": 3313,
+  "PlayLabel": 3314,
+  "SettingsLabel": 3315,
+  "NewsLabel": 3316,
+  "AccountLabel": 3317,
+  "CreditsLabel": 3318,
+  "ShopLabel": 3319,
+  "InventoryLabel": 3320,
+  "StatsLabel": 3321,
+  "FriendsLabel": 3322,
+  "ReportNotificationHeader": 3323,
+  "ReportNotificationBody": 3324,
+  "MiningPit": 3400,
+  "Jungle": 3401,
+  "BuildSandcastle": 3402,
+  "FishingDock": 3403,
+  "CatchFish": 3404,
+  "CollectShells": 3405,
+  "LiftWeights": 3406,
+  "RoastMarshmallow": 3407,
+  "TestFrisbee": 3408,
+  "CollectSamples": 3409,
+  "CollectVegetables": 3410,
+  "HoistSupplies": 3411,
+  "MineOres": 3412,
+  "PolishGem": 3413,
+  "ReplaceParts": 3414,
+  "HelpCritter": 3415,
+  "RecRoom": 3416,
+  "Lookout": 3417,
+  "Beach": 3418,
+  "Highlands": 3419,
+  "SleepingQuarters": 3420,
+  "CrankGenerator": 3421,
+  "FixAntenna": 3422,
+  "TuneRadio": 3423,
+  "MushroomMixupSabotage": 3424,
+  "MineOresMine": 3425,
+  "CollectStick": 3426,
+  "WipeSand": 3427,
+  "ExtractFuel": 3428,
+  "MonitorMushroom": 3429,
+  "PlayVideogame": 3430,
+  "CookFish": 3431,
+  "PrepVegetables": 3432,
+  "MushroomMixupName": 3433,
+  "GameType": 3500,
+  "GameTypeError": 3501,
+  "GameTypeClassic": 3502,
+  "GameTypeHideAndSeek": 3503,
+  "PetAction": 3504,
+  "CreateLabel": 3505,
+  "TagFiltersTitle": 3506,
+  "TagFiltersHelpFindGame": 3507,
+  "TagFiltersHelpCreate": 3508,
+  "TagsFilteredSingular": 3509,
+  "TagsFilteredPlural": 3510,
+  "TagsAppliedSingular": 3511,
+  "TagsAppliedPlural": 3512,
+  "DefaultFilterTag_FirstTime": 3513,
+  "DefaultFilterTag_Casual": 3514,
+  "DefaultFilterTag_Serious": 3515,
+  "DefaultFilterTag_Expert": 3516,
+  "HttpErrorContextNone": 3517,
+  "HttpErrorContextAuthenticate": 3518,
+  "HttpErrorContextRequestGameCode": 3519,
+  "HttpErrorContextFindHostServer": 3520,
+  "HttpErrorContextRequestGamesList": 3521,
+  "HttpErrorUnknown": 3522,
+  "HttpErrorBadRequest": 3523,
+  "HttpErrorUnauthorized": 3524,
+  "HttpErrorForbidden": 3525,
+  "HttpErrorNotFound": 3526,
+  "HttpErrorMethodNotAllowed": 3527,
+  "HttpErrorRequestTimeout": 3528,
+  "HttpErrorTooManyRequests": 3529,
+  "HttpErrorInternalServerError": 3530,
+  "HttpErrorBadGateway": 3531,
+  "HttpErrorServiceUnavailable": 3532,
+  "HttpErrorGatewayTimeout": 3533
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/enums/SupportedLangs.json b/src/Impostor.Api/Innersloth/Data/enums/SupportedLangs.json
new file mode 100644 (file)
index 0000000..6228b39
--- /dev/null
@@ -0,0 +1,18 @@
+{
+  "English": 0,
+  "Latam": 1,
+  "Brazilian": 2,
+  "Portuguese": 3,
+  "Korean": 4,
+  "Russian": 5,
+  "Dutch": 6,
+  "Filipino": 7,
+  "French": 8,
+  "German": 9,
+  "Italian": 10,
+  "Japanese": 11,
+  "Spanish": 12,
+  "SChinese": 13,
+  "TChinese": 14,
+  "Irish": 15
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/enums/SystemTypes.json b/src/Impostor.Api/Innersloth/Data/enums/SystemTypes.json
new file mode 100644 (file)
index 0000000..2b5b084
--- /dev/null
@@ -0,0 +1,61 @@
+{
+  "Hallway": 0,
+  "Storage": 1,
+  "Cafeteria": 2,
+  "Reactor": 3,
+  "UpperEngine": 4,
+  "Nav": 5,
+  "Admin": 6,
+  "Electrical": 7,
+  "LifeSupp": 8,
+  "Shields": 9,
+  "MedBay": 10,
+  "Security": 11,
+  "Weapons": 12,
+  "LowerEngine": 13,
+  "Comms": 14,
+  "ShipTasks": 15,
+  "Doors": 16,
+  "Sabotage": 17,
+  "Decontamination": 18,
+  "Launchpad": 19,
+  "LockerRoom": 20,
+  "Laboratory": 21,
+  "Balcony": 22,
+  "Office": 23,
+  "Greenhouse": 24,
+  "Dropship": 25,
+  "Decontamination2": 26,
+  "Outside": 27,
+  "Specimens": 28,
+  "BoilerRoom": 29,
+  "VaultRoom": 30,
+  "Cockpit": 31,
+  "Armory": 32,
+  "Kitchen": 33,
+  "ViewingDeck": 34,
+  "HallOfPortraits": 35,
+  "CargoBay": 36,
+  "Ventilation": 37,
+  "Showers": 38,
+  "Engine": 39,
+  "Brig": 40,
+  "MeetingRoom": 41,
+  "Records": 42,
+  "Lounge": 43,
+  "GapRoom": 44,
+  "MainHall": 45,
+  "Medical": 46,
+  "Decontamination3": 47,
+  "Zipline": 48,
+  "MiningPit": 49,
+  "FishingDock": 50,
+  "RecRoom": 51,
+  "Lookout": 52,
+  "Beach": 53,
+  "Highlands": 54,
+  "Jungle": 55,
+  "SleepingQuarters": 56,
+  "MushroomMixupSabotage": 57,
+  "HeliSabotage": 58
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/enums/TaskTypes.json b/src/Impostor.Api/Innersloth/Data/enums/TaskTypes.json
new file mode 100644 (file)
index 0000000..f13b659
--- /dev/null
@@ -0,0 +1,84 @@
+{
+  "SubmitScan": 0,
+  "PrimeShields": 1,
+  "FuelEngines": 2,
+  "ChartCourse": 3,
+  "StartReactor": 4,
+  "SwipeCard": 5,
+  "ClearAsteroids": 6,
+  "UploadData": 7,
+  "InspectSample": 8,
+  "EmptyChute": 9,
+  "EmptyGarbage": 10,
+  "AlignEngineOutput": 11,
+  "FixWiring": 12,
+  "CalibrateDistributor": 13,
+  "DivertPower": 14,
+  "UnlockManifolds": 15,
+  "ResetReactor": 16,
+  "FixLights": 17,
+  "CleanO2Filter": 18,
+  "FixComms": 19,
+  "RestoreOxy": 20,
+  "StabilizeSteering": 21,
+  "AssembleArtifact": 22,
+  "SortSamples": 23,
+  "MeasureWeather": 24,
+  "EnterIdCode": 25,
+  "BuyBeverage": 26,
+  "ProcessData": 27,
+  "RunDiagnostics": 28,
+  "WaterPlants": 29,
+  "MonitorOxygen": 30,
+  "StoreArtifacts": 31,
+  "FillCanisters": 32,
+  "FixWeatherNode": 33,
+  "InsertKeys": 34,
+  "ResetSeismic": 35,
+  "ScanBoardingPass": 36,
+  "OpenWaterways": 37,
+  "ReplaceWaterJug": 38,
+  "RepairDrill": 39,
+  "AlignTelescope": 40,
+  "RecordTemperature": 41,
+  "RebootWifi": 42,
+  "PolishRuby": 43,
+  "ResetBreakers": 44,
+  "Decontaminate": 45,
+  "MakeBurger": 46,
+  "UnlockSafe": 47,
+  "SortRecords": 48,
+  "PutAwayPistols": 49,
+  "FixShower": 50,
+  "CleanToilet": 51,
+  "DressMannequin": 52,
+  "PickUpTowels": 53,
+  "RewindTapes": 54,
+  "StartFans": 55,
+  "DevelopPhotos": 56,
+  "GetBiggolSword": 57,
+  "PutAwayRifles": 58,
+  "StopCharles": 59,
+  "VentCleaning": 60,
+  "None": 61,
+  "BuildSandcastle": 62,
+  "CatchFish": 63,
+  "CollectShells": 64,
+  "LiftWeights": 65,
+  "RoastMarshmallow": 66,
+  "TestFrisbee": 67,
+  "CollectSamples": 68,
+  "CollectVegetables": 69,
+  "HoistSupplies": 70,
+  "MineOres": 71,
+  "PolishGem": 72,
+  "ReplaceParts": 73,
+  "HelpCritter": 74,
+  "CrankGenerator": 75,
+  "FixAntenna": 76,
+  "TuneRadio": 77,
+  "MushroomMixupSabotage": 78,
+  "ExtractFuel": 79,
+  "MonitorMushroom": 80,
+  "PlayVideogame": 81
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/info.json b/src/Impostor.Api/Innersloth/Data/info.json
new file mode 100644 (file)
index 0000000..1f9a1ee
--- /dev/null
@@ -0,0 +1,5 @@
+{
+  "dumpostorVersion": "1.0.0",
+  "gameVersion": "2023.10.24",
+  "platformType": "StandaloneSteamPC"
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Airship/doors.json b/src/Impostor.Api/Innersloth/Data/maps/Airship/doors.json
new file mode 100644 (file)
index 0000000..06e6b09
--- /dev/null
@@ -0,0 +1,149 @@
+{
+  "0": {
+    "room": "Comms",
+    "position": {
+      "x": -16.191698,
+      "y": -0.90999997
+    }
+  },
+  "1": {
+    "room": "Comms",
+    "position": {
+      "x": -8.663198,
+      "y": -0.9099996
+    }
+  },
+  "2": {
+    "room": "Comms",
+    "position": {
+      "x": -13.362299,
+      "y": -0.015400052
+    }
+  },
+  "3": {
+    "room": "Comms",
+    "position": {
+      "x": -10.975999,
+      "y": -2.3309999
+    }
+  },
+  "4": {
+    "room": "Brig",
+    "position": {
+      "x": -0.9260999,
+      "y": 7.100799
+    }
+  },
+  "5": {
+    "room": "Brig",
+    "position": {
+      "x": -3.6364996,
+      "y": 8.784999
+    }
+  },
+  "6": {
+    "room": "Brig",
+    "position": {
+      "x": 2.7145998,
+      "y": 8.850798
+    }
+  },
+  "7": {
+    "room": "Kitchen",
+    "position": {
+      "x": -8.764699,
+      "y": -7.2687993
+    }
+  },
+  "8": {
+    "room": "Kitchen",
+    "position": {
+      "x": -8.764699,
+      "y": -11.976298
+    }
+  },
+  "9": {
+    "room": "Kitchen",
+    "position": {
+      "x": -1.4979999,
+      "y": -12.040699
+    }
+  },
+  "10": {
+    "room": "MainHall",
+    "position": {
+      "x": 4.2496986,
+      "y": 0.042
+    }
+  },
+  "11": {
+    "room": "MainHall",
+    "position": {
+      "x": 17.490198,
+      "y": 0.04619999
+    }
+  },
+  "12": {
+    "room": "Records",
+    "position": {
+      "x": 16.382797,
+      "y": 9.368099
+    }
+  },
+  "13": {
+    "room": "Records",
+    "position": {
+      "x": 23.97472,
+      "y": 9.368099
+    }
+  },
+  "14": {
+    "room": "Records",
+    "position": {
+      "x": 19.858297,
+      "y": 5.601399
+    }
+  },
+  "15": {
+    "room": "Lounge",
+    "position": {
+      "x": 29.2544,
+      "y": 6.6990004
+    }
+  },
+  "16": {
+    "room": "Lounge",
+    "position": {
+      "x": 30.7944,
+      "y": 6.6990004
+    }
+  },
+  "17": {
+    "room": "Lounge",
+    "position": {
+      "x": 32.2924,
+      "y": 6.6990004
+    }
+  },
+  "18": {
+    "room": "Lounge",
+    "position": {
+      "x": 33.7771,
+      "y": 6.6990004
+    }
+  },
+  "19": {
+    "room": "Medical",
+    "position": {
+      "x": 21.314297,
+      "y": -8.416099
+    }
+  },
+  "20": {
+    "room": "Medical",
+    "position": {
+      "x": 32.540195,
+      "y": -4.694899
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Airship/spawn.json b/src/Impostor.Api/Innersloth/Data/maps/Airship/spawn.json
new file mode 100644 (file)
index 0000000..bcfcdd4
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "initialSpawnCenter": {
+    "x": -25,
+    "y": 40
+  },
+  "meetingSpawnCenter": {
+    "x": 20,
+    "y": 9
+  },
+  "meetingSpawnCenter2": {
+    "x": 20,
+    "y": 9
+  },
+  "spawnRadius": 1.55
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Airship/systems.json b/src/Impostor.Api/Innersloth/Data/maps/Airship/systems.json
new file mode 100644 (file)
index 0000000..e314ea4
--- /dev/null
@@ -0,0 +1,13 @@
+{
+  "Electrical": "SwitchSystem",
+  "MedBay": "MedScanSystem",
+  "Doors": "DoorsSystemType",
+  "Comms": "HudOverrideSystemType",
+  "GapRoom": "MovingPlatformBehaviour",
+  "HeliSabotage": "HeliSabotageSystem",
+  "Decontamination": "ElectricalDoors",
+  "Decontamination2": "AutoDoorsSystemType",
+  "Security": "SecurityCameraSystemType",
+  "Ventilation": "VentilationSystem",
+  "Sabotage": "SabotageSystemType"
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Airship/tasks.json b/src/Impostor.Api/Innersloth/Data/maps/Airship/tasks.json
new file mode 100644 (file)
index 0000000..2029a76
--- /dev/null
@@ -0,0 +1,1131 @@
+{
+  "0": {
+    "type": "NormalPlayerTask",
+    "taskType": "FixWiring",
+    "length": "Common",
+    "consoles": [
+      {
+        "id": 1,
+        "room": "Engine",
+        "position": {
+          "x": -7.021,
+          "y": 1.4909999
+        },
+        "usableDistance": 0.7
+      },
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": -10.290699,
+          "y": -11.334398
+        },
+        "usableDistance": 0.7
+      },
+      {
+        "id": 2,
+        "room": "MainHall",
+        "position": {
+          "x": 16.212,
+          "y": 2.8630004
+        },
+        "usableDistance": 0.7
+      },
+      {
+        "id": 3,
+        "room": "Showers",
+        "position": {
+          "x": 17.0821,
+          "y": 5.481
+        },
+        "usableDistance": 0.7
+      },
+      {
+        "id": 4,
+        "room": "Lounge",
+        "position": {
+          "x": 27.3574,
+          "y": 10.388
+        },
+        "usableDistance": 0.7
+      },
+      {
+        "id": 5,
+        "room": "CargoBay",
+        "position": {
+          "x": 35.154,
+          "y": 3.9129996
+        },
+        "usableDistance": 0.7
+      },
+      {
+        "id": 6,
+        "room": "MeetingRoom",
+        "position": {
+          "x": 14.077001,
+          "y": 16.484999
+        },
+        "usableDistance": 0.7
+      }
+    ]
+  },
+  "1": {
+    "type": "NormalPlayerTask",
+    "taskType": "EnterIdCode",
+    "length": "Common",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Cockpit",
+        "position": {
+          "x": 16.201427,
+          "y": 16.331
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "2": {
+    "type": "NormalPlayerTask",
+    "taskType": "CalibrateDistributor",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 16.346632,
+          "y": -5.4998994
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "3": {
+    "type": "NormalPlayerTask",
+    "taskType": "ResetBreakers",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 17.29,
+          "y": -10.1535
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Electrical",
+        "position": {
+          "x": 20.267416,
+          "y": -10.1535
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 2,
+        "room": "Electrical",
+        "position": {
+          "x": 18.424,
+          "y": -7.7385
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Electrical",
+        "position": {
+          "x": 17.29,
+          "y": -7.7385
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 4,
+        "room": "Electrical",
+        "position": {
+          "x": 12.334001,
+          "y": -7.7385
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 5,
+        "room": "Electrical",
+        "position": {
+          "x": 18.417,
+          "y": -5.3375
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 6,
+        "room": "Electrical",
+        "position": {
+          "x": 15.365001,
+          "y": -7.7385
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "4": {
+    "type": "AirshipUploadTask",
+    "taskType": "UploadData",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": -14.4641,
+          "y": -16.387701
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": 10.4685,
+          "y": -16.218298
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "5": {
+    "type": "AirshipUploadTask",
+    "taskType": "UploadData",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": -14.4641,
+          "y": -16.387701
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": 10.4685,
+          "y": -16.218298
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "6": {
+    "type": "AirshipUploadTask",
+    "taskType": "UploadData",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": -14.4641,
+          "y": -16.387701
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": 10.4685,
+          "y": -16.218298
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "7": {
+    "type": "AirshipUploadTask",
+    "taskType": "UploadData",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": -14.4641,
+          "y": -16.387701
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": 10.4685,
+          "y": -16.218298
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "8": {
+    "type": "AirshipUploadTask",
+    "taskType": "UploadData",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": -14.4641,
+          "y": -16.387701
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": 10.4685,
+          "y": -16.218298
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "9": {
+    "type": "NormalPlayerTask",
+    "taskType": "UnlockSafe",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "CargoBay",
+        "position": {
+          "x": 36.302,
+          "y": -2.688
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "10": {
+    "type": "NormalPlayerTask",
+    "taskType": "StartFans",
+    "length": "Long",
+    "consoles": []
+  },
+  "11": {
+    "type": "NormalPlayerTask",
+    "taskType": "EmptyGarbage",
+    "length": "Long",
+    "consoles": []
+  },
+  "12": {
+    "type": "NormalPlayerTask",
+    "taskType": "EmptyGarbage",
+    "length": "Long",
+    "consoles": []
+  },
+  "13": {
+    "type": "NormalPlayerTask",
+    "taskType": "EmptyGarbage",
+    "length": "Long",
+    "consoles": []
+  },
+  "14": {
+    "type": "NormalPlayerTask",
+    "taskType": "DevelopPhotos",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "MainHall",
+        "position": {
+          "x": 13.527709,
+          "y": 2.3494914
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "15": {
+    "type": "NormalPlayerTask",
+    "taskType": "FuelEngines",
+    "length": "Long",
+    "consoles": []
+  },
+  "16": {
+    "type": "NormalPlayerTask",
+    "taskType": "RewindTapes",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Security",
+        "position": {
+          "x": 8.1305,
+          "y": -11.535298
+        },
+        "usableDistance": 1.4
+      }
+    ]
+  },
+  "17": {
+    "type": "NormalPlayerTask",
+    "taskType": "EmptyGarbage",
+    "length": "Long",
+    "consoles": []
+  },
+  "18": {
+    "type": "NormalPlayerTask",
+    "taskType": "EmptyGarbage",
+    "length": "Long",
+    "consoles": []
+  },
+  "19": {
+    "type": "NormalPlayerTask",
+    "taskType": "PolishRuby",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "VaultRoom",
+        "position": {
+          "x": -8.851499,
+          "y": 9.099999
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "20": {
+    "type": "NormalPlayerTask",
+    "taskType": "StabilizeSteering",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Cockpit",
+        "position": {
+          "x": -19.676998,
+          "y": -0.791
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "21": {
+    "type": "AirshipUploadTask",
+    "taskType": "UploadData",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": -14.4641,
+          "y": -16.387701
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": 10.4685,
+          "y": -16.218298
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "22": {
+    "type": "AirshipUploadTask",
+    "taskType": "UploadData",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": -14.4641,
+          "y": -16.387701
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": 10.4685,
+          "y": -16.218298
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "23": {
+    "type": "AirshipUploadTask",
+    "taskType": "UploadData",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": -14.4641,
+          "y": -16.387701
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": 10.4685,
+          "y": -16.218298
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "24": {
+    "type": "AirshipUploadTask",
+    "taskType": "UploadData",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": -14.4641,
+          "y": -16.387701
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": 10.4685,
+          "y": -16.218298
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "25": {
+    "type": "AirshipUploadTask",
+    "taskType": "UploadData",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": -14.4641,
+          "y": -16.387701
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "ViewingDeck",
+        "position": {
+          "x": 10.4685,
+          "y": -16.218298
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "26": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 17.59529,
+          "y": -3.7142
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "27": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 17.59529,
+          "y": -3.7142
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "28": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 17.59529,
+          "y": -3.7142
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "29": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 17.59529,
+          "y": -3.7142
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "30": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 17.59529,
+          "y": -3.7142
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "31": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 17.59529,
+          "y": -3.7142
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "32": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 17.59529,
+          "y": -3.7142
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "33": {
+    "type": "TowelTask",
+    "taskType": "PickUpTowels",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Showers",
+        "position": {
+          "x": 17.3159,
+          "y": 4.7469535
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Showers",
+        "position": {
+          "x": 20.3819,
+          "y": 4.5709996
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 2,
+        "room": "Showers",
+        "position": {
+          "x": 21.8169,
+          "y": 2.464
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Showers",
+        "position": {
+          "x": 18.848902,
+          "y": -0.90999997
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 4,
+        "room": "Showers",
+        "position": {
+          "x": 24.0359,
+          "y": -2.1839998
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 5,
+        "room": "Showers",
+        "position": {
+          "x": 20.5499,
+          "y": -1.736
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 6,
+        "room": "Showers",
+        "position": {
+          "x": 22.0129,
+          "y": -1.428
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 7,
+        "room": "Showers",
+        "position": {
+          "x": 20.0809,
+          "y": -0.04199996
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 8,
+        "room": "Showers",
+        "position": {
+          "x": 19.1849,
+          "y": 3.3669999
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 9,
+        "room": "Showers",
+        "position": {
+          "x": 22.9649,
+          "y": 0.055999946
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 10,
+        "room": "Showers",
+        "position": {
+          "x": 18.134901,
+          "y": 2.072
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 11,
+        "room": "Showers",
+        "position": {
+          "x": 23.041899,
+          "y": -1.491
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 12,
+        "room": "Showers",
+        "position": {
+          "x": 22.917301,
+          "y": -1.3524001
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 13,
+        "room": "Showers",
+        "position": {
+          "x": 23.1231,
+          "y": -1.4
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 255,
+        "room": "Showers",
+        "position": {
+          "x": 18.7929,
+          "y": 5.138
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "34": {
+    "type": "NormalPlayerTask",
+    "taskType": "CleanToilet",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Lounge",
+        "position": {
+          "x": 29.191824,
+          "y": 7.739511
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Lounge",
+        "position": {
+          "x": 30.808395,
+          "y": 7.7209997
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 2,
+        "room": "Lounge",
+        "position": {
+          "x": 32.320076,
+          "y": 7.764191
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Lounge",
+        "position": {
+          "x": 33.735863,
+          "y": 7.791699
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "35": {
+    "type": "NormalPlayerTask",
+    "taskType": "DressMannequin",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "VaultRoom",
+        "position": {
+          "x": -7.3842983,
+          "y": 6.4301996
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "36": {
+    "type": "NormalPlayerTask",
+    "taskType": "SortRecords",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 5,
+        "room": "Records",
+        "position": {
+          "x": 17.935398,
+          "y": 11.4016
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 6,
+        "room": "Records",
+        "position": {
+          "x": 21.8547,
+          "y": 11.4163
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "Records",
+        "position": {
+          "x": 19.893847,
+          "y": 9.273678
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Records",
+        "position": {
+          "x": 18.687897,
+          "y": 12.503397
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 2,
+        "room": "Records",
+        "position": {
+          "x": 19.2549,
+          "y": 12.7015
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Records",
+        "position": {
+          "x": 20.519602,
+          "y": 12.718999
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 4,
+        "room": "Records",
+        "position": {
+          "x": 21.107098,
+          "y": 12.527897
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 7,
+        "room": "Records",
+        "position": {
+          "x": 21.5992,
+          "y": 7.07
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 8,
+        "room": "Records",
+        "position": {
+          "x": 18.186699,
+          "y": 7.0651
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "37": {
+    "type": "NormalPlayerTask",
+    "taskType": "PutAwayPistols",
+    "length": "Short",
+    "consoles": []
+  },
+  "38": {
+    "type": "NormalPlayerTask",
+    "taskType": "PutAwayRifles",
+    "length": "Short",
+    "consoles": []
+  },
+  "39": {
+    "type": "NormalPlayerTask",
+    "taskType": "Decontaminate",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "MainHall",
+        "position": {
+          "x": 14.791556,
+          "y": 3.7029998
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "Hallway",
+        "position": {
+          "x": 14.791556,
+          "y": 3.7029998
+        },
+        "usableDistance": 0.8
+      }
+    ]
+  },
+  "40": {
+    "type": "NormalPlayerTask",
+    "taskType": "MakeBurger",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Kitchen",
+        "position": {
+          "x": -5.1793,
+          "y": -8.5239
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "41": {
+    "type": "NormalPlayerTask",
+    "taskType": "FixShower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Showers",
+        "position": {
+          "x": 20.8159,
+          "y": 3.2759998
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "42": {
+    "type": "NormalPlayerTask",
+    "taskType": "VentCleaning",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 1,
+        "room": "Cockpit",
+        "position": {
+          "x": -22.098999,
+          "y": -1.5120001
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Engine",
+        "position": {
+          "x": 0.20299996,
+          "y": -2.5361004
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "VaultRoom",
+        "position": {
+          "x": -12.632198,
+          "y": 8.4735
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 4,
+        "room": "Kitchen",
+        "position": {
+          "x": -2.6018999,
+          "y": -9.338
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 2,
+        "room": "ViewingDeck",
+        "position": {
+          "x": -15.658999,
+          "y": -11.6991005
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 8,
+        "room": "GapRoom",
+        "position": {
+          "x": 3.6049998,
+          "y": 6.9230003
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 7,
+        "room": "GapRoom",
+        "position": {
+          "x": 12.663,
+          "y": 5.922
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 5,
+        "room": "MainHall",
+        "position": {
+          "x": 7.0210004,
+          "y": -3.7309995
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 6,
+        "room": "MainHall",
+        "position": {
+          "x": 9.814,
+          "y": 3.2060003
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 9,
+        "room": "Showers",
+        "position": {
+          "x": 23.9869,
+          "y": -1.386
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 10,
+        "room": "Records",
+        "position": {
+          "x": 23.279898,
+          "y": 8.259998
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 11,
+        "room": "CargoBay",
+        "position": {
+          "x": 30.440897,
+          "y": -3.5770001
+        },
+        "usableDistance": 1
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Airship/vents.json b/src/Impostor.Api/Innersloth/Data/maps/Airship/vents.json
new file mode 100644 (file)
index 0000000..e7223cb
--- /dev/null
@@ -0,0 +1,122 @@
+{
+  "0": {
+    "name": "VaultVent",
+    "position": {
+      "x": -12.632198,
+      "y": 8.4735
+    },
+    "left": 1,
+    "center": null,
+    "right": null
+  },
+  "1": {
+    "name": "CockpitVent",
+    "position": {
+      "x": -22.098999,
+      "y": -1.5120001
+    },
+    "left": 0,
+    "center": null,
+    "right": 2
+  },
+  "2": {
+    "name": "EjectionVent",
+    "position": {
+      "x": -15.658999,
+      "y": -11.6991005
+    },
+    "left": 1,
+    "center": null,
+    "right": null
+  },
+  "3": {
+    "name": "EngineVent",
+    "position": {
+      "x": 0.20299996,
+      "y": -2.5361004
+    },
+    "left": 4,
+    "center": null,
+    "right": 5
+  },
+  "4": {
+    "name": "KitchenVent",
+    "position": {
+      "x": -2.6018999,
+      "y": -9.338
+    },
+    "left": 3,
+    "center": null,
+    "right": 5
+  },
+  "5": {
+    "name": "HallwayVent1",
+    "position": {
+      "x": 7.0210004,
+      "y": -3.7309995
+    },
+    "left": 3,
+    "center": null,
+    "right": 4
+  },
+  "6": {
+    "name": "HallwayVent2",
+    "position": {
+      "x": 9.814,
+      "y": 3.2060003
+    },
+    "left": 8,
+    "center": null,
+    "right": 7
+  },
+  "7": {
+    "name": "GaproomVent2",
+    "position": {
+      "x": 12.663,
+      "y": 5.922
+    },
+    "left": 8,
+    "center": null,
+    "right": 6
+  },
+  "8": {
+    "name": "GaproomVent1",
+    "position": {
+      "x": 3.6049998,
+      "y": 6.9230003
+    },
+    "left": 7,
+    "center": null,
+    "right": 6
+  },
+  "9": {
+    "name": "ShowersVent",
+    "position": {
+      "x": 23.9869,
+      "y": -1.386
+    },
+    "left": 10,
+    "center": null,
+    "right": 11
+  },
+  "10": {
+    "name": "RecordsVent",
+    "position": {
+      "x": 23.279898,
+      "y": 8.259998
+    },
+    "left": 9,
+    "center": null,
+    "right": 11
+  },
+  "11": {
+    "name": "StorageVent",
+    "position": {
+      "x": 30.440897,
+      "y": -3.5770001
+    },
+    "left": 9,
+    "center": null,
+    "right": 10
+  }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/April/doors.json b/src/Impostor.Api/Innersloth/Data/maps/April/doors.json
new file mode 100644 (file)
index 0000000..5261988
--- /dev/null
@@ -0,0 +1,93 @@
+{
+  "0": {
+    "room": "Cafeteria",
+    "position": {
+      "x": 6.3936,
+      "y": 1.33848
+    }
+  },
+  "1": {
+    "room": "Storage",
+    "position": {
+      "x": 5.268,
+      "y": -14.2884
+    }
+  },
+  "2": {
+    "room": "UpperEngine",
+    "position": {
+      "x": 16.930801,
+      "y": -2.1276002
+    }
+  },
+  "3": {
+    "room": "Cafeteria",
+    "position": {
+      "x": 0.708,
+      "y": -4.992
+    }
+  },
+  "4": {
+    "room": "LowerEngine",
+    "position": {
+      "x": 14.6808,
+      "y": -11.472
+    }
+  },
+  "5": {
+    "room": "UpperEngine",
+    "position": {
+      "x": 14.676002,
+      "y": 1.3406401
+    }
+  },
+  "6": {
+    "room": "Security",
+    "position": {
+      "x": 14.734801,
+      "y": -5.1417603
+    }
+  },
+  "7": {
+    "room": "Storage",
+    "position": {
+      "x": -1.1316001,
+      "y": -11.98128
+    }
+  },
+  "8": {
+    "room": "Cafeteria",
+    "position": {
+      "x": -5.1432004,
+      "y": 1.3355999
+    }
+  },
+  "9": {
+    "room": "Electrical",
+    "position": {
+      "x": 9.53616,
+      "y": -13.416001
+    }
+  },
+  "10": {
+    "room": "MedBay",
+    "position": {
+      "x": 9.1452,
+      "y": -0.4439999
+    }
+  },
+  "11": {
+    "room": "LowerEngine",
+    "position": {
+      "x": 16.930801,
+      "y": -8.9664
+    }
+  },
+  "12": {
+    "room": "Storage",
+    "position": {
+      "x": 0.70919997,
+      "y": -8.560801
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/April/spawn.json b/src/Impostor.Api/Innersloth/Data/maps/April/spawn.json
new file mode 100644 (file)
index 0000000..b2e69dd
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "initialSpawnCenter": {
+    "x": -0.72,
+    "y": 0.62
+  },
+  "meetingSpawnCenter": {
+    "x": -0.72,
+    "y": 0.62
+  },
+  "meetingSpawnCenter2": {
+    "x": 0,
+    "y": 0
+  },
+  "spawnRadius": 1.6
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/April/systems.json b/src/Impostor.Api/Innersloth/Data/maps/April/systems.json
new file mode 100644 (file)
index 0000000..f3f98a4
--- /dev/null
@@ -0,0 +1,11 @@
+{
+  "Electrical": "SwitchSystem",
+  "MedBay": "MedScanSystem",
+  "Doors": "AutoDoorsSystemType",
+  "Comms": "HudOverrideSystemType",
+  "Security": "SecurityCameraSystemType",
+  "Reactor": "ReactorSystemType",
+  "LifeSupp": "LifeSuppSystemType",
+  "Ventilation": "VentilationSystem",
+  "Sabotage": "SabotageSystemType"
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/April/tasks.json b/src/Impostor.Api/Innersloth/Data/maps/April/tasks.json
new file mode 100644 (file)
index 0000000..2f63f98
--- /dev/null
@@ -0,0 +1,480 @@
+{
+  "0": {
+    "type": "NormalPlayerTask",
+    "taskType": "SwipeCard",
+    "length": "Common",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Admin",
+        "position": {
+          "x": -5.6352005,
+          "y": -8.632801
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "1": {
+    "type": "NormalPlayerTask",
+    "taskType": "FixWiring",
+    "length": "Common",
+    "consoles": [
+      {
+        "id": 2,
+        "room": "Admin",
+        "position": {
+          "x": -1.392,
+          "y": -6.4092
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 4,
+        "room": "Cafeteria",
+        "position": {
+          "x": 5.2811995,
+          "y": 5.2464
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Nav",
+        "position": {
+          "x": -14.5199995,
+          "y": -3.7740002
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 7.7279997,
+          "y": -7.6668
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Storage",
+        "position": {
+          "x": 1.932,
+          "y": -8.7204
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 5,
+        "room": "Security",
+        "position": {
+          "x": 15.5592,
+          "y": -4.5923996
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "2": {
+    "type": "NormalPlayerTask",
+    "taskType": "ClearAsteroids",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Weapons",
+        "position": {
+          "x": -9.087601,
+          "y": 1.812
+        },
+        "usableDistance": 1.2
+      }
+    ]
+  },
+  "3": {
+    "type": "NormalPlayerTask",
+    "taskType": "AlignEngineOutput",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "LowerEngine",
+        "position": {
+          "x": 19.150799,
+          "y": -12.618
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "UpperEngine",
+        "position": {
+          "x": 19.176,
+          "y": -0.41442212
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "4": {
+    "type": "NormalPlayerTask",
+    "taskType": "SubmitScan",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "MedBay",
+        "position": {
+          "x": 7.3284,
+          "y": -5.2476006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "5": {
+    "type": "NormalPlayerTask",
+    "taskType": "InspectSample",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "MedBay",
+        "position": {
+          "x": 6.144,
+          "y": -4.2599998
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "6": {
+    "type": "NormalPlayerTask",
+    "taskType": "FuelEngines",
+    "length": "Long",
+    "consoles": []
+  },
+  "7": {
+    "type": "NormalPlayerTask",
+    "taskType": "StartReactor",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 2,
+        "room": "Reactor",
+        "position": {
+          "x": 21.792,
+          "y": -5.5728
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "8": {
+    "type": "NormalPlayerTask",
+    "taskType": "EmptyChute",
+    "length": "Long",
+    "consoles": []
+  },
+  "9": {
+    "type": "NormalPlayerTask",
+    "taskType": "EmptyGarbage",
+    "length": "Long",
+    "consoles": []
+  },
+  "10": {
+    "type": "UploadDataTask",
+    "taskType": "UploadData",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Admin",
+        "position": {
+          "x": -2.5079997,
+          "y": -6.2652006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "11": {
+    "type": "NormalPlayerTask",
+    "taskType": "CalibrateDistributor",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 5.8644004,
+          "y": -7.4772
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "12": {
+    "type": "NormalPlayerTask",
+    "taskType": "ChartCourse",
+    "length": "Short",
+    "consoles": []
+  },
+  "13": {
+    "type": "NormalPlayerTask",
+    "taskType": "CleanO2Filter",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "LifeSupp",
+        "position": {
+          "x": -5.7432,
+          "y": -2.9772
+        },
+        "usableDistance": 0.8
+      }
+    ]
+  },
+  "14": {
+    "type": "NormalPlayerTask",
+    "taskType": "UnlockManifolds",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 2,
+        "room": "Reactor",
+        "position": {
+          "x": 22.536001,
+          "y": -2.4996
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "15": {
+    "type": "UploadDataTask",
+    "taskType": "UploadData",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Admin",
+        "position": {
+          "x": -2.5079997,
+          "y": -6.2652006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "16": {
+    "type": "NormalPlayerTask",
+    "taskType": "StabilizeSteering",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Nav",
+        "position": {
+          "x": -18.732,
+          "y": -4.728
+        },
+        "usableDistance": 1.25
+      }
+    ]
+  },
+  "17": {
+    "type": "UploadDataTask",
+    "taskType": "UploadData",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Admin",
+        "position": {
+          "x": -2.5079997,
+          "y": -6.2652006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "18": {
+    "type": "NormalPlayerTask",
+    "taskType": "PrimeShields",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Shields",
+        "position": {
+          "x": -7.526399,
+          "y": -13.981199
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "19": {
+    "type": "UploadDataTask",
+    "taskType": "UploadData",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Admin",
+        "position": {
+          "x": -2.5079997,
+          "y": -6.2652006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "20": {
+    "type": "UploadDataTask",
+    "taskType": "UploadData",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Admin",
+        "position": {
+          "x": -2.5079997,
+          "y": -6.2652006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "21": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 9,
+          "y": -7.2936006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "22": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 9,
+          "y": -7.2936006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "23": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 9,
+          "y": -7.2936006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "24": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 9,
+          "y": -7.2936006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "25": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 9,
+          "y": -7.2936006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "26": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 9,
+          "y": -7.2936006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "27": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 9,
+          "y": -7.2936006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "28": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 9,
+          "y": -7.2936006
+        },
+        "usableDistance": 1
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/April/vents.json b/src/Impostor.Api/Innersloth/Data/maps/April/vents.json
new file mode 100644 (file)
index 0000000..93230ae
--- /dev/null
@@ -0,0 +1,142 @@
+{
+  "0": {
+    "name": "AdminVent",
+    "position": {
+      "x": -2.544,
+      "y": -9.955201
+    },
+    "left": 2,
+    "center": null,
+    "right": 1
+  },
+  "1": {
+    "name": "BigYVent",
+    "position": {
+      "x": -9.384,
+      "y": -6.438
+    },
+    "left": 0,
+    "center": null,
+    "right": 2
+  },
+  "2": {
+    "name": "CafeVent",
+    "position": {
+      "x": -4.2588,
+      "y": -0.27600002
+    },
+    "left": 0,
+    "center": null,
+    "right": 1
+  },
+  "3": {
+    "name": "ElecVent",
+    "position": {
+      "x": 9.7764,
+      "y": -8.034
+    },
+    "left": 5,
+    "center": null,
+    "right": 6
+  },
+  "4": {
+    "name": "LEngineVent",
+    "position": {
+      "x": 15.288,
+      "y": 2.52
+    },
+    "left": 11,
+    "center": null,
+    "right": null
+  },
+  "5": {
+    "name": "LifeSuppVent",
+    "position": {
+      "x": 12.534,
+      "y": -6.9492
+    },
+    "left": 6,
+    "center": null,
+    "right": 3
+  },
+  "6": {
+    "name": "MedVent",
+    "position": {
+      "x": 10.608001,
+      "y": -4.176
+    },
+    "left": 5,
+    "center": null,
+    "right": 3
+  },
+  "7": {
+    "name": "WeaponsVent",
+    "position": {
+      "x": -8.820001,
+      "y": 3.3240001
+    },
+    "left": null,
+    "center": null,
+    "right": 12
+  },
+  "8": {
+    "name": "ReactorVent",
+    "position": {
+      "x": 20.796001,
+      "y": -6.9528003
+    },
+    "left": 9,
+    "center": null,
+    "right": null
+  },
+  "9": {
+    "name": "REngineVent",
+    "position": {
+      "x": 15.2508,
+      "y": -13.656001
+    },
+    "left": 8,
+    "center": null,
+    "right": null
+  },
+  "10": {
+    "name": "ShieldsVent",
+    "position": {
+      "x": -9.5232,
+      "y": -14.337601
+    },
+    "left": 13,
+    "center": null,
+    "right": null
+  },
+  "11": {
+    "name": "UpperReactorVent",
+    "position": {
+      "x": 21.876,
+      "y": -3.0516002
+    },
+    "left": 4,
+    "center": null,
+    "right": null
+  },
+  "12": {
+    "name": "NavVentNorth",
+    "position": {
+      "x": -16.008001,
+      "y": -3.1680002
+    },
+    "left": null,
+    "center": null,
+    "right": 7
+  },
+  "13": {
+    "name": "NavVentSouth",
+    "position": {
+      "x": -16.008001,
+      "y": -6.3840003
+    },
+    "left": null,
+    "center": null,
+    "right": 10
+  }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Fungle/doors.json b/src/Impostor.Api/Innersloth/Data/maps/Fungle/doors.json
new file mode 100644 (file)
index 0000000..412ca60
--- /dev/null
@@ -0,0 +1,58 @@
+{
+  "0": {
+    "room": "Comms",
+    "position": {
+      "x": 24.067001,
+      "y": 11.974
+    }
+  },
+  "1": {
+    "room": "Comms",
+    "position": {
+      "x": 18.48,
+      "y": 13.298
+    }
+  },
+  "2": {
+    "room": "Kitchen",
+    "position": {
+      "x": -15.509,
+      "y": -5.913
+    }
+  },
+  "3": {
+    "room": "Laboratory",
+    "position": {
+      "x": -4.3,
+      "y": -7.759
+    }
+  },
+  "4": {
+    "room": "Lookout",
+    "position": {
+      "x": 11.063,
+      "y": 3.1330001
+    }
+  },
+  "5": {
+    "room": "MiningPit",
+    "position": {
+      "x": 12.733,
+      "y": 6.4160004
+    }
+  },
+  "6": {
+    "room": "Reactor",
+    "position": {
+      "x": 19.43,
+      "y": -6.59
+    }
+  },
+  "7": {
+    "room": "Storage",
+    "position": {
+      "x": -1.6159999,
+      "y": 4.6280003
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Fungle/spawn.json b/src/Impostor.Api/Innersloth/Data/maps/Fungle/spawn.json
new file mode 100644 (file)
index 0000000..ba009bf
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "initialSpawnCenter": {
+    "x": -9.81,
+    "y": 1
+  },
+  "meetingSpawnCenter": {
+    "x": -3,
+    "y": -2.1
+  },
+  "meetingSpawnCenter2": {
+    "x": 0,
+    "y": 0
+  },
+  "spawnRadius": 1.5
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Fungle/systems.json b/src/Impostor.Api/Innersloth/Data/maps/Fungle/systems.json
new file mode 100644 (file)
index 0000000..51bc18c
--- /dev/null
@@ -0,0 +1,8 @@
+{
+  "Ventilation": "VentilationSystem",
+  "Comms": "HqHudSystemType",
+  "Reactor": "ReactorSystemType",
+  "Doors": "DoorsSystemType",
+  "MushroomMixupSabotage": "MushroomMixupSabotageSystem",
+  "Sabotage": "SabotageSystemType"
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Fungle/tasks.json b/src/Impostor.Api/Innersloth/Data/maps/Fungle/tasks.json
new file mode 100644 (file)
index 0000000..f9d97a4
--- /dev/null
@@ -0,0 +1,520 @@
+{
+  "0": {
+    "type": "NormalPlayerTask",
+    "taskType": "CollectSamples",
+    "length": "Common",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Laboratory",
+        "position": {
+          "x": -6.373,
+          "y": -8.884999
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "1": {
+    "type": "NormalPlayerTask",
+    "taskType": "EnterIdCode",
+    "length": "Common",
+    "consoles": [
+      {
+        "id": 1,
+        "room": "Lookout",
+        "position": {
+          "x": 8.446,
+          "y": 5.27
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "2": {
+    "type": "NormalPlayerTask",
+    "taskType": "ReplaceParts",
+    "length": "Common",
+    "consoles": []
+  },
+  "3": {
+    "type": "NormalPlayerTask",
+    "taskType": "RoastMarshmallow",
+    "length": "Common",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Beach",
+        "position": {
+          "x": -9.788,
+          "y": 1.641
+        },
+        "usableDistance": 1.35
+      },
+      {
+        "id": 1,
+        "room": "Beach",
+        "position": {
+          "x": -18.372,
+          "y": -3.849
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 2,
+        "room": "Beach",
+        "position": {
+          "x": -20.07,
+          "y": 3.303
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Beach",
+        "position": {
+          "x": -11.333,
+          "y": 7.898
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 4,
+        "room": "Beach",
+        "position": {
+          "x": -9.309,
+          "y": -3.507
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "4": {
+    "type": "NormalPlayerTask",
+    "taskType": "CatchFish",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "FishingDock",
+        "position": {
+          "x": -24.359001,
+          "y": -6.8320003
+        },
+        "usableDistance": 1.28
+      },
+      {
+        "id": 1,
+        "room": "Kitchen",
+        "position": {
+          "x": -12.645,
+          "y": -9.364001
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "5": {
+    "type": "NormalPlayerTask",
+    "taskType": "CollectVegetables",
+    "length": "Long",
+    "consoles": []
+  },
+  "6": {
+    "type": "NormalPlayerTask",
+    "taskType": "ExtractFuel",
+    "length": "Long",
+    "consoles": []
+  },
+  "7": {
+    "type": "NormalPlayerTask",
+    "taskType": "HelpCritter",
+    "length": "Long",
+    "consoles": []
+  },
+  "8": {
+    "type": "NormalPlayerTask",
+    "taskType": "HoistSupplies",
+    "length": "Long",
+    "consoles": []
+  },
+  "9": {
+    "type": "NormalPlayerTask",
+    "taskType": "PolishGem",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "MiningPit",
+        "position": {
+          "x": 14.353,
+          "y": 10.241
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "10": {
+    "type": "NormalPlayerTask",
+    "taskType": "MineOres",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 1,
+        "room": "MiningPit",
+        "position": {
+          "x": 11.076,
+          "y": 10.651
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "11": {
+    "type": "NormalPlayerTask",
+    "taskType": "ReplaceWaterJug",
+    "length": "Long",
+    "consoles": []
+  },
+  "12": {
+    "type": "NormalPlayerTask",
+    "taskType": "WaterPlants",
+    "length": "Long",
+    "consoles": []
+  },
+  "13": {
+    "type": "NormalPlayerTask",
+    "taskType": "AssembleArtifact",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 1,
+        "room": "Laboratory",
+        "position": {
+          "x": -6.2650003,
+          "y": -9.592999
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "14": {
+    "type": "NormalPlayerTask",
+    "taskType": "BuildSandcastle",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 1,
+        "room": "RecRoom",
+        "position": {
+          "x": -21.474998,
+          "y": 0.36600006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "15": {
+    "type": "NormalPlayerTask",
+    "taskType": "CollectShells",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 2,
+        "room": "RecRoom",
+        "position": {
+          "x": -20.28,
+          "y": -2.4299998
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "Beach",
+        "position": {
+          "x": 3.16,
+          "y": 1.51
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Beach",
+        "position": {
+          "x": -7.95,
+          "y": -1.9399999
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Beach",
+        "position": {
+          "x": -3.178,
+          "y": 8.14
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "16": {
+    "type": "NormalPlayerTask",
+    "taskType": "CrankGenerator",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 1,
+        "room": "Comms",
+        "position": {
+          "x": 20.751,
+          "y": 14.603
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "Kitchen",
+        "position": {
+          "x": -12.999001,
+          "y": -6.3429995
+        },
+        "usableDistance": 1.25
+      }
+    ]
+  },
+  "17": {
+    "type": "NormalPlayerTask",
+    "taskType": "EmptyGarbage",
+    "length": "Short",
+    "consoles": []
+  },
+  "18": {
+    "type": "NormalPlayerTask",
+    "taskType": "EmptyGarbage",
+    "length": "Short",
+    "consoles": []
+  },
+  "19": {
+    "type": "NormalPlayerTask",
+    "taskType": "FixAntenna",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Comms",
+        "position": {
+          "x": 23.389,
+          "y": 14.826
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "20": {
+    "type": "NormalPlayerTask",
+    "taskType": "FixWiring",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 4,
+        "room": "Comms",
+        "position": {
+          "x": 19.373001,
+          "y": 14.288
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 2,
+        "room": "Dropship",
+        "position": {
+          "x": -11.108,
+          "y": 13.398
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "21": {
+    "type": "NormalPlayerTask",
+    "taskType": "LiftWeights",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 1,
+        "room": "RecRoom",
+        "position": {
+          "x": -19.151,
+          "y": 0.88100004
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "22": {
+    "type": "NormalPlayerTask",
+    "taskType": "MonitorMushroom",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Jungle",
+        "position": {
+          "x": 12.791,
+          "y": -15.567999
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "23": {
+    "type": "NormalPlayerTask",
+    "taskType": "PlayVideogame",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "SleepingQuarters",
+        "position": {
+          "x": 3.251,
+          "y": -1.0879999
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "24": {
+    "type": "NormalPlayerTask",
+    "taskType": "RecordTemperature",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Greenhouse",
+        "position": {
+          "x": 8.677,
+          "y": -11.279
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Laboratory",
+        "position": {
+          "x": -2.8840003,
+          "y": -7.8939996
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "Reactor",
+        "position": {
+          "x": 23.401001,
+          "y": -6.928
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "25": {
+    "type": "NormalPlayerTask",
+    "taskType": "RecordTemperature",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Greenhouse",
+        "position": {
+          "x": 8.677,
+          "y": -11.279
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Laboratory",
+        "position": {
+          "x": -2.8840003,
+          "y": -7.8939996
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "Reactor",
+        "position": {
+          "x": 23.401001,
+          "y": -6.928
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "26": {
+    "type": "NormalPlayerTask",
+    "taskType": "RecordTemperature",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Greenhouse",
+        "position": {
+          "x": 8.677,
+          "y": -11.279
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Laboratory",
+        "position": {
+          "x": -2.8840003,
+          "y": -7.8939996
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "Reactor",
+        "position": {
+          "x": 23.401001,
+          "y": -6.928
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "27": {
+    "type": "NormalPlayerTask",
+    "taskType": "TestFrisbee",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 1,
+        "room": "RecRoom",
+        "position": {
+          "x": -18.647,
+          "y": -0.88699996
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "28": {
+    "type": "NormalPlayerTask",
+    "taskType": "TuneRadio",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Comms",
+        "position": {
+          "x": 19.62,
+          "y": 12.764
+        },
+        "usableDistance": 1
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Fungle/vents.json b/src/Impostor.Api/Innersloth/Data/maps/Fungle/vents.json
new file mode 100644 (file)
index 0000000..a3567b5
--- /dev/null
@@ -0,0 +1,102 @@
+{
+  "0": {
+    "name": "CommunicationsVent",
+    "position": {
+      "x": 25.220001,
+      "y": 10.965
+    },
+    "left": 2,
+    "center": null,
+    "right": 5
+  },
+  "1": {
+    "name": "KitchenVent",
+    "position": {
+      "x": -15.359,
+      "y": -9.783001
+    },
+    "left": 6,
+    "center": null,
+    "right": null
+  },
+  "2": {
+    "name": "LookoutVent",
+    "position": {
+      "x": 9.366,
+      "y": 0.63
+    },
+    "left": 0,
+    "center": null,
+    "right": 5
+  },
+  "3": {
+    "name": "StorageVent",
+    "position": {
+      "x": 2.864,
+      "y": 0.9180002
+    },
+    "left": 9,
+    "center": null,
+    "right": 4
+  },
+  "4": {
+    "name": "NorthWestJungleVent",
+    "position": {
+      "x": -2.518,
+      "y": -8.986
+    },
+    "left": 8,
+    "center": null,
+    "right": 3
+  },
+  "5": {
+    "name": "NorthEastJungleVent",
+    "position": {
+      "x": 22.677,
+      "y": -8.497
+    },
+    "left": 2,
+    "center": null,
+    "right": 0
+  },
+  "6": {
+    "name": "SouthWestJungleVent",
+    "position": {
+      "x": 1.3000002,
+      "y": -10.515
+    },
+    "left": 1,
+    "center": null,
+    "right": 7
+  },
+  "7": {
+    "name": "SouthEastJungleVent",
+    "position": {
+      "x": 15.150001,
+      "y": -16.42
+    },
+    "left": 6,
+    "center": null,
+    "right": null
+  },
+  "8": {
+    "name": "RecRoomVent",
+    "position": {
+      "x": -16.9,
+      "y": -2.571
+    },
+    "left": 9,
+    "center": null,
+    "right": 4
+  },
+  "9": {
+    "name": "MeetingRoomVent",
+    "position": {
+      "x": -12.233,
+      "y": 8.061
+    },
+    "left": 8,
+    "center": null,
+    "right": 3
+  }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Mira/doors.json b/src/Impostor.Api/Innersloth/Data/maps/Mira/doors.json
new file mode 100644 (file)
index 0000000..9e26dfe
--- /dev/null
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Mira/spawn.json b/src/Impostor.Api/Innersloth/Data/maps/Mira/spawn.json
new file mode 100644 (file)
index 0000000..4fd6e36
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "initialSpawnCenter": {
+    "x": -4.4,
+    "y": 2.2
+  },
+  "meetingSpawnCenter": {
+    "x": 24.043,
+    "y": 1.72
+  },
+  "meetingSpawnCenter2": {
+    "x": 0,
+    "y": 0
+  },
+  "spawnRadius": 1.55
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Mira/systems.json b/src/Impostor.Api/Innersloth/Data/maps/Mira/systems.json
new file mode 100644 (file)
index 0000000..e5aefe9
--- /dev/null
@@ -0,0 +1,9 @@
+{
+  "Electrical": "SwitchSystem",
+  "MedBay": "MedScanSystem",
+  "Comms": "HqHudSystemType",
+  "Reactor": "ReactorSystemType",
+  "LifeSupp": "LifeSuppSystemType",
+  "Ventilation": "VentilationSystem",
+  "Sabotage": "SabotageSystemType"
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Mira/tasks.json b/src/Impostor.Api/Innersloth/Data/maps/Mira/tasks.json
new file mode 100644 (file)
index 0000000..26249c9
--- /dev/null
@@ -0,0 +1,520 @@
+{
+  "0": {
+    "type": "NormalPlayerTask",
+    "taskType": "FixWiring",
+    "length": "Common",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Storage",
+        "position": {
+          "x": 18.39,
+          "y": 1.2
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Hallway",
+        "position": {
+          "x": 12.096,
+          "y": 8.04
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 4,
+        "room": "Laboratory",
+        "position": {
+          "x": 6.125,
+          "y": 14.958
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 2,
+        "room": "LockerRoom",
+        "position": {
+          "x": 4.3559995,
+          "y": 2.5340002
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Greenhouse",
+        "position": {
+          "x": 16.980001,
+          "y": 21.394
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "1": {
+    "type": "NormalPlayerTask",
+    "taskType": "EnterIdCode",
+    "length": "Common",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Admin",
+        "position": {
+          "x": 19.894001,
+          "y": 19.024
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "2": {
+    "type": "NormalPlayerTask",
+    "taskType": "SubmitScan",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "MedBay",
+        "position": {
+          "x": 16.233,
+          "y": 0.262
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "3": {
+    "type": "NormalPlayerTask",
+    "taskType": "ClearAsteroids",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Weapons",
+        "position": {
+          "x": 19.213,
+          "y": -2.414
+        },
+        "usableDistance": 1.8
+      }
+    ]
+  },
+  "4": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Reactor",
+        "position": {
+          "x": 0.77700007,
+          "y": 11.484
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "5": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Reactor",
+        "position": {
+          "x": 0.77700007,
+          "y": 11.484
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "6": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Reactor",
+        "position": {
+          "x": 0.77700007,
+          "y": 11.484
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "7": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Reactor",
+        "position": {
+          "x": 0.77700007,
+          "y": 11.484
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "8": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Reactor",
+        "position": {
+          "x": 0.77700007,
+          "y": 11.484
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "9": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Reactor",
+        "position": {
+          "x": 0.77700007,
+          "y": 11.484
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "10": {
+    "type": "NormalPlayerTask",
+    "taskType": "WaterPlants",
+    "length": "Long",
+    "consoles": []
+  },
+  "11": {
+    "type": "NormalPlayerTask",
+    "taskType": "StartReactor",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Reactor",
+        "position": {
+          "x": 2.549,
+          "y": 12.407001
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "12": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Reactor",
+        "position": {
+          "x": 0.77700007,
+          "y": 11.484
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "13": {
+    "type": "NormalPlayerTask",
+    "taskType": "ChartCourse",
+    "length": "Short",
+    "consoles": []
+  },
+  "14": {
+    "type": "NormalPlayerTask",
+    "taskType": "CleanO2Filter",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Greenhouse",
+        "position": {
+          "x": 17.221,
+          "y": 24.505001
+        },
+        "usableDistance": 2
+      }
+    ]
+  },
+  "15": {
+    "type": "NormalPlayerTask",
+    "taskType": "FuelEngines",
+    "length": "Short",
+    "consoles": []
+  },
+  "16": {
+    "type": "NormalPlayerTask",
+    "taskType": "AssembleArtifact",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 1,
+        "room": "Laboratory",
+        "position": {
+          "x": 9.402,
+          "y": 14.568001
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "17": {
+    "type": "NormalPlayerTask",
+    "taskType": "SortSamples",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Laboratory",
+        "position": {
+          "x": 9.660001,
+          "y": 11.115001
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "18": {
+    "type": "NormalPlayerTask",
+    "taskType": "PrimeShields",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Admin",
+        "position": {
+          "x": 21.169,
+          "y": 17.945
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "19": {
+    "type": "NormalPlayerTask",
+    "taskType": "EmptyGarbage",
+    "length": "Short",
+    "consoles": []
+  },
+  "20": {
+    "type": "NormalPlayerTask",
+    "taskType": "MeasureWeather",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Balcony",
+        "position": {
+          "x": 28.911999,
+          "y": -1.701
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "21": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Reactor",
+        "position": {
+          "x": 0.77700007,
+          "y": 11.484
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "22": {
+    "type": "NormalPlayerTask",
+    "taskType": "BuyBeverage",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 2,
+        "room": "Cafeteria",
+        "position": {
+          "x": 27.49,
+          "y": 5.665
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "23": {
+    "type": "NormalPlayerTask",
+    "taskType": "ProcessData",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 2,
+        "room": "Office",
+        "position": {
+          "x": 15.776001,
+          "y": 21.403
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "24": {
+    "type": "NormalPlayerTask",
+    "taskType": "RunDiagnostics",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Launchpad",
+        "position": {
+          "x": -2.499,
+          "y": 1.8730001
+        },
+        "usableDistance": 1.5
+      }
+    ]
+  },
+  "25": {
+    "type": "NormalPlayerTask",
+    "taskType": "UnlockManifolds",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 2,
+        "room": "Reactor",
+        "position": {
+          "x": 0.44200015,
+          "y": 13.2560005
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "26": {
+    "type": "NormalPlayerTask",
+    "taskType": "VentCleaning",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 11,
+        "room": "Launchpad",
+        "position": {
+          "x": -6.1800003,
+          "y": 3.5600002
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Balcony",
+        "position": {
+          "x": 23.769999,
+          "y": -1.9399999
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 2,
+        "room": "Hallway",
+        "position": {
+          "x": 23.9,
+          "y": 7.1800003
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Reactor",
+        "position": {
+          "x": 0.48000014,
+          "y": 10.6970005
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 4,
+        "room": "Laboratory",
+        "position": {
+          "x": 11.606001,
+          "y": 13.816
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 10,
+        "room": "LockerRoom",
+        "position": {
+          "x": 4.29,
+          "y": 0.52999973
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 6,
+        "room": "Admin",
+        "position": {
+          "x": 22.390001,
+          "y": 17.23
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 5,
+        "room": "Office",
+        "position": {
+          "x": 13.280001,
+          "y": 20.13
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 7,
+        "room": "Greenhouse",
+        "position": {
+          "x": 17.85,
+          "y": 25.23
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 8,
+        "room": "MedBay",
+        "position": {
+          "x": 15.41,
+          "y": -1.8199997
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 9,
+        "room": "Decontamination",
+        "position": {
+          "x": 6.83,
+          "y": 3.145
+        },
+        "usableDistance": 1
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Mira/vents.json b/src/Impostor.Api/Innersloth/Data/maps/Mira/vents.json
new file mode 100644 (file)
index 0000000..a9b1b5a
--- /dev/null
@@ -0,0 +1,112 @@
+{
+  "1": {
+    "name": "BalconyVent",
+    "position": {
+      "x": 23.769999,
+      "y": -1.9399999
+    },
+    "left": 8,
+    "center": null,
+    "right": 2
+  },
+  "2": {
+    "name": "YHallRightVent",
+    "position": {
+      "x": 23.9,
+      "y": 7.1800003
+    },
+    "left": 6,
+    "center": null,
+    "right": 1
+  },
+  "3": {
+    "name": "ReactorVent",
+    "position": {
+      "x": 0.48000014,
+      "y": 10.6970005
+    },
+    "left": 4,
+    "center": 9,
+    "right": 11
+  },
+  "4": {
+    "name": "LabVent",
+    "position": {
+      "x": 11.606001,
+      "y": 13.816
+    },
+    "left": 3,
+    "center": 9,
+    "right": 5
+  },
+  "5": {
+    "name": "OfficeVent",
+    "position": {
+      "x": 13.280001,
+      "y": 20.13
+    },
+    "left": 4,
+    "center": 6,
+    "right": 7
+  },
+  "6": {
+    "name": "AdminVent",
+    "position": {
+      "x": 22.390001,
+      "y": 17.23
+    },
+    "left": 7,
+    "center": 2,
+    "right": 5
+  },
+  "7": {
+    "name": "AgriVent",
+    "position": {
+      "x": 17.85,
+      "y": 25.23
+    },
+    "left": 6,
+    "center": null,
+    "right": 5
+  },
+  "8": {
+    "name": "MedVent",
+    "position": {
+      "x": 15.41,
+      "y": -1.8199997
+    },
+    "left": 1,
+    "center": null,
+    "right": 10
+  },
+  "9": {
+    "name": "DeconVent",
+    "position": {
+      "x": 6.83,
+      "y": 3.145
+    },
+    "left": 3,
+    "center": 10,
+    "right": 4
+  },
+  "10": {
+    "name": "LockerVent",
+    "position": {
+      "x": 4.29,
+      "y": 0.52999973
+    },
+    "left": 8,
+    "center": 11,
+    "right": 9
+  },
+  "11": {
+    "name": "LaunchVent",
+    "position": {
+      "x": -6.1800003,
+      "y": 3.5600002
+    },
+    "left": 3,
+    "center": null,
+    "right": 10
+  }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Polus/doors.json b/src/Impostor.Api/Innersloth/Data/maps/Polus/doors.json
new file mode 100644 (file)
index 0000000..7926b71
--- /dev/null
@@ -0,0 +1,114 @@
+{
+  "0": {
+    "room": "Electrical",
+    "position": {
+      "x": 11.255,
+      "y": -9.4473
+    }
+  },
+  "1": {
+    "room": "Electrical",
+    "position": {
+      "x": 7.4827003,
+      "y": -10.922001
+    }
+  },
+  "2": {
+    "room": "Electrical",
+    "position": {
+      "x": 5.4228,
+      "y": -13.496
+    }
+  },
+  "3": {
+    "room": "LifeSupp",
+    "position": {
+      "x": 5.492,
+      "y": -18.301
+    }
+  },
+  "4": {
+    "room": "LifeSupp",
+    "position": {
+      "x": 5.9068003,
+      "y": -22.348
+    }
+  },
+  "5": {
+    "room": "Weapons",
+    "position": {
+      "x": 13.0322,
+      "y": -20.701
+    }
+  },
+  "6": {
+    "room": "Comms",
+    "position": {
+      "x": 10.8987,
+      "y": -19.159
+    }
+  },
+  "7": {
+    "room": "Office",
+    "position": {
+      "x": 28.757002,
+      "y": -17.0636
+    }
+  },
+  "8": {
+    "room": "Office",
+    "position": {
+      "x": 17.417002,
+      "y": -21.7231
+    }
+  },
+  "9": {
+    "room": "Laboratory",
+    "position": {
+      "x": 26.608002,
+      "y": -8.808
+    }
+  },
+  "10": {
+    "room": "Laboratory",
+    "position": {
+      "x": 24.780003,
+      "y": -9.5651
+    }
+  },
+  "11": {
+    "room": "Storage",
+    "position": {
+      "x": 17.293001,
+      "y": -10.882
+    }
+  },
+  "12": {
+    "room": "Decontamination",
+    "position": {
+      "x": 25.512001,
+      "y": -24.559002
+    }
+  },
+  "13": {
+    "room": "Decontamination",
+    "position": {
+      "x": 23.897001,
+      "y": -23.512001
+    }
+  },
+  "14": {
+    "room": "Decontamination",
+    "position": {
+      "x": 37.992004,
+      "y": -9.6214
+    }
+  },
+  "15": {
+    "room": "Decontamination",
+    "position": {
+      "x": 39.067,
+      "y": -11.361
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Polus/spawn.json b/src/Impostor.Api/Innersloth/Data/maps/Polus/spawn.json
new file mode 100644 (file)
index 0000000..65803be
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "initialSpawnCenter": {
+    "x": 16.64,
+    "y": -2.46
+  },
+  "meetingSpawnCenter": {
+    "x": 17.4,
+    "y": -16.286
+  },
+  "meetingSpawnCenter2": {
+    "x": 17.4,
+    "y": -17.515
+  },
+  "spawnRadius": 1
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Polus/systems.json b/src/Impostor.Api/Innersloth/Data/maps/Polus/systems.json
new file mode 100644 (file)
index 0000000..91d230f
--- /dev/null
@@ -0,0 +1,10 @@
+{
+  "Electrical": "SwitchSystem",
+  "MedBay": "MedScanSystem",
+  "Doors": "DoorsSystemType",
+  "Comms": "HudOverrideSystemType",
+  "Security": "SecurityCameraSystemType",
+  "Ventilation": "VentilationSystem",
+  "Laboratory": "ReactorSystemType",
+  "Sabotage": "SabotageSystemType"
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Polus/tasks.json b/src/Impostor.Api/Innersloth/Data/maps/Polus/tasks.json
new file mode 100644 (file)
index 0000000..ffa7f41
--- /dev/null
@@ -0,0 +1,851 @@
+{
+  "0": {
+    "type": "NormalPlayerTask",
+    "taskType": "SwipeCard",
+    "length": "Common",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Office",
+        "position": {
+          "x": 24.816444,
+          "y": -16.217522
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "1": {
+    "type": "NormalPlayerTask",
+    "taskType": "InsertKeys",
+    "length": "Common",
+    "consoles": [
+      {
+        "id": 2,
+        "room": "Dropship",
+        "position": {
+          "x": 17.38076,
+          "y": 0.08402014
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "2": {
+    "type": "NormalPlayerTask",
+    "taskType": "ScanBoardingPass",
+    "length": "Common",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Office",
+        "position": {
+          "x": 25.75001,
+          "y": -16.03081
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "3": {
+    "type": "NormalPlayerTask",
+    "taskType": "FixWiring",
+    "length": "Common",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": 3.0672798,
+          "y": -8.691476
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "LifeSupp",
+        "position": {
+          "x": 6.499,
+          "y": -18.458
+        },
+        "usableDistance": 0.77
+      },
+      {
+        "id": 2,
+        "room": "Office",
+        "position": {
+          "x": 16.373749,
+          "y": -18.505589
+        },
+        "usableDistance": 0.8
+      },
+      {
+        "id": 3,
+        "room": "Decontamination",
+        "position": {
+          "x": 40.61,
+          "y": -8.96
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 4,
+        "room": "Laboratory",
+        "position": {
+          "x": 37.321003,
+          "y": -8.944
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 5,
+        "room": "Laboratory",
+        "position": {
+          "x": 32.975002,
+          "y": -9.031365
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "4": {
+    "type": "UploadDataTask",
+    "taskType": "UploadData",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Comms",
+        "position": {
+          "x": 11.71978,
+          "y": -15.145192
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "5": {
+    "type": "UploadDataTask",
+    "taskType": "UploadData",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Comms",
+        "position": {
+          "x": 11.71978,
+          "y": -15.145192
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "6": {
+    "type": "UploadDataTask",
+    "taskType": "UploadData",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Comms",
+        "position": {
+          "x": 11.71978,
+          "y": -15.145192
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "7": {
+    "type": "UploadDataTask",
+    "taskType": "UploadData",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Comms",
+        "position": {
+          "x": 11.71978,
+          "y": -15.145192
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "8": {
+    "type": "UploadDataTask",
+    "taskType": "UploadData",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Comms",
+        "position": {
+          "x": 11.71978,
+          "y": -15.145192
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "9": {
+    "type": "NormalPlayerTask",
+    "taskType": "StartReactor",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Specimens",
+        "position": {
+          "x": 34.757774,
+          "y": -18.878536
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "10": {
+    "type": "NormalPlayerTask",
+    "taskType": "FuelEngines",
+    "length": "Long",
+    "consoles": []
+  },
+  "11": {
+    "type": "WaterWayTask",
+    "taskType": "OpenWaterways",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "BoilerRoom",
+        "position": {
+          "x": 3.669,
+          "y": -24.15
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "BoilerRoom",
+        "position": {
+          "x": 0.9430001,
+          "y": -24.15
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 2,
+        "room": "BoilerRoom",
+        "position": {
+          "x": 18.417002,
+          "y": -23.72
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "12": {
+    "type": "NormalPlayerTask",
+    "taskType": "InspectSample",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Hallway",
+        "position": {
+          "x": 36.52848,
+          "y": -5.5693474
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "13": {
+    "type": "NormalPlayerTask",
+    "taskType": "ReplaceWaterJug",
+    "length": "Long",
+    "consoles": []
+  },
+  "14": {
+    "type": "WeatherNodeTask",
+    "taskType": "FixWeatherNode",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Hallway",
+        "position": {
+          "x": 23.04,
+          "y": -6.94
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Hallway",
+        "position": {
+          "x": 8.37,
+          "y": -15.46
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 2,
+        "room": "Hallway",
+        "position": {
+          "x": 7.16,
+          "y": -25.36
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Hallway",
+        "position": {
+          "x": 14.96,
+          "y": -25.44
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 4,
+        "room": "Hallway",
+        "position": {
+          "x": 14.48,
+          "y": -12.17
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 5,
+        "room": "Hallway",
+        "position": {
+          "x": 30.86,
+          "y": -12.23
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "15": {
+    "type": "WeatherNodeTask",
+    "taskType": "FixWeatherNode",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Hallway",
+        "position": {
+          "x": 23.04,
+          "y": -6.94
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Hallway",
+        "position": {
+          "x": 8.37,
+          "y": -15.46
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 2,
+        "room": "Hallway",
+        "position": {
+          "x": 7.16,
+          "y": -25.36
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Hallway",
+        "position": {
+          "x": 14.96,
+          "y": -25.44
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 4,
+        "room": "Hallway",
+        "position": {
+          "x": 14.48,
+          "y": -12.17
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 5,
+        "room": "Hallway",
+        "position": {
+          "x": 30.86,
+          "y": -12.23
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "16": {
+    "type": "WeatherNodeTask",
+    "taskType": "FixWeatherNode",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Hallway",
+        "position": {
+          "x": 23.04,
+          "y": -6.94
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Hallway",
+        "position": {
+          "x": 8.37,
+          "y": -15.46
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 2,
+        "room": "Hallway",
+        "position": {
+          "x": 7.16,
+          "y": -25.36
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Hallway",
+        "position": {
+          "x": 14.96,
+          "y": -25.44
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 4,
+        "room": "Hallway",
+        "position": {
+          "x": 14.48,
+          "y": -12.17
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 5,
+        "room": "Hallway",
+        "position": {
+          "x": 30.86,
+          "y": -12.23
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "17": {
+    "type": "WeatherNodeTask",
+    "taskType": "FixWeatherNode",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Hallway",
+        "position": {
+          "x": 23.04,
+          "y": -6.94
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Hallway",
+        "position": {
+          "x": 8.37,
+          "y": -15.46
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 2,
+        "room": "Hallway",
+        "position": {
+          "x": 7.16,
+          "y": -25.36
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Hallway",
+        "position": {
+          "x": 14.96,
+          "y": -25.44
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 4,
+        "room": "Hallway",
+        "position": {
+          "x": 14.48,
+          "y": -12.17
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 5,
+        "room": "Hallway",
+        "position": {
+          "x": 30.86,
+          "y": -12.23
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "18": {
+    "type": "NormalPlayerTask",
+    "taskType": "RebootWifi",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Comms",
+        "position": {
+          "x": 11.047999,
+          "y": -15.297912
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "19": {
+    "type": "NormalPlayerTask",
+    "taskType": "MonitorOxygen",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Hallway",
+        "position": {
+          "x": 1.654,
+          "y": -16.012001
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "20": {
+    "type": "NormalPlayerTask",
+    "taskType": "UnlockManifolds",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Specimens",
+        "position": {
+          "x": 34.381306,
+          "y": -19.486675
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "21": {
+    "type": "NormalPlayerTask",
+    "taskType": "StoreArtifacts",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Specimens",
+        "position": {
+          "x": 36.481117,
+          "y": -18.82867
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "22": {
+    "type": "NormalPlayerTask",
+    "taskType": "FillCanisters",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "LifeSupp",
+        "position": {
+          "x": 1.1431961,
+          "y": -19.525873
+        },
+        "usableDistance": 0.6
+      }
+    ]
+  },
+  "23": {
+    "type": "NormalPlayerTask",
+    "taskType": "EmptyGarbage",
+    "length": "Short",
+    "consoles": []
+  },
+  "24": {
+    "type": "NormalPlayerTask",
+    "taskType": "ChartCourse",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 2,
+        "room": "Dropship",
+        "position": {
+          "x": 15.974811,
+          "y": 0.08402014
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "25": {
+    "type": "NormalPlayerTask",
+    "taskType": "SubmitScan",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "MedBay",
+        "position": {
+          "x": 40.327003,
+          "y": -7.082
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "26": {
+    "type": "NormalPlayerTask",
+    "taskType": "ClearAsteroids",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Weapons",
+        "position": {
+          "x": 9.929073,
+          "y": -22.390993
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "27": {
+    "type": "WeatherNodeTask",
+    "taskType": "FixWeatherNode",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Hallway",
+        "position": {
+          "x": 23.04,
+          "y": -6.94
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Hallway",
+        "position": {
+          "x": 8.37,
+          "y": -15.46
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 2,
+        "room": "Hallway",
+        "position": {
+          "x": 7.16,
+          "y": -25.36
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Hallway",
+        "position": {
+          "x": 14.96,
+          "y": -25.44
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 4,
+        "room": "Hallway",
+        "position": {
+          "x": 14.48,
+          "y": -12.17
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 5,
+        "room": "Hallway",
+        "position": {
+          "x": 30.86,
+          "y": -12.23
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "28": {
+    "type": "WeatherNodeTask",
+    "taskType": "FixWeatherNode",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Hallway",
+        "position": {
+          "x": 23.04,
+          "y": -6.94
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Hallway",
+        "position": {
+          "x": 8.37,
+          "y": -15.46
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 2,
+        "room": "Hallway",
+        "position": {
+          "x": 7.16,
+          "y": -25.36
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Hallway",
+        "position": {
+          "x": 14.96,
+          "y": -25.44
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 4,
+        "room": "Hallway",
+        "position": {
+          "x": 14.48,
+          "y": -12.17
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 5,
+        "room": "Hallway",
+        "position": {
+          "x": 30.86,
+          "y": -12.23
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "29": {
+    "type": "NormalPlayerTask",
+    "taskType": "AlignTelescope",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Laboratory",
+        "position": {
+          "x": 33.868427,
+          "y": -5.4712653
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "30": {
+    "type": "NormalPlayerTask",
+    "taskType": "RepairDrill",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Laboratory",
+        "position": {
+          "x": 27.42095,
+          "y": -6.982279
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "31": {
+    "type": "NormalPlayerTask",
+    "taskType": "RecordTemperature",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Laboratory",
+        "position": {
+          "x": 31.34464,
+          "y": -6.67142
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "Outside",
+        "position": {
+          "x": 30.93255,
+          "y": -15.324791
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "32": {
+    "type": "NormalPlayerTask",
+    "taskType": "RecordTemperature",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Laboratory",
+        "position": {
+          "x": 31.34464,
+          "y": -6.67142
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "Outside",
+        "position": {
+          "x": 30.93255,
+          "y": -15.324791
+        },
+        "usableDistance": 1
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Polus/vents.json b/src/Impostor.Api/Innersloth/Data/maps/Polus/vents.json
new file mode 100644 (file)
index 0000000..3b0839c
--- /dev/null
@@ -0,0 +1,122 @@
+{
+  "0": {
+    "name": "ElectricalVent",
+    "position": {
+      "x": 1.9289999,
+      "y": -9.558001
+    },
+    "left": 2,
+    "center": null,
+    "right": 1
+  },
+  "1": {
+    "name": "ElecFenceVent",
+    "position": {
+      "x": 6.9,
+      "y": -14.41
+    },
+    "left": 2,
+    "center": null,
+    "right": 0
+  },
+  "2": {
+    "name": "LifeSuppVent",
+    "position": {
+      "x": 3.51,
+      "y": -16.58
+    },
+    "left": 1,
+    "center": null,
+    "right": 0
+  },
+  "3": {
+    "name": "CommsVent",
+    "position": {
+      "x": 12.304,
+      "y": -18.897999
+    },
+    "left": 8,
+    "center": null,
+    "right": 4
+  },
+  "4": {
+    "name": "OfficeVent",
+    "position": {
+      "x": 16.379,
+      "y": -19.599
+    },
+    "left": 3,
+    "center": null,
+    "right": 8
+  },
+  "5": {
+    "name": "AdminVent",
+    "position": {
+      "x": 20.089003,
+      "y": -25.517
+    },
+    "left": 11,
+    "center": null,
+    "right": 7
+  },
+  "6": {
+    "name": "BathroomVent",
+    "position": {
+      "x": 32.963,
+      "y": -9.526
+    },
+    "left": null,
+    "center": null,
+    "right": 7
+  },
+  "7": {
+    "name": "SubBathroomVent",
+    "position": {
+      "x": 30.907003,
+      "y": -11.860001
+    },
+    "left": 6,
+    "center": null,
+    "right": 5
+  },
+  "8": {
+    "name": "StorageVent",
+    "position": {
+      "x": 22,
+      "y": -12.190001
+    },
+    "left": 3,
+    "center": null,
+    "right": 4
+  },
+  "9": {
+    "name": "ScienceBuildingVent",
+    "position": {
+      "x": 23.72,
+      "y": -7.82
+    },
+    "left": 10,
+    "center": null,
+    "right": null
+  },
+  "10": {
+    "name": "ElectricBuildingVent",
+    "position": {
+      "x": 9.64,
+      "y": -7.72
+    },
+    "left": 9,
+    "center": null,
+    "right": null
+  },
+  "11": {
+    "name": "SouthVent",
+    "position": {
+      "x": 18.93,
+      "y": -24.85
+    },
+    "left": null,
+    "center": null,
+    "right": 5
+  }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Skeld/doors.json b/src/Impostor.Api/Innersloth/Data/maps/Skeld/doors.json
new file mode 100644 (file)
index 0000000..39ea239
--- /dev/null
@@ -0,0 +1,93 @@
+{
+  "0": {
+    "room": "Cafeteria",
+    "position": {
+      "x": -6.3936,
+      "y": 1.33848
+    }
+  },
+  "1": {
+    "room": "Storage",
+    "position": {
+      "x": -5.268,
+      "y": -14.2884
+    }
+  },
+  "2": {
+    "room": "UpperEngine",
+    "position": {
+      "x": -16.930801,
+      "y": -2.1276002
+    }
+  },
+  "3": {
+    "room": "Cafeteria",
+    "position": {
+      "x": -0.708,
+      "y": -4.992
+    }
+  },
+  "4": {
+    "room": "LowerEngine",
+    "position": {
+      "x": -14.6808,
+      "y": -11.472
+    }
+  },
+  "5": {
+    "room": "UpperEngine",
+    "position": {
+      "x": -14.676002,
+      "y": 1.3406401
+    }
+  },
+  "6": {
+    "room": "Security",
+    "position": {
+      "x": -14.734801,
+      "y": -5.1417603
+    }
+  },
+  "7": {
+    "room": "Storage",
+    "position": {
+      "x": 1.1316001,
+      "y": -11.98128
+    }
+  },
+  "8": {
+    "room": "Cafeteria",
+    "position": {
+      "x": 5.1432004,
+      "y": 1.3355999
+    }
+  },
+  "9": {
+    "room": "Electrical",
+    "position": {
+      "x": -9.53616,
+      "y": -13.416001
+    }
+  },
+  "10": {
+    "room": "MedBay",
+    "position": {
+      "x": -9.1452,
+      "y": -0.4439999
+    }
+  },
+  "11": {
+    "room": "LowerEngine",
+    "position": {
+      "x": -16.930801,
+      "y": -8.9664
+    }
+  },
+  "12": {
+    "room": "Storage",
+    "position": {
+      "x": -0.70919997,
+      "y": -8.560801
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Skeld/spawn.json b/src/Impostor.Api/Innersloth/Data/maps/Skeld/spawn.json
new file mode 100644 (file)
index 0000000..b2e69dd
--- /dev/null
@@ -0,0 +1,15 @@
+{
+  "initialSpawnCenter": {
+    "x": -0.72,
+    "y": 0.62
+  },
+  "meetingSpawnCenter": {
+    "x": -0.72,
+    "y": 0.62
+  },
+  "meetingSpawnCenter2": {
+    "x": 0,
+    "y": 0
+  },
+  "spawnRadius": 1.6
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Skeld/systems.json b/src/Impostor.Api/Innersloth/Data/maps/Skeld/systems.json
new file mode 100644 (file)
index 0000000..f3f98a4
--- /dev/null
@@ -0,0 +1,11 @@
+{
+  "Electrical": "SwitchSystem",
+  "MedBay": "MedScanSystem",
+  "Doors": "AutoDoorsSystemType",
+  "Comms": "HudOverrideSystemType",
+  "Security": "SecurityCameraSystemType",
+  "Reactor": "ReactorSystemType",
+  "LifeSupp": "LifeSuppSystemType",
+  "Ventilation": "VentilationSystem",
+  "Sabotage": "SabotageSystemType"
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Skeld/tasks.json b/src/Impostor.Api/Innersloth/Data/maps/Skeld/tasks.json
new file mode 100644 (file)
index 0000000..104f891
--- /dev/null
@@ -0,0 +1,613 @@
+{
+  "0": {
+    "type": "NormalPlayerTask",
+    "taskType": "SwipeCard",
+    "length": "Common",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Admin",
+        "position": {
+          "x": 5.6352005,
+          "y": -8.632801
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "1": {
+    "type": "NormalPlayerTask",
+    "taskType": "FixWiring",
+    "length": "Common",
+    "consoles": [
+      {
+        "id": 2,
+        "room": "Admin",
+        "position": {
+          "x": 1.392,
+          "y": -6.4092
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 4,
+        "room": "Cafeteria",
+        "position": {
+          "x": -5.2811995,
+          "y": 5.2464
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Nav",
+        "position": {
+          "x": 14.5199995,
+          "y": -3.7740002
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": -7.7279997,
+          "y": -7.6668
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Storage",
+        "position": {
+          "x": -1.932,
+          "y": -8.7204
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 5,
+        "room": "Security",
+        "position": {
+          "x": -15.5592,
+          "y": -4.5923996
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "2": {
+    "type": "NormalPlayerTask",
+    "taskType": "ClearAsteroids",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Weapons",
+        "position": {
+          "x": 9.087601,
+          "y": 1.812
+        },
+        "usableDistance": 1.2
+      }
+    ]
+  },
+  "3": {
+    "type": "NormalPlayerTask",
+    "taskType": "AlignEngineOutput",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 1,
+        "room": "LowerEngine",
+        "position": {
+          "x": -19.150799,
+          "y": -12.618
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 0,
+        "room": "UpperEngine",
+        "position": {
+          "x": -19.176,
+          "y": -0.41442212
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "4": {
+    "type": "NormalPlayerTask",
+    "taskType": "SubmitScan",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "MedBay",
+        "position": {
+          "x": -7.3284,
+          "y": -5.2476006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "5": {
+    "type": "NormalPlayerTask",
+    "taskType": "InspectSample",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "MedBay",
+        "position": {
+          "x": -6.144,
+          "y": -4.2599998
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "6": {
+    "type": "NormalPlayerTask",
+    "taskType": "FuelEngines",
+    "length": "Long",
+    "consoles": []
+  },
+  "7": {
+    "type": "NormalPlayerTask",
+    "taskType": "StartReactor",
+    "length": "Long",
+    "consoles": [
+      {
+        "id": 2,
+        "room": "Reactor",
+        "position": {
+          "x": -21.792,
+          "y": -5.5728
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "8": {
+    "type": "NormalPlayerTask",
+    "taskType": "EmptyChute",
+    "length": "Long",
+    "consoles": []
+  },
+  "9": {
+    "type": "NormalPlayerTask",
+    "taskType": "EmptyGarbage",
+    "length": "Long",
+    "consoles": []
+  },
+  "10": {
+    "type": "UploadDataTask",
+    "taskType": "UploadData",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Admin",
+        "position": {
+          "x": 2.5079997,
+          "y": -6.2652006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "11": {
+    "type": "NormalPlayerTask",
+    "taskType": "CalibrateDistributor",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": -5.8644004,
+          "y": -7.4772
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "12": {
+    "type": "NormalPlayerTask",
+    "taskType": "ChartCourse",
+    "length": "Short",
+    "consoles": []
+  },
+  "13": {
+    "type": "NormalPlayerTask",
+    "taskType": "CleanO2Filter",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "LifeSupp",
+        "position": {
+          "x": 5.7432,
+          "y": -2.9772
+        },
+        "usableDistance": 0.8
+      }
+    ]
+  },
+  "14": {
+    "type": "NormalPlayerTask",
+    "taskType": "UnlockManifolds",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 2,
+        "room": "Reactor",
+        "position": {
+          "x": -22.536001,
+          "y": -2.4996
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "15": {
+    "type": "UploadDataTask",
+    "taskType": "UploadData",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Admin",
+        "position": {
+          "x": 2.5079997,
+          "y": -6.2652006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "16": {
+    "type": "NormalPlayerTask",
+    "taskType": "StabilizeSteering",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Nav",
+        "position": {
+          "x": 18.732,
+          "y": -4.728
+        },
+        "usableDistance": 1.25
+      }
+    ]
+  },
+  "17": {
+    "type": "UploadDataTask",
+    "taskType": "UploadData",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Admin",
+        "position": {
+          "x": 2.5079997,
+          "y": -6.2652006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "18": {
+    "type": "NormalPlayerTask",
+    "taskType": "PrimeShields",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Shields",
+        "position": {
+          "x": 7.526399,
+          "y": -13.981199
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "19": {
+    "type": "UploadDataTask",
+    "taskType": "UploadData",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Admin",
+        "position": {
+          "x": 2.5079997,
+          "y": -6.2652006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "20": {
+    "type": "UploadDataTask",
+    "taskType": "UploadData",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Admin",
+        "position": {
+          "x": 2.5079997,
+          "y": -6.2652006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "21": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": -9,
+          "y": -7.2936006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "22": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": -9,
+          "y": -7.2936006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "23": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": -9,
+          "y": -7.2936006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "24": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": -9,
+          "y": -7.2936006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "25": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": -9,
+          "y": -7.2936006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "26": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": -9,
+          "y": -7.2936006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "27": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": -9,
+          "y": -7.2936006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "28": {
+    "type": "DivertPowerTask",
+    "taskType": "DivertPower",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Electrical",
+        "position": {
+          "x": -9,
+          "y": -7.2936006
+        },
+        "usableDistance": 1
+      }
+    ]
+  },
+  "29": {
+    "type": "NormalPlayerTask",
+    "taskType": "VentCleaning",
+    "length": "Short",
+    "consoles": [
+      {
+        "id": 0,
+        "room": "Admin",
+        "position": {
+          "x": 2.544,
+          "y": -9.955201
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 2,
+        "room": "Cafeteria",
+        "position": {
+          "x": 4.2588,
+          "y": -0.27600002
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 13,
+        "room": "Nav",
+        "position": {
+          "x": 16.008001,
+          "y": -6.3840003
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 12,
+        "room": "Nav",
+        "position": {
+          "x": 16.008001,
+          "y": -3.1680002
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 7,
+        "room": "Weapons",
+        "position": {
+          "x": 8.820001,
+          "y": 3.3240001
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 10,
+        "room": "Shields",
+        "position": {
+          "x": 9.5232,
+          "y": -14.337601
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 1,
+        "room": "Hallway",
+        "position": {
+          "x": 9.384,
+          "y": -6.438
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 3,
+        "room": "Electrical",
+        "position": {
+          "x": -9.7764,
+          "y": -8.034
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 8,
+        "room": "Reactor",
+        "position": {
+          "x": -20.796001,
+          "y": -6.9528003
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 11,
+        "room": "Reactor",
+        "position": {
+          "x": -21.876,
+          "y": -3.0516002
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 9,
+        "room": "LowerEngine",
+        "position": {
+          "x": -15.2508,
+          "y": -13.656001
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 4,
+        "room": "UpperEngine",
+        "position": {
+          "x": -15.288,
+          "y": 2.52
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 5,
+        "room": "Security",
+        "position": {
+          "x": -12.534,
+          "y": -6.9492
+        },
+        "usableDistance": 1
+      },
+      {
+        "id": 6,
+        "room": "MedBay",
+        "position": {
+          "x": -10.608001,
+          "y": -4.176
+        },
+        "usableDistance": 1
+      }
+    ]
+  }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/Data/maps/Skeld/vents.json b/src/Impostor.Api/Innersloth/Data/maps/Skeld/vents.json
new file mode 100644 (file)
index 0000000..ae73976
--- /dev/null
@@ -0,0 +1,142 @@
+{
+  "0": {
+    "name": "AdminVent",
+    "position": {
+      "x": 2.544,
+      "y": -9.955201
+    },
+    "left": 2,
+    "center": null,
+    "right": 1
+  },
+  "1": {
+    "name": "BigYVent",
+    "position": {
+      "x": 9.384,
+      "y": -6.438
+    },
+    "left": 0,
+    "center": null,
+    "right": 2
+  },
+  "2": {
+    "name": "CafeVent",
+    "position": {
+      "x": 4.2588,
+      "y": -0.27600002
+    },
+    "left": 0,
+    "center": null,
+    "right": 1
+  },
+  "3": {
+    "name": "ElecVent",
+    "position": {
+      "x": -9.7764,
+      "y": -8.034
+    },
+    "left": 5,
+    "center": null,
+    "right": 6
+  },
+  "4": {
+    "name": "LEngineVent",
+    "position": {
+      "x": -15.288,
+      "y": 2.52
+    },
+    "left": 11,
+    "center": null,
+    "right": null
+  },
+  "5": {
+    "name": "SecurityVent",
+    "position": {
+      "x": -12.534,
+      "y": -6.9492
+    },
+    "left": 6,
+    "center": null,
+    "right": 3
+  },
+  "6": {
+    "name": "MedVent",
+    "position": {
+      "x": -10.608001,
+      "y": -4.176
+    },
+    "left": 3,
+    "center": null,
+    "right": 5
+  },
+  "7": {
+    "name": "WeaponsVent",
+    "position": {
+      "x": 8.820001,
+      "y": 3.3240001
+    },
+    "left": null,
+    "center": null,
+    "right": 12
+  },
+  "8": {
+    "name": "ReactorVent",
+    "position": {
+      "x": -20.796001,
+      "y": -6.9528003
+    },
+    "left": null,
+    "center": null,
+    "right": 9
+  },
+  "9": {
+    "name": "REngineVent",
+    "position": {
+      "x": -15.2508,
+      "y": -13.656001
+    },
+    "left": 8,
+    "center": null,
+    "right": null
+  },
+  "10": {
+    "name": "ShieldsVent",
+    "position": {
+      "x": 9.5232,
+      "y": -14.337601
+    },
+    "left": null,
+    "center": null,
+    "right": 13
+  },
+  "11": {
+    "name": "UpperReactorVent",
+    "position": {
+      "x": -21.876,
+      "y": -3.0516002
+    },
+    "left": null,
+    "center": null,
+    "right": 4
+  },
+  "12": {
+    "name": "NavVentNorth",
+    "position": {
+      "x": 16.008001,
+      "y": -3.1680002
+    },
+    "left": 7,
+    "center": null,
+    "right": null
+  },
+  "13": {
+    "name": "NavVentSouth",
+    "position": {
+      "x": 16.008001,
+      "y": -6.3840003
+    },
+    "left": 10,
+    "center": null,
+    "right": null
+  }
+}
\ No newline at end of file
diff --git a/src/Impostor.Api/Innersloth/DisconnectReason.cs b/src/Impostor.Api/Innersloth/DisconnectReason.cs
deleted file mode 100644 (file)
index 21cdc94..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-namespace Impostor.Api.Innersloth
-{
-    public enum DisconnectReason
-    {
-        ExitGame = 0,
-        Destroy = 16,
-
-        // The game you tried to join is full.
-        // Check with the host to see if you can join next round.
-        GameFull = 1,
-
-        // The game you tried to join already started.
-        // Check with the host to see if you can join next round.
-        GameStarted = 2,
-
-        // Could not find the game you're looking for..
-        GameMissing = 3,
-        IncorrectGame = 18,
-
-        // For this a message can be given, specifying an empty message shows
-        // "An unknown error disconnected you from the server."
-        // 4, 12, 13, 14, 15 also count as Custom
-        Custom = 8,
-
-        // You are running an older version of the game.
-        // Please update to play with others.
-        IncorrectVersion = 5,
-
-        // You were banned from { GameCode ?? "the room" }
-        // You cannot rejoin that room.
-        Banned = 6,
-
-        // You were kicked from { GameCode ?? "the room" }
-        // You can rejoin if the room hasn't started.
-        Kicked = 7,
-
-        // You were banned for hacking.
-        // Please stop.
-        Hacking = 10,
-
-        // GameModes.LocalGame:
-        // You disconnected from the host.
-        // If this happens often, check your WiFi strength.
-        //
-        // GameModes.OnlineGame:
-        // You disconnected from the server.
-        // If this happens often, check your network strength.
-        // This may also be a server issue.
-        Error = 17,
-
-        // The server stopped this game. Possibly due to inactivity.
-        ServerRequest = 19,
-
-        // The Among Us servers are overloaded.
-        // Sorry! Please try again later!
-        ServerFull = 20,
-
-        FocusLostBackground = 207,
-
-        // You may not join another game for another { BanMinutesLeft } minutes after intentionally disconnecting.
-        IntentionalLeaving = 208,
-
-        // You were disconnected because Among Us was suspended by another app.
-        FocusLost = 209,
-
-        NewConnection = 210,
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/GameKeywords.cs b/src/Impostor.Api/Innersloth/GameKeywords.cs
deleted file mode 100644 (file)
index b5fae73..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-
-namespace Impostor.Api.Innersloth
-{
-    [Flags]
-    public enum GameKeywords : uint
-    {
-        All = 0,
-        English = 256,
-        SpanishLA = 2,
-        Brazilian = 2048,
-        Portuguese = 16,
-        Korean = 4,
-        Russian = 8,
-        Dutch = 4096,
-        Filipino = 64,
-        French = 8192,
-        German = 16384,
-        Italian = 32768,
-        Japanese = 512,
-        SpanishEU = 1024,
-        Arabic = 32,
-        Polish = 128,
-        SChinese = 65536,
-        TChinese = 131072,
-        Irish = 262144,
-        Other = 1,
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/GameOverReason.cs b/src/Impostor.Api/Innersloth/GameOverReason.cs
deleted file mode 100644 (file)
index 5c30036..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-namespace Impostor.Api.Innersloth
-{
-    public enum GameOverReason : byte
-    {
-        HumansByVote = 0,
-        HumansByTask = 1,
-        ImpostorByVote = 2,
-        ImpostorByKill = 3,
-        ImpostorBySabotage = 4,
-        ImpostorDisconnect = 5,
-        HumansDisconnect = 6,
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/ITask.cs b/src/Impostor.Api/Innersloth/ITask.cs
deleted file mode 100644 (file)
index 114a75c..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-namespace Impostor.Api.Innersloth
-{
-    public interface ITask
-    {
-        int Id { get; }
-
-        string Name { get; }
-
-        TaskTypes Type { get; }
-
-        TaskCategories Category { get; }
-
-        bool IsVisual { get; }
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/IVent.cs b/src/Impostor.Api/Innersloth/IVent.cs
deleted file mode 100644 (file)
index 4c697f6..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-using System.Numerics;
-
-namespace Impostor.Api.Innersloth
-{
-    public interface IVent
-    {
-        int Id { get; }
-
-        string Name { get; }
-
-        Vector2 Position { get; }
-
-        IVent? Left { get; }
-
-        IVent? Center { get; }
-
-        IVent? Right { get; }
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/Language.cs b/src/Impostor.Api/Innersloth/Language.cs
deleted file mode 100644 (file)
index 2b734ba..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-namespace Impostor.Api.Innersloth
-{
-    public enum Language
-    {
-        English,
-        SpanishLA,
-        Brazilian,
-        Portuguese,
-        Korean,
-        Russian,
-        Dutch,
-        Filipino,
-        French,
-        German,
-        Italian,
-        Japanese,
-        SpanishEU,
-    }
-}
index e3a4e8ff93c4e0966bb70bcaf7e86a6f894a5070..59d5ba6c2754de12de410362dd05e75fecb205e4 100644 (file)
@@ -5,11 +5,11 @@ namespace Impostor.Api.Innersloth
     [Flags]
     public enum MapFlags
     {
-        Skeld = 1,
-        MiraHQ = 2,
-        Polus = 4,
-        Airship = 16,
-
-        // 8 is taken by Dleks
+        Skeld = 1 << 0,
+        MiraHQ = 1 << 1,
+        Polus = 1 << 2,
+        Dleks = 1 << 3,
+        Airship = 1 << 4,
+        Fungle = 1 << 5,
     }
 }
index 5de0adb65a57ed9c24e8ef88188328f51aa6f59f..bbb912d1bf36b4a7f3006d67557649f6db86c054 100644 (file)
@@ -5,6 +5,8 @@
         Skeld = 0,
         MiraHQ = 1,
         Polus = 2,
+        Dleks = 3,
         Airship = 4,
+        Fungle = 5,
     }
 }
diff --git a/src/Impostor.Api/Innersloth/Maps/AirshipData.cs b/src/Impostor.Api/Innersloth/Maps/AirshipData.cs
deleted file mode 100644 (file)
index 5ec22ed..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-using System.Collections.Generic;
-using System.Linq;
-using System.Numerics;
-using Impostor.Api.Innersloth.Maps.Tasks;
-using Impostor.Api.Innersloth.Maps.Vents;
-
-namespace Impostor.Api.Innersloth.Maps
-{
-    public class AirshipData : IMapData
-    {
-        private readonly IReadOnlyDictionary<int, IVent> _vents;
-        private readonly IReadOnlyDictionary<int, ITask> _tasks;
-
-        internal AirshipData()
-        {
-            var vents = new[]
-            {
-                new AirshipVent(this, AirshipVent.Ids.Vault, new Vector2(-12.6322f, 8.4735f), left: AirshipVent.Ids.Cockpit),
-                new AirshipVent(this, AirshipVent.Ids.Cockpit, new Vector2(-22.099f, -1.512f), left: AirshipVent.Ids.Vault, right: AirshipVent.Ids.ViewingDeck),
-                new AirshipVent(this, AirshipVent.Ids.ViewingDeck, new Vector2(-15.659f, -11.6991f), left: AirshipVent.Ids.Cockpit),
-                new AirshipVent(this, AirshipVent.Ids.EngineRoom, new Vector2(0.203f, -2.5361f), left: AirshipVent.Ids.Kitchen, right: AirshipVent.Ids.MainHallBottom),
-                new AirshipVent(this, AirshipVent.Ids.Kitchen, new Vector2(-2.6019f, -9.338f), left: AirshipVent.Ids.EngineRoom, right: AirshipVent.Ids.MainHallBottom),
-                new AirshipVent(this, AirshipVent.Ids.MainHallBottom, new Vector2(7.021f, -3.730999f), left: AirshipVent.Ids.EngineRoom, right: AirshipVent.Ids.Kitchen),
-                new AirshipVent(this, AirshipVent.Ids.GapRight, new Vector2(9.814f, 3.206f), left: AirshipVent.Ids.MainHallTop, right: AirshipVent.Ids.GapLeft),
-                new AirshipVent(this, AirshipVent.Ids.GapLeft, new Vector2(12.663f, 5.922f), left: AirshipVent.Ids.MainHallTop, right: AirshipVent.Ids.GapRight),
-                new AirshipVent(this, AirshipVent.Ids.MainHallTop, new Vector2(3.605f, 6.923f), left: AirshipVent.Ids.GapLeft, right: AirshipVent.Ids.GapRight),
-                new AirshipVent(this, AirshipVent.Ids.Showers, new Vector2(23.9869f, -1.386f), left: AirshipVent.Ids.Records, right: AirshipVent.Ids.CargoBay),
-                new AirshipVent(this, AirshipVent.Ids.Records, new Vector2(23.2799f, 8.259998f), left: AirshipVent.Ids.Showers, right: AirshipVent.Ids.CargoBay),
-                new AirshipVent(this, AirshipVent.Ids.CargoBay, new Vector2(30.4409f, -3.577f), left: AirshipVent.Ids.Showers, right: AirshipVent.Ids.Records),
-            };
-
-            Vents = vents.ToDictionary(x => x.Id, x => x).AsReadOnly();
-            _vents = vents.ToDictionary(x => (int)x.Id, x => (IVent)x).AsReadOnly();
-
-            var tasks = new[]
-            {
-                new AirshipTask(AirshipTask.Ids.ElectricalFixWiring, TaskTypes.FixWiring, TaskCategories.CommonTask),
-                new AirshipTask(AirshipTask.Ids.MeetingRoomEnterIDCode, TaskTypes.EnterIdCode, TaskCategories.CommonTask),
-                new AirshipTask(AirshipTask.Ids.ElectricalCalibrateDistributor, TaskTypes.CalibrateDistributor, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.ElectricalResetBreakers, TaskTypes.ResetBreakers, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.VaultRoomDownloadData, TaskTypes.UploadData, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.BrigDownloadData, TaskTypes.UploadData, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.CargoBayDownloadData, TaskTypes.UploadData, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.GapRoomDownloadData, TaskTypes.UploadData, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.RecordsDownloadData, TaskTypes.UploadData, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.CargoBayUnlockSafe, TaskTypes.UnlockSafe, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.VentilationStartFans, TaskTypes.StartFans, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.MainHallEmptyGarbage, TaskTypes.EmptyGarbage, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.MedicalEmptyGarbage, TaskTypes.EmptyGarbage, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.KitchenEmptyGarbage, TaskTypes.EmptyGarbage, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.MainHallDevelopPhotos, TaskTypes.DevelopPhotos, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.CargoBayFuelEngines, TaskTypes.FuelEngines, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.SecurityRewindTapes, TaskTypes.RewindTapes, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.LoungeEmptyGarbage, TaskTypes.EmptyGarbage, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.ShowersEmptyGarbage, TaskTypes.EmptyGarbage, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.VaultRoomPolishRuby, TaskTypes.PolishRuby, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.CockpitStabilizeSteering, TaskTypes.StabilizeSteering, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.ArmoryDownloadData, TaskTypes.UploadData, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.CockpitDownloadData, TaskTypes.UploadData, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.CommsDownloadData, TaskTypes.UploadData, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.MedicalDownloadData, TaskTypes.UploadData, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.ViewingDeckDownloadData, TaskTypes.UploadData, TaskCategories.LongTask),
-                new AirshipTask(AirshipTask.Ids.ElectricalDivertPowerToArmory, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.ElectricalDivertPowerToCockpit, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.ElectricalDivertPowerToGapRoom, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.ElectricalDivertPowerToMainHall, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.ElectricalDivertPowerToMeetingRoom, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.ElectricalDivertPowerToShowers, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.ElectricalDivertPowerToEngine, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.ShowersPickUpTowels, TaskTypes.PickUpTowels, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.LoungeCleanToilet, TaskTypes.CleanToilet, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.VaultRoomDressMannequin, TaskTypes.DressMannequin, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.RecordsSortRecords, TaskTypes.SortRecords, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.ArmoryPutAwayPistols, TaskTypes.PutAwayPistols, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.ArmoryPutAwayRifles, TaskTypes.PutAwayRifles, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.MainHallDecontaminate, TaskTypes.Decontaminate, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.KitchenMakeBurger, TaskTypes.MakeBurger, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.ShowersFixShower, TaskTypes.FixShower, TaskCategories.ShortTask),
-                new AirshipTask(AirshipTask.Ids.CleanVent, TaskTypes.VentCleaning, TaskCategories.ShortTask),
-            };
-
-            Tasks = tasks.ToDictionary(x => x.Id, x => x).AsReadOnly();
-            _tasks = tasks.ToDictionary(x => (int)x.Id, x => (ITask)x).AsReadOnly();
-        }
-
-        public IReadOnlyDictionary<AirshipVent.Ids, AirshipVent> Vents { get; }
-
-        IReadOnlyDictionary<int, IVent> IMapData.Vents => _vents;
-
-        public IReadOnlyDictionary<AirshipTask.Ids, AirshipTask> Tasks { get; }
-
-        IReadOnlyDictionary<int, ITask> IMapData.Tasks => _tasks;
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/Maps/DoorData.cs b/src/Impostor.Api/Innersloth/Maps/DoorData.cs
new file mode 100644 (file)
index 0000000..3adbb15
--- /dev/null
@@ -0,0 +1,19 @@
+using System.Numerics;
+
+namespace Impostor.Api.Innersloth.Maps;
+
+public sealed class DoorData
+{
+    internal DoorData(int id, SystemTypes room, Vector2 position)
+    {
+        Id = id;
+        Room = room;
+        Position = position;
+    }
+
+    public int Id { get; }
+
+    public SystemTypes Room { get; }
+
+    public Vector2 Position { get; }
+}
diff --git a/src/Impostor.Api/Innersloth/Maps/IMapData.cs b/src/Impostor.Api/Innersloth/Maps/IMapData.cs
deleted file mode 100644 (file)
index ce804a0..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-using System.Collections.Generic;
-
-namespace Impostor.Api.Innersloth.Maps
-{
-    public interface IMapData
-    {
-        public static IReadOnlyDictionary<MapTypes, IMapData> Maps { get; } = new Dictionary<MapTypes, IMapData>
-        {
-            [MapTypes.Skeld] = new SkeldData(),
-            [MapTypes.MiraHQ] = new MiraData(),
-            [MapTypes.Polus] = new PolusData(),
-            [MapTypes.Airship] = new AirshipData(),
-        }.AsReadOnly();
-
-        IReadOnlyDictionary<int, IVent> Vents { get; }
-
-        IReadOnlyDictionary<int, ITask> Tasks { get; }
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/Maps/MapData.cs b/src/Impostor.Api/Innersloth/Maps/MapData.cs
new file mode 100644 (file)
index 0000000..4b6e4ee
--- /dev/null
@@ -0,0 +1,34 @@
+using System.Collections.Generic;
+using System.Numerics;
+
+namespace Impostor.Api.Innersloth.Maps;
+
+public abstract class MapData
+{
+    protected internal MapData()
+    {
+    }
+
+    public static IReadOnlyDictionary<MapTypes, MapData> Maps { get; } = new Dictionary<MapTypes, MapData>
+    {
+        [MapTypes.Skeld] = new SkeldData(),
+        [MapTypes.MiraHQ] = new MiraData(),
+        [MapTypes.Polus] = new PolusData(),
+        [MapTypes.Airship] = new AirshipData(),
+        [MapTypes.Fungle] = new FungleData(),
+    }.AsReadOnly();
+
+    public abstract IReadOnlyDictionary<int, VentData> Vents { get; }
+
+    public abstract IReadOnlyDictionary<int, TaskData> Tasks { get; }
+
+    public abstract IReadOnlyDictionary<int, DoorData> Doors { get; }
+
+    public abstract float SpawnRadius { get; }
+
+    public abstract Vector2 InitialSpawnCenter { get; }
+
+    public abstract Vector2 MeetingSpawnCenter { get; }
+
+    public abstract Vector2 MeetingSpawnCenter2 { get; }
+}
diff --git a/src/Impostor.Api/Innersloth/Maps/MiraData.cs b/src/Impostor.Api/Innersloth/Maps/MiraData.cs
deleted file mode 100644 (file)
index 326b94a..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-using System.Collections.Generic;
-using System.Linq;
-using System.Numerics;
-using Impostor.Api.Innersloth.Maps.Tasks;
-using Impostor.Api.Innersloth.Maps.Vents;
-
-namespace Impostor.Api.Innersloth.Maps
-{
-    public class MiraData : IMapData
-    {
-        private readonly IReadOnlyDictionary<int, IVent> _vents;
-        private readonly IReadOnlyDictionary<int, ITask> _tasks;
-
-        internal MiraData()
-        {
-            var vents = new[]
-            {
-                new MiraVent(this, MiraVent.Ids.Balcony, new Vector2(23.77f, -1.94f), left: MiraVent.Ids.Medbay, right: MiraVent.Ids.Cafeteria),
-                new MiraVent(this, MiraVent.Ids.Cafeteria, new Vector2(23.9f, 7.18f), left: MiraVent.Ids.Admin, right: MiraVent.Ids.Balcony),
-                new MiraVent(this, MiraVent.Ids.Reactor, new Vector2(0.4800001f, 10.697f), left: MiraVent.Ids.Laboratory, center: MiraVent.Ids.Decontamination, right: MiraVent.Ids.Launchpad),
-                new MiraVent(this, MiraVent.Ids.Laboratory, new Vector2(11.606f, 13.816f), left: MiraVent.Ids.Reactor, center: MiraVent.Ids.Decontamination, right: MiraVent.Ids.Office),
-                new MiraVent(this, MiraVent.Ids.Office, new Vector2(13.28f, 20.13f), left: MiraVent.Ids.Laboratory, center: MiraVent.Ids.Admin, right: MiraVent.Ids.Greenhouse),
-                new MiraVent(this, MiraVent.Ids.Admin, new Vector2(22.39f, 17.23f), left: MiraVent.Ids.Greenhouse, center: MiraVent.Ids.Cafeteria, right: MiraVent.Ids.Office),
-                new MiraVent(this, MiraVent.Ids.Greenhouse, new Vector2(17.85f, 25.23f), left: MiraVent.Ids.Admin, right: MiraVent.Ids.Office),
-                new MiraVent(this, MiraVent.Ids.Medbay, new Vector2(15.41f, -1.82f), left: MiraVent.Ids.Balcony, right: MiraVent.Ids.LockerRoom),
-                new MiraVent(this, MiraVent.Ids.Decontamination, new Vector2(6.83f, 3.145f), left: MiraVent.Ids.Reactor, center: MiraVent.Ids.LockerRoom, right: MiraVent.Ids.Laboratory),
-                new MiraVent(this, MiraVent.Ids.LockerRoom, new Vector2(4.29f, 0.5299997f), left: MiraVent.Ids.Medbay, center: MiraVent.Ids.Launchpad, right: MiraVent.Ids.Decontamination),
-                new MiraVent(this, MiraVent.Ids.Launchpad, new Vector2(-6.18f, 3.56f), left: MiraVent.Ids.Reactor, right: MiraVent.Ids.LockerRoom),
-            };
-
-            Vents = vents.ToDictionary(x => x.Id, x => x).AsReadOnly();
-            _vents = vents.ToDictionary(x => (int)x.Id, x => (IVent)x).AsReadOnly();
-
-            var tasks = new[]
-            {
-                new MiraTask(MiraTask.Ids.HallwayFixWiring, TaskTypes.FixWiring, TaskCategories.CommonTask),
-                new MiraTask(MiraTask.Ids.AdminEnterIDCode, TaskTypes.EnterIdCode, TaskCategories.CommonTask),
-                new MiraTask(MiraTask.Ids.MedbaySubmitScan, TaskTypes.SubmitScan, TaskCategories.LongTask, true),
-                new MiraTask(MiraTask.Ids.BalconyClearAsteroids, TaskTypes.ClearAsteroids, TaskCategories.LongTask),
-                new MiraTask(MiraTask.Ids.ElectricalDivertPowerToAdmin, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.ElectricalDivertPowerToCafeteria, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.ElectricalDivertPowerToCommunications, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.ElectricalDivertPowerToLaunchpad, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.ElectricalDivertPowerToMedbay, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.ElectricalDivertPowerToOffice, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.StorageWaterPlants, TaskTypes.WaterPlants, TaskCategories.LongTask),
-                new MiraTask(MiraTask.Ids.ReactorStartReactor, TaskTypes.StartReactor, TaskCategories.LongTask),
-                new MiraTask(MiraTask.Ids.ElectricalDivertPowerToGreenhouse, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.AdminChartCourse, TaskTypes.ChartCourse, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.GreenhouseCleanO2Filter, TaskTypes.Filter, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.LaunchpadFuelEngines, TaskTypes.FuelEngines, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.LaboratoryAssembleArtifact, TaskTypes.AssembleArtifact, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.LaboratorySortSamples, TaskTypes.SortSamples, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.AdminPrimeShields, TaskTypes.PrimeShields, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.CafeteriaEmptyGarbage, TaskTypes.EmptyGarbage, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.BalconyMeasureWeather, TaskTypes.MeasureWeather, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.ElectricalDivertPowerToLaboratory, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.CafeteriaBuyBeverage, TaskTypes.BuyBeverage, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.OfficeProcessData, TaskTypes.ProcessData, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.LaunchpadRunDiagnostics, TaskTypes.RunDiagnostics, TaskCategories.LongTask),
-                new MiraTask(MiraTask.Ids.ReactorUnlockManifolds, TaskTypes.UnlockManifolds, TaskCategories.ShortTask),
-                new MiraTask(MiraTask.Ids.CleanVent, TaskTypes.VentCleaning, TaskCategories.ShortTask),
-            };
-
-            Tasks = tasks.ToDictionary(x => x.Id, x => x).AsReadOnly();
-            _tasks = tasks.ToDictionary(x => (int)x.Id, x => (ITask)x).AsReadOnly();
-        }
-
-        public IReadOnlyDictionary<MiraVent.Ids, MiraVent> Vents { get; }
-
-        IReadOnlyDictionary<int, IVent> IMapData.Vents => _vents;
-
-        public IReadOnlyDictionary<MiraTask.Ids, MiraTask> Tasks { get; }
-
-        IReadOnlyDictionary<int, ITask> IMapData.Tasks => _tasks;
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/Maps/PolusData.cs b/src/Impostor.Api/Innersloth/Maps/PolusData.cs
deleted file mode 100644 (file)
index ba73e1a..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-using System.Collections.Generic;
-using System.Linq;
-using System.Numerics;
-using Impostor.Api.Innersloth.Maps.Tasks;
-using Impostor.Api.Innersloth.Maps.Vents;
-
-namespace Impostor.Api.Innersloth.Maps
-{
-    public class PolusData : IMapData
-    {
-        private readonly IReadOnlyDictionary<int, IVent> _vents;
-        private readonly IReadOnlyDictionary<int, ITask> _tasks;
-
-        internal PolusData()
-        {
-            var vents = new[]
-            {
-                new PolusVent(this, PolusVent.Ids.Security, new Vector2(1.929f, -9.558001f), left: PolusVent.Ids.O2, right: PolusVent.Ids.Electrical),
-                new PolusVent(this, PolusVent.Ids.Electrical, new Vector2(6.9f, -14.41f), left: PolusVent.Ids.O2, right: PolusVent.Ids.Security),
-                new PolusVent(this, PolusVent.Ids.O2, new Vector2(3.51f, -16.58f), left: PolusVent.Ids.Electrical, right: PolusVent.Ids.Security),
-                new PolusVent(this, PolusVent.Ids.Communications, new Vector2(12.304f, -18.898f), left: PolusVent.Ids.Storage, right: PolusVent.Ids.Office),
-                new PolusVent(this, PolusVent.Ids.Office, new Vector2(16.379f, -19.599f), left: PolusVent.Ids.Communications, right: PolusVent.Ids.Storage),
-                new PolusVent(this, PolusVent.Ids.Admin, new Vector2(20.089f, -25.517f), left: PolusVent.Ids.OutsideAdmin, right: PolusVent.Ids.Lava),
-                new PolusVent(this, PolusVent.Ids.Laboratory, new Vector2(32.963f, -9.526f), right: PolusVent.Ids.Lava),
-                new PolusVent(this, PolusVent.Ids.Lava, new Vector2(30.907f, -11.86f), left: PolusVent.Ids.Laboratory, right: PolusVent.Ids.Admin),
-                new PolusVent(this, PolusVent.Ids.Storage, new Vector2(22f, -12.19f), left: PolusVent.Ids.Communications, right: PolusVent.Ids.Office),
-                new PolusVent(this, PolusVent.Ids.RightStabilizer, new Vector2(23.72f, -7.82f), left: PolusVent.Ids.LeftStabilizer),
-                new PolusVent(this, PolusVent.Ids.LeftStabilizer, new Vector2(9.64f, -7.72f), left: PolusVent.Ids.RightStabilizer),
-                new PolusVent(this, PolusVent.Ids.OutsideAdmin, new Vector2(18.93f, -24.85f), right: PolusVent.Ids.Admin),
-            };
-
-            Vents = vents.ToDictionary(x => x.Id, x => x).AsReadOnly();
-            _vents = vents.ToDictionary(x => (int)x.Id, x => (IVent)x).AsReadOnly();
-
-            var tasks = new[]
-            {
-                new PolusTask(PolusTask.Ids.OfficeSwipeCard, TaskTypes.SwipeCard, TaskCategories.CommonTask),
-                new PolusTask(PolusTask.Ids.DropshipInsertKeys, TaskTypes.InsertKeys, TaskCategories.CommonTask),
-                new PolusTask(PolusTask.Ids.OfficeScanBoardingPass, TaskTypes.ScanBoardingPass, TaskCategories.CommonTask),
-                new PolusTask(PolusTask.Ids.ElectricalFixWiring, TaskTypes.FixWiring, TaskCategories.CommonTask),
-                new PolusTask(PolusTask.Ids.WeaponsDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask),
-                new PolusTask(PolusTask.Ids.OfficeDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask),
-                new PolusTask(PolusTask.Ids.ElectricalDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask),
-                new PolusTask(PolusTask.Ids.SpecimenRoomDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask),
-                new PolusTask(PolusTask.Ids.O2DownloadData, TaskTypes.UploadData, TaskCategories.ShortTask),
-                new PolusTask(PolusTask.Ids.SpecimenRoomStartReactor, TaskTypes.StartReactor, TaskCategories.LongTask),
-                new PolusTask(PolusTask.Ids.StorageFuelEngines, TaskTypes.FuelEngines, TaskCategories.LongTask),
-                new PolusTask(PolusTask.Ids.BoilerRoomOpenWaterways, TaskTypes.OpenWaterways, TaskCategories.LongTask),
-                new PolusTask(PolusTask.Ids.MedbayInspectSample, TaskTypes.InspectSample, TaskCategories.LongTask),
-                new PolusTask(PolusTask.Ids.BoilerRoomReplaceWaterJug, TaskTypes.ReplaceWaterJug, TaskCategories.LongTask),
-                new PolusTask(PolusTask.Ids.OutsideFixWeatherNodeNode_GI, TaskTypes.ActivateWeatherNodes, TaskCategories.LongTask),
-                new PolusTask(PolusTask.Ids.OutsideFixWeatherNodeNode_IRO, TaskTypes.ActivateWeatherNodes, TaskCategories.LongTask),
-                new PolusTask(PolusTask.Ids.OutsideFixWeatherNodeNode_PD, TaskTypes.ActivateWeatherNodes, TaskCategories.LongTask),
-                new PolusTask(PolusTask.Ids.OutsideFixWeatherNodeNode_TB, TaskTypes.ActivateWeatherNodes, TaskCategories.LongTask),
-                new PolusTask(PolusTask.Ids.CommunicationsRebootWiFi, TaskTypes.RebootWifi, TaskCategories.LongTask),
-                new PolusTask(PolusTask.Ids.O2MonitorTree, TaskTypes.MonitorOxygen, TaskCategories.ShortTask),
-                new PolusTask(PolusTask.Ids.SpecimenRoomUnlockManifolds, TaskTypes.UnlockManifolds, TaskCategories.ShortTask),
-                new PolusTask(PolusTask.Ids.SpecimenRoomStoreArtifacts, TaskTypes.StoreArtifact, TaskCategories.ShortTask),
-                new PolusTask(PolusTask.Ids.O2FillCanisters, TaskTypes.FillCanisters, TaskCategories.ShortTask),
-                new PolusTask(PolusTask.Ids.O2EmptyGarbage, TaskTypes.EmptyGarbage, TaskCategories.ShortTask),
-                new PolusTask(PolusTask.Ids.DropshipChartCourse, TaskTypes.ChartCourse, TaskCategories.ShortTask),
-                new PolusTask(PolusTask.Ids.MedbaySubmitScan, TaskTypes.SubmitScan, TaskCategories.ShortTask, true),
-                new PolusTask(PolusTask.Ids.WeaponsClearAsteroids, TaskTypes.ClearAsteroids, TaskCategories.ShortTask, true),
-                new PolusTask(PolusTask.Ids.OutsideFixWeatherNodeNode_CA, TaskTypes.ActivateWeatherNodes, TaskCategories.LongTask),
-                new PolusTask(PolusTask.Ids.OutsideFixWeatherNodeNode_MLG, TaskTypes.ActivateWeatherNodes, TaskCategories.LongTask),
-                new PolusTask(PolusTask.Ids.LaboratoryAlignTelescope, TaskTypes.AlignTelescope, TaskCategories.ShortTask),
-                new PolusTask(PolusTask.Ids.LaboratoryRepairDrill, TaskTypes.RepairDrill, TaskCategories.ShortTask),
-                new PolusTask(PolusTask.Ids.LaboratoryRecordTemperature, TaskTypes.RecordTemperature, TaskCategories.ShortTask),
-                new PolusTask(PolusTask.Ids.OutsideRecordTemperature, TaskTypes.RecordTemperature, TaskCategories.ShortTask),
-            };
-
-            Tasks = tasks.ToDictionary(x => x.Id, x => x).AsReadOnly();
-            _tasks = tasks.ToDictionary(x => (int)x.Id, x => (ITask)x).AsReadOnly();
-        }
-
-        public IReadOnlyDictionary<PolusVent.Ids, PolusVent> Vents { get; }
-
-        IReadOnlyDictionary<int, IVent> IMapData.Vents => _vents;
-
-        public IReadOnlyDictionary<PolusTask.Ids, PolusTask> Tasks { get; }
-
-        IReadOnlyDictionary<int, ITask> IMapData.Tasks => _tasks;
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/Maps/SkeldData.cs b/src/Impostor.Api/Innersloth/Maps/SkeldData.cs
deleted file mode 100644 (file)
index 617f7e0..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-using System.Collections.Generic;
-using System.Linq;
-using System.Numerics;
-using Impostor.Api.Innersloth.Maps.Tasks;
-using Impostor.Api.Innersloth.Maps.Vents;
-
-namespace Impostor.Api.Innersloth.Maps
-{
-    public class SkeldData : IMapData
-    {
-        private readonly IReadOnlyDictionary<int, IVent> _vents;
-        private readonly IReadOnlyDictionary<int, ITask> _tasks;
-
-        internal SkeldData()
-        {
-            var vents = new[]
-            {
-                new SkeldVent(this, SkeldVent.Ids.Admin, new Vector2(2.544f, -9.955201f), left: SkeldVent.Ids.Cafeteria, right: SkeldVent.Ids.RightHallway),
-                new SkeldVent(this, SkeldVent.Ids.RightHallway, new Vector2(9.384f, -6.438f), left: SkeldVent.Ids.Admin, right: SkeldVent.Ids.Cafeteria),
-                new SkeldVent(this, SkeldVent.Ids.Cafeteria, new Vector2(4.2588f, -0.276f), left: SkeldVent.Ids.Admin, right: SkeldVent.Ids.RightHallway),
-                new SkeldVent(this, SkeldVent.Ids.Electrical, new Vector2(-9.7764f, -8.034f), left: SkeldVent.Ids.Security, right: SkeldVent.Ids.Medbay),
-                new SkeldVent(this, SkeldVent.Ids.UpperEngine, new Vector2(-15.288f, 2.52f), left: SkeldVent.Ids.UpperReactor),
-                new SkeldVent(this, SkeldVent.Ids.Security, new Vector2(-12.534f, -6.9492f), left: SkeldVent.Ids.Medbay, right: SkeldVent.Ids.Electrical),
-                new SkeldVent(this, SkeldVent.Ids.Medbay, new Vector2(-10.608f, -4.176f), left: SkeldVent.Ids.Security, right: SkeldVent.Ids.Electrical),
-                new SkeldVent(this, SkeldVent.Ids.Weapons, new Vector2(8.820001f, 3.324f), right: SkeldVent.Ids.UpperNavigation),
-                new SkeldVent(this, SkeldVent.Ids.LowerReactor, new Vector2(-20.796f, -6.9528f), left: SkeldVent.Ids.LowerEngine),
-                new SkeldVent(this, SkeldVent.Ids.LowerEngine, new Vector2(-15.2508f, -13.656f), left: SkeldVent.Ids.LowerReactor),
-                new SkeldVent(this, SkeldVent.Ids.Shields, new Vector2(9.5232f, -14.3376f), left: SkeldVent.Ids.LowerNavigation),
-                new SkeldVent(this, SkeldVent.Ids.UpperReactor, new Vector2(-21.876f, -3.0516f), left: SkeldVent.Ids.UpperEngine),
-                new SkeldVent(this, SkeldVent.Ids.UpperNavigation, new Vector2(16.008f, -3.168f), right: SkeldVent.Ids.Weapons),
-                new SkeldVent(this, SkeldVent.Ids.LowerNavigation, new Vector2(16.008f, -6.384f), right: SkeldVent.Ids.Shields),
-            };
-
-            Vents = vents.ToDictionary(x => x.Id, x => x).AsReadOnly();
-            _vents = vents.ToDictionary(x => (int)x.Id, x => (IVent)x).AsReadOnly();
-
-            var tasks = new[]
-            {
-                new SkeldTask(SkeldTask.Ids.AdminSwipeCard, TaskTypes.SwipeCard, TaskCategories.CommonTask),
-                new SkeldTask(SkeldTask.Ids.ElectricalFixWiring, TaskTypes.FixWiring, TaskCategories.CommonTask),
-                new SkeldTask(SkeldTask.Ids.WeaponsClearAsteroids, TaskTypes.ClearAsteroids, TaskCategories.LongTask, true),
-                new SkeldTask(SkeldTask.Ids.EnginesAlignEngineOutput, TaskTypes.AlignEngineOutput, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.MedbaySubmitScan, TaskTypes.SubmitScan, TaskCategories.LongTask, true),
-                new SkeldTask(SkeldTask.Ids.MedbayInspectSample, TaskTypes.InspectSample, TaskCategories.LongTask),
-                new SkeldTask(SkeldTask.Ids.StorageFuelEngines, TaskTypes.FuelEngines, TaskCategories.LongTask),
-                new SkeldTask(SkeldTask.Ids.ReactorStartReactor, TaskTypes.StartReactor, TaskCategories.LongTask),
-                new SkeldTask(SkeldTask.Ids.O2EmptyChute, TaskTypes.EmptyChute, TaskCategories.LongTask, true),
-                new SkeldTask(SkeldTask.Ids.CafeteriaEmptyGarbage, TaskTypes.EmptyGarbage, TaskCategories.LongTask, true),
-                new SkeldTask(SkeldTask.Ids.CommunicationsDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.ElectricalCalibrateDistributor, TaskTypes.CalibrateDistributor, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.NavigationChartCourse, TaskTypes.ChartCourse, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.O2CleanO2Filter, TaskTypes.Filter, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.ReactorUnlockManifolds, TaskTypes.UnlockManifolds, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.ElectricalDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.NavigationStabilizeSteering, TaskTypes.StabilizeSteering, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.WeaponsDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.ShieldsPrimeShields, TaskTypes.PrimeShields, TaskCategories.ShortTask, true),
-                new SkeldTask(SkeldTask.Ids.CafeteriaDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.NavigationDownloadData, TaskTypes.UploadData, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToShields, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToWeapons, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToCommunications, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToUpperEngine, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToO2, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToNavigation, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToLowerEngine, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.ElectricalDivertPowerToSecurity, TaskTypes.DivertPower, TaskCategories.ShortTask),
-                new SkeldTask(SkeldTask.Ids.CleanVent, TaskTypes.VentCleaning, TaskCategories.ShortTask),
-            };
-
-            Tasks = tasks.ToDictionary(x => x.Id, x => x).AsReadOnly();
-            _tasks = tasks.ToDictionary(x => (int)x.Id, x => (ITask)x).AsReadOnly();
-        }
-
-        public IReadOnlyDictionary<SkeldVent.Ids, SkeldVent> Vents { get; }
-
-        IReadOnlyDictionary<int, IVent> IMapData.Vents => _vents;
-
-        public IReadOnlyDictionary<SkeldTask.Ids, SkeldTask> Tasks { get; }
-
-        IReadOnlyDictionary<int, ITask> IMapData.Tasks => _tasks;
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/Maps/TaskData.cs b/src/Impostor.Api/Innersloth/Maps/TaskData.cs
new file mode 100644 (file)
index 0000000..176c6fc
--- /dev/null
@@ -0,0 +1,23 @@
+namespace Impostor.Api.Innersloth.Maps;
+
+public sealed class TaskData
+{
+    internal TaskData(int id, TaskTypes type, TaskCategories category, bool isVisual = false)
+    {
+        Id = id;
+        Name = id.ToString();
+        Type = type;
+        Category = category;
+        IsVisual = isVisual;
+    }
+
+    public int Id { get; }
+
+    public string Name { get; }
+
+    public TaskTypes Type { get; }
+
+    public TaskCategories Category { get; }
+
+    public bool IsVisual { get; }
+}
diff --git a/src/Impostor.Api/Innersloth/Maps/Tasks/AirshipTask.cs b/src/Impostor.Api/Innersloth/Maps/Tasks/AirshipTask.cs
deleted file mode 100644 (file)
index 798c4e6..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-namespace Impostor.Api.Innersloth.Maps.Tasks
-{
-    public class AirshipTask : ITask
-    {
-        internal AirshipTask(Ids id, TaskTypes type, TaskCategories category, bool isVisual = false)
-        {
-            Id = id;
-            Name = id.ToString();
-            Type = type;
-            Category = category;
-            IsVisual = isVisual;
-        }
-
-        public enum Ids
-        {
-            ElectricalFixWiring = 0,
-            MeetingRoomEnterIDCode = 1,
-            ElectricalCalibrateDistributor = 2,
-            ElectricalResetBreakers = 3,
-            VaultRoomDownloadData = 4,
-            BrigDownloadData = 5,
-            CargoBayDownloadData = 6,
-            GapRoomDownloadData = 7,
-            RecordsDownloadData = 8,
-            CargoBayUnlockSafe = 9,
-            VentilationStartFans = 10,
-            MainHallEmptyGarbage = 11,
-            MedicalEmptyGarbage = 12,
-            KitchenEmptyGarbage = 13,
-            MainHallDevelopPhotos = 14,
-            CargoBayFuelEngines = 15,
-            SecurityRewindTapes = 16,
-            LoungeEmptyGarbage = 17,
-            ShowersEmptyGarbage = 18,
-            VaultRoomPolishRuby = 19,
-            CockpitStabilizeSteering = 20,
-            ArmoryDownloadData = 21,
-            CockpitDownloadData = 22,
-            CommsDownloadData = 23,
-            MedicalDownloadData = 24,
-            ViewingDeckDownloadData = 25,
-            ElectricalDivertPowerToArmory = 26,
-            ElectricalDivertPowerToCockpit = 27,
-            ElectricalDivertPowerToGapRoom = 28,
-            ElectricalDivertPowerToMainHall = 29,
-            ElectricalDivertPowerToMeetingRoom = 30,
-            ElectricalDivertPowerToShowers = 31,
-            ElectricalDivertPowerToEngine = 32,
-            ShowersPickUpTowels = 33,
-            LoungeCleanToilet = 34,
-            VaultRoomDressMannequin = 35,
-            RecordsSortRecords = 36,
-            ArmoryPutAwayPistols = 37,
-            ArmoryPutAwayRifles = 38,
-            MainHallDecontaminate = 39,
-            KitchenMakeBurger = 40,
-            ShowersFixShower = 41,
-            CleanVent = 42,
-        }
-
-        public Ids Id { get; }
-
-        int ITask.Id => (int)Id;
-
-        public string Name { get; }
-
-        public TaskTypes Type { get; }
-
-        public TaskCategories Category { get; }
-
-        public bool IsVisual { get; }
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/Maps/Tasks/MiraTask.cs b/src/Impostor.Api/Innersloth/Maps/Tasks/MiraTask.cs
deleted file mode 100644 (file)
index b0e2f77..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-namespace Impostor.Api.Innersloth.Maps.Tasks
-{
-    public class MiraTask : ITask
-    {
-        internal MiraTask(Ids id, TaskTypes type, TaskCategories category, bool isVisual = false)
-        {
-            Id = id;
-            Name = id.ToString();
-            Type = type;
-            Category = category;
-            IsVisual = isVisual;
-        }
-
-        public enum Ids
-        {
-            HallwayFixWiring = 0,
-            AdminEnterIDCode = 1,
-            MedbaySubmitScan = 2,
-            BalconyClearAsteroids = 3,
-            ElectricalDivertPowerToAdmin = 4,
-            ElectricalDivertPowerToCafeteria = 5,
-            ElectricalDivertPowerToCommunications = 6,
-            ElectricalDivertPowerToLaunchpad = 7,
-            ElectricalDivertPowerToMedbay = 8,
-            ElectricalDivertPowerToOffice = 9,
-            StorageWaterPlants = 10,
-            ReactorStartReactor = 11,
-            ElectricalDivertPowerToGreenhouse = 12,
-            AdminChartCourse = 13,
-            GreenhouseCleanO2Filter = 14,
-            LaunchpadFuelEngines = 15,
-            LaboratoryAssembleArtifact = 16,
-            LaboratorySortSamples = 17,
-            AdminPrimeShields = 18,
-            CafeteriaEmptyGarbage = 19,
-            BalconyMeasureWeather = 20,
-            ElectricalDivertPowerToLaboratory = 21,
-            CafeteriaBuyBeverage = 22,
-            OfficeProcessData = 23,
-            LaunchpadRunDiagnostics = 24,
-            ReactorUnlockManifolds = 25,
-            CleanVent = 26,
-        }
-
-        public Ids Id { get; }
-
-        int ITask.Id => (int)Id;
-
-        public string Name { get; }
-
-        public TaskTypes Type { get; }
-
-        public TaskCategories Category { get; }
-
-        public bool IsVisual { get; }
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/Maps/Tasks/PolusTask.cs b/src/Impostor.Api/Innersloth/Maps/Tasks/PolusTask.cs
deleted file mode 100644 (file)
index 9c0c3dd..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-namespace Impostor.Api.Innersloth.Maps.Tasks
-{
-    public class PolusTask : ITask
-    {
-        internal PolusTask(Ids id, TaskTypes type, TaskCategories category, bool isVisual = false)
-        {
-            Id = id;
-            Name = id.ToString();
-            Type = type;
-            Category = category;
-            IsVisual = isVisual;
-        }
-
-        public enum Ids
-        {
-            OfficeSwipeCard = 0,
-            DropshipInsertKeys = 1,
-            OfficeScanBoardingPass = 2,
-            ElectricalFixWiring = 3,
-            WeaponsDownloadData = 4,
-            OfficeDownloadData = 5,
-            ElectricalDownloadData = 6,
-            SpecimenRoomDownloadData = 7,
-            O2DownloadData = 8,
-            SpecimenRoomStartReactor = 9,
-            StorageFuelEngines = 10,
-            BoilerRoomOpenWaterways = 11,
-            MedbayInspectSample = 12,
-            BoilerRoomReplaceWaterJug = 13,
-            OutsideFixWeatherNodeNode_GI = 14,
-            OutsideFixWeatherNodeNode_IRO = 15,
-            OutsideFixWeatherNodeNode_PD = 16,
-            OutsideFixWeatherNodeNode_TB = 17,
-            CommunicationsRebootWiFi = 18,
-            O2MonitorTree = 19,
-            SpecimenRoomUnlockManifolds = 20,
-            SpecimenRoomStoreArtifacts = 21,
-            O2FillCanisters = 22,
-            O2EmptyGarbage = 23,
-            DropshipChartCourse = 24,
-            MedbaySubmitScan = 25,
-            WeaponsClearAsteroids = 26,
-            OutsideFixWeatherNodeNode_CA = 27,
-            OutsideFixWeatherNodeNode_MLG = 28,
-            LaboratoryAlignTelescope = 29,
-            LaboratoryRepairDrill = 30,
-            LaboratoryRecordTemperature = 31,
-            OutsideRecordTemperature = 32,
-        }
-
-        public Ids Id { get; }
-
-        int ITask.Id => (int)Id;
-
-        public string Name { get; }
-
-        public TaskTypes Type { get; }
-
-        public TaskCategories Category { get; }
-
-        public bool IsVisual { get; }
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/Maps/Tasks/SkeldTask.cs b/src/Impostor.Api/Innersloth/Maps/Tasks/SkeldTask.cs
deleted file mode 100644 (file)
index 7427044..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-namespace Impostor.Api.Innersloth.Maps.Tasks
-{
-    public class SkeldTask : ITask
-    {
-        internal SkeldTask(Ids id, TaskTypes type, TaskCategories category, bool isVisual = false)
-        {
-            Id = id;
-            Name = id.ToString();
-            Type = type;
-            Category = category;
-            IsVisual = isVisual;
-        }
-
-        public enum Ids
-        {
-            AdminSwipeCard = 0,
-            ElectricalFixWiring = 1,
-            WeaponsClearAsteroids = 2,
-            EnginesAlignEngineOutput = 3,
-            MedbaySubmitScan = 4,
-            MedbayInspectSample = 5,
-            StorageFuelEngines = 6,
-            ReactorStartReactor = 7,
-            O2EmptyChute = 8,
-            CafeteriaEmptyGarbage = 9,
-            CommunicationsDownloadData = 10,
-            ElectricalCalibrateDistributor = 11,
-            NavigationChartCourse = 12,
-            O2CleanO2Filter = 13,
-            ReactorUnlockManifolds = 14,
-            ElectricalDownloadData = 15,
-            NavigationStabilizeSteering = 16,
-            WeaponsDownloadData = 17,
-            ShieldsPrimeShields = 18,
-            CafeteriaDownloadData = 19,
-            NavigationDownloadData = 20,
-            ElectricalDivertPowerToShields = 21,
-            ElectricalDivertPowerToWeapons = 22,
-            ElectricalDivertPowerToCommunications = 23,
-            ElectricalDivertPowerToUpperEngine = 24,
-            ElectricalDivertPowerToO2 = 25,
-            ElectricalDivertPowerToNavigation = 26,
-            ElectricalDivertPowerToLowerEngine = 27,
-            ElectricalDivertPowerToSecurity = 28,
-            CleanVent = 29,
-        }
-
-        public Ids Id { get; }
-
-        int ITask.Id => (int)Id;
-
-        public string Name { get; }
-
-        public TaskTypes Type { get; }
-
-        public TaskCategories Category { get; }
-
-        public bool IsVisual { get; }
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/Maps/VentData.cs b/src/Impostor.Api/Innersloth/Maps/VentData.cs
new file mode 100644 (file)
index 0000000..216fb9c
--- /dev/null
@@ -0,0 +1,36 @@
+using System;
+using System.Numerics;
+
+namespace Impostor.Api.Innersloth.Maps;
+
+public class VentData
+{
+    private readonly Lazy<VentData>? _left;
+
+    private readonly Lazy<VentData>? _center;
+
+    private readonly Lazy<VentData>? _right;
+
+    internal VentData(MapData data, int id, string name, Vector2 position, int? left = null, int? center = null, int? right = null)
+    {
+        Id = id;
+        Name = name;
+        Position = position;
+
+        _left = left == null ? null : new Lazy<VentData>(() => data.Vents[left.Value]);
+        _center = center == null ? null : new Lazy<VentData>(() => data.Vents[center.Value]);
+        _right = right == null ? null : new Lazy<VentData>(() => data.Vents[right.Value]);
+    }
+
+    public int Id { get; }
+
+    public string Name { get; }
+
+    public Vector2 Position { get; }
+
+    public VentData? Left => _left?.Value;
+
+    public VentData? Center => _center?.Value;
+
+    public VentData? Right => _right?.Value;
+}
diff --git a/src/Impostor.Api/Innersloth/Maps/Vents/AirshipVent.cs b/src/Impostor.Api/Innersloth/Maps/Vents/AirshipVent.cs
deleted file mode 100644 (file)
index 3314692..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-using System;
-using System.Numerics;
-
-namespace Impostor.Api.Innersloth.Maps.Vents
-{
-    public class AirshipVent : IVent
-    {
-        private readonly Lazy<AirshipVent>? _left;
-
-        private readonly Lazy<AirshipVent>? _center;
-
-        private readonly Lazy<AirshipVent>? _right;
-
-        internal AirshipVent(AirshipData data, Ids id, Vector2 position, Ids? left = null, Ids? center = null, Ids? right = null)
-        {
-            Id = id;
-            Name = id.ToString();
-            Position = position;
-
-            _left = left == null ? null : new Lazy<AirshipVent>(() => data.Vents[left.Value]);
-            _center = center == null ? null : new Lazy<AirshipVent>(() => data.Vents[center.Value]);
-            _right = right == null ? null : new Lazy<AirshipVent>(() => data.Vents[right.Value]);
-        }
-
-        public enum Ids
-        {
-            Vault = 0,
-            Cockpit = 1,
-            ViewingDeck = 2,
-            EngineRoom = 3,
-            Kitchen = 4,
-            MainHallBottom = 5,
-            GapRight = 6,
-            GapLeft = 7,
-            MainHallTop = 8,
-            Showers = 9,
-            Records = 10,
-            CargoBay = 11,
-        }
-
-        public Ids Id { get; }
-
-        int IVent.Id => (int)Id;
-
-        public string Name { get; }
-
-        public Vector2 Position { get; }
-
-        public AirshipVent? Left => _left?.Value;
-
-        IVent? IVent.Left => Left;
-
-        public AirshipVent? Center => _center?.Value;
-
-        IVent? IVent.Center => Center;
-
-        public AirshipVent? Right => _right?.Value;
-
-        IVent? IVent.Right => Right;
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/Maps/Vents/MiraVent.cs b/src/Impostor.Api/Innersloth/Maps/Vents/MiraVent.cs
deleted file mode 100644 (file)
index 81daddb..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-using System;
-using System.Numerics;
-
-namespace Impostor.Api.Innersloth.Maps.Vents
-{
-    public class MiraVent : IVent
-    {
-        private readonly Lazy<MiraVent>? _left;
-
-        private readonly Lazy<MiraVent>? _center;
-
-        private readonly Lazy<MiraVent>? _right;
-
-        internal MiraVent(MiraData data, Ids id, Vector2 position, Ids? left = null, Ids? center = null, Ids? right = null)
-        {
-            Id = id;
-            Name = id.ToString();
-            Position = position;
-
-            _left = left == null ? null : new Lazy<MiraVent>(() => data.Vents[left.Value]);
-            _center = center == null ? null : new Lazy<MiraVent>(() => data.Vents[center.Value]);
-            _right = right == null ? null : new Lazy<MiraVent>(() => data.Vents[right.Value]);
-        }
-
-        public enum Ids
-        {
-            Balcony = 1,
-            Cafeteria = 2,
-            Reactor = 3,
-            Laboratory = 4,
-            Office = 5,
-            Admin = 6,
-            Greenhouse = 7,
-            Medbay = 8,
-            Decontamination = 9,
-            LockerRoom = 10,
-            Launchpad = 11,
-        }
-
-        public Ids Id { get; }
-
-        int IVent.Id => (int)Id;
-
-        public string Name { get; }
-
-        public Vector2 Position { get; }
-
-        public MiraVent? Left => _left?.Value;
-
-        IVent? IVent.Left => Left;
-
-        public MiraVent? Center => _center?.Value;
-
-        IVent? IVent.Center => Center;
-
-        public MiraVent? Right => _right?.Value;
-
-        IVent? IVent.Right => Right;
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/Maps/Vents/PolusVent.cs b/src/Impostor.Api/Innersloth/Maps/Vents/PolusVent.cs
deleted file mode 100644 (file)
index 54b542a..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-using System;
-using System.Numerics;
-
-namespace Impostor.Api.Innersloth.Maps.Vents
-{
-    public class PolusVent : IVent
-    {
-        private readonly Lazy<PolusVent>? _left;
-
-        private readonly Lazy<PolusVent>? _center;
-
-        private readonly Lazy<PolusVent>? _right;
-
-        internal PolusVent(PolusData data, Ids id, Vector2 position, Ids? left = null, Ids? center = null, Ids? right = null)
-        {
-            Id = id;
-            Name = id.ToString();
-            Position = position;
-
-            _left = left == null ? null : new Lazy<PolusVent>(() => data.Vents[left.Value]);
-            _center = center == null ? null : new Lazy<PolusVent>(() => data.Vents[center.Value]);
-            _right = right == null ? null : new Lazy<PolusVent>(() => data.Vents[right.Value]);
-        }
-
-        public enum Ids
-        {
-            Security = 0,
-            Electrical = 1,
-            O2 = 2,
-            Communications = 3,
-            Office = 4,
-            Admin = 5,
-            Laboratory = 6,
-            Lava = 7,
-            Storage = 8,
-            RightStabilizer = 9,
-            LeftStabilizer = 10,
-            OutsideAdmin = 11,
-        }
-
-        public Ids Id { get; }
-
-        int IVent.Id => (int)Id;
-
-        public string Name { get; }
-
-        public Vector2 Position { get; }
-
-        public PolusVent? Left => _left?.Value;
-
-        IVent? IVent.Left => Left;
-
-        public PolusVent? Center => _center?.Value;
-
-        IVent? IVent.Center => Center;
-
-        public PolusVent? Right => _right?.Value;
-
-        IVent? IVent.Right => Right;
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/Maps/Vents/SkeldVent.cs b/src/Impostor.Api/Innersloth/Maps/Vents/SkeldVent.cs
deleted file mode 100644 (file)
index 747b6fd..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-using System;
-using System.Numerics;
-
-namespace Impostor.Api.Innersloth.Maps.Vents
-{
-    public class SkeldVent : IVent
-    {
-        private readonly Lazy<SkeldVent>? _left;
-
-        private readonly Lazy<SkeldVent>? _center;
-
-        private readonly Lazy<SkeldVent>? _right;
-
-        internal SkeldVent(SkeldData data, Ids id, Vector2 position, Ids? left = null, Ids? center = null, Ids? right = null)
-        {
-            Id = id;
-            Name = id.ToString();
-            Position = position;
-
-            _left = left == null ? null : new Lazy<SkeldVent>(() => data.Vents[left.Value]);
-            _center = center == null ? null : new Lazy<SkeldVent>(() => data.Vents[center.Value]);
-            _right = right == null ? null : new Lazy<SkeldVent>(() => data.Vents[right.Value]);
-        }
-
-        public enum Ids
-        {
-            Admin = 0,
-            RightHallway = 1,
-            Cafeteria = 2,
-            Electrical = 3,
-            UpperEngine = 4,
-            Security = 5,
-            Medbay = 6,
-            Weapons = 7,
-            LowerReactor = 8,
-            LowerEngine = 9,
-            Shields = 10,
-            UpperReactor = 11,
-            UpperNavigation = 12,
-            LowerNavigation = 13,
-        }
-
-        public Ids Id { get; }
-
-        int IVent.Id => (int)Id;
-
-        public string Name { get; }
-
-        public Vector2 Position { get; }
-
-        public SkeldVent? Left => _left?.Value;
-
-        IVent? IVent.Left => Left;
-
-        public SkeldVent? Center => _center?.Value;
-
-        IVent? IVent.Center => Center;
-
-        public SkeldVent? Right => _right?.Value;
-
-        IVent? IVent.Right => Right;
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/Platforms.cs b/src/Impostor.Api/Innersloth/Platforms.cs
deleted file mode 100644 (file)
index c1b3b09..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-namespace Impostor.Api.Innersloth
-{
-    public enum Platforms
-    {
-        Unknown = 0,
-        StandaloneEpicPC = 1,
-        StandaloneSteamPC = 2,
-        StandaloneMac = 3,
-        StandaloneWin10 = 4,
-        StandaloneItch = 5,
-        IPhone = 6,
-        Android = 7,
-        Switch = 8,
-        Xbox = 9,
-        Playstation = 10,
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/RoleTypes.cs b/src/Impostor.Api/Innersloth/RoleTypes.cs
deleted file mode 100644 (file)
index 700d27a..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-namespace Impostor.Api.Innersloth
-{
-    public enum RoleTypes : ushort
-    {
-        Crewmate,
-        Impostor,
-        Scientist,
-        Engineer,
-        GuardianAngel,
-        Shapeshifter,
-        CrewmateGhost,
-        ImpostorGhost,
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/SystemTypes.cs b/src/Impostor.Api/Innersloth/SystemTypes.cs
deleted file mode 100644 (file)
index 95864a8..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-namespace Impostor.Api.Innersloth
-{
-    public enum SystemTypes : byte
-    {
-        Hallway = 0,
-
-        Storage = 1,
-
-        Cafeteria = 2,
-
-        Reactor = 3,
-
-        UpperEngine = 4,
-
-        Nav = 5,
-
-        Admin = 6,
-
-        Electrical = 7,
-
-        LifeSupp = 8,
-
-        Shields = 9,
-
-        MedBay = 10,
-
-        Security = 11,
-
-        Weapons = 12,
-
-        LowerEngine = 13,
-
-        Comms = 14,
-
-        ShipTasks = 15,
-
-        Doors = 16,
-
-        Sabotage = 17,
-
-        /// <remarks>The only decontamination on Mira and bottom decontamination on Polus.</remarks>
-        Decontamination = 18,
-
-        Launchpad = 19,
-
-        LockerRoom = 20,
-
-        Laboratory = 21,
-
-        Balcony = 22,
-
-        Office = 23,
-
-        Greenhouse = 24,
-
-        Dropship = 25,
-
-        /// <remarks>Top decontamination on Polus.</remarks>
-        Decontamination2 = 26,
-
-        Outside = 27,
-
-        Specimens = 28,
-
-        BoilerRoom = 29,
-
-        VaultRoom = 30,
-
-        Cockpit = 31,
-
-        Armory = 32,
-
-        Kitchen = 33,
-
-        ViewingDeck = 34,
-
-        HallOfPortraits = 35,
-
-        CargoBay = 36,
-
-        Ventilation = 37,
-
-        Showers = 38,
-
-        Engine = 39,
-
-        Brig = 40,
-
-        MeetingRoom = 41,
-
-        Records = 42,
-
-        Lounge = 43,
-
-        GapRoom = 44,
-
-        MainHall = 45,
-
-        Medical = 46,
-    }
-}
diff --git a/src/Impostor.Api/Innersloth/TaskTypes.cs b/src/Impostor.Api/Innersloth/TaskTypes.cs
deleted file mode 100644 (file)
index f5c056c..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-namespace Impostor.Api.Innersloth
-{
-    public enum TaskTypes : uint
-    {
-        SubmitScan = 0,
-        PrimeShields = 1,
-        FuelEngines = 2,
-        ChartCourse = 3,
-        StartReactor = 4,
-        SwipeCard = 5,
-        ClearAsteroids = 6,
-        UploadData = 7,
-        InspectSample = 8,
-        EmptyChute = 9,
-        EmptyGarbage = 10,
-        AlignEngineOutput = 11,
-        FixWiring = 12,
-        CalibrateDistributor = 13,
-        DivertPower = 14,
-        UnlockManifolds = 15,
-        ResetReactor = 16,
-        FixLights = 17,
-        Filter = 18,
-        FixComms = 19,
-        RestoreOxy = 20,
-        StabilizeSteering = 21,
-        AssembleArtifact = 22,
-        SortSamples = 23,
-        MeasureWeather = 24,
-        EnterIdCode = 25,
-        BuyBeverage = 26,
-        ProcessData = 27,
-        RunDiagnostics = 28,
-        WaterPlants = 29,
-        MonitorOxygen = 30,
-        StoreArtifact = 31,
-        FillCanisters = 32,
-        ActivateWeatherNodes = 33,
-        InsertKeys = 34,
-        ResetSeismic = 35,
-        ScanBoardingPass = 36,
-        OpenWaterways = 37,
-        ReplaceWaterJug = 38,
-        RepairDrill = 39,
-        AlignTelescope = 40,
-        RecordTemperature = 41,
-        RebootWifi = 42,
-        PolishRuby = 43,
-        ResetBreakers = 44,
-        Decontaminate = 45,
-        MakeBurger = 46,
-        UnlockSafe = 47,
-        SortRecords = 48,
-        PutAwayPistols = 49,
-        FixShower = 50,
-        CleanToilet = 51,
-        DressMannequin = 52,
-        PickUpTowels = 53,
-        RewindTapes = 54,
-        StartFans = 55,
-        DevelopPhotos = 56,
-        GetBiggolSword = 57,
-        PutAwayRifles = 58,
-        StopCharles = 59,
-        VentCleaning = 60,
-    }
-}
index 95a56d2c07b5ef59c1d7b4839cf9f1583610f3fe..62807b8423ebeb618cd375d808ad18775bc08e17 100644 (file)
@@ -1,5 +1,5 @@
 using System.Threading.Tasks;
-using Impostor.Api.Innersloth;
+using Impostor.Api.Innersloth.Maps;
 
 namespace Impostor.Api.Net.Inner.Objects
 {
@@ -7,7 +7,7 @@ namespace Impostor.Api.Net.Inner.Objects
     {
         uint Id { get; }
 
-        ITask? Task { get; }
+        TaskData? Task { get; }
 
         bool Complete { get; }
 
diff --git a/src/Impostor.Api/Net/Inner/RpcCalls.cs b/src/Impostor.Api/Net/Inner/RpcCalls.cs
deleted file mode 100644 (file)
index c1fc727..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-namespace Impostor.Api.Net.Inner
-{
-    public enum RpcCalls : byte
-    {
-        PlayAnimation = 0,
-        CompleteTask = 1,
-        SyncSettings = 2,
-        SetInfected = 3,
-        Exiled = 4,
-        CheckName = 5,
-        SetName = 6,
-        CheckColor = 7,
-        SetColor = 8,
-        ReportDeadBody = 11,
-        MurderPlayer = 12,
-        SendChat = 13,
-        StartMeeting = 14,
-        SetScanner = 15,
-        SendChatNote = 16,
-        SetStartCounter = 18,
-        EnterVent = 19,
-        ExitVent = 20,
-        SnapTo = 21,
-        Close = 22,
-        VotingComplete = 23,
-        CastVote = 24,
-        ClearVote = 25,
-        AddVote = 26,
-        CloseDoorsOfType = 27,
-        RepairSystem = 28,
-        SetTasks = 29,
-        ClimbLadder = 31,
-        UsePlatform = 32,
-        SendQuickChat = 33,
-        BootFromVent = 34,
-        UpdateSystem = 35,
-        SetLevel = 38,
-        SetHat = 39,
-        SetSkin = 40,
-        SetPet = 41,
-        SetVisor = 42,
-        SetNamePlate = 43,
-        SetRole = 44,
-        ProtectPlayer = 45,
-        Shapeshift = 46,
-        CheckMurder = 47,
-        CheckProtect = 48,
-        Pet = 49,
-        CancelPet = 50,
-    }
-}
diff --git a/src/Impostor.Api/Net/Messages/Rpcs/Rpc38SetLevel.cs b/src/Impostor.Api/Net/Messages/Rpcs/Rpc38SetLevel.cs
new file mode 100644 (file)
index 0000000..0ceca3b
--- /dev/null
@@ -0,0 +1,15 @@
+namespace Impostor.Api.Net.Messages.Rpcs
+{
+    public static class Rpc38SetLevel
+    {
+        public static void Serialize(IMessageWriter writer, uint level)
+        {
+            writer.WritePacked(level);
+        }
+
+        public static void Deserialize(IMessageReader reader, out uint level)
+        {
+            level = reader.ReadPackedUInt32();
+        }
+    }
+}
diff --git a/src/Impostor.Api/Net/Messages/Rpcs/Rpc39SetHat.cs b/src/Impostor.Api/Net/Messages/Rpcs/Rpc39SetHat.cs
deleted file mode 100644 (file)
index 6aa1399..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-namespace Impostor.Api.Net.Messages.Rpcs
-{
-    public static class Rpc39SetHat
-    {
-        public static void Serialize(IMessageWriter writer, string hat)
-        {
-            writer.Write(hat);
-        }
-
-        public static void Deserialize(IMessageReader reader, out string hat)
-        {
-            hat = reader.ReadString();
-        }
-    }
-}
diff --git a/src/Impostor.Api/Net/Messages/Rpcs/Rpc39SetHatStr.cs b/src/Impostor.Api/Net/Messages/Rpcs/Rpc39SetHatStr.cs
new file mode 100644 (file)
index 0000000..1b5300a
--- /dev/null
@@ -0,0 +1,15 @@
+namespace Impostor.Api.Net.Messages.Rpcs
+{
+    public static class Rpc39SetHatStr
+    {
+        public static void Serialize(IMessageWriter writer, string hat)
+        {
+            writer.Write(hat);
+        }
+
+        public static void Deserialize(IMessageReader reader, out string hat)
+        {
+            hat = reader.ReadString();
+        }
+    }
+}
diff --git a/src/Impostor.Api/Net/Messages/Rpcs/Rpc40SetSkin.cs b/src/Impostor.Api/Net/Messages/Rpcs/Rpc40SetSkin.cs
deleted file mode 100644 (file)
index 929dab2..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-namespace Impostor.Api.Net.Messages.Rpcs
-{
-    public static class Rpc40SetSkin
-    {
-        public static void Serialize(IMessageWriter writer, string skin)
-        {
-            writer.Write(skin);
-        }
-
-        public static void Deserialize(IMessageReader reader, out string skin)
-        {
-            skin = reader.ReadString();
-        }
-    }
-}
diff --git a/src/Impostor.Api/Net/Messages/Rpcs/Rpc40SetSkinStr.cs b/src/Impostor.Api/Net/Messages/Rpcs/Rpc40SetSkinStr.cs
new file mode 100644 (file)
index 0000000..796be7a
--- /dev/null
@@ -0,0 +1,15 @@
+namespace Impostor.Api.Net.Messages.Rpcs
+{
+    public static class Rpc40SetSkinStr
+    {
+        public static void Serialize(IMessageWriter writer, string skin)
+        {
+            writer.Write(skin);
+        }
+
+        public static void Deserialize(IMessageReader reader, out string skin)
+        {
+            skin = reader.ReadString();
+        }
+    }
+}
diff --git a/src/Impostor.Api/Net/Messages/Rpcs/Rpc41SetPet.cs b/src/Impostor.Api/Net/Messages/Rpcs/Rpc41SetPet.cs
deleted file mode 100644 (file)
index a3ddde1..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-namespace Impostor.Api.Net.Messages.Rpcs
-{
-    public static class Rpc41SetPet
-    {
-        public static void Serialize(IMessageWriter writer, string pet)
-        {
-            writer.Write(pet);
-        }
-
-        public static void Deserialize(IMessageReader reader, out string pet)
-        {
-            pet = reader.ReadString();
-        }
-    }
-}
diff --git a/src/Impostor.Api/Net/Messages/Rpcs/Rpc41SetPetStr.cs b/src/Impostor.Api/Net/Messages/Rpcs/Rpc41SetPetStr.cs
new file mode 100644 (file)
index 0000000..03dfd3e
--- /dev/null
@@ -0,0 +1,15 @@
+namespace Impostor.Api.Net.Messages.Rpcs
+{
+    public static class Rpc41SetPetStr
+    {
+        public static void Serialize(IMessageWriter writer, string pet)
+        {
+            writer.Write(pet);
+        }
+
+        public static void Deserialize(IMessageReader reader, out string pet)
+        {
+            pet = reader.ReadString();
+        }
+    }
+}
diff --git a/src/Impostor.Api/Net/Messages/Rpcs/Rpc42SetVisorStr.cs b/src/Impostor.Api/Net/Messages/Rpcs/Rpc42SetVisorStr.cs
new file mode 100644 (file)
index 0000000..bffcd33
--- /dev/null
@@ -0,0 +1,15 @@
+namespace Impostor.Api.Net.Messages.Rpcs
+{
+    public static class Rpc42SetVisorStr
+    {
+        public static void Serialize(IMessageWriter writer, string visor)
+        {
+            writer.Write(visor);
+        }
+
+        public static void Deserialize(IMessageReader reader, out string visor)
+        {
+            visor = reader.ReadString();
+        }
+    }
+}
diff --git a/src/Impostor.Api/Net/Messages/Rpcs/Rpc43SetNamePlateStr.cs b/src/Impostor.Api/Net/Messages/Rpcs/Rpc43SetNamePlateStr.cs
new file mode 100644 (file)
index 0000000..e685c9e
--- /dev/null
@@ -0,0 +1,15 @@
+namespace Impostor.Api.Net.Messages.Rpcs
+{
+    public static class Rpc43SetNamePlateStr
+    {
+        public static void Serialize(IMessageWriter writer, string namePlate)
+        {
+            writer.Write(namePlate);
+        }
+
+        public static void Deserialize(IMessageReader reader, out string namePlate)
+        {
+            namePlate = reader.ReadString();
+        }
+    }
+}
index 404e0a8136b89f6f9ae64054456bd83e265a7671..82630f923ff333321ba61771e089e22b9f34919e 100644 (file)
@@ -1,6 +1,4 @@
 ï»¿using Impostor.Api.Events;
-using Impostor.Api.Games;
-using Impostor.Api.Innersloth;
 using Microsoft.Extensions.Logging;
 
 namespace Impostor.Plugins.Example.Handlers
index 6370e5fe528bae6c1e9f833f1780b40f48eb5470..e85ab1f4359d8d805b06b3d7ff51029db46eac06 100644 (file)
@@ -111,19 +111,19 @@ namespace Impostor.Plugins.Example.Handlers
         [EventListener]
         public void OnPlayerEnterVentEvent(IPlayerEnterVentEvent e)
         {
-            _logger.LogInformation("Player {player} entered the vent in {vent}", e.PlayerControl.PlayerInfo.PlayerName, e.Vent.Name);
+            _logger.LogInformation("Player {player} entered the vent in {vent} ({ventId})", e.PlayerControl.PlayerInfo.PlayerName, e.Vent.Name, e.Vent.Id);
         }
 
         [EventListener]
         public void OnPlayerExitVentEvent(IPlayerExitVentEvent e)
         {
-            _logger.LogInformation("Player {player} exited the vent in {vent}", e.PlayerControl.PlayerInfo.PlayerName, e.Vent.Name);
+            _logger.LogInformation("Player {player} exited the vent in {vent} ({ventId})", e.PlayerControl.PlayerInfo.PlayerName, e.Vent.Name, e.Vent.Id);
         }
 
         [EventListener]
         public void OnPlayerVentEvent(IPlayerVentEvent e)
         {
-            _logger.LogInformation("Player {player} vented to {vent}", e.PlayerControl.PlayerInfo.PlayerName, e.NewVent.Name);
+            _logger.LogInformation("Player {player} vented to {vent} ({ventId})", e.PlayerControl.PlayerInfo.PlayerName, e.NewVent.Name, e.NewVent.Id);
         }
 
         [EventListener]
index b072dc799337acc375fee49f71a094b43cfe365b..db74f2630ab5d9ef64265f3ffc04fd2340d9c0ab 100644 (file)
@@ -1,6 +1,6 @@
 using Impostor.Api.Events.Player;
 using Impostor.Api.Games;
-using Impostor.Api.Innersloth;
+using Impostor.Api.Innersloth.Maps;
 using Impostor.Api.Net;
 using Impostor.Api.Net.Inner.Objects;
 
@@ -8,7 +8,7 @@ namespace Impostor.Server.Events.Player
 {
     public class PlayerEnterVentEvent : IPlayerEnterVentEvent
     {
-        public PlayerEnterVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl innerPlayerPhysics, IVent vent)
+        public PlayerEnterVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl innerPlayerPhysics, VentData vent)
         {
             Game = game;
             ClientPlayer = sender;
@@ -22,6 +22,6 @@ namespace Impostor.Server.Events.Player
 
         public IInnerPlayerControl PlayerControl { get; }
 
-        public IVent Vent { get; }
+        public VentData Vent { get; }
     }
 }
index 2343c708dd76e33ac5038720e1f83b69085342df..ea50908241c3259a33d2c84963ef2a7dc667e07b 100644 (file)
@@ -1,6 +1,6 @@
 using Impostor.Api.Events.Player;
 using Impostor.Api.Games;
-using Impostor.Api.Innersloth;
+using Impostor.Api.Innersloth.Maps;
 using Impostor.Api.Net;
 using Impostor.Api.Net.Inner.Objects;
 
@@ -8,7 +8,7 @@ namespace Impostor.Server.Events.Player
 {
     public class PlayerExitVentEvent : IPlayerExitVentEvent
     {
-        public PlayerExitVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl innerPlayerPhysics, IVent vent)
+        public PlayerExitVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl innerPlayerPhysics, VentData vent)
         {
             Game = game;
             ClientPlayer = sender;
@@ -22,6 +22,6 @@ namespace Impostor.Server.Events.Player
 
         public IInnerPlayerControl PlayerControl { get; }
 
-        public IVent Vent { get; }
+        public VentData Vent { get; }
     }
 }
index 7cfdcd0277ea39dda0d28c2889c41978234a288c..c80ab881aabdd6a5d0743e581002c6da6c5fa760 100644 (file)
@@ -1,6 +1,6 @@
 using Impostor.Api.Events.Player;
 using Impostor.Api.Games;
-using Impostor.Api.Innersloth;
+using Impostor.Api.Innersloth.Maps;
 using Impostor.Api.Net;
 using Impostor.Api.Net.Inner.Objects;
 
@@ -8,7 +8,7 @@ namespace Impostor.Server.Events.Player
 {
     public class PlayerVentEvent : IPlayerVentEvent
     {
-        public PlayerVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl innerPlayerPhysics, IVent vent)
+        public PlayerVentEvent(IGame game, IClientPlayer sender, IInnerPlayerControl innerPlayerPhysics, VentData vent)
         {
             Game = game;
             ClientPlayer = sender;
@@ -22,6 +22,6 @@ namespace Impostor.Server.Events.Player
 
         public IInnerPlayerControl PlayerControl { get; }
 
-        public IVent NewVent { get; }
+        public VentData NewVent { get; }
     }
 }
index 48d8ea35e038612ec84d89e80758cb2ee63f070c..b2a928d9ca21d135de8a940a63923961be068ceb 100644 (file)
@@ -73,7 +73,7 @@ namespace Impostor.Server.Net
 
                     if (game == null)
                     {
-                        await DisconnectAsync(DisconnectReason.GameMissing);
+                        await DisconnectAsync(DisconnectReason.GameNotFound);
                         return;
                     }
 
@@ -94,7 +94,7 @@ namespace Impostor.Server.Net
                     var game = _gameManager.Find(gameCode);
                     if (game == null)
                     {
-                        await DisconnectAsync(DisconnectReason.GameMissing);
+                        await DisconnectAsync(DisconnectReason.GameNotFound);
                         return;
                     }
 
index 84a376136a665a33336d30dcbf49ee79c082a0c8..b4a962091df7e04e05fb66a2ceab074be166c177 100644 (file)
@@ -1,5 +1,5 @@
 using Impostor.Api.Events.Managers;
-using Impostor.Api.Innersloth;
+using Impostor.Api.Innersloth.Maps;
 using Impostor.Api.Net.Inner.Objects;
 
 namespace Impostor.Server.Net.Inner.Objects
@@ -11,7 +11,7 @@ namespace Impostor.Server.Net.Inner.Objects
             private readonly InnerPlayerInfo _playerInfo;
             private readonly IEventManager _eventManager;
 
-            public TaskInfo(InnerPlayerInfo playerInfo, IEventManager eventManager, uint id, ITask? task)
+            public TaskInfo(InnerPlayerInfo playerInfo, IEventManager eventManager, uint id, TaskData? task)
             {
                 _playerInfo = playerInfo;
                 _eventManager = eventManager;
@@ -21,7 +21,7 @@ namespace Impostor.Server.Net.Inner.Objects
 
             public uint Id { get; internal set; }
 
-            public ITask? Task { get; internal set; }
+            public TaskData? Task { get; internal set; }
 
             public bool Complete { get; internal set; }
 
index 79af7895dce32b8f9a3e6856dd527069739e7216..207f131e5f8daea7bcf8c5ad2d68a71458c26d6f 100644 (file)
@@ -114,7 +114,7 @@ namespace Impostor.Server.Net.Inner.Objects
         {
             switch (call)
             {
-                case RpcCalls.Close:
+                case RpcCalls.CloseMeeting:
                 {
                     if (!await ValidateHost(call, sender))
                     {
index 3a785bf1612bb92a99ec6d61d9aaeadb34c1bb17..e4bd50a0f208f27494c45723f3999e1795f5762c 100644 (file)
@@ -41,7 +41,7 @@ namespace Impostor.Server.Net.Inner.Objects
             PlayerInfo.CurrentOutfit.HatId = hatId;
 
             using var writer = Game.StartRpc(NetId, RpcCalls.SetHat);
-            Rpc39SetHat.Serialize(writer, hatId);
+            Rpc39SetHatStr.Serialize(writer, hatId);
             await Game.FinishRpcAsync(writer);
         }
 
@@ -50,7 +50,7 @@ namespace Impostor.Server.Net.Inner.Objects
             PlayerInfo.CurrentOutfit.PetId = petId;
 
             using var writer = Game.StartRpc(NetId, RpcCalls.SetPet);
-            Rpc41SetPet.Serialize(writer, petId);
+            Rpc41SetPetStr.Serialize(writer, petId);
             await Game.FinishRpcAsync(writer);
         }
 
@@ -59,7 +59,7 @@ namespace Impostor.Server.Net.Inner.Objects
             PlayerInfo.CurrentOutfit.SkinId = skinId;
 
             using var writer = Game.StartRpc(NetId, RpcCalls.SetSkin);
-            Rpc40SetSkin.Serialize(writer, skinId);
+            Rpc40SetSkinStr.Serialize(writer, skinId);
             await Game.FinishRpcAsync(writer);
         }
 
index 06b0485229a9b57f43af09b7a536362fe187a431..50a0874bf7b7daac3416570c27db26c0cbd1f293 100644 (file)
@@ -201,47 +201,47 @@ namespace Impostor.Server.Net.Inner.Objects
                     return await HandleSetColor(sender, color);
                 }
 
-                case RpcCalls.SetHat:
+                case RpcCalls.SetHatStr:
                 {
                     if (!await ValidateOwnership(call, sender))
                     {
                         return false;
                     }
 
-                    Rpc39SetHat.Deserialize(reader, out var hat);
+                    Rpc39SetHatStr.Deserialize(reader, out var hat);
                     return true;
                 }
 
-                case RpcCalls.SetSkin:
+                case RpcCalls.SetSkinStr:
                 {
                     if (!await ValidateOwnership(call, sender))
                     {
                         return false;
                     }
 
-                    Rpc40SetSkin.Deserialize(reader, out var skin);
+                    Rpc40SetSkinStr.Deserialize(reader, out var skin);
                     return true;
                 }
 
-                case RpcCalls.SetVisor:
+                case RpcCalls.SetVisorStr:
                 {
                     if (!await ValidateOwnership(call, sender))
                     {
                         return false;
                     }
 
-                    // Rpc42SetVistor.Deserialize(reader, out var visor);
+                    Rpc42SetVisorStr.Deserialize(reader, out var visor);
                     return true;
                 }
 
-                case RpcCalls.SetNamePlate:
+                case RpcCalls.SetNamePlateStr:
                 {
                     if (!await ValidateOwnership(call, sender))
                     {
                         return false;
                     }
 
-                    // Rpc43SetNamePlate.Deserialize(reader, out var namePlate);
+                    Rpc43SetNamePlateStr.Deserialize(reader, out var namePlate);
                     return true;
                 }
 
@@ -252,7 +252,7 @@ namespace Impostor.Server.Net.Inner.Objects
                         return false;
                     }
 
-                    // Rpc38SetLevel.Deserialize(reader, out var level);
+                    Rpc38SetLevel.Deserialize(reader, out var level);
                     return true;
                 }
 
@@ -323,14 +323,14 @@ namespace Impostor.Server.Net.Inner.Objects
                     break;
                 }
 
-                case RpcCalls.SetPet:
+                case RpcCalls.SetPetStr:
                 {
                     if (!await ValidateOwnership(call, sender))
                     {
                         return false;
                     }
 
-                    Rpc41SetPet.Deserialize(reader, out var pet);
+                    Rpc41SetPetStr.Deserialize(reader, out var pet);
                     return await HandleSetPet(sender, pet);
                 }
 
index 6ef1fa6a118ff83b9da51d458d1ca2d00c31256b..d46fa4bba687586d92eb22cb5f8ebaf5bd809ca8 100644 (file)
@@ -1,8 +1,6 @@
-using System;
 using System.Collections.Generic;
 using System.Numerics;
 using Impostor.Api.Innersloth;
-using Impostor.Api.Innersloth.Maps;
 using Impostor.Api.Net.Custom;
 using Impostor.Api.Net.Inner.Objects.ShipStatus;
 using Impostor.Server.Net.Inner.Objects.Systems;
@@ -13,20 +11,10 @@ namespace Impostor.Server.Net.Inner.Objects.ShipStatus
 {
     internal class InnerAirshipStatus : InnerShipStatus, IInnerAirshipStatus
     {
-        public InnerAirshipStatus(ICustomMessageManager<ICustomRpc> customMessageManager, Game game) : base(customMessageManager, game)
+        public InnerAirshipStatus(ICustomMessageManager<ICustomRpc> customMessageManager, Game game) : base(customMessageManager, game, MapTypes.Airship)
         {
         }
 
-        public override IMapData Data => IMapData.Maps[MapTypes.Airship];
-
-        public override Dictionary<int, bool> Doors { get; } = new Dictionary<int, bool>(21);
-
-        public override float SpawnRadius => throw new NotSupportedException();
-
-        public override Vector2 InitialSpawnCenter => throw new NotSupportedException();
-
-        public override Vector2 MeetingSpawnCenter => throw new NotSupportedException();
-
         public Vector2 PreSpawnLocation { get; } = new Vector2(-25f, 40f);
 
         public Vector2[] SpawnLocations { get; } =
diff --git a/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerFungleShipStatus.cs b/src/Impostor.Server/Net/Inner/Objects/ShipStatus/InnerFungleShipStatus.cs
new file mode 100644 (file)
index 0000000..a868d7c
--- /dev/null
@@ -0,0 +1,26 @@
+using System.Collections.Generic;
+using Impostor.Api.Innersloth;
+using Impostor.Api.Net.Custom;
+using Impostor.Server.Net.Inner.Objects.Systems;
+using Impostor.Server.Net.Inner.Objects.Systems.ShipStatus;
+using Impostor.Server.Net.State;
+
+namespace Impostor.Server.Net.Inner.Objects.ShipStatus
+{
+    internal class InnerFungleShipStatus : InnerShipStatus
+    {
+        public InnerFungleShipStatus(ICustomMessageManager<ICustomRpc> customMessageManager, Game game) : base(customMessageManager, game, MapTypes.Fungle)
+        {
+        }
+
+        protected override void AddSystems(Dictionary<SystemTypes, ISystemType> systems)
+        {
+            base.AddSystems(systems);
+
+            systems.Add(SystemTypes.Comms, new HudOverrideSystemType());
+            systems.Add(SystemTypes.Reactor, new ReactorSystemType());
+            systems.Add(SystemTypes.Doors, new DoorsSystemType(Doors));
+            // systems.Add(SystemTypes.MushroomMixupSabotage, );
+        }
+    }
+}
index a75167d774baf2bc7c3b090cb9028b802b8d600f..a8370b4a9a08e9c21047f34d9ad5ae5873ef67ad 100644 (file)
@@ -1,7 +1,5 @@
 using System.Collections.Generic;
-using System.Numerics;
 using Impostor.Api.Innersloth;
-using Impostor.Api.Innersloth.Maps;
 using Impostor.Api.Net.Custom;
 using Impostor.Api.Net.Inner.Objects.ShipStatus;
 using Impostor.Server.Net.Inner.Objects.Systems;
@@ -12,20 +10,10 @@ namespace Impostor.Server.Net.Inner.Objects.ShipStatus
 {
     internal class InnerMiraShipStatus : InnerShipStatus, IInnerMiraShipStatus
     {
-        public InnerMiraShipStatus(ICustomMessageManager<ICustomRpc> customMessageManager, Game game) : base(customMessageManager, game)
+        public InnerMiraShipStatus(ICustomMessageManager<ICustomRpc> customMessageManager, Game game) : base(customMessageManager, game, MapTypes.MiraHQ)
         {
         }
 
-        public override IMapData Data => IMapData.Maps[MapTypes.MiraHQ];
-
-        public override Dictionary<int, bool> Doors { get; } = new Dictionary<int, bool>(0);
-
-        public override float SpawnRadius => 1.55f;
-
-        public override Vector2 InitialSpawnCenter { get; } = new Vector2(-4.4f, 2.2f);
-
-        public override Vector2 MeetingSpawnCenter { get; } = new Vector2(24.043f, 1.72f);
-
         protected override void AddSystems(Dictionary<SystemTypes, ISystemType> systems)
         {
             base.AddSystems(systems);
index 4ba0490574bb184b951fb9ca27f4e61ba4ce17fb..819ccf04f80e26c85935880db5b5390244676384 100644 (file)
@@ -1,7 +1,6 @@
 using System.Collections.Generic;
 using System.Numerics;
 using Impostor.Api.Innersloth;
-using Impostor.Api.Innersloth.Maps;
 using Impostor.Api.Net.Custom;
 using Impostor.Api.Net.Inner.Objects.ShipStatus;
 using Impostor.Server.Net.Inner.Objects.Systems;
@@ -12,22 +11,10 @@ namespace Impostor.Server.Net.Inner.Objects.ShipStatus
 {
     internal class InnerPolusShipStatus : InnerShipStatus, IInnerPolusShipStatus
     {
-        public InnerPolusShipStatus(ICustomMessageManager<ICustomRpc> customMessageManager, Game game) : base(customMessageManager, game)
+        public InnerPolusShipStatus(ICustomMessageManager<ICustomRpc> customMessageManager, Game game) : base(customMessageManager, game, MapTypes.Polus)
         {
         }
 
-        public override IMapData Data => IMapData.Maps[MapTypes.Polus];
-
-        public override Dictionary<int, bool> Doors { get; } = new Dictionary<int, bool>(12);
-
-        public override float SpawnRadius => 1f;
-
-        public override Vector2 InitialSpawnCenter { get; } = new Vector2(16.64f, -2.46f);
-
-        public override Vector2 MeetingSpawnCenter { get; } = new Vector2(17.4f, -16.286f);
-
-        public Vector2 MeetingSpawnCenter2 { get; } = new Vector2(17.4f, -17.515f);
-
         public override Vector2 GetSpawnLocation(InnerPlayerControl player, int numPlayers, bool initialSpawn)
         {
             if (initialSpawn)
@@ -39,11 +26,11 @@ namespace Impostor.Server.Net.Inner.Objects.ShipStatus
             var spawnId = player.PlayerId % 15;
             if (player.PlayerId < halfPlayers)
             {
-                return this.MeetingSpawnCenter + (new Vector2(0.6f, 0) * spawnId);
+                return Data.MeetingSpawnCenter + (new Vector2(0.6f, 0) * spawnId);
             }
             else
             {
-                return this.MeetingSpawnCenter2 + (new Vector2(0.6f, 0) * (spawnId - halfPlayers));
+                return Data.MeetingSpawnCenter2 + (new Vector2(0.6f, 0) * (spawnId - halfPlayers));
             }
         }
 
index e96146048f24b7af1cdf0d7f789f60343d8af6ba..c81cd8b715488832a836aebae6bcce0593bc4b76 100644 (file)
@@ -21,20 +21,20 @@ namespace Impostor.Server.Net.Inner.Objects.ShipStatus
     {
         private readonly Dictionary<SystemTypes, ISystemType> _systems = new Dictionary<SystemTypes, ISystemType>();
 
-        protected InnerShipStatus(ICustomMessageManager<ICustomRpc> customMessageManager, Game game) : base(customMessageManager, game)
+        protected InnerShipStatus(ICustomMessageManager<ICustomRpc> customMessageManager, Game game, MapTypes mapType) : base(customMessageManager, game)
         {
             Components.Add(this);
-        }
-
-        public abstract IMapData Data { get; }
 
-        public abstract Dictionary<int, bool> Doors { get; }
+            MapType = mapType;
+            Data = MapData.Maps[mapType];
+            Doors = new Dictionary<int, bool>(Data.Doors.Count);
+        }
 
-        public abstract float SpawnRadius { get; }
+        public MapTypes MapType { get; }
 
-        public abstract Vector2 InitialSpawnCenter { get; }
+        public MapData Data { get; }
 
-        public abstract Vector2 MeetingSpawnCenter { get; }
+        public Dictionary<int, bool> Doors { get; }
 
         internal override ValueTask OnSpawnAsync()
         {
@@ -110,8 +110,8 @@ namespace Impostor.Server.Net.Inner.Objects.ShipStatus
         {
             var vector = new Vector2(0, 1);
             vector = Rotate(vector, (player.PlayerId - 1) * (360f / numPlayers));
-            vector *= this.SpawnRadius;
-            return (initialSpawn ? this.InitialSpawnCenter : this.MeetingSpawnCenter) + vector + new Vector2(0f, 0.3636f);
+            vector *= Data.SpawnRadius;
+            return (initialSpawn ? Data.InitialSpawnCenter : Data.MeetingSpawnCenter) + vector + new Vector2(0f, 0.3636f);
         }
 
         protected virtual void AddSystems(Dictionary<SystemTypes, ISystemType> systems)
index 09523c100210d87e90e31866dbf2b6bc03d4e1a5..c243ac0ad2495b27816775f7019b561e27cca814 100644 (file)
@@ -1,7 +1,5 @@
 using System.Collections.Generic;
-using System.Numerics;
 using Impostor.Api.Innersloth;
-using Impostor.Api.Innersloth.Maps;
 using Impostor.Api.Net.Custom;
 using Impostor.Api.Net.Inner.Objects.ShipStatus;
 using Impostor.Server.Net.Inner.Objects.Systems;
@@ -12,20 +10,10 @@ namespace Impostor.Server.Net.Inner.Objects.ShipStatus
 {
     internal class InnerSkeldShipStatus : InnerShipStatus, IInnerSkeldShipStatus
     {
-        public InnerSkeldShipStatus(ICustomMessageManager<ICustomRpc> customMessageManager, Game game) : base(customMessageManager, game)
+        public InnerSkeldShipStatus(ICustomMessageManager<ICustomRpc> customMessageManager, Game game) : base(customMessageManager, game, MapTypes.Skeld)
         {
         }
 
-        public override IMapData Data { get; } = IMapData.Maps[MapTypes.Skeld];
-
-        public override Dictionary<int, bool> Doors { get; } = new Dictionary<int, bool>(13);
-
-        public override float SpawnRadius => 1.6f;
-
-        public override Vector2 InitialSpawnCenter { get; } = new Vector2(-0.72f, 0.62f);
-
-        public override Vector2 MeetingSpawnCenter { get; } = new Vector2(-0.72f, 0.62f);
-
         protected override void AddSystems(Dictionary<SystemTypes, ISystemType> systems)
         {
             base.AddSystems(systems);
index 02a743894e6e73e53db0d8067ef63faefb018dd7..000ffd15d90da7d50ee0a8e2450cb9efc5e09c5d 100644 (file)
@@ -30,19 +30,20 @@ namespace Impostor.Server.Net.State
         /// </summary>
         private const int CurrentClient = -3;
 
-        private static readonly Type[] SpawnableObjects =
+        private static readonly Dictionary<uint, Type> SpawnableObjects = new()
         {
-            typeof(InnerSkeldShipStatus),
-            typeof(InnerMeetingHud),
-            typeof(InnerLobbyBehaviour),
-            typeof(InnerGameData),
-            typeof(InnerPlayerControl),
-            typeof(InnerMiraShipStatus),
-            typeof(InnerPolusShipStatus),
-            typeof(InnerSkeldShipStatus), // April fools skeld
-            typeof(InnerAirshipStatus),
-            typeof(InnerHideAndSeekManager),
-            typeof(InnerNormalGameManager),
+            [0] = typeof(InnerSkeldShipStatus),
+            [1] = typeof(InnerMeetingHud),
+            [2] = typeof(InnerLobbyBehaviour),
+            [3] = typeof(InnerGameData),
+            [4] = typeof(InnerPlayerControl),
+            [5] = typeof(InnerMiraShipStatus),
+            [6] = typeof(InnerPolusShipStatus),
+            [7] = typeof(InnerShipStatus),
+            [8] = typeof(InnerAirshipStatus),
+            [9] = typeof(InnerHideAndSeekManager),
+            [10] = typeof(InnerNormalGameManager),
+            [13] = typeof(InnerFungleShipStatus),
         };
 
         private readonly List<InnerNetObject> _allObjects = new List<InnerNetObject>();
@@ -130,9 +131,9 @@ namespace Impostor.Server.Net.State
                         }
 
                         var objectId = reader.ReadPackedUInt32();
-                        if (objectId < SpawnableObjects.Length)
+                        if (SpawnableObjects.TryGetValue(objectId, out var spawnableObjectType))
                         {
-                            var innerNetObject = (InnerNetObject)ActivatorUtilities.CreateInstance(_serviceProvider, SpawnableObjects[objectId], this);
+                            var innerNetObject = (InnerNetObject)ActivatorUtilities.CreateInstance(_serviceProvider, spawnableObjectType, this);
                             var ownerClientId = reader.ReadPackedInt32();
 
                             innerNetObject.SpawnFlags = (SpawnFlags)reader.ReadByte();
index 822f28aa9c2c4f1f01f5c92b038b209a04ad0dd4..f300e811c6a6a537e082e1f49fed5f60938196c1 100644 (file)
@@ -29,6 +29,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Impostor.Plugins.Example",
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Impostor.Benchmarks", "Impostor.Benchmarks\Impostor.Benchmarks.csproj", "{EA04E386-6CCB-4C52-8C82-64F32C7EB377}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Impostor.Api.Innersloth.Generator", "Impostor.Api.Innersloth.Generator\Impostor.Api.Innersloth.Generator.csproj", "{8B6C3AC5-E2B2-49F8-854D-22DFB4AB3D31}"
+EndProject
 Global
        GlobalSection(SolutionConfigurationPlatforms) = preSolution
                Debug|Any CPU = Debug|Any CPU
@@ -117,6 +119,14 @@ Global
                {EA04E386-6CCB-4C52-8C82-64F32C7EB377}.Release|Any CPU.Build.0 = Release|Any CPU
                {EA04E386-6CCB-4C52-8C82-64F32C7EB377}.Release|x86.ActiveCfg = Release|Any CPU
                {EA04E386-6CCB-4C52-8C82-64F32C7EB377}.Release|x86.Build.0 = Release|Any CPU
+               {8B6C3AC5-E2B2-49F8-854D-22DFB4AB3D31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {8B6C3AC5-E2B2-49F8-854D-22DFB4AB3D31}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {8B6C3AC5-E2B2-49F8-854D-22DFB4AB3D31}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {8B6C3AC5-E2B2-49F8-854D-22DFB4AB3D31}.Debug|x86.Build.0 = Debug|Any CPU
+               {8B6C3AC5-E2B2-49F8-854D-22DFB4AB3D31}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {8B6C3AC5-E2B2-49F8-854D-22DFB4AB3D31}.Release|Any CPU.Build.0 = Release|Any CPU
+               {8B6C3AC5-E2B2-49F8-854D-22DFB4AB3D31}.Release|x86.ActiveCfg = Release|Any CPU
+               {8B6C3AC5-E2B2-49F8-854D-22DFB4AB3D31}.Release|x86.Build.0 = Release|Any CPU
        EndGlobalSection
        GlobalSection(SolutionProperties) = preSolution
                HideSolutionNode = FALSE