git repos / blockattack-game

blame: source/code/BlockGame.hpp

normal view · raw

89c4a3a6 sago007 2008-08-29 14:32 1
/*
89c4a3a6 sago007 2008-08-29 14:32 2
 * BlockGame.hpp (this was cut from main.cpp for the overview)
89c4a3a6 sago007 2008-08-29 14:32 3
 * Copyright (C) 2005 Poul Sander
89c4a3a6 sago007 2008-08-29 14:32 4
 *
89c4a3a6 sago007 2008-08-29 14:32 5
 * This program is free software; you can redistribute it and/or modify
89c4a3a6 sago007 2008-08-29 14:32 6
 * it under the terms of the GNU General Public License as published by
89c4a3a6 sago007 2008-08-29 14:32 7
 * the Free Software Foundation; either version 2 of the License, or
89c4a3a6 sago007 2008-08-29 14:32 8
 * (at your option) any later version.
89c4a3a6 sago007 2008-08-29 14:32 9
 *
89c4a3a6 sago007 2008-08-29 14:32 10
 * This program is distributed in the hope that it will be useful,
89c4a3a6 sago007 2008-08-29 14:32 11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
89c4a3a6 sago007 2008-08-29 14:32 12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
89c4a3a6 sago007 2008-08-29 14:32 13
 * GNU General Public License for more details.
89c4a3a6 sago007 2008-08-29 14:32 14
 *
89c4a3a6 sago007 2008-08-29 14:32 15
 * You should have received a copy of the GNU General Public License
89c4a3a6 sago007 2008-08-29 14:32 16
 * along with this program; if not, write to the Free Software
89c4a3a6 sago007 2008-08-29 14:32 17
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
89c4a3a6 sago007 2008-08-29 14:32 18
 *
89c4a3a6 sago007 2008-08-29 14:32 19
 * Poul Sander
89c4a3a6 sago007 2008-08-29 14:32 20
 * R�veh�jvej 36, V. 1111
89c4a3a6 sago007 2008-08-29 14:32 21
 * 2800 Kgs. Lyngby
89c4a3a6 sago007 2008-08-29 14:32 22
 * DENMARK
89c4a3a6 sago007 2008-08-29 14:32 23
 * blockattack@poulsander.com
89c4a3a6 sago007 2008-08-29 14:32 24
 */
89c4a3a6 sago007 2008-08-29 14:32 25
32c9b349 sago007 2008-11-20 18:14 26
#include "stats.h"
32c9b349 sago007 2008-11-20 18:14 27
#include "common.h"
6d48320c sago007 2009-03-28 17:06 28
#include "mainVars.hpp"
32c9b349 sago007 2008-11-20 18:14 29
32c9b349 sago007 2008-11-20 18:14 30
89c4a3a6 sago007 2008-08-29 14:32 31
////////////////////////////////////////////////////////////////////////////////
89c4a3a6 sago007 2008-08-29 14:32 32
//The BloackGame class represents a board, score, time etc. for a single player/
89c4a3a6 sago007 2008-08-29 14:32 33
////////////////////////////////////////////////////////////////////////////////
89c4a3a6 sago007 2008-08-29 14:32 34
class BlockGame {
89c4a3a6 sago007 2008-08-29 14:32 35
private:
89c4a3a6 sago007 2008-08-29 14:32 36
    int prevTowerHeight;
89c4a3a6 sago007 2008-08-29 14:32 37
    bool bGarbageFallLeft;
89c4a3a6 sago007 2008-08-29 14:32 38
89c4a3a6 sago007 2008-08-29 14:32 39
    bool bDraw;
89c4a3a6 sago007 2008-08-29 14:32 40
    bool bReplaying; //true if we are watching a replay
2f30c381 sago007 2008-09-14 13:08 41
    #if NETWORK
89c4a3a6 sago007 2008-08-29 14:32 42
    bool bNetworkPlayer; //must recieve packages from the net
89c4a3a6 sago007 2008-08-29 14:32 43
    bool bDisconnected; //The player has disconnected
2f30c381 sago007 2008-09-14 13:08 44
    #endif
89c4a3a6 sago007 2008-08-29 14:32 45
    Uint32 nextGarbageNumber;
89c4a3a6 sago007 2008-08-29 14:32 46
    Uint32 pushedPixelAt;
89c4a3a6 sago007 2008-08-29 14:32 47
    Uint32 nrPushedPixel, nrFellDown, nrStops;
89c4a3a6 sago007 2008-08-29 14:32 48
    bool garbageToBeCleared[7][30];
89c4a3a6 sago007 2008-08-29 14:32 49
    Uint32 lastAImove;
89c4a3a6 sago007 2008-08-29 14:32 50
89c4a3a6 sago007 2008-08-29 14:32 51
    Sint16 AI_LineOffset; //how many lines have changed since command
89c4a3a6 sago007 2008-08-29 14:32 52
    string strHolder;
89c4a3a6 sago007 2008-08-29 14:32 53
    Uint32 hangTicks;    //How many times have hang been decreased?
89c4a3a6 sago007 2008-08-29 14:32 54
    //int the two following index 0 may NOT be used (what the fuck did I meen?)
89c4a3a6 sago007 2008-08-29 14:32 55
    Uint8 chainSize[NUMBEROFCHAINS]; //Contains the chains
89c4a3a6 sago007 2008-08-29 14:32 56
    bool chainUsed[NUMBEROFCHAINS];   //True if the chain is used
89c4a3a6 sago007 2008-08-29 14:32 57
89c4a3a6 sago007 2008-08-29 14:32 58
    Uint32 nextRandomNumber;
89c4a3a6 sago007 2008-08-29 14:32 59
89c4a3a6 sago007 2008-08-29 14:32 60
    Uint16 rand2() {
89c4a3a6 sago007 2008-08-29 14:32 61
        nextRandomNumber = nextRandomNumber*1103515245 + 12345;
89c4a3a6 sago007 2008-08-29 14:32 62
        return ((Uint16)(nextRandomNumber/65536)) % 32768;
89c4a3a6 sago007 2008-08-29 14:32 63
    }
89c4a3a6 sago007 2008-08-29 14:32 64
89c4a3a6 sago007 2008-08-29 14:32 65
    int firstUnusedChain() {
89c4a3a6 sago007 2008-08-29 14:32 66
        bool found=false;
89c4a3a6 sago007 2008-08-29 14:32 67
        int i = 0;
89c4a3a6 sago007 2008-08-29 14:32 68
        while (!found) {
89c4a3a6 sago007 2008-08-29 14:32 69
            if (!chainUsed[++i])
89c4a3a6 sago007 2008-08-29 14:32 70
                found=true;
89c4a3a6 sago007 2008-08-29 14:32 71
            if (i>NUMBEROFCHAINS-2)
89c4a3a6 sago007 2008-08-29 14:32 72
                found=true;
89c4a3a6 sago007 2008-08-29 14:32 73
        }
89c4a3a6 sago007 2008-08-29 14:32 74
        return i;
89c4a3a6 sago007 2008-08-29 14:32 75
    }
89c4a3a6 sago007 2008-08-29 14:32 76
89c4a3a6 sago007 2008-08-29 14:32 77
public:
89c4a3a6 sago007 2008-08-29 14:32 78
    char name[30];
89c4a3a6 sago007 2008-08-29 14:32 79
    Uint32 gameStartedAt;
89c4a3a6 sago007 2008-08-29 14:32 80
    Uint32 gameEndedAfter;		//How long did the game last?
89c4a3a6 sago007 2008-08-29 14:32 81
    int linesCleared;
2e57d791 sago007 2009-06-04 17:48 82
    #if WITH_SDL
89c4a3a6 sago007 2008-08-29 14:32 83
    SDL_Surface* sBoard;
2e57d791 sago007 2009-06-04 17:48 84
    #endif
89c4a3a6 sago007 2008-08-29 14:32 85
    int TowerHeight;
89c4a3a6 sago007 2008-08-29 14:32 86
    BlockGame *garbageTarget;
89c4a3a6 sago007 2008-08-29 14:32 87
    Sint32 board[7][30];
89c4a3a6 sago007 2008-08-29 14:32 88
    int stop;
89c4a3a6 sago007 2008-08-29 14:32 89
    int speedLevel;
89c4a3a6 sago007 2008-08-29 14:32 90
    int pixels;
89c4a3a6 sago007 2008-08-29 14:32 91
    int MovesLeft;
89c4a3a6 sago007 2008-08-29 14:32 92
    bool timetrial, stageClear, vsMode, puzzleMode;
89c4a3a6 sago007 2008-08-29 14:32 93
    int Level; //Only used in stageClear and puzzle (not implemented)
89c4a3a6 sago007 2008-08-29 14:32 94
    int stageClearLimit; //stores number of lines user must clear to win
89c4a3a6 sago007 2008-08-29 14:32 95
    int topx, topy;
89c4a3a6 sago007 2008-08-29 14:32 96
    int combo;
89c4a3a6 sago007 2008-08-29 14:32 97
    int chain;
89c4a3a6 sago007 2008-08-29 14:32 98
    int cursorx; //stores cursor position
89c4a3a6 sago007 2008-08-29 14:32 99
    int cursory; // -||-
89c4a3a6 sago007 2008-08-29 14:32 100
    double speed, baseSpeed; //factor for speed. Lower value = faster gameplay
89c4a3a6 sago007 2008-08-29 14:32 101
    Uint32 score;
89c4a3a6 sago007 2008-08-29 14:32 102
    bool bGameOver;
89c4a3a6 sago007 2008-08-29 14:32 103
    bool hasWonTheGame;
89c4a3a6 sago007 2008-08-29 14:32 104
    int AI_MoveSpeed;   //How often will the computer move? milliseconds
89c4a3a6 sago007 2008-08-29 14:32 105
    bool AI_Enabled;
89c4a3a6 sago007 2008-08-29 14:32 106
    Replay theReplay;   //Stores the replay
89c4a3a6 sago007 2008-08-29 14:32 107
89c4a3a6 sago007 2008-08-29 14:32 108
    Uint32 handicap;
89c4a3a6 sago007 2008-08-29 14:32 109
89c4a3a6 sago007 2008-08-29 14:32 110
    //Constructor
89c4a3a6 sago007 2008-08-29 14:32 111
    BlockGame(int tx, int ty) {
2e57d791 sago007 2009-06-04 17:48 112
        #if WITH_SDL
89c4a3a6 sago007 2008-08-29 14:32 113
        tmp = IMG_Load2((char*)"gfx/BackBoard.png");
89c4a3a6 sago007 2008-08-29 14:32 114
        sBoard = SDL_DisplayFormat(tmp);
89c4a3a6 sago007 2008-08-29 14:32 115
        SDL_FreeSurface(tmp);
2e57d791 sago007 2009-06-04 17:48 116
        #endif
89c4a3a6 sago007 2008-08-29 14:32 117
        srand((int)time(NULL));
89c4a3a6 sago007 2008-08-29 14:32 118
        nrFellDown = 0;
89c4a3a6 sago007 2008-08-29 14:32 119
        nrPushedPixel = 0;
89c4a3a6 sago007 2008-08-29 14:32 120
        garbageTarget = this;
89c4a3a6 sago007 2008-08-29 14:32 121
        nrStops=0;
89c4a3a6 sago007 2008-08-29 14:32 122
        topx = tx;
89c4a3a6 sago007 2008-08-29 14:32 123
        topy = ty;
89c4a3a6 sago007 2008-08-29 14:32 124
        cursorx = 2;
89c4a3a6 sago007 2008-08-29 14:32 125
        cursory = 3;
89c4a3a6 sago007 2008-08-29 14:32 126
        stop = 0;
89c4a3a6 sago007 2008-08-29 14:32 127
        pixels = 0;
89c4a3a6 sago007 2008-08-29 14:32 128
        score = 0;
89c4a3a6 sago007 2008-08-29 14:32 129
        bGameOver = false;
89c4a3a6 sago007 2008-08-29 14:32 130
        bDraw = false;
89c4a3a6 sago007 2008-08-29 14:32 131
        bReplaying=false; //No replay by default
2f30c381 sago007 2008-09-14 13:08 132
        #if NETWORK
89c4a3a6 sago007 2008-08-29 14:32 133
        bDisconnected=false;
89c4a3a6 sago007 2008-08-29 14:32 134
        bNetworkPlayer = false;
2f30c381 sago007 2008-09-14 13:08 135
        #endif
89c4a3a6 sago007 2008-08-29 14:32 136
        timetrial = false;
89c4a3a6 sago007 2008-08-29 14:32 137
        stageClear = false;
89c4a3a6 sago007 2008-08-29 14:32 138
        vsMode = false;
89c4a3a6 sago007 2008-08-29 14:32 139
        puzzleMode = false;
89c4a3a6 sago007 2008-08-29 14:32 140
        linesCleared = 0;
89c4a3a6 sago007 2008-08-29 14:32 141
        AI_Enabled = false;
89c4a3a6 sago007 2008-08-29 14:32 142
        AI_MoveSpeed=100;
89c4a3a6 sago007 2008-08-29 14:32 143
        hasWonTheGame = false;
89c4a3a6 sago007 2008-08-29 14:32 144
        combo=0;                      //counts
89c4a3a6 sago007 2008-08-29 14:32 145
        chain=0;
89c4a3a6 sago007 2008-08-29 14:32 146
        hangTicks = 0;
89c4a3a6 sago007 2008-08-29 14:32 147
        baseSpeed = 0.5;           //All other speeds are relative to this
89c4a3a6 sago007 2008-08-29 14:32 148
        speed = baseSpeed;
89c4a3a6 sago007 2008-08-29 14:32 149
        speedLevel = 1;
89c4a3a6 sago007 2008-08-29 14:32 150
        gameStartedAt = SDL_GetTicks();
89c4a3a6 sago007 2008-08-29 14:32 151
        gameEndedAfter = 0;
89c4a3a6 sago007 2008-08-29 14:32 152
        pushedPixelAt = gameStartedAt;
89c4a3a6 sago007 2008-08-29 14:32 153
        nextGarbageNumber = 10;
89c4a3a6 sago007 2008-08-29 14:32 154
        handicap=0;
89c4a3a6 sago007 2008-08-29 14:32 155
        for (int i=0;i<7;i++)
89c4a3a6 sago007 2008-08-29 14:32 156
            for (int j=0;j<30;j++) {
89c4a3a6 sago007 2008-08-29 14:32 157
                board[i][j] = -1;
89c4a3a6 sago007 2008-08-29 14:32 158
            }
89c4a3a6 sago007 2008-08-29 14:32 159
        for (int i=0;i<NUMBEROFCHAINS;i++) {
89c4a3a6 sago007 2008-08-29 14:32 160
            chainUsed[i]=false;
89c4a3a6 sago007 2008-08-29 14:32 161
            chainSize[i] = 0;
89c4a3a6 sago007 2008-08-29 14:32 162
        }
89c4a3a6 sago007 2008-08-29 14:32 163
        theReplay = Replay();
89c4a3a6 sago007 2008-08-29 14:32 164
        showGame = true;              //The game is now active
2de0b212 sago007 2009-03-06 21:51 165
        lastCounter = -1;           //To prevent the final chunk to be played when stating the program
89c4a3a6 sago007 2008-08-29 14:32 166
    }	//Constructor
89c4a3a6 sago007 2008-08-29 14:32 167
89c4a3a6 sago007 2008-08-29 14:32 168
    //Deconstructor, never really used... game used to crash when called, cause of the way sBoard was created
89c4a3a6 sago007 2008-08-29 14:32 169
    //It should work now and can be used if we want to assign more players in network games that we need to free later
89c4a3a6 sago007 2008-08-29 14:32 170
    ~BlockGame() {
2e57d791 sago007 2009-06-04 17:48 171
        #if WITH_SDL
89c4a3a6 sago007 2008-08-29 14:32 172
        SDL_FreeSurface(sBoard);
2e57d791 sago007 2009-06-04 17:48 173
        #endif
89c4a3a6 sago007 2008-08-29 14:32 174
    }
89c4a3a6 sago007 2008-08-29 14:32 175
89c4a3a6 sago007 2008-08-29 14:32 176
    void setGameSpeed(Uint8 globalSpeedLevel) {
89c4a3a6 sago007 2008-08-29 14:32 177
        switch (globalSpeedLevel) {
89c4a3a6 sago007 2008-08-29 14:32 178
        case 0:
89c4a3a6 sago007 2008-08-29 14:32 179
            baseSpeed=0.5;
89c4a3a6 sago007 2008-08-29 14:32 180
            break;
89c4a3a6 sago007 2008-08-29 14:32 181
        case 1:
89c4a3a6 sago007 2008-08-29 14:32 182
            baseSpeed=0.4;
89c4a3a6 sago007 2008-08-29 14:32 183
            break;
89c4a3a6 sago007 2008-08-29 14:32 184
        case 2:
89c4a3a6 sago007 2008-08-29 14:32 185
            baseSpeed=0.3;
89c4a3a6 sago007 2008-08-29 14:32 186
            break;
89c4a3a6 sago007 2008-08-29 14:32 187
        case 3:
89c4a3a6 sago007 2008-08-29 14:32 188
            baseSpeed=0.25;
89c4a3a6 sago007 2008-08-29 14:32 189
            break;
89c4a3a6 sago007 2008-08-29 14:32 190
        case 4:
89c4a3a6 sago007 2008-08-29 14:32 191
            baseSpeed=0.2;
89c4a3a6 sago007 2008-08-29 14:32 192
            break;
89c4a3a6 sago007 2008-08-29 14:32 193
        default:
89c4a3a6 sago007 2008-08-29 14:32 194
            baseSpeed=0.15;
89c4a3a6 sago007 2008-08-29 14:32 195
            break;
89c4a3a6 sago007 2008-08-29 14:32 196
        };
89c4a3a6 sago007 2008-08-29 14:32 197
    }
89c4a3a6 sago007 2008-08-29 14:32 198
89c4a3a6 sago007 2008-08-29 14:32 199
    void setHandicap(Uint8 globalHandicap) {
89c4a3a6 sago007 2008-08-29 14:32 200
        handicap=1000*((Uint32)globalHandicap);
89c4a3a6 sago007 2008-08-29 14:32 201
    }
89c4a3a6 sago007 2008-08-29 14:32 202
89c4a3a6 sago007 2008-08-29 14:32 203
    //Set the move speed of the AI based on the aiLevel parameter
89c4a3a6 sago007 2008-08-29 14:32 204
    void setAIlevel(Uint8 aiLevel) {
89c4a3a6 sago007 2008-08-29 14:32 205
        AI_MoveSpeed=120-(20*(aiLevel-3));
89c4a3a6 sago007 2008-08-29 14:32 206
    };
32c9b349 sago007 2008-11-20 18:14 207
    
32c9b349 sago007 2008-11-20 18:14 208
    Uint8 getAIlevel() {
32c9b349 sago007 2008-11-20 18:14 209
        return (120-AI_MoveSpeed)/20+3;
32c9b349 sago007 2008-11-20 18:14 210
    }
89c4a3a6 sago007 2008-08-29 14:32 211
91886cae sago007 2008-09-12 16:28 212
#if NETWORK
89c4a3a6 sago007 2008-08-29 14:32 213
#define garbageStackSize 10
89c4a3a6 sago007 2008-08-29 14:32 214
    Uint8 garbageStack[garbageStackSize][3]; //A garbage stack with space for 10 garbage blocks. 0=x,1=y,2=type
89c4a3a6 sago007 2008-08-29 14:32 215
    int garbageStackUsed;
89c4a3a6 sago007 2008-08-29 14:32 216
89c4a3a6 sago007 2008-08-29 14:32 217
    void emptyGarbageStack() {
89c4a3a6 sago007 2008-08-29 14:32 218
        for (int i=0;i<10;i++)
89c4a3a6 sago007 2008-08-29 14:32 219
            for (int j=0;j<3;j++)
89c4a3a6 sago007 2008-08-29 14:32 220
                garbageStack[i][j] = 0;
89c4a3a6 sago007 2008-08-29 14:32 221
        garbageStackUsed = 0;
89c4a3a6 sago007 2008-08-29 14:32 222
    }
89c4a3a6 sago007 2008-08-29 14:32 223
89c4a3a6 sago007 2008-08-29 14:32 224
    bool pushGarbage(Uint8 width, Uint8 height, Uint8 type) {
89c4a3a6 sago007 2008-08-29 14:32 225
        if (garbageStackUsed>=garbageStackSize)
89c4a3a6 sago007 2008-08-29 14:32 226
            return false;
89c4a3a6 sago007 2008-08-29 14:32 227
        garbageStack[garbageStackUsed][0]=width;
89c4a3a6 sago007 2008-08-29 14:32 228
        garbageStack[garbageStackUsed][1]=height;
89c4a3a6 sago007 2008-08-29 14:32 229
        garbageStack[garbageStackUsed][2]=type;
89c4a3a6 sago007 2008-08-29 14:32 230
        garbageStackUsed++;
89c4a3a6 sago007 2008-08-29 14:32 231
        return true;
89c4a3a6 sago007 2008-08-29 14:32 232
    }
89c4a3a6 sago007 2008-08-29 14:32 233
89c4a3a6 sago007 2008-08-29 14:32 234
    bool popGarbage(Uint8 *width, Uint8 *height, Uint8 *type) {
89c4a3a6 sago007 2008-08-29 14:32 235
        if (garbageStackUsed<1)
89c4a3a6 sago007 2008-08-29 14:32 236
            return false;
89c4a3a6 sago007 2008-08-29 14:32 237
        garbageStackUsed--;
89c4a3a6 sago007 2008-08-29 14:32 238
        *width=garbageStack[garbageStackUsed][0];
89c4a3a6 sago007 2008-08-29 14:32 239
        *height=garbageStack[garbageStackUsed][1];
89c4a3a6 sago007 2008-08-29 14:32 240
        *type=garbageStack[garbageStackUsed][2];
89c4a3a6 sago007 2008-08-29 14:32 241
        return true;
89c4a3a6 sago007 2008-08-29 14:32 242
    }
89c4a3a6 sago007 2008-08-29 14:32 243
89c4a3a6 sago007 2008-08-29 14:32 244
#endif
89c4a3a6 sago007 2008-08-29 14:32 245
2e57d791 sago007 2009-06-04 17:48 246
    #if WITH_SDL
89c4a3a6 sago007 2008-08-29 14:32 247
    //Loads BackBoard again if surface format has changed
89c4a3a6 sago007 2008-08-29 14:32 248
    void convertSurface() {
89c4a3a6 sago007 2008-08-29 14:32 249
        SDL_FreeSurface(sBoard);
89c4a3a6 sago007 2008-08-29 14:32 250
        sBoard = SDL_DisplayFormat(backBoard);
89c4a3a6 sago007 2008-08-29 14:32 251
    }
2e57d791 sago007 2009-06-04 17:48 252
    #endif
89c4a3a6 sago007 2008-08-29 14:32 253
89c4a3a6 sago007 2008-08-29 14:32 254
    //Instead of creating new object new game is called, to prevent memory leaks
89c4a3a6 sago007 2008-08-29 14:32 255
    void NewGame(int tx, int ty) {
89c4a3a6 sago007 2008-08-29 14:32 256
        stageButtonStatus = SBdontShow;
89c4a3a6 sago007 2008-08-29 14:32 257
        bReplaying  =  false;
2f30c381 sago007 2008-09-14 13:08 258
        #if NETWORK
89c4a3a6 sago007 2008-08-29 14:32 259
        bNetworkPlayer=false;
89c4a3a6 sago007 2008-08-29 14:32 260
        bDisconnected =false;
2f30c381 sago007 2008-09-14 13:08 261
        #endif
89c4a3a6 sago007 2008-08-29 14:32 262
        nrFellDown = 0;
89c4a3a6 sago007 2008-08-29 14:32 263
        lastNrOfPlayers = 1; //At least one player :-)
89c4a3a6 sago007 2008-08-29 14:32 264
        nrPushedPixel = 0;
89c4a3a6 sago007 2008-08-29 14:32 265
        nrStops = 0;
89c4a3a6 sago007 2008-08-29 14:32 266
        topx = tx;
89c4a3a6 sago007 2008-08-29 14:32 267
        topy = ty;
89c4a3a6 sago007 2008-08-29 14:32 268
        cursorx = 2;
89c4a3a6 sago007 2008-08-29 14:32 269
        cursory = 3;
89c4a3a6 sago007 2008-08-29 14:32 270
        stop = 0;
89c4a3a6 sago007 2008-08-29 14:32 271
        pixels = 0;
89c4a3a6 sago007 2008-08-29 14:32 272
        score = 0;
89c4a3a6 sago007 2008-08-29 14:32 273
        bGameOver = false;
89c4a3a6 sago007 2008-08-29 14:32 274
        bDraw = false;
89c4a3a6 sago007 2008-08-29 14:32 275
        timetrial = false;
89c4a3a6 sago007 2008-08-29 14:32 276
        stageClear = false;
89c4a3a6 sago007 2008-08-29 14:32 277
        linesCleared = 0;
89c4a3a6 sago007 2008-08-29 14:32 278
        hasWonTheGame = false;
89c4a3a6 sago007 2008-08-29 14:32 279
        vsMode = false;
89c4a3a6 sago007 2008-08-29 14:32 280
        puzzleMode = false;
89c4a3a6 sago007 2008-08-29 14:32 281
        combo=0;
89c4a3a6 sago007 2008-08-29 14:32 282
        chain=0;
89c4a3a6 sago007 2008-08-29 14:32 283
        AI_Enabled = false;
89c4a3a6 sago007 2008-08-29 14:32 284
        baseSpeed= 0.5;
89c4a3a6 sago007 2008-08-29 14:32 285
        speed = baseSpeed;
89c4a3a6 sago007 2008-08-29 14:32 286
        speedLevel = 1;
89c4a3a6 sago007 2008-08-29 14:32 287
        gameStartedAt = SDL_GetTicks()+3000;
89c4a3a6 sago007 2008-08-29 14:32 288
        pushedPixelAt = gameStartedAt;
89c4a3a6 sago007 2008-08-29 14:32 289
        nextGarbageNumber = 10;
89c4a3a6 sago007 2008-08-29 14:32 290
        handicap=0;
89c4a3a6 sago007 2008-08-29 14:32 291
        for (int i=0;i<7;i++)
89c4a3a6 sago007 2008-08-29 14:32 292
            for (int j=0;j<30;j++) {
89c4a3a6 sago007 2008-08-29 14:32 293
                board[i][j] = -1;
89c4a3a6 sago007 2008-08-29 14:32 294
            }
89c4a3a6 sago007 2008-08-29 14:32 295
        for (int i=0;i<NUMBEROFCHAINS;i++) {
89c4a3a6 sago007 2008-08-29 14:32 296
            chainUsed[i]=false;
89c4a3a6 sago007 2008-08-29 14:32 297
            chainSize[i] = 0;
89c4a3a6 sago007 2008-08-29 14:32 298
        }
89c4a3a6 sago007 2008-08-29 14:32 299
        lastAImove = SDL_GetTicks()+3000;
89c4a3a6 sago007 2008-08-29 14:32 300
        showGame = true;
89c4a3a6 sago007 2008-08-29 14:32 301
        theReplay = Replay();
89c4a3a6 sago007 2008-08-29 14:32 302
    }	//NewGame
89c4a3a6 sago007 2008-08-29 14:32 303
89c4a3a6 sago007 2008-08-29 14:32 304
    //Starts a new stage game, takes level as input!
89c4a3a6 sago007 2008-08-29 14:32 305
    void NewStageGame(int level, int tx, int ty) {
89c4a3a6 sago007 2008-08-29 14:32 306
        if (level > -1) {
89c4a3a6 sago007 2008-08-29 14:32 307
            NewGame(tx, ty);
89c4a3a6 sago007 2008-08-29 14:32 308
            stageClear = true;
89c4a3a6 sago007 2008-08-29 14:32 309
            Level = level;
32c9b349 sago007 2008-11-20 18:14 310
            Stats::getInstance()->addOne("PlayedStageLevel"+itoa2(level));
89c4a3a6 sago007 2008-08-29 14:32 311
            stageClearLimit = 30+(Level%6)*10;
89c4a3a6 sago007 2008-08-29 14:32 312
            baseSpeed = 0.5/((double)(Level*0.5)+1.0);
89c4a3a6 sago007 2008-08-29 14:32 313
            speed = baseSpeed;
89c4a3a6 sago007 2008-08-29 14:32 314
        }
89c4a3a6 sago007 2008-08-29 14:32 315
    }
89c4a3a6 sago007 2008-08-29 14:32 316
89c4a3a6 sago007 2008-08-29 14:32 317
    void NewPuzzleGame(int level, int tx, int ty) {
89c4a3a6 sago007 2008-08-29 14:32 318
        if (level>-1) {
89c4a3a6 sago007 2008-08-29 14:32 319
            NewGame(tx, ty);
89c4a3a6 sago007 2008-08-29 14:32 320
            puzzleMode = true;
89c4a3a6 sago007 2008-08-29 14:32 321
            Level = level;
89c4a3a6 sago007 2008-08-29 14:32 322
            MovesLeft = nrOfMovesAllowed[Level];
89c4a3a6 sago007 2008-08-29 14:32 323
            for (int i=0;i<6;i++)
89c4a3a6 sago007 2008-08-29 14:32 324
                for (int j=0;j<12;j++) {
89c4a3a6 sago007 2008-08-29 14:32 325
                    board[i][j+1] = puzzleLevels[Level][i][j];
89c4a3a6 sago007 2008-08-29 14:32 326
                }
89c4a3a6 sago007 2008-08-29 14:32 327
            baseSpeed = 100000;
89c4a3a6 sago007 2008-08-29 14:32 328
            speed = 100000;
89c4a3a6 sago007 2008-08-29 14:32 329
89c4a3a6 sago007 2008-08-29 14:32 330
            //Now push the blines up
89c4a3a6 sago007 2008-08-29 14:32 331
            for (int i=19;i>0;i--)
89c4a3a6 sago007 2008-08-29 14:32 332
                for (int j=0;j<6;j++) {
89c4a3a6 sago007 2008-08-29 14:32 333
                    board[j][i] = board[j][i-1];
89c4a3a6 sago007 2008-08-29 14:32 334
                }
89c4a3a6 sago007 2008-08-29 14:32 335
            for (int j=0;j<6;j++) {
89c4a3a6 sago007 2008-08-29 14:32 336
                board[j][0] = rand() % 6;
89c4a3a6 sago007 2008-08-29 14:32 337
                if (j > 0) {
89c4a3a6 sago007 2008-08-29 14:32 338
                    if (board[j][0] == board[j-1][0])
89c4a3a6 sago007 2008-08-29 14:32 339
                        board[j][0] = rand() % 6;
89c4a3a6 sago007 2008-08-29 14:32 340
                }
89c4a3a6 sago007 2008-08-29 14:32 341
                if (board[j][0] == board[j][1])
89c4a3a6 sago007 2008-08-29 14:32 342
                    board[j][0] = 6;
89c4a3a6 sago007 2008-08-29 14:32 343
                if (board[j][0] == board[j][1])
89c4a3a6 sago007 2008-08-29 14:32 344
                    board[j][0] = 6;
89c4a3a6 sago007 2008-08-29 14:32 345
89c4a3a6 sago007 2008-08-29 14:32 346
            }
89c4a3a6 sago007 2008-08-29 14:32 347
        }
89c4a3a6 sago007 2008-08-29 14:32 348
    }
89c4a3a6 sago007 2008-08-29 14:32 349
    
89c4a3a6 sago007 2008-08-29 14:32 350
    //Replay the current level
89c4a3a6 sago007 2008-08-29 14:32 351
    void retryLevel()
89c4a3a6 sago007 2008-08-29 14:32 352
    {
89c4a3a6 sago007 2008-08-29 14:32 353
        if(puzzleMode)
89c4a3a6 sago007 2008-08-29 14:32 354
            NewPuzzleGame(Level,topx,topy);
89c4a3a6 sago007 2008-08-29 14:32 355
        else
89c4a3a6 sago007 2008-08-29 14:32 356
            if(stageClear)
89c4a3a6 sago007 2008-08-29 14:32 357
                NewStageGame(Level,topx,topy);
89c4a3a6 sago007 2008-08-29 14:32 358
    }
89c4a3a6 sago007 2008-08-29 14:32 359
    
89c4a3a6 sago007 2008-08-29 14:32 360
    //Play the next level
89c4a3a6 sago007 2008-08-29 14:32 361
    void nextLevel()
89c4a3a6 sago007 2008-08-29 14:32 362
    {
89c4a3a6 sago007 2008-08-29 14:32 363
        if(puzzleMode)
89c4a3a6 sago007 2008-08-29 14:32 364
        {
89c4a3a6 sago007 2008-08-29 14:32 365
            if(Level<nrOfPuzzles-1)
89c4a3a6 sago007 2008-08-29 14:32 366
                NewPuzzleGame(Level+1,topx,topy);
89c4a3a6 sago007 2008-08-29 14:32 367
        }
89c4a3a6 sago007 2008-08-29 14:32 368
        else
89c4a3a6 sago007 2008-08-29 14:32 369
            if(stageClear)
89c4a3a6 sago007 2008-08-29 14:32 370
            {
89c4a3a6 sago007 2008-08-29 14:32 371
                if(Level<50-1)
89c4a3a6 sago007 2008-08-29 14:32 372
                    NewStageGame(Level+1,topx,topy);
89c4a3a6 sago007 2008-08-29 14:32 373
            }
89c4a3a6 sago007 2008-08-29 14:32 374
    }
89c4a3a6 sago007 2008-08-29 14:32 375
89c4a3a6 sago007 2008-08-29 14:32 376
    //Starts new Vs Game (two Player)
89c4a3a6 sago007 2008-08-29 14:32 377
    void NewVsGame(int tx, int ty, BlockGame *target) {
89c4a3a6 sago007 2008-08-29 14:32 378
        NewGame(tx, ty);
89c4a3a6 sago007 2008-08-29 14:32 379
        vsMode = true;
89c4a3a6 sago007 2008-08-29 14:32 380
        putStartBlocks();
89c4a3a6 sago007 2008-08-29 14:32 381
        garbageTarget = target;
32c9b349 sago007 2008-11-20 18:14 382
        Stats::getInstance()->addOne("VSgamesStarted");
89c4a3a6 sago007 2008-08-29 14:32 383
    }
89c4a3a6 sago007 2008-08-29 14:32 384
89c4a3a6 sago007 2008-08-29 14:32 385
    //Starts new Vs Game (two Player)
89c4a3a6 sago007 2008-08-29 14:32 386
    void NewVsGame(int tx, int ty, BlockGame *target, bool AI) {
89c4a3a6 sago007 2008-08-29 14:32 387
        NewGame(tx, ty);
89c4a3a6 sago007 2008-08-29 14:32 388
        vsMode = true;
89c4a3a6 sago007 2008-08-29 14:32 389
        AI_Enabled = AI;
32c9b349 sago007 2008-11-20 18:14 390
        if(!AI)
32c9b349 sago007 2008-11-20 18:14 391
            Stats::getInstance()->addOne("VSgamesStarted");
c96f480e sago007 2009-03-28 18:59 392
        else
c96f480e sago007 2009-03-28 18:59 393
            strcpy(name,"CPU\0");
89c4a3a6 sago007 2008-08-29 14:32 394
        putStartBlocks();
89c4a3a6 sago007 2008-08-29 14:32 395
        garbageTarget = target;
89c4a3a6 sago007 2008-08-29 14:32 396
    }
89c4a3a6 sago007 2008-08-29 14:32 397
89c4a3a6 sago007 2008-08-29 14:32 398
    //Go in Demonstration mode, no movement
89c4a3a6 sago007 2008-08-29 14:32 399
    void Demonstration(bool toggle) {
89c4a3a6 sago007 2008-08-29 14:32 400
        speed=0;
89c4a3a6 sago007 2008-08-29 14:32 401
        baseSpeed = 0;
89c4a3a6 sago007 2008-08-29 14:32 402
    }
89c4a3a6 sago007 2008-08-29 14:32 403
89c4a3a6 sago007 2008-08-29 14:32 404
    //We want to play the replay (must have been loaded beforehand)
89c4a3a6 sago007 2008-08-29 14:32 405
    void playReplay(int tx, int ty) {
89c4a3a6 sago007 2008-08-29 14:32 406
        NewGame(tx, ty);
89c4a3a6 sago007 2008-08-29 14:32 407
        gameStartedAt = SDL_GetTicks();
89c4a3a6 sago007 2008-08-29 14:32 408
        bReplaying = true; //We are playing, no calculations
2f30c381 sago007 2008-09-14 13:08 409
        #if NETWORK
89c4a3a6 sago007 2008-08-29 14:32 410
        bNetworkPlayer = false; //Take input from replay file
2f30c381 sago007 2008-09-14 13:08 411
        #endif
89c4a3a6 sago007 2008-08-29 14:32 412
    }
89c4a3a6 sago007 2008-08-29 14:32 413
91886cae sago007 2008-09-12 16:28 414
#if NETWORK
89c4a3a6 sago007 2008-08-29 14:32 415
    //network play
89c4a3a6 sago007 2008-08-29 14:32 416
    void playNetwork(int tx, int ty) {
89c4a3a6 sago007 2008-08-29 14:32 417
        NewGame(tx, ty);
89c4a3a6 sago007 2008-08-29 14:32 418
        gameStartedAt = SDL_GetTicks();
89c4a3a6 sago007 2008-08-29 14:32 419
        bReplaying = false; //We are playing, no calculations
89c4a3a6 sago007 2008-08-29 14:32 420
        bNetworkPlayer = true; //Don't Take input from replay file
89c4a3a6 sago007 2008-08-29 14:32 421
        emptyGarbageStack();
89c4a3a6 sago007 2008-08-29 14:32 422
    }
89c4a3a6 sago007 2008-08-29 14:32 423
#endif
89c4a3a6 sago007 2008-08-29 14:32 424
89c4a3a6 sago007 2008-08-29 14:32 425
    //Prints "winner" and ends game
89c4a3a6 sago007 2008-08-29 14:32 426
    void setPlayerWon() {
89c4a3a6 sago007 2008-08-29 14:32 427
        if (!bGameOver)
cd12e0fe sago007 2009-01-29 08:47 428
        {
89c4a3a6 sago007 2008-08-29 14:32 429
            gameEndedAfter = SDL_GetTicks()-gameStartedAt; //We game ends now!
cd12e0fe sago007 2009-01-29 08:47 430
	    if(!AI_Enabled && !bReplaying)
cd12e0fe sago007 2009-01-29 08:47 431
		{
cd12e0fe sago007 2009-01-29 08:47 432
			TimeHandler::addTime("playTime",TimeHandler::ms2ct(gameEndedAfter));
cd12e0fe sago007 2009-01-29 08:47 433
		}
cd12e0fe sago007 2009-01-29 08:47 434
        }
89c4a3a6 sago007 2008-08-29 14:32 435
        theReplay.setFinalFrame(getPackage(), 1);
89c4a3a6 sago007 2008-08-29 14:32 436
        bGameOver = true;
89c4a3a6 sago007 2008-08-29 14:32 437
        hasWonTheGame = true;
89c4a3a6 sago007 2008-08-29 14:32 438
        showGame = false;
89c4a3a6 sago007 2008-08-29 14:32 439
        if (SoundEnabled)Mix_PlayChannel(1, applause, 0);
32c9b349 sago007 2008-11-20 18:14 440
        if(!AI_Enabled && !bReplaying)
32c9b349 sago007 2008-11-20 18:14 441
        {
32c9b349 sago007 2008-11-20 18:14 442
            Stats::getInstance()->addOne("totalWins");
c09d0e4f sago007 2009-01-27 01:15 443
            if(garbageTarget->AI_Enabled && !(garbageTarget->bReplaying))
32c9b349 sago007 2008-11-20 18:14 444
            {
32c9b349 sago007 2008-11-20 18:14 445
                //We have defeated an AI
32c9b349 sago007 2008-11-20 18:14 446
                Stats::getInstance()->addOne("defeatedAI"+itoa(garbageTarget->getAIlevel()));
32c9b349 sago007 2008-11-20 18:14 447
            }
32c9b349 sago007 2008-11-20 18:14 448
        }
c09d0e4f sago007 2009-01-27 01:15 449
        if(AI_Enabled && !(garbageTarget->AI_Enabled) && garbageTarget->bReplaying==false)
32c9b349 sago007 2008-11-20 18:14 450
        {
32c9b349 sago007 2008-11-20 18:14 451
            //The AI have defeated a human player
c09d0e4f sago007 2009-01-27 01:15 452
            Stats::getInstance()->addOne("defeatedByAI"+itoa(getAIlevel()));
32c9b349 sago007 2008-11-20 18:14 453
        }
89c4a3a6 sago007 2008-08-29 14:32 454
    }
89c4a3a6 sago007 2008-08-29 14:32 455
89c4a3a6 sago007 2008-08-29 14:32 456
    //void SetGameOver();
89c4a3a6 sago007 2008-08-29 14:32 457
2f30c381 sago007 2008-09-14 13:08 458
    #if NETWORK
89c4a3a6 sago007 2008-08-29 14:32 459
    //Sets disconnected:
89c4a3a6 sago007 2008-08-29 14:32 460
    void setDisconnect() {
89c4a3a6 sago007 2008-08-29 14:32 461
        bDisconnected = true;
89c4a3a6 sago007 2008-08-29 14:32 462
        SetGameOver();
89c4a3a6 sago007 2008-08-29 14:32 463
    }
2f30c381 sago007 2008-09-14 13:08 464
    #endif
2f30c381 sago007 2008-09-14 13:08 465
    
89c4a3a6 sago007 2008-08-29 14:32 466
    //Prints "draw" and ends the game
89c4a3a6 sago007 2008-08-29 14:32 467
    void setDraw() {
89c4a3a6 sago007 2008-08-29 14:32 468
        bGameOver = true;
cd12e0fe sago007 2009-01-29 08:47 469
	if(!AI_Enabled && !bReplaying)
cd12e0fe sago007 2009-01-29 08:47 470
	{
cd12e0fe sago007 2009-01-29 08:47 471
		TimeHandler::addTime("playTime",TimeHandler::ms2ct(gameEndedAfter));
cd12e0fe sago007 2009-01-29 08:47 472
	}
89c4a3a6 sago007 2008-08-29 14:32 473
        theReplay.setFinalFrame(getPackage(), 3);
89c4a3a6 sago007 2008-08-29 14:32 474
        hasWonTheGame = false;
89c4a3a6 sago007 2008-08-29 14:32 475
        bDraw = true;
89c4a3a6 sago007 2008-08-29 14:32 476
        showGame = false;
89c4a3a6 sago007 2008-08-29 14:32 477
        Mix_HaltChannel(1);
32c9b349 sago007 2008-11-20 18:14 478
        if(!AI_Enabled && !bReplaying)
32c9b349 sago007 2008-11-20 18:14 479
            Stats::getInstance()->addOne("totalDraws");
89c4a3a6 sago007 2008-08-29 14:32 480
    }
89c4a3a6 sago007 2008-08-29 14:32 481
89c4a3a6 sago007 2008-08-29 14:32 482
    //Function to get a boardpackage
89c4a3a6 sago007 2008-08-29 14:32 483
    boardPackage getPackage() {
89c4a3a6 sago007 2008-08-29 14:32 484
        boardPackage bp;
89c4a3a6 sago007 2008-08-29 14:32 485
        if(SDL_GetTicks()<gameStartedAt)
89c4a3a6 sago007 2008-08-29 14:32 486
            bp.time = 0;
89c4a3a6 sago007 2008-08-29 14:32 487
        else
89c4a3a6 sago007 2008-08-29 14:32 488
            bp.time = (Uint32)(SDL_GetTicks()-gameStartedAt);
89c4a3a6 sago007 2008-08-29 14:32 489
        for (int i=0;i<6;i++)
89c4a3a6 sago007 2008-08-29 14:32 490
            for (int j=0;j<13;j++) {
89c4a3a6 sago007 2008-08-29 14:32 491
                if (board[i][j]%10<7)
89c4a3a6 sago007 2008-08-29 14:32 492
                    bp.brick[i][j]=board[i][j]%10+1;
cad041e3 sago007 2009-03-07 15:16 493
                if ((board[i][j]/1000000)%10==1)
cad041e3 sago007 2009-03-07 15:16 494
                {
cad041e3 sago007 2009-03-07 15:16 495
                    //Ordinary garbage
89c4a3a6 sago007 2008-08-29 14:32 496
                    int aInt=0; //N=1, S=2, W=4, E=8
89c4a3a6 sago007 2008-08-29 14:32 497
                    if (i==0)
89c4a3a6 sago007 2008-08-29 14:32 498
                        aInt+=4;
89c4a3a6 sago007 2008-08-29 14:32 499
                    else
89c4a3a6 sago007 2008-08-29 14:32 500
                        if ((board[i-1][j])!=(board[i][j]))
89c4a3a6 sago007 2008-08-29 14:32 501
                            aInt+=4;
89c4a3a6 sago007 2008-08-29 14:32 502
                    if (i==5)
89c4a3a6 sago007 2008-08-29 14:32 503
                        aInt+=8;
89c4a3a6 sago007 2008-08-29 14:32 504
                    else
89c4a3a6 sago007 2008-08-29 14:32 505
                        if ((board[i+1][j])!=(board[i][j]))
89c4a3a6 sago007 2008-08-29 14:32 506
                            aInt+=8;
89c4a3a6 sago007 2008-08-29 14:32 507
                    if (j==0)
89c4a3a6 sago007 2008-08-29 14:32 508
                        aInt+=2;
89c4a3a6 sago007 2008-08-29 14:32 509
                    else
89c4a3a6 sago007 2008-08-29 14:32 510
                        if ((board[i][j-1])!=(board[i][j]))
89c4a3a6 sago007 2008-08-29 14:32 511
                            aInt+=2;
89c4a3a6 sago007 2008-08-29 14:32 512
                    if ((board[i][j+1])!=(board[i][j]))
89c4a3a6 sago007 2008-08-29 14:32 513
                        aInt+=1;
89c4a3a6 sago007 2008-08-29 14:32 514
                    switch (aInt) {
89c4a3a6 sago007 2008-08-29 14:32 515
                    case 8:
89c4a3a6 sago007 2008-08-29 14:32 516
                        bp.brick[i][j]=8;
89c4a3a6 sago007 2008-08-29 14:32 517
                        break;
89c4a3a6 sago007 2008-08-29 14:32 518
                    case 7:
89c4a3a6 sago007 2008-08-29 14:32 519
                        bp.brick[i][j]=10;
89c4a3a6 sago007 2008-08-29 14:32 520
                        break;
89c4a3a6 sago007 2008-08-29 14:32 521
                    case 11:
89c4a3a6 sago007 2008-08-29 14:32 522
                        bp.brick[i][j]=11;
89c4a3a6 sago007 2008-08-29 14:32 523
                        break;
89c4a3a6 sago007 2008-08-29 14:32 524
                    case 9:
89c4a3a6 sago007 2008-08-29 14:32 525
                        bp.brick[i][j]=12;
89c4a3a6 sago007 2008-08-29 14:32 526
                        break;
89c4a3a6 sago007 2008-08-29 14:32 527
                    case 5:
89c4a3a6 sago007 2008-08-29 14:32 528
                        bp.brick[i][j]=13;
89c4a3a6 sago007 2008-08-29 14:32 529
                        break;
89c4a3a6 sago007 2008-08-29 14:32 530
                    case 6:
89c4a3a6 sago007 2008-08-29 14:32 531
                        bp.brick[i][j]=14;
89c4a3a6 sago007 2008-08-29 14:32 532
                        break;
89c4a3a6 sago007 2008-08-29 14:32 533
                    case 10:
89c4a3a6 sago007 2008-08-29 14:32 534
                        bp.brick[i][j]=15;
89c4a3a6 sago007 2008-08-29 14:32 535
                        break;
89c4a3a6 sago007 2008-08-29 14:32 536
                    case 3: //M
89c4a3a6 sago007 2008-08-29 14:32 537
                        bp.brick[i][j]=16;
89c4a3a6 sago007 2008-08-29 14:32 538
                        break;
89c4a3a6 sago007 2008-08-29 14:32 539
                    case 0:
89c4a3a6 sago007 2008-08-29 14:32 540
                        bp.brick[i][j]=17;
89c4a3a6 sago007 2008-08-29 14:32 541
                        break;
89c4a3a6 sago007 2008-08-29 14:32 542
                    case 1:
89c4a3a6 sago007 2008-08-29 14:32 543
                        bp.brick[i][j]=18;
89c4a3a6 sago007 2008-08-29 14:32 544
                        break;
89c4a3a6 sago007 2008-08-29 14:32 545
                    case 2:
89c4a3a6 sago007 2008-08-29 14:32 546
                        bp.brick[i][j]=19;
89c4a3a6 sago007 2008-08-29 14:32 547
                        break;
89c4a3a6 sago007 2008-08-29 14:32 548
                    case 4:
89c4a3a6 sago007 2008-08-29 14:32 549
                        bp.brick[i][j]=20;
89c4a3a6 sago007 2008-08-29 14:32 550
                        break;
89c4a3a6 sago007 2008-08-29 14:32 551
                    default:
89c4a3a6 sago007 2008-08-29 14:32 552
                        bp.brick[i][j]=0;
89c4a3a6 sago007 2008-08-29 14:32 553
                    };
89c4a3a6 sago007 2008-08-29 14:32 554
                    //cout << "garbage added to replay: " << aInt << endl;
89c4a3a6 sago007 2008-08-29 14:32 555
                }
cad041e3 sago007 2009-03-07 15:16 556
                if ((board[i][j]/1000000)%10==2)
cad041e3 sago007 2009-03-07 15:16 557
                {
cad041e3 sago007 2009-03-07 15:16 558
                    //Gray garbage
cad041e3 sago007 2009-03-07 15:16 559
                    bp.brick[i][j]=21;
cad041e3 sago007 2009-03-07 15:16 560
                }
89c4a3a6 sago007 2008-08-29 14:32 561
                if ((board[i][j]/BLOCKHANG)%10==1) //If "get ready"
89c4a3a6 sago007 2008-08-29 14:32 562
                    bp.brick[i][j]+=30;
89c4a3a6 sago007 2008-08-29 14:32 563
            }
89c4a3a6 sago007 2008-08-29 14:32 564
        bp.cursorX = (Uint8)cursorx;
89c4a3a6 sago007 2008-08-29 14:32 565
        bp.cursorY = (Uint8)cursory;
89c4a3a6 sago007 2008-08-29 14:32 566
        bp.score = (Uint32)score;
89c4a3a6 sago007 2008-08-29 14:32 567
        bp.pixels = (Uint8)pixels;
89c4a3a6 sago007 2008-08-29 14:32 568
        bp.chain = (Uint8)chain;
89c4a3a6 sago007 2008-08-29 14:32 569
        bp.speed = (Uint8)speedLevel;
89c4a3a6 sago007 2008-08-29 14:32 570
        Uint8 result = 0;
89c4a3a6 sago007 2008-08-29 14:32 571
        if (bGameOver)
89c4a3a6 sago007 2008-08-29 14:32 572
            result+=1;
89c4a3a6 sago007 2008-08-29 14:32 573
        if (hasWonTheGame)
89c4a3a6 sago007 2008-08-29 14:32 574
            result+=2;
89c4a3a6 sago007 2008-08-29 14:32 575
        if (bDraw)
89c4a3a6 sago007 2008-08-29 14:32 576
            result+=4;
89c4a3a6 sago007 2008-08-29 14:32 577
        bp.result = (Uint8)result;
89c4a3a6 sago007 2008-08-29 14:32 578
        return bp;
89c4a3a6 sago007 2008-08-29 14:32 579
    }
89c4a3a6 sago007 2008-08-29 14:32 580
89c4a3a6 sago007 2008-08-29 14:32 581
    //Takes a package and sets the board like it
89c4a3a6 sago007 2008-08-29 14:32 582
    void setBoard(boardPackage bp) {
89c4a3a6 sago007 2008-08-29 14:32 583
        //gameStartedAt = SDL_GetTicks()-bp.time;
89c4a3a6 sago007 2008-08-29 14:32 584
        for (int i=0;i<6;i++)
89c4a3a6 sago007 2008-08-29 14:32 585
            for (int j=0;j<13;j++) {
89c4a3a6 sago007 2008-08-29 14:32 586
                //if(bp.brick[i][j]/8==0)
89c4a3a6 sago007 2008-08-29 14:32 587
                board[i][j]=bp.brick[i][j]-1;
89c4a3a6 sago007 2008-08-29 14:32 588
                //else
89c4a3a6 sago007 2008-08-29 14:32 589
                //	board[i][j]=-1;
89c4a3a6 sago007 2008-08-29 14:32 590
            }
89c4a3a6 sago007 2008-08-29 14:32 591
        cursorx=bp.cursorX;
89c4a3a6 sago007 2008-08-29 14:32 592
        cursory=bp.cursorY;
89c4a3a6 sago007 2008-08-29 14:32 593
        score=bp.score;
89c4a3a6 sago007 2008-08-29 14:32 594
        pixels=bp.pixels;
89c4a3a6 sago007 2008-08-29 14:32 595
        chain=bp.chain;
89c4a3a6 sago007 2008-08-29 14:32 596
        speedLevel=bp.speed;
89c4a3a6 sago007 2008-08-29 14:32 597
        Uint8 result = bp.result;
e03ae476 sago007 2009-03-06 22:49 598
        bGameOver = false; //Make sure that it is initialized!
e03ae476 sago007 2009-03-06 22:49 599
        if(result%2==1) {
89c4a3a6 sago007 2008-08-29 14:32 600
            bGameOver=true;
89c4a3a6 sago007 2008-08-29 14:32 601
            result-=1;
89c4a3a6 sago007 2008-08-29 14:32 602
        }
89c4a3a6 sago007 2008-08-29 14:32 603
        if (result%4==2) {
89c4a3a6 sago007 2008-08-29 14:32 604
            hasWonTheGame = true;
89c4a3a6 sago007 2008-08-29 14:32 605
            result-=2;
89c4a3a6 sago007 2008-08-29 14:32 606
        }
89c4a3a6 sago007 2008-08-29 14:32 607
        if (result==4) {
89c4a3a6 sago007 2008-08-29 14:32 608
            bDraw = true;
89c4a3a6 sago007 2008-08-29 14:32 609
        }
89c4a3a6 sago007 2008-08-29 14:32 610
89c4a3a6 sago007 2008-08-29 14:32 611
    }
89c4a3a6 sago007 2008-08-29 14:32 612
89c4a3a6 sago007 2008-08-29 14:32 613
    //Test if LineNr is an empty line, returns false otherwise.
89c4a3a6 sago007 2008-08-29 14:32 614
    bool LineEmpty(int lineNr) {
89c4a3a6 sago007 2008-08-29 14:32 615
        bool empty = true;
89c4a3a6 sago007 2008-08-29 14:32 616
        for (int i = 0; i <7; i++)
89c4a3a6 sago007 2008-08-29 14:32 617
            if (board[i][lineNr] != -1)
89c4a3a6 sago007 2008-08-29 14:32 618
                empty = false;
89c4a3a6 sago007 2008-08-29 14:32 619
        return empty;
89c4a3a6 sago007 2008-08-29 14:32 620
    }
89c4a3a6 sago007 2008-08-29 14:32 621
89c4a3a6 sago007 2008-08-29 14:32 622
    //Test if the entire board is empty (used for Puzzles)
89c4a3a6 sago007 2008-08-29 14:32 623
    bool BoardEmpty() {
89c4a3a6 sago007 2008-08-29 14:32 624
        bool empty = true;
89c4a3a6 sago007 2008-08-29 14:32 625
        for (int i=0;i<6;i++)
89c4a3a6 sago007 2008-08-29 14:32 626
            for (int j=1;j<13;j++)
89c4a3a6 sago007 2008-08-29 14:32 627
                if (board[i][j] != -1)
89c4a3a6 sago007 2008-08-29 14:32 628
                    empty = false;
89c4a3a6 sago007 2008-08-29 14:32 629
        return empty;
89c4a3a6 sago007 2008-08-29 14:32 630
    }
89c4a3a6 sago007 2008-08-29 14:32 631
89c4a3a6 sago007 2008-08-29 14:32 632
    //Anything that the user can't move? In that case Game Over cannot occur
89c4a3a6 sago007 2008-08-29 14:32 633
    bool hasStaticContent() {
89c4a3a6 sago007 2008-08-29 14:32 634
        for (int i=0;i<6;i++)
89c4a3a6 sago007 2008-08-29 14:32 635
            for (int j=1;j<13;j++)
89c4a3a6 sago007 2008-08-29 14:32 636
                if (board[i][j] >= 10000000) 	//Higher than this means combos (garbage is static, but the stack is static but nothing to do about it)
89c4a3a6 sago007 2008-08-29 14:32 637
                    return true;			//They are static
89c4a3a6 sago007 2008-08-29 14:32 638
        return false;					//Return false if no static object found
89c4a3a6 sago007 2008-08-29 14:32 639
    }
89c4a3a6 sago007 2008-08-29 14:32 640
89c4a3a6 sago007 2008-08-29 14:32 641
    /*
89c4a3a6 sago007 2008-08-29 14:32 642
     * Generates some blocks so the user don't see a board without blocks
89c4a3a6 sago007 2008-08-29 14:32 643
     */
89c4a3a6 sago007 2008-08-29 14:32 644
    //void putStartBlocks(Uint32);
89c4a3a6 sago007 2008-08-29 14:32 645
89c4a3a6 sago007 2008-08-29 14:32 646
    void putStartBlocks() {
89c4a3a6 sago007 2008-08-29 14:32 647
        putStartBlocks(time(0));
89c4a3a6 sago007 2008-08-29 14:32 648
    }
89c4a3a6 sago007 2008-08-29 14:32 649
89c4a3a6 sago007 2008-08-29 14:32 650
    void putStartBlocks(Uint32 n) {
89c4a3a6 sago007 2008-08-29 14:32 651
        for (int i=0;i<7;i++)
89c4a3a6 sago007 2008-08-29 14:32 652
            for (int j=0;j<30;j++) {
89c4a3a6 sago007 2008-08-29 14:32 653
                board[i][j] = -1;
89c4a3a6 sago007 2008-08-29 14:32 654
            }
89c4a3a6 sago007 2008-08-29 14:32 655
        nextRandomNumber = n;
89c4a3a6 sago007 2008-08-29 14:32 656
        int choice = rand2()%3; //Pick a random layout
89c4a3a6 sago007 2008-08-29 14:32 657
        switch (choice) {
89c4a3a6 sago007 2008-08-29 14:32 658
        case 0:
89c4a3a6 sago007 2008-08-29 14:32 659
            //row 0:
89c4a3a6 sago007 2008-08-29 14:32 660
            board[0][0]=1;
89c4a3a6 sago007 2008-08-29 14:32 661
            board[1][0]=0;
89c4a3a6 sago007 2008-08-29 14:32 662
            board[2][0]=4;
89c4a3a6 sago007 2008-08-29 14:32 663
            board[3][0]=3;
89c4a3a6 sago007 2008-08-29 14:32 664
            board[4][0]=3;
89c4a3a6 sago007 2008-08-29 14:32 665
            board[5][0]=5;
89c4a3a6 sago007 2008-08-29 14:32 666
            //row 1:
89c4a3a6 sago007 2008-08-29 14:32 667
            board[0][1]=1;
89c4a3a6 sago007 2008-08-29 14:32 668
            board[1][1]=4;
89c4a3a6 sago007 2008-08-29 14:32 669
            board[2][1]=2;
89c4a3a6 sago007 2008-08-29 14:32 670
            board[3][1]=0;
89c4a3a6 sago007 2008-08-29 14:32 671
            board[4][1]=4;
89c4a3a6 sago007 2008-08-29 14:32 672
            board[5][1]=5;
89c4a3a6 sago007 2008-08-29 14:32 673
            //row 2:
89c4a3a6 sago007 2008-08-29 14:32 674
            board[0][2]=2;
89c4a3a6 sago007 2008-08-29 14:32 675
            board[1][2]=3;
89c4a3a6 sago007 2008-08-29 14:32 676
            board[2][2]=0;
89c4a3a6 sago007 2008-08-29 14:32 677
            board[3][2]=4;
89c4a3a6 sago007 2008-08-29 14:32 678
            board[4][2]=1;
89c4a3a6 sago007 2008-08-29 14:32 679
            board[5][2]=1;
89c4a3a6 sago007 2008-08-29 14:32 680
            //row 3:
89c4a3a6 sago007 2008-08-29 14:32 681
            board[0][3]=3;
89c4a3a6 sago007 2008-08-29 14:32 682
            board[1][3]=2;
89c4a3a6 sago007 2008-08-29 14:32 683
            board[2][3]=3;
89c4a3a6 sago007 2008-08-29 14:32 684
            board[3][3]=1;
89c4a3a6 sago007 2008-08-29 14:32 685
            board[4][3]=0;
89c4a3a6 sago007 2008-08-29 14:32 686
            board[5][3]=4;
89c4a3a6 sago007 2008-08-29 14:32 687
            //row 4:
89c4a3a6 sago007 2008-08-29 14:32 688
            board[0][4]=2;
89c4a3a6 sago007 2008-08-29 14:32 689
            board[1][4]=3;
89c4a3a6 sago007 2008-08-29 14:32 690
            board[2][4]=3;
89c4a3a6 sago007 2008-08-29 14:32 691
            board[3][4]=1;
89c4a3a6 sago007 2008-08-29 14:32 692
            board[4][4]=4;
89c4a3a6 sago007 2008-08-29 14:32 693
            board[5][4]=0;
89c4a3a6 sago007 2008-08-29 14:32 694
            //row 5:
89c4a3a6 sago007 2008-08-29 14:32 695
            board[0][5]=-1;
89c4a3a6 sago007 2008-08-29 14:32 696
            board[1][5]=5;
89c4a3a6 sago007 2008-08-29 14:32 697
            board[2][5]=5;
89c4a3a6 sago007 2008-08-29 14:32 698
            board[3][5]=-1;
89c4a3a6 sago007 2008-08-29 14:32 699
            board[4][5]=1;
89c4a3a6 sago007 2008-08-29 14:32 700
            board[5][5]=-1;
89c4a3a6 sago007 2008-08-29 14:32 701
            break;
89c4a3a6 sago007 2008-08-29 14:32 702
        case 1:
89c4a3a6 sago007 2008-08-29 14:32 703
            //row 0:
89c4a3a6 sago007 2008-08-29 14:32 704
            board[0][0]=3;
89c4a3a6 sago007 2008-08-29 14:32 705
            board[1][0]=5;
89c4a3a6 sago007 2008-08-29 14:32 706
            board[2][0]=0;
89c4a3a6 sago007 2008-08-29 14:32 707
            board[3][0]=0;
89c4a3a6 sago007 2008-08-29 14:32 708
            board[4][0]=4;
89c4a3a6 sago007 2008-08-29 14:32 709
            board[5][0]=2;
89c4a3a6 sago007 2008-08-29 14:32 710
            //row 1:
89c4a3a6 sago007 2008-08-29 14:32 711
            board[0][1]=3;
89c4a3a6 sago007 2008-08-29 14:32 712
            board[1][1]=5;
89c4a3a6 sago007 2008-08-29 14:32 713
            board[2][1]=-1;
89c4a3a6 sago007 2008-08-29 14:32 714
            board[3][1]=5;
89c4a3a6 sago007 2008-08-29 14:32 715
            board[4][1]=4;
89c4a3a6 sago007 2008-08-29 14:32 716
            board[5][1]=2;
89c4a3a6 sago007 2008-08-29 14:32 717
            //row 2:
89c4a3a6 sago007 2008-08-29 14:32 718
            board[0][2]=2;
89c4a3a6 sago007 2008-08-29 14:32 719
            board[1][2]=-1;
89c4a3a6 sago007 2008-08-29 14:32 720
            board[2][2]=-1;
89c4a3a6 sago007 2008-08-29 14:32 721
            board[3][2]=4;
89c4a3a6 sago007 2008-08-29 14:32 722
            board[4][2]=0;
89c4a3a6 sago007 2008-08-29 14:32 723
            board[5][2]=3;
89c4a3a6 sago007 2008-08-29 14:32 724
            //row 3:
89c4a3a6 sago007 2008-08-29 14:32 725
            board[0][3]=2;
89c4a3a6 sago007 2008-08-29 14:32 726
            board[5][3]=3;
89c4a3a6 sago007 2008-08-29 14:32 727
            break;
89c4a3a6 sago007 2008-08-29 14:32 728
        default:
89c4a3a6 sago007 2008-08-29 14:32 729
            //row 0:
89c4a3a6 sago007 2008-08-29 14:32 730
            board[0][0]=4;
89c4a3a6 sago007 2008-08-29 14:32 731
            board[1][0]=5;
89c4a3a6 sago007 2008-08-29 14:32 732
            board[2][0]=2;
89c4a3a6 sago007 2008-08-29 14:32 733
            board[3][0]=0;
89c4a3a6 sago007 2008-08-29 14:32 734
            board[4][0]=1;
89c4a3a6 sago007 2008-08-29 14:32 735
            board[5][0]=5;
89c4a3a6 sago007 2008-08-29 14:32 736
            //row 1:
89c4a3a6 sago007 2008-08-29 14:32 737
            board[0][1]=4;
89c4a3a6 sago007 2008-08-29 14:32 738
            board[1][1]=5;
89c4a3a6 sago007 2008-08-29 14:32 739
            board[2][1]=2;
89c4a3a6 sago007 2008-08-29 14:32 740
            board[3][1]=1;
89c4a3a6 sago007 2008-08-29 14:32 741
            board[4][1]=0;
89c4a3a6 sago007 2008-08-29 14:32 742
            board[5][1]=2;
89c4a3a6 sago007 2008-08-29 14:32 743
            //row 2:
89c4a3a6 sago007 2008-08-29 14:32 744
            board[0][2]=2;
89c4a3a6 sago007 2008-08-29 14:32 745
            board[1][2]=4;
89c4a3a6 sago007 2008-08-29 14:32 746
            board[2][2]=-1;
89c4a3a6 sago007 2008-08-29 14:32 747
            board[3][2]=0;
89c4a3a6 sago007 2008-08-29 14:32 748
            board[4][2]=1;
89c4a3a6 sago007 2008-08-29 14:32 749
            board[5][2]=5;
89c4a3a6 sago007 2008-08-29 14:32 750
            //row 3:
89c4a3a6 sago007 2008-08-29 14:32 751
            board[0][3]=4;
89c4a3a6 sago007 2008-08-29 14:32 752
            board[1][3]=2;
89c4a3a6 sago007 2008-08-29 14:32 753
            board[2][3]=-1;
89c4a3a6 sago007 2008-08-29 14:32 754
            board[3][3]=1;
89c4a3a6 sago007 2008-08-29 14:32 755
            board[4][3]=0;
89c4a3a6 sago007 2008-08-29 14:32 756
            board[5][3]=2;
89c4a3a6 sago007 2008-08-29 14:32 757
            //row 4:
89c4a3a6 sago007 2008-08-29 14:32 758
            board[0][4]=4;
89c4a3a6 sago007 2008-08-29 14:32 759
            board[1][4]=2;
89c4a3a6 sago007 2008-08-29 14:32 760
            board[2][4]=-1;
89c4a3a6 sago007 2008-08-29 14:32 761
            board[3][4]=0;
89c4a3a6 sago007 2008-08-29 14:32 762
            board[4][4]=1;
89c4a3a6 sago007 2008-08-29 14:32 763
            board[5][4]=-1;
89c4a3a6 sago007 2008-08-29 14:32 764
            break;
89c4a3a6 sago007 2008-08-29 14:32 765
        };
89c4a3a6 sago007 2008-08-29 14:32 766
    }
89c4a3a6 sago007 2008-08-29 14:32 767
89c4a3a6 sago007 2008-08-29 14:32 768
    //decreases hang for all hanging blocks and wait for waiting blocks
89c4a3a6 sago007 2008-08-29 14:32 769
    void ReduceStuff() {
89c4a3a6 sago007 2008-08-29 14:32 770
        Uint32 howMuchHang = (SDL_GetTicks() - FRAMELENGTH*hangTicks)/FRAMELENGTH;
89c4a3a6 sago007 2008-08-29 14:32 771
        if (howMuchHang>0) {
89c4a3a6 sago007 2008-08-29 14:32 772
            for (int i=0; i<7; i++)
89c4a3a6 sago007 2008-08-29 14:32 773
                for (int j=0; j<30; j++) {
89c4a3a6 sago007 2008-08-29 14:32 774
                    if ((board[i][j]/BLOCKHANG)%10==1) {
89c4a3a6 sago007 2008-08-29 14:32 775
                        int hangNumber = (board[i][j]/10)%100;
89c4a3a6 sago007 2008-08-29 14:32 776
                        if (hangNumber<=howMuchHang) {
89c4a3a6 sago007 2008-08-29 14:32 777
                            board[i][j]-=BLOCKHANG;
89c4a3a6 sago007 2008-08-29 14:32 778
                            board[i][j]-=hangNumber*10;
89c4a3a6 sago007 2008-08-29 14:32 779
                        }
89c4a3a6 sago007 2008-08-29 14:32 780
                        else {
89c4a3a6 sago007 2008-08-29 14:32 781
                            board[i][j]-=10*howMuchHang;
89c4a3a6 sago007 2008-08-29 14:32 782
                        }
89c4a3a6 sago007 2008-08-29 14:32 783
                    }
89c4a3a6 sago007 2008-08-29 14:32 784
                    if ((board[i][j]/BLOCKWAIT)%10==1) {
89c4a3a6 sago007 2008-08-29 14:32 785
                        int hangNumber = (board[i][j]/10)%100;
89c4a3a6 sago007 2008-08-29 14:32 786
                        if (hangNumber<=howMuchHang) {
89c4a3a6 sago007 2008-08-29 14:32 787
                            //The blocks must be cleared
89c4a3a6 sago007 2008-08-29 14:32 788
                            board[i][j]-=hangNumber*10;
89c4a3a6 sago007 2008-08-29 14:32 789
                        }
89c4a3a6 sago007 2008-08-29 14:32 790
                        else {
89c4a3a6 sago007 2008-08-29 14:32 791
                            board[i][j]-=10*howMuchHang;
89c4a3a6 sago007 2008-08-29 14:32 792
                        }
89c4a3a6 sago007 2008-08-29 14:32 793
                    }
89c4a3a6 sago007 2008-08-29 14:32 794
                }
89c4a3a6 sago007 2008-08-29 14:32 795
        }
89c4a3a6 sago007 2008-08-29 14:32 796
        hangTicks+=howMuchHang;
89c4a3a6 sago007 2008-08-29 14:32 797
    }
89c4a3a6 sago007 2008-08-29 14:32 798
89c4a3a6 sago007 2008-08-29 14:32 799
    //Creates garbage using a given wide and height
89c4a3a6 sago007 2008-08-29 14:32 800
    bool CreateGarbage(int wide, int height) {
91886cae sago007 2008-09-12 16:28 801
#if NETWORK
89c4a3a6 sago007 2008-08-29 14:32 802
        if (bNetworkPlayer) {
89c4a3a6 sago007 2008-08-29 14:32 803
            pushGarbage(wide, height, 0);
89c4a3a6 sago007 2008-08-29 14:32 804
        }
89c4a3a6 sago007 2008-08-29 14:32 805
        else
89c4a3a6 sago007 2008-08-29 14:32 806
#endif
89c4a3a6 sago007 2008-08-29 14:32 807
        {
89c4a3a6 sago007 2008-08-29 14:32 808
            if (wide>6) wide = 6;
89c4a3a6 sago007 2008-08-29 14:32 809
            if (height>12) height = 12;
89c4a3a6 sago007 2008-08-29 14:32 810
            int startPosition = 12;
89c4a3a6 sago007 2008-08-29 14:32 811
            while ((!(LineEmpty(startPosition))) || (startPosition == 29))
89c4a3a6 sago007 2008-08-29 14:32 812
                startPosition++;
89c4a3a6 sago007 2008-08-29 14:32 813
            if (startPosition == 29) return false; //failed to place blocks
89c4a3a6 sago007 2008-08-29 14:32 814
            if (29-startPosition<height) return false;	//not enough space
89c4a3a6 sago007 2008-08-29 14:32 815
            int start, end;
89c4a3a6 sago007 2008-08-29 14:32 816
            if (bGarbageFallLeft)
89c4a3a6 sago007 2008-08-29 14:32 817
            {
89c4a3a6 sago007 2008-08-29 14:32 818
                start=0;
89c4a3a6 sago007 2008-08-29 14:32 819
                end=start+wide;
ce6b7121 sago007 2009-03-07 14:40 820
                bGarbageFallLeft = false;
89c4a3a6 sago007 2008-08-29 14:32 821
            }
89c4a3a6 sago007 2008-08-29 14:32 822
            else
89c4a3a6 sago007 2008-08-29 14:32 823
            {
89c4a3a6 sago007 2008-08-29 14:32 824
                start=6-wide;
89c4a3a6 sago007 2008-08-29 14:32 825
                end = 6;
ce6b7121 sago007 2009-03-07 14:40 826
                bGarbageFallLeft = true;
89c4a3a6 sago007 2008-08-29 14:32 827
            }
89c4a3a6 sago007 2008-08-29 14:32 828
            for (int i = startPosition; i <startPosition+height; i++)
89c4a3a6 sago007 2008-08-29 14:32 829
                for (int j = start; j < end; j++) {
89c4a3a6 sago007 2008-08-29 14:32 830
                    board[j][i] = 1000000+nextGarbageNumber;
89c4a3a6 sago007 2008-08-29 14:32 831
                }
89c4a3a6 sago007 2008-08-29 14:32 832
            nextGarbageNumber++;
89c4a3a6 sago007 2008-08-29 14:32 833
            if (nextGarbageNumber>999999) nextGarbageNumber = 10;
ce6b7121 sago007 2009-03-07 14:40 834
            //bGarbageFallLeft = !(bGarbageFallLeft);
89c4a3a6 sago007 2008-08-29 14:32 835
            return true;
89c4a3a6 sago007 2008-08-29 14:32 836
        }
89c4a3a6 sago007 2008-08-29 14:32 837
    }
89c4a3a6 sago007 2008-08-29 14:32 838
89c4a3a6 sago007 2008-08-29 14:32 839
    //Creates garbage using a given wide and height
89c4a3a6 sago007 2008-08-29 14:32 840
    bool CreateGreyGarbage() {
91886cae sago007 2008-09-12 16:28 841
#if NETWORK
89c4a3a6 sago007 2008-08-29 14:32 842
        if (bNetworkPlayer) {
89c4a3a6 sago007 2008-08-29 14:32 843
            pushGarbage(6, 1, 1);
89c4a3a6 sago007 2008-08-29 14:32 844
        }
89c4a3a6 sago007 2008-08-29 14:32 845
        else
89c4a3a6 sago007 2008-08-29 14:32 846
#endif
89c4a3a6 sago007 2008-08-29 14:32 847
        {
89c4a3a6 sago007 2008-08-29 14:32 848
            int startPosition = 12;
89c4a3a6 sago007 2008-08-29 14:32 849
            while ((!(LineEmpty(startPosition))) || (startPosition == 29))
89c4a3a6 sago007 2008-08-29 14:32 850
                startPosition++;
89c4a3a6 sago007 2008-08-29 14:32 851
            if (startPosition == 29) return false; //failed to place blocks
89c4a3a6 sago007 2008-08-29 14:32 852
            if (29-startPosition<1) return false;	//not enough space
89c4a3a6 sago007 2008-08-29 14:32 853
            int start, end;
89c4a3a6 sago007 2008-08-29 14:32 854
            {
89c4a3a6 sago007 2008-08-29 14:32 855
                start=0;
89c4a3a6 sago007 2008-08-29 14:32 856
                end=6;
89c4a3a6 sago007 2008-08-29 14:32 857
            }
89c4a3a6 sago007 2008-08-29 14:32 858
            for (int i = startPosition; i <startPosition+1; i++)
89c4a3a6 sago007 2008-08-29 14:32 859
                for (int j = start; j < end; j++) {
89c4a3a6 sago007 2008-08-29 14:32 860
                    board[j][i] = 2*1000000+nextGarbageNumber;
89c4a3a6 sago007 2008-08-29 14:32 861
                }
89c4a3a6 sago007 2008-08-29 14:32 862
            nextGarbageNumber++;
89c4a3a6 sago007 2008-08-29 14:32 863
            if (nextGarbageNumber>999999) nextGarbageNumber = 10;
89c4a3a6 sago007 2008-08-29 14:32 864
            return true;
89c4a3a6 sago007 2008-08-29 14:32 865
        }
89c4a3a6 sago007 2008-08-29 14:32 866
    }
89c4a3a6 sago007 2008-08-29 14:32 867
89c4a3a6 sago007 2008-08-29 14:32 868
89c4a3a6 sago007 2008-08-29 14:32 869
    //Clears garbage, must take one the lower left corner!
89c4a3a6 sago007 2008-08-29 14:32 870
    int GarbageClearer(int x, int y, int number, bool aLineToClear, int chain) {
89c4a3a6 sago007 2008-08-29 14:32 871
        if ((board[x][y])%1000000 != number) return -1;
89c4a3a6 sago007 2008-08-29 14:32 872
        if (aLineToClear) {
89c4a3a6 sago007 2008-08-29 14:32 873
            board[x][y] = rand() % 6;
89c4a3a6 sago007 2008-08-29 14:32 874
            board[x][y] += 10*HANGTIME+BLOCKHANG+CHAINPLACE*chain;
89c4a3a6 sago007 2008-08-29 14:32 875
        }
89c4a3a6 sago007 2008-08-29 14:32 876
        garbageToBeCleared[x][y] = false;
89c4a3a6 sago007 2008-08-29 14:32 877
        GarbageClearer(x+1, y, number, aLineToClear, chain);
89c4a3a6 sago007 2008-08-29 14:32 878
        GarbageClearer(x, y+1, number, false, chain);
89c4a3a6 sago007 2008-08-29 14:32 879
        return 1;
89c4a3a6 sago007 2008-08-29 14:32 880
    }
89c4a3a6 sago007 2008-08-29 14:32 881
89c4a3a6 sago007 2008-08-29 14:32 882
    //Marks garbage that must be cleared
89c4a3a6 sago007 2008-08-29 14:32 883
    int GarbageMarker(int x, int y) {
89c4a3a6 sago007 2008-08-29 14:32 884
        if ((x>6)||(x<0)||(y<0)||(y>29)) return -1;
89c4a3a6 sago007 2008-08-29 14:32 885
        if (((board[x][y])/1000000 == 1)&&(garbageToBeCleared[x][y] == false)) {
89c4a3a6 sago007 2008-08-29 14:32 886
            garbageToBeCleared[x][y] = true;
89c4a3a6 sago007 2008-08-29 14:32 887
            //Float fill
89c4a3a6 sago007 2008-08-29 14:32 888
            GarbageMarker(x-1, y);
89c4a3a6 sago007 2008-08-29 14:32 889
            GarbageMarker(x+1, y);
89c4a3a6 sago007 2008-08-29 14:32 890
            GarbageMarker(x, y-1);
89c4a3a6 sago007 2008-08-29 14:32 891
            GarbageMarker(x, y+1);
89c4a3a6 sago007 2008-08-29 14:32 892
        }
89c4a3a6 sago007 2008-08-29 14:32 893
        return 1;
89c4a3a6 sago007 2008-08-29 14:32 894
    }
89c4a3a6 sago007 2008-08-29 14:32 895
89c4a3a6 sago007 2008-08-29 14:32 896
    int FirstGarbageMarker(int x, int y) {
89c4a3a6 sago007 2008-08-29 14:32 897
        if ((x>6)||(x<0)||(y<0)||(y>29)) return -1;
89c4a3a6 sago007 2008-08-29 14:32 898
        if (((board[x][y])/1000000 == 2)&&(garbageToBeCleared[x][y] == false)) {
89c4a3a6 sago007 2008-08-29 14:32 899
            for (int i=0;i<6;i++)
89c4a3a6 sago007 2008-08-29 14:32 900
                garbageToBeCleared[i][y] = true;
89c4a3a6 sago007 2008-08-29 14:32 901
        }
89c4a3a6 sago007 2008-08-29 14:32 902
        else
89c4a3a6 sago007 2008-08-29 14:32 903
            if (((board[x][y])/1000000 == 1)&&(garbageToBeCleared[x][y] == false)) {
89c4a3a6 sago007 2008-08-29 14:32 904
                garbageToBeCleared[x][y] = true;
89c4a3a6 sago007 2008-08-29 14:32 905
                //Float fill
89c4a3a6 sago007 2008-08-29 14:32 906
                GarbageMarker(x-1, y);
89c4a3a6 sago007 2008-08-29 14:32 907
                GarbageMarker(x+1, y);
89c4a3a6 sago007 2008-08-29 14:32 908
                GarbageMarker(x, y-1);
89c4a3a6 sago007 2008-08-29 14:32 909
                GarbageMarker(x, y+1);
89c4a3a6 sago007 2008-08-29 14:32 910
            }
89c4a3a6 sago007 2008-08-29 14:32 911
        return 1;
89c4a3a6 sago007 2008-08-29 14:32 912
    }
89c4a3a6 sago007 2008-08-29 14:32 913
89c4a3a6 sago007 2008-08-29 14:32 914
    //Clear Blocks if 3 or more is alligned (naive implemented)
89c4a3a6 sago007 2008-08-29 14:32 915
    void ClearBlocks() {
89c4a3a6 sago007 2008-08-29 14:32 916
89c4a3a6 sago007 2008-08-29 14:32 917
        bool toBeCleared[7][30]; //true if blok must be removed
89c4a3a6 sago007 2008-08-29 14:32 918
89c4a3a6 sago007 2008-08-29 14:32 919
        int previus=-1; //the last block checked
89c4a3a6 sago007 2008-08-29 14:32 920
        int combo=0;
89c4a3a6 sago007 2008-08-29 14:32 921
        for (int i=0;i<30;i++)
89c4a3a6 sago007 2008-08-29 14:32 922
            for (int j=0;j<7;j++) {
89c4a3a6 sago007 2008-08-29 14:32 923
                toBeCleared[j][i] = false;
89c4a3a6 sago007 2008-08-29 14:32 924
                garbageToBeCleared[j][i] = false;
89c4a3a6 sago007 2008-08-29 14:32 925
            }
89c4a3a6 sago007 2008-08-29 14:32 926
        for (int i=0;i<7;i++) {
89c4a3a6 sago007 2008-08-29 14:32 927
            bool faaling = false;
89c4a3a6 sago007 2008-08-29 14:32 928
            for (int j=0;j<30;j++) {
89c4a3a6 sago007 2008-08-29 14:32 929
                if ((faaling)&&(board[i][j]>-1)&&(board[i][j]%10000000<7)) {
89c4a3a6 sago007 2008-08-29 14:32 930
                    board[i][j]+=BLOCKFALL;
89c4a3a6 sago007 2008-08-29 14:32 931
                }
89c4a3a6 sago007 2008-08-29 14:32 932
                if ((!faaling)&&((board[i][j]/BLOCKFALL)%10==1))
89c4a3a6 sago007 2008-08-29 14:32 933
                    board[i][j]-=BLOCKFALL;
89c4a3a6 sago007 2008-08-29 14:32 934
                if (!((board[i][j]>-1)&&(board[i][j]%10000000<7)))
89c4a3a6 sago007 2008-08-29 14:32 935
                    faaling=true;
89c4a3a6 sago007 2008-08-29 14:32 936
                if (((board[i][j]/1000000)%10==1)||((board[i][j]/1000000)%10==2)||((board[i][j]/BLOCKHANG)%10==1)||((board[i][j]/BLOCKWAIT)%10==1))
89c4a3a6 sago007 2008-08-29 14:32 937
                    faaling = false;
89c4a3a6 sago007 2008-08-29 14:32 938
            }
89c4a3a6 sago007 2008-08-29 14:32 939
        }
89c4a3a6 sago007 2008-08-29 14:32 940
89c4a3a6 sago007 2008-08-29 14:32 941
89c4a3a6 sago007 2008-08-29 14:32 942
        for (int j=0;j<7;j++) {
89c4a3a6 sago007 2008-08-29 14:32 943
            previus = -1;
89c4a3a6 sago007 2008-08-29 14:32 944
            combo=0;
89c4a3a6 sago007 2008-08-29 14:32 945
89c4a3a6 sago007 2008-08-29 14:32 946
            for (int i=1;i<30;i++) {
89c4a3a6 sago007 2008-08-29 14:32 947
                if ((board[j][i]>-1)&&(board[j][i]%10000000<7)) {
89c4a3a6 sago007 2008-08-29 14:32 948
                    if (board[j][i]%10000000 == previus) {
89c4a3a6 sago007 2008-08-29 14:32 949
                        combo++;
89c4a3a6 sago007 2008-08-29 14:32 950
                    }
89c4a3a6 sago007 2008-08-29 14:32 951
                    else {
89c4a3a6 sago007 2008-08-29 14:32 952
                        if (combo>2)
89c4a3a6 sago007 2008-08-29 14:32 953
                            for (int k = i-combo; k<i;k++) {
89c4a3a6 sago007 2008-08-29 14:32 954
                                toBeCleared[j][k] = true;
89c4a3a6 sago007 2008-08-29 14:32 955
                            }
89c4a3a6 sago007 2008-08-29 14:32 956
                        combo=1;
89c4a3a6 sago007 2008-08-29 14:32 957
                        previus = board[j][i]%10000000;
89c4a3a6 sago007 2008-08-29 14:32 958
                    }
89c4a3a6 sago007 2008-08-29 14:32 959
                } //if board
89c4a3a6 sago007 2008-08-29 14:32 960
                else {
89c4a3a6 sago007 2008-08-29 14:32 961
                    if (combo>2)
89c4a3a6 sago007 2008-08-29 14:32 962
                        for (int k = i-combo; k<i;k++) {
89c4a3a6 sago007 2008-08-29 14:32 963
                            toBeCleared[j][k] = true;
89c4a3a6 sago007 2008-08-29 14:32 964
                        }
89c4a3a6 sago007 2008-08-29 14:32 965
                    combo = 0;
89c4a3a6 sago007 2008-08-29 14:32 966
                    previus = -1;
89c4a3a6 sago007 2008-08-29 14:32 967
                }
89c4a3a6 sago007 2008-08-29 14:32 968
89c4a3a6 sago007 2008-08-29 14:32 969
            } //for i
89c4a3a6 sago007 2008-08-29 14:32 970
        } //for j
89c4a3a6 sago007 2008-08-29 14:32 971
89c4a3a6 sago007 2008-08-29 14:32 972
89c4a3a6 sago007 2008-08-29 14:32 973
        combo = 0;
89c4a3a6 sago007 2008-08-29 14:32 974
        chain = 0;
89c4a3a6 sago007 2008-08-29 14:32 975
        for (int i=0; i<6;i++)
89c4a3a6 sago007 2008-08-29 14:32 976
            for (int j=0; j<30;j++) {
89c4a3a6 sago007 2008-08-29 14:32 977
                //Clears blocks marked for clearing
89c4a3a6 sago007 2008-08-29 14:32 978
                Sint32 temp=board[i][j];
89c4a3a6 sago007 2008-08-29 14:32 979
                if (1==((temp/BLOCKWAIT)%10))
89c4a3a6 sago007 2008-08-29 14:32 980
                    if (((temp/10)%100)==0) {
89c4a3a6 sago007 2008-08-29 14:32 981
                        if (chainSize[chain]<chainSize[board[i][j]/10000000])
89c4a3a6 sago007 2008-08-29 14:32 982
                            chain = board[i][j]/10000000;
89c4a3a6 sago007 2008-08-29 14:32 983
27ae0175 sago007 2009-01-30 06:02 984
                        theBallManeger.addBall(topx+40+i*bsize, topy+bsize*12-j*bsize, true, board[i][j]%10);
27ae0175 sago007 2009-01-30 06:02 985
                        theBallManeger.addBall(topx+i*bsize, topy+bsize*12-j*bsize, false, board[i][j]%10);
27ae0175 sago007 2009-01-30 06:02 986
                        theExplosionManeger.addExplosion(topx-10+i*bsize, topy+bsize*12-10-j*bsize);
89c4a3a6 sago007 2008-08-29 14:32 987
                        board[i][j]=-2;
89c4a3a6 sago007 2008-08-29 14:32 988
                    }
89c4a3a6 sago007 2008-08-29 14:32 989
            }
89c4a3a6 sago007 2008-08-29 14:32 990
        for (int i=0; i<7;i++) {
89c4a3a6 sago007 2008-08-29 14:32 991
            bool setChain=false;
89c4a3a6 sago007 2008-08-29 14:32 992
            for (int j=0; j<30;j++) {
89c4a3a6 sago007 2008-08-29 14:32 993
                if (board[i][j]==-1)
89c4a3a6 sago007 2008-08-29 14:32 994
                    setChain=false;
89c4a3a6 sago007 2008-08-29 14:32 995
                if (board[i][j]==-2) {
89c4a3a6 sago007 2008-08-29 14:32 996
                    board[i][j]=-1;
89c4a3a6 sago007 2008-08-29 14:32 997
                    setChain=true;
89c4a3a6 sago007 2008-08-29 14:32 998
                    if (SoundEnabled)Mix_PlayChannel(0, boing, 0);
89c4a3a6 sago007 2008-08-29 14:32 999
                }
89c4a3a6 sago007 2008-08-29 14:32 1000
                if (board[i][j]!=-1)
89c4a3a6 sago007 2008-08-29 14:32 1001
                    if ((setChain)&&((board[i][j]/GARBAGE)%10!=1)&&((board[i][j]/GARBAGE)%10!=2)) {
89c4a3a6 sago007 2008-08-29 14:32 1002
                        board[i][j]=((board[i][j]%CHAINPLACE)+CHAINPLACE*chain);
89c4a3a6 sago007 2008-08-29 14:32 1003
                        //somethingsGottaFall = true;
89c4a3a6 sago007 2008-08-29 14:32 1004
                    }
89c4a3a6 sago007 2008-08-29 14:32 1005
89c4a3a6 sago007 2008-08-29 14:32 1006
            }
89c4a3a6 sago007 2008-08-29 14:32 1007
        }
89c4a3a6 sago007 2008-08-29 14:32 1008
        combo=0;
89c4a3a6 sago007 2008-08-29 14:32 1009
        int startvalue;
89c4a3a6 sago007 2008-08-29 14:32 1010
        if (pixels == 0)
89c4a3a6 sago007 2008-08-29 14:32 1011
            startvalue=1;
89c4a3a6 sago007 2008-08-29 14:32 1012
        else
89c4a3a6 sago007 2008-08-29 14:32 1013
            startvalue=0;
89c4a3a6 sago007 2008-08-29 14:32 1014
        for (int i=startvalue;i<30;i++) {
89c4a3a6 sago007 2008-08-29 14:32 1015
            previus=-1;
89c4a3a6 sago007 2008-08-29 14:32 1016
            combo=0;
89c4a3a6 sago007 2008-08-29 14:32 1017
            for (int j=0;j<7;j++) {
89c4a3a6 sago007 2008-08-29 14:32 1018
                if (((board[j][i]>-1)&&(board[j][i]%10000000<7))) {
89c4a3a6 sago007 2008-08-29 14:32 1019
                    if (board[j][i]%10000000 == previus) {
89c4a3a6 sago007 2008-08-29 14:32 1020
                        combo++;
89c4a3a6 sago007 2008-08-29 14:32 1021
                    }
89c4a3a6 sago007 2008-08-29 14:32 1022
                    else {
89c4a3a6 sago007 2008-08-29 14:32 1023
                        if (combo>2)
89c4a3a6 sago007 2008-08-29 14:32 1024
                            for (int k = j-combo; k<j;k++) {
89c4a3a6 sago007 2008-08-29 14:32 1025
                                toBeCleared[k][i] = true;
89c4a3a6 sago007 2008-08-29 14:32 1026
                            }
89c4a3a6 sago007 2008-08-29 14:32 1027
                        combo=1;
89c4a3a6 sago007 2008-08-29 14:32 1028
                        previus = board[j][i]%10000000;
89c4a3a6 sago007 2008-08-29 14:32 1029
                    }
89c4a3a6 sago007 2008-08-29 14:32 1030
                } //if board
89c4a3a6 sago007 2008-08-29 14:32 1031
                else {
89c4a3a6 sago007 2008-08-29 14:32 1032
                    if (combo>2)
89c4a3a6 sago007 2008-08-29 14:32 1033
                        for (int k = j-combo; k<j;k++) {
89c4a3a6 sago007 2008-08-29 14:32 1034
                            toBeCleared[k][i] = true;
89c4a3a6 sago007 2008-08-29 14:32 1035
                        }
89c4a3a6 sago007 2008-08-29 14:32 1036
                    combo = 0;
89c4a3a6 sago007 2008-08-29 14:32 1037
                    previus = -1;
89c4a3a6 sago007 2008-08-29 14:32 1038
                }
89c4a3a6 sago007 2008-08-29 14:32 1039
89c4a3a6 sago007 2008-08-29 14:32 1040
            } //for j
89c4a3a6 sago007 2008-08-29 14:32 1041
        } //for i
89c4a3a6 sago007 2008-08-29 14:32 1042
        bool blockIsFalling[6][30]; //See that is falling
89c4a3a6 sago007 2008-08-29 14:32 1043
        for (int i=0;i<30;i++)
89c4a3a6 sago007 2008-08-29 14:32 1044
            for (int j=0;j<6;j++)
89c4a3a6 sago007 2008-08-29 14:32 1045
                blockIsFalling[j][i] = false;
89c4a3a6 sago007 2008-08-29 14:32 1046
89c4a3a6 sago007 2008-08-29 14:32 1047
89c4a3a6 sago007 2008-08-29 14:32 1048
89c4a3a6 sago007 2008-08-29 14:32 1049
        combo = 0;
89c4a3a6 sago007 2008-08-29 14:32 1050
        chain = 0;
89c4a3a6 sago007 2008-08-29 14:32 1051
        int grey = 0;
89c4a3a6 sago007 2008-08-29 14:32 1052
        for (int i=0;i<30;i++)
89c4a3a6 sago007 2008-08-29 14:32 1053
            for (int j=0;j<6;j++)
89c4a3a6 sago007 2008-08-29 14:32 1054
                if (toBeCleared[j][i]) {
89c4a3a6 sago007 2008-08-29 14:32 1055
                    //see if any garbage is around:
89c4a3a6 sago007 2008-08-29 14:32 1056
                    FirstGarbageMarker(j-1, i);
89c4a3a6 sago007 2008-08-29 14:32 1057
                    FirstGarbageMarker(j+1, i);
89c4a3a6 sago007 2008-08-29 14:32 1058
                    FirstGarbageMarker(j, i-1);
89c4a3a6 sago007 2008-08-29 14:32 1059
                    FirstGarbageMarker(j, i+1);
89c4a3a6 sago007 2008-08-29 14:32 1060
                    //that is checked now :-)
89c4a3a6 sago007 2008-08-29 14:32 1061
                    if (board[j][i]%10000000==6)
89c4a3a6 sago007 2008-08-29 14:32 1062
                        grey++;
89c4a3a6 sago007 2008-08-29 14:32 1063
                    if ((vsMode) && (grey>2) && (board[j][i]%10000000==6))
89c4a3a6 sago007 2008-08-29 14:32 1064
                        garbageTarget->CreateGreyGarbage();
89c4a3a6 sago007 2008-08-29 14:32 1065
                    if ((board[j][i]>-1)&&(board[j][i]%10000000<7))
89c4a3a6 sago007 2008-08-29 14:32 1066
                        board[j][i]+=BLOCKWAIT+10*FALLTIME;
89c4a3a6 sago007 2008-08-29 14:32 1067
89c4a3a6 sago007 2008-08-29 14:32 1068
                    if (chainSize[board[j][i]/10000000]>chainSize[chain])
89c4a3a6 sago007 2008-08-29 14:32 1069
                        chain=board[j][i]/10000000;
89c4a3a6 sago007 2008-08-29 14:32 1070
                    combo++;
89c4a3a6 sago007 2008-08-29 14:32 1071
                    stop+=140*combo;
89c4a3a6 sago007 2008-08-29 14:32 1072
                    score +=10;
89c4a3a6 sago007 2008-08-29 14:32 1073
                    if (combo>3)
89c4a3a6 sago007 2008-08-29 14:32 1074
                        score+=3*combo; //More points if more cleared simontanously
89c4a3a6 sago007 2008-08-29 14:32 1075
                }
89c4a3a6 sago007 2008-08-29 14:32 1076
        score+=chainSize[chain]*100;
89c4a3a6 sago007 2008-08-29 14:32 1077
        if (chain==0) {
89c4a3a6 sago007 2008-08-29 14:32 1078
            chain=firstUnusedChain();
89c4a3a6 sago007 2008-08-29 14:32 1079
            chainSize[chain]=0;
89c4a3a6 sago007 2008-08-29 14:32 1080
            chainUsed[chain]=true;
89c4a3a6 sago007 2008-08-29 14:32 1081
        }
89c4a3a6 sago007 2008-08-29 14:32 1082
        chainSize[chain]++;
89c4a3a6 sago007 2008-08-29 14:32 1083
        for (int i=0;i<30;i++)
89c4a3a6 sago007 2008-08-29 14:32 1084
            for (int j=0;j<6;j++) {
89c4a3a6 sago007 2008-08-29 14:32 1085
                //if(board[j][i]/10==(BLOCKWAIT+10*FALLTIME)/10)
89c4a3a6 sago007 2008-08-29 14:32 1086
                if (toBeCleared[j][i]) {
89c4a3a6 sago007 2008-08-29 14:32 1087
                    board[j][i]=(board[j][i]%10000000)+chain*10000000;
89c4a3a6 sago007 2008-08-29 14:32 1088
                }
89c4a3a6 sago007 2008-08-29 14:32 1089
            }
89c4a3a6 sago007 2008-08-29 14:32 1090
89c4a3a6 sago007 2008-08-29 14:32 1091
        { //This is here we add text to screen!
89c4a3a6 sago007 2008-08-29 14:32 1092
            bool dead = false;
89c4a3a6 sago007 2008-08-29 14:32 1093
            for (int i=29;i>=0;i--)
89c4a3a6 sago007 2008-08-29 14:32 1094
                for (int j=0;j<6;j++)
89c4a3a6 sago007 2008-08-29 14:32 1095
                    if (toBeCleared[j][i]) {
89c4a3a6 sago007 2008-08-29 14:32 1096
                        if (!dead) {
89c4a3a6 sago007 2008-08-29 14:32 1097
                            dead=true;
89c4a3a6 sago007 2008-08-29 14:32 1098
                            string tempS = itoa(chainSize[chain]);
89c4a3a6 sago007 2008-08-29 14:32 1099
                            if (chainSize[chain]>1)
27ae0175 sago007 2009-01-30 06:02 1100
                                theTextManeger.addText(topx-10+j*bsize, topy+12*bsize-i*bsize, tempS, 1000);
89c4a3a6 sago007 2008-08-29 14:32 1101
                        }
89c4a3a6 sago007 2008-08-29 14:32 1102
                    }
89c4a3a6 sago007 2008-08-29 14:32 1103
        } //This was there text was added
89c4a3a6 sago007 2008-08-29 14:32 1104
89c4a3a6 sago007 2008-08-29 14:32 1105
        if (vsMode)
89c4a3a6 sago007 2008-08-29 14:32 1106
            switch (combo) {
89c4a3a6 sago007 2008-08-29 14:32 1107
            case 0:
89c4a3a6 sago007 2008-08-29 14:32 1108
            case 1:
89c4a3a6 sago007 2008-08-29 14:32 1109
            case 2:
89c4a3a6 sago007 2008-08-29 14:32 1110
            case 3:
89c4a3a6 sago007 2008-08-29 14:32 1111
                break;
89c4a3a6 sago007 2008-08-29 14:32 1112
            case 4:
89c4a3a6 sago007 2008-08-29 14:32 1113
                garbageTarget->CreateGarbage(3, 1);
89c4a3a6 sago007 2008-08-29 14:32 1114
                break;
89c4a3a6 sago007 2008-08-29 14:32 1115
            case 5:
89c4a3a6 sago007 2008-08-29 14:32 1116
                garbageTarget->CreateGarbage(4, 1);
89c4a3a6 sago007 2008-08-29 14:32 1117
                break;
89c4a3a6 sago007 2008-08-29 14:32 1118
            case 6:
89c4a3a6 sago007 2008-08-29 14:32 1119
                garbageTarget->CreateGarbage(5, 1);
89c4a3a6 sago007 2008-08-29 14:32 1120
                break;
89c4a3a6 sago007 2008-08-29 14:32 1121
            case 7:
89c4a3a6 sago007 2008-08-29 14:32 1122
                garbageTarget->CreateGarbage(6, 1);
89c4a3a6 sago007 2008-08-29 14:32 1123
                break;
89c4a3a6 sago007 2008-08-29 14:32 1124
            case 8:
89c4a3a6 sago007 2008-08-29 14:32 1125
                garbageTarget->CreateGarbage(4, 1);
89c4a3a6 sago007 2008-08-29 14:32 1126
                garbageTarget->CreateGarbage(4, 1);
89c4a3a6 sago007 2008-08-29 14:32 1127
                break;
89c4a3a6 sago007 2008-08-29 14:32 1128
            case 9:
89c4a3a6 sago007 2008-08-29 14:32 1129
                garbageTarget->CreateGarbage(5, 1);
89c4a3a6 sago007 2008-08-29 14:32 1130
                garbageTarget->CreateGarbage(4, 1);
89c4a3a6 sago007 2008-08-29 14:32 1131
                break;
89c4a3a6 sago007 2008-08-29 14:32 1132
            case 10:
89c4a3a6 sago007 2008-08-29 14:32 1133
                garbageTarget->CreateGarbage(5, 1);
89c4a3a6 sago007 2008-08-29 14:32 1134
                garbageTarget->CreateGarbage(5, 1);
89c4a3a6 sago007 2008-08-29 14:32 1135
                break;
89c4a3a6 sago007 2008-08-29 14:32 1136
            case 11:
89c4a3a6 sago007 2008-08-29 14:32 1137
                garbageTarget->CreateGarbage(6, 1);
89c4a3a6 sago007 2008-08-29 14:32 1138
                garbageTarget->CreateGarbage(5, 1);
89c4a3a6 sago007 2008-08-29 14:32 1139
                break;
89c4a3a6 sago007 2008-08-29 14:32 1140
            case 12:
89c4a3a6 sago007 2008-08-29 14:32 1141
                garbageTarget->CreateGarbage(6, 1);
89c4a3a6 sago007 2008-08-29 14:32 1142
                garbageTarget->CreateGarbage(6, 1);
89c4a3a6 sago007 2008-08-29 14:32 1143
                break;
89c4a3a6 sago007 2008-08-29 14:32 1144
            case 13:
89c4a3a6 sago007 2008-08-29 14:32 1145
                garbageTarget->CreateGarbage(5, 1);
89c4a3a6 sago007 2008-08-29 14:32 1146
                garbageTarget->CreateGarbage(5, 1);
89c4a3a6 sago007 2008-08-29 14:32 1147
                garbageTarget->CreateGarbage(4, 1);
89c4a3a6 sago007 2008-08-29 14:32 1148
                break;
89c4a3a6 sago007 2008-08-29 14:32 1149
            default:
89c4a3a6 sago007 2008-08-29 14:32 1150
                garbageTarget->CreateGarbage(5, 1);
89c4a3a6 sago007 2008-08-29 14:32 1151
                garbageTarget->CreateGarbage(5, 1);
89c4a3a6 sago007 2008-08-29 14:32 1152
                garbageTarget->CreateGarbage(4, 1);
89c4a3a6 sago007 2008-08-29 14:32 1153
                break;
89c4a3a6 sago007 2008-08-29 14:32 1154
            }
89c4a3a6 sago007 2008-08-29 14:32 1155
        for (int i=0;i<30;i++)
89c4a3a6 sago007 2008-08-29 14:32 1156
            for (int j=0;j<6;j++)
89c4a3a6 sago007 2008-08-29 14:32 1157
                if (garbageToBeCleared[j][i]) {
89c4a3a6 sago007 2008-08-29 14:32 1158
                    GarbageClearer(j, i, board[j][i]%1000000, true, chain); //Clears the blocks and all blocks connected to it.
89c4a3a6 sago007 2008-08-29 14:32 1159
                }
89c4a3a6 sago007 2008-08-29 14:32 1160
89c4a3a6 sago007 2008-08-29 14:32 1161
        chain=0;
89c4a3a6 sago007 2008-08-29 14:32 1162
89c4a3a6 sago007 2008-08-29 14:32 1163
        //Break chains (if a block is stable it is resetted to (chain == 0)):
89c4a3a6 sago007 2008-08-29 14:32 1164
        for (int i=0;i<7;i++) {
89c4a3a6 sago007 2008-08-29 14:32 1165
            bool faaling = false;  //In the beginning we are NOT falling
89c4a3a6 sago007 2008-08-29 14:32 1166
            for (int j=0;j<30;j++) {
89c4a3a6 sago007 2008-08-29 14:32 1167
                if ((faaling)&&(board[i][j]>-1)&&(board[i][j]<7)) {
89c4a3a6 sago007 2008-08-29 14:32 1168
                    board[i][j]+=BLOCKFALL;
89c4a3a6 sago007 2008-08-29 14:32 1169
                }
89c4a3a6 sago007 2008-08-29 14:32 1170
                if ((!faaling)&&((board[i][j]/BLOCKFALL)%10==1))
89c4a3a6 sago007 2008-08-29 14:32 1171
                    board[i][j]-=BLOCKFALL;
89c4a3a6 sago007 2008-08-29 14:32 1172
                if ((!faaling)&&(board[i][j]>0)&&(board[i][j]/10000000!=0)&&((board[i][j]/BLOCKWAIT)%10!=1)&&((board[i][j]/BLOCKHANG)%10!=1)) {
89c4a3a6 sago007 2008-08-29 14:32 1173
                    if (chainSize[board[i][j]/10000000]>chainSize[chain])
89c4a3a6 sago007 2008-08-29 14:32 1174
                        chain=board[i][j]/10000000;
89c4a3a6 sago007 2008-08-29 14:32 1175
                    board[i][j]=board[i][j]%10000000;
89c4a3a6 sago007 2008-08-29 14:32 1176
                }
89c4a3a6 sago007 2008-08-29 14:32 1177
                if (!((board[i][j]>-1)&&(board[i][j]<7)))
89c4a3a6 sago007 2008-08-29 14:32 1178
                    faaling=true;
89c4a3a6 sago007 2008-08-29 14:32 1179
                if (((board[i][j]/1000000)%10==1)||((board[i][j]/BLOCKHANG)%10==1)||((board[i][j]/BLOCKWAIT)%10==1))
89c4a3a6 sago007 2008-08-29 14:32 1180
                    faaling = false;
89c4a3a6 sago007 2008-08-29 14:32 1181
            }
89c4a3a6 sago007 2008-08-29 14:32 1182
        }
89c4a3a6 sago007 2008-08-29 14:32 1183
89c4a3a6 sago007 2008-08-29 14:32 1184
        //Create garbage as a result
89c4a3a6 sago007 2008-08-29 14:32 1185
        //if((vsMode)&&(chainSize[chain]>1)) garbageTarget->CreateGarbage(6,chainSize[chain]-1);
89c4a3a6 sago007 2008-08-29 14:32 1186
89c4a3a6 sago007 2008-08-29 14:32 1187
        //Calculate chain
89c4a3a6 sago007 2008-08-29 14:32 1188
        chain=0;
89c4a3a6 sago007 2008-08-29 14:32 1189
        for (int i=0; i<6;i++)
89c4a3a6 sago007 2008-08-29 14:32 1190
            for (int j=0; j<30;j++) {
89c4a3a6 sago007 2008-08-29 14:32 1191
                if (chainSize[board[i][j]/10000000]>chain)
89c4a3a6 sago007 2008-08-29 14:32 1192
                    chain=chainSize[board[i][j]/10000000];
89c4a3a6 sago007 2008-08-29 14:32 1193
            }
89c4a3a6 sago007 2008-08-29 14:32 1194
89c4a3a6 sago007 2008-08-29 14:32 1195
        //Make space in table for more things
89c4a3a6 sago007 2008-08-29 14:32 1196
        if (chain==0)
89c4a3a6 sago007 2008-08-29 14:32 1197
            for (int i=0;i<NUMBEROFCHAINS;i++)
89c4a3a6 sago007 2008-08-29 14:32 1198
                if (chainUsed[i]==true) {
89c4a3a6 sago007 2008-08-29 14:32 1199
                    if ((vsMode)&&(chainSize[i]>1)) garbageTarget->CreateGarbage(6, chainSize[i]-1);
89c4a3a6 sago007 2008-08-29 14:32 1200
                    if ((SoundEnabled)&&(chainSize[i]>4))Mix_PlayChannel(1, applause, 0);
fcd5a134 sago007 2008-12-19 01:11 1201
                    if(chainSize[i]>1 && !puzzleMode && !AI_Enabled)
89c4a3a6 sago007 2008-08-29 14:32 1202
                        Stats::getInstance()->addOne((string)"chainX"+itoa(chainSize[i]));
89c4a3a6 sago007 2008-08-29 14:32 1203
                    chainUsed[i]=false;
89c4a3a6 sago007 2008-08-29 14:32 1204
                }
89c4a3a6 sago007 2008-08-29 14:32 1205
    } //ClearBlocks
89c4a3a6 sago007 2008-08-29 14:32 1206
89c4a3a6 sago007 2008-08-29 14:32 1207
    //prints "Game Over" and ends game
89c4a3a6 sago007 2008-08-29 14:32 1208
    void SetGameOver() {
cd12e0fe sago007 2009-01-29 08:47 1209
        if (!bGameOver) {
cd12e0fe sago007 2009-01-29 08:47 1210
        	gameEndedAfter = SDL_GetTicks()-gameStartedAt; //We game ends now!
cd12e0fe sago007 2009-01-29 08:47 1211
		if(!AI_Enabled && !bReplaying)
cd12e0fe sago007 2009-01-29 08:47 1212
		{
cd12e0fe sago007 2009-01-29 08:47 1213
			TimeHandler::addTime("playTime",TimeHandler::ms2ct(gameEndedAfter));
cd12e0fe sago007 2009-01-29 08:47 1214
		}
cd12e0fe sago007 2009-01-29 08:47 1215
	}
e03ae476 sago007 2009-03-06 22:49 1216
        if(bReplaying)
e03ae476 sago007 2009-03-06 22:49 1217
        {
e03ae476 sago007 2009-03-06 22:49 1218
            bReplaying = false;
e03ae476 sago007 2009-03-06 22:49 1219
        }
c96f480e sago007 2009-03-28 18:59 1220
        else
c96f480e sago007 2009-03-28 18:59 1221
        {
c96f480e sago007 2009-03-28 18:59 1222
            strncpy(theReplay.name,name,30);
c96f480e sago007 2009-03-28 18:59 1223
        }
89c4a3a6 sago007 2008-08-29 14:32 1224
        theReplay.setFinalFrame(getPackage(), 0);
89c4a3a6 sago007 2008-08-29 14:32 1225
        bGameOver = true;
89c4a3a6 sago007 2008-08-29 14:32 1226
        showGame = false;
89c4a3a6 sago007 2008-08-29 14:32 1227
        if(stageClear)
89c4a3a6 sago007 2008-08-29 14:32 1228
            stageButtonStatus = SBstageClear;
89c4a3a6 sago007 2008-08-29 14:32 1229
    }
89c4a3a6 sago007 2008-08-29 14:32 1230
89c4a3a6 sago007 2008-08-29 14:32 1231
    //Moves all peaces a spot down if possible
89c4a3a6 sago007 2008-08-29 14:32 1232
    int FallBlock(int x, int y, int number) {
89c4a3a6 sago007 2008-08-29 14:32 1233
        if (y == 0) return -1;
89c4a3a6 sago007 2008-08-29 14:32 1234
        if (x>0)
89c4a3a6 sago007 2008-08-29 14:32 1235
            if (board[x-1][y] == number)
89c4a3a6 sago007 2008-08-29 14:32 1236
                return -1;
89c4a3a6 sago007 2008-08-29 14:32 1237
        int i=x;
89c4a3a6 sago007 2008-08-29 14:32 1238
        bool canFall = true;
89c4a3a6 sago007 2008-08-29 14:32 1239
        //checks a line of a garbage block and see if something is under it
89c4a3a6 sago007 2008-08-29 14:32 1240
        while ((board[i][y] == number)&&(canFall)&&(i<6)) {
89c4a3a6 sago007 2008-08-29 14:32 1241
            if (board[i][y-1] != -1) canFall = false;
89c4a3a6 sago007 2008-08-29 14:32 1242
            i++;
89c4a3a6 sago007 2008-08-29 14:32 1243
        }
89c4a3a6 sago007 2008-08-29 14:32 1244
        if (canFall) {
89c4a3a6 sago007 2008-08-29 14:32 1245
            //cout << "Now falling" << endl;
89c4a3a6 sago007 2008-08-29 14:32 1246
            for (int j = x;j<i;j++) {
89c4a3a6 sago007 2008-08-29 14:32 1247
                board[j][y-1] = board[j][y];
89c4a3a6 sago007 2008-08-29 14:32 1248
                board[j][y] = -1;
89c4a3a6 sago007 2008-08-29 14:32 1249
            }
89c4a3a6 sago007 2008-08-29 14:32 1250
        }
89c4a3a6 sago007 2008-08-29 14:32 1251
        return 0;
89c4a3a6 sago007 2008-08-29 14:32 1252
    }	//FallBlock
89c4a3a6 sago007 2008-08-29 14:32 1253
89c4a3a6 sago007 2008-08-29 14:32 1254
89c4a3a6 sago007 2008-08-29 14:32 1255
    //Makes all Garbage fall one spot
89c4a3a6 sago007 2008-08-29 14:32 1256
    void GarbageFall() {
89c4a3a6 sago007 2008-08-29 14:32 1257
        for (int i=0;i<30;i++)
89c4a3a6 sago007 2008-08-29 14:32 1258
            for (int j=0;j<7; j++) {
89c4a3a6 sago007 2008-08-29 14:32 1259
                if ((((board[j][i]/1000000)%10) == 1)||(((board[j][i]/1000000)%10) == 2))
89c4a3a6 sago007 2008-08-29 14:32 1260
                    FallBlock(j, i, board[j][i]);
89c4a3a6 sago007 2008-08-29 14:32 1261
            }
89c4a3a6 sago007 2008-08-29 14:32 1262
    }
89c4a3a6 sago007 2008-08-29 14:32 1263
89c4a3a6 sago007 2008-08-29 14:32 1264
    //Makes the blocks fall (it doesn't test time, this must be done before hand)
89c4a3a6 sago007 2008-08-29 14:32 1265
    void FallDown() {
89c4a3a6 sago007 2008-08-29 14:32 1266
        bool falling =false;        //nothing is moving unless proven otherwise
89c4a3a6 sago007 2008-08-29 14:32 1267
        for (int i=0;i<29;i++)
89c4a3a6 sago007 2008-08-29 14:32 1268
            for (int j=0;j<6;j++) {
89c4a3a6 sago007 2008-08-29 14:32 1269
                if ((board[j][i]==-1) && (board[j][i+1]!=-1) && (board[j][i+1]%BLOCKFALL<7)) {
89c4a3a6 sago007 2008-08-29 14:32 1270
                    board[j][i] = board[j][i+1];
89c4a3a6 sago007 2008-08-29 14:32 1271
                    board[j][i+1] = -1;
89c4a3a6 sago007 2008-08-29 14:32 1272
                    falling = true;              //something is moving!
89c4a3a6 sago007 2008-08-29 14:32 1273
                }
89c4a3a6 sago007 2008-08-29 14:32 1274
                if ((board[j][i]/BLOCKWAIT)%10==1)
89c4a3a6 sago007 2008-08-29 14:32 1275
                    falling=true;
89c4a3a6 sago007 2008-08-29 14:32 1276
            }
89c4a3a6 sago007 2008-08-29 14:32 1277
        if (!falling) //If nothing is falling
89c4a3a6 sago007 2008-08-29 14:32 1278
        {
89c4a3a6 sago007 2008-08-29 14:32 1279
            if ((puzzleMode)&&(!bGameOver)&&(MovesLeft==0)&&(!(BoardEmpty()))) {
89c4a3a6 sago007 2008-08-29 14:32 1280
                //Puzzle not won
89c4a3a6 sago007 2008-08-29 14:32 1281
                SetGameOver();
89c4a3a6 sago007 2008-08-29 14:32 1282
                stageButtonStatus = SBpuzzleMode;
89c4a3a6 sago007 2008-08-29 14:32 1283
            }
89c4a3a6 sago007 2008-08-29 14:32 1284
        }
89c4a3a6 sago007 2008-08-29 14:32 1285
        GarbageFall();		//Makes the garbage fall
89c4a3a6 sago007 2008-08-29 14:32 1286
        nrFellDown++;      //Sets number of this fall, so we know then the next will occur
89c4a3a6 sago007 2008-08-29 14:32 1287
    }
89c4a3a6 sago007 2008-08-29 14:32 1288
89c4a3a6 sago007 2008-08-29 14:32 1289
    //Moves the cursor, receaves N,S,E or W as a char an moves as desired
89c4a3a6 sago007 2008-08-29 14:32 1290
    void MoveCursor(char way) {
89c4a3a6 sago007 2008-08-29 14:32 1291
        if (!bGameOver)       //If game over nothing happends
89c4a3a6 sago007 2008-08-29 14:32 1292
        {
27ae0175 sago007 2009-01-30 06:02 1293
            if ((way == 'N') && ((cursory<10)||(TowerHeight>12) ||(((pixels==bsize)||(pixels==0)) && (cursory<11))))
89c4a3a6 sago007 2008-08-29 14:32 1294
                cursory++;
89c4a3a6 sago007 2008-08-29 14:32 1295
            if ((way == 'S') && (cursory>0))
89c4a3a6 sago007 2008-08-29 14:32 1296
                cursory--;
89c4a3a6 sago007 2008-08-29 14:32 1297
            if ((way == 'W') && (cursorx>0))
89c4a3a6 sago007 2008-08-29 14:32 1298
                cursorx--;
89c4a3a6 sago007 2008-08-29 14:32 1299
            if ((way == 'E') && (cursorx<4))
89c4a3a6 sago007 2008-08-29 14:32 1300
                cursorx++;
89c4a3a6 sago007 2008-08-29 14:32 1301
        }
89c4a3a6 sago007 2008-08-29 14:32 1302
    }
89c4a3a6 sago007 2008-08-29 14:32 1303
89c4a3a6 sago007 2008-08-29 14:32 1304
    //switches the two blocks at the cursor position, unless game over
89c4a3a6 sago007 2008-08-29 14:32 1305
    void SwitchAtCursor() {
89c4a3a6 sago007 2008-08-29 14:32 1306
        if ((board[cursorx][cursory+1]<7) && (board[cursorx+1][cursory+1]<7) && (!bGameOver) && ((!puzzleMode)||(MovesLeft>0)) && (gameStartedAt<SDL_GetTicks())) {
89c4a3a6 sago007 2008-08-29 14:32 1307
            int temp = board[cursorx][cursory+1];
89c4a3a6 sago007 2008-08-29 14:32 1308
            board[cursorx][cursory+1] = board[cursorx+1][cursory+1];
89c4a3a6 sago007 2008-08-29 14:32 1309
            board[cursorx+1][cursory+1] = temp;
89c4a3a6 sago007 2008-08-29 14:32 1310
        }
89c4a3a6 sago007 2008-08-29 14:32 1311
        if ((puzzleMode)&&(gameStartedAt<SDL_GetTicks())&&(MovesLeft>0)) MovesLeft--;
89c4a3a6 sago007 2008-08-29 14:32 1312
    }
89c4a3a6 sago007 2008-08-29 14:32 1313
89c4a3a6 sago007 2008-08-29 14:32 1314
    //Generates a new line and moves the field one block up (restart puzzle mode)
89c4a3a6 sago007 2008-08-29 14:32 1315
    void PushLine() {
89c4a3a6 sago007 2008-08-29 14:32 1316
        //If not game over, not high tower and not puzzle mode
89c4a3a6 sago007 2008-08-29 14:32 1317
        if ((!bGameOver) && TowerHeight<13 && (!puzzleMode) && (gameStartedAt<SDL_GetTicks())&&(chain==0)) {
89c4a3a6 sago007 2008-08-29 14:32 1318
            for (int i=19;i>0;i--)
89c4a3a6 sago007 2008-08-29 14:32 1319
                for (int j=0;j<6;j++) {
89c4a3a6 sago007 2008-08-29 14:32 1320
                    board[j][i] = board[j][i-1];
89c4a3a6 sago007 2008-08-29 14:32 1321
                }
89c4a3a6 sago007 2008-08-29 14:32 1322
            for (int j=0;j<6;j++) {
89c4a3a6 sago007 2008-08-29 14:32 1323
                board[j][0] = rand2() % 4;
89c4a3a6 sago007 2008-08-29 14:32 1324
                if (j > 0) {
89c4a3a6 sago007 2008-08-29 14:32 1325
                    if (board[j][0] == board[j-1][0])
89c4a3a6 sago007 2008-08-29 14:32 1326
                        board[j][0] = rand2() % 6;
89c4a3a6 sago007 2008-08-29 14:32 1327
                }
89c4a3a6 sago007 2008-08-29 14:32 1328
                if (board[j][0] == board[j][1])
89c4a3a6 sago007 2008-08-29 14:32 1329
                    board[j][0] = rand2() % 6;
89c4a3a6 sago007 2008-08-29 14:32 1330
                if (board[j][0] == board[j][1])
89c4a3a6 sago007 2008-08-29 14:32 1331
                    board[j][0] = rand2() % 6;
89c4a3a6 sago007 2008-08-29 14:32 1332
                while ((j>0)&&(board[j][0]==board[j-1][0]))
89c4a3a6 sago007 2008-08-29 14:32 1333
                    board[j][0] = rand2() % 6;
89c4a3a6 sago007 2008-08-29 14:32 1334
            }
89c4a3a6 sago007 2008-08-29 14:32 1335
            score+=1;
89c4a3a6 sago007 2008-08-29 14:32 1336
            MoveCursor('N');
89c4a3a6 sago007 2008-08-29 14:32 1337
            if (vsMode) {
89c4a3a6 sago007 2008-08-29 14:32 1338
                if (rand2()%6==1)
89c4a3a6 sago007 2008-08-29 14:32 1339
                    board[rand2()%6][0]=6;
89c4a3a6 sago007 2008-08-29 14:32 1340
            }
89c4a3a6 sago007 2008-08-29 14:32 1341
            pixels = 0;
89c4a3a6 sago007 2008-08-29 14:32 1342
            stop=0;
89c4a3a6 sago007 2008-08-29 14:32 1343
            pushedPixelAt = SDL_GetTicks();
89c4a3a6 sago007 2008-08-29 14:32 1344
            linesCleared++;
89c4a3a6 sago007 2008-08-29 14:32 1345
            AI_LineOffset++;
89c4a3a6 sago007 2008-08-29 14:32 1346
            nrPushedPixel=(int)((double)(pushedPixelAt-gameStartedAt)/(1000.0*speed));
89c4a3a6 sago007 2008-08-29 14:32 1347
            
89c4a3a6 sago007 2008-08-29 14:32 1348
            if(!AI_Enabled && !bReplaying)
89c4a3a6 sago007 2008-08-29 14:32 1349
            {
89c4a3a6 sago007 2008-08-29 14:32 1350
                Stats::getInstance()->addOne("linesPushed");
89c4a3a6 sago007 2008-08-29 14:32 1351
            }
89c4a3a6 sago007 2008-08-29 14:32 1352
        } //if !bGameOver
89c4a3a6 sago007 2008-08-29 14:32 1353
89c4a3a6 sago007 2008-08-29 14:32 1354
        //Restart Puzzle mode
89c4a3a6 sago007 2008-08-29 14:32 1355
        if (puzzleMode && !bGameOver) {
89c4a3a6 sago007 2008-08-29 14:32 1356
            //Reloads level
89c4a3a6 sago007 2008-08-29 14:32 1357
            MovesLeft = nrOfMovesAllowed[Level];
89c4a3a6 sago007 2008-08-29 14:32 1358
            for (int i=0;i<6;i++)
89c4a3a6 sago007 2008-08-29 14:32 1359
                for (int j=0;j<12;j++) {
89c4a3a6 sago007 2008-08-29 14:32 1360
                    board[i][j+1] = puzzleLevels[Level][i][j];
89c4a3a6 sago007 2008-08-29 14:32 1361
                }
89c4a3a6 sago007 2008-08-29 14:32 1362
            score=0;
89c4a3a6 sago007 2008-08-29 14:32 1363
            bGameOver=false;
89c4a3a6 sago007 2008-08-29 14:32 1364
            showGame = true;
89c4a3a6 sago007 2008-08-29 14:32 1365
        }
89c4a3a6 sago007 2008-08-29 14:32 1366
89c4a3a6 sago007 2008-08-29 14:32 1367
        if ((TowerHeight>12) && (!puzzleMode)&&(!bGameOver)&&(chain==0)) {
c09d0e4f sago007 2009-01-27 01:15 1368
            if ((!vsMode)&&(theTopScoresEndless.isHighScore(score))&&(!AI_Enabled)) {
89c4a3a6 sago007 2008-08-29 14:32 1369
                if (SoundEnabled)Mix_PlayChannel(1, applause, 0);
89c4a3a6 sago007 2008-08-29 14:32 1370
                theTopScoresEndless.addScore(name, score);
89c4a3a6 sago007 2008-08-29 14:32 1371
                cout << "New high score!" << endl;
89c4a3a6 sago007 2008-08-29 14:32 1372
            }
89c4a3a6 sago007 2008-08-29 14:32 1373
            SetGameOver();
89c4a3a6 sago007 2008-08-29 14:32 1374
        }
89c4a3a6 sago007 2008-08-29 14:32 1375
        
89c4a3a6 sago007 2008-08-29 14:32 1376
        
89c4a3a6 sago007 2008-08-29 14:32 1377
    }//PushLine
89c4a3a6 sago007 2008-08-29 14:32 1378
89c4a3a6 sago007 2008-08-29 14:32 1379
    //Pushes a single pixel, so it appears to scrool
89c4a3a6 sago007 2008-08-29 14:32 1380
    void PushPixels() {
89c4a3a6 sago007 2008-08-29 14:32 1381
        nrPushedPixel++;
27ae0175 sago007 2009-01-30 06:02 1382
        if ((pixels < bsize) && TowerHeight<13) {
89c4a3a6 sago007 2008-08-29 14:32 1383
            pixels++;
89c4a3a6 sago007 2008-08-29 14:32 1384
        }
89c4a3a6 sago007 2008-08-29 14:32 1385
        else
89c4a3a6 sago007 2008-08-29 14:32 1386
            PushLine();
27ae0175 sago007 2009-01-30 06:02 1387
        if (pixels>bsize)
89c4a3a6 sago007 2008-08-29 14:32 1388
            pixels=0;
89c4a3a6 sago007 2008-08-29 14:32 1389
    }
89c4a3a6 sago007 2008-08-29 14:32 1390
89c4a3a6 sago007 2008-08-29 14:32 1391
    //See how high the tower is, saved in integer TowerHeight
89c4a3a6 sago007 2008-08-29 14:32 1392
    /*void FindTowerHeight()
89c4a3a6 sago007 2008-08-29 14:32 1393
     * {
89c4a3a6 sago007 2008-08-29 14:32 1394
     * /*
89c4a3a6 sago007 2008-08-29 14:32 1395
     * This function needs to be corrected, if an empty line appears towerheight become to low!
89c4a3a6 sago007 2008-08-29 14:32 1396
     * /
89c4a3a6 sago007 2008-08-29 14:32 1397
     * bool found = false;
89c4a3a6 sago007 2008-08-29 14:32 1398
     * bool notNew = false;
89c4a3a6 sago007 2008-08-29 14:32 1399
     * TowerHeight = 0;
89c4a3a6 sago007 2008-08-29 14:32 1400
     * for(int i=0; i<19;i++)
89c4a3a6 sago007 2008-08-29 14:32 1401
     * //while(!found)
89c4a3a6 sago007 2008-08-29 14:32 1402
     * {
89c4a3a6 sago007 2008-08-29 14:32 1403
     * found = true;
89c4a3a6 sago007 2008-08-29 14:32 1404
     * for(int j=0;j<6;j++)
89c4a3a6 sago007 2008-08-29 14:32 1405
     * if(board[j][i] != -1)
89c4a3a6 sago007 2008-08-29 14:32 1406
     * found = false;
89c4a3a6 sago007 2008-08-29 14:32 1407
     * if((!found) && (notNew))
89c4a3a6 sago007 2008-08-29 14:32 1408
     * notNew =false;
89c4a3a6 sago007 2008-08-29 14:32 1409
     * if((found)&&(!notNew))
89c4a3a6 sago007 2008-08-29 14:32 1410
     * {
89c4a3a6 sago007 2008-08-29 14:32 1411
     * TowerHeight=i;
89c4a3a6 sago007 2008-08-29 14:32 1412
     * notNew = true;
89c4a3a6 sago007 2008-08-29 14:32 1413
     * }
89c4a3a6 sago007 2008-08-29 14:32 1414
     * }
89c4a3a6 sago007 2008-08-29 14:32 1415
     * TowerHeight--;
89c4a3a6 sago007 2008-08-29 14:32 1416
     * }*/
89c4a3a6 sago007 2008-08-29 14:32 1417
89c4a3a6 sago007 2008-08-29 14:32 1418
    //See how high the tower is, saved in integer TowerHeight
89c4a3a6 sago007 2008-08-29 14:32 1419
    void FindTowerHeight() {
89c4a3a6 sago007 2008-08-29 14:32 1420
        /*
89c4a3a6 sago007 2008-08-29 14:32 1421
         * Old implementation, used until I find the bug in the other.
89c4a3a6 sago007 2008-08-29 14:32 1422
         * This function has a bug in stage clear! if an empty line appears.
89c4a3a6 sago007 2008-08-29 14:32 1423
         */
89c4a3a6 sago007 2008-08-29 14:32 1424
        prevTowerHeight = TowerHeight;
89c4a3a6 sago007 2008-08-29 14:32 1425
        bool found = false;
89c4a3a6 sago007 2008-08-29 14:32 1426
        TowerHeight = 0;
89c4a3a6 sago007 2008-08-29 14:32 1427
        while (!found) {
89c4a3a6 sago007 2008-08-29 14:32 1428
            found = true;
89c4a3a6 sago007 2008-08-29 14:32 1429
            for (int j=0;j<6;j++)
89c4a3a6 sago007 2008-08-29 14:32 1430
                if (board[j][TowerHeight] != -1)
89c4a3a6 sago007 2008-08-29 14:32 1431
                    found = false;
89c4a3a6 sago007 2008-08-29 14:32 1432
            TowerHeight++;
89c4a3a6 sago007 2008-08-29 14:32 1433
        }
89c4a3a6 sago007 2008-08-29 14:32 1434
        TowerHeight--;
89c4a3a6 sago007 2008-08-29 14:32 1435
    }
89c4a3a6 sago007 2008-08-29 14:32 1436
89c4a3a6 sago007 2008-08-29 14:32 1437
///////////////////////////////////////////////////////////////////////////
89c4a3a6 sago007 2008-08-29 14:32 1438
/////////////////////////// AI starts here! ///////////////////////////////
89c4a3a6 sago007 2008-08-29 14:32 1439
///////////////////////////////////////////////////////////////////////////
89c4a3a6 sago007 2008-08-29 14:32 1440
    //First the helpet functions:
89c4a3a6 sago007 2008-08-29 14:32 1441
    int nrOfType(int line, int type) {
89c4a3a6 sago007 2008-08-29 14:32 1442
        // cout << "Start_ nrOfType" << endl;
89c4a3a6 sago007 2008-08-29 14:32 1443
        int counter = 0;
89c4a3a6 sago007 2008-08-29 14:32 1444
        for (int i=0; i<6; i++)
89c4a3a6 sago007 2008-08-29 14:32 1445
            if (board[i][line]==type)counter++;
89c4a3a6 sago007 2008-08-29 14:32 1446
        return counter;
89c4a3a6 sago007 2008-08-29 14:32 1447
    }
89c4a3a6 sago007 2008-08-29 14:32 1448
89c4a3a6 sago007 2008-08-29 14:32 1449
    int AIcolorToClear;
89c4a3a6 sago007 2008-08-29 14:32 1450
    int AIlineToClear;
89c4a3a6 sago007 2008-08-29 14:32 1451
89c4a3a6 sago007 2008-08-29 14:32 1452
    //See if a combo can be made in this line
89c4a3a6 sago007 2008-08-29 14:32 1453
    int horiInLine(int line) {
89c4a3a6 sago007 2008-08-29 14:32 1454
        //cout << "Start_ hori in line" << endl;
89c4a3a6 sago007 2008-08-29 14:32 1455
        int nrOfType[7] = {0, 0, 0, 0, 0, 0, 0};
89c4a3a6 sago007 2008-08-29 14:32 1456
        int iTemp;
89c4a3a6 sago007 2008-08-29 14:32 1457
        int max = 0;
89c4a3a6 sago007 2008-08-29 14:32 1458
        for (int i=0; i<6; i++) {
89c4a3a6 sago007 2008-08-29 14:32 1459
            iTemp = board[i][line];
89c4a3a6 sago007 2008-08-29 14:32 1460
            if ((iTemp>-1)&&(iTemp<7))
89c4a3a6 sago007 2008-08-29 14:32 1461
                nrOfType[iTemp]++;
89c4a3a6 sago007 2008-08-29 14:32 1462
        }
89c4a3a6 sago007 2008-08-29 14:32 1463
        for (int j=0; j<7; j++) {
89c4a3a6 sago007 2008-08-29 14:32 1464
            if (nrOfType[j]>max) {
89c4a3a6 sago007 2008-08-29 14:32 1465
                max = nrOfType[j];
89c4a3a6 sago007 2008-08-29 14:32 1466
                AIcolorToClear = j;
89c4a3a6 sago007 2008-08-29 14:32 1467
            }
89c4a3a6 sago007 2008-08-29 14:32 1468
        }
89c4a3a6 sago007 2008-08-29 14:32 1469
        return max;
89c4a3a6 sago007 2008-08-29 14:32 1470
    }
89c4a3a6 sago007 2008-08-29 14:32 1471
89c4a3a6 sago007 2008-08-29 14:32 1472
    bool horiClearPossible() {
89c4a3a6 sago007 2008-08-29 14:32 1473
        //cout << "Start_ horiclear possible" << endl;
89c4a3a6 sago007 2008-08-29 14:32 1474
        int i=13;
89c4a3a6 sago007 2008-08-29 14:32 1475
        bool solutionFound = false;
89c4a3a6 sago007 2008-08-29 14:32 1476
        do{
89c4a3a6 sago007 2008-08-29 14:32 1477
            if (horiInLine(i)>2) {
89c4a3a6 sago007 2008-08-29 14:32 1478
                AI_LineOffset = 0;
89c4a3a6 sago007 2008-08-29 14:32 1479
                AIlineToClear = i;
89c4a3a6 sago007 2008-08-29 14:32 1480
                solutionFound = true;
89c4a3a6 sago007 2008-08-29 14:32 1481
            }
89c4a3a6 sago007 2008-08-29 14:32 1482
            i--;
89c4a3a6 sago007 2008-08-29 14:32 1483
        }while ((!solutionFound)&&(i>0));
89c4a3a6 sago007 2008-08-29 14:32 1484
        return solutionFound;
89c4a3a6 sago007 2008-08-29 14:32 1485
    }
89c4a3a6 sago007 2008-08-29 14:32 1486
89c4a3a6 sago007 2008-08-29 14:32 1487
    //the Line Has Unmoveable Objects witch might stall the AI
89c4a3a6 sago007 2008-08-29 14:32 1488
    bool lineHasGarbage(int line) {
89c4a3a6 sago007 2008-08-29 14:32 1489
        for (int i=0;i<6;i++)
89c4a3a6 sago007 2008-08-29 14:32 1490
            if (board[i][line]>1000000)
89c4a3a6 sago007 2008-08-29 14:32 1491
                return true;
89c4a3a6 sago007 2008-08-29 14:32 1492
        return false;
89c4a3a6 sago007 2008-08-29 14:32 1493
    }
89c4a3a6 sago007 2008-08-29 14:32 1494
89c4a3a6 sago007 2008-08-29 14:32 1495
    //Types 0..6 in line
89c4a3a6 sago007 2008-08-29 14:32 1496
    inline int nrOfRealTypes(int line) {
89c4a3a6 sago007 2008-08-29 14:32 1497
        //cout << "Start_ nrOfReal" << endl;
89c4a3a6 sago007 2008-08-29 14:32 1498
        int counter = 0;
89c4a3a6 sago007 2008-08-29 14:32 1499
        for (int i=0; i<6; i++)
89c4a3a6 sago007 2008-08-29 14:32 1500
            if ((board[i][line]>-1)&&(board[i][line]<7))counter++;
89c4a3a6 sago007 2008-08-29 14:32 1501
        return counter;
89c4a3a6 sago007 2008-08-29 14:32 1502
    }
89c4a3a6 sago007 2008-08-29 14:32 1503
89c4a3a6 sago007 2008-08-29 14:32 1504
    //See if there is a tower
89c4a3a6 sago007 2008-08-29 14:32 1505
    bool ThereIsATower() {
89c4a3a6 sago007 2008-08-29 14:32 1506
        //cout << "Start_ there is a tower" << endl;
89c4a3a6 sago007 2008-08-29 14:32 1507
        bool bThereIsATower = false; //Unless proven otherwise!
89c4a3a6 sago007 2008-08-29 14:32 1508
        bool topReached = false; //If we have reached the top
89c4a3a6 sago007 2008-08-29 14:32 1509
        int lineNumber = 0;
89c4a3a6 sago007 2008-08-29 14:32 1510
        bool emptySpacesFound = false;
89c4a3a6 sago007 2008-08-29 14:32 1511
        do {
89c4a3a6 sago007 2008-08-29 14:32 1512
            if ((emptySpacesFound) && (nrOfRealTypes(lineNumber)>0)&&(nrOfType(lineNumber, -1)>0)) {
89c4a3a6 sago007 2008-08-29 14:32 1513
                AIlineToClear = lineNumber;
89c4a3a6 sago007 2008-08-29 14:32 1514
                if (lineHasGarbage(lineNumber))
89c4a3a6 sago007 2008-08-29 14:32 1515
                    return false;
89c4a3a6 sago007 2008-08-29 14:32 1516
                else
89c4a3a6 sago007 2008-08-29 14:32 1517
                    bThereIsATower = true;
89c4a3a6 sago007 2008-08-29 14:32 1518
            }
89c4a3a6 sago007 2008-08-29 14:32 1519
            else
89c4a3a6 sago007 2008-08-29 14:32 1520
                emptySpacesFound=false;
89c4a3a6 sago007 2008-08-29 14:32 1521
            if ((!emptySpacesFound)&&(nrOfType(lineNumber, -1)>0))
89c4a3a6 sago007 2008-08-29 14:32 1522
                emptySpacesFound = true;
89c4a3a6 sago007 2008-08-29 14:32 1523
            if (lineNumber<12)
89c4a3a6 sago007 2008-08-29 14:32 1524
                lineNumber++;
89c4a3a6 sago007 2008-08-29 14:32 1525
            else
89c4a3a6 sago007 2008-08-29 14:32 1526
                topReached = true;
89c4a3a6 sago007 2008-08-29 14:32 1527
        }while ((!bThereIsATower)&&(!topReached));
89c4a3a6 sago007 2008-08-29 14:32 1528
        //if(bThereIsATower)
89c4a3a6 sago007 2008-08-29 14:32 1529
        //cout << "There is actually a tower" << endl;
89c4a3a6 sago007 2008-08-29 14:32 1530
        return bThereIsATower;
89c4a3a6 sago007 2008-08-29 14:32 1531
    }
89c4a3a6 sago007 2008-08-29 14:32 1532
89c4a3a6 sago007 2008-08-29 14:32 1533
    double firstInLine1(int line) {
89c4a3a6 sago007 2008-08-29 14:32 1534
        for (int i=0;i<6;i++)
89c4a3a6 sago007 2008-08-29 14:32 1535
            if ((board[i][line]>-1)&&(board[i][line]<7))
89c4a3a6 sago007 2008-08-29 14:32 1536
                return (double)i;
89c4a3a6 sago007 2008-08-29 14:32 1537
        return 3.0;
89c4a3a6 sago007 2008-08-29 14:32 1538
    }
89c4a3a6 sago007 2008-08-29 14:32 1539
89c4a3a6 sago007 2008-08-29 14:32 1540
    //returns the first coordinate of the block of type
89c4a3a6 sago007 2008-08-29 14:32 1541
    double firstInLine(int line, int type) {
89c4a3a6 sago007 2008-08-29 14:32 1542
        for (int i=0;i<6;i++)
89c4a3a6 sago007 2008-08-29 14:32 1543
            if (board[i][line]==type)
89c4a3a6 sago007 2008-08-29 14:32 1544
                return (double)i;
89c4a3a6 sago007 2008-08-29 14:32 1545
        return 3.0;
89c4a3a6 sago007 2008-08-29 14:32 1546
    }
89c4a3a6 sago007 2008-08-29 14:32 1547
89c4a3a6 sago007 2008-08-29 14:32 1548
    //There in the line shall we move
89c4a3a6 sago007 2008-08-29 14:32 1549
    int closestTo(int line, int place) {
89c4a3a6 sago007 2008-08-29 14:32 1550
        if ((int)firstInLine1(line)>place)
89c4a3a6 sago007 2008-08-29 14:32 1551
            return (int)firstInLine1(line)-1;
89c4a3a6 sago007 2008-08-29 14:32 1552
        for (int i=place;i>=0;i--) {
89c4a3a6 sago007 2008-08-29 14:32 1553
            if ((board[i][line]>-1)&&(board[i][line]<7))
89c4a3a6 sago007 2008-08-29 14:32 1554
                return i;
89c4a3a6 sago007 2008-08-29 14:32 1555
        }
89c4a3a6 sago007 2008-08-29 14:32 1556
        AIstatus=0;
89c4a3a6 sago007 2008-08-29 14:32 1557
        return place;
89c4a3a6 sago007 2008-08-29 14:32 1558
    }
89c4a3a6 sago007 2008-08-29 14:32 1559
89c4a3a6 sago007 2008-08-29 14:32 1560
    //The AI will remove a tower
89c4a3a6 sago007 2008-08-29 14:32 1561
    inline void AI_ClearTower() {
89c4a3a6 sago007 2008-08-29 14:32 1562
        //   cout << "AI: ClearTower, line: " << AIlineToClear << endl;
89c4a3a6 sago007 2008-08-29 14:32 1563
        int place = (int)firstInLine(AIlineToClear-1, -1); //Find an empty field to frop a brick into
89c4a3a6 sago007 2008-08-29 14:32 1564
        int xplace = closestTo(AIlineToClear, place); //Find the brick to drop in it
89c4a3a6 sago007 2008-08-29 14:32 1565
        if (cursory+1<AIlineToClear)
89c4a3a6 sago007 2008-08-29 14:32 1566
            MoveCursor('N');
89c4a3a6 sago007 2008-08-29 14:32 1567
        else
89c4a3a6 sago007 2008-08-29 14:32 1568
            if (cursory+1>AIlineToClear)
89c4a3a6 sago007 2008-08-29 14:32 1569
                MoveCursor('S');
89c4a3a6 sago007 2008-08-29 14:32 1570
            else
89c4a3a6 sago007 2008-08-29 14:32 1571
                if (cursorx<xplace)
89c4a3a6 sago007 2008-08-29 14:32 1572
                    MoveCursor('E');
89c4a3a6 sago007 2008-08-29 14:32 1573
                else
89c4a3a6 sago007 2008-08-29 14:32 1574
                    if (cursorx>xplace)
89c4a3a6 sago007 2008-08-29 14:32 1575
                        MoveCursor('W');
89c4a3a6 sago007 2008-08-29 14:32 1576
                    else
89c4a3a6 sago007 2008-08-29 14:32 1577
                        SwitchAtCursor();
89c4a3a6 sago007 2008-08-29 14:32 1578
        if (!ThereIsATower())
89c4a3a6 sago007 2008-08-29 14:32 1579
            AIstatus = 0;
89c4a3a6 sago007 2008-08-29 14:32 1580
    }
89c4a3a6 sago007 2008-08-29 14:32 1581
89c4a3a6 sago007 2008-08-29 14:32 1582
    //The AI will try to clear block horisontally
e88298d9 sago007 2009-03-29 00:17 1583
    void AI_ClearHori() {
89c4a3a6 sago007 2008-08-29 14:32 1584
        //   cout << "AI: ClearHori";
89c4a3a6 sago007 2008-08-29 14:32 1585
        int lowestLine = AIlineToClear;
89c4a3a6 sago007 2008-08-29 14:32 1586
        //AIcolorToClear
89c4a3a6 sago007 2008-08-29 14:32 1587
        bool found =true;
89c4a3a6 sago007 2008-08-29 14:32 1588
        /*for(int i; (i<12)&&(!found);i++)
89c4a3a6 sago007 2008-08-29 14:32 1589
         * {
89c4a3a6 sago007 2008-08-29 14:32 1590
         * if(horiInLine(i)>2)
89c4a3a6 sago007 2008-08-29 14:32 1591
         * {
89c4a3a6 sago007 2008-08-29 14:32 1592
         * int lowestLine = i;
89c4a3a6 sago007 2008-08-29 14:32 1593
         * found = true;
89c4a3a6 sago007 2008-08-29 14:32 1594
         * }
89c4a3a6 sago007 2008-08-29 14:32 1595
         * }*/
89c4a3a6 sago007 2008-08-29 14:32 1596
        for (int i=0;i<7;i++) {
89c4a3a6 sago007 2008-08-29 14:32 1597
            if (nrOfType(lowestLine, i)>2)
89c4a3a6 sago007 2008-08-29 14:32 1598
                AIcolorToClear = i;
89c4a3a6 sago007 2008-08-29 14:32 1599
        }
89c4a3a6 sago007 2008-08-29 14:32 1600
        if (found) {
89c4a3a6 sago007 2008-08-29 14:32 1601
            if (cursory>lowestLine-1)
89c4a3a6 sago007 2008-08-29 14:32 1602
                MoveCursor('S');
89c4a3a6 sago007 2008-08-29 14:32 1603
            else if (cursory<lowestLine-1)
89c4a3a6 sago007 2008-08-29 14:32 1604
                MoveCursor('N');
89c4a3a6 sago007 2008-08-29 14:32 1605
            else if (nrOfType(lowestLine, AIcolorToClear)>2) {
89c4a3a6 sago007 2008-08-29 14:32 1606
                int left=0, right=0;
89c4a3a6 sago007 2008-08-29 14:32 1607
                if (board[0][lowestLine]==AIcolorToClear) left++;
89c4a3a6 sago007 2008-08-29 14:32 1608
                if (board[1][lowestLine]==AIcolorToClear) left++;
89c4a3a6 sago007 2008-08-29 14:32 1609
                if (board[2][lowestLine]==AIcolorToClear) left++;
89c4a3a6 sago007 2008-08-29 14:32 1610
                if (board[3][lowestLine]==AIcolorToClear) right++;
89c4a3a6 sago007 2008-08-29 14:32 1611
                if (board[4][lowestLine]==AIcolorToClear) right++;
89c4a3a6 sago007 2008-08-29 14:32 1612
                if (board[5][lowestLine]==AIcolorToClear) right++;
89c4a3a6 sago007 2008-08-29 14:32 1613
                int xplace = 0;
89c4a3a6 sago007 2008-08-29 14:32 1614
                if (left<right) {
89c4a3a6 sago007 2008-08-29 14:32 1615
                    //   cout << ", right>left";
89c4a3a6 sago007 2008-08-29 14:32 1616
                    int count=0;
89c4a3a6 sago007 2008-08-29 14:32 1617
                    for (int i=0;(i<4)&&(count<1);i++)
89c4a3a6 sago007 2008-08-29 14:32 1618
                        if ((board[i][lowestLine]==AIcolorToClear)&&((i==0)||(board[i+1][lowestLine]!=AIcolorToClear))) {
89c4a3a6 sago007 2008-08-29 14:32 1619
                            count++;
89c4a3a6 sago007 2008-08-29 14:32 1620
                            xplace = i;
89c4a3a6 sago007 2008-08-29 14:32 1621
                        }
89c4a3a6 sago007 2008-08-29 14:32 1622
                }
89c4a3a6 sago007 2008-08-29 14:32 1623
                else {
89c4a3a6 sago007 2008-08-29 14:32 1624
                    //   cout << ", left>=right";
89c4a3a6 sago007 2008-08-29 14:32 1625
                    int count=0;
89c4a3a6 sago007 2008-08-29 14:32 1626
                    for (int i=3;(i<=5)&&(count<1);i++)
89c4a3a6 sago007 2008-08-29 14:32 1627
                        if ((board[i][lowestLine]==AIcolorToClear)&&(board[i-1][lowestLine]!=AIcolorToClear)) {
89c4a3a6 sago007 2008-08-29 14:32 1628
                            count++;
89c4a3a6 sago007 2008-08-29 14:32 1629
                            xplace = --i;
89c4a3a6 sago007 2008-08-29 14:32 1630
                        }
89c4a3a6 sago007 2008-08-29 14:32 1631
                }
89c4a3a6 sago007 2008-08-29 14:32 1632
                //cout << ", xplace: " << xplace;
89c4a3a6 sago007 2008-08-29 14:32 1633
                if (cursorx<xplace)
89c4a3a6 sago007 2008-08-29 14:32 1634
                    MoveCursor('E');
89c4a3a6 sago007 2008-08-29 14:32 1635
                else
89c4a3a6 sago007 2008-08-29 14:32 1636
                    if (cursorx>xplace)
89c4a3a6 sago007 2008-08-29 14:32 1637
                        MoveCursor('W');
89c4a3a6 sago007 2008-08-29 14:32 1638
                    else
89c4a3a6 sago007 2008-08-29 14:32 1639
                        if (cursorx==xplace)
89c4a3a6 sago007 2008-08-29 14:32 1640
                            SwitchAtCursor();
89c4a3a6 sago007 2008-08-29 14:32 1641
                        else
89c4a3a6 sago007 2008-08-29 14:32 1642
                            AIstatus = 0;
89c4a3a6 sago007 2008-08-29 14:32 1643
            }
89c4a3a6 sago007 2008-08-29 14:32 1644
            else
89c4a3a6 sago007 2008-08-29 14:32 1645
                AIstatus = 0;
89c4a3a6 sago007 2008-08-29 14:32 1646
        }
89c4a3a6 sago007 2008-08-29 14:32 1647
        else
89c4a3a6 sago007 2008-08-29 14:32 1648
            AIstatus = 0;
89c4a3a6 sago007 2008-08-29 14:32 1649
        //cout << endl; //for debugging
89c4a3a6 sago007 2008-08-29 14:32 1650
    }
89c4a3a6 sago007 2008-08-29 14:32 1651
89c4a3a6 sago007 2008-08-29 14:32 1652
    //Test if vertical clear is possible
89c4a3a6 sago007 2008-08-29 14:32 1653
    inline bool veriClearPossible() {
89c4a3a6 sago007 2008-08-29 14:32 1654
        bool found=false;
89c4a3a6 sago007 2008-08-29 14:32 1655
        int colors[7] = {0, 0, 0, 0, 0, 0, 0};
89c4a3a6 sago007 2008-08-29 14:32 1656
        for (int i=12;(i>0)&&(!found);i--) {
89c4a3a6 sago007 2008-08-29 14:32 1657
            for (int j=0;j<7;j++) {
89c4a3a6 sago007 2008-08-29 14:32 1658
                if (nrOfType(i, j)==0)
89c4a3a6 sago007 2008-08-29 14:32 1659
                    colors[j]=0;
89c4a3a6 sago007 2008-08-29 14:32 1660
                else
89c4a3a6 sago007 2008-08-29 14:32 1661
                    if (++colors[j]>2) {
89c4a3a6 sago007 2008-08-29 14:32 1662
                        AIcolorToClear = j;
89c4a3a6 sago007 2008-08-29 14:32 1663
                        AIlineToClear = i;
89c4a3a6 sago007 2008-08-29 14:32 1664
                        found=true;
89c4a3a6 sago007 2008-08-29 14:32 1665
                    }
89c4a3a6 sago007 2008-08-29 14:32 1666
89c4a3a6 sago007 2008-08-29 14:32 1667
            }
89c4a3a6 sago007 2008-08-29 14:32 1668
        }
89c4a3a6 sago007 2008-08-29 14:32 1669
        return found;
89c4a3a6 sago007 2008-08-29 14:32 1670
    }
89c4a3a6 sago007 2008-08-29 14:32 1671
89c4a3a6 sago007 2008-08-29 14:32 1672
89c4a3a6 sago007 2008-08-29 14:32 1673
89c4a3a6 sago007 2008-08-29 14:32 1674
    //There in the line shall we move
89c4a3a6 sago007 2008-08-29 14:32 1675
    int closestTo(int line, int type, int place) {
89c4a3a6 sago007 2008-08-29 14:32 1676
        if ((int)firstInLine(line, type)>place)
89c4a3a6 sago007 2008-08-29 14:32 1677
            return (int)firstInLine(line, type)-1;
89c4a3a6 sago007 2008-08-29 14:32 1678
        for (int i=place;i>=0;i--) {
89c4a3a6 sago007 2008-08-29 14:32 1679
            if (board[i][line]==type)
89c4a3a6 sago007 2008-08-29 14:32 1680
                return i;
89c4a3a6 sago007 2008-08-29 14:32 1681
        }
89c4a3a6 sago007 2008-08-29 14:32 1682
        AIstatus=0;
89c4a3a6 sago007 2008-08-29 14:32 1683
        return place;
89c4a3a6 sago007 2008-08-29 14:32 1684
    }
89c4a3a6 sago007 2008-08-29 14:32 1685
89c4a3a6 sago007 2008-08-29 14:32 1686
    //The AI will try to clear blocks vertically
89c4a3a6 sago007 2008-08-29 14:32 1687
    inline void AI_ClearVertical() {
89c4a3a6 sago007 2008-08-29 14:32 1688
        // cout << "AI: ClearVeri";
89c4a3a6 sago007 2008-08-29 14:32 1689
        //First we find the place there we will align the bricks
89c4a3a6 sago007 2008-08-29 14:32 1690
        int placeToCenter = (int)(firstInLine(AIlineToClear, AIcolorToClear)/3.0+firstInLine(AIlineToClear+1, AIcolorToClear)/3.0+firstInLine(AIlineToClear+2, AIcolorToClear)/3.0);
89c4a3a6 sago007 2008-08-29 14:32 1691
        int unlimitedLoop=0;
89c4a3a6 sago007 2008-08-29 14:32 1692
        while (((board[placeToCenter][AIlineToClear]>1000000)||(board[placeToCenter][AIlineToClear+1]>1000000)||(board[placeToCenter][AIlineToClear+2]>1000000))&&(unlimitedLoop<10)) {
89c4a3a6 sago007 2008-08-29 14:32 1693
            unlimitedLoop++;
89c4a3a6 sago007 2008-08-29 14:32 1694
            placeToCenter++;
89c4a3a6 sago007 2008-08-29 14:32 1695
            if (placeToCenter>5)
89c4a3a6 sago007 2008-08-29 14:32 1696
                placeToCenter=0;
89c4a3a6 sago007 2008-08-29 14:32 1697
        }
e88298d9 sago007 2009-03-29 00:17 1698
        if(unlimitedLoop>9) {
e88298d9 sago007 2009-03-29 00:17 1699
            AIstatus = 0;
e88298d9 sago007 2009-03-29 00:17 1700
        }
89c4a3a6 sago007 2008-08-29 14:32 1701
        //cout << ", ptc: " << placeToCenter << ", line: " << AIlineToClear << ", cy: " << cursory;
89c4a3a6 sago007 2008-08-29 14:32 1702
        if (cursory+1>AIlineToClear+2) {
89c4a3a6 sago007 2008-08-29 14:32 1703
            // cout << ", cursory>line+2";
89c4a3a6 sago007 2008-08-29 14:32 1704
            MoveCursor('S');
89c4a3a6 sago007 2008-08-29 14:32 1705
        }
89c4a3a6 sago007 2008-08-29 14:32 1706
        if (cursory+1<AIlineToClear)
89c4a3a6 sago007 2008-08-29 14:32 1707
            MoveCursor('N');
89c4a3a6 sago007 2008-08-29 14:32 1708
        bool toAlign[3]={true, true, true};
89c4a3a6 sago007 2008-08-29 14:32 1709
        if (board[placeToCenter][AIlineToClear+0]==AIcolorToClear)
89c4a3a6 sago007 2008-08-29 14:32 1710
            toAlign[0]=false;
89c4a3a6 sago007 2008-08-29 14:32 1711
        if (board[placeToCenter][AIlineToClear+1]==AIcolorToClear)
89c4a3a6 sago007 2008-08-29 14:32 1712
            toAlign[1]=false;
89c4a3a6 sago007 2008-08-29 14:32 1713
        if (board[placeToCenter][AIlineToClear+2]==AIcolorToClear)
89c4a3a6 sago007 2008-08-29 14:32 1714
            toAlign[2]=false;
89c4a3a6 sago007 2008-08-29 14:32 1715
        //cout << "status: " << toAlign[0] << " " << toAlign[1] << " " << toAlign[2];
89c4a3a6 sago007 2008-08-29 14:32 1716
        if (cursory+1==AIlineToClear) {
89c4a3a6 sago007 2008-08-29 14:32 1717
            if (toAlign[0]==false)
89c4a3a6 sago007 2008-08-29 14:32 1718
                MoveCursor('N');
89c4a3a6 sago007 2008-08-29 14:32 1719
            else {
89c4a3a6 sago007 2008-08-29 14:32 1720
                if (cursorx>closestTo(AIlineToClear, AIcolorToClear, placeToCenter))
89c4a3a6 sago007 2008-08-29 14:32 1721
                    MoveCursor('W');
89c4a3a6 sago007 2008-08-29 14:32 1722
                else
89c4a3a6 sago007 2008-08-29 14:32 1723
                    if (cursorx<closestTo(AIlineToClear, AIcolorToClear, placeToCenter))
89c4a3a6 sago007 2008-08-29 14:32 1724
                        MoveCursor('E');
89c4a3a6 sago007 2008-08-29 14:32 1725
                    else
89c4a3a6 sago007 2008-08-29 14:32 1726
                        SwitchAtCursor();
89c4a3a6 sago007 2008-08-29 14:32 1727
            }
89c4a3a6 sago007 2008-08-29 14:32 1728
        }
89c4a3a6 sago007 2008-08-29 14:32 1729
        else
89c4a3a6 sago007 2008-08-29 14:32 1730
            if (cursory+1==AIlineToClear+1) {
89c4a3a6 sago007 2008-08-29 14:32 1731
                if (toAlign[1]==false) {
89c4a3a6 sago007 2008-08-29 14:32 1732
                    if (toAlign[2])
89c4a3a6 sago007 2008-08-29 14:32 1733
                        MoveCursor('N');
89c4a3a6 sago007 2008-08-29 14:32 1734
                    else
89c4a3a6 sago007 2008-08-29 14:32 1735
                        MoveCursor('S');
89c4a3a6 sago007 2008-08-29 14:32 1736
                }
89c4a3a6 sago007 2008-08-29 14:32 1737
                else {
89c4a3a6 sago007 2008-08-29 14:32 1738
                    if (cursorx>closestTo(AIlineToClear+1, AIcolorToClear, placeToCenter))
89c4a3a6 sago007 2008-08-29 14:32 1739
                        MoveCursor('W');
89c4a3a6 sago007 2008-08-29 14:32 1740
                    else
89c4a3a6 sago007 2008-08-29 14:32 1741
                        if (cursorx<closestTo(AIlineToClear+1, AIcolorToClear, placeToCenter))
89c4a3a6 sago007 2008-08-29 14:32 1742
                            MoveCursor('E');
89c4a3a6 sago007 2008-08-29 14:32 1743
                        else
89c4a3a6 sago007 2008-08-29 14:32 1744
                            SwitchAtCursor();
89c4a3a6 sago007 2008-08-29 14:32 1745
                }
89c4a3a6 sago007 2008-08-29 14:32 1746
            }
89c4a3a6 sago007 2008-08-29 14:32 1747
            else
89c4a3a6 sago007 2008-08-29 14:32 1748
                if (cursory+1==AIlineToClear+2) {
89c4a3a6 sago007 2008-08-29 14:32 1749
                    if (toAlign[2]==false)
89c4a3a6 sago007 2008-08-29 14:32 1750
                        MoveCursor('S');
89c4a3a6 sago007 2008-08-29 14:32 1751
                    else {
89c4a3a6 sago007 2008-08-29 14:32 1752
                        if (cursorx>closestTo(AIlineToClear+2, AIcolorToClear, placeToCenter))
89c4a3a6 sago007 2008-08-29 14:32 1753
                            MoveCursor('W');
89c4a3a6 sago007 2008-08-29 14:32 1754
                        else
89c4a3a6 sago007 2008-08-29 14:32 1755
                            if (cursorx<closestTo(AIlineToClear+2, AIcolorToClear, placeToCenter))
89c4a3a6 sago007 2008-08-29 14:32 1756
                                MoveCursor('E');
89c4a3a6 sago007 2008-08-29 14:32 1757
                            else
89c4a3a6 sago007 2008-08-29 14:32 1758
                                SwitchAtCursor();
89c4a3a6 sago007 2008-08-29 14:32 1759
                    }
89c4a3a6 sago007 2008-08-29 14:32 1760
                }
89c4a3a6 sago007 2008-08-29 14:32 1761
89c4a3a6 sago007 2008-08-29 14:32 1762
        if ((!toAlign[0])&&(!toAlign[1])&&(!toAlign[2]))
89c4a3a6 sago007 2008-08-29 14:32 1763
            AIstatus = 0;
89c4a3a6 sago007 2008-08-29 14:32 1764
        if ((nrOfType(AIlineToClear, AIcolorToClear)==0)||(nrOfType(AIlineToClear+1, AIcolorToClear)==0)||(nrOfType(AIlineToClear+2, AIcolorToClear)==0))
89c4a3a6 sago007 2008-08-29 14:32 1765
            AIstatus = 0;
89c4a3a6 sago007 2008-08-29 14:32 1766
        //cout << endl;
89c4a3a6 sago007 2008-08-29 14:32 1767
    }
89c4a3a6 sago007 2008-08-29 14:32 1768
89c4a3a6 sago007 2008-08-29 14:32 1769
89c4a3a6 sago007 2008-08-29 14:32 1770
89c4a3a6 sago007 2008-08-29 14:32 1771
    short AIstatus;   //Status flags:
89c4a3a6 sago007 2008-08-29 14:32 1772
    //0: nothing, 2: clear tower, 3: clear horisontal, 4: clear vertical
89c4a3a6 sago007 2008-08-29 14:32 1773
    //1: make more lines, 5: make 2 lines, 6: make 1 line
89c4a3a6 sago007 2008-08-29 14:32 1774
    bool firstLineCreated;
89c4a3a6 sago007 2008-08-29 14:32 1775
89c4a3a6 sago007 2008-08-29 14:32 1776
    void AI_Move() {
89c4a3a6 sago007 2008-08-29 14:32 1777
        switch (AIstatus) {
89c4a3a6 sago007 2008-08-29 14:32 1778
        case 1:
89c4a3a6 sago007 2008-08-29 14:32 1779
            if (TowerHeight<8)PushLine();
89c4a3a6 sago007 2008-08-29 14:32 1780
            else AIstatus = 0;
89c4a3a6 sago007 2008-08-29 14:32 1781
            break;
89c4a3a6 sago007 2008-08-29 14:32 1782
        case 2:
89c4a3a6 sago007 2008-08-29 14:32 1783
            AI_ClearTower();
89c4a3a6 sago007 2008-08-29 14:32 1784
            break;
89c4a3a6 sago007 2008-08-29 14:32 1785
        case 3:
89c4a3a6 sago007 2008-08-29 14:32 1786
            AI_ClearHori();
89c4a3a6 sago007 2008-08-29 14:32 1787
            break;
89c4a3a6 sago007 2008-08-29 14:32 1788
        case 4:
89c4a3a6 sago007 2008-08-29 14:32 1789
            AI_ClearVertical();
89c4a3a6 sago007 2008-08-29 14:32 1790
            break;
89c4a3a6 sago007 2008-08-29 14:32 1791
        case 5:
89c4a3a6 sago007 2008-08-29 14:32 1792
            if (!firstLineCreated){
89c4a3a6 sago007 2008-08-29 14:32 1793
                PushLine();
89c4a3a6 sago007 2008-08-29 14:32 1794
                firstLineCreated = true;
89c4a3a6 sago007 2008-08-29 14:32 1795
            }
89c4a3a6 sago007 2008-08-29 14:32 1796
            else {
89c4a3a6 sago007 2008-08-29 14:32 1797
                PushLine();
89c4a3a6 sago007 2008-08-29 14:32 1798
                AIstatus = 0;
89c4a3a6 sago007 2008-08-29 14:32 1799
            }
89c4a3a6 sago007 2008-08-29 14:32 1800
            break;
89c4a3a6 sago007 2008-08-29 14:32 1801
        case 6:
89c4a3a6 sago007 2008-08-29 14:32 1802
            PushLine();
89c4a3a6 sago007 2008-08-29 14:32 1803
            AIstatus = 0;
89c4a3a6 sago007 2008-08-29 14:32 1804
            break;
89c4a3a6 sago007 2008-08-29 14:32 1805
        default:
89c4a3a6 sago007 2008-08-29 14:32 1806
            if (TowerHeight<6) AIstatus = 1;
89c4a3a6 sago007 2008-08-29 14:32 1807
            else
89c4a3a6 sago007 2008-08-29 14:32 1808
                if (horiClearPossible()) AIstatus = 3;
89c4a3a6 sago007 2008-08-29 14:32 1809
                else
89c4a3a6 sago007 2008-08-29 14:32 1810
                    if (veriClearPossible()) AIstatus = 4;
89c4a3a6 sago007 2008-08-29 14:32 1811
                    else
89c4a3a6 sago007 2008-08-29 14:32 1812
                        if (ThereIsATower()) AIstatus = 2;
89c4a3a6 sago007 2008-08-29 14:32 1813
                        else
89c4a3a6 sago007 2008-08-29 14:32 1814
                            AIstatus = 5;
89c4a3a6 sago007 2008-08-29 14:32 1815
            break;
89c4a3a6 sago007 2008-08-29 14:32 1816
        }
89c4a3a6 sago007 2008-08-29 14:32 1817
    }
89c4a3a6 sago007 2008-08-29 14:32 1818
89c4a3a6 sago007 2008-08-29 14:32 1819
//////////////////////////////////////////////////////////////////////////
89c4a3a6 sago007 2008-08-29 14:32 1820
///////////////////////////// AI ends here! //////////////////////////////
89c4a3a6 sago007 2008-08-29 14:32 1821
//////////////////////////////////////////////////////////////////////////
89c4a3a6 sago007 2008-08-29 14:32 1822
2e57d791 sago007 2009-06-04 17:48 1823
#if WITH_SDL
89c4a3a6 sago007 2008-08-29 14:32 1824
    //Draws all the bricks to the board (including garbage)
89c4a3a6 sago007 2008-08-29 14:32 1825
    void PaintBricks() {
89c4a3a6 sago007 2008-08-29 14:32 1826
        for (int i=0;((i<13)&&(i<30));i++)
89c4a3a6 sago007 2008-08-29 14:32 1827
            for (int j=0;j<6;j++) {
89c4a3a6 sago007 2008-08-29 14:32 1828
                if ((board[j][i]%10 != -1) && (board[j][i]%10 < 7) && ((board[j][i]/1000000)%10==0)) {
27ae0175 sago007 2009-01-30 06:02 1829
                    DrawIMG(bricks[board[j][i]%10], sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1830
                    if ((board[j][i]/BLOCKWAIT)%10==1)
27ae0175 sago007 2009-01-30 06:02 1831
                        DrawIMG(bomb[(SDL_GetTicks()/BOMBTIME)%2], sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1832
                    if ((board[j][i]/BLOCKHANG)%10==1)
27ae0175 sago007 2009-01-30 06:02 1833
                        DrawIMG(ready[(SDL_GetTicks()/READYTIME)%2], sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1834
89c4a3a6 sago007 2008-08-29 14:32 1835
                }
89c4a3a6 sago007 2008-08-29 14:32 1836
                if ((board[j][i]/1000000)%10==1) {
89c4a3a6 sago007 2008-08-29 14:32 1837
                    int left, right, over, under;
89c4a3a6 sago007 2008-08-29 14:32 1838
                    int number = board[j][i];
89c4a3a6 sago007 2008-08-29 14:32 1839
                    if (j<1) left = -1;
89c4a3a6 sago007 2008-08-29 14:32 1840
                    else left = board[j-1][i];
89c4a3a6 sago007 2008-08-29 14:32 1841
                    if (j>5) right = -1;
89c4a3a6 sago007 2008-08-29 14:32 1842
                    else right = board[j+1][i];
89c4a3a6 sago007 2008-08-29 14:32 1843
                    if (i>28) over = -1;
89c4a3a6 sago007 2008-08-29 14:32 1844
                    else over = board[j][i+1];
89c4a3a6 sago007 2008-08-29 14:32 1845
                    if (i<1) under = -1;
89c4a3a6 sago007 2008-08-29 14:32 1846
                    else under = board[j][i-1];
89c4a3a6 sago007 2008-08-29 14:32 1847
                    if ((left == number)&&(right == number)&&(over == number)&&(under == number))
27ae0175 sago007 2009-01-30 06:02 1848
                        DrawIMG(garbageFill, sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1849
                    if ((left != number)&&(right == number)&&(over == number)&&(under == number))
27ae0175 sago007 2009-01-30 06:02 1850
                        DrawIMG(garbageL, sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1851
                    if ((left == number)&&(right != number)&&(over == number)&&(under == number))
27ae0175 sago007 2009-01-30 06:02 1852
                        DrawIMG(garbageR, sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1853
                    if ((left == number)&&(right == number)&&(over != number)&&(under == number))
27ae0175 sago007 2009-01-30 06:02 1854
                        DrawIMG(garbageT, sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1855
                    if ((left == number)&&(right == number)&&(over == number)&&(under != number))
27ae0175 sago007 2009-01-30 06:02 1856
                        DrawIMG(garbageB, sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1857
                    if ((left != number)&&(right == number)&&(over != number)&&(under == number))
27ae0175 sago007 2009-01-30 06:02 1858
                        DrawIMG(garbageTL, sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1859
                    if ((left != number)&&(right == number)&&(over == number)&&(under != number))
27ae0175 sago007 2009-01-30 06:02 1860
                        DrawIMG(garbageBL, sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1861
                    if ((left == number)&&(right != number)&&(over != number)&&(under == number))
27ae0175 sago007 2009-01-30 06:02 1862
                        DrawIMG(garbageTR, sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1863
                    if ((left == number)&&(right != number)&&(over == number)&&(under != number))
27ae0175 sago007 2009-01-30 06:02 1864
                        DrawIMG(garbageBR, sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1865
                    if ((left == number)&&(right != number)&&(over != number)&&(under != number))
27ae0175 sago007 2009-01-30 06:02 1866
                        DrawIMG(garbageMR, sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1867
                    if ((left == number)&&(right == number)&&(over != number)&&(under != number))
27ae0175 sago007 2009-01-30 06:02 1868
                        DrawIMG(garbageM, sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1869
                    if ((left != number)&&(right == number)&&(over != number)&&(under != number))
27ae0175 sago007 2009-01-30 06:02 1870
                        DrawIMG(garbageML, sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1871
                }
89c4a3a6 sago007 2008-08-29 14:32 1872
                if ((board[j][i]/1000000)%10==2) {
89c4a3a6 sago007 2008-08-29 14:32 1873
                    if (j==0)
27ae0175 sago007 2009-01-30 06:02 1874
                        DrawIMG(garbageGML, sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1875
                    else
89c4a3a6 sago007 2008-08-29 14:32 1876
                        if (j==5)
27ae0175 sago007 2009-01-30 06:02 1877
                            DrawIMG(garbageGMR, sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1878
                        else
27ae0175 sago007 2009-01-30 06:02 1879
                            DrawIMG(garbageGM, sBoard, j*bsize, bsize*12-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1880
                }
89c4a3a6 sago007 2008-08-29 14:32 1881
            }
89c4a3a6 sago007 2008-08-29 14:32 1882
        const int j = 0;
89c4a3a6 sago007 2008-08-29 14:32 1883
89c4a3a6 sago007 2008-08-29 14:32 1884
        int garbageSize=0;
89c4a3a6 sago007 2008-08-29 14:32 1885
        for (int i=0;i<20;i++) {
89c4a3a6 sago007 2008-08-29 14:32 1886
            if ((board[j][i]/1000000)%10==1) {
89c4a3a6 sago007 2008-08-29 14:32 1887
                int left, right, over, under;
89c4a3a6 sago007 2008-08-29 14:32 1888
                int number = board[j][i];
89c4a3a6 sago007 2008-08-29 14:32 1889
                if (j<1) left = -1;
89c4a3a6 sago007 2008-08-29 14:32 1890
                else left = board[j-1][i];
89c4a3a6 sago007 2008-08-29 14:32 1891
                if (j>5) right = -1;
89c4a3a6 sago007 2008-08-29 14:32 1892
                else right = board[j+1][i];
89c4a3a6 sago007 2008-08-29 14:32 1893
                if (i>28) over = -1;
89c4a3a6 sago007 2008-08-29 14:32 1894
                else over = board[j][i+1];
89c4a3a6 sago007 2008-08-29 14:32 1895
                if (i<1) under = -1;
89c4a3a6 sago007 2008-08-29 14:32 1896
                else under = board[j][i-1];
89c4a3a6 sago007 2008-08-29 14:32 1897
                if (((left != number)&&(right == number)&&(over != number)&&(under == number))&&(garbageSize>0)) {
27ae0175 sago007 2009-01-30 06:02 1898
                    DrawIMG(smiley[board[j][i]%4], sBoard, 2*bsize, 12*bsize-i*bsize-pixels+(bsize/2)*garbageSize);
89c4a3a6 sago007 2008-08-29 14:32 1899
                }
89c4a3a6 sago007 2008-08-29 14:32 1900
                if (!((left != number)&&(right == number)&&(over == number)&&(under == number))) //not in garbage
89c4a3a6 sago007 2008-08-29 14:32 1901
                {
89c4a3a6 sago007 2008-08-29 14:32 1902
                    garbageSize=0;
89c4a3a6 sago007 2008-08-29 14:32 1903
                }
89c4a3a6 sago007 2008-08-29 14:32 1904
                else {
89c4a3a6 sago007 2008-08-29 14:32 1905
                    //cout << "In garbage" << endl;
89c4a3a6 sago007 2008-08-29 14:32 1906
                    garbageSize++;
89c4a3a6 sago007 2008-08-29 14:32 1907
                }
89c4a3a6 sago007 2008-08-29 14:32 1908
89c4a3a6 sago007 2008-08-29 14:32 1909
            }
89c4a3a6 sago007 2008-08-29 14:32 1910
        }
89c4a3a6 sago007 2008-08-29 14:32 1911
        for (int i=0;i<6;i++)
89c4a3a6 sago007 2008-08-29 14:32 1912
            if (board[i][0]!=-1)
27ae0175 sago007 2009-01-30 06:02 1913
                DrawIMG(transCover, sBoard, i*bsize, 12*bsize-pixels); //Make the appering blocks transperant
89c4a3a6 sago007 2008-08-29 14:32 1914
89c4a3a6 sago007 2008-08-29 14:32 1915
    }
89c4a3a6 sago007 2008-08-29 14:32 1916
89c4a3a6 sago007 2008-08-29 14:32 1917
    //Paints the bricks gotten from a replay/net package
89c4a3a6 sago007 2008-08-29 14:32 1918
    void SimplePaintBricks() {
89c4a3a6 sago007 2008-08-29 14:32 1919
        /*
89c4a3a6 sago007 2008-08-29 14:32 1920
         * We will need to mark the blocks that must have a bomb, we will here need to see, what is falling
89c4a3a6 sago007 2008-08-29 14:32 1921
         */
89c4a3a6 sago007 2008-08-29 14:32 1922
        bool bbomb[6][13]; //has a bomb on it!
89c4a3a6 sago007 2008-08-29 14:32 1923
        bool falling[6][13]; //this is falling
89c4a3a6 sago007 2008-08-29 14:32 1924
        bool getReady[6][13]; //getReady
89c4a3a6 sago007 2008-08-29 14:32 1925
        for (int i=0;i<6;i++)
89c4a3a6 sago007 2008-08-29 14:32 1926
            for (int j=0;j<13;j++) {
89c4a3a6 sago007 2008-08-29 14:32 1927
                bbomb[i][j]=false; //All false by default
89c4a3a6 sago007 2008-08-29 14:32 1928
                falling[i][j]=false;
89c4a3a6 sago007 2008-08-29 14:32 1929
                if (board[i][j]>29)
89c4a3a6 sago007 2008-08-29 14:32 1930
                    getReady[i][j]=true;
89c4a3a6 sago007 2008-08-29 14:32 1931
                else
89c4a3a6 sago007 2008-08-29 14:32 1932
                    getReady[i][j]=false;
89c4a3a6 sago007 2008-08-29 14:32 1933
            }
89c4a3a6 sago007 2008-08-29 14:32 1934
        //See that is falling
89c4a3a6 sago007 2008-08-29 14:32 1935
        for (int i=0;i<6;i++) {
89c4a3a6 sago007 2008-08-29 14:32 1936
            bool rowFalling = false;
89c4a3a6 sago007 2008-08-29 14:32 1937
            for (int j=0;j<13;j++) {
89c4a3a6 sago007 2008-08-29 14:32 1938
                if (rowFalling)
89c4a3a6 sago007 2008-08-29 14:32 1939
                    falling[i][j]=true;
89c4a3a6 sago007 2008-08-29 14:32 1940
                if ((!rowFalling)&&(board[i][j]%30==-1))
89c4a3a6 sago007 2008-08-29 14:32 1941
                    rowFalling = true;
89c4a3a6 sago007 2008-08-29 14:32 1942
                if ((rowFalling)&&(board[i][j]%30>6))
89c4a3a6 sago007 2008-08-29 14:32 1943
                    rowFalling = false;
89c4a3a6 sago007 2008-08-29 14:32 1944
                if (getReady[i][j]) {
89c4a3a6 sago007 2008-08-29 14:32 1945
                    falling[i][j]=true; //getReady is the same as falling
89c4a3a6 sago007 2008-08-29 14:32 1946
                    rowFalling = false;
89c4a3a6 sago007 2008-08-29 14:32 1947
                }
89c4a3a6 sago007 2008-08-29 14:32 1948
            }
89c4a3a6 sago007 2008-08-29 14:32 1949
        }
89c4a3a6 sago007 2008-08-29 14:32 1950
        //Now looking at rows:
89c4a3a6 sago007 2008-08-29 14:32 1951
        for (int i=0;i<6;i++) {
89c4a3a6 sago007 2008-08-29 14:32 1952
            int count = 0;
89c4a3a6 sago007 2008-08-29 14:32 1953
            int color = -1;
89c4a3a6 sago007 2008-08-29 14:32 1954
            for (int j=1;j<13;j++) {
89c4a3a6 sago007 2008-08-29 14:32 1955
                if ((board[i][j]%30==color)&&(!falling[i][j]))
89c4a3a6 sago007 2008-08-29 14:32 1956
                    count++;
89c4a3a6 sago007 2008-08-29 14:32 1957
                else
89c4a3a6 sago007 2008-08-29 14:32 1958
                    if (falling[i][j]) {
89c4a3a6 sago007 2008-08-29 14:32 1959
                        count = 0;
89c4a3a6 sago007 2008-08-29 14:32 1960
                    }
89c4a3a6 sago007 2008-08-29 14:32 1961
                    else {
89c4a3a6 sago007 2008-08-29 14:32 1962
                        color=board[i][j]%30;
89c4a3a6 sago007 2008-08-29 14:32 1963
                        count=1;
89c4a3a6 sago007 2008-08-29 14:32 1964
                    }
89c4a3a6 sago007 2008-08-29 14:32 1965
                if ((count>2)&&(color>-1)&&(color)<7) {
89c4a3a6 sago007 2008-08-29 14:32 1966
                    bbomb[i][j]=true;
89c4a3a6 sago007 2008-08-29 14:32 1967
                    bbomb[i][j-1]=true;
89c4a3a6 sago007 2008-08-29 14:32 1968
                    bbomb[i][j-2]=true;
89c4a3a6 sago007 2008-08-29 14:32 1969
                }
89c4a3a6 sago007 2008-08-29 14:32 1970
            }
89c4a3a6 sago007 2008-08-29 14:32 1971
        }
89c4a3a6 sago007 2008-08-29 14:32 1972
        //now looking for lines
89c4a3a6 sago007 2008-08-29 14:32 1973
        for (int i=1;i<13;i++) {
89c4a3a6 sago007 2008-08-29 14:32 1974
            int count = 0;
89c4a3a6 sago007 2008-08-29 14:32 1975
            int color = -1;
89c4a3a6 sago007 2008-08-29 14:32 1976
            for (int j=0;j<6;j++) {
89c4a3a6 sago007 2008-08-29 14:32 1977
                if ((board[j][i]%30==color)&&(!falling[j][i]))
89c4a3a6 sago007 2008-08-29 14:32 1978
                    count++;
89c4a3a6 sago007 2008-08-29 14:32 1979
                else
89c4a3a6 sago007 2008-08-29 14:32 1980
                    if (falling[j][i]) {
89c4a3a6 sago007 2008-08-29 14:32 1981
                        count = 0;
89c4a3a6 sago007 2008-08-29 14:32 1982
                    }
89c4a3a6 sago007 2008-08-29 14:32 1983
                    else {
89c4a3a6 sago007 2008-08-29 14:32 1984
                        color=board[j][i]%30;
89c4a3a6 sago007 2008-08-29 14:32 1985
                        count=1;
89c4a3a6 sago007 2008-08-29 14:32 1986
                    }
89c4a3a6 sago007 2008-08-29 14:32 1987
                if ((count>2)&&(color>-1)&&(color<7)) {
89c4a3a6 sago007 2008-08-29 14:32 1988
                    bbomb[j][i]=true;
89c4a3a6 sago007 2008-08-29 14:32 1989
                    bbomb[j-1][i]=true;
89c4a3a6 sago007 2008-08-29 14:32 1990
                    bbomb[j-2][i]=true;
89c4a3a6 sago007 2008-08-29 14:32 1991
                }
89c4a3a6 sago007 2008-08-29 14:32 1992
            }
89c4a3a6 sago007 2008-08-29 14:32 1993
        }
89c4a3a6 sago007 2008-08-29 14:32 1994
        for (int i=0;((i<13)&&(i<30));i++)
89c4a3a6 sago007 2008-08-29 14:32 1995
            for (int j=0;j<6;j++) {
89c4a3a6 sago007 2008-08-29 14:32 1996
                if ((board[j][i]%10 != -1) && (board[j][i]%30 < 7)) {
27ae0175 sago007 2009-01-30 06:02 1997
                    DrawIMG(bricks[board[j][i]%10], sBoard, j*bsize, 12*bsize-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 1998
                    if (bbomb[j][i])
27ae0175 sago007 2009-01-30 06:02 1999
                        DrawIMG(bomb[(SDL_GetTicks()/BOMBTIME)%2], sBoard, j*bsize, 12*bsize-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 2000
                    if (getReady[j][i])
27ae0175 sago007 2009-01-30 06:02 2001
                        DrawIMG(ready[(SDL_GetTicks()/READYTIME)%2], sBoard, j*bsize, 12*bsize-i*bsize-pixels);
89c4a3a6 sago007 2008-08-29 14:32 2002
                }
89c4a3a6 sago007 2008-08-29 14:32 2003
                if (board[j][i]%30>6) {
89c4a3a6 sago007 2008-08-29 14:32 2004
                    if (board[j][i]%30==7)
27ae0175 sago007 2009-01-30 06:02 2005
                        DrawIMG(garbageR, sBoard, j*bsize, 12*bsize-i*bsize-pixels); //good
89c4a3a6 sago007 2008-08-29 14:32 2006
                    if (board[j][i]%30==9)
27ae0175 sago007 2009-01-30 06:02 2007
                        DrawIMG(garbageML, sBoard, j*bsize, 12*bsize-i*bsize-pixels); //good
89c4a3a6 sago007 2008-08-29 14:32 2008
                    if (board[j][i]%30==10)
e03ae476 sago007 2009-03-06 22:49 2009
                        DrawIMG(garbageMR, sBoard, j*bsize, 12*bsize-i*bsize-pixels); //good
89c4a3a6 sago007 2008-08-29 14:32 2010
                    if (board[j][i]%30==11)
27ae0175 sago007 2009-01-30 06:02 2011
                        DrawIMG(garbageTR, sBoard, j*bsize, 12*bsize-i*bsize-pixels); //good
89c4a3a6 sago007 2008-08-29 14:32 2012
                    if (board[j][i]%30==12)
27ae0175 sago007 2009-01-30 06:02 2013
                        DrawIMG(garbageTL, sBoard, j*bsize, 12*bsize-i*bsize-pixels); //good
89c4a3a6 sago007 2008-08-29 14:32 2014
                    if (board[j][i]%30==13)
27ae0175 sago007 2009-01-30 06:02 2015
                        DrawIMG(garbageBL, sBoard, j*bsize, 12*bsize-i*bsize-pixels); //good
89c4a3a6 sago007 2008-08-29 14:32 2016
                    if (board[j][i]%30==14)
27ae0175 sago007 2009-01-30 06:02 2017
                        DrawIMG(garbageBR, sBoard, j*bsize, 12*bsize-i*bsize-pixels); //good
89c4a3a6 sago007 2008-08-29 14:32 2018
                    if (board[j][i]%30==15)
27ae0175 sago007 2009-01-30 06:02 2019
                        DrawIMG(garbageM, sBoard, j*bsize, 12*bsize-i*bsize-pixels); //good
89c4a3a6 sago007 2008-08-29 14:32 2020
                    if (board[j][i]%30==16)
27ae0175 sago007 2009-01-30 06:02 2021
                        DrawIMG(garbageFill, sBoard, j*bsize, 12*bsize-i*bsize-pixels); //good
89c4a3a6 sago007 2008-08-29 14:32 2022
                    if (board[j][i]%30==17)
27ae0175 sago007 2009-01-30 06:02 2023
                        DrawIMG(garbageT, sBoard, j*bsize, 12*bsize-i*bsize-pixels); //good
89c4a3a6 sago007 2008-08-29 14:32 2024
                    if (board[j][i]%30==18)
27ae0175 sago007 2009-01-30 06:02 2025
                        DrawIMG(garbageB, sBoard, j*bsize, 12*bsize-i*bsize-pixels); //good
89c4a3a6 sago007 2008-08-29 14:32 2026
                    if (board[j][i]%30==19)
27ae0175 sago007 2009-01-30 06:02 2027
                        DrawIMG(garbageL, sBoard, j*bsize, 12*bsize-i*bsize-pixels); //good
cad041e3 sago007 2009-03-07 15:16 2028
                    if (board[j][i]%30==20)
cad041e3 sago007 2009-03-07 15:16 2029
                        switch(j) {
cad041e3 sago007 2009-03-07 15:16 2030
                            case 0:
cad041e3 sago007 2009-03-07 15:16 2031
                                DrawIMG(garbageGML, sBoard,j*bsize, 12*bsize-i*bsize-pixels);
cad041e3 sago007 2009-03-07 15:16 2032
                                break;
cad041e3 sago007 2009-03-07 15:16 2033
                            case 5:
cad041e3 sago007 2009-03-07 15:16 2034
                                DrawIMG(garbageGMR, sBoard,j*bsize, 12*bsize-i*bsize-pixels);
cad041e3 sago007 2009-03-07 15:16 2035
                                break;
cad041e3 sago007 2009-03-07 15:16 2036
                            default:
cad041e3 sago007 2009-03-07 15:16 2037
                                DrawIMG(garbageGM, sBoard,j*bsize, 12*bsize-i*bsize-pixels);
cad041e3 sago007 2009-03-07 15:16 2038
                        }
89c4a3a6 sago007 2008-08-29 14:32 2039
                    //cout << "IS: " << board[j][i] << endl;
89c4a3a6 sago007 2008-08-29 14:32 2040
                }
89c4a3a6 sago007 2008-08-29 14:32 2041
89c4a3a6 sago007 2008-08-29 14:32 2042
89c4a3a6 sago007 2008-08-29 14:32 2043
            }
89c4a3a6 sago007 2008-08-29 14:32 2044
89c4a3a6 sago007 2008-08-29 14:32 2045
        int garbageSize=0;
89c4a3a6 sago007 2008-08-29 14:32 2046
        for (int i=0;i<20;i++) {
89c4a3a6 sago007 2008-08-29 14:32 2047
            if ((board[0][i]%30==12)&&(garbageSize>0)) {
27ae0175 sago007 2009-01-30 06:02 2048
                DrawIMG(smiley[0], sBoard, 2*bsize, bsize-i*bsize-pixels+(bsize/2)*garbageSize);
89c4a3a6 sago007 2008-08-29 14:32 2049
            }
89c4a3a6 sago007 2008-08-29 14:32 2050
            if (board[0][i]%30!=19) //not in garbage
89c4a3a6 sago007 2008-08-29 14:32 2051
            {
89c4a3a6 sago007 2008-08-29 14:32 2052
                garbageSize=0;
89c4a3a6 sago007 2008-08-29 14:32 2053
            }
89c4a3a6 sago007 2008-08-29 14:32 2054
            else {
89c4a3a6 sago007 2008-08-29 14:32 2055
                //cout << "In garbage" << endl;
89c4a3a6 sago007 2008-08-29 14:32 2056
                garbageSize++;
89c4a3a6 sago007 2008-08-29 14:32 2057
            }
89c4a3a6 sago007 2008-08-29 14:32 2058
89c4a3a6 sago007 2008-08-29 14:32 2059
        }
89c4a3a6 sago007 2008-08-29 14:32 2060
    }
24a6ea5f sago007 2008-11-13 22:28 2061
    
24a6ea5f sago007 2008-11-13 22:28 2062
    int lastCounter;
89c4a3a6 sago007 2008-08-29 14:32 2063
89c4a3a6 sago007 2008-08-29 14:32 2064
    //Draws everything
89c4a3a6 sago007 2008-08-29 14:32 2065
    void DoPaintJob() {
89c4a3a6 sago007 2008-08-29 14:32 2066
        DrawIMG(backBoard, sBoard, 0, 0);
2f30c381 sago007 2008-09-14 13:08 2067
        #if NETWORK
89c4a3a6 sago007 2008-08-29 14:32 2068
        if ((!bReplaying)&&(!bNetworkPlayer))
2f30c381 sago007 2008-09-14 13:08 2069
        #else
2f30c381 sago007 2008-09-14 13:08 2070
        if (!bReplaying)
2f30c381 sago007 2008-09-14 13:08 2071
        #endif
89c4a3a6 sago007 2008-08-29 14:32 2072
            PaintBricks();
89c4a3a6 sago007 2008-08-29 14:32 2073
        else
89c4a3a6 sago007 2008-08-29 14:32 2074
            SimplePaintBricks();
27ae0175 sago007 2009-01-30 06:02 2075
        if (stageClear) DrawIMG(blackLine, sBoard, 0, bsize*(12+2)+bsize*(stageClearLimit-linesCleared)-pixels-1);
89c4a3a6 sago007 2008-08-29 14:32 2076
        if (puzzleMode&&(!bGameOver)) {
89c4a3a6 sago007 2008-08-29 14:32 2077
            //We need to write nr. of moves left!
89c4a3a6 sago007 2008-08-29 14:32 2078
            strHolder = "Moves left: " + itoa(MovesLeft);
89c4a3a6 sago007 2008-08-29 14:32 2079
            SFont_Write(sBoard, fBlueFont, 5, 5, strHolder.c_str());
89c4a3a6 sago007 2008-08-29 14:32 2080
        }
89c4a3a6 sago007 2008-08-29 14:32 2081
        if(puzzleMode && stageButtonStatus == SBpuzzleMode)
89c4a3a6 sago007 2008-08-29 14:32 2082
        {
89c4a3a6 sago007 2008-08-29 14:32 2083
            DrawIMG(bRetry,sBoard, cordRetryButton.x, cordRetryButton.y);
89c4a3a6 sago007 2008-08-29 14:32 2084
            if(Level<nrOfPuzzles-1)
89c4a3a6 sago007 2008-08-29 14:32 2085
            {
89c4a3a6 sago007 2008-08-29 14:32 2086
                if(hasWonTheGame)
89c4a3a6 sago007 2008-08-29 14:32 2087
                    DrawIMG(bNext,sBoard,cordNextButton.x, cordNextButton.y);
89c4a3a6 sago007 2008-08-29 14:32 2088
                else
89c4a3a6 sago007 2008-08-29 14:32 2089
                    DrawIMG(bSkip,sBoard,cordNextButton.x, cordNextButton.y);
89c4a3a6 sago007 2008-08-29 14:32 2090
            }
89c4a3a6 sago007 2008-08-29 14:32 2091
            else
89c4a3a6 sago007 2008-08-29 14:32 2092
            {
89c4a3a6 sago007 2008-08-29 14:32 2093
                strHolder = "Last puzzle";
89c4a3a6 sago007 2008-08-29 14:32 2094
                SFont_Write(sBoard, fBlueFont, 5, 5, strHolder.c_str());
89c4a3a6 sago007 2008-08-29 14:32 2095
            }
89c4a3a6 sago007 2008-08-29 14:32 2096
        }
89c4a3a6 sago007 2008-08-29 14:32 2097
        if(stageClear && stageButtonStatus == SBstageClear)
89c4a3a6 sago007 2008-08-29 14:32 2098
        {
89c4a3a6 sago007 2008-08-29 14:32 2099
            DrawIMG(bRetry,sBoard, cordRetryButton.x, cordRetryButton.y);
89c4a3a6 sago007 2008-08-29 14:32 2100
            if(Level<50-1)
89c4a3a6 sago007 2008-08-29 14:32 2101
            {
89c4a3a6 sago007 2008-08-29 14:32 2102
                if(hasWonTheGame)
89c4a3a6 sago007 2008-08-29 14:32 2103
                    DrawIMG(bNext,sBoard,cordNextButton.x, cordNextButton.y);
89c4a3a6 sago007 2008-08-29 14:32 2104
                else
89c4a3a6 sago007 2008-08-29 14:32 2105
                    DrawIMG(bSkip,sBoard,cordNextButton.x, cordNextButton.y);
89c4a3a6 sago007 2008-08-29 14:32 2106
            }
89c4a3a6 sago007 2008-08-29 14:32 2107
            else
89c4a3a6 sago007 2008-08-29 14:32 2108
            {
89c4a3a6 sago007 2008-08-29 14:32 2109
                strHolder = "Last stage";
89c4a3a6 sago007 2008-08-29 14:32 2110
                SFont_Write(sBoard, fBlueFont, 5, 5, strHolder.c_str());
89c4a3a6 sago007 2008-08-29 14:32 2111
            }
89c4a3a6 sago007 2008-08-29 14:32 2112
        }
89c4a3a6 sago007 2008-08-29 14:32 2113
        
1572de2b sago007 2008-09-11 18:15 2114
#if DEBUG
89c4a3a6 sago007 2008-08-29 14:32 2115
        if (AI_Enabled&&(!bGameOver)) {
89c4a3a6 sago007 2008-08-29 14:32 2116
            strHolder = "AI_status: " + itoa(AIstatus)+ ", "+ itoa(AIlineToClear);
89c4a3a6 sago007 2008-08-29 14:32 2117
            SFont_Write(sBoard, fBlueFont, 5, 5, strHolder.c_str());
89c4a3a6 sago007 2008-08-29 14:32 2118
        }
89c4a3a6 sago007 2008-08-29 14:32 2119
#endif
27ae0175 sago007 2009-01-30 06:02 2120
        if (!bGameOver)DrawIMG(cursor[(SDL_GetTicks()/600)%2],sBoard,cursorx*bsize-4,11*bsize-cursory*bsize-pixels-4);
89c4a3a6 sago007 2008-08-29 14:32 2121
        if (SDL_GetTicks()<gameStartedAt)
24a6ea5f sago007 2008-11-13 22:28 2122
        {
24a6ea5f sago007 2008-11-13 22:28 2123
            int currentCounter = abs((int)SDL_GetTicks()-(int)gameStartedAt)/1000;
24a6ea5f sago007 2008-11-13 22:28 2124
            if( (currentCounter!=lastCounter) && (SoundEnabled)&&(!NoSound))
24a6ea5f sago007 2008-11-13 22:28 2125
                Mix_PlayChannel(1,counterChunk,0);
24a6ea5f sago007 2008-11-13 22:28 2126
            lastCounter = currentCounter;
24a6ea5f sago007 2008-11-13 22:28 2127
            switch (currentCounter) {
89c4a3a6 sago007 2008-08-29 14:32 2128
            case 2:
27ae0175 sago007 2009-01-30 06:02 2129
                DrawIMG(counter[2], sBoard, 2*bsize, 5*bsize);
89c4a3a6 sago007 2008-08-29 14:32 2130
                break;
89c4a3a6 sago007 2008-08-29 14:32 2131
            case 1:
27ae0175 sago007 2009-01-30 06:02 2132
                DrawIMG(counter[1], sBoard, 2*bsize, 5*bsize);
89c4a3a6 sago007 2008-08-29 14:32 2133
                break;
89c4a3a6 sago007 2008-08-29 14:32 2134
            case 0:
27ae0175 sago007 2009-01-30 06:02 2135
                DrawIMG(counter[0], sBoard, 2*bsize, 5*bsize);
89c4a3a6 sago007 2008-08-29 14:32 2136
                break;
89c4a3a6 sago007 2008-08-29 14:32 2137
            default:
89c4a3a6 sago007 2008-08-29 14:32 2138
                break;
89c4a3a6 sago007 2008-08-29 14:32 2139
            }
24a6ea5f sago007 2008-11-13 22:28 2140
        }
24a6ea5f sago007 2008-11-13 22:28 2141
        else
24a6ea5f sago007 2008-11-13 22:28 2142
        {
6d48320c sago007 2009-03-28 17:06 2143
            if(SoundEnabled&&(!NoSound)&&(timetrial)&&(SDL_GetTicks()>gameStartedAt+10000)&&(!bGameOver))
6d48320c sago007 2009-03-28 17:06 2144
            {
6d48320c sago007 2009-03-28 17:06 2145
                int currentCounter = (SDL_GetTicks()-(int)gameStartedAt)/1000;
6d48320c sago007 2009-03-28 17:06 2146
                if(currentCounter!=lastCounter)
6d48320c sago007 2009-03-28 17:06 2147
                {
e88298d9 sago007 2009-03-29 00:17 2148
                    if(currentCounter>115 && currentCounter<120)
6d48320c sago007 2009-03-28 17:06 2149
                        Mix_PlayChannel(1,counterChunk,0);
6d48320c sago007 2009-03-28 17:06 2150
                }
6d48320c sago007 2009-03-28 17:06 2151
                lastCounter = currentCounter;
6d48320c sago007 2009-03-28 17:06 2152
            }
6d48320c sago007 2009-03-28 17:06 2153
            else
6d48320c sago007 2009-03-28 17:06 2154
            {
6d48320c sago007 2009-03-28 17:06 2155
                if( (0==lastCounter) && (SoundEnabled)&&(!NoSound))
6d48320c sago007 2009-03-28 17:06 2156
                {
6d48320c sago007 2009-03-28 17:06 2157
                    Mix_PlayChannel(1,counterFinalChunk,0);
6d48320c sago007 2009-03-28 17:06 2158
                }
6d48320c sago007 2009-03-28 17:06 2159
                lastCounter = -1;
6d48320c sago007 2009-03-28 17:06 2160
            }
24a6ea5f sago007 2008-11-13 22:28 2161
        }
6d48320c sago007 2009-03-28 17:06 2162
        
89c4a3a6 sago007 2008-08-29 14:32 2163
        if ((bGameOver)&&(!editorMode))
27ae0175 sago007 2009-01-30 06:02 2164
            if (hasWonTheGame)DrawIMG(iWinner, sBoard, 0, 5*bsize);
27ae0175 sago007 2009-01-30 06:02 2165
            else if (bDraw) DrawIMG(iDraw, sBoard, 0, 5*bsize);
89c4a3a6 sago007 2008-08-29 14:32 2166
            else
27ae0175 sago007 2009-01-30 06:02 2167
                DrawIMG(iGameOver, sBoard, 0, 5*bsize);
89c4a3a6 sago007 2008-08-29 14:32 2168
    }
89c4a3a6 sago007 2008-08-29 14:32 2169
2e57d791 sago007 2009-06-04 17:48 2170
    #endif
2e57d791 sago007 2009-06-04 17:48 2171
89c4a3a6 sago007 2008-08-29 14:32 2172
    //Updates evrything, if not called nothing happends
89c4a3a6 sago007 2008-08-29 14:32 2173
    void Update() {
89c4a3a6 sago007 2008-08-29 14:32 2174
        Uint32 tempUInt32;
89c4a3a6 sago007 2008-08-29 14:32 2175
        Uint32 nowTime = SDL_GetTicks(); //We remember the time, so it doesn't change during this call
89c4a3a6 sago007 2008-08-29 14:32 2176
        if (bReplaying) {
89c4a3a6 sago007 2008-08-29 14:32 2177
            setBoard(theReplay.getFrameSec((Uint32)(nowTime-gameStartedAt)));
c96f480e sago007 2009-03-28 18:59 2178
            strncpy(name,theReplay.name,30);
89c4a3a6 sago007 2008-08-29 14:32 2179
            if (theReplay.isFinnished((Uint32)(nowTime-gameStartedAt)))
89c4a3a6 sago007 2008-08-29 14:32 2180
                switch (theReplay.getFinalStatus()) {
89c4a3a6 sago007 2008-08-29 14:32 2181
                case 1: //Winner
89c4a3a6 sago007 2008-08-29 14:32 2182
                    bGameOver = true;
89c4a3a6 sago007 2008-08-29 14:32 2183
                    hasWonTheGame = true;
89c4a3a6 sago007 2008-08-29 14:32 2184
                    break;
89c4a3a6 sago007 2008-08-29 14:32 2185
                case 2: //Looser
89c4a3a6 sago007 2008-08-29 14:32 2186
                case 4: //GameOver
89c4a3a6 sago007 2008-08-29 14:32 2187
                    bGameOver = true;
89c4a3a6 sago007 2008-08-29 14:32 2188
                    break;
89c4a3a6 sago007 2008-08-29 14:32 2189
                case 3: //draw
89c4a3a6 sago007 2008-08-29 14:32 2190
                    bGameOver =true;
89c4a3a6 sago007 2008-08-29 14:32 2191
                    bDraw = true;
89c4a3a6 sago007 2008-08-29 14:32 2192
                    break;
89c4a3a6 sago007 2008-08-29 14:32 2193
                default:
89c4a3a6 sago007 2008-08-29 14:32 2194
                    bGameOver = true;
89c4a3a6 sago007 2008-08-29 14:32 2195
                    //Nothing
89c4a3a6 sago007 2008-08-29 14:32 2196
                    break;
89c4a3a6 sago007 2008-08-29 14:32 2197
                };
89c4a3a6 sago007 2008-08-29 14:32 2198
        }
2f30c381 sago007 2008-09-14 13:08 2199
        #if NETWORK
89c4a3a6 sago007 2008-08-29 14:32 2200
        if ((!bReplaying)&&(!bNetworkPlayer)) {
2f30c381 sago007 2008-09-14 13:08 2201
        #else
2f30c381 sago007 2008-09-14 13:08 2202
            if (!bReplaying) {
2f30c381 sago007 2008-09-14 13:08 2203
        #endif
89c4a3a6 sago007 2008-08-29 14:32 2204
            FindTowerHeight();
89c4a3a6 sago007 2008-08-29 14:32 2205
            if ((linesCleared-TowerHeight>stageClearLimit) && (stageClear) && (!bGameOver)) {
89c4a3a6 sago007 2008-08-29 14:32 2206
                stageCleared[Level] = true;
89c4a3a6 sago007 2008-08-29 14:32 2207
                if(stageScores[Level]<score)
89c4a3a6 sago007 2008-08-29 14:32 2208
                {
89c4a3a6 sago007 2008-08-29 14:32 2209
                    gameEndedAfter = nowTime-gameStartedAt;
89c4a3a6 sago007 2008-08-29 14:32 2210
                    stageScores[Level] = score;
89c4a3a6 sago007 2008-08-29 14:32 2211
                    stageTimes[Level] = gameEndedAfter;
89c4a3a6 sago007 2008-08-29 14:32 2212
                }
89c4a3a6 sago007 2008-08-29 14:32 2213
89c4a3a6 sago007 2008-08-29 14:32 2214
                ofstream outfile;
89c4a3a6 sago007 2008-08-29 14:32 2215
                outfile.open(stageClearSavePath.c_str(), ios::binary |ios::trunc);
89c4a3a6 sago007 2008-08-29 14:32 2216
                if (!outfile) {
89c4a3a6 sago007 2008-08-29 14:32 2217
                    cout << "Error writing to file: " << stageClearSavePath << endl;
89c4a3a6 sago007 2008-08-29 14:32 2218
                }
89c4a3a6 sago007 2008-08-29 14:32 2219
                else {
89c4a3a6 sago007 2008-08-29 14:32 2220
                    for (int i=0;i<nrOfStageLevels;i++) {
89c4a3a6 sago007 2008-08-29 14:32 2221
                        bool tempBool = stageCleared[i];
89c4a3a6 sago007 2008-08-29 14:32 2222
                        outfile.write(reinterpret_cast<char*>(&tempBool), sizeof(bool));
89c4a3a6 sago007 2008-08-29 14:32 2223
                    }
89c4a3a6 sago007 2008-08-29 14:32 2224
                    for (int i=0;i<nrOfStageLevels;i++) {
89c4a3a6 sago007 2008-08-29 14:32 2225
                        tempUInt32 = stageScores[i];
89c4a3a6 sago007 2008-08-29 14:32 2226
                        outfile.write(reinterpret_cast<char*>(&tempUInt32), sizeof(Uint32));
89c4a3a6 sago007 2008-08-29 14:32 2227
                    }
89c4a3a6 sago007 2008-08-29 14:32 2228
                    for (int i=0;i<nrOfStageLevels;i++) {
89c4a3a6 sago007 2008-08-29 14:32 2229
                        tempUInt32 = stageTimes[i];
89c4a3a6 sago007 2008-08-29 14:32 2230
                        outfile.write(reinterpret_cast<char*>(&tempUInt32), sizeof(Uint32));
89c4a3a6 sago007 2008-08-29 14:32 2231
                    }
89c4a3a6 sago007 2008-08-29 14:32 2232
                    outfile.close();
89c4a3a6 sago007 2008-08-29 14:32 2233
                }
89c4a3a6 sago007 2008-08-29 14:32 2234
                setPlayerWon();
89c4a3a6 sago007 2008-08-29 14:32 2235
                stageButtonStatus = SBstageClear;
89c4a3a6 sago007 2008-08-29 14:32 2236
            }
89c4a3a6 sago007 2008-08-29 14:32 2237
            if ((TowerHeight>12)&&(prevTowerHeight<13)&&(!puzzleMode)) {
6d48320c sago007 2009-03-28 17:06 2238
                //if (SoundEnabled) Mix_PlayChannel(1, heartBeat, 0);
89c4a3a6 sago007 2008-08-29 14:32 2239
                stop+=1000;
89c4a3a6 sago007 2008-08-29 14:32 2240
            }
6d48320c sago007 2009-03-28 17:06 2241
6d48320c sago007 2009-03-28 17:06 2242
            if ((TowerHeight>12)&&(!puzzleMode)&&(!bGameOver)) {
6d48320c sago007 2009-03-28 17:06 2243
                bNearDeath = true;
6d48320c sago007 2009-03-28 17:06 2244
            }
89c4a3a6 sago007 2008-08-29 14:32 2245
            
89c4a3a6 sago007 2008-08-29 14:32 2246
            while (nowTime>nrStops*40+gameStartedAt) //Increase stops, till we reach nowTime
89c4a3a6 sago007 2008-08-29 14:32 2247
            {
89c4a3a6 sago007 2008-08-29 14:32 2248
                if (stop>0) {
89c4a3a6 sago007 2008-08-29 14:32 2249
                    stop = stop-20;
89c4a3a6 sago007 2008-08-29 14:32 2250
                    if (stop<=0) nrPushedPixel=(int)((nowTime-gameStartedAt)/(1000.0*speed));
89c4a3a6 sago007 2008-08-29 14:32 2251
                }
89c4a3a6 sago007 2008-08-29 14:32 2252
                if (stop<0)
89c4a3a6 sago007 2008-08-29 14:32 2253
                    stop = 0;
89c4a3a6 sago007 2008-08-29 14:32 2254
                nrStops++;
89c4a3a6 sago007 2008-08-29 14:32 2255
            }
89c4a3a6 sago007 2008-08-29 14:32 2256
            //If we have static content, we don't raise at all!
89c4a3a6 sago007 2008-08-29 14:32 2257
            if (hasStaticContent())
89c4a3a6 sago007 2008-08-29 14:32 2258
                stop++;
89c4a3a6 sago007 2008-08-29 14:32 2259
            if ((puzzleMode)&&(!bGameOver)&&BoardEmpty()) {
89c4a3a6 sago007 2008-08-29 14:32 2260
                if (!singlePuzzle) {
32c9b349 sago007 2008-11-20 18:14 2261
                    if(puzzleCleared[Level]==false)
32c9b349 sago007 2008-11-20 18:14 2262
                        Stats::getInstance()->addOne("puzzlesSolved");
89c4a3a6 sago007 2008-08-29 14:32 2263
                    puzzleCleared[Level] = true;
89c4a3a6 sago007 2008-08-29 14:32 2264
                    ofstream outfile;
89c4a3a6 sago007 2008-08-29 14:32 2265
                    stageButtonStatus = SBpuzzleMode;
89c4a3a6 sago007 2008-08-29 14:32 2266
                    outfile.open(puzzleSavePath.c_str(), ios::binary |ios::trunc);
89c4a3a6 sago007 2008-08-29 14:32 2267
                    if (!outfile) {
89c4a3a6 sago007 2008-08-29 14:32 2268
                        cout << "Error writing to file: " << puzzleSavePath << endl;
89c4a3a6 sago007 2008-08-29 14:32 2269
                    }
89c4a3a6 sago007 2008-08-29 14:32 2270
                    else {
89c4a3a6 sago007 2008-08-29 14:32 2271
                        for (int i=0;i<nrOfPuzzles;i++) {
89c4a3a6 sago007 2008-08-29 14:32 2272
                            bool tempBool = puzzleCleared[i];
89c4a3a6 sago007 2008-08-29 14:32 2273
                            outfile.write(reinterpret_cast<char*>(&tempBool), sizeof(bool));
89c4a3a6 sago007 2008-08-29 14:32 2274
                        }
89c4a3a6 sago007 2008-08-29 14:32 2275
                        outfile.close();
89c4a3a6 sago007 2008-08-29 14:32 2276
                    }
89c4a3a6 sago007 2008-08-29 14:32 2277
                }
89c4a3a6 sago007 2008-08-29 14:32 2278
                setPlayerWon();
89c4a3a6 sago007 2008-08-29 14:32 2279
            }
89c4a3a6 sago007 2008-08-29 14:32 2280
            
89c4a3a6 sago007 2008-08-29 14:32 2281
            //increse speed:
89c4a3a6 sago007 2008-08-29 14:32 2282
            if ((nowTime>gameStartedAt+20000*speedLevel)&&(speedLevel <99)&&(!bGameOver))
89c4a3a6 sago007 2008-08-29 14:32 2283
            {
89c4a3a6 sago007 2008-08-29 14:32 2284
                speed = (baseSpeed*0.9)/((double)speedLevel*0.5);
89c4a3a6 sago007 2008-08-29 14:32 2285
                speedLevel++;
89c4a3a6 sago007 2008-08-29 14:32 2286
                nrPushedPixel=(int)((double)(nowTime-gameStartedAt)/(1000.0*speed));
89c4a3a6 sago007 2008-08-29 14:32 2287
            }
89c4a3a6 sago007 2008-08-29 14:32 2288
            
89c4a3a6 sago007 2008-08-29 14:32 2289
            
89c4a3a6 sago007 2008-08-29 14:32 2290
            //To prevent the stack from raising a lot then we stop a chain (doesn't work anymore)
89c4a3a6 sago007 2008-08-29 14:32 2291
            if (chain>0)
89c4a3a6 sago007 2008-08-29 14:32 2292
                stop+=1;
89c4a3a6 sago007 2008-08-29 14:32 2293
            //Raises the stack
89c4a3a6 sago007 2008-08-29 14:32 2294
            if ((nowTime>gameStartedAt+nrPushedPixel*1000*speed) && (!bGameOver)&&(!stop))
89c4a3a6 sago007 2008-08-29 14:32 2295
                while ((nowTime>gameStartedAt+nrPushedPixel*1000*speed)&&(!(puzzleMode)))
89c4a3a6 sago007 2008-08-29 14:32 2296
                    PushPixels();
89c4a3a6 sago007 2008-08-29 14:32 2297
            if (!bGameOver)ClearBlocks();
89c4a3a6 sago007 2008-08-29 14:32 2298
            
89c4a3a6 sago007 2008-08-29 14:32 2299
            /*************************************************************
89c4a3a6 sago007 2008-08-29 14:32 2300
            Ai stuff
89c4a3a6 sago007 2008-08-29 14:32 2301
             **************************************************************/
89c4a3a6 sago007 2008-08-29 14:32 2302
            if (bGameOver) {
89c4a3a6 sago007 2008-08-29 14:32 2303
                AIstatus = 0;       //Enusres that AI is resetted
89c4a3a6 sago007 2008-08-29 14:32 2304
            }
89c4a3a6 sago007 2008-08-29 14:32 2305
            else
89c4a3a6 sago007 2008-08-29 14:32 2306
                if (AI_Enabled)
89c4a3a6 sago007 2008-08-29 14:32 2307
                    if (lastAImove+AI_MoveSpeed<SDL_GetTicks()) {
89c4a3a6 sago007 2008-08-29 14:32 2308
                        AI_Move();
89c4a3a6 sago007 2008-08-29 14:32 2309
                        lastAImove=SDL_GetTicks();
89c4a3a6 sago007 2008-08-29 14:32 2310
                    }
89c4a3a6 sago007 2008-08-29 14:32 2311
89c4a3a6 sago007 2008-08-29 14:32 2312
            /*************************************************************
89c4a3a6 sago007 2008-08-29 14:32 2313
            Ai stuff ended
89c4a3a6 sago007 2008-08-29 14:32 2314
             **************************************************************/
89c4a3a6 sago007 2008-08-29 14:32 2315
            if ((nowTime>gameStartedAt+nrFellDown*140) && (!bGameOver)) FallDown();
89c4a3a6 sago007 2008-08-29 14:32 2316
            if ((nowTime<gameStartedAt)&&(puzzleMode)) {
89c4a3a6 sago007 2008-08-29 14:32 2317
                FallDown();
89c4a3a6 sago007 2008-08-29 14:32 2318
                nrFellDown--;
89c4a3a6 sago007 2008-08-29 14:32 2319
            }
89c4a3a6 sago007 2008-08-29 14:32 2320
            ReduceStuff();
89c4a3a6 sago007 2008-08-29 14:32 2321
            if ((timetrial) && (!bGameOver) && (nowTime>gameStartedAt+2*60*1000)) {
89c4a3a6 sago007 2008-08-29 14:32 2322
                SetGameOver();
6d48320c sago007 2009-03-28 17:06 2323
                if(!NoSound && SoundEnabled)Mix_PlayChannel(1,counterFinalChunk,0);
89c4a3a6 sago007 2008-08-29 14:32 2324
                if ((theTopScoresTimeTrial.isHighScore(score))&&(!AI_Enabled)) {
89c4a3a6 sago007 2008-08-29 14:32 2325
                    theTopScoresTimeTrial.addScore(name, score);
89c4a3a6 sago007 2008-08-29 14:32 2326
                    //new highscore
89c4a3a6 sago007 2008-08-29 14:32 2327
                    //Also check if it is better than the best result so far.
89c4a3a6 sago007 2008-08-29 14:32 2328
                    string checkFilename = getPathToSaveFiles() + "/bestTTresult";
89c4a3a6 sago007 2008-08-29 14:32 2329
                    ifstream inFile(checkFilename.c_str());
89c4a3a6 sago007 2008-08-29 14:32 2330
                    Uint32 bestResult = 3000; //Never accept a best result under 3000
89c4a3a6 sago007 2008-08-29 14:32 2331
                    if(inFile)
89c4a3a6 sago007 2008-08-29 14:32 2332
                    {
89c4a3a6 sago007 2008-08-29 14:32 2333
                        inFile >> bestResult;
89c4a3a6 sago007 2008-08-29 14:32 2334
                        inFile.close();
89c4a3a6 sago007 2008-08-29 14:32 2335
                    }
89c4a3a6 sago007 2008-08-29 14:32 2336
                    if(score>bestResult)
89c4a3a6 sago007 2008-08-29 14:32 2337
                    {
89c4a3a6 sago007 2008-08-29 14:32 2338
                        string bestFile = getPathToSaveFiles() + "/bestTT";
89c4a3a6 sago007 2008-08-29 14:32 2339
                        theReplay.saveReplay(bestFile);
89c4a3a6 sago007 2008-08-29 14:32 2340
                        ofstream outFile(checkFilename.c_str(),ios::trunc);
89c4a3a6 sago007 2008-08-29 14:32 2341
                        if(outFile)
89c4a3a6 sago007 2008-08-29 14:32 2342
                            outFile << score;
89c4a3a6 sago007 2008-08-29 14:32 2343
                    }
89c4a3a6 sago007 2008-08-29 14:32 2344
                }
89c4a3a6 sago007 2008-08-29 14:32 2345
            }
89c4a3a6 sago007 2008-08-29 14:32 2346
        }
89c4a3a6 sago007 2008-08-29 14:32 2347
        if ((!bGameOver)&&(!bReplaying)&&(nowTime>gameStartedAt))
89c4a3a6 sago007 2008-08-29 14:32 2348
        {
89c4a3a6 sago007 2008-08-29 14:32 2349
            //cout << nowTime << " bigger than " << gameStartedAt << endl;
89c4a3a6 sago007 2008-08-29 14:32 2350
            theReplay.setFrameSecTo(nowTime-gameStartedAt, getPackage());
89c4a3a6 sago007 2008-08-29 14:32 2351
        }
89c4a3a6 sago007 2008-08-29 14:32 2352
        DoPaintJob();
89c4a3a6 sago007 2008-08-29 14:32 2353
    }
89c4a3a6 sago007 2008-08-29 14:32 2354
89c4a3a6 sago007 2008-08-29 14:32 2355
}; //class BlockGame
89c4a3a6 sago007 2008-08-29 14:32 2356
////////////////////////////////////////////////////////////////////////////////
89c4a3a6 sago007 2008-08-29 14:32 2357
///////////////////////// BlockAttack class end ////////////////////////////////
89c4a3a6 sago007 2008-08-29 14:32 2358
////////////////////////////////////////////////////////////////////////////////
1970-01-01 00:00 2359