You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegames/twin4/twin4/twin4doc.h

196 lines
5.9 KiB

/***************************************************************************
// Twin4 - Four in a Row for TDE
-------------------
begin : March 2000
copyright : (C) 1995-2000 by Martin Heni
email : martin@heni-online.de
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#ifndef TWIN4DOC_H
#define TWIN4DOC_H
#include <kgame/kgame.h>
#include <kgame/kgameio.h>
#include <kgame/kgamepropertyarray.h>
#include "twin4player.h"
class Kwin4View;
class TQCanvasItem;
extern int global_debug;
// The user or color?
typedef enum e_Farbe {Niemand=-1,Gelb=0,Rot=1,Tip=3,Rand=4,GelbWin=8,RotWin=9} FARBE;
// The type of player
typedef enum {Men=0,Computer=1,Remote=2} PLAYER;
typedef enum {TSum,TWin,TRemis,TLost,TBrk} TABLE;
typedef enum {GIllMove=-2,GNotAllowed=-1,GNormal=0,GYellowWin=1,GRedWin=2,GRemis=3,GTip=4} MOVESTATUS;
#define NOOFPLAYER 2
#define FIELD_SIZE_X 7
#define FIELD_SIZE_Y 6
#define FIELD_SPACING 40
/**
* The board "engine"
*/
class Kwin4Doc : public KGame
{
Q_OBJECT
public:
Kwin4Doc(TQWidget *parent, const char *name=0);
~Kwin4Doc();
/** adds a view to the document which represents the document contents. Usually this is your main view. */
void setView(Kwin4View *view);
/** initializes the players */
void initPlayers();
/** saves the document under filename and format.*/
bool loadgame(TQDataStream &stream, bool network, bool reset);
int QueryLastHint();
int QueryHeight(int x);
void SetScore(long i);
void ResetStat();
int CheckGameOver(int x, FARBE col);
FARBE QueryPlayerColour(int player);
int QueryStat(FARBE i, TABLE mode);
TQString QueryName(FARBE i);
void SetName(FARBE i, const TQString &n);
/**
* Set and query the IO mode of player Gelb/Rot
*/
KGameIO::IOMode playedBy(int col);
void setPlayedBy(int col,KGameIO::IOMode mode);
/**
* create and add an IO device to an given player.
* The old ones have to be removed manually before
*/
void createIO(KPlayer *player,KGameIO::IOMode io);
Kwin4Player *getPlayer(FARBE col);
bool RedoMove();
bool UndoMove();
/** Make a game move */
MOVESTATUS MakeMove(int x,int mode);
/** End a game */
void EndGame(TABLE mode);
/** Reset the whole game */
void ResetGame(bool initview);
/** Set the colour */
void SetColour(int x,int y,FARBE c);
/** Returns colour */
FARBE QueryColour(int x,int y);
void ReadConfig(TDEConfig *config);
void WriteConfig(TDEConfig *config);
FARBE QueryCurrentPlayer();
void SetCurrentPlayer(FARBE i);
FARBE SwitchStartPlayer();
int QueryLastcolumn(); // last x moved
FARBE QueryLastcolour(); // last colour moved
int QueryCurrentMove(); // 0..42
void SetCurrentMove(int ); // 0..42
int QueryMaxMove(); // 0..42
int QueryHistoryCnt(); // 0..42
TQString QueryProcessName();
KPlayer *createPlayer(int rtti, int io, bool isvirtual);
KPlayer * nextPlayer(KPlayer *last, bool exclusive=true);
void newPlayersJoin(KGamePlayerList *,KGamePlayerList *,TQValueList<int> &);
protected:
bool Move(int x,int id);
/** Check whether the field has a game over situation */
int checkGameOver(KPlayer *);
/** Send to the computer player */
void prepareGameMessage(TQDataStream &stream, TQ_INT32 pl);
/** Main function to do player input */
bool playerInput(TQDataStream &msg,KPlayer *player);
/** Set the IO devices new */
void recalcIO();
/** Set the turn of the current player to true */
void preparePlayerTurn();
public slots:
void calcHint();
void slotPropertyChanged(KGamePropertyBase *,KGame *);
void slotPlayerPropertyChanged(KGamePropertyBase *,KPlayer *);
void moveDone(TQCanvasItem *,int);
void slotMessageUpdate(int,TQ_UINT32,TQ_UINT32);
void slotPrepareTurn(TQDataStream &stream,bool b,KGameIO *input,bool *eatevent);
void slotClientConnected(TQ_UINT32,KGame *);
void slotProcessQuery(TQDataStream &,KGameProcessIO *);
void slotProcessHint(TQDataStream &,KGameProcessIO *);
void slotGameOver(int status, KPlayer * p, KGame * me);
void slotRepeatMove();
void loadSettings();
signals:
/**
* emmitted if the game status changes to run
*/
void signalGameRun();
/**
* Emmitted if the chat origin changes
*/
void signalChatChanged(Kwin4Player *);
/**
* emmitted after a sprite move ends
**/
void signalMoveDone(int,int);
void signalNextPlayer();
/**
* emmitted if the game ends
**/
void GameOver(int,KPlayer *,KGame *);
private:
Kwin4View *pView;
KGamePropertyInt mLastColumn; // last x moved
KGamePropertyInt mLastColour; // last colour moved
KGamePropertyInt mHistoryCnt;
KGamePropertyArray<int> mField; // 42 pieces
Kwin4Player *yellowPlayer;
KGamePropertyInt mStartPlayer; // Player started game
KGamePropertyInt mAmzug; // Player's to move
KGamePropertyInt mMaxMove; // maximal move made in a game before undo
KGamePropertyInt mCurrentMove; // current move in the game
KGamePropertyArray<int> mFieldFilled; // to what height is the column filled
KGamePropertyInt mLastHint;
KGamePropertyInt mScore; // Computer score
KGamePropertyArray<int> mHistory; // to what height is the column filled
KGameIO::IOMode mPlayedBy[NOOFPLAYER];
KGameProcessIO *mHintProcess;
};
#endif // TWIN4DOC_H