/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* hack.makemon.c - version 1.0.2 */
extern struct obj
*mkobj_at();
* called with [x,y] = coordinates;
* [u.ux,u.uy] means: call mnexto (if !in_mklev)
* In case we make an Orc or killer bee, we make an entire horde (swarm);
* note that in this case we return only one of them (the one at [x,y]).
register struct permonst
*ptr
;
register struct monst
*mtmp
;
boolean anything
= (!ptr
);
if(x
!= 0 || y
!= 0) if(m_at(x
,y
)) return((struct monst
*) 0);
if(index(fut_geno
, ptr
->mlet
)) return((struct monst
*) 0);
ct
= CMNUM
- strlen(fut_geno
);
if(index(fut_geno
, 'm')) ct
++; /* make only 1 minotaur */
if(index(fut_geno
, '@')) ct
++;
if(ct
<= 0) return(0); /* no more monsters! */
tmp
= rn2(ct
*dlevel
/24 + 7);
if(tmp
< dlevel
- 4) tmp
= rn2(ct
*dlevel
/24 + 12);
if(tmp
>= ct
) tmp
= rn1(ct
- ct
/2, ct
/2);
for(ct
= 0; ct
< CMNUM
; ct
++){
if(index(fut_geno
, ptr
->mlet
))
mtmp
= newmonst(ptr
->pxlth
);
*mtmp
= zeromonst
; /* clear all entries in structure */
for(ct
= 0; ct
< ptr
->pxlth
; ct
++)
((char *) &(mtmp
->mextra
[0]))[ct
] = 0;
mtmp
->m_id
= flags
.ident
++;
mtmp
->mxlth
= ptr
->pxlth
;
if(ptr
->mlet
== 'D') mtmp
->mhpmax
= mtmp
->mhp
= 80;
else if(!ptr
->mlevel
) mtmp
->mhpmax
= mtmp
->mhp
= rnd(4);
else mtmp
->mhpmax
= mtmp
->mhp
= d(ptr
->mlevel
, 8);
if(x
== u
.ux
&& y
== u
.uy
&& ptr
->mlet
!= ' ')
if(ptr
->mlet
== 's' || ptr
->mlet
== 'S') {
mtmp
->mhide
= mtmp
->mundetected
= 1;
(void) mkobj_at(0, mtmp
->mx
, mtmp
->my
);
(void) newcham(mtmp
, &mons
[dlevel
+14+rn2(CMNUM
-14-dlevel
)]);
if(ptr
->mlet
== 'I' || ptr
->mlet
== ';')
if(ptr
->mlet
== 'L' || ptr
->mlet
== 'N'
|| (in_mklev
&& index("&w;", ptr
->mlet
) && rn2(5))
if(ptr
->mlet
== 'w' && getwn(mtmp
))
if(anything
) if(ptr
->mlet
== 'O' || ptr
->mlet
== 'k') {
register int cnt
= rnd(10);
(void) makemon(ptr
, mm
.x
, mm
.y
);
do { /* full kludge action. */
for(x
= xx
-range
; x
<= xx
+range
; x
++)
if(goodpos(x
, yy
-range
)) {
if(tfoo
== &foo
[15]) goto foofull
;
for(x
= xx
-range
; x
<= xx
+range
; x
++)
if(goodpos(x
,yy
+range
)) {
if(tfoo
== &foo
[15]) goto foofull
;
for(y
= yy
+1-range
; y
< yy
+range
; y
++)
if(goodpos(xx
-range
,y
)) {
if(tfoo
== &foo
[15]) goto foofull
;
for(y
= yy
+1-range
; y
< yy
+range
; y
++)
if(goodpos(xx
+range
,y
)) {
if(tfoo
== &foo
[15]) goto foofull
;
return( foo
[rn2(tfoo
-foo
)] );
goodpos(x
,y
) /* used only in mnexto and rloc */
! (x
< 1 || x
> COLNO
-2 || y
< 1 || y
> ROWNO
-2 ||
m_at(x
,y
) || !ACCESSIBLE(levl
[x
][y
].typ
)
|| (x
== u
.ux
&& y
== u
.uy
)
|| sobj_at(ENORMOUS_ROCK
, x
, y
)
register char ch
= mtmp
->data
->mlet
;
if(ch
== 'w' && mtmp
->mx
) return; /* do not relocate worms */
} while(!goodpos(tx
,ty
));
register struct permonst
*ptr
;
for(ct
= 0; ct
< CMNUM
; ct
++) {
return(makemon(ptr
,x
,y
));