From 1fafc2d83dca27d6f4e3924b28168cb12836dab9 Mon Sep 17 00:00:00 2001
From: Arkerthan <arkerthan@mailbox.org>
Date: Thu, 10 Nov 2022 00:38:15 +0100
Subject: [PATCH] Convert combat skill from 0-1 range to 0-100 range

---
 js/003-data/slaveSummaryData.js               | 16 +++++-
 src/Mods/Catmod/events/SoSSniper.js           |  2 +-
 src/Mods/Catmod/events/SoSassassin.js         | 16 +++---
 src/Mods/SecExp/events/conflictReport.js      |  4 +-
 .../SecExp/js/reportingRelatedFunctions.js    |  6 +--
 .../SpecialForce/events/TrickShotNight.js     |  2 +-
 .../backwardsCompatibility/datatypeCleanup.js |  2 +-
 src/endWeek/events/retire.js                  |  2 +-
 src/endWeek/minorInjuryResponse.js            |  4 +-
 src/endWeek/saGuardYou.js                     | 39 +++++++-------
 src/endWeek/saRecruitGirls.js                 |  2 +-
 src/events/PE/peCombatTraining.js             |  2 +-
 src/events/PE/pePitFight.js                   |  2 +-
 src/events/PESS/pessBodyguardBeatdown.js      |  6 +--
 src/events/PESS/pessBodyguardBedtime.js       |  2 +-
 src/events/RE/reAWOL.js                       |  2 +-
 src/events/RE/reBoomerang.js                  |  2 +-
 src/events/RE/reMalefactor.js                 |  2 +-
 src/events/RE/rePokerNight.js                 |  2 +-
 src/events/RE/rePregInventorShowOff.js        |  4 +-
 src/events/RE/reRoyalBlood.js                 |  2 +-
 src/events/REFS/refsKnightlyDuel.js           |  2 +-
 src/events/RESS/mutinyAttempt.js              |  4 +-
 src/events/RETS/reSimpleAssault.js            |  2 +-
 src/events/intro/acquisition.js               |  6 +--
 src/events/nonRandom/daughters/pBombing.js    |  2 +-
 src/events/nonRandom/rival/pRivalryCapture.js |  4 +-
 src/events/nonRandom/rival/pRivalryHostage.js |  6 +--
 src/events/reRecruit/gangLeader.js            |  2 +-
 src/events/reRecruit/heldPOW.js               |  2 +-
 src/events/reRecruit/rogueCyborg.js           |  2 +-
 src/events/recFS/recfsNeoImperialist.js       |  2 +-
 .../recFS/recfsSlaveProfessionalismTwo.js     |  2 +-
 src/events/scheduled/assholeKnight.js         |  2 +-
 src/events/scheduled/murderAttempt.js         |  2 +-
 src/events/scheduled/pitFightLethal.js        | 14 ++---
 src/events/scheduled/pitFightNonlethal.js     | 12 ++---
 src/events/scheduled/seCoursing.js            |  4 +-
 src/events/scheduled/seRaiding.js             |  8 +--
 .../nursery/nurseryDatatypeCleanup.js         |  2 +-
 src/interaction/sellSlave.js                  | 12 ++---
 src/js/slaveCostJS.js                         |  4 +-
 src/js/slaveSummaryHelpers.js                 |  8 +--
 src/js/utilsSlave.js                          |  4 +-
 .../specificMarkets/customSlaveMarket.js      | 13 +++--
 .../specificMarkets/prestigiousSlave.js       |  4 +-
 src/npc/bodyguard/bgDescription.js            |  2 +-
 src/npc/databases/cheatmodeDatabase.js        |  2 +-
 src/npc/descriptions/style/clothing.js        | 16 +++---
 src/npc/generate/generateLeadershipSlave.js   |  4 +-
 src/npc/generate/generateMarketSlave.js       | 52 +++++++++----------
 src/npc/interaction/fAbuse.js                 | 20 +++----
 src/npc/interaction/killSlave.js              |  2 +-
 src/npc/startingGirls/startingGirls.js        | 11 ++--
 src/player/js/enslavePlayer.js                |  2 +-
 55 files changed, 183 insertions(+), 174 deletions(-)

diff --git a/js/003-data/slaveSummaryData.js b/js/003-data/slaveSummaryData.js
index 14967b216d5..3af5ee6c550 100644
--- a/js/003-data/slaveSummaryData.js
+++ b/js/003-data/slaveSummaryData.js
@@ -625,7 +625,13 @@ App.Data.SlaveSummary = {
 				999: {desc: "Masterful whore", style: "skill"}
 			},
 			mss: {desc: "Masterful sex slave.", style: "skill"},
-			fighter: {desc: "Trained fighter.", style: "skill"},
+			combat: {
+				10: null,
+				30: {desc: "Basic fighter", style: "skill"},
+				60: {desc: "Skilled fighter", style: "skill"},
+				99: {desc: "Expert fighter", style: "skill"},
+				999: {desc: "Masterful fighter", style: "skill"}
+			},
 		},
 		sexDrive: {
 			XX: {
@@ -1403,7 +1409,13 @@ App.Data.SlaveSummary = {
 				999: {desc: "W+++", style: "skill"}
 			},
 			mss: {desc: "MSS", style: "skill"},
-			fighter: {desc: "C", style: "skill"},
+			combat: {
+				10: null,
+				30: {desc: "C", style: "skill"},
+				60: {desc: "C+", style: "skill"},
+				99: {desc: "C++", style: "skill"},
+				999: {desc: "C+++", style: "skill"}
+			},
 		},
 		sexDrive: {
 			XX: {
diff --git a/src/Mods/Catmod/events/SoSSniper.js b/src/Mods/Catmod/events/SoSSniper.js
index e70a305d4f1..6c520fc3bc2 100644
--- a/src/Mods/Catmod/events/SoSSniper.js
+++ b/src/Mods/Catmod/events/SoSSniper.js
@@ -26,7 +26,7 @@ App.Events.RESosSniper = class RESosSniper extends App.Events.BaseEvent {
 		slave.origin = "$He was an elite sniper of the Sons of Sekhmet, nearly successful in assassinating you with a long-range shot from across the arcology before being captured by your Imperial Knights in a tense shootout.";
 		slave.intelligenceImplant = 30;
 		slave.career = "a sniper";
-		slave.skill.combat = 1;
+		slave.skill.combat = 70;
 		slave.devotion = -100;
 		slave.trust = random(-20, 10);
 		slave.weight = random(-20, 30);
diff --git a/src/Mods/Catmod/events/SoSassassin.js b/src/Mods/Catmod/events/SoSassassin.js
index f653a3058b9..a3729fa0a90 100644
--- a/src/Mods/Catmod/events/SoSassassin.js
+++ b/src/Mods/Catmod/events/SoSassassin.js
@@ -49,7 +49,7 @@ App.Events.RESosAssassin = class RESosAssassin extends App.Events.BaseEvent {
 				r.push(`As the two would-be assassins collapse, the pretty woman draws a vicious-looking curved knife from her sleeve, swears in a foreign language, and lunges towards you.`);
 				if (S.Bodyguard) {
 					r.push(`She's intercepted by ${S.Bodyguard.slaveName}, who drops ${his} empty firearm on the ground to pull ${his} own sword free.`);
-					if (S.Bodyguard.skill.combat > 0 && V.personalArms > 0) {
+					if (S.Bodyguard.skill.combat > 60 && V.personalArms > 0) {
 						r.push(`The two trained killers clash ferociously, ${S.Bodyguard.slaveName} using the longer reach of ${his} sword to keep the mysterious assassin's lightning-fast long knife at bay. As the two narrowly avoid each other's attacks, you pull up your handgun, one bullet left in the chamber, carefully lower your aim, and fire into the melee, blasting a hole through the assassin's left thigh. As she cries out in pain and stumbles, your trained bodyguard tackles her to the ground and slams a fist into her face before she can activate whatever suicide method she has. As the security drones arrive, the marketplace watching the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration,</span> you call for a medic and some sedatives. You're about to claim yourself a <span class="green">brand new slave.</span>`);
 						cashX(-1000, "event", S.Bodyguard);
 						repX(2500, "event", S.Bodyguard);
@@ -59,7 +59,7 @@ App.Events.RESosAssassin = class RESosAssassin extends App.Events.BaseEvent {
 						slave.origin = "$He was an elite assassin of the Sons of Sekhmet, narrowly captured in a well-planned assassination attempt where $he distracted you with $his pretty face..";
 						slave.intelligenceImplant = 30;
 						slave.career = "an assassin";
-						slave.skill.combat = 1;
+						slave.skill.combat = 70;
 						slave.devotion = -100;
 						slave.trust = random(-20, 10);
 						slave.weight = random(-20, 30);
@@ -68,13 +68,13 @@ App.Events.RESosAssassin = class RESosAssassin extends App.Events.BaseEvent {
 						slave.shouldersTat = either("flowers", "tribal patterns", "asian art");
 						slave.custom.tattoo = "$He has the orange sun of the Sons of Sekhmet tattooed on $his neck, marking $him as a high-ranking operative.";
 						newSlave(slave);
-					} else if (S.Bodyguard.skill.combat > 0 && V.personalArms < 1) {
+					} else if (S.Bodyguard.skill.combat > 60 && V.personalArms < 1) {
 						r.push(`The two trained killers clash ferociously, ${S.Bodyguard.slaveName} using the longer reach of ${his} sword to keep the mysterious assassin's lightning-fast long knife at bay. For what feels like a full minute they dodge each other's lethal blows, both unable to land a hit on the other, until you see the security drones you called for finally start to arrive. Sensing that her time window is closing, the assassin tries to step back, only for her retreat to be cut off as ${S.Bodyguard.slaveName} ferociously leaps forward and plunges ${his} sword directly through the assassin's neck. ${He} nearly decapitates the pretty head as ${he} pulls ${his} sword back, the marketplace watching the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration.</span>`);
 						cashX(-1000, "event", S.Bodyguard);
 						repX(2500, "event", S.Bodyguard);
 					} else {
 						r.push(`The two killers clash, but it's immediately apparent who's better trained. The assassin blocks every strike coming from ${S.Bodyguard.slaveName} and hits back twice as hard, forcing ${him} on the defensive. When ${S.Bodyguard.slaveName} stumbles, the assassin furiously kicks the blade out from ${his} hand and leaps atop ${him},`);
-						if (S.Bodyguard.skill.combat < 1 && V.personalArms > 0) {
+						if (S.Bodyguard.skill.combat <= 60 && V.personalArms > 0) {
 							r.push(`readying her own knife to slash the bodyguard's throat. You raise your handgun at the same time, one bullet left in the trigger, and fire a single round through the assassin's skull just before she can. Her head explodes backwards in a burst of gore, and she slumps off ${S.Bodyguard.slaveName}, her knife clattering to the ground. The citizens in the marketplace watch the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration,</span> both you and ${S.Bodyguard.slaveName} panting in the wake of the attack and surrounded by bodies.`);
 							cashX(-1000, "event", S.Bodyguard);
 							repX(2500, "event", S.Bodyguard);
@@ -116,7 +116,7 @@ App.Events.RESosAssassin = class RESosAssassin extends App.Events.BaseEvent {
 			}
 			r.toParagraph();
 			r.push(`As the two would-be assassins collapse, the pretty woman draws a vicious-looking curved knife from her sleeve, swears in a foreign language, and lunges towards you. She's intercepted by ${S.Bodyguard.slaveName}, who drops ${his} empty firearm on the ground to pull ${his} own sword free.`);
-			if (S.Bodyguard.skill.combat > 0 && V.personalArms > 0 && V.PC.skill.warfare >= 60) {
+			if (S.Bodyguard.skill.combat > 60 && V.personalArms > 0 && V.PC.skill.warfare >= 60) {
 				r.push(`The two trained killers clash ferociously, ${S.Bodyguard.slaveName} using the longer reach of ${his} sword to keep the mysterious assassin's lightning-fast long knife at bay. As the two narrowly avoid each other's attacks, you pull up your handgun, one bullet left in the chamber, carefully lower your aim, and fire into the melee, blasting a hole through the assassin's left thigh. As she cries out in pain and stumbles, your trained bodyguard tackles her to the ground and slams a fist into her face before she can activate whatever suicide method she has. As the security drones arrive, the marketplace watching the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration,</span> you call for a medic and some sedatives. You're about to claim yourself a <span class="green">brand new slave.</span>`);
 				cashX(-1000, "event", S.Bodyguard);
 				repX(2500, "event", S.Bodyguard);
@@ -126,7 +126,7 @@ App.Events.RESosAssassin = class RESosAssassin extends App.Events.BaseEvent {
 				slave.origin = "$He was an elite assassin of the Sons of Sekhmet, narrowly captured in a well-planned assassination attempt where $he distracted you with $his pretty face.";
 				slave.intelligenceImplant = 30;
 				slave.career = "an assassin";
-				slave.skill.combat = 1;
+				slave.skill.combat = 70;
 				slave.devotion = -100;
 				slave.trust = random(-20, 10);
 				slave.weight = random(-20, 30);
@@ -135,7 +135,7 @@ App.Events.RESosAssassin = class RESosAssassin extends App.Events.BaseEvent {
 				slave.shouldersTat = either("flowers", "tribal patterns", "asian art");
 				slave.custom.tattoo = "$He has the orange sun of the Sons of Sekhmet tattooed on $his neck, marking $him as a high-ranking operative.";
 				newSlave(slave);
-			} else if (S.Bodyguard.skill.combat > 0) {
+			} else if (S.Bodyguard.skill.combat > 60) {
 				r.push(`The two trained killers clash ferociously, ${S.Bodyguard.slaveName} using the longer reach of ${his} sword to keep the mysterious assassin's lightning-fast long knife at bay. For what feels like a full minute they dodge each other's lethal blows, both unable to land a hit on the other, until you see the security drones you called for finally start to arrive. Sensing that her time window is closing, the assassin tries to step back, only for her retreat to be cut off as ${S.Bodyguard.slaveName} ferociously leaps forward and plunges ${his} sword directly through the assassin's neck. ${He} nearly decapitates the pretty head as ${he} pulls ${his} sword back, the marketplace watching the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration.</span>`);
 				cashX(-1000, "event", S.Bodyguard);
 				repX(2500, "event", S.Bodyguard);
@@ -169,7 +169,7 @@ App.Events.RESosAssassin = class RESosAssassin extends App.Events.BaseEvent {
 				r.toParagraph();
 				if (S.Bodyguard) {
 					r.push(`She's intercepted by ${S.Bodyguard.slaveName}, who drops ${his} empty firearm on the ground to pull ${his} own sword free.`);
-					if (S.Bodyguard.skill.combat > 0) {
+					if (S.Bodyguard.skill.combat > 60) {
 						r.push(`The two trained killers clash ferociously, ${S.Bodyguard.slaveName} using the longer reach of ${his} sword to keep the mysterious assassin's lightning-fast long knife at bay. For what feels like a full minute they dodge each other's lethal blows, both unable to land a hit on the other, until you see the security drones you called for finally start to arrive. Sensing that her time window is closing, the assassin tries to step back, only for her retreat to be cut off as ${S.Bodyguard.slaveName} ferociously leaps forward and plunges ${his} sword directly through the assassin's neck. ${He} nearly decapitates the pretty head as ${he} pulls ${his} sword back, the marketplace watching the <span class="red">minorly damaged</span> scene with a mixture of <span class="green">shock and admiration.</span>`);
 						cashX(-1000, "event", S.Bodyguard);
 						repX(2500, "event", S.Bodyguard);
diff --git a/src/Mods/SecExp/events/conflictReport.js b/src/Mods/SecExp/events/conflictReport.js
index 145c6ab7e30..e08874b3b6f 100644
--- a/src/Mods/SecExp/events/conflictReport.js
+++ b/src/Mods/SecExp/events/conflictReport.js
@@ -1053,7 +1053,7 @@ App.Events.conflictReport = function() {
 						slave.weight = (generateFemale ? random(-20, 30) : random(0, 30));
 						slave.muscles = (generateFemale ? random(15, 80) : random(25, 80));
 						slave.waist = (generateFemale ? random(10, 80) : random(-20, 20));
-						slave.skill.combat = 1;
+						slave.skill.combat = 70;
 						slave.origin = `$He is an enslaved ${V.SecExp.war.attacker.type} soldier captured during a battle.`;
 						names.push(SlaveFullName(slave));
 						newSlave(slave); // skip New Slave Intro
@@ -1307,7 +1307,7 @@ const checkWoundStatus = function(target) {
 			return ``;
 		}
 
-		if (slave.skill.combat > 0) {
+		if (slave.skill.combat > 30) {
 			woundChance -= 2;
 		}
 		woundChance -= 0.25 * (getLimbCount(slave, 105));
diff --git a/src/Mods/SecExp/js/reportingRelatedFunctions.js b/src/Mods/SecExp/js/reportingRelatedFunctions.js
index 004db653502..866e178514c 100644
--- a/src/Mods/SecExp/js/reportingRelatedFunctions.js
+++ b/src/Mods/SecExp/js/reportingRelatedFunctions.js
@@ -512,7 +512,7 @@ App.Mods.SecExp.commanderEffectiveness = function(passage) {
 					tacChance -= 0.35;
 				}
 				// does she get wounded?
-				if (slave.skill.combat === 1) {
+				if (slave.skill.combat > 30) {
 					woundChance -= 3;
 				}
 				woundChance -= 0.25 * (getLimbCount(slave, 105));
@@ -558,9 +558,9 @@ App.Mods.SecExp.commanderEffectiveness = function(passage) {
 					enemyMod += 0.2;
 				}
 				// 60% chance of getting combat skill if not already have it
-				if (slave.skill.combat === 0 && random(1, 100) <= 60) {
+				if (slave.skill.combat <70 && random(1, 100) <= 60) {
 					V.SecExp.war.gainedCombat = 1;
-					slave.skill.combat = 1;
+					slave.skill.combat ++;
 				}
 			} else {
 				const {
diff --git a/src/Mods/SpecialForce/events/TrickShotNight.js b/src/Mods/SpecialForce/events/TrickShotNight.js
index e653eae5e80..0c6b40e1539 100644
--- a/src/Mods/SpecialForce/events/TrickShotNight.js
+++ b/src/Mods/SpecialForce/events/TrickShotNight.js
@@ -85,7 +85,7 @@ App.Events.TrickShotNight = class TrickShotNight extends App.Events.BaseEvent {
 				soldier.anus = 0;
 				soldier.skill.anal = 0;
 				soldier.skill.whoring = 0;
-				soldier.skill.combat = 1;
+				soldier.skill.combat = 70;
 				soldier.accent = random(0, 1);
 				soldier.behavioralFlaw = "arrogant";
 				soldier.hLength = 1;
diff --git a/src/data/backwardsCompatibility/datatypeCleanup.js b/src/data/backwardsCompatibility/datatypeCleanup.js
index ef2e3672e01..95fda7a3c3b 100644
--- a/src/data/backwardsCompatibility/datatypeCleanup.js
+++ b/src/data/backwardsCompatibility/datatypeCleanup.js
@@ -937,7 +937,7 @@ globalThis.SlaveDatatypeCleanup = (function SlaveDatatypeCleanup() {
 		slave.skill.anal = Math.clamp(+slave.skill.anal, 0, 100) || 0;
 		slave.skill.whoring = Math.clamp(+slave.skill.whoring, 0, 100) || 0;
 		slave.skill.entertainment = Math.clamp(+slave.skill.entertainment, 0, 100) || 0;
-		slave.skill.combat = Math.clamp(+slave.skill.combat, 0, 1) || 0;
+		slave.skill.combat = Math.clamp(+slave.skill.combat, 0, 100) || 0;
 		slave.skill.headGirl = Math.clamp(+slave.skill.headGirl, 0, 200) || 0;
 		slave.skill.recruiter = Math.clamp(+slave.skill.recruiter, 0, 200) || 0;
 		slave.skill.bodyguard = Math.clamp(+slave.skill.bodyguard, 0, 200) || 0;
diff --git a/src/endWeek/events/retire.js b/src/endWeek/events/retire.js
index bbbe38bee13..718ae9120b4 100644
--- a/src/endWeek/events/retire.js
+++ b/src/endWeek/events/retire.js
@@ -126,7 +126,7 @@ App.Events.retire = function(originalSlave, artRenderer) {
 			pornFame = pornFame.replace("$He is world famous for $his career in slave pornography. Millions are intimately familiar with", "enjoy");
 			pornFame = pornFame.replace(".", ",");
 			r.push(`In addition to ${his} annuity, you've laid the groundwork for ${him} to become wealthy by the way you publicized pornography of ${him}. Many thousands of people across the world are willing to pay to ${pornFame} and they enjoy it in part because ${he} doesn't mind it, either. ${He}'s in a position to make great money for doing on camera what ${he} would probably do anyway.`);
-		} else if ((slave.intelligence + slave.intelligenceImplant >= -50) && (slave.muscles > 5) && (slave.skill.combat >= 1) && hasAllLimbs(slave) && (slave.face > 10)) {
+		} else if ((slave.intelligence + slave.intelligenceImplant >= -50) && (slave.muscles > 5) && (slave.skill.combat > 60) && hasAllLimbs(slave) && (slave.face > 10)) {
 			r.push(`${He}'s pretty and deadly. If ${he} feels ${he} prefers wealth and danger to living on ${his} annuity, ${he}'ll have no trouble finding work. In fact, ${he}'ll likely have trouble sifting through all the mercenary organizations, businesses in need of attractive and competent guards for public spaces, and citizens looking for effective bodyguards willing to hire ${him}.`);
 		} else if ((slave.intelligence + slave.intelligenceImplant > 50) && (slave.intelligenceImplant >= 15)) {
 			r.push(`${He} has no skills extraordinary enough to bring prospective employers in search of ${him}, in this new, slaveowning economy, but ${he} is highly intelligent, educated, and has a small income. As you know from your own abundant personal experience, ${his} intelligence is a lever, ${his} annuity is a fulcrum, and with the two, ${he} may move the world someday. You have no doubt that, at the very least, ${he} will be far from the poorest of your citizens.`);
diff --git a/src/endWeek/minorInjuryResponse.js b/src/endWeek/minorInjuryResponse.js
index 79774938bd5..e487a520d15 100644
--- a/src/endWeek/minorInjuryResponse.js
+++ b/src/endWeek/minorInjuryResponse.js
@@ -49,7 +49,7 @@ globalThis.minorInjuryResponse = function(slave) {
 			} else if (slave.skill.whoring > jsRandom(1, 100)) {
 				o += ` ${slave.slaveName} is used to this sort of thing, and convinces him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`;
 				cashX(50, category, slave);
-			} else if (slave.skill.combat > 0) {
+			} else if (slave.skill.combat > 30) {
 				o += ` ${slave.slaveName} can take care of ${himself}, and ${he} successfully forces him to pay significant <span class="yellowgreen">compensation,</span> since abusing slaves is discouraged here.`;
 				cashX(50, category, slave);
 			}
@@ -63,7 +63,7 @@ globalThis.minorInjuryResponse = function(slave) {
 			} else if (slave.skill.whoring > jsRandom(1, 100)) {
 				o += ` ${slave.slaveName} is used to this sort of thing, and convinces him to pay minor <span class="yellowgreen">compensation.</span>`;
 				cashX(10, category, slave);
-			} else if (slave.skill.combat > 0) {
+			} else if (slave.skill.combat > 30) {
 				o += ` ${slave.slaveName} can take care of ${himself}, and ${he} successfully forces him to pay minor <span class="yellowgreen">compensation.</span>`;
 				cashX(10, category, slave);
 			}
diff --git a/src/endWeek/saGuardYou.js b/src/endWeek/saGuardYou.js
index afed183141f..325df3eb487 100644
--- a/src/endWeek/saGuardYou.js
+++ b/src/endWeek/saGuardYou.js
@@ -40,10 +40,11 @@ App.SlaveAssignment.guardYou = function saGuardYou(slave) {
 
 	/**
 	 * @param {App.Entity.SlaveState} slave
-	 *
+	 * TODO @Arkerthan
+	 *      Sync with actual deadliness calculation
 	 */
 	function publicImpression(slave) {
-		if (slave.skill.combat > 0) {
+		if (slave.skill.combat > 30) {
 			r.push(`${His} combat skills greatly increase ${his} deadliness.`);
 		}
 
@@ -199,13 +200,11 @@ App.SlaveAssignment.guardYou = function saGuardYou(slave) {
 			r.push(`${His} sharp teeth add nothing to ${his} actual effectiveness, but they're certainly intimidating.`);
 		}
 
-		if ((slave.skill.combat < 1) && (jsRandom(-100, 150) <= (slave.intelligence + slave.intelligenceImplant))) {
+		if (slave.skill.combat < 100) {
+			slave.skill.combat += 10 + Math.floor((slave.intelligence + slave.intelligenceImplant) / 32);
 			r.push(`After some experience guarding you, and diligent practice in the armory, <span class="green">${his} combat skills increase.</span>`);
-			slave.skill.combat += 1;
-		} else if (slave.skill.combat >= 1) {
-			r.push(`${He} maintains ${his} combat skill with practice in the armory.`);
 		} else {
-			r.push(`Though ${he} practices diligently, ${his} basic combat skills do not impress.`);
+			r.push(`${He} maintains ${his} combat skill with practice in the armory.`);
 		}
 
 		r.push(`${His} constant presence is`);
@@ -252,7 +251,7 @@ App.SlaveAssignment.guardYou = function saGuardYou(slave) {
 		const requirements = [
 			[slave.devotion > 95, "not devoted enough"],
 			[slave.trust > 50, "too fearful"],
-			[slave.skill.combat > 0, "hasn't had enough training"],
+			[slave.skill.combat > 60, "hasn't had enough training"],
 			[slave.intelligence + slave.intelligenceImplant > 15, "too stupid"],
 		];
 
@@ -262,15 +261,15 @@ App.SlaveAssignment.guardYou = function saGuardYou(slave) {
 			}
 		} else {
 			const successorCandidates = V.slaves.filter(function(s) { return (assignmentVisible(s) || s.assignment === Job.CONCUBINE || s.assignment === Job.WARDEN || s.assignment === Job.HEADGIRL || s.assignment === Job.QUARTER || s.assignment === Job.MASTERSUITE) && bodyguardSuccessorEligible(s); });
-			const combatSkilled = successorCandidates.filter(function(s) { return s.skill.combat > 0; });
+			const combatSkilled = successorCandidates.filter(function(s) { return s.skill.combat > 60; });
 
 			r.push(`${He}'s confident in ${his} martial skills, but smart enough to know that${slave.geneMods.immortality > 0 ? `, while technically immortal, ${he} isn't invincible` : ` ${he} isn't immortal`}, and devoted enough to worry about who will protect you should ${he} die.`);
 			if (combatSkilled.length < 2) {
 				let candidate = null;
-				let flawedTrainee = 0;
+				let flawedTrainee = false;
 				if (slave.relationship > 1) {
 					candidate = getSlave(slave.relationshipTarget);
-					if (candidate !== undefined && candidate.skill.combat === 0 && bodyguardSuccessorEligible(candidate)) {
+					if (candidate !== undefined && candidate.skill.combat <= 60 && bodyguardSuccessorEligible(candidate)) {
 						const candidatePronouns = getPronouns(candidate);
 						r.push(`${He} does ${his} best to train ${candidate.slaveName} whenever ${he} can, hoping that ${his}`);
 						if (slave.relationship > 4) {
@@ -286,37 +285,41 @@ App.SlaveAssignment.guardYou = function saGuardYou(slave) {
 					}
 				}
 				if (!candidate) {
-					if (V.HeadGirlID !== 0 && S.HeadGirl.skill.combat === 0 && bodyguardSuccessorEligible(S.HeadGirl)) {
+					if (V.HeadGirlID !== 0 && S.HeadGirl.skill.combat <= 60 && bodyguardSuccessorEligible(S.HeadGirl)) {
 						r.push(`${He} does ${his} best to train ${S.HeadGirl.slaveName} whenever ${he} can, hoping that your Head Girl can be made capable of stepping into ${his} place.`);
 						candidate = S.HeadGirl;
 					}
 				}
 				if (!candidate) {
-					if (V.ConcubineID !== 0 && S.Concubine.skill.combat === 0 && S.Concubine.devotion > 50 && S.Concubine.muscles >= -30 && S.Concubine.weight < 160 && S.Concubine.butt < 10 && S.Concubine.boobs < 25000 && S.Concubine.belly < 5000 && S.Concubine.balls < 20 && S.Concubine.dick < 15 && S.Concubine.fuckdoll === 0 && S.Concubine.fetish !== Fetish.MINDBROKEN && canWalk(S.Concubine)) {
+					if (V.ConcubineID !== 0 && S.Concubine.skill.combat <= 60 && S.Concubine.devotion > 50 && S.Concubine.muscles >= -30 && S.Concubine.weight < 160 && S.Concubine.butt < 10 && S.Concubine.boobs < 25000 && S.Concubine.belly < 5000 && S.Concubine.balls < 20 && S.Concubine.dick < 15 && S.Concubine.fuckdoll === 0 && S.Concubine.fetish !== Fetish.MINDBROKEN && canWalk(S.Concubine)) {
 						r.push(`${He} does ${his} best to train ${S.Concubine.slaveName} whenever ${he} can, hoping that your Concubine can be made capable of stepping into ${his} place.`);
 						if (S.Concubine.boobs >= 8000 || S.Concubine.butt >= 10 || S.Concubine.belly >= 5000 || S.Concubine.balls >= 10 || S.Concubine.dick >= 10 || S.Concubine.muscles < 0 || S.Concubine.weight >= 130) {
 							r.push(`${His} body is poorly suited for combat, but ${he} can learn to work around it with enough effort.`);
-							flawedTrainee = jsRandom(0, 50);
+							flawedTrainee = true;
 						}
 						candidate = S.Concubine;
 					}
 				}
 				if (!candidate) {
-					if (V.WardenessID !== 0 && S.Wardeness.skill.combat === 0 && bodyguardSuccessorEligible(S.Wardeness)) {
+					if (V.WardenessID !== 0 && S.Wardeness.skill.combat <= 60 && bodyguardSuccessorEligible(S.Wardeness)) {
 						r.push(`${He} does ${his} best to train ${S.Wardeness.slaveName} whenever ${he} can, hoping that your Wardeness can be made capable of stepping into ${his} place.`);
 						candidate = S.Wardeness;
 					}
 				}
 				if (!candidate) {
-					candidate = successorCandidates.find(function(s) { return s.skill.combat === 0; });
+					candidate = successorCandidates.find(function(s) { return s.skill.combat <= 60; });
 					if (candidate) {
 						r.push(`${He} does ${his} best to train ${candidate.slaveName} whenever ${he} can, hoping that ${his} subordinate can be made capable of stepping into ${his} place.`);
 					}
 				}
 				if (candidate) {
-					if ((slave.intelligence + slave.intelligenceImplant - flawedTrainee) > jsRandom(1, 500)) {
+					let gain = 10 + Math.floor((slave.intelligence + slave.intelligenceImplant) / 32);
+					if (flawedTrainee) {
+						gain/=2;
+					}
+					candidate.skill.combat += gain;
+					if (candidate.skill.combat>60) {
 						r.push(`By the end of the week, ${he} is satisfied that ${candidate.slaveName} <span class="green">has the combat skill</span> to contribute to your defense.`);
-						candidate.skill.combat = 1;
 					} else {
 						r.push(`Unfortunately, ${candidate.slaveName} wasn't able to pass the rigorous combat tests to ${his} satisfaction this week.`);
 					}
diff --git a/src/endWeek/saRecruitGirls.js b/src/endWeek/saRecruitGirls.js
index 5e6e4f31daf..1f68b81cae6 100644
--- a/src/endWeek/saRecruitGirls.js
+++ b/src/endWeek/saRecruitGirls.js
@@ -643,7 +643,7 @@ App.SlaveAssignment.recruitGirls = function recruitGirls(slave) {
 			} else if (arcology.FSAztecRevivalist !== "unset") {
 				if (targetArcology.FSAztecRevivalist !== "unset") {
 					r.push(`${He} advances Aztec Revivalism there by taking an active part in the bloodier`);
-					if (slave.skill.combat >= 1) {
+					if (slave.skill.combat > 60) {
 						r.push(`spectacles, which ${he}'s perfect for, since ${he} has enough experience with blood to make it look good.`);
 						targetArcology.FSAztecRevivalist++;
 					} else {
diff --git a/src/events/PE/peCombatTraining.js b/src/events/PE/peCombatTraining.js
index 0d3a6f05e7b..c8d2c07e1d9 100644
--- a/src/events/PE/peCombatTraining.js
+++ b/src/events/PE/peCombatTraining.js
@@ -35,7 +35,7 @@ App.Events.PECombatTraining = class PECombatTraining extends App.Events.BaseEven
 
 		function instruct() {
 			S.Bodyguard.trust += 4;
-			S.Bodyguard.skill.combat = 1;
+			S.Bodyguard.skill.combat = 15 + Math.floor((S.Bodyguard.intelligence + S.Bodyguard.intelligenceImplant) / 32);
 			return `${S.Bodyguard.slaveName} starts as you enter the range and don ear protection. ${He} is distracted by your body against ${hers} as you come in close to correct ${his} stance, but ${he} concentrates hard for you. You take whatever time you can spare over the week for serious lessons. ${He} <span class="skill inc">is diligent and learns well,</span> and <span class="trust inc">places greater trust</span> in your judgment.`;
 		}
 
diff --git a/src/events/PE/pePitFight.js b/src/events/PE/pePitFight.js
index 40afdc20121..f61cd2ed215 100644
--- a/src/events/PE/pePitFight.js
+++ b/src/events/PE/pePitFight.js
@@ -33,7 +33,7 @@ App.Events.PEPitFight = class PEPitFight extends App.Events.BaseEvent {
 
 		r.push(`Across the ring, ${his} opponent's owner nods civilly to you and examines ${slave.slaveName}.`);
 
-		if (slave.skill.combat > 0) {
+		if (slave.skill.combat > 30) {
 			r.push(`${His} combat skills greatly increase ${his} deadliness.`);
 		}
 
diff --git a/src/events/PESS/pessBodyguardBeatdown.js b/src/events/PESS/pessBodyguardBeatdown.js
index 3e01011da37..e15003b65af 100644
--- a/src/events/PESS/pessBodyguardBeatdown.js
+++ b/src/events/PESS/pessBodyguardBeatdown.js
@@ -43,10 +43,10 @@ App.Events.pessBodyguardBeatdown = class pessBodyguardBeatdown extends App.Event
 			choices.push(new App.Events.Result(`${He} de-escalates the situation with tact`, persuade));
 		}
 
-		if (S.Bodyguard.skill.combat < 1) {
-			choices.push(new App.Events.Result(null, null, `Your bodyguard lacks the combat skill required to fight him hand to hand.`));
-		} else {
+		if (S.Bodyguard.skill.combat > 30) {
 			choices.push(new App.Events.Result(`${He} fights him hand to hand`, fight));
+		} else {
+			choices.push(new App.Events.Result(null, null, `Your bodyguard lacks the combat skill required to fight him hand to hand.`));
 		}
 
 		choices.push(new App.Events.Result(`${He} fires a few dozen warning shots`, warn));
diff --git a/src/events/PESS/pessBodyguardBedtime.js b/src/events/PESS/pessBodyguardBedtime.js
index 0b5b5a99baa..d2e928df1d8 100644
--- a/src/events/PESS/pessBodyguardBedtime.js
+++ b/src/events/PESS/pessBodyguardBedtime.js
@@ -2,7 +2,7 @@ App.Events.pessBodyguardBedtime = class pessBodyguardBedtime extends App.Events.
 	eventPrerequisites() {
 		return [
 			() => !!S.Bodyguard,
-			() => S.Bodyguard.skill.combat !== 0
+			() => S.Bodyguard.skill.combat > 30
 		];
 	}
 
diff --git a/src/events/RE/reAWOL.js b/src/events/RE/reAWOL.js
index bec0e3d75ab..b4974b09ae2 100644
--- a/src/events/RE/reAWOL.js
+++ b/src/events/RE/reAWOL.js
@@ -29,7 +29,7 @@ App.Events.REAWOL = class REAWOL extends App.Events.BaseEvent {
 		slave.anus = 0;
 		slave.skill.anal = 0;
 		slave.skill.whoring = 0;
-		slave.skill.combat = 1;
+		slave.skill.combat = 70;
 		slave.behavioralFlaw = "arrogant";
 		slave.sexualFlaw = "crude";
 		slave.hStyle = "strip";
diff --git a/src/events/RE/reBoomerang.js b/src/events/RE/reBoomerang.js
index f37b292dfed..146144bfc63 100644
--- a/src/events/RE/reBoomerang.js
+++ b/src/events/RE/reBoomerang.js
@@ -420,7 +420,7 @@ App.Events.REBoomerang = class REBoomerang extends App.Events.BaseEvent {
 				r.push(Spoken(slave, `"I had to kill, um, girls. I, I can't. Couldn't. Not again."`));
 				slave.behavioralFlaw = "odd";
 				slave.sexualFlaw = "crude";
-				slave.skill.combat = 1;
+				slave.skill.combat = Math.max(slave.skill.combat, 50);
 				break;
 			case "neoimperialist arcology":
 				r.push(Spoken(slave, `"It was horrible."`));
diff --git a/src/events/RE/reMalefactor.js b/src/events/RE/reMalefactor.js
index b26f7ec9ae3..2278ebd03fd 100644
--- a/src/events/RE/reMalefactor.js
+++ b/src/events/RE/reMalefactor.js
@@ -854,7 +854,7 @@ App.Events.REMalefactor = class REMalefactor extends App.Events.BaseEvent {
 					slave.skill.oral = 0;
 					slave.skill.anal = 0;
 					slave.skill.whoring = 0;
-					slave.skill.combat = 1;
+					slave.skill.combat = 70;
 					slave.anus = 0;
 					setHealth(slave, jsRandom(60, 80), undefined, undefined, 0, 10);
 					slave.behavioralFlaw = "arrogant";
diff --git a/src/events/RE/rePokerNight.js b/src/events/RE/rePokerNight.js
index 0cd724f2231..aa3e5c35ea9 100644
--- a/src/events/RE/rePokerNight.js
+++ b/src/events/RE/rePokerNight.js
@@ -90,7 +90,7 @@ App.Events.REPokerNight = class REPokerNight extends App.Events.BaseEvent {
 				slave.anus = 0;
 				slave.skill.anal = 0;
 				slave.skill.whoring = 0;
-				slave.skill.combat = 1;
+				slave.skill.combat = 70;
 				slave.accent = random(0, 1);
 				slave.behavioralFlaw = "arrogant";
 				slave.hLength = 1;
diff --git a/src/events/RE/rePregInventorShowOff.js b/src/events/RE/rePregInventorShowOff.js
index cae18136fca..30fa6ac21e8 100644
--- a/src/events/RE/rePregInventorShowOff.js
+++ b/src/events/RE/rePregInventorShowOff.js
@@ -471,7 +471,7 @@ App.Events.rePregInventorShowOff = class rePregInventorShowOff extends App.Event
 			if (!canTalk(slave)) {
 				if (hasAnyArms(slave)) {
 					r.push(`${He} waves ${his} ${arms} in mock dismay`);
-					if (slave.skill.combat > 0) {
+					if (slave.skill.combat > 30) {
 						r.push(`and lowers ${his} guard`);
 					}
 					r.push(`as you prepare to wrestle ${him} in the pool of goop.`);
@@ -479,7 +479,7 @@ App.Events.rePregInventorShowOff = class rePregInventorShowOff extends App.Event
 					r.push(`${He} waves ${his} stubs in mock dismay as you prepare to wrestle ${him} in the pool of goop.`);
 				}
 			} else {
-				r.push(Spoken(slave, `"Oh no,"`), `${he} ${say}s in mock dismay${(slave.skill.combat > 0) ? `, lowering ${his} guard` : ``}. "My ${Master} is going to wrestle me into submission in this hot, heavy, goo pool. Whatever will I do?"`);
+				r.push(Spoken(slave, `"Oh no,"`), `${he} ${say}s in mock dismay${(slave.skill.combat > 30) ? `, lowering ${his} guard` : ``}. "My ${Master} is going to wrestle me into submission in this hot, heavy, goo pool. Whatever will I do?"`);
 			}
 			r.push(`You circle around ${him}, slowly approaching ${him}, and ${he} uses the pool's mobility assistance tools to rotate ${his} body so that ${he} can just barely keep you in ${his} gaze, drizzling gel over ${his} belly as ${he} keeps it between you and ${him} to use as a protective barrier. When you're close enough to touch the apex of ${his} fecund body, you leap forward through the gel, diving to one side and disappearing under it. Your momentum carries you a reasonable distance despite the resistance of the thick substance and you pop back up directly behind ${him}. You grab ${him} under ${his} armpits, pressing your`);
 			if (V.PC.dick !== 0) {
diff --git a/src/events/RE/reRoyalBlood.js b/src/events/RE/reRoyalBlood.js
index 1ff12f942f6..6f02d3fc4d2 100644
--- a/src/events/RE/reRoyalBlood.js
+++ b/src/events/RE/reRoyalBlood.js
@@ -735,7 +735,7 @@ App.Events.RERoyalBlood = class RERoyalBlood extends App.Events.BaseEvent {
 			slave.intelligenceImplant = 15;
 			slave.skill.anal = 0;
 			slave.skill.oral = 0;
-			slave.skill.combat = 1;
+			slave.skill.combat = 40;
 			setHealth(slave, jsRandom(30, 60), 0, 0, 0, 0);
 			slave.behavioralFlaw = either("arrogant", "bitchy");
 
diff --git a/src/events/REFS/refsKnightlyDuel.js b/src/events/REFS/refsKnightlyDuel.js
index 43601b02677..553601054a0 100644
--- a/src/events/REFS/refsKnightlyDuel.js
+++ b/src/events/REFS/refsKnightlyDuel.js
@@ -12,7 +12,7 @@ App.Events.refsKnightlyDuel = class refsKnightlyDuel extends App.Events.BaseEven
 		slave.career = "spec ops";
 		slave.devotion = random(-80, -60);
 		slave.muscles = random(50, 75);
-		slave.skill.combat = 1;
+		slave.skill.combat = 70;
 		slave.sexualFlaw = "malicious";
 		slave.behavioralQuirk = "none";
 		slave.trust = random(-30, -20);
diff --git a/src/events/RESS/mutinyAttempt.js b/src/events/RESS/mutinyAttempt.js
index 772aa0b101d..f3c9b75f4f0 100644
--- a/src/events/RESS/mutinyAttempt.js
+++ b/src/events/RESS/mutinyAttempt.js
@@ -37,7 +37,7 @@ App.Events.RESSMutinyAttempt = class RESSMutinyAttempt extends App.Events.BaseEv
 		r.push(`Finishing your work, you lean back for a well-deserved break. Your peace is quickly disturbed by several loud smashes from down the penthouse hall. As you get up from your desk, you hear somebody running down the hallway, and before you know it,`);
 		r.push(contextualIntro(V.PC, eventSlave, true));
 		r.push(`is inside. ${He} is looking quite treacherous and`);
-		if (eventSlave.skill.combat > 0) {
+		if (eventSlave.skill.combat > 30) {
 			r.push(`relatively confident.`);
 		} else {
 			r.push(`somewhat unsure.`);
@@ -105,7 +105,7 @@ App.Events.RESSMutinyAttempt = class RESSMutinyAttempt extends App.Events.BaseEv
 					he2, his2
 				} = getPronouns(S.HeadGirl).appendSuffix("2");
 				r.push(`You jump in surprise as ${S.HeadGirl.slaveName} tackles ${him} off you and to the floor`);
-				if (S.HeadGirl.skill.combat > 0) {
+				if (S.HeadGirl.skill.combat > 60) {
 					r.push(`where ${he2} twists ${his} arm in an arm hold until the rebellious slave stops struggling.`);
 				} else {
 					r.push(`where ${he2} settles ${his2} weight on the struggling rebel, lacking any better idea of what to do.`);
diff --git a/src/events/RETS/reSimpleAssault.js b/src/events/RETS/reSimpleAssault.js
index cbb4d157afe..52383f8ea2c 100644
--- a/src/events/RETS/reSimpleAssault.js
+++ b/src/events/RETS/reSimpleAssault.js
@@ -25,7 +25,7 @@ App.Events.RETSSimpleAssault = class RETSSimpleAssault extends App.Events.BaseEv
 				s => (canDoAnal(s) && s.anus !== 0) || (canDoVaginal(s) && s.vagina !== 0),
 				s => s.devotion < 20,
 				s => s.belly < 2000,
-				s => s.skill.combat === 0,
+				s => s.skill.combat <=30,
 				s => s.muscles <= 30
 			]
 		];
diff --git a/src/events/intro/acquisition.js b/src/events/intro/acquisition.js
index 0e25849d700..5fb5199d62b 100644
--- a/src/events/intro/acquisition.js
+++ b/src/events/intro/acquisition.js
@@ -742,7 +742,7 @@ App.Intro.acquisition = function() {
 				setHealth(slave, 100, 0, 0, 0, jsRandom(10, 30));
 				slave.face = random(0, 55);
 				slave.muscles = random(25, 50);
-				slave.skill.combat = 1;
+				slave.skill.combat = 70;
 				slave.behavioralFlaw = "none";
 				slave.behavioralQuirk = "fitness";
 				slave.clothes = "a toga";
@@ -760,7 +760,7 @@ App.Intro.acquisition = function() {
 				setHealth(slave, 100, 0, 0, 0, jsRandom(10, 30));
 				slave.face = random(20, 75);
 				slave.muscles = random(25, 60);
-				slave.skill.combat = 1;
+				slave.skill.combat = 70;
 				slave.behavioralFlaw = "none";
 				slave.behavioralQuirk = "fitness";
 				slave.skill.entertainment = random(15, 35);
@@ -776,7 +776,7 @@ App.Intro.acquisition = function() {
 				slave.trust = 75;
 				setHealth(slave, jsRandom(-20, 20), 0, 0, 0, 0);
 				slave.muscles = random(50, 75);
-				slave.skill.combat = 1;
+				slave.skill.combat = 70;
 				slave.sexualFlaw = "malicious";
 				slave.behavioralQuirk = "none";
 				slave.clothes = "a huipil";
diff --git a/src/events/nonRandom/daughters/pBombing.js b/src/events/nonRandom/daughters/pBombing.js
index 4527f383f25..8020a3be723 100644
--- a/src/events/nonRandom/daughters/pBombing.js
+++ b/src/events/nonRandom/daughters/pBombing.js
@@ -61,7 +61,7 @@ App.Events.PBombing = class PBombing extends App.Events.BaseEvent {
 				cashX(-1000, "event", S.Bodyguard);
 				repX(2500, "event", S.Bodyguard);
 				V.arcologies[0].prosperity += 1;
-			} else if (S.Bodyguard.skill.combat > 0) {
+			} else if (S.Bodyguard.skill.combat > 30) {
 				r.push(`${S.Bodyguard.slaveName} glances at you to check that ${his} principal is alive for the moment, already`);
 				if ((S.Bodyguard.muscles + S.Bodyguard.height - 100) / 25 > 5) {
 					r.push(`getting ${his} light machine gun into action. Since they're so close, ${he} doesn't even bother to shoulder the weapon, simply using ${his} weapon's firepower to dump rounds into each attacker.`);
diff --git a/src/events/nonRandom/rival/pRivalryCapture.js b/src/events/nonRandom/rival/pRivalryCapture.js
index 2b631f494a2..5e738015335 100644
--- a/src/events/nonRandom/rival/pRivalryCapture.js
+++ b/src/events/nonRandom/rival/pRivalryCapture.js
@@ -230,7 +230,7 @@ globalThis.pRivalryCapture = function(condition) {
 				slave.skill.anal = 0;
 				slave.skill.whoring = 0;
 				slave.skill.entertainment = 15;
-				slave.skill.combat = 1;
+				slave.skill.combat = 40;
 				slave.behavioralFlaw = "hates men";
 				slave.behavioralQuirk = "fitness";
 				slave.sexualFlaw = "hates anal";
@@ -297,7 +297,7 @@ globalThis.pRivalryCapture = function(condition) {
 				slave.skill.anal = 15;
 				slave.skill.whoring = 0;
 				slave.skill.entertainment = 0;
-				slave.skill.combat = 1;
+				slave.skill.combat = 40;
 				slave.piercing.genitals.weight = 1;
 				slave.piercing.ear.weight = 1;
 				slave.behavioralFlaw = "hates men";
diff --git a/src/events/nonRandom/rival/pRivalryHostage.js b/src/events/nonRandom/rival/pRivalryHostage.js
index a28f33a52f8..92b84a03ce2 100644
--- a/src/events/nonRandom/rival/pRivalryHostage.js
+++ b/src/events/nonRandom/rival/pRivalryHostage.js
@@ -561,11 +561,11 @@ App.Events.pRivalryHostage = function() {
 					if (V.PC.career === "gang" || V.PC.actualAge > 24) {
 						slave.custom.tattoo = "$He has your former gang's sign tattooed on $his neck.";
 						slave.career = "a gang member";
-						slave.skill.combat = 1;
+						slave.skill.combat = 70;
 					} else if (V.PC.career === "hoodlum" || V.PC.actualAge > 16) {
 						slave.custom.tattoo = "$He has the gang's sign that you rolled with tattooed on $his neck.";
 						slave.career = "a gang member";
-						slave.skill.combat = 1;
+						slave.skill.combat = 70;
 					} else {
 						slave.custom.tattoo = "$He has the gang's sign that you associated with tattooed on $his neck.";
 						slave.career = "street urchin";
@@ -627,7 +627,7 @@ App.Events.pRivalryHostage = function() {
 					}
 					slave.face = 55;
 					slave.intelligence = 100;
-					slave.skill.combat = 1;
+					slave.skill.combat = 70;
 					return slave;
 				},
 				engineer() {
diff --git a/src/events/reRecruit/gangLeader.js b/src/events/reRecruit/gangLeader.js
index 794465901fe..70c990795dd 100644
--- a/src/events/reRecruit/gangLeader.js
+++ b/src/events/reRecruit/gangLeader.js
@@ -104,7 +104,7 @@ App.Events.recGangLeader = class recGangLeader extends App.Events.BaseEvent {
 			slave.skill.anal = 0;
 			slave.skill.oral = 0;
 			slave.skill.whoring = 0;
-			slave.skill.combat = 1;
+			slave.skill.combat = 40;
 			slave.hLength = random(10, 30);
 			slave.boobs = 150;
 			slave.vagina = -1;
diff --git a/src/events/reRecruit/heldPOW.js b/src/events/reRecruit/heldPOW.js
index d2a00ff2fd2..de2940d5228 100644
--- a/src/events/reRecruit/heldPOW.js
+++ b/src/events/reRecruit/heldPOW.js
@@ -103,7 +103,7 @@ App.Events.recHeldPOW = class recHeldPOW extends App.Events.BaseEvent {
 			slave.muscles = random(-80, 0);
 			slave.weight = random(-80, -60);
 			slave.waist = random(-40, -20);
-			slave.skill.combat = 1;
+			slave.skill.combat = 70;
 			slave.boobs = random(3, 6) * 100;
 			slave.behavioralFlaw = "odd";
 			slave.behavioralQuirk = "insecure";
diff --git a/src/events/reRecruit/rogueCyborg.js b/src/events/reRecruit/rogueCyborg.js
index d3ada444949..00e67aaac1a 100644
--- a/src/events/reRecruit/rogueCyborg.js
+++ b/src/events/reRecruit/rogueCyborg.js
@@ -66,7 +66,7 @@ App.Events.recRogueCyborg = class recRogueCyborg extends App.Events.BaseEvent {
 			setHealth(slave, 100);
 			slave.weight = random(-11 - 30);
 			slave.waist = random(-11, -40);
-			slave.skill.combat = 1;
+			slave.skill.combat = 70;
 			configureLimbs(slave, "all", 6);
 			slave.teeth = "pointy";
 			slave.muscles = random(30, 70);
diff --git a/src/events/recFS/recfsNeoImperialist.js b/src/events/recFS/recfsNeoImperialist.js
index f84bbaa8bf2..5a1d4faa0f7 100644
--- a/src/events/recFS/recfsNeoImperialist.js
+++ b/src/events/recFS/recfsNeoImperialist.js
@@ -26,7 +26,7 @@ App.Events.recFSNeoImperialist = class recFSNeoImperialist extends App.Events.Ba
 		slave.face = random(15, 50);
 		slave.skill.whoring = 0;
 		slave.skill.entertainment = 0;
-		slave.skill.combat = 1;
+		slave.skill.combat = 70;
 		slave.intelligence = random(-50, 50);
 		slave.intelligenceImplant = 0;
 		slave.teeth = "normal";
diff --git a/src/events/recFS/recfsSlaveProfessionalismTwo.js b/src/events/recFS/recfsSlaveProfessionalismTwo.js
index 279bf95f125..644ca6c9a87 100644
--- a/src/events/recFS/recfsSlaveProfessionalismTwo.js
+++ b/src/events/recFS/recfsSlaveProfessionalismTwo.js
@@ -27,7 +27,7 @@ App.Events.recFSSlaveProfessionalismTwo = class recFSSlaveProfessionalismTwo ext
 		slave.skill.anal = 100;
 		slave.skill.whoring = 100;
 		slave.skill.entertainment = 100;
-		slave.skill.combat = 1;
+		slave.skill.combat = 40;
 		slave.behavioralFlaw = "none";
 		slave.sexualFlaw = "none";
 
diff --git a/src/events/scheduled/assholeKnight.js b/src/events/scheduled/assholeKnight.js
index 2e4953c0e69..1353cbeca7f 100644
--- a/src/events/scheduled/assholeKnight.js
+++ b/src/events/scheduled/assholeKnight.js
@@ -18,7 +18,7 @@ App.Events.SEAssholeKnight = class SEAssholeKnight extends App.Events.BaseEvent
 		assholeKnight.career = "spec ops";
 		assholeKnight.devotion = random(-80, -60);
 		assholeKnight.muscles = random(50, 75);
-		assholeKnight.skill.combat = 1;
+		assholeKnight.skill.combat = 70;
 		assholeKnight.sexualFlaw = "malicious";
 		assholeKnight.behavioralQuirk = "none";
 		assholeKnight.trust = random(-30, -20);
diff --git a/src/events/scheduled/murderAttempt.js b/src/events/scheduled/murderAttempt.js
index 64d9629ffa5..7c09350860e 100644
--- a/src/events/scheduled/murderAttempt.js
+++ b/src/events/scheduled/murderAttempt.js
@@ -208,7 +208,7 @@ App.Events.MurderAttempt = class MurderAttempt extends App.Events.BaseEvent {
 			} else {
 				let r = [];
 				r.push(`"If you say so..." ${He} continues and starts ${his} explanation anew, sometimes with great gestures, but never actually getting to the point. You start to grow bored of ${his} drivel`);
-				if (S.Bodyguard.intelligence + S.Bodyguard.intelligenceImplant + (30 * S.Bodyguard.skill.combat) > 60) {
+				if (S.Bodyguard.intelligence + S.Bodyguard.intelligenceImplant + (S.Bodyguard.skill.combat/2) > 60) {
 					r.push(`until ${he} does one of ${his} grand motions again and ${S.Bodyguard.slaveName} jumps forward,`);
 					if (perceptionChance()) {
 						r.push("just a moment faster than you,");
diff --git a/src/events/scheduled/pitFightLethal.js b/src/events/scheduled/pitFightLethal.js
index fd05d6e975d..3296119f2e2 100644
--- a/src/events/scheduled/pitFightLethal.js
+++ b/src/events/scheduled/pitFightLethal.js
@@ -165,7 +165,7 @@ App.Facilities.Pit.lethalFight = function(fighters) {
 		}
 
 		function skill() {
-			if (fighter.skill.combat > 0) {
+			if (fighter.skill.combat > 30) {
 				return `${His} grip on ${his} sword is sure and easy.`;
 			}
 		}
@@ -404,7 +404,7 @@ App.Facilities.Pit.lethalFight = function(fighters) {
 						repX(-20, "pit", loser);
 					}
 				} else if (animal.deadliness < deadliness(loser).value + 3) {
-					if (loser.skill.combat > 0) {
+					if (loser.skill.combat > 30) {
 						r.push(`${loser.slaveName} is fairly confident in ${his} fighting abilities, and ${he} knows that this fight is fairly evenly matched.`);
 					} else {
 						r.push(`${loser.slaveName} doesn't know how to handle a sword, but ${he} feels fairly confident in ${his} chances all the same.`);
@@ -448,7 +448,7 @@ App.Facilities.Pit.lethalFight = function(fighters) {
 						repX(100, "pit", loser);
 					}
 				} else {
-					if (loser.skill.combat > 0) {
+					if (loser.skill.combat > 30) {
 						r.push(`${loser.slaveName} is reasonably confident in ${his} fighting abilities, but ${he} isn't sure how to go about attacking the ${animal.species}. ${He} decides to open with a series of wide horizontal slashes, but the beast manages to stay out of range of ${his} sword. Realizing this isn't working, ${he} lunges at the animal, leaving ${his} side exposed. The ${animal.species} sees this and ${animal.type === "hooved"
 							? `headbutts ${him} as hard as it can, sending ${him} flying into the side of ${V.pit.name}. Battered`
 							: `leaves some ${App.UI.DOM.makeElement("span", `deep claw marks in ${his} side.`, ['health', 'dec'])} Bleeding`} and unable to stand, ${loser.slaveName} can do little to stop the ${animal.species} from finishing ${him} off with a ${animal.type === "canine" ? `fierce bite of its fangs to ${his} throat.` : animal.type === "hooved" ? `swift kick to the head.` : `ferocious swipe of its claws to ${his} throat.`}`);
@@ -552,7 +552,7 @@ App.Facilities.Pit.lethalFight = function(fighters) {
 					cashX(40, "pit", winner);
 				}
 			} else if (winnerDeadliness > (loserDeadliness + 3)) {
-				if (winner.skill.combat > 0) {
+				if (winner.skill.combat > 30) {
 					r.push(`${winner.slaveName} wants to win, and ${he} opens the fight with a furious attack. ${loser.slaveName} manages to get ${his2} blade up, blocking a strike with a ringing clash and a few sparks, but by doing so leaves ${his2} abdomen open and obscures ${his2} vision enough that ${he2} is unprepared for the following horizontal slash, which opens ${his2} belly wide. The stricken ${girl2} collapses, feebly trying to push ${his2} viscera back into place. Whether out of mercy or a desire to get it over with, ${winner.slaveName} quickly removes the dying ${girl2}'s head.`);
 
 					if (V.pit.audience === "free") {
@@ -579,7 +579,7 @@ App.Facilities.Pit.lethalFight = function(fighters) {
 						cashX(4000, "pit", winner);
 					}
 				}
-			} else if (winner.skill.combat > 0 && loser.skill.combat > 0) {
+			} else if (winner.skill.combat > 30 && loser.skill.combat > 30) {
 				r.push(`Upon your word the two combatants approach each other warily, both knowing the other is reasonably competent. Before long they are trading thrust and parry, swing and block. ${winner.slaveName} is slowly pressed back, so ${he} decides to change the nature of the fight. After three tries ${he} manages to force ${loser.slaveName} to close, suffering a `, App.UI.DOM.makeElement("span", `nearly severed ear`, ['health', 'dec']), ` as ${he} does. ${loser.slaveName} realizes ${he2} only retains an advantage at long range but cannot back up fast enough to avoid close combat. ${loser.slaveName} is forced back fast enough that ${he2} trips; ${he2}'s barely fallen on ${his2} back before ${he2} grunts with shock and pain, dying with a look of surprise as ${he2} stares at the sword growing out of ${his2} chest.`);
 
 				if (V.pit.audience === "free") {
@@ -808,10 +808,10 @@ App.Facilities.Pit.lethalFight = function(fighters) {
 
 			V.pit.slaveFightingBodyguard = null;
 
-			if (winner.skill.combat === 0) {
+			if (winner.skill.combat < 60) {
 				r.push(`With lethal experience in ${V.pit.name}, ${winner.slaveName} has `, experienceSpan);
 
-				winner.skill.combat++;
+				winner.skill.combat += 10 + Math.floor((winner.intelligence + winner.intelligenceImplant) / 32);
 			}
 
 			winner.counter.pitKills++;
diff --git a/src/events/scheduled/pitFightNonlethal.js b/src/events/scheduled/pitFightNonlethal.js
index 2f2c89b8561..e6e731af253 100644
--- a/src/events/scheduled/pitFightNonlethal.js
+++ b/src/events/scheduled/pitFightNonlethal.js
@@ -197,7 +197,7 @@ App.Facilities.Pit.nonlethalFight = function(fighters) {
 		}
 
 		function skill() {
-			if (fighter.skill.combat > 0) {
+			if (fighter.skill.combat > 30) {
 				return `${His} stance is obviously well-practiced.`;
 			}
 		}
@@ -499,7 +499,7 @@ App.Facilities.Pit.nonlethalFight = function(fighters) {
 					cashX(40, "pit", winner);
 				}
 			} else if (winnerDeadliness > (loserDeadliness + 3)) {
-				if (winner.skill.combat > 0) {
+				if (winner.skill.combat > 30) {
 					r.push(`${winner.slaveName} wants to win, and ${he} opens the fight with a furious attack. ${loser.slaveName} manages to get ${his2} ${hasBothArms(loser) ? `forearms` : `forearm`} up, blocking a few blows, but by doing so leaves ${his2} abdomen open and obscures ${his2} vision enough that ${he2} is unprepared for the following kidney strike, which brings ${him2} gasping to one knee. ${winner.slaveName} lets ${him2} rise just a little before delivering a calculated hard right that sends ${loser.slaveName} to the mat.`);
 
 					if (V.pit.audience === "free") {
@@ -550,7 +550,7 @@ App.Facilities.Pit.nonlethalFight = function(fighters) {
 
 					cashX(1000, "pit", winner);
 				}
-			} else if (winner.skill.combat > 0 && loser.skill.combat > 0) {
+			} else if (winner.skill.combat > 30 && loser.skill.combat > 30) {
 				const healthSpans = [App.UI.DOM.makeElement("span", `broken nose`, ["health", "dec"]), App.UI.DOM.makeElement("span", `to the point of damage`, ["health", "dec"])];
 
 				r.push(`Upon your word the two combatants approach each other warily, both knowing the other is reasonably competent. Before long they are trading expert blows. ${winner.slaveName} is getting the worst of it, so ${he} decides to change the nature of the fight. After three tries ${he} manages to bring ${loser.slaveName} to the ground, suffering a `, healthSpans[0], ` as ${he} does. ${loser.slaveName} tries to break the imperfect hold but only earns ${himself2} an elbow to the face. ${He2}'s furious and ${winner.slaveName} is obliged to wrench ${his2} arm `, healthSpans[1], ` before ${he2} allows ${himself2} to go limp.`);
@@ -1018,12 +1018,12 @@ App.Facilities.Pit.nonlethalFight = function(fighters) {
 			App.Events.addParagraph(parent, [...rape(), ...rapeEffects()]);
 
 			r = [];
-			if (winner.skill.combat === 0 && random(1, 100) < (20 + winner.devotion)) {
-				const experienceSpan = App.UI.DOM.makeElement("span", `learned basic combat skills.`, ["improvement"]);
+			if (winner.skill.combat < 60) {
+				const experienceSpan = App.UI.DOM.makeElement("span", `improved their combat skills.`, ["improvement"]);
 
+				winner.skill.combat += 10 + Math.floor((winner.intelligence + winner.intelligenceImplant) / 32);
 				r.push(`With experience in ${V.pit.name}, ${winner.slaveName} has `, experienceSpan);
 
-				winner.skill.combat++;
 			}
 
 			loser.counter.pitLosses++;
diff --git a/src/events/scheduled/seCoursing.js b/src/events/scheduled/seCoursing.js
index 4115c6b3f26..bbfa849328a 100644
--- a/src/events/scheduled/seCoursing.js
+++ b/src/events/scheduled/seCoursing.js
@@ -671,7 +671,7 @@ App.Events.SECoursing = class SECoursing extends App.Events.BaseEvent {
 						r.push(`One of ${his} rival lurchers has the same idea, however, and tries to trip ${him} up.`);
 						if (!canSee(activeLurcher)) {
 							r.push(`Unable to see it coming, ${he} goes down with a crash; ${his} course is over.`);
-						} else if (activeLurcher.skill.combat === 1) {
+						} else if (activeLurcher.skill.combat > 60) {
 							r.push(`${He} parries the attempt with contemptuous ease and catches up to ${his} new target.`);
 							caught = true;
 						} else if (activeLurcher.tail === "combat") {
@@ -711,7 +711,7 @@ App.Events.SECoursing = class SECoursing extends App.Events.BaseEvent {
 				} else if (!canSee(activeLurcher) && random(1, 3) === 1) {
 					r.push(`${His} prey takes advantage of ${his} lack of eyesight, baiting ${activeLurcher.slaveName} to dive in the wrong direction. As ${he} rises to ${his} feet, the slave is too far gone to make another lunge. ${activeLurcher.slaveName}'s course is over.`);
 					caught = false;
-				} else if (activeLurcher.skill.combat === 1) {
+				} else if (activeLurcher.skill.combat > 60) {
 					r.push(`${His} tackle is expert: ${he} wraps ${his} quarry up and pulls ${him2} down, falling on top of the struggling body.`);
 				} else if (activeLurcher.muscles > 30) {
 					r.push(`${He}'s burly enough that ${he} tackles ${his} quarry by simple force, an approach no less effective for its inelegance.`);
diff --git a/src/events/scheduled/seRaiding.js b/src/events/scheduled/seRaiding.js
index 4b216546253..e94dcba6b7a 100644
--- a/src/events/scheduled/seRaiding.js
+++ b/src/events/scheduled/seRaiding.js
@@ -449,7 +449,7 @@ App.Events.SERaiding = class SERaiding extends App.Events.BaseEvent {
 					slave.skill.oral = 35;
 					slave.skill.anal = 15;
 					slave.skill.whoring = 0;
-					slave.skill.combat = 1;
+					slave.skill.combat = 70;
 					slave.skill.entertainment = 10;
 					slave.intelligence = random(20, 60);
 					slave.intelligenceImplant = 15;
@@ -465,7 +465,7 @@ App.Events.SERaiding = class SERaiding extends App.Events.BaseEvent {
 					slave.skill.anal = 0;
 					slave.skill.oral = 0;
 					slave.skill.whoring = 0;
-					slave.skill.combat = 1;
+					slave.skill.combat =70;
 					slave.intelligence = random(20, 60);
 					slave.intelligenceImplant = 15;
 					slave.hStyle = either("buzzcut", "bun", "shaved", "neat");
@@ -496,7 +496,7 @@ App.Events.SERaiding = class SERaiding extends App.Events.BaseEvent {
 					slave.skill.oral = 35;
 					slave.skill.anal = 15;
 					slave.skill.whoring = 0;
-					slave.skill.combat = 1;
+					slave.skill.combat = 70;
 					slave.skill.entertainment = 10;
 					slave.intelligenceImplant = 15;
 					slave.teeth = "normal";
@@ -648,7 +648,7 @@ App.Events.SERaiding = class SERaiding extends App.Events.BaseEvent {
 					slave.skill.oral = 35;
 					slave.skill.anal = 15;
 					slave.skill.whoring = 0;
-					slave.skill.combat = 1;
+					slave.skill.combat = 70;
 					slave.skill.entertainment = 10;
 					slave.intelligenceImplant = 15;
 					slave.weight = random(-10, 90);
diff --git a/src/facilities/nursery/nurseryDatatypeCleanup.js b/src/facilities/nursery/nurseryDatatypeCleanup.js
index f92a3b63a01..e79986ba6ed 100644
--- a/src/facilities/nursery/nurseryDatatypeCleanup.js
+++ b/src/facilities/nursery/nurseryDatatypeCleanup.js
@@ -412,7 +412,7 @@ App.Facilities.Nursery.ChildDatatypeCleanup = function(child) {
 		child.skill.anal = Math.clamp(+child.skill.anal, 0, 100) || 0;
 		child.skill.whoring = Math.clamp(+child.skill.whoring, 0, 100) || 0;
 		child.skill.entertainment = Math.clamp(+child.skill.entertainment, 0, 100) || 0;
-		child.skill.combat = Math.clamp(+child.skill.combat, 0, 1) || 0;
+		child.skill.combat = Math.clamp(+child.skill.combat, 0, 100) || 0;
 		child.skill.headGirl = Math.clamp(+child.skill.headGirl, 0, 200) || 0;
 		child.skill.recruiter = Math.clamp(+child.skill.recruiter, 0, 200) || 0;
 		child.skill.bodyguard = Math.clamp(+child.skill.bodyguard, 0, 200) || 0;
diff --git a/src/interaction/sellSlave.js b/src/interaction/sellSlave.js
index 54326d07da2..5eb19219976 100644
--- a/src/interaction/sellSlave.js
+++ b/src/interaction/sellSlave.js
@@ -54,7 +54,7 @@ App.Interact.sellSlave = function(slave) {
 	const costObj = slaveCost(slave, false, false, false, true);
 	let cost = random(70, 80) / 100 * costObj.cost;
 
-	if (V.secExpEnabled > 0 && V.SecExp.edicts.defense.militia === 5 && slave.skill.combat > 0) {
+	if (V.secExpEnabled > 0 && V.SecExp.edicts.defense.militia === 5 && slave.skill.combat > 60) {
 		t.push(`${His} combat training is likely to increase ${his} sale value within your militarized society.`);
 		cost *= 1.5;
 	}
@@ -1521,7 +1521,7 @@ App.Interact.sellSlave = function(slave) {
 			["D startled the witch", {
 				cost: 1.35,
 				offerDesc: `from a prominent citizen who's pursuing some sort of mercenary project that requires worryingly large numbers of thin ${girl}s with sharp teeth.`,
-				get requirements() { return (slave.muscles > 5 && slave.weight < -10 && slave.teeth === "pointy" && slave.skill.combat > 0); },
+				get requirements() { return (slave.muscles > 5 && slave.weight < -10 && slave.teeth === "pointy" && slave.skill.combat > 30); },
 				percentOdds: 60,
 				get completeSale() {
 					const r = [];
@@ -2089,14 +2089,14 @@ App.Interact.sellSlave = function(slave) {
 			["aztec revivalist arcology", {
 				cost: 1.25,
 				offerDesc: `from a fellow arcology owner building a recreation of the Great Aztec Empire. He's in the market for willing, strong and combat ready slaves, to bolster his empire.`,
-				get requirements() { return (slave.skill.combat >= 1 && slave.health.condition > 40 && slave.muscles > 25); },
+				get requirements() { return (slave.skill.combat > 60 && slave.health.condition > 40 && slave.muscles > 25); },
 				percentOdds: 70,
 				get completeSale() {
 					const r = [];
 					let slaveImpact;
 					r.push(`${slave.slaveName} is transported after losing a military engagement. Though ${his} will remains strong, ${he}'s <span class="trust dec">filled with fear</span> when ${he} sees the rivers of blood that flow through the city.`);
 					for (const s of V.slaves) {
-						if (s.skill.combat > 0) {
+						if (s.skill.combat > 30) {
 							s.trust -= 2;
 							slaveImpact = 1;
 						}
@@ -2110,14 +2110,14 @@ App.Interact.sellSlave = function(slave) {
 			["roman revivalist arcology", {
 				cost: 1.25,
 				offerDesc: `from a fellow arcology owner building a facsimile of classical Rome. He's in the market for slaves with basic combat skills to fight in modern gladiatorial combats.`,
-				get requirements() { return (slave.skill.combat > 0 && slave.health.condition > 40 && slave.muscles > 5); },
+				get requirements() { return (slave.skill.combat > 60 && slave.health.condition > 40 && slave.muscles > 5); },
 				percentOdds: 70,
 				get completeSale() {
 					const r = [];
 					let slaveImpact;
 					r.push(`${slave.slaveName} is shipped to a new arcology, and culturally, across the centuries. ${His} skill at arms is well enough known that ${his} impending role as a gladiatrix is easily deduced.`);
 					for (const s of V.slaves) {
-						if (s.skill.combat > 0) {
+						if (s.skill.combat > 30) {
 							s.trust -= 2;
 							slaveImpact = 1;
 						}
diff --git a/src/js/slaveCostJS.js b/src/js/slaveCostJS.js
index 5f6f9425b09..f693a2708c0 100644
--- a/src/js/slaveCostJS.js
+++ b/src/js/slaveCostJS.js
@@ -2907,9 +2907,7 @@ globalThis.slaveCostBeauty = function(slave, isStartingSlave, followLaws, isSpec
 		if (slave.skill.oral) {
 			startingSlaveMultiplier += 0.00001 * slave.skill.oral * slave.skill.oral;
 		}
-		if (slave.skill.combat) {
-			startingSlaveMultiplier += 0.1;
-		}
+		startingSlaveMultiplier += 0.001*slave.skill.combat;
 		if (slave.prestige) {
 			startingSlaveMultiplier += slave.prestige;
 		}
diff --git a/src/js/slaveSummaryHelpers.js b/src/js/slaveSummaryHelpers.js
index 024a763de8c..e7932545f64 100644
--- a/src/js/slaveSummaryHelpers.js
+++ b/src/js/slaveSummaryHelpers.js
@@ -999,9 +999,7 @@ App.UI.SlaveSummaryImpl = function() {
 				helpers.makeRatedStyledSpan(c, sd.whoring, slave.skill.whoring, 0, true);
 				helpers.makeRatedStyledSpan(c, sd.entertainment, slave.skill.entertainment, 0, true);
 			}
-			if (slave.skill.combat > 0) {
-				helpers.makeStyledSpan(c, sd.fighter);
-			}
+			helpers.makeRatedStyledSpan(c, sd.combat, slave.skill.combat, 0, true);
 		}
 
 		/**
@@ -1053,9 +1051,7 @@ App.UI.SlaveSummaryImpl = function() {
 				helpers.makeRatedStyledSpan(c, sd.whoring, slave.skill.whoring, 0, true);
 				helpers.makeRatedStyledSpan(c, sd.entertainment, slave.skill.entertainment, 0, true);
 			}
-			if (slave.skill.combat > 0) {
-				helpers.makeStyledSpan(c, sd.fighter);
-			}
+			helpers.makeRatedStyledSpan(c, sd.combat, slave.skill.combat, 0, true);
 		}
 
 		/**
diff --git a/src/js/utilsSlave.js b/src/js/utilsSlave.js
index 5a7fdd7b32f..f8ddb056c7d 100644
--- a/src/js/utilsSlave.js
+++ b/src/js/utilsSlave.js
@@ -2551,9 +2551,7 @@ globalThis.deadliness = function(slave) {
 	}
 
 	function combatSkill() {
-		if (slave.skill.combat > 0) {
-			adjust("Skill: Combat", 2);
-		}
+		adjust("Skill: Combat", Math.floor(slave.skill.combat / 3.3) / 10);
 	}
 
 	function bodyguardSkill() {
diff --git a/src/markets/specificMarkets/customSlaveMarket.js b/src/markets/specificMarkets/customSlaveMarket.js
index 8eb1481e708..4f53d99c509 100644
--- a/src/markets/specificMarkets/customSlaveMarket.js
+++ b/src/markets/specificMarkets/customSlaveMarket.js
@@ -654,7 +654,8 @@ App.Markets["Custom Slave"] = function() {
 		const el = document.createElement("div");
 		const slaveProperty = "skill.combat";
 		const choices = new Map([
-			[1, "Skilled"],
+			[35, "Expert"],
+			[15, "Skilled"],
 			[0, "Unskilled"],
 		]);
 
@@ -662,10 +663,12 @@ App.Markets["Custom Slave"] = function() {
 		el.append(choicesMaker(slaveProperty, choices, description));
 
 		function description() {
-			for (const [value, text] of choices) {
-				if (slave.skill.combat >= value) {
-					return `${text} at combat. `;
-				}
+			if (slave.skill.combat <= 10) {
+				return `Unskilled at fighting. `;
+			} else if (slave.skill.combat <= 15) {
+				return `Basic skills at fighting. `;
+			} else {
+				return `Skilled at fighting. `;
 			}
 		}
 
diff --git a/src/markets/specificMarkets/prestigiousSlave.js b/src/markets/specificMarkets/prestigiousSlave.js
index 0cfd885b3dc..a14e42781f7 100644
--- a/src/markets/specificMarkets/prestigiousSlave.js
+++ b/src/markets/specificMarkets/prestigiousSlave.js
@@ -194,7 +194,7 @@ App.Markets["Prestigious Slave"] = function() {
 				slave.skill.anal = 0;
 				slave.skill.whoring = 0;
 				slave.skill.entertainment = 0;
-				slave.skill.combat = 1;
+				slave.skill.combat = 40;
 				slave.pubicHStyle = "waxed";
 				slave.underArmHStyle = "waxed";
 				slave.sexualFlaw = either("hates anal", "hates oral", "hates penetration");
@@ -667,7 +667,7 @@ App.Markets["Prestigious Slave"] = function() {
 				slave.skill.anal = 0;
 				slave.skill.whoring = 0;
 				slave.skill.entertainment = 0;
-				slave.skill.combat = 1;
+				slave.skill.combat = 40;
 				slave.pubicHStyle = "waxed";
 				slave.underArmHStyle = "waxed";
 				slave.sexualFlaw = either("hates anal", "hates oral", "hates penetration");
diff --git a/src/npc/bodyguard/bgDescription.js b/src/npc/bodyguard/bgDescription.js
index 1d2257ac144..3e1d6270abe 100644
--- a/src/npc/bodyguard/bgDescription.js
+++ b/src/npc/bodyguard/bgDescription.js
@@ -13,7 +13,7 @@ App.Desc.bodyguard = function(slave) {
 	r.push(`${He} is your bodyguard.`);
 	r.push(bgWeapon());
 
-	if (slave.skill.combat > 0) {
+	if (slave.skill.combat > 30) {
 		r.push(`${He} is <span class="skill">skilled at combat:</span> ${he} is comfortable with the use of modern firearms and edged weapons, and ${his} hands`);
 		if (!hasBothArms(slave)) {
 			r.push(`would be deadly weapons if ${he} had`);
diff --git a/src/npc/databases/cheatmodeDatabase.js b/src/npc/databases/cheatmodeDatabase.js
index 93236105eae..919e7945e8a 100644
--- a/src/npc/databases/cheatmodeDatabase.js
+++ b/src/npc/databases/cheatmodeDatabase.js
@@ -317,7 +317,7 @@ App.Intro.cheatModeSlaves = function() {
 	cheatSlave.nails = 1;
 	cheatSlave.piercing.ear.weight = 1;
 	cheatSlave.skill.anal = 35;
-	cheatSlave.skill.combat = 1;
+	cheatSlave.skill.combat = 100;
 	cheatSlave.energy = 65;
 	cheatSlave.attrXY = 40;
 	cheatSlave.fetish = "buttslut";
diff --git a/src/npc/descriptions/style/clothing.js b/src/npc/descriptions/style/clothing.js
index e519ececcc5..2955b378133 100644
--- a/src/npc/descriptions/style/clothing.js
+++ b/src/npc/descriptions/style/clothing.js
@@ -796,9 +796,9 @@ App.Desc.clothing = function(slave) {
 						r.push(`golden whip and manacles insignia of a senior slave officer,`);
 					} else if ((slave.ID === V.MadamID) || (slave.ID === V.NurseID) || (slave.ID === V.AttendantID) || (slave.ID === V.MatronID) || (slave.ID === V.djID) || (slave.ID === V.MilkmaidID) || (slave.ID === V.FarmerID) || (slave.ID === V.StewardessID) || (slave.ID === V.SchoolteacherID) || (slave.ID === V.WardenessID)) {
 						r.push(`golden manacles insignia of a junior slave officer,`);
-					} else if ((slave.skill.combat > 0) && getLimbCount(slave, 105) > 0) {
+					} else if ((slave.skill.combat > 60) && getLimbCount(slave, 105) > 0) {
 						r.push(`silver spear and manacles insignia of an augmented slave soldier,`);
-					} else if ((slave.skill.combat > 0) && !isAmputee(slave)) {
+					} else if ((slave.skill.combat > 60) && !isAmputee(slave)) {
 						r.push(`silver manacles insignia of a slave soldier,`);
 					} else {
 						r.push(`black iron manacles insignia of a slave,`);
@@ -818,9 +818,9 @@ App.Desc.clothing = function(slave) {
 						r.push(`golden whip and manacles insignia of a senior slave officer,`);
 					} else if ((slave.ID === V.MadamID) || (slave.ID === V.NurseID) || (slave.ID === V.AttendantID) || (slave.ID === V.MatronID) || (slave.ID === V.djID) || (slave.ID === V.MilkmaidID) || (slave.ID === V.FarmerID) || (slave.ID === V.StewardessID) || (slave.ID === V.SchoolteacherID) || (slave.ID === V.WardenessID)) {
 						r.push(`golden manacles insignia of a junior slave officer,`);
-					} else if ((slave.skill.combat > 0) && getLimbCount(slave, 105) > 0) {
+					} else if ((slave.skill.combat > 60) && getLimbCount(slave, 105) > 0) {
 						r.push(`silver spear and manacles insignia of an augmented slave soldier,`);
-					} else if ((slave.skill.combat > 0) && !isAmputee(slave)) {
+					} else if ((slave.skill.combat > 60) && !isAmputee(slave)) {
 						r.push(`silver manacles insignia of a slave soldier,`);
 					} else {
 						r.push(`black iron manacles insignia of a slave,`);
@@ -840,9 +840,9 @@ App.Desc.clothing = function(slave) {
 						r.push(`golden whip and manacles insignia of a senior slave officer,`);
 					} else if ((slave.ID === V.MadamID) || (slave.ID === V.NurseID) || (slave.ID === V.AttendantID) || (slave.ID === V.MatronID) || (slave.ID === V.djID) || (slave.ID === V.MilkmaidID) || (slave.ID === V.FarmerID) || (slave.ID === V.StewardessID) || (slave.ID === V.SchoolteacherID) || (slave.ID === V.WardenessID)) {
 						r.push(`golden manacles insignia of a junior slave officer,`);
-					} else if ((slave.skill.combat > 0) && getLimbCount(slave, 105) > 0) {
+					} else if ((slave.skill.combat > 60) && getLimbCount(slave, 105) > 0) {
 						r.push(`silver spear and manacles insignia of an augmented slave soldier,`);
-					} else if ((slave.skill.combat > 0) && !isAmputee(slave)) {
+					} else if ((slave.skill.combat > 60) && !isAmputee(slave)) {
 						r.push(`silver manacles insignia of a slave soldier,`);
 					} else {
 						r.push(`black iron manacles insignia of a slave,`);
@@ -862,9 +862,9 @@ App.Desc.clothing = function(slave) {
 						r.push(`golden whip and manacles insignia of a senior slave officer,`);
 					} else if ((slave.ID === V.MadamID) || (slave.ID === V.NurseID) || (slave.ID === V.AttendantID) || (slave.ID === V.MatronID) || (slave.ID === V.djID) || (slave.ID === V.MilkmaidID) || (slave.ID === V.FarmerID) || (slave.ID === V.StewardessID) || (slave.ID === V.SchoolteacherID) || (slave.ID === V.WardenessID)) {
 						r.push(`golden manacles insignia of a junior slave officer,`);
-					} else if ((slave.skill.combat > 0) && getLimbCount(slave, 105) > 0) {
+					} else if ((slave.skill.combat > 60) && getLimbCount(slave, 105) > 0) {
 						r.push(`silver spear and manacles insignia of an augmented slave soldier,`);
-					} else if ((slave.skill.combat > 0) && !isAmputee(slave)) {
+					} else if ((slave.skill.combat > 60) && !isAmputee(slave)) {
 						r.push(`silver manacles insignia of a slave soldier,`);
 					} else {
 						r.push(`black iron manacles insignia of a slave,`);
diff --git a/src/npc/generate/generateLeadershipSlave.js b/src/npc/generate/generateLeadershipSlave.js
index 2a2b7cbb7d3..4862b4c8e60 100644
--- a/src/npc/generate/generateLeadershipSlave.js
+++ b/src/npc/generate/generateLeadershipSlave.js
@@ -69,7 +69,7 @@ globalThis.generateLeadershipSlave = function(input, location) {
 			slave.height = Height.random(slave, {skew: 3, spread: .2, limitMult: [1, 4]});
 			slave.weight = jsRandom(-10, 10);
 			slave.teeth = either("normal", "pointy");
-			slave.skill.combat = 1;
+			slave.skill.combat = 70;
 			if (jsRandom(0, 2) === 0) {
 				configureLimbs(slave, "all", 5);
 			}
@@ -81,7 +81,7 @@ globalThis.generateLeadershipSlave = function(input, location) {
 			slave.fetish = "sadist";
 			slave.fetishStrength = 100;
 			slave.muscles = jsRandom(50, 80);
-			slave.skill.combat = 1;
+			slave.skill.combat = 70;
 			applyMaleGenitalia({dick: jsRandom(3, 6), balls: jsRandom(3, 6), prostate: either(1, 1, 1, 2, 2, 3)});
 			slave.career = either(App.Data.Careers.Leader.wardeness);
 			break;
diff --git a/src/npc/generate/generateMarketSlave.js b/src/npc/generate/generateMarketSlave.js
index ad899adb8d2..faf78821a00 100644
--- a/src/npc/generate/generateMarketSlave.js
+++ b/src/npc/generate/generateMarketSlave.js
@@ -1265,7 +1265,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 			slave.birthName = "";
 			slave.birthSurname = "";
 			if (slave.career === "a soldier") {
-				slave.skill.combat = 1;
+				slave.skill.combat = 70;
 			} else {
 				slave.skill.combat = 0;
 			}
@@ -1346,7 +1346,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.balls = 0;
 				}
 			}
-			slave.skill.combat = jsEither([0, 0, 0, 0, 0, 1]);
+			slave.skill.combat = jsEither([0, 0, 0, 0, 30, 70]);
 			slave.skill.entertainment = jsRandom(15, 100);
 			slave.skill.whoring = jsRandom(15, 100);
 			slave.skill.oral = jsRandom(15, 100);
@@ -1551,7 +1551,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 				slave.intelligenceImplant = 30;
 				slave.accent = Math.min(slave.accent, 1);
 				slave.skill.entertainment = 75;
-				slave.skill.combat = jsEither([0, 1, 1]);
+				slave.skill.combat = jsEither([0, 30, 70]);
 			} else {
 				slave.face = random(10, 65);
 				slave.intelligence = Intelligence.random({limitIntelligence: [35, 75]});
@@ -1821,7 +1821,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 			slave.skill.whoring = 0;
 			slave.skill.entertainment = 0;
 			if (V.TGA.schoolUpgrade === 2) {
-				slave.skill.combat = 1;
+				slave.skill.combat = 70;
 			} else {
 				slave.skill.combat = 0;
 			}
@@ -2263,7 +2263,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 				slave.skill.whoring = 10;
 				slave.skill.entertainment = jsEither([20, 40, 40, 60]);
 			}
-			slave.skill.combat = 1;
+			slave.skill.combat = 70;
 			slave.pubicHStyle = "waxed";
 			slave.underArmHStyle = "waxed";
 			slave.sexualQuirk = jsEither(["caring", "none", "none", "unflinching"]);
@@ -2433,7 +2433,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.muscles = jsRandom(20, 80);
 					slave.chem = 10 * jsRandom(1, 3);
 					slave.custom.tattoo = "The prominent emblem of a local gang spans the length of his shoulders.";
-					slave.skill.combat = 1;
+					slave.skill.combat = 40;
 					break;
 				}
 				case "gang assaulter": {
@@ -2452,7 +2452,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.waist = jsRandom(10, 50);
 					slave.chem = 10 * jsRandom(1, 3);
 					slave.custom.tattoo = "The prominent emblem of a local gang spans the length of $his shoulders.";
-					slave.skill.combat = 1;
+					slave.skill.combat = 40;
 					break;
 				}
 				case "gang bruiser": {
@@ -2471,7 +2471,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.waist = jsRandom(10, 70);
 					slave.chem = 10 * jsRandom(1, 3);
 					slave.custom.tattoo = "The prominent emblem of a local gang spans the length of $his shoulders.";
-					slave.skill.combat = 1;
+					slave.skill.combat = 40;
 					break;
 				}
 				case "gang thief": {
@@ -2490,7 +2490,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.waist = jsRandom(10, 70);
 					slave.chem = 10 * jsRandom(1, 3);
 					slave.custom.tattoo = "The prominent emblem of a local gang spans the length of $his shoulders.";
-					slave.skill.combat = 1;
+					slave.skill.combat = 40;
 					break;
 				}
 				case "drug peddler": {
@@ -2506,7 +2506,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.muscles = jsRandom(20, 40);
 					slave.chem = 10 * jsRandom(3, 5);
 					slave.custom.tattoo = "The prominent emblem of a local gang spans the length of $his shoulders.";
-					slave.skill.combat = 1;
+					slave.skill.combat = 40;
 					break;
 				}
 				case "hitman": {
@@ -2522,7 +2522,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.weight = jsRandom(-30, 10);
 					slave.waist = jsRandom(-10, 50);
 					slave.muscles = jsRandom(20, 40);
-					slave.skill.combat = 1;
+					slave.skill.combat = 70;
 					break;
 				}
 				case "assassin": {
@@ -2538,7 +2538,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.weight = jsRandom(-30, 10);
 					slave.waist = jsRandom(-10, 10);
 					slave.muscles = jsRandom(20, 40);
-					slave.skill.combat = 1;
+					slave.skill.combat = 70;
 					break;
 				}
 				case "murder": {
@@ -2552,7 +2552,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.intelligence = jsRandom(-40, 60);
 					setHealth(slave, jsRandom(-20, 20), undefined, undefined, undefined, jsRandom(30, 80));
 					slave.muscles = jsRandom(20, 80);
-					slave.skill.combat = 1;
+					slave.skill.combat = 40;
 					break;
 				}
 				case "manslaughter": {
@@ -2615,7 +2615,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.weight = jsRandom(-30, 10);
 					slave.waist = jsRandom(-10, 10);
 					slave.muscles = jsRandom(20, 40);
-					slave.skill.combat = 1;
+					slave.skill.combat = 70;
 					break;
 				}
 				case "terrorist": {
@@ -2646,7 +2646,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.weight = jsRandom(-10, 10);
 					slave.waist = jsRandom(-10, 10);
 					slave.muscles = jsRandom(20, 60);
-					slave.skill.combat = 1;
+					slave.skill.combat = 70;
 					slave.behavioralFlaw = "arrogant";
 					break;
 				}
@@ -2662,7 +2662,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					setHealth(slave, jsRandom(-40, 60), Math.max(normalRandInt(5, 4), 0), Math.max(normalRandInt(5, 4), 0), undefined, jsRandom(30, 80));
 					slave.weight = jsRandom(-50, 10);
 					slave.waist = jsRandom(-10, 10);
-					slave.skill.combat = 1;
+					slave.skill.combat = 70;
 					break;
 				}
 				case "officer": {
@@ -2679,7 +2679,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.weight = jsRandom(-10, 10);
 					slave.waist = jsRandom(-10, 10);
 					slave.muscles = jsRandom(20, 40);
-					slave.skill.combat = 1;
+					slave.skill.combat = 70;
 					break;
 				}
 				case "specOps": {
@@ -2696,7 +2696,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.weight = jsRandom(-10, 10);
 					slave.waist = jsRandom(-10, 10);
 					slave.muscles = jsRandom(30, 60);
-					slave.skill.combat = 1;
+					slave.skill.combat = 70;
 					break;
 				}
 				case "sniper": {
@@ -2713,7 +2713,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.weight = jsRandom(-10, 10);
 					slave.waist = jsRandom(-10, 10);
 					slave.muscles = jsRandom(30, 60);
-					slave.skill.combat = 1;
+					slave.skill.combat = 70;
 					if (slave.boobs > 400) {
 						slave.boobs = 400;
 					}
@@ -2733,7 +2733,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.weight = jsRandom(-10, 10);
 					slave.waist = jsRandom(-10, 10);
 					slave.muscles = jsRandom(50, 60);
-					slave.skill.combat = 1;
+					slave.skill.combat = 70;
 					break;
 				}
 				case "soldier": {
@@ -2750,7 +2750,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.weight = jsRandom(-10, 10);
 					slave.waist = jsRandom(-10, 10);
 					slave.muscles = jsRandom(30, 60);
-					slave.skill.combat = 1;
+					slave.skill.combat = 70;
 					break;
 				}
 				case "private": {
@@ -2767,7 +2767,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.weight = jsRandom(-10, 10);
 					slave.waist = jsRandom(-10, 10);
 					slave.muscles = jsRandom(10, 40);
-					slave.skill.combat = 1;
+					slave.skill.combat = 40;
 					break;
 				}
 			}
@@ -2941,7 +2941,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.weight = jsRandom(-10, 10);
 					slave.waist = jsRandom(-10, 10);
 					slave.muscles = jsRandom(10, 40);
-					slave.skill.combat = 1;
+					slave.skill.combat = 40;
 					break;
 				}
 				case "murder": {
@@ -3079,7 +3079,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.weight = jsRandom(-10, 10);
 					slave.waist = jsRandom(-10, 10);
 					slave.muscles = jsRandom(30, 60);
-					slave.skill.combat = 1;
+					slave.skill.combat = 20;
 					break;
 				}
 				case "battery": {
@@ -3093,7 +3093,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					slave.weight = jsRandom(-10, 10);
 					slave.waist = jsRandom(-10, 10);
 					slave.muscles = jsRandom(40, 60);
-					slave.skill.combat = 1;
+					slave.skill.combat = 40;
 					break;
 				}
 				case "tax evasion": {
@@ -3269,7 +3269,7 @@ globalThis.generateMarketSlave = function(market = "kidnappers", numArcology = 1
 					if (slave.muscles < 10) {
 						slave.muscles = jsRandom(10, 45);
 					}
-					slave.skill.combat = 1;
+					slave.skill.combat = 40;
 					break;
 				case "manslaughter":
 					slave.origin = "You purchased $his life at a prison sale. $He was locked away for manslaughter.";
diff --git a/src/npc/interaction/fAbuse.js b/src/npc/interaction/fAbuse.js
index c11e28b1455..3812a95d08e 100644
--- a/src/npc/interaction/fAbuse.js
+++ b/src/npc/interaction/fAbuse.js
@@ -15,15 +15,15 @@ App.Interact.fAbuse = function(slave) {
 	if (slave.assignment === Job.BODYGUARD) {
 		if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 95) {
 			r.push(`Knowing how much your bodyguard likes being hurt, you decide to reward ${him} in ${his} own particular way.`);
-		} else if (slave.muscles < -5 && slave.skill.combat === 0) {
+		} else if (slave.muscles < -5 && slave.skill.combat <= 30) {
 			r.push(`Looking at your bodyguard, you think ${he} doesn't seem that dangerous, as ${he} can barely hold a weapon up. You order ${him} to spar with you, and you quickly overpower ${him} without even breaking a sweat. Afterwards, you take the pretext of punishing ${him} to satisfy your urges.`);
-		} else if (slave.muscles >= -5 && slave.muscles <= 5 && slave.skill.combat !== 0) {
+		} else if (slave.muscles >= -5 && slave.muscles <= 5 && slave.skill.combat > 30) {
 			r.push(`You glance at your bodyguard. ${He} looks like ${he} can handle ${himself}, and you know ${he} does, but ${his} lack of musculature makes ${him} look somewhat frail. You inform ${him} that ${he} isn't muscular enough, and that you'll punish ${him} yourself for neglecting ${his} physique.`);
-		} else if (slave.muscles > 50 && slave.skill.combat === 0) {
+		} else if (slave.muscles > 50 && slave.skill.combat <= 30) {
 			r.push(`Your bodyguard may look strong and powerful, you know ${he} can't really handle ${his} weapon. You order ${him} to spar with you, and you use ${his} own muscles against ${him}, winning easily. Afterwards, you take the pretext of punishing ${him} to satisfy your urges.`);
-		} else if (slave.muscles > 5 && slave.skill.combat !== 0) {
+		} else if (slave.muscles > 5 && slave.skill.combat > 30) {
 			r.push(`Your bodyguard stands at your side. ${He} is definitely a force to be reckoned with. You know you'd have a hard time besting ${him}, and do not wish to get hurt, so you'll just inform ${him} ${he}'ll be undertaking some particular training.`);
-		} else if (slave.muscles > 5 && slave.skill.combat === 0) {
+		} else if (slave.muscles > 5 && slave.skill.combat <= 30) {
 			r.push(`Your bodyguard may look fit, you know ${he} can't really handle ${his} weapon. You order ${him} to spar with you; while ${he} may be quick, ${he} mostly just flails ${his} weapon around allowing you an easy win. Afterwards, you take the pretext of punishing ${him} to satisfy your urges.`);
 		}
 	}
@@ -680,15 +680,15 @@ App.Interact.fAbuse = function(slave) {
 	}
 
 	if (slave.assignment === Job.BODYGUARD) {
-		if (slave.muscles <= 5 && slave.skill.combat === 0) {
+		if (slave.muscles <= 5 && slave.skill.combat <= 30) {
 			r.push(`Your bodyguard accepts this as a punishment for ${his} uselessness.`);
-		} else if (slave.muscles <= 5 && slave.skill.combat !== 0) {
+		} else if (slave.muscles <= 5 && slave.skill.combat > 30) {
 			r.push(`Your bodyguard accepts this as a punishment for ${his} lack of muscles`);
-		} else if (slave.muscles > 30 && slave.skill.combat === 0) {
+		} else if (slave.muscles > 30 && slave.skill.combat <= 30) {
 			r.push(`Your bodyguard accepts this as a punishment for ${his} lack of combat skills`);
-		} else if (slave.muscles > 5 && slave.skill.combat !== 0) {
+		} else if (slave.muscles > 5 && slave.skill.combat > 30) {
 			r.push(`Your bodyguard just admits it as a part of ${his} body training.`);
-		} else if (slave.muscles > 5 && slave.skill.combat === 0) {
+		} else if (slave.muscles > 5 && slave.skill.combat <= 30) {
 			r.push(`Your bodyguard accepts this as a punishment for ${his} lack of expertise`);
 		}
 		if (slave.fetish === "masochist" && slave.fetishStrength > 60 && slave.fetishKnown === 1) {
diff --git a/src/npc/interaction/killSlave.js b/src/npc/interaction/killSlave.js
index 5858b31f730..7466ca0776a 100644
--- a/src/npc/interaction/killSlave.js
+++ b/src/npc/interaction/killSlave.js
@@ -765,7 +765,7 @@ App.UI.SlaveInteract.killSlave = function(slave) {
 
 			let reactionText = `The fear on ${his} face is palpable, though ${he} nods slowly and agrees, not seeing another choice.`;
 
-			if (slave.skill.combat) {
+			if (slave.skill.combat> 30) {
 				reactionText = `${He} nods ${his} head and straightens up, as though mentally preparing ${himself} for the fight for ${his} life.`;
 			}
 
diff --git a/src/npc/startingGirls/startingGirls.js b/src/npc/startingGirls/startingGirls.js
index 312d2568044..9ac3f6f25ed 100644
--- a/src/npc/startingGirls/startingGirls.js
+++ b/src/npc/startingGirls/startingGirls.js
@@ -183,9 +183,7 @@ App.StartingGirls.applyCareerBonus = function(slave) {
 		case "hoodlum":
 		case "street urchin":
 			improveCondition(slave, 5);
-			if (slave.skill.combat < 1) {
-				slave.skill.combat += 1;
-			}
+			slave.skill.combat = 20;
 			break;
 		case "BlackHat":
 		case "hacker":
@@ -1974,12 +1972,13 @@ App.StartingGirls.skills = function(slave, cheat = false) {
 		options.addOption("Entertainment", "entertainment", slave.skill),
 		App.Data.StartingGirls.skill);
 
-	options.addOption("Combat", "combat", slave.skill)
-		.addValueList([["Unskilled", 0], ["Skilled", 1]]);
+	App.StartingGirls.addSet(
+		options.addOption("Combat", "combat", slave.skill),
+		App.Data.StartingGirls.skill);
 
 	// skill warning
 	const totalSkill = slave.skill.whoring + slave.skill.entertainment + slave.skill.vaginal
-		+ slave.skill.anal + slave.skill.oral + (slave.skill.combat * 100);
+		+ slave.skill.anal + slave.skill.oral + slave.skill.combat;
 
 	if (totalSkill > 200 && !cheat) {
 		let comment = ["Starting slaves incur"];
diff --git a/src/player/js/enslavePlayer.js b/src/player/js/enslavePlayer.js
index a15e598b573..b91146ac0b3 100644
--- a/src/player/js/enslavePlayer.js
+++ b/src/player/js/enslavePlayer.js
@@ -10,7 +10,7 @@ globalThis.convertPlayerToSlave = function(player, badEnd = "boring") {
 	slave.skill.anal = 100;
 	slave.skill.whoring = 0;
 	slave.skill.entertainment = 100;
-	slave.skill.combat = 1;
+	slave.skill.combat = 100;
 	slave.skill.headGirl = 200;
 	slave.skill.recruiter = 200;
 	slave.skill.bodyguard = 0;
-- 
GitLab