/*~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- ~ Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, ~ ~ Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. ~ ~ ~ ~ Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael ~ ~ Chastain, Michael Quan, and Mitchell Tse. ~ ~ ~ ~ Ack 2.2 improvements copyright (C) 1994 by Stephen Dooley ~ ~ ACK!MUD is modified Merc2.0/2.1/2.2 code (c)Stephen Zepp 1998 Ver: 4.3 ~ ~ ~ ~ In order to use any part of this Merc Diku Mud, you must comply with ~ ~ both the original Diku license in 'license.doc' as well the Merc ~ ~ license in 'license.txt', and the Ack!Mud license in 'ack_license.txt'.~ ~ In particular, you may not remove any of these copyright notices. ~ ~ ~ ~ _______ _____ ~ ~ / __ /\ / ___ \ 222222 PA_MUD by Amnon Kruvi ~ ~ /______/ / / /___\ \ 2 PA_MUD is modified ~ ~ / _______/ / _______ \ 2 Ack!Mud, v4.3 ~ ~ /_/ /_/ \_\ 2 ~ ~ 2 ~ ~ 2222222 ~ ~ ~ ~ ~ ~ Years of work have been invested to create DIKU, Merc, Ack and PA. ~ ~ Please show your respect by following the licenses, and issuing ~ ~ credits where due. ~ ~ ~ ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-*/ #include <sys/types.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "ack.h" #include "config.h" void check_skill( CHAR_DATA *ch, int gsn, int chance, char *name ); const struct skill_type skill_table[MAX_SKILL+1] = { { "Armor Repair", gsn_repair, FALSE, "Fixing Damaged Armor." }, { "Sneak", gsn_sneak, FALSE, "Invisibility on the map/from turrets." }, { "Target", gsn_target, FALSE, "Locking on to an enemy before firing." }, { "Computers", gsn_computer, FALSE, "Hacking enemy bases." }, { "Explosive Research", gsn_exresearch, FALSE, "Upgrading bombs." }, { "Dodge", gsn_dodge, FALSE, "Dodging Player vs. Player attacks." }, { "Economics", gsn_economics, TRUE, "Mastering the tricks of the trade." }, { "Building", gsn_building, TRUE, "Building structures." }, { "Combat", gsn_combat, TRUE, "Armor usage, armor piercing, head shots." }, { "Bombs", gsn_arm, FALSE, "Quick handling of explosives." }, { "Blind Combat", gsn_blind_combat, FALSE, "Seeing while blind." }, { "Grenades", gsn_grenades, FALSE, "Accurate Grenade throwing." }, { "Conquer", gsn_conquer, FALSE, "Taking control over enemy buildings." }, { "Concentration", gsn_concentration, FALSE, "Reduces chances of being distracted." }, { "None", -1, FALSE, "" }, }; const struct ability_type ability_table[] = { // Name Eco Bld Cmb Desc { "Fix", 0, 3, 0, "Repair a building's HP" }, { "Nuclear Containment", 0, 5, 2, "Reduced nuclear fallout time in your own buildings" }, { "Peacecraft", 5, 5, 0, "10% Reduction to damage done to you and by you" }, { "Fast Healing", 0, 0, 4, "Recover from bad effects faster" }, { "Overclock", 3, 0, 0, "Your laptop batteries last longer" }, { "Salvage", 2, 0, 3, "Gain a 10% cash refund when you lose a building" }, { "Money Safe", 4, 0, 0, "Regain 50% of your money if the bank its in is destroyed" }, { "Databank", 2, 3, 0, "Reduces cost of upgrading" }, { "Weapon Specialty", 0, 0, 6, "Does more damage with guns." }, { "Master Engineer", 0, 6, 0, "All your buildings start 2 levels higher." }, { "Economy Master", 6, 0, 0, "Salvage 30% from your lost buildings."}, { "Engineer", 1, 5, 0, "Buildings are 20% cheaper."}, { NULL, -1, -1, -1, NULL }, }; char * const wear_name[MAX_WEAR] = { "Head", "Eyes", "Face", "Shoulders", "Arms", "Left Hand", "Right Hand", "Waist", "Body", "Legs", "Feet", }; void check_skill( CHAR_DATA *ch, int gsn, int chance, char *name ) { char buf[MSL]; return; if ( gsn >= MAX_SKILL ) return; if ( number_percent() < chance && ch->pcdata->skill[gsn] < 100 && ch->pcdata->lastskill <= 0 ) { sprintf( buf, "You have become better at %s!\n\r", name ); send_to_char(buf,ch); ch->pcdata->skill[gsn]++; ch->pcdata->lastskill = 75; } return; } void do_repair( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; BUILDING_DATA *bld; char buf[MSL]; if ( argument[0] == '\0' ) { sprintf( buf, "Your armor repair skill is at %d%%.\n\r", ch->pcdata->skill[gsn_repair]); send_to_char( buf, ch ); return; } if ( ( bld = get_char_building(ch) ) == NULL ) { send_to_char( "You must be in an armory.\n\r", ch ); return; } if ( !bld->owner || bld->owner != ch || !complete(bld) || bld->type != BUILDING_ARMORER ) { send_to_char( "You must be in one of your completed armories.\n\r", ch ); return; } if ( ( obj = get_obj_carry(ch,argument) ) == NULL ) { send_to_char( "You must specify a piece of armor to repair.\n\r", ch ); return; } if ( obj->item_type != ITEM_ARMOR ) { send_to_char( "It is not armor.\n\r", ch ); return; } if ( obj->value[1] == 0 ) { send_to_char( "There is no need to repair it.\n\r", ch ); return; } if ( ( get_eq_char(ch,WEAR_HOLD_HAND_L) ) != NULL ) unequip_char(ch,get_eq_char(ch,WEAR_HOLD_HAND_L)); equip_char(ch,obj,WEAR_HOLD_HAND_L); act( "You begin repairing $p. Type ""@@eStop@@N"" at any time to stop.", ch, obj, NULL, TO_CHAR ); act( "$n begins repairing $p.", ch, obj, NULL, TO_ROOM ); ch->c_time = 30; ch->c_sn = gsn_repair; ch->c_level = ch->pcdata->skill[gsn_repair]; return; } void act_repair( CHAR_DATA *ch, int level ) { char buf[MSL]; OBJ_DATA *obj; int r; if ( ( obj = get_eq_char(ch,WEAR_HOLD_HAND_L) ) == NULL || obj->item_type != ITEM_ARMOR ) { send_to_char( "For some reason, you are no longer holding the armor you were repairing!\n\r", ch ); ch->c_sn = -1; return; } if ( ch->in_building == NULL || ch->in_building->type != BUILDING_ARMORER ) { send_to_char( "For some reason, you are no longer in an armory.\n\r", ch ); ch->c_sn = -1; return; } if ( obj->value[1] <= 0 ) { obj->value[1] = 0; send_to_char( "You finish repairing.\n\r", ch ); act( "$n finishes repairing.\n\r", ch, NULL, NULL, TO_ROOM ); ch->c_sn = -1; obj->value[1] = 0; return; } check_skill(ch,gsn_repair,5,"Armor Repair"); r = number_range(0,level)+1; if ( number_percent() < (100-level)/5 ) { sprintf(buf,"You mess up @@e(@@R%d@@e)@@N!\n\r", r ); send_to_char(buf,ch); act( "$n glitches a little.", ch, NULL, NULL, TO_ROOM ); if ( number_percent() < 2 ) { extract_obj(obj); ch->c_sn = -1; send_to_char( "You accidently ruin what you were working on.\n\r", ch ); return; } else obj->value[1]+=r; } else { act( "$n continues repairing.", ch, NULL, NULL, TO_ROOM ); sprintf(buf,"You continue repairing %s @@a(@@c%d@@a)@@N.\n\r", obj->short_descr, r ); send_to_char(buf,ch); obj->value[1]-=r; } ch->c_time = 30; return; } void do_sneak( CHAR_DATA *ch, char *argument ) { int dir; if ( argument[0] == '\0' ) { char buf[MSL]; sprintf( buf, "Your sneak skill is at %d%%.\n\r", ch->pcdata->skill[gsn_sneak] ); send_to_char( buf, ch ); if ( ch->position == POS_SNEAKING ) { ch->position = POS_STANDING; send_to_char( "You stop sneaking.\n\r", ch ); } return; } if ( ch->in_vehicle ) { send_to_char( "Not while in a vehicle.\n\r", ch ); return; } else if ( !str_prefix(argument,"north") ) dir = DIR_NORTH; else if ( !str_prefix(argument,"east" ) ) dir = DIR_EAST; else if ( !str_prefix(argument,"west") ) dir = DIR_WEST; else if ( !str_prefix(argument,"south") ) dir = DIR_SOUTH; else { send_to_char( "Invalid direction.\n\r", ch ); return; } act( "You start sneaking.", ch, NULL, NULL, TO_CHAR ); if ( number_percent() > ch->pcdata->skill[gsn_sneak] ) act( "$n starts sneaking.", ch, NULL, NULL, TO_ROOM ); ch->c_time = 20-(ch->pcdata->skill[gsn_sneak]/6.6); ch->c_sn = gsn_sneak; ch->c_level = dir; return; } void act_sneak( CHAR_DATA *ch, int level ) { move_char(ch,level); ch->position = POS_SNEAKING; return; } void do_target( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim=NULL; OBJ_DATA *weapon; int range; int time; BUILDING_DATA *bld = NULL; bool list = FALSE; if ( IN_PIT(ch) ) mreturn( "Not in the pit.\n\r", ch ); if ( argument[0] == '\0' ) { // send_to_char( "Target whom?\n\r", ch ); // return; list = TRUE; } else { if ( ( victim = get_char_world(ch,argument) ) == NULL ) { send_to_char( "You can't find that target.\n\r", ch ); return; } if ( victim == ch ) { act( "You stop targetting $N.", ch, NULL, ch->victim, TO_CHAR ); ch->victim = ch; return; } } if ( victim != NULL && victim->in_building && !list ) if ( !open_bld(victim->in_building) && (victim->x != ch->x || victim->y != ch->y || victim->z != ch->z) ) mreturn ("You can't target that person through the wall!\n\r", ch ); if ( ch->in_building && !open_bld(ch->in_building) && bld == NULL ) { send_to_char( "You can't target from inside the building.\n\r", ch ); return; } if ( ( ( weapon = get_eq_char( ch, WEAR_HOLD_HAND_L ) ) == NULL || weapon->item_type != ITEM_WEAPON ) && ch->in_vehicle == NULL && bld == NULL ) { if ( ( weapon = get_eq_char( ch, WEAR_HOLD_HAND_R ) ) == NULL ) { send_to_char( "You aren't holding a weapon!\n\r", ch ); return; } } if ( ch->in_vehicle == NULL && bld == NULL ) { if ( weapon->item_type != ITEM_WEAPON ) { send_to_char( "This isn't a gun you're holding!\n\r", ch ); return; } range = 1 + weapon->value[4]; if ( ch->class == CLASS_SNIPER ) range += 1; if ( range < 1 ) range = 1; if ( ch->in_building && ch->in_building->type == BUILDING_SNIPER_TOWER && complete(ch->in_building) ) range += 3; } else if ( bld != NULL ) { range = 6; } else { if ( AIR_VEHICLE(ch->in_vehicle->type) ) { if ( ch->z != Z_AIR ) { send_to_char( "The craft isn't operational until you lift!\n\r", ch ); return; } range = 3; } else range = 1; } if ( list ) { char buf[MSL]; int x,y,xx,yy; sprintf( buf, "You are able to target the following people:\n\r\n\r" ); for ( xx=ch->x-range;xx<=ch->x+range;xx++ ) for ( yy=ch->y-range;yy<=ch->y+range;yy++ ) { x = xx;y=yy;real_coords(&x,&y); for ( victim = map_ch[x][y][ch->z];victim;victim = victim->next_in_room ) { sprintf( buf+strlen(buf), "@@g%s @@c(@@a%d@@c/@@a%d@@c)\n\r", victim->name, x,y); } if (ch->z != Z_AIR && ( ch->in_vehicle || (weapon && !IS_SET(weapon->value[3], WEAPON_HITS_AIR)))) for ( victim = map_ch[x][y][Z_AIR];victim;victim = victim->next_in_room ) sprintf( buf+strlen(buf), "@@g%s @@c(@@a%d@@c/@@a%d@@c) @@aFlying in %s@@N\n\r", victim->name, x,y,(victim->in_vehicle)?victim->in_vehicle->desc:"Nothing"); } send_to_char(buf,ch); return; } if ( ch->z != victim->z ) { if ( (ch->z == Z_GROUND || ch->z == Z_AIR) && (victim->z == Z_GROUND || victim->z == Z_AIR) ) { if ( (weapon && !IS_SET(weapon->value[3], WEAPON_HITS_AIR)) ) { send_to_char( "You can't lock on to air targets using this weapon.\n\r", ch ); return; } } else { send_to_char( "Your target is not in range.\n\r", ch ); return; } } if ( ch->victim && ch->victim == victim ) { send_to_char( "They are already targetted.\n\r", ch ); return; } /* if ( !NOT_IN_ROOM(ch,victim) ) { send_to_char( "He's right here!\n\r", ch ); return; }*/ if ( ch->in_vehicle || bld != NULL ) time = (40 - ((ch->pcdata->skill[gsn_target] / 20) - (victim->pcdata->skill[gsn_target] / 20))) * 2; else time = (40 - ((ch->pcdata->skill[gsn_target] / 20) - (victim->pcdata->skill[gsn_target] / 20))) - weapon->value[6]; if ( time < 5 ) time = 5; if ( victim->z == Z_AIR && ch->z == Z_GROUND ) time = 1; if ( victim->in_room->vnum == ROOM_VNUM_WMAP && (IS_BETWEEN(victim->x,ch->x-range,ch->x+range)) && (IS_BETWEEN(victim->y,ch->y-range,ch->y+range))) { if (( IN_PIT(ch) && !IN_PIT(victim) ) || ( !IN_PIT(ch) && IN_PIT(victim) ) ) return; act( "You begin targetting $N!", ch, NULL, victim, TO_CHAR ); act( "$n begins targetting $N!", ch, NULL, victim, TO_ROOM ); ch->victim = victim; ch->c_sn = gsn_target; ch->c_time = time; ch->c_level = 1; return; } else { send_to_char( "Your target is not in range.\n\r", ch ); return; } return; } void act_target (CHAR_DATA *ch, int level ) { OBJ_DATA *weapon; int range; if ( !ch->victim || ch->victim == NULL ) { send_to_char( "For some reason, your victim isn't online anymore.\n\r", ch ); ch->victim = ch; return; } if ( ch->victim == ch ) { send_to_char( "For some reason, you were targetting yourself!\n\r", ch ); ch->victim = ch; return; } if ( ch->victim->in_building ) if ( !open_bld(ch->victim->in_building) ) { ch->victim = ch; mreturn ("Your target has taken cover inside a building!\n\r", ch ); } if ( ( ( weapon = get_eq_char( ch, WEAR_HOLD_HAND_L ) ) == NULL || weapon->item_type != ITEM_WEAPON ) && ch->in_vehicle == NULL ) { if ( ( ( weapon = get_eq_char( ch, WEAR_HOLD_HAND_R ) ) == NULL || weapon->item_type != ITEM_WEAPON ) && ch->in_vehicle == NULL ) { send_to_char( "For some reason, you aren't holding a weapon anymore!\n\r", ch ); ch->victim = ch; return; } } if ( (ch->pcdata->alliance == -1 || ch->pcdata->alliance != ch->victim->pcdata->alliance ) ) check_skill(ch,gsn_target,15,"Target"); if ( ch->in_vehicle == NULL ) { if ( weapon->item_type != ITEM_WEAPON ) { send_to_char( "This isn't a gun you're holding!\n\r", ch ); return; } range = 1 + weapon->value[4]; if ( ch->class == CLASS_SNIPER ) range += 1; if ( range < 1 ) range = 1; if ( ch->in_building && ch->in_building->type == BUILDING_SNIPER_TOWER ) range += 3; } else { // range = get_ship_weapon_range(ch->in_vehicle); range = 1; } if ( ch->victim->in_room->vnum != ROOM_VNUM_WMAP || (!IS_BETWEEN(ch->victim->x,ch->x-range,ch->x+range)) || (!IS_BETWEEN(ch->victim->y,ch->y-range,ch->y+range)) ) { send_to_char( "Your victim got away!\n\r", ch ); ch->victim = ch; return; } if ( ch->z != ch->victim->z ) { if ( ch->in_vehicle != NULL || (weapon && !IS_SET(weapon->value[3],WEAPON_HITS_AIR) ) ) { send_to_char( "Your victim got away!\n\r", ch ); ch->victim = ch; return; } } act( "You are locked on $N!", ch, NULL, ch->victim, TO_CHAR ); act( "$n is locked on!", ch, NULL, NULL, TO_ROOM ); return; } void do_computer( CHAR_DATA *ch, char *argument ) { BUILDING_DATA *bld; char arg1[MSL]; char arg2[MSL]; argument = one_argument(argument,arg1); argument = one_argument(argument,arg2); if ( !str_cmp(arg1,"defend")) { if ( ( bld = ch->in_building ) == NULL ) { send_to_char( "You can't defend the building while you are not inside.\n\r", ch ); return; } if ( bld->value[8] == 0 ) { send_to_char( "There are no traces of a hacker here.\n\r", ch ); return; } act( "You begin defending against the hacker.", ch, NULL, NULL, TO_CHAR ); act( "$n goes to the computer terminal and begins defending against the hacker.", ch, NULL, NULL, TO_ROOM ); ch->c_sn = gsn_computer; ch->c_level = 1; ch->c_time = 30 - ( ch->pcdata->skill[gsn_computer] / 4 ); return; } else if ( !str_cmp(arg1,"repair")) { if ( ( bld = ch->in_building ) == NULL ) { send_to_char( "You can't repair the building while you are not inside.\n\r", ch ); return; } if ( bld->value[3] == 0 ) { send_to_char( "There are no traces of a virus here.\n\r", ch ); return; } /* if ( bld->value[3] > 0 ) { send_to_char( "The virus has not yet reached your system. You should use the 'Defend' option now.\n\r", ch ); return; }*/ act( "You begin defending against the virus.", ch, NULL, NULL, TO_CHAR ); act( "$n goes to the computer terminal and begins defending against the virus.", ch, NULL, NULL, TO_ROOM ); ch->c_sn = gsn_computer; ch->c_level = 2; ch->c_time = 40 - ( ch->pcdata->skill[gsn_computer] / 4 ); return; } else if ( !str_cmp(arg1,"scan")) { if ( ( bld = ch->in_building ) == NULL ) { send_to_char( "You can't repair the building while you are not inside.\n\r", ch ); return; } if ( bld->type != BUILDING_HQ ) { send_to_char( "You need to be in a headquarters.\n\r", ch ); return; } act( "You begin resetting your system.", ch, NULL, NULL, TO_CHAR ); act( "$n goes to the computer terminal and begins resetting the systems.", ch, NULL, NULL, TO_ROOM ); ch->c_sn = gsn_computer; ch->c_level = 9; ch->c_time = 80 - ( ch->pcdata->skill[gsn_computer] / 4 ); return; } if ( !str_cmp(arg1,"protect")) { OBJ_DATA *obj; OBJ_DATA *comp = NULL; for ( obj = ch->first_carry;obj;obj = obj->next_in_carry_list ) if ( obj->item_type == ITEM_COMPUTER ) if ( comp == NULL || obj->value[0] > comp->value[0] ) comp = obj; if ( comp == NULL ) { send_to_char( "You must be carrying a computer in your inventory!\n\r", ch ); return; } if ( comp->value[0] <= 2 ) { send_to_char( "This computer is no good for setting up dummies.\n\r", ch ); return; } if ( ( bld = ch->in_building ) == NULL || bld->type != BUILDING_HQ || !complete(bld) ) { send_to_char( "You must be in a headquarters.\n\r", ch ); return; } act( "You begin setting some dummy directories on the mainframe.", ch, NULL, NULL, TO_CHAR ); act( "$n begins setting up dummy directories on the mainframe.", ch, NULL, NULL, TO_ROOM ); ch->c_sn = gsn_computer; ch->c_level = 8; ch->c_time = 60 - ( ch->pcdata->skill[gsn_computer] / 4 ); return; } else if ( !str_cmp(arg1,"backdoor")) { CHAR_DATA *wch; OBJ_DATA *obj; OBJ_DATA *comp = NULL; bool found = FALSE; int range; if ( arg2[0] == '\0' ) { send_to_char( "Install a back door at whose computer?\n\r", ch ); return; } for ( obj = ch->first_carry;obj;obj = obj->next_in_carry_list ) if ( obj->item_type == ITEM_COMPUTER ) if ( comp == NULL || obj->value[0] > comp->value[0] ) comp = obj; if ( comp == NULL ) { send_to_char( "You must be carrying a computer in your inventory!\n\r", ch ); return; } if ( ( wch = get_char_world(ch,arg2) ) == NULL ) { send_to_char( "No such player.\n\r", ch ); return; } if ( wch == ch ) { send_to_char( "You don't really need to hack yourself... You already know where you are.\n\r", ch ); return; } range = comp->value[0]; if ( !IS_BETWEEN(wch->x,comp->carried_by->x-range,comp->carried_by->x+range) || !IS_BETWEEN(wch->y,comp->carried_by->y+range,comp->carried_by->y-range) || wch->z != ch->z ) { send_to_char( "Your computer doesn't have that range.\n\r", ch ); return; } for ( obj = wch->first_carry;obj;obj = obj->next_in_carry_list ) { if ( obj->item_type == ITEM_COMPUTER && obj->value[3] == 0 ) { found = TRUE; break; } } if ( !found ) { send_to_char( "Either your target does not carry a computer, or all of their computers are already infected.\n\r", ch ); return; } ch->c_sn = gsn_computer; ch->c_time = 40 - ( ch->pcdata->skill[gsn_computer] / 4 ); ch->c_level = 5; ch->victim = wch; act( "You begin hacking $N's computer!", ch, NULL,wch, TO_CHAR ); act( "$n pulls up his laptop, and begins hacking someone.", ch, NULL, NULL, TO_ROOM ); return; } else if ( !str_cmp(arg1,"connect")) { int x,y,z,range,xx,yy,xxx,yyy,r1,r2,r; OBJ_DATA *obj; OBJ_DATA *comp; OBJ_DATA *bounce = NULL; CHAR_DATA *wch; char arg3[MSL]; char arg4[MSL]; char buf[MSL]; bool ground = FALSE; argument = one_argument(argument,arg3); argument = one_argument(argument, arg4); if(!strcmp(arg4, "G") || !strcmp(arg4, "g")) { ground = TRUE; } if ( !is_number(arg2) || !is_number(arg3) ) { send_to_char( "You must insert valid coordinates.\n\r", ch ); return; } x = atoi(arg2); y = atoi(arg3); if ( x < 0 || x >= MAX_MAPS || y < 0 || y >= MAX_MAPS ) mreturn("Those are invalid coordinates.\n\r", ch ); real_coords(&x,&y); comp = get_best_laptop(ch); if ( !comp ) { send_to_char( "You must be carrying a computer in your inventory!\n\r", ch ); return; } if ( comp->value[1] <= 0 ) { send_to_char( "Its battery is dead.\n\r", ch ); return; } r = 15; if ( comp->value[0] > r ) r = comp->value[0]; if ( ch->z == Z_UNDER ) r -= 3; z = ch->z; r1 = 0-r; r2 = 0-r; for ( xxx=x-r;xxx<x+r;xxx++ ) { if ( bounce ) break; for ( yyy=y-r;yyy<y+r;yyy++ ) { range = (abs(r1)>abs(r2))?abs(r1):abs(r2); xx = xxx;yy = yyy;real_coords(&xx,&yy); for ( wch = map_ch[xx][yy][ch->z];wch;wch = wch->next_in_room ) { if ( wch != ch ) { if ( IS_SET(ch->effect,EFFECT_ENCRYPTION) ) continue; } else if ( comp->value[0] >= range ) { bounce = comp; continue; } for ( obj = wch->first_carry;obj;obj = obj->next_in_carry_list ) { if ( obj->item_type != ITEM_COMPUTER ) continue; if ( obj->value[1] <= 0 ) continue; if ( wch != ch && obj->value[3] == 0 ) continue; if ( obj->value[0] < range ) continue; bounce = obj; break; } } if ( bounce ) break; for ( obj=map_obj[xx][yy];obj;obj = obj->next_in_room ) { if ( obj->z != ch->z ) continue; if ( obj->value[3] == 0 ) continue; if ( obj->value[1] <= 0 ) continue; if ( obj->item_type != ITEM_COMPUTER ) continue; if ( obj->value[0] < range ) continue; bounce = obj; break; } if ( bounce ) break; r2++; } r1++; r2 = 0-r; } if ( !bounce) mreturn("Those coordinates are not in range of your laptop or any transmitters.\n\r", ch ); if ( bounce != comp ) { sprintf(buf,"You bounce your connection over %s.\n\r", bounce->short_descr ); send_to_char(buf,ch); } if ( ground && ch->z == Z_UNDER) z = Z_GROUND; if ( ( bld = get_building(x,y,z) ) == NULL ) { send_to_char( "There is no building over there.\n\r", ch ); return; } if ( is_evil(bld) || !complete(bld) || !str_cmp(bld->owned,"nobody") || bld->tag != TRUE || build_table[bld->type].act == BUILDING_WALLS) { send_to_char( "It has no computer network.\n\r", ch ); return; } if ( ( wch = get_ch(bld->owned) ) == NULL ) { send_to_char( "Its mainframe is shut down.\n\r", ch ); return; } if ( IN_PIT(wch) || paintball(wch) ) { send_to_char( "That's not fair...\n\r", ch ); return; } ch->c_sn = gsn_computer; ch->c_level = 7; ch->c_time = 40; ch->bvictim = bld; act( "$n pulls out a laptop and begins typing...", ch, NULL, NULL, TO_ROOM ); send_to_char( "Connecting...\n\r", ch ); sendsound(ch,"waitcon",40,1,25,"misc","waitcon.wav"); ch->c_obj = comp; if ( bounce != comp ) if ( !bounce->carried_by ) if ( --bounce->value[1] <= 0 ) { sprintf(buf,"%s has run out of battery, and is destroyed.\n\r", bounce->short_descr); send_to_char(buf,ch); extract_obj(bounce); } } else { send_to_char( "Syntax: Computer Defend - Defends against connected hackers.\n\rComputer Repair - Repairs viruses that have entered the system.\n\rComputer Scan - Scans and repairs evil programs.\n\rComputer Protect - Creates dummy directories in a whole base\n\rComputer Connect <x> <y> <bounce?> - Attempts to establish a connection to a given building. Must carry a laptop. You can also set a player's name to Bounce the connection through.\n\rComputer Backdoor - Uploads a trojan to the target player's laptop, if carrying one, which you can track at a Hackers Hideout.", ch ); return; } return; } void act_computer( CHAR_DATA *ch, int level ) { BUILDING_DATA *bld; int chance; if ( ( bld = ch->in_building ) == NULL && ( ch->c_level == 1 || ch->c_level == 2 || ch->c_level == 8 || ch->c_level == 9) ) { send_to_char( "For some reason, you are no longer in a building.\n\r", ch ); ch->c_sn = -1; ch->c_level = 0; return; } /* if ( number_percent() < 5 && ch->pcdata->skill[gsn_computer] < 100) { send_to_char( "You have become better at Computers!\n\r", ch ); ch->pcdata->skill[gsn_computer]++; }*/ if ( level == 1 ) { if ( bld->value[8] == 0 ) { send_to_char( "The hacker has already left your system!!\n\r", ch ); ch->c_sn = -1; ch->c_level = 0; return; } ch->c_time = 30 - ( ch->pcdata->skill[gsn_computer] / 4 ); act( "You work hard on the computer terminal - Trying to defend against the hacker.", ch, NULL, NULL, TO_CHAR ); act( "$n works hard on the computer terminal - Trying to defend against the hacker.", ch, NULL, NULL, TO_ROOM ); } if ( level == 2 ) { if ( bld->value[3] == 0 ) { send_to_char( "The virus has been cleared out of your system!!\n\r", ch ); ch->c_sn = -1; ch->c_level = 0; return; } ch->c_time = 40 - ( ch->pcdata->skill[gsn_computer] / 4 ); act( "You work hard on the computer terminal - Trying to defend against the virus.", ch, NULL, NULL, TO_CHAR ); act( "$n works hard on the computer terminal - Trying to defend against the virus.", ch, NULL, NULL, TO_ROOM ); } if ( level == 3 || level == 4 ) { char buf[MSL]; if ( ch->bvictim == NULL ) { send_to_char( "Your target was shut down.\n\r", ch ); ch->c_sn = -1; ch->bvictim = NULL; ch->c_level = 0; return; } if ( ch->bvictim->value[3] > 0 ) { sprintf( buf, "Estimated time: Less than %d seconds.\n\r", ch->bvictim->value[3] * 10 ); act( "$n continues uploading the virus.", ch, NULL, NULL, TO_ROOM ); send_to_char( buf, ch ); ch->c_time = 40; } else { if ( level == 3 ) send_to_char( "Your virus was successfully implanted!\n\r", ch ); else { send_to_char( "You have upgraded the virus!\n\r", ch ); ch->bvictim->value[3]--; } ch->c_sn = -1; ch->c_level = -1; free_string(ch->bvictim->attacker); ch->bvictim->attacker = str_dup(ch->name); ch->bvictim = NULL; return; } return; } if ( level == 5 ) { OBJ_DATA *obj; bool found = FALSE; if ( ch->victim == ch ) { send_to_char( "Your victim has left!\n\r", ch ); ch->c_sn = -1; return; } for ( obj = ch->victim->first_carry;obj;obj = obj->next_in_carry_list ) { if ( obj->item_type == ITEM_COMPUTER ) { found = TRUE; break; } } if ( !found ) { send_to_char( "For some reason, your target is no longer carrying a computer.\n\r", ch ); return; } obj->value[3] = 1; send_to_char( "You have uploaded the back-door trojan!\n\r", ch ); ch->victim = ch; ch->c_sn = -1; ch->c_level = 0; return; } if ( level == 6 ) { CHAR_DATA *bch; if ( ch->bvictim == NULL ) { send_to_char( "Your target was shut down.\n\r", ch ); ch->c_sn = -1; ch->bvictim = NULL; ch->c_level = 0; return; } chance = 10; if ( ch->class == CLASS_HACKER ) chance *= 2; if ( number_percent() < chance ) { char buf[MSL]; if ( ( bch = get_ch(ch->bvictim->owned) ) == NULL ) { send_to_char( "The mainframe was shut down.\n\r", ch ); return; } if ( bch->pcdata->alliance == -1 ) { send_to_char( "The owner of this structure is not a member of any alliance.\n\r", ch ); return; } if ( bch->pcdata->alliance == ch->pcdata->alliance ) { send_to_char( "You're already a member of that alliance.\n\r", ch ); return; } if ( ch->pcdata->alliance != -1 ) alliance_table[ch->pcdata->alliance].members--; alliance_table[bch->pcdata->alliance].members++; ch->pcdata->alliance = bch->pcdata->alliance; sprintf( buf, "@@gYou have inserted yourself into %s @@gdatabase.@@N\n\r", alliance_table[ch->pcdata->alliance].name ); send_to_char(buf,ch); } return; } else if ( level == 7 ) { OBJ_DATA *obj; bool found = FALSE; for ( obj = ch->victim->first_carry;obj;obj = obj->next_in_carry_list ) { if ( obj->item_type == ITEM_COMPUTER ) { found = TRUE; break; } } if ( !found ) { ch->c_sn = -1; send_to_char( "For some reason, you are no longer carrying a computer.\n\r", ch ); return; } if ( !ch->bvictim || ch->bvictim == NULL ) { ch->c_sn = -1; return; } if ( ch->bvictim->value[8] != 0 ) { send_to_char( "Connection Refused.\n\r", ch ); act( "$n takes his computer and places it back in $s inventory.", ch, NULL, NULL, TO_ROOM ); ch->c_sn = -1; return; } send_to_char( "Connection Established.\n\r", ch ); act( "$n watches $s computer, grinning.", ch, NULL, NULL, TO_ROOM ); free_string(ch->bvictim->attacker); ch->bvictim->attacker = str_dup(ch->name); ch->c_sn = -1; ch->c_level = 0; ch->position=POS_HACKING; ch->bvictim->value[8] = (obj->level/10) + obj->value[4]; return; } else if ( level == 8 ) { OBJ_DATA *obj; OBJ_DATA *comp = NULL; BUILDING_DATA *bld2; char buf[MSL]; for ( obj = ch->first_carry;obj;obj = obj->next_in_carry_list ) if ( obj->item_type == ITEM_COMPUTER ) if ( comp == NULL || obj->value[0] > comp->value[0] ) comp = obj; if ( comp == NULL ) { ch->c_sn = -1; send_to_char( "For some reason, you are no longer carrying a computer.\n\r", ch ); return; } if ( comp->value[0] <= 2 ) { ch->c_sn = -1; send_to_char( "This computer is no good for setting up dummies.\n\r", ch ); return; } for ( bld2 = first_building;bld2;bld2 = bld2->next ) if ( !str_cmp(bld2->owned,bld->owned) ) { bld2->directories = comp->value[0]; bld2->real_dir = number_range(1,bld2->directories); bld2->password = number_range(10000,99999); } sprintf( buf, "You set up %d directories, and only number %d is real!\n\r", comp->value[0], bld->real_dir ); send_to_char( buf, ch ); ch->c_sn = -1; ch->c_level = 0; return; } if ( level == 9 ) { BUILDING_DATA *bld2; if ( bld->type != BUILDING_HQ ) { send_to_char( "For some reason, you are no longer in a HQ!\n\r", ch ); ch->c_sn = -1; return; } for ( bld2 = first_building;bld2;bld2 = bld2->next ) if ( !str_cmp(bld2->owned,bld->owned) ) { if ( IS_SET(bld2->value[1],INST_SPOOF) ) REMOVE_BIT(bld2->value[1],INST_SPOOF); bld2->password = number_range(10000,99999); } send_to_char( "Scan complete.\n\r", ch ); ch->c_sn = -1; return; } if ( bld->value[3] == 0 && level == 2 ) { send_to_char( "The virus has been cleared.\n\r", ch ); ch->c_sn = -1; ch->c_level = 0; return; } chance = 25; if ( ch->class == CLASS_HACKER ) chance *= 2; if ( number_percent() < chance ) { if ( level == 2 ) { send_to_char( "You have defeated the virus!\n\r", ch ); bld->value[3] = 0; bld->value[4] = 24; ch->c_sn = -1; ch->c_level = 0; free_string(bld->attacker); bld->attacker = str_dup("None"); return; } if ( level == 1 && number_percent() < 25 ) { CHAR_DATA *vch; send_to_char( "You got that hacker!\n\r", ch ); ch->c_sn = -1; for ( vch = first_char;vch;vch = vch->next ) { if ( vch->bvictim == ch->in_building ) { send_to_char( "Connection Terminated by system administrator...\n\r", vch ); vch->position = POS_STANDING; vch->bvictim->value[8] = 0; vch->c_sn = -1; vch->bvictim = NULL; return; } } } } return; } void do_exresearch( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj; if ( argument[0] == '\0' ) { send_to_char( "Research which explosive?\n\r", ch ); return; } if ( ( obj = get_obj_carry(ch,argument) ) == NULL ) { send_to_char( "You do not carry that explosive.\n\r", ch ); return; } if ( obj->item_type != ITEM_BOMB ) { send_to_char( "That is not an explosive.\n\r", ch ); return; } ch->c_sn = gsn_exresearch; ch->c_time = 40; ch->c_level = 0; if ( ( get_eq_char(ch,WEAR_HOLD_HAND_L) ) != NULL ) unequip_char(ch,get_eq_char(ch,WEAR_HOLD_HAND_L)); equip_char(ch,obj,WEAR_HOLD_HAND_L); act( "You begin researching $p.", ch, obj, NULL, TO_CHAR ); act( "$n begins researching $p.", ch, obj, NULL, TO_ROOM ); return; } void act_exresearch( CHAR_DATA *ch, int level ) { OBJ_DATA *obj; int chance; bool changed = FALSE; if ( ( obj = get_eq_char(ch,WEAR_HOLD_HAND_L) ) == NULL || obj->item_type != ITEM_BOMB ) { send_to_char( "For some reason, you are no longer holding the explosive you were researching!\n\r", ch ); ch->c_sn = -1; return; } if ( level == 10 ) { send_to_char( "You have completed your research!\n\r", ch ); obj->value[2] += dice(1,ch->pcdata->skill[gsn_exresearch]); if ( obj->value[6] > 0 ) obj->value[6]--; ch->c_sn = -1; ch->c_level = 0; return; } send_to_char( "You continue researching.\n\r", ch ); chance = ch->pcdata->skill[gsn_exresearch]+5; if(level < 1) { level=1; changed = TRUE; } if ( number_percent() < ((100/level) + obj->level) && number_percent() > chance ) { send_to_char( "Your finger slips!\n\r", ch ); act( "$n glitches a little.", ch, NULL, NULL, TO_ROOM ); if ( number_percent() < 40 ) { int dam = dice(obj->weight,obj->value[2]); if ( dam >= ch->max_hit ) dam = ch->max_hit - 1; act( "$p EXPLODES!!", ch, obj, NULL, TO_CHAR ); act( "$p EXPLODES!!", ch, obj, NULL, TO_ROOM ); extract_obj(obj); ch->c_sn = -1; damage(ch,ch,dam,DAMAGE_BLAST); return; } else level--; } act( "$n continues researching.\n\r", ch, NULL, NULL, TO_ROOM ); if(changed) level--; ch->c_time = 40; ch->c_level = level + 1; return; } void do_proficiencies(CHAR_DATA *ch, char *argument) { char buf[MSL]; char arg[MSL]; int i; if ( argument[0] == '\0' ) { do_skills(ch,""); sprintf( buf, "\n\rYou have %d proficiency points.\n\r", ch->pcdata->prof_points ); send_to_char(buf, ch ); send_to_char( "\n\rSyntax: Proficiencies Add <prof>\n\r", ch ); send_to_char( " Proficiencies Abilities\n\r", ch ); return; } argument = one_argument(argument,arg); if ( !str_prefix(arg,"abilities") ) { char buf2[MSL]; sprintf(buf,"@@d"); sprintf(buf2,"@@r"); send_to_char( "\n\rName Eco Bld Cmb Desc\n\r----------------------------------------------------------------\n\r", ch ); for ( i=0;ability_table[i].economics!=-1;i++ ) { if ( !has_ability(ch,i) ) sprintf(buf+strlen(buf),"%-20s %d %d %d %s\n\r", ability_table[i].name, ability_table[i].economics,ability_table[i].building,ability_table[i].combat,ability_table[i].desc ); else sprintf(buf2+strlen(buf2),"%-20s %s\n\r", ability_table[i].name, ability_table[i].desc ); } send_to_char(buf,ch); send_to_char(buf2,ch); return; } else if ( !str_prefix(arg,"add") ) { if ( ch->pcdata->prof_points <= 0 ) { send_to_char( "You don't have any more proficiency points!\n\r", ch ); return; } for ( i = 0;skill_table[i].gsn != -1;i++ ) { if ( !skill_table[i].prof ) continue; if ( str_cmp(skill_table[i].name,argument) ) continue; ch->pcdata->skill[skill_table[i].gsn]++; ch->pcdata->prof_points--; sprintf( buf, "@@WYou have increased your @@a%s@@W proficiency!@@N\n\r", skill_table[i].name ); send_to_char(buf,ch); save_char_obj(ch); return; } send_to_char("No such proficiency.\n\r", ch ); return; } else { send_to_char( "Invalid option. Options are:\n\rProficiencies ADD <prof> - Proficiencies add electronics\n\rProficiencies Abilities - List the prof. abilities\n\r", ch ); return; } return; } void do_fix ( CHAR_DATA *ch, char * argument) { BUILDING_DATA *bld = ch->in_building; if ( !bld || !complete(bld) ) { send_to_char( "You can't fix anything here.\n\r", ch ); return; } if ( !has_ability(ch,0) ) { send_to_char( "You do not have enough proficiency points to use this skill.\n\r", ch ); return; } if ( bld->hp >= bld->maxhp ) { send_to_char( "This building doesn't need fixing.\n\r", ch ); return; } ch->c_sn = gsn_fix; ch->c_time = 16; send_to_char( "You begin fixing the building.\n\r", ch ); act( "$n begins fixing the building.", ch, NULL, NULL, TO_ROOM ); return; } void act_fix( CHAR_DATA *ch, int level ) { BUILDING_DATA *bld = ch->in_building; int x = ch->pcdata->skill[gsn_building]; if ( !bld || !complete(bld) ) { send_to_char( "You can't fix anything here.\n\r", ch ); ch->c_sn = -1; return; } bld->hp = URANGE(1,bld->hp+x,bld->maxhp); if ( bld->hp >= bld->maxhp ) { ch->c_sn = -1; send_to_char( "You finish fixing the building.\n\r", ch ); return; } send_to_char( "You continue working on the building.\n\r", ch ); act( "$n continues working on the building.", ch, NULL, NULL, TO_ROOM ); ch->c_time = 16; return; } void do_train(CHAR_DATA *ch, char *argument) { int skill,cost,i,disc; char buf[MSL]; if ( argument[0] == '\0' ) { send_to_char( "Which skill would you like to train?\n\r", ch ); if ( IS_NEWBIE(ch) ) send_to_char( "TIP: Type \"Skills\" to see the list.\n\r", ch ); return; } skill = -1; for ( i=0;skill_table[i].gsn != -1;i++ ) { if ( skill_table[i].gsn == -1 ) break; if ( !str_prefix(argument,skill_table[i].name) ) { skill = skill_table[i].gsn; break; } } if ( skill == -1 ) { send_to_char( "There is no such skill.\n\r", ch ); return; } if ( skill_table[skill].prof ) { send_to_char( "You cannot train proficiencies with experience points.\n\r", ch ); return; } cost = (ch->pcdata->skill[skill] +1) * 3; disc = get_rank(ch)/100; if ( disc > cost - 10 ) disc = cost - 10; cost -= (cost * disc)/100; if ( ch->pcdata->experience < cost ) { sprintf( buf, "This will require %d experience points, you only have %d.\n\r", cost, ch->pcdata->experience ); send_to_char(buf,ch); return; } ch->pcdata->skill[skill]++; ch->pcdata->experience -= cost; save_char_obj(ch); sprintf( buf, "You train your %s skill.\n\r", skill_table[i].name ); send_to_char(buf,ch); return; } bool blind_combat_check(CHAR_DATA *ch) { if ( number_percent() < ch->pcdata->skill[gsn_blind_combat] ) return TRUE; // send_to_char( "You feel around your inventory, but couldn't find it.\n\r", ch ); return FALSE; } void do_conquer(CHAR_DATA *ch, char *argument) { char buf[MSL]; char hq[MSL]; BUILDING_DATA *bld = ch->in_building; BUILDING_DATA *bld2; int lab=-1,lab2=-1,b=0; int build[MAX_POSSIBLE_BUILDING]={0}; /* for(b=0;b<MAX_POSSIBLE_BUILDING;b++) build[b]=0; b=0;*/ if ( !bld || bld == NULL ) { send_to_char( "You must be in a building you wish to conquer.\n\r", ch ); return; } if ( !bld->owner ) { send_to_char( "How did you even get inside?\n\r", ch ); return; } if ( bld->owner == ch ) { send_to_char( "This building already belongs to you.\n\r", ch ); return; } if ( get_rank(ch)<2 ) mreturn("You can't capture buildings until you hit rank 2.\n\r",ch); if ( get_rank(bld->owner)<2 ) mreturn("You can't capture buildings of low-ranking players.\n\r",ch); if ( allied(bld->owner,ch) ) mreturn("You can't capture allied buildings.\n\r", ch ); if ( build_table[bld->type].act == BUILDING_LAB ) lab = bld->type; else if ( build_table[build_table[bld->type].requirements].act == BUILDING_LAB ) lab = build_table[bld->type].requirements; else if ( build_table[build_table[build_table[bld->type].requirements].requirements].act == BUILDING_LAB ) lab = build_table[build_table[bld->type].requirements].requirements; hq[0] = '\0'; for ( bld2=ch->first_building;bld2;bld2 = bld2->next_owned ) { b++; build[bld2->type]++; if ( build_table[bld2->type].act == BUILDING_LAB ) lab2 = bld2->type; else if ( build_table[build_table[bld2->type].requirements].act == BUILDING_LAB ) lab2 = build_table[bld2->type].requirements; else if ( build_table[build_table[build_table[bld2->type].requirements].requirements].act == BUILDING_LAB ) lab2 = build_table[build_table[bld2->type].requirements].requirements; else if (bld2->type == BUILDING_HQ ) sprintf(hq+strlen(hq),"HQ at: %d/%d\n\r", bld2->x,bld2->y ); } if ( !build[BUILDING_HQ] && bld->type != BUILDING_HQ ) { send_to_char( "You can't capture buildings unless you have a Headquarters.\n\r", ch ); return; } else if ( build[BUILDING_HQ] >= MAX_HQS_ALLOWED && bld->type == BUILDING_HQ ) { send_to_char( "You can't raise your build limit.\n\r", ch ); sprintf(hq+strlen(hq),"%d HQs found.\n\r", build[BUILDING_HQ]); send_to_char(hq,ch); } if ( bld->type != BUILDING_HQ && build[bld->type] >= build_table[bld->type].max ) { send_to_char( "You cannot have any more of this building type.\n\r", ch ); return; } if ( build[BUILDING_HQ] > MAX_HQS_ALLOWED ) ch->blimit=building_limits[MAX_HQS_ALLOWED]; if ( !(build[BUILDING_HQ] > MAX_HQS_ALLOWED )) ch->blimit=building_limits[build[BUILDING_HQ]]; if ( b >= ch->blimit && bld->type != BUILDING_HQ ) mreturn ("You have already hit your building limit.\n\r", ch ); if ( lab != -1 && lab2 != -1 && lab != lab2 ) { send_to_char( "You cannot conquer this building. It will conflict with your current technology tree.\n\r", ch ); return; } act( "You begin conquering the building!\n\r", ch,NULL,NULL,TO_CHAR ); act( "$n begins conquering the building!\n\r", ch,NULL,NULL,TO_ROOM ); ch->c_sn = gsn_conquer; ch->c_time = 16; ch->c_level = 10; sprintf(buf, "@@e%s is attempting to take over your %s (%d/%d)!@@N\n\r", ch->name, bld->name, bld->x,bld->y); send_to_char(buf,bld->owner); return; } void act_conquer(CHAR_DATA *ch, int level) { // int chance=0; BUILDING_DATA *bld; if ( ( bld = ch->in_building ) == NULL ) { send_to_char( "For some reason, you are no longer inside a building.\n\r", ch ); ch->c_sn = -1; return; } act( "You continue taking over...", ch, NULL,NULL,TO_CHAR ); act( "$n continues taking over...", ch, NULL,NULL,TO_ROOM ); /* chance = ((10000/bld->maxhp)*bld->hp)/100; chance -= (ch->pcdata->skill[gsn_conquer]/4)*3; if ( number_percent() < chance ) { act( "You have failed taking control.", ch, NULL, NULL, TO_CHAR ); act( "$n has failed assuming control of the building.", ch, NULL, NULL, TO_ROOM ); ch->c_sn = -1; ch->c_level = 0; return; }*/ if ( --ch->c_level <= 0 ) { BUILDING_DATA *bld2; CHAR_DATA *vict; char buf[MSL]; sprintf(buf, "@@e%s has taken over your %s (%d/%d)!@@N\n\r", ch->name, bld->name, bld->x,bld->y); send_to_char(buf,bld->owner); send_to_char( "You have successfully taken over the building!\n\r", ch ); act( "$n has successfully taken control of the building!", ch, NULL, NULL, TO_ROOM ); sprintf(buf,"%s's (%d) %s captured by %s.",bld->owned,(bld->owner)?my_get_hours(bld->owner,TRUE):0,bld->name,ch->name); log_f(buf); if ( bld->owner && bld == bld->owner->first_building ) bld->owner->first_building = bld->next_owned; if ( bld->prev_owned ) bld->prev_owned->next_owned = bld->next_owned; if ( bld->next_owned ) bld->next_owned->prev_owned = bld->prev_owned; vict = bld->owner; free_string(bld->owned); bld->owned = str_dup(ch->name); check_power(vict); bld2 = ch->first_building; while (bld2 && bld2->next_owned )bld2 = bld2->next_owned; if ( bld2 ) { bld->next_owned = NULL; bld->prev_owned = bld2; bld2->next_owned = bld; } else { bld->next_owned = NULL; bld->prev_owned = NULL; ch->first_building = bld; } bld->timer = 0; bld->active = TRUE; bld->owner = ch; ch->c_sn = -1; check_power(ch); if ( ch->fighttimer < 360 ) ch->fighttimer = 360; return; } ch->c_time = (((10000/bld->maxhp)*bld->hp)/100) - ((ch->pcdata->skill[gsn_conquer]/4)*3); if ( ch->c_time < 16 ) ch->c_time = 16; return; } void do_infiltrate(CHAR_DATA *ch, char *argument) { BUILDING_DATA *bld; int dir,x,y; if ( ch->in_vehicle ) mreturn("Exit the vehicle first.\n\r", ch ); if ( ch->in_building ) { send_to_char( "You can't find an entrance!\n\r", ch ); return; } if ( ( dir = parse_direction(ch,argument) ) == -1 ) { send_to_char( "Which direction do you want to infiltrate to?\n\r", ch ); return; } x=ch->x; y=ch->y; if ( dir == DIR_NORTH ) y++; else if ( dir == DIR_SOUTH ) y--; else if ( dir == DIR_EAST ) x++; else if ( dir == DIR_WEST ) x--; real_coords(&x,&y); if ( ( bld = map_bld[x][y][ch->z] ) == NULL ) { char buf[MSL]; sprintf(buf, "There is nothing there to infiltrate (%d/%d).\n\r", x,y); send_to_char(buf,ch); return; } if ( !bld->active ) mreturn("You can't infiltrate offline buildings.\n\r", ch); if ( build_table[bld->type].act == BUILDING_WALLS ) { ch->c_level = bld->value[0]+(bld->level*5); act( "You begin climbing up the wall.", ch, NULL, NULL, TO_CHAR ); act( "$n begins climbing up the wall.", ch, NULL, NULL, TO_ROOM ); } else { ch->c_level = bld->level*5; act( "You begin climbing up through the window.", ch, NULL, NULL, TO_CHAR ); act( "$n begins climbing up through the window.", ch, NULL, NULL, TO_ROOM ); } ch->c_sn = gsn_infiltrate; ch->c_time = 32; ch->bvictim = bld; return; } void act_infiltrate(CHAR_DATA *ch, int level) { BUILDING_DATA *bld = ch->bvictim; if ( !ch->bvictim ) return; if ( number_percent() < ch->c_level ) { send_to_char( "You couldn't break through this time.\n\r", ch ); act( "$n couldn't get through.", ch, NULL, NULL, TO_ROOM ); return; } act( "$n breaks into the building.", ch, NULL, NULL, TO_ROOM ); move(ch,bld->x,bld->y,bld->z); do_look(ch,""); ch->position = POS_SNEAKING; return; } void do_work(CHAR_DATA *ch, char *argument) { BUILDING_DATA *bld = ch->in_building; if ( !bld ) mreturn( "You can't work here.\n\r", ch ); if ( !bld->owner || bld->owner != ch || !complete(bld) ) mreturn( "The owners won't let you work here.\n\r", ch ) if ( bld->type == BUILDING_BANK ) { act( "You sit next to your desk, and ignore people like a good bank employee.", ch, NULL, NULL, TO_CHAR ); act( "$n sits next to $s desk, ignoring everyone around him like in real life.", ch, NULL, NULL, TO_ROOM ); } else if ( bld->type == BUILDING_CYBERCAFE ) { OBJ_DATA *obj; if ( ( obj = get_best_laptop(ch) ) == NULL ) mreturn( "You must have a computer to work here.\n\r", ch ); if ( obj->value[0] <= 0 ) mreturn( "Your laptop needs a new battery.\n\r", ch ); ch->c_obj = obj; act( "You pull up your computer, and begin hacking websites.", ch, NULL, NULL, TO_CHAR ); act( "$n pulls up $s computer, and begins hacking websites.", ch, NULL, NULL, TO_ROOM ); } else if ( bld->type == BUILDING_MINE ) { act( "You begin working in the mines.", ch, NULL, NULL, TO_CHAR ); act( "$n begins working in the mines.", ch, NULL, NULL, TO_ROOM ); } else if ( bld->type == BUILDING_SHOP ) { act("You take your spot behind the counter and wait for a customer.", ch, NULL, NULL, TO_CHAR ); act( "$n takes $s spot behind the counter and waits for a customer.", ch, NULL, NULL, TO_ROOM ); } else mreturn( "You can't work in this building.\n\r", ch ); ch->c_sn = gsn_work; ch->c_time = 20 * PULSE_PER_SECOND; ch->c_level = 0; return; } void act_work(CHAR_DATA *ch,int level) { BUILDING_DATA *bld = ch->in_building; char buf[MSL]; int m; if ( !bld ) { ch->c_sn = -1; mreturn( "You are no longer in a building!\n\r", ch ); } ch->c_level++; if ( bld->type == BUILDING_BANK ) { sprintf( buf, "@@NYou secretly sneak money into your account @@x(@@N$%d@@x)@@N\n\r", bld->level*2 ); send_to_char(buf,ch); bld->value[5]+=bld->level*2; if ( bld->value[5] > 50000 ) bld->value[5] = 50000; if ( number_percent() < ch->c_level ) { send_to_char( "Your boss found out you were stealing! In his rage, he erased your entire account.\n\r", ch ); bld->value[5] = 0; ch->c_sn = -1; return; } } else if ( bld->type == BUILDING_CYBERCAFE ) { OBJ_DATA *obj; int i = number_range(1,5); if ( ( obj = ch->c_obj ) == NULL ) { ch->c_sn = -1; mreturn( "You have lost your computer.\n\r", ch ); } ch->c_obj = obj; switch(i) { case 1: send_to_char( "You contribute to the further development of free games!.. Actually, you just cracked a commercial game and made it free.", ch ); break; case 2: send_to_char( "You break into Microsoft.com and change the logs to point at your highschool bully.", ch ); break; default: send_to_char( "You hack and copy a porn site.", ch ); break; } i = ((obj->value[0] * ch->pcdata->skill[gsn_computer]) / 100)+1; sprintf( buf, " @@x(@@N$%d@@x)@@N\n\r", i ); send_to_char(buf,ch); gain_money(ch,i); if ( --obj->value[1] <= 0 ) { send_to_char( "Your laptop has shut down! You need a new battery.\n\r", ch ); ch->c_sn = -1; return; } if ( number_percent() < ch->c_level ) obj->value[3] = 1; if ( number_percent() < ch->c_level && 0 ) { send_to_char( "The authorities have traced your location! You sprint out of your workstation and start whistling like nothing happened.\n\r", ch ); obj->value[3] = 1; ch->c_sn = -1; return; } } else if ( bld->type == BUILDING_MINE ) { if ( number_percent() < ch->c_level ) { m = number_range(1,500); sprintf(buf, "A %s rock drops right on your head. @@e(@@R%d@@e)@@N\n\r", (m<100)?"small":(m<300)?"heavy":"huge", m ); send_to_char(buf,ch); sprintf(buf, "A %s rock drops right on $n's head.", (m<100)?"small":(m<300)?"heavy":"huge" ); act(buf,ch,NULL,NULL,TO_ROOM); damage(ch,ch,m,-1); } else { send_to_char("You sift through the piles of sand and rocks.\n\r", ch ); act( "$n sifts through the piles of sand and rocks.", ch, NULL, NULL, TO_ROOM ); m = number_range(1,50); if ( m > 5 ) { send_to_char( "You find nothing.\n\r", ch ); } else { sprintf(buf,"You find a %s! @@a(@@c$%d@@a)@@N\n\r", (m==1)?"silver pebble":(m==2)?"silver chunk":(m==3)?"shiny stone":(m==4)?"tiny piece of gold":"gemstone", m * 10); send_to_char(buf,ch); gain_money(ch,m*10); } } } else if ( bld->type == BUILDING_SHOP ) { sprintf(buf, "A customer walks in.\n\r" ); m = number_range(1,bld->level); if ( number_percent() < ch->c_level ) { m *= 15; sprintf(buf+strlen(buf),"He pulls out a gun and robs you!! @@e(@@R$%d@@e)@@N\n\r", m ); ch->money -= m; if ( ch->money <=0 ) ch->money = 0; } else { sprintf(buf+strlen(buf),"He buys a couple of things, and leaves. @@a(@@c$%d@@a)@@N\n\r", m ); gain_money(ch,m); } send_to_char(buf,ch); } else { ch->c_sn = -1; return; } if ( ch->c_level < 16 ) ch->c_time = (20-(ch->c_level/4)) * PULSE_PER_SECOND; else ch->c_time = 4 * PULSE_PER_SECOND; return; }