// 11.c. Tired of downloading huge files. #include <math.h> #include <sys/types.h> #include <ctype.h> #include <stdio.h> #include <string.h> #include <time.h> #include "mud.h" SHIP_DATA * first_ship; SHIP_DATA * last_ship; MISSILE_DATA * first_missile; MISSILE_DATA * last_missile; SPACE_DATA * first_starsystem; SPACE_DATA * last_starsystem; void explode_emissile args( ( CHAR_DATA *ch, ROOM_INDEX_DATA *proom, int mindam, int maxdam, bool incendiary) ); void do_makegoggles args( ( CHAR_DATA *ch, char *argument ) ); extern int top_affect; void do_makemissile args( ( CHAR_DATA *ch, char *argument ) ); void do_launch2 args( ( CHAR_DATA *ch, char *argument ) ); void do_load args( ( CHAR_DATA *ch, char *argument ) ); void do_unload args( ( CHAR_DATA *ch, char *argument ) ); void do_link args( ( CHAR_DATA *ch, char *argument ) ); SHIP_DATA * ship_from_gunseat args( ( int vnum ) ); SHIP_DATA * ship_from_cockpit args( ( int vnum ) ); extern char bname[MAX_STRING_LENGTH]; void do_barrel_roll args( ( CHAR_DATA *ch, char *argument ) ); void do_juke args( ( CHAR_DATA *ch, char *argument ) ); char *primary_beam_name(SHIP_DATA *ship) { /* if(ship->primaryCount != 0) { sprintf(bname, "%d %s", ship->primaryCount, (ship->primaryType == SINGLE_LASER && ship->primaryCount == 1)? "Single-laser cannon" : (ship->primaryType == SINGLE_LASER && ship->primaryCount != 1)? "Single-laser cannons" : (ship->primaryType == DUAL_LASER && ship->primaryCount == 1)? "Dual-laser cannon" : (ship->primaryType == DUAL_LASER && ship->primaryCount != 1)? "Dual-laser cannons" : (ship->primaryType == TRI_LASER && ship->primaryCount == 1)? "Triple-laser cannon" : (ship->primaryType == TRI_LASER && ship->primaryCount != 1)? "Triple-laser cannons" : (ship->primaryType == QUAD_LASER && ship->primaryCount == 1)? "Quad-laser cannon" : (ship->primaryType == QUAD_LASER && ship->primaryCount != 1)? "Quad-laser cannons" : (ship->primaryType == AUTOBLASTER && ship->primaryCount == 1)? "Autoblaster turret" : (ship->primaryType == AUTOBLASTER && ship->primaryCount != 1)? "Autoblaster turrets" : (ship->primaryType == HEAVY_LASER && ship->primaryCount == 1)? "Heavy laser cannon" : (ship->primaryType == HEAVY_LASER && ship->primaryCount != 1)? "Heavy laser cannons" : (ship->primaryType == LIGHT_ION && ship->primaryCount == 1)? "Light ion cannon" : (ship->primaryType == LIGHT_ION && ship->primaryCount != 1)? "Light ion cannons" : (ship->primaryType == REPEATING_ION && ship->primaryCount == 1)? "Repeating ion cannon" : (ship->primaryType == REPEATING_ION && ship->primaryCount != 1)? "Repeating ion cannons" : (ship->primaryType == HEAVY_ION && ship->primaryCount == 1)? "Heavy ion cannon" : (ship->primaryType == HEAVY_ION && ship->primaryCount != 1)? "Heavy ion cannons" : "unknown"); return bname; } else */ return "None."; } char *secondary_beam_name(SHIP_DATA *ship) { /* if(ship->secondaryCount != 0) { sprintf(bname, "%d %s", ship->secondaryCount, (ship->secondaryType == SINGLE_LASER && ship->secondaryCount == 1)? "Single-laser cannon" : (ship->secondaryType == SINGLE_LASER && ship->secondaryCount != 1)? "Single-laser cannons" : (ship->secondaryType == DUAL_LASER && ship->secondaryCount == 1)? "Dual-laser cannon" : (ship->secondaryType == DUAL_LASER && ship->secondaryCount != 1)? "Dual-laser cannons" : (ship->secondaryType == TRI_LASER && ship->secondaryCount == 1)? "Triple-laser cannon" : (ship->secondaryType == TRI_LASER && ship->secondaryCount != 1)? "Triple-laser cannons" : (ship->secondaryType == QUAD_LASER && ship->secondaryCount == 1)? "Quad-laser cannon" : (ship->secondaryType == QUAD_LASER && ship->secondaryCount != 1)? "Quad-laser cannons" : (ship->secondaryType == AUTOBLASTER && ship->secondaryCount == 1)? "Autoblaster turret" : (ship->secondaryType == AUTOBLASTER && ship->secondaryCount != 1)? "Autoblaster turrets" : (ship->secondaryType == HEAVY_LASER && ship->secondaryCount == 1)? "Heavy laser cannon" : (ship->secondaryType == HEAVY_LASER && ship->secondaryCount != 1)? "Heavy laser cannons" : (ship->secondaryType == LIGHT_ION && ship->secondaryCount == 1)? "Light ion cannon" : (ship->secondaryType == LIGHT_ION && ship->secondaryCount != 1)? "Light ion cannons" : (ship->secondaryType == REPEATING_ION && ship->secondaryCount == 1)? "Repeating ion cannon" : (ship->secondaryType == REPEATING_ION && ship->secondaryCount != 1)? "Repeating ion cannons" : (ship->secondaryType == HEAVY_ION && ship->secondaryCount == 1)? "Heavy ion cannon" : (ship->secondaryType == HEAVY_ION && ship->secondaryCount != 1)? "Heavy ion cannons" : "unknown"); return bname; } else */ return "None."; } void explode_emissile(CHAR_DATA *ch, ROOM_INDEX_DATA *proom, int mindam, int maxdam, bool incendiary) { CHAR_DATA *rch; OBJ_INDEX_DATA *objindex; OBJ_INDEX_DATA *fObjIndex; OBJ_DATA *obj; OBJ_DATA *fobj; int dam; // Make scraps of missile objindex = get_obj_index(80); obj = create_object( objindex, ch->top_level ); obj->item_type = ITEM_TRASH; STRFREE(obj->name); STRFREE(obj->short_descr); STRFREE(obj->description); obj->name = STRALLOC("scraps missile"); obj->short_descr = STRALLOC("some scraps of a missile"); obj->description = STRALLOC("The scraps of a missile are littering the area."); obj->timer = number_range(5, 15); SET_BIT(obj->wear_flags, ITEM_TAKE); obj_to_room(obj, proom); // Damage for(rch = proom->first_person; rch; rch = rch->next_in_room) { if(incendiary) ch_printf(rch,"&RThe missile EXPLODES into a rain of fire!\n\r"); else ch_printf(rch,"&RThe massive shockwave from the EXPLOSION rips through your body!&w\n\r"); dam = number_range ( mindam , maxdam ); damage( ch, rch, dam, TYPE_MISSILE, FALSE ); } if(incendiary) { //Incendiary round creates fire. Bwaha. fObjIndex = get_obj_index(82); fobj = create_object( fObjIndex, ch->top_level ); fobj->timer = number_range(3,5); fobj = obj_to_room( fobj, proom ); } } void do_makegoggles( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; int level, chance; bool checktool, checkduraplast, checkcirc, checkbatt, checklens; OBJ_DATA *obj; AFFECT_DATA *aff; argument = one_argument( argument, arg ); strcpy(arg2, argument); switch( ch->substate ) { default: if ( arg2[0] == '\0' || (str_cmp(arg, "infrared") && str_cmp(arg, "magnifying"))) { send_to_char( "&RUsage: Makegoggles <infrared/magnifying> <name>\n\r&w", ch); return; } checktool = FALSE; checkcirc = FALSE; checkduraplast = FALSE; checkbatt = FALSE; checklens = FALSE; if ( !IS_SET( ch->in_room->room_flags, ROOM_FACTORY ) ) { send_to_char( "&RYou need to be in a factory or workshop to do that.\n\r", ch); return; } for ( obj = ch->last_carrying; obj; obj = obj->prev_content ) { if (obj->item_type == ITEM_DURAPLAST) checkduraplast = TRUE; if (obj->item_type == ITEM_BATTERY) checkbatt = TRUE; if (obj->item_type == ITEM_LENS) checklens = TRUE; if (obj->item_type == ITEM_CIRCUIT) checkcirc = TRUE; if (obj->item_type == ITEM_TOOLKIT) checktool = TRUE; } if ( !checkduraplast ) { send_to_char( "&RYou need a piece of duraplast.\n\r", ch); return; } if ( !checkcirc ) { send_to_char( "&RYou'll need some circuitry.\n\r", ch); return; } if ( !checkbatt ) { send_to_char( "&RYou need a small battery.\n\r", ch); return; } if ( !checklens ) { send_to_char( "&RYou'll need a lens.\n\r", ch); return; } if ( !checktool ) { send_to_char( "&RYou'll need a toolkit.\n\r", ch); return; } chance = IS_NPC(ch) ? ch->top_level : (int) (0); if ( number_percent( ) < chance ) { if(!str_cmp(arg, "infrared")) send_to_char( "&GYou begin the long process of creating a pair of infrared goggles.\n\r", ch); else send_to_char( "&GYou begin the long process of creating a pair of magnifying goggles.\n\r", ch); act( AT_PLAIN, "$n takes $s toolkit and begins putting something together.", ch, NULL, argument , TO_ROOM ); add_timer ( ch , TIMER_DO_FUN , 12 , do_makegoggles , 1 ); ch->dest_buf = str_dup(arg); ch->dest_buf_2 = str_dup(arg2); return; } send_to_char("&RYou can't figure out what to do.\n\r",ch); return; case 1: if ( !ch->dest_buf ) return; if ( !ch->dest_buf_2 ) return; strcpy(arg, ch->dest_buf); DISPOSE( ch->dest_buf); strcpy(arg2, ch->dest_buf_2); DISPOSE( ch->dest_buf_2); break; case SUB_TIMER_DO_ABORT: DISPOSE( ch->dest_buf ); DISPOSE( ch->dest_buf_2 ); ch->substate = SUB_NONE; send_to_char("&RYou are interrupted and fail to finish your work.\n\r", ch); return; } ch->substate = SUB_NONE; level = IS_NPC(ch) ? ch->top_level : (int) (0); checktool = FALSE; checklens = FALSE; checkcirc = FALSE; checkbatt = FALSE; checkduraplast = FALSE; for ( obj = ch->last_carrying; obj; obj = obj->prev_content ) { if (obj->item_type == ITEM_TOOLKIT) checktool = TRUE; if (obj->item_type == ITEM_CIRCUIT && checkcirc == FALSE) { checkcirc = TRUE; separate_obj( obj ); obj_from_char( obj ); } if (obj->item_type == ITEM_LENS && checklens == FALSE) { checklens = TRUE; separate_obj( obj ); obj_from_char( obj ); } if (obj->item_type == ITEM_DURAPLAST && checkduraplast == FALSE) { checkduraplast = TRUE; separate_obj( obj ); obj_from_char( obj ); } if (obj->item_type == ITEM_BATTERY && checkbatt == FALSE) { checkbatt = TRUE; separate_obj( obj ); obj_from_char( obj ); } } chance = IS_NPC(ch) ? ch->top_level : (int) (0) ; if ( number_percent( ) > chance*2 || ( !checkcirc ) || ( !checkbatt ) || (!checkduraplast) || (!checklens) ) { send_to_char( "&RYou turn the goggles on, but the lens shatters!\n\r", ch); return; } obj = create_object( get_obj_index(85), level ); obj->item_type = ITEM_GOGGLES; SET_BIT( obj->wear_flags, ITEM_TAKE ); SET_BIT( obj->wear_flags, ITEM_WEAR_EYES ); obj->level = ch->top_level; STRFREE( obj->name ); strcpy( buf, arg2 ); strcat( buf, " "); strcat( buf, remand(buf)); obj->name = STRALLOC( buf ); strcpy( buf, arg2 ); STRFREE( obj->short_descr ); obj->short_descr = STRALLOC( buf ); STRFREE( obj->description ); strcat( buf, " was dropped here." ); obj->description = STRALLOC( buf ); obj->value[0] = ch->top_level; obj->value[1] = 0; obj->value[2] = 0; obj->value[3] = 0; if(!str_cmp(arg, "magnifying")) { if(!IS_NPC(ch)) obj->value[4] = 0; else obj->value[4] = number_range(2, 5); } if(!str_cmp(arg, "infrared")) obj->value[5] = 1; else obj->value[5] = 0; if(!str_cmp(arg, "infrared")) { CREATE( aff, AFFECT_DATA, 1 ); aff->type = -1; aff->duration = -1; aff->location = APPLY_AFFECT; aff->modifier = 512; aff->bitvector = 0; aff->next = NULL; LINK( aff, obj->first_affect, obj->last_affect, next, prev ); ++top_affect; } obj->cost = number_range(2500, 3500); obj = obj_to_char( obj, ch ); if(!str_cmp(arg, "infrared")) send_to_char( "&GYou finish making a pair of infrared goggles.&w\n\r", ch); else send_to_char( "&GYou finish making a pair of magnifying goggles.&w\n\r", ch); act( AT_PLAIN, "$n finishes contstructing a pair of goggles.", ch, NULL, argument , TO_ROOM ); return; } void do_makemissile(CHAR_DATA *ch, char *argument) { char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; int level, chance; bool checktool, checkdura, checkbatt, checkcirc; OBJ_DATA *obj; OBJ_INDEX_DATA *pObjIndex; int vnum,chemNum; strcpy( arg , argument ); switch( ch->substate ) { default: if ( arg[0] == '\0' ) { send_to_char( "&RUsage: Makemissile <explosive/incendiary>\n\r&w", ch); return; } checktool = FALSE; checkdura = FALSE; checkbatt = FALSE; checkcirc = FALSE; if ( !IS_SET( ch->in_room->room_flags, ROOM_FACTORY ) ) { send_to_char( "&RYou need to be in a factory or workshop to do that.\n\r", ch); return; } chemNum = 0; for ( obj = ch->last_carrying; obj; obj = obj->prev_content ) { if (obj->item_type == ITEM_TOOLKIT) checktool = TRUE; if (obj->item_type == ITEM_DURASTEEL ) checkdura = TRUE; if (obj->item_type == ITEM_BATTERY) checkbatt = TRUE; if (obj->item_type == ITEM_CIRCUIT) checkcirc = TRUE; if (obj->item_type == ITEM_CHEMICAL) chemNum += obj->count; } if ( !checktool ) { send_to_char( "&RYou need toolkit to make a missile.\n\r", ch); return; } if ( !checkdura ) { send_to_char( "&RYou'll need a chunk of durasteel to make the shell.\n\r", ch); return; } if ( !checkbatt ) { send_to_char( "&RYou need a small battery.\n\r", ch); return; } if ( !checkcirc ) { send_to_char( "&RYou need a small circuit.\n\r", ch); return; } if ( chemNum < 3 ) { send_to_char( "&RYou'll need two chemicals for the explosive, and one for propulsion.\n\r", ch); return; } chance = IS_NPC(ch) ? ch->top_level : (int) (0); if ( number_percent( ) < chance ) { send_to_char( "&GYou begin the long process of making a missile.\n\r", ch); act( AT_PLAIN, "$n takes $s tools and a few parts, beginning to work on something.", ch, NULL, argument , TO_ROOM ); add_timer ( ch , TIMER_DO_FUN , 22 , do_makemissile , 1 ); ch->dest_buf = str_dup(arg); return; } send_to_char("&RYou can't figure out how to fit the parts together.\n\r",ch); return; case 1: if ( !ch->dest_buf ) return; strcpy(arg, ch->dest_buf); DISPOSE( ch->dest_buf); break; case SUB_TIMER_DO_ABORT: DISPOSE( ch->dest_buf ); ch->substate = SUB_NONE; send_to_char("&RYou are interrupted and fail to finish your work.\n\r", ch); return; } ch->substate = SUB_NONE; level = IS_NPC(ch) ? ch->top_level : (int) (0); vnum = 80; if ( ( pObjIndex = get_obj_index( vnum ) ) == NULL ) { send_to_char( "&RThe item you are trying to create is missing from the database.\n\rPlease inform the administration of this error.\n\r", ch ); return; } checktool = FALSE; checkdura = FALSE; checkbatt = FALSE; checkcirc = FALSE; for ( obj = ch->last_carrying; obj; obj = obj->prev_content ) { if (obj->item_type == ITEM_TOOLKIT) checktool = TRUE; if (obj->item_type == ITEM_BATTERY && checkbatt == FALSE) { separate_obj( obj ); obj_from_char( obj ); extract_obj( obj ); checkbatt = TRUE; } if (obj->item_type == ITEM_CHEMICAL && chemNum > 0) { if(obj->count > 3) { obj->count -= 3; chemNum -= 3; } else if(obj->count == 1) { separate_obj( obj ); obj_from_char( obj ); extract_obj( obj ); chemNum -= 1; } else if(obj->count == 3) { obj_from_char( obj ); extract_obj( obj ); chemNum -= 3; } else { obj_from_char( obj ); extract_obj( obj ); chemNum -= 2; } } if (obj->item_type == ITEM_CIRCUIT && checkcirc == FALSE) { separate_obj( obj ); obj_from_char( obj ); extract_obj( obj ); checkcirc = TRUE; } if( obj->item_type == ITEM_DURASTEEL && checkdura == FALSE) { separate_obj(obj); obj_from_char(obj); extract_obj(obj); checkdura = TRUE; } } chance = IS_NPC(ch) ? ch->top_level : (int) (0) ; if ( number_percent( ) > chance*2 || ( !checktool ) || ( !checkdura ) || ( !checkbatt ) || ( !checkcirc) ) { if(number_range(0,1) == 1) send_to_char( "&RYou finish the missile, but you forgot to install the propulsion primer!\n\r", ch); else if(number_range(0,1) == 1) send_to_char( "&RYou finish the missile, but half the explosive is still on the worktable!\n\r", ch); else if(number_range(0,1) == 1) send_to_char( "&RYou finish the missile, but the circuitry fails, and it starts to smoke.\n\r", ch); else { send_to_char( "&RYou finish the missile, only to figure out that you've made a grenade!\n\r", ch); send_to_char( "&RYou toss the grenade into the disposal.\n\r", ch); } return; } obj = create_object( pObjIndex, level ); obj->item_type = ITEM_MISSILE; SET_BIT( obj->wear_flags, ITEM_HOLD ); SET_BIT( obj->wear_flags, ITEM_TAKE ); obj->level = level; obj->weight = 2; STRFREE( obj->name ); strcpy( buf , arg ); strcat( buf , " missile "); sprintf(buf, "%s", remand(buf)); obj->name = STRALLOC( buf ); strcpy( buf, arg ); STRFREE( obj->short_descr ); if(!str_cmp(arg, "incendiary")) obj->short_descr = STRALLOC("an incendiary missile"); else obj->short_descr = STRALLOC("an explosive missile"); STRFREE( obj->description ); strcat( buf, " was carelessly misplaced here." ); obj->description = STRALLOC( buf ); if(!IS_NPC(ch)) { obj->value[1] = 0; obj->value[2] = number_range(0, 100); } obj->cost = number_range(obj->value[1], obj->value[2])*100; obj = obj_to_char( obj, ch ); send_to_char( "&GYou finish your work and hold up your newly created missile.&w\n\r", ch); act( AT_PLAIN, "$n finishes making $s new missile.", ch, NULL, argument , TO_ROOM ); return; } void do_launch2( CHAR_DATA *ch, char *argument ) { CHAR_DATA * rch; CHAR_DATA * zch; OBJ_DATA * wield; char arg[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char *dtxt; char *ftxt; sh_int dir,dist = 0,max_dist; EXIT_DATA * pexit; ROOM_INDEX_DATA * proom; int chance, missroom; char buf[MAX_STRING_LENGTH]; bool exfound; bool msgsent; argument = one_argument( argument, arg ); argument = one_argument( argument, arg2 ); wield = get_eq_char( ch, WEAR_WIELD ); if ( IS_SET( ch->in_room->room_flags, ROOM_SAFE ) ) { set_char_color( AT_MAGIC, ch ); send_to_char( "You'll have to do that elsewhere.\n\r", ch ); return; } if ( get_eq_char( ch, WEAR_DUAL_WIELD ) != NULL ) { send_to_char( "You can't do that while wielding two weapons.\n\r",ch ); return; } if(!wield) { send_to_char("You must have a launcher equipped first.\n\r", ch); return; } if (wield->item_type != ITEM_GLAUNCHER && wield->item_type != ITEM_RLAUNCHER ) { send_to_char( "You must have a launcher equipped first.\n\r",ch ); return; } if ( ( arg[0] == '\0' ) ) { send_to_char( "Missile Launcher usage: launch <dir> <optional target>.\n\r", ch ); send_to_char( "Grenade Launcher usage: launch <dir> <how far>.\n\r", ch); return; } dir = get_door(arg); if( wield->item_type == ITEM_RLAUNCHER ) { if ( wield->value[5] == 0 ) { send_to_char("You must load a missile into it first.\n\r", ch); return; } if( wield->value[2] == 1 && !ch->aiming_at && arg2[0] != '\0') { send_to_char("This launcher is equipped with a guidance system...you must AIM first.\n\r", ch); return; } max_dist = wield->value[0]; if ( ( pexit = get_exit( ch->in_room, dir ) ) == NULL ) { send_to_char("Your ignorance of common sense shows as you fire the missile into a wall!\n\r", ch); act(AT_ACTION, "$n fires a missile into the wall!", ch, NULL, NULL, TO_ROOM); if(wield->value[1] == 1) explode_emissile(ch, ch->in_room, wield->value[3], wield->value[4], 1); else explode_emissile(ch, ch->in_room, wield->value[3], wield->value[4], 0); //Unload launcher wield->value[0] = 0; wield->value[1] = 0; wield->value[3] = 0; wield->value[4] = 0; wield->value[5] = 0; return; }// end if firing into wall switch( dir ) { default: dtxt = "somewhere"; break; case 0: dtxt = "north"; ftxt = "the south"; break; case 1: dtxt = "east"; ftxt = "the west"; break; case 2: dtxt = "south"; ftxt = "the north"; break; case 3: dtxt = "west"; ftxt = "the east"; break; case 4: dtxt = "up"; ftxt = "below"; break; case 5: dtxt = "down"; ftxt = "above"; break; case 6: dtxt = "southwest"; ftxt = "the northeast"; break; case 7: dtxt = "southeast"; ftxt = "the northwest"; break; case 8: dtxt = "northwest"; ftxt = "the southeast"; break; case 9: dtxt = "northeast"; ftxt = "the southwest"; break; } ch_printf(ch, "You launch the missile %s.\n\r", dtxt); for(pexit = ch->in_room->first_exit; pexit; pexit = pexit->next) { if(pexit->vdir == dir) { if ( IS_SET( pexit->exit_info, EX_CLOSED ) ) // Door in the way? { if(!IS_SET(pexit->exit_info, EX_BASHPROOF)) { REMOVE_BIT( pexit->exit_info, EX_CLOSED ); if ( IS_SET( pexit->exit_info, EX_LOCKED ) ) REMOVE_BIT( pexit->exit_info, EX_LOCKED ); SET_BIT( pexit->exit_info, EX_BASHED ); for(rch = ch->in_room->first_person; rch; rch = rch->next_in_room) { if(rch == ch) continue; sprintf(buf, "%s launches a missile %s, and it EXPLODES upon impact of the doorway!", PERS(ch, rch), dtxt); send_to_char(buf, rch); } send_to_char("&RThe missile flies directly into the doorway, and EXPLODES!\n\r", ch); send_to_char("&wThe doorway is reduced to nothing but debris.\n\r", ch); act(AT_ACTION, "&RThe doorway is reduced to nothing but debris.&w\n\r", ch, NULL, NULL, TO_ROOM); if(wield->value[1] == 1) explode_emissile(ch, ch->in_room, wield->value[3], wield->value[4], 1); else explode_emissile(ch, ch->in_room, wield->value[3], wield->value[4], 0); // Knock char down if close to door (1 in 4 chance) for ( rch = ch->in_room->first_person ; rch ; rch = rch->next_in_room ) { if(number_range(1, 4) == 4) { ch_printf(rch,"&RYou are too close to the door, and the EXPLOSION knocks you to the ground!&w\n\r"); act(AT_RED, "$n is too close to the door, and the EXPLOSION knocks them to the ground!", rch, NULL, NULL, TO_ROOM); rch->position = POS_SITTING; } } } else // is bashproof { for(rch = ch->in_room->first_person; rch; rch = rch->next_in_room) { if(rch == ch) continue; sprintf(buf, "&w%s fires a missile %s, and it explodes upon impact of the doorway!", PERS(ch, rch), dtxt); send_to_char(buf, rch); } send_to_char("&RThe missile flies directly into the doorway, and EXPLODES!\n\r", ch); send_to_char("&wThe door remains undamaged, aside from some carbon scoring.\n\r", ch); act(AT_ACTION, "&RThe door remains undamaged, aside from some carbon scoring.", ch, NULL, NULL, TO_ROOM); if(wield->value[1] == 1) explode_emissile(ch, ch->in_room, wield->value[3], wield->value[4], 1); else explode_emissile(ch, ch->in_room, wield->value[3], wield->value[4], 0); }//end bashproof check //Unload launcher wield->value[0] = 0; wield->value[1] = 0; wield->value[3] = 0; wield->value[4] = 0; wield->value[5] = 0; return; }//end if door in way act(AT_WHITE, "&w$n launches a missile $d!", ch, NULL, dtxt, TO_ROOM); missroom = pexit->vnum; proom = get_room_index(missroom); dist = 1; break; } }//end missile-in-room for( ; ; ) // next room, and all rooms after { msgsent = FALSE; for(pexit = proom->first_exit; pexit; pexit = pexit->next) { if(pexit->vdir == dir) // get next room information { missroom = pexit->vnum; exfound = TRUE; break; } else exfound = FALSE; } //check target, return if hit for(rch = proom->first_person; rch; rch = rch->next_in_room) // Target? { if(arg2[0] == '\0') break; if(ch->aiming_at == rch) // Laser guidance on launcher, like having 100% launchers { if(!IS_NPC(rch)) chance = 100; else chance = 10; } else { if(!IS_NPC(rch)) chance = 0; else chance = 10; } if(number_range(-15, chance+(rch->perm_lck - 12)) >= 0) // Direct hit { ch_printf(ch, "Your missile scores a direct hit on %s!\n\r", PERS(rch, ch)); ch_printf(rch, "A missile fired from %s flies into you!\n\r", ftxt); for(zch = proom->first_person; zch; zch = zch->next_in_room) { if(zch == rch) continue; ch_printf(zch, "A missile fired from the %s flies right into %s!\n\r", ftxt, PERS(rch, zch)); } if(wield->value[1] == 1) explode_emissile(ch, proom, wield->value[3], wield->value[4], 1); else explode_emissile(ch, proom, wield->value[3], wield->value[4], 0); // Unload launcher wield->value[0] = 0; wield->value[1] = 0; wield->value[3] = 0; wield->value[4] = 0; wield->value[5] = 0; return; } else if(number_range(-15, chance+(rch->perm_lck - 12)) >= -5) // Miss, but still damages { ch_printf(ch, "%s narrowly dodges your missile, but it explodes nearby.\n\r", PERS(rch, ch)); ch_printf(rch, "You barely dodge a missile fired from %s, but it explodes near you!\n\r", ftxt); for(zch = proom->first_person; zch; zch = zch->next_in_room) { if(zch == rch) continue; ch_printf(zch, "%s barely dodges a missile fired at them from %s, but it still explodes nearby!\n\r", PERS(rch, zch), ftxt); } if(wield->value[1] == 1) explode_emissile(ch, proom, wield->value[3], wield->value[4], 1); else explode_emissile(ch, proom, wield->value[3], wield->value[4], 0); // Unload launcher wield->value[0] = 0; wield->value[1] = 0; wield->value[3] = 0; wield->value[4] = 0; wield->value[5] = 0; return; } else { ch_printf(ch, "%s dodges the missile fired at them.\n\r", PERS(rch, ch)); ch_printf(rch, "A missile flies in from %s! Luckily, you dodge it.\n\r", ftxt); for(zch = proom->first_person; zch; zch = zch->next_in_room) { if(zch == rch) continue; ch_printf(zch, "A missile flies in from %s at %s! They quickly dodge it.\n\r", ftxt, PERS(rch, zch)); } msgsent = TRUE; } if(ch->aiming_at) { send_to_char("&G*&gbeep&G* Target lost. Target acquisition necessary for relaunch.\n\r",ch); ch->aiming_at = NULL; } } //end ?target //check door, return if hit if(exfound == TRUE) { if ( IS_SET( pexit->exit_info, EX_CLOSED ) ) // Door in the way? { if(!IS_SET(pexit->exit_info, EX_BASHPROOF)) { REMOVE_BIT( pexit->exit_info, EX_CLOSED ); if ( IS_SET( pexit->exit_info, EX_LOCKED ) ) REMOVE_BIT( pexit->exit_info, EX_LOCKED ); SET_BIT( pexit->exit_info, EX_BASHED ); for(rch = proom->first_person; rch; rch = rch->next_in_room) { ch_printf(rch, "&wA missile flies in from the %s, and explodes upon impact of the doorway %s!\n\r", ftxt, dtxt); ch_printf(rch, "&RThe doorway is reduced to nothing but debris.&w\n\r"); ch_printf(ch, "&WThe missile travels %d room%s away, and hits a door, which is destroyed!\n\r", dist, dist > 1 ? "s" : ""); } } else { for(rch = proom->first_person; rch; rch = rch->next_in_room) { ch_printf(rch, "&wA missile flies in from the %s, and explodes upon impact of the doorway %s!\n\r", ftxt, dtxt); ch_printf(rch, "&RThe door remains undamaged, aside from some carbon scoring.\n\r"); ch_printf(ch, "&WThe missile travels %d room%s, and hits a door, which remains undamaged!\n\r", dist, dist > 1 ? "s" : ""); } } if(wield->value[1] == 1) explode_emissile(ch, proom, wield->value[3], wield->value[4], 1); else explode_emissile(ch, proom, wield->value[3], wield->value[4], 0); // Knock char down if close to door (1 in 4 chance) for ( rch = proom->first_person ; rch ; rch = rch->next_in_room ) { if(number_range(1, 4) == 4) { ch_printf(rch,"&wYou are too close to the door, and the EXPLOSION knocks you to the ground!&w\n\r"); for(zch = proom->first_person; zch; zch = zch->next_in_room) { if(zch == rch) continue; ch_printf(zch, "&w%s is too close to the door, and the EXPLOSION knocks them to the ground!", PERS(zch, rch)); } rch->position = POS_SITTING; } } //Unload launcher wield->value[0] = 0; wield->value[1] = 0; wield->value[3] = 0; wield->value[4] = 0; wield->value[5] = 0; return; } } // end check for door //check distance, return if drop if(dist == max_dist) //Missile reaches range { if(msgsent == FALSE) sprintf(buf, "A missile flies in from %s, loses speed, and drops, exploding!\n\r", ftxt); else sprintf(buf, "The missile loses speed and drops, exploding!\n\r"); for(zch = proom->first_person; zch; zch = zch->next_in_room) send_to_char(buf, zch); ch_printf(ch, "The missile travels %d room%s away, loses speed, and explodes as it drops!\n\r", dist, dist > 1 ? "s" : ""); if(wield->value[1] == 1) explode_emissile(ch, proom, wield->value[3], wield->value[4], 1); else explode_emissile(ch, proom, wield->value[3], wield->value[4], 0); //Unload launcher wield->value[0] = 0; wield->value[1] = 0; wield->value[3] = 0; wield->value[4] = 0; wield->value[5] = 0; return; } //End reaches range if(exfound == FALSE) break; else { if(msgsent == FALSE) sprintf(buf, "A missile flies in from %s, and continues %s!\n\r", ftxt, dtxt); else sprintf(buf, "The missile continues %s. That was close!\n\r", dtxt); for(zch = proom->first_person; zch; zch = zch->next_in_room) send_to_char(buf, zch); dist++; missroom = pexit->vnum; proom = get_room_index(missroom); } } if(exfound == FALSE) { //msgsent, boom, return if(msgsent == FALSE) sprintf(buf, "A missile flies in from %s, and explodes, hitting a wall!\n\r", ftxt); else sprintf(buf, "The missile flies into a wall, and explodes!\n\r"); for(zch = proom->first_person; zch; zch = zch->next_in_room) send_to_char(buf, zch); ch_printf(ch, "The missile flies %d room%s away, and hits a wall, exploding!\n\r", dist, dist > 1 ? "s" : ""); if(wield->value[1] == 1) explode_emissile(ch, proom, wield->value[3], wield->value[4], 1); else explode_emissile(ch, proom, wield->value[3], wield->value[4], 0); } // unload launcher wield->value[0] = 0; wield->value[1] = 0; wield->value[3] = 0; wield->value[4] = 0; wield->value[5] = 0; return; }//end if rlauncher /* if( wield->item_type == ITEM_GLAUNCHER ) { if(wield->value[1] + wield->value[2] == 0) { send_to_char("You don't have any grenades loaded.\n\r", ch); return; } if(!isdigit(atoi(arg2)) { ch_printf("Invalid distance. It must be a number between 1 and %d.\n\r", wield->value[5]) if(atoi(arg2) > wield->value[5]) { send_to_char("This launcher isn't capable of firing a grenade that far.\n\r", ch); return; } if ( ( pexit = get_exit( ch->in_room, dir ) ) == NULL ) { } */ } void do_load(CHAR_DATA *ch, char *argument) { CHAR_DATA *rch; OBJ_DATA *obj; OBJ_DATA *launcher; char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if(arg1[0] == '\0' || arg2[0] == '\0') { send_to_char("Usage: load <object> <launcher>.\n\r", ch); return; } launcher = get_obj_carry( ch, arg2 ); if(!launcher) { ch_printf(ch, "You don't seem to be carrying a '%s'.\n\r", arg2); return; } if(launcher->item_type != ITEM_RLAUNCHER && launcher->item_type != ITEM_GLAUNCHER) { ch_printf(ch, "&w%s&w isn't a launcher.\n\r", launcher->short_descr); return; } if(launcher->item_type == ITEM_RLAUNCHER) { if(launcher->value[5] == 1) { ch_printf(ch, "&w%s&w is already loaded with an %s missile.\n\r", launcher->short_descr, launcher->value[1] == 0 ? "explosive" : "incendiary"); return; } if ( ( obj = get_obj_carry( ch, arg1 ) ) == NULL ) { ch_printf(ch, "You don't seem to be carrying a '%s'.\n\r", arg1); return; } else { if(obj->item_type != ITEM_MISSILE) { ch_printf(ch, "&w%s&w isn't a missile.\n\r", obj->short_descr); return; } } launcher->value[0] = obj->value[0]; launcher->value[1] = obj->value[1]; launcher->value[3] = obj->value[3]; launcher->value[4] = obj->value[4]; launcher->value[5] = 1; obj_from_char(obj); extract_obj(obj); WAIT_STATE(ch, 12); ch_printf(ch, "&wYou load &w%s&w into &w%s&w.\n\r", obj->short_descr, launcher->short_descr); for(rch = ch->in_room->first_person; rch; rch = rch->next_in_room) { if(ch == rch) continue; ch_printf(rch, "&w%s loads &w%s&w into &w%s&w.\n\r", PERS(ch, rch), obj->short_descr, launcher->short_descr); } return; } } void do_unload(CHAR_DATA *ch, char *argument) { CHAR_DATA *rch; OBJ_DATA *obj; OBJ_DATA *launcher; if(argument == '\0') { send_to_char("Usage: unload <launcher>.\n\r", ch); return; } launcher = get_obj_carry( ch, argument ); if(!launcher) { ch_printf(ch, "You don't seem to be carrying a '%s'.\n\r", argument); return; } if(launcher->item_type != ITEM_RLAUNCHER && launcher->item_type != ITEM_GLAUNCHER) { ch_printf(ch, "&w%s&w isn't a launcher.\n\r", launcher->short_descr); return; } if(launcher->item_type == ITEM_RLAUNCHER) { if(launcher->value[5] == 0) { ch_printf(ch, "&w%s&w is already unloaded.\n\r", launcher->short_descr); return; } obj = create_object( get_obj_index(80), ch->top_level ); obj->item_type = ITEM_MISSILE; SET_BIT( obj->wear_flags, ITEM_HOLD ); SET_BIT( obj->wear_flags, ITEM_TAKE ); obj->level = ch->top_level; obj->weight = 2; STRFREE(obj->name); STRFREE(obj->short_descr); STRFREE(obj->description); if(launcher->value[1] == 0) { obj->name = STRALLOC("explosive missile"); obj->short_descr = STRALLOC("an explosive missile"); obj->description = STRALLOC("A missile has been carelessly left here."); obj->value[1] = 0; } else { obj->name = STRALLOC("incendiary missile"); obj->short_descr = STRALLOC("an incendiary missile"); obj->value[1] = 1; } obj->value[0] = launcher->value[0]; obj->value[2] = 0; obj->description = STRALLOC("A missile has been carelessly left here."); obj->cost = number_range(obj->value[3], obj->value[4])*25; obj->value[3] = launcher->value[3]; obj->value[4] = launcher->value[4]; obj = obj_to_char( obj, ch ); launcher->value[0] = 0; launcher->value[1] = 0; launcher->value[3] = 0; launcher->value[4] = 0; launcher->value[5] = 0; WAIT_STATE(ch, 12); ch_printf(ch, "&wYou unload %s&w.\n\r", launcher->short_descr); for(rch = ch->in_room->first_person; rch; rch = rch->next_in_room) { if(ch == rch) continue; ch_printf(rch, "&w%s&w unloads %s&w.\n\r", PERS(ch, rch), launcher->short_descr); } return; } } void do_link(CHAR_DATA *ch, char *argument) { SHIP_DATA *ship; int x; if(IS_NPC(ch)) return; if( (ship = ship_from_gunseat(ch->in_room->vnum)) == NULL ) { send_to_char("&RYou must be in the gunseat of a ship to link weapon systems.\n\r", ch); return; } if(str_cmp(argument, "primary") && str_cmp(argument, "secondary") && str_cmp(argument,"launchers")) { send_to_char("Usage: link <primary/secondary/launchers>\n\r", ch); return; } if(!str_prefix(argument, "primary")) { /* if(ship->primaryType == B_NONE) { send_to_char("&RThis ship is not equipped with a primary weapon system.\n\r", ch); return; } */ switch(ship->primaryType) { case 0: x = 0; break; case 1: x = ship->primaryCount; break; case 2: x = 2*ship->primaryCount; break; case 3: x = 3*ship->primaryCount; break; case 4: x = 4*ship->primaryCount; break; case 5: x = ship->primaryCount; break; case 6: x = ship->primaryCount; break; case 7: x = ship->primaryCount; break; case 8: x = ship->primaryCount; break; case 9: x = ship->primaryCount; break; default: x = 1; break; } if(x <= 1) { send_to_char("The current primary weapon can only fire once.\n\r", ch); return; } ship->primaryLinked = TRUE; ch_printf(ch, "Primary weapon systems are linked. All available will fire.\n\r"); return; } if(!str_prefix(argument, "secondary")) { /* if(ship->secondaryType == B_NONE) { send_to_char("&RThis ship is not equipped with a secondary weapon system.\n\r", ch); return; } */ switch(ship->secondaryType) { case 0: x = 0; break; case 1: x = ship->secondaryCount; break; case 2: x = 2*ship->secondaryCount; break; case 3: x = 3*ship->secondaryCount; break; case 4: x = 4*ship->secondaryCount; break; case 5: x = ship->secondaryCount; break; case 6: x = ship->secondaryCount; break; case 7: x = ship->secondaryCount; break; case 8: x = ship->secondaryCount; break; case 9: x = ship->secondaryCount; break; default: x = 1; break; } if(x <= 1) { send_to_char("The current secondary weapon can only fire once.\n\r", ch); return; } ship->secondaryLinked = TRUE; ch_printf(ch, "Secondary weapon systems are linked. All available will fire.\n\r"); return; } if(!str_prefix(argument, "launchers")) { if(!ship->maxmissiles && !ship->maxtorpedos && !ship->maxrockets) { send_to_char("This ship does not have a launcher system installed.\n\r", ch); return; } if( (ship->maxmissiles && ship->maxtorpedos) || (ship->maxmissiles && ship->maxrockets) || (ship->maxtorpedos && ship->maxmissiles) || (ship->maxtorpedos && ship->maxrockets) || (ship->maxrockets && ship->maxmissiles) || (ship->maxrockets && ship->maxtorpedos) ) { ship->warheadLinked = TRUE; ch_printf(ch, "Launcher system linked. All available will fire.\n\r"); return; } else { ch_printf(ch, "You only have one launcher type, linking is unnecessary.\n\r"); return; } } } void do_unlink(CHAR_DATA *ch, char *argument) { SHIP_DATA *ship; if( (ship = ship_from_gunseat(ch->in_room->vnum)) == NULL ) { send_to_char("&RYou must be in the gunseat of a ship to unlink weapon systems.\n\r", ch); return; } if(str_cmp(argument, "primary") && str_cmp(argument, "secondary") && str_cmp(argument,"launchers") && str_cmp(argument, "all")) { send_to_char("Usage: unlink <primary/secondary/launchers/all>\n\r", ch); return; } if(!str_prefix(argument, "primary")) { if(ship->primaryCount == 0) { send_to_char("This ship doesn't have a primary weapon system.\n\r", ch); return; } if(ship->primaryLinked == FALSE) { send_to_char("The primary weapon systems aren't linked.\n\r", ch); return; } ship->primaryLinked = FALSE; send_to_char("You unlink the primary weapon systems.\n\r", ch); act(AT_PLAIN, "$n presses a few buttons on the console.\n\r", ch, NULL, NULL, TO_ROOM); return; } if(!str_prefix(argument, "secondary")) { if(ship->secondaryCount == 0) { send_to_char("This ship doesn't have a secondary weapon system.\n\r", ch); return; } if(ship->secondaryLinked == FALSE) { send_to_char("The secondary weapon systems aren't linked.\n\r", ch); return; } ship->secondaryLinked = FALSE; send_to_char("You unlink the secondary weapon systems.\n\r", ch); act(AT_PLAIN, "$n presses a few buttons on the console.\n\r", ch, NULL, NULL, TO_ROOM); return; } if(!str_prefix(argument, "launchers")) { if(ship->warheadLinked == FALSE) { send_to_char("The launcher systems aren't linked.\n\r", ch); return; } ship->warheadLinked = FALSE; send_to_char("You unlink the launcher systems.\n\r", ch); act(AT_PLAIN, "$n presses a few buttons on the console.\n\r", ch, NULL, NULL, TO_ROOM); return; } if(!str_prefix(argument, "all")) { if(ship->warheadLinked == FALSE && ship->primaryLinked == FALSE && ship->secondaryLinked == FALSE) { send_to_char("No ship system is linked.\n\r", ch); return; } if(ship->primaryLinked == TRUE) { ship->primaryLinked = FALSE; send_to_char("Primary weapon systems unlinked.\n\r", ch); } if(ship->secondaryLinked == TRUE) { ship->secondaryLinked = FALSE; send_to_char("Secondary weapon systems unlinked.\n\r", ch); } if(ship->warheadLinked == TRUE) { ship->warheadLinked = FALSE; send_to_char("Launcher systems unlinked.\n\r", ch); } return; } } void do_barrel_roll(CHAR_DATA *ch, char *argument) { SHIP_DATA *ship; char buf[MAX_STRING_LENGTH]; int chance; if( (ship = ship_from_cockpit(ch->in_room->vnum)) == NULL ) { send_to_char("&RYou must be in the cockpit of a ship to perform a maneuver.\n\r", ch); return; } if(ship->manuever < 70) { send_to_char("This ship isn't maneuverable enough to perform a barrel roll.\n\r", ch); return; } if (ship->shipstate == SHIP_HYPERSPACE) { send_to_char("&RYou can only do that in realspace.\n\r",ch); return; } if (! ship->starsystem ) { send_to_char("&RYou can only do that in realspace.\n\r",ch); return; } switch(ch->substate) { default: chance = IS_NPC(ch) ? ch->top_level*2 : 0; if(number_percent() > chance) { send_to_char("&RYou attempt to do a barrel roll, but fail horribly.\n\r", ch); return; } if(ship->juking == TRUE) { send_to_char("&YYou stop juking from side to side, and perform a barrel roll.\n\r", ch); sprintf(buf, "%s stops juking from side to side.", ship->name); echo_to_system(AT_YELLOW, ship, buf, NULL); ship->juking = FALSE; } ship->rolling = TRUE; send_to_char(">he ship starts rolling...\n\r", ch); act(AT_PLAIN, "$n performs a barrel roll.", ch, NULL, NULL, TO_ROOM); sprintf(buf, "%s performs a barrel roll.", ship->name); echo_to_system(AT_YELLOW, ship, buf, NULL); add_timer ( ch , TIMER_DO_FUN , number_range(3, 6), do_barrel_roll , 1 ); return; case 1: break; case SUB_TIMER_DO_ABORT: ch->substate = SUB_NONE; if(( ship = ship_from_cockpit(ch->in_room->vnum) ) == NULL) return; send_to_char("&YYou level out your flight pattern.\n\r", ch); act(AT_PLAIN, "$n levels out $s flight pattern.\n\r", ch, NULL, NULL, TO_ROOM); sprintf(buf, "%s levels out its flight pattern.", ship->name); echo_to_system(AT_YELLOW, ship, buf, NULL); ship->rolling = FALSE; return; } ch->substate = SUB_NONE; if(( ship = ship_from_cockpit(ch->in_room->vnum) ) == NULL) return; send_to_char("&YYou level out your flight pattern.\n\r", ch); act(AT_PLAIN, "$n levels out $s flight pattern.\n\r", ch, NULL, NULL, TO_ROOM); sprintf(buf, "%s levels out its flight pattern.", ship->name); echo_to_system(AT_YELLOW, ship, buf, NULL); ship->rolling = FALSE; return; } void do_juke(CHAR_DATA *ch, char *argument) { SHIP_DATA *ship; char buf[MAX_STRING_LENGTH]; int chance; if( (ship = ship_from_cockpit(ch->in_room->vnum)) == NULL ) { send_to_char("&RYou must be in the cockpit of a ship to perform a maneuver.\n\r", ch); return; } if(ship->manuever < 75) { send_to_char("This ship isn't maneuverable enough to perform a juke.\n\r", ch); return; } if (ship->shipstate == SHIP_HYPERSPACE) { send_to_char("&RYou can only do that in realspace.\n\r",ch); return; } if (! ship->starsystem ) { send_to_char("&RYou can only do that in realspace.\n\r",ch); return; } switch(ch->substate) { default: chance = IS_NPC(ch) ? ch->top_level*2 : 0; if(number_percent() > chance) { send_to_char("&RYou attempt to do a juke, but fail horribly.\n\r", ch); return; } if(ship->rolling == TRUE) { send_to_char("&YYou break out of the barrel roll, and start juking.\n\r", ch); sprintf(buf, "%s stops rolling.", ship->name); echo_to_system(AT_YELLOW, ship, buf, NULL); ship->rolling = FALSE; } ship->juking = TRUE; send_to_char("&GYou perform the maneuver, and the ship jukes from side to side.\n\r", ch); act(AT_PLAIN, "$n jukes the ship from side to side.", ch, NULL, NULL, TO_ROOM); sprintf(buf, "%s starts juking from side to side.", ship->name); echo_to_system(AT_YELLOW, ship, buf, NULL); add_timer ( ch , TIMER_DO_FUN , number_range(3, 6), do_juke , 1 ); return; case 1: break; case SUB_TIMER_DO_ABORT: ch->substate = SUB_NONE; if(( ship = ship_from_cockpit(ch->in_room->vnum) ) == NULL) return; send_to_char("&YYou level out your flight pattern.\n\r", ch); act(AT_PLAIN, "$n levels out $s flight pattern.\n\r", ch, NULL, NULL, TO_ROOM); sprintf(buf, "%s levels out its flight pattern.", ship->name); echo_to_system(AT_YELLOW, ship, buf, NULL); ship->juking = FALSE; return; } ch->substate = SUB_NONE; if(( ship = ship_from_cockpit(ch->in_room->vnum) ) == NULL) return; send_to_char("You level out your flight pattern.\n\r", ch); act(AT_PLAIN, "$n levels out $s flight pattern.\n\r", ch, NULL, NULL, TO_ROOM); sprintf(buf, "%s levels out its flight pattern.", ship->name); echo_to_system(AT_YELLOW, ship, buf, NULL); ship->juking = FALSE; return; }