protected void RunObjectScript(int obj, byte entry, bool freezeResistant, bool recursive, int[] vars, int slot = -1)
{
if (obj == 0)
return;
if (!recursive && (Game.Version >= 3))
StopObjectScriptCore((ushort)obj);
var where = GetWhereIsObject(obj);
if (where == WhereIsObject.NotFound)
{
// Console.Error.WriteLine("warning: Code for object {0} not in room {1}", obj, _roomResource);
return;
}
// Find a free object slot, unless one was specified
if (slot == -1)
slot = GetScriptSlotIndex();
ObjectData objFound = null;
if (roomData != null)
{
objFound = (from o in roomData.Objects.Concat(_invData)
where o != null
where o.Number == obj
where o.ScriptOffsets.ContainsKey(entry) || o.ScriptOffsets.ContainsKey(0xFF)
select o).FirstOrDefault();
}
if (objFound == null)
{
objFound = (from o in _objs
where o.Number == obj
where o.ScriptOffsets.ContainsKey(entry) || o.ScriptOffsets.ContainsKey(0xFF)
select o).FirstOrDefault();
}
if (objFound == null)
return;
_slots[slot] = new ScriptSlot
{
Number = (ushort)obj,
InventoryEntry = entry,
Offset = (uint)((objFound.ScriptOffsets.ContainsKey(entry) ? objFound.ScriptOffsets[entry] : objFound.ScriptOffsets[0xFF]) - objFound.Script.Offset),
Status = ScriptStatus.Running,
Where = where,
FreezeResistant = freezeResistant,
Recursive = recursive
};
_slots[slot].InitializeLocals(vars);
// V0 Ensure we don't try and access objects via index inside the script
//_v0ObjectIndex = false;
UpdateScriptData((ushort)slot);
RunScriptNested(slot);
}