// Sprite.cpp : Sprite class // // 08.09.1998 / DH - First release // 16.11.1998 / DH - Sprite brightness // // Copyright (c) 1998 Daniel Hartmeier. All rights reserved. #include "Sprite.hpp" // ------------------------------------------------------------------- #define SPRITE_EXIT_01 0, 112 #define SPRITE_EXIT_02 32, 112 #define SPRITE_EXIT_03 64, 112 #define SPRITE_EXIT_04 0, 144 #define SPRITE_EXIT_05 32, 144 #define SPRITE_EXIT_06 64, 144 #define SPRITE_EXIT_07 0, 176 #define SPRITE_EXIT_08 32, 176 #define SPRITE_EXIT_09 64, 176 #define SPRITE_EXIT_10 0, 208 #define SPRITE_EXIT_11 32, 208 #define SPRITE_EXIT_12 64, 208 // ------------------------------------------------------------------- inline int max(int a, int b) { return (a > b ? a : b); } inline int min(int a, int b) { return (a < b ? a : b); } // ------------------------------------------------------------------- Image::Image(unsigned char *address) { GsGetTimInfo((u_long*)(address+4), &gsimage); RECT rect; rect.x = gsimage.px; rect.y = gsimage.py; rect.w = gsimage.pw; rect.h = gsimage.ph; LoadImage(&rect, gsimage.pixel); DrawSync(0); if (gsimage.pmode > 3) { rect.x = gsimage.cx; rect.y = gsimage.cy; rect.w = gsimage.cw; rect.h = gsimage.ch; LoadImage(&rect, gsimage.clut); DrawSync(0); } } Image::~Image() { } u_short Image::tpage() const { return GetTPage(1, 0, gsimage.px, gsimage.py); } int Image::cx() const { return gsimage.cx; } int Image::cy() const { return gsimage.cy; } void Image::moveImage(int x, int y, int w, int h, int u, int v) { RECT r; r.x = gsimage.px + u; r.y = gsimage.py + v; r.w = (w ? w : gsimage.pw); r.h = (h ? h : gsimage.ph); MoveImage(&r, x, (GsGetActiveBuff())*256+y); DrawSync(0); return; } // ------------------------------------------------------------------- Sprite::Sprite(Image *image, int w, int h, int u, int v) : image(image) { gssprite.attribute = 0x01000000; // 8bitCLUT gssprite.x = 0; gssprite.y = 0; gssprite.w = w; gssprite.h = h; gssprite.tpage = image->tpage(); gssprite.u = u; gssprite.v = v; gssprite.cx = image->cx(); gssprite.cy = image->cy(); gssprite.r = 128; gssprite.g = 128; gssprite.b = 128; gssprite.mx = gssprite.w / 2; gssprite.my = gssprite.h / 2; gssprite.scalex = ONE; gssprite.scaley = ONE; gssprite.rotate = 0; } Sprite::~Sprite() { } void Sprite::draw(GsOT *ot) { GsSortSprite(&gssprite, ot, 0); return; } void Sprite::setRGB(unsigned char r, unsigned char g, unsigned char b) { gssprite.r = r; gssprite.g = g; gssprite.b = b; if ((r == 128) && (g == 128) && (b == 128)) gssprite.attribute |= (1 << 6); else gssprite.attribute &= ~(1 << 6); return; } // ------------------------------------------------------------------- void PersonSprite::contact(bool left, bool right, bool top, bool bottom) { this->left = left; this->right = right; this->top = top; this->bottom = bottom; // Gravity sucks if (!bottom) { int sy = speedY() + 128; if (sy > 2560) sy = 2560; setSpeedY(sy); } return; } // ------------------------------------------------------------------- ExitSprite::ExitSprite(Image *image) : Sprite(image, 32, 32, 0, 0), light(0), step(0), delta(1), reached(false) { } void ExitSprite::draw(GsOT *ot) { step += delta; if (reached) { if (step == 60) delta = 0; else if (step == 0) delta = 1; } else { if (step == 30) delta = -1; else if (step == 0) delta = 1; } if (step > 55) change(SPRITE_EXIT_01); else if (step > 50) change(SPRITE_EXIT_02); else if (step > 45) change(SPRITE_EXIT_03); else if (step > 40) change(SPRITE_EXIT_04); else if (step > 35) change(SPRITE_EXIT_05); else if (step > 30) change(SPRITE_EXIT_06); else if (step > 25) change(SPRITE_EXIT_07); else if (step > 20) change(SPRITE_EXIT_08); else if (step > 15) change(SPRITE_EXIT_09); else if (step > 10) change(SPRITE_EXIT_10); else if (step > 5) change(SPRITE_EXIT_11); else change(SPRITE_EXIT_12); if (light) { bool flash = reached && (delta >= 0); light->set(80, 80, min(128+4*step, 255)); light->setRadius(flash ? 70+step : 70); } setScale((delta < 0 ? -ONE+1 : ONE), ONE); Sprite::draw(ot); return; } void ExitSprite::move(int x, int y) { if (light) light->move(x, y); Sprite::move(x, y); return; } // -------------------------------------------------------------------