/* Cyborg Class by Zaphonite */
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#include "player.h"
void do_implant( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_CYBORG))
{
send_to_char("Huh?\n\r",ch);
return;
}
if ( arg1[0] == '\0' && arg2[0] == '\0')
{
sprintf(buf,"Current implant levels: #1Face: #9%d, #1Limbs: #9%d, #1Body: #9%d.\n\r",
ch->pcdata->powers[CYBORG_FACE],
ch->pcdata->powers[CYBORG_LIMBS],
ch->pcdata->powers[CYBORG_BODY]);
send_to_char(buf,ch);
return;
}
if (arg2[0] == '\0')
{
if (!str_cmp(arg1,"face"))
{
send_to_char("Current Facial Implants:\n\r",ch);
if (ch->pcdata->powers[CYBORG_FACE] < 1)
send_to_char("None.\n\r",ch);
if (ch->pcdata->powers[CYBORG_FACE] > 0)
{
if (ch->pcdata->powers[CYBORG_FACE] > 3)
{
send_to_char("Your infravision is level 3, you can see everything.\n\r",ch);
send_to_char("Your head implants radiates a shield protecting you.\n\r",ch);
send_to_char("Your sensors are improved, allowing you to see the stats\n\rand location of others.\n\r",ch);
return;
}
else if ((ch->pcdata->powers[CYBORG_FACE] = 2))
send_to_char("Your infravision allows you to see in the night and shadows.n\r",ch);
else if ((ch->pcdata->powers[CYBORG_FACE] = 1))
send_to_char("Your infravision allows you to see in the night.\n\r",ch);
}
return;
}
else if (!str_cmp(arg1,"limbs"))
{
send_to_char("Current Limb Implants:\n\r",ch);
if (ch->pcdata->powers[CYBORG_LIMBS] < 1)
send_to_char("None.\n\r",ch);
if (ch->pcdata->powers[CYBORG_LIMBS] > 0)
send_to_char("You have extra muscle implants giving you super strength.\n\r",ch);
if (ch->pcdata->powers[CYBORG_LIMBS] > 1)
send_to_char("Your limbs have been adjusted to move 5 x faster.\n\r",ch);
if (ch->pcdata->powers[CYBORG_LIMBS] > 2)
send_to_char("You have extra strength implants in, you can lift anything.\n\r",ch);
if (ch->pcdata->powers[CYBORG_LIMBS] > 3)
send_to_char("Your arms have been implanted with the power to have higher weaponskills.\n\r",ch);
if (ch->pcdata->powers[CYBORG_LIMBS] > 4)
send_to_char("You have lasers implanted into your arms.\n\r",ch);
return;
}
else if (!str_cmp(arg1,"body"))
{
send_to_char("Current Body Implants:\n\r",ch);
if (ch->pcdata->powers[CYBORG_BODY] < 1)
send_to_char("None.\n\r",ch);
if (ch->pcdata->powers[CYBORG_BODY] > 0)
send_to_char("Your body's armor has been increased greatly.\n\r",ch);
if (ch->pcdata->powers[CYBORG_BODY] > 1)
send_to_char("Your body can absorb certain attacks.\n\r",ch);
if (ch->pcdata->powers[CYBORG_BODY] > 2)
send_to_char("You body slam your enemy when you have first attack.\n\r",ch);
if (ch->pcdata->powers[CYBORG_BODY] > 3)
send_to_char("You have the power to cloak yourself and become invisible.\n\r",ch);
if (ch->pcdata->powers[CYBORG_BODY] > 4)
send_to_char("You have poisoned stingers that shoot at your enemies from your body.\n\r",ch);
if (ch->pcdata->powers[CYBORG_BODY] > 5)
send_to_char("You regenerate very fast.\n\r",ch);
return;
}
sprintf(buf,"Current implant levels: #1Face: #9%d, #1Limbs: #9%d, #1Body: #9%d.\n\r",
ch->pcdata->powers[CYBORG_FACE],
ch->pcdata->powers[CYBORG_LIMBS],
ch->pcdata->powers[CYBORG_BODY]);
send_to_char(buf,ch);
return;
}
if (!str_cmp(arg2,"improve"))
{
int implant;
int cost;
int max;
if (!str_cmp(arg1,"face" )) {implant = CYBORG_FACE; max = 5;}
else if (!str_cmp(arg1,"limbs")) {implant = CYBORG_LIMBS; max = 5;}
else if (!str_cmp(arg1,"body")) {implant = CYBORG_BODY; max = 6;}
else
{
send_to_char("Implants are face, limbs, and body.\n\r",ch);
return;
}
if ((ch->pcdata->powers[implant] == 1)) cost = 3000;
else if ((ch->pcdata->powers[implant] == 2)) cost = 6000;
else if ((ch->pcdata->powers[implant] == 3)) cost = 9000;
else if ((ch->pcdata->powers[implant] == 4)) cost = 12000;
else if ((ch->pcdata->powers[implant] == 5)) cost = 16000;
else if ((ch->pcdata->powers[implant] == 6)) cost = 20000;
else cost = 1000;
arg1[0] = UPPER(arg1[0]);
if (ch->pcdata->powers[implant] >= max )
{
sprintf(buf,"You already have all implants on your %s.\n\r",arg1);
send_to_char(buf,ch);
return;
}
if (!str_cmp(arg1,"face"))
{
if ((ch->pcdata->powers[CYBORG_FACE] == 4 && ch->pcdata->powers[CYBORG_BODY] < 4))
{
send_to_char("You need the body implant for cloaking before you can improve this.\n\r",ch);
return;
}
}
if (!str_cmp(arg1,"body"))
{
if (ch->pcdata->powers[CYBORG_LIMBS] < 1)
{
send_to_char("You need at least 1 limb implant before you can get any body implants.\n\r",ch);
return;
}
}
if ( cost > ch->pcdata->stats[CYBORG_POWER] )
{
sprintf(buf,"Your cyborg power must be greater than %d before you can improve your %s implants.\n\r",cost,arg1);
send_to_char(buf,ch);
return;
}
ch->pcdata->powers[implant] += 1;
ch->pcdata->stats[CYBORG_POWER] -= cost;
sprintf(buf,"You add an implant to your %s.\n\r",arg1);
ADD_COLOUR(ch, buf, L_RED);
send_to_char(buf,ch);
return;
}
else send_to_char("Syntax: implant (place) improve.\n\r",ch);
return;
}
void do_assimilate( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
argument = one_argument( argument, arg );
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_CYBORG))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (ch->pcdata->stats[UNI_GEN] > 2)
{
send_to_char("Only collective leaders may assimilate others.\n\r",ch);
return;
}
if (ch->pcdata->powers[CYBORG_FACE] != 5 || ch->pcdata->powers[CYBORG_LIMBS] != 5 ||
ch->pcdata->powers[CYBORG_BODY] != 6)
{
send_to_char("You need all implants before you may assimilate others.\n\r",ch);
return;
}
if (arg[0] == '\0' )
{
send_to_char("Assimilate who?\n\r",ch);
return;
}
if ( (victim = get_char_room( ch, arg ) ) == NULL)
{
send_to_char("They are not here.\n\r",ch);
return;
}
if ( IS_NPC(victim))
{
send_to_char("Not on NPC's.\n\r",ch);
return;
}
if (IS_IMMORTAL(victim))
{
send_to_char("You cannot assimilate gods.\n\r",ch);
return;
}
if (ch == victim )
{
send_to_char("You cannot assimilate yourself.\n\r",ch);
return;
}
if (victim->level != LEVEL_AVATAR && !IS_IMMORTAL(victim))
{
send_to_char("You can only assimilate avatars.\n\r",ch);
return;
}
if (ch->pcdata->stats[CYBORG_POWER] < 25000)
{
send_to_char("Your power level must be above 25000 before you can assimilate.\n\r",ch);
return;
}
if (victim->class != 0)
{
send_to_char("They are already classed.\n\r",ch);
return;
}
ch->pcdata->stats[CYBORG_POWER] -= 25000;
act("Tubes fly out of your back and impale $N.",ch,NULL,victim,TO_CHAR);
act("You begin assimilating $N.",ch,NULL,victim,TO_CHAR);
act("You are drained of power as you complete the assimilation process.",ch,NULL,victim,TO_CHAR);
act("Tubes fly from $n's back and impale you.",ch,NULL,victim,TO_VICT);
act("$n begins assimilating you.",ch,NULL,victim,TO_VICT);
act("$n staggers backwards from loss of power after assimilating you.",ch,NULL,victim,TO_VICT);
act("Tubes fly from $n's back and impale $N.",ch,NULL,victim,TO_NOTVICT);
act("$n begins assimilating $N.",ch,NULL,victim,TO_NOTVICT);
act("$n staggers backwards from power drainage as $s assimilates $N.",ch,NULL,victim,TO_NOTVICT);
victim->class = CLASS_CYBORG;
sprintf(buf,"%n has been assimilated.",victim);
do_info(ch,buf);
send_to_char("You are now a cyborg.\n\r",victim);
free_string(victim->lord);
victim->lord = str_dup(ch->name);
free_string(victim->clan);
victim->clan=str_dup(ch->clan);
victim->pcdata->stats[UNI_GEN] = ch->pcdata->stats[UNI_GEN] + 1;
save_char_obj(ch);
save_char_obj(victim);
return;
}
void do_collective( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *gch;
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_CYBORG) )
{
send_to_char("Huh?\n\r",ch);
return;
}
if (strlen(ch->clan) < 2)
{
send_to_char("You aren't a member of any collective.\n\r",ch);
return;
}
sprintf( buf, "Members of the %s collective:\n\r", ch->clan );
send_to_char( buf, ch );
send_to_char("[ Name ] [ Gen ] [ Hits % ] [ Mana % ] [ Move % ]\n\r", ch );
for ( gch = char_list; gch != NULL; gch = gch->next )
{
if ( IS_NPC(gch) ) continue;
if ( !IS_CLASS(gch, CLASS_CYBORG) ) continue;
if ( IS_CLASS(gch,CLASS_CYBORG) )
{
send_to_char("[Name] [Hp/Maxhp] [Mana/Max] [Move/Max] [Power] [Face] [Limbs] [Body]\n\r",ch);
sprintf( buf,
"[%-16s] [%-6d%3d] [%-6d%3d] [%-6d%3d] [%-7d] [%d] [%d] [%d]\n\r",
capitalize( gch->name ),
gch->hit, gch->max_hit ,
gch->mana, gch->max_mana,
gch->move, gch->max_move,
gch->pcdata->stats[CYBORG_POWER],
gch->pcdata->powers[CYBORG_FACE],
gch->pcdata->powers[CYBORG_LIMBS],
gch->pcdata->powers[CYBORG_BODY] );
send_to_char( buf, ch );
}
}
return;
}
void do_stuntubes( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
int dam = number_range(250,750) + char_damroll(ch);
if (dam < 500) dam = 750;
if ( IS_NPC(ch) ) return;
if ( !IS_CLASS(ch, CLASS_CYBORG) )
{
send_to_char("Huh?\n\r", ch);
return;
}
if (ch->pcdata->powers[CYBORG_BODY] < 5 || ch->pcdata->powers[CYBORG_LIMBS] < 5 )
{
send_to_char("You need level 5 implants on your limbs and body to use this.\n\r",ch);
return;
}
if ( ( victim = ch->fighting ) == NULL )
{
send_to_char( "You aren't fighting anyone.\n\r", ch );
return;
}
WAIT_STATE( ch, 1 * PULSE_VIOLENCE );
WAIT_STATE( victim, 3 * PULSE_VIOLENCE );
act("You fire a laser at $N.",ch,NULL,victim,TO_CHAR);
act("$n fires a laser at you .",ch,NULL,victim,TO_VICT);
act("$n fires a laser at $N.",ch,NULL,victim,TO_NOTVICT);
damage(ch,victim,dam,gsn_laser);
if (victim == NULL || victim->position == POS_DEAD) return;
act("You launch your stun tubes at $N.",ch,NULL,victim,TO_CHAR);
act("$n launches $s stun tubes at you.",ch,NULL,victim,TO_VICT);
act("$n launches $s stun tubes at $N .",ch,NULL,victim,TO_NOTVICT);
damage(ch,victim,dam,gsn_stuntubes);
if (victim == NULL || victim->position == POS_DEAD) return;
act("You fire multiple lasers at $N.",ch,NULL,victim,TO_CHAR);
act("$n fires multiple lasers at you.",ch,NULL,victim,TO_VICT);
act("$n fires multiple lasers at $N.",ch,NULL,victim,TO_NOTVICT);
damage(ch,victim,dam*1.5,gsn_laser);
if (victim == NULL || victim->position == POS_DEAD) return;
act("You launch another volley of stun tubes at $N.",ch,NULL,victim,TO_CHAR);
act("$n launches another volley of stun tubes at you.",ch,NULL,victim,TO_VICT);
act("$n launches another volly of stun tubes at $N.",ch,NULL,victim,TO_NOTVICT);
damage(ch,victim,dam*3,gsn_stuntubes);
if (victim == NULL || victim->position == POS_DEAD) return;
act("You charge up your lasers and fire at $N.",ch,NULL,victim,TO_CHAR);
act("$n charges up $s lasers and fires at you.",ch,NULL,victim,TO_VICT);
act("$n charges up $s lasers and fires at $N.",ch,NULL,victim,TO_NOTVICT);
damage(ch,victim,dam*3.5,gsn_laser);
if (victim == NULL || victim->position == POS_DEAD) return;
act("You sting $N with your stun tubes, injecting poison.",ch,NULL,victim,TO_CHAR);
act("$n stings you with $s stun tubes, injecting you with poison.",ch,NULL,victim,TO_VICT);
act("$n stings $N with $s stun tubes, injecting $S with poison.",ch,NULL,victim,TO_NOTVICT);
damage(ch,victim,dam*2,gsn_stuntubes);
if (!IS_AFFECTED(victim, AFF_POISON)) SET_BIT(victim->affected_by, AFF_POISON);
if (!IS_AFFECTED(victim, AFF_FLAMING)) SET_BIT(victim->affected_by, AFF_FLAMING);
if (victim == NULL || victim->position == POS_DEAD) return;
return;
}
void do_cybercloak( CHAR_DATA *ch, char *argument )
{
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_CYBORG) )
{
send_to_char("Huh?\n\r",ch);
return;
}
if (ch->pcdata->powers[CYBORG_BODY] < 4)
{
send_to_char("Your body must have at least 4 implants to cloak.\n\r",ch);
return;
}
if (ch->move < 1000 || ch->mana < 1000)
{
send_to_char("You need 1000 mana and 1000 move to cloak.\n\r",ch);
return;
}
if ( IS_SET(ch->itemaffect, ITEMA_VANISH))
{
REMOVE_BIT(ch->itemaffect, ITEMA_VANISH);
act( "$n turns off his cloaking device.",ch,NULL,NULL,TO_ROOM);
send_to_char("You turn off your cloaking device.\n\r",ch);
return;
}
else
{
act( "$n turns on his cloaking device and disappears.",ch,NULL,NULL,TO_ROOM);
send_to_char("You turn on your cloaking device.\n\r",ch);
SET_BIT(ch->itemaffect, ITEMA_VANISH);
return;
}
return;
}
void do_infravision( CHAR_DATA *ch, char *argument )
{
if (IS_NPC(ch)) return;
if (!IS_CLASS(ch, CLASS_CYBORG))
{
send_to_char("Huh?\n\r",ch);
return;
}
if (ch->pcdata->powers[CYBORG_FACE] < 1)
{
send_to_char("You need at least 1 implant on your face to use infravision.\n\r",ch);
return;
}
if (ch->pcdata->powers[CYBORG_FACE] > 2)
{
if (IS_SET(ch->act, PLR_HOLYLIGHT))
{
REMOVE_BIT(ch->act, PLR_HOLYLIGHT);
send_to_char("You turn off your infravision.\n\r",ch);
}
else
{
SET_BIT(ch->act, PLR_HOLYLIGHT);
send_to_char("You turn on your infravision.\n\r",ch);
}
}
else if ((ch->pcdata->powers[CYBORG_FACE] = 2))
{
if (IS_SET(ch->affected_by, AFF_SHADOWSIGHT) && IS_SET(ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT))
{
REMOVE_BIT(ch->affected_by, AFF_SHADOWSIGHT);
REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
send_to_char("You turn off your infravision.\n\r",ch);
}
else
{
SET_BIT(ch->affected_by, AFF_SHADOWSIGHT);
SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
send_to_char("You turn on your infravision.\n\r",ch);
}
}
else if ((ch->pcdata->powers[CYBORG_FACE] = 1))
{
if (IS_SET(ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT))
{
REMOVE_BIT(ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
send_to_char("You turn off your infravision.\n\r",ch);
}
else
{
SET_BIT(ch->pcdata->stats[UNI_AFF], VAM_NIGHTSIGHT);
send_to_char("You turn on your infravision.\n\r",ch);
}
}
return;
}
void do_linkregenerate( CHAR_DATA *ch, char *argument )
{
if ( !IS_CLASS(ch, CLASS_CYBORG))
{
send_to_char("Huh?.\n\r",ch);
return;
}
send_to_char("Not right now\n\r",ch);
return;
if ( ch->in_room != NULL && ch->in_room->vnum == 0 )
{
send_to_char("You must be in the regeneration chamber to link up.\n\r",ch);
return;
}
switch ( ch->position )
{
case POS_SLEEPING:
send_to_char( "You are already sleeping.\n\r", ch );
break;
case POS_RESTING:
send_to_char( "You are already resting.\n\r", ch );
break;
case POS_MEDITATING:
send_to_char( "You are already meditating.\n\r", ch );
break;
case POS_SITTING:
send_to_char( "You stand up and plug yourself into one of the regeneration pods.\n\r", ch );
act( "$n stands up and links into a regeneration pod.", ch, NULL, NULL, TO_ROOM );
break;
case POS_STANDING:
send_to_char( "You link yourself into a regeneration pod.\n\r", ch );
act( "$n links into a regeneration pod.", ch, NULL, NULL, TO_ROOM );
break;
/*
case POS_LINKREGEN:
send_to_char("You are already linked into a regeneration pod.\n\r",ch);
break;
*/
case POS_FIGHTING:
send_to_char( "You are already fighting!\n\r", ch );
break;
}
return;
}