diff --git a/examples/catsplosion.cpp b/examples/catsplosion.cpp index f99effb50..17a96f647 100644 --- a/examples/catsplosion.cpp +++ b/examples/catsplosion.cpp @@ -1,13 +1,18 @@ // Catsplosion -// By Zhentar -// This work of evil makes every cat, male or female, grown or kitten, pregnant +// By Zhentar , Further modified by dark_rabite, peterix, belal +// This work of evil makes animals pregnant // and due within 2 in-game hours... #include -#include #include -#include +#include +#include +#include #include // for rand() +#include // for std::transform +#include +#include +#include using namespace std; #include @@ -15,6 +20,7 @@ using namespace std; #include #include #include +#include vector creaturestypes; @@ -22,18 +28,40 @@ DFHack::memory_info *mem; DFHack::Process *proc; uint32_t creature_pregnancy_offset; -int fertilizeCat(DFHack::API & DF, const DFHack::t_creature & creature) +bool femaleonly = 0; +bool showcreatures = 0; +int maxpreg = 1000; // random start value, since its not required and im not sure how to set it to infinity +list s_creatures; + +int main ( int argc, char** argv ) { - if(string(creaturestypes[creature.type].id) == "CAT") + // parse input, handle this nice and neat before we get to the connecting + argstream as(argc,argv); + as >>option('f',"female",femaleonly,"Impregnate females only") + >>option('s',"show",showcreatures,"Show creature list (read only)") + >>parameter('m',"max",maxpreg,"The maximum limit of pregnancies ", false) + >>values(back_inserter(s_creatures), "any number of creatures") + >>help(); + + if (!as.isOk()) { - proc->writeDWord(creature.origin + creature_pregnancy_offset, rand() % 100 + 1); - return 1; + cout << as.errorLog(); + return(0); + } + else if (as.helpRequested()) + { + cout< male_counts; + map female_counts; + for(uint32_t i =0;i < numCreatures;i++) + { + DFHack::t_creature creature; + DF.ReadCreature(i,creature); + if(creature.sex == 1){ + male_counts[creaturestypes[creature.type].id]++; + female_counts[creaturestypes[creature.type].id]+=0; //auto initialize the females as well + } + else{ + female_counts[creaturestypes[creature.type].id]++; + male_counts[creaturestypes[creature.type].id]+=0; + } + } + cout << "Type\t\t\tMale #\tFemale #" << endl; + for(map::iterator it1 = male_counts.begin();it1!=male_counts.end();it1++) + { + cout << it1->first << "\t\t" << it1->second << "\t" << female_counts[it1->first] << endl; + } + return(1); + } - for(uint32_t i = 0; i < numCreatures; i++) + for(uint32_t i = 0; i < numCreatures && totalchanged != maxpreg; i++) { - DFHack::t_creature temp; - DF.ReadCreature(i,temp); - cats+=fertilizeCat(DF,temp); + DFHack::t_creature creature; + DF.ReadCreature(i,creature); + if (showcreatures == 1) + { + if (creature.sex == 0) { sextype = "Female"; } else { sextype = "Male";} + cout << string(creaturestypes[creature.type].id) << ":" << sextype << "" << endl; + } + else + { + s_creatures.unique(); + for (list::iterator it = s_creatures.begin(); it != s_creatures.end(); ++it) + { + std::string clinput = *it; + std::transform(clinput.begin(), clinput.end(), clinput.begin(), ::toupper); + if(string(creaturestypes[creature.type].id) == clinput) + { + if((femaleonly == 1 && creature.sex == 0) || (femaleonly != 1)) + { + proc->writeDWord(creature.origin + creature_pregnancy_offset, rand() % 100 + 1); + totalchanged+=1; + totalcount+=1; + } + else + { + totalcount+=1; + } + } + } + } } - cout << cats << " cats impregnated." << endl; + cout << totalchanged << " animals impregnated out of a possible " << totalcount << "." << endl; DF.FinishReadCreatures(); DF.Detach(); @@ -89,4 +172,4 @@ int main (void) cin.ignore(); #endif return 0; -} +} \ No newline at end of file diff --git a/output/Memory.xml b/output/Memory.xml index 5317f5f8a..6675cceb7 100644 --- a/output/Memory.xml +++ b/output/Memory.xml @@ -1619,7 +1619,7 @@ 0x00F0 0x160 0x164 - 0x00A0 + 0x190 0x02F8 0x0200 0x264