diff --git a/system.cpp b/system.cpp index 53940c82..0d549f03 100644 --- a/system.cpp +++ b/system.cpp @@ -36,11 +36,16 @@ namespace rg { } #endif +/** is a game map currently loaded (it is false after hr::stop_game and true after hr::start_game) */ EX bool game_active; +/** God mode */ EX bool autocheat; + +/** which wall should we fill the Canvas with */ EX eWall canvas_default_wall = waNone; +/** the number of Black Lotuses collected -- but updated only if we manage to escape */ EX int truelotus; EX int asteroids_generated, asteroid_orbs_generated; @@ -63,6 +68,7 @@ EX bool verless(string v, string cmp) { return v < cmp; } +/** should we set the starting land to specialland */ bool do_use_special_land() { return !safety && @@ -390,27 +396,42 @@ bool havesave = true; EX namespace scores { #if HDR +/** the amount of boxes reserved for each hr::score item */ #define MAXBOX 500 -#define POSSCORE 384 // update this when new boxes are added! +/** currently used boxes in hr::score */ +#define POSSCORE 387 +/** a struct to keep local score from an earlier game */ struct score { + /** version used */ string ver; + /** all the data of the saved score, see applyBoxes() */ int box[MAXBOX]; }; #endif -EX int savebox[MAXBOX], boxid; +/** the current save */ +score save; +/** the index of the next box */ +EX int boxid; + +/** see hr::applyBox */ EX bool saving, loading, loadingHi; +/** names of all the boxes */ EX string boxname[MAXBOX]; +/** 'fake' boxes should not appear when examining local scores */ EX bool fakebox[MAXBOX]; +/** does this box contain monster kills */ EX bool monsbox[MAXBOX]; +/** the next box should contain t */ void applyBox(int& t) { - if(saving) savebox[boxid++] = t; - else if(loading) t = savebox[boxid++]; + if(saving) save.box[boxid++] = t; + else if(loading) t = save.box[boxid++]; else boxid++; } +/** the next box should contain tb */ void applyBoxBignum(bignum& tb) { float tf; int ti; @@ -421,6 +442,7 @@ void applyBoxBignum(bignum& tb) { if(loading) tb = bignum(tf); } +/** the next box should contain @i, and possibly be named @name */ EX void applyBoxNum(int& i, string name IS("")) { fakebox[boxid] = (name == ""); boxname[boxid] = name; @@ -428,6 +450,7 @@ EX void applyBoxNum(int& i, string name IS("")) { applyBox(i); } +/** the next box should contain @b, and possibly be named @name */ void applyBoxBool(bool& b, string name = "") { int i = b; applyBoxNum(i, name); @@ -435,13 +458,14 @@ void applyBoxBool(bool& b, string name = "") { b = i; } -// just skips the value when loading +/** Save i while saving, do nothing while loading. Use together with hr::applyBoxLoad and boxid++ */ void applyBoxSave(int i, string name = "") { fakebox[boxid] = (name == ""); boxname[boxid] = name; applyBox(i); } +/** Load i while loading, do nothing while saving. Use together with hr::applyBoxSave and boxid++ */ int applyBoxLoad(string name = "") { fakebox[boxid] = (name == ""); boxname[boxid] = name; @@ -449,12 +473,13 @@ int applyBoxLoad(string name = "") { return i; } +/** the next box is the number of collected items it */ void applyBoxI(eItem it, bool f = false) { boxname[boxid] = iinf[it].name; fakebox[boxid] = f; monsbox[boxid] = false; if(loadingHi) { - updateHi(it, savebox[boxid++]); + updateHi(it, save.box[boxid++]); } else applyBox(items[it]); } @@ -465,11 +490,13 @@ void addinv(eItem it) { invorb.push_back(it); } +/** Handle the information about orb it. Need to call list_invorb later */ void applyBoxOrb(eItem it) { applyBoxI(it, true); invorb.push_back(it); } +/** Handle the OSM information for all orbs that applyBoxOrb has been called for so far */ void list_invorb() { for(eItem it: invorb) { #if CAP_INV @@ -484,6 +511,7 @@ void list_invorb() { invorb.clear(); } +/** handle the number of monsters of type m killed */ void applyBoxM(eMonster m, bool f = false) { fakebox[boxid] = f; boxname[boxid] = minf[m].name; @@ -491,6 +519,7 @@ void applyBoxM(eMonster m, bool f = false) { applyBox(kills[m]); } +/** Call applyBox for all the required values. This will save the values if hr::saving==true, load if hr::loading==true, load into highscores if hr::loadingHi==true */ EX void applyBoxes() { invorb.clear(); @@ -541,7 +570,7 @@ EX void applyBoxes() { fakebox[boxid] = true; if(saving) applyBoxSave(items[itOrbSafety] ? safetyland : cwt.at->land, ""); else if(loading) firstland = safetyland = eLand(applyBoxLoad()); - else lostin = eLand(savebox[boxid++]); + else lostin = eLand(save.box[boxid++]); for(int i=itOrbLightning; i<25; i++) applyBoxOrb(eItem(i)); @@ -657,7 +686,7 @@ EX void applyBoxes() { applyBoxBool(tactic::on, ""); applyBoxNum(elec::lightningfast, ""); - // if(savebox[boxid]) printf("lotus = %d (lost = %d)\n", savebox[boxid], isHaunted(lostin)); + // if(save.box[boxid]) printf("lotus = %d (lost = %d)\n", save.box[boxid], isHaunted(lostin)); if(loadingHi && isHaunted(lostin)) boxid++; else applyBoxI(itLotus); applyBoxOrb(itOrbUndeath); @@ -836,34 +865,39 @@ EX void applyBoxes() { applyBoxM(moVaulter); applyBoxM(moPike); applyBoxM(moRusalka); + list_invorb(); if(POSSCORE != boxid) printf("ERROR: %d boxes\n", boxid); + if(isize(invorb)) { println(hlog, "ERROR: Orbs not taken into account"); exit(1); } } +/** save the current game values to save */ EX void saveBox() { boxid = 0; saving = true; applyBoxes(); saving = false; } +/** load the current game values from save */ void loadBox() { // have boxid boxid = 0; loading = true; applyBoxes(); loading = false; } +/** load the current game values from save into the highscore tables */ void loadBoxHigh() { - dynamicval sp1(multi::players, savebox[197]); - dynamicval sp2(geometry, (eGeometry) savebox[116]); - dynamicval sp3(shmup::on, savebox[119]); - dynamicval sp4(chaosmode, savebox[196]); - dynamicval sp5(variation, (eVariation) savebox[186]); - dynamicval sp7(gp::param.first, savebox[342]); - dynamicval sp8(gp::param.second, savebox[343]); - dynamicval spinv(inv::on, savebox[306]); + dynamicval sp1(multi::players, save.box[197]); + dynamicval sp2(geometry, (eGeometry) save.box[116]); + dynamicval sp3(shmup::on, save.box[119]); + dynamicval sp4(chaosmode, save.box[196]); + dynamicval sp5(variation, (eVariation) save.box[186]); + dynamicval sp7(gp::param.first, save.box[342]); + dynamicval sp8(gp::param.second, save.box[343]); + dynamicval spinv(inv::on, save.box[306]); - if(savebox[238]) geometry = gSphere; - if(savebox[239]) geometry = gElliptic; - if(savebox[341]) variation = eVariation::goldberg; - if(savebox[344]) variation = eVariation::irregular; + if(save.box[238]) geometry = gSphere; + if(save.box[239]) geometry = gElliptic; + if(save.box[341]) variation = eVariation::goldberg; + if(save.box[344]) variation = eVariation::irregular; if(multi::players < 1 || multi::players > MAXPLAYER) multi::players = 1; @@ -994,7 +1028,7 @@ EX void saveStats(bool emergency IS(false)) { if(!shmup::on) princess::saveArmedHP = countMyGolemsHP(moPrincessArmed); scores::saveBox(); - for(int i=0; i= 0 && savebox[258] < coh) { - hints[savebox[258]].last = savebox[1]; + if(save.box[258] >= 0 && save.box[258] < coh) { + hints[save.box[258]].last = save.box[1]; } loadBoxHigh(); @@ -1141,9 +1175,9 @@ EX void loadsave() { // printf("box = %d (%d)\n", sc.box[65 + 4 + itOrbSafety - itOrbLightning], boxid); // printf("boxid = %d\n", boxid); using namespace scores; - for(int i=0; i