#include <sys/types.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <time.h> #include "mud.h" ROOM_INDEX_DATA * room_index_hash [MAX_KEY_HASH]; SHIP_DATA * make_mob_ship( PLANET_DATA *planet , int model ); void resetship args( ( SHIP_DATA *ship ) ); void do_reset( CHAR_DATA * ch , char * argument ) { reset_all(); } /* * Reset everything. */ void reset_all( ) { ROOM_INDEX_DATA *pRoomIndex; int iHash; CHAR_DATA * mob = NULL; MOB_INDEX_DATA *pMobIndex = NULL; OBJ_INDEX_DATA *pObjIndex = NULL; OBJ_DATA * obj = NULL; EXIT_DATA *xit; bool found = FALSE; int vnum, anumber, onum; /* natural disasters */ { PLANET_DATA * dPlanet = NULL; int pCount = 0; int rCount; 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 ) { switch ( number_bits( 2 ) ) { case 0: 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 ) { int mCount; char dBuf[MAX_STRING_LENGTH]; if ( (pMobIndex = get_mob_index(MOB_VNUM_ALIEN)) ) { 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++ ) { 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, mob->top_level ); obj_to_char( obj, mob ); equip_char( mob, obj, WEAR_WIELD ); } do_setblaster( mob , "full" ); } } } break; default: break; } } } for ( iHash = 0; iHash < MAX_KEY_HASH; iHash++ ) { for ( pRoomIndex = room_index_hash[iHash]; pRoomIndex; pRoomIndex = pRoomIndex->next ) { vnum = 0; onum = 0; 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 ); } if ( IS_SET(pRoomIndex->room_flags, ROOM_CONTROL ) && pRoomIndex->area && pRoomIndex->area->planet && pRoomIndex->area->planet->starsystem && pRoomIndex->area->planet->governed_by ) { SPACE_DATA * system = pRoomIndex->area->planet->starsystem; SHIP_DATA * ship; int numpatrols = 0; int numdestroyers = 0; int numbattleships = 0; int numcruisers = 0; int fleetsize = 0; for ( ship = system->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 ); } 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, 1); 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, 1); 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, 1); 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, 1); 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, 1); 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, 1); 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, 1); 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, 1); 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, 1); 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, 1); 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, 1); 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, 1); 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, 1); 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, 1); 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, 1); 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, 1); 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, 1); 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, 1); 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, 1); 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, 1); SET_BIT(obj->extra_flags, ITEM_INVENTORY); obj = obj_to_char(obj, mob); } } } } 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, 1); 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, 1); obj_to_room(obj, pRoomIndex); } } if ( IS_SET( pRoomIndex->room_flags, ROOM_BARRACKS ) && pRoomIndex->area && pRoomIndex->area->planet) { int guard_count = 0; OBJ_DATA * blaster; GUARD_DATA * guard; char tmpbuf[MAX_STRING_LENGTH]; if ( !(pMobIndex = get_mob_index(MOB_VNUM_PATROL)) ) { bug( "Reset_all: Missing default patrol (%d)", vnum ); return; } for ( guard = pRoomIndex->area->planet->first_guard ; guard ; guard = guard->next_on_planet ) guard_count++; if ( pRoomIndex->area->planet->barracks*5 <= guard_count ) continue; 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 ) { blaster = create_object( pObjIndex, mob->top_level ); obj_to_char( blaster, mob ); equip_char( mob, blaster, WEAR_WIELD ); } do_setblaster( mob , "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 ) { sprintf( tmpbuf , "A soldier patrols the area. (%s)\n\r" , pRoomIndex->area->planet->governed_by->name ); STRFREE( mob->long_descr ); mob->long_descr = STRALLOC( tmpbuf ); mob->mob_clan = pRoomIndex->area->planet->governed_by; } continue; } if ( ( IS_SET( pRoomIndex->room_flags, ROOM_SHIPYARD ) || IS_SET( pRoomIndex->room_flags, ROOM_CAN_LAND ) ) && pRoomIndex->area && pRoomIndex->area->planet) { char tmpbuf[MAX_STRING_LENGTH]; CHAR_DATA * rch; int numguards = 0; if ( !(pMobIndex = get_mob_index(MOB_VNUM_GUARD)) ) { bug( "Reset_all: Missing default guard (%d)", vnum ); 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 ) continue; 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 ) { sprintf( tmpbuf , "A Platform Security Guard stands alert and ready for trouble. (%s)\n\r" , pRoomIndex->area->planet->governed_by->name ); STRFREE( mob->long_descr ); mob->long_descr = STRALLOC( tmpbuf ); mob->mob_clan = pRoomIndex->area->planet->governed_by; } } /* hidden food & resources */ if ( !pRoomIndex->area || !pRoomIndex->area->planet ) continue; anumber = number_bits( 2 ); 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 ) { 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 , 1); 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); } /* random mobs start here */ if ( IS_SET( pRoomIndex->room_flags, ROOM_NO_MOB ) ) continue; if ( number_bits(1) != 0 ) continue; if ( pRoomIndex->sector_type == SECT_CITY ) { if ( pRoomIndex->area->planet->population >= max_population(pRoomIndex->area->planet) ) continue; if ( number_bits( 5 ) == 0 ) { if ( (pMobIndex = get_mob_index(MOB_VNUM_VENDOR)) ) { int rep; 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 = create_object(pObjIndex, 1); SET_BIT(obj->extra_flags, ITEM_INVENTORY); obj = obj_to_char(obj, mob); } if ( (pObjIndex = get_obj_index( OBJ_VNUM_SEWKIT ) ) ) { obj = create_object(pObjIndex, 1); SET_BIT(obj->extra_flags, ITEM_INVENTORY); obj = obj_to_char(obj, mob); } continue; } } if ( number_bits( 6 ) == 0 ) { if ( (pMobIndex = get_mob_index(MOB_VNUM_DEALER)) ) { 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 = create_object(pObjIndex, 1); SET_BIT(obj->extra_flags, ITEM_INVENTORY); obj = obj_to_char(obj, mob); } continue; } } if ( number_bits( 6 ) == 0 ) { int mnum; 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++; continue; } } if ( !(pMobIndex = get_mob_index(MOB_VNUM_CITIZEN)) ) { bug( "Reset_all: Missing default colonist (%d)", vnum ); 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.\n\r" ); break; case 0: mob->long_descr = STRALLOC( "A wealthy colonist is dressed in fine silks.\n\r" ); mob->gold = number_range( 1 , 100 ); break; case 1: mob->long_descr = STRALLOC( "A young colonist smiles at you as she walks by.\n\r" ); break; case 2: mob->long_descr = STRALLOC( "A young schoolgirl is skipping.\n\r" ); break; case 3: mob->long_descr = STRALLOC( "A colonist is dressed in formal business attire.\n\r" ); mob->gold = number_range( 20 , 50 ); break; case 4: mob->long_descr = STRALLOC( "An elderly colonist strolls by.\n\r" ); 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.\n\r" ); break; case 0: mob->long_descr = STRALLOC( "A wealthy colonist is dressed in fine silk robes.\n\r" ); mob->gold = number_range( 1 , 100 ); break; case 1: mob->long_descr = STRALLOC( "A young colonist is just hanging out.\n\r" ); break; case 2: mob->long_descr = STRALLOC( "A young boy is kicking a small stone around.\n\r" ); break; case 3: mob->long_descr = STRALLOC( "A businessman looks to be in a hurry.\n\r" ); mob->gold = number_range( 20 , 50 ); break; case 4: mob->long_descr = STRALLOC( "An elderly colonist strolls by.\n\r" ); mob->gold = number_range( 20 , 50 ); break; } char_to_room(mob, pRoomIndex); pRoomIndex->area->planet->population++; continue; } if ( pRoomIndex->area->planet->wildlife > pRoomIndex->area->planet->wilderness ) continue; if ( pRoomIndex->sector_type > SECT_CITY && number_bits( 16 ) == 0 ) { if ( (pMobIndex = get_mob_index(MOB_VNUM_DRAGON)) ) { OBJ_DATA * nest; 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 ) ) ) { nest = create_object(pObjIndex, 1); nest = obj_to_room(nest, pRoomIndex); if ( (pObjIndex = get_obj_index( OBJ_VNUM_DRAGON_CRYSTAL ) ) ) { obj = create_object(pObjIndex, 1); obj = obj_to_obj(obj, nest); } } continue; } } anumber = number_bits( 3 ); switch ( pRoomIndex->sector_type ) { default: continue; 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++; } } /* for ( pReset = first_reset; pReset; pReset = pReset->next ) { num++; switch( pReset->command ) { default: bug( "Reset_area: %d bad command %c.", num, pReset->command ); break; case 'M': if ( !(pMobIndex = get_mob_index(pReset->arg1)) ) { bug( "Reset_area: %d 'M': bad mob vnum %ld.", num, pReset->arg1 ); continue; } if ( !(pRoomIndex = get_room_index(pReset->arg3)) ) { bug( "Reset_area: %d 'M': bad room vnum %ld.", num, pReset->arg3 ); continue; } if ( pMobIndex->count >= pReset->arg2 ) { mob = NULL; break; } mob = create_mobile(pMobIndex); { ROOM_INDEX_DATA *pRoomPrev = get_room_index(pReset->arg3 - 1); if ( pRoomPrev && IS_SET(pRoomPrev->room_flags, ROOM_PET_SHOP) ) SET_BIT(mob->act, ACT_PET); } if ( room_is_dark(pRoomIndex) ) SET_BIT(mob->affected_by, AFF_INFRARED); char_to_room(mob, pRoomIndex); level = URANGE(0, mob->top_level - 2, LEVEL_AVATAR); if ( pRoomIndex->area->planet ) pRoomIndex->area->planet->population++; break; case 'G': case 'E': if ( !(pObjIndex = get_obj_index(pReset->arg1)) ) { bug( "Reset_area: %d 'E' or 'G': bad obj vnum %ld.", num, pReset->arg1 ); continue; } if ( !mob ) { lastobj = NULL; break; } if ( mob->pIndexData->pShop ) { int olevel = generate_itemlevel( pObjIndex ); obj = create_object(pObjIndex, olevel); SET_BIT(obj->extra_flags, ITEM_INVENTORY); } else obj = create_object(pObjIndex, number_fuzzy(level)); obj->level = URANGE(0, obj->level, LEVEL_AVATAR); obj = obj_to_char(obj, mob); if ( pReset->command == 'E' ) equip_char(mob, obj, pReset->arg3); lastobj = obj; break; case 'O': if ( !(pObjIndex = get_obj_index(pReset->arg1)) ) { bug( "Reset_area: %d 'O': bad obj vnum %ld.", num, pReset->arg1 ); continue; } if ( !(pRoomIndex = get_room_index(pReset->arg3)) ) { bug( "Reset_area: %d 'O': bad room vnum %ld.", num, pReset->arg3 ); continue; } if ( count_obj_list(pObjIndex, pRoomIndex->first_content) > 0 ) { obj = NULL; lastobj = NULL; break; } obj = create_object(pObjIndex, number_fuzzy(generate_itemlevel( pObjIndex))); obj->level = UMIN(obj->level, LEVEL_AVATAR); obj->cost = 0; obj_to_room(obj, pRoomIndex); lastobj = obj; break; case 'P': if ( !(pObjIndex = get_obj_index(pReset->arg1)) ) { bug( "Reset_area: %d 'P': bad obj vnum %ld.", num, pReset->arg1 ); continue; } if ( pReset->arg3 > 0 ) { if ( !(pObjToIndex = get_obj_index(pReset->arg3)) ) { bug( "Reset_area: %d 'P': bad objto vnum %ld.", num, pReset->arg3 ); continue; } if ( !(to_obj = get_obj_type(pObjToIndex)) || !to_obj->in_room || count_obj_list(pObjIndex, to_obj->first_content) > 0 ) { obj = NULL; break; } lastobj = to_obj; } else { int iNest; if ( !lastobj ) break; to_obj = lastobj; for ( iNest = 0; iNest < pReset->extra; iNest++ ) if ( !(to_obj = to_obj->last_content) ) { bug( "Reset_area: %d 'P': Invalid nesting obj %d.", num, pReset->arg1 ); iNest = -1; break; } if ( iNest < 0 ) continue; } obj = create_object(pObjIndex, number_fuzzy(UMAX(generate_itemlevel( pObjIndex),to_obj->level))); obj->level = UMIN(obj->level, LEVEL_AVATAR); obj_to_obj(obj, to_obj); break; case 'H': if ( pReset->arg1 > 0 ) { if ( !(pObjToIndex = get_obj_index(pReset->arg1)) ) { bug( "Reset_area: %d 'H': bad objto vnum %ld.", num, pReset->arg1 ); continue; } if ( !(to_obj = get_obj_type(pObjToIndex)) || !to_obj->in_room || IS_OBJ_STAT(to_obj, ITEM_HIDDEN) ) break; } else { if ( !lastobj || !obj ) break; to_obj = obj; } SET_BIT(to_obj->extra_flags, ITEM_HIDDEN); break; case 'B': switch(pReset->arg2 & BIT_RESET_TYPE_MASK) { case BIT_RESET_DOOR: { int doornum; if ( !(pRoomIndex = get_room_index(pReset->arg1)) ) { bug( "Reset_area: %d 'B': door: bad room vnum %ld.", num, pReset->arg1 ); continue; } doornum = (pReset->arg2 & BIT_RESET_DOOR_MASK) >> BIT_RESET_DOOR_THRESHOLD; if ( !(pexit = get_exit(pRoomIndex, doornum)) ) break; plc = &pexit->exit_info; } break; case BIT_RESET_ROOM: if ( !(pRoomIndex = get_room_index(pReset->arg1)) ) { bug( "Reset_area: %d 'B': room: bad room vnum %ld.", num, pReset->arg1 ); continue; } plc = &pRoomIndex->room_flags; break; case BIT_RESET_OBJECT: if ( pReset->arg1 > 0 ) { if ( !(pObjToIndex = get_obj_index(pReset->arg1)) ) { bug( "Reset_area: %d 'B': object: bad objto vnum %ld.", num, pReset->arg1 ); continue; } if ( !(to_obj = get_obj_type(pObjToIndex)) || !to_obj->in_room ) continue; } else { if ( !lastobj || !obj ) continue; to_obj = obj; } plc = &to_obj->extra_flags; break; case BIT_RESET_MOBILE: if ( !mob ) continue; plc = &mob->affected_by; break; default: bug( "Reset_area: %d 'B': bad options %d.", num, pReset->arg2 ); continue; } if ( IS_SET(pReset->arg2, BIT_RESET_SET) ) SET_BIT(*plc, pReset->arg3); else if ( IS_SET(pReset->arg2, BIT_RESET_TOGGLE) ) TOGGLE_BIT(*plc, pReset->arg3); else REMOVE_BIT(*plc, pReset->arg3); break; case 'D': if ( !(pRoomIndex = get_room_index(pReset->arg1)) ) { bug( "Reset_area: %d 'D': bad room vnum %ld.", num, pReset->arg1 ); continue; } if ( !(pexit = get_exit(pRoomIndex, pReset->arg2)) ) break; switch( pReset->arg3 ) { case 0: REMOVE_BIT(pexit->exit_info, EX_CLOSED); REMOVE_BIT(pexit->exit_info, EX_LOCKED); break; case 1: SET_BIT( pexit->exit_info, EX_CLOSED); REMOVE_BIT(pexit->exit_info, EX_LOCKED); if ( IS_SET(pexit->exit_info, EX_xSEARCHABLE) ) SET_BIT( pexit->exit_info, EX_SECRET); break; case 2: SET_BIT( pexit->exit_info, EX_CLOSED); SET_BIT( pexit->exit_info, EX_LOCKED); if ( IS_SET(pexit->exit_info, EX_xSEARCHABLE) ) SET_BIT( pexit->exit_info, EX_SECRET); break; } break; case 'R': if ( !(pRoomIndex = get_room_index(pReset->arg1)) ) { bug( "Reset_area: %d 'R': bad room vnum %ld.", num, pReset->arg1 ); continue; } randomize_exits(pRoomIndex, pReset->arg2-1); break; } } return; */ } SHIP_DATA * make_mob_ship( PLANET_DATA *planet , int model ) { SHIP_DATA *ship; int shipreg = 0; int dIndex = 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 ); CREATE( ship, SHIP_DATA, 1 ); LINK( ship, first_ship, last_ship, next, prev ); ship->filename = str_dup( filename ) ; ship->next_in_starsystem = NULL; ship->prev_in_starsystem =NULL; ship->next_in_room = NULL; ship->prev_in_room = NULL; ship->first_turret = NULL; ship->last_turret = NULL; ship->first_hanger = NULL; ship->last_hanger = NULL; ship->in_room = NULL; ship->starsystem = NULL; ship->home = STRALLOC( planet->starsystem->name ); for ( dIndex = 0 ; dIndex < MAX_SHIP_ROOMS ; dIndex++ ) ship->description[dIndex] = NULL; ship->owner = STRALLOC( planet->governed_by->name ); ship->pilot = STRALLOC(""); ship->copilot = STRALLOC(""); ship->dest = NULL; ship->type = MOB_SHIP; ship->class = 0; ship->model = model; ship->hyperspeed = 0; ship->laserstate = LASER_READY; ship->missilestate = MISSILE_READY; ship->tractorbeam = 2; ship->hatchopen = FALSE; ship->autotrack = FALSE; ship->autospeed = FALSE; ship->location = 0; ship->lastdoc = 0; ship->shipyard = 0; ship->collision = 0; ship->target = NULL; ship->currjump = NULL; ship->chaff = 0; ship->maxchaff = 0; ship->chaff_released = FALSE; 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) ); ship->vx = planet->x + number_range( -2000 , 2000 ); ship->vy = planet->y + number_range( -2000 , 2000 ); ship->vz = planet->z + number_range( -2000 , 2000 ); ship->shipstate = SHIP_READY; ship->autopilot = TRUE; ship->autorecharge = TRUE; ship->shield = ship->maxshield; return ship; }