1.4.0 by jan6

edited stats and company names, copyright, changelog, edited final stats to not exit unless Y is pressed, removed buggy AI, added "make clean"
This commit is contained in:
jan6 2020-02-11 16:18:17 +00:00
parent ba30e92f1b
commit c6a6731be5
6 changed files with 100 additions and 56 deletions

1
LICENSE Symbolic link
View File

@ -0,0 +1 @@
COPYING

View File

@ -3,7 +3,7 @@
# #
CC=/usr/bin/gcc CC=/usr/bin/gcc
#CCOPTS=-Wall #CCOPTS=-Wall
CCOPTS=-O2 CCOPTS=-static -O2
CURSESLIB=ncurses CURSESLIB=ncurses
INSTALLDIR=/usr/local INSTALLDIR=/usr/local
@ -12,14 +12,16 @@ all: starlanes
clean: *.o starlanes clean: *.o starlanes
rm -f *.o starlanes rm -f *.o starlanes
ai.o: ai.c common.h #ai.o: ai.c common.h
$(CC) -g $(CCOPTS) -c ai.c # $(CC) -g $(CCOPTS) -c ai.c
starlanes.o: starlanes.c ai.c common.h starlanes.o: starlanes.c common.h #ai.c
$(CC) -g $(CCOPTS) -c starlanes.c $(CC) -g $(CCOPTS) -c starlanes.c
starlanes: starlanes.o ai.o starlanes: starlanes.o #ai.o
$(CC) -g starlanes.o ai.o -o starlanes -l$(CURSESLIB) # $(CC) -g starlanes.o ai.o -o starlanes -l$(CURSESLIB)
$(CC) -g -O2 starlanes.o -o starlanes -l$(CURSESLIB)
strip --strip-unneeded --strip-debug --merge-notes starlanes
install: install:
cp starlanes $(INSTALLDIR)/bin cp starlanes $(INSTALLDIR)/bin

27
README
View File

@ -1,8 +1,23 @@
Type "make" to build the starlanes binaries, then sign on as root Type "make" to build the starlanes binaries, then type "make fakeinstall"
an type "make fakeinstall" which will, pretend to install everything. If all the commands and paths that
which will, uh, pretend to install everything. If all the commands that it's going to use look correct, then go ahead and type "make install" (as
it's going to execute look correct, go ahead and type "make install" (as root) to install the goods system-wide
root) to install the goods. or run it directly from the directory with ./starlanes
I removed the AI, at least for now
(feel free to add it back if you figure out how to properly fix it)
I also changed the company names slightly, and adjusted the stats for no reason
most importantly, after experiencing troubles where someone accidentally closed
the final stats screen, I modified it to only close when pressing Y (doesn't matter if lower or uppercase)
there are still plenty of warnings left to fix,
but they don't affect the gameplay
~jan6
jan6@tilde.ninja and jan6@envs.net
--------
rest of the readme is written by other people
--------
I would like to claim that the reason there is no I would like to claim that the reason there is no
configure file is because for a small program configure file is because for a small program
@ -25,6 +40,8 @@ you installed starlanes and type "./starlanes"
David David
"dejvid@zamir.net" and "dejvid@barnsdle.demon.co.uk" "dejvid@zamir.net" and "dejvid@barnsdle.demon.co.uk"
---
This is a port to C from a version of Starlanes for the Osborne 1. The This is a port to C from a version of Starlanes for the Osborne 1. The
original source is from a First Osborne Group (FOG) disk that I probably original source is from a First Osborne Group (FOG) disk that I probably
picked up in 1982. The author isn't identified. Based on comments in picked up in 1982. The author isn't identified. Based on comments in

View File

@ -1,3 +1,20 @@
Version 1.4.0 released 2020 by ~jan6
jan6@tilde.ninja and jan6@envs.net
Removed AI (crashes when trying to use it)
Changed some stats and company names slightly
Modified final stats screen to not exit unless player presses "Y"
Fixed a couple critical errors preventing compilation
Added "make clean"
Stripped the binary (about halving final size)
Version 1.3.0 released 2004 by David Barnsdale Version 1.3.0 released 2004 by David Barnsdale
dejvid@barnsdle.demon.co.uk and dejvid@zamir.net dejvid@barnsdle.demon.co.uk and dejvid@zamir.net

View File

@ -7,11 +7,10 @@
** This program is distributed in the hope that it will be useful, ** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of ** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details. ** GNU General Public License v2 for more details.
** **
** You should have received a copy of the GNU General Public License ** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software ** along with this program;
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#define OFFMAP '-' /* space character */ #define OFFMAP '-' /* space character */
@ -22,12 +21,12 @@
#define NUMCO 5 /* number of companies (don't change) */ #define NUMCO 5 /* number of companies (don't change) */
#define INIT_CO_COST 100 /* initial company start cost */ #define INIT_CO_COST 100 /* initial company start cost */
#define FOUNDER_BONUS 5 /* founder gets this much stock */ #define FOUNDER_BONUS 10 /* founder gets this much stock */
#define NUMMOVES 5 /* number of moves options a player gets */ #define NUMMOVES 6 /* number of moves options a player gets */
#define MAXPLAYERS 4 /* total number of players a game can have */ #define MAXPLAYERS 4 /* total number of players a game can have */
#define STARCOST 500 /* company's price increase near star */ #define STARCOST 555 /* company's price increase near star */
#define BLACKHOLECOST -500 /* price increase near black hole */ #define BLACKHOLECOST -500 /* price increase near black hole */
#define NEWCOCOST 100 /* company's price increase near new co */ #define NEWCOCOST 111 /* company's price increase near new co */
#define Mx 12 /* x dimension of map */ #define Mx 12 /* x dimension of map */
@ -63,7 +62,3 @@ typedef struct {
int risk; /* value related to chance of being swallowed by Black Hole */ int risk; /* value related to chance of being swallowed by Black Hole */
int netpot; /* potential - risk */ int netpot; /* potential - risk */
} COMPANY; } COMPANY;

View File

@ -2,7 +2,7 @@
** starlanes v1.3.0 (29-Mar-1997) -- a space-age stock trading game ** starlanes v1.3.0 (29-Mar-1997) -- a space-age stock trading game
** **
** Copyright (C) 1997 Brian "Beej" Hall ** Copyright (C) 1997 Brian "Beej" Hall
** with modifications by David Barnsdale 2004 ** with modifications by David Barnsdale 2004 and by ~jan6 2020
** **
** This program is free software; you can redistribute it and/or ** This program is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License ** modify it under the terms of the GNU General Public License
@ -101,7 +101,8 @@
/* #define NUMMOVES 5 number of different moves a player gets */ /* #define NUMMOVES 5 number of different moves a player gets */
#define END_PERCENT 54 /* end when this much of the map is full */ //#define END_PERCENT 55 /* end when this much of the map is full */
#define END_PERCENT 1 /* end when this much of the map is full */
#define DEF_LINES 25 /* default number of lines on screen */ #define DEF_LINES 25 /* default number of lines on screen */
#define DEF_COLUMNS 80 /* default number of columns on screen */ #define DEF_COLUMNS 80 /* default number of columns on screen */
@ -120,9 +121,9 @@
/* function prototypes: */ /* function prototypes: */
extern void generate_nme(char *nme); //extern void generate_nme(char *nme);
extern char placemove( PLAYER *pla,int *move, COMPANY *co, int turn,char *map, int Difficulty); //extern char placemove( PLAYER *pla,int *move, COMPANY *co, int turn,char *map, int Difficulty);
extern void ai_buy_sell(PLAYER *pla, COMPANY *com, int turn,char *map, int Difficulty); //extern void ai_buy_sell(PLAYER *pla, COMPANY *com, int turn,char *map, int Difficulty);
void initialize(void); void initialize(void);
void color_setup(void); void color_setup(void);
@ -153,7 +154,7 @@ void redraw(void);
void show_standings(char *title); void show_standings(char *title);
void show_company_holdings(char *title); void show_company_holdings(char *title);
int order_compare(const void *v1, const void *v2); int order_compare(const void *v1, const void *v2);
void quit_yn(void); int quit_yn(void);
void shutdown(void); void shutdown(void);
void usage(void); void usage(void);
/* ai functions /* ai functions
@ -176,13 +177,13 @@ int MAPY = My; /* y dimension of map */
int LINES; /* lines in screen */ int LINES; /* lines in screen */
int COLUMNS; /* columns in screen */ int COLUMNS; /* columns in screen */
char *map; /* pointer to the map data */ char *map; /* pointer to the map data */
char *mapc; /* copy of map for ai */ //char *mapc; /* copy of map for ai */
PLAYER *pl; /* pointer to array of players */ PLAYER *pl; /* pointer to array of players */
COMPANY *co; /* pointer to array of companies */ COMPANY *co; /* pointer to array of companies */
int numplayers,turn; /* number of players, whose turn it is */ int numplayers,turn; /* number of players, whose turn it is */
WINDOW *mapwin,*general,*coinfo; /* pointers to the windows */ WINDOW *mapwin,*general,*coinfo; /* pointers to the windows */
int color; /* true if we want color */ int color; /* true if we want color */
int sologame; /* set to true if nmr of playes is 0*/ int sologame=0; /* set to true if nmr of playes is 0*/
int Difficulty; int Difficulty;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@ -247,10 +248,10 @@ int main(int argc, char *argv[])
holding_bonus(); holding_bonus();
if ((done = check_endgame()) != 1) { if ((done = check_endgame()) != 1) {
if (pl[turn].ishuman==1) buy_sell(); if (pl[turn].ishuman==1) buy_sell();
else { //else {
*mapc=*map ; //mapc=*map ;
ai_buy_sell(pl,co,turn,map,Difficulty); //ai_buy_sell(pl,co,turn,map,Difficulty);
} //}
turn = (++turn)%numplayers; turn = (++turn)%numplayers;
} }
} while (!done); } while (!done);
@ -285,11 +286,11 @@ void initialize(void)
fprintf(stderr,"starlanes: error mallocing space for map\n"); fprintf(stderr,"starlanes: error mallocing space for map\n");
exit(1); exit(1);
} }
if ((mapc=malloc(MAPX*MAPY)) == NULL) { /* if ((mapc=malloc(MAPX*MAPY)) == NULL) {
fprintf(stderr,"starlanes: error mallocing space for copy of map\n"); fprintf(stderr,"starlanes: error mallocing space for copy of map\n");
exit(1); exit(1);
} }
*/
if ((co=calloc(1,NUMCO * sizeof(COMPANY))) == NULL) { if ((co=calloc(1,NUMCO * sizeof(COMPANY))) == NULL) {
fprintf(stderr,"starlanes: error mallocing space for companies\n"); fprintf(stderr,"starlanes: error mallocing space for companies\n");
exit(1); exit(1);
@ -315,11 +316,11 @@ void initialize(void)
for(i=0;i<NUMCO;i++) { for(i=0;i<NUMCO;i++) {
switch(i) { switch(i) {
case 0: strcpy(co[i].name, "Altair Starways");break; case 0: strcpy(co[i].name, "Altar & Stairway, Ltd.");break;
case 1: strcpy(co[i].name, "Beetlejuice, Ltd.");break; case 1: strcpy(co[i].name, "Beatles & Juice Co.");break;
case 2: strcpy(co[i].name, "Capella Freight Co.");break; case 2: strcpy(co[i].name, "Capella Fright, Ltd.");break;
case 3: strcpy(co[i].name, "Denebola Shippers");break; case 3: strcpy(co[i].name, "Denebola Dice Shippers");break;
case 4: strcpy(co[i].name, "Eridani Expediters");break; case 4: strcpy(co[i].name, "Eridani Expert Export");break;
} }
co[i].size = co[i].price = 0; co[i].size = co[i].price = 0;
} }
@ -402,9 +403,9 @@ void get_num_players(void)
attron(color?YELLOW_ON_BLUE|A_BOLD:A_REVERSE); attron(color?YELLOW_ON_BLUE|A_BOLD:A_REVERSE);
center(stdscr,COLUMNS,6,"* S * T * A * R ** L * A * N * E * S *"); center(stdscr,COLUMNS,6,"* S * T * A * R ** L * A * N * E * S *");
attroff(color?YELLOW_ON_BLUE|A_BOLD:A_REVERSE); attroff(color?YELLOW_ON_BLUE|A_BOLD:A_REVERSE);
sprintf(s,"Please enter the number of players [1-%d] ",MAXPLAYERS); sprintf(s,"Please enter the number of players [1-%d] ",MAXPLAYERS);
center(stdscr,COLUMNS,9,s); center(stdscr,COLUMNS,9,s);
center(stdscr,COLUMNS,10,"or enter 0 for solo play against the ai: "); // center(stdscr,COLUMNS,10,"or enter 0 for solo play against the ai: ");
refresh(); refresh();
noecho();raw(); noecho();raw();
do { do {
@ -413,7 +414,8 @@ void get_num_players(void)
addch(c+'0'); addch(c+'0');
numplayers = (int)c; numplayers = (int)c;
if (numplayers == 0){ if (numplayers == 0) numplayers=1;
/* if (numplayers == 0){
numplayers=4; numplayers=4;
sologame=1; sologame=1;
sprintf(s,"Please enter level (1 easiest,3 hardest)"); sprintf(s,"Please enter level (1 easiest,3 hardest)");
@ -425,25 +427,25 @@ void get_num_players(void)
} while (Difficulty < 1 || Difficulty > 3); } while (Difficulty < 1 || Difficulty > 3);
addch(Difficulty+'0'); addch(Difficulty+'0');
} }
else sologame =0; else */ sologame=0;
srand(getpid()); /* reseed the dumb random number generator */ srand(getpid()); /* reseed the dumb random number generator */
turn = rand()%numplayers; turn = rand()%numplayers;
nl(); nl();
for(plnmr=0;plnmr<numplayers;plnmr++){ for(plnmr=0;plnmr<numplayers;plnmr++){
if (sologame==1 && plnmr>0){ /* if (sologame==1 && plnmr>0){
pl[plnmr].ishuman=0 /* here computer will generate a name */; pl[plnmr].ishuman=0 /* here computer will generate a name */;
generate_nme(pl[plnmr].name); /* generate_nme(pl[plnmr].name);
} }
else { else { */
sprintf(s,"Player %d, enter your name: ",plnmr+1); sprintf(s,"Player %d, enter your name: ",plnmr+1);
center(stdscr,COLUMNS-8 ,12+sologame+plnmr,s); center(stdscr,COLUMNS-8 ,12+sologame+plnmr,s);
refresh(); refresh();
my_mvwgetstr(stdscr,plnmr+12+sologame,49,20,0,pl[plnmr].name); my_mvwgetstr(stdscr,plnmr+12+sologame,49,20,0,pl[plnmr].name);
/*getstr(pl[plnmr].name);*/ /*getstr(pl[plnmr].name);*/
if (pl[plnmr].name[0] == '\0') plnmr--; if (pl[plnmr].name[0] == '\0') plnmr--;
} // }
} }
nonl(); nonl();
} }
@ -536,7 +538,8 @@ void show_coinfo(void)
case 4: attrs = CO_E;break; case 4: attrs = CO_E;break;
} }
wattron(coinfo,attrs); wattron(coinfo,attrs);
wprintw(coinfo," %-19s ",co[i].name); // wprintw(coinfo," %-19s ",co[i].name);
wprintw(coinfo," %-22s ",co[i].name);
wattroff(coinfo,attrs); wattroff(coinfo,attrs);
wprintw(coinfo,"$%-4d ",co[i].price); wprintw(coinfo,"$%-4d ",co[i].price);
/*if (pl[turn].holdings[i] == 0) wattron(coinfo,A_BLINK);*/ /*if (pl[turn].holdings[i] == 0) wattron(coinfo,A_BLINK);*/
@ -601,7 +604,7 @@ int get_move(void)
c = getch(); c = getch();
splat =c; splat =c;
} }
else { c=placemove(pl,move,co,turn,map,Difficulty);} /* ai will choose place */ else {1==1;} // c=placemove(pl,move,co,turn,map,Difficulty);} /* ai will choose place */
if (c == CTRL_L) { if (c == CTRL_L) {
redraw(); redraw();
continue; continue;
@ -1343,10 +1346,17 @@ void show_standings(char *title)
sprintf(s,"Available company sectors remaining: %d", togo); sprintf(s,"Available company sectors remaining: %d", togo);
center(stand,60,5+numplayers, s); center(stand,60,5+numplayers, s);
center(stand,60,7+numplayers,"Press any key to continue..."); if (check_endgame() == 1){
center(stand,60,7+numplayers,"Press \"Y\" key to continue.");
} else {
center(stand,60,7+numplayers,"Press any key to continue...");
};
wnoutrefresh(stand); wnoutrefresh(stand);
doupdate(); doupdate();
getch(); if (check_endgame() == 1) {
while(1){doupdate();if (toupper(getch()) == 'Y'){break;};}
}
else {getch();};
delwin(stand); delwin(stand);
touchwin(mapwin); touchwin(mapwin);
touchwin(general); touchwin(general);
@ -1513,13 +1523,13 @@ void show_company_holdings(char *title)
** quit_yn() -- asks the users if they're sure they want to quit ** quit_yn() -- asks the users if they're sure they want to quit
*/ */
void quit_yn(void) int quit_yn(void)
{ {
WINDOW *yn; WINDOW *yn;
if ((yn = newwin(5,42,5,(COLUMNS-42)/2)) == NULL) { if ((yn = newwin(5,42,5,(COLUMNS-42)/2)) == NULL) {
fprintf(stderr,"starlanes: couldn't open window for y/n prompt\n"); fprintf(stderr,"starlanes: couldn't open window for y/n prompt\n");
exit(1); exit(1);return 0;
} }
wattron(yn,QUIT_BORDER); wattron(yn,QUIT_BORDER);
@ -1536,11 +1546,12 @@ void quit_yn(void)
if (toupper(getch()) == 'Y') { if (toupper(getch()) == 'Y') {
delwin(yn); delwin(yn);
shutdown(); shutdown();
exit(2); exit(2);return 0;
} }
delwin(yn); delwin(yn);
touchwin(mapwin);touchwin(coinfo); touchwin(mapwin);touchwin(coinfo);
wnoutrefresh(mapwin);wnoutrefresh(coinfo); wnoutrefresh(mapwin);wnoutrefresh(coinfo);
return 1;
} }
/* /*
@ -1555,6 +1566,7 @@ void shutdown(void)
endwin(); endwin();
printf("Starlanes for ncurses v%s Copyright by Brian \"Beej\" Hall 1997 \n",VERSION); printf("Starlanes for ncurses v%s Copyright by Brian \"Beej\" Hall 1997 \n",VERSION);
printf("Update: David Barnsdale 2004\n"); printf("Update: David Barnsdale 2004\n");
printf("Update: jan6 2020\n");
} }