Bug in visibility?

I’m having an issue where the player can see an item inside a closed opaque container.

> (visibility ceiling of #receipt is $)
| | | QUERY (visibility ceiling of #receipt is $)
| | | | ENTER (visibility ceiling of #receipt is #receipt) /usr/local/share/dialog-if/stdlib.dg:359
| | | | QUERY (room #receipt) /usr/local/share/dialog-if/stdlib.dg:359
| | | | ENTER (visibility ceiling of #receipt is $) /usr/local/share/dialog-if/stdlib.dg:361
| | | | QUERY *(#receipt has parent $) /usr/local/share/dialog-if/stdlib.dg:362
| | | | FOUND (#receipt has parent #wallet) /usr/local/share/dialog-if/stdlib.dg:362
| | | | QUERY *(#receipt has relation #in) /usr/local/share/dialog-if/stdlib.dg:362
| | | | FOUND (#receipt has relation #in) /usr/local/share/dialog-if/stdlib.dg:362
| | | | QUERY (#wallet is opaque) /usr/local/share/dialog-if/stdlib.dg:363
| | | | FOUND (#wallet is opaque) /usr/local/share/dialog-if/stdlib.dg:363
| | | | QUERY (#wallet is closed) /usr/local/share/dialog-if/stdlib.dg:364
| | | | FOUND (#wallet is closed) /usr/local/share/dialog-if/stdlib.dg:364
| | | FOUND (visibility ceiling of #receipt is #wallet)
Query succeeded: (visibility ceiling of #receipt is #wallet)
> (player can see #receipt)
| | | | QUERY (player can see #receipt)
| | | | | ENTER (player can see #receipt) /usr/local/share/dialog-if/stdlib.dg:370
| | | | | QUERY (current visibility ceiling $) /usr/local/share/dialog-if/stdlib.dg:371
| | | | | FOUND (current visibility ceiling #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:371
| | | | | QUERY (visibility ceiling of #receipt is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:372
| | | | | | ENTER (visibility ceiling of #receipt is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:361
| | | | | | QUERY *(#receipt has parent #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | ENTER (visibility ceiling of #receipt is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:366
| | | | | | QUERY (#receipt has parent $) /usr/local/share/dialog-if/stdlib.dg:367
| | | | | | FOUND (#receipt has parent #wallet) /usr/local/share/dialog-if/stdlib.dg:367
| | | | | | QUERY (visibility ceiling of #wallet is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:368
| | | | | | | ENTER (visibility ceiling of #wallet is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:361
| | | | | | | QUERY *(#wallet has parent #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | ENTER (visibility ceiling of #wallet is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:366
| | | | | | | QUERY (#wallet has parent $) /usr/local/share/dialog-if/stdlib.dg:367
| | | | | | | FOUND (#wallet has parent #knock) /usr/local/share/dialog-if/stdlib.dg:367
| | | | | | | QUERY (visibility ceiling of #knock is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:368
| | | | | | | | ENTER (visibility ceiling of #knock is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:361
| | | | | | | | QUERY *(#knock has parent #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | | ENTER (visibility ceiling of #knock is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:366
| | | | | | | | QUERY (#knock has parent $) /usr/local/share/dialog-if/stdlib.dg:367
| | | | | | | | FOUND (#knock has parent #pickup-truck) /usr/local/share/dialog-if/stdlib.dg:367
| | | | | | | | QUERY (visibility ceiling of #pickup-truck is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:368
| | | | | | | | | ENTER (visibility ceiling of #pickup-truck is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:361
| | | | | | | | | QUERY *(#pickup-truck has parent #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | | | FOUND (#pickup-truck has parent #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | | | QUERY *(#pickup-truck has relation #in) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | | | FOUND (#pickup-truck has relation #in) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | | | QUERY (#middle-of-nowhere is opaque) /usr/local/share/dialog-if/stdlib.dg:363
| | | | | | | | | ENTER (visibility ceiling of #pickup-truck is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:366
| | | | | | | | | QUERY (#pickup-truck has parent $) /usr/local/share/dialog-if/stdlib.dg:367
| | | | | | | | | FOUND (#pickup-truck has parent #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:367
| | | | | | | | | QUERY (visibility ceiling of #middle-of-nowhere is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:368
| | | | | | | | | | ENTER (visibility ceiling of #middle-of-nowhere is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:359
| | | | | | | | | | QUERY (room #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:359
| | | | | | | | | | FOUND (room #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:359
| | | | | | | | | FOUND (visibility ceiling of #middle-of-nowhere is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:368
| | | | | | | | FOUND (visibility ceiling of #pickup-truck is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:368
| | | | | | | FOUND (visibility ceiling of #knock is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:368
| | | | | | FOUND (visibility ceiling of #wallet is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:368
| | | | | FOUND (visibility ceiling of #receipt is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:372
| | | | | QUERY (player can see) /usr/local/share/dialog-if/stdlib.dg:374
| | | | | FOUND (player can see) /usr/local/share/dialog-if/stdlib.dg:374
| | | | FOUND (player can see #receipt)
Query succeeded: (player can see #receipt)

It’s odd that if you ask for the visibility ceiling of the receipt by itself, it gets the right answer (the wallet, since it is closed and opaque). But doing what looks like the same query in (player can see $) gets it wrong, escalating up through the wallet to the room.

1 Like

I think a multi query is to blame, somewhere:

> *(visibility ceiling of #receipt is $)
| | | | | | QUERY *(visibility ceiling of #receipt is $)
| | | | | | | ENTER (visibility ceiling of #receipt is #receipt) /usr/local/share/dialog-if/stdlib.dg:359
| | | | | | | QUERY (room #receipt) /usr/local/share/dialog-if/stdlib.dg:359
| | | | | | | ENTER (visibility ceiling of #receipt is $) /usr/local/share/dialog-if/stdlib.dg:361
| | | | | | | QUERY *(#receipt has parent $) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | FOUND (#receipt has parent #wallet) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | QUERY *(#receipt has relation #in) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | FOUND (#receipt has relation #in) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | QUERY (#wallet is opaque) /usr/local/share/dialog-if/stdlib.dg:363
| | | | | | | FOUND (#wallet is opaque) /usr/local/share/dialog-if/stdlib.dg:363
| | | | | | | QUERY (#wallet is closed) /usr/local/share/dialog-if/stdlib.dg:364
| | | | | | | FOUND (#wallet is closed) /usr/local/share/dialog-if/stdlib.dg:364
| | | | | | FOUND (visibility ceiling of #receipt is #wallet)
Query succeeded: (visibility ceiling of #receipt is #wallet)
| | | | | | | ENTER (visibility ceiling of #receipt is $) /usr/local/share/dialog-if/stdlib.dg:366
| | | | | | | QUERY (#receipt has parent $) /usr/local/share/dialog-if/stdlib.dg:367
| | | | | | | FOUND (#receipt has parent #wallet) /usr/local/share/dialog-if/stdlib.dg:367
| | | | | | | QUERY (visibility ceiling of #wallet is $) /usr/local/share/dialog-if/stdlib.dg:368
| | | | | | | | ENTER (visibility ceiling of #wallet is #wallet) /usr/local/share/dialog-if/stdlib.dg:359
| | | | | | | | QUERY (room #wallet) /usr/local/share/dialog-if/stdlib.dg:359
| | | | | | | | ENTER (visibility ceiling of #wallet is $) /usr/local/share/dialog-if/stdlib.dg:361
| | | | | | | | QUERY *(#wallet has parent $) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | | FOUND (#wallet has parent #knock) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | | QUERY *(#wallet has relation #in) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | | ENTER (visibility ceiling of #wallet is $) /usr/local/share/dialog-if/stdlib.dg:366
| | | | | | | | QUERY (#wallet has parent $) /usr/local/share/dialog-if/stdlib.dg:367
| | | | | | | | FOUND (#wallet has parent #knock) /usr/local/share/dialog-if/stdlib.dg:367
| | | | | | | | QUERY (visibility ceiling of #knock is $) /usr/local/share/dialog-if/stdlib.dg:368
| | | | | | | | | ENTER (visibility ceiling of #knock is #knock) /usr/local/share/dialog-if/stdlib.dg:359
| | | | | | | | | QUERY (room #knock) /usr/local/share/dialog-if/stdlib.dg:359
| | | | | | | | | ENTER (visibility ceiling of #knock is $) /usr/local/share/dialog-if/stdlib.dg:361
| | | | | | | | | QUERY *(#knock has parent $) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | | | FOUND (#knock has parent #pickup-truck) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | | | QUERY *(#knock has relation #in) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | | | FOUND (#knock has relation #in) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | | | QUERY (#pickup-truck is opaque) /usr/local/share/dialog-if/stdlib.dg:363
| | | | | | | | | ENTER (visibility ceiling of #knock is $) /usr/local/share/dialog-if/stdlib.dg:366
| | | | | | | | | QUERY (#knock has parent $) /usr/local/share/dialog-if/stdlib.dg:367
| | | | | | | | | FOUND (#knock has parent #pickup-truck) /usr/local/share/dialog-if/stdlib.dg:367
| | | | | | | | | QUERY (visibility ceiling of #pickup-truck is $) /usr/local/share/dialog-if/stdlib.dg:368
| | | | | | | | | | ENTER (visibility ceiling of #pickup-truck is #pickup-truck) /usr/local/share/dialog-if/stdlib.dg:359
| | | | | | | | | | QUERY (room #pickup-truck) /usr/local/share/dialog-if/stdlib.dg:359
| | | | | | | | | | ENTER (visibility ceiling of #pickup-truck is $) /usr/local/share/dialog-if/stdlib.dg:361
| | | | | | | | | | QUERY *(#pickup-truck has parent $) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | | | | FOUND (#pickup-truck has parent #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | | | | QUERY *(#pickup-truck has relation #in) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | | | | FOUND (#pickup-truck has relation #in) /usr/local/share/dialog-if/stdlib.dg:362
| | | | | | | | | | QUERY (#middle-of-nowhere is opaque) /usr/local/share/dialog-if/stdlib.dg:363
| | | | | | | | | | ENTER (visibility ceiling of #pickup-truck is $) /usr/local/share/dialog-if/stdlib.dg:366
| | | | | | | | | | QUERY (#pickup-truck has parent $) /usr/local/share/dialog-if/stdlib.dg:367
| | | | | | | | | | FOUND (#pickup-truck has parent #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:367
| | | | | | | | | | QUERY (visibility ceiling of #middle-of-nowhere is $) /usr/local/share/dialog-if/stdlib.dg:368
| | | | | | | | | | | ENTER (visibility ceiling of #middle-of-nowhere is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:359
| | | | | | | | | | | QUERY (room #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:359
| | | | | | | | | | | FOUND (room #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:359
| | | | | | | | | | FOUND (visibility ceiling of #middle-of-nowhere is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:368
| | | | | | | | | FOUND (visibility ceiling of #pickup-truck is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:368
| | | | | | | | FOUND (visibility ceiling of #knock is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:368
| | | | | | | FOUND (visibility ceiling of #wallet is #middle-of-nowhere) /usr/local/share/dialog-if/stdlib.dg:368
| | | | | | FOUND (visibility ceiling of #receipt is #middle-of-nowhere)
Query succeeded: (visibility ceiling of #receipt is #middle-of-nowhere)

Good catch! It looks like (visibility ceiling of $ is $) only works properly when the second parameter is unbound. I’ll fix it.