From bba0e5138e23b40258d36e4f878aafe7acde2ae6 Mon Sep 17 00:00:00 2001 From: ? Date: Mon, 25 Feb 2019 14:51:51 +0100 Subject: [PATCH] 3d:: shmup mode now works as a fps --- hypgraph.cpp | 5 +++++ shmup.cpp | 39 ++++++++++++++++++++++++++++++--------- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/hypgraph.cpp b/hypgraph.cpp index 127bdb46..7839ae4d 100644 --- a/hypgraph.cpp +++ b/hypgraph.cpp @@ -1037,6 +1037,11 @@ void centerpc(ld aspd) { if(geometry == gCrystal) crystal::centerrug(aspd); #endif + + if(shmup::on && DIM == 3) { + transmatrix at = cpush(2, -vid.yshift) * ggmatrix(shmup::pc[0]->base) * shmup::pc[0]->at; + View = inverse(at) * View; + } #if CAP_RACING if(racing::on && !racing::standard_centering) { diff --git a/shmup.cpp b/shmup.cpp index ffa0016a..db2980ce 100644 --- a/shmup.cpp +++ b/shmup.cpp @@ -728,6 +728,8 @@ void handleInput(int delta) { double panspin = actionspressed[52] - actionspressed[53] + axespressed[1] / 20000.0; + double panmove = actionspressed[59] - actionspressed[60] + axespressed[4] / 20000.0; + if(actionspressed[54]) { centerplayer = -1, playermoved = true; centerpc(100); } if(actionspressed[55] && !lactionpressed[55]) @@ -744,8 +746,11 @@ void handleInput(int delta) { if(actionspressed[58] && !lactionpressed[58]) pushScreen(showMainMenu); - if(panx || pany || panspin) { - View = xpush(-panx * d) * ypush(-pany * d) * spin(panspin * d) * View; + if(panx || pany || panspin || (DIM == 3 && panmove)) { + if(DIM == 2) + View = xpush(-panx * d) * ypush(-pany * d) * spin(panspin * d) * View; + else + View = cspin(0, 2, panx) * cspin(0, 1, pany) * spin(panspin * d) * cpush(2, panmove) * View; playermoved = false; } #endif @@ -1176,7 +1181,7 @@ void degradeDemons() { } // we need these for the Mimics! -double playerturn[MAXPLAYER], playergo[MAXPLAYER]; +double playerturn[MAXPLAYER], playergo[MAXPLAYER], playerstrafe[MAXPLAYER], playerturny[MAXPLAYER]; bool playerfire[MAXPLAYER]; void awakenMimics(monster *m, cell *c2) { @@ -1538,7 +1543,6 @@ void movePlayer(monster *m, int delta) { #endif double mturn = 0, mgo = 0, mdx = 0, mdy = 0; - ignore(mdx); ignore(mdy); bool shotkey = false, dropgreen = false, facemouse = false; if(facemouse) { @@ -1546,7 +1550,7 @@ void movePlayer(monster *m, int delta) { } int b = 16*tableid[cpid]; - for(int i=0; i<8; i++) if(actionspressed[b+i]) playermoved = true; + for(int i=0; i<(DIM == 3 ? 4 : 8); i++) if(actionspressed[b+i]) playermoved = true; int jb = 4*tableid[cpid]; for(int i=0; i<4; i++) if(axespressed[jb+i]) playermoved = true; @@ -1654,7 +1658,7 @@ void movePlayer(monster *m, int delta) { bool blown = m->blowoff > curtime; - if(playerturn[cpid] && canmove && !blown) { + if(playerturn[cpid] && canmove && !blown && DIM == 2) { m->swordangle -= playerturn[cpid]; nat = nat * spin(playerturn[cpid]); } @@ -1683,6 +1687,12 @@ void movePlayer(monster *m, int delta) { playergo[cpid] = mgo * SCALE * delta / 600; } + if(DIM == 3) { + playerstrafe[cpid] = mturn * SCALE * delta / 600; + playerturn[cpid] = mdx * SCALE * delta / 600; + playerturny[cpid] = mdy * SCALE * delta / 600; + } + if(playergo[cpid] && markOrb(itOrbDash)) playergo[cpid] *= 1.5; bool go = false; @@ -1710,7 +1720,9 @@ void movePlayer(monster *m, int delta) { go = true; - if(playergo[cpid]) + if(DIM == 3) + nat = nat1 * cpush(0, playerstrafe[cpid]) * cpush(2, playergo[cpid]) * cspin(0, 2, playerturn[cpid]) * cspin(1, 2, playerturny[cpid]); + else if(playergo[cpid]) nat = nat1 * spin(igospan[igo]) * xpush(playergo[cpid]) * spin(-igospan[igo]); // spin(span[igo]) * xpush(playergo[cpid]) * spin(-span[igo]); @@ -2208,6 +2220,11 @@ int speedfactor() { return items[itOrbSpeed]?2:1; } +transmatrix frontpush(ld x) { + if(DIM == 2) return xpush(x); + else return cpush(2, x); + } + void moveBullet(monster *m, int delta) { cpid = m->pid; m->findpat(); @@ -2241,7 +2258,7 @@ void moveBullet(monster *m, int delta) { if(m->isVirtual || !m->parent || intval(nat*C0, m->parent->pat*C0) > SCALE2 * 0.4) m->dead = true; } - nat = nat * xpush(delta * SCALE * m->vel / speedfactor()); + nat = nat * frontpush(delta * SCALE * m->vel / speedfactor()); cell *c2 = m->findbase(nat); if(m->parent && isPlayer(m->parent) && markOrb(itOrbLava) && c2 != m->base && !isPlayerOn(m->base)) @@ -3370,6 +3387,7 @@ bool drawMonster(const transmatrix& V, cell *c, const transmatrix*& Vboat, trans switch(m->type) { case moPlayer: playerfound = true; + if(playermoved && DIM == 3) continue; cpid = m->pid; drawPlayerEffects(view, c, true); if(m->inBoat) m->footphase = 0; @@ -3442,7 +3460,10 @@ bool drawMonster(const transmatrix& V, cell *c, const transmatrix*& Vboat, trans if(hasHitpoints(m->type)) c->hitpoints = m->hitpoints; if(m->type == moTortoise) tortoise::emap[c] = getBits(m->torigin); - drawMonsterType(m->type, c, view, col, m->footphase); + if(DIM == 3) + drawMonsterType(m->type, c, view * cspin(0, 2, M_PI/2), col, m->footphase); + else + drawMonsterType(m->type, c, view, col, m->footphase); if(m->type == moTortoise) tortoise::emap.erase(c); break; }