diff urogue/main.c @ 256:c495a4f288c6

Import UltraRogue from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Tue, 31 Jan 2017 19:56:04 -0500
parents
children 096d3cfd9afd
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/urogue/main.c	Tue Jan 31 19:56:04 2017 -0500
@@ -0,0 +1,278 @@
+/*
+    main.c  -  setup code
+ 
+    UltraRogue: The Ultimate Adventure in the Dungeons of Doom
+    Copyright (C) 1985, 1986, 1992, 1993, 1995 Herb Chong
+    All rights reserved.
+
+    Based on "Advanced Rogue"
+    Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka
+    All rights reserved.
+
+    Based on "Rogue: Exploring the Dungeons of Doom"
+    Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
+    All rights reserved.
+
+    See the file LICENSE.TXT for full copyright and licensing information.
+*/
+
+#define _ALL_SOURCE
+
+#include <time.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <stdlib.h>
+#include "rogue.h"
+
+FILE *fd_score = NULL;
+
+/* Command line options */
+
+int prscore;        /* Print scores */
+int prversion;      /* Print version info */
+
+int
+main(int argc, char *argv[])
+{
+    int x;
+    char    *env;
+    time_t lowtime;
+    time_t    now;
+    int rflag = 0;
+    char *nm;
+	float scale;
+
+    for (x = 1; x < argc; x++)
+    {
+        if (argv[x][0] != '-')
+            break;
+
+        switch (argv[x][1])
+        {
+            case 's':
+                prscore = TRUE;
+                break;
+
+            case 'v':
+                prversion = TRUE;
+                break;
+
+            case 'r':
+                rflag = TRUE;
+                break;
+
+            default:
+                fprintf(stderr,"%s: Unknown option '%c'.\n",argv[0],argv[x][1]);
+                exit(1);
+        }
+    }
+
+    if (!rflag)
+    {
+        argc -= (x - 1);
+        argv += (x - 1);
+    }
+
+    /* Get default score file */
+
+    strcpy(score_file, "urogue.scr");
+
+    fd_score = fopen(score_file, "r+");
+
+    if (fd_score == NULL)
+        fd_score = fopen(score_file, "a+");
+
+    if ((env = getenv("OPTIONS")) != NULL)
+        parse_opts(env);
+
+    nm = getenv("USER");
+
+    if (nm != NULL)
+        strcpy(whoami,nm);
+    else
+        strcpy(whoami,"anonymous");
+		
+	lowtime = time(&now);
+	
+	dnum = (wizard && getenv("SEED") != NULL ? atoi( getenv("SEED")) : (int)lowtime);
+	
+	ur_srandom(dnum);
+
+    if (env == NULL || fruit[0] == '\0')
+    {
+        static const char *funfruit[] =
+        {
+            "candleberry", "caprifig", "dewberry", "elderberry",
+            "gooseberry", "guanabana", "hagberry", "ilama", "imbu",
+            "jaboticaba", "jujube", "litchi", "mombin", "pitanga",
+            "prickly pear", "rambutan", "sapodilla", "soursop",
+            "sweetsop", "whortleberry"
+        };
+
+        strcpy(fruit, funfruit[rnd(sizeof(funfruit) / sizeof(funfruit[0]))]);
+    }
+
+    /* put a copy of fruit in the right place */
+
+    fd_data[1].mi_name = md_strdup(fruit); 
+
+    /* print scores */
+
+    if (prscore)
+    {
+        waswizard = TRUE;
+        score(0L, 0, SCOREIT, 0);
+        exit(0);
+    }
+
+    /* check for version option */
+
+    if (prversion)
+    {
+        printf("UltraRogue Version %s.\n", release);
+        exit(0);
+    }
+
+    if (wizard)
+        printf("Hello %s, welcome to dungeon #%d", whoami, dnum);
+    else
+        printf("Hello %s, just a moment while I dig the dungeon...", whoami);
+
+    mem_debug(2);
+	mem_tracking(1);
+
+    fflush(stdout);
+
+    init_things();      /* Set up probabilities of things */
+    init_fd();          /* Set up food probabilities */
+    init_colors();      /* Set up colors of potions */
+    init_stones();      /* Set up stone settings of rings */
+    init_materials();   /* Set up materials of wands */
+    initscr();          /* Start up cursor package */
+    refresh();
+    init_names();       /* Set up names of scrolls */
+    cbreak();
+    crmode();           /* Cbreak mode */
+    noecho();           /* Echo off */
+    nonl();
+	
+    scale = (float) (LINES * COLS) / (80.0F * 25.0F); /* get food right for     */
+	                                              /* different screen sizes */
+												  
+    food_left = (int) (food_left * scale);
+
+    /* Set up windows */
+
+    cw = newwin(LINES, COLS, 0, 0);
+    mw = newwin(LINES, COLS, 0, 0);
+    hw = newwin(LINES, COLS, 0, 0);
+
+    if (argc == 2 && argv[1][0] != '\0' && !restore(argv[1]))
+        /* Note: restore returns on error only */
+        exit(1);
+
+    waswizard = wizard; /* set wizard flags */
+
+    init_player();      /* look up things and outfit pack */
+
+    resurrect = pstats.s_const;
+    init_exp();         /* set first experience level change */
+    init_flags();       /* set initial flags */
+    wclear(hw);
+    wrefresh(hw);
+    new_level(POSTLEV,0); /* Draw current level */
+
+    /* Start up daemons and fuses */
+
+    start_daemon(DAEMON_DOCTOR, &player, AFTER);
+
+    light_fuse(FUSE_SWANDER, 0, WANDERTIME, AFTER);
+
+    start_daemon(DAEMON_STOMACH, 0, AFTER);
+    start_daemon(DAEMON_RUNNERS, 0, AFTER);
+
+    char_type = player.t_ctype;
+    player.t_oldpos = hero;
+    oldrp = roomin(hero);
+    after = TRUE;
+
+    signal(SIGINT, quit_handler);
+
+    while(playing)
+    {
+        do_daemons(BEFORE);
+        do_fuses(BEFORE);
+
+        command();  /* Command execution */
+
+        if (after)
+            do_after_effects();
+    }
+
+    fatal("");
+
+    return(0);
+}
+
+/*
+    fatal()
+        Exit the program, printing a message.
+*/
+
+void
+fatal(char *s)
+{
+    clear();
+    move(LINES - 2, 0);
+    printw("%s", s);
+    wrefresh(stdscr);
+    endwin();
+    printf("\n");       /* So the cursor doesn't stop at the end of the line */
+    exit(100);
+}
+
+/*
+    rnd()
+        Pick a very random number.
+*/
+
+unsigned char
+ucrnd(unsigned char range)
+{
+    return (unsigned char)(range <= 0 ? 0 : (ur_random() & 0x7fffffffL) % range);
+}
+
+short
+srnd(short range)
+{
+    return (short)(range <= 0 ? 0 : (ur_random() & 0x7fffffffL) % range);
+}
+
+int
+rnd(int range)
+{
+    return (range <= 0 ? 0 : (ur_random() & 0x7fffffffL) % range);
+}
+
+unsigned long
+ulrnd(unsigned long range)
+{
+    return(range <= 0 ? 0 : (ur_random() & 0x7fffffffL) % range);
+}
+
+/*
+    roll()
+        roll a number of dice
+*/
+
+int
+roll(int number, int sides)
+{
+    int dtotal = 0;
+
+    while (number--)
+        dtotal += rnd(sides) + 1;
+
+    return(dtotal);
+}