Repository: GeneralPantsuIsBadAtCoding/Azure-Peak
Pull request #1712: Mercenary Passover/Pontifex Remaster
Author: login: AtoriBirb
Labels: name: Code
description: Changes existing code
Created: 2025-03-14T01:38:06Z | Merged: 2025-03-16T23:32:15Z

## About The Pull Request

Oh boy I love long PRs, here we go. I'll try my best to answer as many questions as I can think could come up from this.

### Preface

So I went and catalogued all of the mercenary classes just to see where they are at stat wise, and here is the conclusion of such
![image](https://github.com/user-attachments/assets/97e31856-07ad-400f-a200-00fada2746db)
You can see this yourself here https://docs.google.com/spreadsheets/d/1L3OJcgmhptumRyecWODg-aVqU7CWPKI_JLWcV8sYTzQ/edit?usp=sharing

The take away from this is that there are some merc classes that are woefully undertuned, and some that are overtuned. **This PR brings all classes to a 9 stat baseline**, keeping in line with garrison. There are small tweaks here and there, and obviously some conditionals that have caused for a bit more of an up or down, but here are a few things to keep in mind.

- Most stat hits are to weaker stats like perc/int/con which tend to have less of an impact.
- MAGIC is very powerful yes, but that is almost always countered by either being limited, or a class not having a defensive trait. The lack of defensive trait is what neutralizes magic, bringing them down to on power with weapon skills (Maybe a little less in current meta.)
- I am sorry if I hit your particular class, I promise you this is not a salt PR directed at anyone.

Little edit: In light of the Condottiero changes, I revamped the crossbow calculations to actually care about PERC a little more and not to underflow to 1 second. On live, if you have more than expert crossbows, you underflow the charge time calculations (unless you have 9 perception or lower).

### Class changes

##ATGERVI VARANGIAN
Current weight: 7
- Raised speed from -2 to -1

##ATGERVI SHAMAN
Current weight: 12
- Lowered endurance from 2 to 1, int and perception to -1

##BLACK OAK'S GUARDIAN
Current weight: 8
- Lowered con from 2 to 1
- Raised str from 1 to 2

##CONDOTTIERO GUILDSMAN
Current weight: 11
- Lowered speed from 3 to 2
- added lockpick to inventory to match lockpicking skill

##DESERT RIDER JANNISARY
Current weight: 11
- Lowered int from 1 to 0 and perc from 0 to -1

##DESERT RIDER BLADE DANCER -> DESERT RIDER ZEYBEK
Current weight: 9
- No stat changes
- Reflavored to match its cousin Jannisary, and not be a nameless archetype now.

##DESERT RIDER BLADE CASTER -> DESERT RIDER ALMAH
Current weight: 11
- Lowered int from 3 to 2, perc from 0 to -1
- Raised Sword Skill from 3 to 4 to match other martial training, and arcyne from 2 to 3 (Lessens reading load).
- Added unfinished arcyne tome to their starting gear.
- Reflavored to match its cousin Jannisary, and not be a nameless archetype now.

##FORLORN HOPE MERCENARY
Current weight: 9
- Removed Crit Resistance trait

##GRENZELHOFT DOPPELSOLDNER
Current weight: 8
- Raised con from 2 to 3

##GRENZELHOFT HALBERDIER
Current weight: 11
- Lowered perc from 1 to -1

##ROUTIER SWORDSMAN/MACEBEARER/FLAILMAN
Current weight: 7
- Raised str from 1 to 2
- Reorganized the code because you don't really need 3 classes for one skill difference.

##STEPPESMAN
Current weight: 10
- Lowered con from 1 to 0
- Removed Crit Resistance trait

##UNDERDWELLER
Current weight: 7
- Raised speed from 0 to 1

##VASQUERO
Current weight: 12
- Lowered int from 2 to 0, end from 2 to 1

##WARSCHOLAR HEIROPHANT
Current weight: 1 (holy shit)
- Raised str from -1 to 0, end from 0 to 2, and spd from 0 to 2.
- added unfinished arcyne tome to their starting loadout.
Note: Casters are ass right now, we all know it. This at least gives them a little combat defense and stamina to cast.

##WARSCHOLAR VIZIER
Current weight: 12
- Lowered end from 2 to 1 and speed from 3 to 2
- added new support spell, guidance, to solidify their place as support/utility. Still doesn't make guidance good but w/e.
- Raised medicine to 4 and holy to 4, this allows them to actually do limb replacement which as fulltime healers could not do before for some reason.

##WARSCHOLAR PONTIFEX
Current weight: 7

PRENOTE: So Pontifex is the biggest change here. I wanted to rework them to being more of a hired spy to go alongside Vasquero in being more rogue types. They should still keep their identity as a punchy-mage, but now have the skills to fulfill their duty as a sorta behind the scenes shadowmancer. I also gave them back their STR because there's a reason every other unarmed focused class has 3 str. They need it to even be moderately viable at wrestling.

- Raised str from 1 to 3
- Lowered end from 2 to 1, con from 0 to -1
- added skills for sneaking/lockpicking/stealing
- Raised their climbing skill from 1 to 3
- Raised their Arcyne level from 2 to 3 (Does virtually nothing because of the -6 spell point modifier)
- added lockpick to their loadout
- REMOVED the the arcyne pushdagger spell
Note: Arcyne pushdagger is fine, but its identity has been given to the Orthodoxist, and the removal is to emphasize their non-lethal nature.
- added the ranged repel spell, and a new spell: shadowstep

Shadowstep is a new spell modeled after the recently added grapplehook device for the inquisition. It allows the user, after a prolonged delay, to teleport from one spot to another. The constraints are as follows.
- You must have a line of sight to where you wish to teleport
- You cannot use this through windows
- You can be easily interrupted in its 7 second cast window
- Makes a pretty recognizable sound when used, to tell people you are nearby (quieted if sneaking, but still there.)
- Makes a visual que to tell where you are going to end up, for others to prepare for your arrival.




https://github.com/user-attachments/assets/5b4fc745-ace6-4d7f-8d4b-e2f8049913a2


edits since original post:
Condot got their perc back, -1 speed cause you really don't need 3 with edodge.
Removed steppe/forlorn crit res. You don't need TWO functional defense traits ontop of one another. You're not barbs.
Updated crossbow calculation after consideration with Condot. Fixes the jank to not underflow, and makes perc a bit more worth while to crossbows.


Diff:
diff --git a/code/game/objects/items/rogueweapons/ranged/crossbows.dm b/code/game/objects/items/rogueweapons/ranged/crossbows.dm
index 881cb68d166..ce046ded3fc 100644
--- a/code/game/objects/items/rogueweapons/ranged/crossbows.dm
+++ b/code/game/objects/items/rogueweapons/ranged/crossbows.dm
@@ -49,15 +49,13 @@
 	if(mastermob && chargetime)
 		var/newtime = chargetime
 		//skill block
-		newtime = newtime + 80
-		newtime = newtime - (mastermob.mind?.get_skill_level(/datum/skill/combat/crossbows) * 20)
-		//per block
-		newtime = newtime + 20
-		newtime = newtime - ((mastermob.STAPER)*1.5)
-		if(newtime > 0)
+		newtime = newtime + 40
+		newtime = newtime - (mastermob.mind?.get_skill_level(/datum/skill/combat/crossbows) * 4.25) //minus 4.25 per skill point
+		newtime = newtime - ((mastermob.STAPER)*1) //minus 1 per perception
+		if(newtime > 1)
 			return newtime
 		else
-			return 10
+			return 1
 	return chargetime
 
 /datum/intent/arc/crossbow
diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/classes/atgervi.dm b/code/modules/jobs/job_types/roguetown/mercenaries/classes/atgervi.dm
index 8f74789fe8b..2bf71d0fcc9 100644
--- a/code/modules/jobs/job_types/roguetown/mercenaries/classes/atgervi.dm
+++ b/code/modules/jobs/job_types/roguetown/mercenaries/classes/atgervi.dm
@@ -41,7 +41,7 @@
 			H.change_stat("endurance", 3)
 			H.change_stat("constitution", 3)
 			H.change_stat("perception", 1)
-			H.change_stat("speed", -2)	
+			H.change_stat("speed", -1)	
 
 			head = /obj/item/clothing/head/roguetown/helmet/bascinet/atgervi
 			gloves = /obj/item/clothing/gloves/roguetown/angle/atgervi
@@ -71,8 +71,10 @@
 			H.mind.adjust_skillrank(/datum/skill/craft/tanning, 2, TRUE)
 
 			H.change_stat("strength", 3) 
-			H.change_stat("endurance", 2)
+			H.change_stat("endurance", 1)
 			H.change_stat("constitution", 2)
+			H.change_stat("intelligence", -1)
+			H.change_stat("perception", -1)
 			H.change_stat("speed", 1)
 
 			head = /obj/item/clothing/head/roguetown/helmet/leather/saiga/atgervi
diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/classes/blackoak.dm b/code/modules/jobs/job_types/roguetown/mercenaries/classes/blackoak.dm
index 734df653e84..d53b02fcde1 100644
--- a/code/modules/jobs/job_types/roguetown/mercenaries/classes/blackoak.dm
+++ b/code/modules/jobs/job_types/roguetown/mercenaries/classes/blackoak.dm
@@ -38,7 +38,7 @@
 		H.mind.adjust_skillrank(/datum/skill/misc/reading, 1, TRUE)
 		H.mind.adjust_skillrank(/datum/skill/misc/tracking, 2, TRUE)
 		H.change_stat("endurance", 2)
-		H.change_stat("constitution", 2)
-		H.change_stat("strength", 1)
+		H.change_stat("constitution", 1)
+		H.change_stat("strength", 2)
 		H.change_stat("speed", 1)
 	ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/classes/condottiero.dm b/code/modules/jobs/job_types/roguetown/mercenaries/classes/condottiero.dm
index 592db5c45cb..80f8ff562e8 100644
--- a/code/modules/jobs/job_types/roguetown/mercenaries/classes/condottiero.dm
+++ b/code/modules/jobs/job_types/roguetown/mercenaries/classes/condottiero.dm
@@ -23,7 +23,7 @@
 	shirt = /obj/item/clothing/suit/roguetown/armor/gambeson
 	pants = /obj/item/clothing/under/roguetown/trou/leather
 	neck = /obj/item/clothing/neck/roguetown/chaincoif
-	backpack_contents = list(/obj/item/roguekey/mercenary, /obj/item/storage/belt/rogue/pouch/coins/poor, /obj/item/rogueweapon/huntingknife/idagger/navaja)
+	backpack_contents = list(/obj/item/roguekey/mercenary, /obj/item/storage/belt/rogue/pouch/coins/poor, /obj/item/rogueweapon/huntingknife/idagger/navaja, /obj/item/lockpick = 1)
 	if(H.mind)
 		H.mind.adjust_skillrank(/datum/skill/combat/crossbows, 5, TRUE) //Possibly too high, no idea.
 		H.mind.adjust_skillrank(/datum/skill/combat/swords, 3, TRUE)
@@ -41,7 +41,7 @@
 		H.mind.adjust_skillrank(/datum/skill/craft/traps, 3, TRUE)
 		H.change_stat("endurance", 2)
 		H.change_stat("perception", 2)
-		H.change_stat("speed", 3)
+		H.change_stat("speed", 2)
 		H.change_stat("intelligence", 1)
 
 	ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC)
diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/classes/desertrider.dm b/code/modules/jobs/job_types/roguetown/mercenaries/classes/desertrider.dm
index abd18531230..af6ad161941 100644
--- a/code/modules/jobs/job_types/roguetown/mercenaries/classes/desertrider.dm
+++ b/code/modules/jobs/job_types/roguetown/mercenaries/classes/desertrider.dm
@@ -14,7 +14,7 @@
 
 	// CLASS ARCHETYPES
 	H.adjust_blindness(-3)
-	var/classes = list("Janissary","Blade Dancer","Blade Caster")
+	var/classes = list("Janissary","Zeybek","Almah")
 	var/classchoice = input("Choose your archetypes", "Available archetypes") as anything in classes
 
 	switch(classchoice)
@@ -39,7 +39,7 @@
 			ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
 			H.change_stat("strength", 2)
 			H.change_stat("endurance", 2)
-			H.change_stat("intelligence", 1)
+			H.change_stat("perception", -1)
 			H.change_stat("speed", 2)
 			backl = /obj/item/rogueweapon/shield/wood
 			r_hand = /obj/item/rogueweapon/mace/steel
@@ -47,11 +47,13 @@
 			shirt = /obj/item/clothing/suit/roguetown/armor/gambeson/heavy
 			armor = /obj/item/clothing/suit/roguetown/armor/plate/scale
 			pants = /obj/item/clothing/under/roguetown/chainlegs
+			backr = /obj/item/storage/backpack/rogue/satchel/black
+			backpack_contents = list(/obj/item/roguekey/mercenary, /obj/item/rogueweapon/huntingknife/idagger/navaja, /obj/item/clothing/neck/roguetown/shalal)
 			H.grant_language(/datum/language/celestial)
 
-		if("Blade Dancer")
+		if("Zeybek")
 			H.set_blindness(0)
-			to_chat(H, span_warning("Zybantian 'Blade Dancers' are famed and feared the world over. Their expertise in blades both long and short is well known..."))
+			to_chat(H, span_warning("Zybantian Zeybek are famed and feared the world over. Observers describe them as not so much fighting with their blade, but dancing with it."))
 			H.mind.adjust_skillrank(/datum/skill/combat/swords, 4, TRUE) 
 			H.mind.adjust_skillrank(/datum/skill/combat/knives, 4, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/combat/whipsflails, 4, TRUE)
@@ -71,6 +73,8 @@
 			H.change_stat("endurance", 2)
 			H.change_stat("intelligence", 1)
 			H.change_stat("speed", 3)
+			backr = /obj/item/storage/backpack/rogue/satchel/black
+			backpack_contents = list(/obj/item/roguekey/mercenary, /obj/item/rogueweapon/huntingknife/idagger/navaja, /obj/item/clothing/neck/roguetown/shalal)
 			backl = /obj/item/rogueweapon/sword/sabre/shamshir
 			shirt = /obj/item/clothing/suit/roguetown/armor/gambeson
 			armor = /obj/item/clothing/suit/roguetown/armor/leather/heavy/coat
@@ -86,9 +90,9 @@
 					r_hand = /obj/item/rogueweapon/whip
 					l_hand = /obj/item/rogueweapon/huntingknife/idagger/steel/parrying
 
-		if("Blade Caster")
+		if("Almah")
 			H.set_blindness(0)
-			to_chat(H, span_warning("Blade Casters are those skilled in both magyck and swordsmanship, but excelling in nothing."))
+			to_chat(H, span_warning("Almah are those skilled in both magyck and swordsmanship, but excelling in nothing."))
 			H.mind.adjust_skillrank(/datum/skill/combat/wrestling, 2, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/combat/unarmed, 2, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/misc/swimming, 1, TRUE)
@@ -97,22 +101,24 @@
 			H.mind.adjust_skillrank(/datum/skill/craft/crafting, 1, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/misc/medicine, 1, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/misc/reading, 4, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/magic/arcane, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/swords, 3, TRUE)
+			H.mind.adjust_skillrank(/datum/skill/magic/arcane, 3, TRUE)
+			H.mind.adjust_skillrank(/datum/skill/combat/swords, 4, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/misc/alchemy, 2, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/combat/crossbows, 2, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/misc/sewing, 2, TRUE)
 			H.mind.adjust_spellpoints(1)
 			ADD_TRAIT(H, TRAIT_MAGEARMOR, TRAIT_GENERIC)
+			H.change_stat("perception", -1)
 			H.change_stat("endurance", 2)
-			H.change_stat("intelligence", 3)
+			H.change_stat("intelligence", 2)
 			H.change_stat("speed", 3)
 			H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation)
 			H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/push_spell)
 			r_hand = /obj/item/rogueweapon/sword/sabre/shamshir
 			armor = /obj/item/clothing/suit/roguetown/shirt/robe/magered
+			backr = /obj/item/storage/backpack/rogue/satchel/black
+			backpack_contents = list(/obj/item/roguekey/mercenary, /obj/item/rogueweapon/huntingknife/idagger/navaja, /obj/item/clothing/neck/roguetown/shalal, /obj/item/spellbook_unfinished/pre_arcyne)
 			backl = /obj/item/rogueweapon/sword/sabre/shamshir
-
 			H.grant_language(/datum/language/celestial)
 			shirt = /obj/item/clothing/suit/roguetown/armor/gambeson/lord
 
@@ -121,10 +127,8 @@
 	gloves = /obj/item/clothing/gloves/roguetown/angle
 	belt = /obj/item/storage/belt/rogue/leather/shalal
 	beltr = /obj/item/storage/belt/rogue/pouch/coins/poor
-	backr = /obj/item/storage/backpack/rogue/satchel/black
 	beltl = /obj/item/flashlight/flare/torch
 	wrists = /obj/item/clothing/wrists/roguetown/bracers/leather
 
 
-	backpack_contents = list(/obj/item/roguekey/mercenary, /obj/item/rogueweapon/huntingknife/idagger/navaja, /obj/item/clothing/neck/roguetown/shalal)
 
diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/classes/forlorn.dm b/code/modules/jobs/job_types/roguetown/mercenaries/classes/forlorn.dm
index 113f655f035..b69321f0614 100644
--- a/code/modules/jobs/job_types/roguetown/mercenaries/classes/forlorn.dm
+++ b/code/modules/jobs/job_types/roguetown/mercenaries/classes/forlorn.dm
@@ -45,4 +45,3 @@
 		H.change_stat("endurance", 3) // tuff boys
 		H.change_stat("constitution", 2) 
 	ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
-	ADD_TRAIT(H, TRAIT_CRITICAL_RESISTANCE, TRAIT_GENERIC)
diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/classes/grenzelhoft.dm b/code/modules/jobs/job_types/roguetown/mercenaries/classes/grenzelhoft.dm
index e62bd28f539..3eb2b54730e 100644
--- a/code/modules/jobs/job_types/roguetown/mercenaries/classes/grenzelhoft.dm
+++ b/code/modules/jobs/job_types/roguetown/mercenaries/classes/grenzelhoft.dm
@@ -36,7 +36,7 @@
 			H.mind.adjust_skillrank(/datum/skill/misc/athletics, 4, TRUE)		//Trust me, they'll need it due to stamina drain on their base-sword.
 			H.change_stat("strength", 2)	//Should give minimum required stats to use Zweihander
 			H.change_stat("endurance", 3)
-			H.change_stat("constitution", 2)
+			H.change_stat("constitution", 3)
 			H.change_stat("perception", 1)
 			H.change_stat("speed", -1)		//They get heavy armor now + sword option; so lower speed.
 			r_hand = /obj/item/rogueweapon/greatsword/grenz
@@ -59,7 +59,7 @@
 			H.change_stat("strength", 2) //same str, worse end, more speed - actually a good tradeoff, now.
 			H.change_stat("endurance", 2)
 			H.change_stat("constitution", 2)
-			H.change_stat("perception", 1)
+			H.change_stat("perception", -1)
 			H.change_stat("speed", 1)
 			r_hand = /obj/item/rogueweapon/halberd
 
diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/classes/routier.dm b/code/modules/jobs/job_types/roguetown/mercenaries/classes/routier.dm
index ab7c8661a74..d5828f44315 100644
--- a/code/modules/jobs/job_types/roguetown/mercenaries/classes/routier.dm
+++ b/code/modules/jobs/job_types/roguetown/mercenaries/classes/routier.dm
@@ -1,5 +1,3 @@
-
-
 /datum/advclass/mercenary/routier
 	name = "Otavan Routiers"
 	tutorial = "The Routiers are a formidable Otavan mercenary band, a brotherhood of knights from noble families serving lords who seek to profit in peacetime. The Otavan nobility at large and even some of the clergy eagerly awaits to hear about your feats, they expect you to ENDURE, to be the champion of their faith and represent the true values of nobility, will you?"
@@ -17,78 +15,37 @@
 	H.adjust_blindness(-3)
 	var/classes = list("Swordsman","Macebearer","Flailman")
 	var/classchoice = input("Choose your archetypes", "Available archetypes") as anything in classes
-
+	H.set_blindness(0)
+	to_chat(H, span_warning("You are a Knight of Otava, well experienced in the use of your chosen arms."))
+	H.mind.adjust_skillrank(/datum/skill/misc/swimming, 2, TRUE)
+	H.mind.adjust_skillrank(/datum/skill/misc/climbing, 2, TRUE)
+	H.mind.adjust_skillrank(/datum/skill/misc/sneaking, 2, TRUE)
+	H.mind.adjust_skillrank(/datum/skill/combat/maces, 2, TRUE)
+	H.mind.adjust_skillrank(/datum/skill/combat/crossbows, 2, TRUE)
+	H.mind.adjust_skillrank(/datum/skill/combat/wrestling, 3, TRUE)
+	H.mind.adjust_skillrank(/datum/skill/combat/unarmed, 2, TRUE)
+	H.mind.adjust_skillrank(/datum/skill/combat/swords, 2, TRUE)
+	H.mind.adjust_skillrank(/datum/skill/combat/shields, 3, TRUE)
+	H.mind.adjust_skillrank(/datum/skill/combat/polearms, 3, TRUE)
+	H.mind.adjust_skillrank(/datum/skill/combat/whipsflails, 2, TRUE)
+	H.mind.adjust_skillrank(/datum/skill/combat/knives, 2, TRUE)
+	H.mind.adjust_skillrank(/datum/skill/misc/reading, 1, TRUE)
+	H.mind.adjust_skillrank(/datum/skill/misc/athletics, 3, TRUE)
+	H.change_stat("strength", 2)
+	H.change_stat("endurance", 2)
+	H.change_stat("constitution", 4)
+	H.change_stat("perception", 1)
+	H.change_stat("speed", -1)
 	switch(classchoice)
 		if("Swordsman")
-			H.set_blindness(0)
-			to_chat(H, span_warning("You are a Knight of Otava, an experienced swordsman."))
-			H.mind.adjust_skillrank(/datum/skill/misc/swimming, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/misc/climbing, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/misc/sneaking, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/maces, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/crossbows, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/wrestling, 3, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/unarmed, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/swords, 4, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/shields, 3, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/polearms, 3, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/whipsflails, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/knives, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/misc/reading, 1, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/misc/athletics, 3, TRUE)
-			H.change_stat("strength", 1)
-			H.change_stat("endurance", 2)
-			H.change_stat("constitution", 4)
-			H.change_stat("perception", 1)
-			H.change_stat("speed", -1)
+			H.mind.adjust_skillrank(/datum/skill/combat/swords, 2, TRUE)
 			r_hand = /obj/item/rogueweapon/sword/falchion
 		if("Macebearer")
-			H.set_blindness(0)
-			to_chat(H, span_warning("You are a Macebearer from Otava, a skilled user of maces and clubs."))
-			H.mind.adjust_skillrank(/datum/skill/misc/swimming, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/misc/climbing, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/misc/sneaking, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/maces, 4, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/crossbows, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/wrestling, 3, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/unarmed, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/swords, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/shields, 3, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/polearms, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/whipsflails, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/knives, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/misc/reading, 1, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/misc/athletics, 3, TRUE)
-			H.change_stat("strength", 1) 
-			H.change_stat("endurance", 2)
-			H.change_stat("constitution", 4)
-			H.change_stat("perception", 1)
-			H.change_stat("speed", -1)
+			H.mind.adjust_skillrank(/datum/skill/combat/maces, 2, TRUE)
 			r_hand = /obj/item/rogueweapon/mace/steel/morningstar
 		if("Flailman")
-			H.set_blindness(0)
-			to_chat(H, span_warning("You are a Flailman from Otava, your enemies fear the unpredicability of your weapon."))
-			H.mind.adjust_skillrank(/datum/skill/misc/swimming, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/misc/climbing, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/misc/sneaking, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/maces, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/crossbows, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/wrestling, 3, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/unarmed, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/swords, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/shields, 3, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/polearms, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/whipsflails, 4, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/combat/knives, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/misc/reading, 1, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/misc/athletics, 3, TRUE)
-			H.change_stat("strength", 1) 
-			H.change_stat("endurance", 2)
-			H.change_stat("constitution", 4)
-			H.change_stat("perception", 1)
-			H.change_stat("speed", -1)
+			H.mind.adjust_skillrank(/datum/skill/combat/whipsflails, 2, TRUE)
 			r_hand = /obj/item/rogueweapon/flail/sflail
-	//General gear regardless of class.
 	wrists = /obj/item/clothing/wrists/roguetown/bracers
 	belt = /obj/item/storage/belt/rogue/leather
 	beltl = /obj/item/flashlight/flare/torch
diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/classes/steppesman.dm b/code/modules/jobs/job_types/roguetown/mercenaries/classes/steppesman.dm
index 8c5c668fa65..b9d6d6b7d06 100644
--- a/code/modules/jobs/job_types/roguetown/mercenaries/classes/steppesman.dm
+++ b/code/modules/jobs/job_types/roguetown/mercenaries/classes/steppesman.dm
@@ -46,8 +46,6 @@
 		H.mind.adjust_skillrank(/datum/skill/misc/athletics, 3, TRUE)
 		H.mind.adjust_skillrank(/datum/skill/misc/tracking, 1, TRUE)
 	H.change_stat("perception", 3)
-	H.change_stat("constitution", 1)
 	H.change_stat("endurance", 2)
 	H.change_stat("speed", 2)
 	ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC)
-	ADD_TRAIT(H, TRAIT_CRITICAL_RESISTANCE, TRAIT_GENERIC)
diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/classes/underdweller.dm b/code/modules/jobs/job_types/roguetown/mercenaries/classes/underdweller.dm
index c2351b265f7..74f05f4669b 100644
--- a/code/modules/jobs/job_types/roguetown/mercenaries/classes/underdweller.dm
+++ b/code/modules/jobs/job_types/roguetown/mercenaries/classes/underdweller.dm
@@ -46,5 +46,7 @@
 		H.change_stat("strength", 1)
 		H.change_stat("constitution", 2)
 		H.change_stat("endurance", 2)
+		H.change_stat("speed", 1)
+
 
 	ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/classes/vaquero.dm b/code/modules/jobs/job_types/roguetown/mercenaries/classes/vaquero.dm
index 0ea12d7a0d2..388e3b03fe0 100644
--- a/code/modules/jobs/job_types/roguetown/mercenaries/classes/vaquero.dm
+++ b/code/modules/jobs/job_types/roguetown/mercenaries/classes/vaquero.dm
@@ -52,8 +52,7 @@
 					/obj/item/roguekey/mercenary = 1
 					)
 	H.change_stat("strength", 1)
-	H.change_stat("intelligence", 2)
-	H.change_stat("endurance", 2)
+	H.change_stat("endurance", 1)
 	H.change_stat("speed", 3)
 	ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC)
 	ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/classes/warscholar.dm b/code/modules/jobs/job_types/roguetown/mercenaries/classes/warscholar.dm
index 0db10441dd2..4f29f9d1590 100644
--- a/code/modules/jobs/job_types/roguetown/mercenaries/classes/warscholar.dm
+++ b/code/modules/jobs/job_types/roguetown/mercenaries/classes/warscholar.dm
@@ -25,7 +25,8 @@
 		"RED" = "#ED6762",
 		"ORANGE" = "#EDAF6D",
 		"PINK" = "#EDC1D5",
-		"MAROON" = "#5F1F34"
+		"MAROON" = "#5F1F34",
+		"BLACK" = "#242526"
 	))
 	// CLASS ARCHETYPES
 	H.adjust_blindness(-3)
@@ -66,7 +67,8 @@
 				H.change_stat("intelligence", 1)
 				H.change_stat("perception", 1)
 				H.mind.adjust_spellpoints(1)
-			H.change_stat("strength", -1)
+			H.change_stat("endurance", 2)
+			H.change_stat("speed", 2)
 			H.change_stat("constitution", -1)
 			H.change_stat("perception", 1)
 			H.change_stat("intelligence", 3)
@@ -81,30 +83,34 @@
 			armor = /obj/item/clothing/suit/roguetown/armor/gambeson/hierophant
 			shirt = /obj/item/clothing/suit/roguetown/shirt/robe/hierophant
 			pants = /obj/item/clothing/under/roguetown/trou/leather
-			backpack_contents = list(/obj/item/roguekey/mercenary,/obj/item/rogueweapon/huntingknife)
+			backpack_contents = list(/obj/item/roguekey/mercenary,/obj/item/rogueweapon/huntingknife,/obj/item/spellbook_unfinished/pre_arcyne)
 
 		if("Pontifex")
 			H.set_blindness(0)
-			to_chat(H, span_warning("You are a Naledi Pontifex, a warrior trained into a hybridized style of movement-controlling magic and hand-to-hand combat. Though your abilities in magical fields are lacking, you are far more dangerous than other magi in a straight fight. You manifest your calm, practiced skill into a killing intent that takes the shape of an arcyne blade."))
+			to_chat(H, span_warning("You are a Naledi Pontifex, a scout and spy trained into a hybridized style of movement-controlling shadow magic and hand-to-hand combat. Though your abilities in magical fields are lacking, you are more than equipped to defend yourself should the dark fail to keep you safe."))
 			H.mind.adjust_skillrank(/datum/skill/combat/wrestling, 4, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/combat/unarmed, 4, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/misc/swimming, 1, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/misc/climbing, 1, TRUE)
+			H.mind.adjust_skillrank(/datum/skill/misc/climbing, 3, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/misc/athletics, 3, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/craft/crafting, 1, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/misc/medicine, 1, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/misc/reading, 3, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/magic/arcane, 2, TRUE)
+			H.mind.adjust_skillrank(/datum/skill/magic/arcane, 3, TRUE)
+			H.mind.adjust_skillrank(/datum/skill/misc/sneaking, 3, TRUE)
+			H.mind.adjust_skillrank(/datum/skill/misc/stealing, 3, TRUE)
+			H.mind.adjust_skillrank(/datum/skill/misc/lockpicking, 3, TRUE)
 			H.mind.adjust_spellpoints(-6) //The - is intended.
-			H.change_stat("strength", 1)
-			H.change_stat("endurance", 2)
+			H.change_stat("strength", 3)
+			H.change_stat("constitution", -1)
+			H.change_stat("endurance", 1)
 			H.change_stat("perception", -1)
 			H.change_stat("speed", 2)
 			H.grant_language(/datum/language/celestial)
 			H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/prestidigitation)
 			H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/projectile/fetch) // In an attempt to make them less Possibly Wildly OP, they can't freely pick their spells. Casts at apprentice level, but doesn't get the spellbuy points it'd provide.
 			H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/slowdown_spell_aoe)
-			H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/summonrogueweapon/bladeofpsydon)
+			H.mind.AddSpell(new/obj/effect/proc_holder/spell/invoked/projectile/repel)
+			H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/shadowstep)
 			ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC)
 
 			head = /obj/item/clothing/head/roguetown/roguehood/pontifex
@@ -113,28 +119,28 @@
 			armor = /obj/item/clothing/suit/roguetown/armor/gambeson/heavy/pontifex
 			shirt = /obj/item/clothing/suit/roguetown/shirt/robe/pointfex
 			pants = /obj/item/clothing/under/roguetown/trou/leather/pontifex
-			backpack_contents = list(/obj/item/roguekey/mercenary,/obj/item/rogueweapon/huntingknife)
+			backpack_contents = list(/obj/item/roguekey/mercenary,/obj/item/lockpick = 1,/obj/item/rogueweapon/huntingknife)
 
 		if("Vizier")
 			H.set_blindness(0)
-			to_chat(H, span_warning("You are a Naledi Vizier. You are a healer, trained in both physick and holy practices. Likely of a learned or upper class background, you are a supporting fellow, meant to heal your allies with miracles and surgeries- though you are no stranger to combat."))
+			to_chat(H, span_warning("You are a Naledi Vizier. You are a healer, trained in both physick and holy practices. Likely of a learned or upper class background, you are a supporting fellow, meant to heal your allies with miracles and surgeries."))
 			H.mind.adjust_skillrank(/datum/skill/combat/wrestling, 2, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/combat/unarmed, 2, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/misc/swimming, 1, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/misc/climbing, 1, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/misc/athletics, 3, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/craft/crafting, 1, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/misc/medicine, 3, TRUE)
+			H.mind.adjust_skillrank(/datum/skill/misc/medicine, 4, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/misc/reading, 4, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/combat/swords, 2, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/misc/alchemy, 2, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/combat/crossbows, 2, TRUE)
 			H.mind.adjust_skillrank(/datum/skill/misc/sewing, 2, TRUE)
-			H.mind.adjust_skillrank(/datum/skill/magic/holy, 2, TRUE)
+			H.mind.adjust_skillrank(/datum/skill/magic/holy, 4, TRUE)
 			H.change_stat("strength", 1)
-			H.change_stat("endurance", 2)
+			H.change_stat("endurance", 1)
 			H.change_stat("intelligence", 2)
-			H.change_stat("speed", 3)
+			H.change_stat("speed", 2)
 			r_hand = /obj/item/rogueweapon/sword/sabre/shamshir
 			armor = /obj/item/clothing/suit/roguetown/shirt/robe/magered
 
@@ -157,6 +163,7 @@
 			C.grant_spells_templar(H)
 			H.verbs += list(/mob/living/carbon/human/proc/devotionreport, /mob/living/carbon/human/proc/clericpray)
 			H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/diagnose/secular)
+			H.mind.AddSpell(new /obj/effect/proc_holder/spell/invoked/guidance)
 
 
 
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 70ecdfa6168..f6b094ed984 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/actions/roguespells.dmi b/icons/mob/actions/roguespells.dmi
index b4331b4e146..6574028abba 100644
Binary files a/icons/mob/actions/roguespells.dmi and b/icons/mob/actions/roguespells.dmi differ
diff --git a/modular_hearthstone/code/modules/spells/roguetown/wizard.dm b/modular_hearthstone/code/modules/spells/roguetown/wizard.dm
index 0896a6e9479..30f69abe25c 100644
--- a/modular_hearthstone/code/modules/spells/roguetown/wizard.dm
+++ b/modular_hearthstone/code/modules/spells/roguetown/wizard.dm
@@ -1539,7 +1539,128 @@
 		REMOVE_TRAIT(H, TRAIT_MIRROR_MAGIC, TRAIT_GENERIC)
 		to_chat(H, span_warning("Your connection to mirrors fades away."))
 
+/obj/effect/proc_holder/spell/invoked/shadowstep
+	name = "Shadowstep"
+	desc = "Project your shadow to swap places with it, teleporting several feet away."
+	cost = 1
+	xp_gain = TRUE
+	releasedrain = 30
+	warnie = "spellwarning"
+	movement_interrupt = TRUE
+	associated_skill = /datum/skill/magic/arcane
+	overlay_state = "shadowstep"
+	chargedrain = 1
+	chargetime = 0 SECONDS
+	charge_max = 30 SECONDS
+	var/area_of_effect = 1
+	var/max_range = 7
+	var/turf/destination_turf
+	var/turf/user_turf
+	var/mutable_appearance/tile_effect
+	var/mutable_appearance/target_effect
+	var/datum/looping_sound/invokeshadow/shadowloop
+
+//Resets the tile and turf effects.
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/reset(silent = FALSE)
+	if(tile_effect && destination_turf)
+		destination_turf.cut_overlay(tile_effect)
+		qdel(tile_effect)
+		destination_turf = null
+	if(user_turf && target_effect)
+		user_turf.cut_overlay(target_effect)
+		qdel(target_effect)
+		user_turf = null
+	update_icon()
+
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/check_path(turf/Tu, turf/Tt)
+	var/dist = get_dist(Tt, Tu)
+	var/last_dir
+	var/turf/last_step
+	if(Tu.z > Tt.z) 
+		last_step = get_step_multiz(Tu, DOWN)
+	else if(Tu.z < Tt.z)
+		last_step = get_step_multiz(Tu, UP)
+	else 
+		last_step = locate(Tu.x, Tu.y, Tu.z)
+	var/success = FALSE
+	for(var/i = 0, i <= dist, i++)
+		last_dir = get_dir(last_step, Tt)
+		var/turf/Tstep = get_step(last_step, last_dir)
+		if(!Tstep.density)
+			success = TRUE
+			var/list/cont = Tstep.GetAllContents(/obj/structure/roguewindow)
+			for(var/obj/structure/roguewindow/W in cont)
+				if(W.climbable && !W.opacity)	//It's climbable and can be seen through
+					success = TRUE
+					continue
+				else if(!W.climbable)
+					success = FALSE
+					return success
+		else
+			success = FALSE
+			return success
+		last_step = Tstep
+	return success
+
+//Successful teleport, complete reset.
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/tp(mob/user)
+	if(destination_turf)
+		if(do_teleport(user, destination_turf, no_effects=TRUE))
+			log_admin("[user.real_name]([key_name(user)] Shadowstepped from X:[user_turf.x] Y:[user_turf.y] Z:[user_turf.z] to X:[destination_turf.x] Y:[destination_turf.y] Z:[destination_turf.z] in area: [get_area(destination_turf)]")
+			if(user.m_intent == MOVE_INTENT_SNEAK)
+				playsound(user_turf, 'sound/magic/shadowstep.ogg', 20, FALSE)
+				playsound(destination_turf, 'sound/magic/shadowstep.ogg', 20, FALSE)
+			else
+				playsound(user_turf, 'sound/magic/shadowstep.ogg', 100, FALSE)
+				playsound(destination_turf, 'sound/magic/shadowstep.ogg', 100, FALSE)
+			reset(silent = TRUE)
+
+/obj/effect/proc_holder/spell/invoked/shadowstep/cast(list/targets, mob/user)
+	var/turf/T = get_turf(targets[1])
+	if(!istransparentturf(T))
+		var/reason
+		if(max_range >= get_dist(user, T) && !T.density)
+			if(check_path(get_turf(user), T))	//We check for opaque turfs or non-climbable windows in the way via a simple pathfind.
+				if(get_dist(user, T) < 2 && user.z == T.z)
+					to_chat(user, span_info("Too close!"))
+					revert_cast()
+					return
+				to_chat(user, span_info("I begin to meld with the shadows.."))
+				lockon(T, user)
+				if(do_after(user, 70))
+					tp(user)
+				else
+					reset(silent = TRUE)
+					revert_cast()
+				return
+			else
+				to_chat(user, span_info("The path is blocked!"))
+				revert_cast()
+				return
+		else if(get_dist(user, T) > max_range)
+			reason = "It's too far."
+			revert_cast()
+		else if (T.density)
+			reason = "It's a wall!"
+			revert_cast()
+		to_chat(user, span_info("I cannot shadowstep there! "+"[reason]"))
+	else
+		to_chat(user, span_info("I cannot shadowstep there!"))
+		revert_cast()
+	. = ..()
 
+//Plays affects at target Turf
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/lockon(turf/T, mob/user)
+	if(user.m_intent == MOVE_INTENT_SNEAK)
+		playsound(T, 'sound/magic/shadowstep_destination.ogg', 20, FALSE, 5)
+	else
+		playsound(T, 'sound/magic/shadowstep_destination.ogg', 100, FALSE, 5)
+	tile_effect = mutable_appearance(icon = 'icons/effects/effects.dmi', icon_state = "curse", layer = 18)
+	target_effect = mutable_appearance(icon = 'icons/effects/effects.dmi', icon_state = "curse", layer = 18)
+	user_turf = get_turf(user)
+	destination_turf = T
+	user_turf.add_overlay(target_effect)
+	destination_turf.add_overlay(tile_effect)
 
 #undef PRESTI_CLEAN
 #undef PRESTI_SPARK
diff --git a/sound/magic/shadowstep.ogg b/sound/magic/shadowstep.ogg
new file mode 100644
index 00000000000..b6f6aa3e04b
Binary files /dev/null and b/sound/magic/shadowstep.ogg differ
diff --git a/sound/magic/shadowstep_destination.ogg b/sound/magic/shadowstep_destination.ogg
new file mode 100644
index 00000000000..9990e782d0b
Binary files /dev/null and b/sound/magic/shadowstep_destination.ogg differ


Reviews:
user: login: FreeStylaLT
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-14T20:30:42Z
user: login: AtoriBirb
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-14T20:36:30Z
user: login: FreeStylaLT
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-14T20:51:52Z
user: login: FreeStylaLT
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-14T20:53:34Z
user: login: AtoriBirb
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-14T20:59:59Z
user: login: AtoriBirb
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-14T21:04:16Z
user: login: FreeStylaLT
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-14T21:08:23Z
user: login: FreeStylaLT
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-14T21:09:43Z
user: login: AtoriBirb
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-14T22:13:55Z

Review comments:
diff_hunk: @@ -1539,7 +1539,124 @@
 		REMOVE_TRAIT(H, TRAIT_MIRROR_MAGIC, TRAIT_GENERIC)
 		to_chat(H, span_warning("Your connection to mirrors fades away."))
 
+/obj/effect/proc_holder/spell/invoked/shadowstep
+	name = "Shadowstep"
+	desc = "Project your shadow to swap places with it, teleporting several feet away."
+	cost = 1
+	xp_gain = TRUE
+	releasedrain = 30
+	warnie = "spellwarning"
+	movement_interrupt = TRUE
+	associated_skill = /datum/skill/magic/arcane
+	overlay_state = "shadowstep"
+	chargedrain = 1
+	chargetime = 0 SECONDS
+	charge_max = 30 SECONDS
+	var/area_of_effect = 1
+	var/max_range = 7
+	var/turf/destination_turf
+	var/turf/user_turf
+	var/mutable_appearance/tile_effect
+	var/leash_range = 7
path: modular_hearthstone/code/modules/spells/roguetown/wizard.dm
user: login: FreeStylaLT
body: This var isn't used, I think?
created_at: 2025-03-14T20:30:42Z
author_association: COLLABORATOR
diff_hunk: @@ -1539,7 +1539,124 @@
 		REMOVE_TRAIT(H, TRAIT_MIRROR_MAGIC, TRAIT_GENERIC)
 		to_chat(H, span_warning("Your connection to mirrors fades away."))
 
+/obj/effect/proc_holder/spell/invoked/shadowstep
+	name = "Shadowstep"
+	desc = "Project your shadow to swap places with it, teleporting several feet away."
+	cost = 1
+	xp_gain = TRUE
+	releasedrain = 30
+	warnie = "spellwarning"
+	movement_interrupt = TRUE
+	associated_skill = /datum/skill/magic/arcane
+	overlay_state = "shadowstep"
+	chargedrain = 1
+	chargetime = 0 SECONDS
+	charge_max = 30 SECONDS
+	var/area_of_effect = 1
+	var/max_range = 7
+	var/turf/destination_turf
+	var/turf/user_turf
+	var/mutable_appearance/tile_effect
+	var/leash_range = 7
+	var/mutable_appearance/target_effect
+	var/datum/looping_sound/invokeshadow/shadowloop
+
+//Resets the tile and turf effects.
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/reset(silent = FALSE)
+	if(tile_effect && destination_turf)
+		destination_turf.cut_overlay(tile_effect)
+		qdel(tile_effect)
+		destination_turf = null
+	if(user_turf && target_effect)
+		user_turf.cut_overlay(target_effect)
+		qdel(target_effect)
+		user_turf = null
+	update_icon()
+
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/check_path(turf/Tu, turf/Tt)
+	var/dist = get_dist(Tt, Tu)
+	var/last_dir
+	var/turf/last_step
+	if(Tu.z > Tt.z) 
+		last_step = get_step_multiz(Tu, DOWN)
+	else if(Tu.z < Tt.z)
+		last_step = get_step_multiz(Tu, UP)
+	else 
+		last_step = locate(Tu.x, Tu.y, Tu.z)
+	var/success = FALSE
+	for(var/i = 0, i <= dist, i++)
+		last_dir = get_dir(last_step, Tt)
+		var/turf/Tstep = get_step(last_step, last_dir)
+		if(!Tstep.density)
+			success = TRUE
+			var/list/cont = Tstep.GetAllContents(/obj/structure/roguewindow)
+			for(var/obj/structure/roguewindow/W in cont)
+				if(W.climbable && !W.opacity)	//It's climable and can be seen through
path: modular_hearthstone/code/modules/spells/roguetown/wizard.dm
user: login: FreeStylaLT
body: clim**b**able
created_at: 2025-03-14T20:31:12Z
author_association: COLLABORATOR
diff_hunk: @@ -1539,7 +1539,124 @@
 		REMOVE_TRAIT(H, TRAIT_MIRROR_MAGIC, TRAIT_GENERIC)
 		to_chat(H, span_warning("Your connection to mirrors fades away."))
 
+/obj/effect/proc_holder/spell/invoked/shadowstep
+	name = "Shadowstep"
+	desc = "Project your shadow to swap places with it, teleporting several feet away."
+	cost = 1
+	xp_gain = TRUE
+	releasedrain = 30
+	warnie = "spellwarning"
+	movement_interrupt = TRUE
+	associated_skill = /datum/skill/magic/arcane
+	overlay_state = "shadowstep"
+	chargedrain = 1
+	chargetime = 0 SECONDS
+	charge_max = 30 SECONDS
+	var/area_of_effect = 1
+	var/max_range = 7
+	var/turf/destination_turf
+	var/turf/user_turf
+	var/mutable_appearance/tile_effect
+	var/leash_range = 7
path: modular_hearthstone/code/modules/spells/roguetown/wizard.dm
user: login: AtoriBirb
body: uhhhhhh leash range isn't, the others are.
created_at: 2025-03-14T20:36:30Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1539,7 +1539,124 @@
 		REMOVE_TRAIT(H, TRAIT_MIRROR_MAGIC, TRAIT_GENERIC)
 		to_chat(H, span_warning("Your connection to mirrors fades away."))
 
+/obj/effect/proc_holder/spell/invoked/shadowstep
+	name = "Shadowstep"
+	desc = "Project your shadow to swap places with it, teleporting several feet away."
+	cost = 1
+	xp_gain = TRUE
+	releasedrain = 30
+	warnie = "spellwarning"
+	movement_interrupt = TRUE
+	associated_skill = /datum/skill/magic/arcane
+	overlay_state = "shadowstep"
+	chargedrain = 1
+	chargetime = 0 SECONDS
+	charge_max = 30 SECONDS
+	var/area_of_effect = 1
+	var/max_range = 7
+	var/turf/destination_turf
+	var/turf/user_turf
+	var/mutable_appearance/tile_effect
+	var/leash_range = 7
+	var/mutable_appearance/target_effect
+	var/datum/looping_sound/invokeshadow/shadowloop
+
+//Resets the tile and turf effects.
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/reset(silent = FALSE)
+	if(tile_effect && destination_turf)
+		destination_turf.cut_overlay(tile_effect)
+		qdel(tile_effect)
+		destination_turf = null
+	if(user_turf && target_effect)
+		user_turf.cut_overlay(target_effect)
+		qdel(target_effect)
+		user_turf = null
+	update_icon()
+
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/check_path(turf/Tu, turf/Tt)
path: modular_hearthstone/code/modules/spells/roguetown/wizard.dm
user: login: FreeStylaLT
body: This proc doesn't account for a variety of other obstacles in the way. It would allow someone to break into the stewardry, or merchant's place behind the counter / bars, or past a closed Keep gate.
I also believe one could alt-click any door (like the Lord's Chamber) and teleport to the turf under the door, and thus gain access that way.
created_at: 2025-03-14T20:51:50Z
author_association: COLLABORATOR
diff_hunk: @@ -1539,7 +1539,124 @@
 		REMOVE_TRAIT(H, TRAIT_MIRROR_MAGIC, TRAIT_GENERIC)
 		to_chat(H, span_warning("Your connection to mirrors fades away."))
 
+/obj/effect/proc_holder/spell/invoked/shadowstep
+	name = "Shadowstep"
+	desc = "Project your shadow to swap places with it, teleporting several feet away."
+	cost = 1
+	xp_gain = TRUE
+	releasedrain = 30
+	warnie = "spellwarning"
+	movement_interrupt = TRUE
+	associated_skill = /datum/skill/magic/arcane
+	overlay_state = "shadowstep"
+	chargedrain = 1
+	chargetime = 0 SECONDS
+	charge_max = 30 SECONDS
+	var/area_of_effect = 1
+	var/max_range = 7
+	var/turf/destination_turf
+	var/turf/user_turf
+	var/mutable_appearance/tile_effect
+	var/leash_range = 7
+	var/mutable_appearance/target_effect
+	var/datum/looping_sound/invokeshadow/shadowloop
+
+//Resets the tile and turf effects.
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/reset(silent = FALSE)
+	if(tile_effect && destination_turf)
+		destination_turf.cut_overlay(tile_effect)
+		qdel(tile_effect)
+		destination_turf = null
+	if(user_turf && target_effect)
+		user_turf.cut_overlay(target_effect)
+		qdel(target_effect)
+		user_turf = null
+	update_icon()
+
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/check_path(turf/Tu, turf/Tt)
path: modular_hearthstone/code/modules/spells/roguetown/wizard.dm
user: login: FreeStylaLT
body: I'm not saying if they should or shouldn't, though, I don't really have strong opinions one way or the other.
created_at: 2025-03-14T20:53:34Z
author_association: COLLABORATOR
diff_hunk: @@ -1539,7 +1539,124 @@
 		REMOVE_TRAIT(H, TRAIT_MIRROR_MAGIC, TRAIT_GENERIC)
 		to_chat(H, span_warning("Your connection to mirrors fades away."))
 
+/obj/effect/proc_holder/spell/invoked/shadowstep
+	name = "Shadowstep"
+	desc = "Project your shadow to swap places with it, teleporting several feet away."
+	cost = 1
+	xp_gain = TRUE
+	releasedrain = 30
+	warnie = "spellwarning"
+	movement_interrupt = TRUE
+	associated_skill = /datum/skill/magic/arcane
+	overlay_state = "shadowstep"
+	chargedrain = 1
+	chargetime = 0 SECONDS
+	charge_max = 30 SECONDS
+	var/area_of_effect = 1
+	var/max_range = 7
+	var/turf/destination_turf
+	var/turf/user_turf
+	var/mutable_appearance/tile_effect
+	var/leash_range = 7
+	var/mutable_appearance/target_effect
+	var/datum/looping_sound/invokeshadow/shadowloop
+
+//Resets the tile and turf effects.
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/reset(silent = FALSE)
+	if(tile_effect && destination_turf)
+		destination_turf.cut_overlay(tile_effect)
+		qdel(tile_effect)
+		destination_turf = null
+	if(user_turf && target_effect)
+		user_turf.cut_overlay(target_effect)
+		qdel(target_effect)
+		user_turf = null
+	update_icon()
+
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/check_path(turf/Tu, turf/Tt)
+	var/dist = get_dist(Tt, Tu)
+	var/last_dir
+	var/turf/last_step
+	if(Tu.z > Tt.z) 
+		last_step = get_step_multiz(Tu, DOWN)
+	else if(Tu.z < Tt.z)
+		last_step = get_step_multiz(Tu, UP)
+	else 
+		last_step = locate(Tu.x, Tu.y, Tu.z)
+	var/success = FALSE
+	for(var/i = 0, i <= dist, i++)
+		last_dir = get_dir(last_step, Tt)
+		var/turf/Tstep = get_step(last_step, last_dir)
+		if(!Tstep.density)
+			success = TRUE
+			var/list/cont = Tstep.GetAllContents(/obj/structure/roguewindow)
+			for(var/obj/structure/roguewindow/W in cont)
+				if(W.climbable && !W.opacity)	//It's climable and can be seen through
path: modular_hearthstone/code/modules/spells/roguetown/wizard.dm
user: login: AtoriBirb
body: you did this!!!
created_at: 2025-03-14T20:59:59Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1539,7 +1539,124 @@
 		REMOVE_TRAIT(H, TRAIT_MIRROR_MAGIC, TRAIT_GENERIC)
 		to_chat(H, span_warning("Your connection to mirrors fades away."))
 
+/obj/effect/proc_holder/spell/invoked/shadowstep
+	name = "Shadowstep"
+	desc = "Project your shadow to swap places with it, teleporting several feet away."
+	cost = 1
+	xp_gain = TRUE
+	releasedrain = 30
+	warnie = "spellwarning"
+	movement_interrupt = TRUE
+	associated_skill = /datum/skill/magic/arcane
+	overlay_state = "shadowstep"
+	chargedrain = 1
+	chargetime = 0 SECONDS
+	charge_max = 30 SECONDS
+	var/area_of_effect = 1
+	var/max_range = 7
+	var/turf/destination_turf
+	var/turf/user_turf
+	var/mutable_appearance/tile_effect
+	var/leash_range = 7
+	var/mutable_appearance/target_effect
+	var/datum/looping_sound/invokeshadow/shadowloop
+
+//Resets the tile and turf effects.
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/reset(silent = FALSE)
+	if(tile_effect && destination_turf)
+		destination_turf.cut_overlay(tile_effect)
+		qdel(tile_effect)
+		destination_turf = null
+	if(user_turf && target_effect)
+		user_turf.cut_overlay(target_effect)
+		qdel(target_effect)
+		user_turf = null
+	update_icon()
+
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/check_path(turf/Tu, turf/Tt)
path: modular_hearthstone/code/modules/spells/roguetown/wizard.dm
user: login: AtoriBirb
body: The first I don't mind so much, IC and probably ooc consequences if abused in such a way. But teleporting ontop of a door is very gamey.. I think I can make it check for a door object.
created_at: 2025-03-14T21:04:16Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1539,7 +1539,124 @@
 		REMOVE_TRAIT(H, TRAIT_MIRROR_MAGIC, TRAIT_GENERIC)
 		to_chat(H, span_warning("Your connection to mirrors fades away."))
 
+/obj/effect/proc_holder/spell/invoked/shadowstep
+	name = "Shadowstep"
+	desc = "Project your shadow to swap places with it, teleporting several feet away."
+	cost = 1
+	xp_gain = TRUE
+	releasedrain = 30
+	warnie = "spellwarning"
+	movement_interrupt = TRUE
+	associated_skill = /datum/skill/magic/arcane
+	overlay_state = "shadowstep"
+	chargedrain = 1
+	chargetime = 0 SECONDS
+	charge_max = 30 SECONDS
+	var/area_of_effect = 1
+	var/max_range = 7
+	var/turf/destination_turf
+	var/turf/user_turf
+	var/mutable_appearance/tile_effect
+	var/leash_range = 7
+	var/mutable_appearance/target_effect
+	var/datum/looping_sound/invokeshadow/shadowloop
+
+//Resets the tile and turf effects.
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/reset(silent = FALSE)
+	if(tile_effect && destination_turf)
+		destination_turf.cut_overlay(tile_effect)
+		qdel(tile_effect)
+		destination_turf = null
+	if(user_turf && target_effect)
+		user_turf.cut_overlay(target_effect)
+		qdel(target_effect)
+		user_turf = null
+	update_icon()
+
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/check_path(turf/Tu, turf/Tt)
+	var/dist = get_dist(Tt, Tu)
+	var/last_dir
+	var/turf/last_step
+	if(Tu.z > Tt.z) 
+		last_step = get_step_multiz(Tu, DOWN)
+	else if(Tu.z < Tt.z)
+		last_step = get_step_multiz(Tu, UP)
+	else 
+		last_step = locate(Tu.x, Tu.y, Tu.z)
+	var/success = FALSE
+	for(var/i = 0, i <= dist, i++)
+		last_dir = get_dir(last_step, Tt)
+		var/turf/Tstep = get_step(last_step, last_dir)
+		if(!Tstep.density)
+			success = TRUE
+			var/list/cont = Tstep.GetAllContents(/obj/structure/roguewindow)
+			for(var/obj/structure/roguewindow/W in cont)
+				if(W.climbable && !W.opacity)	//It's climable and can be seen through
path: modular_hearthstone/code/modules/spells/roguetown/wizard.dm
user: login: FreeStylaLT
body: > you did this!!!

and I did it WRONG. Don't repeat the WRONG.
created_at: 2025-03-14T21:08:23Z
author_association: COLLABORATOR
diff_hunk: @@ -1539,7 +1539,124 @@
 		REMOVE_TRAIT(H, TRAIT_MIRROR_MAGIC, TRAIT_GENERIC)
 		to_chat(H, span_warning("Your connection to mirrors fades away."))
 
+/obj/effect/proc_holder/spell/invoked/shadowstep
+	name = "Shadowstep"
+	desc = "Project your shadow to swap places with it, teleporting several feet away."
+	cost = 1
+	xp_gain = TRUE
+	releasedrain = 30
+	warnie = "spellwarning"
+	movement_interrupt = TRUE
+	associated_skill = /datum/skill/magic/arcane
+	overlay_state = "shadowstep"
+	chargedrain = 1
+	chargetime = 0 SECONDS
+	charge_max = 30 SECONDS
+	var/area_of_effect = 1
+	var/max_range = 7
+	var/turf/destination_turf
+	var/turf/user_turf
+	var/mutable_appearance/tile_effect
+	var/leash_range = 7
+	var/mutable_appearance/target_effect
+	var/datum/looping_sound/invokeshadow/shadowloop
+
+//Resets the tile and turf effects.
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/reset(silent = FALSE)
+	if(tile_effect && destination_turf)
+		destination_turf.cut_overlay(tile_effect)
+		qdel(tile_effect)
+		destination_turf = null
+	if(user_turf && target_effect)
+		user_turf.cut_overlay(target_effect)
+		qdel(target_effect)
+		user_turf = null
+	update_icon()
+
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/check_path(turf/Tu, turf/Tt)
path: modular_hearthstone/code/modules/spells/roguetown/wizard.dm
user: login: FreeStylaLT
body: > The first I don't mind so much, IC and probably ooc consequences if abused in such a way. But teleporting ontop of a door is very gamey.. I think I can make it check for a door object.

Same thing for windows. In both cases, you might want to account for them being open. I dunno if that'd be their density var or something bespoke like with windows `climbable` var.
(I kinda deliberately picked my grappler code to only go upwards to avoid 90% of this kind of shenanigans)
created_at: 2025-03-14T21:09:43Z
author_association: COLLABORATOR
diff_hunk: @@ -1539,7 +1539,124 @@
 		REMOVE_TRAIT(H, TRAIT_MIRROR_MAGIC, TRAIT_GENERIC)
 		to_chat(H, span_warning("Your connection to mirrors fades away."))
 
+/obj/effect/proc_holder/spell/invoked/shadowstep
+	name = "Shadowstep"
+	desc = "Project your shadow to swap places with it, teleporting several feet away."
+	cost = 1
+	xp_gain = TRUE
+	releasedrain = 30
+	warnie = "spellwarning"
+	movement_interrupt = TRUE
+	associated_skill = /datum/skill/magic/arcane
+	overlay_state = "shadowstep"
+	chargedrain = 1
+	chargetime = 0 SECONDS
+	charge_max = 30 SECONDS
+	var/area_of_effect = 1
+	var/max_range = 7
+	var/turf/destination_turf
+	var/turf/user_turf
+	var/mutable_appearance/tile_effect
+	var/leash_range = 7
+	var/mutable_appearance/target_effect
+	var/datum/looping_sound/invokeshadow/shadowloop
+
+//Resets the tile and turf effects.
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/reset(silent = FALSE)
+	if(tile_effect && destination_turf)
+		destination_turf.cut_overlay(tile_effect)
+		qdel(tile_effect)
+		destination_turf = null
+	if(user_turf && target_effect)
+		user_turf.cut_overlay(target_effect)
+		qdel(target_effect)
+		user_turf = null
+	update_icon()
+
+/obj/effect/proc_holder/spell/invoked/shadowstep/proc/check_path(turf/Tu, turf/Tt)
path: modular_hearthstone/code/modules/spells/roguetown/wizard.dm
user: login: AtoriBirb
body: patched woo
created_at: 2025-03-14T22:13:55Z
author_association: CONTRIBUTOR

PR comments:
user: login: burgerenergy
created_at: 2025-03-14T01:47:50Z
body: I stand by the baseline of nine, which is the knight's, is too high for the squirrely eight slot role. I do like to see a standardization, though.

That said;

Against giving medicine four. That just means the towner doctor roles shouldn't even exist in comparison to funny fighty magic guy
author_association: CONTRIBUTOR
user: login: AtoriBirb
created_at: 2025-03-14T01:53:54Z
body: 
> Against giving medicine four. That just means the towner doctor roles shouldn't even exist in comparison to funny fighty magic guy

So I thought about this too and my reaction is thus. A mercenary should NOT BE DOING a towner's role, for free. If they are doing it for free they are overshadowing their purpose. They should not be in the church helping out, or apothecary helping out, unless the church/apothecary specifically tell them they can. They should still be ABLE TO DO THE WORK because that is the entire point of their class, but they should not be using it to step on toes. Player issue.
author_association: CONTRIBUTOR
user: login: burgerenergy
created_at: 2025-03-14T02:12:16Z
body: It doesn't matter if they shouldn't be doing it for free. The towners can charge a fee, it's still this anemic dude versus monk goku
author_association: CONTRIBUTOR
user: login: AtoriBirb
created_at: 2025-03-14T02:31:09Z
body: > It doesn't matter if they shouldn't be doing it for free. The towners can charge a fee, it's still this anemic dude versus monk goku

Monk goku, god. Alls I'm saying is they are a mercenary. The fuck they doing in the church without being paid to do so. I used to see them do that when I was a templar and grinded my gears. They just should not be allowed to, period, without a cause other than because they were bored.
author_association: CONTRIBUTOR
user: login: Stutternov
created_at: 2025-03-14T03:47:56Z
body: But it's not passover yet..
author_association: CONTRIBUTOR
user: login: Vynellin
created_at: 2025-03-14T05:25:09Z
body: Id actually argue that Vaquero do kind of need the extra int sense they are also a parrying based one
also oh boy people are gonna be upset about the lose of forlorn hope crit resitance 
author_association: NONE
user: login: AtoriBirb
created_at: 2025-03-14T05:28:10Z
body: > Id actually argue that Vaquero do kind of need the extra int sense they are also a parrying based one also oh boy people are gonna be upset about the lose of forlorn hope crit resitance

Should never have had the crit res in the first place, even the place it was ported from doesn't have crit res on it.. waaay overtuned.

Vaquero has deceiving meakness, which will pretty much give them a leg over most people for feints anyway.


author_association: CONTRIBUTOR
user: login: sneksnek
created_at: 2025-03-14T05:51:54Z
body: > Id actually argue that Vaquero do kind of need the extra int sense they are also a parrying based one also oh boy people are gonna be upset about the lose of forlorn hope crit resitance

int doesnt boost parrying without the virtue and the class wasnt designed with the virtue in mind
author_association: CONTRIBUTOR
user: login: Vynellin
created_at: 2025-03-14T06:20:21Z
body: Ya int really only effects their feinting and ability to examine folk slightly better 
If you wanna be weird u CAN take the one virtue that gives you parry chance but classes should be balanced indepdently of virtues not with them
author_association: NONE
user: login: Vynellin
created_at: 2025-03-14T06:24:11Z
body: ALSO
Personal belif
we should rework vizer entirely 
But this comes from my dislike of healing mercs
author_association: NONE
user: login: AtoriBirb
created_at: 2025-03-14T06:25:06Z
body: > ALSO Personal belif we should rework vizer entirely

Into an actual combat medic? I could maybe flirt them a kit and remove their medicine
author_association: CONTRIBUTOR
user: login: Vynellin
created_at: 2025-03-14T06:26:21Z
body: > > ALSO Personal belif we should rework vizer entirely
> 
> Into an actual combat medic? I could maybe flirt them a kit and remove their medicine

No
like take the idea and make them into something else entirely. Healing mercs are wack for balance imo (though also no one plays them cause they are bad and bad drip so lol)
author_association: NONE
user: login: AtoriBirb
created_at: 2025-03-14T06:27:12Z
body: > > > ALSO Personal belif we should rework vizer entirely
> > 
> > 
> > Into an actual combat medic? I could maybe flirt them a kit and remove their medicine
> 
> No like take the idea and make them into something else entirely. Healing mercs are wack for balance imo (though also no one plays them cause they are bad and bad drip so lol)

unless you give me an idea of what 'something else' can be, doesn't really help. Also how can you say they're bad for balance if they're not in the balance, IE no one playing them as you say. They are the only healing merc.
author_association: CONTRIBUTOR
user: login: Vynellin
created_at: 2025-03-14T06:29:09Z
body: > > > > ALSO Personal belif we should rework vizer entirely
> > > 
> > > 
> > > Into an actual combat medic? I could maybe flirt them a kit and remove their medicine
> > 
> > 
> > No like take the idea and make them into something else entirely. Healing mercs are wack for balance imo (though also no one plays them cause they are bad and bad drip so lol)
> 
> unless you give me an idea of what 'something else' can be, doesn't really help. Also how can you say they're bad for balance if they're not in the balance, IE no one playing them as you say. They are the only healing merc.

I more mean if they do end up getting played....
Could do something like giving them a spell list instead and have them dedicated to buffing to keep their support dedication role and even still open up to medicine still
(I also always believe mercs fill that role of netural party till someone hires to disadvantage the one that didnt hire them)
author_association: NONE
user: login: AtoriBirb
created_at: 2025-03-14T06:30:38Z
body: > > > > > ALSO Personal belif we should rework vizer entirely
> > > > 
> > > > 
> > > > Into an actual combat medic? I could maybe flirt them a kit and remove their medicine
> > > 
> > > 
> > > No like take the idea and make them into something else entirely. Healing mercs are wack for balance imo (though also no one plays them cause they are bad and bad drip so lol)
> > 
> > 
> > unless you give me an idea of what 'something else' can be, doesn't really help. Also how can you say they're bad for balance if they're not in the balance, IE no one playing them as you say. They are the only healing merc.
> 
> I more mean if they do end up getting played.... Could do something like giving them a spell list instead and have them dedicated to buffing to keep their support dedication role and even still open up to medicine still

I think a heal 1 miracle won't kill any sort of balance. They are psydonian so they don't even get fortify. Their heal is mid, so I really dunno how you think it'd be worse than just having an acolyte in a fight.
author_association: CONTRIBUTOR
user: login: Vynellin
created_at: 2025-03-14T06:31:16Z
body: (Shrug) Just how i feel i have innate bias agaisnt healing mercs always so
author_association: NONE
user: login: Vynellin
created_at: 2025-03-14T06:33:49Z
body: Though i must say i love the monk changes
author_association: NONE
user: login: Vynellin
created_at: 2025-03-14T06:36:25Z
body: honestly this chat reminds me im shocked we dont have a throwing weapon merc with the new weapons and changes to throwing weapons
author_association: NONE
user: login: Purpleturtle3
created_at: 2025-03-14T13:58:30Z
body: But my cool punchdagger :(
author_association: NONE
user: login: Stutternov
created_at: 2025-03-14T15:31:47Z
body: Overall I agree with the general premise of this, and even that crossbow calculation change because - as a crossbow user - bows fuck on you so hard now. ("Ohhh but i get dinged in le-" mfs never SEEN how many arrows a longbow can fire with only 10 less damage.) 

May want to put the crossbow change before the class changes on desc, just because it'll effect all crossbow users and stuff.
author_association: CONTRIBUTOR
user: login: AtoriBirb
created_at: 2025-03-14T20:19:28Z
body: > But my cool punchdagger :(

I know it's cool but I didn't want to give them too much. In all reality the weapon is a noob trap since your fists will almost always be stronger, faster, take less stamina and leave open hands for grabs and scoops.

It's a glorified grass cutter, though it has neat implications for ACTUAL useful weapon types.

> Overall I agree with the general premise of this, and even that crossbow calculation change because - as a crossbow user - bows fuck on you so hard now. ("Ohhh but i get dinged in le-" mfs never SEEN how many arrows a longbow can fire with only 10 less damage.)

I think Warden and a few other spot classes can pump enough perception to do MORE damage than crossbows atm. Crossbows have upfront damage that you can practically use as a shotgun if you really wanted to with 0 perc at all. This at least cuts it down from a 10 second baseline because what in the hell is that.

> May want to put the crossbow change before the class changes on desc, just because it'll effect all crossbow users and stuff.

Yeah, though honestly I don't think too many people use crossbows right now, hence the change for condot in general. I'll move it up a bit though, didn't mean for it to be such a substantial change.
author_association: CONTRIBUTOR
user: login: wshuwshuwshi
created_at: 2025-03-14T20:56:18Z
body: I think shaman is alright where it is. It's bonkers statwise because it's meant to be unarmed. Like, just rip with your hands
author_association: CONTRIBUTOR
user: login: AtoriBirb
created_at: 2025-03-14T20:59:21Z
body: > I think shaman is alright where it is. It's bonkers statwise because it's meant to be unarmed. Like, just rip with your hands

You say that as if unarmed is worse than other weapon types. It's not. I am an unarmed main, I know that this class is overtuned, believe me. Kind of lucky it's not being hit harder with all those traits.
author_association: CONTRIBUTOR
user: login: Vynellin
created_at: 2025-03-15T09:11:16Z
body: Unarmed is good if you can handle the armor with katar or they have none otherwise its rough tbh
author_association: NONE
user: login: Vynellin
created_at: 2025-03-16T08:41:34Z
body: black oak is getting updated may want to await to do black oak till that
author_association: NONE
user: login: FreeStylaLT
created_at: 2025-03-16T09:44:07Z
body: That update mirrored the black oat stat changes from here, so it's fine. It'll conflict, but should be easily fixed on either end.
author_association: COLLABORATOR
user: login: Vynellin
created_at: 2025-03-16T11:49:06Z
body: ahh
author_association: NONE