netmaze-0.81+jpg0.82.orig/0040700000175000017500000000000005553575200015360 5ustar jgoerzenjgoerzennetmaze-0.81+jpg0.82.orig/allmove.c0100600000175000017500000006144505552751177017204 0ustar jgoerzenjgoerzen/* * movement-handler */ #include #include #include "netmaze.h" #define REBOUNCE_PERC 0.85 extern void play_sound(int); extern int random_maze(MAZE*,int,int); extern long trigtab[]; extern struct shared_struct *sm; static void enemy_colision(long,long,PLAYER*,PLAYER*); static int enemy_touch(PLAYER *player,PLAYER *players); static void wall_pcoll(long,long,PLAYER*); static int wall_scoll(PLAYER*,int nr); static int player_hit(int,long,long,PLAYER *players); static void set_player_pos(PLAYER*,int,MAZE *mazeadd); static int add_shot(PLAYER*); static void remove_shot(PLAYER*,int); static int ball_bounce(PLAYER *p,int i,int xc,int yc,long x,long y); static void convert_trigtabs(int divider); void myrandominit(long s); static int myrandom(void); static void reset_player(PLAYER *players,int i); long walktab[320],shoottab[320]; /* in diesem Programmteil sollten moeglichst keine Veraenderungen vorgenommen werden, weil eine Aenderung sehr leicht zu Inkompatibilitaeten zwischen den Rechnern fuehren kann. Auch sollte man auf Berechnungen mit Floatingpoint und Divisionen allgemein verzichten. Statt Divisionen mit Shifts arbeiten. You shouldn't do changes in this file .. because changes can cause incompatibility between two different compilations. You should also avoid floatingpointcalculations and divisions. (Use shifts instead of divisions!) */ /***********************************/ /* this is the 'heart' of the game */ /* moving player,shots */ /* check collisions .... */ /***********************************/ void move_all(PLAYER* players,int *joywerte) { int i,joy,wink,plynum,j,next; PLAYER *player; long plx,ply; int count; count = 1<config.divider; RERUN: if(sm->armageddon > 0) { sm->armageddon--; if(!sm->armageddon) { random_maze(&sm->std_maze,10,0); /* 10x10 arena */ for(i=0;ianzplayers;i++) set_player_pos(players,i,&sm->std_maze); } } player = players; for(i=0;ianzplayers;i++,player++) { if(player->alive) /* is the player alive? */ { joy = joywerte[i]; /* get players joy/mouse/keyboard-movement-value */ if(sm->gamemode & GM_ALLOWHIDE) { if(joy & JOY_HIDE) player->hide = TRUE; else player->hide = FALSE; } if(joy & JOY_UP) /* press stick UP? */ { player->hide = FALSE; wink = player->winkel; plx = player->x; /* copy old position */ ply = player->y; if(sm->gamemode & GM_FASTWALKING) { player->x += walktab[wink]<<1; player->y += walktab[wink+64]<<1; } else { player->x += walktab[wink]; /* add step to position */ player->y += walktab[wink+64]; } if (player->x < 0) player->x = 0; if (player->y < 0) player->y = 0; wall_pcoll(plx,ply,player); /* coll? yes => set old value */ enemy_colision(plx,ply,player,players); } else if(joy & JOY_DOWN) { player->hide = FALSE; wink = player->winkel; plx = player->x; ply = player->y; if(sm->gamemode & GM_FASTWALKING) { player->x -= walktab[wink]<<1; player->y -= walktab[wink+64]<<1; } else { player->x -= walktab[wink]; player->y -= walktab[wink+64]; } if (player->x < 0) player->x = 0; if (player->y < 0) player->y = 0; wall_pcoll(plx,ply,player); enemy_colision(plx,ply,player,players); } if(joy & JOY_RIGHT) { if(joy & JOY_SLOW) player->winkel += sm->config.angle_step>>2; else { player->winkel += sm->config.angle_step; /* step angle right */ player->winkel &= ~(sm->config.angle_step-1); } if(player->winkel >= MAX_WINKEL) player->winkel -= MAX_WINKEL; } else if(joy & JOY_LEFT) { if(joy & JOY_SLOW) player->winkel -= sm->config.angle_step>>2; else { player->winkel += sm->config.angle_step-1; player->winkel &= ~(sm->config.angle_step-1); player->winkel -= sm->config.angle_step; /* step angle left */ } if(player->winkel < 0) player->winkel += MAX_WINKEL; } if(joy & JOY_BUTTON) { if(player->recharge == 0) /* gun is recharged? */ { if(i == sm->shownumber) play_sound(1); player->stat.shots++; /* statistics */ player->hide = FALSE; if((!(sm->gamemode & GM_WEAKINGSHOTS)) || (player->fitness >= 80)) { if(sm->gamemode & GM_MULTIPLESHOTS) { j = add_shot(player); if(j >= 0) { player->shots[j].sx = player->x; /* set start-position */ player->shots[j].sy = player->y; wink = player->winkel; player->shots[j].sxd = shoottab[wink]; /* set shot-step */ player->shots[j].syd = shoottab[wink+64]; player->shots[j].power = 320; player->recharge = sm->config.rechargetime; } } else { if(player->numofshots > 0) remove_shot(player,player->shotqueue2); j = add_shot(player); player->shots[j].sx = player->x; /* set start-position */ player->shots[j].sy = player->y; wink = player->winkel; player->shots[j].sxd = shoottab[wink]; /* set shot-step */ player->shots[j].syd = shoottab[wink+64]; player->shots[j].power = SHOTPOWER; player->recharge = sm->config.rechargetime; /* disable gun */ } if(sm->gamemode & GM_WEAKINGSHOTS) player->fitness -= 80; } } } if(sm->gamemode & GM_ALLOWRADAR) { if(joy & JOY_RADAR) player->radar = TRUE; else player->radar = FALSE; } if((player->fitness < sm->config.startfitness) || player->radar ) { if(player->radar) player->fitness -= sm->config.repower>>1; else player->fitness += sm->config.repower; /* repower the player */ player->statchg = TRUE; /* power-bar changes (redraw) */ if(player->fitness > sm->config.startfitness) player->fitness = sm->config.startfitness; else if(player->fitness < 0) player->fitness = 0; } } /* end: player is alive */ else { /* player is dead/or has left the game */ if( (++player->fitness > 0) && player->active) { set_player_pos(players,i,&(sm->std_maze)); /*reincarnate player */ player->fitness = sm->config.startfitness; /*give him the start-power */ player->alive = TRUE; /* make him alive */ player->statchg = TRUE; /* and set the redraw-flag */ if(i == sm->shownumber) play_sound(2); } } /* * move shots */ for(j=player->shotqueue2;j >= 0;j=next) { next = player->shots[j].next; player->shots[j].sx += player->shots[j].sxd; /* move the shot */ player->shots[j].sy += player->shots[j].syd; if(wall_scoll(player,j)) /*shot hits wall?*/ { if(sm->gamemode & GM_REFLECTINGSHOTS) { player->shots[j].power *= REBOUNCE_PERC; /* lose power */ if(player->shots[j].power <= 0) remove_shot(player,j); } else { remove_shot(player,j); } } else if( (plynum = player_hit(i,player->shots[j].sx,player->shots[j].sy,players)) >= 0) /*hits an enemy? */ { remove_shot(player,j); if(i == sm->shownumber) play_sound(5); else if(plynum == sm->shownumber) play_sound(4); if(player->team != players[plynum].team) /* friendly-fire-protect */ { player->stat.hits++; players[plynum].stat.ownhits++; players[plynum].fitness -= player->shots[j].power; players[plynum].statchg = TRUE; player->follow = plynum; } players[plynum].hitbycnt = 8; /* recolour enemy for 8 beats */ players[plynum].hitby = player->team; players[plynum].hide = FALSE; if(players[plynum].fitness < 0) /* enemy is out of power? */ { if(i == sm->shownumber) play_sound(0); else if(plynum == sm->shownumber) play_sound(3); player->stat.kills++; players[plynum].stat.ownkills++; player->follow = -1; players[plynum].alive = FALSE; /* make him dead */ players[plynum].fitness = -sm->config.deadtime;/*reincarnate-delay*/ players[plynum].ownkiller = i; /* set the killer */ players[plynum].hitbycnt = 0; /* set colour */ player->killtable[player->killanz] = plynum; player->killanz++; player->killchg = TRUE; sm->teams[player->team].kills++; /* inc kills */ if(sm->teams[player->team].kills >= sm->config.kills2win) /*enough kills?*/ { sm->gameflag = FALSE; sm->winner = i; sm->winnerdraw = TRUE; sm->screendraw = FALSE; sm->statchg2 = TRUE; sm->killchg = TRUE; sm->redraw = TRUE; return; } sm->statchg1 = TRUE; /* state-change for every player */ } else { /* for statistics */ } } else { if(sm->gamemode & GM_DECAYINGSHOTS) { player->shots[j].power -= sm->config.shot_decay; if(player->shots[j].power <= 0) { remove_shot(player,j); } } } } /* end for(j...) */ if(player->recharge) player->recharge--; if(player->hitbycnt > 0) player->hitbycnt -= sm->config.recolour_delay; } sm->drawwait++; /* internal 'beat' counter */ sm->redraw = TRUE; count--; if(count > 0) goto RERUN; /* for divider */ } /* * Shot-queue-helper: */ static int add_shot(PLAYER *p) { int i,old,new; if(p->shotqueue1 == -1) return -1; p->numofshots++; old = p->shotqueue2; new = p->shotqueue1; i = p->shots[new].next; p->shots[new].next = old; p->shots[new].last = -1; p->shotqueue2 = p->shotqueue1; p->shotqueue1 = i; if(old >= 0) { p->shots[old].last = p->shotqueue2; } return new; } static void remove_shot(PLAYER *p,int i) { int last,next; last = p->shots[i].last; next = p->shots[i].next; if(last >= 0) p->shots[last].next = p->shots[i].next; else p->shotqueue2 = p->shots[i].next; if(next >= 0) p->shots[next].last = last; p->numofshots--; p->shots[i].next = p->shotqueue1; p->shotqueue1 = i; } /******************************/ /* Player <-> Wall Collision */ /******************************/ static void wall_pcoll(long xold,long yold,PLAYER *player) { long x,y; int xc,yc; int xflag=-1; int yflag=-1; x = (player->x) & 0x00ffffff; y = (player->y) & 0x00ffffff; xc = (int) ((player->x) >> 24); yc = (int) ((player->y) >> 24); if(x < 0x00400000) { xflag = 0; if(sm->std_maze.vwalls[yc][xc] & MAZE_BLOCK_PLAYER) { player->x = (player->x & 0xff000000) | 0x00400000; xflag = -1; } } else if(x > 0x00c00000) { xflag = 1; if(sm->std_maze.vwalls[yc][xc+1] & MAZE_BLOCK_PLAYER) { player->x = (player->x & 0xff000000) | 0x00c00000; xflag = -1; } } if(y < 0x00400000) { yflag = 0; if(sm->std_maze.hwalls[yc][xc] & MAZE_BLOCK_PLAYER) { player->y = (player->y & 0xff000000) | 0x00400000; yflag = -1; } } else if(y > 0x00c00000) { yflag = 2; if(sm->std_maze.hwalls[yc+1][xc] & MAZE_BLOCK_PLAYER) { player->y = (player->y & 0xff000000) | 0x00c00000; yflag = -1; } } if((xflag != -1) && (yflag != -1)) { switch(xflag | yflag) { case 0: if( (sm->std_maze.vwalls[yc-1][xc] & MAZE_BLOCK_PLAYER) || (sm->std_maze.hwalls[yc][xc-1] & MAZE_BLOCK_PLAYER) ) { if(player->x > xold) { player->y = (player->y & 0xff000000) | 0x00400000; } else if(player->y > yold) { player->x = (player->x & 0xff000000) | 0x00400000; } else { player->x = xold; /* very simple (and not good) */ player->y = yold; } } break; case 1: if( (sm->std_maze.vwalls[yc-1][xc+1] & MAZE_BLOCK_PLAYER) || (sm->std_maze.hwalls[yc][xc+1] & MAZE_BLOCK_PLAYER) ) { if(player->x < xold) { player->y = (player->y & 0xff000000) | 0x00400000; } else if(player->y > yold) { player->x = (player->x & 0xff000000) | 0x00c00000; } else { player->x = xold; /* very simple (and not good) */ player->y = yold; } } break; case 2: if( (sm->std_maze.vwalls[yc+1][xc] & MAZE_BLOCK_PLAYER) || (sm->std_maze.hwalls[yc+1][xc-1] & MAZE_BLOCK_PLAYER) ) { if(player->x > xold) { player->y = (player->y & 0xff000000) | 0x00c00000; } else if(player->y < yold) { player->x = (player->x & 0xff000000) | 0x00400000; } else { player->x = xold; /* very simple (and not good) */ player->y = yold; } } break; case 3: if( (sm->std_maze.vwalls[yc+1][xc+1] & MAZE_BLOCK_PLAYER) || (sm->std_maze.hwalls[yc+1][xc+1] & MAZE_BLOCK_PLAYER) ) { if(player->x < xold) { player->y = (player->y & 0xff000000) | 0x00c00000; } else if(player->y < yold) { player->x = (player->x & 0xff000000) | 0x00c00000; } else { player->x = xold; /* very simple (and not good) */ player->y = yold; } } break; } } } /******************************/ /* Shot <-> Wall Collission */ /******************************/ static int wall_scoll(PLAYER *p,int i) { long x,y; int xc,yc,flag=0; long sx,sy; sx = p->shots[i].sx; sy = p->shots[i].sy; x = sx & 0x00ffffff; y = sy & 0x00ffffff; xc = (int) (sx >> 24); yc = (int) (sy >> 24); if(x < 0x001e0000) { flag |= 1; } else if(x > 0x00e20000) { flag |= 4; } if(y < 0x001e0000) { flag |= 2; } else if(y > 0x00e20000) { flag |= 8; } switch(flag) { case 1: if(sm->std_maze.vwalls[yc][xc] & MAZE_BLOCK_SHOT) { if(p->shots[i].sxd >= 0) { p->shots[i].sx -= 0x001e0000 + x; } else { p->shots[i].sx += 0x001e0000 - x; } p->shots[i].sxd = -p->shots[i].sxd; return(TRUE); } break; case 2: if(sm->std_maze.hwalls[yc][xc] & MAZE_BLOCK_SHOT) { if(p->shots[i].syd >= 0) { p->shots[i].sy -= 0x001e0000 + y; } else { p->shots[i].sy += 0x001e0000 - y; } p->shots[i].syd = -p->shots[i].syd; return(TRUE); } break; case 3: return ball_bounce(p,i,xc,yc,x,y); case 4: if(sm->std_maze.vwalls[yc][xc+1] & MAZE_BLOCK_SHOT) { if(p->shots[i].sxd >= 0) { p->shots[i].sx -= x - 0x00e20000; } else { p->shots[i].sx += 0x011e0000 - x; } p->shots[i].sxd = -p->shots[i].sxd; return(TRUE); } break; case 6: return ball_bounce(p,i,xc+1,yc,x,y); case 8: if(sm->std_maze.hwalls[yc+1][xc] & MAZE_BLOCK_SHOT) { if(p->shots[i].syd >= 0) { p->shots[i].sy -= y - 0x00e20000; } else { p->shots[i].sy += 0x011e0000 - y; } p->shots[i].syd = -p->shots[i].syd; return(TRUE); } break; case 9: return ball_bounce(p,i,xc,yc+1,x,y); case 12: return ball_bounce(p,i,xc+1,yc+1,x,y); } return(FALSE); } /* * wall_scoll-helper (not complete yet) */ static int ball_bounce(PLAYER *p,int i,int xc,int yc,long x,long y) { int f = 0,w = 0; w = (sm->std_maze.vwalls[yc][xc]<<2) + (sm->std_maze.hwalls[yc][xc]<<1) + sm->std_maze.vwalls[yc-1][xc] + (sm->std_maze.hwalls[yc][xc-1]<<3); if(p->shots[i].sxd >= 0) f = 1; if(p->shots[i].syd >= 0) f |= 2; switch(f) { case 0: if( ((w & 0x6) == 0x6) || ( !(w & 0x6) && ((w & 0x9) == 0x9))) { p->shots[i].sxd = -p->shots[i].sxd; p->shots[i].syd = -p->shots[i].syd; } else if(w & 0x2) { p->shots[i].syd = -p->shots[i].syd; } else if(w) { p->shots[i].sxd = -p->shots[i].sxd; } break; case 1: if( ((w & 0xc) == 0xc) || ( !(w & 0xc) && ((w & 0x3) == 0x3))) { p->shots[i].sxd = -p->shots[i].sxd; p->shots[i].syd = -p->shots[i].syd; } else if(w & 0x8) { p->shots[i].syd = -p->shots[i].syd; } else if(w) { p->shots[i].sxd = -p->shots[i].sxd; } break; case 2: if( ((w & 0x3) == 0x3) || ( !(w & 0x3) && ((w & 0xc) == 0xc))) { p->shots[i].sxd = -p->shots[i].sxd; p->shots[i].syd = -p->shots[i].syd; } else if(w & 0x2) { p->shots[i].syd = -p->shots[i].syd; } else if(w) { p->shots[i].sxd = -p->shots[i].sxd; } break; case 3: if( ((w & 0x9) == 0x9) || ( !(w & 0x9) && ((w & 0x6) == 0x6))) { p->shots[i].sxd = -p->shots[i].sxd; p->shots[i].syd = -p->shots[i].syd; } else if(w & 0x8) { p->shots[i].syd = -p->shots[i].syd; } else if(w) { p->shots[i].sxd = -p->shots[i].sxd; } break; } return(w?TRUE:FALSE); /* if(w) return TRUE; else return FALSE; */ } /********************************/ /* Player <-> Player Collision */ /********************************/ static void enemy_colision(long xold,long yold,PLAYER *player,PLAYER *players) { if(enemy_touch(player,players)) { player->x = xold; player->y = yold; } } static int enemy_touch(PLAYER *player,PLAYER *players) { int i; long xd,yd; for(i=0;ianzplayers;i++,players++) { if((player != players) && players->alive ) { xd = (player->x - players->x); yd = (player->y - players->y); if(xd < 0) xd = -xd; if(yd < 0) yd = -yd; if((xd > 0x800000) || (yd > 0x800000)) continue; xd>>=12; yd>>=12; if( (xd*xd + yd*yd) < 0x280000) return TRUE; } } return FALSE; } /********************************/ /* Player <-> Shot Collision */ /* -1: no hit / >= 0: playernr. */ /********************************/ static int player_hit(int plnr,long sx,long sy,PLAYER *plys) { int i; long xd,yd; for(i=0;ianzplayers;i++,plys++) { if((i != plnr) && plys->alive ) { if( (xd = (sx - plys->x)) < 0) xd = -xd; if( (yd = (sy - plys->y)) < 0) yd = -yd; if((xd > 0x800000) || (yd > 0x800000)) continue; xd>>=12; yd>>=12; if( (xd*xd + yd*yd) < 0x180000) return(i); } } return(-1); } /************************/ /* Game starts */ /* Setup Start-Settings */ /************************/ void run_game(MAZE *mazeadd,PLAYER *players) { int i; sm->winnerdraw = FALSE; sm->screendraw = TRUE; sm->ownstick = 0; memset(sm->sticks,0,MAXPLAYERS); if(sm->sologame) { /* sm->gamemode = GM_MULTIPLESHOTS | GM_WEAKINGSHOTS | GM_REFLECTINGSHOTS | GM_DECAYINGSHOTS | GM_ALLOWHIDE | GM_ALLOWRADAR; */ sm->gamemode = GM_CLASSIC; sm->numteams = 4; for(i=0;ianzplayers;i++) { players[i].team = i % sm->numteams; } myrandominit(10000); } for(i=0;inumteams;i++) { sm->teams[i].kills = 0; } /* setup the configure-stuff */ sm->config.angle_step = WINKEL_STEP; sm->config.recolour_delay = 1; sm->config.repower = REFITSPEED; sm->config.shot_decay = 2; sm->config.deadtime = DEADTIME; sm->config.startfitness = STARTFITNESS; sm->config.kills2win = WINNERANZ; sm->config.armageddon = 1000000; /* armageddon after 1.000.000 beats */ sm->armageddon = sm->config.armageddon; if(sm->gamemode & GM_MULTIPLESHOTS) { if(sm->gamemode & GM_FASTRECHARGE) sm->config.rechargetime = 4; else sm->config.rechargetime = 8; } else sm->config.rechargetime = 36; convert_trigtabs(0); fprintf(stderr,"*** New game with %d player(s) starts! ***\n",sm->anzplayers); for(i=0;ianzplayers;i++) { reset_player(players,i); fprintf(stderr,"%16s: Number: %d\tTeam: %d\n",players[i].name,i,players[i].team); } for(i=0;ianzplayers;i++) set_player_pos(players,i,mazeadd); sm->statchg1 = TRUE; sm->killchg = TRUE; } /**************************************** * reset player data */ static void reset_player(PLAYER *players,int i) { int j; memset(&players[i].stat,0,sizeof(STATISTIC)); players[i].stat.gamemode = sm->gamemode; players[i].x = players[i].y = 0; players[i].fitness = sm->config.startfitness; players[i].killanz = 0; players[i].ownkills = 0; players[i].alive = TRUE; players[i].radar = FALSE; players[i].hide = FALSE; players[i].recharge = 0; players[i].hitbycnt = 0; players[i].follow = -1; for(j=0;jwinkel = myrandom() & 0xf0; data->alive = TRUE; for(i=0;i<32;i++) /* try 32 times */ { data->x = ( (xc = myrandom() % mazeadd->xdim) << 24) + 0x800000; data->y = ( (yc = myrandom() % mazeadd->ydim) << 24) + 0x800000; if((sm->std_maze.vwalls[yc][xc] & MAZE_BLOCK_PLAYER) && (sm->std_maze.vwalls[yc][xc+1] & MAZE_BLOCK_PLAYER) && (sm->std_maze.hwalls[yc][xc] & MAZE_BLOCK_PLAYER) && (sm->std_maze.hwalls[yc+1][xc] & MAZE_BLOCK_PLAYER)) continue; if(!enemy_touch(data,players)) break; } } /********************************** * activate */ void activate_player(int pl) { if(pl >= sm->anzplayers) sm->anzplayers++; reset_player(sm->playfeld,pl); } /********************************** * inactivate */ void inactivate_player(int pl) { PLAYER *p=&sm->playfeld[pl]; p->active = FALSE; p->x = p->y = 0; p->killanz = 0; p->ownkills = 0; p->alive = FALSE; } /****************************************** * "Random" from: r.sedgewick/algorithms */ void myrandominit(long s) { int j; sm->rndshiftpos = 10; for( sm->rndshifttab[0]=s,j=1;j<55;j++) sm->rndshifttab[j] = (sm->rndshifttab[j-1] * 31415821 + 1) % 100000000; } static int myrandom(void) { int i,j; if(++sm->rndshiftpos > 54) sm->rndshiftpos = 0; if( (i=(sm->rndshiftpos + 23)) > 54) i=sm->rndshiftpos-22; if( (j=(sm->rndshiftpos + 54)) > 54) j=sm->rndshiftpos-1; sm->rndshifttab[sm->rndshiftpos] = (sm->rndshifttab[i] + sm->rndshifttab[j]) % 100000000; return (sm->rndshifttab[sm->rndshiftpos] & 0x7fff); } /**********************/ /* converting sin/cos */ /**********************/ static void convert_trigtabs(int divider) { long *tab1 = trigtab,*tab2 = walktab,*tab3 = shoottab; int i; long s; static int t = -1; if(divider == t) return; t = divider; switch(t) { case 0: /* DIVIDER_1 */ for(i=0;i<320;i++) { *tab2 = (s = *(tab1++)>>3)>>1; /* tab2 = W/16 */ *tab3++ = *tab2++ + s; /* tab3 = W/8 + W/16 = W/5.33333 */ } break; #if 0 case 1: /* DIVIDER_2 */ for(i=0;i<320;i++) { *tab2 = (s = *(tab1++)>>2)>>1; /* tab2 = W/8 */ *tab3++ = *tab2++ + s; /* tab3 = W/4 + W/8 = W/2.66667 */ } break; case 2: /* DIVIDER_4 */ for(i=0;i<320;i++) { *tab2 = (s = *(tab1++)>>1)>>1; /* tab2 = W/4 */ *tab3++ = *tab2++ + s; /* tab3 = W/2 + W/4 = W/1.33333 */ } break; #endif } } netmaze-0.81+jpg0.82.orig/bitmap.h0100600000175000017500000000242405542040231016773 0ustar jgoerzenjgoerzen/* * Bitmaps for Mono/Grey-Mode */ #include "bitmaps/player0.xbm" #include "bitmaps/player1.xbm" #include "bitmaps/player2.xbm" #include "bitmaps/player3.xbm" #include "bitmaps/player4.xbm" #include "bitmaps/player5.xbm" #include "bitmaps/player6.xbm" #include "bitmaps/player7.xbm" #include "bitmaps/player8.xbm" #include "bitmaps/player9.xbm" #include "bitmaps/player10.xbm" #include "bitmaps/player11.xbm" #include "bitmaps/player12.xbm" #include "bitmaps/player13.xbm" #include "bitmaps/player14.xbm" #include "bitmaps/player15.xbm" #include "bitmaps/player16.xbm" #include "bitmaps/player17.xbm" #include "bitmaps/player18.xbm" #include "bitmaps/player19.xbm" #include "bitmaps/player20.xbm" #include "bitmaps/hwall.xbm" #include "bitmaps/vwall.xbm" #include "bitmaps/bgtop.xbm" #include "bitmaps/bgbottom.xbm" char *player_bits[] = { player0_bits ,player1_bits ,player2_bits ,player3_bits ,player4_bits ,player5_bits ,player6_bits ,player7_bits ,player8_bits ,player9_bits ,player10_bits ,player11_bits ,player12_bits ,player13_bits ,player14_bits ,player15_bits ,player16_bits ,player17_bits ,player18_bits ,player19_bits ,player20_bits ,NULL }; netmaze-0.81+jpg0.82.orig/bitmaps/0040700000175000017500000000000005553562505017023 5ustar jgoerzenjgoerzennetmaze-0.81+jpg0.82.orig/bitmaps/hwall.xbm0100600000175000017500000000042605363503353020636 0ustar jgoerzenjgoerzen#define hwall_width 16 #define hwall_height 16 static char hwall_bits[] = { 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa}; netmaze-0.81+jpg0.82.orig/bitmaps/player0.xbm0100600000175000017500000000043405334766722021113 0ustar jgoerzenjgoerzen#define player0_width 16 #define player0_height 16 static char player0_bits[] = { 0x11, 0x11, 0x22, 0x22, 0x44, 0x44, 0x88, 0x88, 0x11, 0x11, 0x22, 0x22, 0x44, 0x44, 0x88, 0x88, 0x11, 0x11, 0x22, 0x22, 0x44, 0x44, 0x88, 0x88, 0x11, 0x11, 0x22, 0x22, 0x44, 0x44, 0x88, 0x88}; netmaze-0.81+jpg0.82.orig/bitmaps/player1.xbm0100600000175000017500000000043405363504212021076 0ustar jgoerzenjgoerzen#define player1_width 16 #define player1_height 16 static char player1_bits[] = { 0x66, 0x66, 0x99, 0x99, 0x99, 0x99, 0x66, 0x66, 0x66, 0x66, 0x99, 0x99, 0x99, 0x99, 0x66, 0x66, 0x66, 0x66, 0x99, 0x99, 0x99, 0x99, 0x66, 0x66, 0x66, 0x66, 0x99, 0x99, 0x99, 0x99, 0x66, 0x66}; netmaze-0.81+jpg0.82.orig/bitmaps/player2.xbm0100600000175000017500000000043405462505263021106 0ustar jgoerzenjgoerzen#define player2_width 16 #define player2_height 16 static char player2_bits[] = { 0xff, 0xff, 0x40, 0x40, 0x5f, 0x5f, 0x51, 0x51, 0x5d, 0x5d, 0x41, 0x41, 0x7f, 0x7f, 0x40, 0x40, 0xff, 0xff, 0x40, 0x40, 0x5f, 0x5f, 0x51, 0x51, 0x5d, 0x5d, 0x41, 0x41, 0x7f, 0x7f, 0x40, 0x40}; netmaze-0.81+jpg0.82.orig/bitmaps/player3.xbm0100600000175000017500000000043405334765575021123 0ustar jgoerzenjgoerzen#define player3_width 16 #define player3_height 16 static char player3_bits[] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff}; netmaze-0.81+jpg0.82.orig/bitmaps/player4.xbm0100600000175000017500000000043405334767053021115 0ustar jgoerzenjgoerzen#define player4_width 16 #define player4_height 16 static char player4_bits[] = { 0x11, 0x11, 0xaa, 0xaa, 0x44, 0x44, 0xaa, 0xaa, 0x11, 0x11, 0xaa, 0xaa, 0x44, 0x44, 0xaa, 0xaa, 0x11, 0x11, 0xaa, 0xaa, 0x44, 0x44, 0xaa, 0xaa, 0x11, 0x11, 0xaa, 0xaa, 0x44, 0x44, 0xaa, 0xaa}; netmaze-0.81+jpg0.82.orig/bitmaps/player5.xbm0100600000175000017500000000043405334767312021114 0ustar jgoerzenjgoerzen#define player5_width 16 #define player5_height 16 static char player5_bits[] = { 0x55, 0x55, 0x44, 0x44, 0xbb, 0xbb, 0x44, 0x44, 0x44, 0x44, 0xbb, 0xbb, 0x44, 0x44, 0x55, 0x55, 0x55, 0x55, 0x44, 0x44, 0xbb, 0xbb, 0x44, 0x44, 0x44, 0x44, 0xbb, 0xbb, 0x44, 0x44, 0x55, 0x55}; netmaze-0.81+jpg0.82.orig/bitmaps/vwall.xbm0100600000175000017500000000042605336457646020671 0ustar jgoerzenjgoerzen#define vwall_width 16 #define vwall_height 16 static char vwall_bits[] = { 0xee, 0xee, 0xdd, 0xdd, 0x77, 0x77, 0xbb, 0xbb, 0xee, 0xee, 0xdd, 0xdd, 0x77, 0x77, 0xbb, 0xbb, 0xee, 0xee, 0xdd, 0xdd, 0x77, 0x77, 0xbb, 0xbb, 0xee, 0xee, 0xdd, 0xdd, 0x77, 0x77, 0xbb, 0xbb}; netmaze-0.81+jpg0.82.orig/bitmaps/player7.xbm0100600000175000017500000000043405336457671021124 0ustar jgoerzenjgoerzen#define player7_width 16 #define player7_height 16 static char player7_bits[] = { 0x33, 0x33, 0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc}; netmaze-0.81+jpg0.82.orig/bitmaps/player6.xbm0100600000175000017500000000043405336457712021117 0ustar jgoerzenjgoerzen#define player6_width 16 #define player6_height 16 static char player6_bits[] = { 0x77, 0x77, 0xdd, 0xdd, 0x77, 0x77, 0xdd, 0xdd, 0x77, 0x77, 0xdd, 0xdd, 0x77, 0x77, 0xdd, 0xdd, 0x77, 0x77, 0xdd, 0xdd, 0x77, 0x77, 0xdd, 0xdd, 0x77, 0x77, 0xdd, 0xdd, 0x77, 0x77, 0xdd, 0xdd}; netmaze-0.81+jpg0.82.orig/bitmaps/bgtop.xbm0100600000175000017500000000042605363502671020644 0ustar jgoerzenjgoerzen#define bgtop_width 16 #define bgtop_height 16 static char bgtop_bits[] = { 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; netmaze-0.81+jpg0.82.orig/bitmaps/bgbottom.xbm0100600000175000017500000000043705363502765021354 0ustar jgoerzenjgoerzen#define bgbottom_width 16 #define bgbottom_height 16 static char bgbottom_bits[] = { 0xaa, 0xaa, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00}; netmaze-0.81+jpg0.82.orig/bitmaps/player8.xbm0100600000175000017500000000043405363503121021103 0ustar jgoerzenjgoerzen#define player8_width 16 #define player8_height 16 static char player8_bits[] = { 0x11, 0x11, 0xaa, 0xaa, 0x44, 0x44, 0x00, 0x00, 0x11, 0x11, 0xaa, 0xaa, 0x44, 0x44, 0x00, 0x00, 0x11, 0x11, 0xaa, 0xaa, 0x44, 0x44, 0x00, 0x00, 0x11, 0x11, 0xaa, 0xaa, 0x44, 0x44, 0x00, 0x00}; netmaze-0.81+jpg0.82.orig/bitmaps/player9.xbm0100600000175000017500000000043405363503157021115 0ustar jgoerzenjgoerzen#define player9_width 16 #define player9_height 16 static char player9_bits[] = { 0x22, 0x22, 0x44, 0x44, 0x22, 0x22, 0x11, 0x11, 0x22, 0x22, 0x44, 0x44, 0x22, 0x22, 0x11, 0x11, 0x22, 0x22, 0x44, 0x44, 0x22, 0x22, 0x11, 0x11, 0x22, 0x22, 0x44, 0x44, 0x22, 0x22, 0x11, 0x11}; netmaze-0.81+jpg0.82.orig/bitmaps/player10.xbm0100600000175000017500000000043705363503252021164 0ustar jgoerzenjgoerzen#define player10_width 16 #define player10_height 16 static char player10_bits[] = { 0x22, 0x22, 0x77, 0x77, 0x22, 0x22, 0x00, 0x00, 0x22, 0x22, 0x77, 0x77, 0x22, 0x22, 0x00, 0x00, 0x22, 0x22, 0x77, 0x77, 0x22, 0x22, 0x00, 0x00, 0x22, 0x22, 0x77, 0x77, 0x22, 0x22, 0x00, 0x00}; netmaze-0.81+jpg0.82.orig/bitmaps/player11.xbm0100600000175000017500000000043705462505563021174 0ustar jgoerzenjgoerzen#define player11_width 16 #define player11_height 16 static char player11_bits[] = { 0x0f, 0x0f, 0xf0, 0xf0, 0x0f, 0x0f, 0xf0, 0xf0, 0x0f, 0x0f, 0xf0, 0xf0, 0x0f, 0x0f, 0xf0, 0xf0, 0x0f, 0x0f, 0xf0, 0xf0, 0x0f, 0x0f, 0xf0, 0xf0, 0x0f, 0x0f, 0xf0, 0xf0, 0x0f, 0x0f, 0xf0, 0xf0}; netmaze-0.81+jpg0.82.orig/bitmaps/player12.xbm0100600000175000017500000000043705462505663021176 0ustar jgoerzenjgoerzen#define player12_width 16 #define player12_height 16 static char player12_bits[] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa}; netmaze-0.81+jpg0.82.orig/bitmaps/player13.xbm0100600000175000017500000000043705462505732021174 0ustar jgoerzenjgoerzen#define player13_width 16 #define player13_height 16 static char player13_bits[] = { 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff}; netmaze-0.81+jpg0.82.orig/bitmaps/player14.xbm0100600000175000017500000000043705462506004021166 0ustar jgoerzenjgoerzen#define player14_width 16 #define player14_height 16 static char player14_bits[] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa}; netmaze-0.81+jpg0.82.orig/bitmaps/player15.xbm0100600000175000017500000000043705462506157021200 0ustar jgoerzenjgoerzen#define player15_width 16 #define player15_height 16 static char player15_bits[] = { 0xff, 0xff, 0x88, 0x88, 0xee, 0xee, 0x00, 0x00, 0xff, 0xff, 0x88, 0x88, 0xee, 0xee, 0x00, 0x00, 0xff, 0xff, 0x88, 0x88, 0xee, 0xee, 0x00, 0x00, 0xff, 0xff, 0x88, 0x88, 0xee, 0xee, 0x00, 0x00}; netmaze-0.81+jpg0.82.orig/bitmaps/player16.xbm0100600000175000017500000000043705462506352021176 0ustar jgoerzenjgoerzen#define player16_width 16 #define player16_height 16 static char player16_bits[] = { 0x22, 0x22, 0x55, 0x55, 0x49, 0x49, 0x41, 0x41, 0x22, 0x22, 0x94, 0x94, 0xc9, 0xc9, 0x80, 0x80, 0x22, 0x22, 0x55, 0x55, 0x49, 0x49, 0x41, 0x41, 0x22, 0x22, 0x94, 0x94, 0xc9, 0xc9, 0x80, 0x80}; netmaze-0.81+jpg0.82.orig/bitmaps/player17.xbm0100600000175000017500000000043705462506474021204 0ustar jgoerzenjgoerzen#define player17_width 16 #define player17_height 16 static char player17_bits[] = { 0x1c, 0x1c, 0x22, 0x22, 0x41, 0x41, 0x49, 0x49, 0x41, 0x41, 0x22, 0x22, 0x1c, 0x1c, 0x80, 0x80, 0x1c, 0x1c, 0x22, 0x22, 0x41, 0x41, 0x49, 0x49, 0x41, 0x41, 0x22, 0x22, 0x1c, 0x1c, 0x80, 0x80}; netmaze-0.81+jpg0.82.orig/bitmaps/player18.xbm0100600000175000017500000000043705462506703021200 0ustar jgoerzenjgoerzen#define player18_width 16 #define player18_height 16 static char player18_bits[] = { 0x92, 0xa4, 0xc9, 0xc9, 0xa4, 0x92, 0x92, 0xa4, 0xc9, 0xc9, 0xa4, 0x92, 0x92, 0xa4, 0xff, 0xff, 0x92, 0xa4, 0xa4, 0x92, 0xc9, 0xc9, 0x92, 0xa4, 0xa4, 0x92, 0xc9, 0xc9, 0x92, 0xa4, 0xff, 0xff}; netmaze-0.81+jpg0.82.orig/bitmaps/player19.xbm0100600000175000017500000000043705462507102021173 0ustar jgoerzenjgoerzen#define player19_width 16 #define player19_height 16 static char player19_bits[] = { 0x99, 0x99, 0x42, 0x42, 0x24, 0x24, 0x99, 0x99, 0x99, 0x99, 0x24, 0x24, 0x42, 0x42, 0x99, 0x99, 0x99, 0x99, 0x42, 0x42, 0x24, 0x24, 0x99, 0x99, 0x99, 0x99, 0x24, 0x24, 0x42, 0x42, 0x99, 0x99}; netmaze-0.81+jpg0.82.orig/bitmaps/player20.xbm0100600000175000017500000000043705462507201021163 0ustar jgoerzenjgoerzen#define player20_width 16 #define player20_height 16 static char player20_bits[] = { 0x01, 0x01, 0x7d, 0x7d, 0x45, 0x45, 0x55, 0x55, 0x45, 0x45, 0x7d, 0x7d, 0x01, 0x01, 0xff, 0xff, 0x01, 0x01, 0x7d, 0x7d, 0x45, 0x45, 0x55, 0x55, 0x45, 0x45, 0x7d, 0x7d, 0x01, 0x01, 0xff, 0xff}; netmaze-0.81+jpg0.82.orig/bitmaps/unilogo.xbm0100600000175000017500000001334305473506644021215 0ustar jgoerzenjgoerzen#define unilogo_width 56 #define unilogo_height 132 static char unilogo_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x18, 0x30, 0x0c, 0x3c, 0x00, 0x00, 0x00, 0x1e, 0x30, 0x0c, 0x78, 0x0f, 0x00, 0x78, 0x1e, 0x30, 0x0c, 0xf8, 0x1f, 0x00, 0xf8, 0x0f, 0x30, 0x0c, 0xf0, 0x1f, 0x00, 0xfc, 0x0f, 0x30, 0x0c, 0xf0, 0x03, 0x00, 0xc0, 0x07, 0x30, 0x0c, 0xf8, 0x03, 0x00, 0xc0, 0x1f, 0x30, 0x0c, 0xfc, 0x0f, 0x00, 0xf8, 0x1f, 0x30, 0x0c, 0xfc, 0x0f, 0x00, 0xf8, 0x3f, 0x30, 0x0c, 0x9c, 0x07, 0x00, 0xf0, 0x18, 0x30, 0x0c, 0x98, 0x0f, 0x00, 0xf0, 0x08, 0x30, 0x0c, 0x80, 0x0c, 0x00, 0x98, 0x00, 0x30, 0x0c, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x30, 0x0c, 0x00, 0x38, 0x00, 0x0e, 0x00, 0x30, 0x0c, 0x00, 0x70, 0x00, 0x06, 0x00, 0x30, 0x0c, 0x00, 0xe0, 0x00, 0x07, 0x00, 0x30, 0x0c, 0x00, 0xe0, 0x80, 0x03, 0x00, 0x30, 0x8c, 0x8f, 0xc3, 0xc1, 0x01, 0x00, 0x30, 0x8c, 0x8f, 0x83, 0xe3, 0x81, 0xff, 0x31, 0x0c, 0x87, 0x81, 0xf7, 0xc0, 0xff, 0x31, 0x0c, 0x87, 0x01, 0x7f, 0xc0, 0x3c, 0x33, 0x0c, 0x87, 0x01, 0x7e, 0x00, 0x3c, 0x30, 0x0c, 0x87, 0x01, 0x3e, 0x00, 0x3c, 0x30, 0x0c, 0x87, 0x01, 0x3e, 0x00, 0x3c, 0x30, 0x0c, 0x87, 0x01, 0x7f, 0x00, 0x3c, 0x30, 0x0c, 0x87, 0x81, 0xff, 0x00, 0x3c, 0x30, 0x0c, 0x87, 0x81, 0xff, 0x01, 0x3c, 0x30, 0x0c, 0x87, 0x81, 0xf7, 0x01, 0x3c, 0x30, 0x0c, 0x8e, 0xf1, 0xe7, 0x07, 0x3c, 0x30, 0x0c, 0xfe, 0xf0, 0xc3, 0x07, 0x3c, 0x30, 0x0c, 0xfc, 0xe0, 0xc1, 0x07, 0x7e, 0x30, 0x0c, 0x30, 0xf0, 0xc1, 0x0f, 0x7e, 0x30, 0x0c, 0x00, 0x78, 0x00, 0x1e, 0x00, 0x30, 0x0c, 0x00, 0x3c, 0x00, 0x3e, 0x00, 0x18, 0x0c, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x18, 0x0c, 0x00, 0x1e, 0x00, 0x7c, 0x00, 0x18, 0x0c, 0xc0, 0x1f, 0x00, 0xf8, 0x01, 0x18, 0x18, 0xc0, 0x0f, 0x00, 0xf0, 0x01, 0x18, 0x18, 0xc0, 0x07, 0x00, 0xf0, 0x01, 0x0c, 0x18, 0xc0, 0x07, 0x00, 0xf0, 0x01, 0x0c, 0x30, 0x80, 0x03, 0x00, 0xe0, 0x01, 0x04, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x81, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xc3, 0xc0, 0x00, 0x00, 0x00, 0xe0, 0x01, 0xc3, 0xc0, 0x03, 0x00, 0x80, 0xe7, 0x01, 0xc3, 0x80, 0xf7, 0x00, 0x80, 0xff, 0x00, 0xc3, 0x80, 0xff, 0x01, 0xc0, 0xff, 0x00, 0xc3, 0x00, 0xff, 0x01, 0x00, 0x7c, 0x00, 0xc3, 0x00, 0x3f, 0x00, 0x00, 0xfc, 0x01, 0xc3, 0x80, 0x3f, 0x00, 0x80, 0xff, 0x01, 0xc3, 0xc0, 0xff, 0x00, 0x80, 0xff, 0x03, 0xc3, 0xc0, 0xff, 0x00, 0x00, 0x8f, 0x01, 0xc3, 0xc0, 0x79, 0x00, 0x00, 0x8f, 0x00, 0xc3, 0x80, 0xf9, 0x00, 0x80, 0x09, 0x00, 0xc3, 0x00, 0xc8, 0x00, 0xc0, 0x01, 0x00, 0xc3, 0x00, 0x80, 0x01, 0xe0, 0x00, 0x00, 0xc3, 0x00, 0x80, 0x03, 0x60, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x07, 0x70, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x0e, 0x38, 0x00, 0x00, 0xc3, 0x00, 0x00, 0x0e, 0x1c, 0x00, 0x00, 0xc3, 0xf8, 0x38, 0x1c, 0x1e, 0xf8, 0x1f, 0xc3, 0xf8, 0x38, 0x38, 0x0f, 0xfc, 0x1f, 0xc3, 0x70, 0x18, 0x78, 0x07, 0xcc, 0x33, 0xc3, 0x70, 0x18, 0xf0, 0x07, 0xc0, 0x03, 0xc3, 0x70, 0x18, 0xe0, 0x03, 0xc0, 0x03, 0xc3, 0x70, 0x18, 0xe0, 0x03, 0xc0, 0x03, 0xc3, 0x70, 0x18, 0xe0, 0x07, 0xc0, 0x03, 0xc3, 0x70, 0x18, 0xf0, 0x0f, 0xc0, 0x03, 0xc3, 0x70, 0x18, 0xf8, 0x1f, 0xc0, 0x03, 0xc3, 0x70, 0x18, 0xf8, 0x1f, 0xc0, 0x03, 0xc3, 0x70, 0x18, 0x78, 0x7e, 0xc0, 0x03, 0xc3, 0xe0, 0x18, 0x7f, 0x7c, 0xc0, 0x03, 0xc3, 0xe0, 0x0f, 0x3f, 0x7c, 0xe0, 0x07, 0xc3, 0xc0, 0x0f, 0x1e, 0xfc, 0xe0, 0x07, 0xc3, 0x00, 0x03, 0x1f, 0xe0, 0x01, 0x00, 0xc3, 0x00, 0x80, 0x07, 0xe0, 0x03, 0x80, 0xc1, 0x00, 0xc0, 0x03, 0xe0, 0x03, 0x80, 0xc1, 0x00, 0xe0, 0x03, 0xc0, 0x07, 0x80, 0xc1, 0x00, 0xe0, 0x01, 0x80, 0x1f, 0x80, 0xc1, 0x00, 0xfc, 0x01, 0x00, 0x1f, 0x80, 0x81, 0x01, 0xfc, 0x00, 0x00, 0x1f, 0xc0, 0x80, 0x01, 0x7c, 0x00, 0x00, 0x1f, 0xc0, 0x80, 0x01, 0x7c, 0x00, 0x00, 0x1e, 0x40, 0x00, 0x03, 0x38, 0x00, 0x00, 0x00, 0x60, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0xf0, 0x01, 0xff, 0x01, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; netmaze-0.81+jpg0.82.orig/bitmaps/smiley.xbm0100600000175000017500000000102205540200530021006 0ustar jgoerzenjgoerzen#define smiley_width 24 #define smiley_height 24 static char smiley_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0xc0, 0xff, 0x01, 0xe0, 0xc1, 0x03, 0x70, 0x00, 0x07, 0x18, 0x00, 0x0c, 0x1c, 0x22, 0x1c, 0x0c, 0x63, 0x18, 0x0c, 0x63, 0x18, 0x06, 0x63, 0x30, 0x06, 0x22, 0x30, 0x06, 0x00, 0x30, 0x46, 0x00, 0x31, 0xc6, 0x80, 0x31, 0xcc, 0x80, 0x19, 0x8c, 0xe3, 0x18, 0x1c, 0x7f, 0x1c, 0x18, 0x08, 0x0c, 0x70, 0x00, 0x07, 0xe0, 0xc1, 0x03, 0xc0, 0xff, 0x01, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; netmaze-0.81+jpg0.82.orig/bitmaps/player1.xbm~0100600000175000017500000000043405363504212021274 0ustar jgoerzenjgoerzen#define player1_width 16 #define player1_height 16 static char player1_bits[] = { 0x66, 0x66, 0x99, 0x99, 0x99, 0x99, 0x66, 0x66, 0x66, 0x66, 0x99, 0x99, 0x99, 0x99, 0x66, 0x66, 0x66, 0x66, 0x99, 0x99, 0x99, 0x99, 0x66, 0x66, 0x66, 0x66, 0x99, 0x99, 0x99, 0x99, 0x66, 0x66}; netmaze-0.81+jpg0.82.orig/maze.c0100600000175000017500000001360605553471437016474 0ustar jgoerzenjgoerzen/* * load and transform maze-datas */ #include #include #include #include "netmaze.h" #include "defmaze.h" static int work_maze(MAZE *mazeadd,char* cbuffer); /************************************/ /* Speicher fuer Maze bereitstellen */ /************************************/ int create_maze(MAZE *mazeadd) { int i; char *cbuffer,*buffer; mazeadd->xdim = defmazelen>>1; mazeadd->ydim = defmazelen>>1; mazeadd->setlist = NULL; mazeadd->bitlist = NULL; if ((buffer = cbuffer = (char *) malloc(10000U)) == NULL) return FALSE; for(i=0;i= 3) && (dim <= BPL-1) /* && (dim % 2 == 1) */ ) { for(i=0;i<=dim;i++,cbuffer += BPL) { if ((flag = fscanf(handle,"%s",cbuffer)) == EOF) break; } fclose(handle); if(i == dim) { mazeadd->xdim = dim/2; mazeadd->ydim = dim/2; ret = work_maze(mazeadd,buffer); } } } free(buffer); return ret; } /************************************************* * translate ASCII-definition into internal format */ static int work_maze(MAZE *mazeadd,char* buffer) { int (*hfeld)[MAZEDIMENSION],(*vfeld)[MAZEDIMENSION]; int dimension,i,j,i1,j1,err_x=0,err_y=0,c; hfeld = mazeadd->hwalls; vfeld = mazeadd->vwalls; dimension = (mazeadd->xdim)*2+1; for(j1=0,j=0;(j= '1' && c <= '9') { if ( (*(buffer+i1+j1*BPL) != 'X') || (*(buffer+i1+2+j1*BPL) != 'X')) { err_x = i1+2; err_y = j1+1; break; } hfeld[j][i] = (c - '0') | MAZE_BLOCK_PLAYER | MAZE_BLOCK_SHOT; } else { err_x = i1+2; err_y = j1+1; } break; } c = *(buffer+j1+(i1+1)*BPL); switch(c) { case 'X': if((*(buffer+j1+i1*BPL) != 'X') || (*(buffer+j1+(i1+2)*BPL) != 'X')) { err_x = j1+1; err_y = i1+2; break; } vfeld[i][j] = 0xe | MAZE_BLOCK_PLAYER | MAZE_BLOCK_SHOT; break; case '.': vfeld[i][j] = 0; break; default: if(c >= '1' && c <= '9') { if((*(buffer+j1+i1*BPL) != 'X') || (*(buffer+j1+(i1+2)*BPL) != 'X')) { err_x = j1+1; err_y = i1+2; break; } vfeld[i][j] = (c - '0') | MAZE_BLOCK_PLAYER | MAZE_BLOCK_SHOT; } else { err_x = j1+1; err_y = i1+2; } break; } } } if(err_x == 0) return TRUE; printf("mazeerror at: x(%d) y(%d)\n",err_x,err_y); return FALSE; } int random_maze(MAZE *mazeadd,int size,int wlen) { int m[4][2] = { { 0,1 }, {1,0} , {-1,0} , {0,-1} }; int (*hfeld)[MAZEDIMENSION],(*vfeld)[MAZEDIMENSION]; int r,i,j,cnt; char bitlist[MAZEDIMENSION][MAZEDIMENSION]; if((size < 2) || (size >= MAZEDIMENSION)) return FALSE; hfeld = mazeadd->hwalls; vfeld = mazeadd->vwalls; memset((char*) hfeld,0,MAZEDIMENSION*MAZEDIMENSION*sizeof(int)); memset((char*) vfeld,0,MAZEDIMENSION*MAZEDIMENSION*sizeof(int)); memset(bitlist,0,MAZEDIMENSION*MAZEDIMENSION*sizeof(char)); mazeadd->xdim = size; mazeadd->ydim = size; mazeadd->setlist = NULL; mazeadd->bitlist = NULL; for(i=0;i 0) { int x=0,y=0,l=0; r = (size-1)*(size-1); cnt = 30000; while( (r>1) && (--cnt>0) ) { if(l == 0) { x = (rand() % (size-1)) + 1; y = (rand() % (size-1)) + 1; if(!bitlist[x][y]) { bitlist[x][y] = 1; r--; l = wlen; } } if(l > 0) { int m1[4][2]; for(i=0,j=0;i<4;i++) { m1[j][0] = x+m[i][0]; m1[j][1] = y+m[i][1]; if(!bitlist[m1[j][0]][m1[j][1]]) j++; } if(j) { l--; j = rand() % j; if(x != m1[j][0]) { if(x #endif #include #include #include #include #include #include #include #include #include #include #include #include "netmaze.h" #ifdef USE_IPC #include #include #endif #ifdef USE_IPC struct shared_struct *sm; #else struct shared_struct shared_data; struct shared_struct *sm = &shared_data; #endif extern void draw_screen(void); extern void move_all(PLAYER*,int*); static void usage(FILE *s); static void init_program(int,char**); static void start_signal(void),solo_timer(int); static void setup_struct(void); #ifdef USE_IPC static void setup_sigchild(void),child_signal(int); static int child_pids[4]; #endif /* extern: x11gfx.c & x11cntrl.c */ extern void x11_init(int,char**); extern void x11_cntrl(void); extern void x11_flush(void); extern void draw_end(PLAYER *play,int nr); extern void draw_info(void); extern void draw_status(int,PLAYER*); extern void draw_kills(int,PLAYER*); /* extern: network.c */ extern int init_net(char*); /* extern: maze.c */ extern int create_maze(MAZE*); #ifdef ITIMERVAL struct itimerval value,ovalue; #else struct itimerstruc_t value,ovalue; #endif #ifdef USE_SIGVEC struct sigvec vec,ovec,vecio,ovecio; #else struct sigaction vec,ovec,vecio,ovecio; #endif extern struct timeval notimeout; extern struct fd_mask readmask; void main(int argc,char **argv) { int i,nowait=FALSE; setup_struct(); if(argc != 1) { for(i=1;imapdraw = TRUE; else if((strcmp(argv[i],"-server") == 0) || (strcmp(argv[i],"-s") == 0)) { i++; sm->sologame = FALSE; if(strlen(argv[i]) > 255) { fprintf(stderr,"Hostname too long!!\n"); exit(1); } strcpy(sm->hostname,argv[i]); } else if((strcmp(argv[i],"-help") == 0) || (strcmp(argv[i],"-h") == 0)) { usage(stdout); exit(0); } else if(strcmp(argv[i],"-name") == 0) { i++; if(strlen(argv[i]) >= MAXNAME) { fprintf(stderr,"Name too long. Maximum is %d character.\n",MAXNAME-1); exit(1); } strcpy(sm->ownname,argv[i]); } else if(strcmp(argv[i],"-tiny") == 0) sm->outputsize = 14; else if(strcmp(argv[i],"-small") == 0) sm->outputsize = 13; else if(strcmp(argv[i],"-huge") == 0) sm->outputsize = 11; else if(strcmp(argv[i],"-big") == 0) sm->outputsize = -1; else if(strcmp(argv[i],"-mono") == 0) sm->monomode = TRUE; else if((strcmp(argv[i],"-gray") == 0) || (strcmp(argv[i],"-grey") == 0)) sm->graymode = TRUE; else if(strcmp(argv[i],"-dither") == 0) sm->dithermode = TRUE; else if(strcmp(argv[i],"-nowait") == 0) nowait = TRUE; else if(strcmp(argv[i],"-camera") == 0) sm->camera = TRUE; else if(strcmp(argv[i],"-direct") == 0) sm->directdraw = TRUE; else if(strcmp(argv[i],"-sound") == 0) sm->usesound = TRUE; else if(!strcmp(argv[i],"-privatecmap")) sm->privatecmap = TRUE; else if(!strcmp(argv[i],"-noshmem")) sm->noshmem = TRUE; else if(!strcmp(argv[i],"-texture")) { sm->texturemode = TRUE; sm->privatecmap = TRUE; } else if(strcmp(argv[i],"-comment") == 0) { i++; if(strlen(argv[i]) >= MAXCOMMENT) { fprintf(stderr,"Comment too long. Maximum is %d character.\n",MAXCOMMENT-1); exit(1); } strcpy(sm->owncomment,argv[i]); } else { usage(stderr); exit(1); } } } #ifndef USE_SOUND if(sm->usesound) fprintf(stderr,"You haven't compiled netmaze with USE_SOUND.\n"); #endif if(sm->sologame && sm->usesound) { sm->usesound = FALSE; fprintf(stderr,"It's not possible to use sound in the solo testmode.\n"); } if( (sm->monomode + sm->graymode + sm->dithermode) > 2 ) { fprintf(stderr,"Sorry .. only -mono OR -gray OR -dither is allowed\n"); exit(1); } if( sm->texturemode && (sm->monomode || sm->graymode || sm->dithermode)) { fprintf(stderr,"Warning: Textures only usefull in colormode yet.\n"); } /* init Default-Maze */ create_maze(&(sm->std_maze)); /* Signals,Gfx,Network,(IPC:fork),keyboard initialisieren */ init_program(argc,argv); if(sm->sologame) { printf("Press '1' to start game!\n"); } else { printf("OK .. now wait for serverstart\n"); } /**** beginning of the mainloop (endless) ****/ while(!sm->exitprg) { int waitselect; #ifdef USE_IPC if(sm->sologame) x11_cntrl(); #else x11_cntrl(); #endif if(nowait) waitselect = FALSE; else waitselect = TRUE; if(sm->bgdraw) { draw_info(); sm->bgdraw = FALSE; x11_flush(); } if((sm->screendraw) && (sm->redraw)) { if(sm->drawwait >= DRAWWAIT) { sm->redraw = FALSE; sm->drawwait = 0; draw_screen(); waitselect = FALSE; } } if((sm->winnerdraw) && (sm->redraw)) { sm->redraw = FALSE; draw_end(sm->playfeld,sm->winner); /* does XSync() */ } if((sm->statchg2) && (!sm->gameflag)) /*update Screen after the Gameover*/ { sm->statchg = TRUE; sm->statchg2 = FALSE; draw_status(-1,sm->playfeld); x11_flush(); } if((sm->killchg) && (!sm->gameflag)) /*update Screen after the Gameover*/ { draw_kills(sm->shownumber,sm->playfeld); x11_flush(); } if(waitselect) /* test! only a timeout-wait yet */ { /* this reduces the load enormous :) */ struct timeval timeout; #ifdef USE_IPC if(sm->gameflag) { timeout.tv_sec = 0; timeout.tv_usec = 1000; /* lower than the minval on most machines */ } else { #endif timeout.tv_sec = 0; /* in NON-IPC versions, the SIGIO-Signal */ timeout.tv_usec = 100000; /* also exits the select-command */ #ifdef USE_IPC } #endif select(0,NULL,NULL,NULL,&timeout); } } XCloseDisplay(sm->grafix.display); } /***************************/ /* Programm init */ /***************************/ static void init_program(int argc,char **argv) { x11_init(argc,argv); if(sm->sologame) start_signal(); else { #ifdef USE_IPC int fd[2]; setup_sigchild(); if(pipe(fd) < 0) { perror("pipe"); exit(1); } if( (child_pids[0] = fork()) == 0) { close(fd[1]); if( (child_pids[1] = fork()) == 0) { /* we use a pipe to check if the daddy is dead: */ dup2(fd[0],0); /* I'm no unix-guru, so if you know a better way, */ close(fd[0]); /* pls. let me know (perhaps with a processgroup */ init_net(sm->hostname); /* <- should be neverending */ exit(1); /* <- but sure is sure :-) */ } close(fd[0]); x11_cntrl(); exit(1); } if(child_pids[0] < 0) { perror("fork"); exit(1); } close(fd[0]); #else if(init_net(sm->hostname) < 0) { fprintf(stderr,"nm: Networkproblems\n"); exit(1); } #endif } } /********************************* * Setup Signals */ static void start_signal(void) { #ifdef USE_SIGVEC struct sigvec vec; #else struct sigaction vec; #endif value.it_value.tv_sec = 1; value.it_interval.tv_sec = 0; #ifdef ITIMERVAL value.it_value.tv_usec = 0; value.it_interval.tv_usec = DRAWTIME; #else value.it_value.tv_nsec = 0; value.it_interval.tv_nsec = DRAWTIME; #endif setitimer(ITIMER_REAL,&value,&ovalue); #ifdef USE_SIGVEC vec.sv_handler = (void (*)(int)) solo_timer; vec.sv_mask = 0; vec.sv_flags = 0; if ( sigvector(SIGALRM, &vec, &ovec) == -1) perror("SIGALRM\n"); #else vec.sa_handler = (void (*)(int)) solo_timer; #ifdef RS6000 /* ibm rs/6000 */ sigemptyset(&vec.sa_mask); #else vec.sa_mask = 0; #endif vec.sa_flags = 0; if ( sigaction(SIGALRM, &vec, &ovec) == -1) perror("SIGALRM\n"); #endif } /*********************************++ * SIG-CHILD */ #ifdef USE_IPC static void setup_sigchild(void) { #ifdef USE_SIGVEC struct sigvec vec; vec.sv_handler = (void (*)(int)) child_signal; vec.sv_mask = 0; vec.sv_flags = 0; if ( sigvector(SIGCHLD, &vec, NULL) == -1) perror("SIGCHLD\n"); #else struct sigaction vec; vec.sa_handler = (void (*)(int)) child_signal; #ifdef RS6000 /* ibm rs/6000 */ sigemptyset(&vec.sa_mask); #else vec.sa_mask = 0; #endif vec.sa_flags = 0; if ( sigaction(SIGCHLD, &vec, NULL) == -1) perror("SIGCHLD\n"); #endif } static void child_signal(int sig) { int pid; int status=0; pid = wait(&status); fprintf(stderr,"sigchild: pid: %d status: %d\n",pid,status); exit(1); } #endif /************************************ * Solomode Timerfunction */ static void solo_timer(int sig) { if((sm->gameflag) && (sm->sologame)) { sm->sticks[sm->joynumber] = sm->ownstick; /* TEST */ move_all(sm->playfeld,sm->sticks); } } /****************************************** * Setup Shared-Struct */ static void setup_struct(void) { char *s; #ifdef USE_IPC int shmid; if((shmid = shmget (IPC_PRIVATE,(sizeof(struct shared_struct)+0xfff)&0xfffff000, 01600)) < 0) /* we allocate whole 4K buffs */ { perror ("shmget"); exit(1); } sm = (struct shared_struct *) shmat(shmid,NULL,0); if(sm == (struct shared_struct *) -1) { perror("shmat"); exit(1); } memset(sm,0,sizeof(struct shared_struct)); sm->shmid = shmid; #else memset(sm,0,sizeof(struct shared_struct)); #endif sm->gameflag = FALSE; sm->winner = 0; sm->sologame = TRUE; sm->mapdraw = FALSE; sm->debug = FALSE; sm->anzplayers = sm->numteams = 8; sm->shownumber = sm->shownumbertmp = 0; sm->joynumber = 0; sm->outputsize = 12; sm->monomode = FALSE; sm->graymode = FALSE; sm->drawwait = 0; sm->statchg = FALSE; sm->exitprg = FALSE; sm->bgdraw = TRUE; sm->redraw = FALSE; sm->screendraw = FALSE; sm->winnerdraw = FALSE; sm->newmap = FALSE; sm->locator = FALSE; #ifdef SH_MEM sm->noshmem = FALSE; #else sm->noshmem = TRUE; #endif if((s=getenv("NETMAZE_NAME"))!=NULL) { if(strlen(s) > 15) fprintf(stderr,"NETMAZE_NAME too long!\n"); else strcpy(sm->ownname,s); } else strcpy(sm->ownname,"Mr. No-Name"); if((s=getenv("NETMAZE_COMMENT"))!=NULL) { if(strlen(s) > 31) fprintf(stderr,"NETMAZE_COMMENT too long!\n"); else strcpy(sm->owncomment,s); } else strcpy(sm->owncomment,"Have a nice day!"); } static void usage(FILE *s) { fprintf(s,"Usage: netmaze [ -s| -server servername] [ -h | -help ] [-name ]\n"); fprintf(s," [-tiny|-small|-huge|-big] [-mono|-gray|-dither] [-map] [-camera]\n"); fprintf(s," [-comment ] [-nowait] [-sound] [-texture]\n"); fprintf(s," tiny/small/huge: Select a screensize.\n"); fprintf(s," server: Hostname on which the netserv runs.\n"); fprintf(s," name: Sets the playername.\n"); fprintf(s," comment: Sets the comment (if you kill someone).\n"); fprintf(s," map: Enables the rotatemap.\n"); fprintf(s," mono: Selects the Mono-Mode (on colourterminals).\n"); fprintf(s," grey/gray: Selects the Greyscale-Mode.\n"); fprintf(s," dither: Selects the (Smiley)-Dither-Mode.\n"); fprintf(s," nowait: Disable the select-timeout (test).\n"); fprintf(s," camera: Connect server in cameramode.\n"); fprintf(s," texture: Enable texture mode (needs at least 8bit colour).\n"); fprintf(s," sound: Enable sound (if compiled with USE_SOUND).\n\n"); fprintf(s,"Important keys for the game:\n"); fprintf(s," Cursor Up/Down/Left/Right: Move Smiley.\n"); fprintf(s," Shift+(Left/Right): Slow Smileyrotate .\n"); fprintf(s," Space: Shoot.\n"); fprintf(s," l: Enable/Disable locator.\n"); fprintf(s," c: Makes your smiley invisible (if allowed by server).\n"); fprintf(s," m: Enable/Disable newstylemap (with radar).\n"); fprintf(s," return: Enable/Disable radar for newstylemap (if allowed by server).\n"); fprintf(s," p: Switch view.\n"); fprintf(s," j: Switch joystick (only solomode).\n"); fprintf(s," Q: Quit game.\n"); } netmaze-0.81+jpg0.82.orig/netmaze.h0100600000175000017500000002054505553565362017211 0ustar jgoerzenjgoerzen#include #include #include /*********************/ #include "config.h" /* check out config.h for configuration */ /*********************/ #define NETMAZEPORT 12346 #define TRUE 1 #define FALSE 0 #define DRAWWAIT 1 /* 1 = Draw 3D-view every 'heart-beat' (if possible)*/ #define DRAWTIME 36000L /* time per 'heart-beat' in microsec */ #define WINKEL_STEP 4 /* Rotate-Step (don't change) */ #define MAX_WINKEL 256 /* maximum-angel (don't change) */ #define XMAX 320*4096 /* internal x-resolution (right-border) */ #define XMIN -320*4096 /* internal X-resolution (left-border)*/ #define IMAGEWIDTH 1280 #define IMAGEHEIGHT 810 #define WXSIZE (sm->grafix.gamewidth) #define WYSIZE (sm->grafix.gameheight) #define WXHALF (WXSIZE>>1) #define WYHALF (WYSIZE>>1) #define SCREEN 360 /* relativ position of the Screen (3D) */ #define FLUCHT (-80) /* */ #define WALLHEIGHT 80 /* wall-height / 2 */ #define SMILEYHEIGHT 100 /* Smileyheight */ #define SHOTHEIGHT 40 /* shotheight */ #define SMSCALE 1.6 #define STSCALE 4.0 #define MAXPLAYERS 32 /* max. players (don't change) */ #define MAXSHOTS 16 #define MAZEDIMENSION 64 /* Groesse eines Mazes (maximal) */ #define BPL 128 /* Bytes per Line (Maze) */ #define SCALE 20 /* Vergroesserungsfaktor (Screen) */ #define SICHTWEITE 11 /* visual range in fields */ #define JOY_UP 0x01 /* OR-Codes for Joy-Values */ #define JOY_DOWN 0x02 #define JOY_LEFT 0x04 #define JOY_RIGHT 0x08 #define JOY_RADAR 0x10 #define JOY_HIDE 0x20 #define JOY_SLOW 0x40 #define JOY_BUTTON 0x80 #define PRADIUS 0x40 #define SRADIUS 0x20 #define SHOTPOWER 1000 /* classic */ #define STARTFITNESS 2000 #define RECHARGETIME 36 /* classic */ #define REFITSPEED 2 #define DEADTIME 200 #define WINNERANZ 10 #define MAXNAME 16 #define MAXCOMMENT 32 #define MAPSIZE 100 /* GAME-MODES ('-' = not used) */ #define GM_CLASSIC 0x0000 /* no options selectd */ #define GM_REFLECTINGSHOTS 0x0001 /* shots can bounce */ #define GM_DECAYINGSHOTS 0x0002 /* shots lose power */ #define GM_MULTIPLESHOTS 0x0004 /* allow more than one shot */ #define GM_WEAKINGSHOTS 0x0008 /* shooting weaks the player */ #define GM_REPOWERONKILL 0x0010 /* - repower player, if he kills an enemy */ #define GM_FASTRECHARGE 0x0020 /* faster recharg */ #define GM_FASTWALKING 0x0040 /* double-speed-walking */ #define GM_SHOWGHOST 0x0080 /* - ghostmode */ #define GM_ALLOWHIDE 0x0100 /* allow hideing */ #define GM_ALLOWRADAR 0x0200 /* allow radar */ #define GM_DESTRUCTSHOTS 0x1000 /* - destruct shots on kill */ #define GM_DECSCORE 0x2000 /* - decrease score of a killed player */ #define GM_RANKSCORE 0x4000 /* - rankingdependend score-bonus */ /* maze-data defines: */ #define MAZE_TYPEMASK 0x000f #define MAZE_BLOCK_PLAYER 0x0010 #define MAZE_BLOCK_SHOT 0x0020 struct fd_mask { u_long fds_bits[NOFILE/32+1]; }; /* Structur auf MAZE. Here is all important maze-stuff */ typedef struct { /* MAZE *prev_maze; MAZE *next_maze; */ int hwalls[MAZEDIMENSION][MAZEDIMENSION]; int vwalls[MAZEDIMENSION][MAZEDIMENSION]; int xdim; int ydim; char *setlist; long *bitlist; } MAZE; /* PLAYER-Struct */ typedef struct { long sx; long sy; long sxd; long syd; int salive; long power; int next; /* next shot in chain */ int last; /* last shot in chain */ } SHOT; typedef struct { int gamemode; int shots; int hits; int kills; int ownhits; int ownkills; int hitpnt; int hitby[64]; int hitpower[64]; } STATISTIC; typedef struct { short shot_power; short shot_weaking; short bounce_decay; /* 16384 = 1.0 */ short shot_decay; /* ! */ short startfitness; /* ! */ short deadtime; /* ! */ short max_shots; short repower; /* ! */ short rechargetime; /* ! */ short recolour_delay; /* ! */ short angle_step; /* ! */ short kills2win; /* ! */ int divider; /* ! */ int armageddon; /* time before armageddon is activated */ } CONFIG; typedef struct { char name[MAXNAME+1]; char comment[MAXCOMMENT+1]; int team; long x; long y; int winkel; int fitness; int follow; int hide,radar; int ownkills; /* number of deaths */ int ownkiller; /* playernumber of latest killer */ int killanz; /* number of kills */ int killtable[256]; /* table of killed players */ int alive; /* alive? */ SHOT shots[MAXSHOTS]; int shotqueue1; int shotqueue2; int numofshots; int recharge; int hitbycnt; int hitby; int statchg; /* Status changed .. (redraw) */ int killchg; int active; STATISTIC stat; } PLAYER; typedef struct { int kills; char teamname[MAXNAME+1]; } TEAM; typedef struct { int x1,h1; int x2,h2; int ident; int rclip,lclip; long xd,yd; long rmax,rmin; int clipped; /* need for texture */ } WALL; typedef struct { Display *display; Display *display1; int screen; Window root; Drawable gamefg; Drawable gamebg; int gamewidth; int gameheight; Drawable statusfg; Drawable killfg; Drawable mapfg; Drawable mapbg; Colormap cmap; GC gc; XImage *ximg; char *imagebuf; XWindowAttributes attribute; XSizeHints shint; XSizeHints sthint; XSizeHints khint; } GRAFIX; typedef struct { GC xgc; GC facegc; XColor col; } PGRAFIX; struct texture { char *data; /* buffer */ char **datatab; /* pointertab */ char *jmptab; /* jumptab */ char *jmptabh; /* jmptab , halfheight */ short (*divtab)[2]; short (*divtabh)[2]; int width; /* texturewidth */ int height; /* tetxureheight */ int hshift; /* textureheight shift (*height) */ int hshifth; /* hshift, halfheight */ int wshift; /* widthshift */ int jshift; /* jumptableshift */ int jshifth; /* jumptableshifthalf */ int hhalf; /* half height */ int whalf; /* half width */ int hmask; /* height mask (height-1) */ int wmask; /* width mask */ int hmaskh; /* hmask half height */ int precalc; /* have precalculated datas? */ }; typedef struct mapmark { int x,y; int player; } mapmark; struct shared_struct /* the most should be volatile */ { int shmid; /* Shared Memory id */ char ownname[MAXNAME+1]; /* Playername */ char owncomment[MAXCOMMENT+1]; /* Comment, if you kill another one */ char hostname[256]; /* Remotehostname */ volatile int winner; /* Winner-Number */ int anzplayers; /* Number of Players */ int numteams; /* Number of Teams */ int shownumber,shownumbertmp; /* Player-View-Number */ int joynumber; /* Player-Joy-Number (Solo) */ int gamemode; /* GAME-MODES: not supported yet */ CONFIG config; /* important configurevalues */ int armageddon; PLAYER playfeld[MAXPLAYERS]; /* Player-Data-Field */ PLAYER playfeld1[MAXPLAYERS]; /* Copy */ TEAM teams[MAXPLAYERS]; /* team-data */ PGRAFIX pgfx[MAXPLAYERS]; /* Player-Grafix-datas */ int sticks[MAXPLAYERS]; /* Stick/Cursor/Mouse-Data */ int ownstick; /* Joystick-Data on this machine */ MAZE std_maze; /* MAZE-DATA */ GRAFIX grafix; /* Grafix-(X11)-Data */ XSegment maplines[1000]; /* Map-Line-Buffer */ int anzlines; int marks; /* # markers */ mapmark markers[32]; /* Map markers */ int rndshiftpos; /* Random */ long rndshifttab[55]; /* more random-stuff */ volatile unsigned long drawwait; /* delay Draw .. */ /* flags */ volatile int gameflag:1; /* Game-is-running-flag */ int exitprg:1; /* Exitflag */ int bgdraw:1,redraw:1; /* Mainwindowredrawflag */ int screendraw:1,winnerdraw:1; /* more Mainwindowredrawflags */ int statchg:1,statchg1:1,statchg2:1; /* Statusredrawflags */ int killchg:1; /* Killsredrawflags */ int sologame:1,mapdraw:1,debug:1; /* Solomode-,Mapdraw-,Debugflag */ int newmap:1,locator:1; int monomode:1,graymode:1,dithermode:1; /* Screenoutputflags */ int camera:1,directdraw:1,usesound:1; /* client in camera-mode,no bg,sound */ int texturemode:1,privatecmap:1; int noshmem:1; int outputsize; /* Outputsize */ }; netmaze-0.81+jpg0.82.orig/network.c0100600000175000017500000001615105543551206017217 0ustar jgoerzenjgoerzen/* * slave-network-handler */ #include #include #include #include #include #include "netmaze.h" #include "netcmds.h" #include "network.h" #define TRUE 1 #define FALSE 0 extern struct shared_struct *sm; static void handle_packet(char *buf,int len); static void send_owndata(void); void send_owncomment(void); static void send_ownready(void); static void send_ident(void); static void send_end(void); static void send_addplayer(void); static void send_join(void); extern void move_all(PLAYER*,int*); extern void run_game(MAZE*,PLAYER*); extern void myrandominit(long); extern void inactivate_player(int); extern void activate_player(int); extern int own_socket; /* streams socket descriptor */ struct robot_functions robot = { 0, } ; /****************************************************** * send the ident/add/join stuff (also used by robot.c) */ void ident_player(void) { send_ident(); send_addplayer(); send_join(); send_owncomment(); } /************************************************** * handle the incoming data (also used by robot.c) */ void handle_socket(void) { static char buf[256]; int count,len; static int frag=0,fraglen; if(frag > 0) { /* we allow exact 1 fragmentation (our messages aren't long) */ if((count = recv(own_socket,buf+fraglen,frag,0)) != frag) { fprintf(stderr,"Major protocoll-error: %d!!\n",buf[0]); exit(1); } fprintf(stderr,"Tried to handle fragmentation\n"); handle_packet(buf,fraglen+frag); frag = 0; return; } else if( (count = recv(own_socket,buf,1,0)) != 1) /* nicht optimal */ { if(count == 0) { fprintf(stderr,"I've lost the Server-Connection\n"); exit(3); } fprintf(stderr,"IO: error reading ident\n"); return; } if((len = (int) nm_field[(unsigned char)*buf]) > 0) { if(len > 1) { count = recv(own_socket,buf+1,len-1,0); if(count != len-1) { fprintf(stderr,"IO: wrong length: %d %d\n",len-1,count); if(count >= 0) { frag = len - 2 - count; fraglen = count + 2; return; } } } handle_packet(buf,len); } else { if((count = recv(own_socket,buf+1,1,0)) != 1) /* nicht optimal */ { fprintf(stderr,"IO: error reading blklen\n"); return; } len = (int) buf[1]; if(len > 2) { if((count = recv(own_socket,buf+2,len-2,0)) != (len-2) ) { fprintf(stderr,"IO-1: wrong length - possibly fragmented %d %d %d %d\n",len-2,count,(int) buf[0],(int) buf[1]); if(count >= 0) { frag = len - 2 - count; fraglen = count + 2; return; } } } handle_packet(buf,len); } } /************************************* * handle packets */ static void handle_packet(char *buf,int len) { char data[1]; int (*hfeld)[MAZEDIMENSION],(*vfeld)[MAZEDIMENSION]; int i,j; long randbase; switch(*buf) { case NM_STARTGAME: sm->anzplayers = (int) buf[2]; sm->shownumber = sm->shownumbertmp = (int) buf[3]; sm->numteams = (int) buf[6]; for(i=0;ianzplayers;i++) { sm->playfeld[i].team = buf[16+i]; } randbase = (long) (unsigned char) buf[5]; randbase += ((long) (unsigned char) buf[4]) << 8; myrandominit(randbase); sm->gamemode = (unsigned char) buf[7]; sm->gamemode += ((int)(unsigned char)buf[8])<<8; sm->config.divider = (int) buf[9]; nm_field[NM_ALLDATA] = (char) sm->anzplayers + 1; run_game(&(sm->std_maze),sm->playfeld); if(robot.valid) (robot.start)(sm->shownumber); if(!sm->camera) send_ownready(); sm->gameflag = TRUE; break; case NM_STOPGAME: if(sm->gameflag) { sm->gameflag = FALSE; sm->winnerdraw = FALSE; sm->bgdraw = TRUE; sm->screendraw = FALSE; } break; case NM_MAZEH: hfeld = sm->std_maze.hwalls; sm->std_maze.xdim = (int) buf[2]; i = (int) buf[3]; for(j=0;jstd_maze.xdim;j++) { hfeld[i][j] = (int) buf[j+4]; } break; case NM_MAZEV: vfeld = sm->std_maze.vwalls; sm->std_maze.ydim = (int) buf[2]; i = (int) buf[3]; for(j=0;jstd_maze.ydim;j++) { vfeld[j][i] = (int) buf[j+4]; } break; case NM_ALLDATA: for(i=0;ianzplayers;i++) sm->sticks[i] = (int) buf[i+1]; move_all(sm->playfeld,sm->sticks); if(robot.valid) sm->ownstick = (robot.action)(); if(sm->gameflag) { if(!sm->camera) send_owndata(); } else send_end(); break; case NM_MESSAGE: fprintf(stderr,"%s\n",buf + 6); break; case NM_ALLNAMES: strncpy(sm->playfeld[(unsigned char) buf[2]].name,buf+3,buf[1]-3); sm->playfeld[(unsigned char)buf[2]].name[(int)(unsigned char)buf[1]-3] = 0; break; case NM_PING: data[0] = NM_PONG; send(own_socket,&data,1,0); break; case NM_ALLCOMMENTS: strncpy(sm->playfeld[(int) (unsigned char) buf[2]].comment,buf+3,buf[1]-3); sm->playfeld[(int)(unsigned char)buf[2]].comment[(int)(unsigned char)buf[1]-3] = 0; break; case NM_ACTIVATE: activate_player((int) buf[2]); break; case NM_INACTIVATE: inactivate_player((int) buf[2]); break; } } static void send_owndata(void) { char data[2]; data[0] = NM_OWNDATA; data[1] = (char) sm->ownstick; send(own_socket,data,2,0); } static void send_ownready(void) { char data = NM_READY; send(own_socket,&data,1,0); } void send_owncomment(void) { char buf[100]; buf[0] = NM_OWNCOMMENT; buf[1] = strlen(sm->owncomment)+2; strcpy(buf+2,sm->owncomment); send(own_socket,buf,buf[1],0); } static void send_ident(void) { char buf[10]; if(!sm->camera) { buf[1] = (char) ((PLAYERMAGIC>>24) & 0xff); buf[2] = (char) ((PLAYERMAGIC>>16) & 0xff); buf[3] = (char) ((PLAYERMAGIC>>8) & 0xff); buf[4] = (char) (PLAYERMAGIC & 0xff); } else { buf[1] = (char) ((CAMMAGIC>>24) & 0xff); buf[2] = (char) ((CAMMAGIC>>16) & 0xff); buf[3] = (char) ((CAMMAGIC>>8) & 0xff); buf[4] = (char) (CAMMAGIC & 0xff); } buf[0] = NM_SETMODE; send(own_socket,buf,5,0); } /* static void send_docommand(char *c,int len) { char data[256]; data[0] = NM_DOCOMMAND; data[1] = len+2; memcpy(data+2,c,len); send(own_socket,data,data[1],0); } */ static void send_end(void) { char data[] = { NM_END }; send(own_socket,data,1,0); } static void send_addplayer(void) { char data[32]; data[0] = NM_ADDPLAYER; data[1] = strlen(sm->ownname)+5; data[2] = 0; data[3] = 1; strcpy(data+4,sm->ownname); send(own_socket,data,data[1],0); } static void send_join(void) { char data[4]; data[0] = NM_JOIN; data[1] = 0; data[2] = 1; data[3] = 1; send(own_socket,data,4,0); } netmaze-0.81+jpg0.82.orig/network.h0100600000175000017500000000142305551746572017233 0ustar jgoerzenjgoerzen #define SUBSERVMODE 1 #define PLAYERMODE 2 #define CAMMODE 3 /* #define CAMMAGIC 0x47115d1eL #define SUBSERVMAGIC 0x08151234L #define PLAYERMAGIC 0x17121970L */ /* V0.8 - magics: this avoids bugs, because of different versions */ #define CAMMAGIC 0x4d696b60L #define SUBSERVMAGIC 0x78531930L #define PLAYERMAGIC 0x77554712L /* void pushlong(char *s,long w) { s[0] = ((unsigned long) w)>>24; s[1] = ((unsigned long) w)>>16; s[2] = ((unsigned long) w)>>8; s[3] = ((unsigned long) w); } long poplong(char *s) { w = ((unsigend long) s[0]<<24) + ((unsigend long) s[1]<<16) + ((unsigend long) s[2]<<8) + ((unsigend long) s[3]) return((long) w); } */ struct robot_functions { int valid; void (*init)(void); void (*start)(int); int (*action)(void); }; netmaze-0.81+jpg0.82.orig/mazes/0040700000175000017500000000000005553562507016505 5ustar jgoerzenjgoerzennetmaze-0.81+jpg0.82.orig/mazes/random03.maz0100600000175000017500000000007305447311605020631 0ustar jgoerzenjgoerzen06 XXXXXXX X.....X X.X...X X.X...X X.XXX.X X.....X XXXXXXX netmaze-0.81+jpg0.82.orig/mazes/random08.maz0100600000175000017500000000046505447311605020643 0ustar jgoerzenjgoerzen16 XXXXXXXXXXXXXXXXX X.....X.........X X.XXX.X.XXXXXXX.X X.X.....X.....X.X X.X.XXX.X.XXX.X.X X.X.............X X.XXXXX.X.XXXXX.X X.......X.....X.X X.X.X.XXX.XXX.X.X X.X.X.........X.X X.X.X.XXXXX.XXX.X X.........X.X...X X.X.XXX.X.X.X.X.X X.X.....X.X...X.X X.XXXXXXX.XXX.X.X X...............X XXXXXXXXXXXXXXXXX netmaze-0.81+jpg0.82.orig/mazes/stipple18.maz0100600000175000017500000000260105447311606021037 0ustar jgoerzenjgoerzen36 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X...................................X X.XXX.X.XXX...X.XXX...X.XXX.X.X.XXX.X X.X...X.X.....X...X...X.....X.X.X...X X.X...X.X.X.XXX...X.X.X.XXX.X.X.X.X.X X.....X...X.........X...X...X.....X.X X...X.X.X.X.X.XXX...X.X.X.X.X.XXX.X.X X...X...X...X...X.....X...X.....X...X X.X.X.X.XXX.XXX.X.XXX.XXX.XXX...X.X.X X.X...X...........X...............X.X X.XXX.XXX.XXX.XXX.X.XXX.X.XXX.XXX.X.X X...........X...........X.......X...X X.XXX.XXX.X.X.XXX.XXX.X.X.XXX.X.X...X X.X.......X...........X.......X.....X X.X...X...X.XXX...X...X.X.XXX.X.XXX.X X.....X...........X...X.X...........X X.XXX.X.XXX...XXX.XXX.X.X.X.X.XXX.X.X X.X.............X.........X.X.....X.X X.X.XXX.XXX.X...X.X.X.XXX.X.X.X.XXX.X X...X.......X.....X.X.....X.X.X.....X X...X.X...X.X.XXX.X.X.X.X.X.X.X.X.X.X X.....X...X.X.X...X.X.X.X.......X.X.X X.XXX.X.XXX.X.X...X.X.X.X.XXX...X.X.X X.X...............................X.X X.X.X.XXX.X...XXXXX.XXXXX...XXX...X.X X...X.X...X.........................X X...X.X.X.XXX.XXX.X.XXX.XXX.X...XXX.X X.......X.........X...X.....X.......X X.XXX.X.X.XXX.XXX.XXX.X.X...X.XXX...X X.....X.................X.....X.....X X.X.X.X.XXX.XXX.XXX.XXX.X.XXX.X.X.X.X X.X.X.....X.........X...X...X...X.X.X X.X.X.XXX.X.XXXXX.X.X...X.X.X.X.X.X.X X.......X.........X.......X...X.....X X.XXX...X...XXXXX.X.XXXXX.XXX.X.XXX.X X...................................X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX netmaze-0.81+jpg0.82.orig/mazes/stipple19.maz0100600000175000017500000000303305447311606021040 0ustar jgoerzenjgoerzen38 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X.....................................X X.XXX.XXX.X.XXX.XXX.X...XXX.XXX.XXX.X.X X.......X.X.X.......X...............X.X X.XXXXX.X.X.X...XXX.X.X...X.X.X.X...X.X X.....................X...X.X.X.X...X.X X.X...X.XXX.X.XXX.X.X.XXX.X.X.X.XXX.X.X X.X...X.....X.....X.X.........X.......X X.XXX.XXX...X.XXX.X.X.XXX.X.X.X.XXXXX.X X.......................X.X.X.........X X.XXX.X...X.XXX...X.XXX.X.X.XXX...XXX.X X.X...X...X.......X.................X.X X.X...XXX.X.XXX.XXX.XXX.X.XXX.X.XXX.X.X X.........X.........X...X.X...X.......X X...XXXXX.X...XXXXX.X.X.X.X.X.X.XXX...X X.....................X.....X.....X...X X.XXX.X.XXX.XXX.X.XXX.X.XXX.X.X.X.X.X.X X.....X.........X.......X.....X.X...X.X X.X.X.X.X.X.XXX.X.X.XXX.X.XXX.X.X.X.X.X X.X.X.X.X.X...X...X.X.............X...X X.X.X.X.X.XXX.X...X.X.X...XXXXX.X.X...X X.....................X.........X.X...X X.XXX.XXX.XXX.X.XXX.X.X.XXX.X.X.X.X.X.X X.......X.....X.....X.....X.X.X.....X.X X.X.XXX.X.XXX.X.X.XXX.XXX.X.X.X.X.XXX.X X.X...X.........X...............X.....X X.XXX.X...XXXXX.XXX...XXX.X.XXX.X...X.X X.........................X.........X.X X.X.X.X.XXX...X.X.X.X.XXX.XXX.X...X.X.X X.X.X.X...X...X.X.X.X...X.....X...X...X X.X.X.XXX.X.X.X.X.X.XXX.X.XXX.XXX.X.X.X X...........X...X.X.........X.......X.X X.XXX.XXX...X...X.X.X.X.X.X.X.XXXXX.X.X X...................X.X.X.X...........X X.X...X.X.XXX.X.XXX.X.X.X.X...XXX.X.X.X X.X...X.X...X.X.X.....X.X.........X.X.X X.XXX.X.XXX.X.X.X.XXX.X.X.XXXXX.XXX.X.X X.....................................X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX netmaze-0.81+jpg0.82.orig/mazes/random09.maz0100600000175000017500000000057705447311605020650 0ustar jgoerzenjgoerzen18 XXXXXXXXXXXXXXXXXXX X...X.............X X.X.X.XXXXX.XXX.X.X X.X.....X.......X.X X.XXX.X.X.XXX.XXX.X X.....X...X...X...X X.XXXXX.XXX.XXX.X.X X.X.........X...X.X X.X.X.XXXXXXX.X.X.X X.X.X.....X...X...X X.X.X.XXX.X.X.XXX.X X...X...X...X.....X X.X.X.X.X.X.X.XXX.X X.X...X...X.....X.X X.X.XXXXX.X.XXX.X.X X.X.............X.X X.XXXXXXXXX.XXXXX.X X.................X XXXXXXXXXXXXXXXXXXX netmaze-0.81+jpg0.82.orig/mazes/random10.maz0100600000175000017500000000072105447311605020627 0ustar jgoerzenjgoerzen20 XXXXXXXXXXXXXXXXXXXXX X...................X X.XXXXX.X.XXXXX.XXX.X X.X...X.X.....X.....X X.X.X.X.X.XXX.XXXXX.X X...X.X...........X.X X.X.X.X.XXX.XXXXX.X.X X.X...X...X.........X X.XXX.X.X.X.XXX.XXX.X X.......X.....X...X.X X.XXXXX.XXXXX.X.X.X.X X.....X...X...X.X...X X.XXX.X.X.X.X.X.X.X.X X.....X.X...X...X.X.X X.X.XXX.XXXXXXX.X.X.X X.X.X.....X.....X...X X.X.X.XXX.X.XXXXX.X.X X.X.....X...X.....X.X X.XXXXX.XXX.X.XXX.X.X X...................X XXXXXXXXXXXXXXXXXXXXX netmaze-0.81+jpg0.82.orig/mazes/random11.maz0100600000175000017500000000105305450624726020634 0ustar jgoerzenjgoerzen23 XXXXXXXXXXXXXXXXXXXXXXX X.............X.......X X.XXX.XXX.XXX.X.XXXXX.X X...X.X...X...X...X...X X.X.X.X.X.X.X.X.X.X.X.X X.X...X.X...X...X...X.X X.X.XXX.XXXXX.X.XXX.X.X X.......X.....X.....X.X XXXXXXXXX.XXXXX.XXXXX.X X.....................X X.X.XXX.XXX.XXXXXXX.X.X X.X...X.X...X.......X.X X.X.X.X.X.XXX.X.X.XXX.X X.X.X.........X.X.....X X.X.X.X.XXX.XXX.X.XXXXX X.....X...X...........X X.X.XXX.X.XXX.XXX.X.X.X X.X.....X.........X.X.X X.X.XXX.XXXXX.XXX.X.X.X X.X.X...........X...X.X X.X.X.XXXXX.XXX.XXX.X.X X...X.................X XXXXXXXXXXXXXXXXXXXXXXX netmaze-0.81+jpg0.82.orig/mazes/random12.maz0100600000175000017500000000121505447311605020630 0ustar jgoerzenjgoerzen24 XXXXXXXXXXXXXXXXXXXXXXXXX X...........X...........X X.XXX.X.X.X.X.XXX.X.XXX.X X...X.X.X.X.....X.X...X.X XXX.X.X.X.X.X.X.X.X.X.X.X X...X...X.X.X.X.....X.X.X X.XXX.X.X.X.X.XXXXXXX.X.X X.....X.X...X...........X X.X.XXX.X.XXX.XXXXXXXXX.X X.X.X...X.X.............X X.X.X.XXX.X.XXX.X.X.XXX.X X.........X.....X.X...X.X X.X.XXXXX.XXX.XXX.XXX.X.X X.X.X...X.........X.....X X.X.X.X.X.XXX.XXX.X.XXX.X X.X...X.....X.........X.X X.X.X.XXX.X.X.X.XXX.X.X.X X.X.X.....X...X.X...X...X X.X.X.X.XXX.XXX.X.XXX.XXX X.X.X.X.X...............X X.X.X.X.X.XXXXXXX.XXX.X.X X.X...X...........X...X.X X.XXX.XXXXX.X.XXXXX.XXX.X X...........X...........X XXXXXXXXXXXXXXXXXXXXXXXXX netmaze-0.81+jpg0.82.orig/mazes/random13.maz0100600000175000017500000000136705447311605020641 0ustar jgoerzenjgoerzen26 XXXXXXXXXXXXXXXXXXXXXXXXXXX X.......X.................X X.XXXXX.X.XXX.XXX.XXX.X.X.X X.....X...X.......X...X.X.X X.XXX.XXX.X.X.XXXXX.XXX.X.X X.........X.X...........X.X X.X.X.XXX.X.XXX.XXXXX.XXX.X X.X.X.......X.....X.......X X.X.X.XXX.XXX.XXX.X.X.XXX.X X.X.X.X.........X...X.....X X.X.X.X.X.XXX.X.XXX.X.XXX.X X...X...X.....X...X...X...X X.XXX.X.XXXXX.XXX.X.X.X.X.X X.....X.X.......X.X.X...X.X X.XXX.X.X.X.X.X.X.X.XXXXX.X X.....X.X.X.X.X.........X.X X.XXX.X.X.X.X.XXXXX.XXX.X.X X.X.X.X...X...........X...X X.X.X.X.XXX.X.XXXXXXX.XXX.X X.X.X...X...X.X.........X.X X.X.XXX.X.XXX.X.XXXXX.X.X.X X.........X...........X.X.X X.XXX.XXXXX.X.X.XXX.XXX.X.X X.X.........X.X.......X.X.X X.X.XXXXXXXXX.XXXXX.X.X.X.X X...................X.....X XXXXXXXXXXXXXXXXXXXXXXXXXXX netmaze-0.81+jpg0.82.orig/mazes/random18.maz0100600000175000017500000000260105447311605020636 0ustar jgoerzenjgoerzen36 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X.......X...............X.....X.....X X.X.X.X.X.XXX.X.XXX.XXX.X.XXX.X.X.X.X X.X.X.X...X...X.X.........X.....X.X.X X.X.X.XXX.X.XXX.X.XXXXX.XXX.XXX.X.X.X X.......X.X.....X...................X XXX.XXX.X.X.XXX.X.X.XXXXX.XXX.XXX.X.X X.....X.X.....X...X.X...X.X...X...X.X X.XXX.X.XXX.X.XXX.X.X.X.X.X.X.X.XXX.X X.X.........X...X.X...X.....X.X...X.X X.X.XXXXXXX.XXX.X.X.XXX.XXX.X.XXX.X.X X.X.X...X...X.....X.X...X...........X X.X.X.X.X.XXX.X.XXX.X.XXX.XXX.XXX.X.X X.....X.X.X...X.............X...X.X.X X.XXXXX.X.X.XXX.XXX.XXX.XXX.X.X.X.X.X X.....X...X.....X...X...X...X.X...X.X X.X.X.X.XXX.X.XXX.X.X.X.X.XXX.X.XXX.X X.X.X.......X.....X...X.X.X.........X X.X.XXX.XXX.X.XXX.X.X.X.X.X.X.XXXXX.X X.X.......X...X.....X.X.X...X.....X.X X.XXXXXXX.X.XXX.XXX.X.X.X.X.XXX.X.X.X X.....X.........X...X.....X...X.X.X.X XXX.X.X.X.XXXXX.X.XXXXX.XXXXX.X.X.X.X X...X...X.....X.............X.X.X.X.X X.XXXXX.XXXXX.XXX.XXX.X.XXX.X.X.X.X.X X...............X.X...X.X.....X...X.X XXX.XXXXX.X.XXX.X.X.XXX.X.XXX.X.X.X.X X...X.....X...X.................X.X.X X.X.X.XXXXXXX.X.XXX.XXXXX.XXX.XXX.X.X X.X.....................X.X.........X X.X.XXX.XXX.XXXXXXX.XXX.X.X.XXX.XXX.X X.X.....X...X.....X...X...X...X...X.X X.X.XXX.X.XXX.XXX.X.X.XXX.XXX.XXX.X.X X.X...X.X...........X...X.........X.X X.XXX.X.XXX.X.XXX.XXXXX.XXX.XXXXXXX.X X...........X.......................X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX netmaze-0.81+jpg0.82.orig/mazes/stipple21.maz0100600000175000017500000000354705447311606021043 0ustar jgoerzenjgoerzen42 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X.........................................X X.XXX.XXXXX.X...X.X.XXX...XXX.X.X.XXXXX...X X.X.........X...X.X...X.....X.X.X.........X X.X.X...X...X.XXX.X.X.X.XXX.X.X.X.XXX.XXX.X X...X...X...........X...................X.X X.XXX.X.XXX.XXX.X...X.XXX.X...X.XXX.X...X.X X.....X.........X.........X...X.....X.....X X.XXX.X.XXX...XXX.X.X.XXX.X.XXX.X.XXX.X...X X.................X.X...........X.....X...X X.X...XXXXX.X.XXX.X.X.X.XXX.XXX.XXX.X.XXX.X X.X.........X.........X.............X.....X X.X.X...XXX.X.X.XXX.XXX.XXX.XXXXX...XXX.X.X X.X.X...X.....X...X.....................X.X X.X.XXX.X.XXX.X...X.XXX.XXX.XXX.X.XXX...X.X X...........................X...X.........X X.X.X...XXX.X.X.XXX.X.XXXXX.X.X.XXX.XXX.X.X X.X.X.......X.X.....X.........X.......X.X.X X.X.X.XXX...X.X.XXX.X.X.X.XXX.XXX.XXX.X.X.X X.X.X.X.............X.X.X...............X.X X.X.X.X.X.XXX...X.X.X.X.X.X.XXX.X.XXX.X.X.X X.......X.......X.X.......X.....X.....X...X X.X.XXX.X.XXX.XXX.X.X.X...X.XXX.X.X.XXX.X.X X.X...X.............X.X...X.......X.....X.X X.X.X.X.X.XXXXX.X.X.X.XXX.X.X.XXX.XXX.X.X.X X...X...X.......X.X.X.......X.........X...X X...X.X.X...XXX.X.X.X...XXX.X.XXX.XXX.XXX.X X.....X.............................X.....X X.XXX.X...X.XXX.X.X.XXX...XXXXX.XXX.X.XXX.X X.....X...X.....X.X...............X.....X.X X.XXX.X.X.X.X...X.X.X.XXX.X.XXX.X.X.X.X.X.X X.......X...X.......X.....X.....X...X.X...X X.X...X.XXX.X.XXX.XXX...XXX.X.X.XXX.X.XXX.X X.X...X.....................X.X.....X.....X X.X.XXX.XXX.XXX.X.X...XXX.XXX.X...X.X...X.X X.............X.X.X...X...........X.....X.X X...X.X.X.XXX.X.X.X.X.X.XXX.X.X.XXX.X.X.X.X X...X.X.X...X.....X.X.....X.X.X.....X.X.X.X X.X.X.X.X...X.XXX.X.X.XXX.X.X.X.XXX.X.X.X.X X.X.......................................X X.XXX.XXX.XXX.XXX.XXX.XXX...XXXXX.XXXXX...X X.........................................X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX netmaze-0.81+jpg0.82.orig/mazes/random31.maz0100600000175000017500000000770305450624767020653 0ustar jgoerzenjgoerzen63 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X.........X.....................X.................X...........X X.X.XXXXX.X.XXXXX.XXX.XXXXXXXXX.X.X.XXXXXXXXXXXXX.X.X.XXX.XXX.X X.X.....X.X.......X...X.......X...X...X.........X...X.....X...X X.XXX.X.X.X.X.XXXXX.XXX.XXX.X.X.XXX.X.X.XXXXXXX.XXX.XXX.XXX.X.X X.....X.X.X.X.......X...X...X.X...X.X...X.....X...X...X.X...X.X X.XXXXX.X.X.X.XXXXX.X.XXX.XXX.XXX.X.XXXXX.XXX.XXX.X.X.X.X.XXX.X X.X...X.X...X.X...X.........X...X.......X.......X.X.X.X.X.....X X.X.X.X.X.XXX.X.X.X.XXXXXXX.X.X.XXXXXXX.X.XXXXX.X.X.X.X.XXX.XXX X.X.X.X...X...X.X...X.....X...X.......X.........X.X.X.X...X...X X.X.X.X.XXX.XXX.X.XXX.X.X.X.XXX.XXXXX.XXXXXXX.XXX.X.X.XXX.X.X.X X.X.X.X.....X.....X...X.X.....X.....X.......X.....X.....X...X.X X.X.X.XXX.XXX.X.XXX.XXX.X.XXX.X.XXX.X.XXX.X.XXX.X.XXXXX.X.XXX.X X.X.X...X.....X.....X.....X.....X...X.....X...X.X...X...X.....X X.X.X.X.XXXXX.XXX.XXX.XXX.X.XXXXX.XXX.XXXXX.X.X.XXX.X.X.XXX.X.X X.X...X.....X.....X.......X.X.....X...X...X.X.X...X.X.X...X.X.X X.X.X.X.XXX.XXXXX.X.XXXXX.X.X.X.XXX.X.X.X.X.X.XXX.X.X.X.X.X.X.X X.X.X.X...X.....X.......X.X...X.X...X.X.X...X...X.X.X.X.X.X...X X.X.X.XXX.XXX.X.XXXXXXX.X.XXX.X.X.X.X.X.XXXXX.X.X.X.X.X.X.XXXXX X.X.....X.....X.........X...X.X.X.X...X.......X.X...X.X.......X X.XXX.X.X.XXXXX.XXXXX.XXX.X.X.X.X.XXX.X.X.XXXXX.XXXXX.X.XXXXX.X X...X.X.X.......X...X.X...X.....X...X...X.X...X.......X.X...X.X XXX.X.X.XXX.XXXXX.X.X.X.XXX.XXXXX.X.X.XXXXX.X.X.XXXXX.X.X.X.X.X X...X.X.....X.....X.X.X...X...X...X.........X.X.X...X...X.X.X.X X.XXX.X.XXXXX.XXXXX.X.XXX.XXX.X.XXXXXXX.XXX.X.X.X.X.X.XXX.X.X.X X.X...X.X.....X...X.X...X.....X.......X...X.X.....X...X...X...X X.X.XXX.X.X.XXX.X.X.XXX.XXX.X.X.XXXXX.XXX.X.X.XXX.XXX.X.X.XXX.X X.X.....X.X.....X.X...X...X.X.X.X...X...X...X...X.X...X.X...X.X X.XXX.XXX.XXX.XXX.X.X.XXX.X.X.X.X.X.X.X.XXXXXXX.X.X.X.X.XXX.X.X X...X...........X...X.....X.X...X.X...X.........X.X.X.X.....X.X XXX.X.X.XXXXXXX.X.XXXXX.XXX.X.XXX.XXXXX.XXX.XXXXX.X.X.XXXXXXX.X X...X.X...X...X.X.......X.....X.........X...X.....X.X.........X X.XXX.XXX.X.X.X.XXX.XXXXX.XXXXX.XXXXXXX.X.XXX.XXX.X.X.XXXXX.XXX X.X.....X.X.X.X...X.X.....X.....X.....X...X.......X.X.X...X...X X.X.XXX.X.X.X.XXX.X.X.XXX.X.XXXXXXX.X.X.XXX.XXX.XXX.X.X.X.X.X.X X.X...X...X.X...X.....X...X...X.....X.X.......X.X.....X.X.X.X.X X.XXX.X.XXX.XXX.X.XXXXX.X.XXX.X.XXXXX.X.XXXXX.X.X.X.XXX.X.X.X.X X.......X.....X.........X...X.X.......X.X...X...X.X.......X.X.X XXXXXXX.X.XXX.X.XXXXXXXXX.X.X.X.XXXXX.X.X.X.X.XXX.XXX.XXX.X.X.X X.......X.....X.X.........X...X.X...X.X...X.X...X.X.....X.X...X X.XXX.X.X.XXXXX.X.XXXXX.XXX.XXX.X.X.X.XXX.X.XXX.X.X.XXX.X.XXX.X X.X...X.X.X.....X.X...X.X...X.X...X.X...X.....X...X.X...X...X.X X.X.XXX.X.X.XXXXX.X.X.X.X.XXX.X.XXX.XXX.X.XXX.XXXXX.X.XXX.X.X.X X...X.....X.........X...X.X.....X.......X.............X...X.X.X X.XXX.X.XXX.XXXXXXXXXXXXX.X.X.XXX.XXXXX.XXXXX.XXX.XXXXX.X.X.X.X X.X...X.X...X.............X.X.....X...X.....X.....X.....X.X...X X.X.X.X.X.XXX.XXX.XXXXX.X.X.X.XXXXX.X.XXXXX.X.XXX.X.X.XXX.X.X.X X.X.X...X...............X...X.X.....X...X...X...X...X.X.....X.X X.X.XXX.X.XXX.XXXXXXX.XXXXX.X.X.X.X.XXX.X.XXX.X.X.XXX.X.X.XXX.X X.X...X.X...X.X.......X.....X.X.X.X.X...X.X...X.X.X.....X.....X X.X.X.X.XXX.X.X.XXX.X.X.XXXXX.X.X.X.X.XXX.X.XXX.X.X.X.XXXXXXXXX X...X.....X...X.....X.X.X.....X...X...X...X.X...X.X.X.....X...X X.XXXXX.X.X.X.XXXXXXX.X.X.X.X.XXX.XXXXX.XXX.X.XXX.X.XXXXX.X.X.X X.X.X...X.X.X.........X...X.X...X.......X.....X...X.X...X...X.X X.X.X.X.X.X.X.XXX.XXXXX.XXX.X.X.X.X.XXXXX.XXX.X.XXX.X.X.XXXXX.X X.X...X...X...X...X.....X.....X.X.X.X.......X.X.....X.X...X...X X.XXX.XXXXX.XXX.XXX.X.XXX.XXXXX.X.X.X.XXXXX.X.XXX.X.X.X.X.X.X.X X...............X...X.....X.....X...X.X.....X...X.X.X...X.X.X.X X.XXXXX.XXX.XXX.X.XXXXX.XXX.XXX.XXXXX.X.X.XXXXX.X.X.X.XXX.X.X.X X.X...X.....X...X.......X.....X.........X.......X.X...X.....X.X X.X.X.XXXXXXX.X.XXXXXXXXX.XXX.XXXXXXXXXXXXX.XXXXX.XXXXX.X.XXX.X X...X.........X.........................................X.....X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX netmaze-0.81+jpg0.82.orig/mazes/empty11.maz0100600000175000017500000000105305464526163020513 0ustar jgoerzenjgoerzen23 *********************** *.....................* *.....................* *.....................* *.....................* *.....................* *.....................* *.....................* *.....................* *.....................* *.....................* *.....................* *.....................* *.....................* *.....................* *.....................* *.....................* *.....................* *.....................* *.....................* *.....................* *.....................* *********************** netmaze-0.81+jpg0.82.orig/trigtab.h0100600000175000017500000000711505457607462017201 0ustar jgoerzenjgoerzen/* * sin/cos tab (DON'T CHANGE!!) */ long trigtab[] = { 0x00000000,0x00064855,0x000c8fb2,0x0012d520, 0x001917a6,0x001f564e,0x00259020,0x002bc428, 0x0031f170,0x00381704,0x003e33f2,0x00444749, 0x004a5018,0x00504d72,0x00563e69,0x005c2214, 0x0061f78a,0x0067bde5,0x006d7440,0x007319ba, 0x0078ad74,0x007e2e93,0x00839c3c,0x0088f59a, 0x008e39d9,0x0093682a,0x00987fbf,0x009d7fd1, 0x00a26799,0x00a73655,0x00abeb49,0x00b085ba, 0x00b504f3,0x00b96841,0x00bdaef9,0x00c1d870, 0x00c5e403,0x00c9d112,0x00cd9f02,0x00d14d3d, 0x00d4db31,0x00d84852,0x00db941a,0x00debe05, 0x00e1c597,0x00e4aa59,0x00e76bd7,0x00ea09a6, 0x00ec835e,0x00eed89d,0x00f10908,0x00f31447, 0x00f4fa0a,0x00f6ba07,0x00f853f7,0x00f9c79d, 0x00fb14be,0x00fc3b27,0x00fd3aab,0x00fe1323, 0x00fec46d,0x00ff4e6d,0x00ffb10f,0x00ffec43, 0x01000000,0x00ffec43,0x00ffb10f,0x00ff4e6d, 0x00fec46d,0x00fe1323,0x00fd3aab,0x00fc3b27, 0x00fb14be,0x00f9c79d,0x00f853f7,0x00f6ba07, 0x00f4fa0a,0x00f31447,0x00f10908,0x00eed89d, 0x00ec835e,0x00ea09a6,0x00e76bd7,0x00e4aa59, 0x00e1c597,0x00debe05,0x00db941a,0x00d84852, 0x00d4db31,0x00d14d3d,0x00cd9f02,0x00c9d112, 0x00c5e403,0x00c1d870,0x00bdaef9,0x00b96841, 0x00b504f3,0x00b085ba,0x00abeb49,0x00a73655, 0x00a26799,0x009d7fd1,0x00987fbf,0x0093682a, 0x008e39d9,0x0088f59a,0x00839c3c,0x007e2e93, 0x0078ad74,0x007319ba,0x006d7440,0x0067bde5, 0x0061f78a,0x005c2214,0x00563e69,0x00504d72, 0x004a5018,0x00444749,0x003e33f2,0x00381704, 0x0031f170,0x002bc428,0x00259020,0x001f564e, 0x001917a6,0x0012d520,0x000c8fb2,0x00064855, 0x00000000,0xfff9b7ab,0xfff3704e,0xffed2ae0, 0xffe6e85a,0xffe0a9b2,0xffda6fe0,0xffd43bd8, 0xffce0e90,0xffc7e8fc,0xffc1cc0e,0xffbbb8b7, 0xffb5afe8,0xffafb28e,0xffa9c197,0xffa3ddec, 0xff9e0876,0xff98421b,0xff928bc0,0xff8ce646, 0xff87528c,0xff81d16d,0xff7c63c4,0xff770a66, 0xff71c627,0xff6c97d6,0xff678041,0xff62802f, 0xff5d9867,0xff58c9ab,0xff5414b7,0xff4f7a46, 0xff4afb0d,0xff4697bf,0xff425107,0xff3e2790, 0xff3a1bfd,0xff362eee,0xff3260fe,0xff2eb2c3, 0xff2b24cf,0xff27b7ae,0xff246be6,0xff2141fb, 0xff1e3a69,0xff1b55a7,0xff189429,0xff15f65a, 0xff137ca2,0xff112763,0xff0ef6f8,0xff0cebb9, 0xff0b05f6,0xff0945f9,0xff07ac09,0xff063863, 0xff04eb42,0xff03c4d9,0xff02c555,0xff01ecdd, 0xff013b93,0xff00b193,0xff004ef1,0xff0013bd, 0xff000000,0xff0013bd,0xff004ef1,0xff00b193, 0xff013b93,0xff01ecdd,0xff02c555,0xff03c4d9, 0xff04eb42,0xff063863,0xff07ac09,0xff0945f9, 0xff0b05f6,0xff0cebb9,0xff0ef6f8,0xff112763, 0xff137ca2,0xff15f65a,0xff189429,0xff1b55a7, 0xff1e3a69,0xff2141fb,0xff246be6,0xff27b7ae, 0xff2b24cf,0xff2eb2c3,0xff3260fe,0xff362eee, 0xff3a1bfd,0xff3e2790,0xff425107,0xff4697bf, 0xff4afb0d,0xff4f7a46,0xff5414b7,0xff58c9ab, 0xff5d9867,0xff62802f,0xff678041,0xff6c97d6, 0xff71c627,0xff770a66,0xff7c63c4,0xff81d16d, 0xff87528c,0xff8ce646,0xff928bc0,0xff98421b, 0xff9e0876,0xffa3ddec,0xffa9c197,0xffafb28e, 0xffb5afe8,0xffbbb8b7,0xffc1cc0e,0xffc7e8fc, 0xffce0e90,0xffd43bd8,0xffda6fe0,0xffe0a9b2, 0xffe6e85a,0xffed2ae0,0xfff3704e,0xfff9b7ab, 0x00000000,0x00064855,0x000c8fb2,0x0012d520, 0x001917a6,0x001f564e,0x00259020,0x002bc428, 0x0031f170,0x00381704,0x003e33f2,0x00444749, 0x004a5018,0x00504d72,0x00563e69,0x005c2214, 0x0061f78a,0x0067bde5,0x006d7440,0x007319ba, 0x0078ad74,0x007e2e93,0x00839c3c,0x0088f59a, 0x008e39d9,0x0093682a,0x00987fbf,0x009d7fd1, 0x00a26799,0x00a73655,0x00abeb49,0x00b085ba, 0x00b504f3,0x00b96841,0x00bdaef9,0x00c1d870, 0x00c5e403,0x00c9d112,0x00cd9f02,0x00d14d3d, 0x00d4db31,0x00d84852,0x00db941a,0x00debe05, 0x00e1c597,0x00e4aa59,0x00e76bd7,0x00ea09a6, 0x00ec835e,0x00eed89d,0x00f10908,0x00f31447, 0x00f4fa0a,0x00f6ba07,0x00f853f7,0x00f9c79d, 0x00fb14be,0x00fc3b27,0x00fd3aab,0x00fe1323, 0x00fec46d,0x00ff4e6d,0x00ffb10f,0x00ffec43 }; netmaze-0.81+jpg0.82.orig/x11gfx.c0100600000175000017500000010615705553602376016660 0ustar jgoerzenjgoerzen/* * X11: init and draw */ #ifdef PERFORMANCE_TEST #include #endif #include #include #include #include #include #include #ifdef SH_MEM #include #include #include XShmSegmentInfo shminfo; #endif #include "netmaze.h" #include "bitmap.h" #include "bitmaps/unilogo.xbm" #include "bitmaps/smiley.xbm" extern struct shared_struct *sm; GC hwallgc,vwallgc,blackgc,whitegc,topgc,bottomgc,unilogogc; static Pixmap unilogo; static XColor blackpix,whitepix,hwallpix,vwallpix,toppix,bottompix,yellpix; static char gamename[] = "Netmaze - The Multiplayercombatgame"; static char mapname1[] = "Rotate-Map"; static char iconname[] = "Netmaze"; static char statusname[] = "Status"; static char killname[] = "Kills"; static int smileyrad; static void set_colors(PLAYER*); static void gamebgtofg(void); static GC mkmonomap(char *bitmap); static GC mkunilogo(void); static GC mkcolormap(char *name,XColor*); static GC mkdithermap(char *bitmap,char *fg,char *bg); unsigned long get_best_color(XColor *col); static int calc_pos(int num,int len); static int calc_fitlen(int fit,int height); /* static int clipit(int x1,int h1,int x2,int h2,int c); */ extern void init_smiley(void); extern void draw_smiley(Drawable,short,short,short,short); /* extern: texture.c */ extern void image_bg(int ctop,int cbottom); extern void image_circle(long x1,long y1,long h1,long h2,int col); extern void image_sym_vline(long x1,long h1,int col,int); extern void image_hline(int x1,int y1,int x2,int val); extern void image_face(long x,long r,int win,int col); extern void image_floor(int x,int y,int angle,struct texture *tx); extern void image_top(int ctop); extern struct texture *load_texture(char *); extern void make_tabs(void); extern void texture_wall(long x1,long h1,long x2,long h2,struct texture *tex,long,long,int,int,int); static struct texture *textures[16]; extern long texturemem; static int XErrorNewHandler(Display*,XErrorEvent*); static int XErrorFlag=0; char *infotext[] = { "Welcome to Netmaze by MH! Pre-Version V0.81-April94" , ""}; /************************************************ * Init X11-datas, (open Display,setup gcs, ..) */ void x11_init(int argc,char **argv) { Pixmap px; int i; sm->grafix.display /*= sm->grafix.display1*/ = XOpenDisplay (""); sm->grafix.display1 = XOpenDisplay (""); if((sm->grafix.display == NULL) || (sm->grafix.display1 == NULL)) { fprintf(stderr,"%s: Can't open Display\n",argv[0]); exit(-1); } sm->grafix.root = DefaultRootWindow(sm->grafix.display); sm->grafix.screen = DefaultScreen(sm->grafix.display); sm->grafix.cmap = DefaultColormap(sm->grafix.display,sm->grafix.screen); XGetWindowAttributes(sm->grafix.display,sm->grafix.root,&sm->grafix.attribute); sm->grafix.gc = XCreateGC (sm->grafix.display,sm->grafix.root,0,0); if(sm->privatecmap) { Visual *vis; XColor dummy; vis = DefaultVisual(sm->grafix.display,sm->grafix.screen); sm->grafix.cmap = XCreateColormap(sm->grafix.display,sm->grafix.root, vis,AllocNone ); XAllocNamedColor(sm->grafix.display,sm->grafix.cmap, "White",&dummy,&whitepix); XAllocNamedColor(sm->grafix.display,sm->grafix.cmap, "Black",&dummy,&blackpix); } else { blackpix.pixel = BlackPixel(sm->grafix.display,sm->grafix.screen); whitepix.pixel = WhitePixel(sm->grafix.display,sm->grafix.screen); } switch(sm->outputsize) { case 12: sm->grafix.gamewidth = sm->grafix.shint.width = 640; sm->grafix.gameheight = sm->grafix.shint.height = 400; smileyrad = 128; break; case 13: sm->grafix.gamewidth = sm->grafix.shint.width = 320; sm->grafix.gameheight = sm->grafix.shint.height = 200; smileyrad = 64; break; case 14: sm->grafix.gamewidth = sm->grafix.shint.width = 160; sm->grafix.gameheight = sm->grafix.shint.height = 100; smileyrad = 32; break; case 11: sm->grafix.gamewidth = sm->grafix.shint.width = 1280; sm->grafix.gameheight = sm->grafix.shint.height = 800; smileyrad = 256; break; case -1: sm->grafix.gamewidth = sm->grafix.shint.width = 960; sm->grafix.gameheight = sm->grafix.shint.height = 600; smileyrad = 192; break; } sm->grafix.shint.flags = PSize; sm->grafix.gamefg = XCreateSimpleWindow(sm->grafix.display,sm->grafix.root, 100,100,sm->grafix.shint.width,sm->grafix.shint.height, 5,0,blackpix.pixel); if(!sm->directdraw) sm->grafix.gamebg = XCreatePixmap (sm->grafix.display,sm->grafix.gamefg, sm->grafix.gamewidth,sm->grafix.gameheight, sm->grafix.attribute.depth); else sm->grafix.gamebg = sm->grafix.gamefg; sm->grafix.mapfg = XCreateSimpleWindow(sm->grafix.display,sm->grafix.root, 100,100,MAPSIZE,MAPSIZE,5,0,blackpix.pixel); sm->grafix.mapbg = XCreatePixmap(sm->grafix.display,sm->grafix.mapfg, MAPSIZE,MAPSIZE,sm->grafix.attribute.depth); sm->grafix.sthint.width = 200; sm->grafix.sthint.height = 100; sm->grafix.sthint.flags = PSize; sm->grafix.statusfg = XCreateSimpleWindow(sm->grafix.display,sm->grafix.root, 100,100,sm->grafix.sthint.width,sm->grafix.sthint.height, 5,0,blackpix.pixel); sm->grafix.khint.width = 204; sm->grafix.khint.height = 84; sm->grafix.khint.flags = PSize; sm->grafix.killfg = XCreateSimpleWindow(sm->grafix.display,sm->grafix.root, 100,100,sm->grafix.khint.width,sm->grafix.khint.height, 5,0,blackpix.pixel); px = XCreateBitmapFromData(sm->grafix.display,sm->grafix.root,smiley_bits, smiley_width,smiley_height); XSetStandardProperties (sm->grafix.display,sm->grafix.mapfg,mapname1, mapname1,px,argv,argc,NULL); XSetStandardProperties (sm->grafix.display,sm->grafix.gamefg,gamename, iconname,px,argv,argc,&sm->grafix.shint); XSetStandardProperties (sm->grafix.display,sm->grafix.statusfg,statusname, statusname,px,argv,argc,&sm->grafix.sthint); XSetStandardProperties (sm->grafix.display,sm->grafix.killfg,killname, killname,px,argv,argc,&sm->grafix.khint); unilogo = XCreateBitmapFromData(sm->grafix.display,sm->grafix.root, unilogo_bits,unilogo_width,unilogo_height); if(sm->privatecmap) { XSetWindowColormap(sm->grafix.display,sm->grafix.gamefg,sm->grafix.cmap); XSetWindowColormap(sm->grafix.display,sm->grafix.statusfg,sm->grafix.cmap); XSetWindowColormap(sm->grafix.display,sm->grafix.killfg,sm->grafix.cmap); } if(sm->texturemode && sm->grafix.attribute.depth < 8) { fprintf(stderr,"Sorry, but you need at least an 8bit graphic to run texturemode.\n"); sm->texturemode = FALSE; } set_colors(sm->playfeld); if(sm->texturemode) { Visual *vis; vis = DefaultVisual(sm->grafix.display,sm->grafix.screen); if(sm->outputsize< 0) { fprintf(stderr,"Sorry, in texturemode is this screensize impossible.\n"); exit(1); } if( ((textures[0xf] = load_texture("hwall.bmp")) == NULL) || ((textures[0xe] = load_texture("vwall.bmp")) == NULL) || ((textures[0xd] = load_texture("floor.bmp")) == NULL) ) { fprintf(stderr,"Can't load texturedata!.\n"); sm->texturemode = FALSE; } else { for(i=1;i<10;i++) { char name[16]; sprintf(name,"texture%d.bmp",i); textures[i] = load_texture(name); if(textures[i] == NULL) textures[i] = textures[0xf]; } printf("Used Texturememory: %ld\n",texturemem); #ifdef SH_MEM if(!sm->noshmem && !XShmQueryExtension(sm->grafix.display)) { fprintf(stderr,"You're terminal doesn't support the X11 shared memory extension.\n"); sm->noshmem = TRUE; } if(!sm->noshmem) { XSetErrorHandler(XErrorNewHandler); XFlush(sm->grafix.display); sm->grafix.ximg = XShmCreateImage(sm->grafix.display,vis,8, ZPixmap,NULL,&shminfo,IMAGEWIDTH,IMAGEHEIGHT); if(sm->grafix.ximg == NULL) sm->noshmem = TRUE; else { int len = sm->grafix.ximg->bytes_per_line*sm->grafix.ximg->height; shminfo.shmid = shmget(IPC_PRIVATE,len,IPC_CREAT | 0777); if(shminfo.shmid < 0) sm->noshmem = TRUE; else { sm->grafix.ximg->data = sm->grafix.imagebuf = shminfo.shmaddr = (char *)shmat(shminfo.shmid,0,0); XShmAttach(sm->grafix.display, &shminfo); XSync(sm->grafix.display,1); if(XErrorFlag) { fprintf(stderr,"You're terminal doesn't support the X11 shared memor extension.\n"); sm->noshmem = TRUE; } shmctl(shminfo.shmid, IPC_RMID, 0); } } XSetErrorHandler(NULL); XFlush(sm->grafix.display); } #endif if(sm->noshmem) { sm->grafix.imagebuf = (char *) malloc(IMAGEWIDTH*IMAGEHEIGHT); sm->grafix.ximg = XCreateImage(sm->grafix.display,vis,8,ZPixmap,0, sm->grafix.imagebuf,IMAGEWIDTH,IMAGEHEIGHT,32,IMAGEWIDTH); printf("Ok, using simple PutImage\n"); } else printf("Ok, using faster shared memory PutImage.\n"); make_tabs(); } } XSelectInput (sm->grafix.display1,sm->grafix.gamefg, ExposureMask | KeyPressMask | ButtonReleaseMask | ButtonPressMask | KeyReleaseMask | StructureNotifyMask ); if(sm->mapdraw) XSelectInput (sm->grafix.display1,sm->grafix.mapfg,ExposureMask); XSelectInput(sm->grafix.display1,sm->grafix.statusfg, ExposureMask | StructureNotifyMask); XSelectInput(sm->grafix.display1,sm->grafix.killfg, ExposureMask | StructureNotifyMask); if(sm->mapdraw) XMapRaised (sm->grafix.display,sm->grafix.mapfg); XMapRaised (sm->grafix.display,sm->grafix.statusfg); XMapRaised (sm->grafix.display,sm->grafix.gamefg); XMapRaised (sm->grafix.display,sm->grafix.killfg); XFlush(sm->grafix.display1); XFlush(sm->grafix.display); init_smiley(); } static int XErrorNewHandler(Display *d,XErrorEvent *e) { XErrorFlag = 1; return 0; } /********************************+++ * Draw the map */ void draw_map(MAZE *mazeadd) { int (*vfeld)[MAZEDIMENSION],(*hfeld)[MAZEDIMENSION]; int i,j,dim; hfeld = mazeadd->hwalls; vfeld = mazeadd->vwalls; dim = mazeadd->xdim; for(i=0;igrafix.display,sm->grafix.gamefg,sm->grafix.gc, j*SCALE+5,i*SCALE+5,j*SCALE+5+SCALE,i*SCALE+5); } if(vfeld[j][i] & MAZE_TYPEMASK) { XDrawLine(sm->grafix.display,sm->grafix.gamefg,sm->grafix.gc, i*SCALE+5,j*SCALE+5,i*SCALE+5,j*SCALE+5+SCALE); } } } /****************************+ * draw rotate-map */ void draw_rmap(PLAYER *play,XSegment *lines,int anzahl) { int x; XFillRectangle(sm->grafix.display,sm->grafix.mapbg,blackgc,0,0,MAPSIZE,MAPSIZE); XDrawSegments(sm->grafix.display,sm->grafix.mapbg,sm->grafix.gc,lines,anzahl); /* Targets */ for(x=0; xmarks; x++) { int nr = sm->markers[x].player; XFillArc(sm->grafix.display,sm->grafix.mapbg,sm->pgfx[play[nr].team].xgc, sm->markers[x].x-2, sm->markers[x].y-2,5,5,0,360*64); } XDrawArc(sm->grafix.display,sm->grafix.mapbg,sm->grafix.gc, MAPSIZE/2-2,MAPSIZE/2-2,5,5,0,360*64); XCopyArea(sm->grafix.display,sm->grafix.mapbg,sm->grafix.mapfg,sm->grafix.gc, 0,0,MAPSIZE,MAPSIZE,0,0); } /****************************** * Draw 'game-over' Screen */ void draw_end(PLAYER *play,int nr) { int r,i,j; r = smileyrad; XFillRectangle(sm->grafix.display,sm->grafix.gamebg,blackgc, 0,0,sm->grafix.gamewidth,sm->grafix.gameheight); XFillArc(sm->grafix.display,sm->grafix.gamebg,sm->pgfx[play[nr].team].xgc, (sm->grafix.gamewidth>>1)-r,(sm->grafix.gameheight>>1)-r, r<<1,r<<1,0,360*64); draw_smiley(sm->grafix.gamebg,sm->grafix.gamewidth>>1,sm->grafix.gameheight>>1,0,r); for(i=0,j=0;ianzplayers;i++) { if(play[nr].team == play[i].team) { XDrawImageString(sm->grafix.display,sm->grafix.gamebg,sm->grafix.gc, 5,32+j*16,play[i].name,strlen(play[i].name)); j++; } } if(j == 1) { XDrawImageString(sm->grafix.display,sm->grafix.gamebg,sm->grafix.gc, 0,16,"The Winner is:",14); } else { XDrawImageString(sm->grafix.display,sm->grafix.gamebg,sm->grafix.gc, 0,16,"The Winners are:",16); } gamebgtofg(); } /*************************************** * Draw maze (3D) */ double deg(double x,double y) /* degrees 0..256 */ { return (x != 0.0 ? 256.0 - 256.0/4.0 - atan(y/x)/(M_PI*2.0) * 256.0 : 0.0); } void draw_maze(WALL *walls,PLAYER *play,int anzahl,int nr) { int id,i,r,r2,s; unsigned int width,high,hwidth,hhigh,x1; XPoint points[4]; GC gc; width = sm->grafix.gamewidth; high = sm->grafix.gameheight; if(play[nr].hitbycnt == 0) { XFillRectangle (sm->grafix.display,sm->grafix.gamebg,topgc, 0,0,width,high>>1); XFillRectangle (sm->grafix.display,sm->grafix.gamebg,bottomgc, 0,high>>1,width,high>>1); } else XFillRectangle(sm->grafix.display,sm->grafix.gamebg, sm->pgfx[play[nr].hitby].xgc,0,0,width,high); hwidth = width >> 1; hhigh = high >> 1; for(i=anzahl-1;i>=0;i--) { id = walls[i].ident; if(id >= 0x100) { if(id & 0x100) gc = hwallgc; else gc = vwallgc; /* if(sm->clipsides) { if(walls[i].x1+2 < walls[i].lclip) { walls[i].h1 = clipit(walls[i].x1,walls[i].h1, walls[i].x2,walls[i].h2,walls[i].lclip); walls[i].x1 = walls[i].lclip; } if(walls[i].x2-2 > walls[i].rclip) { walls[i].h2 = clipit(walls[i].x1,walls[i].h1, walls[i].x2,walls[i].h2,walls[i].rclip); walls[i].x2 = walls[i].rclip; } } static int clipit(int x1,int h1,int x2,int h2,int c) { double t; t = (double) (x2 - c) / (double) (x2 - x1); h1 = h2 - (int) ((double) (h2 - h1) * t); return h1; } */ if((s=sm->outputsize) > 0) { points[0].x=hwidth+(walls[i].x1>>s);points[0].y=hhigh+(walls[i].h1>>s); points[1].x=hwidth+(walls[i].x2>>s);points[1].y=hhigh+(walls[i].h2>>s); points[2].x=hwidth+(walls[i].x2>>s);points[2].y=hhigh-(walls[i].h2>>s); points[3].x=hwidth+(walls[i].x1>>s);points[3].y=hhigh-(walls[i].h1>>s); } else /* big */ { points[0].x=hwidth+(walls[i].x1>>13)+(walls[i].x1>>12); points[0].y=hhigh+(walls[i].h1>>13)+(walls[i].h1>>12); points[1].x=hwidth+(walls[i].x2>>13)+(walls[i].x2>>12); points[1].y=hhigh+(walls[i].h2>>13)+(walls[i].h2>>12); points[2].x=hwidth+(walls[i].x2>>13)+(walls[i].x2>>12); points[2].y=hhigh-(walls[i].h2>>13)-(walls[i].h2>>12); points[3].x=hwidth+(walls[i].x1>>13)+(walls[i].x1>>12); points[3].y=hhigh-(walls[i].h1>>13)-(walls[i].h1>>12); } XFillPolygon (sm->grafix.display,sm->grafix.gamebg,gc, points,4,Convex,CoordModeOrigin); if(walls[i].x1 == walls[i].lclip) XDrawLine(sm->grafix.display,sm->grafix.gamebg,whitegc, points[0].x,points[0].y,points[3].x,points[3].y); if(walls[i].x2 == walls[i].rclip) XDrawLine(sm->grafix.display,sm->grafix.gamebg,whitegc, points[1].x,points[1].y,points[2].x,points[2].y); } else if(id < 64) { if((s=sm->outputsize)>0) { r2 = (r = (walls[i].h1>>s))>>1; x1 = walls[i].x1>>s; } else { r2 = (r = (walls[i].h1>>13)+walls[i].h1)>>13; x1 = (walls[i].x1>>13)+(walls[i].x1>>12); } if(id < 32) { if(play[id].hitbycnt == 0) { XFillArc(sm->grafix.display,sm->grafix.gamebg, sm->pgfx[play[id].team].xgc, x1+hwidth-r2,hhigh-r2,r,r,0,360*64); } else { XFillArc(sm->grafix.display,sm->grafix.gamebg, sm->pgfx[play[id].hitby].xgc, x1+hwidth-r2,hhigh-r2,r,r,0,360*64); } XFillArc(sm->grafix.display,sm->grafix.gamebg,blackgc, /* shadow */ x1+hwidth-r2+(r2>>2),hhigh+r2*SMSCALE-(r2>>2), r-(r2>>1),r2>>1,0,360*64); draw_smiley(sm->grafix.gamebg,x1+hwidth,hhigh,walls[i].h2,r2); } else if(id < 64) { XFillArc(sm->grafix.display,sm->grafix.gamebg, /* shot */ sm->pgfx[play[id-32].team].xgc, x1+hwidth-r2,hhigh-r2,r,r,0,360*64); XFillArc(sm->grafix.display,sm->grafix.gamebg,blackgc, /* shadow */ x1+hwidth-r2+(r2>>2), hhigh+r2*STSCALE,r-(r2>>1),r2>>1,0,360*64); } } } if(play[nr].hide) { XDrawLine(sm->grafix.display,sm->grafix.gamebg,blackgc, hwidth-5,hhigh,hwidth+5,hhigh); XDrawLine(sm->grafix.display,sm->grafix.gamebg,blackgc, hwidth,hhigh-5,hwidth,hhigh+5); } else { XDrawLine(sm->grafix.display,sm->grafix.gamebg,sm->grafix.gc, hwidth-5,hhigh,hwidth+5,hhigh); XDrawLine(sm->grafix.display,sm->grafix.gamebg,sm->grafix.gc, hwidth,hhigh-5,hwidth,hhigh+5); } /* Follow arrow. look at winkel, and player follow winkel, and distance to player. */ if((nr != play[nr].follow) && (play[nr].follow != -1) && sm->locator) { PLAYER *me = play+nr; PLAYER *them = play+me->follow; int mx,my; int tx,ty; int dx,dy; static long count=0; int angle, diff; if (me && them) { mx = (int) ((me->x) >> 24); my = (int) ((me->y) >> 24); tx = (int) ((them->x) >> 24); ty = (int) ((them->y) >> 24); dx = mx-tx; dy = my-ty; count++; /* ** Angle from me to target, ** map-based angle. */ angle = (int)deg((double)dy,(double)dx); /* ** Now its me-based */ diff = angle; diff -= 128; #define max(a,b) ((a)>(b)?(a):(b)) /* * update telltale. */ { int dist = sqrt((double)(dx*dx + dy*dy))*6.0; if ((count%8) < 4) { int radius = max(1,(50 - dist)); XDrawArc(sm->grafix.display,sm->grafix.gamebg, sm->pgfx[play[me->follow].team].xgc, hwidth-radius/2,hhigh-radius/2,radius, radius, 0, 360*64); } } } } gamebgtofg(); } void draw_texture_maze(WALL *walls,PLAYER *play,int anzahl,int nr) { int id,i,r,r2,s; unsigned int width,height,x1; int x,y; unsigned long pixel; #ifdef PERFORMANCE_TEST long a; #endif /* if(play[nr].hitbycnt == 0) image_bg(toppix.pixel,hwallpix.pixel); else image_bg(sm->pgfx[play[nr].hitby].col.pixel, sm->pgfx[play[nr].hitby].col.pixel); */ if(play[nr].hitbycnt == 0) image_top(toppix.pixel); else image_top(sm->pgfx[play[nr].hitby].col.pixel); image_floor(play[nr].x,play[nr].y,play[nr].winkel,textures[0xd]); #ifdef PERFORMANCE_TEST a = clock(); #endif for(i=anzahl-1;i>=0;i--) { if((id = walls[i].ident) >= 0x100) { int tnr=(id>>10)&0xf; texture_wall(walls[i].x1,walls[i].h1,walls[i].x2,walls[i].h2, textures[tnr],walls[i].lclip,walls[i].rclip, sm->outputsize,walls[i].clipped,0); if(walls[i].x1 == walls[i].lclip) image_sym_vline(walls[i].x1,walls[i].h1, whitepix.pixel,sm->outputsize); if(walls[i].x2 == walls[i].rclip) image_sym_vline(walls[i].x2,walls[i].h2, whitepix.pixel,sm->outputsize); } else if(id < 64) { if((s=sm->outputsize)>0) { r2 = (r = (walls[i].h1>>s))>>1; x1 = walls[i].x1>>s; } else { r2 = (r = (walls[i].h1>>13)+walls[i].h1)>>13; x1 = (walls[i].x1>>13)+(walls[i].x1>>12); } if(id < 32) { if(play[id].hitbycnt == 0) image_circle(x1,0,r,r,sm->pgfx[play[id].team].col.pixel); else image_circle(x1,0,r,r,sm->pgfx[play[id].hitby].col.pixel); image_circle(x1,r2*SMSCALE,r2>>1,r-(r2>>1),1); image_face(x1,r2,walls[i].h2,whitepix.pixel); } else if(id < 64) { image_circle(x1,0,r,r,sm->pgfx[play[id-32].team].col.pixel); image_circle(x1,r2*STSCALE,r2>>1,r-(r2>>1),1); } } } #ifdef PERFORMANCE_TEST a = clock()-a; fprintf(stderr,"%ld ",a); #endif /* bgtofg: */ width = sm->grafix.shint.width; height = sm->grafix.shint.height; x = (width-sm->grafix.gamewidth)>>1; y = (height-sm->grafix.gameheight)>>1; if((x > 0) || (y > 0)) XDrawRectangle(sm->grafix.display,sm->grafix.gamefg,sm->grafix.gc, x-1,y-1,sm->grafix.gamewidth+1,sm->grafix.gameheight+1); if(play[nr].hide) pixel = blackpix.pixel; else pixel = yellpix.pixel; image_hline((IMAGEWIDTH>>1)-5,(IMAGEHEIGHT>>1)-1,(IMAGEWIDTH>>1)+6,blackpix.pixel); image_hline((IMAGEWIDTH>>1)-5,(IMAGEHEIGHT>>1)+1,(IMAGEWIDTH>>1)+6,blackpix.pixel); image_sym_vline(-1,5,blackpix.pixel,0); image_sym_vline(1,5,blackpix.pixel,0); image_hline((IMAGEWIDTH>>1)-5,(IMAGEHEIGHT>>1),(IMAGEWIDTH>>1)+6,pixel); image_sym_vline(0,5,pixel,0); #ifdef SH_MEM if(!sm->noshmem) { XShmPutImage(sm->grafix.display,sm->grafix.gamefg,sm->grafix.gc, sm->grafix.ximg,(IMAGEWIDTH-WXSIZE)>>1,(IMAGEHEIGHT-WYSIZE)>>1, x,y,sm->grafix.gamewidth,sm->grafix.gameheight,True); } else #endif { XPutImage(sm->grafix.display,sm->grafix.gamefg,sm->grafix.gc, sm->grafix.ximg,(IMAGEWIDTH-WXSIZE)>>1,(IMAGEHEIGHT-WYSIZE)>>1, x,y,sm->grafix.gamewidth,sm->grafix.gameheight); } XSync(sm->grafix.display,1); } /********************************************* * Copy background-pixmap to the foreground */ static void gamebgtofg(void) { int x,y; unsigned int height,width; if(sm->directdraw) { XSync(sm->grafix.display,1); return; } width = sm->grafix.shint.width; height = sm->grafix.shint.height; x = (width-sm->grafix.gamewidth) >> 1; y = (height-sm->grafix.gameheight) >> 1; if((x > 0) || (y > 0)) { XDrawRectangle(sm->grafix.display,sm->grafix.gamefg,sm->grafix.gc, x-1,y-1,sm->grafix.gamewidth+1,sm->grafix.gameheight+1); } XCopyArea(sm->grafix.display,sm->grafix.gamebg,sm->grafix.gamefg,blackgc, 0,0,sm->grafix.gamewidth,sm->grafix.gameheight,x,y); XSync(sm->grafix.display,1); } /*********************************** * Draw 'Killed by' -Screen */ void draw_kill(PLAYER *play,int k) { int r; char string[32]; strcpy(string,play[k].name); strcpy(string+strlen(string)," says:"); r = smileyrad; XFillRectangle(sm->grafix.display,sm->grafix.gamebg,blackgc, 0,0,sm->grafix.gamewidth,sm->grafix.gameheight); XFillArc(sm->grafix.display,sm->grafix.gamebg,sm->pgfx[play[k].team].xgc, (sm->grafix.gamewidth>>1)-r,(sm->grafix.gameheight>>1)-r, r<<1,r<<1,0,360*64); draw_smiley(sm->grafix.gamebg,sm->grafix.gamewidth>>1,sm->grafix.gameheight>>1,0,r); XDrawImageString(sm->grafix.display,sm->grafix.gamebg,sm->grafix.gc, 0,16,string,strlen(string)); XDrawImageString(sm->grafix.display,sm->grafix.gamebg,sm->grafix.gc, 0,32,play[k].comment,strlen(play[k].comment)); gamebgtofg(); } /***************************+++ * Draw Status */ void draw_status(int nr,PLAYER *play) { int i,j,k; int len,fitpos,step,len1; int width = sm->grafix.sthint.width; int height = sm->grafix.sthint.height; XPoint points[1024]; if(nr >= 0) { if(!play[nr].statchg && !sm->statchg) return; } else if(!sm->statchg) return; fitpos = width - 15; if(fitpos < 0) fitpos = 0; step = height / sm->numteams; if(step > 16) step = 16; len = width - 30; if(len < 0) len = 0; if(sm->statchg) { XFillRectangle(sm->grafix.display,sm->grafix.statusfg,blackgc,0,0,width,height); for(i=1,k=0;i<=sm->numteams;i++) for(j=1;j<=sm->config.kills2win;j++) if(k<1024) { points[k].x = calc_pos(j,len); points[k].y = i*step-1; k++; } XDrawPoints(sm->grafix.display,sm->grafix.statusfg,whitegc, points,k,CoordModeOrigin); for(i=0;inumteams;i++) /* numteams */ { XFillRectangle(sm->grafix.display,sm->grafix.statusfg,sm->pgfx[i].xgc, 0,i*step,calc_pos(sm->teams[i].kills,len),step-1); } if(nr >= 0) { len1 = calc_fitlen(play[nr].fitness,height); XFillRectangle(sm->grafix.display,sm->grafix.statusfg, sm->pgfx[play[nr].team].xgc,fitpos,height-len1,10,len1); } /* sm->statchg = FALSE; */ } else { len1 = calc_fitlen(play[nr].fitness,height); XFillRectangle(sm->grafix.display,sm->grafix.statusfg,blackgc, fitpos,0,10,height-len1); XFillRectangle(sm->grafix.display,sm->grafix.statusfg, sm->pgfx[play[nr].team].xgc,fitpos,height-len1,10,len1); } } static int calc_pos(int num,int len) { return ((int) ( (double) num / (double) (sm->config.kills2win?sm->config.kills2win:1) * (double) len)); } static int calc_fitlen(int fit,int height) { int i; i = (int) (( (long) fit * (long) height) / 2000) ; return (i<0)?0:i; } /****************************** * Draw Kills */ void draw_kills(int nr,PLAYER *play) { int i; if(sm->killchg) { XFillRectangle(sm->grafix.display,sm->grafix.killfg,blackgc,0,0,200,80); for(i=0;igrafix.display,sm->grafix.killfg, sm->pgfx[play[play[nr].killtable[i]].team].xgc, (i%5)*40+4,(i/5)*40+4,36,36,0,360*64); draw_smiley(sm->grafix.killfg,(i%5)*40+22,(i/5)*40+22,0,18); } sm->killchg = FALSE; } else if(play[nr].killchg) { if( (i = play[nr].killanz-1) < 0) return; XFillArc(sm->grafix.display,sm->grafix.killfg, sm->pgfx[play[play[nr].killtable[i]].team].xgc, (i%5)*40+4,(i/5)*40+4,36,36,0,360*64); draw_smiley(sm->grafix.killfg,(i%5)*40+22,(i/5)*40+22,0,18); } } /****************************** * Draw Info */ void draw_info(void) { int i; int x,y; unsigned int height,width; width = sm->grafix.shint.width; height = sm->grafix.shint.height; if((sm->screendraw) || (sm->winnerdraw)) { x = (width-sm->grafix.gamewidth)>>1; y = (height-sm->grafix.gameheight)>>1; if((x <= 0) && (y <= 0)) return; XFillRectangle(sm->grafix.display,sm->grafix.gamefg,unilogogc, 0,0,sm->grafix.shint.width,y); XFillRectangle(sm->grafix.display,sm->grafix.gamefg,unilogogc, 0,y,x,sm->grafix.gameheight); XFillRectangle(sm->grafix.display,sm->grafix.gamefg,unilogogc, x+sm->grafix.gamewidth,y,x,sm->grafix.gameheight); XFillRectangle(sm->grafix.display,sm->grafix.gamefg,unilogogc, 0,y+sm->grafix.gameheight,width,y); } else { XFillRectangle(sm->grafix.display,sm->grafix.gamefg,unilogogc, 0,0,sm->grafix.shint.width,sm->grafix.shint.height); } for(i=0;strlen(infotext[i])!=0;i++) { XDrawImageString(sm->grafix.display,sm->grafix.gamefg,sm->grafix.gc, 5,16*(i+1),infotext[i],strlen(infotext[i])); } } /****************************** * Setup Colors */ static void set_colors(PLAYER *players) { XColor dummy; int i,j; char *colornames[] = { "Yellow" ,"Red" , "Green" , "Blue" , "SandyBrown" , "DarkOliveGreen", "Orange" , "DarkOrchid" , "Pink", "VioletRed" , "LightBlue" , "LightCyan" , "RosyBrown" , "IndianRed" , "DeepPink" , "LightPink" , "yellowGreen" ,"orchid" , "lavender" , "lemonchiffon" , "YellowGreen" , "khaki" , "DarkKhaki" , "violet" , "plum" , "DarkOrchid" , "DarkViolet" , "PaleTurquoise", "Turquoise" , "darkturquoise" , "coral" , "Black" ,NULL}; char *dithercolors[] = { "Yellow", "Red", "Green", "Blue", "cyan", "magenta", "white", "black", NULL }; char **colorpoint = colornames; char **bitmappoint = player_bits; char **ditherpoint = dithercolors; if(sm->graymode && (sm->grafix.attribute.depth >= 4)) { for(j=0,i=0;ipgfx[i].xgc = mkmonomap(*bitmappoint); } hwallgc = mkcolormap("DimGray",&hwallpix); vwallgc = mkcolormap("Gray",&vwallpix); topgc = mkcolormap("LightGray",&toppix); bottomgc = mkcolormap("DarkGrey",&bottompix); XSetForeground(sm->grafix.display,sm->grafix.gc,whitepix.pixel); yellpix.pixel = whitepix.pixel; } else if((sm->grafix.attribute.depth >= 8) && !sm->monomode && !sm->dithermode) { hwallgc = mkcolormap("DimGray",&hwallpix); vwallgc = mkcolormap("Gray",&vwallpix); topgc = mkcolormap("cornflowerblue",&toppix); bottomgc = mkcolormap("steelblue",&bottompix); for(j=0,i=0;ipgfx[i].xgc = mkcolormap(*colorpoint,&sm->pgfx[i].col); } XAllocNamedColor(sm->grafix.display,sm->grafix.cmap,"Yellow",&dummy,&yellpix); XSetForeground(sm->grafix.display,sm->grafix.gc,yellpix.pixel); } else if((sm->grafix.attribute.depth >= 6) && !sm->monomode) { hwallgc = mkcolormap("DimGray",&hwallpix); vwallgc = mkcolormap("Gray",&vwallpix); topgc = mkcolormap("cornflowerblue",&toppix); bottomgc = mkcolormap("steelblue",&bottompix); colorpoint = dithercolors; for(j=0,i=0;ipgfx[i].xgc = mkdithermap(hwall_bits, *colorpoint, *ditherpoint); } XAllocNamedColor(sm->grafix.display,sm->grafix.cmap,"Yellow",&dummy,&yellpix); XSetForeground(sm->grafix.display,sm->grafix.gc,yellpix.pixel); } else { for(j=0,i=0;ipgfx[i].xgc = mkmonomap(*bitmappoint); } hwallgc = mkmonomap(hwall_bits); vwallgc = mkmonomap(vwall_bits); topgc = mkmonomap(bgtop_bits); bottomgc = mkmonomap(bgbottom_bits); XSetForeground(sm->grafix.display,sm->grafix.gc,whitepix.pixel); } unilogogc = mkunilogo(); blackgc = XCreateGC(sm->grafix.display,sm->grafix.root,0,0); XSetForeground(sm->grafix.display,blackgc,blackpix.pixel); whitegc = XCreateGC(sm->grafix.display,sm->grafix.root,0,0); XSetForeground(sm->grafix.display,whitegc,whitepix.pixel); XSetBackground(sm->grafix.display,sm->grafix.gc,blackpix.pixel); } /**************************** * Setup unilogo-gc */ static GC mkunilogo(void) { Pixmap bitmp; GC gc; bitmp = XCreateBitmapFromData(sm->grafix.display,sm->grafix.root,unilogo_bits, unilogo_width,unilogo_height); gc = XCreateGC (sm->grafix.display,sm->grafix.root,0,0); XSetStipple(sm->grafix.display,gc,bitmp); XSetFillStyle(sm->grafix.display,gc,FillOpaqueStippled); XSetForeground(sm->grafix.display,gc,whitepix.pixel); XSetBackground(sm->grafix.display,gc,blackpix.pixel); return gc; } /*********************************++ * Setup Bitmap-Mono-gcs */ static GC mkmonomap(char *bitmap) { Pixmap bitmp; GC gc; bitmp = XCreateBitmapFromData(sm->grafix.display,sm->grafix.root,bitmap,16,16); gc = XCreateGC (sm->grafix.display,sm->grafix.root,0,0); XSetStipple(sm->grafix.display,gc,bitmp); XSetFillStyle(sm->grafix.display,gc,FillOpaqueStippled); XSetForeground(sm->grafix.display,gc,whitepix.pixel); XSetBackground(sm->grafix.display,gc,blackpix.pixel); return gc; } /*********************************** * Setup color-gcs */ static GC mkcolormap(char *name,XColor *col) { XColor dummy,color; GC gc; Status s; if(!sm->texturemode) { s=XAllocNamedColor(sm->grafix.display,sm->grafix.cmap,name,&dummy,&color); if(!s) fprintf(stderr, "Warning: Cannot allocate colormap entry for \"%s\"\n",name); } else { XLookupColor(sm->grafix.display,sm->grafix.cmap,name,&color,&dummy); get_best_color(&color); } gc = XCreateGC (sm->grafix.display,sm->grafix.root,0,0); XSetForeground (sm->grafix.display,gc,color.pixel); if(col) *col = color; return gc; } /******************************** * dither-gcs */ static GC mkdithermap(char *bitmap, char *fg, char *bg) { Pixmap bitmp; XColor dummy,color; GC gc; Status s; bitmp = XCreateBitmapFromData(sm->grafix.display,sm->grafix.root,bitmap,16,16); gc = XCreateGC (sm->grafix.display,sm->grafix.root,0,0); XSetStipple(sm->grafix.display,gc,bitmp); XSetFillStyle(sm->grafix.display,gc,FillOpaqueStippled); s=XAllocNamedColor (sm->grafix.display, sm->grafix.cmap,fg,&dummy,&color); if (s == 0) fprintf(stderr, "Warning: Cannot allocate colormap entry for \"%s\"\n",fg); XSetForeground(sm->grafix.display,gc, color.pixel); s=XAllocNamedColor (sm->grafix.display, sm->grafix.cmap,bg,&dummy,&color); if (s == 0) fprintf(stderr, "Warning: Cannot allocate colormap entry for \"%s\"\n",bg); XSetBackground(sm->grafix.display,gc, color.pixel); return gc; } /***************************************** * find a good color: slow and ugly but works ... */ unsigned long get_best_color(XColor *col) { #define MAX_COLORS 1024 #define SHFT 12 static unsigned char cfield[MAX_COLORS][4]; static unsigned long pfield[MAX_COLORS]; static int outofcol=0; static int num=0; int i,best=0; unsigned char r,g,b; long d,diff=0x7fffffff; r=(col->red>>SHFT)&0xff; g=(col->green>>SHFT)&0xff; b=(col->blue>>SHFT)&0xff; if(!outofcol) { for(i=0;iflags = DoRed | DoGreen | DoBlue; if(!XAllocColor(sm->grafix.display,sm->grafix.cmap,col)) outofcol=TRUE; else { r=(col->red>>SHFT)&0xff; g=(col->green>>SHFT)&0xff; b=(col->blue>>SHFT)&0xff; cfield[num][0] = r; cfield[num][1] = g; cfield[num][2] = b; pfield[num] = col->pixel; num++; if(num == MAX_COLORS) outofcol=1; return col->pixel; } } for(i=0;i #include /* #include #include */ #include "netmaze.h" #include "x11smiley.h" #define MAXSMHIGH 1024 #define SMBASE 128 #define MAXFACEANZ 768 extern struct shared_struct *sm; struct data { double w1; double w2; double y; short step; } datas[512]; struct sdata { short x1; short x2; short step; } winkel[128][512]; short lineanz[128]; XSegment facelines[MAXFACEANZ]; /* extern GRAFIX grafix; */ extern GC whitegc; void init_smiley(void) { short i,j=0,k,l,d; short *data = smiley; double w,s; for(i=0,j=0;i<256;j++) /* Linewerte in Winkelwerte */ { if(*data == 0x7fff) { datas[j].step = 1; i++; data++; } else { datas[j].y = 128.0 * cos(asin((double) (128-i) / 128.0)); datas[j].w1 = asin((double) (*data++ - 128) / datas[j].y); datas[j].w2 = asin((double) (*data++ - 128) / datas[j].y); datas[j].step = 0; } } for(i=0;i<128;i++) /* Winkelwerte in Winkel-Line-Werte */ { w = M_PI * i / 128.0; for(j=0,k=0,d=0,l=0;j<256;k++) { if(datas[k].step == 1) { winkel[i][l].step = 1; j++; l++; } else if((s = datas[k].w1 + w) < M_PI_2) { winkel[i][l].x1 = datas[k].y * sin(s); if((s = datas[k].w2 + w) < M_PI_2) winkel[i][l].x2 = datas[k].y * sin(s); else winkel[i][l].x2 = datas[k].y; winkel[i][l].step = 0; d++; l++; } } lineanz[i] = d; } } void draw_smiley(Drawable wind,short x,short y,short win,short r) { short j,k,k1; double scale,scale1,jmp=0.5; int faceanz = 0,lclip,rclip; lclip=(IMAGEWIDTH-WXSIZE)>>1; rclip=lclip+WXSIZE-1; scale1 = scale = (double) r / 128.0; y -= r; if(win < 0) { win = - win; scale1 = -scale1; } if(lineanz[win] == 0) return; for(j=0,k=0;j<256;j++) /* very simple test-drawroutine */ { jmp += scale; if(jmp >= 1) { k1 = k; while(jmp >= 1) { k = k1; while(winkel[win][k].step == 0) { if(faceanz < MAXFACEANZ) { facelines[faceanz].x1 = x+winkel[win][k].x1*scale1; facelines[faceanz].x2 = x+winkel[win][k].x2*scale1; facelines[faceanz].y1 = facelines[faceanz].y2 = y; faceanz++; } k++; } y++; k++; jmp -= 1; } } else { while(winkel[win][k].step == 0) k++; k++; } } XDrawSegments(sm->grafix.display,wind,whitegc,facelines,faceanz); } void image_face(long x,long r,int win,int col) { int j,k,k1,y; double scale,scale1,jmp=0.5; extern void image_hline(int x1,int y1,int x2,int val); int lclip=(IMAGEWIDTH-WXSIZE)>>1; int rclip=((IMAGEWIDTH+WXSIZE)>>1)-1; scale1 = scale = (double) r / 128.0; if(win < 0) { win = - win; scale1 = -scale1; } if(lineanz[win] == 0) return; x += (IMAGEWIDTH>>1); y = (IMAGEHEIGHT>>1) - r; for(j=0,k=0;j<256;j++) /* very simple test-drawroutine */ { jmp += scale; if(jmp >= 1) { k1 = k; while(jmp >= 1) { k = k1; while(winkel[win][k].step == 0) { int xi1,xi2; int x1=x+winkel[win][k].x1*scale1; int x2=x+winkel[win][k].x2*scale1; k++; if(x1>x2) { if(x2rclip) { if(x2>rclip) continue; x1=rclip; } image_hline(x2,y,x1,col); } else { if(x1rclip) { if(x1>rclip) continue; x2=rclip; } image_hline(x1,y,x2,col); } } y++; k++; jmp -= 1; } } else { while(winkel[win][k].step == 0) k++; k++; } } } netmaze-0.81+jpg0.82.orig/x11smiley.h0100600000175000017500000001250705542040232017357 0ustar jgoerzenjgoerzenshort smiley[] = { 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x63 , 0x65 , 0x99 , 0x9b , 0x7fff , 0x60 , 0x68 , 0x96 , 0x9e , 0x7fff , 0x5e , 0x6a , 0x94 , 0xa0 , 0x7fff , 0x5d , 0x6b , 0x93 , 0xa1 , 0x7fff , 0x5c , 0x6c , 0x92 , 0xa2 , 0x7fff , 0x5b , 0x6d , 0x91 , 0xa3 , 0x7fff , 0x5a , 0x6e , 0x90 , 0xa4 , 0x7fff , 0x5a , 0x6e , 0x90 , 0xa4 , 0x7fff , 0x59 , 0x6f , 0x8f , 0xa5 , 0x7fff , 0x59 , 0x6f , 0x8f , 0xa5 , 0x7fff , 0x58 , 0x70 , 0x8e , 0xa6 , 0x7fff , 0x58 , 0x70 , 0x8e , 0xa6 , 0x7fff , 0x57 , 0x71 , 0x8d , 0xa7 , 0x7fff , 0x57 , 0x71 , 0x8d , 0xa7 , 0x7fff , 0x56 , 0x72 , 0x8c , 0xa8 , 0x7fff , 0x56 , 0x72 , 0x8c , 0xa8 , 0x7fff , 0x56 , 0x72 , 0x8c , 0xa8 , 0x7fff , 0x56 , 0x72 , 0x8c , 0xa8 , 0x7fff , 0x55 , 0x73 , 0x8b , 0xa9 , 0x7fff , 0x55 , 0x73 , 0x8b , 0xa9 , 0x7fff , 0x55 , 0x73 , 0x8b , 0xa9 , 0x7fff , 0x55 , 0x73 , 0x8b , 0xa9 , 0x7fff , 0x55 , 0x73 , 0x8b , 0xa9 , 0x7fff , 0x55 , 0x73 , 0x8b , 0xa9 , 0x7fff , 0x55 , 0x73 , 0x8b , 0xa9 , 0x7fff , 0x55 , 0x73 , 0x8b , 0xa9 , 0x7fff , 0x54 , 0x74 , 0x8a , 0xaa , 0x7fff , 0x54 , 0x74 , 0x8a , 0xaa , 0x7fff , 0x54 , 0x74 , 0x8a , 0xaa , 0x7fff , 0x55 , 0x73 , 0x8b , 0xa9 , 0x7fff , 0x55 , 0x73 , 0x8b , 0xa9 , 0x7fff , 0x55 , 0x73 , 0x8b , 0xa9 , 0x7fff , 0x55 , 0x73 , 0x8b , 0xa9 , 0x7fff , 0x55 , 0x73 , 0x8b , 0xa9 , 0x7fff , 0x55 , 0x73 , 0x8b , 0xa9 , 0x7fff , 0x55 , 0x73 , 0x8b , 0xa9 , 0x7fff , 0x55 , 0x73 , 0x8b , 0xa9 , 0x7fff , 0x56 , 0x72 , 0x8c , 0xa8 , 0x7fff , 0x56 , 0x72 , 0x8c , 0xa8 , 0x7fff , 0x56 , 0x72 , 0x8c , 0xa8 , 0x7fff , 0x56 , 0x72 , 0x8c , 0xa8 , 0x7fff , 0x57 , 0x71 , 0x8d , 0xa7 , 0x7fff , 0x57 , 0x71 , 0x8d , 0xa7 , 0x7fff , 0x58 , 0x70 , 0x8e , 0xa6 , 0x7fff , 0x58 , 0x70 , 0x8e , 0xa6 , 0x7fff , 0x59 , 0x6f , 0x8f , 0xa5 , 0x7fff , 0x59 , 0x6f , 0x8f , 0xa5 , 0x7fff , 0x5a , 0x6e , 0x90 , 0xa4 , 0x7fff , 0x5a , 0x6e , 0x90 , 0xa4 , 0x7fff , 0x5b , 0x6d , 0x91 , 0xa3 , 0x7fff , 0x5c , 0x6c , 0x92 , 0xa2 , 0x7fff , 0x5d , 0x6b , 0x93 , 0xa1 , 0x7fff , 0x5e , 0x6a , 0x94 , 0xa0 , 0x7fff , 0x60 , 0x68 , 0x96 , 0x9e , 0x7fff , 0x63 , 0x65 , 0x99 , 0x9b , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x46 , 0x52 , 0xac , 0xb8 , 0x7fff , 0x46 , 0x52 , 0xac , 0xb8 , 0x7fff , 0x46 , 0x52 , 0xac , 0xb8 , 0x7fff , 0x46 , 0x52 , 0xac , 0xb8 , 0x7fff , 0x46 , 0x52 , 0xac , 0xb8 , 0x7fff , 0x46 , 0x52 , 0xac , 0xb8 , 0x7fff , 0x46 , 0x52 , 0xac , 0xb8 , 0x7fff , 0x46 , 0x52 , 0xac , 0xb8 , 0x7fff , 0x46 , 0x52 , 0xac , 0xb8 , 0x7fff , 0x47 , 0x53 , 0xab , 0xb7 , 0x7fff , 0x47 , 0x53 , 0xab , 0xb7 , 0x7fff , 0x47 , 0x53 , 0xab , 0xb7 , 0x7fff , 0x47 , 0x53 , 0xab , 0xb7 , 0x7fff , 0x47 , 0x54 , 0xaa , 0xb7 , 0x7fff , 0x48 , 0x54 , 0xaa , 0xb6 , 0x7fff , 0x48 , 0x54 , 0xaa , 0xb6 , 0x7fff , 0x48 , 0x54 , 0xaa , 0xb6 , 0x7fff , 0x48 , 0x55 , 0xa9 , 0xb6 , 0x7fff , 0x49 , 0x55 , 0xa9 , 0xb5 , 0x7fff , 0x49 , 0x56 , 0xa8 , 0xb5 , 0x7fff , 0x49 , 0x56 , 0xa8 , 0xb5 , 0x7fff , 0x4a , 0x56 , 0xa8 , 0xb4 , 0x7fff , 0x4a , 0x57 , 0xa7 , 0xb4 , 0x7fff , 0x4a , 0x57 , 0xa7 , 0xb4 , 0x7fff , 0x4b , 0x58 , 0xa6 , 0xb3 , 0x7fff , 0x4b , 0x58 , 0xa6 , 0xb3 , 0x7fff , 0x4c , 0x59 , 0xa5 , 0xb2 , 0x7fff , 0x4c , 0x59 , 0xa5 , 0xb2 , 0x7fff , 0x4d , 0x5a , 0xa4 , 0xb1 , 0x7fff , 0x4d , 0x5b , 0xa3 , 0xb1 , 0x7fff , 0x4e , 0x5b , 0xa3 , 0xb0 , 0x7fff , 0x4e , 0x5c , 0xa2 , 0xb0 , 0x7fff , 0x4f , 0x5d , 0xa1 , 0xaf , 0x7fff , 0x50 , 0x5d , 0xa1 , 0xae , 0x7fff , 0x50 , 0x5e , 0xa0 , 0xae , 0x7fff , 0x51 , 0x5f , 0x9f , 0xad , 0x7fff , 0x51 , 0x60 , 0x9e , 0xad , 0x7fff , 0x52 , 0x61 , 0x9d , 0xac , 0x7fff , 0x53 , 0x62 , 0x9c , 0xab , 0x7fff , 0x54 , 0x63 , 0x9b , 0xaa , 0x7fff , 0x55 , 0x64 , 0x9a , 0xa9 , 0x7fff , 0x55 , 0x65 , 0x99 , 0xa9 , 0x7fff , 0x56 , 0x67 , 0x97 , 0xa8 , 0x7fff , 0x57 , 0x68 , 0x96 , 0xa7 , 0x7fff , 0x58 , 0x6a , 0x94 , 0xa6 , 0x7fff , 0x59 , 0x6b , 0x93 , 0xa5 , 0x7fff , 0x5a , 0x6d , 0x91 , 0xa4 , 0x7fff , 0x5b , 0x70 , 0x8e , 0xa3 , 0x7fff , 0x5c , 0x72 , 0x8c , 0xa2 , 0x7fff , 0x5e , 0x76 , 0x88 , 0xa0 , 0x7fff , 0x5f , 0x7d , 0x81 , 0x9f , 0x7fff , 0x60 , 0x9e , 0x7fff , 0x62 , 0x9c , 0x7fff , 0x63 , 0x9b , 0x7fff , 0x65 , 0x99 , 0x7fff , 0x67 , 0x97 , 0x7fff , 0x69 , 0x95 , 0x7fff , 0x6b , 0x93 , 0x7fff , 0x6e , 0x90 , 0x7fff , 0x71 , 0x8d , 0x7fff , 0x75 , 0x89 , 0x7fff , 0x7e , 0x80 , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff , 0x7fff }; netmaze-0.81+jpg0.82.orig/iocntl.c0100600000175000017500000000732105543412331017010 0ustar jgoerzenjgoerzen#include #include #include #include "netmaze.h" #ifdef RS6000 #include #endif #include #include #include #include #include #include #ifdef HAVE_FDSET struct fd_set readmask; struct fd_set writemask; #else struct fd_mask readmask; struct fd_mask writemask; #endif struct timeval notimeout; static struct hostent *hp; /* pointer to host info for remote host */ static struct sockaddr_in remoteaddr; /* server connect */ static void io_handler(int); extern void handle_socket(void); extern void ident_player(void); extern int init_audio(void); extern void kick_audio(void); int own_socket,max_fd=0; static int audio; int init_net(char *hostname) { int ret; #ifdef USE_SIGVEC struct sigvec vec; #else struct sigaction vec; #endif #ifndef USE_IPC int flag = 1; #endif notimeout.tv_sec = 0; notimeout.tv_usec = 0; #ifdef USE_SIGVEC vec.sv_handler = (void (*)) io_handler; vec.sv_mask = 0; vec.sv_flags = 0; if ( sigvector(SIGIO, &vec, (struct sigvec *) 0) == -1) perror(" sigaction(SIGIO)"); #else vec.sa_handler = (void (*)) io_handler; #ifdef RS6000 /* ibm rs/6000 */ sigemptyset(&vec.sa_mask); #else vec.sa_mask = 0; #endif vec.sa_flags = 0; if ( sigaction(SIGIO, &vec, (struct sigaction *) 0) == -1) perror(" sigaction(SIGIO)"); #endif remoteaddr.sin_family = AF_INET; if ((hp = gethostbyname(hostname) ) == NULL) { fprintf(stderr, "netmaze: can't resolve hostname: %s.\n",hostname); exit(1); } remoteaddr.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr; if((own_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) { fprintf(stderr, "netmaze: unable to create socket.\n"); exit(1); } remoteaddr.sin_port = htons(NETMAZEPORT); FD_ZERO(&readmask); FD_ZERO(&writemask); FD_SET(own_socket,&readmask); max_fd = own_socket+1; #ifdef USE_SOUND audio = init_audio(); if(audio >= 0) { FD_SET(audio,&writemask); if(audio > max_fd-1) max_fd = audio+1; } #endif #ifdef USE_IPC FD_SET(0,&readmask); /* pipe! */ #else if (ioctl(own_socket, FIOASYNC, &flag) == -1) { perror("socket: ioctl(FIOASYNC)"); exit(1); } #endif if ( (ret=connect(own_socket,(struct sockaddr *) &remoteaddr, sizeof(struct sockaddr))) == -1) { perror("connect"); exit(1); } #ifndef USE_IPC flag = -getpid(); if (ioctl(own_socket, SIOCSPGRP, &flag) == -1) { perror("process group"); } #endif printf("Connectet to %s. Connectcode: %d.\n",hostname,ret); ident_player(); #ifdef USE_IPC for(;;) io_handler(0); #else io_handler(0); #endif return 0; /* all is OK */ } /********************************************** * io-handler (socket/pipes) */ static void io_handler(int a) { int numfds; static char buf[256]; #ifdef HAVE_FDSET struct fd_set readmask1; struct fd_set writemask1; #else struct fd_mask readmask1; struct fd_mask writemask1; #endif for(;;) { extern int playit; readmask1 = readmask; if(playit) writemask1 = writemask; else FD_ZERO(&writemask1); #ifdef USE_IPC if((numfds = select(max_fd,&readmask1,&writemask1,NULL,NULL))< 0) continue; #else if((numfds = select(max_fd,&readmask1,&writemask1,NULL,¬imeout))<0) { perror("select failed "); exit(2); } #endif if(numfds == 0) break; if(FD_ISSET(own_socket,&readmask1)) handle_socket(); #ifdef USE_IPC if(FD_ISSET(0,&readmask1)) { if(read(0,buf,256) == 0) /* sure is sure */ { fprintf(stderr,"Parent died!\n"); exit(1); } } #endif if(audio >= 0) if(FD_ISSET(audio,&writemask1)) kick_audio(); } } netmaze-0.81+jpg0.82.orig/better.c0100600000175000017500000002575705554007726017034 0ustar jgoerzenjgoerzen/* BetterBot(BB) Version 0.6beta 20.2.94 ** ** vom Frankfurt-Netmaze-Support-Team ** ** Jens Kurlanda, Benjamin Baermann ** ** kurlanda@informatik.uni-frankfurt.de ** benni@informatik.uni-frankfurt.de ** ** ** There are NO bugs... only unwanted Features ;-) */ #include #include #include "netmaze.h" #include "better.h" #define BIGGEST /* groesster long-wert */ #define NERVOUS 50000000 /* ab hier sucht BB sein Opfer */ #define TODESRADIUS1 7000000 #define TODESRADIUS 15000000 extern int walktab[320]; /* static-declaration in allmove.c muss nicht-static werden */ static int ownnumber; extern struct shared_struct *sm; static int enemy_touch(PLAYER *player,PLAYER *opfer){ long xd,yd; xd = (player->x - opfer->x); yd = (player->y - opfer->y); if(xd < 0) xd = -xd; if(yd < 0) yd = -yd; if((xd > 0x800000) || (yd > 0x800000)) return 0; xd>>=12; yd>>=12; if( (xd*xd + yd*yd) < 0x560000) return 1; return 0; } /* static int see_him(PLAYER* player){ sm->std_maze.vwalls[yc][xc+1] }; */ /* typedef enum {LINKS, GERADE, RECHTS} richtung; */ /******************* * the init_robot is called one time right after the start */ robodat_t robodat={0,GERADE,0,0,0,0,0,-2,"",0,-1,-1}; /* ich finde die verf***te standardfunktion nicht :-( */ int signum(int eingabe) { if (eingabe==0) return 0; else if(eingabe>0) return 1; else return -1; } /* umwandlung von quadranten nach longs und umgekehrt */ int ltoq(long eingabe) { return (int) ( (eingabe & 0xff000000) >> 24); } long qtol(int eingabe) { long ausgabe; ausgabe = (long) eingabe; return (eingabe << 24); } void laber(char *ausgabe) { fprintf(stderr,ausgabe); } /* diese funktion soll ueberpruefen, ob von x1,y1 nach x2,y2 eine direkte verbindung existiert (ohne waende dazwischen) sicher nicht besonders schoen, effizient oder gar korrekt ;-) aber es geht so einigermassen... */ int k_sichtbar(long x1,long y1,long x2,long y2) { int x1q,y1q,x2q,y2q,xqdiff,yqdiff; int x_count,y_count,vstep,hstep,hstep1,vstep1; long xdiff,ydiff,xl_count,yl_count,xl_step,yl_step; float xy,yx; /* in welchen quadranten? */ x1q = ltoq(x1); y1q = ltoq(y1); x2q = ltoq(x2); y2q = ltoq(y2); xqdiff=x1q-x2q; yqdiff=y1q-y2q; xdiff=x1-x2; ydiff=y1-y2; xy=(float)xdiff/ydiff; yx=(float)ydiff/xdiff; vstep=signum(xqdiff); hstep=signum(yqdiff); /* hier versuche ich mal, die neun faelle auf zwei zu reduzieren... */ /* horizontale waende (dunkelgrau) auf der verbindungslinie? */ if(hstep!=0) { x_count=x1q; xl_count=x1; xl_step= (hstep) * (long) (xy * 0x01000000); for(y_count=y1q+((hstep==-1)?1:0); (hstep==-1)?(y_count<=y2q):(y_count>y2q); (hstep==-1)?(y_count++):(y_count--) ) { xl_count-=xl_step; x_count=ltoq(xl_count); /*fprintf(stderr,"%d:%d=",x_count,y_count);*/ if((sm->std_maze.hwalls[y_count][x_count])) { return FALSE; } } } /* vertikale waende (hellgrau) auf der verbindungslinie? */ if (vstep!=0) { y_count=y1q; yl_count=y1; yl_step=-(vstep)*(long) (yx * 0x01000000); for(x_count=x1q+((vstep==-1)?1:0); (vstep==-1)?(x_count<=x2q):(x_count>x2q); (vstep==-1)?(x_count++):(x_count--) ) { if(hstep!=1) yl_count+=yl_step; else yl_count-=yl_step; y_count=ltoq(yl_count); if((sm->std_maze.vwalls[y_count][x_count])) { return FALSE; } } } return TRUE; } /* ist das opfer sichtbar? */ int sichtbar(int opfer) { return k_sichtbar(sm->playfeld[ownnumber].x,sm->playfeld[ownnumber].y, sm->playfeld[opfer].x,sm->playfeld[opfer].y); } void init_robot(void) { srand48(258245); strcpy(sm->owncomment,"Ich weiss, dass ich besser bin!"); } void start_robot(int num) { int i; ownnumber = num; /* hier wird festgestellt, welcher spieler nicht getoetet werden darf*/ robodat.freund=-2; strcpy(sm->owncomment,"Ich weiss, dass ich besser bin!"); for(i=0;ianzplayers;i++){ if (!strcmp(robodat.freundname,sm->playfeld[i].name)){ robodat.freund=i; fprintf(stderr,"Du bist mein Freund, %s!",sm->playfeld[robodat.freund].name); strcpy(sm->owncomment,robodat.freundname); strcat(sm->owncomment,"'s Feinde sind auch meine Feinde"); }; } send_owncomment(); } /* gibt die koordinate des abstandes zum opfer zurueck, die groesser ist */ long OpferDistanz(int opfer){ long x_dist, y_dist; if (opfer == -1) return BIGGEST; x_dist=labs((sm->playfeld[ownnumber].x)-(sm->playfeld[opfer].x)); y_dist=labs((sm->playfeld[ownnumber].y)-(sm->playfeld[opfer].y)); if (x_dist >= y_dist) return x_dist; else return y_dist; } /* ermittelt das naechste opfer mit hilfe von OpferDistanz() */ int Opfer(){ long BestOpfer=-1; long WeissesindenAugen=NERVOUS; int i; if (robodat.freund == -1 ) return robodat.exfreund; /* schleife ueber alle spieler */ for (i=0;ianzplayers;i++){ /* nur, wenn distanz kuerzer, nicht eigener spieler, nur lebende gegner, keine teampartner (funktioniert nicht immer :-( ) keine spieler, die in der kommandozeile angegeben waren*/ if( (WeissesindenAugen>OpferDistanz(i)) && (i!=ownnumber) && (sm->playfeld[i].alive) && ((sm->playfeld[i].team)!=(sm->playfeld[ownnumber].team)) && (robodat.freund!=i) ) { WeissesindenAugen = OpferDistanz(i); BestOpfer = i; }; }; return BestOpfer; } /* setzen der richtungen */ void geradeaus(void) { robodat.ret = JOY_UP; robodat.zustand = GERADE; robodat.counter = 0; } void rechts(void) { robodat.ret = JOY_RIGHT; robodat.zustand = RECHTS; robodat.counter = 0; } void links(void) { robodat.ret = JOY_LEFT; robodat.zustand = LINKS; robodat.counter = 0; } static int bewegt(){ return (!((robodat.oldy==sm->playfeld[ownnumber].y)&&(robodat.oldx==sm->playfeld[ownnumber].x))); } static long deg(double x,double y){ long winkel; if (x){ /* muss Berechnet Werden */ winkel = (long)(atan(y/x)/(2.0*M_PI) * 265 ); if (winkel > 0 ){ if (y > 0){ }else{ winkel += 128; }; }else{ if (y > 0){ winkel += 64 + 64 ; /* 2. Quadrant offset 64 + umdrehen des Winkels 64 */ }else{ winkel += 192 + 64 ; /* 2. Quadrant offset 192 + umdrehen des Winkels 64 */ }; }; }else{ /* x=0 => einfache Bestimmung von Winkel, gell ? */ if (y > 0) { winkel = 64; }else{ winkel = 192; }; }; return (winkel + 128) % 256 ; } static long target_angle(PLAYER* them){ int mx,my; int tx,ty; int dx,dy; int angle, diff; PLAYER* me= &(sm->playfeld[ownnumber]); /* mx = (int) ((me->x) >> 24); my = (int) ((me->y) >> 24); tx = (int) ((them->x) >> 24); ty = (int) ((them->y) >> 24); */ mx = me->x; my = me->y; tx = them->x; ty = them->y; dx = mx-tx; dy = my-ty; /* fprintf(stderr,"%li:%li:",dx,dy); */ return (int)deg((double)dy,(double)dx); } /* testen, was besser ist, rechts oder links fahren */ void angl(int opfer){ long ownwinkel=sm->playfeld[ownnumber].winkel; long angle = target_angle(&(sm->playfeld[opfer])); long wonkel; wonkel=angle - ownwinkel; /* fprintf (stderr,"\neigenwinkel %li winkel zu anderem %li diff %li ",ownwinkel,angle,wonkel); */ if ((wonkel)>0){ if (wonkel>128) links(); else rechts(); }else{ if (wonkel > (-128)) links(); else rechts(); }; } /* wird bei jedem 'tick' aufgerufen. das herz von BB. bb - Falsch BB hat kein Herz . JK*/ int own_action(void){ static touchie=0; int opfer, winkel, owinkel, hwinkel, lwinkel, alt_opfer; long x_dist,y_dist,nx_dist,ny_dist,lx_dist,ly_dist,hx_dist,hy_dist; long i; if (!(sm->playfeld[ownnumber].alive)){ /* I'm dead , wooouueeehhhh */ touchie=0; if (!(robodat.tod)){ /* killed right now - look at the killer, and if its the friend ...*/ robodat.tod=1;/* I'm dead*/ if (sm->playfeld[ownnumber].ownkiller==robodat.freund){ /* ts, ts */ robodat.exfreund=robodat.freund; robodat.freund=-1; fprintf(stderr,"No more Mister Nice Guy, %s!",sm->playfeld[robodat.freund].name); sprintf(sm->owncomment,"%s, you fucking traitor pig : die scum!",robodat.freundname); send_owncomment(); }; }; }else{/*not dead*/ if (robodat.tod){ /* if was dead, reset deadflag */ robodat.tod=0; }; touchie=0; /* JA! BB hat ein Opfer gefunden und ist nicht in einem Ausweichmanoever */ opfer = Opfer(); /* Get a matching victim */ if (opfer != robodat.alt_opfer ){ /* Is it a new victim ?*/ if (opfer > -1){ robodat.jagd=1; fprintf(stderr,"Die Jagd auf %s beginnt!\n",sm->playfeld[opfer].name); }else{ robodat.jagd=0; fprintf(stderr,"Ende der Jagd auf %s!\n",sm->playfeld[robodat.alt_opfer].name); }; robodat.alt_opfer = opfer; }; /* turn your face to the black man */ if ((!(robodat.ausweichen))&&(opfer>-1)) angl(opfer); /* if no move , evade */ if ((robodat.ausweichen) || (!bewegt() )){ if ( robodat.ausweichen==0){ /* if not in evade mode, look at the situation */ if (robodat.jagd && sichtbar(opfer)){/* chasing a victim and have eye contact */ if (enemy_touch(&(sm->playfeld[ownnumber]),&sm->playfeld[opfer])){ /* if touchin victim no more action */ touchie=2; robodat.ausweichen = 0; fprintf(stderr,"%s : enemy touch\n",sm->ownname); }else{ if (touchie){/* if touched until know, no action */ touchie--; fprintf(stderr,"%s : the pig flees! (no touch)\n",sm->ownname); }else{ /* I seem to be blocked by a wall, but see the victim ->evade a short time*/ i = (long)(drand48() * 2); switch (i) { case 0 : robodat.ret = JOY_RIGHT; break; case 1 : robodat.ret = JOY_LEFT; break; }; robodat.ausweichen = 10; fprintf(stderr,"%s : evade! (no touch)\n",sm->ownname); }; }; }else{ /* I seem to be blocked by a wall ->evade a long time */ i = (long)(drand48() * 2); switch (i) { case 0 : robodat.ret = JOY_RIGHT; break; case 1 : robodat.ret = JOY_LEFT; break; }; touchie=0; if (!robodat.jagd) robodat.ausweichen = 15; fprintf(stderr,"%s : evade!\n",sm->ownname); }; }else robodat.ausweichen--; /* count down evading */ }else if (!robodat.jagd){ /* no victim , no evade */ i = (long)(drand48() * 40); touchie=0; robodat.counter++; switch(i){ case 0: if ((robodat.zustand!=LINKS) && ((robodat.counter>5)&&(robodat.zustand!=GERADE)||(robodat.counter>40))) links(); break; case 1: if ((robodat.zustand!=RECHTS) && ((robodat.counter>5)&&(robodat.zustand!=GERADE)||(robodat.counter>40))) rechts; break; } if ((robodat.counter>10)&&(robodat.zustand!=GERADE)){ /* fprintf(stderr,"gerade aus!\n"); */ robodat.ret &=(( ~JOY_LEFT) && (~JOY_RIGHT) ); robodat.zustand=GERADE; robodat.counter=0; } }; if(!(sm->gamemode & GM_WEAKINGSHOTS) || (robodat.jagd)) robodat.ret |= JOY_BUTTON; }; robodat.ret |= JOY_UP; robodat.oldy=sm->playfeld[ownnumber].y; robodat.oldx=sm->playfeld[ownnumber].x; return robodat.ret; } netmaze-0.81+jpg0.82.orig/TODO0100600000175000017500000000223305551261670016050 0ustar jgoerzenjgoerzenTODO and IDEAPOOL: ------------------ Sound-Support better wait-handling in the netmaze-main-loop (Mouse)/Joystick-support more bitmaps for mono-mode (and a better colourmap for the playercolours) statistics (and maybe a hall-of-fame) Asyncrounous X11-Keyboard-Input (only possible with IPC yet) better X11-expose-handling (rectangle-list) X11-Menus for netserv (see: xtest/xmserv) more setable game-configurations netsubserv... (better: rewrite the whole netserv) Manualpages more robot-players (lqet's start a robot-competition) (ok, I've gotten the first robots, but ... I NEED MORE !) rewrite wall<->shot collision-check (and the rebounce) rewrite the resort/clip-stuff implement all extended modes (and a mode with extra-weapons) remove the typos in the descriptions ;-) Playercommunication (messages: to team,to players,to master) Find the strange (very seldom) 'out-of-sync-bug'. (I hope I've found it!) Replay-Function maze-features: traps,teleport-fields,moving walls,invisible walls ....etc sidewalking,refresh fields .... better samples,better textures,textures selectable in the maze-file -- If someone want to do something from the list: do it and send it to me. netmaze-0.81+jpg0.82.orig/README0100600000175000017500000001166205553601715016246 0ustar jgoerzenjgoerzenNetmaze - V0.81 - April 1994 -------------------------------------------------------------------- [Don't run this version with older ones!!!!] [there were changes in the netprotocol from v0.62 to v0.7 to 0.8 !!] written and copyrights (c) by M.Hipp email: mhipp@student.uni-tuebingen.de -------------------------------------------------------------------- This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -------------------------------------------------------------------- This is the pre-release of a multiplayercombatgame. I release this incomplete version, because I think, that I won't have the time to complete it in the next months. In this version there still bugs, but you can play it (I hope) without getting 'core's. Most of the bugs are in the gfx/clip-functions (and the netserv, of course). What is netmaze: ---------------- Netmaze is a client/server multiplayergame. You play in a virtuell maze and the goal of the game is to hunt down your opponents. The view is full animated 3D. On fast machines, you can even run it smooth with texturemaping at the walls and the floor. The game requires: - fast X11-Grafix (copying offscreen-pixmap/image to the foreground-window, drawing polygons) - a (semi)fast Network with 'ping'-times lower than 30ms from EVERY client to the servermachine. (if one connection isn't fast enough, it slows down all players.) (For LAN's (e.g. in a pool) this shouldn't be a problem!) (if your network isn't fast enough, you can try to change the beat-divider in the netserv from 1 to 2 or 4 and/or start it with -nowait) Don't try to patch the code if you want to cheat. It should be near impossible. I have tested the program on HPUX,SunOS4.1.3 and Linux-Machines. There is a RS6000 & NeXT port. (see CREDITS) It was also reported, that the program runs on SGI and DEC 5000 machines. **************************************************************************** ******** FOR LINUX: You have to compile the IPC-Stuff in your kernel ******* **************************************************************************** If you find any bugs or port netmaze to a new environment, please let me know. I'm also happy about fanmails, showing me that the hundreds of hours I spend since late 1991 to code this game weren't a waste of time. Hope you enjoy it, Mike how to install: (short! ;-) ) ---------------------------- - Get an ANSI-C-Compiler. (in the Makefile, 'gcc' is selected). - Now there is an Imakefile. Just type 'xmkmf' to create a Makefile for your machine. (there is also an alternate Makefile (Makefile.alt), which you can use, if there is a problem with the 'imake'-generated one. - Now you have to select one of the environments in the config.h file. - Sorry, but a lot of the comments/names in the program are in german, so this won`t help. - The warnings about the 'select'-command aren't important. - if your system doesn't support asyncronous input/output you can try to add a: '#define USE_IPC' at the the end of the config.h file. - if your machine doesn't support the shared memory extension for X11, remove the -DSH_MEM in the Makefile/Imakefile. how to use: (short help with 'netmaze -h') ----------- Start the server 'netserv' on a machine. Then every player can start his netmaze-client. example: netmaze -server Without calling a server-machine the program enters a one-player-(team)-test-mode. The 'dummy' is a demo-robot. You can connect some of them to the netserv if you want more enemies. (But this demo-robot is really a stupid one.) You can write your own robots. (see dummy.c) Always try to run the netmaze-client on a machine with less load and in the foreground. You can first do a 'xset -r' if you want a better keyboard-handling. (use 'xset r' to switch it on again.) You can select a teammode by adding a teamlist to the (2)-Command in the netserv. You can select an extended (and an extended just-for-fun) mode. Set the NETMAZE_NAME or NETMAZE_COMMENT environment-variable to choose another default name and comment. known bugs: (this is still a preversion!!) ------------------------------------------- x11: (some) bugs in the refresh gfx: bugs in the (re)sort and clip-functions allmove: sometimes the game is out-of-sync (different machines are having different game-states) (I hope, that I found it) somtimes problems with shot-rebounce textures in huge-mode: sometimes cores. (I think that's an overflow) .. and many more .. ;-) netmaze-0.81+jpg0.82.orig/defmaze.h0100600000175000017500000000131205553471437017147 0ustar jgoerzenjgoerzenint defmazelen = 23; char *defmazedata[] = { "XXXXXXXXXXXXXXXXXXXXXXX", "X.X...........8.......X", "X.XXX.....X...X9X...X.X", "X...X.....X.........6.X", "X...X.....X3X.XXX...X.X", "X.........X.........7.X", "XXX.XXX.X2X...XXX...X.X", "X.....X.......X.......X", "X.....XXX.X4X.X.XXX...X", "X...........X...X.....X", "X.XXX.....XXX...X.XXX5X", "X.........X.......X...X", "X...X...XXX.X1X.X.X...X", "X...X.....X.....X.....X", "X...XXX.X.X.XXXXX.....X", "X.......X.............1", "X...X...XXXXX...XXX...X", "X...X.....X.....X.....X", "X...X.XXX.X.....X.....X", "X.......X.......X.....X", "XXX...XXXXX...XXXXX...X", "X.......X.......X.....X", "XXXXXXXXXXXXXXXXXXXXXXX" }; netmaze-0.81+jpg0.82.orig/x11cntrl.c0100600000175000017500000001547305542600301017176 0ustar jgoerzenjgoerzen/* * X11: (event) - control */ #include #include #include #include "netmaze.h" extern struct shared_struct *sm; extern void run_game(MAZE*,PLAYER*); extern void draw_info(void); void x11_flush(void) { XFlush(sm->grafix.display); } void x11_cntrl(void) { int i; XEvent event1; KeySym key; char text[10]; #ifdef USE_IPC for(;;) { if(sm->sologame) if(!(XEventsQueued (sm->grafix.display1,QueuedAfterReading) > 0)) /* if(!(XEventsQueued (sm->grafix.display1,QueuedAlready) > 0)) */ break; #else while(XEventsQueued (sm->grafix.display1,QueuedAfterReading) > 0) /* while(XEventsQueued (sm->grafix.display1,QueuedAlready) > 0) */ { #endif /* x11_flush(); */ XNextEvent(sm->grafix.display1,&event1); switch(event1.type) { case Expose: if(event1.xexpose.window == sm->grafix.gamefg) { sm->bgdraw = TRUE; sm->redraw = TRUE; } else if(event1.xexpose.window == sm->grafix.statusfg) { sm->redraw = TRUE; sm->statchg2 = sm->statchg1 = TRUE; } else if(event1.xexpose.window == sm->grafix.killfg) { sm->redraw = TRUE; sm->killchg = TRUE; } break; case ButtonPress: switch (event1.xbutton.button) { case Button1: sm->ownstick |= JOY_LEFT; /* Left */ break; case Button2: sm->ownstick &= ~JOY_HIDE; if (event1.xbutton.state & (ShiftMask | ControlMask)) sm->ownstick |= JOY_DOWN; /* Down */ else sm->ownstick |= JOY_UP; /* Up */ break; case Button3: sm->ownstick |= JOY_RIGHT; /* Right */ break; } break; case ButtonRelease: switch (event1.xbutton.button) { case Button1: sm->ownstick &= ~JOY_LEFT; /* Left */ break; case Button2: if (event1.xbutton.state & (ShiftMask | ControlMask)) sm->ownstick &= ~JOY_DOWN; /* Down */ else sm->ownstick &= ~JOY_UP; /* Up */ break; case Button3: sm->ownstick &= ~JOY_RIGHT; /* Right */ break; } break; case KeyPress: i = XLookupString( (XKeyEvent*) &event1,text,10,&key,0); switch(key) { case XK_Up: sm->ownstick |= JOY_UP; sm->ownstick &= ~JOY_HIDE; break; case XK_Down: sm->ownstick &= ~JOY_HIDE; sm->ownstick |= JOY_DOWN; break; case XK_Right: sm->ownstick |= JOY_RIGHT; break; case XK_Left: sm->ownstick |= JOY_LEFT; break; case XK_Shift_L: case XK_Shift_R: case XK_Control_L: case XK_Control_R: sm->ownstick |= JOY_SLOW; break ; case XK_Return: if (sm->ownstick & JOY_RADAR) sm->ownstick &= ~JOY_RADAR; /* RADAR */ else sm->ownstick |= JOY_RADAR; break; case 'c': if (sm->ownstick & JOY_HIDE) sm->ownstick &= ~JOY_HIDE; /* HIDE */ else sm->ownstick |= JOY_HIDE; break; case ' ': sm->ownstick &= ~JOY_HIDE; sm->ownstick |= JOY_BUTTON; break; case 'm': if(sm->newmap) sm->newmap = FALSE; else sm->newmap = TRUE; case 'l': if(sm->locator) sm->locator = FALSE; else sm->locator = TRUE; case '1': if((!sm->gameflag) && sm->sologame) { run_game(&(sm->std_maze),sm->playfeld); sm->gameflag = TRUE; } break; case 'p': if(TRUE) { sm->shownumbertmp++; if (sm->shownumbertmp == sm->anzplayers) sm->shownumbertmp = 0; sm->statchg1 = TRUE; sm->killchg = TRUE; } break; case 'j': if(sm->sologame) { sm->joynumber++; if (sm->joynumber == sm->anzplayers) sm->joynumber = 0; } break; case 's': sm->debug = TRUE; break; case 'Q': sm->exitprg = 1; break; } break; case KeyRelease: i = XLookupString( (XKeyEvent*) &event1,text,10,&key,0); switch(key) { case XK_Up: sm->ownstick &= ~JOY_UP; break; case XK_Down: sm->ownstick &= ~JOY_DOWN; break; case XK_Right: sm->ownstick &= ~JOY_RIGHT; break; case XK_Left: sm->ownstick &= ~JOY_LEFT; break; case XK_Shift_L: case XK_Shift_R: case XK_Control_L: case XK_Control_R: sm->ownstick &= ~JOY_SLOW; break; case ' ': sm->ownstick &= ~JOY_BUTTON; break; } break; case ConfigureNotify: if(event1.xconfigure.window == sm->grafix.gamefg) { if(event1.xconfigure.width != sm->grafix.shint.width) sm->bgdraw=TRUE; sm->grafix.shint.width = event1.xconfigure.width; if(event1.xconfigure.height != sm->grafix.shint.height) sm->bgdraw=TRUE; sm->grafix.shint.height = event1.xconfigure.height; if(sm->bgdraw) sm->redraw = TRUE; } else if(event1.xconfigure.window == sm->grafix.statusfg) { sm->grafix.sthint.width = event1.xconfigure.width; sm->grafix.sthint.height = event1.xconfigure.height; sm->statchg1 = sm->statchg2 = TRUE; } else if(event1.xconfigure.window == sm->grafix.killfg) { sm->killchg = TRUE; } break; } } } netmaze-0.81+jpg0.82.orig/INSTALL0100600000175000017500000000076305551261535016417 0ustar jgoerzenjgoerzenRead the 'README' !! :-) ------------------------ for the impatient guys: edit: config.h (to select an environment) (edit: audio.c,Imakefile) run: xmkmf (to generate a Makefile) type: make (to compile the whole stuff) if an error occures: cp Makefile.alt Makefile (let us use the alternate Makefile) edit: Makefile (and set all important (paths/options/CC/libs) ) type: make (to compile the whole stuff) netmaze-0.81+jpg0.82.orig/draw_3d.c0100600000175000017500000004300305553471437017055 0ustar jgoerzenjgoerzen/* * Calculate the gameview (optimizations are welcome) */ #ifdef ALL_PERFORMANCE_TEST #include #endif #include #include #include #include "trigtab.h" #include "netmaze.h" extern struct shared_struct *sm; static int wall_3d(long,long,long,long,int,WALL*); static void sort_walls(WALL*,int); static int comp(WALL*,WALL*); static int clip_walls(WALL*,int); static int calc_players(int,WALL*,PLAYER*,int); static int calc_shoots(int,WALL*,PLAYER*,int); static int calc_walls(PLAYER*,WALL*,MAZE*,int); static int stest(WALL *w1,WALL *w2); static void resort(WALL *f,int n); /* X11-Draw-stuff: */ extern void draw_maze(WALL*,PLAYER*,int,int); extern void draw_texture_maze(WALL *walls,PLAYER *play,int anzahl,int nr); extern void draw_rmap(PLAYER*,XSegment*,int); extern void draw_kill(PLAYER*,int); extern void draw_status(int,PLAYER*); extern void draw_kills(int,PLAYER*); static WALL wallbuff[300]; /* better would be a pointerfield to WALL-struct */ /************************************ * mainfunction: calls all important */ void draw_screen(void) { int anz=0,killer,i; memcpy(sm->playfeld1,sm->playfeld,sm->anzplayers*sizeof(PLAYER)); sm->statchg = sm->statchg1; sm->statchg1 = FALSE; sm->shownumber = sm->shownumbertmp; sm->playfeld[sm->shownumber].statchg = FALSE; sm->playfeld[sm->shownumber].killchg = FALSE; sm->anzlines = 0; /* maplines */ if(sm->playfeld1[sm->shownumber].alive) { anz = calc_players(sm->shownumber,wallbuff,sm->playfeld1,anz); anz = calc_shoots(sm->shownumber,wallbuff,sm->playfeld1,anz); anz = calc_walls(sm->playfeld1,wallbuff,&(sm->std_maze),anz); sort_walls(wallbuff,anz); if(sm->debug == 0) anz = clip_walls(wallbuff,anz); resort(wallbuff,anz); if(sm->debug) for(i=anz-1;i>=0;i--) printf("%d: %x %lx %lx %lx %lx\n",i,wallbuff[i].ident,wallbuff[i].rmax, wallbuff[i].rmin,wallbuff[i].xd,wallbuff[i].yd); if(sm->debug) sm->debug--; draw_status(sm->shownumber,sm->playfeld1); draw_kills(sm->shownumber,sm->playfeld1); if(sm->mapdraw) draw_rmap(sm->playfeld1,sm->maplines,sm->anzlines); #ifdef ALL_PERFORMANCE_TEST { long a=clock(); #endif if(!sm->texturemode) draw_maze(wallbuff,sm->playfeld1,anz,sm->shownumber); /* <-does XSync()*/ else draw_texture_maze(wallbuff,sm->playfeld1,anz,sm->shownumber); #ifdef ALL_PERFORMANCE_TEST a=clock()-a; fprintf(stderr,"%ld ",a); } #endif } else { killer = sm->playfeld1[sm->shownumber].ownkiller; draw_status(sm->shownumber,sm->playfeld1); draw_kills(sm->shownumber,sm->playfeld1); draw_kill(sm->playfeld1,killer); /* <- does XSync() */ } } /**************************** * Clipping of invisible walls */ static int clip_walls(WALL *walls,int anzahl) { int desti=0,i,j; register int xr,xl,rclip,lclip; WALL *wall1; struct { int r,l; } cliplist[300]; int cliplen = 0; int update,drawflag; wall1 = walls; for(j=0;j>1); xr = walls[j].x2+(walls[j].h1>>1); if(xl < XMIN) { if(xr < XMIN) continue; else xl = XMIN; } if(xr > XMAX) { if(xl > XMAX) continue; else xr = XMAX; } for(i=0;i (rclip = cliplist[i].r)+1) continue; if(xr <= rclip) { drawflag = FALSE; i = cliplen; /* no 2nd loop */ break; } xl = rclip+1; } } } else /* wallclip */ { if( (xl = walls[j].lclip = walls[j].x1) < XMIN) xl = walls[j].lclip = XMIN; if( (xr = walls[j].rclip = walls[j].x2) > XMAX) xr = walls[j].rclip = XMAX; update = TRUE; drawflag = TRUE; for(i=0;i cliplist[i].r) { cliplist[i].l = xl; cliplist[i].r = xr; update = FALSE; break; } xr = walls[j].rclip = lclip-1; /*right wallside is behind another*/ cliplist[i].l = xl; update = FALSE; break; } else { if(xl > (rclip = cliplist[i].r)+1) continue; if(xr <= rclip) { update = FALSE; /* whole wall is behind another wall */ drawflag = FALSE; i = cliplen; /* no second loop */ break; } xl = walls[j].lclip = rclip+1; cliplist[i].r = xr; update = FALSE; break; } } } if(!update) { for(i++;i (rclip = cliplist[i].r)+1) continue; if(xr <= rclip) { drawflag = FALSE; break; } xl = walls[j].lclip = rclip+1; } } } else { cliplist[cliplen].l = xl; cliplist[cliplen++].r = xr; } if(drawflag) walls[desti++] = walls[j]; } return(desti); } /***************************/ /* Z-Pos-Sorting */ /***************************/ static void sort_walls(WALL *walls,int anzahl) { qsort(walls,(size_t) anzahl,sizeof(WALL),(int (*)(const void*,const void*)) comp); } static int comp(WALL *wall1,WALL *wall2) { /* return (wall1->r) - (wall2->r); */ return (wall1->rmax+wall1->rmin) - (wall2->rmax+wall2->rmin); } /************************** * calculate the walls */ static int calc_walls(PLAYER *players,WALL *walls,MAZE *maze,int anzahl) { long xpos,ypos; int xloop,yloop,xfield,yfield,tnr; int xdim,ydim,xdist,ydist,istart,jstart,iend,jend; int winkel; long xrot,yrot,x1rot,y1rot,tsin,tcos; double xdrot,ydrot,dsin,dcos /* xd1rot,yd1rot */ ; int i,j,p; int (*hwalls)[MAZEDIMENSION],(*vwalls)[MAZEDIMENSION]; long xd,yd,xd1; PLAYER *player; player = players+sm->shownumber; xpos = player->x; ypos = player->y; winkel = player->winkel; hwalls = maze->hwalls; vwalls = maze->vwalls; dsin = (double) (tsin = trigtab[winkel]); dcos = (double) (tcos = trigtab[winkel+64]); xfield = (int) (xpos>>24); yfield = (int) (ypos>>24); xdim = maze->xdim; ydim = maze->ydim; if(xfield < SICHTWEITE-1) xloop = xfield+1; else xloop = SICHTWEITE; xdist = xloop-1; if(xfield > xdim - SICHTWEITE) xloop += (xdim-xfield); else xloop += SICHTWEITE; if(yfield < SICHTWEITE-1) yloop = yfield+1; else yloop = SICHTWEITE; ydist = yloop-1; if(yfield > ydim - SICHTWEITE) yloop += (ydim-yfield); else yloop += SICHTWEITE; istart = yfield-ydist; jstart = xfield-xdist; iend = yloop+istart; jend = xloop+jstart; xdrot = (double) (xd1 = ((long)(-xdist)<<24) - (xpos & 0x00ffffff)); ydrot = (double) (yd = ((long)(-ydist)<<24) - (ypos & 0x00ffffff)); /* xd1rot = xdrot*dcos - ydrot*dsin; yd1rot = ydrot*dcos + xdrot*dsin; */ x1rot = xrot = (long) ( (xdrot*dcos - ydrot*dsin) / 0x1000000 ); y1rot = yrot = (long) ( (ydrot*dcos + xdrot*dsin) / 0x1000000 ); sm->marks=0; for(i=istart;inewmap) { if (sm->mapdraw && ((i==istart) || (i == iend-1))) { sm->maplines[sm->anzlines].x1 = (short) (x1rot>>21)+MAPSIZE/2; sm->maplines[sm->anzlines].y1 = (short) (-y1rot>>21)+MAPSIZE/2; sm->maplines[sm->anzlines].x2 = (short) ((x1rot+tcos)>>21)+MAPSIZE/2; sm->maplines[sm->anzlines].y2 = (short) (-(y1rot+tsin)>>21)+MAPSIZE/2; sm->anzlines++; } if (sm->mapdraw && (j==jstart || j==jend-1) ) { sm->maplines[sm->anzlines].x1 = (short) (x1rot>>21)+MAPSIZE/2; sm->maplines[sm->anzlines].y1 = (short) (-y1rot>>21)+MAPSIZE/2; sm->maplines[sm->anzlines].x2 = (short) ((x1rot-tsin)>>21)+MAPSIZE/2; sm->maplines[sm->anzlines].y2 = (short) (-(y1rot+tcos)>>21)+MAPSIZE/2; sm->anzlines++; } for(p=0; panzplayers; p++) { int tx=((players+p)->x)>>24; int ty=((players+p)->y)>>24; /* * If they can see you, you can see them... */ if (player->radar || players[p].radar) if (i == ty && j == tx && p!=sm->shownumber) { int x2 = ((x1rot+tcos)>>21)+(MAPSIZE>>1); int y2 = (-(y1rot+tsin)>>21)+(MAPSIZE>>1); int x3 = ((x1rot-tsin)>>21)+(MAPSIZE>>1); int y3 = (-(y1rot+tcos)>>21)+(MAPSIZE>>1); sm->markers[sm->marks].x = (x3-((x3-x2)>>1)); sm->markers[sm->marks].y = (y3-((y3-y2)>>1)); sm->markers[sm->marks++].player = p; } } } if(tnr=(hwalls[i][j] & MAZE_TYPEMASK)) { if(sm->mapdraw && !sm->newmap) { sm->maplines[sm->anzlines].x1 = (short) (x1rot>>21)+MAPSIZE/2; sm->maplines[sm->anzlines].y1 = (short) (-y1rot>>21)+MAPSIZE/2; sm->maplines[sm->anzlines].x2 = (short) ((x1rot+tcos)>>21)+MAPSIZE/2; sm->maplines[sm->anzlines++].y2 =(short)(-(y1rot+tsin)>>21)+MAPSIZE/2; } if(wall_3d(x1rot,y1rot,x1rot+tcos,y1rot+tsin,0x100|(tnr<<10),&walls[anzahl])) { walls[anzahl].xd = (xd > -0x800000)?xd+0x800000:-xd-0x800000; walls[anzahl++].yd = (yd>0)?yd:-yd; } } if(tnr=(vwalls[i][j] & MAZE_TYPEMASK)) { if(sm->mapdraw && !sm->newmap) { sm->maplines[sm->anzlines].x1 = (short) (x1rot>>21)+MAPSIZE/2; sm->maplines[sm->anzlines].y1 = (short) (-y1rot>>21)+MAPSIZE/2; sm->maplines[sm->anzlines].x2 = (short) ((x1rot-tsin)>>21)+MAPSIZE/2; sm->maplines[sm->anzlines++].y2=(short)(-(y1rot+tcos)>>21)+MAPSIZE/2; } if(wall_3d(x1rot,y1rot,x1rot-tsin,y1rot+tcos,0x200|(tnr<<10),&walls[anzahl])) { walls[anzahl].xd = (xd>0)?xd:-xd; walls[anzahl++].yd = (yd > -0x800000)?yd+0x800000:-yd-0x800000; } } x1rot += tcos; y1rot += tsin; } x1rot = (xrot -= tsin); y1rot = (yrot += tcos); } return anzahl; } static int calc_players(int number,WALL *walls,PLAYER *players,int anz) { int i,wink; long x,y,xd,yd,rmax,rmin,hor1,h1; double xdrot,ydrot,dsin,dcos; x = players[number].x; y = players[number].y; wink = players[number].winkel; dsin = (double) trigtab[wink]; dcos = (double) trigtab[wink+64]; for(i=0;ianzplayers;i++) { if (((players[i].x != x) || (players[i].y != y)) && players[i].alive && (!players[i].hide)) { xdrot = (double) (xd = players[i].x - x); ydrot = (double) (yd = players[i].y - y); walls[anz].xd = ((xd>0) ? xd : -xd); walls[anz].yd = ((yd>0) ? yd : -yd); if( (yd = (long) ((ydrot*dcos + xdrot*dsin) / 0x1000000) >>16) > 0) { xd = (long) ((xdrot*dcos - ydrot*dsin) / 0x1000000) >>16; if(xd > 0) { rmax = ((xd+PRADIUS)*(xd+PRADIUS) + (yd+PRADIUS)*(yd+PRADIUS))<<2; rmin = ((xd-PRADIUS)*(xd-PRADIUS) + (yd-PRADIUS)*(yd-PRADIUS))<<2; } else { rmax = ((xd-PRADIUS)*(xd-PRADIUS) + (yd+PRADIUS)*(yd+PRADIUS))<<2; rmin = ((xd+PRADIUS)*(xd+PRADIUS) + (yd-PRADIUS)*(yd-PRADIUS))<<2; } hor1 = xd * (SCREEN - FLUCHT); hor1 /= (yd - FLUCHT); h1 = (SCREEN - FLUCHT) * SMILEYHEIGHT; h1 /= (yd - FLUCHT); hor1<<=12; h1<<=12; /* BRKPNT */ walls[anz].x2 = walls[anz].x1 = (int) hor1; walls[anz].h2 = (atan((double)xd/(double)(yd-FLUCHT))*128.0/M_PI) +128-players[i].winkel+wink; while(walls[anz].h2 < -128) walls[anz].h2 += 256; while(walls[anz].h2 >= 128) walls[anz].h2 -= 256; walls[anz].h1 = (int) h1; walls[anz].rmax = rmax; walls[anz].rmin = rmin; walls[anz++].ident = i; } } } return anz; } static int calc_shoots(int number,WALL *walls,PLAYER *players,int anz) { int i,j,wink; long x,y,xd,yd,rmax,rmin,h1; double xdrot,ydrot,dsin,dcos; x = players[number].x; y = players[number].y; wink = players[number].winkel; dsin = (double) trigtab[wink]; dcos = (double) trigtab[wink+64]; for(i=0;ianzplayers;i++) { for(j=players[i].shotqueue2;j >= 0;j=players[i].shots[j].next) { xdrot = (double) (xd = players[i].shots[j].sx - x); ydrot = (double) (yd = players[i].shots[j].sy - y); walls[anz].xd = ((xd>0) ? xd : -xd); walls[anz].yd = ((yd>0) ? yd : -yd); if( (yd = (long) ((ydrot*dcos + xdrot*dsin) / 0x1000000) >>16) > 0) { if( (xd = (long) ((xdrot*dcos - ydrot*dsin) / 0x1000000) >> 16) > 0) { rmax = ((xd+PRADIUS)*(xd+PRADIUS) + (yd+PRADIUS)*(yd+PRADIUS))<<2; rmin = ((xd-PRADIUS)*(xd-PRADIUS) + (yd-PRADIUS)*(yd-PRADIUS))<<2; } else { rmin = ((xd+PRADIUS)*(xd+PRADIUS) + (yd-PRADIUS)*(yd-PRADIUS))<<2; rmax = ((xd-PRADIUS)*(xd-PRADIUS) + (yd+PRADIUS)*(yd+PRADIUS))<<2; } xd *= SCREEN - FLUCHT; xd /= (yd - FLUCHT); h1 = (SCREEN - FLUCHT) * SHOTHEIGHT; h1 /= (yd - FLUCHT); xd<<=12; h1<<=12; walls[anz].x2 = walls[anz].x1 = (int) xd; walls[anz].h2 = walls[anz].h1 = (int) h1; walls[anz].rmax = rmax; walls[anz].rmin = rmin; walls[anz++].ident = i+32; /* 32=MAXPLAYER*/ } } } return anz; } static int wall_3d(long x1,long y1,long x2,long y2,int ident,WALL *wall) { long rmax,rmin,x,r,h1,h2; x1 >>= 16; x2 >>= 16; y1 >>= 16; y2 >>= 16; /* wrong in texturemode */ wall->clipped = 0; if ((y1 > 0) && (y2 < 0)) { wall->clipped = 2; x = y1 * (x2 - x1); x2 = x1 + x / (y1 - y2); y2 = 0; } else if ((y2 > 0) && (y1 < 0)) { wall->clipped = 1; x = y2 * (x1 - x2); x1 = x2 + x / (y2 - y1); y1 = 0; } if( (rmax=(x1*x1+y1*y1)<<2) < (rmin=(x2*x2+y2*y2)<<2) ) { r = rmax; rmax = rmin; rmin = r; } if((y1 >= 0) && (y2 >= 0)) { x1 *= (SCREEN - FLUCHT)<<8; x2 *= (SCREEN - FLUCHT)<<8; x1 /= (y1 - FLUCHT); x2 /= (y2 - FLUCHT); h1 = (SCREEN - FLUCHT) * WALLHEIGHT * 4096; h2 = (SCREEN - FLUCHT) * WALLHEIGHT * 4096; h1 /= (y1 - FLUCHT); h2 /= (y2 - FLUCHT); x1<<=4; x2<<=4; if(x1 < x2) { if(wall->clipped == 2) wall->clipped = 0; if ((x1 < XMAX) && (x2 > XMIN)) { wall->x1 = (int) x1; wall->x2 = (int) x2; wall->h1 = (int) h1; wall->h2 = (int) h2; wall->rmax = rmax; wall->rmin = rmin; wall->ident = ident; return TRUE; } } else if ((x2 < XMAX) && (x1 > XMIN)) { if(wall->clipped == 1) wall->clipped = 0; wall->x2 = (int) x1; wall->x1 = (int) x2; wall->h2 = (int) h1; wall->h1 = (int) h2; wall->rmax = rmax; wall->rmin = rmin; wall->ident = ident; return TRUE; } } return FALSE; } /*************************************** * Resort Walls/Smilies * * warning: xd,yd are absolut; this COULD cause problems */ static void resort(WALL *f,int n) { int i,j,c; WALL s; for(i=n-1;i>=0;i--) { for(j=i-1,c=0;j>=0;j--,c++) { if(c > 100) { fprintf(stderr,"R?"); return; } if(f[i].rmin > f[j].rmax) break; if(stest(&f[i],&f[j])) { s = f[i]; f[i] = f[j] ; f[j] = s; /* swappen */ if((f[i].xd == f[j].xd) && (f[i].yd == f[j].yd)) { /* sm->debug = 2; */ printf("E?\n"); break; } j = i; continue; /* second loop again */ } } } } /****************************** * Priotity-Test (very ugly and buggy) */ static int stest(WALL *w1,WALL *w2) { long d; int xr1,xl1,xr2,xl2; if(w1->ident < 0x100) { xl1 = w1->x1 - (w1->h1>>1); xr1 = w1->x1 + (w1->h1>>1); } else { xl1 = w1->x1; xr1 = w1->x2; } if(w2->ident < 0x100) { xl2 = w2->x1 - (w2->h1>>1); xr2 = w2->x1 + (w2->h1>>1); } else { xl2 = w2->x1; xr2 = w2->x2; } if((xl1 >= xr2) || (xr1 <= xl2)) return(FALSE); if( ((w1->ident < 0x100) && (w2->ident < 0x100)) || ((w1->ident >= 0x100) && (w2->ident >= 0x100)) ) { return(w1->rmax < w2->rmax); } if(sm->debug) { printf("%x %lx %lx - %x %lx %lx\n",w1->ident,w1->xd,w1->yd,w2->ident,w2->xd,w2->yd); printf("%d %d %d %d %d %d\n",w1->x1,w1->x2,w1->h1,w2->x1,w2->x2,w2->h1); printf("* %d %d %d %d\n",xl1,xr1,xl2,xr2); } if((w1->ident & 0x100) || (w2->ident & 0x100)) { if(w1->yd > w2->yd) { /* 2 in front of 1 */ d = w2->xd - w1->xd; if(d >= 0xc00000) return TRUE; return FALSE; } else { /* 1 in front of 2 */ d = w1->xd - w2->xd; if(d >= 0xc00000) return FALSE; return TRUE; } } else { if(w1->xd > w2->xd) { /* 2 in front of 1 */ d = w2->yd - w1->yd; if(d >= 0xc00000) return TRUE; return FALSE; } else { /* 1 in front of 2 */ d = w1->yd - w2->yd; if(d >= 0xc00000) return FALSE; return TRUE; } } } netmaze-0.81+jpg0.82.orig/CREDITS0100600000175000017500000000164705553507147016414 0ustar jgoerzenjgoerzenThanks to: Wayne Richardson (wdr@vnet.ibm.com) for the RS6000 port. Bjorn P. Brox (brox@dms.corena.no) for the mouse-control-support. Justin Beech (justinb@lehman.com) for the extended gamemode(s). Yang, Qing Kuang (yangq@sol.cs.wmich.edu) for the Imakefile Rainer Koch (koch@kapp-coburg.de) for the dither-grafix-version Jens Kurlanda,Benjamin Baermann (benni@/kurlanda@informatik.uni-frankfurt.de) for the betterbot Mike Roderick (roderick@ksu.ksu.edu) for the followerbot Nicolas Pioch (Nicolas.Pioch@enst.fr) Hate (Hate@MorgenGrauen/Hate@TubMUD, dunno email :) ) for the NeXT-Patches. Thomas Woerner (zxmwt09@student.uni-tuebingen.de) for the texturedesign. and many others for bug-reports (and fixes). and to all fanmailwriters. -- Sorry, but I didn't manage to reply all the mails, because sometimes it wasn't possbile to deliver the mail to the given return-path. netmaze-0.81+jpg0.82.orig/dummy.c0100600000175000017500000000141705542040140016645 0ustar jgoerzenjgoerzen/* This is a demonstration on how to write robots. * How about a competition between some robots? :-) */ #include "netmaze.h" extern struct shared_struct *sm; /******************* * the init_robot is called one time right after the start */ void init_robot(void) { strcpy(sm->ownname,"Dr.Dummy"); strcpy(sm->owncomment,"Gotcha!!!"); } void start_robot(int number) { } /******************* * the own_action is called every 'beat' * * this bot really is a dummy, I use this guy * to test my program with 31 'players'. */ int own_action(void) { static int i=0; int ret=0; i++; i &= 0x1f; switch(i & 0xf0) { case 0x00: ret = JOY_LEFT | JOY_BUTTON; break; case 0x10: ret = JOY_UP | JOY_BUTTON; break; } return ret; } netmaze-0.81+jpg0.82.orig/xtests/0040700000175000017500000000000005553575305016720 5ustar jgoerzenjgoerzennetmaze-0.81+jpg0.82.orig/xtests/xmmenu.c0100600000175000017500000001122105542041464020361 0ustar jgoerzenjgoerzen/* * this is just a test. */ #include #include #include #include #include #include #include #include #include #include #include String resources[] = { "*titlelabel.labelString: Netmaze - The Multiplayercombatgame!!", "*namelabel.labelString: Your Name: ", "*msglabel.labelString: Messages:", "*commentlabel.labelString: Your Comment:", "*ntext.columns: 16", "*ntext.highlightThickness: 0", "*ntext.editable: False", "*ntext.value: This is the name", "*ntext.cursorPositionVisible: False", "*ctext.columns: 32", "*ctext.highlightThickness: 0", "*ctext.editable: False", "*ctext.value: This is the comment", "*ctext.cursorPositionVisible: False", "*msgtext.columns: 36", "*msgtext.highlightThickness: 0", "*msgtext.editable: False", "*msgtext.value: This is the message-box.\\nHere you can read\\nthe messages from other\\nplayers.", "*msgtext.cursorPositionVisible: False", "*msgtext.rows: 5", "*msgtext.editMode: Multi_Line_Edit", "*pmsgtext.columns: 36", "*pmsgtext.highlightThickness: 0", "*pmsgtext.value: Write a message here", "*slabel.labelString: Send", "*tlabel.labelString: to", /* "*text.shadowThickness: 5", */ /* "*text.sensitive: True", */ NULL }; void hinfo(Widget w,XtPointer p1,XtPointer p2); void hquit(Widget w,XtPointer p1,XtPointer p2); void InputHandler(XtPointer c,int *s,XtInputId *id); XtAppContext app_con; void main(int argc,char **argv) { Widget top,ntext,ctext,vrow,form,tmp,tmp1,msgtext,pmsgtext,info,quit,help,fs; Arg args[2]; top = XtAppInitialize(&app_con, "Netmaze", NULL, 0, &argc, argv, resources, NULL, 0); form = XtCreateManagedWidget("form",xmFormWidgetClass,top,NULL,0); vrow = XtCreateManagedWidget("vrow",xmRowColumnWidgetClass,form,NULL,0); XtCreateManagedWidget("titlelabel",xmLabelWidgetClass,vrow,NULL,0); XtCreateManagedWidget("a_separator",xmSeparatorWidgetClass,vrow,NULL,0); tmp1 = XtCreateManagedWidget("a_row",xmRowColumnWidgetClass,vrow,NULL,0); XtSetArg(args[0],XmNorientation,XmHORIZONTAL); tmp = XtCreateManagedWidget("hrow",xmRowColumnWidgetClass,tmp1,args,1); XtCreateManagedWidget("namelabel",xmLabelWidgetClass,tmp,NULL,0); ntext = XtCreateManagedWidget("ntext",xmTextWidgetClass,tmp,NULL,0); tmp = XtCreateManagedWidget("a_row",xmRowColumnWidgetClass,tmp1,args,1); XtCreateManagedWidget("commentlabel",xmLabelWidgetClass,tmp,NULL,0); ctext = XtCreateManagedWidget("ctext",xmTextWidgetClass,tmp,NULL,0); XtCreateManagedWidget("a_separator",xmSeparatorWidgetClass,vrow,NULL,0); tmp = XtCreateManagedWidget("a_row",xmRowColumnWidgetClass,vrow,args,1); XtCreateManagedWidget("slabel",xmLabelWidgetClass,tmp,NULL,0); pmsgtext = XtCreateManagedWidget("pmsgtext",xmTextWidgetClass,tmp,NULL,0); XtCreateManagedWidget("tlabel",xmLabelWidgetClass,tmp,NULL,0); tmp = XtCreateManagedWidget("a_row",xmRowColumnWidgetClass,vrow,args,1); XtCreateManagedWidget("tomaster",xmPushButtonWidgetClass,tmp,NULL,0); XtCreateManagedWidget("toteam",xmPushButtonWidgetClass,tmp,NULL,0); XtCreateManagedWidget("toall",xmPushButtonWidgetClass,tmp,NULL,0); XtCreateManagedWidget("a_separator",xmSeparatorWidgetClass,vrow,NULL,0); tmp = XtCreateManagedWidget("a_row",xmRowColumnWidgetClass,vrow,args,1); XtCreateManagedWidget("msglabel",xmLabelWidgetClass,tmp,NULL,0); msgtext = XtCreateManagedWidget("msgtext",xmTextWidgetClass,tmp,NULL,0); XtCreateManagedWidget("a_separator",xmSeparatorWidgetClass,vrow,NULL,0); tmp = XtCreateManagedWidget("a_row",xmRowColumnWidgetClass,vrow,args,1); quit = XtCreateManagedWidget("pushquit",xmPushButtonWidgetClass,tmp,NULL,0); help = XtCreateManagedWidget("pushhelp",xmPushButtonWidgetClass,tmp,NULL,0); info = XtCreateManagedWidget("pushinfo",xmPushButtonWidgetClass,tmp,NULL,0); fs = XmCreateFileSelectionDialog(vrow,"fileselect",NULL,0); XtAddCallback(info, XmNactivateCallback, hinfo,(XtPointer) fs); XtAddCallback(quit, XmNactivateCallback, hquit,(XtPointer) top); XtAppAddInput(app_con,0,(XtPointer) XtInputReadMask,InputHandler,(XtPointer) 0); XtRealizeWidget(top); XtAppMainLoop(app_con); } void hinfo(Widget w,XtPointer p1,XtPointer p2) { fprintf(stderr,"OK"); XtManageChild((Widget) p1); } void hquit(Widget w,XtPointer p1,XtPointer p2) { XtDestroyApplicationContext(app_con); exit(0); } void InputHandler(XtPointer c,int *s,XtInputId *id) { char buf[1024]; int i; memset(buf,0,1024); i = read(*s,buf,1024); fprintf(stderr,"%d:%s\n",i,buf); if(i == 0) { XtDestroyApplicationContext(app_con); exit(0); } } netmaze-0.81+jpg0.82.orig/xtests/Makefile0100600000175000017500000000065605531463321020354 0ustar jgoerzenjgoerzenCC = gcc CFLAGS = -O2 -Wall -m486 -fomit-frame-pointer -I/usr/include/X11 XTLIBS = -lm -lXaw -lXt -lXext -lX11 X11LIBS = -lX11 XMLIBS = -lXm -lXt -lX11 #CFLAGS = +Aa +O2 -I/usr/include/Motif1.1 #XMLIBS = -L/usr/lib/Motif1.2 -L/usr/lib/X11R5 all: x11mouse xmmenu xmserv x11mouse: x11mouse.o $(CC) -o $@ x11mouse.o $(X11LIBS) xmmenu: xmmenu.o $(CC) -o $@ xmmenu.o $(XMLIBS) xmserv: xmserv.o $(CC) -o $@ xmserv.o $(XMLIBS) netmaze-0.81+jpg0.82.orig/xtests/switch.c0100600000175000017500000000071105550575664020370 0ustar jgoerzenjgoerzen#define A i++; void main(int argc,char **argv) { int c = atoi(argv[1]); int i=0; switch(c) { case 16: A case 15: A case 14: A case 13: A case 12: A case 11: A case 10: A case 9: A case 8: A case 7: A case 6: A case 5: A case 4: A case 3: A case 2: A case 1: A } printf("%d\n",i); } netmaze-0.81+jpg0.82.orig/xtests/texpix.c0100600000175000017500000000202205550600716020370 0ustar jgoerzenjgoerzen#define WRITEPIX ia1 -= XSIZE; *ia1 = pixval1; *ia2 = pixval2; ia2 += XSIZE; switch(*jmpt++ + ln) { case 0x1f: WRITEPIX case 0x1e: WRITEPIX case 0x1d: WRITEPIX case 0x1c: WRITEPIX case 0x1b: WRITEPIX case 0x1a: WRITEPIX case 0x19: WRITEPIX case 0x18: WRITEPIX case 0x17: WRITEPIX case 0x16: WRITEPIX case 0x15: WRITEPIX case 0x14: WRITEPIX case 0x13: WRITEPIX case 0x12: WRITEPIX case 0x11: WRITEPIX case 0x10: WRITEPIX case 0xf: WRITEPIX case 0xe: WRITEPIX case 0xd: WRITEPIX case 0xc: WRITEPIX case 0xb: WRITEPIX case 0xa: WRITEPIX case 0x9: WRITEPIX case 0x8: WRITEPIX case 0x7: WRITEPIX case 0x6: WRITEPIX case 0x5: WRITEPIX case 0x4: WRITEPIX case 0x3: WRITEPIX case 0x2: WRITEPIX case 0x1: WRITEPIX } netmaze-0.81+jpg0.82.orig/xtests/x11mouse.c0100600000175000017500000000744605542041464020550 0ustar jgoerzenjgoerzen#include #include #include #include #define JOY_LEFT 1 #define JOY_RIGHT 2 #define JOY_UP 4 #define JOY_DOWN 8 #define JOY_BUTTON 128 #define LOW_THRESHOLD 93 /* perhaps it's better to test x relativ to y */ #define HIGH_THRESHOLD 107 void main(void) { Display *xd; Window r,own; int end=0,catch=0; int s,x,y,joy=0; GC gc; int redraw=0; xd = XOpenDisplay(""); r = DefaultRootWindow(xd); s = DefaultScreen(xd); printf("This is a program to test a playable mousecontrol.\n"); printf(" To start the test, press Button1 in the Window\n"); printf(" To end the program, press Button3 in the Window\n"); printf("While the test is running, Button1 = Fire, Button = StopWalking.\n"); own = XCreateSimpleWindow(xd,r,100,100,200,200,5,0,BlackPixel(xd,s)); gc = XCreateGC (xd,r,0,0); XSelectInput (xd,own,PointerMotionMask|ButtonPressMask|ButtonReleaseMask); XMapRaised (xd,own); XFlush(xd); for(;end==0;) { XEvent event1; XNextEvent(xd,&event1); switch(event1.type) { case ButtonPress: if(event1.xbutton.button == Button1) { if(!catch) { catch = 1; XGrabPointer(xd,own,False, PointerMotionMask|ButtonPressMask|ButtonReleaseMask, GrabModeAsync,GrabModeAsync,own,None,event1.xbutton.time); } else { redraw = 1; joy |= JOY_BUTTON; } } else if(event1.xbutton.button == Button3) { XUngrabPointer(xd,event1.xbutton.time); end = 1; } else if(event1.xbutton.button == Button2) joy &= 0xf0; break; case ButtonRelease: if(event1.xbutton.button == Button1) { joy &= ~JOY_BUTTON; redraw = 1; } break; case MotionNotify: if(catch == 1) { if((event1.xmotion.x != 100) || (event1.xmotion.y != 100)) { if(event1.xmotion.x < LOW_THRESHOLD) { joy &= 0xf0; joy |= JOY_LEFT; if(event1.xmotion.y < LOW_THRESHOLD+2) joy |= JOY_UP; else if(event1.xmotion.y > HIGH_THRESHOLD-2) joy |= JOY_DOWN; } else if(event1.xmotion.x > HIGH_THRESHOLD) { joy &= 0xf0; joy |= JOY_RIGHT; if(event1.xmotion.y < LOW_THRESHOLD+2) joy |= JOY_UP; else if(event1.xmotion.y > HIGH_THRESHOLD-2) joy |= JOY_DOWN; } else if(event1.xmotion.y < LOW_THRESHOLD) { joy &= 0xf0; joy |= JOY_UP; } else if(event1.xmotion.y > HIGH_THRESHOLD) { joy &= 0xf0; joy |= JOY_DOWN; } XClearWindow(xd,own); if(joy & JOY_LEFT) x = 0; else if(joy & JOY_RIGHT) x = 200; else x = 100; if(joy & JOY_UP) y = 0; else if(joy & JOY_DOWN) y = 200; else y = 100; XDrawLine(xd,own,gc,100,100,x,y); if(joy & JOY_BUTTON) XDrawArc(xd,own,gc,93,93,14,14,0,64*360); redraw = 0; XWarpPointer(xd,None,own,0,0,0,0,100,100); } } break; } if(redraw) { XClearWindow(xd,own); if(joy & JOY_LEFT) x = 0; else if(joy & JOY_RIGHT) x = 200; else x = 100; if(joy & JOY_UP) y = 0; else if(joy & JOY_DOWN) y = 200; else y = 100; XDrawLine(xd,own,gc,100,100,x,y); if(joy & JOY_BUTTON) XDrawArc(xd,own,gc,93,93,14,14,0,64*360); redraw = 0; } } XDestroyWindow(xd,own); XCloseDisplay(xd); } netmaze-0.81+jpg0.82.orig/xtests/xmserv.c0100600000175000017500000002236605542041464020410 0ustar jgoerzenjgoerzen/* * This is just a test. * You can use this program as an external menu for the netserv * * Call: netserv -exmenu xmserv * with 'xmserv' = pathname of this program * * OK, it's Motif ... but soon, I will program a tcl-version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include enum { PUSHRUN,PUSHRUN1,PUSHTEAM,PUSHSTOP,PUSHQUIT,PUSHLIST,TEAMOK,TEAMCANCEL, CFGOK, PUSHCFG }; enum { MENU_NOP , MENU_LOADMAZE , MENU_RUNGAME , MENU_STOPGAME , MENU_LIST , MENU_DISCONNECT , MENU_SETMODE , MENU_SETDIVIDER , MENU_ERROR , MENU_RUNTEAMGAME , MENU_SETTEAMS }; String resources[] = { "*titlelabel.labelString: Netservcontrol", "*pushquit.labelString: Quit Prorgamm", "*pushrun.labelString: Run Game", "*pushrun1.labelString: Run Game with Teams", "*pushstop.labelString: Stop Game", "*pushlist.labelString: List Connections", "*pushteam.labelString: Select Teams", "*pushcfg.labelString: Configure", "*tok.labelString: Ok", "*tcancel.labelString: Cancel", "*tscale.minimum: 1", "*tscale.maximum: 16", "*tscale.showValue: True", "*tscale.orientation: Horizontal", "*cfgdiv1.labelString: Divider 1", "*cfgdiv2.labelString: Divider 2", "*cfgdiv3.labelString: Divider 4", "*cfgm1.labelString: Classic Mode", "*cfgm2.labelString: Extended Mode", "*cfgm3.labelString: Just-4-Fun Mode", "*cfgok.labelString: Set", NULL }; void ButtonCB(Widget w,XtPointer p1,XtPointer p2); void InputHandler(XtPointer c,int *s,XtInputId *id); void SetTeamValues(void),GetTeamValues(void); Widget CreateTeamDialog(Widget parent); Widget CreateConfigDialog(Widget parent); int GetConfigValue(void); XtAppContext app_con; Widget teamdialog,teams[32]; Widget cfgdiv1,cfgdiv2,cfgdiv3,cfgmode1,cfgmode2,cfgmode3,configdialog; int teamnr[32] = { 0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7} ; void main(int argc,char **argv) { Widget top,vrow,form,tmp,quit,run,run1,stop,list,team,cfg; Arg args[2]; top = XtAppInitialize(&app_con, "Netserv", NULL, 0, &argc, argv, resources, NULL, 0); teamdialog = CreateTeamDialog(top); configdialog = CreateConfigDialog(top); form = XtCreateManagedWidget("form",xmFormWidgetClass,top,NULL,0); vrow = XtCreateManagedWidget("vrow",xmRowColumnWidgetClass,form,NULL,0); XtCreateManagedWidget("titlelabel",xmLabelWidgetClass,vrow,NULL,0); XtCreateManagedWidget("a_separator",xmSeparatorWidgetClass,vrow,NULL,0); stop = XtCreateManagedWidget("pushstop",xmPushButtonWidgetClass,vrow,NULL,0); run = XtCreateManagedWidget("pushrun",xmPushButtonWidgetClass,vrow,NULL,0); run1 = XtCreateManagedWidget("pushrun1",xmPushButtonWidgetClass,vrow,NULL,0); list = XtCreateManagedWidget("pushlist",xmPushButtonWidgetClass,vrow,NULL,0); team = XtCreateManagedWidget("pushteam",xmPushButtonWidgetClass,vrow,NULL,0); cfg = XtCreateManagedWidget("pushcfg",xmPushButtonWidgetClass,vrow,NULL,0); XtCreateManagedWidget("a_separator",xmSeparatorWidgetClass,vrow,NULL,0); XtSetArg(args[0],XtNorientation,XmHORIZONTAL); tmp = XtCreateManagedWidget("a_row",xmRowColumnWidgetClass,vrow,args,1); quit = XtCreateManagedWidget("pushquit",xmPushButtonWidgetClass,tmp,NULL,0); XtAddCallback(run, XmNactivateCallback, ButtonCB,(XtPointer) PUSHRUN); XtAddCallback(run1, XmNactivateCallback, ButtonCB,(XtPointer) PUSHRUN1); XtAddCallback(quit, XmNactivateCallback, ButtonCB,(XtPointer) PUSHQUIT); XtAddCallback(stop, XmNactivateCallback, ButtonCB,(XtPointer) PUSHSTOP); XtAddCallback(list, XmNactivateCallback, ButtonCB,(XtPointer) PUSHLIST); XtAddCallback(team, XmNactivateCallback, ButtonCB,(XtPointer) PUSHTEAM); XtAddCallback(cfg, XmNactivateCallback, ButtonCB,(XtPointer) PUSHCFG); XtAppAddInput(app_con,0,(XtPointer)XtInputReadMask,InputHandler,(XtPointer)0); XtRealizeWidget(top); XtAppMainLoop(app_con); } /******************************** * Button-Callback handler */ void ButtonCB(Widget w,XtPointer p1,XtPointer p2) { char buf[64]; int i; switch( (int) p1) { case PUSHQUIT: XtDestroyApplicationContext(app_con); exit(0); break; case PUSHRUN: buf[0] = MENU_RUNGAME; fwrite(buf,1,1,stdout); fflush(stdout); break; case PUSHSTOP: buf[0] = MENU_STOPGAME; fwrite(buf,1,1,stdout); fflush(stdout); break; case PUSHLIST: buf[0] = MENU_LIST; fwrite(buf,1,1,stdout); fflush(stdout); break; case PUSHTEAM: XtManageChild(teamdialog); break; case PUSHRUN1: buf[0] = MENU_SETTEAMS; for(i=0;i<32;i++) buf[i+1] = (char) teamnr[i]; fwrite(buf,33,1,stdout); fflush(stdout); buf[0] = MENU_RUNTEAMGAME; fwrite(buf,1,1,stdout); fflush(stdout); break; case PUSHCFG: XtManageChild(configdialog); break; case TEAMOK: GetTeamValues(); XtUnmanageChild(teamdialog); break; case TEAMCANCEL: SetTeamValues(); XtUnmanageChild(teamdialog); break; case CFGOK: XtUnmanageChild(configdialog); i = GetConfigValue(); buf[0] = MENU_SETDIVIDER; buf[1] = i & 0xf; buf[2] = MENU_SETMODE; buf[3] = i >> 4; fwrite(buf,7,1,stdout); fflush(stdout); break; } } /*************************** * stdin-input-handler */ void InputHandler(XtPointer c,int *s,XtInputId *id) { char buf[1024]; int i; memset(buf,0,1024); i = read(*s,buf,1024); fprintf(stderr,"%d:%s\n",i,buf); if(i == 0) { XtDestroyApplicationContext(app_con); exit(0); } } /******************************* * team-stuff */ Widget CreateTeamDialog(Widget parent) { Widget t,r,rb,r1,t1; int i,j,k; Arg args[4]; char *labels[] = { "Players 1 to 8" , "Players 9 to 15" , "Players 16 to 24" , "Players 25 to 32" }; t = XmCreateFormDialog(parent,"TeamSelection",NULL,0); r = XtCreateManagedWidget("a_row",xmRowColumnWidgetClass,t,NULL,0); XtSetArg(args[0],XmNlabelString,XmStringCreateSimple("Please select the teams:")); XtCreateManagedWidget("a_label",xmLabelWidgetClass,r,args,1); XtCreateManagedWidget("a_separator",xmSeparatorWidgetClass,r,NULL,0); XtSetArg(args[0],XmNorientation,XmHORIZONTAL); r1 = XtCreateManagedWidget("a_row",xmRowColumnWidgetClass,r,args,1); for(k=0,j=0;j<4;j++) { rb = XtCreateManagedWidget("a_row",xmRowColumnWidgetClass,r1,NULL,0); XtSetArg(args[0],XmNlabelString,XmStringCreateSimple(labels[j])); XtCreateManagedWidget("alabel",xmLabelWidgetClass,rb,args,1); for(i=0;i<8;i++,k++) { teams[k] = XtCreateManagedWidget("tscale",xmScaleWidgetClass,rb,NULL,0); } } XtCreateManagedWidget("a_separator",xmSeparatorWidgetClass,r,NULL,0); XtSetArg(args[0],XmNorientation,XmHORIZONTAL); r1 = XtCreateManagedWidget("a_row",xmRowColumnWidgetClass,r,args,1); t1 = XtCreateManagedWidget("tok",xmPushButtonWidgetClass,r1,NULL,0); XtAddCallback(t1, XmNactivateCallback, ButtonCB,(XtPointer) 6); t1 = XtCreateManagedWidget("tcancel",xmPushButtonWidgetClass,r1,NULL,0); XtAddCallback(t1, XmNactivateCallback, ButtonCB,(XtPointer) 7); SetTeamValues(); return t; } void SetTeamValues(void) { int i; for(i=0;i<32;i++) XmScaleSetValue(teams[i],teamnr[i]+1); } void GetTeamValues(void) { int i; for(i=0;i<32;i++) { XmScaleGetValue(teams[i],&teamnr[i]); teamnr[i]--; } } /******************************** * CONFIG-stuff */ Widget CreateConfigDialog(Widget parent) { Widget t,r,b,row; Arg args[2]; t = XmCreateFormDialog(parent,"TeamSelection",NULL,0); row = XtCreateManagedWidget("a_row",xmRowColumnWidgetClass,t,NULL,0); r = XmCreateSimpleRadioBox(row,"radiobox",NULL,0); XtManageChild(r); cfgdiv1 = XtCreateManagedWidget("cfgdiv1",xmToggleButtonWidgetClass,r,NULL,0); XmToggleButtonSetState(cfgdiv1,True,False); cfgdiv2 = XtCreateManagedWidget("cfgdiv2",xmToggleButtonWidgetClass,r,NULL,0); cfgdiv3 = XtCreateManagedWidget("cfgdiv3",xmToggleButtonWidgetClass,r,NULL,0); XtCreateManagedWidget("a_separator",xmSeparatorWidgetClass,row,NULL,0); r = XmCreateSimpleRadioBox(row,"radiobox",NULL,0); XtManageChild(r); cfgmode1 = XtCreateManagedWidget("cfgm1",xmToggleButtonWidgetClass,r,NULL,0); XmToggleButtonSetState(cfgmode1,True,False); cfgmode2 = XtCreateManagedWidget("cfgm2",xmToggleButtonWidgetClass,r,NULL,0); cfgmode3 = XtCreateManagedWidget("cfgm3",xmToggleButtonWidgetClass,r,NULL,0); XtCreateManagedWidget("a_separator",xmSeparatorWidgetClass,row,NULL,0); XtSetArg(args[0],XmNorientation,XmHORIZONTAL); r = XtCreateManagedWidget("a_row",xmRowColumnWidgetClass,row,args,1); b = XtCreateManagedWidget("cfgok",xmPushButtonWidgetClass,r,NULL,0); XtAddCallback(b,XmNactivateCallback,ButtonCB,(XtPointer) CFGOK); return t; } int GetConfigValue(void) { int val=0; if(XmToggleButtonGetState(cfgdiv1)) val = 1; else if(XmToggleButtonGetState(cfgdiv2)) val = 2; else if(XmToggleButtonGetState(cfgdiv3)) val = 3; if(XmToggleButtonGetState(cfgmode1)) val |= 0x10; else if(XmToggleButtonGetState(cfgmode2)) val |= 0x20; else if(XmToggleButtonGetState(cfgmode3)) val |= 0x30; return val; } netmaze-0.81+jpg0.82.orig/xtests/texturep.c0100600000175000017500000001750105551562431020741 0ustar jgoerzenjgoerzen#define PIX01 *ia1 = pixval1; *ia2 = pixval2; #define PIX02 PIX01 *(ia1-IMAGEWIDTH)=pixval1; *(ia2+IMAGEWIDTH)=pixval2; #define PIX03 PIX02 *(ia1-2*IMAGEWIDTH)=pixval1; *(ia2+2*IMAGEWIDTH)=pixval2; #define PIX04 PIX03 *(ia1-3*IMAGEWIDTH)=pixval1; *(ia2+3*IMAGEWIDTH)=pixval2; #define PIX05 PIX04 *(ia1-4*IMAGEWIDTH)=pixval1; *(ia2+4*IMAGEWIDTH)=pixval2; #define PIX06 PIX05 *(ia1-5*IMAGEWIDTH)=pixval1; *(ia2+5*IMAGEWIDTH)=pixval2; #define PIX07 PIX06 *(ia1-6*IMAGEWIDTH)=pixval1; *(ia2+6*IMAGEWIDTH)=pixval2; #define PIX08 PIX07 *(ia1-7*IMAGEWIDTH)=pixval1; *(ia2+7*IMAGEWIDTH)=pixval2; #define PIX09 PIX08 *(ia1-8*IMAGEWIDTH)=pixval1; *(ia2+8*IMAGEWIDTH)=pixval2; #define PIX0A PIX09 *(ia1-9*IMAGEWIDTH)=pixval1; *(ia2+9*IMAGEWIDTH)=pixval2; #define PIX0B PIX0A *(ia1-10*IMAGEWIDTH)=pixval1; *(ia2+10*IMAGEWIDTH)=pixval2; #define PIX0C PIX0B *(ia1-11*IMAGEWIDTH)=pixval1; *(ia2+11*IMAGEWIDTH)=pixval2; #define PIX0D PIX0C *(ia1-12*IMAGEWIDTH)=pixval1; *(ia2+12*IMAGEWIDTH)=pixval2; #define PIX0E PIX0D *(ia1-13*IMAGEWIDTH)=pixval1; *(ia2+13*IMAGEWIDTH)=pixval2; #define PIX0F PIX0E *(ia1-14*IMAGEWIDTH)=pixval1; *(ia2+14*IMAGEWIDTH)=pixval2; #define PIX10 PIX0F *(ia1-15*IMAGEWIDTH)=pixval1; *(ia2+15*IMAGEWIDTH)=pixval2; #define PIX11 PIX10 *(ia1-16*IMAGEWIDTH)=pixval1; *(ia2+16*IMAGEWIDTH)=pixval2; #define PIX12 PIX11 *(ia1-17*IMAGEWIDTH)=pixval1; *(ia2+17*IMAGEWIDTH)=pixval2; #define PIX13 PIX12 *(ia1-18*IMAGEWIDTH)=pixval1; *(ia2+18*IMAGEWIDTH)=pixval2; #define PIX14 PIX13 *(ia1-19*IMAGEWIDTH)=pixval1; *(ia2+19*IMAGEWIDTH)=pixval2; #define PIX15 PIX14 *(ia1-20*IMAGEWIDTH)=pixval1; *(ia2+20*IMAGEWIDTH)=pixval2; #define PIX16 PIX15 *(ia1-21*IMAGEWIDTH)=pixval1; *(ia2+21*IMAGEWIDTH)=pixval2; #define PIX17 PIX16 *(ia1-22*IMAGEWIDTH)=pixval1; *(ia2+22*IMAGEWIDTH)=pixval2; #define PIX18 PIX17 *(ia1-23*IMAGEWIDTH)=pixval1; *(ia2+23*IMAGEWIDTH)=pixval2; #define PIX19 PIX18 *(ia1-24*IMAGEWIDTH)=pixval1; *(ia2+24*IMAGEWIDTH)=pixval2; #define PIX1A PIX19 *(ia1-25*IMAGEWIDTH)=pixval1; *(ia2+25*IMAGEWIDTH)=pixval2; #define PIX1B PIX1A *(ia1-26*IMAGEWIDTH)=pixval1; *(ia2+26*IMAGEWIDTH)=pixval2; #define PIX1C PIX1B *(ia1-27*IMAGEWIDTH)=pixval1; *(ia2+27*IMAGEWIDTH)=pixval2; #define PIX1D PIX1C *(ia1-28*IMAGEWIDTH)=pixval1; *(ia2+28*IMAGEWIDTH)=pixval2; #define PIX1E PIX1D *(ia1-29*IMAGEWIDTH)=pixval1; *(ia2+29*IMAGEWIDTH)=pixval2; #define PIX1F PIX1E *(ia1-30*IMAGEWIDTH)=pixval1; *(ia2+30*IMAGEWIDTH)=pixval2; #define PIX20 PIX1F *(ia1-21*IMAGEWIDTH)=pixval1; *(ia2+31*IMAGEWIDTH)=pixval2; #define LOOPINIT for(j=tex->divtabh[hi][0];j;j--) { pixval1 = *t1++; pixval2 = *--t2; #define LOOPEXIT } #define JMPDEF if(*jmpt++) { ia1 -= IMAGEWIDTH; *ia1 = pixval1; *ia2 = pixval2; ia2 += IMAGEWIDTH; } #define CASE01 LOOPINIT PIX01 ia1-=IMAGEWIDTH; ia2+=IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE02 LOOPINIT PIX02 ia1-=2*IMAGEWIDTH; ia2+=0x2*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE03 LOOPINIT PIX03 ia1-=3*IMAGEWIDTH; ia2+=0x3*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE04 LOOPINIT PIX04 ia1-=4*IMAGEWIDTH; ia2+=0x4*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE05 LOOPINIT PIX05 ia1-=5*IMAGEWIDTH; ia2+=0x5*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE06 LOOPINIT PIX06 ia1-=6*IMAGEWIDTH; ia2+=0x6*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE07 LOOPINIT PIX07 ia1-=7*IMAGEWIDTH; ia2+=0x7*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE08 LOOPINIT PIX08 ia1-=8*IMAGEWIDTH; ia2+=0x8*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE09 LOOPINIT PIX09 ia1-=9*IMAGEWIDTH; ia2+=0x9*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE0A LOOPINIT PIX0A ia1-=0xa*IMAGEWIDTH; ia2+=0xa*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE0B LOOPINIT PIX0B ia1-=0xb*IMAGEWIDTH; ia2+=0xb*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE0C LOOPINIT PIX0C ia1-=0xc*IMAGEWIDTH; ia2+=0xc*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE0D LOOPINIT PIX0D ia1-=0xd*IMAGEWIDTH; ia2+=0xd*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE0E LOOPINIT PIX0E ia1-=0xe*IMAGEWIDTH; ia2+=0xe*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE0F LOOPINIT PIX0F ia1-=0xf*IMAGEWIDTH; ia2+=0xf*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE10 LOOPINIT PIX10 ia1-=0x10*IMAGEWIDTH; ia2+=0x10*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE11 LOOPINIT PIX11 ia1-=0x11*IMAGEWIDTH; ia2+=0x11*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE12 LOOPINIT PIX12 ia1-=0x12*IMAGEWIDTH; ia2+=0x12*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE13 LOOPINIT PIX13 ia1-=0x13*IMAGEWIDTH; ia2+=0x13*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE14 LOOPINIT PIX14 ia1-=0x14*IMAGEWIDTH; ia2+=0x14*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE15 LOOPINIT PIX15 ia1-=0x15*IMAGEWIDTH; ia2+=0x15*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE16 LOOPINIT PIX16 ia1-=0x16*IMAGEWIDTH; ia2+=0x16*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE17 LOOPINIT PIX17 ia1-=0x17*IMAGEWIDTH; ia2+=0x17*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE18 LOOPINIT PIX18 ia1-=0x18*IMAGEWIDTH; ia2+=0x18*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE19 LOOPINIT PIX19 ia1-=0x19*IMAGEWIDTH; ia2+=0x19*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE1A LOOPINIT PIX1A ia1-=0x1a*IMAGEWIDTH; ia2+=0x1a*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE1B LOOPINIT PIX1B ia1-=0x1b*IMAGEWIDTH; ia2+=0x1b*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE1C LOOPINIT PIX1C ia1-=0x1c*IMAGEWIDTH; ia2+=0x1c*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE1D LOOPINIT PIX1D ia1-=0x1d*IMAGEWIDTH; ia2+=0x1d*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE1E LOOPINIT PIX1E ia1-=0x1e*IMAGEWIDTH; ia2+=0x1e*IMAGEWIDTH; JMPDEF LOOPEXIT #define CASE1F LOOPINIT PIX1F ia1-=0x1f*IMAGEWIDTH; ia2+=0x1f*IMAGEWIDTH; JMPDEF LOOPEXIT /* find the right code, (in asm this would be a simple thing) */ /* works like a switch(ln) { case 1: ...... case 0x1f: }; /* btw: the code generated by the gcc with switch is better than this */ #define REGVAL 0x1 if(ln &= REGVAL) /* 0x1 */ { if(ln>>=REGVAL) { if(ln &= REGVAL) /* 0x2 */ { if(ln>>=REGVAL) { if(ln &= REGVAL) /* 0x4 */ { if(ln>>=REGVAL) { if(ln &= REGVAL) /* 0x8 */ { if(ln>>=REGVAL) { CASE1F } else { CASE0F } } else /* !0x80 */ { CASE17 } } else { CASE07 } } else /* !0x40 */ { ln>>=REGVAL; if(ln &= REGVAL) { if(ln>>=REGVAL) { CASE1B } else { CASE0B } } else { CASE13 } } } else { CASE03 } } else /* !0x2 */ { ln>>=REGVAL; if(ln &= REGVAL) /* 0x4 */ { if(ln>>=REGVAL) { if(ln &= REGVAL) { if(ln>>=PIXVAL) { CASE1C } else { CASE0C } } else { CASE15 } } else { CASE05 } } else /* !0x4 */ { ln>>=REGVAL; if(ln &= REGVAL) { if(ln>>=REGVAL) { CASE19 } else { CASE09 } } else { CASE11 } } } } else { CASE01 } } else /* !0x1 */ { ln>>=REGVAL; if(ln &= REGVAL) /* 0x2 */ { if(ln>>=REGVAL) { if(ln &= REGVAL) /* 0x4 */ { if(ln>>=REGVAL) { if(ln &= REGVAL) { if(ln>>=REGVAL) { CASE1E } else { CASE0E } } else { CASE16 } } else { CASE06 } } else /* !0x4 */ { } } else { CASE02 } } else /* !0x2 */ { } } netmaze-0.81+jpg0.82.orig/xtests/Makefile.utils0100600000175000017500000000105705550230155021505 0ustar jgoerzenjgoerzenCC = gcc CFLAGS = -DSH_MEM -O2 -Wall -m486 -fomit-frame-pointer -I/usr/include/X11 #CFLAGS = -DSH_MEM -g -Wall -m486 -I/usr/include/X11 XTLIBS = -lm -lXaw -lXt -lXext -lX11 X11LIBS = -lX11 XMLIBS = -lXm -lXt -lX11 #CFLAGS = +Aa +O2 -I/usr/include/Motif1.1 #XMLIBS = -L/usr/lib/Motif1.2 -L/usr/lib/X11R5 all: x11mouse xmmenu xmserv x11mouse: x11mouse.o $(CC) -o $@ x11mouse.o $(X11LIBS) xmmenu: xmmenu.o $(CC) -o $@ xmmenu.o $(XMLIBS) xmserv: xmserv.o $(CC) -o $@ xmserv.o $(XMLIBS) texture: texture.o $(CC) -o $@ texture.o -static -lXext -lX11 -lm netmaze-0.81+jpg0.82.orig/COPYING0100600000175000017500000004307605450033712016415 0ustar jgoerzenjgoerzen GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. netmaze-0.81+jpg0.82.orig/Makefile.alt0100600000175000017500000000342405551261224017575 0ustar jgoerzenjgoerzen #linux: CC = gcc CFLAGS = -DSH_MEM -Wall -Wstrict-prototypes -O2 -m486 -fomit-frame-pointer LDFLAGS = -static #CFLAGS = -g -Wall #other machines: #CC = gcc #CFLAGS = -O2 -DSH_MEM #CFLAGS = -g -Wall #HPUX-cc: #CC = cc #CFLAGS = +O2 -Aa -D_HPUX_SOURCE -DSH_MEM #LDFLAGS = -L/usr/lib/X11R5 LIBS = -lXext -lX11 -lm all: netmaze netserv dummy netmaze: x11cntrl.o draw_3d.o x11smiley.o x11gfx.o netmaze.o trigtab.h \ netmaze.h network.o allmove.o network.h maze.o iocntl.o audio.o\ texture.o $(CC) -o $@ x11cntrl.o draw_3d.o netmaze.o x11gfx.o x11smiley.o \ network.o allmove.o maze.o iocntl.o audio.o texture.o \ $(LDFLAGS) $(LIBS) netserv: netserv.o network.h netmaze.h maze.o $(CC) -o $@ netserv.o maze.o #Robot-Demonstration: dummy: dummy.o allmove.o robot.o network.o maze.o $(CC) -o $@ dummy.o allmove.o robot.o network.o maze.o #Robots written by others: (see the *.c files for info/copyrights) betterbot: better.o allmove.o robot.o network.o maze.o $(CC) -o $@ better.o allmove.o robot.o network.o maze.o -lm follower: follower.o allmove.o robot.o network.o maze.o $(CC) -o $@ follower.o allmove.o robot.o network.o maze.o -lm netmaze.o: netmaze.h config.h netserv.o: network.h netmaze.h config.h netcmds.h network.o: netmaze.h network.h config.h netcmds.h x11gfx.o: netmaze.h bitmap.h config.h x11smiley.o: netmaze.h x11smiley.h config.h x11cntrl.o: netmaze.h config.h allmove.o: netmaze.h trigtab.h config.h draw_3d.o: netmaze.h trigtab.h config.h maze.o: netmaze.h defmaze.h config.h robot.o: netmaze.h trigtab.h network.h config.h dummy.o: netmaze.h config.h iocntl.o: netmaze.h config.h audio.o: config.h better.o: better.h clean: rm -f *.o netserv netmaze dummy xtest/*.o betterbot netmaze-0.81+jpg0.82.orig/Imakefile0100600000175000017500000000152505552753414017177 0ustar jgoerzenjgoerzen#CC = gcc LOCAL_LIBRARIES = $(XLIB) -lm EXTRA_DEFINES = -DSH_MEM EXTRA_LOAD_FLAGS = SRCS1 = x11cntrl.c draw_3d.c x11smiley.c x11gfx.c netmaze.c\ network.c allmove.c maze.c iocntl.c audio.c texture.c SRCS2 = netserv.c maze.c OBJS1 = x11cntrl.o draw_3d.o x11smiley.o x11gfx.o netmaze.o\ network.o allmove.o maze.o iocntl.o audio.o texture.o OBJS2 = netserv.o maze.o SRCS3 = follower.c dummy.c better.c allmove.c robot.c network.c maze.c PROGRAMS = netmaze netserv follower dummy betterbot ComplexProgramTarget_1 (netmaze, $(LOCAL_LIBRARIES),) ComplexProgramTarget_2 (netserv, $(LOCAL_LIBRARIES),) SingleProgramTarget(dummy,dummy.o allmove.o robot.o network.o maze.o,,) SingleProgramTarget(follower,follower.o allmove.o robot.o network.o maze.o,,-lm) SingleProgramTarget(betterbot,better.o allmove.o robot.o network.o maze.o,,-lm) netmaze-0.81+jpg0.82.orig/netserv.h0100600000175000017500000000360705542040232017212 0ustar jgoerzenjgoerzen/***************** * exmenu controll */ enum { MENU_NOP , MENU_LOADMAZE , MENU_RUNGAME , MENU_STOPGAME , MENU_LIST , MENU_DISCONNECT , MENU_SETMODE , MENU_SETDIVIDER , MENU_ERROR , MENU_RUNTEAMGAME , MENU_SETTEAMS }; /********************************************** * new structures * they are replacing the old slot-struct ... */ struct cqueue; struct pqueue; struct gqueue; /* player */ struct pqueue { struct cqueue *connection; /* connection */ struct gqueue *group; /* group */ struct pqueue *cnext; /* connection chain */ struct pqueue *gnext; /* group chain */ struct pqueue *clast; /* connection chain */ struct pqueue *glast; /* group chain */ struct pqueue *nextgf; /* group-first-chain */ char name[MAXNAME+1]; char comment[MAXCOMMENT+1]; int mode; /* player/cam */ int playing; int joydata; int cnumber; /* connectionnumber: (client) */ int number; /* game number */ int groupnumber; int team; int master; int checked; /* only checked players can receive personal messages */ }; /* connections */ struct cqueue { struct cqueue *next; /* global chain */ struct cqueue *last; /* global chain */ struct pqueue *players; /* player-chain on the connection */ int plnum; /* number of players from this connection */ int mode; /* flags */ int socket; unsigned long lasttick; struct sockaddr remoteaddr; /* remote socket address */ char hostname[256]; int response; }; /* groups */ struct gqueue { struct gqueue *next; char groupname[16]; int groupno; int numplayers; /* numplay */ int mode; struct pqueue *first; int gameflag; int playing; int gamemode; int numgamers; /* number of PLAYING players */ int numjoy; int numwait; int response; int numteams; int timeout; int divider; int dividercnt; MAZE maze; int nomaze; }; #define PLAYING 1 #define SINGLEPLAYER 2 #define SINGLECAMERA 4 netmaze-0.81+jpg0.82.orig/netcmds.h0100600000175000017500000000140605543431173017165 0ustar jgoerzenjgoerzenenum { NM_NOCOMMAND , NM_STARTGAME , NM_STOPGAME , NM_PAUSEGAME , NM_MAZEH , NM_MAZEV , NM_ALLDATA , NM_OWNDATA , NM_MESSAGE , NM_INFO , NM_TIMEERROR , NM_OWNNAME , NM_ALLNAMES , NM_PING , NM_PONG , NM_QUIT , NM_READY , NM_RANDOM , NM_END , NM_CNTRL , NM_INCPLAYER , NM_DECPLAYER , NM_SETMODE , NM_ENUM , NM_SUBDATA , NM_OWNCOMMENT , NM_ALLCOMMENTS , NM_DOCOMMAND , NM_ADDPLAYER , NM_REMOVEPLAYER , NM_JOIN , NM_ACKJOIN , NM_ACKADD , NM_ACTIVATE , NM_INACTIVATE }; static char nm_field[] = { 1,0,1,1,0, 0,99, 2,0,0,1,0, 0,1,1,1,1,3,1, 1,1,1,5,2, 0,0,0,0,0,3,4,5,5,3,3 }; enum { MSG_SERVER , MSG_ALL , MSG_GROUP , MSG_TEAM , MSG_TO_NAME , MSG_PLAYER }; netmaze-0.81+jpg0.82.orig/robot.c0100600000175000017500000000654305543550451016660 0ustar jgoerzenjgoerzen/* This is a demonstration on how to write robots. * This is the basecode. * Write your own: own_action()/init_robot() - functions (see dummy.c) * and compile the whole stuff with robot.o,allmove.o,network.o! */ #include "netmaze.h" #include #ifdef RS6000 #include #endif #include #include #include #include #include #include #include #include #include "network.h" #include "trigtab.h" #define TRUE 1 #define FALSE 0 struct shared_struct shstr; struct shared_struct *sm = &shstr; void io_handler(int a); /* extern: allmove.c */ extern void move_all(PLAYER*,int*); extern void run_game(MAZE*,PLAYER*); extern void myrandominit(long); /* extern: user-defined-functions */ extern int own_action(void); extern void start_robot(int); extern int init_robot(void); /* extern: network.c */ extern struct robot_functions robot; extern void handle_socket(void); extern void ident_player(void); #ifdef HAVE_FDSET struct fd_set readmask; #else struct fd_mask readmask; #endif static struct hostent *hp; /* pointer to host info for remote host */ static struct sockaddr_in remoteaddr; /* server connect */ int own_socket; /* streams socket descriptor */ int main(int argc,char **argv) { int ret; char hostname[256]; #ifdef USE_SIGVEC struct sigvec vec; #else struct sigaction vec; #endif if(argc != 2) { fprintf(stderr,"%s: usage: %s \n",argv[0],argv[0]); exit(1); } strcpy(hostname,argv[1]); if(!init_robot()) { fprintf(stderr,"%s: Can't initialize the robot.\n",argv[0]); exit(1); } robot.valid = TRUE; robot.action = own_action; robot.start = start_robot; #ifdef USE_SIGVEC vec.sv_handler = (void (*)(int)) io_handler; vec.sv_mask = 0; vec.sv_flags = 0; if ( sigvector(SIGIO, &vec, (struct sigvec *) 0) == -1) perror(" sigaction(SIGIO)"); #else vec.sa_handler = (void (*)(int)) io_handler; #ifdef RS6000 /* ibm rs/6000 */ sigemptyset(&vec.sa_mask); #else vec.sa_mask = 0; #endif vec.sa_flags = 0; if ( sigaction(SIGIO, &vec, (struct sigaction *) 0) == -1) perror(" sigaction(SIGIO)"); #endif remoteaddr.sin_family = AF_INET; sm->sologame = FALSE; if ((hp = gethostbyname(hostname) ) == NULL) { fprintf(stderr, "netmaze: %s not found in /etc/hosts\n",hostname); exit(1); } remoteaddr.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr; if((own_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) { fprintf(stderr, "netmaze: unable to create socket\n"); exit(1); } remoteaddr.sin_port = htons(NETMAZEPORT); FD_ZERO(&readmask); FD_SET(own_socket,&readmask); if ( (ret=connect(own_socket,(struct sockaddr *) &remoteaddr, sizeof(struct sockaddr))) == -1) { perror("connect"); exit(1); } ident_player(); printf("Connectet to %s. Connectcode: %d.\n",hostname,ret); for(;;) io_handler(0); } void io_handler(int a) { int numfds; #ifdef HAVE_FDSET struct fd_set readmask1; #else struct fd_mask readmask1; #endif for(;;) { readmask1 = readmask; if((numfds = select(32,&readmask1,NULL,NULL,NULL))< 0) continue; if(numfds == 0) break; if(FD_ISSET(own_socket,&readmask1)) { handle_socket(); } } } /*********** * dummy audio-functions */ void play_sound(int a) { } netmaze-0.81+jpg0.82.orig/netserv.c0100600000175000017500000011726505551747733017237 0ustar jgoerzenjgoerzen/* This is the Netserv V0.36-alpha. (March 1994) * ------------------------------------------------ * written & copyrights (c) by M.Hipp * It's hard to understand the code, (also for me) * because the server is grown enormous. * * A lot of machines are having problems if more than one application wants * to use the itimer. In this case the signal is delivered delayed * and the game slows down extremly. * * Subserv: I have removed all of the subserv code, because the concept * was braindead. * * still in progress: * The rewriting of the whole servercode! * */ #include "netmaze.h" #include #include #include #include #include #include #include #ifdef RS6000 #include #endif #include #include #include #include #include #include #include #include #include "netcmds.h" #include "network.h" #include "netserv.h" struct cqueue *cfirst; struct gqueue *gfirst; volatile unsigned long timerticks=0; unsigned long lasttick=0,starttick=0; int acc_socket; int menu_in=0,menu_out=1,use_exmenu=FALSE; char *exmenu_name; int nowait=FALSE; /* extern: maze.c */ extern int create_maze(MAZE *mazeadd); extern int load_maze(char *name,MAZE *mazeadd); extern int random_maze(MAZE*,int,int); void init_slots(int first,int *,struct gqueue *); void send_message(char *str,struct cqueue *); void send_names(struct gqueue *); void send_joydata(struct gqueue *); void send_maze(struct gqueue *); void send_start(struct gqueue *); void start_game(struct gqueue *,int *); void end_game(struct gqueue *); void send_comments(struct gqueue *); void send_comment(struct gqueue *g,struct pqueue *p); void send_inactive(struct gqueue *g,struct pqueue *p); void send_mes(char*,struct pqueue*,int type,struct pqueue*,struct gqueue*); void send_command(struct cqueue *q,int mask,char *data,int len); void send_group(struct gqueue *g,int mask,char *data,int len); void usage(void); void print_menu(void); void print_timerinfo(unsigned long); void list_connections(void); void handle_input(void); void do_command(struct gqueue *g,struct pqueue *p,char *line); char *get_hostname(struct cqueue *,char *name); void setup_sigchild(void); void inter(int); void work_input(unsigned char *buf,int len,struct cqueue *); void do_timer(int); void start_signal(void); void io_cntl(void); void handle_sigchild(int s); void accept_socket(void); void close_timeout_sockets(struct gqueue *); void remove_player(struct pqueue *p,struct cqueue *c); struct cqueue *close_socket(struct cqueue *); struct pqueue *add_player(struct cqueue *c,int,int,char*); struct gqueue *new_group(int no); int leave_group(struct pqueue *p); int join_group(int no,struct pqueue *p); struct pqueue *find_player_by_cn(struct cqueue *c,int cn); struct pqueue *find_player(char*); #ifdef HAVE_FDSET struct fd_set readmask; #else struct fd_mask readmask; #endif #ifdef USE_SIGVEC struct sigvec vec,vec1; #else struct sigaction vec,vec1; #endif #ifdef ITIMERVAL struct itimerval value,ovalue; #else struct itimerstruct value,ovalue; #endif /************************************** * main() * * - initialize most of the stuff * - spawn ex-menu * - setup acceptsocket */ int main(int argc,char **argv) { int i; struct sockaddr_in myaddr; /* local socket address */ if(argc != 1) { for(i=1;imaze))) gfirst->nomaze=FALSE; myaddr.sin_family = AF_INET; myaddr.sin_addr.s_addr = INADDR_ANY; myaddr.sin_port = htons(NETMAZEPORT); if( (acc_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror(argv[0]); exit(1); } FD_ZERO(&readmask); FD_SET(acc_socket, &readmask); if(!use_exmenu) FD_SET(0,&readmask); /* stdin */ else FD_SET(menu_in,&readmask); /* external menu */ if (bind(acc_socket,(struct sockaddr *) &myaddr, sizeof(struct sockaddr)) == -1) { perror("bind"); exit(1); } if (listen(acc_socket, 5) == -1 ) { perror(argv[0]); exit(1); } start_signal(); printf(" Netmaze Server 0.36alpha/March 1994 by MH ...\n"); printf(" Using Port: %d\n",NETMAZEPORT); print_menu(); for(;;) io_cntl(); } /********************************** * handle external menu input */ void handle_exinput(void) { int len; static char line[256]; static int cmdlen,bytesleft=0; struct gqueue *g=gfirst; /* test */ if(!bytesleft) /* read a new command */ { if((len = read(menu_in,line,1)) != 1) { fprintf(stderr,"ExMenuReadError! -> EXIT\n"); exit(1); } cmdlen = 1; bytesleft = 0; switch((int) line[0]) { case MENU_LOADMAZE: bytesleft = read(menu_in,line+1,1); cmdlen = bytesleft + 1; break; case MENU_RUNGAME: break; case MENU_RUNTEAMGAME: break; case MENU_STOPGAME: break; case MENU_LIST: break; case MENU_DISCONNECT: bytesleft = 1; cmdlen = 2; break; case MENU_SETMODE: bytesleft = 4; cmdlen = 5; break; case MENU_SETDIVIDER: bytesleft = 1; cmdlen = 2; break; case MENU_SETTEAMS: bytesleft = 32; cmdlen = 33; break; } } else { len = read(menu_in,line+cmdlen-bytesleft,bytesleft); bytesleft -= len; } if(bytesleft == 0) /* execute the command */ do_command(g,NULL,line); } /********************************** * execute a command */ void print_player(char *m,struct pqueue *p) { if(p == NULL) printf("%s",m); else send_mes(m,NULL,MSG_PLAYER,p,NULL); } void do_command(struct gqueue *g,struct pqueue *pl,char *line) { int i; struct cqueue *q; struct pqueue *p; char d[256]; switch((int) line[0]) { case MENU_LOADMAZE: break; case MENU_RUNGAME: if(g->playing) return; if(g->nomaze == TRUE) { print_player("Load/Reinit a Maze first!\n",pl); return; } if(g->numplayers == 0) { print_player("No player yet!\nTry again later\n",pl); return; } g->numteams = 0; start_game(g,NULL); break; case MENU_RUNTEAMGAME: if(g->playing) return; if(g->nomaze == TRUE) { print_player("Load/Reinit a Maze first!\n",pl); return; } if(g->numplayers == 0) { print_player("No players yet!\nTry again later\n",pl); return; } g->numteams = 0; for(p=g->first;p!=NULL;p=p->gnext) { if(p->team > g->numteams) g->numteams = p->team; } g->numteams++; start_game(g,NULL); break; case MENU_STOPGAME: end_game(g); break; case MENU_LIST: if(pl == NULL) list_connections(); else { for(p=g->first,i=0;p!=NULL;p=p->gnext,i++) { sprintf(d,"%3d | %3d | %16s | %s\n",i,p->team,p->name,p->connection->hostname); print_player(d,pl); } } break; case MENU_DISCONNECT: if(pl != NULL) break; i = (int) line[1]; for(q=cfirst;q!=NULL;q=q->next,i--) { if(!i) { close_socket(q); break; } } break; case MENU_SETMODE: if(line[1] == 2) g->gamemode = GM_REFLECTINGSHOTS|GM_DECAYINGSHOTS|GM_MULTIPLESHOTS| GM_WEAKINGSHOTS | GM_ALLOWHIDE | GM_ALLOWRADAR; else if(line[1] == 3) g->gamemode = GM_REFLECTINGSHOTS|GM_DECAYINGSHOTS|GM_MULTIPLESHOTS | GM_FASTWALKING | GM_FASTRECHARGE | GM_ALLOWRADAR; else g->gamemode = 0; break; case MENU_SETDIVIDER: g->divider = line[1] - 1; if((g->divider < 0 ) || (g->divider > 2)) g->divider = 0; break; case MENU_SETTEAMS: for(p=g->first,i=0;p!=NULL;p=p->gnext,i++) { if((p->team < 0) || (p->team > MAXPLAYERS)) p->team = 0; else p->team = (int) line[i+1]; } break; } } /*********************************+ * handle input (ugly) */ void handle_input(void) { char line[256],name[100]; int len,c=0,a,i,j; int teams[MAXPLAYERS]; char *num; struct cqueue *q,*cq; struct gqueue *g=gfirst; struct pqueue *p; memset(line,0,256); len = read(0,line,255); if(len == 0) { fprintf(stderr,"OOPS: end-of-file??\n"); return; } a = sscanf(line,"%d%s",&c,name); if(a == 0) { printf("Unknown command\n"); print_menu(); return; } switch(c) { case 1: if(g->playing > 0) return; if(a == 1) { printf("OK .. re-initalize builtin-maze\n"); if(create_maze(&(g->maze))) g->nomaze=FALSE; else { printf("Can't init maze\n"); g->nomaze=TRUE; } } else { if(sscanf(line,"%d%s%d",&c,name,&j) == 2) { if(load_maze(name,&(g->maze)) == TRUE) { g->nomaze=FALSE; printf("Maze is OK!\n"); } else { g->nomaze=TRUE; printf("Can't load '%s'\n",name); } } else { sscanf(line,"%d%d%d",&c,&i,&j); if(random_maze(&(g->maze),i,j)) printf("Randommaze is ok!\n"); else printf("Error, size too big!\n"); } } break; case 2: if(g->playing) return; if(g->nomaze == TRUE) { printf("Load/Reinit a Maze first!\n"); return; } if(g->numplayers == 0) { printf("No players yet!\nTry again later\n"); return; } if(a == 1) { g->numteams = 0; start_game(g,NULL); } else { g->numteams = 0; for(i=0;i MAXPLAYERS)) { i = 0; break; } } if(i > 0) { for(g->numteams=0,j=0;j g->numteams) g->numteams = teams[j]; g->numteams++; if(g->numplayers == 0) printf("No player yet!\nTry again later\n"); else { start_game(g,teams); } } else printf("Illegal team-selection!\n"); } break; case 3: end_game(g); break; case 4: list_connections(); break; case 5: if(a == 2) { sscanf(line,"%d %d",&j,&i); for(q=cfirst;q!=NULL;q=q->next,i--) { if(!i) { close_socket(q); break; } } } else printf("Too few parameters.\n"); break; case 6: if(a == 1) { if(g->gamemode == 0) { g->gamemode = GM_REFLECTINGSHOTS|GM_DECAYINGSHOTS|GM_MULTIPLESHOTS | GM_WEAKINGSHOTS | GM_ALLOWHIDE | GM_ALLOWRADAR; printf(" Enhanced gamemode selected!\n"); } else if(!(g->gamemode & GM_FASTWALKING)) { g->gamemode = GM_REFLECTINGSHOTS|GM_DECAYINGSHOTS | GM_MULTIPLESHOTS | GM_FASTWALKING | GM_FASTRECHARGE | GM_ALLOWRADAR; printf(" Enhanced just-for-fun gamemode selected!\n"); } else { g->gamemode = 0; printf(" Classic gamemode selected!\n"); } } break; case 7: g->divider++; if(g->divider == 3) g->divider = 0; switch(g->divider) { case 0: printf(" OK. Now, the divider is: 1.\n"); break; case 1: printf(" OK. Now, the divider is: 2.\n"); break; case 2: printf(" OK. Now, the divider is: 4.\n"); break; } break; case 9: if(g->playing > 0) return; for(q=cfirst;q!=NULL;) { q = close_socket(q); } exit(0); break; case 99: printf("******** INFO: *********\n\n"); printf("numplayers: %d response: %d playing: %d gameflag: %d mode: %d.\n",g->numplayers,g->response,g->playing,g->gameflag,g->mode); for(p=gfirst->first,i=0;p!=NULL;p=p->gnext,i++) { printf("G[%d] %s pl: %d joy: %d cn: %d num: %d gno: %d team: %d ch: %d.\n",i,p->name,p->playing,p->joydata,p->cnumber,p->number,p->groupnumber,p->team,p->checked); } for(cq=cfirst,i=0;cq!=NULL;cq=cq->next,i++) { if(cq->players != NULL) printf("C[%d] %s plnum: %d mode: %d socket: %d response: %d.\n",i,cq->players->name,cq->plnum,cq->mode,cq->socket,cq->response); else printf("C[%d] %s plnum: %d mode: %d socket: %d response: %d.\n",i,"UNK",cq->plnum,cq->mode,cq->socket,cq->response); } break; default: printf("Unknown command\n"); print_menu(); break; } } /***********************/ /* Install Mastertimer */ /***********************/ void start_signal(void) { value.it_interval.tv_sec = 0; value.it_value.tv_sec = 1; #ifdef ITIMERVAL value.it_value.tv_usec = 0; value.it_interval.tv_usec = DRAWTIME; #else value.it_value.tv_nsec = 0; value.it_interval.tv_nsec = DRAWTIME; #endif setitimer(ITIMER_REAL,&value,&ovalue); #ifdef USE_SIGVEC vec1.sv_handler = (void (*)(int)) inter; vec1.sv_mask = 0; vec1.sv_flags = 0; if (sigvector(SIGALRM, &vec1, (struct sigvec *) 0) == -1) perror("SIGALRM\n"); #else vec1.sa_handler = (void (*)(int)) inter; #ifdef RS6000 /* ibm rs/6000 */ sigemptyset(&vec1.sa_mask); #else vec1.sa_mask = 0; #endif vec1.sa_flags = 0; if ( sigaction(SIGALRM, &vec1, (struct sigaction *) 0) == -1) perror("SIGALRM\n"); #endif } void setup_sigchild(void) /* for external menu */ { #ifdef USE_SIGVEC struct sigvec svec1; svec1.sv_handler = (void (*)(int)) handle_sigchild; svec1.sv_mask = 0; svec1.sv_flags = 0; if(sigvector(SIGCHLD, &svec1, (struct sigvec *) 0) == -1) perror("SIGCHLD\n"); #else struct sigaction svec1; svec1.sa_handler = (void (*)(int)) handle_sigchild; #ifdef RS6000 /* ibm rs/6000 */ sigemptyset(&svec1.sa_mask); #else svec1.sa_mask = 0; #endif svec1.sa_flags = 0; if(sigaction(SIGCHLD,&svec1,(struct sigaction *)0) == -1) perror("SIGCHLD\n"); #endif } void handle_sigchild(int s) { int stat,cpid; cpid = wait(&stat); fprintf(stderr,"Child (exmenu?): %d died.\n",cpid); exit(1); /* ok, that's the hard way */ } /************************/ /* Timer-Signal-Handler */ /************************/ void inter(int sig) { timerticks++; /* enough for about 6 years :-) */ /* the timertick is for synchronisation */ /* the main timer-function is called by the main loop */ /* so we don't have to care about (very tricky) interrupt conditions. */ } /******************************** * the main timerfunction */ void do_timer(int nowaitgroup) { struct gqueue *g; struct pqueue *p; unsigned long t; static unsigned long lasttick; int d; t = timerticks; if(!(t-lasttick) && !nowaitgroup) return; if((t - lasttick) > 0x1000) { fprintf(stderr,"Timerproblems?\n"); lasttick = timerticks; return; } t -= lasttick; lasttick += t; for(g=gfirst;g!=NULL;g=g->next) /* all groups */ { if(g->gameflag) { d = 1<divider; if(g->dividercnt > d) /* sure is sure */ g->dividercnt = d; else g->dividercnt -= t; if(g->dividercnt <= 0) { if(g->dividercnt > -d) g->dividercnt += d; else g->dividercnt = d; } else if(!(nowaitgroup == g->groupno)) continue; if(!g->response || nowait) { print_timerinfo(timerticks &(~(d-1)) ); g->response = g->numwait; send_joydata(g); g->timeout = 0; } else { g->timeout+=d; if((g->timeout & 0x1f) == 0x1f) { for(p=g->first;p!=NULL;p=p->gnext) { if(p->playing && (p->mode == PLAYERMODE) && !p->connection->response) { fprintf(stderr,"Connection of Player %d doesn't response!\n",p->number); } } } if(g->timeout > 100) close_timeout_sockets(g); } } } for(g=gfirst;g!=NULL;g=g->next) /* all groups */ { if( (g->playing == 1) && !g->gameflag) { if(!g->response) { g->playing++; g->gameflag = TRUE; printf("ok ... ACTION!!! ...[(3) stop game] \n"); } else { if(timerticks - starttick > 100) { close_timeout_sockets(g); } } } } } /*********************************** * I/O-Signal-Handler */ void io_cntl(void) { #ifdef HAVE_FDSET struct fd_set readmask1; #else struct fd_mask readmask1; #endif int count,len; int numfds; char buf[280]; struct cqueue *q; for(;;) { readmask1 = readmask; /* we need max. 3+32 (+cams) filedescriptors * if select returns with a value < 0 we expect a SIGNAL not an error */ if ((numfds = select(36,&readmask1,NULL,NULL,NULL)) < 0) { do_timer(FALSE); continue; } do_timer(FALSE); if(numfds == 0) break; /* * slave-sockets */ for(q=cfirst;q!=NULL;) { if(FD_ISSET(q->socket,&readmask1)) { if((count = recv(q->socket,buf,1,0)) != 1) /* nicht optimal */ { q = close_socket(q); continue; } if((len = (int) nm_field[(int) *buf]) > 0) /* fixed length command */ { if(len > 1) { count = recv(q->socket,buf+1,len-1,0); if(count != len-1) { fprintf(stderr,"IO: wrong length\n"); return; } } work_input((unsigned char*)buf,len,q); } else { /* getting length */ if((count = recv(q->socket,buf+1,1,0)) != 1) /* nicht optimal */ { fprintf(stderr,"IO: error reading blklen\n"); return; } len = (int) buf[1]; if(len > 2) { if((count = recv(q->socket,buf+2,len-2,0)) != (len-2) ) { fprintf(stderr,"IO-1: wrong length\n"); return; } } work_input((unsigned char*)buf,len,q); } } q=q->next; } /* * accept_socket */ if (FD_ISSET(acc_socket, &readmask1)) { accept_socket(); } if(use_exmenu) { if(FD_ISSET(menu_in,&readmask1)) handle_exinput(); } else /* keyboard (stdin) */ { if(FD_ISSET(0,&readmask1)) handle_input(); } } } /* end io_handler */ /************************************* * (try to) accept a new socket */ void accept_socket(void) { int addrlen = sizeof(struct sockaddr); struct cqueue *q; q = calloc(1,sizeof(struct cqueue)); /* alloc a new node */ q->response = FALSE; q->socket = accept(acc_socket,&(q->remoteaddr),&addrlen); if(q->socket == -1 ) { perror("accept call failed"); exit(1); } q->next = cfirst; q->mode = 0; cfirst = q; get_hostname(q,q->hostname); printf("\n accepted a connection request from [%s].\n",q->hostname); FD_SET(q->socket,&readmask); } /************************ * resolve hostname */ char *get_hostname(struct cqueue *q,char *name) { struct hostent *hp; char *saddr = (char *) &(((struct sockaddr_in *) &(q->remoteaddr))->sin_addr.s_addr); hp = gethostbyaddr(saddr,4,AF_INET); if(strlen(hp->h_name) > 0) strcpy(name,hp->h_name); else sprintf(name,"%d.%d.%d.%d",(int) saddr[0],(int) saddr[1],(int) saddr[2],(int) saddr[3]); return name; } /********************************** * close a connection */ struct cqueue *close_socket(struct cqueue *q) { struct cqueue *q2,*q1,*qr; struct pqueue *p,*p1; qr = q->next; FD_CLR(q->socket,&readmask); /* shutdown ? */ close(q->socket); q->socket = -1; for(q2=cfirst,q1=NULL;q2 != NULL;q1=q2,q2=q2->next) if(q2 == q) break; if(q1 == NULL) cfirst = q->next; else q1->next = q->next; fprintf(stdout,"I've lost a connection ...\n"); for(p=q->players;p!=NULL;p=p1) { p1=p->cnext; leave_group(p); remove_player(p,q); } free(q); return qr; } /********************************* * close not responding sockets */ void close_timeout_sockets(struct gqueue *g) { struct pqueue *p; for(p=g->first;p!=NULL;) { if(p->playing) { if(!p->connection->response) { fprintf(stderr,"Connection of Player %d doesn't response .. -> shutdown\n",p->number); close_socket(p->connection); p=g->first; continue; } } p=p->gnext; } } /******************************* * handle an incoming packet * works only for SINGLE(PLAYER/CAMERA)-connections */ void work_input(unsigned char *buf,int len,struct cqueue *q) { unsigned long lval; struct pqueue *pl; int cn; /* ident?? */ if( !(q->mode & (SINGLEPLAYER|SINGLECAMERA)) && (*buf != NM_SETMODE)) { fprintf(stderr,"error: Junk on an unchecked connection.\n"); return; } switch(*buf) { case NM_OWNDATA: if(q->mode & SINGLEPLAYER) { if(q->players == NULL) break; q->players->joydata = (int) buf[1]; if(q->players->playing && (q->players->mode == PLAYERMODE) ) { q->players->group->response--; q->response = TRUE; if(q->players->group->timeout && !q->players->group->response && !nowait) do_timer(q->players->groupnumber); } } else { } break; case NM_MESSAGE: if(q->players == NULL) break; buf[(int) buf[1]] = 0; switch(buf[2]) { case MSG_SERVER: printf("%s\n",buf+6); /* message to server */ break; case MSG_ALL: break; /* shout all */ case MSG_GROUP: send_mes((char*)buf+6,q->players,MSG_GROUP,NULL,q->players->group); break; /* group-message */ case MSG_TEAM: break; /* team-message */ case MSG_TO_NAME: if((pl=find_player((char*)buf+6)) != NULL) print_player((char*)buf+7+strlen((char*)buf),pl); } break; case NM_OWNNAME: fprintf(stderr,"CLIENT sent an old command.\n"); send_message("Sorry, your running an old client-version.\n",q); close_socket(q); break; case NM_READY: if(q->players == NULL) break; if(q->players->playing && (q->players->mode == PLAYERMODE)) { q->players->group->response--; q->response = TRUE; } break; case NM_END: if(q->players == NULL) break; fprintf(stderr,"Received END-Command by: %s.\n",q->players->name); if(q->players->group->gameflag && q->players->playing) if(q->players->master) { fprintf(stderr,"Accepted END-Command by: %s.\n",q->players->name); end_game(q->players->group); } break; case NM_SETMODE: if(!(q->mode & (SINGLEPLAYER)) ) { lval = 0; lval |= ((unsigned long) buf[1]) << 24; lval |= ((unsigned long) buf[2]) << 16; lval |= ((unsigned long) buf[3]) << 8; lval |= ((unsigned long) buf[4]); switch(lval) { case PLAYERMAGIC: q->mode = SINGLEPLAYER; printf("It's a SINGPLEPLAYER connection!\n"); break; case CAMMAGIC: q->mode = SINGLECAMERA; printf("It's a CAMERA connection! (not debugged!)\n"); break; default: printf("Unknown Magic: Do you use different netprotocolls?\n"); close_socket(q); break; } } break; case NM_OWNCOMMENT: if(q->players == NULL) break; buf[(int)buf[1]] = 0; if(strlen((char*)buf+2) > MAXCOMMENT) buf[2+MAXCOMMENT] = 0; strcpy(q->players->comment,(char*)buf+2); if(q->players->group->playing) send_comment(q->players->group,q->players); break; case NM_DOCOMMAND: if(q->players == NULL) break; fprintf(stderr,"-EXCOMMAND-\n"); if(q->players->master) do_command(q->players->group,q->players,(char*)buf+2); break; case NM_JOIN: cn = ((int)buf[1]<<8)+buf[2]; if((pl=find_player_by_cn(q,cn)) != NULL) join_group((int)buf[3],pl); else fprintf(stderr,"Join-Error!\n"); break; case NM_ADDPLAYER: buf[(int)buf[1]] = 0; /* add \0 to playernamename */ if(strlen((char*)buf+4) > MAXNAME) buf[4+MAXNAME] = 0; if(q->mode & SINGLEPLAYER) add_player(q,((int)buf[2]<<8)+buf[3],PLAYERMODE,(char*)buf+4); else if(q->mode & SINGLECAMERA) add_player(q,((int)buf[2]<<8)+buf[3],CAMMODE,(char*)buf+4); break; case NM_REMOVEPLAYER: break; default: fprintf(stderr,"error: Unknown NET-Command!!\n"); break; } } /***********************************/ /* Start Game (master) */ /***********************************/ void start_game(struct gqueue *g,int *teams) { g->playing = 1; g->numgamers = g->numplayers; init_slots(0,teams,g); send_names(g); send_comments(g); send_maze(g); send_start(g); } /**************************/ /* init_slots */ /**************************/ void init_slots(int first,int *teams,struct gqueue *g) { int j; struct pqueue *p; g->numwait=0; for(p=g->first,j=first;p!=NULL;p=p->gnext) { p->playing = 1; if(p->mode != PLAYERMODE) continue; p->joydata = 0; p->connection->response = FALSE; p->number = j; if(teams != NULL) p->team = teams[j]; j++; g->numwait++; } } /***********************/ /* Spielende */ /***********************/ void end_game(struct gqueue *g) { char data[2]; struct pqueue *p; g->playing = 0; g->gameflag = FALSE; data[0] = NM_STOPGAME; send_group(g,0,data,1); for(p=g->first;p != NULL;p=p->gnext) { p->playing = FALSE; } fprintf(stdout,"Gameover in Group %s.\n",g->groupname); } /**********************************/ /* Sende Routinen */ /**********************************/ void send_maze(struct gqueue *g) { int (*hfeld)[MAZEDIMENSION],(*vfeld)[MAZEDIMENSION]; int dim,i,j; char buf[MAZEDIMENSION+10]; hfeld = g->maze.hwalls; vfeld = g->maze.vwalls; dim = g->maze.xdim; for(i=0;i<=dim;i++) { for(j=0;jfirst;p!=NULL;p=p->gnext) { if(p->playing && (p->mode == PLAYERMODE) ) { data[0] = NM_ALLNAMES; data[1] = 3 + strlen(p->name); data[2] = (char) p->number; strcpy(data+3,p->name); send_group(g,PLAYING,data,data[1]); } } } /*********************/ /* Send Comments */ /*********************/ void send_comments(struct gqueue *g) { struct pqueue *p; for(p=g->first;p!=NULL;p=p->gnext) send_comment(g,p); } void send_comment(struct gqueue *g,struct pqueue *p) { char data[256]; if(p->playing && (p->mode == PLAYERMODE) ) { data[0] = NM_ALLCOMMENTS; data[1] = 3 + strlen(p->comment); data[2] = (char) p->number; strcpy(data+3,p->comment); send_group(g,PLAYING,data,data[1]); } } /**************************************************** * send start (init) data block * including: num. of players & playernumbers */ void send_start(struct gqueue *g) { char data[MAXPLAYERS+10]; int rndwert; struct pqueue *p; g->response = g->numwait; g->numjoy = g->numgamers; printf("Starting game with %d player(s) in group %s,\n",g->numgamers,g->groupname); data[0] = NM_STARTGAME; data[1] = g->numgamers + 16; data[2] = (char) g->numgamers; rndwert = rand(); data[4] = rndwert >> 8; data[5] = rndwert & 0xff; if(g->numteams == 0) data[6] = (char) g->numgamers; else data[6] = g->numteams; data[7] = (unsigned char) (g->gamemode & 0xff); data[8] = (unsigned char) (g->gamemode>>8); data[9] = (unsigned char) g->divider; /* data 10 - 15 free for future changes */ for(p=g->first;p!=NULL;p=p->gnext) { if(p->playing && (p->mode == PLAYERMODE)) { if(g->numteams) data[16+p->number] = p->team; else data[16+p->number] = p->number; } } for(p=g->first;p!=NULL;p=p->gnext) { if(p->playing) { p->connection->response = FALSE; /* warning! */ if(p->mode == PLAYERMODE) data[3] = (char) p->number; else data[3] = 0; send(p->connection->socket,data,data[1],0); } } starttick = timerticks; } /************************************* * send a (new) message */ void send_mes(char *m,struct pqueue *from,int type,struct pqueue *p,struct gqueue *g) { unsigned char data[256]; char mes[256]; if(from != NULL) { if(from->checked) strcpy(mes,"<"); else strcpy(mes,"!<"); strcat(mes,from->name); strcat(mes,"> "); } else strcpy(mes,"[Server] "); strcat(mes,m); data[0] = NM_MESSAGE; data[1] = 7 + strlen(mes); data[2] = type; data[3] = 0; data[4] = 0; data[5] = 0; strcpy((char *) data+6,mes); switch(type) { case MSG_ALL: send_command(cfirst,0,(char*)data,data[1]); break; case MSG_GROUP: data[4] = g->groupno; send_group(g,0,(char*)data,data[1]); break; case MSG_PLAYER: data[4] = (p->cnumber>>8) & 0xff; data[5] = p->cnumber & 0xff; send(p->connection->socket,(char *) data,(int) data[1],0); break; case MSG_TEAM: for(p=g->first;p!=NULL;p=p->gnext) if( (from->team == p->team) && (from != p) ) { data[4] = (p->cnumber>>8) & 0xff; data[5] = p->cnumber & 0xff; send(p->connection->socket,(char *) data,(int) data[1],0); } break; } } /********************/ /* Send Message */ /********************/ void send_message(char *str,struct cqueue *q) { char data[256]; data[0] = NM_MESSAGE; data[1] = strlen(str)+7; data[2] = 0; data[3] = 0; data[4] = 0; data[5] = 0; strcpy(data+6,str); send(q->socket,data,data[1],0); } /************************* * Send joystick data */ void send_joydata(struct gqueue *g) { char data[MAXPLAYERS+2]; struct pqueue *p; for(p=g->first;p!=NULL;p=p->gnext) { if(p->playing && (p->mode == PLAYERMODE)) { data[p->number+1] = (char) p->joydata; p->connection->response = FALSE; } } data[0] = NM_ALLDATA; send_group(g,PLAYING,data,g->numjoy+1); } void send_inactive(struct gqueue *g,struct pqueue *p) { char data[3]; data[0] = NM_INACTIVATE; data[1] = g->groupno; data[2] = p->number; send_group(g,PLAYING,data,3); } /************************************************************************** * * NEW STUFF: * */ /************************************ * Send a command (new) */ void send_command(struct cqueue *q,int mask,char *data,int len) { while(q != NULL) { if(q->mode & mask) send(q->socket,data,len,0); q = q->next; } } /************************************ * send a command to all players of a group */ void send_group(struct gqueue *g,int mask,char *data,int len) { struct pqueue *p=g->first; while(p != NULL) { if(!mask || ((mask == PLAYING) && p->playing)) send(p->connection->socket,data,len,0); p = p->gnext; } } /************************************ * add player (or camera) */ struct pqueue *add_player(struct cqueue *c,int cn,int mode,char *name) { struct pqueue *p,*p1,*p2=NULL; p = calloc(1,sizeof(struct pqueue)); if(find_player(name) == NULL) { p->checked = TRUE; } for(p1=c->players;p1!=NULL;p1=p1->cnext) { if(p1->cnumber == cn) fprintf(stderr,"Duplicated connection-numbers.\n"); p2=p1; } if(p2 == NULL) { c->players = p; } else { p2->cnext = p; p->clast = p2; } p->connection = c; p->mode = mode; p->cnumber = cn; if(name != NULL) { if(strlen(name)>MAXNAME) name[MAXNAME] = 0; strcpy(p->name,name); } strcpy(p->comment,"Gotcha!!!!"); if(p->checked) send_mes("OK, player added with a valid name.",NULL,MSG_PLAYER,p,NULL); else send_mes("OK, player added with an invalid name.",NULL,MSG_PLAYER,p,NULL); fprintf(stderr,"Added player %s : %d.\n",p->name,p->cnumber); return p; } void remove_player(struct pqueue *p,struct cqueue *c) { free(p); /* if(c != NULL) -> silent on this connection */ } /************************************ * leave group */ int leave_group(struct pqueue *p) { struct gqueue *g; g = p->group; if(!p->groupnumber || (g == NULL) ) return 0; if(p->glast == NULL) p->group->first = p->gnext; else p->glast->gnext = p->gnext; if(p->gnext != NULL) { p->gnext->glast = p->glast; } p->gnext = NULL; p->glast = NULL; p->group = NULL; p->groupnumber = 0; if(p->mode == PLAYERMODE) g->numplayers--; if(p->master) if(g->first != NULL) g->first->master = TRUE; if(p->playing == TRUE) { p->playing = FALSE; if(p->mode == PLAYERMODE) { g->numgamers--; g->numwait--; if(!p->connection->response) g->response--; } if((g->numgamers == 0) || (g->numwait == 0)) /* double-check */ { fprintf(stdout,"Last active player has left the game.\n"); end_game(g); } else send_inactive(g,p); } return 1; } /************************************ * join group */ int join_group(int no,struct pqueue *p) { struct gqueue *g; struct pqueue *p1,*p2; if(p==NULL) return FALSE; if(p->groupnumber) leave_group(p); for(g=gfirst;g!=NULL;g=g->next) if(g->groupno == no) break; if(g == NULL) return 0; for(p1=g->first,p2=NULL;p1!=NULL;p1=p1->gnext) p2=p1; if(p2 == NULL) { g->first = p; p->glast = NULL; p->master = TRUE; } else { p2->gnext = p; p->glast = p2; p->master = FALSE; } p->gnext = NULL; p->groupnumber = no; p->group = g; p->playing = FALSE; if(p->mode == PLAYERMODE) g->numplayers++; send_mes("OK, here I am!",p,MSG_GROUP,NULL,g); if(g->playing) send_mes("Please wait .. another game is running!",NULL,MSG_PLAYER,p,NULL); else send_mes("OK, joined group!",NULL,MSG_PLAYER,p,NULL); return 1; } /*************************************** * find a group (by name) */ struct gqueue *find_group(char *name) { struct gqueue *g; for(g=gfirst;g!=NULL;g=g->next) { if(strcmp(g->groupname,name) == 0) return g; } return NULL; } /*************************************** * find a player (by name) (later: hashtables) */ struct pqueue *find_player(char *name) { struct cqueue *c; struct pqueue *p; if(name == NULL) return NULL; for(c=cfirst;c!=NULL;c=c->next) for(p=c->players;p!=NULL;p=p->cnext) { if(p->checked) /* only checked players */ if(strcmp(name,p->name) == 0) return p; } return NULL; } /*************************************** * find a player (by connectionnumber) */ struct pqueue *find_player_by_cn(struct cqueue *c,int cn) { struct pqueue *p; if(c == NULL) return NULL; for(p=c->players;p!=NULL;p=p->cnext) { if(p->cnumber == cn) return p; } return NULL; } /*************************************** * Create a new group */ struct gqueue *new_group(int no) { struct gqueue *g,*g1,*g2=NULL; g = calloc(1,sizeof(struct gqueue)); for(g1=gfirst;g1!=NULL;g1=g1->next) g2=g1; if(g2 == NULL) gfirst = g; else g2->next = g; g->groupno = no; strcpy(g->groupname,"NETMAZE"); return g; } /******************************* * List connections */ void list_connections(void) { struct cqueue *q; int i; printf("No.: | Player-Name: | connected from:\n"); printf("-----+------------------+----------------\n"); for(q=cfirst,i=0;q!=NULL;q=q->next,i++) { if(q->players->mode == PLAYERMODE) printf("%3d | %16s | %s\n",i,q->players->name,q->hostname); else printf("%3d | %16s | %s\n",i,"A Camera?!?",q->hostname); } printf("-----+------------------+----------------\n"); } /***************************/ /* little help for newbies */ /***************************/ void usage(void) { printf("Usage: netserv [-h|-help] [-exmenu ] [-nowait]\n"); printf("\t-h|-help: this message\n"); printf("\t-exmenu: Control with an external menu\n"); printf("\t-nowait: server shouldn't wait for clients (for very slow lines)\n"); exit(0); } void print_timerinfo(unsigned long t) { switch(t & 0x3f) { case 0: fprintf(stderr,"\010|"); break; case 0x10: fprintf(stderr,"\010/"); break; case 0x20: fprintf(stderr,"\010-"); break; case 0x30: fprintf(stderr,"\010\\"); break; } } void print_menu(void) { if(use_exmenu) return; printf("\t****************** MENU ******************\n"); printf("\t1 [mazename] => Reinit/Load a maze ( rndmaze: 1 )\n"); printf("\t2 [teamlist] => Start game [with teams]\n"); printf("\t3 => Stop a running game\n"); printf("\t4 => List connections\n"); printf("\t5 => Shutdown a connection \n"); if(gfirst->gamemode == 0) printf("\t6 => Enable extended gamemode\n"); else if(!(gfirst->gamemode & GM_FASTWALKING)) printf("\t6 => Enable extended just-for-fun gamemode\n"); else printf("\t6 => Enable classic gamemode\n"); switch(gfirst->divider) { case 0: printf("\t7 => Change 'beat' divider (current: 1)\n"); break; case 1: printf("\t7 => Change 'beat' divider (current: 2)\n"); break; case 2: printf("\t7 => Change 'beat' divider (current: 4)\n"); break; } printf("\t------------------------------------------\n"); printf("\t9 => Quit\n\n"); } netmaze-0.81+jpg0.82.orig/texture.c0100600000175000017500000003311605553573374017241 0ustar jgoerzenjgoerzen/* * Simple Texture test, Needs an (n^2)*(m^2) BMP (8bit) as texture-base * maxwidth = 256, */ #include #include #include #include #include "netmaze.h" static char *make_jump_tab(int h); struct texture *load_texture(char *name); void image_hline(int x1,int y1,int x2,int val); void image_circle(long x1,long y1,long h1,long h2,int); extern unsigned long get_best_color(XColor *col); extern struct shared_struct *sm; /* static unsigned char *sqrttab; */ static double *circletab; static long *floortab; long texturemem; extern struct texture *vtex; extern long trigtab[]; /* * Draw a texture-wall.. really not fast * I have to optimize the shift-stuff, most of them was a quick hack. * that's really not the best texture methode, but it was the best way * to add it to the old code. * type: 0=full, !0=mirrored */ void texture_wall(long x1,long hn1,long x2,long hn2,struct texture *tex,long lclip,long rclip,int size,int clipped,int type) { int j,xp,hi,k,ln,d,i1,istep; char *jmpt,*imgbuf,*t1,*t2; long h,xn1,yn1; char *ia1,*ia2,pixval1,pixval2; int shift=size-4,offset=0; hn1>>=4; hn2>>=4; if(!(d = (x2-x1)>>size) || hn1 > 0x400000 || hn2 > 0x400000) return; h = ((double) (hn2 - hn1) / d); xn1 = x1*WALLHEIGHT / hn1; yn1 = (((SCREEN-FLUCHT)*WALLHEIGHT)<<12)/hn1+(FLUCHT<<4); if(x1 < lclip) { hn1 += ((lclip-x1)>>size)*h; x1 = lclip; } if(x2 > rclip ) x2=rclip; i1=x1*WALLHEIGHT; istep=WALLHEIGHT<>size)+1; if(clipped) { double xd0,yd0; yd0 = (((SCREEN-FLUCHT)*WALLHEIGHT)<<12) / hn2+(FLUCHT<<4)-yn1; xd0 = (x2*WALLHEIGHT) / hn2 - xn1; offset = 256-(((int) sqrt(xd0*xd0+yd0*yd0))>>4); } imgbuf = sm->grafix.imagebuf + (x1>>size) + (IMAGEWIDTH>>1) + (IMAGEHEIGHT>>1)*IMAGEWIDTH; for(;d;d--,i1+=istep,hn1 += h) { double xd0,yd0; yd0 = (((SCREEN-FLUCHT)*WALLHEIGHT)<<12) / hn1+(FLUCHT<<4)-yn1; xd0 = i1 / hn1 - xn1; xp = ((((int) sqrt(xd0*xd0+yd0*yd0))>>4)+offset) & tex->wmask; hi = hn1>>shift; ia1 = ia2 = imgbuf++; if(!type) { t2 = t1 = tex->data + (xp<hshift) + tex->hhalf; jmpt = tex->jmptabh + ((hi & tex->hmaskh)<jshifth); ln = hi>>tex->hshifth; for(j=tex->divtabh[hi][0];j;j--) { pixval1 = *t1++; pixval2 = *--t2; #if 1 for(k=ln;(--k)>=0;) { ia1 -= IMAGEWIDTH; *ia1 = pixval1; *ia2 = pixval2; ia2 += IMAGEWIDTH; } if(*jmpt++) { ia1 -= IMAGEWIDTH; *ia1 = pixval1; *ia2 = pixval2; ia2 += IMAGEWIDTH; } #else #include "xtests/texpix.c" #endif } if(j=tex->divtabh[hi][1]) { pixval1 = *t1++; pixval2 = *--t2; for(;j;j--) { ia1 -= IMAGEWIDTH; *ia1 = pixval1; *ia2 = pixval2; ia2 += IMAGEWIDTH; } } } else if(!tex->precalc || hi>tex->height) { t1 = tex->data + (xp<hshift); jmpt = tex->jmptab + ((hi & tex->hmask)<jshift); ln = hi>>tex->hshift; for(j=tex->divtab[hi][0];j;j--) { pixval1 = *t1++; for(k=ln;(--k)>=0;) { ia1 -= IMAGEWIDTH; *ia1 = pixval1; *ia2 = pixval1; ia2 += IMAGEWIDTH; } if(*jmpt++) { ia1 -= IMAGEWIDTH; *ia1 = pixval1; *ia2 = pixval1; ia2 += IMAGEWIDTH; } } if(j=tex->divtab[hi][1]) { pixval1 = *t1++; for(;j;j--) { ia1 -= IMAGEWIDTH; *ia1 = pixval1; *ia2 = pixval1; ia2 += IMAGEWIDTH; } } } else { t1 = tex->datatab[hi] + xp*hi; for(j=(hi>WYHALF)?WYHALF:hi;j;j--) { ia1 -= IMAGEWIDTH; *ia1 = *ia2 = *t1++; ia2 += IMAGEWIDTH; } } } } static char *make_jump_tab(int h) { long d; long d1; int i,j,h1,shft; char *t1,*t; static char *jmptabsave[32] = { NULL, }; if(!h) return NULL; for(h1=h,shft=0;h1;h1>>=1,shft++); if(jmptabsave[shft] != NULL) return jmptabsave[shft]; if((t1 = t = malloc(h*h)) == NULL) { fprintf(stderr,"Out of Memory!\n"); exit(1); } jmptabsave[shft] = t; for(i=0;i>=1,shft++); if(divtabsave[shft] != NULL) return divtabsave[shft]; if((t = malloc(4096*2*sizeof(short))) == NULL) { fprintf(stderr,"Out of Memory!\n"); exit(1); } divtabsave[shft] = t; t1 = (short (*)[2]) t; for(i=0;i>16); } return t; } void make_tabs(void) { int i,j; long *fltab; double m[] = { 0,0,0,0,0,0,0,0,0,0,0, 0.5 , 1.0 , 2.0 , 4.0 , 8.0 }; /* sqrttab = malloc(66049); for(i=0;i<66049;i++) sqrttab[i] = (unsigned char) sqrt((double) i); */ circletab = malloc(520*sizeof(double)); if(circletab == NULL) { fprintf(stderr,"Not enough memory for circletab.\n"); exit(1); } for(i=0;i<512;i++) { circletab[i] = sqrt(1 - ((double) i)*((double) i)/(512*512)); } fltab = floortab = (long *) malloc(sizeof(long)*4*(WYSIZE>>1)*128); if(floortab == NULL) { fprintf(stderr,"No memory for floortab.\n"); exit(1); } for(i=0;i<128;i++) { double dsin,dcos; int i1; i1 = i?i:256; dsin = (double) trigtab[256-i1] / 0x1000000; dcos = (double) trigtab[320-i1] / 0x1000000; for(j=0;j<(WYSIZE>>1);j++) { double ydrot,d1cos,d1sin; double xo,yo; int h; h = (j>3)?j:4+j; d1cos = WALLHEIGHT / ((double) h * m[sm->outputsize]); ydrot = d1cos * (SCREEN-FLUCHT) * 4096 + FLUCHT * 4096; d1sin = dsin * d1cos; d1cos *= dcos; xo = d1cos*(XMIN) - ydrot*dsin; yo = ydrot*dcos + d1sin*(XMIN); *fltab++ = (long) (xo*0x10); *fltab++ = (long) (yo*0x10); *fltab++ = (long) (d1sin*0x10000*m[sm->outputsize]); *fltab++ = (long) (d1cos*0x10000*m[sm->outputsize]); } } } struct texture *load_texture(char *name) { struct texture *tex; int i,j,k,precalc=0,h,w; FILE *f; char *b,*t,*t1; long d,d1; unsigned char buf[32]; int map[256]; char fn[1024]; strcpy(fn,TEXTUREPATH); strcat(fn,"/"); strcat(fn,name); f=fopen(fn,"r"); if(f) { fread(buf,1,32,f); fclose(f); } else { fprintf(stderr,"Can't load texture: %s\n",fn); return NULL; } w = buf[18] + (buf[19]<<8); h = buf[22] + (buf[23]<<8); /* if(w <= 32 && h <= 128) precalc = 1;*/ tex = malloc(sizeof(struct texture)); if(tex == NULL) { fprintf(stderr,"Not enough memory for texturestruct %s.\n",fn); exit(1); } tex->height = h; tex->width = w; tex->hhalf = h>>1; tex->whalf = w>>1; tex->jmptab = make_jump_tab(h); tex->jmptabh = make_jump_tab(tex->hhalf); tex->divtab = (short (*)[2]) make_div_tab(h); tex->divtabh = (short (*)[2]) make_div_tab(tex->hhalf); tex->hmask = h-1; tex->hmaskh = (h>>1)-1; tex->wmask = w-1; tex->precalc = precalc; if((h & (h-1)) || (w & (w-1))) { fprintf(stderr,"Illegal texture size.\n"); return NULL; } if(precalc) { tex->datatab = malloc( sizeof(char *) * (h+1) ); texturemem += (h>>1)*w*h+((w*h)>>1)+4; tex->data = (char *) (((long) malloc((h>>1)*w*h+((w*h)>>1)+4) + 3) & 0xfffffffc); } else { tex->data = (char *) (((long) malloc(w*h+4) + 3) & 0xfffffffc); texturemem += w*h+4; } if( (tex->data == NULL) || (precalc && (tex->datatab == NULL)) ) { fprintf(stderr,"Not enough memory for texturedata %s.\n",fn); exit(1); } b = (char *) malloc(tex->width*tex->height); if(b == NULL) { fprintf(stderr,"Not enough memory for tmp-texturedata %s.\n",fn); exit(1); } for(tex->hshift=-1,i=h;i;i>>=1) tex->hshift++; for(tex->wshift=-1,i=h;i;i>>=1) tex->wshift++; tex->jshift = tex->hshift; tex->hshifth = tex->hshift-1; tex->jshifth = tex->hshifth; f=fopen(fn,"r"); if(f) { XColor c; unsigned char a[4]; fread(tex->data,1,54,f); for(i=0;i<256;i++) { fread((char *) a,1,4,f); c.blue = ((unsigned short) a[0])<<8; c.green = ((unsigned short) a[1])<<8; c.red = ((unsigned short) a[2])<<8; c.flags = DoRed | DoGreen | DoBlue; map[i] = get_best_color(&c); } fread(b,1,tex->width*tex->height,f); fclose(f); } else exit(1); /* rotate and remap colors */ for(i=0;idata[i*h+j] = map[(int)(unsigned char)b[j*w+i]]; } if(precalc) { t = tex->data + h*w; tex->datatab[h] = tex->data; for(k=1;kdatatab[k] = t; d1 = (k<<16) / h; for(i=0;idata+i*h; for(j=h;(--j)>=0;) { d += d1; if(d & 0xffff0000) { *t++ = *t1++; d &= 0x0000ffff; } else t1++; } } } } free(b); return tex; } void image_circle(long x1,long y1,long h1,long h2,int col) { int i,j,k,xi1,xi2; long d; long d1=0x7fff; int r; int lclip,rclip,xmid; if(h1 < 2) return; d = (512<<16)/(h1>>1); lclip=(IMAGEWIDTH-WXSIZE)>>1; rclip=lclip+WXSIZE-1; xmid = x1+(IMAGEWIDTH>>1); h2>>=1; for(k=(h1>>1),i=j=(IMAGEHEIGHT>>1)+y1;k;k--,d1+=d) { r=(int) (h2*circletab[d1>>16]); xi1=xmid-r; xi2=xmid+r; if(xi1rclip) { if(xi1>rclip) break; xi2=rclip; } image_hline(xi1,i++,xi2,col); image_hline(xi1,--j,xi2,col); } } /********************************* * draw textures on the floor * (not optimized) */ void image_floor(int x,int y,int angle,struct texture *tx) { char *image = sm->grafix.imagebuf + (IMAGEHEIGHT>>1)*IMAGEWIDTH + ((IMAGEWIDTH-WXSIZE)>>1); char *t = tx->data; long *fltab; int i,j; long mask = 0x00ff0000; int step=IMAGEWIDTH-WXSIZE; switch(angle & 0x80) { case 0: fltab = floortab + angle*4*(WYSIZE>>1); for(j=(WYSIZE>>1);j;j--,image+=step) { long xo,yo,tsin,tcos; xo = x + *fltab++; yo = y + *fltab++; tsin = *fltab++; tcos = *fltab++; for(i=WXSIZE;i;i--) { *image++ = *(t + (((xo & mask) + ((yo & mask)>>8))>>8) ); /* *image++ = *(t+ ((xo>>8)&0xff00) + ((yo>>16)&0xff) ); */ xo += tcos; yo += tsin; } } break; default: angle &= 0x7f; fltab = floortab + angle*4*(WYSIZE>>1); for(j=(WYSIZE>>1);j;j--,image+=step) { long xo,yo,tsin,tcos; xo = x - *fltab++; yo = y - *fltab++; tsin = - *fltab++; tcos = - *fltab++; for(i=WXSIZE;i;i--) { *image++ = *(t + (((xo & mask) + ((yo & mask)>>8))>>8) ); xo += tcos; yo += tsin; } } } } void image_top(int c1) { int i,j,k; unsigned long *ia1; unsigned long val1=c1 +((long) c1<<8) +((long) c1<<16) +((long) c1<<24); ia1 = (unsigned long *) (sm->grafix.imagebuf + ((IMAGEWIDTH-WXSIZE)>>1) + (IMAGEHEIGHT>>1)*IMAGEWIDTH); k = WXSIZE>>2; for(i=(WYSIZE>>1);i;i--) { ia1 -= (IMAGEWIDTH-WXSIZE)>>2; for(j=k;j;j--) *--ia1 = val1; } } void image_bg(int c1,int c2) { int i,j,k; unsigned long *ia1,*ia2; unsigned long val1=c1 +((long) c1<<8) +((long) c1<<16) +((long) c1<<24); unsigned long val2=c2 +((long) c2<<8) +((long) c2<<16) +((long) c2<<24); ia1 = ia2 = (unsigned long *) (sm->grafix.imagebuf + ((IMAGEWIDTH-WXSIZE)>>1) + (IMAGEHEIGHT>>1)*IMAGEWIDTH); k = WXSIZE>>2; for(i=(WYSIZE>>1);i;i--) { ia1 -= (IMAGEWIDTH-WXSIZE)>>2; for(j=k;j;j--) { *--ia1 = val1; *ia2++ = val2; } ia2 += (IMAGEWIDTH-WXSIZE)>>2; } } void image_hline(int x1,int y1,int x2,int val) { char *img = sm->grafix.imagebuf + y1*IMAGEWIDTH + x1; int d1,d2,d3; unsigned long val1; if(x2 < x1) { fprintf(stderr,"argl: image_hline: x2>2; if(d3 < 0) { fprintf(stderr,"argl: image_hline: d3<0! \n"); return; } for(;d1;d1--) *img++ = val; for(;d3;d3--) { /* *(((unsigned long*)img)++) = val1; */ *(((unsigned long*)img)) = val1; img+=4; } for(;d2;d2--) *img++ = val; } } void image_sym_vline(long x1,long h1,int col,int size) { char *ia1,*ia2; h1 >>= size; if(h1 > WYHALF) h1 = WYHALF; ia1 = ia2 = sm->grafix.imagebuf + (x1>>size) + (IMAGEWIDTH>>1) + (IMAGEHEIGHT>>1)*IMAGEWIDTH; for(;h1;h1--) { ia2 -= IMAGEWIDTH; *ia2 = col; *ia1 = col; ia1 += IMAGEWIDTH; } } netmaze-0.81+jpg0.82.orig/lib/0040700000175000017500000000000005553577435016142 5ustar jgoerzenjgoerzennetmaze-0.81+jpg0.82.orig/lib/floor.bmp0100600000175000017500000020206605553575226017764 0ustar jgoerzenjgoerzenBM66(m m X(<hDH(0@08L `L0@X `@ (xPh8`X(`p(XL0PX`0XHH0 (h@`H0xXxXh`xHx0Xh0Xt D` XX``0`X(HxX8(HPH`0PH|(X8H`(X\P@(HXX<PH Xp8`<HP|X@ 0` <`8`X0XH0P8,0DXX@ Xt(PPPp \Xhh PhX`h`8`hXPD`X XH@h0d\`H(@X(hX0Pp\H 88 H\Xp@`X8@(8h(`H P,(4H(XH0HX4<( 0@@h `` H` PX <XHP0P\PX0 08(@X(Xx0dpP@(@`>:ǎ## [[ZZqll柟///ğq\\\qĐqqqql\qllllxxxʻxxx޻lllqqqAqA[[[[J:yy::`:  ͲV[y[::[[ :::: ::yyy::yy``:`:6:``6``666:`:J@:::`:: [[Alqll/sş////ş/l\Đqlql\\ėllllxʻtt滾滴llllq\\AA\AAn[ѣn:[yyyyy: !!y[[[[[ [ [: : : : y#y:y:6:`:`````:`J::6``::`:::`:::[[llls/sş///P/Uqq\qq\\qq滻t派޾޾滻OOėllĐlqqAqAqAZA[ѣ[nnyyy:J:y:y::y:: 8!!홣yy[[[  # ::::::``J::6:```:`:`::>J:::y:ylss//PPP\Đqqllq\ll仾侾޾ޝ޹OŻllqėqĐĐĘAA[[:y:y:y:yyy:y::##8 !i!y[y[[ Z [ Z   dž:`َ::::``:>`:y:y[yllss柟柟PPPPPPPPqqqqqqAĘAqqll滻滾޻Ol\\qĐqqqqqq[[[y[yyy6J``:`:`:`:: # i!![[Z[ Z [ [  ! Nj:ǎ:`:``:َ6::::y:``:````:`6:J@:6y6:yyy[lss/ɟ/PPPPqğUqĐqqĐ\l䗾湻ؤOOOŻqlĐ\ĐqĐqqAqZ9[:::`:`:y: : ## !!!퉉[ZZ[Z[Z[Z!8! [  +  #厎`::J`::::``y:J:````:`:6:```y6:yny0xOk攔ssPUPPq/UU\UqqĐqql搟l湟OO\\lq\qA[ь:y:y:`:6`::y : # !!ZZZZZZZiiii!!!  !+ ++ ##:::::`::`:J:::6J```y`J````y6:ynyxxkss柟ɟUUUğUqPq\qqğ\l\OXssؤOşl/\lqqqqĐA[yyy:``::`:ǎ # ! !!!uuZZZZZZZiiiii!!!! ++++++++d+#:dž::``::J66````6````:6y:ѣѿxOls/UPUUUUUUăUq\qqUqqqqlOsOOO//l\/\/\qqqĘAq[[yy:6:`` `## ++ uZqZZiiii!!!! !+++++ ++##::::`:``6:::J:J6``````6:```J`yJyÿ̗sşɟUUUUPUUUqqĐĐsXsؤ/Ol//l//\/\lqlĐ\AqZA[[J:`:y::6::  !!ZZZiZ[!Z[i!i!!!!2+g+++++++ #:::`:`::::``6:`````````66`J6yyyђ9湻柔s/sğUɟUUqăćqqqqqqlOşs攟k/O////ş//\//lllqqlAq9Zq[yy[y:Jyy`:``y::: ++uZqiq!Z[!ii!!2+++++N++1++ ǎdǎ#:::ǎَ#::`::````6`66:J6Jyyѿ޾kss柟P/UPćUUUUqĐĐşsss//ş///ş//\\//\/\\qqZ[y::y::6yJ:y::: :  !+uZqiiZ!i!Z!i!!!!+++ugǎd##ǎǎǎ #厎````````:``JJyy9ђ柟UɟUUćqUćUćqqĘqq\ğ/s//////////\/\\\/\/\\lqqqAZqZZZ[[[:yy`:6``::::+++uuqZqqiiiqi!!!ˈg+1 d Nd ǎǎǎ:ǎ厎::`:::6:`````y````6Jyyn޾湟s柟ɟUUUćqUćUUğqğ/şɟ//s//zş/z///\/a\\/l/\\lqAZqZ[[yyy:yJyJyJy:yJ:: Ͳ+qqqq^qij2+gggg+1+ ++ d#:ǎ:厎: :6```:::``````66J6J6yѻѻ/s/ğɟUPUćăUqăqğğğUɟş///z/z///////\\/\/\l\lq\qqZyyy6J::y:J::::::: +u+qqqqqjjjqj^^!+gu+ggg++++ +N+#::::::::``::::y:``6`6:66J6ʻXslɟUUUUUćqUUɟğ/ş//z//////\////l\qlAZ\[ьy6:yynyy`:y::::  ++qqqUqjq3jjjݲ+++ˊg++N+++d###:::``::::````6666J6ȿ柟ĪUPUUUćqăUćqPUPUU//z////////O\wP\/\\qq\qqZZ[yyJy6:y::::6::: : ++++uuqqUUjUjj^ˊ+++++dd+d# :ǎ::`:::J::6````666666澾ssŮUPPU|UććğUUPɟP//ɟ//aa/z////\////\/ş\\\lqZyyyyyy:y:n`:y::: +UqqjjUj^uu+++˲N++++ dddddd+# ǎ::::::`:66``6:6J666仾k攟UUUU||ćUğğfPP/P4a4aaaz/z///\\/P\//\\\\l\qZynyyyy:y`:::: + Ͳ++g˟UPPjjjjg+ug+++++dd## #ǎ:ǎ::`:``666J6ʻsğU||||UğPPf4a4a4a4aa/a/////\//\\\\/O\\lqyyyyyyy`:y:y:::: +!+UPUP^jjju˲u2++uNNNdd#ddd厎```6y6yysssćUU||||||||UUğPPPf4f44444444aa4zw//\\//\\/\\\/\\yyyyyy::::: + ++2uPPjUPjgg+N+dd#:#ǎ:ǎ`:`6``6:`Jy6yXssɪɇLē|||(|||)|ğɟPP4f44a444a444aɢaazP////\/O\\O\l\\0yyyyyyy:y:y::  + ! !jPPUUj3u++++g++NNNN+####:#::````J`J6y`n羻XsssğğULL|||||*|2|||LUf4fa44444a44a44P/\/\//\O\l\Oll艒yyyyyyyyyy     PPjfju+gNNNNN++##ǎ#:ǎ:#:``J`J6J`JntssɓLL||(||||*||||ğU44Sf44444Pa444w//\\O/\llllx0yyy[ãnyy[y [ ! !+jVPuuu+ugNNNNNNNNNdd##ǎǎ:##厎``J6y6J`yyѿx޹ssUUL|||||(||*|||||LUU4f44ff44444444aOl/\/\\0llll0x迿yããyy[y[: +!  ++PUfˈu+uugu+g++NNNNNNN+Ndd#ǎ#### ```y6J6y6yyŪğUL||||(||||**|||||||LUUffSf44444444444O///\\O\lll0xyÿyãnnÿã[[y[[ ! !2+PPjPPuuuuˈuug+NNNNNNN+++#ǎ:# #:```JyyJ6ynnȻk檟ɪɓēL|||||*5*|||*||||LLf44444444444O/\/\l旗0̉yѿyѣy[[[[!!PPPPP+uug+NNNNNN+d#ǎ:# + 厎#َ:6y:``JyynȻ湹sşğĮL||(|)**|***|**|||||||LUSffSfSf44444a44444ضO/\/l/ll0lx蒒yѿn[ÿ[[[[!!!!PPPPPju˲˲++guNNNNNNN ##ǎ# Nd :``Jy`yyyyyѻ/ĪĪL|||||*********||||||||ULUfff4f444444444444aOO\/l\lll0xyyyѣ[[[[[[!PPPPPjP3ˈ2+++g++Ng+++NNNNN+  ## ǎ# + ََ y:6yy6yyyyyyѻ̻kşşğLL|L(|*********|5|||L|||LćPf4f4f44444a444ضOO/OOxx0xxÿÒђѿѿѻѣ9n[[[[[ !!PPP/PPVPVjuu++u++N+++NNN+ + +##+ #`ǎ::`y:`:yyyyyѿ9̗/ş/ēLLL||A|(|**********|**||*|ćff4444444444OOOOl00̻xxxyѿѻђѿ9ѣ9[[[[ [2[2PPPPPPPPPj++++++++++NNNN+++++++ dd  #厎:`:`J6yyyÿyѿOşUL||||||***********|**|||ɇfU4f44444444OOOOlOxxyѿ9ђђ9999n[[[[[[ [PPPPPPPPj3jjj+u+++g+++NNN++++ dddd厎##:`:`:`:yyãyyyOlOşēć|||||(|(**************||UćUPff4OOOOOO0xl0xxxy999999n9[[[[[PPPPPPPPjqP33jjj+2!+++++++++N++++ d d :::# :::y:yyyyÿÿ䗾滹O柟U||||||***************|LUUU4444fP4P/\/OOOl0?xxȻ]ѿѻѻ99(Z([[((P/PPPPPPUPP3j3jj^++++++++N+++N++++dddd #: #ǎ::y:y`:yy迿lşqćē| |*************||||||UUPf4P44PP\OOOl?0xxx999999A[(([//PPPPP/U/PU^PU3jj݄2!+++++++++++++ +++ǭ :`:yyyyO/ş\ğUUć||******|*******|*|)||LU/UPPPPPPPw\/\/\l0xxxʻ99AAA9A((/PPPPPPUPUUăUq^jjj鲲!!u+u+++N+++++++N+++++d+dd+++ # :::y[yy[ylş\\qqPqqUUē*|***| ********||||||ćUU/U/4PPPPwwP/\/\llxxx99AAA(ɟ//P/PPPUqUqU^qjjjj!^!!^++++++++++ +++d+dd++ [yy[y[l柟lɐqUUUU|| |*| |****|***|*||||ćUğUPfP44PPP\/w\\/\\llxx̒tʿA(AA(///ɟş/\Uqqqqqqqj^j^!!i!!!!+! ++++++2++++++++++++  [ [lO柟ll\\ğqUqU |*|*|*2| ||*||||UUU4f4f4f4PwP/\\/OlOl0ttʻʿ9(AAAAz////PUUqqUqUqq^jjji!!!!!!!! + +++++++++ + + +++ + +  [8[ZZO柟q/ğUğUqćUUq|||****||*L||UćPPff4fPw\P\\O/\\OOxxttʻʻʻ]99AAAzɟ/\qqUqqqUq^jj!!!!!!!! u+++++ N  ++ ++ !  iii8llll\/\\\UăUUU^jU2*2*22*2*􇇇UćU4PPwww\/\/\/\O0xO0ʻʻ绻9AAA(a///\UqqqqqUqqq!ii!!! !+++++ + ++ +++ ! i !8iiiiZ00lll\\qUqqqUPUU^*2|L7LUPj4PPPwwP/\\/\\\OO0xxtʻttX任ʻA(z/s///O//\qqqUUqqiiii!![!Z! ! !8!  +!+ ++ + +++ !!! ! i!iiiZ8ZZZ00Alll\lUq\UUqUqj^jUq^|2|UćUPjPPw\/\/\O0xO撒ʴttʻtʬʻAAA///////\\qĐĐqqqqi!Z[!![!i [888 + ++++u +!!!!!i!!ii!iiZiZZZZlxx0l0\\U\qqqP^qjPjU^q^^^| ||UPUɟUPqPwwwP\w\/\\OOxʴtttʻʻʻAz/sz//O/\ğqlqAĘiii!!Z!![[!![ 88 # ++++++uu+!i!!!!!!!!!i!i[iZZ0l0Đqqqqqqqqq^jjjj^jj^^^^^^^3^2|􇇇LUPUPUqPwPww\\\\l0x0ytʻttʻʻ999/zzk//z///Oş檐qĐqZi[i[[Z![Z8 88 ! !!++!+Ͳ+Ͳ+!!^i!^!!iiiqZqZZx0l\lqqqqqqqqqjqjjjqj^j^j^j32|2||UPUUPPPwP\/\O00xôtʴʻttt䬻ʻʻʻʻ瀗qkz/kk//sO/琪qqAqiZZ[Z[[! 8Z !  ++ u+!!!!!j!!!qiiZZZ00lqlll\\qZ\qq\qjjjjjjq!jj^^^^^^2|2|UUUUPUPPP\P\\\\\O\l0蒒ÿttttttt,任Xk/z/kssŤؤs某ĐqZZZZZZ [ :[nj 888   ++!!!!uݲ!j!q^qZZZZZl0lx00\qqqqqPjjjjj2^3|UUUPPPPPPP/P\/\\\\l?Oxytʴttttʬ䬱XXXʻXXAz////攟sssk/攟sqĐqZZ [ [:::[ 888  !++Ͳ!!!!u鄄jjj^qZZZZZ000ZZiiZqjVVjqj2^^^2|qUUUPjPPP\/\\/\\O\0x0yʴtt们ʬXXXX{X瀪q//k/sssk攔sksslq[[ 888 88 ! !!Ͳ!!!!jqjqj^qqZZqZZ0Z\0ZiZqZ0qVjjVjj^j^^ćPUPjqPPPP//\\\\\l?0Oxttʴttt䬬X,XX{/kk/////kskXl檻qAZ : 88 i!!!!!!鲲VjjVjjqjq^ZZZqZAZZ00ZZiZqiqqjjj3jq2q23UUUUUPPPPP\P\/\/\l\Olxxôʴʴttttttʬ欻,sX{{k/kk/z/sXsss滟llllllxA[[[ [ Z[!!i!!!ݲjjjjjUUUjjZZqZZ0ZZZiiZZ鄲鄲jVjjjj^q^^q3ćUUUPwP\P\\\\OOlxxyʴtt,ʱXXXX{{z/z/////ŤssssX滗lllllAѯ08 Z[[ !i!!jjjjjjjj^VZqqZZZZZZZZ!Z!iijjj^^!^33^33ćUPUPwP\\\0l00yyʾ䬹澻ʬX{zk/k/k/kXssss䟗llxѯ8[ [Zi!j!uVjjjjqqjZqZA0yZZZZZZi!鄄jVjjj2^3UUPPPPPP/\\\OlOxt̴ެXttXsX{/k/z/kk/skkX羪lѿxZ[ ZZ!Z!iiiijjjjjjjUVq!qZZiZ\[ьZZZZZ8Z8!!Vݲjj^^^UUPU//PP\\\Oxlxt޹乹tʬX{z/zk/z/kkkkXss任yyyZZZZiiiZ^jjqqqqqi000yZ ZZ2jɇUPUPPPq\/\lOO0xÒѻޝ湾Xttszkkz//z/kz/k/kkss绻绻yyyyyyZZZZiiiii!i^q^jjj3PqqiiZi000[y[ZZ8 8VVV2^UULććPP/UPq\/0llOxѿѿx?޻Xss椢//kzz/kk/sXss䬻tZZZZiiZqjqjjPU\qqqZZ00yy[y[8Z83jUćUUUUğPUPq\\\/OOx0l?޻Xk䟗zzzz/kkzzkksssks绻̒̒ѿ\ZZZZiqZqjqjjqUqqZZZ0y 888i88V!Vj3UUUUUććUUPPq\q\\O\?0?ѿyxksX柟査k/kzkk/kkkzskXsss澻xllZZqqqqqqqqPqqqqqiqA0y虙[ 88ZiiiZ08i݄VjjUj3qU3LUUUUUqql\lOlÒÒÒXtXsslş///k/kzzsssXksssX侾ѿ90xlZZqUqqqqjqqqZyZ[8 888Z!Z88ͲVVjjjjjjj3U^33UUUPUUUq\ql\\l0xxxyyyyyÿylss{矪O/k/zzkzssXXX/X䔹任ѻxlx0q\qPjqPUqqZqZyyyyy 8 Z8iiZ!jVVVjjjUjUćUUUqq\\\x00yyyyÒxy9kkkkXs柟k//kkkszs/X/ssXsskXXktʗxl0qqUlqU/qVPjPVPqqqAqZyٙ-ٙZ888Z8Z 8i8VVjVjjjjUUćUēLqq\q\lq0xyyyyyxyAll査k湟k//kk/sss/ssssXXkXXXtʻl\\qqP\UPPPPUqqqqqqZqqZZyy-y-ٙ-yy88888Z8VjVVPjfjUUUUUUUUUUqqqĐq\0yyy-蒉lkss琟/zkŔs/ssssssssXXksXxxll\qqPqPwff4jVqqqqqZZZZ8yy`yٌ-88888888qjj鸸jUULćăUqqqqqAqZZyyy虉Al柟ss滟lkksXssssssssXkXX侾ʻt̒滻lĐ\UPPPPfUP4PPPqPqqAqqZZyy-yyy`y88 Z8888ZZqVPjjjPPUUUēqqqqqq\0yyyqlqlls滟lkk攔ssssssssss{XsʻtxOlPPPP4PPVPPUUPPqqqZZyy-y-yyyٙ888888Z8ZVVVVPjPjPjULUăUqq\q\qZZ0ZyyZZZAqqq\lO柟lO柾䐻滻lk攟ssskXss/sssX{{ss{s{ktʻt滪ll\/PPPPPPPPPPUqPP\qqZ0yyyyy--yy6ٙٙٙ 88iiiiZ00VVPPjfLUqUqUqPOU\q\0\lZZyy[8ZZZZqZ[qZqq\\llllŻOžlllsssskXss{{{{{{X滻仾ʻ侾窟lɟPPPPPPPPPPUqPPq\qqZZZ艙yyyyy-yy-y:`ٙy 888i!Z0VVVPjjjćqqUUćqU\q\00Z0ZZZ[[y[y[Z ZZZZZZii!iqqq\qqĐqqqqlllXXkkXssXs{s{{sX{{{sX滻t޾tʾts/P/P\qP\P\ĐqZ0yyyyyyy-y`y--ٙyy 8Z88ZiZ0q0wVwPUPPUULLUqqēUqqU\q\0\ZZZ[[[y[[ZZZZZZZZ!qqqU\qq\llkkXXks{{s{{{{{{X{XX侾t攟/ɟɟ/wqq\qğ\\AlZyyyyy-yy-yyyٙ-y8ZZZZZq0\VwVP44jUPUULćăUqPqqZZ0ZZZZ[[[[[[Z[ZiZiiiqqjqq\\qq\qlOl滐痪kXX{{s{s{X{{{{{{ssXX侹ttttt侻柟//qğ\qAynyyyy-yy-y-y-y--ٙٙZZ0Z00\\\q\wVw44PPPUULUăqqqqZqA!ZZZZ[ Z[!ZZi!qiq^qjjqqqqqqqqqĪlllAXXs{{{{{窟{{{{XttttOsɟ\\llqqAAѣyyyy`y`y-y-y-y-yyZZZZ00\qqqwPfjUUULqUqi![![ZZ[Z[8[ [ Z!Z!!i!!j^jjj^jqjqqqAAAAAX{{{{{,{{{{{{XXttt羾s柟s柟lĐqlAnnnnyyy66-y-y-y-yyyZZl0\\\\\P\wwPPPP4fjPPćLqqqZqqi!ZZZZ [[8Ziii!!j!j^jjqjjqqqqqqqqA90仟X{XX{{{{{,{{Xtttttt䟹s柟slĐĐAA9ynnyyyy6yy6y-y-y-yy--y艉0Z00l\\\/q\PwwwPPPPUUU||qUqiii[i!Z!!Z[Z![iiiii!i!!j3UjqjUqqqqA搗A99羻X{{,瀀矪,{{{Xstttt䬬侟Xs柟矟qĐAxynny`6yy-y-y-yy-艉000\l\\\\\/\/\w\wPwwPPPPPUUćUL|􇇓U^qqiq![ZZZ[ZiiiZ!iii!i!!!^^2jjjU^qjqqqUqqAAlA绪A瀀AA瀀,sXX侬tttt侾s{窟\qAyyѣyyyy6y6y6-y-y-yy艉000\\\\\\\/PwwwwwPwPPPUUē|􇇇􇇇^^^^qi![!ii!!Ziii!i!!!!!!!!!!ˈj^^^^3qqqZqAAA痟窪瀀,A{{sXXt䬾tt䬹sl{{痪9Aѿyyyy666yy-y-y-yyyyy0\0O\O\O/l\\wwP\P/PPfUUUL|3^jqqZ!qii!qiii!!!!^!!!!^2^jjjq3jUq^qZqAqAAA99窐|99窀,XXss乬䬾޻޹XXX总痐A(nyy666y-y-yyyy虒艒Zl\\O\OO\/\/\ww/wP//PPPPUă||2^^jiji!iiiiii!!!^!!^!!^^^j^^qUqqqAqAA9щ99AA9AX{XXsXtt侾XXXX任怿99ѣnn6y-y-y-yyyy\\O\OO/O/\P/ww/P///PPP/UfUćL*| 22^3^j^ji^ii!i!i!!!^2j^q^qjjUjqUqqAqqAѣyї99AAAA|9A9A,XXXXtXX{X999ѿy66y`y`y-yyyyq\\lOlO\O/\Pw/\P/PPPPUUUU2||2*2*22223^^!^!^!^!!!!!!!!u˲2^^jjj^jjjqAqyãÿ99AA99A9AXXXkkkXkXX䬬t䱻,Xʻ]9nJ666y6y`yyylll/OOO/\/\\/P/PPUUfććL|2*22U3^!^^!^i!^!!!!^^^2j^j^qjq^qUqAnѿѿѿ99(A|9A99A|99,XXXXXXk汹kX侬汻Xʻʿ99ѣȣnnn666666yyyyyy0llOOOOOO/Ow//PPPPUU|2|22223^q^!^!^!!!!!!^jj!j^jA([ѣnѣ9ѯ9(9A9AAAA99瀀XXXX乹kX䬱tʻ,Xʻʿn]9]n9ȣnnnnJyJ6666666yyyyylllOOOOO\OOPPPPULU|*|222^^^^^i!^!^!^^u^^^jqAAAѣnnnn999AAA(A(AA(AA{sXX Xk任ʻXX99nn9nnJJJJJ6J66666666666yyyyy0xlOOOO/\\\OOOwPPPPPUUUē􇇇2|*􈈇22^^^^!^!^!!!^^^˲u!^![[[[[ãnnnnn9ѿ9(AAAAAA((AA瀻{{XXXXXXXXkXXtsʻXXʻ]]]]9n9]nn:JJJJJ6J66666666yyyyy0x0xO?Ol/OO/PPPPPUUć|L*2􈈇 232^^2^^^^^!^!2^^!j9ѣnnnyȣ[(9AAA((9A((A,XXXsXkkXʱʻʻ9999n9nnnnnJJJJJJ`J6666666y6yyyyxl0OO/\/\wP/PPPPPUUUU|2| 2 2222^^2^22!^^!uu^^!^[[[yynnyn[[9(A(A(A9瀀XXXXkkXX䱹t䬱X,ʻ 9&]9&&&nJJJJJJ66666y6yy蒒00lOOO/l/\OO\P/4PP/PUPUă􇇓*222|222222^^^2uuu^^^Z([[[y[ãnnyy[[[[((A(AA,XXkXkXkXkXXkXXʻʿ99n9n9FnnJJJJJ66666666y`-yyyyxxx0llOOO\O/OOwPPPPwPwUUć222222222222222^!^2u˲uu!!^^i[[[[[[yynyyyy[y[[A(A((AA(A9{XXkXXXkXkXX䬱X]]&n]n9&nJJJJJ6666y66666y迒Òxx?̻lllOO\/OOO\//PPPPPUUqU|**2|2냇2|22222222322^^^^j^^Z(Z[[y[yãnyJyy[y[[[[A(A((9A{XXXssXX,,ʻʿn&]9&F&yJJJJJ6JJ666y666666yyyx0xllOl/\OO/OO\P/PP/qPqUćć2|2*2||2222222^2^^^j^!^[!(Z[[[yyyyyyyy:yy[[[[AA((|(A{XXXsX䬬䬾Xʻ9Ȼ]&&&&@JJJJJ>J66666666666``6666yyyyxlO/O\/OOO\//\//P/UqPUUU|*|22222^j^^^^ˈˈ^^!jj^j^^[!Z[[[[[ÿyyyy6y6`:[[[[[[[|[|(|A{XXXst乻,99n9]JJJ>>J666666666666`6666666yÿyxxlllOOO\\/\OOO/OO\PPPUqqć2| 222222^2^^^^^^ˈj^^^jj^q![[[[[[[([yyyyJ`:6:::y [[[[(((AA{XXX乬䱹XXX,ʻ] 9]&]]@JJJ6JJJJ6J6666666666666666yÿx?xlOOOOOOO/OO/\\\\POqPUUU*22|22222^33^^^3jj3q^qj^qqZ![Z[[[[[yyyyy6y :::[[[[[[(( (AAsXt们{ F&]]n:JJ6JJJ6`J6666666666y6ynyxx?llOO?O/O\/O/\O/\PPUq\qqqU|2*22222222323^^^j^333jjjjU3U^qjq^q[iZ![([[[[[[yyy:y:6 [[(((A(q(ĘA{sk乬䬱X, ]]n&yJJJJ66JJJ6666666666-yynxxx0llOO?OO\\O/\/l\lqqlqqUUU222|2|222222323^^3^3j3jjjjjjjjjjUjjPUjjqqiq!Z[[[[[y[[yyyy`y [[(A(q(AqĘĪsstXXX 9]yJJJ:6J66J66666666666Jy6yyyÒ0xxO0llOOOOOO/\/\\/\qqqqqqĐqqqUqqq2222|222222222323^^^2^j^jj3jj^jj^jjjjj3jjjjqii[![[[[ [[[ y:6: [((AqAqAĪl{XXXsXʻ ]yJJJJ`66666666666666Jy6ynyÒÒxxOllOOllO\\lq\qqqqqqUă2 22222223^^^q^Uj3qUqqqqj3qUjqUjjqqZ[[Z[[[[Z [[[yyy:ǭ[((ZĘqq{湾们ʻ]]&&9nnJJJJ6666J6J6666:66666y6J6yyѿÒxlxlllOOOOlx0l\O\\\\\lĐUăă22|222 22233^^3^j^UUqUqqq^ăjqqqZ![[[[[[[[[ [ [:yyǭ![AqAAğ{ttʻ]]]9nJJJJ>@J6JJ666666J666J66y6y6J`6yyyyy蒒xxlOOOll\\l0l\\\lqqqU2 |2222^^3UUUUUqqUUqUqqq!Z[[Z[![[ [ [:[:yd![qAq\{䬹tʻ]]]]99n&nnJ>J66666666666```6J6J6Jy6Jynyѿyyx0x0lOOOlllllll\\llll\\\\\\qqqqU22222 2222^^^^qUqqUqăqqqqUqiii[![[[![! [ [y[dd!Aqğl{{汬Xtʿ]]]&]&J>JJ66J666666`66`6y6J6y6yyx̻lOOOlx0lOl\llll\l\ll\qqAqAqAă2 |22􃃇^UqUUqUqqqUqUqi[[A!Zi[!   [[[yNjd+2AqXX侹欬tʬ]]]]&&&&]JJ>JJ66J66J666J6J66666y6y6y6nђÿxxllOl?00lll0lOll\l\ZqqqAq222||2|3qUqqq\ăqqqqqiZ[[[ii![  [ [ qsXk湹䬬ʬttt]]]]]&]&&]JJ:J666J666J66J66666`Jy6y6yx?lllOlOllxO?0?OlxO?Ol0ZZZqqq||qUUqqqqqqqUqUqZqi[[!  [ ߵH! qql{X侻޾tʻtt]]]]&&]&&]]JJ:66`666:J6666J``J6y6yyyyѿxx??OlOOOl?00xO0l0xO0l0xl0ZZZA 2UćqqqqqqqUqqqq!iii!  2*qAq\s{sktt䬻ttt]]]]]]]]JJJJJJJ`6`6J6666`J6666y66Jyyyyyxx滻Ol0?xOx?lxlx?0x0qqqA|||(2|||qqqUqğPqqUqqqqqq!qi[[ [ ! ߋ2 22|qqX湹ttttt]]]]nJJJJ@JJ66666J6J6J`JJ666JJJyÿyyѿ̻xxxllllll?xO0x0x00xOxxq0ZZAqA||| ||(qqqlUlqqqqii!i!!  [ 222qqqĐğ{O澹侻޾tttʬ]]]JJ@JJ:```J6J66J6:`J6y6y6JyÒyÒÿyx̻̻xlllllO0x?lxx0xxxxylllx0ZA||(|||ēUUğ\qUUqqqqqqi^i^!i!!![![!ߵ2222qqqqq\仾滻̾]&]nJ:J66``66666:6y6J6J`y6JJãÒyy迿yxxllllllllll0xxxxxyxxlZAqZA|(|(UqqqqUqqqUq^!!!!!!!![[![ߵߵ222qUq\ğػttttt]]n@JJ6:6:666J`J6Jy6J6:Jynyђ̻0lxllllO?x?xxxxxxy0x0艒qZ9qAA[|A|\\qqqğ\UĘUqq^^q^!i2!2[2[![! 22\qq\仾t澾ʻttt]]]nyJ::J:6:JJ:JJ:6J:J`J6y6y`yJJnyѿyѿxxlO0xl0xxx蒒yx艒AqAq(q(|||(ăqP\\Uqqqq^^^^!22!2!!222qğU\sʻtttt]]tnnJJy:JJ6:JJJ:JJJJJ6:6yJ6Jnѣѿѻx̻痻OOO?0x?xxx蒒yyx蒿迒AqqAA(A|q(AA\\q\qqqqUUqq^^^222i2!!i2222UUU\qs羻活t]&]nJJ`J:J@J:JJ:@J@JJ`:6J`y:yynnѣyѿx绾O?xx̻xxyxyyyyyyyyZAqq((qĘAA\\ğ\qqqqqq3^^222^^!!2!HH2222Uqqğ䗾̻ttʴtt]yJ:yJ:6:>J@:::JJ:yJyyѣѿ9xl滾l?0xxyÿђђÿѿѿAqAAAAA[qAA\Aq\\qğUUq2^^22^2!^2!!H2 22UUl湻滻tt]nynnyJJ:JJ:JJ::J:J:J:J`J:y:J:Σynђ9xxxxxxxyѿyѿѿ9AqAAAqAAqAqAq9qqAAlqqqqqqćq|22222^^!2! HHHH2222UP\滗tttt]nynyny@JJ:J::::y:6::yny:yyn[ѣ999滻xx̻xÒ9AAAAAAAAqAlAq\AAAqqqqUqUă2|222222^!^HHHHH222^qqU\lŻxʴ]nnnynnJ::::::y:`:`yyyyAAllOŻl0llxxxxѿyѿ99AAAAAqAqAqAAqZĘAqqUăUL2222222222!^!HHH 222^qUllxʴtʴ]n9nцnnFnnJ@:J@J::yy:y:y::[ãy[[[9Allk滻滻xxxx̻]ѻ9AAAqAqAqĐAAqĘĘćUUć|L2222^^^2HHH H 2^Pēqql滾?tnnnnnnFnJ:J:::::yJ:y:[[[[Z9AAl柹滻xxxxѻѿѐ9999AAAqAAqAAAēUU2L7 2눇22^3^qHHHH 22Uăql仾滾ʴt9цn9nn9:@J:@:@:@::[ZAlAAl柔s޻xxxxѻ99AAAlAAAqĘēğUULL^3^3HHHH 2^Uă\l\澻xȴ]]]9꿯nnF9:@::::::J[[[[[ZZAAAlsss̻xxx]ѿ99AAAAAZAUL||23^^32HHH  2Uğ\l旾?ttt]]]]]n9n9y@::::@[[A(AZqAlAl柔޻xx̾xtѻʻʻ]99AAA9ZqăU||***777|23qHHHH 23Uqq\ll?xtʿ]]&9n[ц9n::@@::dž[ [A(AAqAq9qlş澻̒t]ѿ99AA[Aq|****􇇃HHHH *2􃇃qğltʿ]]]]ѯѣ9nǣ:ǣ ([(AAAAĐ\Đşss滾t]]ђ9x9AAZAA|||***􇇇HHHH *2*qqqlllx]ѻ99n(A([:ǣ[ǣǭǭ(A[(\\ğ/\s侻]]ȿȿ9AAZ[[ZZ2**||2*HH  2|Uqqll0?ʿ9AA9 @((|q\/şssXk澻tʴtȻђ99AA[AA||***5**7|􇇇 2**􇓇qA\lė搻0xtʿ痯999AAH( A((Aqq///޾䗾tttʴʿ999A||2|*2* *****|*2*2qqlxʻA9A9AA9 H (( (||qğğşsŔk澾tttʴttʻѿ9ѯ99AAAAB***L􇇇 |2|qĐlxxȿ9AAA(AAA HH  ( (|qUqq\ɟ/s/湹任tnZZ(2** |􇇇B@** ||UĐll?x̻tttʿAAAAA(( ϭ H | ( (|qğqss/湝湾tʻttttttttʴtʻї9ѯA(|2* *B7*77||L****| |Ęqlllxxȴ(9A(A(((|@ ϋHH  ( || |ēqğz///Ťޝtt̴ttttttttʻȻ99[(Z2 *22  B557**7||5** ||qlllxtʴʻllA9|[|A(( @H2 (|| 􇘓qqğ//////ع滹ttttttttʴʴʴʿ9[Z([Z *22 ;5B7B77)*|||***|| ||Uqqlllxx绻绐|A|( HHHHH | | |*Uqğğɟ///ssO/޾ttttttʴttt]]9[[[[![! 2   ;BBB7777)|||**** ||qqğllxxx檗AA|||*@ @@H****|||A|ĪU/ɟ/s///ttttttttt]]A[[[[[[ 2 2 ;;;;BBBBBB557|7|||****|*|Lqlqlxx矐AA(||@|* @ @*;H;H***** |||Uēğɟ/ɟz///kŤk޹tttt ttttʴȿ[(ZZ[[[22 2 H;;;;;@@B@55)*)|)||****||Đqllxxxô任Xsl((|*|** @*@*@*;;;;***|||||ćɪ/4ɟɔ///k/k湹t tt ttʴ9xA[[[Z(![ 2 2  H;;;;;;5BBB555)5|||***| |Ęqq0\\lllxxxôѻ{ĘA(|(|**@ *@**;;;;*|@| |*|||Pf4ɟɟ///Ť改/t tt ttȿAZZ[[[![[22 HHH;;;>@BBBB;B55||||****|l\OlO?xss{sAA(| 5|***@***@@;;@*|||||L|ɟ4ɔɟ/z/k改湾t tt tttʴxA[[Z[![ 222 H;;;;>BBB5555,|)|*|**||qAq\O\xxx]澻sX|LĪA(*|*5@*@*@B@B@@;;5*|@|||(||ɟffɟ///////kkt侾 ttAZZ[![[2 2 HH;;;;;B@*55B5,B,))L*|||Lqll?xxô滾s{{A(||(*5*@*B*@B;***7||||{f////zz//k乾ttt tt[ZZ!222222 2 HH ;;;;>;;;BBB555))))*||||AqllOxxx湟柟{Ī||5|**@@@@;;**@***|||/////tt޾ ZZZZ[![!2222222HHHH;;;;>BB5B5555)))||||||ĘqllOlxxxs柟s{sĪ(|(55***܁@B;BB;;;;*5B**|(|Lɮ{z/zz///kk湬 ެttZZ!2222HHH;;;;;;;5B55B)))))||||Đğqll??xȴ̻̾?湻sss|5(|*5|@@5;@BB@;;;B;*5*5*|||||ɮzɟ//ɢzz//z k侬 t tt9AZZ[i[22 222 HH;;;;B55))))))|||L|ql\lxx̴̴x?̴sssss{(|)**5@@BB;BBBBB55***zɮ{/z/a/z/kkkX ttttʻZ[(22 H H;;;;;;;@;B5))))))||||qqq\lxxx??s攟s{(|7*܁@5BBB;;;BBBBBBB)*||Lɮɮ{/aaza/kz/k//kX ttt侻t]9[Z[22 HHHH;;;>;>;B5))))))||)Đ琻?x̴ôxx?޻sss{Ī5||5;5B5B;;;BBB@BBB5)|||ɮɮ{ɟz/zz/z/k/k k ttʻt9AZ( 2222 2 H@;;;;;;@;B;F5)5,))))||||Ī\l痻xxx?/k/szzs{|55A|5@5@B@@;;;;;B;BB5BB5(||,L,{zɮzzzz/zzzzz/kk ttAA2  H@@;;;;;;@5BB5,5))))|||{|{Żxx̴ôsŤ/ssɟɟs{s{,,555BB5BB;B@@;;;B;B55)z{zɟ//zzzkkzkzk/k A 2 222 H@@;;;;;;;;@B55B)),))||||lxxx//zɟɮs{{{)),|955B@@B;;;;;;;;;@BBBBB5|9|,|{ɟɟz/zzkzz ll 2222 HH@;;;;;;;;;BBBBBB555)5,)||||slxxkk/ɟɟs{{矪,,,555BB5@@;;;;;;;;;@@BB5A5,,{{{{sɟɟzzzzzzzzzkkk tx 22 2 HH@;;;;;;;;;@BBBB55)5)))|||||绻x̾k/k///s{s,),5555B5@@;;;;;;;;;;;BBBB555A,|{ɟ////k t t l 2222  H@;;;;;;;;;;;;BBBB55555))))netmaze-0.81+jpg0.82.orig/lib/hwall.bmp0120777000175000017500000000000006773462006022236 2texture7.bmpustar jgoerzenjgoerzennetmaze-0.81+jpg0.82.orig/lib/netmaze.seq0100600000175000017500000010277105553575227020323 0ustar jgoerzenjgoerzenSAMP5EXPLOSION 0015*oSCHUSS 002*oM-ENTSTANDEN 003M-m"LACHEN 004m"rE-TREFFER 005raG-TREFFER 006@@@@@@@@@bhgdgPP@@Y@@@@@?fmH /uuiP$2:HOYakrtsqrv|znfc_ZPF@1$  &17?IKQOPoU@:EYkwzof_`acee`XN@. %.7ACGTQS]b^WZROJGEGHGE@ABFOWi6bD( -5?RXS]bec^XVQKBB>6861.'+,,',''))+/--/,/+-/28:<;>?AEJLPWVWZ^__aaa\]_abb]\]VYTSQTOMNJIFE>:7331/*)%!#" #80 #$3@/*041/wpP?' /Wvzd;300)$-**% ?7k~pjbUF:*#  131%!#&.3:@9?GKOMHLLF@761+2(,&&.24006::;;BGEOVVYWXU^dgkkkmklquqw}svo\S@-Wu|~vp`LD4 ,3=GDEFGB14" !"()%3+.31)##  "5BOW]]\[ZOOOLJB??;CB@&x`3-+FSVaZLA995-233=7:>?SY_^gpnhlpnqbec`SUZ]ROTLMH>E8=@G4O\%67879/0.33,!'2?MZajkiia]VTOHF?9844,1)+++.069529?JC:GIGMMEGFB@?==:;7543810,(-("! % Ow+0CEg}H~kb4+ (%%#57>AQUdilqqssrge`_][OHBH6)70'@0?|4: ]u ,!-?OWaihkg```TNMECC>:9:0401,.')+)14-)22776=<>HA5;752624/*/()-5.12515332%&/?I^fiejkbc\VXKIJAD;?;694797:9567@:BBFIFIMRQMPQOMQIKMKJG@?45_x/ x4) $9@!=MipdQC@MA9!*#,/5>OWcmuqz}}ytd\[V[YTMBB075*/*-$+#.=&;g'@#)-?JQ^[gmlgnge_ZXLIH?@?B?;<7@77<:5=C@?CDEFMHKFKLONLONJMHILMNMN@:99P/pPgp?`@J?kvbTF82%&&%&-/589???>DCC=?7:55..+!+ P@Kjm`N]or]@4(  '-54?GHSRUWU]YSUNPSWM@7@=?IKC2%3Wsxx\Fk@%Gmj]MA=80(,*+,-876?@CFJGPGJRSQNMKIHEFB??:C?@<887973165..//-,+)++++0/25466799:;:9=A@<>:<614+*+12)&,+-*!( #Eo 6;33:%;Vu`egmoqbaQMAEGGSMOZ_atpyuwry\ms@3J`_P{@vphI?+4:!)(-7;<54,"# %-853<:?8:9:3" ;T_WP<&   $)C[_cZGSWPMEA:;45=;?OLWcdv{~zvlic^ZUUQMFC@850.*$" ''()&../95;<>>CEFJCEDFDMICE=?<;550?Y+/ )?DUZD.UJ@0"&36=KI[Zcgnkjriqomp`YekkzlPL@/YYepSb`RU[@O\/;:SutztpfaXQAD?<<460//,'#* $%"$'%,5132343<;@:A:=>A86887878>566475<=<5>B;?AKR[@?EOyXg_t?e`[]l[oxuiYJF0.#  (+.4;68164:44*,)!F%$ ,S$ <P ?b]WeaccZOKE80-5?;:?@BECEBEAEDG@A=?IA383/7;0)101E(".m0;`ToO`z(0h[@p@ /{pW\XzWJPnkO  G@C(;O;32_P_@7( P@_?HIQ#~#wP38G6 7HSBVfx~p^g`k`]MIG3/;=HB>C@:A:6@:;:660,446325611222030,,-(**&)))(&"#$#!$'#$+(+.&*00&/HV H _A1Gm`oj`\H<8?:CCB]HRSZdkepgsfksP[Pgnw87B'eX >r$ |P" 7@'-OJf:[oj]PX@;5$ )3;L]UfsznumxwvhcaQGOI@@-EO\XNMD<4*%&+;)!'/GKQbK{luiwlh]\TCLFE:;@:?;54,/6/+)& #+*&(!$+%//65A;EGKMPOWURUS]]]b`_^bdgba_`__`ZXYWQQIKLIC?8=JJKNLD<>701.1 ?ED@@?FFEJED;;2?3;1493/632-+*-,56141:;B=AIMPMSKWXTSXSSQOPRQKKJFIEFC@E@AA;99=>C86<<<6;ObXKN0GnRGVQWmnQJKRYPZZEV`VTQJDEJ@9ID=4;$/'8 #(1?X ?T9;1/LO^D/L3)52GQGX49_mDG[F_~D/nTGxoG@EC%kWd( $GxcW\`Wf`SXeRQ@9/90"'#%2(*95?LMONVQ^Zc\dab[U\XYYUTROLKLJ6#=ZioeVJ6 %,7=COQRVRXUOWYUV@74+o^8'0/JCNSSX05[k}zrc[SNICCBEADKLKOMKPJB?JG<;N[J"MH0 +&'-7%?[P %7E[jojsqjg\UPMFFGAOMO4%!/#9< ''=G>OF?NHCOL=^gHAK@;\VA_T%';2/_p,+D0ST@CB**2  %+'&72CKOPSXSLA[`7Ugy|tlbYMB8.(!!*)37;>EIV]\[UPIBFCEEMMOWSQLEJCB=?9A=09-/1,'$$)(.2159;=CGMMNMRVZ]chdeilkiifdb`a\[VRMH@@;;674100'$($ " '*5(',7e@ +Y@9GOkrP]Yb{v`$-?YemndladgY\TVYTT7gd;_`g ?GPg|0(MAud@-2KFCU?vT/G8$$9A:2;A?HCGRHQVUGSJKE8183ANH8$*#/6(-14*0"%3;;<0-+=@;(&9>@&+=U@6'GjL'>+C[X;@3?(/gXk{yobTLNDBCCKMU[aY\aa^TVRRTNDBC@B<;6477/+1651745975689;6:A87EF@CS8,?C5GS2.()7MLSWRSD51-$*-32&:;7?@?GAG=B?79;@;89;>AA=?47>FU^h07MFKhF@%?\fd_$_pMop WmH#6C_^gurmi\VLLD:1+).3,+/6769@?>FEL@<>G>C8?@4/,-5=(&.E3$9&&#@GJ6;H?0/MnU@+M ?E0?d@D7@OE[h/07f@[Xw@Ox@/ 7a8+W(?X_7[_x%;,/ Oh/pL g0/H8_{x7AHGM,/uP ?Go`oXgP/yT]L<]:P3&_p2Gf5}0 $+//F;|XGX 'oH L_`7D?NWHmP_pYTKK]_T[PHLRFH?@?<9=AB:994B3622==B;CF=K8,.3.74@B:*+4M@ #.;8'<=OhOcPGd@4Nub`]ZGXRD@GPHACLNURCJTIjjgOGI7GG1G[VgW!O??(Oe@7( ,~@<?0K(C  ?i]@ CySIC.K=TRRtX@Nfa^_KA]mZO63@.E"NJK2J%4<%4lA4Ue?]?ol&)+-Jl)fGThnhp@?Nr]="\mJr]N@"1-\r6@!U@\eNxxTpG6A1mpZ@?N-#<'?X18< #2M\  #+ ]TMw2'Mvip iM[akWQZ>W[hZXU`MVIL[^O75/=?9)@34D#4=>BGGRGH=C;9PXDWR0WBCRO]TN81)K4SSLS^8GYKNNG>HG@CRQSJ;LNJ?K7RRQ<78E=TTCKFK57/'$'J8O$$2+PC.%$.$'Q0[WWZU[MF,%2@%F32SAJZZZOFF@9NH@H5IDDHBY33:J2VPJHC88H5C3BH<'.6;*7+JE-.,AOD5GUQ782KLF<:?<;C>=?;=9?8839@HC6ABCB?4;EEE<99=;@J@A:B@DLDB;CKIFG5=@@;APOJBB?N@C=@BGCB?KE??>?@=H@@@@@@@@@@@@@@@@=CA:?8'&(,==CNPJ65>>:HMI@9-&&)+%)1* )$!?I4.8TTBB4  '+)4;/07JUKVP>@LID);A:5' CH2!;G%;?/>((%51 0O:1(%9D>2LBRXN "C>7?:)3/+00@;F@3NB+GN8"9+5CUD7E8!#:+!M478LL( %$+".2FD8;BR5,%C<9+HT76TTN $KYARUK921 "3,FS\O@,.0>!$_X/&Dc7)93$/-6MYHEN?12BH=JP5$-?TJ. ..#1B#*A@T91$RUS6.97)=3*")I@,. "(?F! !>)K_N&$E2>I8!5:!;UV0;L=5?=44+"+.0-8@(-77>EBCKTA8@O7%)/&=A5+*&7E-%- M\Z283.(3:@#@O$489KI+>:5I?++EEB:3*!$LE@E@.REI5F46?D6:TV2." %'1!(+?XQ<.9A41/DH)4+9H8C40<9<,2LV-" /.B[<;F?=B-+ +'*9!84DSO03;9S`?1FIIG?!21,/ 4EDB**53;\H$(BI.1(!/0"+.1;KXcK&$74709UKNM5$ 955 '';FB'#'*)D:H;+A\R4%10;*0LO0)',?KOK6-D4:3*-:"+)/1/( .AA/+AJAD@0267!&)*</]`LND3./6=2C?/?4 8'9@;+,7B91+A@D6.-*AUG9DPKII4953<24.-,&#!.=''?K248%66<<@"8>G`V3"I612OL?6=A/1$'+!("-@H>:-8G)#%36:9P::,6?4BRF'")'><%'@GCACLVA0%&38,7JJ930/(*&(476MB.+.' )2CD:==4B4)3&))7*7N:.2;46R]D#-*%IJB;(# 7G9(4IK[V20+-<;6?4#++.37=<1,/.83;B=2'3D726'!"?B0#)/C@-." (G]FPVRA/.(.+%):3$+,2IPK@2+(;CE6(-*7=$,73%,6.=G6>470;2*$;<9;BCF=:;K>4849/08@HI13:1,0ACEVQB+!&036951DL;3:>:0/6/$(DJ6<;",)'!077@OB881=D:::@2.9>61+&1;5*&$'1;II>3+1,%',1+0*4DB:A;CB&04),:>/'5>/#"*3=HBGIE@5(/211(,5* 3;752+1)*./#3QTC?AFAHF*'EN?58,*6LOC5,'$*7-(1&*,(&$!%)6OS>.1<:CDA6,('0GN0$(-9<8986B>@FML6",).76(#'9FGE/#**.6;9) :PUL7'*".985645GNTI- -4.-1/.157;+#/?G;.-$5T`P5*!'(%.:3&%((4???77/))-53;DA<=D>)!+41(++"##.EWF11+,)/6:6'*;7>EKN<8. #-8@81.6;.%5>3.,#'"%9FJI5*330:C;,,.7<19L[U:2+,;;2'&,;<831+# $'+.=:2.3>MN<54*#',39<:32=GE6& +,+8DE>77970----*,18<54@A;0*%"+895:<999CKC2!)335;6-%*5830:B>7318>=625.+251..6:=A?<7<;-$0BD;:9,(/;B:/,13+'3==6/0+##*.//0;IJC:7873-&##(-/+*/2148;AD=:759>ADD?4+$!+159525;>@@CB6)$*3346784,-32'#(3AOPIA5,)&"!&-7A=9>B>953650.($$'+.18930/358869?A<67=;61-.--12.('/:>;301/37850)&,5:>?@@95.$$-4982362*$"#&5DA6.**1:621-))'%$(4>;3.($%+3:?;564,&$&/6:;9635:<=5*''('&),1:?A?<:8532+" &/9?<4*$"&,14420159@FFHE>4% &-589=AABGHA6-(((''++('(+/137<=;6348?EGB;50*'+36774/)&$'087/*&'*.4:;<>;;:757:855521242-*)))(*2:>>;626930+$!#)15666563.$"'+.13323676662,)*/37989889865640036:;:8656520462,'#""(0355641-.36766;ACA>=;::9620.*&%*06:<=<;:840+()/4579:941/.,-/39:74332268545310149<<<:6/,+)(()*,,**+/451.+*-28>@>=;745400342/13469=<9755310.-+'&'*,/12455569;:8742244312337:=>97:@B@:410--.-+)(*/1114851//112221--+),.158=@A@;99766530/-,-+)*+09<:873/0255/++*')/1/14447;:9<=<:77768854221../14567751331000442320/1112330.034227;<;61.-..0369:962243341/136665323221232.0685117961../.0345568766993//2787896331+&&'(&&%'.0,/49:8665339:52378569;:7898422234333554120.000.-0686663-,-0.().346:??==?A@<<=;64332+-111,**%%').320.23//00..288997<==<9875/--/.+,/-*('*+-489764351/21-),/1689<<89<<966686349302388622531442246476430,((*.26>B;4774/-+++*(+13599<>95542/0234255369753/33/-+.0-0/++**-++03;=<=>=:9::9543.-.2352/24320.152041..22/00-+*+1359;9:<:9977650320133147756;<;852/-342/143-*,+/02764644677883.0651344777523302787333112.,(*-,-0025323023253/144316867860068621388:62541103.-0/,.1./476357997872321//334457547765889788655240,,.2-+-.-/1351013662/241052-2544338;811320/3896598;<89;7652/.0-++,&(11.-//.31.--166963783167458<98:77:41/++135961151+(19;5//,0340.6326:3/39749?<7:97;743885132*(.21*&-2/*)/3513784-,153598437:81588;51363.-/,++23-/366583674/10/,+**/33589777<97:>=678:762212/0//0223.1*.+&&12.)354585/37889A;15>=;987796201'*/3..387751--,247352/.//02,+045456;77:7:986238,+42,16<5.20.0+)(////36/)/785=83047;6:97677:865/,0-*,00,+574434368874217731.0135982345878469221362-.(+,**10347<<89510563+,,.0696582025443:742476<=7464.)*2,/@???????????@@@@U @@QW6474<2C/838H?@HU0FHO8'O47?H?$D2h ?gT$?8)O7(/6?@?M&K:3@"? R/(/CG@/L:O07@=B=+DNF?T(P,?*? <@ I8P8WB9H*M/T;0-7<0?R8KJ;@ O P3"3<J6?P4OH3@ K B7(/8Q@?T7R874#? @?$/DDH?R2D6?8?&#@@G@O@?P.D'K(G0 8#L@7H,W@-H+O""L-$4C@;L*J,G@)R /073,;L$SJ7L)K(#T@>!?@<'N/D=@?@74< ?? G,\3L3G!B0+,'8'@?-K0I0C@8'F)B3@;D7@/0? 9(7$G.M7L.N(<4:7A$B@%=D2"%@C,$;E@)&KM8)+ED1+H /@:3+FEA*!7G@&=B)"3DA(#=A!G@*+BH+";C80/F:' ;H8'+CFE1+O'5FB,'CD,$3E@()EH*-AN*'8>D@%'6@&7@4*'A@(#?L@)>A3,K%'>>7+C@,$/LB, ;?403D4&"?D%C0%%?A*#5?::/F8)#7J@(?C-'G#'A@7)EF0%/QI.)CI8%-CFE+&>C(D@'%=A*#/@@ 7?@&+AC("/?:'>(&/>@"+8"&7=#('1?@-(/BD7H$1+FD/(?"'AD,&5<CB*#A;@/M(-?C:(#:$;H49#K@/D<01FEFE03@1-@E0'3-28M0-*E@/D-&-?@3+4//DB*'@03B9*(E:<7@&%@?,,3$-:F**/=$DC-)?AA-C0*7@?0#?,-J:/ ?:@@'*9C0=8*'?A5(/@/C@2!/?@5F0'3C@/?(07G80*=&>C:''9>(?5&-A@-*?!-$H8-J%#:!:@2FEB';0&+0-B0?C6;0)/0=0;FE85@(2@"93/9(DG9?@-/(+5$==9?F,<0%-02FEB/@278&+4(;7'?B3=*'=5>@H8?0,?(/:(@@0;:1;((<.3<<78,?,+:2/?>/;4?8#+@'?93A@:@*'?$/4#?D4E2)?%+8'7C0?=+C-%;07?8?C.72(/4+843@4;9(I+*@%7,1:)@47B,?87@/>'%D#5,3<'A4;@4B2?8+G%'8+8%767=)=@2@/?-+@*3(-0.8,?<+H2?>1D./4(9(30/:(@B/>.C06@'7%+:,8)7<'F@;A1@,70*;&,6+=$3@3?87@+=.(<);)58'@85@0@3;4+?)'8%;(69/@4?:7<4?0(>'/8&=)?77?/@/=-?(70-8-D);)3(&:':*5(/0/0)9,>'?)>4;8/;(@2?97C2@1D3>6785:2@1?-=./0.@$?(/%/4-4-6+7.<07638/<&A0?@7<-?0F6?4796>3A1B,?-7,38,@,;'22,8(7&70603.38/<.;0@4?@+@*@8=8;<1@1C-?,?074.@+C-;0-0)<'<*/*+8-4+9,6,=0;6/=)@0><7C.B2?<;:3=2>4?69344707,/0/0=,;4>2;0:(:(:.;0?/A/@*<+4/./4/8?4?490=(:+4*:/?2@7:3>+4605.30;0?5?4?*9+4':+<3854=5;35*:+9)?1A3<7:12<..9=://@-;=8(-:>1.3><0)7:002<7,*9<0?8--??2,/962-<;,*3FE>/*;<0,7,5>@-)7;/-:>8&+8>0-7:0=5+*;>4./;:2.<>1-3;:/+9:0.7,/<=0.7<2-/;<0,5;861<<1.7@8?>1/;=2.3<;++7;4-/::/0=?5-60/<>0*3;=//:<0/;>;,-:<2/3;:5?209?:0-<=0.7;7//9;0-7<:0/<,7:6--9=4.3::/,7;54/807=<-3=<498.26A4./8+784./8:/>40/;=2=5-/?=0.40/8:0.7;47?-.7=80?1+=881+;(9;802<93B02+:92.>-09@/2/;*?91-5<@64:04+?92)70299/.4987A1-6992?/-95:)/7,7:6//::,?20-=:01C//;73,:0/9>205:>4;3-1?80/<-7<36(>5/8<.-9:229/-6<:.+8.5?=0/890B=0=02723=57;6990/<-36*<<4?2,9*1:+;<6;82?-/7,4;6:82=,.60596:;170034155;<4;4138/945:85<228054/;<2<42@234.:;.;62@0,7,6<0?:1A-+:-3:0<>1?4/9037-9;497-;-/5,5;839/70270/?;7=5721181867>678,.<,78/8<5<10>3320<90:24:/.6/79-:7490-70680<93;41740965:8781.>/44780::1:2641?/18.7134/84780?4692<4>/<-4:13-/6.:0=;2=67:3B134/30341:0=<1>5=82<.50.7-3169.<95<6;03005/.4-4,::.=87:7=/7007/.4.8.<8/86;85:260/;+503:-=:3:0=4;4/;-.:08078+<6781=08019-/516-<5594;6681;.1;*34/9086-;97;0:074383;57034.;/40/8,9+80425858/8-:0;77=-<0:8=75:281;.;293382<17151.3@4<2:18/63236789284729.4/829/?3:6:38/152321852;3<1:08-5.60:3876492671805070<4=2808-43518547474:2904/7390=5867583471514472<4:2806/806/838769874708/91:1<495:18/8305314;1=282:-6/806/<58787534907/60;.=5:3918/6/4/83474;864808/9090=2<5:2:07/6/5/7840279126767:23765138:20685029:3158643818943598108:4018811770/1;837/06;510890.4892288113862080785239:22:;62089126:51388/:6355813:;2,48:22782179701:19981299217>843992389211991;013;810573037811784239832:13973288015;630782137801672971178414881/6841250769318829:134962;1237603417943189288317902;/18:2062/78025886:4379623:07882/72597/28835411971236298227957904595191258800616;632780<464;731<14::12461:7426:83<2066751827771/81575118857521:84.80289236829<054;67;3478922524:6128577:.3396/8,0394108/77.89195470482;:857139036/97/8458/26086.9458028059,762<5/7043.782:238/281:92<43;11835749957-0524:35:5763483787844:40:07338839338065578184382252870966<249.68.;938417057.8669327016.864832902705686939./53288784:43543937:563136375/983824=357/8;5753:22417038284990:55629118-6034274962<375392241513437378174743<2582707437286291:268334/8/72670;86839238172343:2:71<8751913817034354:70:2945932435034651982<293384345518168.962:4;33836036272891847868432/503628178/83;47736116/6257-76/8674583461405457/817578/948879284828474683918352365805012261527063343538/918578/91:5:658482858364543919170421919142443436463808676/81;5;56837394847457382:261344927051462526363643638/9198885918594965858393835234382704226072514445343536585582:4:9381:484784658274745272715373937482:.6/617183475645270628190:5838/416333552;4:140806/5383854784654616372:3;492:0534564464749480905283:3858481551527271<3:470815362738545564:0606083;38565852706462739482:/73435386466567380615292:58562513745444727374718152527195849434773356444884354377326654466326852366336646523662356722774257633874554387346743278333653355335855743784448634772248732564335366345763487333664487335883822676337526676236622766237287544883276323672367332781822366348742577247552266225447733666338965;33977327279841775563376337/45845361866354:184335622732870567078045:4783546833344963367/842245148436622635572558638435562644375446567622693584458327447723474772275:391355935335683367478455853;22664156/9725367172157734825854437357146481751467174390485486571883444773747534637816876137164/9836247433194295572353551855:157386487384350350851844323549646555426458646374355588282684263650865613526608627337246187386492461674:639028368698373344384;6374236384765761483544872844;13718839747333345086384743834037255570950648457262460744509437072454703606154086674616237136362661746457180382725436477372644:1482616455496284934:2544627486276562933626255554882;484486433536477286584:16436246382772747558364281534618458185653723626538266384364839354384706447371644446281827476380957545363736474653738371341847141563536252546435272857838284:675384736264553837262664816253554646353648556274975628384746456663728174482926255582717254445827274765608485743837371726458382603837152453824353544528372:48584717354657447365647064627384648164274636272:363808344538447354717062728385636165253646284737281635385654757472827373848473534746354839382816353647547454647363527495647283464567473737371544384664646463626473736463817343655547446665362544774476533774457634654564576235644476335664366226456614675346623575347633665384376445653475434763366445636745567346744556346644566572556445562456534663456434636643567346443586226544576372466744764356524663556533536553466435663477335663467556235644566466448662544675456357454773732466345246624542863465448236653463664436518634663564566244637625566382546647535763464766457647634664545367445537635566383356534635654467375266755934664546275444664835577247356534645653455548254653472566446525623644663745744546738637226456375573473451554753623547545636445446555154354266364563363563653833546637638557346466786583675676875754776877767766847798868578676799696786687975977:68:6886;88:6797896:97:77:78:6998:97:78:7999::7;88998;98;99;88:8;98;:8;9::9:99;9;::;:;;9<9;::<:;::;:;;;;:<;:<:=:;<:;;;<;;:<;:<;<;;=;<;;<;<;;<:==;=<=<<<;<<<=;=<==<==<=<=<==<=<===><=><>==>=>====>=>>=>=>>=>>>>>>>>>>>>>>>>>?>>?>?>??>?>??>?????????????????????????@@@@@@@@@@@@@/GQQ%.=?8Z. ZW&7i $A{P@j &{PIrYq7a}9i.YO>G%RY.?H^0%AE0&Hi9& t`6R=&( PQ 'd/X HV/QVh/`O/kFYQOQ2/GPp S{@QcYg")?[s$?w`/?:J??XW?_VQ!??$?yDr^O%@I`ai?,5`G j/sSP'z>.Mb $LWCbRY/[{T"{rw{#y{q?1`g6h aZq,_Ve`=O/q`?@QGX [E NX@j%6.8`%9@sN0G.77?X'Q7@7H=@.6a%P7&/h%A6P?/,/@ Yi.R%7Eh/?-Y-Pa@$i7GP/-5HZ???` .- Z6GA`($9.QXX?`?XWi/{Y//G.is-G 9G67PaG776>6cX/-&'.i?>&$bhi />9W!OH(`Q&GH&6@YUh%> z8H4Y@j%aW78hP8a6P ?aFr`&/YiXQ$'`Z=Q/N@a$Fr$??Y+b@T/6RXb&&YPH6F.H-(zH?a/G76B>7/Q{.@X@P@.F8Yb=/&>.J`@a?%ZWHr$aj_QQ%Y8?7H.A? A{X-'{c$!OPHiYb `z{c^\QztZapz \rj jY hszkePYUC k$d{is"8  p?rhgxn6[oSm8&?W?.?4.b,'0NP//@&8@'=Q/%@YE7jG&&JFF&@hq G`??1>@> z7Y Z, y`H-W/<'Y/?aA&{[WOi&HX-k(4!P=?/7q7Y Q/F/j@=7@HO.?FA6?Y76/Q5N8x6IF8hi-RQaY-`>7r>7.G%6I_8A_.GPIh@ .6AN'H=G'&0NQ'@ AG?%.PF 0=H>&Y&P HP&R8$(G6'QA5X5R4i?Y.`7.8?O(r@FRh$ sz%z$R@z @ N&s?&XY?tz$| Y0qp {9{dO qZcx Yh q=k ???<M>:?C=/??8??h0&iI-Q%&H-QGH&P5/O6@./H.67G7 A`X7-76/GQ,8-@P>7a7..H??H&.6'P>/@G@6&a'r 0>(P6'Y7>j57P%/?%?@%G@N0G?P>8HG%Q5'N&H6X?%QI67i&OAG7&5>IY/5'@`.G?>/@O/7H`%..?A%Y.XG?.@>AO/@7>'H HX'P5&@-Y67>?>Q7Y,I?G6@G.GH,/OQ6?P%@O8X/?Y OH?F'O &i.6HE'%G/PIX>6. 9?H7qO%&7GIX./P>/7.Y>0O/P.jF/`'8XAh/HP//6&a%z '=H.$kUY.1=($OHAr `[Iosvh2ns[T1{ j7t{ P{ Aj?f`Y{=|m7vY{,_F-?_ ?L"4?_ ODY@-??T>C=?E<;G?g9?u@8G/??{?O??]_F??9B???:F@Q:>d"shC/>?i/Q+ojs{E;B sQ?air_r3r{ {{{{rR mXuwrq7+$!V9P$X>ls 'j{5G%14F/77/G8>'@H&?/Y?6P$H6/.6.G&H&/7&G?/7?/.77?.H>'?.77.?G.7.&P7??7.7&/6&?Q-777??@77@-/G7?/676.??/P?H.H6`7.?&./7?7H6/G&/G%H7G&?&/O7/767H??@P/7/&H?XG76> P??H5.@%HX7H&@FQ?/86?>H7G7..?68G?76.76@7PG&?7&/H&I>GGH>/P%'G?P6H6H%@P%IXQ8777?G@-H.GHP&Q>7X /X.QP 8>/&?@?G.8%G&&?O&.?.6$HG/7G7%8X7/?0/@//P7/F7/INi7?'aXC,?.OA.rYlYsRj@ 7-{ I${x;v|P z{La abasa b5"b 9b%Z- k Zkbk :ksr> ?Wh0`/?,n*_/?Y$ =^??}'O1?>o9CL9?W<A?I??B<c-8\a??aO?/A$DLt{so sIR{Z{H,h{st7{%Qr r{co {NswysGHXrEj&&b&Xy&qz@PPHQ ?/F87H&G.7G.?.?.777?/7?777.??.7@&7H&@?&7?&?7&H.7/P&7/&??>7/@?&7..H>&H?&?..@>/??7?..G.?77?/77777/@?..7//G/?77.7?.?/777/77/G?7/..H>HG77.P7@PP??%H@.@.7@P&P.'H-@HG??&?7?P.&H> @F/H-P>Q>'P>P6X6P6'X5 H>P6'P>I6P?'XF@.YG@WHG P&/YOiO7Q?A7667P/jh?//%N`6.$ZYM{WC^b  MVA  {-4kh pY 7Y8 j]/``7t IzBHXfiP%c~@ 8?"`D74G (} IU/?kz?tU#h:C6/MpH'jqHa ? v.W l'?)JM?GSTG}r.-m|asD"ZMkT"*5yO1nrWg7les7z7Jm O6%Yi8z{.q{.{{7{[G/{Lr{y(6{{xj{a77{{W;[+8>RK(hg(GGX%`H$Q>7H-I.I'Q,7.??>?.??7?7.?&>.?/6?.77?777.G.&?7??.7H6&@.7.@?.7?777?&H?.7?676./H//7H.7..7H./H6'?.7?./P./?./H&7H&7G&??./P..G&7?&7H6/H&.G&/H6/?6.H/H7?P&H.&H6./H??%/G7&H6.@??67?G7P%7QF @?8`8Q6H?P>&HH?&?677>..@GH?IO&Y??&8a 9aW 6I?%8a5QX_X&/>>XbLXIG zH s?&%j5rBr$t=dR=|zET:`*r%y|!4I6rSdR*\ j B>rqE0z0768r=\?qIY^xAG7H?SD;?g~=>?7\3GB8{ eB3l/4LUq >?nS%i0o_B61w){ j[;2%Qs+|IzsM{P32;Sp{:h{{[I%^YX{]k{Q7F8sk#9po686Qg{p'-jY.?76?FWG./P.7H&@.?7?.77/G.7??/7?7G7.?/6/?7??7/7?.7?7?7/7?.7G'??/7?.7?7?7/G7.777777??.77.7?7@?.7?.7?6??.77&8@6787777&7.??77?.7?/7?/??/H7.77./P6/H7&?G&8O.7?./H6.7?.?777?667P.'P7/H%'H?&PG.?'6@G@F..P7>r8=G?0&ab?-Q6&P? YX>s$8G-?@/8a J.G/G.G&@a5y. Z5/@./iz>.O06Q` rQO'-9H^ 7H jaYr G/ieRw'AcSq->iN'a ?1-Z:]2Z P8oZK/GR\;k95 i%/AijF6Rx@:{-sG/P`S-a8ibqFol67!Pb{o;[,07/?as! wxP6/P8[b;W^0??7G8r` DJ$H'>A>8h{W?P&H&PH/?A[$@.?8>@>77??H.GX&?7%Q%H778>7G%8G.P.77.G777777?? Y&6'O/?7&G76H7?H5_/Y5'?6/G7??'P,VIY/67Y-7@?H ShW77/Q>YGcF W&?7P.IO,:+IP&@7%@6HP[N(P? YX0i)N&'`G.5R#BE4a P?6(#Z6q|Xib@ IHN{%TUyPk _Y&Ws[E,)667GP4\25XQ-7>A Y.$? XAzM;FJ5K_}\zb<\El /Y:*N)s,A?|-RMk$Rb]HzHY<"{{,e O{U;S'?5A,JP-Yw!D!`.QVq!CKq(WO7z[=/0_{6 @@G/jZb5zH/G/HaeJ` @@pr'Q? iWAqQG7O`05l2'q `%A=P0S_&%g >b_GZYo6ZGP`p9xO2WZ_ora'G'Q6? {Q%0F.Hqb ?GXJ$@>Ha@+,v/gZiP.Yq a0p 6@FSgEe=Zai7X%/Xti)N97r'tQ7b01x|?/{I= rz/G?Gp0QOxX/DT`&j5{&Vx0 'qG9%j?i6G q87W ?&PaH {:f0,[5 ?Ik=(,*oR?_7/HG i& f({?>6bVp qWa&GN p8IM=JiH&F'6H7@78Qhf(QYMa aGk%7GP8VQ,&AWz,M24;:-O(N15O8q{%k ?RG.85'GX8x 4<q6@GA<nWjY>/ i77X'@O WIP#^>[5/@Gq`8GbpqbjRD(&H@A_P-A &8_r7H/I> I4B6H/HWqq'WP`J5H'hGibrPY *]9j6QanE[M'a< iFQ>AFP(OPQzHi&RV{31?OQ6? tf_8H [,BY&HIP#GI6Q B<'z7&X7i m5Z@D2BZGGP/5H;UH,O@?.8>@H@ s+Z&P#I ` Y69`6Ha ip W(^'P.?P68 R5HH=p >A%'a&PP/`i !e-iP@X6a@O z$3e7`7P.X.@G@?G.8$[+b >.HP&6?.P&QP?aO.WO/.G6/F/G?7YF8SG/>?&>77.8G?%@W/PqO/677'GHNaQ7P7`P&`QG.&?6X/7@H6..h77X@Ni-A=/>H/YG?8?@7@.@>/667X/Q>'?'6/7P@6.@O/P@O%8O7/O.&P8G7?87H&H5HP&H6H.H>%@7GG%/P76/>'G/??%@>`'5'G7G@.@G6?&?6P'HP7@-??G8??.&@@6'H%I-P?.H%HP7G@&X&@G/X?H@GP>7.H&HG-XG@&HO?G7?@?@>&H7?P.?H%'H7X/67G6H>?H.@X%8-@.G7@G&7H76H&?H%'G/6@6@H67>?H6/@$/G/GH7G/O%?6?8G76H0>7.@H/?>Y/G@6-'H7??67H/@G&@?/F@6P&P8-HG&H/7&/G?.Y-7W'6H'GG.7?7%8W?HG8F77?H-@?6H%/G@7G@66@G&H-7H68GH.??%H8F76.8?G//???&H>./O'>@.@OG7.P6@H6'6O87G?.G/678?H77?@/O6?G78>/67.@67?7P@G./G&@?.?H%@6H?7@GH.?7?6@>7/6@7@/7??7&H.?@?/./H??'?7??68H6'H?7Q67@'H787H.?677.H6/??77?7?6&G.7?G?P.67./G/?7?767P67HG77G7??67?./?@67&@?/6@77??7?&7H6/?7?G.7/77?.7?.H?7&@&H?/776@>.?6@?7.?77?H?7.?.??7GG.?7&7?.@?.?77G67H?76G.@?77G&??.?7.H6/6777?7?P&H76/?/H?.?/.77.@P&@76H76@?.?&G77.?H677677.@H?767.?7/G?.?7/?76@?.?777777@7/>.7?78G.?6.@77@.@676?7??P.?7>77/?77O&?/?7?G.?77?77?77G77?/6?H.?.??7.?7?7??/?7.?G.G7/?77?77?@?&777H?/677?6@?7767G.77.H6/>?7H6@767?7G6777G6?/G7?777?77/??77??.?76G./H77?77777G7G/?767@7?777777777@G.777??77777>??7?/G?.77/G7/?77H7777?77O67777?77?77.77777/??777777776.7?77777777G.?77.77@6?.7777?77?7?67?77777777G7@7?/?/?777?/?777?7777?77G77777777777.77777?7777777777.7?777/?77777?77?.77?6?./?77?77?7777?77777.77?777777/?77?7/?77?77777767?7777777/@77777777?7777777/7777?7?7/?77777?7/G7777777/?7777?77.77777777.7777777?777777;;;;;D;;;;;;;;;;;<;;;;3D;;;;;;;<;;;;;;;;3;;;;;;C;;;;;;;;;;3C;;;;;;;;;;;;;C;;3;;;;;;;;;;;;;\iklkdbi@@@J@@@.@@@@@@@DX9A@@@@@`ggg@@@birqwyrrrP{tztPhbicbajPigjgbPsywvPizwit}rPdwrzyzytryWPPTZX\TP\Z[VXYXXad`g@@@B@@@Bagbl@@B /U8_@op@_j@ ?^@"+M@,78*'(*)#!+0, ?{p4/?wd0'?kd(7[t@?gz`( #KgqX( ;S]X8 ?MPD05FEHB8$#1;?>80&"#7_z}t`@ #?cuvlX8 7Wotl\H07Wksk^J8!;Wkrl`P@,!3IY__VJ@4*"!)3?HMMHD>82.+)()-157:;;:::;:9986424=K_o{|qbPD90*(-7EUbmqph`TH@50($$'.7CQ]eijha\RI@91,($!!#%+3;CKU]acca^YTMH@:62.*(&%###$%(*-147:>ACFFHHIIHHFDCB@?><;::987666554555555555666667788888899:99;=?CGKPSX[_beghiiihfda^ZQMJHC@=:8520-+*((('()*,-0358;=?BFEHIKMNPRSTTTUUVUUUTTTSRQPPPNNLKKJIHHFFEDCA@@?>=<;:::988/BUF8,?_O@(?oopX@(;_djU@, &?N^O@1"+;840+&$"##-7K_mz{}xtj`P@0 "#1?QcluuvqlbXH8, *7GWcoqtpld\RH<0%*7GWakosokd^TJA8,!-;IWaknrolf`XPH@6,%!*3>IQY\___ZVPJFE@:4/*&"  !%).39?DHJMMMJHFDA>;8520.,+*)(())+-/135679:;;;;;:::::;;;::99998765432349=DKU_gou{}}|vqibYPJD>940-*)(+-27>EMU\bgmoqpplhd`ZTNHD@:520,(&$$d%'+.37=CJQW]aegiijihda^\WRMID@=951/,*(&$#!!!"#$%(+/37;?CGKPUY]_abcccba`^[YVTPMJHD@=:86420.,*)('&%%$######$%%'()*,-/134679:<>@ABCDFFFGHHHHIIIHHHHGFEDDCBBA@@??>=<<;;:::998877666666655554555555555555555555666666666677777888888888889999:::999:;<=>?ACEGIKMPQSVXZ[]_abdefgghhiiiiihhgfedba_^\ZUQOMKJIHECA@?=<:98653210.-,+**)(((((('((())*+,--/01345689;<=>?@BCFEFHHIJKLMMNOPQRRSSTTTTTUUUUUVUUUUUUUTTTTTSSR?@@@@@@U@RW7T@'@/BW.XL+/DL8@O"F!A@ K/@O[(V@"KL^;?1%oH,@7'/@'*8#P'UP0/8 ??X(X@,/?1?UF57?R3O((B/WX98G@"A-F-$3I\0;+34P6 T<:?"< $02K78 0>//L'2@%_L/4K6/3-?34/,O+@(%W,Pe+/(/O?3V'H?<@7?7H2,+7#D8@=\/?7/F&G30O?@/+30+@X6??/>FDVK*H0TGE 5H@C?9 @/7F O?HX((HX(0'GUN+?@ MV:.)6-W0'P?K:+H0G7;(k4H05?K.O(-:O?S0.!/7<<=0`B82,7;8.!?,'P5/G 718U@2I041PcB#@0=0P[C X46*6*L5GOS>O<9/C(?I@S5+<,,-/82M:-8 @2$1?-0%2;X8-*'??B%09hL93+ ?8?ND:.";,#( *@003,3RC$XHJ4 B+O@W:* 8#2D,@F4@P@//'$/;&;@@@T?,03?OQ 7E0"2+&"?56Y;@[D@0'??;$_U#F+/?+@7(1#/HH7+3PG/+77G'/;D?0/8 D.8^037#SS52F@?9%('$@;DD?T/D.$870=4G)@;&<'`N*I5'83"O07#4L,7#@/0 :7&!A'@+@K0?8K7B;4G+4B30?0<-D@K*@)0!$H.;/4A%7#=DD72$0D 00-4?0$@7-0/0/7 710/,8W?7F1;=?/0?/(?@74+"$P%C@Z?4T5;B'$2)+' @()H0(<77=H436235:03/,E>>?94;,;C';(65$2'P239):E/?1G8F.9*:36FB;G2B#<.?/@3F>075? +2+H/;+G05?-4*f87+A2:(7+9:/A476?@7?7D3'8*8%9-?/K8>1=-8: 962$K2!*@42213> 0?@ 8$/0+4'/?+! @K/@@07 /77-(@?D6*8?6+;?7+@?3(@;-04'/'0874)@@@HD7,/:)32=>7&E'1@8/0(??/,28?+B7?824:4'@/1@0@,92)6(2L3<93186)2()507A3<5),?:)937B-3@186,88+:84A8;@/76 ,88'5837.38-?:28TH7A834,9:0C<;6@;1=03@,-4+*'+&408D89:-80*,';)7/-996>63;/)@>+@<<=33;30,,/9:0(&95(28439I<329=7;?5.8@87:@>=98/#0,04+/73031/75<7284;CB4;@8@&77(8(((6$(04/1034B5,*0<1<1=777570!4'?+-7/-08@+?/7175&49?8?*>88?/'D?/'':?'042<7;4;G+88D/-/?7 /?7500030<87A1;/+<=/0528@5+7?0>;=8+72:17.4%/7=46@@38-5+4 1;A.3/@5482<'3.182;3B9C8@./=28/;25-=0(('?4-20367<9:)4/9/7./D8>491((7.<380;74;184=:;:7:6:+44)*398*)48"+2723:@;4306315757:?<53877769/,?<8-,8< *7>5009;6333/-36206831:1;<>?B@77:0,163/6O9?636:20*1*)497'4763.33014<724742'40+@2(20;80+.8D?;70@0=@0'-:86<;4'(13>/7215786539:76C84777/(13011305<=:31???<;17530.0/368546;963673'/8962:024541479863578420.1@;2013844;=><8@810597'.35438<<<;6-0/3367;988=<;:B:4-/C;842?<8/.28786432334152-,+*+01365?898::9:960+*@651473479=<;//566!03;<=;987023640./<55217521//0555654&16,608708/4:;00+;?7:('0@367344448999:630/15656644357640/33434989998753024655443111212430036665567740047763443-6::412689676876776675,03767243>88*01.00>4>:>8/3/:45?2-@73@???:5(/0/30,05313<-'050:8274873;.70:92-05632;41>76//07'547.<384?.(,3/;8<730:;33?/0577/?.87888:/'/728?588;566151315@;7-32;53617043:;88/61:59271414D;6(/4;;52122051518587875<76:56012051526263673738587886474957574;785256<880067974620210,/.50314164838357)2/4/40735434374745374:69/674=9;07476:686745338650/-168702/2/3230538696;6:7:6;586/007375/2378<7/273<+7+/0+06334;035?373/06,40<74/09@1,4-12:4?746;+440>9<74/9?838/<108847/41<44/3644/0?@4?-;4.7838778?37;94(576/16;;90102865521466978886755+3132545464;9;9:8877522433*0023355445244546546653597676798766566;89687)22326377043536667885562137365352522016214,0.2103041523;777686:5:5:6977644121<67543366<8:76314?9796363646456436020144746456597977:58685865847373646444;;<>-37=64:84989<48:;@599:8;8;:9;8;;;8:;7;9:>;59<8@=@<@9=<<:;=;:==;?<=;=><=<>==><><>>?<=??>>=>=??>????@>??>@???@@netmaze-0.81+jpg0.82.orig/lib/texture1.bmp0100600000175000017500000020206605553575227020425 0ustar jgoerzenjgoerzenBM66(m m PPp\\h<`p<@h(Ȑh@d xxt\TpThpPhx 0ظT@HP8``P\XPLhdx  (0`0@8dxX0HH$HL000\ 0(8@@dPD\((8XLXTd0H@@PPм@@8̤(08 N>5Q oZQ N NFo ܕc4&Yl4<3#*#xB,&#pc3x#wpwF4FllR4~\RFxx#[3~^~#l[l[&)l&lk34;j;;<;X=s<;Xɱɸ<= osNZ s Q >N Z Z >$ļZZZQZ Zo ^)Z<}N Q QQQooZX4 X𬷷YܘYYx#BB*tOpw#3#3x#c*[[YYl&2͠k{~~-#3x[l~k[#-c#[٠\ܠX;;b<;XXXXXF<=<<~X=X o À~  > Q Zs q >>$>>Q>N Z QZQZ  ZsZ sQ ZZ-lB9--Y4l-\33Bwtwpw x3Bpc#c9cxRR/𾝕ɰ44[͠lϟ4klcc[ϟ-3[cϦæɆF;;XX`;<<==`妦~;sZ(> $$> Ӣ Z o sZZooso  ZoXɇ-ull[c13#Bw w9#c#-)&3B\4l22Ylà^[-ll[#&ϰϦl[ٱ&[[[߷#3~X<X:$>s< so N oo Z. s sNooZZLs~l2uul𷷷c4\x#*,9cc3#x#-x^\33-xYYɡܦx3xRY2}#x4[&-lkàlcY[l[[[3͠F{``;;$ o oZZ N ZZX X<DcX己Lu9lLuuBuc[U1\31p&#-9#3c3x4333-3\FFܟ[4&&433&Ϡll-4llà[ٰɘɸX``;;F;<܆X=o<=X;=Z;QحQQQ qZZ Zss > Z ZQ Zo =ZZZN Z sZlL÷^9ccucc&3-BF,,w33#1x3xR^Fll[4YYRF4l34[&lϠk-ϱ[l&3lϱϝ^^}kٱ}Ɇ;;F;```X;;<<=a;;XɆ; Q QQ  oXZo=>Q Z Q>Q QZXQNZ 'N > ZFZ=ӡoZZZZXc[ܦ٬kYu9-9#[cw1R3##c9&x#c&3}3#xF܇[[-\4[3^[;4R}RϘ~^Ϡk^~;^Fà~Ϙ4FFɆ;~`<Q ؼZ Qo NqXZZoZ X{X`s` Xcuܷ9[-*[-#*uc9x413Ϭc&x3#[##)1x9lܱ&3Y-\4Y4[ð&نF1^ɠ~^F}4~~æ^`;X;^~~~~`ɰQ +Q. QQ ( >>Q>>ļ>Z Zؼos s<~XZ蒢sXoY^X-#FC9ucc9 Ʒc[9 uxxR^x#c31x13#c44}3#\F2--kɱk1Ɇx^ɠ^;;ɦ^FF^;;=;=<ɦ;~[Q.QQJQ QQ... Z>> > أQ Q룣oZs ssák ZXXs qX+;;okZZkܡNc-uCpp9Clp llc9pcC9R-3Y}13U11&xx##1x3[p9#c4ñ3Rϸ4YɝRɆদ~;F^F}F^1;;<;X;;ุX<=^F<=Q QQQQ QZQ >> QZ ZZN ּ NZ =<~lNQ ϭsooX4FYuu Ʒp*9up*RxY3}4x3x31x34x139#c}x4lF44àɦͰF͠}^FɆ~FÕ}^ɘ}kð}==XXɆ`~~{FQJ.ؼؼؼQQ ؼ ؼ > oo^ Z >N> ZQoZk^ Z  Z[QsosXQF~2-9--u9*CC9C 9pƛp*94431RRx1a3}xYRٱR#\ul[-^ɕ4ϠFR^}~F^4F;FF~^1FFFæ}}}4X<<;X;F=<;F JQQQQQQؼQ Q> Q qQo . Z Zo ZQq <=j٦ooXZ  FY=ZXZ sX~FϷ[l9cc9999uc9u9C*p&RR-Yx4^FF1xxY31\3--9[[kFXFbF4x}F~^^F^^}Fɮ^^^}^^^FFðY;ɴX;Xs}j Zoo Q...Q ؼ QQ ZZZsɭZ > o Zo `~> ح sZZQQ > ZQ`s N oNQ  `ZZoZ Z NsssZXssZo ZNsXssXXXs`oZXooXssXX4;YXa9,p cpAC wtCwwxF^FRR^^\#3-[٠^14~^xRFFɠ^^14\3&&~Ϸ4Ϯ11^}^}x3}1FZ s ZZZ o F Q Z  o+Q =ZZ oZ ZX ZXo ojZ;`XXsXsXZssX##[}:;FFFF}F1o Zsa;CX͡ѡLsZX2}[ƬCwA Ɯ*p}R&[RlFF}1~9ƆwRR&^RFұx---&xx)#39xc#33##m9C#39‹##tt&*s܏ ZB *w,wR#*#RppxC4<&11ctuZX^oɴ`~XooX1cׯϸoosXsXZXsXll)[X2KܸZs[::{xϟ-#t9tPpiC%F1RRRRx}bF4x4*FYF&}&xx1F1x&cx3#1c3-#9c9c9&pC#x#mO|*1vww^xF*tw||O#ww#wpt|,C}33t #9 Zo^^o<oZ ;ZsssXXϢX<XZ[3XXs=ZXY9cx[#xðx1c#CCC, c}cs;ݭZFF}{=x4ϯc)pA#CC cpFFFF1}4##C3-UZR}39x}#CCwc[[99p x#41xׅ3#9#c4&0c##*ttww\xx#ұF#wwwt#wp C cRcCu9ZXsosFssqsX2~XsXZqs`XF&#k<X^&lϷ[[}F}}R}9*-p p9ucx9` =F{ÆZϟ#933cC FF}F31x{xb-wpB3-&FF#9p-c9pc&3xF1F}#01cC93Uxw3#wwttttpR13c**#w#| c,*#O|””9wkw*t9xZ<~XZZosXXXXXXX1&^;[#x[[a^}F}ϱl}ϱ c 9&&2 <Zo;o 4R3x&#, tC t}F%Fbxx}[Lcx}4^X}R4xï##9c,#BCpcp}R&FR^1c3A cpc}C9xxp0t[xwFcpR-#||,Bp ppw‹  l^3p pXX`sssX222R3c#R[[Yx[11}}FF&[4-&9c99 Fx39p9u4XQ Q sɠk^1}4RcCpcp#p*p Q`---ll}#9c}c3F}c9&cux3cF}K3l}#RF#YxѢ;FRF}x^&11}c[}x}1111x3&3#)iC,,pw,p tOtt4Btlut mtwt,#| 0|t 9999p߯* p9-9ˆRY¡FFR31 #,cp )ϟ<^}Fxx1}1}9}ϱ}cccϬBBu1F)c3-. >oZ2xx3[x3#&-c#RxFFc3F#^}xRFFF1}1F~<1^}3^x&upB3[&x4193#&p ‹,|pOw0w7wmO|wwwc t ic1 , u u, u,Btܣ7RZp4Rx1˜9#p [9#[11}1o߰}Rxðϰ1[1)c&&F[[ Q ӏ2Xɏ2<}4x\&1\x1Y13cxx[1xF÷111F1cx1FV4}K1F##up9xR11x#33#9,t0A,t ,*BtY*ZtmwOOm| ||Bt,tA |C|  C|, cpt c RZR-Zw/^4R}\Cpc9#}3x~x~4^[[X<[3Rp#}ðٱ&&1x1}b1Cc3ؼؼ Zӕ2kZ}FF1#c3#33&^}RR3FF}b[3c)}RFF3c1x4ZܮFb%%Kx-3F#9 p1}}333vc9cC9*Ct 0 *wcwwwwOO|tt,A,|| p wA # pp[\^*R#[-Rcpp)3p1}}c#Rx^~[~l߱\31cxF3}}#}1)x1x1cp9[Qؼ N ZZV2R1}}1x#&&xx\F^FF3cFxFx9U}\R%b^-F3CC9c}}xx13##pC,#0wupptwttt,BܬB*wOwtw9|Awe ,t tp*p ,ccxuYX-ZF3upBF&#},}ccCCu#C-ื)Fk&}xx13&}}F1x&3&}99[ؼ>Q ZN͌sF}R\x}FFFF}FF q~ =F[XQ  o >F1}4}x13xll9 so=4R}9F3&x-\}3#3B#pp#wt tttwwCwBwO|mttt  9 |p **u#;F}3#1&FRF}R F1cl9&ìRñ#\&4lk&[3F~F^^RccFkؼ QNsQ o=s- ܱ    FFFFxx4l#-Ʒ>ǑJ}>$FFF9 }R}FF#,#lc9Z={(9^ *`Fp#} F1###3*1pR#c*90|ttwwww*wtwt 9w, | |A CtttA uϬFæ}^FF^F^FFFÆ1}}[^&4#LFX bF}^}ð&b<}}^[)[x䰰^< Q  QQQ DqDoqo[ 2Y Q Nح'Q\^ٱ ϛcc s2oҫUܛc&\xB&x}c1p1#wCttw,tw*mtBOtwt tt A C9 9i #[{~~>>> &Z/cl}}F14FF ;XX oQF&ҟ3CC,xC 99KZJ)zmO> --~Fx^xUcϾc33pPcp#B0,wwttwwwwt ,w||| w pA,p*p|p [Ϡ̭>N`c#[ku-R4RF=X= sZZ blFkk}4xRϟFQQQN :::::߼NꇼQ 4LsNN1[CpC 3Cp c ZY :̫˾ >&X4)[#ѝ1RR)x#&1u#C&cC ,twwwmww*wBw| &||t,, B}ɼĭ )RoqZRY2\3ɏZ Z{s + [Zo; 4FѠφ}&4F}l#oؼ ZؼQ؈kkssχs ll\ cwB3cc#w pF zܨU1F1[\ N K}1}1c3#Cc9Owwwwwwww|O|œ39| iCA C puBؾj5V>Zs}kj4..ZZ 2o Ӣ;2Q [ Xs 1^RL:<<&l}F^R14>  Z N;:kðk 4444Z}^Ģ N ӕ Z[so  ZoZFF[XX}<3}F1FR<^F Q> QZXXXXs ؼQ Q.1#3cx1}cҟ 9-.~l>ݫ!\& N YR31##c##u9w,9t*w*Owmw |w ,|A A99*p2 Z' Zo X ĒNZqs++ +ɟ[Z Z Z N sܕ[X~:13F3414^>QQ NNQ Q.Q ؼ..b}}FC}#F31K3C 9&"#[>Xl^lZZ-Y#FF-3xx\x#3#c9tttt*wwtt*||,,|wAt  p puCcLu>Y Ys>ZX[GÕXoNs2Xj ɸ ð}ɠoZZsss;kjo}4R^cl3\>5Ċ>>>>Q(>ؼļZq뼼ؼؼ ؊".>>(F\1u#F}}-xx*x*, =+JJQ=FF$1(-3R\xR}}F\#[wtmmtwwww,tO,OO|C , C pC[But>ܡU> \~常XF }}1&[j}ɮZ QZ oZk=}F}}[}x3}1$$$$>>>$oQ뼼>(>>>>> F^31FBC9c[[.""Q..Q" } YvYRx1FFRѰ3x&3wwttwwBwwwww,||  , |,A O» pp C c;> >>>>NRϦ4Ϧļ>Ċb;F-}F} >>>5>>obFF4FFa}x}FF5$$$$$sq>$$ Qؼؼؼ؊ؼQ<}F}x}xRRFBBcul}+{jX;===RLU-\b<4}1F}xRBOtmww ptwO, t , pA p CC9 uco >55> 'чĖ<ÆF1}Flà[>55>>>؀Q;FF}^R$$$$55$X=>>>$q sssZo QQQؼ>.آlFF}-3Fc91}'> Z JFFqļ>Z [ Zɠ!'X! đ>Ǒ Q>>Fx1ļ$$!>>>Ӽ !\>^NNĊĊFa}FF4}ϰFϱ!N>'Z>V' Q+ FFFF >Zđ>$X~  q)k$s> >ZZ RKF}RFFFF....QJJ .ZR, YY--\R#o=-<}B3;F9Bw*w wA , Oœw| O pp u #cc9Nqq >Ӽ F'ּĒ$&J>[3F`Z''> ++Z)}% XZ<'$Z5>N>sX > ż$Xl> 'N #N F1ђ.>$ >Zļ.ӑ>NZN> \[-l%Rvss<=FxR1bFwwmttBCttww O|0 OpAt , p9c#9xCsY `ZNVZs Z ļQĊ+!Y'1&[`^5Z5'V' +=++Q=b ZVZ'ZR `Z kVXVlQ' ZxFFb "5'#>ZJ5$$h$>>>( 2#uVYW[ş-^3X,ww,w,t t#p puC,  WsN1Ɇ~~~sq Xo +>^ }[<=FFo$'NN' 'o=+=k[Q.Qx ZɕZ' sskZ 4 XZ5φXlo&}Nc ^bFbF3֒">$"Z"$ >"!>"ul-3U걾Y-oFF1\Uwptt,t wAO t Att | wɛ9 FR/s/ oXXNNZF N`>+{F4l1^Ċ[FN> +J[.ѰXZɡZ '>>> X V VlX) NRF&F}F>.>'Ċ Zc"! Z">!Y'a"-[l>'5>> jj>NXJZZ[#F}[[k[X>5''>o +oÀQ}ɡoZ<>vX`XϱY Uܠ>Yk ꝱ~ɟ[2-3Z#}Fx}Z("$ u. B>"5ӑ>"'$a. FbKRX=11lxF t we ||pAO pp*p999tw*Fļ>5> >>' X>F ;ĭ=J뵸}R[[߰߷ 5>'>'>No:ooF}=; ksܝFl~lهkY- sNYlll2x2433c31}F^>'w"$Z5Z>5 ""'> ѡF=ɝF43xw*w , t 0p|C p :z9 ƯN'5'$$>>>>> NZ>>2 Ċ..>Q$J+J+ J" 1955>5o oo;s=Foɼ &l>kܝYYYl<ϟZตXXsZ F3clcxFlq$ <">s5s>YZ >>'> Zo\wtCtC |Ct” , # 9ppA ptLQD>'>>>>> l>>oZQ+JJJ.ѵ9cu$ XNs:ZFl1j ü>.;;FF^4los==ɸ22>> FY13~}>">" ! F">$Z> >''>'>>>>ޞBKհw w ,00,| Ct|| p 99p [cӣN>\żܴļoo++d Q+b[-u9c>'>ZXQ sQo&xFZ~$$$$$$>ZZsoQQQs؊>>">ؼ& ;$"$$>$NђF>' 'ZR"> ި>' >'EZo=ZYKtFĢ 5ZsQ o`;Q=-Z4XQ$$$5$$>oXs> Qؼ (>>>>>FFY "s> >!'>>"'N1 6> ooo o,,tC,,OO |w |c 99 * p9[ Yl> ļ N ӦϯcB#uŷ߷>'Z^boϠ-ϸb{j>$$$$$$$$$$5>oo>>ؼؼ>>>>>}^5<>.kĊ$2ɕ">>>>ļv<oootuotmpC,,, |,-,pc9p9p t p *lkY>>>>s q ZZ s$ VZ ɷ߬c9L9>'Z>Zq o~&c&$$$5$$$$>>o> ؼ Qؼ ؼ>ؼFR3a$"$Fæ$X"X>l!Y\>ZoBBoOCttt0,t pAcpc 9u p p99 XYLl N jɕܼ2V R͸ NRNuc9ߐ>>ZZ'5Xk;ll}ßl` 'Zď $$$> ZX$>"5$"~">l}..>ѣ vU>N oؒ%,twt 0,,#9cpp9 c* 9pB>>>>Rlll'>sjjZ XZ-ZN9߅p߯>>>>ZX}lF̸> Z5$oNNZ$ļ$Z5 2Z '$>ZXXQ;-\c=""..J"Q>"$("ġR^حYZ V2> 7Yϣoo< n't,|| ||t[tx ڜ pA p pC99X>>>Zϵ[q>XXj>24JJ+++ ZƯc9999Ưc>N>ZX+++==NXZ' oZN ZZ'$$$ĢZ\4$Z`!hN^>! $!5!4\F#>(FJ"""."""뼑.Y22Y5 YxZoo#uw,,,t pt| O| p tt# u9  , 9c 5$>;{k)[vjj{>(X=++++[uc999c99> >> ++==4;~~$  $ĢZZZZ>'$>Z& \x~5'>5EӢ5>!Ӣa}x#N$$>>'> oo++oo+JoF>2 ZNZZ >Zs3 \\!''$ Z>$\ 1""".Q '$$5<F{{jo+ vӣN;xZ\YZoo[owt,tttwOp^ ƛpcpu t [߷p *uw[̈ݐ jj>$ĝF;XF^k}ccuu9>$55$N X+Z++; ^sN2 ZZ>N>>>ZsQU\$ZY>Ø$ Z 5$ U&J""""."".""". N !!ĒF;R2Y4X==oOw 0wttc#0Lu 9 * F LpZBP啷>N'j;sX q$X F;*Ʒ>5!5$ RNNlo++Zoj>.$>ZZRsNN>osNY\ɸ544$ Y$$5 ^ٟ"""""""."..>5!\Z VWRYY4/-[[[YX,Ctt|t,p, c 9c w*c9 Lz ALL RRlkݸXjjNFXNsZ3 ^NZ2ߝ*l9>5$$ >[N`+;5$ĊZ/FoZxY`N>͆ļZZ ՟$E RJ"""""."""""JYlͩVY{,m, , ttpt,99 w3 u: tu[YͷŷX{;  XZs2 sɯ9-9u9> NVl ;>oX5 5$$ Z^s`ZF~>Q >$5 N= $$$$$$Ċ`ܱlkssFļĊ> Z.$N5o=X̀o+"""""""""" K2ɝR\Y# t0ttp p, 9 œp9t 99,t ,9[z j;;X j{>jXsjFs\Zs&FZZ2ӕ99L99L>Y NZ> sNNsย+jX$N$$5$$$Zs^Zs<>>ļĊļV}3l5$>ss<:+J.J"""". > R2͕χ0 0t|9u9 t p999 ~~jX;~{ jĒlj+o ;9[cu9u--~}2 Vs`;2;XZVZ '$$$55$$$ ؒà劼>ļ>>>--}$>`$[jN;+J"" >>> >llL[0,tt Cwp[, , , p ߛ9cwt 9[;;oF::{jjj̘3Z J=+ L˷#&kYs~lXjZ;ࡢX `>5$s$$55$ ؼQF2;>>Ċ>>ؼ )-$*$ZZ$ZlF+" '>'>  N{F[~,twt tt w&#tp,9 9w cupu*7;z崀o~::;ݸ{j ~Qk+:= ++:XØ堘-[l꭭`Ϡ~XXVV>>>>>>>>Q'p ![~ݢBuXV$ >>N>N N>' ZYFt 9c,wpc#at u9[ ~*c<R/[Xjj:jXj {ݸll=ļ吇 +k~{;;k[l XܘX2YN sVN N đ$$Z ؼ >>ؼ>؊Q;x\ 5 ;s֬LŐBX0z ZUF3𱟔 w p Op[xu cp9usv-t#NUqV[Xj~{݂ݘ ɣ~k{3Z:J ~~;~=zzz +s++2X2ӢNsV֢XZ ZZN>ӡ$ ZojZXZ q  >؊>؊ļ>4LL2 >ӝZ72 ~/1v>>RVZ RFY14|t|w, ,p,ϯ˜&9Ņl# 9wŷ pYXZZ".Q{:;:݂:ݷl;2Q;嵘&NJk/̮jzjZ++ +=;k~`NӢZZQNo$5$qoF<~X ؊(>> >> >&9 [-Z' \#̒Y4!Z!ѕZlð| tc pz 9kŵu9ϝR9[l9kuL9uϟlz 2JJ=;;:̷lܕ~~~~^Zs/~~~;ܡ2z+++o~XZN XZZZ>o$'oZFR'܇ Xq4ؼ>>>>c=Vs~ 3#sVZŘ!PY F!V! l-YW>VF40wA9,tc|p : 9p= ÷9[u X\ZX壸sUJ= ݷol.X~~>~{j=𼢇~ +++≠;Yꝕ>ZVE$$oZ~> l ֢ZZ.>Z ؼ/YY:s4`U/Ǒ>L!B ~ Y!sN#vlW ,»,tx#t | w9t 9˵L[Rtppt *ˈz[=jZks2o9 c9YkskZ~~~j~{j so+ j~s䠰2> 5ZZZ~~ 'Xܠl`s>>>؊`Ϸϑ>%FXsZ+F>Y! UFVl5N\*7! v-!Y'2~t ߔ |wt 9XƜ9t[:Z2X~ oL[B-ܷ;ksJ~~~;~NY ulo ksso~Q֢$5$ZRè 4Xk >3l> 2>'sǼ Ċ~; ~Ň$ $ P7*-!NEv-! \Ctt#wttpt  w-9-9 * 9uL v2Z2=ଷkkkk [~~̸jX2XoشoYLV ّZ>YFsss=F^$$$5o$5Z l\ >-Pl 2> F>'s2 ="􊊊" $ĒXsNN NR v%#*Y-VNWY$ >UAw| tww 0 t 99#~v tp uŵ[χ~~jXɸ~L[kχsߘX~:Xs Q l:2LU='V''VEzzso$5$$$$5$>$Zok4 >& >L-sZ'' s>'q+qZ""􊊊.".QN!F^s+. ѢN+ܡGGW\WBY'2Gќ,0w,Y| |lx崷X2Nlssso555>>>>oYVF3FUQ>73<~Y$'s="""""""".".N'>}Y\\͕VVWRYYW3V  w0 t pw t,O | zݐ݌+:kkkχl刈ŷ[uLݐ2ss/~Xsq`q ;=sNV>:2-:Ns=$$$55đ>ZZϼ  -Ѽ>+ ".""""""".. N5$>.4YUU2F\YUV\5$$55ļZZ>(ؼ> F)~Xļ `."".".""""""""""""JJ2 %Y\\KRY2WvVBAp##p#Owiw upwZ ,t ::z⌌;s͢qzz:p2Ÿc߰YL[JJzsq z ~l ؼ ;F>>> Q..""=="""""""""""".ޞN N> R\\\U7-Rc5  9p Bt,t9p Cps3p9Lc:::݈N\ZsܷY22ߐ& J`V=2ddddJ l++凇lllsN>я$$$ Z >ؼ>> >֦lؼ>ģXZX..">Ǽ;X."""."J"""̛ ' '' RUͷ[ p||tt-,7w,tOtL#w9p[9 -zz::z:d V+uuŷzdJJzV<ddddJ~Y٭ Ql-l--llY~X$ !$ZZɼ(>> ؼ Zܠ >><ooso">; (=J.".""L  ' ' >ޒ-LiAt,» , ,uLc99 pp u9 ::žzzV0zL9zz~ JdJss'h!ddddJJJ˕~++X~jjsX`Xs`5X  NZ;>  >Z~kY劼N;XZ".$ $q늊""Z > ''E ޷Ft p9[L 9˯L9:zz:::z<֢2zYL̇: oJJddjXE5!ddddJJJ뵬ֵ:++ss`X`s`sjjo ZE 5Z>N >> >(Z&>>==="JRuݐRo5oJ""#&5ѢV > ('>tt,*|99 s9\BB~*9u#ݫݴYgNs {[Ϙ:~z ZX2EE' dd $'d^Ϣ;s+jjj`zsjjXN ZZ>'Z༼>V N ޼ '葼 | t, *ulu9RCB { HޡnE ŷŵz ZzzEE'''5 DJHE$!>ddJJ2 ;+b5z`ssݴsjXsjj$Z ZZE5!2Zq ZllN' sXZs."k9F15J""Y!!>WN' -> A|A ,tw7 t 2u;Y##*LEEgG%  z:z::z z+ zz>55'EEhEg'5!JddJ +~~+{ss2`zszjj >ZZ >>qR͸$ $5ZZlssXZ+s ."9Z!RBs1>x""݈3R>27!>~C|, pcB Bu*xuU3%V鬬RvsZND Nǰ+z::zzz{z+ EEEHEǍENdddk<;XsszXszj>$Ċ NZsܼk5';'2>Z&LF ӡsZsq ."+ľZj=""::2 >V Ӽ%\ WFA|0|tt,wtwcW;w \B2YvRvsW'H2 >g66Vkz:{zzzs EggEEgggE66_dd Jjz`XzszݴzjsXZX$$$> < ss2͇5𯬷[ZZ=; XsqZุsss!"J؈ߕ- />V--ͷ U>>^CCwtt| p|BVt BYZuU#EVs%r z z+=zz gEEgg JdJJ++XsssXsjzq55$5$>>X' $ǘ [[ū qXX 2s\v>ި >5`Ctw ptwOwt B-*uuu#RusͼR2E ''V V666 +zzz zzo 6EEEggEggg +dd떭++X`szsjszXsXjX$5ls Zӡ$'q zz::z Dsl2bXJJ"j2lY'Y#5Y5Vv(6>NOtt|twt wwpu*/V3㬟7 VEN\ NYr͞666r6+z= Vg6_6EEEEEggEEEEEEdd l+ zsXjzssszjXs $$$$ه弼.ӡ5EoɈzz:zzzNu;Z.aܝݡVV<JJ".9Y!\YNY>qZl5Vv6ޞĢ> ttCt ,wp p v/ӁVRNVZ5ZZ 66 EMgV__gHEE'E5o+d崢XzzXXjsjjzsjzj`s$$55$$$ooؼz::::zz[-sJJJ"""~42X=+."9c 5(Ӣ\YY7Y6āĜt|t tt,p*p*ܕr\-% X%EYZYޞggEEEޓ____HEEEEE''>oddsXݏjjjjs`XsX jXݹ>N5$$ss>>  z:zzzz::z;2 ="""XF4̸;Lu9ӞNE'% V#52V*U> $500wwt ,ttϬ*c#B-Ӟ ZN72E'WV2VVEEEE'5EEEgyyyy__yMEEEE''5 ZdJlosXzz`jjݴjzzddd ddJJJs>>N> s~Z>>>~z::::::::ݏɷ;.""""JbðV<Z N>'Y\ ޞYNCw ttw,wwRc#UE\2/EEEMv/2շEEEE5EEEy6HMME5N=o dssjݏݏdJ ddJzX5ZN$'jɕ j:zz:z:z:zz:z:ŷ"""""{aRØY ޼>$<\R Y ,t, pBu--XNͼGўEEMNVVWFuR#EEEEEEEEEEEEyEHEEEEMM$ǣZ`soo+dsz dJJJdzJJ>ZZ5Ns >>Zz:zz::::::z:zz:=Z."""""J."""}Z z:# g ' 6 ' U>5tttt twwO #3\YmWWEgEEgEE27-2rEEHgȶEEEEHEEgHEHEEE'!N sos+=zdJJJJJJJd dJJJj 'ZZ$osXN~s'2 zzzz:zz:z::::::: o=qZ ="""+""J."؊j z \U ' >ޞ N\55t*0»tw,ww#3w#~Vv#R[7YE ZVE5VVnV2lN𶞕g6yHHE8yEEhMHggEMEEEEEEE'E2q Z+dddJJJJJ Z֢Zs=2ü> zzz: :: =XsosX""FJ"""z:zzzu''  ޞ ' VYF35 tttB ,wB wcYL#\-#2%ggZrHRV/F#*-VY ͞EHgyHEHggEEMEEggȶ'sXX+ddJJJdJJJd~ؒ Zo`Z==N : z:zzz oo Xoq2͡5~J"""XDz::z:ݟ4  NӨ F>w0wttttt -BtV4 ȓWn*ŬU#*YNZVYgyyffff_hEEHEEHEEEE NQqq dJJJJX>$>o=jzskZ:z zzz =Zss=ZqjN<""Eͷ"""Z::: zz̷ N > >VB55Ctt,|ttwBB**1%v ' EH͝VYŕuͬ*UR#WnffЎff_EMHHȞ6gșggEEgEEEEEEENZXZk:ddJJJJJ o$ o=ooz :: ~ssjzz:zzݢN"V9";Z:::zz:zU NVNN' 6uYYtttttttB,c* V,tp3-HEEYf%Gc7U-*x\l7V?ʄffЎЎHEEMMEggHEMMޓEEEEEHErXZqo2Zo;z: ssssjZzdJdzz:z~ X"̑Yň"jjzz :::  ֡Z ި VW-ߠ&w*tttt**#*pp#BB\ t*V66nnvSnV7UB*t՛#BWIʄ__퍍HEME8g6gEEEEHMEEHEEEE X ZJdJJJJNo=sXlsZsoosXsDsdJznn ֆ2[""q z ::::Z\NN/N\ g ɬ[-Cw*|wtw t u\#Vmw, EnVSGvv#*tt tBTԄffffнf_HEEgEHHEh!Z;NsόJdJJJJJJJN Z+oX;+qs+Zo+ JJJJz6nX:;s2"=zz::z::ZNNqY [4wt w9wc-B#*Y**B3uvY_\7%vv?WBBB#*7#RIʄfffʄHHEEHHEhZoZYdJddJJ븡ZqoZosXs=oo ooozdJz6N =:zz:z zzZsܾN YG(> %2෡>OttwtwwB&VwB w#\U-nffv7VVVVWV2*#c#FYfЄfʄIffffhǍE!hNρ~oXɟddd dJJJJJJ q sX;X;$so + XsdJJzjXX>."; :z:zz ::;R WVY> N ş$mtmtw*wB*w-uPB#G%nVʄԄ%W2n*BBB wB\RVffʄffffg!h!!hhg'q[ZXZzdddddddJJJ qZzddddZooqz` JJzz Ӟ6 yZ""".jo:zz z:sBѼY (%;jup2uBwttBB*-#BB9l#WWvR%]V**Btv7*wwu7UWʄffffЄf!hhhhhhhh!h!hh!!!h8_E'aZX dddddddJzdJJJdJs+Z+s ̌JJJz'gX"":  :::: 2#R v$\ ;;99puww*Bw- #c--#Bww7U7VV]fSB**t77P*B\*B#?Ԅnfffh!hhhhh!h!!!!hhhhEyЃ_-šXsXL玎nfnN JJddddJdJddddJ2kdzdd ddz~̌J'EE'" z :zzz:zz z >ӡ N22X̷wt7*ͬt#K#w*BVnVn?S7vvtuPttWBBB\\ffff_hh!h!h!hhhhhf6Ňffff_nN + dJddddddddddddJJd:Jz JJ'EE";zzzz zzzz{z ܹ2 > Vjjjݘ9C0ww,twBww-׬B##*Rt|-nGVVV7VBOtttt*ALt7RRVЄnf8h!!!!hhhyfн_<sXXsyyffffffffN +JdddddddJJJddddJzŇJd 5EEEj";ozzz X z:: 2$ >VXj wwwmwOBB*tu*B*#uvt-V]]WVV *ptt*uBtG?f?ffЎЄ_fEhh!_Ύff_N ѢsXEffffffffʤfnn JJdJdJJdddddzddzJd>EEEEM z:zzjsXZ$ 5 ݸø[[wBtttm#BwB#tKRWm w -%]Vv\9v*w* t9t**t0u#΄???ԄIf΄H!!!!yffФZNssXX2EH_fffffʎffʄffffIffnn NZJdz zddddddddd5EHEEEִz ='EHE 2$R ~~bɱw*BtmBmw9mY|-VVG**7*p*t ***Bt#Yvffnfffff_h!!!!!M_frIЄffff ssXsHHffԄffnfʤΤnfInfInInZZoJJddddddddJJJddEHgX<'EEn'YNl>ɸ;j`sw,w,tBww9u P*Yt9BլBx&**|t***u*t B*BYBv7GfԄfʄfffnffffdzhIffff΄мssssss22Hfffffffʄfnfffffffnffnfn Z+D+dJJddd5EEEggg6EE'' 'hh$֨ VRNNV~o,*ttvBmwwB#Bp9, p*vv\Wtwu***Bu*BmBR7Vʄfn?ff__Ўfff_H!MffffZ Z'sssssRXWr_Єfffʄnffnfffnfnffffnnfffnfnnfn +JddJJJ!EEgEE$$'55'''F$>'ZẎlZs*utw pwtptC* tw **W7*uͬVtcB *|**BBlVfffffʄff__Ў_rIfνffffVNN2UY΄fʄffnnnnfffnfffffffnE!!h!h$$>!!HEgHEEHEE!!hhh5ޞ'N>'V{~llk̢-w*wtw tw # BBwBuVR#ջ-W\t ttB*B* #c#BY\VԤfԄf_yyyyy΄ffffffffffs22UffΎ@ffnff]fffffffffnffnnEh!!!!5h!EEHEEhhhg$E5V>YB2ɸjl&jw*#twtw pp ctpulvUVvV*2ũVw w t#*p*-#-VSʤnԄԄf玎y_y_fffffff222U2fffԄ?ffffffnnfffnfffnfffnEEE!!!5''h5$URX/oqX:;;~tBBiBtt B9߅ w\*Vթ#**c7 *wpt*,Bm*BBB\R\nff΄ff玞___yy_ffIffffnӕ2XfffЄfԽffЄffff]IʤffffФʎfffffIff5!!h'h!5E''!h2Y2s2FXZ:jjjݸOBm0 9#--9* 9Kv\2\##YUUWp w #*BR-VB%ffʎffffffЙ_yffIfνffʄʎЃЎɢXXs͡ffʤffnfff_Хʄfffff玎fI_HE5!hhh!hh!r2s $Zjjjj`FYpB#tBttw9lRwBUCBuV%%W-tCBϛwtt#BU\W#2RS]??ʄʎ_ffʄf@ffнfffNNVsXZ/VffffffʄffffnffffffIffIfE!hhh!E!ΤܾZVNsXX:j[XBttw uw##t#|,* *VOwtwtttt*#%թGYv??fԤnfffyʎЄfffʄf?f No͢YSfIfffʄfЄʄfЎf6f@ffffffffyfH8HHE!hM!h_fllXXNXj:l[l#BB|B#wt99c3* cv‹ ttwtttp ,*V7fUUYԄfffнf_ffЄʽffffffԤffӕsGffЎЎ@fЄfffffH6 f΄fffʎ_yfff!Hy!nffԤʄy>sXll2XX:;k#Bmw,t p w pYtY t t twt#vW-\VmYUũ??β΄?fΎIffffffIffffVsZWVʎf__fνЄffԄHHg_ffff΄ԤЃfʤΎyfʤ_n!H6InHhhfԤH޸^:;;ݵk~ww#tww Lw䛻,w*vB t *UW7%vvW%\2??ff?ʄffffffffЄfffʄf΄f2//fffyy_f_fffʄf8HfIffffyIIfffff__IEHԤ6fnH`Zjjjjj~F#tBwt, uw9p#c,|tRtv#*mwpB|O tO|*GWVV???fffʄЎ__y__ffffnIfʄVI_y_yry_fЄff8HffffffffnОfffIfЎfgEMffʄnΤfnfʲffE2jjX;;jZ~~BCmtt,p ##p -V\wwwwm ,77u*UvS]]??fnΎОyy8y_fffʄfZ2V2nfgHg88HH__ffffH_fʄfffffʄfff__Ўfʄfy_ffffffʄԤnffԤHdzhZXXj2:jXZ0#w|wtcw9cFwBUO Wc7*9tw|tCtB-BV%YF\??ԤffffHHHnfffff2YYSfrHHEE__Ў΄_fffnf焄ff_fffffnf___ЎnffffnHh!hhXsjj݇U XZXjXsttt|tt#B#Ot9 \Ք| p9 *pp|O,|,mB*%R7#VYR%?ԤΤnf8HHy_fffffʽԄfYfΎrHEHHH__ЄffnffffffԄfЎʄnnIf_fЎf__Ifffʄff?ԄfEh!Xs3q2(w*Bw wt,,pm|, O9 RwGB, p tt * \vB%΄ԤԤn?HMHEHMHHHffʄffЃVVsЄMHHHgyffЄԽffffffffʄ___ФԲf_ryrfʤnԄffʤnhhXsXXF Xm9tm, 9p#,iw|vB7|tw BtBBR\VB7#G]?????Բ?f?ʤfHEMHHHEԤΤʄfyy W_ffyyHHHH8r_ЄfffЄfIԄԤffЎfInnfffЎffff?ʄ?HhEjXX 629x9ttt9 9cwBwB*ttt|t ,t|twt *u ]%W%BRn]??ԄyHHMHHЄ?ԄffʃH%Wg_yy_yHHHM8fЎnfff?ЄfI焄f΄?]fԄn_yf??fnE'5HE6LFmtttwtt,cFw3BO||w,|,|t t,t#B]G%\]]?fԤ???Բ?fy8MH8Hfffʄfy8HHHێ___HgEMMHfnffffffffffffԤf??nf?Ԅnʤ?ff퍞E66pB|tջ*tc-www|w| ,pC0t| *7vWv-#RV]Ԅ??f???ffyHHHM8fʄnԄʄf88V\HMMMMMHyЄffʤfΤ?ʄfff??fԄf_yy6?ԤnffԄ?ʤnHH_ 6ttttp*tc ,w O||ww mpt|, *OpwBYvUW-YV?Τ??]??nMM8fIfԤnʽfW88ygHHyЎfffffʄfffnʄ?ԤԤn_6ЄfΤffΤ??΄??nnfff#twt0t 39 |#RtR|| |**vBB7BBY\G??Ԥ?Ԅ????_MfʄnffԤ?fffVgHHH8MMMfffffʄffʄfffffЄnfIffnf??ʤ??nSfn6EgmwtmBwmtpwwwwBmt*P|ttt ttt *P#9v3BW\???Բ??Ԥ??MMMHfnffff_WHHHHHH8HMMM88ێfЄfԤ΄ffff?fԤԤfffԄf6fʤԤf]?ngHwwtB#B c#B** *| v,Ot, RR-}VFԲ??@?????_HMHffԲn?ffff__88ggHH8HH8HMMH8HfIffffffЎʄf?ʤ??nn??ff?Ԅ__fΤ?Τ?]H,*ww#BB,twp,,|tB|ut t wcWv-V^VRV?]??????f?????yfʤfʤfffʄf__yrYgHHHEH88HHHHEMMHHy_fI΄fʄfffff???fffʤ?nnyyy_Є]??n??nn_#*ttBtuCw#Cp» ptBw , *tW72uBUYG]]?]]n???????fffԤfԤʄffЎ_8E888HEH8HMMMMMHyЄЃfffffʤffԤԤfff??ffʃЎyyfԲԤԲ?n??ffnn,U|wtwtw#ww xB 9 ,#wtp| *7RtYU?????]?ʲ???ffЄfffy888gHg88HHHgȶHHHMMHHH8HMЎffнffЎ_ynffԤffʄffIfIfffy_yfffʤnff???fnnnIBB*tw*w t O|wO wtOt w\BBB7%SVG???S???Τ?ԤԄʄffʄfЎyyyHȕg8HHHMHHMHMMHMMΎ__yyЎfЃyyyyynffffԄfnf玃_yyЎIʄffffInn#xww*cw| , | t* tp t #*u/B3#VS?]?]??@????Ԥʤfʄ__HMMHHgHMHHMMM_ff_8_fy_yy_y8gffr__y8yyg_ʄIfrnfInf9BBttB[pw,| t p w||t|*tvwwVPVKVSS]]]?]?f?????fffЃyHMMMH8HHHH88HMhMffff____yyyr8y__y8HMHyyIЎf_yyHHE8g8nfʎr玎nn,9wt*\*w tm |,m ppP|0w 9ww|B**Y%V]]S]]????????nԽ_yHHMHMMMMHHHHH HHHMHff΄fn_y8gHyrH8y_8HHHMfʄffnfyyHHHMHHnrn*Bmwmt,w0tt,,97 t*U w7B*\VS]??]]?]????ffЎ_g8HHMMMMMMHEMHHngHMMMM!ffʤfʄfy88HHH88H8yyHHMEHEH8_ffff?rEHHH8HHEH_fy_6 nO#B-*ww ,c w p tttw*V?]%VV??]]???]??]??]??]??Й8HHHHMM፶MMMH8EHMM፳M8fffffHHHHHMHH8HHME8M8y_ЎΤ?y8HHHyHyy__HHyyywBw#t,,wttw ttw,|tp wttttt*B\]SSSS?]]????????????fHMMMEMMMMH8MHyЄf΄ʄf_퍍MHHMMHHHHHHE88yyԄ΄g86_8Hg6,#U30wwp|0ptt t O wt|*w tt w#*VV]]]]]?]]???S?SS??ԽM!hHH88MMy_fffffyHMMMMMMH8gHgHH88g88ێԄʤy_6fy_HHgy66wt*Uv#w wtw|tmt|ttw |t|t| tttw*w7U-*V?]]]S]SS]]]?]??????HEhhhHH8HMMf__fffffff__y8MMEHHMMHHgHȶHHHHEMM8EHnffS_y_fȃfHE88y*t#B#www|| pt| B*w ttUtt7#YGv\%US?]SVV]??]???]?]??????fff8MMhhhhMM8f__fHMMፍhEMHHHHHH88_Є????fIff6_fHME8Hgmwww wwwt|ptB%*OwwtwtR\Vv]]?Pͩ]Vv]S??]??]S????M!!hMHHHM8f__ЎfнHHMMMhMMMMMMHHME_Ifʄ?fIIfffnnHMMEggggBt**tB #BcRm*0wtu*t /PR%]]]]VSV]]S????]S?]@?]???f_퍳h!!hh፶M8Hff8y__HMEMh!hMHHHffffffnnnf_fnnHMMHEHH8ggwtwwt,#Ot p p,*w** wt| wUB7xVF#]7U?SS]??]???]????Ԅ?fMM!hhhMMhۄffyyfHM᳍!hh!hMMhhH8Hf?Ԅf_II礎fInyMEHgEEHtwt,B9p t0,twpw |twtt*-1G?%SVVW%n??n]S???]???@ΎffЎHhhHHfʎ_yHHH!hMMMdzEHr??ʤff_fnyMHHEwtOtt9ttc33,wt,tw t t**BU#VS]]]S]K77]]]?]]S?]]S??????]βnnʄ6Hhh!MH8ʎyyЙ8MMhፍH_ffnnnfI____Ѓ_MMHHEwBmt*,t,pRvppp |t||tt|Ot VRvV]S]]]?W?7RSS]]]]]]]???]]]?IfMhMMyfԤf΄_8_y8y_yMMHEgێfnnfn玎f_y玞HHMMMwwtww*ttx|t9 | || 0ttttw*7VS]SSv*V#S]S]??]???ԄnΎHhhhMHfffy_HyHHMHhHhMHHyfIfII_yy_r_fIyHHEE#mt ,tttBO w#t#| w|tt t7*%]]]]]VV7B*SS????]?]]??nfffHh!HHfy΄fffЄfێێfyh!dzEE_玎玎y_yΤ]8EHEhdztmtp ,w|cwt , |pttWBWVS]S]]]GYWBB]]?]S?S]S]]?????]]??]]n_ЄfhhyΎ8HfԤЄ8HЄʤ_Hhh!h!hhhMH_玃__yy_E8M#tOwp ,p 9\c,|t9,t t 3SS]S]]S]WB*B%V]]]]]]??S]]?]???fЃffHhHffffhΤ_ffʄEhhhhhh!!hMH8r_玎__]fngHHHhwwvBttct #x|wt| wpt w * R%WR]\]]]PBt**Rv]]]]????]]??ΤfʄfffᳳM_fΤ?hЄ΄ԤێffffM!hhhhhhdzhEy_6_yn]yHEwtwtpPp| wttt,| w**Ux\*%7]vSSvPt*tV7]]]??S?????]SΤfInHHMn΄HԤԤnfnΤffHMMhhhhhhhhhhhh!hhMHHy66_IhB*twtt 9t#|p|p|w,w*,#RB7^RUvR]v駩w**U%]]]?]???S??S??]???]??f焤_fff_΄ԤffԲ?fffፍhhhhhhhh!!hhhhMHHggyyy6_y_Ѓ?]f!h\*wt*tt»Ott[ œp 9,#--3w3VU\V*vmBBu*VvS\?]?]]]?????]???]??ffn?Ԥ???ʳhhΤfʄԄff???_8HEhhhhhhhhh!hhH_6yyy6yЃ_Τ?]g!շ0Btw|w9C,pc*3 pw B3-3RVv\Rt*լWv\]]??]]]??]???Sf??????ԤێhhM۳hfԲ?nn΄f????fHhhhhhh!hhhMyyy___6_]?]]hGtw t|x#1 tp| )1x^pc,*W%PSwBUv7BvYVWYV7W]]]S]]???]??]]]ʤ????f????ff_MHH΄Ԥ?f?f??ᳳh!!hhMMMEH88ry6yy___y6_yInIʲ]]nn%tBu|,,Bt &3pxpt|| ,C#R\}pR%#VV*Y՜P**%%VBBVBvY]S]??]]???]??????Ԥ?ԄԲԤ_8??f???ʤ?nff!!!!!!hhhMH8yy6yyyyfʤ]]]]rytw*t ,#3 pwwcpw,x3K\xV%%vBBB wtWV3v#v]?]]]]?]]]???????]Ԥ]fԄ?ʲʄΤԄ?Ԥ??ԤfMhh!hMHHMHHHyyy6yyyyr_IfI]]]]]0| #t bx9pwl ,#x&KBuB*pBwBVBB7vS]]S]?]]?]]???]??]?]???Ԥ???f΄??Ԥ??S?n?ʄԲԄʄMMHMhhhhMMMHMMHMHH6yyyyێf]]SS]C|w,,, ߛFRCt picF\>> ,, ;;;; '''' 000!!!! 8888 ''''99 ::::''''IIII JJJJ888  JJJJ@@@@ """"999IIII ---????!!!''''''    FFFF ,,''''EEEE,,, 0000LLL++++ '''''''  ,,,,,,,,  ''''((( 00008888 0000111 0000@@@@'' '''' !!!8888 ;;;; 0000@@@''''777''' 7777''EEEE 8888  8888  0000 ????''''OOO++++7777;;;  ((((,,, 8888 !!!!8888,,, FF7777 :::: 9999,,((((999 """8888----8888 ,,,,888 %%%% ????''''  //// ????'''6666((((IIII &&&&,,,,   ;;;; 0000000 $$$0000(('''' &&&&'''',,,,FFF(((8888 ----8888 ,,,,GG !!!8888  8888  ,,,9999EEEE88!!!!9999III@@@@;;;,,,,BBB,,,  &&&  (( %%%+++ 0000''''!!!'''' '''' '' ''''???? NNN   '''''''',,,,  ''  ;;;;''''0000444 JJJJ UUU8888 :::FFFF''''''>>> """@@@@4444---- 7777;;; 222 !!!!((((    ''' 4444,,,'''' '''' ;;;;8888;; &&&&000EEEE8888 4444 &&&  @@((((    ////8888''' ::''''MMM????,,,, 8888MM::::""""999 ::::0009999'''' 8888 ----9990000000  !!! ?? ---7777  &&&& '''' ++++TTT   ''''''' :::: '''' '''' '''' '''8888 ????8888'''::::'''' 0008888 ,,GGGG999;;;;GGG8888 ((((''''000000 '''(((( ;;;; '''''''' ,,,,88 444@@@@'''';;;; 7777  6666 PPP !!!;;; ;;;;??? DDDD 88880000((((;;;;??;;;;JJJJ,,,, 8888 7777 ;;;;1111   !!!!>>>'''',,,,,,,,'''',,,     ;;;  ''' 33330000!!! ''''''''''8888 1111 00000000!!!4444 8888&&====;;;EEEE 8888 ,,,, ----999 000 !!!!>>'''' ((((   ,,,''''88 JJJ    ,,,,''''  '''' ,,,, CCCC   IIII,,,,JJJ8888,,,,7777::::  ;;;;----EEEE ----999''''8888!!! ,,,,;;;; JJJJ888,,,,000     7777,,,, ''''  7777(((( ;;;; ???? &&& 0000 4444JJJJ>>>>''''>>>>'''  ,,,,9999???? EEEE8888'''';;  <<<<44 JJJ&&&&""";;;;4444""""GGGG???9999''''0000""" FFFF,,,   ''' ???0000 44'''' ;;;;3333  ,,,,8884444 &&&&  ((((000 '''',,,,'''8888???? 8888 8888&&&&88 MMMJJJJ,,,, <<<<   <<<< 88 9999 7777<<<  &&& QQQQ '''' ,,,,8888 ;;; >>> ;; 0000>>>//// ,,,,4444 CCCC 0000   99997777''''9999 99''''::::!!!8888!!!!IIII8888 IIII8888 FFFF 0000@@@@444 0000@@@@&&&'''',,,,DDD,,;;;;   ;;;; EEEE44 ,,,,4444 ''''((((!!!   ,,,,'''''' %%% '''''''' JJJJ0000EEEE 111199DDDD777@@@@ :::''''AAAA '''';;;;;;;EEE;;;;''''  @@@  ,,,, $$$$/// 4444  0000 '''' ;;;  7777>>>>&&&&!!,,,,0000''''!!! ''----:::  KKKK EEEE ????!!!!@@@@222@@@@ 0000,,,JJJJQQQQ!!!   >>>> %%%%'',,,, 0000$$$ ????))))  ?? (((('''  ;;;;&&& 0000II0000  '''' !!!netmaze-0.81+jpg0.82.orig/lib/texture3.bmp0100600000175000017500000002206605553575227020427 0ustar jgoerzenjgoerzenBM6$6(@ m m U̙f33U3Uff3Uf3                                                                                                                                                                                                                                                                                                                                                                                                                                netmaze-0.81+jpg0.82.orig/lib/texture4.bmp0100600000175000017500000004206605553575227020432 0ustar jgoerzenjgoerzenBM6D6(@@m m ̙̣̅fffa                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 netmaze-0.81+jpg0.82.orig/lib/texture5.bmp0100600000175000017500000002206605553575230020423 0ustar jgoerzenjgoerzenBM6$6(@ m m  &^f f                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           netmaze-0.81+jpg0.82.orig/lib/texture6.bmp0100600000175000017500000004206605553575230020426 0ustar jgoerzenjgoerzenBM6D6(@@m m xL(L`8 ( p0L\$(( (,(P p<\hPhXPX$p$4,:::4aaad[񧧧]qbL{ɄCCʎ_ʧoo҄``!6DD~~"#,***aؗ2Kŗ}/ll333 5 ıL w"՛ϵGGCCC cDyyyDy=oG::m[LVV@ffmFuaaa5HGGbGGGGGCGGGGGGGGlB,P,adZʮhaZbb5*JJ,Ym[ԝ66cz,Jp*(B-R$3  ɉı[L7bboӵGC] oyyy6czӵLk[LTVRVŏ5aaaaZbGGGGGbtbGGGGG]GCGGGGL!8vF[*aPaaPdMh(bbGbjJJoϮ՛zۧb]fVRŴ$f^`#,,|tL[ӧCɧϧA  y}KLﵵYYLnR}yܠ,5HjGGG7FGGGG]G煅絆KԷ8F[꽽**sftbbGG]G,a|:-[nG]]|{{mfVBf o#tϱLCTfG]Gӵ>>>mLꘃ}yyREPB7b'|B5)]bͅGGG'FBl[*I^K[mGG5 ,_ԷG'tz2$f@EߘBڕB :[bG o1^<:bGGGGƵQ'QgXX__Lϱ[[hhcyK}77,a5O HG|(9<$-ԥʎhhPBf2G]] J,| g_ʷ[GGԴf@E8ђ,[ԷbGGGGGGm2mLo111`<:GGGG:!_X44vlԷ[;KKh'daZZOH 77'*9$-ʜ:m22(,,BԴK;GGGjZ,5F'HXX__[GԴ@9EER🩩d,ԷGGGGG$mo] ]d1 ]CGϱm/ll444v_2ԷӵƵLm$ԥm ʕNuZ O Xg',JI1N1<$-YnLؗV(mTGGG])Q X> [[QLUf^199IR[ e)5 SS갽LbGGGGm<<<:C ] w`4lGGGbv44444/mƵ^NNu)X X gbؙ1``:ʥ[mmllԷҧӱm^99Nd4u)7Ƨ`i!Bff9E}cBf@Bl!'bGGG]GGG gXXgXOO\\O ӱ_XgFlv``N$fGGCo oL:!F]]ƵʾiΟ|gGb"cԾiWlƵY:[m$饚vdBؗhh||mV9@Bھld8bf$ƵƵGQl444,,#"J Jpj'''P*pwFԏK2mpJJ*rTR~DS嫩u \\\,aa55Z55F9*,5]bG[7bbbaar*v]]]#5|!Ƶ*rIB7GGCGG]]|dBC#ǒBzLL>ϵQgd5Z, ]GCGG裏"*rrpaԷ;m, J**pR}}D u\ \\ZJ*rP,aa*aaBfVP,bG焧GbGaJIؕB,7bj agtd*ߪܥGGQQQQGGG5,dBFbboհڎ_ Yĉom['8ZZq]Z]GGGCGGGG"ߦBL[(*ESo )\ aEIIPsBڢ|bG]GGGGGA*E@ss**rQ5aZu7rrrBb,aB'GC D? S [ԝ!''5ZZq–GG]GGϮ[7[(EEEIԷL?o]He\\\aIERVI&&&I:bGbjjHbGbGGGGGC(E&&&&EƵ|a57Gb pr[77dG  DB!%B,ObbGGGG]CGb,P&&hoɍ7!f@VEIEIh Ƅ' 8EEV&&&If׷ɵGGғ)bGG䧢BhRI&&&&ݧe7GG7 't[Lӄ``"D$zS~DԥʚBss9B[Pdb#jbbGCGGGGbHHH ,I&&Tɉ7l1^^@EEs(%LL ӵQu 49IERR&&׮ӵG]]Gbҧ!:[ԝ}I̦̦EEEEHjbGӵG,bhh[ oYƵƧli4u Ͳ]|,rDך<DDcԥdIII9^ԏVss؈[,ww|]CGG灲H&R[ı[!!3``<^@sIEP(nmnӑ_v9sRRE&&9^7G]j]bG煲HbbbbQmԝ}RIIERVbbbbb']Gj]]Lm[["D[zωٱ[ښ8uO H |5J DS<<ڝ6-IEI9ÕVVThhBP,wGGG]b7 VEEK!YLmlN`Bؠ(ı񮥂:Y^sIERREs991<LFFGG]]HGbQm[TꃃTT;Ƶ|bb]B(Ph[nL[[888)e5 J"0[m$W/-f9ssVEIRV(hTRrabGthy}_gYzm^99`𢈠M[BKVsEEsVVs99mʾΩ GG7煅HHHGGGG秧Lԝ}}}y, ,5,a,w] Hĉ{(PsIP(LL[[[z6D5)5Z JLL//B2-ԥIPJBFggBVVIEEEP(ꗃEs,)jCGbhBvlF[2fV@@l!QQFf^i؃VEII9999sI91NN`$h(ثbGHGGGGӱԝ66ӷ[P*s***J*,HbHL(9I([SOZZa Jrzhxf$2sJ,w|'ܘ@IEEEEEs(dfث jC7oãddB%hڴBJIs93319@EI99999999N`oGbtQ \ HGԝcӵh((***ppǐHOHbLII9 jZZ,J*rcccKؠ91؏2(a, bKK9̒,eoSrߒr,"[Ŵ(*P*99341III99NN991`3i/o Gbʮe \G[ԷzĵBr*p aZZZ))OOH'BB[S CCb8\8ZJD66Dyyyy9^TBB,ZQ$fIrrrp,lvW__!X)Z,ao rrrrr*PŢ[2$fs33199994i433`1il_:b]  b,B[u ƵLګ,J**** p,,\Z)eb@ŏ2Է[oQeu8**P6DyyDDKhڈPa Z)exxYĵo§'|aafgӵƧLƵݵګ,PPr**p*apaa\ZH7@@I@}yLƵ!vv4vaa"[y6D(,d(Ppa,F!/-BJ** aad333vlll3Bĉ?(BBh[ɱLڎl399`N191Q: >YQӵw,sI@f[ LLĵɵbbm,(,J(,5 aJa,HVIy}[ӵ_v448|0cD6[t85thPIv⎡$-[",,d3i11tӉLo Dh%[[ıԝ՝ڎlvv43NN1NN`ʆY 뵵ݵ'b'|(s@fBʮzϵӧ |5w,Էt|||| ,ZϱLLLhEy~}S o_W4 vFcyy}Ԯ Qݵo(EII3``^fŴt"h1`1`<<`1`ӵɱ[zooS[ԝcSک X vv3`111`lFF![Lĉ7'H@ nLԥ--5,sP[L{n{kYbb,  ,Z|ҧQĉLER oЅG[___vv_mV-II@N19@VԆm[<<<<<11`oCooτLԝ6D[ XXli`HQ񷛛0GeLφڈ1lvXX_mӵӵ p*rԷLL# *,""Fo rrESoCGL>_vl@@b煅bƵt@34hto$$ץ<1dB'bCCCAGGGԝ66H <<<ﲅSyycSb 5]7ύ44 ɱ<<<!lf@^@sIIh]Gb!^flaP -.ؠbϱCq]AGGG]GGbmԝS'><<<<< tFuXXHˈd8gɉnL[gXO\X!m[f$<<<;}T|,rLmG}~5 ]##ǒRD6Sz}REEErr#bGGGGHX__:' pJpp*C[ t,GGG##qCAGG]|ML$111lXXXF[hBvv Xg uu >YYn[XX_ԝKff$$2h}}"b]Jz-ԥٵ񷝝DDtbb# }y66ӵmόEErr#GGCGHe )XɵJa]ӵt]7> Z,JJ#oql-Ƶʎ`99194vgF!tFu4444 Xg \\ _>nnm!gg_ʥ;+mm22fR}t,$ӵh66]]]CCo6y~6}[2mo #E̪r'QG]C8t!G]Z,ZZ)5b]]ґ_lΫ**# 8i2LQQeg!!_l9ss91v_!X44334 gX\ \ X_>YFgg__W/2zm9r}'m$<<<-mӵĮԝzGG]Є?06R|wPCJ&rr*(b7GGGj)ҧG]GG]]\\Z\5'Lbb]])dv`9pJ# *p Z8c:\ gg8*sII9`ӑX43333 \ ug_8u XX vvWԷτƧfs&&TY``m-CCCooE&|Q*sB]wJṛeHG]CGGGGGbbOOOOOZa\\|'ɵGGaaaNNN9&* JJ ZFc6Uv4 Z,@^fʮ_3NN34\軻8g8\ 44l[B&rĉ11`ilY _!QGGGC Sc޷EI(] *IvX(&&Id5Hb]GGGCGGb7 OZ\pJat煅G]5Zaa99*a##J r,tSDDyl44 8d191$[lNN33434d4 \ XLP&&&Lʚ11lƵQ:WlXXXHGC Dcԝ}E&&,|| p**d4 Obb%PsEEI8bbbGGGG]GQ7b5pp[煅ZaaI&a#ppr|SyyT`\a44`1<mlii1N1` 844X X!ωGP&&JΕ111 W34 O GC yc[I&P"",J*J,uu 7[T9 7b7bb]CGGGϧ ƵCr6S0ӵƵb ZZaIsP| p,6}(Z\3i33`<ʾ111```1``F҅Xl!HH ,*ro!l)11YLm<`33\\\\ D6"cII((B(wҟ ' ԝ6RB8u7F]qGG絧ωn{?}D6SzӵHj,III|bb] pa,ԝ}P,\\\N``<-[ʎ11`<<^^b7ʮQ7'QQ'*rҧ 8n$3 \\\\ oS SSշŬEIVfBhbb)8gQQmc6l_e !CCLیooo?oԝ6[LGGbFBBGb,p,ZZ)8h;Ta,8)9NN`<<2[B11<<<$$fm煅GGt[: QppJ]) Bm 3334 \\ZeQo [sf<$mjZ\eQԝ!ڢoqԷLo o ԝ[GGGbGGbbt7"(dZ5 Ύ-22Pa))vN1i$-[($--B6LGG,,BBG]5aZuuB%nϱ!v444 \\ 8QoC oؚUmLQHZ,a5eQ[mQ<b]G]  rad[[[ӵu \\\\\e C CG'Yw,a J'ӧʡ_gX H as91GG##Ѱ&TQ44idZu)mOeEEEsث ""w,h2KF|,| Į[ԏ}hu v_l<1111mm??o?L$$38jb>ll X \8d~h[Ƨm<1$[(%mWv OO7j,J99`<:G&RhCƵ!l`N9999PaLӵQO)Z(IVD}t#ҵ[2ŃdXv_$<<<[zz-1)!\`VLӧ<`>> }RP|! mԥii44\\ b ,Go SGGCϮʾ19ssEIs(B[QO5PEs@fDRIycƄoa龍Pdl2-[h;-f9,ZҲYQHX89&En m<<<![L ɉ/`19ssVL{ĉӱԥ<`44 &粟gnetmaze-0.81+jpg0.82.orig/lib/texture7.bmp0100600000175000017500000004206605553575230020427 0ustar jgoerzenjgoerzenBM6D6(@@m m 0o/N8;F":6-V%V BV*2FP5N7%Jg:7k,-cRR$ Jc9c:>$c!Z$9R+ V k?DV g&&B R, s$ Z!J@6V3c44B?AZ, ZR JZ+ g VJ>0>-c>Ek Z)0Zk":5sRQZ2N,N% gL({-.2!F% c.B"2cR:4 cRDc+Z;2c*s>9+2%!B"s- {)RTPo42R >%:;w) s, V8k;$ZBBAF.&>Z 3J1Z*.F8%N.)g()2BJ# R":"" g9-V){R. 6J R71g$s# Z >( c1kZI$% R:'J@BR/k$%c#c RR' Z$B.N!c/ VaO{?Lc* k)6V653Jk2(B->.R+ kJ' g*(2!0B- cI,4c(2(s40>LHV- s J2%N F6' JBR6#J! R+{83F3ZR)0RH#5 { g3g"kG1$(Z JB4 sB,1:>AkLDV%kB V)!F$ Z-g,(2,&>4s5 {*NV)+R,o)B?KZB+>1 (kPPs*1J,-:C"BKo;V)$>+Z> AkQ({ k:& dTɊ77MqBʸSSSfffOtI,,f͍cȧ?Ǘ#)@e .bMqqڃrn!߷<5ռ<[XW֩ t}fssI?I?șڵڵڐ?O鉢@@@@DDB  1[[J]P13+3+|42rr-rr> de"eY D-UN#$7Z/]]GGG+4!(,,O͍œ<**s*.|p%%[9Ȑ,fڲtr绻..;WWo d i6i Έ$TZ9JJ]]$G1G1{1|mm"(4W[[JZZ##0 NjMMMhLSSOt q?Ȳ8a[<<<<[?ȐQ)ˢc黥rÃ* D !P0i99Iș,t,t,,,,ϻii #; 0V!(e iH6X{1i#[[J]$$$$G1{1{1)ռ5mMMUlhtj??K88//]/MMhlVi99OOtڙ?K88/g<[89ȧnLddddAS[[<[S[ySm==QHPPu ș??K?K????ȧOSS wQz77FHHQH!wLƭԛ&PH6Uǜ00HH nSNMUV9,tj`/gg<됐쥻 D SA<<[<ōׁA===_7PP6ќN? N NNKK?????????ș>O[S[L|QQ77777ppQL%z7H6Njǜ0#0痥S[NNėttt `JgmŪ됐IItrr**Rs R DDS[<<Ś[ת5=_Q17PPPH? NќKK??K???KnAewQ#ξ777p3p%ƼԊzN0FH0A<VH6''lMMj ǜiQQ3)""ƚ%Έz)_ռ<[[ 66MUM.nSS[[tj 9))G$$$Ԋw!!|vvvvv# ƞ9Ot????OSS9OW;#ie-rڧ????ڃtæO*n.~2o Aqqj>ّ+GGG^VV8vvvv;v#`[[S9Oș??tådnWW;0Qww-rڧ?????ڐtO9ϻoݝoSSS[[SOO͍cm_ƞtt-VQQ߽H2lMM Ǘi3+"kddL_ԟ^$$__===ɥ ??66'l'hnͪ[[[>Bqqqtnٷ+++GG68v [S9 ȧtODddɗ00Hw|w.-B??? N 9SSdoݝݝn׍SSōOO׍Sd_䭚XWܐɡQHH!hU q i)3\%$$$^_ƞǩK?Nђ'6'͍[[n-q>|++)%ĜUU`; #`X99 ?jqtt Ld ֱ0.-B?[deo(o~.n͍ͥOOæ*Dde)%%##QQ|!26hhN잞))"+iɞi)$$T$^JQQQiKNUl6uhU-O[[[-bBB-!|ߋ+3ĜNNNUNWXr:>N ttæ* oVbBq ## NWWrr> On~~ֱ-b jօ #ddd -ræOttt LdwQQzzzF0FQQpHV9[բi073G$$]]w!Pu7 0l6ppPuu6lUN>>O[Sn-MqMH-Nj ֱWrBr: Nǜ000i99OO*n~hhUѹֹֹǜ-j DZ F#J Rnrtætڐ>r绡|pQ70WɄwɞiQ7PP0i[[<$$$$$J#V77PH 066!H߽Hull 9n-:MqqjUl6Hpp跷w0WWWWW>>BBqN N0ƍChUUNNVVĜ ; 7v#SAADD*OÐr.w!!!HHFF7 ǜɞ71PPPi%[œ#0P$$^^]vJ`iVҳPӆ7PHH7p7pQ3|Qp&H6NN tOr::MMjNUl613i0#0ii`6U:>q jjǜ0pzQ#Sr>BMMMUN휜VVVW;F#SSDOOOOOO쇇ڐ>!pp0#0񖖹 LJLJ#7PPԭ[[Sɞi#07{$$]/ `XVuP1117PPӽQQ3&3&N t>qjjj67&133333Q&Z 6bqqq 0H77Qi[͂>qqMMM M? ǜVVW;idxA888ύƍ.>rw!ҶH0 ȩ? ii7S͍9i77{$$$^J/J8Xu11{{QQi0NN jjNz&3Ԉ7 6lqj 0z%[[[Otqqqqqqqȧ EVi Z%@d S͎8/8/8[[%ƞrrQppp0 IKKjNz[ꥥɄ&&{T$$J<8Xܜ'Hp11$TTGƞiNKNN jșjjNiiz)G{$$$ ǜ6lN 077#[[OtڙڙĄVw6;v澼%"eexSS8/`/J[ي١ɡiQppH ;;0 ᖩK?KNU1nwQ3G1${$[:h1{$TT$̰N KNN?KKN#$TTT$$$$ lNj K?K᱖00Hi[S[[9X9ttt,tVw` v YdA8<`/]/<԰33.㞊Q&&pp0## 000K?K??0$$$ƍn˷3++GG$G[Orp&{$T$TTT+ >qNKKNKKK Wɞ]^$$$$$$6񜜜ǩ0099S[[[Xt,t9ɞ!w!6' FJJ"@k dN KNKNKKKKK 9[<^$$^^$^t00000ǹlѱ[[ƚ#J`ɂOOOO''6FJ@e@@弼JJm)GGG33QLL%)G##Q0???Mi$.ϥ˷˷Ԋ_ƍnwQ3G{T$$TT̋ NNNN t[<^^^Ώ]0# KlU׍[%ZԊ#`ɂꂂ[i6uFF J<@e""ռ5=3G11Gpz١L_GG$GԾzziiK?jj Ni$z%\˷eي%%ƭ e˰+GG{{${T{{{{̋eLD9N qMMlK tO9J]]]JO[ƚԚ͂[J``iV'uu7J_=__m_=԰G1&L_)$$$$$7z&Vќǩ `v7Ίƞ)LL%%%QQ˷3++{G{G{GG{{̋e 99ǩᩜǜMUlMl?O[<խ7PPPu'lUN>OS<_)GG{Լ<rO[$$//`8,,>ppiZ]/]]]]]]JzQQQ[[Z7&7Hpw2woˑ"")z1||4(4o|||pwr,88vvFξ##9O͍[[[[Lw(苋Q3|١..-b iQQ3١--rrOt00[[ƚiPPPPOŚ$$]]]]888,ttr.~2QJJ]]]J#VVVVi99#&1pQ||!()_zQ&Q(((4|||wʀ8vv###iXO[Ŏ<[[w!!|ߋ||!|nnnn--:bNNNNȐQ33w.n-쥥ϪSSDÃ,t000ŪS͍9i0## 0PH0Ꞟ$]]]]]]v8IIt..|w]]JiEEE򗞭&33||+++%###QQ|((k((|VÀ; 0XWܐ,Oͪ3333G3Ծ##`iiikkkwtÀ۴WWȐIO[J/<[9~w((w9͂rr:MMMUUllNڃfQQ|!!nn͍SSOO00DZ 0F# 0痗i 7]88Iڿ*nRw$# NjNjj >ٰQ1̆&##0Xi"""e"">t,,WǐS<<[9:hho(\\(o99[8:MMMM l''lUæe|w!~-ύS[<䢢@99X 07Ot##  $]]]]88Itt**nRL)^$$$7#Xj?MMQ|QQ111770#;dQVi眇tt,WWn[[[89:MbCo\\ww[9- l '''6'Uʸ ¡w222~nS<բ[[[`i007תtW0`##ܱ FF]]8,șڐæ***%%$T{700??MMUwpp7P17 09ASVE tt>> W;;;E[>Mb-(\+9[ɣ~'''hMs 22~.[œm՚J#`0;007ͪϪDSSDϥÐ뗞#J# i;;;vF]]`8,ȧꥥ[Ƽ$$7#j??MUh..ɄV77P0瞍[Aϥ9ɗ0 r::: F ;K;VL[[9>>Mbb-((!Vn9w22~ *R.222Ɠ<<]J000 #SA錉 ttt`JJ]#`ֱ;;v] ` ܗ99ɻ9#${#KKMUU-n-:P709͂WVVH7ƓSͥ:~!!|߷|w.w2' .2222LS[Ԉ#`;00fSAd"edd Ãtt9[JJ`Wֱv ]J W ##ƞ9X#Ά77KNKUU-:Br uu09OÐ ǹlVw!pPPP0iƓS9n|Qw.nɝw4ݳ~22222铓[S%Ԉ$$$$JXO*"e@k@d*rÃæ[ǩ88J]^^#`##i%0 #7$77#ENKNUUNNq 666u6X9O,t 6pHӆƚ[[2uҽLnn.!|44442222222S[͂O쥞ԈT{$Ξtrekkke æ L 888JJ$Έ#0#;007QVVĜW 7$$HUKNNNNќ ?Ku##i9OtjȩN66Hp1ӆi<[!苋no!4442222222222 ttti{9Or -\\\ked **UMMMKȺ888//>܇E07PP70'!|||e sso'M88`888vJ]${1zQzzi6u'lU#]VVhUM:ܜȩ?tۦtWii# JJ<8Otl6Hp1&000 PP7H&&&H4(\"""c[S˷\\\(\ˡ:C UMMMMN>윗--VH77P77 Vuu|LDs*o!4'lM 88`88/8` Z1G1GG3Ԋii066uuu'U>99 -. ȧttOOWW;#JJJqqMMNEii7F;000uuH!!ϥ*n!2'lM88`X#G1G3%ƞi6u666>>[՚-.¡Ʉ O͂WJJ8O򐿙?Nѹ00W00HHHu!!Q)Ԉp7H|4||((eec[99eddettBtr>qjMќwVEV0 ⶶP7HpO-2ҳ'' Uizz3333ɞV0H6Ur[[nn„܇tOꂪ99E[Otڧ? ǜ܇i2|++GGQpz||!(w dd[99SOOt,ttqMlH&QˡօPPP7pƻ9r-~2'lUֺܗQQQQQ㍞iQHH썍S9LLei燇>tO[[[iEVLd5=՚9ڙIq qt9ɞ22!(3+3GGQQo dS999ƚƍƍf}>BBqqMKl6Hp+L.ǩ񅅅Pz9tB: ''OO޺ȧܗV|!ww.㚞#H00LJɍSS[Sϻe:>æͪ[ViVwe")==_>ڙIIIȧtOw22(|31Ԋ١LnnϻSOr8 JyfBrbMMMMll6˝.r K 79tڇqMҳu쥂O򴐲IȇVƞ#Z170iWWƓSS͍ LiEB>[<[wk"k)"ɥttڲڐڐtt썍22222o!|3%Lnn*D @@dOtt9`JJ#길* M llp7+R-?? FJO, ҕVVɍ򀐲IșVViԈ$#i`0ii[[SSiiiE:>ræ[<%%Q2!w""))")Ott,tttOO͍ww~~~o!!|3G^]ƥ ek@e rO`JJ#Z`ƞ9ssn. ''lll6P.r? بμ`OtM-!HHpƞL[O,ڿڐ>:-6V#Έ$$$G#J # ##Z[[99ii ;BO9ziQ!wek))卍OOOOOOOꂂS~~22HG$$O*D@@\\@d *99JZZJ#9D ~2'''l667P13|-r? ֱ;# J8됲ڐrw!|1&pQQ%%[łͦ,t>:h6Hz$ب%Z#ZZō9#  t9ZzQzpQ!!we"")")S͍[ƞƞ9ꂍSբp66h~p31{$$J[OD @ek\ k en㚚JZJZ9תSx2'''67PP13-ڧ? W` JX,I,31G1G&Փ[f}}À>:h6ب$JJ890; ڇi#Q&z&QQL))[S[[%%Ԋ_[S[䊰QUChMupp1G$#[ @Y@kkk eeeռZJ`9Se ('u7P&i->jq뗂X``X]`XtI,++G{T{TG_<ōy}}r6HTب5^^^]J8X; N q0771zբ===m[<%33Ԋ哓ccQQQH06hMMMl Q31G۸sD e@k kk__ƞOO׍Aek(|4Ҷ1P1->jq>r98988]]`ۂS)GGTTTT{)[fʫfrĒH1Tب5]^$^^J;; Nq N0777Ԋ_Փ<55m<œ<G+3cc_zpUNMMMhp&1G{`OۦfsDxdY@(k\\)_[89OæOSA4'uu7Pz:qjjq>O98]]8ȧO[䰟G$$TTTTTTfffffrEV71T$5^^^^]]/8XW; 6NNNP7{7<<<<<55<<œ<G{̋3"ͪ]]]/8,IItœ5$TTTTT$^cyffffEi0TT$=55^^^]J/8;;NjN67P7]<<<<Xer Ja GTDH8"n2ZoDve S^.evv9D"ce[dX =X Cr O,\;6<FPn M[JL<$7nK\ED8n$VnL]Uen8bNHB2`L&GW ]\BzXu\8ZH ;D":a Xa$QvSe(KLHPJOH,?_e@$TMeL0PX*A82&rL<0<L HT R\ =(D(r Sa3SXV\ c9@TB\ Ur6kUe GH 7n Iv"aeS(\$UD?T<ZH\avn(nnF\ J\Be BL7X Ba$OWraFnv PS.a@">T:Qiv<4L >H"4I\v MLTrT<0:;&Ln$]0inQ0<$PH8BaQ\YT HX*HAP@3T$JFL\I;@T?\ >V[D"8e@H3P:JeI\?V.\&` Sr [rLvM6qb(eT :"hPL>>4DtDvaMWvKLAaKP&Ee ErS<07H,AVYX Ga?[.\kzL ;XGeL=H"7 fv"kXL0TC4DbL9]S0TaBvPrjTv6s"w dHjL AJ0LD.CV\(aJo,vD"@T>aFcmDzCa.""peG_R"v,Vv hq l\}lj77MqBȶSSSfffOtI,,fˌcƦ?Ŗ#)@e .bMqq}}}rn!ܵ<5Ӻ<[XWԧ t}fss}I?I?Ƙ?O戡@@@@DDB  1[[J]P13+3+|42rr-rr> ٲde"eY D-UN#$7Z/]]GGG+4!(,,OˌÒ<**s*.|p%%[9Ə,}f}tr乹..;WWo d i6i ̇$TZ9JJ]]$G1G1{1|mm"(4W[[JZZ##0 NjMMMhLSSOt q?ư8a[<<<<[?ƏQ)ɡc湤r}* D !P0i99IƘ,t,t,},,,͹ii #; 0V!(e iH6X{1i#[[J]$$$$G1{1{1)Ӻ5mMMUlhtj??K88//]/MMhlVi99OOt?K88/g<[89Ʀ۲nLddddAS[[<[S[ySm==QHPPu Ƙ??K?K????ƦOSS wQz77FHHQH!wLīҚ&PH6Uś00HH nSNMUV9,tj`/gg<褹 D SA<<[<ÌՁA===_7PP6ϛN? N NNKK?????????Ƙ>O[S[L|QQ77777ppQL%z7H6Njś0#0䖤S[NN–ttt `JgmèIItrr**Rs R DDS[<<Ù[ը5=_Q17PPPH? NϛKK??K???KnAewQ#̼777p3p%ĺ҉zN0FH0A<VH6''lMMj śiQQ3)""ę%̇z)_Ӻ<[[ 66MUM.nSS[[tj 9))G$$$҉w!!|vvvvv# ĝ9Ot????OSS9OW;#ie-r????}tO*n.~2o Aqqj>א+GGG^VV8vvvv;v#`[[S9OƘ??tdnWW;0Qww-r?????ƳtO9͹oڜoSSS[[SOOˌcm_ĝtt-VQQܻH2lMM Ŗi3+"kddL_Ҟ^$$__===Ǥ ??ާ66'l'hn˨[[[>Bqqqtn׵+++GG68v [S9 ƦtODddǖ00Hw|w.-B??? N 9SSdoڜڜnՌSSÌOOՌSd_᫙XWُǠQHH!hU q i)3\%$$$^_ĝŧK?Nϑ'6'ˌ[[n-q>|++)%›UU`; #`X99 ?jqtt Ld ԯ0.-B?[deo(o~.nˌˤOO*Dde)%%##QQ|!26hhN蝝))"+iǝi)$$T$^JQQQiKNUl6uhU-O[[[-bBB-!|܊+3›NNNUNWXr:>N tt* oVbBq駧 ## NWWrr> On~~ԯ-b j鷷Ԅ #ddd -rOtt}t LdwQQzzzF0FQQpHV9[ӡi073G$$T]]w!Pu7 0l6ppPuu6lUN>>O[Sn-MqMH-Nj ԯWrBr: Nś000i99OO*n~hhUϷԷԷś-j ů F#J Rnrtt>r习|pQ70WǃwǝiQ7PP0i[[<$$$$$J#V77PH 066!HܻHull 9n-:MqqjUl6Hpp嵵w0WWWWW>>BBqN N0ČChUUNN鷛VV› ; 7v#SAADD*Or.w!!!HHFF7 śǝ71PPPi%[Ò#0P$$^^]vJ`iVбPх7PHH7p7pQ3|Qp&H6NN tOr::MMjNUl613i0#0ii`6U:>q jjś0pzQ#Sr>BMMMUN雛VVVW;F#SSDOOOOOO膆>!pp0#0핕 ņņ#7PPҫ[[Sǝi#07{$$]/ `XVuP1117PPѻQQ3&3&N t>qjjj67&133333Q&Z 6bqqq 0H77Qi[˂>qqMMM M? śVVW;idxA888͌Č.>rw!дH0 Ƨ? ii7Sˌ9i77{$$$^J/J8Xu11{{QQi0NާN jjNz&3҇7 6lqj 0z%[[[OtqqqqqqqƦ EVi Z%@d Sˍ8/8/8[[%ĝrrQppp0 ާIKKjNz[礤ǃ&&{T$$J<8Xٛ'Hp11$TTGĝiNKNN jƘjjNiiz)G{$$$ ś6lN 077#[[OtƒVw6;v㼺%"eexSS8/`/J[׉נǠiQppH ;;0 ޕK?KNU1ꇺnwQ3G1${$[:h1{$TT$ʮN KNN?KKN#$TTT$$$$ 핛lNj K?Kޯ00Hi[S[[9X9ttt,tVw` v YdA8<`/]/<Ү33.Q&&pp0## 000ާK?K??0$$$Čnɵ3++GG$G[Or¿p&{$T$TTT+ >qNKKNKKK Wǝ]^$$T$TT$$$6훛ŧ핕0099S[[[Xt,t9ǝ!w!6' FJJ"@k dN KNKNKKKKK 9[<^$$T^^$^t00000ŷ޷lϯ[[ę#J`ǂOOOO''6FJ@e@@⺺JJm)GGG33QLL%)G##Q0???Mi$.ͤɵɵ҉_ČnwQ3G{T$$TTʊ NNNN t[<^^^̎]0# KlUՌ[%Z҉#`ǂ炂[i6uFF J<@e""Ӻ5=3G11GpzנL_GG$GҼzziiK?jj Ni$z%\ɵe׉%%ī eɮ+GG{{${T{{{{ʊeLD9ާN qMMlK tO9J]]]JO[ęҙ˂[J``iV'uu7J_=__m_=ҮG1&L_)$$$$$7z&Vϛŧ `v7̉ĝ)LL%%%QQɵ3++{G{G{GG{{ʊe 99ŧާśMUlMl?O[<ӫ7PPPu'lUN>OS<_)GG{Һ<rO[$T$//`8,,>ppiZ]/]]]]]]JzQQQ[[Z7&7Hpw2woɐ"")z1||4(4o|||pwr,88vvF̼##9Oˌ[[[[Lw(劊Q3|נ..-b ƲiQQ3נ--rrOt00[[ęiPPPPOÙ$$]]]]888,ttr.~2QJJ]]]J#VVVVi99#&1pQ||!()_zQ&Q(((4|||wȀ8vv###iXO[Í<[[w!!|܊||!|nnnn--:bNNNNƏQ33w.n-褤ͨSSD},t000èSˌ9i0## 0PH0睝$]]]]]]v8IIt..|w]]JiEEE&33||+++%###QQ|((k((|V; 0XWُ,O˨3333G3Ҽ##`iiikkkwtزWWƏIO[J/<[9~w((w9˂rr:MMMUUllN}fQQ|!!nnˌSSOO00ů 0F# 0䖖i 7]88I*nRw$# NjNjj >׮Q1ʅ&##0Xi"""e"">t,,WŏS<<[9:hho(\\(o99[8:MMMM l''lUe|w!~-͌S[<ᡡ@99X 07Ot##  $]]]]88Itt**nRL)^$$$7#Xj?MMQ|QQ111770#;dQVi䛆}tt,WWn[[[89:MbCo\\ww[9- l '''6'Uȶ w222~nS<ӡ[[[`i007ըtW0`##ٯ FF]]8,Ƙ***%%$T{700??MMUwpp7P17 09ASVE tt>> W;;;E[>Mb-(\+9[Ǣ~'''hMs 22~.[ÒmәJ#`0;007˨ͨDSSDͤ#J# i;;;vF]]`8,Ʀ礤[ĺ$$󅅅7#j??MUh..ǃV77P0䝌[Aͤ9ǖ0 r::: F ;K;VL[[9>>Mbb-((!Vn9w22~ *R.222Ē<<]J000 #SA拈 ttt`JJ]#`ԯ;;v] ` ٖ99ǹ9#${󅅅#KKMUU-n-:P709˂WVVH7ĒSˤ:~!!|ܵ|w.w2򱱱' .2222LS[҇#`;00fSAd"edd }tt9[JJ`Wԯv ]J W ##ĝ9X#̅77KNKUU-:Br uu09O ŷlVw!pPPP0iĒS9n|Qw.nǜw4ڱ򱱱~22222撒[S%҇$$$$JXO*"e@k@d*r}[ŧ88J]^^#`##i%ǿ0 #7$77#ENKNUUNNq ޯ666u6X9O,t ާ6pHхę[[2uлLnn.!|44442222222S[˂O褝҇T{$̝trekkke  L 888JJ$̇#0#;007QVV›W 7$$HUKNNNNϛ ?Ku##i9OtjƧN޷66Hp1хi<[!劊no!4442222222222 ttti{9Or -\\\ked **UMMMKƸ888//>نE07PP70'!|||e sso'M88`888vJ]${1zQzzi6u'lU#]VVhUM:俖ٛƧ?tإtWii# JJ<8Otl6Hp1&000 PP7H&&&H4(\"""c[Sɵ\\\(\ɠ:C UMMMMN>蛖--VH77P77 Vuu|LDs*o!4'lM 88`88/8` Z1G1GG3҉ii066uuu'U>99 -. ƦttOOWW;#JJJqqMMNEii7F;000uuH!!ͤ*n!2'lMŲ88`X#G1G3%ĝi6u666>>[әǿ-.ǃ O˂WJJ8O?NϷ00W00HHHu!!Q)҇p7H|4||((eec[99eddettBtr>qjMϛwVEV0 ߴP7HpO-2б'' Uizz3333ǝV0H6Ur[[nnنtO炨99E[Ot? śنi2|++GGQpz||!(w dd[99SOOt,}t}t}qMlH&QɠԄPPP7pĹ9r-~2'lUԸٖQQQQQiQHH茌S9LLei䆆>tO[[[iEVLd5=ә9Iq qt9ǝ22!(3+3GGQQo dS999ęČČf}}}>BBqqMKl6Hp+L.ŧޯ턄Pz9tB: ''OO۸ƦٖV|!ww.#H00ņnjSS[S͹e:>}˨[ViVwe")==_>IIIƦtOw22(|31҉נLnn͹SOr8 JyfBrbMMMMll6ɜ.r K 79tqMбu褂OIƆVĝ#Z170iWWĒSSˌ LiEB>[<[wk"k)"Ǥtttt茌22222o!|3%Lnn*D @@dOtt9`JJ#綶* M llp7+R-?? FJO, ДVVnjIƘ迿VVi҇$#i`0ii[[SSiiiE:>r[<%%Q2!w""))")Ott,tttOOˌww~~~o!!|3G^]Ĥ ek@e rO`JJ#Z`ĝ9ssn. ''lll6Pɾ.r?駯 T̺`OtM-!HHpĝL[O,}>:-6V#̇$$$G#J # ##Z[[99ii ;BO9ziQ!wek))⌌OOOOOOO炂S~~22HG$$O*D@@\\@d *99JZZJ#9D ~2'''l667P13|-r? ԯ;# J8rw!|1&pQQ%%[Â˥,}}t>:h6Hz$TTT%Z#ZZÌ9#  t9ZzQzpQ!!we"")")Sˌ[ĝĝ9炌Sӡp66h~p31{$$J[OD @ek\ k enJZJZ9ըSx2'''67PP13-? W` JX,I,31G1G&Ӓ[f}}}}>:h6T$JJ890; i#Q&z&QQL))[S[[%%҉_[S[ቮQUChMupp1G$#[ @Y@kkk eeeӺZJ`9Se ('u7P&i->jqٲX``X]`XtI,++G{T{TG_<Ìy}}}r6HTT5^^^]J8X; N q0771zӡ===m[<%33҉⒒ccQQQH06hMMMl Q31GضsD e@k kk__ĝOOՌAek(|4д1P1->jq>r98988]]`؂S)GGTTTT{)[fȩfr‘H1TTTT5]^$^^J;; 핷Nq N0777҉_Ӓ<55m<Ò<G+3cc_zpUNMMMhp&1G{`OإfsDxdY@(k\\)_[89OOSA4'uu7Pz:qjjq>O98]]8ƦO[ᮞG$$TTTTTTfffffrEV71TT$5^^^^]]/8XW; 6NNNP7{7<<<<<55<<Ò<G{ʊ3"˨]]]/8,IItÒ5$TTTTTT$^cyffffEi0TTTTTTT$=55^^^]J/8;;񄄅NjN67P7]<<<<Sc7B4IZ? !-Z7R J:Z g( VJ>0-c;Uk> Z AZ)-k2:s-RZQN3N) g({J12-3F c ('B2cR : c/DcREZ2c3s$>9+)#B!s {'R%RoP7R2 > :!fw s V'k6$Z:B.AFA&>,/ZIJ PZ8F*%N9.)g+2($B(J R":" g-V5{!/R #+6JR 6g1s Z > c#k)ZI$%R :J%GR@Ok7c$c R R Z#B#N,c V*O{a]c? k#JV)"66J3@k2B$>.FR k&*J g(2(BA! c#,Ec/(2s!0>4HVJ s( J %N07F6 J ,BR(6J R{%iw {.:%Z>3F6Z1R?R)#G {3 g g1k1@8Z$ J; s3B7:,Ok>DVMk BV!F$ Z g'(2,&>)s/ {2N&V7R)LoB(ZZ?B>* )$kZsP?J*2:,?Bjs4J*kV*k+g s-@k10s .B`B!4B*+:'MR$V Fk(:J"g.V# 5`o>;V)B6Z( :kk({Uk j Taʋ77MrB˹SSSgggOuI,,gΎdɨ?Ș#)@f .cMrrۄso!<5ֽ<\XWת u~gttI?I?ɚ۶۶ۑ?Oꊣ@@@@DDB  1\\J^P13+3+}42ss-ss> ef"fY D-UN#$7[/^^GGG+4!(,,OΎƔ<**t*.}q%%\9ɑ,g۳us輼..;WWp e j6j ω$T[9JJ^^$G1G1|1}nn"(4W\\J[[##0 NkMMMiLSSOu r?ɳ8b\<<<<\?ɑQ)̣d꼦sĄ* D !P0j99Iɚ,u,u,,,,мjj #; 0V!(f jH6X|1j#\\J^$$$$G1|1|1)ֽ5nMMUmiŸuk??Z88//^/MMimVj99OOuۚ?Z88/h<\89ɨoLeeeeAS\\<\S\zSn==QHPPv ɚ??Z?Z????ɨOSS xQ{77FHHQH!xLǮ՜&PH6Uȝ00HH oSNMUV9,uka/hh<쑑 D SA<<\<Ǝ؂A===`7PP6ҝN? N NNKK?????????ɚ>O\S\L}QQ77777qqQL%{7H6Nkȝ0#0蘦S\NNŘuuu aJhnƫ쑑IIuss**Rt R DDS\<<ƛ\ث5=`Q17PPPH? NҝKK??Z???ZoAfxQ#Ͽ777q3q%ǽՋ{N0FH0A<VH6''mMMk ȝjQQ3)""Ǜ%ω{)`ֽ<\\ 66MUM.oSS\\uk 9))G$$$Ջx!!}wwwww# ǟ9Ou????OSS9OW;#jf-sۨ????ۄuħO*o.2p Arrk>ڒ+GGG_VV8wwww;w#a\\S9Oɚ??uĦeoWW;0Qxx-sۨ?????ۑuO9мpޞpSSS\\SOOΎdn`ǟuu-VQQH2mMM Șj3+"leeL`ՠ_$$``===ʦ ??66'm'ioΫ\\\>Brrruoڸ+++GG68w \S9 ɨuODeeʘ00Hx}x.-B??? N 9SSepޞޞo؎SSƎOO؎Se`宛XWݑʢQHH!iU r j)3]%$$$_`ǟȪK?Nғ'6'Ύ\\o-r>}++)%ŝUUa; #aX99 ?kruu Le ײ0.-B?\efp(p.oΎΦOOħ*Def)%%##QQ}!26iiNퟟ))"+jʟj)$$T$_JQQQjKNUm6viU-O\\\-cBB-!}+3ŝNNNUNWXs:>N uuħ* pV€cBr ## NWWss> Ooײ-c k׆ #eee -sħOuuu LexQQ{{{F0FQQqHV9\֣j073G$$^^x!Pv7 0m6qqPvv6mUN>>O\So-MrMH-Nk ײWsBs: Nȝ000j99OO*o¤iiUҺ׺׺ȝ-k Ȳ F#J Rosuħuۑ>s輢}qQ70WʅxʟjQ7PP0j\\<$$$$$J#V77PH 066!HHvmm 9o-:MrrkUm6Hqq鸸x0WWWWW>>BBrN N0ǎCiUUNNVVŝ ; 7w#SAADD*Ođs.x!!!HHFF7 ȝʟ71PPPj%\Ɣ#0P$$__^wJajVӴPԇ7PHH7q7qQ3}Qq&H6NN uOs::MMkNUm613j0#0jja6U:>r kkȝ0q{Q#Ss>BMMMUNVVVW;F#SSDOOOOOO툈ۑ>!qq0#0򗗺 ȈȈ#7PPծ\\Sʟj#07|$$^/ aXVvP1117PPԾQQ3&3&N u>rkkk67&133333Q&[ 6crrr 0H77Qj\΃>rrMMM M? ȝVVW;jeyA888Ўǎ.>sx!ӷH0 ɪ? jj7SΎ9j77|$$$_J/J8Xv11||QQj0NN kkN{&3Չ7 6mrk 0{%\\\Ourrrrrrrɨ EVj [%@e SΏ8/8/8\\%ǟssQqqq0 IZZkN{\릦ʅ&&|T$$J<8Xݝ'Hq11$TTGǟjNKNN kɚkkNjj{)G|$$$ ȝ6mN 077#\\OuۚۚŅVx6;w翽%"ffySS8/a/J\ڋڢʢjQqqH ;;0 ◪Z?ZNU1oxQ3G1$|$\:i1|$TT$ͱN KNN?KKN#$TTT$$$$ mNk Z?Kⲗ00Hj\S\\9X9uuu,uVxa w YeA8rNKKNKKK Wʟ^_$$$$$$6򝝝Ȫ0099S\\\Xu,u9ʟ!x!6' FJJ"@l eN KNKNKKKKK 9\<_$$__$_u00000ȺmҲ\\Ǜ#JaʃOOOO''6FJ@f@@潽JJn)GGG33QLL%)G##Q0???Mj$.Ц̸̸Ջ`ǎoxQ3G|T$$TT͌ NNNN u\<___ϐ^0# KmU؎\%[Ջ#aʃ냃\j6vFF J<@f""ֽ5=3G11Gq{ڢL`GG$Gտ{{jjK?kk Nj${%]̸fڋ%%Ǯ f̱+GG||$|T||||͌fLD9N rMMmK uO9J^^^JO\Ǜ՛΃\JaajV'vv7J`=``n`=ձG1&L`)$$$$$7{&VҝȪ aw7ϋǟ)LL%%%QQ̸3++|G|G|GG||͌f 99Ȫ⪝ȝMUmMm?O\<֮7PPPv'mUN>OS<`)GG|ս<sO\$$//a8,,>¤qqj[^/^^^^^^J{QQQ\\[7&7Hqx2xp̒""){1}}4(4p}}}qxs,88wwFϿ##9OΎ\\\\Lx(錌Q3}ڢÞ..€-c jQQ3ڢ--ssOu00\\ǛjPPPPOƛ$$^^^^888,uus.2QJJ^^^J#VVVVj99#&1qQ}}!()`{Q&Q(((4}}}xˁ8ww###jXO\Ə<\\x!!}}}!}oooo--:cNNNNɑQ33x.o-ЫSSDĄ,u000ƫSΎ9j0## 0PH0럟$^^^^^^w8IIu..}x^^JjEEE󘟮&33}}+++%###QQ}((l((}Vā; 0XWݑ,OΫ3333G3տ##ajjjlllxuāܵWWɑIO\J/<\9¤x((x…9΃ss:MMMUUmmNۄgQQ}!!ooΎSSOO00Ȳ 0F# 0蘘j 7^88I*oRx$# NkNkk >ڱQ1͇&##0Xj"""f"">u,,WȑS<<\9:iip(]](p99\8:MMMM m''mUħf}x!-ЎS\<壣@99X 07Ou##  $^^^^88Iuu**oRL)_$$$7#Xk?MM…Q}QQ111770#;eQVj蝈uu,WWo\\\89:McCžp]]xx\9- m '''6'U˹ âx222oS<֣\\\aj007ثuW0a##ݲ FF^^8,ɚۑħ***%%$T|700??MMU¤xqq7P17 09ASVE uu>> W;;;E\>Mc-(]+9\ʤ'''iMt 22.\Ɣn֛J#a0;007ΫЫDSSDЦđ옟#J# j;;;wF^^a8,ɨ릦\ǽ$$7#k??MUi..ʅV77P0蟎\AЦ9ʘ0 s::: F ;Z;VL\\9>>Mcc-((!Vo9x22 *R.222ǔ<<^J000 #SAꍊ uuuaJJ^#aײ;;w^ a ݘ99ʼ9#$|#KKMUU-o-:P709΃WVVH7ǔSΦ:!!}}x.Þx2' .2222LS\Չ#a;00gSAe"fee Ąuu9\JJaWײw ^J W ##ǟ9X#χ77KNKUU-:Bs vv09Ođ ȺmVx!qPPP0jǔS9o¤}Qx.oʞx4޴22222ꔔ\S%Չ$$$$JXO*"f@l@e*sĄħ\Ȫ88J^__#a##j%0 #7$77#ENKNUUNNr 666v6X9O,u 6qHԇǛ\\2vӾLoo.!}44442222222S\΃OՉT|$ϟusflllf ħ L 888JJ$ω#0#;007QVVŝW 7$$HUKNNNNҝ ?Kv##j9OukɪN66Hq1ԇj<\!錌op!4442222222222 uuuj|9Os -]]]lfe **UMMMKɻ888//>݈E07PP70'!}}}f ttp'M88a888wJ^$|1{Q{{j6v'mU#^VViUM:˜ݝɪ?uܧuWjj# JJ<8Oum6Hq1&000 PP7H&&&H4(]"""d\S̸]]](]̢:C UMMMMN>흘--VH77P77 Vvv}LDt*p!4'mM 88a88/8a [1G1GG3Ջjj066vvv'U>99 -.˜ ɨuuOOWW;#JJJrrMMNEjj…7F;000vvH!!Ц*o!2'mM88aX#G1G3%ǟj6v666>>\֛-.âʅ O΃WJJ8O?NҺ00W00HHHv!!Q)Չq7H}4}}((ffd\99feefuuBus>rkMҝxVEV0 㷷P7HqO-¤2Ӵ'' Uj{{3333ʟV0H6Us\\ooÅ݈uO냫99E\Ouۨ? ȝ݈j2}++GGQq{}}!(x ee\99SOOu,uurMmH&Q̢׆PPP7qǼ9s-2'mU׻ݘQQQQQ䎟jQHH펎S9LLfj˜興>uO\\\jEVLe5=֛9ۚIr ru9ʟ22!(3+3GGQQp eS999Ǜǎǎg~>BBrrMKm6Hq+L.Ȫ򆆆P{9uB: ''OO߻ɨݘV}!xx.䛟#H00ȈʎSS\Sмf:>ħΫ\VjVxf")==`>ۚIIIɨuOÞx22(}31ՋڢLooмSOs8 JzgBscMMMMmm6̞.s K 79uۈrMӴvO󵑳IɈVǟ#[170jWWǔSSΎ LjEB>\<\xl"l)"ʦuu۳ۑۑuu펎22222p!}3%Loo*D @@eOuu9aJJ#빹* M mmq7+R-?? FJO, ӖVVʎ󁑳Iɚ¤VVjՉ$#ja0jj\\SSjjjE:>sħ\<%%Q2!x""))")Ouu,uuuOOΎxxp!!}3G_^Ǧ fl@f sOaJJ#[aǟ9tto. ''mmm6P.s? ٩ϽaOuM-!HHqǟL\O,ۑ>:-6V#ω$$$G#J # ##[\\99jj ;BO9{jQ!xfl))掎OOOOOOO냃S22HG$$O*D@@]]@e *99J[[J#9D 2'''m667P13}-s? ײ;# J8쑳ۑsx!}1&qQQ%%\ƃΧ,u>:i6H{$٩%[#[[Ǝ9#  u9[{Q{qQ!!xf"")")SΎ\ǟǟ9냎S֣q66¤iq31|$$J\OD @fl] l fo䛛J[J[9ثSy2'''67PP13-ۨ? Wa JX,I,31G1G&֔\g~~ā>:i6٩$JJ890; ۈj#Q&{&QQL))\S\\%%Ջ`\S\勱QUCiMvqq1G$#\ @Y@lll fffֽ[Ja9Sf ('v7P&j->kr옃XaaX^aXuI,++G|T|TG`<Ǝz~~s6HT٩5___^J8X; N r0771{֣===n\<%33Ջ攔ddQQQH06iMMMm Q31GܹtD f@l ll``ǟOO؎Afl(}4ӷ1P1->kr>s98988^^a܃S)GGTTTT|)\gˬgsœH1T٩5^_$__J;; Nr N0777Ջ`֔<55n<Ɣ<G+3dd`{qUNMMMiq&1G|aOܧgtDyeY@(l]])`\89OħOSA4'vv7P{:rkkr>O98^^8ɨO\屠G$$TTTTTTgggggsEV71T$5____^^/8XW; 6NNNP7|7<<<<<55<<Ɣ<G|͌3"Ϋ^^^/8,IIuƔ5$TTTTT$_dzggggEj0TT$=55___^J/8;;NkN67P7^<<<< #include #include #include #include #include "netmaze.h" /* if your machine doesn't support I_FLUSH, you have to #undef HAVE_FLUSH * in this case you also should reduce the BLOCK_SIZE to 256 or 512 */ /* #define SS10_AUDIO */ /* ss10-audio = 16bit signed linear samples at 22khz */ /* #define SIMPLE_AUDIO */ /* simple-audio = 8K-Ulaw-Samples on /dev/audio */ /* #define HP_LINEAR */ /* 8bit signed linear at 8khz on /dev/audioBL */ /* #define NCD_AUDIO */ /* not supported yet */ /* #define SGI_AUDIO */ /* not supported yet */ #ifdef USE_SOUND #if (!defined(SS10_AUDIO) && !defined(HP_LINEAR) && !defined(NCD_AUDIO)) #define SIMPLE_AUDIO #endif /* hp (or general sys5?) doesn't support I_FLUSH/ioctls */ #ifdef HP_LINEAR #undef HAVE_FLUSH #define BLOCK_SIZE 256 #else /* if you flush the audio-device, it clears the non-played data */ #define HAVE_FLUSH /* you have to test out the blocksize ... large as possible */ #define BLOCK_SIZE 4096 #endif #endif #ifdef HAVE_FLUSH #include #endif #ifdef SS10_AUDIO # include #endif /* depends on soure/destination-sample-rate */ #ifdef SS10_AUDIO #define MUL (5) #else #define MUL (2) #endif /* test */ #define BLOCKDEVICE O_NDELAY extern struct shared_struct *sm; struct sample { long start; long len; char name[20]; }; #ifdef USE_SOUND # ifdef NCD_AUDIO static AuServer *aud; char *auservername = NULL; # endif # ifdef SS10_AUDIO audio_info_t ainfo; # endif static int read_data(char *f,int type); static int lin_to_au(int lin16); static char *data,*pnt; static int plen,len; struct sample *sinfo; #endif static int audio=-1; int playit = 0; static int play_delay=MUL; enum { AUDIO_8UL , AUDIO_8ULAW , AUDIO_16SL }; void kick_audio(void); int init_audio(void) { #ifdef USE_SOUND int type; if(!sm->usesound) return -1; #if defined(HP_LINEAR) if(read_data(AUDIOPATH,AUDIO_8UL) ) audio = open("/dev/audioBL",O_WRONLY|BLOCKDEVICE); /* test */ if(audio == -1) sm->usesound = 0; #elif defined(SIMPLE_AUDIO) if(read_data(AUDIOPATH,AUDIO_8ULAW) ) audio = open("/dev/audio",O_WRONLY|BLOCKDEVICE); if(audio == -1) sm->usesound = 0; #elif defined(SS10_AUDIO) if(read_data(AUDIOPATH,AUDIO_16SL) ) { audio = open("/dev/audio",O_WRONLY|BLOCKDEVICE); if(ioctl(audio, AUDIO_GETDEV, &type)) audio = -1; if(type == AUDIO_DEV_UNKNOWN || type == AUDIO_DEV_AMD) audio = -1; AUDIO_INITINFO(&ainfo); ainfo.play.encoding = AUDIO_ENCODING_LINEAR; ainfo.play.channels = 1; /* 8000, 9600, 11025, 16000, 18900, 22050, 32000, 37800, 44100, 48000 */ ainfo.play.sample_rate = 22050; /* 44100 */ ainfo.play.precision = 16; if(ioctl(audio, AUDIO_SETINFO, &ainfo)) audio = -1; ioctl(audio, AUDIO_GETINFO, &ainfo); printf("rate: %d\n",ainfo.play.sample_rate); printf("channels: %d\n",ainfo.play.channels); printf("precision: %d\n",ainfo.play.precision); printf("encoding: %d\n",ainfo.play.encoding); } if(audio == -1) sm->usesound = 0; #elif defined(NCD_AUDIO) audio = -1; aud = AuOpenServer(auservername, 0, NULL, 0, NULL, NULL); if (!aud) { fprintf(stderr, "Can't connect to audio server\n"); sm->usesound = 0; } #endif fprintf(stderr,"audioopen: %d\n",audio); #endif return audio; } void play_sound(int num) { #ifdef USE_SOUND if(sm->usesound) { #ifdef HAVE_FLUSH ioctl(audio, I_FLUSH, FLUSHW); /* clear buffer */ #endif plen = (play_delay*(sinfo[num].len-sinfo[num].start)) & 0xfffffff0; pnt = data+(sinfo[num].start*play_delay & 0xfffffff0); kick_audio(); playit=1; } #endif } void kick_audio(void) { #ifdef USE_SOUND int l; if(!playit || audio<0 ) return; if(plen > BLOCK_SIZE) l = BLOCK_SIZE; else l = plen; plen -= l; write(audio,pnt,l); pnt += l; if(plen == 0) playit = 0; #endif } #ifdef USE_SOUND static int read_data(char *f,int type) { FILE *fd; unsigned char junk[8]; int i,j,a,delay; long blen,pos; unsigned char c; delay = play_delay; if(type == AUDIO_16SL) { play_delay<<=1; } fd = fopen(f,"r"); if(fd == NULL) { fprintf(stderr,"Can't load soundsamples.\n"); return 0; } fread(junk,1,8,fd); len = ((int)junk[4]<<8)+junk[5]; sinfo = (struct sample *) calloc(len,sizeof(struct sample)); for(i=0;i=0;i--) for(j=0;j=0;i--) { a = lin_to_au( (int) ((unsigned char) (data[i]<<1) - 0x80) << 8) ; for(j=0;j=0;i--) for(j=0;j>8; data[i*play_delay+j*2+1] = a; } break; } return 1; } static int lin_to_au(int lin16) { double d,j; float m=26; int c; j = (double) lin16 / 256; if(j <0) { d = log((double)-j)*m; c = d; c |= 0x80; } else if(j>0) { d = log((double)j)*m; c = d; } else c = 0; c = (~c) & 0xff; return c; } #endif netmaze-0.81+jpg0.82.orig/CHANGES0100600000175000017500000000066705553507015016362 0ustar jgoerzenjgoerzenChanges since 0.71: Some changes in the netprotocoll. (DON'T RUN WITH OLDER VERSIONS!) Experimental audio support using /dev/audio. (ugly quality of the samples) For >= 8bit color-machines: Experimental texturemapping at the walls and the floor. (option: -texture) Cameramode. Two new robots written by others (see CREDITS) ----------------- Still in progress: the rewritting of the netserv. (maybe it has some new bug-'features') netmaze-0.81+jpg0.82.orig/follower.c0100600000175000017500000000743005551540670017361 0ustar jgoerzenjgoerzen/* * follower bot * written and copyrights: roderick@ksu.ksu.edu (Mike Roderick) */ #include "netmaze.h" #include #define PI 3.141592 extern struct shared_struct *sm; /******************* * the init_robot is called one time right after the start */ void init_robot(void) { strcpy(sm->ownname,"Follower2"); strcpy(sm->owncomment,"Look Behind You"); } void start_robot(void) { printf("Here We Go Again\n"); printf("The number of players in this game is: %d\n",sm->anzplayers); } /******************* * the own_action is called every 'beat' * * this bot really is a dummy, I use this guy * to test my program with 31 'players'. */ int own_action(void) { int ret=0; int chase; static int prtcntr = 0; int me; int angle; int mangle; int mag,dir; int updown; int shot; me = sm->shownumber; if(sm->playfeld[me].fitness < 800) updown = JOY_DOWN; else updown = JOY_UP; mangle = sm->playfeld[me].winkel; /* get my angle */ chase = whos_close(me); /* who should I chase */ if (chase == -1) return 0; angle = what_ang(chase , me); /* what is the target's agnle */ if((sm->playfeld[me].fitness<800)&&sm->playfeld[me].team!=sm->playfeld[chase].team) updown = JOY_DOWN; else updown = JOY_UP; if (!(abs(angle-mangle)<6) || sm->playfeld[me].team == sm->playfeld[chase].team) shot = 0; /* hold your fire */ else shot = JOY_BUTTON; /* shoot them */ dir = angle - mangle; mag = abs(dir); if (((dir < 0) && (mag < 128)) || ((dir > 0) && (mag >= 128))) { ret = JOY_LEFT | updown | shot; } else if (((dir > 0) && (mag < 128)) || ((dir < 0) && (mag >=128))) { ret = JOY_RIGHT | updown | shot; } else { ret = updown | shot; } /* if ( sm->playfeld[me].fitness < 800 ) updown = JOY_DOWN; else updown = JOY_UP; if (!(( angle - mangle < 6 ) && ( angle - mangle > -6 ))) shot = 0; else shot = JOY_BUTTON; if ( angle > mangle ) { ret = JOY_RIGHT | updown | shot; } else if ( angle < mangle ) { ret = JOY_LEFT | updown | shot; } else { ret = updown | JOY_BUTTON; } */ if(prtcntr++ > 10&&0) { prtcntr = 0; printf("chasing opponent: %d at angle: %d My angle: %d\n",chase,angle,sm->playfeld[me].winkel); } return ret; } int whos_close(int me) { int i; int dist=999999999; int temp; int close=-1; for( i = 0 ; i < (sm->anzplayers) ; i++ ) { if( i == me ) continue; temp = get_dist( i , me ); if((dist > temp) && (sm->playfeld[i].alive) && (sm->playfeld[i].team != sm->playfeld[me].team)) { dist = temp; close = i; } /* else if (dist == -1) { dist = 999999999; close = i; } */ } return close; } int get_dist(int a, int b) { int tmp1; int tmp2; int difx; int dify; int dist; double dx,dy,di; tmp1 = sm->playfeld[a].x; tmp2 = sm->playfeld[b].x; difx = tmp1 - tmp2; tmp1 = sm->playfeld[a].y; tmp2 = sm->playfeld[b].y; dify = tmp1 - tmp2; dx = (double) difx; dy = (double) dify; dx *= dx; dy *= dy; di = sqrt(dx+dy); dist = (int) di; return dist; } int what_ang(int target , int me) { int ang; int difx; int dify; double an; double dx; double dy; int tmp1; int tmp2; double tmp3; tmp1 = sm->playfeld[me].x; tmp2 = sm->playfeld[target].x; difx = tmp1 - tmp2; dx = (double) difx; if (dx == 0.0) dx = 1.0; tmp1 = sm->playfeld[me].y; tmp2 = sm->playfeld[target].y; dify = tmp1 - tmp2; dy = (double) dify; tmp3 = dy/dx; an = -atan(tmp3); an = (an/(2.0*PI))*256.0; ang = (int) an; if ( difx < 0 ) ang += 63; else ang += 191; if ( ang > 255 ) ang -= 256; return ang; }