/* *Snippet Purpose: swimming skill *Release Version: 1.0 *Snippet Coder: Icechild *Coder E-mail address: liquidice@usa.net *Codebase Designed for: ROM2.4b6 *Date of Publication: March 02, 2001 * *This is my fairly simple, but quite useful swimming skill for all those whom have been asking *for something like it. * *It uses an UNDERWATER room for when the player drowns, this room can be recallable or not, depending *on your preference. If you want to add a new dimension to it, I recommend getting the SECT_UNDERWATER *snippet, or designing one on your own like I did. That way people shouldn't stay in this room for *very long :) I've created the room in Limbo, since well, a lot of OBJ's are used in that area, but *no one ever seems to utilize the rooms :) And I was sure everyone would have this area (unless you've *moved everything to another area, which I wouldn't see the point of) * *If you have any questions/concerns/ideas for this code, just write me an e-mail, I'll see if I can't *figure out some more things to do with this :) * *If you wanna use this code, feel free, the only thing I'd like is a little entry in HELP SWIMMING stating *you used my code (IE: Origional Swimming Code Design by: IceChild (liquidice@usa.net)). * *I, like most snippet providers, take no responcibility for your actions as a coder. This code compiled *fine into my mud, and I'm sure it'll work in yours. But if it messes up your code, I'm sorry, but there *is nothing I can, nor will, do. Make sure you ALWAYS backup your code before you even attempt to add *anything to your codebase. If you dont, your only hurting yourself. * *Please note that this code, while tested, is not overly tested. I code mainly because I enjoy it, not *because I'm some coder on a popular mud, or anything like that. So my ability to test it is only limited *to the resources I have available. But hey, It shouldn't be that bad :) * *CHANGES: *From 0.5 to 1.0: * Fixed a rather nasty bug where the mud would crash if someone was in a note editor, due to the * floating piece in update.c Shouldn't have that problem anymore. * */ /* Incase you didn't read it before, BACK UP YOUR CODE! NOW! */ /* CONST.C */ // In the skill_table, add: { "swimming", {1, 1, 1, 1}, {2, 2, 2, 2}, spell_null, TAR_IGNORE, POS_STANDING, &gsn_swimming, SLOT( 0), 0, 12, "", "!Swimming!", "" }, /* MERC.H */ // With the rest of the gsn_'s, add: extern sh_int gsn_swimming; // With the rest of the ROOM_VNUM_ defines add: /*This is the room we'll send them to when they drown :) */ #define ROOM_VNUM_UNDERWATER 3 /* DB.C */ // With the rest of the gsn_'s, add: sh_int gsn_swimming; /* ACT_MOVE.C */ // Function: move_char // Just before the SECT_WATER_NOSWIM portion, add this: /* Uncomment this if you have mounts if ( (in_room->sector_type == SECT_WATER_SWIM || to_room->sector_type == SECT_WATER_SWIM ) && MOUNTED(ch)) { sprintf( buf,"You can't take your mount there.\n\r"); send_to_char(buf, ch); return; } */ if(( in_room->sector_type == SECT_WATER_SWIM || to_room->sector_type == SECT_WATER_SWIM ) && !IS_AFFECTED(ch, AFF_SWIM) && !IS_AFFECTED(ch,AFF_FLYING)) { OBJ_DATA *obj; bool has_boat; int chance; /* * Look for a boat. */ has_boat = FALSE; if (IS_IMMORTAL(ch)) has_boat = TRUE; for ( obj = ch->carrying; obj != NULL; obj = obj->next_content ) { if ( obj->item_type == ITEM_BOAT ) { has_boat = TRUE; break; } } if ( !has_boat ) { if(!IS_NPC(ch) && ch->level < skill_table[gsn_swimming].skill_level[ch->class]) { send_to_char("You need to learn to swim first",ch); return; } if((chance = get_skill(ch,gsn_swimming)) == 0) { send_to_char("You dont know how to swim.\n\r",ch); return; } if(IS_SET(ch->vuln_flags, VULN_DROWNING)) chance /= 2; chance -= ((ch->max_move / ch->move) / 2); /* how rested is the swimmer? */ chance -= (get_carry_weight(ch) / 10); /* how heavy is the swimmer? */ if(ch->race == race_lookup("dwarf")) /* dwarf's can't swim. */ { chance = 0; } if(number_percent() < chance) { check_improve(ch,gsn_swimming,TRUE, 5); } else { check_improve(ch,gsn_swimming,FALSE, 5); send_to_char("You drown.\n\r",ch); char_from_room(ch); char_to_room(ch, get_room_index(ROOM_VNUM_UNDERWATER)); do_look(ch,"auto"); if (ch->pet != NULL) { char_from_room( ch->pet ); char_to_room( ch->pet, ch->in_room ); do_look(ch->pet,"auto"); } /* Again, uncomment if your using mount code if (ch->mount != NULL) { char_from_room(ch->mount); char_to_room( ch->mount, ch->in_room ); do_look(ch->mount,"auto"); } */ return; } } } /* UPDATE.C */ // Function: char_update // Any logical place you want add this: /* How long can you float :) */ if(ch->desc && ch->desc->connected == CON_PLAYING) if(!IS_NPC(ch)) { if( ch->in_room && (ch->in_room->sector_type == SECT_WATER_SWIM && !IS_AFFECTED(ch,AFF_FLYING))) { OBJ_DATA *obj; bool has_boat; int chance; /* * Look for a boat. */ has_boat = FALSE; if (IS_IMMORTAL(ch)) has_boat = TRUE; for ( obj = ch->carrying; obj != NULL; obj = obj->next_content ) { if ( obj->item_type == ITEM_BOAT ) { has_boat = TRUE; break; } } if ( !has_boat ) { if(!IS_NPC(ch) && ch->level < skill_table[gsn_swimming].skill_level[ch->class]) { send_to_char("You shouldn't be here, report this to an IMM.\n\r",ch); return; } if((chance = get_skill(ch,gsn_swimming)) == 0) { send_to_char("You shouldn't be here, report this to an IMM.\n\r",ch); return; } if(IS_SET(ch->vuln_flags, VULN_DROWNING)) chance /= 2; /*chance -= ((ch->max_move / ch->move) / 2); commented cause you can float easily */ /*chance -= (get_carry_weight(ch) / 10); again, floating is easier*/ if(ch->race == race_lookup("dwarf")) /* dwarf's can't float. */ { chance = 0; } if(number_percent() < chance) { check_improve(ch,gsn_swimming,TRUE, 5); } else { check_improve(ch,gsn_swimming,FALSE, 5); send_to_char("You drown.\n\r",ch); char_from_room(ch); char_to_room(ch, get_room_index(ROOM_VNUM_UNDERWATER)); do_look(ch,"auto"); if (ch->pet != NULL) { char_from_room( ch->pet ); char_to_room( ch->pet, ch->in_room ); do_look(ch->pet,"auto"); } if (ch->mount != NULL) { char_from_room(ch->mount); char_to_room( ch->mount, ch->in_room ); do_look(ch->mount,"auto"); } return; } } } } /* CONGRADULATIONS! Do a clean compile, and you should be set to go. */