commit 4835b187e1f1939ec16d61e2cef9b091e32d4c00 Author: tibz Date: Sat Aug 15 12:07:35 2026 -0500 init diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..e2ccbf4 Binary files /dev/null and b/.DS_Store differ diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9491a2f --- /dev/null +++ b/.gitignore @@ -0,0 +1,363 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Oo]ut/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd \ No newline at end of file diff --git a/Johnmagotchi.sln b/Johnmagotchi.sln new file mode 100644 index 0000000..a03b359 --- /dev/null +++ b/Johnmagotchi.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34322.80 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Johnmagotchi", "Johnmagotchi\Johnmagotchi.csproj", "{40FB5809-9EC3-4598-90E6-EBC17480B5A5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {40FB5809-9EC3-4598-90E6-EBC17480B5A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {40FB5809-9EC3-4598-90E6-EBC17480B5A5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {40FB5809-9EC3-4598-90E6-EBC17480B5A5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {40FB5809-9EC3-4598-90E6-EBC17480B5A5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {BAA84E59-714D-4D99-896C-58F4EB154DEE} + EndGlobalSection +EndGlobal diff --git a/Johnmagotchi/.DS_Store b/Johnmagotchi/.DS_Store new file mode 100644 index 0000000..061c91c Binary files /dev/null and b/Johnmagotchi/.DS_Store differ diff --git a/Johnmagotchi/.config/dotnet-tools.json b/Johnmagotchi/.config/dotnet-tools.json new file mode 100644 index 0000000..efabe22 --- /dev/null +++ b/Johnmagotchi/.config/dotnet-tools.json @@ -0,0 +1,36 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-mgcb": { + "version": "3.8.1.303", + "commands": [ + "mgcb" + ] + }, + "dotnet-mgcb-editor": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor" + ] + }, + "dotnet-mgcb-editor-linux": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor-linux" + ] + }, + "dotnet-mgcb-editor-windows": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor-windows" + ] + }, + "dotnet-mgcb-editor-mac": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor-mac" + ] + } + } +} \ No newline at end of file diff --git a/Johnmagotchi/.mgstats b/Johnmagotchi/.mgstats new file mode 100644 index 0000000..eab26b3 --- /dev/null +++ b/Johnmagotchi/.mgstats @@ -0,0 +1 @@ +Source File,Dest File,Processor Type,Content Type,Source File Size,Dest File Size,Build Seconds diff --git a/Johnmagotchi/Assets/Art/Tiles/tile-highlight.aseprite b/Johnmagotchi/Assets/Art/Tiles/tile-highlight.aseprite new file mode 100644 index 0000000..b91df36 Binary files /dev/null and b/Johnmagotchi/Assets/Art/Tiles/tile-highlight.aseprite differ diff --git a/Johnmagotchi/Assets/Art/Tiles/tile-highlight.json b/Johnmagotchi/Assets/Art/Tiles/tile-highlight.json new file mode 100644 index 0000000..9931cd1 --- /dev/null +++ b/Johnmagotchi/Assets/Art/Tiles/tile-highlight.json @@ -0,0 +1,146 @@ +{ "frames": { + "tile-highlight 0.aseprite": { + "frame": { "x": 0, "y": 0, "w": 40, "h": 40 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, + "sourceSize": { "w": 40, "h": 40 }, + "duration": 100 + }, + "tile-highlight 1.aseprite": { + "frame": { "x": 40, "y": 0, "w": 40, "h": 40 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, + "sourceSize": { "w": 40, "h": 40 }, + "duration": 100 + }, + "tile-highlight 2.aseprite": { + "frame": { "x": 80, "y": 0, "w": 40, "h": 40 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, + "sourceSize": { "w": 40, "h": 40 }, + "duration": 100 + }, + "tile-highlight 3.aseprite": { + "frame": { "x": 120, "y": 0, "w": 40, "h": 40 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, + "sourceSize": { "w": 40, "h": 40 }, + "duration": 100 + }, + "tile-highlight 4.aseprite": { + "frame": { "x": 160, "y": 0, "w": 40, "h": 40 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, + "sourceSize": { "w": 40, "h": 40 }, + "duration": 100 + }, + "tile-highlight 5.aseprite": { + "frame": { "x": 200, "y": 0, "w": 40, "h": 40 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, + "sourceSize": { "w": 40, "h": 40 }, + "duration": 100 + }, + "tile-highlight 6.aseprite": { + "frame": { "x": 240, "y": 0, "w": 40, "h": 40 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, + "sourceSize": { "w": 40, "h": 40 }, + "duration": 100 + }, + "tile-highlight 7.aseprite": { + "frame": { "x": 280, "y": 0, "w": 40, "h": 40 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, + "sourceSize": { "w": 40, "h": 40 }, + "duration": 100 + }, + "tile-highlight 8.aseprite": { + "frame": { "x": 320, "y": 0, "w": 40, "h": 40 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, + "sourceSize": { "w": 40, "h": 40 }, + "duration": 100 + }, + "tile-highlight 9.aseprite": { + "frame": { "x": 360, "y": 0, "w": 40, "h": 40 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, + "sourceSize": { "w": 40, "h": 40 }, + "duration": 100 + }, + "tile-highlight 10.aseprite": { + "frame": { "x": 400, "y": 0, "w": 40, "h": 40 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, + "sourceSize": { "w": 40, "h": 40 }, + "duration": 100 + }, + "tile-highlight 11.aseprite": { + "frame": { "x": 440, "y": 0, "w": 40, "h": 40 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, + "sourceSize": { "w": 40, "h": 40 }, + "duration": 100 + }, + "tile-highlight 12.aseprite": { + "frame": { "x": 480, "y": 0, "w": 40, "h": 40 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, + "sourceSize": { "w": 40, "h": 40 }, + "duration": 100 + }, + "tile-highlight 13.aseprite": { + "frame": { "x": 520, "y": 0, "w": 40, "h": 40 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, + "sourceSize": { "w": 40, "h": 40 }, + "duration": 100 + }, + "tile-highlight 14.aseprite": { + "frame": { "x": 560, "y": 0, "w": 40, "h": 40 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, + "sourceSize": { "w": 40, "h": 40 }, + "duration": 100 + }, + "tile-highlight 15.aseprite": { + "frame": { "x": 600, "y": 0, "w": 40, "h": 40 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 40, "h": 40 }, + "sourceSize": { "w": 40, "h": 40 }, + "duration": 100 + } + }, + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.10.1-x64", + "image": "tile-highlight.png", + "format": "I8", + "size": { "w": 640, "h": 40 }, + "scale": "1", + "frameTags": [ + ], + "layers": [ + { "name": "Layer 1", "opacity": 255, "blendMode": "normal" } + ], + "slices": [ + ] + } +} diff --git a/Johnmagotchi/Assets/Art/Tiles/tile-highlight.png b/Johnmagotchi/Assets/Art/Tiles/tile-highlight.png new file mode 100644 index 0000000..b4bd4a9 Binary files /dev/null and b/Johnmagotchi/Assets/Art/Tiles/tile-highlight.png differ diff --git a/Johnmagotchi/Assets/Art/UI/test-menu-item-64-28.aseprite b/Johnmagotchi/Assets/Art/UI/test-menu-item-64-28.aseprite new file mode 100644 index 0000000..da5bd6f Binary files /dev/null and b/Johnmagotchi/Assets/Art/UI/test-menu-item-64-28.aseprite differ diff --git a/Johnmagotchi/Assets/Art/UI/unit-display-blue-darker.aseprite b/Johnmagotchi/Assets/Art/UI/unit-display-blue-darker.aseprite new file mode 100644 index 0000000..2741c50 Binary files /dev/null and b/Johnmagotchi/Assets/Art/UI/unit-display-blue-darker.aseprite differ diff --git a/Johnmagotchi/Assets/Art/UI/unit-display-blue-darker.png b/Johnmagotchi/Assets/Art/UI/unit-display-blue-darker.png new file mode 100644 index 0000000..811c883 Binary files /dev/null and b/Johnmagotchi/Assets/Art/UI/unit-display-blue-darker.png differ diff --git a/Johnmagotchi/Assets/Art/UI/unit-display-blue-lighter.aseprite b/Johnmagotchi/Assets/Art/UI/unit-display-blue-lighter.aseprite new file mode 100644 index 0000000..1f6a0f5 Binary files /dev/null and b/Johnmagotchi/Assets/Art/UI/unit-display-blue-lighter.aseprite differ diff --git a/Johnmagotchi/Assets/Art/UI/unit-display-blue-lighter.png b/Johnmagotchi/Assets/Art/UI/unit-display-blue-lighter.png new file mode 100644 index 0000000..fe7d5ea Binary files /dev/null and b/Johnmagotchi/Assets/Art/UI/unit-display-blue-lighter.png differ diff --git a/Johnmagotchi/Assets/Art/UI/unit-display-green-darker.aseprite b/Johnmagotchi/Assets/Art/UI/unit-display-green-darker.aseprite new file mode 100644 index 0000000..641755d Binary files /dev/null and b/Johnmagotchi/Assets/Art/UI/unit-display-green-darker.aseprite differ diff --git a/Johnmagotchi/Assets/Art/UI/unit-display-green-darker.png b/Johnmagotchi/Assets/Art/UI/unit-display-green-darker.png new file mode 100644 index 0000000..bdeed55 Binary files /dev/null and b/Johnmagotchi/Assets/Art/UI/unit-display-green-darker.png differ diff --git a/Johnmagotchi/Assets/Art/UI/unit-display-green-lighter.aseprite b/Johnmagotchi/Assets/Art/UI/unit-display-green-lighter.aseprite new file mode 100644 index 0000000..1c45ec2 Binary files /dev/null and b/Johnmagotchi/Assets/Art/UI/unit-display-green-lighter.aseprite differ diff --git a/Johnmagotchi/Assets/Art/UI/unit-display-green-lighter.png b/Johnmagotchi/Assets/Art/UI/unit-display-green-lighter.png new file mode 100644 index 0000000..7e151cf Binary files /dev/null and b/Johnmagotchi/Assets/Art/UI/unit-display-green-lighter.png differ diff --git a/Johnmagotchi/Assets/Art/UI/unit-display-red-darker.aseprite b/Johnmagotchi/Assets/Art/UI/unit-display-red-darker.aseprite new file mode 100644 index 0000000..64e49b1 Binary files /dev/null and b/Johnmagotchi/Assets/Art/UI/unit-display-red-darker.aseprite differ diff --git a/Johnmagotchi/Assets/Art/UI/unit-display-red-darker.png b/Johnmagotchi/Assets/Art/UI/unit-display-red-darker.png new file mode 100644 index 0000000..8f4f4e2 Binary files /dev/null and b/Johnmagotchi/Assets/Art/UI/unit-display-red-darker.png differ diff --git a/Johnmagotchi/Assets/Art/UI/unit-display-red-lighter.aseprite b/Johnmagotchi/Assets/Art/UI/unit-display-red-lighter.aseprite new file mode 100644 index 0000000..28f774e Binary files /dev/null and b/Johnmagotchi/Assets/Art/UI/unit-display-red-lighter.aseprite differ diff --git a/Johnmagotchi/Assets/Art/UI/unit-display-red-lighter.png b/Johnmagotchi/Assets/Art/UI/unit-display-red-lighter.png new file mode 100644 index 0000000..558a289 Binary files /dev/null and b/Johnmagotchi/Assets/Art/UI/unit-display-red-lighter.png differ diff --git a/Johnmagotchi/Assets/Art/UI/unit-display.aseprite b/Johnmagotchi/Assets/Art/UI/unit-display.aseprite new file mode 100644 index 0000000..9361388 Binary files /dev/null and b/Johnmagotchi/Assets/Art/UI/unit-display.aseprite differ diff --git a/Johnmagotchi/Assets/Art/UI/unit-display.png b/Johnmagotchi/Assets/Art/UI/unit-display.png new file mode 100644 index 0000000..990ed13 Binary files /dev/null and b/Johnmagotchi/Assets/Art/UI/unit-display.png differ diff --git a/Johnmagotchi/Content/BaseJohnBody.png b/Johnmagotchi/Content/BaseJohnBody.png new file mode 100644 index 0000000..2027fc3 Binary files /dev/null and b/Johnmagotchi/Content/BaseJohnBody.png differ diff --git a/Johnmagotchi/Content/BaseJohnHead.png b/Johnmagotchi/Content/BaseJohnHead.png new file mode 100644 index 0000000..925c9c3 Binary files /dev/null and b/Johnmagotchi/Content/BaseJohnHead.png differ diff --git a/Johnmagotchi/Content/Content.mgcb b/Johnmagotchi/Content/Content.mgcb new file mode 100644 index 0000000..ceebd40 --- /dev/null +++ b/Johnmagotchi/Content/Content.mgcb @@ -0,0 +1,463 @@ + +#----------------------------- Global Properties ----------------------------# + +/outputDir:bin/$(Platform) +/intermediateDir:obj/$(Platform) +/platform:DesktopGL +/config: +/profile:Reach +/compress:False + +#-------------------------------- References --------------------------------# + + +#---------------------------------- Content ---------------------------------# + +#begin Fonts/ariel-20.spritefont +/importer:FontDescriptionImporter +/processor:FontDescriptionProcessor +/processorParam:PremultiplyAlpha=True +/processorParam:TextureFormat=Compressed +/build:Fonts/ariel-20.spritefont + +#begin Fonts/Karmatic-20.spritefont +/importer:FontDescriptionImporter +/processor:FontDescriptionProcessor +/processorParam:PremultiplyAlpha=True +/processorParam:TextureFormat=Compressed +/build:Fonts/Karmatic-20.spritefont + +#begin Fonts/Kemco-20.spritefont +/importer:FontDescriptionImporter +/processor:FontDescriptionProcessor +/processorParam:PremultiplyAlpha=True +/processorParam:TextureFormat=Compressed +/build:Fonts/Kemco-20.spritefont + +#begin Fonts/PixelSplitter.spritefont +/importer:FontDescriptionImporter +/processor:FontDescriptionProcessor +/processorParam:PremultiplyAlpha=True +/processorParam:TextureFormat=Compressed +/build:Fonts/PixelSplitter.spritefont + +#begin Map-UI/cursor.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Map-UI/cursor.png + +#begin Map-UI/outline-32.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Map-UI/outline-32.png + +#begin Map-UI/outline-36.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Map-UI/outline-36.png + +#begin Map-UI/outline.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Map-UI/outline.png + +#begin Map-UI/test-menu-item-64-28-selected.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Map-UI/test-menu-item-64-28-selected.png + +#begin Map-UI/test-menu-item-64-28.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Map-UI/test-menu-item-64-28.png + +#begin Map-UI/unit-display-blue-darker.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Map-UI/unit-display-blue-darker.png + +#begin Map-UI/unit-display-blue-lighter.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Map-UI/unit-display-blue-lighter.png + +#begin Map-UI/unit-display-green-darker.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Map-UI/unit-display-green-darker.png + +#begin Map-UI/unit-display-green-lighter.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Map-UI/unit-display-green-lighter.png + +#begin Map-UI/unit-display-red-darker.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Map-UI/unit-display-red-darker.png + +#begin Map-UI/unit-display-red-lighter.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Map-UI/unit-display-red-lighter.png + +#begin Map-UI/unit-display.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Map-UI/unit-display.png + +#begin Shaders/Tiles/AttackTileShader.fx +/importer:EffectImporter +/processor:EffectProcessor +/processorParam:DebugMode=Auto +/build:Shaders/Tiles/AttackTileShader.fx + +#begin Shaders/Units/UnitTurnEnded_S.fx +/importer:EffectImporter +/processor:EffectProcessor +/processorParam:DebugMode=Auto +/build:Shaders/Units/UnitTurnEnded_S.fx + +#begin Tiles/Grass/grass-1.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Tiles/Grass/grass-1.png + +#begin Tiles/Grass/grass-2.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Tiles/Grass/grass-2.png + +#begin Tiles/Grass/grass-3.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Tiles/Grass/grass-3.png + +#begin Tiles/Sea/ocean.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Tiles/Sea/ocean.png + +#begin Tiles/tile-highlight.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Tiles/tile-highlight.png + +#begin UI/BackButtonHover.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:UI/BackButtonHover.png + +#begin UI/buyBarPurchased.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:UI/buyBarPurchased.png + +#begin UI/buyBarSelected.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:UI/buyBarSelected.png + +#begin UI/FoodButton.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:UI/FoodButton.png + +#begin UI/FoodButtonHighlighted.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:UI/FoodButtonHighlighted.png + +#begin UI/foodGrid.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:UI/foodGrid.png + +#begin UI/foodGridTray.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:UI/foodGridTray.png + +#begin UI/HealthbarGreen.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:UI/HealthbarGreen.png + +#begin UI/HealthbarRed.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:UI/HealthbarRed.png + +#begin UI/johnnydex.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:UI/johnnydex.png + +#begin UI/sidebar2.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:UI/sidebar2.png + +#begin UI/SingleButtonBG-export.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:UI/SingleButtonBG-export.png;UI/SingleButtonBG.png + +#begin UI/SingleButtonBGBright-export.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:UI/SingleButtonBGBright-export.png;UI/SingleButtonBGBright.png + +#begin Units/unit-test-enemy.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Units/unit-test-enemy.png + +#begin Units/unit-test-npc.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Units/unit-test-npc.png + +#begin Units/unit-test.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:Units/unit-test.png + diff --git a/Johnmagotchi/Content/File.spritefont b/Johnmagotchi/Content/File.spritefont new file mode 100644 index 0000000..bd33ecf --- /dev/null +++ b/Johnmagotchi/Content/File.spritefont @@ -0,0 +1,60 @@ + + + + + + + Arial + + + 12 + + + 0 + + + true + + + + + + + + + + + + ~ + + + + diff --git a/Johnmagotchi/Content/Fonts/File.spritefont b/Johnmagotchi/Content/Fonts/File.spritefont new file mode 100644 index 0000000..bd33ecf --- /dev/null +++ b/Johnmagotchi/Content/Fonts/File.spritefont @@ -0,0 +1,60 @@ + + + + + + + Arial + + + 12 + + + 0 + + + true + + + + + + + + + + + + ~ + + + + diff --git a/Johnmagotchi/Content/Fonts/Karmatic-20.spritefont b/Johnmagotchi/Content/Fonts/Karmatic-20.spritefont new file mode 100644 index 0000000..222ff0f --- /dev/null +++ b/Johnmagotchi/Content/Fonts/Karmatic-20.spritefont @@ -0,0 +1,59 @@ + + + + + + + Karmatic.ttf + + 20 + + + 0 + + + true + + + + + + + + + + + + ~ + + + + diff --git a/Johnmagotchi/Content/Fonts/Karmatic.ttf b/Johnmagotchi/Content/Fonts/Karmatic.ttf new file mode 100644 index 0000000..d1df852 Binary files /dev/null and b/Johnmagotchi/Content/Fonts/Karmatic.ttf differ diff --git a/Johnmagotchi/Content/Fonts/Kemco-20.spritefont b/Johnmagotchi/Content/Fonts/Kemco-20.spritefont new file mode 100644 index 0000000..3674e96 --- /dev/null +++ b/Johnmagotchi/Content/Fonts/Kemco-20.spritefont @@ -0,0 +1,60 @@ + + + + + + + Kemco.ttf + + + 20 + + + 0 + + + true + + + + + + + + + + + + ~ + + + + diff --git a/Johnmagotchi/Content/Fonts/Kemco.ttf b/Johnmagotchi/Content/Fonts/Kemco.ttf new file mode 100644 index 0000000..4d41db6 Binary files /dev/null and b/Johnmagotchi/Content/Fonts/Kemco.ttf differ diff --git a/Johnmagotchi/Content/Fonts/PixelSplitter.spritefont b/Johnmagotchi/Content/Fonts/PixelSplitter.spritefont new file mode 100644 index 0000000..5834c6b --- /dev/null +++ b/Johnmagotchi/Content/Fonts/PixelSplitter.spritefont @@ -0,0 +1,60 @@ + + + + + + + PixelSplitter.ttf + + + 20 + + + 0 + + + true + + + + + + + + + + + + ~ + + + + diff --git a/Johnmagotchi/Content/Fonts/PixelSplitter.ttf b/Johnmagotchi/Content/Fonts/PixelSplitter.ttf new file mode 100644 index 0000000..d30e05e Binary files /dev/null and b/Johnmagotchi/Content/Fonts/PixelSplitter.ttf differ diff --git a/Johnmagotchi/Content/Fonts/ariel-20.spritefont b/Johnmagotchi/Content/Fonts/ariel-20.spritefont new file mode 100644 index 0000000..539e882 --- /dev/null +++ b/Johnmagotchi/Content/Fonts/ariel-20.spritefont @@ -0,0 +1,60 @@ + + + + + + + Arial + + + 20 + + + 0 + + + true + + + + + + + + + + + + ~ + + + + diff --git a/Johnmagotchi/Content/Fonts/font-sources.txt b/Johnmagotchi/Content/Fonts/font-sources.txt new file mode 100644 index 0000000..29774cf --- /dev/null +++ b/Johnmagotchi/Content/Fonts/font-sources.txt @@ -0,0 +1,9 @@ + +All fonts used were found on dafont.com and were labeled as 100% free. +All fonts are owned by thier respective authors. +If there are any issues with the use of these fonts please contact me, preferably at tomdt9000@yahoo.com, and I will remove the font or otherwise address the issue. +If I have time to add a credits screen to the game, this info should probably be added there. + +KARMATIC ARCADE: https://www.dafont.com/vic-fieger.d852 +PIXEL SPLITTER: https://www.dafont.com/manfred-klein.d302 +KEMCO PIXEL: https://www.dafont.com/jayvee-d-enaguas.d2725 \ No newline at end of file diff --git a/Johnmagotchi/Content/Foods/Burger.png b/Johnmagotchi/Content/Foods/Burger.png new file mode 100644 index 0000000..54b37fc Binary files /dev/null and b/Johnmagotchi/Content/Foods/Burger.png differ diff --git a/Johnmagotchi/Content/Foods/Pizza.png b/Johnmagotchi/Content/Foods/Pizza.png new file mode 100644 index 0000000..64128da Binary files /dev/null and b/Johnmagotchi/Content/Foods/Pizza.png differ diff --git a/Johnmagotchi/Content/Foods/cake.png b/Johnmagotchi/Content/Foods/cake.png new file mode 100644 index 0000000..422f9bd Binary files /dev/null and b/Johnmagotchi/Content/Foods/cake.png differ diff --git a/Johnmagotchi/Content/Foods/cereal.png b/Johnmagotchi/Content/Foods/cereal.png new file mode 100644 index 0000000..403cf99 Binary files /dev/null and b/Johnmagotchi/Content/Foods/cereal.png differ diff --git a/Johnmagotchi/Content/Foods/popcorn.png b/Johnmagotchi/Content/Foods/popcorn.png new file mode 100644 index 0000000..8867a11 Binary files /dev/null and b/Johnmagotchi/Content/Foods/popcorn.png differ diff --git a/Johnmagotchi/Content/Foods/salad.png b/Johnmagotchi/Content/Foods/salad.png new file mode 100644 index 0000000..056e20c Binary files /dev/null and b/Johnmagotchi/Content/Foods/salad.png differ diff --git a/Johnmagotchi/Content/Foods/salmon..png b/Johnmagotchi/Content/Foods/salmon..png new file mode 100644 index 0000000..779c13e Binary files /dev/null and b/Johnmagotchi/Content/Foods/salmon..png differ diff --git a/Johnmagotchi/Content/Foods/tacos.png b/Johnmagotchi/Content/Foods/tacos.png new file mode 100644 index 0000000..3e04dfa Binary files /dev/null and b/Johnmagotchi/Content/Foods/tacos.png differ diff --git a/Johnmagotchi/Content/John-body-placeholder.png b/Johnmagotchi/Content/John-body-placeholder.png new file mode 100644 index 0000000..3df6572 Binary files /dev/null and b/Johnmagotchi/Content/John-body-placeholder.png differ diff --git a/Johnmagotchi/Content/John-head-placeholder.png b/Johnmagotchi/Content/John-head-placeholder.png new file mode 100644 index 0000000..8bc036b Binary files /dev/null and b/Johnmagotchi/Content/John-head-placeholder.png differ diff --git a/Johnmagotchi/Content/Johns/EntreJohn.png b/Johnmagotchi/Content/Johns/EntreJohn.png new file mode 100644 index 0000000..ee27879 Binary files /dev/null and b/Johnmagotchi/Content/Johns/EntreJohn.png differ diff --git a/Johnmagotchi/Content/Johns/NerdJohn.png b/Johnmagotchi/Content/Johns/NerdJohn.png new file mode 100644 index 0000000..24f1263 Binary files /dev/null and b/Johnmagotchi/Content/Johns/NerdJohn.png differ diff --git a/Johnmagotchi/Content/Johns/accountantJohn.png b/Johnmagotchi/Content/Johns/accountantJohn.png new file mode 100644 index 0000000..658a0fa Binary files /dev/null and b/Johnmagotchi/Content/Johns/accountantJohn.png differ diff --git a/Johnmagotchi/Content/Johns/cena.png b/Johnmagotchi/Content/Johns/cena.png new file mode 100644 index 0000000..5bed741 Binary files /dev/null and b/Johnmagotchi/Content/Johns/cena.png differ diff --git a/Johnmagotchi/Content/Johns/grizzlyJohn.png b/Johnmagotchi/Content/Johns/grizzlyJohn.png new file mode 100644 index 0000000..2a4581b Binary files /dev/null and b/Johnmagotchi/Content/Johns/grizzlyJohn.png differ diff --git a/Johnmagotchi/Content/Johns/lukeUgly.png b/Johnmagotchi/Content/Johns/lukeUgly.png new file mode 100644 index 0000000..4a8c441 Binary files /dev/null and b/Johnmagotchi/Content/Johns/lukeUgly.png differ diff --git a/Johnmagotchi/Content/Johns/papaBody.png b/Johnmagotchi/Content/Johns/papaBody.png new file mode 100644 index 0000000..b3200c9 Binary files /dev/null and b/Johnmagotchi/Content/Johns/papaBody.png differ diff --git a/Johnmagotchi/Content/Johns/papajohnHead.png b/Johnmagotchi/Content/Johns/papajohnHead.png new file mode 100644 index 0000000..bceef68 Binary files /dev/null and b/Johnmagotchi/Content/Johns/papajohnHead.png differ diff --git a/Johnmagotchi/Content/Johns/sportsJohn.png b/Johnmagotchi/Content/Johns/sportsJohn.png new file mode 100644 index 0000000..147d6e7 Binary files /dev/null and b/Johnmagotchi/Content/Johns/sportsJohn.png differ diff --git a/Johnmagotchi/Content/Map-UI/cursor.png b/Johnmagotchi/Content/Map-UI/cursor.png new file mode 100644 index 0000000..66825e6 Binary files /dev/null and b/Johnmagotchi/Content/Map-UI/cursor.png differ diff --git a/Johnmagotchi/Content/Map-UI/outline-32.png b/Johnmagotchi/Content/Map-UI/outline-32.png new file mode 100644 index 0000000..b4a254c Binary files /dev/null and b/Johnmagotchi/Content/Map-UI/outline-32.png differ diff --git a/Johnmagotchi/Content/Map-UI/outline-36.png b/Johnmagotchi/Content/Map-UI/outline-36.png new file mode 100644 index 0000000..f705b02 Binary files /dev/null and b/Johnmagotchi/Content/Map-UI/outline-36.png differ diff --git a/Johnmagotchi/Content/Map-UI/outline.png b/Johnmagotchi/Content/Map-UI/outline.png new file mode 100644 index 0000000..63f4b68 Binary files /dev/null and b/Johnmagotchi/Content/Map-UI/outline.png differ diff --git a/Johnmagotchi/Content/Map-UI/test-menu-item-64-28-selected.png b/Johnmagotchi/Content/Map-UI/test-menu-item-64-28-selected.png new file mode 100644 index 0000000..d213e9b Binary files /dev/null and b/Johnmagotchi/Content/Map-UI/test-menu-item-64-28-selected.png differ diff --git a/Johnmagotchi/Content/Map-UI/test-menu-item-64-28.png b/Johnmagotchi/Content/Map-UI/test-menu-item-64-28.png new file mode 100644 index 0000000..4f97d78 Binary files /dev/null and b/Johnmagotchi/Content/Map-UI/test-menu-item-64-28.png differ diff --git a/Johnmagotchi/Content/Map-UI/unit-display-blue-darker.png b/Johnmagotchi/Content/Map-UI/unit-display-blue-darker.png new file mode 100644 index 0000000..811c883 Binary files /dev/null and b/Johnmagotchi/Content/Map-UI/unit-display-blue-darker.png differ diff --git a/Johnmagotchi/Content/Map-UI/unit-display-blue-lighter.png b/Johnmagotchi/Content/Map-UI/unit-display-blue-lighter.png new file mode 100644 index 0000000..fe7d5ea Binary files /dev/null and b/Johnmagotchi/Content/Map-UI/unit-display-blue-lighter.png differ diff --git a/Johnmagotchi/Content/Map-UI/unit-display-green-darker.png b/Johnmagotchi/Content/Map-UI/unit-display-green-darker.png new file mode 100644 index 0000000..bdeed55 Binary files /dev/null and b/Johnmagotchi/Content/Map-UI/unit-display-green-darker.png differ diff --git a/Johnmagotchi/Content/Map-UI/unit-display-green-lighter.png b/Johnmagotchi/Content/Map-UI/unit-display-green-lighter.png new file mode 100644 index 0000000..7e151cf Binary files /dev/null and b/Johnmagotchi/Content/Map-UI/unit-display-green-lighter.png differ diff --git a/Johnmagotchi/Content/Map-UI/unit-display-red-darker.png b/Johnmagotchi/Content/Map-UI/unit-display-red-darker.png new file mode 100644 index 0000000..8f4f4e2 Binary files /dev/null and b/Johnmagotchi/Content/Map-UI/unit-display-red-darker.png differ diff --git a/Johnmagotchi/Content/Map-UI/unit-display-red-lighter.png b/Johnmagotchi/Content/Map-UI/unit-display-red-lighter.png new file mode 100644 index 0000000..558a289 Binary files /dev/null and b/Johnmagotchi/Content/Map-UI/unit-display-red-lighter.png differ diff --git a/Johnmagotchi/Content/Map-UI/unit-display.png b/Johnmagotchi/Content/Map-UI/unit-display.png new file mode 100644 index 0000000..990ed13 Binary files /dev/null and b/Johnmagotchi/Content/Map-UI/unit-display.png differ diff --git a/Johnmagotchi/Content/Shaders/MovementTileHighlight.fx b/Johnmagotchi/Content/Shaders/MovementTileHighlight.fx new file mode 100644 index 0000000..2eb340a --- /dev/null +++ b/Johnmagotchi/Content/Shaders/MovementTileHighlight.fx @@ -0,0 +1,35 @@ +#if OPENGL + #define SV_POSITION POSITION + #define VS_SHADERMODEL vs_3_0 + #define PS_SHADERMODEL ps_3_0 +#else + #define VS_SHADERMODEL vs_4_0_level_9_1 + #define PS_SHADERMODEL ps_4_0_level_9_1 +#endif + +Texture2D SpriteTexture; + +sampler2D SpriteTextureSampler = sampler_state +{ + Texture = ; +}; + +struct VertexShaderOutput +{ + float4 Position : SV_POSITION; + float4 Color : COLOR0; + float2 TextureCoordinates : TEXCOORD0; +}; + +float4 MainPS(VertexShaderOutput input) : COLOR +{ + return tex2D(SpriteTextureSampler,input.TextureCoordinates) * input.Color; +} + +technique SpriteDrawing +{ + pass P0 + { + PixelShader = compile PS_SHADERMODEL MainPS(); + } +}; \ No newline at end of file diff --git a/Johnmagotchi/Content/Shaders/Tiles/AttackTileShader.fx b/Johnmagotchi/Content/Shaders/Tiles/AttackTileShader.fx new file mode 100644 index 0000000..1ed0a94 --- /dev/null +++ b/Johnmagotchi/Content/Shaders/Tiles/AttackTileShader.fx @@ -0,0 +1,41 @@ +#if OPENGL + #define SV_POSITION POSITION + #define VS_SHADERMODEL vs_3_0 + #define PS_SHADERMODEL ps_3_0 +#else + #define VS_SHADERMODEL vs_4_0_level_9_1 + #define PS_SHADERMODEL ps_4_0_level_9_1 +#endif + +Texture2D SpriteTexture; + +sampler s0; + +sampler2D SpriteTextureSampler = sampler_state +{ + Texture = ; +}; + +struct VertexShaderOutput +{ + float4 Position : SV_POSITION; + float4 Color : COLOR0; + float2 TextureCoordinates : TEXCOORD0; +}; + +float4 MainPS(VertexShaderOutput input) : COLOR +{ + + float4 color = tex2D(s0, input.TextureCoordinates); + color.gb = color.gb *.5; + color.r = color.r * 1.2; + return color; +} + +technique SpriteDrawing +{ + pass P0 + { + PixelShader = compile PS_SHADERMODEL MainPS(); + } +}; \ No newline at end of file diff --git a/Johnmagotchi/Content/Shaders/Units/UnitTurnEnded_S.fx b/Johnmagotchi/Content/Shaders/Units/UnitTurnEnded_S.fx new file mode 100644 index 0000000..aa199cc --- /dev/null +++ b/Johnmagotchi/Content/Shaders/Units/UnitTurnEnded_S.fx @@ -0,0 +1,49 @@ +#if OPENGL + #define SV_POSITION POSITION + #define VS_SHADERMODEL vs_3_0 + #define PS_SHADERMODEL ps_3_0 +#else + #define VS_SHADERMODEL vs_4_0_level_9_1 + #define PS_SHADERMODEL ps_4_0_level_9_1 +#endif + +Texture2D SpriteTexture; + +sampler s0; + +sampler2D SpriteTextureSampler = sampler_state +{ + Texture = ; +}; + +struct VertexShaderOutput +{ + float4 Position : SV_POSITION; + float4 Color : COLOR0; + float2 TextureCoordinates : TEXCOORD0; +}; + +float4 MainPS(VertexShaderOutput input) : COLOR +{ + float4 color = tex2D(s0, input.TextureCoordinates); + + float avgColor = (color.r + color.g + color.b)/3; + // Using 40% color 60% 'grayscale' + //color.rb = color.g; + color.r = color.r * 0.7; + color.g = color.g * 0.7; + color.b = color.b * 0.7; + color.r = color.r * 0.8 + avgColor * 0.2; + color.g = color.g * 0.8 + avgColor * 0.2; + color.b = color.b * 0.8 + avgColor * 0.2; + + return color; +} + +technique SpriteDrawing +{ + pass P0 + { + PixelShader = compile PS_SHADERMODEL MainPS(); + } +}; \ No newline at end of file diff --git a/Johnmagotchi/Content/ShadowRegular.png b/Johnmagotchi/Content/ShadowRegular.png new file mode 100644 index 0000000..2318931 Binary files /dev/null and b/Johnmagotchi/Content/ShadowRegular.png differ diff --git a/Johnmagotchi/Content/ShopScreen.png b/Johnmagotchi/Content/ShopScreen.png new file mode 100644 index 0000000..d9af520 Binary files /dev/null and b/Johnmagotchi/Content/ShopScreen.png differ diff --git a/Johnmagotchi/Content/Tiles/Grass/grass-1.png b/Johnmagotchi/Content/Tiles/Grass/grass-1.png new file mode 100644 index 0000000..7e82350 Binary files /dev/null and b/Johnmagotchi/Content/Tiles/Grass/grass-1.png differ diff --git a/Johnmagotchi/Content/Tiles/Grass/grass-2.png b/Johnmagotchi/Content/Tiles/Grass/grass-2.png new file mode 100644 index 0000000..c2a034f Binary files /dev/null and b/Johnmagotchi/Content/Tiles/Grass/grass-2.png differ diff --git a/Johnmagotchi/Content/Tiles/Grass/grass-3.png b/Johnmagotchi/Content/Tiles/Grass/grass-3.png new file mode 100644 index 0000000..0307528 Binary files /dev/null and b/Johnmagotchi/Content/Tiles/Grass/grass-3.png differ diff --git a/Johnmagotchi/Content/Tiles/Sea/ocean.png b/Johnmagotchi/Content/Tiles/Sea/ocean.png new file mode 100644 index 0000000..c0addb8 Binary files /dev/null and b/Johnmagotchi/Content/Tiles/Sea/ocean.png differ diff --git a/Johnmagotchi/Content/Tiles/tile-highlight.png b/Johnmagotchi/Content/Tiles/tile-highlight.png new file mode 100644 index 0000000..97dddc0 Binary files /dev/null and b/Johnmagotchi/Content/Tiles/tile-highlight.png differ diff --git a/Johnmagotchi/Content/TopBarPlaceholder.png b/Johnmagotchi/Content/TopBarPlaceholder.png new file mode 100644 index 0000000..65a9a57 Binary files /dev/null and b/Johnmagotchi/Content/TopBarPlaceholder.png differ diff --git a/Johnmagotchi/Content/UI/BackButtonHover.png b/Johnmagotchi/Content/UI/BackButtonHover.png new file mode 100644 index 0000000..590c564 Binary files /dev/null and b/Johnmagotchi/Content/UI/BackButtonHover.png differ diff --git a/Johnmagotchi/Content/UI/FoodButton.png b/Johnmagotchi/Content/UI/FoodButton.png new file mode 100644 index 0000000..8be6c6b Binary files /dev/null and b/Johnmagotchi/Content/UI/FoodButton.png differ diff --git a/Johnmagotchi/Content/UI/FoodButtonHighlighted.png b/Johnmagotchi/Content/UI/FoodButtonHighlighted.png new file mode 100644 index 0000000..a8adfa1 Binary files /dev/null and b/Johnmagotchi/Content/UI/FoodButtonHighlighted.png differ diff --git a/Johnmagotchi/Content/UI/HealthbarGreen.png b/Johnmagotchi/Content/UI/HealthbarGreen.png new file mode 100644 index 0000000..b15ab9b Binary files /dev/null and b/Johnmagotchi/Content/UI/HealthbarGreen.png differ diff --git a/Johnmagotchi/Content/UI/HealthbarRed.png b/Johnmagotchi/Content/UI/HealthbarRed.png new file mode 100644 index 0000000..12f4159 Binary files /dev/null and b/Johnmagotchi/Content/UI/HealthbarRed.png differ diff --git a/Johnmagotchi/Content/UI/SingleButtonBG-export.png b/Johnmagotchi/Content/UI/SingleButtonBG-export.png new file mode 100644 index 0000000..bb55ed1 Binary files /dev/null and b/Johnmagotchi/Content/UI/SingleButtonBG-export.png differ diff --git a/Johnmagotchi/Content/UI/SingleButtonBGBright-export.png b/Johnmagotchi/Content/UI/SingleButtonBGBright-export.png new file mode 100644 index 0000000..8f40a92 Binary files /dev/null and b/Johnmagotchi/Content/UI/SingleButtonBGBright-export.png differ diff --git a/Johnmagotchi/Content/UI/buyBarPurchased.png b/Johnmagotchi/Content/UI/buyBarPurchased.png new file mode 100644 index 0000000..85755d1 Binary files /dev/null and b/Johnmagotchi/Content/UI/buyBarPurchased.png differ diff --git a/Johnmagotchi/Content/UI/buyBarSelected.png b/Johnmagotchi/Content/UI/buyBarSelected.png new file mode 100644 index 0000000..bcf2a14 Binary files /dev/null and b/Johnmagotchi/Content/UI/buyBarSelected.png differ diff --git a/Johnmagotchi/Content/UI/foodGrid.png b/Johnmagotchi/Content/UI/foodGrid.png new file mode 100644 index 0000000..d27b434 Binary files /dev/null and b/Johnmagotchi/Content/UI/foodGrid.png differ diff --git a/Johnmagotchi/Content/UI/foodGridTray.png b/Johnmagotchi/Content/UI/foodGridTray.png new file mode 100644 index 0000000..1b91387 Binary files /dev/null and b/Johnmagotchi/Content/UI/foodGridTray.png differ diff --git a/Johnmagotchi/Content/UI/johnnydex.png b/Johnmagotchi/Content/UI/johnnydex.png new file mode 100644 index 0000000..fbed575 Binary files /dev/null and b/Johnmagotchi/Content/UI/johnnydex.png differ diff --git a/Johnmagotchi/Content/UI/sidebar2.png b/Johnmagotchi/Content/UI/sidebar2.png new file mode 100644 index 0000000..db63099 Binary files /dev/null and b/Johnmagotchi/Content/UI/sidebar2.png differ diff --git a/Johnmagotchi/Content/UI/title.png b/Johnmagotchi/Content/UI/title.png new file mode 100644 index 0000000..443d0b8 Binary files /dev/null and b/Johnmagotchi/Content/UI/title.png differ diff --git a/Johnmagotchi/Content/Units/unit-test-enemy.png b/Johnmagotchi/Content/Units/unit-test-enemy.png new file mode 100644 index 0000000..47ab110 Binary files /dev/null and b/Johnmagotchi/Content/Units/unit-test-enemy.png differ diff --git a/Johnmagotchi/Content/Units/unit-test-npc.png b/Johnmagotchi/Content/Units/unit-test-npc.png new file mode 100644 index 0000000..b12421b Binary files /dev/null and b/Johnmagotchi/Content/Units/unit-test-npc.png differ diff --git a/Johnmagotchi/Content/Units/unit-test.png b/Johnmagotchi/Content/Units/unit-test.png new file mode 100644 index 0000000..e039ac7 Binary files /dev/null and b/Johnmagotchi/Content/Units/unit-test.png differ diff --git a/Johnmagotchi/Content/props/bathroomRealBG.png b/Johnmagotchi/Content/props/bathroomRealBG.png new file mode 100644 index 0000000..c8c5d2b Binary files /dev/null and b/Johnmagotchi/Content/props/bathroomRealBG.png differ diff --git a/Johnmagotchi/Content/props/bathroomdoorclosed.png b/Johnmagotchi/Content/props/bathroomdoorclosed.png new file mode 100644 index 0000000..915d6cc Binary files /dev/null and b/Johnmagotchi/Content/props/bathroomdoorclosed.png differ diff --git a/Johnmagotchi/Content/props/bathroomdooropen.png b/Johnmagotchi/Content/props/bathroomdooropen.png new file mode 100644 index 0000000..3d8c91a Binary files /dev/null and b/Johnmagotchi/Content/props/bathroomdooropen.png differ diff --git a/Johnmagotchi/Content/props/bedfront.png b/Johnmagotchi/Content/props/bedfront.png new file mode 100644 index 0000000..eb11f52 Binary files /dev/null and b/Johnmagotchi/Content/props/bedfront.png differ diff --git a/Johnmagotchi/Content/props/bedwhole.png b/Johnmagotchi/Content/props/bedwhole.png new file mode 100644 index 0000000..076072e Binary files /dev/null and b/Johnmagotchi/Content/props/bedwhole.png differ diff --git a/Johnmagotchi/Content/sidebar-placeholder.png b/Johnmagotchi/Content/sidebar-placeholder.png new file mode 100644 index 0000000..61928db Binary files /dev/null and b/Johnmagotchi/Content/sidebar-placeholder.png differ diff --git a/Johnmagotchi/Content/sidebarPlaceholder.png b/Johnmagotchi/Content/sidebarPlaceholder.png new file mode 100644 index 0000000..977fdca Binary files /dev/null and b/Johnmagotchi/Content/sidebarPlaceholder.png differ diff --git a/Johnmagotchi/Content/testJohn.jpg b/Johnmagotchi/Content/testJohn.jpg new file mode 100644 index 0000000..53561ba Binary files /dev/null and b/Johnmagotchi/Content/testJohn.jpg differ diff --git a/Johnmagotchi/Core/.DS_Store b/Johnmagotchi/Core/.DS_Store new file mode 100644 index 0000000..ec6e529 Binary files /dev/null and b/Johnmagotchi/Core/.DS_Store differ diff --git a/Johnmagotchi/Core/InputManager/ButtonPress.cs b/Johnmagotchi/Core/InputManager/ButtonPress.cs new file mode 100644 index 0000000..24e7d6e --- /dev/null +++ b/Johnmagotchi/Core/InputManager/ButtonPress.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace TibzGame.Core.Inputs +{ + public class ButtonPress + { + public bool isPressed = false; + public bool isJustPressed = false; + public bool isJustReleased = false; + public UInt64 heldTime = 0; + + public void RegisterButtonPress(bool pressed) { + bool lastState = isPressed; + isPressed = pressed; + + if (lastState == isPressed) isJustReleased = isJustPressed = false; + else if (isPressed) isJustPressed = true; + else isJustReleased = true; + + if (! isPressed) heldTime = 0; + else heldTime++; + + } + + public void ClearButtonPresses() + { + isPressed = false; + isJustPressed = false; + isJustReleased = false; + heldTime = 0; + } + + } +} diff --git a/Johnmagotchi/Core/InputManager/InputManager.cs b/Johnmagotchi/Core/InputManager/InputManager.cs new file mode 100644 index 0000000..8881b48 --- /dev/null +++ b/Johnmagotchi/Core/InputManager/InputManager.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Input; + +namespace TibzGame.Core.Inputs +{ + public class InputManager + { + // classes that have actions should just read from these during their update() to get the latest state of all input devices. + public InputMapMenu menuInputs; + public InputMapGame[] gameInputs; + + public InputMapMapEditor editorInputs; + public MouseInput mouseInput; + + public Keys[] actionKeyMappings; + + public bool isMouseMode = false; + public InputManager() { + + menuInputs = new InputMapMenu(); + gameInputs = new InputMapGame[8]; // effectively this will count as 8 "profiles" for controllers. + mouseInput = new MouseInput(); + editorInputs = new InputMapMapEditor(); + + } + + // getInputs() polls and populates input info for all controllers + keyboard. + // should be called every update() from the main game class. + public void getInputs() { + + handleMouseInput(); + + handleKeyboardInput(-1); + + } + + public void ClearAllInputs() { + + menuInputs.confirm.ClearButtonPresses(); + menuInputs.cancel.ClearButtonPresses(); + menuInputs.navUp.ClearButtonPresses(); + menuInputs.navDown.ClearButtonPresses(); + menuInputs.navLeft.ClearButtonPresses(); + menuInputs.navRight.ClearButtonPresses(); + + menuInputs.special1.ClearButtonPresses(); + menuInputs.special2.ClearButtonPresses(); + menuInputs.special3.ClearButtonPresses(); + menuInputs.special4.ClearButtonPresses(); + menuInputs.special5.ClearButtonPresses(); + } + + + private void handleKeyboardInput(short playerindex) { + + //Default Keyboard Menu Inputs + KeyboardState kbState = Keyboard.GetState(); + menuInputs.confirm.RegisterButtonPress(kbState.IsKeyDown(Keys.Enter)); + menuInputs.cancel.RegisterButtonPress(kbState.IsKeyDown(Keys.Escape)); + menuInputs.navUp.RegisterButtonPress(kbState.IsKeyDown(Keys.Up)); + menuInputs.navDown.RegisterButtonPress(kbState.IsKeyDown(Keys.Down)); + menuInputs.navLeft.RegisterButtonPress(kbState.IsKeyDown(Keys.Left)); + menuInputs.navRight.RegisterButtonPress(kbState.IsKeyDown(Keys.Right)); + + menuInputs.special1.RegisterButtonPress(kbState.IsKeyDown(Keys.D1)); + menuInputs.special2.RegisterButtonPress(kbState.IsKeyDown(Keys.D2)); + menuInputs.special3.RegisterButtonPress(kbState.IsKeyDown(Keys.D3)); + menuInputs.special4.RegisterButtonPress(kbState.IsKeyDown(Keys.D4)); + menuInputs.special5.RegisterButtonPress(kbState.IsKeyDown(Keys.D5)); + + + // in update function just check bool for pressed state, for example: + // menuInputs.confirm.isPressed + + editorInputs.registerButtons(kbState); + + } + + + private void handleMouseInput() // no controller port needed + { + + MouseState mouseState = Mouse.GetState(); + mouseInput.leftClick.RegisterButtonPress(mouseState.LeftButton == ButtonState.Pressed); + mouseInput.rightClick.RegisterButtonPress(mouseState.RightButton == ButtonState.Pressed); + mouseInput.middleClick.RegisterButtonPress(mouseState.MiddleButton == ButtonState.Pressed); + mouseInput.x = mouseState.X; + mouseInput.y = mouseState.Y; + mouseInput.scrollWheelValue = mouseState.ScrollWheelValue; + + // Debug.WriteLine("MOUSE X: "+ mouseInput.x + " MOUSE Y: " + mouseInput.y); + + } + } +} diff --git a/Johnmagotchi/Core/InputManager/MouseInput.cs b/Johnmagotchi/Core/InputManager/MouseInput.cs new file mode 100644 index 0000000..d3ea042 --- /dev/null +++ b/Johnmagotchi/Core/InputManager/MouseInput.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.Xna.Framework.Input; + +namespace TibzGame.Core.Inputs +{ + public class MouseInput + { + public ButtonPress leftClick; + public ButtonPress rightClick; + public ButtonPress middleClick; + public int x; + public int y; + public int scrollWheelValue; + + private int prevScrollWheelValue; + + public MouseInput() { + x = y = prevScrollWheelValue = scrollWheelValue = 0; // set all ints to 0 + leftClick = new ButtonPress(); + rightClick = new ButtonPress(); + middleClick = new ButtonPress(); + + } + public int ScrollWheelMoving() /// returns 1 (positive) if up, -1 if Down, and 0 if not moving + { + MouseState state = Mouse.GetState(); + this.scrollWheelValue = state.ScrollWheelValue; + + int returnVal = 0; + if (prevScrollWheelValue > scrollWheelValue) + { + returnVal = 1; + } + else if (scrollWheelValue > prevScrollWheelValue) + { + returnVal = - 1; + } + + this.prevScrollWheelValue = this.scrollWheelValue; + return returnVal; + } + + + } +} diff --git a/Johnmagotchi/Core/InputManager/inputMaps/InputMapGame.cs b/Johnmagotchi/Core/InputManager/inputMaps/InputMapGame.cs new file mode 100644 index 0000000..8918aea --- /dev/null +++ b/Johnmagotchi/Core/InputManager/inputMaps/InputMapGame.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.Xna.Framework.Input; + +namespace TibzGame.Core.Inputs +{ + public class InputMapGame + { + public ButtonPress action0; + public ButtonPress action1; + public ButtonPress action2; + public ButtonPress action3; + public ButtonPress action4; + public ButtonPress action5; + //public ButtonPress action6; + + public ButtonPress dpadUp; + public ButtonPress dpadDown; + public ButtonPress dpadLeft; + public ButtonPress dpadRight; + + public ButtonPress pause; + + + + public Buttons[] buttonKeyMap; + public InputMapGame() { + // default button layout + buttonKeyMap = new Buttons[6]; + buttonKeyMap[0] = Buttons.A; + buttonKeyMap[1] = Buttons.B; + buttonKeyMap[2] = Buttons.X; + buttonKeyMap[3] = Buttons.Y; + buttonKeyMap[4] = Buttons.RightShoulder; + buttonKeyMap[5] = Buttons.LeftShoulder; + + } + + + + } +} diff --git a/Johnmagotchi/Core/InputManager/inputMaps/InputMapMenu.cs b/Johnmagotchi/Core/InputManager/inputMaps/InputMapMenu.cs new file mode 100644 index 0000000..5e81b1f --- /dev/null +++ b/Johnmagotchi/Core/InputManager/inputMaps/InputMapMenu.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace TibzGame.Core.Inputs +{ + public class InputMapMenu + { + public ButtonPress confirm; + public ButtonPress cancel; + public ButtonPress special1; + public ButtonPress special2; + public ButtonPress special3; + public ButtonPress special4; + public ButtonPress special5; + public ButtonPress navLeft; + public ButtonPress navRight; + public ButtonPress navUp; + public ButtonPress navDown; + public InputMapMenu() { + confirm = new ButtonPress(); + cancel = new ButtonPress(); + special1 = new ButtonPress(); + special2 = new ButtonPress(); + special3 = new ButtonPress(); + special4 = new ButtonPress(); + special5 = new ButtonPress(); + navLeft = new ButtonPress(); + navRight = new ButtonPress(); + navUp = new ButtonPress(); + navDown = new ButtonPress(); + } + } +} diff --git a/Johnmagotchi/Core/InputManager/inputMaps/inputMapMapEditor.cs b/Johnmagotchi/Core/InputManager/inputMaps/inputMapMapEditor.cs new file mode 100644 index 0000000..c3e90a3 --- /dev/null +++ b/Johnmagotchi/Core/InputManager/inputMaps/inputMapMapEditor.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Xml.Linq; +using Microsoft.Xna.Framework.Input; + +namespace TibzGame.Core.Inputs +{ + public class InputMapMapEditor + { + public ButtonPress confirm; + public ButtonPress cancel; + public ButtonPress special1; + public ButtonPress special2; + public ButtonPress special3; + public ButtonPress special4; + public ButtonPress special5; + public ButtonPress saveButton; + public ButtonPress loadButton; + public ButtonPress navLeft; + public ButtonPress navRight; + public ButtonPress navUp; + public ButtonPress navDown; + public InputMapMapEditor() { + confirm = new ButtonPress(); + cancel = new ButtonPress(); + special1 = new ButtonPress(); + special2 = new ButtonPress(); + special3 = new ButtonPress(); + special4 = new ButtonPress(); + special5 = new ButtonPress(); + + saveButton = new ButtonPress(); + loadButton = new ButtonPress(); + + navLeft = new ButtonPress(); + navRight = new ButtonPress(); + navUp = new ButtonPress(); + navDown = new ButtonPress(); + } + + public void registerButtons(KeyboardState kbState){ + confirm.RegisterButtonPress(kbState.IsKeyDown(Keys.Enter)); + cancel.RegisterButtonPress(kbState.IsKeyDown(Keys.Back)); + navUp.RegisterButtonPress(kbState.IsKeyDown(Keys.Up)); + navDown.RegisterButtonPress(kbState.IsKeyDown(Keys.Down)); + navLeft.RegisterButtonPress(kbState.IsKeyDown(Keys.Left)); + navRight.RegisterButtonPress(kbState.IsKeyDown(Keys.Right)); + + special1.RegisterButtonPress(kbState.IsKeyDown(Keys.D1)); + special2.RegisterButtonPress(kbState.IsKeyDown(Keys.D2)); + special3.RegisterButtonPress(kbState.IsKeyDown(Keys.D3)); + special4.RegisterButtonPress(kbState.IsKeyDown(Keys.D4)); + special5.RegisterButtonPress(kbState.IsKeyDown(Keys.D5)); + saveButton.RegisterButtonPress(kbState.IsKeyDown(Keys.S)); + loadButton.RegisterButtonPress(kbState.IsKeyDown(Keys.L)); + } + } +} diff --git a/Johnmagotchi/Core/ScreenManager/GameScreen.cs b/Johnmagotchi/Core/ScreenManager/GameScreen.cs new file mode 100644 index 0000000..634dfe1 --- /dev/null +++ b/Johnmagotchi/Core/ScreenManager/GameScreen.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace TibzGame.Core.ScreenManager +{ + public abstract class GameScreen + { + public abstract void Init(); + public abstract void Draw(); + public abstract void Update(); + + public abstract void Destroy(); + + + + public bool isUpdatePriority; // Blocks updates lower than this in the stack + public bool isDrawPriority; // Blocks draws lower than this in the stack + public bool isTopScreen; // only topmost screen should accept inputs + + public ScreenManager ScreenManager + { + get { return screenManager; } + internal set { screenManager = value; } + } + + public ScreenManager screenManager; + } +} diff --git a/Johnmagotchi/Core/ScreenManager/ScreenManager.cs b/Johnmagotchi/Core/ScreenManager/ScreenManager.cs new file mode 100644 index 0000000..e23c741 --- /dev/null +++ b/Johnmagotchi/Core/ScreenManager/ScreenManager.cs @@ -0,0 +1,226 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Dynamic; +using System.Reflection.Metadata; +using System.Text; +using Johnmagotchi.Core.tools; +using Johnmagotchi.Data; +using Johnmagotchi.GameContent.Objects.Units.BattleObjects; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Content; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; +using TibzGame.Core.Inputs; + +namespace TibzGame.Core.ScreenManager +{ + public class ScreenManager: DrawableGameComponent + { + private Stack _screens = new Stack(); + public GraphicsDeviceManager gfxDevRef; + public ContentManager contentRef; + public InputManager inputs; + public GameScreen[] newScreenBuffer; + public int removeScreenCount; + public GlobalData gameData; + + + + + //private const int SCALED_PIXELS_WIDTH = 640 * 100; // 640 + //private const int SCALED_PIXELS_HEIGHT = 360 * 100; // 360 + public static readonly int BASE_WORLD_UNIT_HEIGHT = 360; + public static readonly int BASE_ZOOM_LEVEL = 100; + + public int CURRRENT_ZOOM_LEVEL = 100; // bigger number zooms out more. + private int SCALED_PIXELS_HEIGHT;//= 360 * 100; // 360 + private int SCALED_PIXELS_WIDTH;// = 640 * 100; + + private int currentUnitId = 0; // this is internal + + public ScreenManager(Game game, ref GraphicsDeviceManager gfxRef, ref ContentManager contentManagerRef, ref InputManager inputManager) + : base(game) + { + + gfxDevRef = gfxRef; + contentRef = contentManagerRef; + inputs = inputManager; + + + newScreenBuffer = new GameScreen[0]; + removeScreenCount = 0; + gameData = new GlobalData(this);// todo = this would be where we load in existing save game data + + // Initialize game global values + TibzLog.Debug("INIT BATTLE OBJECTS"); + BattleObjectManager.LoadBattleObjects(); + } + protected override void LoadContent() + { + base.LoadContent(); + } + + protected override void UnloadContent() + { + base.UnloadContent(); + } + public override void Update(GameTime gameTime) + { + + + // Update Screens + base.Update(gameTime); + bool updateBreak = false; + foreach (GameScreen screen in _screens) + { + if (!updateBreak) + { + screen.Update(); + + } + if (screen.isUpdatePriority) updateBreak = true; + + } + + //Remove Screens + + if (removeScreenCount > 0) + { + for (int i = 0; i < removeScreenCount; i++) + { + _screens.Pop().Destroy(); + } + removeScreenCount = 0; + + if (newScreenBuffer.Length == 0) _screens.Peek().isTopScreen = true; + } + + // Add new screens + if (newScreenBuffer.Length > 0) + { + // since we are adding to a stack, we expect FILO + // looping backwards will push to the stack in that same expected order if multiple screens are added at once + for( int i = newScreenBuffer.Length -1; i >=0; i--) + { + GameScreen newScreen = newScreenBuffer[i]; + this._screens.Push(newScreen); + } + //clear buffer + this.newScreenBuffer = new GameScreen[0]; + + //set top screen + foreach( GameScreen scrn in _screens) { + scrn.isTopScreen = false; + } + _screens.Peek().isTopScreen = true; + + } + } + + public override void Draw(GameTime gameTime) + { + base.Draw(gameTime); + //we want to draw screens from lowest to highest in the main stack, so we use this stack to reverse drawing order + Stack DrawStack = new Stack(); + foreach (GameScreen screen in _screens) + { + DrawStack.Push(screen); + if (screen.isDrawPriority) + { + break; + } + } + + foreach (GameScreen screen in DrawStack) + { + screen.Draw(); + } + } + + public void addScreen(GameScreen newScreen) { + newScreenBuffer = new GameScreen[1]; + newScreenBuffer[0] = newScreen; + newScreen.ScreenManager = this; + newScreen.Init(); + + this.inputs.ClearAllInputs(); // ingore the rest of the inputs on the frame where a screen is added + + } + public void removeTopScreens(int screenCount) + { + removeScreenCount = screenCount; + } + + public void setWindowSize(ushort width, ushort height) + { + //ushort[] widths = new ushort[] { 3840, 2560, 2560, 1920, 1366, 1280, 1280 }; + //ushort [] heights = new ushort[] { 2160, 1440, 1080, 1080, 768, 1024, 720 }; + + gfxDevRef.PreferredBackBufferWidth = width; + gfxDevRef.PreferredBackBufferHeight = height; + + // Apply the changes + TibzLog.Debug("New resolution: {0} x {1}", gfxDevRef.PreferredBackBufferWidth, gfxDevRef.PreferredBackBufferHeight); + + gfxDevRef.ApplyChanges(); + + RescaleWorldUnits(); + + } + + + public void setFullScreen(bool enabled) + { + gfxDevRef.IsFullScreen = enabled; + gfxDevRef.ApplyChanges(); + RescaleWorldUnits(); + } + + // 360 x 640 res + public double GetScreenScaleX(){ + return gfxDevRef.PreferredBackBufferWidth / (float) SCALED_PIXELS_WIDTH; + } + + public double GetScreenScaleY(){ + return gfxDevRef.PreferredBackBufferHeight/ (float) SCALED_PIXELS_HEIGHT; + } + + public int getScaledIntX(int x) { + return (int)(x * GetScreenScaleX()); + } + public int getScaledIntY(int y) { + return (int)(y * GetScreenScaleY()); + } + + public Rectangle GetScaledRectangle(int posX, int posY, int width, int height){ + + double scaleX = (float) gfxDevRef.PreferredBackBufferWidth / (float) SCALED_PIXELS_WIDTH; + double scaleY = (float) gfxDevRef.PreferredBackBufferHeight/ (float) SCALED_PIXELS_HEIGHT; + return new Rectangle( + Convert.ToInt32(Math.Floor(posX * scaleX)), //Round down the next tile position to reduce where gaps occur + Convert.ToInt32(Math.Floor( posY * scaleY)), + Convert.ToInt32(Math.Ceiling(width * scaleX)), // Round up tile size to reduce gaps in tile map + Convert.ToInt32(Math.Ceiling(height * scaleY)) + ); + } + + public int GetScaledPixelScreenWidth(){ + return SCALED_PIXELS_WIDTH; + } + public int GetScaledPixelScreenHeight(){ + return SCALED_PIXELS_HEIGHT; + } + private void RescaleWorldUnits() { + float heightWidthRatio = (float)gfxDevRef.PreferredBackBufferWidth / (float)gfxDevRef.PreferredBackBufferHeight; + SCALED_PIXELS_HEIGHT = BASE_WORLD_UNIT_HEIGHT * CURRRENT_ZOOM_LEVEL; // 360 + SCALED_PIXELS_WIDTH = Convert.ToInt32(SCALED_PIXELS_HEIGHT * heightWidthRatio); + TibzLog.Debug("Scaled Height: {0}, Scaled Width {1}", SCALED_PIXELS_HEIGHT, SCALED_PIXELS_WIDTH); + } + + public int getUnitId() + { + return this.currentUnitId++; + } + } +} diff --git a/Johnmagotchi/Core/tools/TibzLog.cs b/Johnmagotchi/Core/tools/TibzLog.cs new file mode 100644 index 0000000..0de92fa --- /dev/null +++ b/Johnmagotchi/Core/tools/TibzLog.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace Johnmagotchi.Core.tools +{ + internal class TibzLog + { + public enum LogLevel : int + { + DEBUG = 0, + INFO = 1, + WARN = 2, + ERROR = 3, + CRITICAL = 4, + DISABLED_LOG = 5 + } + public static bool isRunningInVS = !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("VisualStudioEdition")); + + public static LogLevel ConsoleLogLevel { get; set; } = LogLevel.DEBUG; + public static LogLevel FileOutLogLevel { get; set; } = LogLevel.DISABLED_LOG; + + public static void Debug(string str,[CallerFilePath] string filename = null, [CallerLineNumber] int line = 0) + { + if (ConsoleLogLevel <= 0) + { + if (isRunningInVS) System.Diagnostics.Debug.WriteLine("{0}:{1} - {2}", Path.GetFileName(filename), line, str); + else System.Console.WriteLine("{0}:{1} - {2}", Path.GetFileName(filename), line, str); + } + } + public static void Debug(object obj, [CallerFilePath] string filename = null, [CallerLineNumber] int line = 0) + { + if (ConsoleLogLevel <= 0) + { + if (isRunningInVS) + { + System.Diagnostics.Debug.WriteLine("{0}:{1} - {2}", Path.GetFileName(filename), line, obj); + } + else System.Console.WriteLine("{0}:{1} - {2}", Path.GetFileName(filename), line, obj); + } + } + public static void Debug(string str, string str2) + { + if (ConsoleLogLevel <= 0) + { + if (isRunningInVS) System.Diagnostics.Debug.WriteLine(str, str2); + else System.Console.WriteLine(str, str2); + } + } + + public static void Debug(string str, params object[] objs) { + if (ConsoleLogLevel <= 0) { + if (isRunningInVS) System.Diagnostics.Debug.WriteLine(str,objs); + else System.Console.WriteLine(str, objs); + } + } + public static void Debug(object obj, string str) + { + if (ConsoleLogLevel <= 0) + { + if (isRunningInVS) System.Diagnostics.Debug.WriteLine(obj, str); + else + { + System.Console.WriteLine("Tibzlog - Object trace not implemented in system console, only DEBUG in VS environment"); + System.Console.WriteLine(obj); + System.Console.WriteLine(str); + } + + } + } + + //TODO add more later if needed, honestly just wanted to make this work quickly. + /* Ideally we would have multiple levels of logging available, and allow the log to be redirected to a file. + * It Would also probably be useful to have the log levels listed in the prints, ie " ERROR = - " or something to that effect. + * + */ + } +} diff --git a/Johnmagotchi/Data/BattleObjects/AttackDefines.cs b/Johnmagotchi/Data/BattleObjects/AttackDefines.cs new file mode 100644 index 0000000..5984ff3 --- /dev/null +++ b/Johnmagotchi/Data/BattleObjects/AttackDefines.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Johnmagotchi.Data.BattleObjects.SkillDefines; + +namespace Johnmagotchi.Data.BattleObjects +{ + public class AttackDefines + { + public enum AttackTypeEnum + { + DIRECT = 0, + INDIRECT = 1 + } + + public enum SpecialAttackPropertiesEnum + { + NONE = 0, + BRAVE = 1, + POISON = 2, + KILLER = 3, + ARMOR_BANE = 4 + } + + public static AttackTypeEnum ParseAttackTypes(string enumString) + { + Enum.TryParse(enumString, out AttackTypeEnum AttackType); + return AttackType; + } + public static SpecialAttackPropertiesEnum ParseSpecialAttackProperties(string enumString) + { + Enum.TryParse(enumString, out SpecialAttackPropertiesEnum props); + return props; + } + } +} diff --git a/Johnmagotchi/Data/BattleObjects/AttackDefinitions.csv b/Johnmagotchi/Data/BattleObjects/AttackDefinitions.csv new file mode 100644 index 0000000..885fb83 --- /dev/null +++ b/Johnmagotchi/Data/BattleObjects/AttackDefinitions.csv @@ -0,0 +1,2 @@ +ID,AttackName,BaseDamage,BaseHitCount,BaseSpeed,BaseAccuracy,AttackRangeMin,AttackRangeMax,AttackType,SpecialProperties +1,Sword,1,1,1,100,1,1,DIRECT,NONE diff --git a/Johnmagotchi/Data/BattleObjects/CustomizerModuleDefinitions.csv b/Johnmagotchi/Data/BattleObjects/CustomizerModuleDefinitions.csv new file mode 100644 index 0000000..7f17b46 --- /dev/null +++ b/Johnmagotchi/Data/BattleObjects/CustomizerModuleDefinitions.csv @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Johnmagotchi/Data/BattleObjects/SkillDefines.cs b/Johnmagotchi/Data/BattleObjects/SkillDefines.cs new file mode 100644 index 0000000..fb592be --- /dev/null +++ b/Johnmagotchi/Data/BattleObjects/SkillDefines.cs @@ -0,0 +1,37 @@ +using Johnmagotchi.GameContent.Objects.Units.BattleObjects; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Johnmagotchi.Data.BattleObjects +{ + public static class SkillDefines + { + public enum SkillTypes + { + ATK_BOOST, + SPD_BOOST, + DEF_BOOST, + MOV_BOOST, + UNIQUE + } + + public static int GetAttackBoost(List skillList) + { + int boost = 0; + foreach (var skill in skillList) + { + if (skill.SkillType == SkillTypes.ATK_BOOST) { boost+= skill.Value; } + + } + return boost; + } + + public static SkillTypes ParseSkillTypes(string enumString) { + Enum.TryParse(enumString, out SkillTypes skillEnum); + return skillEnum; + } + } +} diff --git a/Johnmagotchi/Data/BattleObjects/SkillDefinitions.csv b/Johnmagotchi/Data/BattleObjects/SkillDefinitions.csv new file mode 100644 index 0000000..3d8673d --- /dev/null +++ b/Johnmagotchi/Data/BattleObjects/SkillDefinitions.csv @@ -0,0 +1,5 @@ +ID,SkillName,SkillType,Value,Description +1,Attack Up 1,ATK_BOOST,1,Raises Attack by 1 +2,Speed Up 1,SPD_BOOST,1,Raises Speed by 1 +3,Defense Up 1,DEF_BOOST,1,Raises Defense by 1 +4,Movement Up 1,MOV_BOOST,1, Raises Movement by 1 diff --git a/Johnmagotchi/Data/BattleObjects/SupportDefines.cs b/Johnmagotchi/Data/BattleObjects/SupportDefines.cs new file mode 100644 index 0000000..5582288 --- /dev/null +++ b/Johnmagotchi/Data/BattleObjects/SupportDefines.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Johnmagotchi.Data.BattleObjects.SkillDefines; + +namespace Johnmagotchi.Data.BattleObjects +{ + public class SupportDefines + { + // A support is an action that isnt an attack. This can include things that aren't "friendly" such as "steal" or possibly status effects. FE Rods basically. + public enum SupportType { + HEAL = 0, + BOOST_STAT_ATTACK, + BOOST_STAT_DEFENSE, + BOOST_STAT_CRITICAL, + BOOST_STAT_SPEED, + BOOST_STAT_MOVE, + STATUS_EFFECT, + STEAL, + WARP, + RESCUE, + UNLOCK, + } + + public enum SupportTarget { + SELF, + ALLY, + ALLIES_IN_RANGE, + ENEMY, + ENEMIES_IN_RANGE + } + + public static SupportType ParseSupportTypes(string enumString) + { + Enum.TryParse(enumString, out SupportType typeEnum); + return typeEnum; + } + public static SupportTarget ParseSupportTargets(string enumString) + { + Enum.TryParse(enumString, out SupportTarget targetEnum); + return targetEnum; + } + } +} diff --git a/Johnmagotchi/Data/BattleObjects/SupportDefinitions.csv b/Johnmagotchi/Data/BattleObjects/SupportDefinitions.csv new file mode 100644 index 0000000..37add51 --- /dev/null +++ b/Johnmagotchi/Data/BattleObjects/SupportDefinitions.csv @@ -0,0 +1,2 @@ +ID,SupportName,SupportTarget,SupportType,Value,Description +1,Heal,ALLY,HEAL,10, Heals damage to ally unit diff --git a/Johnmagotchi/Data/BattleObjects/UnitDefinitions.csv b/Johnmagotchi/Data/BattleObjects/UnitDefinitions.csv new file mode 100644 index 0000000..2e8aba2 --- /dev/null +++ b/Johnmagotchi/Data/BattleObjects/UnitDefinitions.csv @@ -0,0 +1,7 @@ +ID,NAME,CLASS,IS_UNIQUE,HEALTH,ATTACK,DEFENSE,SPEED,MOVEMENT,MOVEMENT_TYPE,DEBUG_ATTACK,DEBUG_SUPPORT,DEBUG_SKILL +2,Mercenary,RB,FALSE,21,7,4,7,5,FOOT,,, +3,Heck Diver,BB,FALSE,18,5,5,10,6,FLYING,,, +4,Assassin,YY,FALSE,15,10,1,15,6,FOOT,,, +5,Medic,GG,FALSE,10,0,1,5,5,FOOT,,, +6,Elementalist,PP,FALSE,10,10,1,10,4,FOOT,,, +7,Commoner,N/A,FALSE,5,1,0,2,5,FOOT,,, diff --git a/Johnmagotchi/Data/GlobalData.cs b/Johnmagotchi/Data/GlobalData.cs new file mode 100644 index 0000000..0b2601c --- /dev/null +++ b/Johnmagotchi/Data/GlobalData.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.Design; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TibzGame.Core.ScreenManager; + +namespace Johnmagotchi.Data +{ + public class GlobalData + { + ScreenManager screenManager; + public GlobalData(ScreenManager sm) + { + screenManager = sm; + } + } +} diff --git a/Johnmagotchi/Data/SaveFileData/CurrentUnitData.csv b/Johnmagotchi/Data/SaveFileData/CurrentUnitData.csv new file mode 100644 index 0000000..cac602b --- /dev/null +++ b/Johnmagotchi/Data/SaveFileData/CurrentUnitData.csv @@ -0,0 +1,4 @@ +ID,NAME,HEALTH,ATTACK,DEFENSE,SPEED +1,TestUnit,50,5,5,5 +2,DummyUnit,20,10,10,10 +3,big,400,30,0,1 \ No newline at end of file diff --git a/Johnmagotchi/Data/SaveMapData/map-0.json b/Johnmagotchi/Data/SaveMapData/map-0.json new file mode 100644 index 0000000..9f46bec --- /dev/null +++ b/Johnmagotchi/Data/SaveMapData/map-0.json @@ -0,0 +1,7 @@ +{ + "width": 24, + "height": 20, + "serializedMapTiles": "[\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022]", + "serializedPlayerUnits": "[\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:0,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:9,\\u0022yPos\\u0022:10,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022,\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:0,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:12,\\u0022yPos\\u0022:10,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022,\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:0,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:4,\\u0022yPos\\u0022:6,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022]", + "serializedEnemyUnits": "[]", + "serializedNpcUnits":"[]"} \ No newline at end of file diff --git a/Johnmagotchi/Data/SaveMapData/map-1.json b/Johnmagotchi/Data/SaveMapData/map-1.json new file mode 100644 index 0000000..042c001 --- /dev/null +++ b/Johnmagotchi/Data/SaveMapData/map-1.json @@ -0,0 +1 @@ +{"width":24,"height":20,"serializedMapTiles":"[\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022]","serializedPlayerUnits":"[]","serializedEnemyUnits":"[]","serializedNpcUnits":"[]"} \ No newline at end of file diff --git a/Johnmagotchi/Data/SaveMapData/map-2.json b/Johnmagotchi/Data/SaveMapData/map-2.json new file mode 100644 index 0000000..cf8c418 --- /dev/null +++ b/Johnmagotchi/Data/SaveMapData/map-2.json @@ -0,0 +1 @@ +{"width":24,"height":20,"serializedMapTiles":"[\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022]","serializedPlayerUnits":"[\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:0,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:2,\\u0022yPos\\u0022:4,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022,\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:0,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:5,\\u0022yPos\\u0022:4,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022,\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:0,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:7,\\u0022yPos\\u0022:4,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022,\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:0,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:6,\\u0022yPos\\u0022:6,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022]","serializedEnemyUnits":"[\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:1,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:3,\\u0022yPos\\u0022:6,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022,\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:1,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:1,\\u0022yPos\\u0022:6,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022,\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:1,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:2,\\u0022yPos\\u0022:8,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022]","serializedNpcUnits":"[\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:2,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:5,\\u0022yPos\\u0022:8,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022,\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:2,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:6,\\u0022yPos\\u0022:8,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022,\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:2,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:7,\\u0022yPos\\u0022:8,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022]"} \ No newline at end of file diff --git a/Johnmagotchi/Data/SaveMapData/map-3.json b/Johnmagotchi/Data/SaveMapData/map-3.json new file mode 100644 index 0000000..cf8c418 --- /dev/null +++ b/Johnmagotchi/Data/SaveMapData/map-3.json @@ -0,0 +1 @@ +{"width":24,"height":20,"serializedMapTiles":"[\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022]","serializedPlayerUnits":"[\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:0,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:2,\\u0022yPos\\u0022:4,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022,\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:0,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:5,\\u0022yPos\\u0022:4,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022,\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:0,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:7,\\u0022yPos\\u0022:4,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022,\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:0,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:6,\\u0022yPos\\u0022:6,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022]","serializedEnemyUnits":"[\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:1,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:3,\\u0022yPos\\u0022:6,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022,\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:1,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:1,\\u0022yPos\\u0022:6,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022,\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:1,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:2,\\u0022yPos\\u0022:8,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022]","serializedNpcUnits":"[\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:2,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:5,\\u0022yPos\\u0022:8,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022,\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:2,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:6,\\u0022yPos\\u0022:8,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022,\u0022{\\u0022id\\u0022:2,\\u0022name\\u0022:\\u0022Mercenary\\u0022,\\u0022stats\\u0022:{\\u0022maxHealth\\u0022:21,\\u0022attack\\u0022:7,\\u0022defense\\u0022:4,\\u0022speed\\u0022:7,\\u0022movement\\u0022:5,\\u0022movementType\\u0022:0},\\u0022currentStatus\\u0022:{\\u0022CurrentHealth\\u0022:21,\\u0022CurrentShieldCount\\u0022:0},\\u0022isUnique\\u0022:false,\\u0022team\\u0022:2,\\u0022playerClassEnum\\u0022:2,\\u0022isTurnOver\\u0022:false,\\u0022xPos\\u0022:7,\\u0022yPos\\u0022:8,\\u0022UnitLoadout\\u0022:{\\u0022playerClassID\\u0022:0,\\u0022ModuleIDsCSV\\u0022:null,\\u0022AvailibleAttackIDsCSV\\u0022:null,\\u0022AvailaibeSupportIDsCSV\\u0022:null,\\u0022ActiveSkillsIDsCSV\\u0022:null},\\u0022serializedUnitLoadout\\u0022:null}\u0022]"} \ No newline at end of file diff --git a/Johnmagotchi/Data/SaveMapData/map-4.json b/Johnmagotchi/Data/SaveMapData/map-4.json new file mode 100644 index 0000000..c27e9cd --- /dev/null +++ b/Johnmagotchi/Data/SaveMapData/map-4.json @@ -0,0 +1 @@ +{"width":24,"height":20,"serializedMapTiles":"[\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:4,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022,\u0022[{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0},{\\u0022Type\\u0022:0,\\u0022SubType\\u0022:0}]\u0022]","serializedPlayerUnits":"[]","serializedEnemyUnits":"[]","serializedNpcUnits":"[]"} \ No newline at end of file diff --git a/Johnmagotchi/Data/SaveMapData/map-5.json b/Johnmagotchi/Data/SaveMapData/map-5.json new file mode 100644 index 0000000..afb797c --- /dev/null +++ b/Johnmagotchi/Data/SaveMapData/map-5.json @@ -0,0 +1,10 @@ +{ + "exclude": [ + "**/bin", + "**/bower_components", + "**/jspm_packages", + "**/node_modules", + "**/obj", + "**/platforms" + ] +} \ No newline at end of file diff --git a/Johnmagotchi/Data/SaveMapData/map-6.json b/Johnmagotchi/Data/SaveMapData/map-6.json new file mode 100644 index 0000000..afb797c --- /dev/null +++ b/Johnmagotchi/Data/SaveMapData/map-6.json @@ -0,0 +1,10 @@ +{ + "exclude": [ + "**/bin", + "**/bower_components", + "**/jspm_packages", + "**/node_modules", + "**/obj", + "**/platforms" + ] +} \ No newline at end of file diff --git a/Johnmagotchi/Data/SaveMapData/map-7.json b/Johnmagotchi/Data/SaveMapData/map-7.json new file mode 100644 index 0000000..afb797c --- /dev/null +++ b/Johnmagotchi/Data/SaveMapData/map-7.json @@ -0,0 +1,10 @@ +{ + "exclude": [ + "**/bin", + "**/bower_components", + "**/jspm_packages", + "**/node_modules", + "**/obj", + "**/platforms" + ] +} \ No newline at end of file diff --git a/Johnmagotchi/Data/SaveMapData/map-8.json b/Johnmagotchi/Data/SaveMapData/map-8.json new file mode 100644 index 0000000..afb797c --- /dev/null +++ b/Johnmagotchi/Data/SaveMapData/map-8.json @@ -0,0 +1,10 @@ +{ + "exclude": [ + "**/bin", + "**/bower_components", + "**/jspm_packages", + "**/node_modules", + "**/obj", + "**/platforms" + ] +} \ No newline at end of file diff --git a/Johnmagotchi/Data/SaveMapData/map-9.json b/Johnmagotchi/Data/SaveMapData/map-9.json new file mode 100644 index 0000000..afb797c --- /dev/null +++ b/Johnmagotchi/Data/SaveMapData/map-9.json @@ -0,0 +1,10 @@ +{ + "exclude": [ + "**/bin", + "**/bower_components", + "**/jspm_packages", + "**/node_modules", + "**/obj", + "**/platforms" + ] +} \ No newline at end of file diff --git a/Johnmagotchi/Data/readme.txt b/Johnmagotchi/Data/readme.txt new file mode 100644 index 0000000..ddba1e8 --- /dev/null +++ b/Johnmagotchi/Data/readme.txt @@ -0,0 +1 @@ +this directory is used for game save data and other persistant data \ No newline at end of file diff --git a/Johnmagotchi/GameContent/.DS_Store b/Johnmagotchi/GameContent/.DS_Store new file mode 100644 index 0000000..3d0db0d Binary files /dev/null and b/Johnmagotchi/GameContent/.DS_Store differ diff --git a/Johnmagotchi/GameContent/Logic/BattleLogic.cs b/Johnmagotchi/GameContent/Logic/BattleLogic.cs new file mode 100644 index 0000000..8a59565 --- /dev/null +++ b/Johnmagotchi/GameContent/Logic/BattleLogic.cs @@ -0,0 +1,121 @@ +using Johnmagotchi.GameContent.Objects.Units.BattleObjects; +using Johnmagotchi.GameContent.Units; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection.Metadata; +using System.Runtime.ConstrainedExecution; +using System.Text; +using System.Threading.Tasks; + +namespace Johnmagotchi.GameContent.Logic +{ + public static class BattleLogic + { + private static double CriticalMultiplier = 1.5; + public static Random Random = new Random(); + public static BattleResults RunBattle(ref UnitObject Attacker, ref UnitObject Defender, AttackObj attack, AttackObj counterAttack) { + + // these are debugs, should be parsed from attack + unit combos + bool IsCounterAttackOccuring = true; + bool IsDoubleAttackOccuring = false; + bool IsDoubleCounterAttackOccuring = false; + + BattleResults results = new BattleResults(); // battle results will determine how the battles are animated + + // for each combat, we need to do each attack phase that occurs apply results here + + //Initial Attack + HandleAttackPhase(ref Attacker, ref Defender, attack, ref results, false); + + //Enemy's counter attack + if (IsCounterAttackOccuring) + { + HandleAttackPhase(ref Defender, ref Attacker, counterAttack, ref results, true); + } + // FE style double attack + if (IsDoubleAttackOccuring) + { + HandleAttackPhase(ref Attacker, ref Defender, attack, ref results, false); + } + // FE style Double Counter Attack + if (IsDoubleCounterAttackOccuring) + { + HandleAttackPhase(ref Defender, ref Attacker, counterAttack, ref results, true); + } + + + return results; + } + + // this is each step + public static void HandleAttackPhase( + ref UnitObject Attacker, ref UnitObject Defender, AttackObj attack, + ref BattleResults results, bool isCounter) + { + int hitcount = attack.BaseHitCount; // anything that adjusts how many times an attack happens PER PHASE should be adjusted here + + for (int i = 0; i < hitcount; i++) { + + int hitRoll = BattleLogic.Random.Next(100) + 1; // random int 1 - 100 + int hitThreshold = attack.BaseAccuracy + Attacker.stats.Speed - Defender.stats.Speed; + + // this should be adjusted, in FE games its usally something like...... + // ATTACKER = Hit + (Skill × 2) + (Luck / 2) + (Support bonus)+(Weapon triangle advantage/ disadvantage) +(S level bonus) + // DEFENDER = ((Attack speed × 2) +(Luck) + (Terrain bonus) +(Support bonus) +Tactician bonus) ) + // hit perentage = attacker - defender + + int critThreshold = 95; + + + if (hitRoll < hitThreshold) //handle misses + { + + results.addResult(BattleResults.resultType.MISS, 0, isCounter); + } + else if (hitRoll >= critThreshold) //Handle Crits + { + + if (Defender.currentStatus.CurrentShieldCount > 1) Defender.currentStatus.CurrentShieldCount--; // as is, crits ignore shields but should still tick a shield down + if (Defender.currentStatus.CurrentShieldCount < 0) Defender.currentStatus.CurrentShieldCount = 0; + int BaseDamage = CalculateDamage(Attacker,Defender,attack); + int TotalCritDamage = (int) Math.Ceiling (BaseDamage * CriticalMultiplier); + + //apply Damage to defending unit, then add to result report + Defender.currentStatus.CurrentHealth -= TotalCritDamage; + results.addResult(BattleResults.resultType.CRITICAL, TotalCritDamage, isCounter); + + } + else if (Defender.currentStatus.CurrentShieldCount > 1) // Shielded + { + Defender.currentStatus.CurrentShieldCount--; + results.addResult(BattleResults.resultType.SHIELDED,1, isCounter); // 1 siginfies 1 shield lost + } + else // normal attack + { + int BaseDamage = CalculateDamage(Attacker, Defender, attack); + + //Apply damage + report to animation handler + Defender.currentStatus.CurrentHealth -= BaseDamage; + results.addResult(BattleResults.resultType.ATTACK, BaseDamage, isCounter); + } + } + return; + } + + private static int CalculateDamage( UnitObject Attacker, UnitObject Defender, AttackObj attack) + { + int damage = 0; + + damage += attack.BaseDamage; + damage += Attacker.stats.Attack; + + damage -= Defender.stats.Defense; + + + if (damage < 0) damage = 0; + return damage ; + } + } +} diff --git a/Johnmagotchi/GameContent/Logic/BattleResults.cs b/Johnmagotchi/GameContent/Logic/BattleResults.cs new file mode 100644 index 0000000..7f3a76c --- /dev/null +++ b/Johnmagotchi/GameContent/Logic/BattleResults.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Johnmagotchi.GameContent.Logic +{ + public class BattleResults + { + /* + This class is basically a summary of the "math" that happened in the battle routines + that will *eventually* be displayed in the battle animation. + + */ + public enum resultType + { + MISS, + ATTACK, + CRITICAL, + SHIELDED, + SPECIAL, + } + + public List> results; + + public void addResult(resultType result, int val, bool isCounter) { + results.Add(new Tuple(result, val, isCounter)); + } + } +} diff --git a/Johnmagotchi/GameContent/Logic/MovementCostTable.cs b/Johnmagotchi/GameContent/Logic/MovementCostTable.cs new file mode 100644 index 0000000..5c2c06c --- /dev/null +++ b/Johnmagotchi/GameContent/Logic/MovementCostTable.cs @@ -0,0 +1,110 @@ +using Johnmagotchi.Core.tools; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Johnmagotchi.GameContent.Objects.Units.BattleObjects.UnitStatBlock; + +namespace Johnmagotchi.GameContent.Logic +{ + public static class MovementCostTable + { + public static int getMoveCost(MovementType moveType, TileType tileType) { + switch (moveType) { + case MovementType.FOOT: + return FootMovement(tileType); + case MovementType.WHEELS: + return WheelMovement(tileType); + case MovementType.HORSE: + return HorseMovement(tileType); + case MovementType.FLYING: + return FlyingMovement(tileType); + default: + return FootMovement(tileType); + } + } + + private static int FootMovement(TileType tileType) { + switch (tileType) { + case TileType.GRASS: + case TileType.ROAD: + case TileType.BASE: + case TileType.CITY: + case TileType.HQ: + return 1; + + case TileType.RIVER: + case TileType.MOUNTAIN: + return 2; + + case TileType.SEA: + return 9999; + default: + return 9999; + } + } + private static int WheelMovement(TileType tileType) + { + switch (tileType) + { + case TileType.GRASS: + case TileType.ROAD: + case TileType.BASE: + case TileType.CITY: + case TileType.HQ: + return 1; + + case TileType.RIVER: + case TileType.MOUNTAIN: + return 2; + + case TileType.SEA: + return 9999; + default: + return 9999; + } + } + private static int HorseMovement(TileType tileType) + { + switch (tileType) + { + case TileType.GRASS: + case TileType.ROAD: + case TileType.BASE: + case TileType.CITY: + case TileType.HQ: + return 1; + + case TileType.RIVER: + case TileType.MOUNTAIN: + return 2; + + case TileType.SEA: + return 9999; + default: + return 9999; + } + } + + private static int FlyingMovement(TileType tileType) + { + + switch (tileType) + { + case TileType.GRASS: + case TileType.ROAD: + case TileType.BASE: + case TileType.CITY: + case TileType.HQ: + case TileType.RIVER: + case TileType.MOUNTAIN: + case TileType.SEA: + return 1; + default: + return 9999; + } + } + + } +} diff --git a/Johnmagotchi/GameContent/Objects/.DS_Store b/Johnmagotchi/GameContent/Objects/.DS_Store new file mode 100644 index 0000000..f874283 Binary files /dev/null and b/Johnmagotchi/GameContent/Objects/.DS_Store differ diff --git a/Johnmagotchi/GameContent/Objects/Maps/BattleMap.cs b/Johnmagotchi/GameContent/Objects/Maps/BattleMap.cs new file mode 100644 index 0000000..8d46c98 --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/Maps/BattleMap.cs @@ -0,0 +1,521 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using TibzGame.Core.ScreenManager; +using Johnmagotchi.GameContent.Units; +using Johnmagotchi.Core.tools; +using System.Runtime.ExceptionServices; + + +namespace Johnmagotchi.GameContent.Objects +{ + public class BattleMap + { + public int width { get; set; } + public int height{ get; set; } + + public string serializedMapTiles{ get; set; } + public string serializedPlayerUnits { get; set; } + public string serializedEnemyUnits{ get; set; } + public string serializedNpcUnits { get; set; } + + + private MapTile [,] MapTileGrid; + + private List playerUnits; + private List enemyUnits; + private List npcUnits; + + private SpriteBatch _spriteBatch; + private ScreenManager _screenManager; + private SpriteEffects currentSpriteEffects; + public Boolean OutlineEnabled; + + Texture2D _outlineTexture; + + public BattleMap(){ + buildMap(10,10); + } + public BattleMap(int width, int height) + { + buildMap(width,height); + } + + public void buildMap(int w, int h){ + this.height = h; // default min height (shooting for 360 x 640 res, 40x40 pixel grid) + this.width = w; + MapTileGrid = new MapTile[width,height]; + this.playerUnits = new List(); + this.npcUnits = new List(); + this.enemyUnits = new List(); + } + + public void Init(ScreenManager ScreenManager){ + this.OutlineEnabled = true; + this._screenManager = ScreenManager; + initArray(); + _spriteBatch = new SpriteBatch(_screenManager.GraphicsDevice); + _outlineTexture = _screenManager.contentRef.Load("Map-UI/outline-32"); + } + + + public void InitFromReload(ScreenManager ScreenManager){ + this.OutlineEnabled = true; + this._screenManager = ScreenManager; + _spriteBatch = new SpriteBatch(_screenManager.GraphicsDevice); + _outlineTexture = _screenManager.contentRef.Load("Map-UI/outline-32"); + } + + public void Update() + { + foreach (UnitObject unit in playerUnits) + { + unit.Update(); + } + foreach (UnitObject unit in enemyUnits) + { + unit.Update(); + } + foreach (UnitObject unit in npcUnits) + { + unit.Update(); + } + + for (int x = 0; x < width; x++) + { + for (int y = 0; y < height; y++) + { + MapTileGrid[x,y].Update(); + } + } + } + + public void initArray(){ + // init tiles + for (int x =0; x < width; x++) + { + for (int y =0; y < height; y++) + { + MapTileGrid[x,y] = new MapTile(); + MapTileGrid[x,y].Init(_screenManager); + } + } + //set neighbors + for (int x =0; x < width; x++) + { + for (int y =0; y < height; y++) + { + if (x -1 >= 0) MapTileGrid[x,y].WestNeighborType = MapTileGrid[x-1,y].Type; + if (x+1 < height) MapTileGrid[x,y].WestNeighborType = MapTileGrid[x+1,y].Type; + if (y -1 >= 0) MapTileGrid[x,y].WestNeighborType = MapTileGrid[x,y-1].Type; + if (y+1 < height) MapTileGrid[x,y].WestNeighborType = MapTileGrid[x,y+1].Type; + } + } + } + public void DrawMap(int xOffset, int yOffset){ + // this could probably be changed to only draw visible tiles instead of every single tile in the future + for (int x =0; x < width; x++) + { + for (int y =0; y < height; y++) + { + int xLocation = (x * MapTile.TILE_WIDTH_PX) + xOffset; + int yLocation = (y * MapTile.TILE_HEIGHT_PX)+ yOffset; + MapTileGrid[x,y].DrawAt(xLocation, yLocation); + } + } + + +// ADD IN an if statment, 'IF OUTLINE IS ENABLED' + if (this.OutlineEnabled == true) + { + _spriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointClamp); + for (int x =0; x < width; x++) + { + for (int y =0; y < height; y++) + { + int xLocation = (x * MapTile.TILE_WIDTH_PX) + xOffset; + int yLocation = (y * MapTile.TILE_HEIGHT_PX)+ yOffset; + this.DrawOutlineSquare(xLocation, yLocation); + } + } + _spriteBatch.End(); + } + } + + private void DrawOutlineSquare(int posX, int posY) + { + // all rectangles should do the scaling from world coordinates to screen coordinates + Rectangle tileRect = _screenManager.GetScaledRectangle(posX, posY, MapTile.TILE_WIDTH_PX, MapTile.TILE_HEIGHT_PX); + + _spriteBatch.Draw( + _outlineTexture, tileRect, null, Color.White, 0, new Vector2(0, 0), + currentSpriteEffects, 1); + } + + + public void DrawUnits(int xOffset, int yOffset) { + + foreach(UnitObject unit in playerUnits) { + int xLocation = (unit.xPos * MapTile.TILE_WIDTH_PX) + xOffset; + int yLocation = (unit.yPos * MapTile.TILE_HEIGHT_PX) + yOffset; + unit.DrawAt( xLocation, yLocation); + } + foreach (UnitObject unit in enemyUnits) + { + int xLocation = (unit.xPos * MapTile.TILE_WIDTH_PX) + xOffset; + int yLocation = (unit.yPos * MapTile.TILE_HEIGHT_PX) + yOffset; + unit.DrawAt( xLocation, yLocation); + } + foreach (UnitObject unit in npcUnits) + { + int xLocation = (unit.xPos * MapTile.TILE_WIDTH_PX) + xOffset; + int yLocation = (unit.yPos * MapTile.TILE_HEIGHT_PX) + yOffset; + unit.DrawAt(xLocation, yLocation); + } + } + + public void ChangeTileType(int x, int y, TileType newType) + { + MapTileGrid[x,y].ChangeType(newType); + if(x > 0){MapTileGrid[x-1,y].EastNeighborType = newType;} //update left neighbor + if(x < width -1){MapTileGrid[x +1,y].WestNeighborType = newType;} //update right neighbor + if(y > 0){MapTileGrid[x,y-1].SouthNeighborType = newType;} //update top neighbor + if(y < height -1){MapTileGrid[x ,y+1].NorthNeighborType = newType;} //update bottom neighbor + } + + public void serializeMapTiles(){ + List serializedRows = new List(); + for (int row = 0; row < this.height; row ++){ + + List rowData = new List(); + for (int column =0; column < this.width; column++){ + rowData.Add( MapTileGrid[column, row]); // grid is width, height + } + serializedRows.Add( JsonSerializer.Serialize(rowData)); + } + serializedMapTiles = JsonSerializer.Serialize(serializedRows); + } + + public void deserializeMapTiles(){ + MapTileGrid = new MapTile[width,height]; + List serializedRows = JsonSerializer.Deserialize>(serializedMapTiles); + for (int row= 0; row < serializedRows.Count; row++){ + string currentRow = serializedRows[row]; + List rowData = JsonSerializer.Deserialize>(currentRow); + for (int column =0; column < rowData.Count; column++){ + MapTile tile = rowData[column]; + MapTileGrid[column, row] = tile; + MapTileGrid[column, row].Init(_screenManager); + } + } + // initArray(); + System.Console.WriteLine("Deserialition Completed!"); + } + public void SerializeAll() + { + this.serializeMapTiles(); + this.SerializeUnitData(); + + } + + public void SerializeUnitData() { + List player = new List(); + List enemy = new List(); + List npc = new List(); + + foreach (UnitObject unit in playerUnits) { + player.Add(unit.GetAsSerialized()); + } + foreach (UnitObject unit in enemyUnits) { + enemy.Add(unit.GetAsSerialized()); + } + foreach (UnitObject unit in npcUnits) + { + npc.Add(unit.GetAsSerialized()); + } + serializedPlayerUnits = JsonSerializer.Serialize(player); + serializedEnemyUnits = JsonSerializer.Serialize(enemy); + serializedNpcUnits = JsonSerializer.Serialize(npc); + + TibzLog.Debug("P:" + player.Count + " E:" + enemy.Count + " N:" + npc.Count); + + } + public void DeserializeUnitData() { + TibzLog.Debug("Deserializing unit data"); + List OutPlayerUnits = new List(); + List OutEnemyUnits = new List(); + List OutNpcUnits = new List(); + + List players = JsonSerializer.Deserialize>(serializedPlayerUnits); + List enemies = JsonSerializer.Deserialize>(serializedEnemyUnits); + List npcs = JsonSerializer.Deserialize>(serializedNpcUnits); + + foreach(string entry in players) { + UnitObject newUnit = new UnitObject(entry); + TibzLog.Debug(JsonSerializer.Serialize(newUnit)); + OutPlayerUnits.Add(newUnit); // makes new instance from serialized string + newUnit.InitSprite(_screenManager, UnitObject.UnitTeam.PLAYER); + } + foreach (string entry in enemies) + { + UnitObject newUnit = new UnitObject(entry); + OutEnemyUnits.Add(newUnit); // makes new instance from serialized string + newUnit.InitSprite(_screenManager, UnitObject.UnitTeam.ENEMY); + } + foreach (string entry in npcs) + { + UnitObject newUnit = new UnitObject(entry); + OutNpcUnits.Add(newUnit); // makes new instance from serialized string + newUnit.InitSprite(_screenManager,UnitObject.UnitTeam.NPC); + } + + playerUnits = OutPlayerUnits; + enemyUnits = OutEnemyUnits; + npcUnits = OutNpcUnits; + + TibzLog.Debug("P:" + playerUnits.Count + " E:" + enemyUnits.Count + " N:" + npcUnits.Count); + } + + public void AddPlayerUnit(UnitObject unitRef, int xpos, int ypos) + { + if (! CheckIfUnitCanBePlaced(unitRef, xpos, ypos)) + { + return; + } + + UnitObject unit = new UnitObject(unitRef); + unit.SetShaderSet(UnitObject.SpriteShaderSets.PLAYER_NORMAL); + unit.xPos = xpos; + unit.yPos = ypos; + if (unit.isUnique == true) + { + //check then replace + for (int i = 0; i < playerUnits.Count; i++) + { + if (playerUnits[i].id == unit.id ) + { + playerUnits[i].xPos = xpos; + playerUnits[i].yPos = ypos; + return; // dont add + } + } + playerUnits.Add(unit); // else add + } + else { + playerUnits.Add(unit); + } + + unit.InitSprite(_screenManager, UnitObject.UnitTeam.PLAYER); + } + public void AddEnemyUnit(UnitObject unitRef, int xpos, int ypos) + { + if (!CheckIfUnitCanBePlaced(unitRef, xpos, ypos)) + { + return; + } + UnitObject unit = new UnitObject(unitRef); + + unit.SetShaderSet(UnitObject.SpriteShaderSets.ENEMY_NORMAL); + unit.xPos = xpos; + unit.yPos = ypos; + if (unit.isUnique == true) + { + //check then replace + for (int i = 0; i < enemyUnits.Count; i++) + { + if (enemyUnits[i].id == unit.id) + { + enemyUnits[i].xPos = xpos; + enemyUnits[i].yPos = ypos; + return; // dont add + } + } + enemyUnits.Add(unit); // else add + } + else + { + enemyUnits.Add(unit); + } + unit.InitSprite(_screenManager, UnitObject.UnitTeam.ENEMY); + } + + public void AddNpcUnit(UnitObject unitRef, int xpos, int ypos) + { + + if (!CheckIfUnitCanBePlaced(unitRef, xpos, ypos)) + { + return; + } + + UnitObject unit = new UnitObject(unitRef); + unit.SetShaderSet(UnitObject.SpriteShaderSets.NPC_NORMAL); + unit.xPos = xpos; + unit.yPos = ypos; + + if (unit.isUnique == true) + { + //check then replace + for (int i = 0; i < npcUnits.Count; i++) + { + if (npcUnits[i].id == unit.id) + { + enemyUnits[i] = unit; + return; // dont add + } + } + npcUnits.Add(unit); // else add + } + else + { + npcUnits.Add(unit); + } + unit.InitSprite(_screenManager, UnitObject.UnitTeam.NPC); + + TibzLog.Debug("NPC obj count: {0}", npcUnits.Count); + + } + + public void deleteUnit(UnitObject unitRef) { + + int removePlayerIndex = -1; + int removeEnemyIndex = -1; + int removeNpcIndex = -1; + + for (int i = 0; i < playerUnits.Count; i++) + { + if (unitRef.internalID == playerUnits[i].internalID) + { + removePlayerIndex = i; + break; + } + } + for (int i = 0; i < enemyUnits.Count; i++) + { + if (unitRef.internalID == enemyUnits[i].internalID) + { + removeEnemyIndex = i; + break; + } + } + for (int i = 0; i < npcUnits.Count; i++) + { + if (unitRef.internalID == npcUnits[i].internalID) + { + removeNpcIndex = i; + break; + } + } + if (removePlayerIndex != -1) { playerUnits.RemoveAt(removePlayerIndex); } + if (removeEnemyIndex != -1) { enemyUnits.RemoveAt(removeEnemyIndex); } + if (removeNpcIndex != -1) { npcUnits.RemoveAt(removeNpcIndex); } + } + + private bool CheckIfUnitCanBePlaced(UnitObject unit, int x, int y) { + + if (MapTileGrid[x,y].Type == TileType.SEA ) { // add a && unit.Traversal type or whatever, so we check if this unit CAN stand on said tile. + return false; + } + // else delete existing units if they overlap then return true + + return true; + } + + + public bool CheckIfAnyUnits(int x, int y) { + return CheckIfPlayerUnits(x, y) || CheckIfEnemyUnits(x,y)|| CheckIfNpcUnits(x,y) ; + } + public bool CheckIfPlayerUnits(int CursorX, int CursorY) + { + foreach (UnitObject Unit in playerUnits) { + if (Unit.xPos == CursorX && Unit.yPos == CursorY) { return true; } + } + return false; + } + public bool CheckIfEnemyUnits(int CursorX, int CursorY) + { + foreach (UnitObject Unit in enemyUnits) + { + if (Unit.xPos == CursorX && Unit.yPos == CursorY) { return true; } + } + return false; + } + public bool CheckIfNpcUnits(int CursorX, int CursorY) + { + foreach (UnitObject Unit in npcUnits) + { + if (Unit.xPos == CursorX && Unit.yPos == CursorY) { return true; } + } + return false; + } + public UnitObject getUnitAtLocation(int CursorX, int CursorY) { + + foreach (UnitObject Unit in playerUnits) + { + if (Unit.xPos == CursorX && Unit.yPos == CursorY) { return Unit; } + } + foreach (UnitObject Unit in enemyUnits) + { + if (Unit.xPos == CursorX && Unit.yPos == CursorY) { return Unit; } + } + foreach (UnitObject Unit in npcUnits) + { + if (Unit.xPos == CursorX && Unit.yPos == CursorY) { return Unit; } + } + return null; + } + + public void moveUnit(UnitObject unitcopy, int x, int y) + { + foreach (UnitObject Unit in playerUnits) + { + if (Unit.internalID == unitcopy.internalID) + { + Unit.xPos = x; + Unit.yPos = y; + } + } + foreach (UnitObject Unit in enemyUnits) + { + if (Unit.internalID == unitcopy.internalID) { } + } + foreach (UnitObject Unit in npcUnits) + { + if (Unit.internalID == unitcopy.internalID) { } + } + } + + public MapTile getTile(int x, int y) { + if (x < 0 || y < 0) return null; + if (x >= width || y >= height) return null; + return MapTileGrid[x, y]; + } + public void ChangeTileHighlight(int x, int y, TileHighlight highlightType) + { + MapTileGrid[x, y].SetTileHighlight(highlightType); + } + + + public BattleMap GetClone() { + BattleMap clone = new BattleMap(this.width, this.height); + clone.Init(this._screenManager); + this.SerializeAll(); + + clone.serializedMapTiles = this.serializedMapTiles; + clone.deserializeMapTiles(); + + clone.serializedPlayerUnits = this.serializedPlayerUnits; + clone.serializedNpcUnits = this.serializedNpcUnits; + clone.serializedEnemyUnits = this.serializedEnemyUnits; + clone.DeserializeUnitData(); + + return clone; + } + + } +} diff --git a/Johnmagotchi/GameContent/Objects/Maps/MapMovementNode.cs b/Johnmagotchi/GameContent/Objects/Maps/MapMovementNode.cs new file mode 100644 index 0000000..3bb4242 --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/Maps/MapMovementNode.cs @@ -0,0 +1,217 @@ +using Johnmagotchi.Core.tools; +using Johnmagotchi.GameContent.Logic; +using Johnmagotchi.GameContent.Units; +using System; +using System.Collections.Generic; +using System.Windows.Forms.VisualStyles; +using static System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox; + +namespace Johnmagotchi.GameContent.Objects.Maps +{ + public class MapMovementNode + { + public enum ParentNodeLocation { + NORTH, EAST, SOUTH, WEST, ROOT + } + + + UnitObject selectedUnit; + BattleMap currentMap; + public int movesRemaining; + public int x; + public int y; + public MapMovementNode(UnitObject selectedUnit, BattleMap currentMap, int moveRemaining, int x, int y) { + + this.selectedUnit = selectedUnit; + this.currentMap = currentMap; + this.movesRemaining = moveRemaining; + this.x = x; + this.y = y; + } + + /// Passes a list by reference, recursively creates nodes to traverse tree and then assigns to list + public void GetMoveLocations(ParentNodeLocation parent, ref List> list) { + + if (movesRemaining <= 0) return; // no more moves left, invalid + if (x < 0 || x > currentMap.width || y < 0 || y > currentMap.height) return; // square is out of bounds, invalid + + //this square is valid, add to list + list.Add(new Tuple(x, y)); + // parent north means the unit movement is south, parent east means we moved west, etc + if (parent != ParentNodeLocation.NORTH) // check north movement + { + MapTile destTile = currentMap.getTile(x, y - 1); + if (destTile != null) { + new MapMovementNode(selectedUnit, currentMap, getMovesRemaining(destTile, x, y-1), x, y - 1).GetMoveLocations(ParentNodeLocation.SOUTH, ref list); + } + } + if (parent != ParentNodeLocation.EAST) // check east movement + { + MapTile destTile = currentMap.getTile(x + 1, y); + if (destTile != null) + { + new MapMovementNode(selectedUnit, currentMap, getMovesRemaining(destTile, x+1 ,y), x + 1, y).GetMoveLocations(ParentNodeLocation.WEST, ref list); + } + //new MapMovementNode(ParentNodeLocation.SOUTH, selectedUnit, getMovesRemaining(), x + 1, y).GetLocations(ref list); + } + if (parent != ParentNodeLocation.SOUTH) // check south movement + { + MapTile destTile = currentMap.getTile(x, y + 1); + if (destTile != null) + { + new MapMovementNode(selectedUnit, currentMap, getMovesRemaining(destTile , x, y+1), x, y + 1).GetMoveLocations(ParentNodeLocation.NORTH, ref list); + } + } + if (parent != ParentNodeLocation.WEST) // check west movement + { + MapTile destTile = currentMap.getTile(x - 1, y); + if (destTile != null) + { + new MapMovementNode(selectedUnit, currentMap, getMovesRemaining(destTile,x-1, y), x - 1, y).GetMoveLocations(ParentNodeLocation.EAST, ref list); + } + } + + // all recursions should be completed, prune duplicates + if (parent == ParentNodeLocation.ROOT) { + list = RemoveDuplicates(list); + } + return ; + } + + + public void getDirectAttackLocations( ParentNodeLocation parent, ref List> list) { + if (movesRemaining <= 0) return; // no more moves left, invalid + if (x < 0 || x > currentMap.width || y < 0 || y > currentMap.height) return; // square is out of bounds, invalid + + //add valid attack squares to the list + // list.Add(new Tuple(x, y)); + addAttackRangesToList( ref list); + + // parent north means the unit movement is south, parent east means we moved west, etc + if (parent != ParentNodeLocation.NORTH) // check north movement + { + MapTile destTile = currentMap.getTile(x, y - 1); + if (destTile != null) + { + new MapMovementNode(selectedUnit, currentMap, getMovesRemaining(destTile, x, y - 1), x, y - 1).getDirectAttackLocations(ParentNodeLocation.SOUTH, ref list); + } + } + if (parent != ParentNodeLocation.EAST) // check east movement + { + MapTile destTile = currentMap.getTile(x + 1, y); + if (destTile != null) + { + new MapMovementNode(selectedUnit, currentMap, getMovesRemaining(destTile, x + 1, y), x + 1, y).getDirectAttackLocations(ParentNodeLocation.WEST, ref list); + } + //new MapMovementNode(ParentNodeLocation.SOUTH, selectedUnit, getMovesRemaining(), x + 1, y).GetLocations(ref list); + } + if (parent != ParentNodeLocation.SOUTH) // check south movement + { + MapTile destTile = currentMap.getTile(x, y + 1); + if (destTile != null) + { + new MapMovementNode(selectedUnit, currentMap, getMovesRemaining(destTile, x, y + 1), x, y + 1).getDirectAttackLocations(ParentNodeLocation.NORTH, ref list); + } + } + if (parent != ParentNodeLocation.WEST) // check west movement + { + MapTile destTile = currentMap.getTile(x - 1, y); + if (destTile != null) + { + new MapMovementNode(selectedUnit, currentMap, getMovesRemaining(destTile, x - 1, y), x - 1, y).getDirectAttackLocations(ParentNodeLocation.EAST, ref list); + } + } + + // all recursions should be completed, prune duplicates + if (parent == ParentNodeLocation.ROOT) + { + list = RemoveDuplicates(list); + } + return; + + } + + public void getDirectAttacksNoMovement(ParentNodeLocation parent, ref List> list) + { + addAttackRangesToList(ref list); + + list = RemoveDuplicates(list); + + } + + private int getMovesRemaining(MapTile destTile , int x, int y) { + // check if occupied by another uint + UnitObject targetUnit = currentMap.getUnitAtLocation(x, y); + if (targetUnit != null) { + if ( + (selectedUnit.team == UnitObject.UnitTeam.PLAYER && targetUnit.team == UnitObject.UnitTeam.ENEMY) || + (selectedUnit.team == UnitObject.UnitTeam.ENEMY && (targetUnit.team == UnitObject.UnitTeam.PLAYER || targetUnit.team == UnitObject.UnitTeam.NPC)) + ) + { + return 0; + } + } + + // comare movement type to current tile type then return + + // MovementCostTable.getMoveCost(selectedUnit.stats.movementType, destTile.Type); + + // note that the return value MUST be <= moves remaining, or else we risk infinite recursion + return movesRemaining - MovementCostTable.getMoveCost(selectedUnit.stats.movementType, destTile.Type); + } + + private List> RemoveDuplicates( List> oldList) + { + List < Tuple > newList = new List>(); + + for (int i = 0; i < oldList.Count; i++) + { + bool isUnique = true; + + for (int j = 0; i < newList.Count; j++) + { + if (oldList[i].Item1 == newList[j].Item1 && oldList[i].Item2 == newList[j].Item2) + { + isUnique = false; + } + } + + if (isUnique) + { + newList.Add(oldList[i]); + //TibzLog.Debug("added unique square"); + //TibzLog.Debug(" x: " + oldList[i].Item1, " y: " + oldList[i].Item2); + } + } + + return newList; + } + + private void addAttackRangesToList( ref List> list) { + + for (int i = selectedUnit.DirectAttackRangeMin; i <= selectedUnit.DirectAttackRangeMax; i++) { + getCircleRange(ref list, i); + } + + } + + //gets one ring of an attack range at a time + private void getCircleRange(ref List> list, int range) { + for (int i = range; i > 0; i--) { + int offset = range - i; + addTileIfInBounds(ref list, x + offset, y + i); // top to right + addTileIfInBounds(ref list, x + i, y - offset); //right to bot + addTileIfInBounds(ref list, x - offset, y - i); //bot to left + addTileIfInBounds(ref list, x - i, y + offset); //let to top + } + } + + private bool addTileIfInBounds(ref List> list, int newX, int newY) { + if (newX < 0 || newX > currentMap.width || newY < 0 || newY > currentMap.height) { + return false; + } + list.Add(new Tuple(newX, newY)); + return true; + } + } +} diff --git a/Johnmagotchi/GameContent/Objects/Maps/MapTile.cs b/Johnmagotchi/GameContent/Objects/Maps/MapTile.cs new file mode 100644 index 0000000..f6a6adb --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/Maps/MapTile.cs @@ -0,0 +1,167 @@ +using System; +using System.Reflection.Metadata; +using Johnmagotchi.Core.tools; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using TibzGame.Core.Inputs; +using TibzGame.Core.ScreenManager; + +namespace Johnmagotchi.GameContent.Objects +{ + + public class MapTile + { + public static readonly int TILE_HEIGHT_PX = 32 * ScreenManager.BASE_ZOOM_LEVEL; + public static readonly int TILE_WIDTH_PX = 32 * ScreenManager.BASE_ZOOM_LEVEL; + + public TileType Type { get; set; } + + public TileSubType SubType { get; set; } + + public TileType NorthNeighborType; + public TileType SouthNeighborType; + public TileType EastNeighborType; + public TileType WestNeighborType; + + + private SpriteBatch spriteBatch; + private ScreenManager _screenManager; + + public int width; + public int height; + public int shadowOffset; + public bool facingLeft; + public float spriteRotation; + public SpriteEffects currentSpriteEffects; + Texture2D HighlightTexture; + Texture2D GrassTileTexture; + Texture2D SeaTileTexture; + + public TileHighlight tileHighlight; + public int highlightTimer; + public int highlightTimerDelay; + + public Effect attackTileEffect; + + public Texture2D currentTexture; + public MapTile() + { + this.Type = TileType.GRASS; + this.SubType = TileSubType.NONE; + } + public void Init(ScreenManager screenManager) + { + + _screenManager = screenManager; + spriteBatch = new SpriteBatch(screenManager.GraphicsDevice); + HighlightTexture = screenManager.contentRef.Load("Tiles/tile-highlight"); + GrassTileTexture = screenManager.contentRef.Load("Tiles/Grass/grass-1"); + SeaTileTexture= screenManager.contentRef.Load("Tiles/Sea/ocean"); + attackTileEffect = screenManager.contentRef.Load("Shaders/Tiles/AttackTileShader"); + updateCurrentTexture(); + tileHighlight = TileHighlight.NONE; + highlightTimer = 0; + highlightTimerDelay = 0; + } + public void Update() { + + } + + public void ChangeType(TileType newType) + { + this.Type = newType; + updateCurrentTexture(); + } + + public void NullNeighbors() + { + this.NorthNeighborType = TileType.NULL; + this.SouthNeighborType = TileType.NULL; + this.WestNeighborType = TileType.NULL; + this.EastNeighborType = TileType.NULL; + } + + public void SetTileHighlight(TileHighlight newState) + { + this.tileHighlight = newState; + } + + public void DrawAt(int posX, int posY) + { + // Tick Draw Timers + highlightTimerDelay++; + if (highlightTimerDelay > 2) + { + highlightTimerDelay = 0; + highlightTimer++; + } + if (highlightTimer >= 16) { highlightTimer = 0; } + + // Start Drawing + spriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointClamp); + + // all rectangles should do the scaling from world coordinates to screen coordinates + Rectangle tileRect = _screenManager.GetScaledRectangle(posX, posY, TILE_WIDTH_PX , TILE_HEIGHT_PX); + + + //TibzLog.Debug("Scaled xPos: {0}, yPos: {1}" , tileRect.X, tileRect.Y); + // Texture2D currentTexture; + + + spriteBatch.Draw( + currentTexture, tileRect, null, Color.White, 0, new Vector2(0, 0), + currentSpriteEffects, 1); + + spriteBatch.End(); + + // Draw Highlights + + if (tileHighlight == TileHighlight.NONE) + { + return; + } + if (tileHighlight == TileHighlight.MOVEMENT) + { + spriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointClamp); + + // all rectangles should do the scaling from world coordinates to screen coordinates + Rectangle highlightRect = _screenManager.GetScaledRectangle(posX, posY, TILE_WIDTH_PX, TILE_HEIGHT_PX); + Rectangle sourceRect = new Rectangle((40 * highlightTimer) + 1 ,1, 40, 40); + spriteBatch.Draw( + HighlightTexture, highlightRect, sourceRect, Color.White, 0, new Vector2(0, 0), + currentSpriteEffects, 1); + spriteBatch.End(); + } + if (tileHighlight == TileHighlight.ATTACK) + { + spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp); + //apply shader + attackTileEffect.CurrentTechnique.Passes[0].Apply(); + // all rectangles should do the scaling from world coordinates to screen coordinates + Rectangle highlightRect = _screenManager.GetScaledRectangle(posX, posY, TILE_WIDTH_PX, TILE_HEIGHT_PX); + Rectangle sourceRect = new Rectangle((40 * highlightTimer) + 1, 1, 40, 40); + spriteBatch.Draw( + HighlightTexture, highlightRect, sourceRect, Color.White, 0, new Vector2(0, 0), + currentSpriteEffects, 1); + spriteBatch.End(); + } + + } + + private void updateCurrentTexture() { + switch (this.Type) + { + case TileType.GRASS: + currentTexture = GrassTileTexture; + break; + case TileType.SEA: + currentTexture = SeaTileTexture; + break; + default: + currentTexture = GrassTileTexture; + break; + } + + } + } +} \ No newline at end of file diff --git a/Johnmagotchi/GameContent/Objects/Maps/TileTypeEnum.cs b/Johnmagotchi/GameContent/Objects/Maps/TileTypeEnum.cs new file mode 100644 index 0000000..fa32369 --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/Maps/TileTypeEnum.cs @@ -0,0 +1,25 @@ +public enum TileType { + GRASS, + ROAD, + RIVER, + MOUNTAIN, + SEA, + CITY, + HQ, + BASE, + SPECIAL, + NULL +} + +public enum TileSubType{ + NONE, + SNOW, + DAMAGED +} + +public enum TileHighlight { + NONE, + MOVEMENT, + ATTACK, + HEAL, +} \ No newline at end of file diff --git a/Johnmagotchi/GameContent/Objects/UI/MapCursor.cs b/Johnmagotchi/GameContent/Objects/UI/MapCursor.cs new file mode 100644 index 0000000..51b74ea --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/UI/MapCursor.cs @@ -0,0 +1,49 @@ +using System; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using TibzGame.Core.Inputs; +using TibzGame.Core.ScreenManager; + +namespace Johnmagotchi.GameContent.Objects +{ + + public class MapCursor + { + private readonly int CURSOR_SIZE = 40 * ScreenManager.BASE_ZOOM_LEVEL; + + private SpriteBatch spriteBatch; + private ScreenManager _screenManager; + + public SpriteEffects currentSpriteEffects; + Texture2D CursorTexture; + + public MapCursor() + { + + } + public void Init(ScreenManager screenManager) + { + _screenManager = screenManager; + spriteBatch = new SpriteBatch(screenManager.GraphicsDevice); + CursorTexture = screenManager.contentRef.Load("Map-UI/cursor"); + } + + public void Draw(int posX, int posY) + { + + spriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointClamp); + + // offset by 4 X base zoom + posX = posX - (4 * ScreenManager.BASE_ZOOM_LEVEL); + posY = posY - (4 * ScreenManager.BASE_ZOOM_LEVEL); + Rectangle tileRect = _screenManager.GetScaledRectangle(posX , posY, CURSOR_SIZE, CURSOR_SIZE); + + + spriteBatch.Draw( + CursorTexture, tileRect, null, Color.White, 0, new Vector2(0, 0), + currentSpriteEffects, 1); + + spriteBatch.End(); + } + } +} \ No newline at end of file diff --git a/Johnmagotchi/GameContent/Objects/UI/UnitDisplay.cs b/Johnmagotchi/GameContent/Objects/UI/UnitDisplay.cs new file mode 100644 index 0000000..d76187e --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/UI/UnitDisplay.cs @@ -0,0 +1,134 @@ +using Johnmagotchi.Core.tools; +using Johnmagotchi.GameContent.Units; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TibzGame.Core.ScreenManager; + +namespace Johnmagotchi.GameContent.Objects.UI +{ + public class UnitDisplay + { + private SpriteBatch spriteBatch; + private ScreenManager _screenManager; + public SpriteEffects currentSpriteEffects; + Texture2D UnitDisplayTexture; + Texture2D EnemyDisplayTexture; + Texture2D NpcDisplayTexture; + protected SpriteFont kemco; + protected SpriteFont pixsplit; + UnitObject HighlightedUnit; + + + Boolean showDisplay; + + private readonly int DISPLAY_WIDTH = 192 * ScreenManager.BASE_ZOOM_LEVEL; + private readonly int DISPLAY_HEIGHT = 96 * ScreenManager.BASE_ZOOM_LEVEL; + + public UnitDisplay() { + showDisplay = false; + } + public void Init(ScreenManager screenManager) + { + _screenManager = screenManager; + spriteBatch = new SpriteBatch(screenManager.GraphicsDevice); + UnitDisplayTexture = screenManager.contentRef.Load("Map-UI/unit-display-blue-lighter"); + EnemyDisplayTexture = screenManager.contentRef.Load("Map-UI/unit-display-red-lighter"); + NpcDisplayTexture = screenManager.contentRef.Load("Map-UI/unit-display-green-lighter"); + kemco = screenManager.contentRef.Load("Fonts/Kemco-20"); + pixsplit = screenManager.contentRef.Load("Fonts/PixelSplitter"); + + } + + public void Update(UnitObject unit) { + if (unit == null) { + showDisplay = false; + return; + } + else { + showDisplay = true; + HighlightedUnit = unit; + + } + } + + public void Draw(int cursorQuadrant) { + + if (showDisplay == false) { return; } + if (HighlightedUnit == null) { return; } + + Texture2D texture = UnitDisplayTexture; + if (HighlightedUnit.team == UnitObject.UnitTeam.ENEMY) + { + texture = EnemyDisplayTexture; + } + if (HighlightedUnit.team == UnitObject.UnitTeam.NPC) + { + texture = NpcDisplayTexture; + } + + // offset by 4 X base zoom + int posX = (int)Math.Round(.5 * (MapTile.TILE_WIDTH_PX)); + int posY = (int)Math.Round(.5 * (MapTile.TILE_HEIGHT_PX)); + + if (cursorQuadrant == 2 || cursorQuadrant == 3) + { + posX = _screenManager.GetScaledPixelScreenWidth() - DISPLAY_WIDTH- posX; + } + //------------------DRAW BACKGROUND------------------------------------ + spriteBatch.Begin(); + Rectangle tileRect = _screenManager.GetScaledRectangle(posX, posY, DISPLAY_WIDTH, DISPLAY_HEIGHT); + spriteBatch.Draw( + texture, tileRect, null, Color.White, 0, new Vector2(0, 0), + currentSpriteEffects, 1); + spriteBatch.End(); + + // -----------------DRAW TEXT ----------------------------------------- + posX += (int)Math.Round(.05 * DISPLAY_WIDTH); + posY += (15 * ScreenManager.BASE_ZOOM_LEVEL); + DrawText(posX, posY, HighlightedUnit.name); + posY += (15 * ScreenManager.BASE_ZOOM_LEVEL); + DrawText(posX, posY, HighlightedUnit.playerClassEnum.ToString()); + posX += (int)Math.Round(.05 * DISPLAY_WIDTH); + posY += (15 * ScreenManager.BASE_ZOOM_LEVEL); + string DisplayString = HighlightedUnit.currentStatus.CurrentHealth + " HP - " + HighlightedUnit.stats.MaxHealth + " MAX"; + DrawText(posX, posY, DisplayString); + } + + public void DrawText(int x, int y ,string textString) { + Vector2 textRotationOrigin = new Vector2(0, 0); + //Vector2 textRotationOrigin = kemco.MeasureString(HighlightedUnit.name); + //textRotationOrigin.X = textRotationOrigin.X / 2; + + x = _screenManager.getScaledIntX(x); + y = _screenManager.getScaledIntX(y); + Vector2 position = new Vector2(x, y); + + spriteBatch.Begin(); + + // the hackiest white outline of all time. + position = new Vector2(x + 2, y + 2); + spriteBatch.DrawString(kemco, textString, position, Color.White, 0, textRotationOrigin, 00.75f, SpriteEffects.None, 1.0f); + position = new Vector2(x - 2, y - 2); + spriteBatch.DrawString(kemco, textString, position, Color.White, 0, textRotationOrigin, 00.75f, SpriteEffects.None, 1.0f); + position = new Vector2(x + 2, y - 2); + spriteBatch.DrawString(kemco, textString, position, Color.White, 0, textRotationOrigin, 00.75f, SpriteEffects.None, 1.0f); + position = new Vector2(x - 2, y + 2); + spriteBatch.DrawString(kemco, textString, position, Color.White, 0, textRotationOrigin, 00.75f, SpriteEffects.None, 1.0f); + position = new Vector2(x + 2, y); + spriteBatch.DrawString(kemco, textString, position, Color.White, 0, textRotationOrigin, 00.75f, SpriteEffects.None, 1.0f); + position = new Vector2(x - 2, y); + spriteBatch.DrawString(kemco, textString, position, Color.White, 0, textRotationOrigin, 00.75f, SpriteEffects.None, 1.0f); + + // the actual text + position = new Vector2(x, y); + spriteBatch.DrawString(kemco, textString, position, Color.Black, 0, textRotationOrigin, 00.75f, SpriteEffects.None, 1.0f); + + spriteBatch.End(); + } + } +} diff --git a/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/AttackObj.cs b/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/AttackObj.cs new file mode 100644 index 0000000..23af51c --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/AttackObj.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Johnmagotchi.Data.BattleObjects.AttackDefines; + +namespace Johnmagotchi.GameContent.Objects.Units.BattleObjects +{ + public class AttackObj + { + + public int ID; + public string AttackName; + public int BaseDamage; + public int BaseHitCount; + public int BaseSpeed; + public int BaseAccuracy; + public int AttackRangeMin; + public int AttackRangeMax; + public AttackTypeEnum AttackType; + public SpecialAttackPropertiesEnum SpecialProperties; + + } +} diff --git a/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/BattleObjectManager.cs b/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/BattleObjectManager.cs new file mode 100644 index 0000000..b9cc9fc --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/BattleObjectManager.cs @@ -0,0 +1,250 @@ +using Johnmagotchi.Core.tools; +using Johnmagotchi.Data.BattleObjects; +using Johnmagotchi.GameContent.Units; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Johnmagotchi.Data.BattleObjects.SupportDefines; + +namespace Johnmagotchi.GameContent.Objects.Units.BattleObjects +{ + public class BattleObjectManager + { + + public static List AllAttacks; + public static List AllSupports; + public static List AllSkills; + + + + public static void LoadBattleObjects() + { + AllAttacks = LoadAttacks(); + AllSupports = LoadSupports(); + AllSkills = LoadSkills(); + + foreach (AttackObj atk in AllAttacks) + { + TibzLog.Debug(" ID: {0}, AttackName: {1}, Base Damamge: {2}, Base Hit Count: {3}, Base Speed: {4}," + + " Base Accuracy {5}, rangeMin: {6}, RangeMax: {7}, Attack Type: {8}, Special Properties {9} ", + atk.ID, atk.AttackName, atk.BaseDamage, atk.BaseHitCount, atk.BaseSpeed, atk.BaseAccuracy, atk.AttackRangeMin, atk.AttackRangeMax, atk.AttackType, atk.SpecialProperties); + } + + foreach (SupportObj support in AllSupports) + { + TibzLog.Debug(" ID: {0}, Name: {1}, Type:{2}, Target: {3}, Val: {4}, Desc: {5} ", support.ID, support.Name, support.type, support.target, support.Value, support.Description); + } + foreach (SkillObj skl in AllSkills) + { + TibzLog.Debug("ID: {0}, Name: {1}, Type: {2}, Val: {3}, Desc: {4} ", skl.ID, skl.SkillName, skl.SkillType, skl.Value, skl.Description); + } + + } + + public static List LoadAttacks() + { + List AttackList = new List(); + System.Console.WriteLine("PATH: {0}", Directory.GetCurrentDirectory()); + var path = "..\\..\\..\\Data\\BattleObjects\\AttackDefinitions.csv"; + System.Console.WriteLine("path: {0} ", path); + + // these let us resolve which column is which + int IDIndex = -1; + int AttackNameIndex = -1; + int BaseDamageIndex = -1; + int BaseHitCountIndex = -1; + int BaseSpeedIndex = -1; + int BaseAccuracyIndex = -1; + int AttackRangeMinIndex = -1; + int AttackRangeMaxIndex = -1; + int AttackTypeIndex = -1; + int SpecialPropertiesIndex = -1; + + bool AreColumnIndexesSet = false; + + using (var reader = new StreamReader(path)) + { + + while (!reader.EndOfStream) + { + var line = reader.ReadLine(); + var values = line.Split(','); + + if (AreColumnIndexesSet == false) + { + //These strings MUST match /GameContent/Data/UnitDefines.CSV + // That file MUST have these in the first row. + for (int i = 0; i < values.Length; i++) + { + + if (values[i].Trim() == "ID") { IDIndex = i; } + if (values[i].Trim() == "AttackName") { AttackNameIndex = i; } + if (values[i].Trim() == "BaseDamage") { BaseDamageIndex = i; } + if (values[i].Trim() == "BaseHitCount") { BaseHitCountIndex = i; } + if (values[i].Trim() == "BaseSpeed") { BaseSpeedIndex = i; } + if (values[i].Trim() == "BaseAccuracy") { BaseAccuracyIndex = i; } + if (values[i].Trim() == "AttackRangeMin") { AttackRangeMinIndex = i; } + if (values[i].Trim() == "AttackRangeMax") { AttackRangeMaxIndex = i; } + if (values[i].Trim() == "AttackType") { AttackTypeIndex = i; } + if (values[i].Trim() == "SpecialProperties") { SpecialPropertiesIndex = i; } + + } + AreColumnIndexesSet = true; + } + else + { + AttackObj attack = new AttackObj(); + + attack.ID = Int32.Parse(values[IDIndex]); + attack.AttackName = values[AttackNameIndex]; + attack.BaseDamage = Int32.Parse(values[BaseDamageIndex]); + attack.BaseHitCount = Int32.Parse(values[BaseHitCountIndex]); + attack.BaseSpeed = Int32.Parse(values[BaseSpeedIndex]); + attack.BaseAccuracy = Int32.Parse(values[BaseAccuracyIndex]); + attack.AttackRangeMin = Int32.Parse(values[AttackRangeMinIndex]); + attack.AttackRangeMax = Int32.Parse(values[AttackRangeMaxIndex]); + attack.AttackType = AttackDefines.ParseAttackTypes(values[AttackTypeIndex]); + attack.SpecialProperties = AttackDefines.ParseSpecialAttackProperties(values[SpecialPropertiesIndex]); + + AttackList.Add(attack); + } + } + } + return AttackList; + + } + + public static List LoadSkills() + { + List SkillList = new List(); + + System.Console.WriteLine("PATH: {0}", Directory.GetCurrentDirectory()); + var path = "..\\..\\..\\Data\\BattleObjects\\SkillDefinitions.csv"; + System.Console.WriteLine("path: {0} ", path); + + // ID,SkillName,SkillType,Value,Description + // these let us resolve which column is which + int IDIndex = -1; + int SkillNameIndex = -1; + int SkillTypeIndex = -1; + int ValueIndex = -1; + int DescriptionIndex = -1; + + + bool AreColumnIndexesSet = false; + + using (var reader = new StreamReader(path)) + { + + while (!reader.EndOfStream) + { + var line = reader.ReadLine(); + var values = line.Split(','); + + if (AreColumnIndexesSet == false) + { + //These strings MUST match /GameContent/Data/SkillDefinitions.CSV + // That file MUST have these in the first row. + for (int i = 0; i < values.Length; i++) + { + //ID,SkillName,SkillType,Value,Description + if (values[i].Trim() == "ID") { IDIndex = i; } + if (values[i].Trim() == "SkillName") { SkillNameIndex = i; } + if (values[i].Trim() == "SkillType") { SkillTypeIndex = i; } + if (values[i].Trim() == "Value") { ValueIndex = i; } + if (values[i].Trim() == "Description") { DescriptionIndex = i; } + + + } + AreColumnIndexesSet = true; + } + else + { + SkillObj skill = new SkillObj(); + + skill.ID = Int32.Parse(values[IDIndex]); + skill.SkillName = values[SkillNameIndex]; + skill.SkillType = SkillDefines.ParseSkillTypes(values[SkillTypeIndex]); + skill.Value = Int32.Parse(values[ValueIndex]); + skill.Description = values[DescriptionIndex]; + + SkillList.Add(skill); + } + } + } + return SkillList; + } + + public static List LoadSupports() + { + List SupportList = new List(); + + + System.Console.WriteLine("PATH: {0}", Directory.GetCurrentDirectory()); + var path = "..\\..\\..\\Data\\BattleObjects\\SupportDefinitions.csv"; + System.Console.WriteLine("path: {0} ", path); + + //ID,SupportName,SupportTarget,SupportType,Value,Description + // these let us resolve which column is which + int IDIndex = -1; + int SupportlNameIndex = -1; + int SupportTargetIndex = -1; + int SupportTypeIndex = -1; + int ValueIndex = -1; + int DescriptionIndex = -1; + + + bool AreColumnIndexesSet = false; + + using (var reader = new StreamReader(path)) + { + + while (!reader.EndOfStream) + { + var line = reader.ReadLine(); + var values = line.Split(','); + + if (AreColumnIndexesSet == false) + { + //These strings MUST match /GameContent/Data/SkillDefinitions.CSV + // That file MUST have these in the first row. + for (int i = 0; i < values.Length; i++) + { + + //ID,SupportName,SupportTarget,SupportType,Value,Description + if (values[i].Trim() == "ID") { IDIndex = i; } + if (values[i].Trim() == "SupportName") { SupportlNameIndex = i; } + if (values[i].Trim() == "SupportTarget") { SupportTargetIndex = i; } + if (values[i].Trim() == "SupportType") { SupportTypeIndex = i; } + if (values[i].Trim() == "Value") { ValueIndex = i; } + if (values[i].Trim() == "Description") { DescriptionIndex = i; } + + + } + AreColumnIndexesSet = true; + } + else + { + SupportObj support = new SupportObj(); + + support.ID = Int32.Parse(values[IDIndex]); + support.Name = values[SupportlNameIndex]; + support.type = SupportDefines.ParseSupportTypes(values[SupportTypeIndex]); + support.target = SupportDefines.ParseSupportTargets(values[SupportTargetIndex]); + support.Value = Int32.Parse(values[ValueIndex]); + support.Description = values[DescriptionIndex]; + + SupportList.Add(support); + } + } + } + + + return SupportList; + + } + } +} diff --git a/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/SkillObj.cs b/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/SkillObj.cs new file mode 100644 index 0000000..19caf99 --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/SkillObj.cs @@ -0,0 +1,18 @@ +using Johnmagotchi.Data.BattleObjects; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Johnmagotchi.GameContent.Objects.Units.BattleObjects +{ + public class SkillObj + { + public int ID; + public string SkillName; + public SkillDefines.SkillTypes SkillType; + public int Value; + public string Description; + } +} diff --git a/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/SupportObj.cs b/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/SupportObj.cs new file mode 100644 index 0000000..131cbd3 --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/SupportObj.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Johnmagotchi.Data.BattleObjects.SupportDefines; + +namespace Johnmagotchi.GameContent.Objects.Units.BattleObjects +{ + public class SupportObj + { + + //ID,SupportName,SupportTarget,SupportType,Value,Description + public int ID; + public string Name; + public SupportTarget target; + public SupportType type; + public int Value; + public string Description; + } +} diff --git a/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/UnitCurrentStatus.cs b/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/UnitCurrentStatus.cs new file mode 100644 index 0000000..4b95463 --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/UnitCurrentStatus.cs @@ -0,0 +1,52 @@ +using Johnmagotchi.Core.tools; +using Johnmagotchi.GameContent.Units; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Threading.Tasks; + +namespace Johnmagotchi.GameContent.Objects.Units.BattleObjects +{ + public class UnitCurrentStatus + { + private readonly UnitStatBlock StatBlock; + public int CurrentHealth { set; get; } + public int CurrentShieldCount { set; get; } + + public bool isTurnOver { set; get; } + + public UnitTeam team { set; get; } + + + // This Constructor is used when init-ing a player object + public UnitCurrentStatus(UnitStatBlock stats) { + StatBlock = stats; + CurrentHealth = StatBlock.MaxHealth; + CurrentShieldCount = 0; + } + + // This Constructor is used when deserializing a unit + [JsonConstructor] + public UnitCurrentStatus(int CurrentHealth, int CurrentShieldCount) { + this.CurrentHealth = CurrentHealth; + this.CurrentShieldCount = CurrentShieldCount; + } + + public void setFromSerialized(UnitObject temp, string data) { + + UnitCurrentStatus parsedData = JsonSerializer.Deserialize(data); + temp.currentStatus.CurrentHealth = parsedData.CurrentHealth;// Update current stats + CurrentShieldCount = 0; + TibzLog.Debug("HP on deserialized: " + parsedData.CurrentHealth); + } + public enum UnitTeam + { + PLAYER, + ENEMY, + NPC + } + } +} diff --git a/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/UnitStatBlock.cs b/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/UnitStatBlock.cs new file mode 100644 index 0000000..ad32fce --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/UglyUnits/BattleObjects/UnitStatBlock.cs @@ -0,0 +1,43 @@ +namespace Johnmagotchi.GameContent.Objects.Units.BattleObjects +{ + public class UnitStatBlock{ + + public string Name { get; set; } + public int MaxHealth {get; set;} + public int Attack {get; set;} + public int Defense {get; set;} + public int Speed {get; set;} + public int Movement { get; set;} + + public MovementType movementType {get; set;} + + public enum MovementType { + FOOT, + WHEELS, + HORSE, + FLYING, + } + + public void setMovementTypeFromFile(string inStr) { + switch (inStr) { + case "FOOT": + movementType = MovementType.FOOT; + return; + case "WHEELS": + movementType= MovementType.WHEELS; + return; + case "HORSE": + movementType = MovementType.HORSE; + return; + case "FLYING": + case "FLYER": + movementType = MovementType.FLYING; + return; + } + + + } + } + + +} \ No newline at end of file diff --git a/Johnmagotchi/GameContent/Objects/UglyUnits/Loadouts/LoadoutModule.cs b/Johnmagotchi/GameContent/Objects/UglyUnits/Loadouts/LoadoutModule.cs new file mode 100644 index 0000000..74e0718 --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/UglyUnits/Loadouts/LoadoutModule.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Johnmagotchi.GameContent.Objects.Units.Loadouts +{ + public class LoadoutModule + { + // This is going to be each little square module in the character customizer + + enum ModuleType { + ATTACK, + ACTIVE_SUPPORT, + PASSIVE_SUPPORT, + STAT_BOOST, + BATTLE_EFFECT + } + + public enum ModuleShape { + SINGLE, + DOUBLE, + TRIPLE_STRAIGHT, + TRIPLE_L, + TETRI_O, + TETRI_I, + TETRI_S, + TETRI_Z, + TETRI_L, + TETRI_J, + TETRI_T, + } + + public enum ShapeOrientation { + NORTH, SOUTH, WEST, EAST + } + + public int activationCost; + public int secondaryActivationCost; + public string ModuleName; + public ModuleShape Shape; + public ShapeOrientation orientation; + + /* + RR - Armor Knight + RB - Mercenary/Axe Fighter + RY - Grappler + RG - Big Shield Bro + RP - Flamethrower Enthusiast + + BB - True Generic Helldiver + BY - call out weakpoints + BG - Arc Weapon Sprayer + BP - Grenadier + + YY - Theif/Assassin + YG - Behind Enemy Lines + YP - Master of Traps + + GG - True Staff User + GP - Aes Sedai + + PP - Elemental Mage + + */ + + } +} diff --git a/Johnmagotchi/GameContent/Objects/UglyUnits/Loadouts/PlayerClasses/PlayerClass.cs b/Johnmagotchi/GameContent/Objects/UglyUnits/Loadouts/PlayerClasses/PlayerClass.cs new file mode 100644 index 0000000..07eae44 --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/UglyUnits/Loadouts/PlayerClasses/PlayerClass.cs @@ -0,0 +1,181 @@ +using Johnmagotchi.Core.tools; +using Johnmagotchi.GameContent.Objects.Units.BattleObjects; +using Johnmagotchi.GameContent.Objects.Units.Loadouts; +using System.Collections.Generic; +using System.Linq; + +namespace Johnmagotchi.GameContent.Objects.Units.Loadouts.PlayerClasses +{ + public class PlayerClass + { + // Class contains a loadout, and default attacks/supports/skills + enum ModuleColor + { + RED, + BLUE, + YELLOW, + GREEN, + PURPLE, + COLORLESS + } + + public enum PlayerClassType + { + CL_COMMONER = 0, + RR_KNIGHT, //Red 1 + RB_MERC, + RY_GRAPPLER, + RG_SHIELD, + RP_PYRO, + BB_HECK_DIVER, //Blue 6 + BY_SPECIALIST, + BG_ORORO_MUNROE, + BP_GRENADIER, + YY_ASSASSIN, //Yellow 10 + YG_SPY, + YP_SURVIVALIST, + GG_HEALER, //Green 13 + GP_MOIRAINE_HERSELF, + PP_ELEMENTALIST, //Purple 15 + + } + + UnitLoadout UnitLoadout { get; set; } + PlayerClassType ClassType { get; set; } + + + ModuleColor PrimaryColor; + ModuleColor SecondaryColor; + + public List ClassAttacks; // default for the class + public List ClassSupports; // default + public List ClassSkills; // default + + public UnitStatBlock StatBoosts; // This is a unit stat block that will be added? to the base stats of a unit. + + List defaultAttackIds; + List defaultSupportIds; + List defaultSkillIds; + + + + public PlayerClass(PlayerClassType type) { + ClassType = type; + + ClassAttacks = new List(); + ClassSupports = new List(); + ClassSkills = new List(); + StatBoosts = new UnitStatBlock(); + + InitClassSpecificFields(); + + } + public void SetAndInitLoadout( UnitLoadout loadout) { + UnitLoadout = loadout; + ClassAttacks.Clear(); + ClassSupports.Clear(); + ClassSkills.Clear(); + InitClassSpecificFields(); // grab attacks again + ClassAttacks = ClassAttacks.Concat(loadout.AvailableAttacks).ToList(); + ClassSupports = ClassSupports.Concat(loadout.AvailableSupports).ToList(); + ClassSkills = ClassSkills.Concat(loadout.ActiveSkills).ToList(); + } + + private void InitClassSpecificFields() { + + switch (ClassType) { + case PlayerClassType.RR_KNIGHT: + PrimaryColor = ModuleColor.RED; SecondaryColor = ModuleColor.RED; + break; + case PlayerClassType.RB_MERC: + PrimaryColor = ModuleColor.RED; SecondaryColor = ModuleColor.BLUE; + break; + case PlayerClassType.RY_GRAPPLER: + PrimaryColor = ModuleColor.RED; SecondaryColor = ModuleColor.YELLOW; + break; + case PlayerClassType.RG_SHIELD: + PrimaryColor = ModuleColor.RED; SecondaryColor = ModuleColor.GREEN; + break; + case PlayerClassType.RP_PYRO: + PrimaryColor = ModuleColor.RED; SecondaryColor = ModuleColor.PURPLE; + break; + case PlayerClassType.BB_HECK_DIVER: + PrimaryColor = ModuleColor.BLUE; SecondaryColor = ModuleColor.BLUE; + break; + case PlayerClassType.BY_SPECIALIST: + PrimaryColor = ModuleColor.BLUE; SecondaryColor = ModuleColor.YELLOW; + break; + case PlayerClassType.BG_ORORO_MUNROE: + PrimaryColor = ModuleColor.BLUE; SecondaryColor = ModuleColor.GREEN; + break; + case PlayerClassType.BP_GRENADIER: + PrimaryColor = ModuleColor.BLUE; SecondaryColor = ModuleColor.PURPLE; + break; + case PlayerClassType.YY_ASSASSIN: + PrimaryColor = ModuleColor.YELLOW; SecondaryColor = ModuleColor.YELLOW; + break; + case PlayerClassType.YG_SPY: + PrimaryColor = ModuleColor.YELLOW; SecondaryColor = ModuleColor.GREEN; + break; + case PlayerClassType.YP_SURVIVALIST: + PrimaryColor = ModuleColor.YELLOW; SecondaryColor = ModuleColor.PURPLE; + break; + case PlayerClassType.GG_HEALER: + PrimaryColor = ModuleColor.GREEN; SecondaryColor = ModuleColor.GREEN; + break; + case PlayerClassType.GP_MOIRAINE_HERSELF: + PrimaryColor = ModuleColor.GREEN; SecondaryColor = ModuleColor.PURPLE; + break; + case PlayerClassType.PP_ELEMENTALIST: + PrimaryColor = ModuleColor.PURPLE; SecondaryColor = ModuleColor.PURPLE; + break; + case PlayerClassType.CL_COMMONER: + TibzLog.Debug("Commoner built"); + PrimaryColor = ModuleColor.COLORLESS; SecondaryColor = ModuleColor.COLORLESS; + break; + + + } + } + public static PlayerClassType GetClassFromShortHand(string shorthand) { + shorthand = shorthand.ToLower(); + switch (shorthand) { + case "rr": + return PlayerClassType.RR_KNIGHT; + case "rb": + return PlayerClassType.RB_MERC; + case "ry": + return PlayerClassType.RY_GRAPPLER; + case "rg": + return PlayerClassType.RG_SHIELD; + case "rp": + return PlayerClassType.RP_PYRO; + case "bb": + return PlayerClassType.BB_HECK_DIVER; + case "by": + return PlayerClassType.BY_SPECIALIST; + case "bg": + return PlayerClassType.BG_ORORO_MUNROE; + case "bp": + return PlayerClassType.BP_GRENADIER; + case "yy": + return PlayerClassType.YY_ASSASSIN; + case "yg": + return PlayerClassType.YG_SPY; + case "yp": + return PlayerClassType.YP_SURVIVALIST; + case "gg": + return PlayerClassType.GG_HEALER; + case "gp": + return PlayerClassType.GP_MOIRAINE_HERSELF; + case "pp": + return PlayerClassType.PP_ELEMENTALIST; + default: + return PlayerClassType.CL_COMMONER; + } + + } + } + +} + diff --git a/Johnmagotchi/GameContent/Objects/UglyUnits/Loadouts/UnitLoadout.cs b/Johnmagotchi/GameContent/Objects/UglyUnits/Loadouts/UnitLoadout.cs new file mode 100644 index 0000000..4dc9f01 --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/UglyUnits/Loadouts/UnitLoadout.cs @@ -0,0 +1,107 @@ +using Johnmagotchi.Core.tools; +using Johnmagotchi.GameContent.Objects.Units.BattleObjects; +using Johnmagotchi.GameContent.Objects.Units.Loadouts.PlayerClasses; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json.Serialization; +using System.Threading.Tasks; +using static Johnmagotchi.GameContent.Objects.Units.Loadouts.PlayerClasses.PlayerClass; + +namespace Johnmagotchi.GameContent.Objects.Units.Loadouts +{ + public class UnitLoadout + { + // this class is going to be a summary of both the player's class and thier currently added loadout modules. + // this should effectively be a layer between the character's stats/ablities and the battle system. + + public int playerClassID { get; set; } + public string ModuleIDsCSV { get; set;} // csv list of all Aptitude Grid :TM: modules by ID + public string AvailibleAttackIDsCSV { get; set; } // csv list of all attacks from class + Modules + public string AvailaibeSupportIDsCSV { get; set; } // csv list of all supports from class + Modules + public string ActiveSkillsIDsCSV { get; set; } // csv list of all Skills from class + modules + + public PlayerClass PlayerClass; + + // These get instatiated from the csv save of the loadout + public List Modules; + public List AvailableAttacks; + public List AvailableSupports; + public List ActiveSkills; + + public UnitLoadout(PlayerClassType pclass) { + PlayerClass = new PlayerClass(pclass); + AvailableAttacks = new List(); + AvailableSupports = new List(); + ActiveSkills = new List(); + AvailableAttacks.Concat(PlayerClass.ClassAttacks); + AvailableSupports.Concat(PlayerClass.ClassSupports); + ActiveSkills.Concat(PlayerClass.ClassSkills); + + //TODO - get from module + + } + // This Constructor is used when deserializing a unit + [JsonConstructor] + public UnitLoadout( + int playerClassID, + string ModuleIDsCSV, + string AvailibleAttackIDsCSV, + string AvailaibeSupportIDsCSV, + string ActiveSkillsIDsCSV + ) { + this.playerClassID = playerClassID; + this.ModuleIDsCSV = ModuleIDsCSV; + this.AvailibleAttackIDsCSV = AvailibleAttackIDsCSV; + this.AvailaibeSupportIDsCSV = AvailaibeSupportIDsCSV; + this.ActiveSkillsIDsCSV = ActiveSkillsIDsCSV; + // this.loadAllFromCSV(); + } + + public void loadAllFromCSV() { + + int[] atkIds = Array.ConvertAll(AvailibleAttackIDsCSV.Split(','), int.Parse); + int[] sprtIds = Array.ConvertAll(AvailaibeSupportIDsCSV.Split(','), int.Parse); + int[] sklIds = Array.ConvertAll(ActiveSkillsIDsCSV.Split(','), int.Parse); + + foreach (var attackID in atkIds) + { + foreach (var attackobj in BattleObjectManager.AllAttacks) { + if (attackID == attackobj.ID) { + AvailableAttacks.Add(attackobj); + } + } + } + foreach (var supportID in sprtIds) + { + foreach (var supportobj in BattleObjectManager.AllSupports) + { + if (supportID == supportobj.ID) + { + AvailableSupports.Add(supportobj); + } + } + } + foreach (var skillID in sklIds) + { + foreach (var skillobj in BattleObjectManager.AllSkills) + { + if (skillID == skillobj.ID) + { + ActiveSkills.Add(skillobj); + } + } + } + TibzLog.Debug("Loadout initialized"); + TibzLog.Debug(AvailableAttacks); + + } + public void saveAllToCSV() { + + AvailibleAttackIDsCSV = String.Join(",", AvailableAttacks.Select(atk => atk.ID).ToArray()); + AvailaibeSupportIDsCSV = String.Join(",", AvailableSupports.Select(spt => spt.ID).ToArray()); + ActiveSkillsIDsCSV = String.Join(",", ActiveSkills.Select(skill => skill.ID).ToArray()); + } + } +} diff --git a/Johnmagotchi/GameContent/Objects/UglyUnits/Loadouts/UnitLoadoutManager.cs b/Johnmagotchi/GameContent/Objects/UglyUnits/Loadouts/UnitLoadoutManager.cs new file mode 100644 index 0000000..626c268 --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/UglyUnits/Loadouts/UnitLoadoutManager.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Johnmagotchi.GameContent.Objects.Units.Loadouts +{ + internal class UnitLoadoutManager + { + } +} diff --git a/Johnmagotchi/GameContent/Objects/UglyUnits/UnitLoader.cs b/Johnmagotchi/GameContent/Objects/UglyUnits/UnitLoader.cs new file mode 100644 index 0000000..65fb631 --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/UglyUnits/UnitLoader.cs @@ -0,0 +1,125 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Diagnostics; +using Johnmagotchi.Core.tools; +using System.Collections; +using System.Net.Http.Headers; +using static Johnmagotchi.GameContent.Objects.Units.BattleObjects.UnitStatBlock; +using Johnmagotchi.GameContent.Objects.Units.Loadouts.PlayerClasses; + +namespace Johnmagotchi.GameContent.Units +{ + public class UnitLoader + { + public static List GetTest(){ + // MAC OS also prly Linux - var path = Path.Combine(Directory.GetCurrentDirectory(), "GameContent/Objects/Units/UnitDefines.csv"); + + //System.Console.WriteLine("PATH: {0}", Directory.GetCurrentDirectory()); + //var path = "..\\..\\..\\GameContent\\Objects\\Units\\UnitDefines.csv"; + List listA = new List(); + //List listB = new List(); + //System.Console.WriteLine("path: {0} ", path); + //using(var reader = new StreamReader(path)) + //{ + + // while (!reader.EndOfStream) + // { + // var line = reader.ReadLine(); + // var values = line.Split(','); + + // listA.Add(values[0]); + // listB.Add(values[1]); + + // } + //} + return listA; + } + public static List LoadBaseUnits(){ + List unitList = new List(); + System.Console.WriteLine("PATH: {0}", Directory.GetCurrentDirectory()); + var path = "..\\..\\..\\Data\\BattleObjects\\UnitDefinitions.csv"; + List listA = new List(); + List listB = new List(); + System.Console.WriteLine("path: {0} ", path); + + // these let us resolve which column is which + int IdIndex = -1; + int NameIndex = -1; + int ClassIndex = -1; + int isUniqueIndex = -1; + int HealthIndex = -1; + int AttackIndex = -1; + int DefenseIndex = -1; + int SpeedIndex = -1; + int MovementIndex = -1; + int MovementTypeIndex = -1; + + bool AreColumnIndexesSet = false; + + using (var reader = new StreamReader(path)) + { + + while (!reader.EndOfStream) + { + var line = reader.ReadLine(); + var values = line.Split(','); + + if (AreColumnIndexesSet == false) + { + //These strings MUST match /GameContent/Data/UnitDefines.CSV + // That file MUST have these in the first row. + for (int i = 0; i < values.Length; i++) { + + if (values[i].Trim() == "ID") { IdIndex = i; } + if (values[i].Trim() == "NAME") { NameIndex = i; } + if (values[i].Trim() == "CLASS") { ClassIndex = i; } + if (values[i].Trim() == "IS_UNIQUE") { isUniqueIndex = i; } + if (values[i].Trim() == "HEALTH") { HealthIndex = i; } + if (values[i].Trim() == "ATTACK") { AttackIndex = i; } + if (values[i].Trim() == "DEFENSE") { DefenseIndex = i; } + if (values[i].Trim() == "SPEED") { SpeedIndex = i; } + if (values[i].Trim() == "MOVEMENT") { MovementIndex = i; } + if (values[i].Trim() == "MOVEMENT_TYPE") { MovementTypeIndex = i; } + + + } + AreColumnIndexesSet = true; + } + else { + UnitObject unit = new UnitObject(); + unit.id = Int32.Parse(values[IdIndex]); + unit.name = values[NameIndex]; + unit.playerClassEnum = PlayerClass.GetClassFromShortHand(values[ClassIndex]); + unit.isUnique = ( values[isUniqueIndex].ToLower() == "true"); + unit.stats.MaxHealth = Int32.Parse(values[HealthIndex]); + unit.stats.Attack = Int32.Parse(values[AttackIndex]); + unit.stats.Defense = Int32.Parse(values[DefenseIndex]); + unit.stats.Speed = Int32.Parse(values[SpeedIndex]); + unit.stats.Movement = Int32.Parse(values[MovementIndex]); + unit.stats.setMovementTypeFromFile(values[MovementTypeIndex]); + + + + switch (unit.id){ + case 0: + // Add texture + break; + case 1: + //add texture + break; + case 2: + break; + // add texture + default: + break; + } + + unitList.Add(unit); + } + } + } + return unitList; + } + } +} \ No newline at end of file diff --git a/Johnmagotchi/GameContent/Objects/UglyUnits/UnitObject.cs b/Johnmagotchi/GameContent/Objects/UglyUnits/UnitObject.cs new file mode 100644 index 0000000..76f36a5 --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/UglyUnits/UnitObject.cs @@ -0,0 +1,226 @@ + + + +using Johnmagotchi.Core.tools; +using Johnmagotchi.GameContent.Objects; +using Johnmagotchi.GameContent.Objects.Units.BattleObjects; +using Johnmagotchi.GameContent.Objects.Units.Loadouts; +using Johnmagotchi.GameContent.Objects.Units.Loadouts.PlayerClasses; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using System.Collections.Generic; +using System.ComponentModel; +using System.Security.Cryptography.X509Certificates; +using System.Text.Json; +using System.Text.Json.Serialization; +using TibzGame.Core.ScreenManager; +using static Johnmagotchi.GameContent.Objects.Units.Loadouts.PlayerClasses.PlayerClass; + +namespace Johnmagotchi.GameContent.Units +{ + /// + /// TO DO -- THIS SHOULD BE DELETED AFTER REFACTOR TO *BASE UNIT* + /// + public class UnitObject{ + //defined stats + public int internalID; // used to reference this object internally + public int id { get; set; } // used to reference this unit as "Byleth" or "Marth" or whatever, you know? + public string name { get; set; } + + + // REMOVING TEMPORARILY + public UnitStatBlock stats { set; get; } + public UnitCurrentStatus currentStatus { get; set; } + public bool isUnique { set; get; } + public UnitTeam team { set; get; } + public PlayerClassType playerClassEnum { get; set; } + + // Stats for battle screens + + public bool isTurnOver { set; get; } + // public statusEnum status {get;set;} + public int xPos { set; get; } + public int yPos { set; get; } + + PlayerClass playerClassInstance; + public UnitLoadout UnitLoadout { get; set; } + + public string serializedUnitLoadout { get; set;} + +// ------------------------------------------------------------------------------------------------------------- + + + + //drawing and state management + public SpriteShaderSets shaderSet; + public Texture2D sprite; + private Effect TurnEndedEffect; + + private SpriteBatch spriteBatch; + private ScreenManager _screenManager; + private bool IsInit; + + // DEBUG VARS + // this needs to be expanded for attacks/ items eventually, does not need saved atm + public int DirectAttackRangeMin = 2; + public int DirectAttackRangeMax = 4; + public int IndirectAttackRangeMin; + public int IndirectAttackRangeMax; + + + public enum UnitTeam + { + PLAYER, + ENEMY, + NPC + } + public enum SpriteShaderSets { + PLAYER_NORMAL, + ENEMY_NORMAL, + NPC_NORMAL + } + + + public UnitObject(){ + IsInit = false; + xPos = 0; + yPos = 0; + stats = new UnitStatBlock(); + currentStatus = new UnitCurrentStatus(stats); + // playerClassInstance = new PlayerClass(playerClassEnum); + + } + + public UnitObject(UnitObject template) { + IsInit = false; + CopyFromTemplate(template); + isTurnOver = false; + playerClassInstance = new PlayerClass(playerClassEnum); + UnitLoadout = new UnitLoadout(playerClassEnum); + currentStatus = new UnitCurrentStatus(stats); + + } + + + public UnitObject(string serializedData) + { + IsInit = false; + SetFromSerialized(serializedData); + + //this.currentStatus = new UnitCurrentStatus(stats); + this.UnitLoadout = new UnitLoadout(playerClassEnum); + + } + + public string GetAsSerialized() + { + string json = JsonSerializer.Serialize(this); + return json; + } + + public void SetFromSerialized(string data) + { + UnitObject temp = JsonSerializer.Deserialize(data); + CopyFromTemplate(temp); // get base stats + isTurnOver = temp.isTurnOver; + return ; + } + + + public void setTeam(UnitTeam team) + { + this.team = team; + this.ReinitSprite(); + } + + public void SetShaderSet(SpriteShaderSets inSet) { + shaderSet = inSet; + } + + public void InitSprite(ScreenManager screenManager, UnitTeam team) { + _screenManager = screenManager; + spriteBatch = new SpriteBatch(screenManager.GraphicsDevice); + this.team = team; + string path = getSpriteTexturePath(); + sprite = screenManager.contentRef.Load(path); + this.internalID = screenManager.getUnitId(); + TurnEndedEffect = screenManager.contentRef.Load("Shaders/Units/UnitTurnEnded_S"); + IsInit = true; + + } + + public void ReinitSprite() + { + spriteBatch = new SpriteBatch(_screenManager.GraphicsDevice); + string path = getSpriteTexturePath(); + sprite = _screenManager.contentRef.Load(path); + IsInit = true; + } + + public void Update() { + + + } + + public void CopyFromTemplate(UnitObject template) + { + this.id = template.id; + this.name = template.name; + this.stats = template.stats; + this.xPos = template.xPos; + this.yPos = template.yPos; + this.isUnique = template.isUnique; + this.playerClassEnum = template.playerClassEnum; + this.currentStatus = template.currentStatus; + + //this.sprite = template.sprite; + } + + public void DrawAt( int x, int y) { + if (IsInit == false) return; + + SpriteEffects effects = getSpriteShaderEffects(shaderSet); + spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp); + + // all rectangles should do the scaling from world coordinates to screen coordinates + Rectangle rect = _screenManager.GetScaledRectangle(x, y, MapTile.TILE_WIDTH_PX, MapTile.TILE_HEIGHT_PX); + + //TibzLog.Debug("Scaled xPos: {0}, yPos: {1}" , tileRect.X, tileRect.Y); + // Texture2D currentTexture; + + if (isTurnOver) { + //apply shader + TurnEndedEffect.CurrentTechnique.Passes[0].Apply(); + } + + spriteBatch.Draw( + sprite, rect, null, Color.White, 0, new Vector2(0, 0), + effects, 1); + + spriteBatch.End(); + } + + + private SpriteEffects getSpriteShaderEffects(SpriteShaderSets shaderEnum) { + + return SpriteEffects.None; + + } + public string getSpriteTexturePath() + { + if (team == UnitTeam.PLAYER) + { + return "Units/unit-test"; + } + if (team == UnitTeam.ENEMY) + { + return "Units/unit-test-enemy"; + } + if (team == UnitTeam.NPC) + { + return "Units/unit-test-npc"; + } + return "Units/unit-test"; + } + } +} \ No newline at end of file diff --git a/Johnmagotchi/GameContent/Objects/Units/GameLogic/BaseUnitGameObject.cs b/Johnmagotchi/GameContent/Objects/Units/GameLogic/BaseUnitGameObject.cs new file mode 100644 index 0000000..ad9781b --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/Units/GameLogic/BaseUnitGameObject.cs @@ -0,0 +1,165 @@ +using Johnmagotchi.GameContent.Objects.Units.BattleObjects; +using Johnmagotchi.GameContent.Objects.Units.Loadouts; +using Johnmagotchi.GameContent.Objects.Units.Loadouts.PlayerClasses; +using Johnmagotchi.GameContent.Objects.Units.Stats; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; +using TibzGame.Core.ScreenManager; +using static Johnmagotchi.GameContent.Objects.Units.BattleObjects.UnitCurrentStatus; +using static Johnmagotchi.GameContent.Objects.Units.Loadouts.PlayerClasses.PlayerClass; + +namespace Johnmagotchi.GameContent.Objects.Units.GameLogic +{ + internal abstract class BaseUnitGameObject + { + + //defined stats + public int internalID; // used to reference this object internally + public int id { get; set; } // used to reference this unit as "Byleth" or "Marth" or whatever, you know? + public string name { get; set; } + + private UnitStats stats; + + public PlayerClassType playerClassEnum { get; set; } + + // public statusEnum status {get;set;} + public int xPos { set; get; } + public int yPos { set; get; } + + + // ------------------------------------------------------------------------------------------------------------- + + + + //drawing and state management + public SpriteShaderSets shaderSet; + public Texture2D sprite; + private Effect TurnEndedEffect; + + private SpriteBatch spriteBatch; + private ScreenManager _screenManager; + private bool IsInit; + private bool hasStats; + + + + + public enum SpriteShaderSets + { + PLAYER_NORMAL, + ENEMY_NORMAL, + NPC_NORMAL + } + + + public BaseUnitGameObject() + { + IsInit = false; + hasStats = false; + xPos = 0; + yPos = 0; + } + + public void SetStats(UnitStats newStats) + { + stats = newStats; + hasStats = true; + } + public string GetAsSerialized() + { + string json = JsonSerializer.Serialize(this); + return json; + } + + + + public void SetShaderSet(SpriteShaderSets inSet) + { + shaderSet = inSet; + } + + public void InitSprite(ScreenManager screenManager) + { + _screenManager = screenManager; + spriteBatch = new SpriteBatch(screenManager.GraphicsDevice); + string path = getSpriteTexturePath(); + sprite = screenManager.contentRef.Load(path); + this.internalID = screenManager.getUnitId(); + TurnEndedEffect = screenManager.contentRef.Load("Shaders/Units/UnitTurnEnded_S"); + IsInit = true; + + } + + public void ReinitSprite() + { + spriteBatch = new SpriteBatch(_screenManager.GraphicsDevice); + string path = getSpriteTexturePath(); + sprite = _screenManager.contentRef.Load(path); + IsInit = true; + } + + public void Update() + { + + + } + + public void DrawAt(int x, int y) + { + if (IsInit == false) return; + if (hasStats == false) return; + + SpriteEffects effects = getSpriteShaderEffects(shaderSet); + spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp); + + // all rectangles should do the scaling from world coordinates to screen coordinates + Rectangle rect = _screenManager.GetScaledRectangle(x, y, MapTile.TILE_WIDTH_PX, MapTile.TILE_HEIGHT_PX); + + //TibzLog.Debug("Scaled xPos: {0}, yPos: {1}" , tileRect.X, tileRect.Y); + // Texture2D currentTexture; + + if (stats.status.isTurnOver) + { + //apply shader + TurnEndedEffect.CurrentTechnique.Passes[0].Apply(); + } + + spriteBatch.Draw( + sprite, rect, null, Color.White, 0, new Vector2(0, 0), + effects, 1); + + spriteBatch.End(); + } + + + private SpriteEffects getSpriteShaderEffects(SpriteShaderSets shaderEnum) + { + + return SpriteEffects.None; + + } + public string getSpriteTexturePath() + { + UnitTeam team = stats.status.team; + if (team == UnitTeam.PLAYER) + { + return "Units/unit-test"; + } + if (team == UnitTeam.ENEMY) + { + return "Units/unit-test-enemy"; + } + if (team == UnitTeam.NPC) + { + return "Units/unit-test-npc"; + } + return "Units/unit-test"; + } + } + } diff --git a/Johnmagotchi/GameContent/Objects/Units/Stats/UnitStats.cs b/Johnmagotchi/GameContent/Objects/Units/Stats/UnitStats.cs new file mode 100644 index 0000000..a66130f --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/Units/Stats/UnitStats.cs @@ -0,0 +1,43 @@ +using Johnmagotchi.GameContent.Objects.Units.BattleObjects; +using Johnmagotchi.GameContent.Objects.Units.Loadouts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using static Johnmagotchi.GameContent.Objects.Units.Loadouts.PlayerClasses.PlayerClass; + +namespace Johnmagotchi.GameContent.Objects.Units.Stats +{ + internal class UnitStats + { + internal UnitStatBlock statblock; + internal UnitCurrentStatus status; + internal UnitLoadout loadout; + internal PlayerClassType classId; + + public UnitStats() + { + // Default Stats + classId = PlayerClassType.CL_COMMONER; + statblock = new UnitStatBlock(); + status = new UnitCurrentStatus(statblock); + loadout = new UnitLoadout(classId); + } + + // Deserializes Stats + public UnitStats(string serializedStatData) { + + + + + } + + //Returns This Unit's stats as a serialized String. + public string getAsSerialized() { + + return ""; + } + + } +} diff --git a/Johnmagotchi/GameContent/Objects/Units/Unit.cs b/Johnmagotchi/GameContent/Objects/Units/Unit.cs new file mode 100644 index 0000000..8802f92 --- /dev/null +++ b/Johnmagotchi/GameContent/Objects/Units/Unit.cs @@ -0,0 +1,42 @@ +using Johnmagotchi.GameContent.Objects.Units.GameLogic; +using Johnmagotchi.GameContent.Objects.Units.Loadouts; +using Johnmagotchi.GameContent.Objects.Units.Stats; +using Johnmagotchi.GameContent.Units; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Transactions; + +namespace Johnmagotchi.GameContent.Objects.Units +{ + internal class Unit : BaseUnitGameObject + { + + internal UnitStats stats; + + public Unit() + { + SetStats(new UnitStats()); + } + public Unit(Unit template) + { + SetStats(template.GetStats()); + } + public Unit(string serializeStatdData) + { + SetStats(LoadStatsFromSerialized(serializeStatdData)); + } + + public UnitStats GetStats() + { + return stats; + } + public UnitStats LoadStatsFromSerialized(string data) + { + + return new UnitStats(); + } + } +} diff --git a/Johnmagotchi/GameContent/Objects/Units/image.png b/Johnmagotchi/GameContent/Objects/Units/image.png new file mode 100644 index 0000000..94ef5e7 Binary files /dev/null and b/Johnmagotchi/GameContent/Objects/Units/image.png differ diff --git a/Johnmagotchi/GameContent/Screens/MapScreens/BaseMapScreen.cs b/Johnmagotchi/GameContent/Screens/MapScreens/BaseMapScreen.cs new file mode 100644 index 0000000..7e62815 --- /dev/null +++ b/Johnmagotchi/GameContent/Screens/MapScreens/BaseMapScreen.cs @@ -0,0 +1,437 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TibzGame.Core.Inputs; +using TibzGame.Core.ScreenManager; +using Johnmagotchi.GameContent.Objects; +using System.Text.Json; +using Johnmagotchi.GameContent.Units; +using Johnmagotchi.GameContent.Objects.UI; +using Johnmagotchi.Core.tools; + +namespace Johnmagotchi.Screen.BattleMapScreens +{ + public abstract class BaseMapScreen : GameScreen + { + SpriteBatch SpriteBatch; + protected BattleMap CurrentMap; + + public MapCursor MapCursor; + public UnitDisplay UnitDisplay; + + protected int cursorIndexX; + + protected int cursorIndexY; + + protected int scrollOffsetX; + protected int scrollOffsetY; + + public int CursorQuadrant; + + private readonly ulong CURSOR_HOLD_FRAMES = 25; + private readonly int SCROLL_BOOST_TIME_FRAMES = 60; + private readonly int CURSOR_SCROLL_NEXT_INC_FRAMES= 5; + + private readonly int SCROLL_TILES_FROM_EDGE_X = 3; + private readonly int SCROLL_TILES_FROM_EDGE_Y = 2; + + private int scrollTimer ; // frames until click to next + private int scrollTotalDuration; + + protected string tempSave; + + public bool ScreenScrollLock = false; + + private bool IsNewMap = true; + + + public abstract void ChildInit(); + public abstract void ChildUpdate(); + public abstract void ChildDraw(); + + + public BaseMapScreen(){ + this.CurrentMap = new BattleMap(24,20); + this.MapCursor = new MapCursor(); + this.UnitDisplay = new UnitDisplay(); + this.isDrawPriority = true; + this.isUpdatePriority = true; + + saveCurrentMap(); + } + public BaseMapScreen(BattleMap existingMap){ + + this.CurrentMap = existingMap.GetClone(); + + this.MapCursor = new MapCursor(); + this.UnitDisplay = new UnitDisplay(); + this.isDrawPriority = true; + this.isUpdatePriority = true; + this.IsNewMap = false; + } + + public override void Init() + { + scrollTimer =0; + scrollTotalDuration =0; + cursorIndexX = 2; + cursorIndexY = 2; + scrollOffsetX=0; + scrollOffsetY=0; + + SpriteBatch = new SpriteBatch(screenManager.GraphicsDevice); + + this.MapCursor.Init(screenManager); + this.UnitDisplay.Init(screenManager); + if (this.IsNewMap) + { + this.CurrentMap.Init(screenManager); + } + else + { + this.CurrentMap.InitFromReload(ScreenManager); + } + + ChildInit(); + } + + public override void Destroy() + { + throw new NotImplementedException(); + } + + public override void Draw() + { + // bool stopXScroll = false; + //bool stopYScroll = false; + if ((this.CurrentMap.width * MapTile.TILE_WIDTH_PX) < this.ScreenManager.GetScaledPixelScreenWidth()) { // center width + scrollOffsetX = (this.ScreenManager.GetScaledPixelScreenWidth() - (this.CurrentMap.width * MapTile.TILE_WIDTH_PX))/2; + // stopXScroll = true; + } + if ((this.CurrentMap.height * MapTile.TILE_HEIGHT_PX) < this.ScreenManager.GetScaledPixelScreenHeight()){ // center height + scrollOffsetY = (this.ScreenManager.GetScaledPixelScreenHeight() - (this.CurrentMap.height * MapTile.TILE_HEIGHT_PX))/2; + // stopYScroll = true; + } + + + this.CurrentMap.DrawMap(scrollOffsetX, scrollOffsetY);// should draw background + + //draw on top of background : + //cursor + this.MapCursor.Draw( (MapTile.TILE_WIDTH_PX *cursorIndexX) + scrollOffsetX , (MapTile.TILE_HEIGHT_PX * cursorIndexY) + scrollOffsetY); + + // units + this.CurrentMap.DrawUnits(scrollOffsetX, scrollOffsetY);// should draw background + + + + // Call child draw classes + ChildDraw(); + + // anthing that has priorty top layer should go here + + // ui overlay + UnitDisplay.Draw(CursorQuadrant); + + + } + + public override void Update() + { + // Updates + UpdateCursorQuadrant(); // This doesnt need to be called every frame, but its easy. so. + + + /// Keyboard / Controller controls + if (! screenManager.inputs.isMouseMode) + { + + if (screenManager.inputs.mouseInput.leftClick.isJustReleased) { + TibzLog.Debug(" Changed To Mouse Controls"); + screenManager.inputs.isMouseMode = true; + } + //Check Button Presses + if (screenManager.inputs.editorInputs.navLeft.isJustPressed) + { + TickCursorLeft(); + } + if (screenManager.inputs.editorInputs.navRight.isJustPressed) + { + TickCursorRight(); + } + if (screenManager.inputs.editorInputs.navUp.isJustPressed) + { + TickCursorUp(); + } + if (screenManager.inputs.editorInputs.navDown.isJustPressed) + { + TickCursorDown(); + } + if (screenManager.inputs.editorInputs.saveButton.isJustPressed) + { + saveCurrentMap(); + } + if (screenManager.inputs.editorInputs.loadButton.isJustPressed) + { + loadCurrentMap(); + } + + + //Button Holds + if (screenManager.inputs.editorInputs.navLeft.heldTime > CURSOR_HOLD_FRAMES) + { + IncrementScrollTimers(); + if (scrollTimer > CURSOR_SCROLL_NEXT_INC_FRAMES) + { + scrollTimer = 0; + TickCursorLeft(); + } + + } + if (screenManager.inputs.editorInputs.navRight.heldTime > CURSOR_HOLD_FRAMES) + { + IncrementScrollTimers(); + if (scrollTimer > CURSOR_SCROLL_NEXT_INC_FRAMES) + { + scrollTimer = 0; + TickCursorRight(); + } + } + if (screenManager.inputs.editorInputs.navUp.heldTime > CURSOR_HOLD_FRAMES) + { + IncrementScrollTimers(); + if (scrollTimer > CURSOR_SCROLL_NEXT_INC_FRAMES) + { + scrollTimer = 0; + TickCursorUp(); + } + } + if (screenManager.inputs.editorInputs.navDown.heldTime > CURSOR_HOLD_FRAMES) + { + IncrementScrollTimers(); + if (scrollTimer > CURSOR_SCROLL_NEXT_INC_FRAMES) + { + scrollTimer = 0; + TickCursorDown(); + } + } + if (ScreenManager.inputs.editorInputs.navLeft.isJustReleased || // reset scroll timers on release + ScreenManager.inputs.editorInputs.navRight.isJustReleased || + ScreenManager.inputs.editorInputs.navUp.isJustReleased || + ScreenManager.inputs.editorInputs.navDown.isJustReleased) + { + scrollTimer = 0; + scrollTotalDuration = 0; + } + } + + else { + if (screenManager.inputs.editorInputs.confirm.isJustPressed) + { + TibzLog.Debug(" Reverted to keyboard controls"); + screenManager.inputs.isMouseMode = false; + } + + UpdateCursorMouse(); + + if (screenManager.inputs.mouseInput.leftClick.isJustPressed) + { + screenManager.inputs.editorInputs.confirm.isJustPressed = true; + } + if (screenManager.inputs.mouseInput.rightClick.isJustPressed) + { + screenManager.inputs.editorInputs.cancel.isJustPressed = true; + } + } + + // update battle map + CurrentMap.Update(); + + // update unit display + UnitDisplay.Update( CurrentMap.getUnitAtLocation(cursorIndexX, cursorIndexY)); + + // End Update, call child + ChildUpdate(); + + } + + protected virtual void TickCursorLeft() + { + if (cursorIndexX > 0) cursorIndexX --; + else cursorIndexX = 0; + // adjust screen after mouse movement + tickLeftScroll(); + } + protected virtual void TickCursorRight() + { + if (cursorIndexX < CurrentMap.width -1) cursorIndexX ++; // zero indexed so -1 + else cursorIndexX = CurrentMap.width -1; + // adjust screen after mouse movement + tickRightScroll(); + } + protected virtual void TickCursorUp() + { + if (cursorIndexY > 0) cursorIndexY --; + else cursorIndexY = 0; + // adjust screen after mouse movement + tickUpScroll(); + } + protected virtual void TickCursorDown() + { + if (cursorIndexY < CurrentMap.height -1) cursorIndexY ++; // zero indexed so -1 + else cursorIndexY = CurrentMap.height -1; + // adjust screen after mouse movement + tickDownScroll(); + } + private void IncrementScrollTimers() + { + scrollTimer++; + scrollTotalDuration++; + if (scrollTotalDuration > SCROLL_BOOST_TIME_FRAMES){ + scrollTimer ++; // double the speed of scroll if held for over 70 frames + } + + } + + protected void tickLeftScroll(){ + if (ScreenScrollLock){ return; } + int currentOffsetTilesX = - scrollOffsetX / MapTile.TILE_WIDTH_PX; // since the offset scrolling left is negative we need to invert this sign + int currentOffsetTilesY = scrollOffsetY / MapTile.TILE_HEIGHT_PX; + int totalWidthTiles = this.screenManager.GetScaledPixelScreenWidth() / MapTile.TILE_WIDTH_PX; + int TilesFromLeftEdge = cursorIndexX - currentOffsetTilesX; + + System.Console.WriteLine("Scroll offset px: {0}", scrollOffsetX); + + if ( TilesFromLeftEdge < SCROLL_TILES_FROM_EDGE_X) + { + scrollOffsetX += MapTile.TILE_WIDTH_PX; // scroll left + } + if (scrollOffsetX >= 0 ) // scroll limit + { + scrollOffsetX = 0; + } + } + protected void tickRightScroll(){ + if (ScreenScrollLock){ return; } + int currentOffsetTilesX = - scrollOffsetX / MapTile.TILE_WIDTH_PX; // invert sign here + int currentOffsetTilesY = scrollOffsetY / MapTile.TILE_HEIGHT_PX; + int totalWidthTiles = this.screenManager.GetScaledPixelScreenWidth() / MapTile.TILE_WIDTH_PX; + int TilesFromLeftEdge = cursorIndexX - currentOffsetTilesX; + System.Console.WriteLine("Scroll offset px: {0}", scrollOffsetX); + + System.Console.WriteLine("Scroll offset limit: {0}", -1* (CurrentMap.width * MapTile.TILE_WIDTH_PX - this.screenManager.GetScaledPixelScreenWidth())); + + + if ( TilesFromLeftEdge >= totalWidthTiles - SCROLL_TILES_FROM_EDGE_X) + { + scrollOffsetX -= MapTile.TILE_WIDTH_PX; // scroll right + } + if (scrollOffsetX <= -1* (CurrentMap.width * MapTile.TILE_WIDTH_PX - this.screenManager.GetScaledPixelScreenWidth())) + { + scrollOffsetX = -1* (CurrentMap.width * MapTile.TILE_WIDTH_PX - this.screenManager.GetScaledPixelScreenWidth()); + } + } + protected void tickUpScroll(){ + if (ScreenScrollLock){ return; } + int currentOffsetTilesY = - scrollOffsetY / MapTile.TILE_HEIGHT_PX; + int totalHeightTiles = this.screenManager.GetScaledPixelScreenHeight() / MapTile.TILE_HEIGHT_PX; + int tilesFromTop = cursorIndexY - currentOffsetTilesY; + //System.Console.WriteLine("Scroll offset px: {0}", scrollOffsetY); + if ( tilesFromTop < SCROLL_TILES_FROM_EDGE_Y){ + scrollOffsetY += MapTile.TILE_HEIGHT_PX; // scroll up + } + if (scrollOffsetY >= 0 ) + { + scrollOffsetY = 0; + } + } + protected void tickDownScroll(){ + if (ScreenScrollLock){ return; } + int currentOffsetTilesY = - scrollOffsetY / MapTile.TILE_HEIGHT_PX; + int totalHeightTiles = this.screenManager.GetScaledPixelScreenHeight() / MapTile.TILE_HEIGHT_PX; + int tilesFromTop = cursorIndexY - currentOffsetTilesY; + // System.Console.WriteLine("Scroll offset px: {0}", scrollOffsetY); + + if ( tilesFromTop > totalHeightTiles - SCROLL_TILES_FROM_EDGE_Y){ + scrollOffsetY -= MapTile.TILE_HEIGHT_PX; // scroll up + } + if (scrollOffsetY <= -1* (CurrentMap.height * MapTile.TILE_HEIGHT_PX - this.screenManager.GetScaledPixelScreenHeight())) + { + scrollOffsetY = -1* (CurrentMap.height * MapTile.TILE_HEIGHT_PX - this.screenManager.GetScaledPixelScreenHeight()); + } + } + + + + + public string saveCurrentMap(){ + System.Console.WriteLine("Saving...."); + CurrentMap.SerializeAll(); + + tempSave = JsonSerializer.Serialize(CurrentMap); + // System.Console.WriteLine("save json: {0}", tempSave); + return tempSave; + } + + public void loadCurrentMap(){ + if (tempSave.Length > 10){ + System.Console.WriteLine("Loading...."); + this.CurrentMap = JsonSerializer.Deserialize(tempSave); + this.CurrentMap.InitFromReload(screenManager); + this.CurrentMap.deserializeMapTiles(); + this.CurrentMap.DeserializeUnitData(); + } + else{ + System.Console.WriteLine("valid save state not found"); + } + + } + + private void UpdateCursorQuadrant() { + + if ((MapTile.TILE_HEIGHT_PX * cursorIndexY) + scrollOffsetY < ScreenManager.GetScaledPixelScreenHeight() / 2) // top + { + if ((MapTile.TILE_WIDTH_PX * cursorIndexX) + scrollOffsetX > ScreenManager.GetScaledPixelScreenWidth() / 2) // right + { + CursorQuadrant = 1; + } + else // left + { + CursorQuadrant = 2; + } + } + + else //bottom + { + if ((MapTile.TILE_WIDTH_PX * cursorIndexX) + scrollOffsetX < ScreenManager.GetScaledPixelScreenWidth() / 2) // left + { + CursorQuadrant = 3; + } + else // right + { + CursorQuadrant = 4; + } + } + } + + private void UpdateCursorMouse() + { + int x = screenManager.inputs.mouseInput.x; + int y = screenManager.inputs.mouseInput.y; + //TibzLog.Debug("Mouse Pos: x - "+ x + " , y - " + y ); + + int xSelectedTileIndex = x * ScreenManager.BASE_ZOOM_LEVEL / ( MapTile.TILE_WIDTH_PX * 2 ); + int ySelectedTileIndex = y * ScreenManager.BASE_ZOOM_LEVEL / (MapTile.TILE_HEIGHT_PX * 2 ); + + cursorIndexX = xSelectedTileIndex; + cursorIndexY = ySelectedTileIndex; + + } + } +} \ No newline at end of file diff --git a/Johnmagotchi/GameContent/Screens/MapScreens/BattleMapScreen/BattleAnimationScreen.cs b/Johnmagotchi/GameContent/Screens/MapScreens/BattleMapScreen/BattleAnimationScreen.cs new file mode 100644 index 0000000..2e00448 --- /dev/null +++ b/Johnmagotchi/GameContent/Screens/MapScreens/BattleMapScreen/BattleAnimationScreen.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TibzGame.Core.ScreenManager; + +namespace Johnmagotchi.GameContent.Screens.MapScreens.BattleMapScreen +{ + internal class BattleAnimationScreen : GameScreen + { + public override void Destroy() + { + throw new NotImplementedException(); + } + + public override void Draw() + { + throw new NotImplementedException(); + } + + public override void Init() + { + throw new NotImplementedException(); + } + + public override void Update() + { + throw new NotImplementedException(); + } + } +} diff --git a/Johnmagotchi/GameContent/Screens/MapScreens/BattleMapScreen/BattleMapScreen.cs b/Johnmagotchi/GameContent/Screens/MapScreens/BattleMapScreen/BattleMapScreen.cs new file mode 100644 index 0000000..e83861b --- /dev/null +++ b/Johnmagotchi/GameContent/Screens/MapScreens/BattleMapScreen/BattleMapScreen.cs @@ -0,0 +1,327 @@ +using Johnmagotchi.Core.tools; +using Johnmagotchi.GameContent.Logic; +using Johnmagotchi.GameContent.Objects; +using Johnmagotchi.GameContent.Objects.Maps; +using Johnmagotchi.GameContent.Screens.Menu.BattleMap; +using Johnmagotchi.GameContent.Units; +using Johnmagotchi.Screen.BattleMapScreens; +using System; +using System.Collections.Generic; +using TibzGame.Core.ScreenManager; + +namespace Johnmagotchi.GameContent.Screens.BattleMapScreens.BattleMapScreen +{ + internal class BattleMapScreen : BaseMapScreen + { + enum SelectionState + { + MOVE, + CHOOSE_ACTION, + END_ACTION, + } + + UnitObject selectedToMoveUnit; + UnitObject attackedUnit; + private Tuple originalLocation; + private List> validMoves; + private List> validAttacks; + private int initInputDelay = 40; // frames till inputs work + public BattleMapScreen(BattleMap map) : base(map) + { + selectedToMoveUnit = null; + } + public override void Destroy() + { + // throw new NotImplementedException(); + } + + public override void ChildInit() + { + TibzLog.Debug("Child init hit"); + + + } + + public override void ChildUpdate() + { + + // Wait until delay ends to start input + if (initInputDelay > 0) + { + initInputDelay--; + return; + } + + + // Handle inputs + if (screenManager.inputs.editorInputs.confirm.isJustPressed) + { + TibzLog.Debug("Select Pressed"); + + + UnitObject newSelectedUnit = CurrentMap.getUnitAtLocation(cursorIndexX, cursorIndexY); + TibzLog.Debug(newSelectedUnit.UnitLoadout.AvailableAttacks); + if (newSelectedUnit != null && newSelectedUnit.isTurnOver == false && selectedToMoveUnit == null) + { + selectedToMoveUnit = newSelectedUnit; + this.originalLocation = new Tuple(cursorIndexX, cursorIndexY); + + ShowAllMoveHighlights(); + + } + else if (selectedToMoveUnit != null) // unit is selected, movement not confirmed + { + if (newSelectedUnit == null) // space is not occupied with another unit + { + // normal movement + if (validMoves != null) + { + bool isMoveValid = false; + foreach (Tuple tile in validMoves) + { + if (tile.Item1 == cursorIndexX && tile.Item2 == cursorIndexY) + { + isMoveValid = true; + } + } + if (isMoveValid) + { + //clear highlights and move + clearValidTiles(); + CurrentMap.moveUnit(this.selectedToMoveUnit, cursorIndexX, cursorIndexY); + + ShowDirectAttackHighlights(); + // This menu directly calls: + //AfterMoveWait(), AfterMoveAttack(), AfterMoveWait() + TibzLog.Debug(selectedToMoveUnit.UnitLoadout.AvailableAttacks); + screenManager.addScreen( + new AfterMovementMenu( + this, + MapTile.TILE_WIDTH_PX * cursorIndexX + scrollOffsetX, + MapTile.TILE_HEIGHT_PX * cursorIndexY + scrollOffsetY, + CursorQuadrant, true)); + + } + else + { + // Move is not valid, probably play a sound effect or something + } + + + } + + } + else if (selectedToMoveUnit.internalID == newSelectedUnit.internalID) + { + clearValidTiles(); + CurrentMap.moveUnit(this.selectedToMoveUnit, cursorIndexX, cursorIndexY); + // The same unit has been selected + ShowDirectAttackHighlights(); + // This menu calls: + //AfterMoveWait(), AfterMoveAttack(), AfterMoveWait() + screenManager.addScreen( + new AfterMovementMenu( + this, + MapTile.TILE_WIDTH_PX * cursorIndexX + scrollOffsetX, + MapTile.TILE_HEIGHT_PX * cursorIndexY + scrollOffsetY, + CursorQuadrant, true)); + + } + else // new unit selected while attempting to move + { + + + } + + } + else + { + screenManager.addScreen( + new BattleMapMenu( + this, + MapTile.TILE_WIDTH_PX * cursorIndexX + scrollOffsetX, + MapTile.TILE_HEIGHT_PX * cursorIndexY + scrollOffsetY, + CursorQuadrant)); + } + } + + if (screenManager.inputs.editorInputs.cancel.isJustPressed) + { + if (selectedToMoveUnit != null) + { + + if (validMoves != null) + { + clearValidTiles(); + } + + this.selectedToMoveUnit = null; + + } + } + } + + public override void ChildDraw() + { + // throw new NotImplementedException(); + } + + public List> GetValidMoveCoordinates(UnitObject unit, Tuple coords) + { + List> validTiles = new List>(); + int x = coords.Item1; + int y = coords.Item2; + + int range = unit.stats.Movement; + + // tree traversal time + TibzLog.Debug(" - BM screen - "); + TibzLog.Debug(unit.stats.movementType); + MapMovementNode rootNode = new MapMovementNode(unit, CurrentMap, range, x, y); + rootNode.GetMoveLocations(MapMovementNode.ParentNodeLocation.ROOT, ref validTiles); + + return validTiles; + } + + public List> GetValidAttackHighlights(UnitObject unit, Tuple coords) + { + List> validTiles = new List>(); + int x = coords.Item1; + int y = coords.Item2; + int range = unit.stats.Movement; + MapMovementNode rootNode = new MapMovementNode(unit, CurrentMap, range, x, y); + rootNode.getDirectAttackLocations(MapMovementNode.ParentNodeLocation.ROOT, ref validTiles); + + return validTiles; + } + + protected override void TickCursorLeft() + { + if (cursorIndexX > 0) cursorIndexX--; + else cursorIndexX = 0; + // adjust screen after mouse movement + tickLeftScroll(); + } + protected override void TickCursorRight() + { + if (cursorIndexX < CurrentMap.width - 1) cursorIndexX++; // zero indexed so -1 + else cursorIndexX = CurrentMap.width - 1; + // adjust screen after mouse movement + tickRightScroll(); + } + protected override void TickCursorUp() + { + if (cursorIndexY > 0) cursorIndexY--; + else cursorIndexY = 0; + // adjust screen after mouse movement + tickUpScroll(); + } + protected override void TickCursorDown() + { + if (cursorIndexY < CurrentMap.height - 1) cursorIndexY++; // zero indexed so -1 + else cursorIndexY = CurrentMap.height - 1; + // adjust screen after mouse movement + tickDownScroll(); + } + + + + private void finishMovement() + { + + this.selectedToMoveUnit.isTurnOver = true; + this.selectedToMoveUnit = null; + } + + public void AfterMoveWait() + { + ClearDirectAttackHighlights(); + finishMovement(); + } + public void AfterMoveAttack() + { + ClearDirectAttackHighlights(); + finishMovement(); + MapScreens.BattleMapScreen.BattlePreviewScreen.confirmCallback attackPreviewCallback = delegate (bool confirmed) { AttackPreviewConfirmed(confirmed); }; + screenManager.addScreen(new MapScreens.BattleMapScreen.BattlePreviewScreen(ref attackPreviewCallback) ); + + } + + public void AttackPreviewConfirmed(bool isConfirmed) { + if (isConfirmed) + { + // BattleLogic.RunBattle(selectedToMoveUnit,attackedUnit, selectedAttack, defenderAttack); + BattleLogic.RunBattle(ref selectedToMoveUnit, ref attackedUnit, null, null); + screenManager.addScreen(new MapScreens.BattleMapScreen.BattleAnimationScreen()); + } + + } + + + public void AfterMoveItem() + { + ClearDirectAttackHighlights(); + finishMovement(); + + } + + public void AfterMoveCancelled() + { + CurrentMap.moveUnit(this.selectedToMoveUnit, this.originalLocation.Item1, this.originalLocation.Item2); + ShowAllMoveHighlights(); + } + + private void ShowAllMoveHighlights() + { + validAttacks = GetValidAttackHighlights(selectedToMoveUnit, new Tuple(originalLocation.Item1, originalLocation.Item2)); + foreach (Tuple tile in validAttacks) + { + CurrentMap.ChangeTileHighlight(tile.Item1, tile.Item2, TileHighlight.ATTACK); + } + + + validMoves = GetValidMoveCoordinates(selectedToMoveUnit, new Tuple(originalLocation.Item1, originalLocation.Item2)); + foreach (Tuple tile in validMoves) + { + CurrentMap.ChangeTileHighlight(tile.Item1, tile.Item2, TileHighlight.MOVEMENT); + } + } + private void clearValidTiles() + { + + foreach (Tuple tile in validMoves) + { + CurrentMap.ChangeTileHighlight(tile.Item1, tile.Item2, TileHighlight.NONE); + } + + foreach (Tuple tile in validAttacks) + { + CurrentMap.ChangeTileHighlight(tile.Item1, tile.Item2, TileHighlight.NONE); + } + validMoves = null; + validAttacks = null; + } + + private void ShowDirectAttackHighlights() + { + List> tiles = new List>(); + MapMovementNode rootNode = new MapMovementNode(this.selectedToMoveUnit, CurrentMap, 0, this.selectedToMoveUnit.xPos, this.selectedToMoveUnit.yPos); + rootNode.getDirectAttacksNoMovement(MapMovementNode.ParentNodeLocation.ROOT, ref tiles); + foreach (Tuple tile in tiles) + { + CurrentMap.ChangeTileHighlight(tile.Item1, tile.Item2, TileHighlight.ATTACK); + } + } + private void ClearDirectAttackHighlights() + { + List> tiles = new List>(); + MapMovementNode rootNode = new MapMovementNode(this.selectedToMoveUnit, CurrentMap, 0, this.selectedToMoveUnit.xPos, this.selectedToMoveUnit.yPos); + rootNode.getDirectAttacksNoMovement(MapMovementNode.ParentNodeLocation.ROOT, ref tiles); + foreach (Tuple tile in tiles) + { + CurrentMap.ChangeTileHighlight(tile.Item1, tile.Item2, TileHighlight.NONE); + } + + } + } +} \ No newline at end of file diff --git a/Johnmagotchi/GameContent/Screens/MapScreens/BattleMapScreen/BattlePreviewScreen.cs b/Johnmagotchi/GameContent/Screens/MapScreens/BattleMapScreen/BattlePreviewScreen.cs new file mode 100644 index 0000000..95224db --- /dev/null +++ b/Johnmagotchi/GameContent/Screens/MapScreens/BattleMapScreen/BattlePreviewScreen.cs @@ -0,0 +1,67 @@ +using Johnmagotchi.GameContent.Screens.Menu; +using Microsoft.Xna.Framework.Graphics; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TibzGame.Core.ScreenManager; + +namespace Johnmagotchi.GameContent.Screens.MapScreens.BattleMapScreen +{ + internal class BattlePreviewScreen : GameScreen + { + public delegate void confirmCallback(bool confirmed); + + protected GameScreen ParentGameScreen; + protected SpriteBatch spriteBatch; + public SpriteEffects currentSpriteEffects; + + protected int xPos; + protected int yPos; + + protected int xDrawOffset; + protected int yDrawOffset; + + protected int SelectedIndex; + protected MenuOption[] CurrentOptions; + + protected Texture2D button; + protected Texture2D buttonHighlight; + protected SpriteFont kemco; + protected SpriteFont pixsplit; + + + confirmCallback callback; + public BattlePreviewScreen(ref confirmCallback newCallback) { + + this.callback = newCallback; + + } + public override void Destroy() + { + throw new NotImplementedException(); + } + + public override void Draw() + { + throw new NotImplementedException(); + } + + public override void Init() + { + spriteBatch = new SpriteBatch(screenManager.GraphicsDevice); + button = screenManager.contentRef.Load("Map-UI/test-menu-item-64-28"); + buttonHighlight = screenManager.contentRef.Load("Map-UI/test-menu-item-64-28-selected"); + //load fonts + kemco = screenManager.contentRef.Load("Fonts/Kemco-20"); + pixsplit = screenManager.contentRef.Load("Fonts/PixelSplitter"); + + } + + public override void Update() + { + throw new NotImplementedException(); + } + } +} diff --git a/Johnmagotchi/GameContent/Screens/MapScreens/MapEditor/MapEditorInfoText.cs b/Johnmagotchi/GameContent/Screens/MapScreens/MapEditor/MapEditorInfoText.cs new file mode 100644 index 0000000..933c4c8 --- /dev/null +++ b/Johnmagotchi/GameContent/Screens/MapScreens/MapEditor/MapEditorInfoText.cs @@ -0,0 +1,75 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TibzGame.Core.ScreenManager; + +namespace Johnmagotchi.GameContent.Screens.BattleMapScreens.MapEditor +{ + internal class MapEditorInfoText + { + protected SpriteFont kemco; + protected SpriteFont pixsplit; + protected ScreenManager ScreenManager; + protected SpriteBatch spriteBatch; + + public MapEditorInfoText() { + + } + public void Init(ScreenManager screenManager) + { + ScreenManager = screenManager; + spriteBatch = new SpriteBatch(screenManager.GraphicsDevice); + kemco = ScreenManager.contentRef.Load("Fonts/Kemco-20"); + pixsplit = ScreenManager.contentRef.Load("Fonts/PixelSplitter"); + } + public void Draw( int cursorQuadrant, int offsetX, int offsetY, string CurrentToolString) + { + + Vector2 textRotationOrigin = kemco.MeasureString(CurrentToolString); + textRotationOrigin.X = textRotationOrigin.X / 2; + + float x = textRotationOrigin.X - 40 ; + int y = 40; + y += offsetY; + if (cursorQuadrant == 1 || cursorQuadrant ==2) { + y = 700; // these values need to be adjust to match screen resolution + y -= offsetY; + } + + x += offsetX; + + + Vector2 position = new Vector2(x,y); + + + + spriteBatch.Begin(); + + // the hackiest white outline of all time. + position = new Vector2(x+2, y+2); + spriteBatch.DrawString(kemco, CurrentToolString, position, Color.White, 0, textRotationOrigin, 00.75f, SpriteEffects.None, 1.0f); + position = new Vector2(x-2, y-2); + spriteBatch.DrawString(kemco, CurrentToolString, position, Color.White, 0, textRotationOrigin, 00.75f, SpriteEffects.None, 1.0f); + position = new Vector2(x+2, y-2); + spriteBatch.DrawString(kemco, CurrentToolString, position, Color.White, 0, textRotationOrigin, 00.75f, SpriteEffects.None, 1.0f); + position = new Vector2(x-2, y+2); + spriteBatch.DrawString(kemco, CurrentToolString, position, Color.White, 0, textRotationOrigin, 00.75f, SpriteEffects.None, 1.0f); + position = new Vector2(x+2, y); + spriteBatch.DrawString(kemco, CurrentToolString, position, Color.White, 0, textRotationOrigin, 00.75f, SpriteEffects.None, 1.0f); + position = new Vector2(x-2, y); + spriteBatch.DrawString(kemco, CurrentToolString, position, Color.White, 0, textRotationOrigin, 00.75f, SpriteEffects.None, 1.0f); + + + // the actual text + position = new Vector2(x, y); + spriteBatch.DrawString(kemco, CurrentToolString, position, Color.Black, 0, textRotationOrigin, 00.75f, SpriteEffects.None, 1.0f); + + + spriteBatch.End(); + } + } +} diff --git a/Johnmagotchi/GameContent/Screens/MapScreens/MapEditor/MapEditorScreen.cs b/Johnmagotchi/GameContent/Screens/MapScreens/MapEditor/MapEditorScreen.cs new file mode 100644 index 0000000..e881ada --- /dev/null +++ b/Johnmagotchi/GameContent/Screens/MapScreens/MapEditor/MapEditorScreen.cs @@ -0,0 +1,233 @@ +using Johnmagotchi.GameContent.Objects; +using System.Collections.Generic; +using Johnmagotchi.GameContent.Units; +using Johnmagotchi.Core.tools; +using Johnmagotchi.GameContent.Screens.Menu; +using Johnmagotchi.GameContent.Screens.BattleMapScreens.MapEditor; +using Microsoft.VisualBasic; +using static System.Net.Mime.MediaTypeNames; +using System.IO; +using System; +using Johnmagotchi.GameContent.Objects.Units.Loadouts; +using Johnmagotchi.GameContent.Objects.Units.BattleObjects; + +namespace Johnmagotchi.Screen.BattleMapScreens +{ + public class MapEditorScreen : BaseMapScreen + { + + public enum EditorToolType + { + TILE_EDIT, + UNIT_ADD, + UNIT_DELETE + } + private enum UnitFactionType { // this could be replaced with the team enum in unit stats + PLAYER, + ENEMY, + NPC + } + private readonly bool AUTOLOAD_SLOT_0 = true; + private TileType selectedTileType; + private int selectedUnitIndex; + private EditorToolType CurrentTool; + private MapEditorInfoText InfoText; + public List AvailableUnits; + public List AvailableLoadouts; + private UnitFactionType UnitFaction; + + + public MapEditorScreen(){ + + this.isUpdatePriority = true; + this.InfoText = new MapEditorInfoText(); + } + public MapEditorScreen(BattleMap existingMap){ + this.CurrentMap = existingMap; + } + + public BattleMap GetMap() { + return CurrentMap; + } + + public override void ChildInit() + { + InfoText.Init(screenManager); + selectedTileType = TileType.GRASS; + AvailableUnits = UnitLoader.LoadBaseUnits(); + + + + selectedUnitIndex = 0; + UnitFaction = UnitFactionType.PLAYER; + foreach (UnitObject unit in AvailableUnits) { + TibzLog.Debug(" Unit id: {0}, name: {1}, health: {2}, atk: {3}, def: {4}, spd {5}, unique: {6}, movementType {7} ", + unit.id, unit.name, unit.stats.MaxHealth, unit.stats.Attack, unit.stats.Defense,unit.stats.Speed , unit.isUnique, unit.stats.movementType); + } + + if (AUTOLOAD_SLOT_0) { + this.LoadMapAtSlot(0); + } + + } + public override void ChildUpdate() { + if (CurrentTool == EditorToolType.TILE_EDIT) + { + if (screenManager.inputs.editorInputs.special1.isJustPressed) + { + this.selectedTileType = TileType.GRASS; + } + if (screenManager.inputs.editorInputs.special2.isJustPressed) + { + this.selectedTileType = TileType.SEA; + } + if (screenManager.inputs.editorInputs.confirm.isPressed) + { + CurrentMap.ChangeTileType(this.cursorIndexX, this.cursorIndexY, this.selectedTileType); + } + } +// ---------------------------------------------------------------------------------------------------------------------- + if (CurrentTool == EditorToolType.UNIT_ADD) + { + if (screenManager.inputs.editorInputs.special1.isJustPressed) + { + selectedUnitIndex ++; + if (selectedUnitIndex > AvailableUnits.Count -1) { + selectedUnitIndex = 0; + } + } + if (screenManager.inputs.editorInputs.special2.isJustPressed) + { + selectedUnitIndex --; + if (selectedUnitIndex < 0) + { + selectedUnitIndex = AvailableUnits.Count - 1; + } + } + + if (screenManager.inputs.editorInputs.special3.isJustPressed) + { + UnitFaction++; + if (UnitFaction > UnitFactionType.NPC) + { + UnitFaction = UnitFactionType.PLAYER; + } + } + if (screenManager.inputs.editorInputs.special4.isJustPressed) + { + UnitFaction--; + if (UnitFaction < UnitFactionType.PLAYER) + { + UnitFaction = UnitFactionType.NPC; + } + } + if (screenManager.inputs.editorInputs.confirm.isJustPressed) + { + if (UnitFaction == UnitFactionType.PLAYER) + { + CurrentMap.AddPlayerUnit(AvailableUnits[selectedUnitIndex], cursorIndexX, cursorIndexY); + } + else if (UnitFaction == UnitFactionType.ENEMY) + { + CurrentMap.AddEnemyUnit(AvailableUnits[selectedUnitIndex], cursorIndexX, cursorIndexY); + } + else if (UnitFaction == UnitFactionType.NPC) + { + CurrentMap.AddNpcUnit(AvailableUnits[selectedUnitIndex], cursorIndexX, cursorIndexY); + } + // CurrentMap.ChangeTileType(this.cursorIndexX, this.cursorIndexY, this.selectedTileType); + } + } + // ---------------------------------------------------------------------------------------------------------------------- + + if (CurrentTool == EditorToolType.UNIT_DELETE) + { + + if (screenManager.inputs.editorInputs.confirm.isJustPressed) + { + UnitObject deleteUnit = CurrentMap.getUnitAtLocation(cursorIndexX, cursorIndexY); + if (deleteUnit != null) + { + CurrentMap.deleteUnit(deleteUnit); + } + } + } + // -------------------------------------------------------------------------------------------------------------------------- + if (screenManager.inputs.editorInputs.cancel.isJustPressed) + { + this.screenManager.addScreen( + new MapEditorMenu( + this, + (MapTile.TILE_WIDTH_PX * cursorIndexX) + scrollOffsetX, + (MapTile.TILE_HEIGHT_PX * cursorIndexY) + scrollOffsetY, + CursorQuadrant)); + } + + } + + public void UpdateEditorTool(EditorToolType tool) { + CurrentTool = tool; + + TibzLog.Debug("Tool Updated: {0}", CurrentTool); + } + + public override void ChildDraw() + { + string tooltext = CurrentTool.ToString().Replace("_", " "); + InfoText.Draw( CursorQuadrant,0,0, "Current Tool : " + tooltext); + if (CurrentTool == EditorToolType.TILE_EDIT) { + InfoText.Draw(CursorQuadrant, 15 , 30, "Current Tile : " + selectedTileType); + } + if (CurrentTool == EditorToolType.UNIT_ADD) + { + InfoText.Draw(CursorQuadrant, 15, 30, "Current Unit : " + AvailableUnits[selectedUnitIndex].name); + InfoText.Draw(CursorQuadrant, 15, 60, "Current Faction : " + UnitFaction); + } + } + + public void SaveMap() { + this.saveCurrentMap(); + } + public void SaveMapAtSlot( int saveslot) + { + TibzLog.Debug("Save slot : " + saveslot); + // write to GameContent/Data/SaveMapData/Map-.json + var path = "..\\..\\..\\Data\\SaveMapData\\map-" +saveslot + ".json"; + File.WriteAllText(path, this.saveCurrentMap()); + } + + public void LoadMapAtSlot(int saveslot) { + TibzLog.Debug("LoadMAp hit"); + try + { + var path = "..\\..\\..\\Data\\SaveMapData\\map-" + saveslot + ".json"; + //Pass the file path and file name to the StreamReader constructor + StreamReader sr = new StreamReader(path); + //We should only need to read the first line of text + string line = sr.ReadLine(); + TibzLog.Debug(line); + this.tempSave = line; + this.loadCurrentMap(); + //if needed we do this to continue to read until you reach end of file + //while (line != null) + //{ + // TibzLog.Debug(line); + // //Read the next line + // line = sr.ReadLine(); + //} + //close the file + sr.Close(); + TibzLog.Debug("File Stream Closeds"); + + + + } + catch (Exception e) + { + TibzLog.Debug("File Read Error: \n" + e); + } + } + } +} + + \ No newline at end of file diff --git a/Johnmagotchi/GameContent/Screens/Menu/BaseMapMenu.cs b/Johnmagotchi/GameContent/Screens/Menu/BaseMapMenu.cs new file mode 100644 index 0000000..3ed5083 --- /dev/null +++ b/Johnmagotchi/GameContent/Screens/Menu/BaseMapMenu.cs @@ -0,0 +1,184 @@ +using Johnmagotchi.Core.tools; +using Johnmagotchi.GameContent.Objects; +using Johnmagotchi.Screen.BattleMapScreens; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Metadata; +using System.Text; +using System.Threading.Tasks; +using TibzGame.Core.ScreenManager; + + +namespace Johnmagotchi.GameContent.Screens.Menu + { + public abstract class BaseMapMenu : GameScreen + { + protected GameScreen ParentGameScreen; + protected SpriteBatch spriteBatch; + public SpriteEffects currentSpriteEffects; + + protected int xPos; + protected int yPos; + + protected int xDrawOffset; + protected int yDrawOffset; + + protected int SelectedIndex; + protected MenuOption[] CurrentOptions; + + protected Texture2D button; + protected Texture2D buttonHighlight; + protected SpriteFont kemco; + protected SpriteFont pixsplit; + protected int screenQuadrant; // 1 - top left, 2 top right, 3 bottom left, 4 bottom right. if right, submenus push out left. if bottom, start drawing from bottom up + + public BaseMapMenu(GameScreen parentScreen, int x, int y, int screenQuadrant) + { + ParentGameScreen = parentScreen; + xPos = x; + yPos = y; + this.screenQuadrant = screenQuadrant; + isUpdatePriority = true; + SelectedIndex = 0; + + // Child class needs to init: + // parent screen + // CurrentOptions List + // X & Y Draw Offsets + + } + + public override void Init() + { + spriteBatch = new SpriteBatch(screenManager.GraphicsDevice); + button = screenManager.contentRef.Load("Map-UI/test-menu-item-64-28"); + buttonHighlight = screenManager.contentRef.Load("Map-UI/test-menu-item-64-28-selected"); + //load fonts + kemco = screenManager.contentRef.Load("Fonts/Kemco-20"); + pixsplit = screenManager.contentRef.Load("Fonts/PixelSplitter"); + ChildInit(); + } + + public override void Update() + { + + if (ScreenManager.inputs.isMouseMode) + { + //Handle Mouse Buttons + if (screenManager.inputs.mouseInput.leftClick.isJustPressed) + { + screenManager.inputs.editorInputs.confirm.isJustPressed = true; + } + if (screenManager.inputs.mouseInput.rightClick.isJustPressed) + { + screenManager.inputs.editorInputs.cancel.isJustPressed = true; + } + HandleMouseCursor(); + } + else + { + if (screenManager.inputs.editorInputs.navUp.isJustPressed) + { + SelectedIndex--; + if (SelectedIndex < 0) { SelectedIndex = CurrentOptions.Length - 1; } + } + if (screenManager.inputs.editorInputs.navDown.isJustPressed) + { + SelectedIndex++; + if (SelectedIndex >= CurrentOptions.Length) { SelectedIndex = 0; } + } + } + + if (screenManager.inputs.editorInputs.cancel.isJustPressed) + { + TibzLog.Debug("Removing screen"); + screenManager.removeTopScreens(1); // remove this screen + } + + //Child should implement what happens on confirm + ChildUpdate(); + } + + public abstract void ChildInit(); + public abstract void ChildUpdate(); + public override void Draw() + { + spriteBatch.Begin(SpriteSortMode.Deferred, null, SamplerState.PointClamp); + + int yOffset = yDrawOffset; + if (screenQuadrant > 2) + { // adjust y offset so it starts a full length higher up + + } + + //------------------------- Draw boxes ----------------------------- + for (int i = CurrentOptions.Length; i > 0; i--) + { + Texture2D buttonSprite = button; + if (i - 1 == SelectedIndex) + { + buttonSprite = buttonHighlight; + } + // Box + Rectangle tileRect = screenManager.GetScaledRectangle(xPos - xDrawOffset, yPos - yOffset, 6400, 2800); + spriteBatch.Draw( + buttonSprite, tileRect, null, Color.White, 0, new Vector2(0, 0), + currentSpriteEffects, 1); + + // increase offset for next item + yOffset += 2800; + } + + // ------------------------- Draw text ----------------------------- + yOffset = yDrawOffset; + int textOffsetX = 1000; + int textOffsetY = 1000; + for (int j = CurrentOptions.Length; j > 0; j--) + { + int i = j - 1; + //text + Vector2 position = new(screenManager.getScaledIntX(xPos - xDrawOffset + textOffsetX), screenManager.getScaledIntY(yPos - (yOffset - textOffsetY))); // add 20 to each + Vector2 textRotationOrigin = new Vector2(0, 0); + spriteBatch.DrawString(kemco, CurrentOptions[i].OptionLabel, position, Color.Black, 0, textRotationOrigin, 00.75f, SpriteEffects.None, 1.0f); + // increase offset for next item + yOffset += 2800; + } + + spriteBatch.End(); + } + public override void Destroy() + { + + } + + private void HandleMouseCursor() + { + int x = screenManager.inputs.mouseInput.x; + int y = screenManager.inputs.mouseInput.y; + TibzLog.Debug("Mouse y - " + y); + + + + TibzLog.Debug("top bounds??? - " + ScreenManager.getScaledIntY( yPos - yDrawOffset)); + + // screenManager.getScaledIntX(xPos - xDrawOffset + textOffsetX), + //TODO STILL WORKING O{N THIS 7/18/26 + + //screenManager.GetScaledRectangle(xPos - xDrawOffset, yPos - yOffset, 6400, 2800); + int yOffset = yDrawOffset; + for (int i = CurrentOptions.Length; i > 0; i--) + { + if (y < ScreenManager.getScaledIntY(yPos - yOffset)) + { + SelectedIndex = i-1; + + TibzLog.Debug("index set! " + i); + } + yOffset += 2800; + } + } + } +} diff --git a/Johnmagotchi/GameContent/Screens/Menu/BattleMap/AfterMovementMenu.cs b/Johnmagotchi/GameContent/Screens/Menu/BattleMap/AfterMovementMenu.cs new file mode 100644 index 0000000..4ff8b13 --- /dev/null +++ b/Johnmagotchi/GameContent/Screens/Menu/BattleMap/AfterMovementMenu.cs @@ -0,0 +1,109 @@ +using Johnmagotchi.Core.tools; +using Johnmagotchi.GameContent.Screens.BattleMapScreens.BattleMapScreen; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Johnmagotchi.GameContent.Screens.Menu.BattleMap +{ + internal class AfterMovementMenu :BaseMapMenu + { + private BattleMapScreen BattleMapInstance; + public AfterMovementMenu(BattleMapScreen parentScreen, int x, int y, int screenQuadrant, bool isAttackAvailable) : base(parentScreen, x, y, screenQuadrant) + { + this.isUpdatePriority = true; + this.isDrawPriority = false; + BattleMapInstance = parentScreen; + if (isAttackAvailable) + { + CurrentOptions = new MenuOption[3]; + CurrentOptions[0] = new MenuOption(MenuOption.MenuOptionType.ATTACK); + CurrentOptions[1] = new MenuOption(MenuOption.MenuOptionType.ITEM); + CurrentOptions[2] = new MenuOption(MenuOption.MenuOptionType.WAIT); + } + else { + CurrentOptions = new MenuOption[2]; + CurrentOptions[0] = new MenuOption(MenuOption.MenuOptionType.ITEM); + CurrentOptions[1] = new MenuOption(MenuOption.MenuOptionType.WAIT); + } + + if (screenQuadrant == 1) + { + xDrawOffset = 7000; + yDrawOffset = -2800 * (CurrentOptions.Length - 1) - 300; + } + else if (screenQuadrant == 2) + { + xDrawOffset = -3800; + yDrawOffset = -2800 * (CurrentOptions.Length - 1) - 300; + } + else if (screenQuadrant == 3) + { + xDrawOffset = -3800; + yDrawOffset = 0; + } + else + { + xDrawOffset = 7000; + yDrawOffset = 0; + } + } + public override void ChildInit() + { + // throw new NotImplementedException(); + } + + public override void ChildUpdate() + { + if (screenManager.inputs.editorInputs.confirm.isJustPressed) + { + int subX = xPos; + int subY = yPos; + if (screenQuadrant == 1) + { + subX -= 800; + subY += 800; + } + else if (screenQuadrant == 2) + { + subX += 800; + subY += 800; + } + else if (screenQuadrant == 3) + { + subX += 800; + subY -= ((CurrentOptions.Length - 3) * 2800) - 800; + } + else + { + subX -= 800; + subY -= ((CurrentOptions.Length - 3) * 2800) - 800; + + } + + if (CurrentOptions[SelectedIndex].OptionType == MenuOption.MenuOptionType.ATTACK) + { + screenManager.removeTopScreens(1); + BattleMapInstance.AfterMoveAttack(); + } + if (CurrentOptions[SelectedIndex].OptionType == MenuOption.MenuOptionType.ITEM) + { + screenManager.removeTopScreens(1); + BattleMapInstance.AfterMoveItem(); + } + if (CurrentOptions[SelectedIndex].OptionType == MenuOption.MenuOptionType.WAIT) + { + screenManager.removeTopScreens(1); + BattleMapInstance.AfterMoveWait(); + } + } + if (screenManager.inputs.editorInputs.cancel.isJustPressed) { + screenManager.removeTopScreens(1); + BattleMapInstance.AfterMoveCancelled(); + } + + } + } +} diff --git a/Johnmagotchi/GameContent/Screens/Menu/BattleMap/BattleMapMenu.cs b/Johnmagotchi/GameContent/Screens/Menu/BattleMap/BattleMapMenu.cs new file mode 100644 index 0000000..81f20e6 --- /dev/null +++ b/Johnmagotchi/GameContent/Screens/Menu/BattleMap/BattleMapMenu.cs @@ -0,0 +1,115 @@ +using Johnmagotchi.Core.tools; +using Johnmagotchi.GameContent.Screens.BattleMapScreens.BattleMapScreen; +using Johnmagotchi.GameContent.Screens.Menu.MapEditor; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Johnmagotchi.GameContent.Screens.Menu.BattleMap +{ + internal class BattleMapMenu : BaseMapMenu + { + private BattleMapScreen BattleMapInstance; + public BattleMapMenu(BattleMapScreen parentScreen, int x, int y, int screenQuadrant) : base(parentScreen, x, y, screenQuadrant) + { + BattleMapInstance = parentScreen; + CurrentOptions = new MenuOption[4]; + CurrentOptions[0] = new MenuOption(MenuOption.MenuOptionType.DEBUG_RETURN_TO_EDITOR); + CurrentOptions[1] = new MenuOption(MenuOption.MenuOptionType.END_TURN); + CurrentOptions[2] = new MenuOption(MenuOption.MenuOptionType.EXPORT_MAP); + // CurrentOptions[3] = new MenuOption(MenuOption.MenuOptionType.ENTER_BATTLE_SCREEN); + CurrentOptions[3] = new MenuOption(MenuOption.MenuOptionType.EXIT); + if (screenQuadrant == 1) + { + xDrawOffset = 7000; + yDrawOffset = -2800 * (CurrentOptions.Length - 1) - 300; + } + else if (screenQuadrant == 2) + { + xDrawOffset = -3800; + yDrawOffset = -2800 * (CurrentOptions.Length - 1) - 300; + } + else if (screenQuadrant == 3) + { + xDrawOffset = -3800; + yDrawOffset = 0; + } + else + { + xDrawOffset = 7000; + yDrawOffset = 0; + } + } + + public override void ChildInit() + { + // throw new NotImplementedException(); + } + + public override void ChildUpdate() + { + // throw new NotImplementedException(); + + + if (screenManager.inputs.editorInputs.confirm.isJustPressed) + { + TibzLog.Debug("Menu Selected Option Type :{0}", CurrentOptions[SelectedIndex]); + int subX = xPos; + int subY = yPos; + if (screenQuadrant == 1) + { + subX -= 800; + subY += 800; + } + else if (screenQuadrant == 2) + { + subX += 800; + subY += 800; + } + else if (screenQuadrant == 3) + { + subX += 800; + subY -= ((CurrentOptions.Length - 3) * 2800) - 800; + } + else + { + subX -= 800; + subY -= ((CurrentOptions.Length - 3) * 2800) - 800; + + } + + if (CurrentOptions[SelectedIndex].OptionType == MenuOption.MenuOptionType.DEBUG_RETURN_TO_EDITOR) + { + screenManager.removeTopScreens(2); // remove this screen and base screen + // MapEditorInstance.SaveMap(); + // screenManager.addScreen(new BattleMapScreen(MapEditorInstance.GetMap())); + } + if (CurrentOptions[SelectedIndex].OptionType == MenuOption.MenuOptionType.CHOOSE_NEW_TOOL) + { + + // screenManager.addScreen(new ToolSelectMenu(this, subX, subY, screenQuadrant)); + } + if (CurrentOptions[SelectedIndex].OptionType == MenuOption.MenuOptionType.EXPORT_MAP) + { + // screenManager.addScreen(new SaveSlotSelect(this, subX, subY, screenQuadrant, SaveSlotSelected)); + // this would use the windows API to save, for now I am just going to use save slots bc I dont want to deal with it needing to be single threaded + //SaveFileDialog saveFileDialog1 = new SaveFileDialog(); + //saveFileDialog1.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif"; + //saveFileDialog1.Title = "Save an Image File"; + //saveFileDialog1.ShowDialog(); + } + if (CurrentOptions[SelectedIndex].OptionType == MenuOption.MenuOptionType.IMPORT_MAP) + { + // screenManager.addScreen(new SaveSlotSelect(this, subX, subY, screenQuadrant, LoadSlotSelected)); + } + if (CurrentOptions[SelectedIndex].OptionType == MenuOption.MenuOptionType.EXIT) { + screenManager.removeTopScreens(1); // remove this screen + } + } + + + } + } +} diff --git a/Johnmagotchi/GameContent/Screens/Menu/MapEditor/MapEditorMenu.cs b/Johnmagotchi/GameContent/Screens/Menu/MapEditor/MapEditorMenu.cs new file mode 100644 index 0000000..a9c5ca4 --- /dev/null +++ b/Johnmagotchi/GameContent/Screens/Menu/MapEditor/MapEditorMenu.cs @@ -0,0 +1,125 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TibzGame.Core.Inputs; +using TibzGame.Core.ScreenManager; + +using Johnmagotchi.GameContent.Objects; +using System.Text.Json; +using Johnmagotchi.Core.tools; +using Johnmagotchi.GameContent.Screens.Menu; +using Johnmagotchi.Screen.BattleMapScreens; +using Johnmagotchi.GameContent.Screens.Menu.MapEditor; +using System.Windows.Forms; +using Johnmagotchi.GameContent.Screens.BattleMapScreens.BattleMapScreen; + +namespace Johnmagotchi.GameContent.Screens.Menu +{ + public class MapEditorMenu : BaseMapMenu + { + public MapEditorScreen MapEditorInstance; + + public MapEditorMenu(MapEditorScreen parentScreen, int x, int y, int screenQuadrant) : base (parentScreen, x ,y ,screenQuadrant) + { + MapEditorInstance = parentScreen; + CurrentOptions = new MenuOption[5]; + CurrentOptions[0] = new MenuOption(MenuOption.MenuOptionType.CHOOSE_NEW_TOOL); + CurrentOptions[1] = new MenuOption(MenuOption.MenuOptionType.IMPORT_MAP); + CurrentOptions[2] = new MenuOption(MenuOption.MenuOptionType.EXPORT_MAP); + CurrentOptions[3] = new MenuOption(MenuOption.MenuOptionType.ENTER_BATTLE_SCREEN); + CurrentOptions[4] = new MenuOption(MenuOption.MenuOptionType.EXIT); + if (screenQuadrant == 1) + { + xDrawOffset = 7000; + yDrawOffset = -2800 * (CurrentOptions.Length - 1) - 300; + } + else if (screenQuadrant == 2) + { + xDrawOffset = -3800; + yDrawOffset = -2800 * (CurrentOptions.Length - 1) - 300; + } + else if (screenQuadrant == 3) + { + xDrawOffset = -3800; + yDrawOffset = 0; + } + else + { + xDrawOffset = 7000; + yDrawOffset = 0; + } + + } + + public override void ChildInit() + { + + } + public override void ChildUpdate() + { + if (screenManager.inputs.editorInputs.confirm.isJustPressed) + { + TibzLog.Debug("Menu Selected Option Type :{0}", CurrentOptions[SelectedIndex]); + int subX = xPos; + int subY = yPos; + if (screenQuadrant == 1) + { + subX -= 800; + subY += 800; + } + else if (screenQuadrant == 2) + { + subX += 800; + subY += 800; + } + else if (screenQuadrant == 3) + { + subX += 800; + subY -= ((CurrentOptions.Length - 3) * 2800) - 800; + } + else + { + subX -= 800; + subY -= ((CurrentOptions.Length - 3) * 2800) - 800; + + } + + if (CurrentOptions[SelectedIndex].OptionType == MenuOption.MenuOptionType.ENTER_BATTLE_SCREEN) + { + // screenManager.removeTopScreens(1); // remove this screen + MapEditorInstance.SaveMap(); + screenManager.addScreen(new BattleMapScreen(MapEditorInstance.GetMap())); + } + if (CurrentOptions[SelectedIndex].OptionType == MenuOption.MenuOptionType.CHOOSE_NEW_TOOL) + { + + screenManager.addScreen(new ToolSelectMenu(this, subX,subY, screenQuadrant)); + } + if (CurrentOptions[SelectedIndex].OptionType == MenuOption.MenuOptionType.EXPORT_MAP) { + screenManager.addScreen(new SaveSlotSelect(this, subX, subY, screenQuadrant, SaveSlotSelected)); + // this would use the windows API to save, for now I am just going to use save slots bc I dont want to deal with it needing to be single threaded + //SaveFileDialog saveFileDialog1 = new SaveFileDialog(); + //saveFileDialog1.Filter = "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif"; + //saveFileDialog1.Title = "Save an Image File"; + //saveFileDialog1.ShowDialog(); + } + if (CurrentOptions[SelectedIndex].OptionType == MenuOption.MenuOptionType.IMPORT_MAP) + { + screenManager.addScreen(new SaveSlotSelect(this, subX, subY, screenQuadrant, LoadSlotSelected)); + } + } + } + public void SaveSlotSelected(int slot) { + MapEditorInstance.SaveMapAtSlot(slot); + } + public void LoadSlotSelected(int slot) { + MapEditorInstance.LoadMapAtSlot(slot); + } + } +} \ No newline at end of file diff --git a/Johnmagotchi/GameContent/Screens/Menu/MapEditor/SaveSlotSelect.cs b/Johnmagotchi/GameContent/Screens/Menu/MapEditor/SaveSlotSelect.cs new file mode 100644 index 0000000..c199e35 --- /dev/null +++ b/Johnmagotchi/GameContent/Screens/Menu/MapEditor/SaveSlotSelect.cs @@ -0,0 +1,73 @@ +using Johnmagotchi.Core.tools; +using Johnmagotchi.Screen.BattleMapScreens; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms.Design; +using TibzGame.Core.ScreenManager; +using static System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox; + +namespace Johnmagotchi.GameContent.Screens.Menu.MapEditor +{ + internal class SaveSlotSelect : BaseMapMenu + { + private MapEditorMenu Parent; + private Action Callback; + public SaveSlotSelect(MapEditorMenu parentScreen, int x, int y, int screenQuadrant, Action callback) : base(parentScreen, x, y, screenQuadrant) + { + Parent = parentScreen; + Callback = callback; + CurrentOptions = new MenuOption[5]; + CurrentOptions[0] = new MenuOption(MenuOption.MenuOptionType.SAVE_SLOT_0); + CurrentOptions[1] = new MenuOption(MenuOption.MenuOptionType.SAVE_SLOT_1); + CurrentOptions[2] = new MenuOption(MenuOption.MenuOptionType.SAVE_SLOT_2); + CurrentOptions[3] = new MenuOption(MenuOption.MenuOptionType.SAVE_SLOT_3); + CurrentOptions[4] = new MenuOption(MenuOption.MenuOptionType.SAVE_SLOT_4); + //CurrentOptions[5] = new MenuOption(MenuOption.MenuOptionType.SAVE_SLOT_5); + //CurrentOptions[6] = new MenuOption(MenuOption.MenuOptionType.SAVE_SLOT_6); + //CurrentOptions[7] = new MenuOption(MenuOption.MenuOptionType.SAVE_SLOT_7); + //CurrentOptions[8] = new MenuOption(MenuOption.MenuOptionType.SAVE_SLOT_8); + //CurrentOptions[9] = new MenuOption(MenuOption.MenuOptionType.SAVE_SLOT_9); + if (screenQuadrant == 1) + { + xDrawOffset = 7000; + yDrawOffset = -2800 * (CurrentOptions.Length - 1) - 300; + } + else if (screenQuadrant == 2) + { + xDrawOffset = -3800; + yDrawOffset = -2800 * (CurrentOptions.Length - 1) - 300; + } + else if (screenQuadrant == 3) + { + xDrawOffset = -3800; + yDrawOffset = 0; + } + else + { + xDrawOffset = 7000; + yDrawOffset = 0; + } + } + + public override void ChildInit() + { + + } + + public override void ChildUpdate() + { + if (screenManager.inputs.editorInputs.confirm.isJustPressed) + { + TibzLog.Debug("Closing Menu with Option Type :{0}", CurrentOptions[SelectedIndex]); + + this.Callback(SelectedIndex); // index should just match 1 to 1 with slot + // Parent.SaveSlotSelected(SelectedIndex); // index should just match 1 to 1 with slot + + screenManager.removeTopScreens(2); // remove this screen & previous + } + } + } +} diff --git a/Johnmagotchi/GameContent/Screens/Menu/MapEditor/ToolSelectMenu.cs b/Johnmagotchi/GameContent/Screens/Menu/MapEditor/ToolSelectMenu.cs new file mode 100644 index 0000000..25bf20a --- /dev/null +++ b/Johnmagotchi/GameContent/Screens/Menu/MapEditor/ToolSelectMenu.cs @@ -0,0 +1,68 @@ +using Johnmagotchi.Core.tools; +using Johnmagotchi.Screen.BattleMapScreens; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Johnmagotchi.GameContent.Screens.Menu.MapEditor +{ + internal class ToolSelectMenu : BaseMapMenu + { + private MapEditorMenu Parent; + public ToolSelectMenu(MapEditorMenu parent, int x, int y , int q): base(parent.MapEditorInstance, x,y,q) { + Parent = parent; + CurrentOptions = new MenuOption[3]; + CurrentOptions[0] = new MenuOption(MenuOption.MenuOptionType.EDITOR_TOOL_TERRAIN); + CurrentOptions[1] = new MenuOption(MenuOption.MenuOptionType.EDITOR_TOOL_PLACE_UNIT); + CurrentOptions[2] = new MenuOption(MenuOption.MenuOptionType.EDITOR_TOOL_DELETE_UNIT); + if (screenQuadrant == 1) + { + xDrawOffset = 7000; + yDrawOffset = -2800 * (CurrentOptions.Length - 1) - 300; + } + else if (screenQuadrant == 2) + { + xDrawOffset = -3800; + yDrawOffset = -2800 * (CurrentOptions.Length - 1) - 300; + } + else if (screenQuadrant == 3) + { + xDrawOffset = -3800; + yDrawOffset = 0; + } + else + { + xDrawOffset = 7000; + yDrawOffset = 0; + } + } + public override void ChildInit() + { + // throw new NotImplementedException(); + } + + public override void ChildUpdate() + { + if (screenManager.inputs.editorInputs.confirm.isJustPressed) + { + TibzLog.Debug("Closing Menu with Option Type :{0}", CurrentOptions[SelectedIndex]); + screenManager.removeTopScreens(2); // remove this screen and the previous menu screen + if (CurrentOptions[SelectedIndex].OptionType == MenuOption.MenuOptionType.EDITOR_TOOL_TERRAIN) + { + //screenManager.addScreen(new BattleMapScreen(mapEditor.GetMap()));1 + Parent.MapEditorInstance.UpdateEditorTool(MapEditorScreen.EditorToolType.TILE_EDIT); + } + if (CurrentOptions[SelectedIndex].OptionType == MenuOption.MenuOptionType.EDITOR_TOOL_PLACE_UNIT) + { + Parent.MapEditorInstance.UpdateEditorTool(MapEditorScreen.EditorToolType.UNIT_ADD); + } + if (CurrentOptions[SelectedIndex].OptionType == MenuOption.MenuOptionType.EDITOR_TOOL_DELETE_UNIT) + { + Parent.MapEditorInstance.UpdateEditorTool(MapEditorScreen.EditorToolType.UNIT_DELETE); + } + } + } + } +} diff --git a/Johnmagotchi/GameContent/Screens/Menu/MenuOption.cs b/Johnmagotchi/GameContent/Screens/Menu/MenuOption.cs new file mode 100644 index 0000000..f78a279 --- /dev/null +++ b/Johnmagotchi/GameContent/Screens/Menu/MenuOption.cs @@ -0,0 +1,102 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Johnmagotchi.GameContent.Screens.Menu +{ + public class MenuOption + { + public enum MenuOptionType + { + //Editor Menu + CHOOSE_NEW_TOOL, + ENTER_BATTLE_SCREEN, + IMPORT_MAP, + EXPORT_MAP, + EXIT, + //Editor Tool Select + EDITOR_TOOL_TERRAIN, + EDITOR_TOOL_PLACE_UNIT, + EDITOR_TOOL_DELETE_UNIT, + //Save Slot + SAVE_SLOT_0, + SAVE_SLOT_1, + SAVE_SLOT_2, + SAVE_SLOT_3, + SAVE_SLOT_4, + SAVE_SLOT_5, + SAVE_SLOT_6, + SAVE_SLOT_7, + SAVE_SLOT_8, + SAVE_SLOT_9, + //Battle Menu + DEBUG_RETURN_TO_EDITOR, + END_TURN, + //After Movement Action Menu + ATTACK, + ITEM, + WAIT, + + // Unit End Movement + } + public string OptionLabel; + public MenuOptionType OptionType; + + public MenuOption(MenuOptionType type) { + this.OptionType = type; + this.OptionLabel = GetMenuString(type); + } + public static string GetMenuString(MenuOptionType type) { + switch (type) { + //Editor Menu + case MenuOptionType.CHOOSE_NEW_TOOL: + return "Tools"; + case MenuOptionType.ENTER_BATTLE_SCREEN: + return "Battle"; + case MenuOptionType.IMPORT_MAP: + return "Load"; + case MenuOptionType.EXPORT_MAP: + return "Save"; + case MenuOptionType.EXIT: + return "Exit"; + //Editor tool select + case MenuOptionType.EDITOR_TOOL_TERRAIN: + return "Tiles"; + case MenuOptionType.EDITOR_TOOL_PLACE_UNIT: + return "Units"; + case MenuOptionType.EDITOR_TOOL_DELETE_UNIT: + return "Delete"; + // Save Slots + case MenuOptionType.SAVE_SLOT_0: + case MenuOptionType.SAVE_SLOT_1: + case MenuOptionType.SAVE_SLOT_2: + case MenuOptionType.SAVE_SLOT_3: + case MenuOptionType.SAVE_SLOT_4: + case MenuOptionType.SAVE_SLOT_5: + case MenuOptionType.SAVE_SLOT_6: + case MenuOptionType.SAVE_SLOT_7: + case MenuOptionType.SAVE_SLOT_8: + case MenuOptionType.SAVE_SLOT_9: + return "Slot " + (type - MenuOptionType.SAVE_SLOT_0 ); + case MenuOptionType.DEBUG_RETURN_TO_EDITOR: + return "Editor"; + + case MenuOptionType.END_TURN: + return "End Turn"; + + case MenuOptionType.ATTACK: + return "Attack"; + case MenuOptionType.ITEM: + return "Items"; + case MenuOptionType.WAIT: + return "Wait"; + + default: + return ""; + + } + } + } +} diff --git a/Johnmagotchi/GameContent/Screens/titleScreen.cs b/Johnmagotchi/GameContent/Screens/titleScreen.cs new file mode 100644 index 0000000..04a23a6 --- /dev/null +++ b/Johnmagotchi/GameContent/Screens/titleScreen.cs @@ -0,0 +1,43 @@ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TibzGame.Core.ScreenManager; + +namespace Johnmagotchi.Screen +{ + internal class titleScreen : GameScreen + { + public override void Init() + { + + } + + + public override void Draw() + { + throw new NotImplementedException(); + } + + + + public override void Update() + { + if ( screenManager.inputs.mouseInput.y > 0 && + screenManager.inputs.mouseInput.y < 1280 && + screenManager.inputs.mouseInput.x > 0 && + screenManager.inputs.mouseInput.x < 720 && + screenManager.inputs.mouseInput.leftClick.isJustPressed) + { + // screenManager.addScreen(new MainGameScreen()); + } + } + + public override void Destroy() + { + + } + } +} diff --git a/Johnmagotchi/Icon.bmp b/Johnmagotchi/Icon.bmp new file mode 100644 index 0000000..2b48165 Binary files /dev/null and b/Johnmagotchi/Icon.bmp differ diff --git a/Johnmagotchi/Icon.ico b/Johnmagotchi/Icon.ico new file mode 100644 index 0000000..7d9dec1 Binary files /dev/null and b/Johnmagotchi/Icon.ico differ diff --git a/Johnmagotchi/Johnmagotchi.cs b/Johnmagotchi/Johnmagotchi.cs new file mode 100644 index 0000000..6d5781a --- /dev/null +++ b/Johnmagotchi/Johnmagotchi.cs @@ -0,0 +1,84 @@ +using Johnmagotchi.Screen.BattleMapScreens; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Content; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; +using TibzGame.Core.Inputs; +using TibzGame.Core.ScreenManager; + +namespace Johnmagotchi +{ + public class Johnmagotchi : Game + { + public GraphicsDeviceManager graphics; + private SpriteBatch _spriteBatch; + private ScreenManager _screenManager; + public InputManager inputManager; + public ContentManager contentRef; + + public MapEditorScreen gameScrn; + + public Johnmagotchi() + { + contentRef = Content; + graphics = new GraphicsDeviceManager(this); + inputManager = new InputManager(); + _screenManager = new ScreenManager(this, ref graphics, ref contentRef, ref inputManager); // pass a ref to gfx for screen size changes + + Content.RootDirectory = "Content"; + IsMouseVisible = true; + + } + + protected override void Initialize() + { + // TODO: Add your initialization logic here + + base.Initialize(); + Components.Add(_screenManager); + + //_screenManager.setWindowSize(1920,1080); + //_screenManager.setFullScreen(true); + + _screenManager.setWindowSize(1280, 720); // 720p + //_screenManager.setFullScreen(false); + + // _screenManager.setWindowSize(800, 800); // 4:3 + // _screenManager.setWindowSize(640, 480); // 4:3 + // _screenManager.setWindowSize(1440, 900); // some weird mac size + + + gameScrn = new MapEditorScreen(); + _screenManager.addScreen(gameScrn); + + } + + protected override void LoadContent() + { + _spriteBatch = new SpriteBatch(GraphicsDevice); + + // TODO: use this.Content to load your game content here + } + + protected override void Update(GameTime gameTime) + { + if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) + Exit(); + + inputManager.getInputs(); + + // TODO: Add your update logic here + + base.Update(gameTime); + } + + protected override void Draw(GameTime gameTime) + { + GraphicsDevice.Clear(Color.CornflowerBlue); + + // TODO: Add your drawing code here + + base.Draw(gameTime); + } + } +} diff --git a/Johnmagotchi/Johnmagotchi.csproj b/Johnmagotchi/Johnmagotchi.csproj new file mode 100644 index 0000000..958fcc5 --- /dev/null +++ b/Johnmagotchi/Johnmagotchi.csproj @@ -0,0 +1,45 @@ + + + WinExe + net6.0-windows + true + Major + false + false + + + app.manifest + Icon.ico + + + + + + + + + + + + tlbimp + 4 + 2 + 215d64d2-031c-33c7-96e3-61794cd1ee61 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Johnmagotchi/Program.cs b/Johnmagotchi/Program.cs new file mode 100644 index 0000000..ed41ab1 --- /dev/null +++ b/Johnmagotchi/Program.cs @@ -0,0 +1,3 @@ + +using var game = new Johnmagotchi.Johnmagotchi(); +game.Run(); diff --git a/Johnmagotchi/app.manifest b/Johnmagotchi/app.manifest new file mode 100644 index 0000000..8d9121f --- /dev/null +++ b/Johnmagotchi/app.manifest @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true/pm + permonitorv2,permonitor + + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..9842da2 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +This is a project I made for Monogame Jam 5. + +It is a quick little tamagatchi- like game, made to fit the theme of "John". + +If you follow the monogame quickstart guides it should be fairly straightforward to load this project after that. +It was made with VS community 2022 and the most recent release of monogame as of dec 2023. +https://docs.monogame.net/articles/getting_started/0_getting_started.html