diff options
author | rodri <rgl@antares-labs.eu> | 2023-02-22 21:40:54 +0000 |
---|---|---|
committer | rodri <rgl@antares-labs.eu> | 2023-02-22 21:40:54 +0000 |
commit | d40305baf8a0722cf6128520a5b792fc173c5a93 (patch) | |
tree | d55310d984f0b94ee1e22edcbc6ba1eb1ce52c01 /muswd.c | |
parent | ecc7d34e9229524a8d4340f0e127f1421029141c (diff) | |
download | musw-d40305baf8a0722cf6128520a5b792fc173c5a93.tar.gz musw-d40305baf8a0722cf6128520a5b792fc173c5a93.tar.bz2 musw-d40305baf8a0722cf6128520a5b792fc173c5a93.zip |
take player input into account when stepping the simulations.
Diffstat (limited to 'muswd.c')
-rw-r--r-- | muswd.c | 54 |
1 files changed, 41 insertions, 13 deletions
@@ -42,26 +42,29 @@ getconn(Frame *f) return nil; } -/* TODO: this is an ugly hack. nc should probably reference the player back */ void -dissolveparty(NetConn *nc) +dissolveparty(Player *player) { int i; Party *p; - Player *player; + /* + * kick the player and put their adversary back in the + * queue, then dissolve the party + */ for(p = theparty.next; p != &theparty; p = p->next) for(i = 0; i < nelem(p->players); i++) - if(p->players[i]->conn == nc){ + if(p->players[i] == player){ delplayer(p->players[i]); players.put(&players, p->players[i^1]); delparty(p); } - /* also clean the player queue */ - for(player = players.head; player != nil; player = player->next) - if(player->conn == nc) - players.del(&players, player); + /* + * also clean the player queue + * TODO: has nothing to do with the party + */ + players.del(&players, player); } int @@ -75,7 +78,7 @@ popconn(NetConn *nc) if(*ncp == nc){ memmove(ncp, ncp+1, sizeof(NetConn*)*(ncpe-ncp-1)); nconns--; - dissolveparty(nc); /* TODO: ugly hack. */ + dissolveparty(nc->player); delnetconn(nc); return 0; } @@ -179,6 +182,7 @@ threadnetppu(void *) nc->state = NCSConnected; players.put(&players, newplayer(nil, nc)); + nc->player = players.tail; if(debug) fprint(2, "\trcvd pubkey %ld\n", nc->dh.pub); @@ -210,6 +214,9 @@ threadnetppu(void *) if(debug) fprint(2, "\t%.*lub\n", sizeof(kdown)*8, kdown); + nc->player->oldkdown = nc->player->kdown; + nc->player->kdown = kdown; + break; case NCbuhbye: popconn(nc); @@ -288,10 +295,13 @@ broadcaststate(void) void threadsim(void *) { + int i; uvlong then, now; double frametime, Δt; Ioproc *io; Party *p; + Player *player; + Ship *ship; Δt = 0.01; then = nanosec(); @@ -305,14 +315,32 @@ threadsim(void *) frametime = now - then; then = now; +partywalk: for(p = theparty.next; p != &theparty; p = p->next){ p->u->timeacc += frametime/1e9; - while(p->u->timeacc >= Δt){ - p->u->step(p->u, Δt); - p->u->timeacc -= Δt; - p->u->t += Δt; + for(i = 0; i < nelem(p->players); i++){ + player = p->players[i]; + ship = &p->u->ships[i]; + + if((player->kdown & 1<<Kquit) != 0){ + popconn(player->conn); + goto partywalk; + } + if((player->kdown & 1<<K↑) != 0) + ship->forward(ship, Δt); + if((player->kdown & 1<<K↺) != 0) + ship->rotate(ship, 1, Δt); + if((player->kdown & 1<<K↻) != 0) + ship->rotate(ship, -1, Δt); + if((player->kdown & 1<<Khyper) != 0) + ship->hyperjump(ship); + if((player->kdown & 1<<Kfire) != 0) + ship->fire(ship); } + + while(p->u->timeacc >= Δt) + p->u->step(p->u, Δt); } broadcaststate(); |