From 84bbd12316a7ed2130dd1b2f2bc860a11624c3f3 Mon Sep 17 00:00:00 2001 From: mdw Date: Sun, 2 Mar 2003 12:15:41 +0000 Subject: [PATCH] Initial revision --- alg_data.h | 20 + alg_gfx.c | 771 ++++++++++++++++ alg_main.c | 1447 +++++++++++++++++++++++++++++ alg_main.h | 7 + beep.wav | Bin 0 -> 9256 bytes boop.wav | Bin 0 -> 44490 bytes config.h | 51 + crash.wav | Bin 0 -> 66208 bytes data/blake.bmp | Bin 0 -> 14078 bytes data/danube.mid | Bin 0 -> 46989 bytes data/ecm.bmp | Bin 0 -> 1270 bytes data/elitetx3.bmp | Bin 0 -> 7146 bytes data/greendot.bmp | Bin 0 -> 1190 bytes data/missgrn.bmp | Bin 0 -> 1198 bytes data/missred.bmp | Bin 0 -> 1198 bytes data/missyell.bmp | Bin 0 -> 1198 bytes data/reddot.bmp | Bin 0 -> 1190 bytes data/safe.bmp | Bin 0 -> 1270 bytes data/theme.mid | Bin 0 -> 16843 bytes data/verd2.pcx | Bin 0 -> 12671 bytes data/verd4.pcx | Bin 0 -> 18073 bytes dock.wav | Bin 0 -> 225342 bytes docked.c | 1382 +++++++++++++++++++++++++++ docked.h | 43 + ecm.wav | Bin 0 -> 139652 bytes elite.c | 156 ++++ elite.dat | Bin 0 -> 112142 bytes elite.h | 167 ++++ explode.wav | Bin 0 -> 140916 bytes file.c | 328 +++++++ file.h | 28 + gameover.wav | Bin 0 -> 150088 bytes gfx.h | 156 ++++ hitem.wav | Bin 0 -> 25052 bytes hyper.wav | Bin 0 -> 232914 bytes incom1.wav | Bin 0 -> 25296 bytes incom2.wav | Bin 0 -> 31896 bytes intro.c | 134 +++ intro.h | 24 + keyboard.c | 166 ++++ keyboard.h | 69 ++ launch.wav | Bin 0 -> 202404 bytes main.h | 24 + makefile | 73 ++ makefile-linux | 92 ++ menu.h | 5 + missile.wav | Bin 0 -> 165148 bytes missions.c | 353 +++++++ missions.h | 7 + newkind.cfg | 7 + newkind.ico | Bin 0 -> 766 bytes newscan.cfg | 12 + nkres.rc | 1 + options.c | 366 ++++++++ options.h | 33 + pilot.c | 294 ++++++ pilot.h | 28 + planet.c | 510 ++++++++++ planet.h | 55 ++ pulse.wav | Bin 0 -> 36030 bytes random.c | 64 ++ random.h | 28 + readme.txt | 300 ++++++ scanner.bmp | Bin 0 -> 67126 bytes shipdata.c | 2671 +++++++++++++++++++++++++++++++++++++++++++++++++++++ shipdata.h | 151 +++ shipface.c | 707 ++++++++++++++ shipface.h | 44 + sound.c | 145 +++ sound.h | 47 + space.c | 1303 ++++++++++++++++++++++++++ space.h | 92 ++ stars.c | 397 ++++++++ stars.h | 11 + swat.c | 1241 +++++++++++++++++++++++++ swat.h | 48 + threed.c | 1013 ++++++++++++++++++++ threed.h | 24 + trade.c | 191 ++++ trade.h | 47 + vector.c | 176 ++++ vector.h | 36 + 82 files changed, 15545 insertions(+) create mode 100644 alg_data.h create mode 100644 alg_gfx.c create mode 100644 alg_main.c create mode 100644 alg_main.h create mode 100644 beep.wav create mode 100644 boop.wav create mode 100644 config.h create mode 100644 crash.wav create mode 100644 data/blake.bmp create mode 100644 data/danube.mid create mode 100644 data/ecm.bmp create mode 100644 data/elitetx3.bmp create mode 100644 data/greendot.bmp create mode 100644 data/missgrn.bmp create mode 100644 data/missred.bmp create mode 100644 data/missyell.bmp create mode 100644 data/reddot.bmp create mode 100644 data/safe.bmp create mode 100644 data/theme.mid create mode 100644 data/verd2.pcx create mode 100644 data/verd4.pcx create mode 100644 dock.wav create mode 100644 docked.c create mode 100644 docked.h create mode 100644 ecm.wav create mode 100644 elite.c create mode 100644 elite.dat create mode 100644 elite.h create mode 100644 explode.wav create mode 100644 file.c create mode 100644 file.h create mode 100644 gameover.wav create mode 100644 gfx.h create mode 100644 hitem.wav create mode 100644 hyper.wav create mode 100644 incom1.wav create mode 100644 incom2.wav create mode 100644 intro.c create mode 100644 intro.h create mode 100644 keyboard.c create mode 100644 keyboard.h create mode 100644 launch.wav create mode 100644 main.h create mode 100644 makefile create mode 100644 makefile-linux create mode 100644 menu.h create mode 100644 missile.wav create mode 100644 missions.c create mode 100644 missions.h create mode 100644 newkind.cfg create mode 100644 newkind.ico create mode 100644 newscan.cfg create mode 100644 nkres.rc create mode 100644 options.c create mode 100644 options.h create mode 100644 pilot.c create mode 100644 pilot.h create mode 100644 planet.c create mode 100644 planet.h create mode 100644 pulse.wav create mode 100644 random.c create mode 100644 random.h create mode 100644 readme.txt create mode 100644 scanner.bmp create mode 100644 shipdata.c create mode 100644 shipdata.h create mode 100644 shipface.c create mode 100644 shipface.h create mode 100644 sound.c create mode 100644 sound.h create mode 100644 space.c create mode 100644 space.h create mode 100644 stars.c create mode 100644 stars.h create mode 100644 swat.c create mode 100644 swat.h create mode 100644 threed.c create mode 100644 threed.h create mode 100644 trade.c create mode 100644 trade.h create mode 100644 vector.c create mode 100644 vector.h diff --git a/alg_data.h b/alg_data.h new file mode 100644 index 0000000..fd24597 --- /dev/null +++ b/alg_data.h @@ -0,0 +1,20 @@ +/* Allegro datafile object indexes, produced by grabber v3.9.32 (WIP), Mingw32 */ +/* Datafile: c:\usr\cprogs\NewKind\elite.dat */ +/* Date: Mon May 07 19:20:00 2001 */ +/* Do not hand edit! */ + +#define BLAKE 0 /* BMP */ +#define DANUBE 1 /* MIDI */ +#define ECM 2 /* BMP */ +#define ELITE_1 3 /* FONT */ +#define ELITE_2 4 /* FONT */ +#define ELITETXT 5 /* BMP */ +#define FRONTV 6 /* BMP */ +#define GRNDOT 7 /* BMP */ +#define MISSILE_G 8 /* BMP */ +#define MISSILE_R 9 /* BMP */ +#define MISSILE_Y 10 /* BMP */ +#define REDDOT 11 /* BMP */ +#define SAFE 12 /* BMP */ +#define THEME 13 /* MIDI */ + diff --git a/alg_gfx.c b/alg_gfx.c new file mode 100644 index 0000000..222b0c0 --- /dev/null +++ b/alg_gfx.c @@ -0,0 +1,771 @@ +/** + * + * Elite - The New Kind. + * + * Allegro version of Graphics routines. + * + * The code in this file has not been derived from the original Elite code. + * Written by C.J.Pinder 1999-2001. + * email: + * + * Routines for drawing anti-aliased lines and circles by T.Harte. + * + **/ + +#include +#include +#include +#include +#include + +#include "allegro.h" + +#include "config.h" +#include "gfx.h" +#include "alg_data.h" +#include "elite.h" + +BITMAP *gfx_screen; +volatile int frame_count; +DATAFILE *datafile; +BITMAP *scanner_image; + +#define MAX_POLYS 100 + +static int start_poly; +static int total_polys; + +struct poly_data +{ + int z; + int no_points; + int face_colour; + int point_list[16]; + int next; +}; + +static struct poly_data poly_chain[MAX_POLYS]; + + + + +void frame_timer (void) +{ + frame_count++; +} +END_OF_FUNCTION(frame_timer); + + + +int gfx_graphics_startup (void) +{ + PALETTE the_palette; + int rv; + +#ifdef ALLEGRO_WINDOWS + +#ifdef RES_512_512 + rv = set_gfx_mode(GFX_DIRECTX_OVL, 512, 512, 0, 0); + + if (rv != 0) + rv = set_gfx_mode(GFX_DIRECTX_WIN, 512, 512, 0, 0); + + if (rv != 0) + rv = set_gfx_mode(GFX_GDI, 512, 512, 0, 0); + + if (rv == 0) + set_display_switch_mode (SWITCH_BACKGROUND); +#else + rv = set_gfx_mode(GFX_DIRECTX, 800, 600, 0, 0); + + if (rv != 0) + rv = set_gfx_mode(GFX_GDI, 800, 600, 0, 0); +#endif + +#else + rv = set_gfx_mode(GFX_AUTODETECT, 800, 600, 0, 0); +#endif + + if (rv != 0) + { + set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); + allegro_message("Unable to set graphics mode."); + return 1; + } + + datafile = load_datafile("elite.dat"); + if (!datafile) + { + set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); + allegro_message("Error loading %s!\n", "elite.dat"); + return 1; + } + + scanner_image = load_bitmap(scanner_filename, the_palette); + if (!scanner_image) + { + set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); + allegro_message("Error reading scanner bitmap file.\n"); + return 1; + } + + /* select the scanner palette */ + set_palette(the_palette); + + /* Create the screen buffer bitmap */ + gfx_screen = create_bitmap (SCREEN_W, SCREEN_H); + + clear (gfx_screen); + + blit (scanner_image, gfx_screen, 0, 0, GFX_X_OFFSET, 385+GFX_Y_OFFSET, scanner_image->w, scanner_image->h); + gfx_draw_line (0, 0, 0, 384); + gfx_draw_line (0, 0, 511, 0); + gfx_draw_line (511, 0, 511, 384); + + /* Install a timer to regulate the speed of the game... */ + + LOCK_VARIABLE(frame_count); + LOCK_FUNCTION(frame_timer); + frame_count = 0; + install_int (frame_timer, speed_cap); + + return 0; +} + + +void gfx_graphics_shutdown (void) +{ + destroy_bitmap(scanner_image); + destroy_bitmap(gfx_screen); + unload_datafile(datafile); +} + + +/* + * Blit the back buffer to the screen. + */ + +void gfx_update_screen (void) +{ + while (frame_count < 1) + rest (10); + frame_count = 0; + + acquire_screen(); + blit (gfx_screen, screen, GFX_X_OFFSET, GFX_Y_OFFSET, GFX_X_OFFSET, GFX_Y_OFFSET, 512, 512); + release_screen(); +} + + +void gfx_acquire_screen (void) +{ + acquire_bitmap (gfx_screen); +} + + +void gfx_release_screen (void) +{ + release_bitmap(gfx_screen); +} + +void gfx_fast_plot_pixel (int x, int y, int col) +{ +// _putpixel(gfx_screen, x, y, col); + gfx_screen->line[y][x] = col; +} + + +void gfx_plot_pixel (int x, int y, int col) +{ + putpixel (gfx_screen, x + GFX_X_OFFSET, y + GFX_Y_OFFSET, col); +} + + +void gfx_draw_filled_circle (int cx, int cy, int radius, int circle_colour) +{ + circlefill (gfx_screen, cx + GFX_X_OFFSET, cy + GFX_Y_OFFSET, radius, circle_colour); +} + + +#define AA_BITS 3 +#define AA_AND 7 +#define AA_BASE 235 + +#define trunc(x) ((x) & ~65535) +#define frac(x) ((x) & 65535) +#define invfrac(x) (65535-frac(x)) +#define plot(x,y,c) putpixel(gfx_screen, (x), (y), (c)+AA_BASE) + +/* + * Draw anti-aliased wireframe circle. + * By T.Harte. + */ + +void gfx_draw_aa_circle(int cx, int cy, int radius) +{ + int x,y; + int s; + int sx, sy; + + cx += GFX_X_OFFSET; + cy += GFX_Y_OFFSET; + + radius >>= (16 - AA_BITS); + + x = radius; + s = -radius; + y = 0; + + while (y <= x) + { + //wide pixels + sx = cx + (x >> AA_BITS); sy = cy + (y >> AA_BITS); + + plot(sx, sy, AA_AND - (x&AA_AND)); + plot(sx + 1, sy, x&AA_AND); + + sy = cy - (y >> AA_BITS); + + plot(sx, sy, AA_AND - (x&AA_AND)); + plot(sx + 1, sy, x&AA_AND); + + sx = cx - (x >> AA_BITS); + + plot(sx, sy, AA_AND - (x&AA_AND)); + plot(sx - 1, sy, x&AA_AND); + + sy = cy + (y >> AA_BITS); + + plot(sx, sy, AA_AND - (x&AA_AND)); + plot(sx - 1, sy, x&AA_AND); + + //tall pixels + sx = cx + (y >> AA_BITS); sy = cy + (x >> AA_BITS); + + plot(sx, sy, AA_AND - (x&AA_AND)); + plot(sx, sy + 1, x&AA_AND); + + sy = cy - (x >> AA_BITS); + + plot(sx, sy, AA_AND - (x&AA_AND)); + plot(sx, sy - 1, x&AA_AND); + + sx = cx - (y >> AA_BITS); + + plot(sx, sy, AA_AND - (x&AA_AND)); + plot(sx, sy - 1, x&AA_AND); + + sy = cy + (x >> AA_BITS); + + plot(sx, sy, AA_AND - (x&AA_AND)); + plot(sx, sy + 1, x&AA_AND); + + s += AA_AND+1 + (y << (AA_BITS+1)) + ((1 << (AA_BITS+2))-2); + y += AA_AND+1; + + while(s >= 0) + { + s -= (x << 1) + 2; + x --; + } + } +} + + +/* + * Draw anti-aliased line. + * By T.Harte. + */ + +void gfx_draw_aa_line (int x1, int y1, int x2, int y2) +{ + fixed grad, xd, yd; + fixed xgap, ygap, xend, yend, xf, yf; + fixed brightness1, brightness2, swap; + + int x, y, ix1, ix2, iy1, iy2; + + x1 += itofix(GFX_X_OFFSET); + x2 += itofix(GFX_X_OFFSET); + y1 += itofix(GFX_Y_OFFSET); + y2 += itofix(GFX_Y_OFFSET); + + xd = x2 - x1; + yd = y2 - y1; + + if (abs(xd) > abs(yd)) + { + if(x1 > x2) + { + swap = x1; x1 = x2; x2 = swap; + swap = y1; y1 = y2; y2 = swap; + xd = -xd; + yd = -yd; + } + + grad = fdiv(yd, xd); + + //end point 1 + + xend = trunc(x1 + 32768); + yend = y1 + fmul(grad, xend-x1); + + xgap = invfrac(x1+32768); + + ix1 = xend >> 16; + iy1 = yend >> 16; + + brightness1 = fmul(invfrac(yend), xgap); + brightness2 = fmul(frac(yend), xgap); + + plot(ix1, iy1, brightness1 >> (16-AA_BITS)); + plot(ix1, iy1+1, brightness2 >> (16-AA_BITS)); + + yf = yend+grad; + + //end point 2; + + xend = trunc(x2 + 32768); + yend = y2 + fmul(grad, xend-x2); + + xgap = invfrac(x2 - 32768); + + ix2 = xend >> 16; + iy2 = yend >> 16; + + brightness1 = fmul(invfrac(yend), xgap); + brightness2 = fmul(frac(yend), xgap); + + plot(ix2, iy2, brightness1 >> (16-AA_BITS)); + plot(ix2, iy2+1, brightness2 >> (16-AA_BITS)); + + for(x = ix1+1; x <= ix2-1; x++) + { + brightness1 = invfrac(yf); + brightness2 = frac(yf); + + plot(x, (yf >> 16), brightness1 >> (16-AA_BITS)); + plot(x, 1+(yf >> 16), brightness2 >> (16-AA_BITS)); + + yf += grad; + } + } + else + { + if(y1 > y2) + { + swap = x1; x1 = x2; x2 = swap; + swap = y1; y1 = y2; y2 = swap; + xd = -xd; + yd = -yd; + } + + grad = fdiv(xd, yd); + + //end point 1 + + yend = trunc(y1 + 32768); + xend = x1 + fmul(grad, yend-y1); + + ygap = invfrac(y1+32768); + + iy1 = yend >> 16; + ix1 = xend >> 16; + + brightness1 = fmul(invfrac(xend), ygap); + brightness2 = fmul(frac(xend), ygap); + + plot(ix1, iy1, brightness1 >> (16-AA_BITS)); + plot(ix1+1, iy1, brightness2 >> (16-AA_BITS)); + + xf = xend+grad; + + //end point 2; + + yend = trunc(y2 + 32768); + xend = x2 + fmul(grad, yend-y2); + + ygap = invfrac(y2 - 32768); + + ix2 = xend >> 16; + iy2 = yend >> 16; + + brightness1 = fmul(invfrac(xend), ygap); + brightness2 = fmul(frac(xend), ygap); + + plot(ix2, iy2, brightness1 >> (16-AA_BITS)); + plot(ix2+1, iy2, brightness2 >> (16-AA_BITS)); + + for(y = iy1+1; y <= iy2-1; y++) + { + brightness1 = invfrac(xf); + brightness2 = frac(xf); + + plot((xf >> 16), y, brightness1 >> (16-AA_BITS)); + plot(1+(xf >> 16), y, brightness2 >> (16-AA_BITS)); + + xf += grad; + } + } +} + +#undef trunc +#undef frac +#undef invfrac +#undef plot + +#undef AA_BITS +#undef AA_AND +#undef AA_BASE + + + +void gfx_draw_circle (int cx, int cy, int radius, int circle_colour) +{ + if (anti_alias_gfx && (circle_colour == GFX_COL_WHITE)) + gfx_draw_aa_circle (cx, cy, itofix(radius)); + else + circle (gfx_screen, cx + GFX_X_OFFSET, cy + GFX_Y_OFFSET, radius, circle_colour); +} + + + +void gfx_draw_line (int x1, int y1, int x2, int y2) +{ + if (y1 == y2) + { + hline (gfx_screen, x1 + GFX_X_OFFSET, y1 + GFX_Y_OFFSET, x2 + GFX_X_OFFSET, GFX_COL_WHITE); + return; + } + + if (x1 == x2) + { + vline (gfx_screen, x1 + GFX_X_OFFSET, y1 + GFX_Y_OFFSET, y2 + GFX_Y_OFFSET, GFX_COL_WHITE); + return; + } + + if (anti_alias_gfx) + gfx_draw_aa_line (itofix(x1), itofix(y1), itofix(x2), itofix(y2)); + else + line (gfx_screen, x1 + GFX_X_OFFSET, y1 + GFX_Y_OFFSET, x2 + GFX_X_OFFSET, y2 + GFX_Y_OFFSET, GFX_COL_WHITE); +} + + + +void gfx_draw_colour_line (int x1, int y1, int x2, int y2, int line_colour) +{ + if (y1 == y2) + { + hline (gfx_screen, x1 + GFX_X_OFFSET, y1 + GFX_Y_OFFSET, x2 + GFX_X_OFFSET, line_colour); + return; + } + + if (x1 == x2) + { + vline (gfx_screen, x1 + GFX_X_OFFSET, y1 + GFX_Y_OFFSET, y2 + GFX_Y_OFFSET, line_colour); + return; + } + + if (anti_alias_gfx && (line_colour == GFX_COL_WHITE)) + gfx_draw_aa_line (itofix(x1), itofix(y1), itofix(x2), itofix(y2)); + else + line (gfx_screen, x1 + GFX_X_OFFSET, y1 + GFX_Y_OFFSET, x2 + GFX_X_OFFSET, y2 + GFX_Y_OFFSET, line_colour); +} + + + +void gfx_draw_triangle (int x1, int y1, int x2, int y2, int x3, int y3, int col) +{ + triangle (gfx_screen, x1 + GFX_X_OFFSET, y1 + GFX_Y_OFFSET, x2 + GFX_X_OFFSET, y2 + GFX_Y_OFFSET, + x3 + GFX_X_OFFSET, y3 + GFX_Y_OFFSET, col); +} + + + +void gfx_display_text (int x, int y, char *txt) +{ + text_mode (-1); + textout (gfx_screen, datafile[ELITE_1].dat, txt, (x / (2 / GFX_SCALE)) + GFX_X_OFFSET, (y / (2 / GFX_SCALE)) + GFX_Y_OFFSET, GFX_COL_WHITE); +} + + +void gfx_display_colour_text (int x, int y, char *txt, int col) +{ + text_mode (-1); + textout (gfx_screen, datafile[ELITE_1].dat, txt, (x / (2 / GFX_SCALE)) + GFX_X_OFFSET, (y / (2 / GFX_SCALE)) + GFX_Y_OFFSET, col); +} + + + +void gfx_display_centre_text (int y, char *str, int psize, int col) +{ + int txt_size; + int txt_colour; + + if (psize == 140) + { + txt_size = ELITE_2; + txt_colour = -1; + } + else + { + txt_size = ELITE_1; + txt_colour = col; + } + + text_mode (-1); + textout_centre (gfx_screen, datafile[txt_size].dat, str, (128 * GFX_SCALE) + GFX_X_OFFSET, (y / (2 / GFX_SCALE)) + GFX_Y_OFFSET, txt_colour); +} + + +void gfx_clear_display (void) +{ + rectfill (gfx_screen, GFX_X_OFFSET + 1, GFX_Y_OFFSET + 1, 510 + GFX_X_OFFSET, 383 + GFX_Y_OFFSET, GFX_COL_BLACK); +} + +void gfx_clear_text_area (void) +{ + rectfill (gfx_screen, GFX_X_OFFSET + 1, GFX_Y_OFFSET + 340, 510 + GFX_X_OFFSET, 383 + GFX_Y_OFFSET, GFX_COL_BLACK); +} + + +void gfx_clear_area (int tx, int ty, int bx, int by) +{ + rectfill (gfx_screen, tx + GFX_X_OFFSET, ty + GFX_Y_OFFSET, + bx + GFX_X_OFFSET, by + GFX_Y_OFFSET, GFX_COL_BLACK); +} + +void gfx_draw_rectangle (int tx, int ty, int bx, int by, int col) +{ + rectfill (gfx_screen, tx + GFX_X_OFFSET, ty + GFX_Y_OFFSET, + bx + GFX_X_OFFSET, by + GFX_Y_OFFSET, col); +} + + +void gfx_display_pretty_text (int tx, int ty, int bx, int by, char *txt) +{ + char strbuf[100]; + char *str; + char *bptr; + int len; + int pos; + int maxlen; + + maxlen = (bx - tx) / 8; + + str = txt; + len = strlen(txt); + + while (len > 0) + { + pos = maxlen; + if (pos > len) + pos = len; + + while ((str[pos] != ' ') && (str[pos] != ',') && + (str[pos] != '.') && (str[pos] != '\0')) + { + pos--; + } + + len = len - pos - 1; + + for (bptr = strbuf; pos >= 0; pos--) + *bptr++ = *str++; + + *bptr = '\0'; + + text_mode (-1); + textout (gfx_screen, datafile[ELITE_1].dat, strbuf, tx + GFX_X_OFFSET, ty + GFX_Y_OFFSET, GFX_COL_WHITE); + ty += (8 * GFX_SCALE); + } +} + + +void gfx_draw_scanner (void) +{ + blit (scanner_image, gfx_screen, 0, 0, GFX_X_OFFSET, 385+GFX_Y_OFFSET, scanner_image->w, scanner_image->h); +} + +void gfx_set_clip_region (int tx, int ty, int bx, int by) +{ + set_clip (gfx_screen, tx + GFX_X_OFFSET, ty + GFX_Y_OFFSET, bx + GFX_X_OFFSET, by + GFX_Y_OFFSET); +} + + +void gfx_start_render (void) +{ + start_poly = 0; + total_polys = 0; +} + + +void gfx_render_polygon (int num_points, int *point_list, int face_colour, int zavg) +{ + int i; + int x; + int nx; + + if (total_polys == MAX_POLYS) + return; + + x = total_polys; + total_polys++; + + poly_chain[x].no_points = num_points; + poly_chain[x].face_colour = face_colour; + poly_chain[x].z = zavg; + poly_chain[x].next = -1; + + for (i = 0; i < 16; i++) + poly_chain[x].point_list[i] = point_list[i]; + + if (x == 0) + return; + + if (zavg > poly_chain[start_poly].z) + { + poly_chain[x].next = start_poly; + start_poly = x; + return; + } + + for (i = start_poly; poly_chain[i].next != -1; i = poly_chain[i].next) + { + nx = poly_chain[i].next; + + if (zavg > poly_chain[nx].z) + { + poly_chain[i].next = x; + poly_chain[x].next = nx; + return; + } + } + + poly_chain[i].next = x; +} + + +void gfx_render_line (int x1, int y1, int x2, int y2, int dist, int col) +{ + int point_list[4]; + + point_list[0] = x1; + point_list[1] = y1; + point_list[2] = x2; + point_list[3] = y2; + + gfx_render_polygon (2, point_list, col, dist); +} + + +void gfx_finish_render (void) +{ + int num_points; + int *pl; + int i; + int col; + + if (total_polys == 0) + return; + + for (i = start_poly; i != -1; i = poly_chain[i].next) + { + num_points = poly_chain[i].no_points; + pl = poly_chain[i].point_list; + col = poly_chain[i].face_colour; + + if (num_points == 2) + { + gfx_draw_colour_line (pl[0], pl[1], pl[2], pl[3], col); + continue; + } + + gfx_polygon (num_points, pl, col); + }; +} + + +void gfx_polygon (int num_points, int *poly_list, int face_colour) +{ + int i; + int x,y; + + x = 0; + y = 1; + for (i = 0; i < num_points; i++) + { + poly_list[x] += GFX_X_OFFSET; + poly_list[y] += GFX_Y_OFFSET; + x += 2; + y += 2; + } + + polygon (gfx_screen, num_points, poly_list, face_colour); +} + + +void gfx_draw_sprite (int sprite_no, int x, int y) +{ + BITMAP *sprite_bmp; + + switch (sprite_no) + { + case IMG_GREEN_DOT: + sprite_bmp = datafile[GRNDOT].dat; + break; + + case IMG_RED_DOT: + sprite_bmp = datafile[REDDOT].dat; + break; + + case IMG_BIG_S: + sprite_bmp = datafile[SAFE].dat; + break; + + case IMG_ELITE_TXT: + sprite_bmp = datafile[ELITETXT].dat; + break; + + case IMG_BIG_E: + sprite_bmp = datafile[ECM].dat; + break; + + case IMG_BLAKE: + sprite_bmp = datafile[BLAKE].dat; + break; + + case IMG_MISSILE_GREEN: + sprite_bmp = datafile[MISSILE_G].dat; + break; + + case IMG_MISSILE_YELLOW: + sprite_bmp = datafile[MISSILE_Y].dat; + break; + + case IMG_MISSILE_RED: + sprite_bmp = datafile[MISSILE_R].dat; + break; + + default: + return; + } + + if (x == -1) + x = ((256 * GFX_SCALE) - sprite_bmp->w) / 2; + + draw_sprite (gfx_screen, sprite_bmp, x + GFX_X_OFFSET, y + GFX_Y_OFFSET); +} + + +int gfx_request_file (char *title, char *path, char *ext) +{ + int okay; + + show_mouse (screen); + okay = file_select (title, path, ext); + show_mouse (NULL); + + return okay; +} + diff --git a/alg_main.c b/alg_main.c new file mode 100644 index 0000000..ef1246e --- /dev/null +++ b/alg_main.c @@ -0,0 +1,1447 @@ +/* + * Elite - The New Kind. + * + * Reverse engineered from the BBC disk version of Elite. + * Additional material by C.J.Pinder. + * + * The original Elite code is (C) I.Bell & D.Braben 1984. + * This version re-engineered in C by C.J.Pinder 1999-2001. + * + * email: + * + * + */ + +/* + * alg_main.c + * + * Allegro version of the main game handler. + */ + + +#include +#include +#include +#include +#include +#include + +#include "allegro.h" + +#include "config.h" +#include "gfx.h" +#include "main.h" +#include "vector.h" +#include "alg_data.h" +#include "elite.h" +#include "docked.h" +#include "intro.h" +#include "shipdata.h" +#include "shipface.h" +#include "space.h" +#include "sound.h" +#include "threed.h" +#include "swat.h" +#include "random.h" +#include "options.h" +#include "stars.h" +#include "missions.h" +#include "pilot.h" +#include "file.h" +#include "keyboard.h" + + + +int old_cross_x, old_cross_y; +int cross_timer; + +int draw_lasers; +int mcount; +int message_count; +char message_string[80]; +int rolling; +int climbing; +int game_paused; +int have_joystick; + +int find_input; +char find_name[20]; + + + +/* + * Initialise the game parameters. + */ + +void initialise_game(void) +{ + set_rand_seed (time(NULL)); + current_screen = SCR_INTRO_ONE; + + restore_saved_commander(); + + flight_speed = 1; + flight_roll = 0; + flight_climb = 0; + docked = 1; + front_shield = 255; + aft_shield = 255; + energy = 255; + draw_lasers = 0; + mcount = 0; + hyper_ready = 0; + detonate_bomb = 0; + find_input = 0; + witchspace = 0; + game_paused = 0; + auto_pilot = 0; + + create_new_stars(); + clear_universe(); + + cross_x = -1; + cross_y = -1; + cross_timer = 0; + + + myship.max_speed = 40; /* 0.27 Light Mach */ + myship.max_roll = 31; + myship.max_climb = 8; /* CF 8 */ + myship.max_fuel = 70; /* 7.0 Light Years */ +} + + +void finish_game (void) +{ + finish = 1; + game_over = 1; +} + + + + + + + +/* + * Move the planet chart cross hairs to specified position. + */ + + +void move_cross (int dx, int dy) +{ + cross_timer = 5; + + if (current_screen == SCR_SHORT_RANGE) + { + cross_x += (dx * 4); + cross_y += (dy * 4); + return; + } + + if (current_screen == SCR_GALACTIC_CHART) + { + cross_x += (dx * 2); + cross_y += (dy * 2); + + if (cross_x < 1) + cross_x = 1; + + if (cross_x > 510) + cross_x = 510; + + if (cross_y < 37) + cross_y = 37; + + if (cross_y > 293) + cross_y = 293; + } +} + + +/* + * Draw the cross hairs at the specified position. + */ + +void draw_cross (int cx, int cy) +{ + if (current_screen == SCR_SHORT_RANGE) + { + gfx_set_clip_region (1, 37, 510, 339); + xor_mode (TRUE); + gfx_draw_colour_line (cx - 16, cy, cx + 16, cy, GFX_COL_RED); + gfx_draw_colour_line (cx, cy - 16, cx, cy + 16, GFX_COL_RED); + xor_mode (FALSE); + gfx_set_clip_region (1, 1, 510, 383); + return; + } + + if (current_screen == SCR_GALACTIC_CHART) + { + gfx_set_clip_region (1, 37, 510, 293); + xor_mode (TRUE); + gfx_draw_colour_line (cx - 8, cy, cx + 8, cy, GFX_COL_RED); + gfx_draw_colour_line (cx, cy - 8, cx, cy + 8, GFX_COL_RED); + xor_mode (FALSE); + gfx_set_clip_region (1, 1, 510, 383); + } +} + + + +void draw_laser_sights(void) +{ + int laser = 0; + int x1,y1,x2,y2; + + switch (current_screen) + { + case SCR_FRONT_VIEW: + gfx_display_centre_text (32, "Front View", 120, GFX_COL_WHITE); + laser = cmdr.front_laser; + break; + + case SCR_REAR_VIEW: + gfx_display_centre_text (32, "Rear View", 120, GFX_COL_WHITE); + laser = cmdr.rear_laser; + break; + + case SCR_LEFT_VIEW: + gfx_display_centre_text (32, "Left View", 120, GFX_COL_WHITE); + laser = cmdr.left_laser; + break; + + case SCR_RIGHT_VIEW: + gfx_display_centre_text (32, "Right View", 120, GFX_COL_WHITE); + laser = cmdr.right_laser; + break; + } + + + if (laser) + { + x1 = 128 * GFX_SCALE; + y1 = (96-8) * GFX_SCALE; + y2 = (96-16) * GFX_SCALE; + + gfx_draw_colour_line (x1-1, y1, x1-1, y2, GFX_COL_GREY_1); + gfx_draw_colour_line (x1, y1, x1, y2, GFX_COL_WHITE); + gfx_draw_colour_line (x1+1, y1, x1+1, y2, GFX_COL_GREY_1); + + y1 = (96+8) * GFX_SCALE; + y2 = (96+16) * GFX_SCALE; + + gfx_draw_colour_line (x1-1, y1, x1-1, y2, GFX_COL_GREY_1); + gfx_draw_colour_line (x1, y1, x1, y2, GFX_COL_WHITE); + gfx_draw_colour_line (x1+1, y1, x1+1, y2, GFX_COL_GREY_1); + + x1 = (128-8) * GFX_SCALE; + y1 = 96 * GFX_SCALE; + x2 = (128-16) * GFX_SCALE; + + gfx_draw_colour_line (x1, y1-1, x2, y1-1, GFX_COL_GREY_1); + gfx_draw_colour_line (x1, y1, x2, y1, GFX_COL_WHITE); + gfx_draw_colour_line (x1, y1+1, x2, y1+1, GFX_COL_GREY_1); + + x1 = (128+8) * GFX_SCALE; + x2 = (128+16) * GFX_SCALE; + + gfx_draw_colour_line (x1, y1-1, x2, y1-1, GFX_COL_GREY_1); + gfx_draw_colour_line (x1, y1, x2, y1, GFX_COL_WHITE); + gfx_draw_colour_line (x1, y1+1, x2, y1+1, GFX_COL_GREY_1); + } +} + + +void arrow_right (void) +{ + switch (current_screen) + { + case SCR_MARKET_PRICES: + buy_stock(); + break; + + case SCR_SETTINGS: + select_right_setting(); + break; + + case SCR_SHORT_RANGE: + case SCR_GALACTIC_CHART: + move_cross(1, 0); + break; + + case SCR_FRONT_VIEW: + case SCR_REAR_VIEW: + case SCR_RIGHT_VIEW: + case SCR_LEFT_VIEW: + if (flight_roll > 0) + flight_roll = 0; + else + { + decrease_flight_roll(); + decrease_flight_roll(); + rolling = 1; + } + break; + } +} + + +void arrow_left (void) +{ + switch (current_screen) + { + case SCR_MARKET_PRICES: + sell_stock(); + break; + + case SCR_SETTINGS: + select_left_setting(); + break; + + case SCR_SHORT_RANGE: + case SCR_GALACTIC_CHART: + move_cross (-1, 0); + break; + + case SCR_FRONT_VIEW: + case SCR_REAR_VIEW: + case SCR_RIGHT_VIEW: + case SCR_LEFT_VIEW: + if (flight_roll < 0) + flight_roll = 0; + else + { + increase_flight_roll(); + increase_flight_roll(); + rolling = 1; + } + break; + } +} + + +void arrow_up (void) +{ + switch (current_screen) + { + case SCR_MARKET_PRICES: + select_previous_stock(); + break; + + case SCR_EQUIP_SHIP: + select_previous_equip(); + break; + + case SCR_OPTIONS: + select_previous_option(); + break; + + case SCR_SETTINGS: + select_up_setting(); + break; + + case SCR_SHORT_RANGE: + case SCR_GALACTIC_CHART: + move_cross (0, -1); + break; + + case SCR_FRONT_VIEW: + case SCR_REAR_VIEW: + case SCR_RIGHT_VIEW: + case SCR_LEFT_VIEW: + if (flight_climb > 0) + flight_climb = 0; + else + { + decrease_flight_climb(); + } + climbing = 1; + break; + } +} + + + +void arrow_down (void) +{ + switch (current_screen) + { + case SCR_MARKET_PRICES: + select_next_stock(); + break; + + case SCR_EQUIP_SHIP: + select_next_equip(); + break; + + case SCR_OPTIONS: + select_next_option(); + break; + + case SCR_SETTINGS: + select_down_setting(); + break; + + case SCR_SHORT_RANGE: + case SCR_GALACTIC_CHART: + move_cross (0, 1); + break; + + case SCR_FRONT_VIEW: + case SCR_REAR_VIEW: + case SCR_RIGHT_VIEW: + case SCR_LEFT_VIEW: + if (flight_climb < 0) + flight_climb = 0; + else + { + increase_flight_climb(); + } + climbing = 1; + break; + + } +} + + +void return_pressed (void) +{ + switch (current_screen) + { + case SCR_EQUIP_SHIP: + buy_equip(); + break; + + case SCR_OPTIONS: + do_option(); + break; + + case SCR_SETTINGS: + toggle_setting(); + break; + } +} + + +void y_pressed (void) +{ + switch (current_screen) + { + case SCR_QUIT: + finish_game(); + break; + } +} + + +void n_pressed (void) +{ + switch (current_screen) + { + case SCR_QUIT: + if (docked) + display_commander_status(); + else + current_screen = SCR_FRONT_VIEW; + break; + } +} + + +void d_pressed (void) +{ + switch (current_screen) + { + case SCR_GALACTIC_CHART: + case SCR_SHORT_RANGE: + show_distance_to_planet(); + break; + + case SCR_FRONT_VIEW: + case SCR_REAR_VIEW: + case SCR_RIGHT_VIEW: + case SCR_LEFT_VIEW: + if (auto_pilot) + disengage_auto_pilot(); + break; + } +} + + +void f_pressed (void) +{ + if ((current_screen == SCR_GALACTIC_CHART) || + (current_screen == SCR_SHORT_RANGE)) + { + find_input = 1; + *find_name = '\0'; + gfx_clear_text_area(); + gfx_display_text (16, 340, "Planet Name?"); + } +} + + +void add_find_char (int letter) +{ + char str[40]; + + if (strlen (find_name) == 16) + return; + + str[0] = toupper (letter); + str[1] = '\0'; + strcat (find_name, str); + + sprintf (str, "Planet Name? %s", find_name); + gfx_clear_text_area (); + gfx_display_text(16, 340, str); +} + + +void delete_find_char (void) +{ + char str[40]; + int len; + + len = strlen (find_name); + if (len == 0) + return; + + find_name[len - 1] = '\0'; + + sprintf (str, "Planet Name? %s", find_name); + gfx_clear_text_area(); + gfx_display_text(16, 340, str); +} + +void o_pressed() +{ + switch (current_screen) + { + case SCR_GALACTIC_CHART: + case SCR_SHORT_RANGE: + move_cursor_to_origin(); + break; + } +} + + +void auto_dock (void) +{ + struct univ_object ship; + + ship.location.x = 0; + ship.location.y = 0; + ship.location.z = 0; + + set_init_matrix (ship.rotmat); + ship.rotmat[2].z = 1; + ship.rotmat[0].x = -1; + ship.type = -96; + ship.velocity = flight_speed; + ship.acceleration = 0; + ship.bravery = 0; + ship.rotz = 0; + ship.rotx = 0; + + auto_pilot_ship (&ship); + + if (ship.velocity > 22) + flight_speed = 22; + else + flight_speed = ship.velocity; + + if (ship.acceleration > 0) + { + flight_speed++; + if (flight_speed > 22) + flight_speed = 22; + } + + if (ship.acceleration < 0) + { + flight_speed--; + if (flight_speed < 1) + flight_speed = 1; + } + + if (ship.rotx == 0) + flight_climb = 0; + + if (ship.rotx < 0) + { + increase_flight_climb(); + + if (ship.rotx < -1) + increase_flight_climb(); + } + + if (ship.rotx > 0) + { + decrease_flight_climb(); + + if (ship.rotx > 1) + decrease_flight_climb(); + } + + if (ship.rotz == 127) + flight_roll = -14; + else + { + if (ship.rotz == 0) + flight_roll = 0; + + if (ship.rotz > 0) + { + increase_flight_roll(); + + if (ship.rotz > 1) + increase_flight_roll(); + } + + if (ship.rotz < 0) + { + decrease_flight_roll(); + + if (ship.rotz < -1) + decrease_flight_roll(); + } + } +} + + +void run_escape_sequence (void) +{ + int i; + int newship; + Matrix rotmat; + + current_screen = SCR_ESCAPE_POD; + + flight_speed = 1; + flight_roll = 0; + flight_climb = 0; + + set_init_matrix (rotmat); + rotmat[2].z = 1.0; + + newship = add_new_ship (SHIP_COBRA3, 0, 0, 200, rotmat, -127, -127); + universe[newship].velocity = 7; + snd_play_sample (SND_LAUNCH); + + for (i = 0; i < 90; i++) + { + if (i == 40) + { + universe[newship].flags |= FLG_DEAD; + snd_play_sample (SND_EXPLODE); + } + + gfx_set_clip_region (1, 1, 510, 383); + gfx_clear_display(); + update_starfield(); + update_universe(); + + universe[newship].location.x = 0; + universe[newship].location.y = 0; + universe[newship].location.z += 2; + + gfx_display_centre_text (358, "Escape pod launched - Ship auto-destuct initiated.", 120, GFX_COL_WHITE); + + update_console(); + gfx_update_screen(); + } + + + while ((ship_count[SHIP_CORIOLIS] == 0) && + (ship_count[SHIP_DODEC] == 0)) + { + auto_dock(); + + if ((abs(flight_roll) < 3) && (abs(flight_climb) < 3)) + { + for (i = 0; i < MAX_UNIV_OBJECTS; i++) + { + if (universe[i].type != 0) + universe[i].location.z -= 1500; + } + + } + + warp_stars = 1; + gfx_set_clip_region (1, 1, 510, 383); + gfx_clear_display(); + update_starfield(); + update_universe(); + update_console(); + gfx_update_screen(); + } + + abandon_ship(); +} + + +void handle_flight_keys (void) +{ + int keyasc; + + if (docked && + ((current_screen == SCR_MARKET_PRICES) || + (current_screen == SCR_OPTIONS) || + (current_screen == SCR_SETTINGS) || + (current_screen == SCR_EQUIP_SHIP))) + kbd_read_key(); + + kbd_poll_keyboard(); + + if (have_joystick) + { + poll_joystick(); + + if (joy[0].stick[0].axis[1].d1) + arrow_up(); + + if (joy[0].stick[0].axis[1].d2) + arrow_down(); + + if (joy[0].stick[0].axis[0].d1) + arrow_left(); + + if (joy[0].stick[0].axis[0].d2) + arrow_right(); + + if (joy[0].button[0].b) + kbd_fire_pressed = 1; + + if (joy[0].button[1].b) + kbd_inc_speed_pressed = 1; + + if (joy[0].button[2].b) + kbd_dec_speed_pressed = 1; + } + + + if (game_paused) + { + if (kbd_resume_pressed) + game_paused = 0; + return; + } + + if (kbd_F1_pressed) + { + find_input = 0; + + if (docked) + launch_player(); + else + { + if (current_screen != SCR_FRONT_VIEW) + { + current_screen = SCR_FRONT_VIEW; + flip_stars(); + } + } + } + + if (kbd_F2_pressed) + { + find_input = 0; + + if (!docked) + { + if (current_screen != SCR_REAR_VIEW) + { + current_screen = SCR_REAR_VIEW; + flip_stars(); + } + } + } + + if (kbd_F3_pressed) + { + find_input = 0; + + if (!docked) + { + if (current_screen != SCR_LEFT_VIEW) + { + current_screen = SCR_LEFT_VIEW; + flip_stars(); + } + } + } + + if (kbd_F4_pressed) + { + find_input = 0; + + if (docked) + equip_ship(); + else + { + if (current_screen != SCR_RIGHT_VIEW) + { + current_screen = SCR_RIGHT_VIEW; + flip_stars(); + } + } + } + + + if (kbd_F5_pressed) + { + find_input = 0; + old_cross_x = -1; + display_galactic_chart(); + } + + if (kbd_F6_pressed) + { + find_input = 0; + old_cross_x = -1; + display_short_range_chart(); + } + + if (kbd_F7_pressed) + { + find_input = 0; + display_data_on_planet(); + } + + if (kbd_F8_pressed && (!witchspace)) + { + find_input = 0; + display_market_prices(); + } + + if (kbd_F9_pressed) + { + find_input = 0; + display_commander_status(); + } + + if (kbd_F10_pressed) + { + find_input = 0; + display_inventory(); + } + + if (kbd_F11_pressed) + { + find_input = 0; + display_options(); + } + + if (find_input) + { + keyasc = kbd_read_key(); + + if (kbd_enter_pressed) + { + find_input = 0; + find_planet_by_name (find_name); + return; + } + + if (kbd_backspace_pressed) + { + delete_find_char(); + return; + } + + if (isalpha(keyasc)) + add_find_char (keyasc); + + return; + } + + if (kbd_y_pressed) + y_pressed(); + + if (kbd_n_pressed) + n_pressed(); + + + if (kbd_fire_pressed) + { + if ((!docked) && (draw_lasers == 0)) + draw_lasers = fire_laser(); + } + + if (kbd_dock_pressed) + { + if (!docked && cmdr.docking_computer) + { + if (instant_dock) + engage_docking_computer(); + else + engage_auto_pilot(); + } + } + + if (kbd_d_pressed) + d_pressed(); + + if (kbd_ecm_pressed) + { + if (!docked && cmdr.ecm) + activate_ecm(1); + } + + if (kbd_find_pressed) + f_pressed (); + + if (kbd_hyperspace_pressed && (!docked)) + { + if (kbd_ctrl_pressed) + start_galactic_hyperspace(); + else + start_hyperspace(); + } + + if (kbd_jump_pressed && (!docked) && (!witchspace)) + { + jump_warp(); + } + + if (kbd_fire_missile_pressed) + { + if (!docked) + fire_missile(); + } + + if (kbd_origin_pressed) + o_pressed(); + + if (kbd_pause_pressed) + game_paused = 1; + + if (kbd_target_missile_pressed) + { + if (!docked) + arm_missile(); + } + + if (kbd_unarm_missile_pressed) + { + if (!docked) + unarm_missile(); + } + + if (kbd_inc_speed_pressed) + { + if (!docked) + { + if (flight_speed < myship.max_speed) + flight_speed++; + } + } + + if (kbd_dec_speed_pressed) + { + if (!docked) + { + if (flight_speed > 1) + flight_speed--; + } + } + + if (kbd_up_pressed) + arrow_up(); + + if (kbd_down_pressed) + arrow_down(); + + if (kbd_left_pressed) + arrow_left(); + + if (kbd_right_pressed) + arrow_right(); + + if (kbd_enter_pressed) + return_pressed(); + + if (kbd_energy_bomb_pressed) + { + if ((!docked) && (cmdr.energy_bomb)) + { + detonate_bomb = 1; + cmdr.energy_bomb = 0; + } + } + + if (kbd_escape_pressed) + { + if ((!docked) && (cmdr.escape_pod) && (!witchspace)) + run_escape_sequence(); + } +} + + + +void set_commander_name (char *path) +{ + char *fname, *cname; + int i; + + fname = get_filename (path); + cname = cmdr.name; + + for (i = 0; i < 31; i++) + { + if (!isalnum(*fname)) + break; + + *cname++ = toupper(*fname++); + } + + *cname = '\0'; +} + + +void save_commander_screen (void) +{ + char path[255]; + int okay; + int rv; + + current_screen = SCR_SAVE_CMDR; + + gfx_clear_display(); + gfx_display_centre_text (10, "SAVE COMMANDER", 140, GFX_COL_GOLD); + gfx_draw_line (0, 36, 511, 36); + gfx_update_screen(); + + strcpy (path, cmdr.name); + strcat (path, ".nkc"); + + okay = gfx_request_file ("Save Commander", path, "nkc"); + + if (!okay) + { + display_options(); + return; + } + + rv = save_commander_file (path); + + if (rv) + { + gfx_display_centre_text (175, "Error Saving Commander!", 140, GFX_COL_GOLD); + return; + } + + gfx_display_centre_text (175, "Commander Saved.", 140, GFX_COL_GOLD); + + set_commander_name (path); + saved_cmdr = cmdr; + saved_cmdr.ship_x = docked_planet.d; + saved_cmdr.ship_y = docked_planet.b; +} + + +void load_commander_screen (void) +{ + char path[255]; + int rv; + + gfx_clear_display(); + gfx_display_centre_text (10, "LOAD COMMANDER", 140, GFX_COL_GOLD); + gfx_draw_line (0, 36, 511, 36); + gfx_update_screen(); + + + strcpy (path, "jameson.nkc"); + + rv = gfx_request_file ("Load Commander", path, "nkc"); + + if (rv == 0) + return; + + rv = load_commander_file (path); + + if (rv) + { + saved_cmdr = cmdr; + gfx_display_centre_text (175, "Error Loading Commander!", 140, GFX_COL_GOLD); + gfx_display_centre_text (200, "Press any key to continue.", 140, GFX_COL_GOLD); + gfx_update_screen(); + readkey(); + return; + } + + restore_saved_commander(); + set_commander_name (path); + saved_cmdr = cmdr; + update_console(); +} + + + +void run_first_intro_screen (void) +{ + current_screen = SCR_INTRO_ONE; + + snd_play_midi (SND_ELITE_THEME, TRUE); + + initialise_intro1(); + + for (;;) + { + update_intro1(); + + gfx_update_screen(); + + kbd_poll_keyboard(); + + if (kbd_y_pressed) + { + snd_stop_midi(); + load_commander_screen(); + break; + } + + if (kbd_n_pressed) + { + snd_stop_midi(); + break; + } + } + +} + + + +void run_second_intro_screen (void) +{ + current_screen = SCR_INTRO_TWO; + + snd_play_midi (SND_BLUE_DANUBE, TRUE); + + initialise_intro2(); + + flight_speed = 3; + flight_roll = 0; + flight_climb = 0; + + for (;;) + { + update_intro2(); + + gfx_update_screen(); + + kbd_poll_keyboard(); + + if (kbd_space_pressed) + break; + } + + snd_stop_midi(); +} + + + +/* + * Draw the game over sequence. + */ + +void run_game_over_screen() +{ + int i; + int newship; + Matrix rotmat; + int type; + + current_screen = SCR_GAME_OVER; + gfx_set_clip_region (1, 1, 510, 383); + + flight_speed = 6; + flight_roll = 0; + flight_climb = 0; + clear_universe(); + + set_init_matrix (rotmat); + + newship = add_new_ship (SHIP_COBRA3, 0, 0, -400, rotmat, 0, 0); + universe[newship].flags |= FLG_DEAD; + + for (i = 0; i < 5; i++) + { + type = (rand255() & 1) ? SHIP_CARGO : SHIP_ALLOY; + newship = add_new_ship (type, (rand255() & 63) - 32, + (rand255() & 63) - 32, -400, rotmat, 0, 0); + universe[newship].rotz = ((rand255() * 2) & 255) - 128; + universe[newship].rotx = ((rand255() * 2) & 255) - 128; + universe[newship].velocity = rand255() & 15; + } + + + for (i = 0; i < 100; i++) + { + gfx_clear_display(); + update_starfield(); + update_universe(); + gfx_display_centre_text (190, "GAME OVER", 140, GFX_COL_GOLD); + gfx_update_screen(); + } +} + + + + +/* + * Draw a break pattern (for launching, docking and hyperspacing). + * Just draw a very simple one for the moment. + */ + +void display_break_pattern (void) +{ + int i; + + gfx_set_clip_region (1, 1, 510, 383); + gfx_clear_display(); + + for (i = 0; i < 20; i++) + { + gfx_draw_circle (256, 192, 30 + i * 15, GFX_COL_WHITE); + gfx_update_screen(); + } + + + if (docked) + { + check_mission_brief(); + display_commander_status(); + update_console(); + } + else + current_screen = SCR_FRONT_VIEW; +} + + +void info_message (char *message) +{ + strcpy (message_string, message); + message_count = 37; +// snd_play_sample (SND_BEEP); +} + + + + + + +void initialise_allegro (void) +{ + allegro_init(); + install_keyboard(); + install_timer(); + install_mouse(); + + have_joystick = 0; + + if (install_joystick(JOY_TYPE_AUTODETECT) == 0) + { + have_joystick = (num_joysticks > 0); + } +} + + + +int main() +{ + initialise_allegro(); + read_config_file(); + + if (gfx_graphics_startup() == 1) + { + return 1; + } + + /* Start the sound system... */ + snd_sound_startup(); + + /* Do any setup necessary for the keyboard... */ + kbd_keyboard_startup(); + + finish = 0; + auto_pilot = 0; + + while (!finish) + { + game_over = 0; + initialise_game(); + dock_player(); + + update_console(); + + current_screen = SCR_FRONT_VIEW; + run_first_intro_screen(); + run_second_intro_screen(); + + old_cross_x = -1; + old_cross_y = -1; + + dock_player (); + display_commander_status (); + + while (!game_over) + { + snd_update_sound(); + gfx_update_screen(); + gfx_set_clip_region (1, 1, 510, 383); + + rolling = 0; + climbing = 0; + + handle_flight_keys (); + + if (game_paused) + continue; + + if (message_count > 0) + message_count--; + + if (!rolling) + { + if (flight_roll > 0) + decrease_flight_roll(); + + if (flight_roll < 0) + increase_flight_roll(); + } + + if (!climbing) + { + if (flight_climb > 0) + decrease_flight_climb(); + + if (flight_climb < 0) + increase_flight_climb(); + } + + + if (!docked) + { + gfx_acquire_screen(); + + if ((current_screen == SCR_FRONT_VIEW) || (current_screen == SCR_REAR_VIEW) || + (current_screen == SCR_LEFT_VIEW) || (current_screen == SCR_RIGHT_VIEW) || + (current_screen == SCR_INTRO_ONE) || (current_screen == SCR_INTRO_TWO) || + (current_screen == SCR_GAME_OVER)) + { + gfx_clear_display(); + update_starfield(); + } + + if (auto_pilot) + { + auto_dock(); + if ((mcount & 127) == 0) + info_message ("Docking Computers On"); + } + + update_universe (); + + if (docked) + { + update_console(); + gfx_release_screen(); + continue; + } + + if ((current_screen == SCR_FRONT_VIEW) || (current_screen == SCR_REAR_VIEW) || + (current_screen == SCR_LEFT_VIEW) || (current_screen == SCR_RIGHT_VIEW)) + { + if (draw_lasers) + { + draw_laser_lines(); + draw_lasers--; + } + + draw_laser_sights(); + } + + if (message_count > 0) + gfx_display_centre_text (358, message_string, 120, GFX_COL_WHITE); + + if (hyper_ready) + { + display_hyper_status(); + if ((mcount & 3) == 0) + { + countdown_hyperspace(); + } + } + + gfx_release_screen(); + + mcount--; + if (mcount < 0) + mcount = 255; + + if ((mcount & 7) == 0) + regenerate_shields(); + + if ((mcount & 31) == 10) + { + if (energy < 50) + { + info_message ("ENERGY LOW"); + snd_play_sample (SND_BEEP); + } + + update_altitude(); + } + + if ((mcount & 31) == 20) + update_cabin_temp(); + + if ((mcount == 0) && (!witchspace)) + random_encounter(); + + cool_laser(); + time_ecm(); + + update_console(); + } + + if (current_screen == SCR_BREAK_PATTERN) + display_break_pattern(); + + if (cross_timer > 0) + { + cross_timer--; + if (cross_timer == 0) + { + show_distance_to_planet(); + } + } + + if ((cross_x != old_cross_x) || + (cross_y != old_cross_y)) + { + if (old_cross_x != -1) + draw_cross (old_cross_x, old_cross_y); + + old_cross_x = cross_x; + old_cross_y = cross_y; + + draw_cross (old_cross_x, old_cross_y); + } + } + + if (!finish) + run_game_over_screen(); + } + + snd_sound_shutdown(); + + gfx_graphics_shutdown (); + + return 0; +} + +END_OF_MAIN(); diff --git a/alg_main.h b/alg_main.h new file mode 100644 index 0000000..a359d3d --- /dev/null +++ b/alg_main.h @@ -0,0 +1,7 @@ + +#ifndef MAIN_H +#define MAIN_H + +void info_message (char *message); + +#endif \ No newline at end of file diff --git a/beep.wav b/beep.wav new file mode 100644 index 0000000000000000000000000000000000000000..71a3d4b1fb65943b841def5068c6191175e8d464 GIT binary patch literal 9256 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 literal 0 HcmV?d00001 diff --git a/boop.wav b/boop.wav new file mode 100644 index 0000000000000000000000000000000000000000..d13033300995427f130c45a9b0f76be21de07a56 GIT binary patch literal 44490 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

#0#CXX{tUm{)%3Uv5}d;G6O^~P$1@A{O!?WcIA zBTzNs6+B++bYqOQIm7FpUv7+c81S*j@mkW;xSb>Vhx_78WXI?uEI0a=mNERhKfBw<&IJ3SE%C))bmTM<8ECK z(V_en+&hYupvC7V9^`7Fhk1_c>ukTA#_-m^0W7PN&sL@sV z+sl`Iou5*rA91ZOsM_7^YFF>?sp21@=1*vycPsrR)%_Lz7Cpx6eFPG9wSR`6@}jSQ zq$i;JXJGNJ&hYNe@%$q_3AH?b76zYTg3of+KaYs#5%Im~p2?V=ip8gQcq-@khD=eB z8UC(NsE)?p7zUNH^lkB|T|f;Z{yE35302YH&uIKv)z>o6^X;l>@#KOp^BNy>mAlp4k)vDD zU8NsmRnKevJ*xXHs{Hcx-aPcbf%%6|{?YvMlVANM{{8R%@Nd8U^=JS2FCRYo zh5qmtPycBDR literal 0 HcmV?d00001 diff --git a/config.h b/config.h new file mode 100644 index 0000000..8cd91e2 --- /dev/null +++ b/config.h @@ -0,0 +1,51 @@ +/** + * + * Elite - The New Kind. + * + * The code in this file has not been derived from the original Elite code. + * Written by C.J.Pinder 1999-2001. + * + * email: + * + **/ + +/* + * config.h + * + * Define the compile time options. + * Most options are defined at runtime in the newkind.cfg file. + * However some must be done at compile time either because they are + * platform dependant or for playing speed. + */ + + +#ifndef CONFIG_H +#define CONFIG_H + +/* + * Set the graphics platform we are using... + */ + +#define GFX_ALLEGRO + +/* + * #define GFX_WIN32_GDI + * #define GFX_OPENGL + * #defime GFX_X_WINDOWS + * #define GFX_DIRECTX + */ + +/* + * Set the screen resolution... + * (if nothing is defined, assume 256x256). + */ + +#define RES_800_600 +// #define RES_512_512 + +/* + * #define RES_640_480 + * #define RES_320_240 + */ + +#endif diff --git a/crash.wav b/crash.wav new file mode 100644 index 0000000000000000000000000000000000000000..b9505e7dfd485f73be1a4042b67239a54c9e170f GIT binary patch literal 66208 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 literal 0 HcmV?d00001 diff --git a/data/blake.bmp b/data/blake.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bf0bddd7e51759bbd1a79c35c3f798e058bf1a6d GIT binary patch literal 14078 zcmeI1v5OqZ6~>>;1shB-|H2IpF0~sjHkh77^KRbwccn}BOLG0{)89SdH#nI7G?0kM4$H&L9^ToY5 ze|RtAT=n4h0{JT9%LfskKa4n1J^nW0-jjIpEFL|26!8o3?nJV!RU6e-RsBx=PW`Tp zO5WA-uhy|q#nwfofl7y}lD(3>lD(2$msYjxwd}R*wd}R*nyzYOZ)9&|Z)9&|7i87S zE)JDARN_#HL)FP99+h}h@DNW;ty-z_*QmCtvWrVCF15gG0o9tc78g-am0gWmTxxOA zNmVxSsKuiek6Ju5q$;~O)Z$Q!gJ`SDCJwbYw8H9i)Me2K$A9XJS0j9R=}f;1O|L4O zI5h%o1ki|6BkV?ljV5V?-3VJJRj_3jek1%w_!?4`KX!3w#G%nT$Xysjf)!{~b<`TP z;?N4O6}MJATH!523lFV9D;_O8By1UOUDS$8D=w`_v;thFfVi}}u$5CQLn|)&SJga< zNh>Zb>#^iQHV_5b#Gw<1P8>RM=)|ED2hxe0YsH}xhfW+?anLlX@)w6r96E96#6eT5 z$}SF_ICSFBi9jd(R+DwQu#;1*IcoK5@#vOw<5S1S@gVm1_v6;BTXE;kow$Ghemr~j zEFM389M7LWj~6dq#LJg2DHky#7}gfBfbf?c>|x${ygP`IbHArAzO} zQznzeVm6yB%i@wUnMB}waq%3p*1-uW&^2ig7T=tUfQ;P%`7-=W1T*n||p#n_aA9NDSxvOa&bj z?f(vz)Z~l}Yo2qB?dLJB^&DKsyv{ARnJ>qO!iXTVKrx!v)+&-aT!}{(yzOsqtHyh= zK*PF@F)+*rhOj}4bAw*;w$8pP{J64zmD`Slqfs<@-o7_0bv+pDL{N(o^X~V_2h=Uy z#M?2mA0w+#O27VHcN~m93hNCwxYJ4ndFRPXn@(~l4`gUrF!Nt^Hm+gW0(Q=)WXIL&s3&Uk8e6or+C=6T+6P{IUVcL9}Z(S zo6i@E`JBC%C@@2T*N~A-Wj6D=qlPQsPENtP%t>DL`@>=E@6YG^`>^1d!5LOvhZ0y^ zUQp3>MTgfu=X5+~v+NItad%nfDv9A(tZSG~_x7gm%c?fa#DsXDqdzB}{l3@g`Y~Al zyLUNK*w2ndpQ-8ZsT>}1bieQ6m~ge{DRbh5Z48XW_6}iX9gV%c2wKDf1^sG!1U`7M z!nr$gKF+BlZDU~gZOJh&42z1xcg2c`3M{P__2@{xK64LtJc^y2K0L-`0wdUEG#mv> zKtX9aTK0sQ9@baVF%E{;D)YtBNbYbhN=ih$&p*`hVP5%de`pN9%@L2x|LHU}a6UQV zm|BVtPk&Ub=g_9S8U~}>VaQ;z*#(Zo#GK)O^1c*3xjXWzRUO>F7#Rbj?7vkVL?m;H zJ8j-=ZS9YEx2KZT`8LNReaFGbXjnmJl`|_f+NbbZjfdYE*KK|8u`qIXpkh?_>1 ziw8Qc8-q8B!Y4C{{o%^JDoffj%gS}U-So9EQu;$`c`1s_Vz#sp}_i-r2qK#KQX^Kk$m$VZh>o`2j-vqy31>ayfuZG1aEK^BlGkO?J7J0_9osKau zCX<4at+MX9{$+%gzfHVKEbzfQuP+Fqzah-hsKi7|W1^xrI{@ext literal 0 HcmV?d00001 diff --git a/data/danube.mid b/data/danube.mid new file mode 100644 index 0000000000000000000000000000000000000000..d5cfec26f087709e6c173be8e9268adc6f46afdc GIT binary patch literal 46989 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

J>u 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