Jump to content

Modding Patch Notes for 1.2.0.0017


Recommended Posts

This is a list of changes from 1.1.1.0064 to 1.2.0.0017 that specifically affect modding the game. Thanks for your feedback and suggestions - we'll continue to implement more of these in the future. For full patch notes, see the thread Patch Notes for 1.2.0.0017.

 

Modding Patch Notes for 1.2.0.0017

  • Added the Mod Manager UI, which is accessed from the Options window on the Main Menu. This UI allows you to view installed mods, enabled and disable them, and change their load order.
     
  • Game Data Objects from mods can now partially override existing objects. Properties that a mod doesn't need to change can be deleted from the mod object and will be left unmodified.
     
  • Some textures in the game can be added or modified via mods. The textures should appear at the specified path inside the mod's override folder (e.g. "Override/MyMod/GUI/InnIcons/icon.png"). PNG and JPG images are supported. Some textures that can be modded this way include:
    • Large item icons (but not small ones) (ItemGameData.IconTextureLarge)
    • Loading screen images (LoadScreenComponent)
    • Inn room images (InnRoomComponent.DisplayImage)
    • Vendor logo images (VendorComponent.StoreIconPath)
    • Bestiary images (BestiaryEntryComponent.PicturePath)
    • Scripted interaction illustrations (SetInteractionImage script)
    • End-game slide images (SetEndGameSlide script)
    • Ship portrait images (ShipComponent.ShipPortrait)
  • (Breaking) Made it possible to add new classes via mods. Mods that change the following values will need to be updated.
    • Removed CharacterClassComponent.Type
    • CharacterProgressionDataComponent.HybridClassTitles moved to CharacterClassComponent.HybridClassTitles (on a per-class basis)
    • AbilitySettingsComponent.ClassResourceConversionRates moved to CharacterClassComponent.ResourceConversionRate (on a per-class basis)
    • Replaced StatusEffectValueType.Phrases/Wounds/Focus with generic StatusEffectValueType.AccruedResource.
    • Changed AIDecisionTreeDataComponent.CharacterClass from enum to Guid
    • Changed EquippableComponent.RestrictedToClass from enum[] to Guid[]
    • Changed GenericAbilityComponent.AbilityClass from enum to Guid
    • Changed StatusEffectComponent.ClassValue from enum to Guid
    • Changed ClassProgressionTable.CharacterClass from enum to Guid
    • Changed ProgressionPowerLevelRequirement.Class from enum to Guid
    • Changed StatusEffectAttackFilter.ClassType from enum to Guid
    • Changed StatusEffectDynamicValueAdjustment.Class from enum to Guid
  • Exposed BaseMaxFocus, MaxFocusPerLevel, and StartingFocusRatio on FocusTraitComponent
     
  • Fixed some syntax errors in base game gamedatabundles.
     
  • Removed BackgroundComponent.Type
     
  • Removed CharacterSubClassEnum
  • Removed CharacterSubClassComponent.Subclass
     
  • *.conversationbundle and conversation.manifest files can now be loaded from mod directories rather than only the root override directory.
  • Like 15
Link to comment
Share on other sites

Wow - cool stuff BMac

 

Have we done conversationbundles yet?

 

This is the main target of my article today

 

[Everyone else]

 

I'll be doing a clean on 1.2.0 and publishing it (I'm not convinced yet)

 

I'll leave 1.1.1 alone but next update will rotate

 

I take it some ppl will still like my prettified JSON so regardless of my research I'll do an update for the JSON stuff

Edited by peardox

OK Fair warning has been applied

 

I'm gonna move the domain to https://perspak.com early Feb but will keep all content

 

There are reasons behind this move which basically boil down to unifying my release schedule

 

My friends are welcome to play (I'll set you up your own areas if you desire them)

 

Please note that this process is messy so may take a few weeks 

Link to comment
Share on other sites

Yes, conversationbundles can now use mod override folders - they'll be searched for at the expected path inside each mod folder.  Good catch - I missed that and I've added it to the notes.

  • Like 3
Link to comment
Share on other sites

The only safe way to reload them right now is to quit to the main menu and Refresh in the mod manager.

 

You can force a hot reload by twiddling the state of one of your mods with the SetModLoadIndex or SetModEnabled commands, but this isn't something we officially support for this patch.  It will cause some problems with references to the data in the loaded game, which may be fixed by loading a save, but you still have a scene load to deal with there.

  • Like 3
Link to comment
Share on other sites

Did a test by doing a partial override of the FactionalHostilitySets in shiphostilitymanager entry in factions.gamedatabundle and it seems to be working.  :thumbsup:   The things I wanted to make hostile turned hostile, and everyone else is acting as in the base game.

 

A little leery of clipping too much from that Game Data Object as I don't know what the game needs to know what I'm overridding, but on first blush looks good.

  • Like 1
Link to comment
Share on other sites

How do we update the compatible Deadfire versions and mod version numbers in the manager Ui?

We have a tutorial that covers this and some other things coming out soon™.

 

Did a test by doing a partial override of the FactionalHostilitySets in shiphostilitymanager entry in factions.gamedatabundle and it seems to be working.  :thumbsup:   The things I wanted to make hostile turned hostile, and everyone else is acting as in the base game.

 

A little leery of clipping too much from that Game Data Object as I don't know what the game needs to know what I'm overridding, but on first blush looks good.

Unfortunately arrays are treated as a single property, so you won't be able to individually modify array elements or any properties on them.  If you specify any data for the array, what you specify will always completely replace the default.  The behavior the ships default to when they have no data probably just closely resembles what they were set to do.  I know there are a few use cases where modifying arrays would be very useful, so we'll see if we can do something about that in the next patch.

  • Like 3
Link to comment
Share on other sites

 

Did a test by doing a partial override of the FactionalHostilitySets in shiphostilitymanager entry in factions.gamedatabundle and it seems to be working.  :thumbsup:   The things I wanted to make hostile turned hostile, and everyone else is acting as in the base game.

 

A little leery of clipping too much from that Game Data Object as I don't know what the game needs to know what I'm overridding, but on first blush looks good.

Unfortunately arrays are treated as a single property, so you won't be able to individually modify array elements or any properties on them.  If you specify any data for the array, what you specify will always completely replace the default.  The behavior the ships default to when they have no data probably just closely resembles what they were set to do.  I know there are a few use cases where modifying arrays would be very useful, so we'll see if we can do something about that in the next patch.

 

 

More of a layman than I'd like to admit when it comes to much of this. :)  What qualifies as an array when it comes to the way the engine reads the gamedatabundle?

 

Going back to shiphostilitymanager (from factions.gamedatabundle) since I already mentioned it (spoilered because it's loooooong):

 

{
			"$type": "Game.GameData.ShipHostilityManager, Assembly-CSharp",
			"DebugName": "shiphostilitymanager",
			"ID": "ac548a26-688b-4ce3-9dc7-af68b020c787",
			"Components": [{
					"$type": "Game.GameData.ShipHostilityManagerComponent, Assembly-CSharp",
					"FactionHostilitySets": [{
							"FactionReferenceID": "0e5d53f8-8d15-4b45-9565-dc063cb24d30",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsReputation(Guid, RankType, Int32, Operator)",
											"Parameters": ["0e5d53f8-8d15-4b45-9565-dc063cb24d30", "Bad", "3", "GreaterThanOrEqualTo"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": -191386609,
											"ParameterHash": -1938889724
										},
										"Not": false,
										"Operator": 0
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean PlayerShipHasActiveUpgrade(Guid)",
											"Parameters": ["3fbac293-4650-4257-859e-67c8d167f29a"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": -641067011,
											"ParameterHash": -740842320
										},
										"Not": true,
										"Operator": 0
									}
								]
							}
						}, {
							"FactionReferenceID": "5325a7f1-0292-41bb-a223-2c84c005779a",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsReputation(Guid, RankType, Int32, Operator)",
											"Parameters": ["5325a7f1-0292-41bb-a223-2c84c005779a", "Bad", "3", "GreaterThanOrEqualTo"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": -191386609,
											"ParameterHash": 1197783645
										},
										"Not": false,
										"Operator": 0
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean PlayerShipHasActiveUpgrade(Guid)",
											"Parameters": ["cb9e3e3b-37ed-4301-a9f4-02f4588e8287"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": -641067011,
											"ParameterHash": -801277431
										},
										"Not": true,
										"Operator": 0
									}
								]
							}
						}, {
							"FactionReferenceID": "f3e9e979-e5bf-47b8-b1c3-208d76aa9b68",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalExpression, OEIFormats",
										"Operator": 1,
										"Components": [{
												"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
												"Data": {
													"FullName": "Boolean PlayerShipHasActiveUpgrade(Guid)",
													"Parameters": ["3fbac293-4650-4257-859e-67c8d167f29a"],
													"Flags": "",
													"UnrealCall": "",
													"FunctionHash": -641067011,
													"ParameterHash": -740842320
												},
												"Not": false,
												"Operator": 0
											}
										]
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalExpression, OEIFormats",
										"Operator": 1,
										"Components": [{
												"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
												"Data": {
													"FullName": "Boolean PlayerShipHasActiveUpgrade(Guid)",
													"Parameters": ["d315d6d7-bfcc-4520-abb5-4ce3c19ebcef"],
													"Flags": "",
													"UnrealCall": "",
													"FunctionHash": -641067011,
													"ParameterHash": -1246636609
												},
												"Not": false,
												"Operator": 0
											}
										]
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalExpression, OEIFormats",
										"Operator": 1,
										"Components": [{
												"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
												"Data": {
													"FullName": "Boolean PlayerShipHasActiveUpgrade(Guid)",
													"Parameters": ["12e3b9ba-6985-4f13-a44f-d4b54fa1e82b"],
													"Flags": "",
													"UnrealCall": "",
													"FunctionHash": -641067011,
													"ParameterHash": -1831365689
												},
												"Not": false,
												"Operator": 0
											}, {
												"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
												"Data": {
													"FullName": "Boolean IsReputation(Guid, RankType, Int32, Operator)",
													"Parameters": ["f3e9e979-e5bf-47b8-b1c3-208d76aa9b68", "Bad", "3", "GreaterThanOrEqualTo"],
													"Flags": "",
													"UnrealCall": "",
													"FunctionHash": -191386609,
													"ParameterHash": -1359339313
												},
												"Not": false,
												"Operator": 0
											}
										]
									}
								]
							}
						}, {
							"FactionReferenceID": "08abadbb-1d2e-4a3c-a8ca-0dbb19379428",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalExpression, OEIFormats",
										"Operator": 1,
										"Components": [{
												"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
												"Data": {
													"FullName": "Boolean PlayerShipHasActiveUpgrade(Guid)",
													"Parameters": ["3fbac293-4650-4257-859e-67c8d167f29a"],
													"Flags": "",
													"UnrealCall": "",
													"FunctionHash": -641067011,
													"ParameterHash": -740842320
												},
												"Not": false,
												"Operator": 0
											}
										]
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalExpression, OEIFormats",
										"Operator": 1,
										"Components": [{
												"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
												"Data": {
													"FullName": "Boolean PlayerShipHasActiveUpgrade(Guid)",
													"Parameters": ["0701564c-7535-44ac-adc0-3c373b3ffa7f"],
													"Flags": "",
													"UnrealCall": "",
													"FunctionHash": -641067011,
													"ParameterHash": 828470183
												},
												"Not": false,
												"Operator": 0
											}
										]
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalExpression, OEIFormats",
										"Operator": 1,
										"Components": [{
												"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
												"Data": {
													"FullName": "Boolean PlayerShipHasActiveUpgrade(Guid)",
													"Parameters": ["12e3b9ba-6985-4f13-a44f-d4b54fa1e82b"],
													"Flags": "",
													"UnrealCall": "",
													"FunctionHash": -641067011,
													"ParameterHash": -1831365689
												},
												"Not": false,
												"Operator": 0
											}, {
												"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
												"Data": {
													"FullName": "Boolean IsReputation(Guid, RankType, Int32, Operator)",
													"Parameters": ["08abadbb-1d2e-4a3c-a8ca-0dbb19379428", "Bad", "3", "GreaterThanOrEqualTo"],
													"Flags": "",
													"UnrealCall": "",
													"FunctionHash": -191386609,
													"ParameterHash": -1975487999
												},
												"Not": false,
												"Operator": 0
											}
										]
									}
								]
							}
						}, {
							"FactionReferenceID": "2d9b0cea-85af-4239-9704-17193f852b93",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsGlobalValue(String, Operator, Int32)",
											"Parameters": ["n_FQP_Slavers_Quest_Stage", "EqualTo", "0"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 901380568,
											"ParameterHash": -534981642
										},
										"Not": false,
										"Operator": 1
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsGlobalValue(String, Operator, Int32)",
											"Parameters": ["n_Crookspur_Kua_Outcome", "GreaterThan", "0"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 901380568,
											"ParameterHash": 1345774961
										},
										"Not": false,
										"Operator": 1
									}
								]
							}
						}, {
							"FactionReferenceID": "ff6021da-17bc-4dc4-a9a7-f4d3b89c045d",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": []
							}
						}
					],
					"CaptainOverrides": [{
							"CaptainReferenceID": "75cca647-cad6-4537-bf96-491957718230",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsGlobalValue(String, Operator, Int32)",
											"Parameters": ["n_FQP_Deadlight_Quest_Stage", "GreaterThanOrEqualTo", "7"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 901380568,
											"ParameterHash": 2050999125
										},
										"Not": true,
										"Operator": 0
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean PlayerShipHasActiveUpgrade(Guid)",
											"Parameters": ["3fbac293-4650-4257-859e-67c8d167f29a"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": -641067011,
											"ParameterHash": -740842320
										},
										"Not": true,
										"Operator": 0
									}
								]
							}
						}, {
							"CaptainReferenceID": "0e1bf362-d362-4910-ad79-6846d255c0b6",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsGlobalValue(String, Operator, Int32)",
											"Parameters": ["n_FQP_Deadlight_Quest_Stage", "GreaterThanOrEqualTo", "7"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 901380568,
											"ParameterHash": 2050999125
										},
										"Not": true,
										"Operator": 0
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean PlayerShipHasActiveUpgrade(Guid)",
											"Parameters": ["3fbac293-4650-4257-859e-67c8d167f29a"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": -641067011,
											"ParameterHash": -740842320
										},
										"Not": true,
										"Operator": 0
									}
								]
							}
						}, {
							"CaptainReferenceID": "b32a6637-f82a-430c-a8c3-ae23d34d7e43",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsGlobalValue(String, Operator, Int32)",
											"Parameters": ["n_FQP_Deadlight_Quest_Stage", "GreaterThanOrEqualTo", "7"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 901380568,
											"ParameterHash": 2050999125
										},
										"Not": true,
										"Operator": 0
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean PlayerShipHasActiveUpgrade(Guid)",
											"Parameters": ["3fbac293-4650-4257-859e-67c8d167f29a"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": -641067011,
											"ParameterHash": -740842320
										},
										"Not": true,
										"Operator": 0
									}
								]
							}
						}, {
							"CaptainReferenceID": "8d4a2255-bd4c-4228-b03b-b0167bd10357",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": []
							}
						}, {
							"CaptainReferenceID": "3e0d98e0-a16e-42d5-970a-c5d05fe09462",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": []
							}
						}, {
							"CaptainReferenceID": "c82d5813-34fd-4518-b159-aaf3de01ddf0",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": []
							}
						}, {
							"CaptainReferenceID": "7d228721-95f3-4c1f-ac9d-2095642faad8",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": []
							}
						}, {
							"CaptainReferenceID": "e80b4214-abd6-4cee-8fe1-723a7471db46",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": []
							}
						}, {
							"CaptainReferenceID": "eac3fd0a-8dbc-4e2c-beae-c6ada4c537ee",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "Submarine"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 583234889
										},
										"Not": true,
										"Operator": 0
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "GhostShip"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 59267328
										},
										"Not": true,
										"Operator": 0
									}
								]
							}
						}, {
							"CaptainReferenceID": "3e251b7e-152a-4ddf-bb23-23e7b52bddbb",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "Submarine"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 583234889
										},
										"Not": true,
										"Operator": 0
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "GhostShip"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 59267328
										},
										"Not": true,
										"Operator": 0
									}
								]
							}
						}, {
							"CaptainReferenceID": "cf176ca8-9569-4e67-93c4-0ec642880d75",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "Submarine"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 583234889
										},
										"Not": true,
										"Operator": 0
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "GhostShip"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 59267328
										},
										"Not": true,
										"Operator": 0
									}
								]
							}
						}, {
							"CaptainReferenceID": "643e0399-2722-4f8f-b28f-2edc6fc7ea05",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "Submarine"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 583234889
										},
										"Not": true,
										"Operator": 0
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "GhostShip"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 59267328
										},
										"Not": true,
										"Operator": 0
									}
								]
							}
						}, {
							"CaptainReferenceID": "d3bc51e7-3402-4089-89d8-1dde8b9283b5",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "Submarine"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 583234889
										},
										"Not": true,
										"Operator": 0
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "GhostShip"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 59267328
										},
										"Not": true,
										"Operator": 0
									}
								]
							}
						}, {
							"CaptainReferenceID": "b29cddd2-debb-4f04-b2cb-b2ceff5507f9",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "Submarine"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 583234889
										},
										"Not": true,
										"Operator": 0
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "GhostShip"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 59267328
										},
										"Not": true,
										"Operator": 0
									}
								]
							}
						}, {
							"CaptainReferenceID": "542e2ac4-aa96-477e-bf68-d8e43cd9e8fb",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "Submarine"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 583234889
										},
										"Not": true,
										"Operator": 0
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "GhostShip"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 59267328
										},
										"Not": true,
										"Operator": 0
									}
								]
							}
						}, {
							"CaptainReferenceID": "18c582bb-4656-4465-bd15-8a7e1849bb4b",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "Submarine"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 583234889
										},
										"Not": true,
										"Operator": 0
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "GhostShip"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 59267328
										},
										"Not": true,
										"Operator": 0
									}
								]
							}
						}, {
							"CaptainReferenceID": "3559d58f-35f6-4651-9b43-e967e0eb731a",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "Submarine"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 583234889
										},
										"Not": true,
										"Operator": 0
									}, {
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsShipType(ShipDuelParticipant, ShipType)",
											"Parameters": ["Player", "GhostShip"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": 1807620614,
											"ParameterHash": 59267328
										},
										"Not": true,
										"Operator": 0
									}
								]
							}
						}, {
							"CaptainReferenceID": "f3290000-50c9-479b-bc14-c7f6b4eb094b",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": []
							}
						}, {
							"CaptainReferenceID": "1fe39eee-72de-48fc-833a-b1e7627a276d",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": []
							}
						}, {
							"CaptainReferenceID": "0d89270d-411c-457b-a4d5-45f9c7a1a1ed",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": []
							}
						}, {
							"CaptainReferenceID": "49492c1a-e23a-4016-a574-d15d15087075",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": []
							}
						}, {
							"CaptainReferenceID": "36697624-0627-4fe0-8a70-42be06da8e6b",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": []
							}
						}, {
							"CaptainReferenceID": "e5e0d770-2ca3-401e-ab38-8ff2164df860",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": []
							}
						}, {
							"CaptainReferenceID": "0838c4aa-e595-4f3a-8318-070051424ec9",
							"HostilityConditionals": {
								"Operator": 0,
								"Components": [{
										"$type": "OEIFormats.FlowCharts.ConditionalCall, OEIFormats",
										"Data": {
											"FullName": "Boolean IsTeamRelationshipToPlayer(Guid, Relationship)",
											"Parameters": ["291d858a-516c-4470-afaa-de99360cbb4c", "Hostile"],
											"Flags": "",
											"UnrealCall": "",
											"FunctionHash": -1987818039,
											"ParameterHash": -622768946
										},
										"Not": false,
										"Operator": 0
									}
								]
							}
						}
					]
				}
			]
		}

 

 

 

Would everything inside "Components": [lots of stuff] be considered an array, or would it only be things like "FactionHostilitySets": [other stuff]?

 

As I look at most Game Data Objects, it seems most of the things we would care about changing are things that are inside "Components": as subsections, so I would presume that everything inside "Components": doesn't need to be copied over wholesale, just the blocks of code within it  that do.

 

Like, say I modify one entry in "FactionHostilitySets":, then if I understand what you are saying correctly I should keep ALL of the other entires within "FactionHostilitySets": as is so the game knows to execute them, but it is safe for me to chop off the "CaptainOverrides": [yet other stuff], as that won't be overridden?

 

If it's not that way, then I'll just wait for that tutorial to come out and study it until I understand things. :lol:

Link to comment
Share on other sites

Would everything inside "Components": [lots of stuff] be considered an array, or would it only be things like "FactionHostilitySets": [other stuff]?

 

An array is a property that has a list of things in it rather than just one value.  In JSON, you can identify them because the value(s) are inside [square braces].

{
  "Array":[1, 2, 3],
  "NotArray":4
},
{
  "ArrayOfObjects":[{"Name":"A"},{"Name":"B"}],
  "NotArrayObject":{"Name":"C"}
}

Yes, "Components" itself is technically an array, but we handle that one specially so you can override individual components and ignore others entirely.

 

The upcoming tutorial will cover this somewhat.

 

 

Like, say I modify one entry in "FactionHostilitySets":, then if I understand what you are saying correctly I should keep ALL of the other entires within "FactionHostilitySets": as is so the game knows to execute them, but it is safe for me to chop off the "CaptainOverrides": [yet other stuff], as that won't be overridden?

That's right.

  • Like 1
Link to comment
Share on other sites

Still broken - in a moment

 

 

Quick check - they nearly got it right

 

I've got a benign (only checks stuff) script

 

As you may have noticed I number things so this one is exported-1.2.0 (explanation before bug report)

 

exported-1.2.0/design/chatter/chatter.chatterbundle
JSON_ERROR_SYNTAX

 
That's the only one that fails - I can see what is likely wrong
 
Yep - sloppy
 
simon@Ubu:~/git/utils$ tail exported-1.2.0/design/chatter/chatter.chatterbundle
                        "OnExitScripts": [],
                        "OnUpdateScripts": []
                }
        ],
        "ClassExtender": {
                "ExtendedProperties": []
        }
},

]}

As I say - sloppy, the last comma invalids15M of data

 

Good luck in 1.2.1

 

Does anyone want my JSON and fixed versions of 1.2.0? It'll only take me a few minutes?

 

Err dumb question - of course you do

 

I'm only gonna do Zips this time as it takes ages to do the RAR + TGZ versions 

  • Like 1

OK Fair warning has been applied

 

I'm gonna move the domain to https://perspak.com early Feb but will keep all content

 

There are reasons behind this move which basically boil down to unifying my release schedule

 

My friends are welcome to play (I'll set you up your own areas if you desire them)

 

Please note that this process is messy so may take a few weeks 

Link to comment
Share on other sites

 

Would everything inside "Components": [lots of stuff] be considered an array, or would it only be things like "FactionHostilitySets": [other stuff]?

 

An array is a property that has a list of things in it rather than just one value.  In JSON, you can identify them because the value(s) are inside [square braces].

{
  "Array":[1, 2, 3],
  "NotArray":4
},
{
  "ArrayOfObjects":[{"Name":"A"},{"Name":"B"}],
  "NotArrayObject":{"Name":"C"}
}

Yes, "Components" itself is technically an array, but we handle that one specially so you can override individual components and ignore others entirely.

 

The upcoming tutorial will cover this somewhat.

 

 

Like, say I modify one entry in "FactionHostilitySets":, then if I understand what you are saying correctly I should keep ALL of the other entires within "FactionHostilitySets": as is so the game knows to execute them, but it is safe for me to chop off the "CaptainOverrides": [yet other stuff], as that won't be overridden?

That's right.

 

 

That explanation (and the exception about Components) explained everything perfectly.  Thanks as always. :)

 

(I'd say "You're the best", but I'd be afraid of being sued for copyright infringement from your fellow Obsidian poster :lol:

Edited by Zap Gun For Hire
Link to comment
Share on other sites

I keep running out of memory processing the JSON files

 

Trying to resolve this issue - gave it 4G

 

Might WAMP it as I've got 16Gb and 8Gb on the MAMP

 

Gimme a bit do  can debug myself

OK Fair warning has been applied

 

I'm gonna move the domain to https://perspak.com early Feb but will keep all content

 

There are reasons behind this move which basically boil down to unifying my release schedule

 

My friends are welcome to play (I'll set you up your own areas if you desire them)

 

Please note that this process is messy so may take a few weeks 

Link to comment
Share on other sites

Syntax fixes ey... I'll have to check one of the received status types that used to be recieved (English rule is "i before e except after c when the sound is ee" :p) that I was using.  A little heads up on some of those things would be good.  One of the Beckoner entries, for example, was Beckonter or something like that.  It was just a debug name so it shouldn't cause any problems but the statustype will.  I'll check soon.

 

Update: Nope.  Still "recieved" on some.  Saves a little search/replace.

 

Next on the list to look at: progressiontable changes.  New classes... cool.  Any control over multiclassing/subclass mixing options yet?  I'll be looking at that later but if anyone knows now (a dev would be ideal) that would save me time.  Cheers.

Edited by ferzal
Link to comment
Share on other sites

Yes, conversationbundles can now use mod override folders - they'll be searched for at the expected path inside each mod folder.

 

Darn it, I still can't get this to work. I put the modified bundle in override/MyMod/design/[required pathway] and the game just ignored it. Stop ignoring me, game. :getlost:

 

Maybe I'm just an idiot. I'll keep poking at it over the holiday tomorrow.

Link to comment
Share on other sites

Thanks for this. As a modder, this is exactly what I needed to know. Good job with all the changes! Even though I have to fix some of my mods, these changes will make any future modding much faster.

 

I just want to ask though, for the textures, where can we find the recommended image dimensions for each texture type? There aren't any examples in the exported folder last time I checked.

Link to comment
Share on other sites

 

Yes, conversationbundles can now use mod override folders - they'll be searched for at the expected path inside each mod folder.

 

Darn it, I still can't get this to work. I put the modified bundle in override/MyMod/design/[required pathway] and the game just ignored it. Stop ignoring me, game. :getlost:

 

Maybe I'm just an idiot. I'll keep poking at it over the holiday tomorrow.

 

I got it to work by NOT putting it in a /design folder.

 

Using override/<mymodfolder>/conversations/<targetfolder>

 

Worked like a charm.  :thumbsup:

  • Like 2
Link to comment
Share on other sites

Oooh, interesting. I'll give that a try.

I haven't played with the stringtables required to make a truly new dialogue, but as I understand it stringtables haven't been an issue.

 

What I did was a simple test by having Marihi give me all three possible unique weapons (Blades of the Endless Paths, Whispers of Yenwood, and Whispers of the Endless Paths) instead of just one via a full override (I copied her entire conversation bundle and simply edited Node 23), and got it to work:

 

skG1rHo.png

 

If that works, other more complicated overrides should also work

Edited by Zap Gun For Hire
Link to comment
Share on other sites

Before I start going all Dr. Frankenstein on my mods, do I have a correct understanding of how load order works? That is, if two mods which modify the same file, say mod A and mod B, are placed in the override folder, the game's default is to load them in alphabetical order, which means mod B wins. But if the user goes into the in-game mod manager and moves A later in the load order than B, then A wins. Is that right?

Link to comment
Share on other sites

Mega way cool

 

TT1 - check this out

 

This is a one line patch to the infamous Parrot

 

In your mod Directory create a piccy @ gui/icons/items/misc/dead_parrot.png

 

Now, simply change...

 

"IconTextureLarge": "gui/icons/items/misc/pet_white_bird_l.png",
 
To...
 
"IconTextureLarge": "gui/icons/items/misc/dead_parrot.png",
 
And we get this
 
@BMac - can we have IconTextureSmall as well please as this is a really great feature
 
I usually do 256x256 art or powers of 2 - 512, 1024, 2048 etc for a large - can we have a recommended size for art
 
That particular image is simply a test so can't let you have it - it's some guy's Parrot T-Shirt design and hence is © <someone>
 
I've got two artists who want to start adding modding contrubutions
 
I'll go contact them now
 

 

parrot.png

  • Like 2

OK Fair warning has been applied

 

I'm gonna move the domain to https://perspak.com early Feb but will keep all content

 

There are reasons behind this move which basically boil down to unifying my release schedule

 

My friends are welcome to play (I'll set you up your own areas if you desire them)

 

Please note that this process is messy so may take a few weeks 

Link to comment
Share on other sites

It was only a quick test I did on Sunday

 

If you do your Modder's slack (poe2.slack.com - invite only ATM - PM me your email for an invite) I've added a few comments to enthuse Hampster (@tonpix on slack)

 

As of this moment we can only do something like I show above (Large texture) but I've PM's @BMac reqing Small as well - you'll notice on that image the icon in the vendor's list is still the old one.

 

Don't bother trying - I already did - Small results in a missing icon (Big RED X)

 

As convos are now moddable I'm gonna finish off my morning with the usual readthru of important stuff then get back to doing that

 

It's fortunate that I had problems yesterday as today's will be worth actually doing stuff with (I was prepping people yesterday, today it's a reality)

OK Fair warning has been applied

 

I'm gonna move the domain to https://perspak.com early Feb but will keep all content

 

There are reasons behind this move which basically boil down to unifying my release schedule

 

My friends are welcome to play (I'll set you up your own areas if you desire them)

 

Please note that this process is messy so may take a few weeks 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...