├── LICENSE.md ├── README.md ├── screenshot1.png ├── screenshot2.png ├── screenshot3.png └── tetris.bas /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright (C) 2013 Michael Fogleman 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Future Blocks 2 | 3 | Tetris clone written in QBasic. I wrote this in the year 2000 while in high 4 | school. I found it hosted online. I am publishing it on GitHub for eternal 5 | posterity. Runs great in DOSBox. 6 | 7 | ### Play Online! 8 | 9 | You can emulate DOS programs on the Internet Archive now! 10 | 11 | https://archive.org/details/TETRIS.EXE 12 | 13 | ### Screenshots 14 | 15 | ![](https://raw.github.com/fogleman/FutureBlocks/master/screenshot1.png) 16 | 17 | ![](https://raw.github.com/fogleman/FutureBlocks/master/screenshot2.png) 18 | 19 | ![](https://raw.github.com/fogleman/FutureBlocks/master/screenshot3.png) 20 | -------------------------------------------------------------------------------- /screenshot1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/FutureBlocks/7844017685b85d358dd22c0fd84b07ab8d133f1d/screenshot1.png -------------------------------------------------------------------------------- /screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/FutureBlocks/7844017685b85d358dd22c0fd84b07ab8d133f1d/screenshot2.png -------------------------------------------------------------------------------- /screenshot3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fogleman/FutureBlocks/7844017685b85d358dd22c0fd84b07ab8d133f1d/screenshot3.png -------------------------------------------------------------------------------- /tetris.bas: -------------------------------------------------------------------------------- 1 | 'Future Blocks - By Michael Fogleman 2 | 'Start Date : April 20, 2000 3 | 'Finish Date: April 24, 2000 4 | 5 | Start: 6 | DECLARE SUB BlueColors () 7 | DECLARE SUB RestoreColors () 8 | DECLARE SUB Colors (c%, r%, g%, b%) 9 | DECLARE SUB GetPal () 10 | DECLARE SUB CompeteScreen () 11 | DECLARE SUB GameOverScreen () 12 | DECLARE SUB Menu () 13 | DECLARE SUB PreOccupy (height%) 14 | DECLARE SUB DrawBlock2 (x%, y%, c%) 15 | DECLARE SUB DrawPiece2 (px%, py%, piece%, col%) 16 | DECLARE SUB DrawText (x%, y%, txt$, c%, size%, typ%) 17 | DECLARE SUB TitleScreen () 18 | DECLARE SUB ReadText () 19 | DECLARE SUB DrawLetter (x%, y%, letter%, c%, size%, typ%) 20 | DECLARE SUB InfoDisplay () 21 | DECLARE SUB CheckFinalMove () 22 | DECLARE SUB ComputerPlay (Display%) 23 | DECLARE SUB CompComplete () 24 | DECLARE SUB MoveLeft () 25 | DECLARE SUB MoveRight () 26 | DECLARE SUB CheckOverlap () 27 | DECLARE SUB RotatePiece () 28 | DECLARE SUB RefreshField () 29 | DECLARE SUB CheckComplete () 30 | DECLARE SUB CheckTouch () 31 | DECLARE SUB StoreOccupy () 32 | DECLARE SUB DebugDisplay () 33 | DECLARE SUB MainLoop () 34 | DECLARE SUB Delay (dtime!) 35 | DECLARE SUB NewPiece () 36 | DECLARE SUB DrawField () 37 | DECLARE SUB DrawBlock (xn%, yn%, c%) 38 | DECLARE SUB ReadData () 39 | DECLARE SUB DrawPiece (xn%, yn%, piece%, r%, col%) 40 | COMMON SHARED FieldWidth%, FieldHeight%, BlockSize%, XOffset%, YOffset%, Occupied%() 41 | COMMON SHARED PieceData%(), CurrentColor%(), Text%(), PieceList%(), competen% 42 | COMMON SHARED CurrentPiece%, PieceX%, PieceY%, PieceR%, PieceC%, Grid%, CMN% 43 | COMMON SHARED OldPiece%, OldX%, OldY%, OldR%, GameOver%, Overlap%, Debug% 44 | COMMON SHARED NumComplete%, hint%, CPlay%, DestX%, DestY%, DestR%, usery%, pal%() 45 | COMMON SHARED LineWeight, GapWeight, HeightWeight, ink$, NextC%, SideWeight 46 | COMMON SHARED DispWidth%, DispHeight%, DispX%, DispY%, XShift%, messyheight% 47 | COMMON SHARED Lines%, Score&, GameTime&, StartTime, PieceTime, AirTime, Compete% 48 | COMMON SHARED gap%, shadow%, Lines2%, Score2&, GameTime2&, NextPiece%, Pieces&, Pieces2& 49 | COMMON SHARED YourLines%, YourScore&, lastmove% 50 | 51 | DIM PieceData%(17, 3, 6) 52 | DIM Text%(39, 34) 53 | DIM PieceList%(999) 54 | DIM pal%(50) 55 | ReadData 56 | ReadText 57 | 58 | CLS 59 | SCREEN 12 60 | 61 | GetPal 62 | TitleScreen 63 | Grid% = 0 64 | Debug% = 0 65 | LineWeight = 3 66 | GapWeight = 4 67 | HeightWeight = 1 68 | SideWeight = 1 69 | FieldWidth% = 12 70 | FieldHeight% = 24 71 | BlockSize% = 16 72 | competen% = 50 73 | 74 | DoneComp: 75 | DO 76 | Compete% = 0 77 | Menu 78 | GameOver% = 0 79 | CLS 80 | RANDOMIZE TIMER 81 | NextPiece% = RND * 6 + 1 82 | NextC% = RND * 6 + 1 83 | GameTime2& = -1 84 | Lines2% = -1 85 | Pieces2& = -1 86 | Score2& = -1 87 | Pieces& = 0 88 | Lines% = 0 89 | Score& = 0 90 | DispHeight% = 440 91 | DispWidth% = 147 92 | DispY% = (480 - DispHeight%) / 2 93 | DispX% = 640 - DispY% - DispWidth% 94 | XShift% = 320 - (DispX% / 2) 95 | XOffset% = ((BlockSize% + 2) * FieldWidth%) / 2 96 | YOffset% = ((BlockSize% + 2) * FieldHeight%) / 2 97 | IF Compete% = 1 THEN GOTO CompetitionMode 98 | gap% = 6: shadow% = 2 99 | DrawField 100 | DIM CurrentColor%(FieldWidth%, FieldHeight%) 101 | DIM Occupied%(FieldWidth%, FieldHeight%) 102 | IF messyheight% > 0 THEN PreOccupy messyheight% 103 | NewPiece 104 | StartTime = TIMER 105 | MainLoop 106 | GameOverScreen 107 | ERASE Occupied%, CurrentColor% 108 | LOOP 109 | 110 | CompetitionMode: 111 | hint% = 0 112 | CMN% = 0 113 | n% = 0 114 | DO 115 | PieceList%(n%) = RND * 6 + 1 116 | n% = n% + 1 117 | LOOP WHILE n% < 1000 118 | CPlay% = 0 119 | gap% = 6: shadow% = 2 120 | DrawField 121 | DIM CurrentColor%(FieldWidth%, FieldHeight%) 122 | DIM Occupied%(FieldWidth%, FieldHeight%) 123 | IF messyheight% > 0 THEN PreOccupy messyheight% 124 | NewPiece 125 | StartTime = TIMER 126 | MainLoop 127 | GameOverScreen 128 | YourLines% = Lines% 129 | YourScore& = Score& 130 | ERASE Occupied%, CurrentColor% 131 | 132 | CMN% = 0 133 | GameOver% = 0 134 | CLS 135 | RANDOMIZE TIMER 136 | GameTime2& = -1 137 | Lines2% = -1 138 | Pieces2& = -1 139 | Score2& = -1 140 | Pieces& = 0 141 | Lines% = 0 142 | Score& = 0 143 | gap% = 6: shadow% = 2 144 | CPlay% = 1 145 | DrawField 146 | DIM CurrentColor%(FieldWidth%, FieldHeight%) 147 | DIM Occupied%(FieldWidth%, FieldHeight%) 148 | IF messyheight% > 0 THEN PreOccupy messyheight% 149 | NewPiece 150 | StartTime = TIMER 151 | MainLoop 152 | GameOverScreen 153 | ERASE Occupied%, CurrentColor% 154 | CompeteScreen 155 | GOTO DoneComp 156 | 157 | Piece1: 158 | DATA 2,3 159 | DATA 1,0 160 | DATA 1,1 161 | DATA 0,1 162 | DATA 3,2 163 | DATA 0,1,1 164 | DATA 1,1,0 165 | DATA 2,3 166 | DATA 1,0 167 | DATA 1,1 168 | DATA 0,1 169 | DATA 3,2 170 | DATA 0,1,1 171 | DATA 1,1,0 172 | Piece2: 173 | DATA 2,3 174 | DATA 0,1 175 | DATA 1,1 176 | DATA 1,0 177 | DATA 3,2 178 | DATA 1,1,0 179 | DATA 0,1,1 180 | DATA 2,3 181 | DATA 0,1 182 | DATA 1,1 183 | DATA 1,0 184 | DATA 3,2 185 | DATA 1,1,0 186 | DATA 0,1,1 187 | Piece3: 188 | DATA 2,2 189 | DATA 1,1 190 | DATA 1,1 191 | DATA 2,2 192 | DATA 1,1 193 | DATA 1,1 194 | DATA 2,2 195 | DATA 1,1 196 | DATA 1,1 197 | DATA 2,2 198 | DATA 1,1 199 | DATA 1,1 200 | Piece4: 201 | DATA 1,4 202 | DATA 1 203 | DATA 1 204 | DATA 1 205 | DATA 1 206 | DATA 4,1 207 | DATA 1,1,1,1 208 | DATA 1,4 209 | DATA 1 210 | DATA 1 211 | DATA 1 212 | DATA 1 213 | DATA 4,1 214 | DATA 1,1,1,1 215 | Piece5: 216 | DATA 2,3 217 | DATA 1,0 218 | DATA 1,0 219 | DATA 1,1 220 | DATA 3,2 221 | DATA 1,1,1 222 | DATA 1,0,0 223 | DATA 2,3 224 | DATA 1,1 225 | DATA 0,1 226 | DATA 0,1 227 | DATA 3,2 228 | DATA 0,0,1 229 | DATA 1,1,1 230 | Piece6: 231 | DATA 2,3 232 | DATA 0,1 233 | DATA 0,1 234 | DATA 1,1 235 | DATA 3,2 236 | DATA 1,0,0 237 | DATA 1,1,1 238 | DATA 2,3 239 | DATA 1,1 240 | DATA 1,0 241 | DATA 1,0 242 | DATA 3,2 243 | DATA 1,1,1 244 | DATA 0,0,1 245 | Piece7: 246 | DATA 3,2 247 | DATA 0,1,0 248 | DATA 1,1,1 249 | DATA 2,3 250 | DATA 1,0 251 | DATA 1,1 252 | DATA 1,0 253 | DATA 3,2 254 | DATA 1,1,1 255 | DATA 0,1,0 256 | DATA 2,3 257 | DATA 0,1 258 | DATA 1,1 259 | DATA 0,1 260 | 261 | Text: 262 | DATA 0,0,1,0,0 263 | DATA 0,1,0,1,0 264 | DATA 1,0,0,0,1 265 | DATA 1,1,1,1,1 266 | DATA 1,0,0,0,1 267 | DATA 1,0,0,0,1 268 | DATA 1,0,0,0,1 269 | 270 | DATA 1,1,1,1,0 271 | DATA 1,0,0,0,1 272 | DATA 1,0,0,0,1 273 | DATA 1,1,1,1,0 274 | DATA 1,0,0,0,1 275 | DATA 1,0,0,0,1 276 | DATA 1,1,1,1,0 277 | 278 | DATA 0,1,1,1,0 279 | DATA 1,0,0,0,1 280 | DATA 1,0,0,0,0 281 | DATA 1,0,0,0,0 282 | DATA 1,0,0,0,0 283 | DATA 1,0,0,0,1 284 | DATA 0,1,1,1,0 285 | 286 | DATA 1,1,1,0,0 287 | DATA 1,0,0,1,0 288 | DATA 1,0,0,0,1 289 | DATA 1,0,0,0,1 290 | DATA 1,0,0,0,1 291 | DATA 1,0,0,1,0 292 | DATA 1,1,1,0,0 293 | 294 | DATA 1,1,1,1,1 295 | DATA 1,0,0,0,0 296 | DATA 1,0,0,0,0 297 | DATA 1,1,1,0,0 298 | DATA 1,0,0,0,0 299 | DATA 1,0,0,0,0 300 | DATA 1,1,1,1,1 301 | 302 | DATA 1,1,1,1,1 303 | DATA 1,0,0,0,0 304 | DATA 1,0,0,0,0 305 | DATA 1,1,1,0,0 306 | DATA 1,0,0,0,0 307 | DATA 1,0,0,0,0 308 | DATA 1,0,0,0,0 309 | 310 | DATA 0,1,1,1,0 311 | DATA 1,0,0,0,1 312 | DATA 1,0,0,0,0 313 | DATA 1,0,0,0,0 314 | DATA 1,0,0,1,1 315 | DATA 1,0,0,0,1 316 | DATA 0,1,1,1,0 317 | 318 | DATA 1,0,0,0,1 319 | DATA 1,0,0,0,1 320 | DATA 1,0,0,0,1 321 | DATA 1,1,1,1,1 322 | DATA 1,0,0,0,1 323 | DATA 1,0,0,0,1 324 | DATA 1,0,0,0,1 325 | 326 | DATA 1,1,1,1,1 327 | DATA 0,0,1,0,0 328 | DATA 0,0,1,0,0 329 | DATA 0,0,1,0,0 330 | DATA 0,0,1,0,0 331 | DATA 0,0,1,0,0 332 | DATA 1,1,1,1,1 333 | 334 | DATA 1,1,1,1,1 335 | DATA 0,0,1,0,0 336 | DATA 0,0,1,0,0 337 | DATA 0,0,1,0,0 338 | DATA 0,0,1,0,0 339 | DATA 0,0,1,0,0 340 | DATA 1,1,0,0,0 341 | 342 | DATA 1,0,0,0,1 343 | DATA 1,0,0,1,0 344 | DATA 1,0,1,0,0 345 | DATA 1,1,0,0,0 346 | DATA 1,0,1,0,0 347 | DATA 1,0,0,1,0 348 | DATA 1,0,0,0,1 349 | 350 | DATA 1,0,0,0,0 351 | DATA 1,0,0,0,0 352 | DATA 1,0,0,0,0 353 | DATA 1,0,0,0,0 354 | DATA 1,0,0,0,0 355 | DATA 1,0,0,0,0 356 | DATA 1,1,1,1,1 357 | 358 | DATA 1,0,0,0,1 359 | DATA 1,1,0,1,1 360 | DATA 1,0,1,0,1 361 | DATA 1,0,0,0,1 362 | DATA 1,0,0,0,1 363 | DATA 1,0,0,0,1 364 | DATA 1,0,0,0,1 365 | 366 | DATA 1,0,0,0,1 367 | DATA 1,1,0,0,1 368 | DATA 1,1,0,0,1 369 | DATA 1,0,1,0,1 370 | DATA 1,0,1,0,1 371 | DATA 1,0,0,1,1 372 | DATA 1,0,0,0,1 373 | 374 | DATA 0,1,1,1,0 375 | DATA 1,0,0,0,1 376 | DATA 1,0,0,0,1 377 | DATA 1,0,0,0,1 378 | DATA 1,0,0,0,1 379 | DATA 1,0,0,0,1 380 | DATA 0,1,1,1,0 381 | 382 | DATA 1,1,1,1,0 383 | DATA 1,0,0,0,1 384 | DATA 1,0,0,0,1 385 | DATA 1,1,1,1,0 386 | DATA 1,0,0,0,0 387 | DATA 1,0,0,0,0 388 | DATA 1,0,0,0,0 389 | 390 | DATA 0,1,1,1,0 391 | DATA 1,0,0,0,1 392 | DATA 1,0,0,0,1 393 | DATA 1,0,0,0,1 394 | DATA 1,0,1,0,1 395 | DATA 1,0,0,1,1 396 | DATA 0,1,1,1,0 397 | 398 | DATA 1,1,1,1,0 399 | DATA 1,0,0,0,1 400 | DATA 1,0,0,0,1 401 | DATA 1,1,1,1,0 402 | DATA 1,0,1,0,0 403 | DATA 1,0,0,1,0 404 | DATA 1,0,0,0,1 405 | 406 | DATA 0,1,1,1,0 407 | DATA 1,0,0,0,1 408 | DATA 1,0,0,0,0 409 | DATA 0,1,1,1,0 410 | DATA 0,0,0,0,1 411 | DATA 1,0,0,0,1 412 | DATA 0,1,1,1,0 413 | 414 | DATA 1,1,1,1,1 415 | DATA 0,0,1,0,0 416 | DATA 0,0,1,0,0 417 | DATA 0,0,1,0,0 418 | DATA 0,0,1,0,0 419 | DATA 0,0,1,0,0 420 | DATA 0,0,1,0,0 421 | 422 | DATA 1,0,0,0,1 423 | DATA 1,0,0,0,1 424 | DATA 1,0,0,0,1 425 | DATA 1,0,0,0,1 426 | DATA 1,0,0,0,1 427 | DATA 1,0,0,0,1 428 | DATA 0,1,1,1,0 429 | 430 | DATA 1,0,0,0,1 431 | DATA 1,0,0,0,1 432 | DATA 1,0,0,0,1 433 | DATA 1,0,0,0,1 434 | DATA 1,0,0,0,1 435 | DATA 0,1,0,1,0 436 | DATA 0,0,1,0,0 437 | 438 | DATA 1,0,0,0,1 439 | DATA 1,0,0,0,1 440 | DATA 1,0,0,0,1 441 | DATA 1,0,0,0,1 442 | DATA 1,0,1,0,1 443 | DATA 1,1,0,1,1 444 | DATA 1,0,0,0,1 445 | 446 | DATA 1,0,0,0,1 447 | DATA 1,0,0,0,1 448 | DATA 0,1,0,1,0 449 | DATA 0,0,1,0,0 450 | DATA 0,1,0,1,0 451 | DATA 1,0,0,0,1 452 | DATA 1,0,0,0,1 453 | 454 | DATA 1,0,0,0,1 455 | DATA 1,0,0,0,1 456 | DATA 1,0,0,0,1 457 | DATA 0,1,0,1,0 458 | DATA 0,0,1,0,0 459 | DATA 0,0,1,0,0 460 | DATA 0,0,1,0,0 461 | 462 | DATA 1,1,1,1,1 463 | DATA 0,0,0,0,1 464 | DATA 0,0,0,1,0 465 | DATA 0,0,1,0,0 466 | DATA 0,1,0,0,0 467 | DATA 1,0,0,0,0 468 | DATA 1,1,1,1,1 469 | 470 | DATA 0,1,1,1,0 471 | DATA 1,0,0,0,1 472 | DATA 1,1,0,0,1 473 | DATA 1,0,1,0,1 474 | DATA 1,0,0,1,1 475 | DATA 1,0,0,0,1 476 | DATA 0,1,1,1,0 477 | 478 | DATA 0,0,1,0,0 479 | DATA 0,1,1,0,0 480 | DATA 0,0,1,0,0 481 | DATA 0,0,1,0,0 482 | DATA 0,0,1,0,0 483 | DATA 0,0,1,0,0 484 | DATA 0,1,1,1,0 485 | 486 | DATA 0,1,1,1,0 487 | DATA 1,0,0,0,1 488 | DATA 0,0,0,0,1 489 | DATA 0,0,0,1,0 490 | DATA 0,0,1,0,0 491 | DATA 0,1,0,0,0 492 | DATA 1,1,1,1,1 493 | 494 | DATA 0,1,1,1,0 495 | DATA 1,0,0,0,1 496 | DATA 0,0,0,0,1 497 | DATA 0,0,1,1,0 498 | DATA 0,0,0,0,1 499 | DATA 1,0,0,0,1 500 | DATA 0,1,1,1,0 501 | 502 | DATA 0,0,0,0,1 503 | DATA 1,0,0,0,1 504 | DATA 1,0,0,0,1 505 | DATA 1,1,1,1,1 506 | DATA 0,0,0,0,1 507 | DATA 0,0,0,0,1 508 | DATA 0,0,0,0,1 509 | 510 | DATA 1,1,1,1,1 511 | DATA 1,0,0,0,0 512 | DATA 1,1,1,1,0 513 | DATA 0,0,0,0,1 514 | DATA 0,0,0,0,1 515 | DATA 1,0,0,0,1 516 | DATA 0,1,1,1,0 517 | 518 | DATA 0,1,1,1,0 519 | DATA 1,0,0,0,1 520 | DATA 1,0,0,0,0 521 | DATA 1,1,1,1,0 522 | DATA 1,0,0,0,1 523 | DATA 1,0,0,0,1 524 | DATA 0,1,1,1,0 525 | 526 | DATA 1,1,1,1,1 527 | DATA 0,0,0,0,1 528 | DATA 0,0,0,0,1 529 | DATA 0,0,0,1,0 530 | DATA 0,0,1,0,0 531 | DATA 0,0,1,0,0 532 | DATA 0,0,1,0,0 533 | 534 | DATA 0,1,1,1,0 535 | DATA 1,0,0,0,1 536 | DATA 1,0,0,0,1 537 | DATA 0,1,1,1,0 538 | DATA 1,0,0,0,1 539 | DATA 1,0,0,0,1 540 | DATA 0,1,1,1,0 541 | 542 | DATA 0,1,1,1,0 543 | DATA 1,0,0,0,1 544 | DATA 1,0,0,0,1 545 | DATA 0,1,1,1,1 546 | DATA 0,0,0,0,1 547 | DATA 1,0,0,0,1 548 | DATA 0,1,1,1,0 549 | 550 | DATA 1,0,0,0,0 551 | DATA 0,1,0,0,0 552 | DATA 0,0,1,0,0 553 | DATA 0,0,1,0,0 554 | DATA 0,0,1,0,0 555 | DATA 0,1,0,0,0 556 | DATA 1,0,0,0,0 557 | 558 | DATA 0,0,0,0,0 559 | DATA 0,0,0,0,0 560 | DATA 0,0,0,0,0 561 | DATA 0,0,0,0,0 562 | DATA 0,0,0,0,0 563 | DATA 0,0,0,0,0 564 | DATA 1,0,0,0,0 565 | 566 | DATA 0,0,0,0,0 567 | DATA 0,0,1,0,0 568 | DATA 0,0,1,0,0 569 | DATA 1,1,1,1,1 570 | DATA 0,0,1,0,0 571 | DATA 0,0,1,0,0 572 | DATA 0,0,0,0,0 573 | 574 | DATA 0,0,0,0,0 575 | DATA 0,0,0,0,0 576 | DATA 0,0,0,0,0 577 | DATA 1,1,1,1,1 578 | DATA 0,0,0,0,0 579 | DATA 0,0,0,0,0 580 | DATA 0,0,0,0,0 581 | 582 | SUB BlueColors 583 | r% = pal%(3) 584 | g% = pal%(4) 585 | b% = pal%(5) 586 | n% = 0 587 | DO 588 | Colors n%, r%, g%, b% 589 | n% = n% + 1 590 | LOOP WHILE n% < 16 591 | END SUB 592 | 593 | SUB CheckComplete 594 | DIM c%(FieldHeight%) 595 | x% = 1: y% = 1: f% = 0 596 | DO 597 | o% = Occupied%(x%, y%) 598 | IF x% = FieldWidth% AND o% > 0 THEN 599 | IF Debug% = 1 THEN LOCATE f% + 18, 1: PRINT "LINE"; y%; "COMPLETE" 600 | Lines% = Lines% + 1 601 | c%(f%) = y%: f% = f% + 1: x% = 0: y% = y% + 1 602 | END IF 603 | x% = x% + 1 604 | IF o% = 0 THEN x% = 1: y% = y% + 1 605 | LOOP WHILE y% <= FieldHeight% 606 | IF f% = 0 THEN EXIT SUB 607 | 608 | IF AirTime > 4 THEN AirTime = 4 609 | Score& = Score& + f% * 100 * (5 - AirTime) 610 | n% = 0 611 | DO 612 | GOSUB Shift 613 | n% = n% + 1 614 | LOOP WHILE n% < f% 615 | EXIT SUB 616 | Shift: 617 | y% = c%(n%) 618 | xn% = 1: yn% = y% 619 | DO WHILE yn% > 1 620 | Occupied%(xn%, yn%) = Occupied%(xn%, yn% - 1) 621 | xn% = xn% + 1 622 | IF xn% > FieldWidth% THEN xn% = 1: yn% = yn% - 1 623 | LOOP 624 | RefreshField 625 | RETURN 626 | 627 | END SUB 628 | 629 | SUB CheckFinalMove 630 | ink$ = INKEY$ 631 | IF ink$ = CHR$(0) + "K" THEN 632 | MoveLeft 633 | lastmove% = 1 634 | END IF 635 | IF ink$ = CHR$(0) + "M" THEN 636 | MoveRight 637 | lastmove% = 1 638 | END IF 639 | IF ink$ = CHR$(0) + "H" THEN 640 | RotatePiece 641 | lastmove% = 1 642 | END IF 643 | EXIT SUB 644 | END SUB 645 | 646 | SUB CheckOverlap 647 | DIM xn%(3) 648 | DIM yn%(3) 649 | s% = 0 650 | xn% = PieceX%: yn% = PieceY% 651 | Xs% = PieceData%(0, PieceR%, CurrentPiece% - 1) 652 | Ys% = PieceData%(1, PieceR%, CurrentPiece% - 1) 653 | maxn% = Xs% * Ys% 654 | n% = 0 655 | DO 656 | c% = PieceData%(n% + 2, PieceR%, CurrentPiece% - 1) 657 | IF c% = 0 THEN 658 | ELSE 659 | xn%(s%) = xn%: yn%(s%) = yn% 660 | s% = s% + 1 661 | END IF 662 | xn% = xn% + 1 663 | IF xn% - PieceX% >= Xs% THEN xn% = PieceX%: yn% = yn% + 1 664 | n% = n% + 1 665 | LOOP WHILE n% < maxn% 666 | 667 | 'Make Sure Piece Is In Bounds. 668 | 'If not, return -1. 669 | n% = 0 670 | Overlap% = 0 671 | DO 672 | IF xn%(n%) > FieldWidth% THEN Overlap% = -1: EXIT SUB 673 | IF yn%(n%) > FieldHeight% THEN Overlap% = -1: EXIT SUB 674 | IF xn%(n%) < 1 THEN Overlap% = -1: EXIT SUB 675 | IF yn%(n%) < 1 THEN Overlap% = -1: EXIT SUB 676 | n% = n% + 1 677 | LOOP WHILE n% < 4 678 | 679 | 'Check If This Location Would Overlap Another Piece. 680 | n% = 0 681 | Overlap% = 0 682 | DO 683 | IF Occupied%(xn%(n%), yn%(n%)) = 0 THEN 684 | ELSE 685 | Overlap% = Overlap% + 1 686 | END IF 687 | n% = n% + 1 688 | LOOP WHILE n% < 4 689 | END SUB 690 | 691 | SUB CheckTouch 692 | 'This sub checks if the piece has landed on anything. 693 | 'First, Check if piece has hit the bottom of the field. 694 | XSize% = PieceData%(0, PieceR%, CurrentPiece% - 1) 695 | YSize% = PieceData%(1, PieceR%, CurrentPiece% - 1) 696 | MaxY% = PieceY% + YSize% 697 | IF MaxY% = FieldHeight% + 1 THEN GOTO StopPiece 698 | 699 | 'See if it has hit another piece. 700 | 'Find Base Points 701 | DIM BaseX%(3), BaseY%(3) '4 is highest poss. number of base points. 702 | BaseX%(0) = PieceX% 703 | IF XSize% > 1 THEN BaseX%(1) = PieceX% + 1 704 | IF XSize% > 2 THEN BaseX%(2) = PieceX% + 2 705 | IF XSize% > 3 THEN BaseX%(3) = PieceX% + 3 706 | 707 | xn% = PieceX%: yn% = PieceY% 708 | maxn% = XSize% * YSize% 709 | n% = 0 710 | DO 711 | c% = PieceData%(n% + 2, PieceR%, CurrentPiece% - 1) 712 | IF c% = 0 THEN 713 | ELSE 714 | e% = xn% - PieceX% 715 | BaseY%(e%) = yn% 716 | END IF 717 | xn% = xn% + 1 718 | IF xn% - PieceX% >= XSize% THEN xn% = PieceX%: yn% = yn% + 1 719 | n% = n% + 1 720 | LOOP WHILE n% < maxn% 721 | 722 | n% = 0 723 | DO 724 | IF BaseX%(n%) = 0 THEN 725 | ELSE 726 | IF BaseY%(n%) > 0 THEN 727 | IF Occupied%(BaseX%(n%), BaseY%(n%) + 1) > 0 THEN 728 | IF BaseY%(n%) < 2 THEN GameOver% = 1: EXIT SUB 729 | GOTO StopPiece 730 | END IF 731 | END IF 732 | END IF 733 | n% = n% + 1 734 | LOOP WHILE n% < 4 735 | 736 | EXIT SUB 737 | StopPiece: 738 | IF CPlay% = 0 THEN 739 | lmtime = TIMER 740 | DO 741 | lastmove% = 0 742 | CheckFinalMove 743 | LOOP WHILE TIMER - lmtime < .5 AND lastmove% = 0 744 | END IF 745 | AirTime = TIMER - PieceTime 746 | IF AirTime > 7 THEN AirTime = 7 747 | Score& = Score& + (8 - AirTime) * 5 748 | StoreOccupy 749 | RefreshField 750 | CheckComplete 751 | NewPiece 752 | END SUB 753 | 754 | SUB Colors (c%, r%, g%, b%) 755 | OUT &H3C8, c% 756 | OUT &H3C9, r% 757 | OUT &H3C9, g% 758 | OUT &H3C9, b% 759 | END SUB 760 | 761 | SUB CompComplete 762 | x% = 1: y% = 1: f% = 0 763 | DO 764 | o% = Occupied%(x%, y%) 765 | IF x% = FieldWidth% AND o% > 0 THEN 766 | f% = f% + 1: x% = 0: y% = y% + 1 767 | END IF 768 | x% = x% + 1 769 | IF o% = 0 THEN x% = 1: y% = y% + 1 770 | LOOP WHILE y% <= FieldHeight% 771 | NumComplete% = f% 772 | END SUB 773 | 774 | SUB CompeteScreen 775 | BlueColors 776 | LINE (0, 0)-(640, 480), 1, BF 777 | gap% = 4: shadow% = 2 778 | DrawText 85, 25, "Competition Mode", 7, 4, 2 779 | size% = 6 780 | x% = 40: y% = 80 781 | sx% = x%: c% = 7 782 | DO 783 | LINE (x% + 1 + shadow%, y% + 1 + shadow%)-(x% + size% + 1 + shadow%, y% + size% + 1 + shadow%), 0, BF 784 | LINE (x% + 1, y% + 1)-(x% + size% - 1, y% + size% - 1), c%, BF 785 | LINE (x%, y%)-(x% + size%, y%), 15 786 | LINE (x%, y%)-(x%, y% + size%), 15 787 | LINE (x% + size%, y%)-(x% + size%, y% + size%), 8 788 | LINE (x%, y% + size%)-(x% + size%, y% + size%), 8 789 | x% = x% + size% + 1 790 | LOOP WHILE x% < 600 791 | gap% = 2: shadow% = 1 792 | DrawText 15, 460, "Future Software", 7, 1, 2 793 | DrawText 395, 460, "By Michael Fogleman", 7, 1, 2 794 | gap% = 4: shadow% = 1 795 | DrawText 80, 400, "PRESS ANY KEY TO CONTINUE", 7, 2, 2 796 | gap% = 4: shadow% = 2 797 | DrawText 80, 110, "YOU", 7, 4, 2 798 | DrawText 510, 110, "ME", 7, 4, 2 799 | DrawText 245, 150, "SCORE", 7, 4, 2 800 | DrawText 245, 270, "LINES", 7, 4, 2 801 | 802 | DrawText 5, 200, STR$(YourScore&), 7, 4, 2 803 | DrawText 5, 320, STR$(YourLines%), 7, 4, 2 804 | 805 | sc$ = STR$(Score&) 806 | DO WHILE LEN(sc$) < 11 807 | sc$ = " " + sc$ 808 | LOOP 809 | DrawText 280, 200, sc$, 7, 4, 2 810 | 811 | sc$ = STR$(Lines%) 812 | DO WHILE LEN(sc$) < 11 813 | sc$ = " " + sc$ 814 | LOOP 815 | DrawText 280, 320, sc$, 7, 4, 2 816 | RestoreColors 817 | 818 | DO 819 | ink$ = INKEY$ 820 | LOOP WHILE ink$ = "" 821 | 822 | END SUB 823 | 824 | SUB ComputerPlay (Display%) 825 | 'This is the brain! Computer plays tetris. 826 | 'First, find all possible placement positions. 827 | stime = TIMER 828 | XSize% = PieceData%(0, PieceR%, CurrentPiece% - 1) 829 | YSize% = PieceData%(1, PieceR%, CurrentPiece% - 1) 830 | PrevX% = PieceX% 831 | PrevY% = PieceY% 832 | PrevR% = PieceR% 833 | DIM picks%(100) 834 | DIM BaseX%(3), BaseY%(3) 835 | DIM PossibleX%(100) 836 | DIM PossibleY%(100) 837 | DIM PossibleR%(100) 838 | DIM Evaluation%(100) 839 | GOSUB NegEval 840 | 'X and R are the controlled variables, find Y for each combination. 841 | n% = 0 842 | xn% = 1 843 | DO 844 | r% = 0 845 | DO 846 | GOSUB GetY 847 | PossibleX%(n%) = xn% 848 | PossibleY%(n%) = PieceY% 849 | PossibleR%(n%) = r% 850 | n% = n% + 1 851 | r% = r% + 1 852 | LOOP WHILE r% < 4 853 | xn% = xn% + 1 854 | LOOP WHILE xn% < FieldWidth% + 2 855 | 856 | 'Now, evaluate each position. This is the tough part. 857 | 'Copy the occupied array, so we can see if any moves complete a line. 858 | DIM TempOccupied%(FieldWidth%, FieldHeight%) 859 | n1% = 0: n2% = 0 860 | DO 861 | TempOccupied%(n1%, n2%) = Occupied%(n1%, n2%) 862 | n1% = n1% + 1 863 | IF n1% > FieldWidth% THEN n1% = 0: n2% = n2% + 1 864 | LOOP WHILE n2% <= FieldHeight% 865 | 866 | 'Put each possible position/rotation in. Check for complete line. 867 | n% = 0 868 | DO 869 | PieceX% = PossibleX%(n%) 870 | PieceY% = PossibleY%(n%) 871 | PieceR% = PossibleR%(n%) 872 | IF PieceY% > 0 THEN 873 | 'LOCATE 1, 40: PRINT PieceX%; PieceY%; PieceR%; n% 874 | Evaluation%(n%) = PieceY% * HeightWeight 875 | StoreOccupy 876 | CompComplete 877 | Evaluation%(n%) = Evaluation%(n%) + NumComplete% * LineWeight 878 | GOSUB RestoreArray 879 | END IF 880 | n% = n% + 1 881 | LOOP WHILE n% < 101 882 | 883 | 'Check if next to any pieces. 884 | n% = 0 885 | DO 886 | PieceX% = PossibleX%(n%) 887 | PieceY% = PossibleY%(n%) 888 | PieceR% = PossibleR%(n%) 889 | XSize% = PieceData%(0, PieceR%, CurrentPiece% - 1) 890 | YSize% = PieceData%(1, PieceR%, CurrentPiece% - 1) 891 | DO 892 | IF PieceX% - 1 > 0 AND PieceX% - 1 <= FieldWidth% AND PieceY% > 0 AND PieceY% <= FieldHeight% THEN 893 | 'DrawBlock PieceX% - 1, PieceY%, -1 894 | IF Occupied%(PieceX% - 1, PieceY%) > 0 THEN 895 | Evaluation%(n%) = Evaluation%(n%) + SideWeight 896 | END IF 897 | END IF 898 | IF PieceX% + XSize% > 0 AND PieceX% + XSize% <= FieldWidth% AND PieceY% > 0 AND PieceY% <= FieldHeight% THEN 899 | 'DrawBlock PieceX% - 1, PieceY%, -1 900 | IF Occupied%(PieceX% + XSize%, PieceY%) > 0 THEN 901 | Evaluation%(n%) = Evaluation%(n%) + SideWeight 902 | END IF 903 | END IF 904 | PieceY% = PieceY% + 1 905 | LOOP WHILE PieceY% - PossibleY%(n%) < YSize% 906 | n% = n% + 1 907 | LOOP WHILE n% < 101 908 | 909 | 910 | 'Check For Gaps Under Piece. 911 | 'This is similar to CheckTouch Sub. 912 | n% = 0 913 | DO 914 | PieceX% = PossibleX%(n%) 915 | PieceY% = PossibleY%(n%) 916 | PieceR% = PossibleR%(n%) 917 | IF PieceY% > 0 THEN 918 | XSize% = PieceData%(0, PieceR%, CurrentPiece% - 1) 919 | YSize% = PieceData%(1, PieceR%, CurrentPiece% - 1) 920 | BaseX%(0) = 0: BaseX%(1) = 0: BaseX%(2) = 0: BaseX%(3) = 0 921 | BaseY%(0) = 0: BaseY%(1) = 0: BaseY%(2) = 0: BaseY%(3) = 0 922 | BaseX%(0) = PieceX% 923 | IF XSize% > 1 THEN BaseX%(1) = PieceX% + 1 924 | IF XSize% > 2 THEN BaseX%(2) = PieceX% + 2 925 | IF XSize% > 3 THEN BaseX%(3) = PieceX% + 3 926 | xn% = PieceX%: yn% = PieceY% 927 | maxn% = XSize% * YSize% 928 | bn% = 0 929 | DO 930 | c% = PieceData%(bn% + 2, PieceR%, CurrentPiece% - 1) 931 | IF c% = 0 THEN 932 | ELSE 933 | e% = xn% - PieceX% 934 | BaseY%(e%) = yn% 935 | END IF 936 | xn% = xn% + 1 937 | IF xn% - PieceX% >= XSize% THEN xn% = PieceX%: yn% = yn% + 1 938 | bn% = bn% + 1 939 | LOOP WHILE bn% < maxn% 940 | 941 | gaps% = 0 942 | bn% = 0 943 | DO 944 | IF BaseX%(bn%) = 0 THEN 945 | ELSE 946 | IF BaseY%(bn%) > 0 AND BaseY%(bn%) < FieldHeight% THEN 947 | IF Occupied%(BaseX%(bn%), BaseY%(bn%) + 1) = 0 THEN 948 | gaps% = gaps% + 1 949 | END IF 950 | END IF 951 | END IF 952 | bn% = bn% + 1 953 | LOOP WHILE bn% < 4 954 | Evaluation%(n%) = Evaluation%(n%) - gaps% * GapWeight 955 | END IF 956 | n% = n% + 1 957 | LOOP WHILE n% < 101 958 | 959 | 'Find Max/Min Evaluation. 960 | n% = 0 961 | maxeval% = -1000 962 | mineval% = 1000 963 | DO 964 | IF Evaluation%(n%) < mineval% THEN mineval% = Evaluation%(n%) 965 | IF Evaluation%(n%) > maxeval% THEN 966 | maxeval% = Evaluation%(n%) 967 | END IF 968 | n% = n% + 1 969 | LOOP WHILE n% < 101 970 | 971 | DO 972 | n% = RND * 100 973 | LOOP WHILE Evaluation%(n%) < maxeval% OR PossibleX%(n%) = 0 OR PossibleY%(n%) = 0 974 | PieceX% = PossibleX%(n%) 975 | PieceY% = PossibleY%(n%) 976 | PieceR% = PossibleR%(n%) 977 | IF Display% = 1 THEN 978 | DrawPiece PieceX%, PieceY%, CurrentPiece%, PieceR%, -1 979 | END IF 980 | 'LOCATE 13, 73: PRINT USING "#####"; Evaluation%(n%) 981 | 982 | 'Rid of unnecessary rotation. 983 | IF CurrentPiece% = 1 OR CurrentPiece% = 2 OR CurrentPiece% = 4 THEN 984 | IF PieceR% = 3 THEN PieceR% = 1 985 | IF PieceR% = 2 THEN PieceR% = 0 986 | END IF 987 | IF CurrentPiece% = 3 THEN PieceR% = 0 988 | 989 | 'n% = 0 990 | 'DO 991 | PieceX% = PossibleX%(n%) 992 | PieceY% = PossibleY%(n%) 993 | PieceR% = PossibleR%(n%) 994 | XSize% = PieceData%(0, PieceR%, CurrentPiece% - 1) 995 | YSize% = PieceData%(1, PieceR%, CurrentPiece% - 1) 996 | DO 997 | IF PieceX% - 1 > 0 AND PieceX% - 1 <= FieldWidth% AND PieceY% > 0 AND PieceY% <= FieldHeight% THEN 998 | 'DrawBlock PieceX% - 1, PieceY%, -1 999 | IF Occupied%(PieceX% - 1, PieceY%) > 0 THEN 1000 | Evaluation%(n%) = Evaluation%(n%) + SideWeight 1001 | END IF 1002 | END IF 1003 | IF PieceX% + XSize% > 0 AND PieceX% + XSize% <= FieldWidth% AND PieceY% > 0 AND PieceY% <= FieldHeight% THEN 1004 | 'DrawBlock PieceX% + XSize%, PieceY%, -1 1005 | IF Occupied%(PieceX% + XSize%, PieceY%) > 0 THEN 1006 | Evaluation%(n%) = Evaluation%(n%) + SideWeight 1007 | END IF 1008 | END IF 1009 | PieceY% = PieceY% + 1 1010 | LOOP WHILE PieceY% - PossibleY%(n%) < YSize% 1011 | 'n% = n% + 1 1012 | 'LOOP WHILE n% < 101 1013 | 1014 | 1015 | DestX% = PieceX% 1016 | DestY% = PieceY% 1017 | DestR% = PieceR% 1018 | 1019 | PieceX% = PrevX% 1020 | PieceY% = PrevY% 1021 | PieceR% = PrevR% 1022 | EXIT SUB 1023 | 1024 | GetY: 1025 | yn% = 1 1026 | PieceX% = xn% 1027 | PieceY% = yn% 1028 | PieceR% = r% 1029 | CheckOverlap 1030 | IF Overlap% = 0 THEN 1031 | ELSE 1032 | PieceY% = 0 1033 | RETURN 1034 | END IF 1035 | DO 1036 | PieceY% = PieceY% + 1 1037 | CheckOverlap 1038 | LOOP WHILE Overlap% = 0 1039 | PieceY% = PieceY% - 1 1040 | RETURN 1041 | RestoreArray: 1042 | n1% = 0: n2% = 0 1043 | DO 1044 | Occupied%(n1%, n2%) = TempOccupied%(n1%, n2%) 1045 | n1% = n1% + 1 1046 | IF n1% > FieldWidth% THEN n1% = 0: n2% = n2% + 1 1047 | LOOP WHILE n2% <= FieldHeight% 1048 | RETURN 1049 | NegEval: 1050 | en% = 0 1051 | DO 1052 | Evaluation%(en%) = -100 1053 | en% = en% + 1 1054 | LOOP WHILE en% < 101 1055 | RETURN 1056 | END SUB 1057 | 1058 | SUB DebugDisplay 1059 | LOCATE 1, 1 1060 | PRINT "Debugging" 1061 | PRINT " Information" 1062 | PRINT 1063 | PRINT "X :"; PieceX% 1064 | PRINT "Y :"; PieceY% 1065 | PRINT "Piece :"; CurrentPiece% 1066 | PRINT "Rotation:"; PieceR% 1067 | PRINT 1068 | PRINT "Field Width :"; FieldWidth% 1069 | PRINT "Field Height:"; FieldHeight% 1070 | PRINT 1071 | PRINT "Field Coordinates:" 1072 | PRINT " X1:"; 320 - XOffset% 1073 | PRINT " Y1:"; 240 - YOffset% 1074 | PRINT " X2:"; 320 + XOffset% 1075 | PRINT " Y2:"; 240 + YOffset% 1076 | END SUB 1077 | 1078 | SUB Delay (dtime!) 1079 | stime = TIMER 1080 | DO 1081 | LOOP WHILE TIMER - stime < dtime! 1082 | END SUB 1083 | 1084 | SUB DrawBlock (xn%, yn%, c%) 1085 | IF xn% < 1 OR yn% < 1 THEN EXIT SUB 1086 | IF CurrentColor%(xn%, yn%) = c% THEN EXIT SUB 1087 | CurrentColor%(xn%, yn%) = c% 1088 | IF xn% > FieldWidth% OR yn% > FieldHeight% THEN EXIT SUB 1089 | x% = 320 - XOffset% + 1 + (xn% - 1) * (BlockSize% + 2) - XShift% 1090 | y% = 240 - YOffset% + 1 + (yn% - 1) * (BlockSize% + 2) 1091 | 'IF c% > -1 THEN LINE (x%, y%)-(x% + BlockSize%, y% + BlockSize%), c%, BF 1092 | IF c% = 0 THEN LINE (x%, y%)-(x% + BlockSize%, y% + BlockSize%), c%, BF 1093 | IF c% > 0 THEN 1094 | LINE (x% + 1, y% + 1)-(x% + BlockSize% - 1, y% + BlockSize% - 1), c%, BF 1095 | LINE (x%, y%)-(x% + BlockSize%, y%), 15 1096 | LINE (x%, y%)-(x%, y% + BlockSize%), 15 1097 | LINE (x% + BlockSize%, y%)-(x% + BlockSize%, y% + BlockSize%), 8 1098 | LINE (x%, y% + BlockSize%)-(x% + BlockSize%, y% + BlockSize%), 8 1099 | END IF 1100 | IF c% = -1 THEN LINE (x%, y%)-(x% + BlockSize%, y% + BlockSize%), 15, B 1101 | END SUB 1102 | 1103 | SUB DrawBlock2 (x%, y%, c%) 1104 | IF c% = 0 THEN LINE (x%, y%)-(x% + 16, y% + 16), c%, BF 1105 | IF c% > 0 THEN 1106 | LINE (x% + 1, y% + 1)-(x% + 16 - 1, y% + 16 - 1), c%, BF 1107 | LINE (x%, y%)-(x% + 16, y%), 15 1108 | LINE (x%, y%)-(x%, y% + 16), 15 1109 | LINE (x% + 16, y%)-(x% + 16, y% + 16), 8 1110 | LINE (x%, y% + 16)-(x% + 16, y% + 16), 8 1111 | END IF 1112 | IF c% = -1 THEN LINE (x%, y%)-(x% + 16, y% + 16), 15, B 1113 | END SUB 1114 | 1115 | SUB DrawField 1116 | BlueColors 1117 | size% = 67 1118 | x% = -1 * size% / 2: y% = -1 * size% / 2 1119 | sx% = x% 1120 | c% = RND * 4 1121 | IF c% = 4 THEN c% = 7 1122 | DO 1123 | LINE (x% + 1, y% + 1)-(x% + size% - 1, y% + size% - 1), c%, BF 1124 | LINE (x%, y%)-(x% + size%, y%), 15 1125 | LINE (x%, y%)-(x%, y% + size%), 15 1126 | LINE (x% + size%, y%)-(x% + size%, y% + size%), 8 1127 | LINE (x%, y% + size%)-(x% + size%, y% + size%), 8 1128 | x% = x% + size% + 2 1129 | IF x% > 640 THEN x% = sx%: y% = y% + size% + 2 1130 | LOOP WHILE y% < 480 1131 | 1132 | LINE (320 - XOffset% - XShift% - 4, 240 - YOffset% - 4)-(320 + XOffset% - XShift% + 4, 240 + YOffset% + 4), 0, BF 1133 | LINE (320 - XOffset% - XShift% - 4, 240 - YOffset% - 4)-(320 + XOffset% - XShift% + 4, 240 + YOffset% + 4), 15, B 1134 | LINE (320 - XOffset% - XShift% - 2, 240 - YOffset% - 2)-(320 + XOffset% - XShift% + 2, 240 + YOffset% + 2), 7, B 1135 | LINE (DispX% - 4, DispY% - 4)-(DispX% + DispWidth% + 4, DispY% + DispHeight% + 4), 0, BF 1136 | LINE (DispX% - 2, DispY% - 2)-(DispX% + DispWidth% + 2, DispY% + DispHeight% + 2), 7, B 1137 | LINE (DispX% - 4, DispY% - 4)-(DispX% + DispWidth% + 4, DispY% + DispHeight% + 4), 15, B 1138 | 'LOCATE 3, 61: PRINT "Score:" 1139 | 'LOCATE 4, 69: PRINT USING "#########"; 0 1140 | 'LOCATE 6, 61: PRINT "Lines Cleared:" 1141 | 'LOCATE 7, 73: PRINT USING "#####"; 0 1142 | 'LOCATE 9, 61: PRINT "Game Time:" 1143 | 'LOCATE 10, 73: PRINT USING "#####"; 0 1144 | 'LOCATE 12, 61: PRINT "Evaluation:" 1145 | 1146 | gap% = 2: shadow% = 1 1147 | DrawText DispX% + 7, 25, "SCORE", 7, 1, 2 1148 | DrawText DispX% + 7, 95, "LINES", 7, 1, 2 1149 | DrawText DispX% + 7, 165, "TIME", 7, 1, 2 1150 | DrawText DispX% + 7, 355, "NEXT PIECE", 7, 1, 2 1151 | DrawText DispX% + 7, 237, "PIECES", 7, 1, 2 1152 | 1153 | IF Grid% = 1 THEN 1154 | x1% = 320 - XOffset%: y1% = 240 - YOffset% 1155 | x2% = 320 + XOffset%: y2% = 240 + YOffset% 1156 | DO 1157 | LINE (x1%, y1%)-(x1%, y2%), 8 1158 | x1% = x1% + BlockSize% + 2 1159 | LOOP WHILE x1% < x2% 1160 | 1161 | x1% = 320 - XOffset%: y1% = 240 - YOffset% 1162 | x2% = 320 + XOffset%: y2% = 240 + YOffset% 1163 | DO 1164 | LINE (x1%, y1%)-(x2%, y1%), 8 1165 | y1% = y1% + BlockSize% + 2 1166 | LOOP WHILE y1% < y2% 1167 | END IF 1168 | RestoreColors 1169 | END SUB 1170 | 1171 | SUB DrawLetter (x%, y%, letter%, c%, size%, typ%) 1172 | sx% = x%: sy% = y% 1173 | xn% = 0: yn% = 0 1174 | n% = 0 1175 | DO 1176 | d% = Text%(letter%, n%) 1177 | IF d% = 1 THEN 1178 | IF typ% = 0 THEN 1179 | LINE (x% + 1, y% + 1)-(x% + size% - 1, y% + size% - 1), c%, BF 1180 | LINE (x%, y%)-(x% + size%, y%), 15 1181 | LINE (x%, y%)-(x%, y% + size%), 15 1182 | LINE (x% + size%, y%)-(x% + size%, y% + size%), 8 1183 | LINE (x%, y% + size%)-(x% + size%, y% + size%), 8 1184 | END IF 1185 | IF typ% = 1 THEN 1186 | LINE (x%, y%)-(x% + size%, y% + size%), c%, BF 1187 | END IF 1188 | IF typ% = 2 THEN 1189 | LINE (x% + 1 + shadow%, y% + 1 + shadow%)-(x% + size% + 1 + shadow%, y% + size% + 1 + shadow%), 0, BF 1190 | LINE (x% + 1, y% + 1)-(x% + size% - 1, y% + size% - 1), c%, BF 1191 | LINE (x%, y%)-(x% + size%, y%), 15 1192 | LINE (x%, y%)-(x%, y% + size%), 15 1193 | LINE (x% + size%, y%)-(x% + size%, y% + size%), 8 1194 | LINE (x%, y% + size%)-(x% + size%, y% + size%), 8 1195 | END IF 1196 | END IF 1197 | n% = n% + 1 1198 | xn% = xn% + 1 1199 | x% = x% + size% + 1 1200 | IF xn% > 4 THEN xn% = 0: x% = sx%: y% = y% + size% + 1 1201 | LOOP WHILE n% < 35 1202 | END SUB 1203 | 1204 | SUB DrawPiece (xn%, yn%, piece%, r%, col%) 1205 | x% = xn%: y% = yn% 1206 | Xs% = PieceData%(0, r%, piece% - 1) 1207 | Ys% = PieceData%(1, r%, piece% - 1) 1208 | n% = 0 1209 | DO 1210 | c% = PieceData%(n% + 2, r%, piece% - 1) 1211 | dc% = 0 1212 | IF c% = 0 THEN ELSE dc% = 1 1213 | IF dc% = 1 THEN DrawBlock xn%, yn%, col% 1214 | xn% = xn% + 1 1215 | IF xn% - x% >= Xs% THEN xn% = x%: yn% = yn% + 1 1216 | n% = n% + 1 1217 | LOOP WHILE yn% < y% + Ys% 1218 | END SUB 1219 | 1220 | SUB DrawPiece2 (px%, py%, piece%, col%) 1221 | x% = px%: y% = py% 1222 | xn% = 0: yn% = 0 1223 | Xs% = PieceData%(0, 1, piece% - 1) 1224 | Ys% = PieceData%(1, 1, piece% - 1) 1225 | n% = 0 1226 | DO 1227 | c% = PieceData%(n% + 2, 1, piece% - 1) 1228 | dc% = 0 1229 | IF c% = 0 THEN ELSE dc% = 1 1230 | IF dc% = 1 THEN DrawBlock2 x%, y%, col% 1231 | x% = x% + 18'BlockSize% + 2 1232 | xn% = xn% + 1 1233 | IF xn% >= Xs% THEN xn% = 0: x% = px%: y% = y% + 18: yn% = yn% + 1 1234 | n% = n% + 1 1235 | LOOP WHILE yn% < Ys% 1236 | END SUB 1237 | 1238 | SUB DrawText (x%, y%, txt$, c%, size%, typ%) 1239 | txt$ = UCASE$(txt$) 1240 | sx% = x%: sy% = y% 1241 | n% = 1 1242 | DO 1243 | t$ = MID$(txt$, n%, 1) 1244 | t% = ASC(t$) 1245 | IF t% = 32 THEN GOTO Skip 1246 | IF t% = 41 THEN t% = 36 1247 | IF t% = 46 THEN t% = 37 1248 | IF t% = 43 THEN t% = 38 1249 | IF t% = 45 THEN t% = 39 1250 | IF t% > 64 AND t% < 91 THEN 1251 | t% = t% - 65 1252 | END IF 1253 | IF t% > 47 AND t% < 58 THEN 1254 | t% = t% - 22 1255 | END IF 1256 | DrawLetter x%, y%, t%, c%, size%, typ% 1257 | Skip: 1258 | y% = sy% 1259 | x% = x% + (size% + 1) * 5 + gap% 1260 | n% = n% + 1 1261 | LOOP WHILE n% < LEN(txt$) + 1 1262 | END SUB 1263 | 1264 | SUB GameOverScreen 1265 | BlueColors 1266 | LINE (0, 0)-(640, 480), 1, BF 1267 | gap% = 6: shadow% = 3 1268 | DrawText 135, 20, "Game Over", 7, 6, 2 1269 | size% = 6 1270 | x% = 40: y% = 80 1271 | sx% = x%: c% = 7 1272 | DO 1273 | LINE (x% + 1 + shadow%, y% + 1 + shadow%)-(x% + size% + 1 + shadow%, y% + size% + 1 + shadow%), 0, BF 1274 | LINE (x% + 1, y% + 1)-(x% + size% - 1, y% + size% - 1), c%, BF 1275 | LINE (x%, y%)-(x% + size%, y%), 15 1276 | LINE (x%, y%)-(x%, y% + size%), 15 1277 | LINE (x% + size%, y%)-(x% + size%, y% + size%), 8 1278 | LINE (x%, y% + size%)-(x% + size%, y% + size%), 8 1279 | x% = x% + size% + 1 1280 | LOOP WHILE x% < 600 1281 | gap% = 2: shadow% = 1 1282 | DrawText 15, 460, "Future Software", 7, 1, 2 1283 | DrawText 395, 460, "By Michael Fogleman", 7, 1, 2 1284 | gap% = 4: shadow% = 1 1285 | DrawText 80, 400, "PRESS ANY KEY TO CONTINUE", 7, 2, 2 1286 | 1287 | gap% = 4: shadow% = 2 1288 | DrawText 65, 120, "Score", 7, 4, 2 1289 | DrawText 65, 180, "Lines", 7, 4, 2 1290 | DrawText 65, 240, "Time", 7, 4, 2 1291 | DrawText 65, 300, "Pieces", 7, 4, 2 1292 | 1293 | sc$ = STR$(Score&) 1294 | DO WHILE LEN(sc$) < 11 1295 | sc$ = " " + sc$ 1296 | LOOP 1297 | DrawText 265, 120, sc$, 7, 4, 2 1298 | 1299 | sc$ = STR$(Lines%) 1300 | DO WHILE LEN(sc$) < 11 1301 | sc$ = " " + sc$ 1302 | LOOP 1303 | DrawText 265, 180, sc$, 7, 4, 2 1304 | 1305 | sc$ = STR$(GameTime&) 1306 | DO WHILE LEN(sc$) < 11 1307 | sc$ = " " + sc$ 1308 | LOOP 1309 | DrawText 265, 240, sc$, 7, 4, 2 1310 | 1311 | sc$ = STR$(Pieces&) 1312 | DO WHILE LEN(sc$) < 11 1313 | sc$ = " " + sc$ 1314 | LOOP 1315 | DrawText 265, 300, sc$, 7, 4, 2 1316 | RestoreColors 1317 | 1318 | DO 1319 | ink$ = INKEY$ 1320 | LOOP WHILE ink$ = "" 1321 | 1322 | END SUB 1323 | 1324 | SUB GetPal 1325 | n% = 0: c% = 0 1326 | DO 1327 | OUT &H3C6, &HFF 1328 | OUT &H3C7, c% 1329 | rr% = INP(&H3C9) 1330 | gg% = INP(&H3C9) 1331 | bb% = INP(&H3C9) 1332 | pal%(n%) = rr% 1333 | pal%(n% + 1) = gg% 1334 | pal%(n% + 2) = bb% 1335 | n% = n% + 3: c% = c% + 1 1336 | LOOP WHILE c% < 16 1337 | END SUB 1338 | 1339 | SUB InfoDisplay 1340 | 'LOCATE 4, 69: PRINT USING "#########"; Score& 1341 | 'LOCATE 7, 73: PRINT USING "#####"; Lines% 1342 | 'LOCATE 10, 73: PRINT USING "#####"; GameTime& 1343 | gap% = 2: shadow% = 1 1344 | 1345 | IF Score& = Score2& THEN 1346 | ELSE 1347 | LINE (DispX% + 5, 44)-(DispX% + DispWidth% - 2, 62), 0, BF 1348 | sc$ = STR$(Score&) 1349 | DO WHILE LEN(sc$) < 11 1350 | sc$ = " " + sc$ 1351 | LOOP 1352 | DrawText DispX% + 9, 45, sc$, 7, 1, 2 1353 | Score2& = Score& 1354 | END IF 1355 | 1356 | IF Lines% = Lines2% THEN 1357 | ELSE 1358 | LINE (DispX% + 5, 114)-(DispX% + DispWidth% - 2, 132), 0, BF 1359 | sc$ = STR$(Lines%) 1360 | DO WHILE LEN(sc$) < 11 1361 | sc$ = " " + sc$ 1362 | LOOP 1363 | DrawText DispX% + 9, 115, sc$, 7, 1, 2 1364 | Lines2% = Lines% 1365 | END IF 1366 | 1367 | IF GameTime& = GameTime2& THEN 1368 | ELSE 1369 | LINE (DispX% + 5, 184)-(DispX% + DispWidth% - 2, 202), 0, BF 1370 | sc$ = STR$(GameTime&) 1371 | DO WHILE LEN(sc$) < 11 1372 | sc$ = " " + sc$ 1373 | LOOP 1374 | DrawText DispX% + 9, 185, sc$, 7, 1, 2 1375 | GameTime2& = GameTime& 1376 | END IF 1377 | 1378 | IF Pieces& = Pieces2& THEN 1379 | ELSE 1380 | LINE (DispX% + 5, 254)-(DispX% + DispWidth% - 2, 272), 0, BF 1381 | sc$ = STR$(Pieces&) 1382 | DO WHILE LEN(sc$) < 11 1383 | sc$ = " " + sc$ 1384 | LOOP 1385 | DrawText DispX% + 9, 255, sc$, 7, 1, 2 1386 | Pieces2& = Pieces& 1387 | END IF 1388 | 1389 | END SUB 1390 | 1391 | SUB MainLoop 1392 | OldPiece% = 1 1393 | DO 1394 | 1395 | IF CPlay% = 0 THEN pausetime = .225 ELSE pausetime = 0 1396 | stime = TIMER 1397 | DO 1398 | 1399 | x% = OldX%: y% = OldY%: p% = OldPiece%: r% = OldR% 1400 | 'Delay .01 1401 | 1402 | GameTime& = TIMER - StartTime 1403 | InfoDisplay 1404 | 1405 | WAIT 986, 8 1406 | DrawPiece x%, y%, p%, r%, 0 1407 | x% = PieceX%: y% = PieceY%: p% = CurrentPiece%: r% = PieceR%: c% = PieceC% 1408 | DrawPiece x%, y%, p%, r%, c% 1409 | IF Debug% = 1 THEN DebugDisplay 1410 | CheckTouch 1411 | IF GameOver% = 1 THEN EXIT SUB 1412 | OldX% = PieceX%: OldY% = PieceY%: OldPiece% = CurrentPiece%: OldR% = PieceR% 1413 | 1414 | DO 1415 | ink$ = INKEY$ 1416 | IF ink$ = CHR$(27) THEN GameOver% = 1 1417 | cmove% = 0 1418 | IF CPlay% = 1 THEN 1419 | IF TIMER - ctime > -1 THEN 1420 | IF cmove% = 0 THEN 1421 | IF PieceR% = DestR% THEN 1422 | ELSE 1423 | 'RotatePiece 1424 | ink$ = CHR$(0) + "H" 1425 | cmove% = 1 1426 | ctime = TIMER 1427 | END IF 1428 | END IF 1429 | IF PieceX% < DestX% AND cmove% = 0 THEN 1430 | 'MoveRight 1431 | ink$ = CHR$(0) + "M" 1432 | cmove% = 1 1433 | ctime = TIMER 1434 | END IF 1435 | IF PieceX% > DestX% AND cmove% = 0 THEN 1436 | 'MoveLeft 1437 | ink$ = CHR$(0) + "K" 1438 | cmove% = 1 1439 | ctime = TIMER 1440 | END IF 1441 | END IF 1442 | END IF 1443 | LOOP WHILE TIMER - stime < pausetime AND ink$ = "" 1444 | 1445 | usery% = 0 1446 | IF ink$ = CHR$(0) + "P" THEN 1447 | PieceY% = PieceY% + 1 1448 | usery% = 1 1449 | END IF 1450 | IF ink$ = CHR$(0) + "K" THEN 1451 | MoveLeft 1452 | END IF 1453 | IF ink$ = CHR$(0) + "M" THEN 1454 | MoveRight 1455 | END IF 1456 | IF ink$ = CHR$(0) + "H" THEN 1457 | RotatePiece 1458 | END IF 1459 | FOR a = 1 TO 15 1460 | a$ = INKEY$ 1461 | NEXT 1462 | LOOP WHILE TIMER - stime < pausetime 1463 | IF Compete% = 1 THEN 1464 | IF CMN% > competen% THEN EXIT SUB 1465 | END IF 1466 | IF usery% = 0 THEN PieceY% = PieceY% + 1 1467 | LOOP 1468 | END SUB 1469 | 1470 | SUB Menu 1471 | Menu: 1472 | BlueColors 1473 | LINE (0, 0)-(640, 480), 1, BF 1474 | gap% = 6: shadow% = 3 1475 | DrawText 55, 20, "Future Blocks", 7, 6, 2 1476 | gap% = 4: shadow% = 2 1477 | DrawText 65, 110, "1.Normal Game Mode", 7, 3, 2 1478 | DrawText 65, 160, "2.Hint Mode", 7, 3, 2 1479 | DrawText 65, 210, "3.Computer Mode", 7, 3, 2 1480 | DrawText 65, 260, "4.Competition Mode", 7, 3, 2 1481 | DrawText 65, 310, "5.Options", 7, 3, 2 1482 | DrawText 65, 360, "6.Exit", 7, 3, 2 1483 | gap% = 2: shadow% = 1 1484 | DrawText 15, 460, "Future Software", 7, 1, 2 1485 | DrawText 395, 460, "By Michael Fogleman", 7, 1, 2 1486 | 1487 | size% = 6 1488 | x% = 40: y% = 80 1489 | sx% = x%: c% = 7 1490 | DO 1491 | LINE (x% + 1 + shadow%, y% + 1 + shadow%)-(x% + size% + 1 + shadow%, y% + size% + 1 + shadow%), 0, BF 1492 | LINE (x% + 1, y% + 1)-(x% + size% - 1, y% + size% - 1), c%, BF 1493 | LINE (x%, y%)-(x% + size%, y%), 15 1494 | LINE (x%, y%)-(x%, y% + size%), 15 1495 | LINE (x% + size%, y%)-(x% + size%, y% + size%), 8 1496 | LINE (x%, y% + size%)-(x% + size%, y% + size%), 8 1497 | x% = x% + size% + 1 1498 | LOOP WHILE x% < 600 1499 | RestoreColors 1500 | BadKey: 1501 | DO 1502 | ink$ = INKEY$ 1503 | LOOP WHILE ink$ = "" 1504 | IF ink$ = "1" THEN hint% = 0: CPlay% = 0: EXIT SUB 1505 | IF ink$ = "2" THEN hint% = 1: CPlay% = 0: EXIT SUB 1506 | IF ink$ = "3" THEN hint% = 0: CPlay% = 1: EXIT SUB 1507 | IF ink$ = "4" THEN GOTO Compete 1508 | IF ink$ = "5" THEN GOTO Options 1509 | IF ink$ = "6" THEN CLS : END 1510 | GOTO BadKey 1511 | 1512 | Compete: 1513 | BlueColors 1514 | LINE (0, 0)-(640, 480), 1, BF 1515 | Compete% = 1 1516 | GOSUB Header 1517 | gap% = 4: shadow% = 2 1518 | DrawText 85, 115, "Competition Mode", 7, 4, 2 1519 | DrawText 230, 180, "Play to", 7, 3, 2 1520 | DrawText 265, 220, STR$(competen%), 7, 3, 2 1521 | DrawText 240, 260, "Blocks", 7, 3, 2 1522 | GOSUB InfoHeader 1523 | RestoreColors 1524 | DO 1525 | ink$ = INKEY$ 1526 | IF ink$ = "+" THEN 1527 | competen% = competen% + 1 1528 | LINE (260, 218)-(400, 255), 1, BF 1529 | DrawText 265, 220, STR$(competen%), 7, 3, 2 1530 | END IF 1531 | IF ink$ = "-" THEN 1532 | competen% = competen% - 1 1533 | LINE (260, 218)-(400, 255), 1, BF 1534 | DrawText 265, 220, STR$(competen%), 7, 3, 2 1535 | END IF 1536 | LOOP WHILE NOT ink$ = CHR$(27) 1537 | EXIT SUB 1538 | 1539 | Options: 1540 | BlueColors 1541 | GOSUB Header 1542 | gap% = 4: shadow% = 2 1543 | DrawText 65, 100, "1.PreStack", 7, 3, 2 1544 | DrawText 465, 100, STR$(messyheight%), 7, 3, 2 1545 | DrawText 65, 140, "2.Field Width", 7, 3, 2 1546 | DrawText 465, 140, STR$(FieldWidth%), 7, 3, 2 1547 | DrawText 65, 180, "3.Field Height", 7, 3, 2 1548 | DrawText 465, 180, STR$(FieldHeight%), 7, 3, 2 1549 | DrawText 65, 220, "4.Block Size", 7, 3, 2 1550 | DrawText 465, 220, STR$(BlockSize%), 7, 3, 2 1551 | DrawText 65, 260, "5.Line Weight", 7, 3, 2 1552 | DrawText 465, 260, STR$(LineWeight), 7, 3, 2 1553 | DrawText 65, 300, "6.Gap Weight", 7, 3, 2 1554 | DrawText 465, 300, STR$(GapWeight), 7, 3, 2 1555 | DrawText 65, 340, "7.Stack Weight", 7, 3, 2 1556 | DrawText 465, 340, STR$(HeightWeight), 7, 3, 2 1557 | DrawText 65, 380, "8.Side Weight", 7, 3, 2 1558 | DrawText 465, 380, STR$(SideWeight), 7, 3, 2 1559 | DrawText 65, 420, "9.Menu", 7, 3, 2 1560 | gap% = 2: shadow% = 1 1561 | DrawText 15, 460, "Future Software", 7, 1, 2 1562 | DrawText 395, 460, "By Michael Fogleman", 7, 1, 2 1563 | RestoreColors 1564 | BadKey2: 1565 | DO 1566 | ink$ = INKEY$ 1567 | LOOP WHILE ink$ = "" 1568 | IF ink$ = "9" THEN GOTO Menu 1569 | IF ink$ = "1" THEN 1570 | BlueColors 1571 | GOSUB Header 1572 | GOSUB InfoHeader 1573 | gap% = 4: shadow% = 2 1574 | DrawText 65, 200, "PreStack", 7, 3, 2 1575 | DrawText 465, 200, STR$(messyheight%), 7, 3, 2 1576 | RestoreColors 1577 | DO 1578 | ink$ = INKEY$ 1579 | IF ink$ = "+" THEN 1580 | messyheight% = messyheight% + 1 1581 | LINE (460, 190)-(639, 230), 1, BF 1582 | DrawText 465, 200, STR$(messyheight%), 7, 3, 2 1583 | END IF 1584 | IF ink$ = "-" THEN 1585 | messyheight% = messyheight% - 1 1586 | LINE (460, 190)-(639, 230), 1, BF 1587 | DrawText 465, 200, STR$(messyheight%), 7, 3, 2 1588 | END IF 1589 | LOOP WHILE NOT ink$ = CHR$(27) 1590 | GOTO Options 1591 | END IF 1592 | 1593 | IF ink$ = "2" THEN 1594 | BlueColors 1595 | GOSUB Header 1596 | GOSUB InfoHeader 1597 | gap% = 4: shadow% = 2 1598 | DrawText 65, 200, "Field Width", 7, 3, 2 1599 | DrawText 465, 200, STR$(FieldWidth%), 7, 3, 2 1600 | RestoreColors 1601 | DO 1602 | ink$ = INKEY$ 1603 | IF ink$ = "+" THEN 1604 | FieldWidth% = FieldWidth% + 1 1605 | LINE (460, 190)-(639, 230), 1, BF 1606 | DrawText 465, 200, STR$(FieldWidth%), 7, 3, 2 1607 | END IF 1608 | IF ink$ = "-" THEN 1609 | FieldWidth% = FieldWidth% - 1 1610 | LINE (460, 190)-(639, 230), 1, BF 1611 | DrawText 465, 200, STR$(FieldWidth%), 7, 3, 2 1612 | END IF 1613 | LOOP WHILE NOT ink$ = CHR$(27) 1614 | GOTO Options 1615 | END IF 1616 | 1617 | IF ink$ = "3" THEN 1618 | BlueColors 1619 | GOSUB Header 1620 | GOSUB InfoHeader 1621 | gap% = 4: shadow% = 2 1622 | DrawText 65, 200, "Field Height", 7, 3, 2 1623 | DrawText 465, 200, STR$(FieldHeight%), 7, 3, 2 1624 | RestoreColors 1625 | DO 1626 | ink$ = INKEY$ 1627 | IF ink$ = "+" THEN 1628 | FieldHeight% = FieldHeight% + 1 1629 | LINE (460, 190)-(639, 230), 1, BF 1630 | DrawText 465, 200, STR$(FieldHeight%), 7, 3, 2 1631 | END IF 1632 | IF ink$ = "-" THEN 1633 | FieldHeight% = FieldHeight% - 1 1634 | LINE (460, 190)-(639, 230), 1, BF 1635 | DrawText 465, 200, STR$(FieldHeight%), 7, 3, 2 1636 | END IF 1637 | LOOP WHILE NOT ink$ = CHR$(27) 1638 | GOTO Options 1639 | END IF 1640 | 1641 | IF ink$ = "4" THEN 1642 | BlueColors 1643 | GOSUB Header 1644 | GOSUB InfoHeader 1645 | gap% = 4: shadow% = 2 1646 | DrawText 65, 200, "Block Size", 7, 3, 2 1647 | DrawText 465, 200, STR$(BlockSize%), 7, 3, 2 1648 | RestoreColors 1649 | DO 1650 | ink$ = INKEY$ 1651 | IF ink$ = "+" THEN 1652 | BlockSize% = BlockSize% + 1 1653 | LINE (460, 190)-(639, 230), 1, BF 1654 | DrawText 465, 200, STR$(BlockSize%), 7, 3, 2 1655 | END IF 1656 | IF ink$ = "-" THEN 1657 | BlockSize% = BlockSize% - 1 1658 | LINE (460, 190)-(639, 230), 1, BF 1659 | DrawText 465, 200, STR$(BlockSize%), 7, 3, 2 1660 | END IF 1661 | LOOP WHILE NOT ink$ = CHR$(27) 1662 | GOTO Options 1663 | END IF 1664 | 1665 | IF ink$ = "5" THEN 1666 | BlueColors 1667 | GOSUB Header 1668 | GOSUB InfoHeader 1669 | gap% = 4: shadow% = 2 1670 | DrawText 65, 200, "Line Weight", 7, 3, 2 1671 | DrawText 465, 200, STR$(LineWeight), 7, 3, 2 1672 | RestoreColors 1673 | DO 1674 | ink$ = INKEY$ 1675 | IF ink$ = "+" THEN 1676 | LineWeight = LineWeight + 1 1677 | LINE (460, 190)-(639, 230), 1, BF 1678 | DrawText 465, 200, STR$(LineWeight), 7, 3, 2 1679 | END IF 1680 | IF ink$ = "-" THEN 1681 | LineWeight = LineWeight - 1 1682 | LINE (460, 190)-(639, 230), 1, BF 1683 | DrawText 465, 200, STR$(LineWeight), 7, 3, 2 1684 | END IF 1685 | LOOP WHILE NOT ink$ = CHR$(27) 1686 | GOTO Options 1687 | END IF 1688 | 1689 | IF ink$ = "6" THEN 1690 | BlueColors 1691 | GOSUB Header 1692 | GOSUB InfoHeader 1693 | gap% = 4: shadow% = 2 1694 | DrawText 65, 200, "Gap Weight", 7, 3, 2 1695 | DrawText 465, 200, STR$(GapWeight), 7, 3, 2 1696 | RestoreColors 1697 | DO 1698 | ink$ = INKEY$ 1699 | IF ink$ = "+" THEN 1700 | GapWeight = GapWeight + 1 1701 | LINE (460, 190)-(639, 230), 1, BF 1702 | DrawText 465, 200, STR$(GapWeight), 7, 3, 2 1703 | END IF 1704 | IF ink$ = "-" THEN 1705 | GapWeight = GapWeight - 1 1706 | LINE (460, 190)-(639, 230), 1, BF 1707 | DrawText 465, 200, STR$(GapWeight), 7, 3, 2 1708 | END IF 1709 | LOOP WHILE NOT ink$ = CHR$(27) 1710 | GOTO Options 1711 | END IF 1712 | 1713 | IF ink$ = "7" THEN 1714 | BlueColors 1715 | GOSUB Header 1716 | GOSUB InfoHeader 1717 | gap% = 4: shadow% = 2 1718 | DrawText 65, 200, "Stack Weight", 7, 3, 2 1719 | DrawText 465, 200, STR$(HeightWeight), 7, 3, 2 1720 | RestoreColors 1721 | DO 1722 | ink$ = INKEY$ 1723 | IF ink$ = "+" THEN 1724 | HeightWeight = HeightWeight + 1 1725 | LINE (460, 190)-(639, 230), 1, BF 1726 | DrawText 465, 200, STR$(HeightWeight), 7, 3, 2 1727 | END IF 1728 | IF ink$ = "-" THEN 1729 | HeightWeight = HeightWeight - 1 1730 | LINE (460, 190)-(639, 230), 1, BF 1731 | DrawText 465, 200, STR$(HeightWeight), 7, 3, 2 1732 | END IF 1733 | LOOP WHILE NOT ink$ = CHR$(27) 1734 | GOTO Options 1735 | END IF 1736 | 1737 | IF ink$ = "8" THEN 1738 | BlueColors 1739 | GOSUB Header 1740 | GOSUB InfoHeader 1741 | gap% = 4: shadow% = 2 1742 | DrawText 65, 200, "Side Weight", 7, 3, 2 1743 | DrawText 465, 200, STR$(SideWeight), 7, 3, 2 1744 | RestoreColors 1745 | DO 1746 | ink$ = INKEY$ 1747 | IF ink$ = "+" THEN 1748 | SideWeight = SideWeight + 1 1749 | LINE (460, 190)-(639, 230), 1, BF 1750 | DrawText 465, 200, STR$(SideWeight), 7, 3, 2 1751 | END IF 1752 | IF ink$ = "-" THEN 1753 | SideWeight = SideWeight - 1 1754 | LINE (460, 190)-(639, 230), 1, BF 1755 | DrawText 465, 200, STR$(SideWeight), 7, 3, 2 1756 | END IF 1757 | LOOP WHILE NOT ink$ = CHR$(27) 1758 | GOTO Options 1759 | END IF 1760 | GOTO BadKey2 1761 | 1762 | InfoHeader: 1763 | gap% = 4: shadow% = 2 1764 | DrawText 115, 360, "Use + and - To Change", 7, 2, 2 1765 | DrawText 135, 390, "Press ESC When Done", 7, 2, 2 1766 | gap% = 2: shadow% = 1 1767 | DrawText 15, 460, "Future Software", 7, 1, 2 1768 | DrawText 395, 460, "By Michael Fogleman", 7, 1, 2 1769 | RETURN 1770 | Header: 1771 | LINE (0, 0)-(640, 480), 1, BF 1772 | gap% = 6: shadow% = 3'2 1773 | DrawText 55, 20, "Future Blocks", 7, 6, 2 1774 | size% = 6 1775 | x% = 40: y% = 80 1776 | sx% = x%: c% = 7 1777 | DO 1778 | LINE (x% + 1 + shadow%, y% + 1 + shadow%)-(x% + size% + 1 + shadow%, y% + size% + 1 + shadow%), 0, BF 1779 | LINE (x% + 1, y% + 1)-(x% + size% - 1, y% + size% - 1), c%, BF 1780 | LINE (x%, y%)-(x% + size%, y%), 15 1781 | LINE (x%, y%)-(x%, y% + size%), 15 1782 | LINE (x% + size%, y%)-(x% + size%, y% + size%), 8 1783 | LINE (x%, y% + size%)-(x% + size%, y% + size%), 8 1784 | x% = x% + size% + 1 1785 | LOOP WHILE x% < 600 1786 | RETURN 1787 | END SUB 1788 | 1789 | SUB MoveLeft 1790 | PrevX% = PieceX% 1791 | IF PieceX% > 1 THEN PieceX% = PieceX% - 1 1792 | Overlap% = 0 1793 | CheckOverlap 1794 | IF Overlap% = 0 THEN ELSE PieceX% = PrevX% 1795 | END SUB 1796 | 1797 | SUB MoveRight 1798 | PrevX% = PieceX% 1799 | XSize% = PieceData%(0, PieceR%, CurrentPiece% - 1) 1800 | IF PieceX% <= FieldWidth% - XSize% THEN PieceX% = PieceX% + 1 1801 | Overlap% = 0 1802 | CheckOverlap 1803 | IF Overlap% = 0 THEN ELSE PieceX% = PrevX% 1804 | END SUB 1805 | 1806 | SUB NewPiece 1807 | Pieces& = Pieces& + 1 1808 | IF Compete% = 0 THEN CurrentPiece% = NextPiece% 1809 | IF Compete% = 1 THEN CurrentPiece% = PieceList%(CMN%): CMN% = CMN% + 1 1810 | BadPiece: 1811 | IF Compete% = 0 THEN 1812 | NextPiece% = RND * 100 + 1 1813 | IF NextPiece% > 7 THEN GOTO BadPiece 1814 | END IF 1815 | IF Compete% = 1 THEN 1816 | NextPiece% = PieceList%(CMN%) 1817 | END IF 1818 | PieceX% = FieldWidth% / 2 1819 | PieceR% = 0 1820 | XSize% = PieceData%(0, PieceR%, CurrentPiece% - 1) 1821 | YSize% = PieceData%(1, PieceR%, CurrentPiece% - 1) 1822 | PieceY% = -1 * YSize% 1823 | PieceC% = NextC% 1824 | BadColor: 1825 | NextC% = RND * 13 + 1 1826 | IF NextC% = 8 THEN GOTO BadColor 1827 | ComputerPlay 0 1828 | IF hint% = 1 THEN ComputerPlay 1 1829 | LINE (DispX% + 7, 383)-(DispX% + DispWidth% - 7, 385 + 16 * 4.5), 0, BF 1830 | Xs% = PieceData%(0, 1, NextPiece% - 1) + 1 1831 | DrawPiece2 DispX% + DispWidth% / 2 - BlockSize% * Xs% / 2, 385, NextPiece%, NextC% 1832 | PieceTime = TIMER 1833 | END SUB 1834 | 1835 | SUB PreOccupy (height%) 1836 | xn% = 1: yn% = FieldHeight% - height% + 1 1837 | DO 1838 | a% = RND 1839 | BCol: 1840 | c% = RND * 13 + 1 1841 | IF c% = 8 THEN GOTO BCol 1842 | IF a% = 1 THEN Occupied%(xn%, yn%) = c% 1843 | xn% = xn% + 1 1844 | IF xn% > FieldWidth% THEN xn% = 1: yn% = yn% + 1 1845 | LOOP WHILE yn% <= FieldHeight% 1846 | RefreshField 1847 | END SUB 1848 | 1849 | SUB ReadData 1850 | RESTORE Piece1 1851 | piece% = 0 1852 | DO 1853 | r% = 0 1854 | DO 1855 | READ Xs%, Ys% 1856 | PieceData%(0, r%, piece%) = Xs% 1857 | PieceData%(1, r%, piece%) = Ys% 1858 | b% = Xs% * Ys% 1859 | n% = 0 1860 | DO 1861 | READ PieceData%(n% + 2, r%, piece%) 1862 | n% = n% + 1 1863 | LOOP WHILE n% < b% 1864 | r% = r% + 1 1865 | LOOP WHILE r% < 4 1866 | piece% = piece% + 1 1867 | LOOP WHILE piece% < 7 1868 | END SUB 1869 | 1870 | SUB ReadText 1871 | RESTORE Text 1872 | letter% = 0 1873 | DO 1874 | n% = 0 1875 | DO 1876 | READ Text%(letter%, n%) 1877 | n% = n% + 1 1878 | LOOP WHILE n% < 35 1879 | letter% = letter% + 1 1880 | LOOP WHILE letter% < 40 1881 | END SUB 1882 | 1883 | SUB RefreshField 1884 | xn% = 1: yn% = 1 1885 | DO 1886 | DrawBlock xn%, yn%, Occupied%(xn%, yn%) 1887 | xn% = xn% + 1 1888 | IF xn% > FieldWidth% THEN xn% = 1: yn% = yn% + 1 1889 | LOOP WHILE yn% < FieldHeight% + 1 1890 | END SUB 1891 | 1892 | SUB RestoreColors 1893 | n% = 0: c% = 0 1894 | DO 1895 | r% = pal%(n%) 1896 | g% = pal%(n% + 1) 1897 | b% = pal%(n% + 2) 1898 | Colors c%, r%, g%, b% 1899 | n% = n% + 3 1900 | c% = c% + 1 1901 | LOOP WHILE c% < 16 1902 | END SUB 1903 | 1904 | SUB RotatePiece 1905 | PrevR% = PieceR% 1906 | PrevX% = PieceX% 1907 | PrevY% = PieceY% 1908 | 1909 | usery% = 1 1910 | PieceR% = PieceR% + 1 1911 | IF PieceR% > 3 THEN PieceR% = 0 1912 | Overlap% = 0 1913 | CheckOverlap 1914 | IF Overlap% = 0 THEN EXIT SUB 1915 | 1916 | PieceX% = PieceX% - 1 1917 | Overlap% = 0 1918 | CheckOverlap 1919 | IF Overlap% = 0 THEN EXIT SUB 1920 | PieceX% = PieceX% - 1 1921 | Overlap% = 0 1922 | CheckOverlap 1923 | IF Overlap% = 0 THEN EXIT SUB 1924 | usery% = 0 1925 | PieceR% = PrevR% 1926 | PieceX% = PrevX% 1927 | END SUB 1928 | 1929 | SUB StoreOccupy 1930 | xn% = PieceX%: yn% = PieceY% 1931 | Xs% = PieceData%(0, PieceR%, CurrentPiece% - 1) 1932 | Ys% = PieceData%(1, PieceR%, CurrentPiece% - 1) 1933 | maxn% = Xs% * Ys% 1934 | n% = 0 1935 | DO 1936 | c% = PieceData%(n% + 2, PieceR%, CurrentPiece% - 1) 1937 | IF c% = 0 THEN 1938 | ELSE 1939 | IF xn% > 0 AND yn% > 0 AND xn% <= FieldWidth% AND yn% <= FieldHeight% THEN 1940 | Occupied%(xn%, yn%) = PieceC% 1941 | END IF 1942 | END IF 1943 | xn% = xn% + 1 1944 | IF xn% - PieceX% >= Xs% THEN xn% = PieceX%: yn% = yn% + 1 1945 | n% = n% + 1 1946 | LOOP WHILE n% < maxn% 1947 | END SUB 1948 | 1949 | SUB TitleScreen 1950 | BlueColors 1951 | LINE (0, 0)-(640, 480), 1, BF 1952 | gap% = 10: shadow% = 3 1953 | DrawText 50, 50, "FUTURE", 2, 14, 2 1954 | DrawText 100, 200, "BLOCKS", 2, 14, 2 1955 | gap% = 4: shadow% = 2 1956 | DrawText 45, 340, "BY MICHAEL FOGLEMAN", 9, 4, 2 1957 | RestoreColors 1958 | Delay 2 1959 | gap% = 4: shadow% = 1 1960 | DrawText 80, 440, "PRESS ANY KEY TO CONTINUE", 7, 2, 2 1961 | FOR a = 1 TO 15 1962 | a$ = INKEY$ 1963 | NEXT 1964 | DO 1965 | LOOP WHILE INKEY$ = "" 1966 | END SUB 1967 | 1968 | --------------------------------------------------------------------------------