diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 1292c6112..49e4bc369 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -195,6 +195,8 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
var/mailer = null
var/mailedto = null
+ var/picklvl = 0
+
var/list/examine_effects = list()
///played when an item that is equipped blocks a hit
diff --git a/code/game/objects/items/rogueitems/keyrings.dm b/code/game/objects/items/rogueitems/keyrings.dm
index f1f5fac63..278b474e5 100644
--- a/code/game/objects/items/rogueitems/keyrings.dm
+++ b/code/game/objects/items/rogueitems/keyrings.dm
@@ -4,9 +4,7 @@
name = "keyring"
desc = "Will help you organize your keys."
icon_state = "keyring0"
- icon = 'icons/roguetown/items/keys.dmi'
- lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
+ icon = 'icons/roguetown/items/lockpicks.dmi'
w_class = WEIGHT_CLASS_TINY
dropshrink = 0
throwforce = 0
@@ -124,13 +122,13 @@
else
desc = ""
+//Keyrings for Jobs
/obj/item/keyring/sheriff
keys = list(/obj/item/roguekey/sheriff, /obj/item/roguekey/dungeon, /obj/item/roguekey/garrison, /obj/item/roguekey/walls, /obj/item/roguekey/manor, /obj/item/roguekey/graveyard)
/obj/item/keyring/bailiff
keys = list(/obj/item/roguekey/sheriff, /obj/item/roguekey/dungeon, /obj/item/roguekey/garrison, /obj/item/roguekey/walls, /obj/item/roguekey/manor, /obj/item/roguekey/graveyard)
-
/obj/item/keyring/councillor
keys = list(/obj/item/roguekey/sheriff, /obj/item/roguekey/dungeon, /obj/item/roguekey/garrison, /obj/item/roguekey/walls, /obj/item/roguekey/manor, /obj/item/roguekey/graveyard)
@@ -196,3 +194,115 @@
/obj/item/keyring/royal
keys = list(/obj/item/roguekey/manor, /obj/item/roguekey/royal)
+
+//Lockpick Ring
+/obj/item/lockpickring
+ name = "lockpickring"
+ desc = "A piece of bent wire to store lockpicking tools. Too bulky for fine work."
+ icon_state = "pickring0"
+ icon = 'icons/roguetown/items/lockpicks.dmi'
+ lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
+ w_class = WEIGHT_CLASS_TINY
+ dropshrink = 0
+ throwforce = 0
+ var/list/picks = list()
+ slot_flags = ITEM_SLOT_HIP|ITEM_SLOT_NECK|ITEM_SLOT_MOUTH|ITEM_SLOT_WRISTS
+ experimental_inhand = FALSE
+ dropshrink = 0.7
+
+/obj/item/lockpickring/Initialize()
+ . = ..()
+ if(picks.len)
+ for(var/X in picks)
+ addtoring(new X())
+ picks -= X
+ update_icon()
+
+/obj/item/lockpickring/getonmobprop(tag)
+ . = ..()
+ if(tag)
+ switch(tag)
+ if("gen")
+ return list("shrink" = 0.4,
+"sx" = -6,
+"sy" = -3,
+"nx" = 13,
+"ny" = -3,
+"wx" = -2,
+"wy" = -3,
+"ex" = 4,
+"ey" = -5,
+"northabove" = 0,
+"southabove" = 1,
+"eastabove" = 1,
+"westabove" = 0,
+"nturn" = 15,
+"sturn" = 0,
+"wturn" = 0,
+"eturn" = 39,
+"nflip" = 8,
+"sflip" = 0,
+"wflip" = 0,
+"eflip" = 8)
+ if("onbelt")
+ return list("shrink" = 0.3,"sx" = -2,"sy" = -5,"nx" = 4,"ny" = -5,"wx" = 0,"wy" = -5,"ex" = 2,"ey" = -5,"nturn" = 0,"sturn" = 0,"wturn" = 0,"eturn" = 0,"nflip" = 0,"sflip" = 0,"wflip" = 0,"eflip" = 0,"northabove" = 0,"southabove" = 1,"eastabove" = 1,"westabove" = 0)
+
+/obj/item/lockpickring/proc/addtoring(obj/item/I)
+ if(!I || !istype(I))
+ return 0
+ I.loc = src
+ picks += I
+ update_icon()
+ update_desc()
+
+/obj/item/lockpickring/proc/removefromring(mob/user)
+ if(!picks.len)
+ return
+ var/obj/item/lockpick/K = picks[picks.len]
+ picks -= K
+ K.loc = user.loc
+ update_icon()
+ update_desc()
+ return K
+
+/obj/item/lockpickring/attackby(obj/item/I, mob/user)
+ if(istype(I,/obj/item/lockpick))
+ if(picks.len >= 3)
+ to_chat(user, "Too many lockpicks.")
+ return
+ user.dropItemToGround(I)
+ addtoring(I)
+ else
+ return ..()
+
+/obj/item/lockpickring/attack_right(mob/user)
+ if(picks.len)
+ to_chat(user, "I steal a pick off the ring.")
+ var/obj/item/lockpick/K = removefromring(user)
+ user.put_in_active_hand(K)
+
+/obj/item/lockpickring/update_icon()
+ ..()
+ if(!picks.len)
+ icon_state = "pickring0"
+ return
+ if(picks.len >= 3)
+ icon_state = "pickring3"
+ return
+ switch(picks.len)
+ if(1)
+ icon_state = "pickring1"
+ if(2)
+ icon_state = "pickring2"
+ if(3)
+ icon_state = "pickring3"
+
+/obj/item/lockpickring/proc/update_desc()
+ if(picks.len)
+ desc = "\Roman [picks.len] lockpicks."
+ else
+ desc = ""
+
+/obj/item/lockpickring/mundane
+ picks = list(/obj/item/lockpick, /obj/item/lockpick, /obj/item/lockpick)
diff --git a/code/game/objects/items/rogueitems/keys.dm b/code/game/objects/items/rogueitems/keys.dm
index a0c91bacc..75c6cc726 100644
--- a/code/game/objects/items/rogueitems/keys.dm
+++ b/code/game/objects/items/rogueitems/keys.dm
@@ -26,6 +26,21 @@
GLOB.lockhashes += lockhash
GLOB.lockids[lockid] = lockhash
+/obj/item/lockpick
+ name = "lockpick"
+ desc = "A small, sharp piece of metal to aid opening locks in the absence of a key."
+ icon_state = "lockpick"
+ icon = 'icons/roguetown/items/lockpicks.dmi'
+ lefthand_file = 'icons/mob/inhands/misc/food_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/food_righthand.dmi'
+ w_class = WEIGHT_CLASS_TINY
+ dropshrink = 0.75
+ throwforce = 0
+ max_integrity = 10
+ picklvl = 1
+ slot_flags = ITEM_SLOT_HIP|ITEM_SLOT_MOUTH|ITEM_SLOT_NECK
+ destroy_sound = 'sound/items/pickbreak.ogg'
+
/obj/item/roguekey/lord
name = "master key"
desc = "The Lord's key."
@@ -172,13 +187,12 @@
icon_state = "brownkey"
lockid = "roomhunt"
-//vampire mansion//
+//vampire mansion
/obj/item/roguekey/vampire
name = "mansion key"
desc = "The key to a vampire lord's castle."
icon_state = "vampkey"
lockid = "mansionvampire"
-//
/obj/item/roguekey/blacksmith
name = "blacksmith key"
@@ -434,4 +448,4 @@
KE.name = src.holdname
to_chat(user, span_notice("You add [src] to [K]."))
qdel(src)
-
+
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index d7dadadf7..a041be3bf 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -263,6 +263,9 @@
if(istype(W, /obj/item/roguekey) || istype(W, /obj/item/keyring))
trykeylock(W, user)
return
+ if(istype(W, /obj/item/lockpick))
+ trypicklock(W, user)
+ return
if(src.tool_interact(W,user))
return 1 // No afterattack
else
@@ -308,6 +311,63 @@
return TRUE
+obj/structure/closet/proc/trypicklock(obj/item/I, mob/user)
+ if(opened)
+ to_chat(user, "This cannot be picked while it is open.")
+ return
+ if(!keylock)
+ to_chat(user, "There's no lock on this.")
+ return
+ if(broken)
+ to_chat(user, "The lock is broken.")
+ return
+ else
+ var/lockprogress = 0
+ var/locktreshold = 100
+
+ var/obj/item/lockpick/P = I
+ var/mob/living/L = user
+
+ var/pickskill = user.mind.get_skill_level(/datum/skill/misc/lockpicking)
+ var/perbonus = L.STAPER/5
+ var/picktime = 70
+ var/pickchance = 35
+ var/moveup = 10
+
+ picktime -= (pickskill * 10)
+ picktime = clamp(picktime, 10, 70)
+
+ moveup += (pickskill * 3)
+ moveup = clamp(moveup, 10, 30)
+
+ pickchance += pickskill * 10
+ pickchance += perbonus
+ pickchance *= P.picklvl
+ pickchance = clamp(pickchance, 1, 95)
+
+ while(!QDELETED(I) &&(lockprogress < locktreshold))
+ if(!do_after(user, picktime, target = src))
+ break
+ if(prob(pickchance))
+ lockprogress += moveup
+ playsound(src.loc, pick('sound/items/pickgood1.ogg','sound/items/pickgood2.ogg'), 5, TRUE)
+ to_chat(user, "Click...")
+ if(L.mind)
+ var/amt2raise = L.STAINT
+ var/boon = L.mind.get_learning_boon(/datum/skill/misc/lockpicking)
+ L.mind.adjust_experience(/datum/skill/misc/lockpicking, amt2raise * boon)
+ if(lockprogress >= locktreshold)
+ to_chat(user, "The locking mechanism gives.")
+ togglelock(user)
+ break
+ else
+ continue
+ else
+ playsound(loc, 'sound/items/pickbad.ogg', 40, TRUE)
+ I.take_damage(1, BRUTE, "melee")
+ to_chat(user, "Clack.")
+ continue
+ return
/obj/structure/closet/proc/after_weld(weld_state)
return
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index 1d9e6834d..10c3cbf2d 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -276,9 +276,69 @@
trykeylock(I, user)
// else if(user.used_intent.type != INTENT_HARM)
// return attack_hand(user)
+ if(istype(I, /obj/item/lockpick))
+ trypicklock(I, user)
else
return ..()
+/obj/structure/mineral_door/proc/trypicklock(obj/item/I, mob/user)
+ if(door_opened || isSwitchingStates)
+ to_chat(user, "This cannot be picked while it is open.")
+ return
+ if(!keylock)
+ return
+ if(lockbroken)
+ to_chat(user, "The lock to this door is broken.")
+ user.changeNext_move(CLICK_CD_MELEE)
+ else
+ var/lockprogress = 0
+ var/locktreshold = 100
+
+ var/obj/item/lockpick/P = I
+ var/mob/living/L = user
+
+ var/pickskill = user.mind.get_skill_level(/datum/skill/misc/lockpicking)
+ var/perbonus = L.STAPER/5
+ var/picktime = 70
+ var/pickchance = 35
+ var/moveup = 10
+
+ picktime -= (pickskill * 10)
+ picktime = clamp(picktime, 10, 70)
+
+ moveup += (pickskill * 3)
+ moveup = clamp(moveup, 10, 30)
+
+ pickchance += pickskill * 10
+ pickchance += perbonus
+ pickchance *= P.picklvl
+ pickchance = clamp(pickchance, 1, 95)
+
+
+
+ while(!QDELETED(I) &&(lockprogress < locktreshold))
+ if(!do_after(user, picktime, target = src))
+ break
+ if(prob(pickchance))
+ lockprogress += moveup
+ playsound(src.loc, pick('sound/items/pickgood1.ogg','sound/items/pickgood2.ogg'), 5, TRUE)
+ to_chat(user, "Click...")
+ if(L.mind)
+ var/amt2raise = L.STAINT
+ var/boon = L.mind.get_learning_boon(/datum/skill/misc/lockpicking)
+ L.mind.adjust_experience(/datum/skill/misc/lockpicking, amt2raise * boon)
+ if(lockprogress >= locktreshold)
+ to_chat(user, "The locking mechanism gives.")
+ lock_toggle(user)
+ break
+ else
+ continue
+ else
+ playsound(loc, 'sound/items/pickbad.ogg', 40, TRUE)
+ I.take_damage(1, BRUTE, "melee")
+ to_chat(user, "Clack.")
+ continue
+ return
/obj/structure/mineral_door/proc/trykeylock(obj/item/I, mob/user)
if(door_opened || isSwitchingStates)
diff --git a/code/modules/antagonists/roguetown/villain/bandit.dm b/code/modules/antagonists/roguetown/villain/bandit.dm
index d8190d696..63247a18e 100644
--- a/code/modules/antagonists/roguetown/villain/bandit.dm
+++ b/code/modules/antagonists/roguetown/villain/bandit.dm
@@ -114,6 +114,7 @@
H.mind.adjust_skillrank(/datum/skill/misc/climbing, 3, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/sewing, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/medicine, 2, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/misc/lockpicking, 3, TRUE)
belt = /obj/item/storage/belt/rogue/leather
pants = /obj/item/clothing/under/roguetown/trou/leather
shirt = /obj/item/clothing/suit/roguetown/shirt/shortshirt/random
diff --git a/code/modules/antagonists/roguetown/villain/maniac/maniac.dm b/code/modules/antagonists/roguetown/villain/maniac/maniac.dm
index dfd1c1ba7..3021c796d 100644
--- a/code/modules/antagonists/roguetown/villain/maniac/maniac.dm
+++ b/code/modules/antagonists/roguetown/villain/maniac/maniac.dm
@@ -95,6 +95,7 @@
owner.adjust_skillrank(/datum/skill/combat/knives, 6, TRUE)
owner.adjust_skillrank(/datum/skill/combat/wrestling, 5, TRUE)
owner.adjust_skillrank(/datum/skill/combat/unarmed, 4, TRUE)
+ owner.adjust_skillrank(/datum/skill/misc/lockpicking, 2, TRUE)
STASTR = dreamer.STASTR
STACON = dreamer.STACON
STAEND = dreamer.STAEND
diff --git a/code/modules/cargo/packsrogue/tools.dm b/code/modules/cargo/packsrogue/tools.dm
index 4c008d307..1fec82eaa 100644
--- a/code/modules/cargo/packsrogue/tools.dm
+++ b/code/modules/cargo/packsrogue/tools.dm
@@ -73,3 +73,8 @@
name = "Proesthetic Arm (R)"
cost = 40
contains = list(/obj/item/bodypart/r_arm/rproesthetic)
+
+/datum/supply_pack/rogue/tools/lockpicks
+ name = "Lockpicks"
+ cost = 20
+ contains = /obj/item/lockpickring/mundane
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/heartfelt.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/heartfelt.dm
index 3775e322b..9616bef55 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/heartfelt.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/heartfelt.dm
@@ -40,6 +40,7 @@
H.mind.adjust_skillrank(/datum/skill/misc/sneaking, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/medicine, 1, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/riding, 3, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/misc/lockpicking, 1, TRUE)
H.change_stat("strength", 2)
H.change_stat("intelligence", 2)
H.change_stat("endurance", 2)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/heartfelthand.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/heartfelthand.dm
index ddc41f915..79a2b9149 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/heartfelthand.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/heartfelthand.dm
@@ -35,6 +35,7 @@
H.mind.adjust_skillrank(/datum/skill/misc/athletics, 3, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/reading, 4, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/riding, 2, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/misc/lockpicking, 2, TRUE)
H.change_stat("strength", 2)
H.change_stat("perception", 3)
H.change_stat("intelligence", 3)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/treasurehunter.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/treasurehunter.dm
index 7fd46bbd7..62221a616 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/treasurehunter.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/treasurehunter.dm
@@ -23,6 +23,7 @@
armor = /obj/item/clothing/suit/roguetown/armor/leather/vest/black
shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt/random
backr = /obj/item/storage/backpack/rogue/satchel
+ backpack_contents = list(/obj/item/lockpick = 1)
belt = /obj/item/storage/belt/rogue/leather
backpack_contents = list(/obj/item/bait = 1)
gloves = /obj/item/clothing/gloves/roguetown/fingerless
@@ -45,6 +46,7 @@
H.mind.adjust_skillrank(/datum/skill/misc/reading, 3, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/swimming, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/climbing, 4, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/misc/lockpicking, 2, TRUE)
H.change_stat("strength", 1)
H.change_stat("perception", 1)
H.change_stat("intelligence", 1)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/witchhunter.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/witchhunter.dm
index d5fa8db6f..06ad804ee 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/witchhunter.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rare/witchhunter.dm
@@ -47,6 +47,7 @@
H.mind.adjust_skillrank(/datum/skill/craft/traps, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/medicine, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/sneaking, 2, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/misc/lockpicking, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/whipsflails, rand(4,5), TRUE)
H.change_stat("intelligence", 1)
H.change_stat("strength", 1)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm
index 10bedfa61..a9e631698 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/rogue.dm
@@ -43,6 +43,7 @@
H.mind.adjust_skillrank(/datum/skill/misc/stealing, 5, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/riding, pick(1,2), TRUE)
H.mind.adjust_skillrank(/datum/skill/craft/engineering, 1, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/misc/lockpicking, 4, TRUE)
pants = /obj/item/clothing/under/roguetown/trou/leather
shirt = /obj/item/clothing/suit/roguetown/shirt/undershirt
gloves = /obj/item/clothing/gloves/roguetown/leather
@@ -52,6 +53,7 @@
armor = /obj/item/clothing/suit/roguetown/armor/leather
cloak = /obj/item/clothing/cloak/raincloak/mortus
backl = /obj/item/storage/backpack/rogue/satchel
+ backpack_contents = list(/obj/item/lockpick = 1)
beltr = /obj/item/rogueweapon/huntingknife/idagger/steel
beltl = /obj/item/rogueweapon/huntingknife/idagger/steel
ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/special/nakedandafraid.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/special/nakedandafraid.dm
index 8330a1f2d..db606ad48 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/special/nakedandafraid.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/special/nakedandafraid.dm
@@ -31,6 +31,7 @@
H.mind.adjust_skillrank(/datum/skill/misc/climbing, 4, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/swimming, 4, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/medicine, 2, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/misc/lockpicking, 3, TRUE)
H.change_stat("strength", 2)
H.change_stat("endurance", 4)
H.change_stat("constitution", 1)
diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/special/torso.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/special/torso.dm
index 3d0b70a76..c3f4f5561 100644
--- a/code/modules/jobs/job_types/roguetown/adventurer/types/special/torso.dm
+++ b/code/modules/jobs/job_types/roguetown/adventurer/types/special/torso.dm
@@ -32,6 +32,7 @@
H.mind.adjust_skillrank(/datum/skill/misc/athletics, 6, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/medicine, 6, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/reading, 3, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/misc/lockpicking, 5, TRUE)
H.change_stat("strength", 5)
H.change_stat("endurance", 6)
H.change_stat("constitution", 6)
diff --git a/code/modules/jobs/job_types/roguetown/courtier/jester.dm b/code/modules/jobs/job_types/roguetown/courtier/jester.dm
index 4b59af58d..53804ca7e 100644
--- a/code/modules/jobs/job_types/roguetown/courtier/jester.dm
+++ b/code/modules/jobs/job_types/roguetown/courtier/jester.dm
@@ -51,6 +51,7 @@
H.mind.adjust_skillrank(/datum/skill/misc/sneaking, 4, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/stealing, 5, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/climbing, 4, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/misc/lockpicking, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/music, pick(1,2), TRUE)
H.STASTR = rand(1, 20)
H.STAINT = rand(1, 20)
diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/desertrider.dm b/code/modules/jobs/job_types/roguetown/mercenaries/desertrider.dm
index 548d27cac..24a86f4c9 100644
--- a/code/modules/jobs/job_types/roguetown/mercenaries/desertrider.dm
+++ b/code/modules/jobs/job_types/roguetown/mercenaries/desertrider.dm
@@ -65,6 +65,7 @@
H.mind.adjust_skillrank(/datum/skill/misc/reading, 1, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/athletics, 3, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/riding, 2, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/misc/lockpicking, 1, TRUE)
H.change_stat("strength", 2)
H.change_stat("endurance", 3)
H.change_stat("constitution", 2)
diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/grenzelhoft.dm b/code/modules/jobs/job_types/roguetown/mercenaries/grenzelhoft.dm
index a43cdca99..7cc335e11 100644
--- a/code/modules/jobs/job_types/roguetown/mercenaries/grenzelhoft.dm
+++ b/code/modules/jobs/job_types/roguetown/mercenaries/grenzelhoft.dm
@@ -62,6 +62,7 @@
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.mind.adjust_skillrank(/datum/skill/misc/lockpicking, 1, TRUE)
H.change_stat("strength", 3)
H.change_stat("endurance", 2)
H.change_stat("constitution", 3)
diff --git a/code/modules/jobs/job_types/roguetown/peasants/beggar.dm b/code/modules/jobs/job_types/roguetown/peasants/beggar.dm
index 01e09c33c..f9777db4c 100644
--- a/code/modules/jobs/job_types/roguetown/peasants/beggar.dm
+++ b/code/modules/jobs/job_types/roguetown/peasants/beggar.dm
@@ -72,6 +72,7 @@
H.mind.adjust_skillrank(/datum/skill/misc/climbing, rand(2,5), TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/reading, 4, TRUE) //very good reading he is wise
H.mind.adjust_skillrank(/datum/skill/combat/polearms, rand(2,5), TRUE) // dog beating staff
+ H.mind.adjust_skillrank(/datum/skill/misc/lockpicking, rand(3,5), TRUE)
H.STASTR = rand(1, 20)
H.STAINT = rand(5, 20)
H.STALUC = rand(1, 20)
@@ -116,7 +117,8 @@
if(H.mind)
H.mind.adjust_skillrank(/datum/skill/misc/sneaking, rand(1,5), TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/stealing, 3, TRUE)
- H.mind.adjust_skillrank(/datum/skill/misc/climbing, rand(1,5), TRUE)
+ H.mind.adjust_skillrank(/datum/skill/misc/climbing, rand(2,5), TRUE)
+ H.mind.adjust_skillrank(/datum/skill/misc/lockpicking, rand(1,4), TRUE)
H.STALUC = rand(1, 20)
if(prob(5))
r_hand = /obj/item/rogueweapon/mace/woodclub
diff --git a/code/modules/jobs/job_types/roguetown/peasants/prisoner.dm b/code/modules/jobs/job_types/roguetown/peasants/prisoner.dm
index 7e2292bc5..ac8145f97 100644
--- a/code/modules/jobs/job_types/roguetown/peasants/prisoner.dm
+++ b/code/modules/jobs/job_types/roguetown/peasants/prisoner.dm
@@ -39,6 +39,7 @@
H.mind.adjust_skillrank(/datum/skill/combat/unarmed, 1, TRUE)
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/lockpicking, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/sneaking, 1, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/music, 1, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/riding, 2, TRUE)
diff --git a/code/modules/jobs/job_types/roguetown/yeomen/merchant.dm b/code/modules/jobs/job_types/roguetown/yeomen/merchant.dm
index 17e332b9a..6fc8b6e02 100644
--- a/code/modules/jobs/job_types/roguetown/yeomen/merchant.dm
+++ b/code/modules/jobs/job_types/roguetown/yeomen/merchant.dm
@@ -42,6 +42,7 @@
H.mind.adjust_skillrank(/datum/skill/misc/medicine, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/craft/cooking, 2, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/riding, 3, TRUE)
+ H.mind.adjust_skillrank(/datum/skill/misc/lockpicking, 1, TRUE)
ADD_TRAIT(H, TRAIT_SEEPRICES, type)
//50% chance to be raceswapped to Giza because slop lore
if(ishumannorthern(H) && prob(50))
diff --git a/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/_anvil_recipe.dm b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/_anvil_recipe.dm
index cdacd55d6..5739aa5bf 100644
--- a/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/_anvil_recipe.dm
+++ b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/_anvil_recipe.dm
@@ -112,6 +112,9 @@
I.obj_integrity *= modifier
I.max_integrity *= modifier
I.sellprice *= modifier
+ if(istype(I, /obj/item/lockpick))
+ var/obj/item/lockpick/L = I
+ L.picklvl = modifier
if(istype(I, /obj/item/rogueweapon))
var/obj/item/rogueweapon/W = I
W.force *= modifier
diff --git a/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm
index 1aa7e03b4..f6694aad4 100644
--- a/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm
+++ b/code/modules/roguetown/roguejobs/blacksmith/anvil_recipes/tools.dm
@@ -103,6 +103,18 @@
created_item = list(/obj/item/customblank, /obj/item/customblank, /obj/item/customblank, /obj/item/customblank, /obj/item/customblank)
i_type = "General"
+/datum/anvil_recipe/tools/lockpicks
+ name = "Lockpicks x3"
+ req_bar = /obj/item/ingot/iron
+ created_item = list(/obj/item/lockpick, /obj/item/lockpick, /obj/item/lockpick)
+ i_type = "General"
+
+/datum/anvil_recipe/tools/lockpickring
+ name = "Lockpickrings x3"
+ req_bar = /obj/item/ingot/iron
+ created_item = list(/obj/item/lockpickring, /obj/item/lockpickring, /obj/item/lockpickring)
+ i_type = "General"
+
/datum/anvil_recipe/tools/thresher
name = "Thresher (+1 Stick)"
req_bar = /obj/item/ingot/iron
diff --git a/icons/roguetown/items/lockpicks.dmi b/icons/roguetown/items/lockpicks.dmi
new file mode 100644
index 000000000..aa0b4fbf1
Binary files /dev/null and b/icons/roguetown/items/lockpicks.dmi differ
diff --git a/sound/items/pickbad.ogg b/sound/items/pickbad.ogg
new file mode 100644
index 000000000..d087d052d
Binary files /dev/null and b/sound/items/pickbad.ogg differ
diff --git a/sound/items/pickbreak.ogg b/sound/items/pickbreak.ogg
new file mode 100644
index 000000000..a76e4c252
Binary files /dev/null and b/sound/items/pickbreak.ogg differ
diff --git a/sound/items/pickgood1.ogg b/sound/items/pickgood1.ogg
new file mode 100644
index 000000000..0f5ec5bdd
Binary files /dev/null and b/sound/items/pickgood1.ogg differ
diff --git a/sound/items/pickgood2.ogg b/sound/items/pickgood2.ogg
new file mode 100644
index 000000000..0cd7095ac
Binary files /dev/null and b/sound/items/pickgood2.ogg differ