diff --git a/dependency/MapGenerator-Python/CLR_IMPORT.py b/dependency/MapGenerator-Python/CLR_IMPORT.py new file mode 100644 index 00000000..a49493f4 --- /dev/null +++ b/dependency/MapGenerator-Python/CLR_IMPORT.py @@ -0,0 +1,31 @@ +import CLR_START +import clr +import sys +clr.AddReference('System') +PREPARATION_IMPORT = [r'../../logic/Preparation/bin/Debug/net8.0/', + r'../../logic/Preparation/bin/Release/net8.0/', + r'../../../logic/Preparation/bin/Debug/net8.0/', + r'../../../logic/Preparation/bin/Release/net8.0/', + r'_internal/'] +PREPARATION = 'Preparation' +GAMECLASS_IMPORT = [r'../../logic/GameClass/bin/Debug/net8.0/', + r'../../logic/GameClass/bin/Release/net8.0/', + r'../../../logic/GameClass/bin/Debug/net8.0/', + r'../../../logic/GameClass/bin/Release/net8.0/', + r'_internal/'] +GAMECLASS = 'GameClass' + + +def Find(paths: list[str], target: str) -> None: + try: + sys.path.append(paths[0]) + clr.AddReference(target) + except BaseException: + paths.pop(0) + if paths == []: + raise FileNotFoundError(f'未找到{target}') + Find(paths, target) + + +Find(PREPARATION_IMPORT, PREPARATION) +Find(GAMECLASS_IMPORT, GAMECLASS) diff --git a/dependency/MapGenerator-Python/CLR_START.py b/dependency/MapGenerator-Python/CLR_START.py new file mode 100644 index 00000000..9bafcc00 --- /dev/null +++ b/dependency/MapGenerator-Python/CLR_START.py @@ -0,0 +1,3 @@ +from clr_loader import get_coreclr +from pythonnet import set_runtime +set_runtime(get_coreclr()) diff --git a/dependency/MapGenerator-Python/Classes/AreaRenderDict.py b/dependency/MapGenerator-Python/Classes/AreaRenderDict.py deleted file mode 100755 index 8672813d..00000000 --- a/dependency/MapGenerator-Python/Classes/AreaRenderDict.py +++ /dev/null @@ -1,34 +0,0 @@ -from __future__ import annotations -from functools import cached_property - - -class AreaRenderDict: - class Unit: - name: str - value: int - color: str - - def __init__(self, _name: str, _value: int, _color: str) -> None: - self.name, self.value, self.color = _name, _value, _color - - areas: list[Unit] - - @cached_property - def Name2Unit(self) -> dict[str, Unit]: - return {x.name: x for x in self.areas} - - @cached_property - def Value2Unit(self) -> dict[int, Unit]: - return {x.value: x for x in self.areas} - - @cached_property - def Color2Unit(self) -> dict[str, Unit]: - return {x.color: x for x in self.areas} - - @cached_property - def Value2Color(self) -> dict[int, str]: - return {x: self.Value2Unit[x].color for x in self.Value2Unit} - - def __init__(self, _areas: list[list[str, int, str]]) -> None: - self.areas = [AreaRenderDict.Unit(_name, _value, _color) - for _name, _value, _color in _areas] diff --git a/dependency/MapGenerator-Python/Classes/MapRenderer.py b/dependency/MapGenerator-Python/Classes/MapRenderer.py index c11b20dc..4ebc558a 100755 --- a/dependency/MapGenerator-Python/Classes/MapRenderer.py +++ b/dependency/MapGenerator-Python/Classes/MapRenderer.py @@ -1,7 +1,8 @@ from __future__ import annotations from queue import Queue +from typing import Any, Generator, NoReturn -from easygui import choicebox +from easygui import choicebox, msgbox import matplotlib.pyplot as plt from matplotlib.figure import Figure from matplotlib.axes import Axes @@ -9,8 +10,9 @@ from matplotlib.ticker import MultipleLocator from matplotlib.backend_bases import MouseEvent, KeyEvent -from Classes.AreaRenderDict import AreaRenderDict -from Classes.MapStruct import MapStruct +from System import String +from GameClass.MapGenerator import MapStruct +from Preparation.Utility import PlaceType as PT from Classes.RandomCore import RandomCore @@ -25,10 +27,30 @@ def __init__(self, _r: int, _c: int, _tp: str) -> None: self.c = _c self.tp = _tp + class CurrentRender: + __cur_gen: Generator[PT, Any, NoReturn] + __cur: PT + + def __init__(self, _areas: dict[PT, str]) -> None: + _keys = list(_areas.keys()) + self.__cur = _keys[0] + + def g(): + while True: + for k in _keys: + yield k + self.__cur_gen = g() + + def Get(self) -> PT: + return self.__cur + + def Switch(self) -> None: + self.__cur = next(self.__cur_gen) + title: str map: MapStruct - areaRender: AreaRenderDict - mapf: str + areas: dict[PT, str] + mapf: String fig: Figure ax: Axes rects: list[list[Rectangle]] @@ -38,17 +60,7 @@ def __init__(self, _r: int, _c: int, _tp: str) -> None: isCursorLift: int # 0: 未提起; 1: 提起未选定; 2: 提起并选定 cursorLift: tuple[int] # 提起坐标 - __curMax: int - __cur: int - - @property - def Cur(self) -> str: - return self.areaRender.areas[self.__cur].color - - @Cur.setter - def Cur(self, _) -> None: - self.__cur += 1 - self.__cur %= self.__curMax + cur: CurrentRender @property def Queue_Render(self) -> RenderUnit: @@ -58,22 +70,21 @@ def Queue_Render(self) -> RenderUnit: def Queue_Render(self, value: RenderUnit) -> None: self.queue_render.put(value, timeout=0.1) - def __init__(self, _title, _mapStruct: MapStruct, _areas: AreaRenderDict, + def __init__(self, _title, _mapStruct: MapStruct, _areas: dict[PT, str], _mapf: str, _randoms: list[RandomCore]) -> None: self.title = _title self.map = _mapStruct - self.areaRender = _areas + self.areas = _areas self.mapf = _mapf self.randomCores = _randoms self.fig, self.ax = plt.subplots() - self.rects = [[Rectangle((j, i), 1, 1, facecolor=self.areaRender.areas[self.map[i, j]].color) + self.rects = [[Rectangle((j, i), 1, 1, facecolor=self.areas[self.map[i, j]]) for j in range(self.map.width)] for i in range(self.map.height)] self.queue_render = Queue() self.isCursorLift = 0 self.cursorLift = None - self.__curMax = len(self.areaRender.areas) - self.__cur = 0 + self.cur = MapRenderer.CurrentRender(_areas) def MainFrame(self) -> None: self.fig.set_size_inches(self.map.width, self.map.height) @@ -99,8 +110,8 @@ def on_click(self, event: MouseEvent) -> None: r, c = int(event.ydata), int(event.xdata) match self.isCursorLift: case 0: - self.map[r, c] = self.areaRender.Color2Unit[self.Cur].value - self.Queue_Render = MapRenderer.RenderUnit(r, c, self.Cur) + self.map[r, c] = self.cur.Get() + self.Queue_Render = MapRenderer.RenderUnit(r, c, self.areas[self.cur.Get()]) self.Render() case 1: self.cursorLift = (r, c) @@ -110,12 +121,12 @@ def on_click(self, event: MouseEvent) -> None: dir_r, dir_c = (1 if liftr <= r else -1), (1 if liftc <= c else -1) for i in range(liftr, r + dir_r, dir_r): for j in range(liftc, c + dir_c, dir_c): - self.map[i, j] = self.areaRender.Color2Unit[self.Cur].value - self.Queue_Render = MapRenderer.RenderUnit(i, j, self.Cur) + self.map[i, j] = self.cur.Get() + self.Queue_Render = MapRenderer.RenderUnit(i, j, self.areas[self.cur.Get()]) self.Render() self.isCursorLift = 0 case 3: - self.Cur = 0 + self.cur.Switch() case _: return @@ -126,7 +137,8 @@ def on_press(self, event: KeyEvent) -> None: case 'z': self.isCursorLift = 1 case 'c': - self.map.ToFile(self.mapf) + MapStruct.ToFile(self.mapf, self.map) + msgbox(msg='Your map has been saved.', title=self.title) case 'p': opt = choicebox(msg='Choose random', title=self.title, choices=[x.Name for x in self.randomCores]) if opt is None: @@ -137,10 +149,8 @@ def on_press(self, event: KeyEvent) -> None: x.Random(self.map) for r in range(self.map.height): for c in range(self.map.width): - self.Queue_Render = MapRenderer.RenderUnit( - r, c, self.areaRender.Value2Color[self.map[r, c]]) + self.Queue_Render = MapRenderer.RenderUnit(r, c, self.areas[self.map[r, c]]) self.Render() - plt.show(block=False) case _: return @@ -148,8 +158,8 @@ def Render(self) -> None: while not self.queue_render.empty(): cur = self.Queue_Render self._render(cur.r, cur.c, cur.tp) + plt.show(block=False) def _render(self, r: int, c: int, tp: str) -> None: self.rects[r][c].set_color(tp) self.ax.draw_artist(self.rects[r][c]) - plt.show(block=False) diff --git a/dependency/MapGenerator-Python/Classes/MapStruct.py b/dependency/MapGenerator-Python/Classes/MapStruct.py deleted file mode 100755 index e3ecf2d8..00000000 --- a/dependency/MapGenerator-Python/Classes/MapStruct.py +++ /dev/null @@ -1,52 +0,0 @@ -from __future__ import annotations -from functools import cached_property -from io import TextIOWrapper -from typing import Literal, overload -from array import array - - -class MapStruct: - __arrAlloc: array[int] - - @cached_property - def width(self) -> int: - return self.__arrAlloc[1] - - @cached_property - def height(self) -> int: - return self.__arrAlloc[0] - - @property - def ArrayView(self) -> list[list[int]]: - return [[self[i, j] for j in range(self.width)] for i in range(self.height)] - - def __getitem__(self, rowcol: tuple[int, int]) -> int: - return self.__arrAlloc[2 + rowcol[1] + rowcol[0] * self.width] - - def __setitem__(self, rowcol: tuple[int, int], val: int) -> None: - self.__arrAlloc[2 + rowcol[1] + rowcol[0] * self.width] = val - - @overload - def __init__(self, dtype: Literal['b', 'B', 'u', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q', 'f', 'd'], - height: int, width: int) -> None: ... - - @overload - def __init__(self, dtype: Literal['b', 'B', 'u', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q', 'f', 'd'], - mapFile: TextIOWrapper) -> None: ... - - def __init__(self, dtype: Literal['b', 'B', 'u', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q', 'f', 'd'], - *args) -> None: - self.__arrAlloc = array(dtype) - if len(args) == 1: - mapFile = args[0] - self.__arrAlloc.fromfile(mapFile, 2) - self.__arrAlloc.fromfile(mapFile, self.width * self.height) - else: - self.__arrAlloc.append(args[0]) - self.__arrAlloc.append(args[1]) - self.__arrAlloc.fromlist( - [0 for _ in range(self.width * self.height)]) - - def ToFile(self, path: str) -> None: - with open(path, 'wb') as fp: - self.__arrAlloc.tofile(fp) diff --git a/dependency/MapGenerator-Python/Classes/RandomCore.py b/dependency/MapGenerator-Python/Classes/RandomCore.py index a783d49e..833140fe 100755 --- a/dependency/MapGenerator-Python/Classes/RandomCore.py +++ b/dependency/MapGenerator-Python/Classes/RandomCore.py @@ -1,7 +1,7 @@ from __future__ import annotations from abc import abstractmethod, abstractproperty -from Classes.MapStruct import MapStruct +from GameClass.MapGenerator import MapStruct class RandomCore: diff --git a/dependency/MapGenerator-Python/Classes/RandomCores/PerlinRandomCore.py b/dependency/MapGenerator-Python/Classes/RandomCores/PerlinRandomCore.py index aa9b3e91..86efc3ed 100755 --- a/dependency/MapGenerator-Python/Classes/RandomCores/PerlinRandomCore.py +++ b/dependency/MapGenerator-Python/Classes/RandomCores/PerlinRandomCore.py @@ -4,15 +4,10 @@ from easygui import multenterbox from perlin_noise import PerlinNoise -from Classes.MapStruct import MapStruct +from GameClass.MapGenerator import MapStruct +from Preparation.Utility import PlaceType as PT from Classes.RandomCore import RandomCore -dict_place2num = { - 'Space': 0, - 'Ruin': 1, - 'Shadow': 2 -} - class PerlinRandomCore(RandomCore): title: str @@ -87,15 +82,15 @@ def Random(self, mp: MapStruct) -> None: for i in range(mp.height): for j in range(mp.width): if i == 0 or i == mp.height - 1: - mp[i, j] = dict_place2num['Ruin'] + mp[i, j] = PT.Ruin continue elif j == 0 or j == mp.width - 1: - mp[i, j] = dict_place2num['Ruin'] + mp[i, j] = PT.Ruin continue cur = arr[i][j] if arr0 < cur < arr1: - mp[i, j] = dict_place2num['Shadow'] + mp[i, j] = PT.Shadow elif arr1 < cur < arr2: - mp[i, j] = dict_place2num['Space'] + mp[i, j] = PT.Null else: - mp[i, j] = dict_place2num['Ruin'] + mp[i, j] = PT.Ruin diff --git "a/dependency/MapGenerator-Python/Classes/RandomCores/\320\241\321\216\320\271\320\247\321\215\320\275RandomCore.py" "b/dependency/MapGenerator-Python/Classes/RandomCores/\320\241\321\216\320\271\320\247\321\215\320\275RandomCore.py" index 36b8e590..09401dd8 100755 --- "a/dependency/MapGenerator-Python/Classes/RandomCores/\320\241\321\216\320\271\320\247\321\215\320\275RandomCore.py" +++ "b/dependency/MapGenerator-Python/Classes/RandomCores/\320\241\321\216\320\271\320\247\321\215\320\275RandomCore.py" @@ -4,7 +4,8 @@ from easygui import multenterbox -from Classes.MapStruct import MapStruct +from GameClass.MapGenerator import MapStruct +from Preparation.Utility import PlaceType as PT from Classes.RandomCore import RandomCore @@ -161,6 +162,7 @@ def Menu(self) -> bool: return True def Random(self, mp: MapStruct) -> None: + mp.Clear() СюйЧэнRandomCore.generateBorderRuin(mp) СюйЧэнRandomCore.generateHome(mp) СюйЧэнRandomCore.generateAsteroid(mp, self.asteroidWidth) @@ -174,12 +176,12 @@ def Random(self, mp: MapStruct) -> None: def isEmptyNearby(mp: MapStruct, x: int, y: int, r: int) -> bool: for i in range(x - r if x - r >= 0 else 0, (x + r if x + r <= 49 else 49) + 1): for j in range(y - r if y - r >= 0 else 0, (y - r if y + r <= 9 else 49) + 1): - if mp[i, j] != 0: + if mp[i, j] != PT.Null: return False return True @staticmethod - def haveSthNearby(mp: MapStruct, x: int, y: int, r: int, tp: int) -> int: + def haveSthNearby(mp: MapStruct, x: int, y: int, r: int, tp: PT) -> int: ret = 0 for i in range(x - r if x - r >= 0 else 0, (x + r if x + r <= 49 else 49) + 1): for j in range(y - r if y - r >= 0 else 0, (y - r if y + r <= 9 else 49) + 1): @@ -188,12 +190,12 @@ def haveSthNearby(mp: MapStruct, x: int, y: int, r: int, tp: int) -> int: return ret @staticmethod - def haveSthCross(mp: MapStruct, x: int, y: int, r: int, tp: int) -> int: + def haveSthCross(mp: MapStruct, x: int, y: int, r: int, tp: PT) -> int: ret = 0 for i in range(x - r if x - r >= 0 else 0, (x + r if x + r <= 49 else 49) + 1): if mp[i, y] == tp: ret += 1 - for j in range(y - r if y - r >= 0 else 0, (y - r if y + r <= 9 else 49) + 1): + for j in range(y - r if y - r >= 0 else 0, (y + r if y + r <= 49 else 49) + 1): if mp[x, j] == tp: ret += 1 return ret @@ -201,28 +203,28 @@ def haveSthCross(mp: MapStruct, x: int, y: int, r: int, tp: int) -> int: @staticmethod def generateBorderRuin(mp: MapStruct) -> None: for i in range(50): - mp[i, 0] = 1 - mp[i, 49] = 1 - mp[0, i] = 1 - mp[49, i] = 1 + mp[i, 0] = PT.Ruin + mp[i, 49] = PT.Ruin + mp[0, i] = PT.Ruin + mp[49, i] = PT.Ruin @staticmethod def generateHome(mp: MapStruct) -> None: - mp[3, 46] = 7 - mp[46, 3] = 7 + mp[3, 46] = PT.Home + mp[46, 3] = PT.Home @staticmethod def generateAsteroid(mp: MapStruct, width: int = DefaultСюйЧэнRandomSettings.asteroidWidth) -> None: for i in range(1, 49): for j in range(24, 24 - width, -1): - mp[i, j] = 3 - mp[49 - i, 49 - j] = 3 + mp[i, j] = PT.Asteroid + mp[49 - i, 49 - j] = PT.Asteroid for i in range(1, 23): if random() < 0.5 and i != 9 and i != 10 and i != 11 and i != 12: - mp[i, 24 - width] = 3 - mp[i, 24 + width] = 0 - mp[49 - i, 25 + width] = 3 - mp[49 - i, 25 - width] = 0 + mp[i, 24 - width] = PT.Asteroid + mp[i, 24 + width] = PT.Null + mp[49 - i, 25 + width] = PT.Asteroid + mp[49 - i, 25 - width] = PT.Null @staticmethod def generateResource(mp: MapStruct, num: int = DefaultСюйЧэнRandomSettings.resourceNum) -> None: @@ -231,8 +233,8 @@ def generateResource(mp: MapStruct, num: int = DefaultСюйЧэнRandomSettings x = floor(random() * 48) + 1 y = floor(random() * 23) + 1 if СюйЧэнRandomCore.isEmptyNearby(mp, x, y, 2): - mp[x, y] = 4 - mp[49 - x, 49 - y] = 4 + mp[x, y] = PT.Resource + mp[49 - x, 49 - y] = PT.Resource else: i -= 1 i += 1 @@ -244,8 +246,8 @@ def generateConstruction(mp: MapStruct, num: int = DefaultСюйЧэнRandomSett x = floor(random() * 48) + 1 y = floor(random() * 23) + 1 if СюйЧэнRandomCore.isEmptyNearby(mp, x, y, 1): - mp[x, y] = 5 - mp[49 - x, 49 - y] = 5 + mp[x, y] = PT.Construction + mp[49 - x, 49 - y] = PT.Construction else: i -= 1 i += 1 @@ -255,35 +257,35 @@ def generateShadow(mp: MapStruct, prob: float = DefaultСюйЧэнRandomSetting crossBonus: int = DefaultСюйЧэнRandomSettings.shadowCrossBonus) -> None: for i in range(50): for j in range(50): - if (mp[i, j] == 0 and - random() < prob * (СюйЧэнRandomCore.haveSthCross(mp, i, j, 1, 2) * crossBonus + 1)): - mp[i, j] = 2 - mp[49 - i, 49 - j] = 2 + if (mp[i, j] == PT.Null and + random() < prob * (СюйЧэнRandomCore.haveSthCross(mp, i, j, 1, PT.Shadow) * crossBonus + 1)): + mp[i, j] = PT.Shadow + mp[49 - i, 49 - j] = PT.Shadow @staticmethod def generateRuin(mp: MapStruct, prob: float = DefaultСюйЧэнRandomSettings.ruinProb, crossBonus: int = DefaultСюйЧэнRandomSettings.ruinCrossBonus) -> None: for i in range(2, 48): for j in range(2, 48): - if ((mp[i, j] == 0 or mp[i, j] == 2) and - not СюйЧэнRandomCore.haveSthNearby(mp, i, j, 1, 3) and - not СюйЧэнRandomCore.haveSthNearby(mp, i, j, 1, 7) and + if ((mp[i, j] == PT.Null or mp[i, j] == PT.Shadow) and + not СюйЧэнRandomCore.haveSthNearby(mp, i, j, 1, PT.Asteroid) and + not СюйЧэнRandomCore.haveSthNearby(mp, i, j, 1, PT.Home) and random() < prob - * (СюйЧэнRandomCore.haveSthCross(mp, i, j, 1, 1) - * (0 if СюйЧэнRandomCore.haveSthCross(mp, i, j, 1, 1) > 1 + * (СюйЧэнRandomCore.haveSthCross(mp, i, j, 1, PT.Ruin) + * (0 if СюйЧэнRandomCore.haveSthCross(mp, i, j, 1, PT.Ruin) > 1 else crossBonus) + 1)): - mp[i, j] = 1 - mp[49 - i, 49 - j] = 1 + mp[i, j] = PT.Ruin + mp[49 - i, 49 - j] = PT.Ruin @staticmethod def generateWormhole(mp: MapStruct) -> None: for i in range(1, 49): - if mp[10, i] == 3: - mp[10, i] = 6 - mp[39, 49 - i] = 6 - if mp[11, i] == 3: - mp[11, i] = 6 - mp[38, 49 - i] = 6 - if mp[24, i] == 3: - mp[24, i] = 6 - mp[25, 49 - i] = 6 + if mp[10, i] == PT.Asteroid: + mp[10, i] = PT.Wormhole + mp[39, 49 - i] = PT.Wormhole + if mp[11, i] == PT.Asteroid: + mp[11, i] = PT.Wormhole + mp[38, 49 - i] = PT.Wormhole + if mp[24, i] == PT.Asteroid: + mp[24, i] = PT.Wormhole + mp[25, 49 - i] = PT.Wormhole diff --git a/dependency/MapGenerator-Python/GameClass/MapGenerator.pyi b/dependency/MapGenerator-Python/GameClass/MapGenerator.pyi new file mode 100644 index 00000000..0b28b7a7 --- /dev/null +++ b/dependency/MapGenerator-Python/GameClass/MapGenerator.pyi @@ -0,0 +1,37 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Stub for C# + +from __future__ import annotations +from typing import overload + +from System import Array, UInt32, String +from Preparation.Utility import PlaceType as PT + + +class MapStruct: + height: UInt32 + width: UInt32 + map: Array[PT] + + @overload + def __init__(self, height: UInt32, width: UInt32) -> None: ... + + @overload + def __init__(self, height: UInt32, width: UInt32, map: Array[PT]) -> None: ... + + @overload + def __init__(self, height: UInt32, width: UInt32, map: Array[UInt32]) -> None: ... + + @staticmethod + def FromFile(filename: String) -> MapStruct: ... + + @staticmethod + def ToFile(filename: String, src: MapStruct) -> None: ... + + def Clear(self) -> None: ... + + def __getitem__(self, i: UInt32, j: UInt32) -> PT: ... + + def __setitem__(self, i: UInt32, j: UInt32, value: PT) -> None: ... diff --git a/dependency/MapGenerator-Python/MapGenerator.spec b/dependency/MapGenerator-Python/MapGenerator.spec index 124c419b..333e8673 100755 --- a/dependency/MapGenerator-Python/MapGenerator.spec +++ b/dependency/MapGenerator-Python/MapGenerator.spec @@ -5,7 +5,9 @@ a = Analysis( ['main.py'], pathex=[], binaries=[], - datas=[('Settings.json', '.')], + datas=[('../../logic/Preparation/bin/Debug/net8.0/Preparation.dll', '.'), + ('../../logic/GameClass/bin/Debug/net8.0/GameClass.dll', '.') + ], hiddenimports=[], hookspath=[], hooksconfig={}, diff --git a/dependency/MapGenerator-Python/Pipfile b/dependency/MapGenerator-Python/Pipfile index d4834fb7..86bbb1ff 100755 --- a/dependency/MapGenerator-Python/Pipfile +++ b/dependency/MapGenerator-Python/Pipfile @@ -7,6 +7,7 @@ name = "pip_conf_index_global" easygui = "*" matplotlib = "*" perlin-noise = "*" +pythonnet = "*" [dev-packages] diff --git a/dependency/MapGenerator-Python/Pipfile.lock b/dependency/MapGenerator-Python/Pipfile.lock index 5413d322..e33cef7f 100755 --- a/dependency/MapGenerator-Python/Pipfile.lock +++ b/dependency/MapGenerator-Python/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "2ef3fb26544825937dfea936d5374c5981f7b007a6c6c42357a12add146dc967" + "sha256": "c836cb6b81d74e4c5af61fc9cdb731390cac9a489341a2d6b9141d1d4fc4728b" }, "pipfile-spec": 6, "requires": { @@ -16,6 +16,176 @@ ] }, "default": { + "cffi": { + "hashes": [ + "sha256:0928df15fc8e63099fa82cf2deb0f67ad740639ae23089fd26c6d919d08f9844", + "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", + "sha256:0e074a6dd01c0576710259bef3f008b261ac6fa3252e19370b5d2c466b621f5d", + "sha256:0e4ffd75af0ff2f2ec6ba18e249c6969653d6f06bd7f4a405236c217963dd887", + "sha256:0ed256dd741501dc11c8f536972f54a5a68df018a7959ce97219a8b308b4b881", + "sha256:0ff5cf5f823c507f1449121fe29f31989b8aa2782807e5d0f28a7f8ee2678294", + "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", + "sha256:14749dd9f2906b1f3381927d548fa1136f8361253543b20d08c8b3ddf0e88585", + "sha256:1aa49e13394da30a35c772c1042fc21d342c41e8137d1e153d2c467f44201dae", + "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", + "sha256:20df2ea98e721ecc58df359bc596092bb43fccb8e692deaf35674d34f868bf37", + "sha256:2361e1a133c9999b4a3eaf03c7ce7f91c69347e617289675e7b3b07fa4392e23", + "sha256:23a0d34f7f10935d798e4a3700f7ebff6bfdfa8476b7e55a56dbf53b8d41da55", + "sha256:24357100aceaf76318b9a826237fe7dc20652daf1d15d6f0db162fea3d665e7b", + "sha256:278037e3e27deab1d9a8d2780371d368e0265c2031ada0554ed81dd2376dfced", + "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", + "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", + "sha256:2dd553b3ff4817b2dab4c6a9c257dd35f720976815c899d5040297604acd98e3", + "sha256:2de1371afe36f892916da71e83ab00f8766ccd81df40794bacb6eda7a355cd6f", + "sha256:2efec335c2b27a5bdd32f1da827a7d3cec38ad2601f5eddbb79c7eb8230b442a", + "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", + "sha256:31fd177716140a5229c30e6e316d49a9eedb13b10eb7726cb892cd4aa5bff84f", + "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", + "sha256:32e9fef44dd5c0e5f09dbd75ddec0961be5d919c4fb497a3d2e482e12eea8417", + "sha256:3389f61db8594bb5e996340188aa81a6dc817b29ee80fd1c6471c63d2721e269", + "sha256:33dea583fa13e02af6495232838410fdce42045fe6d7bafc83eec4adb7bf76a8", + "sha256:3591f33b9b0f8a31a612d9f1cefe595973d991233eecce07948d1e74114cc0c1", + "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", + "sha256:3743ea0ed69c8cc40cb6f29482d8b7de20235c04d1373406fe2df01b961b9064", + "sha256:384f5328f37ab2c681d925b1d1cc7d79cd355546a9d7e6d901ed4e2083b4b548", + "sha256:3a3a5d6575f5193c305b026ab4b6cfd9faf6b23ad823cf527553cf8e98055ffe", + "sha256:3b478e5cb81139cfb2726f7b7d5b3662e4cbbe8e13da5443db23545dcc4c0d05", + "sha256:3ce9be5bceb74b9f55dbe326e933faf674f891223852eef52a2a70dcb07c523f", + "sha256:3f3637d26849648ca75ffccdf8e24c0bef77cb038f1fc178afa8a12afa5dffb8", + "sha256:3fdc35da8835fd60a7a26153919f90f58ae82822f3d2992cc93170fb76760384", + "sha256:43884e9fe6a612c25b420ed0e62d219c309cfd2cd80132829c577e7d8e50afb8", + "sha256:43d6aa2bde10de152ab417ef701e8db32f1092df368cec4d432fa58b589955ef", + "sha256:462fdd5add40619ae29f4f939c33e69753ed1036dd7094bec4e3afe9f02359c8", + "sha256:4640e7d91fd348f8877a64563ef3fc8f0e600c69860a142d299b21f13babcc98", + "sha256:4766877e1aca2f1d6d93416873ec268f034c2a03ffb11b6daf5db5dcad03709b", + "sha256:478d6a99f78478d7e3b8db69bbd1a648fff31a313e1ae76f87d260dde91e5cd7", + "sha256:4ce6c1a2e8925db47492378860b25a051a73a5fe217261af7dee3d523f2922ba", + "sha256:50e493ab94d425edfc713a2cac4d56a6a6c11638bebf411e86013be69e624e69", + "sha256:52f75ee1a8dd96ee4a96820df4fb079adb29736c0d351235d591bc94aa933689", + "sha256:563f16837d86a5e3fb4625f0baf936898d5b3da03a1192e16592b226c73cfd4a", + "sha256:577320b3b767f3597dff98fef933986b1b8cf077a4bafa43e92cc9bd389788eb", + "sha256:57ddcf5dd192126e62e9ed427ac6c61f36300482938e3f46f5cda1105b09dc90", + "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", + "sha256:5926d3caa290106a602b2f70d8d242c885802427134c2f7a700c53da6b1a4d53", + "sha256:5a3bf751ceba6c9165e21b2ef3408830449abfaf3db5f791b6e9fde92a04dea0", + "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", + "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", + "sha256:5f2240660bb64c4b2d5104688561540d90da8e19edbc7ae904d46ae685d0ab57", + "sha256:62fb88370101ac6c983114fb014679158e359b3d6b6c539b17618acfb6d5539e", + "sha256:6406e237787e3a36951b2f4ab805524e605ab508477be444ebbce1b87845dedd", + "sha256:65cd3cfc9262a82ed9f096cd41dfd9b2b293a009f52bbfe499fb9f246edc4404", + "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", + "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", + "sha256:678716ca1c06138450b0454ada2245d326765720c2634d370d249cd0d566b992", + "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", + "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", + "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", + "sha256:6b5ae6273853754efa05be54b97b9fb830679f349f425076d7993b0cac7ba4f3", + "sha256:6d8184615e735aff76b2c5546472b5faed19abb48a53b7770eaee3bd4e01b86e", + "sha256:70d591221b7adb3b80e0a4dca42a22b8385635525820a777d43f00b6156d0690", + "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", + "sha256:75523efb2bda34d882f8b8c0e41daed350e8cd11307b1154a79e857cb5fa0814", + "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", + "sha256:76bac0ad1168d71e9f117b5bbcd4efc5d7328f9a0054fd058b0b0eba88bcf7d6", + "sha256:78faf51033e48213a2ef2d8cb2987e650058a60ebe8085bcc3afe484c61950fb", + "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", + "sha256:7d7d38f40905b668e2c6bb0dcfc1428de67438df93e05005b22a1a753ab21dc2", + "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", + "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", + "sha256:85431bf5729028182587f9bba21c82a567d82e4cddd8e74e1952dcba5fd9f337", + "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", + "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", + "sha256:8ed16244d7801e7ac6fd004356588433b5f7f421acd5369c3a9b3b3119f2f12d", + "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", + "sha256:911868b5d339d866040851c55c7f95d01e21bcb3764641a264f88dc9f314dbef", + "sha256:919b68f21fa046afc4c6093a0deb02c7741f6e189a8af3a3379b0db12093b18f", + "sha256:96df1e57477e0e1387c7207ee3f493b2f0c67d50e6f52f3302ea75bf4f2c1861", + "sha256:9861337fbeab2e421e068cf1068bf080dd742a02b1c65f2c613b9479438e626d", + "sha256:98cf866039b1b41712a71cb448001a0ed1bb38f1d1db583aea1b78cae05ec057", + "sha256:98e2d9d7754509a1e5366c378eb095e9f8a3b67ba6dc822092153fe3c7529d45", + "sha256:993088af255a591351fb1f7e9a2fb459f790ba46b29c3481cb5c0cf54005dc25", + "sha256:9b598e2b6f0f24180482458d644db6dc44e98bcdc9c00914d69b2749994efe0c", + "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", + "sha256:9d3943738d1d4bfd66cf42a7e0fef83bd1d6021c018363b47977e00200caf7e6", + "sha256:9e610ae4b2cfd1b262427b9afd5953102137a6b167c025c0a701f9c822b20535", + "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", + "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", + "sha256:a0a6f27c022be6bbd19b9b7b6c2e584e6aa68586c30cec6ef3505a21e127124f", + "sha256:a10bcc26a395411129016be78b82071f1431ab5763e5c3f25ee18e91bf3f88af", + "sha256:a27f0237f7481a0e48bcce9de390c07d6518a9958c330817ef505f4fe0def1ad", + "sha256:a55f625e389f89e4d06b188f39deb51d3dea7ac96092e1b8cd4182eb761b537e", + "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", + "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", + "sha256:a9497765f8cfb1451958216298cf1e96fe43b40e38aee4d9c34ca44ee122295b", + "sha256:aac5299ed6c4b56447b6b0c4f99e587e4998c05bb4d633002adcd36be68085e1", + "sha256:ab70e66da8e53534c5b34012b4ba9f9805a7e379902eeb583aaa6e15e18db550", + "sha256:aba626bd9b59d2661c4dd8fbe7c81fdc6436021ce3ce0635de7c442b91e6877d", + "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", + "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", + "sha256:ae42699a559623cb730602ade2cc0a1f053f8b0ed958c8c1c7ddd0a02254876a", + "sha256:af5b0f7e331ea55232f15e972abd74d2817964accdd6fd3e5c2b8ac354fa993f", + "sha256:b02e33fb7aac7149828a7912dc44751821a74d568984af9946e270ae5708e2fd", + "sha256:b10e6f2060e4c0c5a4f420dac78d229f01dc5ea2ee9951b95e5d252b69859e57", + "sha256:b1d80ef126d3b8e1e1ead94fb8ac44eb1f4ed36990dba3e09fa4b7921426879d", + "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", + "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", + "sha256:b74012db526dcaa6488d4e2b6cf65ae41a50fcd132a3fef39e99a01f1c71684a", + "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", + "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", + "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", + "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", + "sha256:bd06b3b5ffde55cc618538f8db442c51218b703da8fdba0c20969d5f8477fdca", + "sha256:bd43ef97cabb2bab95c09956c28a87a0e05274b9258996521696912bf93da36f", + "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", + "sha256:c22b4a9f9f3a172baace6ff2a0dfd7eafa691d1b714aa89978b66d467c6030d7", + "sha256:c3d7f3337c8e2e6287651c0116adb7a1fd1e43d0ffeebd49a38a86425b92c665", + "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", + "sha256:c761446abcc82b52f1be155f5266887216a6e20174d3afd7025c95fdd57d527b", + "sha256:c9d9cbc569ef960e841d7777c0996864bf307a73497248bedaf542c3c1f6ce34", + "sha256:cb7df7ab7d13d2d5d6df4d4adb6d9013139be8bfab17f9bedcdf9aa0ae10c6c1", + "sha256:cbf204995c237988376b60021bfe3c6eb161f8be68b2a7546bb4fda9cb1a38e1", + "sha256:d184e5d68d4ddfae311dcc63614ba53d0d7a592339366f6ec5f522ed43f50f20", + "sha256:d411fad9c6b3c9ef6b7fec75f6e57389f63f021e295b76934884dd3682c92a58", + "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", + "sha256:d9b57c9037208b92529f14b5b18c5416ebaa84446e7f5172d4f45074b4b4bb61", + "sha256:dacd0caf16ed0c23a1ac105fd129f410ff7a2aa8240c479be2c25adf2095996e", + "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", + "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", + "sha256:dd8cb96761204564b82c32ae07e2f83121799fe3db2cd6c39135983a2705c028", + "sha256:dfd80e1feaffe8eff95ae26ffa83bdf7ad5f1e24f00b24310c27a95eca51a4b6", + "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", + "sha256:e21f83989e4f54eece0347451c4694c6116de04c93b80a422ead425bfbdd18c3", + "sha256:e24ab5f0ea81b1285b93b637ad44d8da1e4928540b2bc554b4533a267bddc575", + "sha256:e2d583f83b5f6e4c284ccf53f220cead00241231e51e573d6324e05ad1e6c879", + "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", + "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", + "sha256:e654ae5341ba422841ebcb992c0041f9379f18cf0e7f7c70e00e36ff78777420", + "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", + "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", + "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", + "sha256:e9b75f0097a15dc2a6c00571be3d50381b0e921b0942a398fcde7cdf70277f1f", + "sha256:ed737449b6d66429dfe6c513d015d61a3bcd845aa993a630ef5f5a89fadd4070", + "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", + "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", + "sha256:efadf60f8cc01419369db94d63ca17de3f5a214c77ef260c18a1e64f2e0da02c", + "sha256:f2c9e3946ee71debff0bc2260aa4994e782d4a7e95923c101a20d16eabb075f7", + "sha256:f4a99491edeafd0c41f5fe39ba0540b889a17f86f740d8160ee535fa0303c9ec", + "sha256:f6fc6549854a10cac989e6783436f58f0611aadca07d8179fd377c248c66a22b", + "sha256:f89b29d72d6bcfd2945bf965b1de1b5fc4bfdfe7438e12a6ad4794fb4e5f014c", + "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", + "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" + ], + "markers": "python_version >= '3.8'", + "version": "==1.16.0" + }, + "clr-loader": { + "hashes": [ + "sha256:019348ae6b6a83c7a406d14537c277cecf7a3a53b263ec342c81ded5845a67ee", + "sha256:79bbfee4bf6ac2f4836d89af2c39e0c32dce5d0c062596185aef380f317507a6" + ], + "markers": "python_version >= '3.7'", + "version": "==0.2.6" + }, "contourpy": { "hashes": [ "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8", @@ -84,51 +254,51 @@ }, "fonttools": { "hashes": [ - "sha256:05d7c4d2c95b9490e669f3cb83918799bf1c838619ac6d3bad9ea017cfc63f2e", - "sha256:0f412954275e594f7a51c16f3b3edd850acb0d842fefc33856b63a17e18499a5", - "sha256:22ea8aa7b3712450b42b044702bd3a64fd118006bad09a6f94bd1b227088492e", - "sha256:2db63941fee3122e31a21dd0f5b2138ce9906b661a85b63622421d3654a74ae2", - "sha256:2e91e19b583961979e2e5a701269d3cfc07418963bee717f8160b0a24332826b", - "sha256:31b38528f25bc662401e6ffae14b3eb7f1e820892fd80369a37155e3b636a2f4", - "sha256:3d29509f6e05e8d725db59c2d8c076223d793e4e35773040be6632a0349f2f97", - "sha256:46c79af80a835410874683b5779b6c1ec1d5a285e11c45b5193e79dd691eb111", - "sha256:4e90dd81b6e0d97ebfe52c0d12a17a9ef7f305d6bfbb93081265057d6092f252", - "sha256:50d25893885e80a5955186791eed5579f1e75921751539cc1dc3ffd1160b48cf", - "sha256:518a945dbfe337744bfff31423c1430303b8813c5275dffb0f2577f0734a1189", - "sha256:54efed22b2799a85475e6840e907c402ba49892c614565dc770aa97a53621b2b", - "sha256:58af428746fa73a2edcbf26aff33ac4ef3c11c8d75bb200eaea2f7e888d2de4e", - "sha256:59b6ad83cce067d10f4790c037a5904424f45bebb5e7be2eb2db90402f288267", - "sha256:63a3112f753baef8c6ac2f5f574bb9ac8001b86c8c0c0380039db47a7f512d20", - "sha256:66bc6efd829382f7a7e6cf33c2fb32b13edc8a239eb15f32acbf197dce7a0165", - "sha256:6999e80a125b0cd8e068d0210b63323f17338038c2ecd2e11b9209ec430fe7f2", - "sha256:6d16d9634ff1e5cea2cf4a8cbda9026f766e4b5f30b48f8180f0e99133d3abfc", - "sha256:84f308b7a8d28208d54315d11d35f9888d6d607673dd4d42d60b463682ee0400", - "sha256:9ee8692e23028564c13d924004495f284df8ac016a19f17a87251210e1f1f928", - "sha256:a3da036b016c975c2d8c69005bdc4d5d16266f948a7fab950244e0f58301996a", - "sha256:a7aec7f5d14dfcd71fb3ebc299b3f000c21fdc4043079101777ed2042ba5b7c5", - "sha256:a8a1fa9a718de0bc026979c93e1e9b55c5efde60d76f91561fd713387573817d", - "sha256:a8b99713d3a0d0e876b6aecfaada5e7dc9fe979fcd90ef9fa0ba1d9b9aed03f2", - "sha256:b63da598d9cbc52e2381f922da0e94d60c0429f92207bd3fb04d112fc82ea7cb", - "sha256:b6e6aa2d066f8dafd06d8d0799b4944b5d5a1f015dd52ac01bdf2895ebe169a0", - "sha256:b99fe8ef4093f672d00841569d2d05691e50334d79f4d9c15c1265d76d5580d2", - "sha256:b9beb0fa6ff3ea808ad4a6962d68ac0f140ddab080957b20d9e268e4d67fb335", - "sha256:b9eab7f9837fdaa2a10a524fbcc2ec24bf60637c044b6e4a59c3f835b90f0fae", - "sha256:bca49da868e8bde569ef36f0cc1b6de21d56bf9c3be185c503b629c19a185287", - "sha256:c05064f95aacdfc06f21e55096c964b2228d942b8675fa26995a2551f6329d2d", - "sha256:c2de1fb18198acd400c45ffe2aef5420c8d55fde903e91cba705596099550f3b", - "sha256:c794de4086f06ae609b71ac944ec7deb09f34ecf73316fddc041087dd24bba39", - "sha256:d4fa4f4bc8fd86579b8cdbe5e948f35d82c0eda0091c399d009b2a5a6b61c040", - "sha256:dab3d00d27b1a79ae4d4a240e8ceea8af0ff049fd45f05adb4f860d93744110d", - "sha256:dbac86d83d96099890e731cc2af97976ff2c98f4ba432fccde657c5653a32f1c", - "sha256:df40daa6c03b98652ffe8110ae014fe695437f6e1cb5a07e16ea37f40e73ac86", - "sha256:e1cd1c6bb097e774d68402499ff66185190baaa2629ae2f18515a2c50b93db0c", - "sha256:e8ff7d19a6804bfd561cfcec9b4200dd1788e28f7de4be70189801530c47c1b3", - "sha256:eb01c49c8aa035d5346f46630209923d4927ed15c2493db38d31da9f811eb70d", - "sha256:f53526668beccdb3409c6055a4ffe50987a7f05af6436fa55d61f5e7bd450219", - "sha256:f611c97678604e302b725f71626edea113a5745a7fb557c958b39edb6add87d5" + "sha256:0452fcbfbce752ba596737a7c5ec5cf76bc5f83847ce1781f4f90eab14ece252", + "sha256:0a2417547462e468edf35b32e3dd06a6215ac26aa6316b41e03b8eeaf9f079ea", + "sha256:0d2b01428f7da26f229a5656defc824427b741e454b4e210ad2b25ed6ea2aed4", + "sha256:0d533f89819f9b3ee2dbedf0fed3825c425850e32bdda24c558563c71be0064e", + "sha256:12ee86abca46193359ea69216b3a724e90c66ab05ab220d39e3fc068c1eb72ac", + "sha256:18b35fd1a850ed7233a99bbd6774485271756f717dac8b594958224b54118b61", + "sha256:292922dc356d7f11f5063b4111a8b719efb8faea92a2a88ed296408d449d8c2e", + "sha256:2eb4167bde04e172a93cf22c875d8b0cff76a2491f67f5eb069566215302d45d", + "sha256:3cdb9a92521b81bf717ebccf592bd0292e853244d84115bfb4db0c426de58348", + "sha256:4108b1d247953dd7c90ec8f457a2dec5fceb373485973cc852b14200118a51ee", + "sha256:4709c5bf123ba10eac210d2d5c9027d3f472591d9f1a04262122710fa3d23199", + "sha256:5057ade278e67923000041e2b195c9ea53e87f227690d499b6a4edd3702f7f01", + "sha256:56339ec557f0c342bddd7c175f5e41c45fc21282bee58a86bd9aa322bec715f2", + "sha256:578c00f93868f64a4102ecc5aa600a03b49162c654676c3fadc33de2ddb88a81", + "sha256:594206b31c95fcfa65f484385171fabb4ec69f7d2d7f56d27f17db26b7a31814", + "sha256:63c73b9dd56a94a3cbd2f90544b5fca83666948a9e03370888994143b8d7c070", + "sha256:63dc592a16cd08388d8c4c7502b59ac74190b23e16dfc863c69fe1ea74605b68", + "sha256:6978bade7b6c0335095bdd0bd97f8f3d590d2877b370f17e03e0865241694eb5", + "sha256:6f30e605c7565d0da6f0aec75a30ec372072d016957cd8fc4469721a36ea59b7", + "sha256:702ae93058c81f46461dc4b2c79f11d3c3d8fd7296eaf8f75b4ba5bbf813cd5f", + "sha256:8b8a45254218679c7f1127812761e7854ed5c8e34349aebf581e8c9204e7495a", + "sha256:902e9c4e9928301912f34a6638741b8ae0b64824112b42aaf240e06b735774b1", + "sha256:97f0a49fa6aa2d6205c6f72f4f98b74ef4b9bfdcb06fd78e6fe6c7af4989b63e", + "sha256:9b4ec6d42a7555f5ae35f3b805482f0aad0f1baeeef54859492ea3b782959d4a", + "sha256:9b58638d8a85e3a1b32ec0a91d9f8171a877b4b81c408d4cb3257d0dee63e092", + "sha256:a8c8b54bd1420c184a995f980f1a8076f87363e2bb24239ef8c171a369d85a31", + "sha256:aee76fd81a8571c68841d6ef0da750d5ff08ff2c5f025576473016f16ac3bcf7", + "sha256:b10633aafc5932995a391ec07eba5e79f52af0003a1735b2306b3dab8a056d48", + "sha256:bcd77f89fc1a6b18428e7a55dde8ef56dae95640293bfb8f4e929929eba5e2a2", + "sha256:bff5b38d0e76eb18e0b8abbf35d384e60b3371be92f7be36128ee3e67483b3ec", + "sha256:c900508c46274d32d308ae8e82335117f11aaee1f7d369ac16502c9a78930b0a", + "sha256:cad5cfd044ea2e306fda44482b3dd32ee47830fa82dfa4679374b41baa294f5f", + "sha256:cdfd7557d1bd294a200bd211aa665ca3b02998dcc18f8211a5532da5b8fad5c5", + "sha256:cf5a0cd974f85a80b74785db2d5c3c1fd6cc09a2ba3c837359b2b5da629ee1b0", + "sha256:d10979ef14a8beaaa32f613bb698743f7241d92f437a3b5e32356dfb9769c65d", + "sha256:d20588466367f05025bb1efdf4e5d498ca6d14bde07b6928b79199c588800f0a", + "sha256:d3260db55f1843e57115256e91247ad9f68cb02a434b51262fe0019e95a98738", + "sha256:df48798f9a4fc4c315ab46e17873436c8746f5df6eddd02fad91299b2af7af95", + "sha256:e3e33862fc5261d46d9aae3544acb36203b1a337d00bdb5d3753aae50dac860e", + "sha256:e740a7602c2bb71e1091269b5dbe89549749a8817dc294b34628ffd8b2bf7124", + "sha256:f40441437b039930428e04fb05ac3a132e77458fb57666c808d74a556779e784", + "sha256:f7449493886da6a17472004d3818cc050ba3f4a0aa03fb47972e4fa5578e6703" ], "markers": "python_version >= '3.8'", - "version": "==4.44.0" + "version": "==4.48.1" }, "kiwisolver": { "hashes": [ @@ -242,80 +412,80 @@ }, "matplotlib": { "hashes": [ - "sha256:044df81c1f6f3a8e52d70c4cfcb44e77ea9632a10929932870dfaa90de94365d", - "sha256:0d24c47a1bb47e392fbcd26fe322e4ff3431653ac1e8718e4e147d450ae97a44", - "sha256:1fcb49b6baf0375281979cbf26695ec10bd1cada1e311893e89533b3b70143e7", - "sha256:20a0fdfd3ee836179047f3782be060057b878ad37f5abe29edf006a1ff3ecd73", - "sha256:27502d2452208ae784c19504644f09f83742809143bbeae147617640930aa344", - "sha256:2afe7d2f8c9e35e94fbcfcfd9b28f29cb32f0a9068cba469cf907428379c8db9", - "sha256:43a9d40feb63c9e31a0b8b069dcbd74a912f59bdc0095d187126694cd26977e4", - "sha256:43cf368a4a1d8cbc426944806e5e183cead746647a64d2cdb786441546235967", - "sha256:608ea2951838d391e45dec2e644888db6899c752d3c29e157af9dcefb3d7d8d5", - "sha256:7658b7073c1d6a2922ecc0ed41602410fae88586cb8a54f7a2063d537b6beaf7", - "sha256:7f99d07c0e753717775be7be39ab383453b4d8b629c9fa174596b970c6555890", - "sha256:82ec95b02e894561c21e066bd0c716e4b410df141ce9441aa5af6cd937e4ade2", - "sha256:afb72822ae410d62aa1a2920c6563cb5680de9078358f0e9474396c6c3e06be2", - "sha256:bf6889643d4560fcc56f9f0941f078e4df0d72a6c3e4ca548841fc13c5642664", - "sha256:c1b0ecaa0d1f4fe1e30f625a2347f0034a89a7d17c39efbb502e554d92ee2f61", - "sha256:c54c55457c7f5ea4dfdba0020004fc7667f5c10c8d9b8010d735345acc06c9b8", - "sha256:ca84deaa38cb64b7dd160ca2046b45f7b5dbff2b0179642e1339fadc337446c9", - "sha256:cd54bbf089953140905768ed4626d7223e1ad1d7e2a138410a9c4d3b865ccd80", - "sha256:d921c0270647ab11c3ef283efaaa3d46fd005ba233bfb3aea75231cdf3656de8", - "sha256:e11ab864323fa73ac1b7849688d9671c47a2665242e899785b4db1a375b547e1", - "sha256:e17674ee127f78f26fea237e7f4d5cf910a8be82beb6260fedf358b88075b823", - "sha256:e3ad1759ad4a5245172c6d32b8ada603a6020d03211524c39d78d25c9a7dc0d2", - "sha256:e3bb809b743653b5aab5d72ee45c8c937c28e147b0846b0826a54bece898608c", - "sha256:e5a504ff40f81d6233603475a45497a6dca37a873393fa20ae6f7dd6596ef72b", - "sha256:ed3b29f54f6bbf3eaca4cbd23bc260155153ace63b7f597c474fa6fc6f386530", - "sha256:f34b46dbb1db1f09bfa937cd5853e5f2af232caeeff509c3ab6e43fd33780eae", - "sha256:f55fb5ff02d999a100be28bf6ffe826e1867a54c7b465409685332c9dd48ffa5", - "sha256:ff842e27bc6a80de08c40e0bfdce460bd08080e8a94af131162b6a1b8948f2cc" + "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1", + "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0", + "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4", + "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7", + "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630", + "sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89", + "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d", + "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717", + "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a", + "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627", + "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31", + "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213", + "sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843", + "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788", + "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367", + "sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4", + "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a", + "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8", + "sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b", + "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18", + "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6", + "sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa", + "sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917", + "sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20", + "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331", + "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63", + "sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f", + "sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8" ], "index": "pip_conf_index_global", "markers": "python_version >= '3.9'", - "version": "==3.8.1" + "version": "==3.8.2" }, "numpy": { "hashes": [ - "sha256:06fa1ed84aa60ea6ef9f91ba57b5ed963c3729534e6e54055fc151fad0423f0a", - "sha256:174a8880739c16c925799c018f3f55b8130c1f7c8e75ab0a6fa9d41cab092fd6", - "sha256:1a13860fdcd95de7cf58bd6f8bc5a5ef81c0b0625eb2c9a783948847abbef2c2", - "sha256:1cc3d5029a30fb5f06704ad6b23b35e11309491c999838c31f124fee32107c79", - "sha256:22f8fc02fdbc829e7a8c578dd8d2e15a9074b630d4da29cda483337e300e3ee9", - "sha256:26c9d33f8e8b846d5a65dd068c14e04018d05533b348d9eaeef6c1bd787f9919", - "sha256:2b3fca8a5b00184828d12b073af4d0fc5fdd94b1632c2477526f6bd7842d700d", - "sha256:2beef57fb031dcc0dc8fa4fe297a742027b954949cabb52a2a376c144e5e6060", - "sha256:36340109af8da8805d8851ef1d74761b3b88e81a9bd80b290bbfed61bd2b4f75", - "sha256:3703fc9258a4a122d17043e57b35e5ef1c5a5837c3db8be396c82e04c1cf9b0f", - "sha256:3ced40d4e9e18242f70dd02d739e44698df3dcb010d31f495ff00a31ef6014fe", - "sha256:4a06263321dfd3598cacb252f51e521a8cb4b6df471bb12a7ee5cbab20ea9167", - "sha256:4eb8df4bf8d3d90d091e0146f6c28492b0be84da3e409ebef54349f71ed271ef", - "sha256:5d5244aabd6ed7f312268b9247be47343a654ebea52a60f002dc70c769048e75", - "sha256:64308ebc366a8ed63fd0bf426b6a9468060962f1a4339ab1074c228fa6ade8e3", - "sha256:6a3cdb4d9c70e6b8c0814239ead47da00934666f668426fc6e94cce869e13fd7", - "sha256:854ab91a2906ef29dc3925a064fcd365c7b4da743f84b123002f6139bcb3f8a7", - "sha256:94cc3c222bb9fb5a12e334d0479b97bb2df446fbe622b470928f5284ffca3f8d", - "sha256:96ca5482c3dbdd051bcd1fce8034603d6ebfc125a7bd59f55b40d8f5d246832b", - "sha256:a2bbc29fcb1771cd7b7425f98b05307776a6baf43035d3b80c4b0f29e9545186", - "sha256:a4cd6ed4a339c21f1d1b0fdf13426cb3b284555c27ac2f156dfdaaa7e16bfab0", - "sha256:aa18428111fb9a591d7a9cc1b48150097ba6a7e8299fb56bdf574df650e7d1f1", - "sha256:aa317b2325f7aa0a9471663e6093c210cb2ae9c0ad824732b307d2c51983d5b6", - "sha256:b04f5dc6b3efdaab541f7857351aac359e6ae3c126e2edb376929bd3b7f92d7e", - "sha256:b272d4cecc32c9e19911891446b72e986157e6a1809b7b56518b4f3755267523", - "sha256:b361d369fc7e5e1714cf827b731ca32bff8d411212fccd29ad98ad622449cc36", - "sha256:b96e7b9c624ef3ae2ae0e04fa9b460f6b9f17ad8b4bec6d7756510f1f6c0c841", - "sha256:baf8aab04a2c0e859da118f0b38617e5ee65d75b83795055fb66c0d5e9e9b818", - "sha256:bcc008217145b3d77abd3e4d5ef586e3bdfba8fe17940769f8aa09b99e856c00", - "sha256:bd3f0091e845164a20bd5a326860c840fe2af79fa12e0469a12768a3ec578d80", - "sha256:cc392fdcbd21d4be6ae1bb4475a03ce3b025cd49a9be5345d76d7585aea69440", - "sha256:d73a3abcac238250091b11caef9ad12413dab01669511779bc9b29261dd50210", - "sha256:f43740ab089277d403aa07567be138fc2a89d4d9892d113b76153e0e412409f8", - "sha256:f65738447676ab5777f11e6bbbdb8ce11b785e105f690bc45966574816b6d3ea", - "sha256:f79b231bf5c16b1f39c7f4875e1ded36abee1591e98742b05d8a0fb55d8a3eec", - "sha256:fe6b44fb8fcdf7eda4ef4461b97b3f63c466b27ab151bec2366db8b197387841" + "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", + "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", + "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", + "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", + "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", + "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", + "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea", + "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c", + "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", + "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", + "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be", + "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", + "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", + "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", + "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", + "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd", + "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c", + "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", + "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0", + "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c", + "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", + "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", + "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", + "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6", + "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", + "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", + "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30", + "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", + "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", + "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", + "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", + "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", + "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764", + "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", + "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3", + "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f" ], "markers": "python_version >= '3.9'", - "version": "==1.26.2" + "version": "==1.26.4" }, "packaging": { "hashes": [ @@ -335,63 +505,84 @@ }, "pillow": { "hashes": [ - "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d", - "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de", - "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616", - "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839", - "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099", - "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a", - "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219", - "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106", - "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b", - "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412", - "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b", - "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7", - "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2", - "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7", - "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14", - "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f", - "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27", - "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57", - "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262", - "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28", - "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610", - "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172", - "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273", - "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e", - "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d", - "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818", - "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f", - "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9", - "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01", - "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7", - "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651", - "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312", - "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80", - "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666", - "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061", - "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b", - "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992", - "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593", - "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4", - "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db", - "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba", - "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd", - "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e", - "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212", - "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb", - "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2", - "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34", - "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256", - "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f", - "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2", - "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38", - "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996", - "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a", - "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793" + "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8", + "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39", + "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac", + "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869", + "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e", + "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04", + "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9", + "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e", + "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe", + "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef", + "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56", + "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa", + "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f", + "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f", + "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e", + "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a", + "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2", + "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2", + "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5", + "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a", + "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2", + "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213", + "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563", + "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591", + "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c", + "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2", + "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb", + "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757", + "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0", + "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452", + "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad", + "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01", + "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f", + "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5", + "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61", + "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e", + "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b", + "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068", + "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9", + "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588", + "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483", + "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f", + "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67", + "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7", + "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311", + "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6", + "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72", + "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6", + "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129", + "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13", + "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67", + "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c", + "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516", + "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e", + "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e", + "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364", + "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023", + "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1", + "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04", + "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d", + "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a", + "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7", + "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb", + "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4", + "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e", + "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1", + "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48", + "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868" ], "markers": "python_version >= '3.8'", - "version": "==10.1.0" + "version": "==10.2.0" + }, + "pycparser": { + "hashes": [ + "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", + "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" + ], + "version": "==2.21" }, "pyparsing": { "hashes": [ @@ -409,6 +600,15 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.8.2" }, + "pythonnet": { + "hashes": [ + "sha256:62486f860c7955b7dcf470e085e4d2b599512224ca24193f716e857b496c530f", + "sha256:8d4b2e97158a023875f8647458a58f38817f4fe39af60abdd6b0d8adf1d77e75" + ], + "index": "pip_conf_index_global", + "markers": "python_version < '3.13' and python_version >= '3.7'", + "version": "==3.0.3" + }, "six": { "hashes": [ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", diff --git a/dependency/MapGenerator-Python/Preparation/Utility.pyi b/dependency/MapGenerator-Python/Preparation/Utility.pyi new file mode 100644 index 00000000..413ae584 --- /dev/null +++ b/dependency/MapGenerator-Python/Preparation/Utility.pyi @@ -0,0 +1,19 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Stub for C# + +from __future__ import annotations + +from System import UInt32 + + +class PlaceType(UInt32): + Null: PlaceType + Ruin: PlaceType + Shadow: PlaceType + Asteroid: PlaceType + Resource: PlaceType + Construction: PlaceType + Wormhole: PlaceType + Home: PlaceType diff --git a/dependency/MapGenerator-Python/SETTINGS.py b/dependency/MapGenerator-Python/SETTINGS.py new file mode 100644 index 00000000..b1c8af4e --- /dev/null +++ b/dependency/MapGenerator-Python/SETTINGS.py @@ -0,0 +1,12 @@ +from Preparation.Utility import PlaceType as PT + +title = 'THUAI7-MapGenerator' +file_suffix = '.thuai7.map' +areas = {PT.Null: '#FFFFFF', + PT.Ruin: '#B97A57', + PT.Shadow: '#22B14C', + PT.Asteroid: '#99D9EA', + PT.Resource: '#A349A4', + PT.Construction: '#FF7F27', + PT.Wormhole: '#880015', + PT.Home: '#ED1C24'} diff --git a/dependency/MapGenerator-Python/Settings.json b/dependency/MapGenerator-Python/Settings.json deleted file mode 100755 index db949be3..00000000 --- a/dependency/MapGenerator-Python/Settings.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "title": "THUAI7-MapGenerator", - "file_suffix": ".thuai7.map", - "dtype": "B", - "areas": [ - [ - "Space", - 0, - "#FFFFFF" - ], - [ - "Ruin", - 1, - "#B97A57" - ], - [ - "Shadow", - 2, - "#22B14C" - ], - [ - "Asteroid", - 3, - "#99D9EA" - ], - [ - "Resource", - 4, - "#A349A4" - ], - [ - "Construction", - 5, - "#FF7F27" - ], - [ - "Wormhole", - 6, - "#880015" - ], - [ - "Home", - 7, - "#ED1C24" - ] - ] -} \ No newline at end of file diff --git a/dependency/MapGenerator-Python/System.pyi b/dependency/MapGenerator-Python/System.pyi new file mode 100644 index 00000000..2e34aeda --- /dev/null +++ b/dependency/MapGenerator-Python/System.pyi @@ -0,0 +1,19 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Stub for C# + +from __future__ import annotations + + +class UInt32: + def __init__(self, i: int) -> None: ... + + +class String: + def __init__(self, s: str) -> None: ... + + +class Array[T]: + @staticmethod + def CreateInstance(T: type, h: int, w: int) -> Array[T]: ... diff --git a/dependency/MapGenerator-Python/main.py b/dependency/MapGenerator-Python/main.py index 2c48ab1e..94842829 100755 --- a/dependency/MapGenerator-Python/main.py +++ b/dependency/MapGenerator-Python/main.py @@ -1,50 +1,32 @@ from __future__ import annotations from io import TextIOWrapper -import json import os import os.path from easygui import multenterbox -from Classes.AreaRenderDict import AreaRenderDict -from Classes.MapStruct import MapStruct +import CLR_IMPORT +import SETTINGS +from System import UInt32, String +from GameClass.MapGenerator import MapStruct from Classes.MapRenderer import MapRenderer from Classes.RandomCores.PerlinRandomCore import PerlinRandomCore from Classes.RandomCores.СюйЧэнRandomCore import СюйЧэнRandomCore - -# 查找设置 -SETTINGS_PATH = '' -TARGET_SETTINGS_PATH = 'Settings.json' -for root, _, files in os.walk('.'): - if TARGET_SETTINGS_PATH in files: - SETTINGS_PATH = os.path.join(root, TARGET_SETTINGS_PATH) -if SETTINGS_PATH == '': - raise FileNotFoundError('未找到设置文件') -# 加载设置 -with open(SETTINGS_PATH, 'r', encoding='utf-8') as jsonfp: - SETTINGS = json.load(jsonfp) - TITLE: str = SETTINGS['title'] - FILE_SUFFIX: str = SETTINGS['file_suffix'] - DTYPE: str = SETTINGS['dtype'] - AREAS: AreaRenderDict = AreaRenderDict(SETTINGS['areas']) # 获取路径 -path: str = multenterbox(msg='', title=TITLE, fields=[f'Path(*{FILE_SUFFIX})'])[0] -if path[-len(FILE_SUFFIX):] != FILE_SUFFIX: - path += FILE_SUFFIX +path: str = multenterbox(msg='', title=SETTINGS.title, fields=[f'Path(*{SETTINGS.file_suffix})'])[0] +if path[-len(SETTINGS.file_suffix):] != SETTINGS.file_suffix: + path += SETTINGS.file_suffix # 地图加载 -mapfile: TextIOWrapper -mapStruct: MapStruct if not os.path.exists(path): - height, width = [int(x) for x in multenterbox(msg='Create new map', title=TITLE, fields=['Height', 'Width'])] - mapStruct = MapStruct(DTYPE, height, width) - mapStruct.ToFile(path) + height, width = [UInt32(int(x)) + for x in multenterbox(msg='Create new map', title=SETTINGS.title, fields=['Height', 'Width'])] + mapStruct = MapStruct(height, width) + MapStruct.ToFile(String(path), mapStruct) else: - mapfile = open(path, 'r+b') - mapStruct = MapStruct(DTYPE, mapfile) - mapfile.close() + mapStruct = MapStruct.FromFile(String(path)) # 随机核加载 -randomCores = [СюйЧэнRandomCore(TITLE), PerlinRandomCore(TITLE)] +randomCores = [СюйЧэнRandomCore(SETTINGS.title), PerlinRandomCore(SETTINGS.title)] # 地图渲染 -mapRenderer = MapRenderer(TITLE, mapStruct, AREAS, path, randomCores) +mapRenderer = MapRenderer(SETTINGS.title, mapStruct, SETTINGS.areas, String(path), randomCores) mapRenderer.MainFrame() diff --git a/dependency/MapGenerator-Python/pyproject.toml b/dependency/MapGenerator-Python/pyproject.toml new file mode 100644 index 00000000..3484fb0c --- /dev/null +++ b/dependency/MapGenerator-Python/pyproject.toml @@ -0,0 +1,5 @@ +[tool.autopep8] +max_line_length = 120 +aggressive = true +in-place = true +recursive = true \ No newline at end of file diff --git a/dependency/MapGenerator/index.html b/dependency/MapGenerator/index.html index 8e8e44c1..e15f4336 100755 --- a/dependency/MapGenerator/index.html +++ b/dependency/MapGenerator/index.html @@ -58,7 +58,7 @@

地图生成器

⚠ 请谨慎修改参数!

Asteroid 宽度:

Resource 数量:

-

Construction 数量:

+

Construction 数量:

Shadow 生成概率:

Shadow 蔓延加成:

Ruin 生成概率:

diff --git a/logic/GameClass/GameObj/Map/Map.cs b/logic/GameClass/GameObj/Map/Map.cs index 2a6898df..023d7af0 100755 --- a/logic/GameClass/GameObj/Map/Map.cs +++ b/logic/GameClass/GameObj/Map/Map.cs @@ -5,7 +5,7 @@ using System; using GameClass.GameObj.Areas; using System.Linq; -using MapGenerator; +using GameClass.MapGenerator; namespace GameClass.GameObj { @@ -17,8 +17,8 @@ public partial class Map : IMap public uint Height => height; private readonly uint width; public uint Width => width; - public readonly uint[,] protoGameMap; - public uint[,] ProtoGameMap => protoGameMap; + public readonly PlaceType[,] protoGameMap; + public PlaceType[,] ProtoGameMap => protoGameMap; #region 大本营相关 public List Homes { get; } @@ -34,7 +34,7 @@ public PlaceType GetPlaceType(IGameObj obj) { try { - return (PlaceType)protoGameMap[obj.Position.x / GameData.NumOfPosGridPerCell, obj.Position.y / GameData.NumOfPosGridPerCell]; + return protoGameMap[obj.Position.x / GameData.NumOfPosGridPerCell, obj.Position.y / GameData.NumOfPosGridPerCell]; } catch { @@ -45,7 +45,7 @@ public PlaceType GetPlaceType(XY pos) { try { - return (PlaceType)protoGameMap[pos.x / GameData.NumOfPosGridPerCell, pos.y / GameData.NumOfPosGridPerCell]; + return protoGameMap[pos.x / GameData.NumOfPosGridPerCell, pos.y / GameData.NumOfPosGridPerCell]; } catch { @@ -330,7 +330,7 @@ public Map(MapStruct mapResource) for (int j = 0; j < width; ++j) { bool hasWormhole = false; - switch ((PlaceType)mapResource.map[i, j]) + switch (mapResource.map[i, j]) { case PlaceType.Resource: Add(new Resource(GameData.GetCellCenterPos(i, j))); diff --git a/logic/GameClass/GameObj/Map/MapInfo.cs b/logic/GameClass/GameObj/Map/MapInfo.cs index 137b1e3e..9578cb23 100755 --- a/logic/GameClass/GameObj/Map/MapInfo.cs +++ b/logic/GameClass/GameObj/Map/MapInfo.cs @@ -1,13 +1,13 @@ -using MapGenerator; +using GameClass.MapGenerator; namespace GameClass.GameObj { public static class MapInfo { /// - /// 50*50 + /// 缺省地图 /// - public static uint[,] defaultMap = new uint[50, 50] + public static readonly uint[,] defaultMap = new uint[50, 50] { {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 1}, @@ -60,12 +60,7 @@ public static class MapInfo {1, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} }; - public static uint[,] birthPoints = new uint[2, 2] { { 3, 46 }, { 46, 3 } }; - public static MapStruct defaultMapStruct = new() - { - height = 50, - width = 50, - map = defaultMap - }; + public static readonly uint[,] birthPoints = new uint[2, 2] { { 3, 46 }, { 46, 3 } }; + public static readonly MapStruct defaultMapStruct = new(50, 50, defaultMap); } } diff --git a/logic/GameClass/GameObj/Map/MapReader.cs b/logic/GameClass/GameObj/Map/MapReader.cs deleted file mode 100755 index 2aed8e98..00000000 --- a/logic/GameClass/GameObj/Map/MapReader.cs +++ /dev/null @@ -1,227 +0,0 @@ -using System.IO; - -namespace MapGenerator; - -/// -/// 地图结构体 -/// -public struct MapStruct(uint height, uint width, uint[,] map) -{ - public uint height = height; - public uint width = width; - public uint[,] map = map; -} - -public static class MapReader -{ - /// - /// 读取二进制地图文件 - /// - /// 地图文件路径 - /// 地图文件读取类型 - /// - public static MapStruct MapRead(string mapFile, char dtype = 'B') - { - var fp = File.OpenRead(mapFile); - BinaryReader br = new(fp); - switch (dtype) - { - #region 以下支持 - - case 'b': - { - uint height = (uint)br.ReadSByte(), width = (uint)br.ReadSByte(); - uint[,] ret = new uint[height, width]; - for (int i = 0; i < height; i++) - { - for (int j = 0; j < width; j++) - { - ret[i, j] = (uint)br.ReadSByte(); - } - } - return new MapStruct(height, width, ret); - } - case 'B': - { - uint height = br.ReadByte(), width = br.ReadByte(); - uint[,] ret = new uint[height, width]; - for (int i = 0; i < height; i++) - { - for (int j = 0; j < width; j++) - { - ret[i, j] = br.ReadByte(); - } - } - return new MapStruct(height, width, ret); - } - case 'u': - { - uint height = br.ReadChar(), width = br.ReadChar(); - uint[,] ret = new uint[height, width]; - for (int i = 0; i < height; i++) - { - for (int j = 0; j < width; j++) - { - ret[i, j] = br.ReadChar(); - } - } - return new MapStruct(height, width, ret); - } - case 'h': - { - uint height = (uint)br.ReadInt16(), width = (uint)br.ReadInt16(); - uint[,] ret = new uint[height, width]; - for (int i = 0; i < height; i++) - { - for (int j = 0; j < width; j++) - { - ret[i, j] = (uint)br.ReadInt16(); - } - } - return new MapStruct(height, width, ret); - } - case 'H': - { - uint height = br.ReadUInt16(), width = br.ReadUInt16(); - uint[,] ret = new uint[height, width]; - for (int i = 0; i < height; i++) - { - for (int j = 0; j < width; j++) - { - ret[i, j] = br.ReadUInt16(); - } - } - return new MapStruct(height, width, ret); - } - case 'i': - { - uint height = (uint)br.ReadInt32(), width = (uint)br.ReadInt32(); - uint[,] ret = new uint[height, width]; - for (int i = 0; i < height; i++) - { - for (int j = 0; j < width; j++) - { - ret[i, j] = (uint)br.ReadInt32(); - } - } - return new MapStruct(height, width, ret); - } - case 'I': - { - uint height = br.ReadUInt32(), width = br.ReadUInt32(); - uint[,] ret = new uint[height, width]; - for (int i = 0; i < height; i++) - { - for (int j = 0; j < width; j++) - { - ret[i, j] = br.ReadUInt32(); - } - } - return new MapStruct(height, width, ret); - } - - #endregion - - #region 以下支持但无效 - - case 'l': - { - uint height = (uint)br.ReadInt64(), width = (uint)br.ReadInt64(); - uint[,] ret = new uint[height, width]; - for (int i = 0; i < height; i++) - { - for (int j = 0; j < width; j++) - { - ret[i, j] = (uint)br.ReadInt64(); - } - } - return new MapStruct(height, width, ret); - } - case 'L': - { - uint height = (uint)br.ReadUInt64(), width = (uint)br.ReadUInt64(); - uint[,] ret = new uint[height, width]; - for (int i = 0; i < height; i++) - { - for (int j = 0; j < width; j++) - { - ret[i, j] = (uint)br.ReadUInt64(); - } - } - return new MapStruct(height, width, ret); - } - case 'f': - { - uint height = (uint)br.ReadSingle(), width = (uint)br.ReadSingle(); - uint[,] ret = new uint[height, width]; - for (int i = 0; i < height; i++) - { - for (int j = 0; j < width; j++) - { - ret[i, j] = (uint)br.ReadSingle(); - } - } - return new MapStruct(height, width, ret); - } - case 'd': - { - uint height = (uint)br.ReadDouble(), width = (uint)br.ReadDouble(); - uint[,] ret = new uint[height, width]; - for (int i = 0; i < height; i++) - { - for (int j = 0; j < width; j++) - { - ret[i, j] = (uint)br.ReadDouble(); - } - } - return new MapStruct(height, width, ret); - } - - #endregion - - #region 以下不支持 - - case 'q': - { - uint height = br.ReadByte(), width = br.ReadByte(); - uint[,] ret = new uint[height, width]; - for (int i = 0; i < height; i++) - { - for (int j = 0; j < width; j++) - { - ret[i, j] = br.ReadByte(); - } - } - return new MapStruct(height, width, ret); - } - case 'Q': - { - uint height = br.ReadByte(), width = br.ReadByte(); - uint[,] ret = new uint[height, width]; - for (int i = 0; i < height; i++) - { - for (int j = 0; j < width; j++) - { - ret[i, j] = br.ReadByte(); - } - } - return new MapStruct(height, width, ret); - } - default: - { - uint height = br.ReadByte(), width = br.ReadByte(); - uint[,] ret = new uint[height, width]; - for (int i = 0; i < height; i++) - { - for (int j = 0; j < width; j++) - { - ret[i, j] = br.ReadByte(); - } - } - return new MapStruct(height, width, ret); - } - - #endregion - }; - } -} \ No newline at end of file diff --git a/logic/GameClass/GameObj/Map/MapStruct.cs b/logic/GameClass/GameObj/Map/MapStruct.cs new file mode 100644 index 00000000..39c96325 --- /dev/null +++ b/logic/GameClass/GameObj/Map/MapStruct.cs @@ -0,0 +1,86 @@ +using Preparation.Utility; +using System.IO; + +namespace GameClass.MapGenerator; + +/// +/// 地图结构体 +/// +public struct MapStruct +{ + public uint height; + public uint width; + public PlaceType[,] map; + #region ctor + public MapStruct(uint height, uint width) + { + this.height = height; this.width = width; + map = new PlaceType[height, width]; + } + public MapStruct(uint height, uint width, PlaceType[,] map) + { + this.height = height; this.width = width; this.map = map; + } + public MapStruct(uint height, uint width, uint[,] map) + { + this.height = height; this.width = width; + this.map = new PlaceType[height, width]; + for (uint i = 0; i < height; i++) + { + for (uint j = 0; j < width; j++) + { + this.map[i, j] = (PlaceType)map[i, j]; + } + } + } + #endregion + /// + /// 地图文件读取 + /// + /// 地图文件 + /// + public static MapStruct FromFile(string filename) + { + using BinaryReader br = new(File.OpenRead(filename)); + var height = br.ReadUInt32(); var width = br.ReadUInt32(); + MapStruct ret = new(height, width); + for (uint i = 0; i < height; i++) + { + for (uint j = 0; j < width; j++) + { + ret.map[i, j] = (PlaceType)br.ReadUInt32(); + } + } + return ret; + } + /// + /// 地图文件存储 + /// + /// 地图文件 + /// 地图 + public static void ToFile(string filename, MapStruct src) + { + using BinaryWriter bw = new(File.OpenWrite(filename)); + bw.Write(src.height); + bw.Write(src.width); + for (uint i = 0; i < src.height; i++) + { + for (uint j = 0; j < src.width; j++) + { + bw.Write((uint)src.map[i, j]); + } + } + } + public void Clear() + { + for (uint i = 0; i < height; i++) + { + for (uint j = 0; j < width; j++) map[i, j] = PlaceType.Null; + } + } + public PlaceType this[uint i, uint j] + { + get => map[i, j]; + set => map[i, j] = value; + } +} \ No newline at end of file diff --git a/logic/GameClass/GameObj/Modules/ModuleFactory.cs b/logic/GameClass/GameObj/Modules/ModuleFactory.cs index 07fc403f..8877b80f 100755 --- a/logic/GameClass/GameObj/Modules/ModuleFactory.cs +++ b/logic/GameClass/GameObj/Modules/ModuleFactory.cs @@ -157,6 +157,7 @@ public static class ModuleFactory ModuleType.MissileGun => GameData.FlagShipMissileGunCost, ModuleType.ArcGun => GameData.FlagShipArcGunCost, _ => int.MaxValue - } + }, + _ => int.MaxValue }; } \ No newline at end of file diff --git a/logic/GameClass/GameObj/Team.cs b/logic/GameClass/GameObj/Team.cs index 600b0587..f6e991ff 100755 --- a/logic/GameClass/GameObj/Team.cs +++ b/logic/GameClass/GameObj/Team.cs @@ -12,7 +12,7 @@ public class Team(Home home) public const long invalidTeamID = long.MaxValue; public const long noneTeamID = long.MinValue; private readonly List shipList = new(GameData.MaxShipNum); - private readonly List birthPointList = new(); + private readonly List birthPointList = []; public List BirthPointList => birthPointList; private Home home = home; public MoneyPool MoneyPool { get; } = new MoneyPool(); diff --git a/logic/Gaming/Game.cs b/logic/Gaming/Game.cs index bcb56a0a..3a6d8fa0 100755 --- a/logic/Gaming/Game.cs +++ b/logic/Gaming/Game.cs @@ -1,6 +1,6 @@ using GameClass.GameObj; using GameClass.GameObj.Areas; -using MapGenerator; +using GameClass.MapGenerator; using Preparation.Interface; using Preparation.Utility; using System; @@ -39,8 +39,8 @@ public long AddShip(ShipInitInfo shipInitInfo) break; } } - if (gameMap.ProtoGameMap[pos.x, pos.y] != (uint)PlaceType.Null && - gameMap.ProtoGameMap[pos.x, pos.y] != (uint)PlaceType.Shadow) + if (gameMap.ProtoGameMap[pos.x, pos.y] != PlaceType.Null && + gameMap.ProtoGameMap[pos.x, pos.y] != PlaceType.Shadow) { validBirthPoint = false; } diff --git a/logic/Preparation/Interface/IMap.cs b/logic/Preparation/Interface/IMap.cs index 72d1c013..5fa87d19 100755 --- a/logic/Preparation/Interface/IMap.cs +++ b/logic/Preparation/Interface/IMap.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Threading; -using System.Timers; using Preparation.Utility; namespace Preparation.Interface @@ -13,7 +12,7 @@ public interface IMap Dictionary> GameObjDict { get; } Dictionary GameObjLockDict { get; } - public uint[,] ProtoGameMap { get; } + public PlaceType[,] ProtoGameMap { get; } public PlaceType GetPlaceType(IGameObj obj); public bool IsOutOfBound(IGameObj obj); public IOutOfBound GetOutOfBound(XY pos); // 返回新建的一个OutOfBound对象 diff --git a/logic/Preparation/Utility/EnumType.cs b/logic/Preparation/Utility/EnumType.cs index 12910e58..0861079e 100755 --- a/logic/Preparation/Utility/EnumType.cs +++ b/logic/Preparation/Utility/EnumType.cs @@ -46,7 +46,7 @@ public enum ConstructorType /// /// 游戏对象类型 /// - public enum GameObjType + public enum GameObjType : uint { Null = 0, Ship = 1, @@ -86,7 +86,7 @@ public enum ModuleType /// /// PlaceType /// - public enum PlaceType + public enum PlaceType : uint { Null = 0, Ruin = 1, diff --git a/logic/Preparation/Utility/GameData.cs b/logic/Preparation/Utility/GameData.cs index 7251af03..c97abb4c 100755 --- a/logic/Preparation/Utility/GameData.cs +++ b/logic/Preparation/Utility/GameData.cs @@ -75,7 +75,7 @@ public static bool ApproachToInteractInACross(XY pos1, XY pos2) } public const int ShipRadius = 400; - public static XY PosNotInGame = new XY(1, 1); + public static readonly XY PosNotInGame = new(1, 1); public const int BulletRadius = 200; // 子弹半径 public const int LaserRange = 4000; // 激光射程 diff --git a/logic/Server/GameServer.cs b/logic/Server/GameServer.cs index fc2328c9..c7129052 100755 --- a/logic/Server/GameServer.cs +++ b/logic/Server/GameServer.cs @@ -1,6 +1,6 @@ using GameClass.GameObj; using Gaming; -using MapGenerator; +using GameClass.MapGenerator; using Newtonsoft.Json; using Playback; using Preparation.Utility; @@ -257,7 +257,7 @@ private MessageOfMap MapMsg() msgOfMap.Rows.Add(new MessageOfMap.Types.Row()); for (int j = 0; j < game.GameMap.Width; j++) { - msgOfMap.Rows[i].Cols.Add(Transformation.PlaceTypeToProto((Utility.PlaceType)game.GameMap.ProtoGameMap[i, j])); + msgOfMap.Rows[i].Cols.Add(Transformation.PlaceTypeToProto(game.GameMap.ProtoGameMap[i, j])); } } return msgOfMap; @@ -311,12 +311,7 @@ public GameServer(ArgumentOptions options) } finally { - MapStruct mapResource = new() - { - height = GameData.MapRows, - width = GameData.MapCols, - map = map - }; + MapStruct mapResource = new(GameData.MapRows, GameData.MapCols, map); game = new(mapResource, options.TeamCount); } }