[CF-Devel] patch for generators to create special ability monsters
Norbert Irmer
norbert.irmer at t-online.de
Mon Apr 15 19:29:33 CDT 2002
Mark Wedel wrote:
>
Norbert Irmer wrote:
>
>>
Hi,
>>
>>
Putting a monster in the inventory of the generator and copying it, is
>>
a nice idea, since it is more flexible and faster. Perhaps one could
>>
even
>>
use the 'copy_object()' function for it.
>
>
>
>
Probably. The code to have the generators inventory make a monster
>
should be pretty easy - it would be something like if
>
(generator->inv) then obj_to_create=generator->inv; else
>
obj_to_create=generator->other_arch (or something pretty close to that).
>
>
The other really nice thing about using a monster in the inventory is
>
then that map editor can use its standard object interface to change it.
>
I tried to follow your advice, and have written a replacement for
'generate_monster()'.
that in my opinion it should work. The main problem now is, how do i inform
the server, that a certain object IS the inventory of another object.
With the current map load function this isn't possible.
Here's my code (i have included it for further discussion):
void generate_monster(object *gen) {
int i;
object *op,*head=NULL,*prev=NULL,*gob;
archetype *at=gen->other_arch;
if(GENERATE_SPEED(gen)&&rndm(0, GENERATE_SPEED(gen)-1))
return;
if(gen->other_arch==NULL) {
if(gen->inv==NULL) {
LOG(llevError,"Generator without other_arch or inv: %s\n",gen->name);
return;
}
gob=gen->inv;
i=find_free_spot(gob->arch,gen->map,gen->x,gen->y,1,9);
if (i==-1) return;
while(gob!=NULL) {
op=get_object();
copy_object(gob,op);
op->x=gen->x+freearr_x[i]+gob->arch->clone.x;
op->y=gen->y+freearr_y[i]+gob->arch->clone.y;
if(head!=NULL)
op->head=head,prev->more=op;
if (rndm(0, 9)) generate_artifact(op, gen->map->difficulty);
insert_ob_in_map(op,gen->map,gen,0);
if (QUERY_FLAG(op, FLAG_FREED)) return;
if(op->randomitems!=NULL)
create_treasure(op->randomitems,op,GT_APPLY,
gen->map->difficulty,0);
if(head==NULL)
head=op;
prev=op;
gob=gob->more;
}
}
else {
i=find_free_spot(at,gen->map,gen->x,gen->y,1,9);
if (i==-1) return;
while(at!=NULL) {
op=arch_to_object(at);
op->x=gen->x+freearr_x[i]+at->clone.x;
op->y=gen->y+freearr_y[i]+at->clone.y;
if(head!=NULL)
op->head=head,prev->more=op;
if (rndm(0, 9)) generate_artifact(op, gen->map->difficulty);
insert_ob_in_map(op,gen->map,gen,0);
if (QUERY_FLAG(op, FLAG_FREED)) return;
if(op->randomitems!=NULL)
create_treasure(op->randomitems,op,GT_APPLY,
gen->map->difficulty,0);
if(head==NULL)
head=op;
prev=op;
at=at->more;
}
}
}
More information about the crossfire
mailing list