void UnitDieBState::init() { // don't show the "fall to death" animation when a unit is blasted with explosives or he is already unconscious if (_damageType == DT_HE || _unit->getStatus() == STATUS_UNCONSCIOUS) { _unit->startFalling(); while (_unit->getStatus() == STATUS_FALLING) { _unit->keepFalling(); } } else { _parent->getMap()->getCamera()->centerOnPosition(_unit->getPosition()); _parent->setStateInterval(BattlescapeState::DEFAULT_ANIM_SPEED); _unit->lookAt(3); } if (_unit->getHealth() == 0 && !_noSound) { Soldier *s = dynamic_cast<Soldier*>(_unit->getUnit()); if (s) { // soldiers have screams depending on gender if (s->getGender() == GENDER_MALE) { _parent->getGame()->getResourcePack()->getSoundSet("BATTLE.CAT")->getSound(RNG::generate(41,43))->play(); } else { _parent->getGame()->getResourcePack()->getSoundSet("BATTLE.CAT")->getSound(RNG::generate(44,46))->play(); } } else { // todo get death sound from RuleGenUnit if (_unit->getUnit()->getArmor()->getSize() > 1) { // HWP destroy sound _parent->getGame()->getResourcePack()->getSoundSet("BATTLE.CAT")->getSound(23)->play(); } else { _parent->getGame()->getResourcePack()->getSoundSet("BATTLE.CAT")->getSound(10)->play(); } } } //think(); }
/** * Update soldier stats when the soldier changes. */ void InventoryState::init() { BattleUnit *unit = _battleGame->getSelectedUnit(); unit->setCache(0); _soldier->clear(); _btnRank->clear(); _txtName->setText(unit->getName(_game->getLanguage())); _inv->setSelectedUnit(unit); Soldier *s = _game->getSavedGame()->getSoldier(unit->getId()); if (s) { SurfaceSet *texture = _game->getResourcePack()->getSurfaceSet("BASEBITS.PCK"); texture->getFrame(s->getRankSprite())->setX(0); texture->getFrame(s->getRankSprite())->setY(0); texture->getFrame(s->getRankSprite())->blit(_btnRank); std::string look = s->getArmor()->getSpriteInventory(); if (s->getGender() == GENDER_MALE) look += "M"; else look += "F"; if (s->getLook() == LOOK_BLONDE) look += "0"; if (s->getLook() == LOOK_BROWNHAIR) look += "1"; if (s->getLook() == LOOK_ORIENTAL) look += "2"; if (s->getLook() == LOOK_AFRICAN) look += "3"; look += ".SPK"; if (!CrossPlatform::fileExists(CrossPlatform::getDataFile("UFOGRAPH/" + look))) { look = s->getArmor()->getSpriteInventory() + ".SPK"; } _game->getResourcePack()->getSurface(look)->blit(_soldier); } if (_tu) { std::wstringstream ss; ss << _game->getLanguage()->getString("STR_TUS") << L'\x01' << unit->getTimeUnits(); _txtTus->setText(ss.str()); } }
/** * Update soldier stats when the soldier changes. */ void InventoryState::init() { BattleUnit *unit = _battleGame->getSelectedUnit(); unit->setCache(0); _soldier->clear(); _btnRank->clear(); _txtName->setText(unit->getUnit()->getName(_game->getLanguage())); _inv->setSelectedUnit(unit); Soldier *s = dynamic_cast<Soldier*>(unit->getUnit()); if (s) { SurfaceSet *texture = _game->getResourcePack()->getSurfaceSet("BASEBITS.PCK"); texture->getFrame(s->getRankSprite())->setX(0); texture->getFrame(s->getRankSprite())->setY(0); texture->getFrame(s->getRankSprite())->blit(_btnRank); std::string look = "MAN_0"; if (s->getGender() == GENDER_MALE) look += "M"; else look += "F"; if (s->getLook() == LOOK_BLONDE) look += "0"; if (s->getLook() == LOOK_BROWNHAIR) look += "1"; if (s->getLook() == LOOK_ORIENTAL) look += "2"; if (s->getLook() == LOOK_AFRICAN) look += "3"; look += ".SPK"; _game->getResourcePack()->getSurface(look)->blit(_soldier); } if (_tu) { std::wstringstream ss; ss << _game->getLanguage()->getString("STR_TUS") << L'\x01' << unit->getTimeUnits(); _txtTus->setText(ss.str()); } }
/** * Updates all soldier stats when the soldier changes. */ void InventoryState::init() { BattleUnit *unit = _battleGame->getSelectedUnit(); unit->setCache(0); _soldier->clear(); _btnRank->clear(); _txtName->setText(unit->getName(_game->getLanguage())); _inv->setSelectedUnit(unit); Soldier *s = _game->getSavedGame()->getSoldier(unit->getId()); if (s) { SurfaceSet *texture = _game->getResourcePack()->getSurfaceSet("BASEBITS.PCK"); texture->getFrame(s->getRankSprite())->setX(0); texture->getFrame(s->getRankSprite())->setY(0); texture->getFrame(s->getRankSprite())->blit(_btnRank); std::string look = s->getArmor()->getSpriteInventory(); if (s->getGender() == GENDER_MALE) look += "M"; else look += "F"; if (s->getLook() == LOOK_BLONDE) look += "0"; if (s->getLook() == LOOK_BROWNHAIR) look += "1"; if (s->getLook() == LOOK_ORIENTAL) look += "2"; if (s->getLook() == LOOK_AFRICAN) look += "3"; look += ".SPK"; if (!CrossPlatform::fileExists(CrossPlatform::getDataFile("UFOGRAPH/" + look))) { look = s->getArmor()->getSpriteInventory() + ".SPK"; } _game->getResourcePack()->getSurface(look)->blit(_soldier); } if (_showMoreStatsInInventoryView && !_tu) { std::wstringstream ss2; ss2 << _game->getLanguage()->getString("STR_FACCURACY") << L'\x01' << (int)(unit->getStats()->firing * unit->getAccuracyModifier()); _txtFAcc->setText(ss2.str()); std::wstringstream ss3; ss3 << _game->getLanguage()->getString("STR_REACT") << L'\x01' << unit->getStats()->reactions; _txtReact->setText(ss3.str()); if (unit->getStats()->psiSkill > 0) { std::wstringstream ss4; ss4 << _game->getLanguage()->getString("STR_PSKILL") << L'\x01' << unit->getStats()->psiSkill; _txtPSkill->setText(ss4.str()); std::wstringstream ss5; ss5 << _game->getLanguage()->getString("STR_PSTRENGTH") << L'\x01' << unit->getStats()->psiStrength; _txtPStr->setText(ss5.str()); } else { _txtPSkill->setText(L""); _txtPStr->setText(L""); } } updateStats(); }
/** * Draws a unit, using the drawing rules of the unit. * This function is called by Map, for each unit on the screen. */ void UnitSprite::draw() { Surface *torso = 0, *legs = 0, *leftArm = 0, *rightArm = 0, *item = 0; // magic numbers const int maleTorso = 32, femaleTorso = 267, legsStand = 16, legsKneel = 24, die = 264; const int larmStand = 0, rarmStand = 8, rarm1H = 232, larm2H = 240, ramr2H = 248, rarmShoot = 256; const int legsWalk[8] = { 56, 56+24, 56+24*2, 56+24*3, 56+24*4, 56+24*5, 56+24*6, 56+24*7 }; const int larmWalk[8] = { 40, 40+24, 40+24*2, 40+24*3, 40+24*4, 40+24*5, 40+24*6, 40+24*7 }; const int rarmWalk[8] = { 48, 48+24, 48+24*2, 48+24*3, 48+24*4, 48+24*5, 48+24*6, 48+24*7 }; const int yoffWalk[8] = {1, 0, -1, 0, 1, 0, -1, 0}; const int offX[8] = { 8, 10, 7, 4, -9, -11, -7, -3 }; const int offY[8] = { -6, -3, 0, 2, 0, -4, -7, -9 }; const int offYKneel = 4; clear(); Soldier *soldier = dynamic_cast<Soldier*>(_unit->getUnit()); if (_unit->isOut()) { // unit is drawn as an item return; } if (_unit->getStatus() == STATUS_FALLING) { torso = _unitSurface->getFrame(die + _unit->getFallingPhase()); torso->blit(this); return; } if (soldier != 0 && soldier->getGender() == GENDER_FEMALE) { torso = _unitSurface->getFrame(femaleTorso + _unit->getDirection()); } else { torso = _unitSurface->getFrame(maleTorso + _unit->getDirection()); } // when walking, torso(fixed sprite) has to be animated up/down if (_unit->getStatus() == STATUS_WALKING) { torso->setY(yoffWalk[_unit->getWalkingPhase()]); legs = _unitSurface->getFrame(legsWalk[_unit->getDirection()] + _unit->getWalkingPhase()); leftArm = _unitSurface->getFrame(larmWalk[_unit->getDirection()] + _unit->getWalkingPhase()); rightArm = _unitSurface->getFrame(rarmWalk[_unit->getDirection()] + _unit->getWalkingPhase()); } else { if (_unit->isKneeled()) { legs = _unitSurface->getFrame(legsKneel + _unit->getDirection()); } else { legs = _unitSurface->getFrame(legsStand + _unit->getDirection()); } leftArm = _unitSurface->getFrame(larmStand + _unit->getDirection()); rightArm = _unitSurface->getFrame(rarmStand + _unit->getDirection()); } // holding an item if (_item) { // draw handob item if (_unit->getStatus() == STATUS_AIMING) { int dir = (_unit->getDirection() + 2)%8; item = _itemSurface->getFrame(_item->getRules()->getHandSprite() + dir); item->setX(offX[_unit->getDirection()]); item->setY(offY[_unit->getDirection()]); } else { item = _itemSurface->getFrame(_item->getRules()->getHandSprite() + _unit->getDirection()); item->setX(0); item->setY(0); } // draw arms holding the item if (_item->getRules()->getTwoHanded()) { leftArm = _unitSurface->getFrame(larm2H + _unit->getDirection()); if (_unit->getStatus() == STATUS_AIMING) { rightArm = _unitSurface->getFrame(rarmShoot + _unit->getDirection()); } else { rightArm = _unitSurface->getFrame(ramr2H + _unit->getDirection()); } } else { rightArm = _unitSurface->getFrame(rarm1H + _unit->getDirection()); } // the fixed arm(s) have to be animated up/down when walking if (_unit->getStatus() == STATUS_WALKING) { item->setY(yoffWalk[_unit->getWalkingPhase()]); rightArm->setY(yoffWalk[_unit->getWalkingPhase()]); if (_item->getRules()->getTwoHanded()) leftArm->setY(yoffWalk[_unit->getWalkingPhase()]); } } // offset everything but legs when kneeled if (_unit->isKneeled()) { leftArm->setY(offYKneel); rightArm->setY(offYKneel); torso->setY(offYKneel); item?item->setY(item->getY() + offYKneel):void(); } else if (_unit->getStatus() != STATUS_WALKING) { leftArm->setY(0); rightArm->setY(0); torso->setY(0); } // blit order depends on unit direction switch (_unit->getDirection()) { case 0: leftArm->blit(this); legs->blit(this); item?item->blit(this):void(); torso->blit(this); rightArm->blit(this); break; case 1: leftArm->blit(this); legs->blit(this); torso->blit(this); item?item->blit(this):void(); rightArm->blit(this); break; case 2: leftArm->blit(this); legs->blit(this); torso->blit(this); item?item->blit(this):void(); rightArm->blit(this); break; case 3: legs->blit(this); torso->blit(this); leftArm->blit(this); rightArm->blit(this); item?item->blit(this):void(); break; case 4: rightArm->blit(this); legs->blit(this); torso->blit(this); leftArm->blit(this); item?item->blit(this):void(); break; case 5: rightArm->blit(this); legs->blit(this); item?item->blit(this):void(); torso->blit(this); leftArm->blit(this); break; case 6: rightArm->blit(this); legs->blit(this); item?item->blit(this):void(); torso->blit(this); leftArm->blit(this); break; case 7: item?item->blit(this):void(); leftArm->blit(this); rightArm->blit(this); legs->blit(this); torso->blit(this); break; } }
/** * Updates all soldier stats when the soldier changes. */ void InventoryState::init() { State::init(); BattleUnit *unit = _battleGame->getSelectedUnit(); // no selected unit, close inventory if (unit == 0) { btnOkClick(0); return; } // skip to the first unit with inventory if (!unit->hasInventory()) { if (_parent) { _parent->selectNextPlayerUnit(false, false, true); } else { _battleGame->selectNextPlayerUnit(false, false, true); } // no available unit, close inventory if (_battleGame->getSelectedUnit() == 0 || !_battleGame->getSelectedUnit()->hasInventory()) { // starting a mission with just vehicles btnOkClick(0); return; } else { unit = _battleGame->getSelectedUnit(); } } unit->setCache(0); _soldier->clear(); _rank->clear(); _txtName->setBig(); _txtName->setText(unit->getName(_game->getLanguage())); _inv->setSelectedUnit(unit); Soldier *s = unit->getGeoscapeSoldier(); if (s) { SurfaceSet *texture = _game->getMod()->getSurfaceSet("SMOKE.PCK"); texture->getFrame(20 + s->getRank())->setX(0); texture->getFrame(20 + s->getRank())->setY(0); texture->getFrame(20 + s->getRank())->blit(_rank); std::string look = s->getArmor()->getSpriteInventory(); if (s->getGender() == GENDER_MALE) look += "M"; else look += "F"; if (s->getLook() == LOOK_BLONDE) look += "0"; if (s->getLook() == LOOK_BROWNHAIR) look += "1"; if (s->getLook() == LOOK_ORIENTAL) look += "2"; if (s->getLook() == LOOK_AFRICAN) look += "3"; look += ".SPK"; const std::set<std::string> &ufographContents = FileMap::getVFolderContents("UFOGRAPH"); std::string lcaseLook = look; std::transform(lcaseLook.begin(), lcaseLook.end(), lcaseLook.begin(), tolower); if (ufographContents.find("lcaseLook") == ufographContents.end() && !_game->getMod()->getSurface(look)) { look = s->getArmor()->getSpriteInventory() + ".SPK"; } _game->getMod()->getSurface(look)->blit(_soldier); } else { Surface *armorSurface = _game->getMod()->getSurface(unit->getArmor()->getSpriteInventory()); if (armorSurface) { armorSurface->blit(_soldier); } } updateStats(); _refreshMouse(); }
/** * Updates all soldier stats when the soldier changes. */ void InventoryState::init() { State::init(); BattleUnit *unit = _battleGame->getSelectedUnit(); // no selected unit, close inventory if (unit == 0) { btnOkClick(0); return; } // skip to the first unit with inventory if (!unit->hasInventory()) { if (_parent) { _parent->selectNextPlayerUnit(false, false, true); } else { _battleGame->selectNextPlayerUnit(false, false, true); } // no available unit, close inventory if (_battleGame->getSelectedUnit() == 0 || !_battleGame->getSelectedUnit()->hasInventory()) { // starting a mission with just vehicles btnOkClick(0); return; } else { unit = _battleGame->getSelectedUnit(); } } if (_parent) _parent->getMap()->getCamera()->centerOnPosition(unit->getPosition(), false); unit->setCache(0); _soldier->clear(); _btnRank->clear(); _txtName->setBig(); _txtName->setText(unit->getName(_game->getLanguage())); _inv->setSelectedUnit(unit); Soldier *s = _game->getSavedGame()->getSoldier(unit->getId()); if (s) { SurfaceSet *texture = _game->getResourcePack()->getSurfaceSet("BASEBITS.PCK"); texture->getFrame(s->getRankSprite())->setX(0); texture->getFrame(s->getRankSprite())->setY(0); texture->getFrame(s->getRankSprite())->blit(_btnRank); std::string look = s->getArmor()->getSpriteInventory(); if (s->getGender() == GENDER_MALE) look += "M"; else look += "F"; if (s->getLook() == LOOK_BLONDE) look += "0"; if (s->getLook() == LOOK_BROWNHAIR) look += "1"; if (s->getLook() == LOOK_ORIENTAL) look += "2"; if (s->getLook() == LOOK_AFRICAN) look += "3"; look += ".SPK"; if (!CrossPlatform::fileExists(CrossPlatform::getDataFile("UFOGRAPH/" + look)) && !_game->getResourcePack()->getSurface(look)) { look = s->getArmor()->getSpriteInventory() + ".SPK"; } _game->getResourcePack()->getSurface(look)->blit(_soldier); } else { Surface *armorSurface = _game->getResourcePack()->getSurface(unit->getArmor()->getSpriteInventory()); if (armorSurface) { armorSurface->blit(_soldier); } } updateStats(); }
/** * Updates all soldier stats when the soldier changes. */ void InventoryState::init() { BattleUnit *unit = _battleGame->getSelectedUnit(); // no selected unit, close inventory if (unit == 0) { btnOkClick(0); return; } // skip to the first unit with inventory if (!unit->hasInventory()) { if (_parent) { _parent->selectNextPlayerUnit(false, false, true); } else { _battleGame->selectNextPlayerUnit(false, false, true); } // no available unit, close inventory if (_battleGame->getSelectedUnit() == 0) { // starting a mission with just vehicles btnOkClick(0); return; } else { unit = _battleGame->getSelectedUnit(); } } if (_parent) _parent->getMap()->getCamera()->centerOnPosition(unit->getPosition()); unit->setCache(0); _soldier->clear(); _btnRank->clear(); _txtName->setBig(); _txtName->setText(unit->getName(_game->getLanguage())); _inv->setSelectedUnit(unit); Soldier *s = _game->getSavedGame()->getSoldier(unit->getId()); if (s) { SurfaceSet *texture = _game->getResourcePack()->getSurfaceSet("BASEBITS.PCK"); texture->getFrame(s->getRankSprite())->setX(0); texture->getFrame(s->getRankSprite())->setY(0); texture->getFrame(s->getRankSprite())->blit(_btnRank); std::string look = s->getArmor()->getSpriteInventory(); if (s->getGender() == GENDER_MALE) look += "M"; else look += "F"; if (s->getLook() == LOOK_BLONDE) look += "0"; if (s->getLook() == LOOK_BROWNHAIR) look += "1"; if (s->getLook() == LOOK_ORIENTAL) look += "2"; if (s->getLook() == LOOK_AFRICAN) look += "3"; look += ".SPK"; if (!CrossPlatform::fileExists(CrossPlatform::getDataFile("UFOGRAPH/" + look)) && !_game->getResourcePack()->getSurface(look)) { look = s->getArmor()->getSpriteInventory() + ".SPK"; } _game->getResourcePack()->getSurface(look)->blit(_soldier); } else { Surface *armorSurface = _game->getResourcePack()->getSurface(unit->getArmor()->getSpriteInventory()); if (armorSurface) { armorSurface->blit(_soldier); } } if (_showMoreStatsInInventoryView && !_tu) { std::wstringstream ss2; ss2 << tr("STR_FACCURACY") << L'\x01' << (int)(unit->getStats()->firing * unit->getAccuracyModifier()); _txtFAcc->setText(ss2.str()); std::wstringstream ss3; ss3 << tr("STR_REACT") << L'\x01' << unit->getStats()->reactions; _txtReact->setText(ss3.str()); if (unit->getStats()->psiSkill > 0) { std::wstringstream ss4; ss4 << tr("STR_PSKILL") << L'\x01' << unit->getStats()->psiSkill; _txtPSkill->setText(ss4.str()); std::wstringstream ss5; ss5 << tr("STR_PSTRENGTH") << L'\x01' << unit->getStats()->psiStrength; _txtPStr->setText(ss5.str()); } else { _txtPSkill->setText(L""); _txtPStr->setText(L""); } } updateStats(); }