Mouse::Mouse(CGEEngine *vm) : Sprite(vm, NULL), _busy(NULL), _hold(NULL), _hx(0), _vm(vm) { _hold = NULL; _hx = 0; _hy = 0; _exist = true; _buttons = 0; _busy = NULL; _active = false; _flags._kill = false; const Seq ms[] = { { 0, 0, 0, 0, 1 }, { 1, 1, 0, 0, 1 } }; Seq *seq = (Seq *)malloc(2 * sizeof(Seq)); Common::copy(ms, ms + 2, seq); setSeq(seq); BitmapPtr *MC = new BitmapPtr[3]; MC[0] = new Bitmap(_vm, "MOUSE"); MC[1] = new Bitmap(_vm, "DUMMY"); MC[2] = NULL; setShapeList(MC); gotoxy(kScrWidth / 2, kScrHeight / 2); _z = 127; step(1); }
SceneLight::SceneLight(CGEEngine *vm): Sprite(vm, NULL) { // Set the sprite list BitmapPtr *PR = new BitmapPtr[2]; PR[0] = new Bitmap("PRESS"); PR[1] = NULL; setShapeList(PR); }
HorizLine::HorizLine(CGEEngine *vm): Sprite(vm, NULL) { // Set the sprite list BitmapPtr *HL = new BitmapPtr[2]; HL[0] = new Bitmap("HLINE"); HL[1] = NULL; setShapeList(HL); }
Square::Square(CGEEngine *vm) : Sprite(vm, NULL), _vm(vm) { _flags._kill = true; _flags._bDel = false; BitmapPtr *MB = new BitmapPtr[2]; MB[0] = new Bitmap(_vm, "BRICK"); MB[1] = NULL; setShapeList(MB); }
Spike::Spike(CGEEngine *vm): Sprite(vm, NULL) { // Set the sprite list BitmapPtr *SP = new BitmapPtr[3]; SP[0] = new Bitmap("SPK_L"); SP[1] = new Bitmap("SPK_R"); SP[2] = NULL; setShapeList(SP); }
PocLight::PocLight(CGEEngine *vm): Sprite(vm, NULL) { // Set the sprite list BitmapPtr *LI = new BitmapPtr[5]; LI[0] = new Bitmap("LITE0"); LI[1] = new Bitmap("LITE1"); LI[2] = new Bitmap("LITE2"); LI[3] = new Bitmap("LITE3"); LI[4] = NULL; setShapeList(LI); _flags._kill = false; }
Sprite::Sprite(CGEEngine *vm, BitmapPtr *shpP) : _x(0), _y(0), _z(0), _nearPtr(0), _takePtr(0), _next(NULL), _prev(NULL), _seqPtr(kNoSeq), _time(0), _ext(NULL), _ref(-1), _scene(0), _vm(vm) { memset(_file, 0, sizeof(_file)); memset(&_flags, 0, sizeof(_flags)); _ref = 0; _x = _y = 0; _w = _h = 0; _time = 0; _seqPtr = 0; _shpCnt = 0; _prev = _next = NULL; setShapeList(shpP); }
Mouse::Mouse(CGE2Engine *vm) : Sprite(vm), _busy(nullptr), _hold(nullptr), _hx(0), _point(vm), _vm(vm) { _hold = nullptr; _hx = 0; _hy = 0; _exist = true; _buttons = 0; _busy = nullptr; _active = false; _flags._kill = false; setSeq(_stdSeq8); BitmapPtr MC = new Bitmap[2]; MC[0] = Bitmap(_vm, "MOUSE"); MC[1] = Bitmap(_vm, "DUMMY"); setShapeList(MC, 2); step(1); on(); off(); }
Sprite *Sprite::expand() { if (_ext) return this; _ext = new SprExt; assert(_ext != NULL); if (!*_file) return this; static const char *Comd[] = { "Name", "Phase", "Seq", "Near", "Take", NULL }; char fname[kPathMax]; Common::Array<BitmapPtr> shplist; for (int i = 0; i < _shpCnt + 1; ++i) shplist.push_back(NULL); Seq *seq = NULL; int shapeCount = 0, seqCount = 0, nearCount = 0, takeCount = 0, maxnow = 0, maxnxt = 0; Snail::Com *nearList = NULL; Snail::Com *takeList = NULL; _vm->mergeExt(fname, _file, kSprExt); if (_resman->exist(fname)) { // sprite description file exist EncryptedStream sprf(fname); if (sprf.err()) error("Bad SPR [%s]", fname); Common::String line; char tmpStr[kLineMax + 1]; int len = 0, lcnt = 0; for (line = sprf.readLine(); !sprf.eos(); line = sprf.readLine()) { len = line.size(); strcpy(tmpStr, line.c_str()); lcnt++; if (len == 0 || *tmpStr == '.') continue; Snail::Com *c; switch (_vm->takeEnum(Comd, strtok(tmpStr, " =\t"))) { case 0: // Name setName(strtok(NULL, "")); break; case 1: // Phase // In case the shape index gets too high, increase the array size while ((shapeCount + 1) >= (int)shplist.size()) { shplist.push_back(NULL); ++_shpCnt; } shplist[shapeCount++] = new Bitmap(strtok(NULL, " \t,;/")); break; case 2: // Seq seq = (Seq *)realloc(seq, (seqCount + 1) * sizeof(*seq)); assert(seq != NULL); Seq *s; s = &seq[seqCount++]; s->_now = atoi(strtok(NULL, " \t,;/")); if (s->_now > maxnow) maxnow = s->_now; s->_next = atoi(strtok(NULL, " \t,;/")); switch (s->_next) { case 0xFF: s->_next = seqCount; break; case 0xFE: s->_next = seqCount - 1; break; } if (s->_next > maxnxt) maxnxt = s->_next; s->_dx = atoi(strtok(NULL, " \t,;/")); s->_dy = atoi(strtok(NULL, " \t,;/")); s->_dly = atoi(strtok(NULL, " \t,;/")); break; case 3: // Near if (_nearPtr == kNoPtr) break; nearList = (Snail::Com *)realloc(nearList, (nearCount + 1) * sizeof(*nearList)); assert(nearList != NULL); c = &nearList[nearCount++]; if ((c->_com = (SnCom)_vm->takeEnum(Snail::_comText, strtok(NULL, " \t,;/"))) < 0) error("Bad NEAR in %d [%s]", lcnt, fname); c->_ref = atoi(strtok(NULL, " \t,;/")); c->_val = atoi(strtok(NULL, " \t,;/")); c->_ptr = NULL; break; case 4: // Take if (_takePtr == kNoPtr) break; takeList = (Snail::Com *)realloc(takeList, (takeCount + 1) * sizeof(*takeList)); assert(takeList != NULL); c = &takeList[takeCount++]; if ((c->_com = (SnCom)_vm->takeEnum(Snail::_comText, strtok(NULL, " \t,;/"))) < 0) error("Bad NEAR in %d [%s]", lcnt, fname); c->_ref = atoi(strtok(NULL, " \t,;/")); c->_val = atoi(strtok(NULL, " \t,;/")); c->_ptr = NULL; break; } } } else { // no sprite description: try to read immediately from .BMP shplist[shapeCount++] = new Bitmap(_file); } shplist[shapeCount] = NULL; if (seq) { if (maxnow >= shapeCount) error("Bad PHASE in SEQ [%s]", fname); if (maxnxt >= seqCount) error("Bad JUMP in SEQ [%s]", fname); setSeq(seq); } else setSeq(getConstantSeq(_shpCnt == 1)); // Set the shape list BitmapPtr *shapeList = new BitmapPtr[shplist.size()]; for (uint i = 0; i < shplist.size(); ++i) shapeList[i] = shplist[i]; setShapeList(shapeList); if (nearList) nearList[nearCount - 1]._ptr = _ext->_near = nearList; else _nearPtr = kNoPtr; if (takeList) takeList[takeCount - 1]._ptr = _ext->_take = takeList; else _takePtr = kNoPtr; return this; }