diff --git a/tools/playground/skillmodify.cpp b/tools/playground/skillmodify.cpp old mode 100644 new mode 100755 index 71509bac7..0b026d981 --- a/tools/playground/skillmodify.cpp +++ b/tools/playground/skillmodify.cpp @@ -45,41 +45,41 @@ using namespace std; void usage(int argc, const char * argv[]) { cout - << "Usage:" << endl - << argv[0] << " [option 1] [option 2] [...]" << endl - << "-q : Suppress \"Press any key to continue\" at program termination" << endl - << "-c creature : Only show/modify this creature type instead of dwarfes" << endl - << "-i id : Only show/modify creature with this id" << endl - << "-nn : Only show/modify creatures with no custom nickname" << endl - << "-ll : List available labors" << endl - << "-al : Add labor to creature" << endl - << "-rl : Remove labor from creature" << endl - << "-ras : Remove all skills from creature" << endl - << "-ral : Remove all labors from creature" << endl - << "-ah : Add hauler labors (stone hauling, etc.) to creature" << endl - << "-rh : Remove hauler labors (stone hauling, etc.) from creature" << endl - << "-me : Make creature an engraver" << endl - << "-mm : Make creature a mason" << endl - << "--setmood : Set mood to n (-1 = no mood, max=4)" << endl - // Doesn't work, because hapiness is recalculated - //<< "--sethappiness : Set happiness to n" << endl - << "-f : Force an action" << endl - << endl - << "Example 1: Show all creatures" << endl - << argv[0] << endl - << endl - << "Example 2: Just show dwarfs" << endl - << argv[0] << " -c DWARF" << endl - << endl - << "Example 3: Remove skill from dwarf 32" << endl - << argv[0] << " -i 32 -ras" << endl - << endl - << "Example 4: Remove all skills and labors from dwarfs with no custom nickname" << endl - << argv[0] << " -c DWARF -nn -ras -ral" << endl - << endl - << "Example 5: Additionally assign the hauling labors and engraving" << endl - << argv[0] << " -c DWARF -nn -ras -ral -me -ah" << endl - ; + << "Usage:" << endl + << argv[0] << " [option 1] [option 2] [...]" << endl + << "-q : Suppress \"Press any key to continue\" at program termination" << endl + << "-c creature : Only show/modify this creature type instead of dwarfes" << endl + << "-i id : Only show/modify creature with this id" << endl + << "-nn : Only show/modify creatures with no custom nickname" << endl + << "-ll : List available labors" << endl + << "-al : Add labor to creature" << endl + << "-rl : Remove labor from creature" << endl + << "-ras : Remove all skills from creature" << endl + << "-ral : Remove all labors from creature" << endl + << "-ah : Add hauler labors (stone hauling, etc.) to creature" << endl + << "-rh : Remove hauler labors (stone hauling, etc.) from creature" << endl + << "-me : Make creature an engraver" << endl + << "-mm : Make creature a mason" << endl + << "--setmood : Set mood to n (-1 = no mood, max=4)" << endl + // Doesn't work, because hapiness is recalculated + //<< "--sethappiness : Set happiness to n" << endl + << "-f : Force an action" << endl + << endl + << "Example 1: Show all creatures" << endl + << argv[0] << endl + << endl + << "Example 2: Just show dwarfs" << endl + << argv[0] << " -c DWARF" << endl + << endl + << "Example 3: Remove skill from dwarf 32" << endl + << argv[0] << " -i 32 -ras" << endl + << endl + << "Example 4: Remove all skills and labors from dwarfs with no custom nickname" << endl + << argv[0] << " -c DWARF -nn -ras -ral" << endl + << endl + << "Example 5: Additionally assign the hauling labors and engraving" << endl + << argv[0] << " -c DWARF -nn -ras -ral -me -ah" << endl + ; } enum likeType @@ -103,12 +103,12 @@ std::string toCaps(std::string s) { const int length = s.length(); if (length == 0) { - return s; + return s; } s[0] = std::toupper(s[0]); for(int i=1; i!=length ; ++i) { - s[i] = std::tolower(s[i]); + s[i] = std::tolower(s[i]); } return s; } @@ -129,40 +129,40 @@ void printCreature(DFHack::Context * DF, const DFHack::t_creature & creature, in if(creature.name.nickname[0]) { - cout << ", " << creature.name.nickname; + cout << ", " << creature.name.nickname; } else { - if(creature.name.first_name[0]) - { - cout << ", " << toCaps(creature.name.first_name); - } - - string transName = Tran->TranslateName(creature.name,false); - if(!transName.empty()) - { - cout << " " << toCaps(transName); - } + if(creature.name.first_name[0]) + { + cout << ", " << toCaps(creature.name.first_name); + } + + string transName = Tran->TranslateName(creature.name,false); + if(!transName.empty()) + { + cout << " " << toCaps(transName); + } } string prof_string=""; try { - prof_string = mem->getProfession(creature.profession); + prof_string = mem->getProfession(creature.profession); } catch (exception& e) { - cout << "Error retrieving creature profession: " << e.what() << endl; + cout << "Error retrieving creature profession: " << e.what() << endl; } cout << ", " << toCaps(prof_string) << "(" << int(creature.profession) << ")"; if(creature.custom_profession[0]) { - cout << "/" << creature.custom_profession; + cout << "/" << creature.custom_profession; } if(creature.current_job.active) { - cout << ", current job: " << mem->getJob(creature.current_job.jobId); + cout << ", current job: " << mem->getJob(creature.current_job.jobId); } cout << ", Happy = " << creature.happiness; @@ -170,96 +170,96 @@ void printCreature(DFHack::Context * DF, const DFHack::t_creature & creature, in if((creature.mood != -1) && (creature.mood<5)) { - cout << "Creature is in a strange mood (mood=" << creature.mood << "), skill: " << mem->getSkill(creature.mood_skill) << endl; - vector mymat; - if(Creatures->ReadJob(&creature, mymat)) - { - for(unsigned int i = 0; i < mymat.size(); i++) - { - printf("\t%s(%d)\t%d %d %d - %.8x\n", Materials->getDescription(mymat[i]).c_str(), mymat[i].itemType, mymat[i].subType, mymat[i].subIndex, mymat[i].index, mymat[i].flags); - } - } + cout << "Creature is in a strange mood (mood=" << creature.mood << "), skill: " << mem->getSkill(creature.mood_skill) << endl; + vector mymat; + if(Creatures->ReadJob(&creature, mymat)) + { + for(unsigned int i = 0; i < mymat.size(); i++) + { + printf("\t%s(%d)\t%d %d %d - %.8x\n", Materials->getDescription(mymat[i]).c_str(), mymat[i].itemType, mymat[i].subType, mymat[i].subIndex, mymat[i].index, mymat[i].flags); + } + } } if(creature.has_default_soul) { - // Print out skills - int skillid; - int skillrating; - int skillexperience; - string skillname; - - cout << setiosflags(ios::left); - - for(unsigned int i = 0; i < creature.defaultSoul.numSkills;i++) - { - skillid = creature.defaultSoul.skills[i].id; - if ( // leave out some skill that are not interesting and clutter the screen - skillid != 72 - && skillid != 73 - && skillid != 74 - && skillid != 79 - && skillid != 80 - && skillid != 81 - && skillid != 82 - && skillid != 83 - && skillid != 84 - ) - { - skillrating = creature.defaultSoul.skills[i].rating; - skillexperience = creature.defaultSoul.skills[i].experience; - try - { - skillname = mem->getSkill(skillid); - } - catch(DFHack::Error::AllMemdef &e) - { - skillname = "Unknown skill"; - cout << e.what() << endl; - } - cout << "(Skill " << int(skillid) << ") " << setw(16) << skillname << ": " - << skillrating << "/" << skillexperience << endl; - } - } - - for(unsigned int i = 0; i < NUM_CREATURE_LABORS;i++) - { - if(!creature.labors[i]) - continue; - string laborname; - try - { - laborname = mem->getLabor(i); - } - catch(exception &e) - { - //cout << "Found undefined labor (" << i << ")" << endl; - //cout << e.what() << endl; - laborname = "(Undefined)"; - //continue; - } - cout << "(Labor " << i << ") " << setw(16) << laborname << endl; - } + // Print out skills + int skillid; + int skillrating; + int skillexperience; + string skillname; + + cout << setiosflags(ios::left); + + for(unsigned int i = 0; i < creature.defaultSoul.numSkills;i++) + { + skillid = creature.defaultSoul.skills[i].id; + if ( // leave out some skill that are not interesting and clutter the screen + skillid != 72 + && skillid != 73 + && skillid != 74 + && skillid != 79 + && skillid != 80 + && skillid != 81 + && skillid != 82 + && skillid != 83 + && skillid != 84 + ) + { + skillrating = creature.defaultSoul.skills[i].rating; + skillexperience = creature.defaultSoul.skills[i].experience; + try + { + skillname = mem->getSkill(skillid); + } + catch(DFHack::Error::AllMemdef &e) + { + skillname = "Unknown skill"; + cout << e.what() << endl; + } + cout << "(Skill " << int(skillid) << ") " << setw(16) << skillname << ": " + << skillrating << "/" << skillexperience << endl; + } + } + + for(unsigned int i = 0; i < NUM_CREATURE_LABORS;i++) + { + if(!creature.labors[i]) + continue; + string laborname; + try + { + laborname = mem->getLabor(i); + } + catch(exception &e) + { + //cout << "Found undefined labor (" << i << ")" << endl; + //cout << e.what() << endl; + laborname = "(Undefined)"; + //continue; + } + cout << "(Labor " << i << ") " << setw(16) << laborname << endl; + } } /* FLAGS 1 */ - if(creature.flags1.bits.dead) { cout << "Flag: Dead" << endl; } - if(creature.flags1.bits.on_ground) { cout << "Flag: On the ground" << endl; } - if(creature.flags1.bits.skeleton) { cout << "Flag: Skeletal" << endl; } - if(creature.flags1.bits.zombie) { cout << "Flag: Zombie" << endl; } - if(creature.flags1.bits.tame) { cout << "Flag: Tame" << endl; } + if(creature.flags1.bits.dead) { cout << "Flag: Dead" << endl; } + if(creature.flags1.bits.on_ground) { cout << "Flag: On the ground" << endl; } + if(creature.flags1.bits.skeleton) { cout << "Flag: Skeletal" << endl; } + if(creature.flags1.bits.zombie) { cout << "Flag: Zombie" << endl; } + if(creature.flags1.bits.tame) { cout << "Flag: Tame" << endl; } if(creature.flags1.bits.royal_guard){ cout << "Flag: Royal_guard" << endl; } if(creature.flags1.bits.fortress_guard){cout<<"Flag: Fortress_guard" << endl; } /* FLAGS 2 */ - if(creature.flags2.bits.killed) { cout << "Flag: Killed by kill function" << endl; } - if(creature.flags2.bits.resident) { cout << "Flag: Resident" << endl; } - if(creature.flags2.bits.gutted) { cout << "Flag: Gutted" << endl; } - if(creature.flags2.bits.slaughter) { cout << "Flag: Marked for slaughter" << endl; } + if(creature.flags2.bits.killed) { cout << "Flag: Killed by kill function" << endl; } + if(creature.flags2.bits.resident) { cout << "Flag: Resident" << endl; } + if(creature.flags2.bits.gutted) { cout << "Flag: Gutted" << endl; } + if(creature.flags2.bits.slaughter) { cout << "Flag: Marked for slaughter" << endl; } if(creature.flags2.bits.underworld) { cout << "Flag: From the underworld" << endl; } if(creature.flags1.bits.had_mood && (creature.mood == -1 || creature.mood == 8 ) ) { - string artifact_name = Tran->TranslateName(creature.artifact_name,false); - cout << "Artifact: " << artifact_name << endl; + string artifact_name = Tran->TranslateName(creature.artifact_name,false); + cout << "Artifact: " << artifact_name << endl; } } @@ -267,9 +267,9 @@ int main (int argc, const char* argv[]) { bool quiet = true; // let's be more useful when double-clicked on windows - #ifndef LINUX_BUILD +#ifndef LINUX_BUILD quiet = false; - #endif +#endif string creature_type = "Dwarf"; string creature_id = ""; @@ -294,131 +294,131 @@ int main (int argc, const char* argv[]) bool force_massdesignation = false; if (argc == 1) { - usage(argc, argv); - return 1; + usage(argc, argv); + return 1; } for(int i = 1; i < argc; i++) { string arg_cur = argv[i]; string arg_next = ""; - int arg_next_int = -99999; - /* Check if argv[i+1] is a number >= 0 */ - if (i < argc-1) { - arg_next = argv[i+1]; - arg_next_int = strtoint(arg_next); - if (arg_next != "0" && arg_next_int == 0) { - arg_next_int = -99999; - } - } + int arg_next_int = -99999; + /* Check if argv[i+1] is a number >= 0 */ + if (i < argc-1) { + arg_next = argv[i+1]; + arg_next_int = strtoint(arg_next); + if (arg_next != "0" && arg_next_int == 0) { + arg_next_int = -99999; + } + } if(arg_cur == "-q") { quiet = true; } - else if(arg_cur == "-ras") - { - remove_skills = true; - } - else if(arg_cur == "-f") - { - force_massdesignation = true; - } - // list labors - else if(arg_cur == "-ll") - { - list_labors = true; - } - // add single labor - else if(arg_cur == "-al" && i < argc-1) - { - if (arg_next_int == -99999 || arg_next_int >= NUM_CREATURE_LABORS) { - usage(argc, argv); - return 1; - } - add_labor = true; - add_labor_n = arg_next_int; - i++; - } - // remove single labor - else if(arg_cur == "-rl" && i < argc-1) - { - if (arg_next_int == -99999 || arg_next_int >= NUM_CREATURE_LABORS) { - usage(argc, argv); - return 1; - } - remove_labor = true; - remove_labor_n = arg_next_int; - i++; - } - else if(arg_cur == "--setmood" && i < argc-1) - { - if (arg_next_int < -1 || arg_next_int >= 5) { - usage(argc, argv); - return 1; - } - set_mood = true; - set_mood_n = arg_next_int; - i++; - } - else if(arg_cur == "--sethappiness" && i < argc-1) - { - if (arg_next_int < 1 || arg_next_int >= 2000) { - usage(argc, argv); - return 1; - } - set_happiness = true; - set_happiness_n = arg_next_int; - i++; - } - else if(arg_cur == "-ral") - { - remove_labors = true; - } - else if(arg_cur == "-ah") - { - make_hauler = true; - } - else if(arg_cur == "-rh") - { - remove_hauler = true; - } - else if(arg_cur == "-mm") - { - make_mason = true; - } - else if(arg_cur == "-me") - { - make_engraver = true; - } - else if(arg_cur == "-nn") - { - find_nonicks = true; - } - else if(arg_cur == "--nicks") - { - find_nicks = true; - } - else if(arg_cur == "-c" && i < argc-1) - { - creature_type = argv[i+1]; - i++; - } - else if(arg_cur == "-i" && i < argc-1) - { - creature_id = argv[i+1]; - sscanf(argv[i+1], "%d", &creature_id_int); - i++; - } - else - { - if (arg_cur != "-h") { - cout << "Unknown option '" << arg_cur << "'" << endl; - cout << endl; - } - usage(argc, argv); - return 1; - } + else if(arg_cur == "-ras") + { + remove_skills = true; + } + else if(arg_cur == "-f") + { + force_massdesignation = true; + } + // list labors + else if(arg_cur == "-ll") + { + list_labors = true; + } + // add single labor + else if(arg_cur == "-al" && i < argc-1) + { + if (arg_next_int == -99999 || arg_next_int >= NUM_CREATURE_LABORS) { + usage(argc, argv); + return 1; + } + add_labor = true; + add_labor_n = arg_next_int; + i++; + } + // remove single labor + else if(arg_cur == "-rl" && i < argc-1) + { + if (arg_next_int == -99999 || arg_next_int >= NUM_CREATURE_LABORS) { + usage(argc, argv); + return 1; + } + remove_labor = true; + remove_labor_n = arg_next_int; + i++; + } + else if(arg_cur == "--setmood" && i < argc-1) + { + if (arg_next_int < -1 || arg_next_int >= 5) { + usage(argc, argv); + return 1; + } + set_mood = true; + set_mood_n = arg_next_int; + i++; + } + else if(arg_cur == "--sethappiness" && i < argc-1) + { + if (arg_next_int < 1 || arg_next_int >= 2000) { + usage(argc, argv); + return 1; + } + set_happiness = true; + set_happiness_n = arg_next_int; + i++; + } + else if(arg_cur == "-ral") + { + remove_labors = true; + } + else if(arg_cur == "-ah") + { + make_hauler = true; + } + else if(arg_cur == "-rh") + { + remove_hauler = true; + } + else if(arg_cur == "-mm") + { + make_mason = true; + } + else if(arg_cur == "-me") + { + make_engraver = true; + } + else if(arg_cur == "-nn") + { + find_nonicks = true; + } + else if(arg_cur == "--nicks") + { + find_nicks = true; + } + else if(arg_cur == "-c" && i < argc-1) + { + creature_type = argv[i+1]; + i++; + } + else if(arg_cur == "-i" && i < argc-1) + { + creature_id = argv[i+1]; + sscanf(argv[i+1], "%d", &creature_id_int); + i++; + } + else + { + if (arg_cur != "-h") { + cout << "Unknown option '" << arg_cur << "'" << endl; + cout << endl; + } + usage(argc, argv); + return 1; + } } DFHack::ContextManager DFMgr("Memory.xml"); @@ -431,34 +431,34 @@ int main (int argc, const char* argv[]) catch (exception& e) { cerr << e.what() << endl; - if (quiet == false) - { + if (quiet == false) + { cin.ignore(); - } + } return 1; } - + Creatures = DF->getCreatures(); Materials = DF->getMaterials(); DFHack::Translation * Tran = DF->getTranslation(); - + uint32_t numCreatures; if(!Creatures->Start(numCreatures)) { cerr << "Can't get creatures" << endl; - if (quiet == false) - { + if (quiet == false) + { cin.ignore(); - } + } return 1; } if(!numCreatures) { cerr << "No creatures to print" << endl; - if (quiet == false) - { + if (quiet == false) + { cin.ignore(); - } + } return 1; } @@ -479,194 +479,194 @@ int main (int argc, const char* argv[]) // List all available labors (reproduces contents of Memory.xml) if (list_labors == true) { - string laborname; - for (int i=0; i < NUM_CREATURE_LABORS; i++) { - try { - laborname = mem->getLabor(i); - } - catch (exception& e) { - laborname = "Unknown"; - } - cout << "Labor " << int(i) << ": " << laborname << endl; - } + string laborname; + for (int i=0; i < NUM_CREATURE_LABORS; i++) { + try { + laborname = mem->getLabor(i); + } + catch (exception& e) { + laborname = "Unknown"; + } + cout << "Labor " << int(i) << ": " << laborname << endl; + } } else { - vector addrs; - for(uint32_t creature_idx = 0; creature_idx < numCreatures; creature_idx++) - { - DFHack::t_creature creature; - Creatures->ReadCreature(creature_idx,creature); - /* Check if we want to display/change this creature or skip it */ - bool hasnick = (creature.name.nickname[0] != '\0'); - - if ( - // Check for -i - (creature_id.empty() || creature_idx == creature_id_int) - // Check for -c - && (creature_type.empty() || toCaps(string(Materials->raceEx[creature.race].rawname)) == toCaps(creature_type)) - // Check for -nn - && ((find_nonicks == true && hasnick == false) - || (find_nicks == true && hasnick == true) - || (find_nicks == false && find_nonicks == false)) - && (find_nonicks == false || creature.name.nickname[0] == '\0') - && (!creature.flags1.bits.dead) - ) - { - printCreature(DF,creature,creature_idx); - addrs.push_back(creature.origin); - - bool dochange = ( - remove_skills - || remove_labors || add_labor || remove_labor - || make_hauler || remove_hauler - || make_engraver || make_mason - || set_happiness - || set_mood - ); - - // 96=Child, 97=Baby - if (creature.profession == 96 || creature.profession == 97) - { - dochange = false; - } - - bool allow_massdesignation = - !creature_id.empty() || toCaps(creature_type) != "Dwarf" || find_nonicks == true || force_massdesignation; - if (dochange == true && allow_massdesignation == false) - { - cout - << "Not changing creature because none of -c (other than dwarf), -i or -nn was" << endl - << "selected. Add -f to still do mass designation." << endl; - dochange = false; - } - -// cout << "dochange = " << int(dochange) << endl; -// cout << "remove_skills = " << int(remove_skills) << endl; -// cout << "remove_labors = " << int(remove_labors) << endl; -// cout << "add_labor = " << int(add_labor) << endl; -// cout << "remove_labor = " << int(remove_labor) << endl; -// cout << "make_hauler = " << int(make_hauler) << endl; -// cout << "remove_hauler = " << int(remove_hauler) << endl; -// cout << "make_engraver = " << int(make_engraver) << endl; -// cout << "make_mason = " << int(make_mason) << endl; -// cout << "allow_massdesignation = " << int(allow_massdesignation) << endl; -// cout << "force_massdesignation = " << int(force_massdesignation) << endl; -// cout << "creature.profession = " << int(creature.profession) << endl; - - if (dochange) - { - if(creature.has_default_soul) - { - if (set_mood) - { - cout << "Setting mood to " << set_mood_n << "..." << endl; - Creatures->WriteMood(creature_idx, set_mood_n); - } - - if (set_happiness) - { - cout << "Setting happiness to " << set_happiness_n << "..." << endl; - Creatures->WriteHappiness(creature_idx, set_happiness_n); - } - - if (remove_skills) - { - DFHack::t_soul & soul = creature.defaultSoul; - - cout << "Removing skills..." << endl; - for(unsigned int sk = 0; sk < soul.numSkills;sk++) - { - soul.skills[sk].rating=0; - soul.skills[sk].experience=0; - } - // Doesn't work anyways, so better leave it alone - //soul.numSkills=0; - if (Creatures->WriteSkills(creature_idx, soul) == true) { - cout << "Success writing skills." << endl; - } else { - cout << "Error writing skills." << endl; - } - } - - if (add_labor || remove_labor || remove_labors || make_hauler || remove_hauler || make_engraver || make_mason) - { - if (add_labor) { - cout << "Adding labor " << add_labor_n << "..." << endl; - creature.labors[add_labor_n] = 1; - } - - if (remove_labor) { - cout << "Removing labor " << remove_labor_n << "..." << endl; - creature.labors[remove_labor_n] = 0; - } - - if (remove_labors) { - cout << "Removing labors..." << endl; - for(unsigned int lab = 0; lab < NUM_CREATURE_LABORS; lab++) { - creature.labors[lab] = 0; - } - } - if (remove_hauler) { - cout << "Removing hauler labors..." << endl; - creature.labors[1] = 0; - creature.labors[2] = 0; - creature.labors[3] = 0; - creature.labors[4] = 0; - creature.labors[5] = 0; - creature.labors[6] = 0; - creature.labors[7] = 0; - creature.labors[8] = 0; - creature.labors[9] = 0; - creature.labors[22] = 0; - creature.labors[23] = 0; - } - if (make_hauler) { - cout << "Setting hauler labors..." << endl; - creature.labors[1] = 1; - creature.labors[2] = 1; - creature.labors[3] = 1; - creature.labors[4] = 1; - creature.labors[5] = 1; - creature.labors[6] = 1; - creature.labors[7] = 1; - creature.labors[8] = 1; - creature.labors[9] = 1; - creature.labors[22] = 1; - creature.labors[23] = 1; - } - if (make_engraver) { - cout << "Setting 'Stone Detailing'..." << endl; - creature.labors[12] = 1; - } - if (make_mason) { - cout << "Setting 'Masonry'..." << endl; - creature.labors[13] = 1; - } - if (Creatures->WriteLabors(creature_idx, creature.labors) == true) { - cout << "Success writing labors." << endl; - } else { - cout << "Error writing labors." << endl; - } - } - } - else - { - cout << "Error removing skills: Creature has no default soul." << endl; - } - printCreature(DF,creature,creature_idx); - } /* End remove skills/labors */ - cout << endl; - } /* if (print creature) */ - } /* End for(all creatures) */ + vector addrs; + for(uint32_t creature_idx = 0; creature_idx < numCreatures; creature_idx++) + { + DFHack::t_creature creature; + Creatures->ReadCreature(creature_idx,creature); + /* Check if we want to display/change this creature or skip it */ + bool hasnick = (creature.name.nickname[0] != '\0'); + + if ( + // Check for -i + (creature_id.empty() || creature_idx == creature_id_int) + // Check for -c + && (creature_type.empty() || toCaps(string(Materials->raceEx[creature.race].rawname)) == toCaps(creature_type)) + // Check for -nn + && ((find_nonicks == true && hasnick == false) + || (find_nicks == true && hasnick == true) + || (find_nicks == false && find_nonicks == false)) + && (find_nonicks == false || creature.name.nickname[0] == '\0') + && (!creature.flags1.bits.dead) + ) + { + printCreature(DF,creature,creature_idx); + addrs.push_back(creature.origin); + + bool dochange = ( + remove_skills + || remove_labors || add_labor || remove_labor + || make_hauler || remove_hauler + || make_engraver || make_mason + || set_happiness + || set_mood + ); + + // 96=Child, 97=Baby + if (creature.profession == 96 || creature.profession == 97) + { + dochange = false; + } + + bool allow_massdesignation = + !creature_id.empty() || toCaps(creature_type) != "Dwarf" || find_nonicks == true || force_massdesignation; + if (dochange == true && allow_massdesignation == false) + { + cout + << "Not changing creature because none of -c (other than dwarf), -i or -nn was" << endl + << "selected. Add -f to still do mass designation." << endl; + dochange = false; + } + + // cout << "dochange = " << int(dochange) << endl; + // cout << "remove_skills = " << int(remove_skills) << endl; + // cout << "remove_labors = " << int(remove_labors) << endl; + // cout << "add_labor = " << int(add_labor) << endl; + // cout << "remove_labor = " << int(remove_labor) << endl; + // cout << "make_hauler = " << int(make_hauler) << endl; + // cout << "remove_hauler = " << int(remove_hauler) << endl; + // cout << "make_engraver = " << int(make_engraver) << endl; + // cout << "make_mason = " << int(make_mason) << endl; + // cout << "allow_massdesignation = " << int(allow_massdesignation) << endl; + // cout << "force_massdesignation = " << int(force_massdesignation) << endl; + // cout << "creature.profession = " << int(creature.profession) << endl; + + if (dochange) + { + if(creature.has_default_soul) + { + if (set_mood) + { + cout << "Setting mood to " << set_mood_n << "..." << endl; + Creatures->WriteMood(creature_idx, set_mood_n); + } + + if (set_happiness) + { + cout << "Setting happiness to " << set_happiness_n << "..." << endl; + Creatures->WriteHappiness(creature_idx, set_happiness_n); + } + + if (remove_skills) + { + DFHack::t_soul & soul = creature.defaultSoul; + + cout << "Removing skills..." << endl; + for(unsigned int sk = 0; sk < soul.numSkills;sk++) + { + soul.skills[sk].rating=0; + soul.skills[sk].experience=0; + } + // Doesn't work anyways, so better leave it alone + //soul.numSkills=0; + if (Creatures->WriteSkills(creature_idx, soul) == true) { + cout << "Success writing skills." << endl; + } else { + cout << "Error writing skills." << endl; + } + } + + if (add_labor || remove_labor || remove_labors || make_hauler || remove_hauler || make_engraver || make_mason) + { + if (add_labor) { + cout << "Adding labor " << add_labor_n << "..." << endl; + creature.labors[add_labor_n] = 1; + } + + if (remove_labor) { + cout << "Removing labor " << remove_labor_n << "..." << endl; + creature.labors[remove_labor_n] = 0; + } + + if (remove_labors) { + cout << "Removing labors..." << endl; + for(unsigned int lab = 0; lab < NUM_CREATURE_LABORS; lab++) { + creature.labors[lab] = 0; + } + } + if (remove_hauler) { + cout << "Removing hauler labors..." << endl; + creature.labors[1] = 0; + creature.labors[2] = 0; + creature.labors[3] = 0; + creature.labors[4] = 0; + creature.labors[5] = 0; + creature.labors[6] = 0; + creature.labors[7] = 0; + creature.labors[8] = 0; + creature.labors[9] = 0; + creature.labors[22] = 0; + creature.labors[23] = 0; + } + if (make_hauler) { + cout << "Setting hauler labors..." << endl; + creature.labors[1] = 1; + creature.labors[2] = 1; + creature.labors[3] = 1; + creature.labors[4] = 1; + creature.labors[5] = 1; + creature.labors[6] = 1; + creature.labors[7] = 1; + creature.labors[8] = 1; + creature.labors[9] = 1; + creature.labors[22] = 1; + creature.labors[23] = 1; + } + if (make_engraver) { + cout << "Setting 'Stone Detailing'..." << endl; + creature.labors[12] = 1; + } + if (make_mason) { + cout << "Setting 'Masonry'..." << endl; + creature.labors[13] = 1; + } + if (Creatures->WriteLabors(creature_idx, creature.labors) == true) { + cout << "Success writing labors." << endl; + } else { + cout << "Error writing labors." << endl; + } + } + } + else + { + cout << "Error removing skills: Creature has no default soul." << endl; + } + printCreature(DF,creature,creature_idx); + } /* End remove skills/labors */ + cout << endl; + } /* if (print creature) */ + } /* End for(all creatures) */ } /* End if (we need to walk creatures) */ Creatures->Finish(); DF->Detach(); if (quiet == false) { - cout << "Done. Press any key to continue" << endl; - cin.ignore(); + cout << "Done. Press any key to continue" << endl; + cin.ignore(); } return 0; }