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