From 7f14e109fa239c0919a150d6ab28964a774fc24d Mon Sep 17 00:00:00 2001 From: Quietust Date: Sun, 19 Jan 2014 20:31:15 -0600 Subject: [PATCH] Use DF-compatible RNG for better randomness --- plugins/strangemood.cpp | 98 +++++++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 48 deletions(-) diff --git a/plugins/strangemood.cpp b/plugins/strangemood.cpp index 9b64a525c..00da1f4f5 100644 --- a/plugins/strangemood.cpp +++ b/plugins/strangemood.cpp @@ -9,6 +9,7 @@ #include "modules/Items.h" #include "modules/Job.h" #include "modules/Translation.h" +#include "modules/Random.h" #include "DataDefs.h" #include "df/d_init.h" @@ -40,6 +41,8 @@ using df::global::created_item_subtype; using df::global::created_item_mattype; using df::global::created_item_matindex; +Random::MersenneRNG rng; + bool isUnitMoodable (df::unit *unit) { if (!Units::isCitizen(unit)) @@ -107,7 +110,7 @@ df::job_skill getMoodSkill (df::unit *unit) } if (!skills.size()) skills.push_back(job_skill::STONECRAFT); - return skills[rand() % skills.size()]; + return skills[rng.df_trandom(skills.size())]; } int getCreatedMetalBars (int32_t idx) @@ -127,14 +130,14 @@ void selectWord (const df::world_raws::T_language::T_word_table &table, int32_t { if (table.parts[mode].size()) { - int offset = rand() % table.parts[mode].size(); + int offset = rng.df_trandom(table.parts[mode].size()); word = table.words[mode][offset]; part = table.parts[mode][offset]; } else { - word = rand() % world->raws.language.words.size(); - part = (df::part_of_speech)(rand() % 9); + word = rng.df_trandom(world->raws.language.words.size()); + part = (df::part_of_speech)(rng.df_trandom(9)); Core::getInstance().getConsole().printerr("Impoverished Word Selector"); } } @@ -147,13 +150,13 @@ void generateName(df::language_name &output, int language, int mode, const df::w { output = df::language_name(); if (language == -1) - language = rand() % world->raws.language.translations.size(); + language = rng.df_trandom(world->raws.language.translations.size()); output.unknown = mode; output.language = language; } output.has_name = 1; if (output.language == -1) - output.language = rand() % world->raws.language.translations.size(); + output.language = rng.df_trandom(world->raws.language.translations.size()); int r, r2, r3; switch (mode) { @@ -169,7 +172,7 @@ void generateName(df::language_name &output, int language, int mode, const df::w if (mode != 10) { case 4: case 37: // this is not a typo - if (rand() % 2) + if (rng.df_trandom(2)) { selectWord(table2, output.words[0], output.parts_of_speech[0], 0); selectWord(table1, output.words[1], output.parts_of_speech[1], 1); @@ -183,10 +186,10 @@ void generateName(df::language_name &output, int language, int mode, const df::w break; case 1: case 13: case 20: - r = rand() % 3; + r = rng.df_trandom(3); if (r == 0 || r == 1) { - if (rand() % 2) + if (rng.df_trandom(2)) { selectWord(table2, output.words[0], output.parts_of_speech[0], 0); selectWord(table1, output.words[1], output.parts_of_speech[1], 1); @@ -200,20 +203,20 @@ void generateName(df::language_name &output, int language, int mode, const df::w if (r == 1 || r == 2) { case 3: case 8: case 11: // this is not a typo either - r2 = rand() % 2; + r2 = rng.df_trandom(2); if (r2) selectWord(table1, output.words[5], output.parts_of_speech[5], 2); else selectWord(table2, output.words[5], output.parts_of_speech[5], 2); - r3 = rand() % 3; - if (rand() % 50) - r3 = rand() % 2; + r3 = rng.df_trandom(3); + if (rng.df_trandom(50)) + r3 = rng.df_trandom(2); switch (r3) { case 0: case 2: if (r3 == 2) - r2 = rand() % 2; + r2 = rng.df_trandom(2); if (r2) selectWord(table2, output.words[6], output.parts_of_speech[6], 5); else @@ -226,14 +229,14 @@ void generateName(df::language_name &output, int language, int mode, const df::w selectWord(table1, output.words[2], output.parts_of_speech[2], 3); else selectWord(table2, output.words[2], output.parts_of_speech[2], 3); - if (!(rand() % 100)) + if (!(rng.df_trandom(100))) selectWord(table1, output.words[3], output.parts_of_speech[3], 3); break; } } - if (rand() % 100) + if (rng.df_trandom(100)) { - if (rand() % 2) + if (rng.df_trandom(2)) selectWord(table1, output.words[4], output.parts_of_speech[4], 4); else selectWord(table2, output.words[4], output.parts_of_speech[4], 4); @@ -246,9 +249,9 @@ void generateName(df::language_name &output, int language, int mode, const df::w case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 38: case 39: selectWord(table1, output.words[5], output.parts_of_speech[5], 2); - r3 = rand() % 3; - if (rand() % 50) - r3 = rand() % 2; + r3 = rng.df_trandom(3); + if (rng.df_trandom(50)) + r3 = rng.df_trandom(2); switch (r3) { case 0: @@ -258,16 +261,16 @@ void generateName(df::language_name &output, int language, int mode, const df::w break; case 1: selectWord(table2, output.words[2], output.parts_of_speech[2], 3); - if (!(rand() % 100)) + if (!(rng.df_trandom(100))) selectWord(table2, output.words[3], output.parts_of_speech[3], 3); break; } - if (rand() % 100) + if (rng.df_trandom(100)) selectWord(table2, output.words[4], output.parts_of_speech[4], 4); break; case 7: - r = rand() % 3; + r = rng.df_trandom(3); if (r == 0 || r == 1) { selectWord(table2, output.words[0], output.parts_of_speech[0], 0); @@ -275,14 +278,14 @@ void generateName(df::language_name &output, int language, int mode, const df::w } if (r == 1 || r == 2) { - r2 = rand() % 2; + r2 = rng.df_trandom(2); if (r == 2 || r2 == 1) selectWord(table1, output.words[5], output.parts_of_speech[5], 2); else selectWord(table2, output.words[5], output.parts_of_speech[5], 2); - r3 = rand() % 3; - if (rand() % 50) - r3 = rand() % 2; + r3 = rng.df_trandom(3); + if (rng.df_trandom(50)) + r3 = rng.df_trandom(2); switch (r3) { case 0: @@ -292,12 +295,12 @@ void generateName(df::language_name &output, int language, int mode, const df::w break; case 1: selectWord(table2, output.words[2], output.parts_of_speech[2], 3); - if (!(rand() % 100)) + if (!(rng.df_trandom(100))) selectWord(table2, output.words[3], output.parts_of_speech[3], 3); break; } } - if (rand() % 100) + if (rng.df_trandom(100)) selectWord(table2, output.words[4], output.parts_of_speech[4], 4); break; } @@ -610,7 +613,7 @@ command_result df_strangemood (color_ostream &out, vector & parameters) out.printerr("No units are eligible to enter a mood!\n"); return CR_FAILURE; } - unit = moodable_units[tickets[rand() % tickets.size()]]; + unit = moodable_units[tickets[rng.df_trandom(tickets.size())]]; } df::unit_soul *soul = unit->status.current_soul; @@ -626,9 +629,9 @@ command_result df_strangemood (color_ostream &out, vector & parameters) // If no mood type was specified, pick one randomly if (type == mood_type::None) { - if (rand() % 100 > unit->status.happiness) + if (rng.df_trandom(100) > unit->status.happiness) { - switch (rand() % 2) + switch (rng.df_trandom(2)) { case 0: type = mood_type::Fell; break; case 1: type = mood_type::Macabre; break; @@ -636,7 +639,7 @@ command_result df_strangemood (color_ostream &out, vector & parameters) } else { - switch (rand() % 3) + switch (rng.df_trandom(3)) { case 0: type = mood_type::Fey; break; case 1: type = mood_type::Secretive; break; @@ -771,9 +774,9 @@ command_result df_strangemood (color_ostream &out, vector & parameters) } // The dwarf will want 1-3 of the base material - int base_item_count = 1 + (rand() % 3); + int base_item_count = 1 + rng.df_trandom(3); // Gem Cutters and Gem Setters have a 50% chance of using only one base item - if (((skill == job_skill::CUTGEM) || (skill == job_skill::ENCRUSTGEM)) && (rand() % 2)) + if (((skill == job_skill::CUTGEM) || (skill == job_skill::ENCRUSTGEM)) && (rng.df_trandom(2))) base_item_count = 1; // Choose the base material @@ -789,7 +792,7 @@ command_result df_strangemood (color_ostream &out, vector & parameters) } else if (job->job_type == job_type::StrangeMoodBrooding) { - switch (rand() % 3) + switch (rng.df_trandom(3)) { case 0: job->job_items.push_back(item = new df::job_item()); @@ -930,7 +933,7 @@ command_result df_strangemood (color_ostream &out, vector & parameters) } if (!found_pref) { - switch (rand() % 3) + switch (rng.df_trandom(3)) { case 0: item->flags2.bits.silk = true; @@ -1000,7 +1003,7 @@ command_result df_strangemood (color_ostream &out, vector & parameters) } } if (mats.size()) - item->mat_index = mats[rand() & mats.size()]; + item->mat_index = mats[rng.df_trandom(mats.size())]; item->quantity = base_item_count; } break; @@ -1042,7 +1045,7 @@ command_result df_strangemood (color_ostream &out, vector & parameters) mats.push_back(builtin_mats::GLASS_CLEAR); if (have_glass[2]) mats.push_back(builtin_mats::GLASS_CRYSTAL); - item->mat_type = mats[rand() % mats.size()]; + item->mat_type = mats[rng.df_trandom(mats.size())]; } item->quantity = base_item_count; break; @@ -1096,9 +1099,7 @@ command_result df_strangemood (color_ostream &out, vector & parameters) (job->job_type == job_type::StrangeMoodFell) )) { - int extra_items = (ui->tasks.num_artifacts * 20 + moodable_units.size()) / 20; - if (extra_items > 0) - extra_items = std::min(rand() % (extra_items + 1), 7); + int extra_items = std::min(rng.df_trandom((ui->tasks.num_artifacts * 20 + moodable_units.size()) / 20 + 1), 7); df::item_type avoid_type = item_type::NONE; int avoid_glass = 0; switch (skill) @@ -1137,9 +1138,9 @@ command_result df_strangemood (color_ostream &out, vector & parameters) } for (size_t i = 0; i < extra_items; i++) { - if ((job->job_type == job_type::StrangeMoodBrooding) && (rand() % 2)) + if ((job->job_type == job_type::StrangeMoodBrooding) && (rng.df_trandom(2))) { - switch (rand() % 3) + switch (rng.df_trandom(3)) { case 0: job->job_items.push_back(item = new df::job_item()); @@ -1170,7 +1171,7 @@ command_result df_strangemood (color_ostream &out, vector & parameters) item_type = item_type::NONE; mat_type = -1; flags2.whole = 0; - switch (rand() % 10) + switch (rng.df_trandom(10)) { case 0: item_type = item_type::WOOD; @@ -1207,7 +1208,7 @@ command_result df_strangemood (color_ostream &out, vector & parameters) case 8: item_type = item_type::CLOTH; mat_type = -1; - switch (rand() % 3) + switch (rng.df_trandom(3)) { case 0: flags2.bits.plant = true; @@ -1222,7 +1223,7 @@ command_result df_strangemood (color_ostream &out, vector & parameters) break; case 9: item_type = item_type::ROUGH; - switch (rand() % 3) + switch (rng.df_trandom(3)) { case 0: mat_type = builtin_mats::GLASS_GREEN; @@ -1281,7 +1282,7 @@ command_result df_strangemood (color_ostream &out, vector & parameters) else { generateName(unit->status.artifact_name, unit->name.language, 1, world->raws.language.word_table[0][1], world->raws.language.word_table[1][1]); - if (!(rand() % 100)) + if (!rng.df_trandom(100)) unit->status.artifact_name = unit->name; } unit->unk_18e = 0; @@ -1302,6 +1303,7 @@ DFhackCExport command_result plugin_init (color_ostream &out, std::vector