[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