├── .gitignore ├── LICENSE ├── MyMod.sln ├── MyMod ├── BaronBlade │ ├── BaronJeremyCharacterCardController.cs │ └── BaronJeremyTurnTakerController.cs ├── Bunker │ └── WaywardBunkerCharacterCardController.cs ├── CaptainThunder │ └── CaptainThunderstruckCharacterCardController.cs ├── Cauldron.Cricket │ └── NoisyCricketCharacterCardController.cs ├── DeckLists │ ├── DevStreamDeckList.json │ ├── MigrantCoderDeckList.json │ ├── PromoCardList.json │ ├── TheBaddiesDeckList.json │ └── TheHugMonsterTeamDeckList.json ├── DevStream │ ├── DroppedFrameCardController.cs │ ├── ModderCardController.cs │ └── SpamBotCardController.cs ├── MigrantCoder │ ├── BugFixCardController.cs │ ├── CodersKeyboardCardController.cs │ ├── MigrantCoderCharacterCardController.cs │ ├── MigrantCoderLockdownCharacterCardController.cs │ ├── MigrantCoderTurnTakerController.cs │ ├── PunchingBagCardController.cs │ └── WorstCardEverCardController.cs ├── MyMod.csproj ├── Properties │ └── AssemblyInfo.cs ├── SkyScraper │ ├── CentristSkyScraperHugeCharacterCardController.cs │ ├── CentristSkyScraperNormalCharacterCardController.cs │ └── CentristSkyScraperTinyCharacterCardController.cs ├── TheBaddies │ ├── FireEverythingCardController.cs │ ├── SmashBackFieldCardController.cs │ ├── TheBaddiesCharacterCardController.cs │ ├── TheBaddiesTurnTakerController.cs │ ├── TheRealBaddiesCharacterCardController.cs │ ├── TheRealBaddiesTurnTakerController.cs │ └── WrightWeighCardController.cs ├── TheHugMonsterTeam │ ├── TheHugMonsterTeamCharacterCardController.cs │ └── WarmEmbraceCardController.cs └── TheSentinels │ ├── DrMedicobraCharacterCardController.cs │ ├── MainsnakeCharacterCardController.cs │ ├── TheIdealizardCharacterCardController.cs │ ├── TheSerpentinelsInstructionsCardController.cs │ └── WrattleCharacterCardController.cs ├── MyModConsole ├── MyModConsole.csproj ├── Program.cs ├── Properties │ └── AssemblyInfo.cs └── packages.config ├── MyModTest ├── BaseTest.cs ├── ExperimentTest.cs ├── MigrantCoderTest.cs ├── MyModTest.csproj ├── MyRandomTest.cs ├── RandomGameTest.cs ├── Setup.cs ├── Test.cs ├── VariantTest.cs └── packages.config ├── README.md ├── Resources ├── Atlas │ ├── EndGameEnvironments0.json │ ├── EndGameEnvironments0.png │ ├── EndGameHeroes0.json │ ├── EndGameHeroes0.png │ ├── EndGameVillains0.json │ ├── EndGameVillains0.png │ ├── HeroLogos0.json │ ├── HeroLogos0.png │ ├── Icons0.json │ ├── Icons0.png │ ├── MigrantCoderAtlas0.json │ ├── MigrantCoderAtlas0.png │ ├── SetupGame0.json │ ├── SetupGame0.png │ ├── VillainTeamIntro0.json │ ├── VillainTeamIntro0.png │ ├── VillainTeamLogos0.json │ └── VillainTeamLogos0.png ├── Cutouts │ ├── Heroes │ │ └── MigrantCoder │ │ │ ├── MigrantCoderCharacterHeroTurn.png │ │ │ ├── MigrantCoderCharacterHeroTurnDamaged.png │ │ │ ├── MigrantCoderCharacterHeroTurnFlipped.png │ │ │ ├── MigrantCoderCharacterVillainTurn.png │ │ │ ├── MigrantCoderCharacterVillainTurnDamaged.png │ │ │ ├── MigrantCoderCharacterVillainTurnFlipped.png │ │ │ ├── MigrantCoderLockdownCharacterHeroTurn.png │ │ │ ├── MigrantCoderLockdownCharacterHeroTurnDamaged.png │ │ │ ├── MigrantCoderLockdownCharacterHeroTurnFlipped.png │ │ │ ├── MigrantCoderLockdownCharacterVillainTurn.png │ │ │ ├── MigrantCoderLockdownCharacterVillainTurnDamaged.png │ │ │ └── MigrantCoderLockdownCharacterVillainTurnFlipped.png │ ├── StartOfGame │ │ ├── Heroes │ │ │ ├── MigrantCoderCharacterStartOfGame.png │ │ │ └── MigrantCoderLockdownCharacterStartOfGame.png │ │ └── Villains │ │ │ └── TheBaddiesCharacterStartOfGame.png │ ├── Villains │ │ ├── TheBaddies │ │ │ ├── TheBaddiesCharacterHeroTurn.png │ │ │ ├── TheBaddiesCharacterHeroTurnFlipped.png │ │ │ ├── TheBaddiesCharacterVillainTurn.png │ │ │ └── TheBaddiesCharacterVillainTurnFlipped.png │ │ └── TheHugMonsterTeam │ │ │ ├── TheHugMonsterTeamCharacterHeroTurn.png │ │ │ ├── TheHugMonsterTeamCharacterHeroTurnFlipped.png │ │ │ ├── TheHugMonsterTeamCharacterVillainTurn.png │ │ │ └── TheHugMonsterTeamCharacterVillainTurnFlipped.png │ └── YesNoDialog │ │ ├── YesNoDialogMigrantCoderCharacter.png │ │ └── YesNoDialogMigrantCoderLockdownCharacter.png ├── DeckBrowser │ ├── DevStreamBio.txt │ ├── DevStreamVitals.txt │ ├── MigrantCoderCharacterBio.txt │ └── MigrantCoderCharacterVitals.txt ├── Endings │ ├── Environments │ │ ├── Ending-DevStream.jpg │ │ └── Ending-DevStreamEnvironmentDefeat.jpg │ └── Villains │ │ └── TheBaddies │ │ ├── TheBaddiesCharacterHeroesDestroyedDefeat.png │ │ └── TheBaddiesCharacterVillainDestroyedVictory.png ├── Environments │ └── DevStream │ │ ├── DevStream-0.jpg │ │ ├── DevStream-1.jpg │ │ ├── DevStream-10.jpg │ │ ├── DevStream-11.jpg │ │ ├── DevStream-2.jpg │ │ ├── DevStream-3.jpg │ │ ├── DevStream-4.jpg │ │ ├── DevStream-5.jpg │ │ ├── DevStream-6.jpg │ │ ├── DevStream-7.jpg │ │ ├── DevStream-8.jpg │ │ ├── DevStream-9.jpg │ │ └── DevStream-Start.jpg ├── Fonts │ ├── ButtonGeneral.json │ ├── ButtonGeneral.png │ ├── FullCardBody.json │ ├── FullCardBody.png │ ├── FullCardKeywords.json │ ├── FullCardKeywords.png │ ├── RedStateBlueState.json │ ├── RedStateBlueState.png │ ├── SmallCardKeywords.json │ └── SmallCardKeywords.png ├── LargeCardTextures │ └── MigrantCoder │ │ ├── MigrantCoderCharacter.jpg │ │ ├── MigrantCoderCharacterBack.jpg │ │ ├── MigrantCoderDeckBack.jpg │ │ ├── MigrantCoderLockdownCharacter.jpg │ │ ├── MigrantCoderLockdownCharacterBack.jpg │ │ ├── PunchingBag.jpg │ │ └── WorstCardEver.jpg ├── manifest.json └── preview.jpg └── SourceImages ├── EndGame ├── Environments │ ├── DevStreamDeckBack.jpg │ └── EndGameEnvironments.tps ├── Heroes │ ├── EndGameHeroes.tps │ ├── MigrantCoderCharacter.jpg │ ├── MigrantCoderCharacterFlipped.jpg │ ├── MigrantCoderLockdownCharacter.jpg │ └── MigrantCoderLockdownCharacterFlipped.jpg └── Villains │ ├── EndGameVillains.tps │ ├── TheHugMonsterTeamCharacter.jpg │ └── TheHugMonsterTeamCharacterFlipped.jpg ├── Fonts ├── ButtonGeneral │ ├── ButtonGeneral.tps │ ├── Whatever.png │ └── button-labels.png ├── FullCardBody │ ├── FullCardBody.tps │ ├── Whatever.png │ └── cardbodies_full.png ├── FullCardKeywords │ ├── FullCardKeywords.tps │ ├── Whatever.png │ └── card-keywords-full.png ├── RedStateBlueState │ ├── RedStateBlueState-clean96.png │ ├── RedStateBlueState.tps │ ├── RedStateBlueStateBold-clean96.png │ ├── RedStateBlueStateItalic-clean96.png │ └── Whatever.png └── SmallCardKeywords │ ├── SmallCardKeywords.tps │ ├── Whatever.png │ └── card-keywords-small.png ├── HeroLogos ├── HeroLogos.tps ├── MigrantCoderCharacter.jpg └── MigrantCoderLockdownCharacter.jpg ├── Icons ├── Icons0.tps ├── MigrantCoderIcon.png └── Whatever.png ├── SetupGame ├── DevStreamDeckBack.jpg ├── MigrantCoderCharacter.jpg ├── MigrantCoderLockdownCharacter.jpg └── SetupGameAtlas0.tps ├── SmallCardArt └── Heroes │ └── MigrantCoder │ ├── MigrantCoder.tps │ ├── MigrantCoderCharacter.jpg │ ├── MigrantCoderCharacterBack.jpg │ ├── MigrantCoderDeckBack.jpg │ ├── MigrantCoderLockdownCharacter.jpg │ ├── MigrantCoderLockdownCharacterBack.jpg │ ├── PunchingBag.jpg │ └── WorstCardEver.jpg ├── VillainTeamIntro ├── TheHugMonsterTeamCharacter.jpg └── VillainTeamIntro.tps └── VillainTeamLogos ├── TheHugMonsterTeamCharacter.jpg └── VillainTeamLogos.tps /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Mono auto generated files 17 | mono_crash.* 18 | 19 | # Build results 20 | [Dd]ebug/ 21 | [Dd]ebugPublic/ 22 | [Rr]elease/ 23 | [Rr]eleases/ 24 | x64/ 25 | x86/ 26 | [Ww][Ii][Nn]32/ 27 | [Aa][Rr][Mm]/ 28 | [Aa][Rr][Mm]64/ 29 | bld/ 30 | [Bb]in/ 31 | [Oo]bj/ 32 | [Ll]og/ 33 | [Ll]ogs/ 34 | 35 | # Visual Studio 2015/2017 cache/options directory 36 | .vs/ 37 | # Uncomment if you have tasks that create the project's static files in wwwroot 38 | #wwwroot/ 39 | 40 | # Visual Studio 2017 auto generated files 41 | Generated\ Files/ 42 | 43 | # MSTest test Results 44 | [Tt]est[Rr]esult*/ 45 | [Bb]uild[Ll]og.* 46 | 47 | # NUnit 48 | *.VisualState.xml 49 | TestResult.xml 50 | nunit-*.xml 51 | 52 | # Build Results of an ATL Project 53 | [Dd]ebugPS/ 54 | [Rr]eleasePS/ 55 | dlldata.c 56 | 57 | # Benchmark Results 58 | BenchmarkDotNet.Artifacts/ 59 | 60 | # .NET Core 61 | project.lock.json 62 | project.fragment.lock.json 63 | artifacts/ 64 | 65 | # ASP.NET Scaffolding 66 | ScaffoldingReadMe.txt 67 | 68 | # StyleCop 69 | StyleCopReport.xml 70 | 71 | # Files built by Visual Studio 72 | *_i.c 73 | *_p.c 74 | *_h.h 75 | *.ilk 76 | *.meta 77 | *.obj 78 | *.iobj 79 | *.pch 80 | *.pdb 81 | *.ipdb 82 | *.pgc 83 | *.pgd 84 | *.rsp 85 | *.sbr 86 | *.tlb 87 | *.tli 88 | *.tlh 89 | *.tmp 90 | *.tmp_proj 91 | *_wpftmp.csproj 92 | *.log 93 | *.vspscc 94 | *.vssscc 95 | .builds 96 | *.pidb 97 | *.svclog 98 | *.scc 99 | 100 | # Chutzpah Test files 101 | _Chutzpah* 102 | 103 | # Visual C++ cache files 104 | ipch/ 105 | *.aps 106 | *.ncb 107 | *.opendb 108 | *.opensdf 109 | *.sdf 110 | *.cachefile 111 | *.VC.db 112 | *.VC.VC.opendb 113 | 114 | # Visual Studio profiler 115 | *.psess 116 | *.vsp 117 | *.vspx 118 | *.sap 119 | 120 | # Visual Studio Trace Files 121 | *.e2e 122 | 123 | # TFS 2012 Local Workspace 124 | $tf/ 125 | 126 | # Guidance Automation Toolkit 127 | *.gpState 128 | 129 | # ReSharper is a .NET coding add-in 130 | _ReSharper*/ 131 | *.[Rr]e[Ss]harper 132 | *.DotSettings.user 133 | 134 | # TeamCity is a build add-in 135 | _TeamCity* 136 | 137 | # DotCover is a Code Coverage Tool 138 | *.dotCover 139 | 140 | # AxoCover is a Code Coverage Tool 141 | .axoCover/* 142 | !.axoCover/settings.json 143 | 144 | # Coverlet is a free, cross platform Code Coverage Tool 145 | coverage*.json 146 | coverage*.xml 147 | coverage*.info 148 | 149 | # Visual Studio code coverage results 150 | *.coverage 151 | *.coveragexml 152 | 153 | # NCrunch 154 | _NCrunch_* 155 | .*crunch*.local.xml 156 | nCrunchTemp_* 157 | 158 | # MightyMoose 159 | *.mm.* 160 | AutoTest.Net/ 161 | 162 | # Web workbench (sass) 163 | .sass-cache/ 164 | 165 | # Installshield output folder 166 | [Ee]xpress/ 167 | 168 | # DocProject is a documentation generator add-in 169 | DocProject/buildhelp/ 170 | DocProject/Help/*.HxT 171 | DocProject/Help/*.HxC 172 | DocProject/Help/*.hhc 173 | DocProject/Help/*.hhk 174 | DocProject/Help/*.hhp 175 | DocProject/Help/Html2 176 | DocProject/Help/html 177 | 178 | # Click-Once directory 179 | publish/ 180 | 181 | # Publish Web Output 182 | *.[Pp]ublish.xml 183 | *.azurePubxml 184 | # Note: Comment the next line if you want to checkin your web deploy settings, 185 | # but database connection strings (with potential passwords) will be unencrypted 186 | *.pubxml 187 | *.publishproj 188 | 189 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 190 | # checkin your Azure Web App publish settings, but sensitive information contained 191 | # in these scripts will be unencrypted 192 | PublishScripts/ 193 | 194 | # NuGet Packages 195 | *.nupkg 196 | # NuGet Symbol Packages 197 | *.snupkg 198 | # The packages folder can be ignored because of Package Restore 199 | **/[Pp]ackages/* 200 | # except build/, which is used as an MSBuild target. 201 | !**/[Pp]ackages/build/ 202 | # Uncomment if necessary however generally it will be regenerated when needed 203 | #!**/[Pp]ackages/repositories.config 204 | # NuGet v3's project.json files produces more ignorable files 205 | *.nuget.props 206 | *.nuget.targets 207 | 208 | # Microsoft Azure Build Output 209 | csx/ 210 | *.build.csdef 211 | 212 | # Microsoft Azure Emulator 213 | ecf/ 214 | rcf/ 215 | 216 | # Windows Store app package directories and files 217 | AppPackages/ 218 | BundleArtifacts/ 219 | Package.StoreAssociation.xml 220 | _pkginfo.txt 221 | *.appx 222 | *.appxbundle 223 | *.appxupload 224 | 225 | # Visual Studio cache files 226 | # files ending in .cache can be ignored 227 | *.[Cc]ache 228 | # but keep track of directories ending in .cache 229 | !?*.[Cc]ache/ 230 | 231 | # Others 232 | ClientBin/ 233 | ~$* 234 | *~ 235 | *.dbmdl 236 | *.dbproj.schemaview 237 | *.jfm 238 | *.pfx 239 | *.publishsettings 240 | orleans.codegen.cs 241 | 242 | # Including strong name files can present a security risk 243 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 244 | #*.snk 245 | 246 | # Since there are multiple workflows, uncomment next line to ignore bower_components 247 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 248 | #bower_components/ 249 | 250 | # RIA/Silverlight projects 251 | Generated_Code/ 252 | 253 | # Backup & report files from converting an old project file 254 | # to a newer Visual Studio version. Backup files are not needed, 255 | # because we have git ;-) 256 | _UpgradeReport_Files/ 257 | Backup*/ 258 | UpgradeLog*.XML 259 | UpgradeLog*.htm 260 | ServiceFabricBackup/ 261 | *.rptproj.bak 262 | 263 | # SQL Server files 264 | *.mdf 265 | *.ldf 266 | *.ndf 267 | 268 | # Business Intelligence projects 269 | *.rdl.data 270 | *.bim.layout 271 | *.bim_*.settings 272 | *.rptproj.rsuser 273 | *- [Bb]ackup.rdl 274 | *- [Bb]ackup ([0-9]).rdl 275 | *- [Bb]ackup ([0-9][0-9]).rdl 276 | 277 | # Microsoft Fakes 278 | FakesAssemblies/ 279 | 280 | # GhostDoc plugin setting file 281 | *.GhostDoc.xml 282 | 283 | # Node.js Tools for Visual Studio 284 | .ntvs_analysis.dat 285 | node_modules/ 286 | 287 | # Visual Studio 6 build log 288 | *.plg 289 | 290 | # Visual Studio 6 workspace options file 291 | *.opt 292 | 293 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 294 | *.vbw 295 | 296 | # Visual Studio LightSwitch build output 297 | **/*.HTMLClient/GeneratedArtifacts 298 | **/*.DesktopClient/GeneratedArtifacts 299 | **/*.DesktopClient/ModelManifest.xml 300 | **/*.Server/GeneratedArtifacts 301 | **/*.Server/ModelManifest.xml 302 | _Pvt_Extensions 303 | 304 | # Paket dependency manager 305 | .paket/paket.exe 306 | paket-files/ 307 | 308 | # FAKE - F# Make 309 | .fake/ 310 | 311 | # CodeRush personal settings 312 | .cr/personal 313 | 314 | # Python Tools for Visual Studio (PTVS) 315 | __pycache__/ 316 | *.pyc 317 | 318 | # Cake - Uncomment if you are using it 319 | # tools/** 320 | # !tools/packages.config 321 | 322 | # Tabs Studio 323 | *.tss 324 | 325 | # Telerik's JustMock configuration file 326 | *.jmconfig 327 | 328 | # BizTalk build output 329 | *.btp.cs 330 | *.btm.cs 331 | *.odx.cs 332 | *.xsd.cs 333 | 334 | # OpenCover UI analysis results 335 | OpenCover/ 336 | 337 | # Azure Stream Analytics local run output 338 | ASALocalRun/ 339 | 340 | # MSBuild Binary and Structured Log 341 | *.binlog 342 | 343 | # NVidia Nsight GPU debugger configuration file 344 | *.nvuser 345 | 346 | # MFractors (Xamarin productivity tool) working folder 347 | .mfractor/ 348 | 349 | # Local History for Visual Studio 350 | .localhistory/ 351 | 352 | # BeatPulse healthcheck temp database 353 | healthchecksdb 354 | 355 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 356 | MigrationBackup/ 357 | 358 | # Ionide (cross platform F# VS Code tools) working folder 359 | .ionide/ 360 | 361 | # Fody - auto-generated XML schema 362 | FodyWeavers.xsd 363 | .DS_Store 364 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Handelabra Games Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /MyMod.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.808.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyMod", "MyMod\MyMod.csproj", "{44F8C838-553C-482C-B389-2B375B8590C9}" 7 | EndProject 8 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyModTest", "MyModTest\MyModTest.csproj", "{AFE958F0-3C90-4493-A425-48A660B58E76}" 9 | EndProject 10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyModConsole", "MyModConsole\MyModConsole.csproj", "{79F7ED14-FC8A-4625-A297-2CC51C5D803D}" 11 | EndProject 12 | Global 13 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 14 | Debug|Any CPU = Debug|Any CPU 15 | Release|Any CPU = Release|Any CPU 16 | EndGlobalSection 17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 18 | {44F8C838-553C-482C-B389-2B375B8590C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 19 | {44F8C838-553C-482C-B389-2B375B8590C9}.Debug|Any CPU.Build.0 = Debug|Any CPU 20 | {44F8C838-553C-482C-B389-2B375B8590C9}.Release|Any CPU.ActiveCfg = Release|Any CPU 21 | {44F8C838-553C-482C-B389-2B375B8590C9}.Release|Any CPU.Build.0 = Release|Any CPU 22 | {AFE958F0-3C90-4493-A425-48A660B58E76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 23 | {AFE958F0-3C90-4493-A425-48A660B58E76}.Debug|Any CPU.Build.0 = Debug|Any CPU 24 | {AFE958F0-3C90-4493-A425-48A660B58E76}.Release|Any CPU.ActiveCfg = Release|Any CPU 25 | {AFE958F0-3C90-4493-A425-48A660B58E76}.Release|Any CPU.Build.0 = Release|Any CPU 26 | {79F7ED14-FC8A-4625-A297-2CC51C5D803D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 27 | {79F7ED14-FC8A-4625-A297-2CC51C5D803D}.Debug|Any CPU.Build.0 = Debug|Any CPU 28 | {79F7ED14-FC8A-4625-A297-2CC51C5D803D}.Release|Any CPU.ActiveCfg = Release|Any CPU 29 | {79F7ED14-FC8A-4625-A297-2CC51C5D803D}.Release|Any CPU.Build.0 = Release|Any CPU 30 | EndGlobalSection 31 | GlobalSection(SolutionProperties) = preSolution 32 | HideSolutionNode = FALSE 33 | EndGlobalSection 34 | GlobalSection(ExtensibilityGlobals) = postSolution 35 | SolutionGuid = {8CABC6FF-98D3-475D-B459-D178F300AEC1} 36 | EndGlobalSection 37 | EndGlobal 38 | -------------------------------------------------------------------------------- /MyMod/BaronBlade/BaronJeremyCharacterCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Linq; 4 | using Handelabra.Sentinels.Engine.Controller; 5 | using Handelabra.Sentinels.Engine.Model; 6 | 7 | namespace Workshopping.BaronBlade 8 | { 9 | public class BaronJeremyCharacterCardController : VillainCharacterCardController 10 | { 11 | public BaronJeremyCharacterCardController(Card card, TurnTakerController turnTakerController) 12 | : base(card, turnTakerController) 13 | { 14 | } 15 | 16 | public override void AddSideTriggers() 17 | { 18 | if (!this.Card.IsFlipped) 19 | { 20 | // At the start of the Villain turn... 21 | this.SideTriggers.Add(AddStartOfTurnTrigger(tt => tt == this.TurnTaker, StartVillainTurnResponse, TriggerType.DealDamage)); 22 | 23 | // At the end of the Villain Turn... 24 | this.SideTriggers.Add(AddEndOfTurnTrigger(tt => tt == this.TurnTaker, EndOfTurnResponse, new TriggerType[] { TriggerType.FlipCard })); 25 | } 26 | else 27 | { 28 | 29 | } 30 | 31 | // Both sides defeat trigger 32 | AddDefeatedIfDestroyedTriggers(); 33 | } 34 | 35 | private IEnumerator StartVillainTurnResponse(PhaseChangeAction phaseChange) 36 | { 37 | // ... Baron Blade deals each hero Target H Fire Damage. 38 | var dealDamage = DealDamage(this.Card, c => c.IsHero, H, DamageType.Fire); 39 | 40 | if (UseUnityCoroutines) 41 | { 42 | yield return this.GameController.StartCoroutine(dealDamage); 43 | } 44 | else 45 | { 46 | this.GameController.ExhaustCoroutine(dealDamage); 47 | 48 | } 49 | } 50 | 51 | private IEnumerator EndOfTurnResponse(PhaseChangeAction phaseChange) 52 | { 53 | // ... if there are no Minions in play, flip {BaronBlade}'s villain character card. 54 | var minionCount = FindCardsWhere(c => IsMinion(c) && c.IsInPlay).Count(); 55 | if (minionCount == 0) 56 | { 57 | IEnumerator flipcardE = this.GameController.FlipCard(this, cardSource: GetCardSource()); 58 | if (UseUnityCoroutines) 59 | { 60 | yield return this.GameController.StartCoroutine(flipcardE); 61 | } 62 | else 63 | { 64 | this.GameController.ExhaustCoroutine(flipcardE); 65 | 66 | } 67 | } 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /MyMod/BaronBlade/BaronJeremyTurnTakerController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | 6 | namespace Workshopping.BaronBlade 7 | { 8 | public class BaronJeremyTurnTakerController:TurnTakerController 9 | { 10 | public BaronJeremyTurnTakerController(TurnTaker turnTaker, GameController gameController) 11 | : base(turnTaker, gameController) 12 | { 13 | } 14 | 15 | public override IEnumerator StartGame() 16 | { 17 | // Play all BBs 18 | var battalions = FindCardsWhere(c => c.Identifier == "BladeBattalion"); 19 | foreach (var bb in battalions) 20 | { 21 | var playCard = this.GameController.PlayCard(this, bb, true, cardSource: new CardSource(this.CharacterCardController)); 22 | if (UseUnityCoroutines) 23 | { 24 | yield return this.GameController.StartCoroutine(playCard); 25 | } 26 | else 27 | { 28 | this.GameController.ExhaustCoroutine(playCard); 29 | } 30 | } 31 | 32 | // Shuffle the villain deck 33 | var shuffle = this.GameController.ShuffleLocation(this.TurnTaker.Deck, cardSource: new CardSource(this.CharacterCardController)); 34 | 35 | if (UseUnityCoroutines) 36 | { 37 | yield return this.GameController.StartCoroutine(shuffle); 38 | } 39 | else 40 | { 41 | this.GameController.ExhaustCoroutine(shuffle); 42 | } 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /MyMod/Bunker/WaywardBunkerCharacterCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | 6 | namespace Workshopping.Bunker 7 | { 8 | public class WaywardBunkerCharacterCardController : HeroCharacterCardController 9 | { 10 | public WaywardBunkerCharacterCardController(Card card, TurnTakerController turnTakerController) 11 | : base(card, turnTakerController) 12 | { 13 | } 14 | 15 | public override IEnumerator UseIncapacitatedAbility(int index) 16 | { 17 | switch (index) 18 | { 19 | case 0: 20 | // One player may play a card now. 21 | var e0 = SelectHeroToPlayCard(this.DecisionMaker); 22 | if (UseUnityCoroutines) 23 | { 24 | yield return this.GameController.StartCoroutine(e0); 25 | } 26 | else 27 | { 28 | this.GameController.ExhaustCoroutine(e0); 29 | 30 | } 31 | break; 32 | case 1: 33 | // One hero may use a power now. 34 | var e1 = this.GameController.SelectHeroToUsePower(this.DecisionMaker, cardSource: GetCardSource()); 35 | if (UseUnityCoroutines) 36 | { 37 | yield return this.GameController.StartCoroutine(e1); 38 | } 39 | else 40 | { 41 | this.GameController.ExhaustCoroutine(e1); 42 | 43 | } 44 | break; 45 | case 2: 46 | // One player may draw a card now 47 | var e2 = this.GameController.SelectHeroToDrawCard(this.DecisionMaker, cardSource: GetCardSource()); 48 | if (UseUnityCoroutines) 49 | { 50 | yield return this.GameController.StartCoroutine(e2); 51 | } 52 | else 53 | { 54 | this.GameController.ExhaustCoroutine(e2); 55 | 56 | } 57 | break; 58 | } 59 | } 60 | 61 | public override IEnumerator UsePower(int index = 0) 62 | { 63 | // Draw 2 cards! 64 | var numberOfCards = GetPowerNumeral(0, 2); 65 | IEnumerator e = DrawCards(this.HeroTurnTakerController, numberOfCards); 66 | 67 | if (UseUnityCoroutines) 68 | { 69 | yield return this.GameController.StartCoroutine(e); 70 | } 71 | else 72 | { 73 | this.GameController.ExhaustCoroutine(e); 74 | } 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /MyMod/CaptainThunder/CaptainThunderstruckCharacterCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | 6 | namespace Workshopping.CaptainThunder 7 | { 8 | public class CaptainThunderstruckCharacterCardController : HeroCharacterCardController 9 | { 10 | public CaptainThunderstruckCharacterCardController(Card card, TurnTakerController turnTakerController) 11 | : base(card, turnTakerController) 12 | { 13 | } 14 | 15 | public override IEnumerator UseIncapacitatedAbility(int index) 16 | { 17 | switch (index) 18 | { 19 | case 0: 20 | // One player may play a card now. 21 | var e0 = SelectHeroToPlayCard(this.DecisionMaker); 22 | if (UseUnityCoroutines) 23 | { 24 | yield return this.GameController.StartCoroutine(e0); 25 | } 26 | else 27 | { 28 | this.GameController.ExhaustCoroutine(e0); 29 | 30 | } 31 | break; 32 | case 1: 33 | // One hero may use a power now. 34 | var e1 = this.GameController.SelectHeroToUsePower(this.DecisionMaker, cardSource: GetCardSource()); 35 | if (UseUnityCoroutines) 36 | { 37 | yield return this.GameController.StartCoroutine(e1); 38 | } 39 | else 40 | { 41 | this.GameController.ExhaustCoroutine(e1); 42 | 43 | } 44 | break; 45 | case 2: 46 | // One player may draw a card now 47 | var e2 = this.GameController.SelectHeroToDrawCard(this.DecisionMaker, cardSource: GetCardSource()); 48 | if (UseUnityCoroutines) 49 | { 50 | yield return this.GameController.StartCoroutine(e2); 51 | } 52 | else 53 | { 54 | this.GameController.ExhaustCoroutine(e2); 55 | 56 | } 57 | break; 58 | } 59 | } 60 | 61 | public override IEnumerator UsePower(int index = 0) 62 | { 63 | // Increase all lightning damage and sonic damage dealt by 2 until the end of your next turn. 64 | var amount = GetPowerNumeral(0, 2); 65 | 66 | IncreaseDamageStatusEffect effect = new IncreaseDamageStatusEffect(amount); 67 | effect.CardDestroyedExpiryCriteria.Card = this.Card; 68 | effect.DamageTypeCriteria.AddType(DamageType.Lightning); 69 | effect.DamageTypeCriteria.AddType(DamageType.Sonic); 70 | effect.UntilEndOfNextTurn(this.TurnTaker); 71 | 72 | return AddStatusEffect(effect); 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /MyMod/Cauldron.Cricket/NoisyCricketCharacterCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | using System.Collections.Generic; 6 | 7 | namespace Workshopping.Cricket 8 | { 9 | public class NoisyCricketCharacterCardController : HeroCharacterCardController 10 | { 11 | public NoisyCricketCharacterCardController(Card card, TurnTakerController turnTakerController) 12 | : base(card, turnTakerController) 13 | { 14 | } 15 | 16 | public override IEnumerator UseIncapacitatedAbility(int index) 17 | { 18 | switch (index) 19 | { 20 | case 0: 21 | // One player may play a card now. 22 | var e0 = SelectHeroToPlayCard(this.DecisionMaker); 23 | if (UseUnityCoroutines) 24 | { 25 | yield return this.GameController.StartCoroutine(e0); 26 | } 27 | else 28 | { 29 | this.GameController.ExhaustCoroutine(e0); 30 | 31 | } 32 | break; 33 | case 1: 34 | // One hero may use a power now. 35 | var e1 = this.GameController.SelectHeroToUsePower(this.DecisionMaker, cardSource: GetCardSource()); 36 | if (UseUnityCoroutines) 37 | { 38 | yield return this.GameController.StartCoroutine(e1); 39 | } 40 | else 41 | { 42 | this.GameController.ExhaustCoroutine(e1); 43 | 44 | } 45 | break; 46 | case 2: 47 | // One player may draw a card now 48 | var e2 = this.GameController.SelectHeroToDrawCard(this.DecisionMaker, cardSource: GetCardSource()); 49 | if (UseUnityCoroutines) 50 | { 51 | yield return this.GameController.StartCoroutine(e2); 52 | } 53 | else 54 | { 55 | this.GameController.ExhaustCoroutine(e2); 56 | 57 | } 58 | break; 59 | } 60 | } 61 | 62 | public override IEnumerator UsePower(int index = 0) 63 | { 64 | var targets = GetPowerNumeral(0, 1); 65 | var amount = GetPowerNumeral(1, 10); 66 | var storedResults = new List(); 67 | var source = new DamageSource(this.GameController, this.CharacterCard); 68 | var e = this.GameController.SelectTargetsAndDealDamage(this.DecisionMaker, source, amount, DamageType.Energy, targets, false, targets, true, storedResultsDamage:storedResults, cardSource: GetCardSource()); 69 | 70 | if (UseUnityCoroutines) 71 | { 72 | yield return this.GameController.StartCoroutine(e); 73 | } 74 | else 75 | { 76 | this.GameController.ExhaustCoroutine(e); 77 | } 78 | 79 | if (DidDealDamage(storedResults)) 80 | { 81 | // Destroy self! 82 | e = this.GameController.DestroyCard(this.HeroTurnTakerController, this.CharacterCard); 83 | 84 | if (UseUnityCoroutines) 85 | { 86 | yield return this.GameController.StartCoroutine(e); 87 | } 88 | else 89 | { 90 | this.GameController.ExhaustCoroutine(e); 91 | } 92 | } 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /MyMod/DeckLists/DevStreamDeckList.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Dev Stream", 3 | "kind": "Environment", 4 | "backgroundColor": "FB5455", 5 | "difficulty": 3, 6 | "cards": [ 7 | { 8 | "identifier": "DroppedFrame", 9 | "count": 5, 10 | "title": "Dropped Frame", 11 | "body": [ 12 | "When this card enters play, deal each non-chat target 1 Lightning damage.", 13 | "At the start of the Environment turn, each target regains 1 HP." 14 | ], 15 | "icons": [ 16 | "StartAndEndOfTurnAction", 17 | "DealDamageProjectile", 18 | "GainHP" 19 | ], 20 | "flavorQuotes": [ 21 | { 22 | "identifier": "MigrantCoder", 23 | "text": "Get it together, internet!" 24 | } 25 | ], 26 | "flavorText": "Get it together, internet!" 27 | }, 28 | { 29 | "identifier": "SpamBot", 30 | "count": 5, 31 | "title": "Spam Bot", 32 | "body": [ 33 | "At the end of the environment turn, this card deals the non-environment target with the second highest HP {H - 1} psychic damage." 34 | ], 35 | "icons": [ 36 | "EndOfTurnAction", 37 | "DealDamagePsychic" 38 | ], 39 | "nemesisIdentifiers": [ 40 | "Workshopping.MigrantCoder", 41 | "Legacy" 42 | ], 43 | "keywords": [ 44 | "chat" 45 | ], 46 | "flavorText": "Get big followers fast!!!", 47 | "hitpoints": 5 48 | }, 49 | { 50 | "identifier": "Modder", 51 | "count": 5, 52 | "title": "Modder", 53 | "body": [ 54 | "At the start of the environment turn, put the top card of the villain deck into play.", 55 | "Then, put the top card of each hero deck into play in turn order. If a limited card already in play would be put into play, discard that card instead." 56 | ], 57 | "icons": [ 58 | "StartOfTurnAction", 59 | "PlayCardNow" 60 | ], 61 | "keywords": [ 62 | "chat" 63 | ], 64 | "flavorText": "Check out my new hero deck!", 65 | "hitpoints": 10 66 | } 67 | ] 68 | } 69 | -------------------------------------------------------------------------------- /MyMod/DeckLists/MigrantCoderDeckList.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Migrant Coder", 3 | "kind": "Hero", 4 | "initialCardIdentifiers": [ 5 | "MigrantCoderCharacter" 6 | ], 7 | "cards": [ 8 | { 9 | "identifier": "MigrantCoderCharacter", 10 | "count": 1, 11 | "title": "Migrant Coder", 12 | "body": "Hack the Gibson", 13 | "backgroundColor": "fbf8f9", 14 | "foilBackgroundColor": "FEFEFE", 15 | "hitpointsColor": "C94742", 16 | "character": true, 17 | "powers": [ 18 | "Draw 1 card. {MigrantCoder} deals 1 target 2 Psychic damage." 19 | ], 20 | "icons": [ 21 | "HasPower", 22 | "DrawCardNow", 23 | "DealDamagePsychic" 24 | ], 25 | "hitpoints": 30, 26 | "nemesisIdentifiers": [ 27 | "Workshopping.MigrantCoder" 28 | ], 29 | "incapacitatedAbilities": [ 30 | "One player may play a card.", 31 | "One hero may use a power.", 32 | "One player may draw a card." 33 | ], 34 | "flippedIcons": [ 35 | "PlayCardNow", 36 | "UsePowerNow", 37 | "DrawCardNow" 38 | ], 39 | "openingLines": { 40 | "default": "You cannot defeat the power of the Workshop!" 41 | }, 42 | "complexity": 1, 43 | "setup": [ "Most heroes do not have setup text. This one does only as an example." ], 44 | "gameplay": [ "Most heroes do not have gameplay text. This one does only as an example." ], 45 | "tokenPools": [ 46 | { 47 | "identifier": "ExamplePool", 48 | "name": "Example Token Pool", 49 | "initialValue": 5, 50 | "minimumValue": 0, 51 | "icon": "Workshopping.Whatever", 52 | "labelBottomColor": "FF0000", 53 | "labelTopColor": "0000FF" 54 | } 55 | ] 56 | }, 57 | { 58 | "identifier": "WorstCardEver", 59 | "count": 5, 60 | "title": "Worst... Card... Ever.", 61 | "keywords": [ 62 | "one-shot" 63 | ], 64 | "body": "Nothing happens.", 65 | "icons": [ 66 | ], 67 | "flavorText": "Ugh." 68 | }, 69 | { 70 | "identifier": "PunchingBag", 71 | "count": 5, 72 | "title": "Punching Bag", 73 | "keywords": [ 74 | "one-shot" 75 | ], 76 | "body": "{MigrantCoder} may think happy thoughts and deal himself 1 melee damage. If damage is dealt this way, play 2 cards. If he did not think happy thoughts, he may have cake.", 77 | "icons": [ 78 | "DealDamageMelee", 79 | "PlayCardNow" 80 | ], 81 | "flavorText": "Ouch!" 82 | }, 83 | { 84 | "identifier": "CodersKeyboard", 85 | "count": 2, 86 | "title": "Coder's Keyboard", 87 | "keywords": [ 88 | "equipment", 89 | "limited" 90 | ], 91 | "body": "You may use an additional power during your power phase.", 92 | "icons": [ 93 | "UsePowerExtra" 94 | ], 95 | "flavorText": "You need one of these to level up your programming!" 96 | }, 97 | { 98 | "identifier": "BugFix", 99 | "count": 5, 100 | "title": "Bug Fix", 101 | "keywords": [ 102 | "ongoing" 103 | ], 104 | "icons": [ 105 | "HasPower", 106 | "DealDamageLightning" 107 | ], 108 | "flavorQuotes": [ 109 | { 110 | "identifier": "MigrantCoder", 111 | "text": "This was working fine yesterday!" 112 | } 113 | ], 114 | "flavorReference": "Migrant Coder, Dev Stream #5", 115 | "powers": [ 116 | "{MigrantCoder} deals 1 target 4 lightning damage." 117 | ] 118 | } 119 | ], 120 | "promoCards": [ 121 | { 122 | "identifier": "MigrantCoderCharacter", 123 | "promoIdentifier": "MigrantCoderLockdownCharacter", 124 | "count": 1, 125 | "title": "Migrant Coder", 126 | "promoTitle": "Migrant Coder: Lockdown", 127 | "body": "Social Distance", 128 | "icons": [ 129 | "HasPower", 130 | "ReduceDamageTaken" 131 | ], 132 | "backgroundColor": "7B7E7C", 133 | "foilBackgroundColor": "86BB71", 134 | "hitpointsColor": "F6AD41", 135 | "character": true, 136 | "powers": [ 137 | "Reduce damage dealt to {MigrantCoder} by 1 until the start of your next turn." 138 | ], 139 | "hitpoints": 27, 140 | "nemesisIdentifiers": [ 141 | "Workshopping.MigrantCoder" 142 | ], 143 | "incapacitatedAbilities": [ 144 | "One player may play a card.", 145 | "One hero may use a power.", 146 | "One player may draw a card." 147 | ], 148 | "flippedIcons": [ 149 | "PlayCardNow", 150 | "UsePowerNow", 151 | "DrawCardNow" 152 | ], 153 | "complexity": 1, 154 | "openingLines": { 155 | "default": "Wear a mask! Honestly!" 156 | } 157 | } 158 | ] 159 | } -------------------------------------------------------------------------------- /MyMod/DeckLists/TheBaddiesDeckList.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "The Baddies", 3 | "kind": "Villain", 4 | "initialCardIdentifiers": [ 5 | "TheBaddiesCharacter" 6 | ], 7 | "cards": [ 8 | { 9 | "identifier": "TheBaddiesCharacter", 10 | "count": 1, 11 | "title": "The Baddies", 12 | "keywords": [ 13 | "villain" 14 | ], 15 | "icons": [ 16 | "EndOfTurnAction", 17 | "DestroyOngoing" 18 | ], 19 | "advancedIcons": [ 20 | "EndOfTurnAction", 21 | "DestroyEquipment" 22 | ], 23 | "body": "Are we tho?", 24 | "backgroundColor": "D99FC5", 25 | "foilBackgroundColor": "CD96C0", 26 | "character": true, 27 | "hitpoints": 40, 28 | "nemesisIdentifiers": [ 29 | "Workshopping.MigrantCoder" 30 | ], 31 | "setup": [ 32 | "At the start of the game, {TheBaddies} enters play “Are we tho?“ side up.", 33 | "One “Smash-Back Field“ is put into play. The Villain Deck is shuffled.", 34 | ], 35 | "gameplay": [ 36 | "At the end of the villain turn, destroy 1 hero ongoing card.", 37 | "When {TheBaddies} would be destroyed, their Villain Character card flips to the “How did you get here?“ side instead." 38 | ], 39 | "advanced": "At the end of the villain turn, destroy 1 equipment card.", 40 | "flippedHitpoints": 30, 41 | "flippedBody": "How did you get here?", 42 | "flippedGameplay": [ 43 | "When flipped to this side, {TheBaddies}'s maximum HP is 30. {TheBaddies} is restored to 30 HP." 44 | ], 45 | "flippedAdvanced": "Nothing!", 46 | "flippedIcons": [ 47 | ], 48 | "flippedAdvancedIcons": [ 49 | ], 50 | "difficulty": 1, 51 | "openingLines": { 52 | "default": "I'm bad! I'm bad! You know it, you know.", 53 | "WorkshopTestA.AngryTaxPayerCharacter": "You are Angry Tax-Payer!", 54 | "WorkshopTestA.HappyTaxPayerCharacter": "You are Happy Tax-Payer!", 55 | "WorkshopTestB.MollifiedTaxPayerCharacter": "You are Mollified Tax-Payer!" 56 | } 57 | }, 58 | { 59 | "identifier": "FireEverything", 60 | "count": 16, 61 | "title": "Fire Everything!", 62 | "keywords": [ 63 | "one-shot" 64 | ], 65 | "body": "{TheBaddies} deals each non-villain target 5 Psychic damage.", 66 | "icons": [ 67 | "DealDamagePsychic" 68 | ], 69 | "flavorText": "The pain!" 70 | }, 71 | { 72 | "identifier": "WrightWeigh", 73 | "count": 4, 74 | "title": "Wright Weigh", 75 | "hitpoints": 10, 76 | "keywords": [ 77 | "minion" 78 | ], 79 | "body": [ 80 | "At the end of the villain turn, each villain target regains {H} HP." 81 | ], 82 | "icons": [ 83 | "EndOfTurnAction", 84 | "GainHP" 85 | ], 86 | "flavorQuotes": [ 87 | { 88 | "identifier": "TheBaddies", 89 | "text": "There's a Wright Weigh, and there's a Ronway." 90 | } 91 | ], 92 | "flavorReference": "The Baddies, Dev Stream #1" 93 | }, 94 | { 95 | "identifier": "SmashBackField", 96 | "count": 5, 97 | "title": "Smash-Back Field", 98 | "keywords": [ 99 | "ongoing" 100 | ], 101 | "icons": [ 102 | "CounterDamage", 103 | "DealDamageMelee" 104 | ], 105 | "body": "The first time {TheBaddies} is dealt damage by a target each turn, {TheBaddies} deals that target 2 melee damage.", 106 | "flavorQuotes": [ 107 | { 108 | "identifier": "TheBaddies", 109 | "text": "You hurt me - I hurt you!" 110 | } 111 | ], 112 | "flavorReference": "The Baddies, Dev Stream #1" 113 | } 114 | ], 115 | "promoCards": [ 116 | { 117 | "identifier": "TheBaddiesCharacter", 118 | "promoIdentifier": "TheRealBaddiesCharacter", 119 | "overrideTurnTakerController": "TheRealBaddies", 120 | "count": 1, 121 | "title": "The Baddies", 122 | "promoTitle": "The Real Baddies", 123 | "keywords": [ 124 | "villain" 125 | ], 126 | "icons": [ 127 | "StartOfTurnAction", 128 | "DealDamageToxic" 129 | ], 130 | "advancedIcons": [ 131 | 132 | ], 133 | "body": "We really are!", 134 | "backgroundColor": "D99FC5", 135 | "foilBackgroundColor": "CD96C0", 136 | "character": true, 137 | "hitpoints": 50, 138 | "nemesisIdentifiers": [ 139 | "Workshopping.MigrantCoder" 140 | ], 141 | "setup": [ 142 | "At the start of the game, {TheBaddies} enters play “We really are!“ side up.", 143 | "The Villain Deck is shuffled." 144 | ], 145 | "gameplay": [ 146 | "At the start of the Villain turn, {TheBaddies} deals the Hero Target with the highest HP {H} Toxic Damage.", 147 | "When {TheBaddies} would be destroyed, their Villain Character card flips to the “What!“ side instead." 148 | ], 149 | "advanced": "It's all the same!", 150 | "flippedHitpoints": 20, 151 | "flippedBody": "What!", 152 | "flippedGameplay": [ 153 | "When flipped to this side, {TheBaddies}'s maximum HP is 20. {TheBaddies} is restored to 20 HP." 154 | ], 155 | "flippedAdvanced": "Nope!", 156 | "flippedIcons": [ 157 | 158 | ], 159 | "flippedAdvancedIcons": [ 160 | 161 | ], 162 | "difficulty": 2, 163 | "openingLines": { 164 | "default": "The other one isn't really bad. I'm the baddest!", 165 | "WorkshopTestA.AngryTaxPayerCharacter": "Real: You are Angry Tax-Payer!", 166 | "WorkshopTestA.HappyTaxPayerCharacter": "Real: You are Happy Tax-Payer!", 167 | "WorkshopTestB.MollifiedTaxPayerCharacter": "Real: You are Mollified Tax-Payer!" 168 | } 169 | } 170 | ] 171 | } -------------------------------------------------------------------------------- /MyMod/DeckLists/TheHugMonsterTeamDeckList.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "The Hug Monster", 3 | "kind": "VillainTeam", 4 | "initialCardIdentifiers": [ 5 | "TheHugMonsterTeamCharacter" 6 | ], 7 | "cards": [ 8 | { 9 | "identifier": "TheHugMonsterTeamCharacter", 10 | "count": 1, 11 | "title": "The Hug Monster", 12 | "keywords": [ 13 | "villain" 14 | ], 15 | "icons": [ 16 | "StartOfTurnAction", 17 | "LoseTheGame" 18 | ], 19 | "advancedIcons": [ 20 | "EndOfTurnAction", 21 | "Discard" 22 | ], 23 | "body": "Unstoppable Hugging", 24 | "backgroundColor": "D99FC5", 25 | "foilBackgroundColor": "CD96C0", 26 | "character": true, 27 | "hitpoints": 25, 28 | "nemesisIdentifiers": [ 29 | "TheWraith" 30 | ], 31 | "setup": [ 32 | "At the start of the game, {TheHugMonsterTeam} enters play “Unstoppable Hugging“ side up.", 33 | "The Villain Deck is shuffled." 34 | ], 35 | "gameplay": [ 36 | "Nothing specific, really.", 37 | "However, if {Workshopping.MigrantCoder} is in the game, you can feel great about a stream team-up!" 38 | ], 39 | "advanced": "It's all the same!", 40 | "flippedShowHitpoints": false, 41 | "flippedBody": "Incapacitated", 42 | "flippedKeywords": [ 43 | 44 | ], 45 | "flippedGameplay": [ 46 | "At the start of {TheHugMonsterTeam}'s turn, you feel sad that you no longer get hugs." 47 | ], 48 | "flippedIcons": [ 49 | "StartOfTurnAction", 50 | "GainHP" 51 | ], 52 | "difficulty": 1, 53 | "openingLines": { 54 | "default": "Bring it in!" 55 | } 56 | }, 57 | { 58 | "identifier": "WarmEmbrace", 59 | "count": 20, 60 | "title": "Warm Embrace", 61 | "keywords": [ 62 | "ongoing" 63 | ], 64 | "body": "At the end of each turn, {TheHugMonsterTeam} deals each hero target 1 Melee damage and 1 Fire damage.", 65 | "icons": [ 66 | 67 | ], 68 | "flavorText": "There, there." 69 | } 70 | ] 71 | } -------------------------------------------------------------------------------- /MyMod/DevStream/DroppedFrameCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | 6 | namespace Workshopping.DevStream 7 | { 8 | public class DroppedFrameCardController: CardController 9 | { 10 | public DroppedFrameCardController(Card card, TurnTakerController turnTakerController) 11 | : base(card, turnTakerController) 12 | { 13 | } 14 | 15 | public override IEnumerator Play() 16 | { 17 | // When this card enters play, deal each non-chat target 1 Lightning damage. 18 | return DealDamage(this.Card, c => !c.DoKeywordsContain("chat"), 1, DamageType.Lightning); 19 | } 20 | 21 | public override void AddTriggers() 22 | { 23 | // At the start of the Environment turn... 24 | AddStartOfTurnTrigger(tt => tt == this.TurnTaker, StartOfTurnResponse, TriggerType.GainHP); 25 | } 26 | 27 | private IEnumerator StartOfTurnResponse(PhaseChangeAction phaseChangeAction) 28 | { 29 | // ... each target regains 1 HP. 30 | return this.GameController.GainHP(this.DecisionMaker, c => true, 1, cardSource:GetCardSource()); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /MyMod/DevStream/ModderCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | 6 | namespace Workshopping.DevStream 7 | { 8 | public class ModderCardController: CardController 9 | { 10 | public ModderCardController(Card card, TurnTakerController turnTakerController) 11 | : base(card, turnTakerController) 12 | { 13 | } 14 | 15 | public override void AddTriggers() 16 | { 17 | // At the start of the environment turn... 18 | AddStartOfTurnTrigger(tt => tt == this.TurnTaker, PlayTopCardOfEachDeckInTurnOrderResponse, TriggerType.PlayCard); 19 | 20 | } 21 | 22 | private IEnumerator PlayTopCardOfEachDeckInTurnOrderResponse(PhaseChangeAction phaseChange) 23 | { 24 | // ...put the top card of the villain deck into play. 25 | var e1 = this.GameController.SendMessageAction("Slamara puts the top card of the villain deck, and then the top card of each hero deck into play in turn order.", Priority.Low, cardSource: GetCardSource()); 26 | var e2 = PlayTopCardOfEachDeckInTurnOrder(ttc => ttc.IsVillain && !ttc.TurnTaker.IsScion, l => l.IsVillain, this.TurnTaker, true, false); 27 | if (UseUnityCoroutines) 28 | { 29 | yield return this.GameController.StartCoroutine(e1); 30 | yield return this.GameController.StartCoroutine(e2); 31 | } 32 | else 33 | { 34 | this.GameController.ExhaustCoroutine(e1); 35 | this.GameController.ExhaustCoroutine(e2); 36 | 37 | } 38 | 39 | // Then, put the top card of each hero deck into play in turn order. 40 | // If a limited card already in play would be put into play, discard that card instead. 41 | var e = PlayTopCardOfEachDeckInTurnOrder(ttc => ttc.IsHero, l => l.IsHero, this.TurnTaker, true, false); 42 | if (UseUnityCoroutines) 43 | { 44 | yield return this.GameController.StartCoroutine(e); 45 | } 46 | else 47 | { 48 | this.GameController.ExhaustCoroutine(e); 49 | 50 | } 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /MyMod/DevStream/SpamBotCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | 6 | namespace Workshopping.DevStream 7 | { 8 | public class SpamBotCardController: CardController 9 | { 10 | public SpamBotCardController(Card card, TurnTakerController turnTakerController) 11 | : base(card, turnTakerController) 12 | { 13 | SpecialStringMaker.ShowNonEnvironmentTargetWithHighestHP(2); 14 | } 15 | 16 | public override void AddTriggers() 17 | { 18 | //At the end of the environment turn, this card deals the non-environment target with the second highest HP {H-1} psychic damage. 19 | AddEndOfTurnTrigger(tt => tt == this.TurnTaker, p => DealDamageToHighestHP(this.Card, 2, c => c.IsNonEnvironmentTarget, c => H-1, DamageType.Psychic), TriggerType.DealDamage); 20 | 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /MyMod/MigrantCoder/BugFixCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using Handelabra.Sentinels.Engine.Controller; 6 | using Handelabra.Sentinels.Engine.Model; 7 | namespace Workshopping.MigrantCoder 8 | { 9 | public class BugFixCardController: CardController 10 | { 11 | public BugFixCardController(Card card, TurnTakerController turnTakerController) 12 | : base(card, turnTakerController) 13 | { 14 | } 15 | 16 | public override IEnumerator UsePower(int index = 0) 17 | { 18 | // Migrant Coder deals 1 target 4 lightning damage. 19 | var numberOfTargets = GetPowerNumeral(0, 1); 20 | var damageAmount = GetPowerNumeral(1, 4); 21 | return this.GameController.SelectTargetsAndDealDamage(this.DecisionMaker, 22 | new DamageSource(this.GameController, this.CharacterCard), 23 | damageAmount, 24 | DamageType.Lightning, 25 | numberOfTargets, 26 | false, 27 | numberOfTargets, 28 | cardSource: GetCardSource()); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /MyMod/MigrantCoder/CodersKeyboardCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | 6 | namespace Workshopping.MigrantCoder 7 | { 8 | public class CodersKeyboardCardController : CardController 9 | { 10 | public CodersKeyboardCardController(Card card, TurnTakerController turnTakerController) 11 | : base(card, turnTakerController) 12 | { 13 | this.GameController.AddCardControllerToList(CardControllerListType.IncreasePhaseActionCount, this); 14 | } 15 | 16 | public override void AddTriggers() 17 | { 18 | // You may use an additional power during your power phase. 19 | AddAdditionalPhaseActionTrigger(tt => ShouldIncreasePhaseActionCount(tt), Phase.UsePower, 1); 20 | } 21 | 22 | public override IEnumerator Play() 23 | { 24 | // You may use an additional power during your power phase. 25 | return IncreasePhaseActionCountIfInPhase(tt => tt == this.TurnTaker, Phase.UsePower, 1); 26 | } 27 | 28 | public override bool DoesHaveActivePlayMethod 29 | { 30 | get 31 | { 32 | return false; 33 | } 34 | } 35 | 36 | private bool ShouldIncreasePhaseActionCount(TurnTaker tt) 37 | { 38 | return tt == this.TurnTaker; 39 | } 40 | 41 | public override bool AskIfIncreasingCurrentPhaseActionCount() 42 | { 43 | return this.GameController.ActiveTurnPhase.IsUsePower 44 | && ShouldIncreasePhaseActionCount(this.GameController.ActiveTurnTaker); 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /MyMod/MigrantCoder/MigrantCoderCharacterCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | 6 | namespace Workshopping.MigrantCoder 7 | { 8 | public class MigrantCoderCharacterCardController : HeroCharacterCardController 9 | { 10 | public string str; 11 | 12 | public MigrantCoderCharacterCardController(Card card, TurnTakerController turnTakerController) 13 | : base(card, turnTakerController) 14 | { 15 | } 16 | 17 | public override IEnumerator UsePower(int index = 0) 18 | { 19 | // Draw 1 card 20 | var numberOfCards = GetPowerNumeral(0, 1); 21 | IEnumerator e = DrawCards(this.HeroTurnTakerController, numberOfCards); 22 | 23 | if (UseUnityCoroutines) 24 | { 25 | yield return this.GameController.StartCoroutine(e); 26 | } 27 | else 28 | { 29 | this.GameController.ExhaustCoroutine(e); 30 | } 31 | 32 | // Deal 1 target 2 psychic damage 33 | var numberOfTargets = GetPowerNumeral(1, 1); 34 | var damageAmount = GetPowerNumeral(2, 2); 35 | e = this.GameController.SelectTargetsAndDealDamage(this.DecisionMaker, new DamageSource(this.GameController, this.CharacterCard), damageAmount, DamageType.Psychic, numberOfTargets, false, numberOfTargets, cardSource:GetCardSource()); 36 | 37 | if (UseUnityCoroutines) 38 | { 39 | yield return this.GameController.StartCoroutine(e); 40 | } 41 | else 42 | { 43 | this.GameController.ExhaustCoroutine(e); 44 | } 45 | } 46 | 47 | public override IEnumerator UseIncapacitatedAbility(int index) 48 | { 49 | IEnumerator e = null; 50 | 51 | switch (index) 52 | { 53 | case 0: 54 | // One player may play a card now. 55 | e = SelectHeroToPlayCard(this.DecisionMaker); 56 | break; 57 | case 1: 58 | // One hero may use a power now. 59 | e = this.GameController.SelectHeroToUsePower(this.DecisionMaker, cardSource: GetCardSource()); 60 | break; 61 | case 2: 62 | // One player may draw a card now 63 | e = this.GameController.SelectHeroToDrawCard(this.DecisionMaker, cardSource: GetCardSource()); 64 | break; 65 | } 66 | 67 | return e; 68 | } 69 | } 70 | } -------------------------------------------------------------------------------- /MyMod/MigrantCoder/MigrantCoderLockdownCharacterCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | 6 | namespace Workshopping.MigrantCoder 7 | { 8 | public class MigrantCoderLockdownCharacterCardController : HeroCharacterCardController 9 | { 10 | public MigrantCoderLockdownCharacterCardController(Card card, TurnTakerController turnTakerController) 11 | : base(card, turnTakerController) 12 | { 13 | } 14 | 15 | public override IEnumerator UsePower(int index = 0) 16 | { 17 | // Reduce damage dealt to {MigrantCoder} by 1 until the start of your next turn. 18 | var damageReduceAmount = GetPowerNumeral(0, 1); 19 | var effect = new ReduceDamageStatusEffect(damageReduceAmount); 20 | effect.TargetCriteria.IsSpecificCard = this.CharacterCard; 21 | effect.TargetCriteria.OutputString = this.TurnTaker.Name; 22 | effect.UntilStartOfNextTurn(this.TurnTaker); 23 | 24 | return AddStatusEffect(effect); 25 | } 26 | 27 | public override IEnumerator UseIncapacitatedAbility(int index) 28 | { 29 | IEnumerator e = null; 30 | 31 | switch (index) 32 | { 33 | case 0: 34 | // One player may play a card now. 35 | e = SelectHeroToPlayCard(this.DecisionMaker); 36 | break; 37 | case 1: 38 | // One hero may use a power now. 39 | e = this.GameController.SelectHeroToUsePower(this.DecisionMaker, cardSource: GetCardSource()); 40 | break; 41 | case 2: 42 | // One player may draw a card now 43 | e = this.GameController.SelectHeroToDrawCard(this.DecisionMaker, cardSource: GetCardSource()); 44 | break; 45 | } 46 | 47 | return e; 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /MyMod/MigrantCoder/MigrantCoderTurnTakerController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | 6 | namespace Workshopping.MigrantCoder 7 | { 8 | public class MigrantCoderTurnTakerController : HeroTurnTakerController 9 | { 10 | public MigrantCoderTurnTakerController(TurnTaker turnTaker, GameController gameController) 11 | : base(turnTaker, gameController) 12 | { 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /MyMod/MigrantCoder/PunchingBagCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | using System.Collections.Generic; 6 | 7 | namespace Workshopping.MigrantCoder 8 | { 9 | public class PunchingBagCardController : CardController 10 | { 11 | public PunchingBagCardController(Card card, TurnTakerController turnTakerController) 12 | : base(card, turnTakerController) 13 | { 14 | } 15 | 16 | private int _customDecisionIndex; 17 | 18 | public override IEnumerator Play() 19 | { 20 | IEnumerator e; 21 | 22 | _customDecisionIndex = 0; 23 | var storedResults = new List(); 24 | e = this.GameController.MakeYesNoCardDecision(this.DecisionMaker, SelectionType.Custom, this.Card, storedResults:storedResults, cardSource:GetCardSource()); 25 | if (UseUnityCoroutines) 26 | { 27 | yield return this.GameController.StartCoroutine(e); 28 | } 29 | else 30 | { 31 | this.GameController.ExhaustCoroutine(e); 32 | } 33 | 34 | if (DidPlayerAnswerYes(storedResults)) 35 | { 36 | var damageResults = new List(); 37 | e = DealDamage(this.CharacterCard, this.CharacterCard, 1, DamageType.Melee, storedResults: damageResults); 38 | if (UseUnityCoroutines) 39 | { 40 | yield return this.GameController.StartCoroutine(e); 41 | } 42 | else 43 | { 44 | this.GameController.ExhaustCoroutine(e); 45 | } 46 | 47 | if (DidDealDamage(damageResults)) 48 | { 49 | // Play two cards. 50 | e = SelectAndPlayCardsFromHand(this.DecisionMaker, 2); 51 | if (UseUnityCoroutines) 52 | { 53 | yield return this.GameController.StartCoroutine(e); 54 | } 55 | else 56 | { 57 | this.GameController.ExhaustCoroutine(e); 58 | } 59 | } 60 | } 61 | else 62 | { 63 | // Ask another decision of the same type, because maybe they want cake. 64 | _customDecisionIndex = 1; 65 | storedResults = new List(); 66 | e = this.GameController.MakeYesNoCardDecision(this.DecisionMaker, SelectionType.Custom, this.Card, storedResults: storedResults, cardSource: GetCardSource()); 67 | if (UseUnityCoroutines) 68 | { 69 | yield return this.GameController.StartCoroutine(e); 70 | } 71 | else 72 | { 73 | this.GameController.ExhaustCoroutine(e); 74 | } 75 | 76 | string msg = DidPlayerAnswerYes(storedResults) ? "Good call, it's delicious and moist!" : "No cake for you!"; 77 | var message = this.GameController.SendMessageAction(msg, Priority.Medium, GetCardSource()); 78 | if (UseUnityCoroutines) 79 | { 80 | yield return this.GameController.StartCoroutine(message); 81 | } 82 | else 83 | { 84 | this.GameController.ExhaustCoroutine(message); 85 | } 86 | } 87 | } 88 | 89 | public override CustomDecisionText GetCustomDecisionText(IDecision decision) 90 | { 91 | if (decision is YesNoCardDecision yesNoCard) 92 | { 93 | if (_customDecisionIndex == 0) 94 | { 95 | return new CustomDecisionText("Do you want to think happy thoughts about {0}?", "Should they think happy thoughts?", "Vote for thinking happy thoughts", "happy thinking"); 96 | } 97 | else 98 | { 99 | return new CustomDecisionText("Can I get you some cake?", "Should they get cake?", "Vote for getting cake", "get cake", false); 100 | } 101 | } 102 | 103 | return null; 104 | } 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /MyMod/MigrantCoder/WorstCardEverCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | 6 | namespace Workshopping.MigrantCoder 7 | { 8 | public class WorstCardEverCardController : CardController 9 | { 10 | public WorstCardEverCardController(Card card, TurnTakerController turnTakerController) 11 | : base(card, turnTakerController) 12 | { 13 | } 14 | 15 | public override IEnumerator Play() 16 | { 17 | return this.GameController.SendMessageAction("You knew this card does nothing. Why would you play it?", Priority.Medium, GetCardSource()); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /MyMod/MyMod.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Debug 5 | AnyCPU 6 | {44F8C838-553C-482C-B389-2B375B8590C9} 7 | Library 8 | Workshopping 9 | MyMod 10 | v4.8 11 | 12 | 13 | true 14 | full 15 | false 16 | bin\Debug 17 | DEBUG; 18 | prompt 19 | 4 20 | false 21 | 22 | 23 | true 24 | bin\Release 25 | prompt 26 | 4 27 | false 28 | 29 | 30 | 31 | 32 | ..\..\..\..\Library\Application Support\Steam\steamapps\common\Sentinels of the Multiverse\Sentinels.app\Contents\Resources\Data\Managed\EngineCommon.dll 33 | 34 | 35 | ..\..\..\..\Library\Application Support\Steam\steamapps\common\Sentinels of the Multiverse\Sentinels.app\Contents\Resources\Data\Managed\SentinelsEngine.dll 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /MyMod/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | 4 | // Information about this assembly is defined by the following attributes. 5 | // Change them to the values specific to your project. 6 | 7 | [assembly: AssemblyTitle("MyMod")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("")] 12 | [assembly: AssemblyCopyright("${AuthorCopyright}")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". 17 | // The form "{Major}.{Minor}.*" will automatically update the build and revision, 18 | // and "{Major}.{Minor}.{Build}.*" will update just the revision. 19 | 20 | [assembly: AssemblyVersion("1.0.*")] 21 | 22 | // The following attributes are used to specify the signing key for the assembly, 23 | // if desired. See the Mono documentation for more information about signing. 24 | 25 | //[assembly: AssemblyDelaySign(false)] 26 | //[assembly: AssemblyKeyFile("")] 27 | -------------------------------------------------------------------------------- /MyMod/SkyScraper/CentristSkyScraperHugeCharacterCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | namespace Workshopping.SkyScraper 6 | { 7 | public class CentristSkyScraperHugeCharacterCardController : HeroCharacterCardController 8 | { 9 | public CentristSkyScraperHugeCharacterCardController(Card card, TurnTakerController turnTakerController) 10 | : base(card, turnTakerController) 11 | { 12 | } 13 | 14 | public override IEnumerator UseIncapacitatedAbility(int index) 15 | { 16 | IEnumerator e = null; 17 | 18 | switch (index) 19 | { 20 | case 0: 21 | // One player may play a card now. 22 | e = SelectHeroToPlayCard(this.DecisionMaker); 23 | break; 24 | case 1: 25 | // One hero may use a power now. 26 | e = this.GameController.SelectHeroToUsePower(this.DecisionMaker, cardSource: GetCardSource()); 27 | break; 28 | case 2: 29 | // One player may draw a card now 30 | e = this.GameController.SelectHeroToDrawCard(this.DecisionMaker, cardSource: GetCardSource()); 31 | break; 32 | } 33 | 34 | return e; 35 | } 36 | 37 | public override IEnumerator UsePower(int index = 0) 38 | { 39 | // Sky-Scraper deals each target 1 sonic damage. 40 | var damageAmount = GetPowerNumeral(0, 1); 41 | return DealDamage(this.Card, c => true, damageAmount, DamageType.Sonic); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /MyMod/SkyScraper/CentristSkyScraperNormalCharacterCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | namespace Workshopping.SkyScraper 6 | { 7 | public class CentristSkyScraperNormalCharacterCardController : HeroCharacterCardController 8 | { 9 | public CentristSkyScraperNormalCharacterCardController(Card card, TurnTakerController turnTakerController) 10 | : base(card, turnTakerController) 11 | { 12 | } 13 | 14 | public override IEnumerator UseIncapacitatedAbility(int index) 15 | { 16 | IEnumerator e = null; 17 | 18 | switch (index) 19 | { 20 | case 0: 21 | // One player may play a card now. 22 | e = SelectHeroToPlayCard(this.DecisionMaker); 23 | break; 24 | case 1: 25 | // One hero may use a power now. 26 | e = this.GameController.SelectHeroToUsePower(this.DecisionMaker, cardSource: GetCardSource()); 27 | break; 28 | case 2: 29 | // One player may draw a card now 30 | e = this.GameController.SelectHeroToDrawCard(this.DecisionMaker, cardSource: GetCardSource()); 31 | break; 32 | } 33 | 34 | return e; 35 | } 36 | 37 | public override IEnumerator UsePower(int index = 0) 38 | { 39 | // Draw 3 cards! 40 | var numberOfCards = GetPowerNumeral(0, 3); 41 | IEnumerator e = DrawCards(this.HeroTurnTakerController, numberOfCards); 42 | 43 | if (UseUnityCoroutines) 44 | { 45 | yield return this.GameController.StartCoroutine(e); 46 | } 47 | else 48 | { 49 | this.GameController.ExhaustCoroutine(e); 50 | } 51 | 52 | // Switch to huge! 53 | if (this.Card.IsInPlayAndHasGameText && !this.TurnTaker.IsIncapacitatedOrOutOfGame && this.Card.SharedIdentifier != null) 54 | { 55 | var otherCard = this.TurnTaker.FindCard("SkyScraperHugeCharacter"); 56 | 57 | if (otherCard != null) 58 | { 59 | e = this.GameController.SwitchCards(this.Card, otherCard, cardSource: GetCardSource()); 60 | if (UseUnityCoroutines) 61 | { 62 | yield return this.GameController.StartCoroutine(e); 63 | } 64 | else 65 | { 66 | this.GameController.ExhaustCoroutine(e); 67 | 68 | } 69 | } 70 | 71 | } 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /MyMod/SkyScraper/CentristSkyScraperTinyCharacterCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | using System.Collections.Generic; 6 | using System.Linq; 7 | 8 | namespace Workshopping.SkyScraper 9 | { 10 | public class CentristSkyScraperTinyCharacterCardController : HeroCharacterCardController 11 | { 12 | public CentristSkyScraperTinyCharacterCardController(Card card, TurnTakerController turnTakerController) 13 | : base(card, turnTakerController) 14 | { 15 | } 16 | 17 | public override IEnumerator UseIncapacitatedAbility(int index) 18 | { 19 | IEnumerator e = null; 20 | 21 | switch (index) 22 | { 23 | case 0: 24 | // One player may play a card now. 25 | e = SelectHeroToPlayCard(this.DecisionMaker); 26 | break; 27 | case 1: 28 | // One hero may use a power now. 29 | e = this.GameController.SelectHeroToUsePower(this.DecisionMaker, cardSource: GetCardSource()); 30 | break; 31 | case 2: 32 | // One player may draw a card now 33 | e = this.GameController.SelectHeroToDrawCard(this.DecisionMaker, cardSource: GetCardSource()); 34 | break; 35 | } 36 | 37 | return e; 38 | } 39 | 40 | public override IEnumerator UsePower(int index = 0) 41 | { 42 | // Reveal the top card of a deck. Put it into play or into the trash. 43 | var storedResults = new List(); 44 | var e = this.GameController.SelectADeck(this.DecisionMaker, SelectionType.RevealTopCardOfDeck, l => true, storedResults, cardSource: GetCardSource()); 45 | if (UseUnityCoroutines) 46 | { 47 | yield return this.GameController.StartCoroutine(e); 48 | } 49 | else 50 | { 51 | this.GameController.ExhaustCoroutine(e); 52 | } 53 | 54 | if (DidSelectDeck(storedResults)) 55 | { 56 | var deck = storedResults.First().SelectedLocation.Location; 57 | if (deck != null) 58 | { 59 | e = RevealCard_PlayItOrDiscardIt(this.TurnTakerController, deck, true, responsibleTurnTaker: this.TurnTaker, isDiscard: false); 60 | if (UseUnityCoroutines) 61 | { 62 | yield return this.GameController.StartCoroutine(e); 63 | } 64 | else 65 | { 66 | this.GameController.ExhaustCoroutine(e); 67 | } 68 | } 69 | } 70 | } 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /MyMod/TheBaddies/FireEverythingCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | 6 | namespace Workshopping.TheBaddies 7 | { 8 | public class FireEverythingCardController : CardController 9 | { 10 | public FireEverythingCardController(Card card, TurnTakerController turnTakerController) 11 | : base(card, turnTakerController) 12 | { 13 | } 14 | 15 | public override IEnumerator Play() 16 | { 17 | return DealDamage(this.CharacterCard, c => c.IsTarget && !IsVillainTarget(c), 5, DamageType.Psychic); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /MyMod/TheBaddies/SmashBackFieldCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | namespace Workshopping.TheBaddies 5 | { 6 | public class SmashBackFieldCardController : CardController 7 | { 8 | public SmashBackFieldCardController(Card card, TurnTakerController turnTakerController) 9 | : base(card, turnTakerController) 10 | { 11 | } 12 | 13 | public override void AddTriggers() 14 | { 15 | // The first time {TheBaddies} is dealt damage by a target each turn, {TheBaddies} deals that target 2 melee damage. 16 | AddCounterDamageTrigger(dd => dd.Target == this.CharacterCard && dd.DidDealDamage, () => this.CharacterCard, () => this.CharacterCard, true, 2, DamageType.Melee); 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /MyMod/TheBaddies/TheBaddiesCharacterCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using Handelabra.Sentinels.Engine.Controller; 4 | using Handelabra.Sentinels.Engine.Model; 5 | 6 | namespace Workshopping.TheBaddies 7 | { 8 | public class TheBaddiesCharacterCardController : VillainCharacterCardController 9 | { 10 | public TheBaddiesCharacterCardController(Card card, TurnTakerController turnTakerController) 11 | : base(card, turnTakerController) 12 | { 13 | } 14 | 15 | public override bool CanBeDestroyed 16 | { 17 | get 18 | { 19 | // Can only be destroyed if we are flipped. 20 | return this.CharacterCard.IsFlipped; 21 | } 22 | } 23 | 24 | public override void AddSideTriggers() 25 | { 26 | if (!this.Card.IsFlipped) 27 | { 28 | // At the end of the villain turn... 29 | this.SideTriggers.Add(AddEndOfTurnTrigger(tt => tt == this.TurnTaker, EndVillainTurnResponse, TriggerType.DestroyCard)); 30 | 31 | if (IsGameAdvanced) 32 | { 33 | // At the end of the villain turn... 34 | this.SideTriggers.Add(AddEndOfTurnTrigger(tt => tt == this.TurnTaker, AdvancedEndVillainTurnResponse, TriggerType.DestroyCard)); 35 | } 36 | 37 | AddDefeatedIfMovedOutOfGameTriggers(); 38 | } 39 | else 40 | { 41 | 42 | // If HP is <= 0, we are defeated. 43 | AddDefeatedIfDestroyedTriggers(); 44 | } 45 | } 46 | 47 | public override IEnumerator DestroyAttempted(DestroyCardAction destroyCard) 48 | { 49 | if (!this.Card.IsFlipped) 50 | { 51 | // Run a FlipAction when we would be destroyed. 52 | var e = this.GameController.FlipCard(this, actionSource: destroyCard.ActionSource, cardSource: GetCardSource()); 53 | if (UseUnityCoroutines) 54 | { 55 | yield return this.GameController.StartCoroutine(e); 56 | } 57 | else 58 | { 59 | this.GameController.ExhaustCoroutine(e); 60 | 61 | } 62 | } 63 | } 64 | 65 | private IEnumerator EndVillainTurnResponse(PhaseChangeAction phaseChange) 66 | { 67 | // Destroy 1 hero ongoing card. 68 | return this.GameController.SelectAndDestroyCard(this.DecisionMaker, new LinqCardCriteria(c => c.IsInPlay && c.IsHero && IsOngoing(c), "hero ongoing"), false, cardSource: GetCardSource()); 69 | } 70 | 71 | private IEnumerator AdvancedEndVillainTurnResponse(PhaseChangeAction phaseChange) 72 | { 73 | // Destroy 1 equipment card. 74 | return this.GameController.SelectAndDestroyCard(this.DecisionMaker, new LinqCardCriteria(c => c.IsInPlay && this.GameController.IsEquipment(c), "equipment"), false, cardSource: GetCardSource()); 75 | } 76 | 77 | public override IEnumerator AfterFlipCardImmediateResponse() 78 | { 79 | var e = base.AfterFlipCardImmediateResponse(); 80 | if (UseUnityCoroutines) 81 | { 82 | yield return this.GameController.StartCoroutine(e); 83 | } 84 | else 85 | { 86 | this.GameController.ExhaustCoroutine(e); 87 | 88 | } 89 | 90 | // When flipped to this side, restore to 30 HP. 91 | var restoreHP = this.GameController.ChangeMaximumHP(this.Card, 30, true, cardSource: GetCardSource()); 92 | if (UseUnityCoroutines) 93 | { 94 | yield return this.GameController.StartCoroutine(restoreHP); 95 | } 96 | else 97 | { 98 | this.GameController.ExhaustCoroutine(restoreHP); 99 | 100 | } 101 | } 102 | 103 | protected override EndingResult GetEndingResultType() 104 | { 105 | // If on his back side, it's a normal victory. 106 | // If on his front side, a premature victory. 107 | 108 | if (this.Card.IsFlipped) 109 | { 110 | return EndingResult.VillainDestroyedVictory; 111 | } 112 | else 113 | { 114 | return EndingResult.PrematureVictory; 115 | } 116 | } 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /MyMod/TheBaddies/TheBaddiesTurnTakerController.cs: -------------------------------------------------------------------------------- 1 | using Handelabra.Sentinels.Engine.Controller; 2 | using Handelabra.Sentinels.Engine.Model; 3 | using System; 4 | using System.Collections; 5 | 6 | namespace Workshopping.TheBaddies 7 | { 8 | public class TheBaddiesTurnTakerController:TurnTakerController 9 | { 10 | public TheBaddiesTurnTakerController(TurnTaker turnTaker, GameController gameController) 11 | : base(turnTaker, gameController) 12 | { 13 | } 14 | 15 | public override IEnumerator StartGame() 16 | { 17 | // Play a SmashBackField 18 | Card card = this.TurnTaker.GetCardByIdentifier("SmashBackField"); 19 | var playCard = this.GameController.PlayCard(this, card, true, cardSource: new CardSource(this.CharacterCardController)); 20 | 21 | // Shuffle the villain deck 22 | var shuffle = this.GameController.ShuffleLocation(this.TurnTaker.Deck, cardSource: new CardSource(this.CharacterCardController)); 23 | 24 | if (UseUnityCoroutines) 25 | { 26 | yield return this.GameController.StartCoroutine(playCard); 27 | yield return this.GameController.StartCoroutine(shuffle); 28 | } 29 | else 30 | { 31 | this.GameController.ExhaustCoroutine(playCard); 32 | this.GameController.ExhaustCoroutine(shuffle); 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /MyMod/TheBaddies/TheRealBaddiesCharacterCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections; 3 | using Handelabra.Sentinels.Engine.Controller; 4 | using Handelabra.Sentinels.Engine.Model; 5 | 6 | namespace Workshopping.TheBaddies 7 | { 8 | public class TheRealBaddiesCharacterCardController : VillainCharacterCardController 9 | { 10 | public TheRealBaddiesCharacterCardController(Card card, TurnTakerController turnTakerController) 11 | : base(card, turnTakerController) 12 | { 13 | } 14 | 15 | public override bool CanBeDestroyed 16 | { 17 | get 18 | { 19 | // Can only be destroyed if we are flipped. 20 | return this.CharacterCard.IsFlipped; 21 | } 22 | } 23 | 24 | public override void AddSideTriggers() 25 | { 26 | if (!this.Card.IsFlipped) 27 | { 28 | // At the start of the villain turn... 29 | this.SideTriggers.Add(AddEndOfTurnTrigger(tt => tt == this.TurnTaker, StartVillainTurnResponse, TriggerType.DealDamage)); 30 | 31 | AddDefeatedIfMovedOutOfGameTriggers(); 32 | } 33 | else 34 | { 35 | 36 | // If HP is <= 0, we are defeated. 37 | AddDefeatedIfDestroyedTriggers(); 38 | } 39 | } 40 | 41 | public override IEnumerator DestroyAttempted(DestroyCardAction destroyCard) 42 | { 43 | if (!this.Card.IsFlipped) 44 | { 45 | // Run a FlipAction when we would be destroyed. 46 | var e = this.GameController.FlipCard(this, actionSource: destroyCard.ActionSource, cardSource: GetCardSource()); 47 | if (UseUnityCoroutines) 48 | { 49 | yield return this.GameController.StartCoroutine(e); 50 | } 51 | else 52 | { 53 | this.GameController.ExhaustCoroutine(e); 54 | 55 | } 56 | } 57 | } 58 | 59 | private IEnumerator StartVillainTurnResponse(PhaseChangeAction phaseChange) 60 | { 61 | // {TheBaddies} deals the Hero Target with the highest HP {H} Toxic Damage. 62 | return DealDamageToHighestHP(this.CharacterCard, 1, c => c.IsHero, c => H, DamageType.Toxic); 63 | } 64 | 65 | public override IEnumerator AfterFlipCardImmediateResponse() 66 | { 67 | var e = base.AfterFlipCardImmediateResponse(); 68 | if (UseUnityCoroutines) 69 | { 70 | yield return this.GameController.StartCoroutine(e); 71 | } 72 | else 73 | { 74 | this.GameController.ExhaustCoroutine(e); 75 | 76 | } 77 | 78 | // When flipped to this side, restore to 20 HP. 79 | var restoreHP = this.GameController.ChangeMaximumHP(this.Card, 20, true, cardSource: GetCardSource()); 80 | if (UseUnityCoroutines) 81 | { 82 | yield return this.GameController.StartCoroutine(restoreHP); 83 | } 84 | else 85 | { 86 | this.GameController.ExhaustCoroutine(restoreHP); 87 | 88 | } 89 | } 90 | 91 | protected override EndingResult GetEndingResultType() 92 | { 93 | // If on his back side, it's a normal victory. 94 | // If on his front side, a premature victory. 95 | 96 | if (this.Card.IsFlipped) 97 | { 98 | return EndingResult.VillainDestroyedVictory; 99 | } 100 | else 101 | { 102 | return EndingResult.PrematureVictory; 103 | } 104 | } 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /MyMod/TheBaddies/TheRealBaddiesTurnTakerController.cs: -------------------------------------------------------------------------------- 1 | using Handelabra.Sentinels.Engine.Controller; 2 | using Handelabra.Sentinels.Engine.Model; 3 | using System; 4 | using System.Collections; 5 | 6 | namespace Workshopping.TheBaddies 7 | { 8 | public class TheRealBaddiesTurnTakerController : TurnTakerController 9 | { 10 | public TheRealBaddiesTurnTakerController(TurnTaker turnTaker, GameController gameController) 11 | : base(turnTaker, gameController) 12 | { 13 | } 14 | 15 | public override IEnumerator StartGame() 16 | { 17 | // Play a WrightWeigh 18 | Card card = this.TurnTaker.GetCardByIdentifier("WrightWeigh"); 19 | var playCard = this.GameController.PlayCard(this, card, true, cardSource: new CardSource(this.CharacterCardController)); 20 | 21 | // Shuffle the villain deck 22 | var shuffle = this.GameController.ShuffleLocation(this.TurnTaker.Deck, cardSource: new CardSource(this.CharacterCardController)); 23 | 24 | if (UseUnityCoroutines) 25 | { 26 | yield return this.GameController.StartCoroutine(playCard); 27 | yield return this.GameController.StartCoroutine(shuffle); 28 | } 29 | else 30 | { 31 | this.GameController.ExhaustCoroutine(playCard); 32 | this.GameController.ExhaustCoroutine(shuffle); 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /MyMod/TheBaddies/WrightWeighCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | 6 | namespace Workshopping.TheBaddies 7 | { 8 | public class WrightWeighCardController : CardController 9 | { 10 | public WrightWeighCardController(Card card, TurnTakerController turnTakerController) 11 | : base(card, turnTakerController) 12 | { 13 | } 14 | 15 | public override void AddTriggers() 16 | { 17 | // At the end of the villain turn, each villain target regains H HP. 18 | AddEndOfTurnTrigger(tt => tt == this.TurnTaker, p => this.GameController.GainHP(this.DecisionMaker, card => IsVillainTarget(card), H, cardSource: GetCardSource()), TriggerType.GainHP); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /MyMod/TheHugMonsterTeam/TheHugMonsterTeamCharacterCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | 5 | namespace Workshopping.TheHugMonsterTeam 6 | { 7 | public class TheHugMonsterTeamCharacterCardController : VillainTeamCharacterCardController 8 | { 9 | public TheHugMonsterTeamCharacterCardController(Card card, TurnTakerController turnTakerController) 10 | : base(card, turnTakerController) 11 | { 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /MyMod/TheHugMonsterTeam/WarmEmbraceCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | using System.Collections.Generic; 6 | 7 | namespace Workshopping.TheHugMonsterTeam 8 | { 9 | public class WarmEmbraceCardController : CardController 10 | { 11 | public WarmEmbraceCardController(Card card, TurnTakerController turnTakerController) 12 | : base(card, turnTakerController) 13 | { } 14 | 15 | public override void AddTriggers() 16 | { 17 | // At the end of each turn... 18 | AddEndOfTurnTrigger(tt => true, EndOfTurnResponse, TriggerType.DealDamage); 19 | } 20 | 21 | private IEnumerator EndOfTurnResponse(PhaseChangeAction phaseChangeAction) 22 | { 23 | // ... {TheHugMonster} deals each hero target 1 Melee damage and 1 Fire damage. 24 | var info = new List(); 25 | info.Add(new DealDamageAction(GetCardSource(), new DamageSource(this.GameController, this.CharacterCard), null, 1, DamageType.Melee, false)); 26 | info.Add(new DealDamageAction(GetCardSource(), new DamageSource(this.GameController, this.CharacterCard), null, 1, DamageType.Fire, false)); 27 | 28 | return DealMultipleInstancesOfDamage(info, c => c.IsHero); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /MyMod/TheSentinels/DrMedicobraCharacterCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | using Handelabra.Sentinels.Engine.Controller.TheSentinels; 6 | 7 | namespace Workshopping.TheSentinels 8 | { 9 | public class DrMedicobraCharacterCardController : SentinelHeroCharacterCardController 10 | { 11 | public DrMedicobraCharacterCardController(Card card, TurnTakerController turnTakerController) 12 | : base(card, turnTakerController) 13 | { 14 | } 15 | 16 | public override IEnumerator UsePower(int index = 0) 17 | { 18 | var hpGainAmount = GetPowerNumeral(0, 2); 19 | // Each of The Sentinels regains 2 HP. 20 | var e = this.GameController.GainHP(this.DecisionMaker, 21 | c => c.IsHeroCharacterCard 22 | && c.Owner == this.TurnTaker, 23 | hpGainAmount, 24 | cardSource: GetCardSource()); 25 | if (UseUnityCoroutines) 26 | { 27 | yield return this.GameController.StartCoroutine(e); 28 | } 29 | else 30 | { 31 | this.GameController.ExhaustCoroutine(e); 32 | 33 | } 34 | 35 | // You may draw a card. 36 | e = DrawCard(optional: true); 37 | if (UseUnityCoroutines) 38 | { 39 | yield return this.GameController.StartCoroutine(e); 40 | } 41 | else 42 | { 43 | this.GameController.ExhaustCoroutine(e); 44 | 45 | } 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /MyMod/TheSentinels/MainsnakeCharacterCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | using Handelabra.Sentinels.Engine.Controller.TheSentinels; 6 | 7 | namespace Workshopping.TheSentinels 8 | { 9 | public class MainsnakeCharacterCardController : SentinelHeroCharacterCardController 10 | { 11 | public MainsnakeCharacterCardController(Card card, TurnTakerController turnTakerController) 12 | : base(card, turnTakerController) 13 | { 14 | } 15 | 16 | public override IEnumerator UsePower(int index = 0) 17 | { 18 | // Mainstay deals 1 target 3 melee damage. 19 | // The next damage dealt to that target is irreducible. 20 | var numberOfTargets = GetPowerNumeral(0, 1); 21 | var damageAmount = GetPowerNumeral(1, 3); 22 | return this.GameController.SelectTargetsAndDealDamage(this.DecisionMaker, 23 | new DamageSource(this.GameController, this.Card), 24 | damageAmount, 25 | DamageType.Melee, 26 | numberOfTargets, 27 | false, 28 | numberOfTargets, 29 | addStatusEffect: NextDamageIsIrreducibleResponse, 30 | selectTargetsEvenIfCannotDealDamage: true, 31 | cardSource: GetCardSource()); 32 | } 33 | 34 | private IEnumerator NextDamageIsIrreducibleResponse(DealDamageAction dd) 35 | { 36 | // The next damage dealt to that target is irreducible. 37 | MakeDamageIrreducibleStatusEffect effect = new MakeDamageIrreducibleStatusEffect(); 38 | effect.TargetCriteria.IsSpecificCard = dd.Target; 39 | effect.NumberOfUses = 1; 40 | effect.UntilCardLeavesPlay(dd.Target); 41 | 42 | return AddStatusEffect(effect); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /MyMod/TheSentinels/TheIdealizardCharacterCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | using Handelabra.Sentinels.Engine.Controller.TheSentinels; 6 | 7 | namespace Workshopping.TheSentinels 8 | { 9 | public class TheIdealizardCharacterCardController : SentinelHeroCharacterCardController 10 | { 11 | public TheIdealizardCharacterCardController(Card card, TurnTakerController turnTakerController) 12 | : base(card, turnTakerController) 13 | { 14 | } 15 | 16 | public override IEnumerator UsePower(int index = 0) 17 | { 18 | // The Idealist deals 1 target 2 psychic damage. 19 | // Until the start of your next turn, reduce damage dealt by a target dealt damage this way by 1. 20 | var numberOfTargets = GetPowerNumeral(0, 1); 21 | var damageAmount = GetPowerNumeral(1, 2); 22 | var damageReduceAmount = GetPowerNumeral(2, 1); 23 | return this.GameController.SelectTargetsAndDealDamage(this.DecisionMaker, 24 | new DamageSource(this.GameController, this.Card), 25 | damageAmount, 26 | DamageType.Psychic, 27 | numberOfTargets, 28 | false, 29 | numberOfTargets, 30 | addStatusEffect: dd => ReduceDamageResponse(dd, damageReduceAmount), 31 | cardSource: GetCardSource()); 32 | } 33 | 34 | private IEnumerator ReduceDamageResponse(DealDamageAction dd, int damageReduceAmount) 35 | { 36 | if (dd.DidDealDamage && dd.Target.IsInPlayAndHasGameText) 37 | { 38 | ReduceDamageStatusEffect effect = new ReduceDamageStatusEffect(damageReduceAmount); 39 | effect.SourceCriteria.IsSpecificCard = dd.Target; 40 | effect.UntilStartOfNextTurn(this.TurnTaker); 41 | effect.UntilCardLeavesPlay(dd.Target); 42 | 43 | var e = AddStatusEffect(effect); 44 | if (UseUnityCoroutines) 45 | { 46 | yield return this.GameController.StartCoroutine(e); 47 | } 48 | else 49 | { 50 | this.GameController.ExhaustCoroutine(e); 51 | 52 | } 53 | } 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /MyMod/TheSentinels/TheSerpentinelsInstructionsCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | using Handelabra.Sentinels.Engine.Controller.TheSentinels; 6 | 7 | namespace Workshopping.TheSentinels 8 | { 9 | public class TheSerpentinelsInstructionsCardController : TheSentinelsInstructionsCardController 10 | { 11 | public TheSerpentinelsInstructionsCardController(Card card, TurnTakerController turnTakerController) 12 | : base(card, turnTakerController) 13 | { 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /MyMod/TheSentinels/WrattleCharacterCardController.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Handelabra.Sentinels.Engine.Controller; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections; 5 | using Handelabra.Sentinels.Engine.Controller.TheSentinels; 6 | using System.Collections.Generic; 7 | using Handelabra; 8 | 9 | namespace Workshopping.TheSentinels 10 | { 11 | public class WrattleCharacterCardController : SentinelHeroCharacterCardController 12 | { 13 | public WrattleCharacterCardController(Card card, TurnTakerController turnTakerController) 14 | : base(card, turnTakerController) 15 | { 16 | } 17 | 18 | public override IEnumerator UsePower(int index = 0) 19 | { 20 | HeroTurnTaker hero = null; 21 | string turnTakerName; 22 | if (this.TurnTaker.IsHero) 23 | { 24 | hero = this.TurnTaker.ToHero(); 25 | turnTakerName = this.TurnTaker.Name; 26 | } 27 | else 28 | { 29 | turnTakerName = this.Card.Title; 30 | } 31 | 32 | // The next time a hero target is destroyed, you may move it to the owner's hand. 33 | WhenCardIsDestroyedStatusEffect effect = new WhenCardIsDestroyedStatusEffect(this.CardWithoutReplacements, "MoveItToTheBottomOfItsDeckResponse", "The next time a hero target is destroyed, " + turnTakerName + " may move it to its owner's hand.", new TriggerType[] { TriggerType.MoveCard, TriggerType.ChangePostDestroyDestination }, hero, this.Card); 34 | effect.CardDestroyedCriteria.IsHero = true; 35 | effect.CardDestroyedCriteria.IsTarget = true; 36 | effect.CanEffectStack = false; 37 | effect.Priority = StatusEffectPriority.Medium; 38 | effect.PostDestroyDestinationMustBeChangeable = true; 39 | effect.NumberOfUses = 1; 40 | 41 | return AddStatusEffect(effect); 42 | } 43 | 44 | public IEnumerator MoveItToTheBottomOfItsDeckResponse(DestroyCardAction d, HeroTurnTaker hero, StatusEffect effect, int[] powerNumerals = null) 45 | { 46 | //...you may move it to the bottom of its deck. 47 | if (d.PostDestroyDestinationCanBeChanged) 48 | { 49 | var storedResults = new List(); 50 | HeroTurnTakerController httc = null; 51 | if (hero != null) 52 | { 53 | httc = FindHeroTurnTakerController(hero); 54 | } 55 | var e = this.GameController.MakeYesNoCardDecision(httc, SelectionType.MoveCardToHand, d.CardToDestroy.Card, storedResults: storedResults, cardSource: GetCardSource()); 56 | if (UseUnityCoroutines) 57 | { 58 | yield return this.GameController.StartCoroutine(e); 59 | } 60 | else 61 | { 62 | this.GameController.ExhaustCoroutine(e); 63 | } 64 | 65 | if (DidPlayerAnswerYes(storedResults)) 66 | { 67 | var nativeDeck = d.CardToDestroy.Card.NativeDeck; 68 | var hand = nativeDeck.OwnerTurnTaker.ToHero().Hand; 69 | d.SetPostDestroyDestination(hand, false, storedResults.CastEnumerable(), cardSource: GetCardSource()); 70 | } 71 | } 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /MyModConsole/MyModConsole.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | true 5 | v4.8 6 | 7 | 8 | Debug 9 | AnyCPU 10 | {79F7ED14-FC8A-4625-A297-2CC51C5D803D} 11 | Exe 12 | MyModConsole 13 | MyModConsole 14 | 15 | 16 | true 17 | full 18 | false 19 | bin\Debug 20 | DEBUG; 21 | prompt 22 | 4 23 | true 24 | 25 | 26 | true 27 | bin\Release 28 | prompt 29 | 4 30 | true 31 | 32 | 33 | 34 | ..\packages\MathNet.Numerics.5.0.0\lib\net48\MathNet.Numerics.dll 35 | 36 | 37 | 38 | 39 | 40 | ..\..\..\..\Library\Application Support\Steam\steamapps\common\Sentinels of the Multiverse\Sentinels.app\Contents\Resources\Data\Managed\EngineCommon.dll 41 | 42 | 43 | ..\..\..\..\Library\Application Support\Steam\steamapps\common\Sentinels of the Multiverse\Sentinels.app\Contents\Resources\Data\Managed\SentinelsEngine.dll 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | {44f8c838-553c-482c-b389-2b375b8590c9} 56 | MyMod 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /MyModConsole/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | 4 | // Information about this assembly is defined by the following attributes. 5 | // Change them to the values specific to your project. 6 | 7 | [assembly: AssemblyTitle("MyModConsole")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("")] 12 | [assembly: AssemblyCopyright("${AuthorCopyright}")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | // The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". 17 | // The form "{Major}.{Minor}.*" will automatically update the build and revision, 18 | // and "{Major}.{Minor}.{Build}.*" will update just the revision. 19 | 20 | [assembly: AssemblyVersion("1.0.*")] 21 | 22 | // The following attributes are used to specify the signing key for the assembly, 23 | // if desired. See the Mono documentation for more information about signing. 24 | 25 | //[assembly: AssemblyDelaySign(false)] 26 | //[assembly: AssemblyKeyFile("")] 27 | -------------------------------------------------------------------------------- /MyModConsole/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /MyModTest/ExperimentTest.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using NUnit.Framework; 3 | using Handelabra.Sentinels.Engine.Model; 4 | using System.Collections.Generic; 5 | using System.Linq; 6 | 7 | namespace Handelabra.Sentinels.UnitTest 8 | { 9 | [TestFixture] 10 | public class ExperimentTest : BaseTest 11 | { 12 | [Test] 13 | public void TestSuperScientificTachyonProbability() 14 | { 15 | var allDeckIdentifiers = new List(); 16 | allDeckIdentifiers.AddRange(DeckDefinition.AvailableHeroes); 17 | allDeckIdentifiers.AddRange(DeckDefinition.AvailableVillains); 18 | allDeckIdentifiers.AddRange(DeckDefinition.AvailableVillainTeamMembers); 19 | allDeckIdentifiers.AddRange(DeckDefinition.AvailableEnvironments); 20 | SetupGameController(allDeckIdentifiers); 21 | CheckSSTProbability(); 22 | 23 | SetupGameController(DeckDefinition.OblivAeonDeck); 24 | CheckSSTProbability(); 25 | } 26 | 27 | private void CheckSSTProbability() 28 | { 29 | foreach (var hero in this.GameController.AllHeroControllers) 30 | { 31 | hero.HeroTurnTaker.MoveAllCards(hero.HeroTurnTaker.Hand, hero.HeroTurnTaker.Deck); 32 | } 33 | 34 | foreach (var tt in this.GameController.TurnTakerControllers.Select(ttc => ttc.TurnTaker)) 35 | { 36 | CheckDeckProbability(tt.Deck, tt.Name); 37 | if (tt.SubDecks != null) 38 | { 39 | foreach (var subdeck in tt.SubDecks) 40 | { 41 | CheckDeckProbability(subdeck, subdeck.SubDeckName); 42 | } 43 | } 44 | } 45 | } 46 | 47 | private void CheckDeckProbability(Location deck, string name) 48 | { 49 | float canPlay = 0; 50 | float combo = 0; 51 | 52 | var cards = deck.Cards.Where(c => !c.IsCharacter && c.IsRealCard && !c.IsShield && c.Identifier != "SafeHouse"); 53 | 54 | foreach (Card a in cards) 55 | { 56 | foreach (Card b in cards) 57 | { 58 | if (a != b) 59 | { 60 | combo++; 61 | if (a.Definition.Keywords.Any(b.Definition.Keywords.Contains)) 62 | { 63 | canPlay++; 64 | } 65 | } 66 | } 67 | } 68 | 69 | var play = (canPlay / combo) * 100f; 70 | var discard = 100f - play; 71 | Console.WriteLine(name + "\t " + play + "\t " + discard, 1); 72 | } 73 | 74 | [Test] 75 | public void TestSuperScientificTachyonProbabilityMonteCarlo() 76 | { 77 | 78 | var allDeckIdentifiers = new List(); 79 | allDeckIdentifiers.AddRange(DeckDefinition.AvailableHeroes); 80 | allDeckIdentifiers.AddRange(DeckDefinition.AvailableVillains); 81 | allDeckIdentifiers.AddRange(DeckDefinition.AvailableVillainTeamMembers); 82 | allDeckIdentifiers.AddRange(DeckDefinition.AvailableEnvironments); 83 | SetupGameController(allDeckIdentifiers); 84 | CheckSSTMonteCarlo(); 85 | 86 | SetupGameController(DeckDefinition.OblivAeonDeck); 87 | CheckSSTMonteCarlo(); 88 | } 89 | 90 | private void CheckSSTMonteCarlo() 91 | { 92 | foreach (var hero in this.GameController.AllHeroControllers) 93 | { 94 | hero.HeroTurnTaker.MoveAllCards(hero.HeroTurnTaker.Hand, hero.HeroTurnTaker.Deck); 95 | } 96 | 97 | foreach (var tt in this.GameController.TurnTakerControllers.Select(ttc => ttc.TurnTaker)) 98 | { 99 | CheckDeckMonteCarlo(tt.Deck, tt.Name); 100 | if (tt.SubDecks != null) 101 | { 102 | foreach (var subdeck in tt.SubDecks) 103 | { 104 | CheckDeckMonteCarlo(subdeck, subdeck.SubDeckName); 105 | } 106 | } 107 | } 108 | } 109 | 110 | private void CheckDeckMonteCarlo(Location deck, string name) 111 | { 112 | int numTrials = 10; 113 | //int numTrials = 1000000; 114 | int numPlays = 0; 115 | 116 | for (int i = 0; i < numTrials; i++) 117 | { 118 | deck.ShuffleCards(); 119 | 120 | var allowedCards = deck.Cards.Where(c => !c.IsCharacter && c.IsRealCard && !c.IsShield && c.Identifier != "SafeHouse"); 121 | var cards = allowedCards.Take(2); 122 | var a = cards.First(); 123 | var b = cards.Last(); 124 | 125 | if (a.Definition.Keywords.Any(b.Definition.Keywords.Contains)) 126 | { 127 | numPlays++; 128 | } 129 | } 130 | 131 | var play = 100f * (float)numPlays / (float)numTrials; 132 | var discard = 100f - play; 133 | Console.WriteLine(name + "\t " + play + "\t " + discard, 1); 134 | } 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /MyModTest/MigrantCoderTest.cs: -------------------------------------------------------------------------------- 1 | using NUnit.Framework; 2 | using System; 3 | using Workshopping; 4 | using Workshopping.MigrantCoder; 5 | using Handelabra.Sentinels.Engine.Model; 6 | using Handelabra.Sentinels.Engine.Controller; 7 | using System.Linq; 8 | using System.Collections; 9 | using Handelabra.Sentinels.UnitTest; 10 | using Workshopping.TheBaddies; 11 | using System.Collections.Generic; 12 | namespace MyModTest 13 | { 14 | [TestFixture()] 15 | public class MigrantCoderTest : BaseTest 16 | { 17 | protected HeroTurnTakerController migrant { get { return FindHero("MigrantCoder"); } } 18 | 19 | [Test()] 20 | public void TestPunchingBag() 21 | { 22 | SetupGameController("BaronBlade", "Workshopping.MigrantCoder", "Megalopolis"); 23 | 24 | StartGame(); 25 | 26 | GoToPlayCardPhase(migrant); 27 | 28 | // Punching Bag does 1 damage! But don't play a card. 29 | DecisionYesNo = true; 30 | DecisionDoNotSelectCard = SelectionType.PlayCard; 31 | QuickHPStorage(migrant); 32 | PlayCard("PunchingBag"); 33 | QuickHPCheck(-1); 34 | } 35 | 36 | [Test()] 37 | public void TestInnatePower() 38 | { 39 | SetupGameController("BaronBlade", "Workshopping.MigrantCoder", "Megalopolis"); 40 | 41 | StartGame(); 42 | 43 | var mdp = GetCardInPlay("MobileDefensePlatform"); 44 | 45 | // Base power draws 1 card! Deals 1 target 2 damage! 46 | QuickHandStorage(migrant.ToHero()); 47 | DecisionSelectTarget = mdp; 48 | QuickHPStorage(mdp); 49 | 50 | UsePower(migrant.CharacterCard); 51 | 52 | QuickHandCheck(1); 53 | QuickHPCheck(-2); 54 | 55 | } 56 | 57 | [Test()] 58 | public void TestMigrantCoderLockdown() 59 | { 60 | SetupGameController("BaronBlade", "Workshopping.MigrantCoder/MigrantCoderLockdown", "Megalopolis"); 61 | 62 | StartGame(); 63 | 64 | Assert.IsInstanceOf(typeof(MigrantCoderLockdownCharacterCardController), migrant.CharacterCardController); 65 | 66 | GoToUsePowerPhase(migrant); 67 | 68 | // Use power to reduce damage by 1 69 | QuickHPStorage(migrant); 70 | UsePower(migrant); 71 | PlayCard("PunchingBag"); 72 | QuickHPCheck(0); 73 | 74 | SaveAndLoad(); 75 | 76 | Assert.IsInstanceOf(typeof(MigrantCoderLockdownCharacterCardController), migrant.CharacterCardController); 77 | } 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /MyModTest/MyModTest.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | true 7 | 8 | 9 | v4.8 10 | 11 | 12 | Debug 13 | AnyCPU 14 | {AFE958F0-3C90-4493-A425-48A660B58E76} 15 | Library 16 | MyModTest 17 | MyModTest 18 | 19 | 20 | true 21 | full 22 | false 23 | bin\Debug 24 | DEBUG; 25 | prompt 26 | 4 27 | 28 | 29 | true 30 | bin\Release 31 | prompt 32 | 4 33 | 34 | 35 | 36 | ..\packages\MathNet.Numerics.5.0.0\lib\net48\MathNet.Numerics.dll 37 | 38 | 39 | ..\packages\NUnit.3.13.3\lib\net45\nunit.framework.dll 40 | 41 | 42 | 43 | ..\..\..\..\Library\Application Support\Steam\steamapps\common\Sentinels of the Multiverse\Sentinels.app\Contents\Resources\Data\Managed\EngineCommon.dll 44 | 45 | 46 | ..\..\..\..\Library\Application Support\Steam\steamapps\common\Sentinels of the Multiverse\Sentinels.app\Contents\Resources\Data\Managed\SentinelsEngine.dll 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | {44F8C838-553C-482C-B389-2B375B8590C9} 65 | MyMod 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /MyModTest/MyRandomTest.cs: -------------------------------------------------------------------------------- 1 | using NUnit.Framework; 2 | using System; 3 | using Workshopping; 4 | using Workshopping.MigrantCoder; 5 | using Handelabra.Sentinels.Engine.Model; 6 | using Handelabra.Sentinels.Engine.Controller; 7 | using System.Linq; 8 | using System.Collections; 9 | using Handelabra.Sentinels.UnitTest; 10 | using Workshopping.TheBaddies; 11 | using System.Collections.Generic; 12 | 13 | namespace MyModTest 14 | { 15 | [TestFixture()] 16 | public class MyRandomTest : RandomGameTest 17 | { 18 | static string[] ModHeroes = { "Workshopping.MigrantCoder" }; 19 | static string[] ModVillains = { "Workshopping.TheBaddies" }; 20 | static string[] ModEnvironments = { "Workshopping.DevStream" }; 21 | 22 | [Test] 23 | public void TestRandomGameWithModsToCompletion() 24 | { 25 | GameController gameController = SetupRandomGameController(false, 26 | DeckDefinition.AvailableHeroes.Concat(ModHeroes), 27 | DeckDefinition.AvailableVillains.Concat(ModVillains), 28 | DeckDefinition.AvailableEnvironments.Concat(ModEnvironments)); 29 | RunGame(gameController); 30 | } 31 | 32 | [Test] 33 | public void TestSomewhatReasonableGameWithModsToCompletion() 34 | { 35 | GameController gameController = SetupRandomGameController(true, 36 | DeckDefinition.AvailableHeroes.Concat(ModHeroes), 37 | DeckDefinition.AvailableVillains.Concat(ModVillains), 38 | DeckDefinition.AvailableEnvironments.Concat(ModEnvironments)); 39 | RunGame(gameController); 40 | } 41 | 42 | [Test] 43 | public void TestMyStuff() 44 | { 45 | GameController gameController = SetupRandomGameController(false, 46 | availableVillains:ModVillains, 47 | availableEnvironments:ModEnvironments, 48 | useHeroes: new List { "Workshopping.MigrantCoder" }); 49 | RunGame(gameController); 50 | } 51 | 52 | [Test] 53 | public void TestRandomGameAgainstBaronJeremy() 54 | { 55 | GameController gameController = SetupRandomGameController(false, 56 | DeckDefinition.AvailableHeroes.Concat(ModHeroes), 57 | DeckDefinition.AvailableVillains.Concat(ModVillains), 58 | DeckDefinition.AvailableEnvironments.Concat(ModEnvironments), 59 | overrideVillain: "BaronBlade", 60 | overrideVariants: new Dictionary { { "BaronBlade", "BaronJeremyCharacter" } }); 61 | RunGame(gameController); 62 | } 63 | 64 | [Test] 65 | public void TestRandomGameAgainstCustomVariantHeroes() 66 | { 67 | GameController gameController = SetupRandomGameController(false, 68 | DeckDefinition.AvailableHeroes.Concat(ModHeroes), 69 | DeckDefinition.AvailableVillains.Concat(ModVillains), 70 | DeckDefinition.AvailableEnvironments.Concat(ModEnvironments), 71 | useHeroes: new List { "SkyScraper", "TheSentinels" }, 72 | overrideVariants: new Dictionary 73 | { 74 | { "SkyScraper", "CentristSkyScraperNormalCharacter" }, 75 | { "TheSentinels", "TheSerpentinelsInstructions" } 76 | }); 77 | RunGame(gameController); 78 | } 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /MyModTest/Setup.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using NUnit.Framework; 3 | using System.Reflection; 4 | using Handelabra.Sentinels.Engine.Model; 5 | using Workshopping.MigrantCoder; 6 | using Handelabra; 7 | 8 | namespace MyModTest 9 | { 10 | [SetUpFixture] 11 | public class Setup 12 | { 13 | [OneTimeSetUp] 14 | public void DoSetup() 15 | { 16 | Log.DebugDelegate += Output; 17 | Log.WarningDelegate += Output; 18 | Log.ErrorDelegate += Output; 19 | 20 | // Tell the engine about our mod assembly so it can load up our code. 21 | // It doesn't matter which type as long as it comes from the mod's assembly. 22 | var a = Assembly.GetAssembly(typeof(MigrantCoderCharacterCardController)); // replace with your own type 23 | ModHelper.AddAssembly("Workshopping", a); // replace with your own namespace 24 | } 25 | 26 | protected void Output(string message) 27 | { 28 | Console.WriteLine(message); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /MyModTest/Test.cs: -------------------------------------------------------------------------------- 1 | using NUnit.Framework; 2 | using System; 3 | using Workshopping; 4 | using Workshopping.MigrantCoder; 5 | using Handelabra.Sentinels.Engine.Model; 6 | using Handelabra.Sentinels.Engine.Controller; 7 | using System.Linq; 8 | using System.Collections; 9 | using Handelabra.Sentinels.UnitTest; 10 | using Workshopping.TheBaddies; 11 | using System.Collections.Generic; 12 | 13 | namespace MyModTest 14 | { 15 | [TestFixture()] 16 | public class Test : BaseTest 17 | { 18 | protected TurnTakerController baddies { get { return FindVillain("TheBaddies"); } } 19 | protected TurnTakerController hug { get { return FindVillain("TheHugMonsterTeam"); } } 20 | protected HeroTurnTakerController migrant { get { return FindHero("MigrantCoder"); } } 21 | 22 | [Test()] 23 | public void TestModWorks() 24 | { 25 | SetupGameController("Workshopping.TheBaddies", "Workshopping.MigrantCoder", "Workshopping.DevStream"); 26 | 27 | Assert.AreEqual(3, this.GameController.TurnTakerControllers.Count()); 28 | 29 | Assert.IsNotNull(baddies); 30 | Assert.IsInstanceOf(typeof(TheBaddiesTurnTakerController), baddies); 31 | Assert.IsInstanceOf(typeof(TheBaddiesCharacterCardController), baddies.CharacterCardController); 32 | 33 | Assert.IsNotNull(migrant); 34 | Assert.IsInstanceOf(typeof(MigrantCoderTurnTakerController), migrant); 35 | Assert.IsInstanceOf(typeof(MigrantCoderCharacterCardController), migrant.CharacterCardController); 36 | 37 | Assert.IsNotNull(env); 38 | 39 | Assert.AreEqual(40, baddies.CharacterCard.HitPoints); 40 | Assert.AreEqual(30, migrant.CharacterCard.HitPoints); 41 | QuickHPStorage(baddies, migrant); 42 | 43 | StartGame(); 44 | 45 | AssertIsInPlay("SmashBackField"); 46 | 47 | // Always deals 5 psychic to non villains! 48 | PlayCard("FireEverything"); 49 | 50 | QuickHPCheck(0, -6); // Nemesis! 51 | 52 | StackDeck("DroppedFrame"); 53 | PlayTopCard(env); 54 | 55 | // Deals 1 damage 56 | QuickHPCheck(-1, -1); 57 | 58 | // Heals 1 at the start of the environment turn 59 | GoToStartOfTurn(env); 60 | QuickHPCheck(1, 1); 61 | } 62 | 63 | [Test()] 64 | public void TestHugMonster() 65 | { 66 | SetupGameController("Workshopping.TheHugMonsterTeam", "Workshopping.MigrantCoder", "BugbearTeam", "Legacy", "GreazerTeam", "TheWraith", "Megalopolis"); 67 | 68 | StartGame(); 69 | 70 | var warm = PlayTopCard(hug); 71 | 72 | QuickHPStorage(hug, migrant, bugbearTeam, legacy, greazerTeam, wraith); 73 | GoToEndOfTurn(hug); 74 | QuickHPCheck(0, -2, 0, -2, 0, -4); 75 | 76 | GoToPlayCardPhase(migrant); 77 | DestroyCard(warm); 78 | GoToEndOfTurn(migrant); 79 | QuickHPCheckZero(); 80 | 81 | } 82 | 83 | [Test()] 84 | public void TestTheRealBaddies() 85 | { 86 | SetupGameController("Workshopping.TheBaddies/Workshopping.TheRealBaddiesCharacter", "Workshopping.MigrantCoder", "Workshopping.DevStream"); 87 | 88 | Assert.AreEqual(3, this.GameController.TurnTakerControllers.Count()); 89 | 90 | Assert.IsNotNull(baddies); 91 | Assert.IsInstanceOf(typeof(TheRealBaddiesTurnTakerController), baddies); 92 | Assert.IsInstanceOf(typeof(TheRealBaddiesCharacterCardController), baddies.CharacterCardController); 93 | 94 | Assert.AreEqual(50, baddies.CharacterCard.HitPoints); 95 | QuickHPStorage(baddies, migrant); 96 | 97 | StartGame(); 98 | 99 | AssertNotInPlay("SmashBackField"); 100 | AssertIsInPlay("WrightWeigh"); 101 | 102 | GoToEndOfTurn(); 103 | } 104 | 105 | [Test()] 106 | public void TestDevStream() 107 | { 108 | SetupGameController("BaronBlade", "Workshopping.MigrantCoder", "Unity", "TheArgentAdept", "Workshopping.DevStream"); 109 | 110 | StartGame(); 111 | 112 | // Spam bot does H - 1 = 2 damage, plus 1 for nemesis bonus 113 | GoToStartOfTurn(env); 114 | PlayCard("SpamBot"); 115 | PlayCard("Modder"); 116 | QuickHPStorage(baron, migrant, unity, adept); 117 | GoToEndOfTurn(env); 118 | QuickHPCheck(0, -3, 0, 0); 119 | 120 | // Modder plays cards at the start of turn 121 | GoToEndOfTurn(adept); 122 | var bb = StackDeck("BladeBattalion"); 123 | var keyboard = StackDeck("CodersKeyboard"); 124 | var raptor = StackDeck("RaptorBot"); 125 | var bell = StackDeck("XusBell"); 126 | GoToStartOfTurn(env); 127 | AssertIsInPlay(bb, keyboard, raptor, bell); 128 | } 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /MyModTest/packages.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WorkshopSample 2 | This project is a rough template for developing a mod for Sentinels of the Multiverse. 3 | 4 | Visit our [website](https://sentinelsdigital.com/workshop) and the official [Engine Documentation](https://docs.google.com/document/d/e/2PACX-1vRvUNq-KAWwLdvQmhjpFp-dC6s7ZJqogQJFIFfCZrhJ6_kuS9yi5KG-OmEU3g2NqsB0zkMS0KPtTC5V/pub) to learn how to adapt this project for your mod, or to get started from scratch. 5 | 6 | Steam Workshop support in the game is now publicly available. We'll be continuing to make improvements, so to see the latest information on Workshop development status, please visit the [Trello board](https://trello.com/b/vYBMImbg/sotm-workshop). 7 | 8 | The project includes the following examples: 9 | 10 | - Hero (Migrant Coder) with variant 11 | - Classic villain (The Baddies) with variant 12 | - Team villain (The Hug Monster) 13 | - Environment (Dev Stream) 14 | - Variants: 15 | - Bunker (Wayward Bunker) 16 | - The Sentinels (The Serpentinels) 17 | - Sky-Scraper (Centrist Sky-Scraper) 18 | - Captain Thunder (Captain Thunderstruck) 19 | - Cricket from Cauldron mod (Noisy Cricket) 20 | - Baron Blade (Baron Jeremy) 21 | 22 | It also includes systems to help with testing your own projects: 23 | 24 | - BaseTest unit testing class 25 | - Console project for interactive testing 26 | 27 | None of the content in this mod is intended to be balanced for use in-game. It is here as an example for you to look at and build from, that is all. 28 | -------------------------------------------------------------------------------- /Resources/Atlas/EndGameEnvironments0.json: -------------------------------------------------------------------------------- 1 | {"frames": { 2 | 3 | "DevStreamDeckBack.jpg": 4 | { 5 | "frame": {"x":0,"y":0,"w":400,"h":200}, 6 | "rotated": false, 7 | "trimmed": false, 8 | "spriteSourceSize": {"x":0,"y":0,"w":400,"h":200}, 9 | "sourceSize": {"w":400,"h":200} 10 | }}, 11 | "meta": { 12 | "app": "https://www.codeandweb.com/texturepacker", 13 | "version": "1.0", 14 | "image": "EndGameEnvironments0.png", 15 | "format": "RGBA8888", 16 | "size": {"w":512,"h":512}, 17 | "scale": "1", 18 | "smartupdate": "$TexturePacker:SmartUpdate:4a9d75ae646e5a731208ad009665aa8e:f3879d2bbd17f3d0cdbb688f666c2a22:b7fe148a494bf1e85f5fd0bb60e71296$" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Resources/Atlas/EndGameEnvironments0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Atlas/EndGameEnvironments0.png -------------------------------------------------------------------------------- /Resources/Atlas/EndGameHeroes0.json: -------------------------------------------------------------------------------- 1 | {"frames": { 2 | 3 | "MigrantCoderCharacter.jpg": 4 | { 5 | "frame": {"x":0,"y":0,"w":400,"h":200}, 6 | "rotated": false, 7 | "trimmed": false, 8 | "spriteSourceSize": {"x":0,"y":0,"w":400,"h":200}, 9 | "sourceSize": {"w":400,"h":200} 10 | }, 11 | "MigrantCoderCharacterFlipped.jpg": 12 | { 13 | "frame": {"x":403,"y":0,"w":400,"h":200}, 14 | "rotated": false, 15 | "trimmed": false, 16 | "spriteSourceSize": {"x":0,"y":0,"w":400,"h":200}, 17 | "sourceSize": {"w":400,"h":200} 18 | }, 19 | "MigrantCoderLockdownCharacter.jpg": 20 | { 21 | "frame": {"x":0,"y":203,"w":400,"h":200}, 22 | "rotated": false, 23 | "trimmed": false, 24 | "spriteSourceSize": {"x":0,"y":0,"w":400,"h":200}, 25 | "sourceSize": {"w":400,"h":200} 26 | }, 27 | "MigrantCoderLockdownCharacterFlipped.jpg": 28 | { 29 | "frame": {"x":403,"y":203,"w":400,"h":200}, 30 | "rotated": false, 31 | "trimmed": false, 32 | "spriteSourceSize": {"x":0,"y":0,"w":400,"h":200}, 33 | "sourceSize": {"w":400,"h":200} 34 | }}, 35 | "meta": { 36 | "app": "https://www.codeandweb.com/texturepacker", 37 | "version": "1.0", 38 | "image": "EndGameHeroes0.png", 39 | "format": "RGBA8888", 40 | "size": {"w":1024,"h":1024}, 41 | "scale": "1", 42 | "smartupdate": "$TexturePacker:SmartUpdate:062ac6e9de183009ab1732be45cf2ad8:fa3c71cdbe1ae183dfe099b8ee3d6012:0423ae3ad7779086353f76e081c26386$" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Resources/Atlas/EndGameHeroes0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Atlas/EndGameHeroes0.png -------------------------------------------------------------------------------- /Resources/Atlas/EndGameVillains0.json: -------------------------------------------------------------------------------- 1 | {"frames": { 2 | 3 | "TheHugMonsterTeamCharacter.jpg": 4 | { 5 | "frame": {"x":0,"y":0,"w":400,"h":200}, 6 | "rotated": false, 7 | "trimmed": false, 8 | "spriteSourceSize": {"x":0,"y":0,"w":400,"h":200}, 9 | "sourceSize": {"w":400,"h":200} 10 | }, 11 | "TheHugMonsterTeamCharacterFlipped.jpg": 12 | { 13 | "frame": {"x":0,"y":203,"w":400,"h":200}, 14 | "rotated": false, 15 | "trimmed": false, 16 | "spriteSourceSize": {"x":0,"y":0,"w":400,"h":200}, 17 | "sourceSize": {"w":400,"h":200} 18 | }}, 19 | "meta": { 20 | "app": "https://www.codeandweb.com/texturepacker", 21 | "version": "1.0", 22 | "image": "EndGameVillains0.png", 23 | "format": "RGBA8888", 24 | "size": {"w":512,"h":512}, 25 | "scale": "1", 26 | "smartupdate": "$TexturePacker:SmartUpdate:3cf0cc4d76def885e1498d9092b36f28:48bb9e4417e86ca8686bdbb76aa6a97e:59b2a7f7e8641888b59d66729fbd2cbc$" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Resources/Atlas/EndGameVillains0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Atlas/EndGameVillains0.png -------------------------------------------------------------------------------- /Resources/Atlas/HeroLogos0.json: -------------------------------------------------------------------------------- 1 | {"frames": { 2 | 3 | "MigrantCoderCharacter.jpg": 4 | { 5 | "frame": {"x":0,"y":0,"w":330,"h":260}, 6 | "rotated": false, 7 | "trimmed": false, 8 | "spriteSourceSize": {"x":0,"y":0,"w":330,"h":260}, 9 | "sourceSize": {"w":330,"h":260} 10 | }, 11 | "MigrantCoderLockdownCharacter.jpg": 12 | { 13 | "frame": {"x":333,"y":0,"w":330,"h":260}, 14 | "rotated": false, 15 | "trimmed": false, 16 | "spriteSourceSize": {"x":0,"y":0,"w":330,"h":260}, 17 | "sourceSize": {"w":330,"h":260} 18 | }}, 19 | "meta": { 20 | "app": "https://www.codeandweb.com/texturepacker", 21 | "version": "1.0", 22 | "image": "HeroLogos0.png", 23 | "format": "RGBA8888", 24 | "size": {"w":1024,"h":1024}, 25 | "scale": "1", 26 | "smartupdate": "$TexturePacker:SmartUpdate:28e37f2dcfd7836e1eeadca23e7b3ac5:c7f5b451d54be95eb069ec61f37442b4:abd76add2ce06cabb8b0a8e056eb9b47$" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Resources/Atlas/HeroLogos0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Atlas/HeroLogos0.png -------------------------------------------------------------------------------- /Resources/Atlas/Icons0.json: -------------------------------------------------------------------------------- 1 | {"frames": { 2 | 3 | "MigrantCoderIcon.png": 4 | { 5 | "frame": {"x":0,"y":0,"w":128,"h":128}, 6 | "rotated": false, 7 | "trimmed": false, 8 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128}, 9 | "sourceSize": {"w":128,"h":128} 10 | }, 11 | "Whatever.png": 12 | { 13 | "frame": {"x":131,"y":0,"w":64,"h":64}, 14 | "rotated": false, 15 | "trimmed": false, 16 | "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64}, 17 | "sourceSize": {"w":64,"h":64} 18 | }}, 19 | "meta": { 20 | "app": "https://www.codeandweb.com/texturepacker", 21 | "version": "1.0", 22 | "image": "Icons0.png", 23 | "format": "RGBA8888", 24 | "size": {"w":256,"h":256}, 25 | "scale": "1", 26 | "smartupdate": "$TexturePacker:SmartUpdate:e2c9bc8ddd6f3f069690afea5c443d26:1a2920790b9da35904e0579eff6036d6:c680398f21d101d0a1ae6d7fc2a23608$" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Resources/Atlas/Icons0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Atlas/Icons0.png -------------------------------------------------------------------------------- /Resources/Atlas/MigrantCoderAtlas0.json: -------------------------------------------------------------------------------- 1 | {"frames": { 2 | 3 | "MigrantCoderCharacter.jpg": 4 | { 5 | "frame": {"x":0,"y":0,"w":177,"h":256}, 6 | "rotated": false, 7 | "trimmed": false, 8 | "spriteSourceSize": {"x":0,"y":0,"w":177,"h":256}, 9 | "sourceSize": {"w":177,"h":256} 10 | }, 11 | "MigrantCoderCharacterBack.jpg": 12 | { 13 | "frame": {"x":180,"y":0,"w":177,"h":256}, 14 | "rotated": false, 15 | "trimmed": false, 16 | "spriteSourceSize": {"x":0,"y":0,"w":177,"h":256}, 17 | "sourceSize": {"w":177,"h":256} 18 | }, 19 | "MigrantCoderLockdownCharacter.jpg": 20 | { 21 | "frame": {"x":360,"y":0,"w":177,"h":256}, 22 | "rotated": false, 23 | "trimmed": false, 24 | "spriteSourceSize": {"x":0,"y":0,"w":177,"h":256}, 25 | "sourceSize": {"w":177,"h":256} 26 | }, 27 | "MigrantCoderLockdownCharacterBack.jpg": 28 | { 29 | "frame": {"x":540,"y":0,"w":177,"h":256}, 30 | "rotated": false, 31 | "trimmed": false, 32 | "spriteSourceSize": {"x":0,"y":0,"w":177,"h":256}, 33 | "sourceSize": {"w":177,"h":256} 34 | }, 35 | "PunchingBag.jpg": 36 | { 37 | "frame": {"x":720,"y":0,"w":256,"h":198}, 38 | "rotated": false, 39 | "trimmed": false, 40 | "spriteSourceSize": {"x":0,"y":0,"w":256,"h":198}, 41 | "sourceSize": {"w":256,"h":198} 42 | }, 43 | "WorstCardEver.jpg": 44 | { 45 | "frame": {"x":0,"y":259,"w":256,"h":198}, 46 | "rotated": false, 47 | "trimmed": false, 48 | "spriteSourceSize": {"x":0,"y":0,"w":256,"h":198}, 49 | "sourceSize": {"w":256,"h":198} 50 | }}, 51 | "meta": { 52 | "app": "https://www.codeandweb.com/texturepacker", 53 | "version": "1.0", 54 | "image": "MigrantCoderAtlas0.png", 55 | "format": "RGBA8888", 56 | "size": {"w":1024,"h":1024}, 57 | "scale": "1", 58 | "smartupdate": "$TexturePacker:SmartUpdate:426addecc01804058fcc53e551fbc796:d78f7244e9d077c3936cca3b1d9ea2db:cc8898bfd81ed9434f5f9df89baecff8$" 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Resources/Atlas/MigrantCoderAtlas0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Atlas/MigrantCoderAtlas0.png -------------------------------------------------------------------------------- /Resources/Atlas/SetupGame0.json: -------------------------------------------------------------------------------- 1 | {"frames": { 2 | 3 | "DevStreamDeckBack.jpg": 4 | { 5 | "frame": {"x":0,"y":259,"w":178,"h":256}, 6 | "rotated": false, 7 | "trimmed": false, 8 | "spriteSourceSize": {"x":0,"y":0,"w":178,"h":256}, 9 | "sourceSize": {"w":178,"h":256} 10 | }, 11 | "MigrantCoderCharacter.jpg": 12 | { 13 | "frame": {"x":0,"y":0,"w":177,"h":256}, 14 | "rotated": false, 15 | "trimmed": false, 16 | "spriteSourceSize": {"x":0,"y":0,"w":177,"h":256}, 17 | "sourceSize": {"w":177,"h":256} 18 | }, 19 | "MigrantCoderLockdownCharacter.jpg": 20 | { 21 | "frame": {"x":180,"y":0,"w":177,"h":256}, 22 | "rotated": false, 23 | "trimmed": false, 24 | "spriteSourceSize": {"x":0,"y":0,"w":177,"h":256}, 25 | "sourceSize": {"w":177,"h":256} 26 | }}, 27 | "meta": { 28 | "app": "https://www.codeandweb.com/texturepacker", 29 | "version": "1.0", 30 | "image": "SetupGame0.png", 31 | "format": "RGBA8888", 32 | "size": {"w":515,"h":515}, 33 | "scale": "1", 34 | "smartupdate": "$TexturePacker:SmartUpdate:8f446058c63a05ecc500c6d2b6ba7661:1a746dec0a83fe36e590bef2ba388e88:4ee285c32a91b7652e02ac049f918b2a$" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Resources/Atlas/SetupGame0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Atlas/SetupGame0.png -------------------------------------------------------------------------------- /Resources/Atlas/VillainTeamIntro0.json: -------------------------------------------------------------------------------- 1 | {"frames": { 2 | 3 | "TheHugMonsterTeamCharacter.jpg": 4 | { 5 | "frame": {"x":0,"y":0,"w":320,"h":240}, 6 | "rotated": false, 7 | "trimmed": false, 8 | "spriteSourceSize": {"x":0,"y":0,"w":320,"h":240}, 9 | "sourceSize": {"w":320,"h":240} 10 | }}, 11 | "meta": { 12 | "app": "https://www.codeandweb.com/texturepacker", 13 | "version": "1.0", 14 | "image": "VillainTeamIntro0.png", 15 | "format": "RGBA8888", 16 | "size": {"w":512,"h":512}, 17 | "scale": "1", 18 | "smartupdate": "$TexturePacker:SmartUpdate:1cb4d86a6c88cce687f629282c963898:66f01eeb60645a3891414f8c3666ef3b:c417f19ea71f1ec6cee1263a97c885e5$" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Resources/Atlas/VillainTeamIntro0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Atlas/VillainTeamIntro0.png -------------------------------------------------------------------------------- /Resources/Atlas/VillainTeamLogos0.json: -------------------------------------------------------------------------------- 1 | {"frames": { 2 | 3 | "TheHugMonsterTeamCharacter.jpg": 4 | { 5 | "frame": {"x":0,"y":0,"w":330,"h":260}, 6 | "rotated": false, 7 | "trimmed": false, 8 | "spriteSourceSize": {"x":0,"y":0,"w":330,"h":260}, 9 | "sourceSize": {"w":330,"h":260} 10 | }}, 11 | "meta": { 12 | "app": "https://www.codeandweb.com/texturepacker", 13 | "version": "1.0", 14 | "image": "VillainTeamLogos0.png", 15 | "format": "RGBA8888", 16 | "size": {"w":512,"h":512}, 17 | "scale": "1", 18 | "smartupdate": "$TexturePacker:SmartUpdate:4bb958ec5e327a7bca8e28763ee8beca:fa0803bc2978c852c17626c4d9a4285c:0062886d92aa4828fffb275a03363a1a$" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Resources/Atlas/VillainTeamLogos0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Atlas/VillainTeamLogos0.png -------------------------------------------------------------------------------- /Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderCharacterHeroTurn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderCharacterHeroTurn.png -------------------------------------------------------------------------------- /Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderCharacterHeroTurnDamaged.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderCharacterHeroTurnDamaged.png -------------------------------------------------------------------------------- /Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderCharacterHeroTurnFlipped.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderCharacterHeroTurnFlipped.png -------------------------------------------------------------------------------- /Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderCharacterVillainTurn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderCharacterVillainTurn.png -------------------------------------------------------------------------------- /Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderCharacterVillainTurnDamaged.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderCharacterVillainTurnDamaged.png -------------------------------------------------------------------------------- /Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderCharacterVillainTurnFlipped.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderCharacterVillainTurnFlipped.png -------------------------------------------------------------------------------- /Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderLockdownCharacterHeroTurn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderLockdownCharacterHeroTurn.png -------------------------------------------------------------------------------- /Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderLockdownCharacterHeroTurnDamaged.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderLockdownCharacterHeroTurnDamaged.png -------------------------------------------------------------------------------- /Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderLockdownCharacterHeroTurnFlipped.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderLockdownCharacterHeroTurnFlipped.png -------------------------------------------------------------------------------- /Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderLockdownCharacterVillainTurn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderLockdownCharacterVillainTurn.png -------------------------------------------------------------------------------- /Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderLockdownCharacterVillainTurnDamaged.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderLockdownCharacterVillainTurnDamaged.png -------------------------------------------------------------------------------- /Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderLockdownCharacterVillainTurnFlipped.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Heroes/MigrantCoder/MigrantCoderLockdownCharacterVillainTurnFlipped.png -------------------------------------------------------------------------------- /Resources/Cutouts/StartOfGame/Heroes/MigrantCoderCharacterStartOfGame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/StartOfGame/Heroes/MigrantCoderCharacterStartOfGame.png -------------------------------------------------------------------------------- /Resources/Cutouts/StartOfGame/Heroes/MigrantCoderLockdownCharacterStartOfGame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/StartOfGame/Heroes/MigrantCoderLockdownCharacterStartOfGame.png -------------------------------------------------------------------------------- /Resources/Cutouts/StartOfGame/Villains/TheBaddiesCharacterStartOfGame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/StartOfGame/Villains/TheBaddiesCharacterStartOfGame.png -------------------------------------------------------------------------------- /Resources/Cutouts/Villains/TheBaddies/TheBaddiesCharacterHeroTurn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Villains/TheBaddies/TheBaddiesCharacterHeroTurn.png -------------------------------------------------------------------------------- /Resources/Cutouts/Villains/TheBaddies/TheBaddiesCharacterHeroTurnFlipped.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Villains/TheBaddies/TheBaddiesCharacterHeroTurnFlipped.png -------------------------------------------------------------------------------- /Resources/Cutouts/Villains/TheBaddies/TheBaddiesCharacterVillainTurn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Villains/TheBaddies/TheBaddiesCharacterVillainTurn.png -------------------------------------------------------------------------------- /Resources/Cutouts/Villains/TheBaddies/TheBaddiesCharacterVillainTurnFlipped.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Villains/TheBaddies/TheBaddiesCharacterVillainTurnFlipped.png -------------------------------------------------------------------------------- /Resources/Cutouts/Villains/TheHugMonsterTeam/TheHugMonsterTeamCharacterHeroTurn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Villains/TheHugMonsterTeam/TheHugMonsterTeamCharacterHeroTurn.png -------------------------------------------------------------------------------- /Resources/Cutouts/Villains/TheHugMonsterTeam/TheHugMonsterTeamCharacterHeroTurnFlipped.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Villains/TheHugMonsterTeam/TheHugMonsterTeamCharacterHeroTurnFlipped.png -------------------------------------------------------------------------------- /Resources/Cutouts/Villains/TheHugMonsterTeam/TheHugMonsterTeamCharacterVillainTurn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Villains/TheHugMonsterTeam/TheHugMonsterTeamCharacterVillainTurn.png -------------------------------------------------------------------------------- /Resources/Cutouts/Villains/TheHugMonsterTeam/TheHugMonsterTeamCharacterVillainTurnFlipped.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/Villains/TheHugMonsterTeam/TheHugMonsterTeamCharacterVillainTurnFlipped.png -------------------------------------------------------------------------------- /Resources/Cutouts/YesNoDialog/YesNoDialogMigrantCoderCharacter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/YesNoDialog/YesNoDialogMigrantCoderCharacter.png -------------------------------------------------------------------------------- /Resources/Cutouts/YesNoDialog/YesNoDialogMigrantCoderLockdownCharacter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Cutouts/YesNoDialog/YesNoDialogMigrantCoderLockdownCharacter.png -------------------------------------------------------------------------------- /Resources/DeckBrowser/DevStreamBio.txt: -------------------------------------------------------------------------------- 1 | Every Friday at 1 pm eastern, check it out! -------------------------------------------------------------------------------- /Resources/DeckBrowser/DevStreamVitals.txt: -------------------------------------------------------------------------------- 1 | A weird twitch show! 2 | -------------------------------------------------------------------------------- /Resources/DeckBrowser/MigrantCoderCharacterBio.txt: -------------------------------------------------------------------------------- 1 | BRB! 2 | 3 | BRB! 4 | BRB! 5 | 6 | BRB!BRB! 7 | 8 | BRB!BRB! 9 | 10 | BRB!BRB! 11 | 12 | BRB!BRB! 13 | 14 | BRB!BRB! 15 | 16 | BRB! -------------------------------------------------------------------------------- /Resources/DeckBrowser/MigrantCoderCharacterVitals.txt: -------------------------------------------------------------------------------- 1 | Alias: John? 2 | Height: etc -------------------------------------------------------------------------------- /Resources/Endings/Environments/Ending-DevStream.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Endings/Environments/Ending-DevStream.jpg -------------------------------------------------------------------------------- /Resources/Endings/Environments/Ending-DevStreamEnvironmentDefeat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Endings/Environments/Ending-DevStreamEnvironmentDefeat.jpg -------------------------------------------------------------------------------- /Resources/Endings/Villains/TheBaddies/TheBaddiesCharacterHeroesDestroyedDefeat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Endings/Villains/TheBaddies/TheBaddiesCharacterHeroesDestroyedDefeat.png -------------------------------------------------------------------------------- /Resources/Endings/Villains/TheBaddies/TheBaddiesCharacterVillainDestroyedVictory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Endings/Villains/TheBaddies/TheBaddiesCharacterVillainDestroyedVictory.png -------------------------------------------------------------------------------- /Resources/Environments/DevStream/DevStream-0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Environments/DevStream/DevStream-0.jpg -------------------------------------------------------------------------------- /Resources/Environments/DevStream/DevStream-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Environments/DevStream/DevStream-1.jpg -------------------------------------------------------------------------------- /Resources/Environments/DevStream/DevStream-10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Environments/DevStream/DevStream-10.jpg -------------------------------------------------------------------------------- /Resources/Environments/DevStream/DevStream-11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Environments/DevStream/DevStream-11.jpg -------------------------------------------------------------------------------- /Resources/Environments/DevStream/DevStream-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Environments/DevStream/DevStream-2.jpg -------------------------------------------------------------------------------- /Resources/Environments/DevStream/DevStream-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Environments/DevStream/DevStream-3.jpg -------------------------------------------------------------------------------- /Resources/Environments/DevStream/DevStream-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Environments/DevStream/DevStream-4.jpg -------------------------------------------------------------------------------- /Resources/Environments/DevStream/DevStream-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Environments/DevStream/DevStream-5.jpg -------------------------------------------------------------------------------- /Resources/Environments/DevStream/DevStream-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Environments/DevStream/DevStream-6.jpg -------------------------------------------------------------------------------- /Resources/Environments/DevStream/DevStream-7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Environments/DevStream/DevStream-7.jpg -------------------------------------------------------------------------------- /Resources/Environments/DevStream/DevStream-8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Environments/DevStream/DevStream-8.jpg -------------------------------------------------------------------------------- /Resources/Environments/DevStream/DevStream-9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Environments/DevStream/DevStream-9.jpg -------------------------------------------------------------------------------- /Resources/Environments/DevStream/DevStream-Start.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Environments/DevStream/DevStream-Start.jpg -------------------------------------------------------------------------------- /Resources/Fonts/ButtonGeneral.json: -------------------------------------------------------------------------------- 1 | {"frames": { 2 | 3 | "button-labels.png": 4 | { 5 | "frame": {"x":0,"y":0,"w":678,"h":649}, 6 | "rotated": false, 7 | "trimmed": false, 8 | "spriteSourceSize": {"x":0,"y":0,"w":678,"h":649}, 9 | "sourceSize": {"w":678,"h":649} 10 | }, 11 | "Whatever.png": 12 | { 13 | "frame": {"x":681,"y":0,"w":90,"h":90}, 14 | "rotated": false, 15 | "trimmed": false, 16 | "spriteSourceSize": {"x":0,"y":0,"w":90,"h":90}, 17 | "sourceSize": {"w":90,"h":90} 18 | }}, 19 | "meta": { 20 | "app": "https://www.codeandweb.com/texturepacker", 21 | "version": "1.0", 22 | "image": "ButtonGeneral.png", 23 | "format": "RGBA8888", 24 | "size": {"w":1024,"h":1024}, 25 | "scale": "1", 26 | "smartupdate": "$TexturePacker:SmartUpdate:7fb36711fe39e3c78e091626417e2b44:7287afd951a635e703a39250c53391d6:a18e781645faf149cbba388043440a07$" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Resources/Fonts/ButtonGeneral.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Fonts/ButtonGeneral.png -------------------------------------------------------------------------------- /Resources/Fonts/FullCardBody.json: -------------------------------------------------------------------------------- 1 | {"frames": { 2 | 3 | "cardbodies_full.png": 4 | { 5 | "frame": {"x":0,"y":0,"w":401,"h":344}, 6 | "rotated": false, 7 | "trimmed": false, 8 | "spriteSourceSize": {"x":0,"y":0,"w":401,"h":344}, 9 | "sourceSize": {"w":401,"h":344} 10 | }, 11 | "Whatever.png": 12 | { 13 | "frame": {"x":404,"y":0,"w":45,"h":45}, 14 | "rotated": false, 15 | "trimmed": false, 16 | "spriteSourceSize": {"x":0,"y":0,"w":45,"h":45}, 17 | "sourceSize": {"w":45,"h":45} 18 | }}, 19 | "meta": { 20 | "app": "https://www.codeandweb.com/texturepacker", 21 | "version": "1.0", 22 | "image": "FullCardBody.png", 23 | "format": "RGBA8888", 24 | "size": {"w":512,"h":512}, 25 | "scale": "1", 26 | "smartupdate": "$TexturePacker:SmartUpdate:11c2944a36df6bda9ab065cbdee41533:4ed3f2d6e6271ce7a084f8ac37f72428:89c55f552016e3f6c8c145d926629d90$" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Resources/Fonts/FullCardBody.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Fonts/FullCardBody.png -------------------------------------------------------------------------------- /Resources/Fonts/FullCardKeywords.json: -------------------------------------------------------------------------------- 1 | {"frames": { 2 | 3 | "card-keywords-full.png": 4 | { 5 | "frame": {"x":0,"y":0,"w":529,"h":528}, 6 | "rotated": false, 7 | "trimmed": false, 8 | "spriteSourceSize": {"x":0,"y":0,"w":529,"h":528}, 9 | "sourceSize": {"w":529,"h":528} 10 | }, 11 | "Whatever.png": 12 | { 13 | "frame": {"x":532,"y":0,"w":70,"h":70}, 14 | "rotated": false, 15 | "trimmed": false, 16 | "spriteSourceSize": {"x":0,"y":0,"w":70,"h":70}, 17 | "sourceSize": {"w":70,"h":70} 18 | }}, 19 | "meta": { 20 | "app": "https://www.codeandweb.com/texturepacker", 21 | "version": "1.0", 22 | "image": "FullCardKeywords.png", 23 | "format": "RGBA8888", 24 | "size": {"w":1024,"h":1024}, 25 | "scale": "1", 26 | "smartupdate": "$TexturePacker:SmartUpdate:f3df40370822a34db87ecb5837abcfcf:44c198acbd23e93b614d06135ae4cdb3:78a8fe050ee96964a4e5b33f95cb8cbd$" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Resources/Fonts/FullCardKeywords.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Fonts/FullCardKeywords.png -------------------------------------------------------------------------------- /Resources/Fonts/RedStateBlueState.json: -------------------------------------------------------------------------------- 1 | {"frames": { 2 | 3 | "RedStateBlueState-clean96.png": 4 | { 5 | "frame": {"x":67,"y":0,"w":755,"h":705}, 6 | "rotated": false, 7 | "trimmed": false, 8 | "spriteSourceSize": {"x":0,"y":0,"w":755,"h":705}, 9 | "sourceSize": {"w":755,"h":705} 10 | }, 11 | "RedStateBlueStateBold-clean96.png": 12 | { 13 | "frame": {"x":0,"y":729,"w":891,"h":767}, 14 | "rotated": false, 15 | "trimmed": false, 16 | "spriteSourceSize": {"x":0,"y":0,"w":891,"h":767}, 17 | "sourceSize": {"w":891,"h":767} 18 | }, 19 | "RedStateBlueStateItalic-clean96.png": 20 | { 21 | "frame": {"x":825,"y":0,"w":784,"h":726}, 22 | "rotated": false, 23 | "trimmed": false, 24 | "spriteSourceSize": {"x":0,"y":0,"w":784,"h":726}, 25 | "sourceSize": {"w":784,"h":726} 26 | }, 27 | "Whatever.png": 28 | { 29 | "frame": {"x":0,"y":0,"w":64,"h":64}, 30 | "rotated": false, 31 | "trimmed": false, 32 | "spriteSourceSize": {"x":0,"y":0,"w":64,"h":64}, 33 | "sourceSize": {"w":64,"h":64} 34 | }}, 35 | "meta": { 36 | "app": "https://www.codeandweb.com/texturepacker", 37 | "version": "1.0", 38 | "image": "RedStateBlueState.png", 39 | "format": "RGBA8888", 40 | "size": {"w":2048,"h":2048}, 41 | "scale": "1", 42 | "smartupdate": "$TexturePacker:SmartUpdate:4ad1025c5f783075b5245a4fe23661fc:934987be6d262776b519dbecc98069ea:139c651ab45bcb63c46076fcb22396a4$" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Resources/Fonts/RedStateBlueState.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Fonts/RedStateBlueState.png -------------------------------------------------------------------------------- /Resources/Fonts/SmallCardKeywords.json: -------------------------------------------------------------------------------- 1 | {"frames": { 2 | 3 | "card-keywords-small.png": 4 | { 5 | "frame": {"x":0,"y":0,"w":274,"h":296}, 6 | "rotated": false, 7 | "trimmed": false, 8 | "spriteSourceSize": {"x":0,"y":0,"w":274,"h":296}, 9 | "sourceSize": {"w":274,"h":296} 10 | }, 11 | "Whatever.png": 12 | { 13 | "frame": {"x":277,"y":0,"w":40,"h":40}, 14 | "rotated": false, 15 | "trimmed": false, 16 | "spriteSourceSize": {"x":0,"y":0,"w":40,"h":40}, 17 | "sourceSize": {"w":40,"h":40} 18 | }}, 19 | "meta": { 20 | "app": "https://www.codeandweb.com/texturepacker", 21 | "version": "1.0", 22 | "image": "SmallCardKeywords.png", 23 | "format": "RGBA8888", 24 | "size": {"w":512,"h":512}, 25 | "scale": "1", 26 | "smartupdate": "$TexturePacker:SmartUpdate:f753072daa159c5fd67dc9363bc58ca7:72288b59644e54bf6dfb532a87abf6d7:5964af4e910757387fa1e6863d7f748c$" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Resources/Fonts/SmallCardKeywords.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/Fonts/SmallCardKeywords.png -------------------------------------------------------------------------------- /Resources/LargeCardTextures/MigrantCoder/MigrantCoderCharacter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/LargeCardTextures/MigrantCoder/MigrantCoderCharacter.jpg -------------------------------------------------------------------------------- /Resources/LargeCardTextures/MigrantCoder/MigrantCoderCharacterBack.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/LargeCardTextures/MigrantCoder/MigrantCoderCharacterBack.jpg -------------------------------------------------------------------------------- /Resources/LargeCardTextures/MigrantCoder/MigrantCoderDeckBack.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/LargeCardTextures/MigrantCoder/MigrantCoderDeckBack.jpg -------------------------------------------------------------------------------- /Resources/LargeCardTextures/MigrantCoder/MigrantCoderLockdownCharacter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/LargeCardTextures/MigrantCoder/MigrantCoderLockdownCharacter.jpg -------------------------------------------------------------------------------- /Resources/LargeCardTextures/MigrantCoder/MigrantCoderLockdownCharacterBack.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/LargeCardTextures/MigrantCoder/MigrantCoderLockdownCharacterBack.jpg -------------------------------------------------------------------------------- /Resources/LargeCardTextures/MigrantCoder/PunchingBag.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/LargeCardTextures/MigrantCoder/PunchingBag.jpg -------------------------------------------------------------------------------- /Resources/LargeCardTextures/MigrantCoder/WorstCardEver.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/LargeCardTextures/MigrantCoder/WorstCardEver.jpg -------------------------------------------------------------------------------- /Resources/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "title":"Sample Mod", 3 | "author":"MigrantP", 4 | "description":"Nothing in this mod is intended to be balanced or playable. It exists as an example to help you as you start working on your own mod. Get the source code on GitHub here: https://github.com/Handelabra/WorkshopSample", 5 | "namespace":"Workshopping", 6 | "publishedFileId":2422637296, 7 | "dll":"MyMod.dll", 8 | "version":"0.7", 9 | "color":"4444DD", 10 | "manualTags":[], 11 | "decks":{ 12 | "heroes":[ 13 | "MigrantCoder" 14 | ], 15 | "villains":[ 16 | "TheBaddies" 17 | ], 18 | "teamVillains":[ 19 | "TheHugMonsterTeam" 20 | ], 21 | "environments":[ 22 | "DevStream" 23 | ] 24 | }, 25 | "variants":{ 26 | "Bunker":["WaywardBunkerCharacter"], 27 | "TheSentinels":["TheSerpentinelsInstructions","DrMedicobraCharacter","MainsnakeCharacter","TheIdealizardCharacter","WrattleCharacter"], 28 | "SkyScraper":["CentristSkyScraperNormalCharacter"], 29 | "BaronBlade":["BaronJeremyCharacter"], 30 | "Cauldron.Cricket":["NoisyCricketCharacter"], 31 | "CaptainThunder":["CaptainThunderstruckCharacter"] 32 | }, 33 | "credits":[ 34 | "Credits can have many lines.", 35 | "This line is one of them.", 36 | "This line is another one of them.", 37 | "This line is one of them.", 38 | "This line is another one of them.","This line is one of them.", 39 | "This line is another one of them.","This line is one of them.", 40 | "This line is another one of them.","This line is one of them.", 41 | "This line is another one of them.","This line is one of them.", 42 | "This line is another one of them.","This line is one of them.", 43 | "This line is another one of them.","This line is one of them.", 44 | "This line is another one of them.","This line is one of them.", 45 | "This line is another one of them.","This line is one of them.", 46 | "This line is another one of them.","This line is one of them.", 47 | "This line is another one of them.","This line is one of them.", 48 | "This line is another one of them.","This line is one of them.", 49 | "This line is another one of them.","This line is one of them.", 50 | "This line is another one of them.","This line is one of them.", 51 | "This line is another one of them.","This line is one of them.", 52 | "This line is another one of them.","This line is one of them.", 53 | "This line is another one of them." 54 | ] 55 | } 56 | -------------------------------------------------------------------------------- /Resources/preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/Resources/preview.jpg -------------------------------------------------------------------------------- /SourceImages/EndGame/Environments/DevStreamDeckBack.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/EndGame/Environments/DevStreamDeckBack.jpg -------------------------------------------------------------------------------- /SourceImages/EndGame/Environments/EndGameEnvironments.tps: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | fileFormatVersion 5 | 4 6 | texturePackerVersion 7 | 5.5.0 8 | autoSDSettings 9 | 10 | 11 | scale 12 | 1 13 | extension 14 | 15 | spriteFilter 16 | 17 | acceptFractionalValues 18 | 19 | maxTextureSize 20 | 21 | width 22 | -1 23 | height 24 | -1 25 | 26 | 27 | 28 | allowRotation 29 | 30 | shapeDebug 31 | 32 | dpi 33 | 72 34 | dataFormat 35 | json 36 | textureFileName 37 | 38 | flipPVR 39 | 40 | pvrCompressionQuality 41 | PVR_QUALITY_NORMAL 42 | atfCompressData 43 | 44 | mipMapMinSize 45 | 32768 46 | etc1CompressionQuality 47 | ETC1_QUALITY_LOW_PERCEPTUAL 48 | etc2CompressionQuality 49 | ETC2_QUALITY_LOW_PERCEPTUAL 50 | dxtCompressionMode 51 | DXT_PERCEPTUAL 52 | jxrColorFormat 53 | JXR_YUV444 54 | jxrTrimFlexBits 55 | 0 56 | jxrCompressionLevel 57 | 0 58 | ditherType 59 | NearestNeighbour 60 | backgroundColor 61 | 0 62 | libGdx 63 | 64 | filtering 65 | 66 | x 67 | Linear 68 | y 69 | Linear 70 | 71 | 72 | shapePadding 73 | 3 74 | jpgQuality 75 | 80 76 | pngOptimizationLevel 77 | 0 78 | webpQualityLevel 79 | 101 80 | textureSubPath 81 | 82 | atfFormats 83 | 84 | textureFormat 85 | png 86 | borderPadding 87 | 0 88 | maxTextureSize 89 | 90 | width 91 | 2048 92 | height 93 | 2048 94 | 95 | fixedTextureSize 96 | 97 | width 98 | -1 99 | height 100 | -1 101 | 102 | algorithmSettings 103 | 104 | algorithm 105 | Basic 106 | freeSizeMode 107 | Best 108 | sizeConstraints 109 | POT 110 | forceSquared 111 | 112 | maxRects 113 | 114 | heuristic 115 | Best 116 | 117 | basic 118 | 119 | sortBy 120 | Best 121 | order 122 | Ascending 123 | 124 | polygon 125 | 126 | alignToGrid 127 | 1 128 | 129 | 130 | dataFileNames 131 | 132 | data 133 | 134 | name 135 | ../../../Resources/Atlas/EndGameEnvironments.json 136 | 137 | 138 | multiPack 139 | 140 | forceIdenticalLayout 141 | 142 | outputFormat 143 | RGBA8888 144 | alphaHandling 145 | ClearTransparentPixels 146 | contentProtection 147 | 148 | key 149 | 150 | 151 | autoAliasEnabled 152 | 153 | trimSpriteNames 154 | 155 | prependSmartFolderName 156 | 157 | autodetectAnimations 158 | 159 | globalSpriteSettings 160 | 161 | scale 162 | 1 163 | scaleMode 164 | Smooth 165 | extrude 166 | 0 167 | trimThreshold 168 | 1 169 | trimMargin 170 | 1 171 | trimMode 172 | None 173 | tracerTolerance 174 | 200 175 | heuristicMask 176 | 177 | defaultPivotPoint 178 | 0.5,0.5 179 | writePivotPoints 180 | 181 | 182 | individualSpriteSettings 183 | 184 | DevStreamDeckBack.jpg 185 | 186 | pivotPoint 187 | 0.5,0.5 188 | spriteScale 189 | 1 190 | scale9Enabled 191 | 192 | scale9Borders 193 | 100,50,200,100 194 | scale9Paddings 195 | 100,50,200,100 196 | scale9FromFile 197 | 198 | 199 | 200 | fileList 201 | 202 | . 203 | 204 | ignoreFileList 205 | 206 | replaceList 207 | 208 | ignoredWarnings 209 | 210 | commonDivisorX 211 | 1 212 | commonDivisorY 213 | 1 214 | packNormalMaps 215 | 216 | autodetectNormalMaps 217 | 218 | normalMapFilter 219 | 220 | normalMapSuffix 221 | 222 | normalMapSheetFileName 223 | 224 | exporterProperties 225 | 226 | 227 | 228 | -------------------------------------------------------------------------------- /SourceImages/EndGame/Heroes/MigrantCoderCharacter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/EndGame/Heroes/MigrantCoderCharacter.jpg -------------------------------------------------------------------------------- /SourceImages/EndGame/Heroes/MigrantCoderCharacterFlipped.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/EndGame/Heroes/MigrantCoderCharacterFlipped.jpg -------------------------------------------------------------------------------- /SourceImages/EndGame/Heroes/MigrantCoderLockdownCharacter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/EndGame/Heroes/MigrantCoderLockdownCharacter.jpg -------------------------------------------------------------------------------- /SourceImages/EndGame/Heroes/MigrantCoderLockdownCharacterFlipped.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/EndGame/Heroes/MigrantCoderLockdownCharacterFlipped.jpg -------------------------------------------------------------------------------- /SourceImages/EndGame/Villains/EndGameVillains.tps: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | fileFormatVersion 5 | 4 6 | texturePackerVersion 7 | 5.5.0 8 | autoSDSettings 9 | 10 | 11 | scale 12 | 1 13 | extension 14 | 15 | spriteFilter 16 | 17 | acceptFractionalValues 18 | 19 | maxTextureSize 20 | 21 | width 22 | -1 23 | height 24 | -1 25 | 26 | 27 | 28 | allowRotation 29 | 30 | shapeDebug 31 | 32 | dpi 33 | 72 34 | dataFormat 35 | json 36 | textureFileName 37 | 38 | flipPVR 39 | 40 | pvrCompressionQuality 41 | PVR_QUALITY_NORMAL 42 | atfCompressData 43 | 44 | mipMapMinSize 45 | 32768 46 | etc1CompressionQuality 47 | ETC1_QUALITY_LOW_PERCEPTUAL 48 | etc2CompressionQuality 49 | ETC2_QUALITY_LOW_PERCEPTUAL 50 | dxtCompressionMode 51 | DXT_PERCEPTUAL 52 | jxrColorFormat 53 | JXR_YUV444 54 | jxrTrimFlexBits 55 | 0 56 | jxrCompressionLevel 57 | 0 58 | ditherType 59 | NearestNeighbour 60 | backgroundColor 61 | 0 62 | libGdx 63 | 64 | filtering 65 | 66 | x 67 | Linear 68 | y 69 | Linear 70 | 71 | 72 | shapePadding 73 | 3 74 | jpgQuality 75 | 80 76 | pngOptimizationLevel 77 | 0 78 | webpQualityLevel 79 | 101 80 | textureSubPath 81 | 82 | atfFormats 83 | 84 | textureFormat 85 | png 86 | borderPadding 87 | 0 88 | maxTextureSize 89 | 90 | width 91 | 2048 92 | height 93 | 2048 94 | 95 | fixedTextureSize 96 | 97 | width 98 | -1 99 | height 100 | -1 101 | 102 | algorithmSettings 103 | 104 | algorithm 105 | Basic 106 | freeSizeMode 107 | Best 108 | sizeConstraints 109 | POT 110 | forceSquared 111 | 112 | maxRects 113 | 114 | heuristic 115 | Best 116 | 117 | basic 118 | 119 | sortBy 120 | Best 121 | order 122 | Ascending 123 | 124 | polygon 125 | 126 | alignToGrid 127 | 1 128 | 129 | 130 | dataFileNames 131 | 132 | data 133 | 134 | name 135 | ../../../Resources/Atlas/EndGameVillains.json 136 | 137 | 138 | multiPack 139 | 140 | forceIdenticalLayout 141 | 142 | outputFormat 143 | RGBA8888 144 | alphaHandling 145 | ClearTransparentPixels 146 | contentProtection 147 | 148 | key 149 | 150 | 151 | autoAliasEnabled 152 | 153 | trimSpriteNames 154 | 155 | prependSmartFolderName 156 | 157 | autodetectAnimations 158 | 159 | globalSpriteSettings 160 | 161 | scale 162 | 1 163 | scaleMode 164 | Smooth 165 | extrude 166 | 0 167 | trimThreshold 168 | 1 169 | trimMargin 170 | 1 171 | trimMode 172 | None 173 | tracerTolerance 174 | 200 175 | heuristicMask 176 | 177 | defaultPivotPoint 178 | 0.5,0.5 179 | writePivotPoints 180 | 181 | 182 | individualSpriteSettings 183 | 184 | TheHugMonsterTeamCharacter.jpg 185 | TheHugMonsterTeamCharacterFlipped.jpg 186 | 187 | pivotPoint 188 | 0.5,0.5 189 | spriteScale 190 | 1 191 | scale9Enabled 192 | 193 | scale9Borders 194 | 100,50,200,100 195 | scale9Paddings 196 | 100,50,200,100 197 | scale9FromFile 198 | 199 | 200 | 201 | fileList 202 | 203 | . 204 | 205 | ignoreFileList 206 | 207 | replaceList 208 | 209 | ignoredWarnings 210 | 211 | commonDivisorX 212 | 1 213 | commonDivisorY 214 | 1 215 | packNormalMaps 216 | 217 | autodetectNormalMaps 218 | 219 | normalMapFilter 220 | 221 | normalMapSuffix 222 | 223 | normalMapSheetFileName 224 | 225 | exporterProperties 226 | 227 | 228 | 229 | -------------------------------------------------------------------------------- /SourceImages/EndGame/Villains/TheHugMonsterTeamCharacter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/EndGame/Villains/TheHugMonsterTeamCharacter.jpg -------------------------------------------------------------------------------- /SourceImages/EndGame/Villains/TheHugMonsterTeamCharacterFlipped.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/EndGame/Villains/TheHugMonsterTeamCharacterFlipped.jpg -------------------------------------------------------------------------------- /SourceImages/Fonts/ButtonGeneral/Whatever.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/Fonts/ButtonGeneral/Whatever.png -------------------------------------------------------------------------------- /SourceImages/Fonts/ButtonGeneral/button-labels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/Fonts/ButtonGeneral/button-labels.png -------------------------------------------------------------------------------- /SourceImages/Fonts/FullCardBody/Whatever.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/Fonts/FullCardBody/Whatever.png -------------------------------------------------------------------------------- /SourceImages/Fonts/FullCardBody/cardbodies_full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/Fonts/FullCardBody/cardbodies_full.png -------------------------------------------------------------------------------- /SourceImages/Fonts/FullCardKeywords/Whatever.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/Fonts/FullCardKeywords/Whatever.png -------------------------------------------------------------------------------- /SourceImages/Fonts/FullCardKeywords/card-keywords-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/Fonts/FullCardKeywords/card-keywords-full.png -------------------------------------------------------------------------------- /SourceImages/Fonts/RedStateBlueState/RedStateBlueState-clean96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/Fonts/RedStateBlueState/RedStateBlueState-clean96.png -------------------------------------------------------------------------------- /SourceImages/Fonts/RedStateBlueState/RedStateBlueStateBold-clean96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/Fonts/RedStateBlueState/RedStateBlueStateBold-clean96.png -------------------------------------------------------------------------------- /SourceImages/Fonts/RedStateBlueState/RedStateBlueStateItalic-clean96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/Fonts/RedStateBlueState/RedStateBlueStateItalic-clean96.png -------------------------------------------------------------------------------- /SourceImages/Fonts/RedStateBlueState/Whatever.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/Fonts/RedStateBlueState/Whatever.png -------------------------------------------------------------------------------- /SourceImages/Fonts/SmallCardKeywords/Whatever.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/Fonts/SmallCardKeywords/Whatever.png -------------------------------------------------------------------------------- /SourceImages/Fonts/SmallCardKeywords/card-keywords-small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/Fonts/SmallCardKeywords/card-keywords-small.png -------------------------------------------------------------------------------- /SourceImages/HeroLogos/HeroLogos.tps: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | fileFormatVersion 5 | 4 6 | texturePackerVersion 7 | 5.5.0 8 | autoSDSettings 9 | 10 | 11 | scale 12 | 1 13 | extension 14 | 15 | spriteFilter 16 | 17 | acceptFractionalValues 18 | 19 | maxTextureSize 20 | 21 | width 22 | -1 23 | height 24 | -1 25 | 26 | 27 | 28 | allowRotation 29 | 30 | shapeDebug 31 | 32 | dpi 33 | 72 34 | dataFormat 35 | json 36 | textureFileName 37 | 38 | flipPVR 39 | 40 | pvrCompressionQuality 41 | PVR_QUALITY_NORMAL 42 | atfCompressData 43 | 44 | mipMapMinSize 45 | 32768 46 | etc1CompressionQuality 47 | ETC1_QUALITY_LOW_PERCEPTUAL 48 | etc2CompressionQuality 49 | ETC2_QUALITY_LOW_PERCEPTUAL 50 | dxtCompressionMode 51 | DXT_PERCEPTUAL 52 | jxrColorFormat 53 | JXR_YUV444 54 | jxrTrimFlexBits 55 | 0 56 | jxrCompressionLevel 57 | 0 58 | ditherType 59 | NearestNeighbour 60 | backgroundColor 61 | 0 62 | libGdx 63 | 64 | filtering 65 | 66 | x 67 | Linear 68 | y 69 | Linear 70 | 71 | 72 | shapePadding 73 | 3 74 | jpgQuality 75 | 80 76 | pngOptimizationLevel 77 | 0 78 | webpQualityLevel 79 | 101 80 | textureSubPath 81 | 82 | atfFormats 83 | 84 | textureFormat 85 | png 86 | borderPadding 87 | 0 88 | maxTextureSize 89 | 90 | width 91 | 2048 92 | height 93 | 2048 94 | 95 | fixedTextureSize 96 | 97 | width 98 | -1 99 | height 100 | -1 101 | 102 | algorithmSettings 103 | 104 | algorithm 105 | Basic 106 | freeSizeMode 107 | Best 108 | sizeConstraints 109 | POT 110 | forceSquared 111 | 112 | maxRects 113 | 114 | heuristic 115 | Best 116 | 117 | basic 118 | 119 | sortBy 120 | Best 121 | order 122 | Ascending 123 | 124 | polygon 125 | 126 | alignToGrid 127 | 1 128 | 129 | 130 | dataFileNames 131 | 132 | data 133 | 134 | name 135 | ../../Resources/Atlas/HeroLogos0.json 136 | 137 | 138 | multiPack 139 | 140 | forceIdenticalLayout 141 | 142 | outputFormat 143 | RGBA8888 144 | alphaHandling 145 | ClearTransparentPixels 146 | contentProtection 147 | 148 | key 149 | 150 | 151 | autoAliasEnabled 152 | 153 | trimSpriteNames 154 | 155 | prependSmartFolderName 156 | 157 | autodetectAnimations 158 | 159 | globalSpriteSettings 160 | 161 | scale 162 | 1 163 | scaleMode 164 | Smooth 165 | extrude 166 | 0 167 | trimThreshold 168 | 1 169 | trimMargin 170 | 1 171 | trimMode 172 | None 173 | tracerTolerance 174 | 200 175 | heuristicMask 176 | 177 | defaultPivotPoint 178 | 0.5,0.5 179 | writePivotPoints 180 | 181 | 182 | individualSpriteSettings 183 | 184 | MigrantCoderCharacter.jpg 185 | MigrantCoderLockdownCharacter.jpg 186 | 187 | pivotPoint 188 | 0.5,0.5 189 | spriteScale 190 | 1 191 | scale9Enabled 192 | 193 | scale9Borders 194 | 83,65,165,130 195 | scale9Paddings 196 | 83,65,165,130 197 | scale9FromFile 198 | 199 | 200 | 201 | fileList 202 | 203 | . 204 | 205 | ignoreFileList 206 | 207 | replaceList 208 | 209 | ignoredWarnings 210 | 211 | commonDivisorX 212 | 1 213 | commonDivisorY 214 | 1 215 | packNormalMaps 216 | 217 | autodetectNormalMaps 218 | 219 | normalMapFilter 220 | 221 | normalMapSuffix 222 | 223 | normalMapSheetFileName 224 | 225 | exporterProperties 226 | 227 | 228 | 229 | -------------------------------------------------------------------------------- /SourceImages/HeroLogos/MigrantCoderCharacter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/HeroLogos/MigrantCoderCharacter.jpg -------------------------------------------------------------------------------- /SourceImages/HeroLogos/MigrantCoderLockdownCharacter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/HeroLogos/MigrantCoderLockdownCharacter.jpg -------------------------------------------------------------------------------- /SourceImages/Icons/MigrantCoderIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/Icons/MigrantCoderIcon.png -------------------------------------------------------------------------------- /SourceImages/Icons/Whatever.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/Icons/Whatever.png -------------------------------------------------------------------------------- /SourceImages/SetupGame/DevStreamDeckBack.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/SetupGame/DevStreamDeckBack.jpg -------------------------------------------------------------------------------- /SourceImages/SetupGame/MigrantCoderCharacter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/SetupGame/MigrantCoderCharacter.jpg -------------------------------------------------------------------------------- /SourceImages/SetupGame/MigrantCoderLockdownCharacter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/SetupGame/MigrantCoderLockdownCharacter.jpg -------------------------------------------------------------------------------- /SourceImages/SmallCardArt/Heroes/MigrantCoder/MigrantCoderCharacter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/SmallCardArt/Heroes/MigrantCoder/MigrantCoderCharacter.jpg -------------------------------------------------------------------------------- /SourceImages/SmallCardArt/Heroes/MigrantCoder/MigrantCoderCharacterBack.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/SmallCardArt/Heroes/MigrantCoder/MigrantCoderCharacterBack.jpg -------------------------------------------------------------------------------- /SourceImages/SmallCardArt/Heroes/MigrantCoder/MigrantCoderDeckBack.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/SmallCardArt/Heroes/MigrantCoder/MigrantCoderDeckBack.jpg -------------------------------------------------------------------------------- /SourceImages/SmallCardArt/Heroes/MigrantCoder/MigrantCoderLockdownCharacter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/SmallCardArt/Heroes/MigrantCoder/MigrantCoderLockdownCharacter.jpg -------------------------------------------------------------------------------- /SourceImages/SmallCardArt/Heroes/MigrantCoder/MigrantCoderLockdownCharacterBack.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/SmallCardArt/Heroes/MigrantCoder/MigrantCoderLockdownCharacterBack.jpg -------------------------------------------------------------------------------- /SourceImages/SmallCardArt/Heroes/MigrantCoder/PunchingBag.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/SmallCardArt/Heroes/MigrantCoder/PunchingBag.jpg -------------------------------------------------------------------------------- /SourceImages/SmallCardArt/Heroes/MigrantCoder/WorstCardEver.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/SmallCardArt/Heroes/MigrantCoder/WorstCardEver.jpg -------------------------------------------------------------------------------- /SourceImages/VillainTeamIntro/TheHugMonsterTeamCharacter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/VillainTeamIntro/TheHugMonsterTeamCharacter.jpg -------------------------------------------------------------------------------- /SourceImages/VillainTeamIntro/VillainTeamIntro.tps: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | fileFormatVersion 5 | 4 6 | texturePackerVersion 7 | 5.5.0 8 | autoSDSettings 9 | 10 | 11 | scale 12 | 1 13 | extension 14 | 15 | spriteFilter 16 | 17 | acceptFractionalValues 18 | 19 | maxTextureSize 20 | 21 | width 22 | -1 23 | height 24 | -1 25 | 26 | 27 | 28 | allowRotation 29 | 30 | shapeDebug 31 | 32 | dpi 33 | 72 34 | dataFormat 35 | json 36 | textureFileName 37 | 38 | flipPVR 39 | 40 | pvrCompressionQuality 41 | PVR_QUALITY_NORMAL 42 | atfCompressData 43 | 44 | mipMapMinSize 45 | 32768 46 | etc1CompressionQuality 47 | ETC1_QUALITY_LOW_PERCEPTUAL 48 | etc2CompressionQuality 49 | ETC2_QUALITY_LOW_PERCEPTUAL 50 | dxtCompressionMode 51 | DXT_PERCEPTUAL 52 | jxrColorFormat 53 | JXR_YUV444 54 | jxrTrimFlexBits 55 | 0 56 | jxrCompressionLevel 57 | 0 58 | ditherType 59 | NearestNeighbour 60 | backgroundColor 61 | 0 62 | libGdx 63 | 64 | filtering 65 | 66 | x 67 | Linear 68 | y 69 | Linear 70 | 71 | 72 | shapePadding 73 | 3 74 | jpgQuality 75 | 80 76 | pngOptimizationLevel 77 | 0 78 | webpQualityLevel 79 | 101 80 | textureSubPath 81 | 82 | atfFormats 83 | 84 | textureFormat 85 | png 86 | borderPadding 87 | 0 88 | maxTextureSize 89 | 90 | width 91 | 2048 92 | height 93 | 2048 94 | 95 | fixedTextureSize 96 | 97 | width 98 | -1 99 | height 100 | -1 101 | 102 | algorithmSettings 103 | 104 | algorithm 105 | Basic 106 | freeSizeMode 107 | Best 108 | sizeConstraints 109 | POT 110 | forceSquared 111 | 112 | maxRects 113 | 114 | heuristic 115 | Best 116 | 117 | basic 118 | 119 | sortBy 120 | Best 121 | order 122 | Ascending 123 | 124 | polygon 125 | 126 | alignToGrid 127 | 1 128 | 129 | 130 | dataFileNames 131 | 132 | data 133 | 134 | name 135 | ../../Resources/Atlas/VillainTeamIntro0.json 136 | 137 | 138 | multiPack 139 | 140 | forceIdenticalLayout 141 | 142 | outputFormat 143 | RGBA8888 144 | alphaHandling 145 | ClearTransparentPixels 146 | contentProtection 147 | 148 | key 149 | 150 | 151 | autoAliasEnabled 152 | 153 | trimSpriteNames 154 | 155 | prependSmartFolderName 156 | 157 | autodetectAnimations 158 | 159 | globalSpriteSettings 160 | 161 | scale 162 | 1 163 | scaleMode 164 | Smooth 165 | extrude 166 | 0 167 | trimThreshold 168 | 1 169 | trimMargin 170 | 1 171 | trimMode 172 | None 173 | tracerTolerance 174 | 200 175 | heuristicMask 176 | 177 | defaultPivotPoint 178 | 0.5,0.5 179 | writePivotPoints 180 | 181 | 182 | individualSpriteSettings 183 | 184 | TheHugMonsterTeamCharacter.jpg 185 | 186 | pivotPoint 187 | 0.5,0.5 188 | spriteScale 189 | 1 190 | scale9Enabled 191 | 192 | scale9Borders 193 | 80,60,160,120 194 | scale9Paddings 195 | 80,60,160,120 196 | scale9FromFile 197 | 198 | 199 | 200 | fileList 201 | 202 | . 203 | 204 | ignoreFileList 205 | 206 | replaceList 207 | 208 | ignoredWarnings 209 | 210 | commonDivisorX 211 | 1 212 | commonDivisorY 213 | 1 214 | packNormalMaps 215 | 216 | autodetectNormalMaps 217 | 218 | normalMapFilter 219 | 220 | normalMapSuffix 221 | 222 | normalMapSheetFileName 223 | 224 | exporterProperties 225 | 226 | 227 | 228 | -------------------------------------------------------------------------------- /SourceImages/VillainTeamLogos/TheHugMonsterTeamCharacter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Handelabra/WorkshopSample/54cc3d932a068e142e8c4daa7dbeb5399595135c/SourceImages/VillainTeamLogos/TheHugMonsterTeamCharacter.jpg -------------------------------------------------------------------------------- /SourceImages/VillainTeamLogos/VillainTeamLogos.tps: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | fileFormatVersion 5 | 4 6 | texturePackerVersion 7 | 5.5.0 8 | autoSDSettings 9 | 10 | 11 | scale 12 | 1 13 | extension 14 | 15 | spriteFilter 16 | 17 | acceptFractionalValues 18 | 19 | maxTextureSize 20 | 21 | width 22 | -1 23 | height 24 | -1 25 | 26 | 27 | 28 | allowRotation 29 | 30 | shapeDebug 31 | 32 | dpi 33 | 72 34 | dataFormat 35 | json 36 | textureFileName 37 | 38 | flipPVR 39 | 40 | pvrCompressionQuality 41 | PVR_QUALITY_NORMAL 42 | atfCompressData 43 | 44 | mipMapMinSize 45 | 32768 46 | etc1CompressionQuality 47 | ETC1_QUALITY_LOW_PERCEPTUAL 48 | etc2CompressionQuality 49 | ETC2_QUALITY_LOW_PERCEPTUAL 50 | dxtCompressionMode 51 | DXT_PERCEPTUAL 52 | jxrColorFormat 53 | JXR_YUV444 54 | jxrTrimFlexBits 55 | 0 56 | jxrCompressionLevel 57 | 0 58 | ditherType 59 | NearestNeighbour 60 | backgroundColor 61 | 0 62 | libGdx 63 | 64 | filtering 65 | 66 | x 67 | Linear 68 | y 69 | Linear 70 | 71 | 72 | shapePadding 73 | 3 74 | jpgQuality 75 | 80 76 | pngOptimizationLevel 77 | 0 78 | webpQualityLevel 79 | 101 80 | textureSubPath 81 | 82 | atfFormats 83 | 84 | textureFormat 85 | png 86 | borderPadding 87 | 0 88 | maxTextureSize 89 | 90 | width 91 | 2048 92 | height 93 | 2048 94 | 95 | fixedTextureSize 96 | 97 | width 98 | -1 99 | height 100 | -1 101 | 102 | algorithmSettings 103 | 104 | algorithm 105 | Basic 106 | freeSizeMode 107 | Best 108 | sizeConstraints 109 | POT 110 | forceSquared 111 | 112 | maxRects 113 | 114 | heuristic 115 | Best 116 | 117 | basic 118 | 119 | sortBy 120 | Best 121 | order 122 | Ascending 123 | 124 | polygon 125 | 126 | alignToGrid 127 | 1 128 | 129 | 130 | dataFileNames 131 | 132 | data 133 | 134 | name 135 | ../../Resources/Atlas/VillainTeamLogos0.json 136 | 137 | 138 | multiPack 139 | 140 | forceIdenticalLayout 141 | 142 | outputFormat 143 | RGBA8888 144 | alphaHandling 145 | ClearTransparentPixels 146 | contentProtection 147 | 148 | key 149 | 150 | 151 | autoAliasEnabled 152 | 153 | trimSpriteNames 154 | 155 | prependSmartFolderName 156 | 157 | autodetectAnimations 158 | 159 | globalSpriteSettings 160 | 161 | scale 162 | 1 163 | scaleMode 164 | Smooth 165 | extrude 166 | 0 167 | trimThreshold 168 | 1 169 | trimMargin 170 | 1 171 | trimMode 172 | None 173 | tracerTolerance 174 | 200 175 | heuristicMask 176 | 177 | defaultPivotPoint 178 | 0.5,0.5 179 | writePivotPoints 180 | 181 | 182 | individualSpriteSettings 183 | 184 | TheHugMonsterTeamCharacter.jpg 185 | 186 | pivotPoint 187 | 0.5,0.5 188 | spriteScale 189 | 1 190 | scale9Enabled 191 | 192 | scale9Borders 193 | 83,65,165,130 194 | scale9Paddings 195 | 83,65,165,130 196 | scale9FromFile 197 | 198 | 199 | 200 | fileList 201 | 202 | . 203 | 204 | ignoreFileList 205 | 206 | replaceList 207 | 208 | ignoredWarnings 209 | 210 | commonDivisorX 211 | 1 212 | commonDivisorY 213 | 1 214 | packNormalMaps 215 | 216 | autodetectNormalMaps 217 | 218 | normalMapFilter 219 | 220 | normalMapSuffix 221 | 222 | normalMapSheetFileName 223 | 224 | exporterProperties 225 | 226 | 227 | 228 | --------------------------------------------------------------------------------