261 lines
6.5 KiB
C++
261 lines
6.5 KiB
C++
/* -*- C++ -*- */
|
|
/*
|
|
GAV - Gpl Arcade Volleyball
|
|
|
|
Copyright (C) 2002
|
|
GAV team (http://sourceforge.net/projects/gav/)
|
|
|
|
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
#include <SDL.h>
|
|
#include "StatePlaying.h"
|
|
#include "Automa.h"
|
|
#include "AutomaMainLoop.h"
|
|
#ifndef NONET
|
|
#include "NetServer.h"
|
|
#endif
|
|
#include "StateWithInput.h"
|
|
|
|
using namespace std;
|
|
|
|
|
|
int StatePlaying::setupConnection(InputState *is) {
|
|
#ifndef NONET
|
|
std::string clinumb = "";
|
|
int nclients = 0;
|
|
signed char ch;
|
|
|
|
//nets = new NetServer();
|
|
/* first, delete the screen... */
|
|
SDL_Rect r;
|
|
r.x = r.y = 0;
|
|
r.h = background->height();
|
|
r.w = background->width();
|
|
//SDL_BlitSurface(background, &r, screen, &r);
|
|
background->blit(0, screen, &r);
|
|
SDL_Flip(screen);
|
|
/* now, ask for the port to listen on */
|
|
char msg[100];
|
|
string ports = "";
|
|
int port;
|
|
sprintf(msg, "What port to listen on? [%d]", SERVER_PORT);
|
|
cga->printRow(screen, 0, msg);
|
|
SDL_Flip(screen);
|
|
while ( (ch = getKeyPressed(is)) != SDLK_RETURN ) {
|
|
if ( ch == SDLK_BACKSPACE ) {
|
|
ports = deleteOneChar(ports); // should be backspace...
|
|
cga->printRow(screen, 1, " ", background);
|
|
} else {
|
|
char w[2];
|
|
w[0] = (char)ch;
|
|
w[1] = 0;
|
|
ports = ports + w;
|
|
}
|
|
cga->printRow(screen, 1, ports.c_str(), background);
|
|
SDL_Flip(screen);
|
|
}
|
|
port = atoi(ports.c_str());
|
|
if ( !port )
|
|
port = SERVER_PORT;
|
|
|
|
cga->printRow(screen, 2, "How many clients to wait? [1]");
|
|
SDL_Flip(screen);
|
|
while ( (ch = getKeyPressed(is)) != SDLK_RETURN ) {
|
|
if ( ch == SDLK_BACKSPACE ) {
|
|
clinumb = deleteOneChar(clinumb); // should be backspace...
|
|
cga->printRow(screen, 3, " ", background);
|
|
} else {
|
|
char w[2];
|
|
w[0] = (char)ch;
|
|
w[1] = 0;
|
|
clinumb = clinumb + w;
|
|
}
|
|
cga->printRow(screen, 3, clinumb.c_str(), background);
|
|
SDL_Flip(screen);
|
|
}
|
|
nclients = atoi(clinumb.c_str());
|
|
if ( !nclients )
|
|
nclients = 1;
|
|
|
|
nets->StartServer(port);
|
|
cga->printRow(screen, 4, "Server OK. Waiting for clients...",
|
|
background);
|
|
|
|
SDL_Flip(screen);
|
|
int remaining = nclients;
|
|
do {
|
|
remaining = nets->WaitClients(is, remaining);
|
|
char msg[100];
|
|
sprintf(msg, " %d connection(s) to go ", remaining);
|
|
cga->printRow(screen, 5, msg, background);
|
|
SDL_Flip(screen);
|
|
} while ( remaining > 0 );
|
|
return remaining;
|
|
#else //!NONET
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
// executes one step of the game's main loop
|
|
// Returns NO_TRANSITION if the game continues, the next state otherwise
|
|
int StatePlaying::execute(InputState *is, unsigned int ticks,
|
|
unsigned int prevTicks, int firstTime)
|
|
{
|
|
if ( firstTime ) {
|
|
#ifndef NONET
|
|
if ( nets ) {
|
|
if (setupConnection(is) < 0) {
|
|
delete(nets);
|
|
nets = NULL;
|
|
return(STATE_MENU);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#ifdef AUDIO
|
|
soundMgr->stopSound(SND_BACKGROUND_MENU);
|
|
soundMgr->playSound(SND_BACKGROUND_PLAYING, true);
|
|
#endif
|
|
|
|
/*
|
|
First time we change to execute state: we should
|
|
probably create players here instead of in the constructor,
|
|
and think of a clever way to destroy them once we're done.
|
|
*/
|
|
|
|
prevDrawn = ticks;
|
|
tl = new Team(-1);
|
|
tr = new Team(1);
|
|
b = new Ball(BALL_ORIG);
|
|
|
|
for ( int i = 0, j = 0; i < configuration.left_nplayers; j++ ) {
|
|
if ( configuration.left_players[j] == PLAYER_NONE ) {
|
|
continue;
|
|
}
|
|
|
|
string name = "Pippo-" + j;
|
|
if ( configuration.left_players[j] == PLAYER_HUMAN ) {
|
|
tl->addPlayerHuman(name.c_str(), PL_TYPE_MALE_LEFT);
|
|
} else {
|
|
#ifndef NONET
|
|
if (!nets || !(nets->isRemote(j*2)))
|
|
#endif
|
|
tl->addPlayerAI(name.c_str(), PL_TYPE_MALE_LEFT, b);
|
|
#ifndef NONET
|
|
else
|
|
tl->addPlayerRemote(name.c_str(), PL_TYPE_MALE_LEFT);
|
|
#endif
|
|
}
|
|
|
|
i++;
|
|
}
|
|
|
|
for ( int i = 0, j = 0; i < configuration.right_nplayers; j++ ) {
|
|
if ( configuration.right_players[j] == PLAYER_NONE ) {
|
|
continue;
|
|
}
|
|
string name = "Pluto-" + j;
|
|
if ( configuration.right_players[j] == PLAYER_HUMAN ) {
|
|
tr->addPlayerHuman(name.c_str(), PL_TYPE_MALE_RIGHT);
|
|
} else {
|
|
#ifndef NONET
|
|
if (!nets || !(nets->isRemote(j*2+1)))
|
|
#endif
|
|
tr->addPlayerAI(name.c_str(), PL_TYPE_MALE_RIGHT, b);
|
|
#ifndef NONET
|
|
else
|
|
tr->addPlayerRemote(name.c_str(), PL_TYPE_MALE_RIGHT);
|
|
#endif
|
|
}
|
|
|
|
i++;
|
|
}
|
|
|
|
tl->setScore(0);
|
|
tr->setScore(0);
|
|
b->resetPos((int) (configuration.SCREEN_WIDTH * 0.25),
|
|
(int) (configuration.SCREEN_HEIGHT * 0.66));
|
|
}
|
|
|
|
controlsArray->setControlsState(is, tl, tr);
|
|
|
|
if ( is->getKeyState()[SDLK_ESCAPE] ) {
|
|
delete(tl);
|
|
delete(tr);
|
|
delete(b);
|
|
#ifndef NONET
|
|
if ( nets ) {
|
|
delete(nets);
|
|
nets = NULL;
|
|
}
|
|
#endif
|
|
#ifdef AUDIO
|
|
soundMgr->stopSound(SND_BACKGROUND_PLAYING);
|
|
#endif
|
|
return(STATE_MENU);
|
|
}
|
|
|
|
tl->update(ticks - prevTicks, controlsArray);
|
|
tr->update(ticks - prevTicks, controlsArray);
|
|
|
|
b->update(ticks - prevTicks, tl, tr);
|
|
|
|
if ( (ticks - prevDrawn) >
|
|
(unsigned int) (FPS - (FPS / (configuration.frame_skip + 1)) ) ) {
|
|
SDL_Rect r;
|
|
r.x = r.y = 0;
|
|
r.h = background->height();
|
|
r.w = background->width();
|
|
//SDL_BlitSurface(background, &r, screen, &r);
|
|
background->blit(0, screen, &r);
|
|
|
|
tl->draw();
|
|
tr->draw();
|
|
b->draw();
|
|
#ifndef NONET
|
|
if (nets)
|
|
nets->SendSnapshot(tl, tr, b);
|
|
#endif
|
|
SDL_Flip(screen);
|
|
prevDrawn = ticks;
|
|
}
|
|
|
|
if ( ((tl->getScore() >= configuration.winning_score) &&
|
|
(tl->getScore() > (tr->getScore()+1))) ||
|
|
((tr->getScore() >= configuration.winning_score) &&
|
|
(tr->getScore() > (tl->getScore()+1))) ) {
|
|
#ifdef AUDIO
|
|
soundMgr->playSound(SND_VICTORY);
|
|
#endif // AUDIO
|
|
/* Deallocate teams, ball and players */
|
|
delete(tl);
|
|
delete(tr);
|
|
delete(b);
|
|
#ifndef NONET
|
|
if ( nets ) {
|
|
delete(nets);
|
|
nets = NULL;
|
|
}
|
|
#endif
|
|
#ifdef AUDIO
|
|
soundMgr->stopSound(SND_BACKGROUND_PLAYING);
|
|
#endif
|
|
return(STATE_MENU); // end of game
|
|
}
|
|
|
|
return(NO_TRANSITION);
|
|
}
|