koules1.4/ 40755 37512 310 0 6501010051 7127 5ustar koules1.4/Icon.xpm100644 37512 310 7076 6477322207 10701 0ustar /* XPM */ static char *aa[] = { /* width height num_colors chars_per_pixel */ " 29 33 91 2", /* colors */ ".. c #000000", ".# c #ffffff", ".a c #c06077", ".b c #60303b", ".c c #ff86a7", ".d c #080800", ".e c #101000", ".f c #181800", ".g c #202000", ".h c #282800", ".i c #303000", ".j c #383800", ".k c #404000", ".l c #484800", ".m c #505000", ".n c #585800", ".o c #606000", ".p c #686800", ".q c #707000", ".r c #787800", ".s c #808000", ".t c #888800", ".u c #909000", ".v c #989800", ".w c #a0a000", ".x c #a8a800", ".y c #b0b000", ".z c #b8b800", ".A c #c0c000", ".B c #000008", ".C c #000010", ".D c #000018", ".E c #000020", ".F c #000028", ".G c #000030", ".H c #000038", ".I c #000040", ".J c #000048", ".K c #000050", ".L c #000058", ".M c #000070", ".N c #000080", ".O c #000090", ".P c #000098", ".Q c #0000a0", ".R c #0000a8", ".S c #0000b0", ".T c #0000b8", ".U c #0000c8", ".V c #0000d8", ".W c #0000e0", ".X c #0000e8", ".Y c #0000f0", ".Z c #0000f8", ".0 c #f8b0b0", ".1 c #f09898", ".2 c #e88080", ".3 c #e06464", ".4 c #d84c4c", ".5 c #d03030", ".6 c #c81818", ".7 c #c00000", ".8 c #b80000", ".9 c #b00000", "#. c #a80000", "## c #a00000", "#a c #980000", "#b c #900000", "#c c #880000", "#d c #800000", "#e c #780000", "#f c #700000", "#g c #680000", "#h c #600000", "#i c #580000", "#j c #500000", "#k c #480000", "#l c #400000", "#m c #380000", "#n c #300000", "#o c #280000", "#p c #200000", "#q c #180000", "#r c #080000", "#s c #f8f8e0", "#t c #f0f0c0", "#u c #e8e8a0", "#v c #e0e080", "#w c #d8d860", "#x c #d0d040", "#y c #c8c820", /* pixels */ ".G.F.I.I.J.J.H.G.F.E.H.J.H.H.E.E.H.J.H.F.I.F.I.J.H.J.J.I.E", ".I.I.H.F.I.J.I.F.D.G.H.J.J.I.F.G.H.G.G.G.F.I.J.J.F.J.J.I.I", ".H.H.I.J.F.I.H.H.D.D.H.J.J.H.E.D.D.G.E.I.G.F.H.J.H.H.I.H.I", ".H.G.G.H.H.H.H.H.E.C.H#s#s#s#t#u#u#v.D.I.I.I.F.H.H.H.J.H.I", ".G.G.I.I.H.I.H.J#s#s#s#s#s#s#t#t#u#v#w#x.A.G.G.H.G.J.G.I.J", ".J.H.H.G.E.J.F#s#s#s#s#s#s#s#t#t#u#v#w#x.A.z.F.E.F.J.F.G.H", ".H.J.H.H.H#t#t#s#s#s#s#s#s#s#t#t#u#v#w#x.A.z.x.v.F.E.G.G.F", ".I.J.J.I#u#u#t#s#s#s#s#s#s#s#t#u#u#v#w#y.A.y.x.v.t.I.I.G.E", ".H.F.G.H#v#u#t#t#s#s#s#s#s#t#t#u#v#w#x#y.A.y.w.v.t.I.J.H.E", ".F.G.E#w#v#u#u#t#t#t#t#t#t#t#u#u#v#w#x.A.z.y.w.u.s.q.J.H.H", ".D.D#y#x#w#v#u#u#u#t#t#t#u#u#u#v#w#x#y.A.y.x.v.t.r.p.n.I.I", ".F.D.A#y#x#w#v#v#u#u#u#u#u#v#v#w#x#y.A.z.y.w.u.t.r.p.m.H.G", ".G.G.z.A#y#x#w#w#v#v#v#v#v#w#w#x#y.A.z.y.x.v.t.s.q.o.l.F.I", ".I.x.y.z.A#y#x#x#w#w#w#w#w#x#x#y.A.z.y.x.w.u.s.r.p.n.k.i.I", ".H.w.x.y.z.A.A#y#y#x#x#x#y#y.A.A.z.y.x.w.u.t.r.p.n.l.j.h.J", ".I.u.w.x.y.y.z.A.A.A.A.A.A.A.z.y.y.x.w.u.t.r.q.o.m.k.i.f.F", ".G.t.u.v.w.x.y.y.y.z.z.z.y.y.y.x.w.v.u.t.r.q.o.m.k.i.g.e.F", ".I.r.s.t.u.v.w.w.x.x.x.x.x.w.w.v.u.t.s.r.q.o.n.l.j.h.e...F", ".H.p.r.s.t.t.u.v.v.v.v.v.v.v.u.t.t.s.r.p.o.m.l.j.h.f.d...I", ".E.n.p.q.r.r.s.t.t.t.t.t.t.t.s.r.r.q.p.n.m.k.j.h.f.d.....I", ".D.F.n.o.p.p.....C.F.J.r.r.r.q.p.p.....C.F.J.h.f.d.....G.F", ".G.D.k.l.m.B...B.C.F.J.M.p.o.o.n.B...B.C.F.J.M.d.......F.G", ".H.I.i.j.E.C.C.C.E.H.L.N.S.m.l.E.C.C.C.E.H.L.N.S.......I.H", ".G.F.H.g.H.F.F.F.H.K.M.P.U.j.j.H.F.F.F.H.K.M.P.U.....J.J.I", ".I.I.J.E.L.J.J.J.L.M.O.T.X.h.g.L.J.J.J.L.M.O.T.X...G.J.J.G", ".H.F.F.D.N.M.M.M.N.P.T.W.Z.e.d.N.M.M.M.N.P.T.W.Z...F.I.G.G", ".J.G.D.F.S.R.Q.R.S.U.X.Z.Z.....S.R.Q.R.S.U.X.Z.Z.H.E.I.H.I", ".J.I.G.I.I.W.V.W.Y.Z.Z.Z.........W.V.W.Y.Z.Z.Z.F.G.G.I.G.G", ".J.J.J.I.H.F.Z.Z.Z.Z.Z.............Z.Z.Z.Z.Z.F.I.J.J.F.G.H", ".G.H.J.I.G.D.C.H.F.F.G...............I.J.I.F.I.G.I.I.G.H.J", ".I.F.H.J.G.E.C.H.G.G.F.H.F.F.E.G.G.H.I.H.H.I.J.J.H.G.F.H.H", ".G.F.G.J.G.H.H.F.F.E.H.H.H.I.F.F.H.G.G.G.J.H.I.H.H.H.G.H.G", ".F.F.H.H.H.F.G.F.I.H.F.H.I.G.H.E.I.J.H.H.G.E.F.I.G.J.G.G.H" }; koules1.4/font.h100600 37512 310 352 6477322207 10340 0ustar #include "koules.h" #define NO_CLIP_FONT 0x7FFFFFFF extern int vgadrawtext (CONST int, CONST int, CONST int, CONST char *); extern int vgatextsize (CONST int, CONST char *); extern void set_max_text_width (CONST int); koules1.4/framebuffer.c100644 37512 310 34045 6477322207 11727 0ustar /*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * framebuffer.c fast 8 bit framebuffer bitmap creation * * routines * ***********************************************************/ #include "koules.h" #define NCOLORS 32 #define HOLE_XCENTER (2*HOLE_RADIUS-3*HOLE_RADIUS/4) #define HOLE_YCENTER (2*HOLE_RADIUS-HOLE_RADIUS/4) #define HOLE_MAX_RADIUS (HOLE_RADIUS/DIV+0.5*HOLE_RADIUS/DIV) #define HOLE_SIZE_MAX (radius*radius) #ifndef NODIRECT /* * hardcoded bitmap drawing routines */ static char * draw_ball_bitmap (int radius, CONST int color) { char *bitmap = NULL, *point; int x, y, r; radius /= DIV; if ((bitmap = alloca ((radius * 2) * (radius * 2) + 2)) == NULL) perror ("create_ball_bitmap"), exit (-1); point = bitmap; for (y = 0; y < radius * 2; y++) for (x = 0; x < radius * 2; x++, point++) { if ((x - radius) * (x - radius) + (y - radius) * (y - radius) < (radius - 0.5) * (radius - 0.5)) { r = (x - 3 * radius / 4) * (x - 3 * radius / 4) + (y - radius / 4) * (y - radius / 4); r = r * 32 / (1.5 * radius) / (1.5 * radius); if (r > 31) r = 31; *point = color + r; } else *point = 0; } return (CompileBitmap (radius * 2, radius * 2, (char *) bitmap)); } static char * draw_reversed_ball_bitmap (int radius, CONST int color) { char *bitmap = NULL, *point; int x, y, r; radius /= DIV; if ((bitmap = alloca ((radius * 2) * (radius * 2) + 2)) == NULL) perror ("create_ball_bitmap"), exit (-1); point = bitmap; for (y = 0; y < radius * 2; y++) for (x = 0; x < radius * 2; x++, point++) { if ((x - radius) * (x - radius) + (y - radius) * (y - radius) < (radius - 0.5) * (radius - 0.5)) { r = (x - 3 * radius / 4) * (x - 3 * radius / 4) + (y - radius / 4) * (y - radius / 4); r = r * 32 / (1.5 * radius) / (1.5 * radius); if (r > 31) r = 31; *point = color + 16 + r / 2; } else *point = 0; } return (CompileBitmap (radius * 2, radius * 2, (char *) bitmap)); } static char * draw_apple_bitmap (int radius, CONST int color) { char *bitmap = NULL, *point; int x, y, r; int radius1; radius /= DIV; if ((bitmap = alloca ((radius * 2) * (radius * 2) + 2)) == NULL) perror ("create_ball_bitmap"), exit (-1); point = bitmap; for (y = 0; y < radius * 2; y++) for (x = 0; x < radius * 2; x++, point++) { if (DIV == 2) radius1 = radius * (abs (x - radius) / 2 + 25) / 30; else radius1 = radius * (abs (x - radius) / 2 + 50) / 60; if (radius1 > radius) radius1 = radius; if ((x - radius) * (x - radius) + (y - radius) * (y - radius) < ((radius1) * (radius1))) { r = (x - 3 * radius / 4) * (x - 3 * radius / 4) + (y - radius / 4) * (y - radius / 4); r = 3 + r * 22 / (1.5 * radius1) / (1.5 * radius1); if (r > 31) r = 31; *point = color + r; } else *point = 0; } return (CompileBitmap (radius * 2, radius * 2, (char *) bitmap)); } #else static float err = 0.0; #ifdef XSUPPORT static INLINE int errdist (int c) { float sat, merr; int i; int p; c &= 0xff; sat = opixels[c] + err; merr = sat - spixels[c]; p = c; if (sat < spixels[c]) { int max = c / 32; max = (max + 1) * 32; for (i = c; i < max && i < 255; i++) { if (fabs (merr) > fabs (spixels[i] - sat)) { p = i; merr = sat - spixels[i]; } } } if (sat > spixels[c]) { int min = c / 32; min *= 32; for (i = c; i > min && i > 0; i--) { if (fabs (merr) > fabs (spixels[i] - sat)) { p = i; merr = sat - spixels[i]; } } } if (fabs (merr) > fabs (64 - sat)) { p = 255; merr = sat - 64; } if (fabs (merr) > fabs (sat)) { p = 32; merr = sat; } err = merr; return (p); } #else #define errdist(c) c #endif static BitmapType draw_ball_bitmap (int radius, CONST int color) { RawBitmapType bbitmap; int x, y, r, c; radius /= DIV; err = 0.0; bbitmap = CreateBitmap ((radius * 2), (radius * 2)); for (y = 0; y < radius * 2; y++) for (x = 0; x < radius * 2; x++) { if ((x - radius) * (x - radius) + (y - radius) * (y - radius) < (radius - 0.5) * (radius - 0.5)) { r = (x - 3 * radius / 4) * (x - 3 * radius / 4) + (y - radius / 4) * (y - radius / 4); r = r * 32 / (1.5 * radius) / (1.5 * radius); if (r > 31) r = 31; c = errdist (color + r); BSetPixel (bbitmap, x, y, c); } else { err = 0.0; BSetPixel (bbitmap, x, y, 0); } } return (CompileBitmap (radius * 2, radius * 2, bbitmap)); } static BitmapType draw_reversed_ball_bitmap (int radius, CONST int color) { RawBitmapType bbitmap; int x, y, r, c; radius /= DIV; err = 0.0; bbitmap = CreateBitmap ((radius * 2), (radius * 2)); for (y = 0; y < radius * 2; y++) for (x = 0; x < radius * 2; x++) { if ((x - radius) * (x - radius) + (y - radius) * (y - radius) < (radius - 0.5) * (radius - 0.5)) { r = (x - 3 * radius / 4) * (x - 3 * radius / 4) + (y - radius / 4) * (y - radius / 4); r = r * 32 / (1.5 * radius) / (1.5 * radius); if (r > 31) r = 31; c = errdist (color + 16 + r / 2); BSetPixel (bbitmap, x, y, c); } else { err = 0.0; BSetPixel (bbitmap, x, y, 0); } } return (CompileBitmap (radius * 2, radius * 2, bbitmap)); } static BitmapType draw_apple_bitmap (int radius, CONST int color) { RawBitmapType bitmap; int x, y, r, c; int radius1; radius /= DIV; bitmap = CreateBitmap ((radius * 2), (radius * 2)); err = 0; for (y = 0; y < radius * 2; y++) for (x = 0; x < radius * 2; x++) { if (DIV == 2) radius1 = radius * (abs (x - radius) / 2 + 25) / 30; else radius1 = radius * (abs (x - radius) / 2 + 50) / 60; if (radius1 > radius) radius1 = radius; if ((x - radius) * (x - radius) + (y - radius) * (y - radius) < ((radius1) * (radius1))) { r = (x - 3 * radius / 4) * (x - 3 * radius / 4) + (y - radius / 4) * (y - radius / 4); r = 3 + r * 22 / (1.5 * radius1) / (1.5 * radius1); if (r > 31) r = 31; c = errdist (color + r); BSetPixel (bitmap, x, y, c); } else { BSetPixel (bitmap, x, y, 0); } } return (CompileBitmap (radius * 2, radius * 2, bitmap)); } #endif void create_bitmap () { int x, y, r, po, radius; #ifndef NODIRECT char hole_data[HOLE_RADIUS * 2][HOLE_RADIUS * 2]; char ehole_data[HOLE_RADIUS * 2][HOLE_RADIUS * 2]; #else int c; RawBitmapType hole_data, ehole_data; #endif printf ("creating bitmaps...\n"); #ifndef NODIRECT for (x = 0; x < HOLE_RADIUS * 2; x++) for (y = 0; y < HOLE_RADIUS * 2; y++) { if (DIV == 1) radius = HOLE_RADIUS / 2 + (int) (atan (fabs (x - HOLE_RADIUS + 0.5) / fabs (y - HOLE_RADIUS + 0.5)) * HOLE_RADIUS / 2) % (HOLE_RADIUS / 2); else radius = HOLE_RADIUS / 4; if ((x - HOLE_RADIUS / DIV) * (x - HOLE_RADIUS / DIV) + (y - HOLE_RADIUS / DIV) * (y - HOLE_RADIUS / DIV) < radius * radius) { r = (x - HOLE_RADIUS / DIV) * (x - HOLE_RADIUS / DIV) + (y - HOLE_RADIUS / DIV) * (y - HOLE_RADIUS / DIV); r = r * 24 / HOLE_SIZE_MAX; if (r > 23) r = 23; hole_data[x][y] = 64 + r + 1; ehole_data[x][y] = 128 + r + 1; } else hole_data[x][y] = 0, ehole_data[x][y] = 0; } hole_bitmap = (CompileBitmap (HOLE_RADIUS * 2, HOLE_RADIUS * 2, (char *) hole_data)); ehole_bitmap = (CompileBitmap (HOLE_RADIUS * 2, HOLE_RADIUS * 2, (char *) ehole_data)); #else ehole_data = CreateBitmap ((HOLE_RADIUS * 2), (HOLE_RADIUS * 2)); hole_data = CreateBitmap ((HOLE_RADIUS * 2), (HOLE_RADIUS * 2)); err = 0; for (x = 0; x < HOLE_RADIUS * 2; x++) for (y = 0; y < HOLE_RADIUS * 2; y++) { if (DIV == 1) radius = HOLE_RADIUS / 2 + (int) (atan (fabs (x - HOLE_RADIUS + 0.5) / fabs (y - HOLE_RADIUS + 0.5)) * HOLE_RADIUS / 2) % (HOLE_RADIUS / 2); else radius = HOLE_RADIUS / 4; if ((x - HOLE_RADIUS / DIV) * (x - HOLE_RADIUS / DIV) + (y - HOLE_RADIUS / DIV) * (y - HOLE_RADIUS / DIV) < radius * radius) { r = (x - HOLE_RADIUS / DIV) * (x - HOLE_RADIUS / DIV) + (y - HOLE_RADIUS / DIV) * (y - HOLE_RADIUS / DIV); r = r * 24 / HOLE_SIZE_MAX; if (r > 23) r = 23; c = errdist (64 + r + 1); BSetPixel (hole_data, x, y, c); c = errdist (128 + r + 1); BSetPixel (ehole_data, x, y, c); } else { BSetPixel (hole_data, x, y, 0); BSetPixel (ehole_data, x, y, 0); } } ehole_bitmap = (CompileBitmap ((HOLE_RADIUS * 2), (HOLE_RADIUS * 2), ehole_data)); hole_bitmap = (CompileBitmap (HOLE_RADIUS * 2, HOLE_RADIUS * 2, hole_data)); #endif for (po = 0; po < MAXROCKETS; po++) { eye_bitmap[po] = draw_ball_bitmap (EYE_RADIUS, 32 + 32 * po); } ball_bitmap = draw_ball_bitmap (BALL_RADIUS, ball (0)); mouse_bitmap = draw_ball_bitmap (MOUSE_RADIUS * DIV, 32 + 32 * 2); bball_bitmap = draw_ball_bitmap (BBALL_RADIUS, 4 * 32); apple_bitmap = draw_apple_bitmap (APPLE_RADIUS, ball (0)); inspector_bitmap = draw_ball_bitmap (INSPECTOR_RADIUS, 160); lunatic_bitmap = draw_reversed_ball_bitmap (LUNATIC_RADIUS, 192); lball_bitmap[0] = draw_ball_bitmap (BALL_RADIUS, 4 * 32); lball_bitmap[1] = draw_ball_bitmap (BALL_RADIUS, 5 * 32); lball_bitmap[2] = draw_reversed_ball_bitmap (BALL_RADIUS, 192); lball_bitmap[3] = draw_reversed_ball_bitmap (BALL_RADIUS, 0); lball_bitmap[4] = draw_reversed_ball_bitmap (BALL_RADIUS, 3 * 32 - 5); /* lball_bitmap[5] = draw_reversed_ball_bitmap (BALL_RADIUS, 4 * 32 - 5);*/ for (x = 0; x < 5; x++) rocket_bitmap[x] = draw_ball_bitmap (ROCKET_RADIUS, rocketcolor[x]); } #ifndef XSUPPORT static void createbackground () { /* Create fancy dark red background */ int x, y; #ifndef NODIRECT char *pixel = background->vbuf; #endif for (y = 0; y < MAPHEIGHT + 20; y++) for (x = 0; x < MAPWIDTH; x++) { int i = 0; int n = 0; int c; if (x > 0) { #ifndef NODIRECT i += *(pixel - 1) - back (0); #else i += SGetPixel (x - 1, y); #endif n++; } if (y > 0) { #ifndef NODIRECT i += *(pixel - MAPWIDTH) - back (0); #else i += SGetPixel (x, y - 1); #endif n++; } c = (i + (rand () % 16)) / (n + 1); if (c > 9) c = 9; #ifndef NODIRECT *pixel = back (0) + c; pixel++; #else SPutPixel (x, y, back (0) + c); #endif } } #else #ifdef MITSHM static void Shmcreatebackground () { /* Create fancy dark red background */ int x, y; unsigned char *pixel = (unsigned char *) background.vbuff; for (y = 0; y < MAPHEIGHT + 20; y++) for (x = 0; x < MAPWIDTH; x++) { int i = 0; int n = 0; int c; if (x > 0) { i += *(pixel - 1) - back (0); n++; } if (y > 0) { i += *(pixel - MAPWIDTH) - back (0); n++; } c = (i + (rand () % 16)) / (n + 1); if (c > 9) c = 9; *pixel = back (0) + c; pixel++; } pixel = (unsigned char *) background.vbuff; for (y = 0; y < MAPHEIGHT + 20; y++) for (x = 0; x < MAPWIDTH; x++) *pixel = (unsigned char) pixels[*pixel], pixel++; } #endif static void createbackground () { /* Create fancy dark red background */ int x, y; XImage *img; char *data; #ifdef MITSHM if (shm) { Shmcreatebackground (); return; } #endif if ((data = (char *) calloc ((MAPWIDTH + BitmapPad (dp)) * (MAPHEIGHT + 20) * 4, 1)) == NULL) perror ("Memory Error"), exit (2); img = XCreateImage (dp, DefaultVisual (dp, screen), DefaultDepth (dp, screen), ZPixmap, 0, data, MAPWIDTH, MAPHEIGHT + 20, BitmapPad (dp), 0); for (y = 0; y < MAPHEIGHT + 20; y++) for (x = 0; x < MAPWIDTH; x++) { int i = 0; int n = 0; int c; if (x > 0) { i += XGetPixel (img, x - 1, y); n++; } if (y > 0) { i += XGetPixel (img, x, y - 1); n++; } c = (i + (rand () % 16)) / (n + 1); if (c > 9) c = 9; /*gl_setpixel (x, y, back (0) + c); */ XPutPixel (img, x, y, c & 0xff); } for (y = 0; y < MAPHEIGHT + 20; y++) for (x = 0; x < MAPWIDTH; x++) XPutPixel (img, x, y, pixels[back (0) + XGetPixel (img, x, y)]); XPutImage (dp, current.pixmap, gc, img, 0, 0, 0, 0, MAPWIDTH, MAPHEIGHT + 20); XSync (dp, 1); XDestroyImage (img); } #endif void drawstarbackground () { /* Create fancy dark red background */ int x; int x1, y1, c1; SetScreen (starbackground); ClearScreen (); for (x = 0; x < 700 / DIV / DIV; x++) { x1 = rand () % MAPWIDTH; y1 = rand () % (MAPHEIGHT + 20); c1 = rand () % 32 + 192; SSetPixel (x1, y1, c1); } } void drawbackground () { /*int i; */ /* Build up background from map data */ SetScreen (background); ClearScreen (); createbackground (); EnableClipping (); #ifdef MITSHM if (shm) HLine (0, MAPHEIGHT, MAPWIDTH - 1, back (16)); else #endif Line (0, MAPHEIGHT, MAPWIDTH - 1, MAPHEIGHT, back (16)); DisableClipping (); } koules1.4/koules.h100644 37512 310 21453 6477322207 10751 0ustar /*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * koules.h * ***********************************************************/ /* Changes for joystick "accelerate by deflection" * * (c) 1997 by Ludvik Tesar (Ludv\'{\i}k Tesa\v{r}) * ************************LT*********************************/ #ifndef __KOULE_INCLUDED___ #define __KOULE_INCLUDED___ #include #include #include #include #include #include #include #ifndef M_PI /*hp ansi c stuff */ #define M_PI 3.14 #endif #ifdef JOYSTICK #include "joystick.h" #endif #if defined(SOUND)||defined(NAS_SOUND)||defined(RSOUND) #include "sound.h" #endif #ifndef HAVEUSLEEP #define usleep myusleep extern void myusleep (unsigned long); #endif /*do not confuse compiler when function is not required */ #if defined(__GNUC__)&&!defined(ONLYANSI) #define CONST const #define INLINE inline #else #define INLINE #define CONST #endif #define DUMMY do { } while (0) extern int nomouse; #include #define MENUTIME 5 #define back(x) (32 + x) #define ball(x) (64 + x) #define rocket(x) (96 + x) #define PLAY_X1 0 #define PLAY_Y1 0 #define RAD(n) ((float)(n)/180.0*M_PI) #define ROTSTEP RAD(10) #define BALL_RADIUS 8 #define BBALL_RADIUS 16 #define APPLE_RADIUS 32 #define INSPECTOR_RADIUS 14 #define LUNATIC_RADIUS EYE_RADIUS #define HOLE_RADIUS 12 #define ROCKET_RADIUS 14 #define EYE_RADIUS1 10 #define SPRINGSIZE (4*BBALL_RADIUS) #define SPRINGSTRENGTH (BBALL_RADIUS/2) #define NTRACKS 4 #define NTRACKS 4 #define ROCKET 1 #define BALL 2 #define LBALL 3 #define CREATOR 4 #define HOLE 5 #define BBALL 6 #define APPLE 7 #define INSPECTOR 8 #define EHOLE 9 #define LUNATIC 10 #define MAXOBJECT 255 #define MAXPOINT (4000) #define MAXROCKETS 5 #define L_ACCEL 'A' #define L_GUMM 'M' #define L_THIEF 'T' #define L_FINDER 'G' #define L_TTOOL 'S' #define A_ADD 0.13 #define M_ADD 0.8 #define NLETTERS 5 #define LETTER 1024 #define S_START 0 #define S_END 1 #define S_COLIZE 2 #define S_DESTROY_BALL 3 #define S_DESTROY_ROCKET 4 #define S_CREATOR1 5 #define S_CREATOR2 6 #define C_REMOTE 0 #define C_KEYBOARD 1 #define C_RKEYBOARD 2 #define C_JOYSTICK1 3 #define C_JOYSTICK2 4 #define C_MOUSE 5 #define DEATHMATCH 0 #define COOPERATIVE 1 #define NSAMPLES 7 #define MENU 1 #define KEYS 2 #define GAME 3 #define JOY 4 #define WAIT 5 #define PREGAME 6 #define next /*((++cit)>=NTRACKS?cit=1:cit) */ typedef struct { int type; int thief; int ctype; int live; int time; int score; int lineto; float x; float y; float fx; /*forces */ float fy; float rotation; /*for rockets */ int live1; /*backup for rockets */ float M; int radius; float accel; char letter; /* B ****LT**** */ #ifdef JOYSTICK float joymulx; /* multiply x cootdinate by this to obtai number between <0,1> */ float joymuly; /* multiply y ... */ float joythresh; /* minimum how should be joystick deflected for acceleration <0,1> */ #endif /* B ****LT**** */ } Object; typedef struct { int x, y, xp, yp, time, color; } Point; extern int PlaySound (int s); #ifdef NETSUPPORT #define play_sound1(p1) (!server?play_sound(p1):PlaySound(p1)) #else #define play_sound1(p1) play_sound(p1) #endif #ifdef SOUND #define Effect(p1,p2) (sound?play_sound1(p1):0) #else #if defined(NAS_SOUND)||defined(RSOUND) #define Effect(p1,p2) (sound?play_sound1(p1):0) #define SOUND #else #define Effect(p1,p2) (server?PlaySound(p1):0) #endif #endif struct control { int type; double jx, jy; int mx, my; int mask; }; #ifndef VARIABLES_HERE extern float ROCKET_SPEED; extern float BALL_SPEED; extern float BBALL_SPEED; extern float SLOWDOWN; extern float GUMM; extern float BALLM; extern float LBALLM; extern float BBALLM; extern float APPLEM; extern float INSPECTORM; extern float LUNATICM; extern float ROCKETM; extern int dosprings; extern int difficulty; extern int randsprings; extern int nobjects; extern int drawpointer; extern int textcolor; extern int nrockets; extern Object object[MAXOBJECT]; extern Point point[MAXPOINT]; extern int gameplan; extern int rotation[MAXROCKETS]; extern char control[MAXROCKETS]; extern struct control controls[5]; extern int lastlevel, maxlevel; #ifdef NETSUPPORT extern int client, server; #endif #ifdef SOUND extern int sndinit; #endif extern int mouseplayer; #ifdef JOYSTICK extern int joystickplayer[2]; extern int joystickdevice[2]; extern int calibrated[2]; extern int center[2][2]; /* B ****LT**** */ /* coordinates are multiplied by this number before computing of speed */ extern float joystickmul[2]; /* default value for "accel by fire button" : */ #define JOYMUL1 0.0 /* default value for "accel by deflection" : */ #define JOYMUL2 1.5 /* joystickthresh is lower threshold for movement of joystick (something between 0 and 1)*/ extern float joystickthresh[2]; /* E ****LT**** */ #endif extern VScreenType physicalscreen; extern VScreenType backscreen; extern VScreenType background; extern VScreenType starbackground; /*extern int cit; */ extern int gamemode; extern int tbreak; extern int a_bballs, a_rockets, a_balls, a_holes, a_apples, a_inspectors, a_lunatics, a_eholes; extern int keys[5][4]; extern int sound; extern BitmapType bball_bitmap, apple_bitmap, inspector_bitmap, mouse_bitmap, lunatic_bitmap, lball_bitmap[NLETTERS], circle_bitmap, hole_bitmap, ehole_bitmap, ball_bitmap, eye_bitmap[MAXROCKETS], rocket_bitmap[MAXROCKETS]; extern char rocketcolor[5]; #endif #if defined(__GNUC__)&&!defined(ONLYANSI) extern inline void normalize (float *x, float *y, CONST float size) { float length = sqrt ((*x) * (*x) + (*y) * (*y)); if (length == 0) length = 1; *x *= size / length; *y *= size / length; } #else extern void normalize (float *, float *, CONST float); #endif extern void addpoint (CONST int, CONST int, CONST int, CONST int, CONST int, CONST int); extern void destroy (CONST int); extern void creator (CONST int); extern void creator_rocket (CONST int); extern void uninitialize (); extern void draw_menu (CONST int); extern void draw_joy (CONST int); extern void init_menu (); extern void menu_keys (); extern void draw_keys (int); extern void keys_keys (); extern void joy_keys (); extern void gameplan_init (); extern void update_game (); extern void init_objects (); extern void outro1 (); extern void outro2 (); extern void clearpoints (); extern void intro_intro (); extern void lunatic_intro (); extern void spring_intro (); extern void thief_intro (); extern void finder_intro (); extern void ttool_intro (); extern void hole_intro (); extern void inspector_intro (); extern void bball_intro (); extern void bbball_intro (); extern void maghole_intro (); extern void fadeout (); extern void fadein (); extern void load_rc (); extern void save_rc (); extern int allow_finder (); #if defined(__GNUC__)&&!defined(ONLYANSI) extern int find_possition (float *, float *, CONST float) __attribute ((const)); extern int radius (CONST int) __attribute ((const)); extern float M (CONST int) __attribute ((const)); extern int create_letter () __attribute ((const)); #else extern int find_possition (float *, float *, CONST float); extern int radius (CONST int); extern float M (CONST int); extern int create_letter (); #endif #ifndef NETSUPPORT #define client 0 #define server 0 #endif #endif koules1.4/koules.sndsrv.freebsd.c100644 37512 310 16433 6477322207 13675 0ustar /* * koules.sndsrv.c - VoxWare(tm) Compatible Sound - Apr. 1995 * PC Speaker Compatible Sound * This server is FreeBSD Specific. * * Copyright 1994-1995 Sujal M. Patel (smpatel@wam.umd.edu) * Conditions in "copyright.h" * * Modified for Koules and bugfixed by Jan Hubicka */ #include #include #include #include #include #include #include #include #include char *FILENAME[] = { "/start.raw", "/end.raw", "/colize.raw", "/destroy1.raw", "/destroy2.raw", "/creator1.raw", "/creator2.raw" }; #define NUM_SOUNDS (sizeof(FILENAME)/sizeof(char*)) signed char *sound_buffer[NUM_SOUNDS]; int sound_size[NUM_SOUNDS]; int fragsize; /* Terminate: Signal Handler */ void quit () { exit (0); } void init (int argc, char **argv) { int i; char s[1024]; if (argc != 3) { printf ("This program is only executed by koules\n"); exit (1); } for (i = 0; i < NUM_SOUNDS; i++) { s[0] = 0; strcat (s, argv[1]); if (s[(int) strlen (s) - 1] == '/') FILENAME[i]++; strcat (s, FILENAME[i]); FILENAME[i] = malloc ((int) strlen (s) + 1); strcpy (FILENAME[i], s); sound_buffer[i] = NULL; sound_size[i] = 0; } signal (SIGTERM, quit); /* Setup Terminate Signal Handler */ } /* Setup DSP: Opens /dev/dsp or /dev/pcdsp Sets fragment size on VoxWare Sets speed to 8000hz Should set mono mode Error checking */ int setup_dsp (char *dspdev, int *is_pcsp) { int dsp, frag, value; int mixer; dsp = open (dspdev, O_RDWR); if (dsp < 1) { fprintf (stderr, "koules.sndsrv: Couldn't open DSP %s\n", dspdev); return -1; } *is_pcsp = 0; fragsize = 0; frag = 0x00020009; /* try 512 bytes, for 1/16 second frag size */ ioctl (dsp, SNDCTL_DSP_SETFRAGMENT, &frag); value = 8010; if (ioctl (dsp, SNDCTL_DSP_SPEED, &value)) { fprintf (stderr, "koules.sndsrv: Couldn't set DSP rate!\n"); }; value = 0; ioctl (dsp, SNDCTL_DSP_STEREO, &value); ioctl (dsp, SNDCTL_DSP_GETBLKSIZE, &fragsize); fprintf (stderr, "koules.sndsrv: fragment set to %d\n", fragsize); if (!fragsize) { /* Don't Assume just because you can't set the fragment, use proper IOCTL */ fprintf (stderr, "koules.sndsrv: Couldn't set Fragment Size.\nAssuming PC Speaker!\n"); fragsize = 128; *is_pcsp = 1; } else { mixer = open ("/dev/mixer", O_RDWR | O_NONBLOCK); if (mixer == -1) { fprintf (stderr, "koules.sndsrv: Couldn't open mixer %s\n", "/dev/mixer"); return (-1); }; #if 0 value = 0x6464; ioctl (mixer, SOUND_MIXER_WRITE_PCM, &value); ioctl (mixer, SOUND_MIXER_WRITE_VOLUME, &value); /*what does this do? */ #endif close (mixer); } return dsp; } /* This just keeps the pipe from breaking... Eventually I'll look at the koules signal handlers and just trap this. */ int do_nothing (void) { fprintf (stderr, "koules.sndsrv: doing nothing, something is broken\n"); while (1) sleep (5); } int read_sound (int k) { int i, fd, size; /*fprintf(stderr,"loading sound %d, %s\n",k,FILENAME[k]); */ fd = open (FILENAME[k], O_RDONLY); if (fd <= 0) { fprintf (stderr, "koules.sndsrv: The sound %s could not be opened\n", FILENAME[k]); sound_size[k] = -1; return (0); }; size = lseek (fd, 0, SEEK_END); sound_size[k] = (size / fragsize) + 1; /*size in fragments */ sound_buffer[k] = malloc (sound_size[k] * fragsize); if (sound_buffer[k] == NULL) { fprintf (stderr, "koules.sndsrv: couldn't malloc memory for sound\n"); sound_size[k] = -1; close (fd); return (0); }; lseek (fd, 0, SEEK_SET); read (fd, sound_buffer[k], size); close (fd); for (i = 0; i < size; i++) sound_buffer[k][i] ^= 0x80; memset (sound_buffer[k] + size, 0, sound_size[k] * fragsize - size); /*fprintf(stderr,"sound has been loaded, %d bytes\n",size); *//*DEBUG */ return (1); } void do_everything (int dsp, int is_pcsp) { char k; int i, j; int terminate = -1; /* Which Sound to Terminate */ int playing[16]; /* Sound numbers that we are playing */ int position[16]; /* Current position in each sound file */ int playnum = 0; /* Number of sounds currently being played */ unsigned char final[512]; /* Final Mixing Buffer */ int premix[512]; char *sample; for (;;) { terminate = -1; /* Try to open a new sound if we get an integer on the 'in' pipe */ i = read (STDIN_FILENO, &k, sizeof (k)); if (i == 0) { /* EOF on pipe means parent has closed its end */ /*fprintf(stderr,"koules.sndsrv: shutting down\n"); */ kill (getpid (), SIGTERM); }; if (i != -1) { /* there was something in the pipe */ /*fprintf(stderr,"Just read a %d from pipe\n",(int)k); *//*DEBUG */ /* Negative means terminate the FIRST sound in the buffer */ if (k < 0) { /*fprintf(stderr,"terminating sound\n"); *//*DEBUG */ terminate = 0; } else { if (sound_size[k] == 0) read_sound (k); if (sound_size[k] > 0 && playnum < 16) { position[playnum] = 0; playing[playnum++] = k; /*fprintf(stderr,"sound %d added to play queue\n",playnum-1); *//*DEBUG */ }; }; }; /* terminate a sound if necessary */ for (i = 0; i < playnum; i++) { if ((position[i] == sound_size[playing[i]]) || (terminate == i)) { /*fprintf(stderr,"finished playing sound %d\n",i); *//*DEBUG */ /*fprintf(stderr,"is was at position %d\n",position[i]); *//*DEBUG */ memmove (playing + i, playing + i + 1, (playnum - i) * sizeof (int)); memmove (position + i, position + i + 1, (playnum - i) * sizeof (int)); playnum--; i--; }; }; if (playnum) { /* Mix each sound into the final buffer */ memset (premix, 0, sizeof (premix)); for (i = 0; i < playnum; i++) { sample = sound_buffer[playing[i]] + position[i] * fragsize; for (j = 0; j < fragsize; j++) { premix[j] += *(sample + j); }; position[i]++; }; for (i = 0; i < fragsize; i++) final[i] = (premix[i] > 255) ? 255 : (premix[i] < -256 ? 0 : (premix[i] >> 1) + 128); } else { /* We have no sounds to play Just fill the buffer with silence and maybe play it */ memset (final, 128, sizeof (final)); }; write (dsp, final, fragsize); /* The sound server is in a tight loop, EXCEPT for this write which blocks. Any optimizations in the above code would really be helpful. Right now the server takes up to 7% cpu on a 486DX/50. */ } } void main (argc, argv) int argc; char **argv; { int dsp, is_pcsp, ppid; char filename[512]; fcntl (STDIN_FILENO, F_SETFL, O_NONBLOCK); init (argc, argv); dsp = setup_dsp (argv[2], &is_pcsp); if (!dsp) do_nothing (); do_everything (dsp, is_pcsp); } koules1.4/myauconvert100755 37512 310 121 6477322207 11525 0ustar # simple conversion .raw to .au files-add audio header cat auhead >$2 cat $1>>$2 koules1.4/xkoules.6100644 37512 310 6123 6477322207 11034 0ustar .TH KOULES 6 "28 Jul 1995" "Linux" "games" .SH NAME xkoules \- Action game for X11 .SH SYNOPSIS xkoules [-SxslMmpdh] .SH KOULES FROM THE TOP: .br .br . .br --- . . O .br / \\ . . .br | | . . .. --- .br \\ / / \\ X O .br --- | O| .br \\ O/ .br --- --- .br . O /O O\\ .br . . . . | | .br . . . \\ / .br . .X. . O --- .br . . . . .br . . . . ... .br . . . . .br . . . . .br . . . .br H A V E .br FUN .br ! .SH DESCRIPTION .B Koules is an action game. The mission is to bounce all koules fighters from your sector .SH "OPTIONS" .TP .B \-h for help .TP .B \-s for small display(320x250) for slow machines .TP .B \-l for large display(640x480) default size .TP .B \-m for monochrome displays .TP .B \-b for black and white mode .TP .B \-p use private colormap .TP .B \-y Synchronize with X use only for debugging .TP .B \-f Disable palette fading .TP .B \-d Disable sound support Game will run faster. .TP .B \-x Disable X11 pointer Use game's own cursor when standard X11's cursor is blinking .TP .B \-M DISABLE shared memory support Slow down the game. Use only if shared memory support crashes. .SH "Network options" .TP .B \-C run koules as network client .TP .B \-S run koules as network server .TP .B \-P select port. Default is:12345 Use this in case that some other program is already using this port. .SH "Server options" .TP .B \-W run server in width mode-support for 320x200 svgalib and OS/2 clients. Use this in case that server is refusing your clients. .TP .B \-L select level for server .TP .B \-D select dificulty for server: 0: nightmare 1: hard 2: medium(default and recomended) 3: easy 4: very easy .TP .B \-K run server in deathmatch mode .SH "Points:" .br Bounce something : +1 .br Eat extension : +10 .br Eat thief : -30 .br Eat friend : +30 .B At end of level .br every live : +20 .br every lost level : -100 .br .B In deathmatch mode .br every destroyed concurrent: +100 .SH PORTABILITY The program is written in ANSI C and uses the X11 graphics library. .SH BUGS/LIMITATIONS Joystick is supported only on Linux. .SH SEE ALSO http://www.paru.cas.cz/~hubicka/koules/English/koules.html .SH AUTHOR Jan Hubicka .B email: hubicka@paru.cas.cz .br .B smail: .br Jan Hubicka .br Dukelskych bojovniku 1944 .br Tabor 39001 .br Czech Republic koules1.4/TODO100644 37512 310 1030 6477334714 7741 0ustar You want to do something from this file? Contact me your help is appreciated!!! o Network support changes: o Improve starting menus. o Discover bug that couses troubles with connection refused error messages o improve sound support o midi or mod based music... o improve X11 support: o resize at runtime ? probably not.. o better font intro network and gameplan code o support for amiga dos mac and all other architectures :) ps:what about sinclair and sharp ? o make us and this game famous :) o speedup everything o KOULESII koules1.4/rcfiles.c100644 37512 310 12756 6477553411 11102 0ustar /*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * rcfiles.c saving and loading of rc files * ***********************************************************/ /* Changes for OS/2 Warp with Dive. * * Copyright(c)1996 by Thomas A. K. Kjaer * ***********************************************************/ /* Changes for joystick "accelerate by deflection" * * (c) 1997 by Ludvik Tesar (Ludv\'{\i}k Tesa\v{r}) * ************************LT*********************************/ #include "koules.h" #ifdef XSUPPORT static CONST char *name = ".xkoules-controls"; #else #ifdef OS2DIVE static CONST char *name = "koules.cfg"; #else static CONST char *name = ".koules.svga-controls"; #endif #endif #ifdef OS2DIVE static CONST char *levelsname = "koules.lev"; #else static CONST char *levelsname = ".koules-levels"; #endif static char * mygetenv(char *name) { static char name1[200]; char *var=getenv(name); int i=strlen(var); if(i>199) i=199; memcpy(name1,var,i+1); name1[199]=0; return name1; } void save_rc () { FILE *controls, *levels; int zeros[] = {0, 0, 0, 0, 0, 0, 0, 0}; char fullname[256]; #ifdef NETSUPPORT if (client || server) return; #endif #ifdef OS2DIVE sprintf (fullname, "%s", name); #else sprintf (fullname, "%s/%s", mygetenv ("HOME"), name); #endif if ((controls = fopen (fullname, "w")) == NULL) { printf ("could not open save file:%s\n" "saving of controls skippen\n", fullname); perror ("error"); return; } fwrite (keys, 1, sizeof (keys), controls); /*save user defined keys */ #ifdef MOUSE fwrite (&mouseplayer, 1, sizeof (int), controls); /*save mouseplayer */ #else fwrite (zeros, 1, sizeof (int), controls); #endif #ifdef JOYSTICK fwrite (joystickplayer, 1, sizeof (joystickplayer), controls); #else fwrite (zeros, 2, sizeof (int), controls); #endif fwrite (rotation, 1, sizeof (rotation), controls); #ifdef JOYSTICK fwrite (joystickmul, 1, sizeof (joystickmul), controls); #else fwrite (zeros, 2, sizeof (float), controls); #endif fclose (controls); #ifdef OS2DIVE sprintf (fullname, "%s", levelsname); #else sprintf (fullname, "%s/%s", mygetenv ("HOME"), levelsname); #endif if ((levels = fopen (fullname, "w")) == NULL) { printf ("could not open save file:%s\n" "saving of controls skippen\n", fullname); perror ("error"); return; } fwrite (&maxlevel, 1, sizeof (int), levels); fwrite (&lastlevel, 1, sizeof (int), levels); fwrite (&nrockets, 1, sizeof (int), levels); fwrite (&gameplan, 1, sizeof (int), levels); fwrite (&difficulty, 1, sizeof (int), levels); fclose (levels); } void load_rc () { FILE *controls, *levels; int dummy[8]; char fullname[256]; #ifdef NETSUPPORT if (client || server) return; #endif #ifdef OS2DIVE sprintf (fullname, "%s", name); #else sprintf (fullname, "%s/%s", mygetenv ("HOME"), name); #endif if ((controls = fopen (fullname, "r")) == NULL) { printf ("could not open save file:%s\n" "using default values\n", fullname); perror ("error"); goto skip; } fread (keys, 1, sizeof (keys), controls); /*save user defined keys */ #ifdef MOUSE if(!fread (&mouseplayer, 1, sizeof (int), controls)) mouseplayer=-1; /*save mouseplayer */ #else fread (dummy, 1, sizeof (int), controls); #endif #ifdef JOYSTICK if(!fread (joystickplayer, 1, sizeof (joystickplayer), controls)) joystickplayer[0]=joystickplayer[1]=-1; #else fread (dummy, 2, sizeof (int), controls); #endif fread (rotation, 1, sizeof (rotation), controls); #ifdef JOYSTICK fread (joystickmul, 1, sizeof (joystickmul), controls); #else fread (dummy, 2, sizeof (float), controls); #endif fclose (controls); skip:; #ifdef OS2DIVE sprintf (fullname, "%s", levelsname); #else sprintf (fullname, "%s/%s", mygetenv ("HOME"), levelsname); #endif if ((levels = fopen (fullname, "r")) == NULL) { printf ("could not open save file:%s\n" "using default values\n", fullname); perror ("error"); return; } fread (&maxlevel, 1, sizeof (int), levels); fread (&lastlevel, 1, sizeof (int), levels); if(maxlevel>=100||maxlevel<0) maxlevel=0; if(lastlevel>maxlevel||lastlevel<0) lastlevel=0; fread (&nrockets, 1, sizeof (int), levels); if(nrockets<1) nrockets=1; if(nrockets>4) nrockets=1; if (fread (&gameplan, 1, sizeof (int), levels) != sizeof (int)) gameplan = COOPERATIVE; if(gameplan<0||gameplan>1) gameplan=COOPERATIVE; if (fread (&difficulty, 1, sizeof (int), levels) != sizeof (int)) difficulty = 2; if(difficulty<0||difficulty>4) difficulty=COOPERATIVE; fclose (levels); } koules1.4/Card100644 37512 310 1026 6477322207 10044 0ustar Please fill following card and send it to my address hubicka@freesoft.cz Platform: [ ] Linux/svgalib [ ] Linux/X11 [ ] Solaris [ ] Ultrix [ ] HP-UX [ ] IRIX [ ] AIX [ ] OS/2 [ ] Other (please describe): Compilation problems: Sound: [ ] Build in sound driver [ ] NAS [ ] RPlay How many levels have you played: Have you tried myltiplayer mode? [ ] Yes [ ] No Bugs/problems: Difficulty comments: Graphics comments: Sound comments: Other comments: Ideas for future versions: Ideas for KOULESII: koules1.4/koules-src.lsm100644 37512 310 2240 6477322207 12053 0ustar Begin3 Title: Koules - an action game for UNIX/X11 and Linux/svgalib and OS/2 Version: 1.4 Entered-date: Mar 1 1998 Description: Koules is a fast action arcade-style game for UNIX and OS/2. This version supports X window system, SVGAlib for Linux and OS/2. It works in fine (up to 900x620) resolution with cool 256 color graphics, multiplayer mode up to 5 players, full sound and, of course, network support. Koules is an original idea. First version of Koules was developed from scratch by Jan Hubicka in July 1995. Keywords: game X11 Xlib svgalib digital sound video action fun nice good sex unix cool Author: hubicka@freesoft.cz (Jan Hubicka) Maintained-by: hubicka@freesoft.cz (Jan Hubicka) Primary-site: sunsite.unc.edu /pub/Linux/games/video/koules 192kb koules1.4-src.tar.gz Alternate-site: tsx-11.mit.edu /pub/linux/binaries/usr.games 192kb koules1.4-src.tar.gz Platform: Linux, svgalib 1.2.0 or greater, hpux, sun, freeBSD, IRIX, ULTRIX, OS/2 any UNIX with X11 and ansi-c compiler Copying-policy: GNU GENERAL PUBLIC LICENSE All rights reserved by the author End koules1.4/koules.c100644 37512 310 120616 6500604070 10751 0ustar /*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * koules.c main game routines * ***********************************************************/ /* Changes for OS/2 Warp with Dive. * * Copyright(c)1996 by Thomas A. K. Kjaer * ***********************************************************/ /* Changes for joystick "accelerate by deflection" * * (c) 1997 by Ludvik Tesar (Ludv\'{\i}k Tesa\v{r}) * ************************LT*********************************/ #include #define VARIABLES_HERE #include "koules.h" #include "server.h" #include "client.h" #include int nobjects = 8; int nrockets = 0; int drawpointer = 1; int difficulty = 2; int cit = 0; #ifdef NETSUPPORT int client = 0, server = 0; #endif Object object[MAXOBJECT]; Point point[MAXPOINT]; BitmapType bball_bitmap, apple_bitmap, inspector_bitmap, mouse_bitmap, lunatic_bitmap, lball_bitmap[NLETTERS], circle_bitmap, hole_bitmap, ball_bitmap, eye_bitmap[MAXROCKETS], rocket_bitmap[MAXROCKETS], ehole_bitmap; unsigned char rocketcolor[5] = {96, 160, 64, 96, 128}; #ifdef SOUND int sndinit = 1; #endif int lastlevel = 0, maxlevel = 0; unsigned char control[MAXROCKETS]; struct control controls[MAXROCKETS]; int dosprings = 0; int randsprings = 0; int nomouse = 0; int textcolor; int sound = 1; int tbreak; int gameplan = COOPERATIVE; int npoint = 0; int gamemode; int keys[5][4]; int rotation[MAXROCKETS]; int a_bballs, a_rockets, a_balls, a_holes, a_apples, a_inspectors, a_lunatics, a_eholes; #ifdef MOUSE int mouseplayer = -1; #endif #ifdef JOYSTICK int joystickplayer[2] = {-1, -1}; int joystickdevice[2] = {-1, -1}; int calibrated[2]; int center[2][2]; float joystickmul[2]={1.5,1.5}; float joystickthresh[2]={0.1,0.1}; #endif float ROCKET_SPEED = 1.2; float BALL_SPEED = 1.2; float BBALL_SPEED = 1.2; float SLOWDOWN = 0.8; float GUMM = 20; float BALLM = 3; float LBALLM = 3; float BBALLM = 8; float APPLEM = 34; float INSPECTORM = 2; float LUNATICM = 3.14; float ROCKETM = 4; void addpoint (CONST int x, CONST int y, CONST int xp, CONST int yp, CONST int color, CONST int time) { point[npoint].x = x / DIV; point[npoint].y = y / DIV; point[npoint].xp = xp / DIV; point[npoint].yp = yp / DIV; point[npoint].time = time; point[npoint].color = color; npoint++; if (npoint >= MAXPOINT) npoint = 0; } #ifdef XSUPPORT /*fast code for slow X :) */ #define CCONST 3 #define PCONST 0 XPoint mypixels[256 >> CCONST][MAXPOINT]; int nmypixels[256 >> CCONST]; #ifdef MITSHM void shmpoints () { register unsigned int x, y; Point *p, *lp; lp = &point[MAXPOINT]; for (p = point; p < lp; p++) { if (p->time > 0) { p->time--; x = (p->x += p->xp) >> 8; y = (p->y += p->yp); if (x > 0 && x < MAPWIDTH && y > 0 && y >> 8 < MAPHEIGHT) SMySetPixel (backscreen, x, y, p->color); else p->time = 0; } } } #endif void points () { register unsigned int x, y, c; Point *p, *lp; #ifdef MITSHM if (shm) { shmpoints (); return; } #endif for (x = 0; x < 256 >> CCONST; x++) nmypixels[x] = 0; lp = &point[MAXPOINT]; for (p = point; p < lp; p++) { if (p->time > 0) { p->time--; x = (p->x += p->xp) >> 8; y = (p->y += p->yp) >> 8; if (x > 0 && x < MAPWIDTH && y > 0 && y < MAPHEIGHT) { c = p->color >> CCONST; mypixels[c][nmypixels[c]].x = x; mypixels[c][nmypixels[c]].y = y; nmypixels[c]++; } else p->time = 0; } } for (x = 0; x < 256 >> CCONST; x++) { if (nmypixels[x]) { SetColor ((x << CCONST) + PCONST); XDrawPoints (dp, current.pixmap, gc, mypixels[x], nmypixels[x], CoordModeOrigin); } } } #else void points () { register unsigned int x, y; Point *p, *lp; lp = &point[MAXPOINT]; for (p = point; p < lp; p++) { if (p->time > 0) { p->time--; x = (p->x += p->xp) >> 8; y = (p->y += p->yp); if (x > 0 && x < MAPWIDTH && y > 0 && y >> 8 < MAPHEIGHT) SMySetPixel (backscreen, x, y, p->color); else p->time = 0; } } } #endif void points1 () { Point *p, *lp; lp = &point[MAXPOINT]; for (p = point; p < lp; p++) { if (p->time > 0) { p->time--; p->x += p->xp; p->y += p->yp; } } } INLINE int radius (CONST int type) { switch (type) { case EHOLE: case HOLE: return (HOLE_RADIUS); case ROCKET: return (ROCKET_RADIUS); case BALL: case LBALL: return (BALL_RADIUS); case BBALL: return (BBALL_RADIUS); case APPLE: return (APPLE_RADIUS); case INSPECTOR: return (INSPECTOR_RADIUS); case LUNATIC: return (LUNATIC_RADIUS); } return (0); } static INLINE int color (CONST int type, CONST int i, CONST int letter) { switch (type) { case EHOLE: return (128); case HOLE: return (64); case ROCKET: return (rocketcolor[i]); case BALL: return (64); case LBALL: switch (letter) { case L_ACCEL: return (128); case L_GUMM: return (160); case L_THIEF: return (192); case L_FINDER: return (3 * 32); case L_TTOOL: return (3 * 32); } case BBALL: return (128); case APPLE: return (64); case INSPECTOR: return (160); case LUNATIC: return (3 * 32); } return (0); } INLINE float M (CONST int type) { switch (type) { case APPLE: return (APPLEM); case INSPECTOR: return (INSPECTORM); case LUNATIC: return (LUNATICM); case HOLE: case EHOLE: return (BBALLM); case ROCKET: return (ROCKETM); case BALL: case LBALL: return (BALLM); case BBALL: return (BBALLM); } return (0); } int find_possition (float *x, float *y, CONST float radius) { int x1, y1, i, y2 = 0; float xp, yp; rerand:; x1 = rand () % (GAMEWIDTH - 60) + 30; y1 = rand () % (GAMEHEIGHT - 60) + 30; for (i = 0; i < nobjects; i++) { xp = x1 - object[i].x; yp = y1 - object[i].y; if (xp * xp + yp * yp < (radius + object[i].radius) * (radius + object[i].radius)) { y2++; if (y2 > 10000) return (0); goto rerand; } } *x = (float) x1; *y = (float) y1; return (1); } INLINE void normalize (float *x, float *y, float size) { float length = sqrt ((*x) * (*x) + (*y) * (*y)); if (length == 0) length = 1; *x *= size / length; *y *= size / length; } static void move_objects () { int i; for (i = 0; i < nobjects; i++) if (object[i].type == CREATOR) { object[i].time--; if (object[i].time <= 0) { Effect (S_CREATOR2, next); object[i].live = object[i].live1; object[i].type = object[i].ctype; if (object[i].type == ROCKET) object[i].time = 200; object[i].radius = radius (object[i].ctype); object[i].M = M (object[i].ctype); } } else if (object[i].live) { object[i].x += object[i].fx * (GAMEWIDTH / 640.0 + 1) / 2; object[i].y += object[i].fy * (GAMEWIDTH / 640.0 + 1) / 2; } } static int helpmode; static void help(int x,int y,int radius,char *text) { int x1=x+radius+2,y1=y-4*DIV,x2=x1+strlen(text)*8*DIV,y2=y1+8*DIV; if(helpmode&&x1>0&&x2<=GAMEWIDTH-DIV&&y1>0&&y2= 0 && MouseY () >= 0 && MouseX () < MAPWIDTH && MouseY () < MAPHEIGHT && drawpointer) { EnableClipping (); if (!nomouse) { PutBitmap (MouseX () - MOUSE_RADIUS, MouseY () - MOUSE_RADIUS, MOUSE_RADIUS * 2, MOUSE_RADIUS * 2, mouse_bitmap); DisableClipping (); } } #endif if (draw) { EnableClipping (); if (gameplan == COOPERATIVE && gamemode == GAME && DIV == 1) { sprintf (s, "level: %3i", lastlevel + 1); DrawWhiteMaskedText ((MAPWIDTH / 2 - 38 * 4) / 2 - strlen (s) * 4, MAPHEIGHT + 2, s); } sprintf (s, " lives: %6i%6i%6i%6i%6i", nrockets >= 1 ? object[0].live1 : 0, nrockets >= 2 ? object[1].live1 : 0, nrockets >= 3 ? object[2].live1 : 0, nrockets >= 4 ? object[3].live1 : 0, nrockets >= 5 ? object[4].live1 : 0); DrawWhiteMaskedText (MAPWIDTH / 2 - strlen (s) * 4, MAPHEIGHT + 2, s); sprintf (s, "scores: %6i%6i%6i%6i%6i", object[0].score, object[1].score, object[2].score, object[3].score, object[4].score); DrawWhiteMaskedText (MAPWIDTH / 2 - strlen (s) * 4, MAPHEIGHT + 11, s); /* Copy backscreen to physical screen. */ CopyToScreen (backscreen); fadein (); DisableClipping (); } } void explosion (CONST int x, CONST int y, CONST int type, CONST int letter, CONST int n) { float i; int speed; int color1; int radius1 = radius (type); #ifdef NETSUPPORT if (server) { Explosion (x, y, type, letter, n); return; } #endif for (i = 0; i < RAD (360); i += RAD (360.0) * DIV * DIV / radius1 / radius1 / M_PI) { speed = rand () % 3096 + 10; if (DIV == 1) color1 = color (type, n, letter) + (rand () % 16); else color1 = color (type, n, letter) + (rand () % 32); addpoint (x * 256, y * 256, sin (i) * (speed), cos (i) * (speed), color1, rand () % 100 + 10); } } static void rocket_destroyed (CONST int player) { int i, nalive = 0, igagnant = 0; if (gamemode == GAME) switch (gameplan) { case DEATHMATCH: if (nrockets == 1) return; for (i = 0; i < nrockets; i++) if (object[i].type == ROCKET && object[i].live && i != player) { object[i].score += 100; nalive++; igagnant = i; } if (nalive == 1) /* winner bonus */ object[igagnant].score += 50; } } void destroy (CONST int i) { int y; if (object[i].x - object[i].radius < 0) object[i].x = object[i].radius + 1, object[i].fx *= -1; if (object[i].y - object[i].radius < 0) object[i].y = object[i].radius + 1, object[i].fy *= -1; if (object[i].x + object[i].radius > GAMEWIDTH) object[i].x = GAMEWIDTH - object[i].radius - 1, object[i].fx *= -1; if (object[i].y + object[i].radius > GAMEHEIGHT) object[i].y = GAMEHEIGHT - object[i].radius - 1, object[i].fy *= -1; switch (object[i].type) { case LBALL: Effect (S_DESTROY_BALL, next); object[i].live = 0, explosion (object[i].x, object[i].y, object[i].type, object[i].letter, i); if (object[i].letter == L_THIEF && allow_finder ()) { object[i].live = 1; object[i].letter = L_FINDER; } /* else if (object[i].letter == L_FINDER ) { object[i].live = 1; object[i].letter = L_THIEF; } */ break; case APPLE: Effect (S_DESTROY_ROCKET, 0); object[i].live = 0, explosion (object[i].x, object[i].y, object[i].type, object[i].letter, i); break; case BALL: case EHOLE: case BBALL: case INSPECTOR: case LUNATIC: Effect (S_DESTROY_BALL, next); if ((y = create_letter ()) != 0) { object[i].type = LBALL; object[i].M = LBALLM; switch (y) { case 1: object[i].letter = L_ACCEL; break; case 2: object[i].letter = L_GUMM; break; case 3: object[i].letter = L_THIEF; break; case 4: object[i].letter = L_FINDER; break; case 5: object[i].letter = L_TTOOL; break; /*case 3: object[i].letter = L_MUGG; break; case 4: object[i].letter = L_SLOW; break; case 5: object[i].letter = L_WIZZ; break; case 6: object[i].letter = L_FUCK; break; */ } } else object[i].live = 0, explosion (object[i].x, object[i].y, object[i].type, object[i].letter, i); break; case ROCKET: Effect (S_DESTROY_ROCKET, 0); object[i].live1--, object[i].live--, explosion (object[i].x, object[i].y, object[i].type, object[i].letter, i); rocket_destroyed (i); if (object[i].live) { /*object[i].x = rand () % (GAMEWIDTH-60)+30; object[i].y = rand () % (GAMEHEIGHT-60)+30; */ object[i].fx = 0; object[i].fy = 0; object[i].rotation = 0; object[i].type = ROCKET; object[i].accel = ROCKET_SPEED; creator_rocket (i); } break; } } static void check_limit () { int i; for (i = 0; i < nobjects; i++) if (object[i].live) { if (object[i].x - object[i].radius < 0 || object[i].x + object[i].radius >= GAMEWIDTH || object[i].y - object[i].radius <= 0 || object[i].y + object[i].radius >= GAMEHEIGHT) { destroy (i); } } } /* * count number of creatures */ static void update_values () { int i; a_holes = 0; a_rockets = 0; a_balls = 0; a_bballs = 0; a_apples = 0; a_eholes = 0; a_inspectors = 0; a_lunatics = 0; for (i = 0; i < nobjects; i++) { if (object[i].live) { switch (object[i].type) { case HOLE: a_holes++; break; case EHOLE: a_eholes++; break; case ROCKET: a_rockets++; break; case LBALL: case BALL: a_balls++; break; case BBALL: a_bballs++; break; case APPLE: a_apples++; break; case INSPECTOR: a_inspectors++; break; case LUNATIC: a_lunatics++; break; } } if (object[i].type == CREATOR) { switch (object[i].ctype) { case BBALL: a_bballs++; break; case HOLE: a_holes++; break; case EHOLE: a_eholes++; break; case ROCKET: a_rockets++; break; case LBALL: case BALL: a_balls++; break; case APPLE: a_apples++; break; case INSPECTOR: a_inspectors++; break; case LUNATIC: a_lunatics++; break; } } } } /* * accelerate rocket */ void /* howmuch is between 0 and 1, everything else is cheating */ accel (CONST int i, CONST double howmuch) { int y; #ifdef NETSUPPORT if (server) acceled[i] = 1; #endif #ifdef NETSUPPORT if (!client) #endif { object[i].time = 0; object[i].fx += howmuch * sin (object[i].rotation) * object[i].accel, object[i].fy += howmuch * cos (object[i].rotation) * object[i].accel; #ifdef NETSUPPORT if (!server) #endif for (y = 0; y < 5 / DIV / DIV; y++) { float p; p = RAD (rand () % 45 - 22); addpoint (object[i].x * 256, object[i].y * 256, (object[i].fx - howmuch * sin (object[i].rotation + p) * object[i].accel * 10) * (rand () % 512), (object[i].fy - howmuch * cos (object[i].rotation + p) * object[i].accel * 10) * (rand () % 512), rocket (rand () % 16), 10); } } #ifdef NETSUPPORT else { for (y = 0; y < 5 / DIV / DIV; y++) { float p; p = RAD (rand () % 30 - 15); addpoint (object[i].x * 256, object[i].y * 256, (-sin (object[i].rotation + p) * ROCKET_SPEED * 5) * (rand () % 512), (-cos (object[i].rotation + p) * ROCKET_SPEED * 5) * (rand () % 512), rocket (rand () % 16), 10); } } #endif } static void sprocess_keys () { int i; if (gamemode != GAME) return; for (i = 0; i < MAXROCKETS; i++) { if (object[i].live && object[i].type == ROCKET) { switch (controls[i].type) { #ifdef JOYSTICK case C_JOYSTICK1: { double a, x = controls[i].jx, y = controls[i].jy; a = atan (fabs (y) / fabs (x)); if (x < 0 && y >= 0) object[i].rotation = a + RAD (90); else if (x < 0 && y < 0) object[i].rotation = RAD (90) - a; else if (x >= 0 && y < 0) object[i].rotation = a + RAD (270); else if (x >= 0 && y >= 0) object[i].rotation = RAD (270) - a; /* Measure the deflection (a is betw. 0 and 1) */ a=hypot(x*object[i].joymulx,y*object[i].joymuly); /* I must make sure, that I am not cheating :-) */ /* "a" can't be bigger than one */ if((a>1.0)||(controls[i].mask!=0))a=1.0; if(a>object[i].joythresh)accel(i,a); } break; #endif case C_MOUSE: { double dx, dy, a; dx = object[i].x - controls[i].mx; dy = object[i].y - controls[i].my; if (dx == 0) dx = 0.001; a = atan (fabs (dy) / fabs (dx)); if (dx < 0 && dy >= 0) object[i].rotation = a + RAD (90); else if (dx < 0 && dy < 0) object[i].rotation = RAD (90) - a; else if (dx >= 0 && dy < 0) object[i].rotation = a + RAD (270); else if (dx >= 0 && dy >= 0) object[i].rotation = RAD (270) - a; if (controls[i].mask) accel (i ,1.0); } break; case C_RKEYBOARD: if (controls[i].mask & 1) object[i].rotation += ROTSTEP; if (controls[i].mask & 2) object[i].rotation -= ROTSTEP; if (controls[i].mask & 4) accel (i ,1.0); break; case C_KEYBOARD: switch (controls[i].mask) { case 1: object[i].rotation = RAD (-135), accel (i ,1.0); break; case 2: object[i].rotation = RAD (135), accel (i ,1.0); break; case 3: object[i].rotation = RAD (45), accel (i ,1.0); break; case 4: object[i].rotation = RAD (-45), accel (i ,1.0); break; case 5: object[i].rotation = RAD (-90), accel (i ,1.0); break; case 6: object[i].rotation = RAD (90), accel (i ,1.0); break; case 7: object[i].rotation = RAD (180), accel (i ,1.0); break; case 8: object[i].rotation = RAD (0), accel (i ,1.0); break; } } } } } void process_keys () { int i; static int lasth=0; #ifdef JOYSTICK int status; struct JS_DATA_TYPE js; #endif UpdateInput (); if (IsPressedH () && !lasth) { helpmode^=1; } lasth=IsPressedH(); if (IsPressedP () && !client) { int k = 1; SetScreen (backscreen); DrawText (MAPWIDTH / 2 - 20, MAPHEIGHT / 2 - 4, "PAUSE"); CopyToScreen(backscreen); #ifdef OS2DIVE forceBlitting (); #endif tbreak = 1; while (k) { UpdateInput (); k = Pressed (); #ifdef OS2DIVE DosSleep (WAIT); #endif } while (!k) { UpdateInput (); k = Pressed (); #ifdef OS2DIVE DosSleep (WAIT); #endif } } switch (gamemode) { case MENU: menu_keys (); break; case KEYS: keys_keys (); break; #ifdef JOYSTICK case JOY: joy_keys (); break; #endif case GAME: #ifdef JOYSTICK for (i = 0; i < 2; i++) { double x, y; if (joystickplayer[i] >= 0) { if (object[joystickplayer[i]].type != ROCKET) continue; status = read (joystickdevice[i], &js, JS_RETURN); if (status != JS_RETURN) { break; } x = center[i][0] - js.x; y = center[i][1] - js.y; if (x == 0) x = 0.001; controls[joystickplayer[i]].jx = x; controls[joystickplayer[i]].jy = y; controls[joystickplayer[i]].mask = js.buttons; controls[joystickplayer[i]].type = C_JOYSTICK1; } } #endif #ifdef MOUSE /* Move. */ if (mouseplayer != -1 && object[mouseplayer].type == ROCKET /*&& (MouseButtons ()||controls[mouseplayer].mask) */ ) { controls[mouseplayer].mx = MouseX () * DIV; controls[mouseplayer].my = MouseY () * DIV; controls[mouseplayer].mask = MouseButtons () != 0; controls[mouseplayer].type = C_MOUSE; } #endif if (IsPressedEsc ()) { #ifdef NETSUPPORT if (!client) { #endif gamemode = MENU; while (IsPressedEsc ()) UpdateInput (); #ifdef NETSUPPORT } else { CQuit ("client exit-ESC pressed\n"); } #endif } for (i = 0; i < nrockets; i++) { #ifdef MOUSE if (i == mouseplayer) continue; #endif #ifdef JOYSTICK if (i == joystickplayer[0] || i == joystickplayer[1]) continue; #endif #ifdef NETSUPPORT if (client && !control[i]) continue; #endif if (object[i].type != ROCKET) continue; if (rotation[i]) { char s = 0; if (IsPressed (keys[i][1])) s = 1; if (IsPressed (keys[i][2])) s |= 2; if (IsPressed (keys[i][0])) s |= 4; controls[i].type = C_RKEYBOARD; controls[i].mask = s; } else { int s = 0; if (IsPressed (keys[i][2]) && IsPressed (keys[i][0])) s = 1; else if (IsPressed (keys[i][3]) && IsPressed (keys[i][0])) s = 2; else if (IsPressed (keys[i][1]) && IsPressed (keys[i][3])) s = 3; else if (IsPressed (keys[i][1]) && IsPressed (keys[i][2])) s = 4; else if (IsPressed (keys[i][2])) s = 5; else if (IsPressed (keys[i][3])) s = 6; else if (IsPressed (keys[i][0])) s = 7; else if (IsPressed (keys[i][1])) s = 8; controls[i].type = C_KEYBOARD; controls[i].mask = s; } } break; } } #define MIN(a,b) ((a)>(b)?(b):(a)) /* * Make creations happen as coalescing circular cloud. Do this by * creating random points within circle defined from center of screen, and * giving them velocity towards desired final point. */ void creators_points (int radius, int x1, int y1, int color1) { int z, x, y, x2, y2; double r; int time = 50; int midX, midY, r2,r1; midX = GAMEWIDTH / 2; midY = GAMEHEIGHT / 2; r2 = r1 = MIN(midX, midY); r2 *= r2; z = radius * radius * M_PI / DIV / DIV; while (z--) { do { x = rand() % GAMEWIDTH; y = rand() % GAMEHEIGHT; } while (((x-midX)*(x-midX) + (y-midY)*(y-midY)) > r2); r=sqrt((double)((x-midX)*(x-midX) + (y-midY)*(y-midY))); r=(r*radius/r1)/r*0.9; x2=x1+(x-midX)*r; y2=y1+(y-midY)*r; addpoint(x * 256, y * 256, (x2 - x) * 256 / (time), (y2 - y) * 256 / (time), color1 + (rand() % (DIV == 1 ? 16 : 32)), time); } } void creator (CONST int type) { int i; int color1 = color (type, 0, 0); for (i = nrockets; i < nobjects && (object[i].live || object[i].type == CREATOR); i++); if (i >= MAXOBJECT) return; if (!find_possition (&object[i].x, &object[i].y, radius (type))) return; if (i >= nobjects) nobjects = i + 1; object[i].live = 0; object[i].live1 = 1; object[i].lineto = -1; object[i].ctype = type; object[i].fx = 0.0; object[i].fy = 0.0; object[i].time = 50; object[i].rotation = 0; object[i].type = CREATOR; object[i].M = M (type); object[i].radius = radius (type); object[i].accel = ROCKET_SPEED; object[i].letter = ' '; #ifdef NETSUPPORT if (server) CreatorsPoints (object[i].radius, object[i].x, object[i].y, color1); else #endif creators_points (object[i].radius, object[i].x, object[i].y, color1); Effect (S_CREATOR1, 0); } void creator_rocket (CONST int i) { int type = ROCKET; int color1 = color (ROCKET, i, 0); if (!find_possition (&object[i].x, &object[i].y, radius (type))) return; if (sound) object[i].live1 = object[i].live; object[i].live = 0; object[i].thief = 0; object[i].ctype = type; object[i].lineto = -1; object[i].fx = 0.0; object[i].fy = 0.0; object[i].time = 50; object[i].rotation = 0; object[i].type = CREATOR; object[i].M = ROCKETM; object[i].radius = ROCKET_RADIUS; object[i].accel = ROCKET_SPEED; object[i].letter = ' '; #ifdef NETSUPPORT if (server) CreatorsPoints (ROCKET_RADIUS, object[i].x, object[i].y, color1); else #endif creators_points (ROCKET_RADIUS, object[i].x, object[i].y, color1); } static void update_forces () { int i; int r; float d; float xp, yp; int frocket = 0; for (i = 0; i < nobjects; i++) { if (object[i].live) { if (object[i].lineto != -1) { if (!object[object[i].lineto].live) object[i].lineto = -1; else if (object[i].lineto == i) object[i].lineto = -1; else { int force; xp = object[i].x - object[object[i].lineto].x; yp = object[i].y - object[object[i].lineto].y; force = sqrt (xp * xp + yp * yp); if (force >= 2 * SPRINGSIZE || gameplan == COOPERATIVE) { force = force - SPRINGSIZE; if (force < 0) force *= 3; force = force / SPRINGSTRENGTH; normalize (&xp, &yp, force * BALL_SPEED / object[i].M); object[i].fx -= xp; object[i].fy -= yp; normalize (&xp, &yp, force * BALL_SPEED / object[object[i].lineto].M); object[object[i].lineto].fx += xp; object[object[i].lineto].fy += yp; } } } if (object[i].type == ROCKET && object[i].time) object[i].time--; if (object[i].type == ROCKET && !object[i].time) { d = 640 * 640; frocket = -1; for (r = 0; r < nobjects; r++) { if (object[r].live && !object[r].time && object[r].type == EHOLE) { int distance; float gravity; xp = object[r].x - object[i].x; yp = object[r].y - object[i].y; distance = sqrt (xp * xp + yp * yp); gravity = BALL_SPEED * (gameplan == COOPERATIVE ? 200 : 50) / distance; if (gravity > BALL_SPEED * 4 / 5) gravity = BALL_SPEED * 4 / 5; normalize (&xp, &yp, gravity); object[i].fx += xp; object[i].fy += yp; } } } if (object[i].type == BALL || object[i].type == LBALL || object[i].type == BBALL || object[i].type == LUNATIC) { frocket = -1; d = 640 * 640; for (r = 0; r < nrockets; r++) { if (object[r].live && !object[r].time) { xp = object[r].x - object[i].x; yp = object[r].y - object[i].y; if (xp * xp + yp * yp < d) d = xp * xp + yp * yp, frocket = r; } } if (frocket != -1) xp = object[frocket].x - object[i].x, yp = object[frocket].y - object[i].y; else xp = GAMEWIDTH / 2 - object[i].x, yp = GAMEHEIGHT / 2 - object[i].y; if (object[i].type == LUNATIC && !rand () % 4) { xp = rand (); yp = rand () + 1; } switch (object[i].type) { case BBALL: normalize (&xp, &yp, BBALL_SPEED); break; case BALL: case LUNATIC: case LBALL: normalize (&xp, &yp, BALL_SPEED); break; } object[i].fx += xp; object[i].fy += yp; } object[i].fx *= SLOWDOWN, object[i].fy *= SLOWDOWN; } } } static void colisions () { int i, y; int colize = 0; static int ctime = 0; float xp, yp, gummfactor; for (i = 0; i < nobjects; i++) if (object[i].live) for (y = i + 1; y < nobjects; y++) if (object[y].live) { xp = object[y].x - object[i].x; yp = object[y].y - object[i].y; if (xp * xp + yp * yp < (object[y].radius + object[i].radius) * (object[y].radius + object[i].radius)) { colize = 1; if (object[i].type == HOLE || object[i].type == EHOLE) { if (object[y].type != APPLE) destroy (y); if (object[i].type == EHOLE) destroy (i); continue; } if (object[y].type == HOLE || object[y].type == EHOLE) { if (object[i].type != APPLE) destroy (i); if (object[y].type == EHOLE) destroy (y); continue; } if (object[i].type == ROCKET) { if (object[y].thief == 1 && object[i].thief == 1) { float tmp; tmp = object[i].M; object[i].M = object[y].M; object[y].M = tmp; object[i].thief = 0; object[y].thief = 0; } if (object[y].type == BBALL && object[i].thief == 1) { object[i].M += object[y].M - M (BALL); object[i].thief = 0; object[y].M = M (BALL); } else if (object[y].type == ROCKET && object[i].thief == 1) { object[i].M += object[y].M - M (ROCKET); object[i].accel += object[y].accel - ROCKET_SPEED; object[i].thief = 0; object[y].M = M (object[i].type); object[y].accel = ROCKET_SPEED - A_ADD; } if (object[i].type == ROCKET && object[y].thief == 1) { object[y].M += object[i].M - M (ROCKET); object[y].accel += object[i].accel - ROCKET_SPEED; object[y].thief = 0; object[i].M = M (object[y].type); object[i].accel = ROCKET_SPEED - A_ADD; } if (gameplan == COOPERATIVE) object[i].score++; if (object[y].letter == L_ACCEL) object[i].accel += A_ADD, object[i].score += 10; if (object[y].letter == L_GUMM) object[i].M += M_ADD, object[i].score += 10; if (object[y].letter == L_THIEF) object[i].M = M (object[i].type), object[i].accel = ROCKET_SPEED - A_ADD, object[i].score -= 30; if (object[y].letter == L_FINDER) { object[i].accel += A_ADD * (rand () % 5); object[i].M += M_ADD * (rand () % 10); object[i].score += 30; } if (object[y].letter == L_TTOOL) { object[i].thief = 1; object[i].score += 30; } object[y].letter = ' '; if (object[y].type == LBALL) object[y].type = BALL; if (object[y].type == BALL && dosprings && !(rand () % randsprings)) object[y].lineto = i; if (gameplan == DEATHMATCH && object[y].type == ROCKET && dosprings && !(rand () % (2 * randsprings))) object[y].lineto = i; } if (object[y].type == LUNATIC) { gummfactor = -ROCKETM / LUNATICM; } else if (object[i].type == LUNATIC) { gummfactor = -LUNATICM / ROCKETM; } else gummfactor = object[i].M / object[y].M; normalize (&xp, &yp, gummfactor * GUMM); object[y].fx += xp; object[y].fy += yp; normalize (&xp, &yp, 1 / gummfactor * GUMM); object[i].fx -= xp; object[i].fy -= yp; if (object[i].type == ROCKET && object[i].time) object[i].fx = 0, object[i].fy = 0; if (object[y].type == ROCKET && object[y].time) object[y].fx = 0, object[y].fy = 0; if (object[y].type == INSPECTOR && object[i].type == ROCKET) { object[y].fx = 0, object[y].fy = 0; object[i].fx *= -2, object[i].fy *= -2; } } } if (colize && !ctime) { #ifndef NAS_SOUND Effect (S_COLIZE, next); #endif ctime = 4; } if (ctime) ctime--; } void game () { long VfTime = 0; long VendSleep = 0; struct timeval VlastClk; struct timeval VnewClk; int wait = 0; load_rc (); init_menu (); gettimeofday (&VlastClk, NULL); gettimeofday (&VnewClk, NULL); VendSleep = VlastClk.tv_usec; VfTime = 1000000 / 25; while (1) { process_keys (); sprocess_keys (); update_values (); update_game (); update_forces (); colisions (); move_objects (); check_limit (); gettimeofday (&VnewClk, NULL); if (VnewClk.tv_usec < VendSleep) VendSleep -= 1000000; wait = (VfTime - VnewClk.tv_usec + VendSleep); if (wait > 0 || tbreak) draw_objects (1); else draw_objects (0); gettimeofday (&VnewClk, NULL); if (VnewClk.tv_usec < VendSleep) VendSleep -= 1000000; wait = (VfTime - VnewClk.tv_usec + VendSleep); if (tbreak) wait = VfTime; if (wait > 0) usleep (wait); VendSleep = VnewClk.tv_usec + wait; gettimeofday (&VlastClk, NULL); if (tbreak) tbreak = 0, VendSleep = VlastClk.tv_usec; } } #ifdef NETSUPPORT void client_loop2 (int draw) /*game part of server loop */ { draw_objects (draw); switch (gamemode) { case MENU: draw_menu (draw); break; case KEYS: draw_keys (draw); break; #ifdef JOYSTICK case JOY: draw_joy (draw); break; #endif } } void server_loop2 (void) /*game part of server loop */ { sprocess_keys (); update_values (); update_game (); update_forces (); colisions (); move_objects (); check_limit (); } #endif koules1.4/koules.svga.6100644 37512 310 6070 6477322207 11604 0ustar .TH KOULES 6 "3 apr 1996" "Linux" "games" .SH NAME koules.svga \- Action game for linux .SH SYNOPSIS koules.svga [-slMmdh] .SH KOULES FROM THE TOP: .br .br . .br --- . . O .br / \\ . . .br | | . . .. --- .br \\ / / \\ X O .br --- | O| .br \\ O/ .br --- --- .br . O /O O\\ .br . . . . | | .br . . . \\ / .br . .X. . O --- .br . . . . .br . . . . ... .br . . . . .br . . . . .br . . . .br H A V E .br FUN .br ! .SH DESCRIPTION .B Koules is an action game. The mission is to bounce all koules fighters from your sector .SH "OPTIONS" .TP .B \-h for help .TP .B \-s for small display(320x200) for worse machines .TP .B \-l for large display(640x480) default size .TP .B \-M disable mouse support avoid gpm/selection conflict .TP .B \-d Disable sound support Game will run faster. .SH "Network options" .TP .B \-C run koules as network client .TP .B \-S run koules as network server .TP .B \-P select port. Default is:12345 Use this in case that some other program is already using this port. .SH "Server options" .TP .B \-E run server in extra large-support for 800x620 X clients. .TP .B \-W run server in wide mode-support for 320x200 svgalib and OS/2 clients. Use this in case that server is refusing your clients. .TP .B \-L select level for server .TP .B \-D select dificulty for server: 0: nightmare 1: hard 2: medium(default and recomended) 3: easy 4: very easy .TP .B \-K run server in deathmatch mode .SH "Points:" .br Bounce something : +1 .br Eat extension : +10 .br Eat thief : -30 .br Eat friend : +30 .br .B At end of level .br every live : +20 .br every lost level : -100 .br .B In deathmatch mode .br every destroyed concurrent: +100 .SH PORTABILITY The program is written in ANSI C and uses the svgalib/X11 graphics library. .SH BUGS/LIMITATIONS There is bug in my svgalib.1.2.6: switch to another console, switch back and press enter it will crash your computer.It is not koules bug!!! Test it on svgalib/demos/keytest! There are problems with keyboard controller in more than 2 player mode( use mouse or joystick ) .SH SEE ALSO http://www.paru.cas.cz/~hubicka/koules/English/koules.html .SH AUTHOR Jan Hubicka .B email: hubicka@limax.paru.cas.cz .br .B smail: .br Jan Hubicka .br Dukelskych bojovniku 1944 .br Tabor 39001 .br Czech Republic koules1.4/cmap.c100644 37512 310 10663 6477322207 10363 0ustar /*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * Liecnece details. * *----------------------------------------------------------* * cmap.c cmap routines for 256color librarys-svgalib style* ***********************************************************/ #include "koules.h" static INLINE int col (int p, CONST float p1) { p *= p1; if (p > 63) return (63); if (p < 0) return (0); return (p); } int fadedout = 0; void setcustompalette (CONST int p, CONST float p1) { /* 0-31 black to yellow for starwars scroller */ /* 32-63 black to red */ /* 64-96 for red koules */ /* 96-128 for yellow rockets */ /* 128-160 for green rockets */ /* 160-192 for blue rockets */ /* 192-256 gray cmap for stars */ Palette pal; int i; for (i = 0; i < 64; i++) { int r, g, b; r = g = b = 0; if ((i & 32) > 0) b = (i & 31) << 1; if (i < 32) { r = (i & 3) << 4; /* 2 bits */ g = (i & 4) << 3; /* 1 bit */ b = (i & 24) << 1; /* 2 bits */ } pal.color[i].red = col (r + p, p1); pal.color[i].green = col (g + p, p1); pal.color[i].blue = col (b + p, p1); } for (i = 64; i < 64 + 32; i++) { int r, g, b; r = g = b = 0; r = (32 - (i - 63)) << 1; if (i < 64 + 8) { b = g = (((8 - (i - 63))) << 5) / 5; } pal.color[i].red = col (r + p, p1); pal.color[i].green = col (g + p, p1); pal.color[i].blue = col (b + p, p1); } for (i = 96; i < 96 + 32; i++) { int r, g, b; r = g = b = 0; r = g = (32 - (i - 95)) << 1; if (i < 96 + 8) { b = ((8 - (i - 95))) << 3; } pal.color[i].red = col (r + p, p1); pal.color[i].green = col (g + p, p1); pal.color[i].blue = col (b + p, p1); } for (i = 128; i < 128 + 32; i++) { int r, g, b; r = g = b = 0; g = (32 - (i - 127)) << 1; if (i < 128 + 8) { r = b = ((8 - (i - 127))) << 3; } pal.color[i].red = col (r + p, p1); pal.color[i].green = col (g + p, p1); pal.color[i].blue = col (b + p, p1); } for (i = 160; i < 160 + 32; i++) { int r, g, b; r = g = b = 0; b = (32 - (i - 159)) << 1; if (i < 160 + 8) { r = g = (((8 - (i - 159))) << 3) / 2; } pal.color[i].red = col (r + p, p1); pal.color[i].green = col (g + p, p1); pal.color[i].blue = col (b + p, p1); } for (i = 0; i < 32; i++) { pal.color[i].red = col (i * 2 + p, p1); pal.color[i].green = col (i * 2 + p, p1); pal.color[i].blue = col (p, p1); } for (i = 0; i < 32; i++) { pal.color[192 + i].red = col (i * 2 + p, p1); pal.color[192 + i].green = col (i * 2 + p, p1); pal.color[192 + i].blue = col (i * 2 + p, p1); } pal.color[0].red = 0; pal.color[0].green = 0; pal.color[0].blue = 0; pal.color[255].red = col (64 + p, p1); pal.color[255].green = col (64 + p, p1); pal.color[255].blue = col (64 + p, p1); WaitRetrace (); SetPalette (&pal); } void fadeout () { if (!fadedout) { float i; for (i = 1; i >= 0; i -= 0.1) { setcustompalette (0, i); usleep (200), tbreak = 1; } setcustompalette (-65, 0); fadedout = 1; } } void fadein () { if (fadedout) { float i; for (i = 0; i <= 1; i += 0.1) { setcustompalette (0, i); usleep (200), tbreak = 1; } setcustompalette (0, 1); fadedout = 0; } } void fadein1 () /*better for star background */ { if (fadedout) { int i; for (i = -64; i <= 0; i += 6) { setcustompalette (i, 1); usleep (200), tbreak = 1; } setcustompalette (0, 1); fadedout = 0; } } koules1.4/framebuffer.h100644 37512 310 2075 6477322207 11712 0ustar /*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * framebuffer.h interface for framebuffer * ***********************************************************/ extern void create_bitmap (); extern void drawbackground (); extern void drawstarbackground (); koules1.4/koules-bin.lsm100644 37512 310 2662 6477322207 12044 0ustar Begin3 Title: Koules - an action game for UNIX/X11 and Linux/svgalib and OS/2 Version: 1.4 Entered-date: Mar 1 1998 Description: Koules is a fast action arcade-style game for UNIX and OS/2. This version supports X window system, SVGAlib for Linux and OS/2. It works in fine (up to 900x620) resolution with cool 256 color graphics, multiplayer mode up to 5 players, full sound and, of course, network support. Koules is an original idea. First version of Koules was developed from scratch by Jan Hubicka in July 1995. Keywords: game X11 Xlib svgalib digital sound video action fun nice good sex unix cool NHL cooking ironing sport network Author: hubicka@limax.paru.cas.cz (Jan Hubicka) Maintained-by: hubicka@limax.paru.cas.cz (Jan Hubicka) Primary-site: sunsite.unc.edu /pub/Linux/games/video/koules 155kb koules1.4-bin-svga.tar.gz 55kb koules1.4-bin-X11-aout.tar.gz 64kb koules1.4-bin-X11-elf.tar.gz 122kb koules1.4-sound.tar.gz Alternate-site: tsx-11.mit.edu /pub/linux/binaries/usr.games/koules 155kb koules1.4-bin-svga.tar.gz 55kb koules1.4-bin-X11-aout.tar.gz 64kb koules1.4-bin-X11-elf.tar.gz 122kb koules1.4-sound.tar.gz Platform: Linux, svgalib 1.2.0 or greater, hpux, sun, freeBSD, IRIX, ULTRIX, any UNIX with X11 with ansi-c compiler, OS/2 Copying-policy: GNU GENERAL PUBLIC LICENSE All rights reserved by the author End koules1.4/svgalib/ 40755 37512 310 0 6501010051 10556 5ustar koules1.4/svgalib/init.c100644 37512 310 30601 6477322207 12027 0ustar /*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * init.c jlib depended initialization routines * ***********************************************************/ #define PLAYFORM_VARIABLES_HERE #include #include GraphicsContext *physicalscreen, *backscreen, *starbackground, *background; void *fontblack; void *fontwhite; int VGAMODE = G640x480x256; int GAMEWIDTH = 640; int GAMEHEIGHT = 460; int MAPWIDTH = 640; int MAPHEIGHT = 460; int DIV = 1; int flipping=0,page=0; #include "../koules.h" #include "../server.h" #include "../client.h" #include "../net.h" #include "../framebuffer.h" #include #include #include #include #include #include #include #include /*for waiting for retrace */ #include /*for waiting for retrace */ extern void fadein1 (); extern GraphicsContext *starbackground; extern void points (); extern void points1 (); char hole_data[HOLE_RADIUS * 2][HOLE_RADIUS * 2]; char ehole_data[HOLE_RADIUS * 2][HOLE_RADIUS * 2]; extern char rocketcolor[5]; extern void setcustompalette (int, float); extern void starwars (); extern void game (); #define NCOLORS 32 #define HOLE_XCENTER (2*HOLE_RADIUS-3*HOLE_RADIUS/4) #define HOLE_YCENTER (2*HOLE_RADIUS-HOLE_RADIUS/4) #define HOLE_MAX_RADIUS (HOLE_RADIUS/DIV+0.5*HOLE_RADIUS/DIV) #define HOLE_SIZE_MAX (radius*radius) static GraphicsContext * my_allocatecontext () { return malloc (sizeof (GraphicsContext)); } char *framebuff; static void initialize () { #ifdef SOUND printf ("Initializing sound server...\n"); if (sndinit) init_sound (); #else printf ("Sound driver not avaiable-recompile koules with SOUND enabled\n"); #endif printf ("Autoprobing hardware\n"); printf ("Initializing joystick driver\n"); #ifdef JOYSTICK joystickdevice[0] = open ("/dev/js0", O_RDONLY); if (joystickdevice[0] < 0) { perror ("Joystick driver"); printf ("Joystick 1 not avaiable..\n"); joystickplayer[0] = -1; } else printf ("Joystick 1 initialized\n"); joystickdevice[1] = open ("/dev/js1", O_RDONLY); if (joystickdevice[1] < 0) { perror ("Joystick driver"); printf ("Joystick 2 not avaiable..\n"); joystickplayer[1] = -1; } else printf ("Joystick 2 initialized\n"); #else printf ("Joystick driver not avaiable(recompile koules with JOYSTICK enabled )\n"); #endif printf ("Testing terminal\n"); printf ("Initializing mouse server\n"); #ifdef MOUSE if (!nomouse) vga_setmousesupport (1); #endif printf ("Initializing graphics server\n"); vga_init (); if (!vga_hasmode (VGAMODE)) { printf ("graphics mode unavaiable(reconfigure svgalib)\n"); if (VGAMODE == G640x480x256) printf ("or use -s option\n"); exit (-2); } vga_setmode (VGAMODE); printf ("Initializing video memory\n"); setcustompalette (0, 1); gl_setcontextvga (VGAMODE); physicalscreen = my_allocatecontext (); backscreen = my_allocatecontext (); gl_setclippingwindow (0, 0, MAPWIDTH - 1, MAPHEIGHT + 19); gl_getcontext (physicalscreen); if(flipping) { if(physicalscreen->modetype!=CONTEXT_LINEAR||!gl_enablepageflipping(physicalscreen)) flipping=0; else { backscreen=physicalscreen; flippage(); } } printf ("Initializing graphics font\n"); fontblack = malloc (256 * 8 * 8); gl_expandfont (8, 8, back (3), gl_font8x8, fontblack); fontwhite = malloc (256 * 8 * 8); gl_setfont (8, 8, fontwhite); gl_expandfont (8, 8, 255, gl_font8x8, fontwhite); gl_write (0, 0, "Graphics daemons fired up"); gl_write (0, 8, "Checking system consitency....virus not found.."); if(!flipping) { gl_setcontextvgavirtual (VGAMODE); gl_setclippingwindow (0, 0, MAPWIDTH - 1, MAPHEIGHT + 19); } gl_getcontext (backscreen); gl_setclippingwindow (0, 0, MAPWIDTH - 1, MAPHEIGHT + 19); gl_setcontext (physicalscreen); gl_write (0, 16, "Calibrating delay loop"); gl_setcontextvgavirtual (VGAMODE); background = my_allocatecontext (); gl_setclippingwindow (0, 0, MAPWIDTH - 1, MAPHEIGHT + 19); gl_getcontext (background); gl_setcontextvgavirtual (VGAMODE); starbackground = my_allocatecontext (); gl_setclippingwindow (0, 0, MAPWIDTH - 1, MAPHEIGHT + 19); gl_getcontext (starbackground); gl_setcontext (physicalscreen); gl_write (0, 24, "Initializing keyboard daemons"); if (keyboard_init ()) { printf ("Could not initialize keyboard.\n"); exit (-1); } /*keyboard_translatekeys(TRANSLATE_CURSORKEYS | TRANSLATE_KEYPADENTER); */ keyboard_translatekeys (0); gl_write (0, 32, "1 pc capable keyboard found"); } void flippage(void) { int offset=MAPWIDTH * (MAPHEIGHT+20) * page,offset1=MAPWIDTH * (MAPHEIGHT+20)*(page^1); if(physicalscreen->modeflags&MODEFLAG_FLIPPAGE_BANKALIGNED) { offset=(offset+0xffff) & ~0xffff; offset1=(offset+0xffff) & ~0xffff; } vga_setdisplaystart(offset); gl_setscreenoffset(offset1); page=page^1; } void uninitialize () { static int uninitialized = 0; if (uninitialized) return; uninitialized = 1; /* int h, i; float p = 0; char bitmap1[MAPWIDTH][MAPHEIGHT + 20]; char bitmap2[MAPWIDTH][MAPHEIGHT + 20]; if (!(physicalscreen->modeflags & (MODEFLAG_PAGEFLIPPING_ENABLED | MODEFLAG_TRIPLEBUFFERING_ENABLED))) { gl_enableclipping (); gl_setcontext (physicalscreen); gl_getbox (0, 0, MAPWIDTH, MAPHEIGHT + 20, bitmap1); for (h = (MAPHEIGHT + 20) / 2 - (MAPHEIGHT + 18) / 16; h >= 2; h -= (MAPHEIGHT + 18) / 16) { p += 64.0 / 8; gl_scalebox (MAPWIDTH, MAPHEIGHT + 20, bitmap1, MAPWIDTH, h * 2, bitmap2); gl_putbox (0, (MAPHEIGHT + 20) / 2 - h, MAPWIDTH, h * 2, bitmap2); gl_fillbox (0, (MAPHEIGHT + 20) / 2 - h - (MAPHEIGHT + 20) / 16, MAPWIDTH, (MAPHEIGHT + 20) / 16, 0); gl_fillbox (0, (MAPHEIGHT + 20) / 2 + h, MAPWIDTH, (MAPHEIGHT + 20) / 16, 0); setcustompalette ((int) p, 1); } gl_fillbox (0, (MAPHEIGHT + 20) / 2 - 50 - 2 / DIV, MAPWIDTH, 50, 0); gl_fillbox (0, (MAPHEIGHT + 20) / 2 + 2 / DIV, MAPWIDTH, 50, 0); for (i = MAPWIDTH / 2; i >= 5; i -= 5 / DIV) gl_fillbox (0, (MAPHEIGHT + 20) / 2 - 2, MAPWIDTH / 2 - i, 20, 0), gl_fillbox (MAPWIDTH / 2 + i, (MAPHEIGHT + 20) / 2 - 2, MAPWIDTH / 2 - i, 20, 0), usleep (500); } */ keyboard_close (); vga_setmode (TEXT); #ifdef SOUND if (sndinit) kill_sound (); #endif printf ("Life support systems disconected\n" "\n\nHave a nice LINUX!\n"); #ifdef NETSUPPORT if (client) CQuit ("Game uninitialized\n"); #endif } static void uninitializes (int num) { char s[256]; sprintf (s, "Signal %i!!!\n", num); CQuit (s); uninitialize (); exit (1); } int main (int argc, char **argv) { char c; nrockets = 1; printf ("\n\n\n\n" " The game\n" " K O U L E S\n" " For svgalib\n" " Version:1.4\n" "\n\n\n\n" " Copyright(c) Jan Hubicka 1995, 1996\n\n\n"); while ((c = getopt (argc, argv, "fKWD:P:L:SC:slExMmdh")) != EOF) { switch (c) { #ifdef NETSUPPORT case 'K': server = 1; servergameplan = DEATHMATCH; break; case 'W': server = 1; GAMEHEIGHT = 360; break; case 'D': { int p; server = 1; if (sscanf (optarg, "%i", &p) != 1 || p < 0 || p > 4) { printf ("-D : invalid difficulty\n"); exit (0); } difficulty = p; } break; case 'P': { int p; if (sscanf (optarg, "%i", &p) != 1 || p < 0) { printf ("-P : invalid port number\n"); exit (0); } initport = p; } break; case 'L': { int p; server = 1; if (sscanf (optarg, "%i", &p) != 1 || p < 1 || p > 100) { printf ("-L : invalid level number\n"); exit (0); } serverstartlevel = p - 1; } break; case 'S': server = 1; break; case 'C': strcpy (servername, optarg); client = 1; break; #else case 'K': case 'W': case 'P': case 'L': case 'D': case 'S': case 'C': case 'E': printf ("Network option but no network support compiled\n"); break; #endif #ifdef NETSUPPORT case 'E': server = 1; GAMEWIDTH = 900; GAMEHEIGHT = 600; MAPWIDTH = 900; MAPHEIGHT = 600; DIV = 2; break; #endif case 'f': flipping=1; break; case 's': VGAMODE = G320x200x256; GAMEWIDTH = 640; GAMEHEIGHT = 360; MAPWIDTH = 320; MAPHEIGHT = 180; DIV = 2; break; case 'l': VGAMODE = G640x480x256; if (GAMEHEIGHT == 360) GAMEHEIGHT = MAPHEIGHT = 360; else MAPHEIGHT = GAMEHEIGHT = 460; GAMEWIDTH = 640; MAPWIDTH = 640; DIV = 1; break; case 'x': VGAMODE = G320x240x256; GAMEWIDTH = 640; GAMEHEIGHT = 440; MAPWIDTH = 320; MAPHEIGHT = 220; break; #ifdef MOUSE case 'M': nomouse = 1; drawpointer = 0; break; #endif #ifdef SOUND case 'd': sndinit = 0; break; #endif default: printf ("USAGE:\n" " -h for help\n" " -f enable experimental page flipping mode\n" " -s for small display(320x200)\n" " -l for large display(640x480)\n" #ifdef SOUND " -d Disable sound support\n" #endif #ifdef MOUSE " -M disable mouse support\n" #endif #ifdef NETSUPPORT " -S run koules as network server\n" " -C run koules as network client\n" " -P select port. Default is:%i\n" " -W run server in width mode-support for 320x200 svgalib and OS/2 clients\n" " -L select level for server\n" " -D select dificulty for server:\n" " 0: nightmare\n" " 1: hard\n" " 2: medium(default and recomended)\n" " 3: easy\n" " 4: very easy\n" " -K run server in deathmatch mode\n", DEFAULTINITPORT #endif ); exit (2); } } srand (time (NULL)); #ifdef NETSUPPORT if (server) { init_server (); server_loop (); } if (client) { init_client (); atexit (uninitialize); signal (SIGHUP, uninitializes); signal (SIGINT, uninitializes); signal (SIGTRAP, uninitializes); signal (SIGABRT, uninitializes); signal (SIGSEGV, uninitializes); signal (SIGQUIT, uninitializes); signal (SIGFPE, uninitializes); signal (SIGTERM, uninitializes); signal (SIGBUS, uninitializes); signal (SIGIOT, uninitializes); signal (SIGILL, uninitializes); MAPWIDTH = GAMEWIDTH / DIV; MAPHEIGHT = GAMEHEIGHT / DIV; } #endif printf ("LINUX4GW 1.12.45b professional\n"); printf ("Copyright(c)1991,1992,1993,1994,1995 Jan Hubicka(JAHUSOFT)\n"); create_bitmap (); initialize (); gl_write (0, 40, "Initializing GUI user interface"); #ifdef SOUND sound = sndinit; #endif gamemode = MENU; gl_write (0, 48, "Initializing 4d rotation tables"); gl_write (0, 56, "Initializing refresh daemon "); gl_write (0, 66, "please wait 12043.21 Bogomipseconds"); drawbackground (); drawstarbackground (); gl_setfont (8, 8, fontblack); keys[0][0] = SCANCODE_CURSORBLOCKUP; keys[0][1] = SCANCODE_CURSORBLOCKDOWN; keys[0][2] = SCANCODE_CURSORBLOCKLEFT; keys[0][3] = SCANCODE_CURSORBLOCKRIGHT; keys[1][0] = SCANCODE_CURSORUP; keys[1][1] = SCANCODE_CURSORDOWN; keys[1][2] = SCANCODE_CURSORLEFT; keys[1][3] = SCANCODE_CURSORRIGHT; starwars (); #ifdef NETSUPPORT if (client) { vga_runinbackground (1); client_loop (); } else #endif game (); printf ("uninitializing\n"); uninitialize (); return 0; } koules1.4/svgalib/input.h100644 37512 310 6443 6477333552 12224 0ustar /*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * interface.h interface for vgakeyboard * ***********************************************************/ /* Changes: joystick A button included into buttons * * for which function "Pressed()" returns 1 * * (c) 1997 by Ludvik Tesar (Ludv\'{\i}k Tesa\v{r}) * ************************LT*********************************/ #include #include #include #include #ifdef JOYSTICK extern int joystickdevice[2]; #endif #define SCANCODE_P 25 #define IsPressed(scancode) keyboard_keypressed(scancode) #ifdef MOUSE #define UpdateInput() keyboard_update (),(!nomouse?mouse_update ():0) #define MouseButtons() (!nomouse?mouse_getbutton():0) #define MouseX() (!nomouse?mouse_getx():0) #define MouseY() (!nomouse?mouse_gety():0) #else #define UpdateInput() keyboard_update () #define MouseButtons() DUMMY #define MouseX() DUMMY #define MouseY() DUMMY #endif /*here is probably bug.... some users reported that these functions not work... probably sometimes some keys are reported as pressed */ extern inline int Pressed () { int z; #ifdef JOYSTICK int status; struct JS_DATA_TYPE js; if(joystickdevice[0]>=0) { status = read (joystickdevice[0], &js, JS_RETURN); if ((status == JS_RETURN)&&js.buttons)return 1; } #endif #ifdef MOUSE if (!nomouse && MouseButtons ()) return (1); #endif for (z = 0; z < 128; z++) if (keyboard_keypressed (z)) { return 1; } return (0); } extern inline int GetKey () { int z, k = 0; #ifdef MOUSE if (!nomouse && MouseButtons ()) return (1); #endif for (z = 0; z < 128; z++) if (keyboard_keypressed (z)) { if (k) return (0); k = z; } return (k); } #define IsPressedEsc() IsPressed (SCANCODE_ESCAPE) #define IsPressedP() IsPressed (SCANCODE_P) #define IsPressedH() IsPressed (35) #define IsPressedEnter() (IsPressed (SCANCODE_ENTER)||\ IsPressed (SCANCODE_SPACE)||\ IsPressed (SCANCODE_KEYPADENTER)) #define IsPressedUp() (IsPressed (SCANCODE_CURSORUP) ||\ IsPressed (SCANCODE_CURSORBLOCKUP)) #define IsPressedDown() (IsPressed (SCANCODE_CURSORDOWN) ||\ IsPressed (SCANCODE_CURSORBLOCKDOWN)) #define IsPressedLeft() (IsPressed (SCANCODE_CURSORLEFT) ||\ IsPressed (SCANCODE_CURSORBLOCKLEFT)) #define IsPressedRight() (IsPressed (SCANCODE_CURSORRIGHT) ||\ IsPressed (SCANCODE_CURSORBLOCKRIGHT)) koules1.4/svgalib/interface.h100644 37512 310 11776 6477322207 13045 0ustar /*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * interface.h interface for svgalib * ***********************************************************/ #include #include #include #ifdef MOUSE #include #endif #include #define EYE_RADIUS (DIV==1?5:6) #define MOUSE_RADIUS 4 #define SVGALIBSUPPORT typedef char *RawBitmapType; typedef char *BitmapType; typedef GraphicsContext *VScreenType; #ifndef PLATFORM_VARIABLES_HERE extern int GAMEWIDTH; extern int GAMEHEIGHT; extern int MAPWIDTH; extern int MAPHEIGHT; extern int DIV; extern int flipping; extern int page; extern void *fontblack; extern void *fontwhite; extern VScreenType physicalscreen; extern VScreenType backscreen; extern VScreenType background; extern VScreenType starbackground; #endif #define Truecolor 0 #define FastAccess 1 #define BitmapToBuffer(bitmap) (bitmap) #define VScreenToBuffer(screen) (screen)->vbuf #define SetPalette(palette) gl_setpalette (palette) #define SSetPixel(x,y,color) gl_setpixel(x,y,color) #if 0 #if DIV==1 #define BSetPixel(bitmap,x,y,color) *(BitmapToBuffer(bitmap)+(x)+(((y)&0xffffff00)>>1)+\ (((y)&0xffffff00)<<1))=color #define SMySetPixel(screen,x,y,color) *(VScreenToBuffer(screen)+(x)+(((y)&0xffffff00)>>1)+\ (((y)&0xffffff00)<<1))=color /*#define SSetPixel(x,y,color) *((currentcontext.vbuf)+(x)+(y)*MAPWIDTH) )=color */ #else #define BSetPixel(bitmap,x,y,color) *(BitmapToBuffer(bitmap)+(x)+((y)&0xffffff00)+(((y)\ &0xffffff00)>>2))=color /*#define SSetPixel(x,y,color) *((currentcontext.vbuf)+(x)+((y)*MAPWIDTH))=color */ #define SMySetPixel(screen,x,y,color) *(VScreenToBuffer(screen)+(x)+((y)&0xffffff00)+(((y)\ &0xffffff00)>>2))=color /*mysetpixel is fast setpixel for drawing movers y=realy*256 */ #endif #else #define BSetPixel(bitmap,x,y,color) *(BitmapToBuffer(bitmap)+(x)+(y)*MAPWIDTH)=color #define SMySetPixel(screen,x,y,color) *(VScreenToBuffer(screen)+(x)+((y)>>8)*MAPWIDTH)=color #endif #define SetScreen(screen) gl_setcontext (screen) extern inline void DrawBlackMaskedText (int x, int y, char *text) { gl_setwritemode (WRITEMODE_MASKED); gl_setfont (8, 8, fontblack); gl_write (x, y, text); } extern inline void DrawWhiteMaskedText (int x, int y, char *text) { gl_setwritemode (WRITEMODE_MASKED); gl_setfont (8, 8, fontwhite); gl_write (x, y, text); } extern inline void DrawText (int x, int y, char *text) { gl_setwritemode (WRITEMODE_OVERWRITE); gl_setfont (8, 8, fontwhite); gl_write (x, y, text); } extern inline void DrawRectangle (int x1, int y1, int x2, int y2, int color) { gl_line ((int) x1, (int) y1, (int) x1, (int) y2, color); gl_line ((int) x1, (int) y2, (int) x2, (int) y2, color); gl_line ((int) x2, (int) y2, (int) x2, (int) y1, color); gl_line ((int) x2, (int) y1, (int) x1, (int) y1, color); } extern inline char * CompileBitmap (int x, int y, char *bitmap) { int size1; char *cbitmap; size1 = gl_compiledboxmasksize (x, y, bitmap); if ((cbitmap = malloc (size1)) == NULL) perror ("create_bitmap"), exit (1); gl_compileboxmask (x, y, bitmap, cbitmap); return (cbitmap); } #define FillRectangle(x,y,x1,y1,color) gl_fillbox((x),(y),(x1),(y1),(color)) #define Line(x1,y1,x2,y2,color) gl_line((x1),(y1),(x2),(y2),(color)) #define HLine(x1,y1,x2,color) gl_hline((x1),(y1),(x2),(color)) #define PutBitmap(x,y,xsize,ysize,bitmap) gl_putboxmaskcompiled((x),(y),(xsize),(ysize),(bitmap)) #define WaitRetrace() vga_waitretrace() #define EnableClipping() gl_enableclipping() #define DisableClipping() gl_disableclipping() #define ClearScreen() gl_clearscreen (0) extern void flippage(void); extern inline void CopyVSToVS (VScreenType source, VScreenType destination) { SetScreen (source); if(!flipping||(destination!=backscreen&&destination!=physicalscreen)) gl_copyscreen (destination); else { gl_copyboxtocontext(0,0,MAPWIDTH,MAPHEIGHT+20,destination,0,0); } } extern inline void CopyToScreen (VScreenType source) { SetScreen (source); if(!flipping) gl_copyscreen (physicalscreen); else flippage(); } #define CharX 8 #define CharY 8 #define FAST_WIDELINE koules1.4/copyright.h100644 0 0 1402 6500602737 13045 0ustar rootroot/* This copyright is only for sound servers For the copyright of koules sources see README Note: sound server was taken from xgalaga by Joe Rumsey, who took it from paradise nettrek client. It is covered by the following copyright Copyright (C) 1995 S. M. Patel (smpatel@wam.umd.edu) Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. No representations are made about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty. */ koules1.4/xlib/ 40755 37512 310 0 6477562715 11734 5ustar rootrootkoules1.4/xlib/mem.S100644 37512 310 20457 6477322207 12751 0ustar rootroot#if defined__i386__&&defined(ASSEMBLY) #define __ASSEMBLY__ #include #ifndef SYMBOL_NAME #define SYMBOL_NAME(name) _ ## name #endif #ifndef ENTRY #define ENTRY(name) .align 4; .globl _ ## name ## ; _ ## name ## : #endif .file "mem.S" /* This file contains unrolled memcpy functions. */ /* Prototype: memcpy4to3( void *dest, void *src, int n ) */ /* Copies pixels from 4-byte-per-pixel screen to 3-byte-per-pixel screen, */ /* discarding the last byte of each pixel. */ /* Only uses 32-bit aligned word accesses. */ /* Instructions have been shuffled a bit for possible avoidance of */ /* pipeline hazards. */ .text ENTRY(memcpy4to3) pushl %ebp movl %esp,%ebp pushl %edi pushl %esi pushl %ebx pushl %ecx movl 8(%ebp),%edi /* destination address */ movl 12(%ebp),%esi /* source address */ movl 16(%ebp),%ecx /* number of pixels */ /* Handle chunks of 8 pixels. */ 1: cmpl $8,%ecx jl 2f movl (%esi),%eax /* pixel 0 */ movl 4(%esi),%ebx /* pixel 1 */ shll $8,%eax /* BGR0 in 8-31 */ shrd $8,%ebx,%eax /* BGR0 in 0-23, B1 in 24-31 */ movl %eax,(%edi) /* write word */ shll $8,%ebx /* GR1 in 16-31 */ movl 8(%esi),%eax /* pixel 2 */ shrd $16,%eax,%ebx /* GR1 in 0-15, BG2 in 16-31 */ movl %ebx,4(%edi) /* write word */ shll $8,%eax /* move R2 into 24-31 */ movl 12(%esi),%ebx /* pixel 3 */ shrd $24,%ebx,%eax /* R2 in 0-7, BGR3 in 8-31 */ movl %eax,8(%edi) /* write word */ movl 16(%esi),%eax /* pixel 4 */ shll $8,%eax /* BGR4 in 8-31 */ movl 20(%esi),%ebx /* pixel 5 */ shrd $8,%ebx,%eax /* BGR4 in 0-23, B5 in 24-31 */ movl %eax,12(%edi) /* write word */ shll $8,%ebx /* GR5 in 16-31 */ movl 24(%esi),%eax /* pixel 6 */ shrd $16,%eax,%ebx /* GR5 in 0-15, BG6 in 16-31 */ movl %ebx,16(%edi) /* write word */ subl $8,%ecx /* blended end-of-loop instruction */ shll $8,%eax /* move R6 into 24-31 */ movl 28(%esi),%ebx /* pixel 7 */ shrd $24,%ebx,%eax /* R6 in 0-7, BGR7 in 8-31 */ addl $32,%esi /* blended end-of-loop instruction */ movl %eax,20(%edi) /* write word */ addl $24,%edi jmp 1b 2: /* Do the remaining pixels. */ andl %ecx,%ecx jz 4f /* none left */ 3: movl (%esi),%eax movw %eax,(%edi) shrl $16,%eax movb %al,2(%edi) addl $4,%esi addl $3,%edi decl %ecx jnz 3b 4: popl %ecx popl %ebx popl %esi popl %edi popl %ebp ret /* Prototype: memcpy32shift8( void *dest, void *src, int n ) */ /* Copies pixels from 4-byte-per-pixel screen organized as BGR0 to */ /* 0BGR 4-byte-per-pixel screen. */ /* Used by copyscreen for ATI mach32 32-bit truecolor modes. */ .text ENTRY(memcpy32shift8) pushl %ebp movl %esp,%ebp pushl %edi pushl %esi pushl %ecx pushl %ebx movl 8(%ebp),%edi /* destination address */ movl 12(%ebp),%esi /* source address */ movl 16(%ebp),%ecx /* number of pixels */ /* Handle chunks of 8 pixels. */ 1: cmpl $8,%ecx jl 2f movl (%esi),%eax shll $8,%eax movl %eax,(%edi) movl 4(%esi),%edx shll $8,%edx movl %edx,4(%edi) movl 8(%esi),%eax shll $8,%eax movl %eax,8(%edi) movl 12(%esi),%edx shll $8,%edx movl %edx,12(%edi) movl 16(%esi),%eax shll $8,%eax movl %eax,16(%edi) movl 20(%esi),%edx shll $8,%edx movl %edx,20(%edi) movl 24(%esi),%eax subl $8,%ecx shll $8,%eax movl %eax,24(%edi) movl 28(%esi),%edx addl $32,%esi shll $8,%edx movl %edx,28(%edi) addl $32,%edi jmp 1b 2: andl %ecx,%ecx jz 4f 3: movl (%esi),%eax shll $8,%eax movl %eax,(%edi) addl $4,%esi addl $4,%edi decl %ecx jnz 3b 4: popl %ebx popl %ecx popl %esi popl %edi popl %ebp ret /* Optimized memcpy. */ /* Performance on par with inlined 32-bit aligned rep movsl on slow */ /* motherboard. */ /* Hypothesized to be fast on motherboards that handle writes efficiently */ /* and suffer with slow rep movsl microcode in 486/Pentium. */ /* (esp. Cyrix 486DX WB, Headland HTK 486 chipset, Pentium). */ /* Arguments passed in registers: */ /* destination address in %ebx (original %ebx has been saved) */ /* source address in %edx */ /* count in %ecx */ #define MOVEBYTE(n) movb n(%edx),%al; movb %al,n(%ebx) #define MOVESHORT(n) movw n(%edx),%ax; movw %ax,n(%ebx) #define MOVEWORD(n) movl n(%edx),%eax; movl %eax,n(%ebx) ENTRY(_memcpy_jumptable) .long copy0 .long copy1, copy2, copy3, copy4 .long copy5, copy6, copy7, copy8 .long copy9, copy10, copy11, copy12 .long copy13, copy14, copy15, copy16 .long copy17, copy18, copy19, copy20 .long copy21, copy22, copy23, copy24 .long copy25, copy26, copy27, copy28 .long copy29, copy30, copy31, copy32 jumptable2: .long align0, align1, align2, align3 ENTRY(_memcpyasm_regargs) /* This is only valid if nu_bytes >= 3. */ /* Align destination to 32-bit boundary */ movl %ebx,%eax andl $3,%eax jmp *jumptable2(,%eax,4) align1: MOVESHORT(0) MOVEBYTE(2) addl $3,%edx addl $3,%ebx subl $3,%ecx jmp copyaligned align3: MOVEBYTE(0) incl %edx incl %ebx decl %ecx jmp copyaligned align2: MOVESHORT(0) addl $2,%edx addl $2,%ebx subl $2,%ecx align0: copyaligned: cmpl $32,%ecx ja copyunrolled /* <= 32 bytes. */ /* Copy remaining bytes (0-32). */ jmp *SYMBOL_NAME(_memcpy_jumptable)(,%ecx,4) .align 4,0x90 /* memcpyasm_regargs_aligned is only called if nu_bytes > 32. */ ENTRY(_memcpyasm_regargs_aligned) copyunrolled: /* Copy chunks of 32 bytes. */ /* End-of-loop increment instructions blended in. */ addl $32,%ebx /*P ok */ movl (%edx),%eax movl %eax,(0-32)(%ebx) /*P ok */ movl 4(%edx),%eax movl %eax,(4-32)(%ebx) /*P ok */ movl 8(%edx),%eax movl %eax,(8-32)(%ebx) /*P ok */ movl 12(%edx),%eax movl %eax,(12-32)(%ebx) /*P ok */ movl 16(%edx),%eax addl $32,%edx /*P ok */ movl %eax,(16-32)(%ebx) subl $32,%ecx /*P ok */ movl (20-32)(%edx),%eax movl %eax,(20-32)(%ebx) /*P ok */ movl (24-32)(%edx),%eax movl %eax,(24-32)(%ebx) /*P ok */ movl (28-32)(%edx),%eax movl %eax,(28-32)(%ebx) /*P ok */ cmpl $32,%ecx jge copyunrolled /*P fail */ /* Copy remaining bytes (less than 32). */ jmp *SYMBOL_NAME(_memcpy_jumptable)(,%ecx,4) #define END ret copy0: END copy1: MOVEBYTE(0) END copy2: MOVESHORT(0) END copy3: MOVESHORT(0) MOVEBYTE(2) END copy4: MOVEWORD(0) END copy5: MOVEWORD(0) MOVEBYTE(4) END copy6: MOVEWORD(0) MOVESHORT(4) END copy7: MOVEWORD(0) MOVESHORT(4) MOVEBYTE(6) END copy8: MOVEWORD(0) MOVEWORD(4) END copy9: MOVEWORD(0) MOVEWORD(4) MOVEBYTE(8) END copy10: MOVEWORD(0) MOVEWORD(4) MOVESHORT(8) END copy11: MOVEWORD(0) MOVEWORD(4) MOVESHORT(8) MOVEBYTE(10) END copy12: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) END copy13: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEBYTE(12) END copy14: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVESHORT(12) END copy15: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVESHORT(12) MOVEBYTE(14) END copy16: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEWORD(12) END copy17: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEWORD(12) MOVEBYTE(16) END copy18: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEWORD(12) MOVESHORT(16) END copy19: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEWORD(12) MOVESHORT(16) MOVEBYTE(18) END copy20: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEWORD(12) MOVEWORD(16) END copy21: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEWORD(12) MOVEWORD(16) MOVEBYTE(20) END copy22: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEWORD(12) MOVEWORD(16) MOVESHORT(20) END copy23: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEWORD(12) MOVEWORD(16) MOVESHORT(20) MOVEBYTE(22) END copy24: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEWORD(12) MOVEWORD(16) MOVEWORD(20) END copy25: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEWORD(12) MOVEWORD(16) MOVEWORD(20) MOVEBYTE(24) END copy26: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEWORD(12) MOVEWORD(16) MOVEWORD(20) MOVESHORT(24) END copy27: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEWORD(12) MOVEWORD(16) MOVEWORD(20) MOVESHORT(24) MOVEBYTE(26) END copy28: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEWORD(12) MOVEWORD(16) MOVEWORD(20) MOVEWORD(24) END copy29: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEWORD(12) MOVEWORD(16) MOVEWORD(20) MOVEWORD(24) MOVEBYTE(28) END copy30: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEWORD(12) MOVEWORD(16) MOVEWORD(20) MOVEWORD(24) MOVESHORT(28) END copy31: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEWORD(12) MOVEWORD(16) MOVEWORD(20) MOVEWORD(24) MOVESHORT(28) MOVEBYTE(30) END copy32: MOVEWORD(0) MOVEWORD(4) MOVEWORD(8) MOVEWORD(12) MOVEWORD(16) MOVEWORD(20) MOVEWORD(24) MOVEWORD(28) END #endif koules1.4/xlib/shmbitmap.c100644 37512 310 23222 6477322207 14170 0ustar rootroot/*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * shmbitmap.c framebuffer graphics routines * ***********************************************************/ #ifdef MITSHM /*adapted from: */ /* Framebuffer Graphics Libary for Linux, Copyright 1993 Harm Hanemaayer */ /* cbitmap.c Compiled bitmaps */ /*thanks */ #include #include "../koules.h" #define BYTEWIDTH MAPWIDTH #define __clipx1 0 #define __clipx2 (MAPWIDTH-2) #define __clipy1 0 #define __clipy2 (MAPHEIGHT+17) #define VBUF current.vbuff typedef unsigned char uchar; void ShmCompileBitmap (int w, int h, void *_dp1, void *_dp2) { /* Compiled format: */ /* []... */ uchar *dp1 = _dp1; uchar *dp2 = _dp2; int i; for (i = 0; i < h; i++) { int x = 0; while (x < w) { int count; /* count zeroes */ count = 0; while (x < w && *(dp1 + count) == notusedc && count < 254) { count++; x++; } dp1 += count; if (x < w) { *dp2++ = count; /* count nonzeroes */ count = 0; while (x < w && *(dp1 + count) != notusedc && count < 255) { *(dp2 + count + 1) = *(dp1 + count); count++; x++; } *dp2 = count; dp2 += count + 1; dp1 += count; } } *dp2++ = 0xff; } } int ShmBitmapSize (int w, int h, void *_dp1) { /* Compiled format: */ /* []... */ uchar *dp1 = _dp1; int size = 0; int i; for (i = 0; i < h; i++) { int x = 0; while (x < w) { int count; /* count zeroes */ count = 0; while (x < w && *(dp1 + count) == notusedc && count < 254) { count++; x++; } size++; dp1 += count; /* count nonzeroes */ if (x < w) { count = 0; while (x < w && *(dp1 + count) != notusedc && count < 255) { count++; x++; } size += count + 1; dp1 += count; } } size++; } return size; } static void putmaskcompiledclip (CONST int nx, CONST int ny, CONST int nw, CONST int nh, CONST int _x, CONST int _y, CONST int w, CONST int h, void *_dp) { /* Special case costly clipping */ uchar *dp = _dp; uchar *vp, *vpline; int y; vpline = (uchar *) VBUF + _y * BYTEWIDTH + _x; for (y = _y; y < ny + nh; y++) { int x = _x; vp = vpline; for (;;) { int count = *dp++; if (count == 0xff) break; /* end of line */ vp += count; x += count; count = *dp++; /* __memcpy gives severe bug here */ if (y >= ny) if (x >= nx) if (x + count > __clipx2 + 1) { if (x <= __clipx2) __memcpyb (vp, dp, __clipx2 - x + 1); } else __memcpyb (vp, dp, count); else if (x + count > __clipx1) if (x + count > __clipx2 + 1) __memcpyb (vp + __clipx1 - x, dp + __clipx1 - x, __clipx2 - __clipx1 + 1); else __memcpy (vp + __clipx1 - x, dp + __clipx1 - x, count - __clipx1 + x); x += count; vp += count; dp += count; } vpline += BYTEWIDTH; } } #define ADJUSTBITMAPBOX() \ nw = w; nh = h; nx = x; ny = y; \ if (nx + nw < __clipx1 || nx > __clipx2) \ return; \ if (ny + nh < __clipy1 || ny > __clipy2) \ return; \ if (nx < __clipx1) { /* left adjust */ \ nw += nx - __clipx1; \ nx = __clipx1; \ } \ if (ny < __clipy1) { /* top adjust */ \ nh += ny - __clipy1; \ ny = __clipy1; \ } \ if (nx + nw > __clipx2) /* right adjust */ \ nw = __clipx2 - nx + 1; \ if (ny + nh > __clipy2) /* bottom adjust */ \ nh = __clipy2 - ny + 1; \ void ShmPutBitmap (int x, int y, int w, int h, void *_dp) { /* no clipping */ uchar *dp = _dp; uchar *vp, *vpline; int i; if (Clipping) { int nx, ny, nw, nh; ADJUSTBITMAPBOX (); if (nw != w || nh != h) { putmaskcompiledclip (nx, ny, nw, nh, x, y, w, h, dp); return; } } vpline = (uchar *) VBUF + y * BYTEWIDTH + x; for (i = 0; i < h; i++) { vp = vpline; for (;;) { int count = *dp++; if (count == 0xff) break; /* end of line */ vp += count; count = *dp++; /* __memcpy gives severe bug here */ __memcpyb (vp, dp, count); vp += count; dp += count; } vpline += BYTEWIDTH; } } /*following routines are ripped from vgagl library */ /* We use the 32-bit to 64-bit multiply and 64-bit to 32-bit divide of the */ /* 386 (which gcc doesn't know well enough) to efficiently perform integer */ /* scaling without having to worry about overflows. */ #define swap(x, y) { int temp = x; x = y; y = temp; } #define setpixel (*(backscreen->ff.driver_setpixel_func)) #undef __clipx2 #define __clipx2 (MAPWIDTH-1) #undef __clipx1 #define __clipx1 0 #undef __clipy1 #define __clipy1 0 #undef __clipy2 #define __clipy2 (MAPHEIGHT+19) #ifdef __i386__ static INLINE int muldiv64 (int CONST m1, int CONST m2, int CONST d) { /* int32 * int32 -> int64 / int32 -> int32 */ int result; __asm__ ( "imull %%edx\n\t" "idivl %3\n\t" : "=a" (result) /* out */ : "a" (m1), "d" (m2), "g" (d) /* in */ : "ax", "dx" /* mod */ ); return result; } #define INC_IF_NEG(y) \ { \ __asm__("btl $31,%1\n\t" \ "adcl $0,%0" \ : "=r" ((int) result) \ : "rm" ((int) (y)), "0" ((int) result) \ ); \ } static INLINE int gl_regioncode (CONST int x, CONST int y) { int dx1, dx2, dy1, dy2; int result; result = 0; dy2 = __clipy2 - y; INC_IF_NEG (dy2); result <<= 1; dy1 = y - __clipy1; INC_IF_NEG (dy1); result <<= 1; dx2 = __clipx2 - x; INC_IF_NEG (dx2); result <<= 1; dx1 = x - __clipx1; INC_IF_NEG (dx1); return result; } #else static INLINE int gl_regioncode (CONST int x, CONST int y) { int result = 0; if (x < 0) result |= 1; else if (x > __clipx2) result |= 2; if (y < 0) result |= 4; else if (y > __clipy2) result |= 8; return result; } #endif /* Partly based on vgalib by Tommy Frandsen */ /* This would be a lot faster if setpixel was inlined */ void Line (int x1, int y1, int x2, int y2, int c) { int dx, dy, ax, ay, sx, sy, x, y; int syp; char *point; if (!shm) { qLine (x1, y1, x2, y2, c); return; } c = cpixels (c); /* Cohen & Sutherland algorithm */ if (Clipping) for (;;) { int r1 = gl_regioncode (x1, y1); int r2 = gl_regioncode (x2, y2); if (!(r1 | r2)) break; /* completely inside */ if (r1 & r2) return; /* completely outside */ if (r1 == 0) { swap (x1, x2); /* make sure first */ swap (y1, y2); /* point is outside */ r1 = r2; } if (r1 & 1) { /* left */ #ifdef __i386__ y1 += muldiv64 (__clipx1 - x1, y2 - y1, x2 - x1); #else y1 += (long) (__clipx1 - x1) * (long) (y2 - y1) / (long) (x2 - x1); #endif x1 = __clipx1; } else if (r1 & 2) { /* right */ #ifdef __i386__ y1 += muldiv64 (__clipx2 - x1, y2 - y1, x2 - x1); #else y1 += (long) (__clipx2 - x1) * (long) (y2 - y1) / (long) (x2 - x1); #endif x1 = __clipx2; } else if (r1 & 4) { /* top */ #ifdef __i386__ x1 += muldiv64 (__clipy1 - y1, x2 - x1, y2 - y1); #else x1 += (long) (__clipy1 - y1) * (long) (x2 - x1) / (long) (y2 - y1); #endif y1 = __clipy1; } else if (r1 & 8) { /* bottom */ #ifdef __i386__ x1 += muldiv64 (__clipy2 - y1, x2 - x1, y2 - y1); #else x1 += (long) (__clipy2 - y1) * (long) (x2 - x1) / (long) (y2 - y1); #endif y1 = __clipy2; } } dx = x2 - x1; dy = y2 - y1; ax = abs (dx) << 1; ay = abs (dy) << 1; sx = (dx >= 0) ? 1 : -1; sy = (dy >= 0) ? 1 : -1; x = x1; y = y1; point = VScreenToBuffer (backscreen) + x + y * MAPWIDTH; if (ax > ay) { int d = ay - (ax >> 1); syp = sy * MAPWIDTH; while (x != x2) { *point = c; if (d > 0 || (d == 0 && sx == 1)) { y += sy; point += syp; d -= ax; } x += sx; point += sx; d += ay; } } else { int sy = (dy >= 0) ? 1 : -1; int d = ax - (ay >> 1); syp = sy * MAPWIDTH; while (y != y2) { *(point) = c; if (d > 0 || (d == 0 && sy == 1)) { x += sx; point += sx; d -= ay; } y += sy; point += syp; d += ax; } } *(point) = c; point++; } #endif koules1.4/xlib/interface.c100644 37512 310 24566 6477557260 14171 0ustar rootroot/*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * interface.c interface xlib graphics functions * ***********************************************************/ #include #include #include #include "../koules.h" #include "../framebuffer.h" #include #include #undef next struct keyrec * findkey (CONST int sc) { struct keyrec *kkey = ffirstkey; while (kkey != NULL && kkey->scancode != sc) kkey = kkey->next; return (kkey); } void addkey (CONST int scancode) { struct keyrec *key; if (!findkey (scancode)) { key = malloc (sizeof (struct keyrec)); key->last = NULL; key->next = ffirstkey; if (ffirstkey != NULL) ffirstkey->last = key; key->scancode = scancode; ffirstkey = key; } } void deletekey (CONST int scancode) { struct keyrec *key; if (!(key = findkey (scancode))) { printf ("Key not found!\n"); return; } if (key->last) key->last->next = key->next; else ffirstkey = key->next; if (key->next) key->next->last = key->last; free (key); } int GetKey () { if (ffirstkey != NULL /* && ffirstkey->next != NULL */ ) return (ffirstkey->scancode); return (0); } void DrawRectangle (CONST int x1, CONST int y1, CONST int x2, CONST int y2, CONST int color) { #ifdef MITSHM if (shm) { Line (x1, y1, x2, y1, color); Line (x2, y1, x2, y2, color); Line (x2, y2, x1, y2, color); Line (x1, y2, x1, y1, color); } else #endif { SetColor (color); XDrawRectangle (dp, current.pixmap, gc, (int) x1, (int) y1, (int) x2 - x1, (int) y2 - y1); } } void ClearScreen () { #ifdef MITSHM if (shm && current.pixmap != wi) memset (current.vbuff, pixels[0], MAPWIDTH * (MAPHEIGHT + 20)); else #endif { XFillRectangle (dp, current.pixmap, blackgc, 0, 0, MAPWIDTH, MAPHEIGHT + 20); } } void CopyVSToVS (CONST VScreenType source, CONST VScreenType destination) { #ifdef MITSHM if (shm) #if defined(__i386__)&&defined(ASSEMBLY) __memcpy (destination.vbuff, source.vbuff, MAPWIDTH * (MAPHEIGHT + 20)); #else memcpy (destination.vbuff, source.vbuff, MAPWIDTH * (MAPHEIGHT + 20)); #endif else #endif { XCopyArea (dp, source.pixmap, destination.pixmap, whitegc, 0, 0, MAPWIDTH, MAPHEIGHT + 20, 0, 0); } } void CopyToScreen (CONST VScreenType source) { #ifdef MITSHM if (shm) { switch (depth) { case 16: { register unsigned char *data = (unsigned char *) source.vbuff, *end = (unsigned char *) source.vbuff + MAPWIDTH * (MAPHEIGHT + 20); register unsigned short *out = (unsigned short *) source.ximage->data; while (data < end) { *out = rpixels[*data]; *(out + 1) = rpixels[*(data + 1)]; *(out + 2) = rpixels[*(data + 2)]; *(out + 3) = rpixels[*(data + 3)]; *(out + 4) = rpixels[*(data + 4)]; *(out + 5) = rpixels[*(data + 5)]; *(out + 6) = rpixels[*(data + 6)]; *(out + 7) = rpixels[*(data + 7)]; out += 8; data += 8; } } break; case 32: case 24: { register unsigned char *data = (unsigned char *) source.vbuff, *end = (unsigned char *) source.vbuff + MAPWIDTH * (MAPHEIGHT + 20); register unsigned long *out = (unsigned long *) source.ximage->data; while (data < end) { *out = rpixels[*data]; *(out + 1) = rpixels[*(data + 1)]; *(out + 2) = rpixels[*(data + 2)]; *(out + 3) = rpixels[*(data + 3)]; *(out + 4) = rpixels[*(data + 4)]; *(out + 5) = rpixels[*(data + 5)]; *(out + 6) = rpixels[*(data + 6)]; *(out + 7) = rpixels[*(data + 7)]; out += 8; data += 8; } } break; } if (notrealshm) XPutImage (dp, wi, whitegc, source.ximage, 0, 0, 0, 0, MAPWIDTH, MAPHEIGHT + 20); else XShmPutImage (dp, wi, whitegc, source.ximage, 0, 0, 0, 0, MAPWIDTH, MAPHEIGHT + 20, True); } else #endif { if (screenpixmap != source.pixmap) XSetWindowBackgroundPixmap (dp, wi, source.pixmap); XClearWindow (dp, wi); } } BitmapType CompileBitmap (CONST int x, CONST int y, CONST RawBitmapType bitmap) { BitmapType pm; #ifdef MITSHM int size1; char *cbitmap; #endif #ifdef MITSHM if (shm) { size1 = ShmBitmapSize (x, y, bitmap.vbuff); if ((cbitmap = malloc (size1)) == NULL) perror ("create_bitmap"), exit (1); ShmCompileBitmap (x, y, bitmap.vbuff, cbitmap); pm.vbuff = (unsigned char *) cbitmap; free (bitmap.vbuff); } else #endif { XFlush (dp); pm.bitmap = XCreatePixmap (dp, wi, x, y, DefaultDepth (dp, screen)); XPutImage (dp, pm.bitmap, whitegc, bitmap.bitmap, 0, 0, 0, 0, x, y); pm.mask = XCreateBitmapFromData (dp, wi, bitmap.mask, x, y); free (bitmap.mask); XSync (dp, 0); XDestroyImage (bitmap.bitmap); } return (pm); } RawBitmapType CreateBitmap (CONST int xv, CONST int yv) { RawBitmapType img; char *data; #ifdef MITSHM if (shm) { img.xsize = xv; img.vbuff = malloc (xv * yv + 10); return (img); } else #endif { if ((data = (char *) calloc ((xv + BitmapPad (dp)) * yv * 4, 1)) == NULL) perror ("Memory Error"), exit (2); img.bitmap = XCreateImage (dp, DefaultVisual (dp, screen), DefaultDepth (dp, screen), ZPixmap, 0, data, xv, yv, BitmapPad (dp), 0); if ((img.mask = (char *) calloc ((xv) * yv, 1)) == NULL) perror ("Memory Error"), exit (2); } return (img); } static int lastcolor = 1; static int lastwidth = 1; static int needflush = 0; static int lastx = 0, lasty = 0; static Pixmap lastpixmap = None; void FlushParam () { XGCValues val; val.clip_x_origin = lastx; val.clip_y_origin = lasty; val.clip_mask = lastpixmap; val.foreground = lastcolor; val.line_width = lastwidth; if (needflush) XChangeGC (dp, gc, needflush, &val); needflush = 0; } void SetColor (CONST int color) { int color1 = cpixels (color); if (color1 != lastcolor) { lastcolor = color1; if (!needflush) { XSetForeground (dp, gc, color1); return; } else { needflush |= GCForeground; } } FlushParam (); } void SetWidth (int width) { if (width == 1) width = 0; if (lastwidth != width) { lastwidth = width; needflush |= GCLineWidth; } } void SetStipple (int x, int y, Pixmap stipple) { if (lastx != x) { lastx = x; needflush |= GCClipXOrigin; } if (lasty != y) { lasty = y; needflush |= GCClipYOrigin; } if (lastpixmap != stipple) { lastpixmap = stipple; needflush |= GCClipMask; } if (needflush) FlushParam (); } void UnSetStipple () { lastpixmap = None; needflush |= GCClipMask; } void MyPause () { XEvent myEvent; tbreak = 1; pesc = 0; pup = 0; pdown = 0; pleft = 0; pright = 0; pp = 0; penter = 0; while (1) { XNextEvent (dp, &myEvent); switch (myEvent.type) { case FocusIn: /*if(myEvent.xfocus.detail==NotifyInferior) */ return; case GraphicsExpose: case Expose: CopyToScreen (backscreen); } } } void ProcessEvents () { XEvent myEvent; int rootx, rooty; static int fout = 0; Window rootreturn, childreturn; XFlush (dp); while (XEventsQueued (dp, QueuedAlready)) { XNextEvent (dp, &myEvent); switch (myEvent.type) { case KeyRelease: if (fout) break; deletekey (XLookupKeysym (&myEvent.xkey, 0)); /*printf ("Released:%i\n", myEvent.xkey.keycode); */ switch (XLookupKeysym (&myEvent.xkey, 0)) { case XK_Escape: pesc = 0; break; case XK_Up: pup = 0; break; case XK_Down: pdown = 0; break; case XK_Left: pleft = 0; break; case XK_Right: pright = 0; break; case XK_H: case XK_h: ph = 0; break; case XK_P: case XK_p: case XK_Pause: pp = 0; break; case XK_KP_Enter: case XK_KP_Space: case XK_Return: penter = 0; break; } break; case KeyPress: if (fout) break; addkey (XLookupKeysym (&myEvent.xkey, 0)); /*printf ("Pressed:%i\n", myEvent.xkey.keycode); */ switch (XLookupKeysym (&myEvent.xkey, 0)) { case XK_Escape: pesc = 1; break; case XK_Up: pup = 1; break; case XK_Down: pdown = 1; break; case XK_Right: pright = 1; break; case XK_Left: pleft = 1; break; case XK_H: case XK_h: ph = 1; break; case XK_P: case XK_p: case XK_Pause: pp = 1; break; case XK_KP_Enter: case XK_KP_Space: case XK_Return: penter = 1; break; } break; case FocusOut: while (ffirstkey) deletekey (ffirstkey->scancode); /*if(myEvent.xfocus.detail==NotifyPointer) */ if (!nopause /*&& gamemode == GAME */ && !client) MyPause (); else fout = 1; break; case FocusIn: fout = 0; } } childreturn = 0; XQueryPointer (dp, wi, &rootreturn, &childreturn, &rootx, &rooty, &mousex, &mousey, &mousebuttons); mousebuttons&=256; if (fout) mousex = 0, mousey = 0, mousebuttons = 0; } void PutBitmap (CONST int x, CONST int y, CONST int xsize, CONST int ysize, CONST BitmapType bitmap) { #ifdef MITSHM if (shm) ShmPutBitmap (x, y, xsize, ysize, bitmap.vbuff); else #endif { XCopyPlane (dp, (bitmap).mask, current.pixmap, maskgc, 0, 0, xsize, ysize, x, y, 1); XCopyArea (dp, bitmap.bitmap, current.pixmap, orgc, 0, 0, xsize, ysize, x, y); } } koules1.4/xlib/cursorp.h100644 37512 310 164 6477322207 13646 0ustar rootroot#define cursorp_width 4 #define cursorp_height 4 static unsigned char cursorp_bits[] = { 0x09, 0x00, 0x00, 0x09}; koules1.4/xlib/cursorm.h100644 37512 310 164 6477322207 13643 0ustar rootroot#define cursorm_width 4 #define cursorm_height 4 static unsigned char cursorm_bits[] = { 0x0f, 0x0f, 0x0f, 0x0f}; koules1.4/xlib/nocursorm.h100644 37512 310 150 6477322207 14173 0ustar rootroot#define nocursorm_width 1 #define nocursorm_height 1 static unsigned char nocursorm_bits[] = { 0x00}; koules1.4/xlib/Imakefile100644 37512 310 3136 6477322207 13633 0ustar rootroot#include "../Iconfig" #XCOMM *********************************************************** #XCOMM ---> Configuration options was moved indo Iconfig <---- #XCOMM *********************************************************** #ifdef I386ASSEMBLY MEMOBJ = mem.o MEMSRC = mem.S ASMDEF = -DASSEMBLY #endif #ifdef NETWORK NET = -DNETSUPPORT #endif #ifdef JOYSTICK JOYSTICK1 = -DJOYSTICK #endif #ifdef MITSHM MITSHM1 = -DMITSHM #endif #ifdef HAVEUSLEEP HAVEUSLEEP1 = -DHAVEUSLEEP #endif DEPLIBS = $(DEPXLIB) #ifndef SOUND #ifndef NAS_SOUND #ifndef RSOUND DEFINES = -DONLYANSI $(JOYSTICK1) $(NET) $(MITSHM1) $(HAVEUSLEEP1) $(SYSDEFS) $(JOYSTICK) -I.\ $(NAMEDEF) $(ASMDEF) #else INSTALLSOUND = True NASLIB = -L/usr/local/lib/rplay -lrplay SOUNDOBJS = rsound.o DEFINES = -DONLYANSI -DRSOUND $(JOYSTICK1) $(NET) $(MITSHM1) $(HAVEUSLEEP1) $(SYSDEFS) $(JOYSTICK) -I.\ $(NAMEDEF) $(ASMDEF)\ -DSOUNDDIR=\"$(SOUNDDIR)\" #endif #else INSTALLSOUND = True NASLIB = -laudio SOUNDOBJS = nas_sound.o DEFINES = -DONLYANSI -DNAS_SOUND $(JOYSTICK1) $(NET) $(MITSHM1) $(HAVEUSLEEP1) $(SYSDEFS) $(JOYSTICK) -I.\ $(NAMEDEF) $(ASMDEF)\ -DSOUNDDIR=\"$(SOUNDDIR)\" #endif #else INSTALLSOUND = True DEFINES = -DONLYANSI -DSOUND $(JOYSTICK1) $(NET) $(MITSHM1) $(HAVEUSLEEP1) $(SYSDEFS) $(JOYSTICK) -I.\ $(NAMEDEF) $(ASMDEF)\ -DSOUNDSERVER=\"$(KOULESDIR)/$(SOUNDSERVER)\" \ -DSOUNDDIR=\"$(SOUNDDIR)\" \ -DSOUNDDEV=\"$(SOUNDDEV)\" #endif OBJS = init.o $(MEMOBJ)\ interface.o shmbitmap.o text.o font8x8.o SRCS = init.c $(MEMSRC)\ interface.c shmbitmap.c text.c font8x8.o NormalLibraryTarget(xlib, $(OBJS)) all::libxlib.a koules1.4/xlib/init.c100644 37512 310 56725 6477555305 13174 0ustar rootroot/*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-0361-32613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * init.c xlib depended initialization routines * ***********************************************************/ #define PLATFORM_VARIABLES_HERE #include #include #include #include #include "cursorm.h" #include "nocursorm.h" #include "cursorp.h" #include "../server.h" #include "../client.h" #include "../net.h" #include "../koules.h" #include "../framebuffer.h" #include #include #include "../mygetopt.h" #include extern char *Font8x8; extern void fadein1 (); extern void points (); extern void points1 (); extern char rocketcolor[5]; extern void setcustompalette (int, float); extern void starwars (); extern void game (); static int Sync; static int uninitialized = 0; void uninitialize (); static Pixmap create_icon () { char radius = 24; unsigned char color = 4 * 32; XImage *img; char *data; Pixmap pixmap; int x, y, r; if ((data = (char *) calloc ((radius * 2 + 1 + BitmapPad (dp)) * radius * 2 * 4, 1)) == NULL) perror ("Memory Error"), exit (2); img = XCreateImage (dp, DefaultVisual (dp, screen), DefaultDepth (dp, screen), ZPixmap, 0, data, radius * 2, radius * 2, BitmapPad (dp), 0); for (y = 0; y < radius * 2; y++) for (x = 0; x < radius * 2; x++) { if ((x - radius) * (x - radius) + (y - radius) * (y - radius) < (radius - 0.5) * (radius - 0.5)) { r = (x - 3 * radius / 4) * (x - 3 * radius / 4) + (y - radius / 4) * (y - radius / 4); r = r * 32 / (1.5 * radius) / (1.5 * radius); if (r > 31) r = 31; XPutPixel (img, x, y, cpixels (color + r)); } else { XPutPixel (img, x, y, pixels[0]); } } pixmap = XCreatePixmap (dp, wi, radius * 2, radius * 2, DefaultDepth (dp, screen)); XSync (dp, 1); XPutImage (dp, pixmap, gc, img, 0, 0, 0, 0, radius * 2, radius * 2); XSync (dp, 1); XDestroyImage (img); return (pixmap); } #ifdef MITSHM extern int XShmQueryExtension (Display * dpy); static int haderror; static int (*origerrorhandler) (Display *, XErrorEvent *); static int bpp; static int shmerrorhandler (Display * d, XErrorEvent * e) { haderror++; if (e->error_code == BadAccess) fprintf (stderr, "X: failed to attach shared memory\n"); else (*origerrorhandler) (d, e); return (0); } #define Width MAPWIDTH #define Height (MAPHEIGHT+20) XShmSegmentInfo shminfo; char *shared_mem; int shared_len; static void shmfree () { if (shm && !notrealshm && !uninitialized) { uninitialized = 1; if (shmdt (shminfo.shmaddr) < 0) perror ("X shmdt() error"); if (shmctl (shminfo.shmid, IPC_RMID, 0) < 0) perror ("X shmctl(rmid) error"); #ifdef NETSUPPORT if (client) CQuit ("Game called exit-probably some graphics interface problem.\n"); #endif } } void signalerrorhandler (int num) { if (shmdt (shminfo.shmaddr) < 0) perror ("X shmdt() error"); if (shmctl (shminfo.shmid, IPC_RMID, 0) < 0) perror ("X shmctl(rmid) error"); printf ("fatal signal %i received\n", num); XShmDetach (dp, &shminfo); fadein (); uninitialized = 1; #ifdef NETSUPPORT if (client) CQuit ("Fatal signal received"); #endif exit (0); } int GetImage (VScreenType * pixmap) /*Work as in shared memory mose but use normal Image handling functions...good for local server that don't support MITshm (like my metroX) */ { int memsize; unsigned char *data; Pixmap testpixmap; long VfTime = 0; long VendSleep = 0; struct timeval VlastClk; struct timeval VnewClk; int wait = 1; int i; gettimeofday (&VlastClk, NULL); gettimeofday (&VnewClk, NULL); VendSleep = VlastClk.tv_usec; VfTime = 1000000 / 25 * 12; pixmap->ximage = XCreateImage (dp, DefaultVisual (dp, screen), depth, ZPixmap, 0, NULL, Width, Height, bpp * 8, 0); if (!pixmap->ximage) { fprintf (stderr, "Can't get image\n"); return 0; } /*Calculate size of shared memory */ memsize = ((Width + 1) * (Height + 1) * bpp); if ((data = malloc (memsize)) == NULL) { printf ("Can't malloc memory for image\n"); return 0; } pixmap->ximage->data = (char *) data; printf ("Performing connection benchmark...."); fflush (stdout); testpixmap = XCreatePixmap (dp, wi, MAPWIDTH, MAPHEIGHT + 20, DefaultDepth (dp, screen)); XSync (dp, 0); for (i = 0; i < 10 && wait > 0; i++) { XPutImage (dp, testpixmap, gc, pixmap->ximage, 0, 0, 0, 0, MAPWIDTH, MAPHEIGHT + 20); XSync (dp, 0); gettimeofday (&VnewClk, NULL); if (VnewClk.tv_usec < VendSleep) VendSleep -= 1000000; wait = (VfTime - VnewClk.tv_usec + VendSleep); } XFreePixmap (dp, testpixmap); if (i == 10) { printf ("OK\n"); notrealshm = 1; if (depth == 8) /*if depth=0 we are using fast shm mode(w/o recalculating) */ pixmap->vbuff = (char *) data; else { /*In other cases we have to transfer image from 8bpp to screen's one before displaying */ int i; for (i = 0; i < 256; i++) rpixels[i] = pixels[i], pixels[i] = i, notusedc = 0; pixmap->vbuff = malloc (Width * Height); } return 1; } printf ("Slow...using normal mode\n"); XDestroyImage (pixmap->ximage); return 0; } static int GetShmPixmap (VScreenType * pixmap) { /*Get shared image */ pixmap->ximage = XShmCreateImage (dp, DefaultVisual (dp, screen), depth, ZPixmap, NULL, &shminfo, Width, Height); if (!pixmap->ximage) { fprintf (stderr, "Can't get shared image\n"); return 0; } /*Calculate size of shared memory */ shared_len = (pixmap->ximage->bytes_per_line + 1) * (pixmap->ximage->height + 1); /*Avoid one nasty hpux's X server bug..... */ /*Get shared memory id */ shminfo.shmid = shmget (IPC_PRIVATE, shared_len, IPC_CREAT | 0777); if (shminfo.shmid < 0) { fprintf (stderr, "Couldn't get X shared memory.\n"); XDestroyImage (pixmap->ximage); return 0; } /* We need to protect our shared memory against orphanage if we are killed in this function. */ shminfo.shmaddr = (char *) shmat (shminfo.shmid, 0, 0); shared_mem = (char *) shminfo.shmaddr; if (shminfo.shmaddr == (char *) -1) { fprintf (stderr, "Couldn't attach to X shared memory.\n"); XDestroyImage (pixmap->ximage); shmctl (shminfo.shmid, IPC_RMID, 0); return 0; } shminfo.readOnly = False; pixmap->ximage->data = (char *) shared_mem; /* Now try to attach it to the X Server */ haderror = False; origerrorhandler = XSetErrorHandler (shmerrorhandler); if (!XShmAttach (dp, &shminfo)) { printf ("attach failed"); } XSync (dp, False); /* wait for error or ok */ XSetErrorHandler (origerrorhandler); if (haderror) { if (shmdt (shminfo.shmaddr) < 0) perror ("X shmdt() error"); if (shmctl (shminfo.shmid, IPC_RMID, 0) < 0) perror ("X shmctl rmid() error"); return 0; } memset ((void *) shared_mem, 0, shared_len); if (depth == 8) /*if depth=0 we are using fast shm mode(w/o recalculating) */ pixmap->vbuff = shared_mem; else { /*In other cases we have to transfer image from 8bpp to screen's one before displaying */ int i; for (i = 0; i < 256; i++) rpixels[i] = pixels[i], pixels[i] = i, notusedc = 0; pixmap->vbuff = malloc (Width * Height); } signal (SIGHUP, signalerrorhandler); signal (SIGINT, signalerrorhandler); signal (SIGTRAP, signalerrorhandler); signal (SIGABRT, signalerrorhandler); signal (SIGSEGV, signalerrorhandler); signal (SIGQUIT, signalerrorhandler); signal (SIGFPE, signalerrorhandler); signal (SIGTERM, signalerrorhandler); signal (SIGBUS, signalerrorhandler); signal (SIGIOT, signalerrorhandler); signal (SIGILL, signalerrorhandler); atexit (shmfree); return (1); } #undef Width #undef Height #endif static void initialize (char **argv, int argc) { XWMHints *wmhints; XClassHint *classhints; XSizeHints *sizehints; XTextProperty windowName; XTextProperty iconName; char *title = "Koules for X version 1.4 by Jan Hubicka"; char *title1 = "Koules"; Font f; XVisualInfo vinfo_return; XGCValues values; #ifndef NAS_SOUND #ifndef RSOUND printf ("Initializing sound server...\n"); #ifdef SOUND if (sndinit) init_sound (); else sound = 0; #else printf ("Sound driver not avaiable-recompile koules with SOUND enabled\n"); #endif #endif #endif printf ("Autoprobing hardware\n"); printf ("Initializing joystick driver\n"); #ifdef JOYSTICK joystickdevice[0] = open ("/dev/js0", O_RDONLY); if (joystickdevice[0] < 0) { perror ("Joystick driver"); printf ("Joystick 1 not avaiable..\n"); joystickplayer[0] = -1; } else printf ("Joystick 1 initialized\n"); joystickdevice[1] = open ("/dev/js1", O_RDONLY); if (joystickdevice[1] < 0) { perror ("Joystick driver"); printf ("Joystick 2 not avaiable..\n"); joystickplayer[1] = -1; } else printf ("Joystick 2 initialized\n"); #else printf ("Joystick driver not avaiable(recompile koules with JOYSTICK enabled )\n"); #endif printf ("Connecting X server\n"); if ((dp = XOpenDisplay (0)) == 0) { printf ("could not open display\n"); exit (0); } XSetCloseDownMode (dp, DestroyAll); screen = DefaultScreen (dp); fadeenable = 1; if (XMatchVisualInfo (dp, DefaultScreen (dp), 8, PseudoColor, &vinfo_return) == False) { fadeenable = 0; printf ("X: Screen doesn't support PseudoColor!\n"); if (XMatchVisualInfo (dp, DefaultScreen (dp), 32, TrueColor, &vinfo_return) == True) { useprivate = 0; bpp = 4; } else if (XMatchVisualInfo (dp, DefaultScreen (dp), 24, TrueColor, &vinfo_return) == True) { useprivate = 0; bpp = 4; } else if (XMatchVisualInfo (dp, DefaultScreen (dp), 16, TrueColor, &vinfo_return) == True) { useprivate = 0; bpp = 2; } else if (XMatchVisualInfo (dp, DefaultScreen (dp), 15, TrueColor, &vinfo_return) == True) { useprivate = 0; bpp = 2; } else if (XMatchVisualInfo (dp, DefaultScreen (dp), 8, GrayScale, &vinfo_return) == True) { useprivate = 0; monochrome = 1; bpp = 2; } else { printf ("Unsupported visual! Using slow and reliable mode\n"); #ifdef MITSHM shm = 0; #endif } } else bpp = 1; depth = vinfo_return.depth; #ifdef MITSHM /* Make sure all is destroyed if killed off */ /* Make sure we can do PsuedoColor colormap stuff */ if (!shm) { printf ("Shm support disabled\n"); } else /* Check to see if the extensions are supported */ if (!XShmQueryExtension (dp)) { fprintf (stderr, "X server doesn't support MITSHM extension.\n"); shm = 0; } if (shm) printf ("Shm mode seems to be possible\n"); #endif wi = physicalscreen.pixmap = XCreateSimpleWindow (dp, RootWindow (dp, screen), 50, 50, MAPWIDTH, MAPHEIGHT + 20, 0, 0, 0); if ((f = XLoadFont (dp, "-schumacher-clean-bold-r-normal--8-80-75-75-c-80-*iso*")) == 0) { printf ("Font -schumacher-clean-bold-r-normal--8-80-75-75-c-80-*iso* does not exist"); } whitegc = XCreateGC (dp, wi, 0, NULL); blackgc = XCreateGC (dp, wi, 0, NULL); values.function = GXand; maskgc = XCreateGC (dp, wi, GCFunction, &values); values.function = GXor; orgc = XCreateGC (dp, wi, GCFunction, &values); gc = XCreateGC (dp, wi, 0, NULL); if (!blackwhite) { if (!useprivate) colormap = DefaultColormap (dp, screen); else { colormap = XCreateColormap (dp, wi, DefaultVisual (dp, XDefaultScreen (dp)), AllocAll); XSetWindowColormap (dp, wi, colormap); } } setcustompalette (0, 1); wmhints = XAllocWMHints (); /* Various window manager settings */ wmhints->initial_state = NormalState; wmhints->input = True; wmhints->flags |= StateHint | InputHint; wmhints->icon_pixmap = create_icon (); wmhints->flags = IconPixmapHint; /* Set the class for this program */ classhints = XAllocClassHint (); classhints->res_name = title1; classhints->res_class = title1; /* Setup the max and minimum size that the window will be */ sizehints = XAllocSizeHints (); sizehints->flags = PSize | PMinSize | PMaxSize; sizehints->min_width = MAPWIDTH; sizehints->min_height = MAPHEIGHT + 20; sizehints->max_width = MAPWIDTH; sizehints->max_height = MAPHEIGHT + 20; /* Create the window/icon name properties */ if (XStringListToTextProperty (&title, 1, &windowName) == 0) { fprintf (stderr, "X: Cannot create window name resource!\n"); exit (3); } if (XStringListToTextProperty (&title1, 1, &iconName) == 0) { fprintf (stderr, "X: Cannot create window name resource!\n"); exit (3); } /* Now set the window manager properties */ XSetWMProperties (dp, wi, &windowName, &iconName, argv, argc, sizehints, wmhints, classhints); XFree ((void *) wmhints); XFree ((void *) classhints); XFree ((void *) sizehints); XSetFont (dp, gc, f); XSelectInput (dp, wi, ExposureMask | KeyPress | KeyRelease | ConfigureRequest | FocusChangeMask); XSetFont (dp, whitegc, f); XSetFont (dp, blackgc, f); if (!useprivate) { XSetBackground (dp, whitegc, BlackPixel (dp, screen)); XSetForeground (dp, whitegc, WhitePixel (dp, screen)); XSetForeground (dp, blackgc, BlackPixel (dp, screen)); } else { XSetBackground (dp, whitegc, 0); XSetForeground (dp, whitegc, pixels[255]); XSetForeground (dp, blackgc, 0); } XSetBackground (dp, maskgc, 0xffffffff); XSetForeground (dp, maskgc, 0); #ifdef MITSHM if (!shm) { #endif noshm:; backscreen.pixmap = XCreatePixmap (dp, wi, MAPWIDTH, MAPHEIGHT + 20, DefaultDepth (dp, screen)); background.pixmap = XCreatePixmap (dp, wi, MAPWIDTH, MAPHEIGHT + 20, DefaultDepth (dp, screen)); starbackground.pixmap = XCreatePixmap (dp, wi, MAPWIDTH, MAPHEIGHT + 20, DefaultDepth (dp, screen)); #ifdef MITSHM } else { starbackground.vbuff = malloc (MAPWIDTH * (MAPHEIGHT + 20)); background.vbuff = malloc (MAPWIDTH * (MAPHEIGHT + 20)); if (!GetShmPixmap (&backscreen)) { if (!GetImage (&backscreen)) { shm = 0; goto noshm; } } fontblack = malloc (256 * 8 * 8); ExpandFont (8, 8, cpixels (32), Font8x8, fontblack); fontwhite = malloc (256 * 8 * 8); ExpandFont (8, 8, cpixels (255), Font8x8, fontwhite); } #endif if (Sync) XSynchronize (dp, 1); #if defined(NAS_SOUND)||defined(RSOUND) printf ("Initializing sound server...\n"); if (sndinit) init_sound (); else sound = 0; #endif if (DefaultDepth (dp, screen) == 1) blackwhite = 1; } void uninitialize () { fadein (); if (!uninitialized) { XUnmapWindow (dp, wi); #ifdef MITSHM if (shm) XDestroyImage (backscreen.ximage); else #endif XFreePixmap (dp, backscreen.pixmap); XSync (dp, False); #ifdef MITSHM if (shm && !notrealshm) XShmDetach (dp, &shminfo); XSync (dp, False); /* need server to detach so can remove id */ uninitialized = 1; if (shm && !notrealshm) { if (shmdt (shminfo.shmaddr) < 0) perror ("X shmdt() error"); if (shmctl (shminfo.shmid, IPC_RMID, 0) < 0) perror ("X shmctl(rmid) error"); } #endif XCloseDisplay (dp); #ifdef SOUND if (sndinit) { kill_sound (); } #endif printf ("have a nice X\n"); } } int main (int argc, char **argv) { int c; XEvent event; nrockets = 1; GAMEWIDTH = 640; GAMEHEIGHT = 460; MAPWIDTH = 640; MAPHEIGHT = 460; DIV = 1; #ifdef MITSHM shm = 1; #endif drawpointer = 0; printf ("\n\n\n\n" " The game\n" " K O U L E S\n" " For X\n" " Version 1.4\n" "\n\n\n\n" " Copyright(c) Jan Hubicka 1995, 1996\n\n\n"); useprivate = 0; while ((c = mygetopt (argc, argv, "KWD:P:L:C:SxslEMmpdhfb")) != -1) { switch (c) { #ifdef NETSUPPORT case 'K': server = 1; servergameplan = DEATHMATCH; break; case 'W': server = 1; GAMEHEIGHT = 360; break; case 'D': { int p; server = 1; if (sscanf (myoptarg, "%i", &p) != 1 || p < 0 || p > 4) { printf ("-D : invalid difficulty \n"); exit (0); } difficulty = p; } break; case 'P': { int p; if (sscanf (myoptarg, "%i", &p) != 1 || p < 0) { printf ("-P : invalid port number\n"); exit (0); } initport = p; } break; case 'L': { int p; server = 1; if (sscanf (myoptarg, "%i", &p) != 1 || p < 1 || p > 100) { printf ("-L : invalid level number\n"); exit (0); } serverstartlevel = p - 1; } break; case 'S': server = 1; break; case 'C': strcpy (servername, myoptarg); client = 1; break; #else case 'K': case 'W': case 'P': case 'L': case 'D': case 'S': case 'C': printf ("Network option but no network support compiled\n"); break; #endif case 'd': #ifdef SOUND sndinit = 0; #endif break; case 'f': nofade = 1; break; case 'm': monochrome = 1; break; case 'b': blackwhite = 1; break; case 'p': useprivate = 1; break; case 'x': drawpointer = 1; break; case 'y': Sync = 1; break; case 'E': GAMEWIDTH = 900; GAMEHEIGHT = 600; MAPWIDTH = 900; MAPHEIGHT = 600; DIV = 1; break; case 's': GAMEWIDTH = 640; if (GAMEHEIGHT == 360) { MAPHEIGHT = 180; } else { GAMEHEIGHT = 460; } MAPWIDTH = 320; MAPHEIGHT = 230; DIV = 2; break; case 'l': GAMEWIDTH = 640; if (GAMEHEIGHT == 360) { MAPHEIGHT = 360; } else { GAMEHEIGHT = 460; } MAPWIDTH = 640; MAPHEIGHT = 460; DIV = 1; break; case 'M': #ifdef MITSHM shm = 0; #endif break; default: printf ("USAGE:" " -h for help\n" " -b for blackandwhite displays\n" " -m for monochrome displays\n" " -s for small display(320x250)\n" " -l for large display(640x480)\n" " -p use private colormap\n" " -y Synchronize with X(for debugging)\n" " -f nofade(for debugging)\n" #ifdef SOUND " -d Disable sound support\n" #endif " -x Disable X11 pointer\n" #ifdef MITSHM " -M DISABLE shared memory support\n" #endif #ifdef NETSUPPORT " -S run koules as network server\n" " -C run koules as network client\n" " -P select port. Default is:%i\n" " -W run server in width mode-support for 320x200 svgalib and OS/2 clients\n" " -L select level for server\n" " -D select dificulty for server:\n" " 0: nightmare\n" " 1: hard\n" " 2: medium(default and recomended)\n" " 3: easy\n" " 4: very easy\n" " -K run server in deathmatch mode\n", DEFAULTINITPORT #endif ); exit (2); } } srand (time (NULL)); #ifdef NETSUPPORT if (server) { init_server (); server_loop (); } if (client) { init_client (); MAPWIDTH = GAMEWIDTH / DIV; MAPHEIGHT = GAMEHEIGHT / DIV; } #endif printf ("X4GW 1.21.21 professional\n"); printf ("Copyright(c)1991,1992,1993,1994,1995 Jan Hubicka(JAHUSOFT)\n"); initialize (argv, argc); XFlush (dp); create_bitmap (); if (!shm) { XFreePixmap (dp, eye_bitmap[1].mask); XFreePixmap (dp, eye_bitmap[2].mask); XFreePixmap (dp, eye_bitmap[3].mask); XFreePixmap (dp, eye_bitmap[4].mask); XFreePixmap (dp, rocket_bitmap[1].mask); XFreePixmap (dp, rocket_bitmap[2].mask); XFreePixmap (dp, rocket_bitmap[3].mask); XFreePixmap (dp, rocket_bitmap[4].mask); XFreePixmap (dp, lball_bitmap[0].mask); XFreePixmap (dp, lball_bitmap[1].mask); XFreePixmap (dp, ehole_bitmap.mask); eye_bitmap[1].mask = eye_bitmap[0].mask; eye_bitmap[2].mask = eye_bitmap[0].mask; eye_bitmap[3].mask = eye_bitmap[0].mask; eye_bitmap[4].mask = eye_bitmap[0].mask; rocket_bitmap[1].mask = rocket_bitmap[0].mask; rocket_bitmap[2].mask = rocket_bitmap[0].mask; rocket_bitmap[3].mask = rocket_bitmap[0].mask; rocket_bitmap[4].mask = rocket_bitmap[0].mask; lball_bitmap[0].mask = ball_bitmap.mask; lball_bitmap[1].mask = ball_bitmap.mask; ehole_bitmap.mask = hole_bitmap.mask; } if (DIV && !shm) { current.pixmap = lball_bitmap[0].bitmap; DrawBlackMaskedText ((int) BALL_RADIUS - 4, (int) BALL_RADIUS - 4, "A"); current.pixmap = lball_bitmap[1].bitmap; DrawBlackMaskedText ((int) BALL_RADIUS - 4, (int) BALL_RADIUS - 4, "M"); } #ifdef SOUND sound = sndinit; #endif gamemode = MENU; XFlush (dp); printf ("creating backgrounds\n"); drawbackground (); XFlush (dp); drawstarbackground (); printf ("starting intro\n"); { Cursor cursor; Pixmap cur, mask; XColor white, black; if (!drawpointer) { cur = XCreatePixmapFromBitmapData (dp, wi, (char *) cursorp_bits, cursorp_width, cursorp_height, (unsigned long) 1L, (unsigned long) 0L, (unsigned int) 1); mask = XCreatePixmapFromBitmapData (dp, wi, (char *) cursorm_bits, cursorm_width, cursorm_height, (unsigned long) 1L, (unsigned long) 0L, (unsigned int) 1); } else { cur = XCreatePixmapFromBitmapData (dp, wi, (char *) nocursorm_bits, nocursorm_width, nocursorm_height, (unsigned long) 1, (unsigned long) 0, (unsigned int) 1); mask = XCreatePixmapFromBitmapData (dp, wi, (char *) nocursorm_bits, nocursorm_width, nocursorm_height, (unsigned long) 1, (unsigned long) 0, (unsigned int) 1); } black.red = 0x0000; black.green = 0x0000; black.blue = 0x0000; white.red = 0xFFFF; white.green = 0xFFFF; if (blackwhite) white.blue = 0xffff; else white.blue = 0x0000; cursor = XCreatePixmapCursor (dp, cur, mask, &black, &white, 0, 0); XFreePixmap (dp, cur); XFreePixmap (dp, mask); XDefineCursor (dp, wi, cursor); } keys[0][0] = XK_Up; keys[0][1] = XK_Down; keys[0][2] = XK_Left; keys[0][3] = XK_Right; keys[1][0] = XK_w; keys[1][1] = XK_s; keys[1][2] = XK_a; keys[1][3] = XK_d; XMapWindow (dp, wi); XNextEvent (dp, &event); XSync (dp, 0); UpdateInput (); starwars (); printf ("starting game\n"); #ifdef NETSUPPORT if (client) client_loop (); else #endif game (); printf ("uninitializing\n"); uninitialize (); return 0; } koules1.4/xlib/input.h100644 37512 310 4061 6477554535 13343 0ustar rootroot/*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * interface.h interface for vgakeyboard * ***********************************************************/ #define SCANCODE_P 25 struct keyrec { int scancode; struct keyrec *next; struct keyrec *last; }; #ifdef PLATFORM_VARIABLES_HERE #define where #else #define where extern #endif #define MOUSE where struct keyrec *ffirstkey #ifdef PLATFORM_VARIABLES_HERE =NULL #endif ; where int penter, pup, pdown,ph, pp, pesc, pleft, pright; where int mousex, mousey; where unsigned int mousebuttons; #undef where #define UpdateInput() ProcessEvents(); #define IsPressed(scancode) (findkey(scancode)!=NULL?1:0) #define MouseButtons() mousebuttons #define MouseX() mousex #define MouseY() mousey #define Pressed() (ffirstkey!=NULL?1:mousebuttons&&mousex>0&&mousey>0&&mousex #include #include "inlstring.h" #ifdef MITSHM #include #include #include #endif #include #define XSUPPORT #define EYE_RADIUS (DIV==1?5:6) #define MOUSE_RADIUS 4 #define WRITEMODE_OVERWRITE 0 #define WRITEMODE_MASKED 1 typedef struct { XImage *bitmap; char *mask; #ifdef MITSHM int xsize; char *vbuff; #endif } RawBitmapType; typedef struct { Pixmap bitmap, mask; #ifdef MITSHM unsigned char *vbuff; #endif } BitmapType; typedef struct { Pixmap pixmap; #ifdef MITSHM char *vbuff; XImage *ximage; #endif } VScreenType; #ifndef PLATFORM_VARIABLES_HERE #define WHERE extern #else #define WHERE #endif WHERE void *fontblack; WHERE void *fontwhite; WHERE int nofade; WHERE int monochrome; WHERE Colormap colormap; WHERE int useprivate; WHERE int fadeenable; WHERE int nopause; WHERE int shm; WHERE int depth; WHERE int notusedc; WHERE int Clipping; WHERE int GAMEWIDTH; WHERE int GAMEHEIGHT; WHERE int MAPWIDTH; WHERE int MAPHEIGHT; WHERE int DIV; WHERE Pixmap screenpixmap; WHERE VScreenType physicalscreen; WHERE VScreenType backscreen; WHERE VScreenType background; WHERE VScreenType starbackground; WHERE VScreenType current; WHERE Display *dp; WHERE Window wi; WHERE XFontStruct *fs; WHERE int screen; WHERE int blackwhite; WHERE int pixels[256]; WHERE long rpixels[256]; WHERE int notrealshm; WHERE float spixels[256]; WHERE float opixels[256]; WHERE GC gc; WHERE GC maskgc; WHERE GC whitegc; WHERE GC blackgc; WHERE GC orgc; #undef WHERE #undef FastAccess #define CharX 8 #define CharY 8 #define NODIRECT #ifdef MITSHM extern void ShmPutBitmap (int, int, int, int, void *); extern int ShmBitmapSize (int, int, void *); extern void ShmCompileBitmap (int, int, void *, void *); extern void shmline (int, int, int, int, int); extern void SetFont (int,int,void *); extern void SetWriteMode(int); extern void FWrite(int,int,char *); extern void ExpandFont(int,int,int,void *,void *); extern void DrawBlackMaskedText(int,int,char *); extern void DrawWhiteMaskedText(int,int,char *); extern void DrawText(int,int,char *); #endif extern void SetColor (int); extern void SetWidth (int); extern void SetStipple (int, int, Pixmap); extern void UnSetStipple (); extern void FlushParam (); extern BitmapType CompileBitmap (int, int, RawBitmapType); extern RawBitmapType CreateBitmap (int, int); extern void PutBitmap (int, int, int, int, BitmapType); extern void DrawRectangle (int, int, int, int, int); extern void ClearScreen (); extern void CopyVSToVS (VScreenType, VScreenType); extern void CopyToScreen (VScreenType); extern void DrawBlackMaskedText (int, int, char *); extern void DrawWhiteMaskedText (int x, int y, char *); extern void DrawText (int, int, char *); /* * unimplemented and unused functions: */ /*SetPalette(palette) #define SGetPixel(x,y) */ /* * unimplemented and used functions: */ #define WaitRetrace() dummy /* * fast interface macros: */ #define cpixels(color) pixels[(unsigned char)(color)] #define FillRectangle(x,y,x1,y1,color) SetColor(color),XFillRectangle(dp,current.pixmap,gc,(int)(x),(int)(y),(int)(x1),(int)(y1)) #define SetScreen(screen) (current=screen) #define EnableClipping() Clipping=1 #define DisableClipping() Clipping=0 #ifndef MITSHM #define DrawBlackMaskedText(xp,yp,text) XDrawString (dp, current.pixmap, blackgc, xp, yp + 7, text, strlen (text)) #define DrawText(xp,yp,text) XDrawString (dp, current.pixmap, whitegc, xp, yp + 7, text, strlen (text)) #define DrawWhiteMaskedText(xp,yp,text) XDrawString (dp, current.pixmap, whitegc, xp, yp + 7, text, strlen (text)) #define BSetPixel(bitmap1,x1,y1,color) (XPutPixel ((XImage *)(bitmap1.bitmap), (int)(x1), (int)(y1), cpixels((color))),\ (color?(*(bitmap1.mask+((int)(x1))/8+(y1*((bitmap1.bitmap->width+7)/8)))|=1<<(((int)(x1))%8)):0)) #define SSetPixel(x1,y1,color) (SetColor(color),XDrawPoint(dp,current.pixmap,gc,(int)(x1),(int)(y1))) #define HLine(x1,y1,x2,color) (SetColor(color),XDrawLine(dp,current.pixmap,gc,(int)(x1),(int)(y1),(int)(x2),(int)(y1))) #define Line(x1,y1,x2,y2,color) (SetColor(color),XDrawLine(dp,current.pixmap,gc,(int)(x1),(int)(y1),(int)(x2),(int)(y2))) #else #define VScreenToBuffer(screen) screen.vbuff #define BitmapToBuffer(bitmap) ((char *)bitmap.vbuff) #define qSSetPixel(x1,y1,color) (SetColor(color),XDrawPoint(dp,current.pixmap,gc,(int)(x1),(int)(y1))) #define qBSetPixel(bitmap1,x1,y1,color) (XPutPixel ((XImage *)(bitmap1.bitmap), (int)(x1), (int)(y1), cpixels((color))),\ (color?(*(bitmap1.mask+((int)(x1))/8+(((int)y1)*((bitmap1.bitmap->width+7)/8)))|=1L<<(((int)(x1))%8)):0)) #define qLine(x1,y1,x2,y2,color) (SetColor(color),XDrawLine(dp,current.pixmap,gc,(int)(x1),(int)(y1),(int)(x2),(int)(y2))) extern void Line(int,int,int,int,int); #define SMySetPixel(screen,x,y,color) *(VScreenToBuffer(screen)+(int)(x)+(((int)(y))>>8)*MAPWIDTH)=cpixels(color) #define SSetPixel(x,y,color) (((int)shm)?(*(VScreenToBuffer(current)+(int)(x)+((int)(y))*MAPWIDTH)=cpixels(color)):(qSSetPixel(x,y,color))) #define BSetPixel(bitmap1,x,y,color) (((int)shm)?(*(BitmapToBuffer(bitmap1)+(int)(x)+((int)(y))*(bitmap1).xsize)=color?cpixels(color):notusedc):(qBSetPixel(bitmap1,(int)x,(int)y,color))) /*faster for font */ #define SSetPixel1(x,y,color) (*(VScreenToBuffer(current)+(int)(x)+((int)(y))*MAPWIDTH)=cpixels(color)) #define HLine1(x1,y1,x2,color) memset(VScreenToBuffer(current)+(int)(x1)+((int)(y1))*MAPWIDTH,cpixels(color),(int)(x2)-(int)(x1)) #define HLine(x1,y1,x2,color) memset(VScreenToBuffer(current)+(int)(x1)+((int)(y1))*MAPWIDTH,cpixels(color),(int)(x2)-(int)(x1)) #define FAST_WIDELINE #endif koules1.4/xlib/inlstring.h100644 37512 310 16250 6477322207 14225 0ustar rootroot /* Based on functions in linux/string.h */ #if !defined(__386__)||!defined(ASSEMBLY) #define __memcpy(dst,src,n) memcpy((dst),(src),(n)) #define __memcpy_conventioanl(dst,src,n) memcpy((dst),(src),(n)) #define __memcpyb(dst,src,n) memcpy((dst),(src),(n)) #define __memsetb(dst,c,n) memset((dst),(c),(n)) #define __memsetlong(dst,c,n) memset((dst),(c),(n)) #define __memset(dst,c,n) memset((dst),(c),(n)) #define __memset2(dst,c,n) memset((dst),(c),2*(n)) #define __memset3(dst,c,n) memset((dst),(c),3*(n)) #else #include /* for size_t */ static INLINE void * __memcpy_conventional (void *to, const void *from, size_t n) { __asm__ ("cld\n\t" "movl %%edi,%%ecx\n\t" "andl $1,%%ecx\n\t" "subl %%ecx,%%edx\n\t" "rep ; movsb\n\t" /* 16-bit align destination */ "movl %%edx,%%ecx\n\t" "shrl $2,%%ecx\n\t" "rep ; movsl\n\t" "testb $1,%%dl\n\t" "je 1f\n\t" "movsb\n" "1:\ttestb $2,%%dl\n\t" "je 2f\n\t" "movsw\n" "2:\n" : : "d" (n), "D" ((long) to), "S" ((long) from) : "cx", "dx", "di", "si"); return (to); } static INLINE void * __memcpyb (void *to, const void *from, size_t n) { __asm__ ("cld\n\t" "rep ; movsb\n\t" : : "c" (n), "D" ((long) to), "S" ((long) from) : "cx", "di", "si"); return (to); } static INLINE void * __memsetb (void *s, char c, size_t count) { __asm__ ("cld\n\t" "rep\n\t" "stosb" : : "a" (c), "D" (s), "c" (count) : "cx", "di"); return s; } static INLINE void * __memsetlong (void *s, unsigned c, size_t count) { __asm__ ("cld\n\t" "rep\n\t" "stosl" : : "a" (c), "D" (s), "c" (count) : "cx", "di"); return s; } static INLINE void * __memset (void *s, char c, size_t count) { __asm__ ( "cld\n\t" "cmpl $12,%%edx\n\t" "jl 1f\n\t" /* if (count >= 12) */ "movzbl %%al,%%ax\n\t" "movl %%eax,%%ecx\n\t" "shll $8,%%ecx\n\t" /* c |= c << 8 */ "orl %%ecx,%%eax\n\t" "movl %%eax,%%ecx\n\t" "shll $16,%%ecx\n\t" /* c |= c << 16 */ "orl %%ecx,%%eax\n\t" "movl %%edx,%%ecx\n\t" "negl %%ecx\n\t" "andl $3,%%ecx\n\t" /* (-s % 4) */ "subl %%ecx,%%edx\n\t" /* count -= (-s % 4) */ "rep ; stosb\n\t" /* align to longword boundary */ "movl %%edx,%%ecx\n\t" "shrl $2,%%ecx\n\t" "rep ; stosl\n\t" /* fill longwords */ "andl $3,%%edx\n" /* fill last few bytes */ "1:\tmovl %%edx,%%ecx\n\t" /* <= 12 entry point */ "rep ; stosb\n\t" : : "a" (c), "D" (s), "d" (count) : "ax", "cx", "dx", "di"); return s; } static INLINE void * __memset2 (void *s, short c, size_t count) /* count is in 16-bit pixels */ /* s is assumed to be 16-bit aligned */ { __asm__ ( "cld\n\t" "cmpl $12,%%edx\n\t" "jl 1f\n\t" /* if (count >= 12) */ "movzwl %%ax,%%eax\n\t" "movl %%eax,%%ecx\n\t" "shll $16,%%ecx\n\t" /* c |= c << 16 */ "orl %%ecx,%%eax\n\t" "movl %%edi,%%ecx\n\t" "andl $2,%%ecx\n\t" /* s & 2 */ "jz 2f\n\t" "decl %%edx\n\t" /* count -= 1 */ "stosw\n\t" /* align to longword boundary */ "2:\n\t" "movl %%edx,%%ecx\n\t" "shrl $1,%%ecx\n\t" "rep ; stosl\n\t" /* fill longwords */ "andl $1,%%edx\n" /* one 16-bit word left? */ "jz 3f\n\t" /* no, finished */ "1:\tmovl %%edx,%%ecx\n\t" /* <= 12 entry point */ "rep ; stosw\n\t" "3:\n\t" : : "a" (c), "D" (s), "d" (count) : "ax", "cx", "dx", "di"); return s; } static INLINE void * __memset3 (void *s, int c, size_t count) /* count is in 24-bit pixels (3 bytes per pixel) */ { __asm__ ( "cmpl $8,%%edx\n\t" /* "jmp 2f\n\t" *//* debug */ "jl 2f\n\t" "movl %%eax,%%ebx\n\t" /* eax = (low) BGR0 (high) */ "shll $24,%%ebx\n\t" /* ebx = 000B */ "orl %%ebx,%%eax\n\t" /* eax = BGRB */ "movl %%eax,%%ebx\n\t" "shrl $8,%%ebx\n\t" /* ebx = GRB0 */ "movl %%ebx,%%ecx\n\t" "shll $24,%%ecx\n\t" /* ecx = 000G */ "orl %%ecx,%%ebx\n\t" /* ebx = GRBG */ "movl %%eax,%%ecx\n\t" "shll $8,%%ecx\n\t" /* ecx = 0BGR */ "movb %%bh,%%cl\n\t" /* ecx = RBGR */ "cmpl $16,%%edx\n\t" "jl 1f\n\t" "jmp 5f\n\t" ".align 4,0x90\n\t" "5:\n\t" /* loop unrolling */ "movl %%eax,(%%edi)\n\t" /* write BGRB */ "movl %%ebx,4(%%edi)\n\t" /* write GRBG */ "movl %%ecx,8(%%edi)\n\t" /* write RBGR */ "movl %%eax,12(%%edi)\n\t" "movl %%ebx,16(%%edi)\n\t" "movl %%ecx,20(%%edi)\n\t" "movl %%eax,24(%%edi)\n\t" "movl %%ebx,28(%%edi)\n\t" "movl %%ecx,32(%%edi)\n\t" "movl %%eax,36(%%edi)\n\t" "subl $16,%%edx\n\t" /* blend end-of-loop instr. */ "movl %%ebx,40(%%edi)\n\t" "movl %%ecx,44(%%edi)\n\t" "addl $48,%%edi\n\t" "cmpl $16,%%edx\n\t" "jge 5b\n\t" "andl %%edx,%%edx\n\t" "jz 4f\n\t" /* finished */ "cmpl $4,%%edx\n\t" "jl 2f\n\t" /* less than 4 pixels left */ "jmp 1f\n\t" ".align 4,0x90\n\t" "1:\n\t" "movl %%eax,(%%edi)\n\t" /* write BGRB */ "movl %%ebx,4(%%edi)\n\t" /* write GRBG */ "movl %%ecx,8(%%edi)\n\t" /* write RBGR */ "addl $12,%%edi\n\t" "subl $4,%%edx\n\t" "cmpl $4,%%edx\n\t" "jge 1b\n\t" "2:\n\t" "cmpl $0,%%edx\n\t" /* none left? */ "jle 4f\n\t" /* finished */ "mov %%eax,%%ecx\n\t" "shrl $16,%%ecx\n\t" /* B in cl */ "3:\n\t" /* write last few pixels */ "movw %%ax,(%%edi)\n\t" /* write RG */ "movb %%cl,2(%%edi)\n\t" /* write B */ "addl $3,%%edi\n\t" "decl %%edx\n\t" "jnz 3b\n\t" "4:\n\t" : : "a" (c), "D" (s), "d" (count) : "ax", "bx", "cx", "dx", "di"); return s; } /* Functions defined in mem.S */ extern memcpy4to3 (void *dest, void *src, int n); extern memcpy32shift8 (void *dest, void *src, int n); /* Functions for which arguments must be passed in %ebx, %edx, and %ecx. */ extern __memcpyasm_regargs (); /* nu_bytes >= 3 */ extern __memcpyasm_regargs_aligned (); /* nu_bytes >= 32 */ /* Always 32-bit align destination, even for a small number of bytes. */ static INLINE void * __memcpy_aligndest (void *dest, const void *src, int n) { __asm__ __volatile__ (" cmpl $3, %%ecx ja 1f call * __memcpy_jumptable (, %%ecx, 4) jmp 2f 1:call __memcpyasm_regargs " : :"b" (dest), "d" (src), "c" (n) :"ax", "0", "1", "2"); } /* Optimized version for 32-bit aligned destination. */ static INLINE void * __memcpy_destaligned (void *dest, const void *src, int n) { __asm__ __volatile__ (" cmpl $32, %%ecx ja 1f call * __memcpy_jumptable (, %%ecx, 4) jmp 2f 1:call __memcpyasm_regargs_aligned 2: " : :"b" (dest), "d" (src), "c" (n) :"ax", "0", "1", "2"); } /* Balanced INLINE memcpy; 32-bit align destination if nu_bytes >= 20. */ static INLINE void * __memcpy_balanced (void *dest, const void *src, int n) { __asm__ __volatile__ (" cmpl $19, %%ecx ja 1f call * __memcpy_jumptable (, %%ecx, 4) jmp 2f 1:call __memcpyasm_regargs 2: " : :"b" ((long) dest), "d" ((long) src), "c" ((long) n) :"ax", "bx", "cx", "dx"); } #define __memcpy __memcpy_conventional #endif koules1.4/xlib/Makefile100644 37512 310 37162 6477556603 13521 0ustar rootroot# Makefile generated by imake - do not edit! # $TOG: imake.c /main/97 1997/06/20 20:23:51 kaleb $ # ---------------------------------------------------------------------- # Makefile generated from "Imake.tmpl" and # $TOG: Imake.tmpl /main/245 1997/05/20 10:05:47 kaleb $ # # # # # $XFree86: xc/config/cf/Imake.tmpl,v 3.32.2.5 1997/07/06 07:27:59 dawes Exp $ # ---------------------------------------------------------------------- all:: .SUFFIXES: .i # $TOG: Imake.cf /main/28 1997/06/25 08:31:36 barstow $ # $XFree86: xc/config/cf/Imake.cf,v 3.34.2.3 1997/07/27 02:41:02 dawes Exp $ # ----------------------------------------------------------------------- # site-specific configuration parameters that need to come before # the platform-specific parameters - edit site.def to change # site: $XConsortium: site.def /main/revisionist/4 1996/12/31 08:02:07 kaleb $ # site: $XFree86: xc/config/cf/site.def,v 3.17.2.1 1997/06/22 10:32:21 dawes Exp $ # $XFree86: xc/config/cf/xf86site.def,v 3.101.2.11 1997/06/22 10:32:22 dawes Exp $ # ---------------------------------------------------------------------- # platform-specific configuration parameters - edit linux.cf to change # platform: $TOG: linux.cf /main/36 1997/06/16 22:21:03 kaleb $ # platform: $XFree86: xc/config/cf/linux.cf,v 3.57.2.10 1997/07/28 14:17:25 dawes Exp $ # operating system: Linux 2.1.86 sparc64 [ELF] (2.1.86) # libc: (5.3.12) # binutils: (28) # $XConsortium: lnxLib.rules /main/13 1996/09/28 16:11:01 rws $ # $XFree86: xc/config/cf/lnxLib.rules,v 3.28.2.3 1997/06/22 10:32:20 dawes Exp $ # ---------------------------------------------------------------------- # site-specific configuration parameters that go after # the platform-specific parameters - edit site.def to change # site: $XConsortium: site.def /main/revisionist/4 1996/12/31 08:02:07 kaleb $ # site: $XFree86: xc/config/cf/site.def,v 3.17.2.1 1997/06/22 10:32:21 dawes Exp $ # --------------------------------------------------------------------- # Imake rules for building libraries, programs, scripts, and data files # rules: $TOG: Imake.rules /main/222 1997/07/17 20:04:40 kaleb $ # rules: $XFree86: xc/config/cf/Imake.rules,v 3.33.2.5 1997/07/19 04:59:07 dawes Exp $ _NULLCMD_ = @ echo -n TKLIBNAME = tk4.2 TKLIBDIR = /usr/local/lib TCLLIBNAME = tcl7.6 TCLIBDIR = /usr/local/lib PATHSEP = / SHELL = /bin/sh TOP = .. CURRENT_DIR = xlib IMAKE = imake DEPEND = makedepend MKDIRHIER = mkdir -p EXPORTLISTGEN = CONFIGSRC = $(TOP)/config IMAKESRC = $(CONFIGSRC)/imake DEPENDSRC = $(CONFIGSRC)/makedepend INCROOT = /usr/X11R6/include USRLIBDIR = /usr/X11R6/lib VARLIBDIR = /var/lib SHLIBDIR = /usr/X11R6/lib LINTLIBDIR = $(USRLIBDIR)/lint MANPATH = /usr/X11R6/man MANSOURCEPATH = $(MANPATH)/man MANDIR = $(MANSOURCEPATH)1 LIBMANDIR = $(MANSOURCEPATH)3 FILEMANDIR = $(MANSOURCEPATH)5 AR = ar clq BOOTSTRAPCFLAGS = CC = gcc AS = as .SUFFIXES: .cc CXX = c++ CXXFILT = c++filt CXXLIB = CXXDEBUGFLAGS = -O2 CXXDEPENDINCLUDES = CXXEXTRA_DEFINES = CXXEXTRA_INCLUDES = CXXSTD_DEFINES = -Dlinux -D__sparc__ -D_POSIX_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -DX_LOCALE $(CXXPROJECT_DEFINES) CXXOPTIONS = CXXINCLUDES = $(INCLUDES) $(TOP_INCLUDES) $(CXXEXTRA_INCLUDES) CXXDEFINES = $(CXXINCLUDES) $(CXXSTD_DEFINES) $(THREADS_CXXDEFINES) $(CXXEXTRA_DEFINES) $(DEFINES) CXXFLAGS = $(CXXDEBUGFLAGS) $(CXXOPTIONS) $(THREADS_CXXFLAGS) $(CXXDEFINES) COMPRESS = compress GZIPCMD = gzip CPP = /lib/cpp $(STD_CPP_DEFINES) PREPROCESSCMD = gcc -E $(STD_CPP_DEFINES) INSTALL = install INSTALLFLAGS = -c LD = ld LEX = flex -l LEXLIB = -lfl YACC = bison -y CCYACC = bison -y LINT = lint LINTLIBFLAG = -C LINTOPTS = -axz LN = ln -s MAKE = make MV = mv -f CP = cp RANLIB = ranlib RANLIBINSTFLAGS = RM = rm -f MANSUFFIX = 1x LIBMANSUFFIX = 3x FILEMANSUFFIX = 5x TROFF = psroff NROFF = nroff MSMACROS = -ms MANMACROS = -man TBL = tbl EQN = eqn NEQN = neqn COL = col DVIPS = dvips LATEX = latex STD_INCLUDES = STD_CPP_DEFINES = -traditional -Dlinux -D__sparc__ -D_POSIX_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -DX_LOCALE $(PROJECT_DEFINES) STD_DEFINES = -Dlinux -D__sparc__ -D_POSIX_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -DX_LOCALE $(PROJECT_DEFINES) EXTRA_LOAD_FLAGS = EXTRA_LDOPTIONS = EXTRA_LIBRARIES = TAGS = ctags PARALLELMFLAGS = SHAREDCODEDEF = SHLIBDEF = SHLIBLDFLAGS = -shared PICFLAGS = -fPIC CXXPICFLAGS = -fPIC PROTO_DEFINES = -DFUNCPROTO=15 -DNARROWPROTO INSTPGMFLAGS = -s INSTBINFLAGS = -m 0755 INSTUIDFLAGS = -m 4711 INSTLIBFLAGS = -m 0644 INSTINCFLAGS = -m 0444 INSTMANFLAGS = -m 0444 INSTDATFLAGS = -m 0444 INSTKMEMFLAGS = -m 4711 PROJECTROOT = /usr/X11R6 CDEBUGFLAGS = -O2 CCOPTIONS = ALLINCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) $(TOP_INCLUDES) $(STD_INCLUDES) ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(EXTRA_DEFINES) $(PROTO_DEFINES) $(THREADS_DEFINES) $(DEFINES) CFLAGS = $(CDEBUGFLAGS) $(CCOPTIONS) $(THREADS_CFLAGS) $(ALLDEFINES) LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES) $(DEPEND_DEFINES) LDPRELIB = -L$(USRLIBDIR) LDPOSTLIB = LDOPTIONS = $(CDEBUGFLAGS) $(CCOPTIONS) $(EXTRA_LDOPTIONS) $(THREADS_LDFLAGS) $(LOCAL_LDFLAGS) $(LDPRELIBS) CXXLDOPTIONS = $(CXXDEBUGFLAGS) $(CXXOPTIONS) $(EXTRA_LDOPTIONS) $(THREADS_CXXLDFLAGS) $(LOCAL_LDFLAGS) $(LDPRELIBS) LDLIBS = $(LDPOSTLIBS) $(THREADS_LIBS) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES) CCLINK = $(CC) CXXLINK = $(CXX) LDSTRIPFLAGS = -x LDCOMBINEFLAGS = -r DEPENDFLAGS = # Not sure this belongs here TKLIBDIR = /usr/local/lib TKINCDIR = /usr/local/include TKLIBNAME = tk4.2 TKLIBRARY = -L$(TKLIBDIR) -l$(TKLIBNAME) TCLLIBDIR = /usr/local/lib TCLINCDIR = /usr/local/include TCLLIBNAME = tcl7.6 TCLLIBRARY = -L$(TCLLIBDIR) -l$(TCLLIBNAME) MACROFILE = linux.cf RM_CMD = $(RM) IMAKE_DEFINES = IRULESRC = $(CONFIGDIR) IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES) ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/X11.tmpl $(IRULESRC)/site.def $(IRULESRC)/$(MACROFILE) $(IRULESRC)/xf86site.def $(IRULESRC)/host.def $(EXTRA_ICONFIGFILES) # $TOG: X11.rules /main/4 1997/04/30 15:23:24 kaleb $ # ---------------------------------------------------------------------- # X Window System Build Parameters and Rules # $TOG: X11.tmpl /main/292 1997/05/20 10:05:59 kaleb $ # # # # # $XFree86: xc/config/cf/X11.tmpl,v 1.8.2.3 1997/05/21 15:02:13 dawes Exp $ # ----------------------------------------------------------------------- # X Window System make variables; these need to be coordinated with rules XTOP = $(TOP) BINDIR = /usr/X11R6/bin BUILDINCROOT = $(TOP)/exports BUILDINCDIR = $(BUILDINCROOT)/include BUILDINCTOP = ../.. BUILDLIBDIR = $(TOP)/exports/lib BUILDLIBTOP = ../.. BUILDBINDIR = $(TOP)/exports/bin BUILDBINTOP = ../.. XBUILDINCROOT = $(XTOP)/exports XBUILDINCDIR = $(XBUILDINCROOT)/include/X11 XBUILDINCTOP = ../../.. XBUILDBINDIR = $(XBUILDINCROOT)/bin INCDIR = $(INCROOT) ADMDIR = /usr/adm LIBDIR = $(USRLIBDIR)/X11 TOP_X_INCLUDES = -I$(XPROJECTROOT)/include FONTDIR = $(LIBDIR)/fonts XINITDIR = $(LIBDIR)/xinit XDMDIR = $(LIBDIR)/xdm XDMVARDIR = $(VARLIBDIR)/xdm TWMDIR = $(LIBDIR)/twm XSMDIR = $(LIBDIR)/xsm NLSDIR = $(LIBDIR)/nls XLOCALEDIR = $(LIBDIR)/locale PEXAPIDIR = $(LIBDIR)/PEX LBXPROXYDIR = $(LIBDIR)/lbxproxy PROXYMANAGERDIR = $(LIBDIR)/proxymngr XPRINTDIR = $(LIBDIR) XAPPLOADDIR = $(LIBDIR)/app-defaults FONTCFLAGS = -t INSTAPPFLAGS = $(INSTDATFLAGS) RGB = rgb FONTC = bdftopcf MKFONTDIR = mkfontdir DOCUTILSRC = $(XTOP)/doc/util CLIENTSRC = $(TOP)/clients DEMOSRC = $(TOP)/demos XDOCMACROS = $(DOCUTILSRC)/macros.t XIDXMACROS = $(DOCUTILSRC)/indexmacros.t PROGRAMSRC = $(TOP)/programs LIBSRC = $(XTOP)/lib FONTSRC = $(XTOP)/fonts INCLUDESRC = $(BUILDINCROOT)/include XINCLUDESRC = $(INCLUDESRC)/X11 SERVERSRC = $(XTOP)/programs/Xserver CONTRIBSRC = $(XTOP)/../contrib UNSUPPORTEDSRC = $(XTOP)/unsupported DOCSRC = $(XTOP)/doc RGBSRC = $(XTOP)/programs/rgb BDFTOPCFSRC = $(PROGRAMSRC)/bdftopcf MKFONTDIRSRC = $(PROGRAMSRC)/mkfontdir FONTSERVERSRC = $(PROGRAMSRC)/xfs FONTINCSRC = $(XTOP)/include/fonts EXTINCSRC = $(XTOP)/include/extensions TRANSCOMMSRC = $(LIBSRC)/xtrans TRANS_INCLUDES = -I$(TRANSCOMMSRC) XENVLIBDIR = $(USRLIBDIR) CLIENTENVSETUP = LD_LIBRARY_PATH=$(XENVLIBDIR) # $XConsortium: lnxLib.tmpl,v 1.5 95/01/11 21:44:44 kaleb Exp $ # $XFree86: xc/config/cf/lnxLib.tmpl,v 3.9 1996/02/24 04:32:52 dawes Exp $ XLIBSRC = $(LIBSRC)/X11 SOXLIBREV = 6.1 DEPXONLYLIB = XONLYLIB = -lX11 LINTXONLY = $(LINTLIBDIR)/llib-lX11.ln XLIBONLY = $(XONLYLIB) XEXTLIBSRC = $(LIBSRC)/Xext SOXEXTREV = 6.3 DEPEXTENSIONLIB = EXTENSIONLIB = -lXext LINTEXTENSION = $(LINTLIBDIR)/llib-lXext.ln LINTEXTENSIONLIB = $(LINTEXTENSION) DEPXLIB = $(DEPEXTENSIONLIB) $(DEPXONLYLIB) XLIB = $(EXTENSIONLIB) $(XONLYLIB) LINTXLIB = $(LINTXONLYLIB) XAUTHSRC = $(LIBSRC)/Xau DEPXAUTHLIB = $(USRLIBDIR)/libXau.a XAUTHLIB = -lXau LINTXAUTH = $(LINTLIBDIR)/llib-lXau.ln XDMCPLIBSRC = $(LIBSRC)/Xdmcp DEPXDMCPLIB = $(USRLIBDIR)/libXdmcp.a XDMCPLIB = -lXdmcp LINTXDMCP = $(LINTLIBDIR)/llib-lXdmcp.ln XMUSRC = $(LIBSRC)/Xmu SOXMUREV = 6.0 DEPXMULIB = XMULIB = -lXmu LINTXMU = $(LINTLIBDIR)/llib-lXmu.ln OLDXLIBSRC = $(LIBSRC)/oldX DEPOLDXLIB = $(USRLIBDIR)/liboldX.a OLDXLIB = -loldX LINTOLDX = $(LINTLIBDIR)/llib-loldX.ln XPLIBSRC = $(LIBSRC)/Xp SOXPREV = 6.2 DEPXPLIB = XPLIB = -lXp LINTXP = $(LINTLIBDIR)/llib-lXp.ln TOOLKITSRC = $(LIBSRC)/Xt SOXTREV = 6.0 DEPXTOOLONLYLIB = XTOOLONLYLIB = -lXt LINTXTOOLONLY = $(LINTLIBDIR)/llib-lXt.ln DEPXTOOLLIB = $(DEPXTOOLONLYLIB) $(DEPSMLIB) $(DEPICELIB) XTOOLLIB = $(XTOOLONLYLIB) $(SMLIB) $(ICELIB) LINTXTOOLLIB = $(LINTXTOOLONLYLIB) XALIBSRC = $(LIBSRC)/Xa SOXAREV = 1.0 DEPXALIB = XALIB = -lXa LINTXA = $(LINTLIBDIR)/llib-lXa.ln AWIDGETSRC = $(LIBSRC)/Xaw SOXAWREV = 6.1 DEPXAWLIB = XAWLIB = -lXaw LINTXAW = $(LINTLIBDIR)/llib-lXaw.ln XILIBSRC = $(LIBSRC)/Xi SOXINPUTREV = 6.0 DEPXILIB = XILIB = -lXi LINTXI = $(LINTLIBDIR)/llib-lXi.ln XTESTLIBSRC = $(LIBSRC)/Xtst SOXTESTREV = 6.1 DEPXTESTLIB = XTESTLIB = -lXtst LINTXTEST = $(LINTLIBDIR)/llib-lXtst.ln PEXLIBSRC = $(LIBSRC)/PEX5 SOPEXREV = 6.0 DEPPEXLIB = PEXLIB = -lPEX5 LINTPEX = $(LINTLIBDIR)/llib-lPEX5.ln XIELIBSRC = $(LIBSRC)/XIE SOXIEREV = 6.0 DEPXIELIB = XIELIB = -lXIE LINTXIE = $(LINTLIBDIR)/llib-lXIE.ln PHIGSLIBSRC = $(LIBSRC)/PHIGS DEPPHIGSLIB = $(USRLIBDIR)/libphigs.a PHIGSLIB = -lphigs LINTPHIGS = $(LINTLIBDIR)/llib-lphigs.ln DEPXBSDLIB = $(USRLIBDIR)/libXbsd.a XBSDLIB = -lXbsd LINTXBSD = $(LINTLIBDIR)/llib-lXbsd.ln ICESRC = $(LIBSRC)/ICE SOICEREV = 6.3 DEPICELIB = ICELIB = -lICE LINTICE = $(LINTLIBDIR)/llib-lICE.ln SMSRC = $(LIBSRC)/SM SOSMREV = 6.0 DEPSMLIB = SMLIB = -lSM LINTSM = $(LINTLIBDIR)/llib-lSM.ln XKEYSRC = $(LIBSRC)/Xkey SOXKEYREV = 6.0 DEPXKEYLIB = XKEYLIB = -lXkey LINTXKEY = $(LINTLIBDIR)/llib-lXkey.ln FSLIBSRC = $(LIBSRC)/FS DEPFSLIB = $(USRLIBDIR)/libFS.a FSLIB = -lFS LINTFS = $(LINTLIBDIR)/llib-lFS.ln FONTLIBSRC = $(LIBSRC)/font DEPFONTLIB = $(USRLIBDIR)/libfont.a FONTLIB = -lfont LINTFONT = $(LINTLIBDIR)/llib-lfont.ln XPMLIBSRC = $(LIBSRC)/Xpm DEPXPMLIB = $(USRLIBDIR)/libXpm.a XPMLIB = -lXpm LINTXPM = $(LINTLIBDIR)/llib-lXpm.ln XKBFILELIBSRC = $(LIBSRC)/xkbfile DEPXKBFILELIB = $(USRLIBDIR)/libxkbfile.a XKBFILELIB = -lxkbfile LINTXKBFILE = $(LINTLIBDIR)/llib-lxkbfile.ln XKBCOMPCMD = xkbcomp XKBUILIBSRC = $(LIBSRC)/xkbui DEPXKBUILIB = $(USRLIBDIR)/libxkbui.a XKBUILIB = -lxkbui LINTXKBUI = $(LINTLIBDIR)/llib-lxkbui.ln DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB) DEPLIBS1 = $(DEPLIBS) DEPLIBS2 = $(DEPLIBS) DEPLIBS3 = $(DEPLIBS) DEPLIBS4 = $(DEPLIBS) DEPLIBS5 = $(DEPLIBS) DEPLIBS6 = $(DEPLIBS) DEPLIBS7 = $(DEPLIBS) DEPLIBS8 = $(DEPLIBS) DEPLIBS9 = $(DEPLIBS) DEPLIBS10 = $(DEPLIBS) XMULIBONLY = -lXmu XMULIB = $(XMULIBONLY) $(XTOOLLIB) $(XLIB) CONFIGDIR = $(LIBDIR)/config USRLIBDIRPATH = $(USRLIBDIR) LDPRELIBS = -L$(USRLIBDIR) LDPOSTLIBS = TOP_INCLUDES = -I$(INCROOT) $(TOP_X_INCLUDES) PROJECT_DEFINES = CXXPROJECT_DEFINES = # ---------------------------------------------------------------------- # start of Imakefile KOULESDIR =/usr/bin/X11 SOUNDDIR =/usr/local/lib/koules MANDIR =/usr/local/man/man6 DEPLIBS = $(DEPXLIB) INCLUDES = -Ixlib SUBDIRS = xlib SYSDEFS = -Wall -fomit-frame-pointer -O6 -ffast-math SOUNDSERVER = koules.sndsrv.linux SOUNDOBJS = sound.o SOUNDDEV = /dev/dsp # # *********************************************************** # # ---> Configuration options was moved indo Iconfig <---- # # *********************************************************** NET = -DNETSUPPORT MITSHM1 = -DMITSHM DEPLIBS = $(DEPXLIB) INSTALLSOUND = True DEFINES = -DONLYANSI -DSOUND $(JOYSTICK1) $(NET) $(MITSHM1) $(HAVEUSLEEP1) $(SYSDEFS) $(JOYSTICK) -I. $(NAMEDEF) $(ASMDEF) -DSOUNDSERVER=\"$(KOULESDIR)/$(SOUNDSERVER)\" -DSOUNDDIR=\"$(SOUNDDIR)\" -DSOUNDDEV=\"$(SOUNDDEV)\" OBJS = init.o $(MEMOBJ) interface.o shmbitmap.o text.o font8x8.o SRCS = init.c $(MEMSRC) interface.c shmbitmap.c text.c font8x8.o all:: libxlib.a libxlib.a: $(OBJS) $(EXTRALIBRARYDEPS) $(RM) $@ $(AR) $@ $(OBJS) $(RANLIB) $@ $(_NULLCMD_) all::libxlib.a # ---------------------------------------------------------------------- # common rules for all Makefiles - do not edit .c.i: $(RM) $@ $(CC) -E $(CFLAGS) $(_NOOP_) $*.c > $@ emptyrule:: clean:: $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut "#"* Makefile:: -@if [ -f Makefile ]; then set -x; \ $(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \ else exit 0; fi $(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR) tags:: $(TAGS) -w *.[ch] $(TAGS) -xw *.[ch] > TAGS man_keywords:: # ---------------------------------------------------------------------- # empty rules for directories that do not have SUBDIRS - do not edit install:: @echo "install in $(CURRENT_DIR) done" install.man:: @echo "install.man in $(CURRENT_DIR) done" install.linkkit:: @echo "install.linkkit in $(CURRENT_DIR) done" Makefiles:: includes:: depend:: # ---------------------------------------------------------------------- # dependencies generated by makedepend koules1.4/xlib/text.c100644 37512 310 7442 6477322207 13156 0ustar rootroot/* Addapted from: */ /* Framebuffer Graphics Libary for Linux, Copyright 1993 Harm Hanemaayer */ /* text.c Text writing and fonts */ #ifdef MITSHM #include #include "inlstring.h" /* include inline string operations */ #include "interface.h" typedef unsigned char uchar; #define ASSIGNVP8(x, y, vp) vp = (unsigned char *)VScreenToBuffer(current) + (y)*MAPWIDTH + (x); static void putbox (int x, int y, int w, int h, void *b) { uchar *vp; /* screen pointer */ uchar *bp; /* bitmap pointer */ int i; ASSIGNVP8 (x, y, vp); bp = b; for (i = 0; i < h; i++) { __memcpy (vp, bp, w); /*bp += bw; */ vp += MAPWIDTH; } } static void putboxmask (int x, int y, int w, int h, void *b) { uchar *bp = b; uchar *vp; int i; ASSIGNVP8 (x, y, vp); for (i = 0; i < h; i++) { uchar *endoflinebp = bp + w; #ifdef __i386__ while (bp < endoflinebp - 3) { unsigned int c4 = *(unsigned int *) bp; if ((c4 & 0xff) != notusedc) *vp = (uchar) c4; c4 >>= 8; if ((c4 & 0xff) != notusedc) *(vp + 1) = (uchar) c4; c4 >>= 8; if ((c4 & 0xff) != notusedc) *(vp + 2) = (uchar) c4; c4 >>= 8; if ((c4 & 0xff) != notusedc) *(vp + 3) = (uchar) c4; bp += 4; vp += 4; } #endif while (bp < endoflinebp) { uchar c = *bp; if (c != notusedc) *vp = c; bp++; vp++; } vp += MAPWIDTH - w; } } /* Text/font functions */ static int font_width = 8; static int font_height = 8; static char *font_address; static int font_charactersize = 64; static int font_writemode = WRITEMODE_OVERWRITE; void SetFont (int fw, int fh, void *font) { font_width = fw; font_height = fh; font_charactersize = font_width * font_height; font_address = font; } void SetWriteMode (int m) { font_writemode = m; } void FWrite (int x, int y, char *s) { /* clipping in putbox */ int i; i = 0; if (!(font_writemode & WRITEMODE_MASKED)) { while (s[i] != 0) { putbox (x + i * font_width, y, font_width, font_height, font_address + (unsigned char) s[i] * font_charactersize); i++; } } else { /* masked write */ while (s[i] != 0) { putboxmask (x + i * font_width, y, font_width, font_height, font_address + (unsigned char) s[i] * font_charactersize); i++; } } } void ExpandFont (int fw, int fh, int fg, void *_f1, void *_f2) { /* Convert bit-per-pixel font to byte(s)-per-pixel font */ uchar *f1 = _f1; uchar *f2 = _f2; int i, x, y, b = 0; /* keep gcc happy with b = 0 - MW */ for (i = 0; i < 256; i++) { for (y = 0; y < fh; y++) for (x = 0; x < fw; x++) { if (x % 8 == 0) b = *f1++; if (b & (128 >> (x % 8))) { /* pixel */ *f2 = fg; f2++; } else { /* no pixel */ *f2 = notusedc; f2++; } } } } void DrawBlackMaskedText (int xp, int yp, char *text) { if (!shm) { XDrawString (dp, current.pixmap, blackgc, xp, yp + 7, text, strlen (text)); } else { SetWriteMode (WRITEMODE_MASKED); SetFont (8, 8, fontblack); FWrite (xp, yp, text); } } void DrawWhiteMaskedText (int xp, int yp, char *text) { if (!shm) { XDrawString (dp, current.pixmap, whitegc, xp, yp + 7, text, strlen (text)); } else { SetWriteMode (WRITEMODE_MASKED); SetFont (8, 8, fontwhite); FWrite (xp, yp, text); } } void DrawText (int xp, int yp, char *text) { if (!shm) { XDrawString (dp, current.pixmap, whitegc, xp, yp + 7, text, strlen (text)); } else { SetWriteMode (WRITEMODE_MASKED); SetFont (8, 8, fontwhite); FWrite (xp, yp, text); } } #endif koules1.4/xlib/font8x8.c100644 37512 310 27126 6477322207 13531 0ustar rootroot /*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * font8x8.c binary image of font.. * ***********************************************************/ #ifdef MITSHM static unsigned char __font8x8[] = { 0, 0, 0, 0, 0, 0, 0, 0, 126, 129, 165, 129, 189, 129, 126, 0, /* 0 to 15 */ 126, 255, 219, 255, 195, 255, 126, 0, 54, 127, 127, 127, 62, 28, 8, 0, /* 16 to 31 */ 8, 28, 62, 127, 62, 28, 8, 0, 28, 28, 8, 107, 127, 107, 8, 28, /* 32 to 47 */ 8, 28, 62, 127, 62, 8, 28, 62, 0, 0, 24, 60, 60, 24, 0, 0, /* 48 to 63 */ 255, 255, 231, 195, 195, 231, 255, 255, 0, 60, 102, 66, 66, 102, 60, 0, /* 64 to 79 */ 255, 195, 153, 189, 189, 153, 195, 255, 15, 7, 13, 60, 102, 102, 102, 60, /* 80 to 95 */ 60, 102, 102, 102, 60, 24, 126, 24, 48, 56, 60, 54, 52, 112, 240, 224, /* 96 to 111 */ 127, 99, 127, 99, 99, 103, 230, 192, 24, 219, 126, 102, 102, 126, 219, 24, /* 112 to 127 */ 64, 112, 124, 127, 124, 112, 64, 0, 1, 7, 31, 127, 31, 7, 1, 0, /* 128 to 143 */ 24, 60, 126, 24, 24, 126, 60, 24, 102, 102, 102, 102, 102, 0, 102, 0, /* 144 to 159 */ 63, 122, 122, 58, 10, 10, 10, 0, 30, 51, 28, 54, 54, 28, 102, 60, /* 160 to 175 */ 0, 0, 0, 0, 126, 126, 126, 0, 24, 60, 126, 24, 126, 60, 24, 126, /* 176 to 191 */ 24, 60, 126, 24, 24, 24, 24, 0, 24, 24, 24, 24, 126, 60, 24, 0, /* 192 to 207 */ 0, 12, 14, 127, 14, 12, 0, 0, 0, 24, 56, 127, 56, 24, 0, 0, /* 208 to 223 */ 0, 0, 96, 96, 96, 127, 0, 0, 0, 36, 102, 255, 102, 36, 0, 0, /* 224 to 239 */ 0, 24, 60, 126, 255, 255, 0, 0, 0, 255, 255, 126, 60, 24, 0, 0, /* 240 to 255 */ 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 24, 24, 24, 0, 24, 0, /* 256 to 271 */ 102, 102, 102, 0, 0, 0, 0, 0, 108, 108, 254, 108, 254, 108, 108, 0, /* 272 to 287 */ 16, 124, 208, 124, 22, 124, 16, 0, 0, 198, 204, 24, 48, 102, 198, 0, /* 288 to 303 */ 56, 108, 56, 118, 220, 204, 118, 0, 24, 24, 48, 0, 0, 0, 0, 0, /* 304 to 319 */ 12, 24, 48, 48, 48, 24, 12, 0, 48, 24, 12, 12, 12, 24, 48, 0, /* 320 to 335 */ 0, 108, 56, 254, 56, 108, 0, 0, 0, 24, 24, 126, 24, 24, 0, 0, /* 336 to 351 */ 0, 0, 0, 0, 0, 24, 24, 48, 0, 0, 0, 126, 0, 0, 0, 0, /* 352 to 367 */ 0, 0, 0, 0, 0, 48, 48, 0, 0, 6, 12, 24, 48, 96, 192, 0, /* 368 to 383 */ 60, 102, 110, 126, 118, 102, 60, 0, 12, 28, 60, 12, 12, 12, 12, 0, /* 384 to 399 */ 60, 102, 6, 28, 48, 96, 126, 0, 60, 102, 6, 28, 6, 102, 60, 0, /* 400 to 415 */ 28, 60, 108, 204, 254, 12, 12, 0, 126, 96, 96, 124, 6, 102, 60, 0, /* 416 to 431 */ 60, 96, 96, 124, 102, 102, 60, 0, 126, 6, 6, 12, 24, 48, 48, 0, /* 432 to 447 */ 60, 102, 102, 60, 102, 102, 60, 0, 60, 102, 102, 62, 6, 6, 60, 0, /* 448 to 463 */ 0, 48, 48, 0, 0, 48, 48, 0, 0, 24, 24, 0, 0, 24, 24, 48, /* 464 to 479 */ 12, 24, 48, 96, 48, 24, 12, 0, 0, 0, 126, 0, 0, 126, 0, 0, /* 480 to 495 */ 48, 24, 12, 6, 12, 24, 48, 0, 60, 102, 6, 12, 24, 0, 24, 0, /* 496 to 511 */ 60, 102, 110, 110, 108, 96, 60, 0, 24, 60, 102, 102, 126, 102, 102, 0, /* 512 to 527 */ 124, 102, 102, 124, 102, 102, 124, 0, 60, 102, 96, 96, 96, 102, 60, 0, /* 528 to 543 */ 124, 102, 102, 102, 102, 102, 124, 0, 126, 96, 96, 124, 96, 96, 126, 0, /* 544 to 559 */ 126, 96, 96, 124, 96, 96, 96, 0, 60, 102, 96, 110, 102, 102, 60, 0, /* 560 to 575 */ 102, 102, 102, 126, 102, 102, 102, 0, 60, 24, 24, 24, 24, 24, 60, 0, /* 576 to 591 */ 6, 6, 6, 6, 102, 102, 60, 0, 102, 108, 120, 112, 120, 108, 102, 0, /* 592 to 607 */ 96, 96, 96, 96, 96, 96, 126, 0, 198, 238, 254, 214, 198, 198, 198, 0, /* 608 to 623 */ 102, 118, 126, 110, 102, 102, 102, 0, 60, 102, 102, 102, 102, 102, 60, 0, /* 624 to 639 */ 124, 102, 102, 124, 96, 96, 96, 0, 60, 102, 102, 102, 102, 110, 60, 6, /* 640 to 655 */ 124, 102, 102, 124, 102, 102, 102, 0, 60, 102, 96, 60, 6, 102, 60, 0, /* 656 to 671 */ 126, 24, 24, 24, 24, 24, 24, 0, 102, 102, 102, 102, 102, 102, 60, 0, /* 672 to 687 */ 102, 102, 102, 102, 102, 60, 24, 0, 198, 198, 198, 214, 254, 238, 198, 0, /* 688 to 703 */ 102, 102, 60, 24, 60, 102, 102, 0, 102, 102, 102, 60, 24, 24, 24, 0, /* 704 to 719 */ 126, 6, 12, 24, 48, 96, 126, 0, 60, 48, 48, 48, 48, 48, 60, 0, /* 720 to 735 */ 0, 192, 96, 48, 24, 12, 6, 0, 60, 12, 12, 12, 12, 12, 60, 0, /* 736 to 751 */ 24, 60, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, /* 752 to 767 */ 24, 24, 12, 0, 0, 0, 0, 0, 0, 0, 60, 6, 62, 102, 62, 0, /* 768 to 783 */ 96, 96, 96, 124, 102, 102, 124, 0, 0, 0, 60, 102, 96, 102, 60, 0, /* 784 to 799 */ 6, 6, 6, 62, 102, 102, 62, 0, 0, 0, 60, 102, 126, 96, 62, 0, /* 800 to 815 */ 28, 54, 48, 124, 48, 48, 48, 0, 0, 0, 62, 102, 102, 62, 6, 60, /* 816 to 831 */ 96, 96, 124, 102, 102, 102, 102, 0, 24, 0, 24, 24, 24, 24, 24, 0, /* 832 to 847 */ 12, 0, 12, 12, 12, 12, 108, 56, 96, 96, 102, 108, 120, 108, 102, 0, /* 848 to 863 */ 48, 48, 48, 48, 48, 48, 24, 0, 0, 0, 236, 254, 214, 214, 198, 0, /* 864 to 879 */ 0, 0, 124, 102, 102, 102, 102, 0, 0, 0, 60, 102, 102, 102, 60, 0, /* 880 to 895 */ 0, 0, 124, 102, 102, 124, 96, 96, 0, 0, 62, 102, 102, 62, 6, 6, /* 896 to 911 */ 0, 0, 124, 102, 96, 96, 96, 0, 0, 0, 62, 96, 60, 6, 124, 0, /* 912 to 927 */ 48, 48, 124, 48, 48, 54, 28, 0, 0, 0, 102, 102, 102, 102, 62, 0, /* 928 to 943 */ 0, 0, 102, 102, 102, 60, 24, 0, 0, 0, 198, 214, 254, 238, 68, 0, /* 944 to 959 */ 0, 0, 102, 60, 24, 60, 102, 0, 0, 0, 102, 102, 102, 62, 6, 60, /* 960 to 975 */ 0, 0, 126, 12, 24, 48, 126, 0, 28, 48, 48, 96, 48, 48, 28, 0, /* 976 to 991 */ 24, 24, 24, 24, 24, 24, 24, 0, 56, 12, 12, 6, 12, 12, 56, 0, /* 992 to 1007 */ 118, 220, 0, 0, 0, 0, 0, 0, 0, 0, 24, 60, 102, 102, 126, 0, /* 1008 to 1023 */ 60, 102, 96, 96, 102, 60, 24, 48, 102, 0, 102, 102, 102, 102, 62, 0, /* 1024 to 1039 */ 14, 0, 60, 102, 126, 96, 60, 0, 60, 102, 60, 6, 62, 102, 62, 0, /* 1040 to 1055 */ 102, 0, 60, 6, 62, 102, 62, 0, 112, 0, 60, 6, 62, 102, 62, 0, /* 1056 to 1071 */ 24, 24, 60, 6, 62, 102, 62, 0, 0, 0, 62, 96, 96, 62, 24, 48, /* 1072 to 1087 */ 60, 102, 60, 102, 126, 96, 60, 0, 102, 0, 60, 102, 126, 96, 60, 0, /* 1088 to 1103 */ 112, 0, 60, 102, 126, 96, 60, 0, 102, 0, 24, 24, 24, 24, 24, 0, /* 1104 to 1119 */ 60, 102, 24, 24, 24, 24, 24, 0, 112, 0, 24, 24, 24, 24, 24, 0, /* 1120 to 1135 */ 198, 56, 108, 198, 254, 198, 198, 0, 24, 24, 0, 60, 102, 126, 102, 0, /* 1136 to 1151 */ 14, 0, 124, 96, 120, 96, 124, 0, 0, 0, 126, 26, 126, 216, 126, 0, /* 1152 to 1167 */ 62, 120, 216, 222, 248, 216, 222, 0, 60, 102, 60, 102, 102, 102, 60, 0, /* 1168 to 1183 */ 102, 0, 60, 102, 102, 102, 60, 0, 112, 0, 60, 102, 102, 102, 60, 0, /* 1184 to 1199 */ 60, 102, 0, 102, 102, 102, 62, 0, 112, 0, 102, 102, 102, 102, 62, 0, /* 1200 to 1215 */ 102, 0, 102, 102, 102, 62, 6, 60, 102, 60, 102, 102, 102, 102, 60, 0, /* 1216 to 1231 */ 102, 0, 102, 102, 102, 102, 60, 0, 12, 12, 62, 96, 96, 62, 12, 12, /* 1232 to 1247 */ 56, 108, 96, 240, 96, 102, 252, 0, 102, 102, 60, 24, 126, 24, 126, 24, /* 1248 to 1263 */ 124, 102, 102, 124, 102, 111, 102, 99, 14, 27, 24, 60, 24, 24, 120, 48, /* 1264 to 1279 */ 14, 0, 60, 6, 62, 102, 62, 0, 14, 0, 24, 24, 24, 24, 24, 0, /* 1280 to 1295 */ 14, 0, 60, 102, 102, 102, 60, 0, 14, 0, 102, 102, 102, 102, 62, 0, /* 1296 to 1311 */ 118, 220, 0, 124, 102, 102, 102, 0, 126, 0, 102, 118, 126, 110, 102, 0, /* 1312 to 1327 */ 62, 102, 102, 62, 0, 126, 0, 0, 60, 102, 102, 60, 0, 126, 0, 0, /* 1328 to 1343 */ 24, 0, 24, 48, 96, 102, 60, 0, 0, 0, 0, 126, 96, 96, 0, 0, /* 1344 to 1359 */ 0, 0, 0, 126, 6, 6, 0, 0, 198, 204, 216, 62, 99, 198, 12, 31, /* 1360 to 1375 */ 198, 204, 216, 54, 110, 214, 31, 6, 24, 0, 24, 24, 24, 24, 24, 0, /* 1376 to 1391 */ 0, 54, 108, 216, 108, 54, 0, 0, 0, 216, 108, 54, 108, 216, 0, 0, /* 1392 to 1407 */ 34, 136, 34, 136, 34, 136, 34, 136, 85, 170, 85, 170, 85, 170, 85, 170, /* 1408 to 1423 */ 221, 119, 221, 119, 221, 119, 221, 119, 8, 8, 8, 8, 8, 8, 8, 8, /* 1424 to 1439 */ 8, 8, 8, 8, 248, 8, 8, 8, 8, 8, 8, 248, 248, 8, 8, 8, /* 1440 to 1455 */ 28, 28, 28, 28, 252, 28, 28, 28, 0, 0, 0, 0, 252, 28, 28, 28, /* 1456 to 1471 */ 0, 0, 0, 248, 248, 8, 8, 8, 28, 28, 28, 252, 252, 28, 28, 28, /* 1472 to 1487 */ 28, 28, 28, 28, 28, 28, 28, 28, 0, 0, 0, 252, 252, 28, 28, 28, /* 1488 to 1503 */ 28, 28, 28, 252, 252, 0, 0, 0, 28, 28, 28, 28, 252, 0, 0, 0, /* 1504 to 1519 */ 8, 8, 8, 248, 248, 0, 0, 0, 0, 0, 0, 0, 248, 8, 8, 8, /* 1520 to 1535 */ 8, 8, 8, 8, 15, 0, 0, 0, 8, 8, 8, 8, 255, 0, 0, 0, /* 1536 to 1551 */ 0, 0, 0, 0, 255, 8, 8, 8, 8, 8, 8, 8, 15, 8, 8, 8, /* 1552 to 1567 */ 0, 0, 0, 0, 255, 0, 0, 0, 8, 8, 8, 8, 255, 8, 8, 8, /* 1568 to 1583 */ 8, 8, 8, 15, 15, 8, 8, 8, 28, 28, 28, 28, 31, 28, 28, 28, /* 1584 to 1599 */ 28, 28, 28, 31, 31, 0, 0, 0, 0, 0, 0, 31, 31, 28, 28, 28, /* 1600 to 1615 */ 28, 28, 28, 255, 255, 0, 0, 0, 0, 0, 0, 255, 255, 28, 28, 28, /* 1616 to 1631 */ 28, 28, 28, 31, 31, 28, 28, 28, 0, 0, 0, 255, 255, 0, 0, 0, /* 1632 to 1647 */ 28, 28, 28, 255, 255, 28, 28, 28, 8, 8, 8, 255, 255, 0, 0, 0, /* 1648 to 1663 */ 28, 28, 28, 28, 255, 0, 0, 0, 0, 0, 0, 255, 255, 8, 8, 8, /* 1664 to 1679 */ 0, 0, 0, 0, 255, 28, 28, 28, 28, 28, 28, 28, 31, 0, 0, 0, /* 1680 to 1695 */ 8, 8, 8, 15, 15, 0, 0, 0, 0, 0, 0, 15, 15, 8, 8, 8, /* 1696 to 1711 */ 0, 0, 0, 0, 31, 28, 28, 28, 28, 28, 28, 28, 255, 28, 28, 28, /* 1712 to 1727 */ 8, 8, 8, 255, 255, 8, 8, 8, 8, 8, 8, 8, 248, 0, 0, 0, /* 1728 to 1743 */ 0, 0, 0, 0, 15, 8, 8, 8, 255, 255, 255, 255, 255, 255, 255, 255, /* 1744 to 1759 */ 0, 0, 0, 0, 255, 255, 255, 255, 240, 240, 240, 240, 240, 240, 240, 240, /* 1760 to 1775 */ 15, 15, 15, 15, 15, 15, 15, 15, 255, 255, 255, 255, 0, 0, 0, 0, /* 1776 to 1791 */ 0, 0, 118, 204, 204, 204, 118, 0, 60, 102, 102, 124, 102, 102, 124, 96, /* 1792 to 1807 */ 126, 102, 96, 96, 96, 96, 96, 0, 0, 0, 254, 108, 108, 108, 102, 0, /* 1808 to 1823 */ 126, 102, 48, 24, 48, 102, 126, 0, 0, 0, 62, 108, 108, 108, 56, 0, /* 1824 to 1839 */ 0, 0, 102, 102, 102, 102, 127, 192, 0, 0, 126, 216, 24, 24, 12, 0, /* 1840 to 1855 */ 124, 56, 124, 214, 214, 124, 56, 124, 124, 198, 198, 254, 198, 198, 124, 0, /* 1856 to 1871 */ 124, 198, 198, 198, 108, 108, 238, 0, 30, 48, 24, 60, 102, 102, 60, 0, /* 1872 to 1887 */ 0, 0, 126, 219, 219, 126, 0, 0, 3, 6, 62, 107, 115, 62, 96, 192, /* 1888 to 1903 */ 30, 48, 96, 126, 96, 48, 30, 0, 124, 198, 198, 198, 198, 198, 198, 0, /* 1904 to 1919 */ 0, 126, 0, 126, 0, 126, 0, 0, 24, 24, 126, 24, 24, 0, 126, 0, /* 1920 to 1935 */ 48, 24, 12, 24, 48, 0, 126, 0, 12, 24, 48, 24, 12, 0, 126, 0, /* 1936 to 1951 */ 14, 27, 27, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 216, 216, 112, /* 1952 to 1967 */ 24, 24, 0, 126, 0, 24, 24, 0, 0, 118, 220, 0, 118, 220, 0, 0, /* 1968 to 1983 */ 60, 102, 102, 60, 0, 0, 0, 0, 0, 0, 0, 24, 24, 0, 0, 0, /* 1984 to 1999 */ 0, 0, 0, 0, 24, 0, 0, 0, 30, 24, 24, 24, 24, 216, 120, 56, /* 2000 to 2015 */ 120, 108, 108, 108, 108, 0, 0, 0, 56, 12, 24, 48, 60, 0, 0, 0, /* 2016 to 2031 */ 0, 0, 60, 60, 60, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* 2032 to 2047 */ }; unsigned char *Font8x8 = __font8x8; #endif koules1.4/font.c100600 37512 310 60571 6477322207 12214 0ustar rootroot/*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-36-132613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * font.c font for the STARWARS SCROLLER * ***********************************************************/ /* this file was ripped from: */ /* Zgv v2.5 - GIF, JPEG and PBM/PGM/PPM viewer, for VGA PCs running Linux. * Copyright (C) 1993-1995 Russell Marks. See README for license details. * * font.c - provides a font of sorts for use via svgalib * modified for starwars scroler by Jan hubicka (hubicka@limaxp.aru.cas.cz) */ /* it's all hard-coded a bit ugly and prasarna!, so you probably won't want * much to look at it (hint) :) */ #include #include #include "font.h" #include "koules.h" /*following routines are ripped from vgagl library */ /* We use the 32-bit to 64-bit multiply and 64-bit to 32-bit divide of the */ /* 386 (which gcc doesn't know well enough) to efficiently perform integer */ /* scaling without having to worry about overflows. */ #ifdef FAST_WIDELINE #define swap(x, y) { int temp = x; x = y; y = temp; } #define setpixel (*(backscreen->ff.driver_setpixel_func)) #undef __clipx2 #define __clipx2 (MAPWIDTH-3) #undef __clipx1 #define __clipx1 0 #undef __clipy1 #define __clipy1 0 #undef __clipy2 #define __clipy2 (MAPHEIGHT+19) #if defined(__i386__)&&defined(ASSEMBLY) static INLINE int muldiv64 (int CONST m1, int CONST m2, int CONST d) { /* int32 * int32 -> int64 / int32 -> int32 */ int result; __asm__ ( "imull %%edx\n\t" "idivl %3\n\t" : "=a" (result) /* out */ : "a" (m1), "d" (m2), "g" (d) /* in */ : "ax", "dx" /* mod */ ); return result; } #define INC_IF_NEG(y) \ { \ __asm__("btl $31,%1\n\t" \ "adcl $0,%0" \ : "=r" ((int) result) \ : "rm" ((int) (y)), "0" ((int) result) \ ); \ } static INLINE int gl_regioncode (CONST int x, CONST int y) { int dx1, dx2, dy1, dy2; int result; result = 0; dy2 = __clipy2 - y; INC_IF_NEG (dy2); result <<= 1; dy1 = y - __clipy1; INC_IF_NEG (dy1); result <<= 1; dx2 = __clipx2 - x; INC_IF_NEG (dx2); result <<= 1; dx1 = x - __clipx1; INC_IF_NEG (dx1); return result; } #else static INLINE int gl_regioncode (CONST int x, CONST int y) { int result = 0; if (x < 0) result |= 1; else if (x > __clipx2) result |= 2; if (y < 0) result |= 4; else if (y > __clipy2) result |= 8; return result; } #endif /* Partly based on vgalib by Tommy Frandsen */ /* This would be a lot faster if setpixel was inlined */ static void gl_wide_line (int x1, int y1, int x2, int y2, int c) { int dx, dy, ax, ay, sx, sy, x, y; int syp; char *point; x1 = (MAPWIDTH / 2 + (x1) * 220 / (1000 - (y1)) / DIV); y1 = (int) (MAPHEIGHT / 3 + MAPWIDTH * 220 / (1000 - (y1))); x2 = (int) (MAPWIDTH / 2 + (x2) * 220 / (1000 - (y2)) / DIV); y2 = (int) (MAPHEIGHT / 3 + MAPWIDTH * 220 / (1000 - (y2))); /* Cohen & Sutherland algorithm */ for (;;) { int r1 = gl_regioncode (x1, y1); int r2 = gl_regioncode (x2, y2); if (!(r1 | r2)) break; /* completely inside */ if (r1 & r2) return; /* completely outside */ if (r1 == 0) { swap (x1, x2); /* make sure first */ swap (y1, y2); /* point is outside */ r1 = r2; } if (r1 & 1) { /* left */ #if defined(__i386__)&&defined(ASSEMBLY) y1 += muldiv64 (__clipx1 - x1, y2 - y1, x2 - x1); #else y1 += (long) (__clipx1 - x1) * (long) (y2 - y1) / (long) (x2 - x1); #endif x1 = __clipx1; } else if (r1 & 2) { /* right */ #if defined(__i386__)&&defined(ASSEMBLY) y1 += muldiv64 (__clipx2 - x1, y2 - y1, x2 - x1); #else y1 += (long) (__clipx2 - x1) * (long) (y2 - y1) / (long) (x2 - x1); #endif x1 = __clipx2; } else if (r1 & 4) { /* top */ #if defined(__i386__)&&defined(ASSEMBLY) x1 += muldiv64 (__clipy1 - y1, x2 - x1, y2 - y1); #else x1 += (long) (__clipy1 - y1) * (long) (x2 - x1) / (long) (y2 - y1); #endif y1 = __clipy1; } else if (r1 & 8) { /* bottom */ #if defined(__i386__)&&defined(ASSEMBLY) x1 += muldiv64 (__clipy2 - y1, x2 - x1, y2 - y1); #else x1 += (long) (__clipy2 - y1) * (long) (x2 - x1) / (long) (y2 - y1); #endif y1 = __clipy2; } } dx = x2 - x1; dy = y2 - y1; ax = abs (dx) << 1; ay = abs (dy) << 1; sx = (dx >= 0) ? 1 : -1; sy = (dy >= 0) ? 1 : -1; x = x1; y = y1; point = VScreenToBuffer (backscreen) + x + y * MAPWIDTH; if (ax > ay) { int d = ay - (ax >> 1); syp = sy * MAPWIDTH; if (DIV == 1) while (x != x2) { *point = c; if (y > 3 * MAPHEIGHT / 5) { *(point + 1) = c; if (y > 3 * MAPHEIGHT / 4) *(point + 2) = c; } if (d > 0 || (d == 0 && sx == 1)) { y += sy; point += syp; d -= ax; } x += sx; point += sx; d += ay; } else while (x != x2) { *point = c; if (y > 4 * MAPHEIGHT / 5) *(point + 1) = c; if (d > 0 || (d == 0 && sx == 1)) { y += sy; point += syp; d -= ax; } x += sx; point += sx; d += ay; } } else { int sy = (dy >= 0) ? 1 : -1; int d = ax - (ay >> 1); syp = sy * MAPWIDTH; if (DIV == 1) while (y != y2) { *(point) = c; if (y > 3 * MAPHEIGHT / 5) { *(point + 1) = c; if (y > 3 * MAPHEIGHT / 4) *(point + 2) = c; } if (d > 0 || (d == 0 && sy == 1)) { x += sx; point += sx; d -= ay; } y += sy; point += syp; d += ax; } else while (y != y2) { *(point) = c; if (y > 4 * MAPHEIGHT / 5) *(point + 1) = c; if (d > 0 || (d == 0 && sy == 1)) { x += sx; point += sx; d -= ay; } y += sy; point += syp; d += ax; } } if (DIV == 1) { *(point) = c; point++; if (y > 3 * MAPHEIGHT / 5) { *(point) = c, point++; if (y > 3 * MAPHEIGHT / 4) *(point) = c; } } else { *(point) = c; point++; if (y > 4 * MAPHEIGHT / 5) *(point) = c; } } #define gl_putpixel(x,y,c) FillRectangle(x,y,y>3 * MAPHEIGHT / 4 && DIV == 1?2:1,y>3 * MAPHEIGHT / 5 && DIV == 1?2:1,c) #define TABSIZE 64 /* size of a tab, in pixels */ #define vga_drawline(x1,y1,x2,y2)\ gl_wide_line(x1,y1,x2,y2,textcolor) #define vga_drawhline(x1,y1,x2,y2)\ gl_hline((int)(MAPWIDTH/2+(x1)*220/(1000-(y1))/DIV),(int)(MAPHEIGHT/3+MAPWIDTH*220/(1000-(y1))),\ (int)(MAPWIDTH/2+(x2)*220/(1000-(y2))/DIV),\ textcolor) #define vga_drawpixel(x1,y1)\ gl_putpixel((int)(MAPWIDTH/2+(x1)*220/(1000-(y1))/DIV),(int)(MAPHEIGHT/3+MAPWIDTH*220/(1000-(y1))),textcolor) #endif /*FAST_WIDELINE */ #ifdef XSUPPORT #undef Line1 #undef HLine #undef SSetPixel XSegment lines[1000]; int nlines; static void Line1 (int x1, int y1, int x2, int y2, int c) { #ifdef MITSHM if (shm) { gl_wide_line (x1, y1, x2, y2, cpixels (c)); return; } #endif x1 = (MAPWIDTH / 2 + (x1) * 220 / (1000 - (y1)) / DIV); y1 = (int) (MAPHEIGHT / 3 + MAPWIDTH * 220 / (1000 - (y1))); x2 = (int) (MAPWIDTH / 2 + (x2) * 220 / (1000 - (y2)) / DIV); y2 = (int) (MAPHEIGHT / 3 + MAPWIDTH * 220 / (1000 - (y2))); lines[nlines].x1 = x1; lines[nlines].y1 = y1; lines[nlines].x2 = x2; lines[nlines].y2 = y2; nlines++; } static void HLine (int x1, int y1, int x2, int c) { x1 = (MAPWIDTH / 2 + (x1) * 220 / (1000 - (y1)) / DIV); x2 = (MAPWIDTH / 2 + (x2) * 220 / (1000 - (y1)) / DIV); y1 = (MAPHEIGHT / 3 + MAPWIDTH * 220 / (1000 - (y1))); #ifdef MITSHM if (shm) { int i; if (x1 > x2) i = x1, x1 = x2, x2 = i; if (x1 > MAPWIDTH - 1) return; if (x2 > MAPWIDTH - 1) x2 = MAPWIDTH - 1; if (x1 < 0) x1 = 0; if (x2 < 0) return; if (y1 > MAPHEIGHT + 19) return; if (y1 < 0) return; HLine1 (x1, y1, x2, c); return; } #endif /*MITSHM */ lines[nlines].x1 = x1; lines[nlines].y1 = y1; lines[nlines].x2 = x2; lines[nlines].y2 = y1; nlines++; } static void SSetPixel (int x1, int y1, int c) { x1 = (MAPWIDTH / 2 + (x1) * 220 / (1000 - (y1)) / DIV); y1 = (int) (MAPHEIGHT / 3 + MAPWIDTH * 220 / (1000 - (y1))); #ifdef MITSHM if (shm) { if (x1 >= MAPWIDTH - 2) return; if (x1 < 0) return; if (y1 >= MAPHEIGHT + 18) return; if (y1 < 0) return; SSetPixel1 (x1, y1, c); if (y1 > 3 * MAPHEIGHT / 4 && DIV == 1) { SSetPixel1 (x1, y1 + 1, c); } if (y1 > 3 * MAPHEIGHT / 5 && DIV == 1) { SSetPixel1 (x1 + 1, y1, c); SSetPixel1 (x1 + 1, y1 + 1, c); } return; } #endif lines[nlines].x1 = x1; lines[nlines].y1 = y1; if (y1 > 3 * MAPHEIGHT / 5 && DIV == 1) x1++; if (y1 > 3 * MAPHEIGHT / 4 && DIV == 1) x1++; lines[nlines].x2 = x1 + 1; lines[nlines].y2 = y1 + 1; nlines++; } #define TABSIZE 64 /* size of a tab, in pixels */ #undef vga_drawline #undef vga_drawhline #undef vga_drawpixel #endif /*XSUPPORT */ #if defined(XSUPPORT)||!defined(FAST_WIDELINE) #define vga_drawline(x1,y1,x2,y2)\ Line1((int)x1,y1,x2,y2,textcolor); #define vga_drawhline(x1,y1,x2,y2)\ HLine(x1,y1,x2,textcolor) #define vga_drawpixel(x1,y1)\ SSetPixel(x1,y1,textcolor) #endif static int go_through_the_motions = 0; /* if 1, we don't draw it, just do the width */ static int stop_after_this_x = NO_CLIP_FONT; /* never mind. Character building, wasn't it? (groan) */ #if 0 #define BEST extern inline #else #define BEST static #endif BEST void fontc_ul (x, y, r) CONST int x, y, r; { int r34; if (go_through_the_motions) return; r34 = ((r * 3) >> 2); vga_drawline (x - r, y, x - r34, y - r34); vga_drawline (x - r34, y - r34, x, y - r); } BEST void fontc_ur (x, y, r) CONST int x, y, r; { int r34; if (go_through_the_motions) return; r34 = ((r * 3) >> 2); vga_drawline (x + r, y, x + r34, y - r34); vga_drawline (x + r34, y - r34, x, y - r); } BEST void fontc_ll (x, y, r) CONST int x, y, r; { int r34; if (go_through_the_motions) return; r34 = ((r * 3) >> 2); vga_drawline (x - r, y, x - r34, y + r34); vga_drawline (x - r34, y + r34, x, y + r); } BEST void fontc_lr (x, y, r) CONST int x, y, r; { int r34; if (go_through_the_motions) return; r34 = ((r * 3) >> 2); vga_drawline (x + r, y, x + r34, y + r34); vga_drawline (x + r34, y + r34, x, y + r); } static void fontc_l (x, y, r) CONST int x, y, r; { fontc_ll (x, y, r); fontc_lr (x, y, r); } static void fontc_u (x, y, r) CONST int x, y, r; { fontc_ul (x, y, r); fontc_ur (x, y, r); } static void fontc_r (x, y, r) CONST int x, y, r; { fontc_ur (x, y, r); fontc_lr (x, y, r); } static void fontc_left (x, y, r) CONST int x, y, r; { fontc_ul (x, y, r); fontc_ll (x, y, r); } static void fontcircle (x, y, r) CONST int x, y, r; { fontc_u (x, y, r); fontc_l (x, y, r); } static INLINE char * myindex (char *s, CONST int c) { for (; *s != 0; s++) if (*s == c) return (s); return (NULL); } int vgadrawtext (x, y, siz, str) CONST int x, y, siz; CONST char *str; { int f, a, b, c, s1, s2, s3, s4, s5, s6, gap; b = y; a = x; s1 = siz; s2 = s1 << 1; s3 = s1 + s2; s4 = s2 << 1; s5 = s4 + s1; s6 = s3 << 1; gap = s1; #ifdef SVGALIBSUPPORT gl_setclippingwindow (0, 0, MAPWIDTH - 1, MAPHEIGHT + 19); #endif if (gap == 0) gap = 1; #ifdef XSUPPORT { int pos; #ifdef MITSHM if (!shm) #endif { pos = (int) (MAPHEIGHT / 3 + MAPWIDTH * 220 / (1000 - (y))); if (pos > 3 * MAPHEIGHT / 4) SetWidth (3); else if (pos > 3 * MAPHEIGHT / 5) SetWidth (2); else SetWidth (1); SetColor (textcolor); } nlines = 0; } #endif for (f = 0; f < strlen (str); f++) { /* s3+s4 is the size that an ellipsis will take up (s3), plus the * widest possible letter (M = s4). */ if (a - x > stop_after_this_x - s3 - s4) { int tmp; /* print an ellipsis... well, three dots :) */ /* blast the width restriction to stop possible infinite recursion */ tmp = stop_after_this_x; set_max_text_width (NO_CLIP_FONT); vgadrawtext (a, y, siz, "..."); stop_after_this_x = tmp; /* now give up */ break; } c = str[f]; /*** 1st step: cover some common occurances ***/ if (!go_through_the_motions) { /* only draw it if we really want to */ if (myindex ("abdgopq68", c) != NULL) /* common circle position */ fontcircle (a + s1, b + s3, siz); else { /* common part-circle positions */ if (myindex ("cehmnrs", c) != NULL) fontc_ul (a + s1, b + s3, siz); if (myindex ("ehmnrBS35", c) != NULL) fontc_ur (a + s1, b + s3, siz); if (myindex ("cetuyCGJOQSUl035", c) != NULL) fontc_ll (a + s1, b + s3, siz); if (myindex ("suyBCDGJOQSU035", c) != NULL) fontc_lr (a + s1, b + s3, siz); /* common line */ if (myindex ("BDEFHKLMNPR", c) != NULL) vga_drawline (a, b, a, b + s4); } } /*** 2nd step: fill in rest - this is the *really* long, messy bit :) ***/ /*** 2a: lowercase letters ***/ if (!go_through_the_motions) switch (c) { case 'a': vga_drawline (a + s2, b + s2, a + s2, b + s4); break; case 'b': vga_drawline (a, b, a, b + s4); break; case 'c': vga_drawhline (a + s1, b + s2, a + s2, b + s2); vga_drawhline (a + s1, b + s4, a + s2, b + s4); break; case 'd': vga_drawline (a + s2, b, a + s2, b + s4); break; case 'e': vga_drawline (a, b + s3, a + s2, b + s3); vga_drawhline (a + s1, b + s4, a + s2, b + s4); break; case 'f': fontc_ul (a + s1, b + s1, siz); vga_drawline (a, b + s1, a, b + s4); vga_drawhline (a, b + s2, a + s1, b + s2); break; case 'g': vga_drawline (a + s2, b + s2, a + s2, b + s5); fontc_l (a + s1, b + s5, siz); break; case 'h': vga_drawline (a, b, a, b + s4); vga_drawline (a + s2, b + s3, a + s2, b + s4); break; case 'i': vga_drawpixel (a, b + s1); vga_drawline (a, b + s2, a, b + s4); a += -s1 + 1; break; case 'j': vga_drawline (a + s1, b + s2, a + s1, b + s5); fontc_lr (a, b + s5, siz); vga_drawpixel (a + s1, b + s1); break; case 'k': vga_drawline (a, b, a, b + s4); vga_drawline (a, b + s3, a + s1, b + s2); vga_drawline (a, b + s3, a + s1, b + s4); break; case 'l': vga_drawline (a, b, a, b + s3); break; case 'm': vga_drawline (a, b + s2, a, b + s4); vga_drawline (a + s2, b + s3, a + s2, b + s4); vga_drawline (a + s4, b + s3, a + s4, b + s4); fontc_u (a + s3, b + s3, siz); break; case 'n': vga_drawline (a, b + s2, a, b + s4); vga_drawline (a + s2, b + s3, a + s2, b + s4); break; case 'p': vga_drawline (a, b + s2, a, b + s6); break; case 'q': vga_drawline (a + s2, b + s2, a + s2, b + s6); break; case 'r': vga_drawline (a, b + s2, a, b + s4); break; case 's': vga_drawhline (a, b + s3, a + s2, b + s3); vga_drawhline (a + s1, b + s2, a + s2, b + s2); vga_drawhline (a, b + s4, a + s1, b + s4); break; case 't': vga_drawline (a, b + s1, a, b + s3); vga_drawhline (a, b + s2, a + s1, b + s2); break; case 'u': vga_drawline (a, b + s2, a, b + s3); vga_drawline (a + s2, b + s2, a + s2, b + s4); break; case 'v': vga_drawline (a, b + s2, a + s1, b + s4); vga_drawline (a + s1, b + s4, a + s2, b + s2); break; case 'w': vga_drawline (a, b + s2, a + s1, b + s4); vga_drawline (a + s1, b + s4, a + s2, b + s3); vga_drawline (a + s2, b + s3, a + s3, b + s4); vga_drawline (a + s3, b + s4, a + s4, b + s2); break; case 'x': vga_drawline (a, b + s2, a + s2, b + s4); vga_drawline (a, b + s4, a + s2, b + s2); break; case 'y': vga_drawline (a, b + s2, a, b + s3); vga_drawline (a + s2, b + s2, a + s2, b + s5); fontc_l (a + s1, b + s5, siz); break; case 'z': vga_drawhline (a, b + s2, a + s2, b + s2); vga_drawline (a + s2, b + s2, a, b + s4); vga_drawhline (a, b + s4, a + s2, b + s4); break; /*** 2b: uppercase letters ***/ case 'A': vga_drawline (a, b + s4, a + s1, b); vga_drawline (a + s1, b, a + s2, b + s4); vga_drawline (a + (s1 >> 1), b + s2, a + s2 - (s1 >> 1), b + s2); break; case 'B': fontc_r (a + s1, b + s1, siz); vga_drawhline (a, b, a + s1, b); vga_drawhline (a, b + s2, a + s1, b + s2); vga_drawhline (a, b + s4, a + s1, b + s4); break; case 'C': fontc_u (a + s1, b + s1, siz); vga_drawline (a, b + s1, a, b + s3); break; case 'D': vga_drawhline (a, b, a + s1, b); vga_drawhline (a, b + s4, a + s1, b + s4); fontc_ur (a + s1, b + s1, siz); vga_drawline (a + s2, b + s1, a + s2, b + s3); break; case 'E': vga_drawhline (a, b, a + s2, b); vga_drawhline (a, b + s2, a + s1, b + s2); vga_drawhline (a, b + s4, a + s2, b + s4); break; case 'F': vga_drawhline (a, b, a + s2, b); vga_drawhline (a, b + s2, a + s1, b + s2); break; case 'G': fontc_u (a + s1, b + s1, siz); vga_drawline (a, b + s1, a, b + s3); vga_drawhline (a + s1, b + s2, a + s2, b + s2); vga_drawline (a + s2, b + s2, a + s2, b + s3); break; case 'H': vga_drawhline (a, b + s2, a + s2, b + s2); vga_drawline (a + s2, b, a + s2, b + s4); break; case 'I': vga_drawhline (a, b, a + s2, b); vga_drawline (a + s1, b, a + s1, b + s4); vga_drawhline (a, b + s4, a + s2, b + s4); break; case 'J': vga_drawline (a + s2, b, a + s2, b + s3); break; case 'K': vga_drawline (a + s2, b, a, b + s2); vga_drawline (a, b + s2, a + s2, b + s4); break; case 'L': vga_drawhline (a, b + s4, a + s2, b + s4); break; case 'M': vga_drawline (a, b, a + s1 + (s1 >> 1), b + s2); vga_drawline (a + s1 + (s1 >> 1), b + s2, a + s3, b); vga_drawline (a + s3, b, a + s3, b + s4); a -= s1; break; case 'N': vga_drawline (a, b, a + s2, b + s4); vga_drawline (a + s2, b + s4, a + s2, b); break; case 'Q': vga_drawline (a + s1, b + s3, a + s2, b + s4); /* FALLS THROUGH and adds an O, finishing the Q */ case 'O': case '0': /* all other numbers done later */ fontc_u (a + s1, b + s1, siz); vga_drawline (a, b + s1, a, b + s3); vga_drawline (a + s2, b + s1, a + s2, b + s3); break; case 'R': vga_drawline (a + s1, b + s2, a + s2, b + s4); /* FALLS THROUGH and adds a P, finishing the R */ case 'P': fontc_r (a + s1, b + s1, siz); vga_drawhline (a, b, a + s1, b); vga_drawhline (a, b + s2, a + s1, b + s2); break; case 'S': fontc_left (a + s1, b + s1, siz); fontc_ur (a + s1, b + s1, siz); break; case 'T': vga_drawhline (a, b, a + s2, b); vga_drawline (a + s1, b, a + s1, b + s4); break; case 'U': vga_drawline (a, b, a, b + s3); vga_drawline (a + s2, b, a + s2, b + s3); break; case 'V': vga_drawline (a, b, a + s1, b + s4); vga_drawline (a + s1, b + s4, a + s2, b); break; case 'W': vga_drawline (a, b, a + s1, b + s4); vga_drawline (a + s1, b + s4, a + s2, b + s2); vga_drawline (a + s2, b + s2, a + s3, b + s4); vga_drawline (a + s3, b + s4, a + s4, b); break; case 'X': vga_drawline (a, b, a + s2, b + s4); vga_drawline (a + s2, b, a, b + s4); break; case 'Y': vga_drawline (a, b, a + s1, b + s2); vga_drawline (a + s2, b, a + s1, b + s2); vga_drawline (a + s1, b + s2, a + s1, b + s4); break; case 'Z': vga_drawhline (a, b, a + s2, b); vga_drawline (a + s2, b, a, b + s4); vga_drawhline (a, b + s4, a + s2, b + s4); break; /*** 2c: numbers ***/ /* 0 already done */ case '1': vga_drawline (a, b + s1, a + s1, b); vga_drawline (a + s1, b, a + s1, b + s4); vga_drawhline (a, b + s4, a + s2, b + s4); break; case '2': fontc_u (a + s1, b + s1, siz); vga_drawline (a + s2, b + s1, a, b + s4); vga_drawline (a, b + s4, a + s2, b + s4); break; case '3': fontc_u (a + s1, b + s1, siz); fontc_lr (a + s1, b + s1, siz); break; case '4': vga_drawline (a + s1, b + s4, a + s1, b); vga_drawline (a + s1, b, a, b + s2); vga_drawhline (a, b + s2, a + s2, b + s2); break; case '5': vga_drawline (a + s2, b, a, b); vga_drawline (a, b, a, b + s2); vga_drawline (a, b + s2, a + s1, b + s2); break; case '6': fontc_u (a + s1, b + s1, siz); vga_drawline (a, b + s1, a, b + s3); break; case '7': vga_drawline (a, b, a + s2, b); vga_drawline (a + s2, b, a + s1, b + s4); break; case '9': vga_drawline (a + s2, b, a + s2, b + s4); /* FALLS THROUGH and does top circle of 8 to complete the 9 */ case '8': fontcircle (a + s1, b + s1, siz); break; /* 2d: some punctuation (not much!) */ case '-': vga_drawhline (a, b + s2, a + s1, b + s2); break; case '+': vga_drawhline (a, b + s2, a + s1, b + s2); vga_drawline (a + s2, b, a + s2, b + s4); break; case '.': vga_drawpixel (a, b + s4); a += -s1 + 1; break; case ',': vga_drawline (a - 1, b + s4 + s1, a, b + s4); break; case '\'': vga_drawline (a, b, a - 1, b + s1); break; case '(': fontc_ul (a + s1, b + s1, siz); fontc_ll (a + s1, b + s3, siz); vga_drawline (a, b + s1, a, b + s3); break; case ')': fontc_ur (a, b + s1, siz); fontc_lr (a, b + s3, siz); vga_drawline (a + s1, b + s1, a + s1, b + s3); break; case '%': vga_drawpixel (a, b); vga_drawpixel (a + s2, b + s4); /* FALLS THROUGH drawing the slash to finish the % */ case '/': vga_drawline (a, b + s4, a + s2, b); break; case '?': fontc_u (a + s1, b + s1, siz); vga_drawline (a + s2, b + s1, a + s1, b + s2); vga_drawline (a + s1, b + s2, a + s1, b + s3); vga_drawpixel (a + s1, b + s4); break; } /*** 3rd part: finally, move along for the next letter ***/ /*** we do this even if go_through_the_motions is set */ if (myindex ("ltfijk-. (),'", c) != NULL) a += s1; else { if (myindex ("?/%abcdeghnopqrsuvxyzABCDEFGHIJKLNOPQRSTUVXYZ0123456789", c) != NULL) a += s2; else { if (myindex ("mwMW", c) != NULL) a += s4; else { if (c == 9) { /* congratulations madam, it's a tab */ a = ((a / TABSIZE) + 1) * TABSIZE; } else { /* oh, don't know this one. do an underscore */ /* (we don't if go_through_the_motions is set) */ if (!go_through_the_motions) vga_drawhline (a, b + s4, a + s2, b + s4); a += s2; } } } } a += gap; /* and add a gap */ } #ifdef XSUPPORT #ifdef MITSHM if (!shm) #endif XDrawSegments (dp, current.pixmap, gc, lines, nlines), SetWidth (1); #endif return (a - x); } /* here's a new one - this gets how wide text will be */ int vgatextsize (sizearg, str) CONST int sizearg; CONST char *str; { int r; go_through_the_motions = 1; r = vgadrawtext (0, 0, sizearg, str); go_through_the_motions = 0; return (r - sizearg); } void set_max_text_width (width) CONST int width; { stop_after_this_x = width; } koules1.4/gameplan.c100644 37512 310 33307 6477322207 13037 0ustar rootroot/*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * gameplan.c scores,levels...... * ***********************************************************/ /* Changes for OS/2 Warp with Dive. * * Copyright(c)1996 by Thomas A. K. Kjaer * ***********************************************************/ #include "koules.h" #include "server.h" #define HOLELEVEL 5 #define BBALLLEVEL (nrockets==1?12:10) #define EHOLELEVEL 20 #define SPRINGLEVEL 30 #define THIEFLEVEL 40 #define FINDERLEVEL 50 #define TTOOLLEVEL 60 #define INSPECTORLEVEL 70 #define BBBALLLEVEL 90 #define LUNATICLEVEL 80 static int level = 0; static int gtime; static int nos; static int ktime = 0; static int kmode = 0; static int secondpart; void gameplan_init () { #ifdef DEBUG level = 98; #else level = lastlevel; #endif } void effect (int so) { char s[20]; if (gamemode == GAME) { if (!so) Effect (S_START, 0); else Effect (S_END, 0); } if (gameplan == COOPERATIVE) { #ifdef SOUND #endif gamemode = MENU; #ifndef DEBUG if (!so && level == 0) #endif intro_intro (); #ifndef DEBUG if (!so && level == HOLELEVEL + 1) #endif hole_intro (); #ifndef DEBUG if (!so && level == INSPECTORLEVEL) #endif inspector_intro (); #ifndef DEBUG if (!so && level == BBALLLEVEL + 1) #endif bball_intro (); #ifndef DEBUG if (!so && level == BBBALLLEVEL) #endif bbball_intro (); #ifndef DEBUG if (!so && level == EHOLELEVEL) #endif maghole_intro (); #ifndef DEBUG if (!so && level == SPRINGLEVEL + 1) #endif spring_intro (); #ifndef DEBUG if (!so && level == THIEFLEVEL) #endif thief_intro (); #ifndef DEBUG if (!so && level == FINDERLEVEL) #endif finder_intro (); #ifndef DEBUG if (!so && level == TTOOLLEVEL) #endif ttool_intro (); #ifndef DEBUG if (!so && level == LUNATICLEVEL) #endif lunatic_intro (); if (!so && level == 99) outro1 (); } gamemode = GAME; SetScreen (backscreen); ClearScreen (); tbreak = 1; if (gameplan == COOPERATIVE) sprintf (s, "SECTOR %i", level + 1); else sprintf (s, "GET READY"); #ifdef XSUPPORT DrawWhiteMaskedText (MAPWIDTH / 2 - 32, MAPHEIGHT / 2 - 4, s); #else DrawText (MAPWIDTH / 2 - 32, MAPHEIGHT / 2 - 4, s); #endif CopyToScreen (backscreen); fadein (); #ifdef XSUPPORT XFlush (dp); #endif #ifdef OS2DIVE forceBlitting (); #endif fflush (stdout); usleep (1000000); } /* * level creation routines */ static void init_objects1 () { int i, nholes; dosprings = 0; lastlevel = level; if (maxlevel < level) maxlevel = level; save_rc (); if (gamemode != GAME) { nobjects = 0; return; } switch (gameplan) { case DEATHMATCH: dosprings = 1; /* enable spring in death match */ randsprings = 40; if (nrockets != 1) { nobjects = nrockets * 3 * GAMEWIDTH / 640 * GAMEHEIGHT / 460 + 3; for (i = 0; i < nobjects; i++) object[i].live = 0; for (i = 0; i < nobjects; i++) { object[i].live = 1; object[i].lineto = -1; object[i].live1 = 1; object[i].thief = 0; object[i].time = (i < nrockets ? 99 : 0); object[i].fx = 0; object[i].fy = 0; object[i].rotation = 0; object[i].type = (i < nrockets ? ROCKET : BALL); if (!find_possition (&object[i].x, &object[i].y, radius (object[i].type))) return; object[i].M = M (object[i].type); object[i].radius = radius (object[i].type); object[i].accel = ROCKET_SPEED; object[i].letter = ' '; secondpart = 0; } nholes = nrockets / 3 + 1; for (i = 0; i < nholes; i++) creator (HOLE); creator (INSPECTOR); creator (EHOLE); } else { nobjects = 2; for (i = 0; i < nobjects; i++) object[i].live = 0; for (i = 0; i < nobjects; i++) { object[i].live = 1; object[i].lineto = -1; if (i != 0) object[i].lineto = 0; object[i].live1 = 1; object[i].thief = 0; object[i].time = (i < nrockets ? 99 : 0); object[i].fx = 0; object[i].fy = 0; object[i].rotation = 0; object[i].type = (i < nrockets ? ROCKET : LUNATIC); if (!find_possition (&object[i].x, &object[i].y, radius (object[i].type))) return; object[i].M = M (object[i].type); object[i].radius = radius (object[i].type); object[i].accel = ROCKET_SPEED; object[i].letter = ' '; secondpart = 0; } } break; case COOPERATIVE: if (level != 99) { int nbballs; if (level > SPRINGLEVEL) dosprings = 1; randsprings = 40 - level / 3; nobjects = 3 + sqrt (level) * ((nrockets + 1) / 2) + 2 * nrockets; nobjects = (float) nobjects *(GAMEWIDTH / 640 * GAMEHEIGHT / 460 + 2) / 3; if (nobjects > 30) nobjects = 30; for (i = 0; i < nobjects; i++) object[i].live = 0; nbballs = nrockets + level / BBBALLLEVEL; gtime = 100 + 1000 / (level + 1); for (i = 0; i < nobjects; i++) { object[i].live = (i < nrockets ? 5 : 1); object[i].live1 = (i < nrockets ? 5 : 1); object[i].lineto = -1; object[i].thief = 0; object[i].time = (i < nrockets ? 100 : 0); object[i].fx = 0; object[i].fy = 0; object[i].rotation = 0; object[i].type = (i < nrockets ? ROCKET : (i < nbballs ? BBALL : BALL)); object[i].M = M (object[i].type); if (i < nrockets) { if (level < 5) object[i].M *= 1.0 + (5.0 - level) / 15.0; if (level < 25) object[i].M *= 1.0 + (level) / 120.0; } object[i].radius = radius (object[i].type); object[i].accel = ROCKET_SPEED; if (!find_possition (&object[i].x, &object[i].y, radius (object[i].type))) return; object[i].letter = ' '; } } else { nobjects = nrockets + 10; for (i = 0; i < nobjects; i++) object[i].live = 0; object[nrockets].type = APPLE; object[nrockets].M = APPLEM; object[nrockets].lineto = -1; object[nrockets].thief = 0; object[nrockets].radius = APPLE_RADIUS; object[nrockets].live = (i < nrockets ? 5 : 1); object[nrockets].fx = 0; object[nrockets].fy = 0; object[nrockets].x = GAMEWIDTH / 2; object[nrockets].y = GAMEHEIGHT / 2; for (i = 0; i < nrockets; i++) { object[i].live = 5; object[i].live1 = 5; object[i].time = 100; object[i].thief = 0; object[i].lineto = -1; object[i].fx = 0; object[i].fy = 0; object[i].rotation = 0; object[i].type = ROCKET; object[i].accel = ROCKET_SPEED; object[i].M = M (object[i].type); object[i].radius = radius (object[i].type); object[i].letter = ' '; object[i].x = GAMEWIDTH / 2 + sin (i * RAD (360) / nrockets) * GAMEHEIGHT / 3; object[i].x = GAMEHEIGHT / 2 + cos (i * RAD (360) / nrockets) * GAMEHEIGHT / 3; } for (i = nrockets + 1; i < nobjects; i++) { object[i].live = 1; object[i].live1 = 1; object[i].lineto = -1; object[i].time = 0; object[i].thief = 0; object[i].fx = 0; object[i].fy = 0; object[i].rotation = 0; object[i].type = BALL; object[i].accel = BALL_SPEED; object[i].M = M (object[i].type); object[i].radius = radius (object[i].type); object[i].letter = ' '; if (!find_possition (&object[i].x, &object[i].y, radius (object[i].type))) return; } } } ktime = 0; } void init_objects () { switch (difficulty) { case 0: ROCKET_SPEED = 0.8; BALL_SPEED = 1.2; BBALL_SPEED = 1.2; SLOWDOWN = 0.9; GUMM = 20; BALLM = 3; LBALLM = 3; BBALLM = 8; APPLEM = 40; ROCKETM = 2; break; case 1: ROCKET_SPEED = 1.0; BALL_SPEED = 1.2; BBALL_SPEED = 1.2; SLOWDOWN = 0.9; GUMM = 20; BALLM = 3; LBALLM = 3; BBALLM = 8; APPLEM = 40; ROCKETM = 4; break; case 2: ROCKET_SPEED = 1.2; BALL_SPEED = 1.2; BBALL_SPEED = 1.2; SLOWDOWN = 0.8; GUMM = 20; APPLEM = 34; BALLM = 3; LBALLM = 3; BBALLM = 8; ROCKETM = 4; break; case 3: ROCKET_SPEED = 2.0; BALL_SPEED = 1.2; BBALL_SPEED = 1.2; SLOWDOWN = 0.8; GUMM = 20; BALLM = 3; LBALLM = 3; APPLEM = 24; BBALLM = 8; ROCKETM = 5; break; case 4: ROCKET_SPEED = 2.0; BALL_SPEED = 1.2; BBALL_SPEED = 1.2; SLOWDOWN = 0.8; GUMM = 15; BALLM = 3; LBALLM = 3; APPLEM = 24; BBALLM = 8; ROCKETM = 7; } #ifdef NETSUPPORT if (!server) #endif clearpoints (); #ifdef NETSUPPORT if (!client) #endif init_objects1 (); if (!server) effect (nos); #ifdef NETSUPPORT else { if (server) SEffect (lastlevel, nos); } #endif } int allow_finder () { if (level > FINDERLEVEL || gameplan == DEATHMATCH) return 1; return 0; } int create_letter () { int tirage, chance, letter; int i; if (gameplan == COOPERATIVE) { i = rand () % 4; if (i < 3) return (i); if (level > THIEFLEVEL && rand () % 400 < level - THIEFLEVEL + 40) return (3); if (level > TTOOLLEVEL && rand () % 600 < level - TTOOLLEVEL + 40) return (5); if (level > FINDERLEVEL && gtime < 0 && rand () % 700 < level - FINDERLEVEL + 40) return (4); return (0); } chance = rand () % 100; if (chance < 80) { /* create letter : = 1 rand / 2 */ tirage = rand () % 100; if (tirage < 30) letter = 1; else if (tirage < 60) letter = 2; else if (tirage < 70) letter = 5; else if (tirage < 80) letter = 3; else letter = 4; return (letter); } else return (0); } void update_game () { int i; if (gamemode == GAME) { if (ktime) { ktime--; if (ktime == 0) switch (kmode) { case 1: init_objects (); break; case 2: lastlevel = 0; level = 1, gamemode = MENU; #ifdef NETSUPPORT if (server) Outro (); else #endif outro2 (); break; case 3: if (a_balls || a_bballs || a_inspectors || a_lunatics) break; for (i = 0; i < nrockets; i++) if (object[i].type == ROCKET && object[i].live) object[i].score += object[i].live * 20; level++, init_objects (); break; case 4: for (i = 0; i < nrockets; i++) if (object[i].type == ROCKET) object[i].score -= 100; nos = 1; init_objects (); nos = 0; break; } } else switch (gameplan) { case DEATHMATCH: if (nrockets == 1) { if (!(rand () % 60)) creator (HOLE); if (a_rockets == 0) { ktime = 50; kmode = 1; object[0].score -= 100; } if (a_lunatics == 0) { ktime = 50; kmode = 1; object[0].score += 100; } break; } if (a_balls == 0) secondpart = 1; if (a_lunatics < nrockets && !(rand () % 150)) creator (LUNATIC); if (secondpart) { if (!(rand () % 100)) creator (BBALL); if (!(rand () % 60)) creator (HOLE); if (!(rand () % 400)) creator (BBALL); if (!(rand () % 400)) creator (INSPECTOR); if (!(rand () % 600)) creator (EHOLE); } if (a_rockets <= 1) { ktime = 50; kmode = 1; } break; case COOPERATIVE: if (level == 99) { if (!a_apples) ktime = 50, kmode = 2; if (a_balls < 15) if (!(rand () % 40)) creator (BALL); /*if (a_lunatics < 3) if (!(rand () % 90)) creator (LUNATIC); */ if (a_bballs < 3) if (!(rand () % 3000)) creator (BBALL); } else { gtime--; if (a_balls == 0 && a_bballs == 0 && a_inspectors == 0 && a_lunatics == 0) { ktime = 50, kmode = 3; } if (a_balls < 4 * level && gtime < 0) if (!(rand () % ((nrockets == 1 ? 200 : 150) + (110 - level)))) creator (BALL); if (a_lunatics < (level - LUNATICLEVEL) && a_lunatics < 3 && gtime < 0) if (!(rand () % ((nrockets == 1 ? 800 : 450) + (110 - level)))) creator (LUNATIC); if (a_holes < 4 * (level - HOLELEVEL) && gtime < 0) if (!(rand () % (412 + 512 / level))) creator (HOLE); if (a_bballs < 4 * (level - BBALLLEVEL) && gtime < 0) if (!(rand () % ((nrockets == 1 ? 700 : 500) + 1 * (110 - level) / 3 + 2024 / level))) creator (BBALL); if (a_inspectors < level / (INSPECTORLEVEL) && gtime < 0) if (!(rand () % (1500 + 10 * (110 - level)))) creator (INSPECTOR); if (a_eholes < level / EHOLELEVEL + 1 && gtime < 0 && level >= EHOLELEVEL) if (!(rand () % (500 + 1000 / level))) creator (EHOLE); } if (a_rockets == 0) { ktime = 50; kmode = 4; } } } else { if (a_balls < 5 && !(rand () % (50))) creator (BALL); if (a_lunatics < 5 && !(rand () % (50))) creator (LUNATIC); if (a_bballs < 4 && !(rand () % (200))) creator (BBALL); } } koules1.4/rsound.c100644 37512 310 4276 6477322207 12550 0ustar rootroot/* NCD Audio format - original code by Dave Lemke */ /* Modified by paul kendall for X Galaga. */ /* * Include file dependencies: */ #ifdef RSOUND #include #include #include #include #include #include #include #include #include "rplay.h" #include #include "koules.h" char *unixSoundPath = SOUNDDIR; #define playSounds 1 /* * Internal variable declarations: */ static char *FILENAME[] = { "/start.au", "/end.au", "/colize.au", "/destroy1.au", "/destroy2.au", "/creator1.au", "/creator2.au" }; #define NUM_SOUNDS (sizeof(FILENAME)/sizeof(char*)) #define MAX_SOUNDS 8 static int fd; static int audio_on = False; void init_sound () { char *displayname = DisplayString (dp); char host[256], *p, s[256]; int i; if (audio_on) return; strcpy (host, displayname); if ((p = strrchr (host, (int) ':')) != NULL) *p = 0; if (!*host) strcat (host, "localhost"); printf ("Directing sound to: %s\n", host); if ((fd = rplay_open (host)) < 0) { rplay_perror (host); return; } audio_on = True; for (i = 0; i < NUM_SOUNDS; i++) { s[0] = 0; strcat (s, SOUNDDIR); if (s[(int) strlen (s) - 1] == '/') FILENAME[i]++; strcat (s, FILENAME[i]); FILENAME[i] = malloc ((int) strlen (s) + 1); strcpy (FILENAME[i], s); } return; } static void *p[7]; void playSoundFile (char *filename, int volume, void **private) { RPLAY **p = (RPLAY **) private; if (!*p) { printf ("loading sound %s\n", filename); *p = rplay_create (RPLAY_PLAY); rplay_set (*p, RPLAY_INSERT, 0, RPLAY_SOUND, strdup (filename), NULL); } rplay_set (*p, RPLAY_CHANGE, 0, RPLAY_VOLUME, volume, NULL); rplay (fd, *p); } int play_sound (k) int k; { char c; c = k; if (audio_on) { playSoundFile (FILENAME[k], 50, &p[k]); } return (0); } void maybe_play_sound (k) int k; { } void sound_completed (k) int k; { } void kill_sound () { } #endif koules1.4/sound.c100600 37512 310 4422 6477322207 12347 0ustar rootroot/* * sound.c - Platform Independant Sound Support - Apr. 1995 * * Copyright 1994-1995 Sujal M. Patel (smpatel@wam.umd.edu) * Conditions in "copyright.h" * * Modified for koules and bugfixed by Jan Hubicka */ #ifdef SOUND #include #ifdef __STDC__ #include #endif #include #include #include #include #include char *unixSoundPath = SOUNDDIR; char *unixSoundDev = SOUNDDEV; #define playSounds 1 static int soundfd; static char audioOK = 1; static char sound_flags[20]; /* Sound Flag for sound 1-19 */ int child; void test_sound () { if (audioOK) if (kill (child, 0)) { audioOK = 0; close (soundfd); }; } void init_sound () { int i, fd[2]; char *argv[4]; char filename[512]; signal (SIGCHLD, SIG_IGN); signal (SIGPIPE, SIG_IGN); if (unixSoundPath[0] == '?') { audioOK = 0; return; }; /* Create a pipe, set the write end to close when we exec the sound server, and set both (is the write end necessary?) ends to non-blocking */ pipe (fd); soundfd = fd[1]; if (!(child = fork ())) { close (fd[1]); dup2 (fd[0], STDIN_FILENO); close (fd[0]); sprintf (filename, SOUNDSERVER); argv[0] = filename; argv[1] = unixSoundPath; argv[2] = unixSoundDev; argv[3] = NULL; execvp (filename, argv); fprintf (stderr, "Couldn't Execute Sound Server %s!\n", filename); exit (0); }; close (fd[0]); for (i = 0; i < 19; i++) sound_flags[i] = 0; } int play_sound (k) int k; { char c; test_sound (); c = k; if ((playSounds) && (audioOK)) write (soundfd, &c, sizeof (c)); return 0; } void maybe_play_sound (k) int k; { char c; if (sound_flags[k] & 1) return; sound_flags[k] |= 1; test_sound (); c = (unsigned char) (k); if ((playSounds) && (audioOK)) write (soundfd, &c, sizeof (c)); } void sound_completed (k) int k; { sound_flags[k] &= ~1; } void kill_sound () { signed char c; c = -1; test_sound (); if ((playSounds) && (audioOK)) write (soundfd, &c, sizeof (c)); } #endif koules1.4/koules100755 37512 310 10246 6477322207 12334 0ustar rootroot#!/bin/sh KOULESDIR=/usr/local/bin XKOULESDIR=/usr/bin/X11 if [ $TERM != console ]; then if [ $TERM != linux ]; then if [ $DISPLAY != "" ]; then exec $KOULESDIR/koules.tcl fi fi fi single() { dialog --title "Koules options" --menu "Select resolution" 9 40 2 "320x200" "low resolution" "640x480" "High resolution" 2> /tmp/dialogout.$$ resolution=`cat /tmp/dialogout.$$` if [ $resolution = "320x200" ]; then resolution="-s" else resolution="-l" fi dialog --title "Koules options" --checklist "Driver options" 9 40 2 "Mouse support" "" on "Sound support" "" on 2> /tmp/dialogout.$$ drivers=`cat /tmp/dialogout.$$` mouse="-M" sound="-d" for opt in $drivers; do case $opt in \"Mouse) mouse=" ";; \"Sound) sound=" ";; esac done opt="$resolution $mouse $sound" dialog --title "Koules options" --yesno "Save configuration" 5 40 case $? in 0) echo "$KOULESDIR/koules.svga $opt" >~/.koules.single esac } server() { dialog --title "Server options" --menu "Select resolution" 10 50 3 "Normal" "For 320x250 and 640x480 clients" "Wide" "For 320x200 and 640x400 clients" "Large" "For extra large 800x620 clients" 2> /tmp/dialogout.$$ resolution=`cat /tmp/dialogout.$$` case $resolution in "Normal") resolution="" ;; "Wide") resolution="-W" ;; "Large") resolution="-E" ;; esac dialog --title "Server options" --menu "Difficulty" 12 50 5 "0" "Nightmare" "1" "hard" "2" "medium" "3" "easy" "4" "very easy" 2> /tmp/dialogout.$$ diff=`cat /tmp/dialogout.$$` dialog --title "Server options" --checklist "Game options" 8 40 1 "Deathmatch" "" off 2> /tmp/dialogout.$$ drivers=`cat /tmp/dialogout.$$` deathmatch="" for opt in $drivers; do case $opt in *Deathmatch*) deathmatch="-K";; esac done dialog --title "Server options" --inputbox "Starting level" 9 40 "1" 2>/tmp/dialogout.$$ level=`cat /tmp/dialogout.$$` dialog --title "Server options" --inputbox "Inet port" 9 40 "12345" 2>/tmp/dialogout.$$ port=`cat /tmp/dialogout.$$` opt="$resolution -S $deathmatch -D $diff -L $level -P $port" dialog --title "Koules options" --yesno "Save configuration" 5 40 case $? in 0) echo "$KOULESDIR/koules.svga $opt" >~/.koules.server esac } client() { dialog --title "Client options" --menu "Select resolution" 9 40 2 "320x200" "low resolution" "640x480" "High resolution" 2> /tmp/dialogout.$$ resolution=`cat /tmp/dialogout.$$` if [ $resolution = "320x200" ]; then resolution="-s" else resolution="-l" fi dialog --title "Client options" --checklist "Driver options" 9 40 2 "Mouse support" "" on "Sound support" "" on 2> /tmp/dialogout.$$ drivers=`cat /tmp/dialogout.$$` mouse="-M" sound="-d" for opt in $drivers; do case $opt in \"Mouse) mouse=" ";; \"Sound) sound=" ";; esac done dialog --title "Client options" --inputbox "Host" 9 40 "localhost" 2>/tmp/dialogout.$$ host=`cat /tmp/dialogout.$$` dialog --title "Client options" --inputbox "Inet port" 9 40 "12345" 2>/tmp/dialogout.$$ port=`cat /tmp/dialogout.$$` opt="-C$host $resolution $mouse $sound -P $port" dialog --title "Koules options" --yesno "Save configuration" 5 40 case $? in 0) echo "$KOULESDIR/koules.svga $opt" >~/.koules.client esac } configure() { dialog --title "Koules options" --menu "Select game mode" 11 30 4 "g" "single" "s" "Network server" "c" "Network client" "b" "Back to main menu" 2> /tmp/dialogout.$$ mode=`cat /tmp/dialogout.$$` case $mode in g)\ single ;; s)\ server ;; c)\ client ;; esac } mainmenu() { dialog --title "Koules startup menu" --menu "Select game mode" 11 30 4 "g" "single" "s" "Network server" "c" "Network client" "m" "Configuration menu" 2> /tmp/dialogout.$$ mode=`cat /tmp/dialogout.$$` case $mode in g)\ if [ ! -r ~/.koules.single ]; then single fi clear sh ~/.koules.single ;; s)\ if [ ! -r ~/.koules.server ]; then server fi clear sh ~/.koules.server ;; c)\ if [ ! -r ~/.koules.client ]; then client fi clear sh ~/.koules.client ;; m) configure mainmenu ;; esac } mainmenu koules1.4/Makefile.svgalib100644 37512 310 6657 6501007541 14152 0ustar rootroot#edit this for your architecture! #ARCH=-m386 #ARCH=-m486 #ARCH=-mpentium #uncoment following for joystick support #JOYSTICK = -D JOYSTICK #requires joystick toolkit installed! #uncoment following to enable network support NET = -D NETSUPPORT #uncoment following three lines for linux sound support SOUND = -D SOUND SOUNDSERVER = koules.sndsrv.linux INSTALLSOUND = True #uncoment following for mouse support MOUSE = -D MOUSE #don`t add / and spaces at end of path! #directories SOUNDDIR = /usr/local/lib/koules BINDIR = /usr/local/bin MANDIR = /usr/local/man/man6 SOUNDOBJS = sound.o SOUNDDEV = /dev/dsp INSTBINFLAGS=-m a=rxs,u=rwxs INSTALL = install CC = gcc OPTIMIZE = -Isvgalib -fomit-frame-pointer -O3 -ffast-math -s -Dlinux -Wall -DHAVEUSLEEP OPTIMIZE1 = -I svgalib -fomit-frame-pointer -O6 -ffast-math -funroll-loops -finline-functions -s -Dlinux -Wall -DHAVEUSLEEP CFLAGS = $(DEFINES) $(ARCH) $(JOYSTICK) -DSOUNDDIR="\"$(SOUNDDIR)\"" $(SOUND) $(MOUSE) $(NET)\ -DSOUNDSERVER=\"$(SOUNDDIR)/$(SOUNDSERVER)\" \ -DSOUNDDIR=\"$(SOUNDDIR)\" \ -DSOUNDDEV=\"$(SOUNDDEV)\" LFLAGS = PROGS = koules.svga PROGS_O = koules.o sound.o menu.o gameplan.o font.o intro.o svgalib/init.o framebuffer.o cmap.o rcfiles.o server.o client.o sock.o objectsio.o LIBS = -lvgagl -lvga all: progs $(SOUNDSERVER) progs : $(PROGS) objs: $(PROGS_O) .c.o: $(CC) $(CFLAGS) $(OPTIMIZE) -Wall -c -o $*.o $< .c.s: $(CC) $(CFLAGS) $(OPTIMIZE) -S -o $*.s $< .o: $(CC) $(CFLAGS) $(OPTIMIZE1) $(LFLAGS) -o $* $*.o $(LIBS) chmod a+rs,go-w $* font.o: font.c @echo please be patient. @echo the font.c is big and ugly i ripped it from zgv. @echo do you know about better one? $(CC) $(OPTIMIZE1) $(CFLAGS) -c $< koules.sndsrv.linux.o: koules.sndsrv.linux.c $(CC) $(OPTIMIZE1) $(CFLAGS) -c $< koules.o: koules.c $(CC) $(OPTIMIZE1) $(CFLAGS) -Wall -c $< koules.svga: $(PROGS_O) $(CC) $(OPTIMIZE1) $(CFLAGS) $(LFLAGS) -o koules.svga $(PROGS_O) $(LIBS) -lm install:: $(PROG) $(SOUNDSERVER) @echo "Koules directory is " $(BINDIR) @: @echo "Instalin man page to " $(MANDIR) $(INSTALL) -c $(INSTMANFLAGS) koules.svga.6 $(MANDIR); @: @echo "Creating directory " $(BINDIR) @if [ ! -d $(BINDIR) ]; then mkdir $(BINDIR); fi $(INSTALL) -c -s $(INSTBINFLAGS) koules.svga $(BINDIR) @: @if [ "$(INSTALLSOUND)" = "True" ]; \ then \ echo "Creating directory " $(SOUNDDIR); \ if [ ! -d $(SOUNDDIR) ]; then mkdir $(SOUNDDIR); fi; \ echo "Copying sound server to directory " $(SOUNDDIR); \ $(INSTALL) -c -s $(INSTBIN1FLAGS) $(SOUNDSERVER) $(SOUNDDIR); \ echo "Copying sound files into directory " $(SOUNDDIR); \ cd ./sounds; set -x; \ for file in *.raw; do \ $(INSTALL) -c $(INSTDATFLAGS) $$file $(SOUNDDIR); \ done; \ fi @echo "Don't forget to remove your old koules from /usr/games/koules " @echo "and /usr/games/kouleslib " clean: rm -f koules.svga $(SOUNDSERVER) rm -f core `find . -name '*.[oas]' -print` rm -f core `find . -name '*~' -print` rm -f core `find . -type f -name 'core' -print` indent: indent -di16 *.c *.h svgalib/*.c svgalib/*.h xlib/*.c xlib/*.h lint: export LARCH_PATH=/usr/lib/lclint LCLIMPORTDIR=/usr/lib/lclint;\ lclint -weak -Isvgalib $(DEFINES) *.c svgalib/*.c xlib/*.c 2>lint.out;\ lclint -weak -Ixlib xlib/*.c 2>>lint.out dep: rm -f .depend make .depend .depend: echo '# Program dependencies' >.depend gcc -I svgalib $(DEFINES) -MM $(patsubst %.o,%.c,$(PROGS_O)) >>.depend include .depend koules1.4/text.h100644 37512 310 21770 6477322207 12245 0ustar rootroot/*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bujuvniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * text.h starwars scroller text * * revised by Thomas Marsh * ***********************************************************/ #define KOULESLINE 11 #define PLAYERLINE 34 #define D1LINE 44 #define D2LINE 46 #define BLINE 57 static char *text[] = { "Somewhere in the galaxy", "...", "Once upon a time", "the evil", "KOULES", "exhausted all the resources", "of their home planet", "...", "Their emperor", "THE DARK APPLEPOLISHER", "deployed his brutal", "hyperspace commandos", "to wipe out", "a human civilization", "and claim Earth's", "resources for his", "realms" "...", "The nations of Earth", "chose their best warriors", "to defend our planet", "...", "These champions were", "biologically mutated", "into special creatures.", "Their entities were reduced", "to mere chests and eyes", "...", "These qualities allow them", "operate in enemies' domain", "...", "Your battle for a new world", "begins", "", "NOW", "...", "Your mission is to", "bounce all", "KOULES fighters", "from your sector", "...", "Some of them are", "deserters", "The green ones give you", "acceleration", "the blue ones give you", "more weight", "...", "Look out", "for", "mighty", "super-spherical", "megaheavy", "ultra green", "B_BALL", "...", "", "", "KOULES TEAM", "...", "Programming by Jan Hubicka", "...", "OS/2 version by Thomas A. K. Kjaer", "...", "Script by Kamil Toman", "and Jan Hubicka", "...", "Spelling check by Thomas Marsh", "...", "Graphics by Jan Hubicka", "and Kamil Toman", "...", "Sounds by Jan Hubicka", "...", "HP-UX sound by Lutz Vieweg", "...", "SGI sound by Rick Sayre", "...", "Story by Kamil Toman", "and Jan Hubicka", "...", "Sound server by", "Joe Rumsey", "and S. M. Patel", "...", "Joystick support by", "Ludvik Tesar", "...", "Greetings", "...", "Linus Torvalds", "Have a nice Linux", "...", "Ondrej Stasek", "alias KOTELNIK", "from RDOS", "Hello you ___", "nice man", "...", "Jaroslav Kysela", "debugged on your GUS driver", "...", "Mojmir Svoboda", "No chance to run it", "on your machine...", "It doesn't matter", "you've bought better", "computer equipment", "...", "Roman Zenka", "You lucky man", "you ARE in credits", "...", "Aragorn", "Thanks for an account", "...", "Jaroslav Pech", "When could I hope you learn", "Linux", "...", "Roman Dolejsi", "I hope your game", "will be better", "...", "Boris Letocha", "Write me in credits in", "your game", "...", "...", "HEY WAKE UP", "and", "press any key", "excluding", "power", "reset", "turbo", #ifndef XSUPPORT "CTRL+C", "CTRL+Z", "ALT F1", "ALT F2", "ALT F3", "ALT F4", "ALT F5", "ALT F6", "ALT F7", "ALT F8", "ALT F9", "ALT F10", "ALT F11", "ALT F12", "ALT F13", "( huh )", "...", "ALT LEFT ARROW", "ALT RIGHT ARROW", #else #ifdef linux "CONTROL ALT F1", "CONTROL ALT F2", "CONTROL ALT F3", "CONTROL ALT F4", "CONTROL ALT F5", "CONTROL ALT F6", "CONTROL ALT F7", "CONTROL ALT F8", "CONTROL ALT F9", "CONTROL ALT F10", "CONTROL ALT F11", "CONTROL ALT F12", "CONTROL ALT F13", "( huh )", "...", "CONTROL ALT PLUS", "CONTROL ALT MINUS", "CONTROL ALT BACKSPACE", #endif #endif "ESC", "and some other", "keys", "( no key except A is safe )" "...", "Copyright(c)1995-1996", "Jan Hubicka", "hubicka@paru.cas.cz", }; static int TEXTSIZE = (sizeof (text) / sizeof (char *)); static char *text1[] = { "Very well", "...", "You have destroyed most", "of the Koules fighters", "...", "Now you are", "in the main base", "Your goal", "is to destroy the", "Mighty", "Mega", "Super", "Ultra", "HEAVY", "DARK APPLEPOLISHER"}; static int TEXTSIZE1 = (sizeof (text1) / sizeof (char *)); static char *text2[] = { "Congratulations", "your mission is complete", "...", "The death of", "DARK APPLEPOLISHER", "caused the end", "of the whole", "KOULES civilization", "...", "Millions of", "innocent KOULES", "died in chaos", "caused by death", "of DARK APPLEPOLISHER", "...", "You have killed", "innocent KOULES", "You killer", "You murderer", "You...you..you..", "...", "And now", "Wait for", "The greatest", "Game", "For", "Linux", "...", "KOULES II", "...", ""}; static int TEXTSIZE2 = (sizeof (text2) / sizeof (char *)); #define CONTLINE 16 #define UDIVLINE 10 static char *bballtext[] = { "The DARK APPLEPOLISHER", "has heard about you", "Your are famous", "This has one disadvantage", "B_BALLS are going to", "kick you out", "of the game", "We believe in your", "abilities", "Yet no one had survived", "the ... meeting ...", "before"}; static int BBALLSIZE = (sizeof (bballtext) / sizeof (char *)); static char *bbballtext[] = { "You entered the", "PRIMARY ALARM ZONE", "New B_BALLS have been", "sent to protect the leader", "...", "do not", "turn the power off", "your are near", "your goal", "NOW you can finish the game"}; static int BBBALLSIZE = (sizeof (bbballtext) / sizeof (char *)); static char *introtext[] = { "The best way", "to play KOULES", "is to let you play", "without instructions", "...", "We can only advise you", "...", "(connection failed)"}; static int INTROSIZE = (sizeof (introtext) / sizeof (char *)); static char *holetext[] = { "Our scientists have", "developed a great", "weapon", "so powerful", "that even you can", "be destroyed by it", "...", "They have designed", "special black holes", "which can be moved", "through the hyperspace", "Your advantage is", "that black holes cannot", "be seen by KOULES"}; static int HOLESIZE = (sizeof (holetext) / sizeof (char *)); static char *inspectortext[] = { "Standard KOULES", "inspectors were sent", "to monitor your actions", "They can not be destroyed", "directly", "...", "Good luck", "..."}; static int INSPECTORSIZE = (sizeof (inspectortext) / sizeof (char *)); static char *magholetext[] = { "KOULES are not stupid", "They have developed a new", "funny weapon", "which can be called", "the MAGNETIC HOLE", "..."}; static int MAGSIZE = (sizeof (magholetext) / sizeof (char *)); static char *springtext[] = { "Koules have", "more hidden qualities", "...", "When they're in a danger", "they spit on you", "...", "their spits sticks to you", "...", "Do not puke on the keyboard", "..."}; static int SPRINGTSIZE = (sizeof (springtext) / sizeof (char *)); static char *thieftext[] = { "During the war", "the Earth's power", "resources have been", "almost exhausted", "...", "An underground guerilla", "organisation called SUBWAY", "was established", "to take care", "of this problem", "...", "SUBWAY squads", "known as Thieves", "managed to infiltrate", "war teritories", "..."}; static int THIEFSIZE = (sizeof (thieftext) / sizeof (char *)); static char *findertext[] = { "Their competitors,", "the on-the-ground", "organisation SURFACE", "developed a special", "persuaduing method", "which makes", "a Thief become", "a complete boob", "which returns to you", "everything he has stolen", "...", "Technical note", "This technology", "is based on UNIX", "lost+found directory"}; static int FINDERSIZE = (sizeof (findertext) / sizeof (char *)); static char *ttooltext[] = { "After intensive", "research our scientists", "have finally stolen", "SUBWAY's technologies", "...", "If you get a special", "chip you will be able", "to steal energy", "from other ships or B_BALLS", }; static int TTOOLSIZE = (sizeof (ttooltext) / sizeof (char *)); static char *lunatictext[] = { " DANGER ", "Our scientists", "have been working", "on very dangerous", "virus", "...", "By a small mistake", "they left the", "laboratory", "open and have", "accidentally released", "the LUNATICS.", "...", "Beware, for Lunatics", "are extremely", "dangerous." }; static int LUNATICSIZE = (sizeof (lunatictext) / sizeof (char *)); koules1.4/util/ 40755 37512 310 0 6477562716 11754 5ustar rootrootkoules1.4/util/usleep.c100644 37512 310 514 6477322207 13457 0ustar rootroot#ifndef HAVEUSLEEP #if __STDC__ #include #endif #include #include void myusleep (usecs) unsigned long usecs; { struct timeval tv; tv.tv_sec = usecs / 1000000L; tv.tv_usec = usecs % 1000000L; (void) select (0, (void *)0, (void *)0, (void *)0, &tv); } #else void dummy(void) { } #endif koules1.4/util/Imakefile100644 37512 310 577 6477322207 13640 0ustar rootroot #XCOMM *********************************************************** #XCOMM ---> Configuration options was moved indo Iconfig <---- #XCOMM *********************************************************** #include "../Iconfig" #ifdef HAVEUSLEEP DEFINES = -DHAVEUSLEEP #endif OBJS = usleep.o SRCS = usleep.c NormalLibraryTarget(utils, $(OBJS)) all::libutils.a all::libutils.a koules1.4/util/Makefile100644 37512 310 36342 6477556605 13541 0ustar rootroot# Makefile generated by imake - do not edit! # $TOG: imake.c /main/97 1997/06/20 20:23:51 kaleb $ # ---------------------------------------------------------------------- # Makefile generated from "Imake.tmpl" and # $TOG: Imake.tmpl /main/245 1997/05/20 10:05:47 kaleb $ # # # # # $XFree86: xc/config/cf/Imake.tmpl,v 3.32.2.5 1997/07/06 07:27:59 dawes Exp $ # ---------------------------------------------------------------------- all:: .SUFFIXES: .i # $TOG: Imake.cf /main/28 1997/06/25 08:31:36 barstow $ # $XFree86: xc/config/cf/Imake.cf,v 3.34.2.3 1997/07/27 02:41:02 dawes Exp $ # ----------------------------------------------------------------------- # site-specific configuration parameters that need to come before # the platform-specific parameters - edit site.def to change # site: $XConsortium: site.def /main/revisionist/4 1996/12/31 08:02:07 kaleb $ # site: $XFree86: xc/config/cf/site.def,v 3.17.2.1 1997/06/22 10:32:21 dawes Exp $ # $XFree86: xc/config/cf/xf86site.def,v 3.101.2.11 1997/06/22 10:32:22 dawes Exp $ # ---------------------------------------------------------------------- # platform-specific configuration parameters - edit linux.cf to change # platform: $TOG: linux.cf /main/36 1997/06/16 22:21:03 kaleb $ # platform: $XFree86: xc/config/cf/linux.cf,v 3.57.2.10 1997/07/28 14:17:25 dawes Exp $ # operating system: Linux 2.1.86 sparc64 [ELF] (2.1.86) # libc: (5.3.12) # binutils: (28) # $XConsortium: lnxLib.rules /main/13 1996/09/28 16:11:01 rws $ # $XFree86: xc/config/cf/lnxLib.rules,v 3.28.2.3 1997/06/22 10:32:20 dawes Exp $ # ---------------------------------------------------------------------- # site-specific configuration parameters that go after # the platform-specific parameters - edit site.def to change # site: $XConsortium: site.def /main/revisionist/4 1996/12/31 08:02:07 kaleb $ # site: $XFree86: xc/config/cf/site.def,v 3.17.2.1 1997/06/22 10:32:21 dawes Exp $ # --------------------------------------------------------------------- # Imake rules for building libraries, programs, scripts, and data files # rules: $TOG: Imake.rules /main/222 1997/07/17 20:04:40 kaleb $ # rules: $XFree86: xc/config/cf/Imake.rules,v 3.33.2.5 1997/07/19 04:59:07 dawes Exp $ _NULLCMD_ = @ echo -n TKLIBNAME = tk4.2 TKLIBDIR = /usr/local/lib TCLLIBNAME = tcl7.6 TCLIBDIR = /usr/local/lib PATHSEP = / SHELL = /bin/sh TOP = .. CURRENT_DIR = util IMAKE = imake DEPEND = makedepend MKDIRHIER = mkdir -p EXPORTLISTGEN = CONFIGSRC = $(TOP)/config IMAKESRC = $(CONFIGSRC)/imake DEPENDSRC = $(CONFIGSRC)/makedepend INCROOT = /usr/X11R6/include USRLIBDIR = /usr/X11R6/lib VARLIBDIR = /var/lib SHLIBDIR = /usr/X11R6/lib LINTLIBDIR = $(USRLIBDIR)/lint MANPATH = /usr/X11R6/man MANSOURCEPATH = $(MANPATH)/man MANDIR = $(MANSOURCEPATH)1 LIBMANDIR = $(MANSOURCEPATH)3 FILEMANDIR = $(MANSOURCEPATH)5 AR = ar clq BOOTSTRAPCFLAGS = CC = gcc AS = as .SUFFIXES: .cc CXX = c++ CXXFILT = c++filt CXXLIB = CXXDEBUGFLAGS = -O2 CXXDEPENDINCLUDES = CXXEXTRA_DEFINES = CXXEXTRA_INCLUDES = CXXSTD_DEFINES = -Dlinux -D__sparc__ -D_POSIX_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -DX_LOCALE $(CXXPROJECT_DEFINES) CXXOPTIONS = CXXINCLUDES = $(INCLUDES) $(TOP_INCLUDES) $(CXXEXTRA_INCLUDES) CXXDEFINES = $(CXXINCLUDES) $(CXXSTD_DEFINES) $(THREADS_CXXDEFINES) $(CXXEXTRA_DEFINES) $(DEFINES) CXXFLAGS = $(CXXDEBUGFLAGS) $(CXXOPTIONS) $(THREADS_CXXFLAGS) $(CXXDEFINES) COMPRESS = compress GZIPCMD = gzip CPP = /lib/cpp $(STD_CPP_DEFINES) PREPROCESSCMD = gcc -E $(STD_CPP_DEFINES) INSTALL = install INSTALLFLAGS = -c LD = ld LEX = flex -l LEXLIB = -lfl YACC = bison -y CCYACC = bison -y LINT = lint LINTLIBFLAG = -C LINTOPTS = -axz LN = ln -s MAKE = make MV = mv -f CP = cp RANLIB = ranlib RANLIBINSTFLAGS = RM = rm -f MANSUFFIX = 1x LIBMANSUFFIX = 3x FILEMANSUFFIX = 5x TROFF = psroff NROFF = nroff MSMACROS = -ms MANMACROS = -man TBL = tbl EQN = eqn NEQN = neqn COL = col DVIPS = dvips LATEX = latex STD_INCLUDES = STD_CPP_DEFINES = -traditional -Dlinux -D__sparc__ -D_POSIX_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -DX_LOCALE $(PROJECT_DEFINES) STD_DEFINES = -Dlinux -D__sparc__ -D_POSIX_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -DX_LOCALE $(PROJECT_DEFINES) EXTRA_LOAD_FLAGS = EXTRA_LDOPTIONS = EXTRA_LIBRARIES = TAGS = ctags PARALLELMFLAGS = SHAREDCODEDEF = SHLIBDEF = SHLIBLDFLAGS = -shared PICFLAGS = -fPIC CXXPICFLAGS = -fPIC PROTO_DEFINES = -DFUNCPROTO=15 -DNARROWPROTO INSTPGMFLAGS = -s INSTBINFLAGS = -m 0755 INSTUIDFLAGS = -m 4711 INSTLIBFLAGS = -m 0644 INSTINCFLAGS = -m 0444 INSTMANFLAGS = -m 0444 INSTDATFLAGS = -m 0444 INSTKMEMFLAGS = -m 4711 PROJECTROOT = /usr/X11R6 CDEBUGFLAGS = -O2 CCOPTIONS = ALLINCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) $(TOP_INCLUDES) $(STD_INCLUDES) ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(EXTRA_DEFINES) $(PROTO_DEFINES) $(THREADS_DEFINES) $(DEFINES) CFLAGS = $(CDEBUGFLAGS) $(CCOPTIONS) $(THREADS_CFLAGS) $(ALLDEFINES) LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES) $(DEPEND_DEFINES) LDPRELIB = -L$(USRLIBDIR) LDPOSTLIB = LDOPTIONS = $(CDEBUGFLAGS) $(CCOPTIONS) $(EXTRA_LDOPTIONS) $(THREADS_LDFLAGS) $(LOCAL_LDFLAGS) $(LDPRELIBS) CXXLDOPTIONS = $(CXXDEBUGFLAGS) $(CXXOPTIONS) $(EXTRA_LDOPTIONS) $(THREADS_CXXLDFLAGS) $(LOCAL_LDFLAGS) $(LDPRELIBS) LDLIBS = $(LDPOSTLIBS) $(THREADS_LIBS) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES) CCLINK = $(CC) CXXLINK = $(CXX) LDSTRIPFLAGS = -x LDCOMBINEFLAGS = -r DEPENDFLAGS = # Not sure this belongs here TKLIBDIR = /usr/local/lib TKINCDIR = /usr/local/include TKLIBNAME = tk4.2 TKLIBRARY = -L$(TKLIBDIR) -l$(TKLIBNAME) TCLLIBDIR = /usr/local/lib TCLINCDIR = /usr/local/include TCLLIBNAME = tcl7.6 TCLLIBRARY = -L$(TCLLIBDIR) -l$(TCLLIBNAME) MACROFILE = linux.cf RM_CMD = $(RM) IMAKE_DEFINES = IRULESRC = $(CONFIGDIR) IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES) ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/X11.tmpl $(IRULESRC)/site.def $(IRULESRC)/$(MACROFILE) $(IRULESRC)/xf86site.def $(IRULESRC)/host.def $(EXTRA_ICONFIGFILES) # $TOG: X11.rules /main/4 1997/04/30 15:23:24 kaleb $ # ---------------------------------------------------------------------- # X Window System Build Parameters and Rules # $TOG: X11.tmpl /main/292 1997/05/20 10:05:59 kaleb $ # # # # # $XFree86: xc/config/cf/X11.tmpl,v 1.8.2.3 1997/05/21 15:02:13 dawes Exp $ # ----------------------------------------------------------------------- # X Window System make variables; these need to be coordinated with rules XTOP = $(TOP) BINDIR = /usr/X11R6/bin BUILDINCROOT = $(TOP)/exports BUILDINCDIR = $(BUILDINCROOT)/include BUILDINCTOP = ../.. BUILDLIBDIR = $(TOP)/exports/lib BUILDLIBTOP = ../.. BUILDBINDIR = $(TOP)/exports/bin BUILDBINTOP = ../.. XBUILDINCROOT = $(XTOP)/exports XBUILDINCDIR = $(XBUILDINCROOT)/include/X11 XBUILDINCTOP = ../../.. XBUILDBINDIR = $(XBUILDINCROOT)/bin INCDIR = $(INCROOT) ADMDIR = /usr/adm LIBDIR = $(USRLIBDIR)/X11 TOP_X_INCLUDES = -I$(XPROJECTROOT)/include FONTDIR = $(LIBDIR)/fonts XINITDIR = $(LIBDIR)/xinit XDMDIR = $(LIBDIR)/xdm XDMVARDIR = $(VARLIBDIR)/xdm TWMDIR = $(LIBDIR)/twm XSMDIR = $(LIBDIR)/xsm NLSDIR = $(LIBDIR)/nls XLOCALEDIR = $(LIBDIR)/locale PEXAPIDIR = $(LIBDIR)/PEX LBXPROXYDIR = $(LIBDIR)/lbxproxy PROXYMANAGERDIR = $(LIBDIR)/proxymngr XPRINTDIR = $(LIBDIR) XAPPLOADDIR = $(LIBDIR)/app-defaults FONTCFLAGS = -t INSTAPPFLAGS = $(INSTDATFLAGS) RGB = rgb FONTC = bdftopcf MKFONTDIR = mkfontdir DOCUTILSRC = $(XTOP)/doc/util CLIENTSRC = $(TOP)/clients DEMOSRC = $(TOP)/demos XDOCMACROS = $(DOCUTILSRC)/macros.t XIDXMACROS = $(DOCUTILSRC)/indexmacros.t PROGRAMSRC = $(TOP)/programs LIBSRC = $(XTOP)/lib FONTSRC = $(XTOP)/fonts INCLUDESRC = $(BUILDINCROOT)/include XINCLUDESRC = $(INCLUDESRC)/X11 SERVERSRC = $(XTOP)/programs/Xserver CONTRIBSRC = $(XTOP)/../contrib UNSUPPORTEDSRC = $(XTOP)/unsupported DOCSRC = $(XTOP)/doc RGBSRC = $(XTOP)/programs/rgb BDFTOPCFSRC = $(PROGRAMSRC)/bdftopcf MKFONTDIRSRC = $(PROGRAMSRC)/mkfontdir FONTSERVERSRC = $(PROGRAMSRC)/xfs FONTINCSRC = $(XTOP)/include/fonts EXTINCSRC = $(XTOP)/include/extensions TRANSCOMMSRC = $(LIBSRC)/xtrans TRANS_INCLUDES = -I$(TRANSCOMMSRC) XENVLIBDIR = $(USRLIBDIR) CLIENTENVSETUP = LD_LIBRARY_PATH=$(XENVLIBDIR) # $XConsortium: lnxLib.tmpl,v 1.5 95/01/11 21:44:44 kaleb Exp $ # $XFree86: xc/config/cf/lnxLib.tmpl,v 3.9 1996/02/24 04:32:52 dawes Exp $ XLIBSRC = $(LIBSRC)/X11 SOXLIBREV = 6.1 DEPXONLYLIB = XONLYLIB = -lX11 LINTXONLY = $(LINTLIBDIR)/llib-lX11.ln XLIBONLY = $(XONLYLIB) XEXTLIBSRC = $(LIBSRC)/Xext SOXEXTREV = 6.3 DEPEXTENSIONLIB = EXTENSIONLIB = -lXext LINTEXTENSION = $(LINTLIBDIR)/llib-lXext.ln LINTEXTENSIONLIB = $(LINTEXTENSION) DEPXLIB = $(DEPEXTENSIONLIB) $(DEPXONLYLIB) XLIB = $(EXTENSIONLIB) $(XONLYLIB) LINTXLIB = $(LINTXONLYLIB) XAUTHSRC = $(LIBSRC)/Xau DEPXAUTHLIB = $(USRLIBDIR)/libXau.a XAUTHLIB = -lXau LINTXAUTH = $(LINTLIBDIR)/llib-lXau.ln XDMCPLIBSRC = $(LIBSRC)/Xdmcp DEPXDMCPLIB = $(USRLIBDIR)/libXdmcp.a XDMCPLIB = -lXdmcp LINTXDMCP = $(LINTLIBDIR)/llib-lXdmcp.ln XMUSRC = $(LIBSRC)/Xmu SOXMUREV = 6.0 DEPXMULIB = XMULIB = -lXmu LINTXMU = $(LINTLIBDIR)/llib-lXmu.ln OLDXLIBSRC = $(LIBSRC)/oldX DEPOLDXLIB = $(USRLIBDIR)/liboldX.a OLDXLIB = -loldX LINTOLDX = $(LINTLIBDIR)/llib-loldX.ln XPLIBSRC = $(LIBSRC)/Xp SOXPREV = 6.2 DEPXPLIB = XPLIB = -lXp LINTXP = $(LINTLIBDIR)/llib-lXp.ln TOOLKITSRC = $(LIBSRC)/Xt SOXTREV = 6.0 DEPXTOOLONLYLIB = XTOOLONLYLIB = -lXt LINTXTOOLONLY = $(LINTLIBDIR)/llib-lXt.ln DEPXTOOLLIB = $(DEPXTOOLONLYLIB) $(DEPSMLIB) $(DEPICELIB) XTOOLLIB = $(XTOOLONLYLIB) $(SMLIB) $(ICELIB) LINTXTOOLLIB = $(LINTXTOOLONLYLIB) XALIBSRC = $(LIBSRC)/Xa SOXAREV = 1.0 DEPXALIB = XALIB = -lXa LINTXA = $(LINTLIBDIR)/llib-lXa.ln AWIDGETSRC = $(LIBSRC)/Xaw SOXAWREV = 6.1 DEPXAWLIB = XAWLIB = -lXaw LINTXAW = $(LINTLIBDIR)/llib-lXaw.ln XILIBSRC = $(LIBSRC)/Xi SOXINPUTREV = 6.0 DEPXILIB = XILIB = -lXi LINTXI = $(LINTLIBDIR)/llib-lXi.ln XTESTLIBSRC = $(LIBSRC)/Xtst SOXTESTREV = 6.1 DEPXTESTLIB = XTESTLIB = -lXtst LINTXTEST = $(LINTLIBDIR)/llib-lXtst.ln PEXLIBSRC = $(LIBSRC)/PEX5 SOPEXREV = 6.0 DEPPEXLIB = PEXLIB = -lPEX5 LINTPEX = $(LINTLIBDIR)/llib-lPEX5.ln XIELIBSRC = $(LIBSRC)/XIE SOXIEREV = 6.0 DEPXIELIB = XIELIB = -lXIE LINTXIE = $(LINTLIBDIR)/llib-lXIE.ln PHIGSLIBSRC = $(LIBSRC)/PHIGS DEPPHIGSLIB = $(USRLIBDIR)/libphigs.a PHIGSLIB = -lphigs LINTPHIGS = $(LINTLIBDIR)/llib-lphigs.ln DEPXBSDLIB = $(USRLIBDIR)/libXbsd.a XBSDLIB = -lXbsd LINTXBSD = $(LINTLIBDIR)/llib-lXbsd.ln ICESRC = $(LIBSRC)/ICE SOICEREV = 6.3 DEPICELIB = ICELIB = -lICE LINTICE = $(LINTLIBDIR)/llib-lICE.ln SMSRC = $(LIBSRC)/SM SOSMREV = 6.0 DEPSMLIB = SMLIB = -lSM LINTSM = $(LINTLIBDIR)/llib-lSM.ln XKEYSRC = $(LIBSRC)/Xkey SOXKEYREV = 6.0 DEPXKEYLIB = XKEYLIB = -lXkey LINTXKEY = $(LINTLIBDIR)/llib-lXkey.ln FSLIBSRC = $(LIBSRC)/FS DEPFSLIB = $(USRLIBDIR)/libFS.a FSLIB = -lFS LINTFS = $(LINTLIBDIR)/llib-lFS.ln FONTLIBSRC = $(LIBSRC)/font DEPFONTLIB = $(USRLIBDIR)/libfont.a FONTLIB = -lfont LINTFONT = $(LINTLIBDIR)/llib-lfont.ln XPMLIBSRC = $(LIBSRC)/Xpm DEPXPMLIB = $(USRLIBDIR)/libXpm.a XPMLIB = -lXpm LINTXPM = $(LINTLIBDIR)/llib-lXpm.ln XKBFILELIBSRC = $(LIBSRC)/xkbfile DEPXKBFILELIB = $(USRLIBDIR)/libxkbfile.a XKBFILELIB = -lxkbfile LINTXKBFILE = $(LINTLIBDIR)/llib-lxkbfile.ln XKBCOMPCMD = xkbcomp XKBUILIBSRC = $(LIBSRC)/xkbui DEPXKBUILIB = $(USRLIBDIR)/libxkbui.a XKBUILIB = -lxkbui LINTXKBUI = $(LINTLIBDIR)/llib-lxkbui.ln DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB) DEPLIBS1 = $(DEPLIBS) DEPLIBS2 = $(DEPLIBS) DEPLIBS3 = $(DEPLIBS) DEPLIBS4 = $(DEPLIBS) DEPLIBS5 = $(DEPLIBS) DEPLIBS6 = $(DEPLIBS) DEPLIBS7 = $(DEPLIBS) DEPLIBS8 = $(DEPLIBS) DEPLIBS9 = $(DEPLIBS) DEPLIBS10 = $(DEPLIBS) XMULIBONLY = -lXmu XMULIB = $(XMULIBONLY) $(XTOOLLIB) $(XLIB) CONFIGDIR = $(LIBDIR)/config USRLIBDIRPATH = $(USRLIBDIR) LDPRELIBS = -L$(USRLIBDIR) LDPOSTLIBS = TOP_INCLUDES = -I$(INCROOT) $(TOP_X_INCLUDES) PROJECT_DEFINES = CXXPROJECT_DEFINES = # ---------------------------------------------------------------------- # start of Imakefile # # *********************************************************** # # ---> Configuration options was moved indo Iconfig <---- # # *********************************************************** KOULESDIR =/usr/bin/X11 SOUNDDIR =/usr/local/lib/koules MANDIR =/usr/local/man/man6 DEPLIBS = $(DEPXLIB) INCLUDES = -Ixlib SUBDIRS = xlib SYSDEFS = -Wall -fomit-frame-pointer -O6 -ffast-math SOUNDSERVER = koules.sndsrv.linux SOUNDOBJS = sound.o SOUNDDEV = /dev/dsp OBJS = usleep.o SRCS = usleep.c all:: libutils.a libutils.a: $(OBJS) $(EXTRALIBRARYDEPS) $(RM) $@ $(AR) $@ $(OBJS) $(RANLIB) $@ $(_NULLCMD_) all::libutils.a all::libutils.a # ---------------------------------------------------------------------- # common rules for all Makefiles - do not edit .c.i: $(RM) $@ $(CC) -E $(CFLAGS) $(_NOOP_) $*.c > $@ emptyrule:: clean:: $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut "#"* Makefile:: -@if [ -f Makefile ]; then set -x; \ $(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \ else exit 0; fi $(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR) tags:: $(TAGS) -w *.[ch] $(TAGS) -xw *.[ch] > TAGS man_keywords:: # ---------------------------------------------------------------------- # empty rules for directories that do not have SUBDIRS - do not edit install:: @echo "install in $(CURRENT_DIR) done" install.man:: @echo "install.man in $(CURRENT_DIR) done" install.linkkit:: @echo "install.linkkit in $(CURRENT_DIR) done" Makefiles:: includes:: depend:: # ---------------------------------------------------------------------- # dependencies generated by makedepend koules1.4/sound.h100600 37512 310 1270 6477322207 12352 0ustar rootroot/* * sound.h - Platform Independant Sound Support - Dec. 1994 * * Copyright 1994 Sujal M. Patel (smpatel@wam.umd.edu) * Conditions in "copyright.h" */ #if defined(SOUND) || defined(NAS_SOUND) || defined(RSOUND) #ifdef __STDC__ void init_sound (); /* Init Sound System */ int play_sound (int k); /* Play a Sound */ void maybe_play_sound (int k); /* Play sound if the last 'k' sound_completed */ void sound_completed (int k); /* Complete a sound 'k' */ void kill_sound (); /* Terminate a sound unpredictably :) */ #endif #endif /* SOUND */ koules1.4/koules.sndsrv.sun.c100600 37512 310 14201 6477322207 14657 0ustar rootroot/* * koules.sndsrv.c - VoxWare(tm) Compatible Sound - Apr. 1995 * PC Speaker Compatible Sound * This server is Linux Specific. * * Copyright 1994-1995 Sujal M. Patel (smpatel@wam.umd.edu) * Conditions in "copyright.h" * * Modified for Koules and bugfixed by Jan Hubicka */ #include #include #include #include #include #include #include #include #ifdef SOLARIS #define bzero(s,l) memset(s, 0, l) #define bcopy(s,d,l) memcpy(d,s,l) #endif char *FILENAME[] = { "/start.raw", "/end.raw", "/colize.raw", "/destroy1.raw", "/destroy2.raw", "/creator1.raw", "/creator2.raw" }; #define NUM_SOUNDS (sizeof(FILENAME)/sizeof(char*)) signed char *sound_buffer[NUM_SOUNDS]; int sound_size[NUM_SOUNDS]; int fragsize; /* Terminate: Signal Handler */ void quit () { exit (0); } void init (int argc, char **argv) { int i; char s[1024]; if (argc != 3) { printf ("This program is only executed by koules\n"); exit (1); } for (i = 0; i < NUM_SOUNDS; i++) { s[0] = 0; strcat (s, argv[1]); if (s[(int) strlen (s) - 1] == '/') FILENAME[i]++; strcat (s, FILENAME[i]); FILENAME[i] = malloc ((int) strlen (s) + 1); strcpy (FILENAME[i], s); sound_buffer[i] = NULL; sound_size[i] = 0; } signal (SIGTERM, quit); /* Setup Terminate Signal Handler */ } /* Setup DSP: Opens /dev/audio Sets fragment size to 512 Error checking */ int setup_dsp (char *dspdev) { int dsp, frag, value; int mixer; dsp = open (dspdev, O_RDWR); if (dsp < 1) { fprintf (stderr, "koules.sndsrv: Couldn't open DSP %s\n", dspdev); return -1; } fragsize = 512; return dsp; } /* This just keeps the pipe from breaking... Eventually I'll look at the koules signal handlers and just trap this. */ int do_nothing (void) { fprintf (stderr, "koules.sndsrv: doing nothing, something is broken\n"); while (1) sleep (5); } int read_sound (int k) { int i, fd, size; /*fprintf(stderr,"loading sound %d, %s\n",k,FILENAME[k]); */ fd = open (FILENAME[k], O_RDONLY); if (fd <= 0) { fprintf (stderr, "koules.sndsrv: The sound %s could not be opened\n", FILENAME[k]); sound_size[k] = -1; return (0); }; size = lseek (fd, 0, SEEK_END); sound_size[k] = (size / fragsize) + 1; /*size in fragments */ sound_buffer[k] = malloc (sound_size[k] * fragsize); if (sound_buffer[k] == NULL) { fprintf (stderr, "koules.sndsrv: couldn't malloc memory for sound\n"); sound_size[k] = -1; close (fd); return (0); }; lseek (fd, 0, SEEK_SET); read (fd, sound_buffer[k], size); close (fd); for (i = 0; i < size; i++) sound_buffer[k][i] ^= 0x80; bzero (sound_buffer[k] + size, sound_size[k] * fragsize - size); /*fprintf(stderr,"sound has been loaded, %d bytes\n",size); *//*DEBUG */ return (1); } void do_everything (int dsp) { char k; int i, j; int terminate = -1; /* Which Sound to Terminate */ int playing[16]; /* Sound numbers that we are playing */ int position[16]; /* Current position in each sound file */ int playnum = 0; /* Number of sounds currently being played */ unsigned char final[512]; /* Final Mixing Buffer */ int premix[512]; char *sample; for (;;) { terminate = -1; /* Try to open a new sound if we get an integer on the 'in' pipe */ i = read (STDIN_FILENO, &k, sizeof (k)); if (i == 0) { /* EOF on pipe means parent has closed its end */ /*fprintf(stderr,"koules.sndsrv: shutting down\n"); */ kill (getpid (), SIGTERM); }; if (i != -1) { /* there was something in the pipe */ /*fprintf(stderr,"Just read a %d from pipe\n",(int)k); *//*DEBUG */ /* Negative means terminate the FIRST sound in the buffer */ if (k < 0) { /*fprintf(stderr,"terminating sound\n"); *//*DEBUG */ terminate = 0; } else { if (sound_size[(int) k] == 0) read_sound (k); if (sound_size[(int) k] > 0 && playnum < 16) { position[playnum] = 0; playing[playnum++] = k; /*fprintf(stderr,"sound %d added to play queue\n",playnum-1); *//*DEBUG */ }; }; }; /* terminate a sound if necessary */ for (i = 0; i < playnum; i++) { if ((position[i] == sound_size[playing[i]]) || (terminate == i)) { /*fprintf(stderr,"finished playing sound %d\n",i); *//*DEBUG */ /*fprintf(stderr,"is was at position %d\n",position[i]); *//*DEBUG */ bcopy (playing + i + 1, playing + i, (playnum - i) * sizeof (int)); bcopy (position + i + 1, position + i, (playnum - i) * sizeof (int)); playnum--; i--; }; }; if (playnum) { /* Mix each sound into the final buffer */ bzero (premix, sizeof (premix)); for (i = 0; i < playnum; i++) { sample = sound_buffer[playing[i]] + position[i] * fragsize; for (j = 0; j < fragsize; j++) { premix[j] += *(sample + j); }; position[i]++; }; for (i = 0; i < fragsize; i++) final[i] = (premix[i] > 255) ? 255 : (premix[i] < -256 ? 0 : (premix[i] >> 1) + 128); } else { /* We have no sounds to play Just fill the buffer with silence and maybe play it */ memset (final, 128, sizeof (final)); }; write (dsp, final, fragsize); /* The sound server is in a tight loop, EXCEPT for this write which blocks. Any optimizations in the above code would really be helpful. Right now the server takes up to 7% cpu on a 486DX/50. */ } } void main (argc, argv) int argc; char **argv; { int dsp; fcntl (STDIN_FILENO, F_SETFL, O_NONBLOCK); init (argc, argv); dsp = setup_dsp (argv[2]); if (!dsp) do_nothing (); do_everything (dsp); } koules1.4/Iconfig100644 37512 310 5613 6477334621 12372 0ustar rootroot/* RUN xmkmf -a; make clean AFTER CHANGING THIS FILE! */ /* comment folloving out if you want to disable network support It is experimantal and may cause some problems..*/ #define NETWORK /* comment following to disable mit shared memory support mitshm now works on all X servers with shared images support with depth 8,16,24,32. Fastest is in 8bpp mode. great speedup better intro etc.. mitshm support is now automatically diabled for aix*/ #define MITSHM /* have usleep? Some unixes don't have this call...so we have to use my emulation If you are unsure try to leave it commented out. My emulation works on most unixes*/ /*#define HAVEUSLEEP*/ /* for network audio server(supported by most unixes)*/ /* It does not sound as well as built in driver ... koules uses too much sounds*/ /*#define NAS_SOUND*/ /*comented=use own sounds server(linux,freebsd,sun,hpux,sgi)*/ /* for rplay deamon(supported by most unixes)*/ /* it is now in experimental ... also does not sounds very well*/ /*#define RSOUND*/ /* linux joystick support Now compiles w/o joystick toolkit. For using joystick support is joystick toolikit required...of course */ /*#define JOYSTICK*/ /*for fast 386 based assembler routines recomended for linux*/ /*#define I386ASSEMBLY*/ /* directories*/ KOULESDIR =/usr/bin/X11 SOUNDDIR =/usr/local/lib/koules MANDIR =/usr/local/man/man6 /*You need some extra libraryes for BSD sockets compatibility?*/ /* TOP_INCLUDES = /* Sun users with GCC need this */ /* EXTRALIB = -ldnet_stub /* DEC/OSF1 DECnet library required */ /* EXTRALIB = -lsocket -lnsl /* Solaris needs these */ /* EXTRALIB = /* normal */ DEPLIBS = $(DEPXLIB) INCLUDES = -Ixlib SUBDIRS = xlib #if defined(LinuxArchitecture) SYSDEFS = -Wall -fomit-frame-pointer -O6 -ffast-math #if !defined(NAS_SOUND)&&!defined(RSOUND) #define SOUND SOUNDSERVER = koules.sndsrv.linux SOUNDOBJS = sound.o SOUNDDEV = /dev/dsp #endif #endif #if defined(HPArchitecture) SYSDEFS = +O3 -Ae #if !defined(NAS_SOUND)&&!defined(RSOUND) #define SOUND SOUNDSERVER = koules.sndsrv.hp SOUNDOBJS = sound.o SOUNDDEV = /dev/audio #endif #endif #if defined(SGIArchitecture) SYSDEFS = #if !defined(NAS_SOUND)&&!defined(RSOUND) #define SOUND SOUNDSERVER = koules.sndsrv.sgi SOUNDOBJS = sound.o EXTRA_LOAD_FLAGS = -laudio #endif #endif #if defined(SunArchitecture) SYSDEFS = #if !defined(NAS_SOUND)&&!defined(RSOUND) #define SOUND SOUNDSERVER = koules.sndsrv.sun SOUNDOBJS = sound.o SOUNDDEV = /dev/audio #endif #endif #if defined(FreeBSDArchitecture) SYSDEFS = #if !defined(NAS_SOUND)&&!defined(RSOUND) #define SOUND SOUNDSERVER = koules.sndsrv.freebsd SOUNDOBJS = sound.o SOUNDDEV = /dev/dsp #endif #endif #if defined(AIXArchitecture) SYSDEFS = SOUNDSERVER = SOUNDOBJS = #undef MITSHM /*aix doesnt support mitshm*/ #endif koules1.4/Makefile.hpux100644 37512 310 7044 6477322207 13511 0ustar rootroot#this is only for very very old hpux #for newer ise imakefile!! #uncoment this to enable network support NET = -D NETSUPPORT #uncoment this for use shared memory SHM = -D MITSHM #uncoment following if you have internal compiler error problems #CCBUG = -DAVOID_HPUX_CC_BUG #don`t add / and spaces at end of path! #the directories SOUNDDIR = /usr/local/lib/koules BINDIR = /usr/bin/X11 MANDIR = /usr/man/man6 #uncoment following three lines for linux sound support SOUND = -D SOUND SOUNDSERVER = koules.sndsrv.hp INSTALLSOUND = True SOUNDOBJS = sound.o SOUNDDEV = /dev/audio INSTALL = cp CC = cc OPTIMIZE = -I/usr/lib/X11R6 -L/usr/lib/X11R5 -L/usr/lib/X11R4 -Ixlib $(CCBUG) +O3 -n CFLAGS = $(DEFINES) $(SHM) -DSOUNDDIR="\"$(SOUNDDIR)\"" $(SOUND) $(NET) \ -DSOUNDSERVER=\"$(SOUNDDIR)/$(SOUNDSERVER)\" \ -DSOUNDDIR=\"$(SOUNDDIR)\" \ -DSOUNDDEV=\"$(SOUNDDEV)\" LFLAGS = PROGS = xkoules PROGS_O = koules.o menu.o gameplan.o font.o intro.o xlib/init.o xlib/interface.o xlib/shmbitmap.o framebuffer.o cmap-x11.o util/usleep.o rcfiles.o sound.o sock.o client.o server.o objectsio.o mygetopt.o xlib/text.o xlib/font8x8.o PROGS_C = koules.c menu.c gameplan.c font.c intro.c xlib/init.c xlib/interface.c xlib/shmbitmap.c framebuffer.c cmap-x11.c util/usleep.c rcfiles.c sound.c sock.c client.c server.c objectsio.c nygetopt.c xlib/text.c xlib/font8x8.c LIBS = -L /usr/X11R6/lib -lX11 -lXext all: progs $(SOUNDSERVER) progs : $(PROGS) objs: $(PROGS_O) .c.o: $(CC) $(CFLAGS) $(OPTIMIZE) -c -o $*.o $< .c.s: $(CC) $(CFLAGS) $(OPTIMIZE) -S -o $*.s $< .o: $(CC) $(CFLAGS) $(OPTIMIZE) $(LFLAGS) -o $* $*.o $(LIBS) chmod a+rs,go-w $* font.o: font.c @echo please be patient. @echo the font.c is big and ugly i ripped it from zgv. @echo do you know about better one? $(CC) $(OPTIMIZE) $(CFLAGS) -c $< koules.o: koules.c $(CC) $(OPTIMIZE) $(CFLAGS) -c $< koules.sndsrv.hp.o: koules.sndsrv.hp $(CC) $(OPTIMIZE) $(CFLAGS) -c $< xkoules: $(PROGS_O) $(CC) $(OPTIMIZE) $(CFLAGS) $(LFLAGS) -o xkoules $(PROGS_O) $(LIBS) -lm install: $(PROG) $(SOUNDSERVER) @echo "Koules directory is " $(BINDIR) @: @echo "Instalin man page to " $(MANDIR) $(INSTALL) $(INSTBINFLAGS) xkoules $(MANDIR); @: @echo "Creating directory " $(BINDIR) @if [ ! -d $(BINDIR) ]; then mkdir $(BINDIR); fi $(INSTALL) $(INSTBINFLAGS) xkoules $(BINDIR) @: @if [ "$(INSTALLSOUND)" = "True" ]; \ then \ echo "Creating directory " $(SOUNDDIR); \ if [ ! -d $(SOUNDDIR) ]; then mkdir $(SOUNDDIR); fi; \ echo "Copying sound server to directory " $(SOUNDDIR); \ $(INSTALL) $(INSTBINFLAGS) $(SOUNDSERVER) $(SOUNDDIR); \ echo "Copying sound files into directory " $(SOUNDDIR); \ cd ./sounds; set -x; \ for file in *.raw; do \ $(INSTALL) $(INSTDATFLAGS) $$file $(SOUNDDIR); \ done; \ fi clean: rm -f xkoules rm -f core `find . -name '*.[oas]' -print` rm -f core `find . -name '*~' -print` rm -f core `find . -type f -name 'core' -print` lint: lint -Ixlib $(PROGS_C) -D_INCLUDE_HPUX_SOURCE -D_INCLUDE_POSIX_SOURCE -Ixlib -D_INCLUDE_XOPEN_SOURCE koules.o: koules.c koules.h menu.o: menu.c koules.h gameplan.o: gameplan.c koules.h font.o: font.c font.h koules.h intro.o: intro.c koules.h font.h text.h init.o: xlib/init.c xlib/../koules.h xlib/../framebuffer.h framebuffer.o: framebuffer.c koules.h cmap.o: cmap.c koules.h koules.h:xlib/interface.h xlib/input.h koules1.4/README100644 37512 310 54644 6501007702 11762 0ustar rootroot // // /// // // // ///// /// . // // // // // // // // // . //// // // // // // //// /// // // // // // // // // // // // //// //// ///// ///// /// * . v1.4 by . . . // /// // // // // /////////////////////// . // // // // // // // // // // ///// ///// // // // /// ///// ///// * /// // // // // //// // // // // // // // // //// // . ////////////////////////// /// // // . . THIS PROGRAM IS FREEWARE . * ^ . . / \ * . . . / \ * . / \ . . . * / \ . / \ . . / \ . / \ . * . / CREDITS \ * . / --------- \ . * . / \ Sounds by Jan Hubicka . . . Graphics by Jan Hubicka and Kamil Toman . * Programming by Jan Hubicka Joystick support by Ludvik Tesar . HP-UX sound by Lutz Vieweg OS/2 version by Thomas A. K. Kjaer . * Story by Kamil Toman and Jan Hubicka * Script by Kamil Toman and Jan Hubicka . English Spelling checked by Thomas Marsh SGI sound and creator effect by Rick Sayre . Sound servers by Joe Rumsey and S. M. Patel / \ . / INTRODUCTION: \ / --------------- \ * Koules is a fast action arcade-style game for UNIX and OS/2. This version supports X window system, SVGAlib for Linux and OS/2. It works in fine resolution. (up to 900x620) with cool 256 color graphics, multi-player mode up to 5 players, full sound and, of course, network support. Koules is an original idea. The first version of Koules was / developed from scratch by Jan Hubicka in July 1995. \ . / \ / REQUIREMENTS: \ / --------------- \ It runs well on computers which can be marked as faster than a 386DX/40 with math coprocessor (320x200 resolution) or 486DX2/50 (640x480 resolution). HOMEPAGE: --------- http://www.paru.cas.cz/~hubicka/koules/English/koules.html INSTALL: -------- In order to install Koules 1.4 you must do the following: (If you encounter any problems read `Problems' and `Koules.FAQ') For X11: ======== Edit the Iconfig for your computer and type: xmkmf -a make make install For SVGAlib: ============ You MUST be 'root' to install the game. Edit the Makefile.svgalib for your computer and type: make -f Makefile.svgalib make -f Makefile.svgalib install For HP-UX wo imake: =================== Edit the Makefile.hpux for your computer and type: make -f Makefile.hpux make -f Makefile.hpux install For OS/2: ========= Who cares?! :) Widows 95*: ============ Heavens no Koules ... *Widows 95 is a shitmark of Macro$oft USAGE: ------ xkoules [-SxslMmpdh] -h for help -s for small display(320x250) for slow machines -l for large display(640x480) default size -E extra large display size (900x620) -m for monochrome mode -b for black and white mode -p use private colormap use only if 'Could not allocate colormap' error is reported -y Synchronize with X use only for debugging -f Disable palette fading -d Disable sound support Game will run faster. -x Disable X11 pointer Use the game's own cursor when standard X11's cursor is blinking -M DISABLE shared memory support Slow down the game. Use only if shared memory support crashes. koules.svga [-slMmdh] -h for help -s for small display(320x200) for worse machines -l for large display(640x480) default size -M disable mouse support avoid gpm/selection conflict -d Disable sound support Game will run faster. Network options(common for both versions) -C run koules as network client -S run koules as network server -P select port. Default is:12345 Use this in case that some other program is already using this port. Server options: -W run server in width mode-support for 320x200 svgalib and OS/2 clients. Use this in case that server is refusing your clients. -L select level for server -D select dificulty for server: 0: nightmare 1: hard 2: medium(default and really, really recomended) 3: easy 4: very easy -K run server in deathmatch mode -E extra large display size (900x620) MENU SYSTEM: look at this simple hypertext diagram to understand them: /----------------+ START GAME (---+ +--+ | X PLAYER ---)--^------+ | +-------------+ CONTROL----/ | | | GAME MODE------^---------^-----------------^------------------------------+ DIFFICULTY-----^---------^-----------------^----------------------------+ | SOUND ON/OFF---^---------^-----------------^---------------------------+| | QUIT-----------^---------^-----------------^--------------------------+|| | | | | ||| | +--------------+ | | ||| | | +--------------+ | ||| | +----Start game (The fun is begins) | | ||| | | | ||| | +---------------------------------------+stip to (1) (1)||| | | | ||| | +----Select number of players (up to 5 player are possible) !!!!! | ||| | | ||| | +-------------------------------------------------------------------+ ||| | | ||| | PLAYER 1:(CONTROL MODE)------+ ||| | (CONTROL OPTIONS)------------^---+ ||| | PLAYER 2:(CONTROL MODE)------+ | ||| | (CONTROL OPTIONS)------------^---+----------------------------------+ ||| | PLAYER 3:(CONTROL MODE)------+ | | ||| | (CONTROL OPTIONS)------------^---+ | ||| | | | | | ||| | v | \ | ||| | PLAYER 5:(CONTROL MODE)------+-----)---+ | ||| | (CONTROL OPTIONS)-----------------/ | | ||| | | | ||| | +--------------------------------------+ | ||| | | | ||| | Possible selections: | ||| | KEYBOARD---------------------------------------------------------+ | ||| | ROTATION KEYBOARD----------------------------------------------+ | | ||| | MOUSE--------------------------------------------------------+ | | | ||| | JOYSTICK A button *----------------------------------------+ | | | | ||| | JOYSTICK B button *--------------------------------------+ | | | | | ||| | JOYSTICK A deflection *--------------------------------+ | | | | | | ||| | JOYSTICK B deflection *------------------------------+ | | | | | | | ||| | | | | | | | | | ||| | *)available only when JOYSTICK support enabled | | | | | | | | ||| | +----------------------------------------------------+ | | | | | | | ||| | | | | | | | | | ||| | use second Joystick to control player. | | | | | | | ||| | use deflection of stick to control | | | | | | | ||| | both direction and acceleration | | | | | | | ||| | see also JOYSTICK SUPPORT,CONTROL OPTIONS | | | | | | | ||| | +------------------------------------------------------+ | | | | | | ||| | | | | | | | | ||| | use first Joystick to control player. | | | | | | ||| | use deflection of stick to control | | | | | | ||| | both direction and acceleration | | | | | | ||| | see also JOYSTICK SUPPORT,CONTROL OPTIONS | | | | | | ||| | +--------------------------------------------------------+ | | | | | ||| | | | | | | | ||| | use second Joystick to control player. | | | | | ||| | use deflection of stick to control direction | | | | | ||| | use joystick button to accelerate | | | | | ||| | see also JOYSTICK SUPPORT,CONTROL OPTIONS | | | | | ||| | +----------------------------------------------------------+ | | | | ||| | | | | | | ||| | use first Joystick to control player. | | | | ||| | use deflection of stick to control direction | | | | ||| | use joystick button to accelerate | | | | ||| | see also JOYSTICK SUPPORT,CONTROL MODE | | | | ||| | +------------------------------------------------------------+ | | | ||| | | | | | ||| | use mouse to control player. | | | ||| | use pointer to rotate and button to accelerate | | | ||| | mouse must be configured in | | | ||| | usr/local/lib/libvga.conf read this file for more | | | ||| | informations. | | | ||| | use arrow to rotate player and button to accelerate. | | | ||| | mouse can be also use to control menus! | | | ||| | there are no CONTROL OPTIONS supported | | | ||| | +--------------------------------------------------------------+ | | ||| | | | | ||| | use keyboard to control player | | ||| | 3 keys are used:ACCELERATE,ROTATE LEFT,ROTATE RIGHT | | ||| | note:there are no predefined settings! use CONTROL OPTIONS | | ||| | to set keys! | | ||| | see also: CONTROL OPTIONS , KEYBOARD PROBLEM | | ||| | +----------------------------------------------------------------+ | ||| | | | ||| | use keyboard to control player | ||| | 4 keys are used:LEFT RIGHT UP AND DOWN | ||| | there are predefined settings: | ||| | player 1:cursor box | ||| | player 2:Arrows on keypad. | ||| | player 3: there are no predefined settings! use CONTROL OPTIONS | ||| | player 4: there are no predefined settings! use CONTROL OPTIONS | ||| | see also: CONTROL OPTIONS , KEYBOARD PROBLEM | ||| | +-------------------------------------------------------------------+ ||| | | ||| | (CONTROL OPTIONS)may be on of following: ||| | CHANGE KEYS-------------------+ ||| | CALIBRATE JOYSTICK A-------+ | ||| | CALIBRATE JOYSTICK B----+ | +---------------------------------+ ||| | | +---------------------------------+ | ||| | +-----------------------+ | | ||| | select it to calibrate second joystick. | | ||| | if you still see same menu your joystick is broken | | ||| | or joystick toolkit is not initialized(see JOYSTICK SUPPORT) | | ||| | otherwise you will see: | | ||| | Move joystick to lower right corner | | ||| | look at your joystick: | | ||| | (it is usually futuristic designed black thing) | | ||| | there is black stick. | | ||| | get it and move it into lower right corner.then press | | ||| | red button on joystick or space key. | | ||| | | | ||| | then you will see: | | ||| | Center joystick | | ||| | and press either button or space | | ||| | | | ||| | Place joystick on your desk.center the stick. | | ||| | and smoothly and slowly press space key. | | ||| | +------------------------------------------------------------+ | ||| | | | ||| | select it to calibrate first joystick. | ||| | if you still see same menu your joystick is broken | ||| | or joystick toolkit is not initialized(see JOYSTICK SUPPORT) | ||| | otherwise you will see: | ||| | Move joystick to lower right corner | ||| | look at your joystick: | ||| | (it is usually futuristic designed black thing) | ||| | there is black stick. | ||| | get it and move it into lower right corner.then press | ||| | red button on joystick or space key. | ||| | | ||| | then you will see: | ||| | Center joystick | ||| | and press either button or space | ||| | | ||| | Place joystick on your desk.center the stick. | ||| | and smoothly and slowly press space key. | ||| | +---------------------------------------------------------------+ ||| | | ||| | define your keys: ||| | if you see ACCELERATION skip to b) ||| | if you see UP skip to a) ||| | a)you have selected KEYBOARD ||| | press a key what you want use to move up ||| | then you will see: ||| | DOWN ||| | press a key what you want use to move down ||| | then you will see: ||| | LEFT ||| | press a key what you want use to move left ||| | then you will see: ||| | RIGHT ||| | press key what you want use to move right ||| | then a you will see: ||| | see also:KEYBOARD PROBLEMS ||| | b)you have selected ROTATION KEYBOARD ||| | press a key what you want use to accelerate ||| | then you will see: ||| | ROTATE LEFT ||| | press a key what you want use to rotate left ||| | then you will see: ||| | ROTATE RIGHT ||| | press a key what you want use to rotate right ||| | then you will see: ||| | see also:KEYBOARD PROBLEMS ||| | +---------------------------------------------------------------------+|| | | || | back to the reality || | NOT RECOMMENDED!!!! VERY DANGEROUS || | RISK OF THE PSYCHICAL ( PHYSICAL ? ) SHOCK || | +----------------------------------------------------------------------+| | | | | turns the space sound on/off | | +-----------------------------------------------------------------------+ | menu: | EASY----------------------------+ | MEDIUM------------------+ | | HARD-------------+ | | | | | | | +----------------+ | | | | | | | only for professionals! | | | +-----------------------+ | | | | | recommended mode | | +-------------------------------+ | | | less fun | +-------------------------------------------------------------------------+ | menu: DEATH MATCH(doom)---------------+ COOPERATIVE---------+ | | | +-------------------+ | | | default mode. | operates in both | multi-player and | mono-player modes | 100 levels! | +-------------------------------+ | for doom maniacs -try to kill each other and stay alive! VERY VERY EASY, isn't it? ;) ----- / \ | o | o | ===========================OO==============OO============================= PC KEYBOARD PROBLEMS ---------------------- If you feel weak go away! I have to tell you a story about stupidity of your keyboard controller. Once upon a time ?BM (alias Little Yellow) made a stupid keyboard which is not able to handle more than 4 keys at a time... ... and they lived happily ever after. JOYSTICK SUPPORT (linux only) ------------------ Requires joystick toolkit. Koules must be compiled with joystick support (see the file "Iconfig" for X-version and "Makefile.svgalib" for svga version) Maybe, that you have newer kernel than I have, and you don't need to install joystick toolkit, you only need to add joystick support in configuration menu of kernel and then to recompile kernel and kernel modules. If not you must download joystick toolkit archive "joystick-0.8.0.tar.gz", and install it. To summarize only briefly an installation (as root): cd /usr/src tar -xzf joystick-0.8.0.tar.gz cd joystick-0.8.0 make joystick.o cp joystick.o /lib/modules/2.0.??/ echo alias char-major-15 joystick >>/etc/conf.modules shutdown -r now We are assuming that you have "/sbin/depmod -a" and "/sbin/kerneld" in your startup files. The daemon "kerneld" should load module joystick.o automatically, when needed. Use "js 0" or "js 1" for testing. If it doesn't work, load joystick module manually: insmod joystick.o and watch screen. You must see: js_init: found joysticks number must be 1 or 2!!! If daemon kerneld loaded it automatically and syslogd is running, the "js_init" message should be in log file (usually /var/log/messages). SOUND SUPPORT --------------- LINUX: koules support voxware sound driver and pcsnd pcspeaker driver. Other architectures: OS/2, Free BSD, HP-UX, SUN, SGI FAQ ----- Q: Sounds not running. A: You entered invalid path edit makefile. Note on spaces and / at end of path. Q: Why this stupid game don't run on my machine? A: Your stupid machine is not supported. Buy another one. Q: Why game run s l o w l y ? A: Try 320x200 or 320x250 version. Q: Why game still run s l o w l y ? A: Buy sextium ;) see Koules.FAQ for more COPYING --------- Copyright (C) 1995 - 1998 Jan Hubicka and Kamil Toman 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. BUGS ------ There is bug in my svgalib.1.2.8 and earlier: switch to another console, switch back and press enter it will crash your computer.It is not koules bug!!! Test it on svgalib/demos/keytest! Koules from the top: . --- . . O / \ . . | | . . .. --- \ / / \ X O --- | O| \ O/ --- --- . O /O O\ . . . . | | . . . \ / . .X. . O --- . . . . . . . . ... . . . . . . . . . . . H A V E FUN ! please send a note to my e-mail address so I know how many people play Koules. send any comments, problems, suggestions, donations, flames, ideas for KoulesII email: hubicka@freesoft.cz smail: Jan Hubicka Dukelskych bojovniku 1944 Tabor 39001 Czech Republic koules1.4/Koules.FAQ100644 37512 310 12161 6477322207 12675 0ustar rootrootGENERAL: [Q] - What is Koules [Q] - What does 'Koules' mean? [Q] - Who makes Koules and how can I get in touch with them? [Q] - Where can I obtain Koules? [Q] - What is the latest version of Koules? [Q] - Will Koules ever be ported to DOS? [Q] - What are the point values [Q] - How can I pause or abort a game of Koules? [Q] - What is the optimal control configuration for playing Koules? [Q] - How many levels are in Koules [Q] - How much time I need to complete Koules? [Q] - Do you have any hints or tips for playing Koules? X11: [Q] - What version of X11 do I need? LINUX: [Q] - Do I need a sound card? [Q] - What version of kernel svgalib and X11 do I need? HISTORY: [Q] - How long did it take to create Koules? ---------- 8< ---------- 8< ---------- 8< ---------- 8< ---------- 8< --------- GENERAL [Q] - What is Koules [A] - Koules is an action funny game for Unix/X11, linux/svgalib and OS/2. It supports multi-player mode, high resolution, digitized sound, mouse joystick, up to 640x480 resolution with cool 256 color graphics. 100 levels, intro / outro etc Koules is an original game. It was developed from scratch by Jan Hubicka in july 1995 [Q] - What does 'Koules' mean? [A] - Koules is an English plural of the Czech word 'koule'(= sphere) [Q] - What computer do I need in order to play Koules? [A] - Koules runs unix machines, running X11 or svgalib 1.2.5+. For 640x480 you need computer faster than 486/50. 320x200 works fine on 386/40 with coprocessor [Q] - Who makes Koules and how can I get in touch with them? [A] - Koules is published as freeware under GPL by Jan Hubicka My Address: JAHUSOFT Jan Hubicka Dukelskych Bojovniku 1944 390 03 Tabor Czech Republic Phone: 0041-361-32613 eMail: hubicka@limax.paru.cas.cz [Q] - Where can I obtain Koules? [A] - The latest version of Koules is always on the following sites: limax.paru.cas.cz:/pub/linux/games/koules sunsite.unc.edu :/pub/linux/games/video tsx-11.mit.edu :/pub/linux/sources/usr.games :/pub/linux/binaries/usr.games [Q] - What is the latest version of Koules? [A] - The current version of Koules is 1.4. [Q] - Will Koules ever be ported to DOS? [A] - Maybe, maybe never [Q] - What are the point values [A] - Bounce something : +1 Eat extension : +10 At end of level every live : +20 every lost level : -100 In deathmatch mode every destroyed competitor: +100 [Q] - How can I pause or abort a game of Koules? [A] - You may stop game by: pressing P switching to other window iconifing Press ESC to abort Koules [Q] - What is the optimal control configuration for playing Koules? [A] - I personally prefer cursor keys. There is problem with PC keyboard in more than two players mode. PC keyboard controller may crash if you press more than 3 keys following configuration works fine in 3 players mode: player 1: player 2: <,> player 3: <1> <2> <3> <5> (keypad) [Q] - How many levels are in koules [A] - 99+1 (bonus level:). [Q] - How much time I need to complete koules? [A] - stupid player: a month worse player: 5 1/4 hours average player: 2 1/2 hours My friend and me: 50 minutes god: 1/1000000 ns (Medium difficulty) [Q] - Do you have any hints or tips for playing Koules? [A] - Standard KOULES fighters: - fly near boarders (they may not be able to keep in the screen) - wait near the border, when they are near fly around them, and kick them out. - keep in the center - Standard B_BALLS: - hide behind holes - try to fly around magnetic holes ( B_BALLS may fall into ) - Inspectors: - wait behind them B_BALLS would kick them out ---------- 8< ---------- 8< ---------- 8< ---------- 8< ---------- 8< --------- X11 [Q] - What version of X11 do I need? [A] - X11R4 for xlib support X11R5 for mit shared memory support ---------- 8< ---------- 8< ---------- 8< ---------- 8< ---------- 8< --------- LINUX [Q] - Do I need a sound card? [A] - You may play without sound or with sound using pcsnd driver [Q] - What version of kernel svgalib and X11 do I need? [A] - Linux Koules was developed using the 1.3 series kernel, SVGAlib version 1.2.6-7 and XFree86 version 3.2. It should run with any stable series Linux kernel that includes the VoxWare sound driver. ---------- 8< ---------- 8< ---------- 8< ---------- 8< ---------- 8< --------- HISTORY [Q] - How long did it take to create Koules? [A] - The initial (1.0) version of Koules took approximately 2 days of coding and two weeks of tuning, playing and creating intro Version 1.1 took one week Version 1.1b took one hour Version 1.1c took Three days Version 1.2 took four days and two weeks of testing Version 1.3 took two minutes :) Version 1.4 took two years koules1.4/menu.c100644 37512 310 51546 6501007507 12213 0ustar rootroot/*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * menu.c * * GUI menuing system * ***********************************************************/ /* Changes for joystick "accelerate by deflection" * * (c) 1997 by Ludvik Tesar (Ludv\'{\i}k Tesa\v{r}) * ************************LT*********************************/ #include "koules.h" #include "net.h" #include "client.h" #ifdef JOYSTICK #include #endif typedef struct { char *text; void (*func) (); } Menu; typedef struct { int x, y, *number, max, min; int line; void (*func) (); } Numbers; int ssound = 1; static Numbers minim[2], maxim[2]; static int nmenu; static int nnumbers; static Menu menu[20]; static int selected = 0; static float mx1, my1, mx1p, my1p; static float mx2, my2, mx2p, my2p; static int mtime; static char playertext[] = " 1 PLAYER"; static char leveltext[] = "LEVEL 000 "; #define YPOSITION(i) (MAPHEIGHT/2+20-5*nmenu+10*i) #define XPOSITION(i) (MAPWIDTH/2-4*strlen(menu[i].text)) #define XPOSITION1(i) (MAPWIDTH/2+4*strlen(menu[i].text)) static int player, keynum, lastplayer; #ifdef JOYSTICK static int joystick, joypos; static struct JS_DATA_TYPE js_data; #endif static void main_menu (); static void change_menu (); #ifdef JOYSTICK static void calibrate_init () { int status; long tmpl; if (joystickdevice[joystick]<0) { printf("Joystick %c not found during initialization.", joystick+'A'); joystickplayer[joystick] = -2; gamemode = MENU; change_menu (); return; } status = ioctl (joystickdevice[joystick], JS_GET_TIMELIMIT, &tmpl); if (status == -1) { perror ("Joystick"); joystickplayer[joystick] = -2; gamemode = MENU; change_menu (); return; } tmpl = 10; /* 10miliseconds */ status = ioctl (joystickdevice[joystick], JS_SET_TIMELIMIT, &tmpl); if (status == -1) { perror ("Joystick"); joystickplayer[joystick] = -2; gamemode = MENU; change_menu (); return; } } #endif static void player_change () { player = (selected - 2) / 2; lastplayer = (selected - 2) / 2; #ifdef MOUSE if (player == mouseplayer) return; #endif #ifdef JOYSTICK if (player == joystickplayer[0]) { joystick = 0; joypos = 0; gamemode = JOY; calibrate_init (); return; } if (player == joystickplayer[1]) { joystick = 1; joypos = 0; gamemode = JOY; calibrate_init (); return; } #endif keynum = 0; gamemode = KEYS; } static void control_change () { int player; player = (selected - 1) / 2; #ifdef NETSUPPORT if (client && !control[player]) return; #endif #ifdef MOUSE if(mouseplayer<0) mouseplayer=-1; if(mouseplayer>=nrockets) mouseplayer=-1; #endif #ifdef JOYSTICK if(joystickplayer[0]<0) joystickplayer[0]=-1; if(joystickplayer[0]>=nrockets) joystickplayer[0]=-1; if(joystickplayer[1]<0) joystickplayer[1]=-1; if(joystickplayer[1]>=nrockets) joystickplayer[1]=-1; #ifdef NETSUPPORT if(client && !control[joystickplayer[0]]) joystickplayer[0]=-1; if(client && !control[joystickplayer[1]]) joystickplayer[1]=-1; if (client && !control[player]) return; #endif #endif #ifdef NETSUPPORT if(client && !control[mouseplayer]) mouseplayer=-1; #endif if (rotation[player]==1) { rotation[player] = 0; #ifdef MOUSE if (mouseplayer == -1 && !nomouse) mouseplayer = player; #ifdef JOYSTICK else goto maybejoystick; /* mouse couldn't be chosen, but let's offer joystick if available*/ #endif } else if (player == mouseplayer) { mouseplayer = -1; #endif #ifdef JOYSTICK maybejoystick:; if((joystickplayer[0] == -1)&&(joystickdevice[0]>=0)) { joystickplayer[0]=player; joystickmul[0]=JOYMUL1; } else if((joystickplayer[1] == -1)&&(joystickdevice[1]>=0)) { joystickplayer[1]=player; joystickmul[1]=JOYMUL1; } } else if(player==joystickplayer[0]) { if(joystickmul[0]==JOYMUL1)joystickmul[0]=JOYMUL2; else { joystickplayer[0]=-1; if((joystickplayer[1] == -1)&&(joystickdevice[1]>=0)) { joystickplayer[1]=player; joystickmul[1]=JOYMUL1; } } } else if(player==joystickplayer[1]) { if(joystickmul[1]==JOYMUL1)joystickmul[1]=JOYMUL2; else joystickplayer[1]=-1; #endif } else if (rotation[player]==0) { rotation[player] = 1; } change_menu (); } void start () { int i; #ifdef JOYSTICK if (joystickplayer[0] >= 0 && !calibrated[0]) { joystick = 0; joypos = 0; gamemode = JOY; calibrate_init (); return; } if (joystickplayer[1] >= 1 && !calibrated[1]) { joystick = 1; joypos = 0; gamemode = JOY; calibrate_init (); return; } #endif for (i = 0; i < nrockets; i++) { object[i].score = 0; #ifdef JOYSTICK if(joystickplayer[0]==i) { object[i].joymulx = joystickmul[0]/center[0][0]; object[i].joymuly = joystickmul[0]/center[0][1]; object[i].joythresh = joystickthresh[0]; } else if(joystickplayer[1]==i) { object[i].joymulx = joystickmul[1]/center[1][0]; object[i].joymuly = joystickmul[1]/center[1][1]; object[i].joythresh = joystickthresh[1]; } #endif } sound = ssound; gamemode = GAME; gameplan_init (); init_objects (); } static void playerchange () { /* nrockets++; if (nrockets > 5) nrockets = 1; */ playertext[1] = nrockets + '0'; } static void levelchange () { sprintf (leveltext, "LEVEL %03i ", lastlevel + 1); } static void quit () { #ifdef NETSUPPORT if (client) CQuit ("Selected quit in main menu"); #endif uninitialize (); exit (0); } static void fit_selector () { mtime = MENUTIME; mx1p = (XPOSITION (selected) - 2 - mx1) / mtime; mx2p = (XPOSITION1 (selected) + 1 - mx2) / mtime; my1p = (YPOSITION (selected) - 2 - my1) / mtime; my2p = (YPOSITION (selected) + 8 + 0 - my2) / mtime; } static void to_main_menu () { save_rc (); main_menu (); } static void change_menu () { static char s[2][5][40], *s1; int i; #ifdef NETSUPPORT if (client) { menu[0].text = "START GAME"; menu[0].func = start_game; } else #endif { menu[0].text = "BACK TO MAIN MENU"; menu[0].func = to_main_menu; } nnumbers = 0; for (i = 0; i < nrockets; i++) { #ifdef NETSUPPORT if (control[i] == 0 && client) s1 = "REMOTE"; else #endif #ifdef MOUSE if (i == mouseplayer) s1 = "MOUSE"; else #endif #ifdef JOYSTICK if (i == joystickplayer[0]) { if(joystickmul[0]==JOYMUL1)s1 = "JOYSTICK A button"; else s1 = "JOYSTICK A deflection"; } else if (i == joystickplayer[1]) { if(joystickmul[1]==JOYMUL1)s1 = "JOYSTICK B button"; else s1 = "JOYSTICK B deflection"; } else #endif if (rotation[i]) s1 = "ROTATION KEYBOARD"; else s1 = "KEYBOARD"; sprintf (s[0][i], "PLAYER %i:%s", i + 1, s1); #ifdef NETSUPPORT if (control[i] == 0 && client) sprintf (s[1][i], " "); else #endif #ifdef JOYSTICK if (i == joystickplayer[0]) sprintf (s[1][i], "CALIBRATE"); else if (i == joystickplayer[1]) sprintf (s[1][i], "CALIBRATE"); else #endif #ifdef MOUSE if (i == mouseplayer) sprintf (s[1][i], " "); else #endif sprintf (s[1][i], "CHANGE KEYS"); menu[i * 2 + 1].text = s[0][i]; menu[i * 2 + 2].text = s[1][i]; menu[i * 2 + 1].func = control_change; menu[i * 2 + 2].func = player_change; } nmenu = nrockets * 2 + 1; if (selected >= nmenu) selected = 0; fit_selector (); } static void deathmatch () { gameplan = DEATHMATCH; main_menu (); } static void cooperative () { gameplan = COOPERATIVE; main_menu (); } static void setsound () { #ifdef SOUND if (sndinit) ssound = !ssound; #endif main_menu (); } static void veryhard () { difficulty = 0; main_menu (); } static void hard () { difficulty = 1; main_menu (); } static void medium () { difficulty = 2; main_menu (); } static void easy () { difficulty = 3; main_menu (); } static void veryeasy () { difficulty = 4; main_menu (); } static void change_mode () { nnumbers = 0; menu[0].text = "DEATH MATCH(DOOM)"; menu[0].func = deathmatch; menu[1].text = "COOPERATIVE"; menu[1].func = cooperative; nmenu = 2; selected = 1; fit_selector (); } static void change_obtiznost () { menu[0].text = "NIGHTMARE"; menu[0].func = veryhard; menu[1].text = "HARD"; menu[1].func = hard; menu[2].text = "MEDIUM"; menu[2].func = medium; menu[3].text = "EASY"; menu[3].func = easy; menu[4].text = "VERY EASY"; menu[4].func = veryeasy; nnumbers = 0; nmenu = 5; selected = 2; fit_selector (); } static void nmain_menu () { nnumbers = 2; nmenu = 8; menu[0].text = "START GAME"; menu[0].func = start; menu[1].text = playertext; menu[1].func = playerchange; minim[0].x = XPOSITION (1); minim[0].y = YPOSITION (1); minim[0].line = 1; minim[0].number = &nrockets; minim[0].max = 5; minim[0].min = 1; minim[0].func = playerchange; maxim[0].x = XPOSITION (1) + 8 * 2; maxim[0].y = YPOSITION (1); maxim[0].line = 1; maxim[0].number = &nrockets; maxim[0].max = 5; maxim[0].min = 1; maxim[0].func = playerchange; playerchange (); levelchange (); menu[2].text = leveltext; menu[2].func = playerchange; minim[1].x = XPOSITION (2) + 7 * 7; minim[1].y = YPOSITION (2); minim[1].line = 2; minim[1].number = &lastlevel; minim[1].max = maxlevel; minim[1].min = 0; minim[1].func = levelchange; maxim[1].x = XPOSITION (2) + 11 * 7; maxim[1].y = YPOSITION (2); maxim[1].line = 2; maxim[1].number = &lastlevel; maxim[1].max = maxlevel; maxim[1].min = 0; maxim[1].func = levelchange; nnumbers = 2; menu[3].text = "CONTROL"; menu[3].func = change_menu; menu[4].text = "GAME MODE"; menu[4].func = change_mode; menu[5].text = "DIFFICULTY"; menu[5].func = change_obtiznost; #ifdef SOUND menu[6].text = ssound ? "SOUND ON" : (sndinit ? "SOUND OFF" : "SOUND OFF-NOT INITIALIZED"); #else menu[6].text = "SOUND OFF(NOT AVAIABLE)"; #endif menu[6].func = setsound; menu[7].text = "QUIT"; menu[7].func = quit; selected = 0; fit_selector (); } /***************************************************************************/ #ifdef NETSUPPORT extern void register_players (); extern void start_game (); int nplayers = 1, maxnplayers = 5; static void nplayerchange () { playertext[1] = nplayers + '0'; } void setnplayers (int n) { nrockets = n; maxnplayers = MAXROCKETS - nrockets; if (minim[0].number == &nplayers) { minim[0].max = maxnplayers; if (nplayers > maxnplayers) nplayers = maxnplayers; } nplayerchange (); } void cmenu2 (unsigned char *message, int size) { printf ("entering change menu"); change_menu (); gamemode = MENU; } static void cmain_menu () { nnumbers = 1; nmenu = 4; menu[0].text = "REGISTER PLAYERS"; menu[0].func = register_players; menu[1].text = playertext; menu[1].func = nplayerchange; minim[0].x = XPOSITION (1); minim[0].y = YPOSITION (1); minim[0].line = 1; minim[0].number = &nplayers; minim[0].max = maxnplayers; minim[0].min = 1; minim[0].func = nplayerchange; maxim[0].x = XPOSITION (1) + 8 * 2; maxim[0].y = YPOSITION (1); maxim[0].line = 1; maxim[0].number = &nplayers; maxim[0].max = maxnplayers; maxim[0].min = 1; maxim[0].func = nplayerchange; nplayerchange (); #ifdef SOUND menu[2].text = ssound ? "SOUND ON" : (sndinit ? "SOUND OFF" : "SOUND OFF-NOT INITIALIZED"); #else menu[2].text = "SOUND OFF(NOT AVAIABLE)"; #endif menu[2].func = setsound; menu[3].text = "QUIT"; menu[3].func = quit; selected = 0; fit_selector (); } #endif /***************************************************************************/ static void main_menu () { #ifdef NETSUPPORT if (client) cmain_menu (); else #endif nmain_menu (); } void init_menu () { mx1 = 10; mx2 = MAPWIDTH - 10; my2 = 10; my2 = MAPHEIGHT - 10; ssound = sound; playertext[1] = nrockets + '0'; main_menu (); } void draw_menu (CONST int draw) { int i; sound = 0; if (draw) { levelchange (); DrawRectangle ((int) mx1, (int) my1, (int) mx2, (int) my2, ball (2)); DrawRectangle ((int) mx1 + 1, (int) my1 + 1, (int) mx2 + 1, (int) my2 + 1, ball (20)); DrawBlackMaskedText (MAPWIDTH / 2 - 8 * 4 + 1, 1, "THE GAME"); DrawBlackMaskedText (MAPWIDTH / 2 - 10 * 4 + 1, 11, "K O U L E S"); DrawBlackMaskedText (MAPWIDTH / 2 - 2 * 4 + 1, 21, "BY"); DrawBlackMaskedText (MAPWIDTH / 2 - 8 * 4 + 1, 31, "JAHUSOFT"); DrawBlackMaskedText (MAPWIDTH / 2 - 30 * 4 + 1, 46, "PRESS P FOR PAUSE / H FOR HELP"); #ifdef __OS2__ DrawBlackMaskedText (MAPWIDTH / 2 - 28 * 4, 40, "OS/2 Warp VERSION BY T.A.K.K"); #endif DrawWhiteMaskedText (MAPWIDTH / 2 - 8 * 4, 0, "THE GAME"); DrawWhiteMaskedText (MAPWIDTH / 2 - 10 * 4, 10, "K O U L E S"); DrawWhiteMaskedText (MAPWIDTH / 2 - 2 * 4, 20, "BY"); DrawWhiteMaskedText (MAPWIDTH / 2 - 8 * 4, 30, "JAHUSOFT"); DrawWhiteMaskedText (MAPWIDTH / 2 - 30 * 4, 45, "PRESS P FOR PAUSE / H FOR HELP"); #ifdef __OS2__ DrawWhiteMaskedText (MAPWIDTH / 2 - 28 * 4, 40, "OS/2 Warp VERSION BY T.A.K.K"); #endif for (i = 0; i < nnumbers; i++) { Line (minim[i].x, minim[i].y + 3, minim[i].x + 6, minim[i].y + 3, ball (2)); Line (minim[i].x + 3, minim[i].y + 0, minim[i].x, minim[i].y + 3, ball (2)); Line (minim[i].x + 4, minim[i].y + 0, minim[i].x + 1, minim[i].y + 3, ball (2)); Line (minim[i].x + 3, minim[i].y + 6, minim[i].x, minim[i].y + 3, ball (2)); Line (minim[i].x + 4, minim[i].y + 6, minim[i].x + 1, minim[i].y + 3, ball (2)); Line (maxim[i].x + 2, maxim[i].y + 3, maxim[i].x + 8, maxim[i].y + 3, ball (2)); Line (maxim[i].x + 5, maxim[i].y + 0, maxim[i].x + 8, maxim[i].y + 3, ball (2)); Line (maxim[i].x + 4, maxim[i].y + 0, maxim[i].x + 7, maxim[i].y + 3, ball (2)); Line (maxim[i].x + 5, maxim[i].y + 6, maxim[i].x + 8, maxim[i].y + 3, ball (2)); Line (maxim[i].x + 4, maxim[i].y + 6, maxim[i].x + 7, maxim[i].y + 3, ball (2)); } for (i = 0; i < nmenu; i++) { DrawBlackMaskedText ((int) XPOSITION (i) + 1, (int) YPOSITION (i) + 1, menu[i].text); DrawWhiteMaskedText ((int) XPOSITION (i), (int) YPOSITION (i), menu[i].text); } } if (mtime) { mtime--; my1 += my1p; mx1 += mx1p; my2 += my2p; mx2 += mx2p; } } static int inctime, changed, waittime; static void increase (int i) { changed = 1; if (waittime) { waittime--; return; } waittime = inctime; if (inctime > 1) inctime--; else (*maxim[i].number) += 2; (*maxim[i].number)++; if (*maxim[i].number > maxim[i].max) *maxim[i].number = maxim[i].max; #ifdef SOUND if (ssound && inctime != 1) play_sound (S_CREATOR2); #endif maxim[i].func (); save_rc (); } static void decrease (int i) { changed = 1; if (waittime) { waittime--; return; } waittime = inctime; if (inctime > 1) inctime--; else (*maxim[i].number) -= 2; (*minim[i].number)--; if (*minim[i].number < minim[i].min) *minim[i].number = minim[i].min; #ifdef SOUND if (ssound && inctime != 1) play_sound (S_CREATOR2); #endif minim[i].func (); save_rc (); } void menu_keys () { static int enter; int ent = 0; static int esc; #ifdef MOUSE static int button; int but = 0; #endif if (maxim[1].max != maxlevel && !client) main_menu (); changed = 0; if (IsPressedLeft ()) { int i; for (i = 0; i < nnumbers; i++) if (maxim[i].line == selected) decrease (i); } if (IsPressedRight ()) { int i; for (i = 0; i < nnumbers; i++) if (maxim[i].line == selected) increase (i); } #ifdef MOUSE but = nomouse ? 0 : MouseButtons (); if (but) { int i; for (i = 0; i < nnumbers; i++) { if (MouseX () > maxim[i].x && MouseX () < maxim[i].x + 8 && MouseY () > maxim[i].y && MouseY () < maxim[i].y + 8) increase (i); if (MouseX () > minim[i].x && MouseX () < minim[i].x + 8 && MouseY () > minim[i].y && MouseY () < minim[i].y + 8) decrease (i); } } if (!but && button) { int i; i = (MouseY () - MAPHEIGHT / 2 - 20 + 5 * nmenu) / 10; if (i >= 0 && i < nmenu) { selected = i; #ifdef SOUND if (ssound) play_sound (S_CREATOR2); #endif menu[selected].func (); button = 0; return; } } button = but; #endif if (IsPressedEsc ()) { if(!esc) { if (client || nnumbers == 2) quit (); to_main_menu (); } esc=1; } else esc=0; if (IsPressedUp () && !mtime && selected > 0) selected--, fit_selector (); if (IsPressedDown () && !mtime && selected < nmenu - 1) selected++, fit_selector (); if (IsPressedEnter () && !mtime) ent = 1; if (!ent && enter) { #ifdef SOUND if (ssound) play_sound (S_CREATOR2); #endif menu[selected].func (); } enter = ent; if (!changed) inctime = 7, waittime = 0; } void keys_keys () { static int lscan_code; int scan_code; scan_code = GetKey (); if (!scan_code && lscan_code) { keys[player][keynum] = lscan_code; keynum++; #ifdef SOUND if (ssound) play_sound (S_CREATOR2); #endif if (keynum > (rotation[player] ? 2 : 3)) { player++; keynum = 0; if (player > lastplayer) { change_menu (); gamemode = MENU; } } } lscan_code = scan_code; } void draw_keys (int draw) { char s[20]; static char *key[4] = {"UP", "DOWN", "LEFT", "RIGHT"}; static char *rkey[3] = {"ACCELERATION", "ROTATE LEFT", "ROTATE RIGHT"}; if (!draw) return; nmenu = 2; sprintf (s, "PLAYER:%i", player + 1); DrawWhiteMaskedText ((int) (MAPWIDTH / 2 - 4 * strlen (s)), (int) YPOSITION (0), s); if (rotation[player]) sprintf (s, "KEY:%s", rkey[keynum]); else sprintf (s, "KEY:%s", key[keynum]); DrawWhiteMaskedText ((int) (MAPWIDTH / 2 - 4 * strlen (s)), (int) YPOSITION (1), s); } #ifdef JOYSTICK void joy_keys () { int status, tmp; static int lastbutton, button; if (read (joystickdevice[joystick], &js_data, JS_RETURN) <= 0) { perror ("Joystick"); joystickplayer[joystick] = -2; gamemode = MENU; change_menu (); return; } button = lastbutton; lastbutton = js_data.buttons + IsPressedEnter (); if (joypos == 0) { if ((button == 0x00 || lastbutton != 0x00)) return; joypos++; for (tmp = 0; js_data.x > 0xff; tmp++, js_data.x = js_data.x >> 1); js_data.x = tmp; for (tmp = 0; js_data.y > 0xff; tmp++, js_data.y = js_data.y >> 1); js_data.y = tmp; status = ioctl (joystickdevice[joystick], JS_SET_CAL, &js_data); if (status == -1) { perror ("Joystick"); } return; } if ((button == 0x00 || lastbutton != 0x00)) return; calibrated[joystick] = 1; center[joystick][0] = js_data.x; center[joystick][1] = js_data.y; gamemode = MENU; change_menu (); } void draw_joy (CONST int draw) { char s[20]; static char *mess[2] = {"Move joystick to lower right corner", "Center joystick"}; if (!draw) return; nmenu = 4; sprintf (s, "JOYSTICK:%i", joystick + 1); DrawWhiteMaskedText ((int) (MAPWIDTH / 2 - 4 * strlen (s)), (int) YPOSITION (0), s); DrawWhiteMaskedText ((int) (MAPWIDTH / 2 - 4 * strlen (mess[joypos])), (int) YPOSITION (1), mess[joypos]); DrawWhiteMaskedText ((int) (MAPWIDTH / 2 - 4 * 33), (int) YPOSITION (2), "and press either button or enter"); sprintf (s, "x:%i y:%i", js_data.x, js_data.y); DrawWhiteMaskedText ((int) (MAPWIDTH / 2 - 4 * strlen (s)), (int) YPOSITION (3), s); } #endif koules1.4/linux_pcsp.h100600 37512 310 20761 6477322207 13434 0ustar rootroot#ifndef _LINUX_PCSP_H #define _LINUX_PCSP_H /* * include/linux/pcsp.h * * /dev/pcsp implementation (dsp & audio for PC Speaker) * * Copyright (C) 1993, 1994 Michael Beck * Some Parts (C) Hannu Savolainen 1992, 1993 * * Minor Alterations for Paradise Sound Client */ #include /* MUST BE defined from 0.5 */ /* #define SOUND_VERSION 0x60 */ #define PCSP_MAJOR 30 #define PCSP_MIXER_MINOR 0 #define PCSP_DSP_MINOR 3 #define PCSP_AUD_MINOR 4 /* card ID, real soundcards use 0 to ... */ #define SNDCARD_PCSP 128 #define SNDCARD_STO1 129 #define SNDCARD_DACM 130 #define SNDCARD_DACS 131 /* IOCTL commands, compatible to real /dev/dsp */ /* SAMPLESIZE returns only the value, doesn't support changes */ #ifndef SNDCTL_DSP_RESET #define SNDCTL_DSP_RESET _IO ('P', 0) #define SNDCTL_DSP_SYNC _IO ('P', 1) #define SNDCTL_DSP_SPEED _IOWR('P', 2, int) #define SNDCTL_DSP_STEREO _IOWR('P', 3, int) #define SNDCTL_DSP_GETBLKSIZE _IOWR('P', 4, int) /* #define SNDCTL_DSP_SAMPLESIZE _IOWR('P', 5, int) */ /* #define SOUND_PCM_WRITE_CHANNELS _IOWR('P', 6, int) #define SOUND_PCM_WRITE_FILTER _IOWR('P', 7, int) */ /* #define SOUND_PCM_WRITE_BITS SNDCTL_DSP_SAMPLESIZE */ #define SOUND_PCM_WRITE_RATE SNDCTL_DSP_SPEED #define SOUND_PCM_READ_RATE _IOR ('P', 2, int) #define SOUND_PCM_READ_CHANNELS _IOR ('P', 6, int) #define SOUND_PCM_READ_BITS _IOR ('P', 5, int) #define SOUND_PCM_READ_FILTER _IOR ('P', 7, int) #endif /* IOCTL for changing the play-device, real sample rate etc. */ #define PCSP_SET_DEV 0x00014350 #define PCSP_GET_DEV 0x00024350 #define PCSP_SET_PORTS 0x00034350 #define PCSP_GET_PORTS 0x00044350 #define PCSP_SET_VOL 0x00054350 #define PCSP_GET_VOL 0x00064350 #define PCSP_SET_SRATE 0x00074350 #define PCSP_GET_SRATE 0x00084350 #define PCSP_GET_MEASURE 0x00094350 /********************************************* * IOCTL commands for /dev/mixer */ /* Mixer devices */ #undef SOUND_DEVICE_NAMES #undef SOUND_DEVICE_LABELS #undef SOUND_MIXER_NRDEVICES #define SOUND_MIXER_NRDEVICES 12 #define SOUND_MIXER_VOLUME 0 #define SOUND_MIXER_BASS 1 #define SOUND_MIXER_TREBLE 2 #define SOUND_MIXER_SYNTH 3 #define SOUND_MIXER_PCM 4 #define SOUND_MIXER_SPEAKER 5 #define SOUND_MIXER_LINE 6 #define SOUND_MIXER_MIC 7 #define SOUND_MIXER_CD 8 #define SOUND_MIXER_IMIX 9 /* Recording monitor */ #define SOUND_MIXER_ALTPCM 10 #define SOUND_MIXER_RECLEV 11 /* Recording level */ /* Some on/off settings (SOUND_SPECIAL_MIN - SOUND_SPECIAL_MAX) */ /* Not counted to SOUND_MIXER_NRDEVICES, but use the same number space */ #define SOUND_ONOFF_MIN 28 #define SOUND_ONOFF_MAX 30 #if 0 #define SOUND_MIXER_MUTE 28 /* 0 or 1 */ #define SOUND_MIXER_ENHANCE 29 /* Enhanced stereo (0, 40, 60 or 80) */ #define SOUND_MIXER_LOUD 30 /* 0 or 1 */ #endif /* Note! Number 31 cannot be used since the sign bit is reserved */ #define SOUND_DEVICE_LABELS {"Vol ", "Bass ", "Trebl", "Synth", "Pcm ", "Spkr ", "Line ", \ "Mic ", "CD ", "Mix ", "Pcm2 ", "rec"} #define SOUND_DEVICE_NAMES {"vol", "bass", "treble", "synth", "pcm", "speaker", "line", \ "mic", "cd", "mix", "pcm2", "rec"} /* Device bitmask identifiers */ #define SOUND_MIXER_RECSRC 0xff /* Arg contains a bit for each recording source */ #define SOUND_MIXER_DEVMASK 0xfe /* Arg contains a bit for each supported device */ #define SOUND_MIXER_RECMASK 0xfd /* Arg contains a bit for each supported recording source */ #define SOUND_MIXER_CAPS 0xfc #define SOUND_CAP_EXCL_INPUT 0x00000001 /* Only one recording source at a time */ #define SOUND_MIXER_STEREODEVS 0xfb /* Mixer channels supporting stereo */ /* Device mask bits */ #define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME) #define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS) #define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE) #define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH) #define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM) #define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER) #define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE) #define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC) #define SOUND_MASK_CD (1 << SOUND_MIXER_CD) #define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX) #define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM) #define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV) #define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE) #define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE) #define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD) #ifndef MIXER_READ #define MIXER_READ(dev) _IOR('M', dev, int) #endif #define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME) #define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS) #define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE) #define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH) #define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM) #define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER) #define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE) #define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC) #define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD) #define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX) #define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM) #define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV) #define SOUND_MIXER_READ_MUTE MIXER_READ(SOUND_MIXER_MUTE) #define SOUND_MIXER_READ_ENHANCE MIXER_READ(SOUND_MIXER_ENHANCE) #define SOUND_MIXER_READ_LOUD MIXER_READ(SOUND_MIXER_LOUD) #define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC) #define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK) #define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK) #define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS) #define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS) #ifndef MIXER_WRITE #define MIXER_WRITE(dev) _IOWR('M', dev, int) #endif #define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME) #define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS) #define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE) #define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH) #define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM) #define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER) #define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE) #define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC) #define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD) #define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX) #define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM) #define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV) #define SOUND_MIXER_WRITE_MUTE MIXER_WRITE(SOUND_MIXER_MUTE) #define SOUND_MIXER_WRITE_ENHANCE MIXER_WRITE(SOUND_MIXER_ENHANCE) #define SOUND_MIXER_WRITE_LOUD MIXER_WRITE(SOUND_MIXER_LOUD) #define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC) /* * The following mixer ioctl calls are compatible with the BSD driver by * Steve Haehnichen */ typedef unsigned char BYTE; typedef unsigned char FLAG; struct stereo_vol { BYTE l; /* Left volume */ BYTE r; /* Right volume */ }; #define MIXER_IOCTL_SET_LEVELS _IOW ('s', 20, struct sb_mixer_levels) #define MIXER_IOCTL_SET_PARAMS _IOW ('s', 21, struct sb_mixer_params) #define MIXER_IOCTL_READ_LEVELS _IOR ('s', 22, struct sb_mixer_levels) #define MIXER_IOCTL_READ_PARAMS _IOR ('s', 23, struct sb_mixer_params) #define MIXER_IOCTL_RESET _IO ('s', 24) /* * Mixer volume levels for MIXER_IOCTL_SET_VOL & MIXER_IOCTL_READ_VOL */ struct sb_mixer_levels { struct stereo_vol master; /* Master volume */ struct stereo_vol voc; /* DSP Voice volume */ struct stereo_vol fm; /* FM volume */ struct stereo_vol line; /* Line-in volume */ struct stereo_vol cd; /* CD audio */ BYTE mic; /* Microphone level */ }; /* * Mixer parameters for MIXER_IOCTL_SET_PARAMS & MIXER_IOCTL_READ_PARAMS */ struct sb_mixer_params { BYTE record_source; /* Recording source (See SRC_xxx below) */ FLAG hifreq_filter; /* Filter frequency (hi/low) */ FLAG filter_input; /* ANFI input filter */ FLAG filter_output; /* DNFI output filter */ FLAG dsp_stereo; /* 1 if DSP is in Stereo mode */ }; #define SRC_MIC 1 /* Select Microphone recording source */ #define SRC_CD 3 /* Select CD recording source */ #define SRC_LINE 7 /* Use Line-in for recording source */ #endif koules1.4/koules.sndsrv.linux.c100600 37512 310 17026 6477322207 15221 0ustar rootroot/* * koules.sndsrv.c - VoxWare(tm) Compatible Sound - Apr. 1995 * PC Speaker Compatible Sound * This server is Linux Specific. * * Copyright 1994-1995 Sujal M. Patel (smpatel@wam.umd.edu) * Conditions in "copyright.h" * * Modified for koules and bugfixed by Jan Hubicka */ #include #include #include #include #include #include #include "linux_pcsp.h" /* /usr/include/linux/pcsp.h */ #include #include #include char *FILENAME[] = { "/start.raw", "/end.raw", "/colize.raw", "/destroy1.raw", "/destroy2.raw", "/creator1.raw", "/creator2.raw" }; #define NUM_SOUNDS (sizeof(FILENAME)/sizeof(char*)) signed char *sound_buffer[NUM_SOUNDS]; int sound_size[NUM_SOUNDS]; int fragsize; /* Terminate: Signal Handler */ void quit () { exit (0); } void init (int argc, char **argv) { int i; char s[1024]; if (argc != 3) { printf ("This program is only executed by koules\n"); exit (1); } for (i = 0; i < NUM_SOUNDS; i++) { s[0] = 0; strcat (s, argv[1]); if (s[(int) strlen (s) - 1] == '/') FILENAME[i]++; strcat (s, FILENAME[i]); FILENAME[i] = malloc ((int) strlen (s) + 1); strcpy (FILENAME[i], s); sound_buffer[i] = NULL; sound_size[i] = 0; } signal (SIGTERM, quit); /* Setup Terminate Signal Handler */ } /* Setup DSP: Opens /dev/dsp or /dev/pcdsp Sets fragment size on VoxWare Sets speed to 8000hz Should set mono mode Error checking */ int setup_dsp (char *dspdev, int *is_pcsp) { int dsp, frag, value; dsp = open (dspdev, O_WRONLY); if (dsp < 0) { fprintf (stderr, "koules.sndsrv: Couldn't open DSP >%s<\n", dspdev); perror("error"); return -1; } *is_pcsp = 0; fragsize = 0; frag = 0x00020007; /* try 512 bytes, for 1/16 second frag size */ ioctl(dsp, SNDCTL_DSP_SAMPLESIZE, &value); if(ioctl (dsp, SNDCTL_DSP_SETFRAGMENT, &frag)) { fprintf (stderr, "koules.sndsrv: Couldn't set DSP fragment. Sounds will be ugly and delayed. Use USS lite driver!\n"); } value = 8010; if (ioctl (dsp, SNDCTL_DSP_SPEED, &value)) { fprintf (stderr, "koules.sndsrv: Couldn't set DSP rate!\n"); }; value = 0; ioctl (dsp, SNDCTL_DSP_STEREO, &value); value = 1; ioctl (dsp, SNDCTL_DSP_SYNC, &value); ioctl (dsp, SNDCTL_DSP_GETBLKSIZE, &fragsize); value=8; ioctl(dsp, SNDCTL_DSP_SAMPLESIZE, &value); if (!fragsize) { /* Don't Assume just because you can't set the fragment, use proper IOCTL */ fprintf (stderr, "koules.sndsrv: Couldn't set Fragment Size.\nAssuming PC Speaker!\n"); fragsize = 128; *is_pcsp = 1; } return dsp; } /* This just keeps the pipe from breaking... Eventually I'll look at the koules signal handlers and just trap this. */ int do_nothing (void) { fprintf (stderr, "koules.sndsrv: doing nothing, something is broken\n"); while (1) sleep (5); } int read_sound (int k) { int i, fd, size; fd = open (FILENAME[k], O_RDONLY); if (fd <= 0) { fprintf (stderr, "koules.sndsrv: The sound %s number %i could not be opened\n", FILENAME[k], k); sound_size[k] = -1; return (0); } size = lseek (fd, 0, SEEK_END); sound_size[k] = (size / fragsize) + 1; /*size in fragments */ sound_buffer[k] = malloc ((sound_size[k] + 1) * fragsize); if (sound_buffer[k] == NULL) { fprintf (stderr, "koules.sndsrv: couldn't malloc memory for sound\n"); sound_size[k] = -1; close (fd); return (0); }; lseek (fd, 0, SEEK_SET); read (fd, sound_buffer[k], size); close (fd); for (i = 0; i < size; i++) sound_buffer[k][i] ^= 0x80; memset (sound_buffer[k] + size, 0, sound_size[k] * fragsize - size); /*fprintf(stderr,"sound has been loaded, %d bytes\n",size); *//*DEBUG */ return (1); } void do_everything (int dsp, int is_pcsp) { char k; int i, j; int terminate = -1; /* Which Sound to Terminate */ int playing[16]; /* Sound numbers that we are playing */ int position[16]; /* Current position in each sound file */ int playnum = 0; /* Number of sounds currently being played */ unsigned char final[512]; /* Final Mixing Buffer */ int premix[512]; char *sample; audio_buf_info info; for (;;) { terminate = -1; /* Try to open a new sound if we get an integer on the 'in' pipe */ i = read (STDIN_FILENO, &k, sizeof (k)); if (i == 0) { /* EOF on pipe means parent has closed its end */ fprintf(stderr,"koules.sndsrv: shutting down\n"); kill (getpid (), SIGTERM); exit(-1); }; if (i != -1) { /* there was something in the pipe */ /*fprintf(stderr,"Just read a %d from pipe\n",(int)k); *//*DEBUG */ /* Negative means terminate the FIRST sound in the buffer */ if (k < 0) { /*fprintf(stderr,"terminating sound\n"); *//*DEBUG */ terminate = 0; } else { if (sound_size[(int) k] == 0) read_sound (k); if (sound_size[(int) k] > 0 && playnum < 16) { position[playnum] = 0; playing[playnum++] = k; /*fprintf(stderr,"sound %d added to play queue\n",playnum-1); *//*DEBUG */ }; }; }; /* terminate a sound if necessary */ for (i = 0; i < playnum; i++) { if ((position[i] == sound_size[playing[i]]) || (terminate == i)) { /*fprintf(stderr,"finished playing sound %d\n",i); *//*DEBUG */ /*fprintf(stderr,"is was at position %d\n",position[i]); *//*DEBUG */ memmove (playing + i, playing + i + 1, (playnum - i) * sizeof (int)); memmove (position + i, position + i + 1, (playnum - i) * sizeof (int)); playnum--; i--; }; }; if (playnum) { /* Mix each sound into the final buffer */ memset (premix, 0, sizeof (premix)); for (i = 0; i < playnum; i++) { sample = sound_buffer[playing[i]] + position[i] * fragsize; for (j = 0; j < fragsize; j++) { premix[j] += *(sample + j); }; position[i]++; }; for (i = 0; i < fragsize; i++) final[i] = (premix[i] > 255) ? 255 : (premix[i] < -256 ? 0 : (premix[i] >> 1) + 128); } else { /* We have no sounds to play Just fill the buffer with silence and maybe play it */ memset (final, 128, sizeof (final)); }; write (dsp, final, fragsize); if(!ioctl(dsp,SNDCTL_DSP_GETOSPACE,&info)) { /*this is code drivers that does not allow to set number of fragments to 2. (ultrasound project?)*/ while((int)info.fragments<((int)info.fragstotal-2)) { usleep(1000000*info.fragsize/8010); ioctl(dsp,SNDCTL_DSP_GETOSPACE,&info); } } /* The sound server is in a tight loop, EXCEPT for this write which blocks. Any optimizations in the above code would really be helpful. Right now the server takes up to 7% cpu on a 486DX/50. */ } } int main (argc, argv) int argc; char **argv; { int dsp, is_pcsp; fcntl (STDIN_FILENO, F_SETFL, O_NONBLOCK); init (argc, argv); dsp = setup_dsp (argv[2], &is_pcsp); if (dsp<0) { fprintf(stderr,"Sound server: exit\n"); exit(0); } printf("2\n"); do_everything (dsp, is_pcsp); printf("3\n"); return 1; } koules1.4/sounds/ 40755 37512 310 0 6477322207 12277 5ustar rootrootkoules1.4/sounds/destroy1.raw100644 37512 310 21074 6477322207 14705 0ustar rootroot~}}|||{{zyyxwwwwwy|ŠŒ…ƒ|rilz‚‹”’ƒznklu}’•‰uokmy’“m`Ze“ª´¬™SH_y“§˜†oj}ˆzkbfr²··•yb>:[†µ¶¦C5\}𰩍ms]hiˆ„‡‡wr{y†“™’ƒ}oekl‡–§¤¤‰tlgzˆ‡~kQa†‡~rs…ŒŠ‚x}}‚…”œš“~urw}ƒiD`£Ï²ˆuSGt˜›’€C8`‘“¦b\lx™Žijx•“‚sioqšpgUeƒ›Ã×sT5Aeº½­‹kEI^›·¯‹e26T¤ÉÍ­Š8 _†¶¸¤|qber‡Œˆmahx~›‘”˜Ž„uqpmnmy‚•™”xkh{yfWQ]rœª¬ Žj\Wn™–‰g\aƒ–¥©´Ÿ€]Ynyp_NJY‹£¯«ŸŠnoƒ§¹¯œƒUKYgy€~€ˆ”–”€xngi’¤ ’}YN=,#Q~°ýù—`, !G“¦w^VnŽ¿Á“u]as±²†hQIUi}ljr­×èÞÁ[% (Tƒ¿ÆuM&FƒûÿÌ…8!­ÔÅžbRWes}ypdosª§’~[Y[yŠš|UOW îÑÇ¡hKGRp¢²ŸT(k™ÃØá¿‰xc]X<47i„©¦š~{xwu|…’}yzŠ—ŒhB :jÁ³]+7m¯»©Žyx~“ÖôÅŒQ$.B|“ˆkeÉâô©‚TITnz‡^M–ÿÿ«e&8“¤|`Nzœ¾ÍºqNB\n–fM6?aãôÉq67S µ‚Q !U×ÿÿ÷ÀX98c|Œ}d"+y¥ÏÇ·„mb_cppkXTUw~š­³§¦¡®Àͼ®‚^ O†»Â¦j|¾Ù㶉a($AUdx~Œ»¹¥ŠrW[blgfuÍÞÛºª†…Žœ›‘kA;Bh}’‘ŒŠ‡bYp—¿Ã¯FDz¡¾½¨Žs}”—‘widhs‘¥œ‹‡ˆ‹ŽŒŠ|fUP\¯ÌæÚǃŒ’›•Œ^@&?…£ÁãËb-$\”ÝÜrG *M«ÒÙ½–gdu–¢Œw[JTl›‹‰ž¦³»§{kejmiQCBW}Òãܯ–{nfiqvp`CLQiv…§³“~kUWc~‰Œˆ~c[[lx„†pkmoppkc\av¯ÇÓ·’„¢÷ÿÿ׊4›½¤n+ €³ÔµƒIu£œ‡N?<`~ÃÙÜ«‡u}¼ÍÒµ‘oIV¦ÓìòÕ«R" Zus`B>?Qajhc^jv‡‹vjw€¡£™€ujnwƒˆŸ¡’Š‹¤±ºÂÄÃÃÁÍÔÜͲMH}·ÿÿòÅP~©½©€* /Q~|j0'U…µÞЪQ7>Yv“‹{TMg~›˜Œ‡Œ››€œ³¸¬gZY“ª¦~yy…”«·¿·­Ÿ  {_D;N«·–uM%NfrgN8(k‚œ­¬cNc~—†sNIj”£“„„•œmao€Ÿ££»ÐãëÙ“s\az˜ÄƘx^ELYmfG;6N[ib[D<8ASl“™`B4@QuŠŽŒŽ‘Œ|yz‚}€†„uffmru…‘žœ•…~x{‚–£ªŸldlˆ˜¥“€L<7DNUn|yqcNQ[y‚†}oRJN_bjvƒÃÜߦq*/N¡½Ç´€~˜¦³¹¹¨£šyqnrvqkPC=Mm„†~ˆŽ„uTKHQY][OGIY’š”†z|€œ¤¥Ÿ›ž¸àÿÿÿ⬻ÌÔÁ©„€š«µ«Žoc<'(?iujZL/)5Wl…—–m\KTd{Ÿ§¤¡™®ª„{ƒ–±´«‹p}„˜•Ž~…~}ru ¬²“~košž–|uu„Šƒyy®¹­™}vu¥¹¿¸œ‹yegƒ–žŽ}pu ¼Ûÿþò¾¤¡¶ÏíãÒ¯µäüÿÿÿðÀ®¤­¹¾§sN[O @Š ¡U&,Øïªn(0X¨ÂÀ¡†im{¡­®™Šsms‹—ž†kfft|ˆ—˜•‹{tt„Œˆ‚xsvˆ““yeVOY€ ¿Õ½‹+GxªÛÆ™?'L~¨ÝÖ¾qW^|Öåî䯗“ÂÝîäΕuN2;Q€Š{dI% &AMSJA8:APRRRVejkdaahrƒˆˆƒƒŠ”™Œodgr~›¥©š‰mfi}…‰ƒ~uuz‚††zo^Z]hoqxuqqrsttxy{}ƒ…„|wtw{ƒ„ƒ|wot{Š’‚waZ[s’Ÿ˜–®¸¸¨Ÿ ©³Á¿°‡vfjp{wmPFL[m„wtppjJ6$/]r~xme^`gijcbeiia]\bku‚ƒ‚|€…ŠŠngepw}ysllq~€„†‚|vtuy~‹‘’Š~cZZpƒ˜“†khmŒ˜—qpw‚…yso{„´½¶¤tx€›¡”‡{iim†–²ºº¦–…rkZJ5 ?Z}{pOECOXjfaTUXaeijklosopihjrwzwunlmou{€€ph`X]apuƒ‚{jdejp~ypcdix{wdY\gv“š ŸŸš ±¸½ÔâïëÞ¸²°ÁÊÄ¡o1m¿ÊÁ€¥¿Ì²ƒ BFGHJKNSX\cglsu}~€„ˆŒ‘‘’“˜™š››™•Ž~zxz|yvsorv{|wvtuux|}vqlmov€…Ї‚|wu}€ŠŠ…zph`crz‰ˆƒxocabow|~}€„Œ‘—¥­½ÀÃÄÁ½¹·½ÁÈÔØÛÚÙÖÕÐû¶¦Ÿ“Œˆ…†ˆ‘“™™—‘ˆ‚{mg[F:/  '+3GKNW]mw|ywqedlt{{onv}…wvqrrtuvtsvwz}‡™›™’Ž‹€|zw{€‡†‰ŒŽ‘ŽŒ}ww}€‰Š‡„ƒ†‡‡ŒŽ›ŸŸŸš‹˜—‹‰ˆ‰’—¢©±¾ÄÈÕÜðúÿþøñâÝÔÑÍ¿´¨‹j_VGC@=<:999;?O[s|…ƒ~yje]NG=2,%$$%%%))3;?JMMUYdjqxyxwx‚ˆŒ‰…‚‚ƒƒƒ‚||ƒ‡‹ˆ‚~spux}€‚€~yyywvsurmif`][ahwxvpllpx‡‰Š‹‰…†‰¤ª§ ž£±´·³¬¨¡¡¤¦§¡•~|}yskhnŠ•š–‘ŠŒ— ¨ÀÐáÿÿÿÿÿü÷õõöõïæÏ÷¢œšœœ›—’‚~sqruwxyxtokb^WG?.$  $&)16=KTcilorv…’•—™žžž™—•Ž‘‰‰ˆ‹‘‹ˆ…„…ŠŒŒ††ƒƒ„ƒ‚‚€€ƒ…‰‹Š‡„…‡‰‰‹‰„zwzˆ’”—¡¦¨£œ”’“™¡Ÿš‰‚‚†ˆ†ƒunfbdknpnnoru|~~}~…Ž•œ©¯´ÆÑäèéáÚи¸«¯·ËÓÛÚÔ¿µ®«°µÂÁ¶©šveVIHLOQRSSVVUSQLIG@=61-%"  #%(*.48:@CIOT]_a`biorvwwz~€~~€†…ƒ~}||~{wuuv|zlghkospmiiltx‚ƒ‚{tjijorqje_`esyxusux|‚„ƒ}~„’••ˆ~xtruy„ˆ‹ˆ‡~€‚‡ˆ‡††…‚ƒ‚ƒƒ†‡ˆˆ‰Œ‘“¤³¸º¶³±¯±¶¸¹º¹¸°ª˜”‘‚|ugb_XUMHC?==?ADCCCDFJKNORRSRQRSTUWZZ]`cfghlmsuzz{yxwyzz|zywuqoprv{|}{zyyz€„‚|{}„ƒ~zyz…‰‹†€xuu~€„‚€wusz~€€~…‰ŒŒ‡}|~€€~~~€„ˆŠŠŠŠŠ†ƒ}{{…Œ”•ˆ„†‹’¡¦©¨§¨ª­¸º½¼¹·¶¶¸»»ºµ¨ ™Š…ƒ‚}zvplid_TNICA@?>=:866:>AGIIJKOPTXYXWX]_bijjjiilpvxyxx{~€‡‰‰„…ˆŽ“›™—““—Ÿ¥ª§¡Š…†ˆŒ‹‰€~yyz€|xwx‚„‚„‰‹ŒŠˆˆŠ‹ŒŽ‘””““•“‘Ї}}|}|{|ŠŽ’’—š ¬°²­ª¦§ª´·¹µ°¬¬°¸½À½¸­¨¦¦§¨¤¡•އ}zuslhfcdegga]XQPORTWWTOLIHHKLLKIGGHPRTWXZ_agijkmnppnmmnrsuskhhmrx~€ƒ‡‰‰ŒŒŠ‰‡‰Œ–™˜’Œƒƒ†“‹ƒzwv~€††…‚€~…‡‰ˆ‡ƒ…ƒ€zww|„†…}zuu~‚ˆŽŠ|ƒŒ¡¢žœŸ§±Í×ÛØÐ¼²«§¨©¬ª£ž™“ˆ„}zxuvwxywvvuutrqonmmmmnnnnmkiga]VSQNNMKKIIHECC@A@@AEGKNPTWYejorqmlnx}€…„}zvvx|€€}|}†…}xww}{trq}ƒ“—˜‹ƒ~wy€‚€„„…††ˆŽ‘“ƒ‚}|{{}‚‡ˆ†€~zxwvvwsrqpqtuw{||yywwwwwwvwy{~€}|xxy{~†‡‰Š‰‰ŠŠŠˆ…‚‚‚…ˆ‹‹‡zusu{}}xvvuvyyvoljmpwxywww~…‰‹ŒŠ‡……‹Ž’˜™™‘‡†‡Ž‹ˆ‡ˆ‰‰‰ˆ…|zyyxwsrqnkhb_^adlnpmjhiimoqqpoooppqppqqsuvwxyzz{}‚ƒ‚ƒƒƒƒ‚…‰‹ŒŠˆˆ‡‰ŒŽ‘‘‹‰‰ŠŒ‘”’ŽŽŽŠ‰‰‹‰„~{yy{}~{vvuvxywusrtwy{}~||}‚„„‚‚ƒ„…ƒ{wqsvƒ††„„†ˆ““‹ƒ‚‚„…‚~{{…Š‘’ˆˆˆŒŽ‹ˆ„„…‹ŽŒ†……‡‡ˆˆ‡‚ˆ‹Ž‘‘‘‡…„„„ƒƒ€~{zz|€}{xvuuvwvwxxzƒ…„€~}}||}}~}{xwxz}zxxxxxvurrrrsstvyyz}}~~~|{{}€ƒ„ƒ„…ŠŒ‹ˆ|}}}{yxz~€€ƒ„‚€‚‡ˆŠ‹Š‡…„„„ƒƒƒ„„……ƒ€}{||~~}}{zyxvwvvtrqrtw{~€€€~}~|zxuvwy{|{zuutvwyxvutttuttsuvzzyusqqsuutqpqvz~}www|„„‚{wvy}„‡‡†…„„…‡‡†€}~}|yurqqqqqqppqvwyxy{{|}zussvx}~~{||€‚ˆ‰‰†…„„†‡‡†ƒ‚€€~|yyz{~€~}}~~|zwutttssrqqrsvz{zwwy{~ƒ„ƒ€€€‚€|zxwwxxxxyz{{{zxusrruxyzz{}~~}{yyz|}~|{z{}€€}|||}€‚„„ƒ‚ƒ…ˆŒŒŒŒŒŒŠˆ‡†……ƒƒ‚€€€€€€€~~€‚ƒ†ˆ‡†…~~|{zxyz~~}{{}}~~~~ƒ†„}zy{~„††………†‡ŠŠ‡…‚€€„„…‚ƒƒ„„ƒ‚€€~|zz{~zyxxxxwwwwxz|~„………„ƒ‚‚ƒ†‡‰‰‡ƒ€~~~{zz||~~|wvutuvxxwuuwxz{{{{{||}‚„†…„‚~~~~}}}€€€~~}~€ƒƒ‚€€€€€~~€€€‚€~}{{{{}~€€|{xxxyz{}~}}|}~~€ƒƒƒ‚€€€‚‚ƒ‚‚€€€€~}||}}~€€ƒ„…†‡…„„‚‚€~}|}~~}|}~~~~}|{zyyyyzzzyz{{||{{zyyyz{{{}~€€€~~~~}}}}}}}}|||}}~€€€‚‚‚‚€~}}||{zyxxy{||{{zzz|}|{zxwwxyyzyxxxyz{|}}}}~~€€€‚‚‚€~}}~~}|}}}~~}|{{{|~~~}}}}~~}|}}~€‚‚‚‚€€€€|{zzzzzzyyxyyzzzzyyyz{||{{{||~~€€€~~~}}}}~~~~€€€€€€€€€€€€€‚‚‚€€€€}}}}}~€€€~~~~~}}}~~~~~}}}}|||||||}}}}}}}}}~~~~~~~~~~~~~~}}}||||||||{{{{||||}}}}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}~}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€koules1.4/sounds/destroy2.raw100644 37512 310 102236 6477322207 14726 0ustar rootrootz…˜˜“ˆ}xupnr€{xu{ƒzz{„˜”…}}xuvuw{{{€…€x{{xusx}sw}ƒ€vsv|}uv‰ssz}‰„x{ˆˆˆŠ„{mb]blzˆ‹’—•‰…{sqzxrlq…€€{ƒƒ…Šƒ„ƒzsu{€|}„˜š•••‰„ƒ„ƒƒ€†“Ÿœ—œ¢Ÿ™’‹ŽŠƒ…‹Ž…|…™¤™†‰””ŠŽ’’”’™”‹†‰Ž‹Š‹’’’—•ˆww}ƒ|vux|}wpquvwrsz}wwxvnidfkqpqnilmgabacghfaaaaXRW^bccfif__inlfc_ZZ_ddbfiidiqskbbgkkinnrx„‹ˆrI2P•µº³Þ¼d¬Æ«ž¢¡®ÇÕÌ€Š‹¶ÖÅ¶ÌØ¬£ÖϜЦuÔʳ¨qĮЗÁÅ’|xœÌƲ۲†¢¡m¡£S|©xk¨°mKCƒz”FN“¢cS‹¤ng<vYX?ƒž]>qs_©R7…‹S+b†|EOŠ\/]{|p4>…‹O1pšm9g“^@„ž^2Y€K<ˆ§\?Wz;O‰nWshzx?F”žrbr{ZUœ”kmfC^¡|SWƒh’ž¡‰{dIUYOŠza•cZ†«gf“‹Ud—¡hr”ŽY|h}’Sk”m]ˆn¡Ä¢r}ž„UxˆXOmgqxir“q”©€]xcKY9cqROfmmbuWRrTd‰nI]nRcsH]“€gp‹€lpS0,XWU_;9WNg£žpRX„šš{l“­—™¨zs”•¤šm®§€¡²Ï³Ž¦ËÛÁ‰Š²ÎÇ”{ލÀħ©‰nŸ«œw•µx‹­”qƒ”hXx‹©£ƒŸº©¤||§•i¨¦ž™ibqŠpiž§ŠxZfŠfWp•{W\†•fIKu—Ÿv\z™„]i•™qTp“°£qlx’¸­vZg†˜®¬ŠcSm’”Ž€\W{ƒl…lcC?dl?Cg€_SZ|n\K1KmN-Cq†vhF6NXp„vd|“®Ážx‰¡™ŽŽœÀе€€ž¶šwެ¢€ZTm“v]PurT_uX^X@uhpuf{^Cczcg„YFl…lFHUbp€’¨¿ÕΩ‰š«˜»ÓÕ¿­­À©œv§’rž·¢™†r}•…qXEf‰†lYr™—vdz¡“މpkuiX…£œ}‰‰xŸ£w{vzœ†ƒ°Ÿ„€•™§ÉÛÁ•‰©Á§{€¦¨”¡š|‹{]r•x\cxdUzzb]M>FS?NTCHUs_Y€€ZXuvu…¦—ƒŸ¦plƒŠ†p]}Žr}¨¤ƒhsziwƒ—§„iMpˆn{œ{nƒ„kizrwr…bE*;Z†€‰š§œ…u†dn“ƒkpr𷢋nd†¬Ÿzfk}hgvx€„—©ÀDZ¬ËÀ…ž§©†˜¡‰Ž«œ»¦‰|]R^_nvšsOYv^9KYaq…§«€wncb_˜ƒmiinmk…¡°±™„qpvaSNk{dXq”Ž^cˆ€X]ˆ¬‹d§klŽ«pzƒ•­†zhh†“sv|Zcƒz„±¦˜‹€hf†Šbg‹•’Ÿ“‹|dq{u”Žˆ£•qww„‰gZvŽ„l¬º¶”niŠ‹mmz¶§‹ƒwgWH;KmY6>Yr†‰lRRkfWWZi{ˆŽ’’†¨§{l†™”wˆ©n†˜wm‹’iT_ƒŠn]Ž€kqizq^‹—}^dЉba…†gk„˜Šz}­²švmŠ©”u¢’mx‰š‰’»»š™Å̸¦}mbn„ƒ€¢‹œ¨”§¢rh}§Ÿx^u‹q‰¦¼ËÁ³Ÿ˜šnUZku¡³·¦¡™„„“zahTKz•™„xsX\z_Mlifz_rk\ƒ—}]r—Yhr|Љ€’³Å±…llzƒ‹d^ƒ•™zЧŽxnklqa97>NhbIkzUUinfI\ƒlF@b…ŠlWmƒ{lNIa…£šum…}\Td…q_u|u”vw{“®®’™·•r|˜±«£Á¦¨¢žcn‹_‹©œ•”Ž€qrwwldWECdf\zfZ¦†bvŸ²rpˆœ°®—±ÓÇ¿ÔÇ¤Žƒƒ°Ê۱¬—wmœ“…dMYxŠ„i‹¤—l^diw”zix…nv‰wnph_TS?(7Sfid“c|˜©­”v€€xmi}‹•©«™„“„punn{Ÿ¬™€mdr“{lggdm…qPf‹’}qmfTFOpgPhiPn|{ƒp]nv}‹¡¼±‰ºÅ®¡•Ÿœ{l€œ‹xw€{iOXmh}quTkxu‰’}ˆ«Êºœ‰z†¡’mbh¡§‹q§¡„‹±£™†…ŽƒZ\|šˆw}iWi­£’™ƒ_KOd{{ah„”²°š†€z€¡w’·º|¦¦€q™¦Š†‰s{fJAOfWChpMKu†uJIZ^^hnw€…”|—£™u}Š®º¤†Š•—“†}€scHSwpIInwOFfgMa„zq‰…wYg‹lu™}z]h‹„¤§š€xb]dWOgrŠu”¸¦“™’ޤ†„¦œˆ«‹•²½ÓÄ£™™‰r…•¢¤¦°ºœˆ«³Žu{Ÿ—sx¢¡’™‰vggsW7Mu„mdwmMTgYFiZOsxh}u‰hlƒ„}”¡°Áº¨¼¬}„„rxŠŠ•˜—¸¦’œ“{€ifcCU€|lnrkfbXMDC<1Mp_;5Oc{Šlh‹„lx“‹Ž¢µ¢”®¤¦³š¤¤¨Ðη¤—™£€z¦²™‹…“|mf}ˆq]UpŠmY^…•€{mXE\}ƒm{£“‰”™‹i_ux_{šŠfqœ˜™»±‹¨™wbr€‹¤µœ©“nq†™Žvvl|zfvcT}|WYxbMnlDOhl}hRqzSI_afm{‰•““ˆibZg„„kZw}vi{†z}¢”f\zˆcmlixƒ“Ÿ¤”qn‰Yh‰ƒisx\wŸ™€z{iWx}mdgˆ}_ušŸ˜Žƒ„}|˜¤…œ™ˆxŽ«ºŽ±ÏÀ«¤“¡³¡¨°˜…}“•ng†Ÿ¨¢€ƒœ†w¦¸˜s|ž¢xbzŠ”š•‰œ­žŠlx¡©”ivš{}liŽx]}™†vŠ}R^ˆiUMY€‹{_E>^ziKf}gfqpcfDKs€cgˆ‰uvgT:2HXRk‰gXkŠšˆ|žl€Ÿ“md{Šqx¢•rx{£‰gm“©Ÿxsš®Žr|‹qŠ„WWmu«Ÿzu™«}bsnz¦Ä»’x{˜§¡}|œ¤¬•zŠš©Éϵ£¡­¬†xcbv{}”¢‰”€}ncXR^œŠ„}g\z”vz¤šzs„¦qm†™ƒuž¼­‰x’¬žxzŸ«¡|†­¼²”’šœvh{ƒr€‰]d†ŠpXuz^Tqlbmmprqwƒ„{vŠmƒšzxŽli“{PCX…nWOEKn|dNAMlT7Ux}ƒ…vmqq\Wga;MqfUfnfs™‹kTZswf_zƒƒ’œ«º“ˆ«®†€¡¢¸u|ƒ™­|˜mŽbbu‰£—smˆir”€|¦•ff‰Ÿ‰ca𡉆…m˜—rˆh_wqZnfUxq|¢¡|޳œhc|“‰sz—ž®¸—Š«µœ”²“}}g{Ÿ’l„…dsvY]wbS|mOvš‰wqbu’|c_TYus\czxŠ”“•«¤¬¿¡¨¶‹™¿³”Ž”®¶Àœ—½˜’”‰—{]dgu•ZOdzcXv„…}rnKXxƒ_WqŽuf„ˆ…wŠž€Šdn‹™£“§ƒsœ£}z¦¶•xu’±•qp§„qi|™ps|xlp€bSCN\O]l„lƒŸ¨k}¢d£­žrq€™ž„—q“£|„apa_vZ_z‰}z•¤€§Ž]avv€ŽzxfhŽr^Ž—pSY„œspg^XaaTh]CMxxwkTdhu…vŠd|}ŽŠ‰™šŸ¨——¨œ¢«¬·¦zƒ—œ©z¨žˆ¦€n^mWWˆkUvˆmdS^‰zg]kŠs]PSxsN]s]fˆu…šwޱ£œsq’Ÿvrž¤……„{ž™ˆ¨¢‰¬¢Ž¶­ƒŽ²±™ƒr˜«’kxˆ’ž™°¦x©”u€…}aw”˜ip——p_|…“ŽYYu†ˆi_‹•sUiŠ€cmbIpx€wv}“q_}kiiˆkfkWYnr|uwiSƒŽ|x{{rKcgP_am{wƒ•”‰i|ž”{ˆ†g…a|P]ˆš’„v]^„_R]maTg†g|©¶£…v‹žvm”Ÿ§²¬’“†—µ‹qkŠ©‹vs†˜r^m}gx—…Žuvr‹¬vnްŸ’Šz}’xYvœ“si}£“z{giƒv€¨‹™k™š¨“wx“®»«žv^k†lKZn_bƒ_aŠŠˆ}_Kcfhpz€ƒ¨§¨°²˜{{˜¡xam‰ssd\Rdf?7gˆslgUM\c@PqZRrxipޤ‰¦¡vЦŠ}Š«¢u—Žv|‰†Žš¦}“•§±®Žœ¦}m¢ž—{{¦“gl}JTuukˆlOq}PFln]pƒ{€—¦œžšqnЍ¨‹Ÿ©“wŽrh«œ†|x€u^kdFUufZ€š°®|fqˆŽœv€«£‰xrŽœxv¡¦…iƒ•Žu|™¨}|§§Ž”¡sˆ«™wuœœ}|}_g}T]ƒgh•‹zwlbcnX6JpnRgrplU@>dpJRu|Ž}iŠ’r|…fw€ndd‹w\v™’p…£”x…°¨Živ—²«‰{’Ÿ—º©‹§•}”hŽ|]ˆ§š—“}pfXHfƒudrpr—†v†¬Ÿ†€¡®ˆ€‹€a‰Žhh˜Ÿ‰—««vx…ss‰v€Š™­¼½³£„“¶¢‹z„°·˜Š©§„}ƒ]a€qi’rXpxRNhzb]Np””v\m”¨’zvr‹˜rvšˆ‹¬ˆƒ—{Wgpx—¢‰uˆ¨{’‰qvSuzg{œƒvzusATksz\R{sfa}˜{q{i€xYˆ˜€nc_ƒxbrgfmg’”†p]Ndh@TnYa^NƒqUwœ†xmX}uvimƒ}qT”s\€„r‰Š}”ˆu‹Ÿ¨“rsŽuz€Š‹¢Ÿzº£’¨¤€gi’—||œzq„mp‹f¦“…u]\|}v|Zx¢ƒc_z’„x|މl‰ˆfm’’z_s’©Æ±§¨|”¡}‹œŽ©Ž…º¼”…ƒz’°±­—™¬”’Žf^zš|i““ƒnh”pimXcŠrh€_Nw“ˆzvvnk˜ž£™”©ƒ€¨§«º™ˆ®§uu—®·”r¶°‰ˆ€_v‹pq]m}ƒ^b‹—rcTc}dSSJdmhZIc}U^ŠvOZlqpv§«‰pu”¦‰¤™nˆ¬¢{fnxp’¨ˆvs\w™{XPgzglŽscˆsWvqY†ai‹‰ž‰vmlm‰§’zhS_|…]JkxqwŽ™°¸¬„r„‹¨¡€š°˜ž¤…•²œ•ŠwZERl˜udqnZƒšƒxzURuŠŠkiwg®¢Ž{m}‰„¢˜i„©˜†¦£{‰„k¦€|}rp|™’gJ\{•Ÿ…ˆni—™xiPPx…cpŠiCCZs†bUk…sk”˜v}rZ{‹…_X{”©œqi}ƒ‹°¬’ˆbn‹˜švbign€œ™pczvnެ—{wq•†]iw^n•˜—…gZ|Ÿup^HScq€†…invp—¦nƒ¢¤¡•mvž±Æ©œ’„k³œ„x|”]]v…]Tx‹€„šœ}Ž»ºšŽ¤¬nˆ¦±§—|’³’|vqzxrŸxlgŠž|‹z\_”mizvœ’p‰—gpš³”}‹z„§¬škWfn}“iOfulŠŸ“g_|š…svXU…XbZEcbDa€„cOH]x“ƒXHUnrYg“£•nz¡­“mu’‹ˆ“»°’‹xƒ¡ƒu}vkv€wpm_WbfKTn_AFWu‹{X\]\rwx—¦œ’†Š¬¨—˜•†§®¢®Ä¢­”¸™v¤¬²”„¡Ÿn}¦•{ƒvlx{rf€lWhmdMYqP?lŠxPERdu^Ms}acˆŠ••uЦ¶£žš™Ÿ­¬Š—ƒ©•ŸvRkœˆk\Sd„’sru^a]Yz{‹w’œpuƒ^_Xp™r}sZ€‰i†”gq™«»­š£²zš™„š’|¬Éʦ‰‰¨»˜•¡ˆ†„hRKprPu‰]Pqra€ƒld\ax†’ˆw’—¦½§|¤†‹¼­…qv„s„¨w…ƒid„u]wm\ˆˆ€Yc†s_‰\Ubwš•nZZl]XnkMHhiv—‹iYYcs¦¢Š€—‹¤¤sc„ŠwˆƒdXn—‹dTiwršpn’‹„“ˆˆsn¡£…’u}¨¦Ž’¢™xv¢¢„…wfˆ¡€ŠscrkuІrd_‰Ÿ—{lwzgc“€lm…“£µ®‰r€«¬“p†¢¢•”bux¡¢usŽ{nŸ£…xiNY€bPI\O+:TmhYAU…vPUcPMq|†icŽ{‰£ˆpz‹¦©|••p§¢—ŠknžŸkŠ“lv—z©sm{™Ž{vm]la\€mSxˆ†qYUdumi¢¤…‹¢¡µ’zžž‰™¬±Å¨®·œ°¼Š®·¼¦‹xfs…dm’rhxb¤ˆf\am—vp•†w§«“xl|w|”qŠ}_†˜xi}†h—‰š€_]q¢£‰„zvœ¤‰“}hRWzXhmX€zXw‹^Sš|nƒrUbvksœ…br“}wœ„aƒ„gŠ«Š}’p}x•n„aN|”™‹upŠ{dˆ}qYYž€pl{zh—qpc^|„lc^}pJhˆxx]]“•w…žsg”©¤˜ŽŠ®¶˜§q™¶¨œŽx˜³’x…‹—Šl—µ£„|pdi„„xqUwgb“q]\c€™ƒm„§µ’{}wk_z—®¢…ž¦v­¦€“wSgwfq…suž£€kˆš‹…s{œ€W\|cgus‰hvž¡Žpm]\}‰mgˆzx˜„z¦—ln‰„Žslkv‹hdxkru^€}mlnuNSsrkn€ƒ—©‹‹³¨“£·š†šƒn•’w’˜sxz}„q\n{zpNXsvKP|•™„s|‹pcsqŠšˆ|s†ƒ˜œu‰«‰—‹Š…z˜Ÿ¦¡vzšs‰„|’b]{†…a{™„xv_nuSETngh{bKYl_]qXEi}ŽŽsz€h…£Šˆ”wŠudƒ¡vlš¶«Š…œ¡“ˆ‰hŸ…}šˆlmqržxlh†‰hxƒhs„wzŠ‹w{ˆ‰}Ÿ“€†¬Ÿ¡®¢¡‹“§•®­”“¨±¤¡š¨¢Žw”xmx{z‰wnvhb—‰iqvipx\h‰pPUwdn{…€hk}x_}†w‰Šqq}ƒ‹œš‰†“ƒ•°£‰h{œ¢†i‰ƒh_pˆ…XOkqnkpfihg]v}mbr”u_vwcshd}wwsYS_klpsm}wulpvspsr|†{s†|ƒŠ„„…ƒ‹™Ÿš”˜“ˆ‹—’ˆ“•’ž—Š‹”—˜¢¡˜˜“”ˆ””ŽŠ€€…‹„†€€‰Š„€Š‹Š†…ˆ‰ŽŽˆ€Ž”Š…ˆŠ‹ˆ€†“—Ž{ƒŽ†uwhqwn}†sgŽ™x‹„lWMXnuwpws^YaWIPPKJRUPTMEDFIHECRYRR_bX\^gqxslxƒ…†Ž•ž—””—£¤¨°»¸¬£¢¤œ’­š£’•ž¡š—ˆƒ†ˆ„qpqimfg_adbbdhhkiimlssxzu„…ˆƒ†Š‰…‹’“˜•œ¤«¤§¨§©£§¦¦œ¡°¬¡¢¡˜œ¡Ÿ¡ž¡¨«˜«¬¡¨¦£££š—„uv}”Žˆ„€†}…{qrzvmah]WqfgvbZi\EWaXR_XJ_fF5NSXNSha]cZSfWYrskgszr{‰hb…wb}qpv\_khhhYc”muˆnSU\}ˆpf€€}qˆnuz“£¡}…Ÿ­—«§’™žœ»½ŸÅ²¡º»¶Â·“š¿½Ÿ³Ì¼¡¢™¬²˜ƒŸ¦„ˆ¤™ww{‹•І¡±”†“£Ÿ—‰}„˜Ÿ„s|‰Š€n}—†m…¢zz†’wq€|†_^g_l…{l\bvmdvxrrYXallZblhpmTOib_†hT_}uzia|¤™ˆŽœ™qm’¨€sŽ­•„ˆ˜ˆx—¡ƒ²À£¢šŸ£lu¨«ˆ§²¡©µŠ¡³žŠ‰Š©°Š}«¸”q‰¬ÄÁ—œ±‹u…ˆi…—…m’•€ns“cTsŠgAT†bO\q{vdKc|pZn…XW€UO}‹w\TP{nJk”}h‰Š^m„da{swqnv¡žƒa¤˜piŸn†‰xŠ“€z‹vŽœœqw¦_g—zdˆvŠœxŸ|‹”hm˜—if—€‹p„„ˆx¦Ÿ‹¢‰”§¤’†’Ÿ—Ž™ƒŠ¦«|¡…“•„‹£šxl˜©{†‰ˆ}qk}gJZƒ€bkwrvzld}kg}k\†…u]c‹iiˆ™{wx“|vs†|gl’is””g_„™zcbr“x]\wƒhf—f^†‰cU{‰lTW{qYA\]EmwOZ|zX_}†gdpshqliHO…_D]ˆgOnž’gbˆu{{ucr†ƒ‹{iw¦’hkœ¨„h{©¨€mƒŸ®£€u§ƒ|¦¡vƒ²±†{«Å­™—”¸¿™rwž¦…®žw‹³¡xº­€xŸ»²©“ˆ¤»šu…¬¨|žŸ®‹{Ÿº¤zr‰¤­¦{n°™qwš”nqˆ…¨¡sq’¢†suxmƒ•kWz”zS_…€qvi]q—xPb†{dfxrU{rRl]\hgƒš€ZxžŠ^hdur_uuWb|wx|UJg”ˆ]Rv’vXfr^g€mZmxvŽzYOs‰iFbiav’˜xiq‰‰{qmx„ŸklŸ—gl˜¦Šil•©šq^}ž‹bpva…Ÿƒ_}£“mUl™•{wlˆ¤x^¡s}šƒnŽœ{mŠ„€„vs£¢m¦x’—„‹—p¨Ži“r|‹xlŠ—wu“ˆ…rzzx„ƒcn„€|fw—’qƒxˆ“„qs…žŠagš¡ul’£ƒkn˜œ‰m]s˜mw‰ƒzx•™€ks•šu}•x†w†¤™„…˜Šzfƒ˜gc‰˜vr}lnŽƒ]u™m€—€kŽgYv…gi{€|ix€s{…ƒmv“€nŠ{m|_b…™lkަgmާnq€s…wcn|ia„œ‰hq‰™ˆwb†•|iuŽ„vx”lw…fmŠ—vmimx’mT}£k{Ÿwš—kv™šqq{ˆ†“…ki‹¨ˆdx¦”qr|€’kd{†„œ€s§{]k™Žqd’¦†cs˜šzr{|…€|wlz’’u_ƒŸ’kw¤²™xuŠ¢”m‰š€win˜k_„§”lhƒœ’w\|ŸŽdn”—}rŠˆurŽ‹_b|‹…ni‹šxYs”—um||Ž˜hd€—}sui…Ÿ”bkŽ©’p\g’ŽqNcˆ£ˆdZ|”…xcir™—hPq”ˆ_Ik“¢‹xdx¤Žd_Ž£‰h^f…•„rb€¤”mfr{Žƒ\b•¦x\}¨Ÿƒz\fœ¤{^ƒ­€„n\ƒ†YpŸ£zm„˜—“Š]hœ¬fr•Ÿ”csšŸr\uŸ¡uv„™¢wa†©™†ƒzq€ŸƒY]†œ‰bRx¡žniŽ¡qdw’‰xq€„|“£‰d|§škY}“{idƒ™wXq€rƒzlŠ™€UlˆqkfzšŠd\Šš{bƒ”vhzs_q|€uuppŽ˜|Tv¡™g^ލ’qx€’¤œni¤˜ˆ•€rަz\z¦£pbzœ§•rh“¬™m}š˜§Žk}¡²ƒgzž§“sb†­Ÿqd…¬”qs|ˆŽ„l{Žž‹}gd¡rUs§¤vn¨¡•z€ž¤…vq€…WUƒxNZ£{]f{ƒ]Uz•ƒ^Zax•€KAm•|PR„¡‰cTa{ˆiAHmŠzZUduƒ†dT’vZ\r…YIh†]b‰Š”mZ}œ…_Pv‰usqbuƒZg’•lurv’}_|•zn{¡™ug•­ƒYn¡£{s•‰¦¨ŠzŽ—˜‹ns¢©}i”³—w†¢™Š€„’“’„„”‹—¡vŽ®¬€x©¼—r§±¢†‰¡§ˆzŠ’ƒŽƒf„¬˜kk™«†h€žššlz£šuk…}rpRwž”gl“sql]{—ZdiiƒndŠda„”m\qrkxˆ\Nr”zRfˆ€nuuqsxScfSnzh\„iXz‰vdl‰{vˆg}iaxŠsx’„dqž„Wc—xf{††•l˜‹snŽ•z…—xf’¬‹k…§šˆvsŽ£”ll“¡w}™©‰qs—«€bu˜©œmq™»¨|uŸµ”{xxr†“]h—¢‹ck‰¢œzYi•“gY’xzxnœuYlŽwpg_†¢Wc™sTk‹‰zZh”ŽbY}q…•n\‰£…_xš†mp^Ž•pTušŠfslrb_Š—kWw•’Š|^m˜¤xaƒ€n}niˆ£†gs™¢zgk}š’lr—«wn{buš“wzuƒ„k—s¬¨“}†®’u|—”r}n}«¨„vŽ«Ÿs{¢¶z˜ž|‹Ÿwiœ¦vW¦“kk•š{‰†c^b„wJ\‹’lbbn‰pd†vcsŠ_lž¡zz©£|lˆ„„‹u‹qi“…hgr’†bi{zqfs}v™ƒ_k{v{bˆ’lYWvvzZaqc{q]rx‰n€qu€x¡†{˜†qƒx‰’Žvކ—xq†—§€m€”˜|rp“pgu¦—zh©•wfrŸœ{iz™‹Žƒn••šm…™«š|’š™…¡‹™š†œ€“˜€ŽwŠŽq‰Š{Ÿ„†ws“sxlgŠvˆ„agk„lTcmƒd]rumgŽƒˆ˜sa]ˆ€nb_|fNOuU]{xlp\|wi{h…ƒsžš}w†œ€rp€rpx”x‰€qžžqq“’“nv…“w{œˆ”ƒmŸ„r…¡|}ŠƒŸ†u‰€¡—li¡€rx•xzwrŽml‰Žnr‰“sƒuxŽhiu€•kf•­•lnŠš’|†k€£ˆsarž€ZZ„¢’fm“{ƒs€•€•{n£«ˆfr•Šbl˜zwp”l…ƒw“w€•uŸsgwƒ˜{_Ž©ld‹§…d^p“gOp“¤ˆc}Ÿ¢lw§¦bl—bXv’‰u}sl‹’spަˆvd{†\agq‰gpˆˆŽdd‹”ˆlmvš|id}{Z]ˆ‹bWw˜dfƒ‰x€iwŸ†am—”kWu‹l_l}Z|¡’kq”†p™|’±‹nd‰’hWp’bp—˜zžƒk†¡Žf{¦£{n§ˆimŠir—•rƒ¨Žhs•ž||§¤l¢}_xŽhvš“suš’mq——klœ¤}i§‹gzš‹gvšŠhv”ƒXk—“ia‹žx^{™„d|ž…avš„]nšŽckœžsbŠ¡|f†xYq˜†bw¡kzš€XwŸ“ih…ž|rw†„zl^ŽžuUpŸ™l_Š­˜lfŽ©}qޱžpk‹¤€]pœrbˆ«™w…£¢nmu„—q\ƒ“z]cƒ˜Šp¤™gh‰•†|rsŠšˆ|{ˆ—€vž‹cuš_Tz—Ta‹Š]EYusZd{…|dmlv€ŠvpŽœxg‹•va„š‹lƒ§•gh—ƒgu“€n†„•zbžZb™s^|¡‹d_ƒ™|kp„zbz”wkŽš}xšš}p†ƒ“¡‹|m™qc€¡„i„¬£ƒˆ¬³š€’¦•§ž•ˆŸ¢’luŸ˜mdƒ˜{w—’wm’špb˜vdƒ•{az—viu|w\sŠqkns\MiŠnRcŠ€Za†…lbgwpsfaiwrShˆuR]…”zWkWRsŽ}]kpn|x}ligz•‹caŽ’f]ƒlbz…€vˆx€ƒ}„rw‹xqx‰•€i¡…w…s¢}|§¦†||’“|…œ¢ƒ„©¢}‰­¦|ƒ«¶”¢·•}˜°ž…zŸ¦u‹©­ŽŽ…Š£ž}w“©qµ«†v˜®ˆhn•šwsŽh‹•m]|˜h…¤ˆdnŠvWqˆla¤ˆf}¤’giYk—di”ˆ^_„Žif„ˆ‰sz‰|khŽƒU_ˆ‹dTzhRmƒ]KxkMq”vTZ}nEW€ƒ_Sz…_InvM_‰Šhl‹sm€™aˆ©“ch“¦ˆc|œ…\i’n{¢„bxšƒ^q—’kmœ§b}¤af”ŸvnŸ©€h…iu¤™mz¬«{h‰¤ˆ]mš¦ˆw¢­’Ф¨…„­­„uŸ­Šm‰«œpv¡xs˜¦†|žœsmŠ“wl•Ÿ{hŠ¢}]vš—mc‰žƒa|˜ƒkƒ™}bŠŸ|^zž‰_n˜‰Z_†„mhx‹qm€Š„mx™]n—…]nš”lb}U]ƒ‰dg“qb€Žlhƒ€…nb˜pbƒ˜z{l{¦ˆva€“’ˆl•žv}pˆ‹€uu}n_„¢‹†Žwz}aixc€˜€m’©‹x|q€”mmˆ†qxx_ˆ‰|‰}q”Šrsƒ•„r†’„ˆƒŸ˜ku™™xcƒ|^^rxŽ}bZmv{†„h…œˆhq‰ƒqbkm€}prgmdc’ˆms‰vuƒ…^^†€Zn‹’—Šˆsu‹}rh\ip€pˆ•©ˆ”§œ’’ƒ{‰”‹š²œŠœ£˜¢†mx‰Ÿ”œ½„ˆ©¸œ•¦Ÿ’’—ˆŠw}¨°Žx“¶£…ix”q^x…„‹v{Ž{q„ƒu^skrƒYOu’uUcˆ|Yg\YƒzgK_mKY|aKs{balppZYbcISpTWpZpˆd^_Xx…bRn†hSqv]qmaw]zz^z‰hzŸ‹ir”†n|šƒq‹{uz€rƒfŠžƒq‹™wŠœ}xšš†’•†•…ŽŸˆ“}ކ¤µ’‹Ž‰§žu}™‹ˆ«—ަƒ­µž“„„­£„žššŸ{‹«“‰­¡†š¢©¨‰š™—ŸŽŸlЬ¡€™™xhŠgr™fpŠœº¢}u“ž{}Š{’fz‰uƒ”…vnˆuŽ…fh{žrh…—m_unn”„^cƒ{x\Uv_JflaOXlZki]pgnSThslKImˆ…bZhq_NZbfw—†crŠuh…|^q‰pXlv{—|kˆ†z……—}hx’{mƒ€r•|{’…nq—„gs•…iƒŸ˜˜”x‹š„w™Ÿ”ˆ“Š{Šwˆ—€”£Ž£¨šžzm’wš|”¡ˆ™x™€«±sƒ„|“vv”{m‰—£ˆu˜•mv—Ši}•ukˆˆ}wf˜v^u†f^„x^q|}šva€†}€‹‹q}{v“wvŽkhŽwUg„|a}Žn||\|š‰sYMmrahXiuc‰|kw_m}g„xb“©“ps—•xƒu|‰hŠˆpƒr’ƒ‹±—{|n…©žŽŽs™pfŠ“|€nw˜…k…•}¢Šf]˜ž’xh„sƒqr“z‰Ž]^ƒšˆs“•v¨ˆv•žudŠ…ˆˆ§±—‰fm…hfŽ{kƒq]†ii’{ŽŠiˆ—w{œ†nvp£˜w‰—{„…b†‹nˆœwu”•{—n€—{rŽ…„”q{š‹™uh…hq“‹swlŸ{lŠŽ{Žvq¢˜uvžzކuž“np{zˆŽp¦¤Š°˜xi…¡zZp„rpˆkp¡”lclgx‰ip’Šk}™xlrˆœnd}{gŠ—u{ˆg_‰ŽhTalixvir™Šs„vKNiw€—xˆŠm…•ln’}_{˜ƒu”¡ŽxzhW}vaˆ—r^f‹lƒh‰}]vŠp{Ÿcq˜©”mr—š”ˆuZ€˜gs}œqx•”sq”{}”Žœ’ƒgˆ™m§—ng†…h€‰p‰šŽq_lax{¬}bl˜žzb}Š€g‹s„Žn˜mrŠ€l•uq€h|’mc’}az}Ÿ¨‰ˆu^}|i‹bw”xWcƒ—’m}Šhv“pp“€xŠmޣމ_Šu†™x’§kzwq˜¦¢”{|ž¡vhr‹l_„r…¡„…œˆ€Žs€¡‰ˆ˜}d€¤˜uxŸ²“sn—”¨«—x—©ˆ€Žz†„‹œ‹ŸŸns˜si£|dcŠsb\rxmqKf€Ž’wYi‰pRiƒuhXf‰gaˆsmRNuuUY]bˆuR\{…n\ahmqf{†\gˆƒƒam”\TnФ”ghŠžŠcc„ug„ƒmˆ”…_nˆ‹€vv“¨ˆlu†¡§alˆqgŽ˜{wb}wUn‰spdv—|w…|¡¤†vgˆ„¤¢Šww¤“nl««…ž™ž¤‰™ššžqpŠ—¤§qg€­žsЦ¤l„™‰—{•…œ—rŠ™wwŠi†¬¢zk‰«™siŠs‹•q’|‹¤ƒ¡—žv†u’žŽnfƒcw\l¡ƒlkvfl…^DWƒ€XKk’—Ž{YE_i]bEYˆ‹kU{—„xaˆ{}^Ž£œuhcŸ—iTfx¢†nŠ£n”œƒ†fˆ¢‹iZ_…†]Nhsbql_†—|vvi„awzc€’iY{ž¦—wk€kkŽŽ|Ÿ¡€’˜ƒ™”rŽž”€n™§¡”qv¡­…kp™¡‹‹|nž°§”}¤—„”„s¡­†gqŽ­µŠnu£³ž€kpš†„miœ¢\\pŸ}_k“¤—†pb‰Šr}|f€†agxn|”fMU…’€{rXqƒfZp^cƒ]Twމ†fmzmzkMplXir}Zn„mr‹ggŽ…u}v…xYˆ˜sP^ž¡sf€€…¡b€Ÿ”mr|xng‹ƒ‹Ÿxs—‰†šx^¤nOb}ššmn—”‹‰ar’€…™nqŸ°ž^_xŠ”v^_u“lhŽ˜¤rk‰¨®¤ƒ•®Š§Ž…¨—|•¡Š€£«ƒwŠ™²¢z‹§œœ­ƒz¡µ£””nbnlƒd\zžº§€mˆ¤|Zh„ƒu‰£q“—wx’vn—_Y}—|h¬¤m^bdƒzK_…ˆb_†^v˜…q_Rƒ•xaZh•ŽcTx—zcrqg“f_ƒŽrh{…XWvp\r„vŽ^fŽ¡|YaŽ£ˆm’sr•ˆb]_u”¢„kvž®™fa†•‰kUhŽšˆr}†nuŠuh|ƒƒfpŽ”}kbp†ƒnuv{…x†™’”ƒ}˜Š{uz‰‹}ˆ€}Ž‹}€Ž’™†z…˜™z}“|hl†Ž{l|ƒu€•…rqu™zi¡®™|lzš“ws…}†žlm{š£š•xg”£‹dg‰¢“h]m†£¬ŠpixŸ§š€ds£¤YNlš\g_NnŸ‹…_†¢’xb†¡‰}bNs}SNp˜Ÿbu¢¨ƒlWm|}—ƒd|£šzl^lœ¨Šff†¤“kc‹©”……p†•mvnc†’”lrœ™q]kwx•vv”|}œ}hƒŠˆbqlr™šuYu”¨”hZf‰š_TpŽ¢sx^r—{URsŠ]f€s‹¡{bn†‹’a\£•lSbxŠ˜mb{…—¦zuº¢p]{’Žh_v¢˜{bkz„œsf…œ”˜„pŸ²©”{}|„”vrœŠq‹Šcq°±…‰±«Ž‰Ÿ€m“hp‰ˆqšŽqˆ«’mm„’¡|]mƒ€Š¤‰f}§«•lSh™sWf‹}TTsxw{^Z‹’pWc„x\l{]g”mYxŸ¢‰…ƒ|…ˆ’l_c‰fWm…z‰fmƒžƒd\€˜uWaŠŠpz†œ¢€p{xkˆœ{lŠ˜maƒœ™uvš¢…Š”…œ“u”{d}nrŽ^€žv“‰d€Ÿ†b{£¢‰}bYn|‰vXPw‰ž•zp˜°ŠkmŠ”™…udsž”ms|s„d{ž’vŠ|ˆœ¢wq€£ˆimŠ{n˜ˆmЬpq•¦ˆvŠœvnŽva|£Ÿum’—€“¬ˆnƒ¢Žpuƒ˜ls“‰„œ„i|…’„ƒƒzˆ¡šh_€œ^u†_Wk^kˆml€]YxqnlœsYs—ƒcbYkŽq\zif‹n\’md’”la…•|f™qXv•¢„fް¦xd|Ÿrkdq„œ„iiv’ug’£ƒbn—Ÿw_u™§‹n©¡••pcŸ˜vgƒ”™™lbx§Ÿƒsic€Žb^„™vh“l¨”qzŸ—im‹|q™Ždp’•daˆ{f€v™…r™™qx{zšˆgn™”rcƒ¢•|}_Hk‹„\^ˆ™s€l\‰aF_€™uwŽœiƒƒdˆ¤…gg¢•n_€žˆdkwrƒnŽ€cŠœvdˆœ„“dp™¦“ph—Ÿwcƒuˆ˜p_…¤²s·³™lZxœœƒcc‹š|hŽ£ˆ€”†•¢€v‰¢„p‹°¨Šz‰˜zq€Ÿ¤}|£§„€¦²ž’{azˆ|‰™rv——vs—‰l‹‹”“z•ˆis€i]vŠrZwškm…mc‰€fkvnŠ˜xf‰’ƒ„UmŠ^s„ghpUuŽqYrr]‹ia€uXr…dgކcf€nlxbŽlmˆsgŠˆbmxl„gnk‹hnŠx\}„crngŽˆgv˜‹m‰m†œxx™‹mˆŸ|x“q€—…¤„s™¡†shsd{{}—„lŠ¡‰qˆ•ph‰‹kizl†“kg‹—uq’z_}†nxŽlq•ˆfv—n’˜rw‹pgŽu†œvc…œxd‰¡lˆ•Љiƒ¡†l—Цˆ{˜˜rƒši“°œwp{}®«„n¤§Šlq—™maƒ—ˆˆ¤¦•ur•œvm•«hf‹®©†m{£™‹bqž¢x_m“œ{h‹žrœ©ƒguŸ¢xh…žiz’œ|b…©“lb}gXw—šwlŠ…]gsqŽg…“nf—m˜xZn’lh’m\v‹x€ƒZmzhzYm•švScƒ•]imu{k„z€™|x{R^ˆnZ„“zcŠkrœŠbN_wƒv{¦k^u’¡Žˆ€an••un¡{_k‹“…”ž‰•vw—vŸœzrqic…v“˜uƒŽv‹Ÿ…b^x‹ž}n“¦…m†irššz]]x”n€’p^ƒŽss”€iŠœ|s}p€“kp•ˆmsŽ„iUk|v^ll^‰¡}^Pp‹nXrˆlh’gm’˜|€u}b_œŽnw|l€•“}hŠ—sgŽ°šŠ—“}|sc†™wzŸ™vk|ˆv”Šˆks“šœ‰vm“’{†r{—€q•£€wšum„™œ|ަ†}z„«—w}kˆž’r¤‹†Ÿn”—m^†{}kwšœ€qvv{•£{^v—¢ƒm£•uˆžzmŽmx{Šfk“šxb„—rˆ‰{h}™zfn‹¡ˆq‹•x…™ƒ€—gž}k’¢n’’pv}{™ž{gƒš}b…¬žqc|•}h‰œwa…ž_{ž•ˆ€lkbq—™sg{“’fY|—{_urmi{—|c…˜kRas€”ƒ_u”€h‰’lf|zxcOx€hhsq]]rcOmuu}YR’aJk…cRzŠiW{kXw€v”‹ZX^m€ŠŸ{š‹v‰ˆ]nvg¢‰ŠpmkRuŠ^Y€œŠr†œudЦŽkh‹˜rk“n}§¡}{˜š•”€¨¼ž•{†¦š{{—«š{v’Ÿ”¢©†qvš”x’­Žx’°™£¼£”‹Šu†©³°œœŠn€ž“„pl™˜z{¤¡p’kqœ¦ˆx•Ž}¡™qrˆqhp—¤“|x—’nwsuzs‰fm”ƒu’wO_‹siucru^lu‰Šiw\NnЉhmfc}vpWp}u’—x}„b\r}mŠ‹mpan”‰s}knbxucƒpq‰ŽndŠmwŠ}|lk“sv€nzuh{|Šmmˆ{s”d„•wc™h”’ˆhw„m{rv“……{hiˆ”{pvfhw—ƒl…ha{xf}ˆkuŠ…mp˜žƒhzŽzb|˜“|Š…vx„„g}†|{g†œpl„{d…˜|gu‹„€v’“n}„mqƒ‹†x“rhwœcarldˆšƒlx”m^pš‹‹“x{”•…w€”™wq”Ÿˆ€”“˜™‰}ˆ†ur”˜si‹©£r§•vr“™{{ž˜{}‹”‰wxœŽq{…m„hhާžvi€‹€{‹©{˜¤}fas•žn|‰”’z†˜‰pg‰„ux’”ms’vvˆ’wWYqx£ˆkqŽv„…vgm“•fw™£hwk{—†z™rm†…žv{if{z„€{¡£qq…¡‰gmŠ\qŽŽ‹rqXrurˆŠ|‹‰…sœ™‰v]g|”„dm„v˜|]f…Šn^nwwžq{„p†…qw|n„{iˆ¢•s{{psmu„€„“sf…Š˜¤{b}“vi‹Žq{ˆga}iPhŽ‹k_ƒœŠm{ŠfWqƒ}{ss“‹ni€‹ƒiZ]az…ˆŠ{{„q^s’’pcvˆk{œŽxmŽ™‹qTlŠhihx•“ˆhl€Xf…œ©Ÿˆ|…‰w…—x‰Ž„‰“ƒ‰„pqœŠhmŠ’Š“x„‰’—w^mƒh†ž……¬¦’{p„“Šn{“ž{x™œ}vˆ}}•Ÿ†|f}¨¤Ž}„…ž”ll…|uŸ“sˆŸ‹—”gp„in€“𢆀†Žwl”£‰nn†™‰ŠŠ|sv…“m]i¤†hx——€nƒ…}pv˜„v™¡†vzw{{|•qiƒˆ‹v^u‹Š}…ph|ˆud“vach†ˆmg‹”qlƒzXZz˜ˆbl“œ}ip{…|s}sp‰“™{ˆ…€sfhƒ’‰…“€wš£‰u€”pZ}™“|}š…kvˆu]x’ˆnd}”˜ƒm{’l\s„w|•žŽ…ˆ€w|wis‹{w€€ƒ…|…”…pmbhs…‰„ˆ„wpmcdzUW|’™f|ˆb]__€˜‰zs{‹Ž|pZg†{Th‹ˆŠ}pƒž’hcmruZp£¡ˆvmdi|upbdœm…”Žlk’—’‹‰œ«Ÿˆmi’¬š„{r†”zlЧ“š«’sdh‰¢„sœ¸Ÿ˜¤‹v‰™ph{•ž’…‹Ž’ˆxmn•¤…qu†£¦}p|ŸŸ†mv™Š€…Š™±³™nnˆm}}…©®™|xŠˆnmzzƒŠx„Ÿ™…vbi„’zhp†‹zkƒŽ‹’Ž|sZdn}wi{ž“†„wi†€kPb“|k€š•kl|‹}uuŽ˜u«—pv™’vff|‹qi‹’}m‹˜ˆppn{q¬˜xfs‹ˆqYv…up|sv“ƒp{‹xp€kxƒ…‰}dn•qa“€gw‹zmŠ{zrmŽnawul„€fzŠha{‹€zplpn€{aZ}…]g€—˜unvŠkgs†sl{{{\s”’uh†“u^_sކp…Ÿxl|fk|uƒuvˆkfƒŠƒf}”l}”„x…†ˆu“ˆƒx’„unvˆu¡˜}u‰¡}hz™“x{•ˆŠ•š}|’¨‹’|’’£šž—†wš“|Ž—‹—“§˜ˆr“’|ˆuŽŠœŠiš¢uˆ…•™£—…¦ˆz€s…’}ƒu…ŠxŠv“£}pmƒŠfv“Š„z’ƒfŽ¢Žrm…lnm’Ž|€m„_{zxŽu‹q|„ƒšvp‰ŠsšŠfuq€|\s{‹z_ƒ‹™—u‹˜†m^…Š{ngzm_€}€|qhT{Žnxž•{rm}ƒ|vmaxw†Š{ƒ„…lbbsxiqk€Žpfƒ{]x’…qzˆ¦ugq}v„€„crŠ…}}„’{•Ÿr_p’’w_s’‰x‰ri“‹ni€wZq‰”uZ{—‰dfs£|i‰£Žsv€ˆšˆ„ˆx…hhƒ€mu†’ƒi]œgUdr^q€““isŽ’™˜|†„pn…amˆ†’œl™ƒvfu|™€w˜kxˆŠŠmuˆ‹slr™žƒdr”Šsˆr””„fŠ¡•vi—v¦…{§¬qp‹ŽŸ™zuz…Ÿˆku—°—v^n˜qŽ™}xŽœvw”Šnz‹q_Ÿv™†„cl’“†mpz}š’€rl”£^h‰k’£ˆmw¡š€nls…Žp€x“—uŠ˜sp€xŠqƒ•†…w“}n†zkŠ|ˆnZž‹fd„’mfŠŠpspw{wfu‹vq‰‹’…vhˆˆvv”‹•’vi——{nŠƒƒ•v{„|r€n€}zc}Žlh|„||ds€nbh€vx‹{kˆql|n|rpmŽ{ns…m}ns…zqˆv}”u|ƒ}†€f†Š}€ƒ{¦”pq‰pk€xppxY{’vƒfvœ}an†}’„_ƒ’wi|rb|z^|Žˆ{_mnY€|iz¢‰wŠ”—uw’™|u€„zw|¦—‹z{Ÿ‹n}’}…¢ƒ¡˜€™£‰“¡ƒ“œš°—†”œ‹šxˆ˜Š…†}œŽ”wg†}bv’u€zl•Žrsqa€xUr‰qlƒnz’lu—Žw{ww†pv’{“ru™lf{|„gx”|g{zx™ƒpŽzrp}‰la††giwr“kw‹}p„su•wg†}Žš†‹œ€£‰|‰v|¡—ƒ™…•q…œ}pІq…‰u”•qz”„q†r‹{m’„pˆk‹•nlˆ{q„q|‰m—u†Ÿ{iƒˆiwrv•zrƒk™wx“ƒƒ¡u”‹n|…ir’wv}uŠs\z‹rpˆZb„ƒŠzv€iU{zanwd†€Yp‹{c„Šcgs€”md„“k‹œ|qƒmu—vd…i„Žgu’xc€d|d…‹gsˆk_†h€†bwŽqhia‹|arx]{‹ci†xbˆk„”rŸŠw€nš”wžwz™z”z¦Ÿqcw’™œ{™ŸˆŠmš­š{}’vk’uŸzxŠx«…sžˆœ}‹§†Š¨Šr“ŸŸw•¨…z•ˆŠ®’wšŸxz˜­p„—€ˆ‹n—žxrx^z—†„]]}„^bx€•ar˜¡ƒ€ˆ{‹bz‹v{vc‹nqŽ—xs}p‹™mg„—‰„|a}vp‹ƒk}|g…€f}ƒg|“sg„…k|dwqŠ•kc†pukSzƒf\sh_„}^ivqxx_lˆvxxWuˆl_x„ps{_sƒhv•ƒkzˆp|ƒm•¢lvxvš’s†¦xnlŠžˆ{¡žsbkˆŸˆr¡}cs…ƒ’™|˜mp•¤š„sl’Šix•…„œmˆr—z—qˆžr“˜|…ˆz¡”k§­™„aa‰…dmˆ{s‹ikd…žab†Ÿ˜zn”™vuqn‰”sgm_w—¡nh…’quŠwz”pm•Šgs•|ˆri’|b{œœ—ƒcsvdƒž“‹\m†pf‹ˆhu†nw‹bn˜Žƒfa‰gn“Šqx|z˜}i””z“gs˜v‰„ƒƒdƒ”lr•‹kiŸ§x‰—xrˆvcž’qu‹€iŽžœ¡ˆ}rb”{s”‹w|h’Š|—c{x„¦„vŠsŽh”Ÿuކdlw„¢mŠž{hƒŠwŠœvs{gu˜‰r‰nh|g…‹r„xWx†lhŽ‹pv}cdxpx†u|m’}b}™iaz§”qˆ§žwi„}’‰}hTxu}“xzš}Zazƒ…“„u„fw|sŸph|‰ggu€rv…rcaƒŽz†vk—˜…€Ÿ’rˆpƒzx¤“€kn|”zpdhburr€†|p„asŽ•ƒƒ|i†vhƒ†š‹luŽˆsmnˆu„‰n†}Ÿpvx—„l‰¢Švxp€šwn†‹xˆrx€v—lu“fpzš†crllŽ¤Žƒ‰qsšŠˆiXs˜˜|\X|•„gap}ž¡‹s|œ‰„vœˆr}{ˆ‰w”…{™ƒ•±}™Ÿz¦™xŠ¡ˆ|™’{ž¦€}¢®Žz‹­¡fqccka†ž}dd€š™}ƒ“z\p‹{b—xh€€m‰†i…ž‹}ž£{}¦°k]qmg…viwpkx|Žž­ŠsŽ˜ˆx„—ˆspzuƒi{Ž€nWv€cl†d\zpSnuWmxY_}m]ƒ|hfas€Zcƒ|g‰šƒ„z\u“|c„g…£ˆ{•…n™¨†l‹°º°žpd„¢Žx{s…a„šgˆ­¨uq€‹zŽƒ_s—˜ƒ|cq‰…i‹p†ž‹™†hšvg†š€h‹™sf„“n_€•s†ul’€ak€qh“lbwuŠ”lh…„fp•r\RZwpZl|YbˆsPShz—…]Wp‰kNTgz…p{™…dq…”¤‹lxšq…v^w˜¬œqi…nˆ•rg„¢|c€ž¤““¢vp¤®”pvš®œ}sxŽœ¨švа§€{Ÿ·™ƒ”¢“¡‹ƒ¡µup™¸«…x’§Ž™¡•zu“¡ˆis’˜s}ž¢™xi¨q…rœ°•sh‰£ˆkzww¡”}„za}—}€ŽmSf‰bK_†‹}qbEZ}ugqlOd…sbha_xi_ƒ€Ybwl^}wWk€v|•v_€”zZhŽh]€…_\zsWl“T_ˆ˜„ld]a€’ŽkUn™œz\^|pZƒœ‰x{bYƒ˜•zvkƒ¡˜n]€¢§lifz”¬Ÿv£žƒ£|zœ“…ž’blŠ£µœ|ƒŠr“­Šr‹¤“‹™vZq”ˆ’sUx˜¦rkgp™£ƒdiž†ƒ|Zs™¬¡ƒx}x„•s„©“u¡‹r‹”{hަ‰adˆ”Š—f_|„qŽ|hކcv•|k¬˜ƒnTi†sg„xNUp†ƒ^n’œŠiz“|p}—ŽiƒŠlwœ„krupwq€vršzsqRn˜”{dn†|Zk”“iYr]s™‹ˆ†sk]wxƒ€\\„k†œˆ”†m{•—pŠ©˜r}™†­zz€¢{Ф‰ƒ¡_}•}q—•q{{{¤sŠži|‰xˆˆn”•rxzuŠ£„kuƒh’™ss“ˆ|„p”——mnlal’hkˆŽl|¤”ws|rh|iz™smŠzcŽ˜ur’•rkˆ’|g€£Šs„…g}š†m‹˜pg}†š‹n”ƒŠ_]„p…‹ds„—‹Šš|rx]pšlaˆ—qWa|œšƒsXZw{‹”‹}f}ŠgWZv}giwaˆbv”wgsbcŽpq‰sˆmq€xhƒf{…kƒ“qvŽzu’xh‹sz’xsƒiŸƒx„xp’hˆ˜zn…dzŠ’“s€…mw“upœ¤ƒs†g—€‹…}œukŽ¢‹…¢z™qx££•—‰…rx¤q€š€q“’n}Ž€š‰kl˜£‹ƒdzš|h|ƒs“’ix€v˜¨žds“nfŽnrp•˜vq’§Žicxwg—”nuŠxfŽŸmz”w\hƒ‹n…ŠgzŽ„i{¢Šrˆc_}……˜h…†fw”ƒxšŠ\a„œŽlwxi•ndˆ|ƒ|]Ž€v”’nlsˆh‰{„cp…p|¨¡wd{Šzžuhz’v]mˆ”{•m|‹in—“v}fi„nŠ¢ˆ„p{gv——‹{zww……r{™˜il‹‰uІhŽ¢mxƒck}|•—id}˜ƒb}…s’adŽž„kƒm{ž}_q}XbiZ{m†“di‰ƒ„_Y|¡¡bWw‹qn’zfŠi€¢‹v†„bd‰˜wg“­’pn‰„h’nxœ{˜hq—’gf|ƒ†™|pwu„”cn—Žn€’pwž†i„¢uˆŠu’¦’rvœ¢xp‹…¨¶‹ls˜hv‹}”œiWi¢’q‰˜ƒ€Wxwi‰a„gmž£„lilcq—gk˜qfŽ™}“—gv—ˆb„¬®ŸZRsš¨†in‰€Zz„_d€•’—™wˆ•…fgЉ‹¡ziƒŽn˜ux¡”kk’«£’ˆ{g„˜mY„¤™vmul}•“‰g_„ŠnƒšsgˆbgŽˆiu˜ƒYi’Žpqucr„qYm“zP^{€ˆv\aŽ”nb…xcˆca„ˆkcˆsgcg‰†cbˆ„r†z]‹ŸŠhYv’ƒ…gZ‰™{^|qs—z]w¡˜qc…q—ll™”ml•ž€{˜p…¤Žn}¤œv{x€£“rƒ¤”sw“Šmˆž€m‹’z…œ’v‹¤wgޤ˜urŽq‰šnn˜Ÿ|fzxsž¤|f£p€—zm’“ll•lvŠ{Š”„rvx—™nrv„„„ƒb{ƒi{fƒ©“pi†|š“Ž…bR{¡prˆxƒ—i]u†¦}d}š‰—“fg•­bXx¡¤…wš¡_dˆ†ž‹bg‰{bŽžvk”¢{gz™Šq…ndƒdzœ…gr…„p{|k‰Š\_„iƒ—lcŠ’faŽžˆw†Zp•ZcˆœŸ„^\h€œ…d|—|u˜q†š{|™{nž§…cb’Šfb€Š¦¦}g„Ÿ„mxu{¦˜q^c{š˜|g_}„ir¢Ÿ}x€daˆƒbkžca|wzžžrmŽwzq{•uœ{n—¢{auˆ}‹•hk—¦‹ugk“|qˆrd}^qvužŽiv™˜xsnu˜˜{gKaˆ†aZ…“”™{\m™Ÿnssx†„mhu’Š]m“’‰f\ˆ¤™g\uŽŸœih˜Ž’{q¡nduzšn_{ކ’ƒ^z¦œzgUc“—xlaq€Z^vxŽ£sf„£ˆgv‹—§€gg“¤\c‹¡¢cc€š“m‰œszŸ†fˆ®•icv¬§Žii”£ƒc€¢—’œqh—­vpxŠˆŠvbw£zh£ƒŽmp£œsfp‰¬¡ˆ|w|¤nm˜¨Šv€r…£‹v}{„­™d_ƒ¦§xZuœ¢}]iЍ¢|\^¡zXrœlMcz€Ÿ]PxŸbY‰¡˜zSpœ—nd}m}cY«x_^|Ž}bX{£¤wZTu‹Ž˜s]˜uTlŠƒk\z†piŠ¡}kxi•˜nnši__v…‰’™sYu”ƒ^sƒ“†Zn˜™|{wwŽxzwOh•ŸwONhpˆœncާˆfS^ެŸw^k™•pY|¨“qmhXƒ¢„u|k}sW\{”Ÿ‰dbr|xž•qŠ£…h|ˆœœ…x’žva…«¨}|†nq—œvp„‹—Šbz¢h}’pq˜iz©¢ŠlcšŸuYcz¡l_x™™dd•¤…qkc’©\d”¦‰Žvrž¦r]}®¨…mlv’¡†Šxg‰’mr™uœi€¨Ÿz‰¨†¨i„ž¦Ÿ‰xwŠ’vgŠ—€v„””f}”vuœŽag“¤l{{|ž‰as™š{z†qv—}fŠšlZ…£“nllZ|ž€_ihn•cS¡˜lOTr”wSix„fi‰’{dim}—vWq™€Zw‹mw˜r_…Škƒ“gg…]i”‰qЉgƒšuhˆ{a’rcƒqx˜q“™wž…s’“r¢‰r‹„v™”im”’}’ix“lq„zŠžwhŠ•rnŠqqb€Š€”gzžlv——€mz„k€“vk’•pl’k|—xv“ql”}a}¡Zl“…i€…w‹i{¤ˆfg’“pmvl…bh‰aq“zf‰‹iŸ|r˜‹k‰¡zg˜lq|qŽp‹”qwœ…g†ž†•hq—ˆgˆ™siŽhx—††¦„rqq¡„iœwp𤙦‰cl•n{Ÿ‰q”u|«¦{x”s‹‹lžwvŸ”m{¢’nŸ…ƒ™ng’gl•„c„™vk”ž“zXiŽwY}”pn‰u\llr”†^d†]i—œ}…hh…g“q|¡_{žpˆ}š”k|£‹hƒ˜q]ˆœ„w‹ƒhbk’ƒd†šlc†€\p—“…iZŽ•m\€™ƒqhTr€†ŸxSp˜Ž_\”ƒnŽh’“lu˜…ƒžvZwœ—sxzh{qf}ƒ‰ƒsmhvŽ¡px’rZx”€vzYk‰ˆ]iˆœvhnWr™‰g|£…nscn—„hff‹kkž©“m\wš“gnŽ|’†s‹†i”¡xl•™np—“|’—la†”Ž˜‰h„¤cc‰©—€pp…qcs•h•™lc‰r‰f}£†l”q€§•r‰¢¤‰¨Šh…™{n”“p„œwi’’{•™kvŸ”k}šu˜nuŽ}˜lZx’{]†ŸŠˆ_hŽ|p—…]v•{dƒzi—™rp¡˜rx‰sqckŽ™Šˆv\„£†nxnd†žbzžŠ|{bv•™pz€€€r“„rƒgm‰‹k|“lv¡Žkzš…‰bhgmœš€‰ku—sr“rŠrZ†—np”xp•{b…ƒk‹ˆi†Ÿp|s}¢‰_h”w„cq™nx€pŸ€gƒ‰mŠ•in™”dd…€„—}]}™}cn{{|˜„ar‰q{ƒp”žrb††g€‹gm}qs†ƒgrY‹lu”€l|’n_ŠŽlzœzd}xhu“•€wksƒ†pv’in|kuvœzXq—€^zr€˜rYwœ•}xlƒ™zr‰x™ˆ|v‰œ˜€l…žu|˜”†wrƒ’˜…vn‰•…vp}„—˜zn€ƒ—€m{˜‹xr{pƒ“„v‰ƒv‹•{ˆp€™•|€‹†Š˜}s‰’†{Ž•zh|™†pˆ|€wz”|d{†ksupŠ{m‹^{˜}m‰kwŠ€…svˆ†p_x˜v^{ˆpz•|gz‹xif—kh‹”wvlw”•€vl|˜qqŠ“Šv”u‰¤ƒ{ˆš|s•—{—‹ŠnzŠ…pˆ˜†ruvsŽ“x|ƒzƒ{wvŽzŽzžprŽ”{ˆ†hƒ†’„‰fx“ˆux‹{{ƒ]sŽr€Žu’}cq…œr|€dm}„ix€m”…Ugކl…ƒb„…^g…{g‹}h‹wg‹‹gvŽhkƒ„vh‹rv{p…„z]p“€g”xz|bs…{’‰Ybˆ}†„v†uh‰‹rn†”nwŠua…ž’|_n„wv‹’l|€k|¡xx{‹‰…„Žuœ”rwˆ—‹€€˜ˆmk˜—ˆm„z€…n¡ˆ}w€š”ЋЅ{|ˆŽ†s‰}‰”ŽŠg„ˆ…ˆƒzq{”†„{ŠŠh„‹…w€ƒ‹”|vs„Ž„‰{|ƒqs‹œp„€„‹ƒxwsw—“sur†ž’pf•˜ik™•m{¡—ƒpqŽ‹…|}{zŠ}ˆ€wu€Žn„xunƒŽxu{vŠpx„z…†sxˆzk€…{v}ˆz|ƒ{wŠ|fz”ƒŽuq•’cr˜{{Šxr‰•xr}…ƒ{u’€n“™vk†ŠƒŠ€rv‹zq|x…”’{qw‰ˆvs€ƒs„•{iˆŸ}mxuv}Žk„mrˆvu˜‹qlqs”uu|}{Žn{Žuvws˜lwvh’‰r™sp„i“sw’zlzuv†”zl€mu{…Švpkn|„|{zz„kr“zd{Ž€km‰„ir|‰ƒig„„m|}{rs”‰rsn™„ax}{•‹lƒ•q’nvŠs{Ž|€||Š”€|wx€‰qr‰šŠu{|ŽŽ€€‰ˆv€…|}{”‹s“˜s|œ¡pŠ¡‹ˆŽ†|ˆˆ˜¤x{’ˆŽ˜r‰¨x‰{¦™ƒk‰£zq•sŠqx“ˆp}•„“xmƒ…—šufˆ˜Š†}vwœ}qx‰w„¡rcˆ—qsˆ‹wuƒ‹v„}i…ž…nˆ{mƒkxvz‰skƒ|{riphlŠwv€gv€ug€xuƒpg†im{ˆxw_iІuvrb•vc{iŠg\‰hv{iim…wsbuzp}skqx’‹f^ˆzqsf}‹€pzƒi€Ž„vksƒˆˆ{{……}{†‰Ž†pk„™†ƒ‰v“¢g£…€ŽzŽŸ€q…”—“Šlw……”‹xv€šžuƒ™Ÿ„lˆuz¡Š|”™mlž¢sv‹|¡”kr¡’lšp„zn™—h{§˜kp•Š{p]‰žnfƒqš†dƒ’pg“dxŸ‹€“špr——gv‹c|•x|r‰—‹rb•’gvŸ†c‰¨m…¡ƒ……w’…gl—šnhŠ’€|{„„qk’¦v_™um‹™}]uŽšˆgqŸqW¢“n{¡{hˆ†„wžm_…Ÿzd’Ÿix’€nm†ž€Zs¡‰_Ÿƒr}spŠaŠžnc‰Ÿ{Wušupm‰ˆiqŠ•n•sm““‹Šp“kdЦb‹¤€ixx…—kf”œgSˆnZ€”‰q\v…vsd‹’ff|hxœ…X\vœZ„Ÿ{_vŠz_ƒ™wuƒn†pgŽ˜mcˆ„Zq}g‹žrb„nh|hrgˆ„fx{k€”{Xw—ƒ}vn”}gsˆ†x••sknŸqu£˜uw{ФŠswŽ—k{£†sŸž€ƒ}„Š‹ƒ}¡”hx£—s„”˜’qm{œ„^…¦‰k‰œƒv„|‹k¡vg—©d˜€”x„‹sˆ’•ux„„†{„„q|—}g}‹rxƒƒ|xn|“qiƒŠx…Š€in’|qz{‹xn—wa€¡}hƒ€|ƒsg„žxf’r}}m}zq€‹gl‹|gq{ˆ„rfn‹†Zs™zi‹ˆnvŽq†xmu˜•zxˆ‹vxˆfmzˆ|kƒ—{lmpzxq}vk…“ld|…€|su‰}q’hh††msŽ‹…wps—ˆZsœxmgr’•}{n…švdw”€pŠqhzs€hi‰g_’nl‰ˆukqŠzw„•‰glŠq…—”vp…’‰uƒžŠp•—{w„˜•‰uzz£¢xwŽ”†q‰š€xˆ’‰rw“š€w’ch“˜ƒrqŠ™{]sš‰h‹flˆœ€qŠ•uh‰ƒn‹™{p‰zq“žqh•—iv¢’k€’vs€rœ„_z”€b}™wuˆ€xrpq‰”xg‹iqŽuzxgg’hušƒZu™Žz…„x•qw—€m£|i…Š|ˆŽu‰¡qc‹£€d“€€„{wwƒ™la•sn…uˆ’xvzz|”}p‹xqxˆ€‰ŽwƒpŠšf‰¦ˆc}’‰‰‹„„mx“r¨‰b|—ƒ{qŠ“„muƒrs‰”{m|€„|nf”{g|ˆqd€Š„q{}†ƒiuŸŽbp•Škn„„ˆ|„Švf}˜‰mz’ˆppvƒˆ}s}ŽhuŽqbfknl„†iq‹ik’Žgp™p}xkvš“sx††n}˜ˆ{€…‰{hƒœ‰l§‰_s‰…{xˆ„ppŠrh‰xxwnxƒsŠ_k“†}un•€iˆxl{xs’†cs€€ss™Žh†ŽvŽ…x‰‹ˆs…•|p…š‹‰{n‰}uˆŠqn˜’rfˆŽƒ{rƒmu}™}s…’mˆˆ||‰v|Љs†ž†s}’{€‰|}‹ˆxƒŽ“…ˆ„‹uz”ŽŠ{ˆ‹xk€—„|„}xm„…sŠ}ƒ†zmw‰Šx}‰€zxƒ‹mƒ™{u{}ƒxŽ”‹}w†}ƒ|Š•w||v‹‰Š€x†{q€“‰uq€‰}pv’‹ux„€sw†ˆ€wƒˆmrЉ„…v†‹wpu˜Šgs’…c{œƒr}‹‰€vl|‹|qv…ƒqn†vs}w{}nm‰bx€s{…gp…}i}kˆƒnk}ppˆŠsp…ˆxdrŽ{xsxwz}{€w{ˆw}œ‰r}„„vmŽ™{uƒƒ…}z„†€Š‹up‹ƒ…w}…}ƒƒ|€”„ƒŽ|}†„‰ˆŠxq‰˜‰qœ…z‰}|—…z}Ž}‹ˆ‹ƒƒ„……€ˆ‹|‰w‹}|‰‰€‹…—ˆux‹“…†’ƒˆŽ††ˆŠ“€„Ž‹}€““€‰„z|‰††€}†ƒxl~Žƒyy€~€sr†}s{~bsˆ~ƒxv€t€€r€…ƒ~€yqy~ˆˆxwˆ{wŽŠqyŠ€ƒyoƒ˜‹w}€|€}…€|{w~{Šˆ|tƒ||}|……ˆ{|ox’t~Šˆ€myˆŠ†s}Šˆ{x„€†…„…ˆw€˜y|’Ž~|ŠŽ~„‰ƒ„ˆ…t€™‹r{”ƒn€’ˆx€…††ts~†„}„~{€†€€~€w~ŠsxŽ|n…™€nyŠƒs„Ž…nfˆ—{d‰–ojƒ†pfw}€~xsy}yppˆ„nd|Žpe{Š|k|€}oj€†|ny†{nt‰w|‰‰xw€„|s„ˆ„€u{„…†{s†Šxs†–€m€—Œj„šƒjp–‘t|€…|ƒ’ˆ|pƒ”ˆ~y„Œ‡€{“wpƒ—‰t|ŠŽƒy€”ˆu‘’…w}‘Œx€—’zy”–~Ž“€„“Žˆ…€Š–‡„…Љ~…~€‡‰‡ryŒ–|o’|sƒ‰€‡{~†~w~’€u{‡Žwp„š‰s‰“‡}ƒ‡…Š~…’‡zx“ˆx|˜|zŠŠzƒ…‰ttŒŠyz…Œƒrr„Œ€hx“|j…‰sh›ŠosŽ}€…‘€|—Œy…–Ž|ƒ’—€k‡›“}|Œ‰}–Œxy—–wu—}t‰•‡p€’…t€€qy‰Œƒwu‡Š€|s€‰xn…—„lu“…hx‰„|j}’„muƒ|x€qn}‘~j|‡xoy~~~oq~}yttvwvo€€d^~xhp€€sm}‡wh€Œvly„pk‡•vdyŒƒu€ˆ€qo‡‘~m}Œ‡€zy}t‡‘yq€‹€v~‹ŒsqŠ‘ˆtvŽ‹|xŽ’}w‹”ˆ}~‘x€˜’yy’…‰‹ƒ‰ƒ•‰€}˜‰|ˆš}~›Ÿ€tˆž‹xˆ–‹x„–‘„u|””x}•‹t}•~||ˆuƒz}‰‰xy’‰oy”ˆly‰pmƒ…ypzƒztt~ƒyuzyvvzyrtx~|vtx€~yv~€yvƒˆzr€ˆ€v|ƒƒxqz‡…}y|~ˆ€z€€ˆ‡zz‡€‚‹‚€ƒ‡‹ƒ}€‰ƒ~‚‹v€‡€€‹‘€yŒ‘„ƒƒ„‰‹…‡‡|‰›Œ|…‹€€‚zˆˆ‰~}„ƒ|~‹‚r‡t~z~…‚zzu†ƒny‰€it…|zyxy}‚||}{„†xx€†}t„€}vy†ˆpnˆ„vxˆ€ru†€ss‡wuƒ€qt‡ƒx{xz~y|€}{vˆyr„}z€‚s~Ž…wŒ€€„€ŒŠ€ƒ‹ŒzwŽxy}‚‹ˆ}‚‚|†Š~w†Œ{{†Š€}„†u’‹wxŠˆ{†„yˆyŠ……ˆ‚ƒ‰‚~‹}Œ‡y†Œ{}‰z…Œ{}„{ƒ„}v~‰|zƒŠyy……w~†yyz‚{w~}w}ƒ€y€z{†‚|€††|yˆŒ~zˆˆ}€„ƒ|€†~w€ˆ€‡ˆ‚‡€{†‹…€‚„‚}†ƒzƒ|€‡‚{…€zy††yy„ƒ{}‡‡‚‚ƒ„†~€‡‡€‚‡ƒŠ„‚†Š€€ƒ†‡}‡†~{„†~„}€€€ƒ€}€ƒ{€}‚~y~„}z€}€€€„}„‡‚~€€{{}‚zƒ}zzyyz{„‚z{€}}}zuy~{z}~}}}z}}}€}‚€}{€€yy€}„€y€ˆ{{}{‚~ƒ„ƒ„„„ƒ‚‚‚†„‚€ƒƒƒ€„„}}‡†‡„€‡†‚†ƒ~„‹†ˆ†‚„€€„†„ƒ„†‡††Š‹‹††‹†‰Š}†„~†„€†„€~ƒ‡„€‚‡†}ˆƒ~‚†€€†‡€‚„€~ƒ†€~€ƒ~€~‚†ƒ}€ƒ€}~€}~~}{~}x~ƒ€yy~~‚€|{€~}ƒ}w…€|{zz„|xƒƒ~€„€…ƒ€~€„„ƒ€~‚ƒƒ€~ƒ‚~ƒƒ…‰€~‡†‚ƒ‡‡†‡‰‡…‡‹Šƒ‚‹‰‚ƒŠ‰††‰…‚„‡……~‚„ƒ‚€€ƒ‚~~~€ƒ€{€†€}€ƒ„€|~ƒ€~‚ƒ‚}€…ƒz}………}ƒƒ€€„‚~}ƒ„~€‡…{z„€|~~~}{€€ƒ}‡‚{|„‚{~ƒ}y}€€y{€‚~{}ƒ|ƒ€ƒ€~€~}{|~~~{x{}ww}yu{€zw{}~|{~~{|€}{{~~{z|||{{{~{{€€|~ƒ€~ƒ‚‚ƒ„†‡†††‡ˆ††‡„ƒ‚‚‚……ƒ‚‚…‡„€‚†‡‡…„ƒ„†††…„††…‚ƒ„…‡…€†„€‚‚„ƒ„‚€††‚€…†ƒ€‚ƒ‚€‚ƒƒ€€‚„ƒ‚‚€}}€€~{~|~}€}}€|~|~‚€~‚€‚ƒƒ‚‚†‡‚…†„……‚…‰„‡ˆ…ˆ‡„…ˆ…†ˆ„‚‡ˆŠˆ‚ƒˆ†…‡ˆ„…†‚…ˆ„†…}€‹†€†„€†ˆ~€ƒƒ~€‚€‚‚€€‚‚}…ˆ€†…€…†…€…‚ƒˆ‚~ƒ†ƒ†€~ƒ†‚~~‚~{~~{{{{~{y{~xx{{vz~||{{|{x{||zz||{z~€~{~‚|‚€|€ƒ~|‚~‚‚€€ƒ‚~€‚€€~~€‚~€€‚€ƒƒ€€€€††‚ƒ…€€…‚~‚І‚ƒ‡ˆ……‡‡†……ƒ‚…†ˆ…‚‚…ƒƒ€„„€€„ƒ~……}€‡€}„††‚}‚…†ƒ……€‰…‚††ƒ‚ƒ‚€‚‚€‚€€€€€€~‚~‚‚~€€|~€~{‚€~~}~}ƒ|~…ƒ€‚‚…}ƒ…‚†{‚„€ƒ‚ƒƒ~€ˆ†~‰‚~‡„~†Š€Š‡‡‰ƒƒ‡……‡‚ƒŒˆ‚‡ŒˆˆŒƒƒˆƒƒ‡ƒƒˆ‡„‡‰…‚‡ˆƒ…ˆƒ„…‚‚‚€€€ƒƒ€‚„€€|‚…||„{‚…z€„}~„‚€}y|€~x|€|wz|{}|y}€}|~}~|||{~yz|x|€€}}{}€‚}z„}z€„{€ƒ€}}€€|{‚|€~‚}€€€~‚‚}|€€{{}€|€€€‚€‚‚…„‚…ƒ‚…„‚‡…€ƒ…„€‡†€‚‡‡„€„‡‚‚…†ˆ€Š‡‚‚…Ї€„‡‚‚„„…‚€‚€€‚€€€ƒ€„€€‚‚~‚…‚†‚€€‚‚€„†}‚„‚€€‚‚€€‚€~€€€€€€~€‚€|€}~ƒ‚}~„}}‚†‚‚…„€„‡‚‚‚„€‚„‚‚‚„„‚‚‚‚‚ƒƒ€€„„‚‚„ƒ„€€€„€}€„€}€ƒ€€~~ƒ€|ƒ†€€ƒ‚€€€€€€€€€~|~€|~€~~~~~~€~{€}~}~}~~~~~~}~€~~~}}€~~€~€€‚€~€ƒ€€€‚€‚€€‚‚€€‚|€‚€€€€€€€€€€€€‚~‚€€€€€‚€€€€€€€€‚€€‚‚€€‚ƒ„‚‚„€‚„€€‚‚‚€‚‚€‚€€‚‚€€‚€€‚‚„‚€€ƒ‚€€€€„€„„€€„„‚‚‚€€€€€€~€€€€€€‚€‚‚€‚‚€€€€‚€€€€€€€‚€€‚€€€€€€€~€€€€€~€€€~€€€€€€€€€€€€€€€€€€€‚€€‚€€€€ƒ‚€†‚€ƒƒ‚‚€ƒ€€‚ƒ€€€€€‚€‚„ƒ€„ƒ€€‚‚€€„ƒ‚‚ƒ€‚€‚‚‚‚ƒ‚ƒ……ƒƒ……ƒ‚„…‚‚ƒ‚€‚‚€€€€€€€€€~~}}~~~|{~~}|~€~{}}|~~~~~€~€€€€€€€€€€€€‚‚€€€€€€€~€€€~€€}~€€€€€€€~€€€€€€€€€€€€‚ƒ€€ƒ‚€€ƒƒ€ƒ„ƒ‚ƒ„€‚ƒ‚€€‚‚€€€€€€€€€€€€€€€€€~€€€€€€€€‚‚‚‚‚‚ƒ‚‚€‚‚€€‚‚€€‚€€€€‚‚€€‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€€‚‚€€€ƒ‚€‚€€€‚€‚€€€‚€€‚€ƒ‚€€ƒ‚€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€}€~€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€‚‚€‚€‚‚‚‚ƒ‚‚‚‚‚‚‚‚‚ƒ‚‚ƒƒ‚‚ƒ‚‚ƒ€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~~~~~€€€€€~~€€€€€€€€€€€€€€€€€‚€€€‚€‚€‚€‚‚€‚‚€€‚‚€€€‚‚‚‚‚‚‚ƒ‚‚‚‚‚‚‚‚ƒ‚€‚€€‚€€€€€€€€€€€‚‚‚‚€€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€koules1.4/sounds/end.raw100644 37512 310 47431 6477322207 13706 0ustar rootroot}{||{‚„ƒ~€€ƒ†Š‡…‚€~ƒ‚}}|~ƒƒ€~~||y€€{xvtux{}vrw|€~€ƒ€~…†‡ˆ…ƒ‰‹Œ‰††„…ƒ„ƒ‡ˆ~xwvwwwwvqosuwsttrruz{zzzz€€‚‡Œ’”—¡¢¤¥¥¤¡œ‹…{wrd`]VX]_\_^b^[Z_a\XTYc{‹£«²ÂÍÖÙØÞàáÙ˨—ƒbVM3+)//*+1::*&&)w}}~}¯¤Àÿþýüýúت€€€€s@7){}}~„§²¼öýüûüýü¤ƒ€~}}}~^/)?2f€€‚–µ¥ùüüýþÿã±€€~}%8=S€€€§½°åÿÿÿþþÿº‘‚„e2>ODl€€€½µÐÿÿÿþÿþý阅ƒ€€€mB AK[„’»ÂÆêýýÿþþÿÿû§ˆ€€€k< [RHyšÈÄúÿÿüù÷õööõØ•ƒ€|R #"+ RHf¬ÑÇÛùþþýÿÿÿÿü÷ò²š‰Y2.>'#&\ŽÇ¿Þÿÿÿÿÿÿÿÿþüûöí«o: *%"0/&^†¤Øúøø÷úýþýüÿÿþøòÎP %%(7;IB@LG3$IXcipw{qieh}€…¥´¼½ËßÞßñó騯³ˆ|YHD<7,022JU_fm{~xrsl]Uingm}ƒˆ ¾ººÓßåæãâÛÏÁº¬”†aPG3-$%(--2BFN[\_abb`ebgˆŠˆš¨­¬²ÇÏÎÕÚàáãÝǵ¡™oaNC6+'$"'.:AOX_rr}‡‰……ˆyy‚‰‡—Ÿž¥­·ÇÈÌÔν¹³–ŽzeZZRKEFHADITTV[bdcdmnnsusrxˆŒ˜¤¨¯ºÂÊÒÖλ¾´¨—“qaOJC1.+*(/5=IM]fnv}……†ˆ†ƒƒŒ•—££¤¹ÇÍËÓÙÔͼ±§“Šxj[IB:83*,3?BIT[gipqtryzxzut}…ˆŸ©³ÄÍØÞßêèÝÈ¿µžtf[B:2& ##,.5AEOV]^]cfhkqy…‡–ËÏà÷ýøöõïëÛÒÉ¡o^B90 .5=T[_dilca~‹Š®ÒÍÞ÷ýüüúõßϼª›…‹†kgeNC3+%"(13"4F99Y@Owt„‰§Ð¶ÃÿÿÿÿúäϹÇǃ‡ˆe\ˆj;?= & 7ZYExŠÚÂÏúúýüúøæÛìíËÆ»³—¤‘rnwWI-   ,>"N±´„×ðóòýúøë ¸ÑhÍ˼ڴ±«~”¡A*X8&3&8 Y·”®ÝÜÛÞâéæ˜–Æ™]m»”аªŸ”vn‘O2HqL»·ÂÍÌÌÌÏÏÀy•³V0‹‹kz™p[nyl?K``Q_h]BDEœ8rxÐÆ‹ÇÌÅÁ¼µ–g•¤j]VtƒkaƒyWPele1>f[Ol{mNKtª—G~¸â“¾Ý×ÕГj“Ÿt€cP}D?qk21\A?9?UabhwSHOLŒ¹Qw€…§î·µêâÓÖÂkl˜ksƒC.t<_L%=DFqw9f—vm}mWHQ¸§Z‰•’}¤ê§“ÕÕÑV‡žoyš™L>FC=sžl’²©g€¤‰^[`^22`œT…˜Œi\V¬«o¡®…VV¢|t˜ši6ªÔ]Œ¸Õ²Ÿ®¹™lX‹oGAT%010ccLVVVW^\p£Š‰vV§ÂƒãèÛòíÞÁ¡¨Ÿ±µ¢©¥}‹sWE2/'F-=_b[V`‚icÀØî¸¼çèÛþÿûÙØÛÕ±bfzE:/  @YÍÖÀáåçáãæéëìäØÀÆÄ¾µŽˆƒ]W6 $/EiTxx–”œ¯£¨Ã¼¾ÌÎÔÎǬ²º˜‹‹_H@*&.)-lgj…•pdvoeew“¢™• ••’€x_mcSUQa[c„dn²¨™¡š‘’™šoc|„o[bY}yiˆƒˆ•…†¤¨´ÍƵ¹ª¦Ÿyljg\E>všŽŸ›¦ÆÄÎÎÐÉǼªˆ_TRssuˆ~}€kgeNH^YIlЉ†–°™~toTRRMRSMWX[b“°¬±ÓÄÁŰ×Õ­¢·®œ»ÚãŽnPG7aaKYgONTM_gp†–‰³¾Ì¿·À³Èÿÿœylmt]Wo[gdtOGB"SoXu–’‹~w_Y^YKOCA…€egp`„Ü×¾ÖÍ–’yq5ŠÊNk©‡‚±}tštgb31+%}€h€€Øëµ×ýïݬ窀©±²æ ™Ô¿âʯ£•v\?lg5‹äíáëïìíëçì°Š­±¤·»¡ãÿåÙÛ™€€€Z# eimÂÇÃÍÓÛÜÛÓ”õ|-Óy3Ï©íÿÿÿÿÿÚ°‰I+)%V¤¼©½ÊÅÆÒÙÓ_v%Yh*<åóÛØøøúfCB4)))))v§ßÔÝÙÒ¾ÔÛϤu/KFeœÕµÇàçàl,)))))))9°ÿÿÿÿèéúíßô®Yu€*)A*£×±­ÂÀ±(ŠßàØÜÿÿùÿÿÿØSº©E¯o0ñçÝÛßÕÆ•_µµ²ÓæÚÞÙ×Ö¦HU•iß•kÿÿÿÿÿÿù))ºµÀ¿·µ²°­®nX7nL)71¦ÜÙÖÖÖÖÈÕ¿UG5AžÕÖÕȪ‹…s^hQr;8)+O]€‰èíÿÿôÿÕ߯vwKibÇ—«±ž–W}h8wr)yC;9%•³ÿûýÿÿàõ²tM¨"4y[ÌéÅnˆºq.bHU~d3:8Ez‹Ž¼íÿúÓôömƒrŽ…ƒF’ÌÕ®³Þ¹z{jf—/*.už§vt’ìéýÊÜYu€bM l{‚˜½ØÃ¶ˆŠnhH  Y™§ÛÕûÿô–R:…©{Æß¸hF(U€ª·Št_6 Q™‚„€?*‚žéðëèËqY:CMžÏÿÿÿà­D-II_ˆ‰‰5%jes~t{€a.„¦Ãÿÿüÿô¢œ«=“ÆÀß÷õï€6 €~yrns‚:gl‡€€€Ãê‘°¯ÿÿ¤žš¸¶žˆxÿûéÀts‘µ€€€€€s Cvu…ˆ’Òÿ­›yY{¾€x€~ohn”þÿÿÞ•« “‚€€€}/:=;|©™|l!x”VVi=_˜|uޏª¿–lˆàᬀ€”ý«©©©§œ5)L}okzXÖ¶Ž€eb`a\]}Ò¬ˆ€”ÿüœ€€´Õre‰‰z_w€©©~›â€€€€’š€…€€€ï†w€ºââ˜f€å³gaYVV')F€€€œ£ÿ€…™Ls‡“ §½«íµ™Ÿÿí §‚ŸÖ˜VVVJ2€€€€—Äÿ©©¦w޶Ÿ¤€¡ª­»µ½ÿÿÌŸ±Ö€€vmFQ€€“Çq¦Ÿ¤”¡‘£ú¹tš€P¸¤Úÿÿÿÿí¾c€l2 H+ô”„w[ý¹€š€wÕñ€€€€€ÿøßÿœ¨²€&:!lj’e=7QóÈÆÇ¢j™SVV€VÖÖÑ•˜’ŠÔ¥™¯^ÂÀF 6ŒƒÅÈÆ|TFByà±Óbt†QiŠÔÿÿßÞÖVVEVƒ¹£²ÖÖ¥=DBÑù¡¹Œ / 4®´¡Àêêÿ–)))EV¡¬¬¬¬¬Æ',£éÍÿÿð€€’>/"&cÿÜý´¨RN)}¸‹‰Ÿ®À% $€š”ÿÿÿÿ退€3b]C™èà©©âݰros±CJD 8±ÏöÿÿÿÝHKIežƒ€§ºéÖ¥h~«£ÖÞï|C'Ew³»Å©ÂÿË“h™rjpuW;:2ƒŠ±Šmx¾wl^lÝêÊ¿º‡€’hfK`‘Ë¢¯°“`*v…;-6?€r('}œ¥­ž”¦ÐÍ–¡^€…§¸ÁÖ§‘‹uJY“t__`ePWXA4-*X~ ÁµÃ϶“«•wgWdŒ«yi¸tmyy¿µšžuY\M,CZs†‰D2=—…{|ÖáÂm†Çzar¨¨£®ÐšsW5?EX_yYV?RC=W¤y€€Ý¸›A€€rÖΖ~;.VƒÖʇ»:ZC )®þùûÿÿê‹)|€Œÿ÷ÿr?‚¨ÈÊ|< )ÖÖÖß¾ÜkQ))¥ÜÿÿÿûoRm¼úõ¦€€€b4OrVdmnA))_€€±ÜµçÅh¢ŸJ©€€ÖÖž³€€€0X|tR~|l¦aa_j‰®øÿˆoS LkdŽ™›ú°©q”‘©¢V†€€qV„ª€qtœˆ‡yqyrJŒŒ€yulF6©“k¯¸Ô­ygWjq¯ÿÿÿññÌjC1©•”„³¬™W?Ôë£{%Sh€€’·êýñf5 5TŠÖÿôÌ’zeu:…€†ÿì–‘‹€g87k–“¹´}A Vo“¿ÒÛäå{X@;{’€Š¦²¿‰oSb] ÙÊÑËqO\TU_fcËÞ©¼µª-3LI“ÔåÛƒPCZƒR`¢ÄÛßÔ¨=!VVY¸âíÄyA;7ŸÀÂɬh\?1&­äáÖòë¯< MÅѯœ~Q;LGI‚µÀ°¡—AuŽ˜¤ÆÓ­Ž) V¡Ÿ¥‚QpkqÃÀ¨ˆ€€:)†£¬»ÂÊ…h.`¨Áº¼ga`Âskk|«Äi$7@pjdh€€S}l«­­¨·§pqjω‡•ÌØb@$@,‚€€€€€€Èr€€‚|, ‰y€€ƒ€‘€€€€Ìª€€‹ºÿô·€dZfU+ƒ‹€m`Z¨¡€€ŒÖô~8*€€uµåÞ€mV€A¥©žšÑÀ¬š€€ˆ„d‡”©€€€}6_VVŒ•5TV)k¡ÐÀÚáĉ ?…ÿÿÿÿÿlQ3}‚«Æ­€l2€zrq‡ŠJ9%XÖÖßý™À'#QÖÖÿÿÿ²B%:\ž‘¹´¥€9ged~{'NN‰s€†™hqri_‚·¨‘žU6yroQgn§¬­Âec3:i|¶Ñ¿µ®o6‹€€¦€Vߢ€€€Ž\R7~¯Ýü€€€|º˜sY K€Š¦€¾ŽŽ¤ˆˆ€r¤d|€€€Ó‘‘€exáËëâÁ„Ž1d{ãŠ/dQv€€}€©§Es†Þ»lqng€rdƒ©²b#HQYÂÖ¯¨©©„)_tŽ´¬8Slb4*èð€€K g·ÈØÓÑ€€8\›¸²ÖŽ“^Cf£¸ð®€€€/ gr´îÑ€znaw€€ŒŠ\ <«Í¿Ûÿÿ»®:c€õñì­€€X‚š€k£ÍU…€ck˜¡^" Ÿž’ÍÉÛÿÿ_#‡‚jœÿ߈=1I‡²É¡¤vXa£ÊÁ½l##5Sœ®ºÀ»Ä¯{ll¨ ieUdrŸ²…seUf…ƒ·˜™¼”£·’Bx‰VCFB{òòЛ¤aILVjsŸ¼Ä˜— Š\]pw—ˆl[QÀº˜ŠŒ1W<=^¬°²Ø³¬€=ŽsmxpK®xy€‡Td`c>3[~Œ–²ß}na)7ozŠv•…~|xˆ_h˜Œf§Š‚…rRxhesˆ|‡…”šh„fg^cf\‰¥††”ule8Gdlmˆ†`\c}‹¤¡qt’uqw° ™š~b_Q\`|~iwš‡vi1[h¤³–xˆiv€Šrep‹y—†Œ ´¶˜˜‹s"-ScŒ„Š–•¡K,L©Ï•Ї„l[VޮĝXLiK`€¿Ô¾…idV|ƒn‡ŒrTTe‡—½ÒÐ~`Q'5t™¾·¢xuof|e;Tk¨à–¨®¬¦- &1Dv™½ÎΆ^[Ve†œq„ˆ¦¹vŠu…~3+9L„ÅÄÒÆ§Z"Bkr×ÞÑɃ'5²ƒn¦¡ÜÉoUM3†„†u€<1—È÷ã©L42X|Šáæv/3HŸµ~~ŠF0IÈ÷ãð°4!(ˆ™®çÿ¦91&=‰‹~Š["5€¡äÿè~"$ƒ¥¬±Ó¨JK3?€€sÏ€ƒ€”d€€~¢•€ƒ©‡1T?=²¬¥€€ 3€‡Üÿò€cB¡‡ˆ€€€ƒ8T, kš§÷ÿ©nS\óÕÕ¹˜³ƒ'%n¨¸Å¤›E@Ÿ‡´âÔq:…k™“—õûŽŠ3V€±ãø´V&`!PŸqÈÚ¢h#D=ãõÿÿûŽ> br­µ®€®;o-µ¿¾½Z)))ÿÿ÷ÿÿq>#0¡ŠØñá› 0{“·ž~©˜n©£Ïóîwˆ :tØæóãƒ%=uÔÑôîµR74t·¥ò‡P€‚ÅÇ¿ZNLNC£«â÷ê•;s|ËÑüÂqgE]l‚ÎËÿ©©,bk–ºÏ€€“WOQ€ˆÇ½€€€L.€ŽÖÝÖ“>))~ñáãÜfV51…­ôÿÿòRivÖòñŽMx|w’ÞÖµš‘Wt€ÈÿЀ€|•Ã➌€€€³¨€€€¤x/€m´·€€€²€€•Òïj7\€¶ÿ¨€€MT)ìåß·H )^ÿÈ‚›ƒ^06c¥ÒÖš))iíçÛ§v)*[y{€«Â¢FyÒÖÖŸˆk8SŸŠšoPÉγ¦žX`mBˆŒ§’;€O[€ZoVT€X­ÎÄŸ¸œqš6RBQˆ$zÀ ƒQ K°Æä‡-‘€€Öžw¤p‰ÓΊhY²Á­£oZ¥µÃ{9. ¢¬¢Ò±›—qphT°¯ËwkWMG‰‚tyt­’‡¥Š‹n Ÿ|†’}uFZdU¦¼¹Ÿ™Scon«„¨lk…XÒÂÕÿ»Wf^j‰Òã…dQ@VU‰ŒcsYX|çÿÿ»H+/+6W…îæÇS3G~¾¿ˆ`X^×Í¥»c\‰LVn·êÀ[BbSd˜ª¸bhBI®£´Òr\buf¼­uE[R¹¾±Â~! óþÿÿ|={Zˆgl†sWtˆ‘•š´®U;1ÀÖØØS/C°·®¹š•a,ˆš´ëÔ>·ÔËÞŒ¢†MNwÇ×kOc¬¡—€€É–€c†—ÍÝÆaªÍ»›¥ÖkD*GÍÖÖ«„/k£˜¢AËÍuk¤|kUf·¸¢†´dk|UˆmEW|ÿÿ“:)q½½«op•}ƒi6‚¤Œˆ6EScÿñ›nl—À”‰baœ³s5}œœQMch¸ h¾Øã¸‡ t®™‘ygg‹wsx“‹†Êĸ²³T^er™JSj¦Ì “y\B`vo»ÉÆ´¯¬nbXe©‚œ”‘xxsŒupfP¹º¯¶«¶€odPbg ®¦zluw¦|h\TÏɱ —«xpk^pŽ¢¨u{vg„gg€‰Æ¢‚~†²ca~oƒ™Ä¨|wmeYh€¨¿Èž}{sg`jÏ«¡Žˆ³ƒofmŠ£—¬‚€w“|‰Î‚„wz™‘We‰œÒÓ›xwCG1g°ÍÉ£z+.‹±Ï¬“–|}}hƒ‚”›_gx»œ~€\–˜”ͪWOJrfk}~—bcj–¡ÌŸz‚{|Y7k¦¶–xV;Gez·¼¼Ÿv©˜oŒ‰R>P}¢ª›aIXp»¿—‰^QžiO~yxp]YalŸ±Š„¥ª·ÄbBSCs›Xl[cŒ°|ube¸™”¼£x‡gT…jœÆosxv°o\`ky³¸­XcUPnRY©¨›¥¸©‹c@dŽ¢±²ƒ‘il[SLep…¹«˜‹Œsgz‘Œ£²ateXdKa• ¯±™jvcdg|ŸŸ“™xdW`Xls ª¡¦•‡rbtvw“¯ª™‰[egokbw­¢œoV>dkx’´«˜‡ƒ_fkekš°¦…„h:V„‡Š¯ª¨ ‰JLLx“¬­£xqWBP…š„„y†’¤up}rˆ¤™wn~}{€‹˜–’VMSžš‘Ÿ§š“jOLO\¢™Œ†~x‚˜™ Žxƒv_hr{}ƒ‹‡||„}••š›w^g|l`f‡‡‡u„ ¦©ª˜sogswQa|–mT>_ ½²»enrŒz€ˆŽf142a§³xNU´·³›ht™™…kj}“a`h©Óêe)I’¢š‘•‹oT9-0C„uh¦îöÓœ¬ÃšxŽ~L(¿ºoX Œ™žf-¨·¿‘²–- l¹ÉÄ­[fSJ4+SlëáÆÇ =XO]©¼ÂwN0?_peLа¦­‰Ca¡‰¤¢…œ‰RE<:Š˜—|PN^xtat›ââÇ•@I‰”°˜m‘0-1xÆØ¥kF…‹¢±ÐŒ®xj€|«ÆP7QÍ­¦ndUTN}›_‰cy§{I/{™ÂÁ –mMI|¡¥KˆÀÊÎ[&e–âá©°«4,!€Ð鵄NÄ»—akch|Ž–_N[‹®€jeu€­‰pŠ˜¨Ÿƒdowƒ–Xf–ÌÔÏx~{y‰”^kbj€„…bEThs„fzŸÒ´™pCM`Y†’¼ª`K]_{t†‚Ò´“ˆf„—xU¸¼’TC\¡§z[PCe¸Ð´3:­¿¡„]kƒs`k`Ÿ„|pwrqÖ—~°ª†€Md‚]\`‹ªÃ¢“C?G®¨ŒvtZ_x¦|¤³†e;?’ºµ„„s`r¯y–ɯ¦yseNbzš´ÛÉ™Q4+†ÃŬ‚›¯h``Vjœ£™»£^hPnŸ´±¦c\}l’‡j/Hrª¹¬{„tou‡‚|¥–eYuo|AXˆ ¨¸£”ŠaWnŸ¬À›LnwqUO}¤£‹Piˆ±€`Í¿¥1/Q˜v„©•‡]D]y†³Œ„ŠŒ«‚{lq‰“b\eœˆ…smh{y¥¹Á™‰VqyƒŸvetŽ„š‰‚w€y}…€‡¦ª°ym`CKw…¨© |]^|yq””À·Ÿpccv~˜–xixdns›ž”vdxt™™¤¢­ŽudCPœ©¥¥–y{rQ]^ˆ²¸²’wXTpq~²š‰ƒ~„}{‡…‘…Œ‘wk‚‹¨ŸyadŽ’°¥Ÿ•yhLY’•¢­®°{kDGq¹¹¶ªpr]U~‡{¢°«­¯MJFTz’¨´¦wcMU—·Ÿ£±°˜ŽMNK~‚¥´ˆzbdvx´´‹ŒŽ…‹eIP«¤||aFWˆ›Ÿ¦’{oŒ‘ŸŠiP]}ƒzxvnrtqs£‘”±’ŒŠ|ddgv„}|yujek–—«¨ulgW“„x{njnj‹Š“x¨¨‹taZŠwp‰xros™¡–‚_•¥­ “]ZWe‹ˆˆdq²¨ŸkMT•¬Ÿ‹hmds…t{yl‚žœ‰tnxuƒ’•’{uniSGrŒž£Ÿ™‰€jqp…•˜Šs`^]\i—™–…qx€|’“—‘p[hkudr‰•š›Žykphp„‘”zsrsorƒ‡Š–„uyrˆsdt†ˆ“ˆ‹‡†qfjr–’“‘Œs\W^s‹¡šš›“wh\]Œ™™šŽt_[k~”‚‚tmhpm†“—ކg`Zt€’‘Ž€z}n{‚”œ”†““l]W|‹š’‡phpŠ“˜ˆ–„toYXq‚—ˆ{pxx†‘Ž”””Ž~g_rŽ’…ptt„Љ‡–™š™wtpZl‚€mkotrdq‘²²¸rj[iq€ŒˆtPUU€„‡©¢”¢Š_eyš±˜‹‚R8Lg„»ÌȇXIQgš§®œuF9Dg|”–Š€ ‡€€ti~Œ|lyr_LQu€ »«Ÿ’ENX«¸“¥•ugMC^•¦­•zd]factvsœ­­°¥C=Zj¡˜Œs`GBLtv¾±£š‡Law¡²§®¨QDGq‹‘މppZ_Y‡¤ªnl¨ž‘ŠSqŽŸ‚Œ|DZu‰•™¾‘ˆ‹VT¿¶ÂˆU|“ˆfQJ–¥º¢lQYk{Š”—r49ª«H:|Ÿ³–†‹£ kJDw‹Ã™rŠxt’‚‘¦º†|0.g²ÓÓvUmsx‚qx‚Ž›‰x`NY|™¬¦›A0-‰ ·µowxtx›¥©{kdlqe…’› ls•¦””Ša]]WvŠ˜gW\m†…€uš‰‚†_o{ywe‚Œ…}gX]Á·—oni_rš}vx“‰|smšŽ‹ŠsWu‰‰—zu¤‹pzyŠƒsjghsx…®·}x|Vz ¡¦zmhdbkkŠ––¡•`QShª­ †edkoŽkkx“”„…~dmnzމ¡£„xpNz­¡“¬°©gMH\Œ¼¯¦²‘NGK›°¨«§{Q[lo~¡‰o† ueeŽ“‚mqŽŠ{p†jezlp†“™”vi…‹‹‚Š…v€„„t^du“™p–‰ƒbW|¦œ’oclwshl•Ž{n`b~¥ §šsb_ems{¨ª}YVSk„›‘‘“u]v€˜¡žznlwl†Ž•|{miŽš£››xqp•„ŠŽƒppk{–”‡Š~soqŠ–œš˜fb]_q•ž”‰~[ady‘—žž”ˆ}hj‹Šž¥•…ORu“‘‹•smi{”¡¦šz^Unw„ ›““‰c`]fŒ”¢¡Ÿ‚j\aŽ™™–˜„jm‚‰Š–•Žjkp•˜˜œ›jgf‡¢–“‰‚jkjq› ¡Ÿ™z][c~¦¡Ÿ–•e^^€ ¢Ž“›™€f\^ƒŠŒ‡•}{t€€{˜Ÿž¡†oh_fn˜ž›j\^} Ÿ ƒwgt~kvƒœ{h\\lƒ••‰tt‚trƒ{k`i|z’†yylŠš––€†ojrŠŒ~xpdq{ŽŽŽ‘‡‹fkou‹‚mpnu…w‚„‰‹‰’„‚‰rwvŽˆjqˆ•œ€tx€•›“‚lgi}€yt{ˆŽ’ujvŒŽ}|rpz‚~‰py…ˆ†y‹‹‡‡€€‹‰~lbgqyŒ–“Œqpuy…Š…z~oe|€ƒ…†‰‚„‚ƒƒ„†}zz{tqzxx|Œ‡€rm}}…‚ƒy‚ƒpt€ŠŒ‡‚|ƒ{ŠŠ‚y|xy|ˆˆˆ~v{z}‡ˆ‹‚wvwlo~’“’Œ{z{~‹‹ˆ€wry€~ƒ‰Œˆ|sfl„‡ˆ‘Žˆ‡}kjiqˆ‡€‚~‡}w}ŒŒ’‚‚|ƒ~|„‹or{„Œ†‰“‹zpojkr„„~|w}…Œ‰Š€{xm}‡“Œ„zu{†‡†‚„ŒŽˆokt{€zspsx~wl£¥£b`fvƒ‡Ž‹}b]d€ ®¤˜akp}†šš¦sKJP‹›¤ ˜Ž„nbf|›¦†teZYgzƒ’›™mWdyŒ«•tru{~p}†„kdVaŠ®±­~``qsˆŒ’¡˜…hczŠŽ‹†‡„vtoi…Šsoh† ”‰dn~v€€ƒŒˆkNKO¤­®¦“`opsФ¬‹}kZlz†Ž}tsnsor€’“—x^Uˆ‰™˜‘cr‰”qy‹kaUwµµ´“bT€}¤«™“^Zmœˆ†xvojr†Ÿ‚YZlw|…{|‘sny…—˜“‡‹qhRT˜«¨©VM\¡¤¦{y’Šrnn‚€Ž…‚Žžsfkt„—š’ˆwTWl¢¥¦~e_\^ˆ– žhcjy‹“š–xwjU`„ž ‹qgz†‡“˜¢’xaccx†ƒw{zvt|ŒŽqefŽˆ„‹‹{x|ojv“Œojs•‘v}ywwp€¦£–hewŒ‘Š‹y†‡~€€€Œ„stt†”¡r^v„…‡y~dah}™¢¢¢fYm~’“‹|y]co‘’xshˆ‹Ž™‘xq]~ˆ„‡ˆluˆ‰vx†Š‡qi_s’˜•—tbl€–Ž”™˜’_]\¤¢™~{|~w‹¢Ÿx\^‹—˜Š…ilqu‡’‘˜th|Œ‹Š‰„ha†††po€†‹‘‡†„…ux„…|pw{‡†x|‚}‡Š~ƒvoy—}jez~ƒorœ‘_\\Љr‡ˆˆgaz–Žz{ps€}€‘’€qlmv”šœ•ƒhgh„~„…†‰z……‡‹wvƒ‰{‚‹Žƒrpsv“‘…zxz{~‡Ž“……tr|}‹„‰‚€pei’–wq{u…‚‘Ž…vkku†‡ˆ‰†‹†ƒuv}„–Œ€|‚y{y~‰’€}jjr‚‚‹‰’}px‚ŽŒ†~usrŠŒ’’qkxƒˆ‹‘‹ˆ„q~‚І}ƒtx|ˆ”–}|p|’‘†~}ms€Ž–‰‡‹}|~~‚€ƒjp{ƒŠ‹vs~ˆ”–‡}uqlqŠŽ“Š€urt‹’•’{pqp‹†€„ri{|}Œƒ~€‡~s~€ƒ€vijk‹ŒŠwtuƒŒvsy†ˆ‡„rllrŠ‹Š}|}„…uuqrnw€}y€ˆ‹Œyuƒ‡“‚ƒ~~|‚ƒ„|}„ˆ‘Š…z€†ƒ~ypmr‚Šyz‡‹…wtw}~„ƒ‰„„‡|zw€‡‰Ž‘|y€€„~xv}}{‡‰„‚}z~„Š‚€{y{€~„ƒ…w|€~…„Š…‚‚|s‚€||}|~~~€ƒ}€€{z€y|€‚†„……{y{…‚„‹‰vswz|~……‰…zyzƒ‡{z}~~||„‹ˆ€€…‹„}{‚„}}ƒ‰†€~‚‡~wsqxˆ……‰…zzv{xv~|~‚‰†‰„}ˆˆ€€y}‹„„~†~z|‚ƒˆŠ„ƒ{uvz|{xz€~‚€ƒˆ‰†ƒ€~}{}‚~ƒ„†„‚}~€…„ƒ‚‚‡‰‚|~|xutw}|‚~{Љ‡}npt{ƒ…‹Œ„ejxŠ••{rx‚„ˆ’“…tnitzЉ…ƒŒ…|v}‡„sq}‡‹ƒwf_h—˜—}mnq{„~‰‰mbl{Œ›“€~{}‚{w…Œ€zw~Œ‰rso~~z…Љ†ƒworl}ˆ‰rpzs…ƒ~~zmv€Œ—œyw}u{‚}ƒ”Œƒx{‚‚…}z}wttu|‰…‡„zqerŽŒrny}‚Š‚‰j^‚‡‘¢ }x}‡„‰™Œrkduš“qklx€‰Œ„{qpx‚uk€„‡‘qm’Œ}„omyxž†€qz˜™“†€uq{Œ—oi{›“dgh}‰‹Šsomx†’…tpr|}t„Œ‘ˆjr…‡‡‰‹siu~Š’–…mr~†ŠŽ“†xor{€yu~‚„„x}ƒtom|‹‹Œ‹{ysot„}Žƒ…‡‡…||}€‰„‹‰ˆxpr‹–‡‚y~}€‰‹…€hm{“‘……ur€…„sqwp}‚Ž–…€ƒytx{‰‹}vv|‚trq’“††|x{}w„€†sq…„Œˆ…wnxw‚“…‡Šuu~“…|‰‚ƒ€†ƒ€z–~|€‰€}yz€Š‡Š~iiqІ|ux~…‡‡|x}y†ƒ‚…uv~‰ŽŽ~|ƒw€{‚{vy‹‹†}v€€‚~|€‰utx‡‡ˆ|u~}€}‚Š€ur‚†}…ˆ‚y}z}€†‰…w{‹ˆ‚yvw‚‚Ž…‚yr}~‚Š|ˆˆ…uyŽ€|ƒ…†…‚}u~€€Ž„€€{zz~‚†…ˆ„|zy€|…‚}~{„†Œ€|xxy††‰ƒƒ}~‚ƒ}{~‚ƒŠŠ„ƒ‚~||~~„ˆ‰~}}‚„ƒ~||€ƒ|y€…†€~€„}}€~~…ŽŽƒ|{}~„ƒƒ……ކ~||}‚ƒ…ƒ…ˆ€€€€‚‚Œ‹~{{~„€€‡‹yx†Ž…€rsxvކ„†€€~€€„~€€~€}€€Ž‡…€€…‚€€y|„„ˆ‡ytwz‡ƒxz~ˆ„|y|Ї{zyvzˆŠ„„‚~{€ˆ€€„†€ƒ€zyuw€ˆ~~{€ƒ„}vttw‚|€€~€€…|{}‰‚†‡‚}€y‚ˆƒ…|€ˆŽ‰†xuy~…‹~vtuz‰„€{‚…‹†wvy€‡‡ˆ‡‚€„ƒ„€ru|‡Šˆ‡†€~}|{y~…‚~}|z~~€„ƒ~„}|||}|‡‡„{€{‚‚†‡†ƒ‚zz|~ƒ€€‚|~}{z~€ƒ†‚}~wx~}|€„†…‚ƒ€}}{€ƒƒ…„„ƒ€yy|}~ƒƒ…„‚||~yx|€‚…ƒ}}|€€ƒ‡‡‰€|zv{„ˆ‡†…‚€€zy{|€€~~ƒ€~€|~„€|yvv‚„„†ˆ‡„ƒ}z}~~†ƒ‡ˆ„ƒ€yy}ƒƒ‚€‚€~}{xzz~…ƒƒƒ‚‚€}ƒ…„ƒ}††~ƒ‚€‚…ˆ…}wu{}}|}~ƒ„|u„…ˆvxy‚…„‚†€€€€{‚„‚€†‡…y|}ƒ~yz}„…ˆŽ‘‡zutz|„„„„„ƒƒ|uuv|„Їˆ†zqu~ƒ‡z{|†€€„‡Š‡…{‚yux}†‹‹…~|uvz€‡ˆ‡„€~ytoo~ŽŠ†t{}z~y{~Š„€ƒy…„„‚€‡‚y|~„‰„ywx}yyƒ†…ƒ€yy|{vuz†‰ˆ‰xr‚ƒˆŠ|w†ƒƒ……‚ˆŠ…w{‚ƒ{€„Œ„{ps}…ˆ~xv{…‚|sqsˆ‹ƒ‚…vy…†€{{…{~‚‹‘‹|ˆƒ|mq€Œ’yvq}†ƒ†}w|}ƒzy}ƒ‹†€xvx‚‚„„|u}„ˆƒ}~€€‚~|†ƒ…„„{z‚€~~…‡}…ƒ€|vu{€‚„„†„yxz{{}w}‚‰†tx~}|zy}’„ƒz|~„‚ƒ‚ˆ†z€‚ƒ€~~Š„xw€‡‡ƒxw|€z‚††|yz‚€}xy„†€ƒ~‡ˆ„|uv}ƒƒ‚‡…„€‚zxx}‡‰‹{{vz€~{€†„‚xvy‰ˆ‚ƒƒ{||€ƒ‡Œ†€~~„}}…Ž‚yt|‹‡ˆŠ„‚ssy€†‹…~‚‰‡|zty€ˆ‡†zy…‚€€‚~|€„€€„~z‚‰ˆ†{x€wzƒ…‡ˆ€|}€}€„†…‚{v~ƒ„†y}€†~z{~…‡ztw…†ƒ}‰†€rty…‹†€‚}|{|‚ƒ…ƒƒ‚‚€‚{z}€|{ƒˆŠ‹‚y{{}‡€†……€€€~‚„~‚‚€„„ƒ‚}~xxz…‹‰‡}xvy~€‡ˆ‡„{z|}|‚„†…zz}…‡‡}z‚ƒ‚‚ƒƒ…†€}uu{†‡ˆ†…~|yz|‚‡‡…€{x||‰‰ˆ‚|y{~ƒ„„ƒ‚„~€‚‚€€‚‰‡…‚|{z|……†††ƒ|x{‚ˆ‰††„}zw{‚ˆˆˆ~z}€|€‰ˆˆˆ{xxzƒ‚†‡‡„€xx‚ƒƒ†‡xw|„‰‰ˆ„~|{€†„ƒƒƒƒ|w}‡†ƒzzz„}}€‚~|}}}~ƒƒƒ‡‚~~}{€ƒˆ„‚‚}|||„‚€€€€€€‚~{yy}}€€€„‚|}}ˆ‚……„…}~~ƒ‰‚„†‚~zy…ƒ‚|y€|~„‚ƒƒ}~~x|‚†„ƒ„‚ƒ€}}|~„†…‚‚‚€yy|€ƒ…‚~{xz‚‚ƒ…~|}||„„„…„~~~€€‚„„„~}~|€ƒ‚‚}}~}|{€‚ƒ‚‚}|~|{~€ƒ…„„€~€~€€€ƒ„ƒ€€€‚~||}~ƒ‚‚‚ƒ|yz{~…ƒ„‚€}z{~‚„………ƒz{~„…„ƒƒƒ}z{|‚‚}~}~€~{|}}‚‚…ƒƒƒƒ~||ƒƒƒƒƒ…„ƒ||{€‚ƒ€€‚}~}€‚~}|}„ƒ€€€‚ƒƒ~„„„€~€ƒ„ƒ‚~|||~~ƒ‚|y{‚………‚||€€ƒ‰Œ‡€uuy„‡ˆ„‚ƒ€yy{‚‰‡€{wz€ƒ†ŠŒˆzvsx‚‡‡†††„xvw|ƒ…€{~ƒ‚‚wz~€zˆˆ†su„‡‰…‚ƒ}vvx‰ŒŒ‡‚}}zy{…‡„‚€~€€{xvy{‡‡††ƒwzxy|„‹Œ†sy}€ˆ†„…„yyv†‹ˆ‡€~{{y€„„ƒ‚‚~{yy|‚€|x}‡†„„|{…€€ƒ†‹Š†xv„‰‹‹„€}yxz~‡}x{~€|~‚‡zxy„„|z~}~z‚ƒƒ„|wx€€ˆ†ˆˆ…rtzŒŽ‹‚|‚‚|z„…†„~|„…|zx…†‡„|{{x|ƒˆˆ~vuz‚…ƒvu|…ˆ‰|€||ƒ‰‹†}xx€„ƒƒ~~~…„‡€zx}~‚‚……€|w{~€€~€ƒ€ƒ~~~|~€‡Šˆ†}}|~~ƒ…†„€€|ƒ…†|~…}€‚‚€{…|z{ƒ„„„~{}}{ƒƒ„„zxx…„†…{{x‚‡‰‡…wz{…†„ƒƒ~y{€‚€€}‚~~~~€„‚}ƒƒ‚‚yxyˆˆ…‡‡~|x~€†ˆˆ‰‡}ww‚†ˆ…„‡{ww{‰‰‡…ƒz{|}…‚}||‚ƒz{‚ƒƒ€}€‚}ƒƒ€€|~€‡…€‚}€ƒ€€ƒ„‚€{z€„„„‚€|y‚†ˆƒ|wz}~„††~|z{}…„„††{x|€‚ƒƒ‚€~z~…„‚||~}~‚‚„„ƒ|~€‚‚„†€‚‚ƒ€ƒ„‚€€|}}|ƒ„…„„}}{z{…ˆ…ƒ~yz{‚„ƒ‚~}‚‚ƒ‚€€|„„‚~{|}~ƒ…„ƒƒ}|{{~ƒ……ƒ‚}|||ƒ…„„€~|||ƒ…ƒ}}‚‚‚‚~~€ƒƒ„„ƒ‚€|~ƒ„…„ƒ}{|}‚…„‚‚‚{{z}‚†…„„{{|ƒ†ƒƒ„„€€}~€€~ƒ…„~{{|€‚……„€}{{~„………„€{{~‚ƒ……ƒ€€~€€‚‚€}}}}}~€€~}€~~€„ƒ‚€|{|€…„„ƒ€~~|‚ƒ‚‚}~~€€€€€~~~€€~~~‚€‚~~~€‚€‚ƒ€ƒ‚ƒ€€€ƒƒ‚~ƒ‚€‚~~~‚ƒƒ~}{}€‚ƒƒ~~~€~€€‚…‚€~€€€‚‚€~}}‚‚ƒ~}~~~‚‚‚~~}€‚ƒƒ€‚~€€€€‚€€€€€€€~~~€‚€€~~€‚‚€€€€‚‚€€€€€~€€~}}~‚‚‚ƒƒ‚€€€€‚‚‚‚€~}~€~~~€€€€‚‚ƒ‚€€€}€€‚‚ƒ‚€€€‚€~~€€€€€€€€€€€‚‚€€€€€€~~€€~~~~‚„„„~}|€ƒ†‡‡€~z||‚…†„€{||ƒ„ƒƒ}|}€ƒ…ƒƒ‚|{|~€„‡‡~|z|‚€€~y}€‚„€|||€„„„ƒ~~||}ƒ…‡„{zzƒ……„~~€€€€€~~~~||„…„ƒ€w{…†…††|}z}ƒ…†€~{{ƒ…„ƒ‚}~€„ƒ€~~}~€{|ƒƒ……{~€‰‡…†€{€~…‡„†„yzz„ˆˆ‡|xx‚„ƒ‚}||€‚€~€~|~ƒ‚‚|z}€††„ƒ~~„‡…ˆƒ{z}ƒ†…ƒ|„ƒ‚€z{€‡‡ƒ|wy€††ƒ|{{~‚‚€~{{|ƒ……„€{||ƒ…†‡ƒ}~~‚‚ƒƒ}~~€ƒ‚~€~‚€~~|}€€€~~}ƒ‚‚|€ƒƒ‚…€€€€……€€€ƒ‚ƒ€}~ƒ„„€~|€ƒ‚€~}~ƒƒ‚|z‚ƒƒ‚~}}~‚‚ƒƒ~{{‚…††ƒ}|ƒ„ƒ‚€}€€€‚€}}€€}~ƒ€€‚€~~€€„…ƒƒ}|{€„†ƒ„€€€‚‚…„€}~€‚ƒ„„~{}ƒƒƒ~{€€~€€€€~€~~‚ƒ‚€€~€ƒƒ€€€€€€€€€€‚€€~~€ƒ…„~|}€ƒ€€~||…‚€€€€€€‚ƒƒ‚€}~~‚‚€~‚ƒ‚~€„‚~~€€€€‚‚€€€‚‚€€‚€€€ƒ‚‚~~€ƒƒ„€~|}ƒ‚€€~€€€ƒ€~~€‚‚~€€~€‚‚‚€~}€€‚ƒƒ‚}€€€‚€‚‚€€€€‚€€€‚‚€ƒƒ€€€€€‚‚€€€€‚‚€€}ƒƒ€‚ƒ€‚€€}‚ƒ‚‚€€€€€‚‚‚€€‚‚ƒ‚‚~€ƒ€€€}~€€€€€€€€€€€€€‚ƒ€€€€~€€€€€€€€€€€€€‚€€‚‚‚€€‚ƒ‚€€‚ƒ€€~~€‚€}}~€‚€€€‚‚€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚ƒƒ€}‚ƒƒ€€~~‚ƒ~~€‚‚€‚€€€€€€€€€‚„‚€~~€€€€€€||€‚‚ƒ~{‚‚„€~~ƒƒ~€‚‚€‚€€€€‚‚€€€€€€€~~}€ƒ€€{~‚‚ƒ‚~‚€~~ƒƒ‚~~€€‚‚€€‚€€~€€€€€}}‚ƒƒ‚€~‚„„…„~€„ƒ€}~‚ƒƒ~~}ƒ„€|~€‚€€€€€€~€€}|‚‚„„€ƒƒ‚~‚„‚€~~‚„„|€‚€~€ƒ€~~€‚~~€€€€€€€~€‚€~‚ƒƒ€‚‚€€€‚‚€€€€€€€€€€€€€€€€€€~~€ƒ‚‚€‚‚€€€‚€€€‚€€€€€‚€€‚‚€~~€ƒ‚~‚‚€€€€€‚€€‚‚€~€€€€€‚ƒ€€€‚‚€€€€€€€€€€€€€€€€€€€€€‚‚€€€€€€‚€‚€€‚€‚‚‚€€‚€€€€€€€€€€€€€€€€€€~€‚€€‚€€€€€€€€€€€€€€€€€‚‚€}‚‚}~€}~‚‚€€€€€€€€€€€€€‚€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€€€€€€€€€€€€€€‚‚€€€€€€€€€€€€€€€‚‚‚€€€€€€‚‚€€€€€€€€€€€€€€€€€€€€~€€‚‚€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€‚ƒƒ‚€€‚€‚€€€‚‚€€€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€‚‚€€€€€‚€€‚€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€‚‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€koules1.4/sounds/start.raw100644 37512 310 153106 6477322207 14312 0ustar rootroot Ù®}–žÉÍûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüóéÞÓȾ³°½¶¤•…}xbH+ [Çúÿ÷×—O4478-&'./;CHFFFHIHIKKMMHCA&=†©´°¯ªÆÒÜååååååååååååååååååååååãÝÓﱩœ“—˜­ÁÈĬ®±¦—kF. -Xwx‚wMJ2,$%'(69@ACLLTYZ`bhn_jSF+1)Tw­ÏåóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúöîêãÝÒɰ«˜„r_OB4,# 10}yq‡s…oShCQE2>8>>+6@6LDGNNT]JNUQ8HR@3GZW€—¸»ÎäøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöÿôïðØÞËÈ»«§–„xmeWN>45&&!!%10d3XW8d=WWa_Ybd]bUE^OWXCRMWJIdLPPQhM_m‚–£§¹¶Ð¼ÙÞÜÔâååååàäååâåååååÛåÓÖ×Êɻº»° ±¤Ž™›Ÿ¤ƒŒ™“stSUJ2! 6&.<2%G4/VGODM<;P6ECKTWXRzoll‘‡ªÐ¨Çìüöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷îåÚÈù« ™†wqkd[RB@6$$(%  #.*:I1-BK83JCGHQS?GLJQ=?BPNIhlQ`e{nІ˜«¥º¯Äŵ¾ÒâÝÞÞäãåàåååÞååååååáå×ÛÔÒÎÌÂÎÆµ³¦¦¡²‰‹r`ksZS+4 #+,:!90bKVdRWqhvp˜Š†•Š•©²ª¿®º×ÂÐÛÿéôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúùòäÚÖɳ«–—Љ~sh_VSJC>54/!  %& 24/4`I\WZbeghzzz„‹ˆˆ­¨š ¯­­¶³©½µ†¢¢œ £·Ã¦¡£À«¹ºÕ©½¶Ï”´ÇĸϹÐÈɽºÊÃɸÁ¾»«³«¥©™£‘‚‚rnfmpWRCN4L1-/8)N9ORQRjnatˆ•­µº«¡šÁÇÚÚöéøäôæÿúôíûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúïéçÜʹ½µ«¥¢¡•‘†}pf]YNHA?<89<,+ .($;(/*4F;HNuxo€ƒyb„™–£ªÂ»Ð»Þ½ÁÊÚòå÷ñÿúâøîìÎ×áÖààäÛÌÌÐÕßÊÇÁȵÎÇðµ­·µ«ª¶®¹§¯Ÿ¦†ˆ…Šrpek`mMM;?(+0+%C/0  **A8aacVpqi€”– œ°±§Â±ÚÃÜÛßëÿòþþÿÿÿÿýÿÿÿÿÿÿÿùþÿÿÿÿÿÿÿÿÿÿÿÿüÿýþôöæòíößÝéÐʹ̫«™˜‚•ƒ‡‡}sa`^hbbWUQPAH@E2:>=5:3-1;9=HTU`_`mmk–’—¨««­¼»ÇÓ×Ó×ààÚç÷ùøøóñììúðèï÷Ô×â×Û¹ÒÍÔ­­™¤«†‡ —šµŸšr‚tjqrw\czo`lad^HYCGJ0'*!"/  $   &;@QLHVjhpk…~‹Ž” ‰¢Œ¼´ÄµÞ´ÂÓÞÚÔØÝýòëäýÙìèÿÿÿÛÊÄÔàÜÐÖ÷ÊèõÿÜ×ÔÌ»½×ÒÒ²¿Ê¿ºÍÎÇÉį±š›ž£Œˆ‰‚’ƒptqkevqhkaorufzg_ZK]ZaXhgdj‰nxu~|vƒ”—–©§£¤²°Î«ºÃÇ­É»ÈÌÓÍÅß½ÉÞÑ·Âí¶¿®¼½Ê¼¬·¥ŠŠŒºiyk|v€r_Z,Z/JE:<*WEN)1210+  $ !09V&D;<&dRVSJMxanj€ˆ…ŽŒ›š´”¨Ÿ¨½»µ½ÎÉÑ×ûßøÃøÏøÿàìáéõì÷ôøî½êÕîÚÉÿªéµßÒÝØÈÕǨº­®À¢Øhµ¡’›s{¡—\h\k{}‘jqZ\VH`D\U\]wZyp{Xz‚ƒŒ—“€{ˆˆ‹™€„›“Ÿ¥®«¡Ã¨¬¾³²½½­º´¾²¿¼·½¼Ã°ÊĹŸ¤”˜˜£‘¢®¶“‘¯€yl™Œi†|HkDjGsqEKD[N7B!GQ4*.##%   ;#,==01T]‹ejQed_Wtqz|”™Ž–¢­ŽŒŽŽ¦ƒº¡ÌÅÂÏàÓÊèØÚÑõïîÛÔâÌÒãúòóø÷æýËàÈÚäïíâáÕ¯ÓÂú¶ÞÅÒ¾”©®‘°¦“ve‡‹fœb£jks`iM=X[LVZUZ;B;>0NH9TOl\pdmsy‰pmjxs„ŒŒŒ‡•™˜˜‹ªžœ¨”Š¡°¡Ì¨£»¼»¶ÂÍÀǑ̻¹´ž©±˜ºÂœš™œª”¬´œƒŠ‚yˆ‡¯oy|ui[T\_;\`kJ6< ,K32" "!:/CE;EWVIJ]ako€šƒŠŒˆ”Ÿ™® ‰°¯Œ¬³¯ßÛóØéïíòÜôêóÙÏûôõâÿëÿßÝëæá׿ìóÌÿíú¯¾¸ªÆ²à°Â™Í¯¡¬’›…Šƒ¯¤©†cf;fZbc^xbhW_8O653I9H_KI8=-=2AIRLRg[X_cjhug…‹‹‘’‡‡–‹Œ†‡Š‡‹‚{†‡›˜“—ž˜©¤–°“‰£Œ®‰‚–tŒƒz‹scz“€Š¶}q›UkajcWh@€=JC2<$.C>5N5  (4(  '0.G"P(gPTc]Š{|™£‘”²¨™™˜˜Ž£º©»°ÆÂÑØ¾æÞèÚçøÕúÿÚÿÜýÛäüÌõÏîØÉ÷Âðéíÿãó¿è½Äî·é¥»îžÝªœ°Èr±™‹á‡ºši“T~t—Et=Sl?v9TD-Z6e=VjHo\KU9AA>T=_COfMhf†€’†‰‡tŠ~„qM„Vyv‡`‰ie~t‘“†–€³†x…k…u“uL|KkJ‚`G}Y~†x—YqNV>7L_fXAY#EH02@HUYT59**E'# +* " 27A`RZ2]P[LWShXm‚ƒ‘¦©{~”ƪ¶µº²¨³É¹ËůׯÎ̺ÖËÖæÇÛ©ÉÁÅáàöºØ¦°²–È©½¯ÌӲţºÀŬ­®ˆ›°¥†¸Š‘tqy‚Ž¢¦®kwp|zPdA:3(D4!<(50LVFfQ\HJ;?V@95M\@QVI^fm@:gGsetpn…spmrsd‚nfrwvcaa/L^U^ljfojaT8`FUUYoZ\[R[WfCP@6IT4AN4:"%)+gEkNET4*;1907*.(99?:[-L/SEg[w~xzVr_ouatmzz|msg||‹‹¢©¦·¼¿Ç»ÓÌȼàËØÐÏÖÎÓ¯¢±­¸Î·Î½Õ»†œ¬¥¯³¿»³¥Ÿ§“§´³°†u~j†‹u‚ppVj|t‰–®œ¡®€{`hae\nSH.1-:%MY40C<_&>SUfj„\VUH_NRBJZGA.;3;IWVZgkpj|wh‚€ž†“}”‚‘…y`XPTALFH_N^WI?=:AIbei^dBROHP@BA;>&*&060* &C*CHsS{hSL4HIDEF:?1%'K:AK]AbOX?O_acc€–c‰‚~|iord[EU^gqyt“œ¦ž§©©¼­¾ÌÝÝêóÛÑʹԮ¿¹¤¬–¨¥˜­Ž¨¢”}…™°É»«ºŽŽˆ–Ž•“€~}sd`p‡Ylj`dW”Œ‘´·Ï§¢²ƒzvnwVe}V]GD;4KaRMaQd[_XXBN[xqs~Ppb^IEHP@1DMLIHnxrtt–™ƒ‰†Žw𢢮…šy{qimfL]_KSGA<*7=BLf~gzwET:+578C( )35**%RLKT†…joKCLJTE@FB5UJN@PUbgkf[le]uaWgxlt‚„k…‰gkJ[cacy|u›£®¶²¸¹³ËÏÀËܼÊÄÆÄ­½®¨Â©ž¨‘‡€—–‹|•›¦±ÂÜ›†¦‰€{’–`^t‚†O6dzkh{ji`}Œ•‰‘°Á“¨¼šXukqPRc]NCBtUOUnr;S^aPV=XJ-#IB?K?/B1*'%?<5MWJ;GJI@ZVZ\r„{{o~jqX~tvypz‡^i™‘—~‹|‚fcdZbQosd]n‡‰—Œ”¥¥x“’¤¡Š—˜—–ºÂ¨Ÿ°¤–¥ªž‹˜ŸwŸ‘„„‘••…x‘Z„±£ˆ¡«‘›Œ‚…y‰›srfd[vZY^aTjifYxciŠšŒ•‘ƒƒŽ}wcYpcctryX`mwŽqcjRWH96K16B2KOCHHM3,8JD802./CASI?mrsoƒ†fvs]dooqgrƒa|v††Š™–znƒd~‹Šy ‚˜”¢ª²±¦Äâ½ÑÙÖ¯¯·³©™¦¯š®Ÿ›Š‰Ÿ†–‰’—ª€sˆyvŒˆž•®¡¥½µ©»¬”¡º™‰³²¨Æ´°§«¡º–ª”´x“‹_brd“Œ‚~¥Œš­‹™VUio[}q`jbdW‚u€s…{NMrgd][g{NUgtdRHs„|ƒ~ˆvh}zRlbUTTDNR98PA:$/-("1/B5%QY,e\=FW]D?MI?XF>^[XecWkilwoXseEYD5?-2?ZH9AB;CQJl_KUlVIsdaŠsm€‹YY~_D_SGhX9AorUSc`O]d~eq“|‘snvpmjtrgnZx¢‚‰«¨©¿¹ŸÐÙ¸ÙÉ«¯¸ªÍƱ¼±¾«¾Ì·Â·Êθ¢²Â¡°”—‰hi‚}{² ½ª¥¦À°´µ€·¥§’‰¤¶Œ°­©|Š™§·Û–µÜ§¬À¢Ÿ¢ƒ‚Ž–lr~~{[N…oZpc`ild{‡bQ^n‚s8HnN6JnkVj]gp‹r{˜o{cOjTPtTHhm^lpVsmrk_MWKAUL])1.;,;J81E:SdfotRT€OShJVSV?M`AQjaZz]•ˆi~ŠxrƒiafhXDLTSLR\[{t‚ŽŒ‹Œœ«š“¥‹‹–ž§¨¥ª¢¡ªË¾—®ÐŸ¨ÙÌ­¡¶±¨œ±±ªžƒ•“˜´¥ššŒšŸœœžÁ¥žÊÐÓ°ÆËÄÎÆ®½Â°§¯ÁÅÌË®ÇÛļîÚ®±ÁÖÊÀÞÌÁ»¢¶°À”sœo€qRgL[lfo_z…pƒŽ¢«˜«¢‰¦¥oos”ulŠ™š• Ò‰»©˜’ˆ{p•‰jpu\XMwO1EL5EME==M<4hbJ9H[n]qcb‚vQ`•kPf|v…–˜—––¦»¨—‰Ÿ†‘™¤„Œ…}kbZO[N=2=F4*:(#.(2VXMT†‚~¨©—°Å©‘¢Ÿ–”¢µ­µÐÓ§ÅÍ¢¿ÑǬ³Ð¸«ÉÁ¡¿·¨”˜¨Žˆ—”„€‹Žwx…otŒ—Ÿ³¿ÆÓÖ¿ÑÌËÂ¸ÃÆÒ³ÄÜáËÕ÷ãÄÐáÑ×ÛжÃʾ¸ÇÒ¡—ˆ˜–wpod__WPAG;0EU^j€‘‹»Ÿ©«—pœŸŽ€Š•£·Ÿ¨Óµ}­É®ˆœ¢{i‰“~„vrzWLQ<-5JB/DA*(=0FI"5b†wn}v]y~~އnr™”ˆ¬¶£ª»¤Â·¨ž¦“’Œ†u‚iJ;aB+8K*!(!*RQQ}¡‰¥²±ÃÄšµÛǶÄÞ»¬µ²ÂЕ³¼£‘¥Ã¾¨¸àÀªÃ¬ÄŒ—ž‰st‡zj^|tP[_SXZ‡‡…¨Êɧ»ÚÕ¸ÕýÍÂöõĬÝÜÊÀåíÓÌÒÔÜà¾ÓÞÂÇÊ̶«¨§˜|ƒŒˆcgZ]IJ0:>0i]bˆ—¢—­®™•¢®—–±ª¨–¥³°¯¸ÕžŠ®¸’—ˆ“”‡x€”uf``\LCHii\qŽy—«¤‚–À½|„µ¹ª®ÆÌ¶¤¯£¨«¯™¤ž—Œ…„Žj\ikH;NQ-"#FG7s†ew¢¦›­ÈßÉ¢ÙÞĵ½ÆÀ¿Ì·¥¥¶£Œ£«¤¤¹¸Æª˜¹¸™¬¢vŒ{a_d_RBG1,LUaby–¤|‹¯Ï¬¿öõÕÂõéѸÛðÒÊöôËÌÅÐÀÌÔÞŸßи´»È¾£ ·ƒo„`XEp\$>:H^R]k{vŠžšÇϪ˜£¬‘Ÿª¦¯ºÆ·Ä³’œ™­¨ˆ|Œ—‹nnŠ’qhfhG;OU)-6%FX?KR\Xp…”§³¶´¤¢¤¶¬§Èûª±Ã·ª¦¿­±¹¬­”Œš“…xzTIT]M61,$ %4#EXJ[wŒƒ’®¿ËØß×мÔÍÑÔÒÂÕ̺œ¯´³Ÿ°³±˜§Á°ª˜ž¢€ˆ{gqlg\JJE@J;E^bVƒ”|‘Ÿ¦±ÏÜéÜøøÝÜÛâæçððËÃ×õÚÍÊÖÐÕÈʼ®¿¼ÆÂ”™˜‰}z}sXE`X8#(0)8PLROZj—v¡¦™‹¨°žº· ¥»¾ÎÐÆ·¯¢¢­—¥‡x‚‡„nlzkwrSMP?*162# (#BQPHklqm¢›”¢±®¤¬³±›¢µÃ¸³¸¨Àг«¼ª —¤–†‘š{jrpQXJGH8&+A'5 0P7>pˆŠ‡©µ¾ÔÁ¯ÒÏË»ÅÓÄÁ½Å°¿Ã³¢¦¡ªšŸ Ž¡™‚z–ŒeX_XSHISX;3JWZYj™‚§´†Ðи¿ßÖ¦¶ëãÑÕéôÔÑóÿÚåóåÚÑÖδ¼À±¼µ¥ƒŽ—‹_fuvGDVXF83HK4=DMVW—Œƒ”™ˆ›«£—º®£¤®ªÄÃÒǵ¨²©±¥œŽrguzVUeR#.&! 9G*7VVWjr|o޳·•w”ˆ„£¿²œ–¹Ò·¬¹¼ÀÁÄѪœ™›¦£Š}spircKUU@)M@#,)&QY+ @nul{’—‚|–¶¥°±»Ä¹¸¼»©¾à湵ƶ¥¶¿¨¡~“£†x‹‚‚m[VMC;7JI2:@Rnsƒs}‰š»·­¶¸³ÓТª­¢·ÆÌÒÙÙÍØêøäèÚôúñÒÏÐʲ±¯¬’zŽŠ|{‚pe]^sB:ZQYkn^]mov„ŽywsƒŒ˜Ž«˜‘œ³¢—ü¯¸Öº¨¡©® ž†r~tcQdD+=>'/'4@GGUZep’¢š¦|wž†ea¶Šª¶­«®µÂ¸Ÿ®¿°¶¢‘ƒˆjrj]SRg`LPZO91AK,6fzT^‰p^‰¦uœ³‘”ÀÇ»­°°©¢¨³À°ž®½µ˜±±‡Œ¡xsz’ˆv`maL7SI'4?E?AVci{{†£“©ºÅÉÄ»¾»¢”©¹ªŸÏݾªÒãÄ×ïÜÚàããË´¿Ï³€ª}p}zyŽw‹lfiq[[tjkh‚ylaznu—|t‡x…¡’—“Šz„•–£¥¼¶¡ž¤¦Œ•£{zƒqd?493/+$4NBC`YJc‹§¥°¼™†‰ƒx~—˜…‘–¤ª ­ŸŠy›”‚²¦ŸŽtlelWPjvl\_jVSh^R[j^PohX^€’ Ž–˜š|µ³¬­¾´¢™¤œ–™¡¸³ˆ~‰y†¢vwxLMnfB@]P@58GUgN01LKBLRV^kxv”š•‹„’—¢¬‚‡¢‹‹›‡p{ˆ~’•|lvolixsptnu‰‘ut{Š‘£¨££’ˆ†Œ}†Ž’—‘ˆ„“¤š†z›š •‹xЇ–tgjffj€€_bV\dmo_Y[KNWUUvuadlxz}_Vlvjos„‡šª´©¢‘‘”‹’›¥²§¤™’¡¡¤š©®«¤ž€‹“zp‰ƒ{›¡¦´µ¹À®¤§˜•ˆ‘ ¦Ÿ ……˜•}wqy{`ppXSeh]bSYedbwur{‡ƒ‚z^c_dONWW__`PTLFUkbY[UQVgsfp‰ˆˆ”†ˆykv˜œ ˜’ˆ•zywxrt€z}tbt€]G]~p^aQ_qsp£´°«º¼º¥›§¡›˜šžª·©—§ž‹–£’—’ŽŸ’~mƒ‰lph^^ZMSZstxffbfbTIdiWcYYv~s|‚‚}“•oz‘’¢§´¶§¦ª©—p’Œ–›–‘”ª–œœš¢ ”†…˜™„w„…–’|ƒ‹ŒŠˆ¥µ¯ºÖÛǿþ°®¬¥ª¸®§³¯¢•”¡Ÿ›‡catbGLR\rYB?H`_ek|~~…„oet{m_]WEFY]YHa|…yt\h}€{ŠŠˆx…‰€mfjd…‹xŠŽqr‡‰|gv}qqntyiigmoqzuwŠ™…|­ÂÀÀɸ¯ÀÙϰ¨À´¬ÍÀš¥¬˜ž¢©œ’vlifaciLH[f\ISdi\bzw]u†„ljjh[gf`SQcdRp‰…‚žœ…’ª§¡µº®‰”©®€rxuux|||‡yq¤€…š}š–~hp~‘Ž™£«›¬´½½·Å˽ÃÖÕÇÁ¸²§Äĸ«’¢«©ŽzzaK:H?46:,AVO-Dr|kk}‚‰Ž€”†|noty|cRPRVLNnroiz€Œ˜’’~vx„…ziQ`hbX^cs}ybg^Gr…ut}†omzwfhqƒ“‰€€‚ƒš˜„ ¦°¾´´ÉÓµ¸ÍÒ²³°±½Ãµ©±²“žŒƒudWPTQ;B^V@H<@kxkluyrsi{‡€stueTa[gneihjszz†“–ªÑȪ™¤Ÿ™–…‡~onqk]Vrwcrcnz‹’ƒ†|~uЇ‹•¡²§”°¬©©£´º«³ÓʶÁʽºÅÏË·®¸Ê´›Ÿ—ŒtcV@0>=1+$'31+0Ogzusƒyx~š••‹lˆ…hP]]phseRXir•››”‘€qps\WbdUT]TLNCHUZY?[svdeorv|›¥ŒŸ–˜˜tw𕆤¤§Ÿ–ª¼²´Æ¸¾Ç¿º±Ã¹Ÿ “vv†xUPL[J:1(>76<]XRJ^w“w{”†x‡Œ~ohafhtyxidzyxŽ“šŸ¬º«©ª˜ƒŠ”‰€mr‚{sv\NQ\[bdp~jkhpŽœ—‘©Ë¼œž¾Àª­¬™¨¯«È×À¦«¶²ªÀÅÒ̹¶ÁÌĺ•x}‹gXSCA-  %MSD51>k‚€š©–ŒŽš¦˜‚~ˆ„xgejtw_Vct}}‹›œ˜‘Œ‡‚…{mhg_S\lU94M^P9+?:Fdu„Ž—Ÿ¶Ê§¨¬š‘‰¬ Šuqqectjeˆ ‘ˆ}‡Ž‹v]z„~okbX]R\\QBH>7:Zhafmzoqw•’¢¼³¯µÀ¼««°´¨—œ¯°ª £›Ÿ­¥¥ºÄ§—±°³¨‘^e–ƒbNEIHOBJCHGY^MIQbjw‘®±¦ª­¡™‹‰™Ÿ€s\X{„ƒ{ˆ˜•–’ƒŽ¢–„„xil‡ykr|bZPhehpu{r^q‚ˆŠ ²¸¼§²¹¾¸»½½Ê¯°¾¾­¶À¶³²®£ Ÿ¯»¯«¡œ˜š‚v}|ykUMDF1)?54?^VK>BPt„†¦˜ ¦»¯›‚„€”£ž“˜‚V^j‰œ•Ž‚~‚‰…uwˆ~}hb[QQ[_dZYUBCT[ffc`Z[intx‰ˆŸ¦·ÄÀ©±¶¹»¯¢©¨§ª¥˜‘ŒŒ‘’œž£¥–¥ž”{zldbSEanaFMOJSRmZP\[cpon’§©–“”¡€Ž˜Ž”Ž|u|r€ž‘…}zz–—‰|}~~„{zz|il{Š„‚uˆzoqz~[DLd~€qe{ŠÀ¡˜¨«±¸Å¹ ¬ÂÔ»š’«Ã­–œš¨ŸŒ•Ÿ¤ª¡Ÿ‘ƒqcUZg\]\Q[PN>MQ`ldWY~ˆƒ›Ž‘‰ƒz|Œ›Ÿ’„„Š€ŠŽƒzx…x|‚ˆŠwdtƒraYegQLWUmj_]ghYS\hsmy|zs“Ÿž›Ÿ°©©¢š£¿¶¬¨¨ª¦«™ytt–}z‡™±¬™†{[ipt[OT{{hSMR_adokx‚“}–tyˆ†vІ|…Š‘py…ƒwqv’›‘qhz•§’‡€“”‰w}‡x‰Špcbl‚~b^†™œŽ•¤¢•œ³®Ÿ¡µØÇª—…”—–™‘ˆ¢¼³­“––އohbkvqkU<7Ddke[Yu„”Œ„}vvo{yubf‚ŽŽŒ‹„’”„zy‹†|lw’’‡~‚“š˜“’ruzvS]]HCR\lxhaVmƒ}`go©­Ÿ…‚’˜”‘™Š ÁǪ”‚‚vjqlxŠ¥©Žu¦ tcfo}‰u]Z^aMYXYi‰‰Š„‘—„xuynwŠŠƒ~˜˜„„ˆˆˆwu{‰ˆxz‚‘Ÿ†‘Ÿ·Á¦¢£¬¬“iTo|z{x|x‹€zn^h| ›ˆrxwš’‚vv¤ÇÀ§”œ§¡––ƒ˜ÃÊ³š›§§©§™‘œ…ƒ”\EJ[dMUflu…ƒ™…idrw~hS_z}uiu‚‘“˜—ƒzv‡ˆwr}ƒ€…ŒŸ”Ÿ¯¿°–ƒ€ska\OFLTbvsdi‚“•ƒwpv{”•–†pl}€Œ|zŒ£¬ ™‘Šxpo|r|††Ÿ•‘ž§¤œ‚‚™Š„~†‚c[MOcsuUl€‹Ÿ›–…x{„ƒŠ€kizw{pwЇ†€„ƒ‡wqlzƒ’ˆ~|“ž¢±®¸ÈÔÄñ’Ž‹ŽŒq_f^j‰£ˆn~}vpm_n”™…nXWc‚}hs„š”š™‰ƒŽ—Ÿ ŸŸ¨¬®ÆÛØÄ¹¼ÇÀ¥ž’‚ˆ ’sGCHUnur{tz~ˆ{rYUi€~wteYRgg}ˆuro„’xje…ž¥{…©³ªµÂ»¬—ƒ|}ˆ~{lICESadt‹‰yvrfdkŠ˜ŸžxZ^j~y{Ž‹ˆnX_ty‘†ej}±´»Î¸ª·§…‹’‘•„nf]KX{•Š…{„‡ƒwrj¤¢‚zki|qtv}‚€ualy‡ˆ—¥˜™š¡µáàçÚÒ°™‘ž¥¾·oqhp˜€„Ž•xVER‰”‰jdb_dSHrŽzbikrdmu‰™•˜–°Â®°ÉáöùêÑÀ›Š”²¯š‚{ikgnvvƒ‘}|ކkX?LnŽˆxp[VYYpvnaSfqtdP]‰®ªšžž”ªÒÜÖ¼½¹´†‚“ª–xaXnnf`q‹pegfj|}l…vpohZQ\rnxhUC=8Vjj]gk{ˆ’“˜’‰ªÔêÇž¦¼¤“}ƒ‘‘‘„}€usv™—Œ{m`Xhw‰Š{zognonalzrTPafs˜”¢šš¦º¹¼ÃÈìùêÏ·¢¯Çǽ¯ ‡¡¶µŒkm–‰nX\mbVL[_\da[NVV\pjX=5Aao‰’‡ž¼ÛéÝÔ½ÒÒâçÒº›‡ŠŸ¢Ÿ’‚‚–ˆ|qo“ˆ^7D[„‘‰cMC\fzwO?+Sv}aUTu€Ÿ°œ––¯¾Ìº¾Åƾº²µ¤ŒŒ’¡‰€}wv|~k[gskieklTMCfy^@HYa`mYG61A99Gadeknx‘­º³¶»½¥˜©Æ²š‰‰¢¯¨ ˜–‘‚…š•‚xmpŠ‹wrtkd^X\ikbVOUqxugjy—˜Œ‘«ÊÁ¼½Õç÷àϸ·¾Ì¸¬¨¬ª›£ª˜•‹xjY[plbO.AO__W[XOXbaOHHaU[Y]k|Ž¥ºÈÃÎãàÝÏÊÊȾ´²ºÅÀ¥œ·¸¤ˆ‡„}ˆvy{nqy€„~`NWqZCASgfY]gmprtpsr}…ˆ‹¦´ÏÓÏÂÁÆÎ±¢¨±Ÿ‡ˆ‘˜v€pk_X]WamnbPNMU_h_PGPTLQGGC@Aj{bK0.;MZe\V^m{˜ŸžŽ†Ÿ´¾ËÁ¶¯¤¤´ÅËÆÂ»© ¨ª¡œ¤žœ£¨¯¶¡ƒo~}yzgcP?=R^XUKXst\R^fj‰¥¾ÇÍÏÂÐèöÞÊÈÂÁÇÝÚî–©½Å²ˆovsfWBHWvtlYQVJNP<EasiJ37[u{mkov¥ –¢°ÄÌÊ¿ÈÎ×ØÑº¡›¶Ôåɱ˜¦¤ž¦œ©¥——’™Ž|qkv}{€R;2%:OT[M6:DRWdfmlŠŸ­ËéàËÂÔÝßÓ¼¥¤½À¾®š‘‰Š•nVN[VMGJipoS>6EPC0#+END/+#+Jdg\JGPhwˆ•Љ–ºÆÉ¹µª¡–®Ñ×Ö´¨¶¿Å¾¶¯Ñν¼³±©•˜¢§ˆaC=>?BHK?A<Vft~jWRg ª¶§œ¬­¼¾¿ÂËÉÖ·¤£®¿ÎÌǺ²¶ÈÉÌÉÂÆÂ«¦©œšŽ{u^WD*#%#%071)7K]p~{¦µ¶ÆßéÊǸ¼½ÌÎǶ“†‚™ŸŽ~jilloggoe\QPJEB?FQL< "1ADDTo†Ž„{u–¦®¬–™ž¡³¹¹½Ä¶·ÛåÝÑÃÉÖóÿöæÙÞÚÙÙÏħ¦ŸudP;* (!'@_y~yiu’´ÒÚÁ¼¥¨ÃÍ˪•š›£ª±tmnƒc[f~xylVLKUXA. & *3PfVSYWauxyz‰Ž…‰Ÿ¨°¶¯¿ÐèþöÓÁÉôÿÿÿûúëÚãèççÖ²‡dOR]M7('%"5>0%)Iv†zyq¤ÃÑÈ¿£—¢º»©¦­½¼µ ™¦©›•›•¨©•hl{†Švpq[N@1467/+4,.GH>;Lnuwnt{ƒ–Œ˜¦ž‘„‹©µÁ±ºÇØæãóýþãäìÿÿÿíÛÚ×ÏÒ¿¤—vcL;441% &'Mrj^l`[r¥Ëʪ˜˜˜£©¯®±¦…‰—ª£–„Žzvƒ{j`SHNTOK3"  /6;4@CUhfYT`‚˜Ž|wš¨¥¬ÍÜâßëóÿÿóëÿÿÿÿÿ÷üçɶ¨£’ŽˆeK<@6=7;#+4$6=NMYQYKX}š¿²Ÿ Š© ž¥ª¶±§¨±¼Ã¿ª¤©¶Äµ¦˜ž£trrzvmlkH"& 9@6==D;INWgwzxknw†›’Ž’žœ¤¿ÞçàâêåîÿÿÿÿÿÿÿÿûòÙœunu‘–oH 9:3"(D;-$2?]Ž–ˆz€™µ·£˜Ž’‡ª±º»¢‹xŒ¦¹±›hXdqjfn]QDE+"$%'-AdimWKFSbƒ‘‰‚‰¦²°ÂÑÒÜòýôýÿÿÿÿÿÿÿÿÿûÚ·Œzy“­¢—“vB(#23676)83$'=[‚ž¥‘|VN|¾âݼ›‡ˆ—¿ÓßéÖ±•žÀÛæÍœ‚‚Ž¢¥€rnjmaA#/@TWUH.#*FWyŠŒpQIEYƒª¤¢¬²±ÍÜÞëìõìäùÿÿÿ÷ûÿ÷êÜØuo…w“¬£•zICRC" '! $Cn˜tD9Mh‘ª²µ™€€ˆ§¿Æ¿´­­°£¡–Ÿ¢„ƒ€|ƒujcSZUO-)E@2 !7DEIOKH?6FKRN,;\dV_UWl~vt€–›™˜Ž’ £­«ž®»ÇÆÅ¸Ÿ ¾×ͽ¦¢¯À¼±˜vccorbXUWeqvoe[\`o†€tXGDPc{‘‹¤»ÉÓÒÍ·¸ÂäÜØêÛËºÊ©–‰‡‡…І}fbfbSSNQ\V51Rc^JHLUk~zt}Œ‹„‚{{”—tpˆœŸŸ¡ž§•}wwƒ–›“Œ‹xSMB7@?BQNQ2/59Wg{mSPOQct‰”Œ‘‹”¤¯»ÑÓ¸¹½ÄÑâ×»°¸ÔÏÏɰžš¯³¨¡¨¡—‹ƒ|aYbu{jXRJ@/3F^]RPJ=Kv–˜”–©£Ÿ Ÿ«©­ÆÈ²“su¨ÔàÖ±—™žª¥©¤¢ª³ºªƒcUSkŸœ|_RQ^m…—–ƒy{snr~‰“œžŸ›‘Ž”¢«¶¬¸¼¹¦´¯¨©¾ÎË“…v ­§‘‡ƒusluuacu~z`R.#+Puq\G8>?[}~‚‰„|…†ŒŽ˜™”–—…v^Xhœ­ž•…nctŽ”’𢛀e7$0@ZnshF62=Tm„…pemmyz𢔄¤¸Â±£š—­ºÇ¾®œ——ž³¦˜ ¨°¹³ž€|ƒ…І~}ypkmuplbXJ8Gr†}fUXfy€Ž¤©­ —˜ž¬²¯¨œ¢«­ŽyxŒ¢³µÁ¸š‚u‹·¾ÈÎË´š‹rdir‚ŒšŸ“†rgSQr–©œ—vxŒ˜©£¤¥œ˜””‡ƒ¡ºÁÀªœ„sqy—²¸®™‘‹…}~mtƒ€„ŠŠsdFS[faR]Rg~`QMRcnŠ›¢˜‘–Ž‚}†š¢šgVi†•ˆwd\Zk“œ£°¤pcZLGQ^kt{woO96Tnux‰‰€€”›“¢¨¬¢—–˜°»¬ ­°±¶—zefw…–»Ä¼¬›‰€‚z}ƒ—š„z~Œ†ooYRPYfs‡¨©›—{e\Wl‚Ÿ¹¸º¹«¡¡”𣮱£‹ƒš§¤š•–yqlp‡«ÉÄö¥’‡xs†“«¯«“}wuz|‘™”‹…Ž–§¦©¾¾¤…|ˆ…œ¶´©µ«–‡aWm„Œ–¦§—ƒfds{y‚‚se|…†Ž‘“ƒ{XSZZQZpž°£wlg^YNUk™¯¼§“|‡‹š›‘y{„ˆŒ‡ŠŠrS?=E]€ ¥¢šŒj\QWh‚Œxprvm]QPl…šš†|Œ–¤ÆÒ¹¡“‘–§µ¿¹°¥Šƒ€pvnv‡’•­´žƒbYf‡–—›…mq„„‰ˆ{`RRiƒªÁÀ²ž”‹pfi€ž°´³¶«©²ª¯š‘—¢ £ŸŸž¥¬›pfr{€‚—œž§ Ž‹Ž”¡±­¦¥®­¡‘†q†—£§±´Ÿ—•¥¦¯»Ç´„yr|’¹Ä·™pTcoq~†……ƒywj\hn{†‰†‚~}~Œ†ŠŠ~i_Vo‹¦·ª–Œ”‘Œzkljxƒ‹ž©ª™Š‰Œ™›”ƒvs€Š€`TVhx}cTDRo˜©•m]Ziy„ŠŽ…~jmo‚“Œ‡†‘ž›¢ºÆ½¾¿º•|gw›Îθxaev‹‰kbo†™‹sd^o‡§¢‘}p~•šŽ‡‚Œž¹¿¿»ª©¸­­§Ÿ‘“š²½¹°³¨¤©±®ª¯°¡”ŒŠ†}Œ”‘”–ŽiZa|›¬´¤Š‚s…«ÁÉÀ¯¦•ŽŒ¢¢¡—™—Ÿ¬²¯©´«¥œ¢‰tt¢š†z~ztdfabuˆ‰xg`dp~•–‹ŠŠŽ”›š‡’‹‘𝹲À Ž†–—𦏴›Ž„‚‘“¢§œžŸœ‡zklYScŒ†seYLDMgv‚}gKETdx‡‘†vpjjwŽ—Ÿ™˜¢¨µ±Ÿ“’¦°ˆpcjt…©¤“|hcil™Ÿ‰m^OVs“š˜‘…ˆ¡¢™•”˜­¡¤ª²¼ØæÝÊ»±¯»Ë×ÞÚΤˆ}Šª¹ÊÄ·º±•ˆ{{zvƒ›«´¡‡mds„–š}mht|…ƒ‡‹’™¬Ã¶§³‘}{Š ­¤®¬© •’ššš¡«¯˜v\LHYz—¥£šbJG[rˆ™“‰gD9Is‰‘™”Œ˜—„x{—Œ–­¼Ä·²§¢¤¨®¼ÅÍÄÀ£ˆqh–¤­¸¬˜xghkpw}ˆ‰…ƒtjR[d{jZFFES`_YWUimwvs~uiz‘˜œ­®²¡™ˆ¥²ªysdSPd|±·©‹iOPq…’™…pYYcq|€’¦¸¬›Š~gbqš¢²¿ÑÚÙÓàßÑÆÅÎØÚàÕÀœ‡tƒ–°½¶¨¡–ˆ…ˆ”œ¦Ÿ›ª•€~ˆ‰†vsrookqœ”‹Œ›œš œ›Ž“£°»Å¶£™“˜ŒtЉoJ9:Cm™®µ¨~^STpƒŠ“‰sgapq|xxŠ™Ÿ›ŠraR[›¿ÉÀ¿¿ÌÎÊŶ¯·¾¶·² †sr‚†}„އ}vt~Š•’zwy\QcvkgdX?++B^kgjbagfkmjzŒ¦¼ÆÃ¹£……ˆ‚~ŠŒ“‚`YNRf‚¸¿´ª\V]~••¦£Œ|xnz€{€›—ˆz~…Œ «ÀÉÒáôÿÿüùÝÆ¹³ÆÁ­ž‘žš“Œxo{–¢¥ ¢¥ª¨¬£›••›™•”ŽŽ}oaee[_w“ª¢]][hŸÌçßȾ­›•…‚|~˜kabIHM`u‹•ª­¬¤ƒsno…–¨¸²ž{janqsni{•ž˜†…†…–­ÌÚÚÑÔ×ãæÖÄ­“|qt…’—¢nUF\|›²·´¥„kc^b}” }]Wh[Q<044IWa`]J-1@Ts‹ ¶·²¬¡™‘†vrwˆš•–Šf=?RnŠ¡¬´¬ ŽŠ–—˜¬·°š˜‘yov~Œ††““›§£«²¹¸¼×àæåéñÿÿøéÐ烔¥¢œ„~rzޱ´³±µ­²¨šŒƒ†œª¤™‰}vi_[dokgdeaV\blm†¥º²±®±§ ¢~rs‹‘„gaCEJZr‰’ ›•‘”—¡ª¨¦¥›”–ˆyg]oˆ –’Œ’ ¬®¸¸ÆÐž¿ÏÎÍÚÇ­•Œ„pkdnv„” —Ž›—š ¢žš†rhovtpq_O86;=GHC858=JTdjw€’™‘‹—•“Š}njm~…~hUJ\t†’¡ª¥žœ—𦴵½º¬–”…‹‘…€Š‘›£¢¤¢¨««­¿ÈÔàåæááØÏÐÖÛﮨ©§¢Žspy𬷾µ¢–š©¹ÇŸ¨—†€~‚zspec^^_aZeZ]bjt}|„’Ÿ«¬¤”‡ˆ…z~vssyƒureP^g€• § ƒƒ•«È̬œ{gnv“ ¡šŸ™“•¤­®­§¬´»º»¾ÓÑÑŲœ–Œˆ’—”Ž{uxvyvt„𥴲Ÿš¡¯²®¦ž˜ŒvVPVZSG4,7MRVSJ;2(0Kfwvrw}Š’‰{khemd`m‚‡„~‚†Œœ¨®¯£‡¬È×ϹœpZe…©¼¼® £©¹ÂÁ¾À½¿ÈÔÖÑÊÉÕãóâÆ£„~ˆ–£ Ÿ˜”˜£œœ‹Ž‘š°ÊÓÖȹ°­´°ªžs\NRZ^SOHOm€‹~aRCG_‰™ˆ†ƒŠ˜{i[X\duƒ„}rtŠ™¦ Šxip‡¢¡¢œ°´¤‰n`l}ލ§ª§¤™¤³¿ÎÃÿ··ºÀɹ­¨³ÆÈ­‰nVR\^j€ƒ€ƒŒ™šš—Œ’¤ºÅº³ª—ˆ}ys\H;:=IH::::J_niO<>C\uynfirpuuuaK82C_|€ƒ„‡Ž™­¼¶¥†|¥²´­ •ŒŽŒ‘˜Š”¤°¯»»¼µ¶¾ÐàæÞÐÅÂÁÎÑÑÎÀº¸µŸƒbZai|”¡¥¬³¸¿¿¶«¦¦ª´»·´©œŒsighaYULFGPZgjmvˆ§”{htxˆ—ž“‚tmmg^UTUaw†”œ˜Œ|‚ˆœ¯¼¶›‘yu}Š‘}ƒ…‚†‰ŠŒ’—¦¤°´¼½ÂÎÛÝͼ°¯°¶ÂƼ©‹rjnhTGCEf|„І‚™Ÿ£«µ±©š†„ˆ„{vthdXZMNF4-+17KZqu{sd`ebdmt…}mbO>?LKSfw~Ž”–™›Ž‘ ºÏÞÚÏÃ¨Ž‚y|„Žœ¦Ÿ ž›ž¢¨œ¥¹ÓâäãààÝÒÑÓÌÊÈÙäëÞÁ¡Šqa\o™«´« ‘—©»»ÁÁ»ª¡…sfcddhowpTF5''DPc—¬´£“xqu•›¤š€oaHPUf|ƒ““Ž~‡|‚Œ§µ¾¸¿¹¬|mgoƒ™žžŸ›‘Ž–šœ©·Ðìëèìæßβ˜½Ù×Ò¿ªŠtaM@KYl{›˜–ˆ…ƒ‚ˆ’§¥§ šŒhTIBMWWgi^I3 %5ATbiz‹s_S_r~‡‹‚sgNPU[ZWUiy•®¶© š˜‘™¤¶¿Ñ×̸¤Œxtu{ެµ«¥ Ÿ¢®©§¨¯Äâôÿÿÿß¼µ½ÃÎÔÝåÜÔ·£‘‡}~‰›¥©¥¤¥¡‰{„ŒŸ¯·¯–lWJEBBHWSQRKLF;:Bdƒ’¦¬³¨©š”‰ˆ•£¨©¢“ˆx|nhbs{ƒz‡œ³°¥“Švlr”³Æ¿®–•‰vpfqƒ–¢¦««³¥—“•¬ÀÚüÿÿöÝÆ¶º¶°º½ÆÏ¶Ž€toz|}{x‚‰{jbV`ow…’yp`VE6407EE8-/-''/9Uhqty{‡—šœŽ„{{€‰•™–’ƒjUZj{”’µ»¯¦š¡£—‹Š˜£±©¢¤›¡–‚u|„•œ§µ®¤¬°¼ÃËÝòýÿóèÜáÞãÔÓÔ×ÙÑDZŸœ ¤¦¦£•’o\]Zehjw‰Š`YH?<425=FEA=5*5CIN_x’£›‘š¡£¹ÁÁº³±¸ÆºªŸ‰ml|‚’œš—‘•”€›–Œ~|€€~„„†ˆ‰ˆ•‘††…š¢µÀÅÈÇÉÚÝÙØÕÐÕÖÕÛâÚȯ ’‘Š›¡¤¦œƒbSC7@Samg^QLD64/2<<;@9/+ !*7Pf~…„…’‹}ƒ‘¦ª»½ÌÄ¥™•„„”¢¬¬³¤—z}›Ÿ›•ˆ|xwz~}‹•Ÿ¦“€t|Œ™¢¸ÁÅÏÝàáÑÊÊØñöýþùïïâ˽º¼¿·´³·©˜z\`WUQU\ND(+3350'&(1>EEKE@508=Ofsœ˜µ»¹¯©´ÀÓâêïàä•¥œ˜«¶¯¦‰pjq}ˆ‡‚…ol^\[g{„ˆ…ƒvmnpv†Œ¢¹¾¹¼ÅÖÑÆ½ÁÈÍÛîïòßËÀÀ¼©£ž˜™‘ƒucWLE8,'#%&%!$--  '51%!##3CR`is˜™’“—£ºÎßßåÕÊÂÃÀ¾¾¿À¼µ¯¥£“†~~‚†‡ƒ|xyrd\`gnxƒ€}€Š–¥°ÃÀÇÓäèéâ×ÜöÿÿÿÿÿÿüìÜм­›«¯¥–aM7*(+!"/+3?DIGHSpx}Ž“«ÄÊÌÍÔãííîÜâ×ÍËÌÍÈÁ³²±²ªœ‘splki\^hmjb\ZWRCDVgsrmlw†ƒ‡ ±²½ÈÕäàÚÓÏÔÞïöþÿÿø×¿°§©ª¨¬¦›†oO8* #!&5@;?HVgmtqr€Ÿ¾ÉÓÖÝöóòëåïíàßÓÌÍÈ·³­©¤¢”„xi_[ZfpqlXA>>>:8Cbq…Ž›ž•‘¬ÎÔÕâØàéþüûüÿÿÿÿÿÿþéÙÐÇÅÈͦ™}Y:   #+=GRXacl€—±¥¡œ±ÐèñüÿüüüþôåáÝáäâÞ̾³­±¨˜‚r`a[RKIP`]J.#,>Rgu…ˆŠ€~ªÈÝØÑ×ÒÒÑÙæõÿÿÿÿÿúåѹ²²´¶±¦–~_<   -23:N\hz†ˆŠŽ¢»ÙåòõûþÿÿÿþôæçéïçåÝÕɼ±¥™•‰wfXOE=6972+&%"/@Xi}Š ¨¢–—¡°ÀÔÞçèöøøûÿÿÿÿÿÿÿÿÿþñÛË»·ª zUB'  2CNd~†œ¬­½ÐÓÛßâèóÿÿÿÿÿüóôðõöðèä×Û×ηž„{|w]A,! +-&0=Odnu‹Šƒˆ—«ÁÙàçíððòøÿÿÿÿÿö÷ñðìÝζˆp]LD<:0' !537GShŠ¥ÃÈÈÓÚââçúÿÿÿÿÿþøûöøõïæáãÙÑÈó¢•iM6"! "*5=GU_p‚Š‘–œ¡§«°ÀÛöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÜÁ›yfXRSFE@=80H>@HQU]f{‡•¬ÀÊÕÝâìîæâãåéíôüýÿÿõ⽓rXIPZccUB  +Lk‚—¤°»ÐåïÿÿÿÿÿÿÿÿüûûÿÿÿÿôáÖØàëâÔÄ©„]A)+/35* *--,4`z—³ÈÔâîôýÿÿÿÿýòöýÿÿÿýüööðêÚȽ¯–sghoj_P;949<:/%(1>EJNA88?I\rƒ’Ÿ¯¿Á½¾¼º¹ÀÆÎ×ÜÄ·¬¥¥¢¤¦¡™ƒeJ2 2Lk„—¡´ÄÔÙæâäîûÿÿýðèèîñèçáÞáäèàÒ¸§”‡{mhkjlsxj]XSB66=JXin`QLQXk‚‘ ®¶½ÇËȽ°¶²¸¸ÂÊÉÇÇ®›‘Ž‘‡Œ“ŒvdL7#"%12."  &5FPdy‚˜¤´½ÂÖàßàçôýÿõêêêòòéçãåäæâÔĸ¥‹‚hdbllˆ‰ti_N:(#,,776?AJOYahy¨µ¹³·¯¥¡—ž­¿À³š’ŠŠ‹…ˆˆŠ~ibJ4 ,8B<3* )=R`r{‘¢¬±¹¾ÃÏÐÙ×ÜßòóëØÐÍÏÎÒÐÏÏÖÜÛͽ¬¥™‰vnst‡Œ‡…|kYOD9:@GJV]ksˆ“š ¦­°¬£§±¶²¨¤§·¿´¢„vtr{t”‰}qaN9*$!'1DE?0" .DN]mz„‰’žœ£¥¶ÄÍÚרÚÜèôÜÎÅÎÚáÝÚÜÞßÜÜÒü¨•‰‚|}†–‘‚t\PLMA/$*9ANbxŠ”’’–𤝦¦ ™“–“‘‚s`eo{~{{ˆŒ€siUD70,((.33,#"#"(!7Reu‚“›–‘™žœ­»ÊÚØÑÕÒÍÀ¸µµ´ÁÇÊÊÎÔÛââÖǵ§£¤¡œ›’”Œ‚zpdbZQKJNS`jx‹¨³±¨¦š—›£­¯¨ ›–”{h`^_jv{„•œš‚j]UMNLE:31+$ !1:O]lsv€ˆ†“𣭴¹ÁÌÐÎÌÍÏ̾´¼ÄÑØáãâââáÕź­©ª§Ÿ’ŠyqkieTPIHHCJLU^elt{†Ž”–•“ž©Ÿ‚|}{me\\_eq|‚ˆ†‚~zollgd`TD<2*&#!/-*%!&;EQesm|~„‰˜¤¬°·º·¸¼ÃÁ²±¶¼¿»±¥¡¦°½ÅÏÕØæâÞÚɹ¸³²µ®ž‹xnfgi^\SV`q€Ž•…{~„‘‘’“ §¦žŸ”‰€|ske\Z\cpv{~{~‚‹”‚{seZF763/+ +')$*:IZmrpkllzŽ™¦¤¦£¬¶¿Áĺ¸¾Âƾ²§¦¨°»ÎÜàäéêáÛÐÈÅÉÉÄ»ªœŠwld\[XUVRWgowx||zz|‚…ˆ‡’ƒƒ‡Œƒ‚yre\SNQ_kx}tzwssqoqonoaYNI@<47;5) &5G^hlfnqvr|Œ¥°³´­¨¥£§¯«¯³º¶³©¡¡¨­µ¿ÎÖãèæßÙÑÉÏÎÈ¿´©šŽ€|tpmhjlnv„Œ•›ž˜“ŒŒ—ž¡Ÿ˜”…~|{qi_\X[kqqpi_gs‚‘“•ˆ…|q`VOJA@@DIKD4 $/5EP_p}Š“ŽŽ•¢¦©¢¡™œŸ«²½Å󡘥¢¹¿ÅÒÜæßÝÜÛØàÓÍž±¤…{kklt~yqjfc`im~ˆˆŒ‹ˆ„wvx„ƒ}{xqhffdflolhdjjhfhgfnvzqjgYZUOMRPUWPNF4*1FZuƒƒ€…‚†š£¨§¦¢—‹‰’§µºµ´µ²¬§ª¬¿ÐåèæÝ×ÚßÓÅ·¬¦  •Œ‹ˆ‚‰†‡…~xv|ƒƒƒœ¦±¨˜„ˆ‹‰ˆ€}yuwphb_`imofbluqohkqvtrib[ZSMTUROIFC=398Kd‚–™–ŒŽ’”•žŸž¥¢Ÿšš¢§¢§¬¶ÆÇ¾¿ÇØêìáÛÓÓÉÁ½²¨¢ –‰{rkmw†‹Ž•˜…plhks€†‰Ž‘›™…|wx€„~zupeddec\dd`aXKEDET\fgrh_XUXZTKLFBCLSdy{„‡‡|ˆ•™¥©¤§™‘Žž¢©ª¦©··¾¿¿ÁÐåëêæÛÍ¿³­¦›žžœ–ˆ‡ƒzur{…“Ÿ¦ ’ƒx}–¢¤¢¥ œ–‘Š‘’’Œ‡‚~umg^]WVYba\c_ea[NA@FN`glncWED?@>ABHYj}†ƒ‚‚xw{€Š”™ ¦´·¶º©¦¤£¤¢£ª¿ÙâëéîìäÜÒĸ³«¢œ”’Œ”‹}vkdo~†Ž‹‘‘‰‰‰‘š‘‡ƒ€‹’š£¤žš•…re\UPPLRU]YXQJ?A<;?>GRafdebaYPMQUW^^cirr}ƒ…{y{~‹’˜£¨­´º»³¨—‘Œ™°¿Í×ãäìáÔɸ¯¤ŸœœŸ›˜Ž‰‚|zoflptzˆ— £¢©®¯«§šŽ“›ž °º·­ ‘…ucTQPTQPPTSSP[XQI?682@APW_`a\YZYYWXTWakopsw}‡’Ž“™Ÿ¬¿À¼¶¶³¨¨¨§«¯ºÇÏÛáÜÕÏ󪢟œ˜“Ž‹‹‰wf^[cr–•ŠŽ‹Œ“ž¬®«ª§¢›•—•—¡¦­³·µ¡|jYOJFIQPSOKD<640106/1:HM[`dntrffULEFOSZfpz€••–šœšž«±¸Á¼¸·³³°®®¼ÅÎÎÎÎý¶³±°¨¢–’ˆ†zmiaadlu~€Ž›ž¦®¸¼¿¸´²²®©ª®±²¯¬¬©’|f\SLNVYVPH:3594=970-,+2>GIMXZ[TRLFDFPY`akx‚𡧍¨¬§§«®¯³¼½ÂÅÆÆ¿½¾¿ÅÅÁ¸´­¨®­¨¦™’Š„†„|~yzshkijr…Ž˜”™£¦´»ÂÁÊͰ«©¬­¬«¤Ÿ–‡|ugXQMOTUVLD=;92-)+%*009BDIT[[Z][UMDBHQW\cp…™ª³·¯©ž ¨¶¹¼Á¿ÁÃÁÃÀ¼½¸º¶¦¥¥§¨¥ š“‘’‰yljksuzwqms‚‡•¦±»ÃÊÇÈÄ¿¿ÁÁ»µµ­¡”‘‰}ii^TRVZ_bXRMF@@61-'-+088=EJMNKLKHFEGHMRZdq…‘£¦««´»¹··®¨±½¼¸¸¿ÅÊǾµ±«©¨ªª£™‘Œ‡Œ”Ž€sekt†Œ‰…{tnmqzƒ’¢°ÁÇÆ¾»ÀÈËÍÌÆÀº­¤’‡…‚tjaWOKN`gpoi[F<1*$ '/>@>228AILIFBEHCFJQYmƒ”¡«®¸º¾ÇÆ¿µ®®²´±¸¶º¾¿µ¯¥§©¬°°¥˜Š|y}€…‡„tnlkzŠ‘–•unfhx‰ ³ÇÌÇ¿¼»ÂËÕ×ÓÐǸ¦™ŽŠ‚zj`VQOJYk|„{mT?,"$3?96303ADDGNR\d}¡ª²ºÈÑÕËÆ½´²¯§§¬°º·¸²®¤¤¦­­§ž}sstw|y~x{{‚€Ž•™•‡tqr|„ˆ”¨¹ºÁ¾»ººÁÎÔÖÏŸªŸ—‰€uk_ZY\V[ds|{ukV9$!0035175:==<;@?@AJV^cq‚Œ•š¡ª¾ÔÜÜ×ʾµ©©¤  ¡¨´µ¯¨¡œž¨©¤–‹€vonhigpy‡—¥ª¨šŽ…~~}ƒž¬·¿ÂÅÀÄÉÈÄǹ±®ªœ’‰„xymje`]^dhijj[B'%)1/-*,./,47AA@BIEGHLKO]oŒš«¹ÀÀÃÊÇ»µ²«¥¡¡™—œ¡œœ˜šŸŸœ•‰rf^[fq…‘•–”“‰‰‘˜›–“’Œƒƒ…’§¸ÇÎÐÊÂÀÀ¼º²¥Ÿ¡¦šŽ|tkdaboonmj^ZG4&+226/*$!&!'-0/.16?DUi|’ž¦§²º¾ÀÁÈȽµ«˜Žˆ~€~‡–¢¨©¤œŽ‚wnfgluŽˆ‹”œœ¢£¤«¡–ˆ…~|„„Ÿ´ÁÆÃ´­£•‘𧝻½·® Œˆykfa^aa`\SLHHB:8011/ #-7=?@;?@FTWbk~…‰ŒŽš™š¦¸ÂÎÔѳ«“‹‡~‰‰“–¨´¸¬ž‹~rhgnv€œž°º±¨ª ’Ž}xtw‚•«µ»¶­ž’Œ‡‡‰“£°»Á¾´¥zh\OILLQXYUPKHGB1(#(#) &/=FHFLHME@?N]lo|€€…”˜œŸ£¯µº»»¸° –‹|}€Ž”§««¥¡“ˆvy„‰‘›—™›——œ£”“€€„‡”–Ÿ«¶¹´­§œ’”¢°ºÂ¾¹²¥“€qWSXet|€yrd\QG<;:50% &*./8,29BCHNVagpŽŽ›–Ž‹‘ž¯»º»«¦˜”ŽŒ„{{}Œ“žª®±²­¥™ˆ†‚†ŠŒœ¤«§”‰„~~‚€xty€‰Œ‹†¨­¬¥’Š’ž¡£¤¬£•†wg[PJGXe{ƒ„wp[J<1'%'(23<><;A>9<51222<;;==@A??2,1+/:DScry––Ÿ¤¥¢Ÿœ›”—”š‹ˆ”•˜™šœŸž¢¥«·ÂÈ×ÜÝÕͶ†{y|~‚‡…|z…Œ”¡¥£¨²¸º³®ž¡¢–›š—ƒ~€~Œ“ŽŒŠ‡†}}xulh`TJ<4/)%$0.6:4-( "6M]rŠ— ¨«ª§ž”š”—”‰‚ujhlz‰“›§´½ÆÓÔÕÓÛØÔÌÀªœ•Šƒxumlhaeago|ˆ’—ž¦ª¯«¦¢–Œ’’—”“„tfbZVZhz„”‘†{wpgfkttqd\OE<987278...,)!/7AQdvŒœ¥«­°·¯°ª¢›‰}uptp{…•¢¤§³½ÌÞëîëâàѽ«†ztediuv{}~~‚‡“Ÿ¢¡¬§¢¤¡¬¨£Ÿ¥¥©®·¬ž˜ŒŠ|vu~‹”•˜’‹€}Œ‘t_M@:853./+# &4CZt‡—¢¯³·±°¸­¥œ†|sdc_ak„¦¿ÆÍÙæíïëâÞÐÿ´¥ ’ˆ{mmhmib^Z_bny†•¢§¤ š›œš–•”ššš‰wla[UX_r€†‡‰†€|ƒ—š’tf_XK:663-'!(3I\v’¢«°´µ´¹µ±­§¤˜…tndicq€‘§´ÇÚæéíòóíäÓļ¶­žwutsq{y|~y}Ž“–•–šŸ ¬¯»¸º¿¾¸»º²¨Ÿ—‹†~x{‹Ž‚„‡”–––¢¨™‹}j^TD:6/)  -=Xo„—¡¢¤©¨¯¶¬¢¢ •‚}tuy}’¦»ÌÒÔßäåçòêØËÁ¸°¦“‘Œˆ†{teZWTXV^kx}ƒ‡žª«³º¸»¯¤Ÿ—”ˆronk^btw†ŠŠ—˜‘‰‹“€~|uhaND?B52*%'! 1Qušš›š  «­­µµ®ž“‹‡}z©·ÀÂÈÎÍÕÕÚèÜÕÌÅ»³°«ª­£–Œpjf_bhnm}†ƒŠš¥³ÁÅÒÜÙÊ¿»µ­¡£˜”šŸ—ŽˆŒ—¥¨®ª£–ŽŠƒvo`aTLFAD>81-+$  ?b„Œ˜ š–›Ÿ›ž¤© œ”•”™¤´ÂÒÚßÚÕËɾº»ÈÅÆÃÀµ´²±²­¥•‰w`I:0217+%   ,67?Lepx~†“¥°ÀÍÖÙÔÎÃÊÇÃÇÆÄÀÎÒ×ÐȹŸ‰xuw~€‡„…~wjcbYUUZcq}ˆ—ª´¯¥›’’”œ¨·Ìäï÷þÿúìÜν¯¨¦¦¦£›£¤¡™Ž~sjgc[LA5*&'! &@RXWa[abjn{Œ›®»ÈÌÖÙÔÒÈÉÉÁ²¨¢¤¬±¹Âº´®©¤  —‘ˆxupkhjjkpx‚Ž¢¯¾ÆÏÎÉIJ±³¹ÌÝíüÿÿÿÿÿÿÿÿÿôæØÊ¾¶±­¦«®µ°¨¡“m^OA0% *?Q\c`[V^bfw‹š·ËàñöñâÓÇ®¤¡«¶¿ÈÇÅÀ²§Ÿ˜Šƒyo_VNFDEHR]iy†‹“›™Ÿ¢£ž›‘—–£¯ÀÑÚë÷ÿþúðÜÉ¿µ¸¹¼¾º°«¥ ›šŽ…~{ulaSG/" $3AMT[[cuxyuw…Ÿ²ÉÛáÛË¿´ —”œ¥±ÄÈÏÌÊÆ´¨”sf^WPLFFHR]o{’Ÿª¦¡¢¦¢¢š¤¹¾Ñåñ÷üùùêÙÍÁÀ»¿Ä¾°¯£Ÿšœ•Šƒ|vmdWJ="  -2>L\gqvy}ˆ‡— §®±¸·¸µº®ª¤¥©¬³³ºÁÐÛÖÏĸ® Žznc_YVY_djzˆ—£±ÄÔÝØÔÔÑËÎÚáæêðþÿÿÿÿÿÿÿÿüóëæÕ˺ª¡¡¦§­ ›‹€ueWD7, +27=HUZ`gpz‹ˆ“—¡«·±¬©«³¶¶¬”“˜œ©¹»º³²®¨ Ž~jaVMHDBKPZfu‘™¢ª¯¶±°©ª°¶ÀÄÐÙÜÞããæäêîæÜÓǹ·¯§›‘šŸ–”Œ}wsfQ;.  '316?EOV^]jlpsƒ”••™ ¤¨©¯ºÂÉÁ½µ²©œšœ§®¸ÃÍǾ°¥•‡xld`dckq}–¦³¹ÄÈÎÏÖÑÖÜèçëÞÝæíñûÿÿÿÿÿÿÿÿêܼ«ž””‘–Ÿ–‡{pfZN@*   ''(,1-6=PR\dcgko~ˆ‹“™©²¹ÈÔÐǾ©š‹…~„‘™ §¨žŸ››„zlgZXOT]dr‘ž§®©¬¬¨¬®µ¾ÆÌÑÄËËÊËÑßçîðíááÌÀ·¦“Ž‘••‚ufb[M>.!#6@IOZTMIMNSWTZYct|Š›§´ÅÍÔÙààÏ𣑆†–¬¯´®¡˜—”އ‰‡–¢ª®±¹¼ÂÇÓÕ×àåìîõð÷ñôñ÷ýÿÿÿÿþùõèÚÊ¿­Ÿœ™•€m]J@8(" %#$ #*00,.883,+2?W]jpƒ‰–°¿ÊÙØÝ×Ä®›Œzwmlpuv|†› ¥£¢™zxtyu„Œ–ž¨­¤®­­³¸ÂËÖÚßÜÐÌÊÉÈÑÍÅĹ¼À·¶´°µ°©¢ •kR@5!'*2387*%"*&)/+*/9HW[XMK@40.45IZi}Š“ ­¶ÄËÑÙààÔÆ»­ŸŽ†ƒ~~…ƒŒŽ—››¢´¸»º´´¶¹¼¸¶²²¯·ÃÔÙäîõòôöûÿýõñìäßØÏÆÊÐÉÍ̾»µ·µ§›ˆybE+  (4;CPMOD710)#(/2/.*%  $3CTdtsrvxŽ™°Í×ÛÞÙÏÆ°˜‹y]YZRYitˆž±¼Ã¿²­¢““œ•£ ¡¤¬±ÃÆÄÎÐÓÔØ×ÛÞ×ÎË¿µ«—Œ„Œœª´ÀÅÀø³¬~hK# &4AU\]UQG@97@GOKJ>=630**1?Th”–—¥°±¶ÁÆÑÒÏÎÆº­ ’„xvuss|ˆ–¤°·ÀÆÏÅÊÈÍÑÙÕÏÍÀÃÃÖáåìéòñûûÿÿÿýóæ×ij¢™—œ§½ÉÒÍÊÁ·¬˜ŠzpV2-Pdlc^\ZSOLMIC1!#*08EO\lutttqy„³ÀÌÖÝÛϾ¦ŒnVFJT\jyŒ¡³º½½¯¬£ž¡§¬¬°³µÄÉÙÛØÖÓÌÏÕÛßßáØÇ¶ ‰{_SPR^t–¸ÉÔÓÆ¹ªž}m]F5(6FRV^cfid^TP@;72.2:@DFJKVdu‰‘—“’–˜ «¯³»ÁÄÈÄÁ»°¤•ˆ}x}†–ž¡ª³º¿ÆÉÏÍÎÔØäçîçëêîëììðëæìóúÿÿøçй¦’€xnho}¢²¾Ë¿¯¢˜ˆtg]PI;0 /:H^kqvxk_P;+ %.8=CDCHLNad_jqq|‰’Ÿ­¶ÆËÍÌÆ²ž{oosm|€‡—¢¬¹µ¯¨¢¡ª°¿ÌÛæéçâãÞßÛÖÒÖÚÓα–‰jNBCCHXcxŒ¬¸¿¼´¥”…rqone\SF9(%#4BQ\ZWTTPHGFFHGINVY\X^\bmnw‚Š˜ ©²º¾½»º²­¬¨¡ŸŸ¢£ ¥­®´¶¹½ÁÃÇÅÍÕâíò÷ÿÿÿÿÿÿùþÿøöòïêßÑŶªœ†p_ZVYgq„’ ¢¥œ™—’†|~}pd[PG8&  ,>IPXWWTK;9:6:=9:<=;62+.4=CAFEBABEGHJE=:EJV\`h_[TTT[^crƒ…œ¢³µ»··²«­±´»¾º¾¹»µ­ª©µÁÍÕæèêìçÞÊ·ž›› ¡©­±´¬§™…‚†•–•ŒŠ†…ˆŠ”žž ¥££¦£™„yoe_VOIE<4*&*%(.06?FOZht|†’—•›“’’–”œž™•“—Ÿª·ÄÎÏÎÉÆÄÇÇÄÁÆÑßíçãáâàââåÞÝÜÔÑÌÌÊÌÌÎÐÌļ¼»²¬­«³¯ª­­ª¦£¢£¡•†Š„†€{~xwurmc\PLIJI=-" # ")19>KZs€ŠŽŒ†yne[emz…ž«³½Áµ®¨­µÂÆÌÉÆ½´º¹¿ÉÍÑÒÎÊžµ¦¤œ˜—™™’•’™š¯°´¼µµ°°¦ž˜ˆˆ‹™¢¥«¨¤ž™Œ‹‡~}tmfcaZPF6'#,361-*&# %.@J^gox”¦¶¼¼¹²ª ˜—˜››ª°´ÁËÒÖÍÅ¿ÃÉÐÔ×ÜãíéâßÛÕÐÉÆÅÆÃ¿¹¹½ÀÅÃÁ¾¹®˜‰‡Ž¢²ËÐÏÍÒÏÇDzª¡Ÿ—’–——“…|sqqgppmff^]QH=2% "07BRv›¤£Ÿ•Œxrmjs}Œ¤¶¼½Á¸®®°°¸¼ÂËÓÒÕÒÐÇ·³¬¥¦ª´¶¶¶³­¢‘ƒ€„œ·ÀÒÖÓÆº¯ ›š•˜¡¦²¹·¶µ¥‘ypoz}†‰‘‰€xk\RC0#!! &2675+*)$ 0DYp… ¯¯³±²°°«ªª¨«±»ÇÌÍÊÅÆÂÀÀËÈÒÙßæòîêêäÒ¶®¢›Ÿ¡¤ª³¹¼¾¾¾º±¥Ž†›¬»ÍÔÝÝÛǸ­¡›œ ²µµ´«Ÿ–f[QQadlrnh`VNG?4& )3H\r‚‘˜š‘ˆ€~~‰•¥§´¶·º¾·°¯´¸º¼¾ÐáÙÕÉÀ´¨œ‘Œ’›œŸ¢¡—•“Š|xsv£»ÄÌÍǾ³ª¥—•›¢ª±¿¼À¹¬™Š‚ƒ†ƒŽ’Š‚voh]YO>43&'+&,1416./(&+3>;629BHQV`pw„„„Š’¨­²¸¼¾ÀÌÊÐÐ÷´§ œ™š¡°´²¯«¢™ˆ„‚|wuokkjot{†™’‘ŠŠ…Š•¡§®ºµ´¥¦’‚~~ˆ‘£®¾ÆËȽ¶¨ª–†|ndZVPSUQKOLNLHMT[ZZQQCF?I?>CEKTY_k{‡’¦¸ÀÏÞæèíêããæÝìòìäÛﳨ˜”˜›¦©±º±¥ž™––“Іxwrz‚—‘‰ˆurs‚—©¯®ª¨¥››’‰|uwz~ƒŒŒˆtoovyyqmfZSC;/&!%,2:>=>520/+).6;EMRUSR]`tˆ›¤ª©°¹½¾Á½ºµ²ÀÄÅĽ·©ž–‘––“œ£¥ž—””’–’Žˆ~rmnt|„‹Ž‘†uvmwyˆ‘˜¢¤ •ŒŽ•¢­·ÀÊÆÅÁ±¬£‘ƒskf^ZY[VVRY]dmz|xxoaUD53-'/08N\oƒ¯ÇÝæéçæÜÛÕÍÓÚÔÔÝ×Ⱦµ¨ —‹‚€‡”¦¨«®­§¦¤£¥¦¡œ’މ‡Ž‰€upbZNHLZl|ŒŒ…ˆ€„ˆ‡Š~wfa_YZXYWYUZ``imic]]]VONPLGB=3-$'&+++,13@FNYgy†˜¦¬«©¦¡ ©¨²¸»ÆÊÀ¶±¡Œ‚yorz~š£ª¬¦£œ™˜›–•–”’‰…ytl\QE@@@M`o}Œ˜Ÿ«°³¬¨ª±¯¼À¼·±ª£˜Ž|rgkloz‚†”¦«««¦ €xrh_UMOJD;6-:58>BOZiq}ˆ™¬·Æ×ÞÞáÝÎËÊÉÄÇÅÆ¾¶ªŸ”ŒŽ— ¬µ¾ÂÂÁ¼µ«¦ž˜’‹ŒŒ„ƒ„xqhXQJHMQcis‰“š–˜”‹‰Š‰~|wmk_^VZ_bffkkkiopppkjie_^]XPG?76::?>><83324:<>EKZgpy†‘™›¡¤¯´¶³¶³ª¥˜Ž„zyt}„“£¦­²º½¶²§¡•Š|pgghjonrrmgg_^ZZamªµ½º¶µ²²¬¨©¢Ÿš˜Ž“’‰€€yvqz}Ž›§°±³®§‰€oaREIOT[dgrmif\ZTJLW`m„›¬ÁÖÛßÜÔÌø´¯³µº´¯§ Ÿœ˜–•›£««±·¼¿º­š”†}|y~{uumdSD?DGEH?658:AFINMRNQU[cistzŠ–˜“Žˆ†“˜š™–…wncYRJEEFHIKKG?9769>BDLOQ[Zakqz}†Œ˜ ¥¥«ª¬´ÃÆÍÓÚÕÖÖÙÖÕÎÑÐÌÆÂµ¤–„}xwtuuhZL?4,%!"*143:CGXfpyz‚€€~|ˆ‹Œ›£«²¶²«§ ¥Ÿ™¤«±®©«§¢—‡znd_XYUZZ[XWYSPKH81/+)% &9EYdnoz~„˜¢¨®²»À¾¿¸¸¸°®µ¹½½¹°µ§ –ŽnfQD95-)# *2:<=HUags|‰—›¤¥¤›’Œ‰“™œžœœž˜–—˜š–‹siWJ60&%!%*34*)--39@877?CGGB;2) "$.6FPfu|…‘Ÿ´ÆÒÙæîõðëàÒÇÁº±º´®®ª˜‘‹……lUH:)  &5GUZdnx„‘•™¡ŸŸ ¡£Ÿ£§ª®´¸ÂÄÂü´³«Ÿ“jYPC8,&#$+/.6?C@E><30*)2=FYfs{…’Ÿ±ÅØëûÿÿÿÿÿÿÿÿýöêæÜÔȾ±© ™Ž}rjdbYUF9&  '=Si‘£§¬³±²³¶³¶·³©¢¥­·¿ÊÓÙãäâÞÚÒɾ§’}jYPKD??5/5:@KTZYOK<0   "5>J[n†—«½ÜêóÿÿÿÿþéÞÑ¿¶¸¸·°£œ”ˆ„wiZI5++09=ELU_cjvŒš©¬²´®·µ·½¾ÆÑÔÒÊÅÀ¼²¦˜ƒoaUKA5* "*2<=CD=8.&"&$$/=J_hnv€Ž£·Èßõÿÿÿÿÿÿÿÿÿÿÿ÷íåÜÔŽ³²¡Ž‚riZMDB;/0%  1@LYes|ˆŽ™Ÿ ¦­®¶ÀÁ½ÅÀÃÎÔÞàÞÖÙÙØÕÍǰ›€seYJ@6,/*)08;AHDCB9)$ &8FXavŠ•¢²¾ÍÝï÷ñîêâÜÚÏÇÁº¸¶²­¬¦•Š€n^SF0(    %-69BELU]fmŽ˜§²ÀÑÖÔÕÞâÝÔÌÉÈÇÃÀ¾¶£”wiXJC?2,%%$+++435:>535787453;JM^dkuƒ–¡°¹ÌàöÿÿÿÿÿÿÿÿÿõéÞ×ÐÅ¿²­¥ž…uaPD94,((%%$*-.'("!#&.GPUYbn~¢±ÃÕèïååáÚÒº´«¨¨š‰{tj]RJILUSOQMJHB<<678644:>@BA>BCHK\cq|Žœ¬½Îßåèìô÷öòôðíêèâÜÍÅ´¤–Œ„~zwoh`WNFF@?BBGD@1'!"*3>GSbhknx„“ ¸ÆÐáêïîíêåÛÓĸª¥¤—‰zplh_`bcikpmh`XSED1)  '96FT`p”¤µÅÃÁ¾¿Ä¾»º·³®¬¬¨¡wfWPOWV^ghiliVXLGC<822  0>M\_kp£®½ÄÍÒÔØÚÞÜ×Ö˸ª ™‚gMI=:?CHR`ar€“Œƒsk`SF:,&&!#$$&/8@KYfn{”¦ºÍãêêìëëêêÜÏ»´­ }jaZ`kv~ƒ„ˆ‰~slaYKC>6, "3ASdov–ªÆÖÞãÞßßÞßåäÞÕȺ²¢‰w_SE?BQ^fkqw‚’›ž¡™‹tdJ9' .8GPdwޤ½ÈÎÎÏÍÊÊÆÄ¶¡‘†{us`RE=:0/6LQdvz„‰ŠŽƒvlWC-  ";Sjsœ°ÃÕÚÒÌÆÄÂÃÅÎÎÈ»´¤ŽtV8% ,=M[k…ž­µ»½¹´ŸˆtT=#';Pbu“¹Òéòùö÷ùúøõñíè×À¬ž}maOG=66$ 2OhwŽ©ÄÖåêéñ÷ïïåѶ™wX8$Lv•«½¾¸´ªšŠrd_UKB;<+$ &;Wp‰Ÿ¯¹ÄÕÝòÿÿÿÿÿüíÓ·”tW5 "Ei¦¹¸¶­¥˜‰|rhb\WPTQC42%6Ul‰¡¯ÆßøþÿÿÿÿÿÿÿÿïØ¹˜yVD.# +Hh|Ÿ¯­§œŠ{nnjb]UZYRI>?IFRb}’µÂËÚàæñþÿÿÿÿÿúìÔµšcE, :Wn¡œ”ŒƒweYRJ>5*))(""4Je€‘ž¯»ÂÊÔÞçæñëѾ¥‡b> )BUi’˜›’…zjfaXRLIGRRJGHFJRYg•¤¯¾ÈÌØèôûüýúôÜÆ©‹rXA'%4Jfz‘žš•Š{tlc]WQXc_a^[Yehs…š¹ÇÔÞèéñûÿÿÿþõåÔÀ¥•wWD8+%&!2>Oaqt€Œˆ}rooqptyvsw€~ƒˆ…‹Ž¡®ºÇÙäååèèìïôõõäγœ„iM27Pfs€|rd^TJ=7//7599?KHMVgz• ¦®³º¾ÂÄËÐÇǵ¬•…nU9&  $5FP`ffepw}|{tuvpkedeu…ŒŽ””™œ¦²ÂÒÜÛÜßæçíñæØÇ± ‡oWC5)$  #4I^vˆ‹ƒ€}wsmb[bjprxzz|Œ’Ÿ«»ÀÉÊÌÓàÜÜÜÜÒÈÁ³§¢|iT<1-$ #-1EWex‹‘Œ†„‚‰”¡­µµ¶°±«¯¬´»ÏßäáÚØÛáéßÙϾ³¢–{gJ0' (9OYk~vqjaUNOEJM\]]]Zmy}~Œ–ž¥¤¬ª¬¬¬°®¬©Ÿ–‡{gV@1" />IWbknvx{z{|Œ“œ¨®®¬«ª¤¦££ª¸ÆÐÕØÕÒØÚÕÚ̼°›‰}sZL4#  5DZppyz„“£¨®³µ¸¸½ÀÁ¾¾ÃÁ¼·º½ÂÇÊÏÍÍÍÒÊÁ»¯¥˜Ž{nWB2# !/7:@KXijjkqttuod^ecgq‚Е𢍝œ›—“”˜Š}zrjdaUPJ=3& *7CLMROV]l}¡¯µ¶²±°·¶¾ÀÊÉÆÇÇÇÅÇÃÁÃÁÊÍÏÏǵ­¢„ui]XJ;*  ),+/15Ebq…– ¥­¨¦¢››¢˜–¥°¶ÁËÒÕÒɼ«¦¤Ÿ”Ž‹†wqkf]RMH5'+5AERiy‡œ¬¸½¿ÀÅÂÁÃËÐÎÕÔÖÐÒÏÐÔÌÈÀ¾¼¹»®ž‹‹…zxgXNA9' !%6HYnu|Žˆzqifegp|‹”›š—–™‘ŽŒ‘‘Œƒzplf`ZWVTJF=51-&!(&##!/:RdqƒŽ”’”–™¦®¶ÃÐÚäááÒÖÏËǾ¶¹¹¼·²ª™‹{uk`TFE@;.0./16<=872)(")>Qauˆ”˜‘Œ“Œ–™¡¨³ºÁÃÇÇÌȾ·µ­¨§¨ Ÿšˆwkc_`_\ZXNPE>?52,((*-,7AVcqŒ ¡œœ ¨¯¼ÅÃÎÚââÚÖÒÔÕÓÉÅÅÿµ¨—Š{pe^QD4-###&($$.6BNVTPMIDCFOXdnx—˜–‘ŠŽŒ†‡Š“–’“•†~umd`\ZVUPNNIHJNKIGC:7/15;BGQ`nuyyzv}‹—©·ÄÍ×ÞäßãÞÜÖÔÍÌÃÁ¾¾Ä¼®£™†vi_UI<76553.2720147=@BIPRX_fd\\YRY\et‡“Ÿ©²¸¹¹·±¯«¤£¥¨§£ ˜’—–‰~urjeb]]]VNIGB=@FHB?ECMO`jrxˆŒŽ˜¢ª³¼Äû¼µ¼ÃÅ¿¾»·¿½¾¼¾º®¥‘†xk`SI4) !-5?FJONRNOF9<14868@HIQ^mrstyuv|z}„Œ™ žš—–˜Œ„wphe^YVPJHDB??BFDAD=DLSUVTQT`izŠ”Ÿ¨®º·¸²¯ª±µ»¿¼¹¿ÃÄËÐÌÆ¾½¶¨›Š~mWC;3-$!%-;HT`dhnha``]YU\VZ[e`luz€†˜ž£¨©«©¯­¬¬¨ª®¯¬®¬¦¢šŽˆ}xse]ZVOUWURWZYXV^^dhjq{y}ƒ–—™ š‹„}y}ƒŽ¤©³¸¿ÁÃÊÉǽ°¥Ž‰{jWK6*  -5;ENQPLH>851-7;BJKLHFABEIDHKRV[env„‘œ¤¥¦¨©©¦©¨ž™Š‹‡‚‚{phgegcknibhc^YQJHPR\hn~Žšž™”““•‹‰‘š®»ÀÆÑÐÑÏÐÊż¹ª ’…xn_OC94337>DOW`ikgc_[ZZSVTVW[cgeee`_cehjtwŒ‘––šŸ¥££¥¨©°ª«¤¥£ ¥˜”Œƒ}wrjeghigd^__YZchnv‰‘˜˜Ž…soiffo|†–¯·»ÈÊÏÑÐÆ¹­ŸŠwsf\WRLD:9;899?DINORPHJE>=9=DJMUWWTUQMFA@<;?DNW_fmt€†–™š››˜˜•›š¢¢ žœ›˜”•ŽŠ‡„ztul`SIEB:;6:=LXcw}€…ˆ‰‡‚vxpq{„”¤°»ÃÃÈÈÅÀÁ»´ª¥—Šzvka^YPOPQX]clpqpqolnhfd`bdhdfglmgjkijjoqtyˆ†Ž”šœœš›™œŸœ¡«º½ÉÊÃÁ¼³¨¦¡£–’‰rj^[`[a_]]clnwy~}xzskd^`iv€‘¨³¹½¾·­ •‹‰xtme__^b`]]ZXWVWUUSRQOJDD=8;>AHOQSUUPNMOPNKJHDHMRY`iqŠŠ‰‡‰•˜¢®µ¼¾¿½»»¹¸¶µ´«¡”ƒocYOKEGDDFMT\eht{~ƒ~xwxv|ˆ”œ«°´µ¶³±©¥¢ œ™‡‚}yxqopjkimvwy~~|ytrle^XXVRVX\Z[X\`hhnpqnroijqz…‡…~}{~…ž¯¿ÈÒÔÓÍǾ»³¬­«¢›“‰}sqrxoidbdheeg`cbgikmot{„–¡¨©ª¬¨¡’ˆ‚wjb\XTX\eglqnruyxsrokhd^XQKHHIHJJJJLLMMJHLRVYZ[YY\_`cfhju|~{yxwx|ˆ’¦¯ÁÄÅÊËÈÁÅÀº¯ª˜Œ€wnhda\ZWQPQT[aekuy}}€‰‰•™¡£¤¤¢§¦£¡ Ÿ—’Œstfeiov|~€~‚†‹‹‚€ylk\XROQPMMLOVfmz…ˆxqrnsuw}|{‚„’ž©²¸ÃÇÈÅľ»³©¥š”‰…„ƒƒ€}zvpkfZMJGLNYemy‡–˜š™—–’Œ‹‡‚{unaRIB91683,*(%$',.014:;DGKNW]houtwwz|||rhfa^cfklomqqrtxtstvrnjbXRME<51*(.4>IV^`nx€™¡¥­´½¾ÂÄÈÌÏÎÎÄÃÀ¾º´¯ª¤¡™™•’”‘Œ†|sk`ZWPLFCD@@ABAAGMUZ^dfnnplppnqpohejjhhfgktuuvxwuvssw€ƒˆ†‰Œ‹ŠŒ‡wlc\NCA==?EKU`]kptx†Ž’–šž¦­²´¸¼¼ÀÁÉÉÂÁ¾´®¬ª©¨¦ š“‰‚ypid[YSOJC:51-,) $)-.3648;:;:>>BELQW[chmr|€‚~{xwuxy||‚ƒ€~|||{{vna[TMF@<:89?DJZairu|‚‹•›¢©®´··»ÁÅÅ¿À¿Á¾ÈÑÒÌÆ¾º´°¬¬§¢ž™Š‚yng_WNJF@?;<=?>966=GM\_aafaacb__]ZQSWUVUV`fjrzqnpqssu|€‚†Œ‹‡ƒƒ„{lc\XPNKEELQW_fpwtqvuz{}€‚Š”œ«¯·º¸¹·µ¾½ÂÌÐÈÈź·³²§¤ •Š~qmfc]ZROKG>;7.)$(*39=::92.)"")4:HU\`ntw|wrjhglprvyx~}~{xuqh]RG@8554=@HIPTZ`eoqx}Š“–—šž¦®·¿¼¿½¶²´·¸¾ÁÅÌÔÖÙÜÚÔÏǼ®¡‘†{tkcYUQNNKIHJKFFADKX[fjifb]\XPFA9966CB?O[ijpqrji`]akt}‚…ŒŽŽ†{peZULKNLLP[_egorvwvrnhghosw~ˆŽ˜ ¥¨©¤ªª©§«ª®°±´»ÀÈÄþ¹­ “…xjcaZVTTRONGA762)!!*3AAAEC=62"(A\prwwtkg^UTV\ep}ƒ‰‘‡~tj]NB964657>;84.&"3EXgpnjcVKCABGNWcpry~ƒzp`RA4*$%)0?O`juw|ˆ†•Ž’‹’“–› ¢¨®°¦¨¦¥¡©®®¬ª©©¨«¯¶¿ÅÈÈ¿³¦ž‘‚xnf]VUTQQV\_a_^VW[_\bffc_[XWUOA90,,6EZhfb[WPLJLQW\_dltwˆ‚teRB:754:8566;<<=AEJNRTSVX[]dhiqmt|xx}|}‚„Š’—𡥦¬°­¦¦¢Ÿ‘€wk\TMFCBBDGMSRVVSLKHB:.% %5EU^mxz~€…‡~~~|vurpsuuppmmpok_Z[[URPJGHFHLRYahnlljnmux~€‚ƒ…Š‘•™Ÿ§®³º¼ÁÆËÍÎÌȾµ­¤—‰pi]\YTSUW]cgefc`YUJ=5.# !,9HSanƒŠŠŠ‰‰ˆƒ€}xwvvvsnlkjkkle^SK@>3-!#"#&03=GLRX[ZZ]_ckmhekighiip|˜¦«²¸Á¾¸²¥—‡€j]SJB;849;AFKLNKGDC?;62+'" )7;<:723+##)2=CHNZ[aly~Š‘’’‘Š…ƒ~}|tid[RKE>650+(#!'18@HMTX\bmu~€„‚€zxvz~„ަ°ºÅÇÅÂÀ¼¶°¨šƒzm_RF@:3368552,&(&&%$&),/--.+&&%$&.5>HTZ^```emt{…‹“œ˜–‰„ƒƒ}ypfXN=5))((---.,0../024:BDQWahoy†š¢ª©¦£¤¦¨ª°¹ÂÌØÛÛÚÙÖÒÎÊÆ½µ®§šse[VOJHB=;;;7476137;<;<9;>CFPZ`efdbbflsx…Š“š  œ“ކ€ysk^N>,  #),4:@GLT[`kow€ƒ‹’”—šŸ£©²¶····µµ´µ°©¡˜†yngXGB;3+&!&+0126AHPMPQZait‚ƒ††ƒ€‚ƒƒ‹’›£¦¨©¡›–‘‹‡{kaTF;-!  (.59657:?DMT[ahpy„™¡±¾ÇÌÎÍÎÓÓÐÐÍÉÈÄÀ¿»¶²¯ª¢‘ˆ}q\PG8)! #'.38?FINSU^[]bflvxyuywyy{z{ˆ‹”ž ¥«¥œ–ŒrfYNIU^cprv‚ˆŒ•™œ™ž£¥¨¤¢žœ›™œŸ˜–Œ‚€sbR>3)",:CEMST]isŠ”ž­³»ÃÒÙãîïíêâÛÐÈÀº³«¤š~tbUJ;.#!(08ES_mu„Œ“™ž£­µ·¹¿¿ÀÄÅÁ¼¸´°­«¥œ“†zvoh\OD6/" /,#*9CO^gs{‚•œŸ©´½ÅÏÚääëññìêéæßÐô¤‘ƒtgYOG=.$ #.9>J]n|‰“¤¬±µ¶¾ÃÈÎÒÐÖÖÔÑËü±§š‡{rh\NE:3-& 0ARbo|‰’žª¯´·½¾ÂÊÒÚâëîñõúüûú÷ñæÜÕĶ©ž‘‰ycWL@7/&! &0AJ]k~Š“¢ªµ¼ÃÉÍÌÓÐÓÓÖÖÓÐÍȽµª›‹~p\Q=* *7N^nx†“¢¯¶½ÄËÐ×ÜÞãåçìîðêáÜÕʼ°¥”scWE<1)  %3=KXgv‡“Ÿª¶ÂÊÎÕÙÝÞãèìëíéäÜÙÏŶ¨˜„veZN?4&  '5ASdwŠ•Ÿ§¦ª¶¼ÆÉÒ××ÛâåéêëêìéèâáÖÎû®¡“…o[JB61-*$!  $,5>JWaqƒ­³¿ÇÏÓÖÙÛâáÚÙÕÓÍǺ¶¬¡’ƒqcQ@0%&7DVfs|Œš¢¯·ÈÑÛäèéêæâáÞØØÓÌÆ¾´«¥•Š}r`TB<-(" ,JScs|Œ“¡ª´¼ÃÌÒÙßãæéçßÔÍÄ»²°«§ž”„rbO=+ ,8/)!-8O]ny‹•Ÿ¬¶¿ÇËÐ×ÞâæììðìæâÒȾµª •ˆogVI<5'  #1=PYhq€„•§­µ½ÅÉÍÒÓÜÙÝÜÚÙØÕÓÏÌÇ¿¶ªŸ•‹}pi`YTPLF@::7651-(&&&&$$-45@KUbr{…Ž—ž§«²ºÂÈÒÛâäåããÜ×Ðʾ´ª¡›‰vndZLE=4,"  !$$((/2:CIOX^dry†’žª´¿ÃÆÊÒÑÐËÌÍÏÉÌËÊÈŹ°¤™Ž†}rnf_YTQMLLLNNLJJKHLIHQS_hr{ƒˆ”™¡§®¶ÀÈÐØÜâÞÝØÕɼ¯©£™‘…{ocZI<4($)-0;BNZcr}‰‘™¡  ¤ª­´¸º»¶¶´²­¬«© ™‡xqgcWSKD@<874579978@CIQU]kw‹’—›¡£§³¶ÀÈÏÓÙÛØÖÕÑÌû²°¨¡š—Ž‚wle[RIA93-   #(2679?GNTY\^cks{‚Œ”›¡ª­±´·¼ÀÁ¿½¾¿½¼·¸±°¬ªž•ˆƒ|usqkd`_]ZZ\_bfkjihhjnrux}€‹•™–¡§¬±¸½ÂÄÈÊËÊǾ¸¯¨¢˜Šui^XH<3& #(/4:@FQV^dlqtx}€…ˆ‹Ž””¡¡¢£  œ™•ŒŽŒˆ}ukbYVPJCA?@?CFKV]cimov|‚‚††ŒŒ’”𛣧®°¹¼ÁÃÇÄÄÄ¿¾º³®ª¤›”ƒxnhZOIGA;3.(! $*.4;?HMTXa`^cllqxƒ†‹’•™¡¥«¬­±±±´··µ°±¯©¦¥¢ ˜–‘Š}zunhgc_^`adhnpu{ƒ„††…‡…‹‰Š‘•”””–’’šŸ¥ª¬°¹»¾ÀÂÃÁ¸´® •ŒreYL=3)%.468@BLQZ^`adegfgknpsw{{}ˆ“š¡¡š•‘‹‡‚}xroha_\[XVTWZdhnv{ƒ…Š‘’”—˜ž¦¬±°°®®¬¬­¯±µ²°¯¯­°±¶´±¬­© ˜~rh^OHB>5/+)" $%'.7>FMT\ejqpu{{xx}‚‚„„†ˆ““””™Ÿ¥«ªª¢™”‘ŒŽŽŽˆƒ‚ƒ€~~}xwvz{|‚ˆŒ‘’™ž Ÿ£ž  š•˜—”‘––œ ¤¦©«­±¶¸¹ºº²¯§~wjUNC9/&! #09?DKJNU[`chlossqqoppokhllqw„Œ“˜™œ–—”“‹…€ywrjhgf__fgjry‚…ˆ‰Ž–ž¥ª¯³³´·¶¶¹¶¶±¯®­­«ª¨¦§§£¤§«¦¤žž›’Š}n[M@4(  $,6AOZerz„ŠŒ•—š™œ™œ›˜”‘‘‹Ž”› ¡ š˜™šœžžŸœ™˜—ˆˆ‡†‚€|{z„Ž“–𢦩®²µ¼³°®««¦£¡¡ŸžžžžŸ  ¢¤©¦¥£™–‚ufYJ8. %174*#&-3>IT]clu~†Œ“nˆ‰ŠŠ‹Š‘˜—›Ÿ¢£¤¦¥¬²º¼½ÀÃÆÈÉÉÇÆÀ¸®¥˜„|vnhfd_[[Y\_fkqvzƒ‹‘—Ÿ¥¬®±·¸·¹¹¾»º»½½¼½ººº¼»´°¯ª¤¢•Œxj]RKA60*"  %%+.03;>GITZdhsz…Œ“›¢¦¯µ»¿ÂÉÈÄ¿´­£—„{tqlhdb]VUYW^grv{ƒŒ•œ¤¬´¾ÆÊÍÎÏÐÒÐÌÉÉÄÂÀ½¸µ·¶µ¶¶·´±¯¬¨¢˜Ž‡~sibYOFA71/(%$%%),3:978@FP[dixˆ“œª±ºÂÇÎÔ×ÜÝÝÜת»¹´±«­¦¦¤¦ª¬¬¯£¡™•”‘‹ˆ€{spje\TIF:3)!  !+3=HT_it‹“›¦©­²¶¹¼½ÂŪ±²¯®«§¥£ –—‘ŽŠ…„‚†ˆŒ”˜›žŸ œš–“‘‘ދІ„€}woga^[YXY^dipw‡ŒŽ”•™¡¡¦¦ª®®¬«§¡›•Š‚yshe`\ZYXUTTTX_fpssy|€„Š“”šŸ ¤¤§¬¯¯°±³´´µ·¹·µ´±±®®°ª¥ ž•“ŽŠ‹‰ŠŠŒŒŠŠˆ„‚‚}}|yxL\WRMH@<77788?DNTZfuŒ–Ÿ¨¯¸¾ÀÁ¾¾·³«ž‚yl]M?/   '/8>IRZ`irz‚•ž¤ª®°¸º¾ÀÂÅÇÇÌÎÎÓÓÖÙ×ÚÓÒÒËżµ«¥¡š‘ˆxrkhb[WNJD@=83-'$(0>HTbq}ˆ•¤«°¶½ÅÈÊÏÍ·µ²®«§žšivrjb[WUZ\^`cfkmrwz†ŠŽ—¤©±¶º½ÃÆÅÄÃÀ¼¹µ±°®°´³¸º»ÂÀÄŽ·´¬«ª¨§¦¥¤¤£¥¦¥¢¡Ÿš™”ˆ‚{vplgdc`^\ZYWW^\_abijlru|‡ˆ‰ˆ‰‰‡…wGTPHD<6/*%"&,3.0$h•½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàœs>.!(&`€¢ÀàòÿÿÿÿÿÿÿÿÿÿÿÞ´¥iZ1#-6QYezˆ§ª¾©­’‡uPQ`Q|’—ÇÞö÷þÿÿÿÿýëèÌ©}p'(3KTeo~ycKK=2B6SYf’¬Èâéÿÿÿÿÿÿÿÿÿíèá‚_Q+*""14DXfo‡ª¥´²ª£‘‘xo[]maˆœ·ÅÓìëõÿþÿÿè×Àªa3 *3LVklqqkW\RL<@FTk¦·Îàìÿÿÿÿÿÿÿüéα¥šriG9&)#06GFcfƒˆ™¦©¬¯¨˜”…{ws„…™¡¶¼ÒáãõüòðáÓ¯¢xjL, -8Rc]kdnc[Yi\eW‚u€Ÿ¡³ÆàìöÿÿÿÿÿíÓÍ››ƒqfLB;679DN_ju‹™¤¦¬¬²ž¡’‹‹‰ƒ”’ž¨·½ÑÛÕàÞÞÎÉ¡œ‡dU4 07B]Vh`vbp`vw}r}Œ€¦«¼ÉÙäâñúîêå×À»³”€vdYLGDCLR\hw}žœ¤¤ž¶¥¢””™˜ššŸ£©±¶ÆËÇÉÓ»·¯ˆrZB) 8DMWO]\lfkk†ˆŒšŠ©©¨¸ÅÐÓØæâáÏÖȳ²¡Žˆ}yta]TVS]]duz“‹–•š£§ª¨™¨¡©¥©š¤¬­¶­¿À¼½·®ŸpVF@#  ;8@DGQ[dssv€‡‘”Ÿ¥š­±¥¸¹ÇÆÆËÎɷ³£¢š†ƒzpik]`gflt‚‡Š‘Ž–›¨ª¯§Ÿ¥°¦«°ª¢¢§¤©§©®§ ž”ƒxjdJB;"  $-3:?;HJZfgyzŽˆ˜£¢£££¦§ª­¬¶¹´¹º²ª¬¬›ž™‰ˆ†vuslvrt‚€ˆ„‰”•¡¨­µ¨¦¬´¬¯¸°£¦¤šŸ“™ŸŒˆ€wma[Z@=.21!,-#)*+-53<57DENdhu‚‚‘”–£«¨®¨¬¦¡¤£¡¬¦¬£¡¤›œ¤–𙋑…ˆ…†}„ˆ‚ˆˆ€Œ”¡¥ªµž±¯¬½µ«¾­›¦˜–‰|qtfaWKNCB?8;7*56578:=5;85;EHUei‹ˆ‡—™ž­®°·±¥¥ žžœ—ž’—•—œ“š–“——––•‡‹†}…ˆˆ™Ÿš®°£³³°½·¯¶¯˜œ•„k^WPKIBEFABC=@=6<@OLRVTR[ZZXU_]KJOJIMcamy€™™ ž«®°¥¬¨¡™–Š„pldmlsy‰’—¡©©««©°·±¤ª¨’’ŠŽ’‘˜Ÿ¢ª°¤ª¦£š˜—~q_SF<<,4?CETOT^^ku}Ž”‚|pbdKGNV]zƒ‡Ž—”™›¥©©£©œ}nnVGFDGVclrwŽ—’¥ºµÉØàèßË¿º¢•‹“¢Ÿ©²¯°¯¯¦§ §¢Ÿ›¡ŒyqL@2#$'6*4DKNOhxt‘”€{}jV`WLWbm}‘™œ“œž¦Ÿž¥š–kaQPHBYekjr€—™›©ÂÁÍäÛÐÔþ©ž­š“•¤¬¥ª¬§¬©ž ž™žŒ„rgG6,#.#,3479LRRYpˆ}Ž€uw`_fZY\prv€Ž•””“’šœ•›˜t[YYRKSdmiy€œ¡¤±ÁÔÈÇÐÓÅ»µ­¬¨¥ ¡®«œ¨Ÿ¨¨¡—š‘•˜’~|iE:<0,!5023;9EHV[qtxsu{svhncinlny{}‹˜–ŽŒ’–•–Œˆwc_\ZYX]jrs‹‚ˆš§¯¶»¸·¿ÄÀ¹¹¹¸¬®³°®«§›ž  —Œ†‡{wtmWCE>367708=BAGZTaehfoltwppsvox€}ƒ~|‚‹‘“ŽˆŽŠ‘ˆ…‡†‡fedf^m~wzŠˆ”œ¨­ž©®´´¼»º·½Á½º¹»²ªœœ•’™”„…|~kshkbQEK=?BKA?Y]bs}¯³¼Çʽ´š—}pZ_RG54HNV^e‡’†~~lƒ‡|}x|v‹”š¡·³º¥–ˆ–¥–’˜šŸ¡«§ª³¯Ÿ}WC2) ";Qr‚Šˆ‰†|nok^P.0+0)Jdc}ª³À×àßÞݾ®¡q\T3**+(=Uh£¯ÐßæØáÝÔж¬£thjkew„œŸ·ÅÎÛêåíêÚÈ»–vdI0%8H[~‡’›——ˆ†lN="%$+Nfv…™¹ÃÏççìÞ׳¥—cG4+OcuŸ°½ÚîîãâãÔÕ¬š}{a[afgq–¢¨¼ÊÓæêô÷õÔ¹­’p63%&IQh‡•³¬¯§¡¨sQ?7">Ri†’¤ÆÒçîñðÝ̬¦~qMB<<4:AHKcs“›µ½Ñĺ¾°¬ª¨••Š‹‚†„•˜Ÿ¬¯»»ÁÉÅÊ¿½¶±¢ufLC.&%.8@TY^gfqzvurh_\YTU[_j|ƒ—¢«º¾ÂÁÁ¿½µ¤™ŠtjXOF>;=ISafl„Š™¨ª¯µ¹»½»©¢—‘“ˆŠ‰‘™¥¬´»½ÄÈÇÂÁ¹¯­˜}qSF<%"&4C25?@T_f{„”›™ ¢žŸ˜›”†„…‰Œ˜‘“œž¢¨¢œ˜˜Œp^YD08-*$'+.2I\b‰ŽŒ’Ž‘–“‘’ŒŠ‚…ˆ‰Ž—£¢¯¶»À±µº«­¬’‡{gYSPAAGEHGJ^ev€Š“Ž’žš›™™™’˜‰ˆŠ‹”œ—ŸœžŸ–”Œ‚ubZX@542/3278@W_i‡Ž‡†ŠŒŒ”‘†Œ‡‘•—¢©®²´µ´­¯±¡  ‚zpg]VYRPNMRRYdkzƒ†‰‹’”—–•—–•š™“‘Ž”šš•™ž˜—–”Š|oj]SE@;786:=;:;DEFHO_ltty}{€‡‡‰Œ“™™“˜ ž¤®±±«±«¡–––‹xrtshh__]Yabdbfjsqsu~{†‹ŠŒ““›š™—”–—›˜š—”—™Ž…†‡xfg^\UQCJCD@HLPMT_[_koxzy~„‚‰’šžœ˜Ÿ¥¨©µ¶º¨¦ —–’‘…unsskliifagjllqnjjktvw‰‡‡ŒŽ”›  Ÿ™š˜œ˜ž›Ÿ’‘†ƒ}mcdX\YTGLMJHPUTTYXV]lmpvy}‚ƒŠ–œž¤§¨ª­¬²´¸³£Ÿ˜ŽŽŠzwtnqmqtnjlmpppnrljfiott~†‡‰Œ–˜Ÿ¤¤¡ŸŸŸ››£ œ”‰omabaZTUVMOOQWVYSTXYT[hgoquz‡ˆ‡’¢¨ª¨¦¯´±²¸¸± ŽˆŽ‰€nqvnomv}rmtvwsnnnpfeaoxuy}‘• ¨¦ž ¡›™ž˜•x|zeb[^a]UW]VUTZad_USZ]YWbjnppp€ŒŒ’ §±®ª­³·¶²§¦›Ž‹„…{mourtqyx{y{{xyqjklnjgjs{zz‰Ž––£¥ª£ ¡Ÿ¡šš•Ž‚vul`aZZ^yphh^[W[XWQNKKPOPZ`flmnt‚„‘›œ¢£¦¨ªÆÅÁ°¬ –•‡ˆŒ…ƒƒ€|}{tsrrocd][YSURTR[ij‹‘“˜›¢¥¨©§¨¦¦ —Š‹‚xxqnngcbbYPPKGFIMKILIJNXWdrt~ƒ…Œ”– ¬­·¹»½½¸¶²¤¢–ŒŠ…ƒƒ…{{{vqmngfdggdb^_^cbhoq{„†‹’“šŸ¤©©ª¨¨¦¤Ÿœ’‰ˆttnledbaaTLLGDDIMKHKKKNXYgsuƒˆˆ˜™¤°ºº»»»»²±©•ŠŒƒ‚€yyzwoojdbaefdcb_`bcirt€ˆ‹“–œ ¨©­­­©¨¦¢ ’Šƒsoolddc__RJJEA@GKMIJKIMXYlwx†ŠŠ’˜§©±»½¾½»³²®¥š•‚‚||vyywnmha`_ccddbcbbdjsx€’–›¡¦§®­«ª¢¢¡˜˜…‚snmfa_`^[PIHB?EDLNMMOOQYZn{|Š•–›©¬³»ºÀ¼¹±®¬¢š–•‘…†‚z|twuulmhb[\`cbeeefeflvx‚Ž–—œžŸ£§¨ª­®©¦¥¨ŽŽ„ƒuong]]YXUMFBB>?AHIJLPRU[_mz‰‰œœžª¬±¹º¼ºº±ª¤¡™••‰‡‚}|rsqslegc^]\`_bgckllpx†Ž“– ž¡§¦¦«ª¦«©¦©žŽ}|unleZXWOFGD@A>?AEGJMRS\aqs‰Œ’Ÿ¥®¯´º»¹¸±¯¨§£—˜—ˆˆ{{pnomfcb_[[Z`]cihlort|‰Š“˜›¡¢£¥¨¨¥¨©©©¦¦œ‘…|zrlk_XQQIA@><;:?@FIKQO€¤ºÖÊ«R*@T˜Éß½¡Y26K^ÁñÔ»ƒV.EwªåÔºž5AUk´íúÂ¥J!SjŽç诓p#>j‹ÛÏ´~|Y8Rcs ÐùÒµSH[qÏï» {2XmÆòã§{J1YoŽöá¿c54I\ŒÀèÈ£VNgŒU!OeÁòã«‹f!Qh‡ôâ¾jQ;@Vx޳ò๚k,CrÑóŽnC#=bvÓö竃";ax£îÏ”e2'>Q|ªìˬF)*Qb‹·ðή8?K^o­ã뮇1C`JPc‹³åɯc1EV~£ÛÈ«„!6Yi{Çðã©‚,BezŸðÖ›k(2FX¨ã²Â¨…!CVi®íí®#7Lm€žöà£r09L]‹«ÜÙ¼j,"M`¡ÒÝuX0?h‡¾†UgºÕ–aANZi‰«íÙºg4?P}¯âº‘Q*<_qŒîà¹iJ2FZ‘ÍæŒZFbÕ±‹-"NavÙìÌt6EVeˆªßѱD+?au”ÍРr?8L_¡ÊÀ t'4Gi|ÑêËY;KÀžoVVabl€ÛèÆwT=DUrƒ¡èá½T'BWy¤‘€“YOXr|ŠpWy àßh!:`x¬Ü»—(Th…íܽp04J_²çÜ“\-CW¦ÍܹG.Dy©Í¼›H%0[s›âÄn4/Xk‡ÑÛ®‰O1H_ÁÒ}F4Xj­ÄÈ_;Ob£Ì¿˜c'5GgyÈóÛˆ=%RmÚË«E*ShÉæÈs.+YsØÔ²D'@oœÜ¿£L-[wãΪ<5Lv–›Ÿ³Æ«“s`q|„xV:i’£™ž‰r_Wg“¦œ—¯Á¤’WLSw”°‰ak… mHFcƒß»‹1F„Ë®57NhÝÈc$/`„Ëß#8RšÛߢz'1N­áÊV0fÍÅ—jE[”|fy¡âÁOT€_W‹ÄÑŸU=X„µ~4Lk \]n¶ãØl&/j¦†MB~†ecŠÖ­t1LmΧ$8VÌÊ¡"3j£à‹;<…Ѭi(`”Ûa—ÇIMtÊŒC^ÃÄ—$9O‘Ç®o¤ß¯v6FX~¡ÖѤYz“;9V¹ÇjMTŠ‚^oŸÅ¢w[PHcÙÍ•>Wzݱ0U’59–t¯Õp2/S`–ÃôÓ±3 ?[r{•¼Ñ®61_Yh½¿os†¼¸0«®Wg¶ÂBnVh¡Í†U¬ž=On‡±Õ¨£•[%hž†Ja›Õò P5Œ·i:Gm„³ëº8t±+H~WoÛžQŸŽ??S„¾ï¬k7Mi†„~¬Ô׃;!=›Î¾>0Ϻ.:ak€æ RΣG‡¶E{¤f¨Ü˜Y>CV‚€„¯ÍâÌ®RH_—°Î¿U?Vwqhv’Ä×›>w“yľ2hŒ\„O'D“θ{/Mxšdp—£—ˆ¯ß¿™6t©¯zœ¼šuT4DeÐyM΢jÅ;`Œ¡ÙÉ]–p(5†’žˆn «€7Fb¦­¾Ð¸9'B‡žniíÆ‹uEk¶œ3^†o¬Ô¯–2 (p|k“ÏÖ­n/MVg{ÆôíH?Pc¬ÖÏm_ugQ;Rw¤½š?HÏ¥MJ_¥èÒ^‘¤JƒœV/Ut¬Ó‘q¢¸R!6|°ž€{¦µ«_8J_w§Æç¾xV¡ª=u¶ƒv=4Y­vK–ĸ¢~4CXl‚Ðà̧¡‰7@\ŒÔžY†¥OAlÀ¢\7l±M:¼KÚ¹M–žDwÅ®uSQ¤`-fÛ®h=_”œ˜ž‚ 6]’z—ÊÙoGmAaœ«y³È@;ªÃš3?Y𢴬ŒŸ´‡T,OË<]˜viRe~y¤ÁÖ¬ˆI3jžK+£¶`wÄ‹>Lѹr@wÏšUTŠÅÀŸ;(^€¢·ÖÒ©oF^s€lo|žÁæ­eM…ÂF;gÊ5W|z‘³‡AQm°ÔÐN5x¢¿ŽE%e}fŒÃΦo-v¡¯³8rÇQg·Û^!uÅØQ3_×´'8X¹âͦ»‚<LŠÔm;Žººq_o§¥nbn…–¨\CÖï ]">X¤­”y£Û±h2_¦B$Y|ëÓ©6…“g‚¬¶ƒoŠŠ§³g^¶ªv=c­Êš@cíܰ!<ãߊH$`šÏ=bŽÇ×±,%Bx¯çÈ™1=rÍ©f+J—Öê©f#Hs¶®„A_…²™©³›\Xe­¯\D?q¦Û±q#<^¼²ŽIX–¡˜=Hhèé g1OwéÄiTyÀÔ­!0SÊåÃ]JiáÂQ-Y½Õ«q0Hx¥áЫn/Gr˜ØÈšLF]¼åËv6Mi×É”,>S‡©éЬ/.bšÑ¢V8_–ˆcŠ´¦;Y|ñÙ”V6S‡Û³03l¤ëá!@€Êî ^6TzÄпF-b‰ÎÍ¢b,@lŒÊáµo7RŸãê¦v(+EžåÏ<-K‡Åݵ€6O˜áºz+Jb~²Ò¤Z5o«à¥kHP4Xy»×­ +G„Íõ©f+IhåÓ—/?w®ëÙR-Iáãv'/cˆÃ§jiyÙï—~“O HjêËŸ3M„ÇÕ NF^zëÚT)GÝÐS!Od€êà»A[‘¼ZAYœ·¾ŠDVÀ¶~#?YÆä¿= Z‰ª]UmªÀÝϨ:!1užzfj¡ÂÂqljT\ ‚HXnÎóÑL"?~Ê´w&H`‰Þ¯%9VÄá°)Czºî£V![‰Á†K]ƒ¾Ë˜1W’¹‰VIdkYoÔô×q0Q{À~=G‰ÏÄ”J=[‹È…<[á¶o=aÕ¿|3NjÍØo9f¬|A^ƒá±cOrÇMv°ã£\;W{ÐȯQ'FfŽ“‡‘Ç·I1F›Á´SOŸ¨…Qb}Äå©T&j±Î;/ƒÅº/;VssÃóÞJ:[¾®;DmµXe‘©‰k@O|¿“5O~º\|…l³ÕA?gΚkž¬;FoÅ¡Nc‹™–‘tHf–®ŽskvhW¤ÏÌlGQ[au…¢ñ×A1VšaaÅž8ZŠvco‹ ‰`l€’‘¤“qHKV’އ}tZ?_³Á²nZW@UÇâœ}½™Ew¼o²œx™—:9\‘ ª€j‘ –z€ag†’§´’t“RI^¡Éá—FI{¤W‰ÆqGy^?kŒ¤ÐÁYX|~M?{‚Š´¹ž7U„uw’–ŽˆheYb£ºXLÅz>ÃÚLMeq«âQ˜ o4CbÐê¢iF;;P ÉȦƒiuRCtŽš¬ÆÑn"S‰‡ŠÂ΄D1vŠ•¼¨˜¤X?Hoƒ´¼©ˆŒ89ƒ™štWO£Õ¡c85BOœãžMnµ`"ly±ÛÅFFy±?6IŸ™…t[g†£¿´kNS”©¬}g˜Ëß‚ll=VÊ«T…ÍÔe]JLf†|ž ¡ŽnrŒ‘WHZw¢·€Qo‚bV\vŽ·¶mJCg`SÎïVF˜‰4LÕÏgr‹r]dŽ‚\f‡¨˜cE<­Ã—sl‡˜“Ž„ek£±¥§²>°š_{­ÃqJ[ffе¿MG«É½‚T$K€¿£‰z{}hZ†¬¹iL] ŸwlmX4AÔÙAAެV.•ØLVɾ†;Pyxz º¿€ijWAq¥Ê«xB[ƒ¥Žz}ƒwx‹Ø×¦0š¹–y¡¸U,u©¥3BpÔÊqSOƒŽpPv½§nQBTi’ž—nxš¤xVn…S*FÜÛV#JÔåµ+A§Ã°‹¦ÄT>k£„qˆ`MYœžtšÇ¤l)AeŒŒ«ÄÒ»”Y9¾§[b{ÂÂJ&ª£k‡åÆ“)SÝÔZIXipy‚˜“’“ikusw‚JaÐâx9-o£È„Y‹»ÂO8Q´Ñ—X!J‰Ã‡J?_†º¶ŸroneU8X’ç¿8'JºèÓS+{Ãå|5+‚ÊÊ‘ROqЉqkšÓ·w?;U¬Æ¹iZb•¦gTrήl4XΑ#=ZÎØf&3yµÑsN€²Ïy@7¶½€,;v·v'G{¥}a–À°y47i¿ÇBlòÖ—(LÙèº )RÙÚR;ZÆËž.@¦ÓÇ]9E‘Ÿ’‹„‹Œ~YX„®Ò¢[(e¥¸€2Oy¿šPNn§¿}Ib‡™xc¯Ê®€MDCetx‰£Ã¤p*?c•ˆeip—Ðå&IzаYr¾±Y-„Åßa‰Œk5O}ÍÄ——“@'{Ÿ°­§‹sXQyÒÂ,Dkð×<*QÀ§aZˆ±ˆm±ÛÏG'gŠ‹r·º~ 0V‰…‡ 47iÒ­cCr¯˜`s´³7ZßÔZ„¢aE}Ÿ¡|Œ¨€z‚q+6^ÀÌ—‰‹uZKq¤“vŠ»×|E[vra”Ú¿nQy‚Pi›®wi¥xn{†}‘¢¡zfS\qŸ±´zXFDXˆ”—„mcŸ°^'1̾c?~§’¨”\S¼½<)E›»Æ¯ž}m_BBQžÍÍ—]aŠ¡nNr¤Í©xZ^p¨¨œ¼ªA\ŽcM˜¯›YKoœµb?N–™•z˜±˜o_½ªIYŒÅqzrr–¥›WJ„ŸŸ}|‹¡‰Q_†¿¥zr®˜qSi‹Å»iYkŠcZx«¨˜_E>jŒ‡~«¯:>~•–ƒŒž—rJPZm€‘•›w[t‡46¾ìÌ:GÕèt:?¢Ã»_U§Â­B5S¤«r]^€’Ÿƒlq‚’›‘„~‚‚yolƒ­×ª"T¿·\oÀÙÀ8#’Ѥ\DŸÆ³?;†¤¦}kkšw_X€Ž‚V[|—¶¿“M3ÖðÄ.@Öñp&)¬îï{/R±‰tw¨™cCSpŽ…y¬£‡TUpuq‹¼íÂ| :{åªR6hæî½=»ÕvQV¤½­SIw‘ •~hbfeo{{x}rlmn\DW™ÿÖ—(L‹Ð¤Pd—úãª?NŸ¢}C\ˆÙÐnIBy”’be{r}¥°‘?1?—ÎéFL‹Ä‡JD³Øw2tªÀ…v¥¾¸S/6wŠ’Ÿ±¥yF?fŽvSZ¤«’wshJ@;u·Ýœg’°£A?—¸²€‡¨´y+N†Ã£v`w“ƒp‹«·…jhw‚{‚œyt„§šyCR§¯‡W°ŽTTy‹VI_ÂÙjf‚ˆ††~LLnÍÈœJU‹vB)X–ϬuofI7:µèzSv«tJ•ÆŠbrļ”MR„˜¦±žU]‚ƒ€™¢š}…”}aPu~sÅ¿‹0PuY€ «‘yY@Wju‹›¢‘‚‚‚xor„Œƒ~„„p]q‹‘uvyjdht}£Î†A¥_o£¨ro˜µ ‹uILƒ•–‘‘‹uv…{mqz}„¥£š}meq}‰‘£»£xVm‹’ž{ZX‚|jpv~‡€wmea{„€Ž¦œxXEPcŒ˜Žutv|†„~|uNR}­š¹ŸoHe¹µœyu}ŸŸcOSs†œ¤~Œ—ˆƒŠš’„y}}}޹±“SGO¨†‰ {LB‚ˆMBR¨ÅµSGu…ˆƒƒ…‡„z|pis™‘MKd‚€‰ˆ~sVY—]ËÂh}”|‡«˜|c_b“²¨Štiihot“ª²dh…‹xy‚›¡†j]x„‚‘¢ihww|†tqq„‘oi€’Œzkoy„tjyŠufkqz{zvvˆŽk^y©pH{œzˆ¨¡‹’™…BGi¼È–un‹‹{fr”ž¬šxOh·¾¢VWp¢Ÿyr|™ˆgx¡’cHcw‰š[LS“©›UZ•ŠX^{»°VBJ|‘˜vh„––{{{`Vjy…˜©ÃœK-q­Šs‰È¬KPr–‹…“uyŠ’~kqˆ¤ ‘okyŸ˜v|‘“zjެž{et|„——ycxŠ…^b‡‰|r~‰ˆ€e_j˜•s‡yabsycn©¨‡awˆY?k“¤sp“°{*An²©”™£tZ_¥©…EeÔÏ•>bš£nP€¼Ç“kzŒx~Ÿ¨¦‘…rprƒŠ—ˆnOTgˆkx¯£…LNq†’Ž…€€~|vict†…wgks||{wxsn`]ƒ·¼2QŠÅ£thé{Rg…Š›Ÿ‡lfu€{‚ª´¨m]iwƒŽ“˜‘…u}‹€cU£´—tU_p{rgsг­FLŠ—Ž|ŒŸqdkpz‚„ˆ}jS[qžu_W{Ÿ·›y[i€˜}…ŸÂ¥qAZ£’yŠŸ–vZe€œ“…}‰“„tq€”ˆyr}–š“aT`¢«wci”uFL±¿‹hWgz…}w‚“£™|SZl„~rw‰šhgjqtusr—´¼€^[s‹š•‘ž‘lT}£±em|‚ur{¡«•{js{„†ˆ‰Ÿ›uz“vK]‡Å°`U_wn_awŸ—€qhkry|ˆ‡„ƒ‚vtu|€ƒƒzsmv†—”~WYm¥¡ƒlŠ»£ucЬƒY`†¢‘ƒ›•odeqz†›„us‘–†W[‹—“z|‰Ÿ˜vibvŽt…Ž‹tquƒ…€‚{y}ŒŽˆ††wf\q€‰†„€}ztqqtvz~ƒ„moˆsg’¤„onŠ’’‘wnp‚Š’‹‚}‰‘Žvq{ƒ¢‘€{ux}‚‚‡‘snŒ‘„s|zolwxw|€†‡…zsnnv‹Œ†y}…o^k~‘‹w||wv‚Š}lx““l‡ª{„{q‡ŽŒss„–†qlƒŒ‡ˆˆ‡‰|rqŒ––€uu‘—‹~y~{~…‰‰Švo~€{ulcs‡˜•Žvkgpv€„†ˆ„zinƒ‰…h_c†{nj”|zŠr[}…‚¤ª–“…fv…sm€Žœ•†yvyz{‚˜š•„|†Š‘•zzŒ‚os€•“†vturu‹Œxqswsy‚‰’“’„yosw{|}ƒƒvpoy€„{sjoxŠ‹‚s}xq~„{‚Œˆ•„‹Œƒz{ƒ‰ˆ€upzŒŒ‹‡pk€”Šw‚‘ƒpap…™’‹†{kecމwu|ƒwpy†•‘‰|yvz}xx~’pfi„ˆ„wtx‹„tu‚v|Š•—}|†‚†ƒ||ƒŒˆwww|‰ˆ…~…€…ŠŒ„}{…Œ‰~ol}–vogcgƒ‹ˆ€vr€Žqnz‡Žˆ……kfmˆŠ~zyy|€|z}ƒ†‡}xxˆv‹›—“‰{‚††Š‰‚}}„Œˆ{smu|z{|}‚‡‰„‰‘„pbn€Ž’~smikq~‚Šˆ€uy}yvy‰™–‹pjqux…ŽŠxekw†…wt}ƒ†|}Š‚}ŠŒ‡•—‚yx„†ƒ‚……„{vw„†…‰Ž‡|rw‚ˆ‚~‚‡‰‡…}vs{„‹Ž‹ztttqpu|ŽŒ„wuvww|„Љ„€‚…yss†…yu‚~x{~xwŒ‰zqˆŽ‹Š‰€~†‡„‚‚ˆ†|sx…‚„…†ˆ‡~|{‚~|‡†~„‹…xmt}ŠŠ}wx}€ojt€‰Š‚yw{‚…„yw{„„ƒ„†€ysqw…‰ˆ‚†‚{}ƒ‡‚~yx‘˜€}{‰{zz€‡Šƒvw~‡yx‹†ƒ‹“”‡u|u{Ž—€ˆŒhkv‡‹ynr…jiz~}wz~‡ˆ|zz€†xtyƒ{||z{‚ƒ}rtˆ‘€yz{y‡Š…ƒ‚ŒŽ‚ƒˆ‰€vsz‡Ž–„{ut}~…Œ‘“Œ}xuz€‡Š…uu{ƒƒ€}~}}yupt~Š„{y~„‚{u{ƒŠ‡„„ƒxy{{y{†…qr€„€ou„‡„~|‚€€‰‹Œ€zwy|ƒ„†ˆˆ‡}y{~‚ƒ…ˆ†}xv€ˆŽ‰xz€‹…~z|‚„‚zyxwz||~ƒƒ…‰†zvtx{€‡†|vsqzƒ†‚~}‚‡ˆ‚ytŠŒŠ€}‹‰‰ˆ†‚„‚€}|‚ˆŠ‚xuzƒ†‹ŒŠ|€}}‚‡‡wsw|„ƒzrqw‚†…xmqy‚ˆ……Œ~rw{zrm‡…y†ˆŠ‹‰‰ˆƒ}vux~~yy‚ˆŠx{ƒš ‘‹…ƒ„……ˆ…‚}smrwz||ƒ‡ˆ†ƒ€‚…‡‡„€|zyƒƒƒ{qty‚ƒƒ€wy{|~{}ƒ…‡†‚rpt‚‰…|xz{}~ŠŒ‰xqr€€}}ˆ„|~}……‡Šˆ‡‰Šˆ„…‰‹‰‚ƒ„€}zyyz|~‚††€}~‚€›‘uvu|€qz€uywuƒ‰‹ƒ‚ƒ|„†~{tv}tt€rouƒƒ„€ˆ‡‡Ž…ƒ‡‡€ƒ~€~z€{ƒ„„}}||v{ƒŽ’|yx~‡‚‚ƒz|~xz€††~„…ƒ†‚€}}~}ƒ€zxwxz{ƒ…~{…†{{„‚|xv{€}x{‚‡…‚„Šˆ„‚|}ƒ‰‡„‚‚…ƒ~~‚‚ƒ‚…ˆˆ‰|}}‚…ƒƒ‚ƒ{zƒ„‚~„‚~ut‚€~{vqu|}|{y{{}‚‚‚…ˆ€|{y|~~‚‚€…„ƒ~|}ƒƒ€€ƒ‚€‚‡‡ƒ…ˆŠ‰…}||‚‚{|~€‚‚†ˆ†……„„ƒ€€~{{{|{x|‰ˆƒyw{}~~|{|}ƒƒwuw‚ƒƒ‚{z}€‚ƒƒ€z{~‚‚‚ƒ‡‡‡‰‰ˆ{x‚„…yzŠŠ†|{}€‚„„…€}|||}{|…††„~}|||}‚||‚ƒ€urs}ƒ††‚}||‚„‚€€€€~~„……|}€|yz~€ƒ†…~{|…‡‡†……‰ˆ…~z{}‚…‡„}|{{‡…~€„…€}{{|}ƒ€}~€ƒƒ~zvwx~€}wy{‚„…~{z‚‡Šˆ‡‚~{z~{x}ƒ~}~wz‹‰€}|‚ƒ…†††‡Œ‰ƒ‚……ƒ‚{wz€„‚‚}‚„„ƒ‚€€€†…yy…†€{y{uux~}|}{y|€„ƒ€}~~wv}ƒ†||€€|z|ƒ……ƒ€~‚†‡„…‹Ž„|ƒ…ƒ„}|€~}€‚ƒ‚€}~€ƒƒƒƒƒ}{ƒ‚€€ƒƒ{|€~||‚~{yy|~€‚ƒƒ~||ƒ~~€€‚€~|~„ƒ„…„ƒ~~ƒ‚€€„…ƒ|zy€ƒƒ€‚‚€ƒ„„€~~‚‚ƒ‚~~„„~~‚„„‚|xvz|ƒƒ~|~~}|‚~}}}~~||~‚ƒ„‚ƒƒ‚ƒƒ„€~‚ƒƒƒ‚‚ƒ†…}||~€‚ƒƒ……„ƒƒƒ‚†‡…~|}~}}€ƒ€{wvz~||}~}}|||{z|‚~|}ƒ††€|||€~~€€~}€ƒ„‚‡‹Œˆ€€€‚„„„„ƒ„†„‚~yz‚‚~}~}{z|}}}ƒ‡‡…ƒ…ƒƒ„‚}yz††„~|{{|~€€}xwy~„„„|{~€‚‚€€}}‡…}zz‚……~€‚ƒ~~‚€~€„‚{|„†…~||€€||~†‡‡~ƒ……ƒ‚…‡…‚|}‚…ƒ€xut}|zyzzz{ƒƒ‚€„„„‚ƒ„…„{y{†ˆˆ{y{|ƒƒ€~}ƒƒ…†‡„„†„‚ƒƒ„‚{{}~~}}‚€}xz€‚ƒ€€{||~}}~|{}‚ƒ€~|{|~„…„€€€‚‚‚„ƒ‚~€€€€€€€€€€€€€€‚‚‚„…€…‡†‚€€€€~€€€}}€~}}ƒ‚€€€€€€€€ƒƒ‚€€€€‚‚‚€€~|zy|}~}|}€€€}}}€€€€€€€€€€‚‚€€‚‚€€€‚ƒ‚€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€koules1.4/Problems100644 37512 310 3013 6477322207 12564 0ustar rootroot---------- 8< ---------- 8< ---------- 8< ---------- 8< ---------- 8< --------- SVGA VERSION [P] Koules crashes in the high resolution [S] Your /usr/local/libvga.conf or /etc/vga/libvga.conf is wrong. Edit it and set your video card, monitor and mouse. [S] Svgalib is unable to use high resolution. Try other program running in 640x480x256 - many svga programs can be switched to the high resolution using export GSVGAMODE=G640x480x256. Won't work? so use 320x200 version or koules for X. [S] Report the bug. [P] Intro can be interrupted only if I use a mouse [P] Texts cannot be interrupted [S] Your gpm/selection conflicts with the svgalib's mouse driver. Kill it before running koules. [S] Your /usr/local/libvga.conf or /usr/vga/libvga.conf is wrong. Edit it and try to set other mouse protocol. [S] Disable Koule's mouse support using -M. [P] Koules crashes on my computer [S] You use old svgalib version. Koules was tested on 1.2.6 / 1.2.7 version Use static distribution or upgrade svgalib. ---------- 8< ---------- 8< ---------- 8< ---------- 8< ---------- 8< --------- X VERSION [P] Koules segfaulting [S] Report bug and try -M. [P] interface.h not found. [S] Your makefile is wrong CFLAGS must contain -Ixlib and config defines(-DMITSHM and -DONLYANSI for most configurations) [P] sound problems [S] try network audio support-work on most computers [P] display is monochrome [S] -m option was changed from mouse to monochrome remove -m option from your batch file koules1.4/Imakefile100644 37512 310 12205 6477322207 12712 0ustar rootroot#XCOMM *********************************************************** #XCOMM ---> Configuration options was moved indo Iconfig <---- #XCOMM *********************************************************** #include "Iconfig" #ifdef I386ASSEMBLY ASMDEF = -DASSEMBLY #endif SUBDIRS=xlib util #define IHaveSubdirs #ifdef NETWORK NET = -DNETSUPPORT #endif #ifdef JOYSTICK JOYSTICK1 = -DJOYSTICK #endif #ifdef MITSHM MITSHM1 = -DMITSHM #endif #ifdef HAVEUSLEEP HAVEUSLEEP1 = -DHAVEUSLEEP #endif #ifndef SOUND #ifndef NAS_SOUND #ifndef RSOUND DEFINES = -DONLYANSI $(JOYSTICK1) $(NET) $(MITSHM1) $(HAVEUSLEEP1) $(SYSDEFS) $(JOYSTICK) -Ixlib\ $(NAMEDEF) $(ASMDEF) #else INSTALLSOUND = True NASLIB = -L/usr/local/lib/rplay -lrplay SOUNDOBJS = rsound.o DEFINES = -DONLYANSI -DRSOUND $(JOYSTICK1) $(NET) $(MITSHM1) $(HAVEUSLEEP1) $(SYSDEFS) $(JOYSTICK) -Ixlib\ $(NAMEDEF) $(ASMDEF)\ -DSOUNDDIR=\"$(SOUNDDIR)\" #endif #else INSTALLSOUND = True NASLIB = -laudio SOUNDOBJS = nas_sound.o DEFINES = -DONLYANSI -DNAS_SOUND $(JOYSTICK1) $(NET) $(MITSHM1) $(HAVEUSLEEP1) $(SYSDEFS) $(JOYSTICK) -Ixlib\ $(NAMEDEF) $(ASMDEF)\ -DSOUNDDIR=\"$(SOUNDDIR)\" #endif #else INSTALLSOUND = True DEFINES = -DONLYANSI -DSOUND $(JOYSTICK1) $(NET) $(MITSHM1) $(HAVEUSLEEP1) $(SYSDEFS) $(JOYSTICK) -Ixlib\ $(NAMEDEF) $(ASMDEF)\ -DSOUNDSERVER=\"$(SOUNDDIR)/$(SOUNDSERVER)\" \ -DSOUNDDIR=\"$(SOUNDDIR)\" \ -DSOUNDDEV=\"$(SOUNDDEV)\" #endif #define PassCDebugFlags 'CDEBUGFLAGS=$(CDEBUGFLAGS)' OBJS = koules.o menu.o gameplan.o font.o intro.o rcfiles.o \ framebuffer.o cmap-x11.o sound.o nas_sound.o rsound.o client.o server.o sock.o objectsio.o mygetopt.o SRCS = koules.c menu.c gameplan.c font.c intro.c rcfiles.c\ framebuffer.c cmap-x11.c sound.c nas_sound.c rsound.c client.c server.c sock.c objectsio.c mygetopt.c LOCAL_LIBRARIES = util/libutils.a xlib/libxlib.a $(NASLIB) $(XLIB) $(EXTRALIB) -lm DEPLIBS= util/libutils.a xlib/libxlib.a $(DEPXLIB) MakeSubdirs($(SUBDIRS)) DependSubdirs($(SUBDIRS)) #ifdef SOUND all::xkoules $(SOUNDSERVER) #else all::xkoules #endif BINDIR = $(KOULESDIR) DESTDIR = / ComplexProgramTarget(xkoules) #ifdef SOUND NormalProgramTarget($(SOUNDSERVER), $(SOUNDSERVER).o,,,) #endif #ifdef NAS_SOUND install:: $(PROGRAMS) $(SOUNDSERVER) @echo "Koules directory is " $(KOULESDIR) @: @echo "Instalin man page to " $(MANDIR) @mkdirhier $(MANDIR) $(INSTALL) -c $(INSTBINFLAGS) xkoules.6 $(MANDIR); @: @echo "Creating directory " $(KOULESDIR) @if [ ! -d $(KOULESDIR) ]; then mkdirhier $(KOULESDIR); fi @: @if [ "$(INSTALLSOUND)" = "True" ]; \ then \ echo "Creating directory " $(SOUNDDIR); \ if [ ! -d $(SOUNDDIR) ]; then mkdirhier $(SOUNDDIR); fi; \ echo "Copying sound server to directory " $(SOUNDDIR); \ $(INSTALL) -c -s $(INSTBINFLAGS) $(SOUNDSERVER) $(SOUNDDIR); \ echo "Copying sound files into directory " $(SOUNDDIR); \ cd ./sounds; set -x; \ for file in *.raw; do \ auconvert -raw linu8 1 -rate 8000 -volume 40 $$file -file snd `basename $$file .raw`.au ; \ $(INSTALL) -c $(INSTDATFLAGS) `basename $$file .raw`.au $(SOUNDDIR); \ done; \ fi @echo @echo Do not forget send filled Card to author @echo #else #ifdef RSOUND install:: $(PROGRAMS) $(SOUNDSERVER) @echo "Koules directory is " $(KOULESDIR) @: @echo "Instalin man page to " $(MANDIR) @mkdirhier $(MANDIR) $(INSTALL) -c $(INSTBINFLAGS) xkoules.6 $(MANDIR); @: @echo "Creating directory " $(KOULESDIR) @if [ ! -d $(KOULESDIR) ]; then mkdirhier $(KOULESDIR); fi @: @if [ "$(INSTALLSOUND)" = "True" ]; \ then \ echo "Creating directory " $(SOUNDDIR); \ if [ ! -d $(SOUNDDIR) ]; then mkdirhier $(SOUNDDIR); fi; \ echo "Copying sound server to directory " $(SOUNDDIR); \ $(INSTALL) -c -s $(INSTBINFLAGS) $(SOUNDSERVER) $(SOUNDDIR); \ echo "Copying sound files into directory " $(SOUNDDIR); \ cd ./sounds; set -x; \ for file in *.raw; do \ sh ../myauconvert $$file `basename $$file .raw`.au ; \ $(INSTALL) -c $(INSTDATFLAGS) `basename $$file .raw`.au $(SOUNDDIR); \ done; \ fi @echo @echo @echo @echo @echo Don't forget send filled Card to author @echo #else install:: $(PROGRAMS) $(SOUNDSERVER) @echo "Koules directory is " $(KOULESDIR) @: @echo "Instalin man page to " $(MANDIR) @mkdirhier $(MANDIR) $(INSTALL) -c $(INSTBINFLAGS) xkoules.6 $(MANDIR); @: @echo "Creating directory " $(KOULESDIR) @if [ ! -d $(KOULESDIR) ]; then mkdirhier $(KOULESDIR); fi @: @if [ "$(INSTALLSOUND)" = "True" ]; \ then \ echo "Creating directory " $(SOUNDDIR); \ if [ ! -d $(SOUNDDIR) ]; then mkdirhier $(SOUNDDIR); fi; \ echo "Copying sound server to directory " $(SOUNDDIR); \ $(INSTALL) -c -s $(INSTBINFLAGS) $(SOUNDSERVER) $(SOUNDDIR); \ echo "Copying sound files into directory " $(SOUNDDIR); \ cd ./sounds; set -x; \ for file in *.raw; do \ $(INSTALL) -c $(INSTDATFLAGS) $$file $(SOUNDDIR); \ done; \ fi @echo @echo @echo @echo @echo Dont forget send filled Card to author @echo #endif #endif koules1.4/cmap-x11.c100644 37512 310 26113 6477322207 12577 0ustar rootroot/*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@paru.cas.cz * *----------------------------------------------------------* *Copyright(c)1995,1996 by Jan Hubicka.See README forlicense* * details. * *----------------------------------------------------------* * cmap-x11.c colormap routines for x11 * * unclean....I know * ***********************************************************/ #include "koules.h" #define col(i,y) (i>63?63:i) #define NKEEP 28 /*how many collow keep in provate colormap */ int fadedout = 0; void setmonopalette () { int i; notusedc = 3; for (i = 0; i < 256; i++) pixels[i] = BlackPixel (dp, screen), spixels[i] = 0; for (i = 0; i < 16; i++) { pixels[i] = WhitePixel (dp, screen); spixels[i] = 64; pixels[i + 16] = WhitePixel (dp, screen); spixels[i + 16] = 64; pixels[i + 32 + 16] = WhitePixel (dp, screen); spixels[i + 32 + 16] = 64; pixels[i + 192 + 16] = WhitePixel (dp, screen); spixels[i + 192 + 16] = 64; pixels[i + 64] = WhitePixel (dp, screen); spixels[i + 64] = 64; pixels[i + 96] = WhitePixel (dp, screen); spixels[i + 96] = 64; pixels[i + 128] = WhitePixel (dp, screen); spixels[i + 128] = 64; pixels[i + 160] = WhitePixel (dp, screen); spixels[i + 160] = 64; } pixels[0] = BlackPixel (dp, screen), pixels[255] = WhitePixel (dp, screen), spixels[0] = 0; } static int setcustompalette1 (CONST int ncolors) { /* 0-31 black to yellow for starwars scroller */ /* 32-63 black to red */ /* 64-96 for red koules */ /* 96-128 for yellow rockets */ /* 128-160 for green rockets */ /* 160-192 for blue rockets */ /* 192-256 gray cmap for stars */ unsigned long pixels1[256]; int npixels1; unsigned char pal[256][3]; int i; int y; const int p = 0; int lr = -1, lg = -1, lb = -1, lpixel = -1; XColor c[256]; int nallocated = 0; if (useprivate) { nallocated = NKEEP; for (i = 0; i < NKEEP; i++) c[i].pixel = i; XQueryColors (dp, DefaultColormap (dp, screen), c, NKEEP); for (i = 0; i < NKEEP; i++) XStoreColors (dp, colormap, c, NKEEP); } for (i = 0; i < 64; i++) { int r, g, b; r = g = b = 0; y = (i * ncolors / 32) * 32 / ncolors; if ((y & 32) > 0) b = (y & 31) << 1; if (y < 32) { r = (y & 3) << 4; /* 2 bits */ g = (y & 4) << 3; /* 1 bit */ b = (y & 24) << 1; /* 2 bits */ } pal[i][0] = col (r + p, p1); pal[i][1] = col (g + p, p1); pal[i][2] = col (b + p, p1); } for (i = 64; i < 64 + 32; i++) { int r, g, b; y = (i * ncolors / 32) * 32 / ncolors; if (y < 64) y = 64; r = g = b = 0; r = (32 - (y - 63)) << 1; if (i < 64 + 8) { b = g = (((8 - (y - 63))) << 5) / 5; } pal[i][0] = col (r + p, p1); pal[i][1] = col (g + p, p1); pal[i][2] = col (b + p, p1); } for (i = 96; i < 96 + 32; i++) { int r, g, b; y = (i * ncolors / 32) * 32 / ncolors; if (y < 96) y = 96; r = g = b = 0; r = g = (32 - (y - 95)) << 1; if (i < 96 + 8) { b = ((8 - (y - 95))) << 3; } pal[i][0] = col (r + p, p1); pal[i][1] = col (g + p, p1); pal[i][2] = col (b + p, p1); } for (i = 128; i < 128 + 32; i++) { int r, g, b; y = (i * ncolors / 32) * 32 / ncolors; if (y < 128) y = 128; r = g = b = 0; g = (32 - (y - 127)) << 1; if (i < 128 + 8) { r = b = ((8 - (i - 127))) << 3; } pal[i][0] = col (r + p, p1); pal[i][1] = col (g + p, p1); pal[i][2] = col (b + p, p1); } for (i = 160; i < 160 + 32; i++) { int r, g, b; y = (i * ncolors / 32) * 32 / ncolors; if (y < 160) y = 160; r = g = b = 0; b = (32 - (y - 159)) << 1; if (i < 160 + 8) { r = g = (((8 - (y - 159))) << 3) / 2; } pal[i][0] = col (r + p, p1); pal[i][1] = col (g + p, p1); pal[i][2] = col (b + p, p1); } for (i = 0; i < 32; i++) { y = (i * ncolors / 32) * 32 / ncolors; if (ncolors < 8) { pal[i][0] = 64; pal[i][1] = 64; pal[i][2] = 0; } else { pal[i][0] = col (y * 2 + p, p1); pal[i][1] = col (y * 2 + p, p1); pal[i][2] = col (p, p1); } } for (i = 0; i < 32; i++) { y = (i * ncolors / 32) * 32 / ncolors; if (ncolors < 8) { pal[192 + i][0] = 64; pal[192 + i][1] = 64; pal[192 + i][2] = 64; } else { pal[192 + i][0] = col (y * 2 + p, p1); pal[192 + i][1] = col (y * 2 + p, p1); pal[192 + i][2] = col (y * 2 + p, p1); } } pal[0][0] = 0; pal[0][1] = 0; pal[0][2] = 0; pal[255][0] = col (63 + p, p1); pal[255][1] = col (63 + p, p1); pal[255][2] = col (63 + p, p1); npixels1 = 0; for (i = 0; i < 256; i++) { float sat; sat = pal[i][0] * 0.3 + pal[i][1] * 0.5 + pal[i][2] * 0.2; if (monochrome) sat = pow (sat / 64, 0.6) * 64; spixels[i] = sat; if (ncolors == 32) { opixels[i] = sat; } } for (i = 0; i < 256 && !blackwhite; i++) { if (lr == pal[i][0] && lg == pal[i][1] && lb == pal[i][2]) pixels[i] = lpixel; else { XColor color; if (!monochrome) { color.flags = DoRed | DoGreen | DoBlue; color.red = (unsigned short) (pal[i][0]) * 256 * 4; color.green = (unsigned short) (pal[i][1]) * 256 * 4; color.blue = (unsigned short) (pal[i][2]) * 256 * 4; color.pixel = npixels1; } else { color.flags = DoRed | DoGreen | DoBlue; color.red = (unsigned short) (spixels[i]) * 256 * 4; color.green = (unsigned short) (spixels[i]) * 256 * 4; color.blue = (unsigned short) (spixels[i]) * 256 * 4; color.pixel = npixels1; } if (!useprivate && !XAllocColor (dp, colormap, &color)) { XFreeColors (dp, colormap, pixels1, npixels1, 0L); return (0); } if (useprivate) { int i; for (i = 0; i < nallocated; i++) { if ((c[i].red & 0xfc00) == (color.red && 0xfc00) && (c[i].blue & 0xfc00) == (color.blue & 0xfc00) && (c[i].green & 0xfc00) == (color.green & 0xfc00)) { color.pixel = i; break; } } if (i == nallocated) color.pixel = i, nallocated++; if (nallocated >= 256) printf ("Cmap owerflow!"); XStoreColor (dp, colormap, &color); c[i].red = color.red; c[i].green = color.green; c[i].blue = color.blue; } pixels1[npixels1] = color.pixel; lpixel = color.pixel; lr = pal[i][0]; lg = pal[i][1]; lb = pal[i][2]; npixels1++; } pixels[i] = lpixel; } return (1); } void setcustompalette (CONST int p, CONST float p1) { int ncolor, i; if (blackwhite) { nofade = 1; monochrome = 1; setcustompalette1 (32); setmonopalette (); return; } printf ("Allocating pallette\n"); for (ncolor = 32; ncolor > 8; ncolor -= 4) { printf ("%i-", ncolor); if (setcustompalette1 (ncolor)) { notusedc = 0; for (i = 0; i < 256; i++) if (notusedc == pixels[i]) notusedc++, i = 0; printf ("ok\n"); return; } } printf ("failed...using slow algoritmus and private colormap\n"); colormap = XCreateColormap (dp, wi, DefaultVisual (dp, XDefaultScreen (dp)), AllocAll); XSetWindowColormap (dp, wi, colormap); useprivate = 1; for (ncolor = 32; ncolor > 0; ncolor -= 1) { printf ("%i-", ncolor); if (setcustompalette1 (ncolor)) { notusedc = 0; for (i = 0; i < 256; i++) if (notusedc == pixels[i]) notusedc++, i = 0; printf ("ok\n"); return; } } printf ("Could not allocate colormap try -m option\n"); exit (-1); } /* adapted from 'xscreensaver', */ #define XFADE_IN 1 #define XFADE_OUT 0 #define NUM_COLORS 256 void Fade (CONST int steps) { static int state = XFADE_IN; static XColor orig_colors[NUM_COLORS]; XColor curr_colors[NUM_COLORS]; int i, j; static Colormap *fade_cmap, new_cmap; if (!fadeenable || nofade) return; nopause = 1; /* Set the requested pixels */ for (i = 0; i < NUM_COLORS; ++i) orig_colors[i].pixel = i; state = ((state == XFADE_IN) ? XFADE_OUT : XFADE_IN); /* Make a copy of the default colormap and use that in fade */ if (useprivate) { if (state == XFADE_OUT) { XQueryColors (dp, colormap, orig_colors, NUM_COLORS); fade_cmap = &colormap; } } else { XQueryColors (dp, colormap, orig_colors, NUM_COLORS); if (state == XFADE_OUT) { new_cmap = XCreateColormap (dp, DefaultRootWindow (dp), DefaultVisual (dp, XDefaultScreen (dp)), AllocAll); XStoreColors (dp, new_cmap, orig_colors, NUM_COLORS); XGrabServer (dp); XInstallColormap (dp, new_cmap); fade_cmap = &new_cmap; } } XSync (dp, False); memcpy (curr_colors, orig_colors, NUM_COLORS * sizeof (XColor)); if (state == XFADE_OUT) { for (i = steps; i > 0; i--) { for (j = 0; j < NUM_COLORS; j++) { curr_colors[j].red = orig_colors[j].red * i / steps; curr_colors[j].green = orig_colors[j].green * i / steps; curr_colors[j].blue = orig_colors[j].blue * i / steps; } XStoreColors (dp, *fade_cmap, curr_colors, NUM_COLORS); usleep (10); XSync (dp, False); } } else { for (i = 0; i < steps; i++) { for (j = 0; j < NUM_COLORS; j++) { curr_colors[j].red = orig_colors[j].red * i / steps; curr_colors[j].green = orig_colors[j].green * i / steps; curr_colors[j].blue = orig_colors[j].blue * i / steps; } XStoreColors (dp, *fade_cmap, curr_colors, NUM_COLORS); usleep (10); XSync (dp, False); } } if (state == XFADE_IN) { /* Restore the original colormap */ if (useprivate) { XStoreColors (dp, colormap, orig_colors, NUM_COLORS); } else { XInstallColormap (dp, colormap); XUngrabServer (dp); XFreeColormap (dp, *fade_cmap); } XSync (dp, False); } nopause = 0; } void fadeout () { if (!fadedout) { Fade (30); fadedout = 1; tbreak = 1; } } void fadein () { if (fadedout) { Fade (30); fadedout = 0; tbreak = 1; } } void fadein1 () /*better for star background */ { if (fadedout) { Fade (30); fadedout = 0; tbreak = 1; } } koules1.4/ANNOUNCE100644 37512 310 52132 6477322207 12235 0ustar rootroot Koules 1.4 by JAHUSOFT DESCRIPTION: Koules is a fast action arcade-style game for UNIX and OS/2. This version supports X window system, SVGAlib for Linux and OS/2. It works in fine (up to 900x620) resolution with cool 256 color graphics, multiplayer mode up to 5 players, full sound and, of course, network support. Koules is an original idea. First version of Koules was developed from scratch by Jan Hubicka in July 1995. AVAILABLE AT: WWW: http://www.paru.cas.cz/~hubicka/koules/English FTP: sunsite.unc.edu: /pub/Linux/Incoming will be placed to /pub/Linux/games/video/koules tsx-11.mit.edu: /pub/linux/sources/usr.games /pub/linux/binaries/usr.games ftp.x.com: /contrib/games Major changes to v1.4: o Fixed crash in 51st level Tested platforms: Linux, HP-UX, OS/2, Solaris, DEC, AIX, IRIX Sound: Linux, FreeBSD,OS/2, sun, HP-UX, rplay, NAS Network: Probably All bsd sockets compatible, tested only linux README: // // /// // // // ///// /// . // // // // // // // // // . //// // // // // // //// /// // // // // // // // // // // // //// //// ///// ///// /// * . v1.4 by . . . // /// // // // // /////////////////////// . // // // // // // // // // // ///// ///// // // // /// ///// ///// * /// // // // // //// // // // // // // // // //// // . ////////////////////////// /// // // . . THIS PROGRAM IS FREEWARE . * ^ . . / \ * . . . / \ * . / \ . . . * / \ . / \ . . / \ . / \ . * . / CREDITS \ * . / --------- \ . * . / \ Sounds by Jan Hubicka . . . Graphics by Jan Hubicka and Kamil Toman . * Programming by Jan Hubicka . HP-UX sound by Lutz Vieweg OS/2 version by Thomas A. K. Kjaer . * Story by Kamil Toman and Jan Hubicka * Script by Kamil Toman and Jan Hubicka . English Spelling checked by Thomas Marsh / \ . . / INTRODUCTION: \ / --------------- \ * Koules is a fast action arcade-style game for UNIX and OS/2. This version supports X window system, SVGAlib for Linux and OS/2. It works in fine resolution. (up to 900x620) with cool 256 color graphics, multi-player mode up to 5 players, full sound and, of course, network support. Koules is an original idea. The first version of Koules was developed from scratch / by Jan Hubicka in July 1995. \ / \ . / \ / REQUIREMENTS: \ / --------------- \ It runs well on computers which can be marked as faster than a 386DX/40 with math coprocessor (320x200 resolution) or 486DX2/50 (640x480 resolution). INSTALL: -------- In order to install Koules 1.2 you must do the following: (If you encounter any problems read `Problems' and `Koules.FAQ') For X11: ======== Edit the Iconfig for your computer and type: xmkmf -a make make install For SVGAlib: ============ You MUST be 'root' to install the game. Edit the Makefile.svgalib for your computer and type: make -f Makefile.svgalib make -f Makefile.svgalib install For HP-UX wo imake: =================== Edit the Makefile.hpux for your computer and type: make -f Makefile.hpux make -f Makefile.hpux install For OS/2: ========= Who cares?! :) Widows 95*: ============ Heavens no Koules ... *Widows 95 is a shitmark of Macro$oft USAGE: ------ xkoules [-SxslMmpdh] -h for help -s for small display(320x250) for slow machines -l for large display(640x480) default size -E extra large display size (900x620) -m for monochrome mode -b for black and white mode -p use private colormap use only if 'Could not allocate colormap' error is reported -y Synchronize with X use only for debugging -f Disable palette fading -d Disable sound support Game will run faster. -x Disable X11 pointer Use the game's own cursor when standard X11's cursor is blinking -M DISABLE shared memory support Slow down the game. Use only if shared memory support crashes. koules.svga [-slMmdh] -h for help -s for small display(320x200) for worse machines -l for large display(640x480) default size -M disable mouse support avoid gpm/selection conflict -d Disable sound support Game will run faster. Network options(common for both versions) -C run koules as network client -S run koules as network server -P select port. Default is:12345 Use this in case that some other program is already using this port. Server options: -W run server in width mode-support for 320x200 svgalib and OS/2 clients. Use this in case that server is refusing your clients. -L select level for server -D select dificulty for server: 0: nightmare 1: hard 2: medium(default and really, really recomended) 3: easy 4: very easy -K run server in deathmatch mode -E extra large display size (900x620) MENU SYSTEM: look at this simple hypertext diagram to understand them: /----------------+ START GAME (---+ +--+ | X PLAYER ---)--^------+ | +-------------+ CONTROL----/ | | | GAME MODE------^---------^-----------------^------------------------------+ DIFFICULTY-----^---------^-----------------^----------------------------+ | SOUND ON/OFF---^---------^-----------------^---------------------------+| | QUIT-----------^---------^-----------------^--------------------------+|| | | | | ||| | +--------------+ | | ||| | | +--------------+ | ||| | +----Start game (The fun is begins) | | ||| | | | ||| | +---------------------------------------+stip to (1) (1)||| | | | ||| | +----Select number of players (up to 5 player are possible) !!!!! | ||| | | ||| | +-------------------------------------------------------------------+ ||| | | ||| | PLAYER 1:(CONTROL MODE)------+ ||| | (CONTROL OPTIONS)------------^---+ ||| | PLAYER 2:(CONTROL MODE)------+ | ||| | (CONTROL OPTIONS)------------^---+----------------------------------+ ||| | PLAYER 3:(CONTROL MODE)------+ | | ||| | (CONTROL OPTIONS)------------^---+ | ||| | | | | | ||| | v | \ | ||| | PLAYER 5:(CONTROL MODE)------+-----)---+ | ||| | (CONTROL OPTIONS)-----------------/ | | ||| | | | ||| | +--------------------------------------+ | ||| | | | ||| | Possible selections: | ||| | KEYBOARD---------------------------------------------------------+ | ||| | ROTATION KEYBOARD----------------------------------------------+ | | ||| | MOUSE--------------------------------------------------------+ | | | ||| | JOYSTICK A *-----------------------------------------------+ | | | | ||| | JOYSTICK B *---------------------------------------------+ | | | | | ||| | | | | | | | ||| | *)available only when JOYSTICK support enabled | | | | | | ||| | +--------------------------------------------------------+ | | | | | ||| | | | | | | | ||| | use second Joystick to control player. | | | | | ||| | use stick to rotate and button to accelerate | | | | | ||| | see also JOYSTICK SUPPORT,CONTROL MODE | | | | | ||| | +----------------------------------------------------------+ | | | | ||| | | | | | | ||| | use first Joystick to control player. | | | | ||| | use stick to rotate and button to accelerate | | | | ||| | see also JOYSTICK SUPPORT,CONTROL MODE | | | | ||| | +------------------------------------------------------------+ | | | ||| | | | | | ||| | use mouse to control player. | | | ||| | use pointer to rotate and button to accelerate | | | ||| | mouse must be configured in | | | ||| | usr/local/lib/libvga.conf read this file for more | | | ||| | informations. | | | ||| | use arrow to rotate player and button to accelerate. | | | ||| | mouse can be also use to control menus! | | | ||| | there are no CONTROL OPTIONS supported | | | ||| | +--------------------------------------------------------------+ | | ||| | | | | ||| | use keyboard to control player | | ||| | 3 keys are used:ACCELERATE,ROTATE LEFT,ROTATE RIGHT | | ||| | note:there are no predefined settings! use CONTROL OPTIONS | | ||| | to set keys! | | ||| | see also: CONTROL OPTIONS , KEYBOARD PROBLEM | | ||| | +----------------------------------------------------------------+ | ||| | | | ||| | use keyboard to control player | ||| | 4 keys are used:LEFT RIGHT UP AND DOWN | ||| | there are predefined settings: | ||| | player 1:cursor box | ||| | player 2:Arrows on keypad. | ||| | player 3: there are no predefined settings! use CONTROL OPTIONS | ||| | player 4: there are no predefined settings! use CONTROL OPTIONS | ||| | see also: CONTROL OPTIONS , KEYBOARD PROBLEM | ||| | +-------------------------------------------------------------------+ ||| | | ||| | (CONTROL OPTIONS)may be on of following: ||| | CHANGE KEYS-------------------+ ||| | CALIBRATE JOYSTICK A-------+ | ||| | CALIBRATE JOYSTICK B----+ | +---------------------------------+ ||| | | +---------------------------------+ | ||| | +-----------------------+ | | ||| | select it to calibrate second joystick. | | ||| | if you still see same menu your joystick is broken | | ||| | or joystick toolkit is not initialized(see JOYSTICK SUPPORT) | | ||| | otherwise you will see: | | ||| | Move joystick to lower right corner | | ||| | look at your joystick: | | ||| | (it is usually futuristic designed black thing) | | ||| | there is black stick. | | ||| | get it and move it into lower right corner.then press | | ||| | red button on joystick or space key. | | ||| | | | ||| | then you will see: | | ||| | Center joystick | | ||| | and press either button or space | | ||| | | | ||| | Place joystick on your desk.center the stick. | | ||| | and smoothly and slowly press space key. | | ||| | +------------------------------------------------------------+ | ||| | | | ||| | select it to calibrate first joystick. | ||| | if you still see same menu your joystick is broken | ||| | or joystick toolkit is not initialized(see JOYSTICK SUPPORT) | ||| | otherwise you will see: | ||| | Move joystick to lower right corner | ||| | look at your joystick: | ||| | (it is usually futuristic designed black thing) | ||| | there is black stick. | ||| | get it and move it into lower right corner.then press | ||| | red button on joystick or space key. | ||| | | ||| | then you will see: | ||| | Center joystick | ||| | and press either button or space | ||| | | ||| | Place joystick on your desk.center the stick. | ||| | and smoothly and slowly press space key. | ||| | +---------------------------------------------------------------+ ||| | | ||| | define your keys: ||| | if you see ACCELERATION skip to b) ||| | if you see UP skip to a) ||| | a)you have selected KEYBOARD ||| | press a key what you want use to move up ||| | then you will see: ||| | DOWN ||| | press a key what you want use to move down ||| | then you will see: ||| | LEFT ||| | press a key what you want use to move left ||| | then you will see: ||| | RIGHT ||| | press key what you want use to move right ||| | then a you will see: ||| | see also:KEYBOARD PROBLEMS ||| | b)you have selected ROTATION KEYBOARD ||| | press a key what you want use to accelerate ||| | then you will see: ||| | ROTATE LEFT ||| | press a key what you want use to rotate left ||| | then you will see: ||| | ROTATE RIGHT ||| | press a key what you want use to rotate right ||| | then you will see: ||| | see also:KEYBOARD PROBLEMS ||| | +---------------------------------------------------------------------+|| | | || | back to the reality || | NOT RECOMMENDED!!!! VERY DANGEROUS || | RISK OF THE PSYCHICAL ( PHYSICAL ? ) SHOCK || | +----------------------------------------------------------------------+| | | | | turns the space sound on/off | | +-----------------------------------------------------------------------+ | menu: | EASY----------------------------+ | MEDIUM------------------+ | | HARD-------------+ | | | | | | | +----------------+ | | | | | | | only for professionals! | | | +-----------------------+ | | | | | recommended mode | | +-------------------------------+ | | | less fun | +-------------------------------------------------------------------------+ | menu: DEATH MATCH(doom)---------------+ COOPERATIVE---------+ | | | +-------------------+ | | | default mode. | operates in both | multi-player and | mono-player modes | 100 levels! | +-------------------------------+ | for doom maniacs -try to kill each other and stay alive! VERY VERY EASY, isn't it? ;) ----- / \ | o | o | ===========================OO==============OO============================= PC KEYBOARD PROBLEMS ---------------------- If you feel week go away! I have to tell you a story about stupidity of your keyboard controller. Once open a time ?BM (alias Little Yellow) made a stupid keyboard which is not able to handle more than 4 keys at a time... ... and they lived happily ever after. JOYSTICK SUPPORT (linux only) ------------------ requires joystick toolkit.in distribution is patch for joystick-0.7.1 to compile under newer version of kernel(1.3.x) installation: tar xzvf joystick-0.7.1.tar.gz patch -p0 < patch cd joystick-0.7.1 cp joystick.h /usr/include/linux make joystick.o before you run game enter insmod joystick.o you will see: js_init: found joysticks number must be 1 or 2!!! SOUND SUPPORT --------------- LINUX: koules support voxware sound driver and pcsnd pcspeaker driver. Other architectures: OS/2, Free BSD, HP-UX, SUN FAQ ----- Q: Sounds not running. A: You entered invalid path edit makefile. Note on spaces and / at end of path. Q: Why this stupid game don't run on my machine? A: Your stupid machine is not supported. Buy another one. Q: Why game run s l o w l y ? A: Try 320x200 or 320x250 version. Q: Why game still run s l o w l y ? A: Buy sextium ;) see Koules.FAQ for more COPYING --------- 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. BUGS ------ There is bug in my svgalib.1.2.8 and earlier: switch to another console, switch back and press enter it will crash your computer.It is not koules bug!!! Test it on svgalib/demos/keytest! Koules from the top: . --- . . O / \ . . | | . . .. --- \ / / \ X O --- | O| \ O/ --- --- . O /O O\ . . . . | | . . . \ / . .X. . O --- . . . . . . . . ... . . . . . . . . . . . H A V E FUN ! please send a note to my e-mail address so I know how many people play Koules. send any comments, problems, suggestions, donations, flames, ideas for KoulesII email: hubicka@paru.cas.cz smail: Jan Hubicka Dukelskych bojovniku 1944 Tabor 39001 Czech Republic koules1.4/intro.c100644 37512 310 33506 6477556370 12421 0ustar rootroot/*********************************************************** * K O U L E S * *----------------------------------------------------------* * C1995 JAHUSOFT * * Jan Hubicka * * Dukelskych Bojovniku 1944 * * 390 03 Tabor * * Czech Republic * * Phone: 0041-361-32613 * * eMail: hubicka@limax.paru.cas.cz * *----------------------------------------------------------* * Copyright(c)1995,1996 by Jan Hubicka.See README for * * licence details. * *----------------------------------------------------------* * intro.c intro outro code * ***********************************************************/ /* Changes for OS/2 Warp with Dive. * * Copyright(c)1996 by Thomas A. K. Kjaer * ***********************************************************/ #include "koules.h" #include "font.h" #include "text.h" #include #include extern void fadein1 (); extern void points (); extern void points1 (); /* * intro code * */ void draw_koules (CONST int c, CONST int s, CONST int r) { int i; for (i = 0; i < 360; i += 60) switch (c) { case 0: PutBitmap ((int) (MAPWIDTH / 2 - BALL_RADIUS / DIV + sin (RAD (i + s)) * r), (int) (MAPHEIGHT / 2 - BALL_RADIUS / DIV + cos (RAD (i + s)) * r), BALL_RADIUS * 2 / DIV, BALL_RADIUS * 2 / DIV, ball_bitmap); break; case 1: PutBitmap ((int) (MAPWIDTH / 2 - BALL_RADIUS / DIV + sin (RAD (i + s)) * r), (int) (MAPHEIGHT / 2 - BALL_RADIUS / DIV + cos (RAD (i + s)) * r), BALL_RADIUS * 2 / DIV, BALL_RADIUS * 2 / DIV, lball_bitmap[0]); break; default: PutBitmap ((int) (MAPWIDTH / 2 - BALL_RADIUS / DIV + sin (RAD (i + s)) * r), (int) (MAPHEIGHT / 2 - BALL_RADIUS / DIV + cos (RAD (i + s)) * r), BALL_RADIUS * 2 / DIV, BALL_RADIUS * 2 / DIV, lball_bitmap[1]); break; } } void koulescreator (CONST int r) { int time = 100; int z1; int x, y; int x1, y1, i; Effect (S_CREATOR1, next); for (i = 0; i < 360; i += 60) { x1 = (MAPWIDTH / 2 - +sin (RAD (i)) * r); y1 = (MAPHEIGHT / 2 - +cos (RAD (i)) * r); for (z1 = 0; z1 < BALL_RADIUS * BALL_RADIUS * M_PI / DIV / DIV; z1++) { x = rand () % GAMEWIDTH; y = rand () % GAMEHEIGHT; addpoint (x * 256 * DIV, y * 256 * DIV, (x1 - x) * 256 / (time) * DIV, (y1 - y) * 256 / (time) * DIV, ball (rand () % 32), time); } } } void starcreator () { int time = 100; int z; int x, y; Effect (S_CREATOR1, next); for (z = 0; z < ROCKET_RADIUS * ROCKET_RADIUS * M_PI / DIV / DIV; z++) { x = rand () % GAMEWIDTH; y = rand () % GAMEHEIGHT; addpoint (x * 256 * DIV, y * 256 * DIV, (MAPWIDTH / 2 - x) * 256 / (time) * DIV, (MAPHEIGHT / 2 - y) * 256 / (time) * DIV, (rand () % 32), time); } } void draw_player (CONST int x, CONST int y, CONST float r, CONST int z, CONST int r1) { int x1, y1; PutBitmap ((int) x - ROCKET_RADIUS / DIV, (int) y - ROCKET_RADIUS / DIV, ROCKET_RADIUS * 2 / DIV, ROCKET_RADIUS * 2 / DIV, rocket_bitmap[z]); x1 = x * DIV + sin (r - RAD (30)) * r1 - EYE_RADIUS; y1 = y * DIV + cos (r - RAD (30)) * r1 - EYE_RADIUS; PutBitmap (x1 / DIV, y1 / DIV, EYE_RADIUS * 2 / DIV, EYE_RADIUS * 2 / DIV, eye_bitmap[z]); x1 = x * DIV + sin (r + RAD (30)) * r1 - EYE_RADIUS; y1 = y * DIV + cos (r + RAD (30)) * r1 - EYE_RADIUS; PutBitmap (x1 / DIV, y1 / DIV, EYE_RADIUS * 2 / DIV, EYE_RADIUS * 2 / DIV, eye_bitmap[z]); } #define TEXTW 200 #define TEXTH 25 void starwars () { int y, i, z; float r[3]; float angle = 0; int actu = 0; int time = 0; int time1 = 0; int playx = 0, playy = 0; int bballx = 0, bbally = 0; float playr = RAD (0), playp = 0.03; long VfTime = 0; long VendSleep = 0; int sizes[300]; struct timeval VlastClk; struct timeval VnewClk; int wait = 0; float r1; float rp[3]; fadeout (); for (y = 0; y < TEXTSIZE; y++) sizes[y] = -vgatextsize (TEXTH, text[y]) / 2; gettimeofday (&VlastClk, NULL); gettimeofday (&VnewClk, NULL); VendSleep = VlastClk.tv_usec; #ifdef DEBUG VfTime = 1000000 / 200; #else VfTime = 1000000 / 65; #endif r[1] = r[2] = r[0] = sqrt ((MAPWIDTH / 2) * (MAPWIDTH / 2) + (MAPHEIGHT / 2) * (MAPHEIGHT / 2)); rp[0] = 0.0 / DIV; rp[1] = 0.6 / DIV; rp[2] = 0.6 / DIV; r1 = r[0]; Effect (S_START, 0); for (i = -660; i < (TEXTSIZE + 10) * TEXTW; i += 1) { gettimeofday (&VnewClk, NULL); if (VnewClk.tv_usec < VendSleep) VendSleep -= 1000000; wait = (VfTime - VnewClk.tv_usec + VendSleep); if (wait >= 0 || tbreak) { CopyVSToVS (starbackground, backscreen); SetScreen (backscreen); EnableClipping (); for (z = 0; z < 3; z++) { if (r[z] <= ROCKET_RADIUS / DIV + BALL_RADIUS / DIV) { rp[z] = -6 / DIV; Effect (S_COLIZE, next); } if (r[z] < r1) draw_koules (rp[z] > 0 ? z : 0, (int) angle, r[z]); } if (bbally > -20 && bballx) PutBitmap ((int) bballx - (BBALL_RADIUS) / DIV, bbally, BBALL_RADIUS * 2 / DIV, BBALL_RADIUS * 2 / DIV, bball_bitmap); points (); for (y = 0; y < TEXTSIZE; y++) { if (y * TEXTW - i + 2 * TEXTW < 1000 && y * TEXTW - i + TEXTW > -1500) { textcolor = (1200 + (y * TEXTW - i)) * 32 / 2500; if (textcolor <= 0) continue; actu = y; vgadrawtext (sizes[y], y * TEXTW - i, TEXTH, text[y]); #ifdef OS2DIVE DosSleep (WAIT); #endif } } if (playx) draw_player (playx, playy, playr, 0, EYE_RADIUS1); if (actu == PLAYERLINE && !time) starcreator (), time = 1; CopyToScreen (backscreen); fadein1 (); } else points1 (); if (actu >= KOULESLINE && !time1) koulescreator (MAPHEIGHT / 2 - 20), time1 = 1; if (time1) time1++; if (time1 == 100) r[0] = MAPHEIGHT / 2 - 20; if (time1 > 100) r[0] -= rp[0], angle += 0.3; playr += playp; if (playr < RAD (-45)) playp = 0.015, playr = RAD (-45); if (playr > RAD (45)) playp = -0.03, playr = RAD (45); if (actu >= D1LINE) r[1] -= rp[1]; if (actu >= D2LINE) r[2] -= rp[2]; if (actu >= BLINE && !bballx) bballx = MAPWIDTH / 2, bbally = MAPHEIGHT + 30; if (bballx) bbally--; if (bbally > 0 && bbally < MAPHEIGHT / 2 + ROCKET_RADIUS / 2) { if (playy == MAPHEIGHT / 2) { Effect (S_END, next); } playy -= 10; } if (time) time++; if (time == 100) { playx = MAPWIDTH / 2, playy = MAPHEIGHT / 2, playr = RAD (180), rp[0] = 1.5 / DIV; Effect (S_CREATOR2, next); } gettimeofday (&VnewClk, NULL); if (VnewClk.tv_usec < VendSleep) VendSleep -= 1000000; wait = (VfTime - VnewClk.tv_usec + VendSleep); if (tbreak) wait = VfTime, tbreak = 0; usleep (wait < 0 ? 0 : wait); VendSleep = VnewClk.tv_usec + wait; gettimeofday (&VlastClk, NULL); UpdateInput (); if (Pressed ()) { fadeout (); while (Pressed ()) { UpdateInput (); } return; } } fadeout (); } void clearpoints () { int i; for (i = 0; i < MAXPOINT; i++) point[i].time = 0; } void outro (CONST int size, char *text[]) { int y, i; int actu = -1; int lkey = 1; int skey = 0; int key = 1; long VfTime = 0; long VendSleep = 0; #ifdef __GNUC__ int sizes[size]; #else int sizes[300]; #endif struct timeval VlastClk; struct timeval VnewClk; int wait = 0; fadeout (); clearpoints (); for (y = 0; y < size; y++) sizes[y] = -vgatextsize (TEXTH, text[y]) / 2; gettimeofday (&VlastClk, NULL); gettimeofday (&VnewClk, NULL); VendSleep = VlastClk.tv_usec; #ifdef DEBUG VfTime = 1000000 / 200; #else VfTime = 1000000 / 65; #endif for (i = -660; i < (size + 4) * TEXTW; i += 1) { gettimeofday (&VnewClk, NULL); if (VnewClk.tv_usec < VendSleep) VendSleep -= 1000000; wait = (VfTime - VnewClk.tv_usec + VendSleep); if (wait >= 0 || tbreak) { CopyVSToVS (starbackground, backscreen); SetScreen (backscreen); EnableClipping (); points (); for (y = 0; y < size; y++) { if (y * TEXTW - i + 2 * TEXTW < 1000 && y * TEXTW - i + TEXTW > -1500) { textcolor = (1200 + (y * TEXTW - i)) * 32 / 2500; if (textcolor <= 0) continue; actu = y; vgadrawtext (sizes[y], y * TEXTW - i, TEXTH, text[y]); #ifdef OS2DIVE DosSleep (WAIT); #endif } } CopyToScreen (backscreen); fadein1 (); } else points1 (); gettimeofday (&VnewClk, NULL); if (VnewClk.tv_usec < VendSleep) VendSleep -= 1000000; wait = (VfTime - VnewClk.tv_usec + VendSleep); if (tbreak) wait = VfTime, tbreak = 0; usleep (wait < 0 ? 0 : wait); VendSleep = VnewClk.tv_usec + wait; gettimeofday (&VlastClk, NULL); UpdateInput (); if (actu >= 0) { lkey = key; key = Pressed (); if (skey && !key && lkey) { fadeout (); return; } if (!key && lkey) skey = 1; } } fadeout (); } void staraccel (CONST float x1, CONST float y1, CONST float r) { int y; for (y = 0; y < 5 / DIV / DIV; y++) { float p; p = RAD (rand () % 45 - 22); addpoint (x1 * 256, y1 * 256, (-sin (r + p) * 0.08 * 10) * (rand () % 512), (-cos (r + p) * 0.08 * 10) * (rand () % 512), rocket (rand () % 16), 30); } } void outro2 () { int y, i, z; int lkey = 1; int skey = 0; int key = 1; int actu = 0; float width = 0; long VfTime = 0; long VendSleep = 0; int size = TEXTSIZE2; #ifdef __GNUC__ int sizes[size], nrockets1; #else int sizes[300], nrockets1; #endif struct timeval VlastClk; struct timeval VnewClk; int wait = 0; int first=1; float playy = MAPHEIGHT + 20; float playr = RAD (180); float playp = 0; float er = EYE_RADIUS1; float erp = 2; fadeout (); clearpoints (); nrockets1 = nrockets - 1; if (nrockets1 == 0) nrockets1 = 1; for (y = 0; y < size; y++) sizes[y] = -vgatextsize (TEXTH, text2[y]) / 2; gettimeofday (&VlastClk, NULL); gettimeofday (&VnewClk, NULL); VendSleep = VlastClk.tv_usec; #ifdef DEBUG VfTime = 1000000 / 200; #else VfTime = 1000000 / 65; #endif Effect (S_START, next); for (i = -660; i < (size + 5) * TEXTW; i += 1) { gettimeofday (&VnewClk, NULL); if (VnewClk.tv_usec < VendSleep) VendSleep -= 1000000; wait = (VfTime - VnewClk.tv_usec + VendSleep); if (wait >= 0 || tbreak) { CopyVSToVS (starbackground, backscreen); SetScreen (backscreen); EnableClipping (); points (); for (y = 0; y < size; y++) { if (y * TEXTW - i + 2 * TEXTW < 1000 && y * TEXTW - i + TEXTW > -1500) { textcolor = (1200 + (y * TEXTW - i)) * 32 / 2500; if (textcolor <= 0) continue; actu = y; vgadrawtext (sizes[y], y * TEXTW - i, TEXTH, text2[y]); #ifdef OS2DIVE DosSleep (WAIT); #endif } } for (z = 0; z < nrockets; z++) { if(!first) draw_player (MAPWIDTH / 2 - width / 2 + z * width / (nrockets1), playy, playr, z, (int) er); } first=0; CopyToScreen (backscreen); fadein1 (); } else points1 (); width = (200 * (nrockets - 1) * playy / MAPHEIGHT + 20 * (nrockets - 1)) / DIV; if (playy > MAPHEIGHT / 2 || actu > CONTLINE) { playy -= 0.6 / DIV; playr = RAD (180); for (z = 0; z < nrockets; z++) { staraccel ((MAPWIDTH / 2 - width / 2 + z * width / (nrockets1)) * DIV, (playy) * DIV, playr); } er = EYE_RADIUS1; } else { playr += playp; if (playr < RAD (-45)) playp = 0.015, playr = RAD (-45); if (playr > RAD (45)) playp = -0.03, playr = RAD (45); if (actu > UDIVLINE) { /*if (er < 2 * EYE_RADIUS1) erp += 0.1; if (er > 2 * EYE_RADIUS1) erp -= 0.1; */ erp += (2 * EYE_RADIUS1 - er) / 10; erp *= 0.98; er += erp; } } gettimeofday (&VnewClk, NULL); if (VnewClk.tv_usec < VendSleep) VendSleep -= 1000000; wait = (VfTime - VnewClk.tv_usec + VendSleep); if (tbreak) wait = VfTime, tbreak = 0; usleep (wait < 0 ? 0 : wait); VendSleep = VnewClk.tv_usec + wait; gettimeofday (&VlastClk, NULL); UpdateInput (); if (actu > 0) { lkey = key; key = 0; key = Pressed (); if (skey && !key && lkey) { fadeout (); return; } if (!key && lkey) skey = 1; } } fadeout (); } void outro1 () { outro (TEXTSIZE1, text1); } void intro_intro () { outro (INTROSIZE, introtext); } void hole_intro () { outro (HOLESIZE, holetext); } void inspector_intro () { outro (INSPECTORSIZE, inspectortext); } void bball_intro () { outro (BBALLSIZE, bballtext); } void bbball_intro () { outro (BBBALLSIZE, bbballtext); } void maghole_intro () { outro (MAGSIZE, magholetext); } void spring_intro () { outro (SPRINGTSIZE, springtext); } void thief_intro () { outro (THIEFSIZE, thieftext); } void ttool_intro () { outro (TTOOLSIZE, ttooltext); } void finder_intro () { outro (FINDERSIZE, findertext); } void lunatic_intro () { outro (LUNATICSIZE, lunatictext); } koules1.4/COPYING100600 37512 310 43070 6477322207 12130 0ustar rootroot 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 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. koules1.4/nas_sound.c100644 37512 310 10414 6477322207 13236 0ustar rootroot /* NCD Audio format - original code by Dave Lemke */ /* Modified by paul kendall for X Galaga. */ /* * Include file dependencies: */ #ifdef NAS_SOUND #include #ifdef __STDC__ #include #endif #include #include #include #include #include #include #include