[B18-1.0] Monster Mash (v4.0.4) (Changed Frameworks and Dependancies)

Started by ilikegoodfood, February 01, 2018, 09:40:33 AM

Previous topic - Next topic

ilikegoodfood

#30
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, 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.

wwWraith

#31
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. And probably you even want only one of isModLoaded or FindFile, not both of them.
Think about it. Think around it. Perhaps you'll get some new good idea even if it would be completely different from my words.

ilikegoodfood

#32
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.

ilikegoodfood

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>

ilikegoodfood

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.

wwWraith

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>
<!-- [...] -->
Think about it. Think around it. Perhaps you'll get some new good idea even if it would be completely different from my words.

ilikegoodfood

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]

Harry_Dicks


ilikegoodfood

#38
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.

wwWraith

Do you have defs for ThingDef/MonsterMash_ADSP_SimpleProstheticTentacleAnimal besides HediffDef/MonsterMash_ADSP_SimpleProstheticTentacleAnimal?
Think about it. Think around it. Perhaps you'll get some new good idea even if it would be completely different from my words.

ilikegoodfood

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.

wwWraith

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.
Think about it. Think around it. Perhaps you'll get some new good idea even if it would be completely different from my words.

ilikegoodfood

#42
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.
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.

wwWraith

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.
Think about it. Think around it. Perhaps you'll get some new good idea even if it would be completely different from my words.