1 // Generates a height-based pseudo lame terrain
2 #define RAISERS 32
3
4 unsigned int bc;
5 signed char tx, ty, tx0, ty0;
6 unsigned char patterns [] = {
7 0, 0, 0, 0, 0,
8 0, 0, 0, 0, 0,
9 0, 0, 1, 0, 0,
10 0, 0, 0, 0, 0,
11 0, 0, 0, 0, 0,
12 0, 0, 0, 0, 0,
13 0, 0, 1, 0, 0,
14 0, 1, 2, 1, 0,
15 0, 0, 1, 0, 0,
16 0, 0, 0, 0, 0,
17 0, 1, 1, 1, 0,
18 1, 1, 2, 1, 1,
19 1, 2, 3, 2, 1,
20 1, 1, 2, 1, 1,
21 0, 1, 1, 1, 0,
22 0, 0, 1, 1, 0,
23 0, 1, 2, 2, 1,
24 1, 1, 2, 3, 1,
25 0, 0, 1, 2, 0,
26 0, 0, 0, 1, 0
27 };
28
terraingen()29 void terraingen () {
30 // Initialize a plain terrain, terrain is 32x24 (768)
31 gpp = field;
32 bc = 768; while (bc --) *gpp ++ = 1;
33
34 // Plant raisers
35 for (gpit = 0; gpit < RAISERS; gpit ++) {
36 tx0 = (rand () & 31) - 2;
37 ty0 = (rand () & 15) + (rand () & 7) - 2;
38
39 gpp = patterns + 25 * (rand () & 3);
40 for (tx = tx0; tx < tx0 + 5; tx ++) {
41 for (ty = ty0; ty < ty0 + 5; ty ++) {
42 if (tx > 0 && tx < 32 && ty > 0 && ty < 24) {
43 gpp2 = field + (ty << 5) + tx;
44 *gpp2 += *gpp;
45 if (*gpp2 > 4) *gpp2 = 4;
46 }
47 gpp ++;
48 }
49 }
50 }
51 }
52
add_item(unsigned char n,unsigned char t)53 void add_item (unsigned char n, unsigned char t) {
54 gpit = n; while (gpit --) {
55 do {
56 gpint = 32 + (rand () % 736);
57 } while (field [gpint] > 4 || gpint == 367 || gpint == 368 || gpint == 399 || gpint == 400);
58 field [gpint] = t;
59 }
60 }
61
add_schrooms(unsigned char n)62 void add_schrooms (unsigned char n) {
63 gpit = n; while (gpit --) {
64 do {
65 gpint = 32 + (rand () % 704);
66 } while (field [gpint] > 4 || field [gpint + 1] > 4 || field [gpint + 32] > 4 || field [gpint + 33] > 4 || gpint == 367 || gpint == 368 || gpint == 399 || gpint == 400);
67 gpjt = 8 + ((rand () & 1) << 2);
68 field [gpint ++] = gpjt ++;
69 field [gpint] = gpjt ++; gpint += 31;
70 field [gpint ++] = gpjt ++;
71 field [gpint] = gpjt;
72 }
73 }
74