Re: Percentage chance for item loading

From: Johan Dustler (Johan.Dustler@epk.ericsson.se)
Date: 01/31/97


> From: "Chuck Sosbe" <csosbe@gatem02.netusa1.net>
> 
> Can someone help me with this. I want to add percent item loading and I'm
> not really sure how to do it. I'm guessing it will be in the zone file
> someplace but thats about all I have.
> 
> Chris Sosbe
> csosbe@netusa1.net
> Alternate Reality: Still in testing
> 

Hi,
Attached to this mail is a patch for percentage loading.
Apply the changes and then add a number between 1 and 100
to the MOEPG lines, for which you want percentage loading,
in the zone files. The number is the chance that the obj/mob
will not load. So with a number of 100 it is only 1% chance
that the load will occur.

New format for the zone commands. (The load chance is not needed
if the obj/mob should always pop.)

M <if-flag> <mob vnum> <max existing> <room vnum> <load chance>

O <if-flag> <obj vnum> <max existing> <room vnum> <load chance>

G <if-flag> <obj vnum> <max existing> <load chance>

E <if-flag> <obj vnum> <max existing> <equipment position> <load chance>

P <if-flag> <obj vnum 1> <max existing> <obj vnum 2> <load chance>


-Johan
----------

diff -c src/db.c src2/db.c
*** src/db.c	Fri Jan 31 14:16:53 1997
--- src2/db.c	Fri Jan 31 14:22:30 1997
***************
*** 1190,1196 ****
  void load_zones(FILE * fl, char *zonename)
  {
    static int zone = 0;
!   int cmd_no = 0, num_of_cmds = 0, line_num = 0, tmp, error;
    char *ptr, buf[256], zname[256];
  
    strcpy(zname, zonename);
--- 1190,1196 ----
  void load_zones(FILE * fl, char *zonename)
  {
    static int zone = 0;
!   int cmd_no = 0, num_of_cmds = 0, line_num = 0, tmp, error, arg_num;
    char *ptr, buf[256], zname[256];
  
    strcpy(zname, zonename);
***************
*** 1244,1257 ****
        break;
      }
      error = 0;
!     if (strchr("MOEPD", ZCMD.command) == NULL) {	/* a 3-arg command */
!       if (sscanf(ptr, " %d %d %d ", &tmp, &ZCMD.arg1, &ZCMD.arg2) != 3)
! 	error = 1;
!     } else {
        if (sscanf(ptr, " %d %d %d %d ", &tmp, &ZCMD.arg1, &ZCMD.arg2,
! 		 &ZCMD.arg3) != 4)
! 	error = 1;
      }
  
      ZCMD.if_flag = tmp;
  
--- 1244,1277 ----
        break;
      }
      error = 0;
!     if (strchr("D", ZCMD.command) != NULL) { /* ### */
        if (sscanf(ptr, " %d %d %d %d ", &tmp, &ZCMD.arg1, &ZCMD.arg2,
!                  &ZCMD.arg3) != 4)
!         error = 1;
      }
+     else if (strchr("R", ZCMD.command) != NULL) { /* ### */
+       if (sscanf(ptr, " %d %d %d ", &tmp, &ZCMD.arg1,
+            &ZCMD.arg2) != 3)
+         error = 1;
+     }
+     else if (strchr("G", ZCMD.command) != NULL) { /* ### */
+       if ((arg_num = sscanf(ptr, " %d %d %d %d ", &tmp, &ZCMD.arg1,
+            &ZCMD.arg2, &ZCMD.arg3)) != 4) {
+         if (arg_num != 3)
+           error = 1;
+         else
+           ZCMD.arg3 = 0;
+       }
+     }
+     else { /* ### */
+       if ((arg_num = sscanf(ptr, " %d %d %d %d %d ", &tmp, &ZCMD.arg1,
+            &ZCMD.arg2, &ZCMD.arg3, &ZCMD.arg4)) != 5) {
+         if (arg_num != 4)
+           error = 1;
+         else
+           ZCMD.arg4 = 0;
+       }
+     }
  
      ZCMD.if_flag = tmp;
  
***************
*** 1558,1602 ****
  void reset_zone(int zone)
  {
    int cmd_no, last_cmd = 0;
    struct char_data *mob = NULL;
    struct obj_data *obj, *obj_to;
  
    for (cmd_no = 0; ZCMD.command != 'S'; cmd_no++) {
  
!     if (ZCMD.if_flag && !last_cmd)
        continue;
  
      switch (ZCMD.command) {
      case '*':			/* ignore command */
        last_cmd = 0;
        break;
  
!     case 'M':			/* read a mobile */
!       if (mob_index[ZCMD.arg1].number < ZCMD.arg2) {
  	mob = read_mobile(ZCMD.arg1, REAL);
  	char_to_room(mob, ZCMD.arg3);
  	last_cmd = 1;
        } else
  	last_cmd = 0;
        break;
  
!     case 'O':			/* read an object */
!       if (obj_index[ZCMD.arg1].number < ZCMD.arg2) {
  	if (ZCMD.arg3 >= 0) {
  	  obj = read_object(ZCMD.arg1, REAL);
  	  obj_to_room(obj, ZCMD.arg3);
  	  last_cmd = 1;
  	} else {
  	  obj = read_object(ZCMD.arg1, REAL);
  	  obj->in_room = NOWHERE;
  	  last_cmd = 1;
  	}
        } else
  	last_cmd = 0;
        break;
  
!     case 'P':			/* object to object */
!       if (obj_index[ZCMD.arg1].number < ZCMD.arg2) {
  	obj = read_object(ZCMD.arg1, REAL);
  	if (!(obj_to = get_obj_num(ZCMD.arg3))) {
  	  ZONE_ERROR("target obj not found");
--- 1578,1635 ----
  void reset_zone(int zone)
  {
    int cmd_no, last_cmd = 0;
+   int mob_load = FALSE; /* ### */
+   int obj_load = FALSE; /* ### */
    struct char_data *mob = NULL;
    struct obj_data *obj, *obj_to;
  
    for (cmd_no = 0; ZCMD.command != 'S'; cmd_no++) {
  
!     if (ZCMD.if_flag && !last_cmd && !mob_load && !obj_load)
        continue;
  
+     if (!ZCMD.if_flag) { /* ### */
+       mob_load = FALSE;
+       obj_load = FALSE;
+     }
+ 
      switch (ZCMD.command) {
      case '*':			/* ignore command */
        last_cmd = 0;
        break;
  
!     case 'M':			/* read a mobile ### */
!       if ((mob_index[ZCMD.arg1].number < ZCMD.arg2) &&
!           (number(1, 100) >= ZCMD.arg4)) {
  	mob = read_mobile(ZCMD.arg1, REAL);
  	char_to_room(mob, ZCMD.arg3);
  	last_cmd = 1;
+         mob_load = TRUE;
        } else
  	last_cmd = 0;
        break;
  
!     case 'O':			/* read an object ### */
!       if ((obj_index[ZCMD.arg1].number < ZCMD.arg2) &&
!           (number(1, 100) >= ZCMD.arg4)) {
  	if (ZCMD.arg3 >= 0) {
  	  obj = read_object(ZCMD.arg1, REAL);
  	  obj_to_room(obj, ZCMD.arg3);
  	  last_cmd = 1;
+           obj_load = TRUE;
  	} else {
  	  obj = read_object(ZCMD.arg1, REAL);
  	  obj->in_room = NOWHERE;
  	  last_cmd = 1;
+           obj_load = TRUE;
  	}
        } else
  	last_cmd = 0;
        break;
  
!     case 'P':			/* object to object ### */
!       if ((obj_index[ZCMD.arg1].number < ZCMD.arg2) &&
!           obj_load && (number(1, 100) >= ZCMD.arg4)) {
  	obj = read_object(ZCMD.arg1, REAL);
  	if (!(obj_to = get_obj_num(ZCMD.arg3))) {
  	  ZONE_ERROR("target obj not found");
***************
*** 1608,1619 ****
  	last_cmd = 0;
        break;
  
!     case 'G':			/* obj_to_char */
        if (!mob) {
  	ZONE_ERROR("attempt to give obj to non-existant mob");
  	break;
        }
!       if (obj_index[ZCMD.arg1].number < ZCMD.arg2) {
  	obj = read_object(ZCMD.arg1, REAL);
  	obj_to_char(obj, mob);
  	last_cmd = 1;
--- 1641,1653 ----
  	last_cmd = 0;
        break;
  
!     case 'G':			/* obj_to_char ### */
        if (!mob) {
  	ZONE_ERROR("attempt to give obj to non-existant mob");
  	break;
        }
!       if ((obj_index[ZCMD.arg1].number < ZCMD.arg2) &&
!           mob_load && (number(1, 100) >= ZCMD.arg3)) {
  	obj = read_object(ZCMD.arg1, REAL);
  	obj_to_char(obj, mob);
  	last_cmd = 1;
***************
*** 1621,1632 ****
  	last_cmd = 0;
        break;
  
!     case 'E':			/* object to equipment list */
        if (!mob) {
  	ZONE_ERROR("trying to equip non-existant mob");
  	break;
        }
!       if (obj_index[ZCMD.arg1].number < ZCMD.arg2) {
  	if (ZCMD.arg3 < 0 || ZCMD.arg3 >= NUM_WEARS) {
  	  ZONE_ERROR("invalid equipment pos number");
  	} else {
--- 1655,1667 ----
  	last_cmd = 0;
        break;
  
!     case 'E':			/* object to equipment list ### */
        if (!mob) {
  	ZONE_ERROR("trying to equip non-existant mob");
  	break;
        }
!       if ((obj_index[ZCMD.arg1].number < ZCMD.arg2) &&
!           mob_load && (number(1, 100) >= ZCMD.arg4)) {
  	if (ZCMD.arg3 < 0 || ZCMD.arg3 >= NUM_WEARS) {
  	  ZONE_ERROR("invalid equipment pos number");
  	} else {
Only in src: db.c.orig
diff -c src/db.h src2/db.h
*** src/db.h	Fri Jan 31 14:17:09 1997
--- src2/db.h	Fri Jan 31 10:03:16 1997
***************
*** 90,95 ****
--- 90,96 ----
     bool if_flag;	/* if TRUE: exe only if preceding exe'd */
     int	arg1;		/*                                      */
     int	arg2;		/* Arguments to the command             */
+    int	arg3;		/*                                      */
     int  arg4;
     int line;		/* line number this command appears on  */
  
+-----------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
|   http://cspo.queensu.ca/~fletcher/Circle/list_faq.html   |
+-----------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/18/00 PST