Object Descriptions in Room
Laraqua
09 Jun 2021, 11:45How do I get the object's description to appear in the room description while it's in the room? So it'd show up like this:
"(Room Description) The room is dark and covered in chalk drawings.
There's a gun lying on the floor."
Then if they pick up the gun, the description is no longer there. I know I could do a "If
Pertex
09 Jun 2021, 12:23You could use the inroomdescription of that object
Laraqua
09 Jun 2021, 22:36Where do I find that on the program itself? Or is it script code I can put in the object's description?

DarkLizerd
10 Jun 2021, 00:07It should be on the object's tab itself.
Hmm, maybe what I'm referring to was dropped in Quest 5.80.
jmnevil54
10 Jun 2021, 01:25Are you using the online or the desktop version of Quest?
Laraqua
10 Jun 2021, 03:04Desktop version of Quest.
Deckrect
10 Jun 2021, 10:18Look, as far as I know, if you use the automatic room descriptions, it will just put in the room description something like "You see a gun."
I think the best way doing it is changing the room description for a script. The first part of the script is a print massage with the first part of the room's description. Then you add an scrip checking IF Object RoomX contains Object Gun, THEN print "There is a gun on the floor."
I find it a far better way to control the way the descriptions get into the game.
K.V.
10 Jun 2021, 14:58Hello.
Honestly, Deckrect's advice is the way I'd handle it, but to use in-room descriptions for objects:
First, click on the game
object the object tree. Then, click on the "Features" tab.
Then, check the box to select "In-room descriptions [...]".
After doing that, your objects will have a new "In-room description" option.
EDIT
Also, make the object scenery by checking the "Scenery" option.
I used the text processor to check if the object is scenery before printing the in-room description in this (updated) example.
That only works before it is picked up the first time, though.
mrangel
10 Jun 2021, 15:01Where do I find that on the program itself? Or is it script code I can put in the object's description?
On the game's Features tab there is a checkbox "In-room descriptions: additional text which each object contributes to a room description"
Once that is enabled, the object's Setup tab will have a space at the bottom for "In-room description".
This will be added to the end of the room description when the object is present, but it will not remove the object from the "You can see:" list. So if you don't want the object to be mentioned twice, you would need to either make it 'scenery', or turn off the objects list.
I've made a little modification that causes an object to be displayed only once, but this requires modifying some of the core functions so only works on the desktop editor.
mrangel
10 Jun 2021, 15:02Ah, posting at the same time :)
K.V.
10 Jun 2021, 15:11This is the way I'd advise a new Quest user handle Deckrect's advice:
If the gun object is actually gun
and the current room name is actually room
, set the scenery
attribute on the gun
object to true
. (Don't worry, when it is picked up the first time, scenery
will be changed to false
; which also makes this only work before the gun is picked up for the first time.)
The room description:
The room is dark and covered in chalk drawings.{if gun.parent=room:{if gun.scenery:
There's a gun lying on the floor.}}
Screenshots:
But after taking the gun the first time, the magic is gone.
If you drop it again using this code, it will just go back to the defaults:
K.V.
10 Jun 2021, 15:15PS
If you want to get more complicated than this, you can make the game behave however you want. So, just say the word if you want to get down even funkier than any of the current examples will allow.
K.V.
10 Jun 2021, 15:37Ha!
I see I missed two posts by mrangel whilst playing with all of that code.
As he says, you can get a little bit more complicated if you wish and modify the objects list behavior.
I couldn't find anything in the docs explaining the in-room descriptions; so, I posted all the screenshots in that first example. (I only searched through the docs for 3 or 4 minutes. So, there may already be an existing one that I missed.)
mrangel
10 Jun 2021, 16:04In case you want to see it, this is how I'd modify two functions so that objects with "in room descriptions" are removed from the default "You can see:" list:
Click to show
As usual, I've highlighted code I added in green, and code I replaced in blue. <function name="ShowRoomDescription">
<![CDATA[
if (GetBoolean (game, "suppressduplicateobjects")) {
game.pov.objectsinroomdescription = NewObjectList()
}
showndescription = false
isDark = CheckDarkness()
if (isDark) {
descriptionfield = "darkroomdescription"
}
else {
descriptionfield = "description"
}
if (game.autodescription) {
desc = ""
for (i, 1, 4) {
if (i = game.autodescription_youarein) {
if (game.autodescription_youarein_useprefix) {
youarein = game.pov.parent.descprefix
desc = AddDescriptionLine (desc, youarein + " " + GetDisplayName(game.pov.parent) + ".")
}
else {
desc = AddDescriptionLine (desc, "<b>" + CapFirst(GetDisplayName(game.pov.parent)) + "</b>")
}
if (game.autodescription_youarein_newline) {
msg (desc + "<br/>")
desc = ""
}
}
if (i = game.autodescription_youcansee) {
objects = ""
objectlist = RemoveSceneryObjects (GetDirectChildren (GetNonTransparentParent (game.pov.parent)))
if (isDark) {
objectlist = RemoveDarkObjects (objectlist)
}
if (GetBoolean (game, "suppressduplicateobjects") and ListCount(objectlist) > 0) {
// Bodge to make it work if the description is after the object list, or there's no newline between them
game.tempdictionary = game.textprocessor_seen
if (not showndescription) {
ProcessText (GetRoomDescription ())
}
else if (not desc = "") {
ProcessText (desc)
}
game.textprocessor_seen = game.tempdictionary
game.tempdictionary = null
// I apologise for the ugliness of the bodge above. Feel free to remove it if you don't need it
objectlist = ListExclude (objectlist, game.pov.objectsinroomdescription)
}
if (ListCount (objectlist) > 0) {
objects = game.pov.parent.objectslistprefix + FormatList(objectlist, ", ", Template("And"), "") + "."
}
desc = AddDescriptionLine(desc, objects)
if (game.autodescription_youcansee_newline) {
msg (desc + "<br/>")
desc = ""
}
}
if (i = game.autodescription_youcango) {
exits = FormatExitList(game.pov.parent.exitslistprefix, GetExitsList(), Template("Or"), ".")
desc = AddDescriptionLine(desc, exits)
if (game.autodescription_youcango_newline) {
msg (desc + "<br/>")
desc = ""
}
}
if (i = game.autodescription_description) {
showndescription = true
if (HasScript(game.pov.parent, descriptionfield)) {
if (LengthOf(desc) > 0) {
msg (desc)
desc = ""
}
do (game.pov.parent, descriptionfield)
if (game.autodescription_description_newline) {
msg ("")
}
}
else {
desc = AddDescriptionLine(desc, GetRoomDescription())
if (game.autodescription_description_newline) {
msg (desc + "<br/>")
desc = ""
}
}
}
}
if (LengthOf(desc) > 0) {
msg (desc)
}
}
else {
if (HasScript(game.pov.parent, descriptionfield)) {
do (game.pov.parent, descriptionfield)
}
else {
fulldesc = GetRoomDescription()
if (LengthOf(fulldesc) > 0) {
msg (fulldesc)
}
}
}
]]>
</function>
<function name="ProcessTextCommand_Object" type="string" parameters="section, data">
<![CDATA[
objectname = Mid(section, 8)
text = ""
colon = Instr(objectname, ":")
if (colon > 0) {
text = Mid(objectname, colon + 1)
objectname = Left(objectname, colon - 1)
}
object = ObjectForTextProcessor(objectname)
if (object = null) {
return ("@@@open@@@" + ProcessTextSection(section, data) + "@@@close@@@")
}
else {
if (HasAttribute (game.pov, "objectsinroomdescription")) {
list add (game.pov.objectsinroomdescription, object)
}
if (LengthOf(text) = 0) {
text = SafeXML(GetDisplayAlias(object))
}
if (game.enablehyperlinks) {
linkid = ProcessTextCommand_GetNextLinkId()
colour = ""
if (HasString(object, "linkcolour") and GetUIOption("UseGameColours") = "true") {
colour = object.linkcolour
}
else {
colour = GetLinkTextColour()
}
style = GetCurrentTextFormat(colour)
return ("<a id=\"" + linkid + "\" style=\"" + style + "\" class=\"cmdlink elementmenu\" data-elementid=\"" + object.name + "\">" + text + "</a>")
}
else {
return (text)
}
}
]]>
</function>

DarkLizerd
11 Jun 2021, 03:24Good! I thought I was dreaming about seeing that before.
Laraqua
11 Jun 2021, 04:44Thank you so much! I hadn't realised I needed to enable it. :)