>Yes, Im interested to see how you did this differently from my original >Vehicles code. Hi Chris, Hope this is all the code needed to get this running. (see attachments). Good luck. Scott Warren dswarren@bellsouth.net --8<-- /* Dec 96 by DSW aka Calain for Reimsmud (now defunct) File: act.drive.c This file is for do_drive and do_sail routines. Probably get around to using tents and any enterable objects here. OBJ_VAL location 0 holds the VNUM of the room that is the 'inside' of the object. That room must be flagged ROOM_LEAVE in order to leave the object from that room. Otherwise, for example if you want two teleporters, you could have a second ENTERABLE object that points to the room where the first object is located. */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* include every dang thang */ #include "conf.h" #include "sysdep.h" #include "structs.h" #include "utils.h" #include "comm.h" #include "interpreter.h" #include "handler.h" #include "db.h" #include "spells.h" extern struct room_data *world; extern int top_of_world; extern char *dirs[]; const int rev_dir[]; extern struct obj_data *object_list; void die_follower(struct char_data *ch); int real_room(int vnum); void enter_an_object(struct char_data *ch, struct obj_data *obj) { int new_room; /* make it easy - no following or mounts into objects. */ /* looks funny but 'die_follower' does the necessary stuff */ new_room = real_room(GET_OBJ_VAL(obj, 0)); if(new_room <= 0 || new_room > top_of_world) { log("Error: Trying to enter a poorly designed object!"); send_to_char("This object is bad. Please inform the mud staff\r\n", ch); return; } die_follower(ch); sprintf(buf, "$n enters %s.", obj->short_description); act(buf, TRUE, ch, 0, 0, TO_ROOM); sprintf(buf,"You enter %s.\r\n", obj->short_description); send_to_char(buf, ch); char_from_room(ch); char_to_room(ch, new_room); if(ch->desc != NULL) look_at_room(ch, 0); sprintf(buf, "$n has entered %s.", obj->short_description); act(buf, TRUE, ch, 0, 0, TO_ROOM); /* when you enter go ahead and set the object associated with that room to the object we have */ if(world[ch->in_room].entrance == NULL) world[ch->in_room].entrance = obj; return; } void leave_an_object(struct char_data *ch) { struct obj_data *obj; /* find the object associated with this leave room */ obj = world[ch->in_room].entrance; /* ick, have to search all objects */ if(obj == NULL) { obj = object_list; while(obj) { if(GET_OBJ_TYPE(obj) == ITEM_SAILBOAT || GET_OBJ_TYPE(obj) == ITEM_ENTERABLE || GET_OBJ_TYPE(obj) == ITEM_CAR) if(GET_OBJ_VAL(obj, 0) == world[ch->in_room].number) break; obj = obj->next; } /* fix this room */ world[ch->in_room].entrance = obj; } if(obj == NULL) { /* big problem - happens when someone puts a car in their pocket ;) */ log("SYSERR: Room flagged ROOM_LEAVE with no associated object."); return; } if(obj->in_room <= 0 || obj->in_room > top_of_world) { log("Error: Trying to leave but the object heading toward is not in a room"); send_to_char("The exit is blocked!\r\n", ch); return; } /* make it easy - no following or mounts into objects. */ /* looks funny but 'die_follower' does the necessary stuff */ die_follower(ch); sprintf(buf, "$n leaves %s.", obj->short_description); act(buf, TRUE, ch, 0, 0, TO_ROOM); sprintf(buf, "You leave %s.\r\n", obj->short_description); send_to_char(buf, ch); /* undo pilot flag */ if(IS_SET(PLR_FLAGS(ch), PLR_PILOT)) TOGGLE_BIT(PLR_FLAGS(ch), PLR_PILOT); char_from_room(ch); char_to_room(ch, obj->in_room); if(ch->desc != NULL) look_at_room(ch, 0); sprintf(buf, "$n has arrived from %s.", obj->short_description); act(buf, TRUE, ch, 0, 0, TO_ROOM); return; } void do_look_out(struct char_data *ch) { struct obj_data *obj; int temp_room; if(!ROOM_FLAGGED(ch->in_room, ROOM_LEAVE)) { send_to_char("Can't do that here.\r\n", ch); return; } obj = world[ch->in_room].entrance; if(obj == NULL) { obj = object_list; while(obj) { if(GET_OBJ_TYPE(obj) == ITEM_SAILBOAT || GET_OBJ_TYPE(obj) == ITEM_ENTERABLE || GET_OBJ_TYPE(obj) == ITEM_CAR) if(GET_OBJ_VAL(obj, 0) == world[ch->in_room].number) break; obj = obj->next; } /* fix this room */ world[ch->in_room].entrance = obj; } if(obj == NULL) /* can't do anything about this */ {send_to_char("Error: bad room/object combo.\r\n", ch); return; } temp_room = ch->in_room; ch->in_room = obj->in_room; if(ch->desc) look_at_room(ch, 0); ch->in_room = temp_room; return; } ACMD(do_sail) { int door, new_room; struct obj_data *tempobj; struct char_data *temp; one_argument(argument, arg); if(GET_SKILL(ch, SKILL_SAIL) == 0) { send_to_char("You have no idea how to do that.\r\n", ch); return; } if(!ROOM_FLAGGED(ch->in_room, ROOM_HELM)) { send_to_char("You must sit at the helm to navigate.\r\n", ch); return; } if(!*arg) { for(temp = world[ch->in_room].people; temp; temp= temp->next_in_room) if(temp && ch != temp && IS_SET(PLR_FLAGS(temp), PLR_PILOT)) {send_to_char("Someone is already in piloting this ship!\r\n", ch); return; } if(!IS_SET(PLR_FLAGS(ch), PLR_PILOT)) { TOGGLE_BIT(PLR_FLAGS(ch), PLR_PILOT); send_to_char("The helm is yours.\r\n", ch); act("$n takes the helm.",TRUE, ch, 0,0, TO_ROOM );} else { TOGGLE_BIT(PLR_FLAGS(ch), PLR_PILOT); send_to_char("You relenquish the helm.\r\n", ch); act("$n relenquishes the helm.", TRUE, ch, 0, 0, TO_ROOM); } return; } if((door = search_block(arg, dirs, FALSE)) == -1) {send_to_char("Which direction?\r\n", ch); return;} /* assuming that this room is the ROOM_LEAVE room. Need to change this sometime. */ tempobj = world[ch->in_room].entrance; if(tempobj == NULL) { tempobj = object_list; while(tempobj) { if(GET_OBJ_TYPE(tempobj) == ITEM_SAILBOAT || GET_OBJ_TYPE(tempobj) == ITEM_ENTERABLE || GET_OBJ_TYPE(tempobj) == ITEM_CAR) if(GET_OBJ_VAL(tempobj, 0) == world[ch->in_room].number) break; tempobj = tempobj->next; } /* fix this room */ world[ch->in_room].entrance = tempobj; } if(tempobj == NULL) { send_to_char("Error: Object associated with this room is missing!\r\n", ch); return; } if(!EXIT(tempobj, door)) {send_to_char("Can't go that way.\r\n", ch); return;} if((SECT(EXIT(tempobj, door)->to_room) != SECT_WATER_NOSWIM) || (SECT(EXIT(tempobj, door)->to_room) != SECT_WATER_SWIM) || (SECT(EXIT(tempobj, door)->to_room) != SECT_PIER)) { send_to_char("Can't sail into that!\r\n", ch); return; } else { sprintf(buf, "%s sails %s.\r\n", tempobj->short_description, dirs[door]); send_to_room(buf, tempobj->in_room); obj_from_room(tempobj); new_room = EXIT(tempobj, door)->to_room; obj_to_room(tempobj, new_room); /* this is a hack - should put another version of look_at_room here */ new_room = ch->in_room; ch->in_room = tempobj->in_room; look_at_room(ch, 0); ch->in_room = new_room; } /* might want to put in a message to everyone on board the ship */ return; } ACMD(do_drive) { int door, new_room; struct obj_data *tempobj; struct char_data *temp; one_argument(argument, arg); if(GET_SKILL(ch, SKILL_DRIVE) == 0) { send_to_char("You have no idea how to do that.\r\n", ch); return; } if(!ROOM_FLAGGED(ch->in_room, ROOM_HELM)) { send_to_char("There is no driver's seat.\r\n", ch); return; } if(!*arg) { for(temp = world[ch->in_room].people; temp; temp= temp->next_in_room) { if(temp && ch != temp && IS_SET(PLR_FLAGS(temp), PLR_PILOT)) { send_to_char("Someone is already in charge!\r\n", ch); return; } } if(!IS_SET(PLR_FLAGS(ch), PLR_PILOT)) { TOGGLE_BIT(PLR_FLAGS(ch), PLR_PILOT); send_to_char("The wheel is in your hands.\r\n", ch); act("$n takes the wheel.",TRUE, ch, 0,0, TO_ROOM ); } else { TOGGLE_BIT(PLR_FLAGS(ch),PLR_PILOT); send_to_char("You relenquish the driver's seat.\r\n", ch); act("$n relenquishes the driver's seat.", TRUE, ch, 0, 0, TO_ROOM); } return; } if((door = search_block(arg, dirs, FALSE)) == -1) {send_to_char("Which direction?\r\n", ch); return;} if(!IS_SET(PLR_FLAGS(ch), PLR_PILOT)) return; /* assuming that the leave room is the same room as the pilot room. have to change this sometime. */ tempobj = world[ch->in_room].entrance; if(tempobj == NULL) { tempobj = object_list; while(tempobj) { if(GET_OBJ_TYPE(tempobj) == ITEM_SAILBOAT || GET_OBJ_TYPE(tempobj) == ITEM_ENTERABLE || GET_OBJ_TYPE(tempobj) == ITEM_CAR) if(GET_OBJ_VAL(tempobj, 0) == world[ch->in_room].number) break; tempobj = tempobj->next; } /* fix this room */ world[ch->in_room].entrance = tempobj; } if(tempobj == NULL) /* can't do anything about this */ { send_to_char("Bad object! Notify imms!\r\n", ch); return; } if(!EXIT(tempobj, door)) {send_to_char("Can't go that way.\r\n", ch); return;} if((SECT(EXIT(tempobj, door)->to_room) == SECT_WATER_NOSWIM) || (SECT(EXIT(tempobj, door)->to_room) == SECT_WATER_SWIM) || (SECT(EXIT(tempobj, door)->to_room) == SECT_MOUNTAIN)) { send_to_char("Can't drive into that!\r\n", ch); return; } else { sprintf(buf, "%s rolls %s.\r\n", tempobj->short_description, dirs[door]); send_to_room(buf, tempobj->in_room); new_room = EXIT(tempobj, door)->to_room; obj_from_room(tempobj); sprintf(buf, "%s rolls in from the %s.", tempobj->short_description, dirs[rev_dir[door]]); obj_to_room(tempobj, new_room); send_to_room(buf, tempobj->in_room); /* this is a hack - should put another version of look_at_room here */ new_room = ch->in_room; ch->in_room = tempobj->in_room; look_at_room(ch, 0); ch->in_room = new_room; } return; } +------------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html | +------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/08/00 PST