diff --git a/menus.cpp b/menus.cpp index 6ac45912..2df73efd 100644 --- a/menus.cpp +++ b/menus.cpp @@ -857,11 +857,6 @@ named_functionality get_o_key() { }); #endif - #if CAP_RACING - if(racing::on) - return named_dialog(XLAT("racing mode"), racing::show); - #endif - if(viewdists) return named_functionality(XLAT("geometry experiments"), runGeometryExperiments); diff --git a/racing.cpp b/racing.cpp index fc355429..fa7fa51f 100644 --- a/racing.cpp +++ b/racing.cpp @@ -383,43 +383,84 @@ vector race_lands = { laRuins, }; -void show() { - dialog::init(XLAT("Racing")); +vector playercmds_race = { + "forward", "backward", "turn left", "turn right", + "forward", "backward", "turn left", "turn right", + "", "", "", + "", "change camera", "", "" + }; - dialog::addBoolItem(XLAT("player relative"), player_relative, 'r'); - dialog::add_action([] () { - player_relative = !player_relative; - if(pmodel == mdBand || pmodel == mdHalfplane) - pmodel = mdDisk; - }); +struct race_configurer { - dialog::addSelItem(XLAT("projection"), conformal::get_model_name(pmodel), 'm'); - dialog::add_action([] () { - switch(pmodel) { - case mdDisk: - pmodel = mdBand; - conformal::model_orientation = race_angle; - break; - case mdBand: - pmodel = mdHalfplane; - conformal::model_orientation = race_angle + 90; - break; - default: - pmodel = mdDisk; - } - }); - - dialog::addSelItem(XLAT("race angle"), fts(race_angle), 'm'); - dialog::add_action([] () { - dialog::editNumber(race_angle, 0, 360, 15, 0, XLAT("spiral angle"), ""); - int q = conformal::model_orientation - race_angle; - dialog::reaction = [q] () { conformal::model_orientation = race_angle + q; }; - }); - - dialog::addBack(); - dialog::display(); + int playercfg; - } + race_configurer() { playercfg = multi::players; } + + void operator() () { + + gamescreen(1); + + dialog::init(XLAT("Racing")); + + dialog::addBoolItem(XLAT("player relative"), player_relative, 'r'); + dialog::add_action([] () { + player_relative = !player_relative; + if(pmodel == mdBand || pmodel == mdHalfplane) + pmodel = mdDisk; + }); + + dialog::addSelItem(XLAT("projection"), conformal::get_model_name(pmodel), 'm'); + dialog::add_action([] () { + switch(pmodel) { + case mdDisk: + pmodel = mdBand; + conformal::model_orientation = race_angle; + break; + case mdBand: + pmodel = mdHalfplane; + conformal::model_orientation = race_angle + 90; + break; + default: + pmodel = mdDisk; + } + }); + + dialog::addSelItem(XLAT("race angle"), fts(race_angle), 'a'); + dialog::add_action([] () { + dialog::editNumber(race_angle, 0, 360, 15, 0, XLAT("spiral angle"), ""); + int q = conformal::model_orientation - race_angle; + dialog::reaction = [q] () { conformal::model_orientation = race_angle + q; }; + }); + + dialog::addItem(shmup::player_count_name(playercfg), 'n'); + dialog::add_action([this] () { + playercfg = playercfg == 1 ? 2 : 1; + }); + + dialog::addItem(XLAT("configure player 1"), '1'); + dialog::add_action([] () { + pushScreen(shmup::key_configurer(1, playercmds_race)); + }); + + if(playercfg >= 2) { + dialog::addItem(XLAT("configure player 2"), '2'); + dialog::add_action([] () { + pushScreen(shmup::key_configurer(2, playercmds_race)); + }); + } + else dialog::addBreak(100); + + dialog::addBack(); + dialog::display(); + + } + }; + +auto hooks1 = + addHook(hooks_o_key, 90, [] { + if(racing::on) return named_dialog("race mode", race_configurer()); + else return named_functionality(); + }); vector player_displays; bool in_subscreen; diff --git a/shmup.cpp b/shmup.cpp index df83b8b4..24305a7b 100644 --- a/shmup.cpp +++ b/shmup.cpp @@ -1556,9 +1556,15 @@ void movePlayer(monster *m, int delta) { else #endif keyresult[cpid] = itNone; - + if(actionspressed[b+pcCenter]) { - centerplayer = cpid; centerpc(100); playermoved = true; + if(!racing::on) { + centerplayer = cpid; centerpc(100); playermoved = true; + } + #if CAP_RACING + if(racing::on) + racing::player_relative = !racing::player_relative; + #endif } transmatrix nat = m->pat; @@ -1573,6 +1579,7 @@ void movePlayer(monster *m, int delta) { if(abs(mdy) > abs(mgo)) mgo = -mdy; if(abs(mdx) > abs(mturn)) mturn = -mdx; mdx = mdy = 0; + facemouse = shotkey = dropgreen = false; } #endif