mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-04-05 10:17:03 +00:00
intra:: intra maps are now saved correctly
This commit is contained in:
parent
7a7198c45a
commit
23a860d405
22
intra.cpp
22
intra.cpp
@ -359,6 +359,28 @@ void show_portals() {
|
||||
dialog::display();
|
||||
}
|
||||
|
||||
#if HDR
|
||||
struct portal_to_save {
|
||||
cellwalker cw1;
|
||||
cellwalker cw2;
|
||||
int spin;
|
||||
bool mirrored;
|
||||
};
|
||||
#endif
|
||||
|
||||
EX vector<portal_to_save> portals_to_save;
|
||||
|
||||
EX void prepare_to_save() {
|
||||
portals_to_save.clear();
|
||||
for(auto c: connections) if(c.second.scw < c.second.tcw) {
|
||||
portals_to_save.emplace_back(portal_to_save{c.second.scw, c.second.tcw, c.second.spin_value, false});
|
||||
}
|
||||
}
|
||||
|
||||
EX void load_saved_portals() {
|
||||
for(const auto& p: portals_to_save) connect_portal(p.cw1, p.cw2, p.spin);
|
||||
}
|
||||
|
||||
auto hooks1 =
|
||||
addHook(hooks_o_key, 90, [] (o_funcs& v) {
|
||||
if(intra::in) v.push_back(named_dialog(XLAT("manage portals"), show_portals));
|
||||
|
@ -750,6 +750,25 @@ EX namespace mapstream {
|
||||
if(multi::players > 1)
|
||||
for(int i=0; i<multi::players; i++)
|
||||
f.write(cellids[multi::player[i].at]);
|
||||
|
||||
if(intra::in) {
|
||||
for(int i=0; i<isize(intra::portals_to_save); i++) {
|
||||
auto& p = intra::portals_to_save[i];
|
||||
if(cellids.count(p.cw1.at)) {
|
||||
f.write<char>(1);
|
||||
f.write(i);
|
||||
f.write(cellids[p.cw1.at]);
|
||||
f.write<char>(p.cw1.spin);
|
||||
}
|
||||
if(cellids.count(p.cw2.at)) {
|
||||
f.write<char>(2);
|
||||
f.write(i);
|
||||
f.write(cellids[p.cw2.at]);
|
||||
f.write<char>(p.cw2.spin);
|
||||
}
|
||||
}
|
||||
f.write<char>(0);
|
||||
}
|
||||
|
||||
callhooks(hooks_savemap, f);
|
||||
f.write<int>(0);
|
||||
@ -962,7 +981,21 @@ EX namespace mapstream {
|
||||
mp.mirrored = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(intra::in) {
|
||||
while(true) {
|
||||
char k = f.get<char>();
|
||||
if(!k) break;
|
||||
int i = f.get<int>();
|
||||
int id = f.get<int>();
|
||||
int spin = f.get<char>();
|
||||
auto& p = intra::portals_to_save[i];
|
||||
auto& cw = (k==1 ? p.cw1 : p.cw2);
|
||||
cw.at = cellbyid[id];
|
||||
cw.spin = fixspin(relspin[id], spin, cw.at->type, f.vernum);
|
||||
}
|
||||
}
|
||||
|
||||
if(f.vernum >= 0xA848) {
|
||||
int i;
|
||||
f.read(i);
|
||||
@ -1007,9 +1040,24 @@ EX namespace mapstream {
|
||||
if(!f.f) return false;
|
||||
f.write(f.vernum);
|
||||
f.write(dual::state);
|
||||
// make sure we save in correct order
|
||||
if(dual::state) dual::switch_to(1);
|
||||
dual::split_or_do([&] { save_only_map(f); });
|
||||
int q = intra::in ? isize(intra::data) : 0;
|
||||
f.write(q);
|
||||
if(q) {
|
||||
intra::prepare_to_save();
|
||||
int qp = isize(intra::portals_to_save);
|
||||
f.write(qp);
|
||||
for(auto& ps: intra::portals_to_save) {
|
||||
f.write(ps.spin);
|
||||
f.write(ps.mirrored);
|
||||
}
|
||||
intra::resetter ir;
|
||||
for(int i=0; i<q; i++) { intra::switch_to(i); save_only_map(f); }
|
||||
}
|
||||
else {
|
||||
// make sure we save in correct order
|
||||
if(dual::state) dual::switch_to(1);
|
||||
dual::split_or_do([&] { save_only_map(f); });
|
||||
}
|
||||
save_usershapes(f);
|
||||
return true;
|
||||
}
|
||||
@ -1027,7 +1075,31 @@ EX namespace mapstream {
|
||||
ds = 0;
|
||||
if(ds == 1 && dual::state == 0) dual::enable();
|
||||
if(ds == 0 && dual::state == 1) dual::disable();
|
||||
dual::split_or_do([&] { load_only_map(f); });
|
||||
int q = 0;
|
||||
if(f.vernum >= 0xA907) {
|
||||
f.read(q);
|
||||
}
|
||||
if(q) {
|
||||
int qp;
|
||||
f.read(qp);
|
||||
intra::portals_to_save.resize(qp);
|
||||
for(auto& ps: intra::portals_to_save) {
|
||||
f.read(ps.spin);
|
||||
f.read(ps.mirrored);
|
||||
println(hlog, tie(ps.spin, ps.mirrored));
|
||||
}
|
||||
for(int i=0; i<q; i++) {
|
||||
intra::in = true; /* so that it knows to load portals */
|
||||
load_only_map(f);
|
||||
intra::in = false;
|
||||
intra::become();
|
||||
}
|
||||
intra::start();
|
||||
intra::load_saved_portals();
|
||||
}
|
||||
else {
|
||||
dual::split_or_do([&] { load_only_map(f); });
|
||||
}
|
||||
if(dual::state) dual::assign_landsides();
|
||||
if(f.vernum >= 0xA61A)
|
||||
load_usershapes(f);
|
||||
|
Loading…
x
Reference in New Issue
Block a user