I made a careless mistake in my code. There is nothing wrong with this
in either of these examples.
I forgot to make the item in example 1 a container. Then, I made a mountain (or at least a small hill) out of a mole hill.
Pixie explains here
If you'd like to possibly learn from my mistakes, read on. Just ignore what I'm saying about this
in this post!
this
being used in this code will cause an error when examining a clone:
createItem("grocery_sack", {
loc:"cloneRoom",
examine: function(){
msg("A paper grocery sack.")
let stuff = this.listContents()
msg("The sack currently contains: ")
msg(stuff)
}
})
When I examine a clone of this object, this happens:
this
will work fine when examining a clone if we code it like this:
createItem("grocery_sack", CONTAINER(false), {
loc:"cloneRoom",
})
w.grocery_sack.examine = function() {
msg("A paper grocery sack. ")
let stuff = this.listContents()
msg("The sack currently contains: ")
msg(stuff)
}
I thought I knew the reason it throws an error when attempting to examine a clone of the object in the first example, but I quickly realized that I have not a clue whilst attempting to type up an explanation.
Note that I'm not saying this is a bug (or even an issue). I'm just sharing the method I found that works.
Also note that you shouldn't call cloneObject
until the game has loaded. (Calling it from settings.setup
works perfectly for me.)
So:
this
!createItem
after the game has loaded is bad.cloneObject
before the game has loaded is bad.REFERENCE
https://github.com/ThePix/QuestJS/wiki/Creating-objects-on-the-fly
This will be a kicking yourself one, I am afraid. The problem with the first one is it is not a container. this
exists, but has no listContents
function. This works fine.
createItem("grocery_sack1", CONTAINER(false), {
loc:"lounge",
examine: function(){
msg("A paper grocery sack.")
let stuff = this.listContents()
msg("The sack currently contains: ")
msg(stuff)
}
})
A good way to diagnose issues like this is to add a console.log
that tells you what this
actually is.
createItem("grocery_sack", {
loc:"cloneRoom",
examine: function(){
msg("A paper grocery sack.")
console.log(this)
let stuff = this.listContents()
msg("The sack currently contains: ")
msg(stuff)
}
})
You can then see if it is undefined
, and if not, check its attributes. What is its name? What is listContents?
Ha ha!
I should have realized it was probably operator error when I couldn't explain it. I woke up this morning wondering what the difference really was between the two examples, and it was a careless mistake. (I make those frequently.)
Huh. This is the second time this week I've posted something here when I should have done more research first. Life lesson learned: slow my happy ass down!