+ Added ee_color_names[] containing our 16 color names. * libee/ee.c: + Extended our color set to the full 16 instead of 10. + Precalculate ncurses attributes. * libee/graphics.c: + Clip color value in ee_set_color(). + Clip characters in ee_putchar(). + Partially clip characters in ee_putstr(), overflows aren't checked yet. * libee/ee_internals.h: + New file to share extern variables within libee. * test/demo.c: + Added a simple demo_color() to output all colors. + Replaced four ee_draw_line() with ee_draw_thin_box(). + Replaced x1, y1, x2 etc. with xa, ya, xb etc. because <math.h> already defines y1. + Randomized colours from 0 to 15 instead of 1 to 10. * src/Makefiles.am: + Added -lm to the ttyvaders linking flags because of the intro. * README BUGS TODO: + Updated. git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/ttyvaders/trunk@160 92316355-f0b4-4df1-b90c-862c8a59935fmaster
@@ -0,0 +1,8 @@ | |||
$Id$ | |||
Video rendering | |||
o Slang's and ncurses' hashmap scrolling optimization code cause the | |||
screen to occasionally flicker because it tries to optimize the | |||
vertical scrolling. | |||
@@ -5,6 +5,6 @@ | |||
SUBDIRS = libee test src | |||
DIST_SUBDIRS = $(SUBDIRS) autotools data debian | |||
EXTRA_DIST = doc/shapes.txt bootstrap | |||
EXTRA_DIST = BUGS doc/shapes.txt bootstrap | |||
AUTOMAKE_OPTIONS = foreign dist-bzip2 | |||
@@ -1,47 +1,46 @@ | |||
$Id$ | |||
Building ttyvaders | |||
================== | |||
Run configure then make. Configure flags are: | |||
o Run configure then make. Useful configure flags are: | |||
--enable-slang: use the SLang library (default) | |||
--enable-ncurses: use the ncurses library | |||
--enable-conio: use MS-DOS conio.h | |||
--enable-slang: use the SLang library (default) | |||
--enable-ncurses: use the ncurses library | |||
--enable-conio: use MS-DOS conio.h | |||
Cross-compilation example: | |||
./configure --enable-conio --host=i386-pc-msdosdjgpp | |||
o Cross-compilation example: | |||
./configure --enable-conio --host=i386-pc-msdosdjgpp | |||
History of textmode games | |||
========================= | |||
http://www.textmodegames.com/ | |||
o http://www.textmodegames.com/ | |||
Other terminal-based games | |||
========================== | |||
* moon-buggy: http://www.mathematik.uni-kl.de/~wwwstoch/voss/comp/moon-buggy.html | |||
extremely simple, extremely addictive | |||
o moon-buggy: extremely simple, extremely addictive | |||
http://www.mathematik.uni-kl.de/~wwwstoch/voss/comp/moon-buggy.html | |||
* 0verkill: http://artax.karlin.mff.cuni.cz/~brain/0verkill/ | |||
o 0verkill: http://artax.karlin.mff.cuni.cz/~brain/0verkill/ | |||
* nInvaders: http://dettus.dyndns.org/ninvaders/ | |||
real space invaders clone | |||
o nInvaders: http://dettus.dyndns.org/ninvaders/ | |||
real space invaders clone | |||
* Stardork: http://www.seekrut.com/rk/stardork.html | |||
more strategy than arcade | |||
o Stardork: http://www.seekrut.com/rk/stardork.html | |||
more strategy than arcade | |||
* Nethack: http://www.nethack.org/ | |||
o Nethack: http://www.nethack.org/ | |||
* Tetrinet: http://www.secret.com.au/games/tetrinet/ | |||
o Tetrinet: http://www.secret.com.au/games/tetrinet/ | |||
* MyMan: http://geocities.com/bsittler/ | |||
pacman clone | |||
o MyMan: http://geocities.com/bsittler/ | |||
pacman clone | |||
* Tornado: http://home.kcore.de/~kiza/linux/tornado/ | |||
o Tornado: http://home.kcore.de/~kiza/linux/tornado/ | |||
* David's Perl games: http://davidsperlgames.sourceforge.net/ | |||
o David's Perl games: http://davidsperlgames.sourceforge.net/ | |||
* ascii-invaders: http://www.ip9.org/munro/invaders/index.html | |||
o ascii-invaders: http://www.ip9.org/munro/invaders/index.html | |||
@@ -1,44 +1,47 @@ | |||
Things to do | |||
$Id$ | |||
* let the ship pick up bonuses | |||
TODO for libee | |||
DONE 23 Dec 2002: handle life | |||
o Sprite library | |||
* alien swarms, programmed behaviour | |||
o Clip graphics | |||
* sprite library | |||
o Fix the thin ellipse rendering | |||
DONE 23 Dec 2002: mega ball | |||
o Write a Linux console output for the drawing library | |||
See also BUGS as to why it's very slow in console mode | |||
* spiral weapon (vertical sine) | |||
o DONE 12 Nov 2003: Port to conio.h | |||
DONE 23 Dec 2002: fragmentation bomb (merge with mega-ball?) | |||
* stick aliens to tunnel | |||
TODO for ttyvaders | |||
* change tunnel colour | |||
o Let the ship pick up bonuses | |||
DONE Dec 23 2002: fill holes in the tunnel when |step| > 2 | |||
o Alien swarms, programmed behaviour | |||
DONE Dec 18 2002: draw a 3rd alien type | |||
o Spiral weapon (vertical sine) | |||
* draw bosses | |||
o Stick aliens to tunnel | |||
* port to conio.h | |||
o Change tunnel colour | |||
* clip graphics | |||
o Draw bosses | |||
* promote precision for all coordinates except screen | |||
o Promote precision for all coordinates except screen | |||
DONE Dec 19 2002: tunnel sometimes doesn't get drawn on the left | |||
o Animate the ship | |||
* write a generic drawing library with automatic clipping | |||
o The nuke should break the tunnel | |||
Or at least a bit | |||
* write a linux console output for the drawing library | |||
o The laser stays alive when the ship explodes | |||
* animate the ship | |||
* the nuke should break the tunnel | |||
* the laser stays alive when the ship explodes | |||
o DONE 12 Nov 2003: Write a generic drawing library with automatic clipping | |||
o DONE 23 Dec 2002: Handle life | |||
o DONE 23 Dec 2002: Mega ball | |||
o DONE 23 Dec 2002: Fragmentation bomb (merge with mega-ball?) | |||
o DONE 23 Dec 2002: Fill holes in the tunnel when |step| > 2 | |||
o DONE 19 Dec 2002: Tunnel sometimes doesn't get drawn on the left | |||
o DONE 18 Dec 2002: Draw a 3rd alien type | |||
@@ -6,6 +6,7 @@ lib_LIBRARIES = libee.a | |||
libee_a_SOURCES = \ | |||
ee.c \ | |||
ee.h \ | |||
ee_internals.h \ | |||
graphics.c \ | |||
io.c \ | |||
math.c \ | |||
@@ -22,15 +22,10 @@ | |||
#include "config.h" | |||
#ifdef USE_SLANG | |||
# include <slang.h> | |||
#elif USE_NCURSES | |||
# include <curses.h> | |||
#endif | |||
#include <stdlib.h> | |||
#include "ee.h" | |||
#include "ee_internals.h" | |||
void ee_draw_box(int x1, int y1, int x2, int y2, char c) | |||
{ | |||
@@ -22,12 +22,6 @@ | |||
#include "config.h" | |||
#ifdef USE_SLANG | |||
# include <slang.h> | |||
#elif USE_NCURSES | |||
# include <curses.h> | |||
#endif | |||
#ifdef HAVE_INTTYPES_H | |||
# include <inttypes.h> | |||
#else | |||
@@ -37,6 +31,7 @@ typedef unsigned char uint8_t; | |||
#include <stdlib.h> | |||
#include "ee.h" | |||
#include "ee_internals.h" | |||
static void ellipsepoints(int, int, int, int, char); | |||
@@ -43,18 +43,63 @@ | |||
#include <time.h> | |||
#include "ee.h" | |||
#include "ee_internals.h" | |||
/* Global array with color names */ | |||
char *ee_color_names[16] = | |||
{ | |||
"black", | |||
"blue", | |||
"green", | |||
"cyan", | |||
"red", | |||
"magenta", | |||
"brown", | |||
"lightgray", | |||
"darkgray", | |||
"lightblue", | |||
"lightgreen", | |||
"lightcyan", | |||
"lightred", | |||
"lightmagenta", | |||
"yellow", | |||
"white", | |||
}; | |||
static int _ee_delay; | |||
#if defined(USE_NCURSES) | |||
int _ee_attr[16]; | |||
#endif | |||
#if defined(USE_CONIO) | |||
static struct text_info ti; | |||
char *_screen_buffer; | |||
char *_ee_screen; | |||
#endif | |||
int ee_init(void) | |||
{ | |||
#if defined(USE_SLANG) | |||
static char * colors[] = { "black", "green", "yellow", "white", | |||
"red", "gray", "lightgray", "blue", "cyan", "magenta", NULL }; | |||
static char *slang_colors[16] = | |||
{ | |||
"black", | |||
"blue", | |||
"green", | |||
"cyan", | |||
"red", | |||
"magenta", | |||
"brown", | |||
"lightgray", | |||
"gray", | |||
"brightblue", | |||
"brightgreen", | |||
"brightcyan", | |||
"brightred", | |||
"brightmagenta", | |||
"yellow", | |||
"white", | |||
}; | |||
int i; | |||
/* Initialize slang library */ | |||
@@ -81,13 +126,12 @@ int ee_init(void) | |||
SLtt_set_cursor_visibility(0); | |||
SLsmg_refresh(); | |||
for(i = 0; colors[i]; i++) | |||
{ | |||
SLtt_set_color(i + 1, NULL, colors[i], "black"); | |||
} | |||
for(i = 0; i < 16; i++) | |||
SLtt_set_color(i + 1, NULL, slang_colors[i], "black"); | |||
#elif defined(USE_NCURSES) | |||
/* Initialize ncurses library */ | |||
int i; | |||
initscr(); | |||
keypad(stdscr, TRUE); | |||
nonl(); | |||
@@ -98,24 +142,40 @@ int ee_init(void) | |||
start_color(); | |||
init_pair(EE_BLACK, COLOR_BLACK, COLOR_BLACK); | |||
init_pair(EE_GREEN, COLOR_GREEN, COLOR_BLACK); | |||
init_pair(EE_YELLOW, COLOR_YELLOW, COLOR_BLACK); | |||
init_pair(EE_WHITE, COLOR_WHITE, COLOR_BLACK); | |||
init_pair(EE_RED, COLOR_RED, COLOR_BLACK); | |||
init_pair(EE_GRAY, COLOR_WHITE, COLOR_BLACK); // XXX | |||
init_pair(EE_LIGHTGRAY, COLOR_WHITE, COLOR_BLACK); // XXX | |||
init_pair(EE_BLUE, COLOR_BLUE, COLOR_BLACK); | |||
init_pair(EE_CYAN, COLOR_CYAN, COLOR_BLACK); | |||
init_pair(EE_MAGENTA, COLOR_MAGENTA, COLOR_BLACK); | |||
init_pair(1 + EE_BLACK, COLOR_BLACK, COLOR_BLACK); | |||
init_pair(1 + EE_BLUE, COLOR_BLUE, COLOR_BLACK); | |||
init_pair(1 + EE_GREEN, COLOR_GREEN, COLOR_BLACK); | |||
init_pair(1 + EE_CYAN, COLOR_CYAN, COLOR_BLACK); | |||
init_pair(1 + EE_RED, COLOR_RED, COLOR_BLACK); | |||
init_pair(1 + EE_MAGENTA, COLOR_MAGENTA, COLOR_BLACK); | |||
init_pair(1 + EE_BROWN, COLOR_YELLOW, COLOR_BLACK); | |||
init_pair(1 + EE_LIGHTGRAY, COLOR_WHITE, COLOR_BLACK); | |||
init_pair(1 + EE_DARKGRAY, COLOR_BLACK, COLOR_BLACK); | |||
init_pair(1 + EE_LIGHTBLUE, COLOR_BLUE, COLOR_BLACK); | |||
init_pair(1 + EE_LIGHTGREEN, COLOR_GREEN, COLOR_BLACK); | |||
init_pair(1 + EE_LIGHTCYAN, COLOR_CYAN, COLOR_BLACK); | |||
init_pair(1 + EE_LIGHTRED, COLOR_RED, COLOR_BLACK); | |||
init_pair(1 + EE_LIGHTMAGENTA, COLOR_MAGENTA, COLOR_BLACK); | |||
init_pair(1 + EE_YELLOW, COLOR_YELLOW, COLOR_BLACK); | |||
init_pair(1 + EE_WHITE, COLOR_WHITE, COLOR_BLACK); | |||
for(i = 0; i < 8; i++) | |||
{ | |||
_ee_attr[i] = COLOR_PAIR(1 + i); | |||
_ee_attr[i + 8] = A_BOLD | COLOR_PAIR(1 + i); | |||
} | |||
#elif defined(USE_CONIO) | |||
_wscroll = 0; | |||
_setcursortype(_NOCURSOR); | |||
clrscr(); | |||
gettextinfo(&ti); | |||
_screen_buffer = malloc(ee_get_width() * ee_get_height() * 2); | |||
ScreenRetrieve(_screen_buffer); | |||
_ee_screen = malloc(2 * ti.screenwidth * ti.screenheight); | |||
# if defined(SCREENUPDATE_IN_PC_H) | |||
ScreenRetrieve(_ee_screen); | |||
# else | |||
/* FIXME */ | |||
# endif | |||
#endif | |||
_ee_delay = 0; | |||
@@ -187,7 +247,11 @@ void ee_refresh(void) | |||
#elif defined(USE_NCURSES) | |||
refresh(); | |||
#elif defined(USE_CONIO) | |||
ScreenUpdate(_screen_buffer); | |||
# if defined(SCREENUPDATE_IN_PC_H) | |||
ScreenUpdate(_ee_screen); | |||
# else | |||
/* FIXME */ | |||
# endif | |||
#endif | |||
#if !defined(USE_CONIO) | |||
@@ -214,7 +278,6 @@ void ee_end(void) | |||
curs_set(1); | |||
endwin(); | |||
#elif defined(USE_CONIO) | |||
ScreenUpdate(_screen_buffer); | |||
_wscroll = 1; | |||
textcolor((enum COLORS)WHITE); | |||
textbackground((enum COLORS)BLACK); | |||
@@ -31,16 +31,27 @@ extern "C" | |||
/* | |||
* Colors | |||
*/ | |||
#define EE_BLACK 1 | |||
#define EE_GREEN 2 | |||
#define EE_YELLOW 3 | |||
#define EE_WHITE 4 | |||
#define EE_RED 5 | |||
#define EE_GRAY 6 | |||
#define EE_LIGHTGRAY 7 | |||
#define EE_BLUE 8 | |||
#define EE_CYAN 9 | |||
#define EE_MAGENTA 10 | |||
enum ee_colors | |||
{ | |||
EE_BLACK = 0, | |||
EE_BLUE = 1, | |||
EE_GREEN = 2, | |||
EE_CYAN = 3, | |||
EE_RED = 4, | |||
EE_MAGENTA = 5, | |||
EE_BROWN = 6, | |||
EE_LIGHTGRAY = 7, | |||
EE_DARKGRAY = 8, | |||
EE_LIGHTBLUE = 9, | |||
EE_LIGHTGREEN = 10, | |||
EE_LIGHTCYAN = 11, | |||
EE_LIGHTRED = 12, | |||
EE_LIGHTMAGENTA = 13, | |||
EE_YELLOW = 14, | |||
EE_WHITE = 15 | |||
}; | |||
extern char *ee_color_names[16]; | |||
/* | |||
* Types | |||
@@ -0,0 +1,34 @@ | |||
/* | |||
* libee ASCII-Art library | |||
* Copyright (c) 2002, 2003 Sam Hocevar <sam@zoy.org> | |||
* All Rights Reserved | |||
* | |||
* $Id$ | |||
* | |||
* 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. | |||
*/ | |||
#ifndef __EE_INTERNALS_H__ | |||
#define __EE_INTERNALS_H__ | |||
#if defined(USE_NCURSES) | |||
extern int _ee_attr[]; | |||
#endif | |||
#if defined(USE_CONIO) | |||
extern char *_ee_screen; | |||
#endif | |||
#endif /* __EE_INTERNALS_H__ */ |
@@ -36,34 +36,22 @@ | |||
#include <stdlib.h> | |||
#include "ee.h" | |||
#include "ee_internals.h" | |||
static int ee_color = 0; | |||
#if defined(USE_CONIO) | |||
static enum COLORS dos_colors[] = { | |||
0, | |||
BLACK, | |||
GREEN, | |||
YELLOW, | |||
WHITE, | |||
RED, | |||
DARKGRAY, | |||
LIGHTGRAY, | |||
BLUE, | |||
CYAN, | |||
MAGENTA | |||
}; | |||
#endif | |||
void ee_set_color(int color) | |||
{ | |||
if(color < 0 || color > 15) | |||
return; | |||
ee_color = color; | |||
#if defined(USE_SLANG) | |||
SLsmg_set_color(color); | |||
SLsmg_set_color(color + 1); | |||
#elif defined(USE_NCURSES) | |||
attrset(COLOR_PAIR(color)); | |||
attrset(_ee_attr[color]); | |||
#elif defined(USE_CONIO) | |||
if(color >= 1 && color <= 10) | |||
textcolor(dos_colors[color]); | |||
textcolor(color); | |||
#endif | |||
} | |||
@@ -72,44 +60,57 @@ int ee_get_color(void) | |||
return ee_color; | |||
} | |||
extern char *_screen_buffer; | |||
void ee_putchar(int x, int y, char c) | |||
{ | |||
if(x < 0 || x >= ee_get_width() || y < 0 || y >= ee_get_height()) | |||
return; | |||
#if defined(USE_SLANG) | |||
SLsmg_gotorc(y,x); | |||
SLsmg_gotorc(y, x); | |||
SLsmg_write_char(c); | |||
#elif defined(USE_NCURSES) | |||
move(y,x); | |||
move(y, x); | |||
addch(c); | |||
#elif defined(USE_CONIO) | |||
if(x<0 || x>=ee_get_width() || y<0 || y>=ee_get_height()) | |||
return; | |||
_screen_buffer[2 * (x + y * ee_get_width())] = c; | |||
_screen_buffer[2 * (x + y * ee_get_width()) + 1] = dos_colors[ee_color]; | |||
// gotoxy(x+1,y+1); | |||
_ee_screen[2 * (x + y * ee_get_width())] = c; | |||
_ee_screen[2 * (x + y * ee_get_width()) + 1] = ee_color; | |||
// gotoxy(x + 1, y + 1); | |||
// putch(c); | |||
#endif | |||
} | |||
void ee_putstr(int x, int y, char *s) | |||
{ | |||
if(y<0 || y>=ee_get_height()) | |||
int len; | |||
if(y < 0 || y >= ee_get_height()) | |||
return; | |||
len = strlen(s); | |||
if(x < 0) | |||
{ | |||
len -= -x; | |||
if(len < 0) | |||
return; | |||
s += -x; | |||
x = 0; | |||
} | |||
#if defined(USE_SLANG) | |||
SLsmg_gotorc(y,x); | |||
SLsmg_gotorc(y, x); | |||
SLsmg_write_string(s); | |||
#elif defined(USE_NCURSES) | |||
move(y,x); | |||
move(y, x); | |||
addstr(s); | |||
#elif defined(USE_CONIO) | |||
char *buf = _screen_buffer + 2 * (x + y * ee_get_width()); | |||
char *buf = _ee_screen + 2 * (x + y * ee_get_width()); | |||
while(*s) | |||
{ | |||
*buf++ = *s++; | |||
*buf++ = dos_colors[ee_color]; | |||
*buf++ = ee_color; | |||
} | |||
// gotoxy(x+1,y+1); | |||
// gotoxy(x + 1, y + 1); | |||
// cputs(s); | |||
#endif | |||
} | |||
@@ -117,7 +118,8 @@ void ee_putstr(int x, int y, char *s) | |||
void ee_clear(void) | |||
{ | |||
/* We could use SLsmg_cls() etc., but drawing empty lines is much faster */ | |||
int x = ee_get_width(), y = ee_get_height(); | |||
int x = ee_get_width(); | |||
int y = ee_get_height(); | |||
char *empty_line = malloc((x + 1) * sizeof(char)); | |||
memset(empty_line, ' ', x); | |||
@@ -22,37 +22,31 @@ | |||
#include "config.h" | |||
#ifdef USE_SLANG | |||
#if defined(USE_SLANG) | |||
# include <slang.h> | |||
#elif USE_NCURSES | |||
#elif defined(USE_NCURSES) | |||
# include <curses.h> | |||
#elif USE_CONIO | |||
#elif defined(USE_CONIO) | |||
# include <conio.h> | |||
#else | |||
# error "no graphics library detected" | |||
#endif | |||
#include "ee.h" | |||
#include "ee_internals.h" | |||
char ee_get_key(void) | |||
{ | |||
#ifdef USE_SLANG | |||
if(SLang_input_pending(0)) | |||
{ | |||
return SLang_getkey(); | |||
} | |||
#elif USE_NCURSES | |||
#if defined(USE_SLANG) | |||
return SLang_input_pending(0) ? SLang_getkey() : 0; | |||
#elif defined(USE_NCURSES) | |||
char key = getch(); | |||
return key != ERR ? key : 0; | |||
if(key != ERR) | |||
{ | |||
return key; | |||
} | |||
#elif USE_CONIO | |||
#elif defined(USE_CONIO) | |||
return _conio_kbhit() ? getch() : 0; | |||
#endif | |||
return 0; | |||
} | |||
@@ -22,12 +22,6 @@ | |||
#include "config.h" | |||
#ifdef USE_SLANG | |||
# include <slang.h> | |||
#elif USE_NCURSES | |||
# include <curses.h> | |||
#endif | |||
#ifdef HAVE_INTTYPES_H | |||
# include <inttypes.h> | |||
#else | |||
@@ -37,6 +31,7 @@ typedef unsigned char uint8_t; | |||
#include <stdlib.h> | |||
#include "ee.h" | |||
#include "ee_internals.h" | |||
struct line | |||
{ | |||
@@ -22,15 +22,10 @@ | |||
#include "config.h" | |||
#ifdef USE_SLANG | |||
# include <slang.h> | |||
#elif USE_NCURSES | |||
# include <curses.h> | |||
#endif | |||
#include <stdlib.h> | |||
#include "ee.h" | |||
#include "ee_internals.h" | |||
int ee_rand(int min, int max) | |||
{ | |||
@@ -22,17 +22,12 @@ | |||
#include "config.h" | |||
#ifdef USE_SLANG | |||
# include <slang.h> | |||
#elif USE_NCURSES | |||
# include <curses.h> | |||
#endif | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <string.h> | |||
#include "ee.h" | |||
#include "ee_internals.h" | |||
struct ee_frame | |||
{ | |||
@@ -22,15 +22,10 @@ | |||
#include "config.h" | |||
#ifdef USE_SLANG | |||
# include <slang.h> | |||
#elif USE_NCURSES | |||
# include <curses.h> | |||
#endif | |||
#include <stdlib.h> | |||
#include "ee.h" | |||
#include "ee_internals.h" | |||
void ee_draw_triangle(int x1, int y1, int x2, int y2, int x3, int y3, char c) | |||
{ | |||
@@ -29,5 +29,5 @@ ttyvaders_SOURCES = \ | |||
tunnel.c \ | |||
weapons.c \ | |||
$(NULL) | |||
ttyvaders_LDADD = ../libee/libee.a $(LDFLAGS_slang) $(LDFLAGS_ncurses) | |||
ttyvaders_LDADD = ../libee/libee.a $(LDFLAGS_slang) $(LDFLAGS_ncurses) -lm | |||
@@ -32,7 +32,7 @@ void draw_status(game *g) | |||
static char dashes30[] = "=============================="; | |||
/* Draw life jauge */ | |||
ee_set_color(EE_GRAY); | |||
ee_set_color(EE_DARKGRAY); | |||
ee_putstr(4, 1, dots30); | |||
if(g->p->life > MAX_LIFE * 7 / 10) | |||
@@ -55,7 +55,7 @@ void draw_status(game *g) | |||
ee_putstr(34, 1, "|"); | |||
/* Draw weapon jauge */ | |||
ee_set_color(EE_GRAY); | |||
ee_set_color(EE_DARKGRAY); | |||
ee_putstr(42, 1, dots30 + 10); | |||
if(g->p->special > MAX_SPECIAL * 9 / 10) | |||
@@ -69,7 +69,7 @@ void draw_weapons(game *g, weapons *wp) | |||
ee_putchar(wp->x[i] >> 4, wp->y[i] >> 4, '@'); | |||
break; | |||
case WEAPON_BOMB: | |||
ee_set_color(EE_GRAY); | |||
ee_set_color(EE_DARKGRAY); | |||
ee_putchar((wp->x[i] - wp->vx[i]) >> 4, (wp->y[i] - wp->vy[i]) >> 4, '.'); | |||
ee_putchar((wp->x3[i] - wp->vx[i]) >> 4, (wp->y3[i] - wp->vy[i]) >> 4, '.'); | |||
ee_putchar((wp->x2[i] - wp->vx[i]) >> 4, (wp->y2[i] - wp->vy[i]) >> 4, '.'); | |||
@@ -24,6 +24,7 @@ | |||
#include <math.h> | |||
#include <string.h> | |||
#include <stdio.h> | |||
#include "ee.h" | |||
@@ -31,6 +32,7 @@ static void display_menu(void); | |||
static void demo_all(void); | |||
static void demo_color(void); | |||
static void demo_dots(void); | |||
static void demo_lines(void); | |||
static void demo_boxes(void); | |||
@@ -76,6 +78,10 @@ int main(int argc, char **argv) | |||
demo = NULL; | |||
quit = 1; | |||
break; | |||
case 'c': | |||
ee_clear(); | |||
demo = demo_color; | |||
break; | |||
case '0': | |||
ee_clear(); | |||
demo = demo_all; | |||
@@ -143,10 +149,7 @@ static void display_menu(void) | |||
ee_clear(); | |||
ee_set_color(EE_WHITE); | |||
ee_draw_line(xo, yo, 1, yo, '.'); | |||
ee_draw_line(1, yo, 1, 1, ':'); | |||
ee_draw_line(xo, 1, xo, yo, ':'); | |||
ee_draw_line(1, 1, xo, 1, '.'); | |||
ee_draw_thin_box(1, 1, xo, yo); | |||
ee_putstr((xo - strlen("libee demo")) / 2, 3, "libee demo"); | |||
ee_putstr((xo - strlen("============")) / 2, 4, "============"); | |||
@@ -171,7 +174,7 @@ static void demo_all(void) | |||
{ | |||
static int i = 0; | |||
int j, xo, yo, x1, y1, x2, y2, x3, y3; | |||
int j, xo, yo, xa, ya, xb, yb, xc, yc; | |||
i++; | |||
@@ -184,9 +187,9 @@ static void demo_all(void) | |||
for(j = 0; j < 16; j++) | |||
{ | |||
x1 = xo - (30 + sin(0.03*i) * 8) * sin(0.03*i + M_PI*j/8); | |||
y1 = yo + (15 + sin(0.03*i) * 4) * cos(0.03*i + M_PI*j/8); | |||
ee_draw_thin_line(xo, yo, x1, y1); | |||
xa = xo - (30 + sin(0.03*i) * 8) * sin(0.03*i + M_PI*j/8); | |||
ya = yo + (15 + sin(0.03*i) * 4) * cos(0.03*i + M_PI*j/8); | |||
ee_draw_thin_line(xo, yo, xa, ya); | |||
} | |||
j = 15 + sin(0.03*i) * 8; | |||
@@ -199,49 +202,49 @@ static void demo_all(void) | |||
xo = ee_get_width() * 5 / 8; | |||
yo = 2; | |||
x1 = ee_get_width() / 8 + sin(0.03*i) * 5; | |||
y1 = ee_get_height() / 2 + cos(0.03*i) * 5; | |||
xa = ee_get_width() / 8 + sin(0.03*i) * 5; | |||
ya = ee_get_height() / 2 + cos(0.03*i) * 5; | |||
x2 = ee_get_width() - 10 - cos(0.02*i) * 10; | |||
y2 = ee_get_height() * 3 / 4 - 5 + sin(0.02*i) * 5; | |||
xb = ee_get_width() - 10 - cos(0.02*i) * 10; | |||
yb = ee_get_height() * 3 / 4 - 5 + sin(0.02*i) * 5; | |||
x3 = ee_get_width() / 4 - sin(0.02*i) * 5; | |||
y3 = ee_get_height() * 3 / 4 + cos(0.02*i) * 5; | |||
xc = ee_get_width() / 4 - sin(0.02*i) * 5; | |||
yc = ee_get_height() * 3 / 4 + cos(0.02*i) * 5; | |||
ee_set_color(EE_GREEN); | |||
ee_fill_triangle(xo, yo, x2, y2, x1, y1, '%'); | |||
ee_fill_triangle(xo, yo, xb, yb, xa, ya, '%'); | |||
ee_set_color(EE_YELLOW); | |||
ee_draw_thin_triangle(xo, yo, x2, y2, x1, y1); | |||
ee_draw_thin_triangle(xo, yo, xb, yb, xa, ya); | |||
ee_set_color(EE_RED); | |||
ee_fill_triangle(x1, y1, x2, y2, x3, y3, '#'); | |||
ee_fill_triangle(xa, ya, xb, yb, xc, yc, '#'); | |||
ee_set_color(EE_YELLOW); | |||
ee_draw_thin_triangle(x1, y1, x2, y2, x3, y3); | |||
ee_draw_thin_triangle(xa, ya, xb, yb, xc, yc); | |||
ee_set_color(EE_BLUE); | |||
ee_fill_triangle(xo, yo, x2, y2, x3, y3, '%'); | |||
ee_fill_triangle(xo, yo, xb, yb, xc, yc, '%'); | |||
ee_set_color(EE_YELLOW); | |||
ee_draw_thin_triangle(xo, yo, x2, y2, x3, y3); | |||
ee_draw_thin_triangle(xo, yo, xb, yb, xc, yc); | |||
/* Draw a background triangle */ | |||
x1 = 2; | |||
y1 = 2; | |||
xa = 2; | |||
ya = 2; | |||
x2 = ee_get_width() - 3; | |||
y2 = ee_get_height() / 2; | |||
xb = ee_get_width() - 3; | |||
yb = ee_get_height() / 2; | |||
x3 = ee_get_width() / 3; | |||
y3 = ee_get_height() - 3; | |||
xc = ee_get_width() / 3; | |||
yc = ee_get_height() - 3; | |||
ee_set_color(EE_CYAN); | |||
ee_draw_thin_triangle(x1, y1, x2, y2, x3, y3); | |||
ee_draw_thin_triangle(xa, ya, xb, yb, xc, yc); | |||
xo = ee_get_width() / 2 + cos(0.027*i) * ee_get_width() / 3; | |||
yo = ee_get_height() / 2 - sin(0.027*i) * ee_get_height() / 2; | |||
ee_draw_thin_line(x1, y1, xo, yo); | |||
ee_draw_thin_line(x2, y2, xo, yo); | |||
ee_draw_thin_line(x3, y3, xo, yo); | |||
ee_draw_thin_line(xa, ya, xo, yo); | |||
ee_draw_thin_line(xb, yb, xo, yo); | |||
ee_draw_thin_line(xc, yc, xo, yo); | |||
/* Draw a sprite on the pyramid */ | |||
ee_draw_sprite(xo, yo, sprite, 0); | |||
@@ -250,7 +253,7 @@ static void demo_all(void) | |||
for(j = i - 60; j < i; j++) | |||
{ | |||
int delta = ee_rand(-5, 5); | |||
ee_set_color(ee_rand(1, 10)); | |||
ee_set_color(ee_rand(0, 15)); | |||
ee_putchar(ee_get_width() / 2 | |||
+ cos(0.02*j) * (delta + ee_get_width() / 4), | |||
ee_get_height() / 2 | |||
@@ -275,34 +278,51 @@ static void demo_dots(void) | |||
for(i = 1000; i--;) | |||
{ | |||
/* Putpixel */ | |||
ee_set_color(ee_rand(1, 10)); | |||
ee_set_color(ee_rand(0, 15)); | |||
ee_putchar(ee_rand(0, xmax), ee_rand(0, ymax), '#'); | |||
} | |||
ee_refresh(); | |||
} | |||
static void demo_color(void) | |||
{ | |||
int i; | |||
char buf[BUFSIZ]; | |||
ee_clear(); | |||
for(i = 0; i < 16; i++) | |||
{ | |||
sprintf(buf, "color %i (%s)\n", i, ee_color_names[i]); | |||
ee_set_color(EE_WHITE); | |||
ee_putstr(4, i + 3, buf); | |||
ee_set_color(i); | |||
ee_putstr(40, i + 3, "XXXXXXXXXX-XX--X----------"); | |||
} | |||
ee_refresh(); | |||
} | |||
static void demo_lines(void) | |||
{ | |||
int w = ee_get_width(); | |||
int h = ee_get_height(); | |||
int x1, y1, x2, y2; | |||
int xa, ya, xb, yb; | |||
if(force_clipping) | |||
{ | |||
x1 = ee_rand(- w, 2 * w); y1 = ee_rand(- h, 2 * h); | |||
x2 = ee_rand(- w, 2 * w); y2 = ee_rand(- h, 2 * h); | |||
xa = ee_rand(- w, 2 * w); ya = ee_rand(- h, 2 * h); | |||
xb = ee_rand(- w, 2 * w); yb = ee_rand(- h, 2 * h); | |||
} | |||
else | |||
{ | |||
x1 = ee_rand(0, w - 1); y1 = ee_rand(0, h - 1); | |||
x2 = ee_rand(0, w - 1); y2 = ee_rand(0, h - 1); | |||
xa = ee_rand(0, w - 1); ya = ee_rand(0, h - 1); | |||
xb = ee_rand(0, w - 1); yb = ee_rand(0, h - 1); | |||
} | |||
ee_set_color(ee_rand(1, 10)); | |||
ee_set_color(ee_rand(0, 15)); | |||
if(thin) | |||
ee_draw_thin_line(x1, y1, x2, y2); | |||
ee_draw_thin_line(xa, ya, xb, yb); | |||
else | |||
ee_draw_line(x1, y1, x2, y2, '#'); | |||
ee_draw_line(xa, ya, xb, yb, '#'); | |||
ee_refresh(); | |||
} | |||
@@ -311,26 +331,26 @@ static void demo_boxes(void) | |||
{ | |||
int w = ee_get_width(); | |||
int h = ee_get_height(); | |||
int x1, y1, x2, y2; | |||
int xa, ya, xb, yb; | |||
if(force_clipping) | |||
{ | |||
x1 = ee_rand(- w, 2 * w); y1 = ee_rand(- h, 2 * h); | |||
x2 = ee_rand(- w, 2 * w); y2 = ee_rand(- h, 2 * h); | |||
xa = ee_rand(- w, 2 * w); ya = ee_rand(- h, 2 * h); | |||
xb = ee_rand(- w, 2 * w); yb = ee_rand(- h, 2 * h); | |||
} | |||
else | |||
{ | |||
x1 = ee_rand(0, w - 1); y1 = ee_rand(0, h - 1); | |||
x2 = ee_rand(0, w - 1); y2 = ee_rand(0, h - 1); | |||
xa = ee_rand(0, w - 1); ya = ee_rand(0, h - 1); | |||
xb = ee_rand(0, w - 1); yb = ee_rand(0, h - 1); | |||
} | |||
ee_set_color(ee_rand(1, 10)); | |||
ee_fill_box(x1, y1, x2, y2, '#'); | |||
ee_set_color(ee_rand(0, 15)); | |||
ee_fill_box(xa, ya, xb, yb, '#'); | |||
if(outline) | |||
{ | |||
ee_set_color(ee_rand(1, 10)); | |||
ee_draw_thin_box(x1, y1, x2, y2); | |||
ee_set_color(ee_rand(0, 15)); | |||
ee_draw_thin_box(xa, ya, xb, yb); | |||
} | |||
ee_refresh(); | |||
@@ -357,12 +377,12 @@ static void demo_ellipses(void) | |||
} while(x - a < 0 || x + a >= w || y - b < 0 || y + b >= h); | |||
} | |||
ee_set_color(ee_rand(1, 10)); | |||
ee_set_color(ee_rand(0, 15)); | |||
ee_fill_ellipse(x, y, a, b, '#'); | |||
if(outline) | |||
{ | |||
ee_set_color(ee_rand(1, 10)); | |||
ee_set_color(ee_rand(0, 15)); | |||
ee_draw_thin_ellipse(x, y, a, b); | |||
} | |||
@@ -373,29 +393,29 @@ static void demo_triangles(void) | |||
{ | |||
int w = ee_get_width(); | |||
int h = ee_get_height(); | |||
int x1, y1, x2, y2, x3, y3; | |||
int xa, ya, xb, yb, xc, yc; | |||
if(force_clipping) | |||
{ | |||
x1 = ee_rand(- w, 2 * w); y1 = ee_rand(- h, 2 * h); | |||
x2 = ee_rand(- w, 2 * w); y2 = ee_rand(- h, 2 * h); | |||
x3 = ee_rand(- w, 2 * w); y3 = ee_rand(- h, 2 * h); | |||
xa = ee_rand(- w, 2 * w); ya = ee_rand(- h, 2 * h); | |||
xb = ee_rand(- w, 2 * w); yb = ee_rand(- h, 2 * h); | |||
xc = ee_rand(- w, 2 * w); yc = ee_rand(- h, 2 * h); | |||
} | |||
else | |||
{ | |||
x1 = ee_rand(0, w - 1); y1 = ee_rand(0, h - 1); | |||
x2 = ee_rand(0, w - 1); y2 = ee_rand(0, h - 1); | |||
x3 = ee_rand(0, w - 1); y3 = ee_rand(0, h - 1); | |||
xa = ee_rand(0, w - 1); ya = ee_rand(0, h - 1); | |||
xb = ee_rand(0, w - 1); yb = ee_rand(0, h - 1); | |||
xc = ee_rand(0, w - 1); yc = ee_rand(0, h - 1); | |||
} | |||
ee_set_color(ee_rand(1, 10)); | |||
ee_fill_triangle(x1, y1, x2, y2, x3, y3, '#'); | |||
ee_set_color(ee_rand(0, 15)); | |||
ee_fill_triangle(xa, ya, xb, yb, xc, yc, '#'); | |||
if(outline) | |||
{ | |||
ee_set_color(ee_rand(1, 10)); | |||
ee_draw_thin_triangle(x1, y1, x2, y2, x3, y3); | |||
ee_set_color(ee_rand(0, 15)); | |||
ee_draw_thin_triangle(xa, ya, xb, yb, xc, yc); | |||
} | |||
ee_refresh(); | |||