Multiple Inventory

Deckrect
16 Jun 2016, 02:35
Hello there, people! Once again, more troubles! :D

In one of my game projects, i found it would be nice turning character traits and another character creation item into objects and allow player to pick it up. It is fine to the way the game is working and in order to organize things, i labeled the objects into three categories: Item, Trait and Tag (irrelevant for the post here). So, when the players looks to the inventory, there are things like Item:Revolver or Trait:Athletic and each one represents a different thing. It is doing pretty fine, as taking character traits as objects allows me to remove the drop button and place some of the system use into the object's description, so player are able to inspect the items both before selecting them as well during the game to check it's uses.

However, even if this way is serving me pretty well, i was wondering about having three different inventories: one for the regular items, one for character traits and another one for the game tags on place. Just for organization sake, helping player to track things ease. I tried using the "Second Inventory" at Quest documentation page http://docs.textadventures.co.uk/quest/ ... __advanced

It seems to me i failed somewhere in this simple and guided process :roll: and a few things did not work well. I suppose the main intention was making a spell book, what is not my case, but after all effort, happened i lost the functionality of the buttons, and the "look at" command was not working well. I suppose i still need using the "InvPane2.asxl" and rename things as i need (Trait and Tags) but i am loosing the option of keeping the description as it happens when i use the regular inventory.

Does anyone have a suggestion simple enough for a freshman implementing? It is not a terrible issue, as i said, because using only one inventory seems to work fine for now, but i will certainly have a future project where will be handful having these three separate inventory types.

HegemonKhan
16 Jun 2016, 03:04
well you can always create your own 'storage' system, a simple one (also a way of not crowding up the inventory for general purpose):

create an Object to be the main/only (root) container Object in your inventory, and then within it, have as many layers of 'sub' container Objects, and finally then you place the actual items (Objects) into their proper 'sub' container Objects.

(or, if you prefer, you can have the storage system use a hidden and separate 'storage' Object from the person playing the game, and not use the inventory/player at all)

for example:

'player' Player Object (also known as the "inventory")
-> 'storage' Object
->-> 'item storage' Object
->->-> 'healing/curative item storage' Object
->->->-> 'life_potion' Object
->-> 'equipment storage' Object
->->-> 'weapon equipment storage' Object
->->->-> 'sword weapon equipment storage' Object
->->->->-> 'katana' Object
->->->-> 'axe weapon equipment storage' Object
->->-> 'armor equipment storage' Object
->-> 'magic/spell storage' Object
->->-> 'fire magic/spell storage' Object
->->->-> 'fireball spell' Object
->->->-> 'inferno spell' Object
->->-> 'water magic/spell storage' Object
->->-> 'air magic/spell storage' Object
->->-> 'earth magic/spell storage' Object

you... get the idea, I hope...

it takes a bit more Verb/Command (scripting) work... I'd suggest to make a new Verb/Command (as this way you still got the default/built-in Verbs/Commands, like 'take/drop' being able to move the Object in/out of your inventory and the room you're in):

first, create/add an 'indicator/flag' Attribute on your Objects, for example, I like using this (for/creating/using a String Attribute) name/label of 'type_of_object' (to separate it from all of the other things that involve the usage of 'type' lingo/vocab/lexicon in programming/quest... argh... lol): life_potion.type_of_object = "potion", katana.type_of_object = "sword"

'store' Verb/Command, and then you add the needed scripts to handle where to place the items from the inventory (the 'player' Player Object) to the proper sub container storage Object, for example:

if (this.type_of_object = "potion") {
-> this.parent = healing_item_storage_object // or: MoveObject (this, healing_item_storage_object)
} else if (this.type_of_object = "sword") {
-> this.parent = sword_weapon_equipment_storage_object // or: MoveObject (this, sword_weapon_equipment_storage_object)
}
// etc etc etc, you get the idea...

----------

and there's also Sora's Stackable Library (dealing with having items work as they normally do in games, for example: potion (99) ), but the library is old, and not updated for the curent version of quest, I was thinking of trying to use my summer to see if I could go through it and update it (it's a bit advacned for me, so I'm not sure if I could get it updated and still working correctly), but I've been very lazy... sighs. But, if you're able to understand it, you can look at Sora's Stackable Library, and see if you can study/use it's concepts/designs/code/etc.

Deckrect
16 Jun 2016, 03:32
lol Once again HegemonKhan saving me!

I confess i almost got you. I need to read your post about 20 times more to figure out what you are explaining me, but in general terms, i guess i understand what you are saying.

I pass the idea of stackable items. i guess i don't need it and will not need it in most of my games, as i have no trouble on having "grenade" six times in the inventory and things like "bullets" or "ammo", which generally are used in large amounts like 30 or 100, i will take another way to deal with.

The problem on the solution you are proposing, is that, if i got you right, is placing categories of items inside items, making the inventory having swords, then it expands into the sword types and then the specific sword. It is not the case. For an organizational and visual effect, i would prefer having different panes: one for items, one for the character's traits and another one for the said "Tags". Of course, as Traits refers to the character itself, it is tempting storing them into the player's attributes, but as i explained before, i loved the idea of the player checking on each Trait to find its uses during the game.

I suppose that the "InvPane2.asxl" would do fine and i am studying it over and over again to check what is only relevant for spells and what would be altered for my purposes. But as i am not good on scripting, i am having a hard time to understand everything happening and what i could change. Things such as ProcessScopeCommand really frights me. They sound so... vital and important!

The good thing is that now i understand why the buttons were not working. If using the second pane, the action buttons like "look at" try to check objects inside the object player, where they are not as they are stored at a different room.

HegemonKhan
16 Jun 2016, 05:49
ya, I was just offering one of the most simple methods, pretty much a basic folder system (except they're openable/closeable container Objects, Object Type: container_closed/closed_container ~ meh whatever, in quest of course).

it's definately not the same design as having different panes, but it's very simple to do, so I mentioned it just in case you needed it.

another design is to use Commands (and/or you could use, Script Attributes/Verbs: hyperlinks and buttons, too), for example:

durig game play you type in (for this example) 'info', and the 'charaction information screen' Command executes, producing/outputting/displaying this for example:

Name: HK
Sex: male
Age: adult
Race: human
Class: warrior

an example, in code:

(in GUI~Editor: left side's 'tree of stuff' -> Game -> Commands -> Add -> set it up)

<command name="character_information_screen">
<pattern>info</pattern>
<script>
ClearScreen
msg ("Name: " + player.alias)
msg ("Sex: " + player.sex)
msg (Age: " + player.age)
msg ("Race: " + player.race)
msg ("Class: " + player.class)
wait {
ClearScreen
}
</script>
</command>


but again, this is not the same design as using additional panes.

-------------

if you want to use Verbs (these are actually just an Object's Script Attributes), it's basically the same design as your traits:

you have an Object in your inventory, which has Verbs for it doing whatever it is you want, for example of old school rpgs:

(use the Objects' aliases as the broad categories, and their Verbs as the specific things to choose to do)

'player' Player Object
-> 'action button' Object
->-> 'talk' Verb
->-> 'fight' Verb
->-> 'sleep/rest' Verb
->-> 'search/explore' Verb
->-> 'sneak/unsneak' Verb
->-> 'steal/plant' Verb
->-> 'item usage' Verb
->-> 'spell/magic/cast' Verb
->-> 'equip/unequip/equipment usage' Verb
->-> 'store/unstore/storage usage' Verb
->-> etc etc etc Verbs
-> 'info button' Object
->-> 'charaction information screen' Verb
->-> 'equipment information screen' Verb
->-> 'magic/spell information screen' Verb
->-> 'traits/perks/abilities information screen' Verb
->-> etc etc etc Verbs

The Pixie
16 Jun 2016, 09:24
Looking at the docs, I see where it says you have to download stuff, the file names are all run together. There are three you need to download. It also assumes you have done the previous few pages, so already have spells working in your game, but I just went though following it, up to and including adding LEARN, and it works, giving CAST as a display verb.

How big is your game; you you attach it to a post?

There is no reason why you cannot have as many inventories as you like, though you would have to edit the libraries, but I suggest we get the second one working first.

Deckrect
16 Jun 2016, 16:09
Well... i tried using the InvPane2 once again, adding the two libraries and the java needed. I created a room named as "character_traits" to place the traits player picks up for the character and renamed both the pane and the destination using a start up script such as:

SetInventory2Label ("Character Traits")
SetInventory2 (GetDirectChildren (character_traits))

I was able to ignore the usual buttons and added the two buttons i wanted: "Inspect" and "Select". That was going pretty great! However, when the player selects a given trait, it goes to the wrong inventory. The "Inspect" button is doing right, just printing a massage. The "select" button should be moving the selected object (script pints to itself) to the character_traits room.

As i said, for this project it is not a terrible problem and i would do fine with only one inventory. But implementing this right now would allow me on a future sci-fi project having items pane, traits pane, tags pane and ship systems pane, what would be nice for player tracking things and will look great on screen! By the way, is there a simple way to turn off compass?

I basically followed the InvPane2 recipe up to step 3, because it is not a spell book and i have a different and more simple demand to it. So i improvised working on the buttons for myself.

The game itself is not too large, but it has a lot of testing components and i am using those rooms the player never steps in to organize other rooms under it and using the text entry to document plot elements. So, i guess it would be a large spoiling posting the game, because, well, the whole game plot is documente inside it! lol

Perhaps i should create a new game just for testing the secondary pane and once working, i redo everything into to the game.

Deckrect
16 Jun 2016, 17:23
I found something. Each Object destined to the second inventory pane should have a script attached to the verb inside the object such as:

SetInventory2 (GetDirectChildren (Character Traits))

So, i disabled the usual verbs and created the "Check it" verb displaying a description text and a "Select it" verb running:

MoveObject (Lawful, Character Traits)
SetInventory2 (GetDirectChildren (Character Traits))
MoveObject (player, Page 1)

* Where "Lawful" is a character trait and Page 1 is an Object->Room.

The matter now is that even moved to the second inventory pane, the Object (a trait, in this case) gains back the usual "Look at" and "Use" buttons. I must find where i would configure new buttons fro when the Object is inside the second inventory. I guess it has something to do with the library itself.

I created a new game for this study, having none of the plot elements. The full code is here:

<!--Saved by Quest 5.6.5783.24153-->
<asl version="550">
<include ref="English.aslx" />
<include ref="Core.aslx" />
<include ref="InvPane2.aslx" />
<include ref="ScopeLib.aslx" />
<game name="Listing Test 2">
<gameid>566c4bda-7e52-4763-898d-3ae4cb788aca</gameid>
<version>1.0</version>
<firstpublished>2016</firstpublished>
<showscore type="boolean">false</showscore>
<showhealth type="boolean">false</showhealth>
<showcommandbar type="boolean">false</showcommandbar>
<autodescription />
<attr name="autodescription_youarein_useprefix" type="boolean">false</attr>
<showpanes />
<showlocation />
<attr name="autodescription_description" type="int">2</attr>
<attr name="autodescription_youcansee" type="int">3</attr>
<attr name="autodescription_youcango" type="int">4</attr>
<attr name="autodescription_youarein" type="int">0</attr>
<echocommand type="boolean">false</echocommand>
<feature_pictureframe />
<autodescription_description_newline />
<pov type="object">player</pov>
<start type="script">
SetInventory2Label ("Character Traits")
SetInventory2 (GetDirectChildren (Character Traits))
</start>
</game>
<object name="Start">
<inherit name="editor_room" />
<description><![CDATA[Here you select a trait.<br/><br/><br/>{object:Page 1:Here we go}<br/>]]></description>
<usedefaultprefix type="boolean">false</usedefaultprefix>
<exitslistprefix>You may</exitslistprefix>
<enter type="script">
</enter>
<object name="player">
<inherit name="editor_object" />
<inherit name="editor_player" />
<inherit name="female" />
<statusattributes type="stringdictionary">
<item>
<key>Mental</key>
<value>Mental: !</value>
</item>
<item>
<key>Physical</key>
<value>Physical: !</value>
</item>
<item>
<key>Social</key>
<value>Social: !</value>
</item>
</statusattributes>
<Mental type="int">0</Mental>
<Physical type="int">0</Physical>
<Social type="int">0</Social>
</object>
<object name="Neutral">
<inherit name="editor_object" />
<alias>Trait: Neutral</alias>
<drop type="boolean">false</drop>
<take />
<inventoryverbs type="stringlist">
<value>Look at</value>
<value>Use</value>
</inventoryverbs>
<ontake type="script">
MoveObject (player, Page 1)
</ontake>
<look>Character is neutral towards laws.</look>
<useindividualverblist />
<checkit>Character is neutral towards laws.</checkit>
<selectit type="script">
MoveObject (Neutral, Character Traits)
SetInventory2 (GetDirectChildren (Character Traits))
MoveObject (player, Page 1)
</selectit>
</object>
<object name="Lawful">
<inherit name="editor_object" />
<alias>Trait: Lawful</alias>
<drop type="boolean">false</drop>
<look>The character follows all rules, laws and moral codes.</look>
<useindividualverblist />
<usestandardverblist type="boolean">false</usestandardverblist>
<take />
<inventoryverbs type="stringlist">
<value>Look at</value>
<value>Use</value>
</inventoryverbs>
<ontake type="script">
MoveObject (player, Page 1)
</ontake>
<checkit>The character follows all rules, laws and moral codes.</checkit>
<selectit type="script">
MoveObject (Lawful, Character Traits)
SetInventory2 (GetDirectChildren (Character Traits))
MoveObject (player, Page 1)
</selectit>
</object>
<object name="Chaotic">
<inherit name="editor_object" />
<alias>Trait: Chaotic</alias>
<drop type="boolean">false</drop>
<inventoryverbs type="stringlist">
<value>Look at</value>
<value>Use</value>
</inventoryverbs>
<look>The character does not follows the law and estabilished rules.</look>
<useindividualverblist />
<usedefaultprefix type="boolean">false</usedefaultprefix>
<usestandardverblist type="boolean">false</usestandardverblist>
<take />
<ontake type="script">
MoveObject (player, Page 1)
</ontake>
<checkit>The character does not follows the law and estabilished rules.</checkit>
<selectit type="script">
MoveObject (Chaotic, Character Traits)
SetInventory2 (GetDirectChildren (Character Traits))
MoveObject (player, Page 1)
</selectit>
</object>
</object>
<object name="Page 1">
<inherit name="editor_room" />
<description>Select a Skill.</description>
<usedefaultprefix type="boolean">false</usedefaultprefix>
<exitslistprefix>Select a skill</exitslistprefix>
<enter type="script">
if (Contains (Character Traits,Lawful)) {
msg ("This is a Lawful Character.")
}
</enter>
<exit alias="Mental" to="Page 2">
<runscript />
<script type="script">
IncreaseObjectCounter (player, "Mental")
MoveObject (player, Page 2)
</script>
</exit>
<exit alias="Physical" to="Page 2">
<runscript />
<script type="script">
IncreaseObjectCounter (player, "Physical")
MoveObject (player, Page 2)
</script>
</exit>
<exit alias="Social" to="Page 2">
<runscript />
<script type="script">
IncreaseObjectCounter (player, "Social")
MoveObject (player, Page 2)
</script>
</exit>
</object>
<object name="Character Traits">
<inherit name="container_open" />
<inherit name="editor_room" />
<drop type="boolean">false</drop>
<feature_container />
<inventoryverbs type="stringlist">
<value>Look at</value>
<value>Use</value>
</inventoryverbs>
<listchildren type="boolean">false</listchildren>
<open type="boolean">false</open>
<close type="boolean">false</close>
<isopen />
<hidechildren type="boolean">false</hidechildren>
</object>
<object name="Page 2">
<inherit name="editor_room" />
<usedefaultprefix type="boolean">false</usedefaultprefix>
<description>The game begins.</description>
</object>
<verb>
<property>checkit</property>
<pattern>check it</pattern>
<defaultexpression>"You can't check it " + object.article + "."</defaultexpression>
</verb>
<verb>
<property>selectit</property>
<pattern>select it</pattern>
<defaultexpression>"You can't select it " + object.article + "."</defaultexpression>
</verb>
<javascript src="InvPane2.js" />
</asl>


HegemonKhan
16 Jun 2016, 18:51
to do the 'code box' in the post:

[.code]your copy and pasted mass of game code here[/code.]

but without the dots/periods in the brackets, producing this:

your copy and pasted mass of game code here

Deckrect
16 Jun 2016, 19:12
Hmmm... thank you! i will do it right next time!

HegemonKhan
16 Jun 2016, 19:14
it's nice as it keeps the formating/indented of your code preserved, and also doesn't cause a huge/long post, lol.

The Pixie
17 Jun 2016, 07:23
Try this:
<!--Saved by Quest 5.6.5783.24153-->
<asl version="550">
<include ref="English.aslx" />
<include ref="Core.aslx" />
<include ref="InvPane2.aslx" />
<include ref="ScopeLib.aslx" />
<game name="Listing Test 2">
<gameid>566c4bda-7e52-4763-898d-3ae4cb788aca</gameid>
<version>1.0</version>
<firstpublished>2016</firstpublished>
<showscore type="boolean">false</showscore>
<showhealth type="boolean">false</showhealth>
<showcommandbar type="boolean">false</showcommandbar>
<autodescription />
<attr name="autodescription_youarein_useprefix" type="boolean">false</attr>
<showpanes />
<showlocation />
<attr name="autodescription_description" type="int">2</attr>
<attr name="autodescription_youcansee" type="int">3</attr>
<attr name="autodescription_youcango" type="int">4</attr>
<attr name="autodescription_youarein" type="int">0</attr>
<echocommand type="boolean">false</echocommand>
<feature_pictureframe />
<autodescription_description_newline />
<pov type="object">player</pov>
<start type="script">
SetInventory2Label ("Character Traits")
SetInventory2 (GetDirectChildren (Character Traits))
</start>
</game>
<object name="Start">
<inherit name="editor_room" />
<description><![CDATA[Here you select a trait.<br/><br/><br/>{object:Page 1:Here we go}<br/>]]></description>
<usedefaultprefix type="boolean">false</usedefaultprefix>
<exitslistprefix>You may</exitslistprefix>
<enter type="script">
</enter>
<object name="player">
<inherit name="editor_object" />
<inherit name="editor_player" />
<inherit name="female" />
<statusattributes type="stringdictionary">
<item>
<key>Mental</key>
<value>Mental: !</value>
</item>
<item>
<key>Physical</key>
<value>Physical: !</value>
</item>
<item>
<key>Social</key>
<value>Social: !</value>
</item>
</statusattributes>
<Mental type="int">0</Mental>
<Physical type="int">0</Physical>
<Social type="int">0</Social>
</object>
<object name="Neutral">
<inherit name="editor_object" />
<alias>Trait: Neutral</alias>
<drop type="boolean">false</drop>
<take />
<inventoryverbs type="stringlist">
<value>Look at</value>
<value>Use</value>
</inventoryverbs>
<look>Character is neutral towards laws.</look>
<useindividualverblist />
<checkit>Character is neutral towards laws.</checkit>
<ontake type="script">
MoveObject (player, Page 1)
</ontake>
<selectit type="script">
MoveObject (Neutral, Character Traits)
SetInventory2 (GetDirectChildren (Character Traits))
MoveObject (player, Page 1)
</selectit>
</object>
<object name="Lawful">
<inherit name="editor_object" />
<alias>Trait: Lawful</alias>
<drop type="boolean">false</drop>
<look>The character follows all rules, laws and moral codes.</look>
<useindividualverblist />
<usestandardverblist type="boolean">false</usestandardverblist>
<take />
<inventoryverbs type="stringlist">
<value>Look at</value>
<value>Use</value>
</inventoryverbs>
<checkit>The character follows all rules, laws and moral codes.</checkit>
<ontake type="script">
MoveObject (player, Page 1)
</ontake>
<selectit type="script">
MoveObject (Lawful, Character Traits)
SetInventory2 (GetDirectChildren (Character Traits))
MoveObject (player, Page 1)
</selectit>
</object>
<object name="Chaotic">
<inherit name="editor_object" />
<alias>Trait: Chaotic</alias>
<drop type="boolean">false</drop>
<inventoryverbs type="stringlist">
<value>Look at</value>
<value>Use</value>
</inventoryverbs>
<look>The character does not follows the law and estabilished rules.</look>
<useindividualverblist />
<usedefaultprefix type="boolean">false</usedefaultprefix>
<usestandardverblist type="boolean">false</usestandardverblist>
<take />
<checkit>The character does not follows the law and estabilished rules.</checkit>
<ontake type="script">
MoveObject (player, Page 1)
</ontake>
<selectit type="script">
MoveObject (Chaotic, Character Traits)
SetInventory2 (GetDirectChildren (Character Traits))
MoveObject (player, Page 1)
</selectit>
</object>
<object name="hat">
<inherit name="editor_object" />
</object>
</object>
<object name="Page 1">
<inherit name="editor_room" />
<description>Select a Skill.</description>
<usedefaultprefix type="boolean">false</usedefaultprefix>
<exitslistprefix>Select a skill</exitslistprefix>
<enter type="script">
if (Contains (Character Traits,Lawful)) {
msg ("This is a Lawful Character.")
}
</enter>
<exit alias="Mental" to="Page 2">
<runscript />
<script type="script">
IncreaseObjectCounter (player, "Mental")
MoveObject (player, Page 2)
</script>
</exit>
<exit alias="Physical" to="Page 2">
<runscript />
<script type="script">
IncreaseObjectCounter (player, "Physical")
MoveObject (player, Page 2)
</script>
</exit>
<exit alias="Social" to="Page 2">
<runscript />
<script type="script">
IncreaseObjectCounter (player, "Social")
MoveObject (player, Page 2)
</script>
</exit>
<object name="ball">
<inherit name="editor_object" />
</object>
</object>
<object name="Character Traits">
<inherit name="container_open" />
<inherit name="editor_room" />
<drop type="boolean">false</drop>
<feature_container />
<inventoryverbs type="stringlist">
<value>Look at</value>
<value>Use</value>
</inventoryverbs>
<listchildren type="boolean">false</listchildren>
<open type="boolean">false</open>
<close type="boolean">false</close>
<isopen />
<hidechildren type="boolean">false</hidechildren>
</object>
<object name="Page 2">
<inherit name="editor_room" />
<usedefaultprefix type="boolean">false</usedefaultprefix>
<description>The game begins.</description>
</object>
<verb>
<property>checkit</property>
<pattern>check it</pattern>
<defaultexpression>"You can't check it " + object.article + "."</defaultexpression>
</verb>
<verb>
<property>selectit</property>
<pattern>select it</pattern>
<defaultexpression>"You can't select it " + object.article + "."</defaultexpression>
</verb>
<function name="ScopeInventory" type="objectlist">
result = NewObjectList()
// Next line modified to include second inventory
foreach (obj, ListCombine(GetAllChildObjects(game.pov), GetAllChildObjects(Character Traits))) {
if (ContainsVisible(game.pov, obj)) {
list add (result, obj)
}
}
return (result)
</function>
<function name="ScopeReachableInventory" type="objectlist">
result = NewObjectList()
// Next line modified to include second inventory
foreach (obj, ListCombine(GetAllChildObjects(game.pov), GetAllChildObjects(Character Traits))) {
if (ContainsReachable(game.pov, obj)) {
list add (result, obj)
}
}
return (result)
</function>
<function name="ContainsAccessible" parameters="parentObj, searchObj, onlyReachable" type="boolean">
// Next three lines added
if (searchObj.parent = Character Traits) {
return (true)
}
if (not HasObject(searchObj, "parent")) {
return (false)
}
else if (not searchObj.visible) {
return (false)
}
else if (GetBoolean(parentObj, "darklevel") and not GetBoolean(searchObj, "lightsource")) {
return (false)
}
else {
if (searchObj.parent = null) {
return (false)
}
else if (searchObj.parent = parentObj) {
return (true)
}
else {
if (onlyReachable) {
canAdd = CanReachThrough(searchObj.parent)
}
else {
canAdd = CanSeeThrough(searchObj.parent)
}
if (canAdd) {
return (ContainsAccessible(parentObj, searchObj.parent, onlyReachable))
}
else {
return (false)
}
}
}
</function>
<javascript src="InvPane2.js" />
</asl>

The issue is that Quest only checks objects in the player inventory (the built in one) and the room when trying to parse a command. ScopeLib offers one way around that, but the solution above is more general. It modified some built in functions so Quest will check your second inventory too. If you have third and fourth, it will need to be modified to include them. I have commented the functions where I made the changes.

Deckrect
18 Jun 2016, 16:53
Just for the records, things about multiple inventories are getting too confuse and holding me from doing the parts I find fun. So, for this project I will go with the simple inventory and for future projects I will do it simple, but following HK's principles : using the standard inventory but giving the player multiple items wich represents the other inventories.

HegemonKhan
18 Jun 2016, 17:05
here's a link of a post with my attempt at drawing a diagram for it:

viewtopic.php?f=10&t=6284#p42626

maybe this will make more sense if you're confused by what I mean by using container Objects within your inventory

Deckrect
18 Jun 2016, 18:20
23 browser tabs open by now... lol