Moving corpse on death

  • Halenbane
  • Topic Author
  • Offline
  • Elite Member
  • Elite Member
More
8 years 11 months ago #37 by Halenbane
Moving corpse on death was created by Halenbane
Has anyone ever experimented with moving a player's corpse after they die? Basically what I'm thinking is when someone dies, if they have a certain item on them, it teleports their corpse to a pre-determined room so they don't have to go back to where they died to retrieve it.

Example:

In your inventory you have item: A retrieval stone

You die out in the woods somewhere from a vicious bunny attack.

Your corpse is then teleported to Midgaard Temple.

Please Log in or Create an account to join the conversation.

  • Vatiken
  • Vatiken's Avatar
  • Offline
  • Administrator
  • Administrator
  • tbaMUD Programmer
More
8 years 11 months ago #40 by Vatiken
Replied by Vatiken on topic Re: Moving corpse on death
The make_corpse() function creates the corpse object and places all the equipment and gold in the corpse. It wouldn't be too difficult place a flag within the function which goes TRUE if a certain item happens to be in the corpse. Then instead of doing an obj_to_room(corpse, IN_ROOM(ch)), you'd put the object in the room of your choosing.

tbaMUD developer/programmer

Please Log in or Create an account to join the conversation.

  • Halenbane
  • Topic Author
  • Offline
  • Elite Member
  • Elite Member
More
8 years 11 months ago #41 by Halenbane
Replied by Halenbane on topic Re: Moving corpse on death
what would be the best way to write the obj_to_room to point it to a room

Please Log in or Create an account to join the conversation.

  • Vatiken
  • Vatiken's Avatar
  • Offline
  • Administrator
  • Administrator
  • tbaMUD Programmer
More
8 years 11 months ago #44 by Vatiken
Replied by Vatiken on topic Re: Moving corpse on death
Trace the mortal_start_room code in interpreter.c to see how we place a character in a room with a specific VNUM.

tbaMUD developer/programmer

Please Log in or Create an account to join the conversation.

  • Halenbane
  • Topic Author
  • Offline
  • Elite Member
  • Elite Member
More
8 years 11 months ago #45 by Halenbane
Replied by Halenbane on topic Re: Moving corpse on death
Many thanks Vat

Please Log in or Create an account to join the conversation.

  • Halenbane
  • Topic Author
  • Offline
  • Elite Member
  • Elite Member
More
8 years 11 months ago #47 by Halenbane
Replied by Halenbane on topic Re: Moving corpse on death
I see and understand how that is determining a players starting location, but still unclear on how to do this with a corpse. The players start room will stay the same.

Or even on another note, I think it would be a nice feature to maybe make it so players still lose exp etc when they die, but they remain geared. Then again this may get funny with how objects are saved to the char, not sure..

Please Log in or Create an account to join the conversation.

  • Vatiken
  • Vatiken's Avatar
  • Offline
  • Administrator
  • Administrator
  • tbaMUD Programmer
More
8 years 11 months ago #48 by Vatiken
Replied by Vatiken on topic Re: Moving corpse on death
I had a whole big post written explaining everything in detail then I accidentally hit Ctrl+DESTROY-EVERYTHING, and so much for that.

Basically, you supply a vnum through cedit for a start room, 3001 I believe. In db.c there is a function called real_room() used to turn that VIRTUAL NUMBER(vnum) into a REAL_NUMBER(rnum). Your make_corpse() function uses an rnum(REAL NUMBER) to place the corpse in:
obj_to_room(OBJECT, REAL_NUMBER);

So, all you should need to do is supply a VNUM, turn it into an RNUM, and use obj_to_room() to place the corpse in that room.

tbaMUD developer/programmer

Please Log in or Create an account to join the conversation.

  • Halenbane
  • Topic Author
  • Offline
  • Elite Member
  • Elite Member
More
8 years 11 months ago #53 by Halenbane
Replied by Halenbane on topic Re: Moving corpse on death
Ok so basically I have taken the last few hours digging around to add this in. I have added it to cedit and other areas. I am not sure where I'm missing my define, so I will post what changes I have made, and then my error. Maybe you can make some sense of it. It's probably something I'm simply overlooking.

First the Error

fight.c:316: warning: implicit declaration of function 'MORTAL_CORPSE_ROOM'

Line 316 - obj_to_room(corpse, MORTAL_CORPSE_ROOM(ch));

Code Below

In db.c

room_rnum r_mortal_start_room; /* rnum of mortal start room */
room_rnum r_immort_start_room; /* rnum of immort start room */
room_rnum r_frozen_start_room; /* rnum of frozen start room */
+room_rnum r_mortal_corpse_room; /* rnum of mortal corpse room */


static void check_start_rooms(void)
{
if ((r_mortal_start_room = real_room(CONFIG_MORTAL_START)) == NOWHERE) {
log("SYSERR: Mortal start room does not exist. Change in config.c.");
exit(1);
}
if ((r_immort_start_room = real_room(CONFIG_IMMORTAL_START)) == NOWHERE) {
if (!mini_mud)
log("SYSERR: Warning: Immort start room does not exist. Change in config.c.");
r_immort_start_room = r_mortal_start_room;
}
if ((r_frozen_start_room = real_room(CONFIG_FROZEN_START)) == NOWHERE) {
if (!mini_mud)
log("SYSERR: Warning: Frozen start room does not exist. Change in config.c.");
r_frozen_start_room = r_mortal_start_room;
}
+ if ((r_mortal_corpse_room = real_room(CONFIG_MORTAL_CORPSE)) == NOWHERE) {
+ if (!mini_mud)
+ log("SYSERR: Mortal corpse room does not exist. Change in config.c.");
+ r_mortal_corpse_room = r_mortal_start_room;
+ }
+}






/* Room numbers. */
CONFIG_MORTAL_START = mortal_start_room;
CONFIG_IMMORTAL_START = immort_start_room;
CONFIG_FROZEN_START = frozen_start_room;
+ CONFIG_MORTAL_CORPSE = mortal_corpse_room;

CONFIG_DON_ROOM_1 = donation_room_1;
CONFIG_DON_ROOM_2 = donation_room_2;
CONFIG_DON_ROOM_3 = donation_room_3;


strncpy(buf, "Reading menu in load_config()", sizeof(buf));
CONFIG_MENU = fread_string(fl, buf);
parse_at(CONFIG_MENU);
} else if (!str_cmp(tag, "min_rent_cost"))
CONFIG_MIN_RENT_COST = num;
else if (!str_cmp(tag, "min_wizlist_lev"))
CONFIG_MIN_WIZLIST_LEV = num;
else if (!str_cmp(tag, "mortal_start_room"))
CONFIG_MORTAL_START = num;
+ else if (!str_cmp(tag, "mortal_corpse_room"))
+ CONFIG_MORTAL_CORPSE = num;
else if (!str_cmp(tag, "map_option"))
CONFIG_MAP = num;
else if (!str_cmp(tag, "medit_advanced_stats"))
CONFIG_MEDIT_ADVANCED = num;
break;


IN CEDIT.C


/* Room Numbers */
OLC_CONFIG(d)->room_nums.mortal_start_room = CONFIG_MORTAL_START;
OLC_CONFIG(d)->room_nums.immort_start_room = CONFIG_IMMORTAL_START;
OLC_CONFIG(d)->room_nums.frozen_start_room = CONFIG_FROZEN_START;
+ OLC_CONFIG(d)->room_nums.mortal_corpse_room = CONFIG_MORTAL_CORPSE;
OLC_CONFIG(d)->room_nums.donation_room_1 = CONFIG_DON_ROOM_1;
OLC_CONFIG(d)->room_nums.donation_room_2 = CONFIG_DON_ROOM_2;
OLC_CONFIG(d)->room_nums.donation_room_3 = CONFIG_DON_ROOM_3;



/* Room Numbers */
CONFIG_MORTAL_START = OLC_CONFIG(d)->room_nums.mortal_start_room;
CONFIG_IMMORTAL_START = OLC_CONFIG(d)->room_nums.immort_start_room;
CONFIG_FROZEN_START = OLC_CONFIG(d)->room_nums.frozen_start_room;
+ CONFIG_MORTAL_CORPSE = OLC_CONFIG(d)->room_nums.mortal_corpse_room;
CONFIG_DON_ROOM_1 = OLC_CONFIG(d)->room_nums.donation_room_1;
CONFIG_DON_ROOM_2 = OLC_CONFIG(d)->room_nums.donation_room_2;
CONFIG_DON_ROOM_3 = OLC_CONFIG(d)->room_nums.donation_room_3;



fprintf(fl, "* The virtual number of the room that frozen people should enter at.\n"
"frozen_start_room = %d\n\n", CONFIG_FROZEN_START);

+ fprintf(fl, "* The virtual number of the room that corpses of dead players go to.\n"
+ "mortal_corpse_room = %d\n\n", CONFIG_MORTAL_CORPSE);

fprintf(fl, "* The virtual numbers of the donation rooms. Note: Add donation rooms\n"
"* sequentially (1 & 2 before 3). If you don't, you might not be able to\n"
"* donate. Use -1 for 'no such room'.\n"

"Enter your choice : ",
grn, nrm, cyn, OLC_CONFIG(d)->room_nums.mortal_start_room,
grn, nrm, cyn, OLC_CONFIG(d)->room_nums.immort_start_room,
grn, nrm, cyn, OLC_CONFIG(d)->room_nums.frozen_start_room,
+ grn, nrm, cyn, OLC_CONFIG(d)->room_nums.mortal_corpse_room,
grn, nrm, cyn, OLC_CONFIG(d)->room_nums.donation_room_1,


case 'c':
case 'C':
write_to_output(d, "Enter the room's vnum where frozen people should load into : ");
OLC_MODE(d) = CEDIT_FROZEN_START_ROOM;
return;

+ case 'd':
+ case 'D':
+ write_to_output(d, "Enter the room's vnum where mortal corpses shoul load into : ");
+ OLC_MODE(d) = CEDIT_MORTAL_CORPSE_ROOM;
+ return;




"Enter the room's vnum where frozen people should load into : ");
} else {
OLC_CONFIG(d)->room_nums.frozen_start_room = atoi(arg);
cedit_disp_room_numbers(d);
}
break;

+ case CEDIT_MORTAL_CORPSE_ROOM:
+ if (!*arg) {
+ write_to_output(d,
+ "That is an invalid choice!\r\n"
+ "Enter the room's vnum where mortal corpses should load into : ");
+ } else {
+ OLC_CONFIG(d)->room_nums.mortal_corpse_room = atoi(arg);
+ cedit_disp_room_numbers(d);
+ }
+ break;


IN CONFIG.C

/* Virtual number of room that frozen players should enter at. */
room_vnum frozen_start_room = 1202;

+/* Virtual number of room that player corpse should load into */
+room_vnum mortal_corpse_room = 3085;


IN UTILS.H

/* Room Numbers */
/** Get the mortal start room. */
#define CONFIG_MORTAL_START config_info.room_nums.mortal_start_room
/** Get the immortal start room. */
#define CONFIG_IMMORTAL_START config_info.room_nums.immort_start_room
/** Get the frozen character start room. */
#define CONFIG_FROZEN_START config_info.room_nums.frozen_start_room
/** Get the mortal corpse room. */
+#define CONFIG_MORTAL_CORPSE config_info.room_nums.mortal_corpse_room
+/** Get the 1st donation room. */
#define CONFIG_DON_ROOM_1 config_info.room_nums.donation_room_1
/** Get the second donation room. */


IN STRUCTS.H

struct room_numbers
{
room_vnum mortal_start_room; /**< vnum of room that mortals enter at. */
room_vnum immort_start_room; /**< vnum of room that immorts enter at. */
room_vnum frozen_start_room; /**< vnum of room that frozen ppl enter. */
+ room_vnum mortal_corpse_room; /** < vnum of room that corpse is placed. */
room_vnum donation_room_1; /**< vnum of donation room #1. */
room_vnum donation_room_2; /**< vnum of donation room #2. */
room_vnum donation_room_3; /**< vnum of donation room #3. */
};


IN OASIS.H

#define CEDIT_MORTAL_START_ROOM 40
#define CEDIT_IMMORT_START_ROOM 41
#define CEDIT_FROZEN_START_ROOM 42
+#define CEDIT_MORTAL_CORPSE_ROOM 43
#define CEDIT_DONATION_ROOM_1 44

**Be sure to remember to fix the numbers**


IN DB.H

/* Mud configurable variables */
extern int no_mail;
extern int mini_mud;
extern int no_rent_check;
extern time_t boot_time;
extern int circle_restrict;
extern room_rnum r_mortal_start_room;
extern room_rnum r_immort_start_room;
extern room_rnum r_frozen_start_room;
+extern room_rnum r_mortal_corpse_room;


IN CONFIG.H

/* Room Numbers */
extern room_vnum mortal_start_room;
extern room_vnum immort_start_room;
extern room_vnum frozen_start_room;
+extern room_vnum mortal_corpse_room;
extern room_vnum donation_room_1;


IN GENWLD.C

/* Update the loadroom table. Adds 1 or 0. */
r_mortal_start_room += (r_mortal_start_room >= found);
r_immort_start_room += (r_immort_start_room >= found);
r_frozen_start_room += (r_frozen_start_room >= found);
+ r_mortal_corpse_room += (r_mortal_corpse_room >= found);



if (r_frozen_start_room == rnum) {
log("WARNING: GenOLC: delete_room: Deleting frozen start room!");
r_frozen_start_room = 0; /* The Void */
}
+ if (r_mortal_corpse_room == rnum) {
+ log("WARNING: GenOLC: delete_room: Deleting mortal corpse room!");
+ r_mortal_corpse_room = 0; /* The Void */
+ }

Please Log in or Create an account to join the conversation.

  • Vatiken
  • Vatiken's Avatar
  • Offline
  • Administrator
  • Administrator
  • tbaMUD Programmer
More
8 years 11 months ago #55 by Vatiken
Replied by Vatiken on topic Re: Moving corpse on death
From the look of your code, what you should have is:
obj_to_room(obj, r_mortal_corpse_room);
Everything else looks pretty good, although I think you may of done more work then you needed to. My previous message was my attempt to try and explain the difference between RNUM and VNUM (I was confused about this system way back when), and how to use the system to get the result you need.

Something like this in fight.c probably would of sufficed:
#define CORPSE_ROOM 1111 /* Corpse Room VNUM */
...

void make_corpse() {
...

room_rnum corpse_room;
...

if ((corpse_room = real_room(CORPSE_ROOM)) != NOWHERE)
  obj_to_room(obj, corpse_room); /* Our corpse room exists, place the corpse there */
else
  obj_to_room(obj, IN_ROOM(ch)); /* Hmmm... missing the corpse room, just place the corpse where we died. */

That said, the way you went about it does have the added benefit of being able to be adjusted in-game if necessary without re-compiling the MUD.

tbaMUD developer/programmer

Please Log in or Create an account to join the conversation.

  • Halenbane
  • Topic Author
  • Offline
  • Elite Member
  • Elite Member
More
8 years 11 months ago #57 by Halenbane
Replied by Halenbane on topic Re: Moving corpse on death
Yeah, I figured if I was going to have the option I wanted it in cedit. I edited fight.c changing the line to:

obj_to_room(corpse, r_mortal_corpse_room);

It now works fine. No problems , clean compile. Tested and I see no issues.

I'll put it up for others to use if any may find use of it. Thanks for the direction :D

Please Log in or Create an account to join the conversation.

  • Halenbane
  • Topic Author
  • Offline
  • Elite Member
  • Elite Member
More
8 years 11 months ago #67 by Halenbane
Replied by Halenbane on topic Re: Moving corpse on death
I didn't notice this before, but it seems that npc corpse also go to the mortal_corpse_room.

Any ideas?

Please Log in or Create an account to join the conversation.

  • Halenbane
  • Topic Author
  • Offline
  • Elite Member
  • Elite Member
More
8 years 11 months ago #69 by Halenbane
Replied by Halenbane on topic Re: Moving corpse on death
After looking at it for a second I found it was easier than I thought to fix this.

Forgot an if statement to differ the two

in fight.c

ch->carrying = NULL;
IS_CARRYING_N(ch) = 0;
IS_CARRYING_W(ch) = 0;
+if (IS_NPC(ch))
+ obj_to_room(corpse, IN_ROOM(ch));
+else
obj_to_room(corpse, r_mortal_corpse_room);
}

I'll update my snippet accordingly

Please Log in or Create an account to join the conversation.

Time to create page: 0.118 seconds