diff --git a/README.md b/README.md
index 94f3a2a..980e762 100644
--- a/README.md
+++ b/README.md
@@ -9,6 +9,7 @@ Cog Function
| ccrole | **Release** | Create custom commands that also assign roles
May have some bugs, please create an issue if you find any |
| chatter | **Beta** | Chat-bot trained to talk like your guild
Missing some key features, but currently functional. See [Chatter](https://github.com/bobloy/Fox-V3/tree/master/chatter) for install instructions |
| coglint | **Alpha** | Error check code in python syntax posted to discord
Works, but probably needs more turning to work for cogs |
+| conquest | **Alpha** | Manage maps for war games and RPGs
Lots of additional features are planned, currently function with simple map |
| dad | **Beta** | Tell dad jokes
Works great! |
| exclusiverole | **Alpha** | Prevent certain roles from getting any other roles
Fully functional, but pretty simple |
| fight | **Incomplete** | Organize bracket tournaments within discord
Still in-progress, a massive project |
diff --git a/conquest/Map Ideas/AxisAllies_MAP_006L.jpg b/conquest/Map Ideas/AxisAllies_MAP_006L.jpg
new file mode 100644
index 0000000..9bb2755
Binary files /dev/null and b/conquest/Map Ideas/AxisAllies_MAP_006L.jpg differ
diff --git a/conquest/Map Ideas/j0e88vlp28pz.png b/conquest/Map Ideas/j0e88vlp28pz.png
new file mode 100644
index 0000000..3c97e53
Binary files /dev/null and b/conquest/Map Ideas/j0e88vlp28pz.png differ
diff --git a/conquest/__init__.py b/conquest/__init__.py
new file mode 100644
index 0000000..1466d52
--- /dev/null
+++ b/conquest/__init__.py
@@ -0,0 +1,11 @@
+from redbot.core import data_manager
+
+from .conquest import Conquest
+
+
+async def setup(bot):
+ cog = Conquest(bot)
+ data_manager.bundled_data_path(cog)
+ await cog.load_data()
+
+ bot.add_cog(cog)
diff --git a/conquest/conquest.py b/conquest/conquest.py
new file mode 100644
index 0000000..609f8b4
--- /dev/null
+++ b/conquest/conquest.py
@@ -0,0 +1,363 @@
+import json
+import os
+import pathlib
+from shutil import copyfile
+from typing import Optional
+
+import discord
+from PIL import Image, ImageColor, ImageOps
+from discord.ext.commands import Greedy
+from redbot.core import Config, commands
+from redbot.core.bot import Red
+from redbot.core.data_manager import bundled_data_path, cog_data_path
+
+
+class Conquest(commands.Cog):
+ """
+ Cog Description
+
+ Less important information about the cog
+ """
+
+ default_zoom_json = {"enabled": False, "x": -1, "y": -1, "zoom": 1.0}
+
+ def __init__(self, bot: Red):
+ super().__init__()
+ self.bot = bot
+ self.config = Config.get_conf(
+ self, identifier=67111110113117101115116, force_registration=True
+ )
+
+ default_guild = {}
+ default_global = {"current_map": None}
+ self.config.register_guild(**default_guild)
+ self.config.register_global(**default_global)
+
+ self.data_path: pathlib.Path = cog_data_path(self)
+ self.asset_path: Optional[pathlib.Path] = None
+
+ self.current_map = None
+ self.map_data = None
+
+ async def red_delete_data_for_user(self, **kwargs):
+ """Nothing to delete"""
+ return
+
+ async def load_data(self):
+ self.asset_path = bundled_data_path(self) / "assets"
+ self.current_map = await self.config.current_map()
+
+ map_data_path = self.asset_path / self.current_map / "data.json"
+ with map_data_path.open() as mapdata:
+ self.map_data = json.load(mapdata)
+
+ @commands.group()
+ async def conquest(self, ctx: commands.Context):
+ """
+ Base command for conquest cog. Start with `[p]conquest set map` to select a map.
+ """
+ if ctx.invoked_subcommand is None:
+ pass # TODO: Print current map probably
+
+ @conquest.command(name="list")
+ async def _conquest_list(self, ctx: commands.Context):
+ """
+ List currently available maps
+ """
+ maps_json = self.asset_path / "maps.json"
+
+ with maps_json.open() as maps:
+ maps_json = json.load(maps)
+ map_list = "\n".join(map_name for map_name in maps_json["maps"])
+ await ctx.maybe_send_embed(f"Current maps:\n{map_list}")
+
+ @conquest.group(name="set")
+ async def conquest_set(self, ctx: commands.Context):
+ """Base command for admin actions like selecting a map"""
+ if ctx.invoked_subcommand is None:
+ pass
+
+ @conquest_set.command(name="resetzoom")
+ async def _conquest_set_resetzoom(self, ctx: commands.Context):
+ """Resets the zoom level of the current map"""
+ if self.current_map is None:
+ await ctx.maybe_send_embed("No map is currently set. See `[p]conquest set map`")
+ return
+
+ zoom_json_path = self.data_path / self.current_map / "settings.json"
+ if not zoom_json_path.exists():
+ await ctx.maybe_send_embed(
+ f"No zoom data found for {self.current_map}, reset not needed"
+ )
+ return
+
+ with zoom_json_path.open("w+") as zoom_json:
+ json.dump({"enabled": False}, zoom_json)
+
+ await ctx.tick()
+
+ @conquest_set.command(name="zoom")
+ async def _conquest_set_zoom(self, ctx: commands.Context, x: int, y: int, zoom: float):
+ """
+ Set the zoom level and position of the current map
+
+ x: positive integer
+ y: positive integer
+ zoom: float greater than or equal to 1
+ """
+ if self.current_map is None:
+ await ctx.maybe_send_embed("No map is currently set. See `[p]conquest set map`")
+ return
+
+ if x < 0 or y < 0 or zoom < 1:
+ await ctx.send_help()
+ return
+
+ zoom_json_path = self.data_path / self.current_map / "settings.json"
+
+ zoom_data = self.default_zoom_json.copy()
+ zoom_data["enabled"] = True
+ zoom_data["x"] = x
+ zoom_data["y"] = y
+ zoom_data["zoom"] = zoom
+
+ with zoom_json_path.open("w+") as zoom_json:
+ json.dump(zoom_data, zoom_json)
+
+ await ctx.tick()
+
+ @conquest_set.command(name="zoomtest")
+ async def _conquest_set_zoomtest(self, ctx: commands.Context, x: int, y: int, zoom: float):
+ """
+ Test the zoom level and position of the current map
+
+ x: positive integer
+ y: positive integer
+ zoom: float greater than or equal to 1
+ """
+ if self.current_map is None:
+ await ctx.maybe_send_embed("No map is currently set. See `[p]conquest set map`")
+ return
+
+ if x < 0 or y < 0 or zoom < 1:
+ await ctx.send_help()
+ return
+
+ zoomed_path = await self._create_zoomed_map(
+ self.data_path / self.current_map / "current.jpg", x, y, zoom
+ )
+
+ await ctx.send(file=discord.File(fp=zoomed_path, filename="current_zoomed.jpg",))
+
+ async def _create_zoomed_map(self, map_path, x, y, zoom, **kwargs):
+ current_map = Image.open(map_path)
+
+ w, h = current_map.size
+ zoom2 = zoom * 2
+ zoomed_map = current_map.crop((x - w / zoom2, y - h / zoom2, x + w / zoom2, y + h / zoom2))
+ # zoomed_map = zoomed_map.resize((w, h), Image.LANCZOS)
+ zoomed_map.save(self.data_path / self.current_map / "zoomed.jpg", "jpeg")
+ return self.data_path / self.current_map / "zoomed.jpg"
+
+ @conquest_set.command(name="save")
+ async def _conquest_set_save(self, ctx: commands.Context, *, save_name):
+ """Save the current map to be loaded later"""
+ if self.current_map is None:
+ await ctx.maybe_send_embed("No map is currently set. See `[p]conquest set map`")
+ return
+
+ current_map_folder = self.data_path / self.current_map
+ current_map = current_map_folder / "current.jpg"
+
+ if not current_map_folder.exists() or not current_map.exists():
+ await ctx.maybe_send_embed("Current map doesn't exist! Try setting a new one")
+ return
+
+ copyfile(current_map, current_map_folder / f"{save_name}.jpg")
+ await ctx.tick()
+
+ @conquest_set.command(name="load")
+ async def _conquest_set_load(self, ctx: commands.Context, *, save_name):
+ """Load a saved map to be the current map"""
+ if self.current_map is None:
+ await ctx.maybe_send_embed("No map is currently set. See `[p]conquest set map`")
+ return
+
+ current_map_folder = self.data_path / self.current_map
+ current_map = current_map_folder / "current.jpg"
+ saved_map = current_map_folder / f"{save_name}.jpg"
+
+ if not current_map_folder.exists() or not saved_map.exists():
+ await ctx.maybe_send_embed(f"Saved map not found in the {self.current_map} folder")
+ return
+
+ copyfile(saved_map, current_map)
+ await ctx.tick()
+
+ @conquest_set.command(name="map")
+ async def _conquest_set_map(self, ctx: commands.Context, mapname: str, reset: bool = False):
+ """
+ Select a map from current available maps
+
+ To add more maps, see the guide (WIP)
+ """
+ map_dir = self.asset_path / mapname
+ if not map_dir.exists() or not map_dir.is_dir():
+ await ctx.maybe_send_embed(
+ f"Map `{mapname}` was not found in the {self.asset_path} directory"
+ )
+ return
+
+ self.current_map = mapname
+ await self.config.current_map.set(self.current_map) # Save to config too
+
+ map_data_path = self.asset_path / mapname / "data.json"
+ with map_data_path.open() as mapdata:
+ self.map_data = json.load(mapdata)
+
+ current_map_folder = self.data_path / self.current_map
+ current_map = current_map_folder / "current.jpg"
+
+ if not reset and current_map.exists():
+ await ctx.maybe_send_embed(
+ "This map is already in progress, resuming from last game\n"
+ "Use `[p]conquest set map [mapname] True` to start a new game"
+ )
+ else:
+ if not current_map_folder.exists():
+ os.makedirs(current_map_folder)
+ copyfile(self.asset_path / mapname / "blank.jpg", current_map)
+
+ await ctx.tick()
+
+ @conquest.command(name="current")
+ async def _conquest_current(self, ctx: commands.Context):
+ """
+ Send the current map.
+ """
+ if self.current_map is None:
+ await ctx.maybe_send_embed("No map is currently set. See `[p]conquest set map`")
+ return
+
+ current_jpg = self.data_path / self.current_map / "current.jpg"
+
+ await self._send_maybe_zoomed_map(ctx, current_jpg, "current_map.jpg")
+
+ async def _send_maybe_zoomed_map(self, ctx, map_path, filename):
+ zoom_data = {"enabled": False}
+
+ zoom_json_path = self.data_path / self.current_map / "settings.json"
+
+ if zoom_json_path.exists():
+ with zoom_json_path.open() as zoom_json:
+ zoom_data = json.load(zoom_json)
+
+ if zoom_data["enabled"]:
+ map_path = await self._create_zoomed_map(map_path, **zoom_data)
+
+ await ctx.send(file=discord.File(fp=map_path, filename=filename))
+
+ @conquest.command("blank")
+ async def _conquest_blank(self, ctx: commands.Context):
+ """
+ Print the blank version of the current map, for reference.
+ """
+ if self.current_map is None:
+ await ctx.maybe_send_embed("No map is currently set. See `[p]conquest set map`")
+ return
+
+ current_blank_jpg = self.asset_path / self.current_map / "blank.jpg"
+
+ await self._send_maybe_zoomed_map(ctx, current_blank_jpg, "blank_map.jpg")
+ # await ctx.send(file=discord.File(fp=current_blank_jpg, filename="blank_map.jpg"))
+
+ @conquest.command("numbered")
+ async def _conquest_numbered(self, ctx: commands.Context):
+ """
+ Print the numbered version of the current map, for reference.
+ """
+ if self.current_map is None:
+ await ctx.maybe_send_embed("No map is currently set. See `[p]conquest set map`")
+ return
+
+ numbers_path = self.asset_path / self.current_map / "numbers.jpg"
+ if not numbers_path.exists():
+ await ctx.send(
+ file=discord.File(
+ fp=self.asset_path / self.current_map / "numbered.jpg",
+ filename="numbered.jpg",
+ )
+ )
+ return
+
+ current_map = Image.open(self.data_path / self.current_map / "current.jpg")
+ numbers = Image.open(numbers_path).convert("L")
+
+ inverted_map = ImageOps.invert(current_map)
+
+ current_numbered_jpg: Image.Image = Image.composite(current_map, inverted_map, numbers)
+ current_numbered_jpg.save(
+ self.data_path / self.current_map / "current_numbered.jpg", "jpeg"
+ )
+
+ await self._send_maybe_zoomed_map(
+ ctx, self.data_path / self.current_map / "current_numbered.jpg", "current_numbered.jpg"
+ )
+ # await ctx.send(
+ # file=discord.File(
+ # fp=self.data_path / self.current_map / "current_numbered.jpg",
+ # filename="current_numbered.jpg",
+ # )
+ # )
+
+ @conquest.command(name="take")
+ async def _conquest_take(self, ctx: commands.Context, regions: Greedy[int], *, color: str):
+ """
+ Claim a territory or list of territories for a specified color
+
+ :param regions: List of integer regions
+ :param color: Color to claim regions
+ """
+ if not regions:
+ await ctx.send_help()
+ return
+
+ if self.current_map is None:
+ await ctx.maybe_send_embed("No map is currently set. See `[p]conquest set map`")
+ return
+
+ try:
+ color = ImageColor.getrgb(color)
+ except ValueError:
+ await ctx.maybe_send_embed(f"Invalid color {color}")
+ return
+
+ for region in regions:
+ if region > self.map_data["region_max"] or region < 1:
+ await ctx.maybe_send_embed(
+ f"Max region number is {self.map_data['region_max']}, minimum is 1"
+ )
+
+ current_jpg_path = self.data_path / self.current_map / "current.jpg"
+ im = Image.open(current_jpg_path)
+ out: Image.Image = await self._composite_regions(im, regions, color)
+
+ out.save(current_jpg_path, "jpeg")
+
+ await self._send_maybe_zoomed_map(ctx, current_jpg_path, "map.jpg")
+ # await ctx.send(file=discord.File(fp=current_jpg_path, filename="map.jpg"))
+
+ async def _composite_regions(self, im, regions, color) -> Image.Image:
+
+ im2 = Image.new("RGB", im.size, color)
+
+ out = None
+ for region in regions:
+ mask = Image.open(
+ self.asset_path / self.current_map / "masks" / f"{region}.jpg"
+ ).convert("L")
+ if out is None:
+ out = Image.composite(im, im2, mask)
+ else:
+ out = Image.composite(out, im2, mask)
+ return out
diff --git a/conquest/data/assets/HoI/blank.png b/conquest/data/assets/HoI/blank.png
new file mode 100644
index 0000000..7cf4e82
Binary files /dev/null and b/conquest/data/assets/HoI/blank.png differ
diff --git a/conquest/data/assets/HoI/data.json b/conquest/data/assets/HoI/data.json
new file mode 100644
index 0000000..9baa7fa
--- /dev/null
+++ b/conquest/data/assets/HoI/data.json
@@ -0,0 +1,3 @@
+{
+ "region_max": 70
+}
\ No newline at end of file
diff --git a/conquest/data/assets/HoI/numbered.jpg b/conquest/data/assets/HoI/numbered.jpg
new file mode 100644
index 0000000..228e9bb
Binary files /dev/null and b/conquest/data/assets/HoI/numbered.jpg differ
diff --git a/conquest/data/assets/ck2/blank.png b/conquest/data/assets/ck2/blank.png
new file mode 100644
index 0000000..058abe7
Binary files /dev/null and b/conquest/data/assets/ck2/blank.png differ
diff --git a/conquest/data/assets/ck2/data.json b/conquest/data/assets/ck2/data.json
new file mode 100644
index 0000000..9baa7fa
--- /dev/null
+++ b/conquest/data/assets/ck2/data.json
@@ -0,0 +1,3 @@
+{
+ "region_max": 70
+}
\ No newline at end of file
diff --git a/conquest/data/assets/ck2/numbered.png b/conquest/data/assets/ck2/numbered.png
new file mode 100644
index 0000000..91a4c76
Binary files /dev/null and b/conquest/data/assets/ck2/numbered.png differ
diff --git a/conquest/data/assets/maps.json b/conquest/data/assets/maps.json
new file mode 100644
index 0000000..96f1418
--- /dev/null
+++ b/conquest/data/assets/maps.json
@@ -0,0 +1,5 @@
+{
+ "maps": [
+ "simple_blank_map"
+ ]
+}
\ No newline at end of file
diff --git a/conquest/data/assets/simple/blank.jpg b/conquest/data/assets/simple/blank.jpg
new file mode 100644
index 0000000..f8f4f07
Binary files /dev/null and b/conquest/data/assets/simple/blank.jpg differ
diff --git a/conquest/data/assets/simple/data.json b/conquest/data/assets/simple/data.json
new file mode 100644
index 0000000..9baa7fa
--- /dev/null
+++ b/conquest/data/assets/simple/data.json
@@ -0,0 +1,3 @@
+{
+ "region_max": 70
+}
\ No newline at end of file
diff --git a/conquest/data/assets/simple/masks/1.jpg b/conquest/data/assets/simple/masks/1.jpg
new file mode 100644
index 0000000..084384b
Binary files /dev/null and b/conquest/data/assets/simple/masks/1.jpg differ
diff --git a/conquest/data/assets/simple/masks/10.jpg b/conquest/data/assets/simple/masks/10.jpg
new file mode 100644
index 0000000..078f526
Binary files /dev/null and b/conquest/data/assets/simple/masks/10.jpg differ
diff --git a/conquest/data/assets/simple/masks/11.jpg b/conquest/data/assets/simple/masks/11.jpg
new file mode 100644
index 0000000..7d8092e
Binary files /dev/null and b/conquest/data/assets/simple/masks/11.jpg differ
diff --git a/conquest/data/assets/simple/masks/12.jpg b/conquest/data/assets/simple/masks/12.jpg
new file mode 100644
index 0000000..89ef52a
Binary files /dev/null and b/conquest/data/assets/simple/masks/12.jpg differ
diff --git a/conquest/data/assets/simple/masks/13.jpg b/conquest/data/assets/simple/masks/13.jpg
new file mode 100644
index 0000000..d5bcf44
Binary files /dev/null and b/conquest/data/assets/simple/masks/13.jpg differ
diff --git a/conquest/data/assets/simple/masks/14.jpg b/conquest/data/assets/simple/masks/14.jpg
new file mode 100644
index 0000000..86a7c01
Binary files /dev/null and b/conquest/data/assets/simple/masks/14.jpg differ
diff --git a/conquest/data/assets/simple/masks/15.jpg b/conquest/data/assets/simple/masks/15.jpg
new file mode 100644
index 0000000..b18a720
Binary files /dev/null and b/conquest/data/assets/simple/masks/15.jpg differ
diff --git a/conquest/data/assets/simple/masks/16.jpg b/conquest/data/assets/simple/masks/16.jpg
new file mode 100644
index 0000000..1de9ab3
Binary files /dev/null and b/conquest/data/assets/simple/masks/16.jpg differ
diff --git a/conquest/data/assets/simple/masks/17.jpg b/conquest/data/assets/simple/masks/17.jpg
new file mode 100644
index 0000000..6f428bd
Binary files /dev/null and b/conquest/data/assets/simple/masks/17.jpg differ
diff --git a/conquest/data/assets/simple/masks/18.jpg b/conquest/data/assets/simple/masks/18.jpg
new file mode 100644
index 0000000..c3f13cc
Binary files /dev/null and b/conquest/data/assets/simple/masks/18.jpg differ
diff --git a/conquest/data/assets/simple/masks/19.jpg b/conquest/data/assets/simple/masks/19.jpg
new file mode 100644
index 0000000..bf9ec38
Binary files /dev/null and b/conquest/data/assets/simple/masks/19.jpg differ
diff --git a/conquest/data/assets/simple/masks/2.jpg b/conquest/data/assets/simple/masks/2.jpg
new file mode 100644
index 0000000..6edd658
Binary files /dev/null and b/conquest/data/assets/simple/masks/2.jpg differ
diff --git a/conquest/data/assets/simple/masks/20.jpg b/conquest/data/assets/simple/masks/20.jpg
new file mode 100644
index 0000000..39fac15
Binary files /dev/null and b/conquest/data/assets/simple/masks/20.jpg differ
diff --git a/conquest/data/assets/simple/masks/21.jpg b/conquest/data/assets/simple/masks/21.jpg
new file mode 100644
index 0000000..a6f2d88
Binary files /dev/null and b/conquest/data/assets/simple/masks/21.jpg differ
diff --git a/conquest/data/assets/simple/masks/22.jpg b/conquest/data/assets/simple/masks/22.jpg
new file mode 100644
index 0000000..a4c8057
Binary files /dev/null and b/conquest/data/assets/simple/masks/22.jpg differ
diff --git a/conquest/data/assets/simple/masks/23.jpg b/conquest/data/assets/simple/masks/23.jpg
new file mode 100644
index 0000000..3229d3e
Binary files /dev/null and b/conquest/data/assets/simple/masks/23.jpg differ
diff --git a/conquest/data/assets/simple/masks/24.jpg b/conquest/data/assets/simple/masks/24.jpg
new file mode 100644
index 0000000..413bf4a
Binary files /dev/null and b/conquest/data/assets/simple/masks/24.jpg differ
diff --git a/conquest/data/assets/simple/masks/25.jpg b/conquest/data/assets/simple/masks/25.jpg
new file mode 100644
index 0000000..c040946
Binary files /dev/null and b/conquest/data/assets/simple/masks/25.jpg differ
diff --git a/conquest/data/assets/simple/masks/26.jpg b/conquest/data/assets/simple/masks/26.jpg
new file mode 100644
index 0000000..232b004
Binary files /dev/null and b/conquest/data/assets/simple/masks/26.jpg differ
diff --git a/conquest/data/assets/simple/masks/27.jpg b/conquest/data/assets/simple/masks/27.jpg
new file mode 100644
index 0000000..c8229a3
Binary files /dev/null and b/conquest/data/assets/simple/masks/27.jpg differ
diff --git a/conquest/data/assets/simple/masks/28.jpg b/conquest/data/assets/simple/masks/28.jpg
new file mode 100644
index 0000000..d5484a1
Binary files /dev/null and b/conquest/data/assets/simple/masks/28.jpg differ
diff --git a/conquest/data/assets/simple/masks/29.jpg b/conquest/data/assets/simple/masks/29.jpg
new file mode 100644
index 0000000..0f138f6
Binary files /dev/null and b/conquest/data/assets/simple/masks/29.jpg differ
diff --git a/conquest/data/assets/simple/masks/3.jpg b/conquest/data/assets/simple/masks/3.jpg
new file mode 100644
index 0000000..112d1b0
Binary files /dev/null and b/conquest/data/assets/simple/masks/3.jpg differ
diff --git a/conquest/data/assets/simple/masks/30.jpg b/conquest/data/assets/simple/masks/30.jpg
new file mode 100644
index 0000000..b04de09
Binary files /dev/null and b/conquest/data/assets/simple/masks/30.jpg differ
diff --git a/conquest/data/assets/simple/masks/31.jpg b/conquest/data/assets/simple/masks/31.jpg
new file mode 100644
index 0000000..90812e7
Binary files /dev/null and b/conquest/data/assets/simple/masks/31.jpg differ
diff --git a/conquest/data/assets/simple/masks/32.jpg b/conquest/data/assets/simple/masks/32.jpg
new file mode 100644
index 0000000..fd12574
Binary files /dev/null and b/conquest/data/assets/simple/masks/32.jpg differ
diff --git a/conquest/data/assets/simple/masks/33.jpg b/conquest/data/assets/simple/masks/33.jpg
new file mode 100644
index 0000000..87704c5
Binary files /dev/null and b/conquest/data/assets/simple/masks/33.jpg differ
diff --git a/conquest/data/assets/simple/masks/34.jpg b/conquest/data/assets/simple/masks/34.jpg
new file mode 100644
index 0000000..1c610df
Binary files /dev/null and b/conquest/data/assets/simple/masks/34.jpg differ
diff --git a/conquest/data/assets/simple/masks/35.jpg b/conquest/data/assets/simple/masks/35.jpg
new file mode 100644
index 0000000..e86c726
Binary files /dev/null and b/conquest/data/assets/simple/masks/35.jpg differ
diff --git a/conquest/data/assets/simple/masks/36.jpg b/conquest/data/assets/simple/masks/36.jpg
new file mode 100644
index 0000000..7f4ad3d
Binary files /dev/null and b/conquest/data/assets/simple/masks/36.jpg differ
diff --git a/conquest/data/assets/simple/masks/37.jpg b/conquest/data/assets/simple/masks/37.jpg
new file mode 100644
index 0000000..c8b6b87
Binary files /dev/null and b/conquest/data/assets/simple/masks/37.jpg differ
diff --git a/conquest/data/assets/simple/masks/38.jpg b/conquest/data/assets/simple/masks/38.jpg
new file mode 100644
index 0000000..6fcd5a6
Binary files /dev/null and b/conquest/data/assets/simple/masks/38.jpg differ
diff --git a/conquest/data/assets/simple/masks/39.jpg b/conquest/data/assets/simple/masks/39.jpg
new file mode 100644
index 0000000..455f0e5
Binary files /dev/null and b/conquest/data/assets/simple/masks/39.jpg differ
diff --git a/conquest/data/assets/simple/masks/4.jpg b/conquest/data/assets/simple/masks/4.jpg
new file mode 100644
index 0000000..b77cc24
Binary files /dev/null and b/conquest/data/assets/simple/masks/4.jpg differ
diff --git a/conquest/data/assets/simple/masks/40.jpg b/conquest/data/assets/simple/masks/40.jpg
new file mode 100644
index 0000000..5692661
Binary files /dev/null and b/conquest/data/assets/simple/masks/40.jpg differ
diff --git a/conquest/data/assets/simple/masks/41.jpg b/conquest/data/assets/simple/masks/41.jpg
new file mode 100644
index 0000000..f0e3972
Binary files /dev/null and b/conquest/data/assets/simple/masks/41.jpg differ
diff --git a/conquest/data/assets/simple/masks/42.jpg b/conquest/data/assets/simple/masks/42.jpg
new file mode 100644
index 0000000..b41a652
Binary files /dev/null and b/conquest/data/assets/simple/masks/42.jpg differ
diff --git a/conquest/data/assets/simple/masks/43.jpg b/conquest/data/assets/simple/masks/43.jpg
new file mode 100644
index 0000000..463c17f
Binary files /dev/null and b/conquest/data/assets/simple/masks/43.jpg differ
diff --git a/conquest/data/assets/simple/masks/44.jpg b/conquest/data/assets/simple/masks/44.jpg
new file mode 100644
index 0000000..b2da82b
Binary files /dev/null and b/conquest/data/assets/simple/masks/44.jpg differ
diff --git a/conquest/data/assets/simple/masks/45.jpg b/conquest/data/assets/simple/masks/45.jpg
new file mode 100644
index 0000000..fdeca1c
Binary files /dev/null and b/conquest/data/assets/simple/masks/45.jpg differ
diff --git a/conquest/data/assets/simple/masks/46.jpg b/conquest/data/assets/simple/masks/46.jpg
new file mode 100644
index 0000000..6da7ec6
Binary files /dev/null and b/conquest/data/assets/simple/masks/46.jpg differ
diff --git a/conquest/data/assets/simple/masks/47.jpg b/conquest/data/assets/simple/masks/47.jpg
new file mode 100644
index 0000000..4e7a2a4
Binary files /dev/null and b/conquest/data/assets/simple/masks/47.jpg differ
diff --git a/conquest/data/assets/simple/masks/48.jpg b/conquest/data/assets/simple/masks/48.jpg
new file mode 100644
index 0000000..87223f7
Binary files /dev/null and b/conquest/data/assets/simple/masks/48.jpg differ
diff --git a/conquest/data/assets/simple/masks/49.jpg b/conquest/data/assets/simple/masks/49.jpg
new file mode 100644
index 0000000..d749cae
Binary files /dev/null and b/conquest/data/assets/simple/masks/49.jpg differ
diff --git a/conquest/data/assets/simple/masks/5.jpg b/conquest/data/assets/simple/masks/5.jpg
new file mode 100644
index 0000000..c392916
Binary files /dev/null and b/conquest/data/assets/simple/masks/5.jpg differ
diff --git a/conquest/data/assets/simple/masks/50.jpg b/conquest/data/assets/simple/masks/50.jpg
new file mode 100644
index 0000000..514a67f
Binary files /dev/null and b/conquest/data/assets/simple/masks/50.jpg differ
diff --git a/conquest/data/assets/simple/masks/51.jpg b/conquest/data/assets/simple/masks/51.jpg
new file mode 100644
index 0000000..c928321
Binary files /dev/null and b/conquest/data/assets/simple/masks/51.jpg differ
diff --git a/conquest/data/assets/simple/masks/52.jpg b/conquest/data/assets/simple/masks/52.jpg
new file mode 100644
index 0000000..9321238
Binary files /dev/null and b/conquest/data/assets/simple/masks/52.jpg differ
diff --git a/conquest/data/assets/simple/masks/53.jpg b/conquest/data/assets/simple/masks/53.jpg
new file mode 100644
index 0000000..4b36e75
Binary files /dev/null and b/conquest/data/assets/simple/masks/53.jpg differ
diff --git a/conquest/data/assets/simple/masks/54.jpg b/conquest/data/assets/simple/masks/54.jpg
new file mode 100644
index 0000000..b592522
Binary files /dev/null and b/conquest/data/assets/simple/masks/54.jpg differ
diff --git a/conquest/data/assets/simple/masks/55.jpg b/conquest/data/assets/simple/masks/55.jpg
new file mode 100644
index 0000000..5bed3a8
Binary files /dev/null and b/conquest/data/assets/simple/masks/55.jpg differ
diff --git a/conquest/data/assets/simple/masks/56.jpg b/conquest/data/assets/simple/masks/56.jpg
new file mode 100644
index 0000000..627473c
Binary files /dev/null and b/conquest/data/assets/simple/masks/56.jpg differ
diff --git a/conquest/data/assets/simple/masks/57.jpg b/conquest/data/assets/simple/masks/57.jpg
new file mode 100644
index 0000000..6e0e1e4
Binary files /dev/null and b/conquest/data/assets/simple/masks/57.jpg differ
diff --git a/conquest/data/assets/simple/masks/58.jpg b/conquest/data/assets/simple/masks/58.jpg
new file mode 100644
index 0000000..47e98fe
Binary files /dev/null and b/conquest/data/assets/simple/masks/58.jpg differ
diff --git a/conquest/data/assets/simple/masks/59.jpg b/conquest/data/assets/simple/masks/59.jpg
new file mode 100644
index 0000000..f23e469
Binary files /dev/null and b/conquest/data/assets/simple/masks/59.jpg differ
diff --git a/conquest/data/assets/simple/masks/6.jpg b/conquest/data/assets/simple/masks/6.jpg
new file mode 100644
index 0000000..95eb45f
Binary files /dev/null and b/conquest/data/assets/simple/masks/6.jpg differ
diff --git a/conquest/data/assets/simple/masks/60.jpg b/conquest/data/assets/simple/masks/60.jpg
new file mode 100644
index 0000000..c1b149e
Binary files /dev/null and b/conquest/data/assets/simple/masks/60.jpg differ
diff --git a/conquest/data/assets/simple/masks/61.jpg b/conquest/data/assets/simple/masks/61.jpg
new file mode 100644
index 0000000..e343d5d
Binary files /dev/null and b/conquest/data/assets/simple/masks/61.jpg differ
diff --git a/conquest/data/assets/simple/masks/62.jpg b/conquest/data/assets/simple/masks/62.jpg
new file mode 100644
index 0000000..413a5ad
Binary files /dev/null and b/conquest/data/assets/simple/masks/62.jpg differ
diff --git a/conquest/data/assets/simple/masks/63.jpg b/conquest/data/assets/simple/masks/63.jpg
new file mode 100644
index 0000000..f03435f
Binary files /dev/null and b/conquest/data/assets/simple/masks/63.jpg differ
diff --git a/conquest/data/assets/simple/masks/64.jpg b/conquest/data/assets/simple/masks/64.jpg
new file mode 100644
index 0000000..59e80fe
Binary files /dev/null and b/conquest/data/assets/simple/masks/64.jpg differ
diff --git a/conquest/data/assets/simple/masks/65.jpg b/conquest/data/assets/simple/masks/65.jpg
new file mode 100644
index 0000000..fd2cb0d
Binary files /dev/null and b/conquest/data/assets/simple/masks/65.jpg differ
diff --git a/conquest/data/assets/simple/masks/66.jpg b/conquest/data/assets/simple/masks/66.jpg
new file mode 100644
index 0000000..2ac9dda
Binary files /dev/null and b/conquest/data/assets/simple/masks/66.jpg differ
diff --git a/conquest/data/assets/simple/masks/67.jpg b/conquest/data/assets/simple/masks/67.jpg
new file mode 100644
index 0000000..e2ebdc9
Binary files /dev/null and b/conquest/data/assets/simple/masks/67.jpg differ
diff --git a/conquest/data/assets/simple/masks/68.jpg b/conquest/data/assets/simple/masks/68.jpg
new file mode 100644
index 0000000..535e506
Binary files /dev/null and b/conquest/data/assets/simple/masks/68.jpg differ
diff --git a/conquest/data/assets/simple/masks/69.jpg b/conquest/data/assets/simple/masks/69.jpg
new file mode 100644
index 0000000..6b1d010
Binary files /dev/null and b/conquest/data/assets/simple/masks/69.jpg differ
diff --git a/conquest/data/assets/simple/masks/7.jpg b/conquest/data/assets/simple/masks/7.jpg
new file mode 100644
index 0000000..a0202b0
Binary files /dev/null and b/conquest/data/assets/simple/masks/7.jpg differ
diff --git a/conquest/data/assets/simple/masks/70.jpg b/conquest/data/assets/simple/masks/70.jpg
new file mode 100644
index 0000000..a1716af
Binary files /dev/null and b/conquest/data/assets/simple/masks/70.jpg differ
diff --git a/conquest/data/assets/simple/masks/8.jpg b/conquest/data/assets/simple/masks/8.jpg
new file mode 100644
index 0000000..647c649
Binary files /dev/null and b/conquest/data/assets/simple/masks/8.jpg differ
diff --git a/conquest/data/assets/simple/masks/9.jpg b/conquest/data/assets/simple/masks/9.jpg
new file mode 100644
index 0000000..3bafeda
Binary files /dev/null and b/conquest/data/assets/simple/masks/9.jpg differ
diff --git a/conquest/data/assets/simple/numbered.jpg b/conquest/data/assets/simple/numbered.jpg
new file mode 100644
index 0000000..228e9bb
Binary files /dev/null and b/conquest/data/assets/simple/numbered.jpg differ
diff --git a/conquest/data/assets/simple/numbers.jpg b/conquest/data/assets/simple/numbers.jpg
new file mode 100644
index 0000000..de87fd7
Binary files /dev/null and b/conquest/data/assets/simple/numbers.jpg differ
diff --git a/conquest/data/assets/simple/numbers.png b/conquest/data/assets/simple/numbers.png
new file mode 100644
index 0000000..2f72371
Binary files /dev/null and b/conquest/data/assets/simple/numbers.png differ
diff --git a/conquest/info.json b/conquest/info.json
new file mode 100644
index 0000000..0e33d01
--- /dev/null
+++ b/conquest/info.json
@@ -0,0 +1,26 @@
+{
+ "author": [
+ "Bobloy"
+ ],
+ "bot_version": [
+ 3,
+ 4,
+ 0
+ ],
+ "description": "Handle war games by filling in specified territories with colors",
+ "hidden": true,
+ "install_msg": "Thank you for installing Dad. Get started with `[p]load conquest`, then `[p]help Conquest`",
+ "short": "War Game Map",
+ "requirements": ["pillow",],
+ "tags": [
+ "bobloy",
+ "games",
+ "game",
+ "war",
+ "map",
+ "axisandallies",
+ "heartsofiron",
+ "conquest",
+ "rpg"
+ ]
+}
\ No newline at end of file