itype* game::new_natural_artifact(artifact_natural_property prop) { // Natural artifacts are always tools. it_artifact_tool *art = new it_artifact_tool(); // Pick a form artifact_natural_shape shape = artifact_natural_shape(rng(ARTSHAPE_NULL + 1, ARTSHAPE_MAX - 1)); artifact_shape_datum *shape_data = &(artifact_shape_data[shape]); // Pick a property artifact_natural_property property = (prop > ARTPROP_NULL ? prop : artifact_natural_property(rng(ARTPROP_NULL + 1, ARTPROP_MAX - 1))); artifact_property_datum *property_data = &(artifact_property_data[property]); art->sym = ':'; art->color = c_yellow; art->m1 = "stone"; art->m2 = "null"; art->volume = rng(shape_data->volume_min, shape_data->volume_max); art->weight = rng(shape_data->weight_min, shape_data->weight_max); art->melee_dam = 0; art->melee_cut = 0; art->m_to_hit = 0; art->name = rmp_format(_("<artifact_name>%1$s %2$s"), property_data->name.c_str(), shape_data->name.c_str()); art->description = rmp_format(_("<artifact_desc>This %1$s %2$s."), shape_data->desc.c_str(), property_data->desc.c_str()); // Add line breaks to the description as necessary /* size_t pos = 76; while (art->description.length() - pos >= 76) { pos = art->description.find_last_of(' ', pos); if (pos == std::string::npos) pos = art->description.length(); else { art->description[pos] = '\n'; pos += 76; } }*/ // Three possibilities: good passive + bad passive, good active + bad active, // and bad passive + good active bool good_passive = false, bad_passive = false, good_active = false, bad_active = false; switch (rng(1, 3)) { case 1: good_passive = true; bad_passive = true; break; case 2: good_active = true; bad_active = true; break; case 3: bad_passive = true; good_active = true; break; } int value_to_reach = 0; // This is slowly incremented, allowing for better arts int value = 0; art_effect_passive aep_good = AEP_NULL, aep_bad = AEP_NULL; art_effect_active aea_good = AEA_NULL, aea_bad = AEA_NULL; do { if (good_passive) { aep_good = property_data->passive_good[ rng(0, 3) ]; if (aep_good == AEP_NULL || one_in(4)) aep_good = art_effect_passive(rng(AEP_NULL + 1, AEP_SPLIT - 1)); } if (bad_passive) { aep_bad = property_data->passive_bad[ rng(0, 3) ]; if (aep_bad == AEP_NULL || one_in(4)) aep_bad = art_effect_passive(rng(AEP_SPLIT + 1, NUM_AEAS - 1)); } if (good_active) { aea_good = property_data->active_good[ rng(0, 3) ]; if (aea_good == AEA_NULL || one_in(4)) aea_good = art_effect_active(rng(AEA_NULL + 1, AEA_SPLIT - 1)); } if (bad_active) { aea_bad = property_data->active_bad[ rng(0, 3) ]; if (aea_bad == AEA_NULL || one_in(4)) aea_bad = art_effect_active(rng(AEA_SPLIT + 1, NUM_AEAS - 1)); } value = passive_effect_cost[aep_good] + passive_effect_cost[aep_bad] + active_effect_cost[aea_good] + active_effect_cost[aea_bad]; value_to_reach++; // Yes, it is intentional that this is 1 the first check } while (value > value_to_reach); if (aep_good != AEP_NULL) art->effects_carried.push_back(aep_good); if (aep_bad != AEP_NULL) art->effects_carried.push_back(aep_bad); if (aea_good != AEA_NULL) art->effects_activated.push_back(aea_good); if (aea_bad != AEA_NULL) art->effects_activated.push_back(aea_bad); // Natural artifacts ALWAYS can recharge // (When "implanting" them in a mundane item, this ability may be lost if (!art->effects_activated.empty()) { art->max_charges = rng(1, 4); art->def_charges = art->max_charges; art->charge_type = art_charge( rng(ARTC_NULL + 1, NUM_ARTCS - 1) ); } std::stringstream artid; artid << "artifact" << artifact_itype_ids.size(); art->id = artid.str(); artifact_itype_ids.push_back(art->id); itypes[art->id] = art; return art; }
std::string new_natural_artifact(artifact_natural_property prop) { // Natural artifacts are always tools. it_artifact_tool *art = new it_artifact_tool(); // Pick a form artifact_natural_shape shape = artifact_natural_shape(rng(ARTSHAPE_NULL + 1, ARTSHAPE_MAX - 1)); artifact_shape_datum *shape_data = &(artifact_shape_data[shape]); // Pick a property artifact_natural_property property = (prop > ARTPROP_NULL ? prop : artifact_natural_property(rng(ARTPROP_NULL + 1, ARTPROP_MAX - 1))); artifact_property_datum *property_data = &(artifact_property_data[property]); art->sym = ':'; art->color = c_yellow; art->materials.push_back("stone"); art->volume = rng(shape_data->volume_min, shape_data->volume_max); art->weight = rng(shape_data->weight_min, shape_data->weight_max); art->melee_dam = 0; art->melee_cut = 0; art->m_to_hit = 0; art->create_name(property_data->name, shape_data->name); art->description = rmp_format(_("<artifact_desc>This %1$s %2$s."), shape_data->desc.c_str(), property_data->desc.c_str()); // Three possibilities: good passive + bad passive, good active + bad active, // and bad passive + good active bool good_passive = false, bad_passive = false, good_active = false, bad_active = false; switch (rng(1, 3)) { case 1: good_passive = true; bad_passive = true; break; case 2: good_active = true; bad_active = true; break; case 3: bad_passive = true; good_active = true; break; } int value_to_reach = 0; // This is slowly incremented, allowing for better arts int value = 0; art_effect_passive aep_good = AEP_NULL, aep_bad = AEP_NULL; art_effect_active aea_good = AEA_NULL, aea_bad = AEA_NULL; do { if (good_passive) { aep_good = property_data->passive_good[ rng(0, 3) ]; if (aep_good == AEP_NULL || one_in(4)) { aep_good = art_effect_passive(rng(AEP_NULL + 1, AEP_SPLIT - 1)); } } if (bad_passive) { aep_bad = property_data->passive_bad[ rng(0, 3) ]; if (aep_bad == AEP_NULL || one_in(4)) { aep_bad = art_effect_passive(rng(AEP_SPLIT + 1, NUM_AEAS - 1)); } } if (good_active) { aea_good = property_data->active_good[ rng(0, 3) ]; if (aea_good == AEA_NULL || one_in(4)) { aea_good = art_effect_active(rng(AEA_NULL + 1, AEA_SPLIT - 1)); } } if (bad_active) { aea_bad = property_data->active_bad[ rng(0, 3) ]; if (aea_bad == AEA_NULL || one_in(4)) { aea_bad = art_effect_active(rng(AEA_SPLIT + 1, NUM_AEAS - 1)); } } value = passive_effect_cost[aep_good] + passive_effect_cost[aep_bad] + active_effect_cost[aea_good] + active_effect_cost[aea_bad]; value_to_reach++; // Yes, it is intentional that this is 1 the first check } while (value > value_to_reach); if (aep_good != AEP_NULL) { art->effects_carried.push_back(aep_good); } if (aep_bad != AEP_NULL) { art->effects_carried.push_back(aep_bad); } if (aea_good != AEA_NULL) { art->effects_activated.push_back(aea_good); } if (aea_bad != AEA_NULL) { art->effects_activated.push_back(aea_bad); } // Natural artifacts ALWAYS can recharge // (When "implanting" them in a mundane item, this ability may be lost if (!art->effects_activated.empty()) { art->max_charges = rng(1, 4); art->def_charges = art->max_charges; art->rand_charges.push_back(art->max_charges); art->charge_type = art_charge( rng(ARTC_NULL + 1, NUM_ARTCS - 1) ); } item_controller->add_item_type( art ); return art->id; }