From 53253bfce1bfac775306c4a3aef4285c42b3992e Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 27 Dec 2020 10:13:09 -0800 Subject: [PATCH 1/6] changes --- code/__DEFINES/dcs/signals.dm | 2 +- code/modules/clothing/gloves/miscellaneous.dm | 62 ++++++++++++++++++ .../modules/mob/living/living_active_parry.dm | 33 ++++++++-- .../mob/living/living_blocking_parrying.dm | 10 +++ .../uplink/uplink_items/uplink_clothing.dm | 6 ++ icons/mob/clothing/hands.dmi | Bin 12464 -> 12593 bytes icons/obj/clothing/gloves.dmi | Bin 20892 -> 21613 bytes 7 files changed, 107 insertions(+), 6 deletions(-) diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 51a5fb3ece..e1d492c154 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -286,7 +286,7 @@ #define COMSIG_LIVING_ACTIVE_BLOCK_START "active_block_start" //from base of mob/living/keybind_start_active_blocking(): (obj/item/blocking_item, list/backup_items) #define COMPONENT_PREVENT_BLOCK_START 1 -#define COMSIG_LIVING_ACTIVE_PARRY_START "active_parry_start" //from base of mob/living/initiate_parry_sequence(): (parrying_method, datum/parrying_item_mob_or_art, list/backup_items) +#define COMSIG_LIVING_ACTIVE_PARRY_START "active_parry_start" //from base of mob/living/initiate_parry_sequence(): (parrying_method, datum/parrying_item_mob_or_art, list/backup_items, list/override) #define COMPONENT_PREVENT_PARRY_START 1 //ALL OF THESE DO NOT TAKE INTO ACCOUNT WHETHER AMOUNT IS 0 OR LOWER AND ARE SENT REGARDLESS! diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index af55c6b9d7..4a1bb6f14e 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -161,6 +161,68 @@ return NO_AUTO_CLICKDELAY_HANDLING | ATTACK_IGNORE_ACTION +/obj/item/clothing/gloves/fingerless/ablative + name = "ablative armwraps" + desc = "Armwraps made out of a highly durable, reflective metal. Has the side effect of absorbing shocks." + siemens_coefficient = 0 + icon_state = "ablative_armwraps" + item_state = "ablative_armwraps" + block_parry_data = /datum/block_parry_data/ablative_armwraps + var/wornonce = FALSE + +/obj/item/clothing/gloves/fingerless/ablative/proc/get_component_parry_data(datum/source, parrying_method, datum/parrying_item_mob_or_art, list/backup_items, list/override) + if(parrying_method && !(parrying_method == ITEM_PARRY)) + return + override[src] = ITEM_PARRY + +/obj/item/clothing/gloves/fingerless/ablative/equipped(mob/user, slot) + . = ..() + if(current_equipped_slot == SLOT_GLOVES) + RegisterSignal(user, COMSIG_LIVING_ACTIVE_PARRY_START, .proc/get_component_parry_data) + wornonce = TRUE + +/obj/item/clothing/gloves/fingerless/ablative/dropped(mob/user) + . = ..() + if(wornonce) + UnregisterSignal(user, COMSIG_LIVING_ACTIVE_PARRY_START) + wornonce = FALSE + +/obj/item/clothing/goves/fingerless/ablative/can_active_parry(mob/user) + var/mob/living/carbon/human/H = user + if(!istype(H)) + return FALSE + return src == H.gloves + +/datum/block_parry_data/ablative_armwraps + parry_stamina_cost = 4 + parry_attack_types = ATTACK_TYPE_UNARMED | ATTACK_TYPE_PROJECTILE | ATTACK_TYPE_TACKLE | ATTACK_TYPE_THROWN | ATTACK_TYPE_MELEE + parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK + + parry_time_windup = 0 + parry_time_spindown = 0 + parry_time_active = 7.5 + + parry_time_perfect = 1 + parry_time_perfect_leeway = 7.5 + parry_imperfect_falloff_percent = 20 + parry_efficiency_perfect = 100 + parry_time_perfect_leeway_override = list( + TEXT_ATTACK_TYPE_MELEE = 1 + ) + + parry_efficiency_considered_successful = 0.01 + parry_efficiency_to_counterattack = INFINITY // no auto counter + parry_max_attacks = INFINITY + parry_failed_cooldown_duration = 1.5 SECONDS + parry_failed_stagger_duration = 0 + parry_cooldown = 0 + parry_failed_clickcd_duration = 0 + + perfect_parry_block_return_flags = BLOCK_SHOULD_REDIRECT | BLOCK_SUCCESS + perfect_parry_block_return_list = list( + BLOCK_RETURN_REDIRECT_METHOD = REDIRECT_METHOD_RETURN_TO_SENDER + ) + /obj/item/clothing/gloves/botanic_leather name = "botanist's leather gloves" desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin. They're also quite warm." diff --git a/code/modules/mob/living/living_active_parry.dm b/code/modules/mob/living/living_active_parry.dm index 16855d6f22..eb3ef42217 100644 --- a/code/modules/mob/living/living_active_parry.dm +++ b/code/modules/mob/living/living_active_parry.dm @@ -2,7 +2,7 @@ /** * Determines if we can actively parry. */ -/obj/item/proc/can_active_parry() +/obj/item/proc/can_active_parry(mob/user) return block_parry_data && (item_flags & ITEM_CAN_PARRY) /** @@ -26,7 +26,7 @@ var/datum/block_parry_data/data var/datum/tool var/method - if(using_item?.can_active_parry()) + if(using_item?.can_active_parry(src)) data = using_item.block_parry_data method = ITEM_PARRY tool = using_item @@ -47,9 +47,20 @@ using_item = backup method = ITEM_PARRY var/list/other_items = list() - if(SEND_SIGNAL(src, COMSIG_LIVING_ACTIVE_PARRY_START, method, tool, other_items) & COMPONENT_PREVENT_PARRY_START) + var/list/override = list() + if(SEND_SIGNAL(src, COMSIG_LIVING_ACTIVE_PARRY_START, method, tool, other_items, override) & COMPONENT_PREVENT_PARRY_START) to_chat(src, "Something is preventing you from parrying!") return + if(length(override)) + var/datum/thing = override[1] + var/_method = override[thing] + if(_method == ITEM_PARRY) + using_item = thing + method = ITEM_PARRY + data = using_item.block_parry_data + else if(_method == UNARMED_PARRY) + method = UNARMED_PARRY + data = thing if(!using_item && !method && length(other_items)) using_item = other_items[1] method = ITEM_PARRY @@ -91,7 +102,7 @@ */ /mob/living/proc/find_backup_parry_item() for(var/obj/item/I in held_items - get_active_held_item()) - if(I.can_active_parry()) + if(I.can_active_parry(src)) return I /** @@ -228,7 +239,7 @@ var/efficiency = data.get_parry_efficiency(attack_type, get_parry_time()) switch(parrying) if(ITEM_PARRY) - if(!active_parry_item.can_active_parry()) + if(!active_parry_item.can_active_parry(src)) return BLOCK_NONE . = active_parry_item.on_active_parry(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, efficiency, get_parry_time()) if(UNARMED_PARRY) @@ -240,6 +251,18 @@ if(efficiency <= 0) // Do not allow automatically handled/standardized parries that increase damage for now. return . |= BLOCK_SHOULD_PARTIAL_MITIGATE + if(efficiency >= data.parry_efficiency_perfect) + . |= data.perfect_parry_block_return_flags + if(data.perfect_parry_block_return_list) + return_list |= data.perfect_parry_block_return_list + else if(efficiency >= data.parry_efficiency_considered_successful) + . |= data.imperfect_parry_block_return_flags + if(data.imperfect_parry_block_return_list) + return_list |= data.imperfect_parry_block_return_list + else + . |= data.failed_parry_block_return_flags + if(data.failed_parry_block_return_list) + return_list |= data.failed_parry_block_return_list if(isnull(return_list[BLOCK_RETURN_MITIGATION_PERCENT])) // if one of the on_active_parry procs overrode. We don't have to worry about interference since parries are the first thing checked in the [do_run_block()] sequence. return_list[BLOCK_RETURN_MITIGATION_PERCENT] = clamp(efficiency, 0, 100) // do not allow > 100% or < 0% for now. if((return_list[BLOCK_RETURN_MITIGATION_PERCENT] >= 100) || (damage <= 0)) diff --git a/code/modules/mob/living/living_blocking_parrying.dm b/code/modules/mob/living/living_blocking_parrying.dm index e290956873..9e974177e5 100644 --- a/code/modules/mob/living/living_blocking_parrying.dm +++ b/code/modules/mob/living/living_blocking_parrying.dm @@ -157,6 +157,16 @@ GLOBAL_LIST_EMPTY(block_parry_data) /// Parry cooldown post-parry if failed. This is ADDED to parry_cooldown!!! var/parry_failed_cooldown_duration = 0 SECONDS + // Advanced + /// Flags added to return value + var/perfect_parry_block_return_flags = NONE + var/imperfect_parry_block_return_flags = NONE + var/failed_parry_block_return_flags = NONE + /// List appended to block return + var/perfect_parry_block_return_list + var/imperfect_parry_block_return_list + var/failed_parry_block_return_list + /** * Quirky proc to get average of flags in list that are in attack_type because why is attack_type a flag. */ diff --git a/code/modules/uplink/uplink_items/uplink_clothing.dm b/code/modules/uplink/uplink_items/uplink_clothing.dm index 6163e5722a..1ea13263ee 100644 --- a/code/modules/uplink/uplink_items/uplink_clothing.dm +++ b/code/modules/uplink/uplink_items/uplink_clothing.dm @@ -104,3 +104,9 @@ desc = "An eyepatch that connects itself to your eye socket, enhancing your shooting to an impossible degree, allowing your bullets to ricochet far more often than usual." item = /obj/item/clothing/glasses/eyepatch/syndicate cost = 8 + +/datum/uplink_item/device_tools/ablative_armwraps + name = "Ablative Armwraps" + desc = "A pair of highly reinforced armwraps allowing the user to parry almost anything. Fully reflects projectiles, no downsides to failing, but is very hard to parry melee with." + cost = 12 + item = /obj/item/clothing/gloves/fingerless/ablative diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi index b95c377e121b32ddffd5c6a2fe9821d544148fd7..406b0fe62a4d140b3a902ce286f0c88619c86f91 100644 GIT binary patch literal 12593 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 AfB*mh literal 12464 zcmb_@2{fDQy1&-Z?$WY%2a2M*H55fl%_5!DP^C4`+L{Gv%_5NwTb)+XQq-8%EJ$h| zLbSCjrG}b^h*VXOh>!@9ApcL#zGt2PUF+Vv&Ry49$@jhUo9FpG@B2)i-n243BrGK? zARuta-0Z52fWV$_z~}uh`+yo)G_DXRJcijhg1a`q1|LUdHDOz9N<|L?nOTV>w zoAwr5eXOhN(DLFko}qIfBJ?p4v`+f-a49V2Ou7p0gL}X*{Cns~)TPR%4|`-*FSv0&e4=>8 z$<+M)ALq|?_*m^tc#-$Q=dhyX=gO$anun5+N?qPJB99z4>)QuC{yAUfx4q`$cM1;d zIjHkzro7d2jq3OhH9iwH%Ylm|@KwXqsZ=z&Vpwf;JGZ0yC3PFr-spmEq|x^t03h=3 z{XJ0D*42e-bq2-Gr8_q4zSkO3(j7e}e4kf?6dhTlwI8Mw@A~ar#z!S&fblBx4h!!` zz953yDy}x9Ao}q?>xf>V+TdCo zdQLyzoXsdv0&6N&fM9qqj3Q}Ws|!s%pQlNVsT+m!UY1o&lH=q9@htx;pfX2SxiGFK z4{UF}NHy#|Xc_Uoy3n-Vw^wRpcz9gJ$=0?|8#1~uK2T`I{X7BJfH8-{dp5p1JuDa~ ztMV!wC{s^9)`Q*(&t3bW)IOg>C$|U9#}1^Sw(=Rv+jkI4PaYd!{l`aF=Z_ttdFh@Q zUf!N@ehGHA9+;eb4iPFf_~z|bx-Mr_R;c6ot)a>?oqd*DF0gqLT&JiYqypx7a07rUZ-ym5V9ou#wkOS9KzdX<>v z5FsWrD5+}%t_xB)d|)=>C!(MY{m2FYU>9;c_%2;`W-70SRTkeQ(d?_dzo)_!>WL?` zoU4RV_qqL;zdnh&v*QiQv*B_^EIMgDU4dhGo>Y1_kArcmpS&u}I+k>-f^LSJj^3_U zhG2m@yZ)-1j)VaAn&`MxTJP2yBE`lgahL1nh^!1lT->dfDk`e>cUYS-tD9Nv8*4t( z)&RwJdDgE>oCgy*9&0~J7hglMMNLJIb&_wW;XS&eUZWWIccKNQoLA&yK^*1!P0>v| zu#~EU$-s#KOwm}WF&-B3>GNtT3`Pty2EVw2q#8uu?B}0L4ahRDmjh!us;U~2K~t0H z^;v?SeVl>SPr&|Ty~S2X557&()SmWnf5xVSv}v+N9@8w=D!}{x{Z#PEvK}}uwGMQ{ zdVlcx;&x?9-(r%7BsbFNTV1g4Y*h3?EPp9_J10B4=aYnI<>UQgXdKQJ zy!k<_q_XY)>@{0EyQ0ZSmo_f70=C>d@3uRz92N+H7*@pD+NP}^5riu@H;NR7@l~!Oq$vvGbYztqX+pR`k3>S%H7D-?q0QvLIjHgC8Ef?Keh4 ze*g2p$ml4#sOZnpRRskFbXC>J(<4g0CIGzc9UXZYcN_y(*${k{60a^Y?x9M@9an@KAC}uq|KZLYW*ys9tJxoWF-KI zp#EKR{2|A{jhs!jLc#E9r`>zM+?h`f;UL#+hP{4;}YER_!@LsW@UmKd>dTL zuF8%1`2bq!D>EI`rKP%vAV0rSQ8{Cy3g(bLeDmGpxNAEXJ=;{Eh+)>$Nr%No{ya$QSAYk5Mjs5&l$}&#Cp8cn*Tq;W{A@SpgNr! zeMpoFl--$gWtiD)e0zbfF6~&a=YALov(!6&^ODC!6s&rLt-UjSEM4*N!7?TNN)3iV z2(GUxLc!NL=4yh~h9Q+`udP?=v%tPe(C3O+*FPrnUWf0&v#7@? zsP^b8&Xx?V7oc6e{n{?=`pMPPTPz8zc9cikM;4&cl!mjnKj&7i=Q(0mg7GwsGEM$! zwh5(>CY}RvAOw%#eIuse;iS7PIjpnysOQb}Ti}U46#74gaYfMZ90mqi^ZfiL%7%tS zwmaW@0!{a|#87bMjGszFHpAZMypUi<^132B=Lm@Vwe_xRz2m3Lj3v-S#c9xE1O0P9 z48Y=|=%AC)zN_`PvMCqGyDj??)*?6F^gIYRdAhAD7CCHxv;tpZry6L{PhEV*Nym`y zjjw*A>QjJsFMK4#{i*XUTQoP@X2kxeAx3{r<{qufcvoP%?~OZr=)UI!nU^SId!uH3 zmn_(J_ov;+noDRsC%f@V z_cU@ao1UI8eIf#PGG&KJ{8?dFujSY!a-L-E_hwZ80&u61HpbgoMp`}vMqmmt?S#$1 z&HQJNGWI1r?`F~Iflu}#^)QC#ilVFAXzS64t~+$S5qjX#w|4`?wkwmPVJ_{G;f`Ld z!wt*t-`xt=vxYqS}Vx*4ic){vB zM#a}Kh&+R7Kj=gK>9JCGo&lYLYk+u`PKwE_g8WqI3CWwrWWiuT>WPM^hl~@lgAaB5 zT(33fqxv2;>|vjvtpJ@s1cO~hf_as3{LrhEEPheOLPSHS(MFmaO0u?MktvzSC@Gzf zV|w*#*(!FkyzqwH7CVn$zcQWPhPc?x_%HF$&+KGG(JH?VPAAJca_9*2W8%&&l?B7A z<2TcJ-zyP&nMwW2FEO@Ul(`IlW8KN6@}o%fN6i3ZF9Cz0s&6{ zx)_%ytZ+>A7Zs_snIj}X4EG6ywT}9G-kri#ry+c2l#c;nB zu!EU7Q5)c#q%r>k5G6l$H~^_xW0F~B81Q1wo{KX6x9_|EVn9iv_JnTX7^2%Ob&+Ae z5tecTw&Y)oZ0PzMv!muR$6yr<_KS6E*}AA#FoTzk*k+9dj~(!gDOA>D>{Uo?Cp#Oz5w%(Tnm#9? zJL-LEf>ec7nP zNH9b4A(n&(!{Evp39INqVgjb&xjb9Uj6ZlcXsmUyFr%wK^YW#|YPEGj@fVFVFSxv7 zKUAaVe2sR-)Bf~i)VVgAP38ghB7v27Z2YY1{(=#yM`myYpw0K2m zM}$gX3(0;bS}4;4@?={7jJdD_p}$pMQVl+rl<$2*(f!(5i*?rR2)EP=YkilFxxs=v z5r1R6_A7t{+Sz%Q7krva?iBw+#IEU$W&HK-bbe+826lkt4#|i+sW@aQ!ZS z)8W!ZiMTqK7~OvM5A6e$%Gy-fRN=kCujWxPVVacJG&BOaJ>;`H@!mO(&83S}S*b zB^3Wj{d)-M*8%$jQJh)#)^1HDD>D$t#(Y(7I`?^o%bRWBl)vKWT2d5U)ObYc8jOt- zi}v~`)D%4u7>~Bl4zIa^NQkRgF>xfqZgpgOLb>G0(wQ`ZPkbsyTGj1l#mvsMRw9=4 zX_r90WsTSKG}=mL^3{bZ`XWeI4CXT7H$O#4py9m=e(a-=CQEx1?->-lwflIg?WRM4 z%&0;y%t6#87Z+2-U>V0;oGO`47dr^t^r^ApR#nxY-Y?vH#gbe^iluA&-Og>AXWPlj zBT%tiXE6;hMRVqBS83R4P^-3xJ>@jRk#pl7$D&8!$7N+8%MPN&d z8ZrUE9>r#9Q6Rvu-WD*%!8@S&*;sG-$O_PnXoNs`t{{Z+qNSGE5lR;=|-8Jg3xMwL+CPgRZ9tKiZ?s*TON%xG%>iIT~`|y1PVvoO*_sn6`qU(~f+l4_$iL+2gi+{CU<5|xR z!7G|R>*`d81u?MAmq4}nzNbyyx`G`rznl(N)bRL+J6VO>22Hi5zPHEilUAR2>fKQW zpFAX5Q7}BX_38IsXICAaMx@hq?3n@IurB-jKay)E+(JhNRV}=^gg(E%NzGo*6E-I0 z3Wr3mbM{y_yy5YR+Y-3PP)F=Em5)upB_A`U&$h2u$mUU{246gJn-deY$SW-lgXEGB z*KIVF^NbYggJ?rU0%@Zj}IJ?oAur=$2-{4z;AyspgbSbBQ4L<-R$&cg`vtlPpQ@tLm)UIKK( z7Z8jn{-yFVr~3(o!(-@18KVk;k)n}s)*qNs>BxI+!hKcub@VjK zT4N;2%I;(_pDE@Rc*XeG*L*aQ3X-#9+F@alDTv3nliJmT2Un=b_u zhpO^or|6GbIlQ9v6ANkS^KkgNGkLMe!$YWHhG-KxUQ*-mOD3!Ml2#Ea1XS!8b?7-K z?#!8O%KHb*%vN@Z-&;nvCv!BXUH{yhuT7cXN8AOui=(zu7p`>o%PkH-=!6v7s+wz% z8Z`wvaThRejRDgjtE@C5L);V^R|5Y<)lGWrTlHy!dY{_Dgf~p#!Wv;=8IVyr#_CiJx=5DY)1{-%e(djEyKo>znyD!~rXA_-S`5s*!p30z4%X z_6wT+x^{o8x~o^#JtvjVQR^#qEe6F3gXLC!oDezLFq>Gob-7w-yW9hd%rpaQ8{c{9 z|Kk4sUsk`qdFti4Mf@mmcPGWdi#5uHig!x0n!RloX0J8g`h$#U+K0eX|Q%KX||{J zfXyi8T@G|5GRRo_UwX`s!R4HG4%Jo-yxyOI>@Y$MKpFzUz_;&OlUu)-_uw1(-b8}^ zE$4FoTenJz6&qk}?Sy$)T!ZEkvpJLh4%0iZio`Q@YgNE9r65ih!vn+SY`XRLJ3MiZ z+o&;yXJQF{TI7MfQ-gzdllYUft_@BAGz^tzdsaJ!4AsY&rML!HWA<9&W9=b>zlw3} zwJ!m(nGnv9J5jA2W^gw+XY_t^1`1)-fV8zC7S#R@meBr-%|Vl|C}Z(IyXo9j*G>9l}HN)p=x2&E*~*3f0>(=3i<|suCj?pPr;dHkFPhFqn-ybcMe2AXEK9|N3$HEvo^6GH51UuXI>D^M+jjkU0Tj^e&%gCUc!(YM;7fAVp~gUpNkD*% z$5^%LcQVOsKc+Y+f1bXp4e@K-a3p|+)JgHYLw~soc7>)lEwymc+JXYnwT~U#b?Q-f z9kFA*g2o=kM_B}8=n}TNNT!JyCwgvX_KE4*N>*LzAtCw=&IOq2EN<3V0|ibJ%*uYyR|mzgGN%s zvDpKh#X6nJ0j^y8!u8`F_Pv4n74BuD=pES?!`-dC!$Vle2G!_{+137arz?AVOe@QmGW8 z@>zumDZtGX0<(}mTvA;8DRT_$PPd#l1iS=L&-T==-%XPg)2>kIw5SW6PdBHUlVh2- zn)*e+8-BQNozou~XTT^PYkzyL=&Jk=f6G&c4QemOyo5%rre703sligBb}j0!0>_e? zs_M@Z3{0vgg%XEeiM*3PbV$rlg}N54TXMQXy*;+;=WM&DYHg-W+hZ<+4r@6EU0@ zsX6m2RZJpq7}I| z+1|wOMP+2m!9Nm(sQXdBWVLgKY+SV&IF6R$g|T{Li2i|aYOf~i$w0tb}OV70ow|X z8M@N2ysi#~eV%No2=3Xm3_^OP9Vzj|uTthi=G4Wi4~+--?T-yUx(V7voN|w?MMi!aF#q?eI0>7JiB^oz%umo zOS3vG)*8ArKIfl16h}80G2|?N*B*15ZK41qrmAb!R|PpzqcxT&dM~gA(L%` zDB-R%MfL2XYQnzH`*kb^lB4YNSGl>R&zs*t8}T^jI&znx%hCCgs-be9!ewd%dWVnhOmOg=nke7^fz;SC8P_DIAfQtSA%^n(ri-HvPU^QqUwXOd+hgJE|! zjGE5_iV%xFBAu)yu{|7*#1&!Iq8j~@>9CEaD2Zp`gqDR5+FP&;#*#% z5)trN_GS1(9Wyl3V8ag_GfXv@zzX7!lm$O32De-TgesQI#S+BiM%|-Gb7%PPmr>5{ zO1vTU)GVpCUt)i!S+AaoDwcgT8DUT`-JrfbhLp@^&d=d1n3i`U>{Oq{u2J!KcJCWN zCEu02*1p`z204~Y?He5n*j1atqB3LEMRKKrA6X1l{|oZ+X_0UHq$~vlM5lIh0XpTq zg4idwU8#`Bz~`N_zEwIiGa)ndg1Od2=mO)EGH=7)+x{=0d&qi=0!8 zAkJyd|CrZrdAG~gnAqE9WL^vf?D>~}^E~-{Vp6Y(PtV=+p{*rSvv2xd)pxEfy@3)y z#WA)8!z65yuBxO@J8s-1<1DsMw?;`x{iHx>e;Ll47?nE9a3h`F=hYC_2=Ts@^L=@_ zQb<#KxzYISAA`<`xbvEEXYqbM?Ku#&0Y?J+2Ny0V5c+DU|5)4R(&*BF-*e6%`mBCg zL}wpz-<)r5;vi3&)d~ug?MVvYaF67rFxbH<+-=tM!-2P?%+?<_jV=@RO z>b(2HrdvG%JQ&{})U2%2ix6$-d2v!c+`?q}pw}q1>zJ>LdTkzO;ym5TT%ya3z0H0d9Hi`Q8 zzyGny6pdynN)9Qr@=PJUjdD*X(LB0o0mU$7RBA}MHYQDzszBt}vR`5Fa#?93K>Qou zCn4ag3iv-17QbIVGHPoLD#k6hd|{$XGS;&v!7@mXfp^A{9hd0Sj9yYS zU@Xv-U0i9dPuvG4UC8qy0<|yw05zdsg8XV8d3@k)NNklXRdj(Pcg+_F4Fgf*0?gz6 z2q4Bb_Te$Uf2?)QREydNGvMY0%*!8XHx7ke>y7xUWG$^#NHG}V3jO<}{2xZtFao@K zy!rW%l0tG;q?P9VSdaXeGe>m}9XeD}QqnnU1PKfTPU*+Hb&d0LKH(uD{a>^aB{X#G z?d?m@=x&Fq;cB4Rrw0T<8_vK=u;CmJKPv|ywyXAxt4UUpMUEShwh*j8XT^wU`r772 zUwUs`xk!&?^H)pLb}f2tQ$&@IbJ}(+CM!A4Z&JU@4t}oeo?hkPpp7dbGb2Oggs7_V z@g6w5aDeC{p*R)?)nTLQ1J6CWr^&?g{YFe zG|S#P6#M7v5nY?a8>XfS1_lN}N#-)NPmfl_d_GwyrU~!MQ=@#ieY4BkhJTY1G!uFE z)9uge`m44;XNQ9@{9Zc7|-R`mEv z-<7xT=ydWcG+Kpq^UP8gqw}h3o9N9%Ya`Npns%;4<({3vTZMhUg&|H72n^7X;( z5%9y&LnY0h5sKPlCpnD8?Xm8<$md(zvEV3UVUX85 zh}V*-*xdxYy)t>C{S{$RB{SV4S?hU{ct}8xxDltWTK}y`{0c4v=cd?RX1Ds97k@i^ z2PAzrnaP;=^@|=-)92+K!q0q)y;ju%g8B;$U-=X9iTl2q(7Vf8YoncaRdQ!a3Apploj}Egnyz~= zko$w?uXs)cRP1yh@0XSWnlU-RI%SIQOb#6yS%=`u4Zm7O-`}5GwYAz-w38e3+j=Z7 zrsnyoYrjViZ->L`o!lUY7`Lusd$w8gL@uWVxdUg-Bq4o9@%+etO@12V7z1e5()$YC zx1TF>%qnTs>pXmSZ!=e*2FqR6j|I0WD{pl{?Z1G5eqozmb9{-m)&^)CyX&M-C(`cEwMq3yiI~HJ=b$=(B;_JvU%+As3vo2*h z^4#-|fQ$R0=CSLsE*r7n%(->UGJpt&lBhcqeb!_B3*fM)o^1%$ln@oc3*NrV@NgyY zfp0c`y8$1w{K)ww!^Ao+JDIarpynGuVHvV>^IzFcb{O{m1)c>SIDhVr1ZMit0_2}* zaml(t<1bdZl09_-0=L&C+rH^J2Tdh^sox4$cdosby2c!>${!Yqwhp*-69+RZVn40%wl+5k@%c^aiI54Z34x*A%EC6+TU!T;1qj}U0z)5 z(>)0!QCo2o52*nX>)dL5leqi$gT8py z2c{Ro+r`O;q;;IiInEjB4N5pfiDiobAK!K}H5|%(Bfp5#5e_ke*`=<{-L4|ZhUx%{ zO*w;?1Y1C2QUz`()Ue&d|`dCL7? zQF3w4ZK)m%YK{GhMC?YO{RK35jL4N^sdv@2SN=@PEAhg6ZcSQ|wqD+KCE%MG4|X=R zO8?4}0&Hwjv`HdnYxdprj{U`i7C{*N%di*5@&c{3;7(pG+zHGBBLV}mnt{7|jR*q4 zjCwcP0Htj`TgWy1L+an5tR#CoJrDnU#JV$L;fkD%W>$}0dwsoqaBy&PXLxwHcdnsi zDb!3el)uHH?8^MGsjm*e>)KmnWiZcq{9c85FpjJL&zcD!6ONd2Rc2&o{q!wBPxzOt z72?!XP$zhsM)-$u{Xg8X|6TKn$NGUTZ(PDFH>!}p3!l|!_^7%to6T0tq)4O?ZU9zD z-MABQAdhiP)@3CSxvT?dK zdTR9b=%@qj9;70s>D|o|$4+x{!5zy;AM~oE_)n zlibE_`Idwxw=dR8hecHni^jU^c*U*N7nfWkyVQLi*q!luDrGv-m64Gx_?l^qC|I3Eq;ijbgo2GvAS?%*5=P`w`$4Sx;%ICKH-iK&VJ=FG1^dU9AtUX$u z+awhEl^7yhpKxI$60w38x}wg)7n(*yL9tR)S}jTVoR^-<0|HdL6z}VNT6ez<lfq z9wvXn7?Klq3J}%kwoM;Ha53OmqAt>;)6&(+nfIh)KnO&BNMedd&%c7!!_<>g(8nnwVUTw?=%cx%G4U+U0@6px1TfeXMq zuGcfl-r@oGu%16;YF1lY3Z#CdkhZo(=I22DdJv{5$&&MP9ZtI#5>G6TWq7C=MOb92 zJG}uw<4k-q?dIgK?*8tgh;^RL#&p}WPj~gJ)kJ%a<_BLQsHn86Xg?u->Zve!S5RY< z;OZ)qq(3!DrJXX85oxvc*a&yuDid#Lthmqcr~<{gp~T{Yl6delMfE_a=uum2{kt~z z`-=28WvSyQhM@)qYhTOAI0SD!CR;l_K}BUPCt38+ zK~WX((ZNBdAQ#rdtiCjQ!SHCE9I?M#%}U8N=bssjrr>g1+hn0B`&t~{Dp&8${G~HT zQV8}Q9+-4NK?5h-!sKL8M`FR33^gr4H??9NOCcmlaE^>*6t%P%>=FU2ALlkVH|Iy? zUpT6XYz{An65j)4@(rhRxv(%GZ?6hlIh<2m>^Ci-hq!%6;KdbLZ25Vh2W2%|3RtRF zM|&~`J>~EHn@%C&%cr!jvn=|s8F0ksNDa-!e&^D#x~tJsTNjQRu>5oy;WQeJuyz<2 z#vb$R7r!9T;|)F(-$VI$nH7B_iSv1|*mt7Fhf@0XYmvl;bx$5dJ}c#{y8&!Qn-NEP zIs7rJyOHI*Y<=bT+MtOVEl!SzNa@mqP;K+OuSGla5)&Q|Z27h?qQHs1t3nSZPO=}| z3j8f6@Hb1fy7DR)T@glfIX`*4ufwW*$7Y+$eqa|k&>O!$KeSvz;C-x{4$5-(pAG*1 ezZC+1zj}q0&icoAz}gZJFgLNfin)CI(f^BNo^%ihI+jut}8ZE-;ud)e|8`Uno&&G zo(h$B@VerKc14oF-426N)?Vsn|JbJ@%nD??y&9K|#4g~6jmT`Dvfij9Crg6p2)y2? zq@EZ1q&s!C&`2erFgCj>t3XMPPRGGC^CGijw4AB&Bt?Kq@5o2XFw~7b<%_a37#!pG z37cjbZl&Pdkf~6><+KGjpL21Q{Rf@;(@^%WR*K_wDbGnS;P}FSmv%UcuKmrnav)Vzq z2!DTU6XzMnzjl-#Q;+N#CD=_4S8g19R3SlON@+m|rp=Q`1vFA=*FQ2T1u8Nr6#n23 zHYuWm{xPlTKvNJ311U_aGHH(Z;r*~WmOm&BC{)Est4kA+l_t(P1Zpv_VL|e{KkWB< zcFyNZY@@=Sj}$3-@4ffzDBtIK-sgGlPJdV-V3o^bJ3sITYDYmsw&=jxA&2VfhYOu>egspKN^kV*8~4}WMZVJ2N8wDet&T{ za3HlS_Vo@wnw!g)yjI=~04H1du+U^H9}>i4&AAt_(Z4U}W%9ZOAPAzcoH}*N_M5w} zV`8ox^Z)r;`)O`2U)B?W$V(E$V@UdQ0hS|vf*=TjAP9mW2!bF8f*=TjAf9CMRyqg- z0x4yQmX?-BT9)v7y(!lp8ylmt2!BCjAul2c1Olv~A@vEWp-||N83C`?%bZSU%9yIE zWCREz3puv}bMdDOkRL0w5#ZvltgJLT%*Y53L}qdlhne_+gcmMkB#=e?n46n>Vj=-q zmbER8q9~93_aVL;EIR_oCjLT`P5e(1vMjTO);(DD(FH!l05Swb?kwwOAb%^KzmVSF zis#RV_ZLNxAt5&YV+Cz~^8B3O;$LVxh_5zoMFY*` zzjx6biUNpSup9w!ub)Z$dVjCaD+1}I!Cc^8Ka=?NUY~!y^wOYJL{Vg(!9mJq(wgZ4+L_iQrA)^7{!sUWCgL{6XxqNJ?B|$EHE@(5j=QoH;D7f{C)(Kq({mc}02`f7ys4^)m6qbr*cf&_^_101riA>!7#fbA zMCh0MunWL1jvN61obKt-#82Trkt>G(K!HGjSrI;9F8*|a!Jwr`!0YugE5ZlN#h=dT z=%}SgfQRgD_Y?12pRTDv&Ga<<)zz4qn#y>-BuT6_9M6Xw>w&vMjT! zLqnKO<}Y^i1<-NeAbQ^K#>s6jVr%mc&_6JM(>*U&Qx3(6g4hLQ?DuN&w zyiwGIpG}0}c7M5WzO6+Q|M8-4-@uzLex5III2>>|99U@GlVS`A!i*FHz{Sr6Yn4oM z`8rOg6QNKjs}bPh=Yq9Lrn!8b%F0Tps%psyh@!{@K|pIbjB_p*-k6y|Y0{g=VzG># zJQ|JKc*US}dKz!c%;22Mh1PHwf*@E*1pesCCm8Z=!hhz=LvXuXIMOJgPO3rY{MUHy zRx!G6P8pt8x4s#XNCaPP+>V8|gJc8<%V-8bFaA&{1gFz!Y6$doeqQ$D*W1q}Lk){c-(gG1||os*2Ik zQEjeX_}r*v%LA+}Dnh%eVqH9raY-_pnvroy!hgDW9PO%#wM9i)=PQb06Lzk_tY<6w z2L|AFyJ0IS)sC0=dvUC*YtjCmhy6ez5-9QaqV}yVTGybyq(~6yXjOogmKGbY^{4Oc z_02t2T7UUke7?`;LogUb`W=IMlA>fzr*qNXUfmuA_PIeTDu)1_wS>kq5_CSux`Z)T#3aXiegqH0DygX;e7g-;au6@ zt2GSmPL>KkaCz~k#?@#zdJ^Z`S~LSeMu12s#Q>y>JX1fv(LO#D3N4z;*Rv{oy??M&fa_hQl~9HDzm;Bz9(E z0-rh@T5GWxOA)DN1d^SBuf6gLR$d=Q!_kxIIB*a<-tWd=+W@q+pytq+b7Wa&=lc8E!omXE_VK6e?^mv}=MKNe zMihm`zWIhVUAoNfMWd7tAc%ChaD&Cgi^P!>aaJRs7e9a$@pHI=DU<yCIdjEK<@@jvj5Hud=DQk3XRL`i9eB|D7H*BeSPl$ z53l)odVCKb+VDa;oDaHLT}NnbbK?%0R!o*qK+blUBY%-br8VmsE=m2!iSt)vugw;TNf1DN$} zg|KrCwFwg`kO9z?(TFp#`w;zT@dGxF>}!sDNa$GNy{!^6Wk5sw49tw5m- zf}$w4bb(J!PU6~)Pe}ZPAvr%3^hx1()ic}qvRc@({49S0-AaFy@`i~6eIyi5JVm@E76&WUw?ikBT%UF tA3+d#B$H6BiZ|1_Bz}S*2;w`%{{X3C}r)XuJ(_8D#ENlw%e+4T1o5ze%gr4_9^R?N^-I!h>pPP zl}hS)u}`{DXA6x~5(;Cpo3aX&_x7ba5NQ_kyr(^ z+NA6Bn8%BcTM?0tB7KZL{EvHJiSC4Df?nm=v;03ZNKv&aDzKmrf0v)@6v z2!Bs#99100zdK9VNT+ccw(K-{-4c>^W7)FLf>Ee3V+W&|02r&lrj6@E`I;*XPivG+f*@}`sC|S z`xEVW>8-az-<&^(z552Ry0VJJ#W~E}zlC=$f7jIOi{>B_KhaG3``)v}zgZd{0f;2u z!RHQJUf(oLoIC&7mWV+l`S$L8%JTZ9QVH*0`(?|-NN*1!nu+qm8^EdhuGr%zCx03=5ClOG1VIo4K@bE%5CrjmreURnOeRxTmKYfs+0wE^ zB9W-O{`B-Tl|=}`hlYqGlgaRbfq(ips2YZ`Wkw*8NN`=(>yDYGNk)JmeAsj=un@mp zfZ|-Ujern;G#Yg}&B+K5ggcuOhnM()suyl%B;X@{6pKZQ1PH=|4L=LuC;n#RCw_t; z{MnFa4C48L=H&r`cz$sooALgdrtwm#Bp(X0mX(auG!3OviJ}jpWm#7aK!0TVgM|G+ z<0}Co(;p=42R2s;c;Uzqes5;R`rBp*Jkc}_0HCTWh6V@uuTxWG1c;U-@D@OLeK+x& zrfG>^R0Qm$!ObANzMJ@q#iAvCaewyGU{Ewo<9$<8xQTWg?&*Q5s$h%(0M|6lan0Is z&KQHLsyN)!gPUka-_#V`=6?{xqsBJ^2;%hxhG8I;N&$d1R?OdMG!Vq=3ry2QGMNMb zc`OIk9}WD(7#?Wt=qwg7u~2>4=`*Ykz2&0ooF&$WKNkK10DK+_;Z^NP+yw)Cew2bB z9u=+zKnPa|+6&?NoyLk|>n#Zi;R``~Aw0j+Sn1fhN`mEb8D|z2@PE;sJph0&bRA=S z)pO3%Sj8b-$LpqvawLK?)6;lm+qR&WB#14?Q4pC-h6fQo;4OYT*=#mYB#=lXco5+O z-r~2D%jE(^0wQF8ZMpiJ>vP@R=$@OyWLFpR`Mm3V#uy(h6s++8@MTB!J#CZ>BwCR* zIe=z}U*rc;sg!SCpnn6Z7+k)Vz7QTz2*3rBW$WuI=?Bb8|Q`KYx!a@i;~c1*ob@i9n(y zu?&DLe#0=J>$;~Qkh}au*-so7*o7~?J0XkTG)+XKQBOl4clpU{%H!?A7vF=h*xijC zv$MFYD7d|{;wgTCFaoz%R&ZHSuw!->i{0IUu164$g1QJm4(Vk>AfFewHTf8ZfowKw zjg^HzFficR9DgK-^s*t4&&&7Xw4XOk6S-W@8Y>H57&X5`x5J)I`a3 zU0<`emz#TnwEl{<#Q0<~iCiw{d+#FrKUFATEEdCXM}G&7-MNEfwew@XR|Y;Tm4I5) z(2x7~!y|;(+bX8w5H)KW4IcRZAqLrxY z1CTv8;D0WDr+vI(7;DCg^@0jt_S}HG_?`CgB3~ho73&3kCO}nHq-SO@7KuWCPL6XZ=N{-Y#4@gWssf ze1%v3_Tj^-_-nQPae%ig3bOn5pa@9*aT__!3w2(oQ$o@)>U@d(f~ zjbDg_9YvW|6posh(~9CKU?Kk6SOAc}*Kr{dCIdjU4D{om9;6k8UmqH(JN9xu?>N?e z{D1n;5ZsIaK@cs3hyZMY<iA%ug!{rwD*(B`5-@adGD^>~5>e%Y~$m z#bBl4IN#y;n)$oiLb$kdR|D>rAc%${_VG^1JAsq;m*;zh{NvS^g^>3rh*m|@G*^Lo ziC>=YW(2&}CJ3TMa1&}!@w&|=@e>3=5Em`QzdlI3z`%X6DF6Tf07*qoM6N<$f?(u3 AO#lD@ From 12145e06090f009b19a4d133df1d434aa1da7ac0 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 27 Dec 2020 10:15:52 -0800 Subject: [PATCH 2/6] no ops --- code/modules/uplink/uplink_items/uplink_clothing.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/uplink/uplink_items/uplink_clothing.dm b/code/modules/uplink/uplink_items/uplink_clothing.dm index 1ea13263ee..1bf080b75a 100644 --- a/code/modules/uplink/uplink_items/uplink_clothing.dm +++ b/code/modules/uplink/uplink_items/uplink_clothing.dm @@ -110,3 +110,4 @@ desc = "A pair of highly reinforced armwraps allowing the user to parry almost anything. Fully reflects projectiles, no downsides to failing, but is very hard to parry melee with." cost = 12 item = /obj/item/clothing/gloves/fingerless/ablative + exclude_modes = list(/datum/game_mode/nuclear) From 4da7a3867c4db6c9f220a6184345ad614b1e2ab6 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 27 Dec 2020 10:22:27 -0800 Subject: [PATCH 3/6] fix --- code/modules/clothing/gloves/miscellaneous.dm | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 4a1bb6f14e..f456530abd 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -171,7 +171,7 @@ var/wornonce = FALSE /obj/item/clothing/gloves/fingerless/ablative/proc/get_component_parry_data(datum/source, parrying_method, datum/parrying_item_mob_or_art, list/backup_items, list/override) - if(parrying_method && !(parrying_method == ITEM_PARRY)) + if(parrying_method && !(parrying_method == UNARMED_PARRY)) return override[src] = ITEM_PARRY @@ -187,16 +187,21 @@ UnregisterSignal(user, COMSIG_LIVING_ACTIVE_PARRY_START) wornonce = FALSE -/obj/item/clothing/goves/fingerless/ablative/can_active_parry(mob/user) +/obj/item/clothing/gloves/fingerless/ablative/can_active_parry(mob/user) var/mob/living/carbon/human/H = user if(!istype(H)) return FALSE return src == H.gloves +/obj/item/clothing/gloves/fingerless/ablative/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time) + . = ..() + if(parry_efficiency > 0) + owner.visible_message("[owner] deflects \the [object] with their armwraps!") + /datum/block_parry_data/ablative_armwraps parry_stamina_cost = 4 parry_attack_types = ATTACK_TYPE_UNARMED | ATTACK_TYPE_PROJECTILE | ATTACK_TYPE_TACKLE | ATTACK_TYPE_THROWN | ATTACK_TYPE_MELEE - parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK + parry_flags = NONE parry_time_windup = 0 parry_time_spindown = 0 From 8d981bfa822be37c62c26e26ab29b84f0c999d3d Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 27 Dec 2020 12:05:32 -0800 Subject: [PATCH 4/6] high cooldown on failure --- code/modules/clothing/gloves/miscellaneous.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index f456530abd..50247aee03 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -218,7 +218,7 @@ parry_efficiency_considered_successful = 0.01 parry_efficiency_to_counterattack = INFINITY // no auto counter parry_max_attacks = INFINITY - parry_failed_cooldown_duration = 1.5 SECONDS + parry_failed_cooldown_duration = 2.25 SECONDS parry_failed_stagger_duration = 0 parry_cooldown = 0 parry_failed_clickcd_duration = 0 From 1dfe6d36855f6c95a45350486c1f78d3428ce920 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Mon, 28 Dec 2020 12:59:05 -0700 Subject: [PATCH 5/6] Update miscellaneous.dm --- code/modules/clothing/gloves/miscellaneous.dm | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 50247aee03..33eaa8b402 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -219,15 +219,10 @@ parry_efficiency_to_counterattack = INFINITY // no auto counter parry_max_attacks = INFINITY parry_failed_cooldown_duration = 2.25 SECONDS - parry_failed_stagger_duration = 0 + parry_failed_stagger_duration = 2.25 SECONDS parry_cooldown = 0 parry_failed_clickcd_duration = 0 - perfect_parry_block_return_flags = BLOCK_SHOULD_REDIRECT | BLOCK_SUCCESS - perfect_parry_block_return_list = list( - BLOCK_RETURN_REDIRECT_METHOD = REDIRECT_METHOD_RETURN_TO_SENDER - ) - /obj/item/clothing/gloves/botanic_leather name = "botanist's leather gloves" desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin. They're also quite warm." From 83625305a23b87651f68a7188968e936f72c1673 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 20 Jan 2021 15:24:09 -0700 Subject: [PATCH 6/6] Update uplink_clothing.dm --- code/modules/uplink/uplink_items/uplink_clothing.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/uplink/uplink_items/uplink_clothing.dm b/code/modules/uplink/uplink_items/uplink_clothing.dm index 1bf080b75a..de15b16b68 100644 --- a/code/modules/uplink/uplink_items/uplink_clothing.dm +++ b/code/modules/uplink/uplink_items/uplink_clothing.dm @@ -108,6 +108,6 @@ /datum/uplink_item/device_tools/ablative_armwraps name = "Ablative Armwraps" desc = "A pair of highly reinforced armwraps allowing the user to parry almost anything. Fully reflects projectiles, no downsides to failing, but is very hard to parry melee with." - cost = 12 + cost = 6 item = /obj/item/clothing/gloves/fingerless/ablative exclude_modes = list(/datum/game_mode/nuclear)