void DrawObject(int obj, int arg)
{
var od = _objs[obj];
if (_bgNeedsRedraw)
arg = 0;
if (od.Number == 0)
return;
var xpos = (od.Position.X / 8);
var ypos = od.Position.Y;
var width = od.Width / 8;
var height = (od.Height &= 0xFFF8); // Mask out last 3 bits
// Short circuit for objects which aren't visible at all.
if (width == 0 || xpos > _screenEndStrip || xpos + width < _screenStartStrip)
return;
if (od == null || od.Images == null || od.Images.Count == 0)
return;
var x = 0xFFFF;
int numstrip;
for (var a = numstrip = 0; a < width; a++)
{
var tmp = xpos + a;
if (tmp < _screenStartStrip || _screenEndStrip < tmp)
continue;
if (arg > 0 && _screenStartStrip + arg <= tmp)
continue;
if (arg < 0 && tmp <= _screenEndStrip + arg)
continue;
Gdi.SetGfxUsageBit(tmp, Gdi.UsageBitDirty);
if (tmp < x)
x = tmp;
numstrip++;
}
if (numstrip != 0)
{
var flags = od.Flags | DrawBitmaps.ObjectMode;
// Sam & Max needs this to fix object-layering problems with
// the inventory and conversation icons.
if ((_game.GameId == GameId.SamNMax && GetClass(od.Number, ObjectClass.IgnoreBoxes)) ||
(_game.GameId == GameId.FullThrottle && GetClass(od.Number, ObjectClass.Player)))
flags |= DrawBitmaps.DrawMaskOnAll;
ImageData img = null;
if (Game.Version > 4)
{
var state = GetStateCore(od.Number);
if (state > 0 && (state - 1) < od.Images.Count)
{
img = od.Images[state - 1];
}
}
else
{
img = od.Images.FirstOrDefault();
}
if (img != null)
{
Gdi.DrawBitmap(img, _mainVirtScreen, x, ypos, width * 8, height, x - xpos, numstrip, roomData.Header.Width, flags);
}
}
}