/*~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- ~ 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. ~ ~ ~ ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-*/ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <sys/time.h> #include <sys/resource.h> #include <stdio.h> #include <string.h> #include <time.h> #include "ack.h" #include <signal.h> //If it's related to buildings, it's here. void check_alien_hide args((OBJ_DATA *obj)); bool hits_air(BUILDING_DATA *bld); long get_upgrade_cost(BUILDING_DATA *bld); long get_upgrade2_cost(BUILDING_DATA *bld); void building_update( void ) { int i,range,xx,yy,x,y,z; OBJ_DATA *obj = NULL; BUILDING_DATA *bld; BUILDING_DATA *bld_next; CHAR_DATA *bch = NULL; CHAR_DATA *ch = NULL; bool qb = FALSE; char buf[MSL]; extern int active_building_count; extern OBJ_DATA *map_obj[MAX_MAPS][MAX_MAPS]; OBJ_DATA *obj2; if ( first_building == NULL ) return; active_building_count = 0; for ( bld = first_active_building;bld;bld = bld_next ) { bld_next = bld->next_active; qb = FALSE; active_building_count++; if ( bld->timer > 0 ) { bld->timer--; if ( bld->timer == 0 ) { if ( is_evil(bld) ) { extract_building(bld,TRUE); continue; } activate_building(bld,FALSE); } continue; } if ( --bld->tick > 0 ) continue; bld->tick = number_range(build_table[bld->type].tick-1,build_table[bld->type].tick+1); // if ( !bld->tag && build_table[bld->type].act != BUILDING_UNATTACHED ) bld->tick *= 10; if ( bld->z == Z_PAINTBALL && bld->type == BUILDING_SNIPER_TOWER ) continue; if ( number_percent() < 25 ) bld->visible = TRUE; if ( bld->protection > 0 ) bld->protection--; if ( !bld->active ) continue; if ( bld->value[4] > 0 ) bld->value[4]--; if ( bld->value[9] > 0 ) bld->value[9]--; if ( is_evil(bld) ) qb = TRUE; z = bld->z; if ( !qb ) { if ( bld->owner ) { bch = bld->owner; } else { bch = get_ch(bld->owned); bld->owner = bch; } ch = bch; if ( bch == NULL ) { activate_building(bld,FALSE); continue; } if ( complete(bld) ) { if ( bld->shield < bld->maxshield ) bld->shield+=bld->level; if ( bld->hp < bld->maxhp / 2 && IS_SET(bld->value[1],INST_ORGANIC_CORE)) { if ( number_percent() < 20 ) bld->hp += (bld->maxhp/10); } } if ( bld->value[9] > 0 ) { if ( has_ability(ch,1) ) //Nuclear containment { bld->value[9] -= number_range(1,3); if ( bld->value[9] < 0 ) bld->value[9] = 0; } } if ( bld->value[3] > 0 && ( !IS_SET(bld->value[1],INST_FIREWALL) || number_percent() < 55 ) ) { bld->value[3]--; if ( bld->value[3] == 0 ) { bld->value[3] = -1; send_to_char( "@@yOne of your buildings has been taken over by a virus!@@N\n\rDon't know what to do? See: Help Virus\n\r", bch ); if ( ch->fighttimer < 360 ) ch->fighttimer = 360; } } if ( bld->value[3] < 0 ) { if ( bld->type == BUILDING_VIRUS_ANALYZER && bld->value[0] == 0 && bld->attacker ) { // char buf[MSL]; int chance=bld->level * 20; sprintf( buf,"@@yOne of your Virus Analyzers has come up with the following report:\n\r\n\r@@cThe virus was originated by @@a%s@@c.@@N\n\r", bld->attacker ); if ( number_percent() < chance ) { if ( ( ch = get_ch(bld->attacker) ) != NULL ) { if ( ch->first_building ) sprintf( buf+strlen(buf), "@@cIt has been determined that they have a building in the vicinity of@@a %d/%d@@c.@@N\n\r", ch->first_building->x,ch->first_building->y); } } else sprintf( buf+strlen(buf), "@@cIt couldn't trace the location of the attacker.@@N\n\r"); bld->value[0] = 1; send_to_char(buf,bch); } if ( IS_SET(bld->value[1],INST_ANTIVIRUS) && number_percent() < 30 ) { bld->value[3] = 0; bld->value[4] = 12; if ( number_percent() < 33 ) REMOVE_BIT(bld->value[1],INST_ANTIVIRUS); } else if ( number_percent() < 30 ) { BUILDING_DATA *bld2; bool got = FALSE; range = bld->level * 2; y = bld->y; for ( x = bld->x - range;x < bld->x + range + 1;x++ ) { if ( INVALID_COORDS(x,y) ) continue; bld2 = map_bld[x][y][z]; int g; for (g=0;bld2 == NULL && g <= Z_MAX;g++) { bld2 = map_bld[x][y][g]; } if ( bld2 == NULL ) continue; if ( number_percent() < 10 - bld->value[3] && bld2->value[4] == 0 ) { if ( bld2 && bld2->value[3] == 0 && !str_cmp(bld->owned,bld2->owned) ) { bld2->value[3] = bld->value[3]; if ( bld->attacker ) { if ( bld2->attacker != NULL && bld->attacker ) free_string(bld2->attacker); bld2->attacker = str_dup(bld->attacker); } send_to_char( "@@eReports indicate the virus is spreading through your network!@@N\n\r", bch ); if ( bch->fighttimer < 360 ) bch->fighttimer = 360; got = TRUE; break; } } } x = bld->x; if ( !got ) { for ( y = bld->y - range;y < bld->y + range + 1;y++ ) { if ( INVALID_COORDS(x,y) ) continue; int z_rand; for (z_rand = 0;z_rand == Z_PAINTBALL;) { z_rand = number_range(0, Z_MAX - 1); if(z_rand < 0) z_rand = 0; } bld2 = map_bld[x][y][z_rand]; if ( bld2 == NULL ) continue; if ( number_percent() < 10 - bld->value[3] && bld2->value[4] == 0 ) { if ( bld2 && bld2->value[3] == 0 && !str_cmp(bld->owned,bld2->owned) ) { bld2->value[3] = bld->value[3]; if ( bld->attacker ) { if ( bld2->attacker != NULL ) free_string(bld2->attacker); bld2->attacker = str_dup(bld->attacker); } send_to_char( "@@eReports indicate the virus is spreading through your network!@@N\n\r", bch ); got = TRUE; break; } } } } continue; } else continue; } if ( !complete(bld) ) continue; if ( IS_SET( bch->pcdata->pflags, PFLAG_AFK ) && number_percent() < 75 ) continue; if ( ( bch->security == FALSE || bld->protection > 0 ) && defense_building(bld) ) continue; } obj = NULL; if ( !complete(bld) ) continue; if ( build_table[bld->type].act == BUILDING_DEFENSE ) { int dam,acc; range = bld->value[6]; for ( xx = bld->x - range;xx < bld->x + range + 1;xx++ ) for ( yy = bld->y - range;yy < bld->y + range + 1;yy++ ) { x = xx; y = yy; real_coords(&x,&y); if ( ( ch = get_rand_char(x,y,bld->z) ) == NULL ) { if (hits_air(bld)) { if ( bld->z != Z_GROUND || ( ch = get_rand_char(x,y,Z_AIR) ) == NULL ) continue; } else continue; } if ( is_evil(bld) ) bch = ch; else { if ( bch->pcdata->alliance != -1 && bch->pcdata->alliance == ch->pcdata->alliance ) continue; } if ( !building_can_shoot(bld,ch,range) ) continue; BUILDING_DATA *bld5; bool defense = FALSE; for ( bld5 = bch->first_building;bld5;bld5 = bld5->next_owned ) { if ((build_table[bld5->type].act == BUILDING_DEFENSE_LAB) && (bld5->tag == TRUE)) { defense=TRUE; break;} } if ( bld->tag == FALSE ) { send_to_char("\r\n@@eSomeones in range, but some of your defenses are unpowered.@@n\n\r", bch); continue; } sprintf(buf, "@@e[@@R%s@@e]@@R fires at you! ", bld->name ); send_to_char(buf,ch); sprintf(buf, "@@G[@@r%s:%d/%d@@G]@@r fires at %s! ", bld->name,bld->x,bld->y,ch->name ); send_to_char(buf,bch); acc = (40+(bld->level * 5)-bld->value[6]) + bld->value[8]; if ( bld->value[0] == TURRET_MAGNET ) acc -= 30; if ( number_percent() < acc) { if ( bld->value[0] == TURRET_MAGNET ) { OBJ_DATA *obj; if ( ( obj = ch->first_carry ) != NULL ) { while ( obj && ( IS_SET(obj->extra_flags,ITEM_NODROP) || IS_SET(obj->extra_flags,ITEM_STICKY) ) ) obj = obj->next_in_carry_list; if ( !obj ) continue; set_fighting(bch,ch); act( "You discover $p floating towards the magnet tower!", ch, obj, NULL, TO_CHAR ); act( "$n discovers $p floating towards the magnet tower!", ch, obj, NULL, TO_ROOM ); obj_from_char(obj); obj->x = bld->x; obj->y = bld->y; obj->z = bld->z; free_string(obj->owner); obj->owner = str_dup(bld->owned); obj_to_room(obj,get_room_index(ROOM_VNUM_WMAP)); } } else if ( bld->value[0] == TURRET_PROJECTOR ) { if ( !IS_SET(ch->effect,EFFECT_VISION) ) SET_BIT(ch->effect,EFFECT_VISION); send_to_char( "Your eyes feel blurry...\n\r", ch ); send_to_char("\n\r",bch); } else if ( bld->value[0] == TURRET_PROJECTOR ) { if ( !IS_SET(ch->effect,EFFECT_VISION) ) SET_BIT(ch->effect,EFFECT_VISION); send_to_char( "Your eyes feel blurry...\n\r", ch ); send_to_char("\n\r",bch); } else { dam = bld->value[5] - (bld->value[6] * bld->value[7]); if(defense) dam *= 1.25; sprintf(buf,"@@G(@@r%d:%s@@G)@@N\n\r",dam,dam_type[bld->value[10]]); send_to_char(buf,bch); sprintf(buf,"@@e(@@R%d:%s@@e)@@N\n\r",dam,dam_type[bld->value[10]]); send_to_char(buf,ch); damage( bch, ch, dam, bld->value[10] ); if ( IS_SET(bld->value[1],INST_ACID_DEFENSE) && ch && ch->position != POS_DEAD ) damage(bch,ch,bld->level*10,DAMAGE_ACID); } } else { sprintf(buf,"@@p(@@mMiss@@p)@@N\n\r" ); send_to_char(buf,ch); send_to_char(buf,bch); } break; } for ( xx = bld->x - range;xx < bld->x + range + 1;xx++ ) for ( yy = bld->y - range;yy < bld->y + range + 1;yy++ ) { x = xx; y = yy; real_coords(&x,&y); if(map_bld[x][y][bld->z] == NULL) continue; if ( !building_can_shoot(bld,ch,range) ) continue; } } else if ( build_table[bld->type].act == BUILDING_MONEY ) { int r = 1; gain_money(bch,r); if ( bld->level < MAX_BUILDING_LEVEL ) { if ( --bld->value[0] <= 0 ) { bld->level++; sprintf(buf, "@@a[@@c%s:%d/%d@@a]@@c has been upgraded to level @@a%d@@c!\n\r", bld->name,bld->x,bld->y,bld->level ); send_to_char(buf,bch); bld->value[0] = build_table[bld->type].value[0]; } } } else switch( UPPER(bld->name[0]) ) { /**/ case 'A': if ( bld->type == BUILDING_ARMOR_FACTORY ) { for ( obj = map_obj[bld->x][bld->y];obj;obj = obj->next_in_room ) { if ( obj->z == bld->z && obj->item_type == ITEM_ARMOR && obj->level < 99 ) { int j,am; am = (obj->level < 95 ) ? 5 : 99 - obj->level; for ( j=2;j<9;j++ ) obj->value[j] += am; obj->level += am; break; } } } break; /**/ case 'B': if ( bld->type == BUILDING_BANK ) { int t; t = build_table[bld->type].value[0] - bld->value[0]; if ( t < 0 ) t = 0; bld->value[6] = ((bld->value[6] * t) + bld->value[5]) / (t+1); if ( --bld->value[0] <= 0 ) { bld->value[0] = build_table[bld->type].value[0]; bld->value[5] += (0+(((float)(bld->level)/100))) * bld->value[6]; if ( bld->value[5] > 200000 ) bld->value[5] = 200000; bld->value[6] = 0; } } else if ( bld->type == BUILDING_BAR ) { if ( bld->value[0] > 0 ) bld->value[0]--; } break; /**/ case 'C': if ( bld->type == BUILDING_COUNTERSPY_AGENCY ) { range = bld->level; for ( xx = bld->x-range;xx < bld->x+range;xx++ ) for ( yy = bld->y-range;yy < bld->y+range;yy++ ) { x=xx;y=yy;real_coords(&x,&y); for ( ch = map_ch[x][y][bld->z];ch;ch = ch->next_in_room ) if ( !IS_SET(ch->effect,EFFECT_EVADE) ) SET_BIT(ch->effect,EFFECT_EVADE); } } break; /**/ case 'D': break; /**/ case 'E': if ( bld->type == BUILDING_ENCRYPTION_POD ) { if ( bch->in_building == bld && bch->x == bld->x && bch->y == bld->y && bch->z == bld->z ) { if ( !IS_SET(ch->effect,EFFECT_ENCRYPTION) ) { SET_BIT(ch->effect,EFFECT_ENCRYPTION); send_to_char( "You are protected by an encryption barrier.\n\r", ch ); } } } break; /**/ case 'F': break; /**/ case 'G': if ( bld->type == BUILDING_GOVERNMENT_HALL && bch->pcdata->alliance != -1 ) { i = 0; for ( obj = map_obj[bld->x][bld->y];obj;obj = obj->next_in_room ) if ( obj->x == bld->x && obj->y == bld->y && obj->z == bld->z && obj->item_type == ITEM_BOARD ) { i++; break; } if ( i <= 0 ) { obj = create_object( get_obj_index(OBJ_VNUM_ALLI_BOARD), 0 ); if ( obj ) { obj->x = bld->x; obj->y = bld->y; obj->z = bld->z; obj->value[4] = bch->pcdata->alliance; obj->value[3] = OBJ_VNUM_ALLI_BOARD + bch->pcdata->alliance; obj_to_room( obj, get_room_index(ROOM_VNUM_WMAP) ); } } } break; /**/ case 'H': if ( bld->type == BUILDING_HQ ) { i = 0; if ( bch ) gain_money(bch,5); for ( obj = map_obj[bld->x][bld->y];obj;obj = obj->next_in_room ) if ( obj->x == bld->x && obj->y == bld->y && obj->z == bld->z && obj->item_type == ITEM_BOARD ) { i++; break; } if ( i <= 0 ) { obj = create_object( get_obj_index(OBJ_VNUM_MAIN_BOARD), 0 ); obj->x = bld->x; obj->y = bld->y; obj->z = bld->z; obj_to_room( obj, get_room_index(ROOM_VNUM_WMAP) ); } } else if ( bld->type == BUILDING_HACKPORT ) { if ( bch->timer > 5 ) continue; if ( bld->value[0] > 0 ) { bld->value[0]--; if ( bld->value[0] == 0 ) send_to_char( "@@eYour hackport is ready!@@N\n\r", ch); } } break; /**/ case 'I': break; /**/ case 'J': if ( bld->type == BUILDING_JAMMER ) { BUILDING_DATA *jam; range = bld->level * 2; if ( number_percent() < 75 ) bld->visible = FALSE; for ( xx = bld->x-range;xx < bld->x+range;xx++ ) for ( yy = bld->y-range;yy < bld->y+range;yy++ ) { x=xx;y=yy;real_coords(&x,&y); jam = map_bld[x][y][z]; if ( jam == NULL ) continue; if ( !jam->owner || jam->owner != bld->owner ) continue; if ( number_percent() < bld->level * 5 ) continue; jam->visible = FALSE; } } break; /**/ case 'K': break; /**/ case 'L': break; /**/ case 'M': break; /**/ case 'N': if ( bld->type == BUILDING_NUKE_LAUNCHER ) { if ( bch->timer > 5 ) continue; if ( bld->value[0] > 0 ) { bld->value[0]--; if ( bld->value[0] == 0 ) send_to_char( "@@eYour Nuke Launcher has produced a Nuke!@@N\n\r", ch); continue; } else if ( bld->value[0] == 0 && number_percent() <= 5 ) send_to_char( "@@eA reminder-> One of your launchers has a Nuke ready for use.@@N\n\r", ch ); } break; /**/ case 'O': break; /**/ case 'P': if ( bld->type == BUILDING_PSYCHIC_TORMENTOR ) { if ( bch->timer > 5 ) continue; if ( bld->value[0] > 0 ) { bld->value[0]--; if ( bld->value[0] == 0 ) send_to_char( "@@eYour Psychic Tormentor is ready!@@N\n\r", ch); continue; } } else if ( bld->type == BUILDING_PSYCHIC_RADAR ) { range = 30; for ( xx = bld->x - range;xx < bld->x + range + 1;xx++ ) for ( yy = bld->y - range;yy < bld->y + range + 1;yy++ ) { x=xx;y=yy;real_coords(&x,&y); if ( ( ch = get_rand_char(x,y,bld->z) ) == NULL || ch == bch || IS_IMMORTAL(ch) ) if ( bld->z != Z_GROUND || ( ch = get_rand_char(x,y,Z_AIR) ) == NULL || ch == bch || IS_IMMORTAL(ch) ) continue; if ( bch->pcdata->alliance != -1 && bch->pcdata->alliance == ch->pcdata->alliance ) continue; sprintf( buf, "%s has been detected nearby at %d/%d!\n\r", ch->name, ch->x, ch->y ); send_to_char(buf,bch); if ( bch->fighttimer < 60 ) { bch->fighttimer +=600; break; } else break; } } else if ( bld->type == BUILDING_PARTICLE_EMITTER ) { range = 4; // OBJ_DATA *obj2; for ( xx = bld->x - range;xx < bld->x + range + 1;xx++ ) for ( yy = bld->y - range;yy < bld->y + range + 1;yy++ ) { x=xx;y=yy;real_coords(&x,&y); for ( obj2 = map_obj[x][y];obj2;obj2 = obj2->next_in_room ) { if ( !obj2 ) continue; if ( obj2->z != bld->z ) continue; if ( obj2->item_type != ITEM_BOMB || obj2->value[1] <= 0 ) continue; obj2->value[1] = 0; } } } break; /**/ case 'Q': if ( bld->type == BUILDING_QP_MEGASTORE ) { int s=0; bool bad; while (s<30) { s++; x = number_range(0,MAX_MAPS-1); y = number_range(0,MAX_MAPS-1); bad = FALSE; for ( xx=x-5;xx<x+5;xx++ ) for ( yy=y-5;yy<y+5;yy++ ) if (map_bld[xx][yy][bld->z] || (map_table.type[xx][yy][bld->z] == SECT_OCEAN)) bad = TRUE; if ( !bad ) { for ( ch = map_ch[bld->x][bld->y][bld->z];ch;ch = ch->next_in_room ) { ch->in_building = NULL; send_to_char( "The QP Megastore vanishes into the air!\n\r", ch ); } map_bld[bld->x][bld->y][bld->z] = NULL; map_bld[x][y][bld->z] = bld; bld->x = x; bld->y = y; return; } } } break; /**/ case 'R': break; /**/ case 'S': if ( bld->type == BUILDING_SHIELD_GENERATOR ) { BUILDING_DATA *jam; int s; if ( bld->shield <= 0 ) continue; range = bld->level * 2; for ( xx = bld->x-range;xx < bld->x+range;xx++ ) for ( yy = bld->y-range;yy < bld->y+range;yy++ ) { x=xx;y=yy;real_coords(&x,&y); jam = map_bld[x][y][z]; if ( jam == NULL || !map_bld[x][y][z] ) continue; if ( jam == bld ) continue; if ( bch ) { if ( jam->owner ) { if ( jam->owner != bch ) continue; } } else { if ( str_cmp(jam->owned,bld->owned) ) continue; } if ( !complete(jam) ) continue; if ( jam->shield >= jam->maxshield ) continue; if ( jam->value[9] > 0 ) continue; s = bld->shield; if ( jam->maxshield - jam->shield < s ) s = jam->maxshield - jam->shield; bld->shield -= s; jam->shield += s; } } else if ( bld->type == BUILDING_SOLAR_PANEL ) { BUILDING_DATA *jam; range = 10; for ( xx = bld->x-range;xx < bld->x+range;xx++ ) for ( yy = bld->y-range;yy < bld->y+range;yy++ ) { x=xx;y=yy;real_coords(&x,&y); jam = map_bld[x][y][z]; if ( jam == NULL || jam == bld ) continue; jam->tick--; } } else if ( bld->type == BUILDING_SPY_SATELLITE || bld->type == BUILDING_SPY_QUARTERS || bld->type == BUILDING_SHOCKWAVE ) { if ( bch && bch->timer > 5 ) continue; if ( bld->value[0] > 0 ) bld->value[0]--; } else if ( bld->type == BUILDING_SCUD_LAUNCHER ) { if ( bch->timer > 5 ) continue; if ( bld->value[0] > 0 ) { bld->value[0]--; if ( bld->value[0] == 0 ) send_to_char( "@@eYour SCUD Launcher has produced a SCUD!@@N\n\r", ch); continue; } if ( bld->value[0] == 0 && number_percent() <= 5 ) send_to_char( "@@eA reminder-> One of your launchers has a SCUD ready for use.@@N\n\r", ch ); } break; /**/ case 'T': if ( bld->type == BUILDING_TEMPLE ) { int t; if ( --bld->value[0] <= 0 ) { bld->value[0] = build_table[bld->type].value[0]; t = (ch->max_hit - ch->hit) / (7-(bld->level/2)); if ( t > 0 ) { sprintf(buf,"@@aA Divine blessing falls upon you. (@@c%d@@a)@@N\n\r", t ); send_to_char(buf,ch); ch->hit += t; } } } break; /**/ case 'U': break; /**/ case 'V': if ( bld->type == BUILDING_VIRUS_ANALYZER ) { bld->value[0] = 0; } break; /**/ case 'W': if ( bld->type == BUILDING_WEATHER_MACHINE ) { range = bld->level; for ( xx = bld->x-range;xx < bld->x+range;xx++ ) for ( yy = bld->y-range;yy < bld->y+range;yy++ ) { x=xx;y=yy;real_coords(&x,&y); if ( map_table.type[x][y][bld->z] != SECT_WATER ) continue; if ( number_percent() < bld->level * 5 ) continue; map_table.type[x][y][bld->z] = SECT_ICE; } } break; /**/ case 'X': break; /**/ case 'Y': break; /**/ case 'Z': break; } } return; } void do_mimic( CHAR_DATA *ch, char *argument ) { int i; BUILDING_DATA *bld; if ( ( bld = get_char_building(ch) ) == NULL ) { send_to_char( "You must be inside a dummy building.\n\r", ch ); return; } if ( bld->type != BUILDING_DUMMY || str_cmp(bld->owned,ch->name) || !complete(bld) ) { send_to_char( "You can't do that here.\n\r", ch ); return; } if ( argument[0] == '\0' ) { send_to_char( "Please provide a building to mimic.\n\r", ch ); return; } for ( i = 1;i<MAX_BUILDING;i++ ) { if ( !str_cmp(build_table[i].name,argument) ) { bld->value[0] = i; send_to_char( "Ok.", ch ); return; } } send_to_char( "No such building.\n\r", ch ); return; } bool check_missile_defense(OBJ_DATA *obj) { bool ex = FALSE; int x,y,z,xx,yy,y1; BUILDING_DATA *bld; CHAR_DATA *bch; x = obj->x - 5; y1 = obj->y - 5; if ( x < 0 ) x = 0; if ( y1 < 0 ) y1 = 0; xx = obj->x + 5; yy = obj->y + 5; if ( xx >= MAX_MAPS ) xx = MAX_MAPS-1; if ( yy >= MAX_MAPS ) yy = MAX_MAPS-1; z = obj->z; for ( ;x < xx;x++ ) { for ( y=y1;y < yy;y++ ) { if ( INVALID_COORDS(x,y) ) continue; bld = map_bld[x][y][z]; if ( !bld || bld->type != BUILDING_MISSILE_DEFENSE || !complete(bld) ) continue; bch = bld->owner; if ( !bch ) if ( ( bch = get_ch(bld->owned) ) == NULL ) continue; ex = TRUE; send_to_char( "@@eYour missile defense system has intercepted a bomb!@@N\n\r", bch ); break; } if ( ex ) break; } return ex; } void check_alien_hide(OBJ_DATA *obj) { int i,x,t; x = obj->level; t = (obj->value[0]==DAMAGE_BULLETS)?3:(obj->value[0]==DAMAGE_GENERAL)?2:(obj->value[0]==DAMAGE_BLAST)?4:(obj->value[0]==DAMAGE_ACID)?5:(obj->value[0]==DAMAGE_FLAME)?6:(obj->value[0]==DAMAGE_LASER)?7:(obj->value[0]==DAMAGE_SOUND)?8:-1; if ( t == -1 ) return; for ( i=2;i<9;i++ ) { if ( i == t ) continue; if ( obj->value[i] < obj->level / 2 ) obj->value[i] = obj->level / 2; } return; } bool hits_air(BUILDING_DATA *bld) { switch (bld->value[10]) { case DAMAGE_BULLETS: case DAMAGE_LASER: case DAMAGE_BLAST: return TRUE; default: return FALSE; } return TRUE; } void show_building_cust(BUILDING_DATA *bld,CHAR_DATA *ch) { char buf[MSL]; int type; if ( !bld || bld == NULL ) return; if ( build_table[bld->type].act == BUILDING_DEFENSE ) type = 1; else if ( bld->type == BUILDING_BANK ) type = 2; else if ( bld->type == BUILDING_ARMORY || bld->type == BUILDING_ARMORER || bld->type == BUILDING_EXPLOSIVES_SUPPLIER || bld->type == BUILDING_STORAGE ) type = 3; else type = 0; buf[0] = '\0'; sprintf(buf+strlen(buf),"\n\r@@W+-----@@a %25s @@W-----+\n\r",center_text(bld->name,25)); switch(type) { case 1: sprintf(buf+strlen(buf),"@@W| |\n\r"); sprintf(buf+strlen(buf),"@@W| @@aLevel:@@c %-2d ($%-6ld) @@W|\n\r",bld->level,get_upgrade_cost(bld)); sprintf(buf+strlen(buf),"@@W| @@aRange:@@c %-2d @@W|\n\r",bld->value[6]); sprintf(buf+strlen(buf),"@@W| @@dDamage:@@c %-4d @@W|\n\r",bld->value[5]-(bld->value[6]*bld->value[7])); sprintf(buf+strlen(buf),"@@W| @@dHit %%:@@c %-4d @@W|\n\r",(40+(bld->level * 5)-bld->value[6]) + bld->value[8]); sprintf(buf+strlen(buf),"@@W| @@dAmmo:@@c %-7s @@W|\n\r",dam_type[bld->value[10]]); sprintf(buf+strlen(buf),"@@W| |\n\r"); break; case 2: sprintf(buf+strlen(buf),"@@W| |\n\r"); sprintf(buf+strlen(buf),"@@W| @@aLevel:@@c %-2d ($%-6ld) @@W|\n\r",bld->level,get_upgrade_cost(bld)); sprintf(buf+strlen(buf),"@@W| @@dDeposited:@@c %-14d @@W|\n\r",bld->value[5]); sprintf(buf+strlen(buf),"@@W| @@dInterest:@@c %2.2f @@W|\n\r",1+((float)(bld->level)/100)); sprintf(buf+strlen(buf),"@@W| |\n\r"); sprintf(buf+strlen(buf),"@@W| @@dExtra Commands: Withdraw, Deposit @@W|\n\r"); break; case 3: sprintf(buf+strlen(buf),"@@W| |\n\r"); sprintf(buf+strlen(buf),"@@W| @@aLevel:@@c %-2d ($%-6ld) @@W|\n\r",bld->level,get_upgrade_cost(bld)); sprintf(buf+strlen(buf),"@@W| @@aEquipment:@@c %-2d ($%-6ld) @@W|\n\r",bld->value[5],get_upgrade2_cost(bld)); sprintf(buf+strlen(buf),"@@W| |\n\r"); sprintf(buf+strlen(buf),"@@W| @@dExtra Commands: Revert @@W|\n\r"); break; default: sprintf(buf+strlen(buf),"@@W| |\n\r"); sprintf(buf+strlen(buf),"@@W| @@aLevel:@@c %-2d ($%-6ld) @@W|\n\r",bld->level,get_upgrade_cost(bld)); sprintf(buf+strlen(buf),"@@W| |\n\r"); break; } sprintf(buf+strlen(buf),"@@W+---------- @@aCustomization@@W ----------+\n\r" ); send_to_char(buf,ch); return; } void cust_interpret(CHAR_DATA *ch, char *argument) { char arg[MSL]; int val,type; BUILDING_DATA *bld = ch->in_building; if ( !ch->in_building ) { send_to_char( "You are no longer inside a building.\n\r", ch ); ch->position = POS_STANDING; return; } if ( argument[0] == '\0' ) return; if ( build_table[bld->type].act == BUILDING_DEFENSE ) type = 1; else if ( bld->type == BUILDING_BANK ) type = 2; else if ( bld->type == BUILDING_ARMORY || bld->type == BUILDING_ARMORER || bld->type == BUILDING_EXPLOSIVES_SUPPLIER || bld->type == BUILDING_STORAGE ) type = 3; else type = 0; argument = one_argument(argument,arg); if ( !str_cmp(argument,"all")) val = bld->value[5]; else val = atoi(argument); if ( arg[0] == '\0' || !str_prefix(arg,"Show") ) { show_building_cust(ch->in_building,ch); return; } else if (!str_prefix(arg,"Done")) { ch->position = POS_STANDING; return; } else if ( !str_prefix(arg,"look") ) { do_look(ch,argument); return; } else if ( !str_prefix(arg,"level") ) { int c = get_upgrade_cost(bld); if ( c == 0 ) { send_to_char( "This building cannot be upgraded anymore.\n\r", ch ); return; } if ( ch->money < c ) { send_to_char("You don't have enough money to purchase an upgrade.\n\r", ch ); return; } send_to_char("\n\r\n\rLevel up!\n\r", ch ); bld->level++; ch->money -= c; if (build_table[bld->type].act == BUILDING_POWERPLANT || build_table[bld->type].act == BUILDING_HQ) { check_power(ch); } return; } else if ( !str_cmp(arg,"revert") && type == 3 ) { int c; if ( bld->value[5] <= 1 ) mreturn("There is nothing to revert to.\n\r", ch ); bld->value[5]--; c = get_upgrade2_cost(bld); if ( c == 0 ) { send_to_char( "This building cannot be reverted anymore.\n\r", ch ); return; } gain_money(ch,c); return; } else if ( !str_prefix(arg,"equipment") && type == 3 ) { int c = get_upgrade2_cost(bld); if ( c == 0 ) { send_to_char( "This property cannot be upgraded anymore.\n\r", ch ); return; } if ( ch->money < c ) { send_to_char("You don't have enough money to purchase an upgrade.\n\r", ch ); return; } send_to_char("\n\r\n\rEquipment up!\n\r", ch ); bld->value[5]++; ch->money -= c; return; } if ( val <= 0 || val > 175000 ) { send_to_char( "Invalid value.\n\rExample: range 6\n\r", ch ); return; } if ( type == 1 ) { if ( !str_prefix(arg,"range") ) { if ( bld->value[5]-(val*bld->value[7])>0 ) bld->value[6] = val; else send_to_char( "That's too far.\n\r", ch ); } else send_to_char( "This property cannot be modified.\n\r", ch ); } else if ( type == 2 ) { if ( !str_prefix(arg,"withdraw") ) { if ( val > bld->value[5] ) send_to_char( "You don't have that much money in the account.\n\r", ch ); else { if ( ch->money + val >= MAX_CASH ) val = MAX_CASH - ch->money; gain_money(ch,val); bld->value[5] -= val; send_to_char( "You withdraw the money.\n\r", ch ); } } else if ( !str_prefix(arg,"deposit") ) { if ( val > ch->money ) send_to_char( "You don't have that much to deposit.\n\r", ch ); else if ( bld->value[5] + val > 200000 ) send_to_char( "You can't have more than $50,000 in one bank account.\n\r", ch ); else { ch->money -= val; bld->value[5] += val; send_to_char( "Money deposited.\n\r", ch ); } } } else if ( type == 3 ) { } else send_to_char( "@@cYou cannot change anything in this building. Please type @@aDone@@c.\n\r", ch ); return; } void do_customize(CHAR_DATA *ch, char *argument) { BUILDING_DATA *bld = ch->in_building; if ( !ch->in_building || ch->in_building == NULL ) { send_to_char( "You must be inside a building to customize it.\n\r", ch ); return; } if ( !bld->owner || bld->owner != ch ) if ( !IS_IMMORTAL(ch) ) mreturn( "You are not allowed to upgrade this building.\n\r", ch ); ch->position = POS_CUSTOMIZE; show_building_cust(ch->in_building,ch); return; } long get_upgrade_cost(BUILDING_DATA *bld) { int c,i; if ( bld->level >= MAX_BUILDING_LEVEL ) return 0; if ( sysdata.killfest ) return 1; c = build_table[bld->type].cost; switch(bld->type) { case BUILDING_HQ: c = 3000; break; case BUILDING_PAWN_SHOP: c = 3000; break; } if ( c == 0 ) c = 10000; for(i=0;i<bld->level;i++ ) c *= 1.05; if ( bld->owner && has_ability(bld->owner,7) ) //Databank c *= 0.7; return c; } long get_upgrade2_cost(BUILDING_DATA *bld) { int c = 0; if ( bld->value[5] >= bld->value[0] ) return c; if ( sysdata.killfest ) return 1; c = 300*(bld->value[5]+1); if ( bld->owner && has_ability(bld->owner,7) ) //Databank c *= 0.7; return c; }