diff --git a/.gdignore b/.gdignore
index 2c49341..1bfdef3 100644
--- a/.gdignore
+++ b/.gdignore
@@ -1,3 +1,606 @@
-docs
-*.md
-.idea
\ No newline at end of file
+# File created using '.gitignore Generator' for Visual Studio Code: https://bit.ly/vscode-gig
+# Created by https://www.toptal.com/developers/gitignore/api/windows,visualstudiocode,rider,macos,linux,godot,executable,backup,visualstudio
+# Edit at https://www.toptal.com/developers/gitignore?templates=windows,visualstudiocode,rider,macos,linux,godot,executable,backup,visualstudio
+
+### Backup ###
+*.bak
+*.gho
+*.ori
+*.orig
+*.tmp
+
+### Executable ###
+*.app
+*.bat
+*.cgi
+*.com
+*.exe
+*.gadget
+*.jar
+*.pif
+*.vb
+*.wsf
+
+### Godot ###
+# Godot 4+ specific ignores
+.godot/
+
+# Godot-specific ignores
+.import/
+export.cfg
+export_presets.cfg
+
+# Imported translations (automatically generated from CSV files)
+*.translation
+
+# Mono-specific ignores
+.mono/
+data_*/
+mono_crash.*.json
+
+### Linux ###
+*~
+
+# temporary files which can be created if a process still has a handle open of a deleted file
+.fuse_hidden*
+
+# KDE directory preferences
+.directory
+
+# Linux trash folder which might appear on any partition or disk
+.Trash-*
+
+# .nfs files are created when an open file is removed but is still being accessed
+.nfs*
+
+### macOS ###
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+### macOS Patch ###
+# iCloud generated files
+*.icloud
+
+### Rider ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# AWS User-specific
+.idea/**/aws.xml
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# SonarLint plugin
+.idea/sonarlint/
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+### VisualStudioCode ###
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+!.vscode/*.code-snippets
+
+# Local History for Visual Studio Code
+.history/
+
+# Built Visual Studio Code Extensions
+*.vsix
+
+### VisualStudioCode Patch ###
+# Ignore all local history of files
+.history
+.ionide
+
+### Windows ###
+# Windows thumbnail cache files
+Thumbs.db
+Thumbs.db:encryptable
+ehthumbs.db
+ehthumbs_vista.db
+
+# Dump file
+*.stackdump
+
+# Folder config file
+[Dd]esktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+### VisualStudio ###
+## 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/main/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/
+[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_proj
+*_wpftmp.csproj
+*.log
+*.tlog
+*.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 6 auto-generated project file (contains which files were open etc.)
+*.vbp
+
+# Visual Studio 6 workspace and project file (working project files containing files to include in project)
+*.dsw
+*.dsp
+
+# Visual Studio 6 technical files
+
+# 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/
+
+# Visual Studio History (VSHistory) files
+.vshistory/
+
+# 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
+
+# VS Code files for those working on multiple tools
+*.code-workspace
+
+# Local History for Visual Studio Code
+
+# Windows Installer files from build outputs
+
+# JetBrains Rider
+*.sln.iml
+
+### VisualStudio Patch ###
+# Additional files built by Visual Studio
+
+# End of https://www.toptal.com/developers/gitignore/api/windows,visualstudiocode,rider,macos,linux,godot,executable,backup,visualstudio
+
+# Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option)
+
+screenshot.png
+archive/*
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index c6b96f4..025ba01 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,6 @@
# File created using '.gitignore Generator' for Visual Studio Code: https://bit.ly/vscode-gig
-# Created by https://www.toptal.com/developers/gitignore/api/windows,web,visualstudiocode,monodevelop,macos,linux,godot,executable,dotnetcore,backup
-# Edit at https://www.toptal.com/developers/gitignore?templates=windows,web,visualstudiocode,monodevelop,macos,linux,godot,executable,dotnetcore,backup
+# Created by https://www.toptal.com/developers/gitignore/api/windows,visualstudiocode,rider,macos,linux,godot,executable,backup,visualstudio
+# Edit at https://www.toptal.com/developers/gitignore?templates=windows,visualstudiocode,rider,macos,linux,godot,executable,backup,visualstudio
### Backup ###
*.bak
@@ -9,15 +9,6 @@
*.orig
*.tmp
-### DotnetCore ###
-# .NET Core build folders
-bin/
-obj/
-
-# Common node modules locations
-/node_modules
-/wwwroot/node_modules
-
### Executable ###
*.app
*.bat
@@ -95,15 +86,84 @@ Temporary Items
# iCloud generated files
*.icloud
-### MonoDevelop ###
-#User Specific
-*.userprefs
-*.usertasks
+### Rider ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
-#Mono Project Files
-*.pidb
-*.resources
-test-results/
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# AWS User-specific
+.idea/**/aws.xml
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# SonarLint plugin
+.idea/sonarlint/
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
### VisualStudioCode ###
.vscode/*
@@ -124,21 +184,6 @@ test-results/
.history
.ionide
-### Web ###
-*.asp
-*.cer
-*.csr
-*.css
-*.htm
-*.html
-*.js
-*.jsp
-*.php
-*.rss
-*.wasm
-*.wat
-*.xhtml
-
### Windows ###
# Windows thumbnail cache files
Thumbs.db
@@ -165,7 +210,395 @@ $RECYCLE.BIN/
# Windows shortcuts
*.lnk
-# End of https://www.toptal.com/developers/gitignore/api/windows,web,visualstudiocode,monodevelop,macos,linux,godot,executable,dotnetcore,backup
+### VisualStudio ###
+## 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/main/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/
+[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_proj
+*_wpftmp.csproj
+*.log
+*.tlog
+*.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 6 auto-generated project file (contains which files were open etc.)
+*.vbp
+
+# Visual Studio 6 workspace and project file (working project files containing files to include in project)
+*.dsw
+*.dsp
+
+# Visual Studio 6 technical files
+
+# 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/
+
+# Visual Studio History (VSHistory) files
+.vshistory/
+
+# 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
+
+# VS Code files for those working on multiple tools
+*.code-workspace
+
+# Local History for Visual Studio Code
+
+# Windows Installer files from build outputs
+
+# JetBrains Rider
+*.sln.iml
+
+### VisualStudio Patch ###
+# Additional files built by Visual Studio
+
+# End of https://www.toptal.com/developers/gitignore/api/windows,visualstudiocode,rider,macos,linux,godot,executable,backup,visualstudio
# Custom rules (everything added below won't be overriden by 'Generate .gitignore File' if you use 'Update' option)
diff --git a/README.md b/README.md
index c0f3ba3..59f90ef 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,11 @@
# Dress Up Zack
-Tony's Dress Up is a re-imagining of my first (and only) Flash game series, ZC's Dress Up that was developed back in 2007. Both this and the originals are heavily inspired by The Sims 2: Body Shop in their own unique ways.
+
+
+Tony's Dress Up is a port of my first (and only) Flash game series, ZC's Dress Up that was developed back in 2007. Both this and the originals are heavily inspired by The Sims 2: Body Shop in their own unique ways.
## License
The source and assets are licensed under the GPL-3.0 License and CC-BY, respectfully - see the [LICENSE](LICENSE) and [ASSET-LICENSE](ASSET-LICENSE) for more details.
-The Flash games located in the `/archive` directory are proprietary, but considered abandonware. Any extracted assets are under the same license. Feel free to share them on archives.
+The Flash games located in the `/archive` directory are proprietary, but considered abandonware. Any extracted assets are under the same license. Feel free to share them on archives.
\ No newline at end of file
diff --git a/addons/SpritesheetGenerator/Checker.png b/addons/SpritesheetGenerator/Checker.png
deleted file mode 100644
index f147f72..0000000
Binary files a/addons/SpritesheetGenerator/Checker.png and /dev/null differ
diff --git a/addons/SpritesheetGenerator/SpriteSheetGenerator.gd b/addons/SpritesheetGenerator/SpriteSheetGenerator.gd
deleted file mode 100644
index cbb9bbe..0000000
--- a/addons/SpritesheetGenerator/SpriteSheetGenerator.gd
+++ /dev/null
@@ -1,13 +0,0 @@
-@tool
-extends EditorPlugin
-
-func _enter_tree() -> void:
- add_tool_menu_item("Open Spritesheet Generator", run_generator)
- get_editor_interface().get_command_palette().add_command("Open Spritesheet Generator", "addons/open_spritesheet_generator", run_generator)
-
-func _exit_tree() -> void:
- remove_tool_menu_item("Open Spritesheet Generator")
- get_editor_interface().get_command_palette().remove_command("addons/open_spritesheet_generator")
-
-func run_generator():
- get_editor_interface().play_custom_scene("res://addons/SpritesheetGenerator/SpritesheetGenerator.tscn")
diff --git a/addons/SpritesheetGenerator/SpritesheetFrame.tscn b/addons/SpritesheetGenerator/SpritesheetFrame.tscn
deleted file mode 100644
index 790cf62..0000000
--- a/addons/SpritesheetGenerator/SpritesheetFrame.tscn
+++ /dev/null
@@ -1,77 +0,0 @@
-[gd_scene load_steps=3 format=3 uid="uid://cd5wndu01c1sn"]
-
-[sub_resource type="StyleBoxFlat" id="2"]
-resource_local_to_scene = true
-bg_color = Color(0, 0.501961, 0.501961, 1)
-
-[sub_resource type="GDScript" id="3"]
-resource_name = "Prefab"
-script/source = "extends PanelContainer
-
-var odd: Vector2
-
-func set_frame_margin(margin: Vector2):
- $MarginContainer.add_theme_constant_override(&\"margin_left\", margin.x)
- $MarginContainer.add_theme_constant_override(&\"margin_top\", margin.y)
-
- margin += odd
-
- $MarginContainer.add_theme_constant_override(&\"margin_right\", margin.x)
- $MarginContainer.add_theme_constant_override(&\"margin_bottom\", margin.y)
-
-func set_texture(texture: Texture2D):
- %TextureRect.texture = texture
- odd = Vector2(int(get_texture_size().x) % 2, int(get_texture_size().y) % 2)
-
-func get_texture_size() -> Vector2:
- return %TextureRect.texture.get_size()
-
-func get_position2() -> Vector2:
- return position + %TextureRect.position
-
-func get_texture_data() -> Image:
- return %TextureRect.texture.get_image()
-
-func set_display_background(display: bool):
- get_theme_stylebox(&\"panel\").draw_center = display
-
-func set_background_color(color: Color):
- get_theme_stylebox(&\"panel\").bg_color = color
-
-func _get_drag_data(p: Vector2):
- var preview = TextureRect.new()
- preview.texture = %TextureRect.texture
- preview.ignore_texture_size = true
- preview.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
- preview.size = Vector2(64, 64)
- set_drag_preview(preview)
- return {type = \"SpritesheetFrame\", node = self}
-
-func _can_drop_data(p: Vector2, data) -> bool:
- return data is Dictionary and data.get(\"type\", \"\") == \"SpritesheetFrame\"
-
-func _drop_data(p: Vector2, data) -> void:
- var index = get_index()
- get_parent().move_child(self, data.node.get_index())
- get_parent().move_child(data.node, index)
- get_tree().current_scene.refresh_grid()
-
-func _gui_input(event: InputEvent) -> void:
- if event is InputEventMouseButton:
- if event.pressed and event.button_index == MOUSE_BUTTON_RIGHT:
- get_tree().current_scene.remove_frame.call_deferred(self)
-"
-
-[node name="FramePrefab" type="PanelContainer" groups=["frame"]]
-theme_override_styles/panel = SubResource("2")
-script = SubResource("3")
-
-[node name="MarginContainer" type="MarginContainer" parent="."]
-layout_mode = 2
-mouse_filter = 2
-
-[node name="TextureRect" type="TextureRect" parent="MarginContainer"]
-unique_name_in_owner = true
-texture_filter = 1
-layout_mode = 2
-stretch_mode = 4
diff --git a/addons/SpritesheetGenerator/SpritesheetGenerator.tscn b/addons/SpritesheetGenerator/SpritesheetGenerator.tscn
deleted file mode 100644
index c064e03..0000000
--- a/addons/SpritesheetGenerator/SpritesheetGenerator.tscn
+++ /dev/null
@@ -1,714 +0,0 @@
-[gd_scene load_steps=5 format=3 uid="uid://bf3b0i8scthbm"]
-
-[ext_resource type="Texture2D" uid="uid://bnkl8rujlgv0h" path="res://addons/SpritesheetGenerator/Checker.png" id="1_hs1uu"]
-
-[sub_resource type="GDScript" id="1"]
-resource_name = "Generator"
-script/source = "extends Control
-
-const SUPPORTED_FORMATS: PackedStringArray = [\"bmp\", \"dds\", \"exr\", \"hdr\", \"jpg\", \"jpeg\", \"png\", \"tga\", \"svg\", \"svgz\", \"webp\"]
-
-@onready var grid := %GridContainer
-
-var file_list: Array
-var image_list: Array
-var texture_list: Array
-
-var images_to_process: Array
-var images_to_texturize: Array
-var first_time := true
-var image_count: int
-var output_path: String
-
-var auto := true
-var margin := Vector2.ONE
-
-var pan_origin: Vector2
-var pan_start: Vector2
-
-signal images_processed
-
-func _enter_tree() -> void:
- $SplitDialog.hide()
- $StashDialog.hide()
-
-func _ready():
- $Status.text = $Status.text % \", \".join(SUPPORTED_FORMATS)
-
- get_viewport().files_dropped.connect(load_files)
- grid.minimum_size_changed.connect(refresh_background)
- set_process(false)
-
-func refresh_background():
- %Background.custom_minimum_size = grid.get_minimum_size()
-
-func load_files(files: PackedStringArray):
- file_list.clear()
- image_list.clear()
-
- %CustomName.text = \"\"
- %Reload.disabled = false
- %SavePNG.disabled = false
-
- if files.size() == 1 and not FileAccess.file_exists(files[0]):
- var dir := DirAccess.open(files[0])
- if not dir:
- show_error(\"Can't open directory.\")
- return
-
- for file in dir.get_files():
- if file.get_extension() in SUPPORTED_FORMATS:
- file_list.append(str(dir.get_current_dir().path_join(file)))
- else:
- var wrong_count: int
- for file in files:
- if file.get_extension() in SUPPORTED_FORMATS:
- file_list.append(file)
- else:
- wrong_count += 1
-
- if wrong_count > 0:
- show_error(\"Skipped %s file(s) with unsupported extension.\" % wrong_count)
-
- if file_list.is_empty():
- show_error(\"No valid files or directories to process.\")
- return
-
- load_images()
-
-func load_images():
- texture_list.clear()
-
- for image in grid.get_children():
- image.free()
-
- for image in %StashImages.get_children():
- image.free()
- update_stash()
-
- var size_map: Dictionary
-
- if not file_list.is_empty():
- image_list = file_list.map(func(file: String):
- var image := Image.load_from_file(file)
- if image:
- image.set_meta(&\"path\", file)
- return image)
-
- for image in image_list:
- if not image:
- continue
-
- if not image.get_size() in size_map:
- size_map[image.get_size()] = []
- size_map[image.get_size()].append(image)
-
- var output_name: String
- var most_common_size: Vector2i
- var most_common_count: int
-
- for size in size_map:
- if size_map[size].size() > most_common_count:
- most_common_size = size
- most_common_count = size_map[size].size()
-
- for image in size_map[most_common_size]:
- if output_path.is_empty():
- var path: String = image.get_meta(&\"path\", \"\")
- output_path = path.get_base_dir()
- output_name = path.get_base_dir().get_file()
-
- images_to_process.append(image)
- size_map.clear()
-
- if not output_name.is_empty() and %CustomName.text.is_empty():
- %CustomName.text = output_name
- update_save_button()
-
- if images_to_process.size() < file_list.size():
- show_error(\"Rejected %s image(s) due to size mismatch.\" % (file_list.size() - images_to_process.size()))
-
- if images_to_process.size() == 1:
- if file_list.size() > 1:
- images_to_process.clear()
- show_error(\"Only one dropped image was valid.\")
- else:
- %SplitPreview.texture = ImageTexture.create_from_image(images_to_process[0])
- $SplitDialog.reset_size()
- $SplitDialog.popup_centered()
-
- return
-
- $Status.show()
- %CenterContainer.hide()
-
- image_count = images_to_process.size()
- %Columns.max_value = image_count
-
- threshold = %Threshold.value
- min_x = 9999999
- min_y = 9999999
- max_x = -9999999
- max_y = -9999999
-
- set_process(true)
-
- await images_processed
-
- for texture in texture_list:
- add_frame(texture)
-
- toggle_auto(auto)
- refresh_margin()
-
- $Status.hide()
- %CenterContainer.show()
-
-var threshold: float
-var min_x: int
-var min_y: int
-var max_x: int
-var max_y: int
-
-func _process(delta: float) -> void:
- if not images_to_process.is_empty():
- var image: Image = images_to_process.pop_front()
- $Status.text = str(\"Preprocessing image \", image_count - images_to_process.size(), \"/\", image_count)
-
- for x in image.get_width():
- for y in image.get_height():
- if image.get_pixel(x, y).a >= threshold:
- min_x = mini(min_x, x)
- min_y = mini(min_y, y)
- max_x = maxi(max_x, x)
- max_y = maxi(max_y, y)
-
- images_to_texturize.append(image)
- elif not images_to_texturize.is_empty():
- var rect := Rect2i(min_x, min_y, max_x - min_x + 1, max_y - min_y + 1)
- var image: Image = images_to_texturize.pop_front()
- $Status.text = str(\"Creating texture \", image_count - images_to_texturize.size(), \"/\", image_count)
-
- var true_image := Image.create(rect.size.x, rect.size.y, false, image.get_format())
- true_image.blit_rect(image, rect, Vector2())
-
- var texture := ImageTexture.create_from_image(true_image)
- texture_list.append(texture)
-
- if images_to_texturize.is_empty():
- set_process(false)
- images_processed.emit()
- if first_time:
- recenter()
- first_time = false
-
-func toggle_grid(show: bool) -> void:
- get_tree().call_group(&\"frame\", &\"set_display_background\", show)
-
-func toggle_auto(button_pressed: bool) -> void:
- %Columns.editable = not button_pressed
- auto = button_pressed
-
- if button_pressed:
- var best: int
- var best_score = -9999999
-
- for i in range(1, image_count + 1):
- var cols = i
- var rows = ceili(image_count / float(i))
-
- var score = image_count - cols * rows - maxi(cols, rows) - rows
- if score > best_score:
- best = i
- best_score = score
-
- grid.columns = best
- else:
- grid.columns = %Columns.value
- refresh_grid()
-
-func hmargin_changed(value: float) -> void:
- margin.x = value
- refresh_margin()
-
-func vmargin_changed(value: float) -> void:
- margin.y = value
- refresh_margin()
-
-func refresh_margin():
- get_tree().call_group(&\"frame\", &\"set_frame_margin\", margin)
-
-func columns_changed(value: float) -> void:
- grid.columns = value
- refresh_grid()
-
-func refresh_grid():
- var coord: Vector2
- var dark = false
-
- for rect in grid.get_children():
- rect.set_background_color(Color(0, 0, 0, 0.2 if dark else 0.1))
- dark = not dark
- coord.x += 1
-
- if coord.x == grid.columns:
- coord.x = 0
- coord.y += 1
- dark = int(coord.y) % 2 == 1
-
-func save_png() -> void:
- var image_size: Vector2 = grid.get_child(0).get_minimum_size()
-
- var image := Image.create(image_size.x * grid.columns, image_size.y * (ceil(grid.get_child_count() / float(grid.columns))), false, Image.FORMAT_RGBA8)
-
- for rect in grid.get_children():
- image.blit_rect(rect.get_texture_data(), Rect2(Vector2(), image_size), rect.get_position2())
-
- image.save_png(output_path.path_join(%CustomName.text) + \".png\")
-
-func show_error(text: String):
- if not %Error.visible:
- %Error.show()
- else:
- %Error.text += \"\\n\"
- %Error.text += text
- %Timer.start()
-
-func error_hidden() -> void:
- %Error.text = \"\"
-
-func _input(event: InputEvent) -> void:
- if event is InputEventMouseButton:
- var cc: Control = %CenterContainer
-
- if event.button_index == MOUSE_BUTTON_MIDDLE:
- if event.pressed:
- pan_origin = get_local_mouse_position()
- pan_start = cc.position
- else:
- pan_origin = Vector2()
-
- if event.button_index == MOUSE_BUTTON_WHEEL_DOWN:
- var lm = cc.get_local_mouse_position()
- cc.scale -= Vector2.ONE * 0.05
- if cc.scale.x <= 0:
- cc.scale = Vector2.ONE * 0.05
-
- cc.position -= (lm - cc.get_local_mouse_position()) * cc.scale
- elif event.button_index == MOUSE_BUTTON_WHEEL_UP:
- var lm = cc.get_local_mouse_position()
- cc.scale += Vector2.ONE * 0.05
- cc.position -= (lm - cc.get_local_mouse_position()) * cc.scale
-
- if event is InputEventMouseMotion:
- if pan_origin != Vector2():
- %CenterContainer.position = pan_start + (get_local_mouse_position() - pan_origin)
-
-func recenter() -> void:
- %CenterContainer.position = get_viewport().size / 2 - Vector2i(%CenterContainer.size) / 2
- %CenterContainer.scale = Vector2.ONE
-
-func update_split_preview():
- %SplitPreview.queue_redraw()
-
-func draw_split_preview() -> void:
- var preview: TextureRect = %SplitPreview
- var frame_count := Vector2(%SplitX.value, %SplitY.value)
- var frame_size := preview.size / frame_count
-
- for x in range(1, frame_count.x):
- for y in int(frame_count.y):
- preview.draw_line(frame_size * Vector2(x, y), frame_size * Vector2(x, y + 1), Color.WHITE)
- preview.draw_line(frame_size * Vector2(x, y) + Vector2.RIGHT, frame_size * Vector2(x, y + 1) + Vector2.RIGHT, Color.BLACK)
-
- for y in range(1, frame_count.y):
- for x in int(frame_count.x):
- preview.draw_line(frame_size * Vector2(x, y), frame_size * Vector2(x + 1, y), Color.WHITE)
- preview.draw_line(frame_size * Vector2(x, y) + Vector2.DOWN, frame_size * Vector2(x + 1, y) + Vector2.DOWN, Color.BLACK)
-
-func split_spritesheet() -> void:
- file_list.clear()
- image_list.clear()
-
- var image: Image = images_to_process[0]
- var sub_image_size := image.get_size() / Vector2i(%SplitX.value, %SplitY.value)
-
- for y in %SplitY.value:
- for x in %SplitX.value:
- image_list.append(image.get_region(Rect2i(Vector2i(x, y) * sub_image_size, sub_image_size)))
-
- images_to_process.clear()
- load_images()
-
-func remove_frame(frame):
- var image: Image = frame.get_texture_data()
- var texture := ImageTexture.create_from_image(image)
-
- var button := TextureButton.new()
- button.texture_normal = texture
- button.custom_minimum_size = Vector2(128, 128)
- button.stretch_mode = TextureButton.STRETCH_KEEP_ASPECT_CENTERED
- button.ignore_texture_size = true
- button.pressed.connect(re_add_image.bind(button), CONNECT_DEFERRED)
- %StashImages.add_child(button)
-
- var ref := ReferenceRect.new()
- button.add_child(ref)
- ref.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
- ref.mouse_filter = Control.MOUSE_FILTER_IGNORE
- ref.editor_only = false
-
- frame.free()
- refresh_grid()
- update_stash()
-
-func update_stash():
- %Stash.disabled = %StashImages.get_child_count() == 0
-
-func re_add_image(tb: TextureButton):
- add_frame(tb.texture_normal)
- tb.free()
- refresh_grid()
- update_stash()
-
- if %Stash.disabled:
- $StashDialog.hide()
-
-func add_frame(texture: Texture2D):
- var rect := preload(\"res://addons/SpritesheetGenerator/SpritesheetFrame.tscn\").instantiate()
- rect.set_texture(texture)
- rect.set_display_background(%DisplayGrid.button_pressed)
- rect.set_frame_margin(margin)
- grid.add_child(rect)
-
-func update_save_button() -> void:
- %SavePNG.disabled = %CustomName.text.is_empty()
-"
-
-[sub_resource type="StyleBoxFlat" id="5"]
-content_margin_left = 20.0
-content_margin_top = 20.0
-content_margin_right = 20.0
-content_margin_bottom = 20.0
-bg_color = Color(0, 0, 0, 0.25098)
-
-[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_kjgn5"]
-texture = ExtResource("1_hs1uu")
-axis_stretch_horizontal = 1
-axis_stretch_vertical = 1
-
-[node name="Main" type="HBoxContainer"]
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-mouse_filter = 2
-script = SubResource("1")
-
-[node name="MarginContainer" type="PanelContainer" parent="."]
-layout_mode = 2
-theme_override_styles/panel = SubResource("5")
-
-[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"]
-layout_mode = 2
-theme_override_constants/separation = 10
-
-[node name="Label5" type="Label" parent="MarginContainer/VBoxContainer"]
-layout_mode = 2
-text = "Alpha Threshold"
-horizontal_alignment = 1
-
-[node name="Threshold" type="SpinBox" parent="MarginContainer/VBoxContainer"]
-unique_name_in_owner = true
-layout_mode = 2
-max_value = 1.0
-step = 0.005
-value = 0.9
-
-[node name="Reload" type="Button" parent="MarginContainer/VBoxContainer"]
-unique_name_in_owner = true
-layout_mode = 2
-disabled = true
-text = "Reload"
-
-[node name="HSeparator" type="HSeparator" parent="MarginContainer/VBoxContainer"]
-layout_mode = 2
-
-[node name="Label" type="Label" parent="MarginContainer/VBoxContainer"]
-layout_mode = 2
-text = "Columns"
-horizontal_alignment = 1
-
-[node name="Columns" type="SpinBox" parent="MarginContainer/VBoxContainer"]
-unique_name_in_owner = true
-layout_mode = 2
-min_value = 1.0
-value = 1.0
-editable = false
-
-[node name="Grid" type="CheckButton" parent="MarginContainer/VBoxContainer"]
-layout_mode = 2
-button_pressed = true
-text = "Auto"
-
-[node name="Label3" type="Label" parent="MarginContainer/VBoxContainer"]
-layout_mode = 2
-text = "Horizontal Margin"
-horizontal_alignment = 1
-
-[node name="MarginH" type="SpinBox" parent="MarginContainer/VBoxContainer"]
-layout_mode = 2
-value = 1.0
-suffix = "px"
-
-[node name="Label4" type="Label" parent="MarginContainer/VBoxContainer"]
-layout_mode = 2
-text = "Vertical Margin"
-horizontal_alignment = 1
-
-[node name="MarginV" type="SpinBox" parent="MarginContainer/VBoxContainer"]
-layout_mode = 2
-max_value = 128.0
-value = 1.0
-suffix = "px"
-
-[node name="Stash" type="Button" parent="MarginContainer/VBoxContainer"]
-unique_name_in_owner = true
-layout_mode = 2
-disabled = true
-text = "Image Stash"
-
-[node name="HSeparator2" type="HSeparator" parent="MarginContainer/VBoxContainer"]
-layout_mode = 2
-
-[node name="Button" type="Button" parent="MarginContainer/VBoxContainer"]
-layout_mode = 2
-text = "Recenter View
-"
-
-[node name="DisplayGrid" type="CheckBox" parent="MarginContainer/VBoxContainer"]
-unique_name_in_owner = true
-layout_mode = 2
-button_pressed = true
-text = "Show Grid"
-
-[node name="HSeparator3" type="HSeparator" parent="MarginContainer/VBoxContainer"]
-layout_mode = 2
-
-[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/VBoxContainer"]
-layout_mode = 2
-
-[node name="CustomName" type="LineEdit" parent="MarginContainer/VBoxContainer/HBoxContainer"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 3
-placeholder_text = "Image Name"
-
-[node name="SavePNG" type="Button" parent="MarginContainer/VBoxContainer"]
-unique_name_in_owner = true
-layout_mode = 2
-disabled = true
-text = "Save PNG"
-
-[node name="Status" type="Label" parent="."]
-layout_mode = 2
-size_flags_horizontal = 3
-size_flags_vertical = 3
-text = "Drop folder or image files here to start.
-
-Images should be of the same size. If their sizes don't match, the generator will try to use the dominating size.
-
-The images will be automatically cropped based on the Alpha Threshold value. Greater value means more exact crop.
-
-Supported formats: %s
-
-If you drop a single image, the generator will instead edit it as spritesheet."
-horizontal_alignment = 1
-vertical_alignment = 1
-
-[node name="View" type="CanvasLayer" parent="."]
-layer = -1
-
-[node name="CenterContainer" type="CenterContainer" parent="View"]
-unique_name_in_owner = true
-visible = false
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-size_flags_horizontal = 3
-
-[node name="Background" type="ColorRect" parent="View/CenterContainer"]
-unique_name_in_owner = true
-layout_mode = 2
-mouse_filter = 1
-color = Color(0, 0.501961, 0.501961, 1)
-
-[node name="GridContainer" type="GridContainer" parent="View/CenterContainer"]
-unique_name_in_owner = true
-layout_mode = 2
-theme_override_constants/h_separation = 0
-theme_override_constants/v_separation = 0
-columns = 3
-
-[node name="VBoxContainer" type="GridContainer" parent="View"]
-anchors_preset = 3
-anchor_left = 1.0
-anchor_top = 1.0
-anchor_right = 1.0
-anchor_bottom = 1.0
-offset_left = -40.0
-offset_top = -40.0
-grow_horizontal = 0
-grow_vertical = 0
-mouse_filter = 2
-columns = 3
-
-[node name="Label" type="Label" parent="View/VBoxContainer"]
-layout_mode = 2
-text = "LMB"
-horizontal_alignment = 1
-
-[node name="VSeparator" type="VSeparator" parent="View/VBoxContainer"]
-layout_mode = 2
-
-[node name="Label2" type="Label" parent="View/VBoxContainer"]
-layout_mode = 2
-text = "rearrange images"
-
-[node name="Label3" type="Label" parent="View/VBoxContainer"]
-layout_mode = 2
-text = "RMB"
-horizontal_alignment = 1
-
-[node name="VSeparator2" type="VSeparator" parent="View/VBoxContainer"]
-layout_mode = 2
-
-[node name="Label4" type="Label" parent="View/VBoxContainer"]
-layout_mode = 2
-text = "delete images"
-
-[node name="Label5" type="Label" parent="View/VBoxContainer"]
-layout_mode = 2
-text = "MMB"
-horizontal_alignment = 1
-
-[node name="VSeparator3" type="VSeparator" parent="View/VBoxContainer"]
-layout_mode = 2
-
-[node name="Label6" type="Label" parent="View/VBoxContainer"]
-layout_mode = 2
-text = "pan view"
-
-[node name="CanvasLayer" type="CanvasLayer" parent="."]
-
-[node name="Error" type="Label" parent="CanvasLayer"]
-unique_name_in_owner = true
-modulate = Color(1, 0, 0, 1)
-anchors_preset = 12
-anchor_top = 1.0
-anchor_right = 1.0
-anchor_bottom = 1.0
-offset_top = -14.0
-grow_horizontal = 2
-grow_vertical = 0
-size_flags_vertical = 0
-horizontal_alignment = 1
-
-[node name="Timer" type="Timer" parent="CanvasLayer"]
-unique_name_in_owner = true
-wait_time = 5.0
-one_shot = true
-
-[node name="SplitDialog" type="ConfirmationDialog" parent="."]
-title = "Edit Spritesheet"
-position = Vector2i(-500, 0)
-size = Vector2i(272, 343)
-visible = true
-
-[node name="VBoxContainer" type="VBoxContainer" parent="SplitDialog"]
-offset_left = 8.0
-offset_top = 8.0
-offset_right = 264.0
-offset_bottom = 294.0
-
-[node name="Label" type="Label" parent="SplitDialog/VBoxContainer"]
-layout_mode = 2
-text = "Split Frames"
-horizontal_alignment = 1
-
-[node name="HBoxContainer" type="HBoxContainer" parent="SplitDialog/VBoxContainer"]
-layout_mode = 2
-alignment = 1
-
-[node name="SplitX" type="SpinBox" parent="SplitDialog/VBoxContainer/HBoxContainer"]
-unique_name_in_owner = true
-layout_mode = 2
-min_value = 1.0
-max_value = 1000.0
-value = 1.0
-select_all_on_focus = true
-
-[node name="Label" type="Label" parent="SplitDialog/VBoxContainer/HBoxContainer"]
-layout_mode = 2
-text = "x"
-
-[node name="SplitY" type="SpinBox" parent="SplitDialog/VBoxContainer/HBoxContainer"]
-unique_name_in_owner = true
-layout_mode = 2
-min_value = 1.0
-max_value = 1000.0
-value = 1.0
-select_all_on_focus = true
-
-[node name="CenterContainer" type="CenterContainer" parent="SplitDialog/VBoxContainer"]
-layout_mode = 2
-size_flags_vertical = 3
-
-[node name="PanelContainer" type="PanelContainer" parent="SplitDialog/VBoxContainer/CenterContainer"]
-layout_mode = 2
-theme_override_styles/panel = SubResource("StyleBoxTexture_kjgn5")
-
-[node name="SplitPreview" type="TextureRect" parent="SplitDialog/VBoxContainer/CenterContainer/PanelContainer"]
-unique_name_in_owner = true
-layout_mode = 2
-
-[node name="StashDialog" type="AcceptDialog" parent="."]
-title = "Image Stash"
-position = Vector2i(-500, 500)
-size = Vector2i(309, 100)
-visible = true
-
-[node name="VBoxContainer" type="VBoxContainer" parent="StashDialog"]
-offset_left = 8.0
-offset_top = 8.0
-offset_right = 301.0
-offset_bottom = 51.0
-
-[node name="Label" type="Label" parent="StashDialog/VBoxContainer"]
-layout_mode = 2
-text = "Click frame to re-add it to spritesheet."
-horizontal_alignment = 1
-
-[node name="StashImages" type="HFlowContainer" parent="StashDialog/VBoxContainer"]
-unique_name_in_owner = true
-layout_mode = 2
-
-[connection signal="pressed" from="MarginContainer/VBoxContainer/Reload" to="." method="load_images"]
-[connection signal="value_changed" from="MarginContainer/VBoxContainer/Columns" to="." method="columns_changed"]
-[connection signal="toggled" from="MarginContainer/VBoxContainer/Grid" to="." method="toggle_auto"]
-[connection signal="value_changed" from="MarginContainer/VBoxContainer/MarginH" to="." method="hmargin_changed"]
-[connection signal="value_changed" from="MarginContainer/VBoxContainer/MarginV" to="." method="vmargin_changed"]
-[connection signal="pressed" from="MarginContainer/VBoxContainer/Stash" to="StashDialog" method="popup_centered_ratio" binds= [0.5]]
-[connection signal="pressed" from="MarginContainer/VBoxContainer/Button" to="." method="recenter"]
-[connection signal="toggled" from="MarginContainer/VBoxContainer/DisplayGrid" to="." method="toggle_grid"]
-[connection signal="text_changed" from="MarginContainer/VBoxContainer/HBoxContainer/CustomName" to="." method="update_save_button" unbinds=1]
-[connection signal="pressed" from="MarginContainer/VBoxContainer/SavePNG" to="." method="save_png"]
-[connection signal="hidden" from="CanvasLayer/Error" to="." method="error_hidden"]
-[connection signal="timeout" from="CanvasLayer/Timer" to="CanvasLayer/Error" method="hide"]
-[connection signal="confirmed" from="SplitDialog" to="." method="split_spritesheet"]
-[connection signal="value_changed" from="SplitDialog/VBoxContainer/HBoxContainer/SplitX" to="." method="update_split_preview" unbinds=1]
-[connection signal="value_changed" from="SplitDialog/VBoxContainer/HBoxContainer/SplitY" to="." method="update_split_preview" unbinds=1]
-[connection signal="draw" from="SplitDialog/VBoxContainer/CenterContainer/PanelContainer/SplitPreview" to="." method="draw_split_preview"]
diff --git a/addons/SpritesheetGenerator/plugin.cfg b/addons/SpritesheetGenerator/plugin.cfg
deleted file mode 100644
index 08a28bf..0000000
--- a/addons/SpritesheetGenerator/plugin.cfg
+++ /dev/null
@@ -1,7 +0,0 @@
-[plugin]
-
-name="Spritesheet Generator"
-description="Generates cropped spritesheets from multiple images."
-author="KoBeWi"
-version="1.2"
-script="SpriteSheetGenerator.gd"
diff --git a/project.godot b/project.godot
index cefdef2..1a7434b 100644
--- a/project.godot
+++ b/project.godot
@@ -32,14 +32,17 @@ gdscript/completion/autocomplete_setters_and_getters=true
[display]
-window/size/viewport_width=800
-window/size/viewport_height=500
-window/size/resizable=false
window/energy_saving/keep_screen_on=false
+window/stretch/mode="canvas_items"
+window/stretch/aspect="expand"
+
+[dotnet]
+
+project/assembly_name="Dress Up Zack"
[editor_plugins]
-enabled=PackedStringArray("res://addons/SpritesheetGenerator/plugin.cfg", "res://addons/fontawesome/plugin.cfg")
+enabled=PackedStringArray("res://addons/fontawesome/plugin.cfg")
[file_customization]
diff --git a/scenes/demo.tscn b/scenes/demo.tscn
deleted file mode 100644
index 5337085..0000000
--- a/scenes/demo.tscn
+++ /dev/null
@@ -1,18 +0,0 @@
-[gd_scene load_steps=3 format=3 uid="uid://bguec0ft5ygk4"]
-
-[ext_resource type="PackedScene" uid="uid://bvbelmb6rvy4f" path="res://scenes/platform.tscn" id="1_31w52"]
-[ext_resource type="PackedScene" uid="uid://dn152ouc7l21p" path="res://scenes/object.tscn" id="2_cgl4f"]
-
-[node name="Demo" type="Node2D"]
-
-[node name="Platform" parent="." instance=ExtResource("1_31w52")]
-position = Vector2(170, 92)
-
-[node name="Platform2" parent="." instance=ExtResource("1_31w52")]
-position = Vector2(419, 84)
-
-[node name="Platform3" parent="." instance=ExtResource("1_31w52")]
-position = Vector2(296, 286)
-
-[node name="Object" parent="." instance=ExtResource("2_cgl4f")]
-position = Vector2(169, 90)
diff --git a/scenes/game.tscn b/scenes/game.tscn
index d8201a7..6d5c005 100644
--- a/scenes/game.tscn
+++ b/scenes/game.tscn
@@ -1,49 +1,154 @@
-[gd_scene load_steps=9 format=3 uid="uid://cvr2aries2lhr"]
+[gd_scene load_steps=17 format=3 uid="uid://cvr2aries2lhr"]
+[ext_resource type="Script" path="res://scripts/game.gd" id="1_qt3fe"]
[ext_resource type="Texture2D" uid="uid://33g80p0qnfw4" path="res://sprites/world/background.svg" id="1_uee2i"]
-[ext_resource type="Texture2D" uid="uid://bi7ayrxnn7hex" path="res://sprites/clothes/icrazy_frame.svg" id="2_n1kmf"]
+[ext_resource type="Texture2D" uid="uid://bi7ayrxnn7hex" path="res://sprites/world/icrazy_frame.svg" id="2_n1kmf"]
[ext_resource type="Texture2D" uid="uid://cmv58t1dfgsov" path="res://sprites/world/stand.svg" id="2_q0w7j"]
-[ext_resource type="Texture2D" uid="uid://dteiup73cqn4o" path="res://sprites/clothes/lights.png" id="3_bbsyl"]
-[ext_resource type="PackedScene" uid="uid://dn152ouc7l21p" path="res://scenes/object.tscn" id="6_6t4pu"]
+[ext_resource type="Texture2D" uid="uid://d1u3w61r0uv7p" path="res://sprites/world/boxersOfAmericaFrame.png" id="4_327cy"]
[ext_resource type="PackedScene" uid="uid://detf8uwimqp3v" path="res://scenes/character.tscn" id="6_tdil0"]
-[ext_resource type="PackedScene" uid="uid://bvbelmb6rvy4f" path="res://scenes/platform.tscn" id="7_vqx6c"]
+[ext_resource type="Texture2D" uid="uid://405burxtvied" path="res://sprites/clothes/sweat_pants.svg" id="7_7tx8y"]
[ext_resource type="Texture2D" uid="uid://venieklgphn5" path="res://sprites/clothes/blue_camo_jeans.svg" id="8_bqcl8"]
+[ext_resource type="Texture2D" uid="uid://8vrl1mmcm5is" path="res://sprites/clothes/beat_up_jeans.svg" id="8_jisbs"]
+[ext_resource type="Texture2D" uid="uid://310b2835i5d8" path="res://sprites/clothes/dj_shirt.png" id="8_r4o7r"]
+[ext_resource type="Texture2D" uid="uid://dt1tsnusorwv8" path="res://sprites/clothes/korm_shirt.png" id="11_6ilrq"]
+[ext_resource type="Texture2D" uid="uid://clakkue2mohs4" path="res://sprites/ui/greenBtn.png" id="14_yk2bu"]
+[ext_resource type="Texture2D" uid="uid://cd8mirubbhn10" path="res://sprites/ui/redBtn.png" id="15_g5gd1"]
+[ext_resource type="Texture2D" uid="uid://wr3ns0ywb75q" path="res://sprites/logo.png" id="16_y58oj"]
+[ext_resource type="Texture2D" uid="uid://b0sf2e2e5jfab" path="res://sprites/clothes/z_shirt.png" id="17_yoe0e"]
+
+[sub_resource type="SpriteFrames" id="SpriteFrames_jjbgs"]
+animations = [{
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("7_7tx8y")
+}, {
+"duration": 1.0,
+"texture": ExtResource("8_jisbs")
+}, {
+"duration": 1.0,
+"texture": ExtResource("8_bqcl8")
+}],
+"loop": true,
+"name": &"bottoms",
+"speed": 1.0
+}, {
+"frames": [{
+"duration": 1.0,
+"texture": ExtResource("8_r4o7r")
+}, {
+"duration": 1.0,
+"texture": ExtResource("11_6ilrq")
+}, {
+"duration": 1.0,
+"texture": ExtResource("17_yoe0e")
+}],
+"loop": true,
+"name": &"tops",
+"speed": 5.0
+}]
[node name="Game" type="Node"]
+script = ExtResource("1_qt3fe")
[node name="Background" type="Sprite2D" parent="."]
-position = Vector2(400, 240)
+position = Vector2(577.603, 328.303)
+scale = Vector2(1.14718, 1.13943)
texture = ExtResource("1_uee2i")
metadata/_edit_lock_ = true
[node name="Stand" type="Sprite2D" parent="."]
-position = Vector2(125, 461)
-scale = Vector2(1.28991, 1.3328)
+position = Vector2(564.62, 543.689)
+scale = Vector2(1.79062, 1.7736)
texture = ExtResource("2_q0w7j")
-[node name="PictureFrame" type="Sprite2D" parent="."]
-position = Vector2(107.454, 127.574)
+[node name="BoxersOfAmericaFrame" type="Sprite2D" parent="."]
+position = Vector2(942.068, 139.049)
+scale = Vector2(1.7514, 1.86172)
+texture = ExtResource("4_327cy")
+
+[node name="iCrazyFrame" type="Sprite2D" parent="."]
+position = Vector2(183.37, 149.267)
+scale = Vector2(1.25573, 1.3008)
texture = ExtResource("2_n1kmf")
-[node name="Light3D" type="PointLight2D" parent="PictureFrame"]
-position = Vector2(35.118, -14.56)
-texture = ExtResource("3_bbsyl")
-metadata/_edit_lock_ = true
-
[node name="Character" parent="." instance=ExtResource("6_tdil0")]
-position = Vector2(117, 234)
+position = Vector2(557.567, 197.468)
+scale = Vector2(1.5, 1.5)
+
+[node name="Bottoms" type="AnimatedSprite2D" parent="."]
+position = Vector2(570.883, 453.423)
+scale = Vector2(1.85571, 1.88987)
+sprite_frames = SubResource("SpriteFrames_jjbgs")
+animation = &"bottoms"
+
+[node name="Tops" type="AnimatedSprite2D" parent="."]
+position = Vector2(579.842, 318.193)
+scale = Vector2(1.5, 1.5)
+sprite_frames = SubResource("SpriteFrames_jjbgs")
+animation = &"tops"
+
+[node name="CanvasLayer" type="CanvasLayer" parent="."]
+
+[node name="Control" type="Control" parent="CanvasLayer"]
+layout_mode = 3
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
metadata/_edit_lock_ = true
-[node name="Bottoms" parent="." groups=["pants"] instance=ExtResource("7_vqx6c")]
-position = Vector2(120, 409)
+[node name="TopsFwdBtn" type="TextureButton" parent="CanvasLayer/Control"]
+layout_mode = 0
+offset_left = 733.043
+offset_top = 272.435
+offset_right = 776.043
+offset_bottom = 335.435
+scale = Vector2(1.5, 1.5)
+texture_normal = ExtResource("14_yk2bu")
+stretch_mode = 4
-[node name="Platform" parent="." groups=["pants"] instance=ExtResource("7_vqx6c")]
-position = Vector2(335, 78)
+[node name="TopsBckBtn" type="TextureButton" parent="CanvasLayer/Control"]
+layout_mode = 0
+offset_left = 322.285
+offset_top = 269.324
+offset_right = 365.285
+offset_bottom = 332.324
+scale = Vector2(1.5, 1.5)
+texture_normal = ExtResource("15_g5gd1")
-[node name="Object" parent="." instance=ExtResource("6_6t4pu")]
-position = Vector2(335, 79)
-group = "pants"
-texture = ExtResource("8_bqcl8")
+[node name="BottomsBckBtn" type="TextureButton" parent="CanvasLayer/Control"]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.273624
+anchor_top = 0.59627
+anchor_right = 0.330916
+anchor_bottom = 0.753677
+offset_top = -1.90735e-05
+offset_right = 1.52588e-05
+offset_bottom = -1.04904e-05
+texture_normal = ExtResource("15_g5gd1")
+stretch_mode = 4
+metadata/_edit_use_anchors_ = true
-[node name="TileMap" type="TileMap" parent="."]
-format = 2
+[node name="BottomsFwdBtn" type="TextureButton" parent="CanvasLayer/Control"]
+layout_mode = 1
+anchors_preset = -1
+anchor_left = 0.636238
+anchor_top = 0.600003
+anchor_right = 0.695266
+anchor_bottom = 0.752781
+offset_left = 1.52588e-05
+texture_normal = ExtResource("14_yk2bu")
+stretch_mode = 4
+metadata/_edit_use_anchors_ = true
+
+[node name="Logo" type="Sprite2D" parent="."]
+position = Vector2(1052.16, 511.503)
+scale = Vector2(0.225814, 0.216046)
+texture = ExtResource("16_y58oj")
+
+[connection signal="pressed" from="CanvasLayer/Control/TopsFwdBtn" to="." method="_on_tops_fwd_btn_pressed"]
+[connection signal="pressed" from="CanvasLayer/Control/TopsBckBtn" to="." method="_on_tops_bck_btn_pressed"]
+[connection signal="pressed" from="CanvasLayer/Control/BottomsBckBtn" to="." method="_on_bottoms_bck_btn_pressed"]
+[connection signal="pressed" from="CanvasLayer/Control/BottomsFwdBtn" to="." method="_on_bottoms_fwd_btn_pressed"]
diff --git a/scenes/object.tscn b/scenes/object.tscn
deleted file mode 100644
index ff1a068..0000000
--- a/scenes/object.tscn
+++ /dev/null
@@ -1,26 +0,0 @@
-[gd_scene load_steps=3 format=3 uid="uid://dn152ouc7l21p"]
-
-[ext_resource type="Script" path="res://scripts/object.gd" id="1_tyfcj"]
-
-[sub_resource type="RectangleShape2D" id="RectangleShape2D_xd2jg"]
-size = Vector2(111, 125.5)
-
-[node name="Object" type="Node2D"]
-script = ExtResource("1_tyfcj")
-
-[node name="Sprite2D" type="Sprite2D" parent="."]
-position = Vector2(4.5, 6.5)
-scale = Vector2(1.32143, 1.32292)
-
-[node name="Area2D" type="Area2D" parent="."]
-metadata/_edit_lock_ = true
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"]
-position = Vector2(5, 7)
-shape = SubResource("RectangleShape2D_xd2jg")
-metadata/_edit_lock_ = true
-
-[connection signal="body_entered" from="Area2D" to="." method="_on_area_2d_body_entered"]
-[connection signal="body_exited" from="Area2D" to="." method="_on_area_2d_body_exited"]
-[connection signal="mouse_entered" from="Area2D" to="." method="_on_area_2d_mouse_entered"]
-[connection signal="mouse_exited" from="Area2D" to="." method="_on_area_2d_mouse_exited"]
diff --git a/scenes/platform.tscn b/scenes/platform.tscn
deleted file mode 100644
index e03becf..0000000
--- a/scenes/platform.tscn
+++ /dev/null
@@ -1,20 +0,0 @@
-[gd_scene load_steps=4 format=3 uid="uid://bvbelmb6rvy4f"]
-
-[ext_resource type="Script" path="res://scripts/platform.gd" id="1_xgdk6"]
-[ext_resource type="Texture2D" uid="uid://c52oho3nvkt45" path="res://sprites/clothes/scale.png" id="2_ic83p"]
-
-[sub_resource type="RectangleShape2D" id="RectangleShape2D_ieyrm"]
-size = Vector2(111, 126)
-
-[node name="Platform" type="StaticBody2D"]
-script = ExtResource("1_xgdk6")
-
-[node name="Sprite2D" type="Sprite2D" parent="."]
-position = Vector2(4.5, 7)
-scale = Vector2(1.32143, 1.28571)
-texture = ExtResource("2_ic83p")
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
-position = Vector2(4.5, 7)
-shape = SubResource("RectangleShape2D_ieyrm")
-metadata/_edit_lock_ = true
diff --git a/scenes/wardrobe.tscn b/scenes/wardrobe.tscn
deleted file mode 100644
index 8f718ef..0000000
--- a/scenes/wardrobe.tscn
+++ /dev/null
@@ -1,51 +0,0 @@
-[gd_scene load_steps=3 format=3 uid="uid://crwoe1shep3qn"]
-
-[ext_resource type="PackedScene" uid="uid://dn152ouc7l21p" path="res://scenes/object.tscn" id="1_0jlsi"]
-
-[sub_resource type="RectangleShape2D" id="RectangleShape2D_oig6u"]
-size = Vector2(111, 125.5)
-
-[node name="Wordrobe" type="Panel"]
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-metadata/_edit_use_anchors_ = true
-
-[node name="Grid" type="GridContainer" parent="."]
-layout_mode = 2
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-size_flags_horizontal = 3
-size_flags_vertical = 3
-columns = 4
-metadata/_edit_use_anchors_ = true
-
-[node name="Object" parent="Grid" instance=ExtResource("1_0jlsi")]
-position = Vector2(51, 54)
-texture = null
-
-[node name="Bottoms" type="StaticBody2D" parent="Grid" groups=["bottoms"]]
-
-[node name="ColorRect" type="ColorRect" parent="Grid/Bottoms"]
-custom_minimum_size = Vector2(111, 125)
-anchors_preset = 8
-anchor_left = 0.5
-anchor_top = 0.5
-anchor_right = 0.5
-anchor_bottom = 0.5
-offset_left = -49.0
-offset_top = 116.0
-offset_right = 62.0
-offset_bottom = 241.0
-grow_horizontal = 2
-grow_vertical = 2
-color = Color(1, 1, 1, 0.0980392)
-metadata/_edit_use_anchors_ = true
-
-[node name="CollisionShape2D" type="CollisionShape2D" parent="Grid/Bottoms"]
-position = Vector2(6, 178.25)
-shape = SubResource("RectangleShape2D_oig6u")
diff --git a/screenshot.gif b/screenshot.gif
deleted file mode 100644
index ef6345c..0000000
Binary files a/screenshot.gif and /dev/null differ
diff --git a/screenshot.png b/screenshot.png
new file mode 100644
index 0000000..af34b01
Binary files /dev/null and b/screenshot.png differ
diff --git a/screenshots/main_ui.png.import b/screenshot.png.import
similarity index 69%
rename from screenshots/main_ui.png.import
rename to screenshot.png.import
index 76d3459..1174e39 100644
--- a/screenshots/main_ui.png.import
+++ b/screenshot.png.import
@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
-uid="uid://dycgk1pvyl7fu"
-path="res://.godot/imported/main_ui.png-ac6532fbb861d9876368e8a8c16e4467.ctex"
+uid="uid://bjio4exj7ic6b"
+path="res://.godot/imported/screenshot.png-024a21af5d37bf0f0dd0e2bccdd149d0.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://screenshots/main_ui.png"
-dest_files=["res://.godot/imported/main_ui.png-ac6532fbb861d9876368e8a8c16e4467.ctex"]
+source_file="res://screenshot.png"
+dest_files=["res://.godot/imported/screenshot.png-024a21af5d37bf0f0dd0e2bccdd149d0.ctex"]
[params]
diff --git a/screenshots/main_ui.png b/screenshots/main_ui.png
deleted file mode 100644
index 02461f8..0000000
Binary files a/screenshots/main_ui.png and /dev/null differ
diff --git a/scripts/character.gd b/scripts/character.gd
index 5c590a2..f792632 100644
--- a/scripts/character.gd
+++ b/scripts/character.gd
@@ -1,3 +1,4 @@
+@tool
extends Node2D
@onready var _eyes = $Eyes
diff --git a/scripts/clothing.gd b/scripts/clothing.gd
deleted file mode 100644
index 2bfe0df..0000000
--- a/scripts/clothing.gd
+++ /dev/null
@@ -1,37 +0,0 @@
-# This project is licensed under the GPL-3.0 license.
-# See the LICENSE file in the project root for more information.
-extends TextureRect
-
-var is_draggable = false
-var is_inside_draggable = false
-var body_ref
-
-# Called every frame. 'delta' is the elapsed time since the previous frame.
-func _process(delta):
- if is_draggable:
- if Input.is_action_just_pressed("click"):
- global_position = get_global_mouse_position()
- elif Input.is_action_just_released("click"):
- is_draggable = false
- var tween = get_tree().create_tween()
- if is_inside_draggable:
- tween.tween_property(self,"postion",body_ref.position,0.2).set_ease(Tween.EASE_OUT)
- else:
- tween.tween_property(self,"global_postion",body_ref.position,0.2).set_ease(Tween.EASE_OUT)
-
-func _get_drag_data(at_position):
- var preview_texture = TextureRect.new()
-
- preview_texture.texture = texture
- preview_texture.expand_mode = 1
- preview_texture.size = Vector2(106, 112)
-
- set_drag_preview(preview_texture)
-
- return preview_texture.texture
-
-func _can_drop_data(at_position, data):
- return data is Texture2D
-
-func _drop_data(at_position, data):
- texture = data
diff --git a/scripts/game.gd b/scripts/game.gd
new file mode 100644
index 0000000..3172af2
--- /dev/null
+++ b/scripts/game.gd
@@ -0,0 +1,23 @@
+extends Node
+
+
+@onready var tops = $Tops
+@onready var bottoms = $Bottoms
+
+func _on_tops_fwd_btn_pressed():
+ var current_frame = tops.get_frame()
+ tops.frame = current_frame + 1;
+
+func _on_tops_bck_btn_pressed():
+ var current_frame = tops.get_frame()
+ tops.frame = current_frame + -1;
+
+
+func _on_bottoms_bck_btn_pressed():
+ var current_frame = bottoms.get_frame()
+ bottoms.frame = current_frame + -1;
+
+
+func _on_bottoms_fwd_btn_pressed():
+ var current_frame = bottoms.get_frame()
+ bottoms.frame = current_frame + 1;
diff --git a/scripts/gui.gd b/scripts/gui.gd
deleted file mode 100644
index 20440b7..0000000
--- a/scripts/gui.gd
+++ /dev/null
@@ -1,3 +0,0 @@
-# This project is licensed under the GPL-3.0 license.
-# See the LICENSE file in the project root for more information.
-extends Control
diff --git a/scripts/object.gd b/scripts/object.gd
deleted file mode 100644
index 7183fef..0000000
--- a/scripts/object.gd
+++ /dev/null
@@ -1,61 +0,0 @@
-# This project is licensed under the GPL-3.0 license.
-# See the LICENSE file in the project root for more information.
-@tool
-extends Node2D
-
-@export var group: String = "dropable"
-@export var texture: Texture2D
-
-var is_draggable = false
-var is_inside_dropable = false
-var body_ref
-var offset: Vector2
-
-@onready var sprite = $Sprite2D
-@onready var collsion = $Area2D/CollisionShape2D
-
-func _ready():
- sprite.texture = texture
- collsion.position = sprite.position
-
-# Called every frame. 'delta' is the elapsed time since the previous frame.
-func _process(delta):
- if is_draggable:
- if Input.is_action_just_pressed("click"):
- offset = global_position - get_global_mouse_position()
- Global.is_dragging = true
-
- if Input.is_action_pressed("click"):
- global_position = get_global_mouse_position() - offset
- elif Input.is_action_just_released("click"):
- Global.is_dragging = false
- var tween = get_tree().create_tween()
- if is_inside_dropable:
- tween.tween_property(self, "position", body_ref.position, 0.2).set_ease(Tween.EASE_OUT)
- else:
- tween.tween_property(self, "global_position", body_ref.position, 0.2).set_ease(Tween.EASE_OUT)
-
-
-func _on_area_2d_body_entered(body):
- if body.is_in_group(group):
- is_inside_dropable = true
- body.modulate = Color(Color.REBECCA_PURPLE, 1)
- scale = Vector2(1.05, 1.05)
- body_ref = body
-
-func _on_area_2d_body_exited(body:StaticBody2D):
- if body.is_in_group(group):
- is_inside_dropable = false
- body.modulate = Color(Color.MEDIUM_PURPLE, .7)
- scale = Vector2(1.05, 1.05)
-
-
-func _on_area_2d_mouse_entered():
- if not Global.is_dragging:
- is_draggable = true
- scale = Vector2(1.05, 1.05)
-
-func _on_area_2d_mouse_exited():
- if not Global.is_dragging:
- is_draggable = false
- scale = Vector2(1, 1)
diff --git a/scripts/platform.gd b/scripts/platform.gd
deleted file mode 100644
index 414ae85..0000000
--- a/scripts/platform.gd
+++ /dev/null
@@ -1,12 +0,0 @@
-# This project is licensed under the GPL-3.0 license.
-# See the LICENSE file in the project root for more information.
-extends StaticBody2D
-
-func _ready():
- modulate = Color(Color.MEDIUM_PURPLE, 0.7)
-
-func _process(delta):
- if Global.is_dragging:
- visible = true
- else:
- visible = false
diff --git a/sprites/clothes/beat_up_jeans.svg b/sprites/clothes/beat_up_jeans.svg
index 65773fa..5b378f0 100644
--- a/sprites/clothes/beat_up_jeans.svg
+++ b/sprites/clothes/beat_up_jeans.svg
@@ -1,15 +1,79 @@
-
-
diff --git a/sprites/clothes/blue-ruffle-logo.afdesign b/sprites/clothes/blue-ruffle-logo.afdesign
new file mode 100644
index 0000000..dad9a94
Binary files /dev/null and b/sprites/clothes/blue-ruffle-logo.afdesign differ
diff --git a/sprites/clothes/blue_camo_jeans.svg b/sprites/clothes/blue_camo_jeans.svg
index 5abd880..4a98b3e 100644
--- a/sprites/clothes/blue_camo_jeans.svg
+++ b/sprites/clothes/blue_camo_jeans.svg
@@ -1,33 +1,151 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
+
diff --git a/sprites/clothes/logo.png b/sprites/clothes/logo.png
new file mode 100644
index 0000000..1855097
Binary files /dev/null and b/sprites/clothes/logo.png differ
diff --git a/addons/SpritesheetGenerator/Checker.png.import b/sprites/clothes/logo.png.import
similarity index 67%
rename from addons/SpritesheetGenerator/Checker.png.import
rename to sprites/clothes/logo.png.import
index 7bcd8ec..554e477 100644
--- a/addons/SpritesheetGenerator/Checker.png.import
+++ b/sprites/clothes/logo.png.import
@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
-uid="uid://bnkl8rujlgv0h"
-path="res://.godot/imported/Checker.png-95b82ca4c05ab143e1e16c56d598421b.ctex"
+uid="uid://ch1y0g1plqys6"
+path="res://.godot/imported/logo.png-68ff395daf2515f85e13ba18ce4a426d.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://addons/SpritesheetGenerator/Checker.png"
-dest_files=["res://.godot/imported/Checker.png-95b82ca4c05ab143e1e16c56d598421b.ctex"]
+source_file="res://sprites/clothes/logo.png"
+dest_files=["res://.godot/imported/logo.png-68ff395daf2515f85e13ba18ce4a426d.ctex"]
[params]
diff --git a/sprites/clothes/scale.png b/sprites/clothes/scale.png
index 17ab738..7a0a9b4 100644
Binary files a/sprites/clothes/scale.png and b/sprites/clothes/scale.png differ
diff --git a/sprites/logo.png b/sprites/logo.png
new file mode 100644
index 0000000..1855097
Binary files /dev/null and b/sprites/logo.png differ
diff --git a/sprites/logo.png.import b/sprites/logo.png.import
new file mode 100644
index 0000000..f422dc9
--- /dev/null
+++ b/sprites/logo.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://wr3ns0ywb75q"
+path="res://.godot/imported/logo.png-9048fb90decc23e071a5e31cbd95178e.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://sprites/logo.png"
+dest_files=["res://.godot/imported/logo.png-9048fb90decc23e071a5e31cbd95178e.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/sprites/ui/greenBtn.png b/sprites/ui/greenBtn.png
new file mode 100644
index 0000000..036fd0d
Binary files /dev/null and b/sprites/ui/greenBtn.png differ
diff --git a/sprites/ui/greenBtn.png.import b/sprites/ui/greenBtn.png.import
new file mode 100644
index 0000000..2205cb0
--- /dev/null
+++ b/sprites/ui/greenBtn.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://clakkue2mohs4"
+path="res://.godot/imported/greenBtn.png-4d4dd91a26d599b1f56f508992a67f2c.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://sprites/ui/greenBtn.png"
+dest_files=["res://.godot/imported/greenBtn.png-4d4dd91a26d599b1f56f508992a67f2c.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/sprites/ui/redBtn.png b/sprites/ui/redBtn.png
new file mode 100644
index 0000000..df6499b
Binary files /dev/null and b/sprites/ui/redBtn.png differ
diff --git a/sprites/ui/redBtn.png.import b/sprites/ui/redBtn.png.import
new file mode 100644
index 0000000..ebc9e50
--- /dev/null
+++ b/sprites/ui/redBtn.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cd8mirubbhn10"
+path="res://.godot/imported/redBtn.png-e2a2e519f53fb6bff43505aa9622a1cf.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://sprites/ui/redBtn.png"
+dest_files=["res://.godot/imported/redBtn.png-e2a2e519f53fb6bff43505aa9622a1cf.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/sprites/world/boxersOfAmericaFrame.png b/sprites/world/boxersOfAmericaFrame.png
new file mode 100644
index 0000000..3e6ceb3
Binary files /dev/null and b/sprites/world/boxersOfAmericaFrame.png differ
diff --git a/sprites/world/boxersOfAmericaFrame.png.import b/sprites/world/boxersOfAmericaFrame.png.import
new file mode 100644
index 0000000..b1f5067
--- /dev/null
+++ b/sprites/world/boxersOfAmericaFrame.png.import
@@ -0,0 +1,34 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d1u3w61r0uv7p"
+path="res://.godot/imported/boxersOfAmericaFrame.png-305851a525e3ee9fbe3ec9956a4aa80b.ctex"
+metadata={
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://sprites/world/boxersOfAmericaFrame.png"
+dest_files=["res://.godot/imported/boxersOfAmericaFrame.png-305851a525e3ee9fbe3ec9956a4aa80b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
diff --git a/sprites/clothes/icrazy_frame.svg b/sprites/world/icrazy_frame.svg
similarity index 100%
rename from sprites/clothes/icrazy_frame.svg
rename to sprites/world/icrazy_frame.svg
diff --git a/sprites/clothes/icrazy_frame.svg.import b/sprites/world/icrazy_frame.svg.import
similarity index 74%
rename from sprites/clothes/icrazy_frame.svg.import
rename to sprites/world/icrazy_frame.svg.import
index 9c6bcf9..f0e5726 100644
--- a/sprites/clothes/icrazy_frame.svg.import
+++ b/sprites/world/icrazy_frame.svg.import
@@ -3,15 +3,15 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://bi7ayrxnn7hex"
-path="res://.godot/imported/icrazy_frame.svg-032c353b0b85ae71d6c5843b8929a60c.ctex"
+path="res://.godot/imported/icrazy_frame.svg-96baf65adc7b6794f97c6c0d94fcce08.ctex"
metadata={
"vram_texture": false
}
[deps]
-source_file="res://sprites/clothes/icrazy_frame.svg"
-dest_files=["res://.godot/imported/icrazy_frame.svg-032c353b0b85ae71d6c5843b8929a60c.ctex"]
+source_file="res://sprites/world/icrazy_frame.svg"
+dest_files=["res://.godot/imported/icrazy_frame.svg-96baf65adc7b6794f97c6c0d94fcce08.ctex"]
[params]