-/* $NetBSD: main.c,v 1.13 2004/04/07 17:46:47 ross Exp $ */
+/* $NetBSD: main.c,v 1.23 2009/08/31 08:27:16 dholland Exp $ */
/*
* Phantasia 3.3.2 -- Interterminal fantasy game
*/
#include <sys/types.h>
+#include <sys/stat.h>
+#include <err.h>
+#include <math.h>
#include <pwd.h>
+#include <setjmp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "macros.h"
+#include "phantdefs.h"
+#include "phantstruct.h"
+#include "phantglobs.h"
+#include "pathnames.h"
+
+#undef bool
+#include <curses.h>
/*
* The program allocates as much file space as it needs to store characters,
* main.c Main routines for Phantasia
*/
-#include "include.h"
-#include <curses.h>
+static void genchar(int);
+static void initialstate(void);
+static void neatstuff(void);
+static void playinit(void);
+static void procmain(void);
+static long recallplayer(void);
+static long rollnewplayer(void);
+static void titlelist(void);
int main(int, char **);
int
-main(argc, argv)
- int argc;
- char **argv;
+main(int argc, char **argv)
{
bool noheader = FALSE; /* set if don't want header */
bool headeronly = FALSE; /* set if only want header */
Timeout = TRUE;
/* update some important player statistics */
- strcpy(Player.p_login, Login);
+ strlcpy(Player.p_login, Login, sizeof(Player.p_login));
time(&seconds);
Player.p_lastused = localtime(&seconds)->tm_yday;
Player.p_status = S_PLAYING;
}
}
-void
-initialstate()
+static void
+initialstate(void)
{
+ struct stat sb;
+ struct passwd *pw;
+
Beyond = FALSE;
Marsh = FALSE;
Throne = FALSE;
Echo = TRUE;
/* setup login name */
- if ((Login = getlogin()) == NULL)
- Login = getpwuid(getuid())->pw_name;
+ if ((Login = getlogin()) == NULL) {
+ pw = getpwuid(getuid());
+ if (pw == NULL) {
+ errx(1, "Who are you?");
+ }
+ Login = pw->pw_name;
+ }
/* open some files */
if ((Playersfp = fopen(_PATH_PEOPLE, "r+")) == NULL)
if ((Energyvoidfp = fopen(_PATH_VOID, "r+")) == NULL)
error(_PATH_VOID);
+ if (fstat(fileno(Energyvoidfp), &sb) == -1)
+ error("stat");
+ if (sb.st_size == 0) {
+ /* initialize grail to new location */
+ Enrgyvoid.ev_active = TRUE;
+ Enrgyvoid.ev_x = ROLL(-1.0e6, 2.0e6);
+ Enrgyvoid.ev_y = ROLL(-1.0e6, 2.0e6);
+ writevoid(&Enrgyvoid, 0L);
+ }
+
/* NOTREACHED */
srandom((unsigned) time(NULL)); /* prime random numbers */
}
-long
-rollnewplayer()
+static long
+rollnewplayer(void)
{
int chartype; /* character type */
int ch; /* input */
return (allocrecord());
}
-void
-procmain()
+static void
+procmain(void)
{
int ch; /* input */
double x; /* desired new x coordinate */
}
}
-void
-titlelist()
+static void
+titlelist(void)
{
FILE *fp; /* used for opening various files */
bool councilfound = FALSE; /* set if we find a member of the
Other.p_status != S_NOTUSED)
/* found the king */
{
- sprintf(Databuf, "The present ruler is %s Level:%.0f",
+ snprintf(Databuf, SZ_DATABUF,
+ "The present ruler is %s Level:%.0f",
Other.p_name, Other.p_level);
mvaddstr(4, 40 - strlen(Databuf) / 2, Databuf);
kingfound = TRUE;
if (Other.p_specialtype == SC_VALAR && Other.p_status != S_NOTUSED)
/* found the valar */
{
- sprintf(Databuf, "The Valar is %s Login: %s", Other.p_name, Other.p_login);
+ snprintf(Databuf, SZ_DATABUF,
+ "The Valar is %s Login: %s",
+ Other.p_name, Other.p_login);
mvaddstr(6, 40 - strlen(Databuf) / 2, Databuf);
break;
}
councilfound = TRUE;
}
/* This assumes a finite (<=5) number of C.O.W.: */
- sprintf(Databuf, "%s Login: %s", Other.p_name, Other.p_login);
+ snprintf(Databuf, SZ_DATABUF,
+ "%s Login: %s", Other.p_name, Other.p_login);
mvaddstr(Lines++, 40 - strlen(Databuf) / 2, Databuf);
}
/* search for the two highest players */
strcpy(nxtname, Other.p_name);
}
mvaddstr(15, 28, "Highest characters are:");
- sprintf(Databuf, "%s Level:%.0f and %s Level:%.0f",
+ snprintf(Databuf, SZ_DATABUF,
+ "%s Level:%.0f and %s Level:%.0f",
hiname, hilvl, nxtname, nxtlvl);
mvaddstr(17, 40 - strlen(Databuf) / 2, Databuf);
&& fgets(Databuf, SZ_DATABUF, fp) != NULL) {
mvaddstr(19, 25, "The last character to die was:");
mvaddstr(20, 40 - strlen(Databuf) / 2, Databuf);
- fclose(fp);
}
+ if (fp)
+ fclose(fp);
refresh();
}
-long
-recallplayer()
+static long
+recallplayer(void)
{
long loc = 0L; /* location in player file */
int loop; /* loop counter */
return (-1L);
}
-void
-neatstuff()
+static void
+neatstuff(void)
{
double temp; /* for temporary calculations */
int ch; /* input */
}
}
-void
-genchar(type)
- int type;
+static void
+genchar(int type)
{
int subscript; /* used for subscripting into Stattable */
const struct charstats *statptr; /* for pointing into Stattable */
Player.p_experience = ROLL(600.0, 200.0);
}
-void
-playinit()
+static void
+playinit(void)
{
/* catch/ingnore signals */
signal(SIGPIPE, ill_sig);
#endif
- initscr(); /* turn on curses */
+ if (!initscr()) { /* turn on curses */
+ fprintf(stderr, "couldn't initialize screen\n");
+ exit (0);
+ }
noecho(); /* do not echo input */
cbreak(); /* do not process erase, kill */
clear();
}
void
-cleanup(doexit)
- int doexit;
+cleanup(int doexit)
{
if (Windows) {
move(LINES - 2, 0);