diff rogue3/newlevel.c @ 0:527e2150eaf0

Import Rogue 3.6 from the Roguelike Restoration Project (r1490)
author edwarj4
date Tue, 13 Oct 2009 13:33:34 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rogue3/newlevel.c	Tue Oct 13 13:33:34 2009 +0000
@@ -0,0 +1,176 @@
+/*
+ * new_level:
+ *	Dig and draw a new level
+ *
+ * @(#)new_level.c	3.7 (Berkeley) 6/2/81
+ *
+ * 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.
+ */
+
+#include "curses.h"
+#include "rogue.h"
+
+#include <string.h>
+
+void
+new_level()
+{
+    int rm, i;
+    int ch = 0;
+    coord stairs;
+
+    if (level > max_level)
+	max_level = level;
+    wclear(cw);
+    wclear(mw);
+    clear();
+    status();
+    /*
+     * Free up the monsters on the last level
+     */
+    free_list(mlist);
+    do_rooms();				/* Draw rooms */
+    do_passages();			/* Draw passages */
+    no_food++;
+    put_things();			/* Place objects (if any) */
+    /*
+     * Place the staircase down.
+     */
+    do {
+        rm = rnd_room();
+	rnd_pos(&rooms[rm], &stairs);
+    } until (winat(stairs.y, stairs.x) == FLOOR);
+    addch(STAIRS);
+    /*
+     * Place the traps
+     */
+    if (rnd(10) < level)
+    {
+	ntraps = rnd(level/4)+1;
+	if (ntraps > MAXTRAPS)
+	    ntraps = MAXTRAPS;
+	i = ntraps;
+	while (i--)
+	{
+	    do
+	    {
+		rm = rnd_room();
+		rnd_pos(&rooms[rm], &stairs);
+	    } until (winat(stairs.y, stairs.x) == FLOOR);
+	    switch(rnd(6))
+	    {
+		case 0: ch = TRAPDOOR;
+		when 1: ch = BEARTRAP;
+		when 2: ch = SLEEPTRAP;
+		when 3: ch = ARROWTRAP;
+		when 4: ch = TELTRAP;
+		when 5: ch = DARTTRAP;
+	    }
+	    addch(TRAP);
+	    traps[i].tr_type = ch;
+	    traps[i].tr_flags = 0;
+	    traps[i].tr_pos = stairs;
+	}
+    }
+    do
+    {
+	rm = rnd_room();
+	rnd_pos(&rooms[rm], &hero);
+    }
+    until(winat(hero.y, hero.x) == FLOOR);
+    light(&hero);
+    wmove(cw, hero.y, hero.x);
+    waddch(cw, PLAYER);
+}
+
+/*
+ * Pick a room that is really there
+ */
+
+int
+rnd_room()
+{
+    int rm;
+
+    do
+    {
+	rm = rnd(MAXROOMS);
+    } while (rooms[rm].r_flags & ISGONE);
+    return rm;
+}
+
+/*
+ * put_things:
+ *	put potions and scrolls on this level
+ */
+
+void
+put_things()
+{
+    int i;
+    struct linked_list *item;
+    struct object *cur;
+    int rm;
+    coord tp;
+
+    /*
+     * Throw away stuff left on the previous level (if anything)
+     */
+    free_list(lvl_obj);
+    /*
+     * Once you have found the amulet, the only way to get new stuff is
+     * go down into the dungeon.
+     */
+    if (amulet && level < max_level)
+	return;
+    /*
+     * Do MAXOBJ attempts to put things on a level
+     */
+    for (i = 0; i < MAXOBJ; i++)
+	if (rnd(100) < 35)
+	{
+	    /*
+	     * Pick a new object and link it in the list
+	     */
+	    item = new_thing();
+	    attach(lvl_obj, item);
+	    cur = (struct object *) ldata(item);
+	    /*
+	     * Put it somewhere
+	     */
+	    do {
+	        rm = rnd_room();
+		rnd_pos(&rooms[rm], &tp);
+	    } until (winat(tp.y, tp.x) == FLOOR);
+	    mvaddch(tp.y, tp.x, cur->o_type);
+	    cur->o_pos = tp;
+	}
+    /*
+     * If he is really deep in the dungeon and he hasn't found the
+     * amulet yet, put it somewhere on the ground
+     */
+    if (level > 25 && !amulet)
+    {
+	item = new_item(sizeof *cur);
+	attach(lvl_obj, item);
+	cur = (struct object *) ldata(item);
+	cur->o_hplus = cur->o_dplus = 0;
+	strcpy(cur->o_damage, "0d0");
+	strcpy(cur->o_hurldmg, "0d0");
+	cur->o_ac = 11;
+	cur->o_type = AMULET;
+	/*
+	 * Put it somewhere
+	 */
+	do {
+	    rm = rnd_room();
+	    rnd_pos(&rooms[rm], &tp);
+	} until (winat(tp.y, tp.x) == FLOOR);
+	mvaddch(tp.y, tp.x, cur->o_type);
+	cur->o_pos = tp;
+    }
+}