Mercurial > hg > early-roguelike
annotate srogue/passages.c @ 310:827441d05b3e
Advanced Rogue family: fix some potential buffer overflows.
Some code for determining the score file location assumed that PATH_MAX
would be less than 1024, which cannot be guaranteed.
Advanced Rogue 5 and 7, and XRogue, have had the buffers for the file
name enlarged.  UltraRogue never called the functions, so the code has
been deleted instead.
| author | John "Elwin" Edwards | 
|---|---|
| date | Mon, 03 May 2021 19:05:37 -0400 | 
| parents | 13b482bd9e66 | 
| children | 
| rev | line source | 
|---|---|
| 36 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 1 /* | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 2 * Draw the connecting passages | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 3 * | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 4 * @(#)passages.c 9.0 (rdk) 7/17/84 | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 5 * | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 6 * Super-Rogue | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 7 * Copyright (C) 1984 Robert D. Kindelberger | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 8 * All rights reserved. | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 9 * | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 10 * Based on "Rogue: Exploring the Dungeons of Doom" | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 11 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 12 * All rights reserved. | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 13 * | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 14 * See the file LICENSE.TXT for full copyright and licensing information. | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 15 */ | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 16 | 
| 217 
94a0d9dd5ce1
Super-Rogue: convert to ANSI-style function declarations.
 John "Elwin" Edwards parents: 
183diff
changeset | 17 #include <stdlib.h> | 
| 36 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 18 #include "rogue.h" | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 19 #include "rogue.ext" | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 20 | 
| 217 
94a0d9dd5ce1
Super-Rogue: convert to ANSI-style function declarations.
 John "Elwin" Edwards parents: 
183diff
changeset | 21 void conn(int r1, int r2); | 
| 
94a0d9dd5ce1
Super-Rogue: convert to ANSI-style function declarations.
 John "Elwin" Edwards parents: 
183diff
changeset | 22 void door(struct room *rm, struct coord *cp); | 
| 
94a0d9dd5ce1
Super-Rogue: convert to ANSI-style function declarations.
 John "Elwin" Edwards parents: 
183diff
changeset | 23 | 
| 36 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 24 /* | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 25 * do_passages: | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 26 * Draw all the passages on a level. | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 27 */ | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 28 | 
| 217 
94a0d9dd5ce1
Super-Rogue: convert to ANSI-style function declarations.
 John "Elwin" Edwards parents: 
183diff
changeset | 29 void | 
| 
94a0d9dd5ce1
Super-Rogue: convert to ANSI-style function declarations.
 John "Elwin" Edwards parents: 
183diff
changeset | 30 do_passages(void) | 
| 36 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 31 { | 
| 183 | 32 reg struct rdes *r1, *r2 = NULL; | 
| 36 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 33 reg int i, j; | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 34 reg int roomcount; | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 35 static struct rdes { | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 36 bool conn[MAXROOMS]; /* possible to connect to room i */ | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 37 bool isconn[MAXROOMS]; /* connection was made to room i */ | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 38 bool ingraph; /* this room in graph already? */ | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 39 } rdes[MAXROOMS] = { | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 40 {{ 0, 1, 0, 1, 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 41 {{ 1, 0, 1, 0, 1, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 42 {{ 0, 1, 0, 0, 0, 1, 0, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 43 {{ 1, 0, 0, 0, 1, 0, 1, 0, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 44 {{ 0, 1, 0, 1, 0, 1, 0, 1, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 45 {{ 0, 0, 1, 0, 1, 0, 0, 0, 1 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 46 {{ 0, 0, 0, 1, 0, 0, 0, 1, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 47 {{ 0, 0, 0, 0, 1, 0, 1, 0, 1 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 48 {{ 0, 0, 0, 0, 0, 1, 0, 1, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 49 }; | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 50 | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 51 /* | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 52 * reinitialize room graph description | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 53 */ | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 54 for (r1 = rdes; r1 < &rdes[MAXROOMS]; r1++) { | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 55 for (j = 0; j < MAXROOMS; j++) | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 56 r1->isconn[j] = FALSE; | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 57 r1->ingraph = FALSE; | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 58 } | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 59 | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 60 /* | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 61 * starting with one room, connect it to a random adjacent room and | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 62 * then pick a new room to start with. | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 63 */ | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 64 roomcount = 1; | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 65 r1 = &rdes[rnd(MAXROOMS)]; | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 66 r1->ingraph = TRUE; | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 67 do { | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 68 /* | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 69 * find a room to connect with | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 70 */ | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 71 j = 0; | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 72 for (i = 0; i < MAXROOMS; i++) | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 73 if (r1->conn[i] && !rdes[i].ingraph && rnd(++j) == 0) | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 74 r2 = &rdes[i]; | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 75 /* | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 76 * if no adjacent rooms are outside the graph, pick a new room | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 77 * to look from | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 78 */ | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 79 if (j == 0) { | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 80 do { | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 81 r1 = &rdes[rnd(MAXROOMS)]; | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 82 } until (r1->ingraph); | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 83 } | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 84 /* | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 85 * otherwise, connect new room to the graph, and draw a tunnel | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 86 * to it | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 87 */ | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 88 else { | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 89 r2->ingraph = TRUE; | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 90 i = r1 - rdes; | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 91 j = r2 - rdes; | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 92 conn(i, j); | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 93 r1->isconn[j] = TRUE; | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 94 r2->isconn[i] = TRUE; | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 95 roomcount++; | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 96 } | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 97 } while (roomcount < MAXROOMS); | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 98 | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 99 /* | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 100 * attempt to add passages to the graph a random number of times so | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 101 * that there isn't just one unique passage through it. | 
| 
2128c7dc8a40
Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
 elwin parents: diff
changeset | 
