From 23a860d405e035caf8980642d9bafb9e434cc638 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Fri, 17 Sep 2021 12:00:53 +0200 Subject: [PATCH] intra:: intra maps are now saved correctly --- intra.cpp | 22 ++++++++++++++ mapeditor.cpp | 82 +++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 99 insertions(+), 5 deletions(-) diff --git a/intra.cpp b/intra.cpp index ca31f296..8c7ba06a 100644 --- a/intra.cpp +++ b/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 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)); diff --git a/mapeditor.cpp b/mapeditor.cpp index f576cb7d..2bd0c156 100644 --- a/mapeditor.cpp +++ b/mapeditor.cpp @@ -750,6 +750,25 @@ EX namespace mapstream { if(multi::players > 1) for(int i=0; i(1); + f.write(i); + f.write(cellids[p.cw1.at]); + f.write(p.cw1.spin); + } + if(cellids.count(p.cw2.at)) { + f.write(2); + f.write(i); + f.write(cellids[p.cw2.at]); + f.write(p.cw2.spin); + } + } + f.write(0); + } callhooks(hooks_savemap, f); f.write(0); @@ -962,7 +981,21 @@ EX namespace mapstream { mp.mirrored = false; } } - + + if(intra::in) { + while(true) { + char k = f.get(); + if(!k) break; + int i = f.get(); + int id = f.get(); + int spin = f.get(); + 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= 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= 0xA61A) load_usershapes(f);