public void Draw()
{
FrameHeader fHead = new FrameHeader(_resMan.FetchFrame(_resMan.FetchRes(_resId), (uint)_frameIdx));
ByteAccess src = new ByteAccess(fHead.Data.Data, fHead.Data.Offset + FrameHeader.Size);
var dst = new ByteAccess(_dstBuf);
if (SystemVars.Platform == Platform.PSX && _resId != 0)
{
var HIFbuf = new byte[_resMan.ReadUInt16(fHead.height) * _resMan.ReadUInt16(fHead.width)];
Screen.DecompressHIF(src.Data, src.Offset, HIFbuf);
src = new ByteAccess(HIFbuf);
if (_resMan.ReadUInt16(fHead.width) < 300)
for (var cnt = 0; cnt < _resMan.ReadUInt16(fHead.height); cnt++)
{
for (var cntx = 0; cntx < _resMan.ReadUInt16(fHead.width); cntx++)
if (src[cntx] != 0)
dst[cntx] = src[cntx];
dst.Offset += Screen.SCREEN_WIDTH;
for (var cntx = 0; cntx < _resMan.ReadUInt16(fHead.width); cntx++)
if (src[cntx] != 0)
dst[cntx] = src[cntx];
dst.Offset += Screen.SCREEN_WIDTH;
src.Offset += _resMan.ReadUInt16(fHead.width);
}
else if (_resId == SwordRes.SR_DEATHPANEL)
{ // Check for death panel psx version (which is 1/3 of original width)
for (var cnt = 0; cnt < _resMan.ReadUInt16(fHead.height) / 2; cnt++)
{
//Stretched panel is bigger than 640px, check we don't draw outside screen
for (var cntx = 0; (cntx < (_resMan.ReadUInt16(fHead.width)) / 3) && (cntx < (Screen.SCREEN_WIDTH - 3)); cntx++)
if (src[cntx] != 0)
{
dst[cntx * 3] = src[cntx];
dst[cntx * 3 + 1] = src[cntx];
dst[cntx * 3 + 2] = src[cntx];
}
dst.Offset += Screen.SCREEN_WIDTH;
for (var cntx = 0; cntx < (_resMan.ReadUInt16(fHead.width)) / 3; cntx++)
if (src[cntx] != 0)
{
dst[cntx * 3] = src[cntx];
dst[cntx * 3 + 1] = src[cntx];
dst[cntx * 3 + 2] = src[cntx];
}
dst.Offset += Screen.SCREEN_WIDTH;
src.Offset += _resMan.ReadUInt16(fHead.width) / 3;
}
}
else
{ //save slots needs to be multiplied by 2 in height
for (var cnt = 0; cnt < _resMan.ReadUInt16(fHead.height); cnt++)
{
for (var cntx = 0; cntx < _resMan.ReadUInt16(fHead.width) / 2; cntx++)
if (src[cntx] != 0)
{
dst[cntx * 2] = src[cntx];
dst[cntx * 2 + 1] = src[cntx];
}
dst.Offset += Screen.SCREEN_WIDTH;
for (var cntx = 0; cntx < _resMan.ReadUInt16(fHead.width) / 2; cntx++)
if (src[cntx] != 0)
{
dst[cntx * 2] = src[cntx];
dst[cntx * 2 + 1] = src[cntx];
}
dst.Offset += Screen.SCREEN_WIDTH;
src.Offset += _resMan.ReadUInt16(fHead.width) / 2;
}
}
}
else
for (var cnt = 0; cnt < _resMan.ReadUInt16(fHead.height); cnt++)
{
for (var cntx = 0; cntx < _resMan.ReadUInt16(fHead.width); cntx++)
if (src[cntx] != 0)
dst[cntx] = src[cntx];
dst.Offset += Screen.SCREEN_WIDTH;
src.Offset += _resMan.ReadUInt16(fHead.width);
}
_system.GraphicsManager.CopyRectToScreen(_dstBuf.Data, _dstBuf.Offset, Screen.SCREEN_WIDTH, _x, _y, _width, _height);
}
private void SetupMainPanel() { uint panelId; if (SystemVars.ControlPanelMode == ControlPanelMode.CP_DEATHSCREEN) panelId = SwordRes.SR_DEATHPANEL; else { if (SystemVars.RealLanguage.TwoLetterISOLanguageName == "en-US") panelId = SwordRes.SR_PANEL_AMERICAN; else if (SystemVars.Language <= Language.BS1_SPANISH) panelId = (uint)(SwordRes.SR_PANEL_ENGLISH + SystemVars.Language); else panelId = SwordRes.SR_PANEL_ENGLISH; } ControlButton panel = new ControlButton(0, 0, panelId, 0, 0, _resMan, _screenBuf, _system); panel.Draw(); if (SystemVars.ControlPanelMode != ControlPanelMode.CP_NORMAL) CreateButtons(_deathButtons, 3); else { CreateButtons(_panelButtons, 7); _buttons[5].SetSelected(SystemVars.ShowText); } if (SystemVars.ControlPanelMode == ControlPanelMode.CP_THEEND) // end of game RenderText(_lStrings[(int)LangStrings.STR_THE_END], 480, 188 + 40, TextModes.TEXT_RIGHT_ALIGN); if (SystemVars.ControlPanelMode == ControlPanelMode.CP_NORMAL) { // normal panel RenderText(_lStrings[(int)LangStrings.STR_SAVE], 180, 188 + 40, TextModes.TEXT_LEFT_ALIGN); RenderText(_lStrings[(int)LangStrings.STR_DONE], 460, 332 + 40, TextModes.TEXT_RIGHT_ALIGN); RenderText(_lStrings[(int)LangStrings.STR_RESTORE], 180, 224 + 40, TextModes.TEXT_LEFT_ALIGN); RenderText(_lStrings[(int)LangStrings.STR_RESTART], 180, 260 + 40, TextModes.TEXT_LEFT_ALIGN); RenderText(_lStrings[(int)LangStrings.STR_QUIT], 180, 296 + 40, TextModes.TEXT_LEFT_ALIGN); RenderText(_lStrings[(int)LangStrings.STR_VOLUME], 460, 188 + 40, TextModes.TEXT_RIGHT_ALIGN); RenderText(_lStrings[(int)LangStrings.STR_TEXT], 460, 224 + 40, TextModes.TEXT_RIGHT_ALIGN); } else { RenderText(_lStrings[(int)LangStrings.STR_RESTORE], 285, 224 + 40, TextModes.TEXT_LEFT_ALIGN); if (SystemVars.ControlPanelMode == ControlPanelMode.CP_NEWGAME) // just started game RenderText(_lStrings[(int)LangStrings.STR_START], 285, 260 + 40, TextModes.TEXT_LEFT_ALIGN); else RenderText(_lStrings[(int)LangStrings.STR_RESTART], 285, 260 + 40, TextModes.TEXT_LEFT_ALIGN); RenderText(_lStrings[(int)LangStrings.STR_QUIT], 285, 296 + 40, TextModes.TEXT_LEFT_ALIGN); } }