mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-11-23 21:07:17 +00:00
racing:: more space on the start line
This commit is contained in:
parent
867efa3196
commit
82318e938f
64
racing.cpp
64
racing.cpp
@ -32,8 +32,10 @@ map<cell*, int> rti_id;
|
|||||||
|
|
||||||
string track_code = "OFFICIAL";
|
string track_code = "OFFICIAL";
|
||||||
|
|
||||||
|
int race_try;
|
||||||
|
|
||||||
void apply_seed() {
|
void apply_seed() {
|
||||||
int s = 0;
|
int s = race_try;
|
||||||
for(char c: track_code) s = 713 * s + c;
|
for(char c: track_code) s = 713 * s + c;
|
||||||
shrand(s);
|
shrand(s);
|
||||||
}
|
}
|
||||||
@ -161,6 +163,8 @@ race_cellinfo& get_info(cell *c) {
|
|||||||
return rti[rti_id.at(c)];
|
return rti[rti_id.at(c)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ld start_line_width;
|
||||||
|
|
||||||
void generate_track() {
|
void generate_track() {
|
||||||
|
|
||||||
if(race_ghosts[{track_code, modecode()}].empty())
|
if(race_ghosts[{track_code, modecode()}].empty())
|
||||||
@ -175,6 +179,12 @@ void generate_track() {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
cell *s = currentmap->gamestart();
|
cell *s = currentmap->gamestart();
|
||||||
|
|
||||||
|
if(specialland == laCrossroads) {
|
||||||
|
celllister cl(s, TWIDTH, 1000000, NULL);
|
||||||
|
for(cell *c: cl.lst) c->bardir = NOBARRIERS;
|
||||||
|
}
|
||||||
|
|
||||||
setdist(s, 6, NULL);
|
setdist(s, 6, NULL);
|
||||||
makeEmpty(s);
|
makeEmpty(s);
|
||||||
|
|
||||||
@ -185,12 +195,13 @@ void generate_track() {
|
|||||||
cell *goal;
|
cell *goal;
|
||||||
|
|
||||||
int traversed = 0;
|
int traversed = 0;
|
||||||
|
|
||||||
while(true) {
|
while(true) {
|
||||||
traversed++;
|
traversed++;
|
||||||
if(cellbydist.empty()) {
|
if(cellbydist.empty()) {
|
||||||
printf("reset after traversing %d\n", traversed);
|
printf("reset after traversing %d\n", traversed);
|
||||||
stop_game();
|
stop_game();
|
||||||
|
race_try++;
|
||||||
start_game();
|
start_game();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -342,7 +353,6 @@ void generate_track() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i=0; i<motypes; i++) kills[i] = 0;
|
|
||||||
int byat[256];
|
int byat[256];
|
||||||
for(int a=0; a<16; a++) byat[a] = 0;
|
for(int a=0; a<16; a++) byat[a] = 0;
|
||||||
for(const auto s: rti) byat[s.from_track]++;
|
for(const auto s: rti) byat[s.from_track]++;
|
||||||
@ -365,6 +375,46 @@ void generate_track() {
|
|||||||
hash.insert(hashval);
|
hash.insert(hashval);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(cell *sc: track) {
|
||||||
|
straight = calc_relative_matrix(sc, track[0], C0);
|
||||||
|
if(straight[2][2] > 1e8) break;
|
||||||
|
}
|
||||||
|
straight = rspintox(straight * C0);
|
||||||
|
|
||||||
|
ld& a = start_line_width;
|
||||||
|
for(a=0; a<10; a += .1) {
|
||||||
|
hyperpoint h = straight * parabolic1(a) * C0;
|
||||||
|
cell *at = s;
|
||||||
|
virtualRebase(at, h, true);
|
||||||
|
if(!rti_id.count(at) || get_info(at).from_track >= TWIDTH) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(ld cleaner=0; cleaner<a*.75; cleaner += .2) for(int dir=-1; dir<=1; dir+=2) {
|
||||||
|
transmatrix T = straight * parabolic1(cleaner * dir);
|
||||||
|
cell *at = s;
|
||||||
|
virtualRebase(at, T, true);
|
||||||
|
for(ld u=0; u<50; u++) {
|
||||||
|
if(at->wall != waBarrier)
|
||||||
|
makeEmpty(at);
|
||||||
|
killMonster(at, moNone, 0);
|
||||||
|
T = T * xpush(.1);
|
||||||
|
virtualRebase(at, T, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(auto s: rti) if(s.c->monst == moIvyDead) s.c->monst = moNone;
|
||||||
|
|
||||||
|
for(int i=0; i<motypes; i++) kills[i] = 0;
|
||||||
|
|
||||||
|
for(int i=0; i<multi::players; i++) {
|
||||||
|
auto who = shmup::pc[i];
|
||||||
|
// this is intentionally not hrand
|
||||||
|
who->at = straight * parabolic1(start_line_width * (rand() % 20000 - 10000) / 20000) * spin(rand() % 360);
|
||||||
|
who->base = s;
|
||||||
|
virtualRebase(who, true);
|
||||||
|
}
|
||||||
|
|
||||||
if(1) {
|
if(1) {
|
||||||
manual_celllister cl;
|
manual_celllister cl;
|
||||||
cl.add(s);
|
cl.add(s);
|
||||||
@ -380,6 +430,7 @@ void generate_track() {
|
|||||||
if(!goal) {
|
if(!goal) {
|
||||||
printf("error: goal unreachable\n");
|
printf("error: goal unreachable\n");
|
||||||
stop_game();
|
stop_game();
|
||||||
|
race_try++;
|
||||||
start_game();
|
start_game();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -708,6 +759,7 @@ struct race_configurer {
|
|||||||
dialog::add_action([] () {
|
dialog::add_action([] () {
|
||||||
stop_game();
|
stop_game();
|
||||||
switch_game_mode(rg::racing);
|
switch_game_mode(rg::racing);
|
||||||
|
race_try = 0;
|
||||||
start_game();
|
start_game();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -803,6 +855,12 @@ void markers() {
|
|||||||
dynamicval<charstyle> x(getcs(), ghost.cs);
|
dynamicval<charstyle> x(getcs(), ghost.cs);
|
||||||
drawMonsterType(moPlayer, w, gmatrix[w] * p->T, 0, p->footphase);
|
drawMonsterType(moPlayer, w, gmatrix[w] * p->T, 0, p->footphase);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(gmatrix.count(track[0])) {
|
||||||
|
for(ld z=-start_line_width; z<=start_line_width; z+=0.1)
|
||||||
|
curvepoint(ggmatrix(track[0]) * straight * parabolic1(z) * C0);
|
||||||
|
queuecurve(0xFFFFFFFF, 0, PPR::BFLOOR);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_percentage(int i) {
|
int get_percentage(int i) {
|
||||||
|
Loading…
Reference in New Issue
Block a user