コード例 #1
0
bool Clip::sort_compare_special(Item* other) const
{
   bool reorder = false;
   if (other != NULL)
   {
      int thisi = getcliptype(itemtypename());
      int otheri = getcliptype(other->get_itemtypename());
      if (thisi < otheri || otheri == -1)
         reorder = false;
      else if (thisi > otheri && otheri != -1)
         reorder = true;
   }
   return reorder;
}
コード例 #2
0
bool Shop::ShopItem::valid_item() const
{
   int i=-1;
   switch (itemclass_)
   {
      case WEAPON: i = getweapontype(itemtypename_); break;
      case CLIP: i = getcliptype(itemtypename_); break;
      case ARMOR: i = getarmortype(itemtypename_); break;
      case LOOT: i = getloottype(itemtypename_); break;
   }
   return (i != -1);
}
コード例 #3
0
void CreatureType::give_weapon_civilian(Creature& cr) const
{
    if (law[LAW_GUNCONTROL] == -1 && !LCSrandom(30))
    {
        cr.give_weapon(*weapontype[getweapontype("WEAPON_REVOLVER_38")], NULL);
        cr.take_clips(*cliptype[getcliptype("CLIP_38")], 4);
        cr.reload(false);
    }
    else if (law[LAW_GUNCONTROL] == -2)
    {
        if (!LCSrandom(10))
        {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SEMIPISTOL_9MM")], NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_9")], 4);
            cr.reload(false);
        }
        else if (!LCSrandom(9))
        {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SEMIPISTOL_45")], NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_45")], 4);
            cr.reload(false);
        }
    }
}
コード例 #4
0
void Shop::ShopItem::choose(squadst& customers, int& buyer) const
{
   if (is_available())
   {
      ledger.subtract_funds(adjusted_price(), EXPENSE_SHOPPING);
      switch (itemclass_)
      {
         case WEAPON:
         {
            Weapon* i = new Weapon(*weapontype[getweapontype(itemtypename_)]);
            customers.squad[buyer]->give_weapon(*i, &location[customers.squad[0]->base]->loot);
            if (i->empty())
               delete i;
            else
               location[customers.squad[0]->base]->loot.push_back(i);
            break;
         }
         case CLIP:
         {
            Clip* i = new Clip(*cliptype[getcliptype(itemtypename_)]);
            customers.squad[buyer]->take_clips(*i, 1);
            if (i->empty())
               delete i;
            else
               location[customers.squad[0]->base]->loot.push_back(i);
            break;
         }
         case ARMOR:
         {
            Armor* i = new Armor(*armortype[getarmortype(itemtypename_)]);
            customers.squad[buyer]->give_armor(*i, &location[customers.squad[0]->base]->loot);
            if (i->empty())
               delete i;
            else
               location[customers.squad[0]->base]->loot.push_back(i);
            break;
         }
         case LOOT:
         {
            Loot* i = new Loot(*loottype[getloottype(itemtypename_)]);
            location[customers.squad[0]->base]->loot.push_back(i);
            break;
         }
      }
   }
}
コード例 #5
0
const std::string& Shop::ShopItem::get_description() const
{
   if (description_defined_)
   {
      return description_;
   }
   else
   {
      switch (itemclass_)
      {
         default: return description_; // Will be "UNDEFINED"
         case WEAPON: return weapontype[getweapontype(itemtypename_)]->get_name();
         case CLIP  : return cliptype  [getcliptype  (itemtypename_)]->get_name();
         case ARMOR : return armortype [getarmortype (itemtypename_)]->get_name();
         case LOOT  : return loottype  [getloottype  (itemtypename_)]->get_name();
      }
   }
}
コード例 #6
0
void CreatureType::give_weapon(Creature& cr) const
{
    const WeaponsAndClips& wc = pickrandom(weapons_and_clips_);

    if (wc.weapontype == "CIVILIAN")
        give_weapon_civilian(cr);
    else if (wc.weapontype != "WEAPON_NONE")
    {
        Weapon w(*weapontype[getweapontype(wc.weapontype)], wc.number_weapons.roll());
        w.set_number(min(w.get_number(),10L));
        while(!w.empty()) cr.give_weapon(w,NULL);
        if (wc.cliptype != "NONE")
        {
            int n = wc.number_clips.roll();
            cr.take_clips(*cliptype[getcliptype(wc.cliptype)], n);
            cr.reload(false);
        }
    }
}
コード例 #7
0
CreatureType::WeaponsAndClips::WeaponsAndClips(CMarkup& xml, const string& owner)
    : number_weapons(1),
      cliptype("APPROPRIATE"), number_clips(4)
{   // The main position of the CMarkup object is expected not to be changed here.
    weapontype = xml.GetData();

    // Read in values.
    if(!len(weapontype))
    {
        while(xml.FindChildElem())
        {
            std::string element=xml.GetChildTagName();
            if(element=="type") weapontype=xml.GetChildData();
            else if(element=="number_weapons")
                assign_interval(number_weapons,xml.GetChildData(),owner,element);
            else if(element=="cliptype") cliptype=xml.GetChildData();
            else if(element=="number_clips")
                assign_interval(number_clips,xml.GetChildData(),owner,element);
            else xmllog.log("Unknown element for weapon in "+owner+": "+element);
        }
    }

    // Check values.
    if (weapontype != "CIVILIAN")
    {
        if (getweapontype(weapontype) == -1)
        {
            xmllog.log("Invalid weapon type for " + owner + ": " + weapontype);
            weapontype = "WEAPON_NONE";
            cliptype = "NONE";
        }
        else
        {
            const vector<attackst*>& attacks = ::weapontype[getweapontype(weapontype)]->get_attacks();

            // Find a usable clip type for the weapon.
            if (cliptype == "APPROPRIATE")
            {
                cliptype = "NONE";
                for(int i=0; i<len(attacks); i++)
                {
                    if(attacks[i]->uses_ammo)
                    {
                        cliptype=attacks[i]->ammotype;
                        break;
                    }
                }
            }
            // Check clip is usable by the weapon.
            else if (getcliptype(cliptype) != -1) //Must be a clip type too.
            {
                int i;
                for(i=0; i<len(attacks)&&cliptype!=attacks[i]->ammotype; i++);
                if(i==len(attacks))
                {
                    xmllog.log("In " + owner + ", " + cliptype +
                               "can not be used by " + weapontype + ".");
                    cliptype = "NONE";
                }
            }
            // Undefined clip type.
            else
            {
                xmllog.log("Invalid clip type for " + owner + ": " + cliptype);
                cliptype = "NONE";
            }
        }
    }
}
コード例 #8
0
/* loads the game from save.dat */
char load(const string& filename)
{
   //LOAD FILE
   int loadversion;
   int l;
   bool dummy_b;
   int dummy;
   long dummy_l;
   FILE *h;

   h=LCSOpenFile(filename.c_str(), "rb", LCSIO_PRE_HOME);
   if(h!=NULL)
   {
      fread(&loadversion,sizeof(int),1,h);

      //NUKE INVALID SAVE GAMES
      if(loadversion<lowestloadversion)
      {
            LCSCloseFile(h);

            reset();

            return 0;
         }

         fread(seed,sizeof(unsigned long),RNG_SIZE,h);

         fread(&mode,sizeof(short),1,h);
         fread(&wincondition,sizeof(short),1,h);
         fread(&fieldskillrate,sizeof(short),1,h);

         fread(&day,sizeof(int),1,h);
         fread(&month,sizeof(int),1,h);
         fread(&year,sizeof(int),1,h);
         fread(&execterm,sizeof(short),1,h);
         fread(&presparty,sizeof(short),1,h);
         fread(&amendnum,sizeof(int),1,h);

         fread(&multipleCityMode,sizeof(bool),1,h);
         fread(&termlimits,sizeof(bool),1,h);
         fread(&deagle,sizeof(bool),1,h);
         fread(&m249,sizeof(bool),1,h);
         fread(&notermlimit,sizeof(bool),1,h);
         fread(&nocourtpurge,sizeof(bool),1,h);
         fread(&stalinmode,sizeof(bool),1,h);

         fread(&stat_recruits,sizeof(int),1,h);
         fread(&stat_dead,sizeof(int),1,h);
         fread(&stat_kills,sizeof(int),1,h);
         fread(&stat_kidnappings,sizeof(int),1,h);
         fread(&stat_buys,sizeof(int),1,h);
         fread(&stat_burns,sizeof(int),1,h);

         fread(&endgamestate,sizeof(char),1,h);
         fread(&ccsexposure,sizeof(char),1,h);
         fread(&ccs_kills,sizeof(char),1,h);

         fread(&Vehicle::curcarid,sizeof(long),1,h);
         fread(&curcreatureid,sizeof(long),1,h);
         fread(&cursquadid,sizeof(long),1,h);
         fread(&police_heat,sizeof(int),1,h);
         fread(&offended_corps,sizeof(short),1,h);
         fread(&offended_cia,sizeof(short),1,h);
         fread(&offended_amradio,sizeof(short),1,h);
         fread(&offended_cablenews,sizeof(short),1,h);
         fread(&offended_firemen,sizeof(short),1,h);
         fread(attorneyseed,sizeof(unsigned long),RNG_SIZE,h);
         //fread(&selectedsiege,sizeof(long),1,h);
         fread(lcityname,sizeof(char),CITY_NAMELEN,h);
         fread(&newscherrybusted,sizeof(char),1,h);

         fread(slogan,sizeof(char),SLOGAN_LEN,h);
         fread(&ledger,sizeof(class Ledger),1,h);
         fread(&party_status,sizeof(short),1,h);

         fread(attitude,sizeof(short),VIEWNUM,h);
         fread(law,sizeof(short),LAWNUM,h);
         fread(house,sizeof(short),HOUSENUM,h);
         fread(senate,sizeof(short),SENATENUM,h);
         fread(court,sizeof(short),COURTNUM,h);
         fread(courtname,sizeof(char)*POLITICIAN_NAMELEN,COURTNUM,h);
         fread(exec,sizeof(char),EXECNUM,h);
         fread(execname,sizeof(char)*POLITICIAN_NAMELEN,EXECNUM,h);
         fread(oldPresidentName,sizeof(char),POLITICIAN_NAMELEN,h);

         //LOCATIONS
         fread(&dummy,sizeof(int),1,h);
         location.resize(dummy);
         for(l=0;l<len(location);l++)
         {
            location[l]=new Location;

            fread(&dummy,sizeof(int),1,h);
            location[l]->loot.resize(dummy);
            for(int l2=0;l2<len(location[l]->loot);l2++)
            {
               int itemLen;
               fread(&itemLen, sizeof(int), 1, h);
               vector<char> vec = vector<char>(itemLen + 1);
               fread(&vec[0], itemLen, 1, h);
               vec[itemLen] = '\0';

               Item* it = create_item(&vec[0]);
               if(it!=NULL)
                  location[l]->loot[l2] = it;
            }
            //Remove items of unknown type.
            for(int l2=len(location[l]->loot)-1; l2>=0; l2--)
            {
               bool del = false;
               if(location[l]->loot[l2]->is_loot())
                  del = (getloottype(location[l]->loot[l2]->get_itemtypename()) == -1);
               else if(location[l]->loot[l2]->is_clip())
                  del = (getcliptype(location[l]->loot[l2]->get_itemtypename()) == -1);
               else if(location[l]->loot[l2]->is_weapon())
                  del = (getweapontype(location[l]->loot[l2]->get_itemtypename()) == -1);
               else if(location[l]->loot[l2]->is_armor())
                  del = (getarmortype(location[l]->loot[l2]->get_itemtypename()) == -1);

               if(del)
               {
                  addstr("Item type ");
                  addstr(location[l]->loot[l2]->get_itemtypename());
                  addstr(" does not exist. Deleting item.");
                  delete_and_remove(location[l]->loot,l2);
               }
            }
            consolidateloot(location[l]->loot); // consolidate loot after loading

            fread(&dummy,sizeof(int),1,h);
            location[l]->changes.resize(dummy);
            for(int l2=0;l2<len(location[l]->changes);l2++)
               fread(&location[l]->changes[l2],sizeof(sitechangest),1,h);

            fread(location[l]->name,sizeof(char),LOCATION_NAMELEN,h);
            fread(location[l]->shortname,sizeof(char),LOCATION_SHORTNAMELEN,h);
            fread(&location[l]->type,sizeof(char),1,h);
            fread(&location[l]->city,sizeof(int),1,h);
            fread(&location[l]->area,sizeof(int),1,h);
            fread(&location[l]->parent,sizeof(int),1,h);
            fread(&location[l]->id,sizeof(int),1,h);

            fread(&location[l]->renting,sizeof(int),1,h);
            fread(&location[l]->newrental,sizeof(char),1,h);
            fread(&location[l]->needcar,sizeof(char),1,h);
            fread(&location[l]->closed,sizeof(int),1,h);
            fread(&location[l]->hidden,sizeof(bool),1,h);
            fread(&location[l]->mapped,sizeof(bool),1,h);
            fread(&location[l]->upgradable,sizeof(bool),1,h);
            fread(&location[l]->highsecurity,sizeof(int),1,h);
            fread(&location[l]->siege,sizeof(siegest),1,h);
            fread(&location[l]->heat,sizeof(int),1,h);
            fread(&location[l]->heat_protection,sizeof(int),1,h);
            fread(&location[l]->compound_walls,sizeof(int),1,h);
            fread(&location[l]->compound_stores,sizeof(int),1,h);
            fread(&location[l]->front_business,sizeof(char),1,h);
            fread(location[l]->front_name,sizeof(char),LOCATION_NAMELEN,h);
            fread(location[l]->front_shortname,sizeof(char),LOCATION_SHORTNAMELEN,h);
            fread(&location[l]->haveflag,sizeof(bool),1,h);

            fread(location[l]->mapseed,sizeof(unsigned long),RNG_SIZE,h);
         }

         //VEHICLES
         fread(&dummy,sizeof(int),1,h);
         vehicle.resize(dummy);
         for(l=0;l<len(vehicle);l++)
         {
            int vehicleLen;
            fread (&vehicleLen, sizeof(int), 1, h);
            vector<char> vec = vector<char> (vehicleLen + 1);
            fread (&vec[0], vehicleLen, 1, h);
            vec[vehicleLen] = '\0';
            vehicle[l] = new Vehicle (&vec[0]);
         }

         //POOL
         fread(&dummy,sizeof(int),1,h);
         pool.resize(dummy);
         for(int pl=0;pl<len(pool);pl++)
         {
            int creatureLen;
            fread (&creatureLen, sizeof(int), 1, h);
            vector<char> vec = vector<char> (creatureLen + 1);
            fread (&vec[0], creatureLen, 1, h);
            vec[creatureLen] = '\0';
            pool[pl] = new Creature(&vec[0]);
            //pool[pl]=new Creature;
            //fread(pool[pl],sizeof(Creature),1,h);
            //read extra interrogation data if applicable
            if(pool[pl]->align==-1 && pool[pl]->alive)
            {
               interrogation* &intr = pool[pl]->activity.intr();
               intr = new interrogation;
               fread(intr->techniques,sizeof(bool[6]),1,h);
               fread(&intr->druguse,sizeof(int),1,h);

               intr->rapport.clear();
               int size;
               fread(&size,sizeof(int),1,h);
               for(int i=0;i<size;i++)
               {
                  long id;
                  float_zero value;
                  fread(&id,sizeof(long),1,h);
                  fread(&value,sizeof(float_zero),1,h);
                  intr->rapport[id]=value;
               }
            }
            /*
            //read equipment
            vector<Item*> dump; //Used to catch invalid pointers from creature so they aren't deleted.
            pool[pl]->drop_weapon(&dump);
            pool[pl]->strip(&dump);
            pool[pl]->clips = deque<Clip*>();
            pool[pl]->extra_throwing_weapons = deque<Weapon*>();
            int itemLen;
            fread(&itemLen, sizeof(int), 1, h);
            if(itemLen != 0)
            {
               vector<char> vec = vector<char>(itemLen + 1);
               fread(&vec[0], itemLen, 1, h);
               vec[itemLen] = '\0';

               Weapon w(&vec[0]);
               if(getweapontype(w.get_itemtypename())!=-1) //Check it is a valid weapon type.
                  pool[pl]->give_weapon(w,&dump);
            }
            //pool[pl]->clips.clear();
            fread(&dummy,sizeof(int),1,h);
            for(int nc=0; nc<dummy; nc++)
            {
               fread(&itemLen, sizeof(itemLen), 1, h);
               vector<char> vec = vector<char>(itemLen + 1);
               fread(&vec[0], itemLen, 1, h);
               vec[itemLen] = '\0';

               Clip c(&vec[0]);
               if(getcliptype(c.get_itemtypename())!=-1) //Check it is a valid clip type.
                  pool[pl]->take_clips(c,len(c));
            }
            //pool[pl]->extra_throwing_weapons.clear();
            fread(&dummy,sizeof(int),1,h);
            for(int ne=0; ne<dummy; ne++)
            {
               fread(&itemLen, sizeof(itemLen), 1, h);
               vector<char> vec = vector<char>(itemLen + 1);
               fread(&vec[0], itemLen, 1, h);
               vec[itemLen] = '\0';

               Weapon w(&vec[0]);
               if(getweapontype(w.get_itemtypename())!=-1) //Check it is a valid weapon type.
                  pool[pl]->give_weapon(w,NULL);
            }
            fread(&itemLen, sizeof(itemLen), 1, h);
            if(itemLen != 0)
            {
               vector<char> vec = vector<char>(itemLen + 1);
               fread(&vec[0], itemLen, 1, h);
               vec[itemLen] = '\0';

               Armor a(&vec[0]);
               if(getarmortype(a.get_itemtypename())!=-1) //Check it is a valid armor type.
                  pool[pl]->give_armor(a,&dump);
            }*/
         }

         //Unique Creatures
         {
            int uniquecreaturesLen;
            fread (&uniquecreaturesLen, sizeof(int), 1, h);
            vector<char> vec = vector<char> (uniquecreaturesLen + 1);
            fread (&vec[0], uniquecreaturesLen, 1, h);
            vec[uniquecreaturesLen] = '\0';
            uniqueCreatures = UniqueCreatures(&vec[0]);
            //fread(&uniqueCreatures,sizeof(UniqueCreatures),1,h);
         }

         //SQUADS
         fread(&dummy,sizeof(int),1,h);
         squad.resize(dummy);
         for(int sq=0;sq<len(squad);sq++)
         {
            squad[sq]=new squadst;

            fread(squad[sq]->name,sizeof(char),SQUAD_NAMELEN,h);
            fread(&squad[sq]->activity,sizeof(activityst),1,h);
            fread(&squad[sq]->id,sizeof(int),1,h);

            for(int pos=0;pos<6;pos++)
            {
               //REBUILD SQUAD FROM POOL
               squad[sq]->squad[pos]=NULL;
               fread(&dummy_b,sizeof(bool),1,h);
               if(dummy_b)
               {
                  int dummy_i;
                  fread(&dummy_i,sizeof(int),1,h);
                  for(int pl=0;pl<len(pool);pl++)
                     if(pool[pl]->id==dummy_i)
                        squad[sq]->squad[pos]=pool[pl];
               }
            }

            fread(&dummy,sizeof(int),1,h);
            squad[sq]->loot.resize(dummy);
            for(int l2=0;l2<len(squad[sq]->loot);l2++)
            {
               int itemLen;
               fread(&itemLen, sizeof(int), 1, h);
               vector<char> vec = vector<char>(itemLen + 1);
               fread(&vec[0], itemLen, 1, h);
               vec[itemLen] = '\0';

               Item* it = create_item(&vec[0]);
               //if(it!=NULL) //Assume save file is correct? -XML
                  squad[sq]->loot[l2] = it;
               /*else
                  squad[sq]->loot.erase(loot.begin()+l2--);*/
            }
            //Remove items of unknown type.
            for(int l2=len(squad[sq]->loot)-1; l2>=0; l2--)
            {
               bool del = false;
               if(squad[sq]->loot[l2]->is_loot())
                  del = (getloottype(squad[sq]->loot[l2]->get_itemtypename()) == -1);
               else if(squad[sq]->loot[l2]->is_clip())
                  del = (getcliptype(squad[sq]->loot[l2]->get_itemtypename()) == -1);
               else if(squad[sq]->loot[l2]->is_weapon())
                  del = (getweapontype(squad[sq]->loot[l2]->get_itemtypename()) == -1);
               else if(squad[sq]->loot[l2]->is_armor())
                  del = (getarmortype(squad[sq]->loot[l2]->get_itemtypename()) == -1);

               if(del)
               {
                  addstr("Item type ");
                  addstr(squad[sq]->loot[l2]->get_itemtypename());
                  addstr(" does not exist. Deleting item.");
                  delete_and_remove(squad[sq]->loot,l2);
               }
            }
            consolidateloot(squad[sq]->loot); // consolidate loot after loading
         }

         activesquad=NULL;
         fread(&dummy_b,sizeof(bool),1,h);
         if(dummy_b)
         {
            int dummy_i;
            fread(&dummy_i,sizeof(int),1,h);
            for(int sq=0;sq<len(squad);sq++)
               if(squad[sq]->id==dummy_i)
               {
                  activesquad=squad[sq];
                  break;
               }
         }

         //DATES
         fread(&dummy,sizeof(int),1,h);
         date.resize(dummy);
         for(int dt=0;dt<len(date);dt++)
         {
            date[dt]=new datest;

            fread(&date[dt]->mac_id,sizeof(long),1,h);
            fread(&date[dt]->timeleft,sizeof(short),1,h);
            fread(&date[dt]->city,sizeof(int),1,h);

            fread(&dummy,sizeof(int),1,h);
            date[dt]->date.resize(dummy);
            for(int dt2=0;dt2<len(date[dt]->date);dt2++)
            {
               int creatureLen;
               fread (&creatureLen, sizeof(int), 1, h);
               vector<char> vec = vector<char> (creatureLen + 1);
               fread (&vec[0], creatureLen, 1, h);
               vec[creatureLen] = '\0';
               date[dt]->date[dt2] = new Creature(&vec[0]);

               //date[dt]->date[dt2]=new Creature;
               //fread(date[dt]->date[dt2],sizeof(Creature),1,h);
            }
         }

         //RECRUITS
         fread(&dummy,sizeof(int),1,h);
         recruit.resize(dummy);
         for(int rt=0;rt<len(recruit);rt++)
         {
            recruit[rt]=new recruitst;
            fread(&recruit[rt]->recruiter_id,sizeof(long),1,h);
            fread(&recruit[rt]->timeleft,sizeof(short),1,h);
            fread(&recruit[rt]->level,sizeof(char),1,h);
            fread(&recruit[rt]->eagerness1,sizeof(char),1,h);
            fread(&recruit[rt]->task,sizeof(char),1,h);

            int creatureLen;
            fread (&creatureLen, sizeof(int), 1, h);
            vector<char> vec = vector<char> (creatureLen + 1);
            fread (&vec[0], creatureLen, 1, h);
            vec[creatureLen] = '\0';
            recruit[rt]->recruit = new Creature(&vec[0]);
            //recruit[rt]->recruit = new Creature;
            //fread(recruit[rt]->recruit,sizeof(Creature),1,h);
         }

         //NEWS STORIES
         fread(&dummy,sizeof(int),1,h);
         newsstory.resize(dummy);
         for(int ns=0;ns<len(newsstory);ns++)
         {
            newsstory[ns]=new newsstoryst;

            fread(&newsstory[ns]->type,sizeof(short),1,h);
            fread(&newsstory[ns]->view,sizeof(short),1,h);

            fread(&newsstory[ns]->loc,sizeof(long),1,h);
            fread(&newsstory[ns]->priority,sizeof(long),1,h);
            fread(&newsstory[ns]->page,sizeof(long),1,h);
            fread(&newsstory[ns]->positive,sizeof(char),1,h);
            fread(&newsstory[ns]->siegetype,sizeof(short),1,h);

            newsstory[ns]->cr=NULL;
            fread(&dummy_b,sizeof(bool),1,h);
            if(dummy_b)
            {
               fread(&dummy_l,sizeof(long),1,h);
               for(int pl=0;pl<len(pool);pl++)
                  if(pool[pl]->id==dummy_l)
                  {
                     newsstory[ns]->cr=pool[pl];
                     break;
                  }
            }

            fread(&dummy,sizeof(int),1,h);
            newsstory[ns]->crime.resize(dummy);
            for(int dt2=0;dt2<len(newsstory[ns]->crime);dt2++)
               fread(&newsstory[ns]->crime[dt2],sizeof(int),1,h);
         }

         // Liberal Media
         fread(public_interest,sizeof(public_interest),1,h);
         fread(background_liberal_influence,sizeof(background_liberal_influence),1,h);

         // Site mode options
         fread(&encounterwarnings,sizeof(bool),1,h);
         bool musicenabled;
         fread(&musicenabled,sizeof(bool),1,h);
         music.enableIf(musicenabled);

         LCSCloseFile(h);

         // Check that vehicles are of existing types.
         for(int v=0;v<len(vehicle);v++)
         {
            if(getvehicletype(vehicle[v]->vtypeidname())==-1)
            { //Remove vehicle of non-existing type.
               addstr("Vehicle type "+vehicle[v]->vtypeidname()+" does not exist. Deleting vehicle.");
               delete_and_remove(vehicle,v--);
            }
         }

         return 1;
      }

   gamelog.log("Could not load");
   return 0;
}
コード例 #9
0
int Clip::get_ammoamount() const
   { return cliptype[getcliptype(itemtypename())]->get_ammoamount(); }
コード例 #10
0
long Clip::get_fencevalue() const
   { return cliptype[getcliptype(itemtypename())]->get_fencevalue(); }
コード例 #11
0
const string& Clip::get_name() const
   { return cliptype[getcliptype(itemtypename())]->get_name(); }
コード例 #12
0
string Clip::equip_title() const
   { return cliptype[getcliptype(itemtypename())]->get_name(); }
コード例 #13
0
/* creates your founder */
void makecharacter()
{
   Creature *newcr=new Creature;
   newcr->align=1;

#ifdef BLIND
   newcr->special[SPECIALWOUND_RIGHTEYE]=1;
   newcr->special[SPECIALWOUND_LEFTEYE]=1;
#endif
#ifdef SPINE
   newcr->special[SPECIALWOUND_UPPERSPINE]=1;
   newcr->special[SPECIALWOUND_LOWERSPINE]=1;
#endif
#ifdef NOFACE
   newcr->special[SPECIALWOUND_TONGUE]=1;
   newcr->special[SPECIALWOUND_RIGHTEYE]=1;
   newcr->special[SPECIALWOUND_LEFTEYE]=1;
   newcr->special[SPECIALWOUND_NOSE]=1;
#endif
#ifdef NOWALK
   newcr->special[SPECIALWOUND_UPPERSPINE]=1;
   newcr->special[SPECIALWOUND_LOWERSPINE]=1;
   newcr->special[SPECIALWOUND_NECK]=1;
   newcr->wound[BODYPART_LEG_RIGHT]=1;
   newcr->wound[BODYPART_LEG_LEFT]=1;
#endif
#ifdef INTERNAL
   newcr->special[SPECIALWOUND_RIGHTLUNG]=1;
   newcr->special[SPECIALWOUND_LEFTLUNG]=1;
   newcr->special[SPECIALWOUND_HEART]=1;
   newcr->special[SPECIALWOUND_LIVER]=1;
   newcr->special[SPECIALWOUND_STOMACH]=1;
   newcr->special[SPECIALWOUND_LEFTKIDNEY]=1;
   newcr->special[SPECIALWOUND_RIGHTKIDNEY]=1;
   newcr->special[SPECIALWOUND_SPLEEN]=1;
#endif

   newcr->set_attribute(ATTRIBUTE_HEART,8);
   newcr->set_attribute(ATTRIBUTE_WISDOM,1);
   newcr->set_attribute(ATTRIBUTE_INTELLIGENCE,3);
   newcr->set_attribute(ATTRIBUTE_AGILITY,5);
   newcr->set_attribute(ATTRIBUTE_STRENGTH,4);
   newcr->set_attribute(ATTRIBUTE_HEALTH,6);
   newcr->set_attribute(ATTRIBUTE_CHARISMA,4);
   for(int sk=0;sk<SKILLNUM;sk++)newcr->set_skill(sk,0);

   char first[3][80];
   char last[80];
   bool male = LCSrandom(2); // whether or not starting gender is male
   char gender = newcr->gender_liberal = newcr->gender_conservative = (male ? GENDER_MALE : GENDER_FEMALE);
   do {
      firstname(first[0], GENDER_NEUTRAL);
      firstname(first[1], GENDER_MALE);
      firstname(first[2], GENDER_FEMALE);
      lastname(last);
   } while(strcmp(first[0],last) == 0 && strcmp(first[1],last) == 0 && strcmp(first[2],last) == 0);

   {
      Armor a(*armortype[getarmortype("ARMOR_CLOTHES")]);
      newcr->give_armor(a,NULL);
   }

   bool choices=true;

   while(true)
   {
      erase();

      set_color(COLOR_WHITE,COLOR_BLACK,1);
      move(4,6);
      addstr("The Founder of the Liberal Crime Squad");

      move(7,2);
      addstr("FIRST NAME: ");
      addstr(first[(int)gender]);
      move(7,30);
      set_color(COLOR_BLACK,COLOR_BLACK,1);
      addstr(" (Press A to have your parents reconsider)");

      move(9,2);
      set_color(COLOR_WHITE,COLOR_BLACK,1);
      addstr("LAST NAME: ");
      addstr(last);
      move(9,30);
      set_color(COLOR_BLACK,COLOR_BLACK,1);
      addstr(" (Press B to be born to a different family)");

      move(11,2);
      set_color(COLOR_WHITE,COLOR_BLACK,1);
      addstr("SEX: ");
      if(newcr->gender_conservative == GENDER_MALE)
      {
         set_color(COLOR_CYAN,COLOR_BLACK,1);
         addstr("Male");
      }
      else if(newcr->gender_conservative == GENDER_FEMALE)
      {
         set_color(COLOR_MAGENTA,COLOR_BLACK,1);
         addstr("Female");
      }
      else
      {
         set_color(COLOR_YELLOW,COLOR_BLACK,1);
         addstr("It's Complicated");
      }
      move(11,30);
      set_color(COLOR_BLACK,COLOR_BLACK,1);
      addstr(" (Press C to change your sex at birth)");

      move(13,2);
      set_color(COLOR_WHITE,COLOR_BLACK,1);
      addstr("HISTORY: ");
      if(choices)
      {
         set_color(COLOR_GREEN,COLOR_BLACK,1);
         addstr("Let Me Choose");
      }
      else
      {
         set_color(COLOR_RED,COLOR_BLACK,1);
         addstr("Let Fate Decide");
      }
      move(13,30);
      set_color(COLOR_BLACK,COLOR_BLACK,1);
      addstr(" (Press D to toggle childhood)");

      if(!multipleCityMode)
      {
         move(15,2);
         set_color(COLOR_WHITE,COLOR_BLACK,1);
         addstr("CITY: ");
         addstr(lcityname);
         move(15,30);
         set_color(COLOR_BLACK,COLOR_BLACK,1);
         addstr(" (Press E to relocate)");
      }

      move(19-multipleCityMode*2,4);
      set_color(COLOR_WHITE,COLOR_BLACK,0);
      addstr("Press any other key when ready to begin...");

      int c=getkey();

      if(c=='a')
      {
         do {
            firstname(first[(int)gender],newcr->gender_conservative);
         } while(strcmp(first[(int)gender],last) == 0);
         continue;
      }
      if(c=='b')
      {
         do {
            lastname(last);
         } while(strcmp(first[0],last) == 0 && strcmp(first[1],last) == 0 && strcmp(first[2],last) == 0);
         continue;
      }
      if(c=='c')
      {
         if((newcr->gender_conservative == GENDER_FEMALE && !male) ||
            (newcr->gender_conservative == GENDER_NEUTRAL && male))
            newcr->gender_conservative = GENDER_MALE;
         else if((newcr->gender_conservative == GENDER_MALE && !male) ||
            (newcr->gender_conservative == GENDER_FEMALE && male))
            newcr->gender_conservative = GENDER_NEUTRAL;
         else
            newcr->gender_conservative = GENDER_FEMALE;

         gender = newcr->gender_liberal = newcr->gender_conservative;
         continue;
      }
      if(c=='d')
      {
         choices = !choices;
         continue;
      }
      if(c=='e' && !multipleCityMode)
      {
         strcpy(lcityname,cityname());
         continue;
      }
      break;
   }

   strcpy(newcr->propername,first[(int)gender]);
   strcat(newcr->propername," ");
   strcat(newcr->propername,last);

   int c;
   bool hasmaps=false;
   bool makelawyer=false;
   bool gaylawyer=false;
   Vehicle * startcar = NULL;
   char recruits = RECRUITS_NONE;
   char base = SITE_RESIDENTIAL_SHELTER;

   for(int q=0;q<10;q++)
   {
      erase();
      set_color(COLOR_WHITE,COLOR_BLACK,1);
      move(0,0);
      addstr("Insight into a Revolution:  My Traumatic Childhood");
      set_color(COLOR_WHITE,COLOR_BLACK,0);

      //A - Thief
      //B - Fighter
      //C - Student
      //D - Generalist/Sleepers
      //E - Recruiter

      char selection = LCSrandom(5);

      switch(q)
      {

/*
        - The anniversary of Hitler's suicide. - SKILL_PISTOL 1 (lol)
        - Indira Gandhi Killed
*/

         case 0:
            move(2,0);addstr("The day I was born in 1984...");

            move(5,0);
            if(choices || selection == 0)
               addstr("A - the Polish priest Popieluszko was kidnapped by government agents.");
            //ATTRIBUTE_AGILITY 2
            // Oct. 19, 1984
            move(7,0);
            if(choices || selection == 1)
               addstr("B - was the 3rd anniversary of the assassination attempt on Ronald Reagan.");
            //ATTRIBUTE_STRENGTH 2
            // Mar. 3, 1984
            move(9,0);
            if(choices || selection == 2)
               addstr("C - the Macintosh was introduced.");
            //ATTRIBUTE_INTELLIGENCE 2
            // Jan. 24, 1984
            move(11,0);
            if(choices || selection == 3)
               addstr("D - the Nobel Peace Prize went to Desmond Tutu for opposition to apartheid.");
            //ATTRIBUTE_HEART 2
            // Oct. 16, 1984
            move(13,0);
            if(choices || selection == 4)
               addstr("E - the Sandanista Front won the elections in Nicaragua.");
            //ATTRIBUTE_CHARISMA 2
            // Sept. 4, 1984
                        //move(14,0);
                        //if(choices || selection == 5)
               //addstr("F - the United Nations condemned Iraq's use of chemical weapons.");
            //ATTRIBUTE_HEALTH 2
                        //March 30, 1984

            move(17,0);
            addstr("The doctor said I was ");
            set_color(COLOR_WHITE,COLOR_BLACK,1);
            if(newcr->gender_conservative == GENDER_MALE)
               addstr("a boy");
            else if(newcr->gender_conservative == GENDER_FEMALE)
               addstr("a girl");
            else
               addstr("an intersex baby");
            set_color(COLOR_WHITE,COLOR_BLACK,0);
            addstr(".");

            move(19,0);
            addstr("My parents ");
            if(newcr->gender_conservative == GENDER_NEUTRAL)
            {
               addstr("insisted otherwise.");
               move(20,0);
               addstr("They ");
            }

            addstr("named me ");
            set_color(COLOR_WHITE,COLOR_BLACK,1);
            addstr(newcr->propername);
            set_color(COLOR_WHITE,COLOR_BLACK,0);
            addstr(".");

            break;

                // My first memory was...
                        // my father burning my back with a cigarette
                // When he was really into the sauce...
                        //
                // XXX: Needs an option to have the founder have been in the Army -- LK
                // XXX: Something I forgot.

         case 1:
            move(2,0);addstr("When I was bad...");
            move(5,0);
            if(choices || selection == 0)
               addstr("A - my parents grounded me and hid my toys, but I knew where they put them."); // Toy box
            //SKILL_SECURITY 1
            //ATTRIBUTE_AGILITY 1
            move(7,0);
            if(choices || selection == 1)
               addstr("B - my father beat me.  I learned to take a punch earlier than most.");
            //SKILL_HANDTOHAND 1
            //ATTRIBUTE_HEALTH 1
            move(9,0);
            if(choices || selection == 2)
               addstr("C - I was sent to my room, where I studied quietly by myself, alone.");
            //SKILL_WRITING 1
            //ATTRIBUTE_INTELLIGENCE 1
            move(11,0);
            if(choices || selection == 3)
               addstr("D - my parents argued with each other about me, but I was never punished.");
            //SKILL_PERSUASION 1
            //ATTRIBUTE_HEART 1
            move(13,0);
            if(choices || selection == 4)
               addstr("E - my father lectured me endlessly, trying to make me think like him.");
            //SKILL_PSYCHOLOGY 1
            //ATTRIBUTE_CHARISMA 1

            /*switch(c)
            {
            case 'e':
               move(17,4);
               addstr("\"The worst has happened. Someone wanted to kill and killed");
               move(18,4);
               addstr("not only the a man, not only a Pole, not only a priest.");
               move(19,4);
               addstr("Someone wanted to kill the hope that it is possible to avoid");
               move(20,4);
               addstr("violence in Polish political life.\"");
               move(21,8);
               addstr("- Solidarity Leader Lech Walesa");
               break;
            default:
               break;
            }*/
            break;
         case 2:
            move(2,0);addstr("In elementary school...");
            move(5,0);
            if(choices || selection == 0)
               addstr("A - I was mischievous, and always up to something.");
            //SKILL_DISGUISE 1
            //ATTRIBUTE_AGILITY 1
            move(7,0);
            if(choices || selection == 1)
               addstr("B - I had a lot of repressed anger.  I hurt animals.");
            //SKILL_PSYCHOLOGY 1
            //ATTRIBUTE_STRENGTH 1
            //ATTRIBUTE_AGILITY 1
            //ATTRIBUTE_HEART -1 <--- !
            move(9,0);
            if(choices || selection == 2)
               addstr("C - I was at the head of the class, and I worked very hard.");
            //ATTRIBUTE_INTELLIGENCE 1
            //SKILL_WRITING 1
            move(11,0);
            if(choices || selection == 3)
               addstr("D - I was unruly and often fought with the other children.");
            //SKILL_HANDTOHAND 1
            //ATTRIBUTE_STRENGTH 1
            move(13,0);
            if(choices || selection == 4)
               addstr("E - I was the class clown.  I even had some friends.");
            //SKILL_PERSUASION 1
            //ATTRIBUTE_CHARISMA 1
            break;
         case 3:
            move(2,0);addstr("When I turned 10...");
            move(5,0);
            if(choices || selection == 0)
               addstr("A - my parents divorced.  Whenever I talked, they argued, so I stayed quiet.");
            //SKILL_STEALTH 1
            move(7,0);
            if(choices || selection == 1)
               addstr("B - my parents divorced.  Violently.");
            //SKILL_HANDTOHAND 1
            move(9,0);
            if(choices || selection == 2)
               addstr("C - my parents divorced.  Acrimoniously.  I once tripped over the paperwork!");
            //SKILL_LAW 1
            move(11,0);
            if(choices || selection == 3)
               addstr("D - my parents divorced.  Mom slept with the divorce lawyer.");
            //SKILL_SEDUCTION 1
            move(13,0);
            if(choices || selection == 4)
               addstr("E - my parents divorced.  It still hurts to read my old diary.");
            //SKILL_WRITING 1
            break;
         case 4:
            move(2,0);addstr("In junior high school...");
            move(5,0);
            if(choices || selection == 0)
               addstr("A - I was into chemistry.  I wanted to know what made the world tick.");
            //SKILL_SCIENCE 2
            //ATTRIBUTE_INTELLIGENCE 2
            move(7,0);
            if(choices || selection == 1)
               addstr("B - I played guitar in a grunge band.  We sucked, but so did life.");
            //SKILL_MUSIC 2
            //ATTRIBUTE_CHARISMA 2
            move(9,0);
            if(choices || selection == 2)
               addstr("C - I drew things, a lot.  I was drawing a world better than this.");
            //SKILL_ART 2
            //ATTRIBUTE_HEART 2
            move(11,0);
            if(choices || selection == 3)
               addstr("D - I played violent video games at home.  I was a total outcast.");
            //SKILL_COMPUTERS 2
            //ATTRIBUTE_AGILITY 2
            move(13,0);
            if(choices || selection == 4)
               addstr("E - I was obsessed with swords, and started lifting weights.");
            //SKILL_SWORD 2
            //ATTRIBUTE_STRENGTH 2
            break;
         case 5:
            move(2,0);addstr("Things were getting really bad...");
            move(5,0);
            if(choices || selection == 0)
               addstr("A - when I stole my first car.  I got a few blocks before I totaled it.");
            //SKILL_DRIVING 1
            //SKILL_SECURITY 1
            move(7,0);
            if(choices || selection == 1)
               addstr("B - and I went to live with my dad.  He had been in Nam and he still drank.");
            //SKILL_SHOTGUN 1
            //SKILL_RIFLE 1
            //SKILL_PSYCHOLOGY 1
            move(9,0);
            if(choices || selection == 2)
               addstr("C - and I went completely goth.  I had no friends and made costumes by myself.");
            //SKILL_TAILORING 2
            move(11,0);
            if(choices || selection == 3)
               addstr("D - when I was sent to religious counseling, just stressing me out more.");
            //SKILL_RELIGION 1
            //SKILL_PSYCHOLOGY 1
            move(13,0);
            if(choices || selection == 4)
               addstr("E - and I tried being a teacher's assistant.  It just made me a target.");
            //SKILL_TEACHING 2
            break;
         case 6:
            move(2,0);addstr("Well, I knew it had reached a crescendo when...");
            move(5,0);
            if(choices || selection == 0)
               addstr("A - I stole a cop car when I was only 14.  I went to juvie for 6 months.");
            //SKILL_DRIVING 1
            //SKILL_SECURITY 1
            //ATTRIBUTE_INTELLIGENCE 1
            move(7,0);
            if(choices || selection == 1)
               addstr("B - my step mom shot her ex-husband, my dad, with a shotgun.  She got off.");//XXX: Sounds... Sexual...
            //SKILL_SHOTGUN 2
            //ATTRIBUTE_AGILITY 1
            move(9,0);
            if(choices || selection == 2)
               addstr("C - I tried wrestling for a quarter, desperate to fit in.");
            //ATTRIBUTE_STRENGTH 1
            //SKILL_HANDTOHAND 2
            move(11,0);
            if(choices || selection == 3)
               addstr("D - I got caught making out, and now I needed to be 'cured' of homosexuality.");
            //SKILL_SEDUCTION 1
            //SKILL_RELIGION 1
            //ATTRIBUTE_HEART 1
            move(13,0);
            if(choices || selection == 4)
               addstr("E - I resorted to controlling people.  Had my own clique of outcasts.");
            //SKILL_PERSUASION 2
            //ATTRIBUTE_CHARISMA 1
            break;
         case 7:
            move(2,0);addstr("I was only 15 when I ran away, and...");
            move(5,0);
            if(choices || selection == 0)
               addstr("A - I started robbing houses:  rich people only.  I was fed up with their crap.");
            //SKILL_SECURITY 1
            //SKILL_STEALTH 1
            //ATTRIBUTE_AGILITY 1
            move(7,0);
            if(choices || selection == 1)
               addstr("B - I hung out with thugs and beat the shit out of people.");
            //ATTRIBUTE_STRENGTH 1
            //SKILL_HANDTOHAND 2
            move(9,0);
            if(choices || selection == 2)
               addstr("C - I got a horrible job working fast food, smiling as people fed the man.");
            //ATTRIBUTE_CHARISMA 1
            //SKILL_BUSINESS 2
            move(11,0);
            if(choices || selection == 3)
               addstr("D - I let people pay me for sex.  I needed the money to survive.");
            //ATTRIBUTE_HEART -1
            //ATTRIBUTE_CHARISMA 2
            //SKILL_SEDUCTION 2
            move(13,0);
            if(choices || selection == 4)
               addstr("E - I volunteered for a left-wing candidate. It wasn't *real*, though, you know?");
            //ATTRIBUTE_INTELLIGENCE 1
            //SKILL_LAW 1
            //SKILL_PERSUASION 1
            break;
         case 8:
            move(2,0);addstr("Life went on.  On my 18th birthday...");
            move(5,0);
            if(choices || selection == 0)
               addstr("A - I got my hands on a sports car. The owner must have been pissed.");
            move(7,0);
            if(choices || selection == 1)
               addstr("B - I bought myself an assault rifle.");
            move(9,0);
            if(choices || selection == 2)
               addstr("C - I celebrated.  I'd saved a thousand bucks!");
            move(11,0);
            if(choices || selection == 3)
               addstr("D - I went to a party and met a cool law student.  We've been dating since.");//XXX: No Seduction?
            move(13,0);
            if(choices || selection == 4)
               addstr("E - I managed to acquire secret maps of several major buildings downtown.");
            break;
         case 9:
            move(2,0);addstr("For the past few years, I've been...");
            move(5,0);
            if(choices || selection == 0)
               addstr("A - stealing from Corporations.  I know they're still keeping more secrets.");
            //ATTRIBUTE_INTELLIGENCE 2
            //ATTRIBUTE_AGILITY 2
            //SKILL_SECURITY 2
            //SKILL_STEALTH 2
            // +Downtown apartment
            // +$500 (one month rent)
            move(7,0);
            if(choices || selection == 1)
               addstr("B - a violent criminal.  Nothing can change me, or stand in my way.");
            //SKILL_RIFLE 2
            //SKILL_PISTOL 2
            //SKILL_STREETSENSE 2
            //ATTRIBUTE_AGILITY 2
            //ATTRIBUTE_HEALTH 2
            //ATTRIBUTE_STRENGTH 2
            // +Crack house (with stockpiled rations)
            // +A crew (four gang members with knives and pistols)
            move(9,0);
            if(choices || selection == 2)
               addstr("C - taking college courses.  I can see how much the country needs help.");
            //SKILL_SCIENCE 2
            //SKILL_COMPUTERS 2
            //SKILL_WRITING 2
            //SKILL_TEACHING 2
            //SKILL_BUSINESS 1
            //SKILL_LAW 1
            //ATTRIBUTE_INTELLIGENCE 4
            // +University apartment
            // +$200 (one month rent)
            move(11,0);
            if(choices || selection == 3)
               addstr("D - surviving alone, just like anyone.  But we can't go on like this.");
            //SKILL_FIRSTAID 2
            //SKILL_STREETSENSE 2
            //ATTRIBUTE_INTELLIGENCE 1
            //ATTRIBUTE_AGILITY 1
            //ATTRIBUTE_HEALTH 2
            // +Homeless shelter
            // +1 all stats (except Wisdom)
            move(13,0);
            if(choices || selection == 4)
               addstr("E - writing my manifesto and refining my image.  I'm ready to lead.");
            //ATTRIBUTE_CHARISMA 2
            //ATTRIBUTE_INTELLIGENCE 2
            //SKILL_LAW 1
            //SKILL_PERSUASION 2
            //SKILL_WRITING 1
            // +Industrial apartment
            // +$100 (one month rent)
            // +50 juice
            move(17,0);
            addstr("I live in ");
            if(!multipleCityMode) addstr(lcityname);
            else addstr("Seattle, WA");
            addstr(", and it's about to experience real change.");
            break;
      }

      do
      {
         c=getkey();
         if(!choices) c='a'+selection;
      } while(c<'a'||c>'e');

      switch(q)
      {
         case 0:
            // Oct. 19, 1984
            if(c=='a')
            {
               newcr->adjust_attribute(ATTRIBUTE_AGILITY,+2);
               newcr->birthday_month = 10;
               newcr->birthday_day = 19;
            }
            // Mar. 3, 1984
            if(c=='b')
            {
               newcr->adjust_attribute(ATTRIBUTE_STRENGTH,+2);
               newcr->birthday_month = 3;
               newcr->birthday_day = 3;
            }
            // Jan. 24, 1984
            if(c=='c')
            {
               newcr->adjust_attribute(ATTRIBUTE_INTELLIGENCE,+2);
               newcr->birthday_month = 1;
               newcr->birthday_day = 24;
            }
            // Oct. 16, 1984
            if(c=='d')
            {
               newcr->adjust_attribute(ATTRIBUTE_HEART,+2);
               newcr->birthday_month = 10;
               newcr->birthday_day = 16;
            }
            // Sep. 4, 1984
            if(c=='e')
            {
               newcr->adjust_attribute(ATTRIBUTE_CHARISMA,+2);
               newcr->birthday_month = 9;
               newcr->birthday_day = 4;
            }
            newcr->age = year - 1984;
            // Don't count this year in founder's age if starting before birthday
            if(month < newcr->birthday_month ||
               (month==newcr->birthday_month && day<newcr->birthday_day))
            {
               newcr->age--;
            }
            break;
         case 1:
            if(c=='a')
            {
               newcr->set_skill(SKILL_SECURITY,newcr->get_skill(SKILL_SECURITY)+(1));
               newcr->adjust_attribute(ATTRIBUTE_AGILITY,+1);
            }
            if(c=='b')
            {
               newcr->set_skill(SKILL_HANDTOHAND,newcr->get_skill(SKILL_HANDTOHAND)+(1));
               newcr->adjust_attribute(ATTRIBUTE_HEALTH,+1);
            }
            if(c=='c')
            {
               newcr->adjust_attribute(ATTRIBUTE_INTELLIGENCE,+1);
               newcr->set_skill(SKILL_WRITING,newcr->get_skill(SKILL_WRITING)+(1));
            }
            if(c=='d')
            {
               newcr->set_skill(SKILL_PERSUASION,newcr->get_skill(SKILL_PERSUASION)+(1));
               newcr->adjust_attribute(ATTRIBUTE_HEART,+1);
            }
            if(c=='e')
            {
               newcr->set_skill(SKILL_PSYCHOLOGY,newcr->get_skill(SKILL_PSYCHOLOGY)+(1));
               newcr->adjust_attribute(ATTRIBUTE_CHARISMA,+1);
            }
            break;
         case 2:
            if(c=='a')
            {
               newcr->set_skill(SKILL_DISGUISE,newcr->get_skill(SKILL_DISGUISE)+(1));
               newcr->adjust_attribute(ATTRIBUTE_AGILITY,+1);
            }
            if(c=='b')
            {
               newcr->set_skill(SKILL_PSYCHOLOGY,newcr->get_skill(SKILL_PSYCHOLOGY)+(1));
               newcr->adjust_attribute(ATTRIBUTE_AGILITY,+1);
               newcr->adjust_attribute(ATTRIBUTE_HEART,-1);
               newcr->adjust_attribute(ATTRIBUTE_STRENGTH,+1);
            }
            if(c=='c')
            {
               newcr->adjust_attribute(ATTRIBUTE_INTELLIGENCE,+1);
               newcr->set_skill(SKILL_WRITING,newcr->get_skill(SKILL_WRITING)+(1));
            }
            if(c=='d')
            {
               newcr->adjust_attribute(ATTRIBUTE_STRENGTH,+1);
               newcr->set_skill(SKILL_HANDTOHAND,newcr->get_skill(SKILL_HANDTOHAND)+(1));
            }
            if(c=='e')
            {
               newcr->set_skill(SKILL_PERSUASION,newcr->get_skill(SKILL_PERSUASION)+(1));
               newcr->adjust_attribute(ATTRIBUTE_CHARISMA,+1);
            }
            break;
         case 3:
            if(c=='a')
            {
               newcr->set_skill(SKILL_STEALTH,newcr->get_skill(SKILL_STEALTH)+(1));
            }
            if(c=='b')
            {
               newcr->set_skill(SKILL_HANDTOHAND,newcr->get_skill(SKILL_HANDTOHAND)+(1));
            }
            if(c=='c')
            {
               newcr->set_skill(SKILL_LAW,newcr->get_skill(SKILL_LAW)+(1));
            }
            if(c=='d')
            {
               newcr->set_skill(SKILL_SEDUCTION,newcr->get_skill(SKILL_SEDUCTION)+(1));
            }
            if(c=='e')
            {
               newcr->set_skill(SKILL_WRITING,newcr->get_skill(SKILL_WRITING)+1);
            }
            break;
         case 4:
            if(c=='a')
            {
               newcr->set_skill(SKILL_SCIENCE,newcr->get_skill(SKILL_SCIENCE)+(2));
               newcr->adjust_attribute(ATTRIBUTE_INTELLIGENCE,+2);
            }
            if(c=='b')
            {
               newcr->set_skill(SKILL_MUSIC,newcr->get_skill(SKILL_MUSIC)+(2));
               newcr->adjust_attribute(ATTRIBUTE_CHARISMA,+2);
            }
            if(c=='c')
            {
               newcr->set_skill(SKILL_ART,newcr->get_skill(SKILL_ART)+(2));
               newcr->adjust_attribute(ATTRIBUTE_HEART,+2);
            }
            if(c=='d')
            {
               newcr->set_skill(SKILL_COMPUTERS,newcr->get_skill(SKILL_COMPUTERS)+(2));
               newcr->adjust_attribute(ATTRIBUTE_AGILITY,+2);
            }
            if(c=='e')
            {
               newcr->adjust_attribute(ATTRIBUTE_STRENGTH,+2);
               newcr->set_skill(SKILL_SWORD,newcr->get_skill(SKILL_SWORD)+(2));
            }
            break;
         case 5:
            if(c=='a')
            {
               newcr->set_skill(SKILL_DRIVING,newcr->get_skill(SKILL_DRIVING)+(1));
               newcr->set_skill(SKILL_SECURITY,newcr->get_skill(SKILL_SECURITY)+(1));
            }
            if(c=='b')
            {
               newcr->set_skill(SKILL_SHOTGUN,newcr->get_skill(SKILL_SHOTGUN)+(1));
               newcr->set_skill(SKILL_RIFLE,newcr->get_skill(SKILL_RIFLE)+(1));
               newcr->set_skill(SKILL_PSYCHOLOGY,newcr->get_skill(SKILL_PSYCHOLOGY)+(1));
            }
            if(c=='c')
            {
               newcr->set_skill(SKILL_TAILORING,newcr->get_skill(SKILL_TAILORING)+(2));
            }
            if(c=='d')
            {
               newcr->set_skill(SKILL_RELIGION,newcr->get_skill(SKILL_RELIGION)+(1));
               newcr->set_skill(SKILL_PSYCHOLOGY,newcr->get_skill(SKILL_PSYCHOLOGY)+(1));
            }
            if(c=='e')
            {
               newcr->set_skill(SKILL_TEACHING,newcr->get_skill(SKILL_TEACHING)+(2));
            }
            break;
         case 6:
            if(c=='a')
            {
               newcr->set_skill(SKILL_DRIVING,newcr->get_skill(SKILL_DRIVING)+(1));
               newcr->set_skill(SKILL_SECURITY,newcr->get_skill(SKILL_SECURITY)+(1));
               newcr->adjust_attribute(ATTRIBUTE_INTELLIGENCE,+1);
            }
            if(c=='b')
            {
               newcr->set_skill(SKILL_SHOTGUN,newcr->get_skill(SKILL_SHOTGUN)+(2));
               newcr->adjust_attribute(ATTRIBUTE_AGILITY,+1);
            }
            if(c=='c')
            {
               newcr->adjust_attribute(ATTRIBUTE_STRENGTH,+1);
               newcr->set_skill(SKILL_HANDTOHAND,newcr->get_skill(SKILL_HANDTOHAND)+(2));
            }
            if(c=='d')
            {
               newcr->set_skill(SKILL_SEDUCTION,newcr->get_skill(SKILL_SEDUCTION)+(1));
               newcr->set_skill(SKILL_RELIGION,newcr->get_skill(SKILL_RELIGION)+(1));
               newcr->adjust_attribute(ATTRIBUTE_HEART,+1);
               gaylawyer=true;
            }
            if(c=='e')
            {
               newcr->set_skill(SKILL_PERSUASION,newcr->get_skill(SKILL_PERSUASION)+(2));
               newcr->adjust_attribute(ATTRIBUTE_CHARISMA,+1);
            }
            break;
         case 7:
            if(c=='a')
            {
               newcr->set_skill(SKILL_SECURITY,newcr->get_skill(SKILL_SECURITY)+(1));
               newcr->set_skill(SKILL_STEALTH,newcr->get_skill(SKILL_STEALTH)+(1));
               newcr->adjust_attribute(ATTRIBUTE_AGILITY,+1);
            }
            if(c=='b')
            {
               newcr->adjust_attribute(ATTRIBUTE_STRENGTH,+1);
               newcr->set_skill(SKILL_HANDTOHAND,newcr->get_skill(SKILL_HANDTOHAND)+(2));
            }
            if(c=='c')
            {
               newcr->adjust_attribute(ATTRIBUTE_CHARISMA,+1);
               newcr->set_skill(SKILL_BUSINESS,newcr->get_skill(SKILL_BUSINESS)+(2));
            }
            if(c=='d')
            {
               newcr->adjust_attribute(ATTRIBUTE_HEART,-1);
               newcr->adjust_attribute(ATTRIBUTE_CHARISMA,+2);
               newcr->set_skill(SKILL_SEDUCTION,newcr->get_skill(SKILL_SEDUCTION)+(2));
            }
            if(c=='e')
            {
               newcr->adjust_attribute(ATTRIBUTE_INTELLIGENCE,+1);
               newcr->set_skill(SKILL_LAW,newcr->get_skill(SKILL_LAW)+(1));
               newcr->set_skill(SKILL_PERSUASION,newcr->get_skill(SKILL_PERSUASION)+(1));
            }
            break;
         case 8:
            if(c=='a')
            {
               startcar = new Vehicle(*vehicletype[getvehicletype("SPORTSCAR")]);
               // Add heat to the starting vehicle because it is stolen.
               // This is so that you can't immediately sell it at full price.
               startcar->add_heat(10);
               vehicle.push_back(startcar);
               newcr->pref_carid = startcar->id();
            }
            if(c=='b')
            {
               Weapon neww(*weapontype[getweapontype("WEAPON_AUTORIFLE_AK47")]);
               Clip newc(*cliptype[getcliptype("CLIP_ASSAULT")],9);
               newcr->give_weapon(neww,NULL);
               newcr->take_clips(newc,9);
            }
            if(c=='c')
            {
               ledger.force_funds(1000);
            }
            if(c=='d')
            {
               makelawyer=true;
            }
            if(c=='e')
            {
               hasmaps=true;
            }
            break;
         case 9:
            if(c=='a')
            {
               newcr->adjust_attribute(ATTRIBUTE_INTELLIGENCE,+2);
               newcr->adjust_attribute(ATTRIBUTE_AGILITY,+2);
               newcr->set_skill(SKILL_SECURITY,newcr->get_skill(SKILL_SECURITY)+(2));
               newcr->set_skill(SKILL_STEALTH,newcr->get_skill(SKILL_STEALTH)+(2));
               newcr->type = CREATURE_THIEF;
               newcr->type_idname = "CREATURE_THIEF";
               base = SITE_RESIDENTIAL_APARTMENT_UPSCALE;
               ledger.force_funds(ledger.get_funds()+500);

               Armor newa(*armortype[getarmortype("ARMOR_BLACKCLOTHES")]);
               newcr->give_armor(newa,NULL);
            }
            if(c=='b')
            {
               newcr->set_skill(SKILL_RIFLE,newcr->get_skill(SKILL_RIFLE)+(2));
               newcr->set_skill(SKILL_PISTOL,newcr->get_skill(SKILL_PISTOL)+(2));
               newcr->set_skill(SKILL_STREETSENSE,newcr->get_skill(SKILL_STREETSENSE)+(2));
               newcr->adjust_attribute(ATTRIBUTE_AGILITY,+2);
               newcr->adjust_attribute(ATTRIBUTE_HEALTH,+2);
               newcr->adjust_attribute(ATTRIBUTE_STRENGTH,+2);
               newcr->type = CREATURE_GANGMEMBER;
               newcr->type_idname = "CREATURE_GANGMEMBER";
               base = SITE_BUSINESS_CRACKHOUSE;
               recruits = RECRUITS_GANG;
            }
            if(c=='c')
            {
               newcr->adjust_attribute(ATTRIBUTE_INTELLIGENCE,+4);
               newcr->set_skill(SKILL_SCIENCE,newcr->get_skill(SKILL_SCIENCE)+(2));
               newcr->set_skill(SKILL_COMPUTERS,newcr->get_skill(SKILL_COMPUTERS)+(2));
               newcr->set_skill(SKILL_WRITING,newcr->get_skill(SKILL_WRITING)+(2));
               newcr->set_skill(SKILL_TEACHING,newcr->get_skill(SKILL_TEACHING)+(2));
               newcr->set_skill(SKILL_BUSINESS,newcr->get_skill(SKILL_BUSINESS)+(1));
               newcr->set_skill(SKILL_LAW,newcr->get_skill(SKILL_LAW)+(1));
               newcr->type = CREATURE_COLLEGESTUDENT;
               newcr->type_idname = "CREATURE_COLLEGESTUDENT";
               base = SITE_RESIDENTIAL_APARTMENT;
               ledger.force_funds(ledger.get_funds()+200);
            }
            if(c=='d')
            {
               newcr->adjust_attribute(ATTRIBUTE_INTELLIGENCE,+1);
               newcr->adjust_attribute(ATTRIBUTE_AGILITY,+1);
               newcr->adjust_attribute(ATTRIBUTE_HEALTH,+2);
               newcr->set_skill(SKILL_FIRSTAID,newcr->get_skill(SKILL_FIRSTAID)+(2));
               newcr->set_skill(SKILL_STREETSENSE,newcr->get_skill(SKILL_STREETSENSE)+(2));
               newcr->type = CREATURE_HSDROPOUT;
               newcr->type_idname = "CREATURE_HSDROPOUT";
               base = SITE_RESIDENTIAL_SHELTER;

               newcr->adjust_attribute(ATTRIBUTE_HEART,+1);
               newcr->adjust_attribute(ATTRIBUTE_INTELLIGENCE,+1);
               newcr->adjust_attribute(ATTRIBUTE_AGILITY,+1);
               newcr->adjust_attribute(ATTRIBUTE_STRENGTH,+1);
               newcr->adjust_attribute(ATTRIBUTE_HEALTH,+1);
               newcr->adjust_attribute(ATTRIBUTE_CHARISMA,+1);
            }
            if(c=='e')
            {
               newcr->adjust_attribute(ATTRIBUTE_CHARISMA,+2);
               newcr->adjust_attribute(ATTRIBUTE_INTELLIGENCE,+2);
               newcr->set_skill(SKILL_LAW,newcr->get_skill(SKILL_LAW)+(1));
               newcr->set_skill(SKILL_WRITING,newcr->get_skill(SKILL_WRITING)+(1));
               newcr->set_skill(SKILL_PERSUASION,newcr->get_skill(SKILL_PERSUASION)+(2));
               newcr->type = CREATURE_POLITICALACTIVIST;
               newcr->type_idname = "CREATURE_POLITICALACTIVIST";
               base = SITE_RESIDENTIAL_TENEMENT;
               ledger.force_funds(ledger.get_funds()+50);
               newcr->juice+=50;
            }
            break;
      }
   }

   erase();
   set_color(COLOR_WHITE,COLOR_BLACK,1);
   move(2,2);
   addstr("A NEW CONSERVATIVE ERA", gamelog);
   gamelog.newline();

   set_color(COLOR_WHITE,COLOR_BLACK,0);
   move(4,2);
   addstr("The Year is ", gamelog);
   addstr(year, gamelog);
   addstr(".", gamelog);
   move(6,2);
   gamelog.newline();
   addstr("Conservative President ", gamelog);
   char president[80];
   generate_name(president,GENDER_WHITEMALEPATRIARCH);
   addstr(president, gamelog);
   addstr(" ends his second term with approval", gamelog);
   move(7,2);
   gamelog.newline();
   addstr("ratings in the high 70s, and is succeeded by hardcore Arch-Conservative", gamelog);
   move(8,2);
   gamelog.newline();
   addstr(execname[EXEC_PRESIDENT], gamelog);
   addstr(".", gamelog);
   gamelog.nextMessage();

   move(10,2);
   addstr("With Conservatives sweeping into power in the House of Representatives", gamelog);
   move(11,2);
   gamelog.newline();
   addstr("and Senate, and a Conservative majority in the Supreme Court of the", gamelog);
   move(12,2);
   gamelog.newline();
   addstr("United States, commentators are hailing it as the beginning of a new", gamelog);
   move(13,2);
   gamelog.newline();
   addstr("Conservative era.", gamelog);
   gamelog.nextMessage();

   move(15,2);
   set_color(COLOR_RED,COLOR_BLACK,1);
   addstr("President ", gamelog);
   addstr(execname[EXEC_PRESIDENT], gamelog);
   addstr(" has asked the new Congress to move quickly", gamelog);
   move(16,2);
   gamelog.newline();
   addstr("to rubber stamp his radical Arch-Conservative agenda. ", gamelog);
   set_color(COLOR_WHITE,COLOR_BLACK,0);
   addstr("The left seems", gamelog);
   gamelog.newline();
   move(17,2);
   addstr("powerless to stop this imminent trampling of Liberal Sanity and Justice.", gamelog);
   gamelog.nextMessage();

   move(19,2);
   addstr("In this dark time, the Liberal Crime Squad is born...", gamelog);
   gamelog.nextMessage();

   getkey();

   erase();
   set_color(COLOR_WHITE,COLOR_BLACK,1);
   move(0,0);
   addstr("What is your name to the People?");
   set_color(COLOR_WHITE,COLOR_BLACK,0);
   move(1,0);
   addstr("Press enter to be known by your real name instead.");

   enter_name(2,0,newcr->name,CREATURE_NAMELEN,newcr->propername);

   pool.push_back(newcr);

   make_world(hasmaps);

   squadst *newsq=new squadst;
   newsq->id=0;cursquadid++;
   newsq->squad[0]=newcr;
   newcr->squadid=0;
   strcpy(newsq->name,"The Liberal Crime Squad");
   for(int l=0;l<len(location);l++)
   {
      if(location[l]->type==base)
      {
         newcr->base=l;
         newcr->location=l;
         if(startcar) startcar->set_location(l);
         switch(base)
         {
         case SITE_RESIDENTIAL_APARTMENT_UPSCALE:location[l]->renting=500;break;
         case SITE_RESIDENTIAL_APARTMENT:location[l]->renting=200;break;
         case SITE_RESIDENTIAL_TENEMENT:location[l]->renting=100;break;
         case SITE_BUSINESS_CRACKHOUSE:
            location[l]->renting=RENTING_PERMANENT;
            location[l]->compound_stores+=100;
            break;
         }
         location[l]->newrental=1;

         switch(recruits)
         {
         case RECRUITS_GANG:
            for(int i=0;i<4;i++)
            {
               Creature* recruit = new Creature;
               makecreature(*recruit,CREATURE_GANGMEMBER);
               if(recruit->get_weapon().get_itemtypename() == "WEAPON_AUTORIFLE_AK47" ||
                  recruit->get_weapon().get_itemtypename() == "WEAPON_SMG_MP5" ||
                 !recruit->is_armed())
               {
                  Weapon w(*weapontype[getweapontype("WEAPON_SEMIPISTOL_9MM")]);
                  recruit->give_weapon(w,NULL);
                  Clip c(*cliptype[getcliptype("CLIP_9")],4);
                  recruit->take_clips(c,4);
                  recruit->reload(false);
               }

               recruit->align=ALIGN_LIBERAL;
               recruit->set_attribute(ATTRIBUTE_HEART,
                                      recruit->get_attribute(ATTRIBUTE_HEART,false)+
                                      recruit->get_attribute(ATTRIBUTE_WISDOM,false)/2);
               recruit->set_attribute(ATTRIBUTE_WISDOM,
                                      recruit->get_attribute(ATTRIBUTE_WISDOM,false)/2);

               recruit->namecreature();
               strcpy(recruit->name,recruit->propername);

               recruit->location=l;
               recruit->base=l;

               recruit->hireid=newcr->id;

               newsq->squad[i+1]=recruit;
               recruit->squadid=newsq->id;
               pool.push_back(recruit);
            }
            break;
         }

         #ifdef GIVEBLOODYARMOR
         Armor *newa= new Armor(*armortype[getarmortype("ARMOR_CLOTHES")]);
         newa->set_bloody(true);
         location[l]->loot.push_back(newi);
         #endif

         #ifdef HIGHFUNDS
         ledger.force_funds(100000);
         #endif

         break;
      }
   }
   //newcr->juice=0;
   squad.push_back(newsq);
   activesquad=newsq;

   if(makelawyer)
   {
      Creature* lawyer=new Creature;
      makecreature(*lawyer,CREATURE_LAWYER);
      // Make sure lawyer is of the appropriate gender for dating the main character;
      // opposite sex by default, same sex if the option was chosen that mentions
      // homosexuality
      if(gaylawyer)
      {
         lawyer->gender_conservative=lawyer->gender_liberal=newcr->gender_conservative;

         // neutral founder gets neutral partner
      }
      else
      {
         if(newcr->gender_conservative==GENDER_MALE)
            lawyer->gender_liberal=lawyer->gender_conservative=GENDER_FEMALE;

         if(newcr->gender_conservative==GENDER_FEMALE)
            lawyer->gender_liberal=lawyer->gender_conservative=GENDER_MALE;

         // neutral founder gets random partner
      }

      // Ensure the lawyer has good heart/wisdom stats
      if(lawyer->get_attribute(ATTRIBUTE_HEART,false)<newcr->get_attribute(ATTRIBUTE_HEART,false)-2)
         lawyer->adjust_attribute(ATTRIBUTE_HEART,-2);

      lawyer->set_attribute(ATTRIBUTE_WISDOM,1);

      lawyer->namecreature();
      lawyer->flag|=CREATUREFLAG_SLEEPER;
      lawyer->flag|=CREATUREFLAG_LOVESLAVE;
      lawyer->align=ALIGN_LIBERAL;
      lawyer->infiltration=0.3f;
      lawyer->age=28;

      location[lawyer->worklocation]->mapped=1;
      lawyer->hireid=newcr->id;
      pool.push_back(lawyer);
      lawyer->location=lawyer->base=lawyer->worklocation;
   }

   uniqueCreatures.initialize();
}
コード例 #14
0
/* rolls up a creature's stats and equipment */
void makecreature(Creature &cr,short type)
{
   cr.drop_weapons_and_clips(NULL); // Get rid of any old equipment from old encounters.
   cr.strip(NULL);                  //

   cr.creatureinit();
   cr.exists=1;
   cr.squadid=-1;
   cr.type=type;
   cr.infiltration=0;
   cr.location=cursite;
   cr.worklocation=cursite;
   verifyworklocation(cr);

   const CreatureType* crtype=getcreaturetype(type);
   crtype->make_creature(cr);
   int attnum=crtype->attribute_points_.roll();
   int attcap[ATTNUM];
   for(int i=0;i<ATTNUM;i++)
   {
      cr.set_attribute(i,crtype->attributes_[i].min);
      attcap[i]=crtype->attributes_[i].max;
   }

   switch(type)
   {
      case CREATURE_BOUNCER:
         if(mode==GAMEMODE_SITE && location[cursite]->highsecurity)
         {
            strcpy(cr.name,"Enforcer");
            cr.set_skill(SKILL_CLUB,LCSrandom(3)+3);
         }
         if(law[LAW_GUNCONTROL]==-2)
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SMG_MP5")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_SMG")],4);
         }
         else if(law[LAW_GUNCONTROL]==-1)
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_REVOLVER_44")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_44")],4);
         }
         else if(law[LAW_GUNCONTROL]==0)
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_REVOLVER_38")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_38")],4);
         }
         else
            cr.give_weapon(*weapontype[getweapontype("WEAPON_NIGHTSTICK")],NULL);
         cr.reload(false);
         if(disguisesite(sitetype))
         {
            cr.align=ALIGN_CONSERVATIVE;
            cr.infiltration=0.1f*LCSrandom(4);
         }
         else cr.align=ALIGN_MODERATE;
         break;
      case CREATURE_SECURITYGUARD:
         if(law[LAW_GUNCONTROL]==-2)
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SMG_MP5")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_SMG")],4);
         }
         else if(law[LAW_GUNCONTROL]!=2)
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_REVOLVER_38")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_38")],4);
         }
         else
            cr.give_weapon(*weapontype[getweapontype("WEAPON_NIGHTSTICK")],NULL);
         cr.reload(false);
         break;
      case CREATURE_SCIENTIST_LABTECH:
         crtype->give_weapon_civilian(cr);
         if(!cr.is_armed()&&!LCSrandom(2))
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SYRINGE")],NULL);
         break;
      case CREATURE_JUDGE_CONSERVATIVE:
         if(law[LAW_GUNCONTROL]==-2&&!LCSrandom(3))
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_REVOLVER_44")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_44")],4);
         }
         else if(!LCSrandom(2))
            cr.give_weapon(*weapontype[getweapontype("WEAPON_GAVEL")],NULL);
         cr.reload(false);
         break;
      case CREATURE_SCIENTIST_EMINENT:
         crtype->give_weapon_civilian(cr);
         if(!cr.is_armed()&&!LCSrandom(2))
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SYRINGE")],NULL);
         break;
      case CREATURE_CORPORATE_CEO:
         generate_name(cr.propername,GENDER_WHITEMALEPATRIARCH);
         strcpy(cr.name,"CEO ");
         strcat(cr.name,cr.propername);
         cr.dontname=true;
         break;
      case CREATURE_WORKER_FACTORY_NONUNION:
         crtype->give_weapon_civilian(cr);
         if(!cr.is_armed())
            cr.give_weapon(*weapontype[getweapontype("WEAPON_CHAIN")],NULL);
         if(cr.align==ALIGN_LIBERAL) cr.align=LCSrandom(2)-1;
         break;
      case CREATURE_WORKER_SWEATSHOP:
         cr.flag|=CREATUREFLAG_ILLEGALALIEN;
         break;
      case CREATURE_LAWYER:
         if(law[LAW_GUNCONTROL]==-2 && !LCSrandom(3))
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_REVOLVER_38")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_38")],1);
            cr.reload(false);
         }
         break;
      case CREATURE_DOCTOR:
         if(law[LAW_GUNCONTROL]==-2 && !LCSrandom(3))
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_REVOLVER_38")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_38")],1);
            cr.reload(false);
         }
         break;
      case CREATURE_PSYCHOLOGIST:
         if(law[LAW_GUNCONTROL]==-2 && !LCSrandom(3))
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_REVOLVER_38")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_38")],1);
            cr.reload(false);
         }
         if(cr.gender_liberal==GENDER_MALE||LCSrandom(2))
            cr.give_armor(*armortype[getarmortype("ARMOR_CHEAPSUIT")],NULL);
         else
            cr.give_armor(*armortype[getarmortype("ARMOR_CHEAPDRESS")],NULL);
         break;
      case CREATURE_NURSE:
         if(law[LAW_GUNCONTROL]==-2 && !LCSrandom(3))
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_REVOLVER_38")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_38")],1);
            cr.reload(false);
         }
         break;
      case CREATURE_WORKER_FACTORY_UNION:
         crtype->give_weapon_civilian(cr);
         if(!cr.is_armed())
            cr.give_weapon(*weapontype[getweapontype("WEAPON_CHAIN")],NULL);
         break;
      case CREATURE_TANK:
         cr.animalgloss=ANIMALGLOSS_TANK;
         cr.specialattack=ATTACK_CANNON;
         break;
      case CREATURE_MERC:
         cr.give_weapon(*weapontype[getweapontype(law[LAW_GUNCONTROL]<1?"WEAPON_AUTORIFLE_M16":"WEAPON_SEMIRIFLE_AR15")],NULL);
         cr.take_clips(*cliptype[getcliptype("CLIP_ASSAULT")],7);
         cr.reload(false);
         break;
      case CREATURE_HICK:
         switch(LCSrandom(7))
         {
            case 0:strcpy(cr.name,"Country Boy");break;
			case 1:strcpy(cr.name,"Good ol' Boy");break;
			case 2:strcpy(cr.name,"Hick");break;
			case 3:strcpy(cr.name,"Hillbilly");break;
			case 4:strcpy(cr.name,"Redneck");break;
            case 5:strcpy(cr.name,"Rube");break;
            case 6:strcpy(cr.name,"Yokel");break;
         }
         if((law[LAW_GUNCONTROL]==-2&&!LCSrandom(2))||!LCSrandom(10))
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SHOTGUN_PUMP")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_BUCKSHOT")],4);
         }
         else
            cr.give_weapon(*weapontype[getweapontype(LCSrandom(2)?"WEAPON_TORCH":"WEAPON_PITCHFORK")],NULL);
         cr.reload(false);
         break;
      case CREATURE_COP:
         if(law[LAW_POLICEBEHAVIOR]==2 && cr.align==ALIGN_LIBERAL && !LCSrandom(3)) // Peace Officer
         {
            cr.align=ALIGN_MODERATE;
            strcpy(cr.name,"Police Negotiator");
            cr.set_skill(SKILL_PERSUASION,LCSrandom(4)+1);
            cr.set_skill(SKILL_PISTOL,LCSrandom(3)+1);
            cr.set_attribute(ATTRIBUTE_HEART,4);
         }
         else
         {
            if(law[LAW_GUNCONTROL]==-2 && !LCSrandom(3))
            {
               cr.give_weapon(*weapontype[getweapontype("WEAPON_SMG_MP5")],NULL);
               cr.take_clips(*cliptype[getcliptype("CLIP_SMG")],4);
            }
            else if(!LCSrandom(3))
            {
               cr.give_weapon(*weapontype[getweapontype("WEAPON_SEMIPISTOL_9MM")],NULL);
               cr.take_clips(*cliptype[getcliptype("CLIP_9")],4);
            }
            else if(!LCSrandom(2))
            {
               cr.give_weapon(*weapontype[getweapontype("WEAPON_SHOTGUN_PUMP")],NULL);
               cr.take_clips(*cliptype[getcliptype("CLIP_BUCKSHOT")],4);
            }
            else
               cr.give_weapon(*weapontype[getweapontype("WEAPON_NIGHTSTICK")],NULL);
            cr.reload(false);
            cr.align=ALIGN_CONSERVATIVE;
            cr.set_skill(SKILL_PISTOL,LCSrandom(4)+1);
            cr.set_skill(SKILL_SHOTGUN,LCSrandom(3)+1);
            cr.set_skill(SKILL_CLUB,LCSrandom(2)+1);
            cr.set_skill(SKILL_HANDTOHAND,LCSrandom(2)+1);
            cr.set_attribute(ATTRIBUTE_WISDOM,4);
         }
         break;
      case CREATURE_FIREFIGHTER:
         if(law[LAW_FREESPEECH]==-2)
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_FLAMETHROWER")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_GASOLINE")],4);
            cr.reload(false);
            cr.set_skill(SKILL_HEAVYWEAPONS,LCSrandom(3)+2);
            strcpy(cr.name,"Fireman");
            cr.align=ALIGN_CONSERVATIVE;
         }
         else
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_AXE")],NULL);
            cr.set_skill(SKILL_AXE,LCSrandom(3)+2);
            strcpy(cr.name,"Firefighter");
         }
         if(sitealarm) // Respond to emergencies in bunker gear
            cr.give_armor(*armortype[getarmortype("ARMOR_BUNKERGEAR")],NULL);
         break;
      case CREATURE_CCS_MOLOTOV:
         if(mode==GAMEMODE_SITE/* && sitealarm>0*/)
            nameCCSMember(cr);
         break;
      case CREATURE_CCS_SNIPER:
         if(mode==GAMEMODE_SITE/* && sitealarm>0*/)
            nameCCSMember(cr);
         break;
      case CREATURE_CCS_VIGILANTE:
         cr.give_armor(*armortype[getarmortype("ARMOR_CLOTHES")],NULL);
         switch(LCSrandom(5)+endgamestate)
         {
         case 0:
         case 1:
            break;
         case 2:
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SEMIPISTOL_9MM")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_9")],7);
            break;
         }
         case 3:
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_REVOLVER_44")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_44")],7);
            break;
         }
         case 4:
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SHOTGUN_PUMP")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_BUCKSHOT")],7);
            break;
         }
         case 5:
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SEMIRIFLE_AR15")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_ASSAULT")],7);
            cr.give_armor(*armortype[getarmortype("ARMOR_CIVILLIANARMOR")],NULL);
            break;
         }
         case 6:
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SEMIRIFLE_AR15")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_ASSAULT")],7);
            cr.give_armor(*armortype[getarmortype("ARMOR_ARMYARMOR")],NULL);
            break;
         }
         default:
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_AUTORIFLE_M16")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_ASSAULT")],7);
            cr.give_armor(*armortype[getarmortype("ARMOR_ARMYARMOR")],NULL);
            break;
         }
         }
         cr.reload(false);
         if(mode==GAMEMODE_SITE/* && sitealarm>0*/)
            nameCCSMember(cr);
         break;
      case CREATURE_CCS_ARCHCONSERVATIVE:
         strcpy(cr.name,(location[cursite]->siege.siege?"CCS Team Leader":(ccs_kills<2?"CCS Lieutenant":"CCS Founder")));
         break;
      case CREATURE_PRISONGUARD:
         if(law[LAW_GUNCONTROL]==-2&&!LCSrandom(3))
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SMG_MP5")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_SMG")],4);
         }
         else if(!LCSrandom(3))
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SHOTGUN_PUMP")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_BUCKSHOT")],4);
         }
         else
            cr.give_weapon(*weapontype[getweapontype("WEAPON_NIGHTSTICK")],NULL);
         cr.reload(false);
         break;
      case CREATURE_EDUCATOR:
         if(law[LAW_GUNCONTROL]==-2 && !LCSrandom(3))
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SMG_MP5")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_SMG")],4);
         }
         else if(!LCSrandom(3))
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SEMIPISTOL_9MM")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_9")],4);
         }
         else
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SYRINGE")],NULL);
         cr.reload(false);
         break;
      case CREATURE_GENETIC:
         if(location[cursite]->type==SITE_CORPORATE_HOUSE)
         {
            strcpy(cr.name,"Pet ");
            attcap[ATTRIBUTE_CHARISMA]=10;
         }
         else
            strcpy(cr.name,"");

         switch(LCSrandom(11))
         {
         case 0:strcat(cr.name,"Genetic Monster");break;
         case 1:strcat(cr.name,"Flaming Rabbit");
            cr.specialattack=ATTACK_FLAME;break;
         case 2:strcat(cr.name,"Genetic Nightmare");break;
         case 3:strcat(cr.name,"Mad Cow");break;
         case 4:strcat(cr.name,"Giant Mosquito");
            cr.specialattack=ATTACK_SUCK;break;
         case 5:strcat(cr.name,"Six-legged Pig");break;
         case 6:strcat(cr.name,"Purple Gorilla");break;
         case 7:strcat(cr.name,"Warped Bear");break;
         case 8:strcat(cr.name,"Writhing Mass");break;
         case 9:strcat(cr.name,"Something Bad");break;
         case 10:strcat(cr.name,"Pink Elephant");break;
         }
         cr.animalgloss=ANIMALGLOSS_ANIMAL;
         if(law[LAW_ANIMALRESEARCH]!=2)cr.money=0;
         break;
      case CREATURE_GUARDDOG:
         cr.animalgloss=ANIMALGLOSS_ANIMAL;
         if(law[LAW_ANIMALRESEARCH]!=2)cr.money=0;
         break;
      case CREATURE_PRISONER:
         // Prisoners should not be "prisoners" after recruiting them,
         // they should be some brand of criminal
         if(!LCSrandom(10))
         {
            // Thief
            makecreature(cr,CREATURE_THIEF);
         }
         else switch(LCSrandom(5))
         {
         case 0:
            // Gang member
            makecreature(cr,CREATURE_GANGMEMBER);
            break;
         case 1:
            // Prostitute
            makecreature(cr,CREATURE_PROSTITUTE);
            break;
         case 2:
            // Crack head
            makecreature(cr,CREATURE_CRACKHEAD);
            break;
         case 3:
            // Teenager
            makecreature(cr,CREATURE_TEENAGER);
            break;
         case 4:
            // HS Dropout
            makecreature(cr,CREATURE_HSDROPOUT);
            break;
         }

         cr.drop_weapons_and_clips(NULL);
         crtype->give_weapon(cr);
         cr.strip(NULL);
         crtype->give_armor(cr);
         cr.money=crtype->money_.roll();
         cr.juice=crtype->juice_.roll();
         cr.gender_liberal=cr.gender_conservative=crtype->roll_gender();
         strcpy(cr.name,crtype->get_encounter_name());
         if(cr.align==ALIGN_CONSERVATIVE)
            cr.align=LCSrandom(2);
         break;
      case CREATURE_BUM:
         crtype->give_weapon_civilian(cr);
         if(!cr.is_armed()&&!LCSrandom(5))
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SHANK")],NULL);
         if(cr.align==ALIGN_CONSERVATIVE)cr.align=LCSrandom(2);
         break;
      case CREATURE_MUTANT:
         crtype->give_weapon_civilian(cr);
         if(!cr.is_armed()&&!LCSrandom(5))
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SHANK")],NULL);
         break;
      case CREATURE_GANGMEMBER:
         if(!LCSrandom(20)||(law[LAW_GUNCONTROL]==-2&&!LCSrandom(5)))
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_AUTORIFLE_AK47")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_ASSAULT")],3);
         }
         else if(!LCSrandom(16)||(law[LAW_GUNCONTROL]==-2&&!LCSrandom(5)))
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SMG_MP5")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_SMG")],4);
         }
         else if(!LCSrandom(15))
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SEMIPISTOL_45")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_45")],4);
         }
         else if(!LCSrandom(10))
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SHOTGUN_PUMP")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_BUCKSHOT")],4);
         }
         else if(!LCSrandom(4))
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SEMIPISTOL_9MM")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_9")],4);
         }
         else if(!LCSrandom(2))
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_REVOLVER_38")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_38")],4);
         }
         else
            cr.give_weapon(*weapontype[getweapontype("WEAPON_COMBATKNIFE")],NULL);
         cr.reload(false);
         // We'll make the crack house a bit dicey
         if(location[cursite]->type==SITE_BUSINESS_CRACKHOUSE)cr.align=ALIGN_CONSERVATIVE;
         if(!LCSrandom(2))switch(LCSrandom(3))
         {
         case 0://cr.crimes_committed[LAWFLAG_BROWNIES]++;
            cr.crimes_suspected[LAWFLAG_BROWNIES]++;break;
         case 1://cr.crimes_committed[LAWFLAG_ASSAULT]++;
            cr.crimes_suspected[LAWFLAG_ASSAULT]++;break;
         case 2://cr.crimes_committed[LAWFLAG_MURDER]++;
            cr.crimes_suspected[LAWFLAG_MURDER]++;break;
         }
         break;
      case CREATURE_CRACKHEAD:
         crtype->give_weapon_civilian(cr);
         if(!LCSrandom(5))
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SHANK")],NULL);
         if(cr.align==ALIGN_CONSERVATIVE)cr.align=LCSrandom(2);
         attcap[ATTRIBUTE_HEALTH]=1+LCSrandom(5);
         break;
      case CREATURE_FASTFOODWORKER:
         cr.age=(LCSrandom(2)?AGE_TEENAGER:AGE_YOUNGADULT);
         break;
      case CREATURE_FOOTBALLCOACH:
         if(LCSrandom(2))
         {
            cr.set_attribute(ATTRIBUTE_HEALTH,5);
            cr.set_attribute(ATTRIBUTE_AGILITY,5);
            cr.set_attribute(ATTRIBUTE_STRENGTH,5);
         }
         break;
      case CREATURE_PROSTITUTE:
         if(LCSrandom(7))cr.gender_conservative=cr.gender_liberal=GENDER_FEMALE;
         else if(!LCSrandom(3))cr.gender_liberal=GENDER_FEMALE;
         if(cr.align==ALIGN_CONSERVATIVE)cr.align=LCSrandom(2);
         if(!LCSrandom(3))cr.crimes_suspected[LAWFLAG_PROSTITUTION]++;
         break;
      case CREATURE_HIPPIE:
         if(!LCSrandom(10))
            cr.crimes_suspected[LAWFLAG_BROWNIES]++;
         break;
      case CREATURE_SOCIALITE:
         cr.give_armor(*armortype[getarmortype(cr.gender_liberal==GENDER_FEMALE?"ARMOR_EXPENSIVEDRESS":"ARMOR_EXPENSIVESUIT")],NULL);
         break;
      case CREATURE_THIEF:
         switch(LCSrandom(5))
         {
            case 0:strcpy(cr.name,getcreaturetype(CREATURE_SOCIALITE)->get_encounter_name());break;
            case 1:strcpy(cr.name,getcreaturetype(CREATURE_CLERK)->get_encounter_name());break;
            case 2:strcpy(cr.name,getcreaturetype(CREATURE_OFFICEWORKER)->get_encounter_name());break;
            case 3:strcpy(cr.name,getcreaturetype(CREATURE_CRITIC_ART)->get_encounter_name());break;
            case 4:strcpy(cr.name,getcreaturetype(CREATURE_CRITIC_MUSIC)->get_encounter_name());break;
         }

         if(!LCSrandom(10))cr.crimes_suspected[(LCSrandom(2)?LAWFLAG_BREAKING:LAWFLAG_THEFT)]++;
         break;
      case CREATURE_MILITARYOFFICER:
         if(LCSrandom(4))
         {
            cr.give_weapon(*weapontype[getweapontype("WEAPON_SEMIPISTOL_9MM")],NULL);
            cr.take_clips(*cliptype[getcliptype("CLIP_9")],4);
            cr.reload(false);
         }
         break;
      case CREATURE_JUDGE_LIBERAL:
      case CREATURE_POLITICIAN:
      case CREATURE_CORPORATE_MANAGER:
      case CREATURE_WORKER_SERVANT:
      case CREATURE_WORKER_JANITOR:
      case CREATURE_WORKER_SECRETARY:
      case CREATURE_LANDLORD:
      case CREATURE_BANK_TELLER:
      case CREATURE_BANK_MANAGER:
      case CREATURE_TEENAGER:
      case CREATURE_SOLDIER:
      case CREATURE_VETERAN:
      case CREATURE_HARDENED_VETERAN:
      case CREATURE_SWAT:
      case CREATURE_DEATHSQUAD:
      case CREATURE_GANGUNIT:
      case CREATURE_AGENT:
      case CREATURE_SECRET_SERVICE:
      case CREATURE_RADIOPERSONALITY:
      case CREATURE_NEWSANCHOR:
      case CREATURE_JUROR:
      case CREATURE_WORKER_FACTORY_CHILD:
      case CREATURE_SEWERWORKER:
      case CREATURE_COLLEGESTUDENT:
      case CREATURE_MUSICIAN:
      case CREATURE_MATHEMATICIAN:
      case CREATURE_TEACHER:
      case CREATURE_HSDROPOUT:
      case CREATURE_PRIEST:
      case CREATURE_ENGINEER:
      case CREATURE_TELEMARKETER:
      case CREATURE_CARSALESMAN:
      case CREATURE_OFFICEWORKER:
      case CREATURE_MAILMAN:
      case CREATURE_GARBAGEMAN:
      case CREATURE_PLUMBER:
      case CREATURE_CHEF:
      case CREATURE_CONSTRUCTIONWORKER:
      case CREATURE_AMATEURMAGICIAN:
      case CREATURE_AUTHOR:
      case CREATURE_JOURNALIST:
      case CREATURE_CRITIC_ART:
      case CREATURE_CRITIC_MUSIC:
      case CREATURE_BIKER:
      case CREATURE_TRUCKER:
      case CREATURE_TAXIDRIVER:
      case CREATURE_PROGRAMMER:
      case CREATURE_NUN:
      case CREATURE_RETIREE:
      case CREATURE_PAINTER:
      case CREATURE_SCULPTOR:
      case CREATURE_DANCER:
      case CREATURE_PHOTOGRAPHER:
      case CREATURE_CAMERAMAN:
      case CREATURE_HAIRSTYLIST:
      case CREATURE_FASHIONDESIGNER:
      case CREATURE_CLERK:
      case CREATURE_ACTOR:
      case CREATURE_YOGAINSTRUCTOR:
      case CREATURE_MARTIALARTIST:
      case CREATURE_ATHLETE:
      case CREATURE_LOCKSMITH:
      case CREATURE_MILITARYPOLICE:
      case CREATURE_SEAL:
         break;
   }

   vector<int> possible;
   for(int a=0;a<ATTNUM;a++)
   {
      attnum-=min(4,cr.get_attribute(a,false));
      possible.push_back(a);
   }
   while(attnum>0&&len(possible))
   {
      int i=LCSrandom(len(possible));
      int a=possible[i];
      if(a==ATTRIBUTE_WISDOM&&cr.align==ALIGN_LIBERAL&&LCSrandom(4)) a=ATTRIBUTE_HEART;
      if(a==ATTRIBUTE_HEART&&cr.align==ALIGN_CONSERVATIVE&&LCSrandom(4)) a=ATTRIBUTE_WISDOM;
      if(cr.get_attribute(a,false)<attcap[a])
      {
         cr.adjust_attribute(a,+1);
         attnum--;
      }
      else possible.erase(possible.begin()+i);
   }
   if(cr.align==ALIGN_LIBERAL) cr.infiltration=0.15f+(LCSrandom(10)-5)*0.01f;
   else if(cr.align==ALIGN_MODERATE) cr.infiltration=0.25f+(LCSrandom(10)-5)*0.01f;
   else cr.infiltration+=0.35f*(1-cr.infiltration)+(LCSrandom(10)-5)*0.01f;
   if(cr.infiltration<0) cr.infiltration=0;
   if(cr.infiltration>1) cr.infiltration=1;
   int randomskills=LCSrandom(4)+4;
   if(cr.age>20) randomskills+=static_cast<int>(randomskills*((cr.age-20.0)/20.0));
   else randomskills-=(20-cr.age)/2;
   possible.clear();
   for(int s=0;s<SKILLNUM;s++)possible.push_back(s);
   //RANDOM STARTING SKILLS
   while(randomskills>0&&len(possible))
   {
      int i=LCSrandom(len(possible));
      int randomskill=possible[i];
      // 95% chance of not allowing some skills for anybody...
      if(LCSrandom(20))
      {
         if(randomskill==SKILL_HEAVYWEAPONS) continue;
         if(randomskill==SKILL_SMG) continue;
         if(randomskill==SKILL_SWORD) continue;
         if(randomskill==SKILL_RIFLE) continue;
         if(randomskill==SKILL_AXE) continue;
         if(randomskill==SKILL_CLUB) continue;
         if(randomskill==SKILL_PSYCHOLOGY) continue;
      }
      // 90% chance of not allowing some skills, other than
      //   for conservatives
      if(LCSrandom(10)&&cr.align!=ALIGN_CONSERVATIVE)
      {
         if(randomskill==SKILL_SHOTGUN) continue;
         if(randomskill==SKILL_PISTOL) continue;
      }
      if(cr.skill_cap(randomskill,true)>cr.get_skill(randomskill))
      {
         cr.set_skill(randomskill,cr.get_skill(randomskill)+1);
         randomskills--;
         while(randomskills&&LCSrandom(2))
         {
            if(cr.skill_cap(randomskill,true)>cr.get_skill(randomskill) &&
               cr.get_skill(randomskill) < 4)
            {
               cr.set_skill(randomskill,cr.get_skill(randomskill)+1);
               randomskills--;
            }
            else
            {
               possible.erase(possible.begin()+i);
               break;
            }
         }
      }
      else possible.erase(possible.begin()+i);
   }
   //ALIENATION
   if((sitealienate>=1&&cr.align==ALIGN_MODERATE)||(sitealienate==2&&cr.align==ALIGN_LIBERAL))conservatise(cr);
}