comparison src/scenario.c @ 0:c84446dfb3f5

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