private void CreatePointer(uint ptrId, uint luggageId) { _currentPtr = null; if (ptrId != 0) { MousePtr lugg = null; MousePtr ptr = new MousePtr(_resMan.OpenFetchRes(ptrId)); ushort noFrames = _resMan.ReadUInt16(ptr.numFrames); ushort ptrSizeX = _resMan.ReadUInt16(ptr.sizeX); ushort ptrSizeY = _resMan.ReadUInt16(ptr.sizeY); ushort luggSizeX = 0; ushort luggSizeY = 0; ushort resSizeX; ushort resSizeY; if (Sword1.SystemVars.Platform == Platform.PSX) //PSX pointers are half height { ptrSizeY *= 2; } if (luggageId != 0) { lugg = new MousePtr(_resMan.OpenFetchRes(luggageId)); luggSizeX = _resMan.ReadUInt16(lugg.sizeX); luggSizeY = _resMan.ReadUInt16(lugg.sizeY); if (SystemVars.Platform == Platform.PSX) { luggSizeY *= 2; } resSizeX = Math.Max(ptrSizeX, (ushort)((ptrSizeX / 2) + luggSizeX)); resSizeY = Math.Max(ptrSizeY, (ushort)((ptrSizeY / 2) + luggSizeY)); } else { resSizeX = ptrSizeX; resSizeY = ptrSizeY; } _currentPtr = new MousePtr(new byte[MousePtr.Size + resSizeX * resSizeY * noFrames]); _currentPtr.hotSpotX = _resMan.ReadUInt16(ptr.hotSpotX); _currentPtr.hotSpotY = _resMan.ReadUInt16(ptr.hotSpotY); _currentPtr.numFrames = noFrames; _currentPtr.sizeX = resSizeX; _currentPtr.sizeY = resSizeY; var ptrData = _currentPtr; var ptrDataOff = MousePtr.Size; int dstDataOff = 0; ptrData.Data.Set(ptrData.Offset + ptrDataOff, 255, resSizeX * resSizeY * noFrames); if (luggageId != 0) { dstDataOff = ptrDataOff + resSizeX - luggSizeX; for (uint frameCnt = 0; frameCnt < noFrames; frameCnt++) { var luggSrc = MousePtr.Size; dstDataOff += (resSizeY - luggSizeY) * resSizeX; for (uint cnty = 0; cnty < (uint)(SystemVars.Platform == Platform.PSX ? luggSizeY / 2 : luggSizeY); cnty++) { for (uint cntx = 0; cntx < luggSizeX; cntx++) { if (lugg.Data[lugg.Offset + luggSrc + cntx] != 0) { ptrData.Data[ptrData.Offset + dstDataOff + cntx] = lugg.Data[lugg.Offset + luggSrc + cntx]; } } if (SystemVars.Platform == Platform.PSX) { dstDataOff += resSizeX; for (uint cntx = 0; cntx < luggSizeX; cntx++) { if (lugg.Data[lugg.Offset + luggSrc + cntx] != 0) { ptrData.Data[ptrData.Offset + dstDataOff + cntx] = lugg.Data[lugg.Offset + luggSrc + cntx]; } } } dstDataOff += resSizeX; luggSrc += luggSizeX; } } _resMan.ResClose(luggageId); } dstDataOff = ptrDataOff; var srcDataOff = MousePtr.Size; for (uint frameCnt = 0; frameCnt < noFrames; frameCnt++) { for (uint cnty = 0; cnty < (uint)(SystemVars.Platform == Platform.PSX ? ptrSizeY / 2 : ptrSizeY); cnty++) { for (uint cntx = 0; cntx < ptrSizeX; cntx++) { if (ptr.Data[ptr.Offset + srcDataOff + cntx] != 0) { ptrData.Data[ptrData.Offset + dstDataOff + cntx] = ptr.Data[ptr.Offset + srcDataOff + cntx]; } } if (SystemVars.Platform == Platform.PSX) { dstDataOff += resSizeX; for (uint cntx = 0; cntx < ptrSizeX; cntx++) { if (ptr.Data[ptr.Offset + srcDataOff + cntx] != 0) { ptrData.Data[ptrData.Offset + dstDataOff + cntx] = ptr.Data[ptr.Offset + srcDataOff + cntx]; } } } srcDataOff += ptrSizeX; dstDataOff += resSizeX; } dstDataOff += (resSizeY - ptrSizeY) * resSizeX; } _resMan.ResClose(ptrId); } }
private void CreatePointer(uint ptrId, uint luggageId) { _currentPtr = null; if (ptrId != 0) { MousePtr lugg = null; MousePtr ptr = new MousePtr(_resMan.OpenFetchRes(ptrId)); ushort noFrames = _resMan.ReadUInt16(ptr.numFrames); ushort ptrSizeX = _resMan.ReadUInt16(ptr.sizeX); ushort ptrSizeY = _resMan.ReadUInt16(ptr.sizeY); ushort luggSizeX = 0; ushort luggSizeY = 0; ushort resSizeX; ushort resSizeY; if (Sword1.SystemVars.Platform == Platform.PSX) //PSX pointers are half height ptrSizeY *= 2; if (luggageId != 0) { lugg = new MousePtr(_resMan.OpenFetchRes(luggageId)); luggSizeX = _resMan.ReadUInt16(lugg.sizeX); luggSizeY = _resMan.ReadUInt16(lugg.sizeY); if (SystemVars.Platform == Platform.PSX) luggSizeY *= 2; resSizeX = Math.Max(ptrSizeX, (ushort)((ptrSizeX / 2) + luggSizeX)); resSizeY = Math.Max(ptrSizeY, (ushort)((ptrSizeY / 2) + luggSizeY)); } else { resSizeX = ptrSizeX; resSizeY = ptrSizeY; } _currentPtr = new MousePtr(new byte[MousePtr.Size + resSizeX * resSizeY * noFrames]); _currentPtr.hotSpotX = _resMan.ReadUInt16(ptr.hotSpotX); _currentPtr.hotSpotY = _resMan.ReadUInt16(ptr.hotSpotY); _currentPtr.numFrames = noFrames; _currentPtr.sizeX = resSizeX; _currentPtr.sizeY = resSizeY; var ptrData = _currentPtr; var ptrDataOff = MousePtr.Size; int dstDataOff = 0; ptrData.Data.Set(ptrData.Offset + ptrDataOff, 255, resSizeX * resSizeY * noFrames); if (luggageId != 0) { dstDataOff = ptrDataOff + resSizeX - luggSizeX; for (uint frameCnt = 0; frameCnt < noFrames; frameCnt++) { var luggSrc = MousePtr.Size; dstDataOff += (resSizeY - luggSizeY) * resSizeX; for (uint cnty = 0; cnty < (uint)(SystemVars.Platform == Platform.PSX ? luggSizeY / 2 : luggSizeY); cnty++) { for (uint cntx = 0; cntx < luggSizeX; cntx++) if (lugg.Data[lugg.Offset + luggSrc + cntx] != 0) ptrData.Data[ptrData.Offset + dstDataOff + cntx] = lugg.Data[lugg.Offset + luggSrc + cntx]; if (SystemVars.Platform == Platform.PSX) { dstDataOff += resSizeX; for (uint cntx = 0; cntx < luggSizeX; cntx++) if (lugg.Data[lugg.Offset + luggSrc + cntx] != 0) ptrData.Data[ptrData.Offset + dstDataOff + cntx] = lugg.Data[lugg.Offset + luggSrc + cntx]; } dstDataOff += resSizeX; luggSrc += luggSizeX; } } _resMan.ResClose(luggageId); } dstDataOff = ptrDataOff; var srcDataOff = MousePtr.Size; for (uint frameCnt = 0; frameCnt < noFrames; frameCnt++) { for (uint cnty = 0; cnty < (uint)(SystemVars.Platform == Platform.PSX ? ptrSizeY / 2 : ptrSizeY); cnty++) { for (uint cntx = 0; cntx < ptrSizeX; cntx++) if (ptr.Data[ptr.Offset + srcDataOff + cntx] != 0) ptrData.Data[ptrData.Offset + dstDataOff + cntx] = ptr.Data[ptr.Offset + srcDataOff + cntx]; if (SystemVars.Platform == Platform.PSX) { dstDataOff += resSizeX; for (uint cntx = 0; cntx < ptrSizeX; cntx++) if (ptr.Data[ptr.Offset + srcDataOff + cntx] != 0) ptrData.Data[ptrData.Offset + dstDataOff + cntx] = ptr.Data[ptr.Offset + srcDataOff + cntx]; } srcDataOff += ptrSizeX; dstDataOff += resSizeX; } dstDataOff += (resSizeY - ptrSizeY) * resSizeX; } _resMan.ResClose(ptrId); } }