annotate src/scenario.c @ 0:c84446dfb3f5

initial add
author paulo@localhost
date Fri, 13 Mar 2009 00:39:12 -0700
parents
children
rev   line source
paulo@0 1 /* Scenario code for LOCKJAW, an implementation of the Soviet Mind Game
paulo@0 2
paulo@0 3 Copyright (C) 2008 Damian Yerrick <tepples+lj@spamcop.net>
paulo@0 4
paulo@0 5 This work is free software; you can redistribute it and/or modify
paulo@0 6 it under the terms of the GNU General Public License as published by
paulo@0 7 the Free Software Foundation; either version 2 of the License, or
paulo@0 8 (at your option) any later version.
paulo@0 9
paulo@0 10 This program is distributed in the hope that it will be useful,
paulo@0 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
paulo@0 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
paulo@0 13 GNU General Public License for more details.
paulo@0 14
paulo@0 15 You should have received a copy of the GNU General Public License
paulo@0 16 along with this program; if not, write to the Free Software
paulo@0 17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
paulo@0 18
paulo@0 19 Original game concept and design by Alexey Pajitnov.
paulo@0 20 The Software is not sponsored or endorsed by Alexey Pajitnov, Elorg,
paulo@0 21 or The Tetris Company LLC.
paulo@0 22
paulo@0 23 */
paulo@0 24
paulo@0 25 #include "scenario.h"
paulo@0 26 #include "options.h"
paulo@0 27 #include <string.h>
paulo@0 28
paulo@0 29 #define END_OF_PRESET {OPTIONS_MENU_LEN}
paulo@0 30
paulo@0 31 const Preset predefPresets[] = {
paulo@0 32 {"Guideline", {
paulo@0 33 {OPTIONS_WIDTH, 10},
paulo@0 34 {OPTIONS_HEIGHT, 20},
paulo@0 35 {OPTIONS_ENTRY_DELAY, 0},
paulo@0 36 {OPTIONS_PIECE_SET, LJRAND_4BLK},
paulo@0 37 {OPTIONS_RANDOMIZER, LJRAND_BAG},
paulo@0 38 {OPTIONS_HOLD_PIECE, LJHOLD_EMPTY},
paulo@0 39 {OPTIONS_ROTATION_SYSTEM, LJROT_SRS},
paulo@0 40 {OPTIONS_FLOOR_KICKS, 6},
paulo@0 41 {OPTIONS_LOCKDOWN, LJLOCK_MOVE},
paulo@0 42 {OPTIONS_LOCK_DELAY, 30},
paulo@0 43 {OPTIONS_BOTTOM_BLOCKS, 0},
paulo@0 44 {OPTIONS_LINE_DELAY, 30},
paulo@0 45 {OPTIONS_CLEAR_GRAVITY, LJGRAV_NAIVE},
paulo@0 46 {OPTIONS_GLUING, 0},
paulo@0 47 {OPTIONS_SCORING, LJSCORE_TDS},
paulo@0 48 {OPTIONS_DROP_SCORING, LJDROP_1S_2H},
paulo@0 49 {OPTIONS_T_SPIN, LJTS_TDS},
paulo@0 50 END_OF_PRESET
paulo@0 51 }},
paulo@0 52
paulo@0 53 {"Classic", {
paulo@0 54 {OPTIONS_GIMMICK, LJGM_ATYPE},
paulo@0 55 {OPTIONS_WIDTH, 10},
paulo@0 56 {OPTIONS_HEIGHT, 20},
paulo@0 57 {OPTIONS_ENTER_ABOVE, 0},
paulo@0 58 {OPTIONS_ENTRY_DELAY, 10},
paulo@0 59 {OPTIONS_SPEED_CURVE, LJSPD_NES},
paulo@0 60 {OPTIONS_PIECE_SET, LJRAND_4BLK},
paulo@0 61 {OPTIONS_RANDOMIZER, LJRAND_PURE},
paulo@0 62 {OPTIONS_HOLD_PIECE, LJHOLD_NONE},
paulo@0 63 {OPTIONS_ROTATION_SYSTEM, LJROT_NES},
paulo@0 64 {OPTIONS_FLOOR_KICKS, 0},
paulo@0 65 {OPTIONS_LOCKDOWN, LJLOCK_NOW},
paulo@0 66 {OPTIONS_LOCK_DELAY, 0},
paulo@0 67 {OPTIONS_BOTTOM_BLOCKS, 0},
paulo@0 68 {OPTIONS_LINE_DELAY, 30},
paulo@0 69 {OPTIONS_CLEAR_GRAVITY, LJGRAV_NAIVE},
paulo@0 70 {OPTIONS_GLUING, 0},
paulo@0 71 {OPTIONS_SCORING, LJSCORE_NES},
paulo@0 72 {OPTIONS_DROP_SCORING, LJDROP_NES},
paulo@0 73 {OPTIONS_GARBAGE, LJGARBAGE_NONE},
paulo@0 74 {OPTIONS_SIDEWAYS_DELAY, 15},
paulo@0 75 {OPTIONS_SIDEWAYS_SPEED, 6},
paulo@0 76 {OPTIONS_SOFT_DROP_SPEED, 2},
paulo@0 77 {OPTIONS_INITIAL_SIDEWAYS, 1},
paulo@0 78 {OPTIONS_IRS, 0},
paulo@0 79 {OPTIONS_NEXT_PIECES, 1},
paulo@0 80 END_OF_PRESET
paulo@0 81 }},
paulo@0 82
paulo@0 83 /* http://www.tetrisconcept.com/forum/viewtopic.php?t=892 */
paulo@0 84 {"Master", {
paulo@0 85 {OPTIONS_GIMMICK, LJGM_ATYPE},
paulo@0 86 {OPTIONS_WIDTH, 10},
paulo@0 87 {OPTIONS_HEIGHT, 20},
paulo@0 88 {OPTIONS_ENTER_ABOVE, 0},
paulo@0 89 {OPTIONS_SPEED_CURVE, LJSPD_TGM},
paulo@0 90 {OPTIONS_ENTRY_DELAY, 30},
paulo@0 91 {OPTIONS_PIECE_SET, LJRAND_4BLK},
paulo@0 92 {OPTIONS_RANDOMIZER, LJRAND_HIST_6},
paulo@0 93 {OPTIONS_HOLD_PIECE, LJHOLD_NONE},
paulo@0 94 {OPTIONS_ROTATION_SYSTEM, LJROT_ARIKA},
paulo@0 95 {OPTIONS_FLOOR_KICKS, 0},
paulo@0 96 {OPTIONS_LOCKDOWN, LJLOCK_STEP},
paulo@0 97 {OPTIONS_LOCK_DELAY, 30},
paulo@0 98 {OPTIONS_BOTTOM_BLOCKS, 0},
paulo@0 99 {OPTIONS_LINE_DELAY, 0},
paulo@0 100 {OPTIONS_CLEAR_GRAVITY, LJGRAV_NAIVE},
paulo@0 101 {OPTIONS_GLUING, LJGLUING_STICKY},
paulo@0 102 {OPTIONS_GARBAGE, LJGARBAGE_NONE},
paulo@0 103 {OPTIONS_SIDEWAYS_DELAY, 16},
paulo@0 104 {OPTIONS_SIDEWAYS_SPEED, 1},
paulo@0 105 {OPTIONS_INITIAL_SIDEWAYS, 0},
paulo@0 106 {OPTIONS_IRS, 1},
paulo@0 107 {OPTIONS_SOFT_DROP_SPEED, 1},
paulo@0 108 {OPTIONS_SOFT_DROP, LJZANGI_LOCK},
paulo@0 109 {OPTIONS_HARD_DROP, LJZANGI_SLIDE},
paulo@0 110 {OPTIONS_NEXT_PIECES, 1},
paulo@0 111 END_OF_PRESET
paulo@0 112 }},
paulo@0 113
paulo@0 114 /* http://www.tetrisconcept.com/forum/viewtopic.php?t=892 */
paulo@0 115 {"T.A. Death", {
paulo@0 116 {OPTIONS_GIMMICK, LJGM_ATYPE},
paulo@0 117 {OPTIONS_SPEED_CURVE, LJSPD_DEATH},
paulo@0 118 {OPTIONS_WIDTH, 10},
paulo@0 119 {OPTIONS_HEIGHT, 20},
paulo@0 120 {OPTIONS_ENTER_ABOVE, 0},
paulo@0 121 {OPTIONS_ENTRY_DELAY, 30},
paulo@0 122 {OPTIONS_PIECE_SET, LJRAND_4BLK},
paulo@0 123 {OPTIONS_RANDOMIZER, LJRAND_HIST_6},
paulo@0 124 {OPTIONS_HOLD_PIECE, LJHOLD_NONE},
paulo@0 125 {OPTIONS_ROTATION_SYSTEM, LJROT_ARIKA},
paulo@0 126 {OPTIONS_FLOOR_KICKS, 0},
paulo@0 127 {OPTIONS_LOCKDOWN, LJLOCK_STEP},
paulo@0 128 {OPTIONS_LOCK_DELAY, 30},
paulo@0 129 {OPTIONS_BOTTOM_BLOCKS, 0},
paulo@0 130 {OPTIONS_LINE_DELAY, 0},
paulo@0 131 {OPTIONS_CLEAR_GRAVITY, LJGRAV_NAIVE},
paulo@0 132 {OPTIONS_GLUING, LJGLUING_STICKY},
paulo@0 133 {OPTIONS_GARBAGE, LJGARBAGE_NONE},
paulo@0 134 {OPTIONS_SIDEWAYS_DELAY, 16},
paulo@0 135 {OPTIONS_SIDEWAYS_SPEED, 1},
paulo@0 136 {OPTIONS_INITIAL_SIDEWAYS, 0},
paulo@0 137 {OPTIONS_IRS, 1},
paulo@0 138 {OPTIONS_NEXT_PIECES, 1},
paulo@0 139 END_OF_PRESET
paulo@0 140 }},
paulo@0 141
paulo@0 142 {"Square", {
paulo@0 143 {OPTIONS_GIMMICK, LJGM_ATYPE},
paulo@0 144 {OPTIONS_WIDTH, 10},
paulo@0 145 {OPTIONS_HEIGHT, 20},
paulo@0 146 {OPTIONS_ENTER_ABOVE, 1},
paulo@0 147 {OPTIONS_ENTRY_DELAY, 30},
paulo@0 148 {OPTIONS_SPEED_CURVE, LJSPD_EXP},
paulo@0 149 {OPTIONS_PIECE_SET, LJRAND_4BLK},
paulo@0 150 {OPTIONS_RANDOMIZER, LJRAND_PURE},
paulo@0 151 {OPTIONS_HOLD_PIECE, LJHOLD_TNT},
paulo@0 152 {OPTIONS_ROTATION_SYSTEM, LJROT_SRS},
paulo@0 153 {OPTIONS_FLOOR_KICKS, 6},
paulo@0 154 {OPTIONS_LOCKDOWN, LJLOCK_STEP},
paulo@0 155 {OPTIONS_LOCK_DELAY, 30},
paulo@0 156 {OPTIONS_BOTTOM_BLOCKS, 0},
paulo@0 157 {OPTIONS_LINE_DELAY, 40},
paulo@0 158 {OPTIONS_CLEAR_GRAVITY, LJGRAV_NAIVE},
paulo@0 159 {OPTIONS_GLUING, LJGLUING_SQUARE},
paulo@0 160 {OPTIONS_SCORING, LJSCORE_TNT64},
paulo@0 161 {OPTIONS_DROP_SCORING, LJDROP_NOSCORE},
paulo@0 162 {OPTIONS_T_SPIN, LJTS_TNT},
paulo@0 163 {OPTIONS_GARBAGE, LJGARBAGE_NONE},
paulo@0 164 {OPTIONS_SIDEWAYS_DELAY, 11},
paulo@0 165 {OPTIONS_SIDEWAYS_SPEED, 5},
paulo@0 166 {OPTIONS_SOFT_DROP_SPEED, 2},
paulo@0 167 {OPTIONS_SOFT_DROP, LJZANGI_SLIDE},
paulo@0 168 {OPTIONS_HARD_DROP, LJZANGI_SLIDE},
paulo@0 169 {OPTIONS_INITIAL_SIDEWAYS, 0},
paulo@0 170 {OPTIONS_IRS, 0},
paulo@0 171 {OPTIONS_NEXT_PIECES, 3},
paulo@0 172 END_OF_PRESET
paulo@0 173 }},
paulo@0 174
paulo@0 175 /* http://www.tetrisconcept.com/forum/viewtopic.php?t=549 */
paulo@0 176 {"40 Lines", {
paulo@0 177 {OPTIONS_GIMMICK, LJGM_BTYPE},
paulo@0 178 {OPTIONS_WIDTH, 10},
paulo@0 179 {OPTIONS_PIECE_SET, LJRAND_4BLK},
paulo@0 180 {OPTIONS_BOTTOM_BLOCKS, 0},
paulo@0 181 {OPTIONS_CLEAR_GRAVITY, LJGRAV_NAIVE},
paulo@0 182 {OPTIONS_GARBAGE, 0},
paulo@0 183 END_OF_PRESET
paulo@0 184 }},
paulo@0 185
paulo@0 186 /* http://www.tetrisconcept.com/forum/viewtopic.php?t=549 */
paulo@0 187 {"180 Seconds", {
paulo@0 188 {OPTIONS_GIMMICK, LJGM_ULTRA},
paulo@0 189 {OPTIONS_WIDTH, 10},
paulo@0 190 {OPTIONS_PIECE_SET, LJRAND_4BLK},
paulo@0 191 {OPTIONS_HOLD_PIECE, LJHOLD_EMPTY},
paulo@0 192 {OPTIONS_BOTTOM_BLOCKS, 0},
paulo@0 193 {OPTIONS_CLEAR_GRAVITY, LJGRAV_NAIVE},
paulo@0 194 {OPTIONS_GLUING, 0},
paulo@0 195 {OPTIONS_SCORING, LJSCORE_LJ},
paulo@0 196 {OPTIONS_DROP_SCORING, 0},
paulo@0 197 {OPTIONS_T_SPIN, 0},
paulo@0 198 {OPTIONS_GARBAGE, 0},
paulo@0 199 END_OF_PRESET
paulo@0 200 }},
paulo@0 201
paulo@0 202 /* http://www.tetrisconcept.com/forum/viewtopic.php?t=892 */
paulo@0 203 {"Death 300", {
paulo@0 204 {OPTIONS_GIMMICK, LJGM_ULTRA},
paulo@0 205 {OPTIONS_SPEED_CURVE, LJSPD_DEATH300},
paulo@0 206 {OPTIONS_WIDTH, 10},
paulo@0 207 {OPTIONS_HEIGHT, 20},
paulo@0 208 {OPTIONS_ENTER_ABOVE, 0},
paulo@0 209 {OPTIONS_ENTRY_DELAY, 30},
paulo@0 210 {OPTIONS_PIECE_SET, LJRAND_4BLK},
paulo@0 211 {OPTIONS_RANDOMIZER, LJRAND_HIST_6},
paulo@0 212 {OPTIONS_HOLD_PIECE, LJHOLD_EMPTY},
paulo@0 213 {OPTIONS_ROTATION_SYSTEM, LJROT_ARIKA},
paulo@0 214 {OPTIONS_FLOOR_KICKS, 0},
paulo@0 215 {OPTIONS_LOCKDOWN, LJLOCK_STEP},
paulo@0 216 {OPTIONS_LOCK_DELAY, 30},
paulo@0 217 {OPTIONS_BOTTOM_BLOCKS, 0},
paulo@0 218 {OPTIONS_LINE_DELAY, 0},
paulo@0 219 {OPTIONS_CLEAR_GRAVITY, LJGRAV_NAIVE},
paulo@0 220 {OPTIONS_GLUING, LJGLUING_STICKY},
paulo@0 221 {OPTIONS_GARBAGE, LJGARBAGE_NONE},
paulo@0 222 {OPTIONS_SIDEWAYS_DELAY, 16},
paulo@0 223 {OPTIONS_SIDEWAYS_SPEED, 1},
paulo@0 224 {OPTIONS_INITIAL_SIDEWAYS, 0},
paulo@0 225 {OPTIONS_IRS, 1},
paulo@0 226 {OPTIONS_NEXT_PIECES, 1},
paulo@0 227 END_OF_PRESET
paulo@0 228 }},
paulo@0 229
paulo@0 230 {"M-Roll", {
paulo@0 231 {OPTIONS_GIMMICK, LJGM_BTYPE},
paulo@0 232 {OPTIONS_SPEED_CURVE, LJSPD_DEATH300},
paulo@0 233 {OPTIONS_WIDTH, 10},
paulo@0 234 {OPTIONS_HEIGHT, 20},
paulo@0 235 {OPTIONS_ENTER_ABOVE, 0},
paulo@0 236 {OPTIONS_ENTRY_DELAY, 30},
paulo@0 237 {OPTIONS_PIECE_SET, LJRAND_4BLK},
paulo@0 238 {OPTIONS_RANDOMIZER, LJRAND_HIST_6},
paulo@0 239 {OPTIONS_HOLD_PIECE, LJHOLD_EMPTY},
paulo@0 240 {OPTIONS_ROTATION_SYSTEM, LJROT_ARIKA},
paulo@0 241 {OPTIONS_FLOOR_KICKS, 0},
paulo@0 242 {OPTIONS_LOCKDOWN, LJLOCK_STEP},
paulo@0 243 {OPTIONS_LOCK_DELAY, 30},
paulo@0 244 {OPTIONS_BOTTOM_BLOCKS, 0},
paulo@0 245 {OPTIONS_LINE_DELAY, 0},
paulo@0 246 {OPTIONS_CLEAR_GRAVITY, LJGRAV_NAIVE},
paulo@0 247 {OPTIONS_GLUING, LJGLUING_STICKY},
paulo@0 248 {OPTIONS_GARBAGE, LJGARBAGE_NONE},
paulo@0 249 {OPTIONS_SIDEWAYS_DELAY, 16},
paulo@0 250 {OPTIONS_SIDEWAYS_SPEED, 1},
paulo@0 251 {OPTIONS_INITIAL_SIDEWAYS, 0},
paulo@0 252 {OPTIONS_IRS, 1},
paulo@0 253 {OPTIONS_NEXT_PIECES, 1},
paulo@0 254 {OPTIONS_HIDE_PF, 1},
paulo@0 255 END_OF_PRESET
paulo@0 256 }},
paulo@0 257
paulo@0 258 /* http://www.tetrisconcept.com/forum/viewtopic.php?t=549 */
paulo@0 259 {"Cascade", {
paulo@0 260 {OPTIONS_GIMMICK, LJGM_BTYPE},
paulo@0 261 {OPTIONS_WIDTH, 10},
paulo@0 262 {OPTIONS_PIECE_SET, LJRAND_4BLK},
paulo@0 263 {OPTIONS_HOLD_PIECE, LJHOLD_EMPTY},
paulo@0 264 {OPTIONS_CLEAR_GRAVITY, LJGRAV_CASCADE},
paulo@0 265 {OPTIONS_GARBAGE, 0},
paulo@0 266 END_OF_PRESET
paulo@0 267 }},
paulo@0 268
paulo@0 269 /* http://www.tetrisconcept.com/forum/viewtopic.php?t=777 */
paulo@0 270 {"Baboo!", {
paulo@0 271 {OPTIONS_GIMMICK, LJGM_BABY},
paulo@0 272 {OPTIONS_WIDTH, 10},
paulo@0 273 {OPTIONS_PIECE_SET, LJRAND_4BLK},
paulo@0 274 {OPTIONS_SPEED_CURVE, LJSPD_ZERO},
paulo@0 275 {OPTIONS_BOTTOM_BLOCKS, 0},
paulo@0 276 {OPTIONS_CLEAR_GRAVITY, LJGRAV_NAIVE},
paulo@0 277 {OPTIONS_GLUING, 0},
paulo@0 278 {OPTIONS_SCORING, LJSCORE_LJ},
paulo@0 279 {OPTIONS_DROP_SCORING, 0},
paulo@0 280 {OPTIONS_T_SPIN, LJTS_TDS},
paulo@0 281 {OPTIONS_GARBAGE, 0}
paulo@0 282 }},
paulo@0 283
paulo@0 284 };
paulo@0 285
paulo@0 286 const Preset *loadedPresets = predefPresets;
paulo@0 287 size_t nLoadedPresets = sizeof(predefPresets)/sizeof(predefPresets[0]);
paulo@0 288
paulo@0 289 static unsigned char presetBuffer[OPTIONS_MENU_LEN];
paulo@0 290
paulo@0 291 void presetStart(void) {
paulo@0 292 memset(&presetBuffer, 255, sizeof(presetBuffer));
paulo@0 293 }
paulo@0 294
paulo@0 295 void presetAdd(size_t which) {
paulo@0 296 if (which >= nLoadedPresets) {
paulo@0 297 return;
paulo@0 298 }
paulo@0 299 const PresetRule *r = loadedPresets[which].rules;
paulo@0 300 for (size_t i = 0;
paulo@0 301 i < PRESET_MAX_RULES
paulo@0 302 && r[i].line < OPTIONS_MENU_LEN;
paulo@0 303 ++i) {
paulo@0 304 presetBuffer[r[i].line] = r[i].value;
paulo@0 305 }
paulo@0 306 }
paulo@0 307
paulo@0 308 void presetFinish(struct LJView *v) {
paulo@0 309 unpackCommonOptions(v, presetBuffer);
paulo@0 310 }
paulo@0 311
paulo@0 312 #if 0
paulo@0 313 void loadPresetsFromText(FILE *fp) {
paulo@0 314 Preset *presets = NULL;
paulo@0 315
paulo@0 316 size_t capacity = 0, n = 0;
paulo@0 317
paulo@0 318 {
paulo@0 319 // allocate memory for this preset
paulo@0 320 if (capacity <= n) {
paulo@0 321 if (capacity < 32) {
paulo@0 322 capacity += 16;
paulo@0 323 } else {
paulo@0 324 capacity += capacity / 2;
paulo@0 325 }
paulo@0 326 Preset *newPresets = realloc(presets,
paulo@0 327 capacity * sizeof(preset));
paulo@0 328 // if we can't allocate memory, screw it
paulo@0 329 if (!newPresets) {
paulo@0 330 break;
paulo@0 331 }
paulo@0 332 }
paulo@0 333 }
paulo@0 334
paulo@0 335 loadedPresets = presets;
paulo@0 336 nLoadedPresets = n;
paulo@0 337 }
paulo@0 338 #endif
paulo@0 339