void savegame(struct memfile *mf) { int count = 0; xchar ltmp; store_version(mf); /* Place flags, player info & moves at the beginning of the save. * This makes it possible to read them in nh_get_savegame_status without * parsing all the dungeon and level data */ save_flags(mf); save_you(mf, &u); mwrite32(mf, moves); save_mon(mf, &youmonst); /* store dungeon layout */ save_dungeon(mf); savelevchn(mf); /* store levels */ for (ltmp = 1; ltmp <= maxledgerno(); ltmp++) if (levels[ltmp]) count++; mwrite32(mf, count); for (ltmp = 1; ltmp <= maxledgerno(); ltmp++) { if (!levels[ltmp]) continue; mwrite8(mf, ltmp); /* level number*/ savelev(mf, ltmp); /* actual level*/ } savegamestate(mf); }
void save_obj(struct memfile *mf, struct obj *obj) { unsigned int oflags; oflags = (obj->cursed << 31) | (obj->blessed << 30) | (obj->unpaid << 29) | (obj->no_charge << 28) | (obj->known << 27) | (obj->dknown << 26) | (obj->bknown << 25) | (obj->rknown << 24) | (obj->oeroded << 22) | (obj->oeroded2 << 20) | (obj->oerodeproof << 19) | (obj->olocked << 18) | (obj->obroken << 17) | (obj->otrapped << 16) | (obj->recharged << 13) | (obj->lamplit << 12) | (obj->greased << 11) | (obj->oattached << 9) | (obj->in_use << 8) | (obj->was_thrown << 7) | (obj->bypass << 6); mfmagic_set(mf, OBJ_MAGIC); mwrite32(mf, obj->onamelth); mwrite32(mf, obj->o_id); mwrite32(mf, obj->owt); mwrite32(mf, obj->quan); mwrite32(mf, obj->corpsenm); mwrite32(mf, obj->oeaten); mwrite32(mf, obj->age); mwrite32(mf, obj->owornmask); mwrite32(mf, oflags); mwrite16(mf, obj->otyp); mwrite8(mf, obj->ox); mwrite8(mf, obj->oy); mwrite8(mf, obj->spe); mwrite8(mf, obj->oclass); mwrite8(mf, obj->invlet); mwrite8(mf, obj->oartifact); mwrite8(mf, obj->where); mwrite8(mf, obj->timed); /* no need to save the value of the cobj pointer, but we will need to know * if there is something in here that needs to be restored */ mwrite8(mf, obj->cobj ? 1 : 0); if (obj->onamelth) mwrite(mf, ONAME(obj), obj->onamelth); if (obj->oattached == OATTACHED_MONST) save_mon(mf, (struct monst*)obj->oextra); else if (obj->oattached == OATTACHED_M_ID) mwrite32(mf, *(unsigned int*)obj->oextra); }
static void savemonchn(struct memfile *mf, struct monst *mtmp) { struct monst *mtmp2; unsigned int count = 0; mfmagic_set(mf, MONCHAIN_MAGIC); for (mtmp2 = mtmp; mtmp2; mtmp2 = mtmp2->nmon) count++; mwrite32(mf, count); while (mtmp) { mtmp2 = mtmp->nmon; save_mon(mf, mtmp); if (mtmp->minvent) saveobjchn(mf, mtmp->minvent); mtmp = mtmp2; } }