/***************************************************************************
Star Wars Life 3.0a
Force Skills (NOT SPELLS) module
FOr credits see 'help credits' in game
(c) 2001, 2002 FRPG Ltd.
All Rights Reserved
***************************************************************************/
#include <math.h>
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mud.h"
extern int top_affect;
void do_makelightsaber( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
int chance;
bool checktool, checkdura, checkbatt,
checkoven, checkcond, checkcirc, checklens, checkgems, checkmirr;
OBJ_DATA *obj;
OBJ_INDEX_DATA *pObjIndex;
int vnum, level, gems, charge, gemtype;
AFFECT_DATA *paf;
AFFECT_DATA *paf2;
if(!IS_NPC(ch))
{
if(IS_SET(ch->pcdata->flags, PCFLAG_BOUND))
{
send_to_char( "How do you intend to do that when bound?\n\r", ch);
return;
}
}
strcpy( arg, argument );
switch( ch->substate )
{
default:
if ( arg[0] == '\0' )
{
send_to_char( "&RUsage: Makelightsaber <name>\n\r&w", ch);
return;
}
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
: (int) (ch->pcdata->learned[gsn_lightsaber_crafting]);
if ( number_percent( ) < chance )
{
send_to_char( "&GYou begin the long process of crafting a lightsaber.\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_makelightsaber , 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) (ch->pcdata->learned[gsn_lightsaber_crafting]);
vnum = 10421;
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;
gems = 0;
charge = 0;
gemtype =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 || 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)
{
gems++;
if ( gemtype < obj->value[0] )
gemtype = obj->value[0];
separate_obj( obj );
obj_from_char( obj );
extract_obj( obj );
checkgems = TRUE;
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->pcdata->learned[gsn_lightsaber_crafting]) ;
if ( number_percent( ) > chance*2 || ( !checktool ) || ( !checkdura ) || ( !checkbatt ) || ( !checkoven )
|| ( !checkmirr ) || ( !checklens ) || ( !checkgems ) || ( !checkcond ) || ( !checkcirc) )
{
send_to_char( "&RYou hold up your new lightsaber and press the switch hoping for the best.\n\r", ch);
send_to_char( "&RInstead of a blade of light, smoke starts pouring from the handle.\n\r", ch);
send_to_char( "&RYou drop the hot handle and watch as it melts on away on the floor.\n\r", ch);
learn_from_failure( ch, gsn_lightsaber_crafting );
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 );
strcpy( buf , arg );
strcat( buf , " lightsaber saber");
obj->name = STRALLOC( stripclr( 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 );
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 = URANGE( 0, gems, 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( "parry" );
paf2->modifier = ( level/3 );
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+gemtype*6)+5; /* min dmg */
obj->value[2] = (int) (level/5+gemtype*11)+50; /* max dmg */
obj->value[3] = WEAPON_LIGHTSABER;
obj->value[4] = charge;
obj->value[5] = charge;
obj->cost = obj->value[2]*75;
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 );
{
long xpgain;
xpgain = UMIN( obj->cost*50 ,( exp_level(ch->skill_level[FORCE_ABILITY]+1) - exp_level(ch->skill_level[FORCE_ABILITY]) ) );
gain_exp(ch, xpgain, FORCE_ABILITY);
ch_printf( ch , "You gain %d force experience.", xpgain );
}
learn_from_success( ch, gsn_lightsaber_crafting );
}