Jump to content

Recommended Posts

I created some items (Sakens Kiss, at Marihi and The Codex, at Wild Mare) and I realized that at some point mods will override each other, because there is not enough Vendors and there will be a lot of items mods.

 

So, I will try to gather all my mods in just one mod, at just one vendor, but I think we will have a problem in the future.

 

Is there any way to help/ solve this?

Edited by TT1
Link to comment
Share on other sites

I see this issue too for when I get around to creating Vendor mods.

 

We need some way to 'own' a vendor or OBS have to allow some merging of vendor mods

 

There are a lot of stringtable issues as well

 

One thing that occurs to me is that it appears (not checked cos not got to vendors yet) that you could make a non-vendor a vendor opening up thousands of potential vendors - simply thinking out loud here - dunno if it'd work

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

Stringtable independence isn't so much of a problem -- pick high enough constants and tweak them if they conflict.

 

Loot boxes (and I imagine vendors) are more of a problem since they generate from lists top-down rather than bottom up, but to fix that would require code changes in the base game...

Edited by ydaraishy
Link to comment
Share on other sites

I've been regex-ing out the level files today for UUIDs (basically I'm working out who / what is where)

 

There are 1,118 level files each of which contain between 0 and a lot UUIDs - e.g. Sanza's shop has > 100 uniques including Sanza + his pet)

 

Many are orphans but you can track down people and items to places then back-track to the map

 

That's where I'm up to

 

Expanding on this items will also be in there which allow the concept of modding a chest

 

I'll know more when I've done worldmap + items

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

One thing that occurs to me is that it appears (not checked cos not got to vendors yet) that you could make a non-vendor a vendor opening up thousands of potential vendors - simply thinking out loud here - dunno if it'd work

Coincidentally, I was doing a deep dive on vendors in the game code last night as I was investigating just how discounts worked, how they were tied to factions, and when they were applied.  Found out some interesting info (much of which isn't relevant to this topic).

 

Apparently, vendors are defined all over the various gamedatabundles, but I haven't quite figured out how they are all connected.

 

Near as I can figure, relevant entries that we care about (not counting their actual text dialogue) for vendors can be found in:

 

characters.gamedatabundle (gives the character stats, doesn't appear to have any store info in it though)

factions.gamedatabundle (gives the store the faction its tied to as well as any conditions for discounts/increases)

items.gamedatabundle (gives the loot list table for the store, loot lists can be nested with one referring to another)

xxxxxxxx.conversationbundle (where the store is actually opened/closed when talking with the relevant character/ship)

 

The thing that I can't suss if figuring out how the game knows a particular store is tied to a particular character unless it is tied into the level design data that isn't easily access by use peons yet.

 

Take for instance Sanza in Queen's Bearth.  He has the following info in factions.gamedatabundle:

{
			"$type": "Game.GameData.VendorGameData, Assembly-CSharp",
			"DebugName": "Vendor_03_Cartographer",
			"ID": "8d2d92e7-8a24-49bf-a2ba-542046f61e2a",
			"Components": [{
					"$type": "Game.GameData.VendorComponent, Assembly-CSharp",
					"VendorName": 143,
					"StoreIconPath": "gui/innicons/storesign_generic.png",
					"PortraitPath": "",
					"StartingFactionID": "1346f12d-ca42-4add-9599-aa3fe72f5e53",
					"ConditionalRates": [],
					"LockedDescriptionString": -1
				}
			]
		}

StartingFactionID ties his discounts/increases to the VTC and the discounts/increases they give when they're happy/upset.

 

And the following info in his conversationbundle:

			"OnExitScripts": [
				{
					"Data": {
						"FullName": "Void OpenStore(Guid)",
						"Parameters": [
							"faafe4d0-16e3-4d76-8b34-6d42132ecd84"
						],
						"UnrealCall": "",
						"FunctionHash": 215165789,
						"ParameterHash": 44899091
					},
					"Conditional": {
						"Operator": 0,
						"Components": []
					}
				}
			]

which opens his actual store.

 

The following Loot List is tied to him in items.gamedatabundle:

{
			"$type": "Game.GameData.LootListGameData, Assembly-CSharp",
			"DebugName": "Store_03_Cartographer",
			"ID": "1522b748-9761-4c17-981c-ebe76dfc5127",
			"Components": [{
					"$type": "Game.GameData.LootListComponent, Assembly-CSharp",
					"Conditional": {
						"Operator": 0,
						"Components": []
					},
					"OutputChance": 1,
					"OutputMode": "All",
					"Items": [{
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 5,
							"MaxCount": 5,
							"Weight": 1,
							"ItemID": "a5200562-c6ae-45b6-8d21-a3d331ae6f11",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "d9a9bf4e-8903-4806-9f93-ab7edc219fa4",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 3,
							"MaxCount": 5,
							"Weight": 1,
							"ItemID": "00000000-0000-0000-0000-000000000000",
							"LootListID": "7d73f078-a79e-4bf6-aa8c-c098226e2a7e",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 3,
							"MaxCount": 5,
							"Weight": 1,
							"ItemID": "00000000-0000-0000-0000-000000000000",
							"LootListID": "b0b26aec-689b-4e1a-944d-904dc986571d",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 3,
							"Weight": 1,
							"ItemID": "00000000-0000-0000-0000-000000000000",
							"LootListID": "5eb65b2e-0a71-4212-aa21-e28b201e6b8f",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 3,
							"MaxCount": 5,
							"Weight": 1,
							"ItemID": "00000000-0000-0000-0000-000000000000",
							"LootListID": "9ff68e84-9f26-4435-8292-7d4a9988ca81",
							"LockedVisible": "false"
						}
					]
				}
			]
		}

which gives the items he sells.

 

And his actual character entry, which doesn't seem to have any relevant info for us:

{
			"$type": "Game.GameData.CharacterStatsGameData, Assembly-CSharp",
			"DebugName": "CHA_22_HR_Cartographer",
			"ID": "c2c1af3a-1b5d-43c6-90a8-dbe5caaa4834",
			"Components": [{
					"$type": "Game.GameData.CharacterStatsComponent, Assembly-CSharp",
					"DisplayName": 489,
					"Gender": "Male",
					"RaceID": "5ea84750-17c7-419b-8beb-c121c5d68c55",
					"SubraceID": "48208f19-7f64-46f9-a68e-fbcb596b89eb",
					"CultureID": "00000000-0000-0000-0000-000000000000",
					"CharacterProgressionTableID": "92c24eac-7726-4200-bb06-b3ecb08025f2",
					"BaseClassLevel": 1,
					"SpeakerID": "e91bd37f-2196-43ae-80ff-21e0daf47e92",
					"NakedArmorMaterial": "None",
					"CreatureTypeGDID": "2b0d0783-3b60-4a67-abce-a5330f242833",
					"BestiaryEntryID": "00000000-0000-0000-0000-000000000000",
					"BackgroundID": "05594ae8-9d20-4592-97b5-62a1d69c1ddb",
					"KeywordsIDs": [],
					"BaseMight": 10,
					"BaseConstitution": 10,
					"BaseDexterity": 10,
					"BasePerception": 10,
					"BaseIntellect": 10,
					"BaseResolve": 10,
					"SkillsList": [],
					"ImmuneToEngagement": "false",
					"ImmuneToAttacks": "false",
					"PerceptionType": "Normal",
					"StealthDetectionID": "4b59d454-61f3-472f-906f-ff36afd861c0",
					"StealingAdjustmentID": "00000000-0000-0000-0000-000000000000",
					"StartingMaxEngageableEnemyCount": 0,
					"StartingAttackSpeedMultiplier": 1,
					"StartingRateOfFireMultiplier": 1,
					"StartingReloadTimeMultiplier": 1,
					"PersonalityID": "00000000-0000-0000-0000-000000000000",
					"AnimationAudioEventListID": "325265c3-af6f-410b-9c16-42964b602404",
					"MinLevelAdjustment": -50,
					"MaxLevelAdjustment": 50,
					"IsNamedCharacter": "false"
				}, {
					"$type": "Game.GameData.EquipmentSetComponent, Assembly-CSharp",
					"HeadID": "00000000-0000-0000-0000-000000000000",
					"NeckID": "00000000-0000-0000-0000-000000000000",
					"CapeID": "00000000-0000-0000-0000-000000000000",
					"ChestID": "382d5e63-6f49-4240-bfb1-45026bfe548f",
					"HandsID": "00000000-0000-0000-0000-000000000000",
					"RightHandRingID": "00000000-0000-0000-0000-000000000000",
					"LeftHandRingID": "00000000-0000-0000-0000-000000000000",
					"FeetID": "00000000-0000-0000-0000-000000000000",
					"WaistID": "00000000-0000-0000-0000-000000000000",
					"GrimoireOrTrinketID": "00000000-0000-0000-0000-000000000000",
					"PetID": "00000000-0000-0000-0000-000000000000",
					"WeaponSets": [],
					"PropsIDs": []
				}
			]
		}

What I can't figure out is how the game knows that LootList "1522b748-9761-4c17-981c-ebe76dfc5127" is tied to store "8d2d92e7-8a24-49bf-a2ba-542046f61e2a" and is opened when "faafe4d0-16e3-4d76-8b34-6d42132ecd84" is called in his conversation bundle.

 

Usually I can track this stuff down with the relevant info in the rest of the files, but this time I'm coming up empty.  :unsure:

 

Maybe I'm missing something in one of the databundles though.  Wouldn't surprise me given how complex this game is.

Link to comment
Share on other sites

I've been regex-ing out the level files today for UUIDs (basically I'm working out who / what is where)

 

There are 1,118 level files each of which contain between 0 and a lot UUIDs - e.g. Sanza's shop has > 100 uniques including Sanza + his pet)

 

Many are orphans but you can track down people and items to places then back-track to the map

 

That's where I'm up to

 

Expanding on this items will also be in there which allow the concept of modding a chest

 

I'll know more when I've done worldmap + items

 

Posted this while I was typing up my post. :)

 

So, yeah, looks like what I was looking for is tied in the level design then, yes?

Link to comment
Share on other sites

> What I can't figure out is how the game knows that LootList "1522b748-9761-4c17-981c-ebe76dfc5127" is tied to store "8d2d92e7-8a24-49bf-a2ba-542046f61e2a" and is opened when "faafe4d0-16e3-4d76-8b34-6d42132ecd84" is called in his conversation bundle.

$ grep -l 1522b748-9761-4c17-981c-ebe76dfc5127 *
items.gamedatabundle

In fact, that is the only instance where that UUID is seen in the bundles.

 

What items are these anyway?

sed -e 's/\[,,*/\[/g' items.gamedatabundle | jq '.GameDataObjects[] | select(.ID == 
"1522b748-9761-4c17-981c-ebe76dfc5127") | .Components[0].Items[].ItemID | select(. 
!= "00000000-0000-0000-0000-000000000000")'
"a5200562-c6ae-45b6-8d21-a3d331ae6f11"
"d9a9bf4e-8903-4806-9f93-ab7edc219fa4"

Resolving these to DebugNames:

sed -e 's/\[,,*/\[/g' items.gamedatabundle | jq '.GameDataObjects[] | select(.ID == 
"a5200562-c6ae-45b6-8d21-a3d331ae6f11" or .ID == "d9a9bf4e-8903-4806-9f93-
ab7edc219fa4") | .DebugName'
"GI_Spyglass"
"Lockpick"

What about the loot lists?

$ sed -e 's/\[,,*/\[/g' items.gamedatabundle | jq '.GameDataObjects[] | select(.ID 
== "1522b748-9761-4c17-981c-ebe76dfc5127") | .Components[0].Items[].LootListID | 
select(. != "00000000-0000-0000-0000-000000000000")'
"7d73f078-a79e-4bf6-aa8c-c098226e2a7e"
"b0b26aec-689b-4e1a-944d-904dc986571d"
"5eb65b2e-0a71-4212-aa21-e28b201e6b8f"
"9ff68e84-9f26-4435-8292-7d4a9988ca81"

$ sed -e 's/\[,,*/\[/g' items.gamedatabundle | jq '.GameDataObjects[] | select(.ID 
== "7d73f078-a79e-4bf6-aa8c-c098226e2a7e" or .ID == "b0b26aec-689b-4e1a-944d-
904dc986571d" or .ID == "5eb65b2e-0a71-4212-aa21-e28b201e6b8f" or .ID == "9ff68e84-
9f26-4435-8292-7d4a9988ca81") | .DebugName'
"Loot_Small_Consumables_Potions"
"Loot_Small_Consumables_Potions_Healing"
"Loot_Small_Consumables_Scrolls"
"Loot_Small_Lore_Books"

Can you kill Sanza? Is this effectively just his loot drop?

 

Since the OpenStore UUID isn't visible in any of the game bundles, perhaps this may be static/not exported.

Edited by ydaraishy
Link to comment
Share on other sites

What about the loot lists?

$ sed -e 's/\[,,*/\[/g' items.gamedatabundle | jq '.GameDataObjects[] | select(.ID 
== "1522b748-9761-4c17-981c-ebe76dfc5127") | .Components[0].Items[].LootListID | 
select(. != "00000000-0000-0000-0000-000000000000")'
"7d73f078-a79e-4bf6-aa8c-c098226e2a7e"
"b0b26aec-689b-4e1a-944d-904dc986571d"
"5eb65b2e-0a71-4212-aa21-e28b201e6b8f"
"9ff68e84-9f26-4435-8292-7d4a9988ca81"

$ sed -e 's/\[,,*/\[/g' items.gamedatabundle | jq '.GameDataObjects[] | select(.ID 
== "7d73f078-a79e-4bf6-aa8c-c098226e2a7e" or .ID == "b0b26aec-689b-4e1a-944d-
904dc986571d" or .ID == "5eb65b2e-0a71-4212-aa21-e28b201e6b8f" or .ID == "9ff68e84-
9f26-4435-8292-7d4a9988ca81") | .DebugName'
"Loot_Small_Consumables_Potions"
"Loot_Small_Consumables_Potions_Healing"
"Loot_Small_Consumables_Scrolls"
"Loot_Small_Lore_Books"

Can you kill Sanza? Is this effectively just his loot drop?

 

 

The Loot Lists are just a common pool for store sellers and various chests so, presumably, the game doesn't have to repeat them over and over again for various things.

 

To give one example, here is the code for the loot list "Loot_Small_Lore_Books":

{
			"$type": "Game.GameData.LootListGameData, Assembly-CSharp",
			"DebugName": "Loot_Small_Lore_Books",
			"ID": "7d73f078-a79e-4bf6-aa8c-c098226e2a7e",
			"Components": [{
					"$type": "Game.GameData.LootListComponent, Assembly-CSharp",
					"Conditional": {
						"Operator": 0,
						"Components": []
					},
					"OutputChance": 1,
					"OutputMode": "OneRandom",
					"Items": [{
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "00000000-0000-0000-0000-000000000000",
							"LootListID": "0c6bf95d-cc37-4cff-ba64-8c5999ce9ae9",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "00000000-0000-0000-0000-000000000000",
							"LootListID": "97b25457-a2be-470e-b4ee-7b9c0e28febc",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "00000000-0000-0000-0000-000000000000",
							"LootListID": "2873ba30-6008-496d-ab63-28a4a1df0ed7",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "00000000-0000-0000-0000-000000000000",
							"LootListID": "efa11f1a-6d67-4316-ae76-3e4dcaed1feb",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "00000000-0000-0000-0000-000000000000",
							"LootListID": "27906fbb-5bca-4d50-a915-4fd5b7318f75",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "00000000-0000-0000-0000-000000000000",
							"LootListID": "d507a8fd-742f-4257-84d5-21430d862124",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "00000000-0000-0000-0000-000000000000",
							"LootListID": "1a06c41f-34f0-404d-8f09-7e381a76a7e7",
							"LockedVisible": "false"
						}
					]
				}
			]
		}

"OutputMode: OneRandom" presumably means it will take one item from the list supplied.

 

In that list there are seven more sets of loot lists to choose from:

 

"0c6bf95d-cc37-4cff-ba64-8c5999ce9ae9":  ( "Loot_Small_Lore_Books_Aedyran")

"97b25457-a2be-470e-b4ee-7b9c0e28febc": ("Loot_Small_Lore_Books_Dyrwoodan")

"2873ba30-6008-496d-ab63-28a4a1df0ed7": ("Loot_Small_Lore_Books_Huana")

"efa11f1a-6d67-4316-ae76-3e4dcaed1feb": ("Loot_Small_Lore_Books_Rauataian")

"27906fbb-5bca-4d50-a915-4fd5b7318f75": ("Loot_Small_Lore_Books_Vailian")

"d507a8fd-742f-4257-84d5-21430d862124": ("Loot_Small_Lore_Books_Engwithan")

"1a06c41f-34f0-404d-8f09-7e381a76a7e7": ("Loot_Small_Lore_Books_General")

 

Each of those lists points to yet another list.  Let's just choose the first one ("0c6bf95d-cc37-4cff-ba64-8c5999ce9ae9") (it's long, so I'll put it in a spoiler box)

 

 

{
			"$type": "Game.GameData.LootListGameData, Assembly-CSharp",
			"DebugName": "Loot_Small_Lore_Books_Aedyran",
			"ID": "0c6bf95d-cc37-4cff-ba64-8c5999ce9ae9",
			"Components": [{
					"$type": "Game.GameData.LootListComponent, Assembly-CSharp",
					"Conditional": {
						"Operator": 0,
						"Components": []
					},
					"OutputChance": 1,
					"OutputMode": "OneRandom",
					"Items": [{
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "eb7cefb4-d975-4e2e-bc20-e2c3e85dde34",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "4159bb26-d808-400b-964c-c2e83bdd1f6d",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "f6756286-c011-4709-96e6-6fede4e2b499",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "b2fb9a81-21f5-4686-889c-a2f5a6d62f61",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "f0276b0c-7183-4bbd-80e8-885531a28d3a",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "df498f4f-69bc-4322-a58a-966f15cd6a06",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "7c4227c2-cce2-438a-adf6-aac9e6e51e4e",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "72c3a821-604c-4e01-a33b-1827579ce286",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "ca75c9c7-ca7d-4df9-99b0-ba74c26c04f7",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "01dedf46-9747-4697-a7b3-e8617d15b564",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "7f2805bf-4883-4d0f-897c-76aade56c601",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "bd98c69f-8144-4302-8a2e-b8b0dff55647",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "20f25393-30c0-400a-be1a-786177fc24bc",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "90b50dfd-6243-4848-94a7-6393451c5a81",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "95298842-2c95-4798-82f4-c77ad369a27f",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "8417e2b6-113d-495c-90ff-63f51390e731",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "5505de1b-c043-4377-a2e7-52deb5773309",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "66df1340-2cec-4023-8a2c-4adb693808bc",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "c9dfe01f-4c20-4e68-88dc-6b83ce6e6ae5",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "7e3379f0-b28f-46c0-a289-e761d663b616",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "50d2de59-9d8e-4a27-9f35-0bf22a188f97",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "ca71ef8b-e084-4306-999f-f17edfe97c45",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "0f42f903-3d58-4c93-94b8-74170334fd9a",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "614ea80f-37e5-4b28-b233-91c7a8bcfc48",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "f48c6e24-a5eb-4423-9cbb-f5f80d164a29",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "eef8ee41-07cb-437f-a5d1-ad6f2043916e",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "dff9da42-ce19-4e0b-9370-261e1124fb66",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "03e6163b-1b01-48ca-a02c-186801b807f9",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "a2000aa2-3275-42db-813a-e9a6f40ff72d",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}, {
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 1,
							"MaxCount": 1,
							"Weight": 1,
							"ItemID": "68d08a9f-c618-4e91-8092-b7a29149dc6c",
							"LootListID": "00000000-0000-0000-0000-000000000000",
							"LockedVisible": "false"
						}
					]
				}
			]
		}

 

 

We're finally at the end of the tree here.  Each of those codes corresponds to  a specific book in the game.  Once again, it will pick just one item from the list supplied.  For example, the game might pick "dff9da42-ce19-4e0b-9370-261e1124fb66" which is one of the Woedican Holy Texts ("Psalm to Woedica" in case people care).

 

So, basically, in this case, it's a branching tree to pick an item.  At the top of his loot list it also said this:

{
							"Conditional": {
								"Operator": 0,
								"Components": []
							},
							"OutputChance": 1,
							"MinCount": 3,
							"MaxCount": 5,
							"Weight": 1,
							"ItemID": "00000000-0000-0000-0000-000000000000",
							"LootListID": "7d73f078-a79e-4bf6-aa8c-c098226e2a7e",
							"LockedVisible": "false"
						}

The OutputChance of 1 means that there's a 100% chance the game will check the following list for items to put in the store/container.  The MInCount of 3 means that the list will be checked at least three times and the MaxCount of 5 means no more than five times.

 

The entire upshot of all that stuff above (including the many many many LootLists I didn't copy over, is that there will be three to five lore books in his store to be bought, randomly chosen from a bunch of different possibilities.

 

And that's just from one of his LootListID checks.  He has a few more.

 

Basically the real way to tell if something is checking another LootList is if the ItemID is blank.  If it is, it's pointing to another list.  If it isn't, you've either reached the end of a tree or there wasn't a tree to begin with, as in the case of the guaranteed Spyglass and lockpicks.

 

====

 

As for killing him and taking his stuff, the game handles that differently, though where it's defined I couldn't tell you right this moment.  So, no, killing him will NOT give you stuff he had for sale in his store.

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

1522b748-9761-4c17-981c-ebe76dfc5127

 

This is what I was on about with levels - it's explicitly referenced in level20 (Sanza's Store)

 

Any changes to it should result in changes owing to this reason

 

I've got a DB of all the GUIDs and which level file they occur in

 

It's not much use yet as I need to cross-reference this with the levels, characters, items etc (wrote a mod this AM - will get back to this sometime soon)

  • 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

OK - there's a huge shortfall in GUIDs

 

There are 17,113 in exported and 57,175 in levelXXXX

 

These are Unique per file ignoring 00000000-0000-0000-0000-000000000000

 

Some GUIDs are in multiple files I'm examining

 

But the breakdown ain't any better (far worse) 5,068 vs 44,200 

 

If anyone want's my data and knows how to drive MySQL drop me a note and I'll make it all available (anyone can do this so I'm simply saving time for other devs) - it's not well connected yet (lots of files yet to do) but I'll try to explain everything

 

Note that the MySQL only uses the English stringtables (so I can read them) - it's extremely easy to do extracts for other languages so if you need them just ask.

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

The above exploration was simply working out how the world works (trying to stuff crap in chests etc).

 

Tomorrow I'm gonna explore turning a named NPC into a vendor (cross fingers on this one)

 

Any scripted character can theoretically have their own shop - there's a script to open their store for example.

 

Think I'll try Waenglith (again)

 

I'll, obviously, share my frustrations and (hopefully) end result if I can get it to work

 

IF I get this working it'll completely remove the lack of vendors (last try didn't work)

  • 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

The above exploration was simply working out how the world works (trying to stuff crap in chests etc).

 

Tomorrow I'm gonna explore turning a named NPC into a vendor (cross fingers on this one)

 

Any scripted character can theoretically have their own shop - there's a script to open their store for example.

 

Think I'll try Waenglith (again)

 

I'll, obviously, share my frustrations and (hopefully) end result if I can get it to work

 

IF I get this working it'll completely remove the lack of vendors (last try didn't work)

Please tell me if you have any luck with this. Sounds really promising.

Link to comment
Share on other sites

Well, peardox seems to have all the ids in a database. Maybe in time we call work in something like this:

 

 

Could be nice to have a "create your own custom item" tool that write the gamedata files. Not so far, actually.

Link to comment
Share on other sites

Could be nice to have a "create your own custom item" tool that write the gamedata files. Not so far, actually. 

 
As I've mentioned elsewhere, jq will process the gamedata files for you. You can do things like copying an existing item and patching it with the changes you want, or you can work out a blank item JSON and merge your own changes into it. The technology exists already.
Edited by ydaraishy
Link to comment
Share on other sites

 

> Could be nice to have a "create your own custom item" tool that write the gamedata files. Not so far, actually.

 

As I've mentioned elsewhere, jq will process the gamedata files for you. You can do things like copying an existing item and patching it with the changes you want, or you can work out a blank item JSON and merge your own changes into it. The technology exists already.

Yeah, sure, but could be like this diablo editor, from the video. Something more friendly.

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