183 lines
4.5 KiB
C++
183 lines
4.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.
|
|
*/
|
|
|
|
#ifndef __PLAYER_H__
|
|
#define __PLAYER_H__
|
|
|
|
#include <SDL.h>
|
|
#include "FrameSeq.h"
|
|
#include <string>
|
|
#include "Theme.h"
|
|
#include "globals.h"
|
|
|
|
#define RESET_WALK_SEQUENCE (100000)
|
|
|
|
class Team;
|
|
class ControlsArray;
|
|
|
|
#define NUM_TYPES (5)
|
|
typedef enum {
|
|
PL_TYPE_MALE_LEFT = 1,
|
|
PL_TYPE_FEMALE_LEFT,
|
|
PL_TYPE_MALE_RIGHT,
|
|
PL_TYPE_FEMALE_RIGHT
|
|
|
|
} pl_type_t;
|
|
|
|
#define NUM_STATES (3)
|
|
typedef enum {
|
|
PL_STATE_STILL = 0,
|
|
PL_STATE_WALK,
|
|
PL_STATE_JUMP
|
|
} pl_state_t;
|
|
|
|
typedef enum {
|
|
PL_CTRL_HUMAN,
|
|
PL_CTRL_AI,
|
|
PL_CTRL_REMOTE
|
|
} pl_ctrl_t;
|
|
|
|
class Player {
|
|
protected:
|
|
FrameSeq * _frames;
|
|
std::string _name;
|
|
pl_type_t _type;
|
|
pl_state_t _state;
|
|
int _frameIdx;
|
|
int _speed;
|
|
int _x, _y;
|
|
int _speedX; // actual x speed
|
|
float _speedY;
|
|
int _plId;
|
|
int _oif;
|
|
int _currStateFrameDelay, _currFrameB, _currFrameE;
|
|
Team *_team;
|
|
int _overallPassed;
|
|
float _displx, _disply;
|
|
|
|
char *_fileNames[NUM_TYPES];
|
|
|
|
public:
|
|
Player() {};
|
|
Player(Team *team, std::string name, pl_type_t type, int idx, int speed) {
|
|
init(team, name, type, idx, speed);
|
|
}
|
|
void init(Team *team, std::string name, pl_type_t type, int idx, int speed) {
|
|
|
|
_fileNames[PL_TYPE_MALE_LEFT] =
|
|
(char *)malloc(sizeof(char)*(MAXPATHLENGTH+1));
|
|
strncpy(_fileNames[PL_TYPE_MALE_LEFT],
|
|
CurrentTheme->leftmale(), MAXPATHLENGTH);
|
|
|
|
_fileNames[PL_TYPE_MALE_RIGHT] =
|
|
(char *)malloc(sizeof(char)*(MAXPATHLENGTH+1));
|
|
strncpy(_fileNames[PL_TYPE_MALE_RIGHT],
|
|
CurrentTheme->rightmale(), MAXPATHLENGTH);
|
|
|
|
_fileNames[PL_TYPE_FEMALE_LEFT] =
|
|
(char *)malloc(sizeof(char)*(MAXPATHLENGTH+1));
|
|
strncpy(_fileNames[PL_TYPE_FEMALE_LEFT],
|
|
CurrentTheme->leftfemale(), MAXPATHLENGTH);
|
|
|
|
_fileNames[PL_TYPE_FEMALE_RIGHT] =
|
|
(char *)malloc(sizeof(char)*(MAXPATHLENGTH+1));
|
|
strncpy(_fileNames[PL_TYPE_FEMALE_RIGHT],
|
|
CurrentTheme->rightfemale(), MAXPATHLENGTH);
|
|
|
|
_team = team;
|
|
_name = name;
|
|
_plId = idx;
|
|
_oif = -1;
|
|
_type = type;
|
|
_state = PL_STATE_STILL;
|
|
_frameIdx = configuration.playerFrameConf.playerStillB - 1;
|
|
_speed = speed;
|
|
_speedX = 0;
|
|
_speedY = 0.0;
|
|
_overallPassed = 0;
|
|
_displx = _disply = 0.0;
|
|
Player::loadFrames();
|
|
_y = GROUND_LEVEL();
|
|
}
|
|
|
|
virtual ~Player() {
|
|
free(_fileNames[PL_TYPE_MALE_LEFT]);
|
|
free(_fileNames[PL_TYPE_MALE_RIGHT]);
|
|
free(_fileNames[PL_TYPE_FEMALE_LEFT]);
|
|
free(_fileNames[PL_TYPE_FEMALE_RIGHT]);
|
|
delete(_frames);
|
|
}
|
|
|
|
inline int GROUND_LEVEL() { return(configuration.FLOOR_ORD -_frames->height());} // (346)
|
|
|
|
inline std::string name() {return _name;}
|
|
|
|
inline int id() { return _plId; }
|
|
inline int orderInField() { return _oif; }
|
|
inline void setOIF(int oif) { _oif = oif; }
|
|
|
|
inline pl_type_t type() {return _type;}
|
|
|
|
inline pl_state_t state() {return _state;}
|
|
bool setState(pl_state_t s, bool force = false);
|
|
|
|
inline int speed() {return _speed;}
|
|
inline void setSpeed(int s) {_speed = s;}
|
|
|
|
inline float speedY() {return _speedY;}
|
|
inline void setSpeedY(float s) {_speedY = s;}
|
|
|
|
int speedX();
|
|
inline int x() {return _x;}
|
|
inline void setX(int x) {_x = x;}
|
|
|
|
inline int y() {return _y;}
|
|
inline void setY(int y) {_y = y;}
|
|
inline Team *team() {return(_team);}
|
|
|
|
void loadFrames() {
|
|
_frames = new LogicalFrameSeq(_fileNames[_type],
|
|
configuration.playerFrameConf.nPlayerFrames);
|
|
}
|
|
|
|
void updateFrame(int ticks, bool changed);
|
|
void updateClient(int ticks, pl_state_t state);
|
|
|
|
void update(int ticks, ControlsArray *ca);
|
|
void draw(SDL_Surface * screen);
|
|
|
|
inline int width() { return _frames->width(); }
|
|
inline int height() { return _frames->height(); }
|
|
|
|
int minX();
|
|
int maxX();
|
|
int minY();
|
|
|
|
|
|
bool collidesWith(FrameSeq *fs, int idx, SDL_Rect *rect);
|
|
|
|
virtual pl_ctrl_t getCtrl() { return PL_CTRL_HUMAN; };
|
|
|
|
};
|
|
|
|
#endif
|