#include <math.h>
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mud.h"
void add_reinforcements args( ( CHAR_DATA *ch ) );
ch_ret one_hit args( ( CHAR_DATA *ch, CHAR_DATA *victim, int dt ) );
int xp_compute ( CHAR_DATA *ch , CHAR_DATA *victim );
ROOM_INDEX_DATA *generate_exit( ROOM_INDEX_DATA *in_room, EXIT_DATA **pexit );
int ris_save( CHAR_DATA *ch, int chance, int ris );
void explode_emissile args( ( CHAR_DATA *ch, ROOM_INDEX_DATA *proom, int mindam, int maxdam, bool incendiary) );
CHAR_DATA *get_char_room_mp( CHAR_DATA *ch, char *argument );
/* from shops.c */
CHAR_DATA * find_keeper args( ( CHAR_DATA *ch ) );
extern int top_affect;
const char * sector_name [SECT_MAX] =
{
"inside", "city", "field", "forest", "hills", "mountain", "water swim", "water noswim",
"underwater", "air", "desert", "unknown", "ocean floor", "underground",
"scrub", "rocky", "savanna", "tundra", "glacial", "rainforest", "jungle",
"swamp", "wetlands", "brush", "steppe", "farmland", "volcanic"
};
void do_makeblade( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int level, chance, charge;
bool checktool, checkdura, checkbatt, checkoven;
OBJ_DATA *obj;
OBJ_INDEX_DATA *pObjIndex;
int vnum;
AFFECT_DATA *paf;
AFFECT_DATA *paf2;
strcpy( arg , argument );
switch( ch->substate )
{
default:
if ( arg[0] == '\0' )
{
send_to_char( "&RUsage: Makeblade <name>\n\r&w", ch);
return;
}
checktool = FALSE;
checkdura = FALSE;
checkbatt = FALSE;
checkoven = 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_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_DURASTEEL)
checkdura = TRUE;
if (obj->item_type == ITEM_BATTERY)
checkbatt = TRUE;
if (obj->item_type == ITEM_OVEN)
checkoven = TRUE;
}
if ( !checktool )
{
send_to_char( "&RYou need toolkit to make a vibro-blade.\n\r", ch);
return;
}
if ( !checkdura )
{
send_to_char( "&RYou need something to make it out of.\n\r", ch);
return;
}
if ( !checkbatt )
{
send_to_char( "&RYou need a power source for your blade.\n\r", ch);
return;
}
if ( !checkoven )
{
send_to_char( "&RYou need a small furnace to heat the metal.\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 crafting a vibroblade.\n\r", ch);
act( AT_PLAIN, "$n takes $s tools and a small oven and begins to work on something.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 25 , do_makeblade , 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 interupted and fail to finish your work.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
level = IS_NPC(ch) ? ch->top_level : (int) (0);
vnum = 66;
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;
checkoven = FALSE;
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_OVEN)
checkoven = TRUE;
if (obj->item_type == ITEM_DURASTEEL && checkdura == FALSE)
{
checkdura = TRUE;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
}
if (obj->item_type == ITEM_BATTERY && checkbatt == FALSE )
{
charge = UMAX( 5, obj->value[0] );
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkbatt = TRUE;
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (0) ;
if ( number_percent( ) > chance*2 || ( !checktool ) || ( !checkdura ) || ( !checkbatt ) || ( !checkoven ) )
{
send_to_char( "&RYou activate your newly created vibroblade.\n\r", ch);
send_to_char( "&RIt hums softly for a few seconds then begins to shake violently.\n\r", ch);
send_to_char( "&RIt finally shatters breaking apart into a dozen pieces.\n\r", ch);
return;
}
obj = create_object( pObjIndex, level );
obj->item_type = ITEM_WEAPON;
SET_BIT( obj->wear_flags, ITEM_WIELD );
SET_BIT( obj->wear_flags, ITEM_TAKE );
obj->level = level;
obj->weight = 3;
STRFREE( obj->name );
strcpy( buf, arg );
strcat( buf, " vibro-blade blade " );
strcat( buf, remand(buf));
obj->name = STRALLOC( buf );
strcpy( buf, arg );
STRFREE( obj->short_descr );
obj->short_descr = STRALLOC( buf );
STRFREE( obj->description );
strcat( buf, " was left here." );
obj->description = STRALLOC( buf );
CREATE( paf, AFFECT_DATA, 1 );
paf->type = -1;
paf->duration = -1;
paf->location = get_atype( "backstab" );
paf->modifier = level/3;
paf->bitvector = 0;
paf->next = NULL;
LINK( paf, obj->first_affect, obj->last_affect, next, prev );
++top_affect;
CREATE( paf2, AFFECT_DATA, 1 );
paf2->type = -1;
paf2->duration = -1;
paf2->location = get_atype( "hitroll" );
paf2->modifier = -2;
paf2->bitvector = 0;
paf2->next = NULL;
LINK( paf2, obj->first_affect, obj->last_affect, next, prev );
++top_affect;
obj->value[0] = INIT_WEAPON_CONDITION;
obj->value[1] = (int) (level/10+15); /* min dmg */
obj->value[2] = (int) (level/5+20); /* max dmg */
obj->value[3] = WEAPON_VIBRO;
obj->value[4] = charge;
obj->value[5] = charge;
obj->cost = obj->value[2]*10;
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish your work and hold up your newly created blade.&w\n\r", ch);
act( AT_PLAIN, "$n finishes crafting a vibro-blade.", ch,
NULL, argument , TO_ROOM );
return;
}
void do_makeblaster( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int level, chance;
bool checktool, checkdura, checkbatt, checkoven, checkcond, checkcirc, checkammo;
OBJ_DATA *obj;
OBJ_INDEX_DATA *pObjIndex;
int vnum, power, scope, ammo;
AFFECT_DATA *paf;
AFFECT_DATA *paf2;
strcpy( arg , argument );
switch( ch->substate )
{
default:
if ( arg[0] == '\0' )
{
send_to_char( "&RUsage: Makeblaster <name>\n\r&w", ch);
return;
}
checktool = FALSE;
checkdura = FALSE;
checkbatt = FALSE;
checkoven = FALSE;
checkcond = 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;
}
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_DURAPLAST)
checkdura = TRUE;
if (obj->item_type == ITEM_BATTERY)
checkbatt = TRUE;
if (obj->item_type == ITEM_OVEN)
checkoven = TRUE;
if (obj->item_type == ITEM_CIRCUIT)
checkcirc = TRUE;
if (obj->item_type == ITEM_SUPERCONDUCTOR)
checkcond = TRUE;
}
if ( !checktool )
{
send_to_char( "&RYou need toolkit to make a blaster.\n\r", ch);
return;
}
if ( !checkdura )
{
send_to_char( "&RYou need something to make it out of.\n\r", ch);
return;
}
if ( !checkbatt )
{
send_to_char( "&RYou need a power source for your blaster.\n\r", ch);
return;
}
if ( !checkoven )
{
send_to_char( "&RYou need a small furnace to heat the plastics.\n\r", ch);
return;
}
if ( !checkcirc )
{
send_to_char( "&RYou need a small circuit board to control the firing mechanism.\n\r", ch);
return;
}
if ( !checkcond )
{
send_to_char( "&RYou still need a small superconductor.\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 blaster.\n\r", ch);
act( AT_PLAIN, "$n takes $s tools and a small oven and begins to work on something.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 25 , do_makeblaster , 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 interupted and fail to finish your work.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
level = IS_NPC(ch) ? ch->top_level : (int) (0);
vnum = 50;
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;
}
checkammo= FALSE;
checktool = FALSE;
checkdura = FALSE;
checkbatt = FALSE;
checkoven = FALSE;
checkcond = FALSE;
checkcirc = FALSE;
power = 0;
scope = 0;
ammo = 0;
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_OVEN)
checkoven = TRUE;
if (obj->item_type == ITEM_DURAPLAST && checkdura == FALSE)
{
checkdura = TRUE;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
}
if (obj->item_type == ITEM_AMMO && checkammo == FALSE)
{
ammo = obj->value[0];
checkammo = TRUE;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
}
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_LENS && scope == 0)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
scope++;
}
if (obj->item_type == ITEM_SUPERCONDUCTOR && power<2)
{
power++;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkcond = TRUE;
}
if (obj->item_type == ITEM_CIRCUIT && checkcirc == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkcirc = TRUE;
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (0) ;
if ( number_percent( ) > chance*2 || ( !checktool ) || ( !checkdura ) || ( !checkbatt ) || ( !checkoven ) || ( !checkcond ) || ( !checkcirc) )
{
send_to_char( "&RYou hold up your new blaster and aim at a leftover piece of plastic.\n\r", ch);
send_to_char( "&RYou slowly squeeze the trigger hoping for the best...\n\r", ch);
send_to_char( "&RYour blaster backfires destroying your weapon and burning your hand.\n\r", ch);
return;
}
obj = create_object( pObjIndex, level );
obj->item_type = ITEM_WEAPON;
SET_BIT( obj->wear_flags, ITEM_WIELD );
SET_BIT( obj->wear_flags, ITEM_TAKE );
obj->level = level;
obj->weight = 2+level/10;
STRFREE( obj->name );
strcpy( buf , arg );
strcat( buf , " blaster ");
strcat( buf, remand(buf));
obj->name = STRALLOC( buf );
strcpy( buf, arg );
STRFREE( obj->short_descr );
obj->short_descr = STRALLOC( buf );
STRFREE( obj->description );
strcat( buf, " was carelessly misplaced here." );
obj->description = STRALLOC( buf );
CREATE( paf, AFFECT_DATA, 1 );
paf->type = -1;
paf->duration = -1;
paf->location = get_atype( "hitroll" );
paf->modifier = URANGE( 0, 1+scope, level/30 );
paf->bitvector = 0;
paf->next = NULL;
LINK( paf, obj->first_affect, obj->last_affect, next, prev );
++top_affect;
CREATE( paf2, AFFECT_DATA, 1 );
paf2->type = -1;
paf2->duration = -1;
paf2->location = get_atype( "damroll" );
paf2->modifier = URANGE( 0, power, level/30);
paf2->bitvector = 0;
paf2->next = NULL;
LINK( paf2, obj->first_affect, obj->last_affect, next, prev );
++top_affect;
obj->value[0] = INIT_WEAPON_CONDITION; /* condition */
obj->value[1] = (int) (level/10+15); /* min dmg */
obj->value[2] = (int) (level/5+25); /* max dmg */
obj->value[3] = WEAPON_BLASTER;
obj->value[4] = ammo;
obj->value[5] = 2000;
obj->cost = obj->value[2]*50;
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish your work and hold up your newly created blaster.&w\n\r", ch);
act( AT_PLAIN, "$n finishes making $s new blaster.", ch,
NULL, argument , TO_ROOM );
return;
}
void do_makelightsaber( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int chance, color;
bool checktool, checkdura, checkbatt,
checkoven, checkcond, checkcirc, checklens, checkgems, checkmirr,
dex_bonus;
OBJ_DATA *obj;
OBJ_INDEX_DATA *pObjIndex;
int vnum, level, gems, charge, gemtype;
int hitroll, mindam, maxdam;
int cry1, cry2, cry3;
AFFECT_DATA *paf;
AFFECT_DATA *paf2;
strcpy( arg, argument );
switch( ch->substate )
{
default:
checktool = FALSE;
checkdura = FALSE;
checkbatt = FALSE;
checkoven = FALSE;
checkcond = FALSE;
checkcirc = FALSE;
checklens = FALSE;
checkgems = FALSE;
checkmirr = FALSE;
if ( !IS_SET( ch->in_room->room_flags, ROOM_SAFE ) || !IS_SET( ch->in_room->room_flags, ROOM_SILENCE ))
{
send_to_char( "&RYou need to be in a quiet peaceful place to craft a lightsaber.\n\r", ch);
return;
}
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_LENS)
checklens = TRUE;
if (obj->item_type == ITEM_CRYSTAL)
checkgems = TRUE;
if (obj->item_type == ITEM_MIRROR)
checkmirr = TRUE;
if (obj->item_type == ITEM_DURAPLAST || obj->item_type == ITEM_DURASTEEL )
checkdura = TRUE;
if (obj->item_type == ITEM_BATTERY)
checkbatt = TRUE;
if (obj->item_type == ITEM_OVEN)
checkoven = TRUE;
if (obj->item_type == ITEM_CIRCUIT)
checkcirc = TRUE;
if (obj->item_type == ITEM_SUPERCONDUCTOR)
checkcond = TRUE;
}
if ( !checktool )
{
send_to_char( "&RYou need toolkit to make a lightsaber.\n\r", ch);
return;
}
if ( !checkdura )
{
send_to_char( "&RYou need something to make it out of.\n\r", ch);
return;
}
if ( !checkbatt )
{
send_to_char( "&RYou need a power source for your lightsaber.\n\r", ch);
return;
}
if ( !checkoven )
{
send_to_char( "&RYou need a small furnace to heat and shape the components.\n\r", ch);
return;
}
if ( !checkcirc )
{
send_to_char( "&RYou need a small circuit board.\n\r", ch);
return;
}
if ( !checkcond )
{
send_to_char( "&RYou still need a small superconductor for your lightsaber.\n\r", ch);
return;
}
if ( !checklens )
{
send_to_char( "&RYou still need a lens to focus the beam.\n\r", ch);
return;
}
if ( !checkgems )
{
send_to_char( "&RLightsabers require 1 to 3 gems to work properly.\n\r", ch);
return;
}
if ( !checkmirr )
{
send_to_char( "&RYou need a high intesity reflective cup to create a lightsaber.\n\r", ch);
return;
}
chance = IS_NPC(ch) ? ch->top_level
: (ch->skill_level[CRAFT_LIGHTSABER] + stat_table[get_curr_int(ch)].mod + number_range(1, 20) );
if ( 20 < chance )
{
send_to_char( "&bYou begin the difficult task of crafting a personal lightsaber.&w\n\r", ch);
act( AT_BLUE, "$n takes $s tools and a small oven and begins to work on something.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 25 , do_makelightsaber , 1 );
ch->dest_buf = str_dup(arg);
return;
}
send_to_char("&RYou can't seem to figure out how to construct a lightsaber.&w\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 interupted and fail to finish your work.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
level = IS_NPC(ch) ? ch->top_level : ch->top_level;
vnum = 72;
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;
checkoven = FALSE;
checkcond = FALSE;
checkcirc = FALSE;
checklens = FALSE;
checkgems = FALSE;
checkmirr = FALSE;
dex_bonus = FALSE;
gems = 0;
charge = 0;
gemtype =0;
mindam = 0;
hitroll = 1;
maxdam = 0;
cry1 = -1;
cry2 = -1;
cry3 = -1;
gemtype = -1;
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_OVEN)
checkoven = TRUE;
if ( (obj->item_type == ITEM_DURAPLAST || obj->item_type == ITEM_DURASTEEL) && checkdura == FALSE)
{
checkdura = TRUE;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
}
if (obj->item_type == ITEM_DURASTEEL && checkdura == FALSE)
{
checkdura = TRUE;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
}
if (obj->item_type == ITEM_BATTERY && checkbatt == FALSE)
{
charge = UMIN(obj->value[1], 10);
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkbatt = TRUE;
}
if (obj->item_type == ITEM_SUPERCONDUCTOR && checkcond == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkcond = TRUE;
}
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_LENS && checklens == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checklens = TRUE;
}
if (obj->item_type == ITEM_MIRROR && checkmirr == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkmirr = TRUE;
}
if (obj->item_type == ITEM_CRYSTAL && gems < 3)
{
if( obj->value[0] == cry1 || obj->value[0] == cry2 || obj->value[0] == cry3 )
continue;
if( gemtype >= 0 && ( obj->value[0] == CRYSTAL_BLUE || obj->value[0] == CRYSTAL_GREEN || obj->value[0] == CRYSTAL_PURPLE || obj->value[0] == CRYSTAL_RED || obj->value[0] == CRYSTAL_YELLOW ) )
continue;
if( obj->value[0] == CRYSTAL_OPILA && IS_SET(obj->extra_flags, ITEM_IMP_CRITICAL) )
continue;
if( obj->value[0] == CRYSTAL_BONDAR && IS_SET(obj->extra_flags, ITEM_STUN ) )
continue;
if( IS_SET(obj->extra_flags, ITEM_IMBUED) )
{
gems++;
if( cry1 != -1 )
{
if( cry2 == -1 )
cry2 = obj->value[0];
else
cry3 = obj->value[0];
}
else
cry1 = obj->value[0];
if( obj->value[0] >= CRYSTAL_BLUE && obj->value[0] <= CRYSTAL_YELLOW )
gemtype = obj->value[0];
if( obj->value[0] == CRYSTAL_OPILA )
SET_BIT( obj->extra_flags, ITEM_IMP_CRITICAL );
if( obj->value[0] == CRYSTAL_SIGIL )
{
mindam += 1;
maxdam += 6;
}
else if( obj->value[0] == CRYSTAL_BONDAR )
SET_BIT( obj->extra_flags, ITEM_STUN );
else if( obj->value[0] == CRYSTAL_PHOND )
{
mindam += 1;
maxdam += 10;
}
else if( obj->value[0] == CRYSTAL_SOLARI )
{
hitroll += 5;
mindam += 5;
}
else if( obj->value[0] == CRYSTAL_DAMIND )
{
hitroll += 2;
maxdam += 2;
}
else if( obj->value[0] == CRYSTAL_JENRUAX )
hitroll += 2;
else if( obj->value[0] == CRYSTAL_UPARI )
maxdam += 5;
else if( obj->value[0] == CRYSTAL_ERALAM )
{
mindam += 3;
maxdam += 3;
}
else if( obj->value[0] == CRYSTAL_RUBAT )
hitroll += 1;
else if( obj->value[0] == CRYSTAL_SAPITH )
{
hitroll += 4;
dex_bonus = TRUE;
}
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkgems = TRUE;
}
}
}
chance = IS_NPC(ch) ? ch->top_level
: ( number_range(1, 20) + ch->skill_level[CRAFT_LIGHTSABER] + stat_table[get_curr_int(ch)].mod );
if( !checkgems )
{
send_to_char( "&RYou either lack crystals or else they are not imbued.&w\n\r", ch );
return;
}
if( gemtype < 0 )
{
send_to_char( "&RAfter creating your lightsaber you attempt to ignite it, but nothing happens.&w\n\r", ch );
send_to_char( "&RPerhaps you'll remember to use a color-defining crystal next time.&w\n\r", ch );
return;
}
if ( 20 > chance || ( !checktool ) || ( !checkdura ) || ( !checkbatt ) || ( !checkoven )
|| ( !checkmirr ) || ( !checklens ) || ( !checkgems ) || ( !checkcond ) || ( !checkcirc) )
{
send_to_char( "&RAfter creating your lightsaber you stand back and admire it in awe.&w\n\r", ch );
send_to_char( "&RYou reach and ignite it, but nothing happens.&w\n\r", ch );
return;
}
obj = create_object( pObjIndex, level );
obj->item_type = ITEM_WEAPON;
SET_BIT( obj->wear_flags, ITEM_WIELD );
SET_BIT( obj->wear_flags, ITEM_TAKE );
obj->level = level;
obj->weight = 5;
STRFREE( obj->name );
obj->name = STRALLOC( "lightsaber saber" );
color = gemtype;
if( color == CRYSTAL_BLUE )
sprintf( buf, "&wa &bblue&w bladed lightsaber" );
else if( color == CRYSTAL_GREEN )
sprintf( buf, "&wa &ggreen&w bladed lightsaber" );
else if( color == CRYSTAL_YELLOW )
sprintf( buf, "&wa &Yyellow&w bladed lightsaber" );
else if( color == CRYSTAL_PURPLE )
sprintf( buf, "&wa &Ppurple&w bladed lightsaber" );
else if( color == CRYSTAL_RED )
sprintf( buf, "&wa &Rred&w bladed lightsaber" );
STRFREE( obj->short_descr );
obj->short_descr = STRALLOC( buf );
STRFREE( obj->description );
strcat( buf, " was carelessly misplaced here." );
obj->description = STRALLOC( buf );
STRFREE( obj->action_desc );
strcpy( buf, arg );
strcat( buf, " ignites with a hum and a soft glow." );
obj->action_desc = STRALLOC( buf );
CREATE( paf, AFFECT_DATA, 1 );
paf->type = -1;
paf->duration = -1;
paf->location = get_atype( "hitroll" );
paf->modifier = hitroll;
paf->bitvector = 0;
paf->next = NULL;
LINK( paf, obj->first_affect, obj->last_affect, next, prev );
++top_affect;
if( dex_bonus )
{
CREATE( paf2, AFFECT_DATA, 1 );
paf2->type = -1;
paf2->duration = -1;
paf2->location = APPLY_DEX;
paf2->modifier = 4;
paf2->bitvector = 0;
paf2->next = NULL;
LINK( paf2, obj->first_affect, obj->last_affect, next, prev );
++top_affect;
}
obj->value[0] = INIT_WEAPON_CONDITION; /* condition */
obj->value[1] = ( 2 + mindam );
obj->value[2] = ( 16 + maxdam );
obj->value[3] = WEAPON_LIGHTSABER;
obj->value[4] = charge;
obj->value[5] = charge;
obj->cost = 0;
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish your work and hold up your newly created lightsaber.&w\n\r", ch);
act( AT_PLAIN, "$n finishes making $s new lightsaber.", ch,
NULL, argument , TO_ROOM );
return;
}
void do_makespice( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int chance;
OBJ_DATA *obj;
switch( ch->substate )
{
default:
strcpy( arg, argument );
if ( arg[0] == '\0' )
{
send_to_char( "&RFrom what?\n\r&w", ch);
return;
}
if ( !IS_SET( ch->in_room->room_flags, ROOM_REFINERY ) )
{
send_to_char( "&RYou need to be in a refinery to create drugs from spice.\n\r", ch);
return;
}
if ( ms_find_obj(ch) )
return;
if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
{
send_to_char( "&RYou do not have that item.\n\r&w", ch );
return;
}
if ( obj->item_type != ITEM_RAWSPICE )
{
send_to_char( "&RYou can't make a drug out of that\n\r&w",ch);
return;
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (0);
if ( number_percent( ) < chance )
{
send_to_char( "&GYou begin the long process of refining spice into a drug.\n\r", ch);
act( AT_PLAIN, "$n begins working on something.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 10 , do_makespice , 1 );
ch->dest_buf = str_dup(arg);
return;
}
send_to_char("&RYou can't figure out what to do with the stuff.\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 distracted and are unable to finish your work.\n\r&w", ch);
return;
}
ch->substate = SUB_NONE;
if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
{
send_to_char( "You seem to have lost your spice!\n\r", ch );
return;
}
if ( obj->item_type != ITEM_RAWSPICE )
{
send_to_char( "&RYou get your tools mixed up and can't finish your work.\n\r&w",ch);
return;
}
obj->value[1] = URANGE (10, obj->value[1], ( IS_NPC(ch) ? ch->top_level
: (int) (0) ) +10);
strcpy( buf, obj->name );
STRFREE( obj->name );
strcat( buf, " drug spice " );
strcat( buf, remand(buf));
obj->name = STRALLOC( buf );
strcpy( buf, "a drug made from " );
strcat( buf, obj->short_descr );
STRFREE( obj->short_descr );
obj->short_descr = STRALLOC( buf );
strcat( buf, " was foolishly left lying around here." );
STRFREE( obj->description );
obj->description = STRALLOC( buf );
obj->item_type = ITEM_SPICE;
send_to_char( "&GYou finish your work.\n\r", ch);
act( AT_PLAIN, "$n finishes $s work.", ch,
NULL, argument , TO_ROOM );
obj->cost += obj->value[1]*10;
return;
}
void do_makegrenade( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int level, chance, strength, weight;
bool checktool, checkdrink, checkbatt, checkchem, checkcirc;
OBJ_DATA *obj;
OBJ_INDEX_DATA *pObjIndex;
int vnum;
strcpy( arg , argument );
switch( ch->substate )
{
default:
if ( arg[0] == '\0' )
{
send_to_char( "&RUsage: Makegrenade <name>\n\r&w", ch);
return;
}
checktool = FALSE;
checkdrink = FALSE;
checkbatt = FALSE;
checkchem = 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;
}
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_DRINK_CON && obj->value[1] == 0 )
checkdrink = TRUE;
if (obj->item_type == ITEM_BATTERY)
checkbatt = TRUE;
if (obj->item_type == ITEM_CIRCUIT)
checkcirc = TRUE;
if (obj->item_type == ITEM_CHEMICAL)
checkchem = TRUE;
}
if ( !checktool )
{
send_to_char( "&RYou need toolkit to make a grenade.\n\r", ch);
return;
}
if ( !checkdrink )
{
send_to_char( "&RYou will need an empty drink container to mix and hold the chemicals.\n\r", ch);
return;
}
if ( !checkbatt )
{
send_to_char( "&RYou need a small battery for the timer.\n\r", ch);
return;
}
if ( !checkcirc )
{
send_to_char( "&RYou need a small circuit for the timer.\n\r", ch);
return;
}
if ( !checkchem )
{
send_to_char( "&RSome explosive chemicals would come in handy!\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 grenade.\n\r", ch);
act( AT_PLAIN, "$n takes $s tools and a drink container and begins to work on something.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 25 , do_makegrenade , 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 interupted and fail to finish your work.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
level = IS_NPC(ch) ? ch->top_level : (int) (0);
vnum = 71;
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;
checkdrink = FALSE;
checkbatt = FALSE;
checkchem = 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_DRINK_CON && checkdrink == FALSE && obj->value[1] == 0 )
{
checkdrink = TRUE;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
}
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)
{
strength = URANGE( 10, obj->value[0], level * 5 );
weight = obj->weight;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkchem = TRUE;
}
if (obj->item_type == ITEM_CIRCUIT && checkcirc == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkcirc = TRUE;
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (0) ;
if ( number_percent( ) > chance*2 || ( !checktool ) || ( !checkdrink ) || ( !checkbatt ) || ( !checkchem ) || ( !checkcirc) )
{
send_to_char( "&RJust as you are about to finish your work,\n\ryour newly created grenade explodes in your hands...doh!\n\r", ch);
return;
}
obj = create_object( pObjIndex, level );
obj->item_type = ITEM_GRENADE;
SET_BIT( obj->wear_flags, ITEM_HOLD );
SET_BIT( obj->wear_flags, ITEM_TAKE );
obj->level = level;
obj->weight = weight;
STRFREE( obj->name );
strcpy( buf , arg );
strcat( buf , " grenade ");
strcat( buf, remand(buf));
obj->name = STRALLOC( buf );
strcpy( buf, arg );
STRFREE( obj->short_descr );
obj->short_descr = STRALLOC( buf );
STRFREE( obj->description );
strcat( buf, " was carelessly misplaced here." );
obj->description = STRALLOC( buf );
obj->value[0] = strength*2;
obj->value[1] = strength*3;
obj->cost = obj->value[1]*5;
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish your work and hold up your newly created grenade.&w\n\r", ch);
act( AT_PLAIN, "$n finishes making $s new grenade.", ch,
NULL, argument , TO_ROOM );
return;
}
void do_makelandmine( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int level, chance, strength, weight;
bool checktool, checkdrink, checkbatt, checkchem, checkcirc;
OBJ_DATA *obj;
OBJ_INDEX_DATA *pObjIndex;
int vnum;
strcpy( arg , argument );
switch( ch->substate )
{
default:
if ( arg[0] == '\0' )
{
send_to_char( "&RUsage: Makelandmine <name>\n\r&w", ch);
return;
}
checktool = FALSE;
checkdrink = FALSE;
checkbatt = FALSE;
checkchem = 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;
}
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_DRINK_CON && obj->value[1] == 0 )
checkdrink = TRUE;
if (obj->item_type == ITEM_BATTERY)
checkbatt = TRUE;
if (obj->item_type == ITEM_CIRCUIT)
checkcirc = TRUE;
if (obj->item_type == ITEM_CHEMICAL)
checkchem = TRUE;
}
if ( !checktool )
{
send_to_char( "&RYou need toolkit to make a landmine.\n\r", ch);
return;
}
if ( !checkdrink )
{
send_to_char( "&RYou will need an empty drink container to mix and hold the chemicals.\n\r", ch);
return;
}
if ( !checkbatt )
{
send_to_char( "&RYou need a small battery for the detonator.\n\r", ch);
return;
}
if ( !checkcirc )
{
send_to_char( "&RYou need a small circuit for the detonator.\n\r", ch);
return;
}
if ( !checkchem )
{
send_to_char( "&RSome explosive chemicals would come in handy!\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 landmine.\n\r", ch);
act( AT_PLAIN, "$n takes $s tools and a drink container and begins to work on something.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 25 , do_makelandmine , 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 interupted and fail to finish your work.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
level = IS_NPC(ch) ? ch->top_level : (int) (0);
vnum = 70;
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;
checkdrink = FALSE;
checkbatt = FALSE;
checkchem = 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_DRINK_CON && checkdrink == FALSE && obj->value[1] == 0 )
{
checkdrink = TRUE;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
}
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)
{
strength = URANGE( 10, obj->value[0], level * 5 );
weight = obj->weight;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkchem = TRUE;
}
if (obj->item_type == ITEM_CIRCUIT && checkcirc == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkcirc = TRUE;
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (0) ;
if ( number_percent( ) > chance*2 || ( !checktool ) || ( !checkdrink ) || ( !checkbatt ) || ( !checkchem ) || ( !checkcirc) )
{
send_to_char( "&RJust as you are about to finish your work,\n\ryour newly created landmine explodes in your hands...doh!\n\r", ch);
return;
}
obj = create_object( pObjIndex, level );
obj->item_type = ITEM_LANDMINE;
SET_BIT( obj->wear_flags, ITEM_HOLD );
SET_BIT( obj->wear_flags, ITEM_TAKE );
obj->level = level;
obj->weight = weight;
STRFREE( obj->name );
strcpy( buf , arg );
strcat( buf , " landmine ");
strcat( buf, remand(buf));
obj->name = STRALLOC( buf );
strcpy( buf, arg );
STRFREE( obj->short_descr );
obj->short_descr = STRALLOC( buf );
STRFREE( obj->description );
strcat( buf, " was carelessly misplaced here." );
obj->description = STRALLOC( buf );
obj->value[0] = strength/2;
obj->value[1] = strength;
obj->cost = obj->value[1]*5;
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish your work and hold up your newly created landmine.&w\n\r", ch);
act( AT_PLAIN, "$n finishes making $s new landmine.", ch,
NULL, argument , TO_ROOM );
return;
}
void do_makelight( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int level, chance, strength;
bool checktool, checkbatt, checkchem, checkcirc, checklens;
OBJ_DATA *obj;
OBJ_INDEX_DATA *pObjIndex;
int vnum;
strcpy( arg , argument );
switch( ch->substate )
{
default:
if ( arg[0] == '\0' )
{
send_to_char( "&RUsage: Makeflashlight <name>\n\r&w", ch);
return;
}
checktool = FALSE;
checkbatt = FALSE;
checkchem = FALSE;
checkcirc = 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_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_BATTERY)
checkbatt = TRUE;
if (obj->item_type == ITEM_CIRCUIT)
checkcirc = TRUE;
if (obj->item_type == ITEM_CHEMICAL)
checkchem = TRUE;
if (obj->item_type == ITEM_LENS)
checklens = TRUE;
}
if ( !checktool )
{
send_to_char( "&RYou need toolkit to make a light.\n\r", ch);
return;
}
if ( !checklens )
{
send_to_char( "&RYou need a lens to make a light.\n\r", ch);
return;
}
if ( !checkbatt )
{
send_to_char( "&RYou need a battery for the light to work.\n\r", ch);
return;
}
if ( !checkcirc )
{
send_to_char( "&RYou need a small circuit.\n\r", ch);
return;
}
if ( !checkchem )
{
send_to_char( "&RSome chemicals to light would come in handy!\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 light.\n\r", ch);
act( AT_PLAIN, "$n takes $s tools and begins to work on something.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 10 , do_makelight , 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 interupted and fail to finish your work.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
level = IS_NPC(ch) ? ch->top_level : (int) (0);
vnum = 65;
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;
checklens = FALSE;
checkbatt = FALSE;
checkchem = 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)
{
strength = obj->value[0];
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkbatt = TRUE;
}
if (obj->item_type == ITEM_CHEMICAL)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkchem = TRUE;
}
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_LENS && checklens == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checklens = TRUE;
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (0) ;
if ( number_percent( ) > chance*2 || ( !checktool ) || ( !checklens ) || ( !checkbatt ) || ( !checkchem ) || ( !checkcirc) )
{
send_to_char( "&RJust as you are about to finish your work,\n\ryour newly created light explodes in your hands...doh!\n\r", ch);
return;
}
obj = create_object( pObjIndex, level );
obj->item_type = ITEM_LIGHT;
SET_BIT( obj->wear_flags, ITEM_TAKE );
obj->level = level;
obj->weight = 3;
STRFREE( obj->name );
strcpy( buf , arg );
strcat( buf , " light ");
strcat( buf, remand(buf));
obj->name = STRALLOC( buf );
strcpy( buf, arg );
STRFREE( obj->short_descr );
obj->short_descr = STRALLOC( buf );
STRFREE( obj->description );
strcat( buf, " was carelessly misplaced here." );
obj->description = STRALLOC( buf );
obj->value[2] = strength;
obj->cost = obj->value[2];
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish your work and hold up your newly created light.&w\n\r", ch);
act( AT_PLAIN, "$n finishes making $s new light.", ch,
NULL, argument , TO_ROOM );
return;
}
void do_makejewelry( 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, checkoven, checkmetal;
OBJ_DATA *obj;
OBJ_DATA *metal;
AFFECT_DATA *paf;
int value, cost;
argument = one_argument( argument, arg );
strcpy ( arg2, argument);
if ( !str_cmp( arg, "body" )
|| !str_cmp( arg, "head" )
|| !str_cmp( arg, "legs" )
|| !str_cmp( arg, "arms" )
|| !str_cmp( arg, "about" )
|| !str_cmp( arg, "eyes" )
|| !str_cmp( arg, "waist" )
|| !str_cmp( arg, "hold" )
|| !str_cmp( arg, "feet" )
|| !str_cmp( arg, "hands" ))
{
send_to_char( "&RYou cannot make jewelry for that body part.\n\r&w", ch);
send_to_char( "&RTry MAKEARMOR.\n\r&w", ch);
return;
}
if ( !str_cmp( arg, "shield" ) )
{
send_to_char( "&RYou cannot make jewelry worn as a shield.\n\r&w", ch);
send_to_char( "&RTry MAKESHIELD.\n\r&w", ch);
return;
}
if ( !str_cmp( arg, "wield" ) )
{
send_to_char( "&RAre you going to fight with your jewelry?\n\r&w", ch);
send_to_char( "&RTry MAKEBLADE...\n\r&w", ch);
return;
}
if ( !str_cmp( arg, "holster1")
|| !str_cmp( arg, "holster2") )
{
send_to_char( "&RYou can't use jewelry there.&w\n\r", ch);
send_to_char( "&RTry MAKECONTAINER...\n\r&w", ch);
return;
}
switch( ch->substate )
{
default:
if ( arg2[0] == '\0' )
{
send_to_char( "&RUsage: Makejewelry <wearloc> <name>\n\r&w", ch);
return;
}
checktool = FALSE;
checkoven = FALSE;
checkmetal = 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_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_OVEN)
checkoven = TRUE;
if (obj->item_type == ITEM_RARE_METAL)
checkmetal = TRUE;
}
if ( !checktool )
{
send_to_char( "&RYou need a toolkit.\n\r", ch);
return;
}
if ( !checkoven )
{
send_to_char( "&RYou need an oven.\n\r", ch);
return;
}
if ( !checkmetal )
{
send_to_char( "&RYou need some precious metal.\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 creating some jewelry.\n\r", ch);
act( AT_PLAIN, "$n takes $s toolkit and some metal and begins to work.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 15 , do_makejewelry , 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 interupted and fail to finish your work.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
level = IS_NPC(ch) ? ch->top_level : (int) (0);
checkmetal = FALSE;
checkoven = FALSE;
checktool = FALSE;
value=0;
cost=0;
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_OVEN)
checkoven = TRUE;
if (obj->item_type == ITEM_RARE_METAL && checkmetal == FALSE)
{
checkmetal = TRUE;
separate_obj( obj );
obj_from_char( obj );
metal = obj;
}
if (obj->item_type == ITEM_CRYSTAL)
{
cost += obj->cost;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (0) ;
if ( number_percent( ) > chance*2 || ( !checkoven ) || ( !checktool ) || ( !checkmetal ) )
{
send_to_char( "&RYou hold up your newly created jewelry.\n\r", ch);
send_to_char( "&RIt suddenly dawns upon you that you have created the most useless\n\r", ch);
send_to_char( "&Rpiece of junk you've ever seen. You quickly hide your mistake...\n\r", ch);
return;
}
obj = metal;
obj->item_type = ITEM_ARMOR;
SET_BIT( obj->wear_flags, ITEM_TAKE );
value = get_wflag( arg );
if ( value < 0 || value > 31 )
SET_BIT( obj->wear_flags, ITEM_WEAR_NECK );
else
SET_BIT( obj->wear_flags, 1 << value );
obj->level = level;
STRFREE( obj->name );
sprintf( buf, "%s ", arg2);
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." );
// Create stat bonuses for Jewelry - Tawnos
CREATE( paf, AFFECT_DATA, 1 );
paf->type = -1;
paf->duration = -1;
// Use smaller if check to minimize redundant code.
if( IS_SET( obj->wear_flags, ITEM_WEAR_FINGER ) )
{
if(number_bits(1) == 0)
paf->location = get_atype( "hitroll" );
else
paf->location = get_atype( "damroll" );
paf->modifier = number_bits(1)+1;
}
else if( IS_SET( obj->wear_flags, ITEM_WEAR_EARS ) )
{
if(number_bits(1) == 0)
paf->location = get_atype( "intelligence" );
else
paf->location = get_atype( "wisdom" );
paf->modifier = number_bits(1)+1;
}
else if( IS_SET( obj->wear_flags, ITEM_WEAR_NECK ) )
{
if(number_bits(1) == 0)
paf->location = get_atype( "charisma" );
else
paf->location = get_atype( "luck" );
paf->modifier = 1;
}
else if( IS_SET( obj->wear_flags, ITEM_WEAR_WRIST ) )
{
if(number_bits(1) == 0)
paf->location = get_atype( "strength" );
else
paf->location = get_atype( "dexterity" );
paf->modifier = 1;
}
else
{
paf->location = get_atype("strength");
paf->modifier = 1;
}
paf->bitvector = 0;
paf->next = NULL;
LINK( paf, obj->first_affect, obj->last_affect, next, prev );
++top_affect;
// End stat bonuses.
obj->description = STRALLOC( buf );
obj->value[1] = metal->value[1];
obj->value[0] = obj->value[1];
obj->cost *= 10;
obj->cost += cost;
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish your work and hold up your newly created jewelry.&w\n\r", ch);
act( AT_PLAIN, "$n finishes sewing some new jewelry.", ch,
NULL, argument , TO_ROOM );
return;
}
void do_makearmor( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int level, chance;
bool checksew, checkfab;
OBJ_DATA *obj;
OBJ_DATA *material;
int value;
argument = one_argument( argument, arg );
strcpy ( arg2, argument);
if ( !str_cmp( arg, "eyes" )
|| !str_cmp( arg, "ears" )
|| !str_cmp( arg, "finger" )
|| !str_cmp( arg, "neck" )
|| !str_cmp( arg, "wrist" ) )
{
send_to_char( "&RYou cannot make clothing for that body part.\n\r&w", ch);
send_to_char( "&RTry MAKEJEWELRY.\n\r&w", ch);
return;
}
if ( !str_cmp( arg, "shield" ) )
{
send_to_char( "&RYou cannot make clothing worn as a shield.\n\r&w", ch);
send_to_char( "&RTry MAKESHIELD.\n\r&w", ch);
return;
}
if ( !str_cmp( arg, "wield" ) )
{
send_to_char( "&RAre you going to fight with your clothing?\n\r&w", ch);
send_to_char( "&RTry MAKEBLADE...\n\r&w", ch);
return;
}
if ( !str_cmp( arg, "holster1")
|| !str_cmp( arg, "holster2") )
{
send_to_char( "&RYou can't use armor there.&w\n\r", ch);
send_to_char( "&RTry MAKECONTAINER...\n\r&w", ch);
return;
}
switch( ch->substate )
{
default:
if ( arg2[0] == '\0' )
{
send_to_char( "&RUsage: Makearmor <wearloc> <name>\n\r&w", ch);
return;
}
checksew = FALSE;
checkfab = 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_FABRIC)
checkfab = TRUE;
if (obj->item_type == ITEM_THREAD)
checksew = TRUE;
}
if ( !checkfab )
{
send_to_char( "&RYou need some sort of fabric or material.\n\r", ch);
return;
}
if ( !checksew )
{
send_to_char( "&RYou need a needle and some thread.\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 creating some armor.\n\r", ch);
act( AT_PLAIN, "$n takes $s sewing kit and some material and begins to work.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 15 , do_makearmor , 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 interupted and fail to finish your work.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
level = IS_NPC(ch) ? ch->top_level : (int) (0);
checksew = FALSE;
checkfab = FALSE;
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_THREAD)
checksew = TRUE;
if (obj->item_type == ITEM_FABRIC && checkfab == FALSE)
{
checkfab = TRUE;
separate_obj( obj );
obj_from_char( obj );
material = obj;
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (0) ;
if ( number_percent( ) > chance*2 || ( !checkfab ) || ( !checksew ) )
{
send_to_char( "&RYou hold up your newly created armor.\n\r", ch);
send_to_char( "&RIt suddenly dawns upon you that you have created the most useless\n\r", ch);
send_to_char( "&Rgarment you've ever seen. You quickly hide your mistake...\n\r", ch);
return;
}
obj = material;
obj->item_type = ITEM_ARMOR;
SET_BIT( obj->wear_flags, ITEM_TAKE );
value = get_wflag( arg );
if ( value < 0 || value > 31 )
SET_BIT( obj->wear_flags, ITEM_WEAR_BODY );
else
SET_BIT( obj->wear_flags, 1 << value );
obj->level = level;
STRFREE( obj->name );
sprintf(buf, "%s ", arg2);
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] = obj->value[1];
obj->cost *= 10;
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish your work and hold up your newly created garment.&w\n\r", ch);
act( AT_PLAIN, "$n finishes sewing some new armor.", ch,
NULL, argument , TO_ROOM );
return;
}
void do_makecomlink( CHAR_DATA *ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int chance;
bool checktool, checkgem, checkbatt, checkcirc;
OBJ_DATA *obj;
OBJ_INDEX_DATA *pObjIndex;
int vnum;
argument = one_argument( argument, arg );
strcpy ( arg2, argument);
switch( ch->substate )
{
default:
if ( arg2[0] == '\0' )
{
send_to_char( "&RUsage: Makecomlink <wearloc> <name>\n\r&w", ch);
send_to_char( "&RAvailable wearlocs: hold, wrist, ears&w\n\r", ch);
return;
}
checktool = FALSE;
checkgem = 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;
}
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_CRYSTAL)
checkgem = TRUE;
if (obj->item_type == ITEM_BATTERY)
checkbatt = TRUE;
if (obj->item_type == ITEM_CIRCUIT)
checkcirc = TRUE;
}
if ( !checktool )
{
send_to_char( "&RYou need toolkit to make a comlink.\n\r", ch);
return;
}
if ( !checkgem )
{
send_to_char( "&RYou need a small crystal.\n\r", ch);
return;
}
if ( !checkbatt )
{
send_to_char( "&RYou need a power source for your comlink.\n\r", ch);
return;
}
if ( !checkcirc )
{
send_to_char( "&RYou need a small circuit.\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 comlink.\n\r", ch);
act( AT_PLAIN, "$n takes $s tools and begins to work on something.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 10 , do_makecomlink , 1 );
ch->dest_buf = str_dup(arg);
ch->dest_buf_2 = str_dup(arg2);
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);
strcpy(arg2, ch->dest_buf_2);
DISPOSE( ch->dest_buf_2);
break;
case SUB_TIMER_DO_ABORT:
DISPOSE( ch->dest_buf );
ch->substate = SUB_NONE;
send_to_char("&RYou are interupted and fail to finish your work.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
vnum = 64;
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;
checkgem = 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_CRYSTAL && checkgem == FALSE)
{
checkgem = TRUE;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
}
if (obj->item_type == ITEM_CIRCUIT && checkcirc == FALSE)
{
checkcirc = TRUE;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
}
if (obj->item_type == ITEM_BATTERY && checkbatt == FALSE )
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkbatt = TRUE;
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (0) ;
if ( number_percent( ) > chance*2 || ( !checktool ) || ( !checkcirc ) || ( !checkbatt ) || ( !checkgem ) )
{
send_to_char( "&RYou hold up your newly created comlink....\n\r", ch);
send_to_char( "&Rand it falls apart in your hands.\n\r", ch);
return;
}
obj = create_object( pObjIndex, ch->top_level );
obj->item_type = ITEM_COMLINK;
if (arg==NULL || !str_cmp(arg, "hold" ))
SET_BIT( obj->wear_flags, ITEM_HOLD );
if ( !str_cmp(arg, "ears"))
{
SET_BIT( obj->wear_flags, ITEM_WEAR_EARS );
REMOVE_BIT( obj->wear_flags, ITEM_HOLD);
}
if ( !str_cmp(arg, "wrist"))
{
SET_BIT( obj->wear_flags, ITEM_WEAR_WRIST );
REMOVE_BIT( obj->wear_flags, ITEM_HOLD);
}
SET_BIT( obj->wear_flags, ITEM_TAKE );
obj->weight = 3;
STRFREE( obj->name );
strcpy( buf, arg2 );
strcat( buf, " comlink " );
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 left here." );
obj->description = STRALLOC( buf );
obj->cost = 50;
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish your work and hold up your newly created comlink.&w\n\r", ch);
act( AT_PLAIN, "$n finishes crafting a comlink.", ch,
NULL, argument , TO_ROOM );
return;
}
void do_makeshield( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int chance;
bool checktool, checkbatt, checkcond, checkcirc, checkgems;
OBJ_DATA *obj;
OBJ_INDEX_DATA *pObjIndex;
int vnum, level, charge, gemtype;
strcpy( arg, argument );
switch( ch->substate )
{
default:
if ( arg[0] == '\0' )
{
send_to_char( "&RUsage: Makeshield <name>\n\r&w", ch);
return;
}
checktool = FALSE;
checkbatt = FALSE;
checkcond = FALSE;
checkcirc = FALSE;
checkgems = FALSE;
if ( !IS_SET( ch->in_room->room_flags, ROOM_FACTORY ) )
{
send_to_char( "&RYou need to be in a workshop.\n\r", ch);
return;
}
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_CRYSTAL)
checkgems = TRUE;
if (obj->item_type == ITEM_BATTERY)
checkbatt = TRUE;
if (obj->item_type == ITEM_CIRCUIT)
checkcirc = TRUE;
if (obj->item_type == ITEM_SUPERCONDUCTOR)
checkcond = TRUE;
}
if ( !checktool )
{
send_to_char( "&RYou need toolkit to make an energy shield.\n\r", ch);
return;
}
if ( !checkbatt )
{
send_to_char( "&RYou need a power source for your energy shield.\n\r", ch);
return;
}
if ( !checkcirc )
{
send_to_char( "&RYou need a small circuit board.\n\r", ch);
return;
}
if ( !checkcond )
{
send_to_char( "&RYou still need a small superconductor for your energy shield.\n\r", ch);
return;
}
if ( !checkgems )
{
send_to_char( "&RYou need a small crystal.\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 crafting an energy shield.\n\r", ch);
act( AT_PLAIN, "$n takes $s tools and begins to work on something.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 20 , do_makeshield , 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 interupted and fail to finish your work.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
level = IS_NPC(ch) ? ch->top_level : (int) (0);
vnum = 28;
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;
checkbatt = FALSE;
checkcond = FALSE;
checkcirc = FALSE;
checkgems = FALSE;
charge = 0;
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)
{
charge = UMIN(obj->value[1], 10);
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkbatt = TRUE;
}
if (obj->item_type == ITEM_SUPERCONDUCTOR && checkcond == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkcond = TRUE;
}
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_CRYSTAL && checkgems == FALSE)
{
gemtype = obj->value[0];
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkgems = TRUE;
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (0) ;
if ( number_percent( ) > chance*2 || ( !checktool ) || ( !checkbatt )
|| ( !checkgems ) || ( !checkcond ) || ( !checkcirc) )
{
send_to_char( "&RYou hold up your new energy shield and press the switch hoping for the best.\n\r", ch);
send_to_char( "&RInstead of a field of energy being created, smoke starts pouring from the device.\n\r", ch);
send_to_char( "&RYou drop the hot device and watch as it melts on away on the floor.\n\r", ch);
return;
}
obj = create_object( pObjIndex, level );
obj->item_type = ITEM_ARMOR;
SET_BIT( obj->wear_flags, ITEM_WIELD );
SET_BIT( obj->wear_flags, ITEM_WEAR_SHIELD );
obj->level = level;
obj->weight = 2;
STRFREE( obj->name );
obj->name = STRALLOC( "energy shield" );
strcpy( buf, arg );
STRFREE( obj->short_descr );
obj->short_descr = STRALLOC( buf );
STRFREE( obj->description );
strcat( buf, " was carelessly misplaced here." );
obj->description = STRALLOC( buf );
obj->value[0] = (int) (level/10+gemtype*10); /* condition */
obj->value[1] = (int) (level/10+gemtype*10); /* armor */
obj->value[4] = charge;
obj->value[5] = charge;
obj->cost = obj->value[2]*100;
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish your work and hold up your newly created energy shield.&w\n\r", ch);
act( AT_PLAIN, "$n finishes making $s new energy shield.", ch,
NULL, argument , TO_ROOM );
return;
}
void do_makecontainer( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int level, chance;
bool checksew, checkfab;
OBJ_DATA *obj;
OBJ_DATA *material;
int value;
argument = one_argument( argument, arg );
strcpy( arg2 , argument );
if ( !str_cmp( arg, "eyes" )
|| !str_cmp( arg, "ears" )
|| !str_cmp( arg, "finger" )
|| !str_cmp( arg, "neck" )
|| !str_cmp( arg, "wrist" ) )
{
send_to_char( "&RYou cannot make a container for that body part.\n\r&w", ch);
send_to_char( "&RTry MAKEJEWELRY.\n\r&w", ch);
return;
}
if ( !str_cmp( arg, "feet" )
|| !str_cmp( arg, "hands" ) )
{
send_to_char( "&RYou cannot make a container for that body part.\n\r&w", ch);
send_to_char( "&RTry MAKEARMOR.\n\r&w", ch);
return;
}
if ( !str_cmp( arg, "shield" ) )
{
send_to_char( "&RYou cannot make a container a shield.\n\r&w", ch);
send_to_char( "&RTry MAKESHIELD.\n\r&w", ch);
return;
}
if ( !str_cmp( arg, "wield" ) )
{
send_to_char( "&RAre you going to fight with a container?\n\r&w", ch);
send_to_char( "&RTry MAKEBLADE...\n\r&w", ch);
return;
}
switch( ch->substate )
{
default:
if ( arg2[0] == '\0' )
{
send_to_char( "&RUsage: Makecontainer <wearloc> <name>\n\r&w", ch);
return;
}
checksew = FALSE;
checkfab = 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_FABRIC)
checkfab = TRUE;
if (obj->item_type == ITEM_THREAD)
checksew = TRUE;
}
if ( !checkfab )
{
send_to_char( "&RYou need some sort of fabric or material.\n\r", ch);
return;
}
if ( !checksew )
{
send_to_char( "&RYou need a needle and some thread.\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 creating a bag.\n\r", ch);
act( AT_PLAIN, "$n takes $s sewing kit and some material and begins to work.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 10 , do_makecontainer , 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 interupted and fail to finish your work.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
level = IS_NPC(ch) ? ch->top_level : (int) (0);
checksew = FALSE;
checkfab = FALSE;
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_THREAD)
checksew = TRUE;
if (obj->item_type == ITEM_FABRIC && checkfab == FALSE)
{
checkfab = TRUE;
separate_obj( obj );
obj_from_char( obj );
material = obj;
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (0) ;
if ( number_percent( ) > chance*2 || ( !checkfab ) || ( !checksew ) )
{
send_to_char( "&RYou hold up your newly created container.\n\r", ch);
send_to_char( "&RIt suddenly dawns upon you that you have created the most useless\n\r", ch);
send_to_char( "&Rcontainer you've ever seen. You quickly hide your mistake...\n\r", ch);
return;
}
obj = material;
obj->item_type = ITEM_CONTAINER;
SET_BIT( obj->wear_flags, ITEM_TAKE );
value = get_wflag( arg );
if ( value < 0 || value > 31 )
SET_BIT( obj->wear_flags, ITEM_HOLD );
else
SET_BIT( obj->wear_flags, 1 << value );
obj->level = 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] = level;
obj->value[1] = 0;
obj->value[2] = 0;
obj->value[3] = 10;
obj->cost *= 2;
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish your work and hold up your newly created container.&w\n\r", ch);
act( AT_PLAIN, "$n finishes sewing a new container.", ch,
NULL, argument , TO_ROOM );
return;
}
void do_gemcutting( CHAR_DATA *ch, char *argument )
{
send_to_char( "&RSorry, this skill isn't finished yet :(\n\r", ch);
}
void do_reinforcements( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
int chance, credits;
if ( IS_NPC( ch ) || !ch->pcdata )
return;
strcpy( arg, argument );
switch( ch->substate )
{
default:
if ( ch->backup_wait )
{
send_to_char( "&RYour reinforcements are already on the way.\n\r", ch );
return;
}
if ( !ch->pcdata->clan )
{
send_to_char( "&RYou need to be a member of an organization before you can call for reinforcements.\n\r", ch );
return;
}
if ( ch->gold < 5000 )
{
ch_printf( ch, "&RYou dont have enough credits to send for reinforcements.\n\r" );
return;
}
chance = (int) (0);
if ( number_percent( ) < chance )
{
send_to_char( "&GYou begin making the call for reinforcements.\n\r", ch);
act( AT_PLAIN, "$n begins issuing orders int $s comlink.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 1 , do_reinforcements , 1 );
ch->dest_buf = str_dup(arg);
return;
}
send_to_char("&RYou call for reinforcements but nobody answers.\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 interupted before you can finish your call.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
send_to_char( "&GYour reinforcements are on the way.\n\r", ch);
credits = 5000;
ch_printf( ch, "It cost you %d credits.\n\r", credits);
ch->gold -= UMIN( credits , ch->gold );
if ( nifty_is_name( "empire" , ch->pcdata->clan->name ) )
ch->backup_mob = MOB_VNUM_STORMTROOPER;
else if ( nifty_is_name( "republic" , ch->pcdata->clan->name ) )
ch->backup_mob = MOB_VNUM_NR_TROOPER;
else
ch->backup_mob = MOB_VNUM_MERCINARY;
ch->backup_wait = number_range(1,2);
}
void do_postguard( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
int chance, credits;
if ( IS_NPC( ch ) || !ch->pcdata )
return;
strcpy( arg, argument );
switch( ch->substate )
{
default:
if ( ch->backup_wait )
{
send_to_char( "&RYou already have backup coming.\n\r", ch );
return;
}
if ( !ch->pcdata->clan )
{
send_to_char( "&RYou need to be a member of an organization before you can call for a guard.\n\r", ch );
return;
}
if ( ch->gold < 3000 )
{
ch_printf( ch, "&RYou dont have enough credits.\n\r", ch );
return;
}
chance = (int) (0);
if ( number_percent( ) < chance )
{
send_to_char( "&GYou begin making the call for reinforcements.\n\r", ch);
act( AT_PLAIN, "$n begins issuing orders int $s comlink.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 1 , do_postguard , 1 );
ch->dest_buf = str_dup(arg);
return;
}
send_to_char("&RYou call for a guard but nobody answers.\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 interupted before you can finish your call.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
send_to_char( "&GYour guard is on the way.\n\r", ch);
credits = 3000;
ch_printf( ch, "It cost you %d credits.\n\r", credits);
ch->gold -= UMIN( credits , ch->gold );
if ( nifty_is_name( "empire" , ch->pcdata->clan->name ) )
ch->backup_mob = MOB_VNUM_IMP_GUARD;
else if ( nifty_is_name( "republic" , ch->pcdata->clan->name ) )
ch->backup_mob = MOB_VNUM_NR_GUARD;
else
ch->backup_mob = MOB_VNUM_BOUNCER;
ch->backup_wait = 1;
}
void add_reinforcements( CHAR_DATA *ch )
{
MOB_INDEX_DATA * pMobIndex;
OBJ_DATA * blaster;
OBJ_INDEX_DATA * pObjIndex;
int max=1;
if ( ( pMobIndex = get_mob_index( ch->backup_mob ) ) == NULL )
return;
if ( ch->backup_mob == MOB_VNUM_STORMTROOPER ||
ch->backup_mob == MOB_VNUM_NR_TROOPER ||
ch->backup_mob == MOB_VNUM_MERCINARY ||
ch->backup_mob == MOB_VNUM_IMP_FORCES ||
ch->backup_mob == MOB_VNUM_NR_FORCES ||
ch->backup_mob == MOB_VNUM_MERC_FORCES )
{
CHAR_DATA * mob[3];
int mob_cnt;
send_to_char( "Your reinforcements have arrived.\n\r", ch );
if( ch->backup_mob == MOB_VNUM_STORMTROOPER || ch->backup_mob ==
MOB_VNUM_NR_TROOPER || ch->backup_mob == MOB_VNUM_MERCINARY )
max=3;
for ( mob_cnt = 0 ; mob_cnt < max ; mob_cnt++ )
{
int ability;
mob[mob_cnt] = create_mobile( pMobIndex );
char_to_room( mob[mob_cnt], ch->in_room );
act( AT_IMMORT, "$N has arrived.", ch, NULL, mob[mob_cnt], TO_ROOM );
mob[mob_cnt]->top_level = ch->top_level;
for ( ability = 0 ; ability < MAX_ABILITY ; ability++ )
mob[mob_cnt]->skill_level[ability] = mob[mob_cnt]->top_level;
mob[mob_cnt]->hit = mob[mob_cnt]->top_level*15;
mob[mob_cnt]->max_hit = mob[mob_cnt]->hit;
mob[mob_cnt]->armor = 100- mob[mob_cnt]->top_level*2.5;
mob[mob_cnt]->damroll = mob[mob_cnt]->top_level/5;
mob[mob_cnt]->hitroll = mob[mob_cnt]->top_level/5;
if ( ( pObjIndex = get_obj_index( OBJ_VNUM_BLASTECH_E11 ) ) != NULL )
{
blaster = create_object( pObjIndex, mob[mob_cnt]->top_level );
obj_to_char( blaster, mob[mob_cnt] );
equip_char( mob[mob_cnt], blaster, WEAR_WIELD );
}
if ( mob[mob_cnt]->master )
stop_follower( mob[mob_cnt] );
add_follower( mob[mob_cnt], ch );
SET_BIT( mob[mob_cnt]->affected_by, AFF_CHARM );
do_setblaster( mob[mob_cnt] , "full" );
}
}
else
{
CHAR_DATA *mob;
int ability;
mob = create_mobile( pMobIndex );
char_to_room( mob, ch->in_room );
if ( ch->pcdata && ch->pcdata->clan )
{
char tmpbuf[MAX_STRING_LENGTH];
//STRFREE( mob->name );
//mob->name = STRALLOC( ch->pcdata->clan->name );
sprintf( tmpbuf , "(%s) %s" , ch->pcdata->clan->name , mob->long_descr );
STRFREE( mob->long_descr );
mob->long_descr = STRALLOC( tmpbuf );
}
act( AT_IMMORT, "$N has arrived.", ch, NULL, mob, TO_ROOM );
send_to_char( "Your guard has arrived.\n\r", ch );
mob->top_level = ch->top_level;
for ( ability = 0 ; ability < MAX_ABILITY ; ability++ )
mob->skill_level[ability] = mob->top_level;
mob->hit = mob->top_level*15;
mob->max_hit = mob->hit;
mob->armor = 100- mob->top_level*2.5;
mob->damroll = mob->top_level/5;
mob->hitroll = mob->top_level/5;
if ( ( pObjIndex = get_obj_index( OBJ_VNUM_BLASTECH_E11 ) ) != NULL )
{
blaster = create_object( pObjIndex, mob->top_level );
obj_to_char( blaster, mob );
equip_char( mob, blaster, WEAR_WIELD );
}
/* for making this more accurate in the future */
if ( mob->mob_clan )
STRFREE ( mob->mob_clan );
if ( ch->pcdata && ch->pcdata->clan )
mob->mob_clan = STRALLOC( ch->pcdata->clan->name );
}
}
void do_torture( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int chance, dam;
bool fail;
if ( IS_NPC(ch) && IS_AFFECTED( ch, AFF_CHARM ) )
{
send_to_char( "You can't do that right now.\n\r", ch );
return;
}
one_argument( argument, arg );
if ( ch->mount )
{
send_to_char( "You can't get close enough while mounted.\n\r", ch );
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Torture whom?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( victim == ch )
{
send_to_char( "Are you masacistic or what...\n\r", ch );
return;
}
if ( !IS_AWAKE(victim) )
{
send_to_char( "You need to wake them first.\n\r", ch );
return;
}
if ( is_safe( ch, victim ) )
return;
if ( victim->fighting )
{
send_to_char( "You can't torture someone whos in combat.\n\r", ch );
return;
}
ch->alignment = ch->alignment -= 100;
ch->alignment = URANGE( -1000, ch->alignment, 1000 );
WAIT_STATE( ch, PULSE_PER_SECOND*2 );
fail = FALSE;
chance = ris_save( victim, 0, RIS_PARALYSIS );
if ( chance == 1000 )
fail = TRUE;
else
fail = saves_para_petri( chance, victim );
if ( !IS_NPC(ch) && !IS_NPC(victim) )
chance = sysdata.stun_plr_vs_plr;
else
chance = sysdata.stun_regular;
if ( ( !fail
&& ( IS_NPC(ch)
|| (number_percent( ) + chance) < 0 ) ) || ((!IS_NPC(victim)) && (IS_SET(victim->pcdata->act2, ACT_BOUND))))
{
WAIT_STATE( ch, 2 * PULSE_VIOLENCE );
WAIT_STATE( victim, PULSE_VIOLENCE );
act( AT_SKILL, "$N slowly tortures you. The pain is excruciating.", victim, NULL, ch, TO_CHAR );
act( AT_SKILL, "You torture $N, leaving $M screaming in pain.", ch, NULL, victim, TO_CHAR );
act( AT_SKILL, "$n tortures $N, leaving $M screaming in agony!", ch, NULL, victim, TO_NOTVICT );
dam = dice( 1, 4 );
dam = URANGE( 0, victim->max_hit-10, dam );
victim->hit -= dam;
victim->max_hit -= dam;
ch_printf( victim, "You lose %d permanent hit points." ,dam);
ch_printf( ch, "They lose %d permanent hit points." , dam);
}
else
{
act( AT_SKILL, "$N tries to cut off your finger!", victim, NULL, ch, TO_CHAR );
act( AT_SKILL, "You mess up big time.", ch, NULL, victim, TO_CHAR );
act( AT_SKILL, "$n tries to painfully torture $N.", ch, NULL, victim, TO_NOTVICT );
WAIT_STATE( ch, 2 * PULSE_VIOLENCE );
global_retcode = multi_hit( victim, ch, TYPE_UNDEFINED );
}
return;
}
void do_disguise( CHAR_DATA *ch, char *argument )
{
int chance;
if ( IS_NPC(ch) )
return;
if ( IS_SET( ch->pcdata->flags, PCFLAG_NOTITLE ))
{
send_to_char( "You try but the Force resists you.\n\r", ch );
return;
}
if ( argument[0] == '\0' )
{
send_to_char( "Syntax: disguise <disguise|clear>\n\r", ch );
return;
}
if ( !str_cmp(argument, "clear") )
{
STRFREE(ch->pcdata->disguise);
ch->pcdata->disguise = STRALLOC( "" );
send_to_char( "Disguise cleared.\n\r", ch);
return;
}
chance = (int) (0);
if ( number_percent( ) > chance )
{
send_to_char( "You try to disguise yourself but fail.\n\r", ch );
return;
}
if(strlen(argument) > 40)
argument[40] = '\0';
smash_tilde( argument );
STRFREE( ch->pcdata->disguise );
ch->pcdata->disguise = STRALLOC( argument );
send_to_char( "Ok.\n\r", ch );
}
void do_deception( CHAR_DATA *ch, char *argument )
{
int chance;
if ( IS_NPC(ch) )
return;
if ( IS_SET( ch->pcdata->flags, PCFLAG_NOTITLE ))
{
send_to_char( "You try but the Force resists you.\n\r", ch );
return;
}
if ( argument[0] == '\0' )
{
send_to_char( "Syntax: deception <name|clear>\n\r", ch );
return;
}
if ( !str_cmp(argument, "clear") )
{
STRFREE(ch->pcdata->disguise);
ch->pcdata->disguise = STRALLOC( "" );
send_to_char( "You cease your deception.\n\r", ch);
return;
}
chance = (int) (0);
if ( number_percent( ) > chance )
{
send_to_char( "You fail to deceive others.\n\r", ch );
return;
}
if(strlen(argument) > 40)
argument[40] = '\0';
smash_tilde( argument );
STRFREE( ch->pcdata->disguise );
ch->pcdata->disguise = STRALLOC( argument );
send_to_char( "Ok.\n\r", ch );
}
void do_mine( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
OBJ_DATA *obj;
bool shovel;
sh_int move;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
send_to_char( "And what will you mine the room with?\n\r", ch );
return;
}
if ( ms_find_obj(ch) )
return;
shovel = FALSE;
for ( obj = ch->first_carrying; obj; obj = obj->next_content )
if ( obj->item_type == ITEM_SHOVEL )
{
shovel = TRUE;
break;
}
obj = get_obj_list_rev( ch, arg, ch->in_room->last_content );
if ( !obj )
{
send_to_char( "You don't see one here.\n\r", ch );
return;
}
separate_obj(obj);
if ( obj->item_type != ITEM_LANDMINE )
{
act( AT_PLAIN, "That's not a landmine!", ch, obj, 0, TO_CHAR );
return;
}
if ( !CAN_WEAR(obj, ITEM_TAKE) )
{
act( AT_PLAIN, "You cannot bury $p.", ch, obj, 0, TO_CHAR );
return;
}
switch( ch->in_room->sector_type )
{
case SECT_CITY:
case SECT_INSIDE:
send_to_char( "The floor is too hard to dig through.\n\r", ch );
return;
case SECT_WATER_SWIM:
case SECT_WATER_NOSWIM:
case SECT_UNDERWATER:
send_to_char( "You cannot bury a mine in the water.\n\r", ch );
return;
case SECT_AIR:
send_to_char( "What? Bury a mine in the air?!\n\r", ch );
return;
}
if ( obj->weight > (UMAX(5, (can_carry_w(ch) / 10)))
&& !shovel )
{
send_to_char( "You'd need a shovel to bury something that big.\n\r", ch );
return;
}
move = (obj->weight * 50 * (shovel ? 1 : 5)) / UMAX(1, can_carry_w(ch));
move = URANGE( 2, move, 1000 );
if ( move > ch->move )
{
send_to_char( "You don't have the energy to bury something of that size.\n\r", ch );
return;
}
ch->move -= move;
SET_BIT( obj->extra_flags, ITEM_BURRIED );
WAIT_STATE( ch, URANGE( 10, move / 2, 100 ) );
STRFREE ( obj->armed_by );
obj->armed_by = STRALLOC ( ch->name );
ch_printf( ch, "You arm and bury %s.\n\r", obj->short_descr );
act( AT_PLAIN, "$n arms and buries $p.", ch, obj, NULL, TO_ROOM );
return;
}
void do_first_aid( CHAR_DATA *ch, char *argument )
{
OBJ_DATA *medpac;
CHAR_DATA *victim;
int heal;
char buf[MAX_STRING_LENGTH];
if ( ch->position == POS_FIGHTING )
{
send_to_char( "You can't do that while fighting!\n\r",ch );
return;
}
medpac = get_eq_char( ch, WEAR_HOLD );
if ( !medpac || medpac->item_type != ITEM_MEDPAC )
{
send_to_char( "You need to be holding a medpac.\n\r",ch );
return;
}
if ( IS_SET(ch->in_room->room_flags2, ROOM_ARENA) )
{
send_to_char("Medpacs in the arena? There's no honor in that!\n\r", ch);
return;
}
if ( medpac->value[0] <= 0 )
{
send_to_char( "Your medpac seems to be empty.\n\r",ch );
return;
}
if ( argument[0] == '\0' )
victim = ch;
else
victim = get_char_room( ch, argument );
if ( !victim )
{
ch_printf( ch, "I don't see any %s here...\n\r" , argument );
return;
}
heal = number_range( 1, 150 );
if ( heal > 0 )
{
ch_printf( ch, "You fail in your attempt at first aid.\n\r");
return;
}
if ( victim == ch )
{
ch_printf( ch, "You tend to your wounds.\n\r");
sprintf( buf , "$n uses %s to help heal $s wounds." , medpac->short_descr );
act( AT_ACTION, buf, ch, NULL, victim, TO_ROOM );
}
else
{
sprintf( buf , "You tend to $N's wounds." );
act( AT_ACTION, buf, ch, NULL, victim, TO_CHAR );
sprintf( buf , "$n uses %s to help heal $N's wounds." , medpac->short_descr );
act( AT_ACTION, buf, ch, NULL, victim, TO_NOTVICT );
sprintf( buf , "$n uses %s to help heal your wounds." , medpac->short_descr );
act( AT_ACTION, buf, ch, NULL, victim, TO_VICT );
}
--medpac->value[0];
victim->hit += URANGE ( 0, heal , victim->max_hit - victim->hit );
}
void do_snipe( CHAR_DATA *ch, char *argument )
{
OBJ_DATA * wield;
char arg[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
sh_int dir, dist;
sh_int max_dist = 3;
EXIT_DATA * pexit;
ROOM_INDEX_DATA * was_in_room;
ROOM_INDEX_DATA * to_room;
CHAR_DATA * victim;
int chance;
char buf[MAX_STRING_LENGTH];
bool pfound = FALSE;
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 elswhere.\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.",ch );
return;
}
wield = get_eq_char( ch, WEAR_WIELD );
if ( !wield || wield->item_type != ITEM_WEAPON || wield->value[3] != WEAPON_BLASTER )
{
send_to_char( "You don't seem to be holding a blaster",ch );
return;
}
argument = one_argument( argument, arg );
argument = one_argument( argument, arg2 );
if ( ( dir = get_door( arg ) ) == -1 || arg2[0] == '\0' )
{
send_to_char( "Usage: snipe <dir> <target>\n\r", ch );
return;
}
if ( ( pexit = get_exit( ch->in_room, dir ) ) == NULL )
{
send_to_char( "Are you expecting to fire through a wall!?\n\r", ch );
return;
}
if ( IS_SET( pexit->exit_info, EX_CLOSED ) )
{
send_to_char( "Are you expecting to fire through a door!?\n\r", ch );
return;
}
was_in_room = ch->in_room;
for ( dist = 0; dist <= max_dist; dist++ )
{
if ( IS_SET( pexit->exit_info, EX_CLOSED ) )
break;
if ( !pexit->to_room )
break;
to_room = NULL;
if ( pexit->distance > 1 )
to_room = generate_exit( ch->in_room , &pexit );
if ( to_room == NULL )
to_room = pexit->to_room;
char_from_room( ch );
char_to_room( ch, to_room );
if ( IS_NPC(ch) && ( victim = get_char_room_mp( ch, arg2 ) ) != NULL )
{
pfound = TRUE;
break;
}
else if ( !IS_NPC(ch) && ( victim = get_char_room( ch, arg2 ) ) != NULL )
{
pfound = TRUE;
break;
}
if ( ( pexit = get_exit( ch->in_room, dir ) ) == NULL )
break;
}
char_from_room( ch );
char_to_room( ch, was_in_room );
if ( !pfound )
{
ch_printf( ch, "You don't see that person to the %s!\n\r", dir_name[dir] );
char_from_room( ch );
char_to_room( ch, was_in_room );
return;
}
if ( victim == ch )
{
send_to_char( "Shoot yourself ... really?\n\r", ch );
return;
}
if ( IS_SET( victim->in_room->room_flags, ROOM_SAFE ) )
{
set_char_color( AT_MAGIC, ch );
send_to_char( "You can't shoot them there.\n\r", ch );
return;
}
if ( is_safe( ch, victim ) )
return;
if ( IS_AFFECTED(ch, AFF_CHARM) && ch->master == victim )
{
act( AT_PLAIN, "$N is your beloved master.", ch, NULL, victim, TO_CHAR );
return;
}
if ( ch->position == POS_FIGHTING )
{
send_to_char( "You do the best you can!\n\r", ch );
return;
}
if ( !IS_NPC( victim ) && IS_SET( ch->act, PLR_NICE ) )
{
send_to_char( "You feel too nice to do that!\n\r", ch );
return;
}
chance = IS_NPC(ch) ? 100
: (int) (0) ;
switch ( dir )
{
case 0:
case 1:
dir += 2;
break;
case 2:
case 3:
dir -= 2;
break;
case 4:
case 7:
dir += 1;
break;
case 5:
case 8:
dir -= 1;
break;
case 6:
dir += 3;
break;
case 9:
dir -=3;
break;
}
char_from_room( ch );
char_to_room( ch, victim->in_room );
if ( number_percent() < chance )
{
sprintf( buf , "A blaster shot fires at you from the %s." , dir_name[dir] );
act( AT_ACTION, buf , victim, NULL, ch, TO_CHAR );
act( AT_ACTION, "You fire at $N.", ch, NULL, victim, TO_CHAR );
sprintf( buf, "A blaster shot fires at $N from the %s." , dir_name[dir] );
act( AT_ACTION, buf, ch, NULL, victim, TO_NOTVICT );
one_hit( ch, victim, TYPE_UNDEFINED );
if ( char_died(ch) )
return;
stop_fighting( ch , TRUE );
}
else
{
act( AT_ACTION, "You fire at $N but don't even come close.", ch, NULL, victim, TO_CHAR );
sprintf( buf, "A blaster shot fired from the %s barely misses you." , dir_name[dir] );
act( AT_ACTION, buf, ch, NULL, victim, TO_ROOM );
}
char_from_room( ch );
char_to_room( ch, was_in_room );
WAIT_STATE( ch, 1 * PULSE_VIOLENCE );
if ( IS_NPC( victim ) && !char_died(victim) )
{
if ( IS_SET( victim->act , ACT_SENTINEL ) )
{
victim->was_sentinel = victim->in_room;
REMOVE_BIT( victim->act, ACT_SENTINEL );
}
start_hating( victim , ch );
start_hunting( victim, ch );
}
}
/* syntax throw <obj> [direction] [target] */
void do_throw( CHAR_DATA *ch, char *argument )
{
OBJ_DATA * obj;
OBJ_DATA * tmpobj;
char arg[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
sh_int dir;
SHIP_DATA * ship;
EXIT_DATA * pexit;
ROOM_INDEX_DATA * was_in_room;
ROOM_INDEX_DATA * to_room;
CHAR_DATA * victim;
char buf[MAX_STRING_LENGTH];
argument = one_argument( argument, arg );
argument = one_argument( argument, arg2 );
argument = one_argument( argument, arg3 );
was_in_room = ch->in_room;
if ( arg[0] == '\0' )
{
send_to_char( "Usage: throw <object> [direction] [target]\n\r", ch );
return;
}
obj = get_eq_char( ch, WEAR_MISSILE_WIELD );
if ( !obj || !nifty_is_name( arg, obj->name ) )
obj = get_eq_char( ch, WEAR_HOLD );
if ( !obj || !nifty_is_name( arg, obj->name ) )
obj = get_eq_char( ch, WEAR_WIELD );
if ( !obj || !nifty_is_name( arg, obj->name ) )
obj = get_eq_char( ch, WEAR_DUAL_WIELD );
if ( !obj || !nifty_is_name( arg, obj->name ) )
if ( !obj || !nifty_is_name_prefix( arg, obj->name ) )
obj = get_eq_char( ch, WEAR_HOLD );
if ( !obj || !nifty_is_name_prefix( arg, obj->name ) )
obj = get_eq_char( ch, WEAR_WIELD );
if ( !obj || !nifty_is_name_prefix( arg, obj->name ) )
obj = get_eq_char( ch, WEAR_DUAL_WIELD );
if ( !obj || !nifty_is_name_prefix( arg, obj->name ) )
{
ch_printf( ch, "You don't seem to be holding or wielding %s.\n\r", arg );
return;
}
if ( IS_OBJ_STAT(obj, ITEM_NOREMOVE) )
{
act( AT_PLAIN, "You can't throw $p.", ch, obj, NULL, TO_CHAR );
return;
}
if ( ch->position == POS_FIGHTING )
{
victim = who_fighting( ch );
if ( char_died ( victim ) )
return;
act( AT_ACTION, "You throw $p at $N.", ch, obj, victim, TO_CHAR );
act( AT_ACTION, "$n throws $p at $N.", ch, obj, victim, TO_NOTVICT );
act( AT_ACTION, "$n throw $p at you.", ch, obj, victim, TO_VICT );
}
else if ( arg2[0] == '\0' )
{
sprintf( buf, "$n throws %s at the floor." , obj->short_descr );
act( AT_ACTION, buf, ch, NULL, NULL, TO_ROOM );
ch_printf( ch, "You throw %s at the floor.\n\r", obj->short_descr );
victim = NULL;
}
else if ( ( dir = get_door( arg2 ) ) != -1 )
{
if ( ( pexit = get_exit( ch->in_room, dir ) ) == NULL )
{
send_to_char( "Are you expecting to throw it through a wall!?\n\r", ch );
return;
}
if ( IS_SET( pexit->exit_info, EX_CLOSED ) )
{
send_to_char( "Are you expecting to throw it through a door!?\n\r", ch );
return;
}
switch ( dir )
{
case 0:
case 1:
dir += 2;
break;
case 2:
case 3:
dir -= 2;
break;
case 4:
case 7:
dir += 1;
break;
case 5:
case 8:
dir -= 1;
break;
case 6:
dir += 3;
break;
case 9:
dir -=3;
break;
}
to_room = NULL;
if ( pexit->distance > 1 )
to_room = generate_exit( ch->in_room , &pexit );
if ( to_room == NULL )
to_room = pexit->to_room;
char_from_room( ch );
char_to_room( ch, to_room );
victim = get_char_room( ch, arg3 );
if ( victim )
{
if ( is_safe( ch, victim ) )
return;
if ( IS_AFFECTED(ch, AFF_CHARM) && ch->master == victim )
{
act( AT_PLAIN, "$N is your beloved master.", ch, NULL, victim, TO_CHAR );
return;
}
if ( !IS_NPC( victim ) && IS_SET( ch->act, PLR_NICE ) )
{
send_to_char( "You feel too nice to do that!\n\r", ch );
return;
}
char_from_room( ch );
char_to_room( ch, was_in_room );
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 elswhere.\n\r", ch );
return;
}
to_room = NULL;
if ( pexit->distance > 1 )
to_room = generate_exit( ch->in_room , &pexit );
if ( to_room == NULL )
to_room = pexit->to_room;
char_from_room( ch );
char_to_room( ch, to_room );
sprintf( buf , "Someone throws %s at you from the %s." , obj->short_descr , dir_name[dir] );
act( AT_ACTION, buf , victim, NULL, ch, TO_CHAR );
act( AT_ACTION, "You throw $p at $N.", ch, obj, victim, TO_CHAR );
sprintf( buf, "%s is thrown at $N from the %s." , obj->short_descr , dir_name[dir] );
act( AT_ACTION, buf, ch, NULL, victim, TO_NOTVICT );
}
else
{
ch_printf( ch, "You throw %s %s.\n\r", obj->short_descr , dir_name[get_dir( arg2 )] );
sprintf( buf, "%s is thrown from the %s." , obj->short_descr , dir_name[dir] );
act( AT_ACTION, buf, ch, NULL, NULL, TO_ROOM );
}
}
else if ( ( victim = get_char_room( ch, arg2 ) ) != NULL )
{
if ( is_safe( ch, victim ) )
return;
if ( IS_AFFECTED(ch, AFF_CHARM) && ch->master == victim )
{
act( AT_PLAIN, "$N is your beloved master.", ch, NULL, victim, TO_CHAR );
return;
}
if ( !IS_NPC( victim ) && IS_SET( ch->act, PLR_NICE ) )
{
send_to_char( "You feel too nice to do that!\n\r", ch );
return;
}
}
else
{
if (( ship = ship_in_room( ch->in_room , arg2 ) ) == NULL )
{
act( AT_PLAIN, "I don't see that ship or person here.", ch, NULL, argument, TO_CHAR );
return;
}
else
{
if ( !ship->hatchopen )
{
send_to_char("The hatch is closed!\n\r", ch);
return;
}
if( !ship->entrance )
{
send_to_char("That ship has no entrance!\n\r", ch);
return;
}
unequip_char( ch, obj );
separate_obj( obj );
obj_from_char( obj );
obj = obj_to_room( obj, get_room_index(ship->entrance) );
sprintf(buf, "You throw %s into %s.", obj->short_descr, ship->name );
send_to_char(buf, ch);
sprintf(buf, "%s throws %s into %s.\n\r", ch->name, obj->short_descr, ship->name);
act( AT_ACTION, buf, ch, NULL, NULL, TO_ROOM );
sprintf(buf, "%s is tossed into the ship with a *clink-clink-clink*.\n\r", obj->short_descr);
echo_to_room( AT_WHITE , get_room_index(ship->entrance) , buf );
return;
}
}
if ( obj == get_eq_char( ch, WEAR_WIELD )
&& ( tmpobj = get_eq_char( ch, WEAR_DUAL_WIELD)) != NULL )
tmpobj->wear_loc = WEAR_WIELD;
unequip_char( ch, obj );
separate_obj( obj );
obj_from_char( obj );
obj = obj_to_room( obj, ch->in_room );
if ( obj->item_type != ITEM_GRENADE )
damage_obj ( obj );
/* NOT NEEDED UNLESS REFERING TO OBJECT AGAIN
if( obj_extracted(obj) )
return;
*/
if ( ch->in_room != was_in_room )
{
char_from_room( ch );
char_to_room( ch, was_in_room );
}
WAIT_STATE( ch, PULSE_PER_SECOND*2 );
if ( IS_NPC(ch) || number_percent( ) < 0 )
global_retcode = damage( ch, victim, number_range( obj->weight*2 , (obj->weight*2 + ch->perm_str) ), TYPE_HIT, FALSE );
else
global_retcode = damage( ch, victim, 0, TYPE_HIT, FALSE );
if ( IS_NPC( victim ) && !char_died ( victim) )
{
if ( IS_SET( victim->act , ACT_SENTINEL ) )
{
victim->was_sentinel = victim->in_room;
REMOVE_BIT( victim->act, ACT_SENTINEL );
}
start_hating( victim , ch );
start_hunting( victim, ch );
}
return;
}
void do_beg( CHAR_DATA *ch, char *argument )
{
char buf [MAX_STRING_LENGTH];
char arg1 [MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int percent;
int amount;
if ( IS_NPC (ch) ) return;
argument = one_argument( argument, arg1 );
if ( ch->mount )
{
send_to_char( "You can't do that while mounted.\n\r", ch );
return;
}
if ( arg1[0] == '\0' )
{
send_to_char( "Beg fo money from whom?\n\r", ch );
return;
}
if ( ms_find_obj(ch) )
return;
if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( victim == ch )
{
send_to_char( "That's pointless.\n\r", ch );
return;
}
if ( IS_SET( ch->in_room->room_flags, ROOM_SAFE ) )
{
set_char_color( AT_MAGIC, ch );
send_to_char( "This isn't a good place to do that.\n\r", ch );
return;
}
if ( ch->position == POS_FIGHTING )
{
send_to_char( "Interesting combat technique.\n\r" , ch );
return;
}
if ( victim->position == POS_FIGHTING )
{
send_to_char( "They're a little busy right now.\n\r" , ch );
return;
}
if ( ch->position <= POS_SLEEPING )
{
send_to_char( "In your dreams or what?\n\r" , ch );
return;
}
if ( victim->position <= POS_SLEEPING )
{
send_to_char( "You might want to wake them first...\n\r" , ch );
return;
}
if ( !IS_NPC( victim ) )
{
send_to_char( "You beg them for money.\n\r", ch );
act( AT_ACTION, "$n begs you to give $s some change.\n\r", ch, NULL, victim, TO_VICT );
act( AT_ACTION, "$n begs $N for change.\n\r", ch, NULL, victim, TO_NOTVICT );
return;
}
WAIT_STATE( ch, PULSE_PER_SECOND*2 );
percent = number_percent( ) + ch->top_level - victim->top_level;
if ( percent > 0 )
{
/*
* Failure.
*/
send_to_char( "You beg them for money but don't get any!\n\r", ch );
act( AT_ACTION, "$n is really getting on your nerves with all this begging!\n\r", ch, NULL, victim, TO_VICT );
act( AT_ACTION, "$n begs $N for money.\n\r", ch, NULL, victim, TO_NOTVICT );
if ( victim->alignment < 0 && victim->top_level >= ch->top_level+5 )
{
sprintf( buf, "%s is an annoying beggar and needs to be taught a lesson!", ch->name );
do_yell( victim, buf );
global_retcode = multi_hit( victim, ch, TYPE_UNDEFINED );
}
return;
}
act( AT_ACTION, "$n begs $N for money.\n\r", ch, NULL, victim, TO_NOTVICT );
act( AT_ACTION, "$n begs you for money!\n\r", ch, NULL, victim, TO_VICT );
amount = UMIN( victim->gold , number_range(1, 10) );
if ( amount <= 0 )
{
do_look( victim , ch->name );
do_say( victim , "Sorry I have nothing to spare.\n\r" );
return;
}
ch->gold += amount;
victim->gold -= amount;
ch_printf( ch, "%s gives you %d credits.\n\r", victim->short_descr , amount );
act( AT_ACTION, "$N gives $n some money.\n\r", ch, NULL, victim, TO_NOTVICT );
act( AT_ACTION, "You give $n some money.\n\r", ch, NULL, victim, TO_VICT );
return;
}
void do_pickshiplock( CHAR_DATA *ch, char *argument )
{
do_pick( ch, argument );
}
void do_hijack( CHAR_DATA *ch, char *argument )
{
int chance;
int x;
SHIP_DATA *ship;
char buf[MAX_STRING_LENGTH];
bool uhoh = FALSE;
// CHAR_DATA *guard; <--- For the guard shits below
// ROOM_INDEX_DATA *room;
if ( (ship = ship_from_cockpit(ch->in_room->vnum)) == NULL )
{
send_to_char("&RYou must be in the cockpit of a ship to do that!\n\r",ch);
return;
}
if ( ship->class > SHIP_SPACE_STATION )
{
send_to_char("&RThis isn't a spacecraft!\n\r",ch);
return;
}
if ( check_pilot( ch , ship ) )
{
send_to_char("&RWhat would be the point of that!\n\r",ch);
return;
}
if ( ship->type == MOB_SHIP && get_trust(ch) < 102 )
{
send_to_char("&RThis ship isn't pilotable by mortals at this point in time...\n\r",ch);
return;
}
if ( ship->class == SHIP_SPACE_STATION )
{
send_to_char( "You can't do that here.\n\r" , ch );
return;
}
if ( ship->lastdoc != ship->location )
{
send_to_char("&rYou don't seem to be docked right now.\n\r",ch);
return;
}
if ( ship->shipstate != SHIP_DOCKED && ship->shipstate != SHIP_DISABLED )
{
send_to_char("The ship is not docked right now.\n\r",ch);
return;
}
if ( ship->shipstate == SHIP_DISABLED )
{
send_to_char("The ships drive is disabled .\n\r",ch);
return;
}
/* Remind to fix later, 'cause I'm sick of reading through all this fucking code
for ( room = ship->firstroom ; room ; room = room->next_in_ship )
{
for ( guard = room->first_person; guard ; guard = guard->next_in_room )
if ( IS_NPC(guard) && guard->pIndexData && guard->pIndexData->vnum == MOB_VNUM_SHIP_GUARD
&& guard->position > POS_SLEEPING && !guard->fighting )
{
start_hating( guard, ch );
start_hunting( guard , ch );
uhoh = TRUE;
}
}
*/
if ( uhoh )
{
send_to_char("Uh oh....\n\r",ch);
return;
}
chance = IS_NPC(ch) ? 0
: (int) (0) ;
x = number_percent( );
if ( x > chance )
{
send_to_char("You fail to figure out the correct launch code.\n\r",ch);
return;
}
chance = IS_NPC(ch) ? 0
: (int) (0) ;
if ( number_percent( ) < chance )
{
if (ship->hatchopen)
{
ship->hatchopen = FALSE;
sprintf( buf , "The hatch on %s closes." , ship->name);
echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );
echo_to_room( AT_YELLOW , get_room_index(ship->entrance) , "The hatch slides shut." );
}
set_char_color( AT_GREEN, ch );
send_to_char( "Launch sequence initiated.\n\r", ch);
act( AT_PLAIN, "$n starts up the ship and begins the launch sequence.", ch,
NULL, argument , TO_ROOM );
echo_to_ship( AT_YELLOW , ship , "The ship hums as it lifts off the ground.");
sprintf( buf, "%s begins to launch.", ship->name );
echo_to_room( AT_YELLOW , get_room_index(ship->location) , buf );
ship->shipstate = SHIP_LAUNCH;
ship->currspeed = ship->realspeed;
return;
}
set_char_color( AT_RED, ch );
send_to_char("You fail to work the controls properly!\n\r",ch);
return;
}
void do_special_forces ( CHAR_DATA *ch , char *argument )
{
char arg[MAX_INPUT_LENGTH];
int chance, credits;
if ( IS_NPC( ch ) || !ch->pcdata )
return;
strcpy( arg, argument );
switch( ch->substate )
{
default:
if ( ch->backup_wait )
{
send_to_char( "&RYour reinforcements are already on the way.\n\r", ch );
return;
}
if ( !ch->pcdata->clan )
{
send_to_char( "&RYou need to be a member of an organization before you can call for a guard.\n\r", ch );
return;
}
if ( ch->gold < 3500 )
{
ch_printf( ch, "&RYou dont have enough credits to send for reinforcements.\n\r" );
return;
}
chance = (int) (0);
if ( number_percent( ) < chance )
{
send_to_char( "&GYou begin making the call for reinforcements.\n\r", ch);
act( AT_PLAIN, "$n begins issuing orders int $s comlink.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 1 , do_special_forces , 1 );
ch->dest_buf = str_dup(arg);
return;
}
send_to_char("&RYou call for reinforcements but nobody answers.\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 interupted before you can finish your call.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
send_to_char( "&GYour reinforcements are on the way.\n\r", ch);
credits = 3500;
ch_printf( ch, "It cost you %d credits.\n\r", credits);
ch->gold -= UMIN( credits , ch->gold );
if ( nifty_is_name( "empire" , ch->pcdata->clan->name ) )
ch->backup_mob = MOB_VNUM_IMP_FORCES;
else if ( nifty_is_name( "rebel" , ch->pcdata->clan->name ) )
ch->backup_mob = MOB_VNUM_NR_FORCES;
else
ch->backup_mob = MOB_VNUM_MERC_FORCES;
ch->backup_wait = number_range(1,2);
}
void do_elite_guard ( CHAR_DATA *ch , char *argument )
{
char arg[MAX_INPUT_LENGTH];
int chance, credits;
if ( IS_NPC( ch ) || !ch->pcdata )
return;
strcpy( arg, argument );
switch( ch->substate )
{
default:
if ( ch->backup_wait )
{
send_to_char( "&RYou already have backup coming.\n\r", ch );
return;
}
if ( !ch->pcdata->clan )
{
send_to_char( "&RYou need to be a member of an organization before you can call for a guard.\n\r", ch );
return;
}
if ( ch->gold < 2000 )
{
ch_printf( ch, "&RYou dont have enough credits.\n\r", ch );
return;
}
chance = (int) (0);
if ( number_percent( ) < chance )
{
send_to_char( "&GYou begin making the call for reinforcements.\n\r", ch);
act( AT_PLAIN, "$n begins issuing orders into $s comlink.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 1 , do_elite_guard , 1 );
ch->dest_buf = str_dup(arg);
return;
}
send_to_char("&RYou call for a guard but nobody answers.\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 interupted before you can finish your call.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
send_to_char( "&GYour guard is on the way.\n\r", ch);
credits = 2000;
ch_printf( ch, "It cost you %d credits.\n\r", credits);
ch->gold -= UMIN( credits , ch->gold );
if ( nifty_is_name( "empire" , ch->pcdata->clan->name ) )
ch->backup_mob = MOB_VNUM_IMP_ELITE;
else if ( nifty_is_name( "rebel" , ch->pcdata->clan->name ) )
ch->backup_mob = MOB_VNUM_NR_ELITE;
else
ch->backup_mob = MOB_VNUM_MERC_ELITE;
ch->backup_wait = 1;
}
void do_add_patrol ( CHAR_DATA *ch , char *argument )
{
char arg[MAX_INPUT_LENGTH];
int chance, credits;
if ( IS_NPC( ch ) || !ch->pcdata )
return;
strcpy( arg, argument );
switch( ch->substate )
{
default:
if ( ch->backup_wait )
{
send_to_char( "&RYou already have backup coming.\n\r", ch );
return;
}
if ( !ch->pcdata->clan )
{
send_to_char( "&RYou need to be a member of an organization before you can call for a guard.\n\r", ch );
return;
}
if ( ch->gold < 3000 )
{
ch_printf( ch, "&RYou dont have enough credits.\n\r", ch );
return;
}
chance = (int) (0);
if ( number_percent( ) < chance )
{
send_to_char( "&GYou begin making the call for reinforcements.\n\r", ch);
act( AT_PLAIN, "$n begins issuing orders int $s comlink.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 1 , do_add_patrol , 1 );
ch->dest_buf = str_dup(arg);
return;
}
send_to_char("&RYou call for a guard but nobody answers.\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 interupted before you can finish your call.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
send_to_char( "&GYour guard is on the way.\n\r", ch);
credits = 3000;
ch_printf( ch, "It cost you %d credits.\n\r", credits);
ch->gold -= UMIN( credits , ch->gold );
if ( nifty_is_name( "empire" , ch->pcdata->clan->name ) )
ch->backup_mob = MOB_VNUM_IMP_PATROL;
else if ( nifty_is_name( "rebel" , ch->pcdata->clan->name ) )
ch->backup_mob = MOB_VNUM_NR_PATROL;
else
ch->backup_mob = MOB_VNUM_MERC_PATROL;
ch->backup_wait = 1;
}
void do_jail ( CHAR_DATA *ch , char *argument )
{
CHAR_DATA *victim =NULL;
CLAN_DATA *clan =NULL;
ROOM_INDEX_DATA *jail =NULL;
if ( IS_NPC (ch) ) return;
if ( !ch->pcdata || ( clan = ch->pcdata->clan ) == NULL )
{
send_to_char( "Only members of organizations can jail their enemies.\n\r", ch );
return;
}
jail = get_room_index( clan->jail );
if ( !jail && clan->mainclan )
jail = get_room_index( clan->mainclan->jail );
if ( !jail )
{
send_to_char( "Your orginization does not have a suitable prison.\n\r", ch );
return;
}
if ( ch->mount )
{
send_to_char( "You can't do that while mounted.\n\r", ch );
return;
}
if ( argument[0] == '\0' )
{
send_to_char( "Jail who?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, argument ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( victim == ch )
{
send_to_char( "That's pointless.\n\r", ch );
return;
}
if ( IS_NPC(victim) )
{
send_to_char( "That would be a waste of time.\n\r", ch );
return;
}
if ( IS_SET( ch->in_room->room_flags, ROOM_SAFE ) )
{
set_char_color( AT_MAGIC, ch );
send_to_char( "This isn't a good place to do that.\n\r", ch );
return;
}
if ( ch->position == POS_FIGHTING )
{
send_to_char( "Interesting combat technique.\n\r" , ch );
return;
}
if ( ch->position <= POS_SLEEPING )
{
send_to_char( "In your dreams or what?\n\r" , ch );
return;
}
if ( victim->position >= POS_SLEEPING )
{
send_to_char( "You will have to stun them first.\n\r" , ch );
return;
}
send_to_char( "You have them escorted off to jail.\n\r", ch );
act( AT_ACTION, "You have a strange feeling that you've been moved.\n\r", ch, NULL, victim, TO_VICT );
act( AT_ACTION, "$n has $N escorted away.\n\r", ch, NULL, victim, TO_NOTVICT );
char_from_room ( victim );
char_to_room ( victim , jail );
act( AT_ACTION, "The door opens briefly as $n is shoved into the room.\n\r", victim, NULL, NULL, TO_ROOM );
SET_BIT(victim->act, PLR_CONVICT);
return;
}
void do_smalltalk ( CHAR_DATA *ch , char *argument )
{
char buf [MAX_STRING_LENGTH];
char arg1 [MAX_INPUT_LENGTH];
CHAR_DATA *victim = NULL;
PLANET_DATA *planet = NULL;
CLAN_DATA *clan = NULL;
int percent;
if ( IS_NPC(ch) || !ch->pcdata )
{
send_to_char( "What would be the point of that.\n\r", ch );
}
argument = one_argument( argument, arg1 );
if ( ch->mount )
{
send_to_char( "You can't do that while mounted.\n\r", ch );
return;
}
if ( arg1[0] == '\0' )
{
send_to_char( "Create smalltalk with whom?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( victim == ch )
{
send_to_char( "That's pointless.\n\r", ch );
return;
}
if ( IS_SET( ch->in_room->room_flags, ROOM_SAFE ) )
{
set_char_color( AT_MAGIC, ch );
send_to_char( "This isn't a good place to do that.\n\r", ch );
return;
}
if ( ch->position == POS_FIGHTING )
{
send_to_char( "Interesting combat technique.\n\r" , ch );
return;
}
if ( victim->position == POS_FIGHTING )
{
send_to_char( "They're a little busy right now.\n\r" , ch );
return;
}
if ( !IS_NPC(victim) || victim->vip_flags == 0 )
{
send_to_char( "Diplomacy would be wasted on them.\n\r" , ch );
return;
}
if ( ch->position <= POS_SLEEPING )
{
send_to_char( "In your dreams or what?\n\r" , ch );
return;
}
if ( victim->position <= POS_SLEEPING )
{
send_to_char( "You might want to wake them first...\n\r" , ch );
return;
}
percent = number_percent( );
WAIT_STATE( ch, PULSE_PER_SECOND*3 );
if ( percent - victim->top_level > 0 )
{
/*
* Failure.
*/
send_to_char( "You attempt to make smalltalk with them.. but are ignored.\n\r", ch );
act( AT_ACTION, "$n is really getting on your nerves with all this chatter!\n\r", ch, NULL, victim, TO_VICT );
act( AT_ACTION, "$n asks $N about the weather but is ignored.\n\r", ch, NULL, victim, TO_NOTVICT );
if ( victim->alignment < -500 && victim->top_level >= ch->top_level+5 )
{
sprintf( buf, "SHUT UP %s!", ch->name );
do_yell( victim, buf );
global_retcode = multi_hit( victim, ch, TYPE_UNDEFINED );
}
return;
}
send_to_char( "You strike up a short conversation with them.\n\r", ch );
act( AT_ACTION, "$n smiles at you and says, 'hello'.\n\r", ch, NULL, victim, TO_VICT );
act( AT_ACTION, "$n chats briefly with $N.\n\r", ch, NULL, victim, TO_NOTVICT );
if ( IS_NPC(ch) || !ch->pcdata || !ch->pcdata->clan || !ch->in_room->area || !ch->in_room->area->planet )
return;
if ( ( clan = ch->pcdata->clan->mainclan ) == NULL )
clan = ch->pcdata->clan;
planet = ch->in_room->area->planet;
if ( clan != planet->governed_by )
return;
planet->pop_support += 0.2;
send_to_char( "Popular support for your organization increases slightly.\n\r", ch );
if ( planet->pop_support > 100 )
planet->pop_support = 100;
}
void do_propeganda ( CHAR_DATA *ch , char *argument )
{
char buf [MAX_STRING_LENGTH];
char arg1 [MAX_INPUT_LENGTH];
CHAR_DATA *victim;
PLANET_DATA *planet;
CLAN_DATA *clan;
int percent;
if ( IS_NPC(ch) || !ch->pcdata || !ch->pcdata->clan || !ch->in_room->area || !ch->in_room->area->planet )
{
send_to_char( "What would be the point of that.\n\r", ch );
return;
}
argument = one_argument( argument, arg1 );
if ( ch->mount )
{
send_to_char( "You can't do that while mounted.\n\r", ch );
return;
}
if ( arg1[0] == '\0' )
{
send_to_char( "Spread propeganda to who?\n\r", ch );
return;
}
if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( victim == ch )
{
send_to_char( "That's pointless.\n\r", ch );
return;
}
if ( IS_SET( ch->in_room->room_flags, ROOM_SAFE ) )
{
set_char_color( AT_MAGIC, ch );
send_to_char( "This isn't a good place to do that.\n\r", ch );
return;
}
if ( ch->position == POS_FIGHTING )
{
send_to_char( "Interesting combat technique.\n\r" , ch );
return;
}
if ( victim->position == POS_FIGHTING )
{
send_to_char( "They're a little busy right now.\n\r" , ch );
return;
}
if ( victim->vip_flags == 0 )
{
send_to_char( "Diplomacy would be wasted on them.\n\r" , ch );
return;
}
if ( ch->position <= POS_SLEEPING )
{
send_to_char( "In your dreams or what?\n\r" , ch );
return;
}
if ( victim->position <= POS_SLEEPING )
{
send_to_char( "You might want to wake them first...\n\r" , ch );
return;
}
if ( ( clan = ch->pcdata->clan->mainclan ) == NULL )
clan = ch->pcdata->clan;
planet = ch->in_room->area->planet;
sprintf( buf, ", and the evils of %s" , planet->governed_by ? planet->governed_by->name : "their current leaders" );
ch_printf( ch, "You speak to them about the benifits of the %s%s.\n\r", ch->pcdata->clan->name,
planet->governed_by == clan ? "" : buf );
act( AT_ACTION, "$n speaks about his organization.\n\r", ch, NULL, victim, TO_VICT );
act( AT_ACTION, "$n tells $N about their organization.\n\r", ch, NULL, victim, TO_NOTVICT );
WAIT_STATE( ch, PULSE_PER_SECOND*3 );
percent = number_percent();
if ( percent - get_curr_cha(ch) + victim->top_level > 0 )
{
if ( planet->governed_by != clan )
{
sprintf( buf, "%s is a traitor!" , ch->name);
do_yell( victim, buf );
global_retcode = multi_hit( victim, ch, TYPE_UNDEFINED );
}
return;
}
if ( planet->governed_by == clan )
{
planet->pop_support += .5 + ch->top_level/15;
send_to_char( "Popular support for your organization increases.\n\r", ch );
}
else
{
planet->pop_support -= .5 + ch->top_level/15;
send_to_char( "Popular support for the current government decreases.\n\r", ch );
}
if ( planet->pop_support > 100 )
planet->pop_support = 100;
if ( planet->pop_support < -100 )
planet->pop_support = -100;
save_planet(planet);
}
void do_bribe ( CHAR_DATA *ch , char *argument )
{
char arg1 [MAX_INPUT_LENGTH];
CHAR_DATA *victim;
PLANET_DATA *planet;
CLAN_DATA *clan;
int percent, amount;
if ( IS_NPC(ch) || !ch->pcdata || !ch->pcdata->clan || !ch->in_room->area || !ch->in_room->area->planet )
{
send_to_char( "What would be the point of that.\n\r", ch );
return;
}
argument = one_argument( argument, arg1 );
if ( ch->mount )
{
send_to_char( "You can't do that while mounted.\n\r", ch );
return;
}
if ( argument[0] == '\0' )
{
send_to_char( "Bribe who how much?\n\r", ch );
return;
}
amount = atoi( argument );
if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
{
send_to_char( "They aren't here.\n\r", ch );
return;
}
if ( victim == ch )
{
send_to_char( "That's pointless.\n\r", ch );
return;
}
if ( IS_SET( ch->in_room->room_flags, ROOM_SAFE ) )
{
set_char_color( AT_MAGIC, ch );
send_to_char( "This isn't a good place to do that.\n\r", ch );
return;
}
if ( amount > ch->gold)
{
send_to_char( "Perhaps if you had that many credits...\n\r", ch);
return;
}
if ( amount <= 0 )
{
send_to_char( "A little bit more money would be a good plan.\n\r", ch );
return;
}
if ( amount > 10000)
{
send_to_char( "You cannot bribe for more than 10000 credits at a time.\n\r", ch);
return;
}
if ( ch->position == POS_FIGHTING )
{
send_to_char( "Interesting combat technique.\n\r" , ch );
return;
}
if ( victim->position == POS_FIGHTING )
{
send_to_char( "They're a little busy right now.\n\r" , ch );
return;
}
if ( ch->position <= POS_SLEEPING )
{
send_to_char( "In your dreams or what?\n\r" , ch );
return;
}
if ( victim->position <= POS_SLEEPING )
{
send_to_char( "You might want to wake them first...\n\r" , ch );
return;
}
if ( victim->vip_flags == 0 )
{
send_to_char( "Diplomacy would be wasted on them.\n\r" , ch );
return;
}
ch->gold -= amount;
victim->gold += amount;
ch_printf( ch, "You give them a small gift on behalf of %s.\n\r", ch->pcdata->clan->name );
act( AT_ACTION, "$n offers you a small bribe.\n\r", ch, NULL, victim, TO_VICT );
act( AT_ACTION, "$n gives $N some money.\n\r", ch, NULL, victim, TO_NOTVICT );
if ( !IS_NPC( victim ) )
return;
WAIT_STATE( ch, PULSE_PER_SECOND*3 );
if ( percent - amount + victim->top_level > 0 )
return;
if ( ( clan = ch->pcdata->clan->mainclan ) == NULL )
clan = ch->pcdata->clan;
planet = ch->in_room->area->planet;
if ( clan == planet->governed_by )
{
planet->pop_support += URANGE( 0.1 , amount/1000 , 2 );
send_to_char( "Popular support for your organization increases slightly.\n\r", ch );
}
if ( planet->pop_support > 100 )
planet->pop_support = 100;
}
void do_mass_propeganda ( CHAR_DATA *ch , char *argument )
{
char buf [MAX_STRING_LENGTH];
CHAR_DATA *rch;
PLANET_DATA *planet;
CLAN_DATA *clan;
int victims = 0;
if ( IS_NPC(ch) || !ch->pcdata || !ch->pcdata->clan || !ch->in_room->area || !ch->in_room->area->planet )
{
send_to_char( "What would be the point of that.\n\r", ch );
return;
}
if ( ch->mount )
{
send_to_char( "You can't do that while mounted.\n\r", ch );
return;
}
if ( IS_SET( ch->in_room->room_flags, ROOM_SAFE ) )
{
set_char_color( AT_MAGIC, ch );
send_to_char( "This isn't a good place to do that.\n\r", ch );
return;
}
if ( ch->position == POS_FIGHTING )
{
send_to_char( "Interesting combat technique.\n\r" , ch );
return;
}
if ( ch->position <= POS_SLEEPING )
{
send_to_char( "In your dreams or what?\n\r" , ch );
return;
}
if ( ( clan = ch->pcdata->clan->mainclan ) == NULL )
clan = ch->pcdata->clan;
planet = ch->in_room->area->planet;
sprintf( buf, ", and the evils of %s" , planet->governed_by ? planet->governed_by->name : "their current leaders" );
ch_printf( ch, "You speak to the people about the benefits of the %s%s.\n\r", ch->pcdata->clan->name,
planet->governed_by == clan ? "" : buf );
act( AT_ACTION, "$n speaks about their organization.\n\r", ch, NULL, NULL, TO_ROOM );
WAIT_STATE( ch, PULSE_PER_SECOND*3 );
if ( number_percent() < 0 )
{
for ( rch = ch->in_room->first_person; rch; rch = rch->next_in_room )
{
if ( rch == ch )
continue;
if (!IS_NPC(rch))
continue;
if ( rch->vip_flags == 0 )
continue;
if ( can_see( ch, rch ) )
victims++;
else
continue;
}
if ( planet->governed_by == clan )
{
planet->pop_support += (.5 + ch->top_level/10)*victims;
send_to_char( "Popular support for your organization increases.\n\r", ch );
}
else
{
planet->pop_support -= (ch->top_level/10)*victims;
send_to_char( "Popular support for the current government decreases.\n\r", ch );
}
if ( planet->pop_support > 100 )
planet->pop_support = 100;
if ( planet->pop_support < -100 )
planet->pop_support = -100;
save_planet(planet);
return;
}
else
{
send_to_char("They don't even seem interested in what you have to say.\n\r",ch);
return;
}
return;
}
void do_gatherinfo ( CHAR_DATA *ch , char *argument )
{
CHAR_DATA *victim;
PLANET_DATA *planet2;
CHAR_DATA *mob;
SHIP_DATA *ship2;
bool has_mob = FALSE;
bool ch_planet = FALSE;
bool ship_landed = FALSE;
bool ship_flight = FALSE;
int iAbility;
int diff = 40;
int chance;
if( IS_NPC(ch) )
return;
if( ch->position < POS_STANDING )
{
send_to_char( "Perhaps you should be standing to talk to people.\n\r", ch );
return;
}
if( argument[0] == '\0' )
{
send_to_char( "Attempt to gather information on whom?\n\r", ch );
return;
}
if( ( victim = get_char_world( ch, argument ) ) == NULL )
{
send_to_char( "That player is not logged on.\n\r", ch );
return;
}
if( IS_NPC(victim) )
{
send_to_char( "Not on NPCs.\n\r", ch );
return;
}
if( !IS_IMMORTAL(ch) && IS_IMMORTAL(victim) )
{
send_to_char( "Their god-like powers prevent you from discovering anything.\n\r", ch );
return;
}
if( !IS_IMMORTAL(ch) && ch == victim )
{
send_to_char( "Lets not waste anymore time now.\n\r", ch );
return;
}
for( mob = ch->in_room->first_person; mob; mob = mob->next )
{
if( IS_NPC(mob) )
{
has_mob = TRUE;
break;
}
}
if( !has_mob )
{
send_to_char( "There's no one around to tell you anything.\n\r", ch );
return;
}
diff -= victim->reputation;
chance = ( number_range( 1, 20 ) + ch->skill_level[GATHER_INFO] + stat_table[get_curr_cha(ch)].mod + ch->reputation );
if( ch->in_room->area->planet )
{
if( ch->pcdata->clan )
{
if( !str_cmp( ch->in_room->area->planet->name, ch->pcdata->clan->name ) )
{
ch_planet = TRUE;
diff -= 5;
}
}
else if( victim->pcdata->clan && !str_cmp( ch->in_room->area->planet->governed_by->name, victim->pcdata->clan->name ) )
diff += 10;
else
diff += 5;
}
if( diff <= 10 )
diff = 40;
if( chance >= 10 && chance < diff )
{
act( AT_PLAIN, "You are unable to extract any information on $N.", ch, NULL, victim, TO_CHAR );
WAIT_STATE( ch, PULSE_PER_SECOND*5 );
return;
}
else if( chance < 10 )
{
act( AT_PLAIN, "You are unable to extract any information on $N.", ch, NULL, victim, TO_CHAR );
act( AT_BLOOD, "You hear a rumor that $n is inquiring about you.", ch, NULL, victim, TO_VICT );
WAIT_STATE( ch, PULSE_PER_SECOND*5 );
return;
}
if( ( ship2 = ship_from_room( victim->in_room->vnum ) ) != NULL )
{
if( ship2->shipstate == SHIP_DOCKED )
ship_landed = TRUE;
else
ship_flight = TRUE;
}
WAIT_STATE( ch, PULSE_PER_SECOND*5 );
send_to_char( "\n\r", ch );
ch_printf( ch, "&w&WYou gather the following information about &G%s&w&W:\n\r", victim->name );
send_to_char( "\n\r", ch );
ch_printf( ch, "&G%s&w&W is a &G%s %s&w&W.\n\r", victim->name, victim->sex == SEX_MALE ? "Male" : victim->sex == SEX_FEMALE ? "Female" : "Neuter", get_race(victim) );
ch_printf( ch, "&G%s&w&W is &G%d&w&W years old.\n\r", victim->sex == SEX_MALE ? "He" : victim->sex == SEX_FEMALE ? "She" : "It", get_age(victim) );
if( victim->pcdata->clan && victim->class_level[INVESTIGATOR_ABILITY] > 0 && chance >= ( diff + 10 ) )
ch_printf( ch, "&G%s&w&W belongs to the &G%s&w&W.\n\r", victim->name, victim->pcdata->clan->name );
else if( victim->class_level[INVESTIGATOR_ABILITY] == 0 && victim->pcdata->clan )
ch_printf( ch, "&G%s&w&W belongs to the %&Gs&w&W.\n\r", victim->name, victim->pcdata->clan->name );
else
ch_printf( ch, "&G%s&w&W belongs to no organization.\n\r", victim->name );
if( ch_planet )
{
bool force = FALSE;
for( iAbility = 0; iAbility < MAX_ABILITY; iAbility++ )
{
if( victim->class_level[iAbility] == 0 )
continue;
if( ( iAbility == JEDICONSULAR_ABILITY || iAbility == JEDIGUARDIAN_ABILITY || iAbility == JEDIMASTER_ABILITY ) && !force )
{
force = TRUE;
ch_printf( ch, "&G%s&w&W is strong in the Force.\n\r", victim->name );
break;
}
}
}
if( ship_landed )
{
ch_printf( ch, "&G%s&w&W was last seen boarding the &G%s&w&W on &G%s&w&W\n\r", victim->name, ship2->name, ship2->lastdoc );
return;
}
if( ship_flight )
{
ch_printf( ch, "&G%s&w&W was last seen departing from &G%s&w&W aboard the &G%s&w&W.\n\r", victim->name, ship2->lastdoc, ship2->name );
return;
}
planet2 = victim->in_room->area->planet;
if( !planet2 )
{
ch_printf( ch, "&G%s's&w&W current location is unknown.\n\r", victim->name );
return;
}
ch_printf( ch, "&G%s&w&W was last seen on &G%s&w&W\n\r", victim->name, planet2->name );
return;
}
void do_repair( CHAR_DATA *ch, char *argument)
{
OBJ_DATA *obj,*cobj;
char arg[MAX_STRING_LENGTH];
int chance;
bool checktool, checksew;
strcpy(arg, argument);
switch( ch->substate )
{
default:
if ( arg[0] == '\0' )
{
send_to_char( "Repair what?\n\r", ch );
return;
}
if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
{
send_to_char( "&RYou do not have that item.\n\r&w", ch);
return;
}
checktool = FALSE;
checksew = 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;
}
if (obj->item_type != ITEM_WEAPON && obj->item_type != ITEM_ARMOR)
{
send_to_char( "&RYou can only repair weapons and armor.&w\n\r", ch);
return;
}
if (obj->item_type == ITEM_WEAPON && obj->value[0] == INIT_WEAPON_CONDITION)
{
send_to_char("&WIt does not appear to be in need of repair.\n\r", ch);
return;
}
else if(obj->item_type == ITEM_ARMOR && obj->value[0] == obj->value[1])
{
send_to_char("&WIt does not appear to be in need of repair.\n\r", ch);
return;
}
for ( cobj = ch->last_carrying; cobj; cobj = cobj->prev_content )
{
if (cobj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (cobj->item_type == ITEM_THREAD)
checksew = TRUE;
}
if(!checktool && obj->item_type == ITEM_WEAPON)
{
send_to_char("&w&RYou need a toolkit to repair weapons.\n\r", ch);
return;
}
if(!checksew && obj->item_type == ITEM_ARMOR)
{
send_to_char("&w&RYou need a needle and thread to repair armor.\n\r", ch);
return;
}
send_to_char( "&W&GYou begin to repair your equipment...&W\n\r", ch);
act( AT_PLAIN, "$n takes $s tools and begins to repair something.", ch, NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 5 , do_repair , 1 );
ch->dest_buf = str_dup(arg);
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;
chance = IS_NPC(ch) ? ch->top_level : (int)(0);
if ( number_percent( ) > chance*2 )
{
send_to_char("&RYou realize your attempts to repair your equipment have had no effect.\n\r", ch);
return;
}
if ( ( obj = get_obj_carry( ch, arg ) ) == NULL )
{
send_to_char( "&RError S3. Report to Administration\n\r&w", ch);
return;
}
switch ( obj->item_type )
{
default:
send_to_char( "Error S4. Contact Administration.\n\r", ch);
return;
case ITEM_ARMOR:
obj->value[0] = obj->value[1];
break;
case ITEM_WEAPON:
obj->value[0] = INIT_WEAPON_CONDITION;
break;
case ITEM_DEVICE:
obj->value[2] = obj->value[1];
break;
}
send_to_char("&GYou repair your equipment back to fine condition.&W\n\r", ch);
return;
}
void do_makepike( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int level, chance, charge;
bool checktool, checkdura, checkbatt, checkoven;
OBJ_DATA *obj;
OBJ_INDEX_DATA *pObjIndex;
int vnum;
AFFECT_DATA *paf;
strcpy( arg , argument );
switch( ch->substate )
{
default:
if ( arg[0] == '\0' )
{
send_to_char( "&RUsage: Makepike <name>\n\r&w", ch);
return;
}
checktool = FALSE;
checkdura = FALSE;
checkbatt = FALSE;
checkoven = 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_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_DURASTEEL)
checkdura = TRUE;
if (obj->item_type == ITEM_BATTERY)
checkbatt = TRUE;
if (obj->item_type == ITEM_OVEN)
checkoven = TRUE;
}
if ( !checktool )
{
send_to_char( "&RYou need toolkit to make a force pike.\n\r", ch);
return;
}
if ( !checkdura )
{
send_to_char( "&RYou need something to make it out of.\n\r", ch);
return;
}
if ( !checkbatt )
{
send_to_char( "&RYou need a power source for your pike.\n\r", ch);
return;
}
if ( !checkoven )
{
send_to_char( "&RYou need a small furnace to heat the metal.\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 crafting a force pike.\n\r", ch);
act( AT_PLAIN, "$n takes $s tools and a small oven and begins to work on something.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 30 , do_makepike , 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 = 74;
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;
checkoven = FALSE;
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_OVEN)
checkoven = TRUE;
if (obj->item_type == ITEM_DURASTEEL && checkdura == FALSE)
{
checkdura = TRUE;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
}
if (obj->item_type == ITEM_BATTERY && checkbatt == FALSE )
{
charge = UMAX( 5, obj->value[0] );
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkbatt = TRUE;
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (0) ;
if ( number_percent( ) > chance*2 || ( !checktool ) || ( !checkdura ) || ( !checkbatt ) || ( !checkoven ) )
{
send_to_char( "&RYou activate your newly created force pike.\n\r", ch);
send_to_char( "&RIt hums softly for a few seconds then begins to shake violently.\n\r", ch);
send_to_char( "&RIt finally shatters breaking apart into a dozen pieces.\n\r", ch);
return;
}
obj = create_object( pObjIndex, level );
obj->item_type = ITEM_WEAPON;
SET_BIT( obj->wear_flags, ITEM_WIELD );
SET_BIT( obj->wear_flags, ITEM_TAKE );
obj->level = level;
obj->weight = 3;
STRFREE( obj->name );
strcpy( buf, arg );
strcat( buf, " force pike" );
strcat( buf, remand(buf));
obj->name = STRALLOC( buf );
strcpy( buf, arg );
STRFREE( obj->short_descr );
obj->short_descr = STRALLOC( buf );
STRFREE( obj->description );
strcat( buf, " was left here." );
CREATE( paf, AFFECT_DATA, 1 );
paf->type = -1;
paf->duration = -1;
paf->location = get_atype( "parry" );
paf->modifier = level/3;
paf->bitvector = 0;
paf->next = NULL;
LINK( paf, obj->first_affect, obj->last_affect, next, prev );
++top_affect;
obj->description = STRALLOC( buf );
obj->value[0] = INIT_WEAPON_CONDITION;
obj->value[1] = (int) (level/10+10); /* min dmg */
obj->value[2] = (int) (level/2+20); /* max dmg */
obj->value[3] = WEAPON_FORCE_PIKE;
obj->value[4] = charge;
obj->value[5] = charge;
obj->cost = obj->value[2]*10;
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish your work and hold up your newly created force pike.&w\n\r", ch);
act( AT_PLAIN, "$n finishes crafting a force pike.", ch,
NULL, argument , TO_ROOM );
return;
}
void do_makebug( CHAR_DATA *ch, char *argument )
{
int level, chance;
bool checktool,checkbatt,checkcirc;
OBJ_DATA *obj;
OBJ_INDEX_DATA *pObjIndex;
int vnum;
switch( ch->substate )
{
default:
checktool = 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;
}
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 = TRUE;
if (obj->item_type == ITEM_CIRCUIT)
checkcirc = TRUE;
}
if ( !checktool )
{
send_to_char( "&RYou need toolkit to make a bug.\n\r", ch);
return;
}
if ( !checkbatt )
{
send_to_char( "&RYou need a small battery to power the bug.\n\r", ch);
return;
}
if ( !checkcirc )
{
send_to_char( "&RYou're going to need some circuitry.\n\r", ch);
return;
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (0);
if ( number_percent( ) < chance )
{
send_to_char( "&GYou begin the process of making a bug.\n\r", ch);
act( AT_PLAIN, "$n takes $s tools and begins to work on something.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 15 , do_makebug , 1 );
ch->dest_buf = str_dup("blah");
return;
}
send_to_char("&RYou're not quite sure how to do it...\n\r",ch);
return;
case 1:
if ( !ch->dest_buf )
return;
ch->dest_buf = str_dup("blah");
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 = 77;
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;
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_CIRCUIT && checkcirc == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkcirc = TRUE;
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (0) ;
if ( number_percent( ) > chance*2 || ( !checktool ) || ( !checkbatt ) || ( !checkcirc) )
{
send_to_char( "&RYou finish and activate the bug, but sadly, it melts into nothing.\n\r", ch);
return;
}
obj = create_object( pObjIndex, level );
obj->item_type = ITEM_BUG;
SET_BIT( obj->wear_flags, ITEM_HOLD );
SET_BIT( obj->wear_flags, ITEM_TAKE );
obj->level = level;
obj->weight = 1;
STRFREE( obj->name );
obj->name = STRALLOC("device bug");
STRFREE( obj->short_descr );
obj->short_descr = STRALLOC( "a small bug" );
STRFREE( obj->description );
obj->description = STRALLOC( "A small electronic device was dropped here." );
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish and activate the bug. It works beautifully.&w\n\r", ch);
act( AT_PLAIN, "$n finishes making a bug.", ch,
NULL, argument , TO_ROOM );
return;
}
void do_makebeacon( CHAR_DATA *ch, char *argument )
{
int level, chance;
bool checktool,checkbatt,checkcirc;
OBJ_DATA *obj;
OBJ_INDEX_DATA *pObjIndex;
int vnum;
switch( ch->substate )
{
default:
checktool = 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;
}
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 = TRUE;
if (obj->item_type == ITEM_CIRCUIT)
checkcirc = TRUE;
}
if ( !checktool )
{
send_to_char( "&RYou need toolkit to make a beacon.\n\r", ch);
return;
}
if ( !checkbatt )
{
send_to_char( "&RYou need a small battery to power the beacon.\n\r", ch);
return;
}
if ( !checkcirc )
{
send_to_char( "&RYou're going to need some circuitry.\n\r", ch);
return;
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (0);
if ( number_percent( ) < chance )
{
send_to_char( "&GYou begin the process of making a beacon.\n\r", ch);
act( AT_PLAIN, "$n takes $s tools and begins to work on something.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 15 , do_makebeacon , 1 );
ch->dest_buf = str_dup("blah");
return;
}
send_to_char("&RYou're not quite sure how to do it...\n\r",ch);
return;
case 1:
if ( !ch->dest_buf )
return;
ch->dest_buf = str_dup("blah");
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 = 78;
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;
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_CIRCUIT && checkcirc == FALSE)
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkcirc = TRUE;
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (0) ;
if ( number_percent( ) > chance*2 || ( !checktool ) || ( !checkbatt ) || ( !checkcirc) )
{
send_to_char( "&RYou finish and activate the beacon, but sadly, it melts into nothing.\n\r", ch);
return;
}
obj = create_object( pObjIndex, level );
obj->item_type = ITEM_BEACON;
SET_BIT( obj->wear_flags, ITEM_HOLD );
SET_BIT( obj->wear_flags, ITEM_TAKE );
obj->level = level;
obj->weight = 1;
STRFREE( obj->name );
obj->name = STRALLOC("device beacon");
STRFREE( obj->short_descr );
obj->short_descr = STRALLOC( "a locator beacon" );
STRFREE( obj->description );
obj->description = STRALLOC( "A small electronic device was dropped here." );
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish and activate the beacon. It works beautifully.&w\n\r", ch);
act( AT_PLAIN, "$n finishes making a beacon.", ch,
NULL, argument , TO_ROOM );
return;
}
void do_plantbeacon( CHAR_DATA *ch, char *argument )
{
SHIP_DATA *ship;
OBJ_DATA *obj;
bool checkbeacon = FALSE;
char buf[MAX_STRING_LENGTH];
if(IS_NPC(ch)) return;
if(argument[0] == '\0')
{
send_to_char("Usage: plantbeacon <ship>\n\r", ch);
return;
}
if ((ship = ship_in_room(ch->in_room, argument)) == NULL){
send_to_char("That ship isn't here.\n\r", ch);
return;
}
if(is_name(ch->name, ship->pbeacon)){
send_to_char("You have already planted a beacon on that ship.\n\r", ch);
return;
}
for(obj = ch->last_carrying; obj; obj = obj->prev_content)
if(obj->item_type == ITEM_BEACON)
checkbeacon = TRUE;
if(checkbeacon == FALSE)
{
send_to_char("You don't have any beacons to plant.\n\r", ch);
return;
}
if (number_percent() < 0){
sprintf(buf, "You place a locating beacon on the hull of %s.\n\r", ship->name);
send_to_char(buf, ch);
sprintf(buf, "%s places a device on the hull of %s.", ch->name, ship->name);
act(AT_PLAIN, buf, ch, NULL, NULL, TO_ROOM);
sprintf(buf, "%s %s", ship->pbeacon, ch->name);
STRFREE(ship->pbeacon);
ship->pbeacon = STRALLOC(buf);
save_ship(ship);
for(obj = ch->last_carrying; obj; obj = obj->prev_content)
{
if(obj->item_type == ITEM_BEACON)
{
separate_obj(obj); obj_from_char(obj); extract_obj(obj);
break;
}
}
return;
}
else {
send_to_char("&RYou're not quite sure where to place the beacon.\n\r", ch);
return;
}
}
void do_showbeacons( CHAR_DATA *ch, char *argument )
{
SHIP_DATA *ship;
SHIP_DATA *ship2;
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
char buf3[MAX_STRING_LENGTH];
int count = 0;
if(IS_NPC(ch)) return;
if (number_percent() > 0)
{
send_to_char("You can't figure out what to do.\n\r", ch);
return;
}
send_to_char("\n\r",ch);
send_to_char("&zRequesting response from active locator beacons...\n\r", ch);
send_to_char("&w__________________________________________________\n\r\n\r",ch);
for ( ship = first_ship; ship; ship = ship->next )
{
if(is_name(ch->name, ship->pbeacon))
{
if(!ship->in_room && ship->shipstate != SHIP_HYPERSPACE)
sprintf(buf3, "&w%.0f&z, &w%.0f&z, &w%.0f", ship->vx, ship->vy, ship->vz);
if(ship->shipstate == SHIP_HYPERSPACE)
sprintf(buf3, "In Hyperspace");
for(ship2 = first_ship; ship2; ship2 = ship2->next)
{
if(ship->in_room)
{
if(ship->in_room->vnum == ship2->hanger1)
{
sprintf(buf, "%s", ship2->name);
sprintf(buf2, "%s", ship->in_room->name);
break;
}
if(ship->in_room->vnum == ship2->hanger2)
{
sprintf(buf, "%s", ship2->name);
sprintf(buf2, "%s", ship->in_room->name);
break;
}
if(ship->in_room->vnum == ship2->hanger3)
{
sprintf(buf, "%s", ship2->name);
sprintf(buf2, "%s", ship->in_room->name);
break;
}
if(ship->in_room->vnum == ship2->hanger4)
{
sprintf(buf, "%s", ship2->name);
sprintf(buf2, "%s", ship->in_room->name);
break;
}
}
}
ch_printf(ch,"^g&xACTIVE^x&z: &w%-15.15s&z Location:&w %s &z(&w%s&z)&w\n\r", ship->name,
(ship->in_room && ship->in_room->area->planet) ?
ship->in_room->area->planet->name :
(ship->in_room && !ship->in_room->area->planet) ?
buf :
(!ship->in_room && ship->starsystem) ? ship->starsystem->name :
ship->shipstate == SHIP_HYPERSPACE ? "Unknown" : "Unknown",
(ship->in_room && ship->in_room->area->planet) ?
ship->in_room->name :
(ship->in_room && !ship->in_room->area->planet) ?
buf2 :
ship->shipstate == SHIP_HYPERSPACE ? "In Hyperspace" :
(!ship->in_room) ? buf3 : "Unknown");
count++;
}
}
if(count == 0)
send_to_char(" &zNo active beacons found.\n\r", ch);
}
void do_checkbeacons( CHAR_DATA *ch, char *argument )
{
SHIP_DATA *ship;
char arg[MAX_STRING_LENGTH];
int chance;
if(IS_NPC(ch)) return;
argument = one_argument( argument, arg );
switch( ch->substate )
{
default:
if( arg[0] == '\0')
{
send_to_char("Usage: checkbeacons <ship>\n\r", ch);
return;
}
if((ship = ship_in_room(ch->in_room, arg)) == NULL)
{
send_to_char("That ship isn't here.\n\r", ch);
return;
}
chance = IS_NPC(ch) ? ch->top_level : (int)(0);
if(number_percent() - 20 < chance)
{
send_to_char("&w&GYou take a scanner and begin to check over the ship.\n\r", ch);
act( AT_PLAIN, "$n punches a few instructions into a scanner.", ch, NULL, NULL, TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 6 , do_checkbeacons , 1 );
ch->dest_buf = str_dup(arg);
return;
}
send_to_char("You punch random buttons on the scanner, unsure of what you are doing.\n\r", ch);
return;
case 1:
if ( !ch->dest_buf )
return;
strcpy(arg, ch->dest_buf);
DISPOSE( ch->dest_buf);
ch->dest_buf = NULL;
break;
case SUB_TIMER_DO_ABORT:
DISPOSE( ch->dest_buf );
ch->dest_buf = NULL;
ch->substate = SUB_NONE;
send_to_char("&RYou are interrupted and fail to finish scanning.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
if((ship = ship_in_room(ch->in_room, arg)) == NULL)
{
send_to_char("The ship left before you could complete the scan.\n\r", ch);
return;
}
if(ship->pbeacon[0] == '\0')
send_to_char("&w&GScan Complete. No unknown broadcast signals detected.\n\r", ch);
else
send_to_char("&w&GScan Complete. You've detected a strange signal being broadcast...\n\r", ch);
return;
}
void do_nullifybeacons(CHAR_DATA *ch, char *argument)
{
SHIP_DATA *ship;
char arg[MAX_STRING_LENGTH];
int chance;
if(IS_NPC(ch)) return;
argument = one_argument( argument, arg );
switch( ch->substate )
{
default:
if( arg[0] == '\0')
{
send_to_char("Syntax: nullifybeacons <ship>\n\r", ch);
return;
}
if((ship = ship_in_room(ch->in_room, arg)) == NULL)
{
send_to_char("That ship isn't here.\n\r", ch);
return;
}
chance = IS_NPC(ch) ? ch->top_level : (int)(0);
if(number_percent() < chance + 20)
{
send_to_char("&w&GYou place a small device on the ship, and input a few commands.\n\r", ch);
act( AT_PLAIN, "$n places a device on a ship, and inputs a few commands.", ch, NULL, NULL, TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 1 , do_nullifybeacons , 1 );
ch->dest_buf = str_dup(arg);
return;
}
send_to_char("You look over the ship, trying to find the correct spot to place the nullifier.\n\r", ch);
return;
case 1:
if ( !ch->dest_buf )
return;
strcpy(arg, ch->dest_buf);
DISPOSE( ch->dest_buf);
ch->dest_buf = NULL;
break;
}
ch->substate = SUB_NONE;
chance = IS_NPC(ch) ? ch->top_level : (int)(0);
if((ship = ship_in_room(ch->in_room, arg)) == NULL)
{
send_to_char("The ship left before the nullifier could work.\n\r", ch);
return;
}
STRFREE(ship->pbeacon);
ship->pbeacon = STRALLOC("");
save_ship(ship);
send_to_char("&w>he nullifier emits several beeps, and shuts off.\n\r", ch);
send_to_char("&GChecking your scanner, no foreign signals are actively broadcasting.\n\r", ch);
send_to_char("&wYou remove the nullifier.\n\r", ch);
act(AT_PLAIN, "A device on a ship emits several beeps.\n\r", ch, NULL, NULL, TO_ROOM);
act(AT_PLAIN, "$n removes the device, and checks a scanner.\n\r", ch, NULL, NULL, TO_ROOM);
return;
}
void do_makebinders( CHAR_DATA *ch, char *argument )
{
int level, chance;
bool checktool,checkoven,checkdura;
OBJ_DATA *obj;
OBJ_INDEX_DATA *pObjIndex;
int vnum;
switch( ch->substate )
{
default:
checktool = FALSE;
checkdura = FALSE;
checkoven = 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_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_OVEN)
checkoven = TRUE;
if (obj->item_type == ITEM_DURASTEEL)
checkdura = TRUE;
}
if ( !checktool )
{
send_to_char( "&RYou need a toolkit.\n\r", ch);
return;
}
if ( !checkdura )
{
send_to_char( "&RYou'll need some durasteel to mold.\n\r", ch);
return;
}
if ( !checkoven )
{
send_to_char( "&RYou're going to need an oven to heat the durasteel.\n\r", ch);
return;
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (0);
if ( number_percent( ) < chance )
{
send_to_char( "&GYou begin the process of making a pair of binders.\n\r", ch);
act( AT_PLAIN, "$n takes $s tools and begins to work on something.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 15 , do_makebinders , 1 );
ch->dest_buf = str_dup("blah");
return;
}
send_to_char("&RYou're not quite sure how to do it...\n\r",ch);
return;
case 1:
if ( !ch->dest_buf )
return;
ch->dest_buf = str_dup("blah");
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 = 79;
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;
checkoven = FALSE;
checkdura = FALSE;
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if(obj->item_type == ITEM_OVEN)
checkoven = 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 ) || ( !checkoven) )
{
send_to_char( "&RYou finish making your binders, but the locking mechanism doesn't work.\n\r", ch);
return;
}
obj = create_object( pObjIndex, level );
obj->item_type = ITEM_BINDERS;
SET_BIT( obj->wear_flags, ITEM_HOLD );
SET_BIT( obj->wear_flags, ITEM_TAKE );
obj->level = level;
obj->weight = 1;
STRFREE( obj->name );
obj->name = STRALLOC("binders");
STRFREE( obj->short_descr );
obj->short_descr = STRALLOC( "&Ya pair of binders&w" );
STRFREE( obj->description );
obj->description = STRALLOC( "A pair of binders was discarded here." );
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish constructing a pair of binders.&w\n\r", ch);
act( AT_PLAIN, "$n finishes making a pair of binders.", ch,
NULL, argument , TO_ROOM );
return;
}
void do_setinfrared( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
one_argument( argument, arg );
if(!IS_DROID(ch) || IS_NPC(ch))
{
send_to_char("You turn your 'infrared knob'.. and, well, uh..Hm.\n\r", ch);
return;
}
if ( arg[0] == '\0' )
{
send_to_char( "Setinfrared ON or OFF?\n\r", ch );
return;
}
if ( (strcmp(arg,"on")==0) || (strcmp(arg,"ON") == 0) ) {
SET_BIT(ch->affected_by,AFF_INFRARED);
send_to_char( "You activate your infrared vision unit.\n\r", ch);
return;
}
if ( (strcmp(arg,"off")==0) || (strcmp(arg,"OFF") == 0) ) {
REMOVE_BIT(ch->affected_by, AFF_INFRARED);
send_to_char( "You deactivate your infrared vision unit.\n\r", ch);
return;
}
}
void do_makecamera( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int chance;
bool checktool, checkdura, checkbatt, checkoven, checkcirc;
OBJ_DATA *obj;
OBJ_INDEX_DATA *pObjIndex;
int vnum;
int level;
strcpy( arg , argument );
switch( ch->substate )
{
default:
if ( arg[0] == '\0' )
{
send_to_char( "&RUsage: Makecamera <name>\n\r&w", ch);
return;
}
checktool = FALSE;
checkdura = FALSE;
checkbatt = FALSE;
checkoven = 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;
}
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_OVEN)
checkoven = TRUE;
}
if ( !checktool )
{
send_to_char( "&RYou need toolkit to make a vibro-blade.\n\r", ch);
return;
}
if ( !checkdura )
{
send_to_char( "&RYou need something to make it out of.\n\r", ch);
return;
}
if ( !checkbatt )
{
send_to_char( "&RYou need a power source for your blade.\n\r", ch);
return;
}
if ( !checkoven )
{
send_to_char( "&RYou need a small furnace to heat the metal.\n\r", ch);
return;
}
if ( !checkcirc )
{
send_to_char( "&RYou need a small piece of circuitry.&w\n\r", ch );
return;
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->skill_level[CRAFT_DEVICE] + number_range(1,20) + stat_table[get_curr_int(ch)].mod);
if ( chance >= 17 )
{
send_to_char( "&GYou begin the long process of crafting a vibroblade.\n\r", ch);
act( AT_PLAIN, "$n takes $s tools and a small oven and begins to work on something.", ch,
NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 25 , do_makecamera , 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 interupted and fail to finish your work.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
level = ch->top_level;
vnum = OBJ_VNUM_CAMERA;
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;
checkoven = 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_OVEN)
checkoven = TRUE;
if (obj->item_type == ITEM_DURASTEEL && checkdura == FALSE)
{
checkdura = TRUE;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
}
if (obj->item_type == ITEM_CIRCUIT && checkcirc == FALSE )
{
checkcirc = TRUE;
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
}
if (obj->item_type == ITEM_BATTERY && checkbatt == FALSE )
{
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkbatt = TRUE;
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->skill_level[CRAFT_DEVICE] + number_range(1,20) + stat_table[get_curr_int(ch)].mod) ;
if ( number_percent( ) > chance*2 || ( !checktool ) || ( !checkdura ) || ( !checkbatt ) || ( !checkoven ) || ( !checkcirc ) )
{
send_to_char( "&RYou activate your newly created camera.\n\r", ch);
send_to_char( "&RIt hums softly for a few seconds then begins to shake violently.\n\r", ch);
send_to_char( "&RIt finally shatters breaking apart into a dozen pieces.\n\r", ch);
return;
}
obj = create_object( pObjIndex, level );
obj->item_type = ITEM_CAMERA;
SET_BIT( obj->wear_flags, ITEM_TAKE );
obj->level = level;
obj->weight = 2;
STRFREE( obj->name );
strcpy( buf, arg );
strcat( buf, " camera " );
strcat( buf, remand(buf));
obj->name = STRALLOC( buf );
strcpy( buf, arg );
STRFREE( obj->short_descr );
obj->short_descr = STRALLOC( buf );
STRFREE( obj->description );
strcat( buf, " was left here." );
obj->description = STRALLOC( buf );
obj->cost = (obj->level*20);
obj = obj_to_char( obj, ch );
send_to_char( "&GYou finish your work and hold up your newly created camera.&w\n\r", ch);
act( AT_PLAIN, "$n finishes creating a camera.", ch, NULL, argument , TO_ROOM );
return;
}