/* Copyright (C) 1998 Pyrosoft Inc. (www.pyrosoftgames.com), Matthew Bogue This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "BonusUnitPowerUp.hpp" #include #include "UnitTypes.hpp" #include "UnitInterface.hpp" #include "PlayerInterface.hpp" #include "MapInterface.hpp" #include "ConsoleInterface.hpp" #include "Server.hpp" #include "NetworkServer.hpp" #include "NetworkState.hpp" #include "UnitNetMessage.hpp" #include "PowerUpNetMessage.hpp" #include "System/Sound.hpp" SpritePacked BONUS_POWERUP_ANIM; SpritePacked BONUS_POWERUP_ANIM_SHADOW; BonusUnitPowerUp::BonusUnitPowerUp(iXY map_loc, int type) : PowerUp( map_loc, type ) { bonus_unit_type = rand() % _unit_type_humvee; bonus_unit_animation.setData( BONUS_POWERUP_ANIM ); bonus_unit_animation.setAttrib( powerup_state.world_loc, iXY(0,0), 5 ); bonus_unit_animation_shadow.setData( BONUS_POWERUP_ANIM_SHADOW ); bonus_unit_animation_shadow.setAttrib( powerup_state.world_loc, iXY(0,0), 4 ); bonus_unit_animation_shadow.setDrawModeBlend(&Palette::colorTableDarkenALot); } void BonusUnitPowerUp::spawnBonusUnits( UnitID &unit_id ) { PlacementMatrix placement_matrix; iXY map_loc; sound->playPowerUpSound(); UnitBase* unit = UnitInterface::getUnit(unit_id); MapInterface::pointXYtoMapXY( unit->unit_state.location, &map_loc ); placement_matrix.reset( map_loc ); for( int i = 0; i < 9; i++ ) { UnitBase *new_unit; iXY spawn_loc; placement_matrix.getNextEmptyLoc( &spawn_loc ); new_unit = UnitInterface::createUnit(bonus_unit_type, spawn_loc, unit->player->getID() ); if ( new_unit != 0 ) { UnitRemoteCreate create_mesg(new_unit->player->getID(), new_unit->id, spawn_loc.x, spawn_loc.y, bonus_unit_type); SERVER->sendMessage( &create_mesg, sizeof( UnitRemoteCreate )); } } PowerUpHitMesg hit_mesg; hit_mesg.set( powerup_state.ID, unit->player->getID() ); SERVER->sendMessage( &hit_mesg, sizeof( PowerUpHitMesg )); powerup_state.life_cycle_state = _power_up_lifecycle_state_inactive; if(unit->player == PlayerInterface::getLocalPlayer()) { ConsoleInterface::postMessage( "YOU GOT A BONUS UNITS POWERUP" ); } } void BonusUnitPowerUp::updateState( void ) { UnitID unit_id; if ( NetworkState::status == _network_state_server ) { if ( powerup_state.life_cycle_state == _power_up_lifecycle_state_active ) { if( isPowerUpHit( &unit_id ) == true ) { spawnBonusUnits( unit_id ); } } } } void BonusUnitPowerUp::offloadGraphics( SpriteSorter &sorter ) { bonus_unit_animation.nextFrame(); bonus_unit_animation_shadow.setFrame( bonus_unit_animation.getCurFrame() ); sorter.addSprite( &bonus_unit_animation ); sorter.addSprite( &bonus_unit_animation_shadow ); } void BonusUnitPowerUp::onHit( PowerUpHitMesg *message ) { PlayerID local_player_id; sound->playPowerUpSound(); powerup_state.life_cycle_state = _power_up_lifecycle_state_inactive; local_player_id = PlayerInterface::getLocalPlayerID(); if( local_player_id.getIndex() == message->getPlayerID() ) { ConsoleInterface::postMessage( "YOU GOT A BONUS UNITS POWERUP" ); } }