1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-03-31 15:57:02 +00:00

racing:: track code can be changed

This commit is contained in:
Zeno Rogue 2018-11-24 22:50:35 +01:00
parent 8672b121b9
commit 6dd14a310f

@ -567,22 +567,23 @@ string racetimeformat(int t) {
return times; return times;
} }
void track_chooser() { void track_chooser(string new_track) {
dialog::init(XLAT("Racing")); dialog::init(XLAT("Racing"));
char let = 'a'; char let = 'a';
for(eLand l: race_lands) { for(eLand l: race_lands) {
auto& gh = race_ghosts[{track_code, modecode()}] [l]; auto& gh = race_ghosts[{new_track, modecode()}] [l];
const int LOST = 3600000; const int LOST = 3600000;
int best = LOST; int best = LOST;
for(auto& gc: gh) best = min(best, gc.result); for(auto& gc: gh) best = min(best, gc.result);
string s = (best == LOST) ? "" : racetimeformat(best); string s = (best == LOST) ? "" : racetimeformat(best);
dialog::addSelItem(XLAT1(linf[l].name), s, let++); dialog::addSelItem(XLAT1(linf[l].name), s, let++);
dialog::add_action([l] () { dialog::add_action([l, new_track] () {
stop_game(); stop_game();
specialland = l; specialland = l;
racing::on = true; racing::on = true;
shmup::on = true; shmup::on = true;
track_code = new_track;
start_game(); start_game();
popScreenAll(); popScreenAll();
}); });
@ -595,8 +596,29 @@ void track_chooser() {
struct race_configurer { struct race_configurer {
int playercfg; int playercfg;
bool editing_track;
string new_track;
race_configurer() { playercfg = multi::players; } race_configurer() { editing_track = false; new_track = track_code; playercfg = multi::players; }
static string random_track_name() {
string s = "";
for(int a = 0; a < 4; a++) {
int u = rand() % 2;
if(u == 0)
s += "AEIOUY" [ rand() % 6];
s += "BCDFGHJKLMNPRSTVWZ" [ rand() % 18];
if(u == 1)
s += "AEIOUY" [ rand() % 6];
}
return s;
}
static string racecheck(int sym, int uni) {
if(uni >= 'A' && uni <= 'Z') return string("") + char(uni);
if(uni >= 'a' && uni <= 'z') return string("") + char(uni - 32);
return "";
}
void operator() () { void operator() () {
@ -604,7 +626,7 @@ struct race_configurer {
dialog::init(XLAT("Racing")); dialog::init(XLAT("Racing"));
dialog::addBoolItem(XLAT("player relative"), player_relative, 'r'); dialog::addBoolItem(XLAT("player relative"), player_relative, 'p');
dialog::add_action([] () { dialog::add_action([] () {
player_relative = !player_relative; player_relative = !player_relative;
if(pmodel == mdBand || pmodel == mdHalfplane) if(pmodel == mdBand || pmodel == mdHalfplane)
@ -629,7 +651,7 @@ struct race_configurer {
dialog::addSelItem(XLAT("race angle"), fts(race_angle), 'a'); dialog::addSelItem(XLAT("race angle"), fts(race_angle), 'a');
dialog::add_action([] () { dialog::add_action([] () {
dialog::editNumber(race_angle, 0, 360, 15, 0, XLAT("spiral angle"), ""); dialog::editNumber(race_angle, 0, 360, 15, 0, XLAT("race angle"), "");
int q = conformal::model_orientation - race_angle; int q = conformal::model_orientation - race_angle;
dialog::reaction = [q] () { conformal::model_orientation = race_angle + q; }; dialog::reaction = [q] () { conformal::model_orientation = race_angle + q; };
}); });
@ -652,16 +674,35 @@ struct race_configurer {
} }
else dialog::addBreak(100); else dialog::addBreak(100);
dialog::addSelItem("track name", editing_track ? dialog::view_edited_string() : new_track, '/');
dialog::add_action([this] () {
editing_track = !editing_track;
if(editing_track) dialog::start_editing(new_track);
});
dialog::addItem("play the official track", 'o');
dialog::add_action([this] () { new_track = "OFFICIAL"; });
dialog::addItem("play a random track", 'r');
dialog::add_action([this] () { new_track = random_track_name(); });
dialog::addItem(XLAT("select the track and start!"), 's'); dialog::addItem(XLAT("select the track and start!"), 's');
dialog::add_action([] () { dialog::add_action([this] () {
if(race_ghosts[{track_code, modecode()}].empty()) if(race_ghosts[{new_track, modecode()}].empty())
read_ghosts(track_code, modecode()); read_ghosts(new_track, modecode());
pushScreen(track_chooser); pushScreen([this] () { track_chooser(new_track); });
}); });
dialog::addBack(); dialog::addBack();
dialog::display(); dialog::display();
keyhandler = [this] (int sym, int uni) {
if(editing_track) {
if(sym == SDLK_RETURN) sym = uni = '/';
if(dialog::handle_edit_string(sym, uni, racecheck)) return;
}
dialog::handleNavigation(sym, uni);
if(doexiton(sym, uni)) { if(editing_track) editing_track = false; else popScreen(); }
};
} }
}; };