X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Finit.c;h=27247acdb95fa296aba71e4163274e7de770ef31;hp=9092f382813787b83c942fd1d9403c5ea5ff6b77;hb=823bddb0d9cc63ddda17a2cd20266aa3b82bde38;hpb=34b9fd6b89ffe8fa0637840118b43e4d36bb1798 diff --git a/src/init.c b/src/init.c index 9092f382..27247acd 100644 --- a/src/init.c +++ b/src/init.c @@ -1,17 +1,22 @@ /*********************************************************** * Rocks'n'Diamonds -- McDuffin Strikes Back! * *----------------------------------------------------------* -* ©1995 Artsoft Development * -* Holger Schemel * -* 33659 Bielefeld-Senne * -* Telefon: (0521) 493245 * -* eMail: aeglos@valinor.owl.de * -* aeglos@uni-paderborn.de * -* q99492@pbhrzx.uni-paderborn.de * +* (c) 1995-98 Artsoft Entertainment * +* Holger Schemel * +* Oststrasse 11a * +* 33604 Bielefeld * +* phone: ++49 +521 290471 * +* email: aeglos@valinor.owl.de * *----------------------------------------------------------* * init.c * ***********************************************************/ +#include +#include +#include +#include +#include + #include "init.h" #include "misc.h" #include "sound.h" @@ -22,8 +27,6 @@ #include "gfxload.h" #include "gifload.h" -#include - #ifdef DEBUG /* #define DEBUG_TIMING @@ -44,6 +47,7 @@ struct IconFileInfo static int sound_process_id = 0; +static void InitServer(void); static void InitLevelAndPlayerInfo(void); static void InitDisplay(int, char **); static void InitSound(void); @@ -55,6 +59,13 @@ static void InitElementProperties(void); void OpenAll(int argc, char *argv[]) { + + + /* TEST TEST TEST */ + InitServer(); + /* TEST TEST TEST */ + + InitLevelAndPlayerInfo(); InitCounter(); @@ -78,6 +89,141 @@ void OpenAll(int argc, char *argv[]) DrawMainMenu(); } + + +/* TEST STUFF -------------------------------------------------------------- */ + +int norestart = 0; +int nospeedup = 0; + +/* server stuff */ + +#define DEFAULTPORT 19503 +#define BUFLEN 4096 + +int sfd; +unsigned char realbuf[512], readbuf[BUFLEN], writbuf[BUFLEN]; +unsigned char *buf = realbuf + 4; +int nread = 0, nwrite = 0; + +void fatal(char *s) +{ + fprintf(stderr, "%s.\n", s); + exit(1); +} + +void u_sleep(int i) +{ + struct timeval tm; + tm.tv_sec = i / 1000000; + tm.tv_usec = i % 1000000; + select(0, NULL, NULL, NULL, &tm); +} + +void startserver() +{ + char *options[2]; + int n = 0; + + options[0] = options[1] = NULL; + if (norestart) + options[n++] = "-norestart"; + if (nospeedup) + options[n++] = "-nospeedup"; + + switch (fork()) + { + case 0: + execlp( +#ifdef XTRISPATH + XTRISPATH "/rnd_server", +#else + "rnd_server", +#endif + "rnd_server", "-once", "-v", options[0], options[1], NULL); + + fprintf(stderr, "Can't start server '%s'.\n", +#ifdef XTRISPATH + XTRISPATH "/xtserv"); +#else + "xtserv"); +#endif + + _exit(1); + + case -1: + fatal("fork() failed"); + + default: + return; + } +} + +void connect2server(char *host, int port) +{ + struct hostent *hp; + struct sockaddr_in s; + struct protoent *tcpproto; + int on = 1, i; + + if (host) + { + if ((s.sin_addr.s_addr = inet_addr(host)) == -1) + { + hp = gethostbyname(host); + if (!hp) + fatal("Host not found"); + s.sin_addr = *(struct in_addr *)(hp->h_addr_list[0]); + } + } + else + s.sin_addr.s_addr = inet_addr("127.0.0.1"); + + s.sin_port = htons(port); + s.sin_family = AF_INET; + sfd = socket(PF_INET, SOCK_STREAM, 0); + if (sfd < 0) + fatal("Out of file descriptors"); + if ((tcpproto = getprotobyname("tcp")) != NULL) + setsockopt(sfd, tcpproto->p_proto, TCP_NODELAY, (char *)&on, sizeof(int)); + + if (connect(sfd, (struct sockaddr *)&s, sizeof(s)) < 0) + { + if (!host) + { + printf("No xtris server on localhost - starting up one ...\n"); + startserver(); + for (i=0; i<6; i++) + { + u_sleep(500000); + close(sfd); + sfd = socket(PF_INET, SOCK_STREAM, 0); + if (sfd < 0) + fatal("Out of file descriptors"); + setsockopt(sfd, tcpproto->p_proto, TCP_NODELAY, (char *)&on, sizeof(int)); + if (connect(sfd, (struct sockaddr *)&s, sizeof(s)) >= 0) + break; + } + if (i==6) + fatal("Can't connect to server"); + } + else + fatal("Can't connect to server"); + } +} + +void InitServer() +{ + if (server_port == 0) + server_port = DEFAULTPORT; + + connect2server(server_host, server_port); +} + +/* TEST STUFF -------------------------------------------------------------- */ + + + void InitLevelAndPlayerInfo() { local_player = &stored_player[0]; @@ -432,17 +578,36 @@ void InitGfx() } tile_needs_clipping[] = { - { GFX_SPIELER_UP, 4 }, - { GFX_SPIELER_DOWN, 4 }, - { GFX_SPIELER_LEFT, 4 }, - { GFX_SPIELER_RIGHT, 4 }, - { GFX_SPIELER_PUSH_LEFT, 4 }, - { GFX_SPIELER_PUSH_RIGHT, 4 }, + { GFX_SPIELER1_UP, 4 }, + { GFX_SPIELER1_DOWN, 4 }, + { GFX_SPIELER1_LEFT, 4 }, + { GFX_SPIELER1_RIGHT, 4 }, + { GFX_SPIELER1_PUSH_LEFT, 4 }, + { GFX_SPIELER1_PUSH_RIGHT, 4 }, + { GFX_SPIELER2_UP, 4 }, + { GFX_SPIELER2_DOWN, 4 }, + { GFX_SPIELER2_LEFT, 4 }, + { GFX_SPIELER2_RIGHT, 4 }, + { GFX_SPIELER2_PUSH_LEFT, 4 }, + { GFX_SPIELER2_PUSH_RIGHT, 4 }, + { GFX_SPIELER3_UP, 4 }, + { GFX_SPIELER3_DOWN, 4 }, + { GFX_SPIELER3_LEFT, 4 }, + { GFX_SPIELER3_RIGHT, 4 }, + { GFX_SPIELER3_PUSH_LEFT, 4 }, + { GFX_SPIELER3_PUSH_RIGHT, 4 }, + { GFX_SPIELER4_UP, 4 }, + { GFX_SPIELER4_DOWN, 4 }, + { GFX_SPIELER4_LEFT, 4 }, + { GFX_SPIELER4_RIGHT, 4 }, + { GFX_SPIELER4_PUSH_LEFT, 4 }, + { GFX_SPIELER4_PUSH_RIGHT, 4 }, { GFX_GEBLUBBER, 4 }, { GFX_DYNAMIT, 7 }, { GFX_DYNABOMB, 4 }, { GFX_SOKOBAN_OBJEKT, 1 }, - { GFX_MASK_SPARKLING, 3 }, + { GFX_FUNKELN_BLAU, 3 }, + { GFX_FUNKELN_WEISS, 3 }, { -1, 0 } }; @@ -504,15 +669,8 @@ void InitGfx() int src_x, src_y; Pixmap src_pixmap; - if (tile_needs_clipping[i].start == GFX_MASK_SPARKLING) - { - /* special case -- should be cleaned up sometimes... */ - src_pixmap = clipmask[PIX_BACK]; - src_x = SX + GFX_PER_LINE*TILEX; - src_y = SY + j*TILEY; - } - else if (graphic >= GFX_START_ROCKSSCREEN && - graphic <= GFX_END_ROCKSSCREEN) + if (graphic >= GFX_START_ROCKSSCREEN && + graphic <= GFX_END_ROCKSSCREEN) { src_pixmap = clipmask[PIX_BACK]; graphic -= GFX_START_ROCKSSCREEN; @@ -1203,6 +1361,16 @@ void InitElementProperties() }; static int ep_pushable_num = sizeof(ep_pushable)/sizeof(int); + static int ep_player[] = + { + EL_SPIELFIGUR, + EL_SPIELER1, + EL_SPIELER2, + EL_SPIELER3, + EL_SPIELER4 + }; + static int ep_player_num = sizeof(ep_player)/sizeof(int); + static long ep_bit[] = { EP_BIT_AMOEBALIVE, @@ -1228,7 +1396,8 @@ void InitElementProperties() EP_BIT_INACTIVE, EP_BIT_EXPLOSIVE, EP_BIT_MAMPF3, - EP_BIT_PUSHABLE + EP_BIT_PUSHABLE, + EP_BIT_PLAYER }; static int *ep_array[] = { @@ -1255,7 +1424,8 @@ void InitElementProperties() ep_inactive, ep_explosive, ep_mampf3, - ep_pushable + ep_pushable, + ep_player }; static int *ep_num[] = { @@ -1282,7 +1452,8 @@ void InitElementProperties() &ep_inactive_num, &ep_explosive_num, &ep_mampf3_num, - &ep_pushable_num + &ep_pushable_num, + &ep_player_num }; static int num_properties = sizeof(ep_num)/sizeof(int *);