# \[0.5 stable\] the "quadrants" house

**URL:** <https://discourse.cataclysmdda.org/t/0-5-stable-the-quadrants-house/1821>\
**Category:** The Garage\
**Created:** [June 19, 2013, 3:37pm UTC](https://discourse.cataclysmdda.org/t/0-5-stable-the-quadrants-house/1821 "2013-06-19T15:37:20Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![oohara](https://avatars.discourse-cdn.com/v4/letter/o/dbc845/32.png) [@oohara](https://discourse.cataclysmdda.org/u/oohara)\
**Post date:** [June 19, 2013, 3:37pm UTC](https://discourse.cataclysmdda.org/t/0-5-stable-the-quadrants-house/1821/1 "2013-06-19T15:37:20Z")

</div>

This patch improves the “quadrants” variant of a house so that  
it is reasonable (for example, no door in the middle of a room).  
I post this as a bug report, not as a suggestion, because  
the current code is just broken (the variable cw is used  
in a wrong place).

— a/mapgen.cpp  
+++ b/mapgen.cpp  
@@ -1162,11 +1162,12 @@  
case ot\_house\_south:  
case ot\_house\_west:

- // assumes that SEEX and SEEY are 12 or greater  
lw = rng(0, 4); // West external wall  
mw = lw + rng(7, 10); // Middle wall between bedroom & kitchen/bath  
rw = SEEX \* 2 - rng(1, 5); // East external wall  
tw = rng(1, 6); // North external wall

- bw = SEEX \* 2 - rng(2, 5); // South external wall

- bw = SEEY \* 2 - rng(2, 5); // South external wall  
cw = tw + rng(4, 7); // Middle wall between living room & kitchen/bed  
for (int i = 0; i \< SEEX \* 2; i++) {  
for (int j = 0; j \< SEEY \* 2; j++) {  
@@ -1182,20 +1183,32 @@  
}  
switch(rng(1, 3)) {  
case 1: // Quadrants, essentially

- mw = rng(lw + 5, rw - 5);  
cw = tw + rng(4, 7);

- // living and kitchen
- mw = rng(lw + 5, rw - 5);  
house\_room(this, room\_living, mw, tw, rw, cw);  
house\_room(this, room\_kitchen, lw, tw, mw, cw);  
ter\_set(mw, rng(tw + 2, cw - 2), (one\_in(3) ? t\_door\_c : t\_floor));

- rn = rng(lw + 1, cw - 2);

- rn = rng(lw + 1, mw - 2);  
ter\_set(rn , tw, t\_window\_domestic);  
ter\_set(rn + 1, tw, t\_window\_domestic);

- rn = rng(cw + 1, rw - 2);

- rn = rng(mw + 1, rw - 2);  
ter\_set(rn , tw, t\_window\_domestic);  
ter\_set(rn + 1, tw, t\_window\_domestic);

- mw = rng(lw + 3, rw - 3);
- if (mw \<= lw + 5) { // Bedroom on right, bathroom on left
- rn = rng(cw + 2, rw - 2);

- // Placement of the main door
- if (one\_in(2)) {
- ter\_set(rng(lw + 2, mw - 1), tw, (one\_in(6) ? t\_door\_c : t\_door\_locked));
- if (one\_in(5))
- 

```
ter_set(rw, rng(tw + 2, cw - 2), (one_in(6) ? t_door_c : t_door_locked));

```

- } else {
- ter\_set(rng(mw + 1, rw - 2), tw, (one\_in(6) ? t\_door\_c : t\_door\_locked));
- if (one\_in(5))
- 

```
ter_set(lw, rng(tw + 2, cw - 2), (one_in(6) ? t_door_c : t_door_locked));

```

- }
- // bathroom and bedroom
- if (rng(lw + 5, rw - 5) \<= mw) { // Bedroom on right, bathroom on left
- mw = rng(lw + 3, mw);
- rn = rng(mw + 1, rw - 2);  
if (bw - cw \>= 10 && mw - lw \>= 6) {  
house\_room(this, room\_bathroom, lw, bw - 5, mw, bw);  
house\_room(this, room\_bedroom, lw, cw, mw, bw - 5);  
@@ -1209,9 +1222,10 @@  
house\_room(this, room\_bathroom, lw, cw, mw, bw);  
}  
house\_room(this, room\_bedroom, mw, cw, rw, bw);

- ter\_set(mw, rng(bw - 4, bw - 1), t\_door\_c);

- ter\_set(mw, rng(bw - 3, bw - 1), t\_door\_c);  
} else { // Bedroom on left, bathroom on right

- rn = rng(lw + 2, cw - 2);

- mw = rng(mw, rw - 3);
- rn = rng(lw + 1, mw - 2);  
if (bw - cw \>= 10 && rw - mw \>= 6) {  
house\_room(this, room\_bathroom, mw, bw - 5, rw, bw);  
house\_room(this, room\_bedroom, mw, cw, rw, bw - 5);  
@@ -1225,33 +1239,35 @@  
house\_room(this, room\_bathroom, mw, cw, rw, bw);  
}  
house\_room(this, room\_bedroom, lw, cw, mw, bw);

- ter\_set(mw, rng(bw - 4, bw - 1), t\_door\_c);

- ter\_set(mw, rng(bw - 3, bw - 1), t\_door\_c);  
}  
ter\_set(rn , bw, t\_window\_domestic);  
ter\_set(rn + 1, bw, t\_window\_domestic);  
if (!one\_in(3)) { // Potential side windows  
rn = rng(tw + 2, bw - 5);

- ter\_set(rw, rn , t\_window\_domestic);
- ter\_set(rw, rn + 4, t\_window\_domestic);

- if (rn != cw && rn != bw - 4 && rn != bw - 5)
- 

```
 ter_set(rw, rn , t_window_domestic);

```

- if (rn + 4 != cw && rn + 4 != bw - 4 && rn + 4 != bw - 5)
- 

```
 ter_set(rw, rn + 4, t_window_domestic);

```

}  
if (!one\_in(3)) { // Potential side windows  
rn = rng(tw + 2, bw - 5);

- ter\_set(lw, rn , t\_window\_domestic);
- ter\_set(lw, rn + 4, t\_window\_domestic);

- if (rn != cw && rn != bw - 4 && rn != bw - 5)
- 

```
 ter_set(lw, rn , t_window_domestic);

```

- if (rn + 4 != cw && rn + 4 != bw - 4 && rn + 4 != bw - 5)
- 

```
 ter_set(lw, rn + 4, t_window_domestic);

```

- }
- rn = rng(lw + 1, lw + 2);
- if (ter(rn, cw) != t\_floor)
- 

```
ter_set(rn, cw, t_door_c);

```

- if (cw + 1 \> bw - 6 || one\_in(4))
- {
- 

```
if (ter(rw - 2, cw) != t_floor)

```

- 

```
  ter_set(rw - 2, cw, t_door_c);

```

}

- ter\_set(rng(lw + 1, lw + 2), cw, t\_door\_c);
- if (one\_in(4))
- ter\_set(rw - 2, cw, t\_door\_c);  
else
- ter\_set(mw, rng(cw + 1, bw - 1), t\_door\_c);
- if (one\_in(2)) { // Placement of the main door
- ter\_set(rng(lw + 2, cw - 1), tw, (one\_in(6) ? t\_door\_c : t\_door\_locked));
- if (one\_in(5))
- 

```
ter_set(rw, rng(tw + 2, cw - 2), (one_in(6) ? t_door_c : t_door_locked));

```

- } else {
- ter\_set(rng(cw + 1, rw - 2), tw, (one\_in(6) ? t\_door\_c : t\_door\_locked));
- if (one\_in(5))
- 

```
ter_set(lw, rng(tw + 2, cw - 2), (one_in(6) ? t_door_c : t_door_locked));

```

- {
- ter\_set(mw, rng(cw + 1, bw - 6), t\_door\_c);  
}  
break;
