1 1.2 kamil /* Header: init.c,v 7.0.1.4 86/12/12 16:58:03 lwall Exp */ 2 1.1 kamil 3 1.2 kamil /* Log: init.c,v 4 1.1 kamil * Revision 7.0.1.4 86/12/12 16:58:03 lwall 5 1.1 kamil * Baseline for net release. 6 1.5 rillig * 7 1.1 kamil * Revision 7.0.1.3 86/10/20 14:35:31 lwall 8 1.1 kamil * Picked some lint. 9 1.5 rillig * 10 1.1 kamil * Revision 7.0.1.2 86/10/17 15:53:30 lwall 11 1.1 kamil * Added random walk star fields. 12 1.5 rillig * 13 1.1 kamil * Revision 7.0.1.1 86/10/16 10:51:19 lwall 14 1.1 kamil * Added Damage. Fixed random bugs. 15 1.5 rillig * 16 1.1 kamil * Revision 7.0 86/10/08 15:12:10 lwall 17 1.1 kamil * Split into separate files. Added amoebas and pirates. 18 1.5 rillig * 19 1.1 kamil */ 20 1.1 kamil 21 1.1 kamil #include "EXTERN.h" 22 1.1 kamil #include "warp.h" 23 1.1 kamil #include "bang.h" 24 1.1 kamil #include "object.h" 25 1.1 kamil #include "move.h" 26 1.1 kamil #include "play.h" 27 1.1 kamil #include "score.h" 28 1.1 kamil #include "term.h" 29 1.1 kamil #include "them.h" 30 1.1 kamil #include "us.h" 31 1.1 kamil #include "util.h" 32 1.1 kamil #include "weapon.h" 33 1.1 kamil #include "INTERN.h" 34 1.1 kamil #include "init.h" 35 1.1 kamil 36 1.1 kamil void 37 1.3 christos initialize(void) 38 1.1 kamil { 39 1.3 christos int i; 40 1.3 christos int x; 41 1.3 christos int y; 42 1.3 christos int dist; 43 1.3 christos int ydist = 0; 44 1.3 christos int xdist = 0; 45 1.1 kamil long e; 46 1.3 christos int yoff = 0, xoff = 0, ypred, xpred; 47 1.3 christos OBJECT *obj = NULL; 48 1.1 kamil char ch; 49 1.1 kamil FILE *mapfp = NULL; 50 1.1 kamil bool tmptholspec; 51 1.1 kamil int inhabjackpot; 52 1.1 kamil long inhenergy; 53 1.1 kamil int walksplit = 200; 54 1.3 christos static const char *distname[] = 55 1.1 kamil {" #"," -"," \\"," /", 56 1.1 kamil " |"," *"," `"," '"}; 57 1.1 kamil 58 1.3 christos cloaking = madgorns = false; 59 1.1 kamil deados = madfriends = 0; 60 1.1 kamil curscore = possiblescore = 0L; 61 1.1 kamil yamblast = xamblast = ambsize = 0; 62 1.1 kamil if (smarts > 90) 63 1.3 christos massacre = true; 64 1.1 kamil scandist = (massacre?20:15); 65 1.1 kamil antibase = (smarts>60?1:(smarts>40?2:(smarts>25?4:100))); 66 1.1 kamil sm35 = (smarts>35?35:smarts); 67 1.1 kamil sm45 = (smarts>45?45:smarts); 68 1.1 kamil sm50 = (smarts>50?50:smarts); 69 1.1 kamil sm55 = (smarts>55?55:smarts); 70 1.1 kamil sm80 = (smarts>80?80:smarts); 71 1.1 kamil sm95 = (smarts>95?95:smarts); 72 1.1 kamil super = (smarts>50?smarts-50:0); 73 1.1 kamil enemshields = 10 + super/2; /* (scaled by 10) 1 @ 50 .. 3 @ 90 */ 74 1.1 kamil if (smarts>90) 75 1.1 kamil enemshields += (smarts-90)*10; /* lay it on thick: ~13 @ 99 */ 76 1.1 kamil entmax = (smarts>=75?5000:(smarts>=50?4000:(smarts>=40?3000:2000))); 77 1.1 kamil basemax = (smarts>=75?20000:(smarts>=50?15000:(smarts>=40?12500:10000))); 78 1.1 kamil 79 1.1 kamil clear(); 80 1.1 kamil while (root.next != &root) { 81 1.1 kamil root.next = root.next->next; 82 1.1 kamil free_object(root.next->prev); 83 1.1 kamil } 84 1.1 kamil root.prev = &root; 85 1.1 kamil enemies = movers = NULL; 86 1.1 kamil numos = numxes = 0; 87 1.1 kamil #if defined(vax) && XYSIZEx4 == 3680 88 1.1 kamil asm("movc5 $0,_occupant,$0,$3680,_occupant"); 89 1.1 kamil asm("movc5 $0,_blast,$0,$3680,_blast"); /* 3680 = XYSIZEx4 */ 90 1.1 kamil asm("movc5 $0,_amb,$32,$920,_amb"); 91 1.1 kamil #else 92 1.1 kamil for (y=0;y<YSIZE;y++) 93 1.1 kamil for (x=0;x<XSIZE;x++) { 94 1.1 kamil occupant[y][x] = 0; 95 1.1 kamil blast[y][x] = 0; 96 1.1 kamil amb[y][x] = ' '; 97 1.1 kamil } 98 1.1 kamil #endif 99 1.1 kamil for (y=0; y<YSIZE; y++) 100 1.1 kamil yblasted[y] = 0; 101 1.1 kamil for (x=0; x<XSIZE; x++) 102 1.1 kamil xblasted[x] = 0; 103 1.3 christos blasted = false; 104 1.3 christos if (!starspec) { 105 1.1 kamil if (smarts < 15) 106 1.1 kamil inumstars = 50 + rand_mod(50); 107 1.1 kamil else if (smarts < 50 || smarts > 85) 108 1.1 kamil inumstars = exdis(800) + rand_mod(100) + 1; 109 1.1 kamil else /* too few stars makes 50..85 too hard */ 110 1.1 kamil inumstars = exdis(700) + rand_mod(150-super*2) + 50+super*2; 111 1.3 christos } 112 1.1 kamil tmptholspec = (smarts > 15 && inumstars < 450 && ! rand_mod(90-sm80)); 113 1.1 kamil if (!klingspec) { 114 1.1 kamil inumenemies = rand_mod((smarts+1)/2) + 1; 115 1.1 kamil if (massacre || tmptholspec) 116 1.1 kamil inumenemies += 10; 117 1.1 kamil } 118 1.1 kamil if (!friendspec) 119 1.1 kamil inumfriends = rand_mod(smarts/8+1); 120 1.1 kamil if (!piratespec) 121 1.1 kamil inumpirates = rand_mod(inumfriends/2+1); 122 1.1 kamil if (inumfriends+inumenemies+inumstars > YSIZE*XSIZE-20) 123 1.1 kamil inumstars = YSIZE*XSIZE-20 - inumenemies - inumfriends; 124 1.1 kamil if (inumstars < 0) { 125 1.1 kamil inumfriends += inumstars; 126 1.1 kamil inumstars = 0; 127 1.1 kamil } 128 1.1 kamil if (inumfriends < 0) { 129 1.1 kamil inumenemies += inumfriends; 130 1.1 kamil inumfriends = 0; 131 1.1 kamil } 132 1.1 kamil if (inumenemies < 0) 133 1.1 kamil inumenemies = 0; 134 1.1 kamil numstars = inumstars; 135 1.1 kamil inuminhab = numinhab = 0; 136 1.1 kamil inumroms = inumthols = inumgorns = 0; 137 1.1 kamil numapollos = apolspec || massacre ? 1 : 138 1.1 kamil ((!numstars || rand_mod(2) || smarts < 10) ? 0 : 1); 139 1.1 kamil inumapollos = apolloflag = 0; 140 1.1 kamil realapollo = NULL; 141 1.1 kamil inumcrushes = numcrushes = 142 1.1 kamil crushspec||massacre?1:(rand_mod(2000) < inumstars); 143 1.1 kamil inumenemies += inumcrushes; 144 1.1 kamil inumamoebas = numamoebas = (amoebaspec ? 1 : 145 1.1 kamil !rand_mod(inumcrushes?3-massacre:8) ); /* < and & are fun together */ 146 1.1 kamil inumenemies += inumamoebas; 147 1.1 kamil if (!rand_mod(40)) { 148 1.1 kamil inhabjackpot = 32767; 149 1.1 kamil inumfriends += rand_mod(10); 150 1.1 kamil inumpirates += rand_mod(10); 151 1.1 kamil } 152 1.1 kamil else 153 1.1 kamil inhabjackpot = inumpirates; 154 1.1 kamil inhenergy = 30000-super*150; 155 1.1 kamil if (!rand_mod(10)) 156 1.1 kamil inhenergy = 50000; 157 1.1 kamil if (!rand_mod(4)) 158 1.1 kamil inhenergy += rand_mod(3500+super*150); 159 1.1 kamil numfriends = inumfriends; 160 1.1 kamil numpirates = inumpirates; 161 1.1 kamil numenemies = inumenemies; 162 1.1 kamil deadmudds = 0; 163 1.1 kamil 164 1.1 kamil /* do stars */ 165 1.1 kamil 166 1.1 kamil stars_again: 167 1.1 kamil if (prespec) 168 1.1 kamil dist = 4; 169 1.1 kamil else if (numstars > 750) 170 1.1 kamil dist = 0; 171 1.1 kamil else 172 1.1 kamil dist = rand_mod(starspec||smarts<=5?3:5); 173 1.1 kamil if (debugging) { 174 1.1 kamil real_y = real_x = -100; 175 1.1 kamil printf("\r\n"); 176 1.1 kamil } 177 1.1 kamil switch (dist) { 178 1.1 kamil case 0: /* uniform random */ 179 1.1 kamil ydist = xdist = 0; 180 1.1 kamil if (inumstars < 700 && !rand_mod(3-(inumstars<50))) { 181 1.1 kamil ydist = xdist = 6; /* well, maybe not so random */ 182 1.1 kamil y = rand_mod(YSIZE); 183 1.1 kamil x = rand_mod(XSIZE); 184 1.1 kamil if (rand_mod(2)) 185 1.1 kamil walksplit = inumstars/(exdis(40)+1); 186 1.1 kamil } 187 1.1 kamil if (debugging) 188 1.1 kamil printf(" R\r\n"); 189 1.1 kamil break; 190 1.1 kamil case 1: case 2: /* clumped, maybe skewed, maybe superposed */ 191 1.1 kamil ydist = rand_mod(4); 192 1.1 kamil xdist = rand_mod(2); 193 1.1 kamil if (debugging) 194 1.1 kamil printf("%s\r\n",distname[ydist+4*xdist]); 195 1.1 kamil yoff = rand_mod(YSIZE); 196 1.1 kamil xoff = rand_mod(XSIZE); 197 1.1 kamil if (dist == 2) 198 1.1 kamil dist = numstars/2 + exdis(numstars/2) - exdis(numstars/2); 199 1.1 kamil else 200 1.1 kamil dist = 0; 201 1.1 kamil break; 202 1.1 kamil case 3: case 4: /* predefined or residual */ 203 1.1 kamil scenario_again: 204 1.1 kamil if (debugging) 205 1.1 kamil printf(" P\r\n"); 206 1.1 kamil dist = 0; 207 1.3 christos snprintf(spbuf, sizeof(spbuf), "smap.%d", 208 1.1 kamil (prescene>=0?prescene:rand_mod(MAPS)) ); 209 1.1 kamil if ((mapfp = fopen(spbuf,"r")) != NULL && 210 1.1 kamil fgets(spbuf,10,mapfp) != NULL ) { 211 1.1 kamil inumstars = numstars = atoi(spbuf); 212 1.1 kamil if (inumenemies+inumstars > YSIZE*XSIZE-20) 213 1.1 kamil inumstars = numstars = YSIZE*XSIZE-20 - inumenemies; 214 1.1 kamil ydist = rand_mod(2) + 4; /* flip y axis? */ 215 1.1 kamil xdist = rand_mod(2) + 4; /* flip x axis? */ 216 1.1 kamil yoff = rand_mod(YSIZE); /* how much to shift y */ 217 1.1 kamil xoff = rand_mod(XSIZE); /* how much to shift x */ 218 1.1 kamil } 219 1.1 kamil else { 220 1.3 christos prespec = false; 221 1.1 kamil prescene = -1; 222 1.1 kamil if (rand_mod(2)) 223 1.1 kamil goto scenario_again; 224 1.1 kamil goto stars_again; 225 1.1 kamil } 226 1.1 kamil break; 227 1.1 kamil } 228 1.1 kamil for (i = 1; i <= numstars; i++) { 229 1.1 kamil if (dist && i == dist) { /* flip to another skewing? */ 230 1.1 kamil ydist = rand_mod(4); 231 1.1 kamil xdist = rand_mod(2); 232 1.1 kamil if (!rand_mod(4)) { 233 1.1 kamil ydist = xdist = 6; 234 1.1 kamil if (debugging) 235 1.1 kamil printf("&\r\n"); 236 1.1 kamil } 237 1.1 kamil else if (debugging) 238 1.1 kamil printf("%s\r\n",distname[ydist+4*xdist]); 239 1.1 kamil yoff = rand_mod(YSIZE); 240 1.1 kamil xoff = rand_mod(XSIZE); 241 1.1 kamil dist = 0; 242 1.1 kamil } 243 1.1 kamil do { /* until an open spot found */ 244 1.1 kamil switch (xdist) { 245 1.1 kamil case 0: 246 1.1 kamil x = rand_mod(XSIZE); /* pick from 0..39, uniform */ 247 1.1 kamil break; 248 1.1 kamil case 1: case 2: case 3: 249 1.1 kamil x = (int)((((double)(myrand()-HALFRAND)) * 250 1.1 kamil ((double)(myrand()-HALFRAND))/RANDRAND) 251 1.1 kamil * 20.0) + xoff; /* pick from -20..20, clumped */ 252 1.1 kamil break; 253 1.1 kamil case 4: 254 1.1 kamil if (fscanf(mapfp,"%d %d\n",&ypred,&xpred) == EOF) 255 1.1 kamil ydist = xdist = 0; 256 1.1 kamil x = xpred + xoff; 257 1.1 kamil break; 258 1.1 kamil case 5: 259 1.1 kamil if (fscanf(mapfp,"%d %d\n",&ypred,&xpred) == EOF) 260 1.1 kamil ydist = xdist = 0; 261 1.1 kamil x = -xpred + xoff; 262 1.1 kamil break; 263 1.1 kamil case 6: 264 1.1 kamil x += rand_mod(3) - 1; 265 1.1 kamil break; 266 1.1 kamil } 267 1.1 kamil switch (ydist) { 268 1.1 kamil case 0: 269 1.1 kamil y = rand_mod(YSIZE); 270 1.1 kamil break; 271 1.1 kamil case 1: 272 1.1 kamil y = (int)((((double)(myrand()-HALFRAND)) * 273 1.1 kamil ((double)(myrand()-HALFRAND))/RANDRAND) 274 1.1 kamil * 12.0) + yoff; /* pick from -12..12, clumped */ 275 1.1 kamil break; 276 1.1 kamil case 2: 277 1.1 kamil #ifndef lint 278 1.1 kamil y = (int)((((double)(myrand()-HALFRAND)) * 279 1.1 kamil ((double)(myrand()-HALFRAND))/RANDRAND) 280 1.1 kamil * 12.0) + yoff + x*YSIZE/XSIZE; 281 1.1 kamil /* clumped & skewed */ 282 1.1 kamil #endif 283 1.1 kamil break; 284 1.1 kamil case 3: 285 1.1 kamil #ifndef lint 286 1.1 kamil y = (int)((((double)(myrand()-HALFRAND)) * 287 1.1 kamil ((double)(myrand()-HALFRAND))/RANDRAND) 288 1.1 kamil * 12.0) + yoff - x*YSIZE/XSIZE; 289 1.1 kamil /* clumped & skewed */ 290 1.1 kamil #endif 291 1.1 kamil break; 292 1.1 kamil case 4: 293 1.1 kamil y = ypred + yoff; 294 1.1 kamil break; 295 1.1 kamil case 5: 296 1.1 kamil y = -ypred + yoff; 297 1.1 kamil break; 298 1.1 kamil case 6: 299 1.1 kamil y += rand_mod(3) - 1; 300 1.1 kamil #ifdef lint 301 1.1 kamil walksplit = walksplit; 302 1.1 kamil #endif 303 1.1 kamil if (!rand_mod(walksplit)) { 304 1.1 kamil y = rand_mod(YSIZE); 305 1.1 kamil x = rand_mod(XSIZE); 306 1.1 kamil } 307 1.1 kamil break; 308 1.1 kamil } 309 1.1 kamil while (x<0) x += XSIZE00; 310 1.1 kamil while (y<0) y += YSIZE00; 311 1.1 kamil x %= XSIZE; 312 1.1 kamil y %= YSIZE; 313 1.1 kamil } while (occupant[y][x]); 314 1.1 kamil e = rand_mod(32768); 315 1.1 kamil if (--inhabjackpot > 0 || e >= inhenergy) { 316 1.1 kamil ch = '@'; 317 1.1 kamil if (inhabjackpot && e < 10000) 318 1.1 kamil e += 10000; 319 1.1 kamil inuminhab = ++numinhab; 320 1.1 kamil } 321 1.1 kamil else { 322 1.1 kamil ch = '*'; 323 1.1 kamil } 324 1.1 kamil obj = make_object(Star,ch,y,x,0,0,e+rand_mod(super*100+1),e/4,&root); 325 1.1 kamil obj->flags |= STATIC; 326 1.1 kamil } 327 1.1 kamil if (inumstars > 30 && inhabjackpot <= 0 && 328 1.1 kamil !rand_mod(3 - (inumstars > 400) - (inhenergy > 32768)) ) { 329 1.1 kamil int initx; 330 1.1 kamil int inity; 331 1.1 kamil 332 1.1 kamil x = initx = obj->posx; 333 1.1 kamil y = inity = obj->posy; 334 1.1 kamil while (rand_mod(2) && inuminhab < inumstars/2) { 335 1.1 kamil for (i=rand_mod(smarts)*2+20; i; i--) { 336 1.1 kamil if ((obj = occupant[y][x]) && obj->image == '*') { 337 1.1 kamil setimage(obj,'@'); 338 1.1 kamil if (obj->energy < 10000) 339 1.1 kamil obj->energy += 20000; /* the benefits of civilization */ 340 1.1 kamil inuminhab = ++numinhab; 341 1.1 kamil } 342 1.1 kamil if (i&15) { 343 1.1 kamil y = (y + rand_mod(3) + YSIZE99) % YSIZE; 344 1.1 kamil x = (x + rand_mod(3) + XSIZE99) % XSIZE; 345 1.1 kamil } 346 1.1 kamil else { /* don't wander too far */ 347 1.1 kamil y = inity; 348 1.1 kamil x = initx; 349 1.1 kamil } 350 1.1 kamil } 351 1.1 kamil x = initx = rand_mod(XSIZE); 352 1.1 kamil y = inity = rand_mod(YSIZE); 353 1.1 kamil } 354 1.1 kamil } 355 1.1 kamil if (mapfp != NULL) 356 1.3 christos fclose(mapfp); 357 1.1 kamil if (numcrushes) { 358 1.1 kamil do { 359 1.1 kamil x = rand_mod(XSIZE); 360 1.1 kamil y = rand_mod(YSIZE); 361 1.1 kamil } while (occupant[y][x]); 362 1.1 kamil movers = make_object(Crusher,'<',y,x,0,1,32767L,32768L,&root); 363 1.1 kamil possiblescore += 10000; 364 1.1 kamil } 365 1.1 kamil ient = (numents != 0); 366 1.1 kamil if (ient) { 367 1.1 kamil do { 368 1.1 kamil x = rand_mod(XSIZE); 369 1.1 kamil y = rand_mod(YSIZE); 370 1.1 kamil } while (occupant[y][x]); 371 1.1 kamil e = entmax; 372 1.1 kamil ent = make_object(Enterprise,'E',y,x,0,0,e,e/2,&root); 373 1.1 kamil if (!movers) 374 1.1 kamil movers = ent; 375 1.1 kamil } 376 1.1 kamil ibase = (numbases != 0); 377 1.1 kamil if (ibase) { 378 1.1 kamil e = 52-super; 379 1.1 kamil do { 380 1.1 kamil x = rand_mod(XSIZE); 381 1.1 kamil y = rand_mod(YSIZE); 382 1.1 kamil } while (occupant[y][x] || lookaround(y,x,Star) * 7 < e--); 383 1.1 kamil e = basemax; 384 1.1 kamil base = make_object(Base, 'B',y,x,0,0,e,e/4,&root); 385 1.1 kamil if (!movers) 386 1.1 kamil movers = base; 387 1.1 kamil } 388 1.1 kamil if (numamoebas) { 389 1.1 kamil do { 390 1.1 kamil x = rand_mod(XSIZE); 391 1.1 kamil y = rand_mod(YSIZE); 392 1.1 kamil } while (occupant[y][x]); 393 1.1 kamil nuke = make_object(Enemy,'&',y,x,0,0,32767L, 394 1.1 kamil (long)entmax+entmax+rand_mod(entmax),&root); 395 1.1 kamil possiblescore += 10000; 396 1.1 kamil amb[y][x] = '~'; 397 1.1 kamil if (rand_mod(2)) 398 1.1 kamil modify_amoeba(y,x,2,'~',(int)rand_mod(smarts<<1));/* just make blob */ 399 1.1 kamil else { 400 1.1 kamil for (i=smarts/10+1; i; i--) { 401 1.1 kamil nuke->strategy = rand_mod(256); /* random direction */ 402 1.1 kamil modify_amoeba(y,x,2,'~',(int)rand_mod(5)); 403 1.1 kamil modify_amoeba(y,x,2,'~',(int)rand_mod(5)); 404 1.1 kamil modify_amoeba(y,x,2,'~',(int)rand_mod(5)); 405 1.1 kamil modify_amoeba(y,x,2,'~',(int)rand_mod(5)); /* extend pseudopod */ 406 1.1 kamil } 407 1.1 kamil } 408 1.1 kamil if (!enemies) 409 1.1 kamil enemies = nuke; 410 1.1 kamil if (!movers) 411 1.1 kamil movers = nuke; 412 1.1 kamil } 413 1.1 kamil if (rand_mod(27-sm50/2) && !romspec && !gornspec) 414 1.1 kamil dist = 27-sm50/2; 415 1.1 kamil else 416 1.1 kamil dist = rand_mod(4) + 1; 417 1.1 kamil for (i = 1+inumcrushes+inumamoebas; i <= numenemies; i++) { 418 1.1 kamil do { 419 1.1 kamil x = rand_mod(XSIZE); 420 1.1 kamil y = rand_mod(YSIZE); 421 1.1 kamil } while (occupant[y][x]); 422 1.1 kamil if (rand_mod(dist)) { 423 1.1 kamil if (!tholspec && !tmptholspec && rand_mod((inumstars*3)/sm50+2)) 424 1.1 kamil ch = 'K'; 425 1.1 kamil else { 426 1.1 kamil ch = 'T'; 427 1.1 kamil inumthols++; 428 1.1 kamil } 429 1.1 kamil } 430 1.1 kamil else { 431 1.1 kamil if (romspec == gornspec) 432 1.1 kamil e = 50; 433 1.1 kamil else if (gornspec) 434 1.1 kamil e = 10; 435 1.1 kamil else 436 1.1 kamil e = 90; 437 1.1 kamil if (rand_mod(100) < e) { 438 1.1 kamil ch = 'R'; 439 1.1 kamil inumroms++; 440 1.1 kamil } 441 1.1 kamil else { 442 1.1 kamil ch = 'G'; 443 1.1 kamil inumgorns++; 444 1.1 kamil } 445 1.1 kamil } 446 1.1 kamil if (possiblescore > ENTBOUNDARY - 10000) 447 1.1 kamil e = (ENTBOUNDARY - possiblescore) / 5; 448 1.1 kamil else 449 1.1 kamil e = 250 + (sm50-1) * 30 * 20 / numenemies+1; 450 1.1 kamil #ifndef lint 451 1.1 kamil e = exdis((int)e) + e - exdis((int)e); 452 1.1 kamil obj = make_object(Enemy,ch,y,x,0,0, 453 1.1 kamil e + rand_mod(super*200+2) + 10000*massacre,e/4,&root); 454 1.1 kamil #endif 455 1.1 kamil e /= 4; 456 1.1 kamil switch (ch) { 457 1.1 kamil case 'K': 458 1.1 kamil possiblescore += e; 459 1.1 kamil break; 460 1.1 kamil case 'T': 461 1.1 kamil possiblescore += e*3/2; 462 1.1 kamil break; 463 1.1 kamil case 'G': 464 1.1 kamil possiblescore += e*2; 465 1.1 kamil break; 466 1.1 kamil case 'R': 467 1.1 kamil possiblescore += e*3; 468 1.1 kamil obj->flags |= CLOAKS; 469 1.1 kamil break; 470 1.1 kamil } 471 1.1 kamil if (!enemies) 472 1.1 kamil enemies = obj; 473 1.1 kamil if (!movers) 474 1.1 kamil movers = obj; 475 1.1 kamil } 476 1.1 kamil numgorns = inumgorns; 477 1.1 kamil for (i=0; i<numfriends; i++) { 478 1.1 kamil do { 479 1.1 kamil x = rand_mod(XSIZE); 480 1.1 kamil y = rand_mod(YSIZE); 481 1.1 kamil } while (occupant[y][x]); 482 1.1 kamil e = 250 + (sm50-1) * 30 * 20 / numenemies+1; 483 1.1 kamil #ifndef lint 484 1.1 kamil e = exdis((int)e) + e - exdis((int)e); 485 1.1 kamil #endif 486 1.1 kamil { 487 1.1 kamil static char let[] = "QWYUISDHJLZVMFFFFFFFFF"; 488 1.1 kamil 489 1.1 kamil dist = rand_mod(20); 490 1.1 kamil ch = let[dist]; 491 1.4 christos } /* grr, venix doesn't like strchring into string */ 492 1.1 kamil obj = make_object(Enemy,ch,y,x,0,0, 493 1.1 kamil e + rand_mod(super*200+2),e/4,&root); 494 1.1 kamil if (numpirates-- > 0) { 495 1.1 kamil obj->flags |= PIRATE; 496 1.1 kamil if (smarts >= 20 && !rand_mod(10-smarts/10)) 497 1.1 kamil obj->flags |= CLOAKS; 498 1.1 kamil } 499 1.1 kamil obj->flags |= FRIENDLY; 500 1.1 kamil if (!enemies) 501 1.1 kamil enemies = obj; 502 1.1 kamil if (!movers) 503 1.1 kamil movers = obj; 504 1.1 kamil } 505 1.1 kamil if (!movers) 506 1.1 kamil movers = &root; 507 1.1 kamil if (!enemies) 508 1.1 kamil enemies = &root; 509 1.1 kamil if (ent) 510 1.1 kamil mvaddch(ent->posy+1, ent->posx*2, ent->image); 511 1.1 kamil if (base) 512 1.1 kamil mvaddch(base->posy+1, base->posx*2, base->image); 513 1.1 kamil sleep(2); 514 1.1 kamil { 515 1.3 christos OBJECT *curobj; 516 1.1 kamil 517 1.1 kamil for (curobj = root.next; curobj != &root; curobj = curobj->next) { 518 1.1 kamil mvaddch(curobj->posy+1, curobj->posx*2, curobj->image); 519 1.1 kamil } 520 1.1 kamil } 521 1.1 kamil 522 1.5 rillig for (i=0;i<2;i++) for (y=0;y<3;y++) for (x=0;x<3;x++) 523 1.1 kamil isatorp[i][y][x]=0; 524 1.1 kamil 525 1.1 kamil whenok = 0; 526 1.1 kamil timer = 0; 527 1.1 kamil finish = 0; 528 1.3 christos bombed_out = false; 529 1.1 kamil if (ent) 530 1.1 kamil entmode = status = 0; 531 1.1 kamil else 532 1.1 kamil if (base) 533 1.1 kamil status = 2; 534 1.1 kamil else 535 1.1 kamil status = 3; 536 1.1 kamil 537 1.3 christos snprintf(spbuf, sizeof(spbuf), 538 1.1 kamil "%-4s E: %4d %2d B: %5d %3d Enemies: %-3d Stars: %-3d Stardate%5d.%1d %9ld", 539 1.1 kamil " ", 0, 0, 0, 0, 0, 0, smarts * 100, 0, 0L); 540 1.1 kamil mvaddstr(0,0,spbuf); 541 1.1 kamil oldeenergy = oldbenergy = oldcurscore = 542 1.1 kamil oldstatus = oldetorp = oldbtorp = oldstrs = oldenemies = -1; 543 1.1 kamil /* force everything to fill in */ 544 1.1 kamil damage = olddamage = 0; 545 1.1 kamil for (i=0; i<MAXDAMAGE; i++) 546 1.1 kamil damflag[i] = 0; 547 1.1 kamil btorp = 500; 548 1.1 kamil etorp = 50; 549 1.1 kamil } 550