예제 #1
0
/* checks if your liberal activity is noticed */
void noticecheck(int exclude,int difficulty)
{
   if(sitealarm)return;

   char sneak=0;
   
   int topi=0;
   for(int i=0;i<6;++i)
   {
      if(activesquad->squad[i]&&
         activesquad->squad[i]->get_skill(SKILL_STEALTH)>sneak)
      {
         sneak=activesquad->squad[i]->get_skill(SKILL_STEALTH);
         topi=i;
      }
   }

   for(int e=0;e<ENCMAX;e++)
   {
      //Prisoners shouldn't shout for help.
      if(!strcmp(encounter[e].name,"Prisoner"))continue;
      
      if(e==exclude || encounter[e].exists==false)
         continue;
      else if(activesquad->squad[topi]->skill_check(SKILL_STEALTH,difficulty))
         continue;
      else
      {
         clearmessagearea();

         set_color(COLOR_RED,COLOR_BLACK,1);
         move(16,1);
         addstr(encounter[e].name, gamelog);
         addstr(" observes your Liberal activity ", gamelog);
         move(17,1);
         if(encounter[e].align==ALIGN_CONSERVATIVE)
            addstr("and lets forth a piercing Conservative alarm cry!", gamelog);
         else
            addstr("and shouts for help!", gamelog);
         gamelog.newline();
         
         sitealarm=1;


         refresh();
         getch();
         break;
      }
   }
}
예제 #2
0
/* haul dead/paralyzed */
void squadgrab_immobile(char dead) {
    int p;
    //DRAGGING PEOPLE OUT IF POSSIBLE
    int hostslots = 0;

    for(p = 0; p < 6; p++) {
        if(activesquad->squad[p] != NULL) {
            if(activesquad->squad[p]->alive &&
                    (activesquad->squad[p]->canwalk() ||
                     (activesquad->squad[p]->flag & CREATUREFLAG_WHEELCHAIR)) &&
                    activesquad->squad[p]->prisoner == NULL)
                hostslots++;
            else if((!activesquad->squad[p]->alive ||
                     (!activesquad->squad[p]->canwalk() &&
                      !(activesquad->squad[p]->flag & CREATUREFLAG_WHEELCHAIR))) &&
                    activesquad->squad[p]->prisoner != NULL) {
                clearmessagearea();
                set_color(COLOR_YELLOW, COLOR_BLACK, 1);
                move(16, 1);
                addstr(activesquad->squad[p]->name, gamelog);
                addstr(" can no longer handle ", gamelog);
                addstr(activesquad->squad[p]->prisoner->name, gamelog);
                addstr(".", gamelog);
                gamelog.newline(); //New line.
                refresh();
                getch();

                freehostage(*activesquad->squad[p]->prisoner, 1);
            }
        }
    }

    for(p = 5; p >= 0; p--) {
        if(activesquad->squad[p] != NULL) {
            if((!activesquad->squad[p]->alive && dead) ||
                    (activesquad->squad[p]->alive &&
                     !(activesquad->squad[p]->flag & CREATUREFLAG_WHEELCHAIR) &&
                     !activesquad->squad[p]->canwalk() && !dead)) {
                if(hostslots == 0) {
                    if(!activesquad->squad[p]->alive) {
                        clearmessagearea();
                        set_color(COLOR_YELLOW, COLOR_BLACK, 1);
                        move(16, 1);
                        addstr("Nobody can carry Martyr ", gamelog);
                        addstr(activesquad->squad[p]->name, gamelog);
                        addstr(".", gamelog);
                        gamelog.newline();

                        //DROP LOOT
                        makeloot(*activesquad->squad[p], groundloot);

                        //MUST DELETE PARTY MEMBER FROM POOL COMPLETELY
                        //(that may not be the case any longer -jds)
                        for(int pl = 0; pl < (int)pool.size(); pl++) {
                            if(pool[pl] == activesquad->squad[p]) {
                                pool[pl]->die();
                                pool[pl]->location = -1;
                                //delete_and_remove(pool,pl);
                                break;
                            }
                        }

                        //Check if that was the last living squad member.
                        //bool squad_dead = true;
                        for(int i = 5; i >= 0; --i) {
                            //This check to make sure we don't look at nonexistent
                            //data, causing segfaults and the like.
                            if(activesquad->squad[i] != NULL) {
                                //Check if alive.
                                if(activesquad->squad[i]->alive) {
                                    //IT LIVES! Squad is not dead.
                                    //squad_dead = false;
                                    break; //No reason to continue
                                }
                            }
                        }
                    } else {
                        clearmessagearea();
                        set_color(COLOR_YELLOW, COLOR_BLACK, 1);
                        move(16, 1);
                        addstr(activesquad->squad[p]->name, gamelog);
                        addstr(" is left to be captured.", gamelog);
                        gamelog.newline(); //New line.

                        capturecreature(*activesquad->squad[p]);
                    }
                } else {
                    for(int p2 = 0; p2 < 6; p2++) {
                        if(p2 == p)
                            continue;

                        if(activesquad->squad[p2] != NULL) {
                            if(activesquad->squad[p2]->alive &&
                                    (activesquad->squad[p2]->canwalk() ||
                                     (activesquad->squad[p2]->flag & CREATUREFLAG_WHEELCHAIR)) &&
                                    activesquad->squad[p2]->prisoner == NULL) {
                                activesquad->squad[p2]->prisoner = activesquad->squad[p];

                                clearmessagearea();
                                set_color(COLOR_YELLOW, COLOR_BLACK, 1);
                                move(16, 1);
                                addstr(activesquad->squad[p2]->name, gamelog);
                                addstr(" hauls ", gamelog);
                                addstr(activesquad->squad[p]->name, gamelog);
                                addstr(".", gamelog);
                                gamelog.newline(); //New line.
                                break;
                            }
                        }
                    }

                    hostslots--;
                }

                //SHUFFLE SQUAD
                char flipstart = 0;

                for(int pt = 0; pt < 6; pt++) {
                    if(pt == p - 1)
                        continue;

                    if(pt == p)
                        flipstart = 1;

                    if(flipstart && pt < 5)
                        activesquad->squad[pt] = activesquad->squad[pt + 1];
                }

                if(flipstart)
                    activesquad->squad[5] = NULL;

                printparty();
                refresh();
                getch();
            }
        }
    }
}
예제 #3
0
/* hostage freed due to host unable to haul */
void freehostage(Creature &cr, char situation) {
    if(cr.prisoner == NULL)
        return;

    if(cr.prisoner->alive) {
        if(situation == 0) {
            if(cr.prisoner->squadid == -1)
                addstr(" and a hostage is freed", gamelog);
            else {
                addstr(" and ", gamelog);
                addstr(cr.prisoner->name, gamelog);

                if(cr.prisoner->flag & CREATUREFLAG_JUSTESCAPED)
                    addstr(" is recaptured", gamelog);
                else
                    addstr(" is captured", gamelog);
            }

            gamelog.newline(); //New line.
        } else if(situation == 1) {
            clearmessagearea();
            set_color(COLOR_WHITE, COLOR_BLACK, 1);
            move(16, 1);

            if(cr.prisoner->squadid == -1)
                addstr("A hostage escapes!", gamelog);
            else {
                addstr(cr.prisoner->name, gamelog);

                if(cr.prisoner->flag & CREATUREFLAG_JUSTESCAPED)
                    addstr(" is recaptured.", gamelog);
                else
                    addstr(" is captured.", gamelog);
            }

            gamelog.newline(); //New line.
        } else if(situation == 2) {
            //Don't print anything.
        }

        if(cr.prisoner->squadid == -1) {
            for(int e = 0; e < ENCMAX; e++) {
                if(encounter[e].exists == 0) {
                    encounter[e] = *cr.prisoner;
                    encounter[e].exists = 1;
                    conservatise(encounter[e]);
                    break;
                }
            }

            delete cr.prisoner;
        } else
            capturecreature(*cr.prisoner);
    } else {
        if(cr.prisoner->squadid != -1) {
            //MUST DELETE PARTY MEMBER FROM POOL COMPLETELY
            //(That may not be the case any longer -jds)
            for(int pl = 0; pl < (int)pool.size(); pl++) {
                if(pool[pl] == cr.prisoner) {
                    removesquadinfo(*pool[pl]);
                    pool[pl]->die();
                    pool[pl]->location = -1;
                    //delete_and_remove(pool,pl);
                    break;
                }
            }
        }
    }

    cr.prisoner = NULL;

    if(situation == 1) {
        printparty();

        if(mode == GAMEMODE_CHASECAR ||
                mode == GAMEMODE_CHASEFOOT)
            printchaseencounter();
        else
            printencounter();

        refresh();
        getch();
    }
}
예제 #4
0
/* prompt after you've said you want to kidnap someone */
void kidnapattempt(void) {
    short kidnapper = -1;

    party_status = -1;

    int available = 0;
    char availslot[6] = {0, 0, 0, 0, 0, 0};

    for(int p = 0; p < 6; p++) {
        if(activesquad->squad[p] != NULL) {
            if(activesquad->squad[p]->alive && activesquad->squad[p]->prisoner == NULL) {
                available++;
                availslot[p] = 1;
            }
        }
    }

    if(!available) {
        set_color(COLOR_WHITE, COLOR_BLACK, 1);
        move(16, 1);
        addstr("No one can do the job.            ");
        move(17, 1);
        addstr("                                  ");

        refresh();
        getch();

        return;
    }

    do {
        printparty();

        move(8, 20);
        set_color(COLOR_WHITE, COLOR_BLACK, 1);
        addstr("Choose a Liberal squad member to do the job.");

        refresh();

        int c = getch();
        translategetch(c);

        if(c == 10 || c == ESC)
            return;

        if(c >= '1' && c <= '6') {
            if(availslot[c - '1']) {
                kidnapper = c - '1';
                break;
            }
        }

    } while(1);

    if(kidnapper >= 0) {
        vector<int> target;

        for(int e = 0; e < ENCMAX; e++) {
            if(encounter[e].exists && encounter[e].alive && encounter[e].align == -1 &&
                    (encounter[e].animalgloss == ANIMALGLOSS_NONE || law[LAW_ANIMALRESEARCH] == 2)) {
                if((encounter[e].get_weapon().protects_against_kidnapping() &&
                        encounter[e].blood > 20) || encounter[e].animalgloss == ANIMALGLOSS_TANK)
                    continue;

                target.push_back(e);
            }
        }

        if(target.size() > 0) {
            int t = target[0];

            if(target.size() > 1) {
                do {
                    clearcommandarea();
                    clearmessagearea();
                    clearmaparea();

                    set_color(COLOR_WHITE, COLOR_BLACK, 1);
                    move(9, 1);
                    addstr("Kidnap whom?");

                    int x = 1, y = 11;

                    for(int t2 = 0; t2 < (int)target.size(); t2++) {
                        move(y, x);
                        addch(t2 + 'A');
                        addstr(" - ");
                        addstr(encounter[target[t2]].name);

                        y++;

                        if(y == 17) {
                            y = 11;
                            x += 30;
                        }
                    }

                    refresh();
                    int c = getch();
                    translategetch(c);

                    if(c >= 'a' && c <= 'z') {
                        t = c - 'a';

                        if(t >= (int)target.size())
                            t = -1;
                        else
                            t = target[t];

                        break;
                    }

                    if(c == 10 || c == ESC || c == 32) {
                        t = -1;
                        break;
                    }
                } while(1);
            }

            if(t != -1) {
                char amateur = 0;

                if(kidnap(*activesquad->squad[kidnapper], encounter[t], amateur)) {
                    delenc(t, 0);

                    int time = 20 + LCSrandom(10);

                    if(time < 1)
                        time = 1;

                    if(sitealarmtimer > time || sitealarmtimer == -1)
                        sitealarmtimer = time;
                } else
                    sitealarm = 1;

                if(amateur) {
                    char present = 0;

                    for(int e = 0; e < ENCMAX; e++) {
                        if(encounter[e].exists && encounter[e].alive) {
                            present = 1;
                            break;
                        }
                    }

                    if(present) {
                        alienationcheck(1);

                        if(!sitealarm)
                            sitealarm = 1;

                        sitecrime += 5;
                        criminalizeparty(LAWFLAG_KIDNAPPING);

                        if(activesquad->squad[kidnapper]->prisoner != NULL) {
                            if(activesquad->squad[kidnapper]->prisoner->type == CREATURE_RADIOPERSONALITY)
                                offended_amradio = 1;

                            if(activesquad->squad[kidnapper]->prisoner->type == CREATURE_NEWSANCHOR)
                                offended_cablenews = 1;
                        } else {
                            if(encounter[t].type == CREATURE_RADIOPERSONALITY)
                                offended_amradio = 1;

                            if(encounter[t].type == CREATURE_NEWSANCHOR)
                                offended_cablenews = 1;
                        }
                    }
                }

                if(sitealarm)
                    enemyattack();

                creatureadvance();
            }
        } else {
            set_color(COLOR_WHITE, COLOR_BLACK, 1);
            move(16, 1);
            addstr("All of the targets are too dangerous.                ");
            move(17, 1);
            addstr("                                                     ");

            refresh();
            getch();
        }
    } else {
        set_color(COLOR_WHITE, COLOR_BLACK, 1);
        move(16, 1);
        addstr("No one can do the job.                                  ");
        move(17, 1);
        addstr("                                                        ");

        refresh();
        getch();
    }
}
예제 #5
0
/* roll on the kidnap attempt and show the results */
char kidnap(Creature &a, Creature &t, char &amateur) {
    if(!a.get_weapon().can_take_hostages()) {
        amateur = 1;

        //BASIC ROLL
        int aroll = a.skill_roll(SKILL_HANDTOHAND);
        int droll = t.attribute_check(ATTRIBUTE_AGILITY, true);

        a.train(SKILL_HANDTOHAND, droll);

        clearmessagearea();

        //HIT!
        if(aroll > droll) {
            set_color(COLOR_WHITE, COLOR_BLACK, 1);
            move(16, 1);
            addstr(a.name, gamelog);
            addstr(" snatches ", gamelog);
            addstr(t.name, gamelog);
            addstr("!", gamelog);
            gamelog.newline(); //New line.

            a.prisoner = new Creature;
            *a.prisoner = t;

            refresh();
            getch();

            set_color(COLOR_RED, COLOR_BLACK, 1);
            move(17, 1);
            addstr(t.name, gamelog);
            addstr(" is struggling and screaming!", gamelog);
            gamelog.newline(); //New line.

            refresh();
            getch();

            gamelog.newline();
            return 1;
        } else {
            set_color(COLOR_MAGENTA, COLOR_BLACK, 1);
            move(16, 1);
            addstr(a.name, gamelog);
            addstr(" grabs at ", gamelog);
            addstr(t.name, gamelog);
            gamelog.newline(); //New line.
            move(17, 1);
            addstr("but ", gamelog);
            addstr(t.name, gamelog);
            addstr(" writhes away!", gamelog);
            gamelog.newline(); //New line.

            refresh();
            getch();


            gamelog.newline();
            return 0;
        }
    } else {
        clearmessagearea();

        set_color(COLOR_WHITE, COLOR_BLACK, 1);
        move(16, 1);
        addstr(a.name, gamelog);
        addstr(" shows ", gamelog);
        addstr(t.name, gamelog);
        addstr(" the ", gamelog);
        addstr(a.get_weapon().get_name(2).c_str(), gamelog);
        addstr(" ", gamelog);
        move(17, 1);
        addstr("and says, ", gamelog);
        set_color(COLOR_GREEN, COLOR_BLACK, 1);

        if(law[LAW_FREESPEECH] == -2)
            addstr("\"[Please], be cool.\"", gamelog);
        else
            addstr("\"Bitch, be cool.\"", gamelog);

        a.prisoner = new Creature;
        *a.prisoner = t;

        refresh();
        getch();

        gamelog.newline();
        return 1;
    }
}
/* run a tv broadcast */
char news_broadcast(void)
{
    sitealarm=1;
    int p;

    int enemy=0;
    for(int e=0; e<ENCMAX; e++)
    {
        if(encounter[e].exists&&encounter[e].alive)
        {
            if(encounter[e].align==-1)enemy++;
        }
    }

    if(enemy>0)
    {
        clearmessagearea();
        set_color(COLOR_WHITE,COLOR_BLACK,1);
        move(16,1);
        addstr("The Conservatives in the room hurry the Squad, so ", gamelog);
        move(17,1);
        addstr("the broadcast never happens.", gamelog);
        gamelog.newline();

        refresh();
        getch();
        return 0;
    }

    criminalizeparty(LAWFLAG_DISTURBANCE);

    clearmessagearea();
    set_color(COLOR_WHITE,COLOR_BLACK,1);
    move(16,1);
    addstr("The Squad steps in front of the cameras and ", gamelog);
    move(17,1);
    int viewhit=LCSrandom(VIEWNUM);
    switch(viewhit)
    {
    case VIEW_GAY:
        addstr("discusses homosexual rights.", gamelog);
        break;
    case VIEW_DEATHPENALTY:
        addstr("examines the death penalty.", gamelog);
        break;
    case VIEW_TAXES:
        addstr("discusses the tax code.", gamelog);
        break;
    case VIEW_NUCLEARPOWER:
        addstr("runs down nuclear power.", gamelog);
        break;
    case VIEW_ANIMALRESEARCH:
        addstr("discusses the horrors of animal research.", gamelog);
        break;
    case VIEW_POLICEBEHAVIOR:
        addstr("goes over cases of police brutality.", gamelog);
        break;
    case VIEW_TORTURE:
        addstr("discusses prisoner abuse and torture.", gamelog);
        break;
    case VIEW_PRISONS:
        addstr("discusses the prison system's flaws.", gamelog);
        break;
    case VIEW_INTELLIGENCE:
        addstr("debates privacy law.", gamelog);
        break;
    case VIEW_FREESPEECH:
        addstr("talks about free speech.", gamelog);
        break;
    case VIEW_GENETICS:
        addstr("discusses the implications of genetic research.", gamelog);
        break;
    case VIEW_JUSTICES:
        addstr("talks about the record of a Conservative judge.", gamelog);
        break;
    case VIEW_GUNCONTROL:
        addstr("talks about gun control.", gamelog);
        break;
    case VIEW_SWEATSHOPS:
        addstr("brings details about sweatshops to light.", gamelog);
        break;
    case VIEW_POLLUTION:
        addstr("does a show on industrial pollution.", gamelog);
        break;
    case VIEW_CORPORATECULTURE:
        addstr("jokes about corporate culture.", gamelog);
        break;
    case VIEW_CEOSALARY:
        addstr("gives examples of CEO excesses.", gamelog);
        break;
    case VIEW_WOMEN:
        addstr("discusses abortion.", gamelog);
        break;// "Performs an abortion live on the air."
    // Get [LAWFLAG_SPEECH], [LAWFLAG_MURDER], [LAWFLAG_DISTURBANCE] -- LK
    case VIEW_CIVILRIGHTS:
        addstr("debates affirmative action.", gamelog);
        break;
    case VIEW_DRUGS:
        addstr("has a frank talk about drugs.", gamelog);
        break;
    case VIEW_IMMIGRATION:
        addstr("examines the issue of immigration.", gamelog);
        break;
    case VIEW_MILITARY:
        addstr("talks about militarism in modern culture.", gamelog);
        break;
    case VIEW_AMRADIO:
        addstr("discusses other AM radio shows.", gamelog);
        break;
    case VIEW_CABLENEWS:
        addstr("talks about Cable News.", gamelog);
        break;
    case VIEW_LIBERALCRIMESQUAD:
        addstr("lets people know about the Liberal Crime Squad.", gamelog);
        break;
    default:
    case VIEW_LIBERALCRIMESQUADPOS:
        addstr("extols the virtues of the Liberal Crime Squad.", gamelog);
        break;
    case VIEW_CONSERVATIVECRIMESQUAD:
        addstr("demonizes the Conservative Crime Squad.", gamelog);
        break;
    }
    gamelog.newline();

    refresh();
    getch();

    int segmentpower=0;
    int usegmentpower;
    int partysize=0;
    for(p=0; p<6; p++)
    {
        if(activesquad->squad[p]!=NULL)
        {
            if(!activesquad->squad[p]->alive)continue;

            segmentpower+=activesquad->squad[p]->get_attribute(ATTRIBUTE_INTELLIGENCE,true);
            segmentpower+=activesquad->squad[p]->get_attribute(ATTRIBUTE_HEART,true);
            segmentpower+=activesquad->squad[p]->get_attribute(ATTRIBUTE_CHARISMA,true);
            segmentpower+=activesquad->squad[p]->get_skill(SKILL_MUSIC);
            segmentpower+=activesquad->squad[p]->get_skill(SKILL_RELIGION);
            segmentpower+=activesquad->squad[p]->get_skill(SKILL_SCIENCE);
            segmentpower+=activesquad->squad[p]->get_skill(SKILL_BUSINESS);
            segmentpower+=activesquad->squad[p]->get_skill(SKILL_PERSUASION);
            activesquad->squad[p]->train(SKILL_PERSUASION,50);
            partysize++;
        }
    }

    // LCS colors enhance the broadcast significantly
    if(activesquad->stance==SQUADSTANCE_BATTLECOLORS)
        segmentpower = (segmentpower * 3) / 2;

    int segmentbonus=segmentpower/4;
    if(partysize>1)segmentpower/=partysize;
    segmentpower+=segmentbonus;

    clearmessagearea();

    set_color(COLOR_WHITE,COLOR_BLACK,1);
    move(16,1);
    if(segmentpower<25)addstr("The Squad looks completely insane.", gamelog);
    else if(segmentpower<35)addstr("The show really sucks.", gamelog);
    else if(segmentpower<45)addstr("It is a very boring hour.", gamelog);
    else if(segmentpower<55)addstr("It is mediocre TV.", gamelog);
    else if(segmentpower<70)addstr("The show was all right.", gamelog);
    else if(segmentpower<85)addstr("The Squad put on a good show.", gamelog);
    else if(segmentpower<100)addstr("It was thought-provoking, even humorous.", gamelog);
    else addstr("It was the best hour of Cable TV EVER.", gamelog);
    gamelog.newline();

    refresh();
    getch();

    //CHECK PUBLIC OPINION
    change_public_opinion(VIEW_LIBERALCRIMESQUAD,10);
    change_public_opinion(VIEW_LIBERALCRIMESQUADPOS,(segmentpower-50)/10);
    if(viewhit!=VIEW_LIBERALCRIMESQUAD)change_public_opinion(viewhit,(segmentpower-50)/5,1);
    else change_public_opinion(viewhit,segmentpower/10);

    //PRISONER PARTS
    for(p=0; p<6; p++)
    {
        if(activesquad->squad[p]!=NULL)
        {
            if(activesquad->squad[p]->prisoner!=NULL && activesquad->squad[p]->prisoner->alive)
            {
                if(activesquad->squad[p]->prisoner->type==CREATURE_NEWSANCHOR)
                {
                    viewhit=LCSrandom(VIEWNUM);
                    clearmessagearea();

                    set_color(COLOR_WHITE,COLOR_BLACK,1);
                    move(16,1);
                    addstr("The hostage ", gamelog);
                    addstr(activesquad->squad[p]->prisoner->name, gamelog);
                    addstr(" is forced on to ", gamelog);
                    move(17,1);
                    switch(viewhit)
                    {
                    case VIEW_GAY:
                        addstr("discuss homosexual rights.", gamelog);
                        break;
                    case VIEW_DEATHPENALTY:
                        addstr("examine the death penalty.", gamelog);
                        break;
                    case VIEW_TAXES:
                        addstr("discuss the tax code.", gamelog);
                        break;
                    case VIEW_NUCLEARPOWER:
                        addstr("run down nuclear power.", gamelog);
                        break;
                    case VIEW_ANIMALRESEARCH:
                        addstr("discuss the horrors of animal research.", gamelog);
                        break;
                    case VIEW_POLICEBEHAVIOR:
                        addstr("go over cases of police brutality.", gamelog);
                        break;
                    case VIEW_TORTURE:
                        addstr("discuss prisoner abuse and torture.", gamelog);
                        break;
                    case VIEW_PRISONS:
                        addstr("discusses the prison system's flaws.", gamelog);
                        break;
                    case VIEW_INTELLIGENCE:
                        addstr("debate privacy law.", gamelog);
                        break;
                    case VIEW_FREESPEECH:
                        addstr("talk about free speech.", gamelog);
                        break;
                    case VIEW_GENETICS:
                        addstr("discuss the implications of genetic research.", gamelog);
                        break;
                    case VIEW_JUSTICES:
                        addstr("talk about the record of a Conservative judge.", gamelog);
                        break;
                    case VIEW_GUNCONTROL:
                        addstr("talk about gun control.", gamelog);
                        break;
                    case VIEW_SWEATSHOPS:
                        addstr("bring details about sweatshops to light.", gamelog);
                        break;
                    case VIEW_POLLUTION:
                        addstr("do a show on industrial pollution.", gamelog);
                        break;
                    case VIEW_CORPORATECULTURE:
                        addstr("joke about corporate culture.", gamelog);
                        break;
                    case VIEW_CEOSALARY:
                        addstr("give examples of CEO excesses.", gamelog);
                        break;
                    case VIEW_WOMEN:
                        addstr("discuss abortion.", gamelog);
                        break;// "Performs an abortion live on the air."
                    // Get [LAWFLAG_SPEECH], [LAWFLAG_MURDER], [LAWFLAG_DISTURBANCE] -- LK
                    case VIEW_CIVILRIGHTS:
                        addstr("debate affirmative action.", gamelog);
                        break;
                    case VIEW_DRUGS:
                        addstr("have a frank talk about drugs.", gamelog);
                        break;
                    case VIEW_IMMIGRATION:
                        addstr("examine the issue of immigration.", gamelog);
                        break;
                    case VIEW_MILITARY:
                        addstr("talk about militarism in modern culture.", gamelog);
                        break;
                    case VIEW_AMRADIO:
                        addstr("discuss other AM radio shows.", gamelog);
                        break;
                    case VIEW_CABLENEWS:
                        addstr("talk about Cable News.", gamelog);
                        break;
                    case VIEW_LIBERALCRIMESQUAD:
                        addstr("let people know about the Liberal Crime Squad.", gamelog);
                        break;
                    default:
                    case VIEW_LIBERALCRIMESQUADPOS:
                        addstr("extol the virtues of the Liberal Crime Squad.", gamelog);
                        break;
                    case VIEW_CONSERVATIVECRIMESQUAD:
                        addstr("demonize the Conservative Crime Squad.", gamelog);
                        break;
                    }
                    gamelog.newline();

                    usegmentpower=10; //FAME BONUS
                    usegmentpower+=activesquad->squad[p]->prisoner->get_attribute(ATTRIBUTE_INTELLIGENCE,true);
                    usegmentpower+=activesquad->squad[p]->prisoner->get_attribute(ATTRIBUTE_HEART,true);
                    usegmentpower+=activesquad->squad[p]->prisoner->get_attribute(ATTRIBUTE_CHARISMA,true);
                    usegmentpower+=activesquad->squad[p]->prisoner->get_skill(SKILL_PERSUASION);

                    if(viewhit!=VIEW_LIBERALCRIMESQUAD)change_public_opinion(viewhit,(usegmentpower-10)/2);
                    else change_public_opinion(viewhit,usegmentpower/2,1);

                    segmentpower+=usegmentpower;

                    refresh();
                    getch();
                }
                else
                {
                    clearmessagearea();

                    set_color(COLOR_WHITE,COLOR_BLACK,1);
                    move(16,1);
                    addstr(activesquad->squad[p]->prisoner->name, gamelog);
                    addstr(", the hostage, is kept off-air.", gamelog);
                    gamelog.newline();

                    refresh();
                    getch();
                }
            }
        }
    }

    if(sitealienate>=1&&segmentpower>=40)
    {
        sitealienate=0;

        clearmessagearea();

        set_color(COLOR_WHITE,COLOR_BLACK,1);
        move(16,1);
        addstr("Moderates at the station appreciated the show.", gamelog);
        gamelog.newline();
        move(17,1);
        addstr("They no longer feel alienated.", gamelog);
        gamelog.newline();

        refresh();
        getch();
    }

    //POST - SECURITY BLITZ IF IT SUCKED
    if(segmentpower<85 && segmentpower>=25)
    {
        clearmessagearea();

        set_color(COLOR_WHITE,COLOR_BLACK,1);
        move(16,1);
        addstr("Security is waiting for the Squad ", gamelog);
        move(17,1);
        addstr("after the show!", gamelog);
        gamelog.newline();

        refresh();
        getch();

        int numleft=LCSrandom(8)+2;
        for(int e=0; e<ENCMAX; e++)
        {
            if(!encounter[e].exists)
            {
                makecreature(encounter[e],CREATURE_SECURITYGUARD);
                numleft--;
            }
            if(numleft==0)break;
        }
    }
    else
    {
        clearmessagearea();

        set_color(COLOR_WHITE,COLOR_BLACK,1);
        move(16,1);
        addstr("The show was so ", gamelog);
        if(segmentpower<50)
            addstr("hilarious", gamelog);
        else
            addstr("entertaining", gamelog);
        addstr(" that security watched it ", gamelog);
        move(17,1);
        addstr("at their desks.  The Squad might yet escape.", gamelog);
        gamelog.newline();

        refresh();
        getch();
    }

    return 1;
}
/* computer hack attempt */
char hack(short type,char &actual)
{
    int difficulty=0;
    int p;

    switch(type)
    {
    case HACK_SUPERCOMPUTER:
        difficulty=DIFFICULTY_HEROIC;
        break;
    case HACK_VAULT:
        difficulty=DIFFICULTY_CHALLENGING;
        break;
    }

    int maxattack=0;
    char blind=0;
    int hacker = -1;

    for(p=0; p<6; p++)
    {
        if(activesquad->squad[p]!=NULL)
        {
            if(activesquad->squad[p]->alive && activesquad->squad[p]->get_skill(SKILL_COMPUTERS))
            {
                int roll = activesquad->squad[p]->skill_roll(SKILL_COMPUTERS);
                if(roll>maxattack)
                {
                    if(!activesquad->squad[p]->special[SPECIALWOUND_RIGHTEYE]&&
                            !activesquad->squad[p]->special[SPECIALWOUND_LEFTEYE])
                    {
                        blind=1;
                    }
                    else
                    {
                        maxattack = roll;
                        hacker = p;
                    }
                }
            }
        }
    }

    if(hacker > -1)
    {
        activesquad->squad[hacker]->train(SKILL_COMPUTERS,difficulty);

        if(maxattack>difficulty)
        {
            clearmessagearea();
            set_color(COLOR_WHITE,COLOR_BLACK,1);
            move(16,1);
            addstr(activesquad->squad[hacker]->name, gamelog);
            switch(type)
            {
            case HACK_SUPERCOMPUTER:
                addstr(" has burned a disk of top secret files!", gamelog);
                break;
            case HACK_VAULT:
                addstr(" has disabled the second layer of security!", gamelog);
                break;
            }
            gamelog.newline();
            refresh();
            getch();

            actual=1;
            return 1;
        }
        else
        {
            clearmessagearea();
            set_color(COLOR_WHITE,COLOR_BLACK,1);
            move(16,1);
            addstr(activesquad->squad[hacker]->name, gamelog);
            switch(type)
            {
            case HACK_SUPERCOMPUTER:
                addstr(" couldn't bypass the supercomputer security.", gamelog);
                break;
            case HACK_VAULT:
                addstr(" couldn't bypass the vault's electronic lock.", gamelog);
                break;
            }
            gamelog.newline();
            refresh();
            getch();

            actual=1;
            return 0;
        }
    }
    else
    {
        clearmessagearea();
        set_color(COLOR_WHITE,COLOR_BLACK,1);
        move(16,1);
        addstr("You can't find anyone to do the job.", gamelog);
        gamelog.newline();
        if(blind)
        {
            // Screen readers FTW. Honestly, it should just be a handicap
            //        instead of an impossibility, just make the chances
            //        much, much less.
            //                        -- LK
            refresh();
            getch();
            move(17,1);
            addstr("Including the BLIND HACKER you brought.", gamelog);
            gamelog.newline();
        }
        refresh();
        getch();
    }

    actual=0;
    return 0;
}
/* unlock attempt */
char unlock(short type,char &actual)
{
    int p;
    int difficulty=0;

    switch(type)
    {
    case UNLOCK_DOOR:
        if(securityable(location[cursite]->type) == 1)
            difficulty=DIFFICULTY_CHALLENGING;
        else if(securityable(location[cursite]->type) > 1)
            difficulty=DIFFICULTY_HARD;
        else
            difficulty=DIFFICULTY_EASY;
        break;
    case UNLOCK_CAGE:
        difficulty=DIFFICULTY_VERYEASY;
        break;
    case UNLOCK_CAGE_HARD:
        difficulty=DIFFICULTY_AVERAGE;
        break;
    case UNLOCK_CELL:
        difficulty=DIFFICULTY_FORMIDABLE;
        break;
    case UNLOCK_ARMORY:
        difficulty=DIFFICULTY_HEROIC;
        break;
    case UNLOCK_SAFE:
        difficulty=DIFFICULTY_HEROIC;
        break;
    case UNLOCK_VAULT:
        difficulty=DIFFICULTY_HEROIC;
        break;
    }

    int maxattack=-1;

    for(p=0; p<6; p++)
    {
        if(activesquad->squad[p]!=NULL)
        {
            if(activesquad->squad[p]->alive)
            {
                if(activesquad->squad[p]->get_skill(SKILL_SECURITY)>maxattack)
                {
                    maxattack=activesquad->squad[p]->get_skill(SKILL_SECURITY);
                }
            }
        }
    }

    vector<int> goodp;

    for(p=0; p<6; p++)
    {
        if(activesquad->squad[p]!=NULL)
        {
            if(activesquad->squad[p]->alive)
            {
                if(activesquad->squad[p]->get_skill(SKILL_SECURITY)==maxattack)
                {
                    goodp.push_back(p);
                }
            }
        }
    }

    if(goodp.size()>0)
    {
        int p=goodp[LCSrandom(goodp.size())];

        //lock pick succeeded.
        if(activesquad->squad[p]->skill_check(SKILL_SECURITY,difficulty))
        {
            //skill goes up in proportion to the chance of you failing.
            if(maxattack<=difficulty)
            {
                activesquad->squad[p]->train(SKILL_SECURITY,1+(difficulty-maxattack));
            }
            clearmessagearea(false);
            set_color(COLOR_WHITE,COLOR_BLACK,1);
            move(16,1);
            addstr(activesquad->squad[p]->name, gamelog);
            addstr(" ", gamelog);
            switch(type)
            {
            case UNLOCK_DOOR:
                addstr("unlocks the door", gamelog);
                break;
            case UNLOCK_CAGE_HARD:
            case UNLOCK_CAGE:
                addstr("unlocks the cage", gamelog);
                break;
            case UNLOCK_SAFE:
                addstr("cracks the safe", gamelog);
                break;
            case UNLOCK_ARMORY:
                addstr("opens the armory", gamelog);
                break;
            case UNLOCK_CELL:
                addstr("unlocks the cell", gamelog);
                break;
            case UNLOCK_VAULT:
                addstr("cracks the combo locks", gamelog);
                break;
            }
            addstr("!", gamelog);
            gamelog.newline();
            for(int j=0; j<6; j++) //If people witness a successful unlock, they learn a little bit.
            {
                if(j==p) continue;
                if(activesquad->squad[j]!=NULL&&
                        activesquad->squad[j]->alive&&
                        activesquad->squad[j]->get_skill(SKILL_SECURITY)<difficulty)
                {
                    if(activesquad->squad[j]->alive)
                    {
                        activesquad->squad[j]->train(SKILL_SECURITY,difficulty-activesquad->squad[j]->get_skill(SKILL_SECURITY));
                    }
                }
            }

            refresh();
            getch();

            actual=1;
            return 1;
        }
        else
        {
            clearmessagearea(false);
            set_color(COLOR_WHITE,COLOR_BLACK,1);
            move(16,1);

            int i;
            //gain some experience for failing only if you could have succeeded.
            for (i = 0; i < 3; i++)
            {
                if(activesquad->squad[p]->skill_check(SKILL_SECURITY,difficulty))
                {
                    activesquad->squad[p]->train(SKILL_SECURITY,10);

                    addstr(activesquad->squad[p]->name, gamelog);
                    addstr(" is close, but can't quite get the lock open.", gamelog);
                    gamelog.newline();
                    break;
                }
            }

            if (i == 3)
            {
                addstr(activesquad->squad[p]->name, gamelog);
                addstr(" can't figure the lock out.", gamelog);
                gamelog.newline();
            }
            refresh();
            getch();

            actual=1;
            return 0;
        }
    }
    else
    {
        clearmessagearea();
        set_color(COLOR_WHITE,COLOR_BLACK,1);
        move(16,1);
        addstr("You can't find anyone to do the job.", gamelog);
        gamelog.newline();
        refresh();
        getch();
    }

    actual=0;
    return 0;
}
/* bash attempt */
char bash(short type,char &actual)
{
    int difficulty=0;
    char crowable=0;
    int p = 0;

    switch(type)
    {
    case BASH_DOOR:
        if(!securityable(location[cursite]->type))
        {
            difficulty=DIFFICULTY_EASY; // Run down dump
            crowable=1;
        }
        else if(location[cursite]->type!=SITE_GOVERNMENT_PRISON&&
                location[cursite]->type!=SITE_GOVERNMENT_INTELLIGENCEHQ)
        {
            difficulty=DIFFICULTY_CHALLENGING; // Respectable place
            crowable=1;
        }
        else
        {
            difficulty=DIFFICULTY_FORMIDABLE; // Very high security
            crowable=0;
        }
        break;
    }

    if(crowable)
    {
        //if(!squadhasitem(*activesquad,ITEM_WEAPON,WEAPON_CROWBAR))
        //{
        crowable=0;

        for(int p=0; p<6; p++)
        {
            if(activesquad->squad[p]!=NULL)
            {
                if (activesquad->squad[p]->get_weapon().auto_breaks_locks())
                    crowable = 1;
            }
        }

        if(!crowable) //didn't find in hands of any squad member
        {
            for(int l=0; l<(int)activesquad->loot.size(); l++)
            {
                if(activesquad->loot[l]->is_weapon())
                {
                    Weapon *w = static_cast<Weapon*>(activesquad->loot[l]); //cast -XML
                    if (w->auto_breaks_locks())
                        crowable = 1;
                }
            }
        }
        //}
    }

    int maxattack=0, maxp=0;

    if(!crowable)
    {
        for(p=0; p<6; p++)
        {
            if(activesquad->squad[p]!=NULL)
            {
                if(activesquad->squad[p]->alive)
                {
                    if(activesquad->squad[p]->get_attribute(ATTRIBUTE_STRENGTH,true)*
                            activesquad->squad[p]->get_weapon().get_bashstrengthmod()>maxattack)
                    {
                        maxattack=static_cast<int>(activesquad->squad[p]->get_attribute(ATTRIBUTE_STRENGTH,true)*
                                                   activesquad->squad[p]->get_weapon().get_bashstrengthmod());
                        maxp = p;
                    }
                }
            }
        }
    }

    difficulty = static_cast<int>(difficulty/activesquad->squad[maxp]->get_weapon().get_bashstrengthmod());

    if(crowable||activesquad->squad[maxp]->attribute_check(ATTRIBUTE_STRENGTH,difficulty))
    {
        clearmessagearea(false);
        set_color(COLOR_WHITE,COLOR_BLACK,1);
        move(16,1);
        addstr(activesquad->squad[maxp]->name, gamelog);
        addstr(" ", gamelog);
        switch(type)
        {
        case BASH_DOOR:
            if(crowable)
                addstr("uses a crowbar on the door", gamelog);
            else if(activesquad->squad[maxp]->get_weapon().get_bashstrengthmod()>1)
                addstr("smashes in the door", gamelog);
            else if(activesquad->squad[maxp]->flag&CREATUREFLAG_WHEELCHAIR)
                addstr("rams open the door", gamelog);
            else
                addstr("kicks in the door", gamelog);
            break;
        }
        addstr("!", gamelog);
        gamelog.newline();
        refresh();
        getch();

        int timer = 5;
        if(crowable)
            timer = 20;

        if(sitealarmtimer<0 || sitealarmtimer>timer)
            sitealarmtimer=timer;
        else
            sitealarmtimer=0;

        //Bashing doors in secure areas sets off alarms
        if((location[cursite]->type==SITE_GOVERNMENT_PRISON ||
                location[cursite]->type==SITE_GOVERNMENT_INTELLIGENCEHQ) &&
                sitealarm==0)
        {
            sitealarm=1;
            move(17,1);
            set_color(COLOR_RED,COLOR_BLACK,1);
            addstr("Alarms go off!", gamelog);
            gamelog.newline();
            refresh();
            getch();
        }

        actual=1;
        return 1;
    }
    else
    {
        clearmessagearea(false);
        set_color(COLOR_WHITE,COLOR_BLACK,1);
        move(16,1);
        addstr(activesquad->squad[maxp]->name, gamelog);
        switch(type)
        {
        case BASH_DOOR:
            if(activesquad->squad[maxp]->flag&CREATUREFLAG_WHEELCHAIR)
                addstr(" rams into the door", gamelog);
            else
                addstr(" kicks the door", gamelog);
            break;
        }
        addstr("!", gamelog);
        gamelog.newline();
        refresh();
        getch();

        if(sitealarmtimer<0)
            sitealarmtimer=25;
        else if(sitealarmtimer>10)
            sitealarmtimer-=10;
        else
            sitealarmtimer=0;

        actual=1;
        return 0;
    }

    actual=0;
    return 0;
}
/* rescues people held at the activeparty's current location */
void partyrescue(short special)
{
    int freeslots=0;
    int p, pl;
    for(p=0; p<6; p++)
    {
        if(activesquad->squad[p]==NULL)freeslots++;
    }
    int hostslots=0;
    for(p=0; p<6; p++)
    {
        if(activesquad->squad[p]!=NULL)
        {
            if(activesquad->squad[p]->alive&&activesquad->squad[p]->prisoner==NULL)
            {
                hostslots++;
            }
        }
    }

    vector<Creature*> waiting_for_rescue;
    for(pl=0; pl<(int)pool.size(); pl++)
    {
        if(pool[pl]->location==cursite&&
                !(pool[pl]->flag & CREATUREFLAG_SLEEPER)&&
                !(special==SPECIAL_PRISON_CONTROL_LOW&&!(pool[pl]->sentence>0&&!pool[pl]->deathpenalty))&& //Low is for normal time-limited sentences.
                !(special==SPECIAL_PRISON_CONTROL_MEDIUM&&!(pool[pl]->sentence<0&&!pool[pl]->deathpenalty))&& //Medium is for life sentences.
                !(special==SPECIAL_PRISON_CONTROL_HIGH&&!pool[pl]->deathpenalty)) //High is for death sentences.
            waiting_for_rescue.push_back(pool[pl]);
    }

    for(pl=0; pl<(int)waiting_for_rescue.size(); pl++)
    {
        if(LCSrandom(2)&&freeslots)
        {
            for(int p=0; p<6; p++)
            {
                if(activesquad->squad[p]==NULL)
                {
                    activesquad->squad[p]=waiting_for_rescue[pl];
                    activesquad->squad[p]->squadid=activesquad->id;
                    criminalize(*activesquad->squad[p],LAWFLAG_ESCAPED);
                    activesquad->squad[p]->flag|=CREATUREFLAG_JUSTESCAPED;
                    break;
                }
            }
            hostslots++;
            freeslots--;

            clearmessagearea();

            set_color(COLOR_WHITE,COLOR_BLACK,1);
            move(16,1);
            addstr("You've rescued ", gamelog);
            addstr(waiting_for_rescue[pl]->name, gamelog);
            addstr(" from the Conservatives.", gamelog);
            gamelog.newline();

            printparty();
            refresh();
            getch();

            waiting_for_rescue[pl]->location=-1;
            waiting_for_rescue[pl]->base=activesquad->squad[0]->base;

            waiting_for_rescue.erase(waiting_for_rescue.begin()+pl);
            --pl;
        }
    }
    for(pl=0; pl<(int)waiting_for_rescue.size(); pl++)
    {
        if(hostslots)
        {
            for(int p=0; p<6; p++)
            {
                if(activesquad->squad[p]!=NULL)
                {
                    if(activesquad->squad[p]->alive&&activesquad->squad[p]->prisoner==NULL)
                    {
                        activesquad->squad[p]->prisoner=waiting_for_rescue[pl];
                        waiting_for_rescue[pl]->squadid=activesquad->id;
                        criminalize(*waiting_for_rescue[pl],LAWFLAG_ESCAPED);
                        waiting_for_rescue[pl]->flag|=CREATUREFLAG_JUSTESCAPED;

                        clearmessagearea();

                        set_color(COLOR_WHITE,COLOR_BLACK,1);
                        move(16,1);
                        addstr("You've rescued ", gamelog);
                        addstr(waiting_for_rescue[pl]->name, gamelog);
                        addstr(" from the Conservatives.", gamelog);
                        gamelog.newline();

                        refresh();
                        getch();

                        clearmessagearea();
                        move(16,1);
                        addstr(waiting_for_rescue[pl]->name, gamelog);
                        addstr(" ", gamelog);
                        switch(LCSrandom(3))
                        {
                        case 0:
                            addstr("was tortured recently ", gamelog);
                            break;
                        case 1:
                            addstr("was beaten severely yesterday ", gamelog);
                            break;
                        case 2:
                            addstr("was on a hunger strike ", gamelog);
                            break;
                        }
                        move(17,1);
                        addstr("so ", gamelog);
                        addstr(activesquad->squad[p]->name, gamelog);
                        addstr(" will have to haul a Liberal.", gamelog);
                        gamelog.newline();

                        waiting_for_rescue[pl]->location=-1;
                        waiting_for_rescue[pl]->base=activesquad->squad[p]->base;

                        printparty();
                        refresh();
                        getch();

                        waiting_for_rescue.erase(waiting_for_rescue.begin()+pl);
                        --pl;
                        break;
                    }
                }
            }

            hostslots--;
        }
        if(!hostslots)break;
    }

    if(waiting_for_rescue.size()==1)
    {
        clearmessagearea();
        set_color(COLOR_YELLOW,COLOR_BLACK,1);
        move(16,1);
        addstr("There's nobody left to carry ", gamelog);
        addstr(waiting_for_rescue[0]->name, gamelog);
        addstr(".", gamelog);
        gamelog.newline();
        set_color(COLOR_WHITE,COLOR_BLACK,1);
        move(17,1);
        addstr("You'll have to come back later.", gamelog);
        gamelog.newline();
        refresh();
        getch();
    }
    else if(waiting_for_rescue.size()>1)
    {
        clearmessagearea();
        set_color(COLOR_YELLOW,COLOR_BLACK,1);
        move(16,1);
        addstr("There's nobody left to carry the others.", gamelog);
        gamelog.newline();
        set_color(COLOR_WHITE,COLOR_BLACK,1);
        move(17,1);
        addstr("You'll have to come back later.", gamelog);
        gamelog.newline();
        refresh();
        getch();
    }
}
예제 #11
0
/* computer hack attempt */
char hack(short type,char &actual)
{
   int difficulty=0;
   int p;

   switch(type)
   {
   case HACK_SUPERCOMPUTER:difficulty=DIFFICULTY_HEROIC;break;
   case HACK_VAULT:difficulty=DIFFICULTY_CHALLENGING;break;
   }

   int maxattack=0,maxblindattack=-3,hacker=-1,blind=-1;

   for(p=0;p<6;p++) if(activesquad->squad[p]!=NULL)
      if(activesquad->squad[p]->alive && activesquad->squad[p]->get_skill(SKILL_COMPUTERS))
      {
         int roll = activesquad->squad[p]->skill_roll(SKILL_COMPUTERS);
         if(!activesquad->squad[p]->special[SPECIALWOUND_RIGHTEYE]&&
            !activesquad->squad[p]->special[SPECIALWOUND_LEFTEYE])
         {  // we got a blind person here
            roll-=3; // blindness handicaps you by 3, highest roll you can get is 15 instead of 18
            if(roll>maxblindattack) maxblindattack=roll,blind=p; // best blind hacker so far
         }
         else
         {  // we got someone who can see here
            if(roll>maxattack) maxattack=roll,hacker=p; // best hacker with eyeballs so far
         }
      }

   if(blind>-1&&(hacker==-1||(maxblindattack>maxattack&&maxblindattack>0)))
      hacker=blind,maxattack=maxblindattack,blind=true; // the best hacker is a blind person
   else if(blind>-1&&hacker==-1&&maxblindattack<=0)
      blind=true; // we only have a blind hacker, and their roll with the handicap is 0 or less
   else blind=false; // either our hacker has eyeballs or there is no hacker at all

   if(hacker > -1)
   {
      activesquad->squad[hacker]->train(SKILL_COMPUTERS,difficulty);

      if(maxattack>difficulty)
      {
         clearmessagearea();
         set_color(COLOR_WHITE,COLOR_BLACK,1);
         move(16,1);
         addstr(activesquad->squad[hacker]->name, gamelog);
         if(!blind) addstr(" has", gamelog);
         switch(type)
         {
         case HACK_SUPERCOMPUTER:addstr(" burned a disk of top secret files", gamelog);break;
         case HACK_VAULT:addstr(" disabled the second layer of security", gamelog);break;
         }
         if(blind)
            addstr(" despite being blind", gamelog);
         addstr("!", gamelog);
         gamelog.newline();

         getkey();

         actual=1;
         return 1;
      }
      else
      {
         clearmessagearea();
         set_color(COLOR_WHITE,COLOR_BLACK,1);
         move(16,1);
         addstr(activesquad->squad[hacker]->name, gamelog);
         addstr(" couldn't", gamelog);
         if(blind) addstr(" see how to", gamelog);
         switch(type)
         {
         case HACK_SUPERCOMPUTER:addstr(" bypass the supercomputer security.", gamelog);break;
         case HACK_VAULT:addstr(" bypass the vault's electronic lock.", gamelog);break;
         }
         gamelog.newline();

         getkey();

         actual=1;
         return 0;
      }
   }
   else
   {
      clearmessagearea();
      set_color(COLOR_WHITE,COLOR_BLACK,1);
      move(16,1);
      addstr("You can't find anyone to do the job.", gamelog);
      gamelog.newline();
      if(blind)
      {  // your only hacker was blind and had a skill roll, after the handicap, of 0 or less
         getkey();

         move(17,1);
         addstr("Including the BLIND HACKER you brought.", gamelog);
         gamelog.newline();
      }

      getkey();
   }

   actual=0;
   return 0;
}
예제 #12
0
/* checks if conservatives see through your disguise */
void disguisecheck(int timer)
{
    int weapon=0;
    int squadsize=0;
    bool forcecheck=false;
    int weaponar[6]= {0};

    bool spotted = false;
    int blew_it = -1;

    // Only start to penalize the player's disguise/stealth checks after the first turn.
    timer--;

    for(int i=0; i<6; i++)
    {
        if(activesquad->squad[i]==NULL)break;
        squadsize++;
        if(activesquad->squad[i]->is_naked() &&
                activesquad->squad[i]->animalgloss!=ANIMALGLOSS_ANIMAL)forcecheck=true;
        int thisweapon=weaponcheck(*activesquad->squad[i]);
        if(thisweapon>weapon)weapon=thisweapon;
        if(thisweapon==2)weaponar[i]=1;
    }

    // Nothing suspicious going on here
    if(sitealarmtimer==-1 && weapon<1 && !forcecheck)
    {
        if(!disguisesite(location[cursite]->type)&&
                !(levelmap[locx][locy][locz].flag & SITEBLOCK_RESTRICTED))return;
    }

    char noticed=0;
    vector<int> noticer;
    for(int e=0; e<ENCMAX; e++)
    {
        if(encounter[e].type==CREATURE_PRISONER)continue;
        if(encounter[e].exists&&encounter[e].alive&&
                encounter[e].enemy())
        {
            noticer.push_back(e);
        }
    }

    if(noticer.size()>0)
    {
        int n,an;

        do
        {
            an=LCSrandom(noticer.size());
            n=noticer[an];
            noticer.erase(noticer.begin() + an);

            int difficulty;

            // Determine difficulty based on enemy type
            switch(encounter[n].type)
            {
            default:
                difficulty = DIFFICULTY_VERYEASY;
                break;
            case CREATURE_SWAT:
            case CREATURE_COP:
            case CREATURE_GANGUNIT:
            case CREATURE_DEATHSQUAD:
                difficulty = DIFFICULTY_EASY;
                break;
            case CREATURE_PRISONGUARD:
            case CREATURE_BOUNCER:
            case CREATURE_AGENT:
            case CREATURE_SECURITYGUARD:
                difficulty = DIFFICULTY_AVERAGE;
                break;
            case CREATURE_CORPORATE_CEO:
            case CREATURE_JUDGE_CONSERVATIVE:
            case CREATURE_CCS_ARCHCONSERVATIVE:
            case CREATURE_SCIENTIST_EMINENT:
                difficulty = DIFFICULTY_HARD;
                break;
            case CREATURE_GUARDDOG:
                difficulty = DIFFICULTY_HEROIC;
                break;
            }

            // Increase difficulty if Conservatives suspicious...
            if(sitealarmtimer==1)
                difficulty += 3;

            // Make the attempt!
            for(int i=0; i<6; i++)
            {
                if(activesquad->squad[i]==NULL)break;

                // Try to sneak.
                if(!spotted)
                {
                    int result = activesquad->squad[i]->skill_roll(SKILL_STEALTH);
                    result -= timer;
                    // Sneaking with a party is hard
                    if(result < (difficulty + squadsize - 1))
                        spotted = true;
                }

                // Spotted! Act casual.
                if(spotted)
                {
                    // Guns of death and doom are not very casual.
                    if(weaponcheck(*activesquad->squad[i]) == 2)
                    {
                        noticed = true;
                        break;
                    }
                    else
                    {
                        int result = activesquad->squad[i]->skill_roll(SKILL_DISGUISE);
                        result -= timer;

                        if(result<difficulty)
                        {
                            // That was not very casual, dude.
                            if(result<0)blew_it=i;

                            noticed = true;
                            break;
                        }
                    }
                }
            }
            if(noticed)break;
        } while(noticer.size()>0);

        // Give feedback on the Liberal Performance
        if(!spotted)
        {
            for(int i=0; i<6; i++)
            {
                if(activesquad->squad[i] == NULL) break;
                activesquad->squad[i]->train(SKILL_STEALTH, 10);
            }

            if(timer == 0)
            {
                set_color(COLOR_CYAN,COLOR_BLACK,1);
                move(16,1);

                if(squadsize > 1)
                    addstr("The squad ");
                else
                    addstr(activesquad->squad[0]->name);
                addstr(" fades into the shadows.");

                getch();
            }
        }
        else
        {
            if(blew_it == -1)
            {
                int i;
                for(i=0; i<6; i++)
                {
                    if(activesquad->squad[i] == NULL) break;
                    if(hasdisguise(*(activesquad->squad[i])))
                        activesquad->squad[i]->train(SKILL_DISGUISE, 10);
                }
            }

            if(blew_it != -1 && LCSrandom(2))
            {
                set_color(COLOR_YELLOW,COLOR_BLACK,1);
                move(16,1);

                addstr(activesquad->squad[blew_it]->name);
                switch(LCSrandom(5))
                {
                case 0:
                    addstr(" coughs.");
                    break;
                case 1:
                    addstr(" accidentally mumbles the slogan.");
                    break;
                case 2:
                    addstr(" paces uneasily.");
                    break;
                case 3:
                    addstr(" stares at the Conservatives.");
                    break;
                case 4:
                    addstr(" laughs nervously.");
                    break;
                }

                getch();
            }
            else if(!noticed)
            {
                set_color(COLOR_CYAN,COLOR_BLACK,1);
                move(16,1);

                if(squadsize > 1)
                    addstr("The squad");
                else
                    addstr(activesquad->squad[0]->name);
                addstr(" acts natural.");

                getch();
            }
        }

        if(!noticed)return;

        clearmessagearea();

        set_color(COLOR_RED,COLOR_BLACK,1);
        move(16,1);
        addstr(encounter[n].name);
        if(sitealarmtimer!=0 && weapon<1 && encounter[n].type!=CREATURE_GUARDDOG)
        {
            if((sitetype==SITE_RESIDENTIAL_TENEMENT||
                    sitetype==SITE_RESIDENTIAL_APARTMENT||
                    sitetype==SITE_RESIDENTIAL_APARTMENT_UPSCALE)&&
                    levelmap[locx][locy][locz].flag & SITEBLOCK_RESTRICTED)
            {
                sitealarm=1;

                addstr(" shouts in alarm at the squad's Liberal Trespassing!");
            }
            else
            {
                addstr(" looks at the Squad suspiciously.");

                int time;

                time = 20 + LCSrandom(10) - encounter[n].get_attribute(ATTRIBUTE_INTELLIGENCE,true)
                       - encounter[n].get_attribute(ATTRIBUTE_WISDOM,true);

                if(time<1)time=1;

                if(sitealarmtimer>time||sitealarmtimer==-1)sitealarmtimer=time;
                else
                {
                    if(sitealarmtimer>5) sitealarmtimer-= 5;
                    if(sitealarmtimer<=5)sitealarmtimer = 0;
                }
            }
        }
        else
        {
            if(weapon&&encounter[n].type!=CREATURE_GUARDDOG)
            {
                addstr(" sees the Squad's Liberal Weapons");
                move(17,1);
                if(encounter[n].align==ALIGN_CONSERVATIVE)
                    addstr("and lets forth a piercing Conservative alarm cry!");
                else
                    addstr("and shouts for help!");

                for(int i=0; i<6; i++)
                {
                    if(activesquad->squad[i]==NULL)break;
                    //if(weaponar[i])
                    //{
                    // Illegal weapon crimes disabled
                    //criminalize(*activesquad->squad[i],LAWFLAG_GUNCARRY);
                    //}
                }
            }
            else
            {
                addstr(" looks at the Squad with Intolerance");
                move(17,1);
                if(encounter[n].align==ALIGN_CONSERVATIVE)
                {
                    if(encounter[n].type==CREATURE_GUARDDOG)
                        addstr("and launches into angry Conservative barking!");
                    else
                        addstr("and lets forth a piercing Conservative alarm cry!");

                }
                else
                    addstr("and shouts for help!");
            }

            sitealarm=1;
        }

        refresh();
        getch();
    }
}