[CF-Devel] patch for generators to create special ability monsters

Norbert Irmer norbert.irmer at t-online.de
Mon Apr 15 19:45:46 CDT 2002


Sorry, i was bit unclear in my last message.
I meant, how can i inform the server that a certain MULTIPART object
IS the inventory of another object.


Norbert Irmer wrote:

>
     
      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