From b9db87273ce6232f85d7f046eae6c85682bcf8f6 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Thu, 1 Dec 1994 01:57:45 +0000 Subject: [PATCH] Initial revision --- Makefile | 102 +++++++++++++++++++++ empire.h | 272 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 374 insertions(+) create mode 100644 Makefile create mode 100644 empire.h diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1900fae --- /dev/null +++ b/Makefile @@ -0,0 +1,102 @@ +# %W% %G% %U% - (c) Copyright 1987, 1988 Chuck Simmons + +# +# Copyright (C) 1987, 1988 Chuck Simmons +# +# See the file COPYING, distributed with empire, for restriction +# and warranty information. + +# Change the line below for your compiler. You will probably want +# 'cc'. ('mcc' is a "merge compiler" that takes errors, merges them +# with the source, and tosses you into an editor. I also use various +# cross compilers on this line.) + +#CC = mcc +#CC = cpccc +CC = cc + +# Change the line below for your system. If you are on a Sun or Vax, +# you may want BSD. + +#SYS = BSD +SYS = SYSV + +# Use -g to compile the program for debugging. + +#DEBUG = -g -DDEBUG +DEBUG = -O + +# Use -p to profile the program. +#PROFILE = -p -DPROFILE +PROFILE = + +# Define all necessary libraries. 'curses' is necessary. 'termcap' +# is needed on BSD systems. +LIBS = -lcurses +#LIBS = -lcurses -ltermcap + +# You shouldn't have to modify anything below this line. + +FLAGS = $(DEBUG) $(PROFILE) -c -D$(SYS) +CCCMD = $(CC) $(FLAGS) +INS = /etc/install + +FILES = \ + attack.c \ + compmove.c \ + data.c \ + display.c \ + edit.c \ + empire.c \ + game.c \ + main.c \ + map.c \ + math.c \ + object.c \ + term.c \ + usermove.c \ + util.c + +SHARFILES = COPYING $(FILES) bugs README makefile empire.6 empire.h extern.h + +OFILES = \ + attack.o \ + compmove.o \ + data.o \ + display.o \ + edit.o \ + empire.o \ + game.o \ + main.o \ + map.o \ + math.o \ + object.o \ + term.o \ + usermove.o \ + util.o + +all: empire + +empire: $(OFILES) + $(CC) $(PROFILE) -o empire $(OFILES) $(LIBS) + +$(OFILES): extern.h empire.h + $(CCCMD) $< + +lint: $(FILES) + lint -u -D$(SYS) $(FILES) -lcurses + +clean: + rm -f *.o + +clobber: clean + rm -f empire + +sharsplit: $(SHARFILES) + sharsplit -m -r -o empire $(SHARFILES) + +install: empire + $(INS) -o -f /usr/local/games empire + +installman: empire.6 + $(INS) -f /usr/local/man/man6 empire.6 diff --git a/empire.h b/empire.h new file mode 100644 index 0000000..08fb94d --- /dev/null +++ b/empire.h @@ -0,0 +1,272 @@ +/* %W% %G% %U% - (c) Copyright 1987, 1988 Chuck Simmons */ + +/* + * Copyright (C) 1987, 1988 Chuck Simmons + * + * See the file COPYING, distributed with empire, for restriction + * and warranty information. + */ + +/* +empire.h -- type and constant declarations +*/ + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + +/* Redefine some functions for portability. */ + +#ifndef SYSV +#define memcpy(dst,src,len) bcopy((src),(dst),(len)) +#define strchr(s,c) index(s,c) +typedef char chtype; +#define beep() (putchar('\7')) +#define napms(d) (usleep((d)*1000)) +#else +char *memset(); +char *memcpy(); +#define bzero(dst,len) memset(dst,0,len) +#endif + +typedef unsigned char uchar; + +#define ASSERT(x) if (!(x)) assert ("x", __FILE__, __LINE__); +#define ABORT assert ("aborting", __FILE__, __LINE__) + +/* directions one can move */ +#define NORTH 0 +#define NORTHEAST 1 +#define EAST 2 +#define SOUTHEAST 3 +#define SOUTH 4 +#define SOUTHWEST 5 +#define WEST 6 +#define NORTHWEST 7 + +#define NUMTOPS 3 /* number of lines at top of screen for messages */ +#define NUMSIDES 6 /* number of lines at side of screen */ +#define STRSIZE 80 /* number of characters in a string */ + +/* Information we maintain about cities. */ + +#define NUM_CITY 70 +#define UNOWNED 0 +#define USER 1 +#define COMP 2 + +/* Piece types. */ +#define ARMY 0 +#define FIGHTER 1 +#define PATROL 2 +#define DESTROYER 3 +#define SUBMARINE 4 +#define TRANSPORT 5 +#define CARRIER 6 +#define BATTLESHIP 7 +#define SATELLITE 8 +#define NUM_OBJECTS 9 /* number of defined objects */ +#define NOPIECE ((char)255) /* a 'null' piece */ + +#define LIST_SIZE 5000 /* max number of pieces on board */ + +typedef struct city_info { + long loc; /* location of city */ + uchar owner; /* UNOWNED, USER, COMP */ + long func[NUM_OBJECTS]; /* function for each object */ + long work; /* units of work performed */ + char prod; /* item being produced */ +} city_info_t; + +/* +Types of programmed movement. Use negative numbers for special +functions, use positive numbers to move toward a specific location. +*/ + +#define NOFUNC -1 /* no programmed function */ +#define RANDOM -2 /* move randomly */ +#define SENTRY -3 /* sleep */ +#define FILL -4 /* fill transport */ +#define LAND -5 /* land fighter at city */ +#define EXPLORE -6 /* piece explores nearby */ +#define ARMYLOAD -7 /* army moves toward and boards a transport */ +#define ARMYATTACK -8 /* army looks for city to attack */ +#define TTLOAD -9 /* transport moves toward loading armies */ +#define REPAIR -10 /* ship moves toward port */ +#define WFTRANSPORT -11 /* army boards a transport */ +#define MOVE_N -12 /* move north */ +#define MOVE_NE -13 /* move northeast */ +#define MOVE_E -14 /* move east */ +#define MOVE_SE -15 /* move southeast */ +#define MOVE_S -16 /* move south */ +#define MOVE_SW -17 /* move southwest */ +#define MOVE_W -18 /* move west */ +#define MOVE_NW -19 /* move northwest */ + +/* Index to list of function names. */ +#define FUNCI(x) (-(x)-1) + +/* +Macro to convert a movement function into a direction. +*/ + +#define MOVE_DIR(a) (-(a)+MOVE_N) + +/* +Information we maintain about each piece. +*/ + +typedef struct { /* ptrs for doubly linked list */ + struct piece_info *next; /* pointer to next in list */ + struct piece_info *prev; /* pointer to prev in list */ +} link_t; + +typedef struct piece_info { + link_t piece_link; /* linked list of pieces of this type */ + link_t loc_link; /* linked list of pieces at a location */ + link_t cargo_link; /* linked list of cargo pieces */ + int owner; /* owner of piece */ + int type; /* type of piece */ + long loc; /* location of piece */ + long func; /* programmed type of movement */ + short hits; /* hits left */ + int moved; /* moves made */ + struct piece_info *ship; /* pointer to containing ship */ + struct piece_info *cargo; /* pointer to cargo list */ + short count; /* count of items on board */ + short range; /* current range (if applicable) */ +} piece_info_t; + +/* +Macros to link and unlink an object from a doubly linked list. +*/ + +#define LINK(head,obj,list) { \ + obj->list.prev = NULL; \ + obj->list.next = head; \ + if (head) head->list.prev = obj; \ + head = obj; \ +} + +#define UNLINK(head,obj,list) { \ + if (obj->list.next) \ + obj->list.next->list.prev = obj->list.prev; \ + if (obj->list.prev) \ + obj->list.prev->list.next = obj->list.next; \ + else head = obj->list.next; \ + obj->list.next = NULL; /* encourage mem faults in buggy code */ \ + obj->list.prev = NULL; \ +} + +/* macros to set map and list of an object */ +#define MAP(owner) ((owner) == USER ? user_map : comp_map) +#define LIST(owner) ((owner) == USER ? user_obj : comp_obj) + +/* macro to step through adjacent cells */ +#define FOR_ADJ(loc,new_loc,i) for (i=0; (i<8 ? new_loc=loc+dir_offset[i],1 : 0); i++) +#define FOR_ADJ_ON(loc,new_loc,i) FOR_ADJ(loc,new_loc,i) if (map[new_loc].on_board) + +/* +We maintain attributes for each piece. Attributes are currently constant, +but the way has been paved to allow user's to change attributes at the +beginning of a game. +*/ + +#define INFINITY 1000000 /* a large number */ + +typedef struct piece_attr { + char sname; /* eg 'C' */ + char name[20]; /* eg "aircraft carrier" */ + char nickname[20]; /* eg "carrier" */ + char article[20]; /* eg "an aircraft carrier" */ + char plural[20]; /* eg "aircraft carriers" */ + char terrain[4]; /* terrain piece can pass over eg "." */ + uchar build_time; /* time needed to build unit */ + uchar strength; /* attack strength */ + uchar max_hits; /* number of hits when completely repaired */ + uchar speed; /* number of squares moved per turn */ + uchar capacity; /* max objects that can be held */ + long range; /* range of piece */ +} piece_attr_t; + +/* +There are 3 maps. 'map' describes the world as it actually +exists; it tells whether each map cell is land, water or a city; +it tells whether or not a square is on the board. + +'user_map' describes the user's view of the world. 'comp_map' describes +the computer's view of the world. +*/ + +#define MAP_WIDTH 100 +#define MAP_HEIGHT 60 +#define MAP_SIZE (MAP_WIDTH * MAP_HEIGHT) + +typedef struct real_map { /* a cell of the actual map */ + char contents; /* '+', '.', or '*' */ + uchar on_board; /* TRUE iff on the board */ + city_info_t *cityp; /* ptr to city at this location */ + piece_info_t *objp; /* list of objects at this location */ +} real_map_t; + +typedef struct view_map { /* a cell of one player's world view */ + char contents; /* '+', '.', '*', 'A', 'a', etc */ + long seen; /* date when last updated */ +} view_map_t; + +/* Define information we maintain for a pathmap. */ + +typedef struct { + int cost; /* total cost to get here */ + int inc_cost; /* incremental cost to get here */ + char terrain; /* T_LAND, T_WATER, T_UNKNOWN, T_PATH */ +} path_map_t; + +#define T_UNKNOWN 0 +#define T_PATH 1 +#define T_LAND 2 +#define T_WATER 4 +#define T_AIR (T_LAND | T_WATER) + +/* A record for counts we obtain when scanning a continent. */ + +typedef struct { + int user_cities; /* number of user cities on continent */ + int user_objects[NUM_OBJECTS]; + int comp_cities; + int comp_objects[NUM_OBJECTS]; + int size; /* size of continent in cells */ + int unowned_cities; /* number of unowned cities */ + int unexplored; /* unexplored territory */ +} scan_counts_t; + +/* Define useful constants for accessing sectors. */ + +#define SECTOR_ROWS 5 /* number of vertical sectors */ +#define SECTOR_COLS 2 /* number of horizontal sectors */ +#define NUM_SECTORS (SECTOR_ROWS * SECTOR_COLS) /* total sectors */ +#define ROWS_PER_SECTOR ((MAP_HEIGHT+SECTOR_ROWS-1)/SECTOR_ROWS) +#define COLS_PER_SECTOR ((MAP_WIDTH+SECTOR_COLS-1)/SECTOR_COLS) + +/* Information we need for finding a path for moving a piece. */ + +typedef struct { + char city_owner; /* char that represents home city */ + char *objectives; /* list of objectives */ + int weights[11]; /* weight of each objective */ +} move_info_t; + +/* special weights */ +#define W_TT_BUILD -1 /* special cost for city building a tt */ + +/* List of cells in the perimeter of our searching for a path. */ + +typedef struct { + long len; /* number of items in list */ + long list[MAP_SIZE]; /* list of locations */ +} perimeter_t; -- 2.43.0