|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T i ┃
Length: 6657 (0x1a01) Types: TextFile Names: »input.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─ ⟦this⟧ »./X.V10R4/xtrek/input.c«
#ifndef lint static char *rcsid_input_c = "$Header: input.c,v 10.1 86/11/30 15:25:32 jg Rel $"; #endif lint /* Copyright (c) 1986 Chris Guthrie */ #include <X/Xlib.h> #include <stdio.h> #include <math.h> #include <signal.h> #include "defs.h" #include "struct.h" #include "data.h" #include "bitmaps.h" #define WINSIDE 500 extern Window iconWin, w, mapw, statwin, messagew, tstatw; extern Font dfont; extern Display *display; extern int redrawall; extern int lastm; /* Last new message */ extern int copilot; int selfdest; int doTheRedrawDude, skipUpdates = 1; initinput() { XSelectInput(iconWin, ExposeWindow|ExposeRegion); XSelectInput(w, KeyPressed|ButtonPressed|ButtonReleased|ExposeRegion|ExposeWindow); XSelectInput(mapw, KeyPressed|ButtonPressed|ButtonReleased|ExposeWindow|ExposeRegion); XSelectInput(messagew, KeyPressed|ButtonPressed|ButtonReleased|ExposeWindow|ExposeRegion); XSelectInput(tstatw, ExposeWindow|ExposeRegion); } setRedrawFlag() { if (skipUpdates) doTheRedrawDude = 1; else doTheRedrawDude++; } input() { XEvent data; XKeyOrButtonEvent *tmp; int quit = 0; char *buf; int nchar; int fd; tmp = (XKeyOrButtonEvent *) &data; signal(SIGALRM, setRedrawFlag); doTheRedrawDude = 1; while (1) { while (doTheRedrawDude-- > 0) { intrupt(); } fd = (1 << display->fd); if (!XPending()) { while (select(32, &fd, 0, 0, 0) < 0) fd = (1 << display->fd); } XNextEvent(&data); if ((me->p_status == PEXPLODE) || (me->p_status == PDEAD)) { if (copilot) exit(0); else death(); } switch (data.type) { case KeyPressed: if (me->p_flags & PFSELFDEST) { me->p_flags &= ~PFSELFDEST; warning("Self Destruct has been canceled"); } buf = XLookupMapping(&data, &nchar); if (nchar > 0) { if (data.window == messagew) smessage(*buf); else keyaction(*buf, tmp); } break; case ButtonPressed: if (me->p_flags & PFSELFDEST) { me->p_flags &= ~PFSELFDEST; warning("Self Destruct has been canceled"); } buttonaction(tmp); break; case ExposeRegion: case ExposeWindow: if (data.window == statwin && showStats) redrawStats(statwin); else if (data.window == tstatw) redrawTstats(); else if (data.window == mapw) redrawall = 1; else if (data.window == iconWin) XBitmapBitsPut(iconWin, 0, 0, icon_width, icon_height, icon_bits, borderColor, backColor, 0, GXcopy, AllPlanes); break; default: break; } } } keyaction(key, data) char key; XKeyOrButtonEvent *data; { char buf[80]; unsigned char course; struct obtype *gettarget(), *target; struct player *p; struct planet *pl; switch(key) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': set_speed(key - '0'); break; case 'k': /* k = set course */ course = getcourse(data->window, data->x, data->y); set_course(course); me->p_flags &= ~(PFPLOCK | PFPLLOCK); break; case 'p': /* p = fire phasers */ course = getcourse(data->window, data->x, data->y); phaser(course); break; case 't': /* t = launch torps */ course = getcourse(data->window, data->x, data->y); ntorp(course, TMOVE); break; case 'd': /* d = detonate other torps */ detothers(); break; case 'D': /* D = detonate my torps */ detmine(); break; case 'L': /* L = Player list */ playerlist(); break; case 'P': /* P = Planet list */ planetlist(); break; case 'S': /* S = toggle stat mode */ if (showStats) { showStats = !showStats; closeStats(statwin); } else { statwin = openStats(me); showStats = !showStats; } break; case 'M': /* M = Toggle Map mode */ mapmode = !mapmode; break; case '+': /* + = Put shields up */ shield_up(); break; case '-': /* - = Put shields down */ shield_down(); break; case 'u': /* u = toggle shields */ shield_tog(); break; case 'i': /* i = get information */ inform(data->window, data->x, data->y); break; case 'b': /* b = bomb planet */ bomb_planet(); break; case 'z': /* z = beam up */ beam_up(); break; case 'x': /* x = beam down */ beam_down(); break; case 'R': /* R = Go into repair mode */ me->p_flags &= ~(PFPLOCK | PFPLLOCK); repair(); break; case 'o': /* o = orbit nearest planet */ me->p_flags &= ~(PFPLOCK | PFPLLOCK); orbit(); break; case 'Q': if (copilot) exit(1); me->p_flags |= PFSELFDEST; selfdest = me->p_updates + 100; warning("Self destruct initiated"); break; case '?': /* ? = Redisplay all messages */ repeat_message(); break; case 'c': /* c = cloak */ cloak(); break; case 'C': /* C = coups */ coup(); break; case 'l': /* l = lock onto */ /* since a robot would never use this function (it's user interface dependent,) all the work is done here instead of in interface.c */ target = gettarget(data->window, data->x, data->y); if (target->o_type == PLAYERTYPE) { me->p_flags |= PFPLOCK; me->p_flags &= ~(PFPLLOCK|PFORBIT); me->p_playerl = target->o_num; p = &players[target->o_num]; sprintf(buf, "Locking onto %s (%c%d)", p->p_name, teamlet[p->p_team], p->p_no); warning(buf); } else { me->p_flags |= PFPLLOCK; me->p_flags &= ~(PFPLOCK|PFORBIT); me->p_planet = target->o_num; pl = &planets[target->o_num]; sprintf(buf, "Locking onto %s", pl->pl_name); warning(buf); } break; case '@': /* u = toggle shields */ me->p_flags ^= PFCOPILOT; break; default: XFeep(0); break; } } buttonaction(data) XKeyOrButtonEvent *data; { unsigned char course; if ((data->detail & 0xf) == RightButton) { course = getcourse(data->window, data->x, data->y); me->p_desdir = course; me->p_flags &= ~(PFPLOCK | PFPLLOCK); } else if ((data->detail & 0xf) == LeftButton) { course = getcourse(data->window, data->x, data->y); ntorp(course, TMOVE); } else if ((data->detail & 0xf) == MiddleButton) { course = getcourse(data->window, data->x, data->y); phaser(course); } } getcourse(ww, x, y) Window ww; int x, y; { if (ww == mapw) { int me_x, me_y; me_x = me->p_x * WINSIDE / GWIDTH; me_y = me->p_y * WINSIDE / GWIDTH; return((unsigned char) (atan2((double) (x - me_x), (double) (me_y - y)) / 3.14159 * 128.)); } else return((unsigned char) (atan2((double) (x - WINSIDE/2), (double) (WINSIDE/2 - y)) / 3.14159 * 128.)); }