1 /* SCCS Id: @(#)rect.c 3.4 1990/02/22 */
2 /* Copyright (c) 1990 by Jean-Christophe Collet */
3 /* NetHack may be freely redistributed. See license for details. */
7 int FDECL(get_rect_ind, (NhRect *));
9 static boolean FDECL(intersect, (NhRect *,NhRect *,NhRect *));
12 * In this file, we will handle the various rectangle functions we
13 * need for room generation.
20 static NhRect rect[MAXRECT+1];
24 * Initialisation of internal structures. Should be called for every
25 * new level to be build...
32 rect[0].lx = rect[0].ly = 0;
33 rect[0].hx = COLNO - 1;
34 rect[0].hy = ROWNO - 1;
38 * Search Index of one precise NhRect.
46 register NhRect *rectp;
47 register int lx, ly, hx, hy;
50 lx = r->lx; ly = r->ly;
51 hx = r->hx; hy = r->hy;
52 for (i=0,rectp = &rect[0];i<rect_cnt;i++,rectp++)
53 if ( lx == rectp->lx && ly == rectp->ly &&
54 hx == rectp->hx && hy == rectp->hy)
60 * Search a free rectangle that include the one given in arg
67 register NhRect *rectp;
68 register int lx, ly, hx, hy;
71 lx = r->lx; ly = r->ly;
72 hx = r->hx; hy = r->hy;
73 for (i=0,rectp = &rect[0];i<rect_cnt;i++,rectp++)
74 if ( lx >= rectp->lx && ly >= rectp->ly &&
75 hx <= rectp->hx && hy <= rectp->hy)
81 * Get some random NhRect from the list.
87 return rect_cnt > 0 ? &rect[rn2(rect_cnt)] : 0;
91 * Search intersection between two rectangles (r1 & r2).
92 * return TRUE if intersection exist and put it in r3.
93 * otherwise returns FALSE
100 if (r2->lx > r1->hx || r2->ly > r1->hy ||
101 r2->hx < r1->lx || r2->hy < r1->ly)
104 r3->lx = (r2->lx > r1->lx ? r2->lx : r1->lx);
105 r3->ly = (r2->ly > r1->ly ? r2->ly : r1->ly);
106 r3->hx = (r2->hx > r1->hx ? r1->hx : r2->hx);
107 r3->hy = (r2->hy > r1->hy ? r1->hy : r2->hy);
109 if (r3->lx > r3->hx || r3->ly > r3->hy)
115 * Remove a rectangle from the list of free NhRect.
124 ind = get_rect_ind(r);
126 rect[ind] = rect[--rect_cnt];
130 * Add a NhRect to the list.
137 if (rect_cnt >= MAXRECT) {
139 if (wizard) pline("MAXRECT may be too small.");
143 /* Check that this NhRect is not included in another one */
151 * Okay, here we have two rectangles (r1 & r2).
152 * r1 was already in the list and r2 is included in r1.
153 * What we want is to allocate r2, that is split r1 into smaller rectangles
167 /* Walk down since rect_cnt & rect[] will change... */
168 for (i=rect_cnt-1; i>=0; i--)
169 if (intersect(&rect[i], r2, &r))
170 split_rects(&rect[i], &r);
172 if (r2->ly - old_r.ly-1 > (old_r.hy < ROWNO - 1 ? 2*YLIM : YLIM+1)+4) {
177 if (r2->lx - old_r.lx-1 > (old_r.hx < COLNO - 1 ? 2*XLIM : XLIM+1)+4) {
182 if (old_r.hy - r2->hy-1 > (old_r.ly > 0 ? 2*YLIM : YLIM+1)+4) {
187 if (old_r.hx - r2->hx-1 > (old_r.lx > 0 ? 2*XLIM : XLIM+1)+4) {