Ludeon Forums

RimWorld => Mods => Releases => Topic started by: ilikegoodfood on February 01, 2018, 09:40:33 AM

Title: [B18-1.0] Monster Mash (v4.0.4) (Changed Frameworks and Dependancies)
Post by: ilikegoodfood on February 01, 2018, 09:40:33 AM
Monster Mash

(https://ludeon.com/forums/index.php?action=dlattach;topic=38918.0;attach=24144;image)

Description:
The RimWorlds contain a broad variety of Earthly and artificial animals, ranging from tiny squirrels to the extinct megasloth (megatherium), from chemically useful boomalopes to rogue bioweapons.
Yet, here in the lawless Rim, far beyond the reach of the shining cities and ethics review boards of the GlitterWorlds, many a mad scientist or budding entrepreneur has attempted to establish themselves as a new giant in the field of genetic manipulation. Regardless of how well their creations were received in the journals back home, the beasts they forged still roam, wild and untamed, in the wildernesses of the RimWorlds.

This mod aims to implement a (hopefully) large number of interesting, dangerous and exotic creatures to the game; some serious, some fanciful.

Currently implemented:
Carrion Crawler - A huge land snail that roams the arid shrublands in an unending quest for prey. This acid spitting, flesh eating beast is a beautiful native creature of some RimWorld's. It's shell makes for a fine furnishing to any room.

Inferno Beetle - A giant dendrevour (tree eater) that converts timber into chemfuel. Originally developed as a means of industrial espionage in the timber industry, the creature was abandoned due to its powerful flaming spit.

Land Kraken - A small, soft bodied, and lethal predator. Reasonably easy to kill but extremely dangerous in melee combat, the land kraken is armed with eight bladed tentacles and a poisonous bite. It sprays a cloud of ink to defend itself when shot.

Polar Colossus - An immense bear-like cyborg, the result of illegal experimentation with Mechanoid technologies. This monstrous beast is armed with an integrated power-core and thermal lance assembly. This assembly can be sergically extracted and transfered to human colonists, providing significant bonuses.

Sanguine Drake - A large predatory lizard developed for military operations on arid and desert-like worlds. Tough to kill, ride-able (with Giddy-Up!), capable of transporting goods and a fierce fighter, they far surpass camels or horses. In addition to their formidable capabilities, they are able to fire blood from the capillaries around their eyes at ballistic speeds, inflicting a powerful anti-coagulant venom, both from the blood-spray and their bite.

Other Features:
Full prosthetics suite for the Land Kraken while A Dog Said... is installed.
Monster Sighting (Event) - A random event that spawns a small number on Monsters on your colony map, regardless of normal biome-locking. They'll hang around for a few days and then leave again.
Thermal Core (Building) - The thermal core of a polar colossus, modified and mounted into an external casing. This structure functions as a powerful heating unit, but it dies after a quadrum of use.
Thermal Lance Assembly - The thermal Lance Assembly is a set of three archo-tech equivelent prosthetic parts that can occasionally be purchased from tarders, or harvested sergically form the Polar Colossus. All three provide significant bonuses in their own right, and when all are installed on a paw. the pawn gains full use of the Thermal Lance Assembly, granting them a ranged attack option (scales according to body size). The parts are:
Thermal Core: Comfotable Temperature Min - 40, Max -10 (results on a human is a comfortable temperature range of -24 to +16)
Optical Firing Assembly: +2 Accuracy and Aiming Time reduced by 10%.
Thermal Lance Firing Assembly: Provides a powerful bite attack that does both bite and burn damage.

In Progress:
Due to circumstances i will not discuss, I am taking a long break from RimWorld modding. I still have so much I would like to do with this mod in the future, but that may be delayed indefinitely. I'll let you all when I resume.

Installation and Compatibility:
This mod is Dependant on the Verb Expansion Framework (Steam Workshop (https://steamcommunity.com/id/ilikegoodfood/myworkshopfiles/?appid=294100)) (Forum (https://ludeon.com/forums/index.php?topic=49335.0)). Make sure that you have downloaded the latest version of VEF and placed it in the load order before MonsterMash.
This mod automatically detects and adjusts for the presence of the following other mods:
A Dog Said... (Steam Workshop (http://steamcommunity.com/sharedfiles/filedetails/?id=746425621)) (Forum (https://ludeon.com/forums/index.php?topic=29310.0))
Giddy Up (Steam Workshop (http://steamcommunity.com/sharedfiles/filedetails/?id=1216999901)) (Forum (https://ludeon.com/forums/index.php?topic=37323.0))

Monster Mash should be loaded after all of the mods that it depends on. So, if you have A Dog Said... installed, the load order for those mods should be Core, Verb Expansion Framework, A Dog Said..., Monster Mash.
It should be safe to add this mod to existing save files, but changing mods mid game is always risky.
In theory, if no pawn, component, or resource from this mod is anywhere on your map, it should be possible to remove it from an active game, but I wouldn't recommend risking it.

Downloads:
For RimWorld 1.0
SteamWorkshop (https://steamcommunity.com/sharedfiles/filedetails/?id=1541482356)
DirectDownload (Dropbox) (https://www.dropbox.com/s/2b7sxrjo9gkh0ut/MonsterMash%20%281.0%29.zip?dl=0)

For RimWorld B19 (Final Version)
Direct Download (Dropbox) (https://www.dropbox.com/s/4nm665mx3iyz9vq/MonsterMash%20%28B19%29.zip?dl=0)
Steam Workshop (https://steamcommunity.com/sharedfiles/filedetails/?id=1533841743)

For RimWorld B18 (Final Version)
Direct Download (Dropbox) (https://www.dropbox.com/s/cgrl5xmod39eezf/MonsterMash.zip?dl=0)
Steam Workshop (http://steamcommunity.com/sharedfiles/filedetails/?id=1288174761)

This mod is intended to work alongside such great mods as the Animal Collab Project (Steam Workshop (http://steamcommunity.com/sharedfiles/filedetails/?id=949283405)) (Forum (https://ludeon.com/forums/index.php?topic=30541.0)) and the Megafauna mod (Steam Workshop (http://steamcommunity.com/sharedfiles/filedetails/?id=1055485938)) (Forum (https://ludeon.com/forums/index.php?topic=34432.0)). Similarity in creatures should be minimal.
B18 also has combatibility for Combat Extended. Versions after B18 do not, nor will likely ever have CE compatibility.

Bugs and Localizations:
German: Monster Mash has been generously translated to German by Trunken.
Due to limitations in RimWorld core, the translations for the conditional A Dog Said prosthetics cannot be released yet. I'm working on a solution.

Please report any bugs that you find to me, so that I may try and solve them. When reporting a bug, please provide the error log and mod list.
I only speak English, so I cannot make localizations for other languages. If you know how and speak those languages, please feel free to create localizations and I can incorporate them into the core mod (Credits will be given).

Credits
A Dog Said... Animal Surgery (Steam Workshop (http://steamcommunity.com/sharedfiles/filedetails/?id=746425621&searchtext=A+Dog+Said)) (Forum (https://ludeon.com/forums/index.php?topic=29310.0)), created and maintained by spoonshortage. A mod that provides Animal Prosthetics and operations systems. Some A Dog Said... definitions are used in my mod for compatibility purposes.
Megafauna (Steam Workshop (http://steamcommunity.com/sharedfiles/filedetails/?id=1055485938)) (Forum (https://ludeon.com/forums/index.php?topic=34432.0)), created and maintained by Spino. A fantastic animal addition mod that acted both as the inspiration for my mod and an excellent template from which to learn.
Verb Expansion Framework (Steam Workshop (https://steamcommunity.com/id/ilikegoodfood/myworkshopfiles/?appid=294100)) (Forum (https://ludeon.com/forums/index.php?topic=49335.0)), created by myself. A brand new framework designed to facilitate the various new features that I wish to implement in this mod.

License:
If you're a modpack maker and want to include Monster Mash or if you are a modder and want to use it as the basis of a derivative or similar mod, please feel free to do so. I only ask that you let me know about it and credit me where appropriate.
Title: Re: [B18] Monster Mash (v1) (1st Release)
Post by: ilikegoodfood on February 01, 2018, 09:44:43 AM
Creature Gallery
All images are currently from the final B18 version of the mod. The B18 Gallery can be viewed on Imgur. (https://imgur.com/gallery/8xGK8IE)

Carrion Crawler
(https://imgur.com/6q9sMnp.jpg)(https://imgur.com/aNX48Ip.jpg)

Inferno Beetle
(https://imgur.com/XIVvkEV.jpg) (https://imgur.com/IbNSOQN.jpg)

Land Kraken
(https://imgur.com/cUvcyP3.jpg)

Polar Colossus
(https://imgur.com/u6nYgcc.jpg)(https://imgur.com/T2r5cXG.jpg)
(https://imgur.com/oHUusNF.jpg)(https://imgur.com/ZXrkQiA.jpg)

Sanguine Drake
(https://imgur.com/aJ3klXJ.jpg)(https://imgur.com/yYT5QzW.jpg)(https://imgur.com/dsGdcMD.jpg)

Change Log:
Version 4.0.4:


Version 4.0.3:

Version 4.0.2:

Version 4.0.1:

Version 4: Removed dependency on ModCheck and the Animal Ranged Framework. MonsterMash is now dependant on the Verb Expansion Framework, made by myself to better fascilitate my goals for this mod.
Version 3.02: Increased trade value of Thermal Core and Carrion Crawler Shell. Made all monster tradeable as AnimalFight. This means that combat merchants will stock and trade them.
Version 3.0.1: Reset Meat Quantities to default, increasing meat harvested from the monsters by ~18%.
Version 3 - Updated to 1.0.
Version 2.0.1 - Fixed Inferno Beetle Shader and duplicate Bear Meat.
Version 2 - Updated to B19.
Version 1.4.1 - Hotfix to remove Carrion Crawler Leather when using CombatExtended. Increased Carrion Crawler armor and hit points when using CombatExtended. Update in-game about section.
Version 1.4 - The Carrion Crawler, a massive flesh eating snail, now wonders through the arid shrublands of the RimWorlds.
Version 1.3.4 - Hotfix that modifies various things: Inferno Beetles now understand that their shots create fire. Inferno Beetles now will not fire too close to allies. Inferno Beetles create slightly less fire. Polar Colossus now eats approximately 50% more. Total Bleeding Rate is now effected by blood pumping; lower blood pumping will reduce bleeding and higher will increase it.
Version 1.3.3 - Hotfix that expands the range of the Land Kraken all the way north, and south, to the Cold Bogs of the arctic and antarctic regions.
Version 1.3.2 - Hotfix to add in the additional body parts that I had planned and subsequently forgotten for the Polar Colossus in 1.3.1.
Version 1.3.1 - Reconfigured the ranged attack of the Polar Colossus and other minor fixes.
Version 1.3 - The Polar Colossus now wanders the frozen wastes.
Version 1.2.1 - Small update to re-balance combat power and market value.
Version 1.2 - The Sanguine Drake now roams the arid wilds.
Version 1.1.3 - Monster Sightings event now implemented.
Version 1.1.2 - Minor hotfix to update in-game mod description.
Version 1.1.1 - Full A Dog Said... compatibility for the Land Kraken and its many new body parts and organs. It's all included in this mod, without the need for a seperate compatibility mod.
Version 1.1 - Release the KRAKEN!
Version 1.0.2 - Change diet type of the Inferno Beetle to match the Thrombo. It now eats hay and can be tamed directly.
Version 1.0.1 - Adjusted harvestable insect meat quantity from the Inferno Beetle.
Version 1 - This is the very first release and only includes a single organism at the moment.[/list]
Title: Re: [B18] Monster Mash (v1) (1st Release)
Post by: ilikegoodfood on February 01, 2018, 09:44:56 AM
Reserved
Title: Re: [B18] Monster Mash (v1) (1st Release)
Post by: ilikegoodfood on February 01, 2018, 09:45:09 AM
Reserved
Title: Re: [B18] Monster Mash (v1) (1st Release)
Post by: Shinzy on February 01, 2018, 09:45:25 AM
Reserved! :p

Daww I wasn't quick enough to get inbetween your reservations
Title: Re: [B18] Monster Mash (v1) (1st Release)
Post by: Headshotkill on February 01, 2018, 10:03:03 AM
Reserved
Title: Re: [B18] Monster Mash (v1) (1st Release)
Post by: SzQ on February 01, 2018, 10:22:23 AM
Post small picture of created creature.
Title: Re: [B18] Monster Mash (v1) (1st Release)
Post by: Harry_Dicks on February 01, 2018, 10:26:17 AM
Awesome! Congrats on your release, bud. Also, remember that rouge is french for red. It would have to be the French to make a red bioweapon. Those dirty, dirty frog people! ;D
Title: Re: [B18] Monster Mash (v1) (1st Release)
Post by: ilikegoodfood on February 01, 2018, 10:31:00 AM
Quote from: Harry_Dicks on February 01, 2018, 10:26:17 AM
Awesome! Congrats on your release, bud. Also, remember that rouge is french for red. It would have to be the French to make a red bioweapon. Those dirty, dirty frog people! ;D

Thanks, fixed.

QuotePost small picture of created creature.
Screenshot is on the way, just trying to get them to line up correctly. :D

EDIT: I have turned the 1st reserved post into a creature gallery, with all compatible mods enabled, so that everything is visible at once.
Title: Re: [B18] Monster Mash (v1) (1st Release)
Post by: Harry_Dicks on February 01, 2018, 10:55:52 AM
Hahah holy crap, thinking about how crazy combat can get. So now, we can have pawns riding a battlemount. But we can also have both the pawn, and the mount, fire both of their ranged attacks. AND you can even do it while on the move!

I love all the diversity of mods that we have, it's so much fun trying to mix and match them. I am absolutely convinced that this is the path forward for games, for me at least. And not trying to have a "pissing contest" of people's time spent playing games, but after playing for 25+ years I am very, very particular about what I want, and usually know within five minutes whether or not I will think a game is garbage. I'm older now and knowing exactly what I want, so I refuse to waste my time on subpar games that I know will just further disappoint me if I were to actually devote time to them. The games I play don't necessarily have to have tons of content in their base game, as long as the devs are going out of their way to make things easier for modders. Really, how could a single company compete, content wise, with an entire community of dedicated and extremely talented and varied artists, programmers, and whatever else is needed to go into mod making. Maybe a single company could, but the cost overhead would be so high from having to retain so many employees that we could never have a game like this for $30.

Thank you OP for this, but also the entire RW modding community as a whole. And of course, everyone at Ludeon! :)

EDIT: I would recommend making a base folder for the mod. When you download from dropbox, and go to extract the zip, everyone will need to make a new base folder themselves, rather than being able to just point their extraction program at their RimWorld/Mods folder.
Title: Re: [B18] Monster Mash (v1) (1st Release)
Post by: ilikegoodfood on February 01, 2018, 03:49:19 PM
A question on the Steam Workshop page made me aware that this needs to be explained:
The Inferno Beetle is a Tree-Eater. It cannot be tamed while on the map and is only available through trade, events and/or dev mode.

Once tamed, it can be trained in Obedience and Release. It can be loaded up for caravan usage and, if you have Giddy-up installed, it can be ridden.

EDIT: I have updated the description to provide detailed information on the implemented creature.
Title: Re: [B18] Monster Mash (v1) (1st Release)
Post by: ilikegoodfood on February 02, 2018, 04:16:08 AM
QuoteNOTE: Dendrovorous creatures cannot be tamed, but can be bought or arrive pre-tamed from events.

Made and uploaded a small edit:
The Inferno Beetle now uses the same food types as the Thrombo, so it will also eat hey and be tamed directly by colonists.
Title: Re: [B18] Monster Mash (v1.0.2) (1st Release, 2nd Hotfix)
Post by: RyanRim on February 02, 2018, 06:53:06 AM
Very nice addition, hope this mod grows big. Really waiting for the land kraken.
Title: Re: [B18] Monster Mash (v1.0.2) (1st Release, 2nd Hotfix)
Post by: ilikegoodfood on February 02, 2018, 02:17:19 PM
Quote from: RyanRim on February 02, 2018, 06:53:06 AM
Very nice addition, hope this mod grows big. Really waiting for the land kraken.

In that case I think that you'll be very glad to know that I have the first iteration of the Kraken working in vanilla, except that it refuses to hunt and it has no graphic yet.
While soft bodied and easy to kill, the creature's eight tentacles are capable of ripping a colonist apart in fairly short order (2-4 seconds - I just watched it happen).

I made certain simplifications, such as not adding individual suckers along the tentacles, but otherwise it's pretty accurate to life.
It contains mostly new bodyparts (Beak, Mantle, Siphon, Tentacle, Gills and a Kidney-Liver hybrid), some of which will be replaceable and transplant-able if you also have A Dog Said... installed (when I work out how to add new prosthetics and operations and patch them into A Dog Said...).

EDIT: The Kraken now works fully in vanilla RimWorld. Will start examining/working on the compatibility patches soon.
They may take longer, as I will need adjust the way my patch files are, so as to split them out into sub-files, learn how to make prosthetics using A Dog Said... and create a Simple and Bionic Tentacle for the Kraken.
Once those are all working, I would like to try and make a more potent venomous bite, but I'll probably release it without and then update the Kraken's Bite Damage Def as a hotfix.
Title: Re: [B18] Monster Mash (v1.0.2) (1st Release, 2nd Hotfix)
Post by: Harry_Dicks on February 02, 2018, 07:45:40 PM
Quote from: ilikegoodfood on February 02, 2018, 02:17:19 PM
EDIT: The Kraken now works fully in vanilla RimWorld.

;D ;D ;D
Title: Re: [B18] Monster Mash (v1.0.2) (1st Release, 2nd Hotfix)
Post by: Umbreon117 on February 03, 2018, 12:25:54 AM
A Kraken on land? That can kill a colonist in seconds?
(loads doomsday)
Title: Re: [B18] Monster Mash (v1.0.2) (1st Release, 2nd Hotfix)
Post by: RyanRim on February 03, 2018, 05:19:57 AM
I mean yeah, with zombieland mod this is full S.T.A.L.K.E.R experience. Ive already got the lovecraftian creatures dammit, now I got to fight against octopuses  :o
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster now Released)
Post by: ilikegoodfood on February 03, 2018, 05:54:30 PM
UPDATE
And we are at Version 1.1, with the release of the Land Kraken to swamps near you.

While easy enough to kill, the land kraken will quickly rip your colonists limb from limb in melee combat with its eight bladed-tentacles and a powerful, venomous beak.

Help plz
I have released the Land Kraken, since it works and doesn't display any obvious errors, however, I could do with some advice with regards to A Dog Said... compatibility.

Basically, I would like to create a Simple Prosthetic Tentacle and a Bionic Tentacle, so that you can have your very own cybernetic krakens.
In principle, adding the required recipes, items and defs isn't that hard. The issue is that, since they're using A Dog Said references, they would log errors if A Dog Said... wasn't installed.
As such, they must be added to the mod as patches, but I don't know how to add Defs to a file, since they are the root Node that xpath uses.

I've done a lot of searching in this regard and haven't found anything useful, there isn't much information out there, beyond the typical guides, so I would very much appreciate some guidance and/or assistance.

If you've gotten this far, thank you for reading my request.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: wwWraith on February 03, 2018, 06:26:28 PM
Afaik in such situation people make an "addon for A Dog Said compatibility" as a separate submod with those defs etc.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: Harry_Dicks on February 03, 2018, 11:06:40 PM
Also not sure if it helps, but on Steam there is the A Dog Said Easy Patcher.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 04, 2018, 04:31:29 AM
QuoteAlso not sure if it helps, but on Steam there is the A Dog Said Easy Patcher.

By looking at the description of the Easy Patcher, it makes assigning the animal to the surgeries list easier, by addidng groups and then allowing you to assign the animal to a group.

Not only have I already got what I need for the surgeries list, but it won't help with adding new body parts or surgeries, or adding new bodies themselves.

Thanks for making me aware of it.

QuoteAfaik in such situation people make an "addon for A Dog Said compatibility" as a separate submod with those defs etc.

That's what I suspected, since I see a lot of those, but I was wondering if there might be a way around it.
For instance, I am planning to try and add a set of unusable defs that match the ones A Dog Said... will need, basically making them as empty as I can without causing errors, so that I have an xpath target to patch-replace. I can use the Abstract="True" tag to hide them from appearing in the game's interface until required.

If you know that this isn't practical/possible please let me know as soon as possible, otherwise I will let you know how it went.

EDIT:So far so good. By using the Abstract="true" tag you don't even need to fill in any of the internal details. You can use a one-line blank def, marked as abstract and then, I haven't gotten to this part yet, Patch-Replace it with whatever you want.

For example:
<ThingDef ParentName="BodyPartArtificialBase" Name="ADSP_SimpleProstheticTentacleAnimal" Abstract="True"></ThingDef>
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: Mufflamingo on February 04, 2018, 04:37:47 AM
I always imagined krakens as gigantic squids.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 04, 2018, 04:42:28 AM
Quote from: Mufflamingo on February 04, 2018, 04:37:47 AM
I always imagined krakens as gigantic squids.

As far as I'm aware the mythology of the Kraken is inspired both and independently by the Giant Pacific Octopus and the Giant Squid, both of which grow to impressive sizes, are highly intelligent and cephalopods.
Probably because I played Age of Mythology so much in my teens, I've always tended towards the Octopus version myself, but both are valid.

Saying that, I think that a squid version would be much less adaptable to the land than the octopus version, but I may be wrong.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: Mufflamingo on February 04, 2018, 07:18:55 AM
Quote from: ilikegoodfood on February 04, 2018, 04:42:28 AM
Quote from: Mufflamingo on February 04, 2018, 04:37:47 AM
I always imagined krakens as gigantic squids.

As far as I'm aware the mythology of the Kraken is inspired both and independently by the Giant Pacific Octopus and the Giant Squid, both of which grow to impressive sizes, are highly intelligent and cephalopods.
Probably because I played Age of Mythology so much in my teens, I've always tended towards the Octopus version myself, but both are valid.

Saying that, I think that a squid version would be much less adaptable to the land than the octopus version, but I may be wrong.

Well, I think octopuses are fine, but arent they too small?
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 04, 2018, 07:25:01 AM
QuoteWell, I think octopuses are fine, but arent they too small?

In the creature description it specifically says that they are much smaller than their mythical counterparts.
I'm aware that many people don't read those text strings in game and that I could make it larger if necessary. The reason I didn't is because I mentally associate large enemies with high-health, low speed enemies and the Land Kraken is more middling-low health and middling-highspeed.

Also, what would you think of the changing the name from Land Kraken to Aardkraken? "Aardkrak" was suggested on the Steam Workshop page, but I'm not sure I like it or that it'll go down well.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: wwWraith on February 04, 2018, 08:23:21 AM
If I was a Rimworld colonist, I'd not want to break my tongue with "Aardkraken" and would transform it into something like "Arkrak"... or just "Land Kraken", most probably :) Imho, in rimworlds people tend to use simplified terms. Some vanilla names could be made more "complex", but they were not. In fact, even Megatherium was renamed to Megasloth and Healroot had some name that I can't even remember now :)
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: TacataX on February 04, 2018, 09:09:44 AM
Awesome mod! Unfortunately, the Dropbox link is not working (anymore).
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: Mufflamingo on February 04, 2018, 09:13:11 AM
Quote from: ilikegoodfood on February 04, 2018, 07:25:01 AM
QuoteWell, I think octopuses are fine, but arent they too small?

In the creature description it specifically says that they are much smaller than their mythical counterparts.
I'm aware that many people don't read those text strings in game and that I could make it larger if necessary. The reason I didn't is because I mentally associate large enemies with high-health, low speed enemies and the Land Kraken is more middling-low health and middling-highspeed.

Also, what would you think of the changing the name from Land Kraken to Aardkraken? "Aardkrak" was suggested on the Steam Workshop page, but I'm not sure I like it or that it'll go down well.

Well I havent downloaded the mod yet so I havent read the in game info (I read those. YES I READ THOSE.)

I'm still waiting for other monsters/animals to be added. :)

Also about the name, what ever you want it to be called. It's your creation anyway. You wouldn't want us to name your baby don't you.

;D
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 04, 2018, 09:13:59 AM
QuoteAwesome mod! Unfortunately, the Dropbox link is not working (anymore).

I will be uploading a new version soon, probably within the hour, so I will replace the Dropbox link then.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 04, 2018, 11:12:08 AM
I have fixed the DropBox link, since I seem to be taking a while to sort out the A Dod Said... Patch.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 04, 2018, 12:25:18 PM
Okay; I could really use some help.

I have spent half the day adding and testing various Abstract entries in my base mod. These entries exactly correspond to the required Defs for A Dog Said... They all appear to work flawlessly, producing no errors.

I then spent the rest of the day trying to sort out the patches for those Defs, but without any success.

Here's an example (Hediffs_AnimalBodyParts.xml):
<?xml version="1.0" encoding="UTF-8"?>

<Defs>

<HediffDef Abstract="True">
<defName>ADSP_SimpleProstheticTentacleAnimal</defName>
</HediffDef>

<HediffDef Abstract="True">
<defName>ADSP_BionicTentacleAnimal</defName>
</HediffDef>

<HediffDef Abstract="True">
<defName>ADSP_BionicAnimalGill</defName>
</HediffDef>

</Defs>


I have then gone into my ADogSaidPAtch.xml and added a number of things to it, that should convert the empty abstracts into the full definitions.

This is the section that effects the HediffDefs:
<Operation Class="PatchOperationSequence">
<success>Always</success>
<operations>
<!-- Continue if A Dog Said... exists -->
<li Class="ModCheck.isModLoaded">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<customMessageSuccess>Monster Mash :: A Dog Said... found: Generating cephalopod prosthetics...</customMessageSuccess>
</li>

<!-- quick check to see if it's the right mod to patch -->
<li Class="ModCheck.FindFile">
<modName>A Dog Said...</modName>
</li>

<li Class="ModCheck.loadOrder">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<errorOnFail>true</errorOnFail>
</li>

<!-- ====== Hediffs_AnimalBodyParts ====== -->

<li Class="PatchOperationAttributeRemove">
<xpath>*/HediffDef[defName = "ADSP_SimpleProstheticTentacleAnimal"]</xpath>
<attribute>Abstract</attribute>
</li>
<li Class="ModCheck.isModLoaded">
<modName>A Dog Said...</modName>
<yourMod>MonsterMash</yourMod>
<customMessageSuccess>Monster Mash :: TESTING MARKER</customMessageSuccess>
</li>
<li Class="PatchOperationAttributeSet">
<xpath>*/HediffDef[defName = "ADSP_SimpleProstheticTentacleAnimal"]</xpath>
<attribute>ParentName</attribute>
<value>addedPartAnimal</value>
</li>
<li Class="PatchOperationAdd">
<xpath>*/HediffDef[defName = "ADSP_SimpleProstheticTentacleAnimal"]/defName</xpath>
<value>
<label>simple prosthetic animal tentacle</label>
<defaultLabelColor>(233,129,69)</defaultLabelColor>
<comps>
<li Class="HediffCompProperties_VerbGiver">
<verbs>
<li>
<verbClass>Verb_MeleeAttack</verbClass>
<defaultCooldownTime>1.8</defaultCooldownTime>
<meleeDamageBaseAmount>6</meleeDamageBaseAmount>
<meleeDamageDef>Blunt</meleeDamageDef>
</li>
</verbs>
</li>
</comps>
<spawnThingOnRemoved>ADSP_SimpleProstheticTentacleAnimal</spawnThingOnRemoved>
<addedPartProps>
<partEfficiency>0.8</partEfficiency>
<isSolid>false</isSolid>
</addedPartProps>
</value>
</li>

<li Class="PatchOperationAttributeSet">
<xpath>*/HediffDef[@Name = "ADSP_BionicTentacleAnimal"]</xpath>
<attribute>Abstract</attribute>
<value>False</value>
</li>
<li Class="PatchOperationAttributeSet">
<xpath>*/HediffDef[defName = "ADSP_BionicTentacleAnimal"]</xpath>
<attribute>ParentName</attribute>
<value>addedPartAnimal</value>
</li>
<li Class="PatchOperationAdd">
<xpath>*/HediffDef[defName = "ADSP_BionicTentacleAnimal"]</xpath>
<value>
<label>bionic animal tentacle</label>
<defaultLabelColor>(233,129,69)</defaultLabelColor>
<comps>
<li Class="HediffCompProperties_VerbGiver">
<verbs>
<li>
<verbClass>Verb_MeleeAttack</verbClass>
<defaultCooldownTime>1.4</defaultCooldownTime>
<meleeDamageBaseAmount>13</meleeDamageBaseAmount>
<meleeDamageDef>Blunt</meleeDamageDef>
</li>
</verbs>
</li>
</comps>
<spawnThingOnRemoved>ADSP_BionicTentacleAnimal</spawnThingOnRemoved>
<addedPartProps>
<partEfficiency>1</partEfficiency>
<isSolid>false</isSolid>
</addedPartProps>
<stages>
<li>
<capMods>
<li>
<capacity>Moving</capacity>
<offset>0.1</offset>
</li>
<li>
<capacity>Manipulation</capacity>
<offset>0.1</offset>
</li>
</capMods>
</li>
</stages>
</value>
</li>

<li Class="PatchOperationAttributeSet">
<xpath>*/HediffDef[@Name = "ADSP_BionicAnimalGill"]</xpath>
<attribute>Abstract</attribute>
<value>False</value>
</li>
<li Class="PatchOperationAttributeSet">
<xpath>*/HediffDef[deffName = "ADSP_BionicAnimalGill"]</xpath>
<attribute>ParentName</attribute>
<value>addedPartAnimal</value>
</li>
<li Class="PatchOperationAdd">
<xpath>*/HediffDef[@Name = "ADSP_BionicAnimalGill"]</xpath>
<value>
<label>bionic animal gill</label>
<spawnThingOnRemoved>ADSP_BionicAnimalGill</spawnThingOnRemoved>
<addedPartProps>
<partEfficiency>1</partEfficiency>
<isSolid>true</isSolid>
</addedPartProps>
<stages>
<li>
<capMods>
<li>
<capacity>Breathing</capacity>
<offset>0.15</offset>
</li>
<li>
<capacity>Moving</capacity>
<offset>0.1</offset>
</li>
</capMods>
</li>
</stages>
</value>
</li>


The additional ModCheck.isModLoaded is currently acting as a check to see if the PatchOperationSequence is sucessfully reaching that point, which it does not.

I have tried dozens of variations, I have checked the xpath using online xpath checkers, I have read and re-read the Patching turtorial (https://gist.github.com/Zhentar/4a1b71cea45b9337f70b30a21d868782), but nothing seems to work.

I can tell you for a fact that it correctly recognizes the PatchOperationAttributeRemove right at the top, but it will not successfully complete the operation and display the Testing Marker.

<li Class="PatchOperationAttributeRemove">
<xpath>*/HediffDef[defName = "ADSP_SimpleProstheticTentacleAnimal"]</xpath>
<attribute>Abstract</attribute>
</li>


I have tried using PatchOperationAttributeSet and setting <value>False</value>
I have tried using PatchOperationAttributeRemove for Abstract
I have even tried using PatchOperationSet by adding @Attribute to the end of the xpath (this is the correct xpath for an attribute).

Then I went through and commented out that command and tried the two under it, but neither of those worked either.

I could desperately use some help from someone very knowledgeable.
Please, if that's not you, but you know someone who is, direct them to me. If you know a better place for this plea, please quote me there.

I am utterly out of ideas.
Thank you all very much.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: wwWraith on February 04, 2018, 03:41:09 PM
As your sequence doesn't go to the second ModCheck.isModLoaded check, apparently the problem is higher. I guess it's ModCheck.FindFile fails silently. I haven't read a full documentation on it, but quick look makes me think that at least it needs a second parameter <file>: https://ludeon.com/forums/index.php?topic=36534.msg394463#msg394463 (https://ludeon.com/forums/index.php?topic=36534.msg394463#msg394463). And probably you even want only one of isModLoaded or FindFile, not both of them.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 04, 2018, 04:17:10 PM
The FindFile is in there in the other section of the Patch, I split it into two sections for ease of management, and that section works perfectly.
It's also copied from an A Dog Said patch from another mod, and that mod's patch also works perfectly.

I have tried it both with and without, but to no avail.
I'll remove it either way (again), just to avoid any other confusion or issues relating to it.

EDIT: It does indeed look like it was interfering in some way, although I now have to find all of the other bugs and errors.
Also, I was trying to remove the abstract attribute first, which immediately triggered an error for being an incomplete Def. I have shunted that step to the end of patch for that specific HediffDef and am continuing to test.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 04, 2018, 04:27:50 PM
The step that is failing is the PatchOperationAttributeRemove for Abstract.

I just tried the standard remove and set to set it to false, but neither succeeded. The tutorial I was following doesn't give an example for it, so I may have a syntax error there too.

<li Class="PatchOperationAttributeRemove">
<xpath>*/HediffDef[defName = "ADSP_SimpleProstheticTentacleAnimal"]</xpath>
<attribute>Abstract</attribute>
</li>


<li Class="PatchOperationAttributeSet">
<xpath>*/HediffDef[defName = "ADSP_SimpleProstheticTentacleAnimal"]</xpath>
<attribute>Abstract</attribute>
<value>False</value>
</li>
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 04, 2018, 05:07:08 PM
Further research suggest that the game handles Defs with Abstract="True" in a very specific way.

Th files are read and imported into children, but the Def that held the Abstract="True" Attribute is marked to be discarded at the end of the document. As such, even if you could successfully remove the Abstract="True" Attribute, the Def has already been disregarded, and it won't appear in the final game.

In other words, it is not possible to create unused, blank defs as abstracts and then change their type with patching to implement them only under certain conditions.
While it sounds like it would be an extremely useful feature for more elaborate patches, such as this one, it simply isn't possible within the RimWorld framework.

Unless you, or someone else, is able to provide an alternative means to either force the game to load the no-longer-abstract or an alternative means to create undefined Defs (an oxymoron, I know), I will have to create a separate A Dog Said Patch Mod to add any additional synthetic bodyparts, organs, recipes etc.

Thank you for your help.
I'll get to sorting this mess out over the next few days. Unfortunately, however much I would like to put it out now, it will most likely take days due to other time commitments.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: wwWraith on February 04, 2018, 09:48:49 PM
In theory, I think it's possible to create those defs as non-abstract but mostly empty and with some means to be sure they won't actually appear in the vanilla game (something like <commonality>0</commonality>? I don't know what is supported here), and then delete these means by a patch if A Dog Said is detected together with adding what other tags you need... but most probably it won't worth the efforts and could be the source of more issues in the future.

Also I hope you've already found it (it looks like just testing attempts left), but just in the case:

instead of
<li Class="PatchOperationAdd">
<xpath>*/HediffDef[defName = "ADSP_SimpleProstheticTentacleAnimal"]/defName</xpath>
<value>
<!-- [...] -->

it should be either
<li Class="PatchOperationAdd">
<xpath>*/HediffDef[defName = "ADSP_SimpleProstheticTentacleAnimal"]</xpath>
<value>
<!-- [...] -->

or
<li Class="PatchOperationInsert">
<xpath>*/HediffDef[defName = "ADSP_SimpleProstheticTentacleAnimal"]/defName</xpath>
<value>
<!-- [...] -->



and
<li Class="PatchOperationAdd">
<xpath>*/HediffDef[@Name = "ADSP_BionicAnimalGill"]</xpath>
<value>
<!-- [...] -->

should be
<li Class="PatchOperationAdd">
<xpath>*/HediffDef[defName = "ADSP_BionicAnimalGill"]</xpath>
<value>
<!-- [...] -->
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 05, 2018, 03:43:50 AM
QuoteAlso I hope you've already found it (it looks like just testing attempts left), but just in the case:

You, dear (gender specific title), are a genius!

I hadn't noticed, and apparently nor did you, but upon further checking I found that the command to turn off Abstract was also incorrectly using @Name instead of defName.
I changed it and the HediffDefs immediately showed up in game, fully functional.

It is possible after all!

[attachment deleted due to age]
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: Harry_Dicks on February 05, 2018, 04:18:56 AM
Awesome!
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 05, 2018, 06:11:32 AM
I was reading some information that suggested that the FindFile operation improved xpath performance by pre-directing the patch to the file, however, as far as I can tell, all it does is perform a check that can be used to prevent a PatchOperationSequence from running if the file is missing.

Am or I correct, or does it improve performance in some other way?

Is there any real danger associated with not using it at all?

The reason I ask, is that some of my identical FindFile Operations are silently failing, thus blocking the patching process.

EDIT: Further Question:
The error currently seems to crop up with any referance to the Monster Mash file "Items_BodyPart.xml". This seems to include any reference to Defs defined by that file.

I am well aware that the file name and location is identical to that of the Core version and pretty much any other mod. As far as I know, it also shouldn't matter at all.
Am I correct?

Also, A Dog Said... use Items_AnimalBodyParts.xml instead of Core's Items_BodyParts.xml.
Does my use of a different file name to A Dog Said... matter?

ModCheck.FindFile asks which mod to look inside of, and the xpathing uses the defName, so the file name being duplicate in several mods should be irrelevant.

So far, the intro to the section works perfectly:
<!-- ===================================== -->
<!-- ========== Custom Prostheses ======== -->
<!-- ===================================== -->

<Operation Class="PatchOperationSequence">
<success>Always</success>
<operations>
<!-- Continue if A Dog Said... exists -->
<li Class="ModCheck.isModLoaded">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<customMessageSuccess>Monster Mash :: A Dog Said... found: Generating cephalopod prosthetics...</customMessageSuccess>
</li>

<li Class="ModCheck.loadOrder">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<errorOnFail>true</errorOnFail>
</li>


The changes to the Hediffs_AnimalBodyParts.xml also work perfectly:
The cross-references that are commented out must be added back in afterwords because the items don't technically exist until further down the PathOperationSequence.
<!-- ====== Hediffs_AnimalBodyParts ====== -->

<li Class="PatchOperationAttributeSet">
<xpath>Defs/HediffDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal"]</xpath>
<attribute>ParentName</attribute>
<value>addedPartAnimal</value>
</li>
<li Class="PatchOperationAdd">
<xpath>Defs/HediffDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal"]</xpath>
<value>
<label>simple prosthetic animal tentacle</label>
<defaultLabelColor>(233,129,69)</defaultLabelColor>
<!--<spawnThingOnRemoved>MonsterMash_ADSP_SimpleProstheticTentacleAnimal</spawnThingOnRemoved>-->
<addedPartProps>
<partEfficiency>0.8</partEfficiency>
<isSolid>false</isSolid>
</addedPartProps>
<comps>
<li Class="HediffCompProperties_VerbGiver">
<verbs>
<li>
<verbClass>Verb_MeleeAttack</verbClass>
<defaultCooldownTime>1.8</defaultCooldownTime>
<meleeDamageBaseAmount>6</meleeDamageBaseAmount>
<meleeDamageDef>Blunt</meleeDamageDef>
</li>
</verbs>
</li>
</comps>
</value>
</li>
<li Class="PatchOperationAttributeRemove">
<xpath>Defs/HediffDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal"]</xpath>
<attribute>Abstract</attribute>
</li>

<li Class="PatchOperationAttributeSet">
<xpath>Defs/HediffDef[defName = "MonsterMash_ADSP_BionicTentacleAnimal"]</xpath>
<attribute>ParentName</attribute>
<value>addedPartAnimal</value>
</li>
<li Class="PatchOperationAdd">
<xpath>Defs/HediffDef[defName = "MonsterMash_ADSP_BionicTentacleAnimal"]</xpath>
<value>
<label>bionic animal tentacle</label>
<defaultLabelColor>(233,129,69)</defaultLabelColor>
<!--<spawnThingOnRemoved>MonsterMash_ADSP_BionicTentacleAnimal</spawnThingOnRemoved>-->
<addedPartProps>
<partEfficiency>1</partEfficiency>
<isSolid>false</isSolid>
</addedPartProps>
<comps>
<li Class="HediffCompProperties_VerbGiver">
<verbs>
<li>
<verbClass>Verb_MeleeAttack</verbClass>
<defaultCooldownTime>1.4</defaultCooldownTime>
<meleeDamageBaseAmount>13</meleeDamageBaseAmount>
<meleeDamageDef>Blunt</meleeDamageDef>
</li>
</verbs>
</li>
</comps>
<stages>
<li>
<capMods>
<li>
<capacity>Moving</capacity>
<offset>0.1</offset>
</li>
<li>
<capacity>Manipulation</capacity>
<offset>0.1</offset>
</li>
</capMods>
</li>
</stages>
</value>
</li>
<li Class="PatchOperationAttributeRemove">
<xpath>Defs/HediffDef[defName = "MonsterMash_ADSP_BionicTentacleAnimal"]</xpath>
<attribute>Abstract</attribute>
</li>

<li Class="PatchOperationAttributeSet">
<xpath>Defs/HediffDef[defName = "MonsterMash_ADSP_BionicAnimalGill"]</xpath>
<attribute>ParentName</attribute>
<value>addedPartAnimal</value>
</li>
<li Class="PatchOperationAdd">
<xpath>Defs/HediffDef[defName = "MonsterMash_ADSP_BionicAnimalGill"]</xpath>
<value>
<label>bionic animal gill</label>
<!--<spawnThingOnRemoved>MonsterMash_ADSP_BionicAnimalGill</spawnThingOnRemoved>-->
<addedPartProps>
<partEfficiency>1</partEfficiency>
<isSolid>true</isSolid>
</addedPartProps>
<stages>
<li>
<capMods>
<li>
<capacity>Breathing</capacity>
<offset>0.15</offset>
</li>
<li>
<capacity>Moving</capacity>
<offset>0.1</offset>
</li>
</capMods>
</li>
</stages>
</value>
</li>
<li Class="PatchOperationAttributeRemove">
<xpath>Defs/HediffDef[defName = "MonsterMash_ADSP_BionicAnimalGill"]</xpath>
<attribute>Abstract</attribute>
</li>

<li Class="ModCheck.isModLoaded">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<customMessageSuccess>Monster Mash :: Enabling cephalopod prosthetics: HediffDefs defined...</customMessageSuccess>
</li>


And then the next section, Items_BodyParts.xml, doesn't seem to work at all, even when the ModCheck.FindFile is disabled:
Testing Marker A is reached and run successfully if the ModCheck.FindFile is disabled.
<!-- ========== Items_BodyParts ========== -->

<li Class="ModCheck.FindFile">
<modName>Monster Mash</modName>
<file>Items_BodyParts.xml</file>
</li>
<li Class="ModCheck.isModLoaded">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<customMessageSuccess>Monster Mash :: Testing Marker A</customMessageSuccess>
</li>

<li Class="PatchOperationAttributeAdd">
<xpath>Defs/ThingDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal"]</xpath>
<attribute>ParentName</attribute>
<value>BodyPartAnimalArtificialBase</value>
</li>
<li Class="PatchOperationAdd">
<xpath>Defs/ThingDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal"]</xpath>
<value>
<label>simple prosthetic animal tentacle</label>
<description>Simple prosthetic animal tentacle. Fits all animals.</description>
<graphicData>
  <texPath>Things/Item/BodyPart/AnimalBodyPart</texPath>
  <graphicClass>Graphic_Single</graphicClass>
</graphicData>
<techHediffsTags>
<li>Simple</li>
</techHediffsTags>
<statBases>
  <MarketValue>100</MarketValue>
  <Mass>5</Mass>
</statBases>
</value>
</li>
<li Class="ModCheck.isModLoaded">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<customMessageSuccess>Monster Mash :: Testing Marker B</customMessageSuccess>
</li>
<li Class="PatchOperationAttributeRemove">
<xpath>Defs/ThingDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal"]</xpath>
<attribute>Abstract</attribute>
</li>

<li Class="ModCheck.isModLoaded">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<customMessageSuccess>Monster Mash :: Testing Marker C</customMessageSuccess>
</li>

<li Class="PatchOperationAttributeAdd">
<xpath>Defs/ThingDef[defName = "MonsterMash_ADSP_BionicTentacleAnimal"]</xpath>
<attribute>ParentName</attribute>
<value>BodyPartAnimalArtificialBase</value>
</li>
<li Class="PatchOperationReplace">
<xpath>Defs/ThingDef[defName = "MonsterMash_ADSP_BionicTentacleAnimal"]</xpath>
<value>
<label>bionic animal tentacle</label>
<description>Improved bionic animal tentacle. Fits all animals.</description>
<graphicData>
  <texPath>Things/Item/BodyPart/AnimalBodyPart</texPath>
  <graphicClass>Graphic_Single</graphicClass>
</graphicData>
<techHediffsTags>
<li>Advanced</li>
</techHediffsTags>
<statBases>
  <MarketValue>750</MarketValue>
  <Mass>8</Mass>
</statBases>
</value>
</li>
<li Class="PatchOperationAttributeRemove">
<xpath>Defs/ThingDef[defName = "MonsterMash_ADSP_BionicTentacleAnimal"]</xpath>
<attribute>Abstract</attribute>
</li>

<li Class="PatchOperationAttributeSet">
<xpath>Defs/ThingDef[defName = "MonsterMash_ADSP_BionicAnimalGill"]</xpath>
<attribute>ParentName</attribute>
<value>BodyPartAnimalArtificialBase</value>
</li>
<li Class="PatchOperationAdd">
<xpath>Defs/ThingDef[defName = "MonsterMash_ADSP_BionicAnimalGill"]</xpath>
<value>
<label>bionic animal gill</label>
<description>Improved bionic gill for animals. Fits all animals.</description>
<graphicData>
  <texPath>Things/Item/BodyPart/AnimalBodyPart</texPath>
  <graphicClass>Graphic_Single</graphicClass>
</graphicData>
<techHediffsTags>
<li>Advanced</li>
</techHediffsTags>
<statBases>
  <MarketValue>750</MarketValue>
  <Mass>1</Mass>
</statBases>
</value>
</li>
<li Class="PatchOperationAttributeRemove">
<xpath>Defs/ThingDef[defName = "MonsterMash_ADSP_BionicAnimalGill"]</xpath>
<attribute>Abstract</attribute>
</li>

<li Class="ModCheck.isModLoaded">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<customMessageSuccess>Monster Mash :: Enabling cephalopod prosthetics: Item body part ThingDefs defined...</customMessageSuccess>
</li>


I'm fairly sure that there will be further cross-references in there that I haven't commented out yet, but it's not even getting so far as to give me those errors.

Thanks again for your help.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: wwWraith on February 05, 2018, 07:16:11 AM
Do you have defs for ThingDef/MonsterMash_ADSP_SimpleProstheticTentacleAnimal besides HediffDef/MonsterMash_ADSP_SimpleProstheticTentacleAnimal?
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 05, 2018, 07:20:41 AM
I have the HediffDef named that and the ThingDeff named that.

I also just did a file-search to check if there were any others by mistake, and there are not.

EDIT: Even if I had multiple ThingDefs with the same name, that doesn't explain the ModCheck.FindFile not working.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: wwWraith on February 05, 2018, 07:27:52 AM
About FindFile, I'd say, if you aren't sure why to use it and how to use it, then you'd better not to use it ;)

Can you upload all the files as they are now? I'd like to see it in the whole.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 05, 2018, 07:31:48 AM
By "Upload all the files", do you mean just the ones required for the patching operation or the whole mod?

I'm assuming the latter and will be pasting a download link in here shortly.
Also, I'll have to go in half and an hour and won't have much time for this until tomorrow.

Oh, and I have added you to the Special Thanks Section for your on-going support.

EDIT: Here's the download link. (https://www.dropbox.com/s/yf9omawtbz8cq11/MonsterMash%20%28WIP%29.zip?dl=0)
You'll need to remove the "(WIP)" from the folder name when you unzip it.

EDIT 2: I have been working my way through the A DogSaid Patch file from top to bottom, so there are various errors and incomplete-updates in everything after the Items_BodyParts section.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: wwWraith on February 05, 2018, 10:48:19 AM
My first attempts to figure the things out led to contradictory results. I'm going to look into it deeper though probably there is something hiding just behind my eyes.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 05, 2018, 11:51:41 AM
Good luck.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: wwWraith on February 05, 2018, 05:57:33 PM
Some things that could be helpful (though I'm not completely sure):

1. Looks like using ModCheck.isModLoaded as testing markers is not very reliable. I saw these markers intermixed from different sequences, probably these checks are executed in different threads due to optimization.

2. You may want to use <success>Normal</success> instead of <success>Always</success>, this way you'll get error messages is something fails in the sequences.

3. But the error message I've got was unexpected: "[Monster Mash] Patch operation Verse.PatchOperationSequence(count=55, lastFailedOperation=Verse.PatchOperationAttributeSet(Defs/HediffDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal"])(ParentName)) failed". Though this opration worked perfectly if left alone.

4. After some tests I decided that its cause is that the sequence shouldn't contain different defs groups, or maybe it even works per file. So I tried to create separate sequences for HediffDef / ThingDef / RecipeDef. It seemed helpful when I added them 1 by 1 in the empty test file but something become broke again when I tried to apply this method to the whole original file. So I'm still very unsure about it but probably the truth is somewhere nearby.

5. You should be very careful with your recipes as some of them use targeting by defName while other by @Name.

6. And I've commented all ModCheck.FindFile instances so they won't interfere whatever they are.

Edit: 7. When I continued the experiments with commenting the partial sequences, at one stage my screen turned whole black a few seconds after restarting RimWorld (before even the main menu appeared) :o So be careful not to comment </Operation> when you want to comment only <li> [...] </li>  ;D
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 06, 2018, 04:54:20 AM
I suppose it's time to resume my own experimentation.

QuoteYou should be very careful with your recipes as some of them use targeting by defName while other by @Name.
I recently changed all of the @Names from the defs to defNames, excluding the three surgery Bases. At the time I sent it to you, I hadn't gone through and changed them all over yet in ADogSaidPatch.xml
Be careful with changing them back though, as three of them (MonsterMash_ADSP_TentacleBaseAnimal, MonsterMash_ADSP_SimpleTentacleBaseAnimal and BionicTentacleBaseAnimal) are supposed to be using @NAme, not defName.

QuoteLooks like using ModCheck.isModLoaded as testing markers is not very reliable. I saw these markers intermixed from different sequences, probably these checks are executed in different threads due to optimization.

EDIT: Yeah. I see that two of the message for my own patches are displayed out of order. The RangedAnimalFramework message cuts in-between the two cephalopod messages. Very odd.
Side Note: None of my spellcheckers, not in Notepad++, not in Chrome, seem to recognize cephalopod. I wouldn't have expected that...

Quote4.
At what point did it break?

Quote:o So be careful not to comment </Operation> when you want to comment only <li> [...] </li>  ;D
Must say that I actually expected some sort of hanging issue if the file didn't have the closing sequence.

EDIT:
Quote3. But the error message I've got was unexpected: "[Monster Mash] Patch operation Verse.PatchOperationSequence(count=55, lastFailedOperation=Verse.PatchOperationAttributeSet(Defs/HediffDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal"])(ParentName)) failed". Though this opration worked perfectly if left alone.
I read something about this the other. It was saying that you need the Parent to be in the same mod as the thing that is using it or you'll get errors, and that the solution is to copy the parent abstracts across.

I have the A Dog Said... compatibility mod the Animal Collab Project. I'll go check how they set it up more precisely, since I may simply be missing something I need.

EDIT 2: The reason why the @ParentName isn't working seems to be because ParentName isn't a true attribute. Rather it seems to be part of the XMLInheritance system, so PatchOperationAttributeSet isn't actually targeting the correct thing.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 06, 2018, 06:01:00 AM
Quote from: ilikegoodfood on February 06, 2018, 04:54:20 AM
Quote3. But the error message I've got was unexpected: "[Monster Mash] Patch operation Verse.PatchOperationSequence(count=55, lastFailedOperation=Verse.PatchOperationAttributeSet(Defs/HediffDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal"])(ParentName)) failed". Though this opration worked perfectly if left alone.
I read something about this the other. It was saying that you need the Parent to be in the same mod as the thing that is using it or you'll get errors, and that the solution is to copy the parent abstracts across.

I have the A Dog Said... compatibility mod the Animal Collab Project. I'll go check how they set it up more precisely, since I may simply be missing something I need.

Well, this seems to confirm my suspicion, although what they've done is super simple, just a duplicate of the various A Dog Said surgeries. They do, however, have all of the required parents copied into their own patch. I'm working on that now.

EDIT:
Also, I think the reason why all of the patches use the <success>Always</success> is because the errors that the Patch sequence claims are happening, aren't actually stopping it from working.
I just got an error saying that the PatchOperationAdd for the MonsterMash_ADSP_SimpleProstheticTentacleAnimal failed, yet the Hediff is available in game, none-abstract and with all components working.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: wwWraith on February 06, 2018, 07:41:04 AM
Quote from: ilikegoodfood on February 06, 2018, 04:54:20 AM
EDIT:
Quote3. But the error message I've got was unexpected: "[Monster Mash] Patch operation Verse.PatchOperationSequence(count=55, lastFailedOperation=Verse.PatchOperationAttributeSet(Defs/HediffDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal"])(ParentName)) failed". Though this opration worked perfectly if left alone.
I read something about this the other. It was saying that you need the Parent to be in the same mod as the thing that is using it or you'll get errors, and that the solution is to copy the parent abstracts across.

I have the A Dog Said... compatibility mod the Animal Collab Project. I'll go check how they set it up more precisely, since I may simply be missing something I need.

EDIT 2: The reason why the @ParentName isn't working seems to be because ParentName isn't a true attribute. Rather it seems to be part of the XMLInheritance system, so PatchOperationAttributeSet isn't actually targeting the correct thing.

I'm really not recommend you to copy bases either from Core or from other mods. It can lead to hard-to-track issues in the future. And as the sequence worked fine if left alone, I'm pretty sure this is not the cause. Moreover, I used this way of changing ParentName in some of my patches and it worked fine, too.

I think that the whole patching system is not 100% complete atm and still has some undiscovered issues. Probably the one of them is that in such (unknown exactly) circumstances its error message points to the first PatchOperation in the sequence rather than the one that actually failed. It can be confirmed by changing the order of operations inside the sequence. So I think that we should get rid of any errors even if we can't trust their messages and even if it looks working ingame (otherwise these errors can bite somewhere later).

I'm going to try to divide this patch into several separate files each containing only 1 sequence.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 06, 2018, 08:13:17 AM
What I have discovered over my examinations is that all of the A Dog Said... compatibility mods used copied versions of the Base definitions from A Dog Said...
Furthermore, I have found that changing the way that I define the abstracts and patch them afterwords works.

I am currently overhauling the entire system to match, nearly finished, and everything works so far, both in Vanilla and in A Dog Said...

Once I have everything working, I will try and modify it to use the A Dog Said Bases directly. If that works I will re-define that system, but if it doesn't I will know why.

EDIT: I've also decreased the patching loading time by a perceptible amount by applying additional optimizations.

EDIT 2:
The fragments of information that you have provided and the tests that you did have been invaluable in this process. There is no way on earth that I would have managed to do what I am doing now without your insights and help.

Thank you wwWraith.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: wwWraith on February 06, 2018, 08:40:31 AM
Quote from: ilikegoodfood on February 06, 2018, 08:13:17 AM
What I have discovered over my examinations is that all of the A Dog Said... compatibility mods used copied versions of the Base definitions from A Dog Said...

Some alphas ago it was necessary to copy bases defs. It was changed in A16 or so, but many people don't bother to change their habits. And other people looking on their mods repeat it. But it's a bad practice and actually leads to problems.

My results still are contradictory. I made a separate files:

There are cross-referanece errors that I don't look on yet, but the "main" errors like "[Monster Mash] Patch operation Verse.PatchOperationSequence(count=11, lastFailedOperation=Verse.PatchOperationAttributeAdd(/Defs/ThingDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal"])(ParentName)) failed" occurs only in 4th, 5th and 7th files. And I'll repeat it, in 3rd file there is

<li Class="PatchOperationAttributeSet">
<xpath>/Defs/HediffDef[defName = "MonsterMash_ADSP_BionicAnimalGill"]</xpath>
<attribute>ParentName</attribute>
<value>addedPartAnimal</value>
</li>
which works fine.

The other suspicion that I have is that playing with abstract Hediffs have less "internal obstacles" than with the other def types, but I don't want to believe it.

I'm attaching these files so you can make your own conclusions.

[attachment deleted due to age]
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 06, 2018, 08:57:41 AM
QuoteThere are cross-referanece errors that I don't look on yet

That is because of the order that the Patch operations are done.
Until the defs are patched, they don't properly exist and therefore the cross-references fail.
To solve that, you need to remove the cross-references from the defs and patch them in LAST. The only way that I can find to control the order of patches is within the save file. Different files appear to be patched concurrently, which is why we see the odd custom message order.

Also, you were right that each PathOperationSequence should only contain one type of patch operation. This can easily be done by putting them in sub-sequences.
The xml file's primary PathOperationSequence then becomes a sequence of PathOperationSequence s, and everything works.

I am re-uploading the Monster Mash (WIP).zip (https://www.dropbox.com/s/iozrpelukf8c676/MonsterMash%20%28WIP%29.zip?dl=0) now, so that you can see what I have changed, which is pretty much everything.
Since I have changed the very last section, I am now getting errors in the error log, but that seems to be a specific issue with one of the operations.

Once I solve this last bug, I will attempt to remove the duplicate bases, as per your recommendation, but for now, I have everything except for the very last few bits working.

EDIT: There's a bug with the Devilstrand referance as well in Recipes_AnimalParts.xml
They should instead read DevilstrandCloth. I have fixed it my end but not yet in the upload.

Also, there is an issue with the Textiles filter, but I'll look into that shortly.

EDIT 2: I think I know where the final errors are and how to fix them, but have to stop for lunch. Just give me some time and I will send you what I have either when it fails and is beyond my knowledge, or when it works.
Since I'm making very regular edits, your files that I just sent you are already several bug-fixes old.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: wwWraith on February 06, 2018, 09:36:54 AM
You know, this whole thing about "dynamically/conditionally created" defs by playing with their Abstractness was considered just impossible by most (if not all) modders. So it's undiscovered territory and if you'll manage to complete it successfully, it'll be very valuable theoretical result that could introduce new modding technics. That's the other reason to make the final version clear and error-free so other people could use it as an example.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 06, 2018, 09:43:50 AM
Quote from: wwWraith on February 06, 2018, 09:36:54 AM
You know, this whole thing about "dynamically/conditionally created" defs by playing with their Abstractness was considered just impossible by most (if not all) modders. So it's undiscovered territory and if you'll manage to complete it successfully, it'll be very valuable theoretical result that could introduce new modding technics. That's the other reason to make the final version clear and error-free so other people could use it as an example.

I am entirely aware of that.

I realized that, if the Abstract tag could be manipulated freely, the xpath patches provide all of the required tools needed to do it, provided they work consistently and as expected, so I set about trying to solve the problem.
No points for guessing that I took Chemistry, Engineering, Mathematics and Physics for my A-Levels.

I'm also well aware that most people have been running update scripts on their mod-files without wanting to spend the time and effort to examine the possibility of new possibilities.
Since I don't have previous version to update from, spending the extra time now to achieve the impossible simply makes sense to me.

EDIT: I finally found the specific bug I was looking for. I had written "Path" instead of "Patch" [Facepalm]

So, only one small error left.
In this recipe, it uses any textile, but there is a cross referencing issue with it, probably the fixedIngrediantFilter. Do you know what should go in there instead?

Almost got it. Just need to set the correct name for devilstrand now.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 06, 2018, 10:07:06 AM
And here is the new Monster Mash (WIP).zip (https://www.dropbox.com/s/ypkyyi69gzyltp9/MonsterMash%20%28WIP%29.zip?dl=0)!

I haven't run detailed tests on it in game yet, but there are no errors on loading it with A Dog Said... installed and without it.

It is still using copied over versions of the A Dog Said... base definitions. That is the next step, which, because I need to patch-out many cross-references in order to prevent loading errors, both from the defs being none-existent in Vanilla, and from patching operation order when the patch is processing, may be rather more complex than you think. I need to take a half-hour break.

Enjoy!

EDIT: The probable solution would be to use patching to copy them over automatically, a several step operation, remove the cross references from the auto-copied versions, perform all of the other patches and then add them back in, much as I have done now.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 06, 2018, 12:11:57 PM
In-game testing has revealed three errors.

One of them has been fixed. I had accidentally assigned all three HediffDefs to output the same prosthetic organ. I'll post the correction at the end of the document for you...

The other two are slightly more interesting:
The following PatchOperationAdd and the ModCheck.isModLoaded after it are both failing silently:
<li Class="PatchOperationAdd">
<xpath>Defs/RecipeDef[@Name = "MonsterMash_ADSP_ProstheticAnimalCraftBase" or @Name = "MonsterMash_ADSP_BionicAnimalCraftBase"]</xpath>
<value>
<unfinishedThingDef>MonsterMash_ADSP_UnfinishedAnimalPart</unfinishedThingDef>
<recipeUsers>
<li>TableAnimalProsthetics</li>
</recipeUsers>
</value>
</li>

<li Class="ModCheck.isModLoaded">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<customMessageSuccess>Monster Mash :: Cephalopod prosthetics completed.</customMessageSuccess>
</li>


Also, the InstallSimpleProstheticTentacleAnimal and InstallBionicTentacleAnimal aren't showing up on the LandKraken's health tab even when the colonists have the items available. - FIXED

I'm investigating them both.

And here is the correction I mentioned above (paste it over the corresponding section):
<!-- ===== Implementing out-of-order Cross References ===== -->

<li Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAdd">
<xpath>Defs/HediffDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal"]</xpath>
<value>
<spawnThingOnRemoved>MonsterMash_ADSP_SimpleProstheticTentacleAnimal</spawnThingOnRemoved>
</value>
</li>

<li Class="PatchOperationAdd">
<xpath>Defs/HediffDef[defName = "MonsterMash_ADSP_BionicTentacleAnimal"]</xpath>
<value>
<spawnThingOnRemoved>MonsterMash_ADSP_BionicTentacleAnimal</spawnThingOnRemoved>
</value>
</li>

<li Class="PatchOperationAdd">
<xpath>Defs/HediffDef[defName = "MonsterMash_ADSP_BionicAnimalGill"]</xpath>
<value>
<spawnThingOnRemoved>MonsterMash_ADSP_BionicAnimalGill</spawnThingOnRemoved>
</value>
</li>

<li Class="PatchOperationAdd">
<xpath>Defs/RecipeDef[@Name = "MonsterMash_ADSP_ProstheticAnimalCraftBase" or @Name = "MonsterMash_ADSP_BionicAnimalCraftBase"]</xpath>
<value>
<unfinishedThingDef>MonsterMash_ADSP_UnfinishedAnimalPart</unfinishedThingDef>
<recipeUsers>
<li>TableAnimalProsthetics</li>
</recipeUsers>
</value>
</li>

<li Class="ModCheck.isModLoaded">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<customMessageSuccess>Monster Mash :: Cephalopod prosthetics completed.</customMessageSuccess>
</li>
</operations>
</li>
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: wwWraith on February 06, 2018, 12:31:45 PM
Ah, I see you haven't copied ADS base (addedPartAnimal) but created your own (MonsterMash_ADSP_addedPartAnimal). It's not that harmful, however I'd still prefer to get rid of it, if it's possible.

Changing <success>Always</success> to <success>Normal</success> still exposes errors:

[Monster Mash] Patch operation Verse.PatchOperationSequence(count=8, lastFailedOperation=Verse.PatchOperationSequence(count=2, lastFailedOperation=Verse.PatchOperationAttributeRemove(Defs/HediffDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal" or defName = "MonsterMash_ADSP_BionicTentacleAnimal" or defName = "MonsterMash_ADSP_BionicAnimalGill"])(Abstract))) failed
file: D:\Games\RimWorld\Mods\MMWIP2\Patches\ADogSaidExpansionPatch.xml

[Monster Mash] Patch operation Verse.PatchOperationSequence(count=27, lastFailedOperation=Verse.PatchOperationSequence(count=2, lastFailedOperation=ModCheck.FindFile)) failed
file: D:\Games\RimWorld\Mods\MMWIP2\Patches\ADogSaidPatch.xml
as it was, only 1 per file but we can't be sure what exactly causes it.

If I got it right, you may have to change

<categories>
<li>Textiles</li>
</categories>


to

<categories>
<li>Fabrics</li>
<li>Leathers</li>
</categories>

(or maybe Fabric and Leathery), but I still can't see your recipes ingame on Animal prosthetics table and can't spawn them via dev tools.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 06, 2018, 12:37:57 PM
Quote from: wwWraith on February 06, 2018, 12:31:45 PMIf I got it right, you may have to change

<categories>
<li>Textiles</li>
</categories>


to

<categories>
<li>Fabrics</li>
<li>Leathers</li>
</categories>

(or maybe Fabric and Leathery), but I still can't see your recipes ingame on Animal prosthetics table and can't spawn them via dev tools.

Oh dear, I fixed that one within seconds of asking and forgot to mark it as solved.
So far I am back down to only a single bug to fix before being able to experimenting with removing the copied parents.

Quote from: ilikegoodfood on February 06, 2018, 12:11:57 PMThe following PatchOperationAdd and the ModCheck.isModLoaded after it are both failing silently:
<li Class="PatchOperationAdd">
<xpath>Defs/RecipeDef[@Name = "MonsterMash_ADSP_ProstheticAnimalCraftBase" or @Name = "MonsterMash_ADSP_BionicAnimalCraftBase"]</xpath>
<value>
<unfinishedThingDef>MonsterMash_ADSP_UnfinishedAnimalPart</unfinishedThingDef>
<recipeUsers>
<li>TableAnimalProsthetics</li>
</recipeUsers>
</value>
</li>

<li Class="ModCheck.isModLoaded">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<customMessageSuccess>Monster Mash :: Cephalopod prosthetics completed.</customMessageSuccess>
</li>

EDIT:
FIXED: It doesn't cause an error when it is left in the definitions, so I don't need that PatchOperationAdd at all.

EDIT 3: Now on to inheritance tests.
I have disabled A Dog Said... and I will change things over to use the A Dog Said... bases and check to see if it throws up errors in Vanilla, one base at a time.
For each base that doesn't error when referenced without the mod being installed, I will then test it in the patch operation.
If it still doesn't error, then I'll remove my own version.

EDIT 4: Despite it being for an abstract, I immediately received "Could Not Find Parent Node named..." errors on all modified items.
I am now going to remove the ParentName entirely and attempt to add them via the ADogSaidExpansionPatch.xml instead.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: wwWraith on February 06, 2018, 12:57:20 PM
Quote from: ilikegoodfood on February 06, 2018, 12:37:57 PM
FIXED: It doesn't cause an error when it is left in the definitions, so I don't need that PatchOperationAdd at all.
I was just going to write it :) But there could be other way: still patching but using UnfinishedAnimalPart from ADS instead of MonsterMash_ADSP_UnfinishedAnimalPart which can be removed (it will be safe as UnfinishedAnimalPart won't be abstract anyway).
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 06, 2018, 12:59:34 PM
Quote from: wwWraith on February 06, 2018, 12:57:20 PM
Quote from: ilikegoodfood on February 06, 2018, 12:37:57 PM
FIXED: It doesn't cause an error when it is left in the definitions, so I don't need that PatchOperationAdd at all.
I was just going to write it :) But there could be other way: still patching but using UnfinishedAnimalPart from ADS instead of MonsterMash_ADSP_UnfinishedAnimalPart which can be removed (it will be safe as UnfinishedAnimalPart won't be abstract anyway).

The problem isn't that it won't work when A Dog Said is installed, but I need it to work even when A Dog Said ISN'T installed.
This means that I cannot directly reference anything in A Dog Said...

Testing is under way and will take some time.

EDIT: Removing the ParentName entirely from the HeddiffDefs and then re-adding them during the patch worked without error. I'm now going to be working my way through the rest of the files testing them one-by-one to see which bases I can reference directly and which ones, if any, I need to keep the duplicates of.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: wwWraith on February 06, 2018, 01:11:35 PM
Quote from: ilikegoodfood on February 06, 2018, 12:59:34 PM
Quote from: wwWraith on February 06, 2018, 12:57:20 PM
Quote from: ilikegoodfood on February 06, 2018, 12:37:57 PM
FIXED: It doesn't cause an error when it is left in the definitions, so I don't need that PatchOperationAdd at all.
I was just going to write it :) But there could be other way: still patching but using UnfinishedAnimalPart from ADS instead of MonsterMash_ADSP_UnfinishedAnimalPart which can be removed (it will be safe as UnfinishedAnimalPart won't be abstract anyway).

The problem isn't that it won't work when A Dog Said is installed, but I need it to work even when A Dog Said ISN'T installed.
This means that I cannot directly reference anything in A Dog Said...
But you'll do it in the patch sequence (as it was) so it'll be used only if ADS is loaded. If not, your MonsterMash_ADSP_ProstheticAnimalCraftBase and MonsterMash_ADSP_BionicAnimalCraftBase will just remain without <unfinishedThingDef> but it won't matter.


<li Class="PatchOperationAdd">
<xpath>Defs/RecipeDef[@Name = "MonsterMash_ADSP_ProstheticAnimalCraftBase" or @Name = "MonsterMash_ADSP_BionicAnimalCraftBase"]</xpath>
<value>
<unfinishedThingDef>UnfinishedAnimalPart</unfinishedThingDef>
<recipeUsers>
<li>TableAnimalProsthetics</li>
</recipeUsers>
</value>
</li>


But hopefully it all won't matter if you'll get rid of these bases entirely :)
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 06, 2018, 01:16:57 PM
I had accidental not enable my version of the Unfinished Animal Item. It was using A Dog Said...'s all along.
Also, that line of code that you are quoting at me didn't need to exist either. It's long gone.

I'm working my way through it and so far I haven't found a base that couldn't be swapped back to A Dog Said...'s version. I just have to spend a few minutes going through and vigorously testing them all as I go.

I'll let you know when I'm done.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 06, 2018, 01:25:43 PM
Okay, all duplicate bases have been removed and everything still works perfectly both with and without A Dog Said... installed.

I have updated Monster Mash (WIP).zip again and here is the new link (https://www.dropbox.com/s/00pomka4ue3qrcm/MonsterMash%20%28WIP%29.zip?dl=0).
Dropbox doesn't seem to like keeping a link when the file is over-written.

I need to add a Bionic Beak and Siphon and then it's ready for release as V1.1.1.

I should probably also add a MM_ suffix to everything to prevent compatibility issues, but I'm not sure it's worth the effort. What do you think?
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 06, 2018, 02:15:08 PM
For the information of others, and so that we can sort out formatting, wording etc. before publishing a guide for people.

How to Make an All-Inclusive Compatibility Patch
Create all of the definitions for the new items exactly as you normally would, assuming that the mod it aimed at is installed.
Make sure to set ALL definitions to Abstract, using Abstract = "True":
<ExampleDef Abstract="True">...</ExampleDef>

Create a Patch file with the usual PatchOperationSequence.
Make sure to include the ModCheck.isModLoaded and ModCheck.loadOrder tests.
<Patch>

<Operation Class="PatchOperationSequence">
<success>Always</success>
<operations>
<!-- Continue if A Dog Said... exists -->
<li Class="ModCheck.isModLoaded">
<modName>Example Target Mod</modName>
<yourMod>Example Mod</yourMod>
<customMessageSuccess>Example Mod :: Example Target Mod found...</customMessageSuccess>
</li>

<li Class="ModCheck.loadOrder">
<modName>Example Target Mod</modName>
<yourMod>Example Mod</yourMod>
<errorOnFail>true</errorOnFail>
</li>


Create two new PatchOperationSequence nested inside the primary PatchOperationSequence.
The 1st Sequence will contain the PatchOperationAttributeAdd commands.
<li Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAttributeAdd">
<xpath>Defs/ExampleDef[defName = "ExampleDef"]</xpath>
<attribute>ParentName</attribute>
<value>exampleParentDef</value>
</li>
</operations>
</li>


NOTE: If the Def that you created is intended to remain abstract, it should be named using the Name="ExampleDef" Attribute and you will need to replace the "[defName =" with "[@Name =". This tells the xpath to check the name attribute instead of the sub-node "defName".

If a Def has a parent that is contained in the Example Target Mod, remove the ParentName="exampleParentDef" attribute from the ExampleDef and set it to be added by the patch using the above method.
If the exampleParentDef is in Core or your own mod (Example Mod), it doesn't need to be removed.

Next, the second nested PatchOperationSequence is to remove the Abstract = "True" Attribute from the Example Def.
<li Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAttributeRemove">
<xpath>Defs/ExampleDef[defName = "ExampleDef"]</xpath>
<attribute>Abstract</attribute>
</li>
</operations>
</li>


Repeat this process of removing and patching the ParentName Attribute if the Parent is from the target mod (Example Target Mod) and removing the Abstract = "True" property.
Remember to be specific when removing this tag, since you may have your own baseDefs that should remain abstract even after patching.

Finally, certain cross-references will fail, flagging errors on load, due to the order in which they are converted from Abstract to not-Abstract.
For each instance of this error, remove the offending cross-reference from the Def in question and re-add it as part of the patch, creating a new PatchOperationSequence at the very end of the ExamplePatch.xml document.
<li Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAdd">
<xpath>Defs/ExampleDef[defName = "ExampleDef"]</xpath>
<value>
<ExampleCrossReference>exampleCrossReferenceDef</ExampleCrossReferance>
</value>
</li>
</operations>
</li>


Tidy up any typos, missing lines, close the document and enjoy your all inclusive mod patch.

It is very strongly advised to add each item individually if you can and test them thoroughly.
Do not include multiple types of PatchOperation inside of each PatchOperationSequence.
Ensure that you are familiar with your mod, the target mod and how to perform advanced xpath patches.
There are a number of good resources available on the subject of xpath patching, including this guide by Zhentar (https://gist.github.com/Zhentar/4a1b71cea45b9337f70b30a21d868782).
Also, if you are unsure what your xpath should look like, you can test it using online xpath checkers. A search engine will provide you with several good ones to choose from.
Make sure to properly read and implement the sections on optimization and multi-selection in your patch, otherwise the vast number of patch operations will hugely increase loading times for RimWorld (I used one sequence for ParentNames and one sequence for Abstract removal per xml file).

And now, for reference, here is my ADogSaidExpansionPatch.xml (06 Feb 2018 - 19:12GMT) from this mod:
<?xml version="1.0" encoding="utf-8" ?>

<Patch>

<Operation Class="PatchOperationSequence">
<success>Always</success>
<operations>
<!-- Continue if A Dog Said... exists -->
<li Class="ModCheck.isModLoaded">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<customMessageSuccess>Monster Mash :: A Dog Said... found: Generating cephalopod prosthetics...</customMessageSuccess>
</li>

<li Class="ModCheck.loadOrder">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<errorOnFail>true</errorOnFail>
</li>

<!-- ====== Hediffs_AnimalBodyParts ====== -->

<li Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAttributeAdd">
<xpath>Defs/HediffDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal" or defName = "MonsterMash_ADSP_BionicTentacleAnimal" or defName = "MonsterMash_ADSP_BionicAnimalGill"]</xpath>
<attribute>ParentName</attribute>
<value>addedPartAnimal</value>
</li>
</operations>
</li>

<li Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAttributeRemove">
<xpath>Defs/HediffDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal" or defName = "MonsterMash_ADSP_BionicTentacleAnimal" or defName = "MonsterMash_ADSP_BionicAnimalGill"]</xpath>
<attribute>Abstract</attribute>
</li>

<li Class="ModCheck.isModLoaded">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<customMessageSuccess>Monster Mash :: Enabling cephalopod prosthetics: HediffDefs unlocked...</customMessageSuccess>
</li>
</operations>
</li>

<!-- ========== Items_BodyParts ========== -->

<li Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAttributeAdd">
<xpath>Defs/ThingDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal" or defName = "MonsterMash_ADSP_BionicTentacleAnimal" or defName = "MonsterMash_ADSP_BionicAnimalGill"]</xpath>
<attribute>ParentName</attribute>
<value>BodyPartAnimalArtificialBase</value>
</li>
</operations>
</li>

<li Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAttributeRemove">
<xpath>Defs/ThingDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal" or defName = "MonsterMash_ADSP_BionicTentacleAnimal" or defName = "MonsterMash_ADSP_BionicAnimalGill"]</xpath>
<attribute>Abstract</attribute>
</li>

<li Class="ModCheck.isModLoaded">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<customMessageSuccess>Monster Mash :: Enabling cephalopod prosthetics: Item versions of BodyParts ThingDefs unlocked...</customMessageSuccess>
</li>
</operations>
</li>

<!-- ======== Recipes_AnimalParts ======== -->

<li Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAttributeAdd">
<xpath>Defs/RecipeDef[defName = "MonsterMash_ADSP_MakeSimpleProstheticTentacleAnimal"]</xpath>
<attribute>ParentName</attribute>
<value>ProstheticAnimalCraftBase</value>
</li>

<li Class="PatchOperationAttributeAdd">
<xpath>Defs/RecipeDef[defName = "MonsterMash_ADSP_MakeBionicTentacleAnimal" or defName = "MonsterMash_ADSP_MakeBionicAnimalGill"]</xpath>
<attribute>ParentName</attribute>
<value>BionicAnimalCraftBase</value>
</li>
</operations>
</li>

<li Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAttributeRemove">
<xpath>Defs/RecipeDef[defName = "MonsterMash_ADSP_MakeSimpleProstheticTentacleAnimal" or defName = "MonsterMash_ADSP_MakeBionicTentacleAnimal" or defName = "MonsterMash_ADSP_MakeBionicAnimalGill"]</xpath>
<attribute>Abstract</attribute>
</li>

<li Class="ModCheck.isModLoaded">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<customMessageSuccess>Monster Mash :: Enabling cephalopod prosthetics: Item body part crafting recipe RecipeDefs unlocked...</customMessageSuccess>
</li>
</operations>
</li>

<!-- ========== Recipes_Surgery ========== -->

<li Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAttributeAdd">
<xpath>Defs/RecipeDef[@Name = "MonsterMash_ADSP_TentacleBaseAnimal"]</xpath>
<attribute>ParentName</attribute>
<value>SurgeryFleshAnimal</value>
</li>
</operations>
</li>

<li Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAttributeRemove">
<xpath>Defs/RecipeDef[defName = "MonsterMash_ADSP_InstallSimpleProstheticTentacleAnimal" or defName = "MonsterMash_ADSP_InstallBionicTentacleAnimal" or defName = "MonsterMash_ADSP_InstallBionicAnimalGill"]</xpath>
<attribute>Abstract</attribute>
</li>

<li Class="ModCheck.isModLoaded">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<customMessageSuccess>Monster Mash :: Enabling cephalopod prosthetics: Installation surgeries RecipeDefs unlocked...</customMessageSuccess>
</li>
</operations>
</li>

<!-- ===== Implementing out-of-order Cross References ===== -->

<li Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAdd">
<xpath>Defs/HediffDef[defName = "MonsterMash_ADSP_SimpleProstheticTentacleAnimal"]</xpath>
<value>
<spawnThingOnRemoved>MonsterMash_ADSP_SimpleProstheticTentacleAnimal</spawnThingOnRemoved>
</value>
</li>

<li Class="PatchOperationAdd">
<xpath>Defs/HediffDef[defName = "MonsterMash_ADSP_BionicTentacleAnimal"]</xpath>
<value>
<spawnThingOnRemoved>MonsterMash_ADSP_BionicTentacleAnimal</spawnThingOnRemoved>
</value>
</li>

<li Class="PatchOperationAdd">
<xpath>Defs/HediffDef[defName = "MonsterMash_ADSP_BionicAnimalGill"]</xpath>
<value>
<spawnThingOnRemoved>MonsterMash_ADSP_BionicAnimalGill</spawnThingOnRemoved>
</value>
</li>

<li Class="ModCheck.isModLoaded">
<modName>A Dog Said...</modName>
<yourMod>Monster Mash</yourMod>
<customMessageSuccess>Monster Mash :: Cephalopod prosthetics completed.</customMessageSuccess>
</li>
</operations>
</li>

</operations>
</Operation>
</Patch>
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: wwWraith on February 06, 2018, 02:48:28 PM

XML error: Could not find parent node named "MonsterMash_ADSP_SurgeryFleshAnimal" for node "RecipeDef". Full node: <RecipeDef ParentName="MonsterMash_ADSP_SurgeryFleshAnimal" Abstract="True"><defName>MonsterMash_ADSP_InstallBionicAnimalGill</defName>
but I hope you already dealt with it :)

And those 2 mysterious errors revealing with <success>Normal</success> are still there. It's not good but I don't know what else can be done with them now.

About prefixes: it'll matter only in the case that some other mod will use the same names so their contents will depend on the loading order. It may be both for good (there won't be, for example, several different tentacles that could confuse player which one is for which creature) and for bad (overwritten stats could lead to issues). I think the bad consequences in such situations are more probable and would be harder to fix, while dealing with several similar items won't be hard by patching after revealing this issue. So I'd say the prefixes are more good than bad, though are not really required. But at least I'd suggest you to change existing "MonsterMash_" to "MM_" :) And if you'll decide to use them you'd better to do it earlier than later so it won't take the extra efforts in the future.

Regarding the guide:
1. It'd be good to add an introduction describing what's the point of all this and why working with "dynamically/conditionally created defs" by XML-only means is not trivial.
2. Mention that this method requires using ModCheck (https://ludeon.com/forums/index.php?topic=36534) (however I think in most cases the checks could be made without ModCheck, by PatchOperationTest based on some unique def existing in Example Target Mod) and ModCheck.isModLoaded is sometimes used for custom messages.
3. Mention the probability of concurrent execution of checks and/or sequences.
4. Mention that using <success>Normal</success> reveals errors that seem to not be harmful, but maybe someone will have some more info on that.
5. Some more investigation could be made for details about what exact differences in operations prevent them from being used in one sequence ("Do not include multiple types of PatchOperation inside of each PatchOperationSequence." but we saw that sometimes different operations worked fine). And probably this info should be put higher, so it'll explain why the several sequences must be created.
6. Other instruments for working with xpath include plugins for popular text editors such as Notepad++ and SublimeText.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: ilikegoodfood on February 06, 2018, 03:00:17 PM
The guide was a prototype for the exact reason of you providing feedback.

All of the feedback you have given is valid and I will implement it, however, I am unlikely to get to that today.

Thank you again for the immense amount of time and effort you have put into helping me make this a reality.

EDIT: And thanks for that bug. I had missed it somehow, but it is fixed now.
Title: Re: [B18] Monster Mash (v1.1) (2nd Monster Released)
Post by: wwWraith on February 06, 2018, 03:03:30 PM
No problem, it was interesting and providing good experience for us both :)
Title: Re: [B18] Monster Mash (v1.1.1) (2nd Monster Released, 1st update)
Post by: ilikegoodfood on February 07, 2018, 03:42:58 AM
If I systematically add a "MM_" prefix to all of my defNames and @Names, how will that effect the 100 subscribers who may be using it in game?

Will the game recognize the change and adjust accordingly, or will it break their saves?

And if it will break their saves, is there any way other than removing my mod from the Steam Workshop entirely, which may also break their saves, to ensure that they all follow safe removal procedures prior to the update?
Title: Re: [B18] Monster Mash (v1.1.1) (2nd Monster Released, 1st update)
Post by: ilikegoodfood on February 07, 2018, 04:44:46 AM
2nd draft of the guide:

xml-Only Dynamic Definitions
What are dynamic definitions and why should I (the reader) care?
Currently, using ModCheck (https://ludeon.com/forums/index.php?topic=36534.0) and the xpath operations that it provides and expands upon, it is possible to perform simple patches to a mod's definitions at run-time, in response to the presence or absence of certain other mods.

Elements of this conversation will be easier to explain using an example. This example will be persistent throughout this guide:
Let's say that you have made a mod that adds a new fruit to RimWorld and that you want it to be compatible with a wildly popular mod that adds Jam.
This hypothetical Jam mod adds a new workstation, a recipe to turn each fruit (there are only three in vanilla RimWorld) into its very own jam, and one additional recipe for mixed-fruit jam.

Using normal patching techniques, it is fairly easy to detect the Jam mod and add your fruit to the list of allowed ingredients for the mixed jam.

This guide is for an advanced and experimental mod-patching method. There are many good guides and decent examples of patches using ModCheck already available.

The limitations with standard patching don't start to emerge until you try to add a recipe for the jam made from your own fruit.
You might first encounter the issue that you can't patch in root definitions, such as a RecipeDef, from scratch. A targetable Def with an appropriate name is required first.
You might then try adding a the RecipeDef (to make the jam) and ThingDef (to have the jam item) to your own mod, that uses the Jam mod's baseJam definition.

This is all very well and good until you then run a test without the Jam mod installed and find that your new definitions are throwing up cross-referencing errors, such as: Cannot find ParentName.

This error occurs because the Parent is a file from another mod, one which isn't currently installed. Many modders may be tempted to copy its base definitions into their own mod (which is very bad practice and hasn't been required since a16), or to create their own version of the parent (which is also bad practice).
While this might solve the immediate problem, the game still won't be able to cross reference the workstation that is supposed to receive the recipeDef or find the graphic that is added by the Jam mod.

This is where "dynamic definitions" come in.
What I mean by a dynamic definition, is a definition that is selectively edited down to remove all cross-referencing issues with other mods and then patched at run-time to a working state only when the other mod is detected.

How to Make a Dynamic Definition
First off, a word of warning: Working with dynamic definitions is by no means a trivial task, requiring more work than creating a compatibility sub-mod. There are a number of unknown behaviors, mechanisms and errors at play, which are all solvable, that I will attempt to explain and justify as we work through this guide.

Your first Dynamic Definition
The first step is to create the definition, exactly as you normally would and assuming that the Jam mod (or other compatibility target) is installed.
It might look something like this:
<RecipeDef ParentName="makeJamBase">
<defName>makeBlackberryJam</defName>
<label>make blackberry jam</label>
<description>Make a delicious blackberry jam.</description>
<jobString>Making delicious blackberry jam.</jobString>
<ingredients>
<li>
<filter>
<thingDefs>
<li>blackberry</li>
</thingDefs>
</filter>
<count>25</count>
</li>
</ingredients>
<fixedIngredientFilter>
<thingDefs>
<li>blackberry</li>
</thingDefs>
</fixedIngredientFilter>
<products>
<BlackberryJam>1</BlackberryJam>
</products>
<skillRequirements>
<Cooking>5</Cooking>
</skillRequirements>
<workSkill>Cooking</workSkill>
</RecipeDef>


If you tried to run your mod at this stage, it would cause several errors. makeJamBase is from a mod that isn't necessarily installed and we haven't made the item BlackberryJam yet (We will ignore this error in this guide, since you should be able to comment it out for testing and create the ThingDef for BlackberryJam).

To prevent the recipe from causing errors, you will need to remove the ParentName attribute (don't forget what the parent should be! You will need it soon). This will lead to the RecipeDef being incomplete, since it is no longer inheriting properties from its parent.

The game already has a method for handling incomplete data, but it is primarily used for the base definitions themselves; Abstract = "True"

Abstract = "True"
Abstract definitions are a bit of a special case. These definitions are loaded while the game is loading, but they are not error-checked nearly as rigorously, they do not need to be complete and, most importantly of all, they are discarded when loading completes.

Once the game is loaded, that definition essentially doesn't exist within the game.
You won't get errors from it, unless the error is passed on to its children, you won't be able to use it and you won't find it in the developer-mode tools.

This is key to the implementation of Dynamic Definitions.
If the Jam Mod isn't installed, the BlackberryJam simply doesn't exist.

At this stage, your RecipeDef would look like this:
<RecipeDef Abstract="True">
<defName>makeBlackberryJam</defName>
<label>make blackberry jam</label>
<description>Make a delicious blackberry jam.</description>
<jobString>Making delicious blackberry jam.</jobString>
<ingredients>
<li>
<filter>
<thingDefs>
<li>blackberry</li>
</thingDefs>
</filter>
<count>25</count>
</li>
</ingredients>
<fixedIngredientFilter>
<thingDefs>
<li>blackberry</li>
</thingDefs>
</fixedIngredientFilter>
<!--<products>
<BlackberryJam>1</BlackberryJam>
</products>-->
<skillRequirements>
<Cooking>5</Cooking>
</skillRequirements>
<workSkill>Cooking</workSkill>
</RecipeDef>


The Patch
I'm assuming here that you have followed other people's guides and already know how to patch.
If this is not the case, there are several good resources, including A quick tutorial of xpathing and patching (https://ludeon.com/forums/index.php?topic=32785.0) and [A17] A warning to modders: xpath performance (https://ludeon.com/forums/index.php?topic=32874.0), which are both pinned at the top of the Help sub-section of the modding forum, and Introduction to PatchOperation (https://gist.github.com/Zhentar/4a1b71cea45b9337f70b30a21d868782) by Zhentar.

Any mod-dependent patch should contain a basic test to make sure that the target mod is installed and is above this one in the loading order. The opening section of a patch file usually looks something like this:
<?xml version="1.0" encoding="utf-8" ?>

<Patch>

<Operation Class="PatchOperationSequence">
<success>Always</success>
<operations>
<!-- Continue if Yummy Jams exists -->
<li Class="ModCheck.isModLoaded">
<modName>Yummy Jams</modName>
<yourMod>Blackberry Bonanza</yourMod>
<customMessageSuccess>Blackberry Bonanza :: Yummy Jams detected: Patching...</customMessageSuccess>
</li>

<li Class="ModCheck.loadOrder">
<modName>Yummy Jams</modName>
<yourMod>Blackberry Bonanza</yourMod>
<errorOnFail>true</errorOnFail>
</li>


There are several things here that need explaining:
Quote<success>Always</success>
In a PatchOperationSequence, it will usually run until there is an error, report it, and then stop. That would be if <success>Normal</success> was used. However, when set to <success>Normal</success>, errors are logged that don't appear to do any harm or prevent the patch from working and the PatchOperationSequence is stopped unnecessarily.
This is why most mod patches unquestioningly use <success>Always</success>.

Quote<customMessageSuccess>Blackberry Bonanza :: Yummy Jams detected: Patching...</customMessageSuccess>
ModCheck.isModLoaded is used to test if the required mod is installed, but it also allows you to send a custom message to the Debug Log.
It can be very useful to add duplicates, each with different custom messages, for testing purposes. If the message doesn't reach the Debug Log, then you know that there is a serious error between the last message that was sent and the one that wasn't sent.
Be aware though, that these messages do not appear in the Debug Log in the order that they are written in the patch. Check carefully.
There may be a solution for this (Combat Extended seems to have a strict message order), but I do not know what it is.

Next, we create two sub-sequences.

Wait, but can't it be done in a single sequence?
Well, the answer to that is "Sometimes".
In some patches and in some combinations it seems to work just fine, but at other times it will fail if there are different PatchOperations in the same sequence. The behavior appears highly inconsistent, so its best to make sure that each PatchOperationSequence only contains one type of PatchOperation.
The primary PatchOperationSequence, the one that spans the entire page, is therefore a sequence of PatchOperationSequence(s), and each sub-sequence handles a specific task.

So, back to our two sub-sequences.
The 1st sub-sequence is there to add the ParentName attribute back in to our definitions, and will look like this:
<li Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAttributeAdd">
<xpath>Defs/RecipeDef[defName = "makeBlackberryJam"]</xpath>
<attribute>ParentName</attribute>
<value>makeJamBase</value>
</li>
</operations>
</li>


The 2nd sub-sequence then removes the Abstract="True" attribute from the definition, allowing it to be loaded into the game, and will look like this:
<li Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAttributeRemove">
<xpath>Defs/RecipeDef[defName = "makeBlackberryJam"]</xpath>
<attribute>Abstract</attribute>
</li>
</operations>
</li>


We remove the Abstract attribute after defining the ParentName to avoid receiving errors from the error-check that is performed on a non-abstract definition as a result of the definition still being incomplete
When removing the Abstract attribute, it is important to select the definitions specifically. If you have created your own base definition in that file, it should remain Abstract, otherwise it will cause you a whole new set of errors.

Repetition, repetition, repetition...
From this point forward, you test, develop the remaining required definitions, the patches for them and re-test.
Make sure to un-comment any incomplete cross-references as you complete the definitions, since we still have BlackberryJam as the product commented-out in our example.

Closing Information and Notes
You will also, the exact reasons are unknown, but I believe that it is related to the order by which PatchOperations are performed, occasionally get a persistent cross-reference error with regards to one of your other dynamic definitions. In the case of our example, the ThingDef for BlackberryJam would be a likely error-point.
When that happens, remove the offending reference from the definition and patch them back into the definition using a final PatchOperation sub-sequence at the bottom of your Patch.
It might look like this:
<li Class="PatchOperationSequence">
<success>Always</success>
<operations>
<li Class="PatchOperationAdd">
<xpath>Defs/RecipeDefDef[defName = "makeBlackberryJam"]</xpath>
<value>
<products>
<BlackberryJam>1</BlackberryJam>
</products>
</value>
</li>
</operations>
</li>


Some additional unknowns are associated with the order of file-patching.
The custom messages sent to the Debug Log from different mods do not necessarily appear in the order that the mods are loaded (listed in the mod menu, top-bottom) and sometimes messages from other patch files within your own mod will appear in-between message that are half-way through an ongoing sequence.
While this could be a result of the message order only, it may also be that different patches from mods, different files or possibly even different sequences are performed out of order in some way.

To avoid this unknown operation order from impacting your dynamic definitions, they should all be patched inside of the Primary PathOperationSequence and all in the same file.

Further xpath resources available to you include online xpath checkers and xpath plugins for popular text editors such as Notepad++ and SublimeText.
You can also use my Monster Mash mod as an example framework (Steam Workshop (http://steamcommunity.com/sharedfiles/filedetails/?id=1288174761&searchtext=)) (Forum (https://ludeon.com/forums/index.php?topic=38918.0)). It is the mod that I, ilikegoodfood (https://ludeon.com/forums/index.php?action=profile;u=86994), along with significant time and assistance from wwWraith (https://ludeon.com/forums/index.php?action=profile;u=61585), developed this patching system for and it uses the system to dynamically implement new artificial animal organs and prosthetics for A Dog Said... compatibility with my Land Kraken.
If you do you use this system, a reference would be highly appreciated, but it is not necessary.
Title: Re: [B18] Monster Mash (v1.1.1) (2nd Monster Released, 1st update)
Post by: ilikegoodfood on February 07, 2018, 06:26:28 AM
And the 2nd draft of my guide is complete!
What do you think?

I'm also quoting myself so as to prevent this question I need answering from getting berried behind the guide:
Quote from: ilikegoodfood on February 07, 2018, 03:42:58 AM
If I systematically add a "MM_" prefix to all of my defNames and @Names, how will that effect the 100 subscribers who may be using it in game?

Will the game recognize the change and adjust accordingly, or will it break their saves?

And if it will break their saves, is there any way other than removing my mod from the Steam Workshop entirely, which may also break their saves, to ensure that they all follow safe removal procedures prior to the update?

EDIT:
And does creating a custom event still require a .dll assembly?
I'm very much a complete novice at C# and haven't done anything with it in years to boot... :(
Title: Re: [B18] Monster Mash (v1.1.1) (2nd Monster Released, 1st update)
Post by: wwWraith on February 07, 2018, 07:55:18 AM
Quote from: ilikegoodfood on February 07, 2018, 06:26:28 AM
And the 2nd draft of my guide is complete!
What do you think?

I think it looks fine to be published standalone :)

Quote
If I systematically add a "MM_" prefix to all of my defNames and @Names, how will that effect the 100 subscribers who may be using it in game?

Will the game recognize the change and adjust accordingly, or will it break their saves?

And if it will break their saves, is there any way other than removing my mod from the Steam Workshop entirely, which may also break their saves, to ensure that they all follow safe removal procedures prior to the update?

It will break saves if there are any instances of those defs actually used in the savefile. Of course it could be fixed by renaming them in the savefile but not many of the users would figure it out. So, well, probably it will be better not to rename existing defs for now. The other way could be adding defs with new names but keeping old ones for compatibility, but I don't think it'd worth the effort and will make the code confusing. And I don't know anything regarding Steam.
Title: Re: [B18] Monster Mash (v1.1.2) (2nd Monster Released, 2nd update)
Post by: ilikegoodfood on February 07, 2018, 05:25:03 PM
I did a little bit of searching earlier to see what would be required to implement a new event, essentially a clone of the Thrumbo event, that could spawn Monsters instead of Thrumbo.

Much to my surprise, all of the information I found is from way back in alphas 3 and 4, but it seems like it'll need xml modding.
Do you happen to know if that's still true or not?

I'll continue my research too, but I've somewhat over-worked myself with the dynamic definitions, so I'll likely give it only a little time and sort of take a few days off.
Title: Re: [B18] Monster Mash (v1.1.2) (2nd Monster Released, 2nd update)
Post by: Harry_Dicks on February 07, 2018, 06:59:02 PM
Good work guys! It's been interested following your journey of discovery :) I'm sure this work will be invaluable to others in the future!
Title: Re: [B18] Monster Mash (v1.1.3) (2nd Monster Released, 3rd update)
Post by: ilikegoodfood on February 10, 2018, 05:56:48 AM
Version 1.1.3 is now out!

The update adds the "Monster Sighting" event, which works just like the "Thrumbo Passes", but for my monsters!
This should allow you to interact with them beyond their normal biomes.

Currently there are only monster for all Forests (Inferno Beetle) and all Swamps (Land Kraken).
I'm trying to think of new monsters for Arid Shrubland, Desert & Extreme Desert, Tundra and Ice Sheet.
Inspiration and suggestions are welcome, just be aware that I'm very likely to not use it, especially if it overly common either thematically or mechanically. :P
And yes, I am overly aware that there simply isn't that much mechanical variation possible for creatures.
Title: Re: [B18] Monster Mash (v1.1.3) (2nd Monster Released, 3rd update)
Post by: Harry_Dicks on February 10, 2018, 07:09:47 AM
I'm having trouble thinking of any mammals that really have some sort of ranged thing they do. Maybe this has to do with a lot of the stuff mammals have equipped on our bodies is meant to be more long term. Like how we can't regenerate limbs, but some reptiles can, and I can't really think of how to word this and I don't want to type a wall but this is sort of a gross oversimplification of how I think about different classes of critters.

Anyway, here's some random terrible spitball ideas:

-Creature that spits a type of "tar" that will slow down whatever it hits for X time

-An animal that has a type of "black ink" like an octopus/squid. This could greatly decrease accuracy of melee and/or ranged attacks for X time.

-Some kind of insectoid that sprays a type of "corrosive acid", similar those ants that can spray something almost a foot away. I'm thinking it would be awesome if this could but a temporary debuff on the target, and will increase any damage they receive from any source for X time. The idea is that this corrosive acid is eating away at whatever apparel/armor/whatever is on this target.

-Some sort of poison dart creature, like certain frogs.

-A type of quill shot from most likely a mammal.

-Some type of finger bone that is shot from an animal? There are these frogs that I saw in a documentary, that will purposefully break the bones near their hands, and then pierce these bones through their skin to act like claws. I can't remember if the claws were then used for mating or defense or what. I can't remember if they could grow them back, either, but I am 100% confident that something like this exists.

-Some kind of "bio-conductive" animal, maybe it's slimy like an eel,  that could zap it's target with electric from a certain distance. Or maybe it creates a small electric field around it, that will harm anything in the area that is not a member of it's species?

-Blood stream that shoots from the eyeball. Like the reptile that does it. Maybe instead of blood it will make the target have a chance to catch a specific disease, or some other interesting hediffs/comps/verbs/whatever they are ::)

Might be interesting if we could have some longer term effects, too. I know it's a lot more interesting to see anything from battles happen while the battle is going on. But it would make for interesting game play, in my opinion, if for example anyone squirted with this blood (or any type of attack from any monster or mod) might have a chance to catch some new diseases. Maybe this will mess with their blood filtration and/or pumping. Speaking of which, I don't think there really are too many things in vanilla game that touch on blood filtration/pumping that really caught my eye. I guess I would need to say I would like to see new diseases/hediffs/comps/verbs or whatever it is you call them. I did download Diseases Overhauled last night. However, it needs the base of Extended Human Body Simulation, which isn't playing nice with RBSE. Guess I'm going to need to go in and modify one of the two, that will probably end up being my project for the day!
Title: Re: [B18] Monster Mash (v1.1.3) (2nd Monster Released, 3rd update)
Post by: ilikegoodfood on February 10, 2018, 07:19:39 AM
Quote from: Harry_Dicks on February 10, 2018, 07:09:47 AM
-Creature that spits a type of "tar" that will slow down whatever it hits, similar to an octopus/squid's ink.

I actually just posted a question about octopus ink over on the Ranged Animal Framework thread (https://ludeon.com/forums/index.php?topic=38290.0) to ask if the mod does/could support smokepop-belt like behaviors.
Ultimately, I would like to give the Land Kraken an Ink-Squirt that acts like a smokepop belt when it gets shot at. I'd also reduce it's overall health at that time, since it would be considerably harder to hit.

None of the other ideas are bad, and your mention of that lizard that shoots blood could easily be adapted for the Arid biome.
I'm vaguely considering a Giant Scorpion for the Desert Biomes, but they are just so damn common. I might instead go for a cybernetic scorpion who's tail is a charge lance, or similar sniper-style weapon.
Not sure if I would allow it to be harvested and installed in people though...
Title: Re: [B18] Monster Mash (v1.1.3) (2nd Monster Released, 3rd update)
Post by: Harry_Dicks on February 10, 2018, 07:31:07 AM
Damn, you beat me back before I could edit my post.

Anyway, I don't know if you saw the other ones I put up, because I did edit that post quite a few times, and I made a final edit after your response. I was going to say that, I did not go back and read your OP. I was under the assumption you were still making only ranged animals. However, if that's not a requirement, that's cool too. I just thought that's what you were asking about ideas for, animal ranged attacks :)
Title: Re: [B18] Monster Mash (v1.1.3) (2nd Monster Released, 3rd update)
Post by: ilikegoodfood on February 10, 2018, 07:54:23 AM
I have just re-read your post with the edits.

My first thought is to combine the Lizard that shoots blood from its eyes with a Cammodo Dragon, to create a large powerful lizard; the Sanguine Drake.

Sanguine (noun) in archaic English also means blood-red or blood and Drake is related to Dragon, so it roughly means Blood Dragon or Blood Lizard.
Title: Re: [B18] Monster Mash (v1.1.3) (2nd Monster Released, 3rd update)
Post by: Harry_Dicks on February 10, 2018, 11:36:18 AM
Sounds great. I wasn't really expecting you to want to use any of the ideas, anyway. After you said you were not very likely to use them, I suppose just getting past that counts for something! :P
Title: Re: [B18] Monster Mash (v1.1.3) (2nd Monster Released, 3rd update)
Post by: ilikegoodfood on February 11, 2018, 02:29:19 PM
So, I have whittled away the day, still fighting with this bug, sleepily creating the Sanguine Drake.

I have everything working, but haven't decided on the unique hediff or ranged attack, for a few reasons:

Ranged Attack:
Animals with ranged attacks seek cover to shoot from instead of charging at their enemy. I wan t to make the blood projectile attack have a very long recharge so that it is only really used once at the beginning of combat, but that will then delay the creature charging in with the melee attacks. Furthermore, I'm not entirely sure if it will charge in, or just wait for the attack to re-charge.
I'll have to make it and then run some tests once i have the Hediff.

Hediff:
I have discovered several interesting things. The first is how to define the bleeding rate of a damage type, which is useful. The second is that Komodo Dragons have a powerful anticoagulant in their venom, which contains at least two major compound groups.
As such, I would like to give the Sanguine Drake a Venom Hediff that applies a multiplier to bleeding, but I'm not sure if that is possible. Do any of you know of a way to do that?

Also, how do you define an offset for the pawn location with Giddy-up! ? The dude needs to sit further forwards...

A few other balance changes have been made as well, and all monster spawn rates have been more than halved, since they were way too common. (6 Inferno Beetles on my temperate forest map).
The updates will be released along with the Sanguidne Drake, hopefully some time in the next few days.
Title: Re: [B18] Monster Mash (v1.1.3) (2nd Monster Released, 3rd update)
Post by: Harry_Dicks on February 11, 2018, 03:31:24 PM
Quote from: ilikegoodfood on February 11, 2018, 02:29:19 PM
Also, how do you define an offset for the pawn location with Giddy-up! ? The dude needs to sit further forwards...

In the mod options for Giddy-Up, you can tell it where you want your riders positioned on an animal, depending on what animal they are riding. Maybe look into how it swaps the two positions, and you can go from there. You can't define "where" they actually go on an animal, but it does have two presets.
Title: Re: [B18] Monster Mash (v1.1.3) (2nd Monster Released, 3rd update)
Post by: ilikegoodfood on February 11, 2018, 03:37:29 PM
Quote from: Harry_Dicks on February 11, 2018, 03:31:24 PM
You can't define "where" they actually go on an animal, but it does have two presets.
I know that the mod has the option to set the rider as either drawn over the creature's graphic (used for most creatures) or behind the creature's graphic (usually reserved for long-necked creatures such as the Thrumbo).
Drawing them over the top looks fine, but because the creature is 50% tail, 50% body, the default position is on the rear hip instead of the body behind the fore-leg.
I was hoping that the mod allowed the definition of an offset at least in the front-back direction, so that I could move the rider forwards. I'll look into it further tomorrow.
Title: Re: [B18] Monster Mash (v1.1.3) (2nd Monster Released, 3rd update)
Post by: ilikegoodfood on February 11, 2018, 06:11:17 PM
I sure do create a lot of help threads....

Here's the latest one. (https://ludeon.com/forums/index.php?topic=39050.0)
Title: Re: [B18] Monster Mash (v1.1.3) (2nd Monster Released, 3rd update)
Post by: ilikegoodfood on February 14, 2018, 08:06:55 AM
The Sanguine Drake is almost ready for release.

Sorry for the delays, but I had to learn to use Harmony Patching and the person who was helping me only came online late in the day for me, so work has been very slow.

I have finally created a system that allows me to control the bleed-rate total, created the damage types, hediff and projectiles to go along with it and added the ranged attack to the Sanguine Drake, however, for reasons unknown, it refuses to use it's ranged attack.
I'm uncertain as to what the bug is, since I'm not getting any errors from it, and will not be able to resume work on it until later today.
Title: Re: [B18] Monster Mash (v1.1.3) (2nd Monster Released, 3rd update)
Post by: ilikegoodfood on February 14, 2018, 03:17:37 PM
I think that I have found the source of my current issue:

I am using an xpath patch to enable the ranged shots when and if Ranged Animal Framework is detected, which it always is because it's in my assemblies folder, however, the second PatchOperationAdd doesn't work, despite being a copy-paste of the first.
I have also tried it with only the 1st, and the testing marker appears correctly, and only the second, which doesn't work. I have tried it with the 1st's projectile, in case there was a problem and I have compared them, word for word. I can't find the error at all, but I know that it is this part that fails.

If someone would look it over, that'd be great.
As soon as this bug is squashed, I can perform final tests and then release the SanguineDrake, which is much stronger than it used to be.

<?xml version="1.0" encoding="UTF-8"?>

<Patch>
<Operation Class="PatchOperationSequence">
<success>Normal</success>
<operations>
<!--Continue if combat extended does not exist IE patch vanilla-->
<li Class="ModCheck.isModLoaded">
<modName>Combat Extended</modName>
<yourMod>Monster Mash</yourMod>
<success>Invert</success>
<customMessageFail>Monster Mash :: Implementing ranged attack framework for vanilla RimWorld...</customMessageFail>
</li>

<!--Accuracy needs to be high, because animals don't have shooting skill-->
<li Class="PatchOperationAdd">
<xpath>Defs/ThingDef[defName = "InfernoBeetle"]</xpath>
<value>
<verbs>
<li>
<verbClass>Verb_Shoot</verbClass>
<accuracyTouch>0.8</accuracyTouch>
<accuracyShort>0.9</accuracyShort>
<accuracyMedium>0.9</accuracyMedium>
<accuracyLong>0.8</accuracyLong>
<hasStandardCommand>true</hasStandardCommand>
<defaultProjectile>MM_InfernoBeetleProjectile</defaultProjectile>
<warmupTime>3.5</warmupTime>
<burstShotCount>1</burstShotCount>
<ticksBetweenBurstShots>1</ticksBetweenBurstShots>
<minRange>4</minRange>
<range>16</range>
<soundCast>Pawn_BigInsect_Call</soundCast>
<muzzleFlashScale>4</muzzleFlashScale>
</li>
</verbs>
</value>
</li>

<li Class="PatchOperationAdd">
<xpath>Defs/ThingDef[defName = "SanguineDrake"]</xpath>
<value>
<verbs>
<li>
<verbClass>Verb_Shoot</verbClass>
<accuracyTouch>0.7</accuracyTouch>
<accuracyShort>0.8</accuracyShort>
<accuracyMedium>0.9</accuracyMedium>
<accuracyLong>0.95</accuracyLong>
<hasStandardCommand>true</hasStandardCommand>
<defaultProjectile>MM_SanguineDrakeProjectile</defaultProjectile>
<warmupTime>10</warmupTime>
<burstShotCount>1</burstShotCount>
<ticksBetweenBurstShots>1</ticksBetweenBurstShots>
<minRange>12</minRange>
<range>30</range>
<soundCast>Pawn_Iguana_Wounded</soundCast>
<muzzleFlashScale>1</muzzleFlashScale>
<commonality>0.6</commonality>
</li>
</verbs>
</value>
</li>

<li Class="ModCheck.isModLoaded">
<modName>Core</modName>
<yourMod>Monster Mash</yourMod>
<customMessageSuccess>Monster Mash :: Testing Marker...</customMessageSuccess>
</li>
</operations>
</Operation>
</Patch>
Title: Re: [B18] Monster Mash (v1.1.3) (2nd Monster Released, 3rd update)
Post by: ilikegoodfood on February 18, 2018, 06:57:52 AM
wwWrith, do you remeber that when we switched the patch operation for the RangeAnimalFramwork from <success>Always</success> to <success>Normal</success>, we received a log for a phantom error that didn't seem to have any impact, so we ignored it?

Well, further investigation of the current issue shows that the error is preventing the patch sequence from continuing.
This means that, if I have more than one animal with a ranged attack, only the first one listed is implemented.
The code is an exact copy, with different figures, from the template mod provided by BrokenValkyrie along with the RangeAnimalFramework, the MegaSpider Range Attack mod. That mod only adds a range attack to a single creature, so I suspect he/she/other may be unaware of the issue.

I'm going to re-subscribe to the Dragon mod, since it has multiple creatures, and see if that presents a solution.
Unfortunately, because of the way that RangeAnimalFramework calculates attack jobs, I'm probably going to have to remove the ranged attack from the Sanguine Drake anyway, but this bug really need squashing first.

Thanks again for your help.

EDIT: There was a tiny variation, one line to be exact, but that hasn't solved the issue.
I'm beginning to wonder if it's an issue with my using the inclusive assembly instead of making a direct reference to a separately installed mod, as all of BrokenValkyrie's sub-mods do. I'm going to quote this whole discussion (not much of a discussion with only 1 poster at the moment :P) over and ask for help directly.
He/other/she hasn't responded to my previous question yet though... We'll see.
Title: Re: [B18] Monster Mash (v1.1.3) (2nd Monster Released, 3rd update)
Post by: wwWraith on February 18, 2018, 08:39:52 AM
What about dividing it again into several sequences or files?
Title: Re: [B18] Monster Mash (v1.1.3) (2nd Monster Released, 3rd update)
Post by: ilikegoodfood on February 18, 2018, 09:16:18 AM
I had already tried splitting them into two sub-sequences without success, but apparently I either included an error, or something else has changed since, because it has worked.

It feels like a dirty hack, splitting each patch into a separate sub-sequence to prevent the return fail from reaching the primary sequence, but if it works, who am I to complain.

Nice call.

EDIT: After systematic testing it turns out that there is an error blocking most of my CombatExtendedPatch.xml from working. I'm trying to identify and fix it now.
Furthermore, Combat Extended for B18 pre-release has changed version number entirely, from RC1 to RC2, so I may just need to temporarily withdraw CombatExtended Comparability, but that will break a few saves, something I would rather avoid...
Title: Re: [B18] Monster Mash (v1.1.3) (2nd Monster Released, 3rd update)
Post by: wwWraith on February 18, 2018, 11:56:01 AM
I think about that as a method to narrow down the issue or get some other (hopefully more useful) error message :) For the latter you can also try to execute these operations outside any sequences at all. The reason I'm thinking about it is suspicions of some internal mechanics that work per file: https://ludeon.com/forums/index.php?topic=33656.msg343922#msg343922 (https://ludeon.com/forums/index.php?topic=33656.msg343922#msg343922), https://ludeon.com/forums/index.php?topic=32874.msg381068#msg381068 (https://ludeon.com/forums/index.php?topic=32874.msg381068#msg381068); I saw a more detailed info somewhere but can't find it now.

Also just found another interesting post: https://ludeon.com/forums/index.php?topic=33186.msg341261#msg341261 (https://ludeon.com/forums/index.php?topic=33186.msg341261#msg341261) :)
Title: Re: [B18] Monster Mash (v1.2) (3rd Monster Released)
Post by: ilikegoodfood on February 18, 2018, 12:22:53 PM
Version 1.2 is now officially here, along with the release of the Sanguine Drake for arid and desert biomes.
Furthermore, a number of other fixes have accompanied the release.
Title: Re: [B18] Monster Mash (v1.1.3) (2nd Monster Released, 3rd update)
Post by: ilikegoodfood on February 18, 2018, 12:24:00 PM
Quote from: wwWraith on February 18, 2018, 11:56:01 AM
I think about that as a method to narrow down the issue or get some other (hopefully more useful) error message :) For the latter you can also try to execute these operations outside any sequences at all. The reason I'm thinking about it is suspicions of some internal mechanics that work per file: https://ludeon.com/forums/index.php?topic=33656.msg343922#msg343922 (https://ludeon.com/forums/index.php?topic=33656.msg343922#msg343922), https://ludeon.com/forums/index.php?topic=32874.msg381068#msg381068 (https://ludeon.com/forums/index.php?topic=32874.msg381068#msg381068); I saw a more detailed info somewhere but can't find it now.

Also just found another interesting post: https://ludeon.com/forums/index.php?topic=33186.msg341261#msg341261 (https://ludeon.com/forums/index.php?topic=33186.msg341261#msg341261) :)

I must be better at this than I think. It took a little patience, but it is now all fixed and released.
I've also spotted an error, already, so expect a hotfix shortly.

EDIT: False alarm on that bug...

EDIT 2: Do you know of a mod that plays about with spawner mechanics?
The only one I can think of is the TiberiumRim, and that is a very complex mod.
And why do I always have to set myself hugely complex creature designs..? That's a rhetorical question, it's because they're awesome...
Title: Re: [B18] Monster Mash (v1.2) (3rd Monster Released)
Post by: ManagerZ on February 18, 2018, 05:52:16 PM
Did you know the dropbox link is not working?
Title: Re: [B18] Monster Mash (v1.2) (3rd Monster Released)
Post by: ilikegoodfood on February 19, 2018, 03:24:36 AM
Quote from: ManagerZ on February 18, 2018, 05:52:16 PM
Did you know the dropbox link is not working?

Thanks for letting me know.

Fixed.
Title: Re: [B18] Monster Mash (v1.2.1) (3rd Monster Released, 1st update)
Post by: ManagerZ on February 19, 2018, 06:55:50 AM
Thank you. ;D
Title: Re: [B18] Monster Mash (v1.2.1) (3rd Monster Released, 1st update)
Post by: ilikegoodfood on February 20, 2018, 04:56:27 AM
Judging by the state of my own, rather successful ironman save, I have accidentally broken any running game that includes an InferfonBeetle. It may also effect other monsters.

If you load a game using Monster Mash, pause immediately or quit without saving (ALT + F4 works on ironman), then reload the game paused. Using the dev tools, kill all monsters on the map (Inferno Beetle and Land Kraken).

The dev tools can be activated in the options menu, both in and out of game. A series of icons will appear over your character protraits,. The fourth from the left is labelled "Open debug actions menu".
Open it, and use the "Tool: Damage to death" button at the top of the central row. Then go to each monster in turn and click on them.

To anyone who has already lost a save as a result, I appologise for your loss.
I believe taht I know why the issue has arrisen and it shouldn't happen again.

EDIT: So much for successful. Everyone's dead.
May not have happened if I still had my three fully-trained Inferno Beetles, but oh well...
Title: Re: [B18] Monster Mash (v1.2.1) (3rd Monster Released, 1st update)
Post by: ilikegoodfood on February 22, 2018, 11:44:32 AM
The Combat Extended Patch is nothing but frustration.
It's wonderful when it works, but it makes some bizarre error reports and requires endless amounts of trial and error.

I have finished the Polar Colossus and I added it to the Combat Extended Patch and started performing tests on it again, only to discover that all of the Melee attacks are returning a null exception when trying to get the armorPenetration value and thus not working.
That is, all except for the Land Kraken's attacks, which work perfectly, but I genuinely can't find a difference between them.

Here's a link (https://www.dropbox.com/s/qjbli30mgdgujqz/CombatExtendedPatch.xml?dl=0) to the patch file again, it's now too large to add to a post, so if someone would lend me an eye, that'd be great.
Thanks.

When CombatExtended becomes officially available for B18, i'll have to rebuild it too. When that time comes I'll probably sub-divide it into separate files, imitating the way CombatExtended's own patches are built.
Title: Re: [B18] Monster Mash (v1.2.1) (3rd Monster Released, 1st update)
Post by: Harry_Dicks on February 22, 2018, 02:59:46 PM
Quote from: ilikegoodfood on February 22, 2018, 11:44:32 AM
When CombatExtended becomes officially available for B18, i'll have to rebuild it too.

Didn't this just happen yesterday?
Title: Re: [B18] Monster Mash (v1.2.1) (3rd Monster Released, 1st update)
Post by: ilikegoodfood on February 22, 2018, 03:28:32 PM
Quote from: Harry_Dicks on February 22, 2018, 02:59:46 PM
Didn't this just happen yesterday?

It did? Okay, I suppose I'll just rebuild it then over the next few days.
Title: Re: [B18] Monster Mash (v1.2.1) (3rd Monster Released, 1st update)
Post by: ilikegoodfood on February 22, 2018, 04:27:32 PM
Quote from: Harry_Dicks on February 22, 2018, 02:59:46 PM
Didn't this just happen yesterday?

Oh, this is perfect. I just tested it using the new version of CombatExtended and everything worked flawlessly.
It's seems that the problem was at their end, not mine, so I'll get the update out soon.
Title: Re: [B18] Monster Mash (v1.3) (4th Monster Released)
Post by: Harry_Dicks on February 23, 2018, 06:04:07 PM
Not sure if it is of any help to you, but I was browsing Genetic Rim's source files and there is a ranged animal attack verb unlocker in there. Might be worth checking out!
Title: Re: [B18] Monster Mash (v1.3) (4th Monster Released)
Post by: ilikegoodfood on February 23, 2018, 06:18:46 PM
The ranged animal unlocker is actually a very simple and clever tool (I took a peak at the code using dnSpy).
How it works is that it gathers all of the verbs from the core game using a Harmony powered patch, filters them for those that contain the "ranged" property and then adds them to the list of available verbs for animals.
It then does the same for the behaviors, a slightly more complex step that I didn't look into.

Anyway, the point that I'm trying to make is, the animal range unlocker works perfectly, since it is essentially copying vanilla code into vanilla items. I don't imagine that different version, assuming Genetic Rim's isn't derived from the same one I'm using, will have any significantly different features, as they should all work in much the same way.

It's an interesting thing that I'll keep in mind, but am unlikely to look into further.

If you were refering to my previous frustrations with Combat Extended, that seem to have been to do with the fact that I was patching for the pre-release development version (with was rather unstable), now fixed and officially out, and was with the melee verbs rather than the ranged ones.

Either way, thanks for the information. It is interesting.

Also, on an un-related note, I'm taking a few days off, both from RimWorld and D&D5E prep, since I have been doing too much of both. Once I get back to it, knowing me that'll be sooner rather than later, I'll be re-configuring the ranged capabilities of the Polar Colossus and splitting out the Combat Extended Patch.
I suspect that the update will be out before Wednesday, as it's actually fairly simple, but don't hold me to that.

Monster Mash now also has a monster for every biome.
After that, I'm not sure if I'll try and invent another monster or if I'll contact the developers of the Tiberium mod to ask about spawn mechanics for the multi-organism organism idea. Their mod makes heavy use of them.
Title: Re: [B18] Monster Mash (v1.3) (4th Monster Released)
Post by: Harry_Dicks on February 23, 2018, 07:10:40 PM
Alright, wasn't sure. I honestly haven't been reading all of the posts on this thread that in depth, and wasn't sure if you were still having any issues with it. I was just browsing the files for it and saw that, and it made me think of you :)

See, you've already got a special place in my heart! :P I just wanted to throw it out there that I guess there are other ranged animals in Genetic Rim, and thought it might help to have some other reference material if you were still having issues.
Title: Re: [B18] Monster Mash (v1.3.2) (4th Monster Released, 2nd update)
Post by: ilikegoodfood on February 26, 2018, 12:45:08 PM
Versions 1.3.1 and 1.3.2 are now both out.

That includes changing the Polar Colossus' ranged attack from a triple-shot incendiary attack to a single sniper-accurate, high damage single shot weapon, more akin to the charge lance it's based on.
The CombatExtended patches have now been split into individual sub-patches, which should make it all easier to read and bugfix.
Three new mechanical body parts have been added to the Polar Colossus. Unfortunately, I can't connect the ranged attack verb to a body part group, so they're entirely aesthetic in nature.
Title: Re: [B18] Monster Mash (v1.3.2) (4th Monster Released, 2nd update)
Post by: Harry_Dicks on February 26, 2018, 01:06:38 PM
Minor suggestion: give your mod a base folder that it extracts to when downloading from DropBox.
Title: Re: [B18] Monster Mash (v1.3.2) (4th Monster Released, 2nd update)
Post by: ilikegoodfood on February 26, 2018, 01:33:15 PM
The program I use is set to create one by default when un-ziping, so I tend to find that annoying, but you're right that that's a choice with my setup and it will effect others differently.

Fixed.
Title: Re: [B18] Monster Mash (v1.3.2) (4th Monster Released, 2nd update)
Post by: ilikegoodfood on March 06, 2018, 04:55:34 AM
I had been using the diagram at the top of RimWorld Wiki's biome page (http://rimworldwiki.com/wiki/Biomes) to determine the list of biomes in the game, and therefore work out what creatures live where.
I did noticed however, that it doesn't seem to include grassland, so I started checking through RimWorld's Biome Defs and found that the diagram is rather incomplete. The newer biomes do seem to be in the side-bar, but it may mean that I have accidentally missed a biome or two when designing monsters.
I'm examining that now.

EDIT: Lol. I performed the check because i didn't see any plains and thought there should be. There aren't any.
Title: Re: [B18] Monster Mash (v1.3.3) (4th Monster Released, 3rd update)
Post by: wwWraith on March 06, 2018, 06:16:13 AM
Yes, some info in that article is outdated. I'd suggest to just look in the Core defs if you want the accurate data. Maybe it'll lead you to creating your own table or even updating the wiki ;)
Title: Re: [B18] Monster Mash (v1.3.3) (4th Monster Released, 3rd update)
Post by: ilikegoodfood on March 06, 2018, 06:50:20 AM
Nice to see you again wwWraith.

I have a few (giant hoard) of unanswered questions, you may not be able to help, but others may...
I'm just going to dump them all here, in one giant post.

Does anyone know of an in-built bullet reflection system?
Can a creature that is hit fire the projectile back to the attacker?

How do you create more advanced explosions/projectiles?
I have seen some fragment grenades that fire fragments in random directions and things like it. How is that done?

Is it possible to create a chaining shot, something that hits a creature and then jumps to another nearby creature if one is in range?
If it is possible, how would you/I stop it from endlessly bouncing between the same two pawns?

Is there a more general Spawner Mechanic hidden in the code somewhere?
The only thing I can find is specific to the Hives and not generally usable for other things.
EDIT: CompProperties_Spawner seems to be what I was after. Unfortunately it doesn't let me spawn the trap in a fixed tile relative to my creature, but that shouldn't be a big problem. I'm a little concerned about the performance hit of a creature performing a spawn cycle once a second though, and the lifespan on the building will also add a lot of ticking objects...

How do you create a CapacityDefOf and CapacityWorker?
I haven't worked out how to add them to the core code, or if there is some other way to do it...
I would like to do so in order to allow body part health to effect shot accuracy for my monsters.
Also, even when I get that working, I will need a system that disables the verb once any of the relevant bodyparts and/or bodypartgroups are destroyed.
How would I go about that?

How would I create a system to make a creature spawn a building in tiles that it moves over?
This must include checks to ensure that the building is placeable, that there isn't already something else there and a chance for it to spawn.
I'm looking into making a giant snail with a corrosive slime trail, and my best solution so far is to make the slime trail into a trap with a short lifespan.

Is there a way to prevent a dead animal from leaving a corpse?
I've been considering making an energy being that won't leave a corpse. This is also what I want the chain-shots for.

Is there a way to create a hediff that periodically applies damage to the bodypart the hediff is attached to?
I think this can be done by creating a new wound type and then adding a HediffGiver_random to it, but how would I make it get this specific bodypart?

As you can see, development has sort of devolved in a maelstrom of thoughts and parallel investigations while I try to come up with things that are unique, clear, fun and somewhat balanced.
This uncertainly is then further exacerbated by the fact that no-one has provided me with any feedback at all on the mod, how it plays and how balanced it is.
I've got some monsters in my own game, and they're very cool, but I'm also not sure if they're too strong or not...
Title: Re: [B18] Monster Mash (v1.3.3) (4th Monster Released, 3rd update)
Post by: ilikegoodfood on March 06, 2018, 07:15:17 AM
Questions continued:

How could I implement Retaliation Damage or Retaliation Attacks?
This could be useful for creatures that are covered in defensive spines, have corrosive blood that splashes back on melee attackers, or that strike against attackers reflexively.
If this could be set to work for both Melee and Ranged attacks independently, then it could also be used as an alternative to bullet reflection.
Title: Re: [B18] Monster Mash (v1.3.4) (4th Monster Released, 4th update)
Post by: ilikegoodfood on March 06, 2018, 07:59:23 AM
I seem to have answered my spawner question for myself, but that just leads to further questions, as always.

CompProperties_Spawner seems to be what I was after. Unfortunately it doesn't let me spawn the trap in a fixed tile relative to my creature, but that shouldn't be a big problem. I'm a little concerned about the performance hit of a creature performing a spawn cycle once a second though, and the lifespan on the building will also add a lot of ticking objects...
Title: Re: [B18] Monster Mash (v1.3.4) (4th Monster Released, 4th update)
Post by: wwWraith on March 06, 2018, 09:23:51 AM
The most of these questions looks leading to C# coding, and as I said, I have not much experience with creatures, so I can't help except some basics :)

Quote from: ilikegoodfood on March 06, 2018, 06:50:20 AM
If it is possible, how would you/I stop it from endlessly bouncing between the same two pawns?
I think the solution should be to keep a stack of "used" targets (in C# of course).

Quote
I would like to do so in order to allow body part health to effect shot accuracy for my monsters.
Also, even when I get that working, I will need a system that disables the verb once any of the relevant bodyparts and/or bodypartgroups are destroyed.
Shooting accuracy should depend on Manipulation and Sight which should depend on relevant bodyparts so it should work automatically, I believe. You can test it in your creatures' detailed info window during the game. If you need other capacities (or if Shooting accuracy for animals doesn't use them in the current implementation), you'll have to make it as likeness.

Quote
Is there a way to prevent a dead animal from leaving a corpse?
Even if there is not (I mean XML-only as nearly everything is possible with C#), I think you can create a corpse with a very low HP and very high deterioration/rotting rates as a workaround (though there still will be chances of keeping the corpse if the creature died under the roof in some cold place; probably making it also explosive as boomrats/boomalopes even with a little radius should prevent it by burning).
Title: Re: [B18] Monster Mash (v1.3.4) (4th Monster Released, 4th update)
Post by: ilikegoodfood on March 06, 2018, 09:35:54 AM
Quote from: wwWraith on March 06, 2018, 09:23:51 AM
I think the solution should be to keep a stack of "used" targets (in C# of course).
I fully expected that response. I was wondering if there were other ways of doing it, but it shouldn't matter.

Quote from: wwWraith on March 06, 2018, 09:23:51 AM
Shooting accuracy should depend on Manipulation and Sight which should depend on relevant bodyparts so it should work automatically, I believe.
You are entirely correct, and that works for bodyparts that are relevant to manipulation and sight.
Some of my creature's have bodyparts that are especially for or are required to be functional for the shots to work, from a biological point of view.
The Sanguine Drake shouldn't be able to shoot blood if it has no eyes, but the game simply penalizes the accuracy for one of the two factors being reduced.
The Polar Colossus has a whole collection of bionic bodyparts. Their only function, aside from the Thermal Core which acts as a heart, is to enable it to shoot. If any of those parts reach 0 hp, it should be unable to shoot and the overall BodyPartGroup efficiency should negatively impact accuracy.
To do this, I will need to create a new capacity, easily done, with a CapacityDefOf and CapacityWorker in C#, no idea how to get that working yet, and then use a patch to insert it into the accuracy stat, also easily done.

Quote from: wwWraith on March 06, 2018, 09:23:51 AM
Even if there is not...
Those are excellent suggestions. Thank you.

And I was fully expecting that you wouldn't be able to answer most of these, but you still provide useful insights and there are a few other people following the thread.
Title: Re: [B18] Monster Mash (v1.3.4) (4th Monster Released, 4th update)
Post by: ilikegoodfood on March 06, 2018, 04:05:15 PM
After the double hotfix that went out earlier, I spent most of the day working on my next creation, the Carrion Crawler.

The idea is that it's a very slow moving giant snail that periodically spawns a slime trail on surrounding tiles. This slim trail would use trap mechanics to deal a small amount of burning damage to creatures that walk over it and it would be more difficult to walk over, thus colonists should try and avoid it.
I have created the required body parts, body and creature, although I don't yet have graphics for it, and have created a new art item, its shell, which is very valuable.
I then went and tested it in combat and found that, due to its low speed, it is essentially defenseless.

Now, I have a few concerns with the design of this creature.
The first is that the slime trail will display similar problems to other traps, with colonists walking over it regularly and creature getting themselves killed. If this is the case, it'll only annoy the players and increase the need for micormanagement whenever a colonist leaves the base, something that can already be an issue if there are a lot of predators.

Also, because the shell is very valuable, it needs to present an equivalent challenge.
I can do this by increasing the creature's speed, but I'll then also need to vastly increase the frequency at which it spawns traps, which could very well create a performance load that I'm not comfortable with.
Alternatively, I could give it a projectile that utilizes the same corrosive agent as the slime trail, however, such a weapon could potentially be out-ranged with hunting and sniper rifles unless I made the projectile's range extremely high. This is also a solution that I'm not happy with.

Overall, I suspect that what I need to do is ditch the idea of the slime trail entirely and increase the carrion crawler's speed and damage, so that it is a formidable melee opponent. Doing this would solve the annoying pathing and damage issues associated with traps and remove the performance hit associated with a high spawn rate of buildings that are constantly being incremented.
Having said all of this, I would like a second opinion. Not only is this speculation at this point, but to rule out an entire mechanic as annoying without having other people's input on it seems premature.

So, to all of you who may be reading this, what do you think?

Also, feedback on he other monsters would be much appreciated.

Thank you all.
Title: Re: [B18] Monster Mash (v1.3.4) (4th Monster Released, 4th update)
Post by: wwWraith on March 06, 2018, 05:59:14 PM
Have you actually tested increased speed and slime spawning rates? If I'm not wrong, MiningCo.: Mining helmet (https://ludeon.com/forums/index.php?topic=14711.msg153940#msg153940) spawns a "buildings" to create the light around the pawn; I feel the performance hit, but it's not really heavy even on my very old computer, so probably it still could be an option.

Sniping is often effective against "challenging" enemies so I don't think it'd be a very productive idea to try to counter it with overrange.

I'm thinking about high armor values and some low-ranged attack(s) with debuff(s) like poison (either reducing HP on time or forcing to vomit) or capacities decrease. Maybe a sort of shield mechanics. If you still won't be satisfied with balancing the challenge and the shell value, you can make it to drop only with some chance. But I believe in your imagination. I like your mod as you are adding original features beyond what is commonly seen as limits rather than just making damage-soaking sponges. So I hope you'll keep it this way :)

I think it'll fit well in my next colony, but unfortunatelly can't say when I'll start it so sorry for no feedback for now.
Title: Re: [B18] Monster Mash (v1.3.4) (4th Monster Released, 4th update)
Post by: ilikegoodfood on March 08, 2018, 05:17:41 AM
Slow progress on the art front.

Meticulously patterning the shell of a snail in a way that looks decent is a very long job, much less synchronizing that pattern across four different angles. I'm not even sure what the angle for the statue version needs to be.
I am so not an artist, never done much with pixel art at all and this is stressing my capabilities.

The graphics for the baby was easy, so those are done. They're attached, in case anyone aside from wwWraith actually follows these intermittent progress reports.

[attachment deleted due to age]
Title: Re: [B18] Monster Mash (v1.3.4) (4th Monster Released, 4th update)
Post by: ilikegoodfood on March 08, 2018, 10:48:58 AM
And I'm back to making help threads... LINK (https://ludeon.com/forums/index.php?topic=39355.msg401139#msg401139)

Trying to get the shell to work as an art piece while not having random name and description has taken up all of my afternoon, and to no avail.

The creature itself is now pretty much done, the graphics are done, the armor, health, compatibility etc., but not yet the acidic vomit.
I did abandon the slime in the end, just because RimWorld doesn't handle traps well enough.

EDIT: Just waiting on help with the CompProperties_Art. Otherwise it all works nicely.
Title: Re: [B18] Monster Mash (v1.4) (5th Monster Released, 1st Update)
Post by: ilikegoodfood on March 09, 2018, 06:01:40 PM
Update 1.4 and 1.4.1

The Carrion Crawler is now out in the wilds.
This large, flesh eating land snail roams the arid shrublands of its native RimWorlds in a never ending quest to feed itself.

Tamable, Trainable, ride-able, but not suitable as a pack animal, this creature has a short range acid-vomit attack and a bite that'll punch through steel plate. Once killed, its shell makes for a beautiful trophy in any room.
Title: Re: [B18] Monster Mash (v1.4.1) (5th Monster Released, 1st Update)
Post by: ilikegoodfood on August 30, 2018, 09:34:06 AM
Well, a new version of RimWorld has come out, with the release of B19.

For me, this is the first time I've ever had to update a RimWorld mod between version, and more than that, I would like to do some tidying along the way. I don't rally have much of an idea as to what needs changing, although I do know that the texture system has been changed.

I would also like to split my variable bleed-rate into a tiny framework mod, so that it can be used as a stand-alone tool for other mods. As I understand it, this should reduce incompatibilities. As I'm still very much a novice at all this, and don't really play RimWorld much anymore, Help on the separation of the bleed rate, tidying up the xml files and such, as well as on the update process, would be much appreciated.

P.S. I'm in the process of re-hosting the gallery to imgur, so hopefully it won't disappear again in future.

EDIT: I also wanted to do a larger number of interesting creatures, but with my limited understanding of the code, this wasn't viable for me, and still isn't at the moment. If someone wanted to help with that more directly, then I could possibly implement some of my more ambitious monsters.
Title: Re: [B19] Monster Mash (v2) (Updated to B19)
Post by: ilikegoodfood on October 08, 2018, 09:02:22 AM
Apologies for the long wait, but it is finally here.
Monster Mash (B19) (https://steamcommunity.com/sharedfiles/filedetails/?id=1533841743)
Title: Re: [B19] Monster Mash (v2) (Updated to B19).0.1
Post by: ilikegoodfood on October 10, 2018, 07:39:02 AM
I am now seeking an artist to improve upon my rather-mediocre textures.
If you're interested, please respond in the dedicated help thread (https://ludeon.com/forums/index.php?topic=46114.msg438488#msg438488).
Title: Re: [B19] Monster Mash (v2.0.1) (Updated to B19)
Post by: ilikegoodfood on October 17, 2018, 09:31:13 AM
Attempts to reconfigure the Thermal Lance seem to be leading me inexorably towards a massive side-project to create the necessary functionality to support those changes. You can follow my project on that in the help section (https://ludeon.com/forums/index.php?board=14.0). I should be fairly obvious... Although I'm not sure I'll be undertaking the project, I am trying to at least get a simple prototype, just so that I have a better grasp of the scale of the changes I'd need to make.

As for updating this mod to 1.0, that is something that I will when 1.0 is pushed out to everyone as the primary version. Now that I'm familiar with the update process, it should be much faster than the B19 update, probably only a few days, maybe less, maybe more.

On-top of that, I'm still looking for an artist (https://ludeon.com/forums/index.php?topic=46114.msg438488#msg438488) to touch-up my textures. If and when that is done, I'll be updating the gallery and trying to get screen-shots with standardized dimensions.

Hope you all continue to enjoy my mod and thank you for your support, comments and ratings.
Title: Re: [B18-1.0] Monster Mash (v3) (Updated to 1.0)
Post by: ilikegoodfood on October 17, 2018, 05:09:42 PM
Update for RimWorld 1.0 is now out!

The mods that I have compatibility for have not yet updated, so I cannot test to see if the compatibility patches cause any errors. They shouldn't, but there is a small chance that they may. I'll check those mods regularly for updates, but there could be a short period between that and my updating my mod where they will not work together. If that happens, please let me know

Compatibility Patches are working perfectly. Enjoy!
Title: Re: [B18-1.0] Monster Mash (v3) (Updated to 1.0)
Post by: Griphaha on October 18, 2018, 02:36:40 PM
1.0 dropbox l8nk broken for me
Title: Re: [B18-1.0] Monster Mash (v3) (Updated to 1.0)
Post by: ilikegoodfood on October 18, 2018, 02:40:57 PM
That happens sometimes when I make a lot of small changes and uploads in quick succession. Fixed.
Thanks for letting me know.
Title: Re: [B18-1.0] Monster Mash (v3.0.1) (Updated to 1.0)
Post by: ilikegoodfood on November 05, 2018, 10:44:58 AM
A minor fix to the amount of Meat you get from butchering monsters has been released.

With regards to expanding the mod, I have finally started to seriously rebuild the Ranged Animal Framework from scratch as the Verb Expansion Framework. The folks over at the RimWorld Discord have been unbelievably helpful and the first step has gone well (humanoid raiders now recognize verbs from hediffs, and can shoot you with them). I imagine it'll take at the very least a few weeks, possibly a few months, to get everything working.

I need to change the Think Trees for animals, build a chooseRangedVerb function that approximates a verb's usefulness and selects the most damaging for AI and build an entire extension to the UI for player controlled pawns that have multiple verbs, as well as tweak the reporting system so that it correctly tells you what your colonist was shot with.

It's a big project and one I'm both exited and nervous about.
Title: Re: [B18-1.0] Monster Mash (v3.0.2) (Updated to 1.0)
Post by: ilikegoodfood on November 13, 2018, 05:23:53 AM
A minor fix to the trade value of the Carrion Crawler Shell and Thermal Core.
Also, all monsters can now be traded with the various types of combat merchant.
Title: Re: [B18-1.0] Monster Mash (v4.0) (Changed Frameworks and Dependancies)
Post by: ilikegoodfood on August 01, 2019, 02:34:45 PM
MonsterMash version 4.0 is finally out.

Sadly, this update does not include new content updates, but it provides a huge number of fixes that have become neccesary as time passed (and that no-one reported).


I am actively continuing development on the Verb Expansion Framework (Steam Workshop (https://steamcommunity.com/id/ilikegoodfood/myworkshopfiles/?appid=294100)) (Forum (https://ludeon.com/forums/index.php?topic=49335.0)), which I started a long time ago in order to facilitate some of the things I wanted to do with this mod.
Using features I hope to complete soon, I will performing a general overhaul of this mod.

Until then, this mod is working again, as it should be. Enjoy!
Title: Re: [B18-1.0] Monster Mash (v4.0) (Changed Frameworks and Dependancies)
Post by: Vehicular_Zombicide on August 01, 2019, 05:34:35 PM
Will there ever be a compatibility patch between this mod and Genetic Rim?
Title: Re: [B18-1.0] Monster Mash (v4.0) (Changed Frameworks and Dependancies)
Post by: ilikegoodfood on August 02, 2019, 03:19:17 AM
Quote from: Vehicular_Zombicide on August 01, 2019, 05:34:35 PM
Will there ever be a compatibility patch between this mod and Genetic Rim?

I would very much like there to be, although I don't yet know when I'll have time to get to it. The upcomming updates may be a resonable time to work on that too.
Title: Re: [B18-1.0] Monster Mash (v4.0.1) (Changed Frameworks and Dependancies)
Post by: ilikegoodfood on August 05, 2019, 05:23:44 PM
The first content update for MonsterMash in a very long time is now out!
Version 4.0.1 brings slight adjustments to all creatures, fixes and mod compatibility for Advanced Biomes, Nature's Pretty Sweet, Realistic Planets, and Terra Project.
Title: Re: [B18-1.0] Monster Mash (v4.0.2) (Changed Frameworks and Dependancies)
Post by: ilikegoodfood on August 29, 2019, 08:01:15 AM
Monster Mash Version 4.0.2 is now out, and along with it the version of the Polar Colossus that I originally envisaged.

The Polar Colossus now spawns with a set of three artificial bodyparts, the Thermal Core, Optical Targeting System and Thermal Lance Firing Assembly. Each one is roughly equivalent to an archotech bodypart, and grants powerful bonuses. When all three are installed on a pawn, the pawn gains the Thermal Lance Assembly and accompanying ranged attack (scales to body size).

Also finally fixed the tradability bug that has plagued this mod since release. All items, building and creatures are now tradable.

Near-future plans include the creation of a new mechanoid (technically two). Expect to see the Mechanoid Fabricator wandering the world, or occasionally dropping down among spaceship parts.
Title: Re: [B18-1.0] Monster Mash (v4.0.4) (Changed Frameworks and Dependancies)
Post by: ilikegoodfood on September 10, 2019, 11:59:23 AM
Monster Mash 4.0.4 brings breeding fixes for the Carrion Crawler and Inferno Beetle, prosthetics integration for AlphaAnimals and the ability to convert the new Thermal Core (artificial body part) into the old Thermal Core (building).

It also brings us our first localisation. The modder Trunken has kindly translated Monster Mash into German.