Compare commits
19 Commits
afd4a3f4e3
...
0ec4e46bf0
Author | SHA1 | Date |
---|---|---|
Zeno Rogue | 0ec4e46bf0 | |
Zeno Rogue | c55550de57 | |
Zeno Rogue | 886a7ff43e | |
Zeno Rogue | deb207e4c3 | |
Zeno Rogue | 819d815d59 | |
Zeno Rogue | b20288557e | |
Zeno Rogue | 4a8eb08340 | |
Zeno Rogue | 007a111eab | |
Zeno Rogue | 65e9f68bc7 | |
Zeno Rogue | 3e30a7ded1 | |
Zeno Rogue | 5f8d250940 | |
Zeno Rogue | dee90f8d7c | |
Zeno Rogue | d43b19625e | |
Zeno Rogue | f32a2708b4 | |
Zeno Rogue | be27fc0fce | |
Zeno Rogue | 61720cec5e | |
Zeno Rogue | 7cf1643c5d | |
Zeno Rogue | 3791daf9e3 | |
Zeno Rogue | e9941d29d3 |
|
@ -119,6 +119,7 @@ EX bool wrongMode(char flags) {
|
||||||
if(disksize) return true;
|
if(disksize) return true;
|
||||||
}
|
}
|
||||||
if(ineligible_starting_land && !flags) return true;
|
if(ineligible_starting_land && !flags) return true;
|
||||||
|
if(use_custom_land_list) return true;
|
||||||
|
|
||||||
if(shmup::on != (flags == rg::shmup || flags == rg::racing)) return true;
|
if(shmup::on != (flags == rg::shmup || flags == rg::racing)) return true;
|
||||||
if(racing::on != (flags == rg::racing)) return true;
|
if(racing::on != (flags == rg::racing)) return true;
|
||||||
|
@ -144,6 +145,7 @@ EX bool wrongMode(char flags) {
|
||||||
dls = land_structure;
|
dls = land_structure;
|
||||||
|
|
||||||
if(land_structure != dls) return true;
|
if(land_structure != dls) return true;
|
||||||
|
if(shmup::on && vid.creature_scale != 1) return true;
|
||||||
if(numplayers() > 1 && !multi::friendly_fire) return true;
|
if(numplayers() > 1 && !multi::friendly_fire) return true;
|
||||||
if(numplayers() > 1 && multi::pvp_mode) return true;
|
if(numplayers() > 1 && multi::pvp_mode) return true;
|
||||||
if(numplayers() > 1 && multi::split_screen) return true;
|
if(numplayers() > 1 && multi::split_screen) return true;
|
||||||
|
@ -804,6 +806,7 @@ EX void achievement_final(bool really_final) {
|
||||||
if(bow::crossbow_mode() && bow::style == bow::cbBull) specialcode += 32;
|
if(bow::crossbow_mode() && bow::style == bow::cbBull) specialcode += 32;
|
||||||
if(bow::crossbow_mode() && bow::style == bow::cbGeodesic) specialcode += 64;
|
if(bow::crossbow_mode() && bow::style == bow::cbGeodesic) specialcode += 64;
|
||||||
if(bow::crossbow_mode() && bow::style == bow::cbGeometric) specialcode += 96;
|
if(bow::crossbow_mode() && bow::style == bow::cbGeometric) specialcode += 96;
|
||||||
|
if(shmup::on && vid.creature_scale != 1) return;
|
||||||
|
|
||||||
if(sphere && specialland == laHalloween) {
|
if(sphere && specialland == laHalloween) {
|
||||||
if(specialcode) return;
|
if(specialcode) return;
|
||||||
|
@ -814,6 +817,7 @@ EX void achievement_final(bool really_final) {
|
||||||
if(ineligible_starting_land) return;
|
if(ineligible_starting_land) return;
|
||||||
if(geometry) return;
|
if(geometry) return;
|
||||||
if(NONSTDVAR) return;
|
if(NONSTDVAR) return;
|
||||||
|
if(use_custom_land_list) return;
|
||||||
|
|
||||||
if(numplayers() > 1 && !multi::friendly_fire) return;
|
if(numplayers() > 1 && !multi::friendly_fire) return;
|
||||||
if(numplayers() > 1 && multi::pvp_mode) return;
|
if(numplayers() > 1 && multi::pvp_mode) return;
|
||||||
|
|
|
@ -1132,7 +1132,7 @@ EX void setLandSphere(cell *c) {
|
||||||
vector<eLand> euland;
|
vector<eLand> euland;
|
||||||
map<int, eLand> euland3;
|
map<int, eLand> euland3;
|
||||||
map<int, eLand> euland3_hash;
|
map<int, eLand> euland3_hash;
|
||||||
EX map<tuple<int, int, int>, eLand> landscape_lands;
|
EX map<array<int, 3>, eLand> landscape_lands;
|
||||||
|
|
||||||
EX eLand& get_euland(int c) {
|
EX eLand& get_euland(int c) {
|
||||||
euland.resize(max_vec);
|
euland.resize(max_vec);
|
||||||
|
@ -1146,7 +1146,7 @@ EX void clear_euland(eLand first) {
|
||||||
euland3.clear();
|
euland3.clear();
|
||||||
euland3[0] = first;
|
euland3[0] = first;
|
||||||
landscape_lands.clear();
|
landscape_lands.clear();
|
||||||
landscape_lands[{0,0,0}] = first;
|
landscape_lands[make_array(0,0,0)] = first;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool valid_wall_at(int c) {
|
bool valid_wall_at(int c) {
|
||||||
|
|
|
@ -2497,15 +2497,8 @@ void celldrawer::draw_item_full() {
|
||||||
if(doHighlight()) asciiborder = kind_outline(it) >> 8;
|
if(doHighlight()) asciiborder = kind_outline(it) >> 8;
|
||||||
|
|
||||||
if(it == itCompass && isPlayerOn(c)) {
|
if(it == itCompass && isPlayerOn(c)) {
|
||||||
cell *c1 = c ? findcompass(c) : NULL;
|
shiftpoint dummy;
|
||||||
if(c1) {
|
mark_compass(c, dummy);
|
||||||
shiftmatrix P = ggmatrix(c1);
|
|
||||||
shiftpoint P1 = tC0(P);
|
|
||||||
|
|
||||||
queuestr(P1, 2*vid.fsize, "X", 0x10100 * int(128 + 100 * sintick(150)));
|
|
||||||
queuestr(P1, vid.fsize, its(-compassDist(c)), 0x10101 * int(128 - 100 * sintick(150)));
|
|
||||||
addauraspecial(P1, 0xFF0000, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5141,3 +5141,43 @@ Other:
|
||||||
- when you press ESC in the gameover screen, the YASC message is displayed
|
- when you press ESC in the gameover screen, the YASC message is displayed
|
||||||
- special YASC message for pinches, and being on the Round Table
|
- special YASC message for pinches, and being on the Round Table
|
||||||
- in YASC messages, mention the knights blocking the way, and also mention their names
|
- in YASC messages, mention the knights blocking the way, and also mention their names
|
||||||
|
|
||||||
|
2024-03-24 11:32 Update 13.0d:
|
||||||
|
|
||||||
|
System:
|
||||||
|
* itch.io Windows binaries and Steam Windows/Linux binaries now use SDL2 instead of SDL1.2
|
||||||
|
|
||||||
|
Custom mode:
|
||||||
|
* A new mode where you can select the lands to be used.
|
||||||
|
* Another menu can be used to save a mode to a file.
|
||||||
|
* Enabling Halloween or Space Rocks in infinite geometries now produces something that makes sense.
|
||||||
|
* Previously changing the creature scale was disabled in non-cheat shmup. Now it can be changed (but it counts as a cheat).
|
||||||
|
* New land structure 'landscape'.
|
||||||
|
|
||||||
|
Graphics:
|
||||||
|
* Font scale used in ASCII maps now can be changed.
|
||||||
|
* Items moved by Orb of Water, Magnetism, Winter, Space, and Repulsion are now animated.
|
||||||
|
* VR: fixed items, Ivy, compasses, etc. being placed incorrectly in 2.5D.
|
||||||
|
* VR: compass/Yendor targets now should be displayed.
|
||||||
|
|
||||||
|
Gameplay:
|
||||||
|
* Void Beasts are now pulled by Orb of Air.
|
||||||
|
* Changed the electrical properties of some walls to make Eclectic City more friendly.
|
||||||
|
* Trees etc are now mentioned as blockers in YASC messages.
|
||||||
|
* YASC codes work better if killed on a 10+ tile.
|
||||||
|
|
||||||
|
Alternate geometries:
|
||||||
|
* Clear more walls when generating Wild West in high GP.
|
||||||
|
* Better Emerald in Octagon chamfered.
|
||||||
|
* Fixed Emerald Mine and Vineyard generating very bad in {n,oo} and binary tiling.
|
||||||
|
* Fixed the lack of non-trapdoors in Zebra 435.
|
||||||
|
* Better 'pseudohept' tiles in INVERSE tilings.
|
||||||
|
* In grid mode, don't try to draw greatwall lines outside of normal geometry pure/bitruncated.
|
||||||
|
* Nicer cell boundaries used in Archimedean and irregular tilings.
|
||||||
|
* When you save an irregular map using Orb of Safety or map editor (or custom mode), it should now save the irregular map used.
|
||||||
|
|
||||||
|
Bug fixes:
|
||||||
|
* Fixed dice hints over different heights.
|
||||||
|
* Fixed troll nests in Horodisk/Voronoi.
|
||||||
|
* Fixed a crash when running away from Clearing in single-land mode.
|
||||||
|
* Some values are tracked in savefiles while previously they did not (fatigue, snake oil, crossbow reload time, gun ammo, etc.) (Thanks to jlm)
|
||||||
|
|
|
@ -1388,7 +1388,7 @@ EX void initConfig() {
|
||||||
addsaverenum(variation, "mode-variation", eVariation::bitruncated);
|
addsaverenum(variation, "mode-variation", eVariation::bitruncated);
|
||||||
addsaver(peace::on, "mode-peace");
|
addsaver(peace::on, "mode-peace");
|
||||||
addsaver(peace::otherpuzzles, "mode-peace-submode");
|
addsaver(peace::otherpuzzles, "mode-peace-submode");
|
||||||
addsaverenum(specialland, "land for special modes");
|
param_enum(specialland, "specialland", "land for special modes", specialland);
|
||||||
|
|
||||||
addsaver(viewdists, "expansion mode");
|
addsaver(viewdists, "expansion mode");
|
||||||
param_f(backbrightness, "back", "brightness behind sphere");
|
param_f(backbrightness, "back", "brightness behind sphere");
|
||||||
|
@ -2955,8 +2955,7 @@ EX void show3D() {
|
||||||
dialog::addSelItem(XLAT("3D detailed settings"), "", 'D');
|
dialog::addSelItem(XLAT("3D detailed settings"), "", 'D');
|
||||||
dialog::add_action_push(show3D_height_details);
|
dialog::add_action_push(show3D_height_details);
|
||||||
|
|
||||||
if(scale_used())
|
add_edit(vid.creature_scale);
|
||||||
add_edit(vid.creature_scale);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
add_edit(vid.creature_scale);
|
add_edit(vid.creature_scale);
|
||||||
|
@ -3105,7 +3104,9 @@ EX int config3 = addHook(hooks_configfile, 100, [] {
|
||||||
}, "context help", 'H');
|
}, "context help", 'H');
|
||||||
|
|
||||||
param_f(vid.creature_scale, "creature_scale", "3d-creaturescale", 1)
|
param_f(vid.creature_scale, "creature_scale", "3d-creaturescale", 1)
|
||||||
->editable(0, 1, .1, "Creature scale", "", 'C');
|
->editable(0, 1, .1, "Creature scale", "", 'C')
|
||||||
|
->set_extra([] { dialog::addInfo(XLAT("changing this during shmup is counted as cheating")); })
|
||||||
|
->set_reaction([] { if(shmup::on) cheater++; });
|
||||||
param_f(vid.height_width, "heiwi", "3d-heightwidth", 1.5)
|
param_f(vid.height_width, "heiwi", "3d-heightwidth", 1.5)
|
||||||
->editable(0, 1, .1, "Height to width", "", 'h');
|
->editable(0, 1, .1, "Height to width", "", 'h');
|
||||||
param_f(vid.yshift, "yshift", "Y shift", 0)
|
param_f(vid.yshift, "yshift", "Y shift", 0)
|
||||||
|
|
|
@ -957,7 +957,7 @@ EX void mainloopiter() {
|
||||||
}
|
}
|
||||||
else sc_ticks = ticks;
|
else sc_ticks = ticks;
|
||||||
|
|
||||||
if(game_keys_scroll && !shmup::on && (cmode & sm::NORMAL) && !keystate[SDLK_LALT] && !keystate[SDLK_RALT]) {
|
if(game_keys_scroll && !shmup::on && (cmode & sm::NORMAL) && !keystate[SDL12(SDLK_LALT, SDL_SCANCODE_LALT)] && !keystate[SDL12(SDLK_RALT, SDL_SCANCODE_RALT)]) {
|
||||||
rug::using_rugview urv;
|
rug::using_rugview urv;
|
||||||
auto& lastticks = sc_ticks2;
|
auto& lastticks = sc_ticks2;
|
||||||
ld t = (ticks - lastticks) * shiftmul / 1000.;
|
ld t = (ticks - lastticks) * shiftmul / 1000.;
|
||||||
|
|
|
@ -507,7 +507,7 @@ void geometry_information::generate_floorshapes_for(int id, cell *c, int siid, i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if(arb::in() || aperiodic || arcm::in()) {
|
else if(arb::in() || aperiodic || arcm::in() || IRREGULAR) {
|
||||||
vector<hyperpoint> actual;
|
vector<hyperpoint> actual;
|
||||||
for(int j=0; j<cor; j++)
|
for(int j=0; j<cor; j++)
|
||||||
actual.push_back(get_corner_position(c, j));
|
actual.push_back(get_corner_position(c, j));
|
||||||
|
|
12
geom-exp.cpp
12
geom-exp.cpp
|
@ -152,11 +152,8 @@ void validity_info() {
|
||||||
EX bool showquotients;
|
EX bool showquotients;
|
||||||
|
|
||||||
string validclasses[4] = {" (X)", " (½)", "", " (!)"};
|
string validclasses[4] = {" (X)", " (½)", "", " (!)"};
|
||||||
|
|
||||||
EX void ge_land_selection() {
|
|
||||||
cmode = sm::SIDE | sm::MAYDARK;
|
|
||||||
gamescreen();
|
|
||||||
|
|
||||||
|
EX void gen_landvisited() {
|
||||||
if(cheater) for(int i=0; i<landtypes; i++) landvisited[i] = true;
|
if(cheater) for(int i=0; i<landtypes; i++) landvisited[i] = true;
|
||||||
|
|
||||||
for(int i=0; i<landtypes; i++)
|
for(int i=0; i<landtypes; i++)
|
||||||
|
@ -177,6 +174,13 @@ EX void ge_land_selection() {
|
||||||
landvisited[laCamelot] |= hiitemsMax(treasureType(laCamelot)) >= 1;
|
landvisited[laCamelot] |= hiitemsMax(treasureType(laCamelot)) >= 1;
|
||||||
landvisited[laCA] = true;
|
landvisited[laCA] = true;
|
||||||
landvisited[laAsteroids] = true;
|
landvisited[laAsteroids] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
EX void ge_land_selection() {
|
||||||
|
cmode = sm::SIDE | sm::MAYDARK;
|
||||||
|
gamescreen();
|
||||||
|
|
||||||
|
gen_landvisited();
|
||||||
|
|
||||||
dialog::init(XLAT("select the starting land"));
|
dialog::init(XLAT("select the starting land"));
|
||||||
if(dialog::infix != "") mouseovers = dialog::infix;
|
if(dialog::infix != "") mouseovers = dialog::infix;
|
||||||
|
|
|
@ -576,8 +576,6 @@ EX void add_wall(int i, const vector<hyperpoint>& h) {
|
||||||
static constexpr ld hcrossf7 = 0.620672, hexf7 = 0.378077, tessf7 = 1.090550, hexhexdist7 = 0.566256;
|
static constexpr ld hcrossf7 = 0.620672, hexf7 = 0.378077, tessf7 = 1.090550, hexhexdist7 = 0.566256;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
EX bool scale_used() { return (shmup::on && geometry == gNormal && BITRUNCATED) ? (cheater || autocheat) : true; }
|
|
||||||
|
|
||||||
EX bool is_subcube_based(eVariation var) {
|
EX bool is_subcube_based(eVariation var) {
|
||||||
return among(var, eVariation::subcubes, eVariation::dual_subcubes, eVariation::bch, eVariation::bch_oct);
|
return among(var, eVariation::subcubes, eVariation::dual_subcubes, eVariation::bch, eVariation::bch_oct);
|
||||||
}
|
}
|
||||||
|
@ -784,13 +782,13 @@ void geometry_information::prepare_basics() {
|
||||||
if(msphere && geuclid) scalefactor *= (1 + vid.depth);
|
if(msphere && geuclid) scalefactor *= (1 + vid.depth);
|
||||||
if(msphere && ghyperbolic) scalefactor *= sinh(1 + vid.depth);
|
if(msphere && ghyperbolic) scalefactor *= sinh(1 + vid.depth);
|
||||||
|
|
||||||
if(scale_used()) {
|
if(true) {
|
||||||
scalefactor *= vid.creature_scale;
|
scalefactor *= vid.creature_scale;
|
||||||
orbsize *= vid.creature_scale;
|
orbsize *= vid.creature_scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
zhexf = BITRUNCATED ? hexf : crossf* .55;
|
zhexf = BITRUNCATED ? hexf : crossf* .55;
|
||||||
if(scale_used()) zhexf *= vid.creature_scale;
|
zhexf *= vid.creature_scale;
|
||||||
if(WDIM == 2 && GDIM == 3) zhexf *= 1.5, orbsize *= 1.2;
|
if(WDIM == 2 && GDIM == 3) zhexf *= 1.5, orbsize *= 1.2;
|
||||||
|
|
||||||
if(cgi.emb->is_euc_in_hyp()) {
|
if(cgi.emb->is_euc_in_hyp()) {
|
||||||
|
@ -1314,7 +1312,7 @@ EX string cgi_string() {
|
||||||
V("RS:", fts(geom3::euclid_embed_rotate));
|
V("RS:", fts(geom3::euclid_embed_rotate));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(scale_used()) V("CS", fts(vid.creature_scale));
|
if(vid.creature_scale != 1) V("CS", fts(vid.creature_scale));
|
||||||
|
|
||||||
if(WDIM == 3) V("HTW", fts(vid.height_width));
|
if(WDIM == 3) V("HTW", fts(vid.height_width));
|
||||||
|
|
||||||
|
|
52
graph.cpp
52
graph.cpp
|
@ -769,11 +769,12 @@ EX shiftmatrix face_the_player(const shiftmatrix V) {
|
||||||
if(nonisotropic) return shiftless(spin_towards(unshift(V), dummy, C0, 2, 0));
|
if(nonisotropic) return shiftless(spin_towards(unshift(V), dummy, C0, 2, 0));
|
||||||
#if CAP_VR
|
#if CAP_VR
|
||||||
if(vrhr::enabled) {
|
if(vrhr::enabled) {
|
||||||
shiftpoint h = tC0(V);
|
shiftpoint h = tC0(V);
|
||||||
hyperpoint uh = unshift(h);
|
hyperpoint uh = unshift(h);
|
||||||
return shiftless(cspin90(1, 2) * lrspintox(cspin90(2, 1) * uh) * xpush(hdist0(uh)) * cspin90(0, 2) * spin270());
|
return shiftless(cspin90(1, 2) * rspintox(cspin90(2, 1) * uh) * xpush(hdist0(uh)) * cspin90(0, 2) * spin270());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return rgpushxto0(tC0(V));
|
return rgpushxto0(tC0(V));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -852,6 +853,35 @@ EX void draw_ascii(const shiftmatrix& V, char glyph, color_t col, ld size) {
|
||||||
while(id < isize(ptds)) ptds[id++]->prio = PPR::MONSTER_BODY;
|
while(id < isize(ptds)) ptds[id++]->prio = PPR::MONSTER_BODY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EX void queue_goal_text(shiftpoint P1, ld sizemul, const string& s, color_t color) {
|
||||||
|
#if CAP_VR
|
||||||
|
if(vrhr::enabled) {
|
||||||
|
auto e = inverse_exp(P1);
|
||||||
|
e = e * 3 / hypot_d(GDIM, e);
|
||||||
|
auto T = face_the_player(shiftless(rgpushxto0(direct_exp(e))));
|
||||||
|
queuestrn(T, sizemul * mapfontscale / 100, s, color);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
queuestr(P1, vid.fsize * sizemul, s, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
EX bool mark_compass(cell *c, shiftpoint& P1) {
|
||||||
|
cell *c1 = c ? findcompass(c) : NULL;
|
||||||
|
if(!c1) return false;
|
||||||
|
|
||||||
|
shiftmatrix P = ggmatrix(c1);
|
||||||
|
P1 = tC0(P);
|
||||||
|
|
||||||
|
if(isPlayerOn(c)) {
|
||||||
|
queue_goal_text(P1, 2, "X", 0x10100 * int(128 + 100 * sintick(150)));
|
||||||
|
// queuestr(V, 1, its(compassDist(c)), 0x10101 * int(128 - 100 * sin(ticks / 150.)), 1);
|
||||||
|
queue_goal_text(P1, 1, its(-compassDist(c)), 0x10101 * int(128 - 100 * sintick(150)));
|
||||||
|
addauraspecial(P1, 0xFF0000, 0);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
EX bool drawItemType(eItem it, cell *c, const shiftmatrix& V, color_t icol, int pticks, bool hidden) {
|
EX bool drawItemType(eItem it, cell *c, const shiftmatrix& V, color_t icol, int pticks, bool hidden) {
|
||||||
if(!it) return false;
|
if(!it) return false;
|
||||||
char xch = iinf[it].glyph;
|
char xch = iinf[it].glyph;
|
||||||
|
@ -953,18 +983,8 @@ EX bool drawItemType(eItem it, cell *c, const shiftmatrix& V, color_t icol, int
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
if(1) {
|
if(1) {
|
||||||
cell *c1 = c ? findcompass(c) : NULL;
|
shiftpoint P1;
|
||||||
if(c1) {
|
if(mark_compass(c, P1)) {
|
||||||
shiftmatrix P = ggmatrix(c1);
|
|
||||||
shiftpoint P1 = tC0(P);
|
|
||||||
|
|
||||||
if(isPlayerOn(c)) {
|
|
||||||
queuestr(P1, 2*vid.fsize, "X", 0x10100 * int(128 + 100 * sintick(150)));
|
|
||||||
// queuestr(V, 1, its(compassDist(c)), 0x10101 * int(128 - 100 * sin(ticks / 150.)), 1);
|
|
||||||
queuestr(P1, vid.fsize, its(-compassDist(c)), 0x10101 * int(128 - 100 * sintick(150)));
|
|
||||||
addauraspecial(P1, 0xFF0000, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
V2 = V * lrspintox(inverse_shift(V, P1));
|
V2 = V * lrspintox(inverse_shift(V, P1));
|
||||||
}
|
}
|
||||||
else V2 = V;
|
else V2 = V;
|
||||||
|
@ -4786,7 +4806,7 @@ EX void drawMarkers() {
|
||||||
}
|
}
|
||||||
shiftpoint H = tC0(ggmatrix(keycell));
|
shiftpoint H = tC0(ggmatrix(keycell));
|
||||||
#if CAP_QUEUE
|
#if CAP_QUEUE
|
||||||
queuestr(H, 2*vid.fsize, "X", 0x10101 * int(128 + 100 * sintick(150)));
|
queue_goal_text(H, 2, "X", 0x10101 * int(128 + 100 * sintick(150)));
|
||||||
int cd = celldistance(yi[yii].key(), cwt.at);
|
int cd = celldistance(yi[yii].key(), cwt.at);
|
||||||
if(cd == DISTANCE_UNKNOWN) for(int i2 = 0; i2<YDIST; i2++) {
|
if(cd == DISTANCE_UNKNOWN) for(int i2 = 0; i2<YDIST; i2++) {
|
||||||
int cd2 = celldistance(cwt.at, yi[yii].path[i2]);
|
int cd2 = celldistance(cwt.at, yi[yii].path[i2]);
|
||||||
|
@ -4795,7 +4815,7 @@ EX void drawMarkers() {
|
||||||
println(hlog, "i2 = ", i2, " cd = ", celldistance(cwt.at, keycell));
|
println(hlog, "i2 = ", i2, " cd = ", celldistance(cwt.at, keycell));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
queuestr(H, vid.fsize, its(cd), 0x10101 * int(128 - 100 * sintick(150)));
|
queue_goal_text(H, 1, its(cd), 0x10101 * int(128 - 100 * sintick(150)));
|
||||||
#endif
|
#endif
|
||||||
addauraspecial(H, iinf[itOrbYendor].color, 0);
|
addauraspecial(H, iinf[itOrbYendor].color, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -144,7 +144,10 @@ template<class T, class U> void hread(hstream& hs, map<T,U>& a) {
|
||||||
template<class C, class C1, class... CS> void hwrite(hstream& hs, const C& c, const C1& c1, const CS&... cs) { hwrite(hs, c); hwrite(hs, c1, cs...); }
|
template<class C, class C1, class... CS> void hwrite(hstream& hs, const C& c, const C1& c1, const CS&... cs) { hwrite(hs, c); hwrite(hs, c1, cs...); }
|
||||||
template<class C, class C1, class... CS> void hread(hstream& hs, C& c, C1& c1, CS&... cs) { hread(hs, c); hread(hs, c1, cs...); }
|
template<class C, class C1, class... CS> void hread(hstream& hs, C& c, C1& c1, CS&... cs) { hread(hs, c); hread(hs, c1, cs...); }
|
||||||
|
|
||||||
struct hstream_exception : hr_exception {};
|
struct hstream_exception : hr_exception {
|
||||||
|
hstream_exception() : hr_exception("hstream_exception") {}
|
||||||
|
hstream_exception(const std::string &s) : hr_exception(s) {}
|
||||||
|
};
|
||||||
|
|
||||||
struct fhstream : hstream {
|
struct fhstream : hstream {
|
||||||
FILE *f;
|
FILE *f;
|
||||||
|
|
4
hyper.h
4
hyper.h
|
@ -13,8 +13,8 @@
|
||||||
#define _HYPER_H_
|
#define _HYPER_H_
|
||||||
|
|
||||||
// version numbers
|
// version numbers
|
||||||
#define VER "13.0c"
|
#define VER "13.0d"
|
||||||
#define VERNUM_HEX 0xAA03
|
#define VERNUM_HEX 0xAA04
|
||||||
|
|
||||||
#include "sysconfig.h"
|
#include "sysconfig.h"
|
||||||
|
|
||||||
|
|
|
@ -770,7 +770,7 @@ EX int celldist(cell *c, bool alts) {
|
||||||
return hi.celldists[alts][cells[cellindex[c]].localindex];
|
return hi.celldists[alts][cells[cellindex[c]].localindex];
|
||||||
}
|
}
|
||||||
|
|
||||||
eGeometry orig_geometry;
|
eGeometry orig_geometry, base_geometry;
|
||||||
|
|
||||||
void start_game_on_created_map() {
|
void start_game_on_created_map() {
|
||||||
popScreen();
|
popScreen();
|
||||||
|
@ -807,6 +807,32 @@ bool save_map(const string& fname) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EX void save_map_bin(hstream& f) {
|
||||||
|
if(!base) { f.write<short>(-1); return; }
|
||||||
|
auto& all = base->allcells();
|
||||||
|
int origcells = 0;
|
||||||
|
for(cellinfo& ci: cells)
|
||||||
|
if(ci.generation == 0)
|
||||||
|
origcells++;
|
||||||
|
f.write<short> (base_geometry);
|
||||||
|
f.write<short> (isize(all));
|
||||||
|
f.write<short> (origcells);
|
||||||
|
|
||||||
|
for(auto h: all) {
|
||||||
|
origcells = 0;
|
||||||
|
for(auto i: cells_of_heptagon[h->master])
|
||||||
|
if(cells[i].generation == 0)
|
||||||
|
origcells++;
|
||||||
|
f.write<short> (origcells);
|
||||||
|
for(auto i: cells_of_heptagon[h->master]) if(cells[i].generation == 0) {
|
||||||
|
auto &ci = cells[i];
|
||||||
|
f.write<ld>(ci.p[0]);
|
||||||
|
f.write<ld>(ci.p[1]);
|
||||||
|
f.write<ld>(ci.p[LDIM]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool load_map(const string &fname) {
|
bool load_map(const string &fname) {
|
||||||
fhstream f(fname, "rt");
|
fhstream f(fname, "rt");
|
||||||
if(!f.f) return false;
|
if(!f.f) return false;
|
||||||
|
@ -839,6 +865,48 @@ bool load_map(const string &fname) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EX void load_map_bin(hstream& f) {
|
||||||
|
auto& all = base->allcells();
|
||||||
|
eGeometry g = (eGeometry) f.get<short>();
|
||||||
|
if(int(g) == -1) return;
|
||||||
|
int sa = f.get<short>();
|
||||||
|
cellcount = f.get<short>();
|
||||||
|
|
||||||
|
if(g != geometry) throw hstream_exception("bad geometry");
|
||||||
|
if(sa != isize(all)) throw hstream_exception("bad size of all");
|
||||||
|
density = cellcount * 1. / isize(all);
|
||||||
|
|
||||||
|
cells.clear();
|
||||||
|
|
||||||
|
for(auto h: all) {
|
||||||
|
int q = f.get<short>();
|
||||||
|
if(q < 0 || q > cellcount) throw hstream_exception("incorrect quantity");
|
||||||
|
while(q--) {
|
||||||
|
cells.emplace_back();
|
||||||
|
cellinfo& s = cells.back();
|
||||||
|
s.patterndir = -1;
|
||||||
|
double a, b, c;
|
||||||
|
a = f.get<ld>();
|
||||||
|
b = f.get<ld>();
|
||||||
|
c = f.get<ld>();
|
||||||
|
s.p = hpxyz(a, b, c);
|
||||||
|
s.p = normalize(s.p);
|
||||||
|
for(auto c0: all) s.relmatrices[c0] = calc_relative_matrix(c0, h, s.p);
|
||||||
|
s.owner = h;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
make_cells_of_heptagon();
|
||||||
|
runlevel = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
EX void load_map_full(hstream& f) {
|
||||||
|
init();
|
||||||
|
load_map_bin(f);
|
||||||
|
while(runlevel < 10) step(1000);
|
||||||
|
start_game_on_created_map();
|
||||||
|
}
|
||||||
|
|
||||||
void cancel_map_creation() {
|
void cancel_map_creation() {
|
||||||
base = NULL;
|
base = NULL;
|
||||||
runlevel = 0;
|
runlevel = 0;
|
||||||
|
@ -950,7 +1018,7 @@ void show_gridmaker() {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
EX void visual_creator() {
|
EX void init() {
|
||||||
stop_game();
|
stop_game();
|
||||||
orig_geometry = geometry;
|
orig_geometry = geometry;
|
||||||
switch(geometry) {
|
switch(geometry) {
|
||||||
|
@ -966,13 +1034,19 @@ EX void visual_creator() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
base_geometry = geometry;
|
||||||
variation = eVariation::pure;
|
variation = eVariation::pure;
|
||||||
start_game();
|
start_game();
|
||||||
if(base) delete base;
|
if(base) delete base;
|
||||||
base = currentmap;
|
base = currentmap;
|
||||||
base_config = euc::eu;
|
base_config = euc::eu;
|
||||||
drawthemap();
|
|
||||||
cellcount = int(isize(base->allcells()) * density + .5);
|
cellcount = int(isize(base->allcells()) * density + .5);
|
||||||
|
gridmaking = true;
|
||||||
|
drawthemap();
|
||||||
|
}
|
||||||
|
|
||||||
|
EX void visual_creator() {
|
||||||
|
init();
|
||||||
pushScreen(show_gridmaker);
|
pushScreen(show_gridmaker);
|
||||||
runlevel = 0;
|
runlevel = 0;
|
||||||
gridmaking = true;
|
gridmaking = true;
|
||||||
|
@ -1015,7 +1089,7 @@ int readArgs() {
|
||||||
else if(argis("-irrload")) {
|
else if(argis("-irrload")) {
|
||||||
PHASE(3);
|
PHASE(3);
|
||||||
restart_game();
|
restart_game();
|
||||||
visual_creator();
|
init();
|
||||||
showstartmenu = false;
|
showstartmenu = false;
|
||||||
shift();
|
shift();
|
||||||
load_map(args());
|
load_map(args());
|
||||||
|
|
|
@ -2913,7 +2913,6 @@ EX void set_land_for_geometry(cell *c) {
|
||||||
if(landscape_div < 0) landscape_div = 1;
|
if(landscape_div < 0) landscape_div = 1;
|
||||||
array<int, 3> a;
|
array<int, 3> a;
|
||||||
for(int i=0; i<3; i++) a[i] = getCdata(c, i);
|
for(int i=0; i<3; i++) a[i] = getCdata(c, i);
|
||||||
auto ca = a;
|
|
||||||
auto& ld = landscape_div;
|
auto& ld = landscape_div;
|
||||||
auto ld2 = ld * 2;
|
auto ld2 = ld * 2;
|
||||||
int sh = 0;
|
int sh = 0;
|
||||||
|
@ -2927,7 +2926,7 @@ EX void set_land_for_geometry(cell *c) {
|
||||||
if(sh * 2 < ld * 3) a[i] = gdiv(a[i], ld2)*2+1;
|
if(sh * 2 < ld * 3) a[i] = gdiv(a[i], ld2)*2+1;
|
||||||
else a[i] = gdiv(a[i]+ld, ld2)*2;
|
else a[i] = gdiv(a[i]+ld, ld2)*2;
|
||||||
}
|
}
|
||||||
eLand& l = landscape_lands[{a[0], a[1], a[2]}];
|
eLand& l = landscape_lands[make_array(a[0], a[1], a[2])];
|
||||||
if(l == laNone) l = random_land();
|
if(l == laNone) l = random_land();
|
||||||
setland(c, l);
|
setland(c, l);
|
||||||
return;
|
return;
|
||||||
|
|
12
landlock.cpp
12
landlock.cpp
|
@ -826,7 +826,7 @@ EX const int walls_when = 388;
|
||||||
EX void mark_tamper() { cheater++; }
|
EX void mark_tamper() { cheater++; }
|
||||||
|
|
||||||
EX void customize_land_in_list(eLand l) {
|
EX void customize_land_in_list(eLand l) {
|
||||||
cmode = sm::DARKEN; gamescreen();
|
cmode = sm::SIDE | sm::MAYDARK; gamescreen();
|
||||||
|
|
||||||
dialog::init(XLATN(linf[l].name), linf[l].color);
|
dialog::init(XLATN(linf[l].name), linf[l].color);
|
||||||
|
|
||||||
|
@ -859,12 +859,20 @@ EX void customize_land_in_list(eLand l) {
|
||||||
dialog::get_ne().reaction = mark_tamper;
|
dialog::get_ne().reaction = mark_tamper;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
gen_landvisited();
|
||||||
|
if(landvisited[l]) {
|
||||||
|
dialog::addItem(XLAT("test"), 'T');
|
||||||
|
dialog::add_action([l] {
|
||||||
|
stop_game(); firstland = specialland = l; start_game();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
dialog::addBack();
|
dialog::addBack();
|
||||||
dialog::display();
|
dialog::display();
|
||||||
}
|
}
|
||||||
|
|
||||||
EX void customize_land_list() {
|
EX void customize_land_list() {
|
||||||
cmode = sm::DARKEN; gamescreen();
|
cmode = sm::SIDE | sm::MAYDARK; gamescreen();
|
||||||
dialog::init(XLAT("custom land list"));
|
dialog::init(XLAT("custom land list"));
|
||||||
if(dialog::infix != "") mouseovers = dialog::infix;
|
if(dialog::infix != "") mouseovers = dialog::infix;
|
||||||
|
|
||||||
|
|
|
@ -491,6 +491,9 @@ EX namespace mapstream {
|
||||||
f.write(gp::param.second);
|
f.write(gp::param.second);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if CAP_IRR
|
||||||
|
if(IRREGULAR) irr::save_map_bin(f);
|
||||||
|
#endif
|
||||||
#if MAXMDIM >= 4
|
#if MAXMDIM >= 4
|
||||||
if(variation == eVariation::coxeter) {
|
if(variation == eVariation::coxeter) {
|
||||||
f.write(reg3::coxeter_param);
|
f.write(reg3::coxeter_param);
|
||||||
|
@ -587,6 +590,9 @@ EX namespace mapstream {
|
||||||
f.read(gp::param.second);
|
f.read(gp::param.second);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if CAP_IRR
|
||||||
|
if(IRREGULAR) { irr::load_map_full(f); stop_game(); }
|
||||||
|
#endif
|
||||||
#if MAXMDIM >= 4
|
#if MAXMDIM >= 4
|
||||||
if(variation == eVariation::coxeter && vernum >= 0xA908) {
|
if(variation == eVariation::coxeter && vernum >= 0xA908) {
|
||||||
f.read(reg3::coxeter_param);
|
f.read(reg3::coxeter_param);
|
||||||
|
|
|
@ -821,7 +821,8 @@ EX void handleInput(int delta, config &scfg) {
|
||||||
get_actions(scfg);
|
get_actions(scfg);
|
||||||
|
|
||||||
const Uint8 *keystate = SDL12_GetKeyState(NULL);
|
const Uint8 *keystate = SDL12_GetKeyState(NULL);
|
||||||
if(keystate[SDLK_LCTRL] || keystate[SDLK_RCTRL]) d /= 5;
|
|
||||||
|
if(keystate[SDL12(SDLK_LCTRL, SDL_SCANCODE_LCTRL)] || keystate[SDL12(SDLK_RCTRL, SDL_SCANCODE_RCTRL)]) d /= 5;
|
||||||
|
|
||||||
double panx =
|
double panx =
|
||||||
actionspressed[49] - actionspressed[51] + axespressed[2] / 32000.0;
|
actionspressed[49] - actionspressed[51] + axespressed[2] / 32000.0;
|
||||||
|
|
28
system.cpp
28
system.cpp
|
@ -1763,7 +1763,7 @@ EX void initAll() {
|
||||||
#if CAP_SAVE
|
#if CAP_SAVE
|
||||||
select_savefile();
|
select_savefile();
|
||||||
loadsave();
|
loadsave();
|
||||||
if(IRREGULAR) irr::auto_creator();
|
if(IRREGULAR && !irr::base) irr::auto_creator();
|
||||||
#endif
|
#endif
|
||||||
start_game();
|
start_game();
|
||||||
restore_all_golems();
|
restore_all_golems();
|
||||||
|
@ -1792,6 +1792,10 @@ EX void finishAll() {
|
||||||
|
|
||||||
string modheader = "# HyperRogue saved game mode file";
|
string modheader = "# HyperRogue saved game mode file";
|
||||||
|
|
||||||
|
set<string> allowed_params = {
|
||||||
|
"creature_scale", "global_boundary_ratio", "specialland"
|
||||||
|
};
|
||||||
|
|
||||||
EX void save_mode_to_file(const string& fname) {
|
EX void save_mode_to_file(const string& fname) {
|
||||||
shstream ss;
|
shstream ss;
|
||||||
save_mode_data(ss);
|
save_mode_data(ss);
|
||||||
|
@ -1801,6 +1805,12 @@ EX void save_mode_to_file(const string& fname) {
|
||||||
println(f, modheader);
|
println(f, modheader);
|
||||||
println(f, s);
|
println(f, s);
|
||||||
if(custom_welcome != "") println(f, "CMSG ", custom_welcome);
|
if(custom_welcome != "") println(f, "CMSG ", custom_welcome);
|
||||||
|
|
||||||
|
for(auto& ap: allowed_params) {
|
||||||
|
auto& s = params[ap]->saver;
|
||||||
|
if(s->dosave())
|
||||||
|
println(f, ap, "=", s->save());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EX void load_mode_from_file(const string& fname) {
|
EX void load_mode_from_file(const string& fname) {
|
||||||
|
@ -1813,9 +1823,21 @@ EX void load_mode_from_file(const string& fname) {
|
||||||
ss.s = from_hexstring(hex + "00");
|
ss.s = from_hexstring(hex + "00");
|
||||||
custom_welcome = "";
|
custom_welcome = "";
|
||||||
while(true) {
|
while(true) {
|
||||||
string s = scanline(f);
|
string s = scanline_noblank(f);
|
||||||
if(s == "") break;
|
if(s == "") break;
|
||||||
if(s.substr(0, 5) == "CMSG ") custom_welcome = s.substr(5);
|
else if(s.substr(0, 5) == "CMSG ") custom_welcome = s.substr(5);
|
||||||
|
else {
|
||||||
|
auto pos = s.find("=");
|
||||||
|
if(pos != string::npos) {
|
||||||
|
string name = s.substr(0, pos);
|
||||||
|
string value = s.substr(pos+1);
|
||||||
|
if(!params.count(name) || !allowed_params.count(name)) {
|
||||||
|
println(hlog, "# parameter unknown: ", name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
params[name]->load_as_animation(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
stop_game();
|
stop_game();
|
||||||
load_mode_data_with_zero(ss);
|
load_mode_data_with_zero(ss);
|
||||||
|
|
|
@ -1008,6 +1008,10 @@ EX void save_mode_data(hstream& f) {
|
||||||
f.write<char>(6);
|
f.write<char>(6);
|
||||||
f.write<int>(landscape_div);
|
f.write<int>(landscape_div);
|
||||||
}
|
}
|
||||||
|
if(shmup::on && vid.creature_scale != 1) {
|
||||||
|
f.write<char>(7);
|
||||||
|
f.write<ld>(vid.creature_scale);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EX void load_mode_data_with_zero(hstream& f) {
|
EX void load_mode_data_with_zero(hstream& f) {
|
||||||
|
@ -1028,6 +1032,7 @@ EX void load_mode_data_with_zero(hstream& f) {
|
||||||
xcheat = f.get<char>();
|
xcheat = f.get<char>();
|
||||||
casual = false;
|
casual = false;
|
||||||
bow::weapon = bow::wBlade;
|
bow::weapon = bow::wBlade;
|
||||||
|
if(shmup::on) vid.creature_scale = 1;
|
||||||
|
|
||||||
while(true) {
|
while(true) {
|
||||||
char option = f.get<char>();
|
char option = f.get<char>();
|
||||||
|
@ -1070,6 +1075,9 @@ EX void load_mode_data_with_zero(hstream& f) {
|
||||||
landscape_div = f.get<int>();
|
landscape_div = f.get<int>();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 7:
|
||||||
|
vid.creature_scale = f.get<ld>();
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw hstream_exception();
|
throw hstream_exception();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue