Skip to content

Commit d79fdc1

Browse files
committed
Make sure do again ticks tick
1 parent 97752d3 commit d79fdc1

File tree

5 files changed

+33
-10
lines changed

5 files changed

+33
-10
lines changed

main.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ int main(int argc, char ** argv) {
2424
initRenderer();
2525

2626
while (1) {
27-
if (rt.pd->realTimeInterval > 0 && rt.pd->realTimeInterval*60.0f < frameCounter) {
27+
// TODO: do a real again tick
28+
if (rt.doAgain || (rt.pd->realTimeInterval > 0 && rt.pd->realTimeInterval*60.0f < frameCounter)) {
2829
tick(&rt);
2930
frameCounter = 0;
3031
}
@@ -40,7 +41,8 @@ int main(int argc, char ** argv) {
4041
break;
4142
}
4243
if (inputDir == UNDO && rt.statesCount > 0) {
43-
undo(&rt, 0);
44+
undo(&rt);
45+
rt.didUndo = 0;
4446
} else {
4547
update(&rt, inputDir);
4648
}

notes.org

+4
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@ what does this rule actually do:
99

1010
TODO:
1111
- movement mask
12+
- don't preallocate for things that are setup at the beginning of the puzzle
13+
rules can allocate while they are building performance doesn't matter as much
14+
and it might help with the memory leak when expanding rules.
1215
- mark rule states that are 100% identical
1316
- move replace tile completely after checking the WHOLE match
1417
- smooth movement for a new demo
1518
- add any validations other then syntax
1619
- sounds
1720

21+
1822
3d api:
1923
- transfer levels with `lift` and `lower`
2024
- maybe specify 3d levels with,

puzzleData.c

+7-7
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ void initPart(RulePart * part) {
334334
}
335335
}
336336

337-
void initState(Pattern * ruleState) {
337+
void initPatern(Pattern * ruleState) {
338338
ruleState->partCount = 0;
339339
ruleState->partCapacity = 1;
340340
ruleState->parts = malloc(sizeof(RulePart) * ruleState->partCapacity);
@@ -357,14 +357,14 @@ void initRule(Rule * rule) {
357357
rule->commandCount = 0;
358358
rule->matchPaterns = malloc(sizeof(Pattern) * rule->matchPaternCapacity);
359359
for (int stateId = 0; stateId < rule->matchPaternCapacity; stateId++) {
360-
initState(&rule->matchPaterns[stateId]);
360+
initPatern(&rule->matchPaterns[stateId]);
361361
}
362362

363363
rule->resultPaternCount = 0;
364364
rule->resultPaternCapacity = 1;
365365
rule->resultPaterns = malloc(sizeof(Pattern) * rule->resultPaternCapacity);
366366
for (int stateId = 0; stateId < rule->resultPaternCapacity; stateId++) {
367-
initState(&rule->resultPaterns[stateId]);
367+
initPatern(&rule->resultPaterns[stateId]);
368368
}
369369
}
370370

@@ -380,15 +380,15 @@ void resetRule(Rule * rule) {
380380
free(rule->matchPaterns);
381381
rule->matchPaterns = malloc(sizeof(Pattern) * rule->matchPaternCapacity);
382382
for (int stateId = 0; stateId < rule->matchPaternCapacity; stateId++) {
383-
initState(&rule->matchPaterns[stateId]);
383+
initPatern(&rule->matchPaterns[stateId]);
384384
}
385385

386386
rule->resultPaternCount = 0;
387387
rule->resultPaternCapacity = 1;
388388
free(rule->resultPaterns);
389389
rule->resultPaterns = malloc(sizeof(Pattern) * rule->resultPaternCapacity);
390390
for (int stateId = 0; stateId < rule->resultPaternCapacity; stateId++) {
391-
initState(&rule->resultPaterns[stateId]);
391+
initPatern(&rule->resultPaterns[stateId]);
392392
}
393393
}
394394

@@ -415,7 +415,7 @@ void incRuleMatchState(Rule * rule) {
415415
rule->matchPaternCapacity += PUZZLE_MALLOC_INC;
416416
rule->matchPaterns = realloc(rule->matchPaterns, sizeof(Pattern) * rule->matchPaternCapacity);
417417
for (int stateId = rule->matchPaternCount + 1; stateId < rule->matchPaternCapacity; stateId++) {
418-
initState(&rule->matchPaterns[stateId]);
418+
initPatern(&rule->matchPaterns[stateId]);
419419
}
420420
}
421421
rule->matchPaternCount++;
@@ -427,7 +427,7 @@ void incRuleResultState(Rule * rule) {
427427
rule->resultPaterns = realloc(rule->resultPaterns, sizeof(Pattern) * rule->resultPaternCapacity);
428428

429429
for (int stateId = rule->resultPaternCount + 1; stateId < rule->resultPaternCapacity; stateId++) {
430-
initState(&rule->resultPaterns[stateId]);
430+
initPatern(&rule->resultPaterns[stateId]);
431431
}
432432
}
433433
rule->resultPaternCount++;

puzzleData.h

+2
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,8 @@ typedef struct State {
287287
int objectCount;
288288
int objectCapacity;
289289
Obj * objects;
290+
int * map;
291+
char * oMap;
290292
} State;
291293

292294
typedef struct Runtime {

runner.c

+16-1
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ void undo(Runtime * rt) {
322322
// Don't undo more then once per update
323323
return;
324324
}
325+
325326
if (rt->states[rt->statesCount].objectCount > 0) {
326327
free(rt->states[rt->statesCount].objects);
327328
rt->states[rt->statesCount].objectCount = 0;
@@ -339,6 +340,11 @@ void undo(Runtime * rt) {
339340

340341
memcpy(rt->objects, rt->states[rt->statesCount - 1].objects, sizeof(Obj) * rt->objectCapacity);
341342

343+
if (rt->levelType == SQUARES) {
344+
rt->map = rt->states[rt->statesCount - 1].map;
345+
rt->oMap = rt->states[rt->statesCount - 1].oMap;
346+
}
347+
342348
rt->statesCount--;
343349
rt->historyCount--;
344350
rt->didUndo = 1;
@@ -450,7 +456,6 @@ void applyMatch(Runtime * rt, Match * match) {
450456
rt->doAgain = 1;
451457
}
452458
match->partCount = 0;
453-
454459
}
455460

456461
int distance(int i, int j) {
@@ -1034,6 +1039,16 @@ void addState(Runtime * rt) {
10341039
rt->states[rt->statesCount].objects = malloc(sizeof(Obj) * rt->objectCapacity);
10351040
memcpy(rt->states[rt->statesCount].objects, rt->objects, sizeof(Obj) * rt->objectCapacity);
10361041

1042+
if (rt->levelType == SQUARES) {
1043+
rt->states[rt->statesCount].map = malloc((sizeof(int) * rt->height * rt->width * rt->pd->layerCount));
1044+
memcpy(rt->states[rt->statesCount].map, rt->map, (sizeof(int) * rt->height * rt->width * rt->pd->layerCount));
1045+
1046+
int bytePerRecord = rt->pd->objectCount/8+1;
1047+
rt->states[rt->statesCount].oMap = malloc((rt->height * rt->width * bytePerRecord));
1048+
memcpy(rt->states[rt->statesCount].oMap, rt->oMap, (rt->height * rt->width * bytePerRecord));
1049+
}
1050+
1051+
10371052
rt->statesCount++;
10381053
}
10391054

0 commit comments

Comments
 (0)