Example #1
0
void Object::AddMOB(const MOBType *type) {
  Object *mob = new Object(this);

  mob->Attach(get_mob_mind());
  mob->Activate();
  mob->SetPos(POS_STAND);
  mob->SetAttribute(0, type->b + rand() % type->bm);
  mob->SetAttribute(1, type->q + rand() % type->qm);
  mob->SetAttribute(2, type->s + rand() % type->sm);
  mob->SetAttribute(3, type->c + rand() % type->cm);
  mob->SetAttribute(4, type->i + rand() % type->im);
  mob->SetAttribute(5, type->w + rand() % type->wm);

  typeof(type->skills.begin()) sk_it;
  for(sk_it = type->skills.begin(); sk_it != type->skills.end(); ++sk_it) {
    if(sk_it->second.first < 0) {
      mob->SetSkill(sk_it->first, sk_it->second.second);
      }
    else {
      mob->SetSkill(sk_it->first,
	mob->Attribute(get_linked(sk_it->first))
	* sk_it->second.first / 100
	- rand() % sk_it->second.second
	);
      }
    //fprintf(stderr, "DBG: %d %d %d\n", get_linked(sk_it->first), sk_it->second.first, sk_it->second.second);
    }

  mob->SetShortDesc(type->name.c_str());
  mob->SetDesc(type->desc.c_str());
  mob->SetLongDesc(type->long_desc.c_str());
  if(type->genders.length() > 0) {
    mob->SetGender(type->genders[rand() % type->genders.length()]);
    }
  mob->SetDesc(gender_proc(type->desc.c_str(), mob->Gender()).c_str());
  mob->SetLongDesc(gender_proc(type->long_desc.c_str(), mob->Gender()).c_str());

  if(type->g > 0 || type->gm > 1) give_gold(mob, type->g + rand() % type->gm);

  if(type->armed) {
    Object *obj = new Object(mob);
    obj->SetSkill("WeaponType", type->armed->type);
    obj->SetSkill("WeaponReach", type->armed->reach);
    obj->SetSkill("WeaponForce",
	type->armed->force + rand() % type->armed->forcem);
    obj->SetSkill("WeaponSeverity",
	type->armed->sev + rand() % type->armed->sevm);
    obj->SetShortDesc(type->armed->name.c_str());
    obj->SetDesc(type->armed->desc.c_str());
    obj->SetLongDesc(type->armed->long_desc.c_str());
    obj->SetWeight(type->armed->weight);
    obj->SetVolume(type->armed->volume);
    obj->SetValue(type->armed->value);
    obj->SetPos(POS_LIE);
    mob->AddAct(ACT_WIELD, obj);
    if(two_handed(type->armed->type)) mob->AddAct(ACT_HOLD, obj);
    }

  typeof(type->armor.begin()) ar_it;
  for(ar_it = type->armor.begin(); ar_it != type->armor.end(); ++ar_it) {
    if(wear_attribs.size() <= 0) {
      init_wear_attribs();
      }
    Object *obj = new Object(mob);
    obj->SetAttribute(0, (*ar_it)->bulk + rand() %(*ar_it)->bulkm);
    obj->SetSkill("ArmorB", (*ar_it)->bulk + rand() %(*ar_it)->bulkm);
    obj->SetSkill("ArmorI", (*ar_it)->impact + rand() %(*ar_it)->impactm);
    obj->SetSkill("ArmorT", (*ar_it)->thread + rand() %(*ar_it)->threadm);
    obj->SetSkill("ArmorP", (*ar_it)->planar + rand() %(*ar_it)->planarm);
    obj->SetShortDesc((*ar_it)->name.c_str());
    obj->SetDesc((*ar_it)->desc.c_str());
    obj->SetLongDesc((*ar_it)->long_desc.c_str());
    obj->SetWeight((*ar_it)->weight);
    obj->SetVolume((*ar_it)->volume);
    obj->SetValue((*ar_it)->value);
    obj->SetPos(POS_LIE);

    typeof((*ar_it)->loc.begin()) l_it;
    for(l_it = (*ar_it)->loc.begin(); l_it != (*ar_it)->loc.end(); ++l_it) {
      obj->SetSkill(wear_attribs[*l_it], 1);
      mob->AddAct(*l_it, obj);
      }
    }
  }