svn-id: r26478
This commit is contained in:
Travis Howell 2007-04-15 00:12:09 +00:00
parent 2aeb84f12a
commit fe6b6323fa
6 changed files with 95 additions and 115 deletions

View file

@ -1271,12 +1271,14 @@ public:
void opp_restartClock();
protected:
bool drawImages_clip(VC10_state *state);
bool drawImage_clip(VC10_state *state);
void drawImages(VC10_state *state);
void drawImages_Amiga(VC10_state *state);
void drawImages_Simon(VC10_state *state);
void drawImages_Feeble(VC10_state *state);
void drawImage_init(VC10_state *state);
void drawImage(VC10_state *state);
void drawImage_Amiga(VC10_state *state);
void drawImage_Simon(VC10_state *state);
void drawImage_Feeble(VC10_state *state);
void scaleClip(int16 h, int16 w, int16 y, int16 x, int16 scrollY);
void horizontalScroll(VC10_state *state);

View file

@ -27,6 +27,7 @@
#include "agos/agos.h"
#include "agos/intern.h"
#include "agos/vga.h"
namespace AGOS {
@ -53,8 +54,7 @@ byte *AGOSEngine::getScaleBuf() {
void AGOSEngine::animateSprites() {
VgaSprite *vsp;
VgaPointersEntry *vpe;
const byte *vc_ptr_org = _vcPtr;
uint16 params[5]; // parameters to vc10
VC10_state state;
if (_paletteFlag == 2)
_paletteFlag = 1;
@ -84,25 +84,13 @@ void AGOSEngine::animateSprites() {
_vgaCurSpriteId = vsp->id;
_vgaCurSpritePriority = vsp->priority;
params[0] = readUint16Wrapper(&vsp->image);
if (getGameType() == GType_ELVIRA1 || getGameType() == GType_ELVIRA2 || getGameType() == GType_WW) {
params[1] = readUint16Wrapper(&vsp->x);
params[2] = readUint16Wrapper(&vsp->y);
params[3] = READ_BE_UINT16(&vsp->flags);
} else {
params[1] = readUint16Wrapper(&vsp->palette);
params[2] = readUint16Wrapper(&vsp->x);
params[3] = readUint16Wrapper(&vsp->y);
state.image = vsp->image;
state.palette = (vsp->palette & 15) * 16;
state.x = vsp->x;
state.y = vsp->y;
state.flags = vsp->flags;
if (getGameType() == GType_SIMON1) {
params[4] = READ_BE_UINT16(&vsp->flags);
} else {
*(byte *)(&params[4]) = (byte)vsp->flags;
}
}
_vcPtr = (const byte *)params;
vc10_draw();
drawImage_init(&state);
vsp++;
}
@ -111,14 +99,12 @@ void AGOSEngine::animateSprites() {
memset(_backBuf, 0, _screenWidth * _screenHeight);
_updateScreen = true;
_vcPtr = vc_ptr_org;
}
void AGOSEngine::animateSpritesDebug() {
VgaSprite *vsp;
VgaPointersEntry *vpe;
const byte *vc_ptr_org = _vcPtr;
uint16 params[5]; // parameters to vc10_draw
VC10_state state;
if (_paletteFlag == 2)
_paletteFlag = 1;
@ -137,38 +123,25 @@ void AGOSEngine::animateSpritesDebug() {
if (vsp->image)
printf("id:%5d image:%3d base-color:%3d x:%3d y:%3d flags:%x\n",
vsp->id, vsp->image, vsp->palette, vsp->x, vsp->y, vsp->flags);
params[0] = readUint16Wrapper(&vsp->image);
if (getGameType() == GType_ELVIRA1 || getGameType() == GType_ELVIRA2 || getGameType() == GType_WW) {
params[1] = readUint16Wrapper(&vsp->x);
params[2] = readUint16Wrapper(&vsp->y);
params[3] = READ_BE_UINT16(&vsp->flags);
} else {
params[1] = readUint16Wrapper(&vsp->palette);
params[2] = readUint16Wrapper(&vsp->x);
params[3] = readUint16Wrapper(&vsp->y);
if (getGameType() == GType_SIMON1) {
params[4] = READ_BE_UINT16(&vsp->flags);
} else {
*(byte *)(&params[4]) = (byte)vsp->flags;
}
}
state.image = vsp->image;
state.palette = (vsp->palette & 15) * 16;
state.x = vsp->x;
state.y = vsp->y;
state.flags = vsp->flags;
_vcPtr = (const byte *)params;
vc10_draw();
drawImage_init(&state);
vsp++;
}
_updateScreen = true;
_vcPtr = vc_ptr_org;
}
void AGOSEngine::animateSpritesByY() {
VgaSprite *vsp;
VgaPointersEntry *vpe;
const byte *vc_ptr_org = _vcPtr;
uint16 params[5]; // parameters to vc10
VC10_state state;
int16 spriteTable[180][2];
byte *src;
@ -216,6 +189,7 @@ void AGOSEngine::animateSpritesByY() {
}
vsp = &_vgaSprites[slot];
vsp->windowNum &= 0x7FFF;
vpe = &_vgaBufferPointers[vsp->zoneNum];
@ -226,18 +200,16 @@ void AGOSEngine::animateSpritesByY() {
_vgaCurSpriteId = vsp->id;
_vgaCurSpritePriority = vsp->priority;
params[0] = readUint16Wrapper(&vsp->image);
params[1] = readUint16Wrapper(&vsp->palette);
params[2] = readUint16Wrapper(&vsp->x);
params[3] = readUint16Wrapper(&vsp->y);
*(byte *)(&params[4]) = (byte)vsp->flags;
state.image = vsp->image;
state.palette = 0;
state.x = vsp->x;
state.y = vsp->y;
state.flags = vsp->flags;
_vcPtr = (const byte *)params;
vc10_draw();
drawImage_init(&state);
}
_updateScreen = true;
_vcPtr = vc_ptr_org;
}
void AGOSEngine::displayBoxStars() {

View file

@ -166,7 +166,7 @@ void AGOSEngine::decodeRow(byte *dst, const byte *src, int width) {
}
}
bool AGOSEngine::drawImages_clip(VC10_state *state) {
bool AGOSEngine::drawImage_clip(VC10_state *state) {
const uint16 *vlut;
uint maxWidth, maxHeight;
int cur;
@ -224,7 +224,7 @@ bool AGOSEngine::drawImages_clip(VC10_state *state) {
return 1;
}
void AGOSEngine::drawImages_Feeble(VC10_state *state) {
void AGOSEngine::drawImage_Feeble(VC10_state *state) {
if (state->flags & kDFCompressed) {
if (state->flags & kDFScaled) {
state->surf_addr = getScaleBuf();
@ -293,7 +293,7 @@ void AGOSEngine::drawImages_Feeble(VC10_state *state) {
scaleClip(_scaleHeight, _scaleWidth, _scaleY, _scaleX, _scaleY + _scrollY);
}
} else {
if (drawImages_clip(state) == 0)
if (drawImage_clip(state) == 0)
return;
state->surf_addr += state->x + state->y * state->surf_pitch;
@ -359,7 +359,7 @@ void AGOSEngine::drawImages_Feeble(VC10_state *state) {
}
}
} else {
if (drawImages_clip(state) == 0)
if (drawImage_clip(state) == 0)
return;
state->surf_addr += state->x + state->y * state->surf_pitch;
@ -387,10 +387,10 @@ void AGOSEngine::drawImages_Feeble(VC10_state *state) {
}
}
void AGOSEngine::drawImages_Simon(VC10_state *state) {
void AGOSEngine::drawImage_Simon(VC10_state *state) {
const uint16 *vlut = &_videoWindows[_windowNum * 4];
if (drawImages_clip(state) == 0)
if (drawImage_clip(state) == 0)
return;
uint xoffs, yoffs;
@ -583,12 +583,12 @@ void AGOSEngine::drawImages_Simon(VC10_state *state) {
}
}
void AGOSEngine::drawImages_Amiga(VC10_state *state) {
void AGOSEngine::drawImage_Amiga(VC10_state *state) {
uint8 *dst;
const byte *src;
const uint16 *vlut = &_videoWindows[_windowNum * 4];
if (drawImages_clip(state) == 0)
if (drawImage_clip(state) == 0)
return;
uint xoffs = ((vlut[0] - _videoWindows[16]) * 2 + state->x) * 8;
@ -638,10 +638,10 @@ void AGOSEngine::drawImages_Amiga(VC10_state *state) {
}
}
void AGOSEngine::drawImages(VC10_state *state) {
void AGOSEngine::drawImage(VC10_state *state) {
const uint16 *vlut = &_videoWindows[_windowNum * 4];
if (drawImages_clip(state) == 0)
if (drawImage_clip(state) == 0)
return;
uint xoffs, yoffs;

View file

@ -990,7 +990,7 @@ void AGOSEngine::printScroll() {
state.surf_addr = getBackBuf();
state.surf_pitch = _dxSurfacePitch;
drawImages(&state);
drawImage(&state);
}
} // End of namespace AGOS

View file

@ -578,30 +578,20 @@ byte *AGOSEngine::vc10_flip(const byte *src, uint w, uint h) {
}
void AGOSEngine::vc10_draw() {
byte *p2;
uint width, height;
byte flags;
VC10_state state;
state.image = (int16)vcReadNextWord();
if (state.image == 0)
return;
state.palette = 0;
if (getGameType() == GType_FF || getGameType() == GType_PP) {
state.palette = (_vcPtr[0] * 16);
_vcPtr += 2;
} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
state.palette = (_vcPtr[1] * 16);
_vcPtr += 2;
} else {
state.palette = 0;
}
state.x = (int16)vcReadNextWord();
state.x -= _scrollX;
state.y = (int16)vcReadNextWord();
state.y -= _scrollY;
if (getGameType() == GType_SIMON2 || getGameType() == GType_FF || getGameType() == GType_PP) {
state.flags = vcReadNextByte();
@ -609,11 +599,25 @@ void AGOSEngine::vc10_draw() {
state.flags = vcReadNextWord();
}
if (state.image < 0)
state.image = vcReadVar(-state.image);
drawImage_init(&state);
}
p2 = _curVgaFile2 + state.image * 8;
state.depack_src = _curVgaFile2 + readUint32Wrapper(p2);
void AGOSEngine::drawImage_init(VC10_state *state) {
if (state->image == 0)
return;
byte *p2;
uint width, height;
byte flags;
state->x -= _scrollX;
state->y -= _scrollY;
if (state->image < 0)
state->image = vcReadVar(-state->image);
p2 = _curVgaFile2 + state->image * 8;
state->depack_src = _curVgaFile2 + readUint32Wrapper(p2);
if (getGameType() == GType_FF || getGameType() == GType_PP) {
width = READ_LE_UINT16(p2 + 6);
height = READ_LE_UINT16(p2 + 4) & 0x7FFF;
@ -628,74 +632,74 @@ void AGOSEngine::vc10_draw() {
return;
if (_dumpImages)
dumpSingleBitmap(_vgaCurZoneNum, state.image, state.depack_src, width, height,
state.palette);
state.width = state.draw_width = width; /* cl */
state.height = state.draw_height = height; /* ch */
dumpSingleBitmap(_vgaCurZoneNum, state->image, state->depack_src, width, height,
state->palette);
state->width = state->draw_width = width; /* cl */
state->height = state->draw_height = height; /* ch */
state.depack_cont = -0x80;
state->depack_cont = -0x80;
state.x_skip = 0; /* colums to skip = bh */
state.y_skip = 0; /* rows to skip = bl */
state->x_skip = 0; /* colums to skip = bh */
state->y_skip = 0; /* rows to skip = bl */
if (getFeatures() & GF_PLANAR) {
state.depack_src = convertImage(&state, ((flags & 0x80) != 0));
state->depack_src = convertImage(state, ((flags & 0x80) != 0));
// converted planar clip is already uncompressed
if (state.flags & kDFCompressedFlip) {
state.flags &= ~kDFCompressedFlip;
state.flags |= kDFFlip;
if (state->flags & kDFCompressedFlip) {
state->flags &= ~kDFCompressedFlip;
state->flags |= kDFFlip;
}
if (state.flags & kDFCompressed) {
state.flags &= ~kDFCompressed;
if (state->flags & kDFCompressed) {
state->flags &= ~kDFCompressed;
}
} else if (getGameType() == GType_FF || getGameType() == GType_PP) {
if (flags & 0x80) {
state.flags |= kDFCompressed;
state->flags |= kDFCompressed;
}
} else {
if (flags & 0x80 && !(state.flags & kDFCompressedFlip)) {
if (state.flags & kDFFlip) {
state.flags &= ~kDFFlip;
state.flags |= kDFCompressedFlip;
if (flags & 0x80 && !(state->flags & kDFCompressedFlip)) {
if (state->flags & kDFFlip) {
state->flags &= ~kDFFlip;
state->flags |= kDFCompressedFlip;
} else {
state.flags |= kDFCompressed;
state->flags |= kDFCompressed;
}
}
}
uint maxWidth = (getGameType() == GType_FF || getGameType() == GType_PP) ? 640 : 20;
if ((getGameType() == GType_SIMON2 || getGameType() == GType_FF) && width > maxWidth) {
horizontalScroll(&state);
horizontalScroll(state);
return;
}
if (getGameType() == GType_FF && height > 480) {
verticalScroll(&state);
verticalScroll(state);
return;
}
if (getGameType() != GType_FF && getGameType() != GType_PP) {
if (state.flags & kDFCompressedFlip) {
state.depack_src = vc10_uncompressFlip(state.depack_src, width, height);
} else if (state.flags & kDFFlip) {
state.depack_src = vc10_flip(state.depack_src, width, height);
if (state->flags & kDFCompressedFlip) {
state->depack_src = vc10_uncompressFlip(state->depack_src, width, height);
} else if (state->flags & kDFFlip) {
state->depack_src = vc10_flip(state->depack_src, width, height);
}
}
state.surf2_addr = getFrontBuf();
state.surf2_pitch = _dxSurfacePitch;
state->surf2_addr = getFrontBuf();
state->surf2_pitch = _dxSurfacePitch;
state.surf_addr = getBackBuf();
state.surf_pitch = _dxSurfacePitch;
state->surf_addr = getBackBuf();
state->surf_pitch = _dxSurfacePitch;
if (getGameType() == GType_FF || getGameType() == GType_PP) {
drawImages_Feeble(&state);
drawImage_Feeble(state);
} else if (getFeatures() & GF_32COLOR) {
drawImages_Amiga(&state);
drawImage_Amiga(state);
} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
drawImages_Simon(&state);
drawImage_Simon(state);
} else {
drawImages(&state);
drawImage(state);
}
}

View file

@ -134,6 +134,8 @@ struct VC10_state {
int8 depack_cont;
byte depack_dest[480];
VC10_state() { memset(this, 0, sizeof(*this)); }
};
byte *vc10_depackColumn(VC10_state *vs);