diff --git a/src/network.c b/src/network.c index a8df7ba..c175695 100644 --- a/src/network.c +++ b/src/network.c @@ -1,4 +1,4 @@ -/* $Id: network.c,v 1.39 2003/08/10 15:10:19 stpohle Exp $ */ +/* $Id: network.c,v 1.40 2003/08/24 19:52:08 stpohle Exp $ */ /* network routines. */ @@ -340,6 +340,9 @@ draw_netupdatestate () font_draw (70, y, text, 0); text[0] = 0; + if (bman.players[i].net.net_istep == 3) + sprintf (text, "Getting Tunnel Data %d.", bman.players[i].net.net_status); + if (bman.players[i].net.net_istep == 2) sprintf (text, "Getting Field Data %d of %d.", bman.players[i].net.net_status, map.size.x); @@ -419,14 +422,14 @@ net_transmit_gamedata () for (x = 0; x < MAX_PLAYERS; x++) { bman.players[x].net.timestamp = 0; bman.players[x].net.net_status = -1; - bman.players[x].net.net_istep = 2; + bman.players[x].net.net_istep = 3; } y = -1; if (GT_MP_PTPM) net_istep = 0; else - net_istep = 2; + net_istep = 3; while (!done && bman.state == GS_update) { /* the network thing */ @@ -446,7 +449,33 @@ net_transmit_gamedata () /* if PTPS get all data */ if (GT_MP_PTPS) { + if (net_istep == 3) { + /* + get tunneldata + */ + if ((y < GAME_MAX_TUNNELS - 1 && y == bman.players[bman.p_nr].net.net_status) + || y == -1) { + y++; + downtimestamp = timestamp; + send_tunneldata (&bman.players[0].net.addr, y, -1, -1); + } + else if (y < GAME_MAX_TUNNELS && y != bman.players[bman.p_nr].net.net_status + && y >= 0 && timestamp - downtimestamp > DOWNLOAD_TIMEOUT) { + /* we have got no tunnel data*/ + y--; + } + else if (y == GAME_MAX_TUNNELS - 1 && bman.players[bman.p_nr].net.net_status == y) { + /* we have got all tunnel data */ + y = -1; + bman.players[bman.p_nr].net.net_istep = --net_istep; + bman.players[bman.p_nr].net.net_status = -1; + } + } + if (net_istep == 2) { + /* + get field data + */ if ((y < map.size.y - 1 && y == bman.players[bman.p_nr].net.net_status) || y == -1) { /* send field data req */ @@ -468,6 +497,9 @@ net_transmit_gamedata () } if (net_istep == 1) { + /* + get player data + */ if ((y < MAX_PLAYERS - 1 && y == bman.players[bman.p_nr].net.net_status) || y == -1) { /* send player date req */ y++; diff --git a/src/packets.c b/src/packets.c index ff4be20..9bd41fe 100644 --- a/src/packets.c +++ b/src/packets.c @@ -668,6 +668,45 @@ send_bombdata (_net_addr * addr, int p, int b, _bomb * bomb) send_pkg ((struct pkg *) &b_dat, addr); }; +/* recive a request for some tunneldata or receive tunneldata */ +void do_tunneldata (struct pkg_tunneldata *tun_pkg, _net_addr *addr) { + d_printf ("do_tunneldata: From %d [%s:%s] (Tunnel %d Target [%d,%d])\n", addr->pl_nr, addr->host, addr->port, tun_pkg->tunnel_nr, tun_pkg->target.x, tun_pkg->target.y); + + if (addr->pl_nr != 0 && GT_MP_PTPM && tun_pkg->target.y == -1 && tun_pkg->target.x == -1) { + send_tunneldata (addr, tun_pkg->tunnel_nr, map.tunnel[tun_pkg->tunnel_nr].x, map.tunnel[tun_pkg->tunnel_nr].y); + bman.players[addr->pl_nr].net.net_status = tun_pkg->tunnel_nr; + bman.players[addr->pl_nr].net.net_istep = 3; + } + else if (addr->pl_nr == 0 && tun_pkg->tunnel_nr < GAME_MAX_TUNNELS) { + if (tun_pkg->target.x >= 0 && tun_pkg->target.x < map.size.x && tun_pkg->target.y >= 0 && tun_pkg->target.y < map.size.y) { + map.tunnel[tun_pkg->tunnel_nr].x = tun_pkg->target.x; + map.tunnel[tun_pkg->tunnel_nr].y = tun_pkg->target.y; + bman.players[bman.p_nr].net.net_status = tun_pkg->tunnel_nr; + } + else + d_printf (" values out of range\n"); + } +}; + + +/* send a tunneldata request (x && y == -1) or send tunneldata */ +void send_tunneldata (_net_addr *addr, int tunnelnr, int x, int y) { + struct pkg_tunneldata tun_pkg; + + d_printf ("send_tunneldata (Tunnel %d Target [%d,%d])\n", tunnelnr, x, y); + + tun_pkg.h.typ = PKG_tunneldata; + tun_pkg.h.len = sizeof (struct pkg_tunneldata); + + if ((GT_MP_PTPM && x != -1 && y != -1) || (GT_MP_PTPS && x == -1 && y == -1)) { + tun_pkg.tunnel_nr = tunnelnr; + tun_pkg.target.x = x; + tun_pkg.target.y = y; + + send_pkg ((struct pkg*) &tun_pkg, addr); + } +}; + void send_quit (_net_addr * addr, char *plhost, char *plport) @@ -1216,6 +1255,9 @@ do_pkg (struct pkg *packet, _net_addr * addr) case (PKG_mapinfo): do_mapinfo ((struct pkg_mapinfo *) packet, addr); break; + case (PKG_tunneldata): + do_tunneldata ((struct pkg_tunneldata *) packet, addr); + break; default: send_error (addr, "BomberClone: unknown data packet"); break; diff --git a/src/packets.h b/src/packets.h index f4fa8c7..79f89a8 100644 --- a/src/packets.h +++ b/src/packets.h @@ -20,6 +20,7 @@ enum _network_data { PKG_ill, PKG_special, PKG_mapinfo, + PKG_tunneldata, PKG_bcmservchat = 90 }; @@ -51,6 +52,13 @@ struct pkg_bcmservchat { }; +struct pkg_tunneldata { + struct pkgheader h; + signed char tunnel_nr; + _point target; +}; + + struct pkg_pkgack { struct pkgheader h; char typ; @@ -274,6 +282,7 @@ extern void do_bcmservchat (struct pkg_bcmservchat *packet, _net_addr *addr); extern void do_ill (struct pkg_ill *ill_pkg, _net_addr *addr); extern void do_special (struct pkg_special *sp_pkg, _net_addr *addr); extern void do_mapinfo (struct pkg_mapinfo *map_pkg, _net_addr *addr); +extern void do_tunneldata (struct pkg_tunneldata *tun_pkg, _net_addr *addr); extern void send_pkg (struct pkg *packet, _net_addr *addr); extern void send_playerid (_net_addr *addr, char *name, char *pladdr, char *plport, int p_nr, int gfx_nr, signed char netflags); @@ -294,6 +303,7 @@ extern void send_chat (_net_addr *addr, char *text); extern void send_ill (_net_addr *addr, int p_nr, _player *pl); extern void send_special (_net_addr *addr, int p_nr, int typ, int ex_nr); extern void send_mapinfo (_net_addr *addr); +extern void send_tunneldata (_net_addr *addr, int tunnelnr, int x, int y); extern void fwd_pkg (struct pkg *packet, _net_addr *addr);