diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 7b71b34f6a..26620548ab 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -226,6 +226,7 @@ #define BCLASS_EFFECT "effect" #define BCLASS_PUNISH "punish" #define BCLASS_SUNDER "sunder" +#define BCLASS_HALFSWORD "stab" //Material class (what material is striking) #define MCLASS_GENERIC 1 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 5b9b9c16fd..3a9610bf00 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -61,6 +61,13 @@ #define TRAIT_TALENTED_ALCHEMIST "Talented Alchemist" // Allows alchemy XP gain past apprentice #define TRAIT_LAMIAN_TAIL "Lamian Tail" #define TRAIT_DUNGEONMASTER "Ruthless Jailor" +#define TRAIT_SKILLBLESSED "Skill Blessed" +#define TRAIT_LONGSWORDSMAN "Master Longswordman" +#define TRAIT_SABRIST "Renowned Sabrist" +#define TRAIT_ARMOUR_LIKED "Fitting Armour" +#define TRAIT_ARMOUR_DISLIKED "Misfitting Armour" +#define TRAIT_FENCERDEXTERITY "Fencer's Dexterity" +#define TRAIT_HONORBOUND "Honorbound" // no idea what this trait even is #define TRAIT_DEATHBARGAIN "Death Bargain" // Used by UNDERMAIDEN'S BARGAIN #define TRAIT_RITUALIST "Ritualist" // Allows use of ritual chalk #define TRAIT_INQUISITION "Member of the Otavan Inquisition" @@ -276,6 +283,12 @@ GLOBAL_LIST_INIT(roguetraits, list( TRAIT_DISGRACED_NOBLE = span_warning("I was a scion of a noble house... long ago."), TRAIT_EMPATH = span_info("I can notice when people are in pain, and I feel peace when they're happy."), TRAIT_BREADY = span_info("Defensive stance does not passively fatigue me."), + TRAIT_ARMOUR_LIKED = span_greentext("I'm wearing something more suited to my style."), + TRAIT_ARMOUR_DISLIKED = span_warning("I'm wearing something that burdens me."), + TRAIT_FENCERDEXTERITY = span_info("I've trained my entire lyfe around the art of unarmoured fencing, affording myself unmatched speed when wearing very light armour. I'm very choosy otherwise."), + TRAIT_SKILLBLESSED = span_greentext("I've reunited with an old friend of mine. All is well."), + TRAIT_LONGSWORDSMAN = span_info("\"I will crush anyone who opposes me. I am of royal blood. I dispense justice, advance the cause of good and destroy evil. To those who learn my crossings I will grant great fame and renown in the art of armed fighting.\" - I fight like a Master when I wield any longsword, though I can only perform master strikes with a perfectly balanced basket-hilted or reformist longsword."), + TRAIT_SABRIST = span_info("I've learned all there is to know about the Southern curve. When using a szöréndnížine sabre, I fight like a Master. My swings are innately more accurate when targetting hands and arms."), TRAIT_MEDIUMARMOR = span_info("I can move freely in medium armor."), TRAIT_HEAVYARMOR = span_info("I can move freely in heavy armor."), TRAIT_DODGEEXPERT = span_info("I can dodge easily while only wearing light armor."), diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index e66d20c2c7..eee4d7cf56 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -209,6 +209,10 @@ GLOBAL_LIST_INIT(traits_by_type, list( TRAIT_CRIMSON_CURSE, TRAIT_MONK_ROBE, TRAIT_ENGINEERING_GOGGLES, + TRAIT_LONGSWORDSMAN, + TRAIT_SABRIST, + TRAIT_FENCERDEXTERITY, + TRAIT_HONORBOUND, TRAIT_MASTER_CARPENTER, TRAIT_MASTER_MASON, TRAIT_FOOD_STIPEND, diff --git a/code/datums/components/armour_filtering.dm b/code/datums/components/armour_filtering.dm new file mode 100644 index 0000000000..a10e279f57 --- /dev/null +++ b/code/datums/components/armour_filtering.dm @@ -0,0 +1,152 @@ +/datum/component/armour_filtering + dupe_mode = COMPONENT_DUPE_ALLOWED + var/required_trait + var/additive + var/positive + +/datum/component/armour_filtering/Initialize(skill_trait, positive_bonus, bonus_additive = FALSE) + . = ..() + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + required_trait = skill_trait + additive = bonus_additive + + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) + +/datum/component/armour_filtering/positive + positive = TRUE + +/datum/component/armour_filtering/negative + positive = FALSE + +/datum/component/armour_filtering/proc/on_equip() + SIGNAL_HANDLER + var/obj/item/I = parent + var/mob/living/carbon/human/user + + if(ishuman(I.loc)) + user = I.loc + + if(!user) + return + if(!HAS_TRAIT(user, required_trait)) + return + + if(!isclothing(I)) + return + var/obj/item/clothing/worn_thing = I + spawn(0) + if(!(worn_thing.item_flags & IN_INVENTORY)) + return + if(worn_thing.item_flags & IN_STORAGE) + return + var/list/obj/item/held_list = user.get_held_items() + for(var/obj/item/held_thing in held_list) + if(held_thing == parent) + return + handle_boons(user, TRUE) + + return + +/datum/component/armour_filtering/proc/on_drop() + SIGNAL_HANDLER + var/obj/item/I = parent + var/mob/living/carbon/human/user + + if(ishuman(I.loc)) + user = I.loc + + if(!user) + return + if(!HAS_TRAIT(user, required_trait)) + return + + handle_boons(user, FALSE) + + for(var/thing in user.contents) + if(!isclothing(thing)) + return + var/obj/item/clothing/worn_thing = thing + if(worn_thing == I) + continue + if(!(worn_thing.item_flags & IN_INVENTORY)) + return + if(worn_thing.item_flags & IN_STORAGE) + return + var/list/datum/component/armour_filtering/comps = worn_thing.GetComponents(/datum/component/armour_filtering) + if(!comps) + continue + for(var/datum/component/armour_filtering/af_comp in comps) + if(af_comp.required_trait != required_trait) + continue + if(af_comp.positive != positive) + continue + if(!af_comp.additive) + handle_boons(user, TRUE) + return + if(af_comp.positive) + ADD_TRAIT(user, TRAIT_ARMOUR_LIKED, TRAIT_GENERIC) + else + ADD_TRAIT(user, TRAIT_ARMOUR_DISLIKED, TRAIT_GENERIC) + + return + + +/datum/component/armour_filtering/proc/handle_boons(mob/living/carbon/human/user, equip) + if(equip) + if(!positive) + to_chat(user, span_info("[parent] is not to my liking. ([required_trait])")) + if(HAS_TRAIT(user, TRAIT_ARMOUR_DISLIKED) && !additive) + to_chat(user, span_info("...yet, another piece of my armour is on my mind.")) + return + ADD_TRAIT(user, TRAIT_ARMOUR_DISLIKED, TRAIT_GENERIC) + else + to_chat(user, span_info("[parent] fits me well. ([required_trait])")) + if(HAS_TRAIT(user, TRAIT_ARMOUR_LIKED) && !additive) + to_chat(user, span_info("..yet another piece of my armour is on my mind.")) + return + ADD_TRAIT(user, TRAIT_ARMOUR_LIKED, TRAIT_GENERIC) + trait_boon_equip(user) + return + + if(!positive) + to_chat(user, span_info("Free at last of [parent]. ([required_trait])")) + if(HAS_TRAIT(user, TRAIT_ARMOUR_DISLIKED)) + REMOVE_TRAIT(user, TRAIT_ARMOUR_DISLIKED, TRAIT_GENERIC) + else + to_chat(user, span_info("I miss [parent] already. ([required_trait])")) + if(HAS_TRAIT(user, TRAIT_ARMOUR_LIKED)) + REMOVE_TRAIT(user, TRAIT_ARMOUR_LIKED, TRAIT_GENERIC) + trait_boon_drop(user) + return + + +/* +TRAIT UNIQUE PROCS +*/ + + +/datum/component/armour_filtering/proc/trait_boon_equip(mob/living/carbon/human/user) + if(HAS_TRAIT(user, TRAIT_FENCERDEXTERITY)) + if(!positive) + user.dropItemToGround(parent, TRUE, TRUE) + if(!HAS_TRAIT(user, TRAIT_ARMOUR_DISLIKED)) + return + REMOVE_TRAIT(user, TRAIT_ARMOUR_DISLIKED, TRAIT_GENERIC) + return + + if(HAS_TRAIT(user, TRAIT_PSYDONIAN_GRIT)) + if(positive) + user.apply_status_effect(/datum/status_effect/buff/psydonic_endurance) + return + return + +/datum/component/armour_filtering/proc/trait_boon_drop(mob/living/carbon/human/user) + if(HAS_TRAIT(user, TRAIT_PSYDONIAN_GRIT)) + if(positive) + if(!user.has_status_effect(/datum/status_effect/buff/psydonic_endurance)) + return + user.remove_status_effect(/datum/status_effect/buff/psydonic_endurance) + return + return diff --git a/code/datums/components/skill_blessed.dm b/code/datums/components/skill_blessed.dm new file mode 100644 index 0000000000..b471c858cd --- /dev/null +++ b/code/datums/components/skill_blessed.dm @@ -0,0 +1,141 @@ +/datum/component/skill_blessed + dupe_mode = COMPONENT_DUPE_UNIQUE + var/required_trait + var/datum/skill/weapon_skill + var/skill_amount + var/original_skill + var/mob/living/carbon/human/original_user + var/unique + +/datum/component/skill_blessed/Initialize(skill_trait, skillgiven_type, skillgiven_amount, trait_unique = FALSE) + . = ..() + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + required_trait = skill_trait + weapon_skill = skillgiven_type + skill_amount = skillgiven_amount + unique = trait_unique + + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_obj_examine)) + +/datum/component/skill_blessed/proc/on_equip() + SIGNAL_HANDLER + var/obj/item/I = parent + var/mob/living/carbon/human/user + + if(ishuman(I.loc)) + user = I.loc + else if(ishuman(I.loc.loc)) + user = I.loc.loc + + if(!user) + return + if(!HAS_TRAIT(user, required_trait)) + return + + var/list/obj/item/held_list = user.get_held_items() + for(var/obj/item/held_thing in held_list) + if(held_thing == parent) + give_skill(user) + return + remove_skill(user) + +/datum/component/skill_blessed/proc/on_drop() + SIGNAL_HANDLER + + if(!original_user) + return + if(!ishuman(original_user)) + return + + if(!HAS_TRAIT(original_user, required_trait)) + return + if(!HAS_TRAIT(original_user, TRAIT_SKILLBLESSED)) + return + + for(var/obj/item/held_thing in original_user.get_held_items()) + if(istype(held_thing, parent.type)) + return + + remove_skill(original_user) + +/datum/component/skill_blessed/proc/on_obj_examine(datum/source, mob/M) + if(!HAS_TRAIT(M, required_trait)) + return + to_chat(M, span_green("[parent] and I are well acquainted. ([required_trait])")) + + +/datum/component/skill_blessed/proc/give_skill(mob/user) + if(!HAS_TRAIT(user, required_trait)) + return + if(HAS_TRAIT(user, TRAIT_SKILLBLESSED)) + to_chat(user, span_warning("My mind is already focused on a different weapon.")) + return + + to_chat(user, span_info("[parent] and I are old friends. ([required_trait])")) + original_skill = user.get_skill_level(weapon_skill) + user.adjust_skillrank_up_to(weapon_skill, skill_amount, silent = TRUE) + ADD_TRAIT(user, TRAIT_SKILLBLESSED, TRAIT_GENERIC) + + original_user = user + if(unique) + trait_unique_equip(user) + + return + +/datum/component/skill_blessed/proc/remove_skill(mob/user) + if(!HAS_TRAIT(user, required_trait)) + return + if(!HAS_TRAIT(original_user, TRAIT_SKILLBLESSED)) + return + + var/datum/component/skill_blessed/other_skill + + for(var/obj/item/held_thing in user.get_held_items()) + if(held_thing == parent) + return + var/list/datum/component/skill_blessed/comps = held_thing.GetComponents(/datum/component/skill_blessed) + if(!comps) + continue + for(var/datum/component/skill_blessed/sb_comp in comps) + if(!HAS_TRAIT(user, sb_comp.required_trait)) + continue + other_skill = sb_comp + break + + user.adjust_skillrank_down_to(weapon_skill, original_skill, silent = TRUE) + to_chat(user, span_info("Another tyme, old friend. ([required_trait])")) + REMOVE_TRAIT(user, TRAIT_SKILLBLESSED, TRAIT_GENERIC) + + if(unique) + trait_unique_drop(user) + if(original_user) + original_user = null + if(original_skill) + original_skill = null + if(other_skill) + other_skill.on_equip() + + return + + +/* +TRAIT UNIQUE PROCS +*/ + + +/datum/component/skill_blessed/proc/trait_unique_equip(mob/user) + if(HAS_TRAIT(user, TRAIT_SABRIST)) + var/obj/item/rogueweapon/sword/sabre/steppesman/shashka = parent + for(var/datum/intent/sword/sab_intent in shashka.possible_item_intents) + sab_intent.accuracy_modifier += 10 + return + +/datum/component/skill_blessed/proc/trait_unique_drop(mob/user) + if(HAS_TRAIT(user, TRAIT_SABRIST)) + var/obj/item/rogueweapon/sword/sabre/steppesman/shashka = parent + for(var/datum/intent/sword/sab_intent in shashka.possible_item_intents) + sab_intent.accuracy_modifier = initial(sab_intent.accuracy_modifier) + return diff --git a/code/datums/status_effects/rogue/debuff.dm b/code/datums/status_effects/rogue/debuff.dm index 965f958bc4..aea4e38b15 100644 --- a/code/datums/status_effects/rogue/debuff.dm +++ b/code/datums/status_effects/rogue/debuff.dm @@ -637,6 +637,56 @@ desc = "Something has chilled me to the bone! It's hard to move." icon_state = "muscles" +//// Freifechter Daze Variants ///// +/datum/status_effect/debuff/dazed/longsword + id = "durchlauffen" + alert_type = /atom/movable/screen/alert/status_effect/debuff/dazed/longsword + effectedstats = list(STATKEY_SPD = -3, STATKEY_INT = -1) + duration = 11 SECONDS + status_type = STATUS_EFFECT_REFRESH + +/atom/movable/screen/alert/status_effect/debuff/dazed/longsword + name = "Master Strike" + desc = "How the fuck did they do that!? My ears are ringing!" + icon_state = "mstrike" + +/datum/status_effect/debuff/dazed/longsword2h + id = "zorn ort" + alert_type = /atom/movable/screen/alert/status_effect/debuff/dazed/longsword2h + effectedstats = list(STATKEY_PER = -4, STATKEY_LCK = -3) + duration = 8 SECONDS + status_type = STATUS_EFFECT_REFRESH + +/atom/movable/screen/alert/status_effect/debuff/dazed/longsword2h + name = "Master Strike" + desc = "How the fuck did they do that!? My eye!" + icon_state = "mstrike" + +/datum/status_effect/debuff/dazed/freisabre + id = "uszkodzić" + alert_type = /atom/movable/screen/alert/status_effect/debuff/dazed/freisabre + effectedstats = list(STATKEY_STR = -2, STATKEY_SPD = -3) + duration = 11 SECONDS + status_type = STATUS_EFFECT_REFRESH + +/atom/movable/screen/alert/status_effect/debuff/dazed/freisabre + name = "Master Strike" + desc = "How the fuck did they do that!? My wrist!" + icon_state = "mstrike" + +/datum/status_effect/debuff/dazed/swipe + id = "clinch & swipe" + alert_type = /atom/movable/screen/alert/status_effect/debuff/dazed/swipe + effectedstats = list(STATKEY_CON = -4, STATKEY_STR = -1) + duration = 1.5 SECONDS //Should last BARELY ENOUGH for someone who's actively grappling and swiping you to get a constant refresh of the dedbuff, otherwise it's useless. + status_type = STATUS_EFFECT_REFRESH + +/atom/movable/screen/alert/status_effect/debuff/dazed/swipe + name = "Clinched and Swiped!" + desc = "Urgh! My face! My grip is weakened!" + icon_state = "swiped" + + /datum/status_effect/debuff/blackvitae id = "blackvitae" alert_type = /atom/movable/screen/alert/status_effect/debuff/blackvitae diff --git a/code/game/objects/items/rogueweapons/intents.dm b/code/game/objects/items/rogueweapons/intents.dm index 46731ecb71..c6960875f7 100644 --- a/code/game/objects/items/rogueweapons/intents.dm +++ b/code/game/objects/items/rogueweapons/intents.dm @@ -15,6 +15,8 @@ var/intent_type var/animname = "strike" var/blade_class = BCLASS_BLUNT + /// Additive modifier to accuracy. + var/accuracy_modifier = 0 var/list/hitsound = list('sound/combat/hits/blunt/bluntsmall (1).ogg', 'sound/combat/hits/blunt/bluntsmall (2).ogg') var/canparry = TRUE var/candodge = TRUE diff --git a/code/game/objects/items/rogueweapons/melee/axes.dm b/code/game/objects/items/rogueweapons/melee/axes.dm index dab89d6b64..cbe4aefd1e 100644 --- a/code/game/objects/items/rogueweapons/melee/axes.dm +++ b/code/game/objects/items/rogueweapons/melee/axes.dm @@ -446,6 +446,50 @@ demolition_mod = 2 walking_stick = TRUE + +/obj/item/rogueweapon/stoneaxe/battle/steppesman/chupa + name = "aavnic ćiupaga" + desc = "A steel axe of Aavnic make that combines a deadly weapon with a walking stick - hence its pointed end. It has a flat head that fits the hand comfortably, and it's usable for chopping and smashing. It can hook an opponent's weapon in a pinch. It carries the colours of Szöréndnížina." + possible_item_intents = list(/datum/intent/axe/cut/battle, /datum/intent/axe/cut/battle/lunge, /datum/intent/sword/disarm) + gripped_intents = list(/datum/intent/axe/cut/battle ,/datum/intent/axe/chop/battle, /datum/intent/mace/smash) + force = 22 + force_wielded = 25 + icon = 'icons/roguetown/weapons/special/freifechter.dmi' + icon_state = "ciupaga" + pixel_y = -10 + pixel_x = 0 + inhand_x_dimension = 64 + inhand_y_dimension = 64 + demolition_mod = 2 + +/datum/intent/sword/disarm + name = "disarm" + icon_state = "intake" + animname = "strike" + blade_class = null //We don't use a blade class because it has on damage. + hitsound = list('sound/combat/hits/blunt/metalblunt (1).ogg', 'sound/combat/hits/blunt/metalblunt (2).ogg', 'sound/combat/hits/blunt/metalblunt (3).ogg') + penfactor = BLUNT_DEFAULT_PENFACTOR + swingdelay = 2 //Small delay to hook + damfactor = 0.1 //No real damage + clickcd = 22 //Can't spam this; long delay. + item_d_type = "blunt" + +/datum/intent/axe/cut/battle/lunge + name = "ćiupaga lunge" + desc = "Grip your ćiupaga by the tail-end of the handle and swing in a circular motion to reach further ahead. It will deal extra damage if perfectly positioned, otherwise you'll just hit them with the handle." + damfactor = 1.75 + penfactor = 42 + blade_class = BCLASS_CHOP + reach = 2 + swingdelay = 2 + icon_state = "inchop" + attack_verb = list("lunges and chops", "lunges and hacks") + animname = "chop" + hitsound = list('sound/combat/hits/bladed/genchop (1).ogg', 'sound/combat/hits/bladed/genchop (2).ogg', 'sound/combat/hits/bladed/genchop (3).ogg') + clickcd = 14 + item_d_type = "slash" + + /datum/intent/axe/cut/battle/greataxe reach = 2 diff --git a/code/game/objects/items/rogueweapons/melee/knives.dm b/code/game/objects/items/rogueweapons/melee/knives.dm index d0dda58844..87ac9b13a6 100644 --- a/code/game/objects/items/rogueweapons/melee/knives.dm +++ b/code/game/objects/items/rogueweapons/melee/knives.dm @@ -937,6 +937,49 @@ qdel(item) return ..() +/obj/item/rogueweapon/huntingknife/idagger/navaja/freifechter + possible_item_intents = list(/datum/intent/dagger/thrust,/datum/intent/dagger/cut, /datum/intent/dagger/chop, /datum/intent/dagger/thrust/pick) + name = "mountaineer's navaja" + icon = 'icons/roguetown/weapons/special/freifechter32.dmi' + desc = "A folding Etruscan knife valued by merchants, mercenaries and peasants for its convenience. This specific kind of ornate navaja is endemic to Szöréndnížina." + force = 5 + icon_state = "mtnavaja_c" + item_state = "elfdag" + wdefense = 2 + sellprice = 50 + +/obj/item/rogueweapon/huntingknife/idagger/navaja/freifechter/attack_self(mob/user) + extended = !extended + playsound(src.loc, 'sound/blank.ogg', 50, TRUE) + if(extended) + force = 20 + force_dynamic = 20 + wdefense = 7 + wdefense_dynamic = 7 + w_class = WEIGHT_CLASS_NORMAL + throwforce = 23 + icon_state = "mtnavaja_o" + attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + sharpness = IS_SHARP + playsound(user, 'sound/items/knife_open.ogg', 100, TRUE) + equip_delay_self = initial(equip_delay_self) + unequip_delay_self = initial(unequip_delay_self) + inv_storage_delay = initial(inv_storage_delay) + else + force = 5 + force_dynamic = 5 + w_class = WEIGHT_CLASS_SMALL + throwforce = 5 + icon_state = "mtnavaja_c" + attack_verb = list("stubbed", "poked") + sharpness = IS_BLUNT + wdefense = 2 + wdefense_dynamic = 2 + equip_delay_self = 0 SECONDS + unequip_delay_self = 0 SECONDS + inv_storage_delay = 0 SECONDS + + /obj/item/rogueweapon/huntingknife/attack(mob/living/M, mob/living/user) if(user == M && user.used_intent && user.used_intent.blade_class == BCLASS_STAB && istype(user.rmb_intent, /datum/rmb_intent/weak)) if(user.zone_selected == BODY_ZONE_PRECISE_STOMACH || user.zone_selected == BODY_ZONE_CHEST) diff --git a/code/game/objects/items/rogueweapons/melee/polearms.dm b/code/game/objects/items/rogueweapons/melee/polearms.dm index 07d4a78a2b..16a96c6ce1 100644 --- a/code/game/objects/items/rogueweapons/melee/polearms.dm +++ b/code/game/objects/items/rogueweapons/melee/polearms.dm @@ -15,6 +15,28 @@ effective_range = 2 effective_range_type = EFF_RANGE_EXACT + + +/datum/intent/spear/thrust/pike //EXPERIMENTAL + name = "pike thrust" + desc = "Thrust your pike forward from its furthest end to reach farther ahead than any spear ever could. Only effective at three paces." + damfactor = 1.15 + reach = 3 + clickcd = CLICK_CD_CHARGED + 1 + swingdelay = 1.5 + +/datum/intent/spear/thrust/pike/skewer //EXPERIMENTAL + name = "pike lance" + desc = "Grab your pike from a closer end and charge forward with your whole body for devastating damage." + clickcd = CLICK_CD_HEAVY + 3 + swingdelay = 5 + damfactor = 1.5 + penfactor = 35 + reach = 2 + icon_state = "inlance" + attack_verb = list("lances", "runs through", "skewers") + + /datum/intent/spear/thrust/oneh name = "one-handed thrust" reach = 1 @@ -1388,7 +1410,24 @@ /obj/item/rogueweapon/spear/boar/frei name = "Aavnic lándzsa" desc = "A regional earspoon lance with a carved handle, adorned with the colours of the Freifechters. These are smithed by the legendary armourers of Vyšvou and given to distinguished lancers upon their graduation." - icon_state = "praguespear" + icon_state = "cityspear" + icon = 'icons/roguetown/weapons/special/freifechter.dmi' + max_blade_int = 300 //You're gonna parry a lot. You need it. + max_integrity = 235 + +/obj/item/rogueweapon/spear/boar/frei/pike + name = "banner of Szöréndnížina" + desc = "A steel pike with a white and red banner made to spend the time flowing proudly in the wind. A city founded by the free. A State made from the disciplined. Snowy peaks surround her strong walls, her gates make any attack a suicide. Fight, Szöréndnížina. Fight to lyve in a world that rejects you." + icon_state = "citybanner" + force = 18 + force_wielded = 33 + possible_item_intents = list(/datum/intent/dagger/sucker_punch, /datum/intent/sword/bash) + gripped_intents = list(/datum/intent/spear/thrust/pike, /datum/intent/spear/thrust/pike/skewer) + +/obj/item/rogueweapon/spear/boar/frei/pike/reformist + name = "banner of Psydonic Reformism" + desc = "A steel pike with an altered Psydonic cross representing the order of Primo Reformatio, crossed by a black stripe that symbolizes mourning. Mammukhus sum, qui castellum onere fero. Numquam genua flecto aut gradum amitto." + icon_state = "reformistbanner" /obj/item/rogueweapon/spear/lance name = "lance" diff --git a/code/game/objects/items/rogueweapons/melee/swords.dm b/code/game/objects/items/rogueweapons/melee/swords.dm index 77deedc679..58f4fb58ec 100644 --- a/code/game/objects/items/rogueweapons/melee/swords.dm +++ b/code/game/objects/items/rogueweapons/melee/swords.dm @@ -51,6 +51,79 @@ damfactor = 1 item_d_type = "blunt" +// Freifechter Longsword intents // +/datum/intent/sword/cut/master + name = "fendente" + icon_state = "incutmaster" + desc = "Strike the opponent from above with the true edge of the sword and penetrate light armour." + attack_verb = list("masterfully tears", "artfully slits", "adroitly hacks") + damfactor = 1.01 + penfactor = 50 + +/datum/intent/sword/thrust/long/master + name = "stoccato" + icon_state = "instabmaster" + desc = "Enter a long guard and thrust forward with your entire upper body while advancing, maximizing the effectiveness of the thrust." + attack_verb = list("skillfully perforates", "artfully punctures", "deftly sticks") + damfactor = 1.15 + +/datum/intent/effect/daze/longsword/clinch + name = "clinch & swipe" + desc = "Get up in your opponent's face and force them into a clinch, then swipe their face with the crossguard while they're distracted. Good against baited or exhausted opponents." + icon_state = "inpunish" + attack_verb = list("forcibly clinches and swipes") + animname = "strike" + target_parts = list(BODY_ZONE_HEAD) + blade_class = BCLASS_BLUNT + hitsound = list('sound/combat/hits/blunt/metalblunt (1).ogg', 'sound/combat/hits/blunt/metalblunt (2).ogg', 'sound/combat/hits/blunt/metalblunt (3).ogg') + damfactor = 0.9 + swingdelay = 3.5 + clickcd = 10 + recovery = 15 + item_d_type = "blunt" + intent_intdamage_factor = 1.2 + canparry = FALSE + candodge = FALSE + intent_effect = /datum/status_effect/debuff/dazed/swipe + +/datum/intent/sword/thrust/long/halfsword + name = "mezza spada" + icon_state = "inimpale" + desc = "Grip the dull portion of your longsword with either hand and use it as leverage to deliver precise, powerful strikes that can dig into gaps in plate and push past maille." + attack_verb = list("goes into a half-sword stance and skewers", "enters a half-sword stance and impales") + hitsound = list('sound/combat/hits/bladed/genstab (1).ogg', 'sound/combat/hits/bladed/genstab (2).ogg', 'sound/combat/hits/bladed/genstab (3).ogg') + penfactor = 80 + clickcd = 12 + swingdelay = 10 + damfactor = 0.86 + blade_class = BCLASS_HALFSWORD + +/datum/intent/sword/thrust/long/halfsword/lesser + name = "halbschwert" + clickcd = 16 + +/datum/intent/effect/daze/longsword + name = "durchlauffen" + desc = "Lock the opponent's arm in place and strike their nose with the pommel of your sword before tossing them, affecting their ability to dodge and feint. Can only be performed one-handed." + attack_verb = list("masterfully pummels") + intent_effect = /datum/status_effect/debuff/dazed/longsword + target_parts = list(BODY_ZONE_PRECISE_NOSE) + damfactor = 0.9 + clickcd = 14 + swingdelay = 3.5 + +/datum/intent/effect/daze/longsword2h + name = "zorn ort" + desc = "Block the opponent's weapon with a strike of your own and advance into a thrust towards the eyes, affecting their vision severely. Can only be performed two-handed." + attack_verb = list("masterfully pokes") + intent_effect = /datum/status_effect/debuff/dazed/longsword2h + target_parts = list(BODY_ZONE_PRECISE_R_EYE, BODY_ZONE_PRECISE_L_EYE) + blade_class = BCLASS_STAB + damfactor = 1.15 //Same as master stab + clickcd = 14 + swingdelay = 2 + + /datum/intent/sword/peel name = "armor peel" icon_state = "inpeel" @@ -339,6 +412,10 @@ sheathe_sound = 'modular_helmsguard/sound/sheath_sounds/put_back_sword2.ogg' special = /datum/special_intent/side_sweep +/obj/item/rogueweapon/sword/long/Initialize() + . = ..() + AddComponent(/datum/component/skill_blessed, TRAIT_LONGSWORDSMAN, /datum/skill/combat/swords, SKILL_LEVEL_MASTER) + /obj/item/rogueweapon/sword/long/equipped(mob/user, slot, initial = FALSE) pickup_sound = pickup_sound @@ -470,17 +547,30 @@ /obj/item/rogueweapon/sword/long/etruscan name = "basket-hilted longsword" - desc = "An uncommon and elaborate type of longsword with a compound hilt like those seen on rapiers and smallswords. It has a marked unsharpened section for safe unarmored half-swording, and it's made of Calorian steel." + desc = "An uncommon and elaborate type of longsword with a compound hilt like those seen on rapiers and smallswords. It has a marked unsharpened section for safe unarmoured half-swording. The quality of the steel speaks for itself; this is a weapon made by masters, for masters." icon_state = "elongsword" + sheathe_icon = "elongsword" + icon = 'icons/roguetown/weapons/special/freifechter.dmi' + possible_item_intents = list(/datum/intent/sword/cut, /datum/intent/sword/thrust/long, /datum/intent/effect/daze/longsword/clinch, /datum/intent/effect/daze/longsword) + gripped_intents = list(/datum/intent/sword/cut/master, /datum/intent/sword/thrust/long/master, /datum/intent/sword/thrust/long/halfsword, /datum/intent/effect/daze/longsword2h) + alt_intents = list(/datum/intent/sword/strike, /datum/intent/sword/bash, /datum/intent/effect/daze) + max_blade_int = 300 + max_integrity = 225 -/obj/item/rogueweapon/sword/long/frei //Challenge weapon - name = "dueling longsword" - desc = "Fechtfeders are a type of training sword brought up by Grenzelhoft fencing guilds, their name - literally \"Feather\" - matches their construction; thinner, lighter, dull but more balanced - with a blade catcher to boot. Freifechters often modify them, giving them edges and a point for use in real dueling - this is one such example, and there's a reason they don't make it out of the fighting pit." - icon_state = "sharpfeder" - force = 22 - force_wielded = 27 - wdefense = 5 //+1 - wbalance = WBALANCE_SWIFT +/obj/item/rogueweapon/sword/long/etruscan/freifechter + name = "psydonic reformist longsword" + desc = "A newly-smithed longsword with a reverse hilt in the shape of a reformist psydonian cross. It has the same kind of hand protection of an Etruscan longsword. The cross is upright when the weapon is sheathed, bronze pommel reflecting sunlight directly - and it becomes inverted when drawn, a symbol of distress. Ad pacem servandam." + sheathe_icon = "reform" + icon_state = "reformistsword" + +/obj/item/rogueweapon/sword/long/fencerguy + name = "grenzelhoftian longsword" + desc = "A masterfully smithed, perfectly-balanced longsword that makes it easy for even a beginner to perform basic fencing maneuvers." + icon_state = "germanlong" + sheathe_icon = "sword1" + max_blade_int = 275 + possible_item_intents = list(/datum/intent/sword/cut, /datum/intent/sword/thrust/long, /datum/intent/dagger/sucker_punch, /datum/intent/sword/bash) + gripped_intents = list(/datum/intent/sword/cut, /datum/intent/sword/thrust/long, /datum/intent/sword/thrust/long/halfsword/lesser, /datum/intent/sword/chop) /obj/item/rogueweapon/sword/long/malumflamm name = "forgefiend flamberge" @@ -1009,6 +1099,48 @@ icon_state = "shashka" sheathe_icon = "shashka" +/datum/intent/sword/cut/sabre/master + name = "pokrajać" + desc = "Perform a masterful wide-arc cut that's strong enough to penetrate light armour." + attack_verb = list("masterfully cuts", "deftly slits", "quarts") + clickcd = 7 + damfactor = 1.25 + penfactor = 55 + +/datum/intent/effect/daze/freisabre + name = "uszkodzić" + desc = "After a few misleading strikes, suddenly slash at your opponent's wrist to affect their speed and strength, preventing them from using their weapon effectively. This move can be parried, but not dodged." + attack_verb = list("deftly wrist-slits") + intent_effect = /datum/status_effect/debuff/dazed/freisabre + target_parts = list(BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND) + blade_class = BCLASS_CUT + damfactor = 1.25 + clickcd = 12 + recovery = 8 + swingdelay = 3 + canparry = TRUE + candodge = FALSE + +/obj/item/rogueweapon/sword/sabre/freifechter + name = "szöréndnížine sabre" + desc = "A rare, specialty-made sabre domestic to Szöréndnížina, made similarly to those of the Potentate's Hussars. It has a large, open hilt with a cross-shaped guard formed from quillons and langets and a heavy curved blade. A chain is attached to the crossguard and into the pommel, protecting the hand. Unlike shorter and ligther sabres, it's large enough to reach the feet." + icon = 'icons/roguetown/weapons/special/freifechter.dmi' + possible_item_intents = list(/datum/intent/sword/cut/sabre/master, /datum/intent/sword/thrust/sabre, /datum/intent/effect/daze/freisabre, /datum/intent/rend) + wdefense = 7 + minstr = 8 + icon_state = "szabla" + sheathe_icon = "szabla" + bigboy = 1 + max_integrity = 215 + max_blade_int = 275 //Similarly statted to the longswords + inhand_x_dimension = 64 + inhand_y_dimension = 64 + +/obj/item/rogueweapon/sword/sabre/freifechter/Initialize() + . = ..() + AddComponent(/datum/component/skill_blessed, TRAIT_SABRIST, /datum/skill/combat/swords, SKILL_LEVEL_MASTER, TRUE) + + //Unique church sword - slightly better than regular sabre due to falx chop. /obj/item/rogueweapon/sword/sabre/nockhopesh name = "moonlight khopesh" diff --git a/code/modules/clothing/rogueclothes/armor.dm b/code/modules/clothing/rogueclothes/armor.dm index 97a0e02603..3c0aefd273 100644 --- a/code/modules/clothing/rogueclothes/armor.dm +++ b/code/modules/clothing/rogueclothes/armor.dm @@ -29,6 +29,10 @@ grid_width = 64 grid_height = 96 + +/obj/item/clothing/suit/roguetown/armor/ComponentInitialize() + AddComponent(/datum/component/armour_filtering/positive, TRAIT_FENCERDEXTERITY) + //LIGHT ARMOR// /obj/item/clothing/suit/roguetown/armor/armordress @@ -214,15 +218,49 @@ /obj/item/clothing/suit/roguetown/armor/gambeson/heavy/freifechter name = "padded fencing shirt" - desc = "A strong quilted shirt that places little weight on the arms, it's worn underneath a strong leather vest. It won't cover your legs." - max_integrity = 200 //Back to default. I think it's right if it doesn't stop you from getting legshotted. + desc = "A strong loosely worn quilted shirt that places little weight on the arms, usually worn underneath a strong leather vest. It won't cover your legs." body_parts_covered = COVERAGE_ALL_BUT_LEGS + icon_state = "fencingshirt" + color = "#FFFFFF" + detail_color = "#414143" + altdetail_color = "#c08955" detail_tag = "_detail" altdetail_tag = "_detailalt" - color = "#FFFFFF" - detail_color = "#3b2b29" - altdetail_color = "#c29057" - icon_state = "fencingshirt" + shiftable = FALSE + armor = ARMOR_PADDED_GOOD + max_integrity = ARMOR_INT_CHEST_LIGHT_MASTER + 35 + prevent_crits = list(BCLASS_CUT, BCLASS_BLUNT, BCLASS_CHOP) + sellprice = 25 + blocksound = SOFTUNDERHIT + blade_dulling = DULLING_BASHCHOP + break_sound = 'sound/foley/cloth_rip.ogg' + drop_sound = 'sound/foley/dropsound/cloth_drop.ogg' + sewrepair = TRUE + cold_protection = 10 + var/picked = FALSE + +/obj/item/clothing/suit/roguetown/shirt/freifechter/shepherd + name = "shepherd's shirt" + desc = "A strong loosely worn quilted shirt that places little weight on the arms." + max_integrity = ARMOR_INT_CHEST_LIGHT_MASTER - 35 + +/obj/item/clothing/suit/roguetown/armor/gambeson/heavy/freifechter/attack_right(mob/user) + ..() + if(!picked) + var/choice = input(user, "Choose a color.", "Fencing colors") as anything in colorlist + var/playerchoice = colorlist[choice] + picked = TRUE + detail_color = playerchoice + detail_tag = "_detail" + update_icon() + if(loc == user && ishuman(user)) + var/mob/living/carbon/H = user + H.update_inv_shirt() + H.update_icon() + +/obj/item/clothing/suit/roguetown/armor/gambeson/heavy/freifechter/Initialize() + . = ..() + update_icon() /obj/item/clothing/suit/roguetown/armor/gambeson/heavy/freifechter/update_icon() cut_overlays() @@ -242,7 +280,7 @@ /obj/item/clothing/suit/roguetown/armor/gambeson/heavy/chargah name = "padded caftan" - desc = "A long overcoat commonly worn in Naledi, Kazengun, and Aavnr - but mostly associated with steppesmen. This specific kind rivals a gambeson in protection." + desc = "A long overcoat commonly worn in Naledi, Kazengun, and Aavnr - but mostly associated with steppesmen. This specific kind rivals a padded gambeson in protection." icon_state = "chargah" color = "#ffffff" boobed = TRUE @@ -571,7 +609,7 @@ desc = "A light, flexible button-up leather jacket that will keep your vitals out of harm's way." icon_state = "freijacket" item_state = "freijacket" - max_integrity = ARMOR_INT_CHEST_LIGHT_MEDIUM + max_integrity = ARMOR_INT_CHEST_LIGHT_MEDIUM + 35 detail_tag = "_detail" color = "#5E4440" detail_color = "#c08955" @@ -589,6 +627,15 @@ ..() update_icon() +/obj/item/clothing/suit/roguetown/armor/leather/heavy/shepherd + name = "shepherd's vest" + desc = "A light, flexible leather vest worn by shepherds in the forested peaks of Aavnr." + icon_state = "freijacket" + item_state = "freijacket" + max_integrity = ARMOR_INT_CHEST_LIGHT_MEDIUM + color = "#313131" + + /obj/item/clothing/suit/roguetown/armor/leather/trophyfur name = "treated trophy fur robes" desc = "A heavy set of hardened robes, lined with fur. The leather is composed of several creatures that were notably difficult to fell by arrow. A proof or rangership among many." @@ -933,6 +980,11 @@ icon_state = "fencercuirass" item_state = "fencercuirass" +/obj/item/clothing/suit/roguetown/armor/plate/half/fencer/ComponentInitialize() + AddComponent(/datum/component/item_equipped_movement_rustle, SFX_PLATE_STEP, 12) + AddComponent(/datum/component/armour_filtering/positive, TRAIT_FENCERDEXTERITY) + AddComponent(/datum/component/armour_filtering/negative, TRAIT_HONORBOUND) + /obj/item/clothing/suit/roguetown/armor/plate/half/fencer/psydon name = "psydonian chestplate" desc = "An expertly smithed form-fitting steel cuirass that is much lighter and agile, but breaks with much more ease. It's thinner, but backed with silk and leather." diff --git a/code/modules/clothing/rogueclothes/gloves.dm b/code/modules/clothing/rogueclothes/gloves.dm index e394fb2378..26ecc1aa68 100644 --- a/code/modules/clothing/rogueclothes/gloves.dm +++ b/code/modules/clothing/rogueclothes/gloves.dm @@ -281,6 +281,12 @@ /obj/item/clothing/gloves/roguetown/angle/grenzelgloves/blacksmith name = "forge gauntlets" +/obj/item/clothing/gloves/roguetown/angle/grenzelgloves/freifechter + name = "fencing gloves" + desc = "A pair of hardened leather gloves used by fencers who aren't exactly convinced of losing a finger to a particularly strong feder cut. The inside is padded for extra durability." + max_integrity = ARMOR_INT_SIDE_HARDLEATHER + 50 + + //---------------- BLACKSTEEL --------------------- /obj/item/clothing/gloves/roguetown/blacksteel/modern/plategloves diff --git a/code/modules/clothing/rogueclothes/hats.dm b/code/modules/clothing/rogueclothes/hats.dm index 61818cc1f0..2ed2b4959c 100644 --- a/code/modules/clothing/rogueclothes/hats.dm +++ b/code/modules/clothing/rogueclothes/hats.dm @@ -578,6 +578,13 @@ item_state = "chap_alt" color = "#dbcde0" +/obj/item/clothing/head/roguetown/chaperon/greyscale/shepherd + name = "mountaineer's chaperon" + desc = "A fashionable citygoer's chaperon worn around an insconspicuous iron skullcap. It has a cute little Mamük brooch on the tip of the hood. Szöréndnížine shepherds spend plenty of time in the city and have taken a liking to the chaperon's exaggerated swagger." + armor = ARMOR_LEATHER_STUDDED + max_integrity = ARMOR_INT_HELMET_IRON - 25 + + /obj/item/clothing/head/roguetown/chaperon/noble name = "noble's chaperon" desc = "A decorated chaperon worn by the more influential members of society." diff --git a/code/modules/clothing/rogueclothes/neck.dm b/code/modules/clothing/rogueclothes/neck.dm index b5530e1d1a..8c16da674d 100644 --- a/code/modules/clothing/rogueclothes/neck.dm +++ b/code/modules/clothing/rogueclothes/neck.dm @@ -299,6 +299,10 @@ . = ..() update_icon() +/obj/item/clothing/neck/roguetown/fencerguard/generic + color = "#503630" + detail_color = "#503630" + /obj/item/clothing/neck/roguetown/gorget/forlorncollar name = "forlorn collar" desc = "A old reminder." @@ -408,6 +412,12 @@ user.emote("pray") return +/obj/item/clothing/neck/roguetown/psicross/reform + name = "reformist psycross" + desc = "'It occured to me that our God had left us, but not our ability to endure hardship. We shall make something out of this world, I said, before we pass onto the next.'" + sellprice = 0 //Heresy of the highest order. Unless... + icon_state = "psycross" + /obj/item/clothing/neck/roguetown/psicross/aalloy name = "decrepit psicross" desc = "Surely this one endures?" diff --git a/code/modules/clothing/rogueclothes/pants.dm b/code/modules/clothing/rogueclothes/pants.dm index 9e83b52f95..b655d32670 100644 --- a/code/modules/clothing/rogueclothes/pants.dm +++ b/code/modules/clothing/rogueclothes/pants.dm @@ -173,6 +173,12 @@ desc = "padded leather armor made by Otavan tailors, its quality is remarkable." icon_state = "fencerpants" +/obj/item/clothing/under/roguetown/heavy_leather_pants/otavan/shepherd + name = "shepherd's pants" + desc = "A pair of white pants decorated with red stripes and traditional patterning." + icon_state = "shepherdpants" + color = "#FFFFFF" + /obj/item/clothing/under/roguetown/heavy_leather_pants/otavan/generic name = "fencing breeches" desc = "A pair of loose breeches with leather reinforcements on the waist and legs. Worn with a cup." @@ -192,6 +198,12 @@ pic.color = get_detail_color() add_overlay(pic) +/obj/item/clothing/under/roguetown/heavy_leather_pants/otavan/generic/Initialize() + ..() + update_icon() + +// Can't figure out why this shit is spawning invisible + /obj/item/clothing/under/roguetown/heavy_leather_pants/grenzelpants name = "grenzelhoftian paumpers" desc = "Padded pants for extra comfort and protection, adorned in vibrant colors." diff --git a/code/modules/jobs/job_types/roguetown/adventurer/adventurer.dm b/code/modules/jobs/job_types/roguetown/adventurer/adventurer.dm index b0db222dc7..645a0be95e 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/adventurer.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/adventurer.dm @@ -76,6 +76,8 @@ GLOBAL_VAR_INIT(adventurer_hugbox_duration_still, 3 MINUTES) /datum/advclass/foreigner, /datum/advclass/foreigner/custodian, /datum/advclass/foreigner/yoruku, + /datum/advclass/foreigner/shepherd, + /datum/advclass/foreigner/fencerguy, ) /mob/living/carbon/human/proc/adv_hugboxing_start() diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/foreigner.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/foreigner.dm index 3bf791cfa7..7c0252b55c 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/combat/foreigner.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/combat/foreigner.dm @@ -174,3 +174,115 @@ belt = /obj/item/storage/belt/rogue/leather/knifebelt/black/kazengun if("Smokebombs") belt = /obj/item/storage/belt/rogue/leather/smokebelt/black + +/datum/advclass/foreigner/shepherd + name = "Szöréndnížine Shepherd" + tutorial = "You're a simple shepherd hailing from Aavnr's Free City, taking a pilgrimage or having fled for one reason or another. You can easily fend for yourself in the wilderness, and with enough practice, fend for yourself in combat against even armoured opponents with your traditional axe." + extra_context = "This class is for experienced adventurers with a solid grasp on footwork and stamina management. Your weapon has special intents you can juggle through to make fights easier... Sometimes." + allowed_sexes = list(MALE, FEMALE) + allowed_races = RACES_ALL_KINDS + subclass_languages = list(/datum/language/aavnic) + outfit = /datum/outfit/job/roguetown/adventurer/freishepherd + traits_applied = list() + cmode_music = 'sound/music/frei_shepherd.ogg' + subclass_stats = list( + STATKEY_END = 2, + STATKEY_PER = 2, + STATKEY_CON = 1, + ) + + subclass_skills = list( + /datum/skill/combat/knives = SKILL_LEVEL_JOURNEYMAN, + /datum/skill/combat/wrestling = SKILL_LEVEL_APPRENTICE, + /datum/skill/combat/axes = SKILL_LEVEL_JOURNEYMAN, + /datum/skill/craft/crafting = SKILL_LEVEL_NOVICE, + /datum/skill/craft/carpentry = SKILL_LEVEL_APPRENTICE, + /datum/skill/labor/lumberjacking = SKILL_LEVEL_NOVICE, + /datum/skill/labor/farming = SKILL_LEVEL_JOURNEYMAN, + /datum/skill/labor/butchering = SKILL_LEVEL_APPRENTICE, + /datum/skill/craft/cooking = SKILL_LEVEL_APPRENTICE, + /datum/skill/misc/athletics = SKILL_LEVEL_EXPERT, + /datum/skill/misc/reading = SKILL_LEVEL_JOURNEYMAN, + /datum/skill/misc/climbing = SKILL_LEVEL_JOURNEYMAN, + /datum/skill/misc/sewing = SKILL_LEVEL_JOURNEYMAN, + ) + +/datum/outfit/job/roguetown/adventurer/freishepherd/pre_equip(mob/living/carbon/human/H) + ..() + mask = /obj/item/clothing/head/roguetown/armingcap + head = /obj/item/clothing/head/roguetown/chaperon/greyscale/shepherd + neck = /obj/item/clothing/neck/roguetown/psicross/reform + armor = /obj/item/clothing/suit/roguetown/armor/leather/heavy/shepherd + shirt = /obj/item/clothing/suit/roguetown/armor/gambeson/heavy/freifechter + belt = /obj/item/storage/belt/rogue/leather/sash + beltl = /obj/item/rogueweapon/stoneaxe/battle/steppesman/chupa + beltr = /obj/item/rogueweapon/huntingknife/idagger/navaja/freifechter + pants = /obj/item/clothing/under/roguetown/heavy_leather_pants/otavan/shepherd + shoes = /obj/item/clothing/shoes/roguetown/boots/leather/reinforced/short + backl = /obj/item/storage/backpack/rogue/backpack + backpack_contents = list( + /obj/item/flashlight/flare/torch = 1, + ) + +/datum/advclass/foreigner/fencerguy + name = "Foreign Fencer" + tutorial = "You're an itinerant weapons expert that was trained in a Grenzelhoftian fencing school, carrying with you your weapon, your skillset, your pride... And not much else, frankly." + extra_context = "This is a freeform class that's meant to evoke a similar feeling to playing a Freifechter, your equipment and skillset is limited compared to other classes - this is by design - but you start with cool weapons." + allowed_sexes = list(MALE, FEMALE) + allowed_races = RACES_ALL_KINDS + outfit = /datum/outfit/job/roguetown/adventurer/fencerguy + subclass_languages = list(/datum/language/grenzelhoftian) + cmode_music = 'sound/music/frei_shepherd.ogg' + traits_applied = list(TRAIT_INTELLECTUAL, TRAIT_FENCERDEXTERITY) + subclass_stats = list( + STATKEY_INT = 2, + STATKEY_PER = 3, + ) + subclass_skills = list( + /datum/skill/combat/swords = SKILL_LEVEL_APPRENTICE, + /datum/skill/misc/athletics = SKILL_LEVEL_EXPERT, + /datum/skill/combat/knives = SKILL_LEVEL_APPRENTICE, + /datum/skill/combat/wrestling = SKILL_LEVEL_JOURNEYMAN, + /datum/skill/misc/reading = SKILL_LEVEL_JOURNEYMAN, + /datum/skill/misc/climbing = SKILL_LEVEL_APPRENTICE, + /datum/skill/misc/sewing = SKILL_LEVEL_APPRENTICE, + /datum/skill/misc/medicine = SKILL_LEVEL_APPRENTICE + ) + +/datum/outfit/job/roguetown/adventurer/fencerguy/pre_equip(mob/living/carbon/human/H) + ..() + to_chat(H, span_warning("You're an itinerant weapons expert that was trained in a Grenzelhoftian fencing school, carrying with you your weapon, your skillset, and your pride.")) + H.set_blindness(0) + if(H.mind) + var/weapons = list("Balanced Longsword","Spear & Punch Dagger","Sabre") + var/weapon_choice = input(H, "Choose your expertise.", "TAKE UP ARMS") as anything in weapons + switch(weapon_choice) + if("Balanced Longsword") + H.adjust_skillrank_up_to(/datum/skill/combat/swords, SKILL_LEVEL_EXPERT, TRUE) + l_hand = /obj/item/rogueweapon/sword/long/fencerguy + r_hand = /obj/item/rogueweapon/huntingknife/combat + backr = /obj/item/rogueweapon/scabbard/sword + if("Spear & Punch Dagger") + H.adjust_skillrank_up_to(/datum/skill/combat/polearms, SKILL_LEVEL_EXPERT, TRUE) + H.adjust_skillrank_up_to(/datum/skill/combat/unarmed, SKILL_LEVEL_JOURNEYMAN, TRUE) + l_hand = /obj/item/rogueweapon/spear/boar + r_hand = /obj/item/rogueweapon/katar/punchdagger/frei + if("Sabre") + H.adjust_skillrank_up_to(/datum/skill/combat/swords, SKILL_LEVEL_EXPERT, TRUE) + l_hand = /obj/item/rogueweapon/sword/sabre/freifechter + r_hand = /obj/item/rogueweapon/huntingknife/idagger/navaja/freifechter + beltr = /obj/item/rogueweapon/scabbard/sword + armor = /obj/item/clothing/suit/roguetown/armor/leather + shirt = /obj/item/clothing/suit/roguetown/shirt/freifechter + gloves = /obj/item/clothing/gloves/roguetown/angle/grenzelgloves + neck = /obj/item/clothing/neck/roguetown/fencerguard/generic + wrists = /obj/item/clothing/wrists/roguetown/bracers/leather + pants = /obj/item/clothing/under/roguetown/heavy_leather_pants/otavan + shoes = /obj/item/clothing/shoes/roguetown/boots/grenzelhoft + backl = /obj/item/storage/backpack/rogue/satchel + belt = /obj/item/storage/belt/rogue/leather + backpack_contents = list( + /obj/item/flashlight/flare/torch = 1, + /obj/item/recipe_book/survival = 1, + /obj/item/storage/belt/rogue/pouch/coins/poor = 1, + ) diff --git a/code/modules/jobs/job_types/roguetown/adventurer/types/wretch/onimusha.dm b/code/modules/jobs/job_types/roguetown/adventurer/types/wretch/onimusha.dm index 9270cf63a0..d3e754254b 100644 --- a/code/modules/jobs/job_types/roguetown/adventurer/types/wretch/onimusha.dm +++ b/code/modules/jobs/job_types/roguetown/adventurer/types/wretch/onimusha.dm @@ -127,9 +127,6 @@ if ("Shamshir") beltl = /obj/item/rogueweapon/scabbard/sword l_hand = /obj/item/rogueweapon/sword/sabre/shamshir - if ("Fechtfeders") - beltl = /obj/item/rogueweapon/scabbard/sword - l_hand = /obj/item/rogueweapon/sword/long/frei if ("Kriegsmesser") beltl = /obj/item/rogueweapon/scabbard/sword l_hand = /obj/item/rogueweapon/sword/long/kriegmesser diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/classes/freifechter.dm b/code/modules/jobs/job_types/roguetown/mercenaries/classes/freifechter.dm index d3cd79762e..a4a57220f3 100644 --- a/code/modules/jobs/job_types/roguetown/mercenaries/classes/freifechter.dm +++ b/code/modules/jobs/job_types/roguetown/mercenaries/classes/freifechter.dm @@ -1,23 +1,26 @@ /datum/advclass/mercenary/freelancer - name = "Freifechter" - tutorial = "You are a graduate of the Aavnic Freifechters - \"Freelancers\" - a prestigious fighting guild localized in the independent City-state of Szöréndnížina, recognized as an encomium to Ravox by the Holy See. It has formed an odd thirty yils ago, but its visitors come from all over Western Psydonia. You have swung one weapon ten-thousand times, and not the other way around. This class is for experienced combatants who have a solid grasp on footwork and stamina management, master skills alone won't save your lyfe." + name = "Freifechter Fencer" + tutorial = "You are a graduate of the Aavnic Freifechters - \"Freelancers\" - part of a prestigious fighting guild localized in the independent City-state of Szöréndnížina. It has formed an odd thirty yils ago, but its visitors come from all over Western Psydonia. You have swung one weapon ten-thousand times, and not the other way around. Your faith is stalwart in the teachings of the Psydonic Reformation, and you've become a warrior poet of sorts - educating the peasantry in the ways of the New Word and angering the Orthodoxy in turn. You've left your cradle in search of riches to fund your people's armies." + extra_context = "This class is for experienced players who have a solid grasp on footwork and stamina management, master skills alone won't save your lyfe. You make up for your inherent weaknesses and limitations with \"master strike\" mechanics." allowed_sexes = list(MALE, FEMALE) allowed_races = RACES_ALL_KINDS outfit = /datum/outfit/job/mercenary/freelancer category_tags = list(CTAG_MERCENARY) + allowed_patrons = list(/datum/patron/old_god) class_select_category = CLASS_CAT_AAVNR cmode_music = 'sound/music/combat_noble.ogg' + traits_applied = list(TRAIT_BADTRAINER, TRAIT_INTELLECTUAL, TRAIT_LONGSWORDSMAN, TRAIT_FENCERDEXTERITY) origin_override_type = /datum/virtue/origin/avar subclass_languages = list( /datum/language/aavnic, //Your character could not have possibly "graduated" without atleast some basic knowledge of Aavnic. ) - - traits_applied = list(TRAIT_BADTRAINER) + + subclass_stats = list( STATKEY_INT = 3, // 4 when hired - STATKEY_PER = 2, // 3 when hired - STATKEY_CON = 2 + STATKEY_PER = 2, + STATKEY_END = 3 ) hiredbuff = /datum/status_effect/buff/merchired/freifechter @@ -27,55 +30,68 @@ /datum/skill/misc/athletics = SKILL_LEVEL_EXPERT, /datum/skill/combat/knives = SKILL_LEVEL_APPRENTICE, /datum/skill/combat/wrestling = SKILL_LEVEL_JOURNEYMAN, - /datum/skill/misc/reading = SKILL_LEVEL_APPRENTICE, - /datum/skill/misc/climbing = SKILL_LEVEL_APPRENTICE, //I got told that having zero climbing is a PITA. Bare minimum for a combat class. + /datum/skill/misc/reading = SKILL_LEVEL_MASTER, + /datum/skill/misc/climbing = SKILL_LEVEL_APPRENTICE, //climbing at apprentice is needed for literally everyone + /datum/skill/misc/sewing = SKILL_LEVEL_APPRENTICE, + /datum/skill/misc/medicine = SKILL_LEVEL_APPRENTICE ) + /datum/status_effect/buff/merchired/freifechter effectedstats = list(STATKEY_INT = 1, STATKEY_PER = 1) /datum/outfit/job/mercenary/freelancer/pre_equip(mob/living/carbon/human/H) ..() - to_chat(H, span_warning("You are a master in the arts of the longsword. Wielder of Psydonia's most versatile and noble weapon, you needn't anything else. You can choose a regional longsword.")) - + to_chat(H, span_warning("You are a master in the arts of the longsword. Wielder of Psydonia's most versatile and noble weapon, you needn't anything else. Your professionally made longsword facilitates moves from fechtbuchs the likes of The Etruscan Flower and Grenzelhoft's Wiedenhauer.")) l_hand = /obj/item/rogueweapon/scabbard/sword armor = /obj/item/clothing/suit/roguetown/armor/plate/half/fencer //Experimental. - var/weapons = list("Modified Training Sword !!!CHALLENGE!!!", "Etruscan Longsword", "Kriegsmesser", "Field Longsword") - var/weapon_choice = input(H, "Choose your weapon.", "TAKE UP ARMS") as anything in weapons - switch(weapon_choice) - if("Modified Training Sword !!!CHALLENGE!!!") //A sharp feder. Less damage, better defense. Definitely not a good choice. - r_hand = /obj/item/rogueweapon/sword/long/frei - beltr = /obj/item/rogueweapon/huntingknife/idagger - if("Etruscan Longsword") //A longsword with a compound ricasso. Accompanied by a traditional flip knife. - r_hand = /obj/item/rogueweapon/sword/long/etruscan - beltr = /obj/item/rogueweapon/huntingknife/idagger/navaja - if("Kriegsmesser") //Och- eugh- German! - r_hand = /obj/item/rogueweapon/sword/long/kriegmesser - beltr = /obj/item/rogueweapon/huntingknife/idagger - if("Field Longsword") //A common longsword. - r_hand = /obj/item/rogueweapon/sword/long - beltr = /obj/item/rogueweapon/huntingknife/idagger + var/weapons = list("Etruscan Longsword", "Kriegsmesser", "Reformist Longsword") + if(H.mind) + var/weapon_choice = input(H, "Draw a sword.", "As presented to me by Master Oktawiusz...") as anything in weapons + switch(weapon_choice) + if("Kriegsmesser") //Och- eugh- German! + r_hand = /obj/item/rogueweapon/sword/long/kriegmesser + beltr = /obj/item/rogueweapon/katar/punchdagger/frei + if("Etruscan Longsword") //A longsword with a compound ricasso. Accompanied by a traditional flip knife. + r_hand = /obj/item/rogueweapon/sword/long/etruscan + beltr = /obj/item/rogueweapon/huntingknife/idagger/navaja/freifechter + if("Reformist Longsword") + r_hand = /obj/item/rogueweapon/sword/long/etruscan/freifechter + beltr = /obj/item/rogueweapon/huntingknife/idagger/navaja/freifechter + if(H.mind) + var/armors = list( + "Fencing Jacket" = /obj/item/clothing/suit/roguetown/armor/leather/heavy/freifechter, + "Fencing Cuirass" = /obj/item/clothing/suit/roguetown/armor/plate/half/fencer + ) + var/armorchoice = input(H, "Don your armour.", "Security or Flexibility?") as anything in armors + armor = armors[armorchoice] belt = /obj/item/storage/belt/rogue/leather/sash beltl = /obj/item/flashlight/flare/torch/lantern shirt = /obj/item/clothing/suit/roguetown/armor/gambeson/heavy/freifechter pants = /obj/item/clothing/under/roguetown/heavy_leather_pants/otavan/generic shoes = /obj/item/clothing/shoes/roguetown/boots/leather/reinforced/short - gloves = /obj/item/clothing/gloves/roguetown/fingerless_leather + gloves = /obj/item/clothing/gloves/roguetown/angle/grenzelgloves/freifechter backr = /obj/item/storage/backpack/rogue/satchel/short + neck = /obj/item/clothing/neck/roguetown/psicross/reform - backpack_contents = list(/obj/item/roguekey/mercenary) + backpack_contents = list( + /obj/item/roguekey/mercenary = 1, + /obj/item/storage/belt/rogue/pouch/coins/poor = 1, + /obj/item/rogueweapon/scabbard/sheath = 1 + ) /datum/advclass/mercenary/freelancer/lancer - name = "Lancer" - tutorial = "You put complete trust in your polearm, the most effective weapon the world has seen. Why wear armour when you cannot be hit? You can choose your polearm, and are exceptionally accurate." + name = "Freifechter Lancer" + tutorial = "You are a graduate of the Aavnic Freifechters - \"Freelancers\" - part of a prestigious fighting guild localized in the independent City-state of Szöréndnížina. It has formed an odd thirty yils ago, but its visitors come from all over Western Psydonia. You have swung one weapon ten-thousand times, and not the other way around. A Lancer and his pike are inseparable, and the first line of offense. You can choose to display the banners of the Reformist Order or your own State." + extra_context = "This class is for experienced players who have a solid grasp on footwork and stamina management, master skills alone won't save your lyfe. You make up for your inherent weaknesses and limitations with unique high-durability weapons." outfit = /datum/outfit/job/mercenary/freelancer_lancer origin_override_type = /datum/virtue/origin/avar subclass_languages = list( /datum/language/aavnic, //Your character could not have possibly "graduated" without atleast some basic knowledge of Aavnic. ) - - traits_applied = list(TRAIT_BADTRAINER) + allowed_patrons = list(/datum/patron/old_god) + traits_applied = list(TRAIT_BADTRAINER, TRAIT_FENCERDEXTERITY, TRAIT_INTELLECTUAL) //To give you an edge in specialty moves like feints and stop you from being feinted subclass_stats = list( STATKEY_CON = 3,//This is going to need live testing, since I'm not sure they should be getting this much CON without using a statpack to spec. Revision pending. @@ -93,6 +109,7 @@ /datum/skill/combat/wrestling = SKILL_LEVEL_NOVICE, //Wrestling is a swordsman's luxury. /datum/skill/misc/reading = SKILL_LEVEL_APPRENTICE, /datum/skill/misc/climbing = SKILL_LEVEL_APPRENTICE, //I got told that having zero climbing is a PITA. Bare minimum for a combat class. + /datum/skill/misc/medicine = SKILL_LEVEL_APPRENTICE, ) /datum/status_effect/buff/merchired/freifechterlancer @@ -100,28 +117,88 @@ /datum/outfit/job/mercenary/freelancer_lancer/pre_equip(mob/living/carbon/human/H) ..() - to_chat(H, span_warning("You put complete trust in your polearm, the most effective weapon the world has seen. Why wear armour when you cannot be hit? You can choose your polearm, and are exceptionally accurate.")) + to_chat(H, span_warning("You put complete trust in your polearm, the most effective weapon the world has seen. Why wear armour when you cannot be hit? You can choose to display the banners of the Reformist Order or your own State.")) armor = /obj/item/clothing/suit/roguetown/armor/leather/heavy/freifechter - var/weapons = list("Graduate's Spear", "Boar Spear", "Lucerne") - var/weapon_choice = input(H, "Choose your weapon.", "TAKE UP ARMS") as anything in weapons + var/weapons = list("Graduate's Spear", "Banner of Szöréndnížina", "Banner of Psydonic Reformism") + var/weapon_choice = input(H, "Spear or Pike-Banner?", "As presented to me by Lance-Master Szörénsław...") as anything in weapons switch(weapon_choice) if("Graduate's Spear") //A steel spear with a cool-looking stick & a banner sticking out of it. r_hand = /obj/item/rogueweapon/spear/boar/frei l_hand = /obj/item/rogueweapon/katar/punchdagger/frei - if("Boar Spear") - r_hand = /obj/item/rogueweapon/spear/boar - beltr = /obj/item/rogueweapon/katar/punchdagger - if("Lucerne") //A normal lucerne for the people that get no drip & no bitches. - r_hand = /obj/item/rogueweapon/eaglebeak/lucerne - beltr = /obj/item/rogueweapon/katar/punchdagger + if("Banner of Szöréndnížina") + r_hand = /obj/item/rogueweapon/spear/boar/frei/pike + wrists = /obj/item/rogueweapon/katar/punchdagger/frei + if("Banner of Psydonic Reformism") + r_hand = /obj/item/rogueweapon/spear/boar/frei/pike/reformist + wrists = /obj/item/rogueweapon/katar/punchdagger/frei + + belt = /obj/item/storage/belt/rogue/leather/sash + beltl = /obj/item/flashlight/flare/torch/lantern + shirt = /obj/item/clothing/suit/roguetown/armor/gambeson/heavy/freifechter + pants = /obj/item/clothing/under/roguetown/heavy_leather_pants/otavan/generic + shoes = /obj/item/clothing/shoes/roguetown/boots/leather/reinforced/short + gloves = /obj/item/clothing/gloves/roguetown/angle/grenzelgloves/freifechter + backr = /obj/item/storage/backpack/rogue/satchel/short + neck = /obj/item/clothing/neck/roguetown/psicross/reform + backpack_contents = list( + /obj/item/roguekey/mercenary = 1, + /obj/item/storage/belt/rogue/pouch/coins/poor + ) + +/datum/advclass/mercenary/freelancer/sabrist + name = "Freifechter Sabrist" + tutorial = "You are a graduate of the Aavnic Freifechters - \"Freelancers\" - part of a prestigious fighting guild localized in the independent City-state of Szöréndnížina. It has formed an odd thirty yils ago, but its visitors come from all over Western Psydonia. You have swung one weapon ten-thousand times, and not the other way around. Your faith is stalwart in the teachings of the Psydonic Reformation, and you've become a warrior poet of sorts - educating the peasantry in the ways of the New Word and angering the Orthodoxy in turn. You've left your cradle in search of riches to fund your people's armies. Sabrists are renowned for their dexterity and speed, but lack the adaptability of longswordmen." + extra_context = "This class is for experienced players who have a solid grasp on footwork and stamina management, master skills alone won't save your lyfe. You make up for your inherent weaknesses and limitations with \"master strike\" mechanics." + allowed_sexes = list(MALE, FEMALE) + allowed_races = RACES_ALL_KINDS + outfit = /datum/outfit/job/roguetown/mercenary/sabrist + subclass_languages = list(/datum/language/aavnic)//Your character could not have possibly "graduated" without atleast some basic knowledge of Aavnic. + allowed_patrons = list(/datum/patron/old_god) + class_select_category = CLASS_CAT_AAVNR + category_tags = list(CTAG_MERCENARY) + cmode_music = 'sound/music/frei_sabre.ogg' + traits_applied = list(TRAIT_BADTRAINER, TRAIT_INTELLECTUAL, TRAIT_FENCERDEXTERITY, TRAIT_SABRIST) + subclass_stats = list( + STATKEY_INT = 3, + STATKEY_PER = 2, + STATKEY_SPD = 2 + ) + subclass_skills = list( + /datum/skill/combat/swords = SKILL_LEVEL_MASTER, + /datum/skill/misc/athletics = SKILL_LEVEL_EXPERT, + /datum/skill/combat/knives = SKILL_LEVEL_JOURNEYMAN, + /datum/skill/combat/wrestling = SKILL_LEVEL_JOURNEYMAN, + /datum/skill/misc/reading = SKILL_LEVEL_MASTER, + /datum/skill/misc/climbing = SKILL_LEVEL_APPRENTICE, + /datum/skill/misc/sewing = SKILL_LEVEL_APPRENTICE, + /datum/skill/misc/medicine = SKILL_LEVEL_APPRENTICE + ) + +/datum/outfit/job/roguetown/mercenary/sabrist/pre_equip(mob/living/carbon/human/H) + ..() + to_chat(H, span_warning("You are a master in the arts of the sabre. Wielder of Aavnr's sword by excellence, you needn't anything else. Your professionally made sabre facilitates moves from traditional Aavnic fencing treatises.")) + if(H.mind) + var/armors = list( + "Fencing Jacket" = /obj/item/clothing/suit/roguetown/armor/leather/heavy/freifechter, + "Fencing Cuirass" = /obj/item/clothing/suit/roguetown/armor/plate/half/fencer + ) + var/armorchoice = input(H, "Don your armour.", "Security or Flexibility?") as anything in armors + armor = armors[armorchoice] + l_hand = /obj/item/rogueweapon/scabbard/sword + r_hand = /obj/item/rogueweapon/sword/sabre/freifechter + beltr = /obj/item/rogueweapon/huntingknife/idagger/navaja/freifechter belt = /obj/item/storage/belt/rogue/leather/sash beltl = /obj/item/flashlight/flare/torch/lantern shirt = /obj/item/clothing/suit/roguetown/armor/gambeson/heavy/freifechter pants = /obj/item/clothing/under/roguetown/heavy_leather_pants/otavan/generic shoes = /obj/item/clothing/shoes/roguetown/boots/leather/reinforced/short - gloves = /obj/item/clothing/gloves/roguetown/fingerless_leather + gloves = /obj/item/clothing/gloves/roguetown/angle/grenzelgloves/freifechter backr = /obj/item/storage/backpack/rogue/satchel/short + neck = /obj/item/clothing/neck/roguetown/psicross/reform - backpack_contents = list(/obj/item/roguekey/mercenary) + backpack_contents = list( + /obj/item/roguekey/mercenary = 1, + /obj/item/storage/belt/rogue/pouch/coins/poor + ) diff --git a/code/modules/jobs/job_types/roguetown/mercenaries/mercenary.dm b/code/modules/jobs/job_types/roguetown/mercenaries/mercenary.dm index 5e7e6432b9..7741a2e566 100644 --- a/code/modules/jobs/job_types/roguetown/mercenaries/mercenary.dm +++ b/code/modules/jobs/job_types/roguetown/mercenaries/mercenary.dm @@ -33,6 +33,7 @@ /datum/advclass/mercenary/vaquero, /datum/advclass/mercenary/freelancer, /datum/advclass/mercenary/freelancer/lancer, + /datum/advclass/mercenary/freelancer/sabrist, /datum/advclass/mercenary/grenzelhoft, /datum/advclass/mercenary/grenzelhoft/halberdier, /datum/advclass/mercenary/grenzelhoft/crossbowman, diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 54b47e6e94..b9d860704f 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -47,6 +47,13 @@ /mob/proc/has_active_hand() return has_hand_for_held_index(active_hand_index) +/mob/proc/get_held_items() + var/list/obj/item/held_item = list() + held_item += get_active_held_item() + held_item += get_inactive_held_item() + + return held_item + //Finds the first available (null) index OR all available (null) indexes in held_items based on a side. //Lefts: 1, 3, 5, 7... diff --git a/code/modules/mob/living/roguetownprocs.dm b/code/modules/mob/living/roguetownprocs.dm index 655b3b490b..e39aef8a24 100644 --- a/code/modules/mob/living/roguetownprocs.dm +++ b/code/modules/mob/living/roguetownprocs.dm @@ -46,6 +46,8 @@ precision_bonus -= 10 if((used_intent.blade_class == BCLASS_PUNCH)) accuracy_bonus += 5 + if(used_intent.blade_class == BCLASS_HALFSWORD) + chance2hit += 21 //Double that of stab if(I) if(I.wlength == WLENGTH_SHORT) diff --git a/code/modules/roguetown/roguecrafting/sewing.dm b/code/modules/roguetown/roguecrafting/sewing.dm index f683c46f42..95ab74a5a8 100644 --- a/code/modules/roguetown/roguecrafting/sewing.dm +++ b/code/modules/roguetown/roguecrafting/sewing.dm @@ -511,7 +511,7 @@ datum/crafting_recipe/roguetown/sewing/Purdress name = "fencing shirt" result = /obj/item/clothing/suit/roguetown/armor/gambeson/heavy/freifechter reqs = list(/obj/item/natural/cloth = 5, - /obj/item/natural/fibers = 2) + /obj/item/natural/silk = 2) craftdiff = 4 /datum/crafting_recipe/roguetown/sewing/chaperon diff --git a/icons/mob/roguehud.dmi b/icons/mob/roguehud.dmi index 06d3659682..12086c3498 100644 Binary files a/icons/mob/roguehud.dmi and b/icons/mob/roguehud.dmi differ diff --git a/icons/roguetown/clothing/onmob/pants.dmi b/icons/roguetown/clothing/onmob/pants.dmi index 093509774a..38de20eaa0 100644 Binary files a/icons/roguetown/clothing/onmob/pants.dmi and b/icons/roguetown/clothing/onmob/pants.dmi differ diff --git a/icons/roguetown/clothing/pants.dmi b/icons/roguetown/clothing/pants.dmi index 75a9915eb1..dce899295d 100644 Binary files a/icons/roguetown/clothing/pants.dmi and b/icons/roguetown/clothing/pants.dmi differ diff --git a/icons/roguetown/weapons/64.dmi b/icons/roguetown/weapons/64.dmi index 56df9c2a2c..373238a884 100644 Binary files a/icons/roguetown/weapons/64.dmi and b/icons/roguetown/weapons/64.dmi differ diff --git a/icons/roguetown/weapons/scabbard.dmi b/icons/roguetown/weapons/scabbard.dmi index 5d8effff69..85f4ad7909 100644 Binary files a/icons/roguetown/weapons/scabbard.dmi and b/icons/roguetown/weapons/scabbard.dmi differ diff --git a/icons/roguetown/weapons/special/freifechter.dmi b/icons/roguetown/weapons/special/freifechter.dmi new file mode 100644 index 0000000000..b8cb449865 Binary files /dev/null and b/icons/roguetown/weapons/special/freifechter.dmi differ diff --git a/icons/roguetown/weapons/special/freifechter32.dmi b/icons/roguetown/weapons/special/freifechter32.dmi new file mode 100644 index 0000000000..9c1a775c5c Binary files /dev/null and b/icons/roguetown/weapons/special/freifechter32.dmi differ diff --git a/modular_azurepeak/code/datums/loadout.dm b/modular_azurepeak/code/datums/loadout.dm index 51b4d4b837..3c80dff1d1 100644 --- a/modular_azurepeak/code/datums/loadout.dm +++ b/modular_azurepeak/code/datums/loadout.dm @@ -616,6 +616,10 @@ GLOBAL_LIST_EMPTY(loadout_items) name = "Psydonian Cross" path = /obj/item/clothing/neck/roguetown/psicross +/datum/loadout_item/psicross/reform + name = "Reformist Psydonian Cross" + path = /obj/item/clothing/neck/roguetown/psicross/reform + /datum/loadout_item/psicross/astrata name = "Amulet of Astrata" path = /obj/item/clothing/neck/roguetown/psicross/astrata diff --git a/roguetown.dme b/roguetown.dme index 9dabb104a8..992c690ef6 100644 --- a/roguetown.dme +++ b/roguetown.dme @@ -590,6 +590,7 @@ #include "code\datums\components\_component.dm" #include "code\datums\components\after_image.dm" #include "code\datums\components\anti_magic.dm" +#include "code\datums\components\armour_filtering.dm" #include "code\datums\components\art.dm" #include "code\datums\components\baothajoyride.dm" #include "code\datums\components\beauty.dm" @@ -635,6 +636,7 @@ #include "code\datums\components\shrapnel.dm" #include "code\datums\components\shrink.dm" #include "code\datums\components\sizzle.dm" +#include "code\datums\components\skill_blessed.dm" #include "code\datums\components\slippery.dm" #include "code\datums\components\soulstoned.dm" #include "code\datums\components\spawner.dm" diff --git a/sound/music/frei_sabre.ogg b/sound/music/frei_sabre.ogg new file mode 100644 index 0000000000..d947429a5e Binary files /dev/null and b/sound/music/frei_sabre.ogg differ diff --git a/sound/music/frei_shepherd.ogg b/sound/music/frei_shepherd.ogg new file mode 100644 index 0000000000..e53f2fbac8 Binary files /dev/null and b/sound/music/frei_shepherd.ogg differ