void MonsterGroupManager::LoadMonsterGroup(JsonObject &jo) { MonsterGroup g; g.name = mongroup_id( jo.get_string("name") ); g.defaultMonster = mtype_id( jo.get_string("default") ); if (jo.has_array("monsters")) { JsonArray monarr = jo.get_array("monsters"); while (monarr.has_more()) { JsonObject mon = monarr.next_object(); const mtype_id name = mtype_id( mon.get_string("monster") ); int freq = mon.get_int("freq"); int cost = mon.get_int("cost_multiplier"); int pack_min = 1; int pack_max = 1; if(mon.has_member("pack_size")) { JsonArray packarr = mon.get_array("pack_size"); pack_min = packarr.next_int(); pack_max = packarr.next_int(); } int starts = 0; int ends = 0; if(mon.has_member("starts")) { if (ACTIVE_WORLD_OPTIONS["MONSTER_UPGRADE_FACTOR"] > 0) { starts = mon.get_int("starts") * ACTIVE_WORLD_OPTIONS["MONSTER_UPGRADE_FACTOR"]; } else { // Default value if the monster upgrade factor is set to 0.0 - off starts = mon.get_int("starts"); } } if(mon.has_member("ends")) { if (ACTIVE_WORLD_OPTIONS["MONSTER_UPGRADE_FACTOR"] > 0) { ends = mon.get_int("ends") * ACTIVE_WORLD_OPTIONS["MONSTER_UPGRADE_FACTOR"]; } else { // Default value if the monster upgrade factor is set to 0.0 - off ends = mon.get_int("ends"); } } MonsterGroupEntry new_mon_group = MonsterGroupEntry(name, freq, cost, pack_min, pack_max, starts, ends); if(mon.has_member("conditions")) { JsonArray conditions_arr = mon.get_array("conditions"); while(conditions_arr.has_more()) { new_mon_group.conditions.push_back(conditions_arr.next_string()); } } g.monsters.push_back(new_mon_group); } } g.replace_monster_group = jo.get_bool("replace_monster_group", false); g.new_monster_group = mongroup_id( jo.get_string("new_monster_group_id", mongroup_id::NULL_ID.str() ) ); g.monster_group_time = jo.get_int("replacement_time", 0); g.is_safe = jo.get_bool( "is_safe", false ); monsterGroupMap[g.name] = g; }
void MonsterGroupManager::LoadMonsterGroup( JsonObject &jo ) { float mon_upgrade_factor = get_option<float>( "MONSTER_UPGRADE_FACTOR" ); MonsterGroup g; g.name = mongroup_id( jo.get_string( "name" ) ); bool extending = false; //If already a group with that name, add to it instead of overwriting it if( monsterGroupMap.count( g.name ) != 0 && !jo.get_bool( "override", false ) ) { g = monsterGroupMap[g.name]; extending = true; } if( !extending || jo.has_string( "default" ) ) { //Not mandatory to specify default if extending existing group g.defaultMonster = mtype_id( jo.get_string( "default" ) ); } g.is_animal = jo.get_bool( "is_animal", false ); if( jo.has_array( "monsters" ) ) { JsonArray monarr = jo.get_array( "monsters" ); while( monarr.has_more() ) { JsonObject mon = monarr.next_object(); const mtype_id name = mtype_id( mon.get_string( "monster" ) ); int freq = mon.get_int( "freq" ); int cost = mon.get_int( "cost_multiplier" ); int pack_min = 1; int pack_max = 1; if( mon.has_member( "pack_size" ) ) { JsonArray packarr = mon.get_array( "pack_size" ); pack_min = packarr.next_int(); pack_max = packarr.next_int(); } static const time_duration tdfactor = 1_hours; time_duration starts = 0_turns; time_duration ends = 0_turns; if( mon.has_member( "starts" ) ) { starts = tdfactor * mon.get_int( "starts" ) * ( mon_upgrade_factor > 0 ? mon_upgrade_factor : 1 ); } if( mon.has_member( "ends" ) ) { ends = tdfactor * mon.get_int( "ends" ) * ( mon_upgrade_factor > 0 ? mon_upgrade_factor : 1 ); } MonsterGroupEntry new_mon_group = MonsterGroupEntry( name, freq, cost, pack_min, pack_max, starts, ends ); if( mon.has_member( "conditions" ) ) { JsonArray conditions_arr = mon.get_array( "conditions" ); while( conditions_arr.has_more() ) { new_mon_group.conditions.push_back( conditions_arr.next_string() ); } } g.monsters.push_back( new_mon_group ); } } g.replace_monster_group = jo.get_bool( "replace_monster_group", false ); g.new_monster_group = mongroup_id( jo.get_string( "new_monster_group_id", mongroup_id::NULL_ID().str() ) ); assign( jo, "replacement_time", g.monster_group_time, false, 1_days ); g.is_safe = jo.get_bool( "is_safe", false ); g.freq_total = jo.get_int( "freq_total", ( extending ? g.freq_total : 1000 ) ); if( jo.get_bool( "auto_total", false ) ) { //Fit the max size to the sum of all freqs int total = 0; for( MonsterGroupEntry &mon : g.monsters ) { total += mon.frequency; } g.freq_total = total; } monsterGroupMap[g.name] = g; }
// fish-with-rod fish catching function. static void rod_fish( player *p, int sSkillLevel, int fishChance ) { if( sSkillLevel > fishChance ) { std::vector<monster *> fishables = g->get_fishable(60); //get the nearby fish list. //if the vector is empty (no fish around) the player is still given a small chance to get a (let us say it was hidden) fish if( fishables.size() < 1 ) { if( one_in(20) ) { item fish; std::vector<std::string> fish_group = MonsterGroupManager::GetMonstersFromGroup( mongroup_id( "GROUP_FISH" ) ); std::string fish_mon = fish_group[rng(1, fish_group.size()) - 1]; fish.make_corpse( fish_mon, calendar::turn ); g->m.add_item_or_charges(p->pos(), fish); p->add_msg_if_player(m_good, _("You caught a %s."), GetMType(fish_mon)->nname().c_str()); } else { p->add_msg_if_player(_("You didn't catch anything.")); } } else { g->catch_a_monster(fishables, p->pos3(), p, 30000); } } else { p->add_msg_if_player(_("You didn't catch anything.")); } }
void MonsterGenerator::load_monster(JsonObject &jo) { const mtype_id mid = mtype_id( jo.get_string("id") ); if (mon_templates.count(mid) > 0) { delete mon_templates[mid]; } mtype *newmon = new mtype; newmon->id = mid; newmon->name = jo.get_string("name").c_str(); if(jo.has_member("name_plural")) { newmon->name_plural = jo.get_string("name_plural"); } else { // default behaviour: Assume the regular plural form (appending an “s”) newmon->name_plural = newmon->name + "s"; } newmon->description = _(jo.get_string("description").c_str()); // Have to overwrite the default { "hflesh" } here newmon->mat = { jo.get_string("material") }; for( auto &s : jo.get_tags( "species" ) ) { newmon->species.insert( species_id( s ) ); } newmon->categories = jo.get_tags("categories"); // See monfaction.cpp newmon->default_faction = monfactions::get_or_add_faction( mfaction_str_id( jo.get_string("default_faction") ) ); newmon->sym = jo.get_string("symbol"); if( utf8_wrapper( newmon->sym ).display_width() != 1 ) { jo.throw_error( "monster symbol should be exactly one console cell width", "symbol" ); } newmon->color = color_from_string(jo.get_string("color")); newmon->size = get_from_string(jo.get_string("size", "MEDIUM"), Creature::size_map, MS_MEDIUM); newmon->phase = get_from_string(jo.get_string("phase", "SOLID"), phase_map, SOLID); newmon->difficulty = jo.get_int("diff", 0); newmon->agro = jo.get_int("aggression", 0); newmon->morale = jo.get_int("morale", 0); newmon->speed = jo.get_int("speed", 0); newmon->attack_cost = jo.get_int("attack_cost", 100); newmon->melee_skill = jo.get_int("melee_skill", 0); newmon->melee_dice = jo.get_int("melee_dice", 0); newmon->melee_sides = jo.get_int("melee_dice_sides", 0); newmon->melee_cut = jo.get_int("melee_cut", 0); newmon->sk_dodge = jo.get_int("dodge", 0); newmon->armor_bash = jo.get_int("armor_bash", 0); newmon->armor_cut = jo.get_int("armor_cut", 0); newmon->hp = jo.get_int("hp", 0); jo.read("starting_ammo", newmon->starting_ammo); newmon->luminance = jo.get_float("luminance", 0); newmon->revert_to_itype = jo.get_string( "revert_to_itype", "" ); newmon->vision_day = jo.get_int("vision_day", 40); newmon->vision_night = jo.get_int("vision_night", 1); if (jo.has_array("attack_effs")) { JsonArray jsarr = jo.get_array("attack_effs"); while (jsarr.has_more()) { JsonObject e = jsarr.next_object(); mon_effect_data new_eff(e.get_string("id", "null"), e.get_int("duration", 0), get_body_part_token( e.get_string("bp", "NUM_BP") ), e.get_bool("permanent", false), e.get_int("chance", 100)); newmon->atk_effs.push_back(new_eff); } } if( jo.has_member( "death_drops" ) ) { JsonIn& stream = *jo.get_raw( "death_drops" ); newmon->death_drops = item_group::load_item_group( stream, "distribution" ); } newmon->dies = get_death_functions(jo, "death_function"); load_special_defense(newmon, jo, "special_when_hit"); load_special_attacks(newmon, jo, "special_attacks"); if (jo.has_member("upgrades")) { JsonObject upgrades = jo.get_object("upgrades"); newmon->half_life = upgrades.get_int("half_life", -1); newmon->upgrade_group = mongroup_id( upgrades.get_string("into_group", mongroup_id::NULL_ID.str() ) ); newmon->upgrade_into = mtype_id( upgrades.get_string("into", mtype_id::NULL_ID.str() ) ); newmon->upgrades = true; } std::set<std::string> flags, anger_trig, placate_trig, fear_trig; flags = jo.get_tags("flags"); anger_trig = jo.get_tags("anger_triggers"); placate_trig = jo.get_tags("placate_triggers"); fear_trig = jo.get_tags("fear_triggers"); newmon->flags = get_set_from_tags(flags, flag_map, MF_NULL); newmon->anger = get_set_from_tags(anger_trig, trigger_map, MTRIG_NULL); newmon->fear = get_set_from_tags(fear_trig, trigger_map, MTRIG_NULL); newmon->placate = get_set_from_tags(placate_trig, trigger_map, MTRIG_NULL); mon_templates[mid] = newmon; }