void savestate(char *fn) { stop(); f = gzopen(fn, "wb9"); if (!f) { conoutf("could not write %s", fn); return; }; gzwrite(f, (void *) "CUBESAVE", 8); gzputc(f, islittleendian); gzputi(SAVEGAMEVERSION); gzputi(sizeof(Sprite)); char buf[_MAXDEFSTR]; sprintf(buf, "%s", getclientmap().c_str()); gzwrite(f, buf, _MAXDEFSTR); gzputi(gamemode); gzputi(entityList.size()); for(Entity &en : entityList) { gzputc(f, en.spawned); } gzwrite(f, player1, sizeof(Sprite)); std::vector<Sprite *> &monsters = getmonsters(); gzputi(monsters.size()); for(Sprite *m : monsters) { gzwrite(f, m, sizeof(Sprite)); } gzputi(players.size()); for(Sprite *p : players) { gzput(p == NULL); gzwrite(f, p, sizeof(Sprite)); }; }
void loadgamerest() { if (demoplayback || !f) return; if (gzgeti() != entityList.size()) return loadgameout(); for(Entity &en : entityList) { en.spawned = gzgetc(f) != 0; if (en.type == CARROT && !en.spawned) trigger(en.attr1, en.attr2, true); }; restoreserverstate(entityList); gzread(f, player1, sizeof(Sprite)); player1->lastaction = lastmillis; int nmonsters = gzgeti(); std::vector<Sprite *> &monsters = getmonsters(); if (nmonsters != monsters.size()) return loadgameout(); loopv(monsters) { gzread(f, monsters[i], sizeof(Sprite)); monsters[i]->enemy = player1; // lazy, could save id of enemy instead monsters[i]->lastaction = monsters[i]->trigger = lastmillis + 500; // also lazy, but no real noticable effect on game if (monsters[i]->state == CS_DEAD) monsters[i]->lastaction = 0; }; restoremonsterstate(); int nplayers = gzgeti(); loopi(nplayers) if (!gzget()) { Sprite *d = getclient(i); assert(d); gzread(f, d, sizeof(Sprite)); }; conoutf("savegame restored"); if (demoloading) startdemo(); else stop(); }
void savestate(char *fn) { stop(); f = gzopen(fn, "wb9"); if(!f) { conoutf("could not write %s", fn); return; }; gzwrite(f, (void *)"CUBESAVE", 8); gzputc(f, islittleendian); gzputi(SAVEGAMEVERSION); gzputi(sizeof(dynent)); gzwrite(f, getclientmap(), _MAXDEFSTR); gzputi(gamemode); gzputi(ents.length()); loopv(ents) gzputc(f, ents[i].spawned); gzwrite(f, player1, sizeof(dynent)); dvector &monsters = getmonsters(); gzputi(monsters.length()); loopv(monsters) gzwrite(f, monsters[i], sizeof(dynent)); gzputi(players.length()); loopv(players) { gzput(players[i]==NULL); gzwrite(f, players[i], sizeof(dynent)); }; };