X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fevents.c;h=f1cd50dafaa7dca21d6b7c4583d94300c0540e78;hb=b2a0ff1ddd4430110b331129469dabb8ea7b6ba7;hp=238aa066ed72188b931a4509121db9ec9d220af4;hpb=01a14ec659822082594be0304cc701f816043ad9;p=rocksndiamonds.git diff --git a/src/events.c b/src/events.c index 238aa066..f1cd50da 100644 --- a/src/events.c +++ b/src/events.c @@ -1,13 +1,12 @@ /*********************************************************** * 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 * *----------------------------------------------------------* * events.c * ***********************************************************/ @@ -26,7 +25,7 @@ void EventLoop(void) { while(1) { - if (XPending(display)) /* got an event */ + if (XPending(display)) /* got event from X server */ { XEvent event; @@ -167,11 +166,11 @@ void HandleExposeEvent(XExposeEvent *event) SetDrawtoField(DRAW_BACKBUFFER); - for(xx=0;xx=x1 && xx<=x2 && yy>=y1 && yy<=y2) DrawScreenField(xx,yy); - DrawPlayerField(); + DrawAllPlayers(); SetDrawtoField(DRAW_DIRECT); } @@ -180,8 +179,8 @@ void HandleExposeEvent(XExposeEvent *event) { int fx = FX, fy = FY; - fx += (PlayerMovDir & (MV_LEFT|MV_RIGHT) ? ScreenMovPos : 0); - fy += (PlayerMovDir & (MV_UP|MV_DOWN) ? ScreenMovPos : 0); + fx += (ScreenMovDir & (MV_LEFT|MV_RIGHT) ? ScreenGfxPos : 0); + fy += (ScreenMovDir & (MV_UP|MV_DOWN) ? ScreenGfxPos : 0); XCopyArea(display,fieldbuffer,backbuffer,gc, fx,fy, SXSIZE,SYSIZE, @@ -267,6 +266,29 @@ void HandleButton(int mx, int my, int button) HandleGameButtons(mx,my,button); } +#ifdef DEBUG + if (game_status == PLAYING && !button) + { + int sx = (mx - SX) / TILEX; + int sy = (my - SY) / TILEY; + + if (IN_VIS_FIELD(sx,sy)) + { + int x = LEVELX(sx); + int y = LEVELY(sy); + + printf("INFO: Feld[%d][%d] == %d\n", x,y, Feld[x][y]); + printf(" Store[%d][%d] == %d\n", x,y, Store[x][y]); + printf(" Store2[%d][%d] == %d\n", x,y, Store2[x][y]); + printf(" StorePlayer[%d][%d] == %d\n", x,y, StorePlayer[x][y]); + printf(" MovPos[%d][%d] == %d\n", x,y, MovPos[x][y]); + printf(" MovDir[%d][%d] == %d\n", x,y, MovDir[x][y]); + printf(" MovDelay[%d][%d] == %d\n", x,y, MovDelay[x][y]); + printf("\n"); + } + } +#endif + switch(game_status) { case MAINMENU: @@ -291,7 +313,7 @@ void HandleButton(int mx, int my, int button) HandleSetupScreen(mx,my,0,0,button); break; case PLAYING: - HandleGameActions(); + HandleGameActions(0); break; default: break; @@ -438,7 +460,7 @@ void HandleKey(KeySym key, int key_status) if (key_status == KEY_RELEASED) return; - if (key==XK_Return && game_status==PLAYING && GameOver) + if (key==XK_Return && game_status==PLAYING && AllPlayersGone) { CloseDoor(DOOR_CLOSE_1); game_status = MAINMENU; @@ -552,7 +574,7 @@ void HandleKey(KeySym key, int key_status) case XK_Q: #endif case XK_q: - Dynamite = 1000; + local_player->dynamite = 1000; break; case XK_x: @@ -611,6 +633,7 @@ void HandleKey(KeySym key, int key_status) break; case XK_y: + /* { printf("FX = %d, FY = %d\n", FX,FY); @@ -622,6 +645,40 @@ void HandleKey(KeySym key, int key_status) XSync(display,FALSE); Delay(1000); } + */ + + printf("direct_draw_on == %d\n", direct_draw_on); + + break; + + case XK_z: + { + int i; + + for(i=0; i= 4 && nread >= 4 + readbuf[3]) + { + len = readbuf[3]; + if (readbuf[0] || readbuf[1] || readbuf[2]) + fatal("Wrong server line length"); + + memcpy(buf, &readbuf[4], len); + nread -= 4 + len; + copydown(readbuf, readbuf + 4 + len, nread); + + switch(buf[1]) + { + case OP_YOUARE: + printf("OP_YOUARE: %d\n", buf[0]); + break; + + case OP_NEW: + printf("OP_NEW: %d\n", buf[0]); + sprintf(msgbuf, "new client %d connected", buf[0]); + sysmsg(msgbuf); + break; + + case OP_GONE: + printf("OP_GONE: %d\n", buf[0]); + sprintf(msgbuf, "client %d disconnected", buf[0]); + sysmsg(msgbuf); + break; + + case OP_BADVERS: + { + static char tmpbuf[128]; + + sprintf(tmpbuf, "Protocol version mismatch: server expects %d.%d.x instead of %d.%d.%d\n", buf[2], buf[3], PROT_VERS_1, PROT_VERS_2, PROT_VERS_3); + fatal(tmpbuf); + } + break; + + case OP_PLAY: + printf("OP_PLAY: %d\n", buf[0]); + sprintf(msgbuf, "client %d starts game", buf[0]); + sysmsg(msgbuf); + break; + + case OP_PAUSE: + printf("OP_PAUSE: %d\n", buf[0]); + sprintf(msgbuf, "client %d pauses game", buf[0]); + sysmsg(msgbuf); + break; + + case OP_CONT: + printf("OP_CONT: %d\n", buf[0]); + sprintf(msgbuf, "client %d continues game", buf[0]); + sysmsg(msgbuf); + break; + + case OP_WON: + printf("OP_WON: %d\n", buf[0]); + sprintf(msgbuf, "client %d wins the game", buf[0]); + sysmsg(msgbuf); + break; + + case OP_ZERO: + printf("OP_ZERO: %d\n", buf[0]); + sprintf(msgbuf, "client %d resets game counters", buf[0]); + sysmsg(msgbuf); + break; + + case OP_NICK: + printf("OP_NICK: %d\n", buf[0]); + sprintf(msgbuf, "client %d calls itself %s", buf[0], &buf[2]); + sysmsg(msgbuf); + break; + + case OP_MSG: + printf("OP_MSG: %d\n", buf[0]); + sprintf(msgbuf, "client %d sends message", buf[0]); + break; + + case OP_LOST: + printf("OP_MSG: %d\n", buf[0]); + sprintf(msgbuf, "client %d has lost", buf[0]); + break; + + case OP_LEVEL: + printf("OP_MSG: %d\n", buf[0]); + sprintf(msgbuf, "client %d sets level to %d", buf[0], buf[2]); + break; + } + } + + fflush(stdout); +} + + + +static void HandleNetworking() +{ + static struct timeval tv = { 0, 0 }; + fd_set rfds; + int r = 0; + + if (standalone) + return; + + flushbuf(); + + FD_ZERO(&rfds); + FD_SET(sfd, &rfds); + + r = select(sfd + 1, &rfds, NULL, NULL, &tv); + + if (r < 0 && errno != EINTR) + { + perror("select"); + fatal("fatal: select() failed"); + } + + if (r < 0) + FD_ZERO(&rfds); + + if (FD_ISSET(sfd, &rfds)) + { + int r; + + r = read(sfd, readbuf + nread, BUFLEN - nread); + + if (r < 0) + fatal("Error reading from server"); + if (r == 0) + fatal("Connection to server lost"); + nread += r; + + handlemessages(); + } +} + void HandleNoXEvent() { if (button_status && game_status != PLAYING) @@ -644,6 +894,8 @@ void HandleNoXEvent() return; } + HandleNetworking(); + switch(game_status) { case MAINMENU: @@ -655,7 +907,11 @@ void HandleNoXEvent() break; case PLAYING: HandleJoystick(); - HandleGameActions(); + + /* + HandleGameActions(0); + */ + break; default: break; @@ -666,21 +922,21 @@ void HandleJoystick() { int joystick = Joystick(); int keyboard = key_joystick_mapping; + + /* int joy = (tape.playing ? TapePlayAction() : (joystick | keyboard)); + */ + + int joy = (joystick | keyboard); int left = joy & JOY_LEFT; int right = joy & JOY_RIGHT; int up = joy & JOY_UP; int down = joy & JOY_DOWN; int button = joy & JOY_BUTTON; - int button1 = joy & JOY_BUTTON_1; - int button2 = joy & JOY_BUTTON_2; int newbutton = (JoystickButton() == JOY_BUTTON_NEW_PRESSED); int dx = (left ? -1 : right ? 1 : 0); int dy = (up ? -1 : down ? 1 : 0); - if (game_status==PLAYING && (tape.playing || keyboard)) - newbutton = ((joy & JOY_BUTTON) != 0); - switch(game_status) { case MAINMENU: @@ -700,18 +956,20 @@ void HandleJoystick() HandleSetupScreen(0,0,dx,dy,newbutton ? MB_MENU_CHOICE : MB_MENU_MARK); break; } + case HALLOFFAME: HandleHallOfFame(!newbutton); break; + case HELPSCREEN: HandleHelpScreen(!newbutton); break; + case PLAYING: - { - static int player_frame_reset_delay = 0; - BOOL moved = FALSE, snapped = FALSE, bombed = FALSE; + if (tape.playing || keyboard) + newbutton = ((joy & JOY_BUTTON) != 0); - if (GameOver && newbutton) + if (AllPlayersGone && newbutton) { CloseDoor(DOOR_CLOSE_1); game_status = MAINMENU; @@ -719,64 +977,12 @@ void HandleJoystick() return; } - if (tape.pausing || PlayerGone) + if (tape.pausing || AllPlayersGone) joy = 0; - if (joy) - { - player_frame_reset_delay = 0; - - if (button1) - snapped = SnapField(dx,dy); - else - { - if (button2) - bombed = PlaceBomb(); - moved = MoveFigure(dx,dy); - } - - if (tape.recording && (moved || snapped || bombed)) - { - if (bombed && !moved) - joy &= JOY_BUTTON; - TapeRecordAction(joy); - } - else if (tape.playing && snapped) - SnapField(0,0); /* stop snapping */ - } - else - { - DigField(0,0,0,0,DF_NO_PUSH); - SnapField(0,0); - if (++player_frame_reset_delay > MoveSpeed) - PlayerFrame = 0; - } - - if (tape.playing && !tape.pausing && !joy && tape.counter= tape.pos[tape.counter].delay) - { - PlayerMovDir = next_joy; - PlayerFrame = FrameCounter % 4; - PlayerPushing = TRUE; - } - } - } - } + HandleGameActions(joy); break; - } + default: break; }