git repos / blockattack-game

blame: source/code/BlockGame.cpp

normal view · raw

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