NetBSD/games/rogue/init.c

370 lines
7.8 KiB
C
Raw Normal View History

/* $NetBSD: init.c,v 1.12 2001/12/06 12:19:44 blymn Exp $ */
1995-04-22 14:27:22 +04:00
1993-03-21 12:45:37 +03:00
/*
1995-04-22 14:27:22 +04:00
* Copyright (c) 1988, 1993
* The Regents of the University of California. All rights reserved.
1993-03-21 12:45:37 +03:00
*
* This code is derived from software contributed to Berkeley by
* Timothy C. Stoehr.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <sys/cdefs.h>
1993-03-21 12:45:37 +03:00
#ifndef lint
1995-04-22 14:27:22 +04:00
#if 0
static char sccsid[] = "@(#)init.c 8.1 (Berkeley) 5/31/93";
#else
__RCSID("$NetBSD: init.c,v 1.12 2001/12/06 12:19:44 blymn Exp $");
1995-04-22 14:27:22 +04:00
#endif
1993-03-21 12:45:37 +03:00
#endif /* not lint */
/*
* init.c
*
* This source herein may be modified and/or distributed by anybody who
* so desires, with the following restrictions:
* 1.) No portion of this notice shall be removed.
* 2.) Credit shall not be taken for the creation of this source.
* 3.) This code is not to be traded, sold, or used for personal
* gain or profit.
*
*/
#include <stdlib.h>
#include <fcntl.h>
1993-03-21 12:45:37 +03:00
#include "rogue.h"
char login_name[MAX_OPT_LEN];
char *nick_name = (char *) 0;
char *rest_file = 0;
boolean cant_int = 0;
boolean did_int = 0;
boolean score_only;
boolean init_curses = 0;
boolean save_is_interactive = 1;
boolean ask_quit = 1;
boolean no_skull = 0;
boolean passgo = 0;
1998-11-10 16:01:31 +03:00
const char *error_file = "rogue.esave";
const char *byebye_string = "Okay, bye bye!";
gid_t gid, egid;
1993-03-21 12:45:37 +03:00
int
1993-03-21 12:45:37 +03:00
init(argc, argv)
int argc;
char *argv[];
1993-03-21 12:45:37 +03:00
{
1998-07-27 05:12:35 +04:00
const char *pn;
1993-03-21 12:45:37 +03:00
int seed;
int fd;
gid = getgid();
egid = getegid();
setegid(gid);
/* Check for dirty tricks with closed fds 0, 1, 2 */
fd = open("/dev/null", O_RDONLY);
if (fd < 3)
exit(1);
close(fd);
1993-03-21 12:45:37 +03:00
seed = 0;
1993-03-21 12:45:37 +03:00
pn = md_gln();
if ((!pn) || (strlen(pn) >= MAX_OPT_LEN)) {
clean_up("Hey! Who are you?");
}
(void) strcpy(login_name, pn);
do_args(argc, argv);
do_opts();
if (!score_only && !rest_file) {
printf("Hello %s, just a moment while I dig the dungeon...",
nick_name);
fflush(stdout);
}
initscr();
if ((LINES < DROWS) || (COLS < DCOLS)) {
clean_up("must be played on 24 x 80 screen");
}
start_window();
init_curses = 1;
md_heed_signals();
if (score_only) {
put_scores((object *) 0, 0);
}
seed = md_gseed();
(void) srrandom(seed);
if (rest_file) {
restore(rest_file);
return(1);
}
mix_colors();
get_wand_and_ring_materials();
make_scroll_titles();
level_objects.next_object = (object *) 0;
level_monsters.next_monster = (object *) 0;
player_init();
ring_stats(0);
return(0);
}
void
1993-03-21 12:45:37 +03:00
player_init()
{
object *obj;
rogue.pack.next_object = (object *) 0;
obj = alloc_object();
get_food(obj, 1);
(void) add_to_pack(obj, &rogue.pack, 1);
obj = alloc_object(); /* initial armor */
obj->what_is = ARMOR;
obj->which_kind = RINGMAIL;
obj->class = RINGMAIL+2;
obj->is_protected = 0;
obj->d_enchant = 1;
(void) add_to_pack(obj, &rogue.pack, 1);
do_wear(obj);
obj = alloc_object(); /* initial weapons */
obj->what_is = WEAPON;
obj->which_kind = MACE;
obj->damage = "2d3";
obj->hit_enchant = obj->d_enchant = 1;
obj->identified = 1;
(void) add_to_pack(obj, &rogue.pack, 1);
do_wield(obj);
obj = alloc_object();
obj->what_is = WEAPON;
obj->which_kind = BOW;
obj->damage = "1d2";
obj->hit_enchant = 1;
obj->d_enchant = 0;
obj->identified = 1;
(void) add_to_pack(obj, &rogue.pack, 1);
obj = alloc_object();
obj->what_is = WEAPON;
obj->which_kind = ARROW;
obj->quantity = get_rand(25, 35);
obj->damage = "1d2";
obj->hit_enchant = 0;
obj->d_enchant = 0;
obj->identified = 1;
(void) add_to_pack(obj, &rogue.pack, 1);
}
void
1993-03-21 12:45:37 +03:00
clean_up(estr)
1998-11-10 16:01:31 +03:00
const char *estr;
1993-03-21 12:45:37 +03:00
{
if (save_is_interactive) {
if (init_curses) {
move(DROWS-1, 0);
refresh();
stop_window();
}
printf("\n%s\n", estr);
}
md_exit(0);
}
void
1993-03-21 12:45:37 +03:00
start_window()
{
cbreak();
1993-03-21 12:45:37 +03:00
noecho();
#ifndef BAD_NONL
nonl();
#endif
}
void
1993-03-21 12:45:37 +03:00
stop_window()
{
endwin();
}
void
byebye(dummy)
int dummy __attribute__((__unused__));
1993-03-21 12:45:37 +03:00
{
md_ignore_signals();
if (ask_quit) {
quit(1);
} else {
clean_up(byebye_string);
}
md_heed_signals();
}
void
onintr(dummy)
int dummy __attribute__((__unused__));
1993-03-21 12:45:37 +03:00
{
md_ignore_signals();
if (cant_int) {
did_int = 1;
} else {
check_message();
message("interrupt", 1);
}
md_heed_signals();
}
void
error_save(dummy)
int dummy __attribute__((__unused__));
1993-03-21 12:45:37 +03:00
{
save_is_interactive = 0;
save_into_file(error_file);
clean_up("");
}
void
1993-03-21 12:45:37 +03:00
do_args(argc, argv)
int argc;
char *argv[];
1993-03-21 12:45:37 +03:00
{
short i, j;
for (i = 1; i < argc; i++) {
if (argv[i][0] == '-') {
for (j = 1; argv[i][j]; j++) {
switch(argv[i][j]) {
case 's':
score_only = 1;
break;
}
}
} else {
rest_file = argv[i];
}
}
}
void
1993-03-21 12:45:37 +03:00
do_opts()
{
char *eptr;
if ((eptr = md_getenv("ROGUEOPTS")) != NULL) {
1993-03-21 12:45:37 +03:00
for (;;) {
while ((*eptr) == ' ') {
eptr++;
}
if (!(*eptr)) {
break;
}
if (!strncmp(eptr, "fruit=", 6)) {
eptr += 6;
env_get_value(&fruit, eptr, 1);
} else if (!strncmp(eptr, "file=", 5)) {
eptr += 5;
env_get_value(&save_file, eptr, 0);
} else if (!strncmp(eptr, "jump", 4)) {
jump = 1;
} else if (!strncmp(eptr, "name=", 5)) {
eptr += 5;
env_get_value(&nick_name, eptr, 0);
} else if (!strncmp(eptr, "noaskquit", 9)) {
ask_quit = 0;
} else if (!strncmp(eptr, "noskull", 5) ||
!strncmp(eptr,"notomb", 6)) {
no_skull = 1;
} else if (!strncmp(eptr, "passgo", 5)) {
passgo = 1;
}
while ((*eptr) && (*eptr != ',')) {
eptr++;
}
if (!(*(eptr++))) {
break;
}
}
}
/* If some strings have not been set through ROGUEOPTS, assign defaults
* to them so that the options editor has data to work with.
*/
init_str(&nick_name, login_name);
init_str(&save_file, "rogue.save");
init_str(&fruit, "slime-mold");
}
void
1993-03-21 12:45:37 +03:00
env_get_value(s, e, add_blank)
char **s, *e;
boolean add_blank;
1993-03-21 12:45:37 +03:00
{
short i = 0;
1998-11-10 16:01:31 +03:00
const char *t;
1993-03-21 12:45:37 +03:00
t = e;
while ((*e) && (*e != ',')) {
if (*e == ':') {
*e = ';'; /* ':' reserved for score file purposes */
}
e++;
if (++i >= MAX_OPT_LEN) {
break;
}
}
*s = md_malloc(MAX_OPT_LEN + 2);
if (*s == NULL)
clean_up("out of memory");
1993-03-21 12:45:37 +03:00
(void) strncpy(*s, t, i);
if (add_blank) {
(*s)[i++] = ' ';
}
(*s)[i] = '\0';
}
void
1993-03-21 12:45:37 +03:00
init_str(str, dflt)
1998-11-10 16:01:31 +03:00
char **str;
const char *dflt;
1993-03-21 12:45:37 +03:00
{
if (!(*str)) {
*str = md_malloc(MAX_OPT_LEN + 2);
if (*str == NULL)
clean_up("out of memory");
1993-03-21 12:45:37 +03:00
(void) strcpy(*str, dflt);
}
}