]>
git.cameronkatri.com Git - bsdgames-darwin.git/blob - hack/hack.makemon.c
1 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
2 /* hack.makemon.c - version 1.0.2 */
5 extern char fut_geno
[];
7 extern struct obj
*mkobj_at();
8 struct monst zeromonst
;
11 * called with [x,y] = coordinates;
12 * [0,0] means anyplace
13 * [u.ux,u.uy] means: call mnexto (if !in_mklev)
15 * In case we make an Orc or killer bee, we make an entire horde (swarm);
16 * note that in this case we return only one of them (the one at [x,y]).
20 register struct permonst
*ptr
;
22 register struct monst
*mtmp
;
24 boolean anything
= (!ptr
);
25 extern boolean in_mklev
;
27 if(x
!= 0 || y
!= 0) if(m_at(x
,y
)) return((struct monst
*) 0);
29 if(index(fut_geno
, ptr
->mlet
)) return((struct monst
*) 0);
31 ct
= CMNUM
- strlen(fut_geno
);
32 if(index(fut_geno
, 'm')) ct
++; /* make only 1 minotaur */
33 if(index(fut_geno
, '@')) ct
++;
34 if(ct
<= 0) return(0); /* no more monsters! */
35 tmp
= rn2(ct
*dlevel
/24 + 7);
36 if(tmp
< dlevel
- 4) tmp
= rn2(ct
*dlevel
/24 + 12);
37 if(tmp
>= ct
) tmp
= rn1(ct
- ct
/2, ct
/2);
38 for(ct
= 0; ct
< CMNUM
; ct
++){
40 if(index(fut_geno
, ptr
->mlet
))
42 if(!tmp
--) goto gotmon
;
47 mtmp
= newmonst(ptr
->pxlth
);
48 *mtmp
= zeromonst
; /* clear all entries in structure */
49 for(ct
= 0; ct
< ptr
->pxlth
; ct
++)
50 ((char *) &(mtmp
->mextra
[0]))[ct
] = 0;
53 mtmp
->m_id
= flags
.ident
++;
55 mtmp
->mxlth
= ptr
->pxlth
;
56 if(ptr
->mlet
== 'D') mtmp
->mhpmax
= mtmp
->mhp
= 80;
57 else if(!ptr
->mlevel
) mtmp
->mhpmax
= mtmp
->mhp
= rnd(4);
58 else mtmp
->mhpmax
= mtmp
->mhp
= d(ptr
->mlevel
, 8);
64 mtmp
->mappearance
= ']';
67 if(x
== u
.ux
&& y
== u
.uy
&& ptr
->mlet
!= ' ')
72 if(ptr
->mlet
== 's' || ptr
->mlet
== 'S') {
73 mtmp
->mhide
= mtmp
->mundetected
= 1;
75 if(mtmp
->mx
&& mtmp
->my
)
76 (void) mkobj_at(0, mtmp
->mx
, mtmp
->my
);
78 if(ptr
->mlet
== ':') {
80 (void) newcham(mtmp
, &mons
[dlevel
+14+rn2(CMNUM
-14-dlevel
)]);
82 if(ptr
->mlet
== 'I' || ptr
->mlet
== ';')
84 if(ptr
->mlet
== 'L' || ptr
->mlet
== 'N'
85 || (in_mklev
&& index("&w;", ptr
->mlet
) && rn2(5))
89 if(ptr
->mlet
== 'w' && getwn(mtmp
))
93 if(anything
) if(ptr
->mlet
== 'O' || ptr
->mlet
== 'k') {
96 register int cnt
= rnd(10);
100 mm
= enexto(mm
.x
, mm
.y
);
101 (void) makemon(ptr
, mm
.x
, mm
.y
);
110 register xchar xx
,yy
;
113 coord foo
[15], *tfoo
;
118 do { /* full kludge action. */
119 for(x
= xx
-range
; x
<= xx
+range
; x
++)
120 if(goodpos(x
, yy
-range
)) {
122 tfoo
++->y
= yy
-range
;
123 if(tfoo
== &foo
[15]) goto foofull
;
125 for(x
= xx
-range
; x
<= xx
+range
; x
++)
126 if(goodpos(x
,yy
+range
)) {
128 tfoo
++->y
= yy
+range
;
129 if(tfoo
== &foo
[15]) goto foofull
;
131 for(y
= yy
+1-range
; y
< yy
+range
; y
++)
132 if(goodpos(xx
-range
,y
)) {
135 if(tfoo
== &foo
[15]) goto foofull
;
137 for(y
= yy
+1-range
; y
< yy
+range
; y
++)
138 if(goodpos(xx
+range
,y
)) {
141 if(tfoo
== &foo
[15]) goto foofull
;
144 } while(tfoo
== foo
);
146 return( foo
[rn2(tfoo
-foo
)] );
149 goodpos(x
,y
) /* used only in mnexto and rloc */
152 ! (x
< 1 || x
> COLNO
-2 || y
< 1 || y
> ROWNO
-2 ||
153 m_at(x
,y
) || !ACCESSIBLE(levl
[x
][y
].typ
)
154 || (x
== u
.ux
&& y
== u
.uy
)
155 || sobj_at(ENORMOUS_ROCK
, x
, y
)
163 register char ch
= mtmp
->data
->mlet
;
166 if(ch
== 'w' && mtmp
->mx
) return; /* do not relocate worms */
171 } while(!goodpos(tx
,ty
));
174 if(u
.ustuck
== mtmp
){
190 register struct permonst
*ptr
;
192 for(ct
= 0; ct
< CMNUM
; ct
++) {
195 return(makemon(ptr
,x
,y
));