XKeySym keysym; /* the keysym decoded from the event */
X
Xint num_quit=0;
Xchar buf[20]; /* dummy buffer for XLookupString */
X
X/*
X* handle all the events for player w
X*/
Xint handle_events(w)
Xwinptr w;
X{
X
X /*
X * Only get the events for this window that match the eventmask
X */
X while(XCheckWindowEvent(w->theDisplay,w->theWindow,EVENTMASK,&xe))
X {
X switch(xe.type)
X {
X /*
X * A mouse button was pressed. Once we know which, we
X * the appropriate variable in the player structure
X */
X case ButtonPress:
X switch(xe.xbutton.button)
X {
X case Button1:
X w->b1 = 1;
X w->cloaking = 0;
X break;
X case Button2:
X w->b2 = 1;
X break;
X case Button3:
X w->b3 = 1;
X break;
X default:
X break;
X }
X break;
X
X /*
X * Same as for ButtonPress
X */
X case ButtonRelease:
X switch(xe.xbutton.button)
X {
X case Button1:
X w->b1 = 0;
X break;
X case Button2:
X w->b2 = 0;
X break;
X case Button3:
X w->b3 = 0;
X break;
X default:
X break;
X }
X break;
X
X /*
X * OK, a key was pressed, which one eh?
X */
X case KeyPress:
X XLookupString(&(xe.xkey),buf,10,&keysym,NULL);
X /*
X * Turn Anti-clockwise
X */
X if(keysym==w->prefs.turnLeft)
X start_turn_left(w);
X
X /*
X * Turn Clockwise
X */
X if(keysym==w->prefs.turnRight)
X start_turn_right(w);
X
X /*
X ** Change view of deaders
X */
X if(keysym==w->prefs.changeView)
X change_view(w);
X
X /*
X * Quit Now
X */
X if(keysym==w->prefs.quit)
X quit(w);
X
X /*
X * Change radar resolution
X */
X if(keysym==w->prefs.toggleRadar)
X {
X w->short_range_radar = 1 - w->short_range_radar;
X }
X
X /*
X * Change which item is being repaired
X * only damaged items can be repaired, destroyed
X * or non-existent are skipped
X * idle means nothing is being repaired
X */
X
X if(keysym==w->prefs.changeRepair)
X {
X change_repair(w);
X }
X
X /*
X * Toggle shield regenerating
X */
X if(keysym==w->prefs.toggleShieldsRegen)
X {
X w->shield_regen=1-w->shield_regen;
X }
X
X /*
X ** transfer the energy from shields to energy bank
X */
X if(keysym==w->prefs.grabEnergy)
X grab_energy(w);
X
X /*
X ** okay, lets toggle cloaking
X */
X if(keysym==w->prefs.invisibility)
X invis(w);
X
X /*
X ** Balance the shield energy
X */
X if(keysym==w->prefs.balanceShields)
X balance_shields(w);
X
X /*
X * Toggle who we are targeting
X */
X if(keysym==w->prefs.changeTarget)
X change_target(w);
X
X /*
X * Toggle current weapon on/off
X */
X if(keysym==w->prefs.toggleWeaponStatus)
X {
X w->weap_on_status[w->curr_weap] = 1 - w->weap_on_status[w->curr_weap];
X }
X
X /*
X ** Simulate buttons down
X */
X if(keysym==w->prefs.fire)
X w->b1=1;
X if(keysym==w->prefs.changeWeapon)
X w->b2=1;
X if(keysym==w->prefs.thrust)
X w->b3=1;
X break;
X
X /*
X * A key was released
X */
X case KeyRelease:
X XLookupString(&(xe.xkey),buf,10,&keysym,NULL);
X
X /*
X * We only care about the rotate keys so we know
X * when to stop rotating
X */
X if(keysym==w->prefs.turnLeft)
X stop_turn_left(w);
X
X if(keysym==w->prefs.turnRight)
X stop_turn_right(w);
X
X /*
X ** Simulate buttons down
X */
X if(keysym==w->prefs.fire)
X w->b1=0;
X if(keysym==w->prefs.changeWeapon)
X w->b2=0;
X if(keysym==w->prefs.thrust)
X w->b3=0;
X break;
X
X /*
X * Blargh, an expose event, clear the screen the next
X * frame will fix the exposed region
X */
X
X case EnterNotify:
X XAutoRepeatOff(w->theDisplay);
X break;
X case LeaveNotify:
X XAutoRepeatOn(w->theDisplay);
X break;
X case Expose:
X xfe_clear(w);
X break;
X case DestroyNotify:
X bad();
X break;
X
X /*
X * Obviously an event we don't care about
X */
X default:
X break;
X }
X }
X return 0;
X}
X
Xsave *load_dude(name)
Xchar *name;
X{
X int i;
X FILE *fp;
X save *temp;
X char fn[100];
X
X strcpy(fn,SAVEDIR);
X strcat(fn, name);
X strcat(fn, ".xms");
X
Xseteuid(euid);
X fp=fopen(fn, "rb");
Xseteuid(getuid());
X
X if(!fp) {
X return &(default_save);
X }
X temp=(save *) malloc (sizeof(save));
X if(!temp)
X xmpb_error("Not enough memory");
X fread(temp, sizeof(save), 1, fp);
X fclose(fp);
X return temp;
X}
X
Xsave_dude(w)
Xwinptr w;
X{
Xsave *temp;
XFILE *fp;
Xint i;
Xchar fn[100];
Xchar buf[200];
X
X strcpy(fn,SAVEDIR);
X strcat(fn, w->Name);
X strcat(fn, ".xms");
X
Xseteuid(euid);
X fp=fopen(fn,"wb");
Xseteuid(getuid());
X
X if(!fp) {
X perror("Can't open save file");
X xmpb_error("Fatal xmpb error");
X }
X temp=(save *) malloc (sizeof(save));
X if(!temp)
X xmpb_error("Not enough memory");
X strcpy(temp->Name, w->Name);
X strcpy(temp->Ship, w->Ship);
X temp->energy_max=w->energy_max;
X temp->ls_max=w->ls_max;
X temp->bs_max=w->bs_max;
X temp->rs_max=w->rs_max;
X temp->credits=w->credits+w->earned;
X temp->kills = w->kills;
X strncpy(temp->password,w->password,9);
X temp->password[9] = 0;
X temp->ship_value=w->ship_value;
X for(i=0; i<NUM_ITEMS; i++)
X {
X temp->quality[i]=w->quality[i];
X if(w->state[i] > 0)
X temp->state[i]=w->state[i];
X else
X temp->state[i] = -1;
X }
X for(i=0; i<NO_WEAPONS; i++)
X {
X if(w->load_status[i] != -1)
X temp->does_have_weap[i]=w->does_have_weap[i];
X else
X temp->does_have_weap[i] = 0;
X temp->weap_on_status[i]=w->weap_on_status[i];
X }
X fwrite(temp, sizeof(save), 1, fp);
X fclose(fp);
X sprintf(buf,"chmod 600 %s",fn);
X free(temp);
X}
X
Xclose_host(w)
Xwinptr w;
X{
X char buf[80];
X
X XAutoRepeatOn(w->theDisplay);
X XCloseDisplay(w->theDisplay);
X XCloseDisplay(w->radar->theDisplay);
X XCloseDisplay(w->stats->theDisplay);
X if(!w->npc)
X {
X strcpy(buf, SAVEDIR);
X strcat(buf, w->Name);
X strcat(buf, ".lock");
Xseteuid(euid);
X unlink(buf);
Xseteuid(getuid());
X }
X}
X
Xhandle_quitting(w)
Xwinptr w;
X{
X char buf[10];
X int add;
X
X XDrawImageString(w->theDisplay, w->theWindow, w->aGC, 20, 20, "Are you sure you wish to quit (y/n)? ", strlen("Are you sure you wish to quit (y/n)? "));
X while(XCheckWindowEvent(w->theDisplay,w->theWindow,KeyPressMask,&xe))
X {
X if(xe.type==KeyPress)
X {
X XLookupString(&(xe.xkey),buf,10,&keysym,NULL);
X if(keysym==XK_y) {
X winptr t, l;
X witemptr tw;
X
X tw=first_weap_item;
X while(tw)
X {
X if(tw->who==w)
X tw->who=NULL;
X tw=tw->next;
X }
X add=0;
X no_hosts--;
X if(w->quitting==2) {
X
X
X num_alive--;
X num_quit++;
X untarget(w);
X add=w->earned/3;
X
X if(num_alive && num_alive!=num_npcs_alive)
X add=add/(num_alive-num_npcs_alive);
X w->earned=w->earned*2/3;
X }
X t = first_win;
X if (t==w) {
X first_win=w->next;
X if(!w->npc || w->npcwin) close_host(w);
X t=first_win;
X while(t)
X {
X if(!t->exploding && !t->npc) t->earned+=add;
X t=t->next;
X }
X return 1;
X }
X else
X while(t) {
X l=t;
X t=t->next;
X if(w==t) {
X l->next=t->next;
X if(!w->npc || w->npcwin) close_host(w);
X t=first_win;
X while(t)
X {
X if(!t->exploding && !t->npc) t->earned+=add;
X t=t->next;
X }
X return 1;
X }
X }
X }
X else { /* not a y so not quitting */
X w->quitting=0;
X }
X
X }
X }
X return 0;
X}
X
X/*
X* This obscurely named routine handles events for all of the windows
X*/
Xupdate_win_strs()
X{
X winptr temp,t,old;
X
X
X if(num_alive==num_npcs_alive && num_npcs_windows==0)
X {
X/*
X winptr w;
X
X w = first_win;
X while(w)
X {
X if(w->npc)
X save_npc(w);
X else
X save_dude(w);
X w=w->next;
X }
X exit(0);
X*/
X winners();
X }
X temp = first_win;
X while(temp != NULL)
X {
X t=temp;
X if(temp->quitting>0 && !temp->npc)
X {
X if(handle_quitting(temp))
X {
X t = temp->next;
X if(!temp->npc)
X {
X parse_shop_contents();
X temp->ship_value=value_of_craft(temp);
X save_dude(temp);
X }
X free(temp);
X temp =t;
X }
X else
X temp = temp->next;
X }
X else {
X if(!temp->npc)
X handle_events(temp);
X else if (!temp->exploding)
X {
X int i;
X for(i=0; i < 20 && execute_ins(temp,temp->comp); i++);
X }
X old=temp;
X temp = temp->next;
X }
X }
X}
X
Xstart_turn_left(w)
Xwinptr w;
X{
X w->angle_changed = 1;
X if(w->angle_v > 0)
X w->angle_v = 0;
X w->tl = 1;
X w->tr = 0;
X}
X
Xstart_turn_right(w)
Xwinptr w;
X{
X w->angle_changed = 1;
X w->tr = 1;
X if(w->angle_v < 0)
X w->angle_v = 0;
X w->tl = 0;
X}
X
Xchange_view(w)
Xwinptr w;
X{
X int flag=0;
X winptr t;
X
X if(!w->exploding)
X return;
X if(!w->watching)
X w->watching = first_win;
X else
X {
X w->watching = w->watching->next;
X }
X t = w->watching;
XBLURGH:
X while(w->watching)
X {
X if(!w->watching->exploding)
X {
X flag = 1;
X return;
X }
X if(t == w->watching->next && w->watching->next)
X return;
X else if(t == first_win && !w->watching->next)
X return;
X w->watching = w->watching->next;
X }
X if(!w->watching)
X {
X w->watching = first_win;
X goto BLURGH;
X }
X if(!flag)
X w->watching = NULL;
X}
X
Xquit(w)
Xwinptr w;
X{
X if(w->npc)
X return;
X xfe_clear(w);
X XDrawImageString(w->theDisplay, w->theWindow, w->aGC, 20, 20, "Are you sure you wish to quit (y/n)? ", strlen("Are you sure you wish to quit (y/n)? "));
X
X if(w->exploding) /* 1 = dead & quit, 2= !dead & quit */
X w->quitting=1;
X else
X w->quitting=2;
X}
X
Xchange_repair(w)
Xwinptr w;
X{
X /*
X * Got to the next one
X */
X w->rep_which=(w->rep_which+1)%(NUM_ITEMS+1);
X
X /*
X * Skip the ones that can't be repaired
X */
X while(w->rep_which!=IDLE &&
X (w->state[w->rep_which]<=0 || w->state[w->rep_which]==100))
X {
X w->rep_which=(w->rep_which+1)%(NUM_ITEMS+1);
X }
X}
X
Xgrab_energy(w)
Xwinptr w;
X{
X int tot,max;
X
X tot=w->ls_curr+w->rs_curr+w->bs_curr;
X if((w->energy_max-w->energy_curr) > tot/2)
X {
X w->energy_curr+=tot/2;
X w->ls_curr /= 2;
X w->rs_curr /= 2;
X w->bs_curr /= 2;
X }
X}
X
Xinvis(w)
Xwinptr w;
X{
X w->cloaking=1-w->cloaking;
X if(w->state[CLOAK]<=0)
X w->cloaking=0;
X}
X
Xbalance_shields(w)
Xwinptr w;
X{
X int tot,max;
X
X tot=w->ls_curr+w->rs_curr+w->bs_curr;
X max=w->ls_max+w->rs_max+w->bs_max;
X w->ls_curr=((w->ls_max*tot)/max);
X w->rs_curr=((w->rs_max*tot)/max);
X w->bs_curr=((w->bs_max*tot)/max);
X}
X
Xchange_target(w)
Xwinptr w;
X{
X winptr temp;
X
X if(w->exploding!=0 || w->state[TC] == -1)
X return;
X if(!w->targeting) /* not targeting anyone yet */
X {
X temp=first_win; /* so set to first */
X }
X else
X temp=w->targeting->next; /* else next */
X
X while(temp && (((temp->cloaking) &&
X (temp->state[CLOAK]>=rand()%100+1)) || (w==temp)
X || (temp->exploding)))
X { /* watch we don't target
X * cloak'ns, ourself or deaders */
X temp=temp->next;
X }
X w->targeting=temp;
X}
X
Xstop_turn_left(w)
Xwinptr w;
X{
X w->tl = 0;
X w->tr = 0;
X w->angle_v = 0;
X}
X
Xstop_turn_right(w)
Xwinptr w;
X{
X w->tr = 0;
X w->tl = 0;
X w->angle_v = 0;
X}
END_OF_FILE
if test 11684 -ne `wc -c <'handle_ev.c'`; then
echo shar: \"'handle_ev.c'\" unpacked with wrong size!
fi
# end of 'handle_ev.c'
fi
if test -f 'radar.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'radar.c'\"
X XDrawString(w->theDisplay,w->theWindow,w->aGC,20,20,"Todays Combat!",14);
X t = first_win;
X while(t)
X {
X sprintf(buf,"%s in %s %5s%d",t->Name,t->Ship,"$", t->ship_value);
X XDrawString(w->theDisplay,w->theWindow,w->aGC,30,40+15*i,buf,strlen(buf));
X i++;
X t =t->next;
X }
X XSync(w->theDisplay,False);
X }
X w = w->next;
X }
X for(i=3;i>0;i--)
X {
X t = first_win;
X while(t)
X {
X if(!t->npc || t->npcwin)
X {
X sprintf(buf,"%d",i);
X XDrawImageString(t->theDisplay,t->theWindow,t->aGC,PLAYW/2,3*PLAYH/4,buf,strlen(buf));
X XSync(t->theDisplay,False);
X }
X t =t->next;
X }
X sleep(1);
X }
X }
X#define MAX_JUNK_MOD 40
X#define MAX_JUNK_OFFSET 20
X
X for(i=0;i<15;i++)
X {
X add_junk(SMALLROCK,rand()%(WORLDW*2)-WORLDW,rand()%(WORLDH*2)-WORLDH,((rand()%(MAX_JUNK_MOD)-MAX_JUNK_OFFSET)*32768),((rand()%(MAX_JUNK_MOD)-MAX_JUNK_OFFSET)*32768),0);
X add_junk(MEDROCK,rand()%(WORLDW*2)-WORLDW,rand()%(WORLDH*2)-WORLDH,((rand()%(MAX_JUNK_MOD)-MAX_JUNK_OFFSET)*32768),((rand()%(MAX_JUNK_MOD)-MAX_JUNK_OFFSET)*32768),0);
X }
X for(i=0;i<10;i++)
X {
X add_junk(BIGROCK,rand()%(WORLDW*2)-WORLDW,rand()%(WORLDH*2)-WORLDH,((rand()%(MAX_JUNK_MOD)-MAX_JUNK_OFFSET)*32768),((rand()%(MAX_JUNK_MOD)-MAX_JUNK_OFFSET)*32768),0);
X }
X
X signal(SIGINT, die);
X signal(SIGHUP, die);
X signal(SIGQUIT, die);
X signal(SIGPIPE, die);
X signal(SIGHUP, die);
X signal(SIGSEGV, bad);
X signal(SIGBUS, bad);
X
X{
X winptr r;
X
X r = first_win;
X while(r)
X {
X if(!r->npc)
X XAutoRepeatOff(r->theDisplay);
X r=r->next;
X }
X}
X
X time_started=time(NULL);
X mins_left=(int) time_limit/60;
X secs_left=time_limit;
X mins_gone=0;
X while(1)
X {
X update_win_strs();
X update_ships();
X update_weapons();
X update_win_input();
X do_laser_hits();
X synch_all();
X dec_earned();
X if(num_alive<=1) {
X counter--;
X if(num_alive==1 && counter==1) winner(0);
X else { /* unlikely but both may die or quit in the same handle_events loop */
X if(counter==1) winners();
X }
X }
X update_win_pics();
X update_junk();
X no_lasers = 0;
X tmp=time(NULL);
X if(mins_left<=1)
X secs_left=time_limit+time_started-tmp;
X if(secs_left<=0)
X winner(2);
X if(tmp-time_started>59+60*mins_gone)
X {
X mins_left--;
X mins_gone++;
X }
X }
X}
END_OF_FILE
if test 12372 -ne `wc -c <'test.c'`; then
echo shar: \"'test.c'\" unpacked with wrong size!
fi
# end of 'test.c'
fi
echo shar: End of archive 4 \(of 8\).
cp /dev/null ark4isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 8 archives.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives: