billr@saab.CNA.TEK.COM (Bill Randle) (07/12/89)
Submitted-by: srt@aerospace.aero.org Posting-number: Volume 7, Issue 16 Archive-name: hotel/Part02 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 2 (of 2)." # Contents: Notice costs.c defs.h help.c makefile my_wgets.c # my_wgets.h pcdisp.c utils.c # Wrapped by billr@saab on Wed Jul 12 07:06:47 1989 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'Notice' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Notice'\" else echo shar: Extracting \"'Notice'\" \(2164 characters\) sed "s/^X//" >'Notice' <<'END_OF_FILE' X X This program (called "Hotel") is copyright 1989 to Scott R. Turner, X in both source code and executable form. Permission is given to X copy both the source code and the executable under the following X conditions: X X 1. You may copy and distribute verbatim copies of Hotel code as you X receive it, in any medium, provided that you conspicuously and X appropriately publish on each file a valid copyright notice such as X "Copyright (C) 1989 Scott R. Turner", and keep intact the copyright X and license notices on all files. You may charge a distribution fee X for the physical act of transferring a copy, but that fee may not X exceed your actual costs in creating and delivering the copy. X X 2. You may modify your copy or copies of Hotel or any portion of it, X and copy and distribute such modifications under the terms of X Paragraph 1 above, provided that you also do the following: X X a) cause the modified files to carry prominent notices stating X who last changed such files and the date of any change; and X X b) cause the whole of any work that you distribute or publish, X that in whole or in part contains or is a derivative of Hotel X or any part thereof, to be licensed at no charge to all third X parties on terms identical to those contained in this License X Agreement (except that you may choose to grant more extensive X warranty protection to third parties, at your option). X X 3. You may not copy, sublicense, distribute or transfer Hotel X except as expressly provided under this License Agreement. Any attempt X otherwise to copy, sublicense, distribute or transfer Hotel is void and X your rights to use Hotel under this License agreement shall be X automatically terminated. However, parties who have received computer X software programs from you with this License Agreement will not have X their licenses terminated so long as such parties remain in full compliance. X X 4. Under no circumstances may you charge for copies of Hotel, for copies X of any program containing code from Hotel in whole or in part, or for X any software package or collection of programs or code that contains Hotel X in whole or part. END_OF_FILE if test 2164 -ne `wc -c <'Notice'`; then echo shar: \"'Notice'\" unpacked with wrong size! fi # end of 'Notice' fi if test -f 'costs.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'costs.c'\" else echo shar: Extracting \"'costs.c'\" \(3554 characters\) sed "s/^X//" >'costs.c' <<'END_OF_FILE' X/* X * This program (called "Hotel") is copyright 1989 to Scott R. Turner, X * in both source code and executable form. Permission is given to X * copy both the source code and the executable under the following X * conditions: X * X * COPYING POLICIES X * X * 1. You may copy and distribute verbatim copies of Hotel code as you X * receive it, in any medium, provided that you conspicuously and X * appropriately publish on each file a valid copyright notice such as X * "Copyright (C) 1989 Scott R. Turner", and keep intact the copyright X * and license notices on all files. You may charge a distribution fee for the X * physical act of transferring a copy, but that fee may not exceed X * your actual costs in creating and delivering the copy. X * X * 2. You may modify your copy or copies of Hotel or any portion of it, X * and copy and distribute such modifications under the terms of X * Paragraph 1 above, provided that you also do the following: X * X * a) cause the modified files to carry prominent notices stating X * who last changed such files and the date of any change; and X * X * b) cause the whole of any work that you distribute or publish, X * that in whole or in part contains or is a derivative of Hotel X * or any part thereof, to be licensed at no charge to all third X * parties on terms identical to those contained in this License X * Agreement (except that you may choose to grant more extensive X * warranty protection to third parties, at your option). X * X * 3. You may not copy, sublicense, distribute or transfer Hotel X * except as expressly provided under this License Agreement. Any attempt X * otherwise to copy, sublicense, distribute or transfer Hotel is void and X * your rights to use Hotel under this License agreement shall be X * automatically terminated. However, parties who have received computer X * software programs from you with this License Agreement will not have X * their licenses terminated so long as such parties remain in full compliance. X * X * 4. Under no circumstances may you charge for copies of Hotel, for copies X * of any program containing code from Hotel in whole or in part, or for X * any software package or collection of programs or code that contains Hotel X * in whole or part. X * X */ X/* X * COSTS X * Scott R. Turner X * 9/10/88 X * X * Costs contains the functions to compute the cost of a share of stock in X * a hotel and the function to figure the majority holders bonus. X * X */ X X#include "defs.h" X X/* X * Share_cost returns the cost per share of a hotel. X * X */ X Xstatic int cost_table[42] = { 0, 0, X /* 2 3 4 5 6 7 8 9 10 */ X 200, 300, 400, 500, 600, 600, 600, 600, 600, X /* 11 12 13 14 15 16 17 18 19 20 */ X 700, 700, 700, 700, 700, 700, 700, 700, 700, 700, X /* 21 22 23 24 25 26 27 28 29 30 */ X 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, X /* 31 32 33 34 35 36 37 38 39 40 41+ */ X 900, 900, 900, 900, 900, 900, 900, 900, 900, 900, 1000}; X Xshare_cost(hot) X int hot; X{ X X if (hotels[hot].size < 2) { X return(cost_table[2]+(100*hotels[hot].class)); X } else if (hotels[hot].size > 40) { X return(cost_table[41]+(100 * hotels[hot].class)); X } else return(cost_table[hotels[hot].size]+(100*hotels[hot].class)); X X}; X X/* X * majority_bonus returns the first & second major holders bonuses. X * X */ X Xmajority_bonus (hot, first, second) X int hot, *first, *second; X{ X int cost; X X cost = share_cost(hot); X *first = 10*cost; X *second = 5*cost; X X}; END_OF_FILE if test 3554 -ne `wc -c <'costs.c'`; then echo shar: \"'costs.c'\" unpacked with wrong size! fi # end of 'costs.c' fi if test -f 'defs.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'defs.h'\" else echo shar: Extracting \"'defs.h'\" \(3776 characters\) sed "s/^X//" >'defs.h' <<'END_OF_FILE' X/* X * This program (called "Hotel") is copyright 1989 to Scott R. Turner, X * in both source code and executable form. Permission is given to X * copy both the source code and the executable under the following X * conditions: X * X * COPYING POLICIES X * X * 1. You may copy and distribute verbatim copies of Hotel code as you X * receive it, in any medium, provided that you conspicuously and X * appropriately publish on each file a valid copyright notice such as X * "Copyright (C) 1986 Scott R. Turner", and keep intact the copyright X * and license notices on all files. You may charge a distribution fee for the X * physical act of transferring a copy, but that fee may not exceed X * your actual costs in creating and delivering the copy. X * X * 2. You may modify your copy or copies of Hotel or any portion of it, X * and copy and distribute such modifications under the terms of X * Paragraph 1 above, provided that you also do the following: X * X * a) cause the modified files to carry prominent notices stating X * who last changed such files and the date of any change; and X * X * b) cause the whole of any work that you distribute or publish, X * that in whole or in part contains or is a derivative of Hotel X * or any part thereof, to be licensed at no charge to all third X * parties on terms identical to those contained in this License X * Agreement (except that you may choose to grant more extensive X * warranty protection to third parties, at your option). X * X * 3. You may not copy, sublicense, distribute or transfer Hotel X * except as expressly provided under this License Agreement. Any attempt X * otherwise to copy, sublicense, distribute or transfer Hotel is void and X * your rights to use Hotel under this License agreement shall be X * automatically terminated. However, parties who have received computer X * software programs from you with this License Agreement will not have X * their licenses terminated so long as such parties remain in full compliance. X * X * 4. Under no circumstances may you charge for copies of Hotel, for copies X * of any program containing code from Hotel in whole or in part, or for X * any software package or collection of programs or code that contains Hotel X * in whole or part. X * X */ X/* X defs.h X Scott R. Turner X 9/7/88 X X This file contains the data structure and constant X definitions for Hotel. X X*/ X#include <stdio.h> X#include <curses.h> X#include <ctype.h> X X/* Constants */ X X#define MAXHOTELS 12 X#define MAXPLAYERS 7 X#define MAXBOARD 20 X#define MAXSTRATEGIES 20 X#define MAXSHARES 50 X#define TURNLIMIT 100 X#define UNUSED 99 /* Placed but unused tiles. */ X#define UNPLAYABLE -100 /* Tiles which aren't playable because they would X * merge two safe hotel chains. X */ X X/* Interaction Defines */ X X#define REFRESHKEY 12 X#define QUITKEY 'Q' X#define HELPKEY 'H' X X/* Functions */ X X#define round(x) (int) (x + .5) X X/* Hotel Definition */ X Xtypedef struct hotelstruct { X int size; /* # of squares occupied */ X int shares; /* # of outstanding shares */ X int class; /* price class */ X char name[80]; /* name of hotel */ X} hotel; X X/* Player Definition */ X Xtypedef struct playerstruct { X long cash; /* Cash on hand for this player */ X int strategy; /* Strategy, 0 Human Player */ X char name[80]; /* Name of player */ X int shares[MAXHOTELS]; /* # shares in each hotel */ X} player; X Xextern hotel hotels[MAXHOTELS+1]; Xextern player players[MAXPLAYERS+1]; Xextern int board[MAXBOARD+1][MAXBOARD+1]; Xextern int numplayers, numhotels, boardsize, X numshares, numtiles, startcash,pnum; Xextern int turn, maxbuy; Xextern WINDOW *iowin; Xextern int debug; /* Debug flag */ Xextern int human_player; END_OF_FILE if test 3776 -ne `wc -c <'defs.h'`; then echo shar: \"'defs.h'\" unpacked with wrong size! fi # end of 'defs.h' fi if test -f 'help.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'help.c'\" else echo shar: Extracting \"'help.c'\" \(7991 characters\) sed "s/^X//" >'help.c' <<'END_OF_FILE' X/* X * This program (called "Hotel") is copyright 1989 to Scott R. Turner, X * in both source code and executable form. Permission is given to X * copy both the source code and the executable under the following X * conditions: X * X * COPYING POLICIES X * X * 1. You may copy and distribute verbatim copies of Hotel code as you X * receive it, in any medium, provided that you conspicuously and X * appropriately publish on each file a valid copyright notice such as X * "Copyright (C) 1989 Scott R. Turner", and keep intact the copyright X * and license notices on all files. You may charge a distribution fee for the X * physical act of transferring a copy, but that fee may not exceed X * your actual costs in creating and delivering the copy. X * X * 2. You may modify your copy or copies of Hotel or any portion of it, X * and copy and distribute such modifications under the terms of X * Paragraph 1 above, provided that you also do the following: X * X * a) cause the modified files to carry prominent notices stating X * who last changed such files and the date of any change; and X * X * b) cause the whole of any work that you distribute or publish, X * that in whole or in part contains or is a derivative of Hotel X * or any part thereof, to be licensed at no charge to all third X * parties on terms identical to those contained in this License X * Agreement (except that you may choose to grant more extensive X * warranty protection to third parties, at your option). X * X * 3. You may not copy, sublicense, distribute or transfer Hotel X * except as expressly provided under this License Agreement. Any attempt X * otherwise to copy, sublicense, distribute or transfer Hotel is void and X * your rights to use Hotel under this License agreement shall be X * automatically terminated. However, parties who have received computer X * software programs from you with this License Agreement will not have X * their licenses terminated so long as such parties remain in full compliance. X * X * 4. Under no circumstances may you charge for copies of Hotel, for copies X * of any program containing code from Hotel in whole or in part, or for X * any software package or collection of programs or code that contains Hotel X * in whole or part. X * X */ X/* X * help.c X * Scott R. Turner X * 2/1/89 X * X * This file contains the help screen. X * X */ X#include "defs.h" Xextern void any_key(); X Xvoid help() X{ X char ch; Xclear(); Xprintw(" About Hotel\n\n"); Xprintw("Hotel is game of building and controlling hotel chains. It is played\n"); Xprintw("on a %d by %d board. Each player takes turns placing tiles on the\n", boardsize, boardsize); Xprintw("board. When two tiles are adjacent, a new hotel is created, and the creator\n"); Xprintw("is given one share of stock in the new hotel. The hotels are numbered\n"); Xprintw("A, B, C and so on. There can be a maximum of %d hotels.\n",numhotels); Xprintw("\nThe Screen\n\n"); Xprintw("The left portion of the screen will display the board. Hotel chains will\n"); Xprintw("be shown by the appropriate capital letter. Played tiles which are not a\n"); Xprintw("part of any hotel chain are shown as boxes. Tiles which you can play are\n"); Xprintw("number from 1 to %d.\n\n",numtiles); Xprintw("The right side of the screen shows the status of all the hotels and how much\n"); Xprintw("money you currently have. For each hotel, one line shows the cost of a share\n"); Xprintw("in that hotel, how many shares you currently hold, and how many shares are\n"); Xprintw("still available.\n\n"); Xprintw("---Hit any key to continue---"); Xrefresh(); Xch = getch(); Xclear(); Xprintw("\nThe Play\n\n"); Xprintw("You can play a tile by simply typing the number of the tile you wish to play.\n"); Xprintw("If your play creates a new hotel, you will be asked to choose which hotel\n"); Xprintw("you'd like to create. If no hotels are available, you are not allowed to make\n"); Xprintw("a play which would create a new hotel.\n\n"); Xprintw("If your play makes two hotels touch each other, the smaller hotel is merged\n"); Xprintw("into the larger hotel. If both are the same size, you are given your choice\n"); Xprintw("which to merge. When a hotel is merged, everyone who owns stock in the merged\n"); Xprintw("hotel is given a chance to trade in or sell their stock. In addition, the two\n"); Xprintw("players who own the most stock in the merged hotel are paid bonuses. This\n"); Xprintw("is the only source of income in the game.\n\n"); Xprintw("When a hotel reaches a size of 10, it is said to be `safe' and cannot be\n"); Xprintw("merged into another hotel.\n\n"); Xprintw("The game ends when all the hotels are safe or when one hotel covers almost\n"); Xprintw("half the board.\n\n"); Xprintw("---Hit any key to continue---"); Xrefresh(); Xch = getch(); Xclear(); Xprintw("\nStock\n\n"); Xprintw("Each turn, you may purchase up to three shares of stock. To purchase a share,\n"); Xprintw("type the letter corresponding to the hotel. If you do not have enough money\n"); Xprintw("for the purchase, or if the hotel's stock is not currently available, the game\n"); Xprintw("will beep and reject your purchase.\n\n"); Xprintw("To purchase less than three shares, type a carriage return to end your\n"); Xprintw("purchasing.\n\n"); Xprintw("As a hotel grows in size, its stock becomes more expensive, so\n"); Xprintw("it is a good idea to enlarge the hotels you own stock in.\n\n"); Xprintw("---Hit any key to continue---"); Xrefresh(); Xch = getch(); Xclear(); Xprintw("\nGeneral\n\n"); Xprintw("Most of the time, the 'q' key will quit the game and ^L will refresh\n"); Xprintw("the screen. 'h' will usually give some help.\n"); Xprintw("\nCredits\n\n"); Xprintw("Hotel was written by Scott R. Turner (srt@cs.ucla.edu). Special thanks\n"); Xprintw("must go to Matthew Merzbacher (matthew@cs.ucla.edu) for help in debugging\n"); Xprintw("and testing the various versions, and for helping me win the 1989 ACM\n"); Xprintw("Scholastic Programming Championship.\n\n"); Xprintw("---Hit any key to continue---"); Xrefresh(); Xch = getch(); Xclear(); X}; X Xvoid anykey_help() X{ X int y,x; X getyx(curscr,y,x); X move((LINES-2),0); X clrtobot(); X printw("Hit any key to continue on with the program. You may hit\n"); X printw("`Q' to quit the program, or `^L' to refresh the screen."); X move(y,x); X refresh(); X}; X Xvoid getnum_help() X{ X int y,x; X getyx(curscr,y,x); X move((LINES-2),0); X clrtobot(); X printw("You should enter a number indicating the tile you wish to play.\n"); X printw("You may also enter `Q' to quit or `^L' to refresh the screen.\n"); X move(y,x); X refresh(); X}; X Xvoid buy_help() X{ X int y,x; X getyx(curscr,y,x); X move((LINES-5),0); X clrtobot(); X printw("Type the letter for the hotel for each stock you wish to buy, up\n"); X printw("to a maximum of three. For instance, typing `abb' would buy two shares\n"); X printw("of Hotel B and one share of A. To buy less than three shares, hit a\n"); X printw("carriage return to end. The computer will beep if you do not have the\n"); X printw("money to make a purchase or if there is no stock available."); X move(y,x); X refresh(); X}; X Xvoid newhotel_help() X{ X int y,x; X getyx(curscr,y,x); X move((LINES-3),0); X clrtobot(); X printw("You are being asked to select a hotel to create. Type the letter of one\n"); X printw("of the available hotels. You may also type `Q' to quit and `^L' to\n"); X printw("refresh the screen."); X move(y,x); X refresh(); X}; X Xvoid save_help() X{ X int y,x; X getyx(curscr,y,x); X move((LINES-4),0); X clrtobot(); X printw("You are being asked which of two or more hotels to save. All the hotels\n"); X printw("are the same size, and all of them will be liquidated EXCEPT the one you\n"); X printw("choose to save. Type the letter of the hotel to save, or `Q' to quit or\n"); X printw("type `^L' to refresh the screen."); X move(y,x); X refresh(); X}; X END_OF_FILE if test 7991 -ne `wc -c <'help.c'`; then echo shar: \"'help.c'\" unpacked with wrong size! fi # end of 'help.c' fi if test -f 'makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'makefile'\" else echo shar: Extracting \"'makefile'\" \(1051 characters\) sed "s/^X//" >'makefile' <<'END_OF_FILE' X# Makefile for Hotel X XOBJECTS = hotel.o human.o comp.o init.o utils.o costs.o help.o my_wgets.o display.o XPCOBJECTS = hotel.obj human.obj comp.obj init.obj utils.obj costs.obj display.obj help.obj my_wgets.obj XSOURCE = init.c utils.c hotel.c human.c costs.c comp.c help.c my_wgets.c XCFLAGS = -DUNIX X X.c.obj: X tcc -ms -c -a -N -v -DTURBO $< X Xhotel: $(OBJECTS) X cc -o hotel -O $(OBJECTS) -lcurses -ltermcap X Xpchotel: $(PCOBJECTS) X tcc -ms $(PCOBJECTS) scurses.lib X Xshar: hotel.1 hotel.2 Xhotel.1: README comp.c costs.c defs.h help.c makefile X shar README comp.c costs.c defs.h help.c makefile > hotel.1 Xhotel.2: hotel.c human.c init.c utils.c my_wgets.c my_wgets.h Notice X shar hotel.c human.c init.c utils.c display.c my_wgets.c my_wgets.h Notice > hotel.2 X Xdisplay.obj: defs.h Xcomp.c: defs.h Xhotel.obj: defs.h Xinit.obj: defs.h Xutils.obj: defs.h Xhuman.obj: defs.h my_wgets.h Xcosts.obj: defs.h Xhelp.obj: defs.h X Xdisplay.o: defs.h Xcomp.c: defs.h Xhotel.o: defs.h Xinit.o: defs.h Xutils.o: defs.h Xhuman.o: defs.h my_wgets.h Xcosts.o: defs.h Xhelp.o: defs.h X END_OF_FILE if test 1051 -ne `wc -c <'makefile'`; then echo shar: \"'makefile'\" unpacked with wrong size! fi # end of 'makefile' fi if test -f 'my_wgets.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'my_wgets.c'\" else echo shar: Extracting \"'my_wgets.c'\" \(4382 characters\) sed "s/^X//" >'my_wgets.c' <<'END_OF_FILE' X/* X * A possible replacement for curses' wgetstr(). Allows X * line editing as in csh. X * Recognizes the erase, kill chars, word deleting. X * X * By Hung Le (mott@ucscb.ucsc.edu ...!ucbvax!ucscc!ucscb!mott) X * History: X * 01/18/89 - Initial version X * 03/20/89 - Add control-w to delete word X * 05/17/89 - add option to return immediately or to bell() X * when buffer is full. X * X * Release to Public Domain X */ X#include <curses.h> X#ifdef UNIX X#include <sys/ioctl.h> X#include <sgtty.h> X#endif X X#define STD_INPUT 0 /* standard input */ X#define NEWLINE '\n' X#define SPACE ' ' X/* default for erase and kill characters */ X#define ERASE '\010' X#define KILL '\025' X#define WORD '\027' X X/* You bugger !!! you did something wrong */ X#define bell() fprintf(stderr,"%c", '\007') X X/* X * my_wgetstr(WINDOW *win, char *str, int size, int ret) X * win: the concerned window X * str: buffer holding input X * size: (size -1) is the maximum chars to get X * ret: flag indicating what to do when (size -1) is reached X * 0: ring bell() X * 1: returns X * two macros are defined in "my_wgetstr.h" as RET=1 and NO_RET=0 X * X * works same as wgetstr() in curses but allows editing. X * Recognizes the erase character and the kill character and X * WORD as the word deleting char. X * Will try to get the erase and kill char from the terminal setting. X * If failed, will use the default ERASE and KILL definitions. X * Word char is set to WORD. X * X * DOES NOT check for illegal scrolling. X * Returns X * . when received a new line character X * . if ( (strlen(str) == (size - 1)) and (ret) ) X * X * str[size - 1] must be set to '\0' to end the string properly X * so my_wgetstr(errwin, str, 8) will get at most 7 characters. X * X * Returned value is the number of chars read. X */ X Xmy_wgetstr(win, str, size, ret) XWINDOW *win; Xchar *str; Xint size; Xint ret; X{ X#ifdef UNIX X struct sgttyb ttyb; X#endif X char erase_char, kill_char; X register int x_pos, y_pos, index, in; X X#ifdef UNIX X if (ioctl(STD_INPUT, TIOCGETP, &ttyb) == -1) X { X#endif X /* X * failed to get terminal setting. Let's use the default X * ERASE and KILL X */ X erase_char = ERASE; X kill_char = KILL; X#ifdef UNIX X } X else X { X erase_char = ttyb.sg_erase; X kill_char = ttyb.sg_kill; X } X#endif X X /* X * since we are going to set noecho() and crmode() let's be safe and X * save the current tty X */ X savetty(); X noecho(); X crmode(); X X /* get current position */ X getyx(win, y_pos, x_pos); X /* intializing */ X index = 0; X str[index] = '\0'; X X /* while input char is not NEWLINE */ X while ((in = getch() & 0177) != NEWLINE) X { X /* if buffer is full (size -1) */ X if (index >= size - 1) X if (ret)/* return flag set, return immediately */ X break; X else /* allows editing chars to pass through */ X if ((in != erase_char) && (in != kill_char) && (in != WORD)) X { X /* warns user that buffer is full */ X bell(); X continue; X } X X if (in == erase_char) /* ERASING */ X { X if (index > 0) X { X mvwaddch(win, y_pos, --x_pos, SPACE); X str[--index] = SPACE; X wmove(win, y_pos, x_pos); X } X else X bell(); X } X else X if (in == kill_char) /* KILLING */ X { X if (index > 0) X while (index > 0) X { X mvwaddch(win, y_pos, --x_pos, SPACE); X str[--index] = SPACE; X wmove(win, y_pos, x_pos); X } X else X bell(); X } X else X if (in == WORD) /* WORD DELETING */ X { X if (index > 0) X { X /* throw away all spaces */ X while ((index > 0) && (str[index - 1] == SPACE)) X { X mvwaddch(win, y_pos, --x_pos, SPACE); X str[--index] = SPACE; X wmove(win, y_pos, x_pos); X } X /* move back until see another space */ X while ((index > 0) && (str[index - 1] != SPACE)) X { X mvwaddch(win, y_pos, --x_pos, SPACE); X str[--index] = SPACE; X wmove(win, y_pos, x_pos); X } X } X else X bell(); X } X else X { X mvwaddch(win, y_pos, x_pos++, in); X str[index++] = in; X } X /* show result */ X wrefresh(win); X } X /* ends the string properly */ X str[index] = '\0'; X /* restore the tty */ X resetty(); X /* returns number of chars read */ X return (index); X} X X/* X * Getint X * X * Just a little function for Hotel that gets an integer X * using Le's wgetstr. X * X * X */ X X#include "my_wgets.h" Xint getint() X{ X int x,y,num,ans; X char get[80]; X X num = 0; X do { X my_getstr(get,80,0); X num = sscanf(get,"%d",&ans); X } while (num == 0); X return(ans); X}; END_OF_FILE if test 4382 -ne `wc -c <'my_wgets.c'`; then echo shar: \"'my_wgets.c'\" unpacked with wrong size! fi # end of 'my_wgets.c' fi if test -f 'my_wgets.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'my_wgets.h'\" else echo shar: Extracting \"'my_wgets.h'\" \(421 characters\) sed "s/^X//" >'my_wgets.h' <<'END_OF_FILE' X/* X * A possible replacement for curses' wgetstr(). Allows X * limited editing. Recognizes the erase and kill chars. X * X * By Hung Le (mott@ucscb.ucsc.edu ...!ucbvax!ucscc!ucscb!mott) X * History: X * 05/18/89 - Initial version X * X * Release to Public Domain X */ X X/* following the curses's convention */ X#define my_getstr(str,size,ret) my_wgetstr(stdscr,str,size,ret) X#define RET 1 X#define NO_RET 0 Xextern int getint(); X END_OF_FILE if test 421 -ne `wc -c <'my_wgets.h'`; then echo shar: \"'my_wgets.h'\" unpacked with wrong size! fi # end of 'my_wgets.h' fi if test -f 'pcdisp.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'pcdisp.c'\" else echo shar: Extracting \"'pcdisp.c'\" \(6618 characters\) sed "s/^X//" >'pcdisp.c' <<'END_OF_FILE' X/* X * This program (called "Hotel") is copyright 1989 to Scott R. Turner, X * in both source code and executable form. Permission is given to X * copy both the source code and the executable under the following X * conditions: X * X * COPYING POLICIES X * X * 1. You may copy and distribute verbatim copies of Hotel code as you X * receive it, in any medium, provided that you conspicuously and X * appropriately publish on each file a valid copyright notice such as X * "Copyright (C) 1989 Scott R. Turner", and keep intact the copyright X * and license notices on all files. You may charge a distribution fee for the X * physical act of transferring a copy, but that fee may not exceed X * your actual costs in creating and delivering the copy. X * X * 2. You may modify your copy or copies of Hotel or any portion of it, X * and copy and distribute such modifications under the terms of X * Paragraph 1 above, provided that you also do the following: X * X * a) cause the modified files to carry prominent notices stating X * who last changed such files and the date of any change; and X * X * b) cause the whole of any work that you distribute or publish, X * that in whole or in part contains or is a derivative of Hotel X * or any part thereof, to be licensed at no charge to all third X * parties on terms identical to those contained in this License X * Agreement (except that you may choose to grant more extensive X * warranty protection to third parties, at your option). X * X * 3. You may not copy, sublicense, distribute or transfer Hotel X * except as expressly provided under this License Agreement. Any attempt X * otherwise to copy, sublicense, distribute or transfer Hotel is void and X * your rights to use Hotel under this License agreement shall be X * automatically terminated. However, parties who have received computer X * software programs from you with this License Agreement will not have X * their licenses terminated so long as such parties remain in full compliance. X * X * 4. Under no circumstances may you charge for copies of Hotel, for copies X * of any program containing code from Hotel in whole or in part, or for X * any software package or collection of programs or code that contains Hotel X * in whole or part. X * X */ X/* X * Wed Nov 2 11:28:34 1988 -- Scott R. Turner X * display_utils.c (PC Version) X * X * This file contains utility functions for maintaining X * the screen display. (Primarily print_board). X * X */ X X#include "defs.h" X#ifdef TURBO X#define DULCORNER 201 X#define DURCORNER 187 X#define DLRCORNER 188 X#define DLLCORNER 200 X#define DLINE 205 X#define DVERTICAL 186 X#define BLOCK 254 X#define POINT 250 X#define LINE 196 X#define LINETEE 194 X#define VERTICAL 179 X#define ULCORNER 218 X#define URCORNER 191 X#define LRCORNER 217 X#define LLCORNER 192 X#define TRIPLELINE 240 X#define LHORTEE 180 X#define RHORTEE 195 X#endif X X#ifdef UNIX X#define DULCORNER '+' X#define DURCORNER '+' X#define DLRCORNER '+' X#define DLLCORNER '+' X#define DLINE '-' X#define DVERTICAL '|' X#define BLOCK '*' X#define POINT '.' X#define LINE '-' X#define LINETEE '+' X#define VERTICAL '|' X#define ULCORNER '+' X#define URCORNER '+' X#define LRCORNER '+' X#define LLCORNER '+' X#define TRIPLELINE '*' X#define LHORTEE '|' X#define RHORTEE '|' X#endif X Xprint_board(p) X int p; X{ X int i,j,tile,x,y; X X getyx(stdscr,y,x); X tile = 1; X move(2,3); X addch(DULCORNER); X for(i=1;i<=boardsize;i++) { X move(2,(i-1)*2+4); X/* addstr("MM"); */ X addch(DLINE); X addch(DLINE); X } X move(2,boardsize*2+4); X addch(DLINE); X addch(DURCORNER); X/* addstr("M;"); */ X for(i=1;i<=boardsize;i++) { X move(i+2,3); X/* addch(':'); */ X addch(DVERTICAL); X for(j=1;j<=boardsize;j++) { X move(i+2,(2 * j)+3); X if (board[i][j] == UNUSED) { X/* addch('~'); */ X addch(BLOCK); X } else if (board[i][j] == 0) { X/* addch('y'); */ X addch(POINT); X } else if (board[i][j] == -p) { X standout(); X addch('0' + tile++); X standend(); X } else if (board[i][j] == UNPLAYABLE && debug) { X addch('*'); X } else if (board[i][j] < 0) { X/* addch('y'); */ X addch(POINT); X } else X addch(board[i][j] + 'A' - 1); X }; X move(i+2,(boardsize*2+5)); X/* addch(':'); */ X addch(DVERTICAL); X }; X move(boardsize+3,3); X/* addch('H'); */ X addch(DLLCORNER); X for(i=1;i<=boardsize;i++) { X move(boardsize+3,(i-1)*2+4); X/* addstr("MM"); */ X addch(DLINE); X addch(DLINE); X } X move(boardsize+3,boardsize*2+4); X/* addstr("M<"); */ X addch(DLINE); X addch(DLRCORNER); X X /* Now do rhs info. */ X X move(2,(boardsize*2+8)); X printw("Hotel Cost Yours Available"); X move(3,(boardsize*2+8)); X for (i=1;i<=6;i++) addch(LINE); X addch(LINETEE); X for (i=1;i<=8;i++) addch(LINE); X addch(LINETEE); X for (i=1;i<=7;i++) addch(LINE); X addch(LINETEE); X for (i=1;i<=10;i++) addch(LINE); X/* printw("D D D D D D B D D D D D D D D B D D D D D D D B D D D D D D D D D D"); */ X for(i=1;i<=numhotels;i++) { X move(i+3,(boardsize*2+10)); X clrtoeol(); X addch(i+'A'-1); X if(hotels[i].size > 0) { X move(i+3,(boardsize*2+17)); X printw("$%d",share_cost(i)); X } else { X move(i+3,(boardsize*2+16)); X printw("($%d)",share_cost(i)); X }; X if (players[p].shares[i] > 0) { X move(i+3,(boardsize*2+27)); X printw("%d",players[p].shares[i]); X }; X move(i+3,(boardsize*2+36)); X printw("%d",hotels[i].shares); X move(i+3,(boardsize*2+14)); X/* addch('3'); */ X addch(VERTICAL); X move(i+3,(boardsize*2+23)); X/* addch('3'); */ X addch(VERTICAL); X move(i+3,(boardsize*2+31)); X/* addch('3'); */ X addch(VERTICAL); X }; X X move(numhotels+6,(boardsize*2+18)); X clrtoeol(); X printw("Cash = $%d",players[p].cash); X move(0,0); X/* printw("ZDDDDDDDDDDDDDDDDDDDDDDDDD 4 pHpOpTpEpLp C D D D D D D D D D D D D D D D D D D D D D D D D ?"); */ X addch(ULCORNER); X for(i=1;i<=25;i++) addch(LINE); X addch(LHORTEE); addch(' '); X addch(TRIPLELINE); addch('H'); X addch(TRIPLELINE); addch('O'); X addch(TRIPLELINE); addch('T'); X addch(TRIPLELINE); addch('E'); X addch(TRIPLELINE); addch('L'); X addch(' '); addch(RHORTEE); X for(i=1;i<=25;i++) addch(LINE); X addch(URCORNER); X for(i=1;i<=(boardsize+3);i++) { X move(i,0); X/* addch('3'); */ X addch(VERTICAL); X move(i,65); X/* addch('3'); */ X addch(VERTICAL); X }; X move((boardsize + 4),0); X/* printw("@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDY"); */ X addch(LLCORNER); X for(i=1;i<=64;i++) addch(LINE); X addch(LRCORNER); X move(y,x); X refresh(); X}; X END_OF_FILE if test 6618 -ne `wc -c <'pcdisp.c'`; then echo shar: \"'pcdisp.c'\" unpacked with wrong size! fi # end of 'pcdisp.c' fi if test -f 'utils.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'utils.c'\" else echo shar: Extracting \"'utils.c'\" \(6857 characters\) sed "s/^X//" >'utils.c' <<'END_OF_FILE' X/* X * This program (called "Hotel") is copyright 1989 to Scott R. Turner, X * in both source code and executable form. Permission is given to X * copy both the source code and the executable under the following X * conditions: X * X * COPYING POLICIES X * X * 1. You may copy and distribute verbatim copies of Hotel code as you X * receive it, in any medium, provided that you conspicuously and X * appropriately publish on each file a valid copyright notice such as X * "Copyright (C) 1989 Scott R. Turner", and keep intact the copyright X * and license notices on all files. You may charge a distribution fee for the X * physical act of transferring a copy, but that fee may not exceed X * your actual costs in creating and delivering the copy. X * X * 2. You may modify your copy or copies of Hotel or any portion of it, X * and copy and distribute such modifications under the terms of X * Paragraph 1 above, provided that you also do the following: X * X * a) cause the modified files to carry prominent notices stating X * who last changed such files and the date of any change; and X * X * b) cause the whole of any work that you distribute or publish, X * that in whole or in part contains or is a derivative of Hotel X * or any part thereof, to be licensed at no charge to all third X * parties on terms identical to those contained in this License X * Agreement (except that you may choose to grant more extensive X * warranty protection to third parties, at your option). X * X * 3. You may not copy, sublicense, distribute or transfer Hotel X * except as expressly provided under this License Agreement. Any attempt X * otherwise to copy, sublicense, distribute or transfer Hotel is void and X * your rights to use Hotel under this License agreement shall be X * automatically terminated. However, parties who have received computer X * software programs from you with this License Agreement will not have X * their licenses terminated so long as such parties remain in full compliance. X * X * 4. Under no circumstances may you charge for copies of Hotel, for copies X * of any program containing code from Hotel in whole or in part, or for X * any software package or collection of programs or code that contains Hotel X * in whole or part. X * X */ X/* X * utils.c X * Scott R. Turner X * 9/7/88 X * X * Various utility functions. X * X */ X#include "defs.h" X Xextern int unplayable(); X#ifdef UNIX Xextern long random(); X#endif UNIX Xint tilecount = 0; X X/* X * randum is the standard 1-n random integer generator. X * X */ X Xint randum(n) X int n; X{ X if (!n) return(0); X#ifdef UNIX X return((random() % n) + 1); X#endif X#ifdef TURBO X return((rand() % n) + 1); X#endif X}; X X/* X * newtile replaces a tile in a player's holding with a tile X * from the board. X * X */ X Xnewtile(p) X int p; X{ X int x,y,available,choice; X X available=0; X for(x=1;x<=boardsize;x++) X for(y=1;y<=boardsize;y++) X if (board[x][y] == 0 && !unplayable(x,y)) available++; X X if (debug) { X printw("Available tiles = %d.\n",available); X refresh(); X }; X if (available == 0) return(0); X X choice = randum(available); X X for(x=1;x<=boardsize;x++) X for(y=1;y<=boardsize;y++) { X if (board[x][y] == 0) { X choice--; X if (choice == 0) { X board[x][y] = -p; X return(1); X }; X }; X }; X X return(0); X X}; X X/* X * new_hotel returns true if the placement creates a new hotel X * and there is a new hotel to create. X * X */ X Xnew_hotel(x,y) X int x,y; X{ X int i,j,new; X X /* Is the new tile adjacent to an existing hotel? */ X X new = 1; X for(i= -1;i<2;i++) X for(j= -1;j<2;j++) X if ( i*j == 0 && (i != 0 || j != 0) && X ((x+i) > 0) && ((y+j) > 0) && X ((x+i) <= boardsize) && ((y+j) <= boardsize) && X (board[x+i][y+j] > 0) && (board[x+i][y+j] < UNUSED)) { X new = 0; X break; X }; X X if (new == 0) return(new); X X /* Is there an UNUSED adjacent? */ X X new = 0; X for(i= -1;i<2;i++) X for(j= -1;j<2;j++) X if ( i*j == 0 && (i != 0 || j != 0) && X ((x+i) > 0) && ((y+j) > 0) && X ((x+i) <= boardsize) && ((y+j) <= boardsize) && X (board[x+i][y+j] == UNUSED)) { X new = 1; X break; X }; X X if (new == 0) return(new); X X/* Is there an available hotel? */ X X new = 0; X for(i=1;i<=numhotels;i++) X if(hotels[i].size == 0) { X new = 1; X break; X }; X X return(new); X X}; X Xint maj_bonus(p,i) X int p,i; X{ X int j,k,max1,num1,max2,num2,first,second; X X max1 = 0; X num1 = 0; X max2 = 0; X num2 = 0; X X for(j=1;j<=numplayers;j++) { X if (players[j].shares[i] > max1) { X max2 = max1; X num2 = num1; X max1 = players[j].shares[i]; X num1 = 1; X } else if (players[j].shares[i] == max1) { X num1++; X } else if (players[j].shares[i] > max2) { X max2 = players[j].shares[i]; X num2 = 1; X } else if (players[j].shares[i] == max2) { X num2++; X }; X }; X X majority_bonus(i,&first,&second); X X if (max2 == 0 || num1 > 1) { X X /* X * The top dogs split both. X * X */ X X for(k=1;k<=numplayers;k++) X if (players[k].shares[i] == max1 && k == p) { X return(round((first + second) / num1)); X }; X } else X for (k=1;k<=numplayers;k++) X if (players[k].shares[i] == max1 && k == p) { X return(round(first)); X } else if (players[k].shares[i] == max2 && k == p) { X return(round(second/num2)); X }; X X return(0); X X}; X X/* X * merge returns true if this play will merge 2 or more hotels. X * It returns the list of hotels that will/can be merge in X * possibles. X * X */ X Xint mergecheck(x,y,possibles) X int x,y,*possibles; X{ X int i,j,k,lsize,count,seen[MAXHOTELS]; X X if (unplayable(x,y)) return(0); X for (i=1;i<=numhotels;i++) seen[i] = 0; X lsize = 9999; X count = 0; X for(i= -1;i<2;i++) X for(j= -1;j<2;j++) X if ( i*j == 0 && (i != 0 || j != 0) && X ((x+i) > 0) && ((y+j) > 0) && X ((x+i) <= boardsize) && ((y+j) <= boardsize) && X (board[x+i][y+j] != UNUSED) && X (board[x+i][y+j] > 0)){ X if (!seen[board[x+i][y+j]]) { X count++; X seen[board[x+i][y+j]] = 1; X if (hotels[board[x+i][y+j]].size < lsize) { X for (k=1;k<=numhotels;k++) possibles[k] = 0; X lsize = hotels[board[x+i][y+j]].size; X possibles[board[x+i][y+j]] = 1; X } else if (hotels[board[x+i][y+j]].size == lsize) { X possibles[board[x+i][y+j]] = 1; X }; X }; X }; X X if (count < 2) return(0); X else return(1); X X}; X X/* X * adjacent returns the number of an adjacent hotel if there X * is one. adjacent assumes that there is at most one adjacent X * hotel. X * X */ X Xint adjacent(x,y,h) X int x,y,*h; X{ X int i,j; X X for(i= -1;i<2;i++) X for(j= -1;j<2;j++) X if ( i*j == 0 && (i != 0 || j != 0) && X ((x+i) > 0) && ((y+j) > 0) && X ((x+i) <= boardsize) && ((y+j) <= boardsize) && X (board[x+i][y+j] != UNUSED) && X (board[x+i][y+j] > 0)){ X *h = board[x+i][y+j]; X return(*h); X }; X *h = 0; X return(0); X}; X END_OF_FILE if test 6857 -ne `wc -c <'utils.c'`; then echo shar: \"'utils.c'\" unpacked with wrong size! fi # end of 'utils.c' fi echo shar: End of archive 2 \(of 2\). cp /dev/null ark2isdone MISSING="" for I in 1 2 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked both archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0