X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=saveresume.c;h=889794596ae2325e8500e909e7765f9f567b0a32;hb=36f72f190259b3ff72a87d1e888a578d6fd5b8da;hp=d8541748fbf25fe573770562028838c65248ac7a;hpb=7ad7dd209e48478e067001e2671bce73b34632e9;p=open-adventure.git diff --git a/saveresume.c b/saveresume.c index d854174..8897945 100644 --- a/saveresume.c +++ b/saveresume.c @@ -105,6 +105,8 @@ int resume(void) return restore(fp); } +bool is_valid(struct game_t); + int restore(FILE* fp) { /* Read and restore game state from file, assuming @@ -118,10 +120,32 @@ int restore(FILE* fp) fclose(fp); if (save.version != VRSION) { rspeak(VERSION_SKEW, save.version / 10, MOD(save.version, 10), VRSION / 10, MOD(VRSION, 10)); - } else { - game = save.game; + } else if (is_valid(save.game)) { + game = save.game; } return GO_TOP; } -/* end */ +bool is_valid(struct game_t valgame) +{ + /* Save files can be roughly grouped into three groups: + * With valid, reaceable state, with valid, but unreachable + * state and with invaild state. We check that state is + * valid: no states are outside minimal or maximal value + */ + + /* Bounds check for locations + */ + if ( valgame.chloc < -1 || valgame.chloc > NLOCATIONS || + valgame.chloc < -1 || valgame.chloc > NLOCATIONS || + valgame.loc < -1 || valgame.loc > NLOCATIONS || + valgame.newloc < -1 || valgame.newloc > NLOCATIONS || + valgame.oldloc < -1 || valgame.oldloc > NLOCATIONS || + valgame.oldloc < -1 || valgame.oldloc > NLOCATIONS) { + return false; + } + + return true; +} + +/* end */ \ No newline at end of file