diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a47e648 --- /dev/null +++ b/.gitignore @@ -0,0 +1,402 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml +1.5/Assemblies/KCSG.dll +1.5/Assemblies/PipeSystem.dll +1.5/Assemblies/VFECore.dll +Source/obj/Debug/MedievalBiotech.dll diff --git a/v1.4/Assemblies/0Harmony.dll b/1.4/Assemblies/0Harmony.dll similarity index 100% rename from v1.4/Assemblies/0Harmony.dll rename to 1.4/Assemblies/0Harmony.dll diff --git a/Source/obj/Debug/MedievalBiotech.dll b/1.4/Assemblies/MedievalBiotech.dll similarity index 100% rename from Source/obj/Debug/MedievalBiotech.dll rename to 1.4/Assemblies/MedievalBiotech.dll diff --git a/v1.4/Defs/BioTechEats.xml b/1.4/Defs/BioTechEats.xml similarity index 100% rename from v1.4/Defs/BioTechEats.xml rename to 1.4/Defs/BioTechEats.xml diff --git a/v1.4/Defs/Bodies/Bodies_Sanguophage/BodyPartGroups_Ghoul.xml b/1.4/Defs/Bodies/Bodies_Sanguophage/BodyPartGroups_Ghoul.xml similarity index 100% rename from v1.4/Defs/Bodies/Bodies_Sanguophage/BodyPartGroups_Ghoul.xml rename to 1.4/Defs/Bodies/Bodies_Sanguophage/BodyPartGroups_Ghoul.xml diff --git a/v1.4/Defs/Bodies/Bodies_Sanguophage/Body_Ghoul.xml b/1.4/Defs/Bodies/Bodies_Sanguophage/Body_Ghoul.xml similarity index 100% rename from v1.4/Defs/Bodies/Bodies_Sanguophage/Body_Ghoul.xml rename to 1.4/Defs/Bodies/Bodies_Sanguophage/Body_Ghoul.xml diff --git a/v1.4/Defs/Bodies/Bodies_Undead/BodyPartGroups_Undead.xml b/1.4/Defs/Bodies/Bodies_Undead/BodyPartGroups_Undead.xml similarity index 100% rename from v1.4/Defs/Bodies/Bodies_Undead/BodyPartGroups_Undead.xml rename to 1.4/Defs/Bodies/Bodies_Undead/BodyPartGroups_Undead.xml diff --git a/v1.4/Defs/Bodies/Bodies_Undead/Body_Undead.xml b/1.4/Defs/Bodies/Bodies_Undead/Body_Undead.xml similarity index 100% rename from v1.4/Defs/Bodies/Bodies_Undead/Body_Undead.xml rename to 1.4/Defs/Bodies/Bodies_Undead/Body_Undead.xml diff --git a/v1.4/Defs/Designation.xml b/1.4/Defs/Designation.xml similarity index 100% rename from v1.4/Defs/Designation.xml rename to 1.4/Defs/Designation.xml diff --git a/v1.4/Defs/GeneDefs/GeneCategoryDefs.xml b/1.4/Defs/GeneDefs/GeneCategoryDefs.xml similarity index 100% rename from v1.4/Defs/GeneDefs/GeneCategoryDefs.xml rename to 1.4/Defs/GeneDefs/GeneCategoryDefs.xml diff --git a/v1.4/Defs/GeneDefs/GeneDefs_Endogenes.xml b/1.4/Defs/GeneDefs/GeneDefs_Endogenes.xml similarity index 100% rename from v1.4/Defs/GeneDefs/GeneDefs_Endogenes.xml rename to 1.4/Defs/GeneDefs/GeneDefs_Endogenes.xml diff --git a/v1.4/Defs/GeneDefs/GeneDefs_Undead.xml b/1.4/Defs/GeneDefs/GeneDefs_Undead.xml similarity index 100% rename from v1.4/Defs/GeneDefs/GeneDefs_Undead.xml rename to 1.4/Defs/GeneDefs/GeneDefs_Undead.xml diff --git a/v1.4/Defs/GeneDefs/XenotypeDefs.xml b/1.4/Defs/GeneDefs/XenotypeDefs.xml similarity index 100% rename from v1.4/Defs/GeneDefs/XenotypeDefs.xml rename to 1.4/Defs/GeneDefs/XenotypeDefs.xml diff --git a/v1.4/Defs/HediffDefs/Hediffs_Necromancer.xml b/1.4/Defs/HediffDefs/Hediffs_Necromancer.xml similarity index 100% rename from v1.4/Defs/HediffDefs/Hediffs_Necromancer.xml rename to 1.4/Defs/HediffDefs/Hediffs_Necromancer.xml diff --git a/v1.4/Defs/HediffDefs/Hediffs_Sanguimage.xml b/1.4/Defs/HediffDefs/Hediffs_Sanguimage.xml similarity index 100% rename from v1.4/Defs/HediffDefs/Hediffs_Sanguimage.xml rename to 1.4/Defs/HediffDefs/Hediffs_Sanguimage.xml diff --git a/v1.4/Defs/Jobs.xml b/1.4/Defs/Jobs.xml similarity index 100% rename from v1.4/Defs/Jobs.xml rename to 1.4/Defs/Jobs.xml diff --git a/v1.4/Defs/Misc/FleshTypeDefs.xml b/1.4/Defs/Misc/FleshTypeDefs.xml similarity index 100% rename from v1.4/Defs/Misc/FleshTypeDefs.xml rename to 1.4/Defs/Misc/FleshTypeDefs.xml diff --git a/v1.4/Defs/PipeStuff.xml b/1.4/Defs/PipeStuff.xml similarity index 100% rename from v1.4/Defs/PipeStuff.xml rename to 1.4/Defs/PipeStuff.xml diff --git a/v1.4/Defs/RecipeDefs/Recipes_Sanguophage.xml b/1.4/Defs/RecipeDefs/Recipes_Sanguophage.xml similarity index 100% rename from v1.4/Defs/RecipeDefs/Recipes_Sanguophage.xml rename to 1.4/Defs/RecipeDefs/Recipes_Sanguophage.xml diff --git a/v1.4/Defs/RecipeDefs/Recipes_Undead.xml b/1.4/Defs/RecipeDefs/Recipes_Undead.xml similarity index 100% rename from v1.4/Defs/RecipeDefs/Recipes_Undead.xml rename to 1.4/Defs/RecipeDefs/Recipes_Undead.xml diff --git a/v1.4/Defs/ThingCategoryDefs/ThingCategories.xml b/1.4/Defs/ThingCategoryDefs/ThingCategories.xml similarity index 100% rename from v1.4/Defs/ThingCategoryDefs/ThingCategories.xml rename to 1.4/Defs/ThingCategoryDefs/ThingCategories.xml diff --git a/v1.4/Defs/ThingDefs_Buildings/Buildings_Deathrest.xml b/1.4/Defs/ThingDefs_Buildings/Buildings_Deathrest.xml similarity index 100% rename from v1.4/Defs/ThingDefs_Buildings/Buildings_Deathrest.xml rename to 1.4/Defs/ThingDefs_Buildings/Buildings_Deathrest.xml diff --git a/v1.4/Defs/ThingDefs_Buildings/Buildings_Genes.xml b/1.4/Defs/ThingDefs_Buildings/Buildings_Genes.xml similarity index 100% rename from v1.4/Defs/ThingDefs_Buildings/Buildings_Genes.xml rename to 1.4/Defs/ThingDefs_Buildings/Buildings_Genes.xml diff --git a/v1.4/Defs/ThingDefs_Items/Items_Resource_Manufactured.xml b/1.4/Defs/ThingDefs_Items/Items_Resource_Manufactured.xml similarity index 100% rename from v1.4/Defs/ThingDefs_Items/Items_Resource_Manufactured.xml rename to 1.4/Defs/ThingDefs_Items/Items_Resource_Manufactured.xml diff --git a/v1.4/Defs/ThingDefs_Items/Items_Resources.xml b/1.4/Defs/ThingDefs_Items/Items_Resources.xml similarity index 100% rename from v1.4/Defs/ThingDefs_Items/Items_Resources.xml rename to 1.4/Defs/ThingDefs_Items/Items_Resources.xml diff --git a/v1.4/Defs/ThingDefs_Races/Races_Sanguophage_Summons.xml b/1.4/Defs/ThingDefs_Races/Races_Sanguophage_Summons.xml similarity index 100% rename from v1.4/Defs/ThingDefs_Races/Races_Sanguophage_Summons.xml rename to 1.4/Defs/ThingDefs_Races/Races_Sanguophage_Summons.xml diff --git a/v1.4/Defs/ThingDefs_Races/Races_Undead_Summons.xml b/1.4/Defs/ThingDefs_Races/Races_Undead_Summons.xml similarity index 100% rename from v1.4/Defs/ThingDefs_Races/Races_Undead_Summons.xml rename to 1.4/Defs/ThingDefs_Races/Races_Undead_Summons.xml diff --git a/v1.4/Defs/ThoughtDefs/Thoughts_Memory_Special.xml b/1.4/Defs/ThoughtDefs/Thoughts_Memory_Special.xml similarity index 100% rename from v1.4/Defs/ThoughtDefs/Thoughts_Memory_Special.xml rename to 1.4/Defs/ThoughtDefs/Thoughts_Memory_Special.xml diff --git a/v1.4/Patches/Biotech.xml b/1.4/Patches/Biotech.xml similarity index 100% rename from v1.4/Patches/Biotech.xml rename to 1.4/Patches/Biotech.xml diff --git a/v1.4/Patches/Buildings_Deathrest.xml b/1.4/Patches/Buildings_Deathrest.xml similarity index 100% rename from v1.4/Patches/Buildings_Deathrest.xml rename to 1.4/Patches/Buildings_Deathrest.xml diff --git a/v1.4/Patches/Buildings_Misc.xml b/1.4/Patches/Buildings_Misc.xml similarity index 100% rename from v1.4/Patches/Buildings_Misc.xml rename to 1.4/Patches/Buildings_Misc.xml diff --git a/v1.4/Patches/Buildings_Production.xml b/1.4/Patches/Buildings_Production.xml similarity index 100% rename from v1.4/Patches/Buildings_Production.xml rename to 1.4/Patches/Buildings_Production.xml diff --git a/v1.4/Patches/Buildings_Rechargers.xml b/1.4/Patches/Buildings_Rechargers.xml similarity index 100% rename from v1.4/Patches/Buildings_Rechargers.xml rename to 1.4/Patches/Buildings_Rechargers.xml diff --git a/v1.4/Patches/Hediffs_Mechanitor.xml b/1.4/Patches/Hediffs_Mechanitor.xml similarity index 100% rename from v1.4/Patches/Hediffs_Mechanitor.xml rename to 1.4/Patches/Hediffs_Mechanitor.xml diff --git a/v1.4/Patches/Items_Food.xml b/1.4/Patches/Items_Food.xml similarity index 100% rename from v1.4/Patches/Items_Food.xml rename to 1.4/Patches/Items_Food.xml diff --git a/v1.4/Patches/Items_Resource_Manufactured.xml b/1.4/Patches/Items_Resource_Manufactured.xml similarity index 100% rename from v1.4/Patches/Items_Resource_Manufactured.xml rename to 1.4/Patches/Items_Resource_Manufactured.xml diff --git a/v1.4/Patches/Items_Various.xml b/1.4/Patches/Items_Various.xml similarity index 100% rename from v1.4/Patches/Items_Various.xml rename to 1.4/Patches/Items_Various.xml diff --git a/v1.4/Patches/Recipe_Surgery_Misc.xml b/1.4/Patches/Recipe_Surgery_Misc.xml similarity index 100% rename from v1.4/Patches/Recipe_Surgery_Misc.xml rename to 1.4/Patches/Recipe_Surgery_Misc.xml diff --git a/1.5/Assemblies/0Harmony.dll b/1.5/Assemblies/0Harmony.dll new file mode 100644 index 0000000..791c7aa Binary files /dev/null and b/1.5/Assemblies/0Harmony.dll differ diff --git a/1.5/Assemblies/0Harmony.pdb b/1.5/Assemblies/0Harmony.pdb new file mode 100644 index 0000000..73d8ef7 Binary files /dev/null and b/1.5/Assemblies/0Harmony.pdb differ diff --git a/1.5/Assemblies/MedievalBiotech.dll b/1.5/Assemblies/MedievalBiotech.dll new file mode 100644 index 0000000..537ede9 Binary files /dev/null and b/1.5/Assemblies/MedievalBiotech.dll differ diff --git a/1.5/Defs/Abilities/Abilities_Necrarch.xml b/1.5/Defs/Abilities/Abilities_Necrarch.xml new file mode 100644 index 0000000..a916b75 --- /dev/null +++ b/1.5/Defs/Abilities/Abilities_Necrarch.xml @@ -0,0 +1,229 @@ + + + + + Necrarch + 1000 + + + + MB_Create_ArcanaGem + + Conjures and then seals excess dark arcana with a stone. Stone can be used to restore dark arcana at a later time. + UI/Abilities/Ability_ArcanaSealing + Necrarch + 100 + Bloodfeed_Warmup + Bloodfeed_Cast + false + False + false + + Verb_CastAbility + -1 + + +
  • + 0.2 +
  • +
  • + MB_ArcanaStone +
  • +
    +
    + + + MB_SoulFeeding + + Touch the target and extract their life essence directly from their skin. The target will lose ??? and will be horrified by the interaction, but will be otherwise unharmed.\n\nCan only target non-soulstarved humans. Soul gain is affected by the target's body size. + UI/Icons/Genes/Gene_SoulStarved + Necrarch + 100 + Bloodfeed_Warmup + Bloodfeed_Cast + false + false + + Verb_CastAbilityTouch + false + -1 + 2 + + false + false + false + false + + + +
  • + 0.2 + FedOn + FedOn_Social + 1 +
  • +
  • + Manipulation +
  • +
    +
    + + + MB_DarknessBolt + + Placeholder + UI/Abilities/Ability_DarkBolt + 60 + Necrarch + 200 + true + + MedievalBiotech.Verb_CastAbilitySoul + 9.9 + 0.5 + PiercingSpine_Launch + + +
  • + 0.2 +
  • +
  • + MB_DarknessBolt +
  • +
    +
    + + + MB_DarknessBolt + + + Things/Projectile/Projectile_DarkBolt + Graphic_Single + + + RangedStab + 30 + 1 + 1 + 55 + + + + + MB_BaleFire + + Unleash a horrific balefire from within. The balefire can ignite anything or anyone it hits, and also form deathly flaming pools on the ground. + UI/Abilities/Ability_DarkFlame + 600 + 201 + true + FireSpew_Warmup + + MedievalBiotech.Verb_CastAbilitySoul + 7.9 + 1 + FireSpew_Resolve + + true + + + +
  • + 0.2 +
  • +
  • + 7.9 + 3 + Filth_FlammableBile + MB_BaleFire_Spew + true +
  • +
    +
    + + + MB_Decrepify + + This powerful curse lowers movement, damage, and physical resistance. + UI/Abilities/Ability_Curse_Decrepify + 202 + Misc1 + true + true + true + + MedievalBiotech.Verb_CastAbilitySoul + 3 + 24.9 + + false + false + true + true + true + + + +
  • + 0.25 +
  • +
  • + CompAbilityEffect_GiveHediff + MB_Curse_Decrepify + true +
  • +
    +
    + + + + MB_NecroticVigor + + The Wight channels dark energy to bolster its own strength and that of its undead minions. For a limited duration, the Wight and nearby undead allies gain increased damage, attack speed, and resilience + CastAbilityOnThing + Necrarch + False + False + UI/Abilities/Ability_NecroticVigor + True + False + True + False + 3 + true + 15000 + false + + 30 + 5.9 + + + Verb_CastAbility + 3 + 5.9 + False + False + + true + false + false + false + false + true + + + +
  • + 0.35 +
  • +
  • + CompAbilityEffect_GiveHediff + MB_NecroticVigor + True + True + true +
  • +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/BioTechEats.xml b/1.5/Defs/BioTechEats.xml new file mode 100644 index 0000000..4fa7875 --- /dev/null +++ b/1.5/Defs/BioTechEats.xml @@ -0,0 +1,85 @@ + + + + \ No newline at end of file diff --git a/1.5/Defs/Bodies/Bodies_Sanguophage/BodyPartGroups_Ghoul.xml b/1.5/Defs/Bodies/Bodies_Sanguophage/BodyPartGroups_Ghoul.xml new file mode 100644 index 0000000..d1f8b08 --- /dev/null +++ b/1.5/Defs/Bodies/Bodies_Sanguophage/BodyPartGroups_Ghoul.xml @@ -0,0 +1,17 @@ + + + + MB_LeftGhoulHand + + fist + 79 + + + + MB_RightGhoulHand + + fist + 78 + + + \ No newline at end of file diff --git a/1.5/Defs/Bodies/Bodies_Sanguophage/Body_Ghoul.xml b/1.5/Defs/Bodies/Bodies_Sanguophage/Body_Ghoul.xml new file mode 100644 index 0000000..55449ed --- /dev/null +++ b/1.5/Defs/Bodies/Bodies_Sanguophage/Body_Ghoul.xml @@ -0,0 +1,597 @@ + + + + MB_Ghoul + + + Torso + Middle + Outside + +
  • Torso
  • +
    + +
  • + Ribcage + 0.036 + Inside + +
  • Torso
  • + + +
  • + Sternum + 0.015 + Inside + +
  • Torso
  • + + +
  • + Pelvis + 0.025 + Bottom + Inside + +
  • Torso
  • + + +
  • + Spine + 0.025 + Inside + +
  • Torso
  • + + +
  • + Stomach + 0.025 + Inside + +
  • Torso
  • + + +
  • + Heart + 0.020 + Inside + +
  • Torso
  • + + +
  • + Lung + left lung + 0.025 + Inside + +
  • Torso
  • + + +
  • + Lung + right lung + 0.025 + Inside + +
  • Torso
  • + + +
  • + Kidney + left kidney + 0.017 + Inside + +
  • Torso
  • + + +
  • + Kidney + right kidney + 0.017 + Inside + +
  • Torso
  • + + +
  • + Liver + 0.025 + Inside + +
  • Torso
  • + + +
  • + Neck + 0.075 + Top + +
  • Neck
  • + + +
  • + Head + 0.80 + +
  • UpperHead
  • +
  • FullHead
  • +
  • HeadAttackTool
  • + + +
  • + Skull + 0.18 + Inside + +
  • UpperHead
  • +
  • Eyes
  • +
  • FullHead
  • + + +
  • + Brain + 0.8 + +
  • UpperHead
  • +
  • Eyes
  • +
  • FullHead
  • + + +
    + +
  • + Eye + left eye + 0.07 + +
  • FullHead
  • +
  • Eyes
  • + + LeftEye + +
  • + Eye + right eye + 0.07 + +
  • FullHead
  • +
  • Eyes
  • + + RightEye + +
  • + Ear + left ear + 0.07 + +
  • UpperHead
  • +
  • FullHead
  • + + +
  • + Ear + right ear + 0.07 + +
  • UpperHead
  • +
  • FullHead
  • + + +
  • + Nose + 0.10 + +
  • FullHead
  • + + +
  • + Jaw + 0.15 + +
  • Teeth
  • +
  • FullHead
  • +
  • Mouth
  • + + +
  • + Tongue + 0 + Inside + +
  • FullHead
  • + + +
    + +
    + +
    + +
  • + Shoulder + left shoulder + 0.12 + LeftShoulder + +
  • Shoulders
  • + + +
  • + Clavicle + left clavicle + 0.09 + Top + Inside + +
  • Torso
  • + + +
  • + Arm + left arm + 0.77 + +
  • Arms
  • + + +
  • + Humerus + left humerus + 0.1 + Inside + +
  • Arms
  • + + +
  • + Radius + left radius + 0.1 + Inside + +
  • Arms
  • + + +
  • + Hand + left hand + 0.14 + Bottom + +
  • Hands
  • + + +
  • + FrontClaw + left pinky claw + 0.06 + +
  • Hands
  • +
  • MB_LeftGhoulHand
  • + + +
  • + FrontClaw + left ring claw + 0.07 + +
  • Hands
  • +
  • MB_LeftGhoulHand
  • + + +
  • + FrontClaw + left middle claw + 0.08 + +
  • Hands
  • +
  • MB_LeftGhoulHand
  • +
  • MiddleFingers
  • + + +
  • + FrontClaw + left index claw + 0.07 + +
  • Hands
  • +
  • MB_LeftGhoulHand
  • + + +
  • + FrontClaw + left thumb claw + 0.08 + +
  • Hands
  • +
  • MB_LeftGhoulHand
  • + + +
    + +
    + +
    + +
  • + Shoulder + right shoulder + 0.12 + RightShoulder + +
  • Shoulders
  • + + +
  • + Clavicle + right clavicle + 0.09 + Top + Inside + +
  • Torso
  • + + +
  • + Arm + right arm + 0.77 + +
  • Arms
  • + + +
  • + Humerus + right humerus + 0.1 + Inside + +
  • Arms
  • + + +
  • + Radius + right radius + 0.1 + Inside + +
  • Arms
  • + + +
  • + Hand + right hand + 0.14 + Bottom + +
  • Hands
  • + + +
  • + FrontClaw + right pinky claw + 0.06 + +
  • Hands
  • +
  • MB_RightGhoulHand
  • + + +
  • + FrontClaw + right ring claw + 0.07 + +
  • Hands
  • +
  • MB_RightGhoulHand
  • + + +
  • + FrontClaw + right middle claw + 0.08 + +
  • Hands
  • +
  • RightHand
  • +
  • MB_RightGhoulHand
  • + + +
  • + FrontClaw + right index claw + 0.07 + +
  • Hands
  • +
  • MB_RightGhoulHand
  • + + +
  • + FrontClaw + right thumb claw + 0.08 + +
  • Hands
  • +
  • MB_RightGhoulHand
  • + + +
    + +
    + +
    + +
  • + Waist + 0 + Bottom + +
  • Waist
  • + + +
  • + Leg + left leg + 0.14 + Bottom + +
  • Legs
  • + + LeftLeg + +
  • + Femur + left femur + 0.1 + Inside + +
  • Legs
  • + + +
  • + Tibia + left tibia + 0.1 + Inside + +
  • Legs
  • + + +
  • + Foot + left foot + 0.1 + +
  • Feet
  • + + +
  • + Toe + left little toe + 0.06 + +
  • Feet
  • + + +
  • + Toe + left fourth toe + 0.07 + +
  • Feet
  • + + +
  • + Toe + left middle toe + 0.08 + +
  • Feet
  • + + +
  • + Toe + left second toe + 0.09 + +
  • Feet
  • + + +
  • + Toe + left big toe + 0.09 + +
  • Feet
  • + + +
    + +
    + +
  • + Leg + right leg + 0.14 + Bottom + +
  • Legs
  • + + RightLeg + +
  • + Femur + right femur + 0.1 + Inside + +
  • Legs
  • + + +
  • + Tibia + right tibia + 0.1 + Inside + +
  • Legs
  • + + +
  • + Foot + right foot + 0.1 + +
  • Feet
  • + + +
  • + Toe + right little toe + 0.06 + +
  • Feet
  • + + +
  • + Toe + right fourth toe + 0.07 + +
  • Feet
  • + + +
  • + Toe + right middle toe + 0.08 + +
  • Feet
  • + + +
  • + Toe + right second toe + 0.09 + +
  • Feet
  • + + +
  • + Toe + right big toe + 0.09 + +
  • Feet
  • + + +
    + +
    + +
    +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/Bodies/Bodies_Undead/BodyPartGroups_Undead.xml b/1.5/Defs/Bodies/Bodies_Undead/BodyPartGroups_Undead.xml new file mode 100644 index 0000000..967d69a --- /dev/null +++ b/1.5/Defs/Bodies/Bodies_Undead/BodyPartGroups_Undead.xml @@ -0,0 +1,110 @@ + + + + MB_Neck + + 25 + 0 + true + true + +
  • TalkingPathway
  • +
    + false +
    + + MB_Leg + + 30 + 0 + true + true + +
  • MovingLimbCore
  • +
    +
    + + MB_Foot + + 25 + 0 + true + true + +
  • MovingLimbSegment
  • +
    +
    + + MB_Torso + + 40 + 0 + true + true + false + + + MB_Shoulder + + 30 + 0 + true + true + +
  • ManipulationLimbSegment
  • +
    +
    + + MB_Arm + + 30 + 0 + true + true + +
  • ManipulationLimbCore
  • +
    +
    + + MB_Hand + + 20 + 0 + true + true + +
  • ManipulationLimbSegment
  • +
    +
    + + MB_Finger + + 8 + true + 0 + true + true + +
  • ManipulationLimbDigit
  • +
    +
    + + MB_Waist + + true + 0 + true + + + MB_Toe + + 8 + true + true + 0 + true + +
  • MovingLimbDigit
  • +
    +
    +
    \ No newline at end of file diff --git a/1.5/Defs/Bodies/Bodies_Undead/Body_Undead.xml b/1.5/Defs/Bodies/Bodies_Undead/Body_Undead.xml new file mode 100644 index 0000000..f73c7b2 --- /dev/null +++ b/1.5/Defs/Bodies/Bodies_Undead/Body_Undead.xml @@ -0,0 +1,949 @@ + + + + MB_Body_Skeleton + + + MB_Torso + Middle + Outside + +
  • Torso
  • +
    + +
  • + Ribcage + 0.036 + Inside + +
  • Torso
  • + + +
  • + Sternum + 0.015 + Inside + +
  • Torso
  • + + +
  • + Pelvis + 0.025 + Bottom + Inside + +
  • Torso
  • + + +
  • + Spine + 0.025 + Inside + +
  • Torso
  • + + +
  • + MB_Neck + 0.075 + Top + +
  • Neck
  • + + +
  • + Head + 0.80 + +
  • UpperHead
  • +
  • FullHead
  • +
  • HeadAttackTool
  • + + +
  • + Skull + 0.18 + Inside + +
  • UpperHead
  • +
  • FullHead
  • + + +
  • + Brain + 0.8 + +
  • UpperHead
  • +
  • FullHead
  • + + +
    + +
  • + Jaw + 0.15 + +
  • Teeth
  • +
  • FullHead
  • + + +
    + +
    + +
  • + MB_Shoulder + left shoulder + 0.12 + +
  • Shoulders
  • + + LeftShoulder + +
  • + Clavicle + left clavicle + 0.09 + Top + Inside + +
  • Torso
  • + + +
  • + MB_Arm + left arm + 0.77 + +
  • Arms
  • + + +
  • + Humerus + left humerus + 0.1 + Inside + +
  • Arms
  • + + +
  • + Radius + left radius + 0.1 + Inside + +
  • Arms
  • + + +
  • + MB_Hand + left hand + 0.14 + Bottom + +
  • Hands
  • + + +
  • + MB_Finger + left pinky + 0.06 + +
  • Hands
  • +
  • LeftHand
  • + + +
  • + MB_Finger + left ring finger + 0.07 + +
  • Hands
  • +
  • LeftHand
  • + + +
  • + MB_Finger + left middle finger + 0.08 + +
  • Hands
  • +
  • LeftHand
  • + + +
  • + MB_Finger + left index finger + 0.07 + +
  • Hands
  • +
  • LeftHand
  • + + +
  • + MB_Finger + left thumb + 0.08 + +
  • Hands
  • +
  • LeftHand
  • + + +
    + +
    + +
    + +
  • + MB_Shoulder + right shoulder + 0.12 + +
  • Shoulders
  • + + RightShoulder + +
  • + Clavicle + right clavicle + 0.09 + Top + Inside + +
  • Torso
  • + + +
  • + MB_Arm + right arm + 0.77 + +
  • Arms
  • + + +
  • + Humerus + right humerus + 0.1 + Inside + +
  • Arms
  • + + +
  • + Radius + right radius + 0.1 + Inside + +
  • Arms
  • + + +
  • + MB_Hand + right hand + 0.14 + Bottom + +
  • Hands
  • + + +
  • + MB_Finger + right pinky + 0.06 + +
  • Hands
  • +
  • RightHand
  • + + +
  • + MB_Finger + right ring finger + 0.07 + +
  • Hands
  • +
  • RightHand
  • + + +
  • + MB_Finger + right middle finger + 0.08 + +
  • Hands
  • +
  • RightHand
  • + + +
  • + MB_Finger + right index finger + 0.07 + +
  • Hands
  • +
  • RightHand
  • + + +
  • + MB_Finger + right thumb + 0.08 + +
  • Hands
  • +
  • RightHand
  • + + +
    + +
    + +
    + +
  • + MB_Waist + 0 + Bottom + +
  • Waist
  • + + +
  • + MB_Leg + left leg + 0.14 + Bottom + +
  • Legs
  • + + LeftLeg + +
  • + Femur + left femur + 0.1 + Inside + +
  • Legs
  • + + +
  • + Tibia + left tibia + 0.1 + Inside + +
  • Legs
  • + + +
  • + MB_Foot + left foot + 0.1 + +
  • Feet
  • + + +
  • + MB_Toe + left little toe + 0.06 + +
  • Feet
  • + + +
  • + MB_Toe + left fourth toe + 0.07 + +
  • Feet
  • + + +
  • + MB_Toe + left middle toe + 0.08 + +
  • Feet
  • + + +
  • + MB_Toe + left second toe + 0.09 + +
  • Feet
  • + + +
  • + MB_Toe + left big toe + 0.09 + +
  • Feet
  • + + +
    + +
    + +
  • + MB_Leg + right leg + 0.14 + Bottom + +
  • Legs
  • + + RightLeg + +
  • + Femur + right femur + 0.1 + Inside + +
  • Legs
  • + + +
  • + Tibia + right tibia + 0.1 + Inside + +
  • Legs
  • + + +
  • + MB_Foot + right foot + 0.1 + +
  • Feet
  • + + +
  • + MB_Toe + right little toe + 0.06 + +
  • Feet
  • + + +
  • + MB_Toe + right fourth toe + 0.07 + +
  • Feet
  • + + +
  • + MB_Toe + right middle toe + 0.08 + +
  • Feet
  • + + +
  • + MB_Toe + right second toe + 0.09 + +
  • Feet
  • + + +
  • + MB_Toe + right big toe + 0.09 + +
  • Feet
  • + + +
    + +
    + +
    +
    +
    + + MB_Body_Restless + + + MB_Torso + Middle + Outside + +
  • Torso
  • +
    + +
  • + Ribcage + 0.036 + Inside + +
  • Torso
  • + + +
  • + Sternum + 0.015 + Inside + +
  • Torso
  • + + +
  • + Pelvis + 0.025 + Bottom + Inside + +
  • Torso
  • + + +
  • + Spine + 0.025 + Inside + +
  • Torso
  • + + +
  • + MB_Neck + 0.075 + Top + +
  • Neck
  • + + +
  • + Head + 0.80 + +
  • UpperHead
  • +
  • FullHead
  • +
  • HeadAttackTool
  • + + +
  • + Skull + 0.18 + Inside + +
  • UpperHead
  • +
  • FullHead
  • + + +
  • + Brain + 0.8 + +
  • UpperHead
  • +
  • FullHead
  • + + +
    + +
  • + Jaw + 0.15 + +
  • Teeth
  • +
  • FullHead
  • + + +
    + +
    + +
  • + MB_Shoulder + left shoulder + 0.12 + +
  • Shoulders
  • + + LeftShoulder + +
  • + Clavicle + left clavicle + 0.09 + Top + Inside + +
  • Torso
  • + + +
  • + MB_Arm + left arm + 0.77 + +
  • Arms
  • + + +
  • + Humerus + left humerus + 0.1 + Inside + +
  • Arms
  • + + +
  • + Radius + left radius + 0.1 + Inside + +
  • Arms
  • + + +
  • + MB_Hand + left hand + 0.14 + Bottom + +
  • Hands
  • + + +
  • + MB_Finger + left pinky + 0.06 + +
  • Hands
  • +
  • LeftHand
  • + + +
  • + MB_Finger + left ring finger + 0.07 + +
  • Hands
  • +
  • LeftHand
  • + + +
  • + MB_Finger + left middle finger + 0.08 + +
  • Hands
  • +
  • LeftHand
  • + + +
  • + MB_Finger + left index finger + 0.07 + +
  • Hands
  • +
  • LeftHand
  • + + +
  • + MB_Finger + left thumb + 0.08 + +
  • Hands
  • +
  • LeftHand
  • + + +
    + +
    + +
    + +
  • + MB_Shoulder + right shoulder + 0.12 + +
  • Shoulders
  • + + RightShoulder + +
  • + Clavicle + right clavicle + 0.09 + Top + Inside + +
  • Torso
  • + + +
  • + MB_Arm + right arm + 0.77 + +
  • Arms
  • + + +
  • + Humerus + right humerus + 0.1 + Inside + +
  • Arms
  • + + +
  • + Radius + right radius + 0.1 + Inside + +
  • Arms
  • + + +
  • + MB_Hand + right hand + 0.14 + Bottom + +
  • Hands
  • + + +
  • + MB_Finger + right pinky + 0.06 + +
  • Hands
  • +
  • RightHand
  • + + +
  • + MB_Finger + right ring finger + 0.07 + +
  • Hands
  • +
  • RightHand
  • + + +
  • + MB_Finger + right middle finger + 0.08 + +
  • Hands
  • +
  • RightHand
  • + + +
  • + MB_Finger + right index finger + 0.07 + +
  • Hands
  • +
  • RightHand
  • + + +
  • + MB_Finger + right thumb + 0.08 + +
  • Hands
  • +
  • RightHand
  • + + +
    + +
    + +
    + +
  • + MB_Waist + 0 + Bottom + +
  • Waist
  • + + +
  • + MB_Leg + left leg + 0.14 + Bottom + +
  • Legs
  • + + LeftLeg + +
  • + Femur + left femur + 0.1 + Inside + +
  • Legs
  • + + +
  • + Tibia + left tibia + 0.1 + Inside + +
  • Legs
  • + + +
  • + MB_Foot + left foot + 0.1 + +
  • Feet
  • + + +
  • + MB_Toe + left little toe + 0.06 + +
  • Feet
  • + + +
  • + MB_Toe + left fourth toe + 0.07 + +
  • Feet
  • + + +
  • + MB_Toe + left middle toe + 0.08 + +
  • Feet
  • + + +
  • + MB_Toe + left second toe + 0.09 + +
  • Feet
  • + + +
  • + MB_Toe + left big toe + 0.09 + +
  • Feet
  • + + +
    + +
    + +
  • + MB_Leg + right leg + 0.14 + Bottom + +
  • Legs
  • + + RightLeg + +
  • + Femur + right femur + 0.1 + Inside + +
  • Legs
  • + + +
  • + Tibia + right tibia + 0.1 + Inside + +
  • Legs
  • + + +
  • + MB_Foot + right foot + 0.1 + +
  • Feet
  • + + +
  • + MB_Toe + right little toe + 0.06 + +
  • Feet
  • + + +
  • + MB_Toe + right fourth toe + 0.07 + +
  • Feet
  • + + +
  • + MB_Toe + right middle toe + 0.08 + +
  • Feet
  • + + +
  • + MB_Toe + right second toe + 0.09 + +
  • Feet
  • + + +
  • + MB_Toe + right big toe + 0.09 + +
  • Feet
  • + + +
    + +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/1.5/Defs/Designation.xml b/1.5/Defs/Designation.xml new file mode 100644 index 0000000..1fd335e --- /dev/null +++ b/1.5/Defs/Designation.xml @@ -0,0 +1,12 @@ + + + + MB_PipeNetworks + + 350 + +
  • Designator_Cancel
  • +
  • Designator_Deconstruct
  • +
    +
    +
    \ No newline at end of file diff --git a/1.5/Defs/Effects/Effecter_Balefire.xml b/1.5/Defs/Effects/Effecter_Balefire.xml new file mode 100644 index 0000000..cbf6ad2 --- /dev/null +++ b/1.5/Defs/Effects/Effecter_Balefire.xml @@ -0,0 +1,85 @@ + + + + + MB_BaleFire_Spew + +
  • + SubEffecter_SprayerChance + 0.15 + MB_BaleFireSpew_A + 0.9 + 9.5 + 0.8~1.2 + -15~15 + 0.85 + true +
  • +
  • + SubEffecter_SprayerChance + 0.1 + MB_BaleFireSpew_Base + 0.1 + 0.6 + 0.8 + -9~9 + 0.75 + true +
  • +
  • + SubEffecter_SprayerChance + 0.1 + Mote_SparkThrownFast + 0.5 + 3.3~5 + 0.1~0.2 + -12~12 + 0.8 + true +
  • +
  • + SubEffecter_SprayerChance + 0.2 + FireSpew_Glow + 0.16 + 0.65 +
  • +
    +
    + + + MB_BaleFireSpew_A + MoteOverhead + 0.2 + 0.4 + 0.2 + true + -90 + + Graphic_FleckPulse + GlowAnimated + Things/Mote/BaleFireSpew_A + + <_NumFrames>5 + <_FramesPerSec>7 + + 1.2 + + + + + MB_BaleFireSpew_Base + MoteOverhead + 0.2 + 0.2 + 0.1 + true + + Graphic_FleckPulse + MoteGlow + Things/Mote/BaleFireSpew_Base + (1.25, 2.5) + + + +
    \ No newline at end of file diff --git a/1.5/Defs/Effects/Motes.xml b/1.5/Defs/Effects/Motes.xml new file mode 100644 index 0000000..e4b49f7 --- /dev/null +++ b/1.5/Defs/Effects/Motes.xml @@ -0,0 +1,70 @@ + + + + + MB_Mote_NecroticVigor + MoteAttached + LightingOverlay + true + + 9999999 + true + + + Graphic_Mote + Things/Mote/UndeadVigorAura + MoteGlow + (64, 51, 81) + 10 + + + + + MB_Effecter_NecroticVigorAura + +
  • + SubEffecter_DrifterEmoteChance + + 0.8 + 0.95 + + 0.01 + 0.25 + MB_Mote_NecroticVigorAura + + 0.18 + 0.18 + + + 10 + 80 + +
  • +
    +
    + + + + + MB_Mote_NecroticVigorAura + MoteAttached + MoteOverhead + + 0.05 + 0.1 + 0.35 + + + Things/Mote/MechSparkSimple + Graphic_MoteWithAgeSecs + GlowAnimated + (0.25, 0.2, 0.32) + + <_NumFrames>2 + <_FramesPerSec>4 + + (1.1, 1.1) + + + +
    \ No newline at end of file diff --git a/1.5/Defs/GeneDefs/GeneCategoryDefs.xml b/1.5/Defs/GeneDefs/GeneCategoryDefs.xml new file mode 100644 index 0000000..50999c7 --- /dev/null +++ b/1.5/Defs/GeneDefs/GeneCategoryDefs.xml @@ -0,0 +1,10 @@ + + + + + MB_DarkEnergy + + 505 + + + \ No newline at end of file diff --git a/1.5/Defs/GeneDefs/GeneDefs_Abilities.xml b/1.5/Defs/GeneDefs/GeneDefs_Abilities.xml new file mode 100644 index 0000000..4ecc6db --- /dev/null +++ b/1.5/Defs/GeneDefs/GeneDefs_Abilities.xml @@ -0,0 +1,91 @@ + + + + + MB_SoulFeeder + + PLACEHOLDER + UI/Icons/Genes/Gene_SoulStarved + Gene_Bloodfeeder + MB_SoulStarved + MB_DarkEnergy + BloodfeederDied + +
  • MB_SoulFeeding
  • +
    + + MB_SoulFeeding + + -1 + 3 +
    + + + MB_DarknessBolt + + Carriers grow an opening in their upper chest along with a quiver of keratin spines. Using a hemogen-powered chemical reaction, they can fire these spines at high speed at nearby targets with surprising accuracy. + UI/Icons/Genes/Gene_DarkBolt + MB_SoulStarved + MB_DarkEnergy + 1.5 + +
  • MB_DarknessBolt
  • +
    + + MB_DarknessBolt + + -1 +
    + + + MB_BaleFire + + Carriers are able to convert portions of their soul into a horrific balefire. The balefire can ignite anything or anyone it hits, and also form deathly flaming pools on the ground. + UI/Icons/Genes/Gene_BaleFire_Icon + MB_SoulStarved + MB_DarkEnergy + 1.5 + +
  • MB_BaleFire
  • +
    + + MB_BaleFire + + -3 +
    + + + MB_Decrepify + + A genetic anomaly that bestows upon its bearer a sinister power to decay and wither the very essence of another's soul. + UI/Icons/Genes/Gene_Curse_Decrepify + MB_SoulStarved + MB_DarkEnergy + 1.5 + +
  • MB_Decrepify
  • +
    + + MB_Decrepify + + -3 +
    + + + MB_NecroticVigor + + A genetic anomaly that allows it's bearer to channel dark energy to bolster its own strength and that of its undead minions + UI/Icons/Genes/Gene_NecroticVigor + MB_SoulStarved + MB_DarkEnergy + 1.5 + +
  • MB_NecroticVigor
  • +
    + + MB_NecroticVigor + + -3 +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/GeneDefs/GeneDefs_Endogenes.xml b/1.5/Defs/GeneDefs/GeneDefs_Endogenes.xml new file mode 100644 index 0000000..19cddc4 --- /dev/null +++ b/1.5/Defs/GeneDefs/GeneDefs_Endogenes.xml @@ -0,0 +1,231 @@ + + + + + + + MB_Body_Demonic + + Carriers can have muscular, fit, humanoid bodies. A person can have more than one body type gene; one body type will be chosen among those that are allowed. + UI/Icons/Genes/Body_Demonic_Icon + +
  • + Male + Races/Demonic/Body/Demonic + +
  • +
    + 40 +
    + + + + false + +
  • MB_Head_Demonic
  • +
    +
    + + + MB_Head_Demonic_Male + Races/Demonic/Head/Demonic + Male + + + + MB_Head_Demonic_Female + Races/Demonic/Head/Demonic + Female + + + + + MB_Head_Demonic + + Carriers of this gene usually have an insectoid head. + UI/Icons/Genes/Head_Demonic_Icon + +
  • MB_Head_Demonic_Male
  • +
  • MB_Head_Demonic_Female
  • +
    + 98 +
    + + + + MB_ElongatedHorn + + Carriers of this gene grow two elongated horns protruding from the forehead. + UI/Icons/Genes/Gene_ElongatedHorns + +
  • + PawnRenderNode_AttachmentHead + PawnRenderNodeWorker_FlipWhenCrawling + Races/Demonic/ElongatedHorns/ElongatedHorns + (255, 255, 255) + Head + + + 80 + + + 10 + + +
  • +
    + + +
  • horn
  • +
  • knob
  • +
  • spike
  • +
  • devil
  • +
  • demon
  • +
  • luci
  • +
  • beelze
  • +
  • hell
  • +
    + +
  • horn
  • +
  • spike
  • +
  • vil
  • +
    +
    + + + + + + + + + 98 +
    + + + + MB_Body_Necrarch + + Carriers can have sickly, famished, humanoid bodies. A person can have more than one body type gene; one body type will be chosen among those that are allowed. + UI/Icons/Genes/Body_Necrarch_Icon + +
  • + Male + Races/Necrarch/Body/Necrarch + +
  • +
    + 40 +
    + + + + false + +
  • MB_Head_Necrarch
  • +
    +
    + + + MB_Head_Necrarch_Male + Races/Necrarch/Head/Necrarch + Male + + + + MB_Head_Necrarch_Female + Races/Necrarch/Head/Necrarch + Female + + + + + MB_Head_Necrarch + + Carriers of this gene usually have an insectoid head. + UI/Icons/Genes/Head_Necrarch_Icon + +
  • MB_Head_Necrarch_Male
  • +
  • MB_Head_Necrarch_Female
  • +
    + 98 +
    + + + + + MB_Body_Wight + + Carriers can have sickly, famished, humanoid bodies. A person can have more than one body type gene; one body type will be chosen among those that are allowed. + UI/Icons/Genes/Body_Wight_Icon + +
  • + Male + Races/Wight/Body/Wight + +
  • +
    + 40 +
    + + + + false + +
  • MB_Head_Wight
  • +
    +
    + + + MB_Head_Wight_Male + Races/Wight/Head/Wight + Male + + + + MB_Head_Wight_Female + Races/Wight/Head/Wight + Female + + + + + MB_Head_Wight + + Carriers of this gene usually have an insectoid head. + UI/Icons/Genes/Head_Wight_Icon + +
  • MB_Head_Wight_Male
  • +
  • MB_Head_Wight_Female
  • +
    + 98 +
    + + + + + MB_Skin_Grim + + slate + Carriers of this gene produce a pigment that turns their skin dark gray. + (112, 112, 112) + 97 + + +
  • gray
  • +
  • slate
  • +
  • fog
  • +
  • gloom
  • +
  • smoke
  • +
  • grim
  • +
  • murk
  • +
  • mist
  • +
    + +
  • wisp
  • +
  • ghost
  • +
  • murk
  • +
    +
    +
    +
    \ No newline at end of file diff --git a/1.5/Defs/GeneDefs/GeneDefs_Undead.xml b/1.5/Defs/GeneDefs/GeneDefs_Undead.xml new file mode 100644 index 0000000..af24785 --- /dev/null +++ b/1.5/Defs/GeneDefs/GeneDefs_Undead.xml @@ -0,0 +1,95 @@ + + + + + MB_SoulStarved + + Carriers of this gene have a reserve of dark magical strength powered by souls. dark arcana can be gained by consuming the souls of the unfortunate and spent in various ways, all of which are unlocked by other genes.\n\nCarriers lose 2 dark arcana per day from magical entropy. + MedievalBiotech.Gene_Soul + MedievalBiotech.GeneGizmo_ResourceSoulStarve + Dark Arcana + +
  • 0.25
  • +
  • 0.5
  • +
  • 0.75
  • +
    + true + true + A reserve of dark magical strength which can be gained and spent in a variety of ways.\n\nHemogen can be increased by consuming souls from a human or consuming soul-trapped objects. You can obtain dark arcana using the 'extract soul' operation on a non-undead human.\n\nIf dark arcana reaches zero, {PAWN_nameDef} will become very unhappy. + UI/Icons/Genes/Gene_SoulStarved + 0 + MB_DarkEnergy + -2 + +
  • Gives dark arcana supply.
  • +
    + +
  • MB_Create_ArcanaGem
  • +
    + + MB_Create_ArcanaGem + + + +
  • undead
  • +
    +
    + 3 + 0.02 + 1 + 1 + +
  • MB_SoulStarved
  • +
    +
    + + + MB_SoulDrain + + draining + Carriers lose an additional 2 dark arcana per day from magical entropy. + soul + MedievalBiotech.Gene_SoulDrain + UI/Icons/Genes/Gene_SoulDrain + MB_SoulStarved + 0.02 + MB_DarkEnergy + -1 + 3 + 1 + 6 + + + + MB_NeverEats + + Carriers of this gene have a unique metabolic process which allows them to never need to eat. + UI/Icons/Genes/Gene_NeverEat + 1.25 + 30 + +
  • Food
  • +
    + -6 + 3 +
    + + + MB_Mindless + + Carriers of this gene have a unique metabolic process which allows them to never need to eat. + UI/Icons/Genes/Gene_Mindless + 1.25 + 30 + +
  • Joy
  • +
  • Beauty
  • +
  • Comfort
  • +
  • Outdoors
  • +
  • Indoors
  • +
    + -6 + 3 +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/GeneDefs/XenotypeDefs.xml b/1.5/Defs/GeneDefs/XenotypeDefs.xml new file mode 100644 index 0000000..bd7d9fd --- /dev/null +++ b/1.5/Defs/GeneDefs/XenotypeDefs.xml @@ -0,0 +1,140 @@ + + + + + MB_Necrarch + + PLACEHOLDER + Necrarchs are ageless, deathless arcane masters powered by the mythical dark energy in their body. They are horrifying and extremely intelligent. They can heal any injury, and never suffer from disease or poison. In combat, they can cast dark fire and curse enemies. The price is that necrarchs must consume souls derived from human sacrifices to survive, and they must periodically deathrest for long periods. They're easily destroyed by fire, and slowed down by UV light. + UI/Icons/Xenotypes/Necrarch + PawnBecameSanguophage + 2.5 + -1000 + 0 + NamerPersonWaster + +
  • Ageless
  • +
  • Deathless
  • +
  • Deathrest
  • +
  • DiseaseFree
  • +
  • ArchiteMetabolism
  • +
  • PerfectImmunity
  • +
  • TotalHealing
  • +
  • WoundHealing_SuperFast
  • +
  • ToxResist_Total
  • +
  • FireWeakness
  • +
  • UVSensitivity_Mild
  • +
  • DarkVision
  • +
  • Sterile
  • +
  • MinTemp_SmallDecrease
  • +
  • PsychicAbility_Extreme
  • +
  • Beauty_VeryUgly
  • +
  • AptitudeStrong_Intellectual
  • +
  • MeleeDamage_Weak
  • + + +
  • MB_Head_Necrarch
  • +
  • MB_Body_Necrarch
  • +
  • Hair_BaldOnly
  • +
  • Beard_NoBeardOnly
  • +
  • MB_Skin_Grim
  • + + +
  • MB_SoulStarved
  • +
  • MB_SoulDrain
  • + + + +
  • MB_DarknessBolt
  • +
  • MB_BaleFire
  • +
  • MB_Decrepify
  • +
    +
    + + + MB_Wight + + PLACEHOLDER + PLACEHOLDER + UI/Icons/Xenotypes/Wight + PawnBecameSanguophage + 2.5 + -1000 + 0 + NamerPersonWaster + +
  • Ageless
  • +
  • Deathless
  • +
  • DiseaseFree
  • +
  • ArchiteMetabolism
  • +
  • PerfectImmunity
  • +
  • TotalHealing
  • +
  • WoundHealing_SuperFast
  • +
  • ToxResist_Total
  • +
  • FireWeakness
  • +
  • UVSensitivity_Mild
  • +
  • LowSleep
  • +
  • DarkVision
  • +
  • Sterile
  • +
  • MinTemp_SmallDecrease
  • +
  • Beauty_VeryUgly
  • +
  • Aggression_Aggressive
  • +
  • Robust
  • +
  • MoveSpeed_Quick
  • +
  • MeleeDamage_Strong
  • +
  • AptitudeStrong_Melee
  • + + +
  • MB_Head_Wight
  • +
  • MB_Body_Wight
  • +
  • Hair_BaldOnly
  • +
  • Beard_NoBeardOnly
  • +
  • MB_Skin_Grim
  • + + +
  • MB_SoulStarved
  • +
  • MB_SoulDrain
  • + + +
  • MB_NecroticVigor
  • + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/1.5/Defs/HediffDefs/Heddif_CorruptedSoul.xml b/1.5/Defs/HediffDefs/Heddif_CorruptedSoul.xml new file mode 100644 index 0000000..378c2a0 --- /dev/null +++ b/1.5/Defs/HediffDefs/Heddif_CorruptedSoul.xml @@ -0,0 +1,72 @@ + + + + + MB_SoulCraving + + PLACEHOLDER + HediffWithComps + (1, 0.2, 0.2) + 0.01 + 1 + false + +
  • + + 0.05 + +
  • + Consciousness + 0.9 +
  • + + +
  • + + 0.35 + 0.1 + +
  • + Consciousness + 0.8 +
  • + + +
  • + + 0.7 + 0.15 + +
  • + Consciousness + 0.5 +
  • + + +
    + +
  • + 0.25 + -0.1 +
  • +
    +
    + + + MB_SoulAmplified + + All dark arcana gains are multiplied up because this person used a soul pentagram while deathresting. This effect lasts until the next deathrest. + + HemogenAmplifier + + +
  • + true + + 0.25 + +
  • +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/HediffDefs/Hediff_Abilities.xml b/1.5/Defs/HediffDefs/Hediff_Abilities.xml new file mode 100644 index 0000000..8f675d6 --- /dev/null +++ b/1.5/Defs/HediffDefs/Hediff_Abilities.xml @@ -0,0 +1,108 @@ + + + + + MB_Curse_Decrepify + + This powerful curse lowers movement,damage and physical resistance. + Hediff_HemogenCraving + (1, 0.2, 0.2) + 1 + 1 + false + +
  • + +
  • + Moving + 0.6 +
  • + + + 1.15 + 0.40 + 0.40 + + +
    + +
  • + -2 +
  • +
    +
    + + + MB_NecroticVigor + + Dark energy bolstering undead damage, attack speed, and resilience. Nearby minions will share part of this benefit. + HediffWithComps + (0.52, 1, 0.95) + +
  • + false +
  • +
  • +
  • + 9.9 + MB_Mote_NecroticVigor + true + + false + false + false + true + + MB_NecroticVigorBuff + MB_SoulStarved +
  • +
    + +
  • + + 3 + 3 + + + 1.10 + 1.10 + 0.95 + + 0.8 +
  • +
    + false +
    + + + MB_NecroticVigorBuff + + Dark energy bolstering undead damage, attack speed, and resilience. + other + HediffWithComps + (0.52, 1, 0.95) + +
  • + false +
  • +
  • + MB_Effecter_NecroticVigorAura +
  • +
  • + + false + +
  • + + 3 + 3 + + + 1.10 + 1.10 + +
  • + +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/HediffDefs/Hediff_Artifice.xml b/1.5/Defs/HediffDefs/Hediff_Artifice.xml new file mode 100644 index 0000000..479f91d --- /dev/null +++ b/1.5/Defs/HediffDefs/Hediff_Artifice.xml @@ -0,0 +1,13 @@ + + + + + + MB_BandNode + MedievalBiotech.Hediff_BandNode_Artifice + + This artificer's bandwidth is being increased thanks to the influence of a control amplifier structure. + false + + + \ No newline at end of file diff --git a/1.5/Defs/HediffDefs/Hediff_MechImplants.xml b/1.5/Defs/HediffDefs/Hediff_MechImplants.xml new file mode 100644 index 0000000..f9d6fdc --- /dev/null +++ b/1.5/Defs/HediffDefs/Hediff_MechImplants.xml @@ -0,0 +1,235 @@ + + + + + ThingWithComps + Item + MapMeshOnly + Archotech + true + 14 + true + Item + Never + true + Middle + +
  • Items
  • +
    + +
  • + + + + + + MB_BloodChalice + + PLACEHOLDER + Mechlink + MB_BloodChaliceImplant + + 100 + -4 + 1 + 500 + 0 + + + Things/Item/Special/BloodChalice + Graphic_Single + 1 + + +
  • +
  • + CompUsableImplant + InstallMechlink + Consume {0_label} to become a sanguimage +
  • +
  • + MedievalBiotech.CompUseEffect_MB_InstallImplant + MB_BloodChaliceImplant + Brain + true + Hemogenic + Sanguimage +
  • +
  • + MechlinkInstalled +
  • +
    +
    + + + MB_BloodChaliceImplant + MedievalBiotech.Hediff_SaguineMage + + A bionic implant that allows direct control of mechanoids. Mechlinks are used by soldiers to control war mechs, and by workers to control labor mechs. A person with a mechlink is known as a mechanitor.\n\nMechlinks are self-installable. Pressed into the back of the throat, the unit injects itself through the flesh to clamp inside the base of the skull where it meets the spinal cord. There, it threads a web of ultrafine wires throughout nearby neuronal tissue to make the direct mental link between the user and the mechanoid control band.\n\nMechlinks are not simply devices for sending radio signals to mechanoids, because mechanoids are not merely robots. In addition to traditional computers, mechanoids have a dim psychic presence, so fluently controlling them requires a psychic connection. By linking mechanitor and mechanoid both psychically and electromagnetically, the mechlink permits deeper control than screen-and-button interfaces.\n\nSince the mechlink interlaces deep within the brain tissue, it can only be removed after death.\n\nNote: A mechanitor must be capable of smithing work to gestate mechanoids. + A bionic implant that allows direct control of mechanoids. Can only be removed after death. + false + +
  • Mechanitor
  • +
  • Mechanitor_Basic
  • +
    + +
  • + + 6 + 2 + +
  • +
    + +
  • + NeutralEvent + Reusable {HEDIFF_label} available. + {PAWN} has died with a {HEDIFF_label} installed. This can be removed and installed by someone else. + true +
  • +
    +
    + + + + MB_Necronomicon + + PLACEHOLDER + Mechlink + MB_NecronomiconImplant + + 100 + -4 + 1 + 500 + 0 + + + Things/Item/Special/Necronomicon + Graphic_Single + 1 + + +
  • +
  • + CompUsableImplant + InstallMechlink + Read {0_label} to become a necromancer +
  • +
  • + MedievalBiotech.CompUseEffect_MB_InstallImplant + MB_NecronomiconImplant + Brain + true + Deathrest +
  • +
  • + MechlinkInstalled +
  • +
    +
    + + + MB_NecronomiconImplant + MedievalBiotech.Hediff_NecrarchBrain + + A bionic implant that allows direct control of mechanoids. Mechlinks are used by soldiers to control war mechs, and by workers to control labor mechs. A person with a mechlink is known as a mechanitor.\n\nMechlinks are self-installable. Pressed into the back of the throat, the unit injects itself through the flesh to clamp inside the base of the skull where it meets the spinal cord. There, it threads a web of ultrafine wires throughout nearby neuronal tissue to make the direct mental link between the user and the mechanoid control band.\n\nMechlinks are not simply devices for sending radio signals to mechanoids, because mechanoids are not merely robots. In addition to traditional computers, mechanoids have a dim psychic presence, so fluently controlling them requires a psychic connection. By linking mechanitor and mechanoid both psychically and electromagnetically, the mechlink permits deeper control than screen-and-button interfaces.\n\nSince the mechlink interlaces deep within the brain tissue, it can only be removed after death.\n\nNote: A mechanitor must be capable of smithing work to gestate mechanoids. + A bionic implant that allows direct control of mechanoids. Can only be removed after death. + false + +
  • Mechanitor
  • +
  • Mechanitor_Basic
  • +
    + +
  • + + 6 + 2 + +
  • +
    + +
  • + NeutralEvent + Reusable {HEDIFF_label} available. + {PAWN} has died with a {HEDIFF_label} installed. This can be removed and installed by someone else. + true +
  • +
    +
    + + + + MB_ArtificerImplant + + PLACEHOLDER + Mechlink + MechlinkImplant + + 100 + -4 + 1 + 500 + 0 + + + Things/Item/Special/ArtificeFist + Graphic_Single + 1 + + +
  • +
  • + CompUsableImplant + InstallMechlink + Put on the {0_label} to become an artificer. +
  • +
  • + MedievalBiotech.CompUseEffect_MB_InstallImplant + MechlinkImplant + Hand + true + Artificer +
  • +
  • + MechlinkInstalled +
  • +
  • + MB_ArtificerStartingMech + true +
  • +
    +
    + + + MB_ArtificerImplant + Hediff_Mechlink + + An ancient mechanical hand that allows direct control of automatons. Artificer hands are used by the precusor master craftsmen to create legendary automatons that are tasked to do labour or protect their masters. People whose hands are made out of what seems to be brass, are recognized as artificers. \n\nMechlinks are self-installable. Pressed into the back of the throat, the unit injects itself through the flesh to clamp inside the base of the skull where it meets the spinal cord. There, it threads a web of ultrafine wires throughout nearby neuronal tissue to make the direct mental link between the user and the mechanoid control band.\n\nMechlinks are not simply devices for sending radio signals to mechanoids, because mechanoids are not merely robots. In addition to traditional computers, mechanoids have a dim psychic presence, so fluently controlling them requires a psychic connection. By linking mechanitor and mechanoid both psychically and electromagnetically, the mechlink permits deeper control than screen-and-button interfaces.\n\nSince the mechlink interlaces deep within the brain tissue, it can only be removed after death.\n\nNote: An artificer must be capable of smithing work to craft automatons. + A bionic implant that allows direct control of mechanoids. Can only be removed after death. + false + +
  • Mechanitor
  • +
  • Mechanitor_Basic
  • +
    + +
  • + + 6 + 2 + 0.25 + 0.10 + +
  • +
    + +
  • + NeutralEvent + Reusable {HEDIFF_label} available. + {PAWN} has died with a {HEDIFF_label} installed. This can be removed and installed by someone else. + true +
  • +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/Jobs.xml b/1.5/Defs/Jobs.xml new file mode 100644 index 0000000..5fa0178 --- /dev/null +++ b/1.5/Defs/Jobs.xml @@ -0,0 +1,30 @@ + + + + + MB_OperateOnPawn + + MedievalBiotech.WorkGiver_OperateOnPawn + Doctor + operate + operate + 80 + +
  • Manipulation
  • +
    + true +
    + + + MB_OperateOnPawn + MedievalBiotech.JobDriver_OperateOnPawn + operating on TargetB. + + + + MB_CarryCorpseToTable + MedievalBiotech.JobDriver_CarryCorpseToTable + carrying TargetB to TargetA. + + +
    \ No newline at end of file diff --git a/1.5/Defs/Misc/FleshTypeDefs.xml b/1.5/Defs/Misc/FleshTypeDefs.xml new file mode 100644 index 0000000..0642ca7 --- /dev/null +++ b/1.5/Defs/Misc/FleshTypeDefs.xml @@ -0,0 +1,53 @@ + + + + MB_UndeadFleshType + MB_CorpsesUndead + Damage_HitFlesh + +
  • + Things/Pawn/Wounds/WoundFleshA +
  • +
  • + Things/Pawn/Wounds/WoundFleshB +
  • +
  • + Things/Pawn/Wounds/WoundFleshC +
  • +
    +
    + + + MB_SkeletonFleshType + MB_CorpsesUndead + Damage_HitFlesh + +
  • + Things/Pawn/Wounds/WoundMechA +
  • +
  • + Things/Pawn/Wounds/WoundMechB +
  • +
  • + Things/Pawn/Wounds/WoundMechC +
  • +
    +
    + + + MB_SanguinophageFleshType + MB_CorpsesSanguine + Damage_HitFlesh + +
  • + Things/Pawn/Wounds/WoundFleshA +
  • +
  • + Things/Pawn/Wounds/WoundFleshB +
  • +
  • + Things/Pawn/Wounds/WoundFleshC +
  • +
    +
    +
    \ No newline at end of file diff --git a/1.5/Defs/PipeStuff.xml b/1.5/Defs/PipeStuff.xml new file mode 100644 index 0000000..cedb83c --- /dev/null +++ b/1.5/Defs/PipeStuff.xml @@ -0,0 +1,574 @@ + + + + + MB_Steam + + steam gas. + + UI/Overlays/NeedsSteam + Graphic_Single + 0.85 + + 150 + false + + 0 + 0.07 + + +
  • Manufactured
  • +
    + 1 + 30 + 40~80 + 2100 + +
  • + (211, 209, 209) + false +
  • +
    + + True + false + None + false + 0 +
    + + + MB_SteamNet + + 100 + + true + + + Steam + + kg + + (193, 152, 70) + + True + + UI/Overlays/SteamOff + + + +
  • MB_SteamPipe
  • +
    + + + + UI/Gizmos/SteamPipeDeconstruction_MenuIcon + + MB_PipeNetworks + + + + + + (255, 210, 85) + + + + +
  • + + MB_Steam + + 1 +
  • +
    +
    + + + MB_SteamPipe + + ... + PipeSystem.Building_Pipe + Building + + Things/Building/Linked/SteamPipe_Atlas + Graphic_Single + Basic + + +
  • Custom8
  • +
    + + (0,0.35,1,0.3) + +
    + Things/Building/Linked/SteamPipe_MenuIcon + 0.7 + + false + true + false + + Things/Building/Linked/SteamPipe_Blueprint_Atlas + + + MapMeshOnly + Conduits + Standable + false + + 40 + 35 + 1.0 + + 1 + + 2 + + +
  • + MB_SteamNet +
  • +
    + +
  • PipeSystem.PlaceWorker_Pipe
  • +
    + false + true + true + BulletImpact_Metal + Light + MB_PipeNetworks + ConstructMetal + false +
    + + + + + + + MB_SteamTank + + A robust tank for steam storage. Will explode if damaged. + MapMeshAndRealTime + + Things/Building/SteamMachines/SteamTank + Graphic_Multi + (2.5,2.5) + + Damage/Corner + Damage/Corner + Damage/Corner + Damage/Corner + + + Building + PassThroughOnly + 70 + true + 0.40 + Normal + MinifiedThing + +
  • BuildingsPower
  • +
    + + 300 + 2000 + 40 + 0.5 + + (1,2) + + 100 + + Medium + MB_PipeNetworks + true + ConstructMetal + + false + +
  • + MB_SteamNet + 3000 + (1.3, 0.25) + 0.1 +
  • +
  • + 10 + + Flame + 2 + 0.333 + + + 70~150 +
  • +
    +
    + + + MB_SteamTank_Large + + A large robust tank for steam storage. Will explode if damaged. + MapMeshAndRealTime + + Things/Building/SteamMachines/SteamTank + Graphic_Multi + (4.5,4.5) + + Damage/Corner + Damage/Corner + Damage/Corner + Damage/Corner + + + Building + PassThroughOnly + 70 + true + 0.40 + Normal + MinifiedThing + +
  • BuildingsPower
  • +
    + + 300 + 2000 + 40 + 0.5 + + (2,4) + + 100 + + Medium + MB_PipeNetworks + true + ConstructMetal + + false + +
  • + MB_SteamNet + 6000 + (1.3, 0.25) + 0.1 +
  • +
  • + 10 + + Flame + 2 + 0.333 + + + 70~150 +
  • +
    +
    + + + + MB_SteamPipeValve + + Switches steam flow on/off. + PipeSystem.Building_PipeValve + Building + + Things/Building/SteamMachines/SteamSwitch + Graphic_Single + Transparent + + (0.2,0.2,0.6,0.6) + + + + false + false + + Building + Standable + false + + 220 + 400 + 1.0 + -2 + + 0 + + + 15 + 1 + + + +
  • + MB_SteamNet + true +
  • +
  • + Things/Special/Fluid/Steam_OverlayBase + MB_CommandToggleGas_Label + MB_CommandToggleGas_Desc +
  • +
    + false + true + false + Normal + MB_PipeNetworks + ConstructMetal + +
    + + + + MB_SteamGenerator + + Produces steam by consuming coal. Must be periodically refueled by hand. + MedievalBiotech.Building_SteamMachine + MapMeshAndRealTime + + Things/Building/SteamMachines/SteamGenerator + Graphic_Single + (2,2) + + (1.93,1,1.69) + (-0.03,0,-0.1) + + + Building + PassThroughOnly + 50 + true + 1.0 + false + + 300 + 5500 + 0.5 + + Normal + false + (2,2) + + BuildingDestroyed_Metal_Medium + + + + 100 + 3 + + +
  • + MB_SteamNet + + -5 + + ChemfuelFiredGenerator_Ambience +
  • +
  • +
  • + 4.5 + 30.0 + + +
  • WoodLog
  • + + + true + +
  • + 6 + (80,112,180,0) +
  • +
  • + CompHeatPusherPowered + 6 +
  • +
  • + 0 + 0.95 + Flame + 2 + 0.333 + + 70~150 +
  • +
    + Medium + MB_PipeNetworks + 2100 + Misc4 + ConstructMetal + 6 +
    + + + + MB_SteamGenerator_Artificer + + Produces large amounts of steam by consuming coal. Must be periodically refueled by hand. + MedievalBiotech.Building_SteamMachine + MapMeshAndRealTime + + Things/Building/SteamMachines/ArtificerSteamGenerator + Graphic_Single + (4,4) + + (1.93,1,1.69) + (-0.03,0,-0.1) + + + Building + PassThroughOnly + 50 + true + 1.0 + false + + 300 + 5500 + 0.5 + + Normal + false + (4,4) + + BuildingDestroyed_Metal_Medium + + + 100 + 3 + + +
  • + MB_SteamNet + + -10 + + ChemfuelFiredGenerator_Ambience +
  • +
  • +
  • + 13.5 + 90.0 + + +
  • WoodLog
  • + + + true + +
  • + 6 + (80,112,180,0) +
  • +
  • + CompHeatPusherPowered + 12 +
  • +
  • + 0 + 0.95 + Flame + 2 + 0.333 + + 70~150 +
  • +
    + Heavy + MB_PipeNetworks + 2100 + Misc4 + ConstructMetal + 6 +
    + + + + MB_SteamExtractor + + Harvests hot pressurized air from the steam geysers. Must be placed on a steam geyser. + Building + MapMeshAndRealTime + + Things/Building/SteamMachines/SteamPlant + Graphic_Single + (8,8) + + (6.03,1.0,5.25) + (0,0,-0.25) + + + (0.3,0,5.4,6) + + + Building + Impassable + true + false + 1 + true + false + + 800 + 22000 + 0.5 + + (6,6) + + 340 + 8 + + Normal + +
  • + MB_SteamNet + + -20 + + ChemfuelFiredGenerator_Ambience +
  • +
  • + CompPowerPlantSteam + -3600 + true +
  • +
    + false + Heavy + MB_PipeNetworks + 2110 + +
  • PlaceWorker_OnSteamGeyser
  • +
    + + false + GeothermalPlant_Ambience + BuildingDestroyed_Metal_Big + + ConstructMetal + Misc6 + 12 +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/QuestScriptDefs/QuestScript_ArtificerMechs.xml b/1.5/Defs/QuestScriptDefs/QuestScript_ArtificerMechs.xml new file mode 100644 index 0000000..8c50bf1 --- /dev/null +++ b/1.5/Defs/QuestScriptDefs/QuestScript_ArtificerMechs.xml @@ -0,0 +1,24 @@ + + + + + MB_ArtificerStartingMech + 0 + true + true + true + + +
  • arrivalLetterLabel->[mech_label] attached: [mechanitor_nameDef]
  • +
  • arrivalLetterText->A [mech_label] has dropped from orbit and is placing itself under the control of [mechanitor_nameDef].\n\nIt seems to have been attached to [mechanitor_possessive] mechlink and is eager to serve its purpose once again.
  • +
    +
    + + +
  • MB_Artifice_Lifter
  • +
  • MB_Artifice_Constructoid
  • +
    +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/RecipeDefs/Recipes_Artifice_Light.xml b/1.5/Defs/RecipeDefs/Recipes_Artifice_Light.xml new file mode 100644 index 0000000..bb4da4a --- /dev/null +++ b/1.5/Defs/RecipeDefs/Recipes_Artifice_Light.xml @@ -0,0 +1,127 @@ + + + + + Gestating artifice. + 1800 + 1 + 120000 + true + MechFormingSpeed + MechGestatorCycle_Initiating + + + + MB_BasicArtificeTech + +
  • + + +
  • Steel
  • + + + 50 + +
  • + + +
  • MB_SoulGemBasic
  • + + + 1 + +
    +
    + + + MB_Artifice_Lifter + + Gestate a lifter mechanoid. + + 1 + + + MB_Artifice_Lifter + + + + + MB_Artifice_Constructoid + + Gestate a constructoid mechanoid. + + 1 + + + MB_Artifice_Constructoid + + + + + MB_Artifice_Agrihand + + Gestate an agrihand mechanoid. + + 1 + + + MB_Artifice_Agrihand + + + + + MB_Artifice_Cleansweeper + + Gestate a cleansweeper mechanoid. + + 1 + + + MB_Artifice_Cleansweeper + + + + + MB_Artifice_Paramedic + + Gestate a paramedic mechanoid. + +
  • + + +
  • Steel
  • + + + 100 + +
  • + + +
  • MB_SoulGemRegular
  • + + + 1 + +
    + + 1 + + + MB_Artifice_Paramedic + +
    + + + + MB_Artifice_Militor + + Gestate a cleansweeper mechanoid. + + 1 + + + MB_Artifice_Militor + + + +
    \ No newline at end of file diff --git a/1.5/Defs/RecipeDefs/Recipes_Artifice_Medium.xml b/1.5/Defs/RecipeDefs/Recipes_Artifice_Medium.xml new file mode 100644 index 0000000..7ac0233 --- /dev/null +++ b/1.5/Defs/RecipeDefs/Recipes_Artifice_Medium.xml @@ -0,0 +1,101 @@ + + + + + 2 + MB_StandardArtificeTech + + + + MB_Artifice_Scyther + + Gestate a scyther artifice. + +
  • + + +
  • Steel
  • + + + 75 + +
  • + + +
  • Plasteel
  • + + + 75 + +
  • + + +
  • DankPyon_ComponentBasic
  • + + + 8 + +
  • + + +
  • MB_SoulGemBasic
  • + + + 1 + +
    + + 1 + + + MB_Artifice_Scyther + +
    + + + MB_Artifice_Sentinel + + Gestate a sentinel artifice. + +
  • + + +
  • Steel
  • + + + 75 + +
  • + + +
  • Plasteel
  • + + + 75 + +
  • + + +
  • DankPyon_ComponentBasic
  • + + + 8 + +
  • + + +
  • MB_SoulGemBasic
  • + + + 1 + +
    + + 1 + + + MB_Artifice_Sentinel + +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/RecipeDefs/Recipes_Artifice_Resurrect_Light.xml b/1.5/Defs/RecipeDefs/Recipes_Artifice_Resurrect_Light.xml new file mode 100644 index 0000000..006d9a9 --- /dev/null +++ b/1.5/Defs/RecipeDefs/Recipes_Artifice_Resurrect_Light.xml @@ -0,0 +1,51 @@ + + + + + true + Resurrecting mech. + + +
  • AllowCorpsesMechFriendly
  • +
    +
    + +
  • AllowCorpsesMechFriendly
  • +
    +
    + + + MB_ResurrectLightArtifice + + Resurrect a friendly artifice of the light weight class. So long as the artifice's body is not completely destroyed, it can be resurrected. + +
  • + + +
  • Corpses
  • + + + 1 + +
  • + + +
  • Steel
  • + + + 25 + +
    + + +
  • Corpse_MB_Artifice_Lifter
  • +
  • Corpse_MB_Artifice_Constructoid
  • +
  • Corpse_MB_Artifice_Agrihand
  • +
  • Corpse_MB_Artifice_Cleansweeper
  • +
  • Corpse_MB_Artifice_Paramedic
  • +
  • Corpse_MB_Artifice_Militor
  • +
    +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/RecipeDefs/Recipes_Sanguophage.xml b/1.5/Defs/RecipeDefs/Recipes_Sanguophage.xml new file mode 100644 index 0000000..3904bad --- /dev/null +++ b/1.5/Defs/RecipeDefs/Recipes_Sanguophage.xml @@ -0,0 +1,52 @@ + + + + Mutating pawn. + 1800 + 1 + 120000 + true + MechFormingSpeed + MechGestatorCycle_Initiating + + + + + BasicMechtech + +
  • + + +
  • DankPyon_RawWood
  • + + + 1 + +
    + + +
  • DankPyon_RawWood
  • +
    + +
  • AllowRotten
  • +
    +
    + + +
  • DankPyon_RawWood
  • +
    +
    +
    + + + MB_CreateGhoul + + Gestate a militor mechanoid. + + 1 + + + MB_Sang_Ghoul + + +
    \ No newline at end of file diff --git a/1.5/Defs/RecipeDefs/Recipes_Soul_Gems.xml b/1.5/Defs/RecipeDefs/Recipes_Soul_Gems.xml new file mode 100644 index 0000000..923d58a --- /dev/null +++ b/1.5/Defs/RecipeDefs/Recipes_Soul_Gems.xml @@ -0,0 +1,106 @@ + + + + + CookSpeed + Smith + Recipe_CookMeal + Crafting + +
  • MB_Necrarch_Workbench
  • +
    +
    + + MB_Covert_SoulGem_Basic + + Corrupt a basic soulgem. + corrupting soulgem. + 2000 + +
  • + + +
  • MB_SoulGemBasic
  • + + + 1 + +
    + + 1 + + + +
  • MB_SoulGemBasic
  • +
    +
    + + +
  • MB_SoulGemBasic
  • +
    +
    +
    + + + MB_Covert_SoulGem_Regular + + Corrupt a regular soulgem. + corrupting soulgem. + 2000 + +
  • + + +
  • MB_SoulGemRegular
  • + + + 1 + +
    + + 1 + + + +
  • MB_SoulGemRegular
  • +
    +
    + + +
  • MB_SoulGemRegular
  • +
    +
    +
    + + + MB_Covert_SoulGem_High + + Corrupt a high soulgem. + corrupting soulgem. + 2000 + +
  • + + +
  • MB_SoulGemHigh
  • + + + 1 + +
    + + 1 + + + +
  • MB_SoulGemHigh
  • +
    +
    + + +
  • MB_SoulGemHigh
  • +
    +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/RecipeDefs/Recipes_Undead.xml b/1.5/Defs/RecipeDefs/Recipes_Undead.xml new file mode 100644 index 0000000..5340b26 --- /dev/null +++ b/1.5/Defs/RecipeDefs/Recipes_Undead.xml @@ -0,0 +1,38 @@ + + + + + Resurrecting pawn. + 1800 + 1 + 120000 + true + MechFormingSpeed + MechGestatorCycle_Initiating + + + BasicMechtech + +
  • + + +
  • Corpse_Human
  • + + + 1 + +
    +
    + + MB_Restless + + Summon a restless. + + 1 + + + MB_Undead_Restless + + + +
    \ No newline at end of file diff --git a/1.5/Defs/ResearchProjectDef/ResearchProjectDef.xml b/1.5/Defs/ResearchProjectDef/ResearchProjectDef.xml new file mode 100644 index 0000000..11b364e --- /dev/null +++ b/1.5/Defs/ResearchProjectDef/ResearchProjectDef.xml @@ -0,0 +1,62 @@ + + + + + + MB_BasicArtificeTech + + Research how to craft basic artifice constructs. + 1000 + DankPyon_MedievalResearchTab + Medieval + 11 + 3.6 + +
  • DankPyon_Engineering
  • +
    + + +
  • subject->artificing
  • +
    +
    +
    + + + MB_StandardArtificeTech + + Research how to craft standard artifice constructs. + 1000 + DankPyon_MedievalResearchTab + Medieval + 11 + 3.6 + +
  • MB_BasicArtificeTech
  • +
    + + +
  • subject->artificing
  • +
    +
    +
    + + + MB_AdvancedArtificeTech + + Research how to craft advanced artifice constructs. + 1000 + DankPyon_MedievalResearchTab + Medieval + 11 + 3.6 + +
  • MB_StandardArtificeTech
  • +
    + + +
  • subject->artificing
  • +
    +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/Stats/StatDefs.xml b/1.5/Defs/Stats/StatDefs.xml new file mode 100644 index 0000000..ce3445c --- /dev/null +++ b/1.5/Defs/Stats/StatDefs.xml @@ -0,0 +1,14 @@ + + + + + SoulGainFactor + + A multiplier on the amount of dark arcana gained. + BasicsPawn + PercentZero + 1 + 1 + + + \ No newline at end of file diff --git a/1.5/Defs/ThingCategoryDefs/ThingCategories.xml b/1.5/Defs/ThingCategoryDefs/ThingCategories.xml new file mode 100644 index 0000000..9583042 --- /dev/null +++ b/1.5/Defs/ThingCategoryDefs/ThingCategories.xml @@ -0,0 +1,14 @@ + + + + MB_CorpsesUndead + + Corpses + + + + MB_CorpsesSanguine + + Corpses + + \ No newline at end of file diff --git a/1.5/Defs/ThingDefs_Buildings/Building_Artificer_Recharger.xml b/1.5/Defs/ThingDefs_Buildings/Building_Artificer_Recharger.xml new file mode 100644 index 0000000..9a6842d --- /dev/null +++ b/1.5/Defs/ThingDefs_Buildings/Building_Artificer_Recharger.xml @@ -0,0 +1,181 @@ + + + + + MedievalBiotech.Building_SteamCharger + Normal + Building + true + false + 0.3 + + false + +
  • Biotech
  • +
    +
    + MB_PipeNetworks + 2410 + +
  • +
  • + false +
  • +
    + MapMeshAndRealTime + Medieval +
    + + + MB_BasicRecharger + + Lightweight mechanoids can recharge here. During recharge, this recharger produces toxic wastepacks and stores them internally. Haulers must remove the wastepacks from time to time. + + Things/Building/SteamMachines/BasicRecharger + Graphic_Multi + (4,2) + + (2.9, 0.5, 0.9) + + + (0,0,1) + PassThroughOnly + + 150 + 8000 + 25 + 0.5 + + (3,1) + + +
  • Light
  • +
    + + + (-0.01598358,0.0255661) + (0.5505219,0.1139069) + + + (0.006927488,-0.02323151) + (0.5479813,0.1345978) + + + (0.1157379,-0.006530767) + (0.4481201,0.1160278) + + + (-0.1114426,-0.005119322) + (0.4646759,0.1281815) + + +
    + + 125 + 1 + + +
  • MB_BasicArtificeTech
  • +
    + + +
  • + MedievalBiotech.CompInnerThing_SteamCharger + 5 + false + MechChargerWasteRemoved +
  • +
  • + MedievalBiotech.CompResourceTrader_Steam + MB_SteamNet + 6 + 1 +
  • +
  • + false + + MedievalBiotech.CompPowerPlantNeedResource_Steam + -1000 +
  • +
    + Medieval +
    + + + MB_StandardRecharger + + Medium, heavy, and ultraheavy mechanoids can recharge here. During recharge, this recharger produces toxic wastepacks and stores them internally. Haulers must remove the wastepacks from time to time. + + Things/Building/SteamMachines/StandardRecharger + Graphic_Multi + (4,3) + + (2.9, 0.5, 1.9) + + + (0,0,2) + PassThroughOnly + + 250 + 8000 + 25 + 0.5 + + (3,2) + + +
  • Medium
  • +
  • Heavy
  • +
  • UltraHeavy
  • +
    + + + (0.002166748,-0.3722534) + (0.4398041,0.1365509) + + + (-0.002609305,-0.6002655) + (0.4398041,0.121376) + + + (0.04148867,0.6301422) + (0.4066238,0.1425552) + + + (-0.02767944,0.6171188) + (0.397522,0.1395264) + + +
    + 5 + + 250 + 2 + + +
  • MB_StandardArtificeTech
  • +
    + +
  • + CompThingContainer + 5 + false + MechChargerWasteRemoved +
  • +
  • + MedievalBiotech.CompResourceTrader_Steam + MB_SteamNet + 12 + 1 +
  • +
  • + false + + MedievalBiotech.CompPowerPlantNeedResource_Steam + -1000 +
  • +
    + Medieval +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/ThingDefs_Buildings/Buildings_Artificer.xml b/1.5/Defs/ThingDefs_Buildings/Buildings_Artificer.xml new file mode 100644 index 0000000..0b729d5 --- /dev/null +++ b/1.5/Defs/ThingDefs_Buildings/Buildings_Artificer.xml @@ -0,0 +1,432 @@ + + + + + + MedievalBiotech.Building_SteamGestator + true + Normal + MapMeshAndRealTime + Building + PassThroughOnly + 0.5 + true + true + 42 + Item + +
  • ITab_Bills
  • +
    + + BillsTab + false + false + +
  • Production
  • +
  • Biotech
  • +
    +
    + Biotech + 2400 + South + +
  • PlaceWorker_MechGestatorTop
  • +
    + +
  • + + Medieval + + + + MB_ArtificeGestator + + A containment vat filled with an alchemically charged fluid, enriched with infusion catalysts and support tubes for channeling materials and energy. Artificers can use it to assemble new constructs or reawaken fallen ones by embedding infused soul gems into mechanical frames. + + Things/Building/Production/ArtificeConstructPlatform + Graphic_Multi + (5.6,4) + + (3, 2, 1.9) + + + Things/Building/Production/ArtificeConstructPlatform_south + 1.85 + (1,0,2) + +
  • MB_Artifice_Lifter
  • +
  • MB_Artifice_Constructoid
  • +
  • MB_Artifice_Agrihand
  • +
  • MB_Artifice_Cleansweeper
  • +
  • MB_Artifice_Paramedic
  • +
  • MB_Artifice_Militor
  • +
  • MB_ResurrectLightArtifice
  • + + + 250 + 8000 + 25 + 0.5 + + (3,2) + + 150 + 3 + + +
  • MB_BasicArtificeTech
  • +
    + + + + (-1.06, 0.91) + (0.7, 0.13) + + + (-1.06, 0.82) + (0.7, 0.13) + + + (1.06, -0.97) + (0.7, 0.13) + + + (-1.06, -0.97) + (0.7, 0.13) + + + + Things/Pawn/Mechanoid/HalfGestatedMechSmall + Graphic_Single + (1,1) + + +
  • (0, 0, 0.45)
  • +
  • (0, 0, 0.45)
  • +
  • (0, 0, 0.45)
  • +
  • (0, 0, 0.45)
  • +
    + + Things/Building/Production/MechGestatorStandardGlass + Graphic_Multi + (5.6,4) + Transparent + + + Things/Building/Production/MechGestatorStandardTop + Graphic_Multi + (5.6,4) + + + MechGestatorForming_North + MechGestatorForming_East + MechGestatorForming_East + MechGestatorForming_South + + + MechGestatorCycleComplete_North + MechGestatorCycleComplete_East + MechGestatorCycleComplete_East + MechGestatorCycleComplete_South + + + MechGestatorFormed_North + MechGestatorFormed_East + MechGestatorFormed_East + MechGestatorFormed_South + +
    + +
  • + MedievalBiotech.CompResourceTrader_Steam + MB_SteamNet + 5 + 2 +
  • +
  • + false + MedievalBiotech.CompPowerPlantNeedResource_Steam + -1000 +
  • +
    + MB_PipeNetworks +
    + + + + MB_SubcoreEncoder + + A work station where an artificer can craft basic-tier soul gems. Soul gems are the brains of automatons, and one is required to craft any automaton. Basic soul gems can only be used in simple basic-tier automatons.\n\nHigher tier soul gems can be created by building an amplified gem infuser or soul harvester. + Building_WorkTable + false + PassThroughOnly + 0.3 + + Things/Building/Production/GemInfuser + Graphic_Multi + (4,3) + + (3, 2, 1.9) + + + Building + + false + +
  • Biotech
  • +
    +
    + 4 + MB_PipeNetworks + 2430 + + 200 + 8000 + 25 + 0.5 + + (3,2) + + 100 + 3 + + +
  • MB_BasicArtificeTech
  • +
    + true + (0,0,-1) + +
  • ITab_Bills
  • +
    + +
  • + +
  • Mote_SubcoreEncoderNorth
  • +
  • Mote_SubcoreEncoderEast
  • +
  • Mote_SubcoreEncoderSouth
  • +
  • Mote_SubcoreEncoderEast
  • + + (0, 0, -0.34) + (0, 0, 0.66) + (0.575, 0, 0.24) + (-0.575, 0, 0.24) + true + +
  • + MedievalBiotech.CompResourceTrader_Steam + MB_SteamNet + 3 + 1 +
  • +
  • + false + + MedievalBiotech.CompPowerPlantNeedResource_Steam + -1000 +
  • +
    + +
  • PlaceWorker_PreventInteractionSpotOverlap
  • +
    + Medieval +
    + + + Building_SubcoreScanner + true + Building + PassThroughOnly + 0.3 + + Graphic_Multi + (3,2) + + (3, 2, 1.9) + + + + false + +
  • Biotech
  • +
    + +
  • + + +
  • Steel
  • + + + 50 + +
  • + + +
  • DankPyon_ComponentBasic
  • + + + 4 + +
    +
    + MB_PipeNetworks + 2430 + false + (3,2) + true + (0,0,-1) + + 25 + 0.5 + + +
  • + MedievalBiotech.CompResourceTrader_Steam + MB_SteamNet + 5 + 1 +
  • +
  • + false + + MedievalBiotech.CompPowerPlantNeedResource_Steam + -1000 +
  • +
    + Normal + MapMeshAndRealTime + Medieval +
    + + + MB_SubcoreSoftscanner + + A metallic capsule lined with thousands of fine aetheric filaments and a high-energy mind scanner. When a living being is placed inside, the device maps their neuro-psychic imprint, using the filaments to extract an ephemeral soul pattern without causing permanent harm. This extracted pattern is then analog-transferred into a standard-tier infused core. + + Things/Building/Production/AmpGemInfuser + (4,3) + + + 8000 + 250 + + + 200 + 50 + 4 + + +
  • MB_StandardArtificeTech
  • +
    + + MB_SoulGemRegular + SubcoreSoftscanner_Start + SubcoreSoftscanner_Working + SubcoreSoftscanner_Complete + ScanningSickness + + MB_PipeNetworks + 5 + Medieval +
    + + + MB_SubcoreRipscanner + + A grim and forbidden machine, the Soul Harvester is an ancient and malevolent device designed to forcibly rip the soul-pattern from a living being. Unlike the Gem Infuser, which merely copies a soul imprint, the Soul Harvester extracts and consumes the soul entirely, leaving behind an empty husk that quickly decays. + + Things/Building/Production/SoulHarvester + (3,2.5) + + + 1200 + 250 + + + 200 + 150 + 6 + + +
  • MB_AdvancedArtificeTech
  • +
    + + MB_SoulGemHigh + SubcoreRipscanner_Start + true + SubcoreRipscanner_Working + SubcoreRipscanner_Complete + + MB_PipeNetworks + 6 + Medieval +
    + + + MB_BandNode + + A mechanical signal booster designed to enhance the control capacity of an artificer. Control nodes must be attuned to a specific master, increasing their control bandwidth and allowing them to command additional constructs. + Normal + false + false + MapMeshAndRealTime + 0.4 + + Things/Building/Misc/ControlledAmplifier + Graphic_Single + (2,2) + + (1.5, 0.35, 1.2) + (0, 0, -0.15) + + + Building + PassThroughOnly + + false + +
  • Biotech
  • +
    +
    + 4 + MB_PipeNetworks + 2440 + + 150 + 8000 + 25 + 0.5 + + (2,2) + + 200 + 4 + + +
  • MB_BasicArtificeTech
  • +
    + +
  • + MedievalBiotech.CompResourceTrader_Steam + MB_SteamNet + 2 + 1 +
  • +
  • + MedievalBiotech.CompBandNode_Steam + MB_BandNode + BandNodeUntuned + BandNodeTuning + BandNodeTuned + BandNodeRetuning + BandNodeTuning_Complete + 0 +
  • +
    + +
  • PlaceWorker_BandNode
  • +
    + true + Medieval +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/ThingDefs_Buildings/Buildings_Deathrest.xml b/1.5/Defs/ThingDefs_Buildings/Buildings_Deathrest.xml new file mode 100644 index 0000000..6a7d088 --- /dev/null +++ b/1.5/Defs/ThingDefs_Buildings/Buildings_Deathrest.xml @@ -0,0 +1,126 @@ + + + + + MB_AltarImmortalKing + + PLACEHOLDER + + Things/Building/Misc/AltarImmortalKing/AltarImmortalKing + Graphic_Multi + CutoutComplex + (4,4) + + (0.9, 0.3, 1.8) + + + 0.5 + true + South + + 200 + 30000 + 100 + 30 + 0.4 + + (1,1) + 100 + +
  • DankPyon_RawWood
  • +
  • Woody
  • +
  • Metallic
  • +
  • Stony
  • +
    + + 25 + 5 + + 4 + + + Medieval +
    + + + MB_RoyalDeathrestCasket + + An enclosed med-casket that accelerates the process of deathrest. It can connect to other devices which confer additional bonuses on the deathrester. The number of devices that can connect depends on the person's deathrest capacity, which can be seen by selecting them.\n\nOnly those with the deathrest gene can use the deathrest casket. + Building_Bed + Rare + 0.4 + 42 + true + false + PassThroughOnly + South + +
  • BuildingsMisc
  • +
    + + Things/Building/Misc/RoyalDeathrestCasket/RoyalDeathrestCasket + Graphic_Multi + CutoutComplex + (2,2) + + + true + false + 5 + false + false + false + false + +
  • Bed
  • +
  • Biotech
  • +
    + +
  • DeathrestAccelerator
  • +
  • Hemopump
  • +
  • HemogenAmplifier
  • +
  • GlucosoidPump
  • +
  • PsychofluidPump
  • +
    +
    + Biotech + 2001 + + 200 + 20000 + 50 + 0.5 + 75 + 1.05 + 0.9 + 1.07 + 1 + + (1,2) + + 50 + 50 + + +
  • + false + CompAssignableToPawn_DeathrestCasket +
  • +
  • + 1 + false + 1.2 + true + false + DeathrestCasket_Enter + DeathrestCasket_Exit +
  • +
    +
  • Deathrest
  • + +
  • PlaceWorker_DrawLinesToDeathrestBuildings
  • +
    + Medieval +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/ThingDefs_Buildings/Buildings_Deathrest_Necrarch.xml b/1.5/Defs/ThingDefs_Buildings/Buildings_Deathrest_Necrarch.xml new file mode 100644 index 0000000..e0e078b --- /dev/null +++ b/1.5/Defs/ThingDefs_Buildings/Buildings_Deathrest_Necrarch.xml @@ -0,0 +1,376 @@ + + + + + MB_AltarImmortalKing_Necrarch + + PLACEHOLDER + + Things/Building/Misc/Necrarch/AltarImmortalKing + Graphic_Multi + CutoutComplex + (3,3) + + (0.9, 0.3, 1.8) + + + (0.1,0.1,0.9,1.8) + + + BuildingOnTop + 0.5 + true + South + + 200 + 30000 + 100 + 30 + 0.4 + + (1,1) + 100 + +
  • DankPyon_RawWood
  • +
  • Woody
  • +
  • Metallic
  • +
  • Stony
  • +
    + + 25 + 5 + + 4 + +
  • + 0.25 + Hemopump_Start + Hemopump_Stop + Hemopump_Ambience +
  • +
    + +
  • + 0.25 +
  • +
    + Medieval +
    + + + MB_RoyalNecrarchSarcophagus + + PLACEHOLDER + Building_Bed + Rare + 0.4 + 42 + true + false + PassThroughOnly + South + +
  • BuildingsMisc
  • +
    + + Things/Building/Misc/Necrarch/RoyalNecrarchSarcophagus_Open + Graphic_Multi + CutoutComplex + (2,2) + + + true + false + 5 + false + false + false + false + +
  • Bed
  • +
  • Biotech
  • +
    + +
  • MB_AltarImmortalKing_Necrarch
  • +
  • MB_DreadlightCandelabra
  • +
  • MB_NecrarchPentagram
  • +
  • MB_DeathrestIncense
  • +
  • MB_MagusAltar
  • +
    +
    + Biotech + 2001 + + 200 + 20000 + 50 + 0.5 + 75 + 1.05 + 0.9 + 1.07 + 1 + + (1,2) + + 50 + 50 + + +
  • + false + CompAssignableToPawn_DeathrestCasket +
  • +
  • + 1 + false + 1.2 + true + false + DeathrestCasket_Enter + DeathrestCasket_Exit +
  • +
  • + + Things/Building/Misc/Necrarch/RoyalNecrarchSarcophagus + Graphic_Multi + CutoutComplex + (2,2) + +
  • +
    +
  • Deathrest
  • + +
  • PlaceWorker_DrawLinesToDeathrestBuildings
  • +
    + Medieval +
    + + + MB_DeathrestIncense + + PLACEHOLDER + + Things/Building/Misc/Necrarch/UndeadIncense + Graphic_Multi + CutoutComplex + (3,4) + + (0.6, 0.3, 1.8) + + + (0.3,0.2,0.7,1.8) + + + East + + 200 + 4000 + 50 + 0.4 + + (1,2) + + 300 + 4 + + 100 + +
  • DankPyon_RawWood
  • +
  • Woody
  • +
  • Metallic
  • +
  • Stony
  • +
    + 4 + +
  • +
  • + 2 + 1.2 + false + DeathrestAccelerator_Ambience +
  • +
    + Medieval +
    + + + MB_DreadlightCandelabra + + PLACEHOLDER + + Things/Building/Misc/Necrarch/HemogenAmplifier + Graphic_Multi + (2,2) + + North + 0.5 + BuildingOnTop + false + true + + 100 + 5000 + 5 + 0.4 + + (1,1) + + 50 + 5 + + 4 + + HemogenAmplified + + +
  • + MB_SoulAmplified + HemogenAmplifier_Start + HemogenAmplifier_Stop + HemogenAmplifier_Ambience +
  • +
  • + 10 + (174, 88, 173, 0) +
  • +
  • + 0.75 + (0,0,0.50) +
  • +
  • + CompHeatPusherPowered + 3.5 + 23 +
  • +
  • + MeditationFocusStrength +
  • Flame
  • + +
  • + 0.1 +
  • +
  • + +
  • Campfire
  • +
  • TorchLamp
  • +
  • DankPyon_Candles
  • +
  • DankPyon_CandleStand
  • +
  • Brazier
  • +
  • Darktorch
  • +
  • DarktorchFungus
  • +
    + 0.01 + 9.9 + 8 + MeditationFocusPerFlame + MeditationFocusPerFlameAbstract + + + + + Medieval + + + + MB_NecrarchPentagram + + PLACEHOLDER + + Things/Building/Misc/Necrarch/DarkPentagram + Graphic_Single + (3, 3) + + (0.3,0.2,0.7,1.8) + + + 0.8 + North + FloorEmplacement + true + + 200 + 4000 + 2 + 0 + + + false + + (1,2) + + 150 + 6 + 5 + + 4 + + GlucosoidRush + + +
  • + 4 + GlucosoidRush + GlucosoidPump_Start + GlucosoidPump_Stop + GlucosoidPump_Ambience +
  • +
    + Medieval +
    + + + MB_MagusAltar + + PLACEHOLDER + + Things/Building/Misc/Necrarch/Undead_AltarMagi + Graphic_Multi + CutoutComplex + (4,4) + + (0.9, 0.3, 1.8) + + + (0.1,0.1,0.9,1.8) + + + BuildingOnTop + South + 0.5 + + 200 + 30000 + 100 + 50 + 0.4 + + (1,1) + + 25 + 5 + + 100 + +
  • DankPyon_RawWood
  • +
  • Woody
  • +
  • Metallic
  • +
  • Stony
  • +
    + 4 + + PsychofluidRush + + +
  • + 4 + PsychofluidRush + PsychofluidPump_Start + PsychofluidPump_Stop + PsychofluidPump_Ambience +
  • +
    + Medieval +
    + + \ No newline at end of file diff --git a/1.5/Defs/ThingDefs_Buildings/Buildings_Genes.xml b/1.5/Defs/ThingDefs_Buildings/Buildings_Genes.xml new file mode 100644 index 0000000..2dfaff7 --- /dev/null +++ b/1.5/Defs/ThingDefs_Buildings/Buildings_Genes.xml @@ -0,0 +1,140 @@ + + + + + MB_GenePotionsRack + + This building can store genepacks and make them usable to create new xenogerms, when placed near a gene assembler. Large gene libraries require many gene banks.\n\nWhen powered, gene banks prevent genepacks from deteriorating and will slowly repair deterioration. + + Things/Building/Misc/GenePotionRack/GenePotionRack + Graphic_Multi + CutoutComplex + (2, 2) + + (1.7, 0.3, 0.85) + + + true + MinifiedThing + Normal + PassThroughOnly + false + (1, 2) + + 200 + 5000 + 20 + 0.5 + + +
  • BuildingsProduction
  • +
    + +
  • ITab_ContentsGenepackHolder
  • +
    + + 50 + +
  • DankPyon_RawWood
  • +
  • Woody
  • +
  • Metallic
  • +
  • Stony
  • +
    + + + 5 + + 4 + + + Genepack + GeneAssembler + + +
  • + 8 +
  • +
  • + 100 + 12.9 +
  • +
    +
    + + + MB_MutagenRevitalizer + + A genetic analysis and processing system. Placed near a gene assembler, it increases the maximum genetic complexity of the xenogerms you can assemble. Building multiple gene processors will increase the genetic complexity limit further. + PassThroughOnly + 0.4 + 14 + false + + Things/Building/Misc/MutagenRevitalizer/MutagenRevitalizer + Graphic_Single + CutoutComplex + (4, 4) + + (1.5, 0.4, 1.5) + + + (2, 2) + false + North + Biotech + 2100 + +
  • Xenogermination
  • +
    + + Normal + + + GeneAssembler + GeneBank + Genepack + Xenogerm + + + + 350 + 9000 + 85 + 0.5 + + + 200 + +
  • Metallic
  • +
  • Stony
  • +
    + + + 10 + + + 6 + + +
  • Biotech
  • +
    +
    + +
  • + 0.5 + 5 + Hemogen + + +
  • HemogenPack
  • + + + 0 + true + true + 0.05 + +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/ThingDefs_Buildings/Buildings_Necrarch_Production.xml b/1.5/Defs/ThingDefs_Buildings/Buildings_Necrarch_Production.xml new file mode 100644 index 0000000..5c4150e --- /dev/null +++ b/1.5/Defs/ThingDefs_Buildings/Buildings_Necrarch_Production.xml @@ -0,0 +1,105 @@ + + + + + MB_Necrarch_Workbench + + PLACEHOLDER + Building_WorkTable + + Things/Building/Misc/Necrarch/NecromancerAltar + Graphic_Multi + CutoutComplex + (5,4) + + Damage/Corner + Damage/Corner + Damage/Corner + Damage/Corner + + + Building + 0.5 + True + + 2000 + 180 + 1.0 + + (3,2) + Production + PassThroughOnly + 50 + True + (0,0,-1) + Item + +
  • ITab_Bills
  • +
    + Medieval + +
  • PlaceWorker_PreventInteractionSpotOverlap
  • +
    + true + 0.20 + + 60 + + 20 + +
  • Stony
  • +
    + + + + + + true + BillsTab + 0.10 + +
    + + + MB_ResurrectionCircle + + PLACEHOLDER + + Things/Building/Misc/Necrarch/SummoningCircle + Graphic_Multi + (3, 3) + + (0.3,0.2,0.7,1.8) + + + 0.8 + North + true + + 200 + 4000 + 2 + 0 + + + false + + (3,3) + Production + + 150 + 6 + 5 + + 4 + True + (0,0,-2) + +
  • PlaceWorker_PreventInteractionSpotOverlap
  • +
    + + + Medieval +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/ThingDefs_Items/Items_Resource_Manufactured.xml b/1.5/Defs/ThingDefs_Items/Items_Resource_Manufactured.xml new file mode 100644 index 0000000..695ea28 --- /dev/null +++ b/1.5/Defs/ThingDefs_Items/Items_Resource_Manufactured.xml @@ -0,0 +1,328 @@ + + + + + + Metal_Drop + Standard_Drop + 10 + + 0.85 + + false + + 100 + 200 + 1 + 0.6 + 2.0 + + true + +
  • Manufactured
  • +
    +
    + + + + Fluid + NeverForNutrition + false + MB_AbosorbedCorruptedSoulGem + HemogenPack_Consume + + + + + Metal_Drop + Standard_Drop + 10 + false + + 100 + 500 + 1 + 0.25 + 2.0 + + true + +
  • Manufactured
  • +
    + true +
    + + + + MB_SoulGemBasic + + A crystalline vessel, pulsating with ethereal energy, capturing the essence of life's energy. Within its depths lies the potential to drive the simplest of artifice constructs. \n\Occasionally, the personality and quirks of the soul within the gem manifest in the construct. \n\These soul gems serve as conduits for mystical power, coveted by mages and sorcerers alike for their ability to channel the forces of life and death. + + Things/Item/Resource/SoulgemBasic + Graphic_Single + + +
  • SubcoreBasic
  • +
    + + 3000 + + + MB_BasicArtificeTech + SubcoreEncodingSpeed + Crafting + +
  • MB_SubcoreEncoder
  • +
    + true + UnfinishedSubcore + SubcoreEncoder_Working +
    + + 50 + 2 + +
    + + + MB_SoulGemRegular + + A A shimmering prism, pulsing with the captured essence of departed souls. Within its depths lies the potential to drive the standard artifice constructs. \n\Occasionally, the personality and quirks of the soul within the gem manifest in the construct. \n\These soul gems serve as conduits for mystical power, coveted by mages and sorcerers alike for their ability to channel the forces of life and death. + + Things/Item/Resource/SoulgemRegular + Graphic_Single + + + 300 + + + + + MB_SoulGemHigh + + An iridescent vessel of unparalleled potency, radiating with the boundless energies of a body forced into transcendence before being shoved within. Within its depths lies the potential to drive the most complex of artifice constructs. \n\These prestigious soul gems are coveted treasures among the arcane elite, serving as conduits for unparalleled feats of magic and the invocation of forces beyond mortal comprehension. + + Things/Item/Resource/SoulgemHigh + Graphic_Single + + + 1000 + + + + + + MB_PowercoreBasic + + A mechanoid-band synchronization micro-organ. It is necessary to produce certain advanced types of mechanoids and equipment.\n\nA mechanitor can study this chip to help unlock higher tiers of mechtech research. + + Things/Item/Resource/PowercoreBasic + Graphic_Single + + + 0 + + +
  • + 92349061 + true + + + + 0.5 + false + Signal chip studied: {RESEARCH} unlocked + By studying the signal chip, {PAWN_labelShort} has acquired the insight needed for the research project(s) {RESEARCH}.\n\nYour researchers can now use research benches to begin researching how to actually use the technology. + PositiveEvent + + + + UI/Icons/Study + + Analyze... + Analyze the signal chip. + Analyze signal chip + Choose who should analyze this + Can be analyzed by a colonist. + + + false + false + false + true + +
  • +
    +
    + + + MB_PowercoreRegular + + An energy-focusing mechanoid micro-organ. It is necessary to produce certain advanced types of mechanoids and equipment.\n\nA mechanitor can study this chip to help unlock higher tiers of mechtech research. + + Things/Item/Resource/PowercoreRegular + Graphic_Single + + + 1000 + + +
  • + 652343245 + true + + + + 0.5 + false + Powerfocus chip studied: {RESEARCH} unlocked + By studying the powerfocus chip, {PAWN_labelShort} has acquired the insight needed for the research project(s) {RESEARCH}.\n\nYour researchers can now use research benches to begin researching how to actually use the technology. + PositiveEvent + + + + UI/Icons/Study + + Analyze... + Analyze the powerfocus chip. + Analyze powerfocus chip + Choose who should analyze this + Can be analyzed by a colonist. + + + false + false + false + true + +
  • +
    +
    + + + MB_PowercoreHigh + + A molecular-restructing mechanoid micro-organ. It is necessary to produce certain advanced mechanoids and equipment.\n\nA mechanitor can study this chip to help unlock higher tiers of mechtech research. + + Things/Item/Resource/PowercoreHigh + Graphic_Single + + + 1500 + + +
  • + 123417683 + true + + + + 0.5 + false + Nano structuring chip studied: {RESEARCH} unlocked + By studying the nano structuring chip, {PAWN_labelShort} has acquired the insight needed for the research project(s) {RESEARCH}.\n\nYour researchers can now use research benches to begin researching how to actually use the technology. + PositiveEvent + + + + UI/Icons/Study + + Analyze... + Analyze the nano structuring chip. + Analyze nano structuring chip + Choose who should analyze this + Can be analyzed by a colonist. + + + false + false + false + true + +
  • +
    +
    + + + + MB_CorruptedSoulGemBasic + + PLACEHOLDER + + Things/Item/Resource/CorruptedSoulBasic + Graphic_Single + + + + + + 3000 + + + +
  • + 0.10 +
  • +
    +
    +
    + + + MB_CorruptedSoulGemRegular + + PLACEHOLDER + + Things/Item/Resource/CorruptedSoulRegular + Graphic_Single + + + 300 + + + +
  • + 0.45 +
  • +
    +
    +
    + + + MB_CorruptedSoulGemHigh + + PLACEHOLDER + + Things/Item/Resource/CorruptedSoulHigh + Graphic_Single + + + 1000 + + + +
  • + 2.0 +
  • +
    +
    +
    + + + MB_ArcanaStone + + PLACEHOLDER + + Things/Item/Resource/ArcanaStone + Graphic_Single + + + +
  • + 0.20 +
  • +
    + +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/ThingDefs_Items/Items_Resources.xml b/1.5/Defs/ThingDefs_Items/Items_Resources.xml new file mode 100644 index 0000000..1ca1841 --- /dev/null +++ b/1.5/Defs/ThingDefs_Items/Items_Resources.xml @@ -0,0 +1,63 @@ + + + + + MB_CorruptedBone + + PLACEHOLDER + + Things/Item/Resource/CorruptedBone + Graphic_StackCount + + -20 + Wood_Drop + Wood_Drop + + 2.5 + 0.7 + 0.0 + 0.9 + 0.54 + 0.9 + 8 + 4 + 1 + 1 + + + corrupted + +
  • Woody
  • +
  • Metallic
  • +
    + 0.005 + (112,112,112) + ConstructWood + Metal + MeleeHit_Wood + MeleeHit_Wood + + 1 + 1 + 0 + 1.5 + 1.5 + 1.2 + 0.9 + +
    + +
  • ResourcesRaw
  • +
    + +
  • + +
  • Blunt
  • + + 8 + 2.2 + +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/ThingDefs_Misc/Weapons/ArtificeWeapons.xml b/1.5/Defs/ThingDefs_Misc/Weapons/ArtificeWeapons.xml new file mode 100644 index 0000000..4ce1547 --- /dev/null +++ b/1.5/Defs/ThingDefs_Misc/Weapons/ArtificeWeapons.xml @@ -0,0 +1,171 @@ + + + + + + MB_ArtificeCrossbow + + A projectile launching weapon that, much like the bow, relies on a string pulled back for tension and propels a projectile upon release. However, the crossbow allows the wielder to maintain the draw thanks to the crossbow’s locking mechanism, thus making the ranged weapon both accessible to novices and powerful in combat. + + Things/Item/Equipment/WeaponRanged/MB_ArtificeCrossbow + Graphic_Single + + Bow_Recurve + + 14000 + 2.5 + 0.86 + 0.85 + 0.67 + 0.38 + 2 + + + 2 + + +
  • MB_ArtificeCrossbow
  • +
    + +
  • Ranged
  • +
    + +
  • + Verb_Shoot + true + DankPyon_Arrow_Crossbow + 1.35 + 25.9 + Bow_Recurve +
  • +
    + +
  • + + +
  • Blunt
  • +
  • Poke
  • + + 9 + 2 + +
    + None + true + 0 +
    + + + + +
  • Melee
  • +
    + None + true + 0 + + 1.0 + +
    + + + + MB_ArtificeBlade + + Artifice Blade + + Things/Item/Equipment/WeaponMelee/MB_ArtificeBlade + Graphic_Single + + Bow_Recurve + + 14000 + 2.5 + + +
  • MB_ArtificeBlade
  • +
    + +
  • + + blade + +
  • Cut
  • + + 20 + 2 + +
  • + + blade + +
  • Stab
  • + + 20 + 2 + +
  • + + +
  • Poke
  • + + 9 + 2 + +
    + None + true + 0 +
    + + + + MB_ArtificeAxeBlade + + Artifice Blade + + Things/Item/Equipment/WeaponMelee/MB_ArtificeAxeblade + Graphic_Single + + Bow_Recurve + + 14000 + 2.5 + + +
  • MB_ArtificeAxeblade
  • +
    + +
  • + + blade + +
  • Cut
  • + + 32 + 2 + +
  • + + blade + +
  • Stab
  • + + 32 + 2 + +
  • + + +
  • Poke
  • + + 9 + 2 + +
    + None + true + 0 +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/ThingDefs_Races/Races_Artifice_Light.xml b/1.5/Defs/ThingDefs_Races/Races_Artifice_Light.xml new file mode 100644 index 0000000..40e1606 --- /dev/null +++ b/1.5/Defs/ThingDefs_Races/Races_Artifice_Light.xml @@ -0,0 +1,323 @@ + + + + + + 800 + 3.4 + 0.10 + 0.20 + 0.66 + + + Mech_Light + ToolUser + Mechanoid + 0.7 + Light + + + 10 + + +
  • + + +
  • Blunt
  • + + 6 + 2.6 + HeadAttackTool + true + +
    + +
  • + true +
  • +
    +
    + + + + MB_Artifice_Lifter + + A small mechanoid designed for hauling. Lacking a ranged weapon, it can make only weak melee attacks. + + 2.8 + + + +
  • Hauling
  • +
    + +
  • + MechanoidFullyFormed + 0 + Pawn_Mech_Lifter_Wounded + Pawn_Mech_Lifter_Death + Pawn_Mech_Lifter_Call +
  • +
    + 8 +
    +
    + + + MB_Artifice_Lifter + + MB_Artifice_Lifter + +
  • + + Things/Pawn/Artifice/Lifter + 1.1 + +
  • +
    +
    + + + + MB_Artifice_Constructoid + + A small mechanoid designed to perform construction tasks. It can perform blunt melee attacks if necessary. + + 0.5 + + + +
  • Construction
  • +
    + +
  • + MechanoidFullyFormed + 0 + Pawn_Mech_Constructoid_Wounded + Pawn_Mech_Constructoid_Death + Pawn_Mech_Constructoid_Call +
  • +
    + 8 +
    + +
  • + + +
  • Blunt
  • + + 10 + 2.9 + Torso + true + +
    +
    + + + MB_Artifice_Constructoid + + MB_Artifice_Constructoid + +
  • + + Things/Pawn/Artifice/Constructoid + 1.1 + +
  • +
    +
    + + + + MB_Artifice_Agrihand + + A small mechanoid designed to sow and harvest crops. While it is better suited to labor than combat, it can fight with built-in cutting blades if necessary. + +
  • + + blade + +
  • Cut
  • +
  • Stab
  • + + 8 + 2 + RightBlade + true + +
    + + 0.80 + + + Mech_Agrihand + +
  • PlantCutting
  • +
  • Growing
  • +
    + + 2 + + +
  • + MechanoidFullyFormed + 0 + Pawn_Mech_Agrihand_Wounded + Pawn_Mech_Agrihand_Death + Pawn_Mech_Agrihand_Call +
  • +
    + 8 +
    +
    + + + MB_Artifice_Agrihand + + MB_Artifice_Agrihand + +
  • + + Things/Pawn/Artifice/Agrihand + 1.1 + +
  • +
    +
    + + + + MB_Artifice_Cleansweeper + + A light mechanoid designed for cleaning. Lacking a ranged weapon, it can make only weak melee attacks. + + 0.5 + + + +
  • Cleaning
  • +
    + +
  • + MechanoidFullyFormed + 0 + Pawn_Mech_Cleansweeper_Wounded + Pawn_Mech_Cleansweeper_Death + Pawn_Mech_Cleansweeper_Call +
  • +
    + 0.3 + 8 +
    +
    + + + MB_Artifice_Cleansweeper + + MB_Artifice_Cleansweeper + +
  • + + Things/Pawn/Artifice/Cleansweeper + 1.1 + +
  • +
    +
    + + + + MB_Artifice_Paramedic + + A small mechanoid designed for non-violent emergency situation management and medical care. The paramedic can rescue the wounded, fight fires, treat the sick, and even perform surgery when a more-qualified human is not available. Its built-in jump launcher allows it to jump into, and out of, emergency situations, and its built-in firefoam popper can quickly extinguish fires. + + 3.8 + + + +
  • Doctor
  • +
  • Firefighter
  • +
    + +
  • + MechanoidFullyFormed + 0 + Pawn_Mech_Paramedic_Wounded + Pawn_Mech_Paramedic_Death + Pawn_Mech_Paramedic_Call +
  • +
    + 8 +
    +
    + + + MB_Artifice_Paramedic + + MB_Artifice_Paramedic + false + +
  • + + Things/Pawn/Artifice/Paramedic + 1.25 + + (0.3, 0.4, 0.3) + (0,0,-0.25) + + +
  • +
    + +
  • FirefoampopMech
  • +
  • LongjumpMechLauncher
  • +
    +
    + + + + MB_Artifice_Militor + + A small combat mechanoid armed with a low-power mini-shotgun. Roughly four feet tall, militors lack the power, range, and toughness of more senior combat mechs. However, it is cheap to gestate and maintain, and so is often used as a rear guard or swarm attacker.\n\nIn war, mech armies are known to send militors into urban ruins to hunt down survivors after breaking the human defenses. For this reason, they are considered by some to be the most cruel of all mechanoid patterns. + + 3.8 + + + +
  • + MechanoidFullyFormed + 0 + Pawn_Mech_Militor_Wounded + Pawn_Mech_Militor_Death + Pawn_Mech_Militor_Call +
  • +
    +
    +
    + + + MB_Artifice_Militor + + MB_Artifice_Militor + 45 + +
  • + + Things/Pawn/Artifice/Militor + CutoutWithOverlay + Graphic_Multi + 1.25 + + (0.3, 0.4, 0.3) + (0,0,-0.25) + + +
  • +
    + +
  • MB_ArtificeCrossbow
  • +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/ThingDefs_Races/Races_Artifice_Medium.xml b/1.5/Defs/ThingDefs_Races/Races_Artifice_Medium.xml new file mode 100644 index 0000000..4d5be8f --- /dev/null +++ b/1.5/Defs/ThingDefs_Races/Races_Artifice_Medium.xml @@ -0,0 +1,204 @@ + + + + + + + 4.7 + 0.20 + 0.40 + + + ToolUser + Mechanoid + 1.0 + +
  • + MechanoidFullyFormed + 0 + Pawn_Mech_Scyther_Wounded + Pawn_Mech_Scyther_Death + Pawn_Mech_Scyther_Call +
  • +
  • + MechanoidFullyFormed + 100 + Pawn_Mech_Scyther_Wounded + Pawn_Mech_Scyther_Death + Pawn_Mech_Scyther_Call +
  • +
    +
    + + 15 + + +
  • + true +
  • +
    +
    + + + + MB_Artifice_Scyther + + Fast, spindly, human-sized combat mechanoids specializing in rapid approach and close-range combat. Their bodies are covered in points and blades, but they mostly use their two arm blades to lop off limbs or gut their victims alive. + +
  • + + +
  • Blunt
  • + + 9 + 2 + HeadAttackTool + true + 0.2 + +
    + + Scyther + 1.32 + Pawn_Melee_MechanoidSlash_HitPawn + Pawn_Melee_MechanoidSlash_HitBuilding + Pawn_Melee_MechanoidSlash_Miss + +
  • + ChunkMechanoidSlag + 18 + 0.1 +
  • +
  • + ChunkMechanoidSlag + 15 + 0.1 +
  • +
    +
    + + 2 + +
    + + + MB_Artifice_Scyther + + MB_Artifice_Scyther + 150 + +
  • + + Things/Pawn/Artifice/Scyther + + CutoutWithOverlay + Graphic_Multi + 1.5 + + (0.4, 0.8, 0.4) + + +
  • +
  • + + Things/Pawn/Artifice/Scyther + + CutoutWithOverlay + Graphic_Multi + 1.5 + + (0.4, 0.8, 0.4) + + +
  • +
    + 9999~9999 + +
  • MB_ArtificeBlade
  • +
    + 1 + 9999~9999 +
    + + + + MB_Artifice_Sentinel + + Fast, spindly, human-sized combat mechanoids specializing in rapid approach and close-range combat. Their bodies are covered in points and blades, but they mostly use their two arm blades to lop off limbs or gut their victims alive. + +
  • + + +
  • Blunt
  • + + 9 + 2 + HeadAttackTool + true + 0.2 + +
    + + Scyther + 1.50 + Pawn_Melee_MechanoidSlash_HitPawn + Pawn_Melee_MechanoidSlash_HitBuilding + Pawn_Melee_MechanoidSlash_Miss + +
  • + ChunkMechanoidSlag + 18 + 0.1 +
  • +
  • + ChunkMechanoidSlag + 15 + 0.1 +
  • +
    +
    + + 2 + +
    + + + MB_Artifice_Sentinel + + MB_Artifice_Sentinel + 150 + +
  • + + Things/Pawn/Artifice/Sentinel + + CutoutWithOverlay + Graphic_Multi + 2 + + (0.4, 0.8, 0.4) + + +
  • +
  • + + Things/Pawn/Artifice/Sentinel + + CutoutWithOverlay + Graphic_Multi + 2 + + (0.4, 0.8, 0.4) + + +
  • +
    + 9999~9999 + +
  • MB_ArtificeAxeblade
  • +
    + 1 + 9999~9999 +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/ThingDefs_Races/Races_Sanguophage_Summons.xml b/1.5/Defs/ThingDefs_Races/Races_Sanguophage_Summons.xml new file mode 100644 index 0000000..d7311aa --- /dev/null +++ b/1.5/Defs/ThingDefs_Races/Races_Sanguophage_Summons.xml @@ -0,0 +1,144 @@ + + + + + + 800 + 3.4 + 0.10 + 0.20 + 0.66 + + 1 + -55 + 45 + + + MB_Ghoul + MB_SanguinophageFleshType + ToolUser + Mechanoid + 0.7 + Pawn_Melee_Punch_HitPawn + Pawn_Melee_Punch_HitBuilding_Stone + Pawn_Melee_Punch_Miss + Light + + + + 10 + + +
  • + + +
  • Blunt
  • + + 6 + 2.6 + HeadAttackTool + true + +
    + BulletImpact_Flesh +
    + + + Mechanoid + 9999~9999 + 10 + + 1 + 9999~9999 + 1.8 + + + + + + MB_Sang_Ghoul + + PLACEHOLDER + + 1750 + 4.8 + + + +
  • + MechanoidFullyFormed + 0 + Pawn_Mech_Militor_Wounded + Pawn_Mech_Militor_Death + Pawn_Mech_Militor_Call +
  • +
    +
    + +
  • + + +
  • Cut
  • +
  • Stab
  • + + 12 + 2 + MB_LeftGhoulHand + true + +
  • + + +
  • Cut
  • +
  • Stab
  • + + 12 + 2 + MB_RightGhoulHand + true + +
  • + + +
  • Bite
  • + + 9 + 2 + Teeth + Pawn_Melee_HumanBite_Hit + Pawn_Melee_HumanBite_Miss + 0.9 + + +
  • + Stun + 14 +
  • +
    +
    + +
    +
    + + + MB_Sang_Ghoul + + MB_Sang_Ghoul + 45 + +
  • + + Things/Pawn/SanguophageSummon/SangGhoul/SangGhoul + CutoutWithOverlay + Graphic_Multi + 1.62 + + (0.3, 0.4, 0.3) + (0,0,-0.25) + + +
  • +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/ThingDefs_Races/Races_Undead_Summons.xml b/1.5/Defs/ThingDefs_Races/Races_Undead_Summons.xml new file mode 100644 index 0000000..96b2748 --- /dev/null +++ b/1.5/Defs/ThingDefs_Races/Races_Undead_Summons.xml @@ -0,0 +1,169 @@ + + + + + + 800 + 3.4 + 0.10 + 0.20 + 0.66 + 1 + -105 + 45 + + + MB_Body_Restless + 1.5 + MB_UndeadFleshType + ToolUser + Mechanoid + 1 + Pawn_Melee_Punch_HitPawn + Pawn_Melee_Punch_HitBuilding_Stone + Pawn_Melee_Punch_Miss + Light + + BulletImpact_Flesh + + + 10 + + +
  • + + +
  • Blunt
  • + + 6 + 2.6 + HeadAttackTool + true + +
    +
    + + + + + 800 + 4.6 + 0.10 + 0.20 + 0.66 + + 0 + -105 + 100 + + + MB_Body_Skeleton + 1 + MB_SkeletonFleshType + + + BulletImpact_Wood + + + + 10 + + + + Mechanoid + 9999~9999 + 10 + + 1 + 9999~9999 + 1.8 + + + + + + MB_Undead_Restless + + PLACEHOLDER + + 800 + 4.0 + + + +
  • + MechanoidFullyFormed + 0 + Pawn_Mech_Militor_Wounded + Pawn_Mech_Militor_Death + Pawn_Mech_Militor_Call +
  • +
    +
    +
    + + + MB_Undead_Restless + + MB_Undead_Restless + 45 + +
  • + + Things/Pawn/UndeadSummon/UndeadRestless/UndeadRestless + CutoutWithOverlay + Graphic_Multi + 1.50 + + (0.3, 0.4, 0.3) + (0,0,-0.25) + + +
  • +
    +
    + + + + MB_Undead_Skeleton + + PLACEHOLDER + + 1750 + 4.6 + + + +
  • + MechanoidFullyFormed + 0 + Pawn_Mech_Militor_Wounded + Pawn_Mech_Militor_Death + Pawn_Mech_Militor_Call +
  • +
    +
    +
    + + + MB_Undead_Skeleton + + MB_Undead_Skeleton + 45 + +
  • + + Things/Pawn/UndeadSummon/UndeadSkeleton/UndeadSkeleton + CutoutWithOverlay + Graphic_Multi + 1.50 + + (0.3, 0.4, 0.3) + (0,0,-0.25) + + +
  • +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/ThoughtDefs/Thoughts_Memory_Special.xml b/1.5/Defs/ThoughtDefs/Thoughts_Memory_Special.xml new file mode 100644 index 0000000..a44227d --- /dev/null +++ b/1.5/Defs/ThoughtDefs/Thoughts_Memory_Special.xml @@ -0,0 +1,42 @@ + + + + + MB_AbosorbedCorruptedSoulGem + Thought_Memory + 5 + 5 + + +
  • + + I abosrbed a corrupted soul gem. It felt exhilerating and rejuvenated my soul. + 5 +
  • +
    +
    + + + MB_SoulEnergyCraving + ThoughtWorker_Hediff + MB_SoulCraving + +
  • + + I feel an intense yearning for soul essence. + -10 +
  • +
  • + + I find myself irresistibly drawn to the life force of others, my desperation driving me to increasingly risky behavior in pursuit of satisfaction. + -15 +
  • +
  • + + I'm consumed by an insatiable hunger, my essence withering in its absence. + -20 +
  • +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/WorkGiverDef/WorkGivers.xml b/1.5/Defs/WorkGiverDef/WorkGivers.xml new file mode 100644 index 0000000..e5420b8 --- /dev/null +++ b/1.5/Defs/WorkGiverDef/WorkGivers.xml @@ -0,0 +1,48 @@ + + + + + MB_DoBillsMechGestator + + MedievalBiotech.WorkGiver_DoArtifice + Smithing + 210 + +
  • MB_ArtificeGestator
  • +
    + work at + working at + +
  • Manipulation
  • +
    + true +
    + + + DeliverSoulgemToPrisoner + + MedievalBiotech.WorkGiver_Warden_DeliverSoulGem + Warden + deliver soulgem for + delivering soulgem for + 72 + +
  • Manipulation
  • +
    +
    + + + FeedSoulgem + + MedievalBiotech.Workgiver_AdministerSoul + Doctor + administer soulgem to + administering soulgem to + 65 + +
  • Manipulation
  • +
    + true +
    + +
    \ No newline at end of file diff --git a/1.5/Patches/Add_SoulGem_ThinkTree.xml b/1.5/Patches/Add_SoulGem_ThinkTree.xml new file mode 100644 index 0000000..0fab62a --- /dev/null +++ b/1.5/Patches/Add_SoulGem_ThinkTree.xml @@ -0,0 +1,13 @@ + + + + + /Defs/ThinkTreeDef[defName="MainColonistBehaviorCore"]/thinkRoot/subNodes/li/subNodes/li[@Class="JobGiver_GetHemogen"] + Append + +
  • + + + + + \ No newline at end of file diff --git a/1.5/Patches/Biotech.xml b/1.5/Patches/Biotech.xml new file mode 100644 index 0000000..d35ae98 --- /dev/null +++ b/1.5/Patches/Biotech.xml @@ -0,0 +1,66 @@ + + + + + + +
  • + Defs/ThingDef[defName = "Genepack"] + + +
  • + +
    + +
  • + /Defs/ThingDef[defName = "Genepack"] + + + NeverForNutrition + 1 + 8 + Processed + 720 + true + Ingest_Pill + EatVegetarian + EatVegetarian + + + (0.27,0,0.08) + true + + + (0.45,0,0.08) + + + (0.27,0,0.08) + + + (-0.50,0,0.08) + true + + + false + Consume {0} + Consumes {0}. + Consuming {0}. + false + + +
  • +
  • + /Defs/ThingDef[defName = "Genepack"] + + +
  • Drugs
  • + + + +
  • + Defs/ThingDef[defName = "Genepack"]/statBases/DeteriorationRate +
  • + +
    + +
    \ No newline at end of file diff --git a/1.5/Patches/Buildings_Deathrest.xml b/1.5/Patches/Buildings_Deathrest.xml new file mode 100644 index 0000000..570237d --- /dev/null +++ b/1.5/Patches/Buildings_Deathrest.xml @@ -0,0 +1,420 @@ + + + + + Defs/ThingDef[defName="DeathrestCasket" or + defName="Hemopump" or + defName="HemogenAmplifier" or + defName="GlucosoidPump" or + defName="PsychofluidPump" or + defName="DeathrestAccelerator"]/comps/li[@Class = "CompProperties_Power"] + + + + Defs/ThingDef[defName="DeathrestCasket" or + defName="Hemopump" or + defName="HemogenAmplifier" or + defName="GlucosoidPump" or + defName="PsychofluidPump" or + defName="DeathrestAccelerator"]/comps/li[@Class = "CompProperties_Flickable"] + + + + Defs/ThingDef[@Name="DeathrestBuildingHemogenFueled"]/comps/li[@Class = "CompProperties_Power"] + + + + Defs/ThingDef[@Name="DeathrestBuildingHemogenFueled"]/comps/li[@Class = "CompProperties_Flickable"] + + + + + Defs/ThingDef[ + defName="DeathrestCasket" or + defName="Hemopump" or + defName="HemogenAmplifier" or + defName="GlucosoidPump" or + defName="PsychofluidPump" or + defName="DeathrestAccelerator"]/techLevel + + + Defs/ThingDef[ + defName="DeathrestCasket" or + defName="Hemopump" or + defName="HemogenAmplifier" or + defName="GlucosoidPump" or + defName="PsychofluidPump" or + defName="DeathrestAccelerator"]/techLevel + + + Medieval + + + + Defs/ThingDef[ + defName="DeathrestCasket" or + defName="Hemopump" or + defName="HemogenAmplifier" or + defName="GlucosoidPump" or + defName="PsychofluidPump" or + defName="DeathrestAccelerator" or + defName="DeathrestCasket"] + + + Medieval + + + + + + + Defs/ThingDef[defName="DeathrestCasket"]/graphicData + + CutoutComplex + + + + + Defs/ThingDef[defName="DeathrestCasket"]/costList + + + 3 + + + + + + Defs/ThingDef[defName="DeathrestCasket"] + + 100 + +
  • DankPyon_RawWood
  • +
  • Woody
  • +
    +
    +
    + + + + Defs/ThingDef[defName="DeathrestAccelerator"]/graphicData/drawSize + + (2, 2) + + + + + Defs/ThingDef[defName="DeathrestAccelerator"]/graphicData + + CutoutComplex + + + + + Defs/ThingDef[defName="DeathrestAccelerator"]/label + + + + + + + Defs/ThingDef[defName="DeathrestAccelerator"] + + 100 + +
  • DankPyon_RawWood
  • +
  • Woody
  • +
  • Metallic
  • +
  • Stony
  • +
    +
    +
    + + + + Defs/ThingDef[defName="Hemopump" or defName="PsychofluidPump"]/graphicData/drawSize + + (4,4) + + + + + Defs/ThingDef[defName="Hemopump"]/graphicData/texPath + + Things/Building/Misc/AltarPrince/AltarPrince + + + + + Defs/ThingDef[defName="Hemopump" or defName="PsychofluidPump"]/defaultPlacingRot + + South + + + + + Defs/ThingDef[defName="Hemopump" or defName="PsychofluidPump"]/graphicData + + CutoutComplex + + + + + Defs/ThingDef[defName="Hemopump" or defName="PsychofluidPump"]/size + + (1,1) + + + + + Defs/ThingDef[defName="Hemopump"]/label + + + + + + + Defs/ThingDef[defName="PsychofluidPump"]/label + + + + + + + Defs/ThingDef[defName="Hemopump" or defName="PsychofluidPump"] + + 0.5 + + + + + Defs/ThingDef[defName="Hemopump" or defName="PsychofluidPump"] + + 100 + +
  • DankPyon_RawWood
  • +
  • Woody
  • +
  • Metallic
  • +
  • Stony
  • +
    +
    +
    + + + Defs/ThingDef[defName="Hemopump" or defName="PsychofluidPump"]/costList + + + 25 + 5 + + + + + + Defs/ThingDef[defName="Hemopump" or defName="PsychofluidPump"]/statBases/WorkToBuild + + 30000 + + + + + Defs/ThingDef[defName="Hemopump" or defName="PsychofluidPump"]/statBases + + 100 + + + + + + Defs/ThingDef[defName="GlucosoidPump"]/graphicData + + + Things/Building/Misc/GlucosoidPump/GlucosoidPump + Graphic_Single + (3, 3) + + (0.3,0.2,0.7,1.8) + + + + + + + Defs/ThingDef[defName="GlucosoidPump"] + + FloorEmplacement + + + + + Defs/ThingDef[defName="GlucosoidPump"]/statBases + + + 200 + 4000 + 2 + 0 + + + + + + Defs/ThingDef[defName="GlucosoidPump"] + + + false + + + + + + Defs/ThingDef[defName="GlucosoidPump"]/costList + + + 10 + + + + + + Defs/ThingDef[defName="GlucosoidPump"]/label + + + + + + + Defs/ThingDef[defName="GlucosoidPump"] + + 0.8 + + + + + Defs/ThingDef[defName="GlucosoidPump"]/defaultPlacingRot + + North + + + + + + + + Defs/ThingDef[defName="HemogenAmplifier"]/defaultPlacingRot + + North + + + + + Defs/ThingDef[defName="HemogenAmplifier"] + + 0.5 + + + + + Defs/ThingDef[defName="HemogenAmplifier"]/label + + + + + + + Defs/ThingDef[defName="HemogenAmplifier"] + + false + + + + + Defs/ThingDef[defName="HemogenAmplifier"]/graphicData + + + Things/Building/Misc/HemogenAmplifier/HemogenAmplifier + Graphic_Single + (2,2) + + + + + + Defs/ThingDef[defName="HemogenAmplifier"]/statBases + + + 100 + 5000 + 5 + 0.4 + + + + + + Defs/ThingDef[defName="HemogenAmplifier"]/size + + (1,1) + + + + + Defs/ThingDef[defName="HemogenAmplifier"]/costList + + + 50 + 5 + + + + + + Defs/ThingDef[defName="HemogenAmplifier"] + + BuildingOnTop + + + + + Defs/ThingDef[defName="HemogenAmplifier"]/comps + +
  • + 10 + (460, 220, 205, 0) +
  • +
  • + 0.75 + (0,0,0.50) +
  • +
  • + CompHeatPusherPowered + 3.5 + 23 +
  • +
  • + MeditationFocusStrength +
  • Flame
  • + +
  • + 0.1 +
  • +
  • + +
  • Campfire
  • +
  • TorchLamp
  • +
  • DankPyon_Candles
  • +
  • DankPyon_CandleStand
  • +
  • Brazier
  • +
  • Darktorch
  • +
  • DarktorchFungus
  • + + 0.01 + 9.9 + 8 + MeditationFocusPerFlame + MeditationFocusPerFlameAbstract + +
    + +
    +
    +
    \ No newline at end of file diff --git a/1.5/Patches/Buildings_Misc.xml b/1.5/Patches/Buildings_Misc.xml new file mode 100644 index 0000000..091f136 --- /dev/null +++ b/1.5/Patches/Buildings_Misc.xml @@ -0,0 +1,263 @@ + + + + + + Defs/ThingDef[defName="GeneExtractor" or + defName="GeneBank" or + defName="GeneAssembler" or + defName="GeneProcessor"]/comps/li[@Class = "CompProperties_Power"] + + + + Defs/ThingDef[defName="GeneExtractor" or + defName="GeneBank" or + defName="GeneAssembler" or + defName="GeneProcessor"]/comps/li[@Class = "CompProperties_Flickable"] + + + + + Defs/ThingDef[defName="GeneExtractor"]/graphicData + + CutoutComplex + + + + + Defs/ThingDef[defName="GeneExtractor"]/label + + + + + + + Defs/ThingDef[defName="GeneExtractor"]/description + + A crude surgical table designated for pawns to extract a person's genes and create a gene potions from them. The extracted genes will be randomly selected from the person's xenogenes and germline genes. You can force someone into the machine, but they won't like it.\n\nExtracting a person's genes while their genes are currently regrowing will kill them. Otherwise, gene extraction causes no lasting harm.\n\nGenes that require archite capsules are too complex to be extracted. + + + + + Defs/ThingDef[defName="GeneExtractor"]/costList + + + 15 + + + + + + Defs/ThingDef[defName="GeneExtractor"] + + 100 + +
  • DankPyon_RawWood
  • +
  • Woody
  • +
  • Metallic
  • +
  • Stony
  • +
    +
    +
    + + + + + Defs/ThingDef[defName="GeneBank"]/costList + + + 5 + + + + + + Defs/ThingDef[defName="GeneBank"]/description + + This building can store gene potions and make them usable to create new xenogerms, when placed near a gene assembler. Large gene libraries require many gene potion banks.\n\nWhen filled with insect jelly, gene banks prevent genepacks from deteriorating and will slowly repair deterioration. + + + + + Defs/ThingDef[defName="GeneBank"]/graphicData/drawSize + + (2, 2) + + + + + Defs/ThingDef[defName="GeneBank"] + + 50 + +
  • DankPyon_RawWood
  • +
  • Woody
  • +
  • Metallic
  • +
  • Stony
  • +
    +
    +
    + + + Defs/ThingDef[defName="GeneBank"]/tickerType + + Normal + + + + + Defs/ThingDef[defName="GeneBank"]/comps + +
  • + 0.5 + 5 + + +
  • InsectJelly
  • + + + 0 + true + +
    +
    + + + + Defs/ThingDef[defName="GeneAssembler"]/graphicData/drawSize + + (5, 4) + + + + + Defs/ThingDef[defName="GeneAssembler"]/graphicData + + CutoutComplex + + + + + Defs/ThingDef[defName="GeneAssembler"]/label + + + + + + + Defs/ThingDef[defName="GeneAssembler"] + + 200 + +
  • Metallic
  • +
  • Stony
  • +
    +
    +
    + + + Defs/EffecterDef[defName="GeneAssembler_Working"]/children + + +
  • + SubEffecter_SprayerContinuous + 0.3~0.7 + 20 + 0.6 + 0.6 + Mote_CookBit +
  • +
    +
    +
    + + + Defs/ThingDef[defName="GeneAssembler"]/costList + + + 10 + + + + + + + Defs/ThingDef[defName="GeneProcessor"]/graphicData/drawSize + + (4, 4) + + + + + Defs/ThingDef[defName="GeneProcessor"]/graphicData + + CutoutComplex + + + + + Defs/ThingDef[defName="GeneProcessor"]/label + + + + + + + Defs/ThingDef[defName="GeneProcessor"]/costList + + + 10 + + + + + + Defs/ThingDef[defName="GeneProcessor"] + + 200 + +
  • Metallic
  • +
  • Stony
  • +
    +
    +
    + + + Defs/ThingDef[defName="GeneProcessor"] + + Normal + + + + + Defs/ThingDef[defName="GeneProcessor"]/comps + +
  • + 0.5 + 10 + + +
  • WoodLog
  • + + + 0 + true + +
    +
    + + + + Defs/RulePackDef[defName="NamerGenepack"]/rulePack + + + +
  • r_name->mutagen potion ([geneWord][otherGenesInfo])
  • + +
  • otherGenesInfo(geneCount==1)->
  • +
  • otherGenesInfo(geneCount>=2)-> +[geneCountMinusOne]
  • +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/1.5/Patches/Items_Food.xml b/1.5/Patches/Items_Food.xml new file mode 100644 index 0000000..2e7e477 --- /dev/null +++ b/1.5/Patches/Items_Food.xml @@ -0,0 +1,17 @@ + + + + + Defs/ThingDef[defName="HemogenPack"]/label + + + + + + + Defs/ThingDef[defName="HemogenPack"]/description + + A potion of refined hemogen in a glass container to prevent spoilage. Hemogenic humans can consume it to restore their internal hemogen stores. It can be administered during an operation to reverse blood loss. + + + \ No newline at end of file diff --git a/1.5/Patches/Items_Resource_Manufactured.xml b/1.5/Patches/Items_Resource_Manufactured.xml new file mode 100644 index 0000000..1a17034 --- /dev/null +++ b/1.5/Patches/Items_Resource_Manufactured.xml @@ -0,0 +1,11 @@ + + + + + Defs/ThingDef[defName="DeathrestCapacitySerum"]/label + + + + + + \ No newline at end of file diff --git a/1.5/Patches/Recipe_Surgery_Misc.xml b/1.5/Patches/Recipe_Surgery_Misc.xml new file mode 100644 index 0000000..034983f --- /dev/null +++ b/1.5/Patches/Recipe_Surgery_Misc.xml @@ -0,0 +1,28 @@ + + + + + Defs/RecipeDef[defName="ExtractHemogenPack"] + + + ExtractHemogenPack + + Extract a potion of blood from the target. The operation will fail to produce a potion of blood if the target does not have enough blood.\n\Potion of blood packs can be administered to others to reduce blood loss or to satiate those who feed on blood. + Recipe_ExtractHemogen + Extracting potion of blood. + 500 + true + false + true + + HemogenPack + + HemogenPack + false + 2 + + + + + + \ No newline at end of file diff --git a/About/About.xml b/About/About.xml index 0b49baa..c368f50 100644 --- a/About/About.xml +++ b/About/About.xml @@ -3,13 +3,14 @@ Medieval Biotech SirLalaPyon -
  • 1.4
  • +
  • 1.5
  • DankPyon.MedievalBiotech Danke mod, medieval biotech. +
  • ludeon.rimworld.biotech
  • brrainz.harmony
  • OskarPotocki.VanillaFactionsExpanded.Core
  • LWM.DeepStorage
  • @@ -17,6 +18,10 @@
  • OskarPotocki.VanillaExpanded.RoyaltyPatches
  • +
  • + ludeon.rimworld.biotech + Biotech +
  • DankPyon.Medieval.Overhaul Medieval Overhaul diff --git a/About/PublishedFileId.txt b/About/PublishedFileId.txt deleted file mode 100644 index e5c044b..0000000 --- a/About/PublishedFileId.txt +++ /dev/null @@ -1 +0,0 @@ -2914889498 \ No newline at end of file diff --git a/Languages/English/Keyed/Alert.xml b/Languages/English/Keyed/Alert.xml new file mode 100644 index 0000000..5726ab7 --- /dev/null +++ b/Languages/English/Keyed/Alert.xml @@ -0,0 +1,8 @@ + + + + + Low dark arcana + A colonist has low dark arcana. At zero dark arcana, they will develop a painful craving.\n\nFeed them corrupted soul gems to prevent this. \n\nThe following colonists have low dark arcana + + \ No newline at end of file diff --git a/Languages/English/Keyed/Dialog.xml b/Languages/English/Keyed/Dialog.xml new file mode 100644 index 0000000..aa8d094 --- /dev/null +++ b/Languages/English/Keyed/Dialog.xml @@ -0,0 +1,8 @@ + + + + + A {SUMMONER} must be capable of smithing to create constructs.\n\nAre you sure you want to continue? + A {SUMMONER} must be capable of intellectual tasks to unlock {SUMMONER} research.\n\nAre you sure you want to continue? + + \ No newline at end of file diff --git a/Languages/English/Keyed/FloatMenu.xml b/Languages/English/Keyed/FloatMenu.xml new file mode 100644 index 0000000..dd7e018 --- /dev/null +++ b/Languages/English/Keyed/FloatMenu.xml @@ -0,0 +1,7 @@ + + + + + Soulgems disabled by food restriction. + + \ No newline at end of file diff --git a/Languages/English/Keyed/Letters.xml b/Languages/English/Keyed/Letters.xml new file mode 100644 index 0000000..0f73d0f --- /dev/null +++ b/Languages/English/Keyed/Letters.xml @@ -0,0 +1,11 @@ + + + + + Read the Necronomicon + {PAWN_labelShort} has read from the Necronomicon! Now a necrarch, {PAWN_pronoun} wields mastery over the undead, poised to raise and command them. + + Drank from Blood Chalice + {PAWN_labelShort} has drank from a Blood Chalice! Now a sanguinmage, {PAWN_pronoun} wields mastery over creatures of the night, poised to create and command them. + + \ No newline at end of file diff --git a/Languages/English/Keyed/Misc_Gameplay.xml b/Languages/English/Keyed/Misc_Gameplay.xml index 4830586..a178465 100644 --- a/Languages/English/Keyed/Misc_Gameplay.xml +++ b/Languages/English/Keyed/Misc_Gameplay.xml @@ -5,12 +5,32 @@ Gene bank needs fuel A gene potion bank does not have fuel, so the genepacks inside it are slowly deteriorating. Add insect jelly to the gene potion bank to prevent gene potions from deteriorating -Once the gene potion bank is fueled. it will slowly reverse the deterioration of the gene potions inside it. +Once the gene potion bank is fueled. it will slowly reverse the deterioration of the gene potions inside it. {0} (Inactive) Toggle steam flow Designate steam flow to be toggle on or off. A colonist will come soon to flick the switch. A small infinite steam deposit has been found! steam gas deposit + + + Missing required gene + + + + This determines whether {PAWN_nameDef} will automatically ingest soul gems when {PAWN_possessive} dark arcana is below {MIN}.\n\nAutomatic ingestion is currently {ONOFF}. + Consume soul gems below + Never consume soul gems. + + + Arcana cost + {0_labelShort} is not soul starved. + {0_labelShort} does not have enough dark arcana. + + + Not connected to network. + + + Currently charginging {0}. \ No newline at end of file diff --git a/LoadFolders.xml b/LoadFolders.xml index e72628f..1843ae1 100644 --- a/LoadFolders.xml +++ b/LoadFolders.xml @@ -1,8 +1,15 @@ - -
  • /
  • -
  • v1.4
  • -
  • Shared
  • - + + +
  • /
  • +
  • 1.4
  • +
  • Shared
  • +
    + +
  • /
  • +
  • 1.5
  • +
  • Shared
  • +
    + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..a45faec --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# Medieval Overhaul Biotech +Working Repository for updating Medieval Overhaul Biotech + +## Easier access to download below: + +[Download](https://github.com/ViralReaction/MedievalBiotech/archive/refs/heads/master.zip) + +## Install Instructions + +Unzip the mod and place it within your RimWorld/Mods folder. + +For Windows users it is usually - C:\Program Files (x86)\Steam\steamapps\common\RimWorld + +## Depedencies +[Medieval Overhaul](https://github.com/ViralReaction/MedievalOverhaul) diff --git a/Source/.vs/MedievalBiotech/FileContentIndex/6a5b2c22-eb1a-4960-8175-3e4be1342ca8.vsidx b/Source/.vs/MedievalBiotech/FileContentIndex/6a5b2c22-eb1a-4960-8175-3e4be1342ca8.vsidx deleted file mode 100644 index 19fe74d..0000000 Binary files a/Source/.vs/MedievalBiotech/FileContentIndex/6a5b2c22-eb1a-4960-8175-3e4be1342ca8.vsidx and /dev/null differ diff --git a/Source/.vs/MedievalBiotech/FileContentIndex/933404ed-045c-48ee-8551-7eb56f5b565d.vsidx b/Source/.vs/MedievalBiotech/FileContentIndex/933404ed-045c-48ee-8551-7eb56f5b565d.vsidx deleted file mode 100644 index 524b162..0000000 Binary files a/Source/.vs/MedievalBiotech/FileContentIndex/933404ed-045c-48ee-8551-7eb56f5b565d.vsidx and /dev/null differ diff --git a/Source/.vs/MedievalBiotech/FileContentIndex/bbdefe91-038e-4de8-a564-fdfab0cda39f.vsidx b/Source/.vs/MedievalBiotech/FileContentIndex/bbdefe91-038e-4de8-a564-fdfab0cda39f.vsidx deleted file mode 100644 index f00e7e8..0000000 Binary files a/Source/.vs/MedievalBiotech/FileContentIndex/bbdefe91-038e-4de8-a564-fdfab0cda39f.vsidx and /dev/null differ diff --git a/Source/.vs/MedievalBiotech/FileContentIndex/d19fc870-7fd9-435d-aa17-af0885781699.vsidx b/Source/.vs/MedievalBiotech/FileContentIndex/d19fc870-7fd9-435d-aa17-af0885781699.vsidx deleted file mode 100644 index fadab4f..0000000 Binary files a/Source/.vs/MedievalBiotech/FileContentIndex/d19fc870-7fd9-435d-aa17-af0885781699.vsidx and /dev/null differ diff --git a/Source/.vs/MedievalBiotech/FileContentIndex/read.lock b/Source/.vs/MedievalBiotech/FileContentIndex/read.lock deleted file mode 100644 index e69de29..0000000 diff --git a/Source/.vs/MedievalBiotech/v17/.suo b/Source/.vs/MedievalBiotech/v17/.suo index c2769d9..f3c4286 100644 Binary files a/Source/.vs/MedievalBiotech/v17/.suo and b/Source/.vs/MedievalBiotech/v17/.suo differ diff --git a/Source/Gene Stuff/Comps/CompProperties/CompProperties_ConsumableGenepack.cs b/Source/Gene Stuff/Comps/CompProperties/CompProperties_ConsumableGenepack.cs new file mode 100644 index 0000000..94ac58a --- /dev/null +++ b/Source/Gene Stuff/Comps/CompProperties/CompProperties_ConsumableGenepack.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using Verse; + +namespace MedievalBiotech +{ + public class CompProperties_ConsumableGenepack : CompProperties + { + public List genes = new List(); + public CompProperties_ConsumableGenepack() + { + compClass = typeof(ConsumableGenepack); + } + } +} diff --git a/Source/ConsumableGenepack.cs b/Source/Gene Stuff/Comps/ConsumableGenepack.cs similarity index 70% rename from Source/ConsumableGenepack.cs rename to Source/Gene Stuff/Comps/ConsumableGenepack.cs index b2893f1..d24af0b 100644 --- a/Source/ConsumableGenepack.cs +++ b/Source/Gene Stuff/Comps/ConsumableGenepack.cs @@ -4,7 +4,8 @@ namespace MedievalBiotech { - public class ConsumableGenepack : ThingComp { + public class ConsumableGenepack : ThingComp + { public CompProperties_ConsumableGenepack Props => (CompProperties_ConsumableGenepack)props; public override void PostIngested(Pawn ingester) { if (ingester.RaceProps.IsFlesh) { @@ -12,14 +13,14 @@ public override void PostIngested(Pawn ingester) { Genepack pack = parent as Genepack; if (pack != null) { foreach (GeneDef gene in pack.GeneSet.GenesListForReading) { - if (!ingester.genes.HasGene(gene)) { + if (!ingester.genes.HasActiveGene(gene)) { ingester.genes.AddGene(gene, true); } } } if (Props.genes.Any()) { foreach (GeneDef gene in Props.genes) { - if (!ingester.genes.HasGene(gene)) { + if (!ingester.genes.HasActiveGene(gene)) { ingester.genes.AddGene(gene, true); } } @@ -28,10 +29,5 @@ public override void PostIngested(Pawn ingester) { } } } - public class CompProperties_ConsumableGenepack : CompProperties { - public List genes = new List(); - public CompProperties_ConsumableGenepack() { - compClass = typeof(ConsumableGenepack); - } - } + } diff --git a/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_DoWork_Patch.cs b/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_DoWork_Patch.cs new file mode 100644 index 0000000..80e173d --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_DoWork_Patch.cs @@ -0,0 +1,69 @@ +using HarmonyLib; +using RimWorld; +using System.Collections.Generic; +using Verse; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(Building_GeneAssembler), "DoWork")] + public static class Building_GeneAssembler_DoWork_Patch + { + public static Dictionary sprayers = new Dictionary(); + public static void Prefix(Building_GeneAssembler __instance) + { + if (!sprayers.TryGetValue(__instance, out var sprayer)) + { + sprayers[__instance] = sprayer = new IntermittentSteamSprayer(__instance); + } + sprayer.SteamSprayerTick(); + } + } + + public class IntermittentSteamSprayer + { + private Thing parent; + + private int ticksUntilSpray = 500; + + private int sprayTicksLeft; + public IntermittentSteamSprayer(Thing parent) + { + this.parent = parent; + } + + public void SteamSprayerTick() + { + if (sprayTicksLeft > 0) + { + sprayTicksLeft--; + if (Rand.Value < 0.6f) + { + FleckMaker.ThrowAirPuffUp(parent.TrueCenter() + new UnityEngine.Vector3(0, 0, 1), parent.Map); + } + if (Find.TickManager.TicksGame % 20 == 0) + { + GenTemperature.PushHeat(parent, 40f); + } + if (sprayTicksLeft <= 0) + { + ticksUntilSpray = Rand.RangeInclusive(500, 2000); + } + return; + } + ticksUntilSpray--; + if (ticksUntilSpray <= 0) + { + sprayTicksLeft = Rand.RangeInclusive(200, 500); + } + } + } + + public class SteamSprayer : ThingComp + { + public IntermittentSteamSprayer steamSprayer; + public override void PostSpawnSetup(bool respawningAfterLoad) + { + base.PostSpawnSetup(respawningAfterLoad); + } + } +} diff --git a/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_Finish_Patch.cs b/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_Finish_Patch.cs new file mode 100644 index 0000000..109cbdc --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_Finish_Patch.cs @@ -0,0 +1,35 @@ +using HarmonyLib; +using RimWorld; +using Verse; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(Building_GeneAssembler), "Finish")] + public static class Building_GeneAssembler_Finish_Patch + { + public static void Prefix(Building_GeneAssembler __instance) + { + float currentComplexity = __instance.TotalGCX - 6; + if (currentComplexity <= 0) + { + return; // No need to process if complexity is already at or below the threshold + } + foreach (var facility in __instance.ConnectedFacilities) + { + if (facility.def == MB_DefOf.GeneProcessor) + { + currentComplexity -= facility.GetStatValue(StatDefOf.GeneticComplexityIncrease); + + Thing waste = ThingMaker.MakeThing(ThingDefOf.Wastepack); + waste.stackCount = 1; + GenSpawn.Spawn(waste, facility.Position, facility.Map); + + if (currentComplexity <= 0) + { + return; // Stop processing if we've reduced complexity sufficiently + } + } + } + } + } +} diff --git a/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_GetGenepacks_Patch.cs b/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_GetGenepacks_Patch.cs new file mode 100644 index 0000000..99647c8 --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_GetGenepacks_Patch.cs @@ -0,0 +1,54 @@ +using HarmonyLib; +using RimWorld; +using System.Collections.Generic; +using Verse; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(Building_GeneAssembler), "GetGenepacks")] + public static class Building_GeneAssembler_GetGenepacks_Patch + { + public static bool Prefix(Building_GeneAssembler __instance, ref List __result, bool includePowered, bool includeUnpowered) + { + __result = GetGenepacks(__instance, includePowered, includeUnpowered); + return false; + } + + public static List GetGenepacks(Building_GeneAssembler __instance, bool includePowered, bool includeUnpowered) + { + __instance.tmpGenepacks.Clear(); + List connectedFacilities = __instance.ConnectedFacilities; + foreach (Thing item in connectedFacilities) + { + CompGenepackContainer compGenepackContainer = item.TryGetComp(); + if (compGenepackContainer == null) + { + continue; + } + + bool fueled = item.TryGetComp()?.HasFuel ?? true; + if (includePowered && fueled) + { + if (compGenepackContainer?.ContainedGenepacks != null) + { + foreach (var genepack in compGenepackContainer.ContainedGenepacks) + { + if (genepack.deteriorationPct < 1f) + { + __instance.tmpGenepacks.Add(genepack); + } + } + } + + } + else if (includeUnpowered && !fueled) + { + __instance.tmpGenepacks.AddRange(compGenepackContainer.ContainedGenepacks); + + } + + } + return __instance.tmpGenepacks; + } + } +} diff --git a/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_MaxComplexity_Patch.cs b/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_MaxComplexity_Patch.cs new file mode 100644 index 0000000..2d8dd8d --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_MaxComplexity_Patch.cs @@ -0,0 +1,31 @@ +using HarmonyLib; +using RimWorld; +using System.Collections.Generic; +using Verse; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(Building_GeneAssembler), "MaxComplexity")] + public static class Building_GeneAssembler_MaxComplexity_Patch + { + public static bool Prefix(Building_GeneAssembler __instance, ref int __result) + { + __result = MaxComplexity(__instance); + return false; + } + + public static int MaxComplexity(Building_GeneAssembler __instance) + { + int num = 6; + foreach (Thing item in __instance.ConnectedFacilities) + { + CompRefuelable compRefuelable = item.TryGetComp(); + if (compRefuelable == null || compRefuelable.HasFuel) + { + num += (int)item.GetStatValue(StatDefOf.GeneticComplexityIncrease); + } + } + return num; + } + } +} diff --git a/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_PowerOn_Patch.cs b/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_PowerOn_Patch.cs new file mode 100644 index 0000000..e109d2f --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_PowerOn_Patch.cs @@ -0,0 +1,15 @@ +using HarmonyLib; +using RimWorld; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(Building_GeneAssembler), "PowerOn", MethodType.Getter)] + public static class Building_GeneAssembler_PowerOn_Patch + { + public static bool Prefix(ref bool __result) + { + __result = true; + return false; + } + } +} diff --git a/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_Tick_Patch.cs b/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_Tick_Patch.cs new file mode 100644 index 0000000..2a5f1fd --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/Building_GeneAssembler_Tick_Patch.cs @@ -0,0 +1,35 @@ +using HarmonyLib; +using RimWorld; +using System; +using System.Collections.Generic; +using Verse; +using System.Linq; + +namespace MedievalBiotech +{ + + [HarmonyPatch(typeof(Building_GeneAssembler), "Tick")] + public static class Building_GeneAssembler_Tick_Patch + { + public static IEnumerable Transpiler(IEnumerable codeInstructions) + { + var codes = codeInstructions.ToList(); + var isHashOffset = AccessTools.Method(typeof(Gen), nameof(Gen.IsHashIntervalTick), new Type[] { typeof(Thing), typeof(int) }); + for (var i = 0; i < codes.Count; i++) + { + var code = codes[i]; + if (code.Calls(isHashOffset) && codes[i - 1].OperandIs(250)) + { + code.operand = AccessTools.Method(typeof(Building_GeneAssembler_Tick_Patch), nameof(AlwaysFalse)); + } + yield return code; + } + } + + public static bool AlwaysFalse(Thing thing, int hash) + { + return false; + } + } + +} diff --git a/Source/Gene Stuff/HarmonyPatches/Building_GeneExtractor_CanAcceptPawn_Patch.cs b/Source/Gene Stuff/HarmonyPatches/Building_GeneExtractor_CanAcceptPawn_Patch.cs new file mode 100644 index 0000000..d9a9056 --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/Building_GeneExtractor_CanAcceptPawn_Patch.cs @@ -0,0 +1,49 @@ +using HarmonyLib; +using RimWorld; +using Verse; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(Building_GeneExtractor), "CanAcceptPawn")] + public static class Building_GeneExtractor_CanAcceptPawn_Patch + { + public static bool Prefix(Building_GeneExtractor __instance, ref AcceptanceReport __result, Pawn pawn) + { + __result = CanAcceptPawn(__instance, pawn); + return false; + } + + public static AcceptanceReport CanAcceptPawn(Building_GeneExtractor __instance, Pawn pawn) + { + if (!pawn.IsColonist && !pawn.IsSlaveOfColony && !pawn.IsPrisonerOfColony && (!pawn.IsColonyMutant || !pawn.IsGhoul)) + { + return false; + } + if (__instance.selectedPawn != null && __instance.selectedPawn != pawn) + { + return false; + } + if (!pawn.RaceProps.Humanlike || pawn.IsQuestLodger()) + { + return false; + } + if (__instance.innerContainer.Count > 0) + { + return "Occupied".Translate(); + } + if (!pawn.genes?.GenesListForReading.Any(x => x.def.passOnDirectly) ?? true) + { + return "PawnHasNoGenes".Translate(pawn.Named("PAWN")); + } + if (!pawn.genes.GenesListForReading.Any(x => x.def.biostatArc == 0)) + { + return "PawnHasNoNonArchiteGenes".Translate(pawn.Named("PAWN")); + } + if (pawn.health.hediffSet.HasHediff(HediffDefOf.XenogerminationComa)) + { + return "InXenogerminationComa".Translate(); + } + return true; + } + } +} diff --git a/Source/Gene Stuff/HarmonyPatches/Building_GeneExtractor_ContainedPawn_Patch.cs b/Source/Gene Stuff/HarmonyPatches/Building_GeneExtractor_ContainedPawn_Patch.cs new file mode 100644 index 0000000..8391fe1 --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/Building_GeneExtractor_ContainedPawn_Patch.cs @@ -0,0 +1,35 @@ +using HarmonyLib; +using RimWorld; +using Verse; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(Building_GeneExtractor), "ContainedPawn", MethodType.Getter)] + public static class Building_GeneExtractor_ContainedPawn_Patch + { + public static bool Prefix(Building_GeneExtractor __instance, ref Pawn __result) + { + Thing firstThing = null; + if (__instance.innerContainer != null) + { + foreach (var thing in __instance.innerContainer) + { + firstThing = thing; + break; + } + } + if (firstThing != null) + { + if (firstThing is Corpse corpse) + { + __result = corpse.InnerPawn; + } + else if (firstThing is Pawn pawn) + { + __result = pawn; + } + } + return false; + } + } +} diff --git a/Source/Gene Stuff/HarmonyPatches/Building_GeneExtractor_PowerOn_Patch.cs b/Source/Gene Stuff/HarmonyPatches/Building_GeneExtractor_PowerOn_Patch.cs new file mode 100644 index 0000000..02f1387 --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/Building_GeneExtractor_PowerOn_Patch.cs @@ -0,0 +1,15 @@ +using HarmonyLib; +using RimWorld; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(Building_GeneExtractor), "PowerOn", MethodType.Getter)] + public static class Building_GeneExtractor_PowerOn_Patch + { + public static bool Prefix(ref bool __result) + { + __result = true; + return false; + } + } +} diff --git a/Source/Gene Stuff/HarmonyPatches/Building_GeneExtractor_Tick_Patch.cs b/Source/Gene Stuff/HarmonyPatches/Building_GeneExtractor_Tick_Patch.cs new file mode 100644 index 0000000..ed0ea1c --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/Building_GeneExtractor_Tick_Patch.cs @@ -0,0 +1,50 @@ +using HarmonyLib; +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Emit; +using Verse; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(Building_GeneExtractor), "Tick")] + public static class Building_GeneExtractor_Tick_Patch + { + public static IEnumerable Transpiler(IEnumerable codeInstructions) + { + var codes = codeInstructions.ToList(); + var isHashOffset = AccessTools.Method(typeof(Gen), nameof(Gen.IsHashIntervalTick), new Type[] { typeof(Thing), typeof(int) }); + var powerOn = AccessTools.PropertyGetter(typeof(CompPowerTrader), nameof(CompPowerTrader.PowerOn)); + var powerCutField = AccessTools.Field(typeof(Building_GeneExtractor), "powerCutTicks"); + for (var i = 0; i < codes.Count; i++) + { + var code = codes[i]; + if (code.Calls(isHashOffset)) + { + code.operand = AccessTools.Method(typeof(Building_GeneExtractor_Tick_Patch), nameof(AlwaysFalse)); + } + if (code.Calls(powerOn)) + { + yield return new CodeInstruction(OpCodes.Ldarg_0); + code.operand = AccessTools.Method(typeof(Building_GeneExtractor_Tick_Patch), nameof(ShouldWork)); + } + if (code.opcode == OpCodes.Ldc_I4 && code.OperandIs(60000)) + { + code.operand = int.MaxValue; + } + yield return code; + } + } + + public static bool AlwaysFalse(Thing thing, int hash) + { + return false; + } + public static bool ShouldWork(CompPowerTrader trader, Building_GeneExtractor parent) + { + parent.powerCutTicks = 0; + return false; + } + } +} diff --git a/Source/Gene Stuff/HarmonyPatches/Building_GeneExtractor_TryAcceptPawn_Patch.cs b/Source/Gene Stuff/HarmonyPatches/Building_GeneExtractor_TryAcceptPawn_Patch.cs new file mode 100644 index 0000000..fed27dc --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/Building_GeneExtractor_TryAcceptPawn_Patch.cs @@ -0,0 +1,34 @@ +using HarmonyLib; +using RimWorld; +using Verse; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(Building_GeneExtractor), "TryAcceptPawn")] + public static class Building_GeneExtractor_TryAcceptPawn_Patch + { + public static bool Prefix(Building_GeneExtractor __instance, Pawn pawn) + { + TryAcceptPawn(__instance, pawn); + return false; + } + + public static void TryAcceptPawn(Building_GeneExtractor __instance, Pawn pawn) + { + if ((bool)__instance.CanAcceptPawn(pawn)) + { + __instance.selectedPawn = pawn; + bool num = pawn.Corpse != null ? pawn.Corpse.DeSpawnOrDeselect() : pawn.DeSpawnOrDeselect(); + if (__instance.innerContainer.TryAddOrTransfer(pawn.Corpse != null ? (Thing)pawn.Corpse : pawn)) + { + __instance.startTick = Find.TickManager.TicksGame; + __instance.ticksRemaining = 30000; + } + if (num) + { + Find.Selector.Select(pawn.Corpse != null ? (Thing)pawn.Corpse : pawn, playSound: false, forceDesignatorDeselect: false); + } + } + } + } +} diff --git a/Source/Gene Stuff/HarmonyPatches/CompGenepackContainer_CompTick_Patch.cs b/Source/Gene Stuff/HarmonyPatches/CompGenepackContainer_CompTick_Patch.cs new file mode 100644 index 0000000..0c7ca9e --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/CompGenepackContainer_CompTick_Patch.cs @@ -0,0 +1,19 @@ +using HarmonyLib; +using RimWorld; +using Verse; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(CompGenepackContainer), "CompTick")] + + public static class CompGenepackContainer_CompTick_Patch + { + public static void Postfix(CompGenepackContainer __instance) + { + if (__instance.parent.IsHashIntervalTick(250)) + { + __instance.innerContainer.ThingOwnerTickRare(); + } + } + } +} diff --git a/Source/Gene Stuff/HarmonyPatches/CompGenepackContainer_PowerOn_Patch.cs b/Source/Gene Stuff/HarmonyPatches/CompGenepackContainer_PowerOn_Patch.cs new file mode 100644 index 0000000..5a04e6b --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/CompGenepackContainer_PowerOn_Patch.cs @@ -0,0 +1,19 @@ +using HarmonyLib; +using RimWorld; +using Verse; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(CompGenepackContainer), "PowerOn", MethodType.Getter)] + public static class CompGenepackContainer_PowerOn_Patch + { + public static bool Prefix(ref bool __result, CompGenepackContainer __instance) + { + if (__instance.parent.def == ThingDefOf.GeneBank) + { + __result = __instance.parent.TryGetComp().HasFuel; + } + return false; + } + } +} diff --git a/Source/Gene Stuff/HarmonyPatches/FloatMenuMakerMap_AddHumanlikeOrders_Patch.cs b/Source/Gene Stuff/HarmonyPatches/FloatMenuMakerMap_AddHumanlikeOrders_Patch.cs new file mode 100644 index 0000000..c2807fd --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/FloatMenuMakerMap_AddHumanlikeOrders_Patch.cs @@ -0,0 +1,39 @@ +using HarmonyLib; +using RimWorld; +using System.Collections.Generic; +using UnityEngine; +using Verse.AI; +using Verse; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(FloatMenuMakerMap), "AddHumanlikeOrders")] + public static class FloatMenuMakerMap_AddHumanlikeOrders_Patch + { + public static void Postfix(Vector3 clickPos, Pawn pawn, ref List opts) + { + IntVec3 c = IntVec3.FromVector3(clickPos); + List thingList = c.GetThingList(pawn.Map); + for (int i = 0; i < thingList.Count; i++) + { + Thing t = thingList[i]; + if (t is Corpse corpse && corpse.GetRotStage() == RotStage.Fresh) + { + var geneExtractor = (Building_GeneExtractor)GenClosest.ClosestThingReachable(corpse.PositionHeld, corpse.MapHeld, + ThingRequest.ForDef(ThingDefOf.GeneExtractor), PathEndMode.InteractionCell, TraverseParms.For(pawn), 9999f, + (Thing x) => ((Building_GeneExtractor)x).CanAcceptPawn(corpse.InnerPawn) && pawn.CanReserve(x, 1, -1, null, true)); + if (geneExtractor is null || !pawn.CanReserveAndReach(corpse, PathEndMode.OnCell, Danger.Deadly, 1, -1, null, ignoreOtherReservations: true)) + { + continue; + } + opts.Add(new FloatMenuOption("MB.CarryCorpseToTable".Translate(corpse.InnerPawn.LabelShortCap), delegate + { + Job job = JobMaker.MakeJob(MB_DefOf.MB_CarryCorpseToTable, geneExtractor, corpse); + job.count = 1; + pawn.jobs.TryTakeOrderedJob(job, JobTag.Misc); + })); + } + } + } + } +} diff --git a/Source/Gene Stuff/HarmonyPatches/GeneExtractor_Patches.cs b/Source/Gene Stuff/HarmonyPatches/GeneExtractor_Patches.cs new file mode 100644 index 0000000..6a89ba6 --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/GeneExtractor_Patches.cs @@ -0,0 +1,70 @@ +using HarmonyLib; +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Emit; +using UnityEngine; +using Verse; +using Verse.AI; + +namespace MedievalBiotech +{ + + // Below needs to be fixed. Currently commented out until such time. + //[HarmonyPatch(typeof(Building_GeneExtractor), "DynamicDrawPhaseAt")] + //public static class Building_GeneExtractor_Draw_Patch + //{ + // public static IEnumerable Transpiler(IEnumerable codeInstructions) + // { + // var codes = codeInstructions.ToList(); + // for (var i = 0; i < codes.Count; i++) + // { + // if (i > 1) + // { + // yield return new CodeInstruction(OpCodes.Ldarg_0); + // yield return new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(Building_GeneExtractor_Draw_Patch), nameof(DrawCustom))); + // yield return new CodeInstruction(OpCodes.Ret); + // yield break; + // } + // else + // { + // yield return codes[i]; + // } + // } + // } + + // public static void DrawCustom(Building_GeneExtractor building_GeneExtractor) + // { + // if (building_GeneExtractor.Working && building_GeneExtractor.selectedPawn != null && ContainsCorpseOrPawn(building_GeneExtractor.innerContainer, building_GeneExtractor.selectedPawn)) + // { + // var oldHoldingOwner = building_GeneExtractor.selectedPawn.holdingOwner; + // if (building_GeneExtractor.selectedPawn.Corpse != null) + // { + // var newHoldingOwner = building_GeneExtractor.selectedPawn.Corpse.holdingOwner; + // building_GeneExtractor.selectedPawn.holdingOwner = newHoldingOwner; + // } + // building_GeneExtractor.selectedPawn.Drawer.renderer.RenderPawnAt(building_GeneExtractor.DrawPos + building_GeneExtractor.PawnDrawOffset, null, neverAimWeapon: true); + // building_GeneExtractor.selectedPawn.holdingOwner = oldHoldingOwner; + // } + // } + + // public static bool ContainsCorpseOrPawn(ThingOwner innerContainer, Pawn selectedPawn) + // { + // foreach (var thing in innerContainer) + // { + // if (thing is Corpse corpse && corpse.InnerPawn == selectedPawn) + // { + // return true; + // } + // else if (thing is Pawn pawn && pawn == selectedPawn) + // { + // return true; + // } + // } + // return false; + // } + //} + + +} diff --git a/Source/Gene Stuff/HarmonyPatches/Genepack_LabelNoCount_Patch.cs b/Source/Gene Stuff/HarmonyPatches/Genepack_LabelNoCount_Patch.cs new file mode 100644 index 0000000..0670ce6 --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/Genepack_LabelNoCount_Patch.cs @@ -0,0 +1,19 @@ +using HarmonyLib; +using RimWorld; +using Verse; + +namespace MedievalBiotech +{ + + [HarmonyPatch(typeof(Genepack), "LabelNoCount", MethodType.Getter)] + public static class Genepack_LabelNoCount_Patch + { + public static void Postfix(Genepack __instance, ref string __result) + { + if (__instance.deteriorationPct == 1f) + { + __result = "MB.GenepackInactive".Translate(__result); + } + } + } +} diff --git a/Source/Gene Stuff/HarmonyPatches/Genepack_TickRare_Transpiler.cs b/Source/Gene Stuff/HarmonyPatches/Genepack_TickRare_Transpiler.cs new file mode 100644 index 0000000..a2fc591 --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/Genepack_TickRare_Transpiler.cs @@ -0,0 +1,50 @@ +using HarmonyLib; +using RimWorld; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Emit; +using UnityEngine; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(Genepack), "TickRare")] + public static class Genepack_TickRare_Transpiler + { + public static IEnumerable Transpiler(IEnumerable codeInstructions) + { + var codes = codeInstructions.ToList(); + var get_ParentContainerInfo = AccessTools.Method(typeof(Genepack), "get_ParentContainer"); + Label? label = null; + for (var i = 0; i < codes.Count; i++) + { + var code = codes[i]; + if (code.opcode == OpCodes.Brfalse && codes[i - 1].Calls(get_ParentContainerInfo)) + { + label = (Label)code.operand; + yield return code; + } + else if (label != null && code.labels.Contains(label.Value)) + { + label = null; + } + if (label is null) + { + yield return code; + } + } + } + + public static void Postfix(Genepack __instance) + { + if (__instance.Deteriorating) + { + __instance.deteriorationPct += 1f / (5f * 60000f) * 250f; + __instance.deteriorationPct = Mathf.Clamp01(__instance.deteriorationPct); + } + else + { + __instance.deteriorationPct = 0; + } + } + } +} diff --git a/Source/Gene Stuff/HarmonyPatches/Pawn_TraderTracker_ColonyThingsWillingToBuy_Patch.cs b/Source/Gene Stuff/HarmonyPatches/Pawn_TraderTracker_ColonyThingsWillingToBuy_Patch.cs new file mode 100644 index 0000000..a77ca66 --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/Pawn_TraderTracker_ColonyThingsWillingToBuy_Patch.cs @@ -0,0 +1,40 @@ +using HarmonyLib; +using RimWorld; +using System.Collections.Generic; +using Verse; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(Pawn_TraderTracker), "ColonyThingsWillingToBuy")] + public static class Pawn_TraderTracker_ColonyThingsWillingToBuy_Patch + { + public static IEnumerable Postfix(IEnumerable __result, Pawn_TraderTracker __instance) + { + foreach (Thing thing in __result) + { + yield return thing; + } + if (ModsConfig.BiotechActive) + { + IEnumerable enumerable2 = __instance.pawn.Map.listerBuildings.AllBuildingsColonistOfDef(MB_DefOf.MB_GenePotionsRack); + foreach (Building item2 in enumerable2) + { + if (!__instance.ReachableForTrade(item2)) + { + continue; + } + CompGenepackContainer compGenepackContainer = item2.TryGetComp(); + if (compGenepackContainer == null) + { + continue; + } + List containedGenepacks = compGenepackContainer.ContainedGenepacks; + foreach (Genepack item3 in containedGenepacks) + { + yield return item3; + } + } + } + } + } +} diff --git a/Source/Gene Stuff/HarmonyPatches/TradeUtility_AllLaunchableThingsForTrade_Patch.cs b/Source/Gene Stuff/HarmonyPatches/TradeUtility_AllLaunchableThingsForTrade_Patch.cs new file mode 100644 index 0000000..64d96aa --- /dev/null +++ b/Source/Gene Stuff/HarmonyPatches/TradeUtility_AllLaunchableThingsForTrade_Patch.cs @@ -0,0 +1,48 @@ +using HarmonyLib; +using RimWorld; +using System.Collections.Generic; +using Verse; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(TradeUtility), "AllLaunchableThingsForTrade")] + public static class TradeUtility_AllLaunchableThingsForTrade_Patch + { + public static IEnumerable Postfix(IEnumerable __result, Map map, ITrader trader = null) + { + foreach (Thing thing in __result) + { + yield return thing; + } + HashSet yieldedThings = new HashSet(); + foreach (Building_OrbitalTradeBeacon item in Building_OrbitalTradeBeacon.AllPowered(map)) + { + foreach (IntVec3 tradeableCell in item.TradeableCells) + { + List thingList = tradeableCell.GetThingList(map); + for (int i = 0; i < thingList.Count; i++) + { + Thing t = thingList[i]; + if (ModsConfig.BiotechActive && t.def == MB_DefOf.MB_GenePotionsRack) + { + CompGenepackContainer compGenepackContainer = t.TryGetComp(); + if (compGenepackContainer == null) + { + continue; + } + List containedGenepacks = compGenepackContainer.ContainedGenepacks; + foreach (Genepack item2 in containedGenepacks) + { + if (TradeUtility.PlayerSellableNow(t, trader) && !yieldedThings.Contains(item2)) + { + yieldedThings.Add(item2); + yield return item2; + } + } + } + } + } + } + } + } +} diff --git a/Source/JobDriver_CarryCorpseToTable.cs b/Source/Gene Stuff/JobDriver_CarryCorpseToTable.cs similarity index 100% rename from Source/JobDriver_CarryCorpseToTable.cs rename to Source/Gene Stuff/JobDriver_CarryCorpseToTable.cs diff --git a/Source/JobDriver_OperateOnPawn.cs b/Source/Gene Stuff/JobDriver_OperateOnPawn.cs similarity index 100% rename from Source/JobDriver_OperateOnPawn.cs rename to Source/Gene Stuff/JobDriver_OperateOnPawn.cs diff --git a/Source/WorkGiver_OperateOnPawn.cs b/Source/Gene Stuff/WorkGiver_OperateOnPawn.cs similarity index 100% rename from Source/WorkGiver_OperateOnPawn.cs rename to Source/Gene Stuff/WorkGiver_OperateOnPawn.cs diff --git a/Source/HarmonyPatches/GeneAssembler_Patches.cs b/Source/HarmonyPatches/GeneAssembler_Patches.cs deleted file mode 100644 index b694ce2..0000000 --- a/Source/HarmonyPatches/GeneAssembler_Patches.cs +++ /dev/null @@ -1,198 +0,0 @@ -using HarmonyLib; -using RimWorld; -using System; -using System.Collections.Generic; -using System.Linq; -using Verse; - -namespace MedievalBiotech -{ - [HarmonyPatch(typeof(Building_GeneAssembler), "PowerOn", MethodType.Getter)] - public static class Building_GeneAssembler_PowerOn_Patch - { - public static bool Prefix(ref bool __result) - { - __result = true; - return false; - } - } - - [HarmonyPatch(typeof(Building_GeneAssembler), "DoWork")] - public static class Building_GeneAssembler_DoWork_Patch - { - public static Dictionary sprayers = new Dictionary(); - public static void Prefix(Building_GeneAssembler __instance) - { - if (!sprayers.TryGetValue(__instance, out var sprayer)) - { - sprayers[__instance] = sprayer = new IntermittentSteamSprayer(__instance); - } - sprayer.SteamSprayerTick(); - } - } - - public class IntermittentSteamSprayer - { - private Thing parent; - - private int ticksUntilSpray = 500; - - private int sprayTicksLeft; - public IntermittentSteamSprayer(Thing parent) - { - this.parent = parent; - } - - public void SteamSprayerTick() - { - if (sprayTicksLeft > 0) - { - sprayTicksLeft--; - if (Rand.Value < 0.6f) - { - FleckMaker.ThrowAirPuffUp(parent.TrueCenter() + new UnityEngine.Vector3(0, 0, 1), parent.Map); - } - if (Find.TickManager.TicksGame % 20 == 0) - { - GenTemperature.PushHeat(parent, 40f); - } - if (sprayTicksLeft <= 0) - { - ticksUntilSpray = Rand.RangeInclusive(500, 2000); - } - return; - } - ticksUntilSpray--; - if (ticksUntilSpray <= 0) - { - sprayTicksLeft = Rand.RangeInclusive(200, 500); - } - } - } - - public class SteamSprayer : ThingComp - { - public IntermittentSteamSprayer steamSprayer; - public override void PostSpawnSetup(bool respawningAfterLoad) - { - base.PostSpawnSetup(respawningAfterLoad); - } - } - - [HarmonyPatch(typeof(Building_GeneAssembler), "Tick")] - public static class Building_GeneAssembler_Tick_Patch - { - public static IEnumerable Transpiler(IEnumerable codeInstructions) - { - var codes = codeInstructions.ToList(); - var isHashOffset = AccessTools.Method(typeof(Gen), nameof(Gen.IsHashIntervalTick), new Type[] { typeof(Thing), typeof(int) }); - for (var i = 0; i < codes.Count; i++) - { - var code = codes[i]; - if (code.Calls(isHashOffset) && codes[i - 1].OperandIs(250)) - { - code.operand = AccessTools.Method(typeof(Building_GeneAssembler_Tick_Patch), nameof(AlwaysFalse)); - } - yield return code; - } - } - - public static bool AlwaysFalse(Thing thing, int hash) - { - return false; - } - } - - [HarmonyPatch(typeof(Building_GeneAssembler), "MaxComplexity")] - public static class Building_GeneAssembler_MaxComplexity_Patch - { - public static bool Prefix(Building_GeneAssembler __instance, ref int __result) - { - __result = MaxComplexity(__instance); - return false; - } - - public static int MaxComplexity(Building_GeneAssembler __instance) - { - int num = 6; - List connectedFacilities = __instance.ConnectedFacilities; - if (connectedFacilities != null) - { - foreach (Thing item in connectedFacilities) - { - CompRefuelable compRefuelable = item.TryGetComp(); - if (compRefuelable == null || compRefuelable.HasFuel) - { - num += (int)item.GetStatValue(StatDefOf.GeneticComplexityIncrease); - } - } - return num; - } - return num; - } - } - - [HarmonyPatch(typeof(Building_GeneAssembler), "Finish")] - public static class Building_GeneAssembler_Finish_Patch - { - public static void Prefix(Building_GeneAssembler __instance) - { - float currentComplexity = __instance.TotalGCX - 6; - if (currentComplexity > 0) - { - List connectedFacilities = __instance.ConnectedFacilities; - foreach (var facility in connectedFacilities) - { - if (facility.def == MB_DefOf.GeneProcessor) - { - currentComplexity -= facility.GetStatValue(StatDefOf.GeneticComplexityIncrease); - var waste = ThingMaker.MakeThing(ThingDefOf.Wastepack); - waste.stackCount = 1; - GenSpawn.Spawn(waste, facility.Position, facility.Map); - if (currentComplexity <= 0) - { - return; - } - } - } - } - } - } - - [HarmonyPatch(typeof(Building_GeneAssembler), "GetGenepacks")] - public static class Building_GeneAssembler_GetGenepacks_Patch - { - public static bool Prefix(Building_GeneAssembler __instance, ref List __result, bool includePowered, bool includeUnpowered) - { - __result = GetGenepacks(__instance, includePowered, includeUnpowered); - return false; - } - - public static List GetGenepacks(Building_GeneAssembler __instance, bool includePowered, bool includeUnpowered) - { - __instance.tmpGenepacks.Clear(); - List connectedFacilities = __instance.ConnectedFacilities; - if (connectedFacilities != null) - { - foreach (Thing item in connectedFacilities) - { - CompGenepackContainer compGenepackContainer = item.TryGetComp(); - if (compGenepackContainer != null) - { - var fueled = item.TryGetComp()?.HasFuel ?? true; - if (includePowered && fueled) - { - __instance.tmpGenepacks.AddRange(compGenepackContainer.ContainedGenepacks.Where(x => x.deteriorationPct < 1f)); - } - else if (includeUnpowered && !fueled) - { - __instance.tmpGenepacks.AddRange(compGenepackContainer.ContainedGenepacks); - - } - } - } - } - return __instance.tmpGenepacks; - } - } -} diff --git a/Source/HarmonyPatches/GeneExtractor_Patches.cs b/Source/HarmonyPatches/GeneExtractor_Patches.cs deleted file mode 100644 index 8ec6152..0000000 --- a/Source/HarmonyPatches/GeneExtractor_Patches.cs +++ /dev/null @@ -1,237 +0,0 @@ -using HarmonyLib; -using RimWorld; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection.Emit; -using UnityEngine; -using Verse; -using Verse.AI; - -namespace MedievalBiotech -{ - [HarmonyPatch(typeof(Building_GeneExtractor), "PowerOn", MethodType.Getter)] - public static class Building_GeneExtractor_PowerOn_Patch - { - public static bool Prefix(ref bool __result) - { - __result = true; - return false; - } - } - - - - [HarmonyPatch(typeof(Building_GeneExtractor), "ContainedPawn", MethodType.Getter)] - public static class Building_GeneExtractor_ContainedPawn_Patch - { - public static bool Prefix(Building_GeneExtractor __instance, ref Pawn __result) - { - var firstThing = __instance.innerContainer.FirstOrDefault(); - if (firstThing != null) - { - if (firstThing is Corpse corpse) - { - __result = corpse.InnerPawn; - } - else if (firstThing is Pawn pawn) - { - __result = pawn; - } - } - return false; - } - } - - [HarmonyPatch(typeof(FloatMenuMakerMap), "AddHumanlikeOrders")] - public static class FloatMenuMakerMap_AddHumanlikeOrders_Patch - { - public static void Postfix(Vector3 clickPos, Pawn pawn, ref List opts) - { - IntVec3 c = IntVec3.FromVector3(clickPos); - List thingList = c.GetThingList(pawn.Map); - for (int i = 0; i < thingList.Count; i++) - { - Thing t = thingList[i]; - if (t is Corpse corpse && corpse.GetRotStage() == RotStage.Fresh) - { - var geneExtractor = (Building_GeneExtractor)GenClosest.ClosestThingReachable(corpse.PositionHeld, corpse.MapHeld, - ThingRequest.ForDef(ThingDefOf.GeneExtractor), PathEndMode.InteractionCell, TraverseParms.For(pawn), 9999f, - (Thing x) => ((Building_GeneExtractor)x).CanAcceptPawn(corpse.InnerPawn) && pawn.CanReserve(x, 1, -1, null, true)); - if (geneExtractor is null || !pawn.CanReserveAndReach(corpse, PathEndMode.OnCell, Danger.Deadly, 1, -1, null, ignoreOtherReservations: true)) - { - continue; - } - opts.Add(new FloatMenuOption("MB.CarryCorpseToTable".Translate(corpse.InnerPawn.LabelShortCap), delegate - { - Job job = JobMaker.MakeJob(MB_DefOf.MB_CarryCorpseToTable, geneExtractor, corpse); - job.count = 1; - pawn.jobs.TryTakeOrderedJob(job, JobTag.Misc); - })); - } - } - } - } - - - - [HarmonyPatch(typeof(Building_GeneExtractor), "CanAcceptPawn")] - public static class Building_GeneExtractor_CanAcceptPawn_Patch - { - public static bool Prefix(Building_GeneExtractor __instance, ref AcceptanceReport __result, Pawn pawn) - { - __result = CanAcceptPawn(__instance, pawn); - return false; - } - - public static AcceptanceReport CanAcceptPawn(Building_GeneExtractor __instance, Pawn pawn) - { - if (__instance.selectedPawn != null && __instance.selectedPawn != pawn) - { - return false; - } - if (!pawn.RaceProps.Humanlike || pawn.IsQuestLodger()) - { - return false; - } - if (__instance.innerContainer.Count > 0) - { - return "Occupied".Translate(); - } - if (pawn.genes == null || !pawn.genes.GenesListForReading.Any((Gene x) => x.def.passOnDirectly)) - { - return "PawnHasNoGenes".Translate(pawn.Named("PAWN")); - } - if (!pawn.genes.GenesListForReading.Any((Gene x) => x.def.biostatArc == 0)) - { - return "PawnHasNoNonArchiteGenes".Translate(pawn.Named("PAWN")); - } - if (pawn.health.hediffSet.HasHediff(HediffDefOf.XenogerminationComa)) - { - return "InXenogerminationComa".Translate(); - } - return true; - } - } - - [HarmonyPatch(typeof(Building_GeneExtractor), "TryAcceptPawn")] - public static class Building_GeneExtractor_TryAcceptPawn_Patch - { - public static bool Prefix(Building_GeneExtractor __instance, Pawn pawn) - { - TryAcceptPawn(__instance, pawn); - return false; - } - - public static void TryAcceptPawn(Building_GeneExtractor __instance, Pawn pawn) - { - if ((bool)__instance.CanAcceptPawn(pawn)) - { - __instance.selectedPawn = pawn; - bool num = pawn.Corpse != null ? pawn.Corpse.DeSpawnOrDeselect() : pawn.DeSpawnOrDeselect(); - if (__instance.innerContainer.TryAddOrTransfer(pawn.Corpse != null ? (Thing)pawn.Corpse : pawn)) - { - __instance.startTick = Find.TickManager.TicksGame; - __instance.ticksRemaining = 30000; - } - if (num) - { - Find.Selector.Select(pawn.Corpse != null ? (Thing)pawn.Corpse : pawn, playSound: false, forceDesignatorDeselect: false); - } - } - } - } - [HarmonyPatch(typeof(Building_GeneExtractor), "Draw")] - public static class Building_GeneExtractor_Draw_Patch - { - public static IEnumerable Transpiler(IEnumerable codeInstructions) - { - var codes = codeInstructions.ToList(); - for (var i = 0; i < codes.Count; i++) - { - if (i > 1) - { - yield return new CodeInstruction(OpCodes.Ldarg_0); - yield return new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(Building_GeneExtractor_Draw_Patch), nameof(DrawCustom))); - yield return new CodeInstruction(OpCodes.Ret); - yield break; - } - else - { - yield return codes[i]; - } - } - } - - public static void DrawCustom(Building_GeneExtractor building_GeneExtractor) - { - if (building_GeneExtractor.Working && building_GeneExtractor.selectedPawn != null && ContainsCorpseOrPawn(building_GeneExtractor.innerContainer, building_GeneExtractor.selectedPawn)) - { - var oldHoldingOwner = building_GeneExtractor.selectedPawn.holdingOwner; - if (building_GeneExtractor.selectedPawn.Corpse != null) - { - var newHoldingOwner = building_GeneExtractor.selectedPawn.Corpse.holdingOwner; - building_GeneExtractor.selectedPawn.holdingOwner = newHoldingOwner; - } - building_GeneExtractor.selectedPawn.Drawer.renderer.RenderPawnAt(building_GeneExtractor.DrawPos + building_GeneExtractor.PawnDrawOffset, null, neverAimWeapon: true); - building_GeneExtractor.selectedPawn.holdingOwner = oldHoldingOwner; - } - } - - public static bool ContainsCorpseOrPawn(ThingOwner innerContainer, Pawn selectedPawn) - { - foreach (var thing in innerContainer) - { - if (thing is Corpse corpse && corpse.InnerPawn == selectedPawn) - { - return true; - } - else if (thing is Pawn pawn && pawn == selectedPawn) - { - return true; - } - } - return false; - } - } - - [HarmonyPatch(typeof(Building_GeneExtractor), "Tick")] - public static class Building_GeneExtractor_Tick_Patch - { - public static IEnumerable Transpiler(IEnumerable codeInstructions) - { - var codes = codeInstructions.ToList(); - var isHashOffset = AccessTools.Method(typeof(Gen), nameof(Gen.IsHashIntervalTick), new Type[] { typeof(Thing), typeof(int) }); - var powerOn = AccessTools.PropertyGetter(typeof(CompPowerTrader), nameof(CompPowerTrader.PowerOn)); - var powerCutField = AccessTools.Field(typeof(Building_GeneExtractor), "powerCutTicks"); - for (var i = 0; i < codes.Count; i++) - { - var code = codes[i]; - if (code.Calls(isHashOffset)) - { - code.operand = AccessTools.Method(typeof(Building_GeneExtractor_Tick_Patch), nameof(AlwaysFalse)); - } - if (code.Calls(powerOn)) - { - yield return new CodeInstruction(OpCodes.Ldarg_0); - code.operand = AccessTools.Method(typeof(Building_GeneExtractor_Tick_Patch), nameof(ShouldWork)); - } - if (code.opcode == OpCodes.Ldc_I4 && code.OperandIs(60000)) - { - code.operand = int.MaxValue; - } - yield return code; - } - } - - public static bool AlwaysFalse(Thing thing, int hash) - { - return false; - } - public static bool ShouldWork(CompPowerTrader trader, Building_GeneExtractor parent) - { - parent.powerCutTicks = 0; - return false; - } - } -} diff --git a/Source/HarmonyPatches/GenePack_Patches.cs b/Source/HarmonyPatches/GenePack_Patches.cs deleted file mode 100644 index 22e37d1..0000000 --- a/Source/HarmonyPatches/GenePack_Patches.cs +++ /dev/null @@ -1,163 +0,0 @@ -using HarmonyLib; -using RimWorld; -using System.Collections.Generic; -using System.Linq; -using System.Reflection.Emit; -using UnityEngine; -using Verse; - -namespace MedievalBiotech -{ - [HarmonyPatch(typeof(CompGenepackContainer), "PowerOn", MethodType.Getter)] - public static class CompGenepackContainer_PowerOn_Patch - { - public static bool Prefix(ref bool __result, CompGenepackContainer __instance) - { - if (__instance.parent.def == ThingDefOf.GeneBank) - { - __result = __instance.parent.TryGetComp().HasFuel; - } - return false; - } - } - - [HarmonyPatch(typeof(CompGenepackContainer), "CompTick")] - - public static class CompGenepackContainer_CompTick_Patch - { - public static void Postfix(CompGenepackContainer __instance) - { - if (__instance.parent.IsHashIntervalTick(250)) - { - __instance.innerContainer.ThingOwnerTickRare(); - } - } - } - - [HarmonyPatch(typeof(Pawn_TraderTracker), "ColonyThingsWillingToBuy")] - public static class Pawn_TraderTracker_ColonyThingsWillingToBuy_Patch - { - public static IEnumerable Postfix(IEnumerable __result, Pawn_TraderTracker __instance) - { - foreach (Thing thing in __result) - { - yield return thing; - } - if (ModsConfig.BiotechActive) - { - IEnumerable enumerable2 = __instance.pawn.Map.listerBuildings.AllBuildingsColonistOfDef(MB_DefOf.MB_GenePotionsRack); - foreach (Building item2 in enumerable2) - { - if (!__instance.ReachableForTrade(item2)) - { - continue; - } - CompGenepackContainer compGenepackContainer = item2.TryGetComp(); - if (compGenepackContainer == null) - { - continue; - } - List containedGenepacks = compGenepackContainer.ContainedGenepacks; - foreach (Genepack item3 in containedGenepacks) - { - yield return item3; - } - } - } - } - } - - [HarmonyPatch(typeof(TradeUtility), "AllLaunchableThingsForTrade")] - public static class TradeUtility_AllLaunchableThingsForTrade_Patch - { - public static IEnumerable Postfix(IEnumerable __result, Map map, ITrader trader = null) - { - foreach (Thing thing in __result) - { - yield return thing; - } - HashSet yieldedThings = new HashSet(); - foreach (Building_OrbitalTradeBeacon item in Building_OrbitalTradeBeacon.AllPowered(map)) - { - foreach (IntVec3 tradeableCell in item.TradeableCells) - { - List thingList = tradeableCell.GetThingList(map); - for (int i = 0; i < thingList.Count; i++) - { - Thing t = thingList[i]; - if (ModsConfig.BiotechActive && t.def == MB_DefOf.MB_GenePotionsRack) - { - CompGenepackContainer compGenepackContainer = t.TryGetComp(); - if (compGenepackContainer == null) - { - continue; - } - List containedGenepacks = compGenepackContainer.ContainedGenepacks; - foreach (Genepack item2 in containedGenepacks) - { - if (TradeUtility.PlayerSellableNow(t, trader) && !yieldedThings.Contains(item2)) - { - yieldedThings.Add(item2); - yield return item2; - } - } - } - } - } - } - } - } - - [HarmonyPatch(typeof(Genepack), "TickRare")] - public static class Genepack_TickRare_Transpiler - { - public static IEnumerable Transpiler(IEnumerable codeInstructions) - { - var codes = codeInstructions.ToList(); - var get_ParentContainerInfo = AccessTools.Method(typeof(Genepack), "get_ParentContainer"); - Label? label = null; - for (var i = 0; i < codes.Count; i++) - { - var code = codes[i]; - if (code.opcode == OpCodes.Brfalse && codes[i - 1].Calls(get_ParentContainerInfo)) - { - label = (Label)code.operand; - yield return code; - } - else if (label != null && code.labels.Contains(label.Value)) - { - label = null; - } - if (label is null) - { - yield return code; - } - } - } - - public static void Postfix(Genepack __instance) - { - if (__instance.Deteriorating) - { - __instance.deteriorationPct += 1f / (5f * 60000f) * 250f; - __instance.deteriorationPct = Mathf.Clamp01(__instance.deteriorationPct); - } - else - { - __instance.deteriorationPct = 0; - } - } - } - - [HarmonyPatch(typeof(Genepack), "LabelNoCount", MethodType.Getter)] - public static class Genepack_LabelNoCount_Patch - { - public static void Postfix(Genepack __instance, ref string __result) - { - if (__instance.deteriorationPct == 1f) - { - __result = "MB.GenepackInactive".Translate(__result); - } - } - } -} diff --git a/Source/MB_DefOf.cs b/Source/MB_DefOf.cs deleted file mode 100644 index 239a34d..0000000 --- a/Source/MB_DefOf.cs +++ /dev/null @@ -1,16 +0,0 @@ -using RimWorld; -using Verse; - -namespace MedievalBiotech -{ - [DefOf] - public static class MB_DefOf - { - public static JobDef MB_OperateOnPawn; - public static JobDef MB_CarryCorpseToTable; - public static EffecterDef ButcherFlesh; - public static SoundDef Recipe_ButcherCorpseFlesh; - public static ThingDef MB_GenePotionsRack; - public static ThingDef GeneProcessor; - } -} diff --git a/Source/MedievalBiotech.csproj b/Source/MedievalBiotech.csproj index e645088..0bcad63 100644 --- a/Source/MedievalBiotech.csproj +++ b/Source/MedievalBiotech.csproj @@ -9,15 +9,17 @@ Properties MedievalBiotech MedievalBiotech - v4.7.2 + v4.8 512 true + latest + false none false - ..\v1.4\Assemblies\ + ..\1.5\Assemblies\ none @@ -32,41 +34,115 @@ 4 - - - - - - - + + ..\..\2023507013\1.5\Assemblies\PipeSystem.dll + + + ..\..\2023507013\1.5\Assemblies\VFECore.dll + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + - 2.1.0 + 2.* runtime; build; native; contentfiles; analyzers; buildtransitive all - 1.4.3580 + 1.*-* - 2.2.2 + 2.* + runtime - - + + + \ No newline at end of file diff --git a/Source/MedievalBiotech.csproj.user b/Source/MedievalBiotech.csproj.user new file mode 100644 index 0000000..9b86104 --- /dev/null +++ b/Source/MedievalBiotech.csproj.user @@ -0,0 +1,6 @@ + + + + ShowAllFiles + + \ No newline at end of file diff --git a/Source/New Mech/Comps/CompAbilityEffect_CreateArcanaStone.cs b/Source/New Mech/Comps/CompAbilityEffect_CreateArcanaStone.cs new file mode 100644 index 0000000..e59b556 --- /dev/null +++ b/Source/New Mech/Comps/CompAbilityEffect_CreateArcanaStone.cs @@ -0,0 +1,34 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace MedievalBiotech +{ + public class CompAbilityEffect_CreateArcanaStone : CompAbilityEffect + { + public new CompProperties_CreateArcanaStone Props + { + get + { + return (CompProperties_CreateArcanaStone)this.props; + } + } + public override void Apply(LocalTargetInfo target, LocalTargetInfo dest) + { + Pawn pawn = this.parent.pawn; + Thing thing = ThingMaker.MakeThing(this.Props.stoneCreated, null); + if (pawn.inventory.innerContainer != null) + { + pawn.inventory.innerContainer.TryAdd(thing); + } + //if (!GenPlace.TryPlaceThing(ThingMaker.MakeThing(this.Props.stoneCreated, null), pawn.PositionHeld, pawn.MapHeld, ThingPlaceMode.Near, null, null, default(Rot4))) + //{ + // Log.Error("Could not drop arcana stone near " + pawn.PositionHeld); + //} + } +} +} diff --git a/Source/New Mech/Comps/CompAbilityEffect_GiveHediffSecondary.cs b/Source/New Mech/Comps/CompAbilityEffect_GiveHediffSecondary.cs new file mode 100644 index 0000000..e82ac8c --- /dev/null +++ b/Source/New Mech/Comps/CompAbilityEffect_GiveHediffSecondary.cs @@ -0,0 +1,83 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace MedievalBiotech +{ + public class CompAbilityEffect_GiveHediffSecondary : CompAbilityEffect_WithDuration + { + public new CompProperties_AbilityGiveHediff Props + { + get + { + return (CompProperties_AbilityGiveHediff)this.props; + } + } + public override void Apply(LocalTargetInfo target, LocalTargetInfo dest) + { + base.Apply(target, dest); + if (this.Props.ignoreSelf && target.Pawn == this.parent.pawn) + { + return; + } + if (!this.Props.onlyApplyToSelf && this.Props.applyToTarget) + { + this.ApplyInner(target.Pawn, this.parent.pawn); + } + if (this.Props.applyToSelf || this.Props.onlyApplyToSelf) + { + this.ApplyInner(this.parent.pawn, target.Pawn); + } + } + + protected void ApplyInner(Pawn target, Pawn other) + { + if (target != null) + { + if (this.TryResist(target)) + { + MoteMaker.ThrowText(target.DrawPos, target.Map, "Resisted".Translate(), -1f); + return; + } + if (this.Props.replaceExisting) + { + Hediff firstHediffOfDef = target.health.hediffSet.GetFirstHediffOfDef(this.Props.hediffDef, false); + if (firstHediffOfDef != null) + { + target.health.RemoveHediff(firstHediffOfDef); + } + } + Hediff hediff = HediffMaker.MakeHediff(this.Props.hediffDef, target, this.Props.onlyBrain ? target.health.hediffSet.GetBrain() : null); + HediffComp_Disappears hediffComp_Disappears = hediff.TryGetComp(); + if (hediffComp_Disappears != null) + { + hediffComp_Disappears.ticksToDisappear = base.GetDurationSeconds(target).SecondsToTicks(); + } + if (this.Props.severity >= 0f) + { + hediff.Severity = this.Props.severity; + } + HediffComp_Link hediffComp_Link = hediff.TryGetComp(); + if (hediffComp_Link != null) + { + hediffComp_Link.other = other; + hediffComp_Link.drawConnection = (target == this.parent.pawn); + } + target.health.AddHediff(hediff, null, null, null); + } + } + + protected virtual bool TryResist(Pawn pawn) + { + return false; + } + public override bool AICanTargetNow(LocalTargetInfo target) + { + return this.parent.pawn.Faction != Faction.OfPlayer && target.Pawn != null; + } + } +} diff --git a/Source/New Mech/Comps/CompAbilityEffect_SoulCost.cs b/Source/New Mech/Comps/CompAbilityEffect_SoulCost.cs new file mode 100644 index 0000000..232acf4 --- /dev/null +++ b/Source/New Mech/Comps/CompAbilityEffect_SoulCost.cs @@ -0,0 +1,108 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse.AI; +using Verse; + +namespace MedievalBiotech +{ + public class CompAbilityEffect_SoulCost : CompAbilityEffect + { + public new CompProperties_AbilitySoulCost Props + { + get + { + return (CompProperties_AbilitySoulCost)this.props; + } + } + private bool HasEnoughSoul + { + get + { + Pawn_GeneTracker genes = this.parent.pawn.genes; + Gene_Soul gene_Soul = (genes != null) ? genes.GetFirstGeneOfType() : null; + return gene_Soul != null && gene_Soul.Value >= this.Props.soulCost; + } + } + + public override void Apply(LocalTargetInfo target, LocalTargetInfo dest) + { + base.Apply(target, dest); + Utility.OffsetSoul(this.parent.pawn, -this.Props.soulCost, true); + } + + public override bool GizmoDisabled(out string reason) + { + Pawn_GeneTracker genes = this.parent.pawn.genes; + Gene_Soul gene_Soul = (genes != null) ? genes.GetFirstGeneOfType() : null; + if (gene_Soul == null) + { + reason = "MB_AbilityDisabledNoSoulGene".Translate(this.parent.pawn); + return true; + } + if (gene_Soul.Value < this.Props.soulCost) + { + reason = "MB_AbilityDisabledNoSoul".Translate(this.parent.pawn); + return true; + } + float num = this.TotalSoulCostOfQueuedAbilities(); + float num2 = this.Props.soulCost + num; + if (this.Props.soulCost > 1E-45f && num2 > gene_Soul.Value) + { + reason = "MB_AbilityDisabledNoSoul".Translate(this.parent.pawn); + return true; + } + reason = null; + return false; + } + + public override bool AICanTargetNow(LocalTargetInfo target) + { + return this.HasEnoughSoul; + } + + private float TotalSoulCostOfQueuedAbilities() + { + Pawn_JobTracker jobs = this.parent.pawn.jobs; + object obj; + if (jobs == null) + { + obj = null; + } + else + { + Job curJob = jobs.curJob; + obj = ((curJob != null) ? curJob.verbToUse : null); + } + Verb_CastAbilitySoul verb_CastAbility = obj as Verb_CastAbilitySoul; + float num; + if (verb_CastAbility == null) + { + num = 0f; + } + else + { + AbilitySoul ability = verb_CastAbility.ability; + num = ((ability != null) ? ability.SoulCost() : 0f); + } + float num2 = num; + if (this.parent.pawn.jobs != null) + { + for (int i = 0; i < this.parent.pawn.jobs.jobQueue.Count; i++) + { + Verb_CastAbilitySoul verb_CastAbility2; + if ((verb_CastAbility2 = (this.parent.pawn.jobs.jobQueue[i].job.verbToUse as Verb_CastAbilitySoul)) != null) + { + float num3 = num2; + AbilitySoul ability2 = verb_CastAbility2.ability; + num2 = num3 + ((ability2 != null) ? ability2.SoulCost() : 0f); + } + } + } + return num2; + } + } +} diff --git a/Source/New Mech/Comps/CompAbilityEffect_SoulDrain.cs b/Source/New Mech/Comps/CompAbilityEffect_SoulDrain.cs new file mode 100644 index 0000000..90f8f6a --- /dev/null +++ b/Source/New Mech/Comps/CompAbilityEffect_SoulDrain.cs @@ -0,0 +1,161 @@ +using System; +using Verse; +using RimWorld; + +namespace MedievalBiotech +{ + public class CompAbilityEffect_SoulDrain : CompAbilityEffect + { + public new CompProperties_AbilitySoulDrain Props + { + get + { + return (CompProperties_AbilitySoulDrain)this.props; + } + } + public override void Apply(LocalTargetInfo target, LocalTargetInfo dest) + { + base.Apply(target, dest); + Pawn pawn = target.Pawn; + if (pawn == null) + { + return; + } + Utility.DoDrain(this.parent.pawn, pawn, this.Props.soulGain, this.Props.resistanceGain, this.Props.thoughtDefToGiveTarget, this.Props.opinionThoughtDefToGiveTarget); + } + + public override bool CanApplyOn(LocalTargetInfo target, LocalTargetInfo dest) + { + return this.Valid(target, false); + } + + public override bool Valid(LocalTargetInfo target, bool throwMessages = false) + { + Pawn pawn = target.Pawn; + if (pawn == null) + { + return false; + } + if (!AbilityUtility.ValidateMustBeHumanOrWildMan(pawn, throwMessages, this.parent)) + { + return false; + } + if (pawn.Faction != null && !pawn.IsSlaveOfColony && !pawn.IsPrisonerOfColony) + { + if (pawn.Faction.HostileTo(this.parent.pawn.Faction)) + { + if (!pawn.Downed) + { + if (throwMessages) + { + Messages.Message("MessageCantUseOnResistingPerson".Translate(this.parent.def.Named("ABILITY")), pawn, MessageTypeDefOf.RejectInput, false); + } + return false; + } + } + else if (pawn.IsQuestLodger() || pawn.Faction != this.parent.pawn.Faction) + { + if (throwMessages) + { + Messages.Message("MessageCannotUseOnOtherFactions".Translate(this.parent.def.Named("ABILITY")), pawn, MessageTypeDefOf.RejectInput, false); + } + return false; + } + } + if (pawn.IsWildMan() && !pawn.IsPrisonerOfColony && !pawn.Downed) + { + if (throwMessages) + { + Messages.Message("MessageCantUseOnResistingPerson".Translate(this.parent.def.Named("ABILITY")), pawn, MessageTypeDefOf.RejectInput, false); + } + return false; + } + if (pawn.InMentalState || PrisonBreakUtility.IsPrisonBreaking(pawn)) + { + if (throwMessages) + { + Messages.Message("MessageCantUseOnResistingPerson".Translate(this.parent.def.Named("ABILITY")), pawn, MessageTypeDefOf.RejectInput, false); + } + return false; + } + if (ModsConfig.AnomalyActive && pawn.IsMutant && !pawn.mutant.Def.canBleed) + { + if (throwMessages) + { + Messages.Message("MessageCannotUseOnNonBleeder".Translate(this.parent.def.Named("ABILITY")), pawn, MessageTypeDefOf.RejectInput, false); + } + return false; + } + return true; + } + + public override string ExtraLabelMouseAttachment(LocalTargetInfo target) + { + Pawn pawn = target.Pawn; + if (pawn != null) + { + string text = null; + if (pawn.HostileTo(this.parent.pawn) && !pawn.Downed) + { + text += "MessageCantUseOnResistingPerson".Translate(this.parent.def.Named("ABILITY")); + } + float num = this.BloodlossAfterBite(pawn); + if (num >= HediffDefOf.BloodLoss.lethalSeverity) + { + if (!text.NullOrEmpty()) + { + text += "\n"; + } + text += "WillKill".Translate(); + } + else if (HediffDefOf.BloodLoss.stages[HediffDefOf.BloodLoss.StageAtSeverity(num)].lifeThreatening) + { + if (!text.NullOrEmpty()) + { + text += "\n"; + } + text += "WillCauseSeriousBloodloss".Translate(); + } + return text; + } + return base.ExtraLabelMouseAttachment(target); + } + + public override Window ConfirmationDialog(LocalTargetInfo target, Action confirmAction) + { + Pawn pawn = target.Pawn; + if (pawn != null) + { + if (pawn.genes != null && pawn.genes.HasGene(GeneDefOf.Deathless)) + { + return null; + } + float num = this.BloodlossAfterBite(pawn); + if (num >= HediffDefOf.BloodLoss.lethalSeverity) + { + return Dialog_MessageBox.CreateConfirmation("WarningPawnWillDieFromBloodfeeding".Translate(pawn.Named("PAWN")), confirmAction, true, null, WindowLayer.Dialog); + } + if (HediffDefOf.BloodLoss.stages[HediffDefOf.BloodLoss.StageAtSeverity(num)].lifeThreatening) + { + return Dialog_MessageBox.CreateConfirmation("WarningPawnWillHaveSeriousBloodlossFromBloodfeeding".Translate(pawn.Named("PAWN")), confirmAction, true, null, WindowLayer.Dialog); + } + } + return null; + } + + private float BloodlossAfterBite(Pawn target) + { + if (target.Dead || !target.RaceProps.IsFlesh) + { + return 0f; + } + float num = this.Props.targetBloodLoss; + Hediff firstHediffOfDef = target.health.hediffSet.GetFirstHediffOfDef(HediffDefOf.BloodLoss, false); + if (firstHediffOfDef != null) + { + num += firstHediffOfDef.Severity; + } + return num; + } + } +} diff --git a/Source/New Mech/Comps/CompDeathrestBindable_Soul.cs b/Source/New Mech/Comps/CompDeathrestBindable_Soul.cs new file mode 100644 index 0000000..afaab7c --- /dev/null +++ b/Source/New Mech/Comps/CompDeathrestBindable_Soul.cs @@ -0,0 +1,326 @@ +using System; +using System.Linq; +using UnityEngine; +using Verse; +using Verse.Sound; +using RimWorld; + +namespace MedievalBiotech +{ + public class CompDeathrestBindable_Soul : ThingComp + { + public CompProperties_DeathrestBindable_Soul Props + { + get + { + return (CompProperties_DeathrestBindable_Soul)this.props; + } + } + + public Pawn BoundPawn + { + get + { + return this.boundPawn; + } + } + + //public bool CanIncreasePresence + //{ + // get + // { + // if (this.PowerTraderComp != null && !this.PowerTraderComp.PowerOn) + // { + // return false; + // } + // if (this.RefuelableComp != null && !this.RefuelableComp.HasFuel) + // { + // return false; + // } + // if (!this.boundPawn.InBed()) + // { + // return false; + // } + // Building_Bed building_Bed = this.boundPawn.CurrentBed(); + // if (building_Bed == this.parent) + // { + // return true; + // } + // CompDeathrestBindable_Soul compDeathrestBindable = building_Bed.TryGetComp(); + // return compDeathrestBindable != null && compDeathrestBindable.BoundPawn == this.boundPawn; + // } + //} + + //private CompPowerTrader PowerTraderComp + //{ + // get + // { + // if (this.cachedPowerComp == null) + // { + // this.cachedPowerComp = this.parent.TryGetComp(); + // } + // return this.cachedPowerComp; + // } + //} + + //private CompRefuelable RefuelableComp + //{ + // get + // { + // if (this.cachedRefuelableComp == null) + // { + // this.cachedRefuelableComp = this.parent.TryGetComp(); + // } + // return this.cachedRefuelableComp; + // } + //} + + //private Gene_Deathrest DeathrestGene + //{ + // get + // { + // if (this.cachedDeathrestGene == null) + // { + // Pawn pawn = this.boundPawn; + // Gene_Deathrest gene_Deathrest; + // if (pawn == null) + // { + // gene_Deathrest = null; + // } + // else + // { + // Pawn_GeneTracker genes = pawn.genes; + // gene_Deathrest = ((genes != null) ? genes.GetFirstGeneOfType() : null); + // } + // this.cachedDeathrestGene = gene_Deathrest; + // } + // return this.cachedDeathrestGene; + // } + //} + + //private Material HoseMat + //{ + // get + // { + // if (this.cachedHoseMat == null) + // { + // this.cachedHoseMat = MaterialPool.MatFrom("Other/DeathrestBuildingConnection"); + // } + // return this.cachedHoseMat; + // } + //} + + //public override void PostPostMake() + //{ + // if (!ModLister.CheckBiotech("Deathrest binding")) + // { + // this.parent.Destroy(DestroyMode.Vanish); + // return; + // } + // base.PostPostMake(); + //} + + //public bool CanBindTo(Pawn pawn) + //{ + // return (!this.Props.mustBeLayingInToBind || pawn.CurrentBed() == this.parent) && (this.boundPawn == null || this.boundPawn == pawn); + //} + + //public void BindTo(Pawn pawn) + //{ + // this.boundPawn = pawn; + //} + + //public void Notify_DeathrestGeneRemoved() + //{ + // this.cachedDeathrestGene = null; + // this.boundPawn = null; + // this.presenceTicks = 0; + //} + + //public override void PostSpawnSetup(bool respawningAfterLoad) + //{ + // if (!respawningAfterLoad) + // { + // this.presenceTicks = 0; + // foreach (Pawn pawn in this.parent.Map.mapPawns.PawnsInFaction(this.parent.Faction)) + // { + // if (pawn.Deathresting) + // { + // Pawn_GeneTracker genes = pawn.genes; + // Gene_Deathrest gene_Deathrest = (genes != null) ? genes.GetFirstGeneOfType() : null; + // if (gene_Deathrest != null && gene_Deathrest.CanBindToBindable(this)) + // { + // gene_Deathrest.BindTo(this); + // } + // } + // } + // } + //} + + //public override void PostDeSpawn(Map map) + //{ + // this.presenceTicks = 0; + // if (this.boundPawn != null) + // { + // Pawn_GeneTracker genes = this.boundPawn.genes; + // Gene_Deathrest gene_Deathrest = (genes != null) ? genes.GetFirstGeneOfType() : null; + // if (gene_Deathrest != null) + // { + // gene_Deathrest.Notify_BoundBuildingDeSpawned(this.parent); + // } + // } + // if (this.sustainer != null && !this.sustainer.Ended) + // { + // this.sustainer.End(); + // } + // this.sustainer = null; + //} + + //public override void CompTick() + //{ + // if (this.parent.IsHashIntervalTick(250)) + // { + // this.CompTickRare(); + // } + // if (this.presenceTicks > 0) + // { + // if (!this.Props.soundWorking.NullOrUndefined()) + // { + // if (this.sustainer == null || this.sustainer.Ended) + // { + // this.sustainer = this.Props.soundWorking.TrySpawnSustainer(SoundInfo.InMap(this.parent, MaintenanceType.None)); + // } + // this.sustainer.Maintain(); + // } + // CompRefuelable refuelableComp = this.RefuelableComp; + // if (refuelableComp == null) + // { + // return; + // } + // refuelableComp.Notify_UsedThisTick(); + // } + //} + + //public override void CompTickRare() + //{ + // if (this.PowerTraderComp != null) + // { + // this.PowerTraderComp.PowerOutput = ((this.presenceTicks > 0) ? (-this.PowerTraderComp.Props.PowerConsumption) : (-this.PowerTraderComp.Props.idlePowerDraw)); + // } + //} + + //public override void PostDraw() + //{ + // if (!this.Props.mustBeLayingInToBind && this.boundPawn != null && this.boundPawn.Map == this.parent.Map && this.boundPawn.Deathresting && this.DeathrestGene != null && this.DeathrestGene.BoundComps.Contains(this) && this.CanIncreasePresence) + // { + // Vector3 a = this.boundPawn.CurrentBed().TrueCenter(); + // Vector3 b = this.parent.TrueCenter(); + // a.y = (b.y = AltitudeLayer.SmallWire.AltitudeFor()); + // Matrix4x4 identity = Matrix4x4.identity; + // identity.SetTRS((a + b) / 2f, Quaternion.Euler(0f, a.AngleToFlat(b) + 90f, 0f), new Vector3(1f, 1f, (a - b).MagnitudeHorizontal())); + // Graphics.DrawMesh(MeshPool.plane10, identity, this.HoseMat, 0); + // } + //} + + public void Apply() + { + if (this.boundPawn != null) + { + if (this.Props.hediffToApply != null) + { + this.boundPawn.health.AddHediff(this.Props.hediffToApply, null, null, null); + } + if (this.Props.soulLimitOffset > 0f) + { + Pawn_GeneTracker genes = this.boundPawn.genes; + Gene_Soul gene_Soul = (genes != null) ? genes.GetFirstGeneOfType() : null; + if (gene_Soul != null) + { + gene_Soul.SetMax(gene_Soul.Max + this.Props.soulLimitOffset); + } + } + } + } + + //public void TryIncreasePresence() + //{ + // if (this.CanIncreasePresence) + // { + // if (this.presenceTicks <= 0) + // { + // SoundInfo info = SoundInfo.InMap(this.parent, MaintenanceType.None); + // if (!this.Props.soundWorking.NullOrUndefined() && (this.sustainer == null || this.sustainer.Ended)) + // { + // this.sustainer = this.Props.soundWorking.TrySpawnSustainer(info); + // } + // if (!this.Props.soundStart.NullOrUndefined()) + // { + // this.Props.soundStart.PlayOneShot(info); + // } + // } + // this.presenceTicks++; + // } + //} + + //public void Notify_DeathrestEnded() + //{ + // this.presenceTicks = 0; + // if (this.parent.Spawned) + // { + // if (this.sustainer != null && !this.sustainer.Ended) + // { + // this.sustainer.End(); + // } + // if (!this.Props.soundEnd.NullOrUndefined()) + // { + // this.Props.soundEnd.PlayOneShot(SoundInfo.InMap(this.parent, MaintenanceType.None)); + // } + // } + //} + + //public override string CompInspectStringExtra() + //{ + // string text = null; + // if (this.boundPawn != null && this.DeathrestGene != null) + // { + // text = text + ("BoundTo".Translate() + ": " + this.boundPawn.NameShortColored).Resolve() + string.Format(" ({0}/{1} {2})", this.DeathrestGene.CurrentCapacity, this.DeathrestGene.DeathrestCapacity, "DeathrestCapacity".Translate()); + // if (this.Props.displayTimeActive && this.presenceTicks > 0 && this.DeathrestGene.deathrestTicks > 0) + // { + // float f = Mathf.Clamp01((float)this.presenceTicks / (float)this.DeathrestGene.deathrestTicks); + // text += string.Format("\n{0}: {1} / {2} ({3})\n{4}", new object[] + // { + // "TimeActiveThisDeathrest".Translate(), + // this.presenceTicks.ToStringTicksToPeriod(true, true, true, true, false), + // this.DeathrestGene.deathrestTicks.ToStringTicksToPeriod(true, true, true, true, false), + // f.ToStringPercent(), + // "MinimumNeededToApply".Translate(0.75f.ToStringPercent()) + // }); + // } + // } + // else + // { + // text += "WillBindOnFirstUse".Translate(); + // } + // return text; + //} + + public override void PostExposeData() + { + Scribe_References.Look(ref this.boundPawn, "boundPawn", false); + Scribe_Values.Look(ref this.presenceTicks, "presenceTicks", 0, false); + } + + private Pawn boundPawn; + public int presenceTicks; + [Unsaved(false)] + private CompPowerTrader cachedPowerComp; + [Unsaved(false)] + private CompRefuelable cachedRefuelableComp; + [Unsaved(false)] + private Gene_Deathrest cachedDeathrestGene; + [Unsaved(false)] + private Material cachedHoseMat; + [Unsaved(false)] + private Sustainer sustainer; + } +} diff --git a/Source/New Mech/Comps/CompNecrarchMeetingFire.cs b/Source/New Mech/Comps/CompNecrarchMeetingFire.cs new file mode 100644 index 0000000..605ef48 --- /dev/null +++ b/Source/New Mech/Comps/CompNecrarchMeetingFire.cs @@ -0,0 +1,42 @@ +using System; +using UnityEngine; +using Verse; +using Verse.AI.Group; +using RimWorld; + +namespace MedievalBiotech +{ + [StaticConstructorOnStartup] + public class CompNecrarchMeetingFire : CompFireOverlayBase + { + + public new CompProperties_SanguophageMeetingFire Props + { + get + { + return (CompProperties_SanguophageMeetingFire)this.props; + } + } + + public override void PostDraw() + { + base.PostDraw(); + CompGlower compGlower = this.parent.TryGetComp(); + if (compGlower != null && !compGlower.Glows) + { + return; + } + Vector3 drawPos = this.parent.DrawPos; + drawPos.y += 0.03846154f; + CompSanguophageMeetingFire.RedlightGraphic.Draw(drawPos + this.Props.offset, Rot4.North, this.parent, 0f); + } + + public override bool CompPreventClaimingBy(Faction faction) + { + Lord lord = ((Building)this.parent).GetLord(); + return ((lord != null) ? lord.CurLordToil : null) is LordToil_SanguophageMeeting; + } + + public static readonly Graphic RedlightGraphic = GraphicDatabase.Get("Things/Special/Redlight", ShaderDatabase.TransparentPostLight, Vector2.one, Color.white); + } +} diff --git a/Source/New Mech/Comps/CompProperties/CompProperties_AbilitySoulCost.cs b/Source/New Mech/Comps/CompProperties/CompProperties_AbilitySoulCost.cs new file mode 100644 index 0000000..a616097 --- /dev/null +++ b/Source/New Mech/Comps/CompProperties/CompProperties_AbilitySoulCost.cs @@ -0,0 +1,27 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using Verse; + +namespace MedievalBiotech +{ + public class CompProperties_AbilitySoulCost : CompProperties_AbilityEffect + { + public CompProperties_AbilitySoulCost() + { + this.compClass = typeof(CompAbilityEffect_SoulCost); + } + + public override IEnumerable ExtraStatSummary() + { + yield return "MB_AbilitySoulCost".Translate() + ": " + Mathf.RoundToInt(this.soulCost * 100f); + yield break; + } + + public float soulCost; + } +} \ No newline at end of file diff --git a/Source/New Mech/Comps/CompProperties/CompProperties_AbilitySoulDrain.cs b/Source/New Mech/Comps/CompProperties/CompProperties_AbilitySoulDrain.cs new file mode 100644 index 0000000..747f7e7 --- /dev/null +++ b/Source/New Mech/Comps/CompProperties/CompProperties_AbilitySoulDrain.cs @@ -0,0 +1,27 @@ +using RimWorld; +using System.Collections.Generic; +using Verse; + +namespace MedievalBiotech +{ + public class CompProperties_AbilitySoulDrain : CompProperties_AbilityEffect + { + public CompProperties_AbilitySoulDrain() + { + this.compClass = typeof(CompAbilityEffect_SoulDrain); + } + + public override IEnumerable ExtraStatSummary() + { + yield return "AbilitySoulGain".Translate() + ": " + (this.soulGain * 100f).ToString("F0"); + yield break; + } + + public float soulGain; + public ThoughtDef thoughtDefToGiveTarget; + public ThoughtDef opinionThoughtDefToGiveTarget; + public float resistanceGain; + public float targetBloodLoss = 0.4499f; + + } +} \ No newline at end of file diff --git a/Source/New Mech/Comps/CompProperties/CompProperties_CreateArcanaStone.cs b/Source/New Mech/Comps/CompProperties/CompProperties_CreateArcanaStone.cs new file mode 100644 index 0000000..c1f0da0 --- /dev/null +++ b/Source/New Mech/Comps/CompProperties/CompProperties_CreateArcanaStone.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using RimWorld; +using Verse; + +namespace MedievalBiotech +{ + public class CompProperties_CreateArcanaStone : CompProperties_AbilityEffect + { + public CompProperties_CreateArcanaStone() + { + this.compClass = typeof(CompAbilityEffect_CreateArcanaStone); + } + + public ThingDef stoneCreated; + } +} diff --git a/Source/New Mech/Comps/CompProperties/CompProperties_DeathrestBindable_Soul.cs b/Source/New Mech/Comps/CompProperties/CompProperties_DeathrestBindable_Soul.cs new file mode 100644 index 0000000..dd4a187 --- /dev/null +++ b/Source/New Mech/Comps/CompProperties/CompProperties_DeathrestBindable_Soul.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using Verse; +using RimWorld; + +namespace MedievalBiotech +{ + public class CompProperties_DeathrestBindable_Soul : CompProperties_DeathrestBindable + { + public CompProperties_DeathrestBindable_Soul() + { + this.compClass = typeof(CompDeathrestBindable_Soul); + } + + public float soulLimitOffset; + + } +} diff --git a/Source/New Mech/Comps/CompProperties/CompProperties_MB_InstallImplant.cs b/Source/New Mech/Comps/CompProperties/CompProperties_MB_InstallImplant.cs new file mode 100644 index 0000000..508dd78 --- /dev/null +++ b/Source/New Mech/Comps/CompProperties/CompProperties_MB_InstallImplant.cs @@ -0,0 +1,17 @@ +// Token: 0x0200189B RID: 6299 +using RimWorld; +using Verse; + +namespace MedievalBiotech +{ + public class CompProperties_MB_InstallImplant : CompProperties_UseEffectInstallImplant + { + public CompProperties_MB_InstallImplant() + { + this.compClass = typeof(CompUseEffect_MB_InstallImplant); + } + + public GeneDef requiredGeneDef; + public string summonerType; + } +} \ No newline at end of file diff --git a/Source/New Mech/Comps/CompProperties/CompProperties_UsedGraphic.cs b/Source/New Mech/Comps/CompProperties/CompProperties_UsedGraphic.cs new file mode 100644 index 0000000..7545a1b --- /dev/null +++ b/Source/New Mech/Comps/CompProperties/CompProperties_UsedGraphic.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; +using RimWorld; + +namespace MedievalBiotech +{ + public class CompProperties_UsedGraphic : CompProperties + { + public GraphicData graphicData; + + public CompProperties_UsedGraphic() => this.compClass = typeof(CompUsedGraphic); + } +} diff --git a/Source/New Mech/Comps/CompProperties/HediffCompProperties_GiveHediffsInRange.cs b/Source/New Mech/Comps/CompProperties/HediffCompProperties_GiveHediffsInRange.cs new file mode 100644 index 0000000..bbf3268 --- /dev/null +++ b/Source/New Mech/Comps/CompProperties/HediffCompProperties_GiveHediffsInRange.cs @@ -0,0 +1,32 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace MedievalBiotech +{ + public class HediffCompProperties_GiveHediffsInRangeUndead : HediffCompProperties + { + public HediffCompProperties_GiveHediffsInRangeUndead() + { + this.compClass = typeof(HediffComp_GiveHediffsInRangeUndead); + } + public GeneDef geneDef; + public float range; + + public TargetingParameters targetingParameters; + + public HediffDef hediff; + + public ThingDef mote; + + public bool hideMoteWhenNotDrafted; + + public float initialSeverity = 1f; + + public bool onlyPawnsInSameFaction = true; + } +} diff --git a/Source/New Mech/Comps/CompUseEffect_MB_InstallImplant.cs b/Source/New Mech/Comps/CompUseEffect_MB_InstallImplant.cs new file mode 100644 index 0000000..da77683 --- /dev/null +++ b/Source/New Mech/Comps/CompUseEffect_MB_InstallImplant.cs @@ -0,0 +1,83 @@ +using System; +using Verse; +using RimWorld; +namespace MedievalBiotech +{ + public class CompUseEffect_MB_InstallImplant : CompUseEffect_InstallImplant + { + public new CompProperties_MB_InstallImplant Props + { + get + { + return (CompProperties_MB_InstallImplant)this.props; + } + } + public override AcceptanceReport CanBeUsedBy(Pawn p) + { + if (!ModLister.CheckBiotech("install implant mechlink")) + { + return false; + } + return CheckUsedBy(p); + } + + public override TaggedString ConfirmMessage(Pawn p) + { + if (p.WorkTypeIsDisabled(WorkTypeDefOf.Smithing)) + { + return "DankPyon_ConfirmInstallImplant_Smithing".Translate().Replace("{SUMMONER}", this.Props.summonerType); + } + if (p.WorkTagIsDisabled(WorkTags.Intellectual)) + { + + return "DankPyon_ConfirmInstallImplant_Intellectual".Translate().Replace("{SUMMONER}", this.Props.summonerType); + } + return null; + } + private AcceptanceReport CheckUsedBy(Pawn p) + { + if (!p.IsFreeColonist && !this.Props.allowNonColonists) + { + return "InstallImplantNotAllowedForNonColonists".Translate(); + } + if (p.RaceProps.body.GetPartsWithDef(this.Props.bodyPart).FirstOrFallback(null) == null) + { + return "InstallImplantNoBodyPart".Translate() + ": " + this.Props.bodyPart.LabelShort; + } + if (this.Props.requiresPsychicallySensitive && p.psychicEntropy != null && !p.psychicEntropy.IsPsychicallySensitive) + { + return "InstallImplantPsychicallyDeaf".Translate(); + } + Hediff existingImplant = this.GetExistingImplant(p); + if (this.Props.requiresExistingHediff && existingImplant == null) + { + return "InstallImplantHediffRequired".Translate(this.Props.hediffDef.label); + } + if (existingImplant != null) + { + if (!this.Props.canUpgrade) + { + return "InstallImplantAlreadyInstalled".Translate(); + } + Hediff_Level hediff_Level = (Hediff_Level)existingImplant; + if ((float)hediff_Level.level >= hediff_Level.def.maxSeverity) + { + return "InstallImplantAlreadyMaxLevel".Translate(); + } + if (this.Props.maxSeverity <= (float)hediff_Level.level) + { + return "InstallImplantAlreadyMaxLevel".Translate() + " " + this.Props.maxSeverity; + } + if (this.Props.minSeverity > (float)hediff_Level.level) + { + return "InstallImplantMinLevel".Translate(this.Props.minSeverity); + } + } + if (p.genes.GetGene(this.Props.requiredGeneDef) == null && this.Props.requiredGeneDef != null) + { + return "DankPyon_InstallBloodChaliceHemogenRequired".Translate() + ": " + this.Props.requiredGeneDef.label; + } + return true; + } + } +} diff --git a/Source/New Mech/Comps/CompUseEffect_SoulGem.cs b/Source/New Mech/Comps/CompUseEffect_SoulGem.cs new file mode 100644 index 0000000..c987cfb --- /dev/null +++ b/Source/New Mech/Comps/CompUseEffect_SoulGem.cs @@ -0,0 +1,27 @@ +using System; +using Verse; +using RimWorld; + +namespace MedievalBiotech +{ + public class CompUseEffect_SoulGem : CompUseEffect + { + + public CompProperties_UseEffect Props + { + get + { + return (CompProperties_UseEffect)this.props; + } + } + public override AcceptanceReport CanBeUsedBy(Pawn p) + { + if (!p.genes.HasGene(MB_DefOf.MB_SoulStarved)) + { + return "MB_CantUseSoulGem".Translate(); + } + return true; + } + + } +} diff --git a/Source/New Mech/Comps/CompUsedGraphic.cs b/Source/New Mech/Comps/CompUsedGraphic.cs new file mode 100644 index 0000000..95bf898 --- /dev/null +++ b/Source/New Mech/Comps/CompUsedGraphic.cs @@ -0,0 +1,41 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using Verse; + +namespace MedievalBiotech +{ + public class CompUsedGraphic : ThingComp + { + private CompProperties_UsedGraphic Props => (CompProperties_UsedGraphic)this.props; + + public bool ParentIsFull + { + get + { + if (this.parent is Building_Casket parent && parent.HasAnyContents) + return true; + CompPawnSpawnOnWakeup comp = this.parent.TryGetComp(); + return comp != null && !comp.CanSpawn; + } + } + public override void PostDraw() + { + base.PostDraw(); + if (!this.ParentIsFull) + return; + Mesh mesh = this.Props.graphicData.Graphic.MeshAt(this.parent.Rotation); + Vector3 drawPos = this.parent.DrawPos; + drawPos.y = AltitudeLayer.BuildingOnTop.AltitudeFor(); + //Vector3 vector 3 = Vector3. + //Vector3 vector3 = Vector3.(drawPos, this.Props.graphicData.drawOffset.RotatedBy(this.parent.Rotation)); + Quaternion identity = Quaternion.identity; + Material material = this.Props.graphicData.Graphic.MatAt(this.parent.Rotation); + Graphics.DrawMesh(mesh, drawPos, identity, material, 0); + } + } +} \ No newline at end of file diff --git a/Source/New Mech/Comps/HediffComp_GiveHediffsInRangeGene.cs b/Source/New Mech/Comps/HediffComp_GiveHediffsInRangeGene.cs new file mode 100644 index 0000000..bcaf461 --- /dev/null +++ b/Source/New Mech/Comps/HediffComp_GiveHediffsInRangeGene.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using RimWorld; +using UnityEngine; +using Verse; + +namespace MedievalBiotech +{ + public class HediffComp_GiveHediffsInRangeUndead : HediffComp + { + public HediffCompProperties_GiveHediffsInRangeUndead Props + { + get + { + return (HediffCompProperties_GiveHediffsInRangeUndead)this.props; + } + } + public override void CompPostTick(ref float severityAdjustment) + { + if (!this.parent.pawn.Awake() || this.parent.pawn.health == null || this.parent.pawn.health.InPainShock || !this.parent.pawn.Spawned) + { + return; + } + if (!this.Props.hideMoteWhenNotDrafted || this.parent.pawn.Drafted) + { + if (this.Props.mote != null && (this.mote == null || this.mote.Destroyed)) + { + this.mote = MoteMaker.MakeAttachedOverlay(this.parent.pawn, this.Props.mote, Vector3.zero, 1f, -1f); + } + if (this.mote != null) + { + this.mote.Maintain(); + } + } + IReadOnlyList readOnlyList; + if (this.Props.onlyPawnsInSameFaction && this.parent.pawn.Faction != null) + { + readOnlyList = this.parent.pawn.Map.mapPawns.SpawnedPawnsInFaction(this.parent.pawn.Faction); + } + else + { + readOnlyList = this.parent.pawn.Map.mapPawns.AllPawnsSpawned; + } + foreach (Pawn pawn in readOnlyList) + { + var extension = pawn.def.GetModExtension()?.UndeadMech; + if ((pawn.RaceProps.Humanlike && pawn.genes.HasActiveGene(Props.geneDef) || (pawn.RaceProps.IsMechanoid && (extension == true))) && !pawn.Dead && pawn.health != null && pawn != this.parent.pawn && pawn.Position.DistanceTo(this.parent.pawn.Position) <= this.Props.range && this.Props.targetingParameters.CanTarget(pawn, null)) + { + Hediff hediff = pawn.health.hediffSet.GetFirstHediffOfDef(this.Props.hediff, false); + if (hediff == null) + { + hediff = pawn.health.AddHediff(this.Props.hediff, pawn.health.hediffSet.GetBrain(), null, null); + hediff.Severity = this.Props.initialSeverity; + HediffComp_Link hediffComp_Link = hediff.TryGetComp(); + if (hediffComp_Link != null) + { + hediffComp_Link.drawConnection = true; + hediffComp_Link.other = this.parent.pawn; + } + } + HediffComp_Disappears hediffComp_Disappears = hediff.TryGetComp(); + if (hediffComp_Disappears == null) + { + Log.Error("HediffComp_GiveHediffsInRange has a hediff in props which does not have a HediffComp_Disappears"); + } + else + { + hediffComp_Disappears.ticksToDisappear = 5; + } + } + + } + } + + private Mote mote; + } +} diff --git a/Source/New Mech/Comps/Steam/CompBandNode_Steam.cs b/Source/New Mech/Comps/Steam/CompBandNode_Steam.cs new file mode 100644 index 0000000..ef09991 --- /dev/null +++ b/Source/New Mech/Comps/Steam/CompBandNode_Steam.cs @@ -0,0 +1,363 @@ +using System.Collections.Generic; +using UnityEngine; +using Verse; +using Verse.Sound; +using RimWorld; + +namespace MedievalBiotech +{ + [StaticConstructorOnStartup] + public class CompBandNode_Steam : ThingComp + { + private CompResourceTrader_Steam SteamTrader + { + get + { + return this.parent.TryGetComp(); + } + } + + public CompProperties_BandNode Props + { + get + { + return (CompProperties_BandNode)this.props; + } + } + + private int RetuneTimeTicks + { + get + { + return (int)(60000f * this.Props.retuneDays); + } + } + + private int TuningTimeTicks + { + get + { + return (int)(this.Props.tuneSeconds * 60f); + } + } + + private BandNodeState State + { + get + { + if (this.tunedTo != null && this.tuningTo != null) + { + return BandNodeState.Retuning; + } + if (this.tuningTo != null) + { + return BandNodeState.Tuning; + } + if (this.tunedTo != null) + { + return BandNodeState.Tuned; + } + return BandNodeState.Untuned; + } + } + + public override void PostSpawnSetup(bool respawningAfterLoad) + { + if (!ModLister.CheckBiotech("Band node")) + { + this.parent.Destroy(DestroyMode.Vanish); + return; + } + base.PostSpawnSetup(respawningAfterLoad); + } + + public override void PostExposeData() + { + Scribe_References.Look(ref this.tunedTo, "tunedTo", false); + Scribe_References.Look(ref this.tuningTo, "tuningTo", false); + Scribe_Values.Look(ref this.tuningTimeLeft, "tuningTimeLeft", 0, false); + } + + public override IEnumerable CompGetGizmosExtra() + { + Command_Action command_Action = new Command_Action + { + defaultLabel = (this.tunedTo == null) ? "BandNodeTuneTo".Translate() + "..." : "BandNodeRetuneTo".Translate() + "...", + defaultDesc = (this.tunedTo == null) + ? "BandNodeTuningDesc".Translate("PeriodSeconds".Translate(this.Props.tuneSeconds)) + : "BandNodeRetuningDesc".Translate(this.Props.retuneDays + " " + "Days".Translate()), + icon = ContentFinder.Get("UI/Gizmos/BandNodeTuning", true) + }; + + command_Action.onHover += delegate () + { + Pawn pawn2 = (this.tuningTo != null) ? this.tuningTo : this.tunedTo; + if (pawn2 != null) + { + GenDraw.DrawLineBetween(this.parent.DrawPos, pawn2.DrawPos); + } + }; + + bool flag = false; + foreach (Pawn pawn in this.parent.Map.mapPawns.AllPawnsSpawned) + { + if (MechanitorUtility.IsMechanitor(pawn) && this.tunedTo != pawn && this.tuningTo != pawn) + { + flag = true; + break; + } + } + command_Action.Disabled = !flag; + + command_Action.action += delegate () + { + List list = new List(); + + foreach (Pawn pawn in this.parent.Map.mapPawns.AllPawnsSpawned) + { + if (MechanitorUtility.IsMechanitor(pawn)) + { + List bandNodes = new List(); + + foreach (object obj in Find.Selector.SelectedObjects) + { + Thing thing = obj as Thing; + if (thing != null) + { + CompBandNode_Steam bandNode = thing.TryGetComp(); + if (bandNode != null && bandNode.tunedTo != pawn && bandNode.tuningTo != pawn) + { + bandNodes.Add(bandNode); + } + } + } + + if (bandNodes.Count > 0) + { + string text = pawn.Name.ToStringFull; + bool allUntuned = true; + bool allTuned = true; + + foreach (CompBandNode_Steam b in bandNodes) + { + if (b.tunedTo != null) + { + allUntuned = false; + } + else + { + allTuned = false; + } + } + + if (!allUntuned && !allTuned) + { + continue; + } + + if (this.tunedTo == null) + { + text += " (" + this.Props.tuneSeconds + " " + "SecondsLower".Translate() + ")"; + } + else + { + text += " (" + this.RetuneTimeTicks.ToStringTicksToPeriod(true, false, true, true, false) + ")"; + } + + Pawn localPawn = pawn; + list.Add(new FloatMenuOption(text, delegate () + { + foreach (CompBandNode_Steam compBandNode in bandNodes) + { + compBandNode.TuneTo(localPawn); + } + }, MenuOptionPriority.Default, null, null, 0f, null, null, true, 0)); + } + } + } + Find.WindowStack.Add(new FloatMenu(list)); + }; + + yield return command_Action; + + if (DebugSettings.ShowDevGizmos) + { + yield return new Command_Action + { + defaultLabel = "DEV: complete tuning", + action = delegate () + { + this.tuningTimeLeft = 0; + } + }; + } + } + + + public void TuneTo(Pawn pawn) + { + this.tuningTimeLeft = ((this.tunedTo == null) ? this.TuningTimeTicks : this.RetuneTimeTicks); + this.tuningTo = pawn; + } + + public override void PostDraw() + { + base.PostDraw(); + BandNodeState state = this.State; + Material material; + if (state != BandNodeState.Untuned) + { + if (state == BandNodeState.Tuned) + { + material = CompBandNode_Steam.TunedMaterial; + } + else + { + material = CompBandNode_Steam.TuningMaterial; + } + } + else + { + material = CompBandNode_Steam.UntunedMaterial; + } + Vector3 s = new Vector3(CompBandNode_Steam.TuningBarSize.x, 1f, CompBandNode_Steam.TuningBarSize.y); + Vector3 pos = this.parent.DrawPos + new Vector3(0f, 0f, -0.4f); + pos.y = this.parent.def.altitudeLayer.AltitudeFor() + 0.03846154f; + Matrix4x4 matrix = default(Matrix4x4); + matrix.SetTRS(pos, this.parent.Rotation.AsQuat, s); + Graphics.DrawMesh(MeshPool.plane10, matrix, material, 0); + } + + public override void CompTick() + { + if (this.tunedTo != null || this.tuningTo != null) + { + SteamTrader.UsedLastTick = true; + } + if (this.tunedTo != null && this.tunedTo.Dead) + { + this.tunedTo = null; + } + if (this.tuningTo != null && this.tuningTo.Dead) + { + this.tuningTo = null; + } + if (this.SteamTrader != null && !this.SteamTrader.UsedLastTick) + { + Effecter effecter = this.effecter; + if (effecter != null) + { + effecter.Cleanup(); + } + this.effecter = null; + return; + } + if (this.tuningTo != null) + { + this.tuningTimeLeft--; + if (this.tuningTimeLeft <= 0) + { + this.tunedTo = this.tuningTo; + this.tuningTo = null; + if (this.Props.tuningCompleteSound != null) + { + this.Props.tuningCompleteSound.PlayOneShot(this.parent); + } + } + } + if (this.tuningTo == null && this.tunedTo != null && !this.tunedTo.health.hediffSet.HasHediff(this.Props.hediff, false)) + { + this.tunedTo.health.AddHediff(this.Props.hediff, this.tunedTo.health.hediffSet.GetBrain(), null, null); + } + if (this.State == BandNodeState.Untuned) + { + if (this.effecter == null || this.effecter.def != this.Props.untunedEffect) + { + Effecter effecter2 = this.effecter; + if (effecter2 != null) + { + effecter2.Cleanup(); + } + this.effecter = this.Props.untunedEffect.Spawn(); + } + } + else if (this.State == BandNodeState.Tuned) + { + if (this.effecter == null || this.effecter.def != this.Props.tunedEffect) + { + Effecter effecter3 = this.effecter; + if (effecter3 != null) + { + effecter3.Cleanup(); + } + this.effecter = this.Props.tunedEffect.Spawn(); + } + } + else if (this.State == BandNodeState.Tuning) + { + if (this.effecter == null || this.effecter.def != this.Props.tuningEffect) + { + Effecter effecter4 = this.effecter; + if (effecter4 != null) + { + effecter4.Cleanup(); + } + this.effecter = this.Props.tuningEffect.Spawn(); + } + } + else if (this.State == BandNodeState.Retuning) + { + if (this.effecter == null || this.effecter.def != this.Props.retuningEffect) + { + Effecter effecter5 = this.effecter; + if (effecter5 != null) + { + effecter5.Cleanup(); + } + this.effecter = this.Props.retuningEffect.Spawn(); + } + } + else + { + Effecter effecter6 = this.effecter; + if (effecter6 != null) + { + effecter6.Cleanup(); + } + this.effecter = null; + } + if (this.effecter != null) + { + this.effecter.EffectTick(this.parent, this.parent); + } + } + + public override string CompInspectStringExtra() + { + string t = null; + if (this.tuningTo != null) + { + return "BandNodeTuningTo".Translate() + ": " + this.tuningTo.Name.ToStringFull + " - " + this.tuningTimeLeft.ToStringTicksToPeriod(true, false, true, true, false) + t; + } + return "BandNodeTunedTo".Translate() + ": " + ((this.tunedTo == null) ? "Nobody".Translate().Resolve() : this.tunedTo.Name.ToStringFull) + t; + } + + private static readonly Material UntunedMaterial = SolidColorMaterials.SimpleSolidColorMaterial(Color.red, false); + + private static readonly Material TuningMaterial = SolidColorMaterials.SimpleSolidColorMaterial(Color.yellow, false); + + private static readonly Material TunedMaterial = SolidColorMaterials.SimpleSolidColorMaterial(Color.green, false); + + private static readonly Vector2 TuningBarSize = new Vector3(0.255f, 0.035f); + + private const float TuningBarYOffset = -0.4f; + + public Pawn tunedTo; + + public int tuningTimeLeft; + + public Pawn tuningTo; + + private Effecter effecter; + } +} diff --git a/Source/New Mech/Comps/Steam/CompInnerThing_SteamCharger.cs b/Source/New Mech/Comps/Steam/CompInnerThing_SteamCharger.cs new file mode 100644 index 0000000..2a80915 --- /dev/null +++ b/Source/New Mech/Comps/Steam/CompInnerThing_SteamCharger.cs @@ -0,0 +1,19 @@ +using RimWorld; +using Verse; + +namespace MedievalBiotech +{ + public class CompInnerThing_SteamCharger : CompThingContainer + { + + public override string CompInspectStringExtra() + { + return null; + } + + public override void PostDeSpawn(Map map) + { + this.innerContainer.TryDropAll(this.parent.Position, map, ThingPlaceMode.Near, null, null, true); + } + } +} diff --git a/Source/New Mech/Comps/Steam/CompPowerPlantNeedResource_Steam.cs b/Source/New Mech/Comps/Steam/CompPowerPlantNeedResource_Steam.cs new file mode 100644 index 0000000..da88c75 --- /dev/null +++ b/Source/New Mech/Comps/Steam/CompPowerPlantNeedResource_Steam.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; +using System.Linq; +using PipeSystem; + +namespace MedievalBiotech +{ + public class CompPowerPlantNeedResource_Steam : CompPowerPlantNeedResource + { + private List compResourceTraders; + + public override void PostSpawnSetup(bool respawningAfterLoad) + { + this.compResourceTraders = this.parent.GetComps().ToList(); + base.PostSpawnSetup(respawningAfterLoad); + } + + protected override float DesiredPowerOutput + { + get + { + for (int index = 0; index < compResourceTraders.Count; ++index) + { + if (!this.compResourceTraders[index].ResourceOn) + return 0.0f; + } + return base.DesiredPowerOutput; + } + } + + public override string CompInspectStringExtra() + { + return null; + } + } +} diff --git a/Source/New Mech/Comps/Steam/CompResourceTrader_Steam.cs b/Source/New Mech/Comps/Steam/CompResourceTrader_Steam.cs new file mode 100644 index 0000000..6bbef93 --- /dev/null +++ b/Source/New Mech/Comps/Steam/CompResourceTrader_Steam.cs @@ -0,0 +1,30 @@ +using RimWorld; +using System.Text; +using Verse; +using PipeSystem; + +namespace MedievalBiotech +{ + public class CompResourceTrader_Steam : CompResourceTrader + { + public override string CompInspectStringExtra() + { + StringBuilder sb = new StringBuilder(); + if (this.Consumption >= 0f) + { + sb.AppendFormat("{0} {1:##0} {2}/d", "PipeSystem_ResourceNeeded".Translate(this.Resource.name), (this.Consumption / 100.0 * 60000.0), this.Resource.unit); + } + else + { + sb.AppendFormat("{0} {1:##0} {2}/d", "PipeSystem_ResourceOutput".Translate(this.Resource.name), this.ResourceOn ? -(this.Consumption / 100.0 * 60000.0) : 0.0, this.Resource.unit); + } + if (!ResourceOn) + { + sb.AppendInNewLine("MB_PipeSystem_NotConnected".Translate()); + } + if (DebugSettings.ShowDevGizmos) + sb.AppendInNewLine(this.DebugString); + return sb.ToString().Trim(); + } + } +} diff --git a/Source/New Mech/Gizmos/GeneGizmo_ResourceSoulStarve.cs b/Source/New Mech/Gizmos/GeneGizmo_ResourceSoulStarve.cs new file mode 100644 index 0000000..5b8be0f --- /dev/null +++ b/Source/New Mech/Gizmos/GeneGizmo_ResourceSoulStarve.cs @@ -0,0 +1,178 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using Verse; +using Verse.Sound; +using RimWorld; + +namespace MedievalBiotech +{ + [StaticConstructorOnStartup] + public class GeneGizmo_ResourceSoulStarve : GeneGizmo_Resource + { + public GeneGizmo_ResourceSoulStarve(Gene_Resource gene, List drainGenes, Color barColor, Color barHighlightColor) : base(gene, drainGenes, barColor, barHighlightColor) + { + } + + public override GizmoResult GizmoOnGUI(Vector2 topLeft, float maxWidth, GizmoRenderParms parms) + { + GizmoResult result = base.GizmoOnGUI(topLeft, maxWidth, parms); + float num = Mathf.Repeat(Time.time, 0.85f); + float num2 = 1f; + if (num < 0.1f) + { + num2 = num / 0.1f; + } + else if (num >= 0.25f) + { + num2 = 1f - (num - 0.25f) / 0.6f; + } + MainTabWindow_Inspect mainTabWindow_Inspect = (MainTabWindow_Inspect)MainButtonDefOf.Inspect.TabWindow; + Command_Ability command_Ability; + if ((command_Ability = (((mainTabWindow_Inspect != null) ? mainTabWindow_Inspect.LastMouseoverGizmo : null) as Command_Ability)) != null && this.gene.Max != 0f) + { + using (List.Enumerator enumerator = command_Ability.Ability.EffectComps.GetEnumerator()) + { + while (enumerator.MoveNext()) + { + CompAbilityEffect_SoulCost compAbilityEffect_SoulCost; + if ((compAbilityEffect_SoulCost = (enumerator.Current as CompAbilityEffect_SoulCost)) != null && compAbilityEffect_SoulCost.Props.soulCost > 1E-45f) + { + Rect rect = this.barRect.ContractedBy(3f); + float width = rect.width; + float num3 = this.gene.Value / this.gene.Max; + rect.xMax = rect.xMin + width * num3 + 30; + float num4 = Mathf.Min(compAbilityEffect_SoulCost.Props.soulCost / this.gene.Max, 1f); + rect.xMin = Mathf.Max(rect.xMin, rect.xMax - width * num4); + GUI.color = new Color(1f, 1f, 1f, num2 * 0.7f); + GenUI.DrawTextureWithMaterial(rect, GeneGizmo_ResourceSoulStarve.SoulCostTex, null, default(Rect)); + GUI.color = Color.white; + break; + } + } + } + } + return result; + } + + public override void DrawHeader(Rect headerRect, ref bool mouseOverElement) + { + Gene_Soul soulGene; + if (this.IsDraggable && (soulGene = (this.gene as Gene_Soul)) != null) + { + headerRect.xMax -= 24f; + Rect rect = new Rect(headerRect.xMax, headerRect.y, 24f, 24f); + Widgets.DefIcon(rect, MB_DefOf.MB_CorruptedSoulGemBasic, null, 1f, null, false, null, null, null); + GUI.DrawTexture(new Rect(rect.center.x, rect.y, rect.width / 2f, rect.height / 2f), soulGene.soulBasicGemsAllowed ? Widgets.CheckboxOnTex : Widgets.CheckboxOffTex); + if (Widgets.ButtonInvisible(rect, true)) + { + soulGene.soulBasicGemsAllowed = !soulGene.soulBasicGemsAllowed; + if (soulGene.soulBasicGemsAllowed) + { + SoundDefOf.Tick_High.PlayOneShotOnCamera(null); + } + else + { + SoundDefOf.Tick_Low.PlayOneShotOnCamera(null); + } + } + if (Mouse.IsOver(rect)) + { + Widgets.DrawHighlight(rect); + string onOff = (soulGene.soulBasicGemsAllowed ? "On" : "Off").Translate().ToString().UncapitalizeFirst(); + TooltipHandler.TipRegion(rect, () => "MB_AutoTakeSoulDesc".Translate(this.gene.pawn.Named("PAWN"), soulGene.PostProcessValue(soulGene.targetValue).Named("MIN"), onOff.Named("ONOFF")).Resolve(), 828267371); + mouseOverElement = true; + } + // Adds Widget for MB_ArcanaStone + headerRect.xMax -= 24f; + Rect rect4 = new Rect(headerRect.xMax, headerRect.y, 24f, 24f); + Widgets.DefIcon(rect4, MB_DefOf.MB_ArcanaStone, null, 1f, null, false, null, null, null); + GUI.DrawTexture(new Rect(rect4.center.x, rect4.y, rect4.width / 2f, rect4.height / 2f), soulGene.soulArcanaGemsAllowed ? Widgets.CheckboxOnTex : Widgets.CheckboxOffTex); + if (Widgets.ButtonInvisible(rect4, true)) + { + soulGene.soulArcanaGemsAllowed = !soulGene.soulArcanaGemsAllowed; + if (soulGene.soulArcanaGemsAllowed) + { + SoundDefOf.Tick_High.PlayOneShotOnCamera(null); + } + else + { + SoundDefOf.Tick_Low.PlayOneShotOnCamera(null); + } + } + if (Mouse.IsOver(rect4)) + { + Widgets.DrawHighlight(rect4); + string onOff = (soulGene.soulArcanaGemsAllowed ? "On" : "Off").Translate().ToString().UncapitalizeFirst(); + TooltipHandler.TipRegion(rect4, () => "MB_AutoTakeSoulDesc".Translate(this.gene.pawn.Named("PAWN"), soulGene.PostProcessValue(soulGene.targetValue).Named("MIN"), onOff.Named("ONOFF")).Resolve(), 828267373); + mouseOverElement = true; + } + } + base.DrawHeader(headerRect, ref mouseOverElement); + } + + public override string GetTooltip() + { + this.tmpDrainGenes.Clear(); + string text = string.Format("{0}: {1} / {2}\n", this.gene.ResourceLabel.CapitalizeFirst().Colorize(ColoredText.TipSectionTitleColor), this.gene.ValueForDisplay, this.gene.MaxForDisplay); + if (this.gene.pawn.IsColonistPlayerControlled || this.gene.pawn.IsPrisonerOfColony) + { + if (this.gene.targetValue <= 0f) + { + text += "MB_NeverConsumeSoul".Translate().ToString(); + } + else + { + text = text + ("MB_ConsumeSoulBelow".Translate() + ": ") + this.gene.PostProcessValue(this.gene.targetValue); + } + } + if (!this.drainGenes.NullOrEmpty()) + { + float num = 0f; + foreach (IGeneResourceDrain geneResourceDrain in this.drainGenes) + { + if (geneResourceDrain.CanOffset) + { + this.tmpDrainGenes.Add(new Pair(geneResourceDrain, geneResourceDrain.ResourceLossPerDay)); + num += geneResourceDrain.ResourceLossPerDay; + } + } + if (num != 0f) + { + string text2 = (num < 0f) ? "RegenerationRate".Translate() : "DrainRate".Translate(); + text = string.Concat(new string[] + { + text, + "\n\n", + text2, + ": ", + "PerDay".Translate(Mathf.Abs(this.gene.PostProcessValue(num))).Resolve() + }); + foreach (Pair pair in this.tmpDrainGenes) + { + text = string.Concat(new string[] + { + text, + "\n - ", + pair.First.DisplayLabel.CapitalizeFirst(), + ": ", + "PerDay".Translate(this.gene.PostProcessValue(-pair.Second).ToStringWithSign()).Resolve() + }); + } + } + } + if (!this.gene.def.resourceDescription.NullOrEmpty()) + { + text = text + "\n\n" + this.gene.def.resourceDescription.Formatted(this.gene.pawn.Named("PAWN")).Resolve(); + } + return text; + } + + private static readonly Texture2D SoulCostTex = SolidColorMaterials.NewSolidColorTexture(new Color(0.462f, 0.34f, 0.57f)); + + private const float TotalPulsateTime = 0.85f; + + private List> tmpDrainGenes = new List>(); + + } +} diff --git a/Source/New Mech/Gizmos/SanguineBandwidthGizmo.cs b/Source/New Mech/Gizmos/SanguineBandwidthGizmo.cs new file mode 100644 index 0000000..d45cbac --- /dev/null +++ b/Source/New Mech/Gizmos/SanguineBandwidthGizmo.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using Verse; +using RimWorld; + +namespace MedievalBiotech +{ + [StaticConstructorOnStartup] + public class SanguineBandwidthGizmo : Gizmo + { + public override bool Visible + { + get + { + return Find.Selector.SelectedPawns.Count == 1; + } + } + + public SanguineBandwidthGizmo(Pawn_MechanitorTracker tracker) + { + this.tracker = tracker; + this.Order = -90f; + } + + public override GizmoResult GizmoOnGUI(Vector2 topLeft, float maxWidth, GizmoRenderParms parms) + { + if (!ModLister.CheckBiotech("Mechanitor bandwidth gizmo")) + { + return new GizmoResult(GizmoState.Clear); + } + Rect rect = new Rect(topLeft.x, topLeft.y, this.GetWidth(maxWidth), 75f); + Rect rect2 = rect.ContractedBy(6f); + Widgets.DrawWindowBackground(rect); + int totalBandwidth = this.tracker.TotalBandwidth; + int usedBandwidth = this.tracker.UsedBandwidth; + string text = usedBandwidth.ToString("F0") + " / " + totalBandwidth.ToString("F0"); + TaggedString taggedString = "Bandwidth".Translate().Colorize(ColoredText.TipSectionTitleColor) + ": " + text + "\n\n" + "BandwidthGizmoTip".Translate(); + int usedBandwidthFromSubjects = this.tracker.UsedBandwidthFromSubjects; + if (usedBandwidthFromSubjects > 0) + { + taggedString += "\n\n" + ("BandwidthUsage".Translate() + ": ") + usedBandwidthFromSubjects; + IEnumerable entries = (from p in this.tracker.OverseenPawns + where !p.IsGestating() + group p by p.kindDef).Select(delegate (IGrouping p) + { + object[] array = new object[5]; + array[0] = p.Key.LabelCap + " x"; + array[1] = p.Count(); + array[2] = " (+"; + array[3] = p.Sum((Pawn mech) => mech.GetStatValue(StatDefOf.BandwidthCost, true, -1)); + array[4] = ")"; + return string.Concat(array); + }); + taggedString += "\n\n" + entries.ToLineList(" - ", false); + } + int usedBandwidthFromGestation = this.tracker.UsedBandwidthFromGestation; + if (usedBandwidthFromGestation > 0) + { + taggedString += "\n\n" + "MechGestationBandwidthUsed".Translate() + ": " + usedBandwidthFromGestation; + IEnumerable entries2 = (from p in this.tracker.OverseenPawns + where p.IsGestating() + group p by p.kindDef).Select(delegate (IGrouping p) + { + object[] array = new object[5]; + array[0] = p.Key.LabelCap + " x"; + array[1] = p.Count(); + array[2] = " (+"; + array[3] = p.Sum((Pawn mech) => mech.GetStatValue(StatDefOf.BandwidthCost, true, -1)); + array[4] = ")"; + return string.Concat(array); + }); + taggedString += "\n\n" + entries2.ToLineList(" - ", false); + } + TooltipHandler.TipRegion(rect, taggedString); + Text.Font = GameFont.Small; + Text.Anchor = TextAnchor.UpperLeft; + Rect rect3 = new Rect(rect2.x, rect2.y, rect2.width, 20f); + Widgets.Label(rect3, "Bandwidth".Translate()); + Text.Font = GameFont.Small; + Text.Anchor = TextAnchor.UpperRight; + Widgets.Label(rect3, text); + Text.Anchor = TextAnchor.UpperLeft; + int num = Mathf.Max(usedBandwidth, totalBandwidth); + Rect rect4 = new Rect(rect2.x, rect3.yMax + 6f, rect2.width, rect2.height - rect3.height - 6f); + int num2 = 2; + int num3 = Mathf.FloorToInt(rect4.height / (float)num2); + int num4 = Mathf.FloorToInt(rect4.width / (float)num3); + int num5 = 0; + while (num2 * num4 < num) + { + num2++; + num3 = Mathf.FloorToInt(rect4.height / (float)num2); + num4 = Mathf.FloorToInt(rect4.width / (float)num3); + num5++; + if (num5 >= 1000) + { + Log.Error("Failed to fit bandwidth cells into gizmo rect."); + return new GizmoResult(GizmoState.Clear); + } + } + int num6 = Mathf.FloorToInt(rect4.width / (float)num3); + int num7 = num2; + float num8 = (rect4.width - (float)(num6 * num3)) / 2f; + int num9 = 0; + int usedBandwidthFromGestation2 = this.tracker.UsedBandwidthFromGestation; + int num10 = (num7 <= 2) ? 4 : 2; + for (int i = 0; i < num7; i++) + { + for (int j = 0; j < num6; j++) + { + num9++; + Rect rect5 = new Rect(rect4.x + (float)(j * num3) + num8, rect4.y + (float)(i * num3), (float)num3, (float)num3).ContractedBy(2f); + if (num9 <= num) + { + if (num9 <= usedBandwidthFromGestation2) + { + Widgets.DrawRectFast(rect5, SanguineBandwidthGizmo.EmptyBlockColor, null); + Widgets.DrawRectFast(rect5.ContractedBy((float)num10), SanguineBandwidthGizmo.FilledBlockColor, null); + } + else if (num9 <= usedBandwidth) + { + Widgets.DrawRectFast(rect5, (num9 <= totalBandwidth) ? SanguineBandwidthGizmo.FilledBlockColor : SanguineBandwidthGizmo.ExcessBlockColor, null); + } + else + { + Widgets.DrawRectFast(rect5, SanguineBandwidthGizmo.EmptyBlockColor, null); + } + } + } + } + return new GizmoResult(GizmoState.Clear); + } + + public override float GetWidth(float maxWidth) + { + return 136f; + } + + public const int InRectPadding = 6; + private const int CellPadding = 2; + private const float Width = 136f; + private const int StartingBandwidthRows = 2; + private static readonly Color EmptyBlockColor = new Color(0.3f, 0.3f, 0.3f, 1f); + private static readonly Color FilledBlockColor = ColorLibrary.Green; + private static readonly Color ExcessBlockColor = ColorLibrary.Red; + private const int HeaderHeight = 20; + private Pawn_MechanitorTracker tracker; + } +} diff --git a/Source/New Mech/Harmony Patches/Building_MechCharger_CanPawnChargeCurrently.cs b/Source/New Mech/Harmony Patches/Building_MechCharger_CanPawnChargeCurrently.cs new file mode 100644 index 0000000..77470fb --- /dev/null +++ b/Source/New Mech/Harmony Patches/Building_MechCharger_CanPawnChargeCurrently.cs @@ -0,0 +1,26 @@ +using HarmonyLib; +using RimWorld; +using Verse; +using Verse.AI; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(Building_MechCharger), "CanPawnChargeCurrently")] + public static class Building_MechCharger_CanPawnChargeCurrently + { + public static bool Prefix(ref bool __result, Building_MechCharger __instance, Pawn pawn) + { + if (__instance is Building_SteamCharger steamCharger) + { + var extension = pawn.def.GetModExtension(); + if (extension != null && extension.ArtificeMech) + { + __result = steamCharger.CanPawnChargeCurrentlySteam(pawn); + + return false; + } + } + return true; + } + } +} \ No newline at end of file diff --git a/Source/New Mech/Harmony Patches/Building_MechCharger_IsCompatibleWithCharger_Patch.cs b/Source/New Mech/Harmony Patches/Building_MechCharger_IsCompatibleWithCharger_Patch.cs new file mode 100644 index 0000000..ae32bde --- /dev/null +++ b/Source/New Mech/Harmony Patches/Building_MechCharger_IsCompatibleWithCharger_Patch.cs @@ -0,0 +1,34 @@ +using RimWorld; +using System; +using HarmonyLib; +using Verse; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(Building_MechCharger), nameof(Building_MechCharger.IsCompatibleWithCharger), new Type[] { typeof(PawnKindDef) })] + public static class Building_MechCharger_IsCompatibleWithCharger_Patch + { + public static bool Prefix(ref bool __result, Building_MechCharger __instance, PawnKindDef kindDef) + { + if (__instance is Building_SteamCharger steamCharger) + { + __result = steamCharger.IsCompatibleWithSteamCharger(kindDef); + return false; + } + return true; + } + + public static void Postfix(ref bool __result, Building_MechCharger __instance, PawnKindDef kindDef) + { + if (__instance.GetType() == typeof(Building_MechCharger)) + { + var extension = kindDef.race.GetModExtension(); + if (extension != null) + { + __result = false; + } + } + } + + } +} diff --git a/Source/New Mech/Harmony Patches/CompDeathrestBindable_Apply_Patch.cs b/Source/New Mech/Harmony Patches/CompDeathrestBindable_Apply_Patch.cs new file mode 100644 index 0000000..58050b0 --- /dev/null +++ b/Source/New Mech/Harmony Patches/CompDeathrestBindable_Apply_Patch.cs @@ -0,0 +1,29 @@ +using HarmonyLib; +using RimWorld; +using Verse; +using Verse.AI; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(CompDeathrestBindable), "Apply")] + public static class CompDeathrestBindable_Apply_Patch + { + public static void Postfix(CompDeathrestBindable __instance) + { + if (__instance.boundPawn == null) + { + return; + } + var extension = __instance.parent.def.GetModExtension(); + if (extension?.soulGainOffset == null) + { + return; + } + Gene_Soul gene_Soul = __instance.boundPawn.genes?.GetFirstGeneOfType(); + if (gene_Soul != null) + { + gene_Soul.SetMax(gene_Soul.Max + extension.soulGainOffset); + } + } + } +} diff --git a/Source/New Mech/Harmony Patches/JobGiver_GetEnergy_Charger_GetClosestCharge.cs b/Source/New Mech/Harmony Patches/JobGiver_GetEnergy_Charger_GetClosestCharge.cs new file mode 100644 index 0000000..87fecd3 --- /dev/null +++ b/Source/New Mech/Harmony Patches/JobGiver_GetEnergy_Charger_GetClosestCharge.cs @@ -0,0 +1,22 @@ +using HarmonyLib; +using RimWorld; +using Verse; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(JobGiver_GetEnergy_Charger ), "GetClosestCharger")] + public static class JobGiver_GetEnergy_Charger_GetClosestCharger + { + public static bool Prefix(ref Building_MechCharger __result, Pawn mech, Pawn carrier, bool forced) + { + var extension = mech.def.GetModExtension(); + if (extension != null && extension.ArtificeMech) + { + __result = Utility.GetClosestCharger(carrier, mech, forced); + return false; + } + return true; + } + + } +} diff --git a/Source/New Mech/Harmony Patches/MechBill_ShouldDoNow_Patch .cs b/Source/New Mech/Harmony Patches/MechBill_ShouldDoNow_Patch .cs new file mode 100644 index 0000000..8b451fd --- /dev/null +++ b/Source/New Mech/Harmony Patches/MechBill_ShouldDoNow_Patch .cs @@ -0,0 +1,27 @@ +using HarmonyLib; +using RimWorld; +using Verse; +using Verse.AI; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(Bill_Mech), "ShouldDoNow")] + public static class MechBill_ShouldDoNow_Patch + { + public static void Postfix(ref bool __result, Bill_Mech __instance) + { + if (__result != null) + { + Pawn pawn = __instance.boundPawn; + if (pawn != null) + { + if (Utility.IsSanguinMage(pawn) || Utility.IsNecromancer(pawn)) + { + JobFailReason.Is("NotAMechanitor".Translate(), null); + __result = false; + } + } + } + } + } +} diff --git a/Source/New Mech/Harmony Patches/MechanitorUtility_CanControlMech_Patch.cs b/Source/New Mech/Harmony Patches/MechanitorUtility_CanControlMech_Patch.cs new file mode 100644 index 0000000..bae72b0 --- /dev/null +++ b/Source/New Mech/Harmony Patches/MechanitorUtility_CanControlMech_Patch.cs @@ -0,0 +1,22 @@ +using HarmonyLib; +using RimWorld; +using Verse; +using Verse.AI; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(MechanitorUtility), "CanControlMech")] + public static class MechanitorUtility_CanControlMech_Patch + { + public static bool Prefix(Pawn pawn, Pawn mech) + { + var extension = pawn.def.GetModExtension(); + if (extension == null) return true; + + if (extension.UndeadMech) return Utility.IsNecromancer(pawn); + if (extension.DemonMech) return Utility.IsSanguinMage(pawn); + + return true; + } + } +} \ No newline at end of file diff --git a/Source/New Mech/Harmony Patches/MechanitorUtility_ShouldBeMechanitor_Patch.cs b/Source/New Mech/Harmony Patches/MechanitorUtility_ShouldBeMechanitor_Patch.cs new file mode 100644 index 0000000..49b4fbc --- /dev/null +++ b/Source/New Mech/Harmony Patches/MechanitorUtility_ShouldBeMechanitor_Patch.cs @@ -0,0 +1,20 @@ +using HarmonyLib; +using RimWorld; +using Verse; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(MechanitorUtility), "ShouldBeMechanitor")] + public static class MechanitorUtility_ShouldBeMechanitor_Patch + { + public static bool Prefix(ref bool __result, Pawn pawn) + { + if (Utility.IsSanguinMage(pawn) || Utility.IsNecromancer(pawn)) + { + __result = true; + return false; + } + return true; + } + } +} diff --git a/Source/New Mech/Harmony Patches/ThingListGroupHelper_Includes_Patch.cs b/Source/New Mech/Harmony Patches/ThingListGroupHelper_Includes_Patch.cs new file mode 100644 index 0000000..f6c3b77 --- /dev/null +++ b/Source/New Mech/Harmony Patches/ThingListGroupHelper_Includes_Patch.cs @@ -0,0 +1,18 @@ +using HarmonyLib; +using Verse; + +namespace MedievalBiotech +{ + //[HarmonyPatch(typeof(ThingListGroupHelper))] + //[HarmonyPatch("Includes")] + //public static class ThingListGroupHelper_Includes_Patch + //{ + // public static void Postfix(ref bool __result, ThingRequestGroup group, ThingDef def) + // { + // if (group == ThingRequestGroup.MechCharger) + // { + // __result = (__result || def.thingClass == typeof(Building_SteamCharger)); + // } + // } + //} +} diff --git a/Source/New Mech/Harmony Patches/WorkGiver_HaulMechToCharger_HasJobOnThing_Patch.cs b/Source/New Mech/Harmony Patches/WorkGiver_HaulMechToCharger_HasJobOnThing_Patch.cs new file mode 100644 index 0000000..f4a851c --- /dev/null +++ b/Source/New Mech/Harmony Patches/WorkGiver_HaulMechToCharger_HasJobOnThing_Patch.cs @@ -0,0 +1,53 @@ +using HarmonyLib; +using RimWorld; +using Verse; +using Verse.AI; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(WorkGiver_HaulMechToCharger), "HasJobOnThing")] + public static class WorkGiver_HaulMechToCharger_HasJobOnThing_Patch + { + public static bool Prefix(ref bool __result, WorkGiver_HaulMechToCharger __instance, Pawn pawn, Thing t, bool forced) + { + + if (__instance == null) return false; + if (t is not Pawn mech) return true; + + var extension = mech.def.GetModExtension(); + if (extension != null && (extension.UndeadMech || extension.DemonMech)) + { + return false; + } + // No need to check extension == null again, just check ArtificeMech directly + if (!extension.ArtificeMech) + { + return true; + } + if (!mech.RaceProps.IsMechanoid || !mech.IsColonyMech) + { + return false; + } + if (mech.needs.energy == null || (!mech.Downed && !mech.needs.energy.IsLowEnergySelfShutdown)) + { + return false; + } + MechanitorControlGroup mechControlGroup = mech.GetMechControlGroup(); + if (mechControlGroup?.WorkMode == MechWorkModeDefOf.SelfShutdown) + { + return false; + } + if (mech.needs.energy.CurLevel >= JobGiver_GetEnergy.GetMaxRechargeLimit(mech)) + { + return false; + } + Building_MechCharger closestCharger = Utility.GetClosestCharger(mech, pawn, forced); + bool canReserve = pawn.CanReserve(t, 1, -1, null, forced); + + Log.Message($"[DEBUG] Checking reservation and availability. Forbidden: {t.IsForbidden(pawn)}, Can Reserve: {canReserve}, Closest Charger: {(closestCharger != null ? closestCharger.ToString() : "None")}"); + + __result = mech.CurJobDef != JobDefOf.MechCharge && !t.IsForbidden(pawn) && canReserve && closestCharger != null; + return false; + } + } +} \ No newline at end of file diff --git a/Source/New Mech/Harmony Patches/WorkGiver_RepairMech_HasJobOnThing_Patch.cs b/Source/New Mech/Harmony Patches/WorkGiver_RepairMech_HasJobOnThing_Patch.cs new file mode 100644 index 0000000..4b88024 --- /dev/null +++ b/Source/New Mech/Harmony Patches/WorkGiver_RepairMech_HasJobOnThing_Patch.cs @@ -0,0 +1,33 @@ +using HarmonyLib; +using RimWorld; +using Verse; + +namespace MedievalBiotech +{ + [HarmonyPatch(typeof(WorkGiver_RepairMech), "HasJobOnThing")] + public static class WorkGiver_RepairMech_HasJobOnThing_Patch + { + public static void Postfix(ref bool __result,Pawn pawn, Thing t) + { + if (t is not Pawn mech) + { + return; // Ensure t is a Pawn before proceeding + } + + bool vampMech = Utility.IsSanguinMech(mech); + if (Utility.IsSanguinMage(pawn)) + { + + __result = vampMech; // Only allow repair if it is a SanguinMech and SanguinMage + return; + } + bool undeadMech = Utility.IsUndeadMech(mech); + if (Utility.IsNecromancer(pawn)) + { + __result = undeadMech; // Only allow repair if it is an UndeadMech and Necromancer + return; + } + __result = !(undeadMech || vampMech); // Prevent repair of these mechs + } + } +} diff --git a/Source/New Mech/HediffDef/CompProperties/HediffCompProperties_SeverityFromSoul.cs b/Source/New Mech/HediffDef/CompProperties/HediffCompProperties_SeverityFromSoul.cs new file mode 100644 index 0000000..e7c0099 --- /dev/null +++ b/Source/New Mech/HediffDef/CompProperties/HediffCompProperties_SeverityFromSoul.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace MedievalBiotech +{ + public class HediffCompProperties_SeverityFromSoul : HediffCompProperties + { + public HediffCompProperties_SeverityFromSoul() + { + this.compClass = typeof(HediffComp_SeverityFromSoul); + } + + public float severityPerHourEmpty; + + public float severityPerHourSoul; + } +} \ No newline at end of file diff --git a/Source/New Mech/HediffDef/Hediff_BandNode_Artifice.cs b/Source/New Mech/HediffDef/Hediff_BandNode_Artifice.cs new file mode 100644 index 0000000..a7cdc20 --- /dev/null +++ b/Source/New Mech/HediffDef/Hediff_BandNode_Artifice.cs @@ -0,0 +1,98 @@ +using System.Collections.Generic; +using RimWorld; +using Verse; + +namespace MedievalBiotech +{ + public class Hediff_BandNode_Artifice : Hediff + { + public int AdditionalBandwidth + { + get + { + return this.cachedTunedBandNodesCount; + } + } + + public override bool ShouldRemove + { + get + { + return this.cachedTunedBandNodesCount == 0; + } + } + + public override HediffStage CurStage + { + get + { + if (this.curStage == null && this.cachedTunedBandNodesCount > 0) + { + StatModifier statModifier = new StatModifier(); + statModifier.stat = StatDefOf.MechBandwidth; + statModifier.value = (float)this.cachedTunedBandNodesCount; + this.curStage = new HediffStage(); + this.curStage.statOffsets = new List + { + statModifier + }; + } + return this.curStage; + } + } + + public override void PostTick() + { + base.PostTick(); + if (this.pawn.IsHashIntervalTick(60)) + { + this.RecacheBandNodes(); + } + } + + public override void PostAdd(DamageInfo? dinfo) + { + base.PostAdd(dinfo); + this.RecacheBandNodes(); + } + + public void RecacheBandNodes() + { + int num = this.cachedTunedBandNodesCount; + this.cachedTunedBandNodesCount = 0; + List maps = Find.Maps; + for (int i = 0; i < maps.Count; i++) + { + foreach (Building thing in maps[i].listerBuildings.AllBuildingsColonistOfDef(MB_DefOf.MB_BandNode)) + { + if (thing.TryGetComp().tunedTo == this.pawn && thing.TryGetComp().ResourceOn) + { + this.cachedTunedBandNodesCount++; + } + } + } + if (num != this.cachedTunedBandNodesCount) + { + this.curStage = null; + Pawn_MechanitorTracker mechanitor = this.pawn.mechanitor; + if (mechanitor == null) + { + return; + } + mechanitor.Notify_BandwidthChanged(); + } + } + + public override void ExposeData() + { + base.ExposeData(); + Scribe_Values.Look(ref this.cachedTunedBandNodesCount, "cachedTunedBandNodesCount", 0, false); + } + + private const int BandNodeCheckInterval = 60; + + private int cachedTunedBandNodesCount; + + private HediffStage curStage; + } +} diff --git a/Source/New Mech/HediffDef/Hediff_NecrarchBrain.cs b/Source/New Mech/HediffDef/Hediff_NecrarchBrain.cs new file mode 100644 index 0000000..7e41eb7 --- /dev/null +++ b/Source/New Mech/HediffDef/Hediff_NecrarchBrain.cs @@ -0,0 +1,43 @@ +using RimWorld; +using Verse; + +namespace MedievalBiotech +{ + public class Hediff_NecrarchBrain : HediffWithComps + { + public override void PostAdd(DamageInfo? dinfo) + { + base.PostAdd(dinfo); + if (!ModLister.CheckBiotech("MB_NecronomiconImplant")) + { + this.pawn.health.RemoveHediff(this); + return; + } + PawnComponentsUtility.AddAndRemoveDynamicComponents(this.pawn, false); + if (this.pawn.Spawned) + { + Find.LetterStack.ReceiveLetter("LetterLabelNecronomiconInstalled".Translate() + ": " + this.pawn.LabelShortCap, "LetterNecronomiconInstalled".Translate(this.pawn.Named("PAWN")), LetterDefOf.PositiveEvent, this.pawn, null, null, null, null, 0, true); + } + } + public override void PostRemoved() + { + base.PostRemoved(); + Pawn_MechanitorTracker mechanitor = this.pawn.mechanitor; + if (mechanitor == null) + { + return; + } + mechanitor.Notify_MechlinkRemoved(); + } + public override void PostTick() + { + base.PostTick(); + if (this.pawn.Spawned && this.pawn.IsHashIntervalTick(300)) + { + LessonAutoActivator.TeachOpportunity(ConceptDefOf.Mechanitors, OpportunityType.Important); + } + } + + private const int LearningOpportunityCheckInterval = 300; + } +} \ No newline at end of file diff --git a/Source/New Mech/HediffDef/Hediff_SaguineMage.cs b/Source/New Mech/HediffDef/Hediff_SaguineMage.cs new file mode 100644 index 0000000..2afd927 --- /dev/null +++ b/Source/New Mech/HediffDef/Hediff_SaguineMage.cs @@ -0,0 +1,44 @@ +using RimWorld; +using Verse; + +namespace MedievalBiotech +{ + public class Hediff_SaguineMage : HediffWithComps + { + public override void PostAdd(DamageInfo? dinfo) + { + base.PostAdd(dinfo); + if (!ModLister.CheckBiotech("MB_BloodChaliceImplant")) + { + this.pawn.health.RemoveHediff(this); + return; + } + PawnComponentsUtility.AddAndRemoveDynamicComponents(this.pawn, false); + if (this.pawn.Spawned) + { + Find.LetterStack.ReceiveLetter("LetterLabelBloodChaliceInstalled".Translate() + ": " + this.pawn.LabelShortCap, "LetterBloodChaliceInstalled".Translate(this.pawn.Named("PAWN")), LetterDefOf.PositiveEvent, this.pawn, null, null, null, null, 0, true); + } + } + public override void PostRemoved() + { + base.PostRemoved(); + Pawn_MechanitorTracker mechanitor = this.pawn.mechanitor; + if (mechanitor == null) + { + return; + } + mechanitor.Notify_MechlinkRemoved(); + } + public override void PostTick() + { + base.PostTick(); + if (this.pawn.Spawned && this.pawn.IsHashIntervalTick(300)) + { + LessonAutoActivator.TeachOpportunity(ConceptDefOf.Mechanitors, OpportunityType.Important); + } + } + + + private const int LearningOpportunityCheckInterval = 300; + } +} \ No newline at end of file diff --git a/Source/New Mech/HediffDef/Hediff_SoulCraving.cs b/Source/New Mech/HediffDef/Hediff_SoulCraving.cs new file mode 100644 index 0000000..6fa64d5 --- /dev/null +++ b/Source/New Mech/HediffDef/Hediff_SoulCraving.cs @@ -0,0 +1,48 @@ +using RimWorld; +using Verse; +using System; + +namespace MedievalBiotech +{ + public class HediffComp_SeverityFromSoul : HediffComp + { + public HediffCompProperties_SeverityFromSoul Props + { + get + { + return (HediffCompProperties_SeverityFromSoul)this.props; + } + } + public override bool CompShouldRemove + { + get + { + Pawn_GeneTracker genes = base.Pawn.genes; + return ((genes != null) ? genes.GetFirstGeneOfType() : null) == null; + } + } + + private Gene_Soul Soul + { + get + { + if (this.cachedSoulGene == null) + { + this.cachedSoulGene = base.Pawn.genes.GetFirstGeneOfType(); + } + return this.cachedSoulGene; + } + } + + public override void CompPostTick(ref float severityAdjustment) + { + base.CompPostTick(ref severityAdjustment); + if (this.Soul != null) + { + severityAdjustment += ((this.Soul.Value > 0f) ? this.Props.severityPerHourSoul : this.Props.severityPerHourEmpty) / 2500f; + } + } + + private Gene_Soul cachedSoulGene; + } +} \ No newline at end of file diff --git a/Source/New Mech/JobStuff/WorkGiver.cs b/Source/New Mech/JobStuff/WorkGiver.cs new file mode 100644 index 0000000..9d93a31 --- /dev/null +++ b/Source/New Mech/JobStuff/WorkGiver.cs @@ -0,0 +1,62 @@ +using RimWorld; +using System.Collections.Generic; +using Verse.AI; +using Verse; + +namespace MedievalBiotech.New_Mech +{ + public class WorkGiver_HaulMechToCharger_Steam : WorkGiver_Scanner + { + public override ThingRequest PotentialWorkThingRequest + { + get + { + return ThingRequest.ForGroup(ThingRequestGroup.Pawn); + } + } + + public override IEnumerable PotentialWorkThingsGlobal(Pawn pawn) + { + return pawn.Map.mapPawns.SpawnedPawnsInFaction(pawn.Faction); + } + + public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false) + { + if (!ModLister.CheckBiotech("Haul mech to recharger")) + { + return false; + } + Pawn pawn2 = (Pawn)t; + if (!pawn2.RaceProps.IsMechanoid || !pawn2.IsColonyMech) + { + return false; + } + if (pawn2.needs.energy != null) + { + if (!pawn2.Downed && !pawn2.needs.energy.IsLowEnergySelfShutdown) + { + return false; + } + MechanitorControlGroup mechControlGroup = pawn2.GetMechControlGroup(); + if (mechControlGroup != null && mechControlGroup.WorkMode == MechWorkModeDefOf.SelfShutdown) + { + return false; + } + if (pawn2.needs.energy.CurLevel >= JobGiver_GetEnergy.GetMaxRechargeLimit(pawn2)) + { + return false; + } + } + return pawn2.CurJobDef != JobDefOf.MechCharge && !t.IsForbidden(pawn) && pawn.CanReserve(t, 1, -1, null, forced) && JobGiver_GetEnergy_Charger.GetClosestCharger(pawn2, pawn, forced) != null; + } + + public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false) + { + Pawn pawn2 = (Pawn)t; + Building_MechCharger closestCharger = JobGiver_GetEnergy_Charger.GetClosestCharger(pawn2, pawn, forced); + Job job = JobMaker.MakeJob(JobDefOf.HaulMechToCharger, pawn2, closestCharger, closestCharger.InteractionCell); + job.count = 1; + return job; + } + } +} diff --git a/Source/New Mech/JobStuff/WorkGiver_DoArtifice.cs b/Source/New Mech/JobStuff/WorkGiver_DoArtifice.cs new file mode 100644 index 0000000..42b5a32 --- /dev/null +++ b/Source/New Mech/JobStuff/WorkGiver_DoArtifice.cs @@ -0,0 +1,691 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using RimWorld; +using UnityEngine; +using Verse; +using Verse.AI; + +namespace MedievalBiotech +{ + public class WorkGiver_DoArtifice : WorkGiver_Scanner + { + private class DefCountList + { + private List defs = new List(); + + private List counts = new List(); + + public int Count => defs.Count; + + public float this[ThingDef def] + { + get + { + int num = defs.IndexOf(def); + if (num < 0) + { + return 0f; + } + return counts[num]; + } + set + { + int num = defs.IndexOf(def); + if (num < 0) + { + defs.Add(def); + counts.Add(value); + num = defs.Count - 1; + } + else + { + counts[num] = value; + } + CheckRemove(num); + } + } + + public float GetCount(int index) + { + return counts[index]; + } + + public void SetCount(int index, float val) + { + counts[index] = val; + CheckRemove(index); + } + + public ThingDef GetDef(int index) + { + return defs[index]; + } + + private void CheckRemove(int index) + { + if (counts[index] == 0f) + { + counts.RemoveAt(index); + defs.RemoveAt(index); + } + } + + public void Clear() + { + defs.Clear(); + counts.Clear(); + } + + public void GenerateFrom(List things) + { + Clear(); + for (int i = 0; i < things.Count; i++) + { + this[things[i].def] += things[i].stackCount; + } + } + } + + private List chosenIngThings = new List(); + + private static List missingIngredients = new List(); + + private static List tmpMissingUniqueIngredients = new List(); + + private static readonly IntRange ReCheckFailedBillTicksRange = new IntRange(500, 600); + + private static List relevantThings = new List(); + + private static HashSet processedThings = new HashSet(); + + private static List newRelevantThings = new List(); + + private static List tmpMedicine = new List(); + + private static DefCountList availableCounts = new DefCountList(); + + public override PathEndMode PathEndMode => PathEndMode.InteractionCell; + + public override ThingRequest PotentialWorkThingRequest + { + get + { + if (def.fixedBillGiverDefs != null && def.fixedBillGiverDefs.Count == 1) + { + return ThingRequest.ForDef(def.fixedBillGiverDefs[0]); + } + return ThingRequest.ForGroup(ThingRequestGroup.PotentialBillGiver); + } + } + + public override Danger MaxPathDanger(Pawn pawn) + { + return Danger.Some; + } + + public override bool ShouldSkip(Pawn pawn, bool forced = false) + { + List list = pawn.Map.listerThings.ThingsInGroup(ThingRequestGroup.PotentialBillGiver); + for (int i = 0; i < list.Count; i++) + { + if (list[i] is IBillGiver billGiver && billGiver != pawn && ThingIsUsableBillGiver(list[i]) && billGiver.BillStack.AnyShouldDoNow) + { + return false; + } + } + return true; + } + + public override Job JobOnThing(Pawn pawn, Thing thing, bool forced = false) + { + if (!(thing is IBillGiver billGiver) || !ThingIsUsableBillGiver(thing) || !billGiver.BillStack.AnyShouldDoNow || !billGiver.UsableForBillsAfterFueling() || !pawn.CanReserve(thing, 1, -1, null, forced) || thing.IsBurning() || thing.IsForbidden(pawn)) + { + return null; + } + if (thing.def.hasInteractionCell && !pawn.CanReserveSittableOrSpot_NewTemp(thing.InteractionCell, thing, forced)) + { + return null; + } + CompRefuelable compRefuelable = thing.TryGetComp(); + if (compRefuelable != null && !compRefuelable.HasFuel) + { + if (!RefuelWorkGiverUtility.CanRefuel(pawn, thing, forced)) + { + return null; + } + return RefuelWorkGiverUtility.RefuelJob(pawn, thing, forced); + } + billGiver.BillStack.RemoveIncompletableBills(); + return StartOrResumeBillJob(pawn, billGiver, forced); + } + + private static UnfinishedThing ClosestUnfinishedThingForBill(Pawn pawn, Bill_ProductionWithUft bill) + { + Predicate validator = (Thing t) => !t.IsForbidden(pawn) && ((UnfinishedThing)t).Recipe == bill.recipe && ((UnfinishedThing)t).Creator == pawn && ((UnfinishedThing)t).ingredients.TrueForAll((Thing x) => bill.IsFixedOrAllowedIngredient(x.def)) && pawn.CanReserve(t); + return (UnfinishedThing)GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(bill.recipe.unfinishedThingDef), PathEndMode.InteractionCell, TraverseParms.For(pawn, pawn.NormalMaxDanger()), 9999f, validator); + } + + private static Job FinishUftJob(Pawn pawn, UnfinishedThing uft, Bill_ProductionWithUft bill) + { + if (uft.Creator != pawn) + { + Log.Error(string.Concat("Tried to get FinishUftJob for ", pawn, " finishing ", uft, " but its creator is ", uft.Creator)); + return null; + } + Job job = WorkGiverUtility.HaulStuffOffBillGiverJob(pawn, bill.billStack.billGiver, uft); + if (job != null && job.targetA.Thing != uft) + { + return job; + } + Job job2 = JobMaker.MakeJob(JobDefOf.DoBill, (Thing)bill.billStack.billGiver); + job2.bill = bill; + job2.targetQueueB = new List { uft }; + job2.countQueue = new List { 1 }; + job2.haulMode = HaulMode.ToCellNonStorage; + return job2; + } + + private Job StartOrResumeBillJob(Pawn pawn, IBillGiver giver, bool forced = false) + { + bool flag = FloatMenuMakerMap.makingFor == pawn; + for (int i = 0; i < giver.BillStack.Count; i++) + { + Bill bill = giver.BillStack[i]; + + if ((bill.recipe.requiredGiverWorkType != null && bill.recipe.requiredGiverWorkType != def.workType) || + (Find.TickManager.TicksGame <= bill.nextTickToSearchForIngredients && FloatMenuMakerMap.makingFor != pawn) || + !bill.ShouldDoNow() || !bill.PawnAllowedToStartAnew(pawn)) + { + continue; + } + + // Skill check + SkillRequirement skillRequirement = bill.recipe.FirstSkillRequirementPawnDoesntSatisfy(pawn); + if (skillRequirement != null) + { + JobFailReason.Is("UnderRequiredSkill".Translate(skillRequirement.minLevel), bill.Label); + continue; + } + + // Bill_ProductionWithUft specific handling + if (bill is Bill_ProductionWithUft bill_ProductionWithUft) + { + + if (bill_ProductionWithUft.BoundUft != null) + { + + if (bill_ProductionWithUft.BoundWorker == pawn && + pawn.CanReserveAndReach(bill_ProductionWithUft.BoundUft, PathEndMode.Touch, Danger.Deadly) && + !bill_ProductionWithUft.BoundUft.IsForbidden(pawn)) + { + return FinishUftJob(pawn, bill_ProductionWithUft.BoundUft, bill_ProductionWithUft); + } + continue; + } + + UnfinishedThing unfinishedThing = ClosestUnfinishedThingForBill(pawn, bill_ProductionWithUft); + if (unfinishedThing != null) + { + return FinishUftJob(pawn, unfinishedThing, bill_ProductionWithUft); + } + } + + // Bill_Autonomous specific handling + if (bill is Bill_Autonomous bill_Autonomous && bill_Autonomous.State != FormingState.Gathering) + { + return WorkOnFormedBill((Thing)giver, bill_Autonomous); + } + + // Ingredient finding logic + List list = null; + if (flag) + { + list = missingIngredients; + list.Clear(); + tmpMissingUniqueIngredients.Clear(); + } + + if (bill is Bill_Medical bill_Medical2 && bill_Medical2.uniqueRequiredIngredients?.Any() == true) + { + foreach (Thing ingredient in bill_Medical2.uniqueRequiredIngredients) + { + if (ingredient.IsForbidden(pawn) || !pawn.CanReserveAndReach(ingredient, PathEndMode.OnCell, Danger.Deadly)) + { + tmpMissingUniqueIngredients.Add(ingredient); + } + } + } + + if (!TryFindBestBillIngredients(bill, pawn, (Thing)giver, chosenIngThings, list) || tmpMissingUniqueIngredients.Any()) + { + continue; + } + + Job haulOffJob; + Job result = TryStartNewDoBillJob(pawn, bill, giver, chosenIngThings, out haulOffJob); + chosenIngThings.Clear(); + return result; + } + + chosenIngThings.Clear(); + return null; + } + + + + private static bool CannotDoBillDueToMedicineRestriction(IBillGiver giver, Bill bill, List missingIngredients) + { + if (!(giver is Pawn pawn)) + { + return false; + } + bool flag = false; + foreach (IngredientCount missingIngredient in missingIngredients) + { + if (missingIngredient.filter.Allows(ThingDefOf.MedicineIndustrial)) + { + flag = true; + break; + } + } + if (flag) + { + MedicalCareCategory medicalCareCategory = GetMedicalCareCategory(pawn); + foreach (Thing item in pawn.Map.listerThings.ThingsInGroup(ThingRequestGroup.Medicine)) + { + if (IsUsableIngredient(item, bill) && medicalCareCategory.AllowsMedicine(item.def)) + { + return false; + } + } + return true; + } + return false; + } + + public static Job TryStartNewDoBillJob(Pawn pawn, Bill bill, IBillGiver giver, List chosenIngThings, out Job haulOffJob, bool dontCreateJobIfHaulOffRequired = true) + { + haulOffJob = WorkGiverUtility.HaulStuffOffBillGiverJob(pawn, giver, null); + if (haulOffJob != null && dontCreateJobIfHaulOffRequired) + { + return haulOffJob; + } + Job job = JobMaker.MakeJob(JobDefOf.DoBill, (Thing)giver); + job.targetQueueB = new List(chosenIngThings.Count); + job.countQueue = new List(chosenIngThings.Count); + for (int i = 0; i < chosenIngThings.Count; i++) + { + job.targetQueueB.Add(chosenIngThings[i].Thing); + job.countQueue.Add(chosenIngThings[i].Count); + } + if (bill.xenogerm != null) + { + job.targetQueueB.Add(bill.xenogerm); + job.countQueue.Add(1); + } + job.haulMode = HaulMode.ToCellNonStorage; + job.bill = bill; + return job; + } + + private static Job WorkOnFormedBill(Thing giver, Bill_Autonomous bill) + { + Job job = JobMaker.MakeJob(JobDefOf.DoBill, giver); + job.bill = bill; + return job; + } + + public bool ThingIsUsableBillGiver(Thing thing) + { + Pawn pawn = thing as Pawn; + Corpse corpse = thing as Corpse; + Pawn pawn2 = null; + if (corpse != null) + { + pawn2 = corpse.InnerPawn; + } + if (def.fixedBillGiverDefs != null && def.fixedBillGiverDefs.Contains(thing.def)) + { + return true; + } + if (pawn != null) + { + if (def.billGiversAllHumanlikes && pawn.RaceProps.Humanlike) + { + return true; + } + if (def.billGiversAllMechanoids && pawn.RaceProps.IsMechanoid) + { + return true; + } + if (def.billGiversAllAnimals && pawn.IsNonMutantAnimal) + { + return true; + } + } + if (corpse != null && pawn2 != null) + { + if (def.billGiversAllHumanlikesCorpses && pawn2.RaceProps.Humanlike) + { + return true; + } + if (def.billGiversAllMechanoidsCorpses && pawn2.RaceProps.IsMechanoid) + { + return true; + } + if (def.billGiversAllAnimalsCorpses && pawn2.IsNonMutantAnimal) + { + return true; + } + } + return false; + } + + private static bool IsUsableIngredient(Thing t, Bill bill) + { + if (!bill.IsFixedOrAllowedIngredient(t)) + { + return false; + } + foreach (IngredientCount ingredient in bill.recipe.ingredients) + { + if (ingredient.filter.Allows(t)) + { + return true; + } + } + return false; + } + + public static bool TryFindBestFixedIngredients(List ingredients, Pawn pawn, Thing ingredientDestination, List chosen, float searchRadius = 999f) + { + return TryFindBestIngredientsHelper(delegate (Thing t) + { + foreach (IngredientCount ingredient in ingredients) + { + if (ingredient.filter.Allows(t)) + { + return true; + } + } + return false; + }, (List foundThings) => TryFindBestIngredientsInSet_NoMixHelper(foundThings, ingredients, chosen, GetBillGiverRootCell(ingredientDestination, pawn), alreadySorted: false, null), ingredients, pawn, ingredientDestination, chosen, searchRadius); + } + + private static bool TryFindBestBillIngredients(Bill bill, Pawn pawn, Thing billGiver, List chosen, List missingIngredients) + { + return TryFindBestIngredientsHelper((Thing t) => IsUsableIngredient(t, bill), (List foundThings) => TryFindBestBillIngredientsInSet(foundThings, bill, chosen, GetBillGiverRootCell(billGiver, pawn), billGiver is Pawn, missingIngredients), bill.recipe.ingredients, pawn, billGiver, chosen, bill.ingredientSearchRadius); + } + + private static bool TryFindBestIngredientsHelper(Predicate thingValidator, Predicate> foundAllIngredientsAndChoose, List ingredients, Pawn pawn, Thing billGiver, List chosen, float searchRadius) + { + chosen.Clear(); + newRelevantThings.Clear(); + if (ingredients.Count == 0) + { + return true; + } + IntVec3 billGiverRootCell = GetBillGiverRootCell(billGiver, pawn); + Region rootReg = billGiverRootCell.GetRegion(pawn.Map); + if (rootReg == null) + { + return false; + } + relevantThings.Clear(); + processedThings.Clear(); + bool foundAll = false; + float radiusSq = searchRadius * searchRadius; + Predicate baseValidator = (Thing t) => t.Spawned && thingValidator(t) && (float)(t.Position - billGiver.Position).LengthHorizontalSquared < radiusSq && !t.IsForbidden(pawn) && pawn.CanReserve(t); + bool billGiverIsPawn = billGiver is Pawn; + if (billGiverIsPawn) + { + AddEveryMedicineToRelevantThings(pawn, billGiver, relevantThings, baseValidator, pawn.Map); + if (foundAllIngredientsAndChoose(relevantThings)) + { + relevantThings.Clear(); + return true; + } + } + if (billGiver is Building_WorkTableAutonomous building_WorkTableAutonomous) + { + relevantThings.AddRange(building_WorkTableAutonomous.innerContainer); + if (foundAllIngredientsAndChoose(relevantThings)) + { + relevantThings.Clear(); + return true; + } + } + TraverseParms traverseParams = TraverseParms.For(pawn); + RegionEntryPredicate entryCondition = null; + if (Math.Abs(999f - searchRadius) >= 1f) + { + entryCondition = delegate (Region from, Region r) + { + if (!r.Allows(traverseParams, isDestination: false)) + { + return false; + } + CellRect extentsClose = r.extentsClose; + int num2 = Math.Abs(billGiver.Position.x - Math.Max(extentsClose.minX, Math.Min(billGiver.Position.x, extentsClose.maxX))); + if ((float)num2 > searchRadius) + { + return false; + } + int num3 = Math.Abs(billGiver.Position.z - Math.Max(extentsClose.minZ, Math.Min(billGiver.Position.z, extentsClose.maxZ))); + return !((float)num3 > searchRadius) && (float)(num2 * num2 + num3 * num3) <= radiusSq; + }; + } + else + { + entryCondition = (Region from, Region r) => r.Allows(traverseParams, isDestination: false); + } + int adjacentRegionsAvailable = rootReg.Neighbors.Count((Region region) => entryCondition(rootReg, region)); + int regionsProcessed = 0; + processedThings.AddRange(relevantThings); + foundAllIngredientsAndChoose(relevantThings); + RegionProcessor regionProcessor = delegate (Region r) + { + List list = r.ListerThings.ThingsMatching(ThingRequest.ForGroup(ThingRequestGroup.HaulableEver)); + for (int i = 0; i < list.Count; i++) + { + Thing thing = list[i]; + if (!processedThings.Contains(thing) && ReachabilityWithinRegion.ThingFromRegionListerReachable(thing, r, PathEndMode.ClosestTouch, pawn) && baseValidator(thing) && !(thing.def.IsMedicine && billGiverIsPawn)) + { + newRelevantThings.Add(thing); + processedThings.Add(thing); + } + } + int num = regionsProcessed + 1; + regionsProcessed = num; + if (newRelevantThings.Count > 0 && regionsProcessed > adjacentRegionsAvailable) + { + relevantThings.AddRange(newRelevantThings); + newRelevantThings.Clear(); + if (foundAllIngredientsAndChoose(relevantThings)) + { + foundAll = true; + return true; + } + } + return false; + }; + RegionTraverser.BreadthFirstTraverse(rootReg, entryCondition, regionProcessor, 99999); + relevantThings.Clear(); + newRelevantThings.Clear(); + processedThings.Clear(); + return foundAll; + } + + private static IntVec3 GetBillGiverRootCell(Thing billGiver, Pawn forPawn) + { + if (billGiver is Building building) + { + if (building.def.hasInteractionCell) + { + return building.InteractionCell; + } + Log.Error(string.Concat("Tried to find bill ingredients for ", billGiver, " which has no interaction cell.")); + return forPawn.Position; + } + return billGiver.Position; + } + + private static void AddEveryMedicineToRelevantThings(Pawn pawn, Thing billGiver, List relevantThings, Predicate baseValidator, Map map) + { + MedicalCareCategory medicalCareCategory = GetMedicalCareCategory(billGiver); + List list = map.listerThings.ThingsInGroup(ThingRequestGroup.Medicine); + tmpMedicine.Clear(); + for (int i = 0; i < list.Count; i++) + { + Thing thing = list[i]; + if (medicalCareCategory.AllowsMedicine(thing.def) && baseValidator(thing) && pawn.CanReach(thing, PathEndMode.OnCell, Danger.Deadly)) + { + tmpMedicine.Add(thing); + } + } + tmpMedicine.SortBy((Thing x) => 0f - x.GetStatValue(StatDefOf.MedicalPotency), (Thing x) => x.Position.DistanceToSquared(billGiver.Position)); + relevantThings.AddRange(tmpMedicine); + tmpMedicine.Clear(); + } + + public static MedicalCareCategory GetMedicalCareCategory(Thing billGiver) + { + if (billGiver is Pawn { playerSettings: not null } pawn) + { + return pawn.playerSettings.medCare; + } + return MedicalCareCategory.Best; + } + + private static bool TryFindBestBillIngredientsInSet(List availableThings, Bill bill, List chosen, IntVec3 rootCell, bool alreadySorted, List missingIngredients) + { + if (bill.recipe.allowMixingIngredients) + { + return TryFindBestBillIngredientsInSet_AllowMix(availableThings, bill, chosen, rootCell, missingIngredients); + } + return TryFindBestBillIngredientsInSet_NoMix(availableThings, bill, chosen, rootCell, alreadySorted, missingIngredients); + } + + private static bool TryFindBestBillIngredientsInSet_NoMix(List availableThings, Bill bill, List chosen, IntVec3 rootCell, bool alreadySorted, List missingIngredients) + { + return TryFindBestIngredientsInSet_NoMixHelper(availableThings, bill.recipe.ingredients, chosen, rootCell, alreadySorted, missingIngredients, bill); + } + + private static bool TryFindBestIngredientsInSet_NoMixHelper(List availableThings, List ingredients, List chosen, IntVec3 rootCell, bool alreadySorted, List missingIngredients, Bill bill = null) + { + if (!alreadySorted) + { + Comparison comparison = delegate (Thing t1, Thing t2) + { + float num4 = (t1.PositionHeld - rootCell).LengthHorizontalSquared; + float value = (t2.PositionHeld - rootCell).LengthHorizontalSquared; + return num4.CompareTo(value); + }; + availableThings.Sort(comparison); + } + chosen.Clear(); + availableCounts.Clear(); + missingIngredients?.Clear(); + availableCounts.GenerateFrom(availableThings); + for (int i = 0; i < ingredients.Count; i++) + { + IngredientCount ingredientCount = ingredients[i]; + bool flag = false; + for (int j = 0; j < availableCounts.Count; j++) + { + float num = ((bill != null) ? ((float)ingredientCount.CountRequiredOfFor(availableCounts.GetDef(j), bill.recipe, bill)) : ingredientCount.GetBaseCount()); + if ((bill != null && !bill.recipe.ignoreIngredientCountTakeEntireStacks && num > availableCounts.GetCount(j)) || !ingredientCount.filter.Allows(availableCounts.GetDef(j)) || (bill != null && !ingredientCount.IsFixedIngredient && !bill.ingredientFilter.Allows(availableCounts.GetDef(j)))) + { + continue; + } + for (int k = 0; k < availableThings.Count; k++) + { + if (availableThings[k].def != availableCounts.GetDef(j)) + { + continue; + } + int num2 = availableThings[k].stackCount - ThingCountUtility.CountOf(chosen, availableThings[k]); + if (num2 > 0) + { + if (bill != null && bill.recipe.ignoreIngredientCountTakeEntireStacks) + { + ThingCountUtility.AddToList(chosen, availableThings[k], num2); + return true; + } + int num3 = Mathf.Min(Mathf.FloorToInt(num), num2); + ThingCountUtility.AddToList(chosen, availableThings[k], num3); + num -= (float)num3; + if (num < 0.001f) + { + flag = true; + float count = availableCounts.GetCount(j); + count -= num; + availableCounts.SetCount(j, count); + break; + } + } + } + if (flag) + { + break; + } + } + if (!flag) + { + if (missingIngredients == null) + { + return false; + } + missingIngredients.Add(ingredientCount); + } + } + if (missingIngredients != null) + { + return missingIngredients.Count == 0; + } + return true; + } + + private static bool TryFindBestBillIngredientsInSet_AllowMix(List availableThings, Bill bill, List chosen, IntVec3 rootCell, List missingIngredients) + { + chosen.Clear(); + missingIngredients?.Clear(); + availableThings.SortBy((Thing t) => bill.recipe.IngredientValueGetter.ValuePerUnitOf(t.def), (Thing t) => (t.Position - rootCell).LengthHorizontalSquared); + for (int i = 0; i < bill.recipe.ingredients.Count; i++) + { + IngredientCount ingredientCount = bill.recipe.ingredients[i]; + float num = ingredientCount.GetBaseCount(); + for (int j = 0; j < availableThings.Count; j++) + { + Thing thing = availableThings[j]; + if (ingredientCount.filter.Allows(thing) && (ingredientCount.IsFixedIngredient || bill.ingredientFilter.Allows(thing))) + { + float num2 = bill.recipe.IngredientValueGetter.ValuePerUnitOf(thing.def); + int num3 = Mathf.Min(Mathf.CeilToInt(num / num2), thing.stackCount); + ThingCountUtility.AddToList(chosen, thing, num3); + num -= (float)num3 * num2; + if (num <= 0.0001f) + { + break; + } + } + } + if (num > 0.0001f) + { + if (missingIngredients == null) + { + return false; + } + missingIngredients.Add(ingredientCount); + } + } + if (missingIngredients != null) + { + return missingIngredients.Count == 0; + } + return true; + } + } + +} \ No newline at end of file diff --git a/Source/New Mech/MapComponent/RechargerMapComponent.cs b/Source/New Mech/MapComponent/RechargerMapComponent.cs new file mode 100644 index 0000000..e9db205 --- /dev/null +++ b/Source/New Mech/MapComponent/RechargerMapComponent.cs @@ -0,0 +1,45 @@ +using System.Collections.Generic; +using Verse; + +namespace MedievalBiotech +{ + public class RechargerMapComponent : MapComponent + { + + public RechargerMapComponent(Map map) : base(map) + { + + } + + public override void MapGenerated() + { + base.MapGenerated(); + GetChargerMap(); + } + + public void GetChargerMap() + { + foreach (var thing in this.map.listerBuildings.allBuildingsColonist) + { + if (thing is Building_SteamCharger steamCharger) + { + RegisterCharger(steamCharger); + } + } + } + + public void RegisterCharger(Building_SteamCharger thing) + { + allChargers.Add(thing); + } + + public void RemoveCharger(Building_SteamCharger thing) + { + allChargers.Remove(thing); + } + + + public List allChargers = []; + } + +} diff --git a/Source/New Mech/ModExtension/Deathrest_SoulOffset.cs b/Source/New Mech/ModExtension/Deathrest_SoulOffset.cs new file mode 100644 index 0000000..480a419 --- /dev/null +++ b/Source/New Mech/ModExtension/Deathrest_SoulOffset.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace MedievalBiotech +{ + public class Deathrest_SoulOffset : DefModExtension + { + public float soulGainOffset; + } + + public class Custom_Mech : DefModExtension + { + public bool UndeadMech = false; + public bool DemonMech = false; + public bool ArtificeMech = false; + } +} + diff --git a/Source/New Mech/SoulDrainStuff/Alert_LowSoulEnergy.cs b/Source/New Mech/SoulDrainStuff/Alert_LowSoulEnergy.cs new file mode 100644 index 0000000..e3f3803 --- /dev/null +++ b/Source/New Mech/SoulDrainStuff/Alert_LowSoulEnergy.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using RimWorld.Planet; +using Verse; +using RimWorld; + +namespace MedievalBiotech +{ + public class Alert_LowSoulEnergy : Alert + { + public Alert_LowSoulEnergy() + { + this.requireBiotech = true; + this.defaultLabel = "MB_AlertLowSoulEnergy".Translate(); + } + + public override string GetLabel() + { + string text = this.defaultLabel; + if (this.targets.Count == 1) + { + text = text + ": " + this.targetLabels[0]; + } + return text; + } + private void CalculateTargets() + { + this.targets.Clear(); + this.targetLabels.Clear(); + foreach (Pawn pawn in PawnsFinder.AllMapsCaravansAndTravelingTransportPods_Alive) + { + if (pawn.genes != null && pawn.RaceProps.Humanlike && pawn.Faction == Faction.OfPlayer) + { + Gene_Soul firstGeneOfType = pawn.genes.GetFirstGeneOfType(); + if (firstGeneOfType != null && firstGeneOfType.Value < firstGeneOfType.MinLevelForAlert) + { + this.targets.Add(pawn); + this.targetLabels.Add(pawn.NameShortColored.Resolve()); + } + } + } + } + + public override TaggedString GetExplanation() + { + return "MB_AlertLowSoulEnergyDesc".Translate() + ":\n" + this.targetLabels.ToLineList(" - "); + } + + public override AlertReport GetReport() + { + this.CalculateTargets(); + return AlertReport.CulpritsAre(this.targets); + } + + private List targets = new List(); + + private List targetLabels = new List(); + } +} diff --git a/Source/New Mech/SoulDrainStuff/Gene_Soul.cs b/Source/New Mech/SoulDrainStuff/Gene_Soul.cs new file mode 100644 index 0000000..13a5916 --- /dev/null +++ b/Source/New Mech/SoulDrainStuff/Gene_Soul.cs @@ -0,0 +1,181 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using Verse; +using RimWorld; + +namespace MedievalBiotech +{ + public class Gene_Soul : Gene_Resource, IGeneResourceDrain + { + public Gene_Resource Resource + { + get + { + return this; + } + } + + public Pawn Pawn + { + get + { + return this.pawn; + } + } + + public bool CanOffset + { + get + { + return this.Active && !this.pawn.Deathresting; + } + } + + public string DisplayLabel + { + get + { + return this.Label + " (" + "Gene".Translate() + ")"; + } + } + + public float ResourceLossPerDay + { + get + { + return this.def.resourceLossPerDay; + } + } + + public override float InitialResourceMax + { + get + { + return 1f; + } + } + + public override float MinLevelForAlert + { + get + { + return 0.15f; + } + } + + public override float MaxLevelOffset + { + get + { + return 0.1f; + } + } + + public override Color BarColor + { + get + { + return new ColorInt(118, 87, 145).ToColor; + } + } + + public override Color BarHighlightColor + { + get + { + return new ColorInt(99, 64, 114).ToColor; + } + } + + public override void PostAdd() + { + if (!ModLister.CheckBiotech("Hemogen")) + { + return; + } + base.PostAdd(); + this.Reset(); + } + + public override void Notify_IngestedThing(Thing thing, int numTaken) + { + if (thing.def.IsMeat) + { + IngestibleProperties ingestible = thing.def.ingestible; + bool flag; + if (ingestible == null) + { + flag = false; + } + else + { + ThingDef sourceDef = ingestible.sourceDef; + bool? flag2; + if (sourceDef == null) + { + flag2 = null; + } + else + { + RaceProperties race = sourceDef.race; + flag2 = ((race != null) ? new bool?(race.Humanlike) : null); + } + bool? flag3 = flag2; + bool flag4 = true; + flag = (flag3.GetValueOrDefault() == flag4 & flag3 != null); + } + if (flag) + { + Utility.OffsetSoul(this.pawn, 0.0375f * thing.GetStatValue(StatDefOf.Nutrition, true, -1) * (float)numTaken, true); + } + } + } + + public override void Tick() + { + base.Tick(); + GeneResourceDrainUtility.TickResourceDrain(this); + } + + public override void SetTargetValuePct(float val) + { + this.targetValue = Mathf.Clamp(val * this.Max, 0f, this.Max - this.MaxLevelOffset); + } + + public bool ShouldConsumeSoulNow() + { + return this.Value < this.targetValue; + } + + public override IEnumerable GetGizmos() + { + if (!this.Active) + { + yield break; + } + foreach (Gizmo gizmo in base.GetGizmos()) + { + yield return gizmo; + } + IEnumerator enumerator = null; + foreach (Gizmo gizmo2 in GeneResourceDrainUtility.GetResourceDrainGizmos(this)) + { + yield return gizmo2; + } + enumerator = null; + yield break; + } + + public override void ExposeData() + { + base.ExposeData(); + Scribe_Values.Look(ref this.soulBasicGemsAllowed, "soulBasicGemsAllowed", true, false); + Scribe_Values.Look(ref this.soulArcanaGemsAllowed, "soulArcanaGemsAllowed", true, false); + } + + public bool soulBasicGemsAllowed = true; + public bool soulArcanaGemsAllowed = true; + + } +} diff --git a/Source/New Mech/SoulDrainStuff/Gene_SoulDrain.cs b/Source/New Mech/SoulDrainStuff/Gene_SoulDrain.cs new file mode 100644 index 0000000..a08028a --- /dev/null +++ b/Source/New Mech/SoulDrainStuff/Gene_SoulDrain.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using Verse; +using RimWorld; + +namespace MedievalBiotech +{ + public class Gene_SoulDrain : Gene, IGeneResourceDrain + { + + public Gene_Resource Resource + { + get + { + if (this.cachedSoulGene == null || !this.cachedSoulGene.Active) + { + this.cachedSoulGene = this.pawn.genes.GetFirstGeneOfType(); + } + return this.cachedSoulGene; + } + } + + public bool CanOffset + { + get + { + return this.Active && !this.pawn.Deathresting; + } + } + + public float ResourceLossPerDay + { + get + { + return this.def.resourceLossPerDay; + } + } + + public Pawn Pawn + { + get + { + return this.pawn; + } + } + + public string DisplayLabel + { + get + { + return this.Label + " (" + "Gene".Translate() + ")"; + } + } + + public override void Tick() + { + base.Tick(); + GeneResourceDrainUtility.TickResourceDrain(this); + } + + public override IEnumerable GetGizmos() + { + if (!this.Active) + { + yield break; + } + foreach (Gizmo gizmo in GeneResourceDrainUtility.GetResourceDrainGizmos(this)) + { + yield return gizmo; + } + IEnumerator enumerator = null; + yield break; + } + + [Unsaved(false)] + private Gene_Soul cachedSoulGene; + + private const float MinAgeForDrain = 3f; + } +} diff --git a/Source/New Mech/SoulDrainStuff/JobGiver_GetSoulGem.cs b/Source/New Mech/SoulDrainStuff/JobGiver_GetSoulGem.cs new file mode 100644 index 0000000..6089d2a --- /dev/null +++ b/Source/New Mech/SoulDrainStuff/JobGiver_GetSoulGem.cs @@ -0,0 +1,194 @@ +using HarmonyLib; +using RimWorld; +using System; +using System.Collections.Generic; +using UnityEngine; +using Verse; +using Verse.AI; + +namespace MedievalBiotech +{ + public class JobGiver_GetSoulGem : ThinkNode_JobGiver + { + public static float SoulGemEnergyGain + { + get + { + if (JobGiver_GetSoulGem.cachedSoulGenEnergyGain == null) + { + if (!ModsConfig.BiotechActive) + { + JobGiver_GetSoulGem.cachedSoulGenEnergyGain = new float?(0f); + } + else + { + IngestibleProperties ingestible = MB_DefOf.MB_CorruptedSoulGemBasic.ingestible; + object obj; + if (ingestible == null) + { + obj = null; + } + else + { + List outcomeDoers = ingestible.outcomeDoers; + if (outcomeDoers == null) + { + obj = null; + } + else + { + obj = outcomeDoers.FirstOrDefault((IngestionOutcomeDoer x) => x is IngestionOutcomeDoer_OffsetSoul); + } + } + IngestionOutcomeDoer_OffsetSoul ingestionOutcomeDoer_OffsetSoul = obj as IngestionOutcomeDoer_OffsetSoul; + if (ingestionOutcomeDoer_OffsetSoul == null) + { + JobGiver_GetSoulGem.cachedSoulGenEnergyGain = new float?(0f); + } + else + { + JobGiver_GetSoulGem.cachedSoulGenEnergyGain = new float?(ingestionOutcomeDoer_OffsetSoul.offset); + } + } + } + return JobGiver_GetSoulGem.cachedSoulGenEnergyGain.Value; + } + } + + public static void ResetStaticData() + { + JobGiver_GetSoulGem.cachedSoulGenEnergyGain = null; + } + public override float GetPriority(Pawn pawn) + { + if (!ModsConfig.BiotechActive) + { + return 0f; + } + Pawn_GeneTracker genes = pawn.genes; + if (((genes != null) ? genes.GetFirstGeneOfType() : null) == null) + { + return 0f; + } + return 9.1f; + } + public override Job TryGiveJob(Pawn pawn) + { + if (!ModsConfig.BiotechActive) + { + return null; + } + Pawn_GeneTracker genes = pawn.genes; + Gene_Soul gene_Soul = (genes != null) ? genes.GetFirstGeneOfType() : null; + if (gene_Soul == null) + { + return null; + } + if (!gene_Soul.ShouldConsumeSoulNow()) + { + return null; + } + if (pawn.IsBloodfeeder()) + { + Pawn prisoner = this.GetPrisoner(pawn); + if (prisoner != null) + { + return JobMaker.MakeJob(JobDefOf.PrisonerBloodfeed, prisoner); + } + } + if (gene_Soul.soulArcanaGemsAllowed || gene_Soul.soulBasicGemsAllowed) + { + int num = Mathf.FloorToInt((gene_Soul.Max - gene_Soul.Value) / JobGiver_GetSoulGem.SoulGemEnergyGain); + if (num > 0) + { + Thing soulGem = this.GetSoulGem(pawn, gene_Soul); + if (soulGem != null) + { + Job job = JobMaker.MakeJob(JobDefOf.Ingest, soulGem); + job.count = Mathf.Min(soulGem.stackCount, num); + job.ingestTotalCount = true; + return job; + } + } + } + return null; + } + + private Thing GetSoulGem(Pawn pawn, Gene_Soul gene_Soul) + { + bool flag1 = gene_Soul.soulArcanaGemsAllowed; + bool flag2 = gene_Soul.soulBasicGemsAllowed; + + //if (gene_Soul.soulArcanaGemsAllowed) + //{ + + // flag1 = true; + //} + //if (gene_Soul.soulBasicGemsAllowed) + //{ + + // flag2 = true; + //} + Thing carriedThing = pawn.carryTracker.CarriedThing; + if (carriedThing != null) + { + if (flag1 && carriedThing.def == MB_DefOf.MB_ArcanaStone) + { + return carriedThing; + } + if (flag2 && carriedThing.def == MB_DefOf.MB_CorruptedSoulGemBasic) + { + return carriedThing; + } + } + for (int i = 0; i < pawn.inventory.innerContainer.Count; i++) + { + if (flag1 && pawn.inventory.innerContainer[i].def == MB_DefOf.MB_ArcanaStone) + { + return pawn.inventory.innerContainer[i]; + } + if (flag2 && pawn.inventory.innerContainer[i].def == MB_DefOf.MB_CorruptedSoulGemBasic) + { + return pawn.inventory.innerContainer[i]; + } + } + if (flag1 && !flag2) + { + return GenClosest.ClosestThing_Global_Reachable(pawn.Position, pawn.Map, pawn.Map.listerThings.ThingsOfDef(MB_DefOf.MB_CorruptedSoulGemBasic), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false, false, false), 9999f, (Thing t) => pawn.CanReserve(t, 1, -1, null, false) && !t.IsForbidden(pawn), null); + } + if (flag2 && !flag1) + { + return GenClosest.ClosestThing_Global_Reachable(pawn.Position, pawn.Map, pawn.Map.listerThings.ThingsOfDef(MB_DefOf.MB_CorruptedSoulGemBasic), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false, false, false), 9999f, (Thing t) => pawn.CanReserve(t, 1, -1, null, false) && !t.IsForbidden(pawn), null); + } + List addThings = new List(); + addThings.AddRange(pawn.Map.listerThings.ThingsOfDef(MB_DefOf.MB_ArcanaStone)); + addThings.AddRange(pawn.Map.listerThings.ThingsOfDef(MB_DefOf.MB_CorruptedSoulGemBasic)); + IEnumerable things = addThings; + return GenClosest.ClosestThing_Global_Reachable(pawn.Position, pawn.Map, things, PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false, false, false), 9999f, (Thing t) => pawn.CanReserve(t, 1, -1, null, false) && !t.IsForbidden(pawn), null); + } + + public static AcceptanceReport CanFeedOnPrisoner(Pawn bloodfeeder, Pawn prisoner) + { + if (prisoner.WouldDieFromAdditionalBloodLoss(0.4499f)) + { + return "CannotFeedOnWouldKill".Translate(prisoner.Named("PAWN")); + } + if (!prisoner.IsPrisonerOfColony || !prisoner.guest.PrisonerIsSecure || prisoner.guest.IsInteractionDisabled(PrisonerInteractionModeDefOf.Bloodfeed) || prisoner.IsForbidden(bloodfeeder) || !bloodfeeder.CanReserveAndReach(prisoner, PathEndMode.OnCell, bloodfeeder.NormalMaxDanger(), 1, -1, null, false) || prisoner.InAggroMentalState) + { + return false; + } + return true; + } + + private Pawn GetPrisoner(Pawn pawn) + { + return (Pawn)GenClosest.ClosestThing_Global_Reachable(pawn.Position, pawn.Map, pawn.Map.mapPawns.PrisonersOfColonySpawned, PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false, false, false), 9999f, delegate (Thing t) + { + Pawn prisoner; + return (prisoner = (t as Pawn)) != null && JobGiver_GetSoulGem.CanFeedOnPrisoner(pawn, prisoner).Accepted; + }, null); + } + + private static float? cachedSoulGenEnergyGain; + } +} \ No newline at end of file diff --git a/Source/New Mech/SoulDrainStuff/Verb_CastAbilitySoul.cs b/Source/New Mech/SoulDrainStuff/Verb_CastAbilitySoul.cs new file mode 100644 index 0000000..ff3864c --- /dev/null +++ b/Source/New Mech/SoulDrainStuff/Verb_CastAbilitySoul.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using Verse; +using Verse.AI; +using RimWorld; + +namespace MedievalBiotech +{ + public class Verb_CastAbilitySoul : Verb_CastAbility + { + public AbilitySoul Ability + { + get + { + return this.ability; + } + set + { + this.ability = value; + } + } + public static Color RadiusHighlightColor + { + get + { + return new Color(0.3f, 0.8f, 1f); + } + } + public override void ExposeData() + { + base.ExposeData(); + Scribe_References.Look(ref this.ability, "ability", false); + } + + // Token: 0x04004264 RID: 16996 + public AbilitySoul ability; + } +} diff --git a/Source/New Mech/SoulDrainStuff/WorkGiver_Warden_DeliverSoulGem.cs b/Source/New Mech/SoulDrainStuff/WorkGiver_Warden_DeliverSoulGem.cs new file mode 100644 index 0000000..dcb9c5d --- /dev/null +++ b/Source/New Mech/SoulDrainStuff/WorkGiver_Warden_DeliverSoulGem.cs @@ -0,0 +1,129 @@ +using RimWorld; +using System.Collections.Generic; +using Verse.AI; +using Verse; + +namespace MedievalBiotech +{ + public class WorkGiver_Warden_DeliverSoulGem : WorkGiver_Warden + { + public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false) + { + if (!ModsConfig.BiotechActive) + { + return null; + } + if (!base.ShouldTakeCareOfPrisoner(pawn, t, false)) + { + return null; + } + Pawn prisoner = (Pawn)t; + if (!prisoner.guest.CanBeBroughtFood || !prisoner.Position.IsInPrisonCell(prisoner.Map)) + { + return null; + } + if (WardenFeedUtility.ShouldBeFed(prisoner)) + { + return null; + } + Pawn_GeneTracker genes = prisoner.genes; + Gene_Soul gene_Soul = ((genes != null) ? genes.GetGene(MB_DefOf.MB_SoulStarved) : null) as Gene_Soul; + if (gene_Soul == null) + { + return null; + } + if (gene_Soul.soulBasicGemsAllowed) + { + if (!gene_Soul.ShouldConsumeSoulNow()) + { + return null; + } + if (this.SoulGemAlreadyAvailableFor(prisoner)) + { + return null; + } + Thing thing = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(MB_DefOf.MB_CorruptedSoulGemBasic), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false, false, false), 9999f, (Thing pack) => !pack.IsForbidden(pawn) && pawn.CanReserve(pack, 1, -1, null, false) && pack.GetRoom(RegionType.Set_All) != prisoner.GetRoom(RegionType.Set_All), null, 0, -1, false, RegionType.Set_Passable, false); + if (thing == null) + { + return null; + } + Job job = JobMaker.MakeJob(JobDefOf.DeliverFood, thing, prisoner); + job.count = 1; + job.targetC = RCellFinder.SpotToChewStandingNear(prisoner, thing, null); + return job; + } + if (gene_Soul.soulArcanaGemsAllowed) + { + if (!gene_Soul.ShouldConsumeSoulNow()) + { + return null; + } + if (this.ArcanaStoneAlreadyAvailableFor(prisoner)) + { + return null; + } + Thing thing = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(MB_DefOf.MB_ArcanaStone), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false, false, false), 9999f, (Thing pack) => !pack.IsForbidden(pawn) && pawn.CanReserve(pack, 1, -1, null, false) && pack.GetRoom(RegionType.Set_All) != prisoner.GetRoom(RegionType.Set_All), null, 0, -1, false, RegionType.Set_Passable, false); + if (thing == null) + { + return null; + } + Job job = JobMaker.MakeJob(JobDefOf.DeliverFood, thing, prisoner); + job.count = 1; + job.targetC = RCellFinder.SpotToChewStandingNear(prisoner, thing, null); + return job; + } + return null; + + } + + private bool SoulGemAlreadyAvailableFor(Pawn prisoner) + { + if (prisoner.carryTracker.CarriedCount(MB_DefOf.MB_CorruptedSoulGemBasic) > 0) + { + return true; + } + if (prisoner.inventory.Count(MB_DefOf.MB_CorruptedSoulGemBasic) > 0) + { + return true; + } + Room room = prisoner.GetRoom(RegionType.Set_All); + if (room != null) + { + List regions = room.Regions; + for (int i = 0; i < regions.Count; i++) + { + if (regions[i].ListerThings.ThingsOfDef(MB_DefOf.MB_CorruptedSoulGemBasic).Count > 0) + { + return true; + } + } + } + return false; + } + + private bool ArcanaStoneAlreadyAvailableFor(Pawn prisoner) + { + if (prisoner.carryTracker.CarriedCount(MB_DefOf.MB_ArcanaStone) > 0) + { + return true; + } + if (prisoner.inventory.Count(MB_DefOf.MB_ArcanaStone) > 0) + { + return true; + } + Room room = prisoner.GetRoom(RegionType.Set_All); + if (room != null) + { + List regions = room.Regions; + for (int i = 0; i < regions.Count; i++) + { + if (regions[i].ListerThings.ThingsOfDef(MB_DefOf.MB_ArcanaStone).Count > 0) + { + return true; + } + } + } + return false; + } + } +} \ No newline at end of file diff --git a/Source/New Mech/SoulDrainStuff/Workgiver_AdministerSoulGem.cs b/Source/New Mech/SoulDrainStuff/Workgiver_AdministerSoulGem.cs new file mode 100644 index 0000000..88670ed --- /dev/null +++ b/Source/New Mech/SoulDrainStuff/Workgiver_AdministerSoulGem.cs @@ -0,0 +1,135 @@ +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse.AI; +using Verse; + +namespace MedievalBiotech +{ + public class Workgiver_AdministerSoul : WorkGiver_Scanner + { + public override ThingRequest PotentialWorkThingRequest + { + get + { + return ThingRequest.ForGroup(ThingRequestGroup.Pawn); + } + } + + public override PathEndMode PathEndMode + { + get + { + return PathEndMode.ClosestTouch; + } + } + + public override Danger MaxPathDanger(Pawn pawn) + { + return Danger.Deadly; + } + + public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false) + { + Pawn pawn2 = t as Pawn; + if (pawn2 == null || pawn2 == pawn) + { + return false; + } + Pawn_GeneTracker genes = pawn2.genes; + Gene_Soul gene_Soul = (genes != null) ? genes.GetFirstGeneOfType() : null; + if (gene_Soul == null) + { + return false; + } + if (gene_Soul.ValuePercent >= 0.95f) + { + return false; + } + if (!forced && gene_Soul.Value >= 0.25f) + { + return false; + } + if (!FeedPatientUtility.ShouldBeFed(pawn2)) + { + return false; + } + if (!gene_Soul.ShouldConsumeSoulNow()) + { + JobFailReason.Is("MB_NotAllowedSoulgem".Translate(), null); + return false; + } + if (!pawn.CanReserve(t, 1, -1, null, forced)) + { + return false; + } + bool arcanaFlag = gene_Soul.soulArcanaGemsAllowed; + bool arcanaExist = true; + if (arcanaFlag) + { + //bool arcanaFlag = true; + + if (GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(MB_DefOf.MB_ArcanaStone), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false, false, false), 9999f, (Thing pack) => !pack.IsForbidden(pawn) && pawn.CanReserve(pack, 1, -1, null, false), null, 0, -1, false, RegionType.Set_Passable, false) == null) + { + arcanaExist = false; + } + } + bool soulGemFlag = gene_Soul.soulBasicGemsAllowed; + bool soulGemExist = true; + if (soulGemFlag) + { + + if (GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(MB_DefOf.MB_CorruptedSoulGemBasic), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false, false, false), 9999f, (Thing pack) => !pack.IsForbidden(pawn) && pawn.CanReserve(pack, 1, -1, null, false), null, 0, -1, false, RegionType.Set_Passable, false) == null) + { + soulGemExist = false; + } + } + if ((arcanaFlag && !arcanaExist) && (soulGemFlag && !soulGemExist)) + { + JobFailReason.Is("NoIngredient".Translate(MB_DefOf.MB_CorruptedSoulGemBasic), null); + return false; + } + return true; + } + + public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false) + { + Pawn t2 = (Pawn)t; + Pawn_GeneTracker genes = t2.genes; + Gene_Soul gene_Soul = (genes != null) ? genes.GetFirstGeneOfType() : null; + bool flag1 = gene_Soul.soulArcanaGemsAllowed; + bool flag2 = gene_Soul.soulBasicGemsAllowed; + Thing thing = new Thing(); + if (flag1 && !flag2) + { + thing = GenClosest.ClosestThing_Global_Reachable(pawn.Position, pawn.Map, pawn.Map.listerThings.ThingsOfDef(MB_DefOf.MB_CorruptedSoulGemBasic), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false, false, false), 9999f, (Thing t3) => pawn.CanReserve(t3, 1, -1, null, false) && !t3.IsForbidden(pawn), null); + } + if (flag2 && !flag1) + { + thing = GenClosest.ClosestThing_Global_Reachable(pawn.Position, pawn.Map, pawn.Map.listerThings.ThingsOfDef(MB_DefOf.MB_CorruptedSoulGemBasic), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false, false, false), 9999f, (Thing t3) => pawn.CanReserve(t3, 1, -1, null, false) && !t3.IsForbidden(pawn), null); + } + if (flag1 && flag2) + { + List addThings = new List(); + addThings.AddRange(pawn.Map.listerThings.ThingsOfDef(MB_DefOf.MB_ArcanaStone)); + addThings.AddRange(pawn.Map.listerThings.ThingsOfDef(MB_DefOf.MB_CorruptedSoulGemBasic)); + IEnumerable things = addThings; + thing = GenClosest.ClosestThing_Global_Reachable(pawn.Position, pawn.Map, things, PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false, false, false), 9999f, (Thing t3) => pawn.CanReserve(t3, 1, -1, null, false) && !t3.IsForbidden(pawn), null); + } + if (thing != null) + { + Job job = JobMaker.MakeJob(JobDefOf.FeedPatient, thing, t2); + job.count = 1; + return job; + } + return null; + } + + private const float MinLevelForFeedingHemogenUnforced = 0.25f; + + private const float HemogenPctMax = 0.95f; + } +} diff --git a/Source/New Mech/ThingClass/Building_SteamCharger.cs b/Source/New Mech/ThingClass/Building_SteamCharger.cs new file mode 100644 index 0000000..57a20f0 --- /dev/null +++ b/Source/New Mech/ThingClass/Building_SteamCharger.cs @@ -0,0 +1,216 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using Verse; +using Verse.Sound; +using RimWorld; +using PipeSystem; +using System.Text; + +namespace MedievalBiotech +{ + [StaticConstructorOnStartup] + public class Building_SteamCharger : Building_MechCharger + { + public new CompResourceTrader Power => this.TryGetComp(); + + public new bool IsPowered => Power.ResourceOn; + + private new CompWasteProducer WasteProducer => null; + + public RechargerMapComponent chargerMapComp; + + + + public override void SpawnSetup(Map map, bool respawningAfterLoad) + { + base.SpawnSetup(map, respawningAfterLoad); + chargerMapComp = this.Map.GetComponent(); + chargerMapComp.RegisterCharger(this); + } + + public override void DeSpawn(DestroyMode mode = DestroyMode.Vanish) + { + chargerMapComp.RemoveCharger(this); + base.DeSpawn(mode); + } + + public override void Tick() + { + // Tick all components + if (this.comps != null) + { + for (int i = 0, count = this.comps.Count; i < count; i++) + { + this.comps[i].CompTick(); + } + } + bool hasChargingMech = currentlyChargingMech != null; + bool powerOn = Power.ResourceOn; + + if (hasChargingMech && (currentlyChargingMech.CurJobDef != JobDefOf.MechCharge || currentlyChargingMech.CurJob.targetA.Thing != this)) + { + Log.Warning("Mech did not clean up its charging job properly"); + StopCharging(); + } + if (hasChargingMech && powerOn) + { + Power.UsedLastTick = true; + currentlyChargingMech.needs.energy.CurLevel += 0.00083333335f; + + if (moteCablePulse == null || moteCablePulse.Destroyed) + { + moteCablePulse = MoteMaker.MakeInteractionOverlay(ThingDefOf.Mote_ChargingCablesPulse, this, new TargetInfo(InteractionCell, base.Map)); + } + moteCablePulse?.Maintain(); + + if (IsAttachedToMech) + { + if (sustainerCharging == null) + { + sustainerCharging = SoundDefOf.MechChargerCharging.TrySpawnSustainer(SoundInfo.InMap(this)); + } + sustainerCharging.Maintain(); + + if (moteCharging == null || moteCharging.Destroyed) + { + moteCharging = MoteMaker.MakeAttachedOverlay(currentlyChargingMech, ThingDefOf.Mote_MechCharging, Vector3.zero); + } + moteCharging?.Maintain(); + } + } + else + { + Power.UsedLastTick = false; + if (sustainerCharging != null) + { + sustainerCharging.End(); + sustainerCharging = null; + } + } + if (wireExtensionTicks < 70) + { + wireExtensionTicks++; + } + } + + public override IEnumerable GetGizmos() + { + foreach (Gizmo gizmo in base.GetGizmos()) + { + yield return gizmo; + } + if (!DebugSettings.ShowDevGizmos) + { + yield break; + } + if (currentlyChargingMech != null) + { + Command_Action command_Action5 = new Command_Action(); + command_Action5.action = delegate + { + currentlyChargingMech.needs.TryGetNeed().CurLevelPercentage = 1f; + }; + command_Action5.defaultLabel = "DEV: Charge 100%"; + yield return command_Action5; + } + } + public override void DrawAt(Vector3 drawLoc, bool flip = false) + { + base.DrawAt(drawLoc, flip); + GenDraw.FillableBarRequest barDrawData = BarDrawData; + barDrawData.center = DrawPos + Vector3.up * 0.1f; + barDrawData.fillPercent = WasteProducedPercentFull; + barDrawData.filledMat = WasteBarFilledMat; + barDrawData.unfilledMat = WasteBarUnfilledMat; + barDrawData.rotation = base.Rotation; + GenDraw.DrawFillableBar(barDrawData); + Vector3 a = drawLoc; + float num = EaseInOutQuart((float)wireExtensionTicks / 70f); + if (currentlyChargingMech == null) + { + num = 1f - num; + } + num = Mathf.Max(num, 0.32f); + Vector3 b = Vector3.Lerp(drawLoc, InteractionCell.ToVector3Shifted(), num); + b.y = AltitudeLayer.BuildingOnTop.AltitudeFor(); + a.y = AltitudeLayer.BuildingOnTop.AltitudeFor(); + GenDraw.DrawLineBetween(a, b, WireMaterial, 1f); + } + + public override string GetInspectString() + { + StringBuilder stringBuilder = new StringBuilder(); + if (this.currentlyChargingMech != null) + { + stringBuilder.Append("MB_SteamCharger_CurrentlyCharging".Translate(this.currentlyChargingMech.Label)); + } + string text = this.InspectStringPartsFromComps(); + if (!text.NullOrEmpty()) + { + if (stringBuilder.Length > 0) + { + stringBuilder.AppendLine(); + } + stringBuilder.Append(text); + } + return stringBuilder.ToString(); + } + + public override IEnumerable SpecialDisplayStats() + { + IEnumerable source = DefDatabase.AllDefs.Where((PawnKindDef pk) => IsCompatibleWithCharger(pk)); + string text = source.Select((PawnKindDef pk) => pk.LabelCap.Resolve()).ToLineList(" - "); + yield return new StatDrawEntry(StatCategoryDefOf.Basics, "StatsReport_RechargerWeightClass".Translate(), def.building.requiredMechWeightClasses.Select((MechWeightClass w) => w.ToStringHuman()).ToCommaList().CapitalizeFirst(), "StatsReport_RechargerWeightClass_Desc".Translate() + ": " + "\n\n" + text, 99999, null, source.Select((PawnKindDef pk) => new Dialog_InfoCard.Hyperlink(pk.race))); + } + + public bool CanPawnChargeCurrentlySteam(Pawn pawn) + { + if (pawn == null) + { + return false; + } + + + if (!IsCompatibleWithCharger(pawn.kindDef)) + { + return false; + } + + if (IsPowered) + { + + if (currentlyChargingMech == null) + { + return true; + } + + if (currentlyChargingMech == pawn) + { + return true; + } + + } + + return false; + } + + public bool IsCompatibleWithSteamCharger(PawnKindDef kindDef) + { + var extension = kindDef.race.GetModExtension(); + if (extension == null) + { + return false; + } + + ThingDef mechRace = kindDef.race; + return mechRace.race.IsMechanoid + && mechRace.GetCompProperties() != null + && this.def.building.requiredMechWeightClasses.NotNullAndContains(mechRace.race.mechWeightClass); + } + + + + } +} \ No newline at end of file diff --git a/Source/New Mech/ThingClass/Building_SteamGestator.cs b/Source/New Mech/ThingClass/Building_SteamGestator.cs new file mode 100644 index 0000000..9e33fe2 --- /dev/null +++ b/Source/New Mech/ThingClass/Building_SteamGestator.cs @@ -0,0 +1,216 @@ +using RimWorld; +using Verse.Sound; +using Verse; +using UnityEngine; +using PipeSystem; +using System.Collections.Generic; +using System; +using Verse.AI.Group; + +namespace MedievalBiotech +{ + public class Building_SteamGestator : Building_MechGestator + { + public CompResourceTrader SteamPower => this.TryGetComp(); + + public override void Tick() + { + this.innerContainer.ThingOwnerTick(true); + bool activeBill = false; + var state = this.ActiveBill.State; + if (this.ActiveBill != null && this.SteamPower.ResourceOn && this.BoundPawnStateAllowsForming) + { + this.activeBill.BillTick(); + ThingDef thingDef = null; + + if (state == FormingState.Forming) + { + activeBill = true; + thingDef = this.def.building.gestatorFormingMote.GetForRotation(base.Rotation); + } + else if (state == FormingState.Preparing && this.ActiveMechBill.GestationCyclesCompleted > 0) + { + + thingDef = this.def.building.gestatorCycleCompleteMote.GetForRotation(base.Rotation); + } + else if (state == FormingState.Formed) + { + this.SteamPower.UsedLastTick = false; + thingDef = this.def.building.gestatorFormedMote.GetForRotation(base.Rotation); + } + if (thingDef != null) + { + if (this.workingMote == null || this.workingMote.Destroyed || this.workingMote.def != thingDef) + { + this.workingMote = MoteMaker.MakeAttachedOverlay(this, thingDef, Vector3.zero, 1f, -1f); + } + this.workingMote.Maintain(); + } + + } + if (activeBill) + { + this.SteamPower.Notify_UsedThisTick(); + } + if (this.activeBill != null && this.SteamPower.ResourceOn && state != FormingState.Gathering) + { + if (this.workingSound == null || this.workingSound.Ended) + { + this.workingSound = SoundDefOf.MechGestator_Ambience.TrySpawnSustainer(this); + } + this.workingSound.Maintain(); + return; + } + if (this.workingSound != null) + { + this.workingSound.End(); + this.workingSound = null; + } + } + + public override string GetInspectStringExtra() + { + Bill_Mech bill_Mech = this.activeBill as Bill_Mech; + if (bill_Mech == null || bill_Mech.State != FormingState.Forming) + { + return null; + } + return string.Format("{0}: {1}", "GestatingInspect".Translate(), Mathf.CeilToInt(bill_Mech.formingTicks * 1f / bill_Mech.WorkSpeedMultiplier).ToStringTicksToPeriod(true, false, true, true, false)); + } + + public override void DrawAt(Vector3 drawLoc, bool flip = false) + { + base.DrawAt(drawLoc, flip); + if (this.activeBill != null && this.activeBill.State != FormingState.Gathering && this.def.building.formingGraphicData != null) + { + Vector3 loc = drawLoc + this.def.building.formingMechPerRotationOffset[base.Rotation.AsInt]; + loc.y += 0.01923077f; + loc.z += Mathf.PingPong((float)Find.TickManager.TicksGame * this.def.building.formingMechBobSpeed, this.def.building.formingMechYBobDistance); + Graphic graphic; + if (this.TryGetMechFormingGraphic(out graphic)) + { + graphic.Draw(loc, Rot4.South, this, 0f); + } + else + { + this.def.building.formingGraphicData.Graphic.Draw(loc, Rot4.North, this, 0f); + } + } + GenDraw.FillableBarRequest barDrawData = base.BarDrawData; + barDrawData.center = drawLoc; + barDrawData.fillPercent = base.CurrentBillFormingPercent; + barDrawData.filledMat = Building_MechGestator.FormingCycleBarFilledMat; + barDrawData.unfilledMat = Building_MechGestator.FormingCycleUnfilledMat; + barDrawData.rotation = base.Rotation; + GenDraw.DrawFillableBar(barDrawData); + if (this.topGraphic == null) + { + this.topGraphic = this.def.building.mechGestatorTopGraphic.GraphicColoredFor(this); + } + if (this.cylinderGraphic == null) + { + this.cylinderGraphic = this.def.building.mechGestatorCylinderGraphic.GraphicColoredFor(this); + } + Vector3 loc2 = new Vector3(drawLoc.x, AltitudeLayer.BuildingBelowTop.AltitudeFor(), drawLoc.z); + this.cylinderGraphic.Draw(loc2, base.Rotation, this, 0f); + Vector3 loc3 = new Vector3(drawLoc.x, AltitudeLayer.BuildingOnTop.AltitudeFor(), drawLoc.z); + this.topGraphic.Draw(loc3, base.Rotation, this, 0f); + } + + + public override void Notify_FormingCompleted() + { + Pawn pawn = this.activeBill.CreateProducts() as Pawn; + Messages.Message("GestationComplete".Translate() + ": " + pawn.kindDef.LabelCap, this, MessageTypeDefOf.PositiveEvent, true); + this.innerContainer.ClearAndDestroyContents(DestroyMode.Vanish); + this.innerContainer.TryAdd(pawn, true); + SoundDefOf.MechGestatorBill_Completed.PlayOneShot(this); + } + + public override IEnumerable GetGizmos() + { + if (this.comps != null) + { + for (int i = 0; i < this.comps.Count; i++) + { + foreach (Gizmo gizmo2 in this.comps[i].CompGetGizmosExtra()) + { + yield return gizmo2; + } + + } + } + if (((this.def.BuildableByPlayer && this.def.passability != Traversability.Impassable && !this.def.IsDoor) || this.def.building.forceShowRoomStats) && Gizmo_RoomStats.GetRoomToShowStatsFor(this) != null && Find.Selector.SingleSelectedObject == this) + { + yield return new Gizmo_RoomStats(this); + } + Gizmo selectMonumentMarkerGizmo = QuestUtility.GetSelectMonumentMarkerGizmo(this); + if (selectMonumentMarkerGizmo != null) + { + yield return selectMonumentMarkerGizmo; + } + if (this.def.Minifiable && base.Faction == Faction.OfPlayer) + { + yield return InstallationDesignatorDatabase.DesignatorFor(this.def); + } + ColorInt? glowerColorOverride = null; + CompGlower comp; + if ((comp = base.GetComp()) != null && comp.HasGlowColorOverride) + { + glowerColorOverride = new ColorInt?(comp.GlowColor); + } + if (!this.def.building.neverBuildable) + { + Command command = BuildCopyCommandUtility.BuildCopyCommand(this.def, base.Stuff, base.StyleSourcePrecept as Precept_Building, this.StyleDef, true, glowerColorOverride); + if (command != null) + { + yield return command; + } + } + if (base.Faction == Faction.OfPlayer || this.def.building.alwaysShowRelatedBuildCommands) + { + foreach (Command command2 in BuildRelatedCommandUtility.RelatedBuildCommands(this.def)) + { + yield return command2; + } + } + Lord lord; + if ((lord = this.GetLord()) != null && lord.CurLordToil != null) + { + foreach (Gizmo gizmo2 in lord.CurLordToil.GetBuildingGizmos(this)) + { + yield return gizmo2; + } + } + + if (DebugSettings.ShowDevGizmos) + { + if (this.ActiveMechBill != null && this.ActiveMechBill.State != FormingState.Gathering && this.ActiveMechBill.State != FormingState.Formed) + { + yield return new Command_Action + { + action = delegate () + { + this.ActiveBill.formingTicks -= (float)this.ActiveBill.recipe.formingTicks * 0.25f; + }, + defaultLabel = "DEV: Forming cycle +25%" + }; + yield return new Command_Action + { + action = delegate () + { + this.ActiveBill.formingTicks = 0f; + }, + defaultLabel = "DEV: Complete cycle" + }; + yield return new Command_Action + { + action = new Action(this.ActiveMechBill.ForceCompleteAllCycles), + defaultLabel = "DEV: Complete all cycles" + }; + } + } + yield break; + } + } +} diff --git a/Source/New Mech/ThingClass/Building_SteamMachine.cs b/Source/New Mech/ThingClass/Building_SteamMachine.cs new file mode 100644 index 0000000..7a5e670 --- /dev/null +++ b/Source/New Mech/ThingClass/Building_SteamMachine.cs @@ -0,0 +1,48 @@ +using Verse; +using PipeSystem; +using System.Collections.Generic; +using RimWorld; + +namespace MedievalBiotech +{ + public class Building_SteamMachine : Building + { + + private List traders = new List(); + public CompRefuelable compRefuelable; + private int tradersCount = 0; + + public override void SpawnSetup(Map map, bool respawningAfterLoad) + { + base.SpawnSetup(map, respawningAfterLoad); + var comps = this.GetComps(); + this.traders = new List(comps); + this.tradersCount = this.traders.Count; + this.compRefuelable = this.GetComp(); + } + + public override void Tick() + { + base.Tick(); + if (compRefuelable != null) + { + if (compRefuelable.HasFuel) + { + for (int index = 0; index < this.tradersCount; ++index) + { + this.BroadcastCompSignal(traders[index].OnSignal); + } + + } + else + { + for (int index = 0; index < this.tradersCount; ++index) + { + this.BroadcastCompSignal(traders[index].OffSignal); + } + } + } + + } + } +} diff --git a/Source/Utility/AbilitySoul.cs b/Source/Utility/AbilitySoul.cs new file mode 100644 index 0000000..eb40592 --- /dev/null +++ b/Source/Utility/AbilitySoul.cs @@ -0,0 +1,27 @@ +using RimWorld; +using System.Collections.Generic; + +namespace MedievalBiotech +{ + public class AbilitySoul : Ability + { + public float SoulCost() + { + if (this.comps != null) + { + using (List.Enumerator enumerator = this.comps.GetEnumerator()) + { + while (enumerator.MoveNext()) + { + CompAbilityEffect_SoulCost compAbilityEffect_HemogenCost; + if ((compAbilityEffect_HemogenCost = (enumerator.Current as CompAbilityEffect_SoulCost)) != null) + { + return compAbilityEffect_HemogenCost.Props.soulCost; + } + } + } + } + return 0f; + } + } +} diff --git a/Source/HarmonyPatches/HarmonyPatches.cs b/Source/Utility/HarmonyPatches.cs similarity index 100% rename from Source/HarmonyPatches/HarmonyPatches.cs rename to Source/Utility/HarmonyPatches.cs diff --git a/Source/Utility/IngestionOutcomeDoer_OffsetSoul.cs b/Source/Utility/IngestionOutcomeDoer_OffsetSoul.cs new file mode 100644 index 0000000..fde2611 --- /dev/null +++ b/Source/Utility/IngestionOutcomeDoer_OffsetSoul.cs @@ -0,0 +1,27 @@ +using RimWorld; +using System.Collections.Generic; +using UnityEngine; +using Verse; + +namespace MedievalBiotech +{ + public class IngestionOutcomeDoer_OffsetSoul : IngestionOutcomeDoer + { + public override void DoIngestionOutcomeSpecial(Pawn pawn, Thing ingested, int ingestedCount) + { + Utility.OffsetSoul(pawn, this.offset * (float)ingestedCount, true); + } + + public override IEnumerable SpecialDisplayStats(ThingDef parentDef) + { + if (ModsConfig.BiotechActive) + { + string arg = (this.offset >= 0f) ? "+" : string.Empty; + yield return new StatDrawEntry(StatCategoryDefOf.BasicsNonPawnImportant, "MB_DarkArcana".Translate().CapitalizeFirst(), arg + Mathf.RoundToInt(this.offset * 100f), "MB_DarkArcana_Desc".Translate(), 1000, null, null, false, false); + } + yield break; + } + + public float offset; + } +} diff --git a/Source/Utility/MB_DefOf.cs b/Source/Utility/MB_DefOf.cs new file mode 100644 index 0000000..30ac8b5 --- /dev/null +++ b/Source/Utility/MB_DefOf.cs @@ -0,0 +1,31 @@ +using RimWorld; +using Verse; + +namespace MedievalBiotech +{ + [DefOf] + public static class MB_DefOf + { + public static JobDef MB_OperateOnPawn; + public static JobDef MB_CarryCorpseToTable; + public static EffecterDef ButcherFlesh; + public static SoundDef Recipe_ButcherCorpseFlesh; + public static ThingDef MB_GenePotionsRack; + public static ThingDef GeneProcessor; + + public static HediffDef MB_BloodChaliceImplant; + public static HediffDef MB_NecronomiconImplant; + + public static StatDef SoulGainFactor; + public static GeneDef MB_SoulStarved; + + public static ThingDef MB_CorruptedSoulGemBasic; + public static ThingDef MB_CorruptedSoulGemRegular; + public static ThingDef MB_CorruptedSoulGemHigh; + public static ThingDef MB_SoulGemHigh; + public static ThingDef MB_ArcanaStone; + + public static ThingDef MB_BasicRecharger; + public static ThingDef MB_BandNode; + } +} diff --git a/Source/Utility/Utility.cs b/Source/Utility/Utility.cs new file mode 100644 index 0000000..a185d53 --- /dev/null +++ b/Source/Utility/Utility.cs @@ -0,0 +1,211 @@ +using RimWorld; +using UnityEngine; +using Verse; +using Verse.AI; + +namespace MedievalBiotech +{ + public class Utility + { + public static bool IsSanguinMage(Pawn pawn) + { + if (pawn.health.hediffSet.HasHediff(MB_DefOf.MB_BloodChaliceImplant)) + { + return true; + } + return false; + } + + public static bool IsNecromancer(Pawn pawn) + { + if (pawn.health.hediffSet.HasHediff(MB_DefOf.MB_NecronomiconImplant)) + { + return true; + } + return false; + } + + public static bool IsUndeadMech(Pawn pawn) + { + var extension = pawn.def.GetModExtension()?.UndeadMech; + if (extension == true) + { + return true; + } + return false; + } + + public static bool IsSanguinMech(Pawn pawn) + { + var extension = pawn.def.GetModExtension()?.DemonMech; + if (extension == true) + { + return true; + } + return false; + } + + public static bool IsArtificeMech(Pawn pawn) + { + var extension = pawn.def.GetModExtension()?.ArtificeMech; + if (extension == true) + { + return true; + } + return false; + } + + public static Building_MechCharger GetClosestCharger(Pawn carrier, Pawn mech, bool forced) + { + if (mech == null) + { + Log.Error("[ERROR] GetClosestCharger called with null mech."); + return null; + } + + if (mech.Map == null) + { + Log.Error($"[ERROR] Mech {mech} has no valid map."); + return null; + } + + Danger danger = forced ? Danger.Deadly : Danger.Some; + Building_MechCharger closestCharger = null; + float closestDist = float.MaxValue; + + var potentialChargers = mech.Map.GetComponent()?.allChargers; + if (potentialChargers == null || potentialChargers.Count == 0) + { + return null; + } + + var reservationManager = mech.Map.reservationManager; + + foreach (Building_SteamCharger charger in potentialChargers) + { + if (!carrier.CanReach(charger, PathEndMode.InteractionCell, danger, false, false, TraverseMode.ByPawn)) + { + continue; + } + + bool isReserved = reservationManager.ReservedBy(charger, carrier, null); + if ((!forced && isReserved) || (forced && KeyBindingDefOf.QueueOrder.IsDownEvent && isReserved)) + { + continue; + } + + if (charger.IsForbidden(carrier) || !carrier.CanReserve(charger, 1, -1, null, forced)) + { + continue; + } + + if (!charger.CanPawnChargeCurrently(mech)) + { + continue; + } + + float dist = (charger.Position - mech.Position).LengthHorizontalSquared; + if (dist < closestDist) + { + closestDist = dist; + closestCharger = charger; + } + } + + return closestCharger; + } + + + + + + + public static void OffsetSoul(Pawn pawn, float offset, bool applyStatFactor = true) + { + if (!ModsConfig.BiotechActive) + { + return; + } + if (offset > 0f && applyStatFactor) + { + offset *= pawn.GetStatValue(MB_DefOf.SoulGainFactor, true, -1); + } + Pawn_GeneTracker genes = pawn.genes; + Gene_SoulDrain gene_SoulDrain = (genes != null) ? genes.GetFirstGeneOfType() : null; + if (gene_SoulDrain != null) + { + GeneResourceDrainUtility.OffsetResource(gene_SoulDrain, offset); + return; + } + Pawn_GeneTracker genes2 = pawn.genes; + Gene_Soul gene_Soul = (genes2 != null) ? genes2.GetFirstGeneOfType() : null; + if (gene_Soul != null) + { + gene_Soul.Value += offset; + } + } + + public static void DoDrain(Pawn biter, Pawn victim, float targetSoulGain, float victimResistanceGain, ThoughtDef thoughtDefToGiveTarget = null, ThoughtDef opinionThoughtToGiveTarget = null) + { + if (!ModLister.CheckBiotech("Sanguophage bite")) + { + return; + } + float num2 = targetSoulGain * victim.BodySize; + Utility.OffsetSoul(biter, num2, true); + Utility.OffsetSoul(victim, -num2, true); + Pawn_NeedsTracker needs = biter.needs; + if (thoughtDefToGiveTarget != null) + { + Pawn_NeedsTracker needs2 = victim.needs; + if (needs2 != null) + { + Need_Mood mood = needs2.mood; + if (mood != null) + { + ThoughtHandler thoughts = mood.thoughts; + if (thoughts != null) + { + MemoryThoughtHandler memories = thoughts.memories; + if (memories != null) + { + memories.TryGainMemory((Thought_Memory)ThoughtMaker.MakeThought(thoughtDefToGiveTarget), biter); + } + } + } + } + } + if (opinionThoughtToGiveTarget != null) + { + Pawn_NeedsTracker needs3 = victim.needs; + if (needs3 != null) + { + Need_Mood mood2 = needs3.mood; + if (mood2 != null) + { + ThoughtHandler thoughts2 = mood2.thoughts; + if (thoughts2 != null) + { + MemoryThoughtHandler memories2 = thoughts2.memories; + if (memories2 != null) + { + memories2.TryGainMemory((Thought_Memory)ThoughtMaker.MakeThought(opinionThoughtToGiveTarget), biter); + } + } + } + } + } + //if (targetBloodLoss > 0f) + //{ + // victim.health.AddHediff(HediffDefOf.BloodfeederMark, ExecutionUtility.ExecuteCutPart(victim), null, null); + // Hediff hediff = HediffMaker.MakeHediff(HediffDefOf.BloodLoss, victim, null); + // hediff.Severity = targetBloodLoss; + // victim.health.AddHediff(hediff, null, null, null); + //} + if (victim.IsPrisoner && victimResistanceGain > 0f) + { + victim.guest.resistance = Mathf.Min(victim.guest.resistance + victimResistanceGain, victim.kindDef.initialResistanceRange.Value.TrueMax); + } + } + } +} diff --git a/Source/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs b/Source/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs new file mode 100644 index 0000000..15efebf --- /dev/null +++ b/Source/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] diff --git a/Source/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/Source/obj/Debug/DesignTimeResolveAssemblyReferences.cache new file mode 100644 index 0000000..9faa997 Binary files /dev/null and b/Source/obj/Debug/DesignTimeResolveAssemblyReferences.cache differ diff --git a/Source/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/Source/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache index 3ecd4af..332cdd4 100644 Binary files a/Source/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache and b/Source/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/Source/obj/Debug/MedievalBiotech.csproj.AssemblyReference.cache b/Source/obj/Debug/MedievalBiotech.csproj.AssemblyReference.cache index d750348..53f13d8 100644 Binary files a/Source/obj/Debug/MedievalBiotech.csproj.AssemblyReference.cache and b/Source/obj/Debug/MedievalBiotech.csproj.AssemblyReference.cache differ diff --git a/Source/obj/Debug/MedievalBiotech.csproj.CoreCompileInputs.cache b/Source/obj/Debug/MedievalBiotech.csproj.CoreCompileInputs.cache index c57383c..6bd19f7 100644 --- a/Source/obj/Debug/MedievalBiotech.csproj.CoreCompileInputs.cache +++ b/Source/obj/Debug/MedievalBiotech.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -1c7e5814a280c65f4afca098dba52d0195552502 +51c2fe4864e7ecd07903b639a508ed4aee8155c6cfb9e0ae311aaff6c2b9631b diff --git a/Source/obj/Debug/MedievalBiotech.csproj.FileListAbsolute.txt b/Source/obj/Debug/MedievalBiotech.csproj.FileListAbsolute.txt index ed1b660..6da1332 100644 --- a/Source/obj/Debug/MedievalBiotech.csproj.FileListAbsolute.txt +++ b/Source/obj/Debug/MedievalBiotech.csproj.FileListAbsolute.txt @@ -1,5 +1,6 @@ C:\Program Files (x86)\Steam\steamapps\common\RimWorld\Mods\MedievalBiotech\v1.4\Assemblies\MedievalBiotech.dll C:\Program Files (x86)\Steam\steamapps\common\RimWorld\Mods\MedievalBiotech\Source\obj\Debug\MedievalBiotech.csproj.AssemblyReference.cache C:\Program Files (x86)\Steam\steamapps\common\RimWorld\Mods\MedievalBiotech\Source\obj\Debug\MedievalBiotech.csproj.CoreCompileInputs.cache -C:\Program Files (x86)\Steam\steamapps\common\RimWorld\Mods\MedievalBiotech\Source\obj\Debug\MedievalBiotech.csproj.CopyComplete C:\Program Files (x86)\Steam\steamapps\common\RimWorld\Mods\MedievalBiotech\Source\obj\Debug\MedievalBiotech.dll +C:\Program Files (x86)\Steam\steamapps\common\RimWorld\Mods\MedievalBiotech\1.5\Assemblies\MedievalBiotech.dll +C:\Program Files (x86)\Steam\steamapps\common\RimWorld\Mods\MedievalBiotech\Source\obj\Debug\Medieval.B25F7F59.Up2Date diff --git a/Source/obj/Debug/PublicizedAssemblies/Assembly-CSharp.2DDABC9D4B359E3F8FEB3A1FCBA9DDE1/Assembly-CSharp.dll b/Source/obj/Debug/PublicizedAssemblies/Assembly-CSharp.2DDABC9D4B359E3F8FEB3A1FCBA9DDE1/Assembly-CSharp.dll new file mode 100644 index 0000000..1a66cf1 Binary files /dev/null and b/Source/obj/Debug/PublicizedAssemblies/Assembly-CSharp.2DDABC9D4B359E3F8FEB3A1FCBA9DDE1/Assembly-CSharp.dll differ diff --git a/Source/obj/Debug/PublicizedAssemblies/Assembly-CSharp.4D800E474A3131E504B54FB6023498AD/Assembly-CSharp.dll b/Source/obj/Debug/PublicizedAssemblies/Assembly-CSharp.4D800E474A3131E504B54FB6023498AD/Assembly-CSharp.dll new file mode 100644 index 0000000..39acdcb Binary files /dev/null and b/Source/obj/Debug/PublicizedAssemblies/Assembly-CSharp.4D800E474A3131E504B54FB6023498AD/Assembly-CSharp.dll differ diff --git a/Source/obj/MedievalBiotech.csproj.nuget.dgspec.json b/Source/obj/MedievalBiotech.csproj.nuget.dgspec.json index 97a8657..4279d5d 100644 --- a/Source/obj/MedievalBiotech.csproj.nuget.dgspec.json +++ b/Source/obj/MedievalBiotech.csproj.nuget.dgspec.json @@ -10,43 +10,49 @@ "projectUniqueName": "C:\\Program Files (x86)\\Steam\\steamapps\\common\\RimWorld\\Mods\\MedievalBiotech\\Source\\MedievalBiotech.csproj", "projectName": "MedievalBiotech", "projectPath": "C:\\Program Files (x86)\\Steam\\steamapps\\common\\RimWorld\\Mods\\MedievalBiotech\\Source\\MedievalBiotech.csproj", - "packagesPath": "C:\\Users\\Vova\\.nuget\\packages\\", + "packagesPath": "C:\\Users\\Enurta\\.nuget\\packages\\", "outputPath": "C:\\Program Files (x86)\\Steam\\steamapps\\common\\RimWorld\\Mods\\MedievalBiotech\\Source\\obj\\", "projectStyle": "PackageReference", "skipContentFileWrite": true, "configFilePaths": [ - "C:\\Users\\Vova\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Users\\Enurta\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ - "net472" + "net48" ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { - "net472": { + "net48": { "projectReferences": {} } + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" } }, "frameworks": { - "net472": { + "net48": { "dependencies": { "Krafs.Publicizer": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", - "version": "[2.1.0, )" + "version": "[2.*, )" }, "Krafs.Rimworld.Ref": { "target": "Package", - "version": "[1.4.3580, )" + "version": "[1.*-*, )" }, "Lib.Harmony": { + "include": "Compile, Build, Native, ContentFiles, Analyzers, BuildTransitive", "target": "Package", - "version": "[2.2.2, )" + "version": "[2.*, )" } } } @@ -55,6 +61,9 @@ "win": { "#import": [] }, + "win-arm64": { + "#import": [] + }, "win-x64": { "#import": [] }, diff --git a/Source/obj/MedievalBiotech.csproj.nuget.g.props b/Source/obj/MedievalBiotech.csproj.nuget.g.props index 45ef7b7..ec90faa 100644 --- a/Source/obj/MedievalBiotech.csproj.nuget.g.props +++ b/Source/obj/MedievalBiotech.csproj.nuget.g.props @@ -5,14 +5,14 @@ NuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ - C:\Users\Vova\.nuget\packages\ + C:\Users\Enurta\.nuget\packages\ PackageReference - 6.4.0 + 6.11.0 - + - + \ No newline at end of file diff --git a/Source/obj/MedievalBiotech.csproj.nuget.g.targets b/Source/obj/MedievalBiotech.csproj.nuget.g.targets index 08209e7..2a8ca46 100644 --- a/Source/obj/MedievalBiotech.csproj.nuget.g.targets +++ b/Source/obj/MedievalBiotech.csproj.nuget.g.targets @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/Source/obj/project.assets.json b/Source/obj/project.assets.json index 194f7b9..b8f9a4b 100644 --- a/Source/obj/project.assets.json +++ b/Source/obj/project.assets.json @@ -1,8 +1,8 @@ { "version": 3, "targets": { - ".NETFramework,Version=v4.7.2": { - "Krafs.Publicizer/2.1.0": { + ".NETFramework,Version=v4.8": { + "Krafs.Publicizer/2.3.0": { "type": "package", "contentFiles": { "contentfiles/cs/any/Publicizer/IgnoresAccessChecksToAttribute.cs": { @@ -16,7 +16,7 @@ "build/Krafs.Publicizer.targets": {} } }, - "Krafs.Rimworld.Ref/1.4.3580": { + "Krafs.Rimworld.Ref/1.5.4297": { "type": "package", "compile": { "ref/net472/Assembly-CSharp-firstpass.dll": {}, @@ -26,14 +26,20 @@ "ref/net472/Mono.Security.dll": {}, "ref/net472/NAudio.dll": {}, "ref/net472/NVorbis.dll": {}, + "ref/net472/System.ComponentModel.Composition.dll": {}, "ref/net472/System.Configuration.dll": {}, "ref/net472/System.Core.dll": {}, "ref/net472/System.Runtime.Serialization.dll": {}, + "ref/net472/System.Runtime.dll": {}, "ref/net472/System.Security.dll": {}, "ref/net472/System.ServiceModel.Internals.dll": {}, "ref/net472/System.Xml.Linq.dll": {}, "ref/net472/System.Xml.dll": {}, "ref/net472/System.dll": {}, + "ref/net472/Unity.Burst.Unsafe.dll": {}, + "ref/net472/Unity.Burst.dll": {}, + "ref/net472/Unity.Mathematics.dll": {}, + "ref/net472/Unity.MemoryProfiler.dll": {}, "ref/net472/Unity.TextMeshPro.dll": {}, "ref/net472/UnityEngine.AIModule.dll": {}, "ref/net472/UnityEngine.ARModule.dll": {}, @@ -100,22 +106,22 @@ "ref/net472/mscorlib.dll": {} } }, - "Lib.Harmony/2.2.2": { + "Lib.Harmony/2.3.5": { "type": "package", "compile": { - "lib/net472/0Harmony.dll": { - "related": ".xml" + "lib/net48/0Harmony.dll": { + "related": ".pdb;.xml" } }, "runtime": { - "lib/net472/0Harmony.dll": { - "related": ".xml" + "lib/net48/_._": { + "related": ".pdb;.xml" } } } }, - ".NETFramework,Version=v4.7.2/win": { - "Krafs.Publicizer/2.1.0": { + ".NETFramework,Version=v4.8/win": { + "Krafs.Publicizer/2.3.0": { "type": "package", "contentFiles": { "contentfiles/cs/any/Publicizer/IgnoresAccessChecksToAttribute.cs": { @@ -129,7 +135,7 @@ "build/Krafs.Publicizer.targets": {} } }, - "Krafs.Rimworld.Ref/1.4.3580": { + "Krafs.Rimworld.Ref/1.5.4297": { "type": "package", "compile": { "ref/net472/Assembly-CSharp-firstpass.dll": {}, @@ -139,14 +145,20 @@ "ref/net472/Mono.Security.dll": {}, "ref/net472/NAudio.dll": {}, "ref/net472/NVorbis.dll": {}, + "ref/net472/System.ComponentModel.Composition.dll": {}, "ref/net472/System.Configuration.dll": {}, "ref/net472/System.Core.dll": {}, "ref/net472/System.Runtime.Serialization.dll": {}, + "ref/net472/System.Runtime.dll": {}, "ref/net472/System.Security.dll": {}, "ref/net472/System.ServiceModel.Internals.dll": {}, "ref/net472/System.Xml.Linq.dll": {}, "ref/net472/System.Xml.dll": {}, "ref/net472/System.dll": {}, + "ref/net472/Unity.Burst.Unsafe.dll": {}, + "ref/net472/Unity.Burst.dll": {}, + "ref/net472/Unity.Mathematics.dll": {}, + "ref/net472/Unity.MemoryProfiler.dll": {}, "ref/net472/Unity.TextMeshPro.dll": {}, "ref/net472/UnityEngine.AIModule.dll": {}, "ref/net472/UnityEngine.ARModule.dll": {}, @@ -213,22 +225,22 @@ "ref/net472/mscorlib.dll": {} } }, - "Lib.Harmony/2.2.2": { + "Lib.Harmony/2.3.5": { "type": "package", "compile": { - "lib/net472/0Harmony.dll": { - "related": ".xml" + "lib/net48/0Harmony.dll": { + "related": ".pdb;.xml" } }, "runtime": { - "lib/net472/0Harmony.dll": { - "related": ".xml" + "lib/net48/_._": { + "related": ".pdb;.xml" } } } }, - ".NETFramework,Version=v4.7.2/win-x64": { - "Krafs.Publicizer/2.1.0": { + ".NETFramework,Version=v4.8/win-arm64": { + "Krafs.Publicizer/2.3.0": { "type": "package", "contentFiles": { "contentfiles/cs/any/Publicizer/IgnoresAccessChecksToAttribute.cs": { @@ -242,7 +254,7 @@ "build/Krafs.Publicizer.targets": {} } }, - "Krafs.Rimworld.Ref/1.4.3580": { + "Krafs.Rimworld.Ref/1.5.4297": { "type": "package", "compile": { "ref/net472/Assembly-CSharp-firstpass.dll": {}, @@ -252,14 +264,20 @@ "ref/net472/Mono.Security.dll": {}, "ref/net472/NAudio.dll": {}, "ref/net472/NVorbis.dll": {}, + "ref/net472/System.ComponentModel.Composition.dll": {}, "ref/net472/System.Configuration.dll": {}, "ref/net472/System.Core.dll": {}, "ref/net472/System.Runtime.Serialization.dll": {}, + "ref/net472/System.Runtime.dll": {}, "ref/net472/System.Security.dll": {}, "ref/net472/System.ServiceModel.Internals.dll": {}, "ref/net472/System.Xml.Linq.dll": {}, "ref/net472/System.Xml.dll": {}, "ref/net472/System.dll": {}, + "ref/net472/Unity.Burst.Unsafe.dll": {}, + "ref/net472/Unity.Burst.dll": {}, + "ref/net472/Unity.Mathematics.dll": {}, + "ref/net472/Unity.MemoryProfiler.dll": {}, "ref/net472/Unity.TextMeshPro.dll": {}, "ref/net472/UnityEngine.AIModule.dll": {}, "ref/net472/UnityEngine.ARModule.dll": {}, @@ -326,22 +344,22 @@ "ref/net472/mscorlib.dll": {} } }, - "Lib.Harmony/2.2.2": { + "Lib.Harmony/2.3.5": { "type": "package", "compile": { - "lib/net472/0Harmony.dll": { - "related": ".xml" + "lib/net48/0Harmony.dll": { + "related": ".pdb;.xml" } }, "runtime": { - "lib/net472/0Harmony.dll": { - "related": ".xml" + "lib/net48/_._": { + "related": ".pdb;.xml" } } } }, - ".NETFramework,Version=v4.7.2/win-x86": { - "Krafs.Publicizer/2.1.0": { + ".NETFramework,Version=v4.8/win-x64": { + "Krafs.Publicizer/2.3.0": { "type": "package", "contentFiles": { "contentfiles/cs/any/Publicizer/IgnoresAccessChecksToAttribute.cs": { @@ -355,7 +373,7 @@ "build/Krafs.Publicizer.targets": {} } }, - "Krafs.Rimworld.Ref/1.4.3580": { + "Krafs.Rimworld.Ref/1.5.4297": { "type": "package", "compile": { "ref/net472/Assembly-CSharp-firstpass.dll": {}, @@ -365,14 +383,20 @@ "ref/net472/Mono.Security.dll": {}, "ref/net472/NAudio.dll": {}, "ref/net472/NVorbis.dll": {}, + "ref/net472/System.ComponentModel.Composition.dll": {}, "ref/net472/System.Configuration.dll": {}, "ref/net472/System.Core.dll": {}, "ref/net472/System.Runtime.Serialization.dll": {}, + "ref/net472/System.Runtime.dll": {}, "ref/net472/System.Security.dll": {}, "ref/net472/System.ServiceModel.Internals.dll": {}, "ref/net472/System.Xml.Linq.dll": {}, "ref/net472/System.Xml.dll": {}, "ref/net472/System.dll": {}, + "ref/net472/Unity.Burst.Unsafe.dll": {}, + "ref/net472/Unity.Burst.dll": {}, + "ref/net472/Unity.Mathematics.dll": {}, + "ref/net472/Unity.MemoryProfiler.dll": {}, "ref/net472/Unity.TextMeshPro.dll": {}, "ref/net472/UnityEngine.AIModule.dll": {}, "ref/net472/UnityEngine.ARModule.dll": {}, @@ -439,26 +463,145 @@ "ref/net472/mscorlib.dll": {} } }, - "Lib.Harmony/2.2.2": { + "Lib.Harmony/2.3.5": { "type": "package", "compile": { - "lib/net472/0Harmony.dll": { - "related": ".xml" + "lib/net48/0Harmony.dll": { + "related": ".pdb;.xml" } }, "runtime": { - "lib/net472/0Harmony.dll": { - "related": ".xml" + "lib/net48/_._": { + "related": ".pdb;.xml" + } + } + } + }, + ".NETFramework,Version=v4.8/win-x86": { + "Krafs.Publicizer/2.3.0": { + "type": "package", + "contentFiles": { + "contentfiles/cs/any/Publicizer/IgnoresAccessChecksToAttribute.cs": { + "buildAction": "Compile", + "codeLanguage": "cs", + "copyToOutput": false + } + }, + "build": { + "build/Krafs.Publicizer.props": {}, + "build/Krafs.Publicizer.targets": {} + } + }, + "Krafs.Rimworld.Ref/1.5.4297": { + "type": "package", + "compile": { + "ref/net472/Assembly-CSharp-firstpass.dll": {}, + "ref/net472/Assembly-CSharp.dll": {}, + "ref/net472/ISharpZipLib.dll": {}, + "ref/net472/Mono.Posix.dll": {}, + "ref/net472/Mono.Security.dll": {}, + "ref/net472/NAudio.dll": {}, + "ref/net472/NVorbis.dll": {}, + "ref/net472/System.ComponentModel.Composition.dll": {}, + "ref/net472/System.Configuration.dll": {}, + "ref/net472/System.Core.dll": {}, + "ref/net472/System.Runtime.Serialization.dll": {}, + "ref/net472/System.Runtime.dll": {}, + "ref/net472/System.Security.dll": {}, + "ref/net472/System.ServiceModel.Internals.dll": {}, + "ref/net472/System.Xml.Linq.dll": {}, + "ref/net472/System.Xml.dll": {}, + "ref/net472/System.dll": {}, + "ref/net472/Unity.Burst.Unsafe.dll": {}, + "ref/net472/Unity.Burst.dll": {}, + "ref/net472/Unity.Mathematics.dll": {}, + "ref/net472/Unity.MemoryProfiler.dll": {}, + "ref/net472/Unity.TextMeshPro.dll": {}, + "ref/net472/UnityEngine.AIModule.dll": {}, + "ref/net472/UnityEngine.ARModule.dll": {}, + "ref/net472/UnityEngine.AccessibilityModule.dll": {}, + "ref/net472/UnityEngine.AndroidJNIModule.dll": {}, + "ref/net472/UnityEngine.AnimationModule.dll": {}, + "ref/net472/UnityEngine.AssetBundleModule.dll": {}, + "ref/net472/UnityEngine.AudioModule.dll": {}, + "ref/net472/UnityEngine.ClothModule.dll": {}, + "ref/net472/UnityEngine.ClusterInputModule.dll": {}, + "ref/net472/UnityEngine.ClusterRendererModule.dll": {}, + "ref/net472/UnityEngine.CoreModule.dll": {}, + "ref/net472/UnityEngine.CrashReportingModule.dll": {}, + "ref/net472/UnityEngine.DSPGraphModule.dll": {}, + "ref/net472/UnityEngine.DirectorModule.dll": {}, + "ref/net472/UnityEngine.GameCenterModule.dll": {}, + "ref/net472/UnityEngine.GridModule.dll": {}, + "ref/net472/UnityEngine.HotReloadModule.dll": {}, + "ref/net472/UnityEngine.IMGUIModule.dll": {}, + "ref/net472/UnityEngine.ImageConversionModule.dll": {}, + "ref/net472/UnityEngine.InputLegacyModule.dll": {}, + "ref/net472/UnityEngine.InputModule.dll": {}, + "ref/net472/UnityEngine.JSONSerializeModule.dll": {}, + "ref/net472/UnityEngine.LocalizationModule.dll": {}, + "ref/net472/UnityEngine.ParticleSystemModule.dll": {}, + "ref/net472/UnityEngine.PerformanceReportingModule.dll": {}, + "ref/net472/UnityEngine.Physics2DModule.dll": {}, + "ref/net472/UnityEngine.PhysicsModule.dll": {}, + "ref/net472/UnityEngine.ProfilerModule.dll": {}, + "ref/net472/UnityEngine.ScreenCaptureModule.dll": {}, + "ref/net472/UnityEngine.SharedInternalsModule.dll": {}, + "ref/net472/UnityEngine.SpriteMaskModule.dll": {}, + "ref/net472/UnityEngine.SpriteShapeModule.dll": {}, + "ref/net472/UnityEngine.StreamingModule.dll": {}, + "ref/net472/UnityEngine.SubstanceModule.dll": {}, + "ref/net472/UnityEngine.SubsystemsModule.dll": {}, + "ref/net472/UnityEngine.TLSModule.dll": {}, + "ref/net472/UnityEngine.TerrainModule.dll": {}, + "ref/net472/UnityEngine.TerrainPhysicsModule.dll": {}, + "ref/net472/UnityEngine.TextCoreModule.dll": {}, + "ref/net472/UnityEngine.TextRenderingModule.dll": {}, + "ref/net472/UnityEngine.TilemapModule.dll": {}, + "ref/net472/UnityEngine.UI.dll": {}, + "ref/net472/UnityEngine.UIElementsModule.dll": {}, + "ref/net472/UnityEngine.UIModule.dll": {}, + "ref/net472/UnityEngine.UNETModule.dll": {}, + "ref/net472/UnityEngine.UmbraModule.dll": {}, + "ref/net472/UnityEngine.UnityAnalyticsModule.dll": {}, + "ref/net472/UnityEngine.UnityConnectModule.dll": {}, + "ref/net472/UnityEngine.UnityTestProtocolModule.dll": {}, + "ref/net472/UnityEngine.UnityWebRequestAssetBundleModule.dll": {}, + "ref/net472/UnityEngine.UnityWebRequestAudioModule.dll": {}, + "ref/net472/UnityEngine.UnityWebRequestModule.dll": {}, + "ref/net472/UnityEngine.UnityWebRequestTextureModule.dll": {}, + "ref/net472/UnityEngine.UnityWebRequestWWWModule.dll": {}, + "ref/net472/UnityEngine.VFXModule.dll": {}, + "ref/net472/UnityEngine.VRModule.dll": {}, + "ref/net472/UnityEngine.VehiclesModule.dll": {}, + "ref/net472/UnityEngine.VideoModule.dll": {}, + "ref/net472/UnityEngine.WindModule.dll": {}, + "ref/net472/UnityEngine.XRModule.dll": {}, + "ref/net472/UnityEngine.dll": {}, + "ref/net472/com.rlabrecque.steamworks.net.dll": {}, + "ref/net472/mscorlib.dll": {} + } + }, + "Lib.Harmony/2.3.5": { + "type": "package", + "compile": { + "lib/net48/0Harmony.dll": { + "related": ".pdb;.xml" + } + }, + "runtime": { + "lib/net48/_._": { + "related": ".pdb;.xml" } } } } }, "libraries": { - "Krafs.Publicizer/2.1.0": { - "sha512": "jRZRbQrs09rICx3qrYIG9Fl8D5GEPorUGhGO0f0ewPmTWvbJvq1KDniIIumVOy4MTezXl16FoUqU6jlDu3La/Q==", + "Krafs.Publicizer/2.3.0": { + "sha512": "DjktTgctwxUMhMkWKrRECer3LR1lHzanCOlE4mpinAiY8SfWJq4DG/QitP5h1A+WBjyWHzQSOG+204i3VpO1FA==", "type": "package", - "path": "krafs.publicizer/2.1.0", + "path": "krafs.publicizer/2.3.0", "files": [ ".nupkg.metadata", ".signature.p7s", @@ -469,21 +612,21 @@ "build/net472/dnlib.dll", "contentfiles/cs/any/Publicizer/IgnoresAccessChecksToAttribute.cs", "icon.png", - "krafs.publicizer.2.1.0.nupkg.sha512", + "krafs.publicizer.2.3.0.nupkg.sha512", "krafs.publicizer.nuspec" ] }, - "Krafs.Rimworld.Ref/1.4.3580": { - "sha512": "1fA57QZ6jcqvbcfwRLAQA/Si46dS+t7JaRZY2TSvL+T8SK1oY1RPpimWqYwIRAUsh1RGAPXL/RwPbnW+8y4oIQ==", + "Krafs.Rimworld.Ref/1.5.4297": { + "sha512": "uhY1DK8YQB55IamhyOus6A//S47F93JiOe5ORBv+KnN9HNOanAQY8TaBMKpJKhdZj2GHYny/7rZixjv4DAKYMQ==", "type": "package", - "path": "krafs.rimworld.ref/1.4.3580", + "path": "krafs.rimworld.ref/1.5.4297", "files": [ ".nupkg.metadata", ".signature.p7s", "LICENSE.md", "README.md", "icon.png", - "krafs.rimworld.ref.1.4.3580.nupkg.sha512", + "krafs.rimworld.ref.1.5.4297.nupkg.sha512", "krafs.rimworld.ref.nuspec", "ref/net472/Assembly-CSharp-firstpass.dll", "ref/net472/Assembly-CSharp.dll", @@ -492,14 +635,20 @@ "ref/net472/Mono.Security.dll", "ref/net472/NAudio.dll", "ref/net472/NVorbis.dll", + "ref/net472/System.ComponentModel.Composition.dll", "ref/net472/System.Configuration.dll", "ref/net472/System.Core.dll", "ref/net472/System.Runtime.Serialization.dll", + "ref/net472/System.Runtime.dll", "ref/net472/System.Security.dll", "ref/net472/System.ServiceModel.Internals.dll", "ref/net472/System.Xml.Linq.dll", "ref/net472/System.Xml.dll", "ref/net472/System.dll", + "ref/net472/Unity.Burst.Unsafe.dll", + "ref/net472/Unity.Burst.dll", + "ref/net472/Unity.Mathematics.dll", + "ref/net472/Unity.MemoryProfiler.dll", "ref/net472/Unity.TextMeshPro.dll", "ref/net472/UnityEngine.AIModule.dll", "ref/net472/UnityEngine.ARModule.dll", @@ -566,45 +715,64 @@ "ref/net472/mscorlib.dll" ] }, - "Lib.Harmony/2.2.2": { - "sha512": "70KvWz+DiUELxafsYL/LHxA/jH3PDWeApLo/VwtnrpTvRWQ/eUdPfS/l5funmhZWOy41QXw6UjVv+6C57Nx77A==", + "Lib.Harmony/2.3.5": { + "sha512": "LgVL1EhCYtY39YNp/h1PNraKdQn9Vwyb70bYIVLxz60zRgOTi11YohOjJwk4zXsIAoJLG57lO4aP6WXs2fv23A==", "type": "package", - "path": "lib.harmony/2.2.2", + "path": "lib.harmony/2.3.5", "files": [ ".nupkg.metadata", ".signature.p7s", "HarmonyLogo.png", "LICENSE", - "lib.harmony.2.2.2.nupkg.sha512", + "README.md", + "lib.harmony.2.3.5.nupkg.sha512", "lib.harmony.nuspec", "lib/net35/0Harmony.dll", + "lib/net35/0Harmony.pdb", "lib/net35/0Harmony.xml", - "lib/net45/0Harmony.dll", - "lib/net45/0Harmony.xml", + "lib/net452/0Harmony.dll", + "lib/net452/0Harmony.pdb", + "lib/net452/0Harmony.xml", "lib/net472/0Harmony.dll", + "lib/net472/0Harmony.pdb", "lib/net472/0Harmony.xml", "lib/net48/0Harmony.dll", + "lib/net48/0Harmony.pdb", "lib/net48/0Harmony.xml", "lib/net5.0/0Harmony.dll", + "lib/net5.0/0Harmony.pdb", "lib/net5.0/0Harmony.xml", "lib/net6.0/0Harmony.dll", + "lib/net6.0/0Harmony.pdb", "lib/net6.0/0Harmony.xml", + "lib/net7.0/0Harmony.dll", + "lib/net7.0/0Harmony.pdb", + "lib/net7.0/0Harmony.xml", + "lib/net8.0/0Harmony.dll", + "lib/net8.0/0Harmony.pdb", + "lib/net8.0/0Harmony.xml", + "lib/net9.0/0Harmony.dll", + "lib/net9.0/0Harmony.pdb", + "lib/net9.0/0Harmony.xml", "lib/netcoreapp3.0/0Harmony.dll", + "lib/netcoreapp3.0/0Harmony.pdb", "lib/netcoreapp3.0/0Harmony.xml", "lib/netcoreapp3.1/0Harmony.dll", - "lib/netcoreapp3.1/0Harmony.xml" + "lib/netcoreapp3.1/0Harmony.pdb", + "lib/netcoreapp3.1/0Harmony.xml", + "lib/netstandard2.0/_._" ] } }, "projectFileDependencyGroups": { - ".NETFramework,Version=v4.7.2": [ - "Krafs.Publicizer >= 2.1.0", - "Krafs.Rimworld.Ref >= 1.4.3580", - "Lib.Harmony >= 2.2.2" + ".NETFramework,Version=v4.8": [ + "Krafs.Publicizer >= 2.*", + "Krafs.Rimworld.Ref >= 1.*-*", + "Lib.Harmony >= 2.*" ] }, "packageFolders": { - "C:\\Users\\Vova\\.nuget\\packages\\": {} + "C:\\Users\\Enurta\\.nuget\\packages\\": {} }, "project": { "version": "1.0.0", @@ -612,43 +780,49 @@ "projectUniqueName": "C:\\Program Files (x86)\\Steam\\steamapps\\common\\RimWorld\\Mods\\MedievalBiotech\\Source\\MedievalBiotech.csproj", "projectName": "MedievalBiotech", "projectPath": "C:\\Program Files (x86)\\Steam\\steamapps\\common\\RimWorld\\Mods\\MedievalBiotech\\Source\\MedievalBiotech.csproj", - "packagesPath": "C:\\Users\\Vova\\.nuget\\packages\\", + "packagesPath": "C:\\Users\\Enurta\\.nuget\\packages\\", "outputPath": "C:\\Program Files (x86)\\Steam\\steamapps\\common\\RimWorld\\Mods\\MedievalBiotech\\Source\\obj\\", "projectStyle": "PackageReference", "skipContentFileWrite": true, "configFilePaths": [ - "C:\\Users\\Vova\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Users\\Enurta\\AppData\\Roaming\\NuGet\\NuGet.Config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ - "net472" + "net48" ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { - "net472": { + "net48": { "projectReferences": {} } + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" } }, "frameworks": { - "net472": { + "net48": { "dependencies": { "Krafs.Publicizer": { "include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive", "suppressParent": "All", "target": "Package", - "version": "[2.1.0, )" + "version": "[2.*, )" }, "Krafs.Rimworld.Ref": { "target": "Package", - "version": "[1.4.3580, )" + "version": "[1.*-*, )" }, "Lib.Harmony": { + "include": "Compile, Build, Native, ContentFiles, Analyzers, BuildTransitive", "target": "Package", - "version": "[2.2.2, )" + "version": "[2.*, )" } } } @@ -657,6 +831,9 @@ "win": { "#import": [] }, + "win-arm64": { + "#import": [] + }, "win-x64": { "#import": [] }, diff --git a/Source/obj/project.nuget.cache b/Source/obj/project.nuget.cache index dbfb942..543df31 100644 --- a/Source/obj/project.nuget.cache +++ b/Source/obj/project.nuget.cache @@ -1,12 +1,12 @@ { "version": 2, - "dgSpecHash": "9Fu4sD5zpoE3Ejfc5dP3tCRctTg8QdCxXfrnMmanzfWNS3L5CwehEvDCZ+yNdly1Y5K7Wul4VRYlKXvXnWQYcQ==", + "dgSpecHash": "k3hecq0KZBk=", "success": true, "projectFilePath": "C:\\Program Files (x86)\\Steam\\steamapps\\common\\RimWorld\\Mods\\MedievalBiotech\\Source\\MedievalBiotech.csproj", "expectedPackageFiles": [ - "C:\\Users\\Vova\\.nuget\\packages\\krafs.publicizer\\2.1.0\\krafs.publicizer.2.1.0.nupkg.sha512", - "C:\\Users\\Vova\\.nuget\\packages\\krafs.rimworld.ref\\1.4.3580\\krafs.rimworld.ref.1.4.3580.nupkg.sha512", - "C:\\Users\\Vova\\.nuget\\packages\\lib.harmony\\2.2.2\\lib.harmony.2.2.2.nupkg.sha512" + "C:\\Users\\Enurta\\.nuget\\packages\\krafs.publicizer\\2.3.0\\krafs.publicizer.2.3.0.nupkg.sha512", + "C:\\Users\\Enurta\\.nuget\\packages\\krafs.rimworld.ref\\1.5.4297\\krafs.rimworld.ref.1.5.4297.nupkg.sha512", + "C:\\Users\\Enurta\\.nuget\\packages\\lib.harmony\\2.3.5\\lib.harmony.2.3.5.nupkg.sha512" ], "logs": [] } \ No newline at end of file diff --git a/v1.4/Textures/Races/Demonic/Body/Demonic_east.png b/Textures/Races/Demonic/Body/Demonic_east.png similarity index 100% rename from v1.4/Textures/Races/Demonic/Body/Demonic_east.png rename to Textures/Races/Demonic/Body/Demonic_east.png diff --git a/v1.4/Textures/Races/Demonic/Body/Demonic_north.png b/Textures/Races/Demonic/Body/Demonic_north.png similarity index 100% rename from v1.4/Textures/Races/Demonic/Body/Demonic_north.png rename to Textures/Races/Demonic/Body/Demonic_north.png diff --git a/v1.4/Textures/Races/Demonic/Body/Demonic_south.png b/Textures/Races/Demonic/Body/Demonic_south.png similarity index 100% rename from v1.4/Textures/Races/Demonic/Body/Demonic_south.png rename to Textures/Races/Demonic/Body/Demonic_south.png diff --git a/v1.4/Textures/Races/Demonic/ElongatedHorns/DemonHorn_eastm.png b/Textures/Races/Demonic/ElongatedHorns/DemonHorn_eastm.png similarity index 100% rename from v1.4/Textures/Races/Demonic/ElongatedHorns/DemonHorn_eastm.png rename to Textures/Races/Demonic/ElongatedHorns/DemonHorn_eastm.png diff --git a/v1.4/Textures/Races/Demonic/ElongatedHorns/DemonHorn_northm.png b/Textures/Races/Demonic/ElongatedHorns/DemonHorn_northm.png similarity index 100% rename from v1.4/Textures/Races/Demonic/ElongatedHorns/DemonHorn_northm.png rename to Textures/Races/Demonic/ElongatedHorns/DemonHorn_northm.png diff --git a/v1.4/Textures/Races/Demonic/ElongatedHorns/DemonHorn_southm.png b/Textures/Races/Demonic/ElongatedHorns/DemonHorn_southm.png similarity index 100% rename from v1.4/Textures/Races/Demonic/ElongatedHorns/DemonHorn_southm.png rename to Textures/Races/Demonic/ElongatedHorns/DemonHorn_southm.png diff --git a/v1.4/Textures/Races/Demonic/ElongatedHorns/ElongatedHorns_east.png b/Textures/Races/Demonic/ElongatedHorns/ElongatedHorns_east.png similarity index 100% rename from v1.4/Textures/Races/Demonic/ElongatedHorns/ElongatedHorns_east.png rename to Textures/Races/Demonic/ElongatedHorns/ElongatedHorns_east.png diff --git a/v1.4/Textures/Races/Demonic/ElongatedHorns/ElongatedHorns_north.png b/Textures/Races/Demonic/ElongatedHorns/ElongatedHorns_north.png similarity index 100% rename from v1.4/Textures/Races/Demonic/ElongatedHorns/ElongatedHorns_north.png rename to Textures/Races/Demonic/ElongatedHorns/ElongatedHorns_north.png diff --git a/v1.4/Textures/Races/Demonic/ElongatedHorns/ElongatedHorns_south.png b/Textures/Races/Demonic/ElongatedHorns/ElongatedHorns_south.png similarity index 100% rename from v1.4/Textures/Races/Demonic/ElongatedHorns/ElongatedHorns_south.png rename to Textures/Races/Demonic/ElongatedHorns/ElongatedHorns_south.png diff --git a/v1.4/Textures/Races/Demonic/Head/Demonic_east.png b/Textures/Races/Demonic/Head/Demonic_east.png similarity index 100% rename from v1.4/Textures/Races/Demonic/Head/Demonic_east.png rename to Textures/Races/Demonic/Head/Demonic_east.png diff --git a/v1.4/Textures/Races/Demonic/Head/Demonic_north.png b/Textures/Races/Demonic/Head/Demonic_north.png similarity index 100% rename from v1.4/Textures/Races/Demonic/Head/Demonic_north.png rename to Textures/Races/Demonic/Head/Demonic_north.png diff --git a/v1.4/Textures/Races/Demonic/Head/Demonic_south.png b/Textures/Races/Demonic/Head/Demonic_south.png similarity index 100% rename from v1.4/Textures/Races/Demonic/Head/Demonic_south.png rename to Textures/Races/Demonic/Head/Demonic_south.png diff --git a/v1.4/Textures/Races/Necrarch/Body/Necrarch_east.png b/Textures/Races/Necrarch/Body/Necrarch_east.png similarity index 100% rename from v1.4/Textures/Races/Necrarch/Body/Necrarch_east.png rename to Textures/Races/Necrarch/Body/Necrarch_east.png diff --git a/v1.4/Textures/Races/Necrarch/Body/Necrarch_north.png b/Textures/Races/Necrarch/Body/Necrarch_north.png similarity index 100% rename from v1.4/Textures/Races/Necrarch/Body/Necrarch_north.png rename to Textures/Races/Necrarch/Body/Necrarch_north.png diff --git a/v1.4/Textures/Races/Necrarch/Body/Necrarch_south.png b/Textures/Races/Necrarch/Body/Necrarch_south.png similarity index 100% rename from v1.4/Textures/Races/Necrarch/Body/Necrarch_south.png rename to Textures/Races/Necrarch/Body/Necrarch_south.png diff --git a/v1.4/Textures/Races/Necrarch/Head/Necrarch_east.png b/Textures/Races/Necrarch/Head/Necrarch_east.png similarity index 100% rename from v1.4/Textures/Races/Necrarch/Head/Necrarch_east.png rename to Textures/Races/Necrarch/Head/Necrarch_east.png diff --git a/v1.4/Textures/Races/Necrarch/Head/Necrarch_north.png b/Textures/Races/Necrarch/Head/Necrarch_north.png similarity index 100% rename from v1.4/Textures/Races/Necrarch/Head/Necrarch_north.png rename to Textures/Races/Necrarch/Head/Necrarch_north.png diff --git a/v1.4/Textures/Races/Necrarch/Head/Necrarch_south.png b/Textures/Races/Necrarch/Head/Necrarch_south.png similarity index 100% rename from v1.4/Textures/Races/Necrarch/Head/Necrarch_south.png rename to Textures/Races/Necrarch/Head/Necrarch_south.png diff --git a/v1.4/Textures/Races/Wight/Body/Wight_east.png b/Textures/Races/Wight/Body/Wight_east.png similarity index 100% rename from v1.4/Textures/Races/Wight/Body/Wight_east.png rename to Textures/Races/Wight/Body/Wight_east.png diff --git a/v1.4/Textures/Races/Wight/Body/Wight_north.png b/Textures/Races/Wight/Body/Wight_north.png similarity index 100% rename from v1.4/Textures/Races/Wight/Body/Wight_north.png rename to Textures/Races/Wight/Body/Wight_north.png diff --git a/v1.4/Textures/Races/Wight/Body/Wight_south.png b/Textures/Races/Wight/Body/Wight_south.png similarity index 100% rename from v1.4/Textures/Races/Wight/Body/Wight_south.png rename to Textures/Races/Wight/Body/Wight_south.png diff --git a/v1.4/Textures/Races/Wight/Head/Wight_east.png b/Textures/Races/Wight/Head/Wight_east.png similarity index 100% rename from v1.4/Textures/Races/Wight/Head/Wight_east.png rename to Textures/Races/Wight/Head/Wight_east.png diff --git a/v1.4/Textures/Races/Wight/Head/Wight_north.png b/Textures/Races/Wight/Head/Wight_north.png similarity index 100% rename from v1.4/Textures/Races/Wight/Head/Wight_north.png rename to Textures/Races/Wight/Head/Wight_north.png diff --git a/v1.4/Textures/Races/Wight/Head/Wight_south.png b/Textures/Races/Wight/Head/Wight_south.png similarity index 100% rename from v1.4/Textures/Races/Wight/Head/Wight_south.png rename to Textures/Races/Wight/Head/Wight_south.png diff --git a/Textures/Things/Building/Furniture/Brazier.png b/Textures/Things/Building/Furniture/Brazier.png new file mode 100644 index 0000000..022b315 Binary files /dev/null and b/Textures/Things/Building/Furniture/Brazier.png differ diff --git a/Textures/Things/Building/Furniture/Brazier_back.png b/Textures/Things/Building/Furniture/Brazier_back.png new file mode 100644 index 0000000..eeebf66 Binary files /dev/null and b/Textures/Things/Building/Furniture/Brazier_back.png differ diff --git a/Textures/Things/Building/Furniture/Brazier_front.png b/Textures/Things/Building/Furniture/Brazier_front.png new file mode 100644 index 0000000..ef639cb Binary files /dev/null and b/Textures/Things/Building/Furniture/Brazier_front.png differ diff --git a/Textures/Things/Building/Furniture/Gutter2x2.png b/Textures/Things/Building/Furniture/Gutter2x2.png new file mode 100644 index 0000000..8c6a82d Binary files /dev/null and b/Textures/Things/Building/Furniture/Gutter2x2.png differ diff --git a/Textures/Things/Building/Furniture/Gutter4x4.png b/Textures/Things/Building/Furniture/Gutter4x4.png new file mode 100644 index 0000000..cc30d1c Binary files /dev/null and b/Textures/Things/Building/Furniture/Gutter4x4.png differ diff --git a/Textures/Things/Building/Furniture/LargeColumn copy.png b/Textures/Things/Building/Furniture/LargeColumn copy.png new file mode 100644 index 0000000..c514179 Binary files /dev/null and b/Textures/Things/Building/Furniture/LargeColumn copy.png differ diff --git a/Textures/Things/Building/Furniture/LargeColumn.png b/Textures/Things/Building/Furniture/LargeColumn.png new file mode 100644 index 0000000..94e3378 Binary files /dev/null and b/Textures/Things/Building/Furniture/LargeColumn.png differ diff --git a/Textures/Things/Building/Furniture/SkullPile.png b/Textures/Things/Building/Furniture/SkullPile.png new file mode 100644 index 0000000..27571f8 Binary files /dev/null and b/Textures/Things/Building/Furniture/SkullPile.png differ diff --git a/Textures/Things/Building/Furniture/Statue.png b/Textures/Things/Building/Furniture/Statue.png new file mode 100644 index 0000000..91f6c06 Binary files /dev/null and b/Textures/Things/Building/Furniture/Statue.png differ diff --git a/v1.4/Textures/Things/Building/Linked/SteamPipe_Atlas.png b/Textures/Things/Building/Linked/SteamPipe_Atlas.png similarity index 100% rename from v1.4/Textures/Things/Building/Linked/SteamPipe_Atlas.png rename to Textures/Things/Building/Linked/SteamPipe_Atlas.png diff --git a/v1.4/Textures/Things/Building/Linked/SteamPipe_Blueprint_Atlas.png b/Textures/Things/Building/Linked/SteamPipe_Blueprint_Atlas.png similarity index 100% rename from v1.4/Textures/Things/Building/Linked/SteamPipe_Blueprint_Atlas.png rename to Textures/Things/Building/Linked/SteamPipe_Blueprint_Atlas.png diff --git a/v1.4/Textures/Things/Building/Linked/SteamPipe_MenuIcon.png b/Textures/Things/Building/Linked/SteamPipe_MenuIcon.png similarity index 100% rename from v1.4/Textures/Things/Building/Linked/SteamPipe_MenuIcon.png rename to Textures/Things/Building/Linked/SteamPipe_MenuIcon.png diff --git a/v1.4/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_east.png b/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_east.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_east.png rename to Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_east.png diff --git a/v1.4/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_eastm.png b/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_eastm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_eastm.png rename to Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_eastm.png diff --git a/v1.4/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_north.png b/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_north.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_north.png rename to Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_north.png diff --git a/v1.4/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_northm.png b/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_northm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_northm.png rename to Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_northm.png diff --git a/v1.4/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_south.png b/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_south.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_south.png rename to Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_south.png diff --git a/v1.4/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_southm.png b/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_southm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_southm.png rename to Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_southm.png diff --git a/v1.4/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_west.png b/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_west.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_west.png rename to Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_west.png diff --git a/v1.4/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_westm.png b/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_westm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_westm.png rename to Textures/Things/Building/Misc/AltarImmortalKing/AltarImmortalKing_westm.png diff --git a/v1.4/Textures/Things/Building/Misc/AltarPrince/AltarPrince_east.png b/Textures/Things/Building/Misc/AltarPrince/AltarPrince_east.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/AltarPrince/AltarPrince_east.png rename to Textures/Things/Building/Misc/AltarPrince/AltarPrince_east.png diff --git a/v1.4/Textures/Things/Building/Misc/AltarPrince/AltarPrince_eastm.png b/Textures/Things/Building/Misc/AltarPrince/AltarPrince_eastm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/AltarPrince/AltarPrince_eastm.png rename to Textures/Things/Building/Misc/AltarPrince/AltarPrince_eastm.png diff --git a/v1.4/Textures/Things/Building/Misc/AltarPrince/AltarPrince_north.png b/Textures/Things/Building/Misc/AltarPrince/AltarPrince_north.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/AltarPrince/AltarPrince_north.png rename to Textures/Things/Building/Misc/AltarPrince/AltarPrince_north.png diff --git a/v1.4/Textures/Things/Building/Misc/AltarPrince/AltarPrince_northm.png b/Textures/Things/Building/Misc/AltarPrince/AltarPrince_northm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/AltarPrince/AltarPrince_northm.png rename to Textures/Things/Building/Misc/AltarPrince/AltarPrince_northm.png diff --git a/v1.4/Textures/Things/Building/Misc/AltarPrince/AltarPrince_south.png b/Textures/Things/Building/Misc/AltarPrince/AltarPrince_south.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/AltarPrince/AltarPrince_south.png rename to Textures/Things/Building/Misc/AltarPrince/AltarPrince_south.png diff --git a/v1.4/Textures/Things/Building/Misc/AltarPrince/AltarPrince_southm.png b/Textures/Things/Building/Misc/AltarPrince/AltarPrince_southm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/AltarPrince/AltarPrince_southm.png rename to Textures/Things/Building/Misc/AltarPrince/AltarPrince_southm.png diff --git a/v1.4/Textures/Things/Building/Misc/AltarPrince/AltarPrince_west.png b/Textures/Things/Building/Misc/AltarPrince/AltarPrince_west.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/AltarPrince/AltarPrince_west.png rename to Textures/Things/Building/Misc/AltarPrince/AltarPrince_west.png diff --git a/v1.4/Textures/Things/Building/Misc/AltarPrince/AltarPrince_westm.png b/Textures/Things/Building/Misc/AltarPrince/AltarPrince_westm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/AltarPrince/AltarPrince_westm.png rename to Textures/Things/Building/Misc/AltarPrince/AltarPrince_westm.png diff --git a/v1.4/Textures/Things/Building/Misc/BandNode.png b/Textures/Things/Building/Misc/ControlledAmplifier.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/BandNode.png rename to Textures/Things/Building/Misc/ControlledAmplifier.png diff --git a/v1.4/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_east.png b/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_east.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_east.png rename to Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_east.png diff --git a/v1.4/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_eastm.png b/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_eastm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_eastm.png rename to Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_eastm.png diff --git a/v1.4/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_north.png b/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_north.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_north.png rename to Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_north.png diff --git a/v1.4/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_northm.png b/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_northm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_northm.png rename to Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_northm.png diff --git a/v1.4/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_south.png b/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_south.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_south.png rename to Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_south.png diff --git a/v1.4/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_southm.png b/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_southm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_southm.png rename to Textures/Things/Building/Misc/DeathrestAccelerator/DeathrestAccelerator_southm.png diff --git a/v1.4/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_east.png b/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_east.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_east.png rename to Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_east.png diff --git a/v1.4/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_eastm.png b/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_eastm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_eastm.png rename to Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_eastm.png diff --git a/v1.4/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_north.png b/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_north.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_north.png rename to Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_north.png diff --git a/v1.4/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_northm.png b/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_northm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_northm.png rename to Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_northm.png diff --git a/v1.4/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_south.png b/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_south.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_south.png rename to Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_south.png diff --git a/v1.4/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_southm.png b/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_southm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_southm.png rename to Textures/Things/Building/Misc/DeathrestCasket/DeathrestCasket_southm.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_east.png b/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_east.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_east.png rename to Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_east.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_eastm.png b/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_eastm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_eastm.png rename to Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_eastm.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_north.png b/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_north.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_north.png rename to Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_north.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_northm.png b/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_northm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_northm.png rename to Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_northm.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_south.png b/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_south.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_south.png rename to Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_south.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_southm.png b/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_southm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_southm.png rename to Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_southm.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_west.png b/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_west.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_west.png rename to Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_west.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_westm.png b/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_westm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_westm.png rename to Textures/Things/Building/Misc/GeneAssembler/GeneAssembler_westm.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_east.png b/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_east.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_east.png rename to Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_east.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_eastm.png b/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_eastm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_eastm.png rename to Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_eastm.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_north.png b/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_north.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_north.png rename to Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_north.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_northm.png b/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_northm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_northm.png rename to Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_northm.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_south.png b/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_south.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_south.png rename to Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_south.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_southm.png b/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_southm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_southm.png rename to Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_southm.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_west.png b/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_west.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_west.png rename to Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_west.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_westm.png b/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_westm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_westm.png rename to Textures/Things/Building/Misc/GeneExtractor/GeneExtractor_westm.png diff --git a/v1.4/Textures/Things/Building/Misc/GenePotionRack/EmptyGenePotionRack_north.png b/Textures/Things/Building/Misc/GenePotionRack/EmptyGenePotionRack_north.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GenePotionRack/EmptyGenePotionRack_north.png rename to Textures/Things/Building/Misc/GenePotionRack/EmptyGenePotionRack_north.png diff --git a/v1.4/Textures/Things/Building/Misc/GenePotionRack/EmptyGenePotionRack_northm.png b/Textures/Things/Building/Misc/GenePotionRack/EmptyGenePotionRack_northm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GenePotionRack/EmptyGenePotionRack_northm.png rename to Textures/Things/Building/Misc/GenePotionRack/EmptyGenePotionRack_northm.png diff --git a/v1.4/Textures/Things/Building/Misc/GenePotionRack/EmptyGenerackEmpty_east.png b/Textures/Things/Building/Misc/GenePotionRack/EmptyGenerackEmpty_east.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GenePotionRack/EmptyGenerackEmpty_east.png rename to Textures/Things/Building/Misc/GenePotionRack/EmptyGenerackEmpty_east.png diff --git a/v1.4/Textures/Things/Building/Misc/GenePotionRack/EmptyGenerackEmpty_eastm.png b/Textures/Things/Building/Misc/GenePotionRack/EmptyGenerackEmpty_eastm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GenePotionRack/EmptyGenerackEmpty_eastm.png rename to Textures/Things/Building/Misc/GenePotionRack/EmptyGenerackEmpty_eastm.png diff --git a/v1.4/Textures/Things/Building/Misc/GenePotionRack/GenePotionRack_east.png b/Textures/Things/Building/Misc/GenePotionRack/GenePotionRack_east.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GenePotionRack/GenePotionRack_east.png rename to Textures/Things/Building/Misc/GenePotionRack/GenePotionRack_east.png diff --git a/v1.4/Textures/Things/Building/Misc/GenePotionRack/GenePotionRack_eastm.png b/Textures/Things/Building/Misc/GenePotionRack/GenePotionRack_eastm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GenePotionRack/GenePotionRack_eastm.png rename to Textures/Things/Building/Misc/GenePotionRack/GenePotionRack_eastm.png diff --git a/v1.4/Textures/Things/Building/Misc/GenePotionRack/GenePotionRack_north.png b/Textures/Things/Building/Misc/GenePotionRack/GenePotionRack_north.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GenePotionRack/GenePotionRack_north.png rename to Textures/Things/Building/Misc/GenePotionRack/GenePotionRack_north.png diff --git a/v1.4/Textures/Things/Building/Misc/GenePotionRack/GenePotionRack_northm.png b/Textures/Things/Building/Misc/GenePotionRack/GenePotionRack_northm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GenePotionRack/GenePotionRack_northm.png rename to Textures/Things/Building/Misc/GenePotionRack/GenePotionRack_northm.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneProcessor.png b/Textures/Things/Building/Misc/GeneProcessor.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneProcessor.png rename to Textures/Things/Building/Misc/GeneProcessor.png diff --git a/v1.4/Textures/Things/Building/Misc/GeneProcessor_m.png b/Textures/Things/Building/Misc/GeneProcessor_m.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GeneProcessor_m.png rename to Textures/Things/Building/Misc/GeneProcessor_m.png diff --git a/v1.4/Textures/Things/Building/Misc/Genebank/Genebank_east.png b/Textures/Things/Building/Misc/Genebank/Genebank_east.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/Genebank/Genebank_east.png rename to Textures/Things/Building/Misc/Genebank/Genebank_east.png diff --git a/v1.4/Textures/Things/Building/Misc/Genebank/Genebank_north.png b/Textures/Things/Building/Misc/Genebank/Genebank_north.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/Genebank/Genebank_north.png rename to Textures/Things/Building/Misc/Genebank/Genebank_north.png diff --git a/v1.4/Textures/Things/Building/Misc/Genebank/Genebank_south.png b/Textures/Things/Building/Misc/Genebank/Genebank_south.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/Genebank/Genebank_south.png rename to Textures/Things/Building/Misc/Genebank/Genebank_south.png diff --git a/v1.4/Textures/Things/Building/Misc/Genebank/Genebank_west.png b/Textures/Things/Building/Misc/Genebank/Genebank_west.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/Genebank/Genebank_west.png rename to Textures/Things/Building/Misc/Genebank/Genebank_west.png diff --git a/v1.4/Textures/Things/Building/Misc/GlucosoidPump/GlucosoidPump.png b/Textures/Things/Building/Misc/GlucosoidPump/GlucosoidPump.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/GlucosoidPump/GlucosoidPump.png rename to Textures/Things/Building/Misc/GlucosoidPump/GlucosoidPump.png diff --git a/v1.4/Textures/Things/Building/Misc/HemogenAmplifier/HemogenAmplifier.png b/Textures/Things/Building/Misc/HemogenAmplifier/HemogenAmplifier.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/HemogenAmplifier/HemogenAmplifier.png rename to Textures/Things/Building/Misc/HemogenAmplifier/HemogenAmplifier.png diff --git a/v1.4/Textures/Things/Building/Misc/MutagenRevitalizer/MutagenRevitalizer.png b/Textures/Things/Building/Misc/MutagenRevitalizer/MutagenRevitalizer.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/MutagenRevitalizer/MutagenRevitalizer.png rename to Textures/Things/Building/Misc/MutagenRevitalizer/MutagenRevitalizer.png diff --git a/v1.4/Textures/Things/Building/Misc/MutagenRevitalizer/MutagenRevitalizer_m.png b/Textures/Things/Building/Misc/MutagenRevitalizer/MutagenRevitalizer_m.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/MutagenRevitalizer/MutagenRevitalizer_m.png rename to Textures/Things/Building/Misc/MutagenRevitalizer/MutagenRevitalizer_m.png diff --git a/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_east.png b/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_east.png new file mode 100644 index 0000000..0d0f675 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_east.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_eastm.png b/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_eastm.png new file mode 100644 index 0000000..d46391c Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_eastm.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_north.png b/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_north.png new file mode 100644 index 0000000..ba00774 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_north.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_northm.png b/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_northm.png new file mode 100644 index 0000000..e7207c6 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_northm.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_south.png b/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_south.png new file mode 100644 index 0000000..b34a7de Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_south.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_southm.png b/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_southm.png new file mode 100644 index 0000000..9754069 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/AltarImmortalKing_southm.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/DarkPentagram.png b/Textures/Things/Building/Misc/Necrarch/DarkPentagram.png new file mode 100644 index 0000000..cedaf0d Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/DarkPentagram.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/HemogenAmplifier.png b/Textures/Things/Building/Misc/Necrarch/HemogenAmplifier.png new file mode 100644 index 0000000..e30cb83 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/HemogenAmplifier.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_north.png b/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_north.png new file mode 100644 index 0000000..6f09675 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_north.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_northm.png b/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_northm.png new file mode 100644 index 0000000..7f70d6a Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_northm.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_south.png b/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_south.png new file mode 100644 index 0000000..6ac44c5 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_south.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_southm.png b/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_southm.png new file mode 100644 index 0000000..ae7b5a4 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_southm.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_west.png b/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_west.png new file mode 100644 index 0000000..4a71da1 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_west.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_westm.png b/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_westm.png new file mode 100644 index 0000000..4a80b78 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/NecromancerAltar_westm.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/RoyalNecrarchSarcophagus_Open_east.png b/Textures/Things/Building/Misc/Necrarch/RoyalNecrarchSarcophagus_Open_east.png new file mode 100644 index 0000000..cc0d0ae Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/RoyalNecrarchSarcophagus_Open_east.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/RoyalNecrarchSarcophagus_Open_south.png b/Textures/Things/Building/Misc/Necrarch/RoyalNecrarchSarcophagus_Open_south.png new file mode 100644 index 0000000..64b91f4 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/RoyalNecrarchSarcophagus_Open_south.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/RoyalNecrarchSarcophagus_east.png b/Textures/Things/Building/Misc/Necrarch/RoyalNecrarchSarcophagus_east.png new file mode 100644 index 0000000..6a532d3 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/RoyalNecrarchSarcophagus_east.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/RoyalNecrarchSarcophagus_north.png b/Textures/Things/Building/Misc/Necrarch/RoyalNecrarchSarcophagus_north.png new file mode 100644 index 0000000..6da6d06 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/RoyalNecrarchSarcophagus_north.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/RoyalNecrarchSarcophagus_south.png b/Textures/Things/Building/Misc/Necrarch/RoyalNecrarchSarcophagus_south.png new file mode 100644 index 0000000..96ea24f Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/RoyalNecrarchSarcophagus_south.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/SummoningCircle_east.png b/Textures/Things/Building/Misc/Necrarch/SummoningCircle_east.png new file mode 100644 index 0000000..005dc1f Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/SummoningCircle_east.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/SummoningCircle_north.png b/Textures/Things/Building/Misc/Necrarch/SummoningCircle_north.png new file mode 100644 index 0000000..5e61146 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/SummoningCircle_north.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/SummoningCircle_south.png b/Textures/Things/Building/Misc/Necrarch/SummoningCircle_south.png new file mode 100644 index 0000000..d3c6832 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/SummoningCircle_south.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/UndeadIncense_east.png b/Textures/Things/Building/Misc/Necrarch/UndeadIncense_east.png new file mode 100644 index 0000000..76409de Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/UndeadIncense_east.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/UndeadIncense_eastm.png b/Textures/Things/Building/Misc/Necrarch/UndeadIncense_eastm.png new file mode 100644 index 0000000..f7e616a Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/UndeadIncense_eastm.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/UndeadIncense_north.png b/Textures/Things/Building/Misc/Necrarch/UndeadIncense_north.png new file mode 100644 index 0000000..5307135 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/UndeadIncense_north.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/UndeadIncense_northm.png b/Textures/Things/Building/Misc/Necrarch/UndeadIncense_northm.png new file mode 100644 index 0000000..ca0b8eb Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/UndeadIncense_northm.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_east.png b/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_east.png new file mode 100644 index 0000000..3805d8d Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_east.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_eastm.png b/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_eastm.png new file mode 100644 index 0000000..adbca08 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_eastm.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_north.png b/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_north.png new file mode 100644 index 0000000..5a999ca Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_north.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_northm.png b/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_northm.png new file mode 100644 index 0000000..6e0f8af Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_northm.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_south.png b/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_south.png new file mode 100644 index 0000000..59b435a Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_south.png differ diff --git a/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_southm.png b/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_southm.png new file mode 100644 index 0000000..bb9eeb2 Binary files /dev/null and b/Textures/Things/Building/Misc/Necrarch/Undead_AltarMagi_southm.png differ diff --git a/v1.4/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_east.png b/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_east.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_east.png rename to Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_east.png diff --git a/v1.4/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_eastm.png b/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_eastm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_eastm.png rename to Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_eastm.png diff --git a/v1.4/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_north.png b/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_north.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_north.png rename to Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_north.png diff --git a/v1.4/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_northm.png b/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_northm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_northm.png rename to Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_northm.png diff --git a/v1.4/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_south.png b/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_south.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_south.png rename to Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_south.png diff --git a/v1.4/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_southm.png b/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_southm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_southm.png rename to Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_southm.png diff --git a/v1.4/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_west.png b/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_west.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_west.png rename to Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_west.png diff --git a/v1.4/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_westm.png b/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_westm.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_westm.png rename to Textures/Things/Building/Misc/PsychofluidPump/PsychofluidPump_westm.png diff --git a/v1.4/Textures/Things/Building/Misc/RoyalDeathrestCasket/RoyalDeathrestCasket_east.png b/Textures/Things/Building/Misc/RoyalDeathrestCasket/RoyalDeathrestCasket_east.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/RoyalDeathrestCasket/RoyalDeathrestCasket_east.png rename to Textures/Things/Building/Misc/RoyalDeathrestCasket/RoyalDeathrestCasket_east.png diff --git a/v1.4/Textures/Things/Building/Misc/RoyalDeathrestCasket/RoyalDeathrestCasket_north.png b/Textures/Things/Building/Misc/RoyalDeathrestCasket/RoyalDeathrestCasket_north.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/RoyalDeathrestCasket/RoyalDeathrestCasket_north.png rename to Textures/Things/Building/Misc/RoyalDeathrestCasket/RoyalDeathrestCasket_north.png diff --git a/v1.4/Textures/Things/Building/Misc/RoyalDeathrestCasket/RoyalDeathrestCasket_south.png b/Textures/Things/Building/Misc/RoyalDeathrestCasket/RoyalDeathrestCasket_south.png similarity index 100% rename from v1.4/Textures/Things/Building/Misc/RoyalDeathrestCasket/RoyalDeathrestCasket_south.png rename to Textures/Things/Building/Misc/RoyalDeathrestCasket/RoyalDeathrestCasket_south.png diff --git a/Textures/Things/Building/Misc/SanguinMage/GlucosoidPump.png b/Textures/Things/Building/Misc/SanguinMage/GlucosoidPump.png new file mode 100644 index 0000000..2878c6c Binary files /dev/null and b/Textures/Things/Building/Misc/SanguinMage/GlucosoidPump.png differ diff --git a/v1.4/Textures/Things/Building/Production/SubcoreSoftscanner_east.png b/Textures/Things/Building/Production/AmpGemInfuser_east.png similarity index 100% rename from v1.4/Textures/Things/Building/Production/SubcoreSoftscanner_east.png rename to Textures/Things/Building/Production/AmpGemInfuser_east.png diff --git a/v1.4/Textures/Things/Building/Production/SubcoreSoftscanner_north.png b/Textures/Things/Building/Production/AmpGemInfuser_north.png similarity index 100% rename from v1.4/Textures/Things/Building/Production/SubcoreSoftscanner_north.png rename to Textures/Things/Building/Production/AmpGemInfuser_north.png diff --git a/v1.4/Textures/Things/Building/Production/SubcoreSoftscanner_south.png b/Textures/Things/Building/Production/AmpGemInfuser_south.png similarity index 100% rename from v1.4/Textures/Things/Building/Production/SubcoreSoftscanner_south.png rename to Textures/Things/Building/Production/AmpGemInfuser_south.png diff --git a/Textures/Things/Building/Production/ArtificeConstructPlatform_south.png b/Textures/Things/Building/Production/ArtificeConstructPlatform_south.png new file mode 100644 index 0000000..46447e9 Binary files /dev/null and b/Textures/Things/Building/Production/ArtificeConstructPlatform_south.png differ diff --git a/v1.4/Textures/Things/Building/Production/SubcoreEncoder_east.png b/Textures/Things/Building/Production/GemInfuser_east.png similarity index 100% rename from v1.4/Textures/Things/Building/Production/SubcoreEncoder_east.png rename to Textures/Things/Building/Production/GemInfuser_east.png diff --git a/v1.4/Textures/Things/Building/Production/SubcoreEncoder_north.png b/Textures/Things/Building/Production/GemInfuser_north.png similarity index 100% rename from v1.4/Textures/Things/Building/Production/SubcoreEncoder_north.png rename to Textures/Things/Building/Production/GemInfuser_north.png diff --git a/v1.4/Textures/Things/Building/Production/SubcoreEncoder_south.png b/Textures/Things/Building/Production/GemInfuser_south.png similarity index 100% rename from v1.4/Textures/Things/Building/Production/SubcoreEncoder_south.png rename to Textures/Things/Building/Production/GemInfuser_south.png diff --git a/v1.4/Textures/Things/Building/Production/SubcoreRipscanner_east.png b/Textures/Things/Building/Production/SoulHarvester_east.png similarity index 100% rename from v1.4/Textures/Things/Building/Production/SubcoreRipscanner_east.png rename to Textures/Things/Building/Production/SoulHarvester_east.png diff --git a/v1.4/Textures/Things/Building/Production/SubcoreRipscanner_north.png b/Textures/Things/Building/Production/SoulHarvester_north.png similarity index 100% rename from v1.4/Textures/Things/Building/Production/SubcoreRipscanner_north.png rename to Textures/Things/Building/Production/SoulHarvester_north.png diff --git a/v1.4/Textures/Things/Building/Production/SubcoreRipscanner_south.png b/Textures/Things/Building/Production/SoulHarvester_south.png similarity index 100% rename from v1.4/Textures/Things/Building/Production/SubcoreRipscanner_south.png rename to Textures/Things/Building/Production/SoulHarvester_south.png diff --git a/v1.4/Textures/Things/Building/SteamMachines/ArtificerSteamGenerator.png b/Textures/Things/Building/SteamMachines/ArtificerSteamGenerator.png similarity index 100% rename from v1.4/Textures/Things/Building/SteamMachines/ArtificerSteamGenerator.png rename to Textures/Things/Building/SteamMachines/ArtificerSteamGenerator.png diff --git a/v1.4/Textures/Things/Building/SteamMachines/BasicRecharger_east.png b/Textures/Things/Building/SteamMachines/BasicRecharger_east.png similarity index 100% rename from v1.4/Textures/Things/Building/SteamMachines/BasicRecharger_east.png rename to Textures/Things/Building/SteamMachines/BasicRecharger_east.png diff --git a/v1.4/Textures/Things/Building/SteamMachines/BasicRecharger_north.png b/Textures/Things/Building/SteamMachines/BasicRecharger_north.png similarity index 100% rename from v1.4/Textures/Things/Building/SteamMachines/BasicRecharger_north.png rename to Textures/Things/Building/SteamMachines/BasicRecharger_north.png diff --git a/v1.4/Textures/Things/Building/SteamMachines/BasicRecharger_south.png b/Textures/Things/Building/SteamMachines/BasicRecharger_south.png similarity index 100% rename from v1.4/Textures/Things/Building/SteamMachines/BasicRecharger_south.png rename to Textures/Things/Building/SteamMachines/BasicRecharger_south.png diff --git a/v1.4/Textures/Things/Building/SteamMachines/StandardRecharger_east.png b/Textures/Things/Building/SteamMachines/StandardRecharger_east.png similarity index 100% rename from v1.4/Textures/Things/Building/SteamMachines/StandardRecharger_east.png rename to Textures/Things/Building/SteamMachines/StandardRecharger_east.png diff --git a/v1.4/Textures/Things/Building/SteamMachines/StandardRecharger_north.png b/Textures/Things/Building/SteamMachines/StandardRecharger_north.png similarity index 100% rename from v1.4/Textures/Things/Building/SteamMachines/StandardRecharger_north.png rename to Textures/Things/Building/SteamMachines/StandardRecharger_north.png diff --git a/v1.4/Textures/Things/Building/SteamMachines/StandardRecharger_south.png b/Textures/Things/Building/SteamMachines/StandardRecharger_south.png similarity index 100% rename from v1.4/Textures/Things/Building/SteamMachines/StandardRecharger_south.png rename to Textures/Things/Building/SteamMachines/StandardRecharger_south.png diff --git a/v1.4/Textures/Things/Building/SteamMachines/SteamGenerator.png b/Textures/Things/Building/SteamMachines/SteamGenerator.png similarity index 100% rename from v1.4/Textures/Things/Building/SteamMachines/SteamGenerator.png rename to Textures/Things/Building/SteamMachines/SteamGenerator.png diff --git a/v1.4/Textures/Things/Building/SteamMachines/SteamPlant.png b/Textures/Things/Building/SteamMachines/SteamPlant.png similarity index 100% rename from v1.4/Textures/Things/Building/SteamMachines/SteamPlant.png rename to Textures/Things/Building/SteamMachines/SteamPlant.png diff --git a/v1.4/Textures/Things/Building/SteamMachines/SteamSwitch.png b/Textures/Things/Building/SteamMachines/SteamSwitch.png similarity index 100% rename from v1.4/Textures/Things/Building/SteamMachines/SteamSwitch.png rename to Textures/Things/Building/SteamMachines/SteamSwitch.png diff --git a/v1.4/Textures/Things/Building/SteamMachines/SteamSwitch_Off.png b/Textures/Things/Building/SteamMachines/SteamSwitch_Off.png similarity index 100% rename from v1.4/Textures/Things/Building/SteamMachines/SteamSwitch_Off.png rename to Textures/Things/Building/SteamMachines/SteamSwitch_Off.png diff --git a/v1.4/Textures/Things/Building/SteamMachines/SteamTank_east.png b/Textures/Things/Building/SteamMachines/SteamTank_east.png similarity index 100% rename from v1.4/Textures/Things/Building/SteamMachines/SteamTank_east.png rename to Textures/Things/Building/SteamMachines/SteamTank_east.png diff --git a/v1.4/Textures/Things/Building/SteamMachines/SteamTank_north.png b/Textures/Things/Building/SteamMachines/SteamTank_north.png similarity index 100% rename from v1.4/Textures/Things/Building/SteamMachines/SteamTank_north.png rename to Textures/Things/Building/SteamMachines/SteamTank_north.png diff --git a/Textures/Things/Item/Equipment/WeaponMelee/MB_ArtificeAxeblade.png b/Textures/Things/Item/Equipment/WeaponMelee/MB_ArtificeAxeblade.png new file mode 100644 index 0000000..98153ee Binary files /dev/null and b/Textures/Things/Item/Equipment/WeaponMelee/MB_ArtificeAxeblade.png differ diff --git a/Textures/Things/Item/Equipment/WeaponMelee/MB_ArtificeBlade.png b/Textures/Things/Item/Equipment/WeaponMelee/MB_ArtificeBlade.png new file mode 100644 index 0000000..04c12ec Binary files /dev/null and b/Textures/Things/Item/Equipment/WeaponMelee/MB_ArtificeBlade.png differ diff --git a/Textures/Things/Item/Equipment/WeaponRanged/MB_ArtificeCrossbow.png b/Textures/Things/Item/Equipment/WeaponRanged/MB_ArtificeCrossbow.png new file mode 100644 index 0000000..b9a3014 Binary files /dev/null and b/Textures/Things/Item/Equipment/WeaponRanged/MB_ArtificeCrossbow.png differ diff --git a/Textures/Things/Item/Resource/ArcanaStone.png b/Textures/Things/Item/Resource/ArcanaStone.png new file mode 100644 index 0000000..5ccf8c6 Binary files /dev/null and b/Textures/Things/Item/Resource/ArcanaStone.png differ diff --git a/v1.4/Textures/Things/Item/Resource/CorruptedBone/CorruptedBone_a.png b/Textures/Things/Item/Resource/CorruptedBone/CorruptedBone_a.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/CorruptedBone/CorruptedBone_a.png rename to Textures/Things/Item/Resource/CorruptedBone/CorruptedBone_a.png diff --git a/v1.4/Textures/Things/Item/Resource/CorruptedBone/CorruptedBone_b.png b/Textures/Things/Item/Resource/CorruptedBone/CorruptedBone_b.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/CorruptedBone/CorruptedBone_b.png rename to Textures/Things/Item/Resource/CorruptedBone/CorruptedBone_b.png diff --git a/v1.4/Textures/Things/Item/Resource/CorruptedBone/CorruptedBone_c.png b/Textures/Things/Item/Resource/CorruptedBone/CorruptedBone_c.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/CorruptedBone/CorruptedBone_c.png rename to Textures/Things/Item/Resource/CorruptedBone/CorruptedBone_c.png diff --git a/Textures/Things/Item/Resource/CorruptedSoulBasic.png b/Textures/Things/Item/Resource/CorruptedSoulBasic.png new file mode 100644 index 0000000..1ea18ef Binary files /dev/null and b/Textures/Things/Item/Resource/CorruptedSoulBasic.png differ diff --git a/v1.4/Textures/Things/Item/Resource/CorruptedSoulHigh.png b/Textures/Things/Item/Resource/CorruptedSoulHigh.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/CorruptedSoulHigh.png rename to Textures/Things/Item/Resource/CorruptedSoulHigh.png diff --git a/v1.4/Textures/Things/Item/Resource/CorruptedSoulRegular.png b/Textures/Things/Item/Resource/CorruptedSoulRegular.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/CorruptedSoulRegular.png rename to Textures/Things/Item/Resource/CorruptedSoulRegular.png diff --git a/v1.4/Textures/Things/Item/Resource/DeathrestCapacitySerum.png b/Textures/Things/Item/Resource/DeathrestCapacitySerum.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/DeathrestCapacitySerum.png rename to Textures/Things/Item/Resource/DeathrestCapacitySerum.png diff --git a/v1.4/Textures/Things/Item/Resource/HemogenPack/HemogenPack_a.png b/Textures/Things/Item/Resource/HemogenPack/HemogenPack_a.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/HemogenPack/HemogenPack_a.png rename to Textures/Things/Item/Resource/HemogenPack/HemogenPack_a.png diff --git a/v1.4/Textures/Things/Item/Resource/HemogenPack/HemogenPack_b.png b/Textures/Things/Item/Resource/HemogenPack/HemogenPack_b.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/HemogenPack/HemogenPack_b.png rename to Textures/Things/Item/Resource/HemogenPack/HemogenPack_b.png diff --git a/v1.4/Textures/Things/Item/Resource/HemogenPack/HemogenPack_c.png b/Textures/Things/Item/Resource/HemogenPack/HemogenPack_c.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/HemogenPack/HemogenPack_c.png rename to Textures/Things/Item/Resource/HemogenPack/HemogenPack_c.png diff --git a/v1.4/Textures/Things/Item/Resource/InfusedBloodPotion/InfusedBloodPotion_a.png b/Textures/Things/Item/Resource/InfusedBloodPotion/InfusedBloodPotion_a.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/InfusedBloodPotion/InfusedBloodPotion_a.png rename to Textures/Things/Item/Resource/InfusedBloodPotion/InfusedBloodPotion_a.png diff --git a/v1.4/Textures/Things/Item/Resource/InfusedBloodPotion/InfusedBloodPotion_b.png b/Textures/Things/Item/Resource/InfusedBloodPotion/InfusedBloodPotion_b.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/InfusedBloodPotion/InfusedBloodPotion_b.png rename to Textures/Things/Item/Resource/InfusedBloodPotion/InfusedBloodPotion_b.png diff --git a/v1.4/Textures/Things/Item/Resource/InfusedBloodPotion/InfusedBloodPotion_c.png b/Textures/Things/Item/Resource/InfusedBloodPotion/InfusedBloodPotion_c.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/InfusedBloodPotion/InfusedBloodPotion_c.png rename to Textures/Things/Item/Resource/InfusedBloodPotion/InfusedBloodPotion_c.png diff --git a/v1.4/Textures/Things/Item/Resource/SignalChip.png b/Textures/Things/Item/Resource/PowercoreBasic.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/SignalChip.png rename to Textures/Things/Item/Resource/PowercoreBasic.png diff --git a/v1.4/Textures/Things/Item/Resource/NanostructuringChip.png b/Textures/Things/Item/Resource/PowercoreHigh.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/NanostructuringChip.png rename to Textures/Things/Item/Resource/PowercoreHigh.png diff --git a/v1.4/Textures/Things/Item/Resource/PowerfocusChip.png b/Textures/Things/Item/Resource/PowercoreRegular.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/PowerfocusChip.png rename to Textures/Things/Item/Resource/PowercoreRegular.png diff --git a/v1.4/Textures/Things/Item/Resource/SubcoreBasic.png b/Textures/Things/Item/Resource/SoulgemBasic.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/SubcoreBasic.png rename to Textures/Things/Item/Resource/SoulgemBasic.png diff --git a/v1.4/Textures/Things/Item/Resource/SubcoreHigh.png b/Textures/Things/Item/Resource/SoulgemHigh.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/SubcoreHigh.png rename to Textures/Things/Item/Resource/SoulgemHigh.png diff --git a/v1.4/Textures/Things/Item/Resource/SubcoreRegular.png b/Textures/Things/Item/Resource/SoulgemRegular.png similarity index 100% rename from v1.4/Textures/Things/Item/Resource/SubcoreRegular.png rename to Textures/Things/Item/Resource/SoulgemRegular.png diff --git a/Textures/Things/Item/Special/ArtificeFist.png b/Textures/Things/Item/Special/ArtificeFist.png new file mode 100644 index 0000000..7a9e86c Binary files /dev/null and b/Textures/Things/Item/Special/ArtificeFist.png differ diff --git a/v1.4/Textures/Things/Item/Special/BloodChalice.png b/Textures/Things/Item/Special/BloodChalice.png similarity index 100% rename from v1.4/Textures/Things/Item/Special/BloodChalice.png rename to Textures/Things/Item/Special/BloodChalice.png diff --git a/v1.4/Textures/Things/Item/Special/Genepack/Genepack_a.png b/Textures/Things/Item/Special/Genepack/Genepack_a.png similarity index 100% rename from v1.4/Textures/Things/Item/Special/Genepack/Genepack_a.png rename to Textures/Things/Item/Special/Genepack/Genepack_a.png diff --git a/v1.4/Textures/Things/Item/Special/Genepack/Genepack_b.png b/Textures/Things/Item/Special/Genepack/Genepack_b.png similarity index 100% rename from v1.4/Textures/Things/Item/Special/Genepack/Genepack_b.png rename to Textures/Things/Item/Special/Genepack/Genepack_b.png diff --git a/v1.4/Textures/Things/Item/Special/Genepack/Genepack_c.png b/Textures/Things/Item/Special/Genepack/Genepack_c.png similarity index 100% rename from v1.4/Textures/Things/Item/Special/Genepack/Genepack_c.png rename to Textures/Things/Item/Special/Genepack/Genepack_c.png diff --git a/v1.4/Textures/Things/Item/Special/Genepack/Genepack_d.png b/Textures/Things/Item/Special/Genepack/Genepack_d.png similarity index 100% rename from v1.4/Textures/Things/Item/Special/Genepack/Genepack_d.png rename to Textures/Things/Item/Special/Genepack/Genepack_d.png diff --git a/v1.4/Textures/Things/Item/Special/Genepack/Genepack_e.png b/Textures/Things/Item/Special/Genepack/Genepack_e.png similarity index 100% rename from v1.4/Textures/Things/Item/Special/Genepack/Genepack_e.png rename to Textures/Things/Item/Special/Genepack/Genepack_e.png diff --git a/v1.4/Textures/Things/Item/Special/Genepack/Genepack_f.png b/Textures/Things/Item/Special/Genepack/Genepack_f.png similarity index 100% rename from v1.4/Textures/Things/Item/Special/Genepack/Genepack_f.png rename to Textures/Things/Item/Special/Genepack/Genepack_f.png diff --git a/v1.4/Textures/Things/Item/Special/Necronomicon.png b/Textures/Things/Item/Special/Necronomicon.png similarity index 100% rename from v1.4/Textures/Things/Item/Special/Necronomicon.png rename to Textures/Things/Item/Special/Necronomicon.png diff --git a/v1.4/Textures/Things/Item/Special/Xenogerm.png b/Textures/Things/Item/Special/Xenogerm.png similarity index 100% rename from v1.4/Textures/Things/Item/Special/Xenogerm.png rename to Textures/Things/Item/Special/Xenogerm.png diff --git a/v1.4/Textures/Things/Item/Special/Xenogerm_archite.png b/Textures/Things/Item/Special/Xenogerm_archite.png similarity index 100% rename from v1.4/Textures/Things/Item/Special/Xenogerm_archite.png rename to Textures/Things/Item/Special/Xenogerm_archite.png diff --git a/Textures/Things/Mote/BaleFireSpew_A.png b/Textures/Things/Mote/BaleFireSpew_A.png new file mode 100644 index 0000000..8509b56 Binary files /dev/null and b/Textures/Things/Mote/BaleFireSpew_A.png differ diff --git a/Textures/Things/Mote/BaleFireSpew_Base.png b/Textures/Things/Mote/BaleFireSpew_Base.png new file mode 100644 index 0000000..f4d7bcd Binary files /dev/null and b/Textures/Things/Mote/BaleFireSpew_Base.png differ diff --git a/Textures/Things/Mote/UndeadVigorAura.png b/Textures/Things/Mote/UndeadVigorAura.png new file mode 100644 index 0000000..71c820a Binary files /dev/null and b/Textures/Things/Mote/UndeadVigorAura.png differ diff --git a/Textures/Things/Pawn/Artifice/Agrihand_east.png b/Textures/Things/Pawn/Artifice/Agrihand_east.png new file mode 100644 index 0000000..eb7ff27 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Agrihand_east.png differ diff --git a/Textures/Things/Pawn/Artifice/Agrihand_north.png b/Textures/Things/Pawn/Artifice/Agrihand_north.png new file mode 100644 index 0000000..1e37dde Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Agrihand_north.png differ diff --git a/Textures/Things/Pawn/Artifice/Agrihand_south.png b/Textures/Things/Pawn/Artifice/Agrihand_south.png new file mode 100644 index 0000000..9621708 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Agrihand_south.png differ diff --git a/Textures/Things/Pawn/Artifice/Artboard 1 copy 6.png b/Textures/Things/Pawn/Artifice/Artboard 1 copy 6.png new file mode 100644 index 0000000..14755a8 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Artboard 1 copy 6.png differ diff --git a/Textures/Things/Pawn/Artifice/Artboard 1 copy 7.png b/Textures/Things/Pawn/Artifice/Artboard 1 copy 7.png new file mode 100644 index 0000000..ebe5516 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Artboard 1 copy 7.png differ diff --git a/Textures/Things/Pawn/Artifice/Artboard 1 copy 8.png b/Textures/Things/Pawn/Artifice/Artboard 1 copy 8.png new file mode 100644 index 0000000..a90f1fd Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Artboard 1 copy 8.png differ diff --git a/Textures/Things/Pawn/Artifice/Cleansweeper_east.png b/Textures/Things/Pawn/Artifice/Cleansweeper_east.png new file mode 100644 index 0000000..09d5f88 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Cleansweeper_east.png differ diff --git a/Textures/Things/Pawn/Artifice/Cleansweeper_north.png b/Textures/Things/Pawn/Artifice/Cleansweeper_north.png new file mode 100644 index 0000000..c88c1fc Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Cleansweeper_north.png differ diff --git a/Textures/Things/Pawn/Artifice/Cleansweeper_south.png b/Textures/Things/Pawn/Artifice/Cleansweeper_south.png new file mode 100644 index 0000000..33aeed3 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Cleansweeper_south.png differ diff --git a/Textures/Things/Pawn/Artifice/Constructoid_east.png b/Textures/Things/Pawn/Artifice/Constructoid_east.png new file mode 100644 index 0000000..38424b4 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Constructoid_east.png differ diff --git a/Textures/Things/Pawn/Artifice/Constructoid_north.png b/Textures/Things/Pawn/Artifice/Constructoid_north.png new file mode 100644 index 0000000..7f2bfa2 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Constructoid_north.png differ diff --git a/Textures/Things/Pawn/Artifice/Constructoid_south.png b/Textures/Things/Pawn/Artifice/Constructoid_south.png new file mode 100644 index 0000000..09eb959 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Constructoid_south.png differ diff --git a/Textures/Things/Pawn/Artifice/Lifter_east.png b/Textures/Things/Pawn/Artifice/Lifter_east.png new file mode 100644 index 0000000..1b4604d Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Lifter_east.png differ diff --git a/Textures/Things/Pawn/Artifice/Lifter_north.png b/Textures/Things/Pawn/Artifice/Lifter_north.png new file mode 100644 index 0000000..74a4322 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Lifter_north.png differ diff --git a/Textures/Things/Pawn/Artifice/Lifter_south.png b/Textures/Things/Pawn/Artifice/Lifter_south.png new file mode 100644 index 0000000..7c19ff3 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Lifter_south.png differ diff --git a/Textures/Things/Pawn/Artifice/Militor_east.png b/Textures/Things/Pawn/Artifice/Militor_east.png new file mode 100644 index 0000000..1eae41d Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Militor_east.png differ diff --git a/Textures/Things/Pawn/Artifice/Militor_north.png b/Textures/Things/Pawn/Artifice/Militor_north.png new file mode 100644 index 0000000..181acdf Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Militor_north.png differ diff --git a/Textures/Things/Pawn/Artifice/Militor_south.png b/Textures/Things/Pawn/Artifice/Militor_south.png new file mode 100644 index 0000000..2df579e Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Militor_south.png differ diff --git a/Textures/Things/Pawn/Artifice/Paramedic_east copy.png b/Textures/Things/Pawn/Artifice/Paramedic_east copy.png new file mode 100644 index 0000000..23a512a Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Paramedic_east copy.png differ diff --git a/Textures/Things/Pawn/Artifice/Paramedic_east.png b/Textures/Things/Pawn/Artifice/Paramedic_east.png new file mode 100644 index 0000000..f9a6a92 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Paramedic_east.png differ diff --git a/Textures/Things/Pawn/Artifice/Paramedic_north copy.png b/Textures/Things/Pawn/Artifice/Paramedic_north copy.png new file mode 100644 index 0000000..b627fdd Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Paramedic_north copy.png differ diff --git a/Textures/Things/Pawn/Artifice/Paramedic_north.png b/Textures/Things/Pawn/Artifice/Paramedic_north.png new file mode 100644 index 0000000..9613c33 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Paramedic_north.png differ diff --git a/Textures/Things/Pawn/Artifice/Paramedic_south copy.png b/Textures/Things/Pawn/Artifice/Paramedic_south copy.png new file mode 100644 index 0000000..2e647f4 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Paramedic_south copy.png differ diff --git a/Textures/Things/Pawn/Artifice/Paramedic_south.png b/Textures/Things/Pawn/Artifice/Paramedic_south.png new file mode 100644 index 0000000..032a2d6 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Paramedic_south.png differ diff --git a/Textures/Things/Pawn/Artifice/Scyther_east.png b/Textures/Things/Pawn/Artifice/Scyther_east.png new file mode 100644 index 0000000..60d9529 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Scyther_east.png differ diff --git a/Textures/Things/Pawn/Artifice/Scyther_north.png b/Textures/Things/Pawn/Artifice/Scyther_north.png new file mode 100644 index 0000000..388668b Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Scyther_north.png differ diff --git a/Textures/Things/Pawn/Artifice/Scyther_south.png b/Textures/Things/Pawn/Artifice/Scyther_south.png new file mode 100644 index 0000000..d13f045 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Scyther_south.png differ diff --git a/Textures/Things/Pawn/Artifice/Sentinel_east.png b/Textures/Things/Pawn/Artifice/Sentinel_east.png new file mode 100644 index 0000000..7baae9f Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Sentinel_east.png differ diff --git a/Textures/Things/Pawn/Artifice/Sentinel_north.png b/Textures/Things/Pawn/Artifice/Sentinel_north.png new file mode 100644 index 0000000..519d58d Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Sentinel_north.png differ diff --git a/Textures/Things/Pawn/Artifice/Sentinel_south.png b/Textures/Things/Pawn/Artifice/Sentinel_south.png new file mode 100644 index 0000000..814f7d2 Binary files /dev/null and b/Textures/Things/Pawn/Artifice/Sentinel_south.png differ diff --git a/v1.4/Textures/Things/Pawn/DemonkinSummon/DemonImp/DemonImp_east.png b/Textures/Things/Pawn/DemonkinSummon/DemonImp/DemonImp_east.png similarity index 100% rename from v1.4/Textures/Things/Pawn/DemonkinSummon/DemonImp/DemonImp_east.png rename to Textures/Things/Pawn/DemonkinSummon/DemonImp/DemonImp_east.png diff --git a/v1.4/Textures/Things/Pawn/DemonkinSummon/DemonImp/DemonImp_north.png b/Textures/Things/Pawn/DemonkinSummon/DemonImp/DemonImp_north.png similarity index 100% rename from v1.4/Textures/Things/Pawn/DemonkinSummon/DemonImp/DemonImp_north.png rename to Textures/Things/Pawn/DemonkinSummon/DemonImp/DemonImp_north.png diff --git a/v1.4/Textures/Things/Pawn/DemonkinSummon/DemonImp/DemonImp_south.png b/Textures/Things/Pawn/DemonkinSummon/DemonImp/DemonImp_south.png similarity index 100% rename from v1.4/Textures/Things/Pawn/DemonkinSummon/DemonImp/DemonImp_south.png rename to Textures/Things/Pawn/DemonkinSummon/DemonImp/DemonImp_south.png diff --git a/Textures/Things/Pawn/Humanlike/Apparel/ArtificeFist.png b/Textures/Things/Pawn/Humanlike/Apparel/ArtificeFist.png new file mode 100644 index 0000000..df25b3a Binary files /dev/null and b/Textures/Things/Pawn/Humanlike/Apparel/ArtificeFist.png differ diff --git a/v1.4/Textures/Things/Pawn/Humanlike/Apparel/BloodChalice.png b/Textures/Things/Pawn/Humanlike/Apparel/BloodChalice.png similarity index 100% rename from v1.4/Textures/Things/Pawn/Humanlike/Apparel/BloodChalice.png rename to Textures/Things/Pawn/Humanlike/Apparel/BloodChalice.png diff --git a/v1.4/Textures/Things/Pawn/Humanlike/Apparel/Necronomicon.png b/Textures/Things/Pawn/Humanlike/Apparel/Necronomicon.png similarity index 100% rename from v1.4/Textures/Things/Pawn/Humanlike/Apparel/Necronomicon.png rename to Textures/Things/Pawn/Humanlike/Apparel/Necronomicon.png diff --git a/Textures/Things/Pawn/SanguophageSummon/DemonImp/DemonImp_east.png b/Textures/Things/Pawn/SanguophageSummon/DemonImp/DemonImp_east.png new file mode 100644 index 0000000..d0f9fbe Binary files /dev/null and b/Textures/Things/Pawn/SanguophageSummon/DemonImp/DemonImp_east.png differ diff --git a/Textures/Things/Pawn/SanguophageSummon/DemonImp/DemonImp_north.png b/Textures/Things/Pawn/SanguophageSummon/DemonImp/DemonImp_north.png new file mode 100644 index 0000000..63ce19c Binary files /dev/null and b/Textures/Things/Pawn/SanguophageSummon/DemonImp/DemonImp_north.png differ diff --git a/Textures/Things/Pawn/SanguophageSummon/DemonImp/DemonImp_south.png b/Textures/Things/Pawn/SanguophageSummon/DemonImp/DemonImp_south.png new file mode 100644 index 0000000..41a5772 Binary files /dev/null and b/Textures/Things/Pawn/SanguophageSummon/DemonImp/DemonImp_south.png differ diff --git a/v1.4/Textures/Things/Pawn/SanguophageSummon/SangGhoul/SangGhoul_east.png b/Textures/Things/Pawn/SanguophageSummon/SangGhoul/SangGhoul_east.png similarity index 100% rename from v1.4/Textures/Things/Pawn/SanguophageSummon/SangGhoul/SangGhoul_east.png rename to Textures/Things/Pawn/SanguophageSummon/SangGhoul/SangGhoul_east.png diff --git a/v1.4/Textures/Things/Pawn/SanguophageSummon/SangGhoul/SangGhoul_north.png b/Textures/Things/Pawn/SanguophageSummon/SangGhoul/SangGhoul_north.png similarity index 100% rename from v1.4/Textures/Things/Pawn/SanguophageSummon/SangGhoul/SangGhoul_north.png rename to Textures/Things/Pawn/SanguophageSummon/SangGhoul/SangGhoul_north.png diff --git a/v1.4/Textures/Things/Pawn/SanguophageSummon/SangGhoul/SangGhoul_south.png b/Textures/Things/Pawn/SanguophageSummon/SangGhoul/SangGhoul_south.png similarity index 100% rename from v1.4/Textures/Things/Pawn/SanguophageSummon/SangGhoul/SangGhoul_south.png rename to Textures/Things/Pawn/SanguophageSummon/SangGhoul/SangGhoul_south.png diff --git a/v1.4/Textures/Things/Pawn/UndeadSummon/UndeadRestless/UndeadRestless_east.png b/Textures/Things/Pawn/UndeadSummon/UndeadRestless/UndeadRestless_east.png similarity index 100% rename from v1.4/Textures/Things/Pawn/UndeadSummon/UndeadRestless/UndeadRestless_east.png rename to Textures/Things/Pawn/UndeadSummon/UndeadRestless/UndeadRestless_east.png diff --git a/v1.4/Textures/Things/Pawn/UndeadSummon/UndeadRestless/UndeadRestless_north.png b/Textures/Things/Pawn/UndeadSummon/UndeadRestless/UndeadRestless_north.png similarity index 100% rename from v1.4/Textures/Things/Pawn/UndeadSummon/UndeadRestless/UndeadRestless_north.png rename to Textures/Things/Pawn/UndeadSummon/UndeadRestless/UndeadRestless_north.png diff --git a/v1.4/Textures/Things/Pawn/UndeadSummon/UndeadRestless/UndeadRestless_south.png b/Textures/Things/Pawn/UndeadSummon/UndeadRestless/UndeadRestless_south.png similarity index 100% rename from v1.4/Textures/Things/Pawn/UndeadSummon/UndeadRestless/UndeadRestless_south.png rename to Textures/Things/Pawn/UndeadSummon/UndeadRestless/UndeadRestless_south.png diff --git a/v1.4/Textures/Things/Pawn/UndeadSummon/UndeadSkeleton/UndeadSkeleton_east.png b/Textures/Things/Pawn/UndeadSummon/UndeadSkeleton/UndeadSkeleton_east.png similarity index 100% rename from v1.4/Textures/Things/Pawn/UndeadSummon/UndeadSkeleton/UndeadSkeleton_east.png rename to Textures/Things/Pawn/UndeadSummon/UndeadSkeleton/UndeadSkeleton_east.png diff --git a/v1.4/Textures/Things/Pawn/UndeadSummon/UndeadSkeleton/UndeadSkeleton_north.png b/Textures/Things/Pawn/UndeadSummon/UndeadSkeleton/UndeadSkeleton_north.png similarity index 100% rename from v1.4/Textures/Things/Pawn/UndeadSummon/UndeadSkeleton/UndeadSkeleton_north.png rename to Textures/Things/Pawn/UndeadSummon/UndeadSkeleton/UndeadSkeleton_north.png diff --git a/v1.4/Textures/Things/Pawn/UndeadSummon/UndeadSkeleton/UndeadSkeleton_south.png b/Textures/Things/Pawn/UndeadSummon/UndeadSkeleton/UndeadSkeleton_south.png similarity index 100% rename from v1.4/Textures/Things/Pawn/UndeadSummon/UndeadSkeleton/UndeadSkeleton_south.png rename to Textures/Things/Pawn/UndeadSummon/UndeadSkeleton/UndeadSkeleton_south.png diff --git a/Textures/Things/Projectile/Projectile_DarkBolt.png b/Textures/Things/Projectile/Projectile_DarkBolt.png new file mode 100644 index 0000000..c772b04 Binary files /dev/null and b/Textures/Things/Projectile/Projectile_DarkBolt.png differ diff --git a/v1.4/Textures/Things/Special/Fluid/Steam_OverlayBase.png b/Textures/Things/Special/Fluid/Steam_OverlayBase.png similarity index 100% rename from v1.4/Textures/Things/Special/Fluid/Steam_OverlayBase.png rename to Textures/Things/Special/Fluid/Steam_OverlayBase.png diff --git a/Textures/UI/Abilities/Ability_ArcanaSealing.png b/Textures/UI/Abilities/Ability_ArcanaSealing.png new file mode 100644 index 0000000..a7859c5 Binary files /dev/null and b/Textures/UI/Abilities/Ability_ArcanaSealing.png differ diff --git a/Textures/UI/Abilities/Ability_Curse copy 2.png b/Textures/UI/Abilities/Ability_Curse copy 2.png new file mode 100644 index 0000000..d466d4e Binary files /dev/null and b/Textures/UI/Abilities/Ability_Curse copy 2.png differ diff --git a/Textures/UI/Abilities/Ability_Curse copy.png b/Textures/UI/Abilities/Ability_Curse copy.png new file mode 100644 index 0000000..9606d3a Binary files /dev/null and b/Textures/UI/Abilities/Ability_Curse copy.png differ diff --git a/Textures/UI/Abilities/Ability_Curse_Decrepify.png b/Textures/UI/Abilities/Ability_Curse_Decrepify.png new file mode 100644 index 0000000..76ed54d Binary files /dev/null and b/Textures/UI/Abilities/Ability_Curse_Decrepify.png differ diff --git a/Textures/UI/Abilities/Ability_DarkBolt.png b/Textures/UI/Abilities/Ability_DarkBolt.png new file mode 100644 index 0000000..f30eed8 Binary files /dev/null and b/Textures/UI/Abilities/Ability_DarkBolt.png differ diff --git a/Textures/UI/Abilities/Ability_DarkFlame.png b/Textures/UI/Abilities/Ability_DarkFlame.png new file mode 100644 index 0000000..6a089ba Binary files /dev/null and b/Textures/UI/Abilities/Ability_DarkFlame.png differ diff --git a/Textures/UI/Abilities/Ability_DarkSigil.png b/Textures/UI/Abilities/Ability_DarkSigil.png new file mode 100644 index 0000000..4bb13bd Binary files /dev/null and b/Textures/UI/Abilities/Ability_DarkSigil.png differ diff --git a/Textures/UI/Abilities/Ability_HorrificScream.png b/Textures/UI/Abilities/Ability_HorrificScream.png new file mode 100644 index 0000000..537c70e Binary files /dev/null and b/Textures/UI/Abilities/Ability_HorrificScream.png differ diff --git a/Textures/UI/Abilities/Ability_MassSummon.png b/Textures/UI/Abilities/Ability_MassSummon.png new file mode 100644 index 0000000..b7131b2 Binary files /dev/null and b/Textures/UI/Abilities/Ability_MassSummon.png differ diff --git a/Textures/UI/Abilities/Ability_NecroticVigor.png b/Textures/UI/Abilities/Ability_NecroticVigor.png new file mode 100644 index 0000000..c7abf22 Binary files /dev/null and b/Textures/UI/Abilities/Ability_NecroticVigor.png differ diff --git a/Textures/UI/Abilities/Ability_Ressurect.png b/Textures/UI/Abilities/Ability_Ressurect.png new file mode 100644 index 0000000..f3e4f86 Binary files /dev/null and b/Textures/UI/Abilities/Ability_Ressurect.png differ diff --git a/Textures/UI/Abilities/Ability_Summon.png b/Textures/UI/Abilities/Ability_Summon.png new file mode 100644 index 0000000..36e0fe1 Binary files /dev/null and b/Textures/UI/Abilities/Ability_Summon.png differ diff --git a/v1.4/Textures/UI/Gizmos/SteamPipeDeconstruction_MenuIcon.png b/Textures/UI/Gizmos/SteamPipeDeconstruction_MenuIcon.png similarity index 100% rename from v1.4/Textures/UI/Gizmos/SteamPipeDeconstruction_MenuIcon.png rename to Textures/UI/Gizmos/SteamPipeDeconstruction_MenuIcon.png diff --git a/v1.4/Textures/UI/Icons/Genes/Body_Demonic_Icon.png b/Textures/UI/Icons/Genes/Body_Demonic_Icon.png similarity index 100% rename from v1.4/Textures/UI/Icons/Genes/Body_Demonic_Icon.png rename to Textures/UI/Icons/Genes/Body_Demonic_Icon.png diff --git a/Textures/UI/Icons/Genes/Body_Necrarch_Icon.png b/Textures/UI/Icons/Genes/Body_Necrarch_Icon.png new file mode 100644 index 0000000..79d4344 Binary files /dev/null and b/Textures/UI/Icons/Genes/Body_Necrarch_Icon.png differ diff --git a/v1.4/Textures/UI/Icons/Genes/Body_Skeletal_Icon.png b/Textures/UI/Icons/Genes/Body_Skeletal_Icon.png similarity index 100% rename from v1.4/Textures/UI/Icons/Genes/Body_Skeletal_Icon.png rename to Textures/UI/Icons/Genes/Body_Skeletal_Icon.png diff --git a/v1.4/Textures/UI/Icons/Genes/Body_Wight_Icon.png b/Textures/UI/Icons/Genes/Body_Wight_Icon.png similarity index 100% rename from v1.4/Textures/UI/Icons/Genes/Body_Wight_Icon.png rename to Textures/UI/Icons/Genes/Body_Wight_Icon.png diff --git a/Textures/UI/Icons/Genes/Gene_ArcanaSealing.png b/Textures/UI/Icons/Genes/Gene_ArcanaSealing.png new file mode 100644 index 0000000..5ccf8c6 Binary files /dev/null and b/Textures/UI/Icons/Genes/Gene_ArcanaSealing.png differ diff --git a/Textures/UI/Icons/Genes/Gene_BaleFire_Icon.png b/Textures/UI/Icons/Genes/Gene_BaleFire_Icon.png new file mode 100644 index 0000000..0856732 Binary files /dev/null and b/Textures/UI/Icons/Genes/Gene_BaleFire_Icon.png differ diff --git a/Textures/UI/Icons/Genes/Gene_Curse_Decrepify.png b/Textures/UI/Icons/Genes/Gene_Curse_Decrepify.png new file mode 100644 index 0000000..f44f47b Binary files /dev/null and b/Textures/UI/Icons/Genes/Gene_Curse_Decrepify.png differ diff --git a/Textures/UI/Icons/Genes/Gene_DarkBolt.png b/Textures/UI/Icons/Genes/Gene_DarkBolt.png new file mode 100644 index 0000000..0322db1 Binary files /dev/null and b/Textures/UI/Icons/Genes/Gene_DarkBolt.png differ diff --git a/Textures/UI/Icons/Genes/Gene_DarkSigil.png b/Textures/UI/Icons/Genes/Gene_DarkSigil.png new file mode 100644 index 0000000..fe67c3b Binary files /dev/null and b/Textures/UI/Icons/Genes/Gene_DarkSigil.png differ diff --git a/v1.4/Textures/UI/Icons/Genes/Gene_ElongatedHorns.png b/Textures/UI/Icons/Genes/Gene_ElongatedHorns.png similarity index 100% rename from v1.4/Textures/UI/Icons/Genes/Gene_ElongatedHorns.png rename to Textures/UI/Icons/Genes/Gene_ElongatedHorns.png diff --git a/Textures/UI/Icons/Genes/Gene_HorrificScream.png b/Textures/UI/Icons/Genes/Gene_HorrificScream.png new file mode 100644 index 0000000..54c48c4 Binary files /dev/null and b/Textures/UI/Icons/Genes/Gene_HorrificScream.png differ diff --git a/Textures/UI/Icons/Genes/Gene_MassSummon.png b/Textures/UI/Icons/Genes/Gene_MassSummon.png new file mode 100644 index 0000000..e8fa047 Binary files /dev/null and b/Textures/UI/Icons/Genes/Gene_MassSummon.png differ diff --git a/Textures/UI/Icons/Genes/Gene_Mindless copy 2.png b/Textures/UI/Icons/Genes/Gene_Mindless copy 2.png new file mode 100644 index 0000000..f14e86b Binary files /dev/null and b/Textures/UI/Icons/Genes/Gene_Mindless copy 2.png differ diff --git a/Textures/UI/Icons/Genes/Gene_Mindless.png b/Textures/UI/Icons/Genes/Gene_Mindless.png new file mode 100644 index 0000000..196b63c Binary files /dev/null and b/Textures/UI/Icons/Genes/Gene_Mindless.png differ diff --git a/Textures/UI/Icons/Genes/Gene_NecroticVigor.png b/Textures/UI/Icons/Genes/Gene_NecroticVigor.png new file mode 100644 index 0000000..84c7111 Binary files /dev/null and b/Textures/UI/Icons/Genes/Gene_NecroticVigor.png differ diff --git a/Textures/UI/Icons/Genes/Gene_NeverEats.png b/Textures/UI/Icons/Genes/Gene_NeverEats.png new file mode 100644 index 0000000..6199b57 Binary files /dev/null and b/Textures/UI/Icons/Genes/Gene_NeverEats.png differ diff --git a/Textures/UI/Icons/Genes/Gene_Ressurect.png b/Textures/UI/Icons/Genes/Gene_Ressurect.png new file mode 100644 index 0000000..28d0500 Binary files /dev/null and b/Textures/UI/Icons/Genes/Gene_Ressurect.png differ diff --git a/Textures/UI/Icons/Genes/Gene_SoulDrain.png b/Textures/UI/Icons/Genes/Gene_SoulDrain.png new file mode 100644 index 0000000..7de9437 Binary files /dev/null and b/Textures/UI/Icons/Genes/Gene_SoulDrain.png differ diff --git a/Textures/UI/Icons/Genes/Gene_SoulStarved.png b/Textures/UI/Icons/Genes/Gene_SoulStarved.png new file mode 100644 index 0000000..6e73af9 Binary files /dev/null and b/Textures/UI/Icons/Genes/Gene_SoulStarved.png differ diff --git a/Textures/UI/Icons/Genes/Gene_Summon.png b/Textures/UI/Icons/Genes/Gene_Summon.png new file mode 100644 index 0000000..7fed575 Binary files /dev/null and b/Textures/UI/Icons/Genes/Gene_Summon.png differ diff --git a/v1.4/Textures/UI/Icons/Genes/Head_Demonic_Icon.png b/Textures/UI/Icons/Genes/Head_Demonic_Icon.png similarity index 100% rename from v1.4/Textures/UI/Icons/Genes/Head_Demonic_Icon.png rename to Textures/UI/Icons/Genes/Head_Demonic_Icon.png diff --git a/Textures/UI/Icons/Genes/Head_Necrarch_Icon.png b/Textures/UI/Icons/Genes/Head_Necrarch_Icon.png new file mode 100644 index 0000000..50e699f Binary files /dev/null and b/Textures/UI/Icons/Genes/Head_Necrarch_Icon.png differ diff --git a/Textures/UI/Icons/Genes/MB_Corrupted_EndogeneBackground.png b/Textures/UI/Icons/Genes/MB_Corrupted_EndogeneBackground.png new file mode 100644 index 0000000..74f8a96 Binary files /dev/null and b/Textures/UI/Icons/Genes/MB_Corrupted_EndogeneBackground.png differ diff --git a/Textures/UI/Icons/Genes/MB_Corrupted_XenogeneBackground.png b/Textures/UI/Icons/Genes/MB_Corrupted_XenogeneBackground.png new file mode 100644 index 0000000..9707a52 Binary files /dev/null and b/Textures/UI/Icons/Genes/MB_Corrupted_XenogeneBackground.png differ diff --git a/v1.4/Textures/UI/Icons/Xenotypes/Demonkin.png b/Textures/UI/Icons/Xenotypes/Demonkin.png similarity index 100% rename from v1.4/Textures/UI/Icons/Xenotypes/Demonkin.png rename to Textures/UI/Icons/Xenotypes/Demonkin.png diff --git a/v1.4/Textures/UI/Icons/Xenotypes/Necrarch.png b/Textures/UI/Icons/Xenotypes/Necrarch.png similarity index 100% rename from v1.4/Textures/UI/Icons/Xenotypes/Necrarch.png rename to Textures/UI/Icons/Xenotypes/Necrarch.png diff --git a/v1.4/Textures/UI/Icons/Xenotypes/Wight.png b/Textures/UI/Icons/Xenotypes/Wight.png similarity index 100% rename from v1.4/Textures/UI/Icons/Xenotypes/Wight.png rename to Textures/UI/Icons/Xenotypes/Wight.png diff --git a/v1.4/Textures/UI/Overlays/NeedsSteam.png b/Textures/UI/Overlays/NeedsSteam.png similarity index 100% rename from v1.4/Textures/UI/Overlays/NeedsSteam.png rename to Textures/UI/Overlays/NeedsSteam.png diff --git a/v1.4/Textures/UI/Overlays/SteamOff.png b/Textures/UI/Overlays/SteamOff.png similarity index 100% rename from v1.4/Textures/UI/Overlays/SteamOff.png rename to Textures/UI/Overlays/SteamOff.png diff --git a/v1.4/Assemblies/MedievalBiotech.dll b/v1.4/Assemblies/MedievalBiotech.dll deleted file mode 100644 index 425f8af..0000000 Binary files a/v1.4/Assemblies/MedievalBiotech.dll and /dev/null differ diff --git a/v1.4/Textures/Things/Item/Resource/CorruptedSoulBasic.png b/v1.4/Textures/Things/Item/Resource/CorruptedSoulBasic.png deleted file mode 100644 index fdda930..0000000 Binary files a/v1.4/Textures/Things/Item/Resource/CorruptedSoulBasic.png and /dev/null differ diff --git a/v1.4/Textures/UI/Icons/Genes/Gene_SoulDrain.png b/v1.4/Textures/UI/Icons/Genes/Gene_SoulDrain.png deleted file mode 100644 index a863c18..0000000 Binary files a/v1.4/Textures/UI/Icons/Genes/Gene_SoulDrain.png and /dev/null differ diff --git a/v1.4/Textures/UI/Icons/Genes/Gene_SoulStarved.png b/v1.4/Textures/UI/Icons/Genes/Gene_SoulStarved.png deleted file mode 100644 index 4d1a03e..0000000 Binary files a/v1.4/Textures/UI/Icons/Genes/Gene_SoulStarved.png and /dev/null differ