From 82949098fd0ac42cc3e013fad836ffe072fae230 Mon Sep 17 00:00:00 2001 From: Kirie Saito Date: Fri, 3 Jan 2025 21:02:12 -0500 Subject: [PATCH 1/9] agent MOBA Part 1 Update skill_chooser.dm makes it into an item update ranged buff Update lobotomy-corp13.dme --- .../agent_skills/defensive/hunker_down.dm | 31 +++++++ .../agent_skills/defensive/parry.dm | 31 +++++++ .../agent_skills/healing/healing.dm | 27 ++++++ .../agent_skills/healing/soothing.dm | 27 ++++++ .../agent_skills/ranged/autoloader.dm | 20 +++++ .../agent_skills/ranged/grenade.dm | 32 +++++++ .../agent_skills/ranged/grenade_launcher.dm | 31 +++++++ .../agent_skills/ranged/smokedash.dm | 28 ++++++ .../agent_skills/skill_chooser.dm | 81 ++++++++++++++++++ ModularTegustation/ego_weapons/_ego_weapon.dm | 7 ++ .../ego_weapons/ranged/_ranged_projectile.dm | 4 + code/__DEFINES/traits.dm | 2 + code/_globalvars/traits.dm | 2 + code/modules/jobs/job_types/agent.dm | 4 +- code/modules/jobs/job_types/captain.dm | 1 + icons/hud/screen_skills.dmi | Bin 7824 -> 8185 bytes lobotomy-corp13.dme | 7 ++ 17 files changed, 333 insertions(+), 2 deletions(-) create mode 100644 ModularTegustation/agent_skills/defensive/hunker_down.dm create mode 100644 ModularTegustation/agent_skills/defensive/parry.dm create mode 100644 ModularTegustation/agent_skills/healing/healing.dm create mode 100644 ModularTegustation/agent_skills/healing/soothing.dm create mode 100644 ModularTegustation/agent_skills/ranged/autoloader.dm create mode 100644 ModularTegustation/agent_skills/ranged/grenade.dm create mode 100644 ModularTegustation/agent_skills/ranged/grenade_launcher.dm create mode 100644 ModularTegustation/agent_skills/ranged/smokedash.dm create mode 100644 ModularTegustation/agent_skills/skill_chooser.dm diff --git a/ModularTegustation/agent_skills/defensive/hunker_down.dm b/ModularTegustation/agent_skills/defensive/hunker_down.dm new file mode 100644 index 000000000000..681e197544f1 --- /dev/null +++ b/ModularTegustation/agent_skills/defensive/hunker_down.dm @@ -0,0 +1,31 @@ +/datum/action/cooldown/hunkerdown_agent + name = "Hunker Down" + desc = "Decrease movespeed and increase defenses for 10 seconds. Costs 10 SP" + icon_icon = 'icons/hud/screen_skills.dmi' + button_icon_state = "hunkerdown" + cooldown_time = 30 SECONDS + + +/datum/action/cooldown/hunkerdown_agent/Trigger() + . = ..() + if(!.) + return FALSE + if (ishuman(owner)) + var/mob/living/carbon/human/human = owner + human.adjustSanityLoss(10) + human.add_movespeed_modifier(/datum/movespeed_modifier/hunkerdown) + addtimer(CALLBACK(human, TYPE_PROC_REF(/mob, remove_movespeed_modifier), /datum/movespeed_modifier/hunkerdown), 10 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + human.physiology.red_mod *= 0.6 + human.physiology.white_mod *= 0.6 + human.physiology.black_mod *= 0.6 + human.physiology.pale_mod *= 0.6 + addtimer(CALLBACK(src, PROC_REF(Recall),), 10 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + StartCooldown() + +/datum/action/cooldown/hunkerdown_agent/proc/Recall() + var/mob/living/carbon/human/human = owner + human.physiology.red_mod /= 0.6 + human.physiology.white_mod /= 0.6 + human.physiology.black_mod /= 0.6 + human.physiology.pale_mod /= 0.6 + diff --git a/ModularTegustation/agent_skills/defensive/parry.dm b/ModularTegustation/agent_skills/defensive/parry.dm new file mode 100644 index 000000000000..91d6b6914765 --- /dev/null +++ b/ModularTegustation/agent_skills/defensive/parry.dm @@ -0,0 +1,31 @@ +/datum/action/cooldown/parry + name = "Parry" + desc = "Parry 90% of damage for 1 second. Immobilize for 3 seconds. Costs 10 SP" + icon_icon = 'icons/hud/screen_skills.dmi' + button_icon_state = "parry" + cooldown_time = 30 SECONDS + + +/datum/action/cooldown/parry/Trigger() + . = ..() + if(!.) + return FALSE + if (ishuman(owner)) + var/mob/living/carbon/human/human = owner + human.adjustSanityLoss(10) + human.physiology.red_mod *= 0.1 + human.physiology.white_mod *= 0.1 + human.physiology.black_mod *= 0.1 + human.physiology.pale_mod *= 0.1 + addtimer(CALLBACK(src, PROC_REF(Recall),), 1 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + + human.Immobilize(3 SECONDS) + new /obj/effect/temp_visual/weapon_stun(get_turf(owner)) + StartCooldown() + +/datum/action/cooldown/parry/proc/Recall() + var/mob/living/carbon/human/human = owner + human.physiology.red_mod /= 0.1 + human.physiology.white_mod /= 0.1 + human.physiology.black_mod /= 0.1 + human.physiology.pale_mod /= 0.1 diff --git a/ModularTegustation/agent_skills/healing/healing.dm b/ModularTegustation/agent_skills/healing/healing.dm new file mode 100644 index 000000000000..a0131c8514c8 --- /dev/null +++ b/ModularTegustation/agent_skills/healing/healing.dm @@ -0,0 +1,27 @@ +//Curing +/datum/action/cooldown/agent_healing + name = "Healing" + desc = "Heal all humans in a 5 tile radius (except the user) by 15 HP. Costs 10SP" + icon_icon = 'icons/hud/screen_skills.dmi' + button_icon_state = "healing" + cooldown_time = 30 SECONDS + var/healamount = 15 + +/datum/action/cooldown/agent_healing/Trigger() + . = ..() + if(!.) + return FALSE + + if(owner.stat == DEAD) + return FALSE + + for(var/mob/living/carbon/human/H in view(5, get_turf(src))) + if(H.stat >= HARD_CRIT) + continue + if(H == owner) + H.adjustSanityLoss(10) + continue + H.adjustBruteLoss(-healamount) + new /obj/effect/temp_visual/heal(get_turf(H), "#FF4444") + StartCooldown() + diff --git a/ModularTegustation/agent_skills/healing/soothing.dm b/ModularTegustation/agent_skills/healing/soothing.dm new file mode 100644 index 000000000000..35266fd953e7 --- /dev/null +++ b/ModularTegustation/agent_skills/healing/soothing.dm @@ -0,0 +1,27 @@ +//Curing +/datum/action/cooldown/agent_soothing + name = "Soothing" + desc = "Heal all humans in a 5 tile radius (except the user) by 15 HP. Costs 10SP" + icon_icon = 'icons/hud/screen_skills.dmi' + button_icon_state = "soothing" + cooldown_time = 30 SECONDS + var/healamount = 15 + +/datum/action/cooldown/agent_soothing/Trigger() + . = ..() + if(!.) + return FALSE + + if(owner.stat == DEAD) + return FALSE + + for(var/mob/living/carbon/human/H in view(5, get_turf(src))) + if(H.stat >= HARD_CRIT) + continue + if(H == owner) + H.adjustSanityLoss(10) + continue + H.adjustSanityLoss(-healamount) //Healing for those around. + new /obj/effect/temp_visual/heal(get_turf(H), "#6E6EFF") + StartCooldown() + diff --git a/ModularTegustation/agent_skills/ranged/autoloader.dm b/ModularTegustation/agent_skills/ranged/autoloader.dm new file mode 100644 index 000000000000..eebc8730f038 --- /dev/null +++ b/ModularTegustation/agent_skills/ranged/autoloader.dm @@ -0,0 +1,20 @@ +/datum/action/cooldown/autoloader + name = "Autoloader" + desc = "Reload all guns on the user. Costs 10 SP" + icon_icon = 'icons/hud/screen_skills.dmi' + button_icon_state = "autoload" + cooldown_time = 30 SECONDS + + +/datum/action/cooldown/autoloader/Trigger() + . = ..() + if (owner.stat == DEAD) + return FALSE + + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.adjustSanityLoss(10) + playsound(H, 'sound/weapons/gun/general/bolt_rack.ogg', 50, TRUE) + for(var/obj/item/ego_weapon/ranged/Gun in H.contents) + Gun.shotsleft = initial(Gun.shotsleft) + StartCooldown() diff --git a/ModularTegustation/agent_skills/ranged/grenade.dm b/ModularTegustation/agent_skills/ranged/grenade.dm new file mode 100644 index 000000000000..a419a9c24933 --- /dev/null +++ b/ModularTegustation/agent_skills/ranged/grenade.dm @@ -0,0 +1,32 @@ + +/datum/action/cooldown/grenade + name = "Grenade Spawn" + desc = "Create a grenade that blows up after 15 seconds. Costs 10SP" + icon_icon = 'icons/hud/screen_skills.dmi' + button_icon_state = "smokedash" + cooldown_time = 20 SECONDS + +/datum/action/cooldown/grenade/Trigger() + . = ..() + if(!.) + return FALSE + + if (owner.stat == DEAD) + return FALSE + + if(!ishuman(owner)) + return FALSE + + var/mob/living/carbon/human/user = owner + user.adjustSanityLoss(10) + + var/obj/item/grenade/r_corp/F = new /obj/item/grenade/r_corp/lcorp(get_turf(user)) + F.explosion_damage_type = pick(RED_DAMAGE, BLACK_DAMAGE, WHITE_DAMAGE) + F.explosion_damage = get_attribute_level(user, JUSTICE_ATTRIBUTE)*2 + user.equip_in_one_of_slots(F, ITEM_SLOT_HANDS , qdel_on_fail = TRUE) + StartCooldown() + +//This is only used by the grenade launcher ability +/obj/item/grenade/r_corp/lcorp + name = "l-corp grenade" + desc = "An anti-abnormality grenade. It deals 90% less damage to humans." diff --git a/ModularTegustation/agent_skills/ranged/grenade_launcher.dm b/ModularTegustation/agent_skills/ranged/grenade_launcher.dm new file mode 100644 index 000000000000..4c50e662faea --- /dev/null +++ b/ModularTegustation/agent_skills/ranged/grenade_launcher.dm @@ -0,0 +1,31 @@ +/obj/effect/proc_holder/ability/aimed/grenade_launcher + name = "Grenade Launcher" + desc = "Use a gun in hand to fire a grenade. Damage type and amount is based off the gun's damage and type. Costs 10 SP" + action_icon_state = "cross_spawn0" + base_icon_state = "cross_spawn" + cooldown_time = 20 SECONDS + +/obj/effect/proc_holder/ability/aimed/grenade_launcher/Perform(target, mob/user) + if(ishuman(user)) + var/mob/living/carbon/human/shooter = user + H.adjustSanityLoss(10) + + var/list/gunsinhand = list() + for(var/obj/item/ego_weapon/ranged/Gun in shooter.held_items) + gunsinhand+=Gun + if(!LAZYLEN(gunsinhand)) + return ..() + + var/obj/item/ego_weapon/ranged/chosengun = pick(gunsinhand) + var/grenadedamage = chosengun.last_projectile_type + + var/obj/item/grenade/r_corp/F = new /obj/item/grenade/r_corp/lcorp + F.explosion_damage_type = grenadedamage + F.explosion_damage = chosengun.last_projectile_damage*3 + F.forceMove(user.loc) + F.throw_at(target, 30, 2, user) + +//This is only used by the grenade launcher ability +/obj/item/grenade/r_corp/lcorp + name = "l-corp grenade" + desc = "An anti-abnormality grenade. It deals 90% less damage to humans." diff --git a/ModularTegustation/agent_skills/ranged/smokedash.dm b/ModularTegustation/agent_skills/ranged/smokedash.dm new file mode 100644 index 000000000000..649dea0fb800 --- /dev/null +++ b/ModularTegustation/agent_skills/ranged/smokedash.dm @@ -0,0 +1,28 @@ +//Smokedash +/datum/action/cooldown/agent_smokedash + name = "Smoke bomb" + desc = "Drop a smoke bomb at your feet, and increase speed for 2 seconds. Costs 10SP" + icon_icon = 'icons/hud/screen_skills.dmi' + button_icon_state = "smokedash" + cooldown_time = 30 SECONDS + +/datum/action/cooldown/agent_smokedash/Trigger() + . = ..() + if(!.) + return FALSE + + if (owner.stat == DEAD) + return FALSE + + //increase speed + var/mob/living/carbon/human/human = owner + human.adjustSanityLoss(10) + human.add_movespeed_modifier(/datum/movespeed_modifier/assault) + addtimer(CALLBACK(human, TYPE_PROC_REF(/mob, remove_movespeed_modifier), /datum/movespeed_modifier/assault), 2 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + + //drop a bit of smoke + var/datum/effect_system/smoke_spread/S = new + S.set_up(4, get_turf(human)) //Make the smoke bigger + S.start() + qdel(S) + StartCooldown() diff --git a/ModularTegustation/agent_skills/skill_chooser.dm b/ModularTegustation/agent_skills/skill_chooser.dm new file mode 100644 index 000000000000..34d359d41def --- /dev/null +++ b/ModularTegustation/agent_skills/skill_chooser.dm @@ -0,0 +1,81 @@ +/obj/item/class_chooser + name = "L-Corp agent class chooser accelerator" + desc = "A device used to choose your agent class." + icon = 'icons/obj/device.dmi' + icon_state = "nanite_comm_remote" + +/obj/item/class_chooser/Initialize() + . = ..() + QDEL_IN(src, 60 SECONDS) //You MUST pick within 60 seconds + +/obj/item/class_chooser/attack_self(mob/living/carbon/human/user) + //Let you pick your agent class + var/list/can_class = list( + //Only Agents specifically and Dept Captains get this. + //Might be good for Interns to not have this option + //Captains belong to the "Command" Class + "Agent", + "Department Captain", + ) + + if(!(user?.mind?.assigned_role in can_class)) + return ..() + + + var/list/classes = list( //Classes that aren't standard or Random + "Defensive", + "Healing", + "Ranged", + ) + + var/list/available_classes = list( + "Standard", + //"Random", Currently bugged + ) + + for(var/i in 1 to 3) //You should only get to pick 1-3 of these. + var/random_add = pick(classes) + available_classes += random_add + classes -= random_add + + qdel(src)//Delete it here so you can't re-roll your class. + + var/choice = input(user, "Which Agent class will you choose?", "Select a class") as null|anything in available_classes + if(!choice || !user.canUseTopic(get_turf(user), BE_CLOSE, FALSE, NO_TK)) + to_chat(user, span_notice("You decide to choose the 'Standard' class.")) + return + + classes-= "Random" + if(choice == "Random") + choice = pick(classes) + + switch(choice) + if("Defensive") + to_chat(user, span_greenannounce("You have chosen the Defensive Agent class. In exchange for -10 Work rate and speed, you get 2 Defensive skills.")) + user.adjust_attribute_bonus(TEMPERANCE_ATTRIBUTE, -10) + + var/datum/action/G = new /datum/action/cooldown/hunkerdown_agent + G.Grant(user) + G = new /datum/action/cooldown/parry + G.Grant(user) + + if("Healing") + to_chat(user, span_greenannounce("You have chosen the Healing Agent class. In exchange for -10 melee damage and movement speed, you get 2 Healing skills.")) + user.adjust_attribute_bonus(JUSTICE_ATTRIBUTE, -10) + + var/datum/action/G = new /datum/action/cooldown/agent_healing + G.Grant(user) + G = new /datum/action/cooldown/agent_soothing + G.Grant(user) + + if("Ranged") + to_chat(user, span_greenannounce("You have chosen the Ranged Agent class. In exchange for 20% slower melee, you get a movement skill, a gun skill, and all guns scale justice 50%.")) + ADD_TRAIT(user, TRAIT_WEAK_MELEE, JOB_TRAIT) + ADD_TRAIT(user, TRAIT_BETTER_GUNS, JOB_TRAIT) + + var/datum/action/G = new /datum/action/cooldown/agent_smokedash + G.Grant(user) + G = new /datum/action/cooldown/autoloader + G.Grant(user) + + return ..() diff --git a/ModularTegustation/ego_weapons/_ego_weapon.dm b/ModularTegustation/ego_weapons/_ego_weapon.dm index b0c12da5d40e..f5ff87aae7e0 100644 --- a/ModularTegustation/ego_weapons/_ego_weapon.dm +++ b/ModularTegustation/ego_weapons/_ego_weapon.dm @@ -67,6 +67,13 @@ if(!CanUseEgo(user)) return FALSE . = ..() + if(HAS_TRAIT(user, TRAIT_WEAK_MELEE)) + if(!attack_speed) + user.changeNext_move(CLICK_CD_MELEE * 1.2) + else + user.changeNext_move(CLICK_CD_MELEE * attack_speed*1.2) + return TRUE + if(attack_speed) user.changeNext_move(CLICK_CD_MELEE * attack_speed) return TRUE diff --git a/ModularTegustation/ego_weapons/ranged/_ranged_projectile.dm b/ModularTegustation/ego_weapons/ranged/_ranged_projectile.dm index f58e1a8e060e..68085c67a516 100644 --- a/ModularTegustation/ego_weapons/ranged/_ranged_projectile.dm +++ b/ModularTegustation/ego_weapons/ranged/_ranged_projectile.dm @@ -21,6 +21,10 @@ projectile.suppressed = quiet projectile.damage *= projectile_damage_multiplier + + if(HAS_TRAIT(user, TRAIT_BETTER_GUNS)) + projectile.damage += projectile.damage*get_attribute_level(user, JUSTICE_ATTRIBUTE)/130*0.50 + if(temporary_damage_multiplier) projectile.damage *= temporary_damage_multiplier diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 5279ccf5821d..9538accb260e 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -179,6 +179,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_WORK_KNOWLEDGE "work_knowledge" #define TRAIT_WORK_FORBIDDEN "work_forbidden" #define TRAIT_ATTRIBUTES_VISION "attributes_vision" +#define TRAIT_WEAK_MELEE "weak_melee" +#define TRAIT_BETTER_GUNS "better_guns" /// reduces the use time of syringes, pills, patches and medigels but only when using on someone #define TRAIT_FASTMED "fast_med_use" #define TRAIT_NOBREATH "no_breath" diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index a16304e6109f..6ef6ab9df7d0 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -72,6 +72,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_WORK_KNOWLEDGE" = TRAIT_WORK_KNOWLEDGE, "TRAIT_WORK_FORBIDDEN" = TRAIT_WORK_FORBIDDEN, "TRAIT_ATTRIBUTES_VISION" = TRAIT_ATTRIBUTES_VISION, + "TRAIT_WEAK_MELEE" = TRAIT_WEAK_MELEE, + "TRAIT_BETTER_GUNS" = TRAIT_BETTER_GUNS, "TRAIT_NOBREATH" = TRAIT_NOBREATH, "TRAIT_ANTIMAGIC" = TRAIT_ANTIMAGIC, "TRAIT_HOLY" = TRAIT_HOLY, diff --git a/code/modules/jobs/job_types/agent.dm b/code/modules/jobs/job_types/agent.dm index 9fff451173c5..23f42fa7a83e 100644 --- a/code/modules/jobs/job_types/agent.dm +++ b/code/modules/jobs/job_types/agent.dm @@ -119,8 +119,6 @@ if(istype(processing, /datum/job/suppression/captain)) processing.total_positions = 1 - return ..() - /datum/outfit/job/agent name = "Agent" @@ -134,6 +132,7 @@ shoes = /obj/item/clothing/shoes/laceup gloves = /obj/item/clothing/gloves/color/black implants = list(/obj/item/organ/cyberimp/eyes/hud/security) + l_hand = /obj/item/class_chooser backpack_contents = list( /obj/item/melee/classic_baton, @@ -164,6 +163,7 @@ name = "Agent Intern" jobtype = /datum/job/agent/intern head = null + l_hand = null backpack_contents = list( /obj/item/melee/classic_baton, diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index a0b2cf991a54..b6fc9cf69ddd 100644 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -31,6 +31,7 @@ head = /obj/item/clothing/head/hos/beret ears = /obj/item/radio/headset/heads/agent_captain/alt l_pocket = /obj/item/commandprojector + l_hand = null backpack_contents = list( /obj/item/melee/classic_baton, diff --git a/icons/hud/screen_skills.dmi b/icons/hud/screen_skills.dmi index 35b3e03251f04a996773468b2963aee6bde02413..d139a25f7147d7a3ac6fd118a67d9bad48d8f4a3 100644 GIT binary patch literal 8185 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 YZZmH@oNtjxvh)ERt!J7j^_OA)2d8Eu3;+NC literal 7824 zcmX|GcTkg0v`r`ynnXH?1b#}FUZi(KKq&%(p^MU+^pZft&_s$f5dxw2BGP+NiXa5( zy-07NhZ2Do-@JK$d}n8N_RgKXv%B9p=SJ!4YEo0MQUCw|YON>g&k5twzYlbafUJT} z%K!i{JkZG0Tm6lft*4`hx1+lo0N{^`8E@Am7Nxp%(0E3FXE!p$naK#r52U0)z@kP? ze{wBJ3&MlKDU5EtcJ~|6v&uPdp34vNht0G#4G#Fu-1l=DFQ2~}Kdq6~k6)d@Vtt`p zc@_zyI!s`1XTRUu-8B?H=F8^?Yd%m>W@d)`6vtLI+&xPvPO3O!fnh@-{8Yn#a?ky9v_)MDHuGc#qCydU8^yulRJ3?O9?Vt%6BHy35* z%oFIO2(gX}_u}uU0_=>{vuf7w`m+C_`?jq}b}<*7e=j?xF>6q)C)7&HjQ152GG}1@ zm@J?*r|{+cw7rIDSM#!I$m@><81?6@1#{vqk#=)78n?1v2yTV6+Pq^?rw~(>h92E` zsKFja(wfofoU=%&o6K+p^xlW&V7_u*8kGb&7b}t(u|#hp8Fxoc&}8?CeXbIU?(gvG zTX}q;e)I$A9}aaLIW~AB`1t4sdoZHV<~FzfMh;G_)}eQi6vmGO0NA><)K!f9QF|Gf zXmibk-dvMSce zUyGgo<^cfo7^7WjRv;5QFKL>&NA*w0;lmV>mL2I&)kcZ`>gl+@&cwWKn&jD13okqk z+&j&R?(XW4iqXymijY`rGCyN(zrG&G$beX0kC6tp+;VC^^Kq3bl*1oi1bE@=dG!2n z5Q}zqx0@5E>gtedm!WS;6ablni-la^^5kMjb)n?r&SCbq6N)k=l7Ma zfmqwUD#pUu>C2|uy|Bq8#R)cI_Kz0}ZNz6)IOYS}`eT!Z=Ek|5@P&EvZyjt85TXX> zDFbird^8X1dC`7z9+CEJQPQIqR$d_>u`Vaq?Dk4YV!hcPUlDaRS~}QCGVr|@vy5FA z!<*+4gKN!&j4}JptGs6c(K#bdIyZb3iY;3LsF{YOt8P6( zZ!|YIlK4xVv4<$p1vc6*!f%!UY#)OCFGfE~`Tu=1w#3z{cN@m1WnltpOUi3`MZgEG zIXf597DGuUY~IW{_5arXa$WT<%NJemeB=m!o6I@+$;xS-HsblG;$UP5J9nsQQIbc4&6MDjR$AUR&rFsM;!% zbSkvvrAKV!?E9#!gfrz;I4dflGcw>LF?TIH&Mq=BRX3ZLSG%Ez9%|twJPfljr4%BC z&akv_+meo>vz%(h9LvL90AdU~MA}0VO-p|djtW`eLT_|dns}e`A$YT%i)Yan&@0pH z7qjRixuupva}L`LdVoyP-DMBJahPs9EiR%%u6<2#104tUHW^a?sL6A!i+(5AsV|Ig z;%Y2G7-u4Im-sQg*><U0 z{QW%+d4TYGcucDXI8!y>$0B{O7Yw{oQtY`YeD#j`W?(OLApzW3PA8P5pZ{+n@phLj zn+ScRrp;gXn%PehxI?XsQKpo5oV4P(;?*{A3Ekt9zZ7)3O>%(Y@tY8zq$^koI$W1r zLhE763iEi>;}~~5o2oN&7h@lgXa8vQ@Vrldmr4?sAZi`GlR&H6G^aN&mX65G#0??)9$5p(EiGUO3v ztGt+|e5i-t&B|&e?wqQ2#NJZo*U@oE z`|y}0Tx9sE;cvIBVKIxA{DMbcu(caNYO2KIa=RCqzg}+_s`LV%6%-EuB)-V@|35f+ zzwH=ndc4N~DekV7bnKVWE-&3RVEkoN@gIQ8^UvfHxjP2hwNd^~`5B;}g{Wr*fFsxY zekzS8G*uH<_QVbC!zU*0-=2?3sNc14yChAEFRFq6kmB5Esi*H@JVTRaxhMNM`F(Xn zeaN3%DateDGIkwGpLvyEj$P!od0G(rDxhQTy7Fh9;9}28%8_e}paHG&Bm;gsE8mkV z?I~-{-GU&HOwkuu^tB7J2j=(a^Pt_|r{C{v$kqFPD$FALNUgf{u;}E$Q`hT+8EG3= zzh)_2({v>bIo(YhVs27`;n@2`vK;HMd%fu_GjD)<$jb`KK&1=6&mEx=IaPEs$*)mD z2SV!KrP!f#TPvk>p9CpohjP(Q=h$i|hmT@oFR}a9Pg1h2qkY8X6<~kmq2WxzL^rij z>5l!6u#TjQ^bDs6)8(+>ub^!BR4>op1^6+5{^?-d@{Us-3Q0ciRh(d<&!n18s^HcL zChC(=k9}n^$Y>L3YEpfo837;9Zo9GE;-13Ln|o^%boP@{t9YZu54&&02TuVa+5s|> zzn`v*$M+xzZ=_~DGY5dp`@2rky+{m02E*D=e1W3T-aNRN#yE&oQPOPM_7RD(3)Pf% zxk+0?LenBIqFB}ebq=9^=Fvr8ES-T1?iiy%63__c#)}8SZ966?lBwOfqVP19GJ$PI zAHR1|k0w3RW0> zq&qFY$;;}jshD4fNG@CDQIQ{qp`yuwN=X>X%ccxYkh6gC1$J?Ak4mMlF@zB@C+nct zxW6(bPOX^_p6H687?=0XH|CC=ooHO^GiQjiRO6`^T|P;o%%+F&QrNh3aT#N(j83j? z)r7Xm8_&?@lxebGNSET&%t86fYWdu6^hXY|Yp@~SwVV$HZ5Bn;_wneNGbLHTvjV=K z31VNK-g^T``#+FungMfL*wD@<%*oHtaTq2&>q`AbKVZ5SPOgo}ds*g8=bdccYv`P>RBn1uQ|DIzuBmrPYMCJ zzoD>DRZg|YNz_iUGshS*?*54c6ijsR zxzJIINR<)6rR=C2iO9&X*gq}ZTFF*1rGWH@{bLmqS6+*w6m84^5USbr32RrC084lg z(6QChohdrZlsJoeiqtjIwgY;u54sb&wjKJBDJV#>WVkLnArQ`K(}$GfdvK4x@hr4u zIjr)YdL^_gx|Z#3-3XzY)K|Z4A1tYbEfE9!57$qJ#BYBkLqdl@RS!khcw)5=IpmPH_7OxfAH93RTUnb@?{jeUYiPlr;OWs$t zSPNtvl2O}VSzT7&+-yJVO`6uoZ&?JwZvHY^hqz1`DxN>+1O@zgaS%51ghCPVp*D-Y z4xGd_g6jSiCPE5<50XIup)bj7o+xe>NwnGw{fOvfy1u5VkRQJ?7y3+=c^guw{4_)E zk?Ec;EH8;pAPG_VL&${hTwi#hW#QS#lWD1QtT82|1L3RI@F~m-8On@+5;d67@1k=O|@wTeY~dYa2|Umi3O{RGJCdo zP&BbM&k6lWUB>T)+?-_ThEX?reC(OivX=>69^l~KezVP){MC5FVa;@`B;SAC}a>!md4iV?8Cb>im za_Ng1d{JO0Ypd@`bO=p%(ZTFs<-8R*ve5S9LOp4xy?$}fP0-Ow3R|Mjw~n*Wx~C{<0beEfQ9oUg(i)xY)Ksd2Z} z<}%|5VL$+Z(L4=gdf)TP1)KLQ2G-2#vAdPH`p0=PXxTrWy|ilVR~Y8et=v9qz#(a#L; zX{$wnN%kCDWpa<6CThpBgK^$lkdEHBFKNzUTY?9A{X+d@XgThaJ)qzn0Rd<+Pf|Fh zby}aPhB1||L-TXp+o4aPl_yi?1nSr-1gGXaSFOay{=6e6Xd{G#W(wEpjxG(Dkn3*- zK)W_(9@mD(v1>vmYZ7x>vN)N|d>-Y8gv}k-4TvmX0@1E`ZmbJSN0V4|DAL+-Ov1Rqct6c$%OJCl(reb>9}$oT`HS zct6?3=WmReLko0Z%zgd5tuunpQcj$4US@l=(ys$!(^!NK)f2ZXGTgL(G{+($jAo?!- zZ+WIiC}^Y3qUt1X#)sf1rz{qrhU(Sl!zXq7{bBpdD;s3JC<1r31%L2YzKx`PQ>_Yi z`mV`f=GQMc*2lmj^CG&$2z%z6E<fh;x#7^5pgmqjHM!>^g&H^|r9$s%^t)qF0|V^!#MtF-tE9oc){tLUhiog^okjz`E3Jv~M|+Ubuq@^ZGtaMyzd9 z677|8+8Vu~RbH!>hOy8WJ^4_f&x1e`gxl6p?e64iYUd$49QB+5K{!Ed8>Q)_6L#g2+n;Y8afuHV%mzbZF@jU&&y+*oQ@V;0Bb~>$HI-)dja&sIf|4 zRH>uX(E_gVsFNxB^fyYb;#+f;!m?UpCzkQBUH^(~(V4Z>1Il}P71kD1!m1oNyTMCh z<+97XGhzpnCL#QVIIr7ld97tMWVu!Y8#%pI3|hHup;K|4CSq5KeRwYU4dYwX>K;+O#1tY9DD%x`PU3dlKLZvVMrE9vQjZ#f{J(mWYM-ca< zFd)cRF5*8wswqP?R$^U)k$K&c&6jf&y_ZQUM#I?m(17H zRgy!LNt9)`{;2XM3%dTwSu2+04sGZdCY`R`_`}acv<2Clz!|=6V+{aOG5C9P{!ogc z6z}d_MtqjljA;NnoTfsj{|P(CPBL&GC2N|?TOK>#UMdk|L``7Ku~UDTvq|Yu@-N&y zabrB~3~{{SOoMU85oht)FDG(jxpw#IH8yCr(pZG*j@Nvvd(&B&Esa4|;H160Z}Jbk zsw@DEA8+NPEUtgV8cJ0YoKRub@QD1FAS|hF9>k=ESEhU^iAZ6%o3(fq_n&Z4aZEVq zvCe73je$v@a0Lw)uw9H{AQ?{Z?pQ1!kh3 z(Zu(rH{fQPUB5{&ZCaSA;`<(h)V6B~1^;%a_Jn5Q*TqZLz(pm5Ay4*q=-dLXihe3s zFg$LpQ-VofXQq;!c!IDfo)RGp+)i?7cJ{U9dr;^=a96zaUHb%SQuryQ=<&w3%2sfR zGYnaN9t#3V*#n$QKDUZs@TS;X8KDy3$ZhMS6$vwpcA z#r(VG-oVf8Sq33$6?gp9UT*W~JZBu2(i2X7B&}QciAqRsESwWcD8RS$mut10Bka(#=T-9;tFk13VAHbX zt3T3NMsNwOMvwcT8DFz$-@EO1L6hNMldn)c=;u);PLAykRLuNF%Xs2*Q^+$zPRxua zRgt6I*f|i_YnC779Pvu2@GwHTgoU`S4!sA=-^m@{9<5~m+EUshS@Z3l^Iu-sg#;Y3 ze0M|YddmOdgd|(S)k8q7w#2woe;uLTYwxX};;IY`L0EM2oY`h4OYbtlqM-Syc()_F z>ygjfyGs3GSyJ@FGm5IpkkKBL(_i}d1eW0mTq~fiEUu?kkAWzdA7@b9qo+fv-w6IV z*w*~L<1@SB#8s)W4xS89R}q(j58k`-Z{2JD^W%@iD-X4=`*#zUkBf^#qKriZcdIXB zC-!!8%aj|soRTte^F47pLNd#MC~83YE)SpBd3e75PeA#B8V$a!M{m;N@&UPx4*p?+ z#7^#)bM54rk?^neaI^yz^gEr?tR7L31!V9CUHyYeEznA%kzN`6S7weqO+g-#JKN7?!UQVmPi%N8ZWHIqjSoWZb{x^8zCE2 zBitdsn-`Gb*V{#%-YU-uY{z&2y%y-f*W1OdqD!I^_IIlbEHfMk+GJ>B<9$=Tktx?% z^AvEZNiki;v~XcOs^;nPqz&;~T)37L1#53VPtr`59uwF?ZKRV=$b0?4&R>Tfopn#=F2$xt@Hm3z4|^*pw;#eLkRqf;Lsb>90|SCKQKJM|SZiCaX5ODA z7NWJSuN5;Y-}~GZv7d|_o@_mA*^NPT!v(9>Gd1x=*vJ~hac{y9JSBHil z+pOa$-@PoUuHM-_E1TSL-Lhv7r9q%A@8j4P|9BI$6E&2!iydccl|xg*oND+EOsK>8 z=px$X=Hv{%^nmjR){YzrI7K(Qmt};0T~*KmIJ15uK`QJz19IOE>BHMzT;7BX?AUo~ z^ai$H;hOsBh*sh2b8js{ylx9dlaw>hYk(g{$2(E!b93pm_@knT<4#S5*Tpb8K}m2* zBqg1Rs4z3BM;ZImOE$rLixrEVIa<%Ige7FW{PQnb)m~AU;_BhR-tPm1(jv??vu5V`;JAKu;|3^RE*-r@vgsiYK4hT%@EJG+I6M ziD5>O<+feXo2~Uc}=}u^;(wp`I7Cak2_Wac^9sfX`Z8j`6 zo_u(3AOC0mI4^di@1LU`{TZMX5~PG1#Ua)1occ<3%)Htqy67l5g%R=#OO6BPHayCn zQ$Tbp8V<6-s(~&QF;!Zx)+MCL?>82FTQzUpb#~*^&XDutK%0eB_8ixyte#~ZW)yJ$ zY!IW77IEaRE)Nr4z0$X8X@SsOUr(|M>@h%j?Z&Vd@A9nznk#Se;#v2WsV(S@2Tn z2kMBieLB83_WHlRjQC}KZ`~KVsUP4zonGs!$lqVBJSxhZ9Ws*0t<7!1*-p=aR6xT7 zrW#(p#FG+6rdxuWjW_|!T5H{l`DgnQ=g6henNJD$t1)iH^_E4-tce6M3KgmjMqF=2 zYj+1-C=D02P5GlAH#$7)^FWXXx(XVku#xt<8wZ@~YFocBbJ{N60&c6g$lNCDyAi?x zT*|9fNhQD3ygns3l(DiPwWW{GwB%p+TVxkIRhgc&A#*2y2#LhXed^zi2jSCchfwGg z`4*vlLJE)$k*bHV8-DuGlr^`i(op-DIDVlTL16iNgpL6autcELHQ+R|-O`*ghdH=& zRh|lWVzDPJ_ZqqILR+c!dk#{!V!t0kcIA1kxvQ#xV+1_Ej+5!#cL~aF20PFXu1Wng zAXRfJ!FWVi44N+o=~W8V*MdF&*qo&DJtR`PWz4l6;9@J%3q$1uQxa)K@r8=fXk)y zKa6Q9IZMxEsISM2sjP>bnBQYwAC-cX-|Ok6S!nEp-`1N3)FCSijJ}d=dbiqF^t33B zjp@DwOmv+=ZmxwxhMMIQ9cNzk0=eWDg)b)U#hyVQ(oEU@vY*!*73C$*de)HoH1GqF z!$GYH<`P+e(+=zyizOi>;Wq(ym^H--1F{)mQr9}s75LS$vPaa0mH_z03v8W=Mv<~>y1Bqave%+XzjcTkF|n4wV5yE@pn- zyelN+atGUZY=6w6P@v&9oSoz#_0!p%52|~A;wZ4Kmtb1cPOcCk3j%@^M*EjY zZkas*+tCB<{T-TA;gcq#2OEJcBMWoP?OZt;pK~&#;`dK1*gTT-2k## X>dkdH4d)4+W`LH4u6l*4b?E;97=K~U diff --git a/lobotomy-corp13.dme b/lobotomy-corp13.dme index 16ba50f799ce..7691368ad005 100644 --- a/lobotomy-corp13.dme +++ b/lobotomy-corp13.dme @@ -3944,6 +3944,13 @@ #include "ModularTegustation\tegushuttles.dm" #include "ModularTegustation\trusted.dm" #include "ModularTegustation\turfs.dm" +#include "ModularTegustation\agent_skills\skill_chooser.dm" +#include "ModularTegustation\agent_skills\defensive\hunker_down.dm" +#include "ModularTegustation\agent_skills\defensive\parry.dm" +#include "ModularTegustation\agent_skills\healing\healing.dm" +#include "ModularTegustation\agent_skills\healing\soothing.dm" +#include "ModularTegustation\agent_skills\ranged\autoloader.dm" +#include "ModularTegustation\agent_skills\ranged\smokedash.dm" #include "ModularTegustation\altjobtitles\altjobtitles.dm" #include "ModularTegustation\altjobtitles\LC13.dm" #include "ModularTegustation\altjobtitles\outfits.dm" From 7ec10fac88dac9c74d677a8f312a53c933842a7c Mon Sep 17 00:00:00 2001 From: Kirie Saito <77302679+Kitsunemitsu@users.noreply.github.com> Date: Wed, 8 Jan 2025 15:14:10 -0500 Subject: [PATCH 2/9] Update agent.dm --- code/modules/jobs/job_types/agent.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/jobs/job_types/agent.dm b/code/modules/jobs/job_types/agent.dm index 23f42fa7a83e..b4e8924edef6 100644 --- a/code/modules/jobs/job_types/agent.dm +++ b/code/modules/jobs/job_types/agent.dm @@ -119,6 +119,7 @@ if(istype(processing, /datum/job/suppression/captain)) processing.total_positions = 1 + return ..() /datum/outfit/job/agent name = "Agent" From e30846afa5e84388a2b8940da02efc242685e29c Mon Sep 17 00:00:00 2001 From: Kirie Saito <77302679+Kitsunemitsu@users.noreply.github.com> Date: Fri, 10 Jan 2025 08:09:55 -0500 Subject: [PATCH 3/9] adds skirmisher class --- .../agent_skills/skill_chooser.dm | 13 +++++++ .../agent_skills/skirmisher/assault.dm | 23 ++++++++++++ .../agent_skills/skirmisher/blitz.dm | 36 +++++++++++++++++++ .../agent_skills/skirmisher/dash.dm | 3 ++ .../items/fixerskills/level1/movement.dm | 2 ++ 5 files changed, 77 insertions(+) create mode 100644 ModularTegustation/agent_skills/skirmisher/assault.dm create mode 100644 ModularTegustation/agent_skills/skirmisher/blitz.dm create mode 100644 ModularTegustation/agent_skills/skirmisher/dash.dm diff --git a/ModularTegustation/agent_skills/skill_chooser.dm b/ModularTegustation/agent_skills/skill_chooser.dm index 34d359d41def..951354a75fd7 100644 --- a/ModularTegustation/agent_skills/skill_chooser.dm +++ b/ModularTegustation/agent_skills/skill_chooser.dm @@ -26,6 +26,7 @@ "Defensive", "Healing", "Ranged", + "Skirmisher", ) var/list/available_classes = list( @@ -78,4 +79,16 @@ G = new /datum/action/cooldown/autoloader G.Grant(user) + if("Skirmisher") + to_chat(user, span_greenannounce("You have chosen the Skirmisher Agent class. In exchange for 15 lower HP and SP, you get 3 skills to increase movement speed.")) + user.adjust_attribute_bonus(FORTITUDE_ATTRIBUTE, -15) + user.adjust_attribute_bonus(PRUDENCE_ATTRIBUTE, -15) + + var/datum/action/G = new /datum/action/cooldown/dash/agent + G.Grant(user) + G = new /datum/action/cooldown/blitz + G.Grant(user) + G = new /datum/action/cooldown/assault_agent + G.Grant(user) + return ..() diff --git a/ModularTegustation/agent_skills/skirmisher/assault.dm b/ModularTegustation/agent_skills/skirmisher/assault.dm new file mode 100644 index 000000000000..815b65402fca --- /dev/null +++ b/ModularTegustation/agent_skills/skirmisher/assault.dm @@ -0,0 +1,23 @@ +//Assault +/datum/action/cooldown/assault_agent + cooldown_time = 20 SECONDS + name = "Assault" + desc = "Increase movespeed for 5 seconds. Costs 10SP" + icon_icon = 'icons/hud/screen_skills.dmi' + button_icon_state = "assault" + + +/datum/action/cooldown/assault_agent/Trigger() + . = ..() + if(!.) + return FALSE + if (ishuman(owner)) + var/mob/living/carbon/human/human = owner + human.adjustSanityLoss(10) + human.add_movespeed_modifier(/datum/movespeed_modifier/assault) + addtimer(CALLBACK(human, TYPE_PROC_REF(/mob, remove_movespeed_modifier), /datum/movespeed_modifier/assault_agent), 5 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + StartCooldown() + +/datum/movespeed_modifier/assault_agent + variable = TRUE + multiplicative_slowdown = -0.2 diff --git a/ModularTegustation/agent_skills/skirmisher/blitz.dm b/ModularTegustation/agent_skills/skirmisher/blitz.dm new file mode 100644 index 000000000000..6ee852b72fef --- /dev/null +++ b/ModularTegustation/agent_skills/skirmisher/blitz.dm @@ -0,0 +1,36 @@ + +//Retreat + +/datum/action/cooldown/blitz + name = "Blitz" + desc = "Increase movespeed greatly and decrease defenses for 5 seconds. Costs 10SP" + icon_icon = 'icons/hud/screen_skills.dmi' + button_icon_state = "retreat" + cooldown_time = 20 SECONDS + +/datum/action/cooldown/blitz/Trigger() + . = ..() + if(!.) + return FALSE + if (ishuman(owner)) + var/mob/living/carbon/human/human = owner + human.adjustSanityLoss(10) + human.add_movespeed_modifier(/datum/movespeed_modifier/retreat_agent) + addtimer(CALLBACK(human, TYPE_PROC_REF(/mob, remove_movespeed_modifier), /datum/movespeed_modifier/blitz), 5 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + human.physiology.red_mod *= 1.3 + human.physiology.white_mod *= 1.3 + human.physiology.black_mod *= 1.3 + human.physiology.pale_mod *= 1.3 + addtimer(CALLBACK(src, PROC_REF(Recall),), 5 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) + StartCooldown() + +/datum/action/cooldown/blitz/proc/Recall() + var/mob/living/carbon/human/human = owner + human.physiology.red_mod /= 1.3 + human.physiology.white_mod /= 1.3 + human.physiology.black_mod /= 1.3 + human.physiology.pale_mod /= 1.3 + +/datum/movespeed_modifier/blitz + variable = TRUE + multiplicative_slowdown = -0.5 \ No newline at end of file diff --git a/ModularTegustation/agent_skills/skirmisher/dash.dm b/ModularTegustation/agent_skills/skirmisher/dash.dm new file mode 100644 index 000000000000..01bee726ddc0 --- /dev/null +++ b/ModularTegustation/agent_skills/skirmisher/dash.dm @@ -0,0 +1,3 @@ +//Just needs a longer cooldown +/datum/action/cooldown/dash/agent + cooldown_time = 15 SECONDS diff --git a/code/game/objects/items/fixerskills/level1/movement.dm b/code/game/objects/items/fixerskills/level1/movement.dm index 6fa1a9fdb141..41b7111a73be 100644 --- a/code/game/objects/items/fixerskills/level1/movement.dm +++ b/code/game/objects/items/fixerskills/level1/movement.dm @@ -14,6 +14,8 @@ custom_premium_price = 600 /datum/action/cooldown/dash + name = "Dash" + desc = "Dash fowards a few tiles. Costs stamina." icon_icon = 'icons/hud/screen_skills.dmi' button_icon_state = "dash" name = "Dash" From 80baa290424b207a541144791f4c87c653c7b11d Mon Sep 17 00:00:00 2001 From: Kirie Saito <77302679+Kitsunemitsu@users.noreply.github.com> Date: Fri, 10 Jan 2025 08:29:59 -0500 Subject: [PATCH 4/9] Update lobotomy-corp13.dme --- lobotomy-corp13.dme | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lobotomy-corp13.dme b/lobotomy-corp13.dme index 7691368ad005..a2cfa1606176 100644 --- a/lobotomy-corp13.dme +++ b/lobotomy-corp13.dme @@ -3951,6 +3951,9 @@ #include "ModularTegustation\agent_skills\healing\soothing.dm" #include "ModularTegustation\agent_skills\ranged\autoloader.dm" #include "ModularTegustation\agent_skills\ranged\smokedash.dm" +#include "ModularTegustation\agent_skills\skirmisher\assault.dm" +#include "ModularTegustation\agent_skills\skirmisher\blitz.dm" +#include "ModularTegustation\agent_skills\skirmisher\dash.dm" #include "ModularTegustation\altjobtitles\altjobtitles.dm" #include "ModularTegustation\altjobtitles\LC13.dm" #include "ModularTegustation\altjobtitles\outfits.dm" From 332e7ff87625220dd3ab6b73e49e3b45a3f7daa9 Mon Sep 17 00:00:00 2001 From: Kirie Saito <77302679+Kitsunemitsu@users.noreply.github.com> Date: Fri, 10 Jan 2025 08:33:21 -0500 Subject: [PATCH 5/9] asd --- ModularTegustation/agent_skills/skirmisher/assault.dm | 2 +- ModularTegustation/agent_skills/skirmisher/blitz.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ModularTegustation/agent_skills/skirmisher/assault.dm b/ModularTegustation/agent_skills/skirmisher/assault.dm index 815b65402fca..b6d92d82dc1e 100644 --- a/ModularTegustation/agent_skills/skirmisher/assault.dm +++ b/ModularTegustation/agent_skills/skirmisher/assault.dm @@ -14,7 +14,7 @@ if (ishuman(owner)) var/mob/living/carbon/human/human = owner human.adjustSanityLoss(10) - human.add_movespeed_modifier(/datum/movespeed_modifier/assault) + human.add_movespeed_modifier(/datum/movespeed_modifier/assault_agent) addtimer(CALLBACK(human, TYPE_PROC_REF(/mob, remove_movespeed_modifier), /datum/movespeed_modifier/assault_agent), 5 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) StartCooldown() diff --git a/ModularTegustation/agent_skills/skirmisher/blitz.dm b/ModularTegustation/agent_skills/skirmisher/blitz.dm index 6ee852b72fef..6cf7d2e22de5 100644 --- a/ModularTegustation/agent_skills/skirmisher/blitz.dm +++ b/ModularTegustation/agent_skills/skirmisher/blitz.dm @@ -15,7 +15,7 @@ if (ishuman(owner)) var/mob/living/carbon/human/human = owner human.adjustSanityLoss(10) - human.add_movespeed_modifier(/datum/movespeed_modifier/retreat_agent) + human.add_movespeed_modifier(/datum/movespeed_modifier/blitz) addtimer(CALLBACK(human, TYPE_PROC_REF(/mob, remove_movespeed_modifier), /datum/movespeed_modifier/blitz), 5 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE) human.physiology.red_mod *= 1.3 human.physiology.white_mod *= 1.3 From 29664cd9313912e58b206c385c627076c0ceb3f8 Mon Sep 17 00:00:00 2001 From: Kirie Saito <77302679+Kitsunemitsu@users.noreply.github.com> Date: Fri, 10 Jan 2025 09:19:23 -0500 Subject: [PATCH 6/9] Update ModularTegustation/agent_skills/skill_chooser.dm Co-authored-by: Gboster-0 <82319946+Gboster-0@users.noreply.github.com> --- ModularTegustation/agent_skills/skill_chooser.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ModularTegustation/agent_skills/skill_chooser.dm b/ModularTegustation/agent_skills/skill_chooser.dm index 951354a75fd7..ff4850a0dbf3 100644 --- a/ModularTegustation/agent_skills/skill_chooser.dm +++ b/ModularTegustation/agent_skills/skill_chooser.dm @@ -35,9 +35,7 @@ ) for(var/i in 1 to 3) //You should only get to pick 1-3 of these. - var/random_add = pick(classes) - available_classes += random_add - classes -= random_add + available_classes += pick_n_take(classes) qdel(src)//Delete it here so you can't re-roll your class. From 78e14caed9d54e8e38eaea5bae1aa2471c88eb88 Mon Sep 17 00:00:00 2001 From: Kirie Saito <77302679+Kitsunemitsu@users.noreply.github.com> Date: Sun, 19 Jan 2025 03:48:50 -0500 Subject: [PATCH 7/9] Update ModularTegustation/agent_skills/ranged/grenade.dm Co-authored-by: Gboster-0 <82319946+Gboster-0@users.noreply.github.com> --- ModularTegustation/agent_skills/ranged/grenade.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ModularTegustation/agent_skills/ranged/grenade.dm b/ModularTegustation/agent_skills/ranged/grenade.dm index a419a9c24933..e905f202b184 100644 --- a/ModularTegustation/agent_skills/ranged/grenade.dm +++ b/ModularTegustation/agent_skills/ranged/grenade.dm @@ -20,7 +20,7 @@ var/mob/living/carbon/human/user = owner user.adjustSanityLoss(10) - var/obj/item/grenade/r_corp/F = new /obj/item/grenade/r_corp/lcorp(get_turf(user)) + var/obj/item/grenade/r_corp/lcorp/F = new(get_turf(user)) F.explosion_damage_type = pick(RED_DAMAGE, BLACK_DAMAGE, WHITE_DAMAGE) F.explosion_damage = get_attribute_level(user, JUSTICE_ATTRIBUTE)*2 user.equip_in_one_of_slots(F, ITEM_SLOT_HANDS , qdel_on_fail = TRUE) From 2a6923f7d856e5467d7ed72339ab8cbce25f1e0c Mon Sep 17 00:00:00 2001 From: Kirie Saito <77302679+Kitsunemitsu@users.noreply.github.com> Date: Sun, 19 Jan 2025 03:48:55 -0500 Subject: [PATCH 8/9] Update ModularTegustation/agent_skills/ranged/grenade_launcher.dm Co-authored-by: Gboster-0 <82319946+Gboster-0@users.noreply.github.com> --- ModularTegustation/agent_skills/ranged/grenade_launcher.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ModularTegustation/agent_skills/ranged/grenade_launcher.dm b/ModularTegustation/agent_skills/ranged/grenade_launcher.dm index 4c50e662faea..7546be40a1c3 100644 --- a/ModularTegustation/agent_skills/ranged/grenade_launcher.dm +++ b/ModularTegustation/agent_skills/ranged/grenade_launcher.dm @@ -13,7 +13,7 @@ var/list/gunsinhand = list() for(var/obj/item/ego_weapon/ranged/Gun in shooter.held_items) gunsinhand+=Gun - if(!LAZYLEN(gunsinhand)) + if(!length(gunsinhand)) return ..() var/obj/item/ego_weapon/ranged/chosengun = pick(gunsinhand) From d3ff093845648e2affa686cc70cae16b6d8f0384 Mon Sep 17 00:00:00 2001 From: Kirie Saito <77302679+Kitsunemitsu@users.noreply.github.com> Date: Sun, 19 Jan 2025 03:49:00 -0500 Subject: [PATCH 9/9] Update ModularTegustation/agent_skills/healing/soothing.dm Co-authored-by: Gboster-0 <82319946+Gboster-0@users.noreply.github.com> --- ModularTegustation/agent_skills/healing/soothing.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ModularTegustation/agent_skills/healing/soothing.dm b/ModularTegustation/agent_skills/healing/soothing.dm index 35266fd953e7..c37f7ac8fd56 100644 --- a/ModularTegustation/agent_skills/healing/soothing.dm +++ b/ModularTegustation/agent_skills/healing/soothing.dm @@ -1,7 +1,7 @@ //Curing /datum/action/cooldown/agent_soothing name = "Soothing" - desc = "Heal all humans in a 5 tile radius (except the user) by 15 HP. Costs 10SP" + desc = "Heal all humans in a 5 tile radius (except the user) by 15 SP. Costs 10SP" icon_icon = 'icons/hud/screen_skills.dmi' button_icon_state = "soothing" cooldown_time = 30 SECONDS