void MonsterGenerator::load_monster(JsonObject &jo) { // id std::string mid; if (jo.has_member("id")){ mid = 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()); newmon->description = _(jo.get_string("description").c_str()); newmon->mat = jo.get_string("material"); newmon->species = jo.get_tags("species"); newmon->categories = jo.get_tags("categories"); newmon->sym = jo.get_string("symbol")[0]; // will fail here if there is no symbol newmon->color = color_from_string(jo.get_string("color")); newmon->size = get_from_string(jo.get_string("size", "MEDIUM"), 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->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->item_chance = jo.get_int("item_chance", 0); newmon->hp = jo.get_int("hp", 0); newmon->sp_freq = jo.get_int("special_freq", 0); newmon->def_chance = jo.get_int("special_when_hit_freq", 0); newmon->luminance = jo.get_float("luminance", 0); newmon->dies = get_death_functions(jo, "death_function"); newmon->sp_attack = get_attack_function(jo, "special_attack"); newmon->sp_defense = get_defense_function(jo, "special_when_hit"); std::set<std::string> flags, anger_trig, placate_trig, fear_trig, cats; 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; } }
void MonsterGenerator::load_monster(JsonObject &jo) { // id std::string mid; if (jo.has_member("id")){ mid = 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 = jo.get_string("name") + "s"; } newmon->description = _(jo.get_string("description").c_str()); newmon->mat = jo.get_string("material"); newmon->species = jo.get_tags("species"); newmon->categories = jo.get_tags("categories"); newmon->sym = jo.get_string("symbol")[0]; // will fail here if there is no symbol newmon->color = color_from_string(jo.get_string("color")); newmon->size = get_from_string(jo.get_string("size", "MEDIUM"), 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->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); newmon->sp_freq = jo.get_int("special_freq", 0); newmon->def_chance = jo.get_int("special_when_hit_freq", 0); newmon->luminance = jo.get_float("luminance", 0); if (jo.has_string("death_drops")) { newmon->death_drops = jo.get_string("death_drops"); } else if (jo.has_object("death_drops")) { JsonObject death_frop_json = jo.get_object("death_drops"); // Make up a group name, should be unique (include the monster id), newmon->death_drops = newmon->id + "_death_drops_auto"; const std::string subtype = death_frop_json.get_string("subtype", "distribution"); // and load the entry as a standard item group using the made up name. item_controller->load_item_group(death_frop_json, newmon->death_drops, subtype); } else if (jo.has_member("death_drops")) { jo.throw_error("invalid type, must be string or object", "death_drops"); } newmon->dies = get_death_functions(jo, "death_function"); newmon->sp_attack = get_attack_function(jo, "special_attack"); newmon->sp_defense = get_defense_function(jo, "special_when_hit"); std::set<std::string> flags, anger_trig, placate_trig, fear_trig, cats; 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; } }