/
order.v1/
order.v1/order/

ACT_COMM.c

void do_pray(CHAR_DATA * ch, char *argument) /* Order by Muerte */
{
    DESCRIPTOR_DATA *d;
        
    act_new("You get down on your knees and pray to the gods '$t'", ch, argument, NULL, TO_CHAR, POS_DEAD);
    act("$n drops to $s knees and prays.", ch, NULL, argument, TO_ROOM);
    for (d = descriptor_list; d != NULL; d = d->next)
    {
        if (d->connected == CON_PLAYING && IS_IMMORTAL(d->character))
        {
	    if (ch->order)
		printf_to_char(d->character, "{WPray [{M%s{W] [%s of %s]:{w %s{x.\n\r", ch->name, ch->order_ptr->rank[ch->orderrank].rankname, ch->order_ptr->patron, argument);
	    else
		printf_to_char(d->character, "{WPray [{M%s{W] {w%s{x.\n\r", ch->name, argument);
        }
    }
            
    return;
}


ACT_INFO.C

do_score:
/* Add and format anywhere you like */

        if (ch->order)  /* Order by Muerte */
            printf_to_char(ch, "{wReligion: {W%s {xof{W %s{x.\n\r", 
	    !str_cmp(ch->name, ch->order_ptr->patron) ? "Patron" : player_orderrank(ch), 
	    !str_cmp(ch->name, ch->order_ptr->patron) ? ch->order_ptr->name : ch->order_ptr->patron);


DB.C

do_boot:
	before->
	    /*
	     * Read in all the area files.
	     */

	add->
	    load_orderlist();  /* Order by Muerte */

INTERP.C
/* I use grant, If you don't, you want to make the IM/OLC commands leveled however you want */

	cmd_table add->

	    /* Order Stuff by Muerte */
	    {"patron",       	do_patron,   	POS_RESTING, 0, LOG_NORMAL, 1, 0},
	    {"unpatron",       	do_unpatron,   	POS_RESTING, 0, LOG_NORMAL, 1, 0},
	    {"orderrank",       do_orderrank,  	POS_RESTING, 0, LOG_NORMAL, 1, 0},  
	    {"followers", 	do_followers,  	POS_RESTING, 0, LOG_NORMAL, 1, 0},
	    {"pray", 		do_pray, 	POS_DEAD, 0, LOG_NORMAL, 0, 0},
	    /* Order OLC by Muerte */
	    {"orlist", 		do_orlist,     	POS_DEAD, IM, LOG_NORMAL, 0, 0},
	    {"oredit", 		do_oredit,     	POS_DEAD, IM, LOG_NORMAL, 0, 0},
	    {"orsave", 		do_orsave,     	POS_DEAD, IM, LOG_NORMAL, 0, 0},

INTERP.H
	add->
	    DECLARE_DO_FUN( do_patron       ); /* Order by Muerte */
	    DECLARE_DO_FUN( do_unpatron     ); /* Order by Muerte */
	    DECLARE_DO_FUN( do_orderrank    ); /* Order by Muerte */
	    DECLARE_DO_FUN( do_followers    ); /* Order by Muerte */
	    DECLARE_DO_FUN( do_orlist       ); /* Order by Muerte */
	    DECLARE_DO_FUN( do_oredit       ); /* Order by Muerte */
	    DECLARE_DO_FUN( do_orsave       ); /* Order by Muerte */

MERC.H
	add with like types ->
	    typedef struct  order_data              ORDER_DATA; /* Order by Muerte */
	    typedef struct  ordermem_data           ORDERMEM_DATA;
	    typedef struct  order_rank              order_rankdata;

	    #define MAX_GODS			2
	    #define MAX_ORDER			10
	    #define MAX_ORDERRANK               10 

	    #define ORDER_LIST      "../order/order.lst" /* Order by Muerte */
	    #define ORDER_DIR       "../order/"

	    extern          ORDER_DATA *            order_first;    /* Order by Muerte */
	    extern          ORDER_DATA *            order_last; 
	    extern          ORDERMEM_DATA *         ordermem_first;
	    extern          ORDERMEM_DATA *         ordermem_last;  
	    extern		int			top_order;
	    extern  const   struct  god_type      god_table     [MAX_GODS];

	add-> char_data
	    ORDER_DATA *	order_ptr; /* Order by Muerte */
	    char *		order; /* Order by Muerte */
	    sh_int		orderrank; /* Order by Muerte */

	add-> room_index_data
	    ORDER_DATA *	order; /* Order by Muerte */

	add-> /* olc.c */
	    void    save_order       args( (ORDER_DATA * pGuild) ); /* Order by Muerte */
	    ORDER_DATA *get_order_data      args( ( int order ) ); /* Order by Muerte */
	    int    add_ordermem     args((ORDERMEM_DATA * mMemb)); /* Order by Muerte */
	    int    del_ordermem       args((char * name_of_player)); /* Order by Muerte */

	add-> /* olc_save.c */
	    void do_saveorder     args( ( CHAR_DATA *ch, char *argument ) ); /* Order by Muerte */

	add-> at end of file
	    /* Order flags by Muerte */
	    #define ORDER_DELETED           A
	    #define ORDER_CHANGED           B
	    #define ORDER_INDEPENDENT       C /* a "loner" order */
	    #define ORDER_ADDED             D  
                                    
	    /* order.c by Muerte */
	    struct  order_data      order_table[MAX_ORDER];
	    char *  order_bit_name  args( ( int order_flags ) );
	    bool    is_order         args( (CHAR_DATA *ch) );
	    bool    is_same_order    args( (CHAR_DATA *ch, CHAR_DATA *victim) );
	    ORDER_DATA *order_lookup    args( (const char *name) );
	    ORDER_DATA *order_name  args((CHAR_DATA *ch));
	    void    do_order        args( (CHAR_DATA *ch, char *argument ) );
	    char    *player_orderrank       args( (CHAR_DATA *ch) );
	    char    *player_order   args( (CHAR_DATA *ch) );   
	    void    load_orderlist args(());
	    bool    can_order       args( (CHAR_DATA *ch) );
	    bool    can_deorder     args( (CHAR_DATA *ch) );
	    bool    can_orderpromote     args( (CHAR_DATA *ch) );
	    bool    can_orderdemote      args( (CHAR_DATA *ch) );

	    struct order_rank /* Order by Muerte */
	    {
 	      char *rankname;    /* name of rank */
	    };

	    struct ordermem_data /* Order by Muerte */
	    {
	      ORDERMEM_DATA * next;
	      ORDER_DATA * order;
	      char  *name;           /* Follower Name */
	      int   rank;           /* Rank of Follower */
	    };
	    
	    struct order_data /* Order by Muerte */
	    {
	      ORDER_DATA * next;
	      int   vnum;
	      char  *file_name;
	      char  *patron; /* name of patron */
	      char  *name;   /* name of order */
	      order_rankdata rank[MAX_ORDERRANK];   /* orders rank system */
	      int   ml[4];    /* mortal leader rights */
	      long  flags;   /* flags for order */
	      int   members;
	      ORDERMEM_DATA *ordermem;
	    };

	    struct god_type /* Order by Muerte */
	    {
	        char *	name;			/* God's Name */
	        char *	desc;			/* Brief Description */
	        char * 	holy_symbol;
	        char *      prof;
	        sh_int	align_compat[9];	/* Alignment compatability */
	        sh_int	class_compat[11+2];	/* Class compatibility */
	        sh_int	align;			/* God's alignment */
	        sh_int	race_compat[8];		/* Racial compatibility */

	    };

OLC.H
	add-> conn state
	    #define ED_ORDER	(Next number in line) /* Order by Muerte */

	add-> Utils
	    ORDER_DATA  *get_order_data	args ((int vnum)); /* Order by Muerte */

	add-> room editor prototypes
	    DECLARE_OLC_FUN( redit_order            ); /* Order by Muerte */

	add-> below other prototypes 
	    /* Order Editor Prototypes by Muerte */
	    DECLARE_OLC_FUN( oredit_flags            );
	    DECLARE_OLC_FUN( oredit_rank             );
	    DECLARE_OLC_FUN( oredit_name             );
	    DECLARE_OLC_FUN( oredit_show             );
	    DECLARE_OLC_FUN( oredit_create           );
	    DECLARE_OLC_FUN( oredit_list             );
	    DECLARE_OLC_FUN( oredit_rooms            );
	    DECLARE_OLC_FUN( oredit_ml               );
	    DECLARE_OLC_FUN( oredit_patron           );
	    DECLARE_OLC_FUN( oredit_file             );

	add-> Return Pointers
	    #define EDIT_ORDER(Ch, Order)    ( Order = Ch->desc->pEdit ) /* Order by Muerte */

	add -> mem.c prototype
	    ORDER_DATA      *new_order              args ( ( void ) ); /* Order by Muerte */
	    void            free_order              args ( ( ORDER_DATA *pOrder ) ); /* Order by Muerte */

	add -> interp prototype
	    void    oredit		args( ( CHAR_DATA *ch, char *argument ) ); /* Order by Muerte */

	add -> interp table prototype
	    extern const struct olc_cmd_type        oredit_table[]; /* Order by Muerte */

	add -> editor commands
	    DECLARE_DO_FUN( do_oredit	); /* Order by Muerte */

MEM.c
	add -> ROOM_INDEX_DATA *new_room_index(void)
	    pRoom->order = 0; /* Order by Muerte */

	add -> end of file

	    extern int top_order; /* Order by Muerte */
	    ORDER_DATA *order_free; /* Order by Muerte */
	        
	    ORDER_DATA *new_order(void)  /* Order by Muerte */
	    {
	        ORDER_DATA *pOrder;
	        char buf[MAX_INPUT_LENGTH];
	        int i;
	    
	        if (!order_free)
	        {
	            pOrder = alloc_perm(sizeof(*pOrder));
	            top_order++;   
	        }
	        else
	        {
	            pOrder = order_free;  
	            order_free = order_free->next;
	        }   
	        
	        pOrder->next = NULL;
	        pOrder->name = str_dup("New Order");    
	        pOrder->patron = str_dup("Ao");
	    
	        pOrder->rank[0].rankname = str_dup("Believer");
	        pOrder->rank[1].rankname = str_dup("Follower");  
	        pOrder->rank[2].rankname = str_dup("Worshipper");
	        pOrder->rank[3].rankname = str_dup("Faithful");  
	        pOrder->rank[4].rankname = str_dup("Devoted");   
	        pOrder->rank[5].rankname = str_dup("Junior Priest");
	        pOrder->rank[6].rankname = str_dup("Priest");    
	        pOrder->rank[7].rankname = str_dup("High Priest");
	        pOrder->rank[8].rankname = str_dup("Chosen One");
	        pOrder->rank[9].rankname = str_dup("Patron");
	        for(i=0; i < 4; i++)   
	        {
	            pOrder->ml[i] = 0;
	        }
	        pOrder->flags = ORDER_ADDED;
	         
	        sprintf(buf, "order%d.ord", pOrder->vnum);
	        pOrder->file_name = str_dup(buf);
	        pOrder->vnum = top_order - 1;
	        return pOrder;
	    }

	    void free_order(ORDER_DATA * pOrder)   /* Order by Muerte */
	    {
	        free_string(pOrder->name);
	        free_string(pOrder->file_name);
    
	        pOrder->next = order_free->next;
	        order_free = pOrder;
	        return;
	    }


OLC.C
	add -> bool run_olc_editor(DESCRIPTOR_DATA * d)

	        case ED_ORDER:   /* Order by Muerte */
	            oredit(d->character, d->incomm);
	            break;

	add -> char *olc_ed_name(CHAR_DATA * ch)

	        case ED_ORDER:   /* Order by Muerte */
	            sprintf(buf, "OrEdit");
	            break;

	add -> bool show_commands(CHAR_DATA * ch, char *argument)

	        case ED_ORDER:   /* Order by Muerte */
	            show_olc_cmds( ch, oredit_table );
	            break;

	add -> with other command tables

	    /* Order edit command table by Muerte */
	    const struct olc_cmd_type oredit_table[] =
	    {
	        {   "commands",     show_commands   },
	        {   "create",       oredit_create    },
	        {   "flag",         oredit_flags     },
	        {   "list",         oredit_list      },
	        {   "ml",           oredit_ml        },
	        {   "name",         oredit_name      },
	        {   "patron",       oredit_patron    },
	        {   "rank",         oredit_rank      },
	        {   "show",         oredit_show      },
	        {   "filename",     oredit_file      },
	        {   "?",            show_help       },
	        {   NULL,           0               }
	    };

	add -> const struct editor_cmd_type editor_table[] = {

	        { "order", do_oredit },   /* Order by Muerte */

    	add -> at end of file

	    void do_oredit( CHAR_DATA *ch, char *argument )   /* Order by Muerte */
	    {
	        ORDER_DATA *pOrder;
	        int value;
	        char arg[MAX_STRING_LENGTH];
  
	        argument    = one_argument(argument,arg);

	        if ( IS_NPC(ch) )
 	           return;
 
	        if (is_number(arg))
	        {
	            value = atoi(arg) -1;
	            if (!(pOrder = get_order_data(value)))
	            {
	                send_to_char("That order vnum does not exist.\n\r", ch);
	                return;
	            }
	        }
	         
	        if (( arg[0] == '\0') || (!str_cmp(arg,"list")))
	        {
	            send_to_char("Syntax: oredit <order name>\n\r", ch);
	            do_function(ch, &do_orlist, "");
	            return;
	        }
	      
	        else if ( !str_cmp( arg, "create" ) )
	        {
	            oredit_create( ch, "" );
	            ch->desc->editor = ED_ORDER;
        return;
	        }
	        if (!is_number(arg))
	            pOrder = order_lookup(arg);
	        ch->desc->pEdit = (void *) pOrder;
	        ch->desc->editor = ED_ORDER;
	        return;
	    }

	    void oredit( CHAR_DATA *ch, char *argument )   /* Order by Muerte */
	    {
	      ORDER_DATA *pOrder;
	      char command[MIL];
	      char arg[MIL];
             
	      int cmd;
         
	      EDIT_ORDER(ch, pOrder);
	      smash_tilde( argument );
	      strcpy( arg, argument );
	      argument = one_argument( argument, command );
	     
	      if ( !str_cmp(command, "done") )
	      {
	        edit_done( ch );
	        return;
	      }
	      
	      if ( command[0] == '\0' )
	      {
	        oredit_show( ch, argument );
	        return;
	      }
	      
	      // Search Table and Dispatch Command.
	      for ( cmd = 0; oredit_table[cmd].name != NULL; cmd++ )
	      { 
	        if ( !str_prefix( command, oredit_table[cmd].name ) )
	        {
	          if ( (*oredit_table[cmd].olc_fun) ( ch, argument ) )
	          {
	            SET_BIT( pOrder->flags, ORDER_CHANGED );
	            return;
	          } 
	          else
	           return;
	        }
	      }
	       
	      // Default to Standard Interpreter.
	      interpret( ch, arg );
	      return;
	    }
	    
	    void do_orlist(CHAR_DATA * ch, char *argument)   /* Order by Muerte */
	    {
	        ORDER_DATA *pOrder;
	        char buf[MAX_STRING_LENGTH];
	        char result[MAX_STRING_LENGTH * 2]; /* May need tweaking. */
	        int i = 0;
	      
	        if (IS_NPC(ch))
	            return;
	        
	        sprintf(result, "[%3s] [%-27s]\n\r", "Num", "Order Name");
	      
	        for (pOrder = order_first; pOrder; pOrder = pOrder->next)
	        {
	            i++;
	            sprintf(buf, "[%3d] %-29.29s %s\n\r", i, pOrder->name, IS_SET(pOrder->flags, ORDER_CHANGED) ? "[CHANGED]" : "");
	            strcat(result, buf);
	        }
       
	        send_to_char(result, ch);
	        return;
	    }       

OLC_ACT.c
	add -> REDIT( redit_copy )

	        pRoom->order = pRoom2->order;   /* Order by Muerte */

	add -> REDIT(redit_show)

	        if (pRoom->order > 0)   /* Order by Muerte */
	        {
	            sprintf(buf, "Order      : %s\n\r", pRoom->order->name);
	            strcat(buf1, buf);
	        }

	add -> in REDIT stuff

	    REDIT(redit_order)   /* Order by Muerte */
	    {
	        ROOM_INDEX_DATA *pRoom;
        
	        EDIT_ROOM(ch, pRoom);
	        
	        pRoom->order = order_lookup(argument);
	            
	        send_to_char("Order set.\n\r", ch);
	        return TRUE;
	    }   

	add-> at end of file

	    /* Order Editor by Muerte */
	    OREDIT( oredit_flags )   /* Order by Muerte */
	    {
	      ORDER_DATA *pOrder;
	      long value = 0;
	                    
	      if ( argument[0] != '\0' )
	      {  
	        EDIT_ORDER( ch, pOrder );
	        
	        if ( ( value = flag_value( order_flags, argument ) ) != NO_FLAG )
	        {
	          pOrder->flags ^= value;
	          send_to_char( "Order flag(s) toggled.\n\r", ch);
    	          return TRUE;
	        }
	      }
  
	      send_to_char( "Syntax: flag [flag ID]\n\r"
              "Type '? order' for a list of valid flags.\n\r", ch );
	      return FALSE;
	    }

	    OREDIT( oredit_rank )   /* Order by Muerte */
	    {   
	      ORDER_DATA *pOrder;
	      char arg1[4];
      
      
    	      EDIT_ORDER(ch, pOrder);
	         
	      argument = one_argument(argument, arg1);
	      
	      if (is_number(arg1) && atoi(arg1) <= MAX_ORDERRANK)
	      {
	        int value; 
	     
	        value = atoi(arg1) -1;
	    
	        if (argument[0] != '\0')
	        {
	          free_string(pOrder->rank[value].rankname);
	          pOrder->rank[value].rankname = str_dup( argument );
	          send_to_char("Rank name changed.\n\r", ch);
	          return TRUE;
	        }
	        
	      }
	      
	      send_to_char("Syntax: rank rank# newname\n\r", ch);
	      return FALSE;
	    }

	    OREDIT(oredit_create)   /* Order by Muerte */
	    { 
	        ORDER_DATA *pOrder;
	       
	        
	        pOrder = new_order();
	        order_last->next = pOrder;
	        order_last = pOrder;
	        ch->desc->pEdit = (void *) pOrder;
     	    
	        send_to_char("Order Created.\n\r", ch);
	        return FALSE;
	    }
	    
	    OREDIT(oredit_name)   /* Order by Muerte */
	    {   
	        ORDER_DATA *pOrder;
	      
	        EDIT_ORDER(ch, pOrder);
	      
	        if (argument[0] == '\0')
	        {
	            send_to_char("Syntax:   name [$name]\n\r", ch);
	            return FALSE;
	        }
	       
	        free_string(pOrder->name);
	        pOrder->name = str_dup(argument);
	        
	        send_to_char("Name set.\n\r", ch);
	        return TRUE;
	    }   

	    OREDIT( oredit_list )   /* Order by Muerte */
	    {
	      char buf[MIL];
	      BUFFER *buffer;
	      int i;
	         
	      buffer = new_buf();
	        
	      sprintf(buf, "Num  Order Name  Flags\n\r-----------------------------------------------\n\r");
	      add_buf(buffer, buf);
	        
	      for (i=1; i <= MAX_ORDER; i++)
	      {  
	        if (order_table[i].name != NULL && order_table[i].name[0] != '\0')
	        {
	          sprintf(buf,"[%2d]  %s\t Flags:\t[%s]\n\r",
	                      i, order_table[i].name, flag_string( order_flags, order_table[i].flags ) );
	          add_buf(buffer, buf);  
	        }
	      }
	      
	      page_to_char( buf_string(buffer), ch );
	      free_buf(buffer);
	      return FALSE;
	    }	  
	    
	    OREDIT( oredit_show )   /* Order by Muerte */
	    {
	        ORDER_DATA *pOrder;
	        char buf[MSL];
	        int i;
	          
	        EDIT_ORDER(ch, pOrder);
	       
	        sprintf(buf, "File:    %s\n\r", pOrder->file_name);
	        send_to_char(buf, ch);
	      
	        sprintf(buf, "Name:    %s\n\r", pOrder->name);
	        send_to_char(buf, ch);
	      
	        sprintf(buf, "Order Patron: %s\n\r", pOrder->patron);
	        send_to_char(buf, ch);
	      
	        sprintf(buf, "Flags:      [%s]\n\r\n\r", flag_string( order_flags, pOrder->flags ) );
	        send_to_char(buf, ch);
	      
	        sprintf(buf, "#    Rank\n\r--------------------------------------------------------------\n\r");
	        
	        for (i=0; i < MAX_ORDERRANK; i++)
	        {
	         sprintf(buf,"[%2d] %-25s\n\r", i+1, (pOrder->rank[i].rankname  != '\0') ? pOrder->rank[i].rankname : "None");
	         send_to_char(buf, ch);
	        }
	          
	        printf_to_char(ch, "\n\r\n\rMortal Leader Rights\n\r--------------------\n\r");
	        sprintf(buf, "Can Order   : %s\n\rCan Deorder : %s\n\rCan Promote : %s\n\rCan Demote  : %s\n\r",
	              (pOrder->ml[0]==1) ? "True" : "False", (pOrder->ml[1]==1) ? "True" : "False",
	              (pOrder->ml[2]==1) ? "True" : "False", (pOrder->ml[3]==1) ? "True" : "False");
	        send_to_char(buf, ch);
    
	        return FALSE;
	    }
	    
	    OREDIT( oredit_ml )   /* Order by Muerte */
	    {
	      ORDER_DATA *pOrder;
	      char arg1[6], arg2[6], arg3[6], arg4[6];
	      bool set = FALSE;  
	     
	      EDIT_ORDER(ch, pOrder);
	      
	      if ( argument[0] == '\0' )
	      {
	        send_to_char( "Syntax:  ml TRUE|FALSE TRUE|FALSE TRUE|FALSE TRUE|FALSE\n\r", ch );
	        return FALSE;
	      }
	      
	      argument = one_argument(argument, arg1);
	      argument = one_argument(argument, arg2);
	      argument = one_argument(argument, arg3);
	      argument = one_argument(argument, arg4);
	        
	      if (!str_prefix(arg1,"true") )
	        { pOrder->ml[0] = TRUE; set = TRUE; }
	      else
	      if (!str_prefix(arg1, "false") )
	        { pOrder->ml[0] = FALSE; set = TRUE; }  
	            
	      if (!str_prefix(arg2,"true") )
	        { pOrder->ml[1] = TRUE; set = TRUE; }
	      else
	      if (!str_prefix(arg2, "false") )
	        { pOrder->ml[1] = FALSE; set = TRUE; }
	         
	      if (!str_prefix(arg3,"true") )
	        { pOrder->ml[2] = TRUE; set = TRUE; }
	      else
	      if (!str_prefix(arg3, "false") )
	        { pOrder->ml[2] = FALSE; set = TRUE; }
	      
	      if (!str_prefix(arg4,"true") )
	        { pOrder->ml[3] = TRUE; set = TRUE; }
	      else
	      if (!str_prefix(arg4, "false") )
	        { pOrder->ml[3] = FALSE; set = TRUE; }
	      if (set)
	      {
	        send_to_char("Mortal Leader traits set.\n\r", ch);
	        return TRUE;
	      }
	        
	      return FALSE;
	    }
	    
	    OREDIT(oredit_file)   /* Order by Muerte */
	    {
	        ORDER_DATA *pOrder;
	        char file[MAX_STRING_LENGTH];
	        int i, length;
	           
	        EDIT_ORDER(ch, pOrder);
     
	        one_argument(argument, file);       /* Forces Lowercase */
	             
	        if (argument[0] == '\0')
	        {
	            send_to_char("Syntax:  filename [$file]\n\r", ch);
	            return FALSE;
	        }
	        
	        /*
	         * Simple Syntax Check.
	         */
	        length = strlen(argument);
	        if (length > 8)
	        {
	            send_to_char("No more than eight characters allowed.\n\r", ch);
	            return FALSE;
	        }
    
	        /*
	         * Allow only letters and numbers.
	         */
	        for (i = 0; i < length; i++)
	        {
	            if (!isalnum(file[i]))
	            {
	                send_to_char("Only letters and numbers are valid.\n\r", ch);
	                return FALSE;
	            }
	        }
    
	        free_string(pOrder->file_name);
	        strcat(file, ".ord");  
	        pOrder->file_name = str_dup(file);
	        
	        send_to_char("Filename set.\n\r", ch);
	        return TRUE;
	    }

	    OREDIT( oredit_patron )   /* Order by Muerte */
	    {
	      ORDER_DATA *pOrder;
	      char arg1[MSL];
	      char deity[MSL];
	      int i;
     
	      EDIT_ORDER(ch, pOrder);

	      argument = one_argument(argument, arg1);
	      memset(deity, 0, MSL);
	      if ( arg1[0] == '\0' )
	      { 
	        send_to_char( "Syntax:  patron <name>\n\r", ch );
	        return FALSE;
	      }
	              
	         for(i=0;i < MAX_GODS;i++)
	         {
	            sprintf(deity, god_table[i].name);
	            if (!str_cmp(arg1, deity))
	            {
	                pOrder->patron = str_dup( deity );
	                send_to_char( "Patron set.\n\r", ch );
	                return TRUE;
	            }
	        }
	        send_to_char("That god does not have power in this realm.", ch);
	        return FALSE;
	    }


OLC_SAVE.C

	add -> save_rooms below guild stuff.

                if (pRoomIndex->order > 0)
                    fprintf(fp, "G %s~\n", pRoomIndex->order->name);

	add -> at end of file

	    void save_order_list()   /* Order by Muerte */
	    {
	        FILE *fp;
	        ORDER_DATA *pOrder;
 
 	       if (!(fp = fopen(ORDER_LIST, "w")))
	        {
	            bug("Save_order_list: fopen", 0);
	            perror("order.lst");
	        }
	        else
	        {
	            for (pOrder = order_first; pOrder; pOrder = pOrder->next)
	            {
	                fprintf(fp, "%s\n", pOrder->file_name);
	            }

	            fprintf(fp, "$\n");
	            fclose(fp);
	        }
 
 	       return;
	    }	

	    void save_order(ORDER_DATA * pOrder)   /* Order by Muerte */
	    {                       
	        FILE *fp;
	        char buf[MAX_STRING_LENGTH];
	        char file[200];
	        int value;          
	        ORDERMEM_DATA *ordermem;
                
	        fclose(fpReserve);      
	        sprintf(file, ORDER_DIR);   
	        strcat(file, pOrder->file_name);
	             
	        if (!(fp = fopen(file, "w")))
	        {
	            bug("Open_Order: fopen", 0);
	            perror(pOrder->file_name);
	        }                   
	        fprintf(fp, "%s~\n", pOrder->file_name);
	        fprintf(fp, "Order %s~\n", pOrder->name);
	        fprintf(fp, "Patron %s~\n", pOrder->patron);
	        for (value=0; value < MAX_ORDERRANK; value++)
	        {
	            if (pOrder->rank[value].rankname == NULL || pOrder->rank[value].rankname[0] == '\0')
	               pOrder->rank[value].rankname = str_dup("Unassigned");
    
	              fprintf(fp, "Rank\t%d\t%s~\n", value+1, pOrder->rank[value].rankname);
	          }
    
	          fprintf(fp, "ML\t");
	          for(value=0;value < 4;value++)
	            fprintf(fp,  "%d  ", pOrder->ml[value]);
	          fprintf(fp, "\n");
	            
	          // Remove "changed" bit before writing flags to file
	          if (IS_SET(pOrder->flags, ORDER_CHANGED))
	            REMOVE_BIT(pOrder->flags, ORDER_CHANGED);
	          fprintf( fp, "Flag %s\n",  fwrite_flag(pOrder->flags, buf));
    
	        fprintf(fp, "\n\n");
	        for (ordermem = ordermem_first; ordermem; ordermem = ordermem->next)
	        {
	            if (pOrder == ordermem->order)
	            {
	                sprintf(buf, "Member\t%s~ %d\n", ordermem->name, ordermem->rank);
	                fprintf(fp, buf);
	            }
	        }
      
	        fprintf(fp, "\n");
	        fprintf(fp, "End\n"); 
      
	        fclose(fp);
	        fpReserve = fopen(NULL_FILE, "r");
	        return;
	    }

	    void do_orsave(CHAR_DATA * ch, char *argument)   /* Order by Muerte */
	    {
	        char arg1[MAX_INPUT_LENGTH];
	        ORDER_DATA *pOrder;
	        FILE *fp;
	        int sec, value;
            
	        fp = NULL;
    
	        if (!ch)    
	            sec = 9;
	        else if (!IS_NPC(ch))
	            sec = ch->pcdata->security;
	        else
	            sec = 0;
            
	        smash_tilde(argument);
	        strcpy(arg1, argument);
	        
	        if (arg1[0] == '\0')
	        {
	            if (ch)
	            {
	                send_to_char("Syntax:\n\r", ch);
	                send_to_char("  osave <vnum>/order - saves a particular order\n\r",ch);
	                send_to_char("  osave list         - saves the order.lst file\n\r",ch);
	                send_to_char("  osave changed      - saves modified orders.\n\r",ch);
	                send_to_char("  osave orders       - saves all orders.\n\r",ch);
	                send_to_char("\n\r", ch);
	                do_function(ch, &do_oredit, "");
	            }
	        
	            return; 
	        }
	        value = atoi(arg1);
	        if (!(pOrder = get_order_data(value-1)) && is_number(arg1))
	        {
	            if (ch)
	                send_to_char("That order does not exist.\n\r", ch);
	            return;
	        }
	        
	        if (is_number(arg1))
	        {
	            if (!IS_IMMORTAL(ch))
	            {
	                send_to_char("You are not a editor for this order.\n\r", ch);
	                return;
	            }
	                
	            save_order_list();
	            save_order(pOrder);
	            printf_to_char(ch, "Order %s saved.\n\r", pOrder->name);
	            return;
	        }
	        /* Save the order.lst file. */
	        /* ----------------------- */
	        if (!str_cmp(arg1, "list"))
	        {
	            save_order_list();
	            send_to_char("Order list saved.\n\r", ch);
	            return;
	        }
	        if (!str_cmp("changed", arg1))
	        {
	            char buf[MAX_INPUT_LENGTH];
	            
	            save_order_list();
	                
	            if (ch)
	                send_to_char("Saved orders:\n\r", ch);
	            else
	                log_string("Saved orders:");
	            
	            sprintf(buf, "None.\n\r");
	            
	            for (pOrder = order_first; pOrder; pOrder = pOrder->next)
	            {
	                /* Save changed orders. */
	                if (IS_SET(pOrder->flags, ORDER_CHANGED))
	                {
	                    save_order(pOrder);
	                    sprintf(buf, "%24s - '%s'", pOrder->name, pOrder->file_name);
	                    if (ch)
	                    {
	                        send_to_char(buf, ch);
	                        send_to_char("\n\r", ch);
	                    }
	                    else
	                        log_string(buf);
	                    REMOVE_BIT(pOrder->flags, ORDER_CHANGED);
	                }  
	            }
	            if (!str_cmp(buf, "None.\n\r"))
	            {
	                if (ch)
	                    send_to_char(buf, ch);
	                else
	                    log_string("None.");
	            }
	                
	            return;
	        }
	        if (!str_cmp("orders", arg1))  
	        {
	            save_order_list();
	            for (pOrder = order_first; pOrder; pOrder = pOrder->next)
	            {
	                save_order(pOrder);
	                REMOVE_BIT(pOrder->flags, ORDER_CHANGED);
	            }
	            if (IS_IMMORTAL(ch))
	                send_to_char("You saved order organizations.\n\r", ch);
	            return;
	        }
	        if (order_lookup(arg1))
	        {
	            save_order_list();
	            for (pOrder = order_first; pOrder; pOrder = pOrder->next)
	            {
	                if (pOrder->name == arg1)
	                {
	                    save_order(pOrder);
	                    REMOVE_BIT(pOrder->flags, ORDER_CHANGED);
	                }
	            }
	            
	            if (IS_IMMORTAL(ch))
	                printf_to_char(ch, "You saved %s order changes.\n\r", arg1);
	            return;
	        }
	    }


SAVE.C

	add -> fwrite_char
	            if (ch->order) /* Order by Muerte */
	            {
	                fprintf( fp, "Order %s~\n", ch->order);
	                fprintf( fp, "OrderRank %d\n", ch->orderrank);
	            }

	add -> load_char_obj
	        ch->order = (char *)NULL; /* Order by Muerte */
	        ch->order_ptr = (ORDER_DATA *)NULL;

    	add -> fread_Char (in proper spots)
	                if (!str_cmp(word, "Order")) { /* Order by Muerte */
	                    ch->order = str_dup(fread_string(fp));
	                    ch->order_ptr = order_name(ch);
	                    if(ch->order_ptr==NULL) {
	                            ch->order = (char *)NULL;
	                    }
	                    fMatch = TRUE;
	                }
	                KEY( "OrderRank",        ch->orderrank, fread_number( fp ) );

TABLES.C
	/* God must be in the table in order to patron an order  *
	 * The table isn't fully functional, it's made for nanny *
	 * If you would like to do restrictions. Ties into Merc.h*
	 * Max_GODS						 */

	add -> at end

	    /* God/Order Table by Muerte */
	    const struct god_type god_table[MAX_GODS] = {

	    /*  { name, description, holy symbol, profile,
	        { LG, NG, CG, LN, CN, TN, LE, NE, CE }
	        { Brb, Brd, Cle, Drd, Ftr, Mnk, Pal, Rgr, Rog, Src, Wiz, Ill, Nec },
	        align,
	        { Human, Dwarf, High Elf, Gnome, Half-Elf, Half-Orc, Halfling }
	        } 
	    */

	        {"No Deity", "no particular religious persuasion", NULL, "NOTHING",
	         {1, 1, 1, 1, 1, 1, 1, 1, 1},
	         {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
	         ALIGN_NEUTRAL,
	         {0, 0, 0, 0, 0, 0, 0}
	         },
	    };


HELP.ARE (or where ever your helps go)

0 PATRON~
The patron/worship system allows players to follow player gods or non-player gods.
You may patron or unpatron, Your God may patron you or unpatron you.

Syntax:
	Mortal   -> patron <god>
	Mortal   -> unpatron <god>

	Immortal -> patron <mortal>
	Immortal -> unpatron <mortal>

Patron code by: Muerte (muerte@acestar.org)
Thanks to: Gary McNickle (dharvest), Morpheous, mapleman
~

60 OREDIT ORLIST ORSAVE~
OREDIT is the OLC Editor to create orders.
	OREDIT create -> make a new order
	OREDIT name   -> edit order
	OREDIT vnum   -> edit order

	Once in edition, the commands are:
	file <argument> -> filename
	name <argument> -> order name
	patron <argument> -> order patron
	rank # <argument> -> rename rank
	ML TRUE|FALSE TRUE|FALSE TRUE|FALSE TRUE|FALSE -> set mortal commands (not fully implimented)
	
ORLIST is the command to list current orders.
	Lists current orders and thier vnums

ORSAVE is the command to save orders.
  	orsave <vnum>/name  - saves a particular order
  	orsave list         - saves the order.lst file
  	orsave changed      - saves modified orders.
  	orsave orders       - saves all orders.

Patron code by: Muerte (muerte@acestar.org)
Thanks to: Gary McNickle (dharvest), Morpheous, mapleman
~