aboutsummaryrefslogtreecommitdiff
path: root/muswd.c
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2023-02-22 21:40:54 +0000
committerrodri <rgl@antares-labs.eu>2023-02-22 21:40:54 +0000
commitd40305baf8a0722cf6128520a5b792fc173c5a93 (patch)
treed55310d984f0b94ee1e22edcbc6ba1eb1ce52c01 /muswd.c
parentecc7d34e9229524a8d4340f0e127f1421029141c (diff)
downloadmusw-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.c54
1 files changed, 41 insertions, 13 deletions
diff --git a/muswd.c b/muswd.c
index 602223b..cd268ca 100644
--- a/muswd.c
+++ b/muswd.c
@@ -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();