示例#1
0
void Sprites::Arm(ULO spriteNo)
{
    // Actually this is kind of wrong since each sprite serialises independently
    bool is16Color = Is16Color(spriteNo);
    if (is16Color && (spriteNo & 1) == 0) // Only arm the odd sprite
    {
        Arm(spriteNo + 1);
        SpriteState[spriteNo].armed = false;
        return;
    }
    SpriteState[spriteNo].armed = true;
    SpriteState[spriteNo].x_cylinder = SpriteState[spriteNo].x;
    SpriteState[spriteNo].pixels_output = 0;
    SpriteState[spriteNo].dat_hold[0].w = SpriteState[spriteNo].dat[0];
    SpriteState[spriteNo].dat_hold[1].w = SpriteState[spriteNo].dat[1];
    if (is16Color)
    {
        SpriteState[spriteNo].dat_hold[2].w = SpriteState[spriteNo - 1].dat[0];
        SpriteState[spriteNo].dat_hold[3].w = SpriteState[spriteNo - 1].dat[1];
        Decode16(spriteNo);
    }
    else
    {
        Decode4(spriteNo);
    }
}
示例#2
0
/// Decoding
///
/// Remarks: pvSrc is decoded first
///
/// @param pclArc     Archive
/// @param pvSrc      Compressed data
/// @param dwSrcSize  Compressed data size
/// @param pfnDecrypt Decoding function
///
BOOL CPB3B::Decode(CArcFile* pclArc, void* pvSrc, DWORD dwSrcSize, PB3B_DECRYPT pfnDecrypt)
{
	BYTE* pbtSrc = (BYTE*)pvSrc;

	// Decryption
	Decrypt(pbtSrc, dwSrcSize);

	// Get image information
	WORD wType = *(WORD*)&pbtSrc[28];
	long lWidth = *(WORD*)&pbtSrc[30];
	long lHeight = *(WORD*)&pbtSrc[32];
	WORD wBpp = *(WORD*)&pbtSrc[34];

	switch (wType)
	{
	case 1:
		Decode1(pclArc, pbtSrc, dwSrcSize, lWidth, lHeight, wBpp);
		break;

	case 2:
	case 3:
		Decode3(pclArc, pbtSrc, dwSrcSize, lWidth, lHeight, wBpp);
		break;

	case 4:
		Decode4(pclArc, pbtSrc, dwSrcSize, lWidth, lHeight, wBpp);
		break;

	case 5:
		Decode5(pclArc, pbtSrc, dwSrcSize, lWidth, lHeight, wBpp);
		break;

	case 6:
		Decode6(pclArc, pbtSrc, dwSrcSize, lWidth, lHeight, wBpp, pfnDecrypt);
		break;

	default: // Unknown
		pclArc->OpenFile();
		pclArc->WriteFile(pbtSrc, dwSrcSize);
		break;
	}

	return TRUE;
}
示例#3
0
/// Decode
///
/// Remark: pvSrc can be used to decrypt the first part
///
/// @param archive  Archive
/// @param src      Compressed data
/// @param src_size Compressed data size
///
bool CPB2A::Decode(CArcFile* archive, u8* src, size_t src_size)
{
	// Decrypt
	Decrypt(src, src_size);

	// Get image information
	const u16 type   = *reinterpret_cast<u16*>(&src[16]);
	const s32 width  = *reinterpret_cast<u16*>(&src[18]);
	const s32 height = *reinterpret_cast<u16*>(&src[20]);
	const u16 bpp    = *reinterpret_cast<u16*>(&src[22]);

	// Decompression
	switch (type)
	{
	case 1:
		Decode1(archive, src, src_size, width, height, bpp);
		break;

	case 2:
		Decode2(archive, src, src_size, width, height, bpp);
		break;

	case 3:
	case 4:
		Decode4(archive, src, src_size, width, height, bpp);
		break;

	case 5:
		Decode5(archive, src, src_size, width, height, bpp);
		break;

	case 6:
		Decode6(archive, src, src_size, width, height, bpp);
		break;

	default: // Unknown
		archive->OpenFile();
		archive->WriteFile(src, src_size);
		break;
	}

	return true;
}