The Places and Objects pane

Forgewright
28 Apr 2020, 10:10

I decided long ago to have the items in the places and objects pane and inventory pane be capitalized. Now, I found that when I sell an item to a shop, which shows in the objects pane, it is in lower case and if I buy it back it is still in lower case.
I can't add the CapsFirst function to it because many items have two words in the name.

In this custom sell command, how can I get the desired effect I need?

if (not HasAttribute(game.pov.parent, "stock")) {
  ClearTurn
  msg ("You can't sell stuff here.")
}
else if (not object.parent = game.pov) {
  ClearTurn
  msg ("You're not carrying " + object.article + ".")
}
else if (HasAttribute(object, "burned")) {
  if (object.burned = true) {
    ClearTurn
    msg (player.parent.owner.alias + " says,<br><i>I have no use for a used torch.")
  }
}
else if (HasAttribute(object, "sell")) {
  ClearTurn
  game.selling_object = object
  Ask ("I will give you " + game.selling_object.price + " gold. OK?") {
    object = game.selling_object
    if (result) {
      msg ("You sell " + object.article + " for " + object.price + " gold.")
      game.pov.money = game.pov.money + object.price
      if (GetBoolean(object, "cloneme")) {
        RemoveObject (object)
      }
      else {
        object.parent = game.pov.parent.stock
        SetUpMerchandise (object)
      }
    }
    else {
      msg ("You turn down the offer of " + object.price + " gold.")
    }
  }
}

Forgewright
28 Apr 2020, 17:34

Actually, I think it needs to be done in the SetUpMerchandise function.

if (not HasString(obj, "alias")) {
  obj.alias = obj.name
}
obj.listalias = obj.alias + " (" + DisplayMoney(BuyingPrice(obj)) + ")"
obj.cloneme = false
obj.take => {
  StealObject (this)
}
obj.buy => {
  BuyObject (this)
}

mrangel
28 Apr 2020, 17:51

I was going to ask.

So, am I right in assuming that the alias is lowercase, but the listalias has capitals?

In that case, I'd suggest replacing
obj.listalias = obj.alias + " (" + DisplayMoney(BuyingPrice(obj)) + ")"
with something like:

listalias = ""
foreach (word, Split (GetDisplayAlias (obj), " ")) {
  listalias = listalias + " " + CapFirst (word)
}
obj.listalias = Mid (listalias, 2) + " (" + DisplayMoney(BuyingPrice(obj)) + ")"

This is one place I really wish Quest had a regexp replace function. Doing the same thing in JS would be as simple as:

object.listalias = object.alias.replace (/\d\w/g, letter => letter.toUpperCase());

I notice that this function adds the price to the object's listalias… you'll probably need to do the same (in BuyObject?) when the price is removed.


Forgewright
28 Apr 2020, 20:37

This worked for the buy command. I had added an attribute called orignalalias to sellable objects which returns listalias back.

if (object.price > game.pov.money) {
  msg ("You can't afford that!")
}
else {
  object.take = true
  object.parent = game.pov
  object.buy = null
  list remove (object.inventoryverbs, "Buy")
  player.money = game.pov.money - BuyingPrice(object)
  object.listalias = object.orignalalias
  msg ("You decide to buy " + object.article + " for " + DisplayMoney(BuyingPrice(object)) + ".")
}

The buy attribute script for the object is now

if (object.price > game.pov.money) {
  msg ("You can't afford that!")
}
else {
  object.take = true
  object.parent = game.pov
  object.buy = null
  list remove (object.inventoryverbs, "Buy")
  player.money = game.pov.money - BuyingPrice(object)
  object.listalias = object.orignalalias
  msg ("You decide to buy " + object.article + " for " + DisplayMoney(BuyingPrice(object)) + ".")
}