void Actor::saveState(SaveGame *savedState) const { // store actor name savedState->writeString(_name); savedState->writeString(_setName); savedState->writeColor(_talkColor); savedState->writeVector3d(_pos); savedState->writeFloat(_pitch.getDegrees()); savedState->writeFloat(_yaw.getDegrees()); savedState->writeFloat(_roll.getDegrees()); savedState->writeFloat(_walkRate); savedState->writeFloat(_turnRate); savedState->writeBool(_constrain); savedState->writeFloat(_reflectionAngle); savedState->writeBool(_visible); savedState->writeBool(_lookingMode), savedState->writeFloat(_scale); savedState->writeFloat(_timeScale); savedState->writeBool(_puckOrient); savedState->writeString(_talkSoundName); savedState->writeBool(_talking); savedState->writeBool(_backgroundTalk); savedState->writeLEUint32((uint32)_collisionMode); savedState->writeFloat(_collisionScale); if (_lipSync) { savedState->writeBool(true); savedState->writeString(_lipSync->getFilename()); } else { savedState->writeBool(false); } savedState->writeLEUint32(_costumeStack.size()); for (Common::List<Costume *>::const_iterator i = _costumeStack.begin(); i != _costumeStack.end(); ++i) { Costume *c = *i; savedState->writeString(c->getFilename()); Costume *pc = c->getPreviousCostume(); int depth = 0; while (pc) { ++depth; pc = pc->getPreviousCostume(); } savedState->writeLESint32(depth); pc = c->getPreviousCostume(); for (int j = 0; j < depth; ++j) { //save the previousCostume hierarchy savedState->writeString(pc->getFilename()); pc = pc->getPreviousCostume(); } c->saveState(savedState); } savedState->writeBool(_turning); savedState->writeFloat(_moveYaw.getDegrees()); savedState->writeBool(_walking); savedState->writeVector3d(_destPos); _restChore.saveState(savedState); _walkChore.saveState(savedState); savedState->writeBool(_walkedLast); savedState->writeBool(_walkedCur); _leftTurnChore.saveState(savedState); _rightTurnChore.saveState(savedState); savedState->writeLESint32(_lastTurnDir); savedState->writeLESint32(_currTurnDir); for (int i = 0; i < 10; ++i) { _talkChore[i].saveState(savedState); } savedState->writeLESint32(_talkAnim); _mumbleChore.saveState(savedState); for (int i = 0; i < MAX_SHADOWS; ++i) { Shadow &shadow = _shadowArray[i]; savedState->writeString(shadow.name); savedState->writeVector3d(shadow.pos); savedState->writeLEUint32(shadow.planeList.size()); // Cannot use g_grim->getCurrSet() here because an actor can have walk planes // from other scenes. It happens e.g. when Membrillo calls Velasco to tell him // Naranja is dead. for (SectorListType::iterator j = shadow.planeList.begin(); j != shadow.planeList.end(); ++j) { Plane &p = *j; savedState->writeString(p.setName); savedState->writeString(p.sector->getName()); } savedState->writeLESint32(shadow.shadowMaskSize); savedState->write(shadow.shadowMask, shadow.shadowMaskSize); savedState->writeBool(shadow.active); savedState->writeBool(shadow.dontNegate); } savedState->writeLESint32(_activeShadowSlot); savedState->writeLESint32(_sayLineText); savedState->writeVector3d(_lookAtVector); savedState->writeLEUint32(_path.size()); for (Common::List<Math::Vector3d>::const_iterator i = _path.begin(); i != _path.end(); ++i) { savedState->writeVector3d(*i); } }
void Actor::draw() { for (Common::List<Costume *>::iterator i = _costumeStack.begin(); i != _costumeStack.end(); ++i) { Costume *c = *i; c->setupTextures(); } if (!g_driver->isHardwareAccelerated() && g_grim->getFlagRefreshShadowMask()) { for (int l = 0; l < MAX_SHADOWS; l++) { if (!_shadowArray[l].active) continue; g_driver->setShadow(&_shadowArray[l]); g_driver->drawShadowPlanes(); g_driver->setShadow(NULL); } } // FIXME: if isAttached(), factor in the joint & actor rotation as well. Math::Vector3d absPos = getWorldPos(); if (!_costumeStack.empty()) { g_grim->getCurrSet()->setupLights(absPos); Costume *costume = _costumeStack.back(); for (int l = 0; l < MAX_SHADOWS; l++) { if (!shouldDrawShadow(l)) continue; g_driver->setShadow(&_shadowArray[l]); g_driver->setShadowMode(); if (g_driver->isHardwareAccelerated()) g_driver->drawShadowPlanes(); g_driver->startActorDraw(absPos, _scale, _yaw, _pitch, _roll, _inOverworld, _alphaMode != AlphaOff ? _globalAlpha : 1.f); costume->draw(); g_driver->finishActorDraw(); g_driver->clearShadowMode(); g_driver->setShadow(NULL); } bool isShadowCostume = costume->getFilename().equals("fx/dumbshadow.cos"); if (!isShadowCostume || _shadowActive) { // normal draw actor g_driver->startActorDraw(absPos, _scale, _yaw, _pitch, _roll, _inOverworld, _alphaMode != AlphaOff ? _globalAlpha : 1.f); costume->draw(); g_driver->finishActorDraw(); } } if (_mustPlaceText) { int x1, y1, x2, y2; x1 = y1 = 1000; x2 = y2 = -1000; if (!_costumeStack.empty()) { g_driver->startActorDraw(absPos, _scale, _yaw, _pitch, _roll, _inOverworld, 1.f); _costumeStack.back()->getBoundingBox(&x1, &y1, &x2, &y2); g_driver->finishActorDraw(); } TextObject *textObject = TextObject::getPool().getObject(_sayLineText); if (textObject) { if (x1 == 1000 || x2 == -1000 || y2 == -1000) { textObject->setX(640 / 2); textObject->setY(463); } else { textObject->setX((x1 + x2) / 2); textObject->setY(y1); } textObject->reset(); } _mustPlaceText = false; } }