Larian Banner: Baldur's Gate Patch 9
Previous Thread
Next Thread
Print Thread
Page 1 of 4 1 2 3 4
#583324 18/07/16 09:35 AM
Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
I noticed a quite problematic behaviour of the dialog system:

I check 'PartyHasItemTemplate' conditions for some nodes (for testing just one node). The structure is as follows:

1. Node 1 (push Node 2 and changeSubject).
2. Leave (end dialog).

-->select Node 1 push:
1. Node 2 (condition 'PartyHasItemTemplate' > 0)
2. changeSubject (pop 1, back to Node 1 and Leave).

-->select changeSubject
-->select Node 1 again (push Node 2 and changeSubject again)
-->select changeSubject again (pop 1, back to Node 1 and Leave).

Now: Actually I should be able to do this endlessly. But how often Node 2 appears depends on the amount of the item templates (checked with PartyHasItemTemplate) in the party inventory. So: amount 5 implies I can select Node 2 five times (because it stops to appear after 5 appearances). 4 implies four times, 3 three times and so on.

That's absolutely weird and breaks my system, and I don't know how to solve that problem. I can't just remove the conditions.

Any chance to solve that without using Osiris?


Last edited by Abraxas*; 18/07/16 10:20 AM.

My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2013
old hand
Offline
old hand
Joined: Jun 2013
Upload the file and I'll check it out, having trouble seeing what you're trying to do in the abstract.



Is it something like the dialog choice is:
NPC - Do you have any mushrooms to sell?
1. Yes, here's a mushroom (30GP)

And 1. repeats unlimited times until they are all sold?

Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
I don't have an OneDrive account or something like that. I give you a concrete description (it's just a simplified and nonsense example to reproduce the problem):

1. Wanna buy a mushroom?
2. Leave. (end dialog)

-->Select 1: push

NPC: Oh yes! I love mushrooms!

--> 1. Here's a mushroom. (check: PartyHasItemTemplate > 0)
2. changeSubject (pop 1)

Now: All I do is always selecting changeSubject here, so going back to 'Wanna buy a mushroom?' and 'Leave'. And then I select 'Wanna buy a mushroom?' again and so on. As I said above: The node 'Wanna buy a mushroom?' appears as many times as mushrooms are in my party inventory. And after that there's just 'changeSubject', so I have to restart the dialog, and the same thing happens again.


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2013
old hand
Offline
old hand
Joined: Jun 2013
Just open the .lsx file in a notepad and paste the info in here in a [code] block. That should work instead of uploading it.

I have a few ideas but am still a bit confused :P

Last edited by SniperHF; 18/07/16 06:31 PM.
Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Okay, here it is (probably the deepest dialog ever written in literary history):

Code
<?xml version="1.0" encoding="UTF-8" ?>
<save>
    <header version="2" time="1468867211" />
    <version major="2" minor="0" revision="0" build="0" />
    <region id="keywordDialog">
        <node id="root">
            <attribute id="KeywordVoiced" value="0" type="19" />
            <attribute id="PlayGreeting" value="1" type="19" />
            <attribute id="keywordAutoImport" value="0" type="19" />
            <children>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="064bef0f-70f3-4b10-bd05-a7f4b6e3dc68" type="22" />
                    <attribute id="keywordContentMapValue" value="Greetings." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="333405bf-10c7-42cd-960f-a88fdc467f84" type="22" />
                    <attribute id="keywordContentMapValue" value="Nice to see you." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="499a9845-5a7f-4d25-adf2-ffba4f51a6bb" type="22" />
                    <attribute id="keywordContentMapValue" value="Here&apos;s a mushroom." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="5d6b1020-d4c6-40de-b6f3-feabba7316a1" type="22" />
                    <attribute id="keywordContentMapValue" value="Bye bye." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="6271d4cf-f1f5-41bb-872a-4b7222ea017d" type="22" />
                    <attribute id="keywordContentMapValue" value="" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="ad6048a8-3db9-441e-80ba-ef328335897a" type="22" />
                    <attribute id="keywordContentMapValue" value="You&apos;re so generous!" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="bf7d62fd-9677-4988-9e56-d6301a7b4e74" type="22" />
                    <attribute id="keywordContentMapValue" value="Oh yes! I love mushrooms!" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="d601bdf6-b16a-4d5e-92b7-ea6fda0a603e" type="22" />
                    <attribute id="keywordContentMapValue" value="Change Subject..." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="ea86faf7-1c86-4e51-9868-aaa0b34ad10b" type="22" />
                    <attribute id="keywordContentMapValue" value="Wanna buy a mushroom?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="f477eb60-c46e-47b0-b8b8-544735728298" type="22" />
                    <attribute id="keywordContentMapValue" value="Leave." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value="" type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="064bef0f-70f3-4b10-bd05-a7f4b6e3dc68" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Greeting" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="1" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="333405bf-10c7-42cd-960f-a88fdc467f84" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value="" type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="ea86faf7-1c86-4e51-9868-aaa0b34ad10b" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Offer" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="1" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Mushroom" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="changeSubject" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="bf7d62fd-9677-4988-9e56-d6301a7b4e74" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value="" type="23" />
                    <attribute id="keywordConditions" value='CONDITION PartyHasItemTemplate(&quot;CON_Herb_Mushroom_A_0106e3c1-bd81-4118-8a28-59c6dc941feb&quot;,1,&gt;,0,0)&#x0D;&#x0A;CHECK &quot;c1&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="499a9845-5a7f-4d25-adf2-ffba4f51a6bb" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Mushroom" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="ad6048a8-3db9-441e-80ba-ef328335897a" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value="" type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="f477eb60-c46e-47b0-b8b8-544735728298" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Leave." type="22" />
                    <attribute id="keywordLast" value="1" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="1" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="1" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="5d6b1020-d4c6-40de-b6f3-feabba7316a1" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value="" type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="d601bdf6-b16a-4d5e-92b7-ea6fda0a603e" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="changeSubject" type="22" />
                    <attribute id="keywordLast" value="1" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="2" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="6271d4cf-f1f5-41bb-872a-4b7222ea017d" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordSpeakerNames" />
            </children>
        </node>
    </region>
</save>



Last edited by Abraxas*; 18/07/16 06:46 PM.

My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2013
old hand
Offline
old hand
Joined: Jun 2013
Okay after looking at this, I'm still confused hahaha

What's the desired behavior?


You want the node 2 to be able to reappear independent of how many of the item templates you have?

Joined: Jun 2013
old hand
Offline
old hand
Joined: Jun 2013
Originally Posted by Abraxas*


Now: Actually I should be able to do this endlessly. But how often Node 2 appears depends on the amount of the item templates (checked with PartyHasItemTemplate) in the party inventory. So: amount 5 implies I can select Node 2 five times (because it stops to appear after 5 appearances). 4 implies four times, 3 three times and so on.

That's absolutely weird and breaks my system, and I don't know how to solve that problem. I can't just remove the conditions.


Okay, now I think I get a bit more what you mean. I've seen this behavior and it is indeed bizarre. My best guess is this query PartyHasItemTemplate is just broken.

I tested this by simply using HasItemTemplate Instead, which only checks the speaker and not the party. It works perfectly, the option repeats itself unlimited times(not based on the # of mushrooms) since there is no ACTION to remove the template as of yet.

Also I suspect the PARTY version is broken, because when you click the little button next to the conditions:
[Linked Image]

It's simply not in the list:
[Linked Image]

I've used PartyhasItemTemplate myself but I only did it for a specific quest item and it worked fine. Perhaps it was only partially implemented for such an occasion or a vestige from an old game and not properly updated for D:OS.


So if you can get by with only checking the speaker for the item template, HasItemTemplate will do the job. If you must check the whole party, you could get the whole party involved in the dialog. Though the conditions on that would be pretty complicated.

Or use Osiris.

Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Quote

So if you can get by with only checking the speaker for the item template, HasItemTemplate will do the job. If you must check the whole party, you could get the whole party involved in the dialog. Though the conditions on that would be pretty complicated.

Okay, seems broken then. Thank you for research. Using HasItemTemplate won't be possible, so I'll create character dialog flags with Osiris but it would have been much more comfortable in dialog itself.
When script and dialog are finished it will be more plausible. It will be like: 1. Crafting --> 1. Item 1. 2. Item 2. ... --> 1. Amount one. 2. Amount five. 3. Amount ten. --> 1. Back to crafting 2. More. 3. Leave.
So 'Back to crafting' will display all available crafting recipes again but many didn't show up a second time when just one of the necessary templates was available.


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Done! If you're interested you can take a look at it.

Have you ever used 'ItemEquipped' in Osiris? It doesn't seem to work either.


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2013
old hand
Offline
old hand
Joined: Jun 2013
Sure, post up what you have :P

I have some Item stuff going on in ANC but not sure if I used that one specifically. It might have been more based on item handle though. I can check later.

Last edited by SniperHF; 20/07/16 08:28 PM.
Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by Abraxas*
Done! If you're interested you can take a look at it.

Have you ever used 'ItemEquipped' in Osiris? It doesn't seem to work either.


Do you want to catch equipping for a specific item that you placed in the world and made global ?

The ItemEquipped event will only be executed for those - named items - if you want an event for a non global item, you'd have to use ItemTemplateEquipped.

Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Quote
Sure, post up what you have :P

Sent you a PM.

Quote
Do you want to catch equipping for a specific item that you placed in the world and made global ?

The ItemEquipped event will only be executed for those - named items - if you want an event for a non global item, you'd have to use ItemTemplateEquipped.

Ah, thank you! That's the point, I think. The problem is: I want to catch all items (armor) the player equips and store them in a database. ItemTemplateEquipped doesn't give me a handle for those items. Do you know a way to do that?
I found a way to script an All-Armor-Transfer but I want to exclude equipped armor pieces.



My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2013
old hand
Offline
old hand
Joined: Jun 2013
I think you can run this query in a statement:
CharacterGetEquippedWeapon(CHARACTER Character, OUT INT ItemHandle)

But you'd have to find some convenient time to run the statement.

Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Short answer: possible for weapons and shields (and offhand weapons if they count as a 'shield'), in very special cases possible for the rest.

Longer explanation (and some Larian rant ;-):

You can only register equipped weapons and shields with the CharacterGetEquippedWeapon() and CharacterGetEquippedShield() queries, but you cannot get the handle of any armor equipped, including jewelry.

You could register the handle of an armor piece in the ItemTemplateAddedToCharacter() event together with the ItemHandleIsEquippable() query, but that would only tell you that an equippable item was added to a character, not that the specific handle was actually equipped.
Even if you built a database with added equippable items you could never make the connection when an armor piece is equipped, only in the special case when the ItemTemplateIsInCharacterInventory( _Char, _Template, _Count ) query returns with _Count == 1, that is, if there is only ONE equippable of the specific template in the char's inventory.
(Equipped stuff also counts as inventory I think. Rings and amulets for example each only use three different templates, except for special quest and story stuff like the Phantom Amulet or Icara's Blessing which have their own templates, so you can guess how high the chances for duplicates are.)

The GetItemhandleForItemTemplateInInventory() query will give you ANY handle of the specified template be it equipped or just sit in the inventory, I believe.
(The query seems to return one item only and no tuple, as I had once expected, it must be some 'top or bottom of the stack' thing, probably the order in which items where added - this might be the case for your 'dialog problem' too: a stack gets queried and some internal index incremented on every query and never reset as long as the dialog is still active, and if this internal index is above the last stack index, nothing is returned anymore. Larian has tons of 'implemented for current special requirements' story code, and the fact that they never documents anything does not help. So I assume that 'weird and unexpected behaviour' is also possible in dialogs, we just don't understand it because we have absolutely no documentation.)

Larian would have to change the Osiris API to include the handle in the Equipped event or add something to query all equipped gear not only weapons and shields. (Better not change the API but add a new and this time complete event ... and think of more generic solutions in the future instead of 'fits current need' programming.)

The Osiris API is VERY far from complete, Larian seems to add calls or queries only when they currently need them, they build them the way they currently need them no matter how weird or unexpected for outsiders without access to any documentation ... not to mention misleading names.
So nothing they never needed in their projects seems present, for example there are no getters or setters for character and item script variables through handles, which are more generic than ITEMs, the API is even only halfway complete for ITEMs.
(Okay, there is ItemHandleGetVarString() but nothing else ... they probably never needed that. More generic programming of course is impossible because of that. Don't expect too much of DOS2 or - god beware - a complete or close to complete API ...)

You have done a lot with character and item scripts I suppose and the situation there is not much better if at all ... or is there an OnResurrected() event ? (... which on the other hand exists in Osiris ...)

I'm sorry that I cannot give more help or hope, I did a lot of work with Osiris recently and learned a lot, but what you want to do seems impossible to me, except for weapons and shields.
(I hope that a dual wielded offhand weapon counts as shield in the Osiris context, but it would not surprise me at all if it did not, if only real shields counted ... because they never ... you guessed it ! ;-)

Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Okay, thank you for your answer(s). I tried it both with Osiris and character scripts for armor and didn't find a solution either. Good to know your thoughts about that, so I'm not tempted to spend more time on it. Weapon transfer is already possible in my script. Maybe I'll add some transfer commands for other item types but it would have been quite useful if possible for armor.


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Dialog lines for Sniper (doesn't work via PM):
Code
<?xml version="1.0" encoding="UTF-8" ?>
<save>
    <header version="2" time="1469463188" />
    <version major="2" minor="0" revision="0" build="0" />
    <region id="keywordDialog">
        <node id="root">
            <attribute id="KeywordVoiced" value="0" type="19" />
            <attribute id="PlayGreeting" value="1" type="19" />
            <attribute id="keywordAutoImport" value="0" type="19" />
            <children>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="09130c57-bf3a-4e1a-898f-fb5900b1b0bc" type="22" />
                    <attribute id="keywordContentMapValue" value="(Attributes &amp; Abilities)" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="0b44c4b5-9ef6-4ab5-90b5-a6f2f22d0672" type="22" />
                    <attribute id="keywordContentMapValue" value="(Other)" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="10c82a87-1fbd-478a-9071-3c551423b4a0" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="15baf2dc-a325-480a-8412-55610d5ce65c" type="22" />
                    <attribute id="keywordContentMapValue" value="Okay. 10." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="17344108-213e-4f31-ae2a-28bb84353c5d" type="22" />
                    <attribute id="keywordContentMapValue" value="How many?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="1ef0a93a-3e7a-45a8-8805-31e7e68b0a23" type="22" />
                    <attribute id="keywordContentMapValue" value="" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="272bf4b1-7f61-437f-b640-3058d5f5e9ef" type="22" />
                    <attribute id="keywordContentMapValue" value="" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="29d420e8-7176-42ef-8dac-75211be4af05" type="22" />
                    <attribute id="keywordContentMapValue" value="Craft Healing Potions." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="2c047cd9-ecc4-4ee2-849b-cb7087b18a22" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="2c7a4e06-b1e1-4ec7-9c4c-7e2851025ee7" type="22" />
                    <attribute id="keywordContentMapValue" value="Water Ballon (Water Bottle)." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="2d567c2d-8253-49d1-9be0-ebaacc26cb07" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="3a9a9e56-23e4-4e73-8cf6-59b7f5dc1cd5" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="4055b8c0-2deb-49c8-a6a4-31fa7b029092" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="4217c124-8e65-4589-95f8-eba857fad11b" type="22" />
                    <attribute id="keywordContentMapValue" value="At your service." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="451582bf-fda6-42b9-86a2-d1352237d728" type="22" />
                    <attribute id="keywordContentMapValue" value="Okay. 5." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="46213924-9dac-4afd-80fa-1eaa7e87da29" type="22" />
                    <attribute id="keywordContentMapValue" value="(Resistance)" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="4ad00ec5-cbff-4d43-8b3c-d5f83efe3ac5" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="4f3f9f4a-4414-49c5-a50a-ad90d8afbd34" type="22" />
                    <attribute id="keywordContentMapValue" value="Grenades." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="53172144-3792-4907-a584-4787d92a1029" type="22" />
                    <attribute id="keywordContentMapValue" value="How many?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="546f9cfc-e454-4c0e-bcd3-6a039836ae92" type="22" />
                    <attribute id="keywordContentMapValue" value="How many?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="566798de-2950-48cf-beef-0faf89e55cf0" type="22" />
                    <attribute id="keywordContentMapValue" value="Arrow Shaft." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="5be67fc2-f652-4cc1-98e7-17010b9ad4c7" type="22" />
                    <attribute id="keywordContentMapValue" value="Arrows." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="5cdab289-bcbf-4e2d-a998-4ea9c7521f59" type="22" />
                    <attribute id="keywordContentMapValue" value="Scroll Fire." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="5fdb8754-ff61-4cdf-9d64-de3f74cab2ca" type="22" />
                    <attribute id="keywordContentMapValue" value="Healing Potion (Medium)." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="61e2f37e-8254-4aec-8720-6abe19972eac" type="22" />
                    <attribute id="keywordContentMapValue" value="Pixie Dust (Bone Dust)." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="65356330-dda4-4201-a030-3259107f5e1e" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="6699600a-7382-43fa-a06e-a4d341a15bb7" type="22" />
                    <attribute id="keywordContentMapValue" value="" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="66c61456-cee6-4c89-9af4-9fb751776147" type="22" />
                    <attribute id="keywordContentMapValue" value="Please craft something else." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="68b9027c-a219-444c-a8ea-7c16c66712d1" type="22" />
                    <attribute id="keywordContentMapValue" value="Craft Poison Potion." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="6d43c997-a0f9-46ff-81c4-e4e32ff91a86" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="7077ef63-3e8d-4c1c-b37f-ef95d3d05390" type="22" />
                    <attribute id="keywordContentMapValue" value="Five." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="70914a99-9ae3-475a-ac01-07a40e8e77b3" type="22" />
                    <attribute id="keywordContentMapValue" value="What shall I craft?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="71cd2878-a530-4453-b280-ef62f9ea8004" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="72a15c18-f36b-4255-8f57-d5744332d786" type="22" />
                    <attribute id="keywordContentMapValue" value="How many?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="7371dbb7-e497-4b02-8a16-5deed1a1f7d3" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="74c95cea-61f5-42eb-af1d-55eb56467d28" type="22" />
                    <attribute id="keywordContentMapValue" value="Byebye." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="7534a296-b5e9-4105-9f28-358afaa5aec9" type="22" />
                    <attribute id="keywordContentMapValue" value="How many?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="75a94854-1b31-4cea-8816-017ced16f357" type="22" />
                    <attribute id="keywordContentMapValue" value="What is your request?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="76df9a32-4882-47f3-9ade-59ec09d2441f" type="22" />
                    <attribute id="keywordContentMapValue" value="Arrow Utility." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="864a0390-c05c-4eb5-b286-bfe04c96ca2b" type="22" />
                    <attribute id="keywordContentMapValue" value="(Healing)" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="8a8897bd-ca5e-40d9-b483-f56a0c04384c" type="22" />
                    <attribute id="keywordContentMapValue" value="What is your order?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="8ab40e27-60df-4506-873c-f931d23c4195" type="22" />
                    <attribute id="keywordContentMapValue" value="Water Ballon (Water Cup)." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="8ac4c3d8-7213-4f89-ac4a-8724122abab4" type="22" />
                    <attribute id="keywordContentMapValue" value="How many?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="8c968637-64ce-4630-aab4-f77406223170" type="22" />
                    <attribute id="keywordContentMapValue" value="How many?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="8dab84b3-dcd9-4079-a4f6-da91d78825a3" type="22" />
                    <attribute id="keywordContentMapValue" value="Let&apos;s see..." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="946e375f-21bf-4688-9ada-99c5a2ed52dc" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="96fd8642-7950-41da-8e85-f686efd15794" type="22" />
                    <attribute id="keywordContentMapValue" value="Now,...?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="9a3c0570-cda5-42b1-a786-444914f719b0" type="22" />
                    <attribute id="keywordContentMapValue" value="Please craft something for me." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="9a7a9a2f-3148-4da3-a1bc-45fec31c3a9b" type="22" />
                    <attribute id="keywordContentMapValue" value="Stunning." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="a0217dd3-d552-49cf-9ac6-dfa4dbdba509" type="22" />
                    <attribute id="keywordContentMapValue" value="As you wish, friend." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="a039da9d-985c-4bb7-ac9e-77f7885cb8ba" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="a5270911-e1b0-47da-93a2-e16be4e17707" type="22" />
                    <attribute id="keywordContentMapValue" value="How many?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="a7cf66aa-e917-481a-9e22-aacf99d1dcd3" type="22" />
                    <attribute id="keywordContentMapValue" value="How many?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="a9e50b21-af7d-4db5-a2a5-e360f55f1720" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="aa116eb7-4725-4a7a-b037-20b55789152b" type="22" />
                    <attribute id="keywordContentMapValue" value="How many?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="ab5cacfd-f21b-43a0-ae3f-fb05bd838ce5" type="22" />
                    <attribute id="keywordContentMapValue" value="How many?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="ae8fb2a1-1d29-40df-929d-d155d28286e6" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="af92a5d9-c878-4c66-bbd6-f8534530625e" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="afe4d5d9-82e1-4ac4-b621-5dd167d65c0e" type="22" />
                    <attribute id="keywordContentMapValue" value="Potions." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="b545b707-5b27-460e-9f55-d36230a6d060" type="22" />
                    <attribute id="keywordContentMapValue" value="Resources and Utility." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="b5e51dde-8f32-499b-af68-3fc23e2f654b" type="22" />
                    <attribute id="keywordContentMapValue" value="One." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="b7c69895-acb5-4d59-8db9-903e58371463" type="22" />
                    <attribute id="keywordContentMapValue" value="Okay. 1." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="b9027130-2539-417c-8bec-0ee06f86803b" type="22" />
                    <attribute id="keywordContentMapValue" value="What shall I craft?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="b9afd96c-117f-4bf7-a0a4-b1f74d71bcff" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="bd1d55e2-47e8-4b89-820c-c93fd5eeb599" type="22" />
                    <attribute id="keywordContentMapValue" value="Leave." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="c2f91c51-4fe2-4ab7-a23f-5266e5a54f71" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="c838e2ce-c462-4116-8809-692889b65991" type="22" />
                    <attribute id="keywordContentMapValue" value="How many?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="c8425b10-0615-41bb-b89e-deed7859c759" type="22" />
                    <attribute id="keywordContentMapValue" value="Explosive." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="cb7b31ae-bcb3-431c-8330-9d8a3126153d" type="22" />
                    <attribute id="keywordContentMapValue" value="All right." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="d1a83cfc-850f-4fdf-8b03-f9f3a4957cbb" type="22" />
                    <attribute id="keywordContentMapValue" value="How many?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="d294066c-a83c-4beb-ac33-a48f68cb2c7a" type="22" />
                    <attribute id="keywordContentMapValue" value="What shall I craft?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="d77ae627-a7d1-456f-a3e6-959a52b39a49" type="22" />
                    <attribute id="keywordContentMapValue" value="" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="d94b5c3a-862f-42d9-be57-f03ce74fb351" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="dac9af4c-781d-46a2-ae22-8052959867bf" type="22" />
                    <attribute id="keywordContentMapValue" value="What type of item?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="dbe74038-8e9f-452f-9150-9ae2c66cf19c" type="22" />
                    <attribute id="keywordContentMapValue" value="Skillbook Fire." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="dfb746cd-2c03-4771-bdc0-c887dbf6b802" type="22" />
                    <attribute id="keywordContentMapValue" value="More." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="e2cde3b3-4609-4143-9801-f0e80c73b7f6" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="e3764775-3ea8-4c35-b592-1cab32908877" type="22" />
                    <attribute id="keywordContentMapValue" value="How many?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="e57bafa9-6efc-4afe-b0c3-8f4b88da70ab" type="22" />
                    <attribute id="keywordContentMapValue" value="Fine." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="e5c8d3e0-c97e-4506-b55c-44fad197f788" type="22" />
                    <attribute id="keywordContentMapValue" value="" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="e76cdba0-55fc-45ee-bd68-2a2c0b424110" type="22" />
                    <attribute id="keywordContentMapValue" value="How many?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="e877f862-0db8-497d-a09e-13ac9da67863" type="22" />
                    <attribute id="keywordContentMapValue" value="What shall I craft?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="ec40081e-f0fc-4667-8c9c-f64b308c4f53" type="22" />
                    <attribute id="keywordContentMapValue" value="ArrowHead Explosive (Oil Cup)." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="ec89029e-d32d-47a5-bdad-e53b64633872" type="22" />
                    <attribute id="keywordContentMapValue" value="What shall I craft?" handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="ed837c13-40cf-443f-899e-7e25b26b4a1b" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="f127caa9-a30b-41f2-ad3d-384587b0fb20" type="22" />
                    <attribute id="keywordContentMapValue" value="Alright." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="f5141b09-8fa4-4973-8200-2f9f0f0b316f" type="22" />
                    <attribute id="keywordContentMapValue" value="Yes." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="f5517c8a-cb1e-448c-8ff6-ec7bba48ba81" type="22" />
                    <attribute id="keywordContentMapValue" value="Fire." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="f7ace437-ea4e-42d1-911b-64210678a055" type="22" />
                    <attribute id="keywordContentMapValue" value="Ten." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordContentMap">
                    <attribute id="keywordContentMapKey" value="fbbf7693-dd9b-4d9d-b2ef-3b2188f06d8b" type="22" />
                    <attribute id="keywordContentMapValue" value="Head Stunning." handle="ls::TranslatedStringRepository::s_HandleUnknown" type="28" />
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value="" type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="6699600a-7382-43fa-a06e-a4d341a15bb7" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Greeting" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="1" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="75a94854-1b31-4cea-8816-017ced16f357" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="8a8897bd-ca5e-40d9-b483-f56a0c04384c" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="4217c124-8e65-4589-95f8-eba857fad11b" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="96fd8642-7950-41da-8e85-f686efd15794" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value="" type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="9a3c0570-cda5-42b1-a786-444914f719b0" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Crafting" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="1" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="f127caa9-a30b-41f2-ad3d-384587b0fb20" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="cb7b31ae-bcb3-431c-8330-9d8a3126153d" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="d94b5c3a-862f-42d9-be57-f03ce74fb351" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="a0217dd3-d552-49cf-9ac6-dfa4dbdba509" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="8dab84b3-dcd9-4079-a4f6-da91d78825a3" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Arrows" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Arrow Utility" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Grenades" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Potions" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Resources and Utility" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Leave" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="dac9af4c-781d-46a2-ae22-8052959867bf" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;ARW_&quot;,0,1)' type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="5be67fc2-f652-4cc1-98e7-17010b9ad4c7" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Arrows" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="a039da9d-985c-4bb7-ac9e-77f7885cb8ba" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Arrow Explosive" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Arrow Fire" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Arrow Stunning" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="e877f862-0db8-497d-a09e-13ac9da67863" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;ARWI_&quot;,0,1)' type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="76df9a32-4882-47f3-9ade-59ec09d2441f" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Arrow Utility" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="6d43c997-a0f9-46ff-81c4-e4e32ff91a86" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="ArrowHead Stunning" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Arrow Head Explo (Cup)" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="ArrowShaft" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="ec89029e-d32d-47a5-bdad-e53b64633872" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;GRN_&quot;,0,1)' type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="4f3f9f4a-4414-49c5-a50a-ad90d8afbd34" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Grenades" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="946e375f-21bf-4688-9ada-99c5a2ed52dc" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Water Ballon (Bottle)" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Water Ballon (Cup)" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="70914a99-9ae3-475a-ac01-07a40e8e77b3" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;POT_&quot;,0,1)' type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="afe4d5d9-82e1-4ac4-b621-5dd167d65c0e" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Potions" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="3a9a9e56-23e4-4e73-8cf6-59b7f5dc1cd5" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Buffs" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Healing" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Resistance" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Other" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="d294066c-a83c-4beb-ac33-a48f68cb2c7a" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;UTI_&quot;,0,1)' type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="b545b707-5b27-460e-9f55-d36230a6d060" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Resources and Utility" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="a9e50b21-af7d-4db5-a2a5-e360f55f1720" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="PixieDust (Bone)" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Scroll Fire" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Skillbook Fire" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="b9027130-2539-417c-8bec-0ee06f86803b" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value="" type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="864a0390-c05c-4eb5-b286-bfe04c96ca2b" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Healing" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="0.1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Healing Potion" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Healing Potion (Medium)" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="1ef0a93a-3e7a-45a8-8805-31e7e68b0a23" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value="" type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="46213924-9dac-4afd-80fa-1eaa7e87da29" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Resistance" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="272bf4b1-7f61-437f-b640-3058d5f5e9ef" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value="" type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="09130c57-bf3a-4e1a-898f-fb5900b1b0bc" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Buffs" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="0.1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="d77ae627-a7d1-456f-a3e6-959a52b39a49" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value="" type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="0b44c4b5-9ef6-4ab5-90b5-a6f2f22d0672" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Other" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="0.1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="e5c8d3e0-c97e-4506-b55c-44fad197f788" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;Amount1&quot;,0,1)&#x0D;&#x0A;&#x0D;&#x0A;' type="23" />
                    <attribute id="keywordConditions" value='CONDITION IsCharacterFlag(&quot;MoreThan0&quot;,0,1)&#x0D;&#x0A;CHECK &quot;c1&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="b5e51dde-8f32-499b-af68-3fc23e2f654b" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Amount 1" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Again Crafting" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Leave" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="b7c69895-acb5-4d59-8db9-903e58371463" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;Amount5&quot;,0,1)&#x0D;&#x0A;&#x0D;&#x0A;' type="23" />
                    <attribute id="keywordConditions" value='CONDITION IsCharacterFlag(&quot;MoreThan4&quot;,0,1)&#x0D;&#x0A;CHECK &quot;c1&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="7077ef63-3e8d-4c1c-b37f-ef95d3d05390" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Amount 5" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Again Crafting" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Leave" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="451582bf-fda6-42b9-86a2-d1352237d728" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;Amount10&quot;,0,1)&#x0D;&#x0A;&#x0D;&#x0A;' type="23" />
                    <attribute id="keywordConditions" value='CONDITION IsCharacterFlag(&quot;MoreThan9&quot;,0,1)&#x0D;&#x0A;CHECK &quot;c1&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="f7ace437-ea4e-42d1-911b-64210678a055" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Amount 10" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Again Crafting" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Leave" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="15baf2dc-a325-480a-8412-55610d5ce65c" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;ResourceCheck&quot;,0,1)' type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="dfb746cd-2c03-4771-bdc0-c887dbf6b802" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Again Crafting" type="22" />
                    <attribute id="keywordLast" value="1" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 1" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 5" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 10" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="e57bafa9-6efc-4afe-b0c3-8f4b88da70ab" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="1" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="546f9cfc-e454-4c0e-bcd3-6a039836ae92" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;RemoveDB&quot;,0,1)' type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="66c61456-cee6-4c89-9af4-9fb751776147" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Back to Crafting" type="22" />
                    <attribute id="keywordLast" value="1" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Arrow Utility" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Arrows" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Grenades" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Potions" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Resources and Utility" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Leave" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="4055b8c0-2deb-49c8-a6a4-31fa7b029092" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;RemoveDB&quot;,0,1)' type="23" />
                    <attribute id="keywordConditions" value="" type="23" />
                    <attribute id="keywordDisplayedText" value="bd1d55e2-47e8-4b89-820c-c93fd5eeb599" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Leave" type="22" />
                    <attribute id="keywordLast" value="1" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="1" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="1" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="74c95cea-61f5-42eb-af1d-55eb56467d28" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;POT_HealSmall&quot;, 0, 1)&#x0D;&#x0A;' type="23" />
                    <attribute id="keywordConditions" value='CONDITION IsCharacterFlag(&quot;POT_HealSmallTrue&quot;,0,1)&#x0D;&#x0A;CHECK &quot;c1&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="29d420e8-7176-42ef-8dac-75211be4af05" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Healing Potion" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="&#x0D;&#x0A;" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 10" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 1" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 5" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="c2f91c51-4fe2-4ab7-a23f-5266e5a54f71" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="0.1" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="e3764775-3ea8-4c35-b592-1cab32908877" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;POT_HealMedium&quot;, 0, 1)' type="23" />
                    <attribute id="keywordConditions" value='CONDITION IsCharacterFlag(&quot;POT_HealMediumTrue&quot;,0,1)&#x0D;&#x0A;CHECK &quot;c1&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="5fdb8754-ff61-4cdf-9d64-de3f74cab2ca" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Healing Potion (Medium)" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 1" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 5" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 10" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="2c047cd9-ecc4-4ee2-849b-cb7087b18a22" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="0.1" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="ab5cacfd-f21b-43a0-ae3f-fb05bd838ce5" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;POT_PoisonSmall&quot;, 0, 1)' type="23" />
                    <attribute id="keywordConditions" value='CONDITION IsCharacterFlag(&quot;POT_PoisonSmallTrue&quot;,0,1)&#x0D;&#x0A;CHECK &quot;c1&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="68b9027c-a219-444c-a8ea-7c16c66712d1" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Poison Potion (Small)" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 5" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 1" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 10" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="f5141b09-8fa4-4973-8200-2f9f0f0b316f" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="0.1" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="c838e2ce-c462-4116-8809-692889b65991" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;ARWI_ShaftBranch&quot;, 0, 1)' type="23" />
                    <attribute id="keywordConditions" value='CONDITION IsCharacterFlag(&quot;ARWI_ShaftBranchTrue&quot;,0,1)&#x0D;&#x0A;CONDITION HasItemTemplate(&quot;FUR_Cutlery_Knife_A_262a9a07-c20f-41b0-8747-343886cc34c1&quot;,0,&gt;,0)&#x0D;&#x0A;CONDITION HasItemTemplate(&quot;FUR_Rich_Knife_A_b8c69b5d-2b10-4001-b63f-c968b7b79376&quot;,0,&gt;,0)&#x0D;&#x0A;CONDITION HasItemTemplate(&quot;WPN_PocketKnife_1b6b6f74-b0cf-4411-9e66-62d859206e99&quot;,0,&gt;,0)&#x0D;&#x0A;CHECK &quot;c1&amp;(c2|c3|c4)&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="566798de-2950-48cf-beef-0faf89e55cf0" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="ArrowShaft" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="2d567c2d-8253-49d1-9be0-ebaacc26cb07" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="0.1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 1" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 5" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 10" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="aa116eb7-4725-4a7a-b037-20b55789152b" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;GRN_WaterBallonCup&quot;, 0, 1)' type="23" />
                    <attribute id="keywordConditions" value='CONDITION IsCharacterFlag(&quot;GRN_WaterBallonCupTrue&quot;,0,1)&#x0D;&#x0A;CHECK &quot;c1&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="8ab40e27-60df-4506-873c-f931d23c4195" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Water Ballon (Cup)" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="e2cde3b3-4609-4143-9801-f0e80c73b7f6" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="0.1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 1" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 5" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 10" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="8ac4c3d8-7213-4f89-ac4a-8724122abab4" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;GRN_WaterBallonBottle&quot;, 0, 1)' type="23" />
                    <attribute id="keywordConditions" value='CONDITION IsCharacterFlag(&quot;GRN_WaterBallonBottleTrue&quot;,0,1)&#x0D;&#x0A;CHECK &quot;c1&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="2c7a4e06-b1e1-4ec7-9c4c-7e2851025ee7" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Water Ballon (Bottle)" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="4ad00ec5-cbff-4d43-8b3c-d5f83efe3ac5" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="0.1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 1" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 5" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 10" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="53172144-3792-4907-a584-4787d92a1029" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;UTI_PixieDustBone&quot;, 0, 1)' type="23" />
                    <attribute id="keywordConditions" value='CONDITION IsCharacterFlag(&quot;UTI_PixieDustBoneTrue&quot;,0,1)&#x0D;&#x0A;CHECK &quot;c1&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="61e2f37e-8254-4aec-8720-6abe19972eac" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="PixieDust (Bone)" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="ae8fb2a1-1d29-40df-929d-d155d28286e6" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="0.1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 1" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 5" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 10" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="72a15c18-f36b-4255-8f57-d5744332d786" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;ARW_Fire&quot;, 0, 1)' type="23" />
                    <attribute id="keywordConditions" value='CONDITION IsCharacterFlag(&quot;ARW_FireTrue&quot;,0,1)&#x0D;&#x0A;CHECK &quot;c1&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="f5517c8a-cb1e-448c-8ff6-ec7bba48ba81" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Arrow Fire" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="65356330-dda4-4201-a030-3259107f5e1e" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="0.1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 1" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 5" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 10" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="d1a83cfc-850f-4fdf-8b03-f9f3a4957cbb" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;ARW_Stunning&quot;, 0, 1)' type="23" />
                    <attribute id="keywordConditions" value='CONDITION IsCharacterFlag(&quot;ARW_StunningTrue&quot;,0,1)&#x0D;&#x0A;CHECK &quot;c1&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="9a7a9a2f-3148-4da3-a1bc-45fec31c3a9b" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Arrow Stunning" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="b9afd96c-117f-4bf7-a0a4-b1f74d71bcff" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="0.1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 1" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 5" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 10" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="17344108-213e-4f31-ae2a-28bb84353c5d" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;ARW_Explosive&quot;, 0, 1)' type="23" />
                    <attribute id="keywordConditions" value='CONDITION IsCharacterFlag(&quot;ARW_ExplosiveTrue&quot;,0,1)&#x0D;&#x0A;CHECK &quot;c1&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="c8425b10-0615-41bb-b89e-deed7859c759" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Arrow Explosive" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="10c82a87-1fbd-478a-9071-3c551423b4a0" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="0.1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 1" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 5" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 10" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="e76cdba0-55fc-45ee-bd68-2a2c0b424110" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;ARWI_ArrowHeadStunning&quot;, 0, 1)' type="23" />
                    <attribute id="keywordConditions" value='CONDITION IsCharacterFlag(&quot;ARWI_ArrowHeadStunningTrue&quot;,0,1)&#x0D;&#x0A;CONDITION HasItemTemplate(&quot;FUR_Cutlery_Knife_A_262a9a07-c20f-41b0-8747-343886cc34c1&quot;,0,&gt;,0)&#x0D;&#x0A;CONDITION HasItemTemplate(&quot;FUR_Rich_Knife_A_b8c69b5d-2b10-4001-b63f-c968b7b79376&quot;,0,&gt;,0)&#x0D;&#x0A;CONDITION HasItemTemplate(&quot;WPN_PocketKnife_1b6b6f74-b0cf-4411-9e66-62d859206e99&quot;,0,&gt;,0)&#x0D;&#x0A;CHECK &quot;c1&amp;(c2|c3|c4)&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="fbbf7693-dd9b-4d9d-b2ef-3b2188f06d8b" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="ArrowHead Stunning" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="af92a5d9-c878-4c66-bbd6-f8534530625e" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="0.1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 1" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 5" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 10" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="8c968637-64ce-4630-aab4-f77406223170" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;ARWI_HeadExplosiveOil&quot;, 0, 1)' type="23" />
                    <attribute id="keywordConditions" value='CONDITION IsCharacterFlag(&quot;ARWI_HeadExplosiveOilTrue&quot;,0,1)&#x0D;&#x0A;CHECK &quot;c1&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="ec40081e-f0fc-4667-8c9c-f64b308c4f53" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Arrow Head Explo (Cup)" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 1" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 5" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 10" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="ed837c13-40cf-443f-899e-7e25b26b4a1b" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="0.1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 1" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 5" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 10" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="a5270911-e1b0-47da-93a2-e16be4e17707" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;UTI_BlankScrollFire&quot;, 0, 1)' type="23" />
                    <attribute id="keywordConditions" value='CONDITION IsCharacterFlag(&quot;UTI_BlankScrollFireTrue&quot;,0,1)&#x0D;&#x0A;CHECK &quot;c1&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="5cdab289-bcbf-4e2d-a998-4ea9c7521f59" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Scroll Fire" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="7371dbb7-e497-4b02-8a16-5deed1a1f7d3" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="0.1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 1" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 5" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 10" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="a7cf66aa-e917-481a-9e22-aacf99d1dcd3" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordNode">
                    <attribute id="ResetRotation" value="0" type="19" />
                    <attribute id="ZoomCamera" value="1" type="19" />
                    <attribute id="keywordActions" value='ACTION SetCharacterFlag(&quot;UTI_BookBlankFire&quot;, 0, 1)' type="23" />
                    <attribute id="keywordConditions" value='CONDITION IsCharacterFlag(&quot;UTI_BookBlankFireTrue&quot;,0,1)&#x0D;&#x0A;CHECK &quot;c1&quot;' type="23" />
                    <attribute id="keywordDisplayedText" value="dbe74038-8e9f-452f-9150-9ae2c66cf19c" type="22" />
                    <attribute id="keywordDisplayedTextVoiced" value="0" type="19" />
                    <attribute id="keywordId" value="Skillbook Fire" type="22" />
                    <attribute id="keywordLast" value="0" type="19" />
                    <attribute id="keywordOwner" value="-1" type="4" />
                    <attribute id="keywordShow" value="0" type="19" />
                    <attribute id="keywordSource" value="0" type="5" />
                    <children>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="0" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="0" type="5" />
                            <attribute id="keywordWaitSeconds" value="3" type="6" />
                            <children>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="71cd2878-a530-4453-b280-ef62f9ea8004" type="22" />
                                </node>
                            </children>
                        </node>
                        <node id="keywordText">
                            <attribute id="PopCount" value="1" type="5" />
                            <attribute id="keywordActions" value="" type="23" />
                            <attribute id="keywordConditions" value="" type="23" />
                            <attribute id="keywordEmotion" value="0" type="5" />
                            <attribute id="keywordEndDialog" value="0" type="19" />
                            <attribute id="keywordPushPop" value="1" type="5" />
                            <attribute id="keywordSpeaker" value="0" type="5" />
                            <attribute id="keywordSpeakerOverride" value="" type="23" />
                            <attribute id="keywordStub" value="1" type="19" />
                            <attribute id="keywordTransition" value="1" type="5" />
                            <attribute id="keywordWaitSeconds" value="0.1" type="6" />
                            <children>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 1" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 5" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Amount 10" type="22" />
                                </node>
                                <node id="keywordSubnode">
                                    <attribute id="Object" value="Back to Crafting" type="22" />
                                </node>
                                <node id="keywordTextUid">
                                    <attribute id="Object" value="7534a296-b5e9-4105-9f28-358afaa5aec9" type="22" />
                                </node>
                            </children>
                        </node>
                    </children>
                </node>
                <node id="keywordSpeakerNames" />
            </children>
        </node>
    </region>
</save>



Last edited by Abraxas*; 25/07/16 04:21 PM. Reason: Dialog update

My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Quote
You have done a lot with character and item scripts I suppose and the situation there is not much better if at all ... or is there an OnResurrected() event ? (... which on the other hand exists in Osiris ...)

Yeah, no OnResurrected. I would also love OnMovementFailed (not just as INTERRUPT event) to improve AI, and much more.

Quote
(I hope that a dual wielded offhand weapon counts as shield in the Osiris context, but it would not surprise me at all if it did not, if only real shields counted ... because they never ... you guessed it ! ;-)

You guessed right. Second weapon is no shield and only first hand weapons will be checked, so second weapon cannot be checked and handled. At least a dual wielding check exists in character scripts (CharacterHasWeaponType) but I haven't tested if it's functional (and wouldn't help at all in this case).


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
A short question for engine experts:

Will it cause problems if keyword texts in a dialog have the same Uid, so no unique id? I have a lot of copy-pasting to do and these Uid lines are in my way...

Code
<node id="keywordTextUid">
       <attribute id="Object" value="2c047cd9-ecc4-4ee2-849b-cb7087b18a22" type="22" />


Can I re-use them?

There are no issues, as far as I see, but that's just the empirical side from worm's-eye view...


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2013
old hand
Offline
old hand
Joined: Jun 2013
I have no idea if that would cause a problem or not.

There's a "Fix UUID's" command in the menus of the keyword editor. Save your work to a different file and try running that.

There used to be a problem in the classic version of the keyword editor where the UUID would get messed up and the keyword would display the node name and not the text you gave it. I haven't run into that problem with enhanced. The Fix UUIDs thing was meant to fix those errors and I think it would deal with your repeats just the same.

Last edited by SniperHF; 29/07/16 08:30 PM.
Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Oh, that's a fine suggestion! I'll try that tomorrow.


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Hm, I'm pretty curious about your project.

You know that there are free online UUID generators on the internet ?
I used one to create new root templates in the time before the editor was released.

Haven't used the dialog editor myself and will not before a re-introduction to it with the tutorial video, but wouldn't it be safer to create a new dialog in the editor and copy&paste the existing dialog lines you need ?

Better safe than sorry if you are unsure. Using the editor should make sure you get uniques and don't have to worry about this.

If you have one and the same UUID for different texts in one file, then I would definitely expect problems. Should not risk that.

Joined: Jun 2013
old hand
Offline
old hand
Joined: Jun 2013
Those UUID generators seems like a good idea in lieu of the fix button not automatically taking care of it.

Originally Posted by FrauBlake


Haven't used the dialog editor myself and will not before a re-introduction to it with the tutorial video, but wouldn't it be safer to create a new dialog in the editor and copy&paste the existing dialog lines you need ?


That's pretty laborious in the keyword editor. I don't know the entire scope of what Abraxas is working on, but I know it involves quite a lot of nodes.


Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
'Fix button' ?

I haven't used the dialog editor yet but probably I will have to soon.
I copied a standard Cyseal Civilian dialog to the story directory for my black hole trader and registered the dialog via DB_Dialogs(). But he refuses to speak, although I gave him the same speaker as one of the civilians.
(Does not matter much for now because I only needed a dialog to get access to the trade button.)

But I definitely have re-used UUIDs by only copying a file (and renaming it) instead of creating a new one, maybe that's why he refuses to talk.
(On a side note, I also have no clue how that 'Speaker Manager' works either. ;-)

The site I used before was https://www.uuidgenerator.net/version4 . (Still use it if required)

Joined: Jun 2013
old hand
Offline
old hand
Joined: Jun 2013
Originally Posted by FrauBlake
'Fix button' ?

I haven't used the dialog editor yet but probably I will have to soon.


Just the menu option I was talking about last page. Can't remember exactly what menu it's in offhand.

Quote

I copied a standard Cyseal Civilian dialog to the story directory for my black hole trader and registered the dialog via DB_Dialogs(). But he refuses to speak, although I gave him the same speaker as one of the civilians.
(Does not matter much for now because I only needed a dialog to get access to the trade button.)/quote]

I have some barebones dialog templates I can upload if you want to try those.

[quote]
But I definitely have re-used UUIDs by only copying a file (and renaming it) instead of creating a new one, maybe that's why he refuses to talk.


I'd be surprised if that's it since when broken dialogs load they either display incorrect information or they display blank with a red icon for the NPC portrait.

Also there is the "global" node system where nodes are reused for many NPCs and those would by their nature use the same UUIDs.

In the past I've had an issue where global NPCs created during the same session won't open dialog. But the next time I open the editor it works fine. Never tracked down what causes it.

One thing to look for is, do the NPCs that have a DB_Dialogs but don't open an actual dialog UI turn and face the player? Because that's part of the statement IIRC. So if they turn and face you the script is at least working partially.

Quote

(On a side note, I also have no clue how that 'Speaker Manager' works either. ;-)


I'm not as familiar with the EE version as I am the classic, they changed the menus a bit but I think it still works basically the same way. One of the functions seems to be letting whatever system controls voice overs know when it's supposed to play matching lines from the recording sheet (along with having voiced checked off).

The other thing it does is define groups, there's a GROUP_Players for instance. So if you had a dialog start off a triggered event you could assign the speaker to be GROUP_Players since you don't know which player tripped it or if more than one did. Thus they could all use that node.


Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
I tried the fix function, unfortunately it didn't help. And it only works if I copy the dialog file to the Shared keywords folder, otherwise it says the file couldn't be found. And if I do so the error message panel says it couldn't edit the file due to missing developer rights, but the dialog file in my mod folder got fixed though. Don't know what it changed but the text IDs are still the same.

So taking a risk or replacing 400 text ids for about 200 nodes...
Quote
Better safe than sorry if you are unsure. Using the editor should make sure you get uniques and don't have to worry about this.

Both replacing IDs and using the keyword editor would cost me about 5x more time, so I hesitate, yet...

What I do here is the following:

I have about 200 nodes for items to craft. If one node is selected it will push four nodes: Amount 1, Amount 5, Amount 10, back to categories. I could save some time if I pushed just one node (maybe called 'Choose Amount') that pushes those four nodes. So I wouldn't have to push all 4 nodes for every selectable item but just one node. But that would require one more button to press (selecting 'Choose Amount' and THEN Amount 1, 5, 10 or back to categories). This may seem irrelevant, but since the crafting dialog is meant to be used very often one more button makes a big difference.

So the only option to avoid spending a lot of time or risking problems with identical IDs could be to select the 'Choose Amount' node automatically in dialog by setting speaker 1 (who you talk to) as owner. But speaker 1 is also a player character. So, I guess I need an AI for speaker 1 that selects the node automatically. But were is the dialog AI information stored for characters and is it possible to assign AI to your companions, and not just main player characters?


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Understandable you want to avoid that amount of work.

Sorry if I'm curious about something else, but ...

How do you craft from scripts at all ? Is there an API to the crafting system ?
And how do you get access to the Stats which are what the crafting system uses to select ingredients and output ? And how do you put boosts on items ?

Is there some kind of #include in dialogs?

Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Quote
How do you craft from scripts at all ? Is there an API to the crafting system ?
And how do you get access to the Stats which are what the crafting system uses to select ingredients and output ? And how do you put boosts on items ?

Is there some kind of #include in dialogs?

Ah, would be nice if such functions existed (but they don't as far as I see). What I do is transcripting crafting recipes to Osiris scripts, so I don't/can't use stats but templates and can't support all kinds of recipes. So: boosts, recipes with autolevel (all weapon and armor recipes) and crafted items without own template can't be supported by my mod. But that's okay: I like the crafting system of D:OS, my only intention is to compensate missing functions of inventory management to facilitate crafting. I'll support about 200 recipes (also recipes that require an anvil or other external objects), so that's quite a lot (all Potions, Arrows, Arrowheads, Grenades, ingredients like ore bars, dust, etc.).

I store different types of recipes in databases and use the information later. To give some examples:

Code
DB_CraftingFlags("POT_HealSmall","CON_Potion_Empty_A_cd6e86ca-e9be-444e-a7df-d295ec6bb578","CON_Herb_Mushroom_A_0106e3c1-bd81-4118-8a28-59c6dc941feb","CON_Potion_Health_A_944e4b8c-1736-4ff6-8fa6-d7ceda9941da","Crafting",1)
DB_CraftingFlagsDouble("POT_HealMedium","CON_Potion_Health_A_944e4b8c-1736-4ff6-8fa6-d7ceda9941da","CON_Potion_Health_A_944e4b8c-1736-4ff6-8fa6-d7ceda9941da","CON_Potion_A_Health_Medium_d2781168-5862-4e6d-95a3-47d9bd9e8dba","Crafting",2)
DB_CraftingFlagsWithTool("ARWI_ShaftBranch","WPN_Branch_A_568ab219-039b-4200-a24b-d29c9500fe4f","WPN_ArrowShaft_A_3ba1a061-0fe3-4c8e-a34a-940aecee16c9",3,"Crafting",0)
DB_ExternalCraftingFlags("UTI_IronBar","LOOT_Ore_A_Iron_A_053e23db-a144-4619-bb96-3208aecc77d5","Oven","LOOT_OreBar_A_Iron_A_1eabd114-a6c5-4e24-b61f-0932c65b8ef3",1,"Repair",1)


It's too much to explain how the whole script works and communicates with the dialog and - in the case of crafting with anvil etc. - with the character script. But I will comment and post the script when the mod is finished (about 1-2 weeks).


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Wow, hot stuff.

I hope, we will not interfere too much, because my upcoming mod will deal almost exclusively with inventory cleanup ;-)

Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Oh, and if you did not already know:

Move handles out to a hidden container before deleting them, with a specified amount, because ItemHandleDelete() always removes a complete stack.

BTW: I also plan to add recipes to put +1 Crafting and +1 Blacksmithing on bracers and belts, as soon as I find a character with such gear, because I think that having to always swap gear for crafting and blacksmithing is a major turn-off for a lot of people that makes them forget about it completely.
... The only 'bad thing' about that is that there is no chance to control 'abuse' of such recipes like adding an additional boost where it already exists ...
Still have to think hard about that.

Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Quote
I hope, we will not interfere too much, because my upcoming mod will deal almost exclusively with inventory cleanup ;-)

Oh, actually there's also an item-transfer script included, but if you address this and it makes sense to combine both mods we might think about creating a super-mod from both smile
But anyway: there are 5,748,149 graphic mods for skyrim out there, so it wouldn't be a problem to have at least two interfering inventory mods for D:OS. I'm curious what you will offer!


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Quote
BTW: I also plan to add recipes to put +1 Crafting and +1 Blacksmithing on bracers and belts, as soon as I find a character with such gear, because I think that having to always swap gear for crafting and blacksmithing is a major turn-off for a lot of people that makes them forget about it completely.
... The only 'bad thing' about that is that there is no chance to control 'abuse' of such recipes like adding an additional boost where it already exists ...
Still have to think hard about that.

Would be important to solve that problem. Baardvark even removed crafting/blacksmithing from gear in Scales to upvalue character building. - Maybe you could script a limit for boni that come from gear (if I remember right there is a function to check base value of abilities) and apply a penalty potion when the limit is exceeded. Scientist has to be regarded in some way too.


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
And now I see what these text IDs are used for:

the lsx dialog file stores texts with unique IDs and nodes (the whole structure and settings). The IDs are used to find the right text for the nodes. So using the same ID in different nodes for the same text shouldn't be a problem but even be more efficient! Now there's just one text entry for 200 nodes instead of 200 text entries for 200 nodes. If my nodes had different texts this wouldn't work, of course.


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by Abraxas*
Quote
I hope, we will not interfere too much, because my upcoming mod will deal almost exclusively with inventory cleanup ;-)

Oh, actually there's also an item-transfer script included, but if you address this and it makes sense to combine both mods we might think about creating a super-mod from both smile
But anyway: there are 5,748,149 graphic mods for skyrim out there, so it wouldn't be a problem to have at least two interfering inventory mods for D:OS. I'm curious what you will offer!

Hardly anithing besides pure convenience additions

- bags with different icons to make searching for stored stuff easier (14 'categories' and hopefully I did not exaggerate too much with my icons, I'm a 'graphics illiterate' after all ;-)
- automatic moving of items to those bag when items are picked up (finally 'cleans out' all those keys from main inventory and automatically handles arrows and grenades ;-)
- transferal of many items at once by simply moving the bags between characters
- Homestead moved to Cyseal North Gate (the chests only of course) because everybody forgets about items 'Sent to Homestead' (similar logic as the bag logic, with 22 categories, all containers have unique looks ;-)
- 'Send to Homestead' enabled from the beginning (or almost, still needs a little bit of work) to make use of that convenience
- a full 'Cyseal Crafting Station' on Cecil's property (North Gate again), furnace, whetstone wheel, anvil, one barrel of each type, a wine cask, a beer keg, a 'distillery' and a special crafting statue. (I still have to find uses for some of those and recreate all recipes for the new Stats I use.)
- replacement of crafting tools which can no longer be accidently sold
- unbreakable lockpicks and disarm kits (because they completely overdid it with mines and traps in EE)
- traders who clean up their inventories regularly because I don't want so see all the crap I sold to them many levels before
(That should also make sure that the game no longer crashes due to item overflow as it did for me when EE came out, which required me to restart twice before while already having reached Hunter's Edge. I don't know, what their 'fix' was, I discovered some really strange things after the fix and I hope, their 'fix' was more than simply making more root templates stackable. Don't want to rely on that.)
- disabled 'Magic Pockets' for pickaxes and shovels because I find that annoying as hell
(added zero weight replacement tools instead so players no longer have good reasons not to carry them around.)
- mine respawn (people have asked for that before; works only as intended if timers in scripts are really attached to the object that starts them though, which I don't know and have to test yet)
- Blacksmithing 1 requirement for mining (Blacksmithing is already a stepchild in crafting, maybe because it was added late in development. Many recipes that fit much better with blacksmiths still require Crafting. Personal opinion however.)
- field beds (for regeneration, should be faster - and funnier - than regeneration skills ... and work for zombies as well)
- curved arrows and a curved fireball, although I know that some people will hate that ;-)
(still needs to be done for enemies)
- some 'fixes' where I found incomplete (in my eyes) code like blood stones not removing the new statuses introduced in EE, the grave behind Thelyron's house now also works for companions and still works for everybody after players made their decision to leave it alone, although it is nothing more but display of messages, but it's more consistent than currently
- some other things that don't come to my mind in this moment ?

Internal stuff that might be interesting for other modders
- many new root templates (like missing scrolls e.g., I added ALL scrolls actually, only to be able to disable the two wrong scroll recipes for water and fire scrolls - currently we still create Avatar of Fire from an empty water scroll, another change they forgot in EE. Not sure yet if I exchange ALL scrolls and skillbooks in the treasure tables.)
- change to a lot of existing root templates, mostly to enable their use in crafting (like real 'vials' for the popular dye recipes) or to be able to 'hide' them from crafting (currently, every spell scroll found in the game can actually be destroyed with crafting, which could for example completely lock out access to Hiberheim since the Rift Spell can be turned into any empty scroll if 'IsStoryItem' does not interfere here, but I doubt that.)

I guess your mod has another direction so we might not interfere. My changes to a lot of root templates would though I guess ;-)

I still have a lot to do like going over all existing recipes.
Still unsure if I should make ALL npcs immune to ROT because I personally can not find that funny.
(Sell Tenebrium to Braccus and wait until he is almost dead ? Although in his case, he has Blackrock.)
Might be funny the first time but after that it's probably more annoying. Would save every other modder from having to remember to add Blackrock 1 to new Stats. Easy change as well because ROT is exclusively applied by Osiris I think.)

Planned:
More love for zombies, difficulty adjustments (would not bother with anything but Tactician though).

Dreams:
- more than five quickslot pages ;-)
- Larian backporting additional APIs from DOS2 to EE because I'm very sceptical I will like version 2
- Building a 'knowledge base' in the forum because I don't expect Larian to ever give us sufficient documentation ;-)
(Which in my opinion is one if not THE major reason for the lack of mods when compared to other games. I love the great flexibility of the engine but it is really hard to have to figure out everything over and over again for yourself.)


BTW: maybe, since you are one of the 'scripter wizards' of the forum you could answer my question about Torch.itemScript I posted some time ago ? ;-)

Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by Abraxas*
Quote
BTW: I also plan to add recipes to put +1 Crafting and +1 Blacksmithing on bracers and belts, as soon as I find a character with such gear, because I think that having to always swap gear for crafting and blacksmithing is a major turn-off for a lot of people that makes them forget about it completely.
... The only 'bad thing' about that is that there is no chance to control 'abuse' of such recipes like adding an additional boost where it already exists ...
Still have to think hard about that.

Would be important to solve that problem. Baardvark even removed crafting/blacksmithing from gear in Scales to upvalue character building. - Maybe you could script a limit for boni that come from gear (if I remember right there is a function to check base value of abilities) and apply a penalty potion when the limit is exceeded. Scientist has to be regarded in some way too.

Yes, EE introduced an API to get the base value. I do not know yet if that only 'subtracts' gear boosts or also leaves out stuff like Scientist.
I have read his README and his Scales sounds amazing, but I haven't downloaded the current version because I'm not willing to register to yet another website ;-)

Since my mod is all about convenience, it would be very counterproductive if I removed both boosts from gear. I want to encourage crafting on a played character instead of keeping Jahan as a crafting mule and not discourage it. Removing those boosts would go in the wrong direction in that sense.

I know that his way to encourage putting points into the abilities is to give the players combat boosts when they take the abilities, but putting 15 points in each to get the max 5?

Unfortunately, as you know, there is no way to query any stats from an item except for the ones that do not help here at all like weight. (Oh yes, they use that for pressure plates and never fully implement anything but only what they need at a certain moment.)

My main point is to not have to swap out your combat gear while you're crafting, so I was thinking of enabling to put those boosts on combat gear. And I would enable such a recipe as soon as I find that the final result could be achieved by swapping gear, something like comparing value against base value.

The problem with this is I believe, that there's nothing like the 'StackId' potions have for gear boosts, so crafting might put a crafted buff on top of an existing one even if I used the buff name from DeltaModifiers.txt.

Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by Abraxas*
Quote
How do you craft from scripts at all ? Is there an API to the crafting system ?
And how do you get access to the Stats which are what the crafting system uses to select ingredients and output ? And how do you put boosts on items ?

Is there some kind of #include in dialogs?

Ah, would be nice if such functions existed (but they don't as far as I see). What I do is transcripting crafting recipes to Osiris scripts, so I don't/can't use stats but templates and can't support all kinds of recipes. So: boosts, recipes with autolevel (all weapon and armor recipes) and crafted items without own template can't be supported by my mod. But that's okay: I like the crafting system of D:OS, my only intention is to compensate missing functions of inventory management to facilitate crafting. I'll support about 200 recipes (also recipes that require an anvil or other external objects), so that's quite a lot (all Potions, Arrows, Arrowheads, Grenades, ingredients like ore bars, dust, etc.).

I store different types of recipes in databases and use the information later. To give some examples:

Code
DB_CraftingFlags("POT_HealSmall","CON_Potion_Empty_A_cd6e86ca-e9be-444e-a7df-d295ec6bb578","CON_Herb_Mushroom_A_0106e3c1-bd81-4118-8a28-59c6dc941feb","CON_Potion_Health_A_944e4b8c-1736-4ff6-8fa6-d7ceda9941da","Crafting",1)
DB_CraftingFlagsDouble("POT_HealMedium","CON_Potion_Health_A_944e4b8c-1736-4ff6-8fa6-d7ceda9941da","CON_Potion_Health_A_944e4b8c-1736-4ff6-8fa6-d7ceda9941da","CON_Potion_A_Health_Medium_d2781168-5862-4e6d-95a3-47d9bd9e8dba","Crafting",2)
DB_CraftingFlagsWithTool("ARWI_ShaftBranch","WPN_Branch_A_568ab219-039b-4200-a24b-d29c9500fe4f","WPN_ArrowShaft_A_3ba1a061-0fe3-4c8e-a34a-940aecee16c9",3,"Crafting",0)
DB_ExternalCraftingFlags("UTI_IronBar","LOOT_Ore_A_Iron_A_053e23db-a144-4619-bb96-3208aecc77d5","Oven","LOOT_OreBar_A_Iron_A_1eabd114-a6c5-4e24-b61f-0932c65b8ef3",1,"Repair",1)


It's too much to explain how the whole script works and communicates with the dialog and - in the case of crafting with anvil etc. - with the character script. But I will comment and post the script when the mod is finished (about 1-2 weeks).

Looked at your database again. Amazing stuff.

You probably 'simulate' crafting with ItemTemplateAddToCharacter() and play some animation where necessary.

I hope you know how 'dangerous' ItemHandleRemove() is, already stumbled into that 'trap' myself ;-)

Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Quote
You probably 'simulate' crafting with ItemTemplateAddToCharacter() and play some animation where necessary.

Yes. And the magic bag that was introduced in EE allows to automatically transfer ingredients the crafting character does not have in inventory. Don't you like the pop-up window or the function itself?
Most crafting will be done in dialog, so there will play one of the available dialog animations. But external crafting sends information to the character script and the character will move to a barrel, well, oven or anvil, if in range, and play some crafting animations, so that can be elaborated a bit more.

Your changes and additions seem very useful and interesting! Especially blacksmithing needs more care and the crafting recipes definitely have to be overhauled. There are things like WPN_Arrow_SlowDown_A (Crafting 1) but WPN_ArrowHead_SlowDown_A (Crafting 2). And Molotov would need a higher requirement, in my opinion. It's just too powerful. Do you consider introducing new requirements like loremaster for some recipes (sadly no multiple requirements possible)?

SniperHF has pretty portable bed-rolls in his standalone module ANC and it's also on my list. It seems, a must have for D:OS!

Quote
I hope you know how 'dangerous' ItemHandleRemove() is, already stumbled into that 'trap' myself ;-)

I don't need it for crafting, I think. But I will take care when I continue work on the transfer script.

I will have a look into the torch script until tomorrow and try to answer your questions. Currently a headache is marching in and, haha, needs some zombie love. wink


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by Abraxas*
Quote
You probably 'simulate' crafting with ItemTemplateAddToCharacter() and play some animation where necessary.

Yes. And the magic bag that was introduced in EE allows to automatically transfer ingredients the crafting character does not have in inventory. Don't you like the pop-up window or the function itself?
Most crafting will be done in dialog, so there will play one of the available dialog animations. But external crafting sends information to the character script and the character will move to a barrel, well, oven or anvil, if in range, and play some crafting animations, so that can be elaborated a bit more.

It's the popup I hate with passion.
For keys or quest items I fully accept and welcome it but for all other stuff I dislike it like nothing else ... because of the annoying popup.
Could still test if using '2' for 'ReportAndMove' instead of '1' worked and was silent, but if that worked, I would probably only use that for keys, if I found the code.
... At least I still have not disabled auto-moving for the blood stone cage ;-)

Quote

Your changes and additions seem very useful and interesting! Especially blacksmithing needs more care and the crafting recipes definitely have to be overhauled. There are things like WPN_Arrow_SlowDown_A (Crafting 1) but WPN_ArrowHead_SlowDown_A (Crafting 2). And Molotov would need a higher requirement, in my opinion. It's just too powerful. Do you consider introducing new requirements like loremaster for some recipes (sadly no multiple requirements possible)?

I only touch crafting at all to give my newly introduced crafting tool a meaning. My main intention to introduce them at all was to 'detach' general and crafting tools, preventing them from accidental selling or destruction in crafting. (convenience again!)
Well, the wrong scroll recipes for Avatar of Fire and Avatar of Frost, the missing scrolls Netherswap, Decaying Touch and Summon Poison Slug and the introduction of 'real' Ranger, Rogue and Warrior scrolls are another reason, they all need recipes. (I never liked creating Man-at-Arms scrolls from fire scrolls.)

I might introduce stuff like 'scratch off the spell from a scroll' to create an empty one. That is convenience again, save scumming to get desired results already exists anyway and maybe scrolls will also find more use if they are easier to craft.
(I myself have become allergic to everything I consider inconvenience or a 'timesink' since I played MMOs hehe

Quote

SniperHF has pretty portable bed-rolls in his standalone module ANC and it's also on my list. It seems, a must have for D:OS!

Awesome, did not know that.
But that is already done, I will not remove it again.

(Tried to use an in-inventory item at first but ended up 'sleeping in my own inventory' so I switched to a skill ;-)

Quote

Quote
I hope you know how 'dangerous' ItemHandleRemove() is, already stumbled into that 'trap' myself ;-)

I don't need it for crafting, I think. But I will take care when I continue work on the transfer script.

What other way do you have to prevent a 'never exhaustable inventory' ?
Don't ingredients have to disappear when used in crafting ?
(not facilities of course like ovens or anvils ;-)

Quote

I will have a look into the torch script until tomorrow and try to answer your questions. Currently a headache is marching in and, haha, needs some zombie love. wink


Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Quote
It's the popup I hate with passion.
For keys or quest items I fully accept and welcome it but for all other stuff I dislike it like nothing else ... because of the annoying popup.
Could still test if using '2' for 'ReportAndMove' instead of '1' worked and was silent, but if that worked, I would probably only use that for keys, if I found the code.

Yeah, a simple and quiet message in the log or something else would be enough. 'Modern' games make me nervous.
Be aware that 2 means two items if available (quite surprising that it's actually for amount). I don't think it would change the pop-up and sound issue.

Quote

What other way do you have to prevent a 'never exhaustable inventory' ?
Don't ingredients have to disappear when used in crafting ?

I use ItemTemplateRemoveFromCharacter to remove the items from inventory (they're sent to the character's inventory before this command). No handle needed.

Quote
I myself have become allergic to everything I consider inconvenience or a 'timesink' since I played MMOs hehe

Time for a desensitisation!

Quote
Awesome, did not know that.
But that is already done, I will not remove it again.

(Tried to use an in-inventory item at first but ended up 'sleeping in my own inventory' so I switched to a skill ;-)

Sniper spawns a bed-roll on use. Both good ways to relax.

But maybe we should relieve this thread from off-topics now, except we add the word 'dialog' to every sentence.


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by Abraxas*
Quote
It's the popup I hate with passion.
For keys or quest items I fully accept and welcome it but for all other stuff I dislike it like nothing else ... because of the annoying popup.
Could still test if using '2' for 'ReportAndMove' instead of '1' worked and was silent, but if that worked, I would probably only use that for keys, if I found the code.

Yeah, a simple and quiet message in the log or something else would be enough. 'Modern' games make me nervous.
Be aware that 2 means two items if available (quite surprising that it's actually for amount). I don't think it would change the pop-up and sound issue.

You're right, that's surprising.
I have no increased interest to test it anyway, my code for different pickaxes and shovels already works, that was my main interest. Removing the annoying 'Magic Pockets' came for free with that. Using '-1' might work if '2' does not though.
(That seems typical though, calling it 'ReportAndMove' when it is actually an amount and provide nothing to suppress annoying popups. ;-)

Originally Posted by Abraxas*
Quote

What other way do you have to prevent a 'never exhaustable inventory' ?
Don't ingredients have to disappear when used in crafting ?

I use ItemTemplateRemoveFromCharacter to remove the items from inventory (they're sent to the character's inventory before this command). No handle needed.

Personally I have become paranoid of 'inventory overflow crashes' since that required to restart EE from the beginning two times for me last year ;-)
So I try to delete what I don't use anymore. (My black hole traders do that too for example, real handle deletion ... without me knowing what consequences that might have considering the 'weird nature' of handles ;-)

Originally Posted by Abraxas*
Quote
I myself have become allergic to everything I consider inconvenience or a 'timesink' since I played MMOs hehe

Time for a desensitisation!

Quote
Awesome, did not know that.
But that is already done, I will not remove it again.

(Tried to use an in-inventory item at first but ended up 'sleeping in my own inventory' so I switched to a skill ;-)

Sniper spawns a bed-roll on use. Both good ways to relax.

But maybe we should relieve this thread from off-topics now, except we add the word 'dialog' to every sentence.

If I had known Sniper's work before ... or maybe payed more attention ;-)

Well, I spawn a talking bed-roll or a talking coffin for zombies, so hopefully there are at least SOME differences ;-)

You are right about the off-topic thing. But this forum is so dead anyway that it does not really matter much ;-)

Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Quote
Personally I have become paranoid of 'inventory overflow crashes' since that required to restart EE from the beginning two times for me last year ;-)
So I try to delete what I don't use anymore. (My black hole traders do that too for example, real handle deletion ... without me knowing what consequences that might have considering the 'weird nature' of handles ;-)

I remember Raze's posts about this (can't find the most helpful one at the moment); from what I understood and remember the problem can't be solved by deleting handles, since they can't be used a second time (the current limit is 64,000), if the problem you had is the same as this one and I don't mix things up:

http://larian.com/forums/ubbthreads.php?ubb=showflat&Number=580336#Post580336

Anyway: it seems crafting and trading necessarily causes problems at a certain point, depending on the amount of items you deal with.

PS:
Quote
If I had known Sniper's work before ... or maybe payed more attention ;-)

Well, I spawn a talking bed-roll or a talking coffin for zombies, so hopefully there are at least SOME differences ;-)

Bed-rolls are an evolutionary universal, so I'm sure Sniper wouldn't blame you for similarities wink

Last edited by Abraxas*; 30/07/16 04:02 PM.

My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by Abraxas*
Quote
Personally I have become paranoid of 'inventory overflow crashes' since that required to restart EE from the beginning two times for me last year ;-)
So I try to delete what I don't use anymore. (My black hole traders do that too for example, real handle deletion ... without me knowing what consequences that might have considering the 'weird nature' of handles ;-)

I remember Raze's posts about this (can't find the most helpful one at the moment); from what I understood and remember the problem can't be solved by deleting handles, since they can't be used a second time (the current limit is 64,000), if the problem you had is the same as this one and I don't mix things up:

http://larian.com/forums/ubbthreads.php?ubb=showflat&Number=580336#Post580336

Anyway: it seems crafting and trading necessarily causes problems at a certain point, depending on the amount of items you deal with.

PS:
Quote
If I had known Sniper's work before ... or maybe payed more attention ;-)

Well, I spawn a talking bed-roll or a talking coffin for zombies, so hopefully there are at least SOME differences ;-)

Bed-rolls are an evolutionary universal, so I'm sure Sniper wouldn't blame you for similarities wink

Using a smallint to store IDs in a game with millions of objects ? Yuck ... ;-)

The problem I had was the notorious 'game crashes on zoning' thing, not everyone had that, but I'm a collector and collect everything that can be picked up. (And I also convert stackable iron bars to non-stackable weapons ;-)
DOS is an amazingly stable beast normally (and very resistent to my modding errors too ;-) and when it happened on my first playthrough I thought 'Crashed ? Can happen! Maybe the save has been corrupted', but when it happened in the next playthrough too, I knew something was wrong.
Anyway, my solution back then was to destroy most of the collected stuff with crafting, or convert it to something else via crafting so that it would stack.

When I examined root templates after the patch that supposedly fixed the problem last year, I noticed that they had made a lot of stuff stackable that was not stackable before and increased stack sizes for other stuff. So my assumption was, that there were simply too many different items and some overflow in trader's inventories caused the crashes. Since it only happened on zoning, one time locking out Cyseal, the other time Luculla for me, I can only assume that the stuff I carried around in inventory added to the 'items per zone' which caused the crash. And I am sure I was very far away from 350 hours, even though sometimes I just had the game running in background or in foreground while taking a smoking break ;-) (I had even chosen Cecil's town hall guards and normal civilians to sell the 1 gold junk to in order to prevent traders from crashing, did not help my own 'fixes' ;-) (As far as I remember my first successful playthrough was even before the patch, with my own changes to stack sizes and item destruction in crafting.)

Anyway, since it is so easy to delete handles, I just do it. If done right, can probably do no harm.
('Black hole trading' makes trader's inventories less of a mess if you ever want to buy something, so why not also delete the stuff. Important stuff is not sellable anyway.)

Since the 'handles' I can access in Osiris are no real 'item handles' but more so 'handles of container slots', maybe it's the number of used inventory slots. (Slots in containers and character inventories.)
It would definitely make our lives easier if Larian ever gave us infos ;-)

Joined: Mar 2003
Location: Canada
Support
Offline
Support
Joined: Mar 2003
Location: Canada
Originally Posted by FrauBlake
When I examined root templates after the patch that supposedly fixed the problem last year, I noticed that they had made a lot of stuff stackable that was not stackable before and increased stack sizes for other stuff.

One patch made a change to which items were global, which made the issue of running out of handles easier to hit with a lot of trading or crafting. A subsequent patch increased the limit to 64k, but it is still possible to reach that (a couple with playtimes on the order of 350 hours, and one person trying to make a mod to have traders regenerate their inventory each time a character talked to them).
One person ran into this problem in D:OS Classic, as well, though only after it was fixed in the EE, with a playtime about 550 hours.

Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by Raze
Originally Posted by FrauBlake
When I examined root templates after the patch that supposedly fixed the problem last year, I noticed that they had made a lot of stuff stackable that was not stackable before and increased stack sizes for other stuff.

One patch made a change to which items were global, which made the issue of running out of handles easier to hit with a lot of trading or crafting. A subsequent patch increased the limit to 64k, but it is still possible to reach that (a couple with playtimes on the order of 350 hours, and one person trying to make a mod to have traders regenerate their inventory each time a character talked to them).
One person ran into this problem in D:OS Classic, as well, though only after it was fixed in the EE, with a playtime about 550 hours.

Thanks for stepping in with some info and my big respect for helping us in your free time. (on a weekend, 5 in the morning in Belgium!)

I'd have a couple of questions on the subject ... for after your weekend ;-)
- do all placed objects in the world have a handle too ? (Like trees, bushes, any stuff that cannot be picked up. They could still be uniquely identified by their UUID without a handle and some scripts do that. If they used one, that would greatly reduce the pool of handles for all other processes.)
- does ItemHandleDelete() free a handle ?
- to which dump do items go that were removed with any of the ItemTemplateRemoveFrom... calls and are their handles freed ?
- can freed handles be re-used by the game or is it a simple 'count up without looking back' thing ? (like the sequences relational database systems often use to create PRIMARY KEYS) If they could be freed and reused, a trader who actually cleans up would help a lot, converting many items to a few ones that stack high with crafting would help as well.
- 'handles' in Osiris are no single item handles but handles to an object that can occupy one slot in any container (including a character inventory) and that's the reason why they have to be moved away with some ItemHandleMoveTo... call before they can be treated as single items ?
- do global items and local ones have two different pools of handles and if so, could the global pool even ever change when the game is running ?
- can the code be adjusted to use int for handles instead of unsigned small ? The limit would be a tiny bit harder to reach ... (okay, just kidding ;-)


Anyway, enjoy wour weekend hehe

Joined: Mar 2003
Location: Canada
Support
Offline
Support
Joined: Mar 2003
Location: Canada
Originally Posted by FrauBlake
(on a weekend, 5 in the morning in Belgium!)

I'm in Canada, not Belgium (though it is after 5am here now; I got up and had to check the forum/email on my way back to bed... biggrin ). I work evenings and weekends, since that is when more people play games (and working late I can overlap with the morning in Belgium).

Not all items have a handle, only global items. Picking a local item up and dropping it will create a handle for it.

Deleting a handle does not allow it to be reused.

I don't know about the removed items. I can ask about that, if it matters in light of the previous answer.

The handle generator uses two parts, one of which is a global counter (which only increments each time it is called), and doesn't keep track of or look for handles that are no longer used.

I don't know about ItemHandleMoveTo.

AFAIK local items don't use a handle.

I was told this could not be fixed for D:OS, but that would be changed for D:OS 2. I don't know if that was purely for technical reasons, or the chance of major changes breaking things for others was too great a risk given the relative rarity of issue with the higher limit.

Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by Raze
Originally Posted by FrauBlake
(on a weekend, 5 in the morning in Belgium!)

I'm in Canada, not Belgium (though it is after 5am here now; I got up and had to check the forum/email on my way back to bed... biggrin ). I work evenings and weekends, since that is when more people play games (and working late I can overlap with the morning in Belgium).

Not all items have a handle, only global items. Picking a local item up and dropping it will create a handle for it.

Deleting a handle does not allow it to be reused.

I don't know about the removed items. I can ask about that, if it matters in light of the previous answer.

The handle generator uses two parts, one of which is a global counter (which only increments each time it is called), and doesn't keep track of or look for handles that are no longer used.

I don't know about ItemHandleMoveTo.

AFAIK local items don't use a handle.

I was told this could not be fixed for D:OS, but that would be changed for D:OS 2. I don't know if that was purely for technical reasons, or the chance of major changes breaking things for others was too great a risk given the relative rarity of issue with the higher limit.

Canada, interesting. Did Larian specifically pick someone living overseas for the job so that 'normal' working hours would overlap with european playing prime times ?

Thank you anyway for answering questions on a weekend !

So what you say means that the engine never does some kind of 'handle space defragmentation' which inevitably leads to death at a certain point, although there might still be a lot of handles potentially usable, but the engine never bothers to look for the 'holes'.

A handle needs to be created at the latest when the item is put into some container, independent of the item being global or local (globals might have a handle created on game start to be fully prepared when Osiris uses them). Otherwise we would not be able to get the handle in Osiris 'events' like ItemTemplateAddedToCharacter( (STRING)_ItemTemplate, (INTEGER)_ItemHandle, (CHARACTER)_Character ).
All these 'events' are queued as soon as an item is put to any container.
Which makes me think, that it's actually a slot that can hold an entity (a single item or a stack of items) which aquires a handle, attaches it to the entity and sends info about all this to Osiris. It also sends who or what its parent is, so Osiris can categorize it as either an ItemTemplateAddedToCharacter() or ItemTemplateAddedToContainer() 'event'.

I was also wondering if the change to treasure creation from classic to EE is at least in parts responsible for the overflow crashes (which I had never heard of before in classic), because with the early creation on zoning instead of 'on-demand-creation', a lot of handles might become unnecessarily wasted, which could lead to the limit being reached much earlier than before in classic.
The fact that people (me included) had crashes on zoning also suggests that the new treasure creation is the cause for the overflow.
Of course without ever 'defragmenting the handle pool', this problem could have occured in classic as well, but much much later.
(If it works the way I decribed above - treasure generation puts item into slot, slot attaches handle.)


I think we all know, that it could of course be fixed in existing DOS, but in a 'time-is-money' world it doesn't make sense economically, because noone will pay Larian for it. (The vast majority never ran into this problem after all, myself included after my 'private changes' ;-)
I've heard that D:OS2 is even biiger than D:OS was, so it's a pure necessity to fix this weak point.

Using int instead of small could be a possible fix which would push the limit much much further, although not solve the principal problem.
Maybe the last fix that doubled the limit was not even a change from 'small' to 'unsigned small' but was simply changing the generator's counter to start counting at -2^15 instead of 0, easy fix which would effectively double the amount of available handles. (Much easier than changing the data type. The value itself is not of interest anyway.)
If handles are handed out by a 'handle generator' it would in theory only be a matter of changing the generator to search for 'left over holes'. Any bookkeeping of 64k handles needs only an 8k bit field, which can easily be stored in a savegame and has a chance to even be permanently kept in modern processor's caches. Of course this would be dependent on handle users informing the generator about releasing previously acquired handles, which might not be the case currently and the reason for 'technical impossibility'. The save process not being able to store a generator's bookkeeping bit field might be another, maybe there are problems storing binary data in the save XMLs ;-)

Anyway, bookkeeping and reuse of handles is the only way to go, every operating system would be unable to run for a longer time if they never reused values of released file handles. Blowing up the data type for handles only pushes a limit further away but the limit will be reached at some point.


What you said about the generator - counting up, no bookkeeping ... crash on overflow ;-) - means, that we can never make any changes like deleting handles to prevent overflow, so information would be helpful, if we could find any way to prevent unnecessary handle creation in the first place.
'UsePartyLevelForTreasure' for containers comes to my mind, maybe setting that could prevent standard treasure creation and cause a fallback to old 'on-demand' creation for placed containers at least. More info could also tell modders, how dangerous blowing up treasure tables could potentially become.


Apologies for bad grammar and english, it's not so easy for us non-native speakers.

Maybe you will eventually find the time to 'dig deeper' in Belgium, I'm sure modders would do as much as they could to help soften problems if possible, but they need information. And we'd love you even more than now already ;-)

Joined: Mar 2003
Location: Canada
Support
Offline
Support
Joined: Mar 2003
Location: Canada

My location wasn't really a factor. I joined the previous Larian forum just after Divine Divinity was originally released, and hung around long enough that they hired me (four and a half years ago).

The changes to loot generation are probably part of the problem, but it was a change in one of the updates that increased the number of handles used and turned the 'practically unlimited' number of handles into something that could be reached with a lot of trading or crafting. When the system was implemented, it seemed more than adequate; then the game grew significantly (even then nobody hit the limit in the original release, until after the EE was out) and changes in the EE increased the demand for handles.

This did occur at least once in D:OS Classic, at a playtime over 550 hours (that was only reported after this problem was discovered and the limit raised in the EE).
D:OS 2 will not be using the same handle system.

Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by Raze

My location wasn't really a factor. I joined the previous Larian forum just after Divine Divinity was originally released, and hung around long enough that they hired me (four and a half years ago).

The changes to loot generation are probably part of the problem, but it was a change in one of the updates that increased the number of handles used and turned the 'practically unlimited' number of handles into something that could be reached with a lot of trading or crafting. When the system was implemented, it seemed more than adequate; then the game grew significantly (even then nobody hit the limit in the original release, until after the EE was out) and changes in the EE increased the demand for handles.

This did occur at least once in D:OS Classic, at a playtime over 550 hours (that was only reported after this problem was discovered and the limit raised in the EE).
D:OS 2 will not be using the same handle system.

So you're at Larian since somewhen around what, when 'the amazing spectacle that is Dragon Commander' came out ?

For me D:OS is among few best games of all times, together with a legend like Might & Magic 6 (and 7 in some ways), one Drakensang and The Temple of Elemental Evil (both the latter being way too short), oh, and not to forget something completely different, Diablo I and II (never touched Diablo 3).

At the moment, the only games I even ever play are D:OS and LOTRO.
Beating the Void Dragon was one of the saddest moments in my 'gaming history' ... because that was the moment the game was over. (An advantage of MMOs is, one can hardly ever reach that moment ;-)

A game as good as D:OS makes me passionate about it and is the reason I got interested in modding it. In order to do that I need information about how things work. A lot of info is already here in the forum but a lot is also still unknown. (Not to Larian obviously)

So I want to apologize for being so obnoxious about getting info many times, it's only because I'm so passionate about it ;-)

Joined: Mar 2003
Location: Canada
Support
Offline
Support
Joined: Mar 2003
Location: Canada

I started at the beginning of 2012, a while before the Divinity Anthology was released. After D:OS was released I took over email support, as well.

The documentation and support for D:OS 2 modding should be better; there is certainly an effort to keep internal documentation up to date and organized during development.

Joined: Mar 2016
Location: Belgium
T
addict
Offline
addict
T
Joined: Mar 2016
Location: Belgium
Originally Posted by FrauBlake
Anyway, bookkeeping and reuse of handles is the only way to go, every operating system would be unable to run for a longer time if they never reused values of released file handles. Blowing up the data type for handles only pushes a limit further away but the limit will be reached at some point.


I've thought about using Osiris itself for such book keeping, with basically a DB_RecycledHandle(UUID,handle). You can get the handles even for local objects in Osiris by catching a CharacterItemHandleEvent() (these are triggered even for local objects, and you can send them to CHARACTER:NULL). However, communicating a handle from Osiris back to an item script seems to be impossible. There is no Item/CharacterSetVarItemHandle(), no CharacterItemHandleSetEvent(), and using *SetVarInteger() or *SetVarItem() does not work with handles.

BTW: watch out when dealing with handles for local objects in Osiris. The Divinity Engine crashes with a segmentation fault if you try to do certain things with these handles, presumably because in general it only sees global objects (I forgot the exact code I used, but watch out if you try to reproduce this: if this is done in code that runs automatically when your mod is started, you'll have to remove the offending code using an external editor because the Divinity Engine will immediately crash when loading your mod).

Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by Tinkerer
Originally Posted by FrauBlake
Anyway, bookkeeping and reuse of handles is the only way to go, every operating system would be unable to run for a longer time if they never reused values of released file handles. Blowing up the data type for handles only pushes a limit further away but the limit will be reached at some point.


I've thought about using Osiris itself for such book keeping, with basically a DB_RecycledHandle(UUID,handle). You can get the handles even for local objects in Osiris by catching a CharacterItemHandleEvent() (these are triggered even for local objects, and you can send them to CHARACTER:NULL). However, communicating a handle from Osiris back to an item script seems to be impossible. There is no Item/CharacterSetVarItemHandle(), no CharacterItemHandleSetEvent(), and using *SetVarInteger() or *SetVarItem() does not work with handles.

BTW: watch out when dealing with handles for local objects in Osiris. The Divinity Engine crashes with a segmentation fault if you try to do certain things with these handles, presumably because in general it only sees global objects (I forgot the exact code I used, but watch out if you try to reproduce this: if this is done in code that runs automatically when your mod is started, you'll have to remove the offending code using an external editor because the Divinity Engine will immediately crash when loading your mod).

I might have mentioned that earlier somewhere. What we get as an _ItemHandle from queries or 'events' like ItemTemplateAddedToCharacter() is a handle of a complete stack and not of a single item. This might be the reason why there are no GetVar or SetVar calls because a handle does not stand for a single item.
It seems safe to query a string from a handle though because if anything is different in an actual object, it does no longer stack as can be seen with the moonstone at Cyseal North Gate, which has the PUZZLE_HiddenPerception.itemScript attached and does not stack with other moonstones anymore because of this. So I assume getting a String with ItemHandleGetVarString() is safe because all objects on a stack must have identical parameters, including their item scripts, otherwise they would not stack.
Enabling setters is probably possible but you'd have to deal with a lot of stuff if you did id:
Should ALL single items of a stack get this 'event' or just one ? If it was only one, it would have to be moved out of the stack because it was different then which would require creating a new handle for this. Then how would Osiris communicate this new handle to the original caller of the setter ?

There are some Osiris function that can deal with those stacks like for example ItemHandleMoveTo... which has an _Amount parameter and would be better named 'MoveSpecifiedAmountOffTheStackTo...'. If a handle was really a single item there would be no (INTEGER)_Amount but an (INTEGER)_Bool as a parameter, in fact, no additional parameter would really make sense ;-)

For myself I started calling these handles 'handles-of-entities-that-occupy-one-slot' because they represent what can be held in a slot in any container (including our inventories) and not a single item (can be a single one though, and always is for non-stackables like weapons of course).


I have absolutely no idea how bookkeeping of handles in Osiris could help preventing handle overflow when it's the engine that assigns handles, so how would you assign a handle to anything in Osiris ?
(If you meant bookkeeping for some very generic code to prevent it from using unusable handles, it makes more sense to me.)


Anyway, what I meant above was not bookkeping of handles in Osiris but internal bookkeeping of the 'handle generator' Raze was talking about ;-) (That's why I was blabbering about 8k bit fields and such.)
It was all about not only counting up an internal counter - like a sequence in some SQL system - but about doing a 'turnaround and restart from the beginning' once some Max(small) has been reached.
For this to work, bookkeping would have to be done, and could be done with an 8k bit field for 64k handles for example, each bit representing one possible handle value with 1 for used and 0 for free.
That would only work though if handle acquirers would ever release the handles they acquired - inform the generator about the fact that a previously handed out handle is now free to use again. My assumption is, that this releasing of handles never happens in current code and is hard to 'fix' because there might be too many places in the game (and Osiris) code that would have to be changed.

My original curiosity was if a handle could ever be reused internally by the engine when it creates new items. By that I meant the integer value of it, after an item that previously had this value as 'handle' has disappeared for good, I did not mean the item itself. Raze's answer to that was clear: no.
If internal reusability had existed, removal of items (like ItemHandleDelete()) could have helped avoiding the notorious 'crash on zoning'. As it looks, nothing but internal changes to the handle generator (and probably handle users) can help.

Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Do you consider changes on trader inventory generation? That's another change from Classic to EE that forces the problem, if I understood that right. Restock after one hour (real time) on trade request and after (at least one) level up on trade request.
I changed that for my mod now (after 1,5 hours and after 2 level ups) but I'm unsure how that will affect crafting for those who use to craft a lot. Would it feel too much like a restriction to available crafting resources?
As passionate craftswoman, FrauBlake: Did you run out of resources sometimes and would you even more under the new conditions?

PS: Good question to localisation. I'd like to know too.


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by Abraxas*
Do you consider changes on trader inventory generation? That's another change from Classic to EE that forces the problem, if I understood that right. Restock after one hour (real time) on trade request and after (at least one) level up on trade request.
I changed that for my mod now (after 1,5 hours and after 2 level ups) but I'm unsure how that will affect crafting for those who use to craft a lot. Would it feel too much like a restriction to available crafting resources?
As passionate craftswoman, FrauBlake: Did you run out of resources sometimes and would you even more under the new conditions?

PS: Good question to localisation. I'd like to know too.

In spite of the name, it's not crafts'woman' ;-). I only like that name because my kinsmen and -woman in LOTRO call me that, since all my characters there are female and have the last name 'Blake' ;-)

To answer your question, I bought all available ingredients whenever possible. Only the 'useful ones' of course, there are others that aren't interesting.

I don't intend to change any generation intervals. I don't intend to change treasure tables except in what traders carry. That I need to 'disable' certain crafting recipes because as far as I know there is no way to disable one. I can only take away the ingredients those recipes use. For example I want 'Scroll_Skill_Air_Blank_A' to no longer appear in the game, and I will replace all existing scrolls and skillbooks, which requires changes to treasure tables (or links in some case). Minor additions maybe, like teeth in bone piles, and I think I should remove stuff I provide better replacements for like lockpicks or disarm kits.
And if I do not forget I shall add very importand stuff that Larian forgot like for Cyseal's fish seller:

Code
new subtable "3,1;11,1"
object category "I_LOOT_Claw_Crab_A",100,100,0,0,0,0,0,0

;-)

Why did you change trader generation frequencies ? Cannot be because of limited handles. (Because I am the only one paranoid about them ;-)
Changing that will mostly hit crafters because they depend on trader's ingredients, traders are the only reliable source for a lot of ingredients. (Think about the special arrows, where else would you get antlers or teeth ? Most people don't care about that, but crafters do.)


Most people played through the game without problems even before they changed the handle limit from 32k to 64k. Personally I have become paranoid after my first two play attempts resulted in that crash. Other people had that crash too.
Gen. Raze said that the problem even occured in classic ... after some 550 hours of gameplay. (Okay, only reported once, there might have been more cases.)
I was very far away from those 550 hours when I had my crashes, don't know, could have been 80 to 100 hours.

So put together: the problem was non existant in classic and occured in EE with more than one person reporting it (myself and others NOT reporting it).
The only thing I can think of that could have a big influence on this is the changed treasure generation, because, what else ?

So ... treasure must be pre-generated. Otherwise it would change after loading.

Although it's probably pre-generated, traders receive the items they sell when they need them, I had ItemHandleAddedToCharacter() events for all their 'generated' treasure, so the treasure was added when I started trading. I haven't tested if 'save scumming' works with traders, if it does, it is a real generation on demand for traders. If not, pre-generated treasure sits somewhere in the background waiting to be 'claimed'.

I think treasure is pre-generated every time you level up in the current area, every time you enter a zone and for traders every time after new trader treasure has been generated. (To have something sitting in the back for the next generation and prevent the end of the world: save scumming. It's probably a normal treasure but the Osiris call GenerateTradeTreasure() triggers the immediate creation of a new one.)
Treasure MUST actually be created on every levelup, because no one would like to open chests, barrels or crates with loot of the level it had when you first entered an area. You can easily get to Hiberheim at very low level if you visit Wally ... or Willy ?. But you would not want level 5 loot in all Hiberheim. You also enter Luculla Forest a long time before you actually really do something there, because you need to enter it to go to Hiberheim. If you open a container in Hiberheim or Luculla though, it's around your level and not much higher I think. And finally, you stay in Cyseal for a while without ever leaving it, you could open ANY container any time, loot should be at an appropriate level and not level 3, the last time you left Cyseal and came back after the second star stone.
The only exceptions to this migth be containers with a fixed level because that treasure would not need to be recreated, and containers with 'UsePartyLevelForTreasure' might use on-demand creation. (The latter is doubtful because it would allow for the single worst thing that could ever happen anywhere on this planet: save scumming to get better loot. If it were the case though, I'd know exactly, what I'd do in a mod ;-)
Mob drops seem to use the old on-demand creation from what I've heard. (And maybe the 'custom treasure thing' somewhere in _Trade.txt in Osiris too.)

Since it could be quite an effort to differentiate between 'categories of treasure generation', maybe all treasure (except mob drops and 'custom') is even always generated at the above mentioned occasions.
Could be that treasure in an undiscovered area within a zone is first created when the area is discovered to 'soften the problem'.

If I am right and with treasure pre-generation also comes handle acqusition, it means that the change from 'on demand' to 'pre-generated' treasure in a system without any 'handle handling' might have been the single most stupid change from classic to EE ;-)
I never understood the motivation behind it either. If someone wants to save scum, why not, does not hurt others. After you load the game for the tenth time, it gets old and you go with what you have.


I could speculate a lot about how things work, but in the end, only General Raze can give us answers.
(... or confuse us even more of course ;-)

Last edited by FrauBlake; 03/08/16 10:47 PM.
Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Quote

In spite of the name, it's not crafts'woman' ;-). I only like that name because my kinsmen and -woman in LOTRO call me that, since all my characters there are female and have the last name 'Blake' ;-)

Oh, sorry, man! wink

Quote
That I need to 'disable' certain crafting recipes because as far as I know there is no way to disable one. I can only take away the ingredients those recipes use.

You would have to exchange the file in the pak file. Should work, shouldn't it?

Quote
And if I do not forget I shall add very importand stuff that Larian forgot like for Cyseal's fish seller:

One player missed scissors. How to cut the hair otherwise?

Quote
Why did you change trader generation frequencies ? Cannot be because of limited handles. (Because I am the only one paranoid about them ;-)
Changing that will mostly hit crafters because they depend on trader's ingredients, traders are the only reliable source for a lot of ingredients. (Think about the special arrows, where else would you get antlers or teeth ? Most people don't care about that, but crafters do.)

You're not alone (if that's calming for a Paranoid). Since the first time I heard of this precarious matter I developed some pretty fears myself. When will that ticking bomb blow up? And how to handle ticking bombs without, oh God, using handles!

I'm not sure about the relevance of trader restocking. Depends on playstyle (how often you request trades), so the influence of EE is more indirect. It encourages massive trading and crafting much more than Classic did (only level, not time difference relevant). And it forces restocking (more than Classic) when you just come back to buy an item you didn't buy last time (and Classic only refreshed empty slots, if I remember correctly). Well, I see the point: I would hurt those I try to protect.
But there's also a non-handle-related problem I have with the trading system: in Classic I often visited other vendors to compare items. Now I always risk to lose the item (due to time related refreshment) if I don't buy it immediately. And trader assortments (speaking of armor and weapons) become too exchangable with such a high frequency. And third problem: trader items are just too powerful. So the solution would be to make changes on frequency (best only for armor and weapons, not for ingredients) or to change treasure tables (of vendors and/or enemies) in the last case.

Quote
So put together: the problem was non existant in classic and occured in EE with more than one person reporting it (myself and others NOT reporting it).
The only thing I can think of that could have a big influence on this is the changed treasure generation, because, what else ?

So ... treasure must be pre-generated. Otherwise it would change after loading.

Yes, that's the big change in EE, to prevent save scumming. To a very high price...

Quote
Treasure MUST actually be created on every levelup, because no one would like to open chests, barrels or crates with loot of the level it had when you first entered an area. You can easily get to Hiberheim at very low level if you visit Wally ... or Willy ?. But you would not want level 5 loot in all Hiberheim. You also enter Luculla Forest a long time before you actually really do something there, because you need to enter it to go to Hiberheim. If you open a container in Hiberheim or Luculla though, it's around your level and not much higher I think. And finally, you stay in Cyseal for a while without ever leaving it, you could open ANY container any time, loot should be at an appropriate level and not level 3, the last time you left Cyseal and came back after the second star stone.

I almost said: Yes, Sokrates, it cannot be otherwise! Now I see clearly: items must be pre-generated on every levelup. Otherwise you wouldn't be able to find legendaries since they require a certain level to drop, as far as I know. And you definitely get legendaries (at least in most cases) after a while on the Cyseal map.
So the difference of quality between trader items and looted items only comes from different treasure tables?

Quote
If I am right and with treasure pre-generation also comes handle acqusition, it means that the change from 'on demand' to 'pre-generated' treasure in a system without any 'handle handling' might have been the single most stupid change from classic to EE ;-)
I never understood the motivation behind it either. If someone wants to save scum, why not, does not hurt others. After you load the game for the tenth time, it gets old and you go with what you have.

I tend to agree.

EDIT: Do we know what CharacterMoveWeaponsToContainer and ContainerMoveAllItemsToCharacter does in that regard? Does it create handles for all weapons/items?

And do ItemTemplateIsInPartyInventory, ItemTemplateAddToCharacter and ItemTemplateRemoveFromCharacter deal with handles? (I'm scared...)

Last edited by Abraxas*; 04/08/16 02:29 PM.

My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by Abraxas*
Quote

In spite of the name, it's not crafts'woman' ;-). I only like that name because my kinsmen and -woman in LOTRO call me that, since all my characters there are female and have the last name 'Blake' ;-)

Oh, sorry, man! wink

No offense taken, I wouldn't use that name if I had a problem with it ;-)

Originally Posted by Abraxas*
Quote
That I need to 'disable' certain crafting recipes because as far as I know there is no way to disable one. I can only take away the ingredients those recipes use.


You would have to exchange the file in the pak file. Should work, shouldn't it?

Yes, but new mods don't work the way the old ones did in the pre-editor time. I do not want anybody to have to do the 'rename MainLSF.pak' thing.
And since recipes can have multiple output, adding a new one might only add a new output but not disable the old recipe. (Is that understandable ? I mean of course severaly recipes with identical ingredients and identical requirement.)

Originally Posted by Abraxas*
Quote
And if I do not forget I shall add very importand stuff that Larian forgot like for Cyseal's fish seller:

One player missed scissors. How to cut the hair otherwise?

In classic times, I even created an icon for scissors. The problem is that there is still no way to implement hair-cutting ;-)
Well, maybe changing visual resources could be done but that is currently beyond my abilities ;-)

The reason I want to add this TT is that I love this line from the fish seller so much:
"How many crab claws would you like ? Three ? Eleven ?"
I think it's hilarious.

Originally Posted by Abraxas*
Quote
Why did you change trader generation frequencies ? Cannot be because of limited handles. (Because I am the only one paranoid about them ;-)
Changing that will mostly hit crafters because they depend on trader's ingredients, traders are the only reliable source for a lot of ingredients. (Think about the special arrows, where else would you get antlers or teeth ? Most people don't care about that, but crafters do.)

You're not alone (if that's calming for a Paranoid). Since the first time I heard of this precarious matter I developed some pretty fears myself. When will that ticking bomb blow up? And how to handle ticking bombs without, oh God, using handles!

I'm not sure about the relevance of trader restocking. Depends on playstyle (how often you request trades), so the influence of EE is more indirect. It encourages massive trading and crafting much more than Classic did (only level, not time difference relevant). And it forces restocking (more than Classic) when you just come back to buy an item you didn't buy last time (and Classic only refreshed empty slots, if I remember correctly). Well, I see the point: I would hurt those I try to protect.
But there's also a non-handle-related problem I have with the trading system: in Classic I often visited other vendors to compare items. Now I always risk to lose the item (due to time related refreshment) if I don't buy it immediately. And trader assortments (speaking of armor and weapons) become too exchangable with such a high frequency. And third problem: trader items are just too powerful. So the solution would be to make changes on frequency (best only for armor and weapons, not for ingredients) or to change treasure tables (of vendors and/or enemies) in the last case.

I was never a big fan of 'playing the economy game', neither here nor in any MMO I played. I personally don't care if it's 'overpowered' or not and I don't care if other people 'take advantage' of it or not.
Of course there are always complaints of players if something seems easy. Telling people that something in a game - like 'abusing' traders - is not mandatory for them to use doesn't help, they won't have their peace until everyone has inconvenience.
This is might also be the reason for the whole treasure generation change: catering to this group.

I used traders mostly for crafting ingredients, less for anything else. (The air skill seller and the quartermaster in Cyseal were the ones I visited most, because they sell ingredients ;-)

One could count how many different items a trader has and how many restocks it takes until a relly important number is reached. If traders create treasure only 'after demand' (i.e. immediatley after getting their last pre-created treasure) the number would not be very high, unless ALL traders are always visited, which only a tiny minority of players does.
We also don't know, if traders get their complete inventory restocked or only a 'delta'.

One possible solution to soften the problem is to introduce one trader who does not sell anything but has lots of money. Most people use traders only to sell stuff and they have to visit all of them because they want to sell more than traders can give them back in money. With every trade start there is a good chance for a new treasure generation. Removing 'useless' stuff from traders helps too. Traders for example really don't need to carry buckets or cooking pots, because there are enough around everywhere.
Of course, with every change, the 'role playing problem' arises.

Originally Posted by Abraxas*
Quote
So put together: the problem was non existant in classic and occured in EE with more than one person reporting it (myself and others NOT reporting it).
The only thing I can think of that could have a big influence on this is the changed treasure generation, because, what else ?

So ... treasure must be pre-generated. Otherwise it would change after loading.

Yes, that's the big change in EE, to prevent save scumming. To a very high price...

As I said, still don't understand why save scumming is a problem, one does not have to do it ;-)

Originally Posted by Abraxas*
Quote
Treasure MUST actually be created on every levelup, because no one would like to open chests, barrels or crates with loot of the level it had when you first entered an area. You can easily get to Hiberheim at very low level if you visit Wally ... or Willy ?. But you would not want level 5 loot in all Hiberheim. You also enter Luculla Forest a long time before you actually really do something there, because you need to enter it to go to Hiberheim. If you open a container in Hiberheim or Luculla though, it's around your level and not much higher I think. And finally, you stay in Cyseal for a while without ever leaving it, you could open ANY container any time, loot should be at an appropriate level and not level 3, the last time you left Cyseal and came back after the second star stone.

I almost said: Yes, Sokrates, it cannot be otherwise! Now I see clearly: items must be pre-generated on every levelup. Otherwise you wouldn't be able to find legendaries since they require a certain level to drop, as far as I know. And you definitely get legendaries (at least in most cases) after a while on the Cyseal map.
So the difference of quality between trader items and looted items only comes from different treasure tables?

There is a chance though, that only containers in currently discovered areas are 'refilled'. But they would all have to be 'refilled'. There is also a chance, that treasure is even generated after a container has been cleared, but immediately thrown away, since the container is supposed to be 'empty'.
Seems stupid but some performance or efficiency thing in the engine might require it.
(Without info, I believe, a whole area is 'treasured' on the mentioned occasions, just because of internal 'engine efficiency', not having to check a lot of external stuff.)

Originally Posted by Abraxas*
Quote
If I am right and with treasure pre-generation also comes handle acqusition, it means that the change from 'on demand' to 'pre-generated' treasure in a system without any 'handle handling' might have been the single most stupid change from classic to EE ;-)
I never understood the motivation behind it either. If someone wants to save scum, why not, does not hurt others. After you load the game for the tenth time, it gets old and you go with what you have.

I tend to agree.

EDIT: Do we know what CharacterMoveWeaponsToContainer and ContainerMoveAllItemsToCharacter does in that regard? Does it create handles for all weapons/items?

Should not because you move stuff that already has handles.

Originally Posted by Abraxas*
And do ItemTemplateIsInPartyInventory, ItemTemplateAddToCharacter and ItemTemplateRemoveFromCharacter deal with handles? (I'm scared...)

Depends.

The IsIn() calls cannot do any harm because they create nothing but query only for existing values. (would be more than weird if they did.)
Same for the Remove(), how would removing require a new handle?
AddTo() calls must use a new handle because they create something, which is not different to treasure creation or crafting. There is a chance that no new handle is used if we create a stackable item and a stack of that item is already present (and not full) in the target container. Larian knows that.

As I mentioned - probably above in this thread - handles are no item handles but 'slot handles' or better 'handles of objects that occupy one slot in a container'.
That is the reason why the query GetItemHandleForItemTemplateInInventory() (or similar ;-) does not return a tuple but a single entry for a stack of items.
Since weapons and armor are not stackable, crafting them for sale is real poison in the whole handle problem context.

If I think about it, an essential change I made last year after my two crashes was to no longer require crafting of weapons to make money, instead I crafted a stackable item from bars to sell and I always had one or more of them in the inventory. That suggests that my creation did indeed not use any new handles because a newly created object was added to an existing stack which already had a handle. New handles were only created if I sold the complete stack and started a new one afterwards or if I only sold part of my stack to a trader I had not sold any of those items before, because then the trader needed to get a new handle for this new stack because he/she could not add it to an existing stack and could not take over my existing handle, because that was still used for what was left in my inventory.
In my first two playthroughs I had crafted tons of weapons to sell them.
(Another change was a massive increase to stack sizes. Last year I thought that traders inventories had some overflow that caused the crashes, I had no idea about handles yet. Coincidently, my changes affected pretty much the handle problem.)


But all this is pure speculation, I only try to understand how things work.
As I said, Raze is the man and our only connection to real info, but I guess he is busy enough with D:OS2 ... and support of course ;-)

Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
We probably shouldn't worry too much about this, as long as we don't know what's really going on.
We speculate about how we could push the limit further away, that might be worthwhile.

But I was thinking about characters. They have handles too. If they take the handles from the same pool as items, then spawning or summoning characters alone could cause the crash, although it might take a lot longer than 550 hours ;-)

My 'field bed skill' also spawns an item, maybe I should no longer have it talk, because that might lead people into over-using the skill just for fun ;-)

Joined: Jun 2013
old hand
Offline
old hand
Joined: Jun 2013
Since this seems more about traders now :P, maybe you guys know the answer to this one:

So if vendors refresh based on time, do random NPCs as well? If Random NPCs do not refresh based on time, what differentiates the vendors so that they refresh (via Osiris I assume).

Last edited by SniperHF; 04/08/16 09:49 PM.
Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by SniperHF
Since this seems more about traders now :P, maybe you guys know the answer to this one:

So if vendors refresh based on time, do random NPCs as well? If Random NPCs do not refresh based on time, what differentiates the vendors so that they refresh (via Osiris I assume).

It's mostly about our paranioa with running out of handles ;-)

So ..... one could ask, are there really random NPCs ? Are there really traders ?

My answer would be no, the 'traders' only have much bigger treasure tables, that makes them different, they react differently to theft (because Osiris tells them to) and they claim item ownership in a certain area (also because Osiris tells them so).
Otherwise they are not different at all from the 'randoms', so yes, the randoms have exactly the same treasure generation.

The random NPCs don't matter that much though because usually they use very small treasure tables like 'GenericNpc' and there have to be very many treasure creations to really matter. From what I've heard, enemy mobs still allow save scumming, so they must be exempt from normal treasure pre-creation.
(I don't know how gold is handled, but gold uses a root template too, but that must be an implicit one, because we don't see it anywhere in Equipment.txt. I have absolutely no idea, where that comes from but I know that I can remove all my gold with a CharacterAddGold( -Amount ) and but I can also remove it by moving the handle of it's root template somewhere else. I can add gold with CharacterAddGold() but I can also add gold with ItemTemplateAddToCharacter( "LOOT_Gold_A_Big_A_.....whatever", _Char, _Amount ), so gold is an absolute enigma to me ;-)

As mentioned, I'm not sure if pre-creation works for trade treasure generation too or if it is only done for real containers. My guess is, that trade treasure is also pre-created.

The two code pieces in _Trade.txt that check if treasure should be generated are

Code
PROC
  GenTradeItems((CHARACTER)_Player,(CHARACTER)_Trader)
  AND
  DB_TraderGeneratedTreasureForLevel(_Trader,_OldLevel)
  AND
  CharacterGetLevel(_Player,_NewLevel)
  AND
  _NewLevel > _OldLevel
THEN
  NOT DB_TraderGeneratedTreasureForLevel(_Trader,_OldLevel);
  DB_TraderGeneratedTreasureForLevel(_Trader,_NewLevel);
  DoGenTradeItems(_Player,_Trader);


for the 'levelup' recreation and

Code
PROC	
  GenTradeItems((CHARACTER)_Player,(CHARACTER)_Trader) 
  AND 
  NOT _Trader.DoesNotWantToTrade() 
  AND
  LastTradeItemGeneration(_Trader,(INTEGER)_THLastGen) 
  AND 
  _THLastGen != 0 
  AND		// check if last generation was long enough ago:
  Time(_,_,_TH) 
  AND
  IntegerSubtract(_TH,_THLastGen,_Delta) 
  AND
  _Delta >= 12
THEN	
  DoGenTradeItems(_Player,_Trader);


for the 'after 1 hour' creation

I cannot find anything in the code that suggests that traders are handled in any way different. They are only normal NPCs after all.

Joined: Jun 2013
old hand
Offline
old hand
Joined: Jun 2013
Originally Posted by FrauBlake

I cannot find anything in the code that suggests that traders are handled in any way different. They are only normal NPCs after all.


So it's possible to disable the regeneration just by commenting out those scripts then?

Also you could probably modify the script and create a list of predefined traders as DB query so only NPCs that are meant to be vendors regenerate. Yeah they don't use as many handles but those 1-3 items on each NPC might add up over the course of the entire game.

Though for some reason I thought there already was a trader DB somewhere, which is why I thought generic flavor NPCS like those around the docks might not regenerate based on time/level. I'd look at what calls GenTradeItems and see which _Trader's get passed.


For the mobs, a lot of them are local characters so that makes sense.

Mainly I ask because I use the TimeOfDay in Dunamis for my Day/night cycle and the traders behaving strangely can be explained by me accelerating the gamehours.

Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by SniperHF
Originally Posted by FrauBlake

I cannot find anything in the code that suggests that traders are handled in any way different. They are only normal NPCs after all.


So it's possible to disable the regeneration just by commenting out those scripts then?

Also you could probably modify the script and create a list of predefined traders as DB query so only NPCs that are meant to be vendors regenerate. Yeah they don't use as many handles but those 1-3 items on each NPC might add up over the course of the entire game.

Though for some reason I thought there already was a trader DB somewhere, which is why I thought generic flavor NPCS like those around the docks might not regenerate based on time/level. I'd look at what calls GenTradeItems and see which _Trader's get passed.


For the mobs, a lot of them are local characters so that makes sense.

Mainly I ask because I use the TimeOfDay in Dunamis for my Day/night cycle and the traders behaving strangely can be explained by me accelerating the gamehours.

The IF RequestTrade(_Player,_Npc) event calls StartTrade() which then calls GenTradeItems() which might create treasure.
Osiris does not handle mob drops, the engine does. So global/local does not matter, bosses drop random as well from what I've heard, and all of them are global.

The time thing is done with a recursive timer in _AAA_FirstGoal.txt. (They still have a comment expecting the engine to give them an event ;-)

Yeah, disable treasure regeneration for non traders might be way to push reaching the limit further away. But it does not make sense to take steps if we don't even know the slightest bit of how it really works behind the scene.

As we discussed though, traders can only become a problem if one is really very long into the game. There might be a way bigger problem with unopened containers.
(All vases in HOM for example have 'UsePartyLevelForTreasureLevel' set, so it might be tempting to wait until you loot them, resulting in a new creation every time you enter HOM.)

Really, they should just have left treasure creation alone in the first place, this whole save scumming is really not the end of the world.

Since they didn't, I now get paranoid if I should let my mattress talk, because I spawn it, and this probably uses a new handle every time ;-)

... and as said above, characters have handles too, and we don't know if those handles come from the same handle pool, so we remove summon skills ... ;-)

Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Quote
As I mentioned - probably above in this thread - handles are no item handles but 'slot handles' or better 'handles of objects that occupy one slot in a container'.
That is the reason why the query GetItemHandleForItemTemplateInInventory() (or similar ;-) does not return a tuple but a single entry for a stack of items.
Since weapons and armor are not stackable, crafting them for sale is real poison in the whole handle problem context.

Sorry to ask again: so we speak of 'handles of objects that occupy one slot in a certain container/character inventory' and not of 'handles of objects that occupy one slot in any container or character inventory'? So is the handle for a stack of objects or a slot with objects? And: is a new handle created when I move a stack of objects to another character inventory or container?

Quote
Though for some reason I thought there already was a trader DB somewhere, which is why I thought generic flavor NPCS like those around the docks might not regenerate based on time/level. I'd look at what calls GenTradeItems and see which _Trader's get passed.

It seems Osiris iterates all characters when the goal _NPC_Stats is initiated and starts a process to add them to DB_Trader if certain conditions are fulfilled:

Code
PROC
CreateDefaultTradeStats((CHARACTER)_Npc)
AND
NOT DB_NoInitialTrade(_Npc)
AND
NOT DB_EvilDude(_Npc)
AND
CharacterIsTagged(_Npc, "Animal", 0)
THEN
DB_Trader(_Npc);


It doesn't except trading NPCs from trade item generation.

Side note: pickpocket requests also start the GenTradeItems process.



My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by Abraxas*
Quote
As I mentioned - probably above in this thread - handles are no item handles but 'slot handles' or better 'handles of objects that occupy one slot in a container'.
That is the reason why the query GetItemHandleForItemTemplateInInventory() (or similar ;-) does not return a tuple but a single entry for a stack of items.
Since weapons and armor are not stackable, crafting them for sale is real poison in the whole handle problem context.

Sorry to ask again: so we speak of 'handles of objects that occupy one slot in a certain container/character inventory' and not of 'handles of objects that occupy one slot in any container or character inventory'? So is the handle for a stack of objects or a slot with objects? And: is a new handle created when I move a stack of objects to another character inventory or container?

No, the problem here is only a non-native speaker being unable to clearly say what he means ;-)

The container does not matter at all. It's the same for any container including our character inventories and bags we might have in our inventories.

What I was trying to say was, that we have to be careful when dealing with _ItemHandles, because they do not represent a single item but a complete stack of items. For items that cannot stack like armor or weapons of course, this makes no difference, but it does for all items that are stackable, like basically all ingredients. Which matters for you because you need to deal with ingredients in your crfting mod.

You mentioned before that you don't use something like ItemHandleDelete but something like ItemTemplateRemoveFromCharacter which most likely has an _Amount parameter, so you are not affected.
Just keep in mind that if you ever deal with handles, you have to be careful.

Originally Posted by Abraxas*
Quote
Though for some reason I thought there already was a trader DB somewhere, which is why I thought generic flavor NPCS like those around the docks might not regenerate based on time/level. I'd look at what calls GenTradeItems and see which _Trader's get passed.

It seems Osiris iterates all characters when the goal _NPC_Stats is initiated and starts a process to add them to DB_Trader if certain conditions are fulfilled:

Code
PROC
CreateDefaultTradeStats((CHARACTER)_Npc)
AND
NOT DB_NoInitialTrade(_Npc)
AND
NOT DB_EvilDude(_Npc)
AND
CharacterIsTagged(_Npc, "Animal", 0)
THEN
DB_Trader(_Npc);


It doesn't except trading NPCs from trade item generation.

Side note: pickpocket requests also start the GenTradeItems process.


Well, all that matters in the context of treasure generation is, if the call GenerateItems() is ever reached or not. (or CharacterGenerateCustomTradeTreasure())
Those are the Osiris calls that actually trigger treasure generation - and handle use.

Everything else is only setting internal Osiris facts to determine if those calls can be reached or not.

There are other calls of course like CharacterSetCanTrade() which probably only affect if the trade diamond button shows up in a dialog or not.

And yes, Pickpocketing can also start a trade generation, which is no different from the 'regular' trade generation before trading. (After all the game must make sure that the pickpocketed character carries something that can be looted.)

The thing that is still unclear to me is, if characters have the same generation as real containers (barrels, chests, ...), both use treasure tables but the engine could differentiate between them by looking at the root template type, one being a character, the other an item.

If characters also have their treasure pre-created every player levelup and on every zoning, it might be a massive waste of handles. Because on top of that comes the required generation after the stack of items 'waiting in the background' has been 'claimed' by an NPC through an Osiris call.
So there seem to be at least two cases of treasure generation, the standard one on player levelup and zoning - done by the engine alone - and the other on explicit Osiris calls like GenerateItems() (which works only for characters).

The GenerateItems() call looks weird because it takes two characters as parameters, but maybe that is only a relic from previous games. Trade treasure does not change if you trade with different characters, unless a generation is explicitely triggered by character level differences.
I have no idea why the call requires two characters.

Joined: Sep 2015
A
addict
OP Offline
addict
A
Joined: Sep 2015
Thank you for your answers!
Quote
What I was trying to say was, that we have to be careful when dealing with _ItemHandles, because they do not represent a single item but a complete stack of items. For items that cannot stack like armor or weapons of course, this makes no difference, but it does for all items that are stackable, like basically all ingredients. Which matters for you because you need to deal with ingredients in your crfting mod.

I really have to think about my item transfer plans. Weapon transfer should be okay. But for other items I need handles. And it's quite strange what happens (just for testing purposes):
Code
IF
GlobalEventSet("TransferItemsTest")
AND
ItemTemplateIsInCharacterInventory(CHARACTER_Player1,"CON_Potion_Empty_A_cd6e86ca-e9be-444e-a7df-d295ec6bb578",_Amount)
AND
GetItemhandleForItemTemplateInInventory(CHARACTER_Player1,"CON_Potion_Empty_A_cd6e86ca-e9be-444e-a7df-d295ec6bb578",_Handle)
THEN
ItemHandleToCharacter(_Handle,CHARACTER_Player2,_Amount);


If all items with this template are one stack it works fine. If there are several stacks only one stack gets transferred, so I have to repeat the event (or the process, what I do in my actual script) until all stacks are transferred.
It seems the engine only picks one handle of several handles (for several stacks) or there is just one handle for one stack and the other stacks are unhandled (would not make sense?).

Quote
The GenerateItems() call looks weird because it takes two characters as parameters, but maybe that is only a relic from previous games. Trade treasure does not change if you trade with different characters, unless a generation is explicitely triggered by character level differences.
I have no idea why the call requires two characters.

Maybe it checks the player to relate item level and player level for item generation?


My mods for DOS 1 EE: FasterAnimations - QuietDay - Samaritan
Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by Abraxas*
Thank you for your answers!
Quote
What I was trying to say was, that we have to be careful when dealing with _ItemHandles, because they do not represent a single item but a complete stack of items. For items that cannot stack like armor or weapons of course, this makes no difference, but it does for all items that are stackable, like basically all ingredients. Which matters for you because you need to deal with ingredients in your crfting mod.

I really have to think about my item transfer plans. Weapon transfer should be okay. But for other items I need handles. And it's quite strange what happens (just for testing purposes):
Code
IF
GlobalEventSet("TransferItemsTest")
AND
ItemTemplateIsInCharacterInventory(CHARACTER_Player1,"CON_Potion_Empty_A_cd6e86ca-e9be-444e-a7df-d295ec6bb578",_Amount)
AND
GetItemhandleForItemTemplateInInventory(CHARACTER_Player1,"CON_Potion_Empty_A_cd6e86ca-e9be-444e-a7df-d295ec6bb578",_Handle)
THEN
ItemHandleToCharacter(_Handle,CHARACTER_Player2,_Amount);


If all items with this template are one stack it works fine. If there are several stacks only one stack gets transferred, so I have to repeat the event (or the process, what I do in my actual script) until all stacks are transferred.
It seems the engine only picks one handle of several handles (for several stacks) or there is just one handle for one stack and the other stacks are unhandled (would not make sense?).

I'm sure all stacks have handles but for the needs Larian had at some points, it was probably enough to return one handle. And it looks like Larian never implement things a more generic way but for a current need.
(This also answers one of my questions, if the GetHandle... query could ever return a tuple if multiple stacks were present: the answer is no then.)

If you wanted to make sure you transfer ALL stacks, you could use a recursive procedure.
I use '-1' as _Amount parameter for the move call, because it transfers a complete stack without the need to pass a specific amount.
(Sorry, I HAD to use spaces between parameters where you didn't because I always find code without them hard to read outside of syntax-coloring places. I also always 'qualify' my own stuff so that chances for name conflicts are lower, thus the name 'AbraxasProc_...' ;-)

Code
IF
  GlobalEventSet( "TransferItemsTest" )
  AND
  ItemTemplateIsInCharacterInventory( CHARACTER_Player1, "CON_Potion_Empty_A_cd6e86ca-e9be-444e-a7df-d295ec6bb578", _Amount )
  AND
  _Amount > 0
THEN
  AbraxasProc_Move_All_Templates( CHARACTER_Player1, CHARACTER_Player2, "CON_Potion_Empty_A_cd6e86ca-e9be-444e-a7df-d295ec6bb578" );

// passing source and target as well to make it more generic
PROC
  AbraxasProc_Move_All_Templates( (CHARACTER)_CharSrc, (CHARACTER)_CharTrg, (STRING)_Template )
  AND
  _CharSrc != _CharTrg  // to avoid endless loops
  AND
  ItemTemplateIsInCharacterInventory( _CharSrc, _Template, _Amount )
  AND
  _Amount > 0
  AND
  GetItemhandleForItemTemplateInInventory( _CharSrc, _Template, _Handle )
THEN
  ItemHandleToCharacter( _Handle, _CharTrg, -1 );
  AbraxasProc_Move_All_Templates( _CharSrc, _CharTrg, _Template );


Originally Posted by Abraxas*
Quote
The GenerateItems() call looks weird because it takes two characters as parameters, but maybe that is only a relic from previous games. Trade treasure does not change if you trade with different characters, unless a generation is explicitely triggered by character level differences.
I have no idea why the call requires two characters.

Maybe it checks the player to relate item level and player level for item generation?

That makes sense, thanks for bringing this idea up hehe


I really wish Raze had more time to dig info from Belgium ;-)

Last edited by FrauBlake; 06/08/16 01:33 PM.
Joined: Mar 2003
Location: Canada
Support
Offline
Support
Joined: Mar 2003
Location: Canada

I have time, but everyone in Belgium has quite a bit more going on at the moment. What specifically did you want to know?

Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by Raze

I have time, but everyone in Belgium has quite a bit more going on at the moment. What specifically did you want to know?

Do you also have a cat that doesn't like you sleeping on weekends ? ;-)

We are speculating a lot about treasure generation, 'handle waste' and pre-emptive measures to avoid the 'out-of-handles-crash' at the moment. And about how some things in Osiris work.

I don't feel too good about disturbing the devs with obnoxious questions at the moment since D:OS2 understandably has the highest priority at the moment. (Not to mention what other future project they may be working on.)
But if you say it's okay, we could discuss what we'd like to know and compile some questions for Belgium.

Joined: Mar 2003
Location: Canada
Support
Offline
Support
Joined: Mar 2003
Location: Canada

I've been following the discussion, but I'm not sure how much detail I'd hope for asking a fairly open ended question. Everyone else has been very busy, getting ready for Gamescom and multiple-country press tours, among other things.
I can preface a few questions with a brief synopsis, so anyone not familiar with the system, or without time to answer, can skip the rest. Or it can wait, but I'm not sure there is going to be a significantly less busy time period before D:OS 2 is released.

Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Originally Posted by Raze

I've been following the discussion, but I'm not sure how much detail I'd hope for asking a fairly open ended question. Everyone else has been very busy, getting ready for Gamescom and multiple-country press tours, among other things.
I can preface a few questions with a brief synopsis, so anyone not familiar with the system, or without time to answer, can skip the rest. Or it can wait, but I'm not sure there is going to be a significantly less busy time period before D:OS 2 is released.

Any answer that might help us understand the system is better than none.

But I'm still reluctant because it looks like we probably won't get too many chances to get real info directly from the source. I would not want to waste that chance.
Maybe some other forum people like Abraxas or Sniper (or someone not yet directly involved in this discussion) might want to add their thoughts before you 'shoot'.

We are all well aware that handing out info to modders is not Larian's highest priority, can never be and will never be.

Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Our late discussion has been a lot about handles and preventing waste of them.

So some additional questions already came up in my mind that have not even been discussed in this thread:

- does creating new items via script (Osiris and character/item scripts) or crafting use new handles even if the new item can be added to an existing stack ?
- does a treasure table entry with a minus (like 'new subtable "-10"') fill a stack without using a new handle if an item of that type still present in an NPC inventory ? (the reason why I ask this is that I do not understand the difference between 'new subtable "-1"' and 'new subtable "1,1"' which have the same effect but two different notations)
- does adding items (or parts of a stack) to the trade window already use a new (intermediate) handle ?
- do 'incomplete' objects use handles ? (those without assigned stats, decoration like bushes, walls, ... or a spawned mattress if I remove the stat; I might have to use pre-placed globals and move and SetOnStage() instead of spawning)
- do characters get their handles from the same pool as items ? (would affect summoning and spawning, other characters are pre-placed and hopefully never need to change handles ;-)

Even more questions might arise.

Most important:
If there is anything we can do to push the inevitable reaching of the limit further away without totally stripping the game of everything it currently has (like totally emptying most treasure tables), we shall attempt to do it. It would give us more freedom in mods.
(Well, Sniper is probably very far away from the limit because his standalone mod is way smaller than Main ;-)

Joined: Mar 2003
Location: Canada
Support
Offline
Support
Joined: Mar 2003
Location: Canada

The responses:

- all new item instances will create a new handle. Even it the new item is added to an existing stack, it will have created a new one temporarily
- both cases in treasure use up handles in the same way. -1 is guaranteed to give you what you ask, while 1,1 may fail to find level-appropriate items and you won't get anything
- if by incomplete objects, they mean scenery, yes those use handles as well, but they come from a different pool. Sceneries are objects which are purely decoration though. So as soon as you can to interact with it, or reason about in scripting, it will be an item. Globals can never be scenery, as scripting can reason about them.
- characters, items, scenery, triggers all get their handles from different pools. Handles never change for existing instances, but each time you spawn (by script/skills/...) a new instance, a new handle will be created.

Joined: Jun 2015
F
enthusiast
Offline
enthusiast
F
Joined: Jun 2015
Thanks a thousand times for digging out this info although it's really bad news ;-)

Originally Posted by Raze

The responses:

- all new item instances will create a new handle. Even it the new item is added to an existing stack, it will have created a new one temporarily

This hits crafting really hard.
(Even splitting stacks is 'bad' if I understand correctly. If I'm wrong though it would mean that I could actually access two or more items by one _ItemHandle in Osiris ;-)

Would still be interesting if creating more than one item at a time uses only one handle, because if it did, using the 'Recipes' page of the crafting window could help some, since it allows for complete stacks to be created in a single step. The 'Experiment' page does not support this.
So an open question would still be if creating a stack in crafting is a 'single item instance'.

Looks like every 'extended crafting' mod is really poison in the whole 'new instance' context ... and I have to rethink a lot of my item conversion recipes ;-)

Originally Posted by Raze

- both cases in treasure use up handles in the same way. -1 is guaranteed to give you what you ask, while 1,1 may fail to find level-appropriate items and you won't get anything

I found this out in my recent tests but good to get confirmation hehe

Originally Posted by Raze

- if by incomplete objects, they mean scenery, yes those use handles as well, but they come from a different pool. Sceneries are objects which are purely decoration though. So as soon as you can to interact with it, or reason about in scripting, it will be an item. Globals can never be scenery, as scripting can reason about them.

So at least we do not start out with a horribly high number of used handles right at the beginning.
I might change some of my pre-placed stuff to 'Scenery' in the editor because it's pure decoration.
(And thanks, this also explains what the 'IsScenery' checkbox means.)

Originally Posted by Raze

- characters, items, scenery, triggers all get their handles from different pools. Handles never change for existing instances, but each time you spawn (by script/skills/...) a new instance, a new handle will be created.

That means we do not need to care about anything besides items because it would take far more of all the other stuff to create problems, far more.

Yesterday I found out that treasure is most likely NOT pre-generated on zoning or levelup but still on demand, only the algorithm for creation changed.
Some info about treasure generation

This makes me more confused than ever how the crash on zoning could happen, because if generation is no pre-generation, what could have caused the crashes ? Did we trade more than before ? That much more ?
(I had the crashes twice when I was already in Hunter's Edge, still very far from 500 hours. Others had them too when it had rarely happened in classic. All I had changed for my first successful playthrough was increase root template stack sizes and add recipes for item destruction/conversion. Seriously confused ... even more so since I think some people with zoning crashes could still continue playing but were locked out of the zones that caused crashes.)


I guess there is no chance we ever get a code fix which uses a 32bit int instead of a 16 bit small for handle counters in 'old EE'.
(Just mentioning because D:OS2 does not look very appetizing now that a lot of focus must be on 'the PvP thing', e.g. restricting amount of usable skills with 'Memory' is only explainable with making the upcoming 'PvP balancing hell' a little bit more bearable for Larian IMO ;-)

Joined: Mar 2003
Location: Canada
Support
Offline
Support
Joined: Mar 2003
Location: Canada

If D:OS 2 limited the learning of skills like the EE does, it would greatly detract from the mechanism of skill book crafting and discourage experimentation both with crafting and trying different skill combinations.
Limiting the number of active skills in combat doesn't reduce the number of possible permutations (the current intent is that a small investment in memory will give the same number of skills as a specialist build in the EE, while focusing on it would give a skillset larger than was possible in the EE).

Page 1 of 4 1 2 3 4

Link Copied to Clipboard
Powered by UBB.threads™ PHP Forum Software 7.7.5