From 7c664693948a335d899cd549bc7540ccb69918eb Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sun, 18 Jun 2017 18:52:15 +0200 Subject: [PATCH] other changes in 9.4n --- landgen.cpp | 2 +- mapeditor.cpp | 221 ++++++++++++++++++++++++++++++++++++++++++-------- menus.cpp | 2 +- polygons.cpp | 16 +++- shmup.cpp | 5 +- 5 files changed, 207 insertions(+), 39 deletions(-) diff --git a/landgen.cpp b/landgen.cpp index 6b34c49a..b4c77600 100644 --- a/landgen.cpp +++ b/landgen.cpp @@ -3487,7 +3487,7 @@ void setdist(cell *c, int d, cell *from) { int v; if(randomPatternsMode) v = RANDPAT ? 24 : 0; - else if(torus) ; + else if(torus) v=0; else if(euclid) { eucoord x, y; decodeMaster(c->master, x, y); diff --git a/mapeditor.cpp b/mapeditor.cpp index e71e831d..e4b2ce87 100644 --- a/mapeditor.cpp +++ b/mapeditor.cpp @@ -15,6 +15,14 @@ namespace mapeditor { int subcanvas; int displaycodes; + struct editwhat { + double dist; + int rotid, symid, pointid; + bool side; + cell *c; + } ew, ewsearch; + bool autochoose; + #ifndef NOEDIT map modelcell; @@ -1191,7 +1199,7 @@ namespace mapeditor { } else if(uni == ' ') { cmode = emDraw; - drawcell = mouseover ? mouseover : cwt.c; + initdraw(mouseover ? mouseover : cwt.c); } } } @@ -1215,7 +1223,7 @@ namespace mapeditor { bool coloring; int colortouse = 0xC0C0C0FF; - transmatrix drawtrans; + transmatrix drawtrans, drawtransnew; void loadShape(int sg, int id, hpcshape& sh, int d, int layer) { initShape(sg, id); @@ -1277,7 +1285,7 @@ namespace mapeditor { int sg = drawcellShapeGroup(); - for(int i=0; id[mapeditor::dslayer]); @@ -1295,6 +1303,8 @@ namespace mapeditor { void showDrawEditor() { + if(!mouseout()) getcstat = '-'; + if(coloring) { dialog::drawColorDialog(colortouse); return; @@ -1342,17 +1352,23 @@ namespace mapeditor { displayfr(8, 8+fs, 2, vid.fsize, line1, 0xC0C0C0, 0); displayfr(8, 8+fs*2, 2, vid.fsize, line2, 0xC0C0C0, 0); displayButton(8, 8+fs*3, XLAT("l = layers: %1", its(dslayer)), 'l', 0); - if(us) { + if(us && size(us->d[dslayer].list)) { usershapelayer& ds(us->d[dslayer]); displayButton(8, 8+fs*4, XLAT("1-9 = rotations: %1", its(ds.rots)), '1' + (ds.rots % 9), 0); displayButton(8, 8+fs*5, XLAT(ds.sym ? "0 = symmetry" : "0 = asymmetry"), '0', 0); displayfr(8, 8+fs*7, 2, vid.fsize, XLAT("%1 vertices", its(size(ds.list))), 0xC0C0C0, 0); - displayfr(8, 8+fs*8, 2, vid.fsize, XLAT("a = add v"), 0xC0C0C0, 0); - displayfr(8, 8+fs*9, 2, vid.fsize, XLAT("m = move v"), 0xC0C0C0, 0); - displayfr(8, 8+fs*10, 2, vid.fsize, XLAT("d = delete v"), 0xC0C0C0, 0); - displayfr(8, 8+fs*11, 2, vid.fsize, XLAT("c = readd v"), 0xC0C0C0, 0); - displayfr(8, 8+fs*12, 2, vid.fsize, XLAT("b = reorder"), 0xC0C0C0, 0); + displaymm('a', 8, 8+fs*8, 2, vid.fsize, XLAT("a = add v"), 0); + if(autochoose) { + displaymm('m', 8, 8+fs*9, 2, vid.fsize, XLAT("m = move v"), 0); + displaymm('d', 8, 8+fs*10, 2, vid.fsize, XLAT("d = delete v"), 0); + } + else { + displayButton(8, 8+fs*9, XLAT("m = move v"), 'm', 0); + displayButton(8, 8+fs*10, XLAT("d = delete v"), 'd', 0); + } + displaymm('c', 8, 8+fs*11, 2, vid.fsize, XLAT(autochoose ? "autochoose" : "c = choose"), 0); + displayButton(8, 8+fs*12, XLAT("b = switch auto"), 'b', 0); displayfr(8, 8+fs*14, 2, vid.fsize, XLAT("t = shift"), 0xC0C0C0, 0); displayfr(8, 8+fs*15, 2, vid.fsize, XLAT("y = spin"), 0xC0C0C0, 0); @@ -1361,12 +1377,13 @@ namespace mapeditor { } else { displayfr(8, 8+fs*5, 2, vid.fsize, XLAT("'n' to start"), 0xC0C0C0, 0); + mousekey = 'n'; } - displayfr(vid.xres-8, 8+fs*4, 2, vid.fsize, XLAT("g = grid"), 0xC0C0C0, 16); + displaymm('e', vid.xres-8, 8+fs*4, 2, vid.fsize, XLAT("g = grid"), 16); displayButton(vid.xres-8, 8+fs*3, XLAT("z = zoom in"), 'z', 16); displayButton(vid.xres-8, 8+fs*2, XLAT("o = zoom out"), 'o', 16); - displayfr(vid.xres-8, 8+fs, 2, vid.fsize, XLAT("e = edit this"), 0xC0C0C0, 16); + displaymm('e', vid.xres-8, 8+fs, 2, vid.fsize, XLAT("e = edit this"), 16); if(!mouseout()) { hyperpoint mh = inverse(drawtrans * rgpushxto0(ccenter)) * mouseh; @@ -1385,6 +1402,9 @@ namespace mapeditor { void applyToShape(int sg, int id, int uni, hyperpoint mh) { bool haveshape = usershapes[sg][id]; bool xnew = false; + + if(uni == '-') uni = mousekey; + if(!haveshape) { if(uni == 'n' || uni == 'u') initShape(sg, id); @@ -1397,6 +1417,7 @@ namespace mapeditor { } usershapelayer *dsCur = &usershapes[sg][id]->d[dslayer]; + if(uni == 'n' || xnew) { dsCur->list.clear(); dsCur->list.push_back(mh); @@ -1404,7 +1425,14 @@ namespace mapeditor { } if(uni == 'a' && haveshape) { - dsCur->list.push_back(mh); + mh = spin(2*M_PI*-ew.rotid/dsCur->rots) * mh; + if(ew.symid) mh = Mirror * mh; + + if(ew.pointid < 0 || ew.pointid >= size(dsCur->list)) + ew.pointid = size(dsCur->list)-1, ew.side = 1; + + dsCur->list.insert(dsCur->list.begin()+ew.pointid+(ew.side?1:0), mh); + if(ew.side) ew.pointid++; rebuildPolys = true; } @@ -1413,28 +1441,25 @@ namespace mapeditor { usershapes[sg][id] = NULL; } - if(uni == 'm' || uni == 'd' || uni == 'c' || uni == 'b') { - int i = 0; - if(size(dsCur->list) < 1) return; - for(int j=1; jlist); j++) - if(intval(mh, dsCur->list[j]) < intval(mh, dsCur->list[i])) - i = j; - if(uni == 'm') + if(uni == 'm' || uni == 'd') { + + int i = ew.pointid; + + if(i < 0 || i >= size(dsCur->list)) return; + + mh = spin(2*M_PI*-ew.rotid/dsCur->rots) * mh; + if(ew.symid) mh = Mirror * mh; + + if(uni == 'm' || uni == 'M') dsCur->list[i] = mh; - if(uni == 'd') + if(uni == 'd' || uni == 'b') { dsCur->list.erase(dsCur->list.begin() + i); - if(uni == 'c') - dsCur->list.push_back(dsCur->list[i]); - if(uni == 'b') { - while(i) { - dsCur->list.push_back(dsCur->list[0]); - dsCur->list.erase(dsCur->list.begin()); - i--; - } + if(ew.side == 1 && ew.pointid >= i) ew.pointid--; + if(ew.side == 0 && ew.pointid > i) ew.pointid--; } rebuildPolys = true; } - + if(uni == 'T') { /* loadShape(sg, id, shFemaleBody, 1, 1); loadShape(sg, id, shPKnife, 1, 2); @@ -1563,8 +1588,10 @@ namespace mapeditor { } void drawHandleKey(int sym, int uni) { - + if(choosefile && handleKeyFile(sym, uni)) return; + + if(uni == SETMOUSEKEY) mousekey = newmousekey; if(coloring) { int v = dialog::handleKeyColor(sym, uni, colortouse); @@ -1582,12 +1609,15 @@ namespace mapeditor { applyToShape(sg, i, uni, mh); if(uni == 'e') { - drawcell = mouseover ? mouseover : cwt.c; + initdraw(mouseover ? mouseover : cwt.c); } if(uni == 'l') { dslayer++; dslayer %= USERLAYERS; } if(uni == 'L') { dslayer--; if(dslayer < 0) dslayer += USERLAYERS; } if(uni == 'g') coldcenter = ccenter, ccenter = mh; + if(uni == 'c') ew = ewsearch; + if(uni == 'b') autochoose = !autochoose; + if(uni == 'S') { for(int i=0; id[i]); + hpcshape& sh(ds.sh); + + if(sh.s != sh.e) + queuepoly(V, sh, ds.color ? ds.color : color); + } + } + + #ifndef NOEDIT + if(cmode == emDraw && mapeditor::editingShape(group, id)) { + + /* for(int a=0; ad[mapeditor::dslayer]); + + hyperpoint mh = inverse(mapeditor::drawtrans) * mouseh; + + for(int a=0; a"); } + string font = "Times"; + void text(int x, int y, int size, const string& str, bool frame, int col, int align) { double dfc = (x - vid.xcenter) * (x - vid.xcenter) + @@ -1838,6 +1840,8 @@ namespace svg { col = 0xFF + (col << 8); + bool uselatex = font == "latex"; + if(!invisible(col)) { startstring(); string str2 = ""; @@ -1848,13 +1852,19 @@ namespace svg { str2 += "<"; else if(str[i] == '>') str2 += ">"; + else if(uselatex && str[i] == '#') + str2 += "\\#"; else str2 += str[i]; - fprintf(f, "%s", + if(uselatex) str2 = string("\\myfont{")+coord(size)+"}{" + str2 + "}"; + fprintf(f, "%s", + stylestr(col, frame ? 0x0000000FF : 0, (1< 3) k--; else if(k==3) k = 2; - return k <= multi::players; + if(k > 3) k--; else if(k==3) k = 0; + return k > multi::players; } void handleInput(int delta) {