Equip Script Issue

Forgewright
20 Mar 2020, 17:45Hey everyone! Back from 3 months traveling the U.S. and am working my games again.
When I use the following equip script, I have no issue when I equip a weapon while no weapon is equipped. But when a weapon is equipped everything works but the player.equipped = object
line. I look at the debugger and the previous weapon is still equipped. I don't see why. Is it not in the right line? It shows equipped in the inventory panels and the msg prints correctly. Also FYI, the ClearTurn
is a function to clearscreen and showroomdescription.
So the only issue is the player.equipped attribute is not changing to the new weapon.
The command pattern is equip #object#
ClearTurn
if (HasBoolean(object, "dead")) {
msg ("That's not something you can wield as a weapon.")
}
else if (not HasAttribute(object, "damage")) {
msg ("That's not something you can wield.")
}
else if (not object.parent = player) {
msg ("You are not carrying it.")
}
else if (object = player.equipped) {
msg ("You already have.")
}
else if (player.equipped = null) {
msg ("You equip your " + GetDisplayAlias(object) + ".")
player.equipped = object
list add (object.inventoryverbs, "Unequip")
list remove (object.inventoryverbs, "Equip")
object.listalias = object.listalias + " (equipped)"
}
else {
msg ("You put away your " + GetDisplayAlias(player.equipped) + " and equip your " + GetDisplayAlias(object) + ".")
list add (player.equipped.inventoryverbs, "Equip")
list remove (player.equipped.inventoryverbs, "Unequip")
player.equipped.listalias = Replace(player.equipped.listalias, " (equipped)", "")
player.equipped = object
list add (object.inventoryverbs, "Unequip")
list remove (object.inventoryverbs, "Equip")
object.listalias = object.listalias + " (equipped)"
}
foreach (obj, GetDirectChildren(player.parent)) {
if (HasBoolean(obj, "dead")) {
if (not obj.dead) {
if (ListContains (player.attackers, obj)) {
msg ("{colour:red:<i>You are still in battle!}")
do_attack (obj, obj, player, false)
}
}
}
}

Dcoder
21 Mar 2020, 02:38Visually, your code looks fine to me. I would guess that the player.equipped
value is being changed somewhere after the above code.

Dcoder
21 Mar 2020, 02:41Another thing you could do is add a print script immediately after the player.equipped = object
script that prints out the value of player.equipped
, just to verify that it is, in fact, the newly equipped weapon. If the print script prints out the correct weapon, then player.equipped
must be being changed afterwards.

Forgewright
22 Mar 2020, 00:17OK. I'm looking outside the script for issues. Thanks

Forgewright
22 Mar 2020, 12:22I can't find anything outside this script causing the problem. I can equip an object and it will create player.equiped
but when I try to equip another weapon it will not change the player.equipped
I cannot figure this out.
Once a weapon is equipped it stays as the player.equipped
from then on. I really think I'm missing a step here but can't figure what that may be.
Everything else in the script is running correctly but that one line...
I will keep troubleshooting.

Dcoder
22 Mar 2020, 13:12So I'm assuming that if you place msg (player.equipped)
immediately after player.equipped
, it will print out the correct (new) weapon.
Just brainstorming here -
I wonder if creating player.equipped
on the fly has anything to do with this problem. What if you created the .equipped
attribute in the player's attribute tab beforehand? You would then have to assign it the value of some object in the game.
What if you added player.equipped = null
immediately BEFORE player.equipped = object
? Maybe the attribute will be "reset" somehow? Actually, that should delete the attribute, then recreate it.

Forgewright
22 Mar 2020, 16:34Have tried player.equipped = null
earlier with no effect.
just tried msg (player.equipped)
and it prints out the change to the new weapon correctly (wow) but it does not change the player.equipped attribute correctly. (odd).
so what does this tell me...?

Forgewright
22 Mar 2020, 16:57else {
msg ("You put away your " + GetDisplayAlias(player.equipped) + " and equip your " + GetDisplayAlias(object) + ".")
list add (player.equipped.inventoryverbs, "Equip")
list remove (player.equipped.inventoryverbs, "Unequip")
player.equipped.listalias = Replace(player.equipped.listalias, " (equipped)", "")
msg (player.equipped)
player.equipped = (object)
msg (player.equipped)
player.equipped = null
msg (player.equipped)
list add (object.inventoryverbs, "Unequip")
list remove (object.inventoryverbs, "Equip")
object.listalias = object.listalias + " (equipped)"
}
player.equipped = null
deletes the player.equipped
attribute as it should but gives the error `Object reference not set to an instance of an object'

Dcoder
23 Mar 2020, 00:01So if you put player.equipped = null
BEFORE player.equipped = object
(and get rid of the parentheses around object
):
// other code here
player.equipped = null
player.equipped = object
// other code here
Do you still get that error message?

Forgewright
23 Mar 2020, 00:36I did some editing when I posted the script and had the two lines out of order. My mistake...Opps
But I assure you it is correct in the game as you pointed out.
Yes, I still get the error message with the null and the player.equipped = object does not show in the Equipped attribute in the debugger. I think the player.equipped = object is not correct here in this case for some reason.

Forgewright
23 Mar 2020, 00:41I should copy the script into a blank game and see if it works there. Otherwise, the head-scratching will continue. Let's see.

Dcoder
23 Mar 2020, 03:21I'm stumped. Maybe someone else with more insight can suggest something.

Forgewright
25 Mar 2020, 00:06I found that after I equip a short sword it works if it's the first weapon I equipped. player.equipped = short sword
. When I try to equip another weapon, say Eagle sword all of the script works but the debugger shows that the current command is still Equip short sword
, and the player equipped is still short sword as well.
mrangel
25 Mar 2020, 00:20Are you sure that it's not the debugger showing the wrong info?
If you temporarily make a command that prints the currently equipped weapon, or put "equipped" in the player status attributes, does it show the same values as the debugger?

Forgewright
25 Mar 2020, 00:50msg (player.equpped) show the change correctly. But debugger is wrong
mrangel
25 Mar 2020, 15:01In that case, it looks like it's a bug in the debugger. Frustrating, but not something to lose any sleep over. Just makes it a little harder to track any other problems in your code.
(for debugging, I normally have a function something like JS.console.log(ProcessText (param))
; so in the javascript console I can type ASLEvent('Inspect', '{player.equipped}');
to quickly look at the state of variables without interrupting the game. I never tried using the proper debugger)

Forgewright
25 Mar 2020, 16:15That sounds like the best option mrangel. Thanks for helping me out with this. I have spent many days on this one. 😜

Dcoder
25 Mar 2020, 19:43In the Quest debugger, maybe if you click on another object and then click back to the player.equipped attribute, it will refresh and show the correct value.

Forgewright
25 Mar 2020, 20:49Dcoder, you hit on the problem. Everything is working in my script. I check the debugger after the equip command and it is wrong when it replaces a weapon. However, after I enter another command say, 'stats' the debugger catches up and shows correctly.
#happycamper

Dcoder
26 Mar 2020, 00:50Another Scooby mystery solved! 😋