home *** CD-ROM | disk | FTP | other *** search
- #include "Game.h"
-
- #include "Input.h"
- #include "System.h"
- #include "log.h"
- #include "GuiInfo.h"
- #include "RendererInfo.h"
- #include "Renderer.h"
- #include "Network.h"
- #include "Gui.h"
- #include "LightEffectsParticleClusters.h"
- #include "ArenaEffectsParticleClusters.h"
- #include "VehicleEffectsParticleClusters.h"
- #include "random.h"
- #include "Mech.h"
- #include "ModelHandler.h"
-
- preloadedGameMedia_t Game::preloadedGameMedia;
- Camera Game::cam;
- Arena* Game::arena=NULL;
- arenaCycle_t Game::arenaCycle;
-
- Shot* Game::shots[GAME_MAX_SHOTS];
- Vehicle* Game::vehicles[GAME_MAX_VEHICLES];
-
- bool Game::initialized = false;
-
-
- bool Game::init(){
- int i;
-
- if(initialized){
- error("(in Game::init()): Game is already initialized.\n\n");
- return false;
- }
-
-
- log("\n");
- log("*********************\n");
- log("*** Starting Game ***\n");
- log("*********************\n");
- log("\n");
-
-
- info.cvar.game_arena->updateVar();
- info.cvar.game_useArenaCycle->updateVar();
- info.cvar.game_arenaCycleList->updateVar();
- info.cvar.game_mode->updateVar();
- info.cvar.game_enableFriendlyFire->updateVar();
- info.cvar.game_ghostTime->updateVar();
- info.cvar.game_clientGame->updateVar();
- info.cvar.game_player_name->updateVar();
- info.cvar.game_player_team->setVal(GAME_TEAM_SPECTATORS); // always begin new game as spectator
- info.cvar.game_player_team->updateVar();
-
- cam.setTarget(NULL);
-
- for(i=0;i<GAME_MAX_SHOTS;i++){
- shots[i] = NULL;
- }
- for(i=0;i<GAME_MAX_VEHICLES;i++){
- vehicles[i] = NULL;
- }
-
- Gui::loadingMenu->open();
- Gui::loadingMenu->updateStatusBar("starting game");
-
- if(info.var.clientGame){
- log("Starting client game...\n");
- Gui::loadingMenu->updateStatusBar("connecting...");
- Gui::loadingMenu->updateHeading(Network::info.var.server_hostName);
-
- // init server
- if(!Network::initServer()){
- error("(in Game::init()): Couldn't initialize server.\n\n");
- return false;
- }
-
- // init client
- if( !Network::initClient() ){
- error("(in Game::init()): Couldn't initialize client.\n\n");
- Network::shutdownServer();
- return false;
- }
-
- // connect and receive serverinfo
- if( !Network::client->connect()){
- error("(in Game::init()): Couldn't connect to server.\n\n");
- Network::shutdownClient();
- Network::shutdownServer();
- return false;
- }
- }else{ // server game
- log("Starting client-server game...\n");
-
- if( info.var.useArenaCycle ){
- if( !initArenaCycle() ){
- error("(in Game::init()): Couldn't initialize arenacycle.\n\n");
- return false;
- }
- }
-
- // init server
- if(!Network::initServer()){
- error("(in Game::init()): Couldn't initialize server.\n\n");
- return false;
- }
-
- // init client
- if( !Network::initClient() ){
- error("(in Game::init()): Couldn't initialize client.\n\n");
- Network::shutdownServer();
- return false;
- }
-
- // make loopback connection
- if(!Network::makeLoopbackConnection()){
- error("(in Game::init()): Couldn't make loopback connection.\n\n");
- Network::shutdownClient();
- Network::shutdownServer();
- return false;
- }
- }
-
- log("\n");
- log("\n");
-
- if(!File::exists(info.var.arena)){
- error("(in Game::init()): Arena-File '%s' does not exist.\n\n", info.var.arena);
- Network::shutdownClient();
- Network::shutdownServer();
- return false;
- }
-
- Gui::loadingMenu->updateStatusBar("loading arena");
- Gui::loadingMenu->updateSubHeading(Game::getModeName(info.var.mode));
-
- log("Loading arena...\n");
- arena = new Arena(info.var.arena);
- log("Arena '%s' loaded (%i spawnpoints, %i supplypads).\n", info.var.arena, arena->spawnpoints.size(), arena->supplypads.size());
- log("\n");
-
- Gui::loadingMenu->updateStatusBar("loading media");
-
- log("Loading game media...\n");
- if( !Game::initGameMedia() ){
- error("(in Game::init()): Couldn't init game media.\n\n");
- Network::shutdownClient();
- Network::shutdownServer();
- return false;
- }
- log("Game media loaded.\n");
- log("\n");
-
- if(!Renderer::initParticleSystem()){
- error("(in Game::init()): Couldn't init particle system.\n\n");
- Network::shutdownClient();
- Network::shutdownServer();
- return false;
- }
-
- if(!Gui::initHud()){
- error("(in Game::init()): Couldn't init HUD.\n\n");
- Renderer::shutdownParticleSystem();
- Network::shutdownClient();
- Network::shutdownServer();
- return false;
- }
-
- if(Sound::wasInit() && Sound::info.var.enabled && Sound::info.var.playMusic)
- Sound::stopMusic();
-
- Gui::loadingMenu->close();
-
- Input::hideMouseCursor();
- Input::grabInput();
-
- initialized = true;
-
- log("\n");
- log("Game::init() finished. Entering mainloop...\n");
- log("-- Press F1 for keyboard help --\n");
- mainLoop();
-
- return true; // never reached!
- }
-
- bool Game::shutdown(){
- int i;
-
- if(!initialized){
- error("(in Game::shutdown()): Game is not initialized.\n\n");
-
- return false;
- }
-
- log("\n");
- log("====================\n");
- log("=== Closing Game ===\n");
- log("====================\n");
- log("\n");
-
- Gui::shutdownHud();
- Renderer::shutdownParticleSystem();
- // Game::shutdownGameMedia();
- Network::shutdownClient();
- Network::shutdownServer();
- if( !info.var.clientGame && info.var.useArenaCycle ){
- shutdownArenaCycle();
- }
-
- log("\n");
- log("Deleting game media...\n");
- Game::shutdownGameMedia(); // FIXME: Models mssen bei shutdownClient noch da sein!!!! (wg. numMeshes)
-
- log("Deleting arena...\n");
- delete arena;
-
- log("Deleting shots and vehicles...\n");
- for(i=0;i<GAME_MAX_SHOTS;i++){
- if( shots[i] != NULL ){
- delete shots[i];
- shots[i] = NULL;
- }
- }
- for(i=0;i<GAME_MAX_VEHICLES;i++){
- if( vehicles[i] != NULL ){
- delete vehicles[i];
- vehicles[i] = NULL;
- }
- }
-
-
- log("\n");
- log("Game closed.\n");
-
- initialized = false;
-
- return true;
- }
-
- bool Game::wasInit(){
- return initialized;
- }
-
-
-
- bool Game::registerCVarsAndCCmds(){
- return info.registerCVarsAndCCmds();
- }
-
- bool Game::unregisterCVarsAndCCmds(){
- return info.unregisterCVarsAndCCmds();
- }
-
- bool Game::initGameMedia(){
- int i, j;
-
- preloadedGameMedia.supplyPadCylindersModel = new Model("arenas/shared/models/supply_pad_cylinders.model");
- preloadedGameMedia.supplyPadImpulseSound = Sound::loadWAV("arenas/shared/sounds/supply_pad_impulse.wav");
-
- preloadedGameMedia.spawnEffectSpheresModel = new Model("vehicles/shared/models/spawn_effect_spheres.model");
- preloadedGameMedia.spawnEffectSound = Sound::loadWAV("vehicles/shared/sounds/spawn_effect.wav");
- preloadedGameMedia.shockwaveShader = new Shader("vehicles/shared/shaders/shockwave.shader");
-
- preloadedGameMedia.alleycatTorsoModel = new Model("vehicles/alleycat/alleycat_torso.model");
- preloadedGameMedia.alleycatLegsModel = new Model("vehicles/alleycat/alleycat_legs.model");
- preloadedGameMedia.alleycatLegsAnimator = new Animator("vehicles/alleycat/alleycat_legs.animator");
-
- preloadedGameMedia.dragonflyBodyModel = new Model("vehicles/dragonfly/dragonfly_body.model");
- preloadedGameMedia.dragonflyJetsModel = new Model("vehicles/dragonfly/dragonfly_jets.model");
- preloadedGameMedia.dragonflyJetsAnimator = new Animator("vehicles/dragonfly/dragonfly_jets.animator");
-
-
- preloadedGameMedia.tinyExplosionShader = new Shader("weapons/shared/explosion_tiny.shader");
- preloadedGameMedia.smallExplosionShader = new Shader("weapons/shared/explosion_small.shader");
- preloadedGameMedia.mediumExplosionShader = new Shader("weapons/shared/explosion_medium.shader");
- preloadedGameMedia.bigExplosionShader = new Shader("weapons/shared/explosion_big.shader");
- preloadedGameMedia.smallSmokePuffShader = new Shader("weapons/shared/small_smoke_puff.shader");
- preloadedGameMedia.tinyExplosionSound = Sound::loadWAV("weapons/shared/explosion_tiny.wav");
- preloadedGameMedia.smallExplosionSound = Sound::loadWAV("weapons/shared/explosion_small.wav");
- preloadedGameMedia.mediumExplosionSound = Sound::loadWAV("weapons/shared/explosion_medium.wav");
- preloadedGameMedia.bigExplosionSound = Sound::loadWAV("weapons/shared/explosion_big.wav");
-
-
- preloadedGameMedia.laserModel = new Model("weapons/laser/laser.model");
- preloadedGameMedia.laserShotModel = new Model("weapons/laser/laser_shot.model");
- preloadedGameMedia.laserMarkShader = new Shader("weapons/laser/laser_mark.shader");
- preloadedGameMedia.laserFireSound = Sound::loadWAV("weapons/laser/laser_fire.wav");
- preloadedGameMedia.laserImpactSound = Sound::loadWAV("weapons/laser/laser_impact.wav");
- preloadedGameMedia.laserAnimator = new Animator("weapons/laser/laser.animator");
-
- preloadedGameMedia.chaingunModel = new Model("weapons/chaingun/chaingun.model");
- preloadedGameMedia.chaingunMuzzleFlashModel = new Model("weapons/chaingun/chaingun_muzzle_flash.model");
- preloadedGameMedia.chaingunImpactShader = new Shader("weapons/chaingun/chaingun_impact.shader");
- preloadedGameMedia.chaingunRicochetShader = new Shader("weapons/chaingun/chaingun_ricochet.shader");
- preloadedGameMedia.chaingunFireSound = Sound::loadWAV("weapons/chaingun/chaingun_fire.wav");
- for(i=0;i<MATERIAL_NUM_SURFACE_TYPES;i++){
- preloadedGameMedia.chaingunMarkShaders[i] = NULL;
- for(j=0;j<3;j++){
- preloadedGameMedia.chaingunImpactSounds[i][j] = NULL;
- }
- }
- preloadedGameMedia.chaingunImpactSounds[MATERIAL_SURFACE_TYPE_METAL][0] = Sound::loadWAV("weapons/chaingun/chaingun_impact_metal_01.wav");
- preloadedGameMedia.chaingunImpactSounds[MATERIAL_SURFACE_TYPE_METAL][1] = Sound::loadWAV("weapons/chaingun/chaingun_impact_metal_02.wav");
- preloadedGameMedia.chaingunImpactSounds[MATERIAL_SURFACE_TYPE_METAL][2] = Sound::loadWAV("weapons/chaingun/chaingun_impact_metal_03.wav");
- preloadedGameMedia.chaingunImpactSounds[MATERIAL_SURFACE_TYPE_STONE][0] = Sound::loadWAV("weapons/chaingun/chaingun_impact_stone_01.wav");
- preloadedGameMedia.chaingunImpactSounds[MATERIAL_SURFACE_TYPE_STONE][1] = Sound::loadWAV("weapons/chaingun/chaingun_impact_stone_02.wav");
- preloadedGameMedia.chaingunImpactSounds[MATERIAL_SURFACE_TYPE_STONE][2] = Sound::loadWAV("weapons/chaingun/chaingun_impact_stone_03.wav");
- preloadedGameMedia.chaingunImpactSounds[MATERIAL_SURFACE_TYPE_WOOD][0] = Sound::loadWAV("weapons/chaingun/chaingun_impact_wood_01.wav");
- preloadedGameMedia.chaingunImpactSounds[MATERIAL_SURFACE_TYPE_WOOD][1] = Sound::loadWAV("weapons/chaingun/chaingun_impact_wood_02.wav");
- preloadedGameMedia.chaingunImpactSounds[MATERIAL_SURFACE_TYPE_WOOD][2] = Sound::loadWAV("weapons/chaingun/chaingun_impact_wood_03.wav");
- preloadedGameMedia.chaingunImpactSounds[MATERIAL_SURFACE_TYPE_DIRT][0] = Sound::loadWAV("weapons/chaingun/chaingun_impact_dirt_01.wav");
- preloadedGameMedia.chaingunImpactSounds[MATERIAL_SURFACE_TYPE_DIRT][1] = Sound::loadWAV("weapons/chaingun/chaingun_impact_dirt_02.wav");
- preloadedGameMedia.chaingunImpactSounds[MATERIAL_SURFACE_TYPE_DIRT][2] = Sound::loadWAV("weapons/chaingun/chaingun_impact_dirt_03.wav");
-
- preloadedGameMedia.chaingunMarkShaders[MATERIAL_SURFACE_TYPE_METAL] = new Shader("weapons/chaingun/chaingun_mark_metal.shader");
- preloadedGameMedia.chaingunMarkShaders[MATERIAL_SURFACE_TYPE_STONE] = new Shader("weapons/chaingun/chaingun_mark_stone.shader");
- preloadedGameMedia.chaingunMarkShaders[MATERIAL_SURFACE_TYPE_WOOD] = new Shader("weapons/chaingun/chaingun_mark_wood.shader");
- preloadedGameMedia.chaingunMarkShaders[MATERIAL_SURFACE_TYPE_DIRT] = new Shader("weapons/chaingun/chaingun_mark_dirt.shader");
-
- preloadedGameMedia.chaingunAnimator = new Animator("weapons/chaingun/chaingun.animator");
-
-
- preloadedGameMedia.railgunModel = new Model("weapons/railgun/railgun.model");
- preloadedGameMedia.railgunTrailShader = new Shader("weapons/railgun/railgun_trail.shader");
- preloadedGameMedia.railgunImpactShader = new Shader("weapons/railgun/railgun_impact.shader");
- preloadedGameMedia.railgunMarkShader = new Shader("weapons/railgun/railgun_mark.shader");
- preloadedGameMedia.railgunFireSound = Sound::loadWAV("weapons/railgun/railgun_fire.wav");
- preloadedGameMedia.railgunImpactSound = Sound::loadWAV("weapons/railgun/railgun_impact.wav");
- preloadedGameMedia.railgunAnimator = new Animator("weapons/railgun/railgun.animator");
-
-
- preloadedGameMedia.rocketlauncherModel = new Model("weapons/rocketlauncher/rocketlauncher.model");
- preloadedGameMedia.rocketlauncherShotModel = new Model("weapons/rocketlauncher/rocketlauncher_shot.model");
- preloadedGameMedia.rocketlauncherFireSound = Sound::loadWAV("weapons/rocketlauncher/rocketlauncher_fire.wav");
- // preloadedGameMedia.rocketlauncherImpactSound = Sound::loadWAV("weapons/rocketlauncher/rocketlauncher_impact.wav");
- preloadedGameMedia.rocketlauncherAnimator = new Animator("weapons/rocketlauncher/rocketlauncher.animator");
-
-
- preloadedGameMedia.plasmagunModel = new Model("weapons/plasmagun/plasmagun.model");
- preloadedGameMedia.plasmagunShotShader = new Shader("weapons/plasmagun/plasma_ball.shader");
- preloadedGameMedia.plasmagunImpactShader = new Shader("weapons/plasmagun/plasmagun_impact.shader");
- preloadedGameMedia.plasmagunMarkShader = new Shader("weapons/plasmagun/plasmagun_mark.shader");
- preloadedGameMedia.plasmagunFireSound = Sound::loadWAV("weapons/plasmagun/plasmagun_fire.wav");
- preloadedGameMedia.plasmagunImpactSound = Sound::loadWAV("weapons/plasmagun/plasmagun_impact.wav");
- preloadedGameMedia.plasmagunAnimator = new Animator("weapons/plasmagun/plasmagun.animator");
-
-
- for(i=0;i<GAME_VOICE_MESSAGE_FUN1;i++){
- char buff[256];
- sprintf( buff, "vehicles/shared/sounds/voice_messages/%s.wav", Game::getVoiceMessageName(i) );
- preloadedGameMedia.voiceMessages[i] = Sound::loadWAV(buff);
- }
-
- preloadedGameMedia.voiceMessages[GAME_VOICE_MESSAGE_FUN1] = Sound::loadWAV("vehicles/shared/sounds/voice_messages/bender_bite.wav");
- preloadedGameMedia.voiceMessages[GAME_VOICE_MESSAGE_FUN2] = Sound::loadWAV("vehicles/shared/sounds/voice_messages/crush_kill_destroy.wav");
- preloadedGameMedia.voiceMessages[GAME_VOICE_MESSAGE_FUN3] = Sound::loadWAV("vehicles/shared/sounds/voice_messages/austin_behave.wav");
- preloadedGameMedia.voiceMessages[GAME_VOICE_MESSAGE_FUN4] = Sound::loadWAV("vehicles/shared/sounds/voice_messages/dr_evil_angry.wav");
- preloadedGameMedia.voiceMessages[GAME_VOICE_MESSAGE_FUN5] = Sound::loadWAV("vehicles/shared/sounds/voice_messages/fmj_kommi_schwein.wav");
- preloadedGameMedia.voiceMessages[GAME_VOICE_MESSAGE_FUN6] = Sound::loadWAV("vehicles/shared/sounds/voice_messages/homer_champion.wav");
- preloadedGameMedia.voiceMessages[GAME_VOICE_MESSAGE_FUN7] = Sound::loadWAV("vehicles/shared/sounds/voice_messages/homer_invincible.wav");
- preloadedGameMedia.voiceMessages[GAME_VOICE_MESSAGE_FUN8] = Sound::loadWAV("vehicles/shared/sounds/voice_messages/arschloch.wav");
- preloadedGameMedia.voiceMessages[GAME_VOICE_MESSAGE_FUN9] = Sound::loadWAV("vehicles/shared/sounds/voice_messages/evil_laugh.wav");
- preloadedGameMedia.voiceMessages[GAME_VOICE_MESSAGE_FUN10] = Sound::loadWAV("vehicles/shared/sounds/voice_messages/long_laugh.wav");
-
- return true;
- }
-
- bool Game::shutdownGameMedia(){
- int i, j;
-
- delete preloadedGameMedia.supplyPadCylindersModel;
- Mix_FreeChunk(preloadedGameMedia.supplyPadImpulseSound);
-
- delete preloadedGameMedia.spawnEffectSpheresModel;
- Mix_FreeChunk(preloadedGameMedia.spawnEffectSound);
- delete preloadedGameMedia.shockwaveShader;
-
- delete preloadedGameMedia.alleycatTorsoModel;
- delete preloadedGameMedia.alleycatLegsModel;
- delete preloadedGameMedia.alleycatLegsAnimator;
-
- delete preloadedGameMedia.dragonflyBodyModel;
- delete preloadedGameMedia.dragonflyJetsModel;
- delete preloadedGameMedia.dragonflyJetsAnimator;
-
- delete preloadedGameMedia.tinyExplosionShader;
- delete preloadedGameMedia.smallExplosionShader;
- delete preloadedGameMedia.mediumExplosionShader;
- delete preloadedGameMedia.bigExplosionShader;
- delete preloadedGameMedia.smallSmokePuffShader;
- Mix_FreeChunk(preloadedGameMedia.tinyExplosionSound);
- Mix_FreeChunk(preloadedGameMedia.smallExplosionSound);
- Mix_FreeChunk(preloadedGameMedia.mediumExplosionSound);
- Mix_FreeChunk(preloadedGameMedia.bigExplosionSound);
-
- delete preloadedGameMedia.laserModel;
- delete preloadedGameMedia.laserShotModel;
- delete preloadedGameMedia.laserMarkShader;
- Mix_FreeChunk(preloadedGameMedia.laserFireSound);
- Mix_FreeChunk(preloadedGameMedia.laserImpactSound);
- delete preloadedGameMedia.laserAnimator;
-
- delete preloadedGameMedia.chaingunModel;
- delete preloadedGameMedia.chaingunMuzzleFlashModel;
- delete preloadedGameMedia.chaingunImpactShader;
- delete preloadedGameMedia.chaingunRicochetShader;
- Mix_FreeChunk(preloadedGameMedia.chaingunFireSound);
- for(i=0;i<MATERIAL_NUM_SURFACE_TYPES;i++){
- if( preloadedGameMedia.chaingunMarkShaders[i] != NULL ){
- delete preloadedGameMedia.chaingunMarkShaders[i];
- }
- for(j=0;j<3;j++){
- if( preloadedGameMedia.chaingunImpactSounds[i][j] != NULL ){
- Mix_FreeChunk(preloadedGameMedia.chaingunImpactSounds[i][j]);
- }
- }
- }
- delete preloadedGameMedia.chaingunAnimator;
-
- delete preloadedGameMedia.railgunModel;
- delete preloadedGameMedia.railgunTrailShader;
- delete preloadedGameMedia.railgunImpactShader;
- delete preloadedGameMedia.railgunMarkShader;
- Mix_FreeChunk(preloadedGameMedia.railgunFireSound);
- Mix_FreeChunk(preloadedGameMedia.railgunImpactSound);
- delete preloadedGameMedia.railgunAnimator;
-
- delete preloadedGameMedia.rocketlauncherModel;
- delete preloadedGameMedia.rocketlauncherShotModel;
- Mix_FreeChunk(preloadedGameMedia.rocketlauncherFireSound);
- // Mix_FreeChunk(preloadedGameMedia.rocketlauncherImpactSound);
- delete preloadedGameMedia.rocketlauncherAnimator;
-
- delete preloadedGameMedia.plasmagunModel;
- delete preloadedGameMedia.plasmagunShotShader;
- delete preloadedGameMedia.plasmagunImpactShader;
- delete preloadedGameMedia.plasmagunMarkShader;
- Mix_FreeChunk(preloadedGameMedia.plasmagunFireSound);
- Mix_FreeChunk(preloadedGameMedia.plasmagunImpactSound);
- delete preloadedGameMedia.plasmagunAnimator;
-
- for(i=0;i<GAME_NUM_VOICE_MESSAGES;i++){
- if( preloadedGameMedia.voiceMessages[i] != NULL ){
- Mix_FreeChunk(preloadedGameMedia.voiceMessages[i]);
- }
- }
-
-
- return true;
- }
-
- bool Game::initArenaCycle(){
-
- arenaCycle.arenaCycleElements.clear();
-
- log("Reading '%s'...\n", info.var.arenaCycleList);
-
- if( !File::exists("arenas/arenacycle.list") ){
- error("(in Game::initArenaCycle()): File '%s' does not exist.\n\n", info.var.arenaCycleList);
- return false;
- }
-
- File f(info.var.arenaCycleList, "rt");
- if( !f.isOpen() ){
- error("(in Game::initArenaCycle()): Couldn't open file '%s'.\n\n", info.var.arenaCycleList);
- return false;
- }
-
- char buff[256];
- while(f.readLine(256, buff, true) != -1){
- if(strlen(buff) == 0){
- continue;
- }
-
- Tokenizer t(buff, "\" \t", "\"");
-
- if(t.tokc!=2){
- warn("(in Game::initArenaCycle()): Wrong number of tokens in line %i of file '%s' (needed 2 but read %i).\n\n", f.line, f.filename, t.tokc);
- continue;
- }
-
- arenaCycleElement_t ace;
- strncpy(ace.arena, t.tokv[0], CON_MAX_STRING_LENGTH);
- ace.durationMillis = atoi(t.tokv[1]) * 60 * 1000;
- arenaCycle.arenaCycleElements.push_back(ace);
- }
-
- if( arenaCycle.arenaCycleElements.size() == 0 ){
- error("(in Game::initArenaCycle()): No arena in arenacycle.\n\n");
- return false;
- }
-
- arenaCycle.playingSinceMillis = SDL_GetTicks();
- arenaCycle.currentArena = 0;
-
- //strcpy(info.var.arena, arenaCycle.arenaCycleElements[0].arena);
- info.cvar.game_arena->setValStr(arenaCycle.arenaCycleElements[0].arena);
- info.cvar.game_arena->updateVar();
-
- return true;
- }
-
- bool Game::shutdownArenaCycle(){
- arenaCycle.arenaCycleElements.clear();
- arenaCycle.playingSinceMillis = SDL_GetTicks();
- arenaCycle.currentArena = 0;
-
- return true;
- }
-
-
- void Game::mainLoop(void){
- bool done = false;
- SDL_Event event;
- unsigned long currentMillis = 0;
- unsigned long frameStartMillis = SDL_GetTicks();
- unsigned long frameDurationMillis = 0;
-
- Network::client->emptyPacketQueue();
- info.cvar.game_player_team->setVal(GAME_TEAM_SPECTATORS); // always begin new game as spectator
- info.cvar.game_player_team->updateVar();
- Network::client->sendClientSpawn(); // to enter the game
-
- while(!done){
- frameStartMillis = SDL_GetTicks();
-
- while(SDL_PollEvent(& event)){
- switch(event.type){
- case SDL_QUIT:
- System::normalQuit();
- break;
-
- case SDL_KEYDOWN:
- if(event.key.keysym.sym==SDLK_ESCAPE){ // inGameMenu toggle
- if(Gui::inGameMenu->isOpened()){
- Input::hideMouseCursor();
- Input::grabInput();
- Gui::inGameMenu->close();
- }else if( Gui::hud->chatPrompt->isActive ){ // close chatPrompt
- Gui::hud->chatPrompt->deactivate();
- }else{ // open inGameMenu
- Input::showMouseCursor();
- Input::freeInput();
- Gui::inGameMenu->open();
- }
-
- }
- if(!Gui::inGameMenu->isOpened()){
- Input::handleKeyboardEvent(&event.key);
- }else{
- Gui::inGameMenu->handleKeyboardEvent(&event.key);
- }
- break;
-
- case SDL_KEYUP:
- if(!Gui::inGameMenu->isOpened()){
- Input::handleKeyboardEvent(&event.key);
- }else{
- Gui::inGameMenu->handleKeyboardEvent(&event.key);
- }
- break;
-
- case SDL_MOUSEMOTION:
- if(!Gui::inGameMenu->isOpened()){
- Input::handleMouseMotionEvent(&event.motion);
- }else{
- Gui::inGameMenu->handleMouseMotionEvent(&event.motion);
- }
- break;
-
-
- case SDL_MOUSEBUTTONDOWN:
- if(!Gui::inGameMenu->isOpened()){
- Input::handleMouseButtonEvent(&event.button);
- }else{
- Gui::inGameMenu->handleMouseButtonEvent(&event.button);
- }
- break;
-
- case SDL_MOUSEBUTTONUP:
- if(!Gui::inGameMenu->isOpened()){
- Input::handleMouseButtonEvent(&event.button);
- }else{
- Gui::inGameMenu->handleMouseButtonEvent(&event.button);
- }
- break;
-
- default:
-
- //warn("(in main::MainLoop()): received unknown event. Ignoring.\n\n");
- break;
- } // switch
- } // while( SDL_ ...
-
- Network::sendAndReceive();
-
- Input::processInputArray();
-
- Game::moveVehicles();
- Game::moveShots();
- Game::moveCamera();
- if( !Game::info.var.clientGame && Game::info.var.useArenaCycle )
- Game::doArenaCycle();
-
- Renderer::particleSystem.moveParticleClusters();
- Renderer::renderScene();
-
- // Frame-Bremse!
- currentMillis = SDL_GetTicks();
- frameDurationMillis = currentMillis - frameStartMillis;
-
- if( frameDurationMillis < 10 )
- SDL_Delay(10 - frameDurationMillis);
- } // while( ! done)
- }
-
- void Game::doArenaCycle(){
- static bool oneMinuteWarningSend = false;
- static bool tenSecondsWarningSend = false;
-
- unsigned long currentMillis = SDL_GetTicks();
-
- // do arenacycle stuff
- if( currentMillis + 60000 > arenaCycle.playingSinceMillis + arenaCycle.arenaCycleElements[arenaCycle.currentArena].durationMillis
- && !oneMinuteWarningSend ){
- Network::server->sendChatMessage("Changing arena in one minute!");
- oneMinuteWarningSend = true;
- }else if( currentMillis + 10000 > arenaCycle.playingSinceMillis + arenaCycle.arenaCycleElements[arenaCycle.currentArena].durationMillis
- && !tenSecondsWarningSend ){
- Network::server->sendChatMessage("Changing arena in 10 seconds!");
- tenSecondsWarningSend = true;
- }else if( currentMillis > arenaCycle.playingSinceMillis + arenaCycle.arenaCycleElements[arenaCycle.currentArena].durationMillis ){
-
- Gui::loadingMenu->open();
- Gui::loadingMenu->updateStatusBar("changing arena");
- Gui::loadingMenu->updateHeading("changing arena");
-
- arenaCycle.currentArena++;
- if( arenaCycle.currentArena >= arenaCycle.arenaCycleElements.size() )
- arenaCycle.currentArena = 0;
-
- Game::info.cvar.game_arena->setValStr( arenaCycle.arenaCycleElements[arenaCycle.currentArena].arena );
- Game::info.cvar.game_arena->updateVar();
-
- Network::server->sendArenaChange();
-
- if( !Game::changeArena() ){
- error("(in Game::doArenaCycle()): Game::changeArena() failed.\n\n");
- Game::shutdown();
- Gui::mainMenu->open();
- }
-
- log("\n");
- log("Game::changeArena() finished. Resetting clients...\n");
- Network::server->resetClients();
- Network::server->emptyPacketQueue();
-
- Gui::loadingMenu->close();
-
- arenaCycle.playingSinceMillis = SDL_GetTicks();
- oneMinuteWarningSend = false;
- tenSecondsWarningSend = false;
- log("Re-entering Mainloop...\n");
- // weiter geht's?? - scheint so...
- mainLoop();
-
- }
- }
-
- bool Game::changeArena(){
- int i;
- char buff[256];
-
- log("Changing arena...\n");
- // show scores
- sprintf(buff, "scores for %s", arena->name);
- Gui::loadingMenu->updateHeading(buff);
- Gui::loadingMenu->updateCenterTexture(arena->thumbnailTexture);
- Gui::loadingMenu->updateSubHeading(Game::getModeName(info.var.mode));
- Gui::loadingMenu->drawScoreboard = true;
- for(i=0;i<10;i++){
- sprintf(buff, "%i seconds", 10 - i);
- Gui::loadingMenu->updateStatusBar(buff);
- SDL_Delay(1000);
- }
- Gui::loadingMenu->drawScoreboard = false;
- Gui::loadingMenu->updateHeading("changing arena");
- Gui::loadingMenu->updateCenterTexture(NULL);
-
-
- // change arena
- log("Deleting shots and vehicles...\n");
- for(i=0;i<GAME_MAX_SHOTS;i++){
- if( shots[i] != NULL ){
- unspawnShot( shots[i] );
- }
- }
- for(i=0;i<GAME_MAX_VEHICLES;i++){
- if( vehicles[i] != NULL ){
- unspawnVehicle( vehicles[i] );
- }
- }
-
- Renderer::shutdownParticleSystem();
- log("Deleting arena...\n");
- delete arena;
- arena = NULL;
-
-
-
- if(!File::exists(info.var.arena)){
- error("(in Game::init()): Arena-File '%s' does not exist.\n\n", info.var.arena);
- Network::shutdownClient();
- Network::shutdownServer();
- return false;
- }
-
- Gui::loadingMenu->updateStatusBar("loading arena");
-
- log("Loading arena...\n");
- arena = new Arena(info.var.arena);
- log("Arena '%s' loaded (%i spawnpoints, %i supplypads).\n", info.var.arena, arena->spawnpoints.size(), arena->supplypads.size());
- log("\n");
-
- if(!Renderer::initParticleSystem()){
- error("(in Game::init()): Couldn't init particle system.\n\n");
- Network::shutdownClient();
- Network::shutdownServer();
- return false;
- }
-
-
- return true;
- }
-
-
- void Game::moveVehicles(){
- for(int i=0;i<Network::server->si.maxClients;i++){
- if( vehicles[i] != NULL ){
- vehicles[i]->move();
- }
- }
-
- }
-
- void Game::moveShots(){
- static unsigned int lastShotMoveMillis = SDL_GetTicks();
-
- unsigned long currentMillis = SDL_GetTicks();
- float deltaT = (currentMillis - lastShotMoveMillis)/1000.0f;
- lastShotMoveMillis = currentMillis;
-
- for(int i=0;i<GAME_MAX_SHOTS;i++){
- if( shots[i] != NULL ){
- Shot* s = shots[i];
- if( currentMillis > s->spawntimeMillis + s->lifetimeMillis ){
- unspawnShot(s);
- // delete s;
- }else{
- shots[i]->move(deltaT);
- }
- }
- }
- }
-
- void Game::moveCamera(){
- cam.move();
- }
-
-
- void Game::findSpawnpointForClient(Client* client){
- unsigned int i;
-
- unsigned int numSpawnPoints = arena->spawnpoints.size();
- unsigned int first = irand(numSpawnPoints-1);
-
- for(i=first;i<numSpawnPoints;i++){
- spawnpoint_t* sp = &arena->spawnpoints[i];
- if( sp->teamFlags & (0x01 << client->ci.team) ){
- float u = frand();
- float v = frand();
- float w = frand();
- vec3_t pos;
-
- pos[0] = (1.0f-u)*sp->min[0] + (u)*sp->max[0];
- pos[1] = (1.0f-v)*sp->min[1] + (v)*sp->max[1];
- pos[2] = (1.0f-w)*sp->min[2] + (w)*sp->max[2];
-
- // TODO: check if pos is save!
- vectorCopy3d(pos, client->cs.pos);
- return;
- }
- }
-
- for(i=0;i<first;i++){
- spawnpoint_t* sp = &arena->spawnpoints[i];
- if( sp->teamFlags & (0x01 << client->ci.team) ){
- float u = frand();
- float v = frand();
- float w = frand();
- vec3_t pos;
-
- pos[0] = (1.0f-u)*sp->min[0] + (u)*sp->max[0];
- pos[1] = (1.0f-v)*sp->min[1] + (v)*sp->max[1];
- pos[2] = (1.0f-w)*sp->min[2] + (w)*sp->max[2];
-
- // TODO: check if pos is save!
- vectorCopy3d(pos, client->cs.pos);
- return;
- }
- }
-
-
- warn("(in Game::findSpawnpointForClient()): Couldn't find spawnpoint for client '%s'.\n\n", client->ci.name);
- }
-
- void Game::spawnVehicle(Client* client){
- if( client->clientId == -1 ){
- warn("(in Game:spawnVehicle()): Tried to spawn vehicle for client with invalid clientId. Ignoring\n\n");
- return;
- }
-
- int slot = client->clientId;
-
- // ok, spawn him
-
- client->lastSpawnMillis = SDL_GetTicks();
-
- if( client->ci.team == GAME_TEAM_SPECTATORS ){
- if( client == Network::client ){ // local client
- cam.setTarget(NULL);
- cam.setPositionAndOrientation(client->cs.pos, client->cs.dir, client->cs.up);
- // cam.setMode(CAMERA_MODE_FIRST_PERSON);
- }
- }else{
- client->vehicle = Vehicle::createVehicleForClient(client);
- vehicles[slot] = client->vehicle;
-
- if( client == Network::client ){
- cam.setTarget(client->vehicle);
- cam.setPositionAndOrientation(client->cs.pos, client->cs.dir, client->cs.up); // THINKABOUTME: damit sound im spawneffect richtig abgespeilt wird...
- // cam.setMode(CAMERA_MODE_FIRST_PERSON);
- }
-
- // link effect
- Renderer::particleSystem.linkParticleCluster( new SpawnEffectParticleCluster(client->vehicle->pos) );
- }
-
- // printf("spawned %s.\n", client->ci.name);
- }
-
- void Game::unspawnVehicle(Vehicle* vehicle){
- if( vehicle->client->clientId == -1 ){
- warn("(in Game:unspawnVehicle()): Tried to unspawn vehicle for client with invalid clientId. Ignoring\n\n");
- return;
- }
-
- if( vehicle != NULL ){
-
- // link effect!
- // Renderer::particleSystem.linkParticleCluster( new SpawnEffectParticleCluster(client->vehicle->pos) );
-
- if( vehicle == cam.target ){
- cam.setTarget(NULL);
- }
-
- // search slot in vehicles-array
- int slot = vehicle->client->clientId;
-
- vehicle->client->vehicle = NULL;
- vehicles[slot] = NULL;
- delete vehicle;
- }else{
- warn("(in Game:unspawnVehicle()): Tried to unspawn client that is already unspawned.\n\n");
- }
- }
-
- void Game::killClient(Client* killed, Client* killer, char weapon){
- if( killed->vehicle != NULL ){
- killed->cs.armor = 0;
- killed->cs.energy = 0;
-
- killed->nextSpawnMillis = SDL_GetTicks() + Game::info.var.ghostTime;
-
- if( weapon == -1 ){ // killed by server admin
- log("%s was killed by server admin.\n", killed->ci.name);
- }else if( killed == killer ){ // suicide
- log("%s commited suicide.\n", killed->ci.name);
- killed->ci.score--;
- killed->ci.deaths++;
- }else{ // normal kill
- if( killer != NULL ){
- if( Game::info.var.mode == GAME_MODE_DEATHMATCH ){
- log("%s became a victim of %ss %s.\n", killed->ci.name, killer->ci.name, Game::getWeaponName(weapon));
- if( killed == Network::client ){
- Gui::hud->centerOfScreenMessages->setMessage("You were killed by %s!", killer->ci.name);
- }else if( killer == Network::client ){
- Gui::hud->centerOfScreenMessages->setMessage("You killed %s!", killed->ci.name);
- }
- killed->ci.deaths++;
- killer->ci.score++;
- killer->ci.kills++;
- }else if( Game::info.var.mode == GAME_MODE_TEAM_DEATHMATCH ){
- if( killer->ci.team != killed->ci.team ){
- log("%s became a victim of %ss %s.\n", killed->ci.name, killer->ci.name, Game::getWeaponName(weapon));
- if( killed == Network::client ){
- Gui::hud->centerOfScreenMessages->setMessage("You were killed by %s!", killer->ci.name);
- }else if( killer == Network::client ){
- Gui::hud->centerOfScreenMessages->setMessage("You killed %s!", killed->ci.name);
- }
- killed->ci.deaths++;
- killer->ci.score++;
- killer->ci.kills++;
- }else{ // team kill
- log("%s was TEAMkilled by %ss %s.\n", killed->ci.name, killer->ci.name, Game::getWeaponName(weapon));
- if( killed == Network::client ){
- Gui::hud->centerOfScreenMessages->setMessage("You were TEAMkilled by %s!", killer->ci.name);
- }else if( killer == Network::client ){
- Gui::hud->centerOfScreenMessages->setMessage("You TEAMkilled %s!", killed->ci.name);
- }
- // killed->ci.deaths++;
- // killer->ci.score++;
- // killer->ci.kills++;
- }
- }
- }else{
- log("%s was killed by %ss %s.\n", killed->ci.name, "<disconnected>", Game::getWeaponName(weapon));
- if( killed == Network::client ){
- Gui::hud->centerOfScreenMessages->setMessage("You were killed by <disconnected>!", killer->ci.name);
- }
- killed->ci.deaths++;
- }
- }
-
- // move camera
- if( cam.target == killed->vehicle && cam.mode == CAMERA_MODE_FIRST_PERSON ){
- vectorMA3d(cam.pos, -5.0f, cam.dir, cam.pos);
- cam.anglesFromVectors();
- }
-
- // remove vehicle
- killed->vehicle->explode();
- unspawnVehicle(killed->vehicle);
- }else{
- warn("(in Game::killClient()): Tried to kill client that is already dead.\n\n");
- }
- }
-
- void Game::spawnShot(shotSpawnPacket_t* ss){
- Shot* s = Shot::createShotForShotSpawnPacket(ss);
-
- if( s == NULL )
- return;
-
- s->leaveMuzzle();
-
- for(int i=0;i<GAME_MAX_SHOTS;i++){
- if( shots[i] == NULL ){
- shots[i] = s;
- return;
- }
- }
-
- warn("(in Game::spawnShot()): Couldn't spawn shot (GAME_MAX_SHOTS reached).\n\n");
- delete s;
- }
-
- void Game::unspawnShot(Shot* shot){
- for(int i=0;i<GAME_MAX_SHOTS;i++){
- if( shots[i] == shot ){
- delete shots[i];
- shots[i] = NULL;
- return;
- }
- }
-
- warn("(in Game::unspawnShot()): Couldn't unspawn shot (not found).\n\n");
- }
-
-
- void Game::chatMessageAll(const char* message){
- Network::client->sendChatMessage(GAME_CHAT_MODE_ALL, message);
- }
-
- void Game::chatMessageTeam(const char* message){
- Network::client->sendChatMessage(GAME_CHAT_MODE_TEAM, message);
- }
-
-
- void Game::renderVehicles(){
- for(int i=0;i<GAME_MAX_VEHICLES;i++){
-
- if( vehicles[i] != NULL
- && ( vehicles[i]->boundingSphereRadius == 0.0f || Game::cam.sphereInFrustum(vehicles[i]->pos, vehicles[i]->boundingSphereRadius) )
- ){
- vehicles[i]->render();
-
- }
- }
- }
-
- void Game::renderShots(){
- for(int i=0;i<GAME_MAX_SHOTS;i++){
- if( shots[i] != NULL
- && ( shots[i]->boundingSphereRadius == 0.0f || Game::cam.sphereInFrustum(shots[i]->pos, shots[i]->boundingSphereRadius) )
- ){
- shots[i]->render();
- }
- }
- }
-
-
-
- const char* Game::getModeName(int mode){
- // if(mode == GAME_MODE_TEST){
- // return "just testing";
- // }else
- if(mode == GAME_MODE_DEATHMATCH){
- return "deathmatch";
- }else if(mode == GAME_MODE_TEAM_DEATHMATCH){
- return "team deathmatch";
- // }else if(mode == GAME_MODE_SOLE_SURVIVOR){
- // return "sole survivor";
- // }else if(mode == GAME_MODE_TEAM_SURVIVOR){
- // return "team survivor";
- }else{
- return "<unknown game mode>";
- }
- }
-
- const char* Game::getTeamName(int team){
- if(team == GAME_TEAM_SPECTATORS){
- return "spectators";
- }else if(team == GAME_TEAM_PLAYERS){
- return "players";
- }else if(team == GAME_TEAM_RED){
- return "red";
- }else if(team == GAME_TEAM_BLUE){
- return "blue";
- }else{
- return "<unknown team>";
- }
- }
-
- const char* Game::getVehicleName(int vehicle){
- if(vehicle == GAME_VEHICLE_DRAGONFLY){
- return "dragonfly";
- }else if(vehicle == GAME_VEHICLE_ALLEYCAT){
- return "alleycat";
- // }else if(vehicle == GAME_VEHICLE_SLEDGEHAMMER){
- // return "sledgehammer";
- }else{
- return "<unknown vehicle>";
- }
- }
-
- const char* Game::getWeaponName(int weapon){
- if(weapon == GAME_WEAPON_NO_WEAPON){
- return "no weapon";
- }else if(weapon == GAME_WEAPON_LASER){
- return "laser";
- }else if(weapon == GAME_WEAPON_CHAINGUN){
- return "chaingun";
- }else if(weapon == GAME_WEAPON_RAILGUN){
-
- return "railgun";
- }else if(weapon == GAME_WEAPON_ROCKETLAUNCHER){
- return "rocketlauncher";
- }else if(weapon == GAME_WEAPON_PLASMAGUN){
- return "plasmagun";
- // }else if(weapon == GAME_WEAPON_GRENADELAUNCHER){
- // return "grenadelauncher";
-
- }else{
- return "<unknown weapon>";
- }
-
- }
-
- int Game::getVoiceMessageId(const char* string){
- if( streq("attack", string) ){
- return GAME_VOICE_MESSAGE_ATTACK;
- }else if( streq("defend", string) ){
- return GAME_VOICE_MESSAGE_DEFEND;
- }else if( streq("go", string) ){
- return GAME_VOICE_MESSAGE_GO;
- }else if( streq("fall_back", string) ){
- return GAME_VOICE_MESSAGE_FALL_BACK;
- }else if( streq("retreat", string) ){
- return GAME_VOICE_MESSAGE_RETREAT;
- }else if( streq("report_in", string) ){
- return GAME_VOICE_MESSAGE_REPORT_IN;
- }else if( streq("contact", string) ){
- return GAME_VOICE_MESSAGE_CONTACT;
- }else if( streq("under_fire", string) ){
- return GAME_VOICE_MESSAGE_UNDER_FIRE;
- }else if( streq("need_backup", string) ){
- return GAME_VOICE_MESSAGE_NEED_BACKUP;
- }else if( streq("fine", string) ){
- return GAME_VOICE_MESSAGE_FINE;
-
- }else if( streq("taunt", string) ){
- return GAME_VOICE_MESSAGE_TAUNT;
- }else if( streq("cheer", string) ){
- return GAME_VOICE_MESSAGE_CHEER;
- }else if( streq("sorry", string) ){
- return GAME_VOICE_MESSAGE_SORRY;
-
- }else if( streq("fun1", string) ){
- return GAME_VOICE_MESSAGE_FUN1;
- }else if( streq("fun2", string) ){
- return GAME_VOICE_MESSAGE_FUN2;
- }else if( streq("fun3", string) ){
- return GAME_VOICE_MESSAGE_FUN3;
- }else if( streq("fun4", string) ){
- return GAME_VOICE_MESSAGE_FUN4;
- }else if( streq("fun5", string) ){
- return GAME_VOICE_MESSAGE_FUN5;
- }else if( streq("fun6", string) ){
- return GAME_VOICE_MESSAGE_FUN6;
- }else if( streq("fun7", string) ){
- return GAME_VOICE_MESSAGE_FUN7;
- }else if( streq("fun8", string) ){
- return GAME_VOICE_MESSAGE_FUN8;
- }else if( streq("fun9", string) ){
- return GAME_VOICE_MESSAGE_FUN9;
- }else if( streq("fun10", string) ){
- return GAME_VOICE_MESSAGE_FUN10;
- }else{
- return -1;
- }
- }
-
- const char* Game::getVoiceMessageName(int id){
- if(id == GAME_VOICE_MESSAGE_ATTACK){
- return "attack";
- }else if(id == GAME_VOICE_MESSAGE_DEFEND){
- return "defend";
- }else if(id == GAME_VOICE_MESSAGE_GO){
- return "go";
- }else if(id == GAME_VOICE_MESSAGE_FALL_BACK){
- return "fall_back";
- }else if(id == GAME_VOICE_MESSAGE_RETREAT){
- return "retreat";
- }else if(id == GAME_VOICE_MESSAGE_REPORT_IN){
- return "report_in";
- }else if(id == GAME_VOICE_MESSAGE_CONTACT){
- return "contact";
- }else if(id == GAME_VOICE_MESSAGE_UNDER_FIRE){
- return "under_fire";
- }else if(id == GAME_VOICE_MESSAGE_NEED_BACKUP){
- return "need_backup";
- }else if(id == GAME_VOICE_MESSAGE_FINE){
- return "fine";
-
- }else if(id == GAME_VOICE_MESSAGE_TAUNT){
- return "taunt";
- }else if(id == GAME_VOICE_MESSAGE_CHEER){
- return "cheer";
- }else if(id == GAME_VOICE_MESSAGE_SORRY){
- return "sorry";
-
- }else if(id == GAME_VOICE_MESSAGE_FUN1){
- return "fun1";
- }else if(id == GAME_VOICE_MESSAGE_FUN2){
- return "fun2";
- }else if(id == GAME_VOICE_MESSAGE_FUN3){
- return "fun3";
- }else if(id == GAME_VOICE_MESSAGE_FUN4){
- return "fun4";
- }else if(id == GAME_VOICE_MESSAGE_FUN5){
- return "fun5";
- }else if(id == GAME_VOICE_MESSAGE_FUN6){
- return "fun6";
- }else if(id == GAME_VOICE_MESSAGE_FUN7){
- return "fun7";
- }else if(id == GAME_VOICE_MESSAGE_FUN8){
- return "fun8";
- }else if(id == GAME_VOICE_MESSAGE_FUN9){
- return "fun9";
- }else if(id == GAME_VOICE_MESSAGE_FUN10){
- return "fun10";
-
- }else{
- return "<unknown voice message>";
- }
-
- }
-
-