#include <stdlib.h> #include <stdio.h> #include <string.h> #include "mud.h" #include "vector3_aux.h" extern ROOM_INDEX_DATA *room_index_hash[MAX_KEY_HASH]; SHIP_DATA *make_mob_ship( PLANET_DATA * planet, int ship_model ); void resetship( SHIP_DATA * ship ); void reset_room( ROOM_INDEX_DATA *pRoomIndex ); void do_reset( CHAR_DATA * ch, char *argument ) { reset_all(); } static void reset_make_random_disaster( void ) { PLANET_DATA *dPlanet = NULL; int pCount = 0; int rCount = 0; CLAN_DATA *dClan = NULL; DESCRIPTOR_DATA *d = NULL; for( dPlanet = first_planet; dPlanet; dPlanet = dPlanet->next ) { pCount++; } rCount = number_range( 1, pCount ); pCount = 0; for( dPlanet = first_planet; dPlanet; dPlanet = dPlanet->next ) { if( ++pCount == rCount ) { break; } } if( dPlanet && dPlanet->area && dPlanet->governed_by ) { dClan = dPlanet->governed_by; } if( dClan ) { for( d = first_descriptor; d; d = d->next ) { if( d->connected == CON_PLAYING && !d->original && d->character && d->character->pcdata && d->character->pcdata->clan && d->character->pcdata->clan == dPlanet->governed_by ) { break; } } } if( d ) { ROOM_INDEX_DATA *pRoomIndex = NULL; switch ( number_bits( 2 ) ) { case DISASTER_ALIEN_INVASION: /* Last invasion not yet over? */ if( mobile_is_in_area( dPlanet->area, MOB_VNUM_ALIEN ) ) { return; } for( pRoomIndex = dPlanet->area->first_room; pRoomIndex; pRoomIndex = pRoomIndex->next_in_area ) { if( pRoomIndex->sector_type == SECT_CITY && !IS_SET( pRoomIndex->room_flags, ROOM_NO_MOB ) ) { break; } } if( pRoomIndex ) { char dBuf[MAX_STRING_LENGTH]; MOB_INDEX_DATA *pMobIndex = NULL; if( ( pMobIndex = get_mob_index( MOB_VNUM_ALIEN ) ) ) { int mCount = 0; sprintf( dBuf, "(GNET) A Colonist: Help %s is being invaded by alien forces.", dPlanet->name ); echo_to_all( AT_LBLUE, dBuf, ECHOTAR_ALL ); for( mCount = 0; mCount < 20; mCount++ ) { OBJ_INDEX_DATA *pObjIndex = NULL; OBJ_DATA *obj = NULL; CHAR_DATA *mob = create_mobile( pMobIndex ); char_to_room( mob, pRoomIndex ); mob->hit = 100; mob->max_hit = 100; if( room_is_dark( pRoomIndex ) ) SET_BIT( mob->affected_by, AFF_INFRARED ); if( ( pObjIndex = get_obj_index( OBJ_VNUM_BLASTER ) ) != NULL ) { obj = create_object( pObjIndex ); obj_to_char( obj, mob ); equip_char( mob, obj, WEAR_WIELD ); } do_setblaster( mob, STRLIT_FULL ); } } } break; default: break; } } } static void reset_room_lock_doors( ROOM_INDEX_DATA * pRoomIndex ) { EXIT_DATA *xit = NULL; for( xit = pRoomIndex->first_exit; xit; xit = xit->next ) { if( IS_SET( xit->exit_info, EX_ISDOOR ) ) { SET_BIT( xit->exit_info, EX_CLOSED ); if( xit->key >= 0 ) SET_BIT( xit->exit_info, EX_LOCKED ); } } } static void reset_respawn_planetary_fleet( ROOM_INDEX_DATA * pRoomIndex ) { if( IS_SET( pRoomIndex->room_flags, ROOM_CONTROL ) && pRoomIndex->area && pRoomIndex->area->planet && pRoomIndex->area->planet->starsystem && pRoomIndex->area->planet->governed_by ) { SPACE_DATA *starsystem = pRoomIndex->area->planet->starsystem; SHIP_DATA *ship = NULL; int numpatrols = 0; int numdestroyers = 0; int numbattleships = 0; int numcruisers = 0; int fleetsize = 0; for( ship = starsystem->first_ship; ship; ship = ship->next_in_starsystem ) if( !str_cmp( ship->owner, pRoomIndex->area->planet->governed_by->name ) && ship->type == MOB_SHIP ) { if( ship->model == MOB_DESTROYER ) numdestroyers++; else if( ship->model == MOB_CRUISER ) numcruisers++; else if( ship->model == MOB_BATTLESHIP ) numbattleships++; else numpatrols++; } fleetsize = 100 * numbattleships + 25 * numcruisers + 5 * numdestroyers + numpatrols; if( fleetsize + 100 < pRoomIndex->area->planet->controls ) make_mob_ship( pRoomIndex->area->planet, MOB_BATTLESHIP ); else if( fleetsize + 25 < pRoomIndex->area->planet->controls && numcruisers < 5 ) make_mob_ship( pRoomIndex->area->planet, MOB_CRUISER ); else if( fleetsize + 5 < pRoomIndex->area->planet->controls && numdestroyers < 5 ) make_mob_ship( pRoomIndex->area->planet, MOB_DESTROYER ); else if( fleetsize < pRoomIndex->area->planet->controls && numpatrols < 5 ) make_mob_ship( pRoomIndex->area->planet, MOB_PATROL ); } } static void reset_mobile_by_room_type( ROOM_INDEX_DATA * pRoomIndex ) { int vnum = 0; int onum = 0; bool found = FALSE; CHAR_DATA *mob = NULL; MOB_INDEX_DATA *pMobIndex = NULL; OBJ_DATA *obj = NULL; OBJ_INDEX_DATA *pObjIndex = NULL; if( IS_SET( pRoomIndex->room_flags, ROOM_TRADE ) ) vnum = MOB_VNUM_TRADER; if( IS_SET( pRoomIndex->room_flags, ROOM_SUPPLY ) ) vnum = MOB_VNUM_SUPPLIER; if( IS_SET( pRoomIndex->room_flags, ROOM_PAWN ) ) vnum = MOB_VNUM_PAWNER; if( IS_SET( pRoomIndex->room_flags, ROOM_RESTAURANT ) ) vnum = MOB_VNUM_WAITER; if( IS_SET( pRoomIndex->room_flags, ROOM_GARAGE ) ) vnum = MOB_VNUM_MECHANIC; if( IS_SET( pRoomIndex->room_flags, ROOM_CONTROL ) ) vnum = MOB_VNUM_CONTROLLER; if( IS_SET( pRoomIndex->room_flags, ROOM_BAR ) ) vnum = MOB_VNUM_BARTENDER; if( IS_SET( pRoomIndex->room_flags, ROOM_SHIPYARD ) ) vnum = MOB_VNUM_TECHNICIAN; if( IS_SET( pRoomIndex->room_flags, ROOM_EMPLOYMENT ) ) vnum = MOB_VNUM_JOB_OFFICER; if( vnum > 0 ) { found = FALSE; for( mob = pRoomIndex->first_person; mob; mob = mob->next_in_room ) { if( IS_NPC( mob ) && mob->pIndexData && mob->pIndexData->vnum == vnum ) found = TRUE; } if( !found ) { if( !( pMobIndex = get_mob_index( vnum ) ) ) { bug( "Reset_all: Missing mob (%d)", vnum ); return; } mob = create_mobile( pMobIndex ); SET_BIT( mob->act, ACT_CITIZEN ); if( room_is_dark( pRoomIndex ) ) SET_BIT( mob->affected_by, AFF_INFRARED ); char_to_room( mob, pRoomIndex ); if( pRoomIndex->area && pRoomIndex->area->planet ) pRoomIndex->area->planet->population++; if( ( IS_SET( pRoomIndex->room_flags, ROOM_NOPEDIT ) && vnum == MOB_VNUM_TRADER ) || vnum == MOB_VNUM_SUPPLIER ) { if( vnum != MOB_VNUM_SUPPLIER || number_bits( 1 ) == 0 ) { if( !( pObjIndex = get_obj_index( OBJ_VNUM_LIGHT ) ) ) { bug( "Reset_all: Missing default light (%d)", OBJ_VNUM_LIGHT ); return; } obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } if( vnum != MOB_VNUM_SUPPLIER || number_bits( 1 ) == 0 ) { if( !( pObjIndex = get_obj_index( OBJ_VNUM_COMLINK ) ) ) { bug( "Reset_all: Missing default comlink (%d)", OBJ_VNUM_COMLINK ); return; } obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } if( vnum != MOB_VNUM_SUPPLIER || number_bits( 1 ) == 0 ) { if( !( pObjIndex = get_obj_index( OBJ_VNUM_CANTEEN ) ) ) { bug( "Reset_all: Missing default canteen (%d)", OBJ_VNUM_CANTEEN ); return; } obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } if( vnum != MOB_VNUM_SUPPLIER || number_bits( 1 ) == 0 ) { if( !( pObjIndex = get_obj_index( OBJ_VNUM_SHOVEL ) ) ) { bug( "Reset_all: Missing default shovel (%d)", OBJ_VNUM_SHOVEL ); return; } obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } } if( vnum == MOB_VNUM_SUPPLIER ) { if( number_bits( 1 ) == 0 ) { if( ( pObjIndex = get_obj_index( OBJ_VNUM_BATTERY ) ) ) { obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } } if( number_bits( 1 ) == 0 ) { if( !( pObjIndex = get_obj_index( OBJ_VNUM_BACKPACK ) ) ) { obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } } if( number_bits( 1 ) == 0 ) { if( ( pObjIndex = get_obj_index( OBJ_VNUM_AMMO ) ) ) { obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } } if( number_bits( 1 ) == 0 ) { if( ( pObjIndex = get_obj_index( OBJ_VNUM_SCHOOL_DAGGER ) ) ) { obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } } if( number_bits( 1 ) == 0 ) { if( ( pObjIndex = get_obj_index( OBJ_VNUM_BLASTER ) ) ) { obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } } onum = number_range( OBJ_VNUM_FIRST_PART, OBJ_VNUM_LAST_PART ); if( ( pObjIndex = get_obj_index( onum ) ) ) { obj = create_object( pObjIndex ); obj = obj_to_char( obj, mob ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); } } if( vnum == MOB_VNUM_WAITER ) { if( ( pObjIndex = get_obj_index( OBJ_VNUM_APPETIZER ) ) ) { obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } if( ( pObjIndex = get_obj_index( OBJ_VNUM_SALAD ) ) ) { obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } if( ( pObjIndex = get_obj_index( OBJ_VNUM_LUNCH ) ) ) { obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } if( ( pObjIndex = get_obj_index( OBJ_VNUM_DINNER ) ) ) { obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } if( ( pObjIndex = get_obj_index( OBJ_VNUM_GLASSOFWATER ) ) ) { obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } if( ( pObjIndex = get_obj_index( OBJ_VNUM_COFFEE ) ) ) { obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } } if( vnum == MOB_VNUM_BARTENDER ) { if( ( pObjIndex = get_obj_index( OBJ_VNUM_BEER ) ) ) { obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } if( ( pObjIndex = get_obj_index( OBJ_VNUM_WHISKEY ) ) ) { obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } if( ( pObjIndex = get_obj_index( OBJ_VNUM_GLASSOFWATER ) ) ) { obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } if( ( pObjIndex = get_obj_index( OBJ_VNUM_COFFEE ) ) ) { obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } } } } } static void reset_object_by_room_type( ROOM_INDEX_DATA * pRoomIndex ) { OBJ_DATA *obj = NULL; OBJ_INDEX_DATA *pObjIndex = NULL; if( IS_SET( pRoomIndex->room_flags, ROOM_MAIL ) ) { if( !( pObjIndex = get_obj_index( OBJ_VNUM_MAIL_TERMINAL ) ) ) { bug( "Reset_all: Missing mail terminal (%d)", OBJ_VNUM_MAIL_TERMINAL ); return; } if( count_obj_list( pObjIndex, pRoomIndex->first_content ) <= 0 ) { obj = create_object( pObjIndex ); obj_to_room( obj, pRoomIndex ); } } if( IS_SET( pRoomIndex->room_flags, ROOM_INFO ) ) { if( !( pObjIndex = get_obj_index( OBJ_VNUM_MESSAGE_TERMINAL ) ) ) { bug( "Reset_all: Missing message terminal (%d)", OBJ_VNUM_MESSAGE_TERMINAL ); return; } if( count_obj_list( pObjIndex, pRoomIndex->first_content ) <= 0 ) { obj = create_object( pObjIndex ); obj_to_room( obj, pRoomIndex ); } } } static void reset_hidden_food_and_resources( ROOM_INDEX_DATA * pRoomIndex ) { if( pRoomIndex->sector_type != SECT_CITY && pRoomIndex->sector_type != SECT_WATER_NOSWIM && pRoomIndex->sector_type != SECT_WATER_SWIM && pRoomIndex->sector_type != SECT_UNDERWATER && pRoomIndex->sector_type != SECT_DUNNO && pRoomIndex->sector_type != SECT_AIR && pRoomIndex->sector_type != SECT_INSIDE && pRoomIndex->sector_type != SECT_GLACIAL && !pRoomIndex->last_content && number_bits( 3 ) == 0 ) { int anumber = number_bits( 2 ); int vnum = 0; OBJ_DATA *obj = NULL; OBJ_INDEX_DATA *pObjIndex = NULL; switch ( pRoomIndex->sector_type ) { default: if( anumber <= 1 ) vnum = OBJ_VNUM_PLANT; else vnum = OBJ_VNUM_HEMP; break; case SECT_FARMLAND: if( anumber == 0 ) vnum = OBJ_VNUM_FRUIT; else if( anumber == 1 ) vnum = OBJ_VNUM_ROOT; else if( anumber == 2 ) vnum = OBJ_VNUM_MUSHROOM; else vnum = OBJ_VNUM_PLANT; break; case SECT_FOREST: case SECT_BRUSH: case SECT_SCRUB: if( anumber <= 1 ) vnum = OBJ_VNUM_ROOT; else vnum = OBJ_VNUM_HEMP; break; case SECT_RAINFOREST: case SECT_JUNGLE: if( anumber <= 1 ) vnum = OBJ_VNUM_FRUIT; else vnum = OBJ_VNUM_RESIN; break; case SECT_MOUNTAIN: case SECT_UNDERGROUND: case SECT_ROCKY: case SECT_TUNDRA: case SECT_VOLCANIC: if( anumber == 0 ) vnum = OBJ_VNUM_MUSHROOM; else if( anumber == 1 ) vnum = OBJ_VNUM_CRYSTAL; else if( anumber == 2 ) vnum = OBJ_VNUM_METAL; else vnum = OBJ_VNUM_GOLD; break; case SECT_SWAMP: if( anumber <= 1 ) vnum = OBJ_VNUM_SEAWEED; else vnum = OBJ_VNUM_RESIN; break; case SECT_OCEANFLOOR: if( anumber <= 1 ) vnum = OBJ_VNUM_SEAWEED; else vnum = OBJ_VNUM_CRYSTAL; break; } if( !( pObjIndex = get_obj_index( vnum ) ) ) { bug( "Reset_all: Missing obj (%d)", vnum ); return; } obj = create_object( pObjIndex ); if( pRoomIndex->sector_type != SECT_FARMLAND ) { if( vnum == OBJ_VNUM_ROOT || vnum == OBJ_VNUM_CRYSTAL || vnum == OBJ_VNUM_GOLD || vnum == OBJ_VNUM_METAL ) SET_BIT( obj->extra_flags, ITEM_BURRIED ); else SET_BIT( obj->extra_flags, ITEM_HIDDEN ); } if( vnum == OBJ_VNUM_GOLD ) { obj->value[0] = number_range( 1, 10 ); obj->value[1] = obj->value[0]; obj->cost = obj->value[0] * 10; } obj_to_room( obj, pRoomIndex ); } } static void reset_random_colonists( ROOM_INDEX_DATA * pRoomIndex ) { if( IS_SET( pRoomIndex->room_flags, ROOM_NO_MOB ) ) return; if( number_bits( 1 ) != 0 ) return; if( pRoomIndex->sector_type == SECT_CITY ) { MOB_INDEX_DATA *pMobIndex = NULL; CHAR_DATA *mob = NULL; if( pRoomIndex->area->planet->population >= max_population( pRoomIndex->area->planet ) ) return; if( number_bits( 5 ) == 0 ) { if( ( pMobIndex = get_mob_index( MOB_VNUM_VENDOR ) ) ) { int rep = 0; OBJ_INDEX_DATA *pObjIndex = NULL; mob = create_mobile( pMobIndex ); SET_BIT( mob->act, ACT_CITIZEN ); char_to_room( mob, pRoomIndex ); pRoomIndex->area->planet->population++; for( rep = 0; rep < 3; rep++ ) { if( ( pObjIndex = get_obj_index( number_range ( OBJ_VNUM_FIRST_FABRIC, OBJ_VNUM_LAST_FABRIC ) ) ) ) { OBJ_DATA *obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } } if( ( pObjIndex = get_obj_index( OBJ_VNUM_SEWKIT ) ) ) { OBJ_DATA *obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } return; } } if( number_bits( 6 ) == 0 ) { if( ( pMobIndex = get_mob_index( MOB_VNUM_DEALER ) ) ) { OBJ_INDEX_DATA *pObjIndex = NULL; mob = create_mobile( pMobIndex ); SET_BIT( mob->act, ACT_CITIZEN ); char_to_room( mob, pRoomIndex ); pRoomIndex->area->planet->population++; if( ( pObjIndex = get_obj_index( OBJ_VNUM_BLACK_POWDER ) ) ) { OBJ_DATA *obj = create_object( pObjIndex ); SET_BIT( obj->extra_flags, ITEM_INVENTORY ); obj = obj_to_char( obj, mob ); } return; } } if( number_bits( 6 ) == 0 ) { int mnum = 0; switch ( number_bits( 2 ) ) { default: mnum = MOB_VNUM_BUM; break; case 0: mnum = MOB_VNUM_THUG; break; case 1: mnum = MOB_VNUM_THIEF; break; } if( ( pMobIndex = get_mob_index( mnum ) ) ) { mob = create_mobile( pMobIndex ); SET_BIT( mob->act, ACT_CITIZEN ); char_to_room( mob, pRoomIndex ); pRoomIndex->area->planet->population++; return; } } if( !( pMobIndex = get_mob_index( MOB_VNUM_CITIZEN ) ) ) { bug( "Reset_all: Missing default colonist (%d)", MOB_VNUM_CITIZEN ); return; } mob = create_mobile( pMobIndex ); SET_BIT( mob->act, ACT_CITIZEN ); mob->sex = number_bits( 1 ) + 1; STRFREE( mob->long_descr ); if( mob->sex == 2 ) switch ( number_bits( 4 ) ) { default: mob->long_descr = STRALLOC( "A colonist is going about her daily business.\r\n" ); break; case 0: mob->long_descr = STRALLOC( "A wealthy colonist is dressed in fine silks.\r\n" ); mob->gold = number_range( 1, 100 ); break; case 1: mob->long_descr = STRALLOC ( "A young colonist smiles at you as she walks by.\r\n" ); break; case 2: mob->long_descr = STRALLOC( "A young schoolgirl is skipping.\r\n" ); break; case 3: mob->long_descr = STRALLOC ( "A colonist is dressed in formal business attire.\r\n" ); mob->gold = number_range( 20, 50 ); break; case 4: mob->long_descr = STRALLOC( "An elderly colonist strolls by.\r\n" ); mob->gold = number_range( 20, 50 ); break; } else switch ( number_bits( 3 ) ) { default: mob->long_descr = STRALLOC( "A colonist is going about his daily business.\r\n" ); break; case 0: mob->long_descr = STRALLOC ( "A wealthy colonist is dressed in fine silk robes.\r\n" ); mob->gold = number_range( 1, 100 ); break; case 1: mob->long_descr = STRALLOC( "A young colonist is just hanging out.\r\n" ); break; case 2: mob->long_descr = STRALLOC( "A young boy is kicking a small stone around.\r\n" ); break; case 3: mob->long_descr = STRALLOC( "A businessman looks to be in a hurry.\r\n" ); mob->gold = number_range( 20, 50 ); break; case 4: mob->long_descr = STRALLOC( "An elderly colonist strolls by.\r\n" ); mob->gold = number_range( 20, 50 ); break; } char_to_room( mob, pRoomIndex ); pRoomIndex->area->planet->population++; return; } } static void reset_random_wildlife( ROOM_INDEX_DATA * pRoomIndex ) { MOB_INDEX_DATA *pMobIndex = NULL; CHAR_DATA *mob = NULL; OBJ_INDEX_DATA *pObjIndex = NULL; OBJ_DATA *obj = NULL; int vnum = 0; int anumber = 0; if( pRoomIndex->area->planet->wildlife > pRoomIndex->area->planet->wilderness ) return; if( pRoomIndex->sector_type > SECT_CITY && number_bits( 16 ) == 0 ) { if( ( pMobIndex = get_mob_index( MOB_VNUM_DRAGON ) ) ) { mob = create_mobile( pMobIndex ); SET_BIT( mob->act, ACT_CITIZEN ); char_to_room( mob, pRoomIndex ); pRoomIndex->area->planet->population++; if( ( pObjIndex = get_obj_index( OBJ_VNUM_DRAGON_NEST ) ) ) { OBJ_DATA *nest = create_object( pObjIndex ); nest = obj_to_room( nest, pRoomIndex ); if( ( pObjIndex = get_obj_index( OBJ_VNUM_DRAGON_CRYSTAL ) ) ) { obj = create_object( pObjIndex ); obj = obj_to_obj( obj, nest ); } } return; } } anumber = number_bits( 3 ); switch ( pRoomIndex->sector_type ) { default: return; break; case SECT_WATER_SWIM: if( anumber == 0 ) vnum = MOB_VNUM_INSECT; else if( anumber == 1 ) vnum = MOB_VNUM_BIRD; else vnum = MOB_VNUM_FISH; break; case SECT_OCEANFLOOR: case SECT_UNDERWATER: vnum = MOB_VNUM_FISH; break; case SECT_AIR: if( anumber == 0 ) vnum = MOB_VNUM_INSECT; else vnum = MOB_VNUM_BIRD; break; case SECT_VOLCANIC: case SECT_UNDERGROUND: case SECT_DESERT: if( anumber == 0 ) vnum = MOB_VNUM_INSECT; else vnum = MOB_VNUM_SCAVENGER; break; case SECT_MOUNTAIN: case SECT_SCRUB: case SECT_ROCKY: if( anumber == 0 ) vnum = MOB_VNUM_INSECT; else if( anumber == 1 ) vnum = MOB_VNUM_SMALL_ANIMAL; else if( anumber == 2 ) vnum = MOB_VNUM_SCAVENGER; else if( anumber == 3 ) vnum = MOB_VNUM_PREDITOR; else vnum = MOB_VNUM_BIRD; break; case SECT_FIELD: case SECT_FOREST: case SECT_HILLS: case SECT_SAVANNA: case SECT_BRUSH: case SECT_STEPPE: if( anumber == 0 ) vnum = MOB_VNUM_INSECT; else if( anumber == 1 ) vnum = MOB_VNUM_BIRD; else if( anumber == 2 ) vnum = MOB_VNUM_SCAVENGER; else if( anumber == 3 ) vnum = MOB_VNUM_PREDITOR; else vnum = MOB_VNUM_SMALL_ANIMAL; break; case SECT_TUNDRA: if( anumber == 0 ) vnum = MOB_VNUM_SMALL_ANIMAL; else if( anumber == 2 ) vnum = MOB_VNUM_SCAVENGER; else if( anumber == 3 ) vnum = MOB_VNUM_PREDITOR; else vnum = MOB_VNUM_BIRD; break; case SECT_RAINFOREST: case SECT_JUNGLE: case SECT_SWAMP: case SECT_WETLANDS: if( anumber == 0 ) vnum = MOB_VNUM_SMALL_ANIMAL; else if( anumber == 1 ) vnum = MOB_VNUM_BIRD; else if( anumber == 2 ) vnum = MOB_VNUM_SCAVENGER; else if( anumber == 3 ) vnum = MOB_VNUM_PREDITOR; else vnum = MOB_VNUM_INSECT; break; } if( !( pMobIndex = get_mob_index( vnum ) ) ) { bug( "Reset_all: Missing mob (%d)", vnum ); return; } mob = create_mobile( pMobIndex ); REMOVE_BIT( mob->act, ACT_CITIZEN ); if( room_is_dark( pRoomIndex ) ) SET_BIT( mob->affected_by, AFF_INFRARED ); char_to_room( mob, pRoomIndex ); pRoomIndex->area->planet->wildlife++; } static void reset_barracks( ROOM_INDEX_DATA * pRoomIndex ) { if( IS_SET( pRoomIndex->room_flags, ROOM_BARRACKS ) && pRoomIndex->area && pRoomIndex->area->planet ) { CHAR_DATA *mob = NULL; MOB_INDEX_DATA *pMobIndex = NULL; int guard_count = 0; OBJ_INDEX_DATA *pObjIndex = NULL; GUARD_DATA *guard = NULL; if( !( pMobIndex = get_mob_index( MOB_VNUM_PATROL ) ) ) { bug( "Reset_all: Missing default patrol (%d)", MOB_VNUM_PATROL ); return; } for( guard = pRoomIndex->area->planet->first_guard; guard; guard = guard->next_on_planet ) guard_count++; if( pRoomIndex->area->planet->barracks * 5 <= guard_count ) return; mob = create_mobile( pMobIndex ); char_to_room( mob, pRoomIndex ); mob->top_level = 10; mob->hit = 100; mob->max_hit = 100; mob->armor = 50; mob->damroll = 0; mob->hitroll = 20; if( ( pObjIndex = get_obj_index( OBJ_VNUM_BLASTER ) ) != NULL ) { OBJ_DATA *blaster = create_object( pObjIndex ); obj_to_char( blaster, mob ); equip_char( mob, blaster, WEAR_WIELD ); } do_setblaster( mob, STRLIT_FULL ); CREATE( guard, GUARD_DATA, 1 ); guard->planet = pRoomIndex->area->planet; LINK( guard, guard->planet->first_guard, guard->planet->last_guard, next_on_planet, prev_on_planet ); LINK( guard, first_guard, last_guard, next, prev ); guard->mob = mob; guard->reset_loc = pRoomIndex; mob->guard_data = guard; if( room_is_dark( pRoomIndex ) ) SET_BIT( mob->affected_by, AFF_INFRARED ); if( pRoomIndex->area->planet->governed_by ) { char tmpbuf[MAX_STRING_LENGTH]; sprintf( tmpbuf, "A soldier patrols the area. (%s)\r\n", pRoomIndex->area->planet->governed_by->name ); STRFREE( mob->long_descr ); mob->long_descr = STRALLOC( tmpbuf ); mob->mob_clan = pRoomIndex->area->planet->governed_by; } } } static void reset_shipyard( ROOM_INDEX_DATA * pRoomIndex ) { if( ( IS_SET( pRoomIndex->room_flags, ROOM_SHIPYARD ) || IS_SET( pRoomIndex->room_flags, ROOM_CAN_LAND ) ) && pRoomIndex->area && pRoomIndex->area->planet ) { CHAR_DATA *rch = NULL; int numguards = 0; MOB_INDEX_DATA *pMobIndex = NULL; CHAR_DATA *mob = NULL; if( !( pMobIndex = get_mob_index( MOB_VNUM_GUARD ) ) ) { bug( "Reset_all: Missing default guard (%d)", MOB_VNUM_GUARD ); return; } for( rch = pRoomIndex->first_person; rch; rch = rch->next_in_room ) if( IS_NPC( rch ) && rch->pIndexData && rch->pIndexData->vnum == MOB_VNUM_GUARD ) numguards++; if( numguards >= 2 ) return; mob = create_mobile( pMobIndex ); char_to_room( mob, pRoomIndex ); mob->top_level = 100; mob->hit = 500; mob->max_hit = 500; mob->armor = 0; mob->damroll = 0; mob->hitroll = 20; if( room_is_dark( pRoomIndex ) ) SET_BIT( mob->affected_by, AFF_INFRARED ); if( pRoomIndex->area->planet->governed_by ) { char tmpbuf[MAX_STRING_LENGTH]; sprintf( tmpbuf, "A Platform Security Guard stands alert and ready for trouble. (%s)\r\n", pRoomIndex->area->planet->governed_by->name ); STRFREE( mob->long_descr ); mob->long_descr = STRALLOC( tmpbuf ); mob->mob_clan = pRoomIndex->area->planet->governed_by; } } } /* * Reset everything. */ void reset_all() { ROOM_INDEX_DATA *pRoomIndex = NULL; int iHash = 0; /* natural disasters */ reset_make_random_disaster(); for( iHash = 0; iHash < MAX_KEY_HASH; iHash++ ) { for( pRoomIndex = room_index_hash[iHash]; pRoomIndex; pRoomIndex = pRoomIndex->next ) { reset_room( pRoomIndex ); } } } void reset_room( ROOM_INDEX_DATA *pRoomIndex ) { reset_room_lock_doors( pRoomIndex ); reset_respawn_planetary_fleet( pRoomIndex ); reset_mobile_by_room_type( pRoomIndex ); reset_object_by_room_type( pRoomIndex ); reset_barracks( pRoomIndex ); reset_shipyard( pRoomIndex ); if( !pRoomIndex->area->planet ) return; reset_hidden_food_and_resources( pRoomIndex ); reset_random_colonists( pRoomIndex ); reset_random_wildlife( pRoomIndex ); } SHIP_DATA *make_mob_ship( PLANET_DATA * planet, int ship_model ) { SHIP_DATA *ship; int shipreg = 0; char filename[10]; char shipname[MAX_STRING_LENGTH]; if( !planet || !planet->governed_by || !planet->starsystem ) return NULL; /* mobships are given filenames < 0 and are not saved */ for( ship = first_ship; ship; ship = ship->next ) if( shipreg > atoi( ship->filename ) ) shipreg = atoi( ship->filename ); shipreg--; sprintf( filename, "%d", shipreg ); ship = ship_create(); LINK( ship, first_ship, last_ship, next, prev ); ship->filename = str_dup( filename ); ship->home = STRALLOC( planet->starsystem->name ); ship->owner = STRALLOC( planet->governed_by->name ); ship->pilot = STRALLOC( "" ); ship->copilot = STRALLOC( "" ); ship->type = MOB_SHIP; ship->model = ship_model; ship->tractorbeam = 2; switch ( ship->model ) { case MOB_BATTLESHIP: ship->realspeed = 25; ship->maxmissiles = 50; ship->lasers = 10; ship->maxenergy = 30000; ship->maxshield = 1000; ship->maxhull = 30000; ship->manuever = 25; sprintf( shipname, "Battlecruiser m%d (%s)", 0 - shipreg, planet->governed_by->name ); break; case MOB_CRUISER: ship->realspeed = 50; ship->maxmissiles = 30; ship->lasers = 8; ship->maxenergy = 15000; ship->maxshield = 350; ship->maxhull = 10000; ship->manuever = 50; sprintf( shipname, "Cruiser m%d (%s)", 0 - shipreg, planet->governed_by->name ); break; case MOB_DESTROYER: ship->realspeed = 100; ship->maxmissiles = 20; ship->lasers = 6; ship->maxenergy = 7500; ship->maxshield = 200; ship->maxhull = 2000; ship->manuever = 100; ship->hyperspeed = 100; sprintf( shipname, "Corvette m%d (%s)", 0 - shipreg, planet->governed_by->name ); break; default: ship->realspeed = 255; ship->maxmissiles = 0; ship->lasers = 2; ship->maxenergy = 2500; ship->maxshield = 0; ship->maxhull = 100; ship->manuever = 100; sprintf( shipname, "Patrol Starfighter m%d (%s)", 0 - shipreg, planet->governed_by->name ); break; } ship->name = STRALLOC( shipname ); ship->hull = ship->maxhull; ship->missiles = ship->maxmissiles; ship->energy = ship->maxenergy; ship->shield = 0; ship_to_starsystem( ship, starsystem_from_name( ship->home ) ); vector_copy( &ship->pos, &planet->pos ); vector_randomize( &ship->pos, -2000, 2000 ); ship->shipstate = SHIP_READY; ship->autopilot = TRUE; ship->autorecharge = TRUE; ship->shield = ship->maxshield; return ship; }