From d3aa112605eb394339ea45d7fdff35b5c0f5666f Mon Sep 17 00:00:00 2001 From: Andrew Wright Date: Mon, 12 Feb 2018 23:12:15 +0000 Subject: [PATCH] Allow creatures of noble birth to be ransomed. --- collective.cpp | 9 ++++++++- collective_config.cpp | 1 + creature_factory.cpp | 9 +++++++++ gui_builder.cpp | 1 + minion_activity.h | 1 + minion_activity_map.cpp | 4 ++++ skill.cpp | 1 + skill.h | 3 ++- task.h | 1 + 9 files changed, 28 insertions(+), 2 deletions(-) diff --git a/collective.cpp b/collective.cpp index 8ee19d29d..3b92cc914 100644 --- a/collective.cpp +++ b/collective.cpp @@ -675,7 +675,8 @@ void Collective::onEvent(const GameEvent& event) { auto victim = info.victim; if (creatures.contains(victim)) { if (Random.roll(30)) { - if (Random.roll(2)) { + int resistance = victim->getAttributes().getSkills().getValue(SkillId::NOBILITY) * 10; + if (!Random.roll(2 + resistance)) { victim->dieWithReason("killed by torture"); } else { control->addMessage("A prisoner is converted to your side"); @@ -1319,6 +1320,12 @@ void Collective::onAppliedSquare(WCreature c, Position pos) { case FurnitureType::GALLOWS: taskMap->addTask(Task::kill(this, c), pos, MinionActivity::WORKING); break; + case FurnitureType::TREASURE_CHEST: { + int ransomValue = c->getAttributes().getSkills().getValue(SkillId::NOBILITY) * 300; + returnResource({ResourceId::GOLD, ransomValue}); + banishCreature(c); + break; + } case FurnitureType::TORTURE_TABLE: taskMap->addTask(Task::torture(this, c), pos, MinionActivity::WORKING); break; diff --git a/collective_config.cpp b/collective_config.cpp index 7efb1f311..bb0823fe5 100644 --- a/collective_config.cpp +++ b/collective_config.cpp @@ -493,6 +493,7 @@ const MinionActivityInfo& CollectiveConfig::getActivityInfo(MinionActivity task) case MinionActivity::BE_WHIPPED: return {FurnitureType::WHIPPING_POST, "being whipped"}; case MinionActivity::BE_TORTURED: return {FurnitureType::TORTURE_TABLE, "being tortured"}; case MinionActivity::BE_EXECUTED: return {FurnitureType::GALLOWS, "being executed"}; + case MinionActivity::BE_RANSOMED: return {FurnitureType::TREASURE_CHEST, "being ransomed"}; case MinionActivity::CRAFT: return {[](WConstCollective col, WConstCreature c, FurnitureType t) { if (auto type = getWorkshopType(t)) return !c || !col || (c->getAttributes().getSkills().getValue(getWorkshopInfo(*type).skill) > 0 && diff --git a/creature_factory.cpp b/creature_factory.cpp index 1bcba18c9..a0b0def78 100644 --- a/creature_factory.cpp +++ b/creature_factory.cpp @@ -1098,6 +1098,7 @@ CreatureAttributes CreatureFactory::getAttributesFromId(CreatureId id) { case CreatureId::DEMON_LORD: return CATTR( c.viewId = ViewId::DEMON_LORD; + c.skills.setValue(SkillId::NOBILITY, 0.1); c.attr = LIST(40_dam, 45_def, 50_spell_dam ); c.body = Body::humanoidSpirit(Body::Size::LARGE); c.body->addWings(); @@ -1197,6 +1198,7 @@ CreatureAttributes CreatureFactory::getAttributesFromId(CreatureId id) { case CreatureId::KNIGHT: return CATTR( c.viewId = ViewId::KNIGHT; + c.skills.setValue(SkillId::NOBILITY, 0.1); c.attr = LIST(36_dam, 28_def ); c.body = Body::humanoid(Body::Size::LARGE); c.maxLevelIncrease[ExperienceType::MELEE] = 4; @@ -1216,6 +1218,7 @@ CreatureAttributes CreatureFactory::getAttributesFromId(CreatureId id) { case CreatureId::AVATAR: return CATTR( c.viewId = ViewId::DUKE; + c.skills.setValue(SkillId::NOBILITY, 0.8); c.attr = LIST(43_dam, 32_def ); c.body = Body::humanoid(Body::Size::LARGE); c.permanentEffects[LastingEffect::MELEE_RESISTANCE] = 1; @@ -1500,6 +1503,7 @@ CreatureAttributes CreatureFactory::getAttributesFromId(CreatureId id) { case CreatureId::GNOME_CHIEF: return CATTR( c.viewId = ViewId::GNOME_BOSS; + c.skills.setValue(SkillId::NOBILITY, 0.3); c.attr = LIST(15_dam, 16_def ); c.body = Body::humanoid(Body::Size::MEDIUM); c.skills.setValue(SkillId::JEWELER, 1); @@ -1596,6 +1600,7 @@ CreatureAttributes CreatureFactory::getAttributesFromId(CreatureId id) { case CreatureId::DWARF_BARON: return CATTR( c.viewId = ViewId::DWARF_BARON; + c.skills.setValue(SkillId::NOBILITY, 0.8); c.attr = LIST(28_dam, 32_def ); c.body = Body::humanoid(Body::Size::MEDIUM); c.body->setWeight(120); @@ -1624,6 +1629,7 @@ CreatureAttributes CreatureFactory::getAttributesFromId(CreatureId id) { case CreatureId::LIZARDLORD: return CATTR( c.viewId = ViewId::LIZARDLORD; + c.skills.setValue(SkillId::NOBILITY, 0.5); c.attr = LIST(30_dam, 16_def ); c.body = Body::humanoid(Body::Size::MEDIUM); c.permanentEffects[LastingEffect::POISON_RESISTANT] = 1; @@ -1674,6 +1680,7 @@ CreatureAttributes CreatureFactory::getAttributesFromId(CreatureId id) { case CreatureId::ELF_LORD: return CATTR( c.viewId = ViewId::ELF_LORD; + c.skills.setValue(SkillId::NOBILITY, 0.6); c.attr = LIST(22_dam, 14_def, 16_spell_dam, 30_ranged_dam ); c.body = Body::humanoid(Body::Size::MEDIUM); c.chatReactionFriendly = "curses all dwarves"_s; @@ -1732,6 +1739,7 @@ CreatureAttributes CreatureFactory::getAttributesFromId(CreatureId id) { case CreatureId::DARK_ELF_LORD: return CATTR( c.viewId = ViewId::DARK_ELF_LORD; + c.skills.setValue(SkillId::NOBILITY, 0.6); c.attr = LIST(22_dam, 14_def, 16_spell_dam ); c.body = Body::humanoid(Body::Size::MEDIUM); c.chatReactionFriendly = "curses all dwarves"_s; @@ -2035,6 +2043,7 @@ CreatureAttributes CreatureFactory::getAttributesFromId(CreatureId id) { case CreatureId::ELEMENTALIST: return CATTR( c.viewId = ViewId::ELEMENTALIST; + c.skills.setValue(SkillId::NOBILITY, 0.1); c.attr = LIST(15_dam, 20_def, 15_spell_dam ); c.body = Body::humanoid(Body::Size::LARGE); c.skills.setValue(SkillId::LABORATORY, 1); diff --git a/gui_builder.cpp b/gui_builder.cpp index fcc60f57e..50208574e 100644 --- a/gui_builder.cpp +++ b/gui_builder.cpp @@ -2372,6 +2372,7 @@ static string getTaskText(MinionActivity option) { case MinionActivity::THRONE: return "Throne"; case MinionActivity::BE_WHIPPED: return "Being whipped"; case MinionActivity::BE_TORTURED: return "Being tortured"; + case MinionActivity::BE_RANSOMED: return "Being ransomed"; case MinionActivity::BE_EXECUTED: return "Being executed"; } } diff --git a/minion_activity.h b/minion_activity.h index b9ffa9089..3a541bb5c 100644 --- a/minion_activity.h +++ b/minion_activity.h @@ -21,6 +21,7 @@ RICH_ENUM( THRONE, BE_WHIPPED, BE_TORTURED, + BE_RANSOMED, BE_EXECUTED, CONSTRUCTION, DIGGING, diff --git a/minion_activity_map.cpp b/minion_activity_map.cpp index f5608ae58..b43ec097e 100644 --- a/minion_activity_map.cpp +++ b/minion_activity_map.cpp @@ -28,6 +28,7 @@ bool MinionActivityMap::canChooseRandomly(WConstCreature c, MinionActivity t) co case MinionActivity::BE_EXECUTED: case MinionActivity::BE_WHIPPED: case MinionActivity::BE_TORTURED: + case MinionActivity::BE_RANSOMED: return false; case MinionActivity::SLEEP: return !c->isAffected(LastingEffect::RESTED); @@ -73,6 +74,9 @@ bool MinionActivityMap::isAvailable(WConstCollective col, WConstCreature c, Mini case MinionActivity::BE_EXECUTED: case MinionActivity::BE_TORTURED: return col->hasTrait(c, MinionTrait::PRISONER); + case MinionActivity::BE_RANSOMED: + return col->hasTrait(c, MinionTrait::PRISONER) && + c->getAttributes().getSkills().getValue(SkillId::NOBILITY) > 0; case MinionActivity::CRAFT: return c->getAttributes().getSkills().getValue(SkillId::FORGE) > 0 || c->getAttributes().getSkills().getValue(SkillId::WORKSHOP) > 0 || diff --git a/skill.cpp b/skill.cpp index 92bab7bdd..4da63cad2 100644 --- a/skill.cpp +++ b/skill.cpp @@ -66,6 +66,7 @@ void Skill::init() { Skill::set(SkillId::LABORATORY, new Skill("laboratory", "Craft items in the laboratory.", false)); Skill::set(SkillId::JEWELER, new Skill("jeweler", "Craft items at the jeweler's shop.", false)); Skill::set(SkillId::FURNACE, new Skill("furnace", "Craft items at the furnace.", false)); + Skill::set(SkillId::NOBILITY, new Skill("nobility", "Resist torture but can be ransomed for gold.", false)); } bool Skill::transferOnConsumption() const { diff --git a/skill.h b/skill.h index 315aff569..b0a5d6fde 100644 --- a/skill.h +++ b/skill.h @@ -41,7 +41,8 @@ RICH_ENUM(SkillId, FURNACE, EXPLORE, EXPLORE_NOCTURNAL, - EXPLORE_CAVES + EXPLORE_CAVES, + NOBILITY ); class Creature; diff --git a/task.h b/task.h index f3cb20a77..702b70b6f 100644 --- a/task.h +++ b/task.h @@ -59,6 +59,7 @@ class Task : public UniqueEntity, public OwnedObject { static PTask pickItem(WTaskCallback, Position, vector); static PTask kill(WTaskCallback, WCreature); static PTask torture(WTaskCallback, WCreature); + static PTask ransom(WTaskCallback, WCreature); static PTask sacrifice(WTaskCallback, WCreature); static PTask disappear(); static PTask chain(PTask, PTask);