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