Opened 12 years ago

Closed 12 years ago

Last modified 12 years ago

#3534 closed defect (fixed)

AGI: show.obj priority error

Reported by: SF/agibugs Owned by: SF/buddha_
Priority: normal Component: Engine: AGI
Keywords: Cc:
Game: AGI Fanmade

Description

Version: ScummVM 0.10.0 (Jun 17 2007 18:01:36) OS: Mac OS X 10.4 Engine: AGI Games affected: all AGI games

There seems to be an occasional graphics glitch when inventory items are displayed with show.obj or show.obj.v. Items should be shown in front of all sprites and background objects but sometimes the item appears behind them.

Apparently the problem is related to the width of the view (sprite) depicting the inventory item. The issue probably exists in all games where the horizontal size of an item is <15px.

To reproduce in the fanmade game "AGI Quest": - start game - activate debug mode - type "gimme gimme" to get all inventory items - walk two screens east to the waterfall screen - type "look bottle" - bottom part of item is obscured by rock (error)

I'm unfamiliar with the code but I would guess that the problem is in /scummvm/trunk/engines/agi/sprite.cpp at SpritesMgr::showObj at the following line:

blitCel(x1, y1, s.xSize, c, _vm->_game.views[n].agi256_2);

Looks like the third argument sets the priority which here depends on the width (xSize) of the view. Perhaps s.xSize should be replaced with the value 15?

Ticket imported from: #1858037. Ticket imported from: bugs/3534.

Change History (4)

comment:1 by SF/buddha_, 12 years ago

Owner: set to SF/buddha_

comment:2 by SF/buddha_, 12 years ago

Looking at Sarien's source code at http://sarien.cvs.sourceforge.net/sarien/sarien/src/core/sprite.c?view=log I found that that the third parameter to blitCel was changed from 15 to s.xSize in revision 1.20. You can see the diff at http://sarien.cvs.sourceforge.net/sarien/sarien/src/core/sprite.c?r1=1.19&r2=1.20

Looking at NAGI's source code in src/obj_show.c it looks like NAGI uses priority 15 for showing the objects.

I also took a look at PC AGI 2.917's disassembled code from http://www.agidev.com/projects/nagi/dev.php and by comparing it with NAGI's source code I'd think it uses priority 15 for showing objects too (The disassembly didn't have all the names so this is bit of a guess to be honest). The part I'm referring to here is in Agi2917.idb's subShowObj:

cseg:5EA1 mov byte ptr [bp-0Bh], 0Fh cseg:5EA5 or word ptr [bp-0Ah], 4 cseg:5EAA mov byte ptr [bp-2Dh], 0FFh

I think the first line sets the priority to 15, the second handles some priority related flag and the last line sets view number to 0xFF. This is a guess based on looking at NAGI's source code as it has the following code in it:

In src/obj_show.c in 'void obj_show(u16 view_num)':

obj_view.priority = 0xF; obj_view.flags = obj_view.flags | O_PRIFIXED; obj_view.num = 0xFF;

where O_PRIFIXED has the value of 4.

So based on these observations I will submit a fix to this bug that will change the s.xSize to 15 hoping that it won't break anything that worked already.

comment:3 by SF/buddha_, 12 years ago

Resolution: fixed
Status: newclosed

comment:4 by SF/buddha_, 12 years ago

Revision 29984 fixed this bug and you can see the diff at http://scummvm.svn.sourceforge.net/viewvc/scummvm/scummvm/trunk/engines/agi/sprite.cpp?r1=29854&r2=29984

Note: See TracTickets for help on using tickets.