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