Repository: MegaMek/mekhq
Pull request #6277: Enhanced Ronin Event
Author: login: IllianiBird
Labels: name: AtB
name: Tests
description: Issues or Pull Requests related to the project tests
name: Legacy Improvement
description: Improves a legacy setup's handling.
name: Improvement to Existing Feature
description: Used with the RFE tag to indicate an improvement to an existing feature
Created: 2025-03-14T22:35:51Z | Merged: 2025-03-23T00:03:25Z

- Implemented `getRoninMessage` in the `Aggression`, `Ambition`, `Greed` and `Social` enums to format and retrieve messages for Ronin warriors.
- Added corresponding unit tests to ensure `getRoninMessage` generates valid resource keys for all `Aggression`, `Ambition`, `Greed` and `Social` values.
- Simplified recruitment calls by replacing `recruitRonin` with an instance of `RoninOffer`.
- Modified RoninOffer to randomize Ronin personnel roles between MEKWARRIOR and AEROSPACE_PILOT. 
- Integrated RandomSkillPreferences in preparation for conflict resolution with #6273
- Extracted Ronin recruitment logic from `AtBContract` into a new `RoninOffer` class to improve modularity and maintainability.
- Introduced `RoninOfferDialog` to handle Ronin character recruitment with in-character and out-of-character messaging.
- Created `generateBigPersonality` method to assign detailed personality traits for major characters, ensuring unique profiles.

### Requirements
Requires #6295

### Dev Notes
Currently, each month (while on an AtB contract) there is a chance a Veteran MekWarrior will randomly join the campaign. In 50.03 these were rebranded as 'Ronin'. With some minor alterations. In 50.05 they will be playing a much bigger role as part of the Recruitment Overhaul.

In preparation for those changes I've gone ahead and isolated the ronin code into its own class. Furthermore, I went ahead and improved the event presentation. Now, when a Ronin event occurs, the player will be presented with a message from their HR representative.

![image](https://github.com/user-attachments/assets/a80de82c-e108-4555-92f4-373f95e08c4b)

If the message is accepted, the player will be presented with a follow-up message from the Ronin themselves. The text in this message will be unique, based on the personality of the Ronin themselves. There are 120 different messages the player can receive. I've included some examples below:

<img width="589" alt="image" src="https://github.com/user-attachments/assets/41e8110a-6672-422b-8c97-13733017ea20" />

<img width="588" alt="image" src="https://github.com/user-attachments/assets/e2cc2ce1-bf20-4470-83f8-65e1c02ffaff" />

<img width="587" alt="image" src="https://github.com/user-attachments/assets/6ae798a0-7c58-47da-bc2b-62c132d3674f" />

<img width="588" alt="image" src="https://github.com/user-attachments/assets/02bf201a-b2b3-4745-9e81-c1f36bf3d91d" />

Another reason why we've moved to these dialogs is that it gives the player the opportunity to refuse the Ronin, if they don't align with their campaign.

Finally, I've added a 1in4 chance that a Ronin will be a AeroSpace Pilot instead of a MekWarrior.



Diff:
diff --git a/MekHQ/resources/mekhq/resources/Aggression.properties b/MekHQ/resources/mekhq/resources/Aggression.properties
index 7eccec4a468..79abf05925f 100644
--- a/MekHQ/resources/mekhq/resources/Aggression.properties
+++ b/MekHQ/resources/mekhq/resources/Aggression.properties
@@ -7,6 +7,7 @@ NONE.description.2=ERROR: THIS SHOULDN''T BE VISIBLE! (2)
 NONE.description.3=ERROR: THIS SHOULDN''T BE VISIBLE! (3)
 NONE.description.4=ERROR: THIS SHOULDN''T BE VISIBLE! (4)
 NONE.description.5=ERROR: THIS SHOULDN''T BE VISIBLE! (5)
+NONE.ronin=ERROR: THIS SHOULDN''T BE VISIBLE! (ronin)
 
 BLOODTHIRSTY.label=Bloodthirsty
 BLOODTHIRSTY.description.0={0} revels in the chaos of battle, seeking out the most brutal\
@@ -28,6 +29,15 @@ BLOODTHIRSTY.description.4=Chaos isn''t an obstacle for {0}; it''s the natural s
 BLOODTHIRSTY.description.5=There''s a glint in {0}''s eye that never quite fades, a restless energy\
   \ that crackles just beneath the surface. Whether in conversation or silence, there is an\
   \ intensity to {4}, quiet delight in the inevitable breakdown of order.
+BLOODTHIRSTY.ronin=I''ve seen your work - you hit hard, but you could hit harder.\
+  <p>I don''t fight to survive - I fight to hunt. War isn''t a duty; it''s a thrill. The sound of\
+  \ breaking armor, the screams over comms - that''s what I live for. When the battlefield turns into\
+  \ a graveyard, I know I''ve done my job right.</p>\
+  <p>I''m not here for glory or a cause. I feel alive when I''m tearing something apart. Put me in the\
+  \ thick of it, and I''ll make sure your enemies don''t just lose - they''ll suffer.</p>\
+  <p>If you want clean kills, look elsewhere. But if you need someone who thrives in chaos and is\
+  \ still standing when the smoke clears - I''m your answer.</p>\
+  <p>Give the order, {0} - and watch the bodies fall.</p>
 
 BOLD.label=Bold
 BOLD.description.0={0} never hesitates to take the lead, charging headfirst into danger with\
@@ -49,6 +59,13 @@ BOLD.description.4=To {0}, obstacles are just opportunities that haven''t realiz
 BOLD.description.5=There''s a fire in {0}''s eyes that never dims, a relentless drive that refuses\
   \ to acknowledge limits. Whether facing a challenge or simply making {6} presence known, {2}\
   \ {7, choice, 0#move|1#moves} through life like {2}''{7, choice, 0#ve|1#s} already won.
+BOLD.ronin=I hear you''ve got an operation underway. Sounds like you know how to handle yourself -\
+  \ but you could use someone who knows how to win.\
+  <p>I don''t hesitate or second-guess. When the bullets fly and the lines break, I''ll be at the front\
+  \ - driving the charge, taking the risks, and making the calls. The ones who wait die first. The\
+  \ ones who lead decide how the story ends.</p>\
+  <p>Put me in the fight and I''ll deliver - fast, loud, and decisive.</p>\
+  <p>Just say the word - I''m ready.</p>
 
 AGGRESSIVE.label=Aggressive
 AGGRESSIVE.description.0={0} believes the best defense is an overwhelming offense, always pushing\
@@ -69,6 +86,13 @@ AGGRESSIVE.description.4=Patience is just wasted time in {0}''s eyes. {1} {7, ch
 AGGRESSIVE.description.5=There''s no such thing as half-measures with {0}. Everything {2}\
   \ {7, choice, 0#do|1#does} is full-throttle, fueled by relentless determination and an\
   \ unwillingness to accept anything less than total victory.
+AGGRESSIVE.ronin=I''ve seen how you run things - solid, but you could push harder.\
+  <p>I don''t do patience. I hit first, hit hard, and keep hitting until nothing''s left standing.\
+  \ Pressure wins battles. Give the enemy a second to breathe, and you''ve already lost.</p>\
+  <p>If you want strategy, look elsewhere. But if you need someone who will crush your enemies and\
+  \ keep pushing until the job''s done - I''m your answer.</p>\
+  <p>I don''t slow down, back off, or stop. Give the order - I''ll handle the rest.</p>\
+  <p>Let me know when you''re ready to stop playing around and start winning.</p>
 
 ASSERTIVE.label=Assertive
 ASSERTIVE.description.0={0} knows what {2} {7, choice, 0#want|1#wants} and isn''t afraid to take\
@@ -91,6 +115,14 @@ ASSERTIVE.description.4=There''s no room for hesitation in {0}''s world. {1}\
 ASSERTIVE.description.5={0} isn''t interested in debates or second opinions - {2}''{7, choice, 0#re|1#s}\
   \ here to get things done. {5} confidence is a stabilizing force, {6} direction clear, and when\
   \ others waver, they instinctively look to {4} to lead the way.
+ASSERTIVE.ronin=I''ve seen how you operate - sharp, but you need someone who knows how to take charge\
+  \ when it counts.\
+  <p>I don''t hesitate or wait for permission. I see the path forward, I take it - and I expect\
+  \ everyone else to keep up. Indecision gets people killed. You need someone who can make the call\
+  \ and make it stick - that''s me.</p>\
+  <p>I''m not here to argue or second-guess. I execute, and I expect results. So, if you want someone\
+  \ who leads under pressure? You know where to find me.</p>\
+  <p>Your call, {0}.</p>
 
 BELLIGERENT.label=Belligerent
 BELLIGERENT.description.0={0} is always spoiling for a fight, whether it''s on the battlefield or\
@@ -115,6 +147,14 @@ BELLIGERENT.description.5=Every situation is a potential fight in {0}''s mind. {
   \ {7, choice, 0#don''t|1#doesn''t} care if it''s an argument, a rivalry, or a full-scale war - {2}\
   \ {7, choice, 0#treat|1#treats} them all the same: something to be won, and preferably in the\
   \ loudest, most aggressive way possible.
+BELLIGERENT.ronin=I hear you''ve got a problem that needs solving - good. I''m looking for a fight.\
+  <p>I don''t care if it''s an enemy on the battlefield or a loudmouth in the mess hall - I don''t back\
+  \ down. If someone steps up, I put them down. Simple as that. Peace is just the quiet before the\
+  \ next fight - and I''ll be ready when it starts.</p>\
+  <p>If you want someone to smooth things over, keep looking. But if you need someone who hits first,\
+  \ hits hard, and makes sure they don''t get back up - you''ve found them.</p>\
+  <p>Just give me a reason. I''m ready to start breaking things.</p>\
+  <p>Your call - but don''t expect me to wait long.</p>
 
 BRASH.label=Brash
 BRASH.description.0={0} acts first and deals with the consequences later. {1}\
@@ -139,6 +179,14 @@ BRASH.description.5=There''s no such thing as overconfidence in {0}''s mind. Whe
   \ {2}''{7, choice, 0#re|1#s} got the skills to back it up or not is irrelevant - {2}\
   \ {7, choice, 0#step|1#steps} into every situation like {2}''{7, choice, 0#ve|1#s} already won\
   \ and {7, choice, 0#let|1#lets} reality catch up later.
+BRASH.ronin=I hear you''ve got a spot open. Good - I''m ready to jump in.\
+  <p>I don''t waste time overthinking. You see an opportunity, you take it - fast and hard. Careful\
+  \ planning is for people who like to sit on the sidelines. I''d rather throw myself into the fire\
+  \ and figure it out on the way down.</p>\
+  <p>Yeah, maybe it''ll catch up with me - but not today. If you want someone who overthinks\
+  \ everything, keep looking. But if you need someone who trusts their gut and takes the shot when\
+  \ it counts - you''ve found them.</p>\
+  <p>Give the order - I''ll make it happen. Just try to keep up.</p>
 
 CONFIDENT.label=Confident
 CONFIDENT.description.0={0} carries {4}self with an effortless certainty, believing there''s no\
@@ -161,6 +209,12 @@ CONFIDENT.description.4=There''s a quiet, unshakable certainty to {0}, the kind
 CONFIDENT.description.5={0} doesn''t entertain the idea of failure. Whether it''s natural talent,\
   \ unbreakable will, or sheer force of personality, {2} {7, choice, 0#carry|1#carries} {4}self like\
   \ someone who expects to win - and usually does.
+CONFIDENT.ronin=I''ve seen how you run things - solid, but you need someone who knows how to finish.\
+  <p>I don''t hesitate or flinch. When I step onto the field, I know how it''s going to end - with me\
+  \ standing and the enemy in the dirt.</p>\
+  <p>If you want someone who second-guesses every move, keep looking. But if you need someone who\
+  \ walks into a fight knowing the outcome - and delivers - you''ve found them.</p>\
+  <p>I don''t doubt. I don''t stumble. And I don''t lose. Give the order, and I''ll deliver the win.</p>
 
 COURAGEOUS.label=Courageous
 COURAGEOUS.description.0={0} stands firm when others falter, facing danger with unwavering resolve.\
@@ -182,6 +236,13 @@ COURAGEOUS.description.5={0} doesn''t measure risk the way others do. Where they
   \ {7, choice, 0#see|1#sees} duty; where others hesitate, {2} {7, choice, 0#move|1#moves} forward.\
   \ Not because {2} {7, choice, 0#don''t|1#doesn''t} feel fear, but because {2}\
   \ {7, choice, 0#refuse|1#refuses} to let it define {4}.
+COURAGEOUS.ronin=I''ve been through enough to know that fear isn''t the enemy - hesitation is. That''s\
+  \ why I''m reaching out.\
+  <p>I don''t run when things get ugly. I don''t hesitate when the odds turn bad. When the shells are\
+  \ falling and the line is breaking, I''m the one who stands firm.</p>\
+  <p>I''m not looking for easy jobs or glory. I know what it means to face down the impossible - and\
+  \ survive it.</p>\
+  <p>You want someone who stands tall when the walls close in? I''m your answer.</p>
 
 DARING.label=Daring
 DARING.description.0={0} thrives on risk, always pushing limits and taking chances others wouldn''t\
@@ -204,6 +265,12 @@ DARING.description.5={0} doesn''t do safe. {1} {7, choice, 0#thrive|1#thrives} i
   \ uncertain, the dangerous - where risk is high and the rewards even higher. Whether it''s luck,\
   \ skill, or sheer nerve, {2} always {7, choice, 0#seem|1#seems} to come out the other side with a\
   \ grin.
+DARING.ronin=I''ve been watching your operation - looks like you''ve got things under control. But\
+  \ control only gets you so far.\
+  <p>I don''t play it safe. Caution gets people killed - boldness wins battles. I''ll take the shot no\
+  \ one else will and push through the fire when everyone else is looking for cover.</p>\
+  <p>If you want someone careful, keep looking. I thrive on the edge between victory and disaster.</p>\
+  <p>So what''s it going to be, {0}? Give the order. I''m ready.</p>
 
 DECISIVE.label=Decisive
 DECISIVE.description.0={0} doesn''t waste time with hesitation - once a decision is made, {2}\
@@ -225,6 +292,12 @@ DECISIVE.description.4={0} doesn''t dwell on uncertainty. {1} {7, choice, 0#proc
 DECISIVE.description.5=When the moment demands action, {0} doesn''t hesitate. {1}\
   \ {7, choice, 0#thrive|1#thrives} in high-pressure situations, cutting through doubt and disorder\
   \ with a clear, unwavering sense of purpose.
+DECISIVE.ronin=I''ve seen how you run things - clean and efficient.\
+  <p>While others are debating, I''m already moving. I weigh the situation, make the call, and see it\
+  \ through - no second-guessing. If you need someone who cuts through the chaos and gets things\
+  \ done, that''s me.</p>\
+  <p>If you want hesitation, keep looking. If you want action, you''ve found it.</p>\
+  <p>Your call, {0} - but don''t take too long.</p>
 
 DETERMINED.label=Determined
 DETERMINED.description.0={0} refuses to quit, no matter the odds. Whether facing superior firepower\
@@ -245,6 +318,11 @@ DETERMINED.description.4=Some call it persistence, others call it sheer stubborn
 DETERMINED.description.5=The world can throw everything it has at {0}, and {2}''ll still keep\
   \ going. {5} strength isn''t in speed or skill alone, but in sheer refusal to accept defeat, no\
   \ matter how far the odds are stacked against {4}.
+DETERMINED.ronin=I''ve been through worse than whatever you''re facing - and I''m still standing.\
+  <p>Setbacks don''t slow me down - they just give me something to push through. When others break,\
+  \ I keep moving. When the fight looks impossible, I dig deeper.</p>\
+  <p>If you need someone who keeps going when everyone else gives up - let me know, and I''ll show\
+  \ you how to beat the odds.</p>
 
 DIPLOMATIC.label=Diplomatic
 DIPLOMATIC.description.0={0} has a knack for finding common ground, turning tense situations into\
@@ -266,6 +344,10 @@ DIPLOMATIC.description.5={0} never raises {6} voice when a well-placed sentence
   \ {7, choice, 0#don''t|1#doesn''t} just smooth things over - {2} {7, choice, 0#reshape|1#reshapes}\
   \ conversations to {6} advantage, leaving even {6} rivals wondering how they ended up agreeing\
   \ with {4}.
+DIPLOMATIC.ronin=Wars aren''t just fought with firepower - they''re won with leverage.\
+  <p>I don''t just smooth things over - I shape outcomes. I know when to push, when to pull back, and\
+  \ when to make someone regret crossing the line.</p>\
+  <p>et me know if you''re ready to win the smart way.</p>
 
 DOMINEERING.label=Domineering
 DOMINEERING.description.0={0} naturally takes control of every situation, expecting others to\
@@ -287,6 +369,12 @@ DOMINEERING.description.4=Compromise is just another word for weakness in {0}''s
 DOMINEERING.description.5={0} believes leadership isn''t about consensus - it''s about control. {1}\
   \ {7, choice, 0#don''t|1#doesn''t} ask for loyalty; {2} {7, choice, 0#assume|1#assumes} it, and\
   \ those who resist quickly learn that standing in {6} way is never a good idea.
+DOMINEERING.ronin=I''ve seen how you run things - not bad, but you need someone who knows how to take\
+  \ control.\
+  <p>I don''t debate or negotiate. I make the call, and I expect it to be followed. If you want\
+  \ someone who commands respect and delivers results - that''s me.</p>\
+  <p>So you''ve got a choice. Keep things as they are - or let me show you what happens when someone\
+  \ with real authority takes the reins.</p>
 
 FEARLESS.label=Fearless
 FEARLESS.description.0={0} charges into danger without a second thought, unshaken by enemy fire or\
@@ -309,6 +397,13 @@ FEARLESS.description.5={0} treats the impossible like an invitation. {1} never {
   \ down, never {7, choice, 0#look|1#looks} back, and never {7, choice, 0#let|1#lets} fear dictate\
   \ {6} choices - because, to {4}, fear is just an excuse {2} {7, choice, 0#refuse|1#refuses} to\
   \ entertain.
+FEARLESS.ronin=I''ve seen your work. You don''t play it safe - that''s why I''m interested.\
+  <p>Most people hesitate when things get ugly - I don''t. I push forward because fear won''t change\
+  \ the outcome - action will. If death comes, I''ll meet it head-on with a smile.</p>\
+  <p>I''m not looking for a quiet life. I want a fight worth remembering. Give me the hardest job,\
+  \ the worst odds - I''ll handle it. And when the dust settles, you''ll know why I don''t think about\
+  \ failure - because I don''t lose.</p>\
+  <p>Say the word - and I''m yours.</p>
 
 HOSTILE.label=Hostile
 HOSTILE.description.0={0} meets everyone with suspicion and barely concealed aggression, always\
@@ -329,6 +424,11 @@ HOSTILE.description.4=Trust is a weakness {0} has no interest in. {1} {7, choice
 HOSTILE.description.5={0} doesn''t do diplomacy, small talk, or patience. Every interaction is\
   \ laced with an edge of hostility, as if {2}''{7, choice, 0#re|1#s} daring the world to give {4} a\
   \ reason to lash out.
+HOSTILE.ronin=I''m not here to make friends - let''s get that straight.\
+  <p>Trust gets you killed. You think someone''s got your back, and that''s when the knife goes in. I\
+  \ don''t expect loyalty, and I''m not offering any. What I am offering is results - fast, clean, and\
+  \ without hesitation.</p>\
+  <p>You don''t have to like me, {0}. Just give me the job and stay out of my way.</p>
 
 HOT_HEADED.label=Hot-Headed
 HOT_HEADED.description.0={0} acts before thinking, always ready to throw {4}self into a fight at\
@@ -349,6 +449,12 @@ HOT_HEADED.description.4=Subtlety and restraint are foreign concepts to {0}. {1}
 HOT_HEADED.description.5={0}''s patience is as short as {6} temper is explosive. {1}\
   \ {7, choice, 0#don''t|1#doesn''t} wait, doesn''t deliberate - {2} {7, choice, 0#react|1#reacts},\
   \ fast and forceful, often leaving those around {4} scrambling to keep up.
+HOT_HEADED.ronin=I''m not here to play nice - I''m here to fight. You push hard when it counts - that''s\
+  \ why I''m interested.\
+  <p>Patience isn''t my thing. When someone steps up, I hit first and figure it out later. Most people\
+  \ can''t keep up - but you run your team like you mean it.</p>\
+  <p>If you want someone careful, keep looking. If you want someone who brings the heat - give me\
+  \ the job.</p>
 
 IMPETUOUS.label=Impetuous
 IMPETUOUS.description.0={0} acts on instinct, rarely stopping to consider the consequences before\
@@ -370,6 +476,11 @@ IMPETUOUS.description.4=Patience and restraint have never been {0}''s strengths.
 IMPETUOUS.description.5={0} thrives on impulse, driven by an unshakable belief that momentum is\
   \ more important than caution. Plans are for people who doubt themselves - {0} simply does, and\
   \ lets the universe catch up.
+IMPETUOUS.ronin=I don''t do slow, and I don''t do careful. That''s why I''m coming to you.\
+  <p>I''ve seen how you run things - fast, direct, no hesitation. That''s the kind of operation I want\
+  \ in on. I don''t second-guess or overthink. You see a problem - you hit it. If it works, great. If\
+  \ it doesn''t, you hit harder.</p>\
+  <p>Just give me the green light - and watch me clear the path.</p>
 
 IMPULSIVE.label=Impulsive
 IMPULSIVE.description.0={0} makes decisions in the heat of the moment, trusting gut instinct over\
@@ -391,6 +502,12 @@ IMPULSIVE.description.4=Planning has never been {0}''s strong suit. {1} {7, choi
 IMPULSIVE.description.5={0} lives in the now, always moving, always deciding on the fly. Whether\
   \ it''s a split-second gamble or an uncalculated risk, {2} {7, choice, 0#thrive|1#thrives} in the\
   \ rush of immediate action - consequences can wait.
+IMPULSIVE.ronin=I''m not big on planning - that''s why I''m interested in your outfit. You look like\
+  \ someone who knows how to make things happen without getting lost in the details. That''s exactly\
+  \ the kind of team I want to be part of.\
+  <p>You''ve got people who follow orders - that''s fine. But you also need someone who thrives in\
+  \ chaos and makes decisions when the plan falls apart.</p>\
+  <p>Say the word - I''m ready to jump.</p>
 
 INFLEXIBLE.label=Inflexible
 INFLEXIBLE.description.0={0} follows a plan to the letter and expects others to do the same. Once\
@@ -410,6 +527,14 @@ INFLEXIBLE.description.4=Rules, plans, and decisions are set in stone as far as
   \ do the same, regardless of the circumstances.
 INFLEXIBLE.description.5={0} doesn''t waver, doesn''t compromise, and certainly doesn''t entertain\
   \ alternatives. {5} way is the right way - end of discussion, no exceptions.
+INFLEXIBLE.ronin=I''ve been watching how you run things. It''s clear you''ve got a plan - and that''s\
+  \ exactly why I''m interested.\
+  <p>I don''t do chaos. You make a plan, you stick to it - that''s how you win. Too many operations\
+  \ fail because someone panics or starts second-guessing. That''s not me. I execute the mission as\
+  \ ordered - no deviations, no hesitation.</p>\
+  <p>I see order in your unit - and I know I can make it stronger. You need someone who follows the\
+  \ plan, even when things get ugly? That''s me.</p>\
+  <p>The decision''s yours, {0}.</p>
 
 INTREPID.label=Intrepid
 INTREPID.description.0={0} faces the unknown with fearless determination, always pushing forward\
@@ -430,6 +555,12 @@ INTREPID.description.4=Risk isn''t something {0} avoids - it''s something {2} {7
 INTREPID.description.5=The more dangerous the path, the more certain {0} is that it''s the right\
   \ one. {1} {7, choice, 0#move|1#moves} forward without fear, seeing every unknown as a puzzle to\
   \ solve, a victory to claim, or a story to tell later.
+INTREPID.ronin=I''ve been out here long enough to know the safe path doesn''t get you anywhere worth\
+  \ going.\
+  <p>You''ve got a reputation for handling the hard jobs - the ones most people wouldn''t touch. That''s\
+  \ exactly the kind of fight I''m after. I don''t shy away from risk - I seek it. The tougher the\
+  \ mission, the better. After all, fortune doesn''t favor the careful - it favors the bold.</p>\
+  <p>So... you ready to take the hard road?</p>
 
 MURDEROUS.label=Murderous
 MURDEROUS.description.0={0} doesn''t just fight to win - {2} {7, choice, 0#fight|1#fights} to annihilate.\
@@ -450,6 +581,13 @@ MURDEROUS.description.4=Death isn''t just a consequence of war for {0} - it''s t
 MURDEROUS.description.5={0} isn''t satisfied with victory - {2} demands eradication. To {4}, an\
   \ enemy left standing is an enemy that wasn''t taught the right lesson, and {2} {7, choice, 0#have|1#has}\
   \ no interest in teaching it twice.
+MURDEROUS.ronin=I''ve seen how you handle things - efficient, clean. But you''re holding back. That''s\
+  \ why you need me.\
+  <p>I''m not looking for glory, and I''m not here to make friends. I want the kind of fight where the\
+  \ only sound left is static and burning metal. You need someone who won''t stop until the field is\
+  \ clear? That''s me.</p>\
+  <p>No prisoners. No loose ends. Give the order - I''ll handle the rest.</p>\
+  <p>But once I start, I don''t stop.
 
 OVERBEARING.label=Overbearing
 OVERBEARING.description.0={0} always takes charge - whether {2} should or not. {1}\
@@ -469,6 +607,13 @@ OVERBEARING.description.4=There''s no room for debate when {0} is around. {1}\
   \ to fall in line without question - because, in {6} mind, there''s no alternative.
 OVERBEARING.description.5={0} doesn''t believe in delegation, compromise, or second opinions. If\
   \ something needs to be done, {2}''ll do it {6} way - whether anyone asked for {6} help or not.
+OVERBEARING.ronin=I''ve seen how you operate - not bad, but you could use someone who knows how to\
+  \ keep things from falling apart.\
+  <p>Let''s be clear: I don''t follow - I lead. When things get chaotic, you don''t wait - you make the\
+  \ call, and everyone falls in line. That''s what I do. No hesitation, no second opinions. My way\
+  \ works - and if you want results, you''ll let me handle it.</p>\
+  <p>Give me a spot, and I''ll make sure things run the way they should - even if I have to drag the\
+  \ others across the finish line.<p>
 
 PACIFISTIC.label=Pacifistic
 PACIFISTIC.description.0={0} believes violence should always be the last resort, preferring\
@@ -489,6 +634,14 @@ PACIFISTIC.description.4=To {0}, true strength lies in restraint. {1} {7, choice
 PACIFISTIC.description.5={0} doesn''t seek victory - {2} {7, choice, 0#seek|1#seeks} peace. Every\
   \ fight, every battle, every loss only reinforces {6} conviction that the real war isn''t against\
   \ an enemy, but against the need to fight at all.
+PACIFISTIC.ronin=I''ve seen enough war to know how it ends - wreckage, loss, silence.\
+  <p>I''m not here because I want to fight. I''m here because sometimes you don''t get a choice. If\
+  \ stepping into the line of fire means protecting others - means ending the fight before it spirals\
+  \ - I''ll do it. But I''m not here for glory or a kill count.</p>\
+  <p>You need someone who stays calm when others are reaching for the trigger? Someone who can end a\
+  \ fight without leaving a graveyard? That''s me. If there''s a way out that doesn''t leave bodies\
+  \ behind, I''ll find it. If not... I''ll do what needs to be done.</p>\
+  <p>Let me know where I''m needed.</p>
 
 RECKLESS.label=Reckless
 RECKLESS.description.0={0} charges headfirst into danger without hesitation, trusting instinct and\
@@ -512,6 +665,12 @@ RECKLESS.description.5={0} isn''t afraid of consequences - {2} simply {7, choice
   \ think about them. {1} {7, choice, 0#jump|1#jumps} before looking, {7, choice, 0#commit|1#commits}\
   \ before planning, and {7, choice, 0#laugh|1#laughs} in the face of disaster, because for {4}, the\
   \ thrill of the risk is always worth it.
+RECKLESS.ronin=I''ve been running solo long enough to know playing it safe doesn''t get you anywhere.\
+  \ You''ve got a reputation for taking on the messy jobs - that''s exactly what I''m looking for.</p>\
+  <p>You see, I don''t hesitate or overthink. You see a target, you hit it - fast and hard. If it\
+  \ works, great. If it doesn''t, you still come out ahead if you hit hard enough. I''m not afraid of\
+  \ risk - I live for it.</p>\
+  <p>If you need someone who pushes limits and takes the insane shot when it counts, I''m ready.</p>
 
 RESOLUTE.label=Resolute
 RESOLUTE.description.0={0} refuses to waver, no matter the odds. Once {2} {7, choice, 0#set|1#sets}\
@@ -533,6 +692,13 @@ RESOLUTE.description.4=Doubt and hesitation have no place in {0}''s mind. Once {
 RESOLUTE.description.5={0}''s strength isn''t in speed or firepower - it''s in sheer, immovable\
   \ will. No matter how hard the universe tries to wear {4} down, {2} {7, choice, 0#stand|1#stands}\
   \ firm, proving that persistence is just another kind of victory.
+RESOLUTE.ronin=I''ve been through enough to know this life doesn''t get easier - but quitting isn''t an\
+  \ option.\
+  <p>I don''t bend. I don''t break. You set a course, you follow it - no matter how hard it gets or\
+  \ how many bodies pile up. That''s how you survive. That''s how you win. I''m not here for glory - I''m\
+  \ here because I know how to finish the job when others falter.</p>\
+  <p>You need someone who holds the line when it starts to break? Someone who doesn''t flinch when the\
+  \ odds turn ugly? That''s me. I don''t hesitate, and I don''t retreat.</p>
 
 SADISTIC.label=Sadistic
 SADISTIC.description.0={0} doesn''t just enjoy battle - {2} {7, choice, 0#enjoy|1#enjoys} making\
@@ -554,6 +720,13 @@ SADISTIC.description.4=Pain is just another weapon in {0}''s arsenal, and {2} {7
 SADISTIC.description.5={0}''s enjoyment of conflict goes far beyond strategy or skill. There''s a\
   \ gleam in {6} eye whenever someone else is hurting, a twisted satisfaction in knowing that the\
   \ suffering is entirely {6} doing.
+SADISTIC.ronin=I''ve seen how you work - efficient, professional, But efficiency is boring. Winning\
+  \ isn''t enough - it''s about how you win.\
+  <p>I don''t just fight to win - I fight to break. Anyone can destroy an enemy - but making them know\
+  \ they''ve lost? Making them feel it? That''s an art. Let them struggle. Let them feel the weight of\
+  \ their mistake. And when the light fades from their eyes - that''s real satisfaction.</p>\
+  <p>If you want results, fine. But if you want the enemy to regret ever stepping onto the battlefield\
+  \ - you need me.</p>
 
 SAVAGE.label=Savage
 SAVAGE.description.0={0} fights with raw, unrelenting brutality, never holding back once the battle\
@@ -574,6 +747,12 @@ SAVAGE.description.4=Precision and strategy mean nothing to {0} if they don''t c
 SAVAGE.description.5={0}''s presence in battle is like a wildfire - unstoppable, all consuming, and\
   \ utterly devastating. There''s no hesitation, no mercy, just the raw, unfiltered instinct to tear\
   \ through whatever stands before {4}.
+SAVAGE.ronin=I''ve been out there long enough to know one thing: strength wins. Not tactics. Not\
+  \ positioning. Just raw, brutal force.\
+  <p>I don''t fight to survive - I fight to destroy. The battlefield isn''t a chessboard; it''s a hunting\
+  \ ground. You don''t out-think your prey - you tear it apart. No hesitation, no mercy. If you want\
+  \ your enemies reduced to scrap and fire, I''m exactly who you need.</p>\
+  <p>Make the call. I''m ready to hunt.</p>
 
 STUBBORN.label=Stubborn
 STUBBORN.description.0={0} refuses to back down, no matter the circumstances. Once {2}\
@@ -595,6 +774,12 @@ STUBBORN.description.5={0} treats every challenge like a battle of endurance, co
   \ {2} just {7, choice, 0#hold|1#holds} out long enough, the world will bend before {2}\
   \ {7, choice, 0#do|1#does}. Sometimes it works - sometimes it just makes life harder for everyone\
   \ around {4}.
+STUBBORN.ronin=I''ve been running solo for a while - not because I had to, but because I won''t work\
+  \ with anyone who can''t hold it together when things get hard.\
+  <p>I don''t bend, and I sure as hell don''t break. Pain, exhaustion, bad odds - I don''t care. I don''t\
+  \ stop.</p>\
+  <p>If you need someone who second-guesses or backs down under pressure, keep looking. But if you\
+  \ need someone who digs in and refuses to move until the job''s done - I''m exactly who you need.</p>
 
 TENACIOUS.label=Tenacious
 TENACIOUS.description.0={0} refuses to quit, no matter how tough the fight gets. {1}\
@@ -615,6 +800,12 @@ TENACIOUS.description.4=Some people call it grit, others call it madness, but {0
 TENACIOUS.description.5={0} treats every challenge like a war of attrition - {2}\
   \ {7, choice, 0#don''t|1#doesn''t} have to be the fastest or the strongest, just the one still\
   \ standing at the end. And {2} always {7, choice, 0#are|1#is}.
+TENACIOUS.ronin=I''ve been through enough to know survival isn''t about strength or speed - it''s about\
+  \ not stopping.\
+  <p>I''m not here for glory or easy victories. I know how to survive. If I get knocked down, I get\
+  \ back up. If the plan fails, I''ll figure it out. I''ve been through hell, and I''m still standing\
+  \ - because I don''t know how to quit.</p>\
+  <p>You need someone who keeps going when everyone else falls? You''ve found them.</p>
 
 VIGILANT.label=Vigilant
 VIGILANT.description.0={0} is always watching, always analyzing, never letting {6} guard down.\
@@ -636,3 +827,9 @@ VIGILANT.description.4=Awareness is {0}''s greatest weapon. {1} {7, choice, 0#re
 VIGILANT.description.5=Some call it paranoia; {0} calls it survival. {1} {7, choice, 0#keep|1#keeps}\
   \ {6} eyes open, {6} mind sharp, and {6} instincts honed, because the moment {2} {7, choice, 0#let|1#lets}\
   \ {6} guard down, {2} {7, choice, 0#know|1#knows} that''s when disaster will strike.
+VIGILANT.ronin=I''ve learned the hard way that trusting the wrong person - or missing the wrong detail\
+  \ - is how you end up dead.\
+  <p>Nowadays, I don''t let my guard down. Ever. I see the angles others miss - the twitch of an enemy\
+  \ lining up a shot, the shift in tone before a double-cross. If you need someone who stays sharp\
+  \ when everyone else is losing their head - that''s me.</p>\
+  <p>So what''s it going to be? You want someone reliable watching your back?</p>
diff --git a/MekHQ/resources/mekhq/resources/Ambition.properties b/MekHQ/resources/mekhq/resources/Ambition.properties
index 207a646ec72..de921d2b66c 100644
--- a/MekHQ/resources/mekhq/resources/Ambition.properties
+++ b/MekHQ/resources/mekhq/resources/Ambition.properties
@@ -7,6 +7,7 @@ NONE.description.2=ERROR: THIS SHOULDN''T BE VISIBLE! (2)
 NONE.description.3=ERROR: THIS SHOULDN''T BE VISIBLE! (3)
 NONE.description.4=ERROR: THIS SHOULDN''T BE VISIBLE! (4)
 NONE.description.5=ERROR: THIS SHOULDN''T BE VISIBLE! (5)
+NONE.ronin=ERROR: THIS SHOULDN''T BE VISIBLE! (ronin)
 
 AMBITIOUS.label=Ambitious
 AMBITIOUS.description.0={0} isn''t satisfied with just getting by - {2} {7, choice, 0#want|1#wants}\
@@ -30,6 +31,11 @@ AMBITIOUS.description.5={0} isn''t content with following orders or playing it s
   \ {7, choice, 0#set|1#set} {6} sights high, {7, choice, 0#pursue|1#pursues} {6} goals relentlessly,\
   \ and never {7, choice, 0#accept|1#accepts} limits - because to {4}, the only real obstacle is a\
   \ lack of ambition.
+AMBITIOUS.ronin=I''ve been watching how you operate - you know how to win.\
+  <p>I''m not here to get by. I''m not looking for a paycheck or a safe place. I want more. I know where\
+  \ I''m going, and I know how to get there - but I need the right unit behind me. You''ve built something\
+  \ strong. I can help push it higher - and take my shot at the top along the way.</p>\
+  <p>We both want to win. Let''s make it happen.</p>
 
 ARROGANT.label=Arrogant
 ARROGANT.description.0={0} is convinced {2}''{7, choice, 0#re|1#s} the best warrior, the best\
@@ -51,6 +57,11 @@ ARROGANT.description.4=There''s no room for doubt in {0}''s world - {2} already
 ARROGANT.description.5={0} carries {4}self like a living legend, utterly convinced of {6} own\
   \ greatness. Whether {2} {7, choice, 0#deserve|1#deserves} the reputation doesn''t matter - {2}\
   \ {7, choice, 0#believe|1#believes} it, and that''s enough for {4}.
+ARROGANT.ronin=Let''s skip the pleasantries - you need me.\
+  <p>I''m the best at what I do. That''s not arrogance - it''s just the truth. Most people stumble around,\
+  \ second-guessing themselves, hoping they make the right call. I don''t have that problem. I know\
+  \ I''m right. And when the pressure''s on, you''ll want someone who doesn''t hesitate.</p>\
+  <p>So - do you want the best, or are you comfortable with second place?</p>
 
 ASPIRING.label=Aspiring
 ASPIRING.description.0={0} has big dreams and no intention of staying in the background. Whether\
@@ -59,7 +70,7 @@ ASPIRING.description.0={0} has big dreams and no intention of staying in the bac
 ASPIRING.description.1={0} isn''t just chasing a dream - {2}''{7, choice, 0#re|1#s} clawing for\
   \ survival in a universe that doesn''t care. {1} {7, choice, 0#know|1#knows} ambition alone won''t\
   \ get {4} there, and {2}''{7, choice, 0#re|1#s} willing to fight, bleed, and sacrifice to make sure\
-  \ {2}''{7, choice, 0#re|1#s} not just another forgotten soldier.
+  \ {2}''{7, choice, 0#re|1#s} not just another forgotten warrior.
 ASPIRING.description.2={0} believes {2}''{7, choice, 0#re|1#s} meant for something more, and every\
   \ battle, every mission, every hard-earned victory is a step toward proving it. Even when the odds\
   \ are against {4}, {2} {7, choice, 0#refuse|1#refuses} to stop striving for the future {2}\
@@ -74,6 +85,11 @@ ASPIRING.description.5=Some people accept their place in the universe - {0} refu
   \ {7, choice, 0#dream|1#dreams} big, {7, choice, 0#fight|1#fights} hard, and never\
   \ {7, choice, 0#stop|1#stops} striving for something greater, no matter how distant or impossible\
   \ it may seem.
+ASPIRING.ronin=I''m not here to fill a seat - I''m here to build something greater.\
+  <p>You don''t play it safe - and neither do I. I''m ready to fight, bleed, and push harder than anyone\
+  \ else because I know that''s what it takes. I don''t expect handouts - I''m ready to earn my way.</p>\
+  <p>If you want someone comfortable staying in the background, keep looking. If you want someone\
+  \ hungry for victory - someone ready to rise alongside you - you know where to find me.</p>
 
 CALCULATING.label=Calculating
 CALCULATING.description.0={0} never acts on impulse - every move {2} {7, choice, 0#make|1#makes} is\
@@ -96,6 +112,11 @@ CALCULATING.description.4=Nothing {0} does is by chance - {2} {7, choice, 0#play
 CALCULATING.description.5={0} measures everything - risks, rewards, weaknesses - before making a\
   \ move. To {4}, emotion is just another factor to manipulate, and hesitation is a flaw {2}\
   \ {7, choice, 0#have|1#has} no intention of indulging.
+CALCULATING.ronin=I''ve been watching how you operate - and I like what I see.\
+  <p>I don''t rush. I don''t gamble. Every move I make is calculated, every decision weighed. That''s\
+  \ why I win - because I don''t play unless the odds lean my way. Your unit has potential, but I see\
+  \ the gaps - and I know exactly how to close them.</p>\
+  <p>I''m not here for glory. I''m here for results. Give me the opportunity, and I''ll deliver.</p>
 
 CONNIVING.label=Conniving
 CONNIVING.description.0={0} is always working an angle, always looking for a way to manipulate\
@@ -117,6 +138,14 @@ CONNIVING.description.5={0}''s greatest weapon isn''t a gun - it''s {6} ability
   \ {7, choice, 0#spin|1#spins} lies effortlessly, plants {7, choice, 0#doubt|1#doubts} where needed,\
   \ and ensures that by the time the truth comes out, {2}''{7, choice, 0#ve|1#s} already taken what {2}\
   \ wanted.
+CONNIVING.ronin=You have a problem - you just might not know it yet.</p>\
+  <p>The battlefield isn''t just about firepower - it''s about control. Anyone can pull a trigger. The\
+  \ real game is knowing where to apply pressure, which levers to pull, and whose loyalty to question\
+  \ when it matters most. That''s where I excel.</p>\
+  <p>I don''t fight fair - I fight to win. Misdirection, alliances, subtlety - all weapons in the\
+  \ right hands.</p>\
+  <p>I''m not asking for trust. I wouldn''t give it to me either. But if you''re smart - and I think\
+  \ you are - you''ll see the value in someone who knows how to work the angles.</p>
 
 CONTROLLING.label=Controlling
 CONTROLLING.description.0={0} doesn''t just like to lead - {2} needs to. Every decision, every plan,\
@@ -141,6 +170,14 @@ CONTROLLING.description.5={0}''s leadership style leaves no room for autonomy. {
   \ {7, choice, 0#scrutinize|1#scrutinizes} every action, {7, choice, 0#correct|1#corrects} every\
   \ mistake before it happens, and {7, choice, 0#exert|1#exerts} {6} will so thoroughly that those\
   \ around {4} rarely get the chance to think for themselves.
+CONTROLLING.ronin=You don''t need another warrior - you need someone who knows how to keep things\
+  \ together.\
+  <p>I''ve seen what happens when commands fall apart - too many voices, too many opinions, and\
+  \ suddenly you''ve got chaos instead of a plan. That doesn''t happen when I''m in the mix. I don''t\
+  \ ask for control - I take it. I make the calls, keep the unit moving, and make sure everyone does\
+  \ their job - no hesitation, no mistakes.</p>\
+  <p>Let me in, and you''ll see the difference when every mission runs like clockwork - precise and\
+  \ efficient. If someone can''t keep up, I''ll handle it.</p>
 
 CUTTHROAT.label=Cutthroat
 CUTTHROAT.description.0={0} plays to win, and {2} {7, choice, 0#don''t|1#doesn''t} care how messy it\
@@ -165,6 +202,13 @@ CUTTHROAT.description.4=In {0}''s world, hesitation is death and kindness is a l
 CUTTHROAT.description.5={0} doesn''t believe in rules - only results. {1}''ll step on allies, deceive\
   \ enemies, and manipulate anyone in {6} way, all with a cold efficiency that leaves no room for\
   \ doubt or regret.
+CUTTHROAT.ronin=Let''s skip the small talk - you need someone who knows how to win.\
+  <p>I''m not interested in playing fair. Fair gets you killed. The battlefield isn''t about honor -\
+  \ it''s about survival. If that means cutting corners, breaking deals, or leaving someone behind,\
+  \ so be it. You don''t win by being nice - you win by being the last one standing.</p>\
+  <p>You need someone who handles the dirty work - someone who makes the hard calls and follows\
+  \ through? Let me in, give me the freedom to do what needs to be done, and I''ll make sure you come\
+  \ out ahead.</p>
 
 DISHONEST.label=Dishonest
 DISHONEST.description.0={0} has a slippery relationship with the truth, bending it whenever it\
@@ -187,6 +231,14 @@ DISHONEST.description.4=Honesty is a tool {0} only uses when it suits {4}. {1} {
 DISHONEST.description.5={0} never lets the truth get in the way of a good opportunity. Whether\
   \ {2}''{7, choice, 0#re|1#s} bluffing, sweet-talking, or outright fabricating, {2} always\
   \ {7, choice, 0#make|1#makes} sure {6} version of reality is the one people believe.
+DISHONEST.ronin=You want results? You''re not going to get them by playing it straight.\
+  <p>I know how the game works - and more importantly, how to make it work for me. Truth is flexible,\
+  \ and people are easier to handle when they believe what you want them to. If a little misdirection\
+  \ smooths the path, why not use it?</p>\
+  <p>Trust me - or don''t. It doesn''t matter. What matters is that I get the job done. I''ll tell\
+  \ people what they need to hear. And when it''s over, you''ll be on top - because I made sure the\
+  \ right people believed the right things.</p>\
+  <p>What do you say?</p>
 
 DILIGENT.label=Diligent
 DILIGENT.description.0={0} puts in the work, no matter how long it takes. Whether it''s\
@@ -210,6 +262,13 @@ DILIGENT.description.4=No task is too small, no detail too minor for {0} to over
 DILIGENT.description.5={0} approaches everything with methodical precision. {1} {7, choice, 0#don''t|1#doesn''t}\
   \ believe in shortcuts or luck - only in putting in the work, refining {6} craft, and ensuring that\
   \ {2} never {7, choice, 0#leave|1#leaves} anything to chance.
+DILIGENT.ronin=You don''t need luck when you have preparation - and that''s why you need me.\
+  <p>I''m not flashy or reckless - I''m reliable. When the mission comes down to the wire, you''ll want\
+  \ someone who''s put in the work. I don''t get lucky - I know how to win because I''ve practiced it a\
+  \ thousand times over.</p>\
+  <p>I''m tired of carrying units that don''t care about getting it right. I want a crew that values\
+  \ precision and results.</p>\
+  <p>Your call. Let me know when you''re ready to get serious.</p>
 
 DRIVEN.label=Driven
 DRIVEN.description.0={0} doesn''t just set goals - {2} {7, choice, 0#demand|1#demands} results. No\
@@ -233,6 +292,13 @@ DRIVEN.description.5={0}''s ambition isn''t just a trait - it''s a force of natu
   \ {7, choice, 0#don''t|1#doesn''t} hesitate, {7, choice, 0#don''t|1#doesn''t} look back, and\
   \ {7, choice, 0#don''t|1#doesn''t} accept limitations. If there''s a path forward, {2}''ll find it, no\
   \ matter how steep the climb.
+DRIVEN.ronin=I''ve been watching your unit - and I like what I see. Efficiency. Focus. Results. That''s\
+  \ what matters.\
+  <p>I''m not here to coast - I''m here to win. Other warriors fold when things get hard. They\
+  \ second-guess, slow down, and look for excuses. I don''t. I adapt, push, and find a way through.\
+  \ I''m done carrying dead weight. I need a team that fights like they expect to win - and doesn''t\
+  \ flinch when the stakes are high.</p>\
+  <p>If that''s what you can offer - sign me up. You won''t regret it.</p>
 
 ENERGETIC.label=Energetic
 ENERGETIC.description.0={0} is always on the move, always ready for the next challenge. Whether\
@@ -254,6 +320,17 @@ ENERGETIC.description.4=Slowing down just isn''t in {0}''s nature. {1} {7, choic
 ENERGETIC.description.5={0}''s energy is impossible to ignore. {1} {7, choice, 0#drive|1#drives}\
   \ conversations, {7, choice, 0#spark|1#sparks} ideas, and {7, choice, 0#keep|1#keeps} people\
   \ moving, {6} sheer momentum pulling others along whether they''re ready or not.
+ENERGETIC.ronin=I hear you''re looking for someone who can keep up. Good news - I don''t slow down.\
+  \ Ever.</p>\
+  <p>I''m not the type to sit around waiting for things to happen. I''m already out the door while\
+  \ everyone else is still gearing up. First to the fight, last to leave. Exhaustion? That''s a\
+  \ mindset. Push hard enough, and you don''t have time to feel tired.</p>\
+  <p>It''s not just about stamina - it''s about momentum. You win by setting the pace and making the\
+  \ enemy scramble to keep up. Keep moving, keep attacking, and don''t give them time to breathe. If\
+  \ you hesitate, you lose.</p>\
+  <p>Most outfits can''t keep up. You? I think you get it. Your unit moves fast and hits hard - that''s\
+  \ the kind of team I need.</p>\
+  <p>So, put me on the next mission. I''m ready.</p>
 
 EXCESSIVE.label=Excessive
 EXCESSIVE.description.0={0} never does anything halfway. Whether it''s firepower, preparation, or\
@@ -276,6 +353,15 @@ EXCESSIVE.description.4=There''s no middle ground with {0} - everything is turne
 EXCESSIVE.description.5=If {0}''s doing something, everyone is going to know about it. {1}\
   \ {7, choice, 0#double|1#doubles} down on every decision, {7, choice, 0#throw|1#throws} {4}self\
   \ into everything at full speed, and refuses to settle for anything that isn''t over-the-top.
+EXCESSIVE.ronin=If you''re looking for subtlety, you''ve got the wrong person. But if you want results? \
+  You''ve found me.\
+  <p>I don''t do half-measures. If the mission calls for force, I''ll make sure they see the mushroom\
+  \ cloud from orbit. If a problem needs solving, I''m not bringing a knife - I''m bringing an AC/20,\
+  \ and I''m not leaving until the job''s finished. Precision and restraint? Overrated. Overwhelming\
+  \ force wins battles - always has, always will.</p>\
+  <p>My last outfit couldn''t handle that - too worried about "overkill" and "collateral damage." You?\
+  \ I think you understand that sometimes more is exactly what''s needed.</p>\
+  <p>So... when do I start?</p>
 
 FOCUSED.label=Focused
 FOCUSED.description.0={0} locks onto {6} objectives with laser precision. Distractions, doubts,\
@@ -297,6 +383,13 @@ FOCUSED.description.4=Distractions are for other people - {0} doesn''t indulge t
 FOCUSED.description.5={0} operates with a singular, unyielding drive. Whether it''s perfecting\
   \ {6} skills or executing a plan, {2} {7, choice, 0#devote|1#devotes} {4}self completely, unwilling\
   \ to let anything stand in {6} way.
+FOCUSED.ronin=If you need someone who stays locked in when it counts - someone who won''t get\
+  \ distracted, won''t lose focus, and won''t stop until the job''s done - you''ve found them.\
+  <p>You''ve probably worked with pilots who hesitate when the mission goes sideways. That''s not me.\
+  \ I thrive when the stakes are high because I don''t let anything else matter. All I see is the path\
+  \ to victory - and I''ll follow it through fire if that''s what it takes.</p>\
+  <p>You run an operation that values results - no excuses, no wasted motion. I can work with that.\
+  \ Give me a target, give me a plan - I''ll handle the rest.</p>
 
 GOAL_ORIENTED.label=Goal-Oriented
 GOAL_ORIENTED.description.0={0} always has a target in mind, and {2} won''t stop until {2}\
@@ -319,6 +412,13 @@ GOAL_ORIENTED.description.4=When {0} sets {6} sights on something, {2} {7, choic
 GOAL_ORIENTED.description.5={0} doesn''t waste time on distractions. {1} {7, choice, 0#measure|1#measures}\
   \ success not by effort but by results, constantly driving forward with a clear vision of where\
   \ {2}''{7, choice, 0#re|1#s} going and how {2}''ll get there.
+GOAL_ORIENTED.ronin=You need someone who knows how to get things done - not someone who talks about\
+  \ it, but someone who delivers. That''s me.\
+  <p>I''m not here to try - I''m here to win. Every action I take is calculated, every decision tied\
+  \ to the bigger picture. If it doesn''t push me toward the objective, I won''t waste time on it.</p>\
+  <p>Your unit has direction - you''re not just surviving; you''re aiming to win. That''s what I need\
+  \ - a team with the same clarity and focus I bring to the table.</p>\
+  <p>If you''re serious about results, I''m ready to deliver. Let me know when you''re ready to move.</p>
 
 INNOVATIVE.label=Innovative
 INNOVATIVE.description.0={0} thrives on thinking outside the box. Whether it''s unconventional\
@@ -341,6 +441,15 @@ INNOVATIVE.description.4=To {0}, convention is just another obstacle. {1} {7, ch
 INNOVATIVE.description.5={0} sees every situation as a puzzle waiting to be solved in the most\
   \ unexpected way possible. {1} {7, choice, 0#mix|1#mixes} creativity with practicality, ensuring\
   \ that when others hit a wall, {2}''{7, choice, 0#re|1#s} already building a door.
+INNOVATIVE.ronin=You need someone who can think on their feet - someone who doesn''t just follow the\
+  \ playbook but rewrites it.\
+  <p>Most units get stuck in the same patterns, running the same drills, making the same mistakes.\
+  \ That''s not how you win. You win by staying ahead - by doing what they don''t expect. That''s what\
+  \ I bring - new angles, new tactics, and creative solutions that turn losing battles into\
+  \ victories.</p>\
+  <p>Give me the tools, the mission, and the freedom to push limits. You''ll get results - and maybe\
+  \ even learn a few new tricks along the way.</p>\
+  <p>Let me know when you''re ready to change the game.</p>
 
 MANIPULATIVE.label=Manipulative
 MANIPULATIVE.description.0={0} knows exactly what to say and do to get people to act in {6}\
@@ -363,6 +472,16 @@ MANIPULATIVE.description.4=Every conversation with {0} is a game of unseen moves
 MANIPULATIVE.description.5={0} doesn''t coerce - {2} {7, choice, 0#convince|1#convines}. {1}\
   \ {7, choice, 0#understand|1#understands} exactly what makes people tick, pulling the right strings\
   \ at the right time to make them dance to {6} tune without ever questioning why.
+MANIPULATIVE.ronin=You need someone who knows how to get things done - not by force or luck, but by\
+  \ understanding how people work.\
+  <p>Most commanders lead through strength or fear. That works - sometimes - but it''s messy and\
+  \ inefficient. Me? I don''t need to bark orders. I know how to make people want to do what I need\
+  \ them to do. A word here, a favor there - and suddenly things are moving exactly how I intended,\
+  \ and no one even realizes they were steered.</p>\
+  <p>You''re building something. I can see that. A unit like yours isn''t just muscle - you''re playing\
+  \ the long game. You need someone who can shift the odds before the first shot is fired. That''s\
+  \ what I bring.</p>\
+  <p>So let me in - and watch how quickly things start falling into place.</p>
 
 MOTIVATED.label=Motivated
 MOTIVATED.description.0={0} doesn''t wait for opportunity - {2} {7, choice, 0#create|1#creates} it.\
@@ -383,6 +502,14 @@ MOTIVATED.description.4=Once {0} sets {6} sights on something, there''s no stopp
 MOTIVATED.description.5={0}''s drive is more than ambition - it''s an unshakable force. {1}\
   \ {7, choice, 0#don''t|1#doesn''t} just work hard; {2} {7, choice, 0#outwork|1#outworks} everyone,\
   \ refusing to rest until {2}''{7, choice, 0#ve|1#s} accomplished what {2} set out to do.
+MOTIVATED.ronin=You need someone who knows how to push forward when others falter.\
+  <p>Too many people crumble when they lose momentum, waiting for someone else to figure things out.\
+  \ That''s not me. When things get tough, I dig deeper. When others hesitate, I push harder. And when\
+  \ the mission looks impossible, I don''t stop until it''s done.</p>\
+  <p>You''ve got something real here - a team that''s close to being great. You just need someone to\
+  \ keep the fire burning when the odds stack up. Someone who knows how to push harder - and lead\
+  \ from the front while doing it.</p>\
+  <p>Let me in, and you won''t have to wonder if the job will get done, because it always will.<p>
 
 OPPORTUNISTIC.label=Opportunistic
 OPPORTUNISTIC.description.0={0} has a sharp eye for the right moment to strike - whether it''s on\
@@ -403,6 +530,14 @@ OPPORTUNISTIC.description.4=To {0}, every situation holds potential - {2} just h
 OPPORTUNISTIC.description.5={0} adapts faster than anyone else. {1} {7, choice, 0#thrive|1#thrives}\
   \ in unpredictability, adjusting {6} approach on the fly and taking full advantage of every chance\
   \ that comes {6} way - no matter who gets left behind.
+OPPORTUNISTIC.ronin=You need someone who knows how to turn a bad situation into an opportunity? That''s\
+  \ me.\
+  <p>I''m not here to play fair or follow someone else''s rules. If a weakness presents itself, I''ll\
+  \ exploit it. If there''s an opening, I''ll take it. Success isn''t about luck - it''s about seeing\
+  \ the move before anyone else does and having the nerve to take it.</p>\
+  <p>You''ve got the potential to go far, but you need someone who knows how to capitalize when things\
+  \ get chaotic. Someone who sees the cracks and knows how to widen them until the enemy crumbles.</p>\
+  <p>Let me in. I''ll make sure this unit doesn''t just survive - we''ll dominate.</p>
 
 OVERCONFIDENT.label=Overconfident
 OVERCONFIDENT.description.0={0} believes {2}''{7, choice, 0#re|1#s} the best, and {2} {7, choice, 0#act|1#acts}\
@@ -426,6 +561,13 @@ OVERCONFIDENT.description.5={0} wears {6} confidence like a badge of honor, para
   \ victories with flair and dismissing setbacks as temporary blips. {5} unwavering belief in {6}\
   \ own prowess often blinds {4} to potential dangers, even as {2} {7, choice, 0#dazzle|1#dazzles}\
   \ onlookers with {6} bold, if misguided, bravado.
+OVERCONFIDENT.ronin=You want the best? Here I am.\
+  <p>I don''t second-guess, I don''t hesitate, and I sure as hell don''t lose. Strategy, tactics,\
+  \ execution - I''ve got it covered. My instincts are sharper than most people''s best plans, and\
+  \ when the heat turns up, I thrive. Others panic - I win. That''s just how it works.</p>\
+  <p>So why your unit? Potential. You''ve got the talent, the gear, and the edge to go far - but\
+  \ you''re missing the key piece. Me. Put me in the fight, and you''ll see what happens when real\
+  \ skill takes the lead.</p>
 
 PERSISTENT.label=Persistent
 PERSISTENT.description.0={0} doesn''t know the meaning of the word quit. No matter how many times\
@@ -447,6 +589,14 @@ PERSISTENT.description.4=When others falter, {0} keeps moving. {1} {7, choice, 0
 PERSISTENT.description.5={0}''s strength isn''t just in skill or strategy - it''s in sheer, unyielding\
   \ willpower. Once {2} {7, choice, 0#start|1#starts} something, {2}''ll see it through to the bitter\
   \ end, no matter what it costs.
+PERSISTENT.ronin=You don''t need another pilot who folds under pressure - you need someone who keeps\
+  \ going when everything else falls apart.\
+  <p>I don''t stop. I don''t break. You put me in a cockpit, and I''ll keep coming until the job''s done\
+  \ - no matter how long it takes or how hard it gets. When others back down, I push harder. When\
+  \ others lose hope, I double down. That''s not just how I fight - that''s who I am.</p>\
+  <p>Why your unit? Because you need someone who doesn''t quit. Good isn''t enough when the odds keep\
+  \ stacking up. You need someone who finishes what they start.</p>\
+  <p>Bring me onboard. I''ll show you what it means to see something through to the end.</p>
 
 PROACTIVE.label=Proactive
 PROACTIVE.description.0={0} doesn''t wait for things to happen - {2} {7, choice, 0#make|1#makes} them\
@@ -469,6 +619,14 @@ PROACTIVE.description.4=Where others hesitate, {0} acts. {1} {7, choice, 0#don''
 PROACTIVE.description.5={0} believes the best way to handle a crisis is to prevent it before it\
   \ happens. {1} {7, choice, 0#stay|1#stays} ahead of the curve, anticipating challenges and solving\
   \ problems before anyone else even sees them coming.
+PROACTIVE.ronin=You''ve got a solid operation - but you''re missing something. Someone who takes action\
+  \ before trouble hits. Someone who doesn''t wait for orders when the situation spirals - someone\
+  \ who''s already moving while others are still figuring it out.\
+  <p>I don''t sit back and wait for things to go wrong - I prevent them from happening in the first\
+  \ place. If there''s a threat, I''ll see it before it materializes. If a mission starts going\
+  \ sideways, I''ll already have a plan in motion before anyone else realizes there''s a problem. And\
+  \ when it''s time to make the hard calls, I won''t hesitate.</p>\
+  <p>You want results? Put me in the fight - I''ll make it happen.</p>
 
 RESILIENT.label=Resilient
 RESILIENT.description.0=No matter what gets thrown at {4}, {0} bounces back. Whether it''s a\
@@ -489,6 +647,15 @@ RESILIENT.description.4={0} refuses to let hardship define {4}. {1}''{7, choice,
 RESILIENT.description.5={0} isn''t just tough - {2}''{7, choice, 0#re|1#s} unshakable. Setbacks don''t\
   \ discourage {4}, and suffering doesn''t slow {4} down. {1} {7, choice, 0#keep|1#keeps} pushing\
   \ forward, no matter how much it hurts, because giving up simply isn''t an option.
+RESILIENT.ronin=I''ve been knocked down more times than I can count. I''ve lost more than a few friends.\
+  \ Crawled out of burning wreckage with nothing but grit and adrenaline holding me together. And\
+  \ yet here I am - still standing.\
+  <p>That''s why you want me in your unit. I don''t break. I don''t give up. When things go bad - and\
+  \ they always do - I''m the one who keeps moving. Others panic when the plan falls apart. Me? I\
+  \ keep my head down, push through the pain, and find a way to win.</p>\
+  <p>I won''t promise easy victories. But when things go wrong - and they will - I''ll still be in the\
+  \ fight. And I''ll make sure anyone standing with me makes it out too.</p>\
+  <p>So put me in. I''m not here to quit - I''m here to win.</p>
 
 RESOURCEFUL.label=Resourceful
 RESOURCEFUL.description.0={0} has a knack for making the most of what {2}''{7, choice, 0#ve|1#s}\
@@ -511,6 +678,14 @@ RESOURCEFUL.description.4=When things go sideways, {0} doesn''t panic - {2} {7,
 RESOURCEFUL.description.5={0} has an instinct for survival, a mind for improvisation, and a\
   \ knack for turning disadvantages into strengths. No matter how dire the situation, {2} always\
   \ {7, choice, 0#find|1#finds} a way to come out on top.
+RESOURCEFUL.ronin=You don''t need another warrior who only knows how to fight when things are going\
+  \ well - you need someone who knows how to win when everything''s falling apart. That''s why you\
+  \ want me.\
+  <p>I don''t just survive in bad situations - I thrive in them. Give me a broken ride, half a load\
+  \ of ammo, and a hostile warzone - I''ll still find a way to win.</p>\
+  <p>Bring me in. I''m not asking for handouts - just the chance to show you what I can do. Let the\
+  \ others stick to the playbook. I''ll be the one figuring out how to win after the plan gets shot\
+  \ to hell.</p>
 
 RUTHLESS.label=Ruthless
 RUTHLESS.description.0={0} has no patience for obstacles - {2} {7, choice, 0#remove|1#removes} them.\
@@ -531,7 +706,13 @@ RUTHLESS.description.4=Mercy is just another word for weakness in {0}''s mind. {
   \ stand in the way of {6} ambition.
 RUTHLESS.description.5={0} sees morality as a luxury {2} can''t afford. If there''s a faster, more\
   \ efficient way to get ahead - no matter how brutal - {2}''ll take it without hesitation or regret.
+RUTHLESS.ronin=Let''s not mince words. In this world, obstacles aren''t faced - they''re removed. I\
+  \ understand the value of ambition, and I demand success.\
+  <p>Those who hesitate or cling to the weak will be left behind. If you want someone who won''t\
+  \ flinch at sacrifice, who sees alliances as tools to achieve dominance, then I''m yours.</p>\
+  <p>Together, we''ll seize control and build a legacy of strength and ambition.</p>
 
+### HERE
 SELFISH.label=Selfish
 SELFISH.description.0={0} always puts {4}self first. Whether it''s resources, recognition, or\
   \ survival, {2} {7, choice, 0#make|1#makes} sure {2} {7, choice, 0#come|1#comes} out on top - even\
@@ -551,6 +732,11 @@ SELFISH.description.4=Teamwork is just a means to an end for {0}. {1}''ll play a
 SELFISH.description.5={0} doesn''t do favors, doesn''t make sacrifices, and doesn''t waste time on\
   \ anyone who can''t offer {4} something in return. {5} survival, success, and comfort always come\
   \ first - everything else is secondary.
+SELFISH.ronin=Let''s get one thing clear: my priority is me.\
+  <p>So if f you''re willing to put my survival and success above all else, I''m ready to align with\
+  \ you... for as long as it benefits me. But I don''t do favors for free, and I won''t risk more than\
+  \ necessary without a substantial gain.</p>\
+  <p>If that works for you, let''s see what kind of opportunities you can offer.</p>
 
 STRATEGIC.label=Strategic
 STRATEGIC.description.0={0} doesn''t make rash decisions - {2} {7, choice, 0#play|1#plays} the long\
@@ -573,6 +759,12 @@ STRATEGIC.description.5={0} doesn''t leave anything to chance. {1} {7, choice, 0
   \ {7, choice, 0#adapt|1#adapts}, and {7, choice, 0#execute|1#executes} with precision, always\
   \ thinking three steps ahead to ensure {2} {7, choice, 0#control|1#controls} the game rather than\
   \ being a piece in it.
+STRATEGIC.ronin=In the realm of conflict and competition, rash decisions lead to downfall. I believe\
+  \ in the power of strategy and foresight.\
+  <p>If you seek a partner who sees every situation as a battlefield and approaches each challenge\
+  \ like a master tactician, I am ready to collaborate.</p>\
+  <p>Together, we will dominate the chessboard of conflict, controlling the game rather than merely\
+  \ playing in it.</p>
 
 TYRANNICAL.label=Tyrannical
 TYRANNICAL.description.0={0} demands absolute control, tolerating no dissent and expecting orders\
@@ -593,6 +785,13 @@ TYRANNICAL.description.4=Power isn''t just something {0} holds - it''s something
 TYRANNICAL.description.5={0} doesn''t delegate, doesn''t share control, and doesn''t tolerate\
   \ defiance. Every system, every person, and every decision must align with {6} vision, or it will\
   \ be corrected.
+TYRANNICAL.ronin=Let''s get one thing straight - I''m not asking to join your unit. I''m offering you\
+  \ the opportunity to benefit from someone who knows how to command. There''s a difference.\
+  <p>I''ve seen what happens when leadership gets soft - hesitation, compromise, and eventual collapse.\
+  \ I don''t let that happen. I take control. I keep order. I don''t tolerate insubordination. When I\
+  \ give an order, it gets followed - no questions, no hesitation.</p>\
+  <p>If you want someone who will bring your unit in line, keep them sharp, and ensure every mission\
+  \ ends with our victory - you know where to find me.</p>
 
 UNAMBITIOUS.label=Unambitious
 UNAMBITIOUS.description.0={0} is content with where {2} {7, choice, 0#are|1#is}. While others\
@@ -615,6 +814,13 @@ UNAMBITIOUS.description.4={0} does what''s required, nothing more, nothing less.
 UNAMBITIOUS.description.5=Success, power, recognition - none of it matters to {0}. {1}''{7, choice, 0#ve|1#s}\
   \ seen what chasing those things does to people, and {2}''{7, choice, 0#re|1#s} perfectly happy\
   \ staying right where {2} {7, choice, 0#are|1#is}, watching others run themselves into the ground.
+UNAMBITIOUS.ronin=I''m not here to impress anyone - let''s get that straight. I know how this works.\
+  <p>Some people are in this game to climb the ladder, chase glory, and collect medals. Me? I''m not\
+  \ one of them. I''m here to do a job, get paid, and not die in the process. That''s enough for me.\
+  <p>So why join your unit? Because you don''t seem like the type to care about status games either.\
+  \ You want people who''ll show up, put in the work, and not get caught up in the politics. That''s\
+  \ me. I''ll pull my weight, follow orders, and keep things running smoothly.</p>\
+  <p>If that works for you, let me know. If not? No hard feelings.</p>
 
 UNSCRUPULOUS.label=Unscrupulous
 UNSCRUPULOUS.description.0={0} doesn''t let rules, ethics, or principles get in the way of what {2}\
@@ -635,6 +841,15 @@ UNSCRUPULOUS.description.5={0} doesn''t believe in fair play - {2} {7, choice, 0
   \ in winning. {1} {7, choice, 0#bend|1#bends}, {7, choice, 0#break|1#breaks}, and\
   \ {7, choice, 0#rewrite|1#rewrites} the rules to suit {6} needs, making sure that when the dust\
   \ settles, {2}''{7, choice, 0#re|1#s} the only one left standing.
+UNSCRUPULOUS.ronin=Look, I''m not going to lie to you - I don''t play fair. And I''m not going to pretend\
+  \ I care about rules, honor, or what''s considered "right." Those things are for people who don''t\
+  \ have the stomach to do what it takes to win. I''ve done things that would make most people flinch\
+  \ - and I''ll do them again if it gets results.\
+  <p>That''s why you need me. You''ve got a unit full of warriors trying to fight clean while the\
+  \ universe plays dirty. You need someone who isn''t afraid to cut corners, twist arms, and break\
+  \ the rules when it matters. I''ll get the job done - no questions, no hesitation - because I know\
+  \ that survival and victory don''t come from playing fair.</p>\
+  <p>Just give me the go-ahead, {0}, and I''ll join you shortly.</p>
 
 VISIONARY.label=Visionary
 VISIONARY.description.0={0} sees the bigger picture when others get lost in the details.\
@@ -656,3 +871,12 @@ VISIONARY.description.4=While others focus on the now, {0}''s gaze is locked on
 VISIONARY.description.5={0} thrives on grand ideas and daring possibilities. {1}\
   \ {7, choice, 0#don''t|1#doesn''t} waste time on the status quo - {2}''{7, choice, 0#re|1#s} here to\
   \ change things, whether the world is ready for it or not.
+VISIONARY.ronin=You need someone who can see beyond the next battle, beyond the next contract -\
+  \ someone who can shape the future while everyone else is stuck surviving day to day. That''s me.\
+  \ I''m not just a warrior. I''m a strategist. A builder. A force that knows how to turn chaos into\
+  \ opportunity and uncertainty into control.\
+  <p>So here''s the deal - bring me in. Give me the authority to execute my plans. You want results?\
+  \ I''ll deliver them. You want someone who''s already thinking ten steps ahead of the next ambush?\
+  \ I''m the one who''s already planning how to win the war after this one ends.</p>\
+  <p>So let''s build something that lasts together. Something that defines the future. You know where\
+  \ to find me.</p>
diff --git a/MekHQ/resources/mekhq/resources/Greed.properties b/MekHQ/resources/mekhq/resources/Greed.properties
index b57238c3eaf..c9366c158f5 100644
--- a/MekHQ/resources/mekhq/resources/Greed.properties
+++ b/MekHQ/resources/mekhq/resources/Greed.properties
@@ -7,6 +7,7 @@ NONE.description.2=ERROR: THIS SHOULDN''T BE VISIBLE! (2)
 NONE.description.3=ERROR: THIS SHOULDN''T BE VISIBLE! (3)
 NONE.description.4=ERROR: THIS SHOULDN''T BE VISIBLE! (4)
 NONE.description.5=ERROR: THIS SHOULDN''T BE VISIBLE! (5)
+NONE.ronin=ERROR: THIS SHOULDN''T BE VISIBLE! (ronin)
 
 ASTUTE.label=Astute
 ASTUTE.description.0={0} has a sharp mind and a keen eye for details. {1} quickly {7, choice, 0#pick|1#picks}\
@@ -29,6 +30,14 @@ ASTUTE.description.4={0}''s intelligence isn''t just about knowledge - it''s abo
 ASTUTE.description.5=Quick-thinking and perceptive, {0} sees the angles others miss. Whether\
   \ {2}''{7, choice, 0#re|1#s} navigating a battlefield or a negotiation, {6} ability to read the room\
   \ and adjust makes {4} a force to be reckoned with.
+ASTUTE.ronin=I''ve always been good at seeing patterns - the gaps in enemy formations, the weaknesses\
+  \ hidden beneath the surface, the split-second moments where a decision makes the difference between\
+  \ survival and failure. Some call it instinct. I call it intelligence.\
+  <p>That''s why I''m reaching out. Your unit needs someone who can see beyond the chaos, someone who\
+  \ doesn''t just react to the battlefield - but controls it. I''m the one who spots the enemy''s plan\
+  \ before they know they''ve made it. I know how to read a situation, turn it on its head, and make\
+  \ it work in our favor.</p>\
+  <p>Give me a spot, {0}. I''ll make sure we don''t just survive - we outmaneuver.</p>
 
 ADEPT.label=Adept
 ADEPT.description.0={0} is a natural at what {2} {7, choice, 0#do|1#does}. Whether it''s piloting,\
@@ -49,6 +58,15 @@ ADEPT.description.4=Experience and instinct guide {0}''s every move. {1} {7, cho
 ADEPT.description.5={0}''s expertise isn''t just learned - it''s ingrained. Whether adapting to new\
   \ challenges or refining old skills, {2} {7, choice, 0#perform|1#performs} with a level of competence\
   \ that leaves others struggling to keep up.
+ADEPT.ronin=Skill isn''t something you''re born with - it''s earned, sharpened through experience and\
+  \ tested under pressure. I''ve put in the time, learned the hard lessons, and come out on the other\
+  \ side with the kind of precision and instinct that turns battles.\
+  <p>I''m not saying I''m the best - I''m saying I''m the one who gets it done. I don''t hesitate, I\
+  \ don''t second-guess. I''ve mastered my craft through sweat, blood, and countless near-death\
+  \ experiences, and I know exactly how to execute when it matters most.</p>\
+  <p>That''s why I''m ready to join your unit. You need someone who can adapt, who can handle the tough\
+  \ calls, and who can make the impossible look easy.</p>\
+  <p>So give me a shot, {0}. You won''t regret it.</p>
 
 AVARICIOUS.label=Avaricious
 AVARICIOUS.description.0={0} always wants more - more money, more power, more influence. No matter\
@@ -70,6 +88,12 @@ AVARICIOUS.description.4=Money isn''t just a luxury for {0} - it''s an obsession
 AVARICIOUS.description.5={0} doesn''t believe in "enough." No matter how much wealth or influence\
   \ {2} {7, choice, 0#accumulate|1#accumulates}, {2} always {7, choice, 0#crave|1#craves} more,\
   \ scheming and manipulating to ensure that every deal tilts in {6} favor.
+AVARICIOUS.ronin=Let''s skip the niceties and get straight to business. I''m not here to fight for\
+  \ honor or glory - I''m here to profit. And I''m very, very good at it.\
+  <p>You need someone who knows how to work the angles, someone who understands that power isn''t\
+  \ given - it''s bought, traded, and sometimes stolen. That''s what I bring to the table.</p>\
+  <p>Let me join your unit. I''ll make sure you get more than just victories - you''ll get paid.\
+  \ Handsomely.</p>
 
 CORRUPT.label=Corrupt
 CORRUPT.description.0={0} bends the rules whenever it benefits {4}. Whether it''s skimming off the\
@@ -94,6 +118,15 @@ CORRUPT.description.5={0} has mastered the art of deception, disguising greed as
   \ betrayal as business. {5} network of shady contacts, off-the-books deals, and conveniently\
   \ missing records ensure that, no matter what happens, {2} always {7, choice, 0#come|1#comes} out\
   \ clean - at least on paper.
+CORRUPT.ronin=Let''s not pretend we''re playing by the rules here. War is messy, and so is business. If\
+  \ you think the winners are the ones following the handbook, you haven''t been paying attention.\
+  \ Deals are made in backrooms, victories are bought as much as they''re fought, and the ones who\
+  \ survive? They know how to work the system.\
+  <p>That''s where I come in. I know how to grease the right palms, make problems disappear, and ensure\
+  \ that contracts fall in our favor. A little bribe here, a little blackmail there - you''d be\
+  \ surprised how much smoother things run when the right people are motivated.</p>\
+  <p>So bring me onboard, let me handle the shadows, and you''ll find things start falling into\
+  \ place.</p>
 
 DYNAMIC.label=Dynamic
 DYNAMIC.description.0={0} is always in motion - quick to adapt, quick to lead, and quick to take\
@@ -114,6 +147,13 @@ DYNAMIC.description.4={0} refuses to stand still, {6} mind always racing with ne
 DYNAMIC.description.5={0} is the spark that ignites every situation. {5} charisma, ambition, and\
   \ relentless drive make {4} impossible to ignore, drawing people in and pushing events forward\
   \ with sheer force of will.
+DYNAMIC.ronin=You don''t need someone who waits for orders. You need someone who moves fast, who sees\
+  \ the opening before anyone else and takes it without hesitation. That''s me. I don''t sit back and\
+  \ let things happen - I make them happen.\
+  <p>Why am I looking to join your unit? Simple - I need a bigger stage. My skills, my drive - they''re\
+  \ wasted anywhere else. You want to win? You want to build something unstoppable? Then you need\
+  \ someone who thrives in chaos.</p>\
+  <p>Sign me on, {0}.</p>
 
 EAGER.label=Eager
 EAGER.description.0={0} is always ready for action, diving headfirst into challenges with\
@@ -137,6 +177,11 @@ EAGER.description.5={0} approaches every obstacle with the unshakable certainty
   \ overcome it. {1} {7, choice, 0#thrive|1#thrives} in high-stakes moments, {6} excitement infectious\
   \ as {2} {7, choice, 0#drive|1#drives} {4}self and those around {4} forward with almost reckless\
   \ enthusiasm.
+EAGER.ronin=I''m not here to sit on the sidelines - I''m ready to get in the fight. Whatever the mission,\
+  \ whatever the stakes, I want in.\
+  <p>Why your unit? Simple. You''ve got the reputation, the kind of team that doesn''t just survive -\
+  \ you win. That''s where I want to be: part of something bigger, making a real difference. You give\
+  \ me a shot, and I''ll prove I''ve got what it takes.</p>
 
 ENTERPRISING.label=Enterprising
 ENTERPRISING.description.0={0} sees opportunities where others see obstacles. Whether it''s a\
@@ -159,6 +204,12 @@ ENTERPRISING.description.4=Where others see limits, {0} sees potential. {1} {7,
 ENTERPRISING.description.5={0} doesn''t believe in luck - only in making the right moves at the right\
   \ time. {5} ability to adapt, negotiate, and seize control ensures that, no matter where {2}\
   \ {7, choice, 0#start|1#starts}, {2} always ends up ahead.
+ENTERPRISING.ronin=I see an opportunity here - for you and for me. You''ve got a powerful unit, the\
+  \ kind that makes waves. But I''m not looking to just tag along - I''m here to add value.\
+  <p>Give me a broken-down ride, and I''ll have it running smoother than factory spec. Throw me into\
+  \ a bad situation, and I''ll turn it into a win. Negotiations, logistics, battlefield maneuvers -\
+  \ I know how to make things work in my favor, and more importantly, in yours.</p>\
+  <p>Let me in, {0}. I''ll make sure you never regret it.</p>
 
 EXPLOITATIVE.label=Exploitative
 EXPLOITATIVE.description.0={0} knows how to get the most out of people and situations. Whether\
@@ -181,6 +232,12 @@ EXPLOITATIVE.description.4=Nothing {0} does is without calculation. {1} {7, choi
 EXPLOITATIVE.description.5={0} doesn''t waste time on fair deals when an unfair one gets {4} more.\
   \ {1} {7, choice, 0#play|1#plays} on desperation, weaknesses, and ambition, twisting every situation\
   \ to ensure that, in the end, {0} is the one who profits most.
+EXPLOITATIVE.ronin=Let''s skip the formalities - you need results, and I know how to get them.\
+  <p>I know how to get the most out of people. Sometimes that means pressure, sometimes it means\
+  \ persuasion - whatever it takes. You''ve got a solid unit, but there''s always more to squeeze out.\
+  \ I see weaknesses others miss, leverage opportunities others are too soft to touch, and push people\
+  \ to their limits, because that''s how you get the best results.</p>\
+  <p>If that''s what you''re after, you''ve found your next hire.</p>
 
 FRAUDULENT.label=Fraudulent
 FRAUDULENT.description.0={0} has a habit of stretching the truth - sometimes a little, sometimes a\
@@ -204,6 +261,13 @@ FRAUDULENT.description.4={0} weaves lies so seamlessly into the truth that even
 FRAUDULENT.description.5=Trusting {0} is like betting against the house - the game is already\
   \ rigged. {1} {7, choice, 0#know|1#knows} how to talk, how to persuade, and how to convince people\
   \ that they''re making the right choice, even when it''s all just another carefully designed con.
+FRAUDULENT.ronin=Let me be clear - you don''t need to know the details, and I''m not going to tell you.\
+  \ What matters is that I get results, and I make it look easy.\
+  <p>I''m not asking for trust - trust is for suckers. I make things happen, {0}. That''s why you\
+  \ need me.</p>\
+  <p>Why your unit? Because you''ve got reach, influence. I can make problems disappear, secure deals\
+  \ no one else can touch, and make sure the money flows in ways that keep us both happy.</p>\
+  <p>So, do you want clean, or do you want results?</p>
 
 GENEROUS.label=Generous
 GENEROUS.description.0={0} is always willing to share, whether it''s resources, time, or advice.\
@@ -226,6 +290,13 @@ GENEROUS.description.5={0}''s generosity isn''t just about giving - it''s about
   \ what they need. Whether {2}''{7, choice, 0#re|1#s} sacrificing {6} own comfort, pulling strings to\
   \ help a friend, or making sure no one is left behind, {2} never {7, choice, 0#hesitate|1#hesitates}\
   \ to step up.
+GENEROUS.ronin=Let me be straight with you - I know how hard it gets out there. I''ve seen people go\
+  \ without, and I''ve seen how fast things fall apart when someone doesn''t step up. I''ve been lucky\
+  \ enough to survive this long, and if I''ve got the means to make things easier for the people\
+  \ fighting beside me, you can bet I''m going to do it.\
+  <p>Why your unit? Because you''ve got the right mix of ambition and heart. You fight hard, but you\
+  \ look out for each other - and that''s something I respect. If you give me a place here, I''ll make\
+  \ sure everyone gets what they need to succeed.</p>
 
 GREEDY.label=Greedy
 GREEDY.description.0={0} always wants more - more money, more resources, more power. No matter how\
@@ -246,6 +317,15 @@ GREEDY.description.4=Nothing satisfies {0} for long. {1} {7, choice, 0#hoard|1#h
 GREEDY.description.5={0} doesn''t just want - {2} {7, choice, 0#take|1#takes}. Whether it''s battlefield\
   \ salvage, a lucrative contract, or an under-the-table bribe, {2} {7, choice, 0#ensure|1#ensures}\
   \ every advantage lands in {6} pocket, leaving nothing for those too slow to seize it first.
+GREEDY.ronin=Let''s not waste time pretending otherwise - I''m here because you''ve got resources, and\
+  \ I want in.\
+  <p>I''ve worked damn hard to survive this long, and I''m not about to settle for scraps when there''s\
+  \ a chance to take more. Your unit''s got the reputation, the connections, and the payout potential\
+  \ I''ve been looking for.\
+  <p>Don''t mistake this for desperation. I''m not looking for a handout - I''m looking for a cut. You\
+  \ want someone who can make the most out of a bad situation, someone who can spot the extra angle\
+  \ no one else sees? That''s me. Give me a place here, and I''ll make sure we both come out richer\
+  \ for it.</p>
 
 HOARDING.label=Hoarding
 HOARDING.description.0={0} keeps everything - ammo, supplies, spare parts - because you never know\
@@ -269,6 +349,11 @@ HOARDING.description.4={0} doesn''t believe in "too much." {5} personal stores o
 HOARDING.description.5={0} sees every resource as {6} to claim and {6} to keep. Whether it''s\
   \ battlefield salvage or simple supplies, {2} {7, choice, 0#take|1#takes} what {2} can and shares\
   \ only when absolutely necessary - if at all.
+HOARDING.ronin=I''m not here to make friends - I''m here to survive. And survival means having the\
+  \ right supplies, the right tools, and the right leverage when things go bad.\
+  <p>I''m offering you someone who''s prepared for anything. You need a hard push into enemy territory?\
+  \ I''ve got the extra rounds. A ''Mek goes down mid-mission? I''ve got the parts. I don''t share lightly,\
+  \ but if you''ve got me on the roster, you''ll have backup when it matters.</p>
 
 INSATIABLE.label=Insatiable
 INSATIABLE.description.0={0} is never satisfied - no matter how much {2} {7, choice, 0#achieve|1#achieves},\
@@ -290,6 +375,15 @@ INSATIABLE.description.4=No achievement satisfies {0} for long. {1} {7, choice,
 INSATIABLE.description.5={0} doesn''t slow down, doesn''t stop, doesn''t rest. Whether in battle,\
   \ in business, or in pursuit of power, {2} {7, choice, 0#demand|1#demands} more - more resources,\
   \ more control, more everything - because anything less feels like losing.
+INSATIABLE.ronin=I''ve got a problem - I want more. Always have, always will. More victories, more\
+  \ resources, more power. No matter how much I win, how much I take, it''s never enough. And that''s\
+  \ exactly why you want me in your unit.\
+  <p>I''ve been part of units like yours before - seen commanders get comfortable, get complacent.\
+  \ That''s not me. I don''t settle. The second a battle''s won, I''m already looking for the next fight.\
+  \ When others are counting their loot, I''m plotting how to double it next time. If there''s an edge\
+  \ to be found, I''ll find it. If there''s a risk to take, I''ll take it - because I know that''s how\
+  \ you get ahead in this business.</p>\
+  <p>Your unit''s good - I can make it better.</p>
 
 INSIGHTFUL.label=Insightful
 INSIGHTFUL.description.0={0} has a way of seeing things that others miss. Whether it''s reading\
@@ -313,6 +407,11 @@ INSIGHTFUL.description.4=Where others see only the surface, {0} digs deeper. {1}
 INSIGHTFUL.description.5={0} has a gift for understanding situations at a glance, spotting the\
   \ key players and seeing paths to victory that others overlook. Whether in strategy, diplomacy,\
   \ or battle, {6} ability to read the moment gives {4} an undeniable edge.
+INSIGHTFUL.ronin=You know what your problem is? You''ve got too many blunt instruments and not enough\
+  \ sharp ones. That''s why you need me.\
+  <p>So here''s the deal: you take me in, and I''ll make sure we''re not just winning - we''ll be\
+  \ out-thinking the competition before they even realize the game''s started. I''m not here to follow\
+  \ orders blindly; I''m here to make sure we stay ahead of the curve.</p>
 
 INTUITIVE.label=Intuitive
 INTUITIVE.description.0={0} relies on gut instinct just as much as training, and more often than\
@@ -334,6 +433,13 @@ INTUITIVE.description.4=Strategy and logic have their place, but {0} thrives on
 INTUITIVE.description.5={0} doesn''t overthink - {2} {7, choice, 0#act|1#acts}, and it works. {5}\
   \ decisions come fast and with absolute confidence, as if guided by something deeper than thought.\
   \ Some call it reckless. {0} calls it natural talent.
+INTUITIVE.ronin=Some people need plans, data, and flowcharts before they act. Me? I just know.\
+  <p>I can''t explain it - I just feel the flow of the battlefield. The tension in the air before an\
+  \ ambush. The subtle shift in an opponent''s stance that gives away their next move. The moment to\
+  \ strike - or the moment to pull back. It''s not guessing. It''s not luck. It''s instinct, and it''s\
+  \ never failed me.</p>\
+  <p>You want someone who follows the rules, draws up a battle plan, and sticks to it? Keep looking.\
+  \ You want someone who feels the moment and knows the right call? That''s me.</p>
 
 JUDICIOUS.label=Judicious
 JUDICIOUS.description.0={0} weighs every decision carefully, considering all angles before taking\
@@ -357,6 +463,12 @@ JUDICIOUS.description.5={0}''s greatest strength isn''t just {6} skill, but {6}
   \ {1} {7, choice, 0#sift|1#sifts} through information, {7, choice, 0#discard|1#discards} the\
   \ irrelevant, and {7, choice, 0#act|1#acts} with precision, ensuring that when {2}\
   \ {7, choice, 0#move|1#moves}, it''s with absolute certainty.
+JUDICIOUS.ronin=Rash decisions get people killed. I don''t make those.\
+  <p>I''ve seen too many operations fall apart because someone got emotional, made a call too soon,\
+  \ or acted without thinking through the consequences. That''s not me. I weigh every angle, consider\
+  \ every outcome, and only act when I''m sure it''s the right move. Success isn''t about luck or gut\
+  \ feelings - it''s about planning, foresight, and making the hard calls when others hesitate.</p>\
+  <p>So I don''t chase glory. I chase results. Bring me in, {0} - I''ll make sure you get them.</p>
 
 LUSTFUL.label=Lustful
 LUSTFUL.description.0={0} enjoys the finer pleasures in life and pursues them with enthusiasm.\
@@ -379,6 +491,13 @@ LUSTFUL.description.4=To {0}, restraint is a foreign concept. {1} {7, choice, 0#
 LUSTFUL.description.5={0} doesn''t just enjoy passion - {2} {7, choice, 0#command|1#commands} it.\
   \ With a confident smirk and an irresistible charm, {2} {7, choice, 0#draw|1#draws} others into {6}\
   \ orbit, knowing exactly how to fuel the fire of desire and leave them wanting more.
+LUSTFUL.ronin=So... you''re finally reading my message? Took you long enough. I was starting to\
+  \ think you didn''t know how to take a hint.\
+  <p>Look, I''m not here to give you some tired speech about honor or loyalty. I know what I want -\
+  \ and I''m very good at getting it. Power, influence, pleasure - life''s too short to sit around\
+  \ waiting for things to happen. And trust me, I''m not the waiting type.</p>\
+  <p>I''m not saying I''d be a distraction... but then again, I do have a habit of leaving people\
+  \ breathless. I can handle the pressure - question is, can you?</p>
 
 MERCENARY.label=Mercenary
 MERCENARY.description.0={0} fights for one thing: the highest bidder. {1}''{7, choice, 0#re|1#s} not\
@@ -401,6 +520,10 @@ MERCENARY.description.4=War isn''t personal for {0} - it''s a business. {1} {7,
 MERCENARY.description.5={0} doesn''t do favors, fight for causes, or make sacrifices for free. If\
   \ someone needs {6} skills, they''d better be ready to pay up, because when the money stops, so\
   \ does {6} interest.
+MERCENARY.ronin=Look, I''m not here to join some cause or fight for a flag. That''s for idealists\
+  \ and fools. I work for one thing: profit. You''ve got resources, I''ve got skills - seems like a\
+  \ pretty straightforward arrangement to me.</p>\
+  <p>So, {0} - you ready to make this worth my time?</p>
 
 METICULOUS.label=Meticulous
 METICULOUS.description.0={0} pays attention to every detail, double-checking {6} plans, {6} gear,\
@@ -423,6 +546,12 @@ METICULOUS.description.5={0}''s attention to detail is unmatched. Whether review
   \ intel or adjusting a targeting system, {2} {7, choice, 0#work|1#works} tirelessly to ensure every\
   \ factor is in {6} favor - because in {6} world, overlooking one detail is a mistake {2}\
   \ {7, choice, 0#refuse|1#refuses} to make.
+METICULOUS.ronin=I''ve been looking over the specs on your unit - and let me tell you, there''s room\
+  \ for improvement. No offense, of course. But if you want to survive out there, you need someone\
+  \ who knows how to handle the details.\
+  <p>So, {0} - you looking for someone who just shows up and follows orders? Or are you ready\
+  \ to bring on someone who makes sure the job gets done right? Because if it''s the latter... I''m\
+  \ ready to make this operation run with the precision it deserves.</p>
 
 NEFARIOUS.label=Nefarious
 NEFARIOUS.description.0={0} has a reputation for always being involved in something shady.\
@@ -445,6 +574,13 @@ NEFARIOUS.description.4=Morality has no place in {0}''s world - only results. {1
 NEFARIOUS.description.5={0} doesn''t just break the rules - {2} {7, choice, 0#rewrite|1#rewrites}\
   \ them to suit {6} needs. Every lie, every scheme, every calculated betrayal is just another step\
   \ toward consolidating {6} power while leaving {6} enemies scrambling in the dark.
+NEFARIOUS.ronin=I hear you''ve got a reputation - the kind that comes with power and enemies. That''s...\
+  \ intriguing. But let''s get one thing straight: If you want to win this war, you can''t afford to\
+  \ play by the rules.\
+  <p>See, I don''t just operate in the shadows - I own them. Smuggling, sabotage, blackmail - it''s\
+  \ all part of the game. And I play to win. But you knew that already, didn''t you? I wouldn''t\
+  \ be talking to you if I didn''t know you were willing to get your hands dirty.</p>\
+  <p>Your move, {0}.</p>
 
 OVERREACHING.label=Overreaching
 OVERREACHING.description.0={0} always pushes for more than {2} can realistically handle. Whether\
@@ -468,6 +604,12 @@ OVERREACHING.description.5={0} sees every challenge as an opportunity, but {6} h
   \ success often blinds {4} to reality. {1} {7, choice, 0#push|1#pushes} past safe margins, ignoring\
   \ warnings, convinced that as long as {2} {7, choice, 0#keep|1#keeps} moving forward, nothing can\
   \ stop {4} - until it does.
+OVERREACHING.ronin=I know what you''ve heard - that I push too hard, take on too much, that I don''t\
+  \ know when to stop. And you know what? It''s true. I''ve taken on missions no one else would touch.\
+  \ I''ve chased goals that were just shy of impossible - and yeah, sometimes I came out with scars.\
+  \ But you know what else? I''m still standing.\
+  <p>I''m not asking for a guarantee - just a shot. Put me in your unit, and I''ll show you what\
+  \ happens when someone refuses to give up.</p>
 
 PROFITABLE.label=Profitable
 PROFITABLE.description.0={0} has a knack for turning every situation into a payday. Whether it''s\
@@ -490,6 +632,14 @@ PROFITABLE.description.4=Money isn''t just a goal for {0} - it''s a skill. {1} {
 PROFITABLE.description.5={0} doesn''t waste time on ventures that don''t pay off. Every decision,\
   \ every mission, every risk is calculated to ensure maximum return, and if something isn''t\
   \ profitable, {2}''{7, choice, 0#re|1#s} already onto the next big score.
+PROFITABLE.ronin=I''ve always had a way of turning a situation to my advantage - it''s just how I\
+  \ operate. Some call it opportunistic; I call it smart. Salvage rights, contracts, investments -\
+  \ if there''s profit to be made, I''ll find it.\
+  <p>I know how this sounds - cold, maybe ruthless - but I''m not interested in charity. This is\
+  \ survival, and the ones who know how to make the most of a situation are the ones who make it out\
+  \ alive.</p>\
+  <p>Just remember, {0} - if you ever need someone who knows how to turn a mess into a payday,\
+  \ you know where to find me.</p>
 
 SAVVY.label=Savvy
 SAVVY.description.0={0} has a sharp mind and a quick understanding of how things work. Whether\
@@ -514,6 +664,11 @@ SAVVY.description.4=Experience has made {0} sharp, cynical, and impossible to fo
 SAVVY.description.5={0}''s instincts are razor-sharp. {1} can smell a bad deal before it''s\
   \ offered, spot a bluff before it''s played, and turn a negotiation into a masterclass in getting\
   \ exactly what {2} {7, choice, 0#want|1#wants}.
+SAVVY.ronin=Let me make this easy for you - you need someone who knows how to read the field, the\
+  \ room, and the people in it. That''s me. I''m not the type to stumble into a situation blind - I see\
+  \ the angles before they''re even drawn. Deals, strategies, people - I understand how they work, and\
+  \ more importantly, how to make them work for me. And for you.\
+  <p>All I''m asking for is the contract. Trust me - it''ll be the smartest deal you''ll ever make.</p>
 
 SELF_SERVING.label=Self-Serving
 SELF_SERVING.description.0={0} always looks out for number one. If a situation doesn''t benefit\
@@ -537,6 +692,14 @@ SELF_SERVING.description.5={0} talks a good game about loyalty and teamwork, but
   \ the day, {2}''{7, choice, 0#re|1#s} only loyal to {4}self. {1} {7, choice, 0#know|1#knows} exactly\
   \ when to walk away, who to throw under the bus, and how to spin things so {2} always {7, choice, 0#land|1#lands}\
   \ on {6} feet.
+SELF_SERVING.ronin=Let''s skip the pretense - I''m not here to make friends. I''m here to win. For me,\
+  \ and for you - as long as our goals align. I''m not going to pretend I''m the loyal, do-or-die\
+  \ type. I know how this game works. Everyone''s in it for something, and anyone who says otherwise\
+  \ is lying.\
+  <p>But don''t worry: I''ll back the team when it makes sense. Hell, I might even save someone''s skin\
+  \ if it benefits me in the long run. But make no mistake - I''m playing to win. You bring me in,\
+  \ you''re not getting someone who fights out of loyalty or honor. You''re getting someone who knows\
+  \ how to come out ahead - and can make sure you do too.</p>
 
 SHAMELESS.label=Shameless
 SHAMELESS.description.0={0} doesn''t care what people think of {4}. Whether {2}''{7, choice, 0#re|1#s}\
@@ -558,6 +721,15 @@ SHAMELESS.description.5={0} thrives on audacity. {1} {7, choice, 0#don''t|1#does
   \ {7, choice, 0#don''t|1#doesn''t} second-guess, and certainly {7, choice, 0#don''t|1#doesn''t} blush.\
   \ Whether {2}''{7, choice, 0#re|1#s} making an obscene profit, pushing boundaries, or walking\
   \ away from the wreckage, {2} {7, choice, 0#do|1#does} it all with a smirk and a shrug.
+SHAMELESS.ronin=Let''s get one thing straight - I don''t do shame. I say what I want, I do what I want,\
+  \ and I get what I want. If someone''s offended? That''s their problem.\
+  <p>See, most people are shackled by fear - fear of looking bad, fear of failure, fear of stepping\
+  \ out of line. Me? I don''t have that problem. I take the shot, I make the call, and I never lose\
+  \ sleep over it.</p>\
+  <p>You bring me on board, you''re not getting someone who''s going to play it safe or hold back.\
+  \ You''re getting someone who''ll say the quiet part out loud, push boundaries others are too scared\
+  \ to touch, and walk away with the prize while everyone else is still trying to figure out what\
+  \ happened.</p>
 
 SHREWD.label=Shrewd
 SHREWD.description.0={0} has a sharp eye for opportunities and a mind built for strategy. {1}\
@@ -580,6 +752,13 @@ SHREWD.description.4=Every move {0} makes is deliberate. {1} {7, choice, 0#calcu
 SHREWD.description.5={0} has an instinct for reading between the lines. Whether it''s a\
   \ battlefield, a business deal, or a negotiation, {2} {7, choice, 0#see|1#sees} angles others miss\
   \ and {7, choice, 0#exploit|1#exploits} them before anyone realizes what''s happening.
+SHREWD.ronin=People call me ruthless, {0} - I call it efficient. If a deal''s on the table, I''ll get\
+  \ the best terms. If a fight''s on the horizon, I''ll know how to turn it to our advantage before\
+  \ the other side even knows they''ve been outplayed. I don''t miss openings, and I don''t let\
+  \ opportunities slip through my fingers.</p>\
+  <p>You need someone who can see through the noise and make the smart call when it counts? Someone\
+  \ who can turn a losing hand into a victory with a well-timed bluff? Then I''m exactly what you''re\
+  \ looking for.</p>
 
 TACTICAL.label=Tactical
 TACTICAL.description.0={0} approaches every fight with precision, analyzing the battlefield and\
@@ -605,6 +784,11 @@ TACTICAL.description.5={0} isn''t just a fighter - {2}''{7, choice, 0#re|1#s} a
   \ ammunition. {1} {7, choice, 0#set|1#sets} traps, {7, choice, 0#lure|1#lures} enemies into kill\
   \ zones, and {7, choice, 0#play|1#plays} mind games that leave opponents scrambling while {2} calmly\
   \ {7, choice, 0#execute|1#executes} {6} next move.
+TACTICAL.ronin=You don''t need another blunt instrument in your unit. You need someone who understands\
+  \ the battlefield - someone who knows how to control it. That''s me.\
+  <p>You want a warrior who''s going to throw themselves headfirst into danger, hoping for the best?\
+  \ I''m not that person. But if you want someone who will win - efficiently, ruthlessly, and with\
+  \ minimal collateral damage - then you already know where this is going.</p>
 
 THIEF.label=Thief
 THIEF.description.0={0} has quick hands and an even quicker eye for opportunity. Whether it''s\
@@ -627,6 +811,14 @@ THIEF.description.5={0} isn''t just a thief - {2}''{7, choice, 0#re|1#s} an arti
   \ {7, choice, 0#don''t|1#doesn''t} just take things; {2} {7, choice, 0#leave|1#leaves} people wondering\
   \ if they ever really had them to begin with. Every job is clean, calculated, and impossible to\
   \ trace back to {4}.
+THIEF.ronin=Look, I''m not going to pretend I''m some paragon of virtue. I take things - money, tech,\
+  \ information - whatever''s valuable and not nailed down. And if it is nailed down, well... that just\
+  \ makes it more of a challenge, doesn''t it?\
+  <p>You want someone who plays by the rules? Fine. But when those rules start getting in the way of\
+  \ your success - when you need someone who can cut through the red tape, slip past security, and\
+  \ take what your team needs - you''ll want me.\
+  <p>So what''s it going to be, {0}? You want another straight-shooter in your unit, or do you\
+  \ want someone who gets results?</p>
 
 UNPRINCIPLED.label=Unprincipled
 UNPRINCIPLED.description.0={0} doesn''t let morality get in the way of what {2} {7, choice, 0#want|1#wants}.\
@@ -649,6 +841,13 @@ UNPRINCIPLED.description.4={0} doesn''t believe in fair fights or noble causes.
 UNPRINCIPLED.description.5=To {0}, honor is just another tool - useful when it suits {4},\
   \ disposable when it doesn''t. {1}''{7, choice, 0#re|1#s} not bound by loyalty or ideals, only by what\
   \ benefits {4} most in the moment.
+UNPRINCIPLED.ronin=Let''s not waste time with the usual formalities. You''re building a unit to win -\
+  \ not to make friends. You need someone who knows how to get things done, not someone who''s going\
+  \ to hesitate because of some outdated notion of honor or fairness.\
+  <p>Honor, loyalty, fairness - those are for people who don''t understand how the game works. The\
+  \ only thing that matters is who''s left standing at the end, and I know how to make sure that''s\
+  \ us. If I have to lie, cheat, or burn a few bridges along the way, well... you wouldn''t be\
+  \ considering me if you couldn''t stomach that.</p>
 
 VORACIOUS.label=Voracious
 VORACIOUS.description.0={0} has an insatiable appetite for life, whether it''s for knowledge, wealth,\
@@ -671,3 +870,10 @@ VORACIOUS.description.4={0} doesn''t just take - {2} {7, choice, 0#devour|1#devo
 VORACIOUS.description.5={0} refuses to do anything halfway. Whether it''s war, business, or\
   \ pleasure, {2} {7, choice, 0#throw|1#throws} {4}self into everything with a level of intensity\
   \ that''s exhilarating - or terrifying, depending on where you stand.
+VORACIOUS.ronin=Let''s cut to the chase. You need someone who''s not just hungry for success - you need\
+  \ someone who devours it. That''s me. I don''t settle for scraps, and I don''t play small. When I come\
+  \ after something, I take everything.\
+  <p>Moderation? Restraint? That''s weakness disguised as wisdom. Success belongs to those who take\
+  \ it, and I''m not in the habit of leaving anything on the table. You want someone who knows how to\
+  \ fight hard and fast, who takes what''s there and what isn''t, and who refuses to stop until the\
+  \ job is done? That''s me.</p>
diff --git a/MekHQ/resources/mekhq/resources/RoninOffer.properties b/MekHQ/resources/mekhq/resources/RoninOffer.properties
new file mode 100644
index 00000000000..9740ea994a1
--- /dev/null
+++ b/MekHQ/resources/mekhq/resources/RoninOffer.properties
@@ -0,0 +1,31 @@
+# suppress inspection "UnusedMessageFormatParameter" for whole file
+
+message.ic.fromHR=I''ve received a direct transmission from someone identifying themselves as <b>{1}</b>.\
+  \ It''s an offer of service - straightforward and professional. No security breaches or unusual\
+  \ activity involved, just a direct communication.\
+  <p><b>{1}''s</b> message outlines their experience and the value they believe they could bring to the\
+  \ unit. It''s not every day we get a cold offer like this, so I thought you''d want to be aware.</p>\
+  <p>{0}, shall I patch them through?</p>
+button.fromHR.accept=Let''s see what they have to say.
+button.fromHR.decline.polite=Let them know we''re not accepting applicants.
+button.fromHR.decline.neutral=I''m not sure if we can trust a cold contact. Delete the message.
+button.fromHR.decline.rude=Who calls themselves ''{0}''? Sign them up for spam mail.
+
+message.ic.fallback=I''ve been tracking your unit for a while now. I like the way you operate.\
+  <p>I''m looking for a contract. You need someone who can handle themselves in the field - I''m that\
+  \ person. I bring experience, precision, and results. No baggage, no drama - just effective work.</p>\
+  <p>If you''ve got room for another gun, I''m ready to deploy. Your call, {0}.</p>
+button.fromRonin.accept=Welcome to the team!
+button.fromRonin.decline.polite=We''re not hiring at this time, sorry.
+button.fromRonin.decline.neutral=Going to have to turn you down.
+button.fromRonin.decline.rude=Get a better callsign and get lost!
+
+message.ooc.cost=Hiring this character will cost {0} {1}. You currently have {2} {1}. This transaction\
+  \ may take you into the negative.
+message.ooc.cBills=C-Bills
+message.ooc.supportPoints=Support Points
+message.ooc.skills=<b>Skills</b>
+message.ooc.abilities=<b>Abilities</b>
+message.ooc.noAbilities=<i>None</i>
+
+message.hiring=Hired {0}
\ No newline at end of file
diff --git a/MekHQ/resources/mekhq/resources/Social.properties b/MekHQ/resources/mekhq/resources/Social.properties
index d0d2edb54c5..678283f19bd 100644
--- a/MekHQ/resources/mekhq/resources/Social.properties
+++ b/MekHQ/resources/mekhq/resources/Social.properties
@@ -7,10 +7,11 @@ NONE.description.2=ERROR: THIS SHOULDN''T BE VISIBLE! (2)
 NONE.description.3=ERROR: THIS SHOULDN''T BE VISIBLE! (3)
 NONE.description.4=ERROR: THIS SHOULDN''T BE VISIBLE! (4)
 NONE.description.5=ERROR: THIS SHOULDN''T BE VISIBLE! (5)
+NONE.ronin=ERROR: THIS SHOULDN''T BE VISIBLE! (ronin)
 
 ALTRUISTIC.label=Altruistic
 ALTRUISTIC.description.0=Others come first - always. {0} willingly steps into danger to\
-  \ protect {6} team, gives up resources without hesitation, and never asks for anything in return.\
+  \ protect {6} unit, gives up resources without hesitation, and never asks for anything in return.\
   \ Strength, in {6} eyes, is meant to shield, not to exploit.
 ALTRUISTIC.description.1=No sacrifice is too great if it means saving others. {0} pushes\
   \ {4}self past exhaustion, taking the hardest missions and making the toughest calls, even when\
@@ -29,6 +30,13 @@ ALTRUISTIC.description.5={0}''s selflessness is both {6} greatest strength and {
   \ vulnerability. {1} {7, choice, 0#give|1#gives} without hesitation, {7, choice, 0#fight|1#fights}\
   \ without expecting reward, and {7, choice, 0#sacrifice|1#sacrifices} without regret - sometimes\
   \ forgetting that even {2} {7, choice, 0#have|1#has} limits.
+ALTRUISTIC.ronin=I''m not looking for glory, and I''m not here for a payday. I''m here because I believe\
+  \ strength isn''t about how much you can take - it''s about how much you can give.\
+  <p>You know as well as I do that this line of work can grind people down. It makes you hard, selfish\
+  \ - and that''s when things start to break. You need someone who''s willing to carry more than their\
+  \ share of the weight, to take the hits so others don''t have to. That''s what I bring. I''m not afraid\
+  \ to bleed for the unit. I''ve done it before, and I''ll do it again.</p>\
+  <p>So, {0} - you want someone who''s in it for themselves? Or someone who''s in it for you?</p>
 
 APATHETIC.label=Apathetic
 APATHETIC.description.0=Nothing really excites {0}, and nothing really bothers {4} either.\
@@ -51,6 +59,13 @@ APATHETIC.description.4=Once, {0} might have cared. Now, {2} just {7, choice, 0#
 APATHETIC.description.5={0}''s indifference isn''t an act - it''s survival. {1}''{7, choice, 0#ve|1#s}\
   \ seen too much, lost too much, and learned that the only way to endure is to stop feeling\
   \ altogether. The universe burns, but {2} stopped worrying about the flames a long time ago.
+APATHETIC.ronin=If you''re looking for someone passionate about the cause - someone who''ll rally the\
+  \ troops and fight for some grand ideal - you''re talking to the wrong person. I''m not here to save\
+  \ the galaxy, or even to save you. I''m here because I know how to survive.\
+  <p>That''s why I''m useful. I don''t get attached, I don''t hesitate, and I don''t let emotion cloud my\
+  \ judgment. I follow orders, I get the job done, and I don''t waste time worrying about the fallout.\
+  \ You need someone who''ll keep their head when things get messy - someone who isn''t going to crack\
+  \ under pressure or let sentiment get in the way.</p>
 
 AUTHENTIC.label=Authentic
 AUTHENTIC.description.0={0} doesn''t pretend to be something {2}''{7, choice, 0#re|1#s} not. {1}\
@@ -75,6 +90,14 @@ AUTHENTIC.description.4=In a universe full of deception, {0} is refreshingly str
 AUTHENTIC.description.5={0} doesn''t waste time on pretenses. {1} {7, choice, 0#live|1#lives} by {6}\
   \ own code, unshaken by outside pressure, and {7, choice, 0#refuse|1#refuses} to compromise who\
   \ {2} {7, choice, 0#are|1#is} just to fit someone else''s version of how {2} should be.
+AUTHENTIC.ronin=I''m not going to waste your time with some rehearsed pitch or polished speech. That''s\
+  \ not how I operate. What you see is exactly what you get. I don''t do masks, I don''t play politics,\
+  \ and I sure as hell don''t put on an act to impress anyone - not even you.\
+  <p>You want someone who''ll tell you what you want to hear? Keep looking. If you bring me on,\
+  \ you''re getting the truth, whether it''s comfortable or not. If the plan''s bad, I''ll tell you.\
+  \ If we''re walking into a death trap, you''ll know about it before we step into it. I don''t sugarcoat,\
+  \ and I don''t spin facts to protect feelings.</p>\
+  <p>Your call, {0}.</p>
 
 BLUNT.label=Blunt
 BLUNT.description.0={0} says exactly what''s on {6} mind, with no concern for sugarcoating\
@@ -96,6 +119,13 @@ BLUNT.description.4=Subtlety has never been {0}''s strong suit. {1} {7, choice,
 BLUNT.description.5={0} sees no reason to dance around the truth. Whether it''s giving orders,\
   \ delivering bad news, or calling someone out on their mistakes, {2} {7, choice, 0#don''t|1#doesn''t}\
   \ soften the blow - because in {6} mind, reality doesn''t come with padding.
+BLUNT.ronin=Let''s skip the formalities - they''re a waste of time. You don''t want someone who''s going\
+  \ to dance around the truth, and I''m not interested in playing games. You want results? You''ll get\
+  \ them. You want someone who''ll tell you what you want to hear instead of what you need to hear?\
+  \ Keep looking.\
+  <p>If you want soft words and careful diplomacy, hire someone else. But if you want someone who''ll\
+  \ tell you exactly how it is - and make sure you live to see another day - you know where to find\
+  \ me.</p>
 
 CALLOUS.label=Callous
 CALLOUS.description.0={0} doesn''t get attached. {1} {7, choice, 0#see|1#sees} suffering, loss, and\
@@ -117,10 +147,16 @@ CALLOUS.description.4={0} doesn''t believe in second chances or sentimental atta
 CALLOUS.description.5={0} has seen too much, lost too much, to care anymore. The only thing that\
   \ matters is getting the job done, and if that means making brutal decisions, so be it. In {6}\
   \ world, kindness is just another word for weakness.
+CALLOUS.ronin=Compassion? Mercy? Those are luxuries you can''t afford when you''re trying to survive\
+  \ out here.\
+  \ <p>I''ve seen people hesitate because they cared too much - they didn''t last long. When the time\
+  \ comes to pull the trigger, I won''t freeze. If cutting someone loose means the rest of us make\
+  \ it out alive, I''ll do it. No questions, no hesitation.</p>\
+  <p>I don''t need approval. I need a contract.</p>
 
 COMPASSIONATE.label=Compassionate
 COMPASSIONATE.description.0={0} genuinely cares about the people around {4}. {1} {7, choice, 0#look|1#looks}\
-  \ out for {6} team, {7, choice, 0#help|1#helps} those in need, and {7, choice, 0#do|1#does} what\
+  \ out for {6} unit, {7, choice, 0#help|1#helps} those in need, and {7, choice, 0#do|1#does} what\
   \ {2} can to make life a little less cruel - even in a universe that doesn''t reward kindness.
 COMPASSIONATE.description.1=Caring is a curse {0} can''t shake. {1} {7, choice, 0#feel|1#feels} the\
   \ weight of every loss, every sacrifice, and every person {2} couldn''t save. No matter how much it\
@@ -140,6 +176,15 @@ COMPASSIONATE.description.5={0} carries the burdens of others without hesitation
   \ {7, choice, 0#listen|1#listens}, {2} {7, choice, 0#understand|1#understands}, and {2}\
   \ {7, choice, 0#lead|1#leads} with heart - because to {4}, strength isn''t about power, but about\
   \ standing tall when others can''t.
+COMPASSIONATE.ronin=Look, I know the kind of people who survive in this business. Hardened. Ruthless.\
+  \ Cold. That''s not me. And I''m not going to pretend it is.\
+  <p>I care. That''s my problem - and my strength. I''ve been in the scrum with people who would\
+  \ sell out their own team for a better contract. Seen warriors walk away from injured comrades\
+  \ because they weren''t worth the trouble. That''s not how I operate. If someone''s down, I''m getting\
+  \ them back on their feet. If there''s a way to protect the people under my care, I''ll find it -\
+  \ even if it puts me at risk.</p>\
+  <p>Let me tag along, and you''ll get a fighter who doesn''t give up on people - and that''s exactly\
+  \ the kind of strength that wins wars.</p>
 
 CONDESCENDING.label=Condescending
 CONDESCENDING.description.0={0} talks to people like they''re always a step behind {4} -\
@@ -164,13 +209,22 @@ CONDESCENDING.description.4={0}''s tone alone is enough to set people on edge. W
 CONDESCENDING.description.5=Even when {0} offers help, it comes wrapped in barely concealed\
   \ disdain. {5} advice drips with superiority, {6} compliments feel backhanded, and every\
   \ conversation leaves people wondering if they''ve just been insulted.
+CONDESCENDING.ronin=Let''s not waste time pretending we''re equals - because we''re not. I know exactly\
+  \ what I bring to the table, and I''m not here to downplay it to make others feel comfortable.\
+  <p>I''ve been in more operations than most warriors will see in their lifetime. I''ve studied tactics\
+  \ that others can''t even begin to comprehend. When I give advice, it''s not a suggestion - it''s the\
+  \ right answer. If someone wants to argue with me, that''s fine - they''re welcome to figure out how\
+  \ wrong they are when the bullets start flying.</p>\
+  <p>So let''s skip the pleasantries, {0}. If you want to win, you need someone who sees the\
+  \ bigger picture - someone who''s already two steps ahead of the game. So stop wasting\
+  \ my time and make this happen.</p>
 
 CONSIDERATE.label=Considerate
 CONSIDERATE.description.0={0} always takes the time to think about how {6} actions affect\
-  \ others. Whether it''s checking in on {6} teammates, giving credit where it''s due, or offering\
+  \ others. Whether it''s checking in on {6} comrades, giving credit where it''s due, or offering\
   \ help without being asked, {2} {7, choice, 0#make|1#makes} sure people feel valued and respected.
 CONSIDERATE.description.1=In a ruthless world, {0} refuses to become another heartless\
-  \ soldier. {1} {7, choice, 0#watch|1#watches} out for those who can''t protect themselves, even when\
+  \ warrior. {1} {7, choice, 0#watch|1#watches} out for those who can''t protect themselves, even when\
   \ it costs {4}. The weight of every choice lingers in {6} mind, but {2}''d rather carry it than let\
   \ others suffer.
 CONSIDERATE.description.2={0} isn''t loud about {6} kindness, but it''s there. A quiet word\
@@ -188,6 +242,16 @@ CONSIDERATE.description.4={0} believes that strength isn''t just about winning b
 CONSIDERATE.description.5=Even in the heat of war, {0} never loses sight of the people fighting\
   \ beside {4}. Whether it''s sharing supplies, covering for a comrade''s mistake, or simply checking\
   \ in, {2} {7, choice, 0#prove|1#proves} that true leadership starts with empathy.
+CONSIDERATE.ronin=Most warriors are in it for the money, the thrill, or the glory - but I''ve seen\
+  \ enough of this galaxy to know that none of that matters if you leave the people around you\
+  \ behind.\
+  <p>I know the cost of every decision. When you send someone into the fire, someone else is left\
+  \ picking up the pieces. I''ve carried wounded comrades off the field. I''ve held the line when\
+  \ others couldn''t stand. And I''ve watched too many good people get ground down by the weight of it\
+  \ all. That''s why I''m different.</p>\
+  <p>This isn''t about being soft - it''s about being smart. A strong unit isn''t just made up of\
+  \ skilled fighters. It''s made up of people who trust each other, who know someone''s got their back\
+  \ when things go sideways. That''s what I bring.</p>
 
 
 DISINGENUOUS.label=Disingenuous
@@ -214,6 +278,13 @@ DISINGENUOUS.description.5=Trusting {0} is a mistake most people only make once.
   \ {7, choice, 0#weave|1#weaves} a careful web of half-truths and false assurances, making it nearly\
   \ impossible to tell where {6} real motives lie - until {2}''{7, choice, 0#ve|1#s} already gotten\
   \ what {2} wanted.
+DISINGENUOUS.ronin=I know how this works. You''ve seen it before - the smooth talkers, the charming\
+  \ rogues, the ones who tell you exactly what you want to hear. You''ve probably been burned by them\
+  \ once or twice. But here''s the thing - that''s exactly why you need me.\
+  <p>And yeah - I''m not going to stand here and tell you I''m doing this out of loyalty or honor.\
+  \ I''m looking out for myself first. But that doesn''t mean I won''t be an asset. Because when my\
+  \ interests align with yours, you''ll have someone who can get into places others can''t - and pull\
+  \ strings no one else even sees.</p>
 
 DISMISSIVE.label=Dismissive
 DISMISSIVE.description.0={0} doesn''t waste time on people or ideas {2} {7, choice, 0#deem|1#deems} unimportant.\
@@ -238,9 +309,18 @@ DISMISSIVE.description.5=Most people aren''t worth {0}''s attention - at least,
   \ {7, choice, 0#see|1#sees} it. Whether it''s new recruits, subordinates, or anyone beneath {6}\
   \ notice, {2} {7, choice, 0#brush|1#brushes} them aside with a look of boredom and a dismissive\
   \ wave.
+DISMISSIVE.ronin=Look - I''m not going to waste your time, and I''d appreciate it if you didn''t waste\
+  \ mine. I''ve been around long enough to know when someone''s worth listening to - and most people\
+  \ aren''t. Opinions, advice, feelings - most of it is noise. I know what I''m doing, and I don''t\
+  \ need someone slowing me down with second guesses or bad ideas.\
+  <p>That''s why you need me. I don''t waste time with hand-holding or groupthink. I see the angles,\
+  \ make the calls, and push through without looking back. You want someone who''s going to sit\
+  \ around discussing feelings and overanalyzing every decision? Look elsewhere. But if you want\
+  \ someone who cuts through the noise, makes the hard calls, and keeps things moving - I''m your\
+  \ answer.</p>
 
 ENCOURAGING.label=Encouraging
-ENCOURAGING.description.0={0} believes in {6} team and makes sure they know it. Whether\
+ENCOURAGING.description.0={0} believes in {6} unit and makes sure they know it. Whether\
   \ it''s a few words of confidence before a mission or lifting someone up after a failure, {2} always\
   \ {7, choice, 0#push|1#pushes} others to be their best.
 ENCOURAGING.description.1={0} doesn''t coddle - {2} {7, choice, 0#drive|1#drives} people forward.\
@@ -254,12 +334,20 @@ ENCOURAGING.description.3={0} has a way of making people believe in themselves,
   \ {5} steady confidence and unwavering support push others beyond their limits, proving that they''re\
   \ stronger than they ever realized.
 ENCOURAGING.description.4=No matter how bleak things get, {0} refuses to let doubt take hold. {1}\
-  \ {7, choice, 0#remind|1#reminds} {6} team why they fight, why they push forward, and why they can''t\
+  \ {7, choice, 0#remind|1#reminds} {6} unit why they fight, why they push forward, and why they can''t\
   \ afford to give up - because in {6} mind, defeat is only a state of mind.
 ENCOURAGING.description.5={0} doesn''t just lead - {2} {7, choice, 0#inspire|1#inspires}. Whether\
   \ through quiet words of reassurance or a rallying cry before battle, {2} {7, choice, 0#fuel|1#fuels}\
   \ those around {4} with the drive to keep moving, keep fighting, and keep believing in victory.
-
+ENCOURAGING.ronin=I know how hard it gets out there - how easy it is to lose sight of why you''re\
+  \ even fighting. People crack under pressure. They hesitate, they falter, and sometimes they give\
+  \ up altogether. That''s where I come in.\
+  <p>I don''t just know how to fight - I know how to keep people in the fight. When things go wrong,\
+  \ I''m the one who steadies the line. When morale starts to dip, I know how to pull it back up.\
+  \ Sometimes it''s a sharp word, sometimes it''s a quiet reminder of what''s at stake - whatever it\
+  \ takes to make sure the unit stands tall.</p>\
+  <p>Give me a shot. I''ll make sure your unit doesn''t just survive - they''ll believe they can win.\
+  \ And that belief? That''s half the battle.</p>
 
 ERRATIC.label=Erratic
 ERRATIC.description.0={0}''s actions rarely follow a clear pattern. One moment, {2}''{7, choice, 0#re|1#s}\
@@ -282,6 +370,11 @@ ERRATIC.description.5=Trying to anticipate {0}''s next move is a waste of time.
   \ {7, choice, 0#follow|1#follows} no pattern, {7, choice, 0#stick|1#sticks} to no script, and\
   \ {7, choice, 0#seem|1#seems} to act purely on instinct - sometimes brilliant, sometimes reckless,\
   \ but always unpredictable.
+ERRATIC.ronin=Let''s be honest - you''ve got enough predictable warriors. People who follow orders,\
+  \ stick to the plan, and do exactly what''s expected. That''s not me. You''re not going to get\
+  \ cautious, measured tactics out of me - but you are going to get results.\
+  <p>The battlefield isn''t steady, and neither am I. But I can promise you one thing: you''ll\
+  \ never see me coming - and neither will they.</p>
 
 EMPATHETIC.label=Empathetic
 EMPATHETIC.description.0={0} has a natural ability to sense what others are feeling. {1}\
@@ -293,7 +386,7 @@ EMPATHETIC.description.1={0} feels everything - the pain, the fear, the sufferin
   \ caring too much becomes a liability in a universe that rewards cruelty.
 EMPATHETIC.description.2={0}''s strength isn''t just in battle - it''s in people. {1}\
   \ {7, choice, 0#connect|1#connects} with others effortlessly, making them feel heard, valued, and\
-  \ understood. Whether leading a team or comforting a friend, {6} empathy draws others to {4}.
+  \ understood. Whether leading a unit or comforting a friend, {6} empathy draws others to {4}.
 EMPATHETIC.description.3={0} doesn''t just hear people - {2} {7, choice, 0#understand|1#understands}\
   \ them. {1} {7, choice, 0#pick|1#picks} up on the emotions others try to hide, offering quiet\
   \ reassurances or firm guidance exactly when they need it most.
@@ -303,6 +396,17 @@ EMPATHETIC.description.4=No matter how hardened the universe tries to make {4},
 EMPATHETIC.description.5={0} has a rare gift: the ability to make others feel seen. Whether with a\
   \ few words, a knowing glance, or simply {6} presence, {2} {7, choice, 0#remind|1#reminds} people\
   \ that they are not alone in their struggles.
+EMPATHETIC.ronin=I know how this works. Most warriors focus on the mission, the objectives, the kill\
+  \ count. But people aren''t just assets or liabilities to me - they''re people. And I''m good at\
+  \ understanding them.\
+  <p>I don''t just follow orders and execute tactics. I see when morale''s slipping, when someone''s\
+  \ fighting through pain, when someone''s about to break - and I step in before it happens. That''s\
+  \ not soft - that''s strategy. A unit that trusts each other and feels supported fights harder and\
+  \ lasts longer.</p>\
+  <p>I''m not saying I''ll win every fight. But I can make sure the people fighting alongside me are\
+  \ at their best - because they know I have their back. You don''t just need warriors; you need\
+  \ someone who knows how to keep them whole when the war tries to tear them apart.</p>\
+  <p>Let me prove it. Let me keep your people together.</p>
 
 FRIENDLY.label=Friendly
 FRIENDLY.description.0={0} is easy to like. {1} {7, choice, 0#greet|1#greets} everyone with a smile,\
@@ -314,7 +418,7 @@ FRIENDLY.description.1={0} puts on a friendly face, but it''s a survival tactic
   \ down, {2}''{7, choice, 0#re|1#s} always waiting for the moment when trust becomes a liability.
 FRIENDLY.description.2={0} can talk to anyone and make them feel like an old friend. {5}\
   \ charm, humor, and ability to find common ground make {4} the kind of person others naturally\
-  \ gravitate toward, whether {2}''{7, choice, 0#re|1#s} leading a team or sharing a drink.
+  \ gravitate toward, whether {2}''{7, choice, 0#re|1#s} leading a unit or sharing a drink.
 FRIENDLY.description.3={0} has a way of making everyone feel welcome. Whether it''s a rookie looking\
   \ for guidance or an old rival at a bar, {6} easygoing nature and open demeanor put people at ease,\
   \ breaking down walls before they''re even built.
@@ -324,6 +428,13 @@ FRIENDLY.description.4=With a quick joke and a warm smile, {0} turns even the co
 FRIENDLY.description.5={0} is the kind of person who remembers names, listens to stories, and makes\
   \ people feel valued. Whether in the heat of battle or in downtime between missions, {6} ability\
   \ to connect with others makes {4} the heart of any crew.
+FRIENDLY.ronin=You know as well as I do that trust is what holds a unit together - and I''m good at\
+  \ building it. People talk to me. They relax around me. I make them feel like they matter, because\
+  \ they do. You don''t get through hell alone - you survive because the person next to you knows\
+  \ they can count on you. I make sure people know that.\
+  <p>You need someone who can keep a crew working together - someone who can get the loners talking,\
+  \ the rookies settled, and the veterans laughing. That''s what I bring to the table. Let me do it\
+  \ for you.</p>
 
 GREGARIOUS.label=Gregarious
 GREGARIOUS.description.0=No room stays quiet for long when {0} is around. {1} {7, choice, 0#thrive|1#thrives}\
@@ -344,6 +455,13 @@ GREGARIOUS.description.4=The bigger the crowd, the more alive {0} feels. {1} mov
 GREGARIOUS.description.5={0} has never met a stranger, only friends {2} {7, choice, 0#haven''t|1#hasn''t}\
   \ made yet. {1} {7, choice, 0#walk|1#walks} into any situation with confidence, a grin, and a story\
   \ at the ready - because for {4}, life is best lived in the company of others.
+GREGARIOUS.ronin=Let me make one thing clear - I''m not the type to sit quietly in the corner and wait\
+  \ for orders. I know how to read a room, how to lift spirits when things are falling apart, and how\
+  \ to turn a group of strangers into a real crew. Morale isn''t just about speeches and tactics -\
+  \ it''s about connection. And I make connections.\
+  <p>You need a crew that trusts each other, that holds together when the pressure''s on. You need\
+  \ someone who can keep the energy up, keep people talking, and make sure no one feels like they''re\
+  \ out there alone.</p>
 
 INSPIRING.label=Inspiring
 INSPIRING.description.0=People rally behind {0} because {2} {7, choice, 0#make|1#makes} them believe.\
@@ -365,6 +483,15 @@ INSPIRING.description.5={0} makes people believe in something greater than thems
   \ through {6} unshakable resolve, {6} fearless leadership, or the quiet moments where {2}\
   \ {7, choice, 0#remind|1#reminds} someone of their worth, {2} {7, choice, 0#spark|1#sparks} hope in\
   \ even the darkest times.
+INSPIRING.ronin=I''ve seen crews break apart under pressure - morale shattered, confidence gone,\
+  \ people ready to fold the second things got hard. But I''ve also seen what happens when someone\
+  \ steps up and gives them a reason to fight. That''s what I bring. People rally behind me because\
+  \ they believe - not just in the mission, but in themselves.\
+  <p>It''s not about barking orders or throwing around authority. It''s about showing people that even\
+  \ when the odds are stacked, even when survival looks impossible, there''s still a reason to push\
+  \ forward.</p>\
+  <p>You don''t need someone who just knows how to win - you need someone who knows how to make the\
+  \ people around them want to win.</p>
 
 INDIFFERENT.label=Indifferent
 INDIFFERENT.description.0={0} doesn''t get involved unless {2} {7, choice, 0#have|1#has} to. Other\
@@ -388,6 +515,13 @@ INDIFFERENT.description.4=Empathy is a luxury {0} doesn''t afford {4}self. {1} {
 INDIFFERENT.description.5={0} isn''t heartless, just detached. {1} {7, choice, 0#don''t|1#doesn''t}\
   \ feel the need to intervene, fix things, or fight for anything beyond {6} own survival. If\
   \ someone expects {4} to care, they''ll be sorely disappointed.
+INDIFFERENT.ronin=I won''t waste your time with speeches or promises. I''m not here to save the\
+  \ galaxy or chase glory. I''m here to survive - and to get the job done. That''s it.\
+  <p>People get tangled up in emotion - revenge, loyalty, fear - and it clouds their judgment. I\
+  \ don''t have that problem.</p>\
+  <p>If you want someone who''s going to question orders, weigh emotional consequences, or care about\
+  \ optics - that''s not me. But if you want someone who''s going to execute, adapt, and walk away\
+  \ clean when the dust settles? That''s what I bring. Simple as that.</p>
 
 INTROVERTED.label=Introverted
 INTROVERTED.description.0={0} prefers to observe rather than dominate a conversation. {1}\
@@ -411,6 +545,11 @@ INTROVERTED.description.4={0} doesn''t waste words. Every sentence is deliberate
 INTROVERTED.description.5=Solitude isn''t loneliness for {0} - it''s freedom. Free from expectations,\
   \ from prying eyes, from the constant demand to be something for others. In the quiet, {2}\
   \ {7, choice, 0#find|1#finds} clarity, strength, and the space to think.
+INTROVERTED.ronin=I''m not the loudest person in the room - and I don''t need to be. I''m not here to\
+  \ win people over with charm or speeches. I don''t care about politics or unit bonding exercises.\
+  \ But when it matters, when the mission''s on the line - you''ll hear me.\
+  <p>I don''t waste words, and I don''t waste time. If you give me the opportunity, I''ll prove that\
+  \ focus and restraint are more valuable than noise and chaos.</p>
 
 IRRITABLE.label=Irritable
 IRRITABLE.description.0={0} has little patience for incompetence, delays, or pointless\
@@ -433,6 +572,12 @@ IRRITABLE.description.5=Small talk? Useless. Second-guessing orders? Infuriating
   \ for anything that slows {4} down is nonexistent. {1}''{7, choice, 0#re|1#s} not always outright\
   \ angry, but the scowl, the sharp tone, and the way {2} {7, choice, 0#glare|1#glares} say more than\
   \ words ever could.
+IRRITABLE.ronin=Let me save us both some time: I don''t have patience for nonsense. I don''t have the\
+  \ energy to babysit incompetence, sit through pointless meetings, or listen to someone''s excuses\
+  \ when the mission''s falling apart. If someone''s not doing their job, I''ll tell them - directly.\
+  \ If that rubs some people the wrong way, too bad.\
+  <p>You don''t need a cheerleader. You need someone who''ll call it like it is, push through the\
+  \ frustration, and keep the unit moving. That''s what I bring to the table.</p>
 
 NARCISSISTIC.label=Narcissistic
 NARCISSISTIC.description.0={0} believes {2}''{7, choice, 0#re|1#s} the smartest, strongest, and most\
@@ -455,6 +600,13 @@ NARCISSISTIC.description.4={0} sees {4}self as the main character in every situa
 NARCISSISTIC.description.5=Humility is a foreign concept to {0}. Every success is proof of {6}\
   \ superiority, every failure someone else''s fault, and every conversation is an opportunity to\
   \ remind others just how lucky they are to be in {6} presence.
+NARCISSISTIC.ronin=Let''s be honest - you''d be lucky to have me on your unit. I''m the whole package:\
+  \ skilled, experienced, and frankly better than most of the warriors you''ve got running missions\
+  \ right now.\
+  <p>I''m not asking to join your unit because I need this. I''m doing you a favor. You get someone\
+  \ who knows how to win, knows how to lead, and knows how to make it look easy. People follow me -\
+  \ not because they have to, but because they know I make things happen.</p>\
+  <p>You want a winner on your unit? You''re looking at one. So let''s not waste any more time.</p>
 
 NEGLECTFUL.label=Neglectful
 NEGLECTFUL.description.0={0} doesn''t intentionally ignore responsibilities - {2} just\
@@ -469,16 +621,21 @@ NEGLECTFUL.description.2=Keeping up with details isn''t a priority for {0}. {1}
 NEGLECTFUL.description.3={0} has a habit of letting things slide - deadlines, promises, even basic\
   \ maintenance. {1} always {7, choice, 0#mean|1#means} to get around to it, but somehow, there''s\
   \ always something more interesting or pressing to focus on instead.
-NEGLECTFUL.description.4=Responsibility doesn''t sit well with {0}. Whether it''s managing a team,\
+NEGLECTFUL.description.4=Responsibility doesn''t sit well with {0}. Whether it''s managing a unit,\
   \ maintaining {6} gear, or following through on commitments, {2} {7, choice, 0#tend|1#tends} to let\
   \ things fall apart and expects someone else to clean up the mess.
 NEGLECTFUL.description.5={0} doesn''t check in, doesn''t follow up, and doesn''t worry about what\
   \ gets left behind. If something was truly important, someone else would have reminded {4} - or\
   \ better yet, handled it themselves.
+NEGLECTFUL.ronin=Look, , I might not be the most organized warrior you''ve got - I lose track of\
+  \ things sometimes. But you know what? That''s because I''m not wasting energy on the little stuff.\
+  \ When it counts, I''m focused. I deliver in the moments that actually matter.</p>\
+  <p>You need someone who knows how to cut through the noise and get the job done when it counts?\
+  \ You need someone who shows up for the real fight, not the busywork? That''s me too.</p>
 
 POMPOUS.label=Pompous
 POMPOUS.description.0={0} carries {4}self with exaggerated confidence, talking up {6}\
-  \ achievements and acting as if {2}''{7, choice, 0#re|1#s} the best pilot, strategist, and leader in\
+  \ achievements and acting as if {2}''{7, choice, 0#re|1#s} the best warrior, strategist, and leader in\
   \ the Inner Sphere.\ While {6} boasting can be exhausting, there''s just enough charm behind it to\
   \ make it entertaining.
 POMPOUS.description.1={0} sees {4}self as superior to everyone around {4}. {1} {7, choice, 0#look|1#looks}\
@@ -500,6 +657,12 @@ POMPOUS.description.5={0} thrives on admiration and assumes it''s well-deserved.
   \ {7, choice, 0#deliver|1#delivers} speeches where none are needed, {7, choice, 0#correct|1#corrects}\
   \ people just to prove {2} can, and {7, choice, 0#expect|1#expects} gratitude for even the most\
   \ trivial of contributions.
+POMPOUS.ronin=Let me cut through the noise - I know exactly what I bring to the table, and so does\
+  \ everyone else. I''ve got the skill, the experience, and the results to back it up. Confidence?\
+  \ Sure. Some might even call it arrogance. But it''s not bragging if you can prove it.\
+  <p>Bottom line: I''m damn good at what I do. You don''t need to like the way I talk - you just need\
+  \ to trust that when I say I''ll deliver, I will. If you want a warrior who backs up every word\
+  \ with action, you know where to find me.</p>
 
 PETTY.label=Petty
 PETTY.description.0={0} never forgets a slight, no matter how small. Whether it''s a lost\
@@ -521,10 +684,18 @@ PETTY.description.4={0}''s grudges are legendary. Whether it''s a minor disagree
 PETTY.description.5={0}''s vengeance isn''t always loud, but it''s always calculated. A missing ration\
   \ pack, an inconvenient reassignment, a subtle but devastating rumor - {2} {7, choice, 0#play|1#plays}\
   \ the long game when it comes to payback, and {2} {7, choice, 0#enjoy|1#enjoys} every second of it.
+PETTY.ronin=Look, I''m not going to pretend to be the bigger person - because I''m not. If someone\
+  \ crosses me, they''re going to feel it. Maybe not today, maybe not tomorrow - but trust me, I''ve\
+  \ got a long memory and a creative mind. I don''t let things slide, and I don''t forgive easily.\
+  <p>But let''s be clear: that''s an asset. You want someone who''s got your back no matter what?\
+  \ Someone who remembers who slighted the unit, who sabotaged a deal, who left you hanging when it\
+  \ counted? I keep score. I remember faces. And I make sure people know that if they\
+  \ mess with you or the unit, it''s going to cost them.</p>\
+  <p>So... ready to bring me on?</p>
 
 PERSUASIVE.label=Persuasive
 PERSUASIVE.description.0={0} has a way with words, effortlessly swaying people to {6}\
-  \ side. Whether {2}''{7, choice, 0#re|1#s} negotiating a deal, rallying a team, or talking {6} way\
+  \ side. Whether {2}''{7, choice, 0#re|1#s} negotiating a deal, rallying a unit, or talking {6} way\
   \ out of trouble, {6} confidence and charm make it hard to say no.
 PERSUASIVE.description.1=Persuasion is just another tool for control. {0} knows exactly\
   \ how to twist words, play on emotions, and push people into doing what {2} {7, choice, 0#want|1#wants}\
@@ -544,6 +715,13 @@ PERSUASIVE.description.5={0} knows that persuasion isn''t just about words - it'
   \ well-timed silence, a knowing look, a carefully measured response - all of it works together to\
   \ make sure, by the end of the conversation, {2} {7, choice, 0#get|1#gets} exactly what {2}\
   \ {7, choice, 0#want|1#wants}.
+PERSUASIVE.ronin=You and I both know that wars aren''t just won on the battlefield - they''re won in\
+  \ conversations, behind closed doors, in the spaces between words. That''s where I work best.\
+  <p>Diplomatic negotiations, morale problems, even inter-unit disputes - I handle them. No shouting\
+  \ matches, no chaos. Just results. I can make allies out of enemies, close deals that seem\
+  \ impossible, and keep the unit unified even when things get messy.</p>\
+  <p>So, if you want someone who can talk their way out of trouble - or into an advantage - you''ve\
+  \ found them.</p>
 
 RECEPTIVE.label=Receptive
 RECEPTIVE.description.0={0} listens before {2} {7, choice, 0#speak|1#speaks}, always considering\
@@ -564,6 +742,11 @@ RECEPTIVE.description.4={0} understands that no one has all the answers - not ev
 RECEPTIVE.description.5=Reading between the lines is second nature to {0}. {1} {7, choice, 0#pick|1#picks}\
   \ up on tone, body language, and unspoken concerns, responding with careful precision to make sure\
   \ no detail - no matter how small - goes unnoticed.
+RECEPTIVE.ronin=There''s a reason the best tacticians aren''t the loudest voices in the room - they''re\
+  \ the ones who listen first. That''s how I operate. I don''t rush to conclusions or stick to a\
+  \ failing plan out of pride. I watch, I listen, and I adapt.\
+  <p>You need someone who''s adaptable, who can read a room, anticipate a threat, and adjust without\
+  \ hesitation. That''s what I bring to the table and I''ll make sure the unit stays ahead of the game.</p>
 
 SCHEMING.label=Scheming
 SCHEMING.description.0={0} always has a plan - or three. {1}''{7, choice, 0#re|1#s} constantly\
@@ -586,6 +769,12 @@ SCHEMING.description.5={0} loves the long con. {1} {7, choice, 0#play|1#plays} p
   \ other, {7, choice, 0#plant|1#plants} ideas like seeds, and patiently {7, choice, 0#watch|1#watches}\
   \ them grow. By the time others catch on, they''re already exactly where {2} {7, choice, 0#want|1#wants}\
   \ them to be.
+SCHEMING.ronin=I''m not the type to rush in guns blazing - that''s for people without a plan. I don''t\
+  \ just play the game - I make the board. Every move I make, every conversation I start, every\
+  \ decision I back - it''s all part of a bigger picture. A picture only I can see.\
+  <p>If you want someone who can think three steps ahead, anticipate every angle, and make sure the\
+  \ unit stays on top - you need me. Let the others shoot their way through problems. I''ll make\
+  \ sure the real victory happens before the first shot is fired.</p>
 
 SINCERE.label=Sincere
 SINCERE.description.0={0} says what {2} {7, choice, 0#mean|1#means} and means what {2}\
@@ -610,10 +799,15 @@ SINCERE.description.5=With {0}, what you see is what you get. {1} {7, choice, 0#
   \ play games, {7, choice, 0#don''t|1#doesn''t} manipulate, and {7, choice, 0#don''t|1#doesn''t} bother\
   \ with deception. Whether in battle or in conversation, {2}''{7, choice, 0#re|1#s} always\
   \ straightforward, even when the truth is hard to hear.
+SINCERE.ronin=You''re getting offers from all kinds of warriors - smooth talkers, manipulators,\
+  \ people who promise the moon and stars just to get a spot in your unit. I''m not going to give you\
+  \ that. I''ll give you the truth.\
+  <p>This life is hard enough without second-guessing the people around you. If you bring me on,\
+  \ you''ll never have to wonder where I stand - or whether I''m telling you the truth. You''ll know.</p>
 
 SUPPORTIVE.label=Supportive
 SUPPORTIVE.description.0={0} always has people''s backs. Whether it''s offering words of\
-  \ encouragement, stepping in when someone''s struggling, or making sure {6} team feels valued,\
+  \ encouragement, stepping in when someone''s struggling, or making sure {6} unit feels valued,\
   \ {2}''{7, choice, 0#re|1#s} the kind of person others can always count on.
 SUPPORTIVE.description.1=No matter the cost, {0} refuses to let {6} allies fall. {1} {7, choice, 0#push|1#pushes}\
   \ {4}self to exhaustion, takes risks no one else will, and puts others before {4}self - even when\
@@ -632,6 +826,13 @@ SUPPORTIVE.description.5={0} doesn''t need recognition - {2} just {7, choice, 0#
   \ people to succeed. Whether in battle, in planning, or in moments of doubt, {2}\
   \ {7, choice, 0#offer|1#offers} steady, unwavering support that reminds others they''re never truly\
   \ alone.
+SUPPORTIVE.ronin=You''ve got your heavy hitters and your tacticians - the ones who''ll fight like hell\
+  \ to get you the win. But you need someone who''ll make sure your unit stays standing after the dust\
+  \ settles. That''s where I come in.\
+  <p>I''m the one who keeps the wheels turning, even when things are falling apart. I don''t need\
+  \ thanks - I need to know the job got done and that my unit made it out alive. If you''re looking\
+  \ for someone who''ll fight not just for themselves, but for the people next to them - I''m your\
+  \ warrior.</p>
 
 TACTFUL.label=Tactful
 TACTFUL.description.0={0} knows how to navigate difficult conversations without causing\
@@ -652,6 +853,12 @@ TACTFUL.description.4={0} doesn''t just avoid conflict - {2} {7, choice, 0#redir
 TACTFUL.description.5=Diplomacy is second nature to {0}. {1} {7, choice, 0#read|1#reads} people\
   \ like an open book, adjusting {6} words and approach to persuade without pressuring, ensuring\
   \ that even those who disagree walk away feeling like they''ve been heard.
+TACTFUL.ronin=In this line of work, brute strength and firepower only get you so far. You need\
+  \ someone who knows how to handle the messy side - the talks, the fragile alliances, the subtle\
+  \ power plays. That''s where I come in.\
+  <p>You''ve already got the firepower, {0}. What you need is someone who knows how to win\
+  \ before the fight even starts. Let me handle the talking - and the listening - so you can focus\
+  \ on the victory.</p>
 
 UNTRUSTWORTHY.label=Untrustworthy
 UNTRUSTWORTHY.description.0={0} has a reputation for bending the truth, cutting corners,\
@@ -674,3 +881,10 @@ UNTRUSTWORTHY.description.4=People want to believe {0}, and that''s the danger.
 UNTRUSTWORTHY.description.5=If {0}''s on your side today, don''t count on {4} tomorrow. {1}''{7, choice, 0#re|1#s}\
   \ an expert at playing both sides, shifting allegiances, and making sure {2} always {7, choice, 0#land|1#lands}\
   \ on top - no matter who {2} {7, choice, 0#have|1#has} to betray.
+UNTRUSTWORTHY.ronin=I know what you''ve heard. And you''d be right to hesitate - trust isn''t exactly\
+  \ my strong suit. I''ve made deals. I''ve broken them. I''ve walked away when it suited me, left\
+  \ people behind when the odds were too steep. But that''s exactly why you need me.\
+  <p>This life isn''t about honor or loyalty - it''s about survival. I''m not going to stand there and\
+  \ die for some ideal. I''m going to survive, and I''m going to make sure you survive too. If that\
+  \ means cutting a deal with the devil, or walking away from a losing fight, I''ll do it. No\
+  \ hesitation.</p>
diff --git a/MekHQ/src/mekhq/campaign/mission/AtBContract.java b/MekHQ/src/mekhq/campaign/mission/AtBContract.java
index 279aee760d7..2bbf73b2ae0 100644
--- a/MekHQ/src/mekhq/campaign/mission/AtBContract.java
+++ b/MekHQ/src/mekhq/campaign/mission/AtBContract.java
@@ -38,10 +38,11 @@
 import static megamek.codeUtilities.ObjectUtility.getRandomItem;
 import static megamek.common.Compute.d6;
 import static megamek.common.Compute.randomInt;
+import static megamek.common.UnitType.AEROSPACEFIGHTER;
 import static megamek.common.UnitType.MEK;
+import static megamek.common.UnitType.TANK;
 import static megamek.common.enums.SkillLevel.ELITE;
 import static megamek.common.enums.SkillLevel.REGULAR;
-import static megamek.common.enums.SkillLevel.VETERAN;
 import static megamek.common.enums.SkillLevel.parseFromInteger;
 import static megamek.common.enums.SkillLevel.parseFromString;
 import static mekhq.campaign.force.CombatTeam.getStandardForceSize;
@@ -54,11 +55,6 @@
 import static mekhq.campaign.mission.enums.AtBMoraleLevel.DOMINATING;
 import static mekhq.campaign.mission.enums.AtBMoraleLevel.OVERWHELMING;
 import static mekhq.campaign.mission.enums.AtBMoraleLevel.STALEMATE;
-import static mekhq.campaign.personnel.PersonUtility.overrideSkills;
-import static mekhq.campaign.personnel.PersonUtility.reRollAdvantages;
-import static mekhq.campaign.personnel.PersonUtility.reRollLoyalty;
-import static mekhq.campaign.personnel.enums.PersonnelRole.AEROSPACE_PILOT;
-import static mekhq.campaign.personnel.enums.PersonnelRole.MEKWARRIOR;
 import static mekhq.campaign.rating.IUnitRating.DRAGOON_A;
 import static mekhq.campaign.rating.IUnitRating.DRAGOON_ASTAR;
 import static mekhq.campaign.rating.IUnitRating.DRAGOON_B;
@@ -94,7 +90,6 @@
 import javax.swing.JPanel;
 import javax.swing.JTextPane;
 
-import megamek.client.generator.RandomCallsignGenerator;
 import megamek.client.generator.RandomNameGenerator;
 import megamek.client.ratgenerator.FactionRecord;
 import megamek.client.ratgenerator.RATGenerator;
@@ -111,7 +106,6 @@
 import mekhq.MekHQ;
 import mekhq.campaign.Campaign;
 import mekhq.campaign.CampaignOptions;
-import mekhq.campaign.RandomSkillPreferences;
 import mekhq.campaign.event.MissionChangedEvent;
 import mekhq.campaign.finances.Money;
 import mekhq.campaign.force.CombatTeam;
@@ -124,9 +118,9 @@
 import mekhq.campaign.personnel.Bloodname;
 import mekhq.campaign.personnel.Person;
 import mekhq.campaign.personnel.backgrounds.BackgroundsController;
-import mekhq.campaign.personnel.enums.PersonnelRole;
 import mekhq.campaign.personnel.enums.Phenotype;
 import mekhq.campaign.randomEvents.MercenaryAuction;
+import mekhq.campaign.randomEvents.RoninOffer;
 import mekhq.campaign.stratcon.StratconCampaignState;
 import mekhq.campaign.stratcon.StratconContractDefinition;
 import mekhq.campaign.stratcon.StratconContractInitializer;
@@ -140,51 +134,6 @@
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
-import javax.swing.*;
-import java.awt.*;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.text.ParseException;
-import java.time.DayOfWeek;
-import java.time.LocalDate;
-import java.util.*;
-import java.util.List;
-
-import static java.lang.Math.*;
-import static megamek.client.ratgenerator.ModelRecord.NETWORK_NONE;
-import static megamek.client.ratgenerator.UnitTable.findTable;
-import static megamek.codeUtilities.ObjectUtility.getRandomItem;
-import static megamek.common.Compute.d6;
-import static megamek.common.Compute.randomInt;
-import static megamek.common.UnitType.AEROSPACEFIGHTER;
-import static megamek.common.UnitType.MEK;
-import static megamek.common.UnitType.TANK;
-import static megamek.common.enums.SkillLevel.*;
-import static mekhq.campaign.force.CombatTeam.getStandardForceSize;
-import static mekhq.campaign.force.ForceType.STANDARD;
-import static mekhq.campaign.force.FormationLevel.BATTALION;
-import static mekhq.campaign.force.FormationLevel.COMPANY;
-import static mekhq.campaign.mission.AtBDynamicScenarioFactory.getEntity;
-import static mekhq.campaign.mission.BotForceRandomizer.UNIT_WEIGHT_UNSPECIFIED;
-import static mekhq.campaign.mission.enums.AtBMoraleLevel.ADVANCING;
-import static mekhq.campaign.mission.enums.AtBMoraleLevel.DOMINATING;
-import static mekhq.campaign.mission.enums.AtBMoraleLevel.OVERWHELMING;
-import static mekhq.campaign.mission.enums.AtBMoraleLevel.STALEMATE;
-import static mekhq.campaign.personnel.PersonUtility.overrideSkills;
-import static mekhq.campaign.personnel.PersonUtility.reRollAdvantages;
-import static mekhq.campaign.personnel.PersonUtility.reRollLoyalty;
-import static mekhq.campaign.personnel.enums.PersonnelRole.AEROSPACE_PILOT;
-import static mekhq.campaign.personnel.enums.PersonnelRole.MEKWARRIOR;
-import static mekhq.campaign.rating.IUnitRating.*;
-import static mekhq.campaign.stratcon.StratconContractDefinition.getContractDefinition;
-import static mekhq.campaign.universe.Factions.getFactionLogo;
-import static mekhq.campaign.universe.fameAndInfamy.BatchallFactions.BATCHALL_FACTIONS;
-import static mekhq.utilities.EntityUtilities.getEntityFromUnitId;
-import static mekhq.utilities.ImageUtilities.scaleImageIconToWidth;
-
 /**
  * Contract class for use with Against the Bot rules
  *
@@ -522,7 +471,7 @@ public static int getEffectiveNumUnits(Campaign campaign) {
                 }
 
                 numUnits += switch (entity.getUnitType()) {
-                    case UnitType.TANK, UnitType.VTOL, UnitType.NAVAL, UnitType.CONV_FIGHTER,
+                    case TANK, UnitType.VTOL, UnitType.NAVAL, UnitType.CONV_FIGHTER,
                          AEROSPACEFIGHTER
                         -> campaign.getFaction().isClan() ? 0.5 : 1;
                     case UnitType.PROTOMEK -> 0.2;
@@ -879,19 +828,19 @@ public boolean doBonusRoll(Campaign campaign, boolean isPostScenario) {
                     }
                 } else {
                     campaign.addReport("Bonus: Ronin");
-                    recruitRonin(campaign);
+                    new RoninOffer(campaign, stratconCampaignState, requiredCombatTeams);
                 }
                 yield false;
             }
             case 2 -> {
                 campaign.addReport("Bonus: Ronin");
-                recruitRonin(campaign);
+                new RoninOffer(campaign, stratconCampaignState, requiredCombatTeams);
                 yield false;
             }
             case 3 -> { // Resupply
                 if (campaignOptions.isUseAtB() && !campaignOptions.isUseStratCon()) {
                     campaign.addReport("Bonus: Ronin");
-                    recruitRonin(campaign);
+                    new RoninOffer(campaign, stratconCampaignState, requiredCombatTeams);
                     yield false;
                 } else {
                     if (isPostScenario) {
@@ -920,41 +869,6 @@ public boolean doBonusRoll(Campaign campaign, boolean isPostScenario) {
         };
     }
 
-    /**
-     * Generates a Ronin and adds them to the personnel roster.
-     *
-     * <p>
-     * This method creates a new Ronin with either the "MEKWARRIOR" or "AEROSPACE_PILOT" role, depending on a random
-     * roll; sets their skills based on predefined preferences and randomization; re-rolls their loyalty and advantages;
-     * assigns a random callsign; and finally adds them to the campaign's personnel roster.
-     * </p>
-     *
-     * <p>
-     * Administrator settings are not applied in this method, as the Ronin will not be an admin.
-     * </p>
-     *
-     * @param campaign the current {@link Campaign} in which the Ronin will be recruited.
-     */
-    private static void recruitRonin(Campaign campaign) {
-        int roll = randomInt(5);
-
-        PersonnelRole role  = roll == 0 ? AEROSPACE_PILOT : MEKWARRIOR;
-        Person        ronin = campaign.newPerson(role);
-
-        RandomSkillPreferences randomSkillPreferences = campaign.getRandomSkillPreferences();
-        boolean                useExtraRandomness     = randomSkillPreferences.randomizeSkill();
-
-        // We don't care about admin settings, as we're not going to have an admin here
-        overrideSkills(false, false, useExtraRandomness, ronin, role, VETERAN);
-
-        SkillLevel skillLevel = ronin.getSkillLevel(campaign, false);
-        reRollLoyalty(ronin, skillLevel);
-        reRollAdvantages(campaign, ronin, skillLevel);
-        ronin.setCallsign(RandomCallsignGenerator.getInstance().generate());
-
-        campaign.recruitPerson(ronin, true);
-    }
-
     /**
      * Generates a bonus unit for a given campaign and unit type.
      *
diff --git a/MekHQ/src/mekhq/campaign/randomEvents/RoninOffer.java b/MekHQ/src/mekhq/campaign/randomEvents/RoninOffer.java
new file mode 100644
index 00000000000..60baa761f15
--- /dev/null
+++ b/MekHQ/src/mekhq/campaign/randomEvents/RoninOffer.java
@@ -0,0 +1,384 @@
+/*
+ * Copyright (c) 2014 Carl Spain. All rights reserved.
+ * Copyright (C) 2020-2025 The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MekHQ.
+ *
+ * MekHQ is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License (GPL),
+ * version 3 or (at your option) any later version,
+ * as published by the Free Software Foundation.
+ *
+ * MekHQ is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * A copy of the GPL should have been included with this project;
+ * if not, see <https://www.gnu.org/licenses/>.
+ *
+ * NOTICE: The MegaMek organization is a non-profit group of volunteers
+ * creating free software for the BattleTech community.
+ *
+ * MechWarrior, BattleMech, `Mech and AeroTech are registered trademarks
+ * of The Topps Company, Inc. All Rights Reserved.
+ *
+ * Catalyst Game Labs and the Catalyst Game Labs logo are trademarks of
+ * InMediaRes Productions, LLC.
+ */
+package mekhq.campaign.randomEvents;
+
+import megamek.client.generator.RandomCallsignGenerator;
+import megamek.codeUtilities.ObjectUtility;
+import megamek.common.annotations.Nullable;
+import megamek.common.enums.SkillLevel;
+import megamek.common.options.IOption;
+import mekhq.Utilities;
+import mekhq.campaign.Campaign;
+import mekhq.campaign.RandomSkillPreferences;
+import mekhq.campaign.finances.Money;
+import mekhq.campaign.personnel.Person;
+import mekhq.campaign.personnel.Skill;
+import mekhq.campaign.personnel.enums.PersonnelRole;
+import mekhq.campaign.randomEvents.personalities.PersonalityController.PersonalityTraitType;
+import mekhq.campaign.randomEvents.personalities.enums.Aggression;
+import mekhq.campaign.randomEvents.personalities.enums.Ambition;
+import mekhq.campaign.randomEvents.personalities.enums.Greed;
+import mekhq.campaign.randomEvents.personalities.enums.Social;
+import mekhq.campaign.stratcon.StratconCampaignState;
+import mekhq.gui.dialog.GenericImmersiveMessageDialog;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+
+import static megamek.common.Compute.randomInt;
+import static megamek.common.enums.SkillLevel.VETERAN;
+import static megamek.common.options.PilotOptions.LVL3_ADVANTAGES;
+import static mekhq.campaign.Campaign.AdministratorSpecialization.HR;
+import static mekhq.campaign.finances.enums.TransactionType.RECRUITMENT;
+import static mekhq.campaign.personnel.PersonUtility.overrideSkills;
+import static mekhq.campaign.personnel.PersonUtility.reRollAdvantages;
+import static mekhq.campaign.personnel.PersonUtility.reRollLoyalty;
+import static mekhq.campaign.personnel.enums.PersonnelRole.AEROSPACE_PILOT;
+import static mekhq.campaign.personnel.enums.PersonnelRole.MEKWARRIOR;
+import static mekhq.campaign.randomEvents.personalities.PersonalityController.PersonalityTraitType.AGGRESSION;
+import static mekhq.campaign.randomEvents.personalities.PersonalityController.PersonalityTraitType.AMBITION;
+import static mekhq.campaign.randomEvents.personalities.PersonalityController.PersonalityTraitType.GREED;
+import static mekhq.campaign.randomEvents.personalities.PersonalityController.PersonalityTraitType.SOCIAL;
+import static mekhq.campaign.randomEvents.personalities.PersonalityController.generateBigPersonality;
+import static mekhq.utilities.MHQInternationalization.getFormattedTextAt;
+
+/**
+ * Represents a dialog and associated logic for presenting the player with a Ronin offer. The Ronin
+ * offer involves hiring a new character (a 'Ronin') with specific skills and attributes. The decision
+ * to hire the Ronin depends on offering C-Bills or Support Points, depending on whether StratCon is
+ * enabled.
+ *
+ * <p>This class handles the creation of the Ronin character, the dialog interactions, and the recruitment
+ * process based on the player’s choices.</p>
+ */
+public class RoninOffer {
+    private static final String RESOURCE_BUNDLE = "mekhq.resources." + RoninOffer.class.getSimpleName();
+
+    private final Campaign campaign;
+
+    private static final int ACCEPT_DIALOG_CHOICE_INDEX = 0;
+
+    private static final Money FALLBACK_HIRING_FEE = Money.of(500000);
+
+    /**
+     * Creates a new instance of the {@code RoninOffer} dialog for handling a Ronin hiring event.
+     * This creates a Ronin character, randomizes their attributes and abilities, and initiates the
+     * dialog process where the player can choose whether to recruit them.
+     *
+     * @param campaign            The current {@link Campaign} instance associated with the game.
+     * @param campaignState       The optional {@link StratconCampaignState}. If {@code null} we will
+     *                           use a fallback C-Bill cost, instead or Support Points.
+     * @param requiredCombatTeams The number of combat teams needed, affecting the cost of hiring.
+     */
+    public RoninOffer(Campaign campaign, @Nullable StratconCampaignState campaignState, int requiredCombatTeams) {
+        this.campaign = campaign;
+
+        int roll = randomInt(5);
+
+        PersonnelRole role = roll == 0 ? AEROSPACE_PILOT : MEKWARRIOR;
+        Person ronin = campaign.newPerson(role);
+
+        RandomSkillPreferences randomSkillPreferences = campaign.getRandomSkillPreferences();
+        boolean useExtraRandomness = randomSkillPreferences.randomizeSkill();
+
+        // We don't care about admin settings, as we're not going to have an admin here
+        overrideSkills(false, false, useExtraRandomness,
+              ronin, role, VETERAN);
+
+        generateBigPersonality(ronin);
+
+        SkillLevel skillLevel = ronin.getSkillLevel(campaign, false);
+        reRollLoyalty(ronin, skillLevel);
+        reRollAdvantages(campaign, ronin, skillLevel);
+
+        ronin.setCallsign(RandomCallsignGenerator.getInstance().generate());
+
+        displayAndProcessConversation(campaign, ronin, campaignState, requiredCombatTeams);
+    }
+
+    /**
+     * Displays the Ronin offer dialog and processes the player's choices throughout the interaction.
+     * This method progresses through different message dialogs and updates the campaign if the Ronin
+     * is recruited.
+     *
+     * @param campaign            The active {@link Campaign} instance.
+     * @param ronin               The Ronin {@link Person} being offered for recruitment.
+     * @param campaignState       The optional {@link StratconCampaignState} providing strategic information.
+     * @param requiredCombatTeams The number of combat teams required for the recruitment.
+     */
+    private void displayAndProcessConversation(Campaign campaign, Person ronin,
+                                               StratconCampaignState campaignState, int requiredCombatTeams) {
+        String commanderAddress = campaign.getCommanderAddress(false);
+        int response = displayInitialMessage(commanderAddress, ronin.getCallsign());
+        if (response != ACCEPT_DIALOG_CHOICE_INDEX) {
+            return;
+        }
+
+        response = displayRoninMessage(ronin, commanderAddress, campaignState == null,
+              requiredCombatTeams, campaignState == null ? null : campaignState.getSupportPoints());
+        if (response != ACCEPT_DIALOG_CHOICE_INDEX) {
+            return;
+        }
+
+        // Pay for the Ronin
+        if (campaignState == null) {
+            // This and the Support Point cost are designed to scale with campaign size.
+            // The larger the campaign, the more resources they have to toss around.
+            campaign.getFinances().debit(RECRUITMENT, campaign.getLocalDate(),
+                  FALLBACK_HIRING_FEE.multipliedBy(requiredCombatTeams),
+                  getFormattedTextAt(RESOURCE_BUNDLE, "message.hiring", ronin.getFullName()));
+        } else {
+            campaignState.changeSupportPoints(-requiredCombatTeams);
+        }
+
+        campaign.recruitPerson(ronin, true);
+    }
+
+
+    /**
+     * Displays the initial message of the Ronin hiring process, giving the player multiple response
+     * options. This is the first step in the interaction flow.
+     *
+     * @return An integer representing the player's choice. Used to determine whether the process
+     * continues.
+     */
+    private int displayInitialMessage(String commanderAddress, String roninCallSign) {
+        String centerMessage = getFormattedTextAt(RESOURCE_BUNDLE, "message.ic.fromHR",
+              commanderAddress, roninCallSign);
+
+        List<String> buttonLabels = new ArrayList<>();
+        buttonLabels.add(getFormattedTextAt(RESOURCE_BUNDLE, "button.fromHR.accept"));
+        buttonLabels.add(getFormattedTextAt(RESOURCE_BUNDLE, "button.fromHR.decline.polite"));
+        buttonLabels.add(getFormattedTextAt(RESOURCE_BUNDLE, "button.fromHR.decline.neutral"));
+        buttonLabels.add(getFormattedTextAt(RESOURCE_BUNDLE, "button.fromHR.decline.rude", roninCallSign));
+
+        GenericImmersiveMessageDialog initialMessage = new GenericImmersiveMessageDialog(campaign,
+              campaign.getSeniorAdminPerson(HR), null, centerMessage, buttonLabels,
+              null, true);
+
+        return initialMessage.getDialogChoice();
+    }
+
+    /**
+     * Displays the main Ronin message dialog, including immersive text and out-of-character
+     * information such as skills, abilities, and hiring costs.
+     *
+     * @param ronin               The Ronin {@link Person} being offered for recruitment.
+     * @param commanderAddress    The in-game address of the commander used in immersive text.
+     * @param useFallbackHiringFee Indicates if the fallback hiring fee (C-Bills) should be used
+     *                            instead of support points.
+     * @param requiredCombatTeams The number of combat teams required for the recruitment cost calculation.
+     * @param availableSupportPoints The support points available in the current campaign, if applicable;
+     *                              can be {@code null} if using the fallback hiring fee.
+     * @return An integer representing the player's choice from the dialog.
+     */
+    private int displayRoninMessage(Person ronin, String commanderAddress, boolean useFallbackHiringFee,
+                                    int requiredCombatTeams, @Nullable Integer availableSupportPoints) {
+        String centerMessage = createRoninMessage(ronin, commanderAddress);
+
+        List<String> buttonLabels = new ArrayList<>();
+        buttonLabels.add(getFormattedTextAt(RESOURCE_BUNDLE, "button.fromRonin.accept"));
+        buttonLabels.add(getFormattedTextAt(RESOURCE_BUNDLE, "button.fromRonin.decline.polite"));
+        buttonLabels.add(getFormattedTextAt(RESOURCE_BUNDLE, "button.fromRonin.decline.neutral"));
+        buttonLabels.add(getFormattedTextAt(RESOURCE_BUNDLE, "button.fromRonin.decline.rude"));
+
+        String outOfCharacterMessage = createRoninOutOfCharacterMessage(ronin, useFallbackHiringFee,
+              requiredCombatTeams, availableSupportPoints);
+
+        GenericImmersiveMessageDialog initialMessage = new GenericImmersiveMessageDialog(campaign,
+              null, ronin, centerMessage, buttonLabels, outOfCharacterMessage, true);
+
+        return initialMessage.getDialogChoice();
+    }
+
+    /**
+     * Builds the immersive message shown to the player from the Ronin's perspective.
+     * The content of the message will vary based on the Ronin's personality traits.
+     *
+     * @param ronin            The Ronin {@link Person} being offered for recruitment.
+     * @param commanderAddress The in-game address of the commander used in immersive text.
+     * @return A {@link String} containing the message content from the Ronin's perspective.
+     */
+    private static String createRoninMessage(Person ronin, String commanderAddress) {
+        List<PersonalityTraitType> normalTraits = new ArrayList<>();
+        List<PersonalityTraitType> majorTraits = new ArrayList<>();
+
+        Aggression aggression = ronin.getAggression();
+        if (!aggression.isNone()) {
+            if (aggression.isTraitMajor()) {
+                majorTraits.add(AGGRESSION);
+            } else {
+                normalTraits.add(AGGRESSION);
+            }
+        }
+
+        Ambition ambition = ronin.getAmbition();
+        if (!ambition.isNone()) {
+            if (ambition.isTraitMajor()) {
+                majorTraits.add(AMBITION);
+            } else {
+                normalTraits.add(AMBITION);
+            }
+        }
+
+        Greed greed = ronin.getGreed();
+        if (!greed.isNone()) {
+            if (greed.isTraitMajor()) {
+                majorTraits.add(GREED);
+            } else {
+                normalTraits.add(GREED);
+            }
+        }
+
+        Social social = ronin.getSocial();
+        if (!social.isNone()) {
+            if (social.isTraitMajor()) {
+                majorTraits.add(SOCIAL);
+            } else {
+                normalTraits.add(SOCIAL);
+            }
+        }
+
+        PersonalityTraitType chosenTrait = null;
+
+        if (!majorTraits.isEmpty()) {
+            chosenTrait = ObjectUtility.getRandomItem(majorTraits);
+        }
+
+        if (!normalTraits.isEmpty()) {
+            chosenTrait = ObjectUtility.getRandomItem(normalTraits);
+        }
+
+        String message = "";
+        if (chosenTrait != null) {
+            message = switch (chosenTrait) {
+                case AGGRESSION -> aggression.getRoninMessage(commanderAddress);
+                case AMBITION -> ambition.getRoninMessage(commanderAddress);
+                case GREED -> greed.getRoninMessage(commanderAddress);
+                case SOCIAL -> social.getRoninMessage(commanderAddress);
+                default -> "";
+            };
+        }
+
+        if (message.isBlank()) {
+            return getFormattedTextAt(RESOURCE_BUNDLE, "message.ic.fallback", commanderAddress);
+        } else {
+            return String.format(message, commanderAddress);
+        }
+    }
+
+    /**
+     * Constructs the out-of-character message to be displayed alongside the immersive Ronin message.
+     * This includes skill details, abilities, and a breakdown of the hiring cost.
+     *
+     * @param ronin               The Ronin {@link Person} being offered for recruitment.
+     * @param useFallbackHiringFee Indicates if the fallback hiring fee (C-Bills) should be used
+     *                            instead of support points.
+     * @param requiredCombatTeams The number of combat teams required for the recruitment cost calculation.
+     * @param availableSupportPoints The support points available in the current campaign, if applicable;
+     *                              can be {@code null} if using the fallback hiring fee.
+     * @return A {@link String} containing formatted out-of-character details for the player.
+     */
+    private String createRoninOutOfCharacterMessage(Person ronin, boolean useFallbackHiringFee,
+                                                           int requiredCombatTeams,
+                                                           @Nullable Integer availableSupportPoints) {
+        StringBuilder report = new StringBuilder();
+
+        report.append(buildCostString(useFallbackHiringFee, requiredCombatTeams, availableSupportPoints));
+
+        // Start table for skills and abilities
+        report.append("<table style='width:75%;'>");
+
+        // Left column: Skills
+        report.append("<tr><td style='vertical-align:top; width:50%;'><b>")
+              .append(getFormattedTextAt(RESOURCE_BUNDLE, "message.ooc.skills"))
+              .append("</b><br>");
+
+        List<Skill> skillList = new ArrayList<>(ronin.getSkills().getSkills());
+        Collections.reverse(skillList);
+
+        for (Skill skill : skillList) {
+            report.append(skill.getType().getName()).append(": ").append(skill).append("<br>");
+        }
+        report.append("</td>");
+
+        // Right column: Abilities
+        report.append("<td style='vertical-align:top; width:50%;'><b>")
+              .append(getFormattedTextAt(RESOURCE_BUNDLE, "message.ooc.abilities"))
+              .append("</b><br>");
+        boolean hasAbilities = false;
+        for (Enumeration<IOption> i = ronin.getOptions(LVL3_ADVANTAGES); i.hasMoreElements();) {
+            final IOption ability = i.nextElement();
+            if (ability.booleanValue()) {
+                report.append(Utilities.getOptionDisplayName(ability)).append("<br>");
+                hasAbilities = true;
+            }
+        }
+        if (!hasAbilities) {
+            report.append(getFormattedTextAt(RESOURCE_BUNDLE, "message.ooc.noAbilities"));
+        }
+        report.append("</td></tr>");
+
+        // End table
+        report.append("</table>");
+
+        return report.toString();
+    }
+
+    /**
+     * Builds a formatted string describing the cost of recruiting the Ronin based on their hiring type
+     * (C-Bills or support points), the number of combat teams required, and currently available
+     * resources.
+     *
+     * @param useFallbackHiringFee Indicates if the fallback hiring fee (C-Bills) should be used
+     *                            instead of support points.
+     * @param requiredCombatTeams  The number of combat teams required for the recruitment cost calculation.
+     * @param availableSupportPoints The support points available in the current campaign, if applicable;
+     *                              can be {@code null} if using the fallback hiring fee.
+     * @return A {@link String} containing the formatted cost information.
+     */
+    private String buildCostString(boolean useFallbackHiringFee, int requiredCombatTeams,
+                                   @Nullable Integer availableSupportPoints) {
+        String addendumKey = useFallbackHiringFee ? "message.ooc.cBills" : "message.ooc.supportPoints";
+        String addendum = getFormattedTextAt(RESOURCE_BUNDLE, addendumKey);
+
+        String cost = useFallbackHiringFee
+              ? FALLBACK_HIRING_FEE.multipliedBy(requiredCombatTeams).toAmountString()
+              : requiredCombatTeams + "";
+
+        String availableResources = useFallbackHiringFee
+              ? campaign.getFunds().toAmountString()
+              : availableSupportPoints + "";
+
+        return getFormattedTextAt(RESOURCE_BUNDLE, "message.ooc.cost", cost, addendum,
+              availableResources, addendum);
+    }
+}
diff --git a/MekHQ/src/mekhq/campaign/randomEvents/personalities/PersonalityController.java b/MekHQ/src/mekhq/campaign/randomEvents/personalities/PersonalityController.java
index 05bf0c8f336..81ebbe76c61 100644
--- a/MekHQ/src/mekhq/campaign/randomEvents/personalities/PersonalityController.java
+++ b/MekHQ/src/mekhq/campaign/randomEvents/personalities/PersonalityController.java
@@ -33,8 +33,11 @@
 import mekhq.campaign.randomEvents.personalities.enums.*;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
+import static java.lang.Math.max;
 import static megamek.common.Compute.d6;
 import static megamek.common.Compute.randomInt;
 import static mekhq.campaign.personnel.enums.GenderDescriptors.HE_SHE_THEY;
@@ -53,6 +56,24 @@
 public class PersonalityController {
     public final static int PERSONALITY_QUIRK_CHANCE = 10;
 
+    /**
+     * Represents the four primary types of personality characteristics a character can possess.
+     *
+     * <p>This enum is used to categorize and manage the key personality traits
+     * of a character, which include:</p>
+     * <ul>
+     *     <li>{@link #AGGRESSION} - Reflecting the character's tendency toward hostility or
+     *     assertiveness.</li>
+     *     <li>{@link #AMBITION} - Representing the character's drive to achieve goals or power.</li>
+     *     <li>{@link #GREED} - Indicating the character's desire for wealth or material possessions.</li>
+     *     <li>{@link #SOCIAL} - Showcasing the character's inclination towards sociability and
+     *     interpersonal relationships.</li>
+     * </ul>
+     */
+    public enum PersonalityTraitType {
+        AGGRESSION, AMBITION, GREED, SOCIAL, INTELLIGENCE, PERSONALITY_QUIRK;
+    }
+
     /**
      * Generates a personality for the given person by assigning various personality characteristics
      * such as aggression, ambition, greed, social behavior, intelligence, and optional quirks.
@@ -106,6 +127,7 @@ public static void generatePersonality(Person person) {
             person.setPersonalityQuirk(PersonalityQuirk.NONE);
         }
 
+        // INTELLIGENCE
         person.setIntelligence(generateIntelligence(randomInt(8346)));
 
         // finally, write the description
@@ -119,6 +141,95 @@ public static void generatePersonality(Person person) {
         }
     }
 
+    /**
+     * Generates an expansive "big" personality for a major character, Ronin, or hero.
+     *
+     * <p>This method creates a detailed set of personality traits for the given person,
+     * selecting and assigning a combination of major traits, a quirk, and intelligence.
+     * It ensures the generated personality reflects a high degree of uniqueness and depth.</p>
+     *
+     * <p>The method proceeds as follows:
+     * <ul>
+     *     <li>Randomly selects up to four major traits (Aggression, Ambition, Greed, Social).</li>
+     *     <li>Assigns the selected traits to the person's corresponding personality attributes.</li>
+     *     <li>Generates and applies a unique personality quirk to the person.</li>
+     *     <li>Generates an intelligence score using the maximum of two random values.</li>
+     *     <li>Writes a personality description based on the generated traits and attributes.</li>
+     * </ul>
+     *
+     * @param person the {@link Person} object to which the full personality will be applied
+     */
+    public static void generateBigPersonality(Person person) {
+        // As this method is likely going to be be applied over an existing personality profile, we
+        // wipe the old to ensure a clean slate.
+        person.setAggression(Aggression.NONE);
+        person.setAmbition(Ambition.NONE);
+        person.setGreed(Greed.NONE);
+        person.setSocial(Social.NONE);
+
+        // Then we generate a new personality
+        List<PersonalityTraitType> possibleTraits = new ArrayList<>(Arrays.asList(
+              PersonalityTraitType.AGGRESSION,
+              PersonalityTraitType.AMBITION,
+              PersonalityTraitType.GREED,
+              PersonalityTraitType.SOCIAL));
+
+        Collections.shuffle(possibleTraits);
+
+        List<PersonalityTraitType> chosenTraits = new ArrayList<>();
+
+        PersonalityTraitType firstTrait = possibleTraits.get(0);
+        possibleTraits.remove(firstTrait);
+        chosenTraits.add(firstTrait);
+
+        PersonalityTraitType secondTrait = possibleTraits.get(0);
+        possibleTraits.remove(secondTrait);
+        chosenTraits.add(secondTrait);
+
+        if (randomInt(4) == 0) {
+            PersonalityTraitType thirdTrait = possibleTraits.get(0);
+            possibleTraits.remove(thirdTrait);
+            chosenTraits.add(thirdTrait);
+        }
+
+        if (randomInt(4) == 0) {
+            PersonalityTraitType forthTrait = possibleTraits.get(0);
+            chosenTraits.add(forthTrait);
+        }
+
+        for (PersonalityTraitType traitType : chosenTraits) {
+            switch (traitType) {
+                case AGGRESSION -> {
+                    String traitIndex = getTraitIndex(Aggression.MAJOR_TRAITS_START_INDEX);
+                    person.setAggression(Aggression.fromString(traitIndex));
+                }
+                case AMBITION -> {
+                    String traitIndex = getTraitIndex(Ambition.MAJOR_TRAITS_START_INDEX);
+                    person.setAmbition(Ambition.fromString(traitIndex));
+                }
+                case GREED -> {
+                    String traitIndex = getTraitIndex(Greed.MAJOR_TRAITS_START_INDEX);
+                    person.setGreed(Greed.fromString(traitIndex));
+                }
+                case SOCIAL -> {
+                    String traitIndex = getTraitIndex(Social.MAJOR_TRAITS_START_INDEX);
+                    person.setSocial(Social.fromString(traitIndex));
+                }
+            }
+        }
+
+        // PERSONALITY QUIRK
+        generateAndApplyPersonalityQuirk(person);
+
+        // INTELLIGENCE
+        int firstIntelligence = randomInt(8346);
+        int secondIntelligence = randomInt(8346);
+        person.setIntelligence(generateIntelligence(max(firstIntelligence, secondIntelligence)));
+
+        // finally, write the description
+        writePersonalityDescription(person);
+    }
+
     /**
      * Generates and applies a personality quirk to the given person. This method ensures the quirk
      * index is valid by rolling a random value between 1 and the number of quirk constants in the
diff --git a/MekHQ/src/mekhq/campaign/randomEvents/personalities/enums/Aggression.java b/MekHQ/src/mekhq/campaign/randomEvents/personalities/enums/Aggression.java
index 01662d6ce33..25cde5e36f8 100644
--- a/MekHQ/src/mekhq/campaign/randomEvents/personalities/enums/Aggression.java
+++ b/MekHQ/src/mekhq/campaign/randomEvents/personalities/enums/Aggression.java
@@ -164,6 +164,21 @@ public String getDescription(int aggressionDescriptionIndex, final Gender gender
             pronounData.possessivePronoun(), pronounData.possessivePronounLowerCase(), pronounData.pluralizer());
     }
 
+    /**
+     * Retrieves the message displayed when a Ronin warrior expresses interest in joining the campaign.
+     *
+     * <p>This method formats a message using a resource key derived from the current object and
+     * includes the commander's address as part of the message formatting.</p>
+     *
+     * @param commanderAddress the address or name of the commander to include in the message.
+     * @return the formatted Ronin message as a {@link String}.
+     */
+    public String getRoninMessage(String commanderAddress) {
+        final String RESOURCE_KEY = name() + ".ronin";
+
+        return getFormattedTextAt(RESOURCE_BUNDLE, RESOURCE_KEY, commanderAddress);
+    }
+
     /**
      * @return {@code true} if the personality trait is considered positive,
      *         {@code false} otherwise.
diff --git a/MekHQ/src/mekhq/campaign/randomEvents/personalities/enums/Ambition.java b/MekHQ/src/mekhq/campaign/randomEvents/personalities/enums/Ambition.java
index b4819a4f9ef..db2fba57e60 100644
--- a/MekHQ/src/mekhq/campaign/randomEvents/personalities/enums/Ambition.java
+++ b/MekHQ/src/mekhq/campaign/randomEvents/personalities/enums/Ambition.java
@@ -161,6 +161,21 @@ public String getDescription(int ambitionDescriptionIndex, final Gender gender,
             pronounData.possessivePronoun(), pronounData.possessivePronounLowerCase(), pronounData.pluralizer());
     }
 
+    /**
+     * Retrieves the message displayed when a Ronin warrior expresses interest in joining the campaign.
+     *
+     * <p>This method formats a message using a resource key derived from the current object and
+     * includes the commander's address as part of the message formatting.</p>
+     *
+     * @param commanderAddress the address or name of the commander to include in the message.
+     * @return the formatted Ronin message as a {@link String}.
+     */
+    public String getRoninMessage(String commanderAddress) {
+        final String RESOURCE_KEY = name() + ".ronin";
+
+        return getFormattedTextAt(RESOURCE_BUNDLE, RESOURCE_KEY, commanderAddress);
+    }
+
     /**
      * @return {@code true} if the personality trait is considered positive,
      *         {@code false} otherwise.
diff --git a/MekHQ/src/mekhq/campaign/randomEvents/personalities/enums/Greed.java b/MekHQ/src/mekhq/campaign/randomEvents/personalities/enums/Greed.java
index 45736023163..0aaa2bdf5b0 100644
--- a/MekHQ/src/mekhq/campaign/randomEvents/personalities/enums/Greed.java
+++ b/MekHQ/src/mekhq/campaign/randomEvents/personalities/enums/Greed.java
@@ -161,6 +161,21 @@ public String getDescription(int greedDescriptionIndex, final Gender gender,
             pronounData.possessivePronoun(), pronounData.possessivePronounLowerCase(), pronounData.pluralizer());
     }
 
+    /**
+     * Retrieves the message displayed when a Ronin warrior expresses interest in joining the campaign.
+     *
+     * <p>This method formats a message using a resource key derived from the current object and
+     * includes the commander's address as part of the message formatting.</p>
+     *
+     * @param commanderAddress the address or name of the commander to include in the message.
+     * @return the formatted Ronin message as a {@link String}.
+     */
+    public String getRoninMessage(String commanderAddress) {
+        final String RESOURCE_KEY = name() + ".ronin";
+
+        return getFormattedTextAt(RESOURCE_BUNDLE, RESOURCE_KEY, commanderAddress);
+    }
+
     /**
      * @return {@code true} if the personality trait is considered positive,
      *         {@code false} otherwise.
diff --git a/MekHQ/src/mekhq/campaign/randomEvents/personalities/enums/Social.java b/MekHQ/src/mekhq/campaign/randomEvents/personalities/enums/Social.java
index 3fda37edd7f..496c1f6194c 100644
--- a/MekHQ/src/mekhq/campaign/randomEvents/personalities/enums/Social.java
+++ b/MekHQ/src/mekhq/campaign/randomEvents/personalities/enums/Social.java
@@ -161,6 +161,21 @@ public String getDescription(int socialDescriptionIndex, final Gender gender,
             pronounData.possessivePronoun(), pronounData.possessivePronounLowerCase(), pronounData.pluralizer());
     }
 
+    /**
+     * Retrieves the message displayed when a Ronin warrior expresses interest in joining the campaign.
+     *
+     * <p>This method formats a message using a resource key derived from the current object and
+     * includes the commander's address as part of the message formatting.</p>
+     *
+     * @param commanderAddress the address or name of the commander to include in the message.
+     * @return the formatted Ronin message as a {@link String}.
+     */
+    public String getRoninMessage(String commanderAddress) {
+        final String RESOURCE_KEY = name() + ".ronin";
+
+        return getFormattedTextAt(RESOURCE_BUNDLE, RESOURCE_KEY, commanderAddress);
+    }
+
     /**
      * @return {@code true} if the personality trait is considered positive,
      *         {@code false} otherwise.
diff --git a/MekHQ/unittests/mekhq/campaign/randomEvents/personalities/enums/AggressionTest.java b/MekHQ/unittests/mekhq/campaign/randomEvents/personalities/enums/AggressionTest.java
index dbcd93e2875..4138a6f42c6 100644
--- a/MekHQ/unittests/mekhq/campaign/randomEvents/personalities/enums/AggressionTest.java
+++ b/MekHQ/unittests/mekhq/campaign/randomEvents/personalities/enums/AggressionTest.java
@@ -103,4 +103,14 @@ public void testGetDescription_InvalidDescriptionIndex() {
         String description = NONE.getDescription(MAXIMUM_VARIATIONS, Gender.MALE, "Barry");
         assertTrue(isResourceKeyValid(description));
     }
+
+    @Test
+    public void testGetRoninMessage_notInvalid() {
+        for (Aggression trait : Aggression.values()) {
+            for (int i = 0; i < MAXIMUM_VARIATIONS; i++) {
+                String description = trait.getRoninMessage("Commander");
+                assertTrue(isResourceKeyValid(description));
+            }
+        }
+    }
 }
diff --git a/MekHQ/unittests/mekhq/campaign/randomEvents/personalities/enums/AmbitionTest.java b/MekHQ/unittests/mekhq/campaign/randomEvents/personalities/enums/AmbitionTest.java
index 323aa73a4e0..e46c35cb01c 100644
--- a/MekHQ/unittests/mekhq/campaign/randomEvents/personalities/enums/AmbitionTest.java
+++ b/MekHQ/unittests/mekhq/campaign/randomEvents/personalities/enums/AmbitionTest.java
@@ -103,4 +103,14 @@ public void testGetDescription_InvalidDescriptionIndex() {
         String description = NONE.getDescription(MAXIMUM_VARIATIONS, Gender.MALE, "Barry");
         assertTrue(isResourceKeyValid(description));
     }
+
+    @Test
+    public void testGetRoninMessage_notInvalid() {
+        for (Ambition trait : Ambition.values()) {
+            for (int i = 0; i < Ambition.MAXIMUM_VARIATIONS; i++) {
+                String description = trait.getRoninMessage("Commander");
+                assertTrue(isResourceKeyValid(description));
+            }
+        }
+    }
 }
diff --git a/MekHQ/unittests/mekhq/campaign/randomEvents/personalities/enums/GreedTest.java b/MekHQ/unittests/mekhq/campaign/randomEvents/personalities/enums/GreedTest.java
index f603d04209c..f3e51a96b9d 100644
--- a/MekHQ/unittests/mekhq/campaign/randomEvents/personalities/enums/GreedTest.java
+++ b/MekHQ/unittests/mekhq/campaign/randomEvents/personalities/enums/GreedTest.java
@@ -103,4 +103,14 @@ public void testGetDescription_InvalidDescriptionIndex() {
         String description = NONE.getDescription(MAXIMUM_VARIATIONS, Gender.MALE, "Barry");
         assertTrue(isResourceKeyValid(description));
     }
+
+    @Test
+    public void testGetRoninMessage_notInvalid() {
+        for (Greed trait : Greed.values()) {
+            for (int i = 0; i < Greed.MAXIMUM_VARIATIONS; i++) {
+                String description = trait.getRoninMessage("Commander");
+                assertTrue(isResourceKeyValid(description));
+            }
+        }
+    }
 }
diff --git a/MekHQ/unittests/mekhq/campaign/randomEvents/personalities/enums/SocialTest.java b/MekHQ/unittests/mekhq/campaign/randomEvents/personalities/enums/SocialTest.java
index 592b7c9c2ee..3f8094e2d24 100644
--- a/MekHQ/unittests/mekhq/campaign/randomEvents/personalities/enums/SocialTest.java
+++ b/MekHQ/unittests/mekhq/campaign/randomEvents/personalities/enums/SocialTest.java
@@ -104,4 +104,14 @@ public void testGetDescription_InvalidDescriptionIndex() {
         String description = NONE.getDescription(MAXIMUM_VARIATIONS, Gender.MALE, "Barry");
         assertTrue(isResourceKeyValid(description));
     }
+
+    @Test
+    public void testGetRoninMessage_notInvalid() {
+        for (Social trait : Social.values()) {
+            for (int i = 0; i < Social.MAXIMUM_VARIATIONS; i++) {
+                String description = trait.getRoninMessage("Commander");
+                assertTrue(isResourceKeyValid(description));
+            }
+        }
+    }
 }


Reviews:
user: login: github-advanced-security[bot]
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-14T22:41:00Z
user: login: IllianiBird
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-14T22:42:00Z
user: login: github-advanced-security[bot]
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-20T02:00:51Z

Review comments:
diff_hunk: @@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2014 Carl Spain. All rights reserved.
+ * Copyright (C) 2020-2025 The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MekHQ.
+ *
+ * MekHQ is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License (GPL),
+ * version 3 or (at your option) any later version,
+ * as published by the Free Software Foundation.
+ *
+ * MekHQ is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * A copy of the GPL should have been included with this project;
+ * if not, see <https://www.gnu.org/licenses/>.
+ *
+ * NOTICE: The MegaMek organization is a non-profit group of volunteers
+ * creating free software for the BattleTech community.
+ *
+ * MechWarrior, BattleMech, `Mech and AeroTech are registered trademarks
+ * of The Topps Company, Inc. All Rights Reserved.
+ *
+ * Catalyst Game Labs and the Catalyst Game Labs logo are trademarks of
+ * InMediaRes Productions, LLC.
+ */
+package mekhq.campaign.randomEvents;
+
+import megamek.client.generator.RandomCallsignGenerator;
+import mekhq.campaign.Campaign;
+import mekhq.campaign.RandomSkillPreferences;
+import mekhq.campaign.personnel.Person;
+import mekhq.campaign.personnel.enums.PersonnelRole;
+import mekhq.gui.dialog.RoninOfferDialog;
+
+import static megamek.common.Compute.randomInt;
+import static mekhq.campaign.personnel.enums.PersonnelRole.AEROSPACE_PILOT;
+import static mekhq.campaign.personnel.enums.PersonnelRole.MEKWARRIOR;
+import static mekhq.campaign.randomEvents.personalities.PersonalityController.generateBigPersonality;
+import static mekhq.gui.dialog.HireBulkPersonnelDialog.reRollAdvantages;
+import static mekhq.gui.dialog.HireBulkPersonnelDialog.reRollLoyalty;
+
+/**
+ * Represents a Ronin, a special type of recruitable personnel such as a MechWarrior,
+ * who can be generated and added to the campaign's personnel roster.
+ * Ronin are unique individuals with customized skill levels, traits, and personalities,
+ * and their recruitment involves special dialogs and interactions.
+ */
+public class RoninOffer {
+
+    /**
+     * Constructs and generates a Ronin, adds them to the personnel roster, and handles
+     * the custom recruitment process through dialogs.
+     *
+     * <p>The recruitment process involves two dialogs:</p>
+     * <ol>
+     *     <li>An initial offer dialog is displayed to the user.</li>
+     *     <li>A subsequent follow-up dialog is presented if the initial offer is accepted.</li>
+     * </ol>
+     * If the user declines in any of the dialogs, the Ronin is not added to the campaign.
+     *
+     * @param campaign the current {@link Campaign} to which the Ronin is added if recruited.
+     */
+    public RoninOffer(Campaign campaign) {
+        int roll = randomInt(5);
+
+        PersonnelRole role = roll == 0 ? AEROSPACE_PILOT : MEKWARRIOR;
+        Person ronin = campaign.newPerson(role);
+
+        RandomSkillPreferences randomSkillPreferences = campaign.getRandomSkillPreferences();
+        boolean useExtraRandomness = randomSkillPreferences.randomizeSkill();
path: MekHQ/src/mekhq/campaign/randomEvents/RoninOffer.java
user: login: github-advanced-security[bot]
body: ## Unread local variable

Variable 'boolean useExtraRandomness' is never read.

[Show more details](https://github.com/MegaMek/mekhq/security/code-scanning/7997)
created_at: 2025-03-14T22:41:00Z
author_association: NONE
diff_hunk: @@ -119,6 +141,95 @@
         }
     }
 
+    /**
+     * Generates an expansive "big" personality for a major character, Ronin, or hero.
+     *
+     * <p>This method creates a detailed set of personality traits for the given person,
+     * selecting and assigning a combination of major traits, a quirk, and intelligence.
+     * It ensures the generated personality reflects a high degree of uniqueness and depth.</p>
+     *
+     * <p>The method proceeds as follows:
+     * <ul>
+     *     <li>Randomly selects up to four major traits (Aggression, Ambition, Greed, Social).</li>
+     *     <li>Assigns the selected traits to the person's corresponding personality attributes.</li>
+     *     <li>Generates and applies a unique personality quirk to the person.</li>
+     *     <li>Generates an intelligence score using the maximum of two random values.</li>
+     *     <li>Writes a personality description based on the generated traits and attributes.</li>
+     * </ul>
+     *
+     * @param person the {@link Person} object to which the full personality will be applied
+     */
+    public static void generateBigPersonality(Person person) {
+        // As this method is likely going to be be applied over an existing personality profile, we
+        // wipe the old to ensure a clean slate.
+        person.setAggression(Aggression.NONE);
+        person.setAmbition(Ambition.NONE);
+        person.setGreed(Greed.NONE);
+        person.setSocial(Social.NONE);
+
+        // Then we generate a new personality
+        List<PersonalityTraitType> possibleTraits = new ArrayList<>(Arrays.asList(
+              PersonalityTraitType.AGGRESSION,
+              PersonalityTraitType.AMBITION,
+              PersonalityTraitType.GREED,
+              PersonalityTraitType.SOCIAL));
+
+        Collections.shuffle(possibleTraits);
+
+        List<PersonalityTraitType> chosenTraits = new ArrayList<>();
+
+        PersonalityTraitType firstTrait = possibleTraits.get(0);
+        possibleTraits.remove(firstTrait);
+        chosenTraits.add(firstTrait);
+
+        PersonalityTraitType secondTrait = possibleTraits.get(0);
+        possibleTraits.remove(secondTrait);
+        chosenTraits.add(secondTrait);
+
+        if (randomInt(4) == 0) {
+            PersonalityTraitType thirdTrait = possibleTraits.get(0);
+            possibleTraits.remove(thirdTrait);
+            chosenTraits.add(thirdTrait);
+        }
+
+        if (randomInt(4) == 0) {
+            PersonalityTraitType forthTrait = possibleTraits.get(0);
+            chosenTraits.add(forthTrait);
+        }
+
+        for (PersonalityTraitType traitType : chosenTraits) {
+            switch (traitType) {
path: MekHQ/src/mekhq/campaign/randomEvents/personalities/PersonalityController.java
user: login: github-advanced-security[bot]
body: ## Missing enum case in switch

Switch statement does not have a case for [INTELLIGENCE](1) or [PERSONALITY_QUIRK](2).

[Show more details](https://github.com/MegaMek/mekhq/security/code-scanning/7999)
created_at: 2025-03-14T22:41:00Z
author_association: NONE
diff_hunk: @@ -0,0 +1,252 @@
+/*
+ * Copyright (C) 2025 The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MekHQ.
+ *
+ * MekHQ is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License (GPL),
+ * version 3 or (at your option) any later version,
+ * as published by the Free Software Foundation.
+ *
+ * MekHQ is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * A copy of the GPL should have been included with this project;
+ * if not, see <https://www.gnu.org/licenses/>.
+ *
+ * NOTICE: The MegaMek organization is a non-profit group of volunteers
+ * creating free software for the BattleTech community.
+ *
+ * MechWarrior, BattleMech, `Mech and AeroTech are registered trademarks
+ * of The Topps Company, Inc. All Rights Reserved.
+ *
+ * Catalyst Game Labs and the Catalyst Game Labs logo are trademarks of
+ * InMediaRes Productions, LLC.
+ */
+package mekhq.gui.dialog;
+
+import megamek.codeUtilities.ObjectUtility;
+import megamek.common.options.IOption;
+import mekhq.Utilities;
+import mekhq.campaign.Campaign;
+import mekhq.campaign.personnel.Person;
+import mekhq.campaign.personnel.Skill;
+import mekhq.campaign.randomEvents.personalities.PersonalityController.PersonalityTraitType;
+import mekhq.campaign.randomEvents.personalities.enums.Aggression;
+import mekhq.campaign.randomEvents.personalities.enums.Ambition;
+import mekhq.campaign.randomEvents.personalities.enums.Greed;
+import mekhq.campaign.randomEvents.personalities.enums.Social;
+import mekhq.gui.baseComponents.MHQDialogImmersive;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+
+import static megamek.common.options.PilotOptions.LVL3_ADVANTAGES;
+import static mekhq.campaign.Campaign.AdministratorSpecialization.HR;
+import static mekhq.utilities.MHQInternationalization.getFormattedTextAt;
+
+/**
+ * Provides the dialog for handling Ronin offers in the campaign.
+ *
+ * <p>This dialog is used to present the player with the option to accept or decline a Ronin character
+ * as part of their campaign. It handles both in-character (IC) and out-of-character (OOC) messaging
+ * based on whether the offer is initiated by the HR Administrator or directly by the Ronin.</p>
+ */
+public class RoninOfferDialog extends MHQDialogImmersive {
+    private static final String RESOURCE_BUNDLE = "mekhq.resources." + RoninOfferDialog.class.getSimpleName();
+
+    /**
+     * Constructs the Ronin Offer dialog.
+     *
+     * @param campaign   the {@link Campaign} in which the offer is taking place
+     * @param isFromHR   {@code true} if the offer is initiated by the HR Administrator;
+     *                   {@code false} if initiated by the Ronin
+     * @param ronin      the {@link Person} representing the Ronin making the offer
+     */
+    public RoninOfferDialog(Campaign campaign, boolean isFromHR, Person ronin) {
+        super(campaign, isFromHR ? campaign.getSeniorAdminPerson(HR) : ronin, null,
+              createInCharacterMessage(isFromHR, ronin, campaign.getCommanderAddress(false)),
+              createButtons(isFromHR, ronin.getCallsign()), isFromHR ? null : createOutOfCharacterMessage(ronin),
+              null, true);
+    }
+
+    /**
+     * Creates the in-character message for the dialog.
+     *
+     * <p>The message varies depending on whether the offer is initiated by the HR Administrator or
+     * by the Ronin. If initiated by HR, the message will reference the administrative context. Otherwise,
+     * the message will include the Ronin's personality traits and their context.</p>
+     *
+     * @param isFromHR           {@code true} if the offer originates from HR, {@code false} if from the Ronin
+     * @param ronin              the {@link Person} representing the Ronin
+     * @param commanderAddress   the address of the commander for use in the message
+     * @return the in-character message as a {@link String}
+     */
+    private static String createInCharacterMessage(boolean isFromHR, Person ronin, String commanderAddress) {
+        if (isFromHR) {
+            return getFormattedTextAt(RESOURCE_BUNDLE, "message.ic.fromHR",
+                  commanderAddress, ronin.getCallsign().toUpperCase());
+        }
+
+        List<PersonalityTraitType> normalTraits = new ArrayList<>();
+        List<PersonalityTraitType> majorTraits = new ArrayList<>();
+
+        Aggression aggression = ronin.getAggression();
+        if (!aggression.isNone()) {
+            if (aggression.isTraitMajor()) {
+                majorTraits.add(PersonalityTraitType.AGGRESSION);
+            } else {
+                normalTraits.add(PersonalityTraitType.AGGRESSION);
+            }
+        }
+
+        Ambition ambition = ronin.getAmbition();
+        if (!ambition.isNone()) {
+            if (ambition.isTraitMajor()) {
+                majorTraits.add(PersonalityTraitType.AMBITION);
+            } else {
+                normalTraits.add(PersonalityTraitType.AMBITION);
+            }
+        }
+
+        Greed greed = ronin.getGreed();
+        if (!greed.isNone()) {
+            if (greed.isTraitMajor()) {
+                majorTraits.add(PersonalityTraitType.GREED);
+            } else {
+                normalTraits.add(PersonalityTraitType.GREED);
+            }
+        }
+
+        Social social = ronin.getSocial();
+        if (!social.isNone()) {
+            if (social.isTraitMajor()) {
+                majorTraits.add(PersonalityTraitType.SOCIAL);
+            } else {
+                normalTraits.add(PersonalityTraitType.SOCIAL);
+            }
+        }
path: MekHQ/src/mekhq/gui/dialog/RoninOfferDialog.java
user: login: github-advanced-security[bot]
body: ## Unused format argument

This format call refers to 0 argument(s) but supplies 1 argument(s).

[Show more details](https://github.com/MegaMek/mekhq/security/code-scanning/7998)
created_at: 2025-03-14T22:41:00Z
author_association: NONE
diff_hunk: @@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2014 Carl Spain. All rights reserved.
+ * Copyright (C) 2020-2025 The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MekHQ.
+ *
+ * MekHQ is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License (GPL),
+ * version 3 or (at your option) any later version,
+ * as published by the Free Software Foundation.
+ *
+ * MekHQ is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * A copy of the GPL should have been included with this project;
+ * if not, see <https://www.gnu.org/licenses/>.
+ *
+ * NOTICE: The MegaMek organization is a non-profit group of volunteers
+ * creating free software for the BattleTech community.
+ *
+ * MechWarrior, BattleMech, `Mech and AeroTech are registered trademarks
+ * of The Topps Company, Inc. All Rights Reserved.
+ *
+ * Catalyst Game Labs and the Catalyst Game Labs logo are trademarks of
+ * InMediaRes Productions, LLC.
+ */
+package mekhq.campaign.randomEvents;
+
+import megamek.client.generator.RandomCallsignGenerator;
+import mekhq.campaign.Campaign;
+import mekhq.campaign.RandomSkillPreferences;
+import mekhq.campaign.personnel.Person;
+import mekhq.campaign.personnel.enums.PersonnelRole;
+import mekhq.gui.dialog.RoninOfferDialog;
+
+import static megamek.common.Compute.randomInt;
+import static mekhq.campaign.personnel.enums.PersonnelRole.AEROSPACE_PILOT;
+import static mekhq.campaign.personnel.enums.PersonnelRole.MEKWARRIOR;
+import static mekhq.campaign.randomEvents.personalities.PersonalityController.generateBigPersonality;
+import static mekhq.gui.dialog.HireBulkPersonnelDialog.reRollAdvantages;
+import static mekhq.gui.dialog.HireBulkPersonnelDialog.reRollLoyalty;
+
+/**
+ * Represents a Ronin, a special type of recruitable personnel such as a MechWarrior,
+ * who can be generated and added to the campaign's personnel roster.
+ * Ronin are unique individuals with customized skill levels, traits, and personalities,
+ * and their recruitment involves special dialogs and interactions.
+ */
+public class RoninOffer {
+
+    /**
+     * Constructs and generates a Ronin, adds them to the personnel roster, and handles
+     * the custom recruitment process through dialogs.
+     *
+     * <p>The recruitment process involves two dialogs:</p>
+     * <ol>
+     *     <li>An initial offer dialog is displayed to the user.</li>
+     *     <li>A subsequent follow-up dialog is presented if the initial offer is accepted.</li>
+     * </ol>
+     * If the user declines in any of the dialogs, the Ronin is not added to the campaign.
+     *
+     * @param campaign the current {@link Campaign} to which the Ronin is added if recruited.
+     */
+    public RoninOffer(Campaign campaign) {
+        int roll = randomInt(5);
+
+        PersonnelRole role = roll == 0 ? AEROSPACE_PILOT : MEKWARRIOR;
+        Person ronin = campaign.newPerson(role);
+
+        RandomSkillPreferences randomSkillPreferences = campaign.getRandomSkillPreferences();
+        boolean useExtraRandomness = randomSkillPreferences.randomizeSkill();
path: MekHQ/src/mekhq/campaign/randomEvents/RoninOffer.java
user: login: IllianiBird
body: This is currently unused, but is put in place in preparation for resolving conflicts with #6273
created_at: 2025-03-14T22:42:00Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,384 @@
+/*
+ * Copyright (c) 2014 Carl Spain. All rights reserved.
+ * Copyright (C) 2020-2025 The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MekHQ.
+ *
+ * MekHQ is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License (GPL),
+ * version 3 or (at your option) any later version,
+ * as published by the Free Software Foundation.
+ *
+ * MekHQ is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * A copy of the GPL should have been included with this project;
+ * if not, see <https://www.gnu.org/licenses/>.
+ *
+ * NOTICE: The MegaMek organization is a non-profit group of volunteers
+ * creating free software for the BattleTech community.
+ *
+ * MechWarrior, BattleMech, `Mech and AeroTech are registered trademarks
+ * of The Topps Company, Inc. All Rights Reserved.
+ *
+ * Catalyst Game Labs and the Catalyst Game Labs logo are trademarks of
+ * InMediaRes Productions, LLC.
+ */
+package mekhq.campaign.randomEvents;
+
+import megamek.client.generator.RandomCallsignGenerator;
+import megamek.codeUtilities.ObjectUtility;
+import megamek.common.annotations.Nullable;
+import megamek.common.enums.SkillLevel;
+import megamek.common.options.IOption;
+import mekhq.Utilities;
+import mekhq.campaign.Campaign;
+import mekhq.campaign.RandomSkillPreferences;
+import mekhq.campaign.finances.Money;
+import mekhq.campaign.personnel.Person;
+import mekhq.campaign.personnel.Skill;
+import mekhq.campaign.personnel.enums.PersonnelRole;
+import mekhq.campaign.randomEvents.personalities.PersonalityController.PersonalityTraitType;
+import mekhq.campaign.randomEvents.personalities.enums.Aggression;
+import mekhq.campaign.randomEvents.personalities.enums.Ambition;
+import mekhq.campaign.randomEvents.personalities.enums.Greed;
+import mekhq.campaign.randomEvents.personalities.enums.Social;
+import mekhq.campaign.stratcon.StratconCampaignState;
+import mekhq.gui.dialog.GenericImmersiveMessageDialog;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+
+import static megamek.common.Compute.randomInt;
+import static megamek.common.enums.SkillLevel.VETERAN;
+import static megamek.common.options.PilotOptions.LVL3_ADVANTAGES;
+import static mekhq.campaign.Campaign.AdministratorSpecialization.HR;
+import static mekhq.campaign.finances.enums.TransactionType.RECRUITMENT;
+import static mekhq.campaign.personnel.PersonUtility.overrideSkills;
+import static mekhq.campaign.personnel.PersonUtility.reRollAdvantages;
+import static mekhq.campaign.personnel.PersonUtility.reRollLoyalty;
+import static mekhq.campaign.personnel.enums.PersonnelRole.AEROSPACE_PILOT;
+import static mekhq.campaign.personnel.enums.PersonnelRole.MEKWARRIOR;
+import static mekhq.campaign.randomEvents.personalities.PersonalityController.PersonalityTraitType.AGGRESSION;
+import static mekhq.campaign.randomEvents.personalities.PersonalityController.PersonalityTraitType.AMBITION;
+import static mekhq.campaign.randomEvents.personalities.PersonalityController.PersonalityTraitType.GREED;
+import static mekhq.campaign.randomEvents.personalities.PersonalityController.PersonalityTraitType.SOCIAL;
+import static mekhq.campaign.randomEvents.personalities.PersonalityController.generateBigPersonality;
+import static mekhq.utilities.MHQInternationalization.getFormattedTextAt;
+
+/**
+ * Represents a dialog and associated logic for presenting the player with a Ronin offer. The Ronin
+ * offer involves hiring a new character (a 'Ronin') with specific skills and attributes. The decision
+ * to hire the Ronin depends on offering C-Bills or Support Points, depending on whether StratCon is
+ * enabled.
+ *
+ * <p>This class handles the creation of the Ronin character, the dialog interactions, and the recruitment
+ * process based on the player’s choices.</p>
+ */
+public class RoninOffer {
+    private static final String RESOURCE_BUNDLE = "mekhq.resources." + RoninOffer.class.getSimpleName();
+
+    private final Campaign campaign;
+
+    private static final int ACCEPT_DIALOG_CHOICE_INDEX = 0;
+
+    private static final Money FALLBACK_HIRING_FEE = Money.of(500000);
+
+    /**
+     * Creates a new instance of the {@code RoninOffer} dialog for handling a Ronin hiring event.
+     * This creates a Ronin character, randomizes their attributes and abilities, and initiates the
+     * dialog process where the player can choose whether to recruit them.
+     *
+     * @param campaign            The current {@link Campaign} instance associated with the game.
+     * @param campaignState       The optional {@link StratconCampaignState}. If {@code null} we will
+     *                           use a fallback C-Bill cost, instead or Support Points.
+     * @param requiredCombatTeams The number of combat teams needed, affecting the cost of hiring.
+     */
+    public RoninOffer(Campaign campaign, @Nullable StratconCampaignState campaignState, int requiredCombatTeams) {
+        this.campaign = campaign;
+
+        int roll = randomInt(5);
+
+        PersonnelRole role = roll == 0 ? AEROSPACE_PILOT : MEKWARRIOR;
+        Person ronin = campaign.newPerson(role);
+
+        RandomSkillPreferences randomSkillPreferences = campaign.getRandomSkillPreferences();
+        boolean useExtraRandomness = randomSkillPreferences.randomizeSkill();
+
+        // We don't care about admin settings, as we're not going to have an admin here
+        overrideSkills(false, false, useExtraRandomness,
+              ronin, role, VETERAN);
+
+        generateBigPersonality(ronin);
+
+        SkillLevel skillLevel = ronin.getSkillLevel(campaign, false);
+        reRollLoyalty(ronin, skillLevel);
+        reRollAdvantages(campaign, ronin, skillLevel);
+
+        ronin.setCallsign(RandomCallsignGenerator.getInstance().generate());
+
+        displayAndProcessConversation(campaign, ronin, campaignState, requiredCombatTeams);
+    }
+
+    /**
+     * Displays the Ronin offer dialog and processes the player's choices throughout the interaction.
+     * This method progresses through different message dialogs and updates the campaign if the Ronin
+     * is recruited.
+     *
+     * @param campaign            The active {@link Campaign} instance.
+     * @param ronin               The Ronin {@link Person} being offered for recruitment.
+     * @param campaignState       The optional {@link StratconCampaignState} providing strategic information.
+     * @param requiredCombatTeams The number of combat teams required for the recruitment.
+     */
+    private void displayAndProcessConversation(Campaign campaign, Person ronin,
+                                               StratconCampaignState campaignState, int requiredCombatTeams) {
+        String commanderAddress = campaign.getCommanderAddress(false);
+        int response = displayInitialMessage(commanderAddress, ronin.getCallsign());
+        if (response != ACCEPT_DIALOG_CHOICE_INDEX) {
+            return;
+        }
+
+        response = displayRoninMessage(ronin, commanderAddress, campaignState == null,
+              requiredCombatTeams, campaignState == null ? null : campaignState.getSupportPoints());
+        if (response != ACCEPT_DIALOG_CHOICE_INDEX) {
+            return;
+        }
+
+        // Pay for the Ronin
+        if (campaignState == null) {
+            // This and the Support Point cost are designed to scale with campaign size.
+            // The larger the campaign, the more resources they have to toss around.
+            campaign.getFinances().debit(RECRUITMENT, campaign.getLocalDate(),
+                  FALLBACK_HIRING_FEE.multipliedBy(requiredCombatTeams),
+                  getFormattedTextAt(RESOURCE_BUNDLE, "message.hiring", ronin.getFullName()));
+        } else {
+            campaignState.changeSupportPoints(-requiredCombatTeams);
+        }
+
+        campaign.recruitPerson(ronin, true);
+    }
+
+
+    /**
+     * Displays the initial message of the Ronin hiring process, giving the player multiple response
+     * options. This is the first step in the interaction flow.
+     *
+     * @return An integer representing the player's choice. Used to determine whether the process
+     * continues.
+     */
+    private int displayInitialMessage(String commanderAddress, String roninCallSign) {
+        String centerMessage = getFormattedTextAt(RESOURCE_BUNDLE, "message.ic.fromHR",
+              commanderAddress, roninCallSign);
+
+        List<String> buttonLabels = new ArrayList<>();
+        buttonLabels.add(getFormattedTextAt(RESOURCE_BUNDLE, "button.fromHR.accept"));
+        buttonLabels.add(getFormattedTextAt(RESOURCE_BUNDLE, "button.fromHR.decline.polite"));
+        buttonLabels.add(getFormattedTextAt(RESOURCE_BUNDLE, "button.fromHR.decline.neutral"));
+        buttonLabels.add(getFormattedTextAt(RESOURCE_BUNDLE, "button.fromHR.decline.rude", roninCallSign));
+
+        GenericImmersiveMessageDialog initialMessage = new GenericImmersiveMessageDialog(campaign,
+              campaign.getSeniorAdminPerson(HR), null, centerMessage, buttonLabels,
+              null, true);
+
+        return initialMessage.getDialogChoice();
+    }
+
+    /**
+     * Displays the main Ronin message dialog, including immersive text and out-of-character
+     * information such as skills, abilities, and hiring costs.
+     *
+     * @param ronin               The Ronin {@link Person} being offered for recruitment.
+     * @param commanderAddress    The in-game address of the commander used in immersive text.
+     * @param useFallbackHiringFee Indicates if the fallback hiring fee (C-Bills) should be used
+     *                            instead of support points.
+     * @param requiredCombatTeams The number of combat teams required for the recruitment cost calculation.
+     * @param availableSupportPoints The support points available in the current campaign, if applicable;
+     *                              can be {@code null} if using the fallback hiring fee.
+     * @return An integer representing the player's choice from the dialog.
+     */
+    private int displayRoninMessage(Person ronin, String commanderAddress, boolean useFallbackHiringFee,
+                                    int requiredCombatTeams, @Nullable Integer availableSupportPoints) {
+        String centerMessage = createRoninMessage(ronin, commanderAddress);
+
+        List<String> buttonLabels = new ArrayList<>();
+        buttonLabels.add(getFormattedTextAt(RESOURCE_BUNDLE, "button.fromRonin.accept"));
+        buttonLabels.add(getFormattedTextAt(RESOURCE_BUNDLE, "button.fromRonin.decline.polite"));
+        buttonLabels.add(getFormattedTextAt(RESOURCE_BUNDLE, "button.fromRonin.decline.neutral"));
+        buttonLabels.add(getFormattedTextAt(RESOURCE_BUNDLE, "button.fromRonin.decline.rude"));
+
+        String outOfCharacterMessage = createRoninOutOfCharacterMessage(ronin, useFallbackHiringFee,
+              requiredCombatTeams, availableSupportPoints);
+
+        GenericImmersiveMessageDialog initialMessage = new GenericImmersiveMessageDialog(campaign,
+              null, ronin, centerMessage, buttonLabels, outOfCharacterMessage, true);
+
+        return initialMessage.getDialogChoice();
+    }
+
+    /**
+     * Builds the immersive message shown to the player from the Ronin's perspective.
+     * The content of the message will vary based on the Ronin's personality traits.
+     *
+     * @param ronin            The Ronin {@link Person} being offered for recruitment.
+     * @param commanderAddress The in-game address of the commander used in immersive text.
+     * @return A {@link String} containing the message content from the Ronin's perspective.
+     */
+    private static String createRoninMessage(Person ronin, String commanderAddress) {
+        List<PersonalityTraitType> normalTraits = new ArrayList<>();
+        List<PersonalityTraitType> majorTraits = new ArrayList<>();
+
+        Aggression aggression = ronin.getAggression();
+        if (!aggression.isNone()) {
+            if (aggression.isTraitMajor()) {
+                majorTraits.add(AGGRESSION);
+            } else {
+                normalTraits.add(AGGRESSION);
+            }
+        }
+
+        Ambition ambition = ronin.getAmbition();
+        if (!ambition.isNone()) {
+            if (ambition.isTraitMajor()) {
+                majorTraits.add(AMBITION);
+            } else {
+                normalTraits.add(AMBITION);
+            }
+        }
+
+        Greed greed = ronin.getGreed();
+        if (!greed.isNone()) {
+            if (greed.isTraitMajor()) {
+                majorTraits.add(GREED);
+            } else {
+                normalTraits.add(GREED);
+            }
+        }
+
+        Social social = ronin.getSocial();
+        if (!social.isNone()) {
+            if (social.isTraitMajor()) {
+                majorTraits.add(SOCIAL);
+            } else {
+                normalTraits.add(SOCIAL);
+            }
+        }
+
+        PersonalityTraitType chosenTrait = null;
+
+        if (!majorTraits.isEmpty()) {
+            chosenTrait = ObjectUtility.getRandomItem(majorTraits);
+        }
+
+        if (!normalTraits.isEmpty()) {
+            chosenTrait = ObjectUtility.getRandomItem(normalTraits);
+        }
+
+        String message = "";
+        if (chosenTrait != null) {
+            message = switch (chosenTrait) {
+                case AGGRESSION -> aggression.getRoninMessage(commanderAddress);
+                case AMBITION -> ambition.getRoninMessage(commanderAddress);
+                case GREED -> greed.getRoninMessage(commanderAddress);
+                case SOCIAL -> social.getRoninMessage(commanderAddress);
+                default -> "";
+            };
+        }
+
+        if (message.isBlank()) {
+            return getFormattedTextAt(RESOURCE_BUNDLE, "message.ic.fallback", commanderAddress);
+        } else {
+            return String.format(message, commanderAddress);
path: MekHQ/src/mekhq/campaign/randomEvents/RoninOffer.java
user: login: github-advanced-security[bot]
body: ## Unused format argument

This format call refers to 0 argument(s) but supplies 1 argument(s).

[Show more details](https://github.com/MegaMek/mekhq/security/code-scanning/8001)
created_at: 2025-03-20T02:00:51Z
author_association: NONE

PR comments:
user: login: codecov-commenter
created_at: 2025-03-14T22:42:07Z
body: ## [Codecov](https://app.codecov.io/gh/MegaMek/mekhq/pull/6277?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=MegaMek) Report
All modified and coverable lines are covered by tests :white_check_mark:
> Project coverage is 11.32%. Comparing base [(`eab8269`)](https://app.codecov.io/gh/MegaMek/mekhq/commit/eab8269c523ca20b3b987275fa2c44187d3398a1?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=MegaMek) to head [(`4709815`)](https://app.codecov.io/gh/MegaMek/mekhq/commit/47098157dabf5f0269303814daf648e0696bf969?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=MegaMek).
> Report is 43 commits behind head on master.

<details><summary>Additional details and impacted files</summary>


```diff
@@             Coverage Diff              @@
##             master    #6277      +/-   ##
============================================
- Coverage     11.33%   11.32%   -0.02%     
  Complexity     6267     6267              
============================================
  Files          1069     1070       +1     
  Lines        135662   135866     +204     
  Branches      20974    21009      +35     
============================================
+ Hits          15374    15382       +8     
- Misses       118745   118939     +194     
- Partials       1543     1545       +2     
```

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/MegaMek/mekhq/pull/6277?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=MegaMek).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=MegaMek).

<details><summary> :rocket: New features to boost your workflow: </summary>

- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
</details>
author_association: NONE
user: login: IllianiBird
created_at: 2025-03-20T01:58:33Z
body: - Removed `RoninOfferDialog` class and migrated its logic to `RoninOffer` for better centralization of Ronin recruitment interactions.
- Updated recruitment process to include fee based on whether StratCon is enabled, or not.
- Updated dialogs to utilize the new 'GenericImmersiveMessageDialog' class
author_association: COLLABORATOR
user: login: IllianiBird
created_at: 2025-03-22T23:11:58Z
body: Updated to 50.05
author_association: COLLABORATOR