From cf2b1b4d0be6aac52db84860010e663742141131 Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Sat, 1 Aug 2020 20:28:57 +0200 Subject: [PATCH 01/20] fixes, tweaks and brass claws Gives clockies a replica rabricator on roundstart, makes ratvarian spears able to parry (short parry cycle, short cooldown, timing is essence), adds brass claws to the code though they're not possible to acquire as of now. --- code/game/gamemodes/clock_cult/clock_cult.dm | 3 ++ .../clockcult/clock_items/clock_augments.dm | 30 ++++++++++++++++++ .../clock_items/clock_weapons/brass_claw.dm | 23 ++++++++++++++ .../clock_weapons/ratvarian_spear.dm | 14 ++++++++ .../mob/inhands/antag/clockwork_lefthand.dmi | Bin 2273 -> 2837 bytes .../mob/inhands/antag/clockwork_righthand.dmi | Bin 2790 -> 3264 bytes icons/obj/clockwork_objects.dmi | Bin 130473 -> 130941 bytes tgstation.dme | 2 ++ 8 files changed, 72 insertions(+) create mode 100644 code/modules/antagonists/clockcult/clock_items/clock_augments.dm create mode 100644 code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 154d2df563..406e142a25 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -213,6 +213,9 @@ Credit where due: var/list/slots = list("In your left pocket" = SLOT_L_STORE, "In your right pocket" = SLOT_R_STORE, "In your backpack" = SLOT_IN_BACKPACK) if(ishuman(L)) var/mob/living/carbon/human/H = L + var/obj/item/clockwork/replica_fabricator/F = new + if(H.equip_to_slot_or_del(F, SLOT_IN_BACKPACK)) + to_chat(H, "You have been equipped with a replica fabricator, an advanced tool that can convert objects like doors, tables or even coats into clockwork equivalents.") slot = H.equip_in_one_of_slots(S, slots) if(slot == "In your backpack") slot = "In your [H.back.name]" diff --git a/code/modules/antagonists/clockcult/clock_items/clock_augments.dm b/code/modules/antagonists/clockcult/clock_items/clock_augments.dm new file mode 100644 index 0000000000..9957840c44 --- /dev/null +++ b/code/modules/antagonists/clockcult/clock_items/clock_augments.dm @@ -0,0 +1,30 @@ +//This file is for snowflakey clock augmentations and clock-themed cybernetic implants. + +//The base clockie arm implant, which only clock cultist can use unless it is emagged. THIS SHOULD NEVER ACTUALLY EXIST +/obj/item/organ/cyberimp/arm/clockwork + name = "clock-themed arm-mounted implant" + var/clockwork_desc = "According to Ratvar, this really shouldn't exist. Tell Him about this immediately." + +/obj/item/organ/cyberimp/arm/clockwork/ui_action_click() + if(is_servant_of_ratvar(owner) || (obj_flags & EMAGGED)) //If you somehow manage to steal a clockie's implant AND have an emag AND manage to get it implanted for yourself, good on ya! + return ..() + to_chat(owner, "The implant refuses to activate..") + +/obj/item/organ/cyberimp/arm/clockwork/examine(mob/user) + if((is_servant_of_ratvar(user) || isobserver(user)) && clockwork_desc) + desc = clockwork_desc + . = ..() + desc = initial(desc) + +/obj/item/organ/cyberimp/arm/clockwork/emag_act() + if(obj_flags & EMAGGED) + return + obj_flags |= EMAGGED + to_chat(usr, "You swipe the emag on [src], hoping it'll achieve something..") + +//Brass claw implant. Holds the brass claw from brass_claw.dm and can extend / retract it at will. +/obj/item/organ/cyberimp/arm/clockwork/claw + name = "brass claw implant" + desc = "Yikes, the claw attached to this looks pretty darn sharp." + clockwork_desc = "This implant, when added to a servant's arm, allows them to extend and retract a claw at will. It will refuse to work for any non-servants." + contents = newlist(/obj/item/clockwork/brass_claw) diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm new file mode 100644 index 0000000000..e96ba62ac6 --- /dev/null +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm @@ -0,0 +1,23 @@ +//Brass claw, a armbladelike weapon used by an clock implant. Stealthy if retracted, very obvious if active. Simillar to an armblade strength-wise but has some funky stuff + +/obj/item/clockwork/brass_claw + name = "brass claw" + desc = "A highly sharp claw made out of brass." + clockwork_desc = "A incredibly sharp claw made out of brass. It is quite effective at crippling enemies, though incredibly obvious aswell." + icon_state = "brass_claw" //TODO + item_state = "brass_claw" //TODO + lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi' //TODO + righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi' //TODO + //item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL + w_class = WEIGHT_CLASS_HUGE + force = 15 //Doesn't generate vitality like the spear does / has somewhat less damage, but quite good at wounding and gets through armor pretty well. + throwforce = 0 //haha yes lets be safe about this + throw_range = 0 + throw_speed = 0 + armour_penetration = 20 + hitsound = 'sound/weapons/bladeslice.ogg' //POSSIBLY TODO + attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + sharpness = IS_SHARP + wound_bonus = 5 + bare_wound_bonus = 15 + total_mass = TOTAL_MASS_HAND_REPLACEMENT diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm index 527745b81a..22b0913b2f 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm @@ -12,6 +12,8 @@ attack_verb = list("stabbed", "poked", "slashed") hitsound = 'sound/weapons/bladeslice.ogg' w_class = WEIGHT_CLASS_BULKY + block_parry_data = /datum/block_parry_data/ratvarian_spear + item_flags = ITEM_CAN_PARRY var/bonus_burn = 5 /obj/item/clockwork/weapon/ratvarian_spear/ratvar_act() @@ -80,3 +82,15 @@ new /obj/effect/temp_visual/ratvar/spearbreak(T) action.weapon_reset(RATVARIAN_WEAPON_COOLDOWN) +//A very short, very effective parry that counts on you predicting when the enemy will attack. +/datum/block_parry_data/ratvarian_spear + parry_time_windup = 0 //Very good for predicting + parry_time_active = 3 //Very short + parry_time_spindown = 1 + parry_time_perfect = 2 + parry_efficiency_perfect = 110 //Very low leeway for counterattacks... + parry_efficiency_considered_successful = 0.8 + parry_efficiency_to_counterattack = 1 + parry_cooldown = 15 //But also very low cooldown.. + parry_failed_stagger_duration = 2 SECONDS //And relatively small penalties for failing. + parry_failed_clickcd_duration = 1 SECONDS diff --git a/icons/mob/inhands/antag/clockwork_lefthand.dmi b/icons/mob/inhands/antag/clockwork_lefthand.dmi index 88bd8ab7101eae62afa175e13db715c67e3652a4..ff8d6aafe48fc2d1d6ce718b37400e2f06216fe5 100644 GIT binary patch literal 2837 zcmaJ?cT|&E76(NX0UZcML4?7AG%>Iw2oelM3^;@yQHlZ*fdEQCYG9ZZ1(C3!3PK{v z2qZ!%1EEL}=~XfGl9g&gi2*`MDEr~rKjzGw-FMD=@7{Os`)>Qa`^8&ZnTsElJ1QU` zAda|hY76ZD24>?CVPI8=2^a#lzHs}SL8kYx9)aEug1iI#1q4E~6T89qrmJGHU&H65 zWd68sCNt{o7;k;Fs;NEmggf}I@|Z>Ql4@lxJTJ0;V^?!qH-G&Ax0ivT1H0XeR ztq-bB`jeMbt2sUX`^TN0eCK|gYG6`UDZf+KL$>QiGUsGstLmH2HA9IvhdS(A5uNQd zWmhsVZue9Q^AHmu0cTHs35`=ZXcSxG+}e!e&l2$hwU#} z>shIDQpM_<=cQ)77@6@-VX^)v>B@`#?OC#iBs9W~O5d1nDn_n*^KGR^uaS5q8mWg$ zEluJuno{d<(XfUC&7mqHtT_b_P8r9}6Eh>wyGGyPnbjMS^Vw`7 zmOYV!6aw=5xABknF+t@l{4?z>s}Oto)tZrS2JoqKUUqkxXIi6usl)!){bvjF-t z1i}c$rfly*XUoe&FMGmQzp{G>U_ud%^30@NkrPYPT#+kRoiLBxCda+wB9%|m!mXedZEmJB zbsT@>^xkA>$b~kyW(_X}=sRHTa#)GCAs=0C=G1No)^9alj_>wLSco<<7%s+dz*cFw zGWL??g^9SJl{+ayxk)FY%U|G-jR{auDpi4ssbL!C6o zM2lGZRxPogw{x8@Eo|D5N;oXgMWevxYZa9gS}OK+u#-!j!z#;8Yw&@n2~M8{;;FZD zMbvSc)_%ltrvO6;og-?$e-81)H3ggC@GA?hJu-dA?*@rOHRHI<0_1(9^#UlJg`kDi ztDItC>6;JUPsuKgakjs#$uE$Y19MY7&&KQt({+7Bw=|MI-@q)a2#KM;a^@en$*y%sUM#w6}b$I55D+967|8%?qm28*XF%L z$BpF=Jn~#?e}CCG=`RqZh#ol0)+IA8GSXv-gZ)YL0tf32x7AWt9H2SgyfG><;Kkkf2YqW6U+$F~woZ zBrYN&4RThJA+jCY;<(5qFE0!F;`*Q=(N0m@DG+rK=ddB6Q6;x%7z%3kL|OE_jGP=2 zqO-@z)rZ7JA7NQZ`LkLijdl{+ZDVKHr5CrwjJcE1TPe-=A_t!~fu`E7`hz|X3278v zvr8a?CJRI#$mMcpN>lG5enUM}a)adcSqLl=HLyiO*X!lQQb`Slgd30g>D zX5@`seY@1iT}DiN@EQ5i02K|K9lk<%VZhtl+i5+|qby%XExK>F4J(=MSX#}cN;45O z04y;=bwc10X^z{C6eol&^OJf48TInDeSB`qXF{0r;@`8n#tiz7 z5LEzo@J}ZG2U&2qR;zo3&lksV#$m0|29+s~&x%3D5XO@J9viVE>VUL&?0V{@v!tTo zuAF^ON<;k_X)Rd(oZnfC6Ulv!i^U^ZQt)hyd~9xF^8UgJ&QHw{o9qY-hZdzLx&pTQ?=zCVG&%@!mCcU9(HI3r>%$+FxVpnvOy4Nf U^R%UHV@JEKH)jcpP_l6?%CGBQZa z3_`XcOml4`WwMTCF!THN``zdM(evE%Jnws+bI$vm&pDs-KJS}iWog3CE5^&g!NG5O z-OvWmoj=xbZeX{W@#g_lPn4ZQsG(;FG#GX-6c!Z7!4XlE@j>O6F6EPnvpPD7TnhR^ z4$Y-fW1Q&IxazWV^40#e$CL_n9-hDTcV;FLuV^*T44`Gfum` zVW8#O8QY@1KF2uE=|gD`*Hi27=_@p?p`q5tF+1NcX+PGFFAkURjJX!?d$Yc#;mFj( zuHEFTXIL$WyD1; zuSf#GwYaz=uaf!)+BrCQCQJ>l*+mr5DG(p=PZFK$C1Nr>e!~$`CRWkc*RHCnKc-+_ z3Y0xz@#P*Dbj>z*Yj~+sC5yr1Dz`_pKaz0_3<_VtN5J^Y3q{@IY*3)q~SgQUl+9pa%4rQiOz*_GU*W2tb$-Ns;A)|l@>YcB=QAlZ)8hiqW6G#e0 zd5cr|>zWoVn%RQL{F!?XSqqP6HMPdR4bt4gZrdSrI9-(>-MPhF|TY1?krU~y$I ztVkP59v3Zdu;dVijt_PW23SSx=h(5-&Y`Of4SCy@c7lqKUa=6cb5L(E-Du&pY(ibD zW_At{QmD!F9>48*y$9$_+1O>a?qFrK9wQ+W7F<(a%#NN{T5M+ICntxo;Ch0n^;Hfo zD(b;%f8Gq@g(EemFg!K*jm=mqfnsJI_*vczyMhhB|6uiPOF!NNsI&!2K1--_qzWPr zcZFi8zJ=DIG*`oggipf`du+Ebb>xA#E5{DOweL{ed#W}Zpra6br{2$>9OfBNG0xh- z^*wIYVvYElC~EgUflFi#1LwLEMJg281mVv4$^nb!b~!$^_k93o<`qRk2_X%2w0XP! zXP3B_7HnYb2-hc~_5;jkn{N!pn=0orbu69Hgeqqiie`@VXjFGK3-u=-Iro__I=V3e!KwiK&3tq-h zOh$i9+sR`rYY$gOm8~HiFU2kYei;~Sg^V$b)WHCCp)*$W&YUc< zZ!-mIzXn#YrIK_Gr6F2>66zEbRlX7rI=s-TFJg0V_CLc?)K2{4KKj$${Ga)Pld*oP z#RWu7QeUJ-cxr#02VFOajTs%uN6dR#&y78t7S6A- zf!s z?L&G%e=o|w?J!t>$2zF1Dhp8x`Zk|~CCa6mCqCk8V_#W#Wa+0r zS7V{(0(ir*bb391m@OXWG<}J&H|)Xv3i0X5L!n*D*WAMdYV5{cWr@= zY&(E2b~IQdeS*2-Z$+7dU8zWK_6)Mo&C1?yXj<1-%t-W2=BS9YumfA76J*uo6n*8Y zUqJL*Nme`_EF(GC0xwDu!CgdF{s;Q5)FOS!$Z%nkAraZImH)wVwPUj;#9L6HKxC+Y zZxfH0K%F3FI1^!+)(tY-B3pZ?;isw0rI9W|gr#$OR4-HUqe*{uB%*1396b>`!J8u% z*Bi2&cIUh`v3~wl4~Z*7}Nn4bXlaxU2g9@{#6rrFbf$O}@i9nz-eem20Q_lvR~Gg;BB2vk@<_ z@S5C$-)Pd<4h)bPw!90xEcrBZvI{a~GQnARY$T?dLIzllj+2@+OAYA->x(gc@&H)rft15} zhnOa9Op818`AheWX|d=xud{tjh&?8LkSk!PX`s;Jk^`yj>^YC7Q|1PsfMyL-Ta~>4 z=mYq~sYZ8!e~0`LDZTajf=h*_?2K1*cGL0m-nE)B|4&bTUkd?36d?Vm@?Jm&-r3po zm0&@dpepQj_T25Jtj9^hEzEDh26ZV&zo DMcHi3 diff --git a/icons/mob/inhands/antag/clockwork_righthand.dmi b/icons/mob/inhands/antag/clockwork_righthand.dmi index 20190e4adda3d55ac834baf1e00c8e15cd67a1ff..efc69e72613ba81552127cfa2ca9b12fa95cf958 100644 GIT binary patch literal 3264 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 D{3$M7 literal 2790 zcmb`JX;jn48pi)Y1w>gyq^Ll&Qdz4YvM<31vWP5-fMEw&Wh;wdfCSNqktMc(l|rDD zod`h%BTE9J7#E0ugis(vOB2oe&qHof=L{cz8@x2GRwelurgo;mM4Gw&I+kC&^m z(mo{s0F>R`oX^TQ_*YSsm(^$I5*1_^hWiC(I7g>PrNyUa#HSh?&Ze=}y#p z8ynO%W2i>p!(YFh1a+wOwAN`FwkG0k&YE|29$dRh6kk6%G70mI`&OP=A1`$Ng z%1bO)Eu6sZ&?j*>_9nz_1!+Q~K3(VBYEOk4KUnRE@>T5Qtr%I~hUR0lbfR-lsZUm(_=HilO?HrbhMQ|<4Ag!*x$s?~6Ffdnqe@fhYJqRO z2YrG+b`2%x;h%H68;7}=K4uHgxqV94y{}4VSxBLMl|FfA9mvkL|5}@MSP$`Id<30z(W<}uH803YgzxP+>t(`qMUSwR>GsX4w(1G1h_o2Pf zKfmG7ctitEorn06B_V-#mU28oAhmucw-bdRrx1g6qjO9`Tj2uJqCERSm~X2T1xch_WB}_iFZ$%`M?rTQmzb%-ir7j2 zZV;Af#k@zxOGPiTm6w8QA8uMpRy*}4xddM0`MgrP9LW0aF~`kR<=79IBGve^*_QLj z!}U{_EOt!WZ5|D!)OGpMED@Gi$3U`7jQ%gNXW^ceJ7>qaSTu6aqJYtBcD=%q8!ym^ zYwu5Ab>Wc`1M$RljgHclU#3HsW%#gR{6^dJlJV)xdlgw-rP7(x-a4WX9)DE3y>Pt3 z;zC$C3uywFGYu<@tD*P1tUgk_KU4j?uVz8$JBQbKE6r6?vfk!Gzeh}z!JQ8;_IO3a z*f)Me-&o*a68u%qvE=gY((8Y`C&l)RH<9lx#OBN9!i?GBxS7=@(m5-k#J;lRV1PA> zH4sMaRc#_?t@Y~uw1`ZUzgtVeMH-f>YSKUl%I#F`e_xR`WoDW|urxUJxC3dF1;2@t zj+3D&UK_Z&tr{EPubW~mT-7k5*s44qp8g>6_!+gOqiCK976bPuc`J@KXUq z<;-tpfZo0>PJat98Ymno3TFy;&9IDsB@8$>7Xr;WQ^mZTfJf#M^Q7D(SLpZ}w(FN* zy?IRPMAON^_l|3ag-knIRBxp^1M`j~i9kRKSdR=S68>d&-e4jvGIjud^p~zRv0}T+ zvRJVLvSnJ#SswVyb>lJ{>}GrbN0`o!YIQ=9qGL%auT%m#)J&r<;Z{#l{bA=x9AH<5j zZBn%D)6wE)zl9#_saJM<3Fd9!g|_;@Tg+I3ZUV%HJyK$nBSMOkw)6}cn&kOg%`A?s zVA#U~&p7|u?zPfKvkGsSc9k7ubkLy(5JV?OtcbPY@IcdG$TS~uT_y9YB3jJ3MqCvu zGKd-664MQ`swD~hzAuxmiRC^*XhEwfAt74I;k7_ZZXeKW|Q7wh~#27KNC8}9Lo9!c=rwXl|0pen!| z6npi{Lbkl(ngSFbBX_IDhaqP}Ck|Zt{%0$W#KByrnmy0xF38+!IHKt zIO45_i!*A6(yr{zul!10=liy~sBx|F*1+meoLr@+^?V_<^+%}E(c;4Z@R$1L#M`^r zS8;t=Gz-#o*w)ees!ysI&WkUrMY>E`YVj$t-+AP!6;l*3#!J~^_W|=-NCsNgC+~;&GSjptTXa}XsnRiYnK1zjo%E9 z?Obx-Yoahj0W6%{Ux`p&OUNNQ9+{z$DXDs}mKwQT3(tYuaXSI@KMtL3;Ri`-A8+95 z-UsO1N0lS_zgt)O}L**TsVkn0H?sdSJ~YhLNo{E#Yra&4kady&!?>1XF=7Ldj;{wjcWV z4!gJJZGU}PK3du>g@`3Bv-RhsPM O3b?y?Id?$A3;qNNDN7ar diff --git a/icons/obj/clockwork_objects.dmi b/icons/obj/clockwork_objects.dmi index ae919d85a452e477027eacb404e61a2d47c2f959..156d4fa0c668c4711f4a9442822f9fe2a7acbc47 100644 GIT binary patch delta 11907 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 Date: Sat, 1 Aug 2020 20:36:08 +0200 Subject: [PATCH 02/20] comments --- .../clockcult/clock_items/clock_weapons/brass_claw.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm index e96ba62ac6..952df5e7f9 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm @@ -4,10 +4,10 @@ name = "brass claw" desc = "A highly sharp claw made out of brass." clockwork_desc = "A incredibly sharp claw made out of brass. It is quite effective at crippling enemies, though incredibly obvious aswell." - icon_state = "brass_claw" //TODO - item_state = "brass_claw" //TODO - lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi' //TODO - righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi' //TODO + icon_state = "brass_claw" //Codersprite moment + item_state = "brass_claw" + lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi' + righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi' //item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE force = 15 //Doesn't generate vitality like the spear does / has somewhat less damage, but quite good at wounding and gets through armor pretty well. @@ -15,7 +15,7 @@ throw_range = 0 throw_speed = 0 armour_penetration = 20 - hitsound = 'sound/weapons/bladeslice.ogg' //POSSIBLY TODO + hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") sharpness = IS_SHARP wound_bonus = 5 From 7dab54e38f059f2e7093bc33c964f78b991aa352 Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Sat, 1 Aug 2020 22:15:38 +0200 Subject: [PATCH 03/20] butchering and smol edits --- .../clockcult/clock_items/clock_augments.dm | 2 +- .../clock_items/clock_weapons/brass_claw.dm | 4 ++++ .../mob/inhands/antag/clockwork_lefthand.dmi | Bin 2837 -> 2819 bytes .../mob/inhands/antag/clockwork_righthand.dmi | Bin 3264 -> 3255 bytes 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/antagonists/clockcult/clock_items/clock_augments.dm b/code/modules/antagonists/clockcult/clock_items/clock_augments.dm index 9957840c44..3709e5ee2b 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_augments.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_augments.dm @@ -26,5 +26,5 @@ /obj/item/organ/cyberimp/arm/clockwork/claw name = "brass claw implant" desc = "Yikes, the claw attached to this looks pretty darn sharp." - clockwork_desc = "This implant, when added to a servant's arm, allows them to extend and retract a claw at will. It will refuse to work for any non-servants." + clockwork_desc = "This implant, when added to a servant's arm, allows them to extend and retract a claw at will, though this is mildly painful to do. It will refuse to work for any non-servants." contents = newlist(/obj/item/clockwork/brass_claw) diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm index 952df5e7f9..cedc04c59e 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm @@ -21,3 +21,7 @@ wound_bonus = 5 bare_wound_bonus = 15 total_mass = TOTAL_MASS_HAND_REPLACEMENT + +/obj/item/clockwork/brass_claw/Initialize() + . = ..() + AddComponent(/datum/component/butchering, 60, 80) diff --git a/icons/mob/inhands/antag/clockwork_lefthand.dmi b/icons/mob/inhands/antag/clockwork_lefthand.dmi index ff8d6aafe48fc2d1d6ce718b37400e2f06216fe5..080d7fdc833d1e37fbd0a3ebb3fe9dcccb7d7f9e 100644 GIT binary patch delta 2467 zcmV;U30(G-7K0X${(lMYNkl-h{F;1Wbx3U3) zw4tR4+YPCCQ4qo6Q>b7X7j}KJPurKO&^G$ihow*!#4Zg%*;**K)o ziXbtYD($0qvPEv>7D7Kq7=QM4wuwkljtr)Z$N%@A%*(w9CSj16ZBYZ6W|jOGPjVjbRHCv#F@`5#w)X{C(4p$h%{r&JK3?YRuWe4*mExlK(eEkeE$HrH>f@tz)+S zB7R@z>LYpmv@&ihh5U+SV$Cx2%{HfBGM5u1W>Zn=BgWs(_!~Jp*kQbt810W+TRo~F zNX(|9(npLxlYs#gf2gIQK2Htxc@_P;KdZGNfO<95=c%4dd&S3T3ZX4PLs?t(p8Z!o z{%d8wEXWE77${x&es`ntpY;r!fKjR8MtwRvqTWYA=#_7AaY?S-R-ydnXP^Y6KApQ7 zy*}ab0Xs2=z4B>+ewMJbhTFc*Ho1{=vyLD22^+6I;nHJIe{581yLMZ7$6J@wwc9nX zKJ{`9w1%;%3!Ke*>#?qmpHubes886C^$FJu^?53+do^1EKZMaW z+%y;K(@~$$9#`uVmg>p02fim9>hsjtaH8TD?OO@_)AZ}>pXt@+;;o9?RFPx7&tF`X zpLzQ_MFp)-e^*McDz%PnD>rh%V>adL_?Mc_Jrog7hWbP$T37RE`}TzVdUENNRdH-M zp%xdHL`2_5>ZhG{SM)$DpvyJf%GIYcDGuUlY@6ArKAp|tFj43uz5UcrFL!6+@>cc@ z85@3iH#0VzP;X`5klmTMEIszb#?#Jn0wv(^`%|8Xf5>N_E=eK3BJ;VYPIdmpTLn+o zm;3C~)vKD{8gu${uEthQB{7?dQXeH+l}zUzuB~c*EG{mIUNLP8lz`(SY1Nf&laFq$ zK7MwwfTC{GM>iLwE88X}_32!Xt(>4Sn~GW=^<>(muQw(lB45ldzqAVK)$fbhWf2kS z>y63wf9=(~mkpGF^SP&T`hzLCw=8mJwz%~dYUIvrQSL2^oc>_S_dQWmVk;*|%%-B) zM-LzSo9cc)7nVQ|VWLvQjrw$rU7t{7^*-+Sz|xDIK>3wTC!T%~Q;qvSkqX|~jP}P> z6zX^X{|To5dz7feR!)$ZO+~Sf*1wWiP0m;U1Y31m1(SgR6Mqm1r-mC~OI=q-3af@2 zU`yTB2Mn`@8(>Rau7I{G*#Kb+{L9#`tH!Sy1K0o$U4R;~RiM$YL;Lrrci-7zr47mC zH=Mt)*owVg)!jW{t?&6}A1ulDf6#7aB7Uc*&G{s>75he9Om?NzoXO`yO+fw5t(sdv z*S4FJe>g3F{(pF0{xtJu=*RBz9>|aPyInflR_q(8)_DxwR7%bHO~gY>+?{LJK7&t2M?!YIv)@9xM9+53_JF6-tPKbCeLTr=GmeBdtA5} zf7kQ8wC8zgKOeTTT`OIcwyMi!Vxt;viB?tfZD*-N`+xVSo@7CO`Ns#Lwdvh=cBtum zT>dg$lzjeQ&cwQ&jo7ymmA)y*T7&iKw79q=yEAdw-5Ha=P5mcu5|&o6x&6;&>B+Rq zbnc;Q|6Sc142H0Z#HH3|NYt^pd2H0Y4 z3+lHnn-7Uv)o=rBsmcVdv<4eB+>>z$99OI|Exm;LGSNE0_}3aq=r-F)LK4XRtOtem1nP{DuvymuKNIqM!mpfNA&LbjjPPX-;&_>&AO^T=_U#;6<6%)L? zM(CTmpWqdsZ`s3nNy1(Gh zYqf4bHFUlHm2nbYI+|8puYYB$N!C>RB2jw2t0#7GlU7qu1o-|2IDkfJ?>{LHIH)ZtwT3MN2uG#s2g7kBvtJ}`HdSa(~ z@U^c?I_}BJ{Ic=n&?{g|DkgIUB|E-+BtQD?zn$){>u0iRWq!G;?bKV&mQ*ZIKR3G2 zwxF)9hI%V>_kJPnotJm={ZyP8P8;Oa5~ zwJ;_|ttNFPs&T;x`y$t<>h7wgCq~%!Bl@_mKZp@|^&T+n)yekp5mA?prj`C<>-aW~ h3jhEB008RW{{Xzwp)If?9cKUl002ovPDHLkV1iZ-1&06t delta 2489 zcmW-hc_7=_6TsK6!7AD%j+QE`TI#5VpG2u>994A1t?DdRT7uS5XXIzMT1UkaM=43Q zR!J&xEJ5pN>polJKJu$8O&n8wl`rJPv}NiC_{6;!y{t z-w*|jI|WG`&5$XlMGhrpd3yi23t@PIp-6IZF7|$Y zU&`G*{4yfksQ5u`OS)DkNM-how6dnbm~uq3TC|mA2CvI`-duJYp97XMo2#{8LA$)1J6X zbU}$u=jK2AjRj9Te|r&|PrSt5)Tq`kyD-*u7{k$TG;x!Wf}F*Ua6lcmur~|ZR|O`% zs%P_ou#EJpIY5Ocl&p{L`x$~eabf9GR_Rk-*BDhLHRkF!w|1bH8w#}-XRVUIlTzOB zkg8{Cadt49E+31Hcf z(^s&j#uF6W4t$eVBIhh!Takf@-0;PNN-|GjYoB3|ZRs#^JD@=DtBbO>{~WcuXA37! z3G_I_%qb*Ivij0U3 zfZfflE%kFwA)xTBiEB{)0PwOOh5@f)ZuD=asvKOJk@3Vj2?BJRw=ivgF#ZcbjBFm< z?>jAXlApf2UmTpd$Q#jXT9erzXXBuKpQ6ttCH8pYfTv0R8z|IxA#8Eg_bu1e?~Q3- z2(Mg37xMhLtuo}`2evQr9`nx_(3#F#hx_i8l0tNH3EYZTI;{z}!=DThQt0KAcD7nK zdKj95-x03Y+ODyBcLXcBhi_gpK@zr-F!so#)HZy>jGAC;+ZWEu+gO5`nw(eRvHl=` zUI7zMRe@_6TEt}*O3XI6VU6>&o9B6XW!HgN#btvpnTBKAuh-R+X*m%uqujlkT{hWH zx?}gn%`rx7Fkh>iC#Hqbu@52Cx`&xS>0EK=qkU)q=0lV@2Dh=|Js>x9@=l~AOeclM zDo5T$+OL4~*w(bz7WFgi2>R~*ck}XV)7+kub<<8;Zny<1WP^6e4q|ni;ASEHee~laQi?{|Gib?Qy zXws8{R3PQICVIIFwG~x72V~Q4{J2-DsvAo)z2f8--uo>@9#T?SEpz4A)fxBZcz2{& z1Aysk)9&6`*{tb^j zfWbqISyr8(0eq})DEdE3ZqVWwKH{dq`k{qp3`!sPGE_Cu&V`4#m;@DvJhsS*0Vyq917Cqe@k=ECRf-ys|XsmnUcRW-J%oR1s zYEv(%oPdGb1Kex|o+r$WgXo+YQlqfM)WZmN=IbS0EK$3gi1OLlpYR&Q?6H!3^9So? z1%affv*xfI$IVdi=W&pB<#nfwO5a}?oBM2({30;3-c9n7sa;CIxG=ZM*28D+#d(^t zpnRqHD`5{YzXH=?WpnjgQZu6A)ZwQGML7$G7h%fvHC|d?x%K3}K)+grP_C=XW(ca{ zBUW^qM6f_4?!Oka)Ujr1(G>*=HxG=QauN<0NvToi6syD3wJ}b(I+2ypd-v|SZSt&TQ)3z zPh-3Tzd-}JBR>=S_n2hW(p16IIOZ#A5i9G&D31;6w2lG%qMG>`mCNove)S;?}vwGJLNN#@El^(RnC!?7vNlGg*BpkFl(+e zsJWxbxrN0;wx+PArnNUfj;KQqMxJwj)@ZWqLQjcX8{obyZu1bcZ$G#9m3(byyiWgg zT~n3g=tH&+%2tnEK~yXb^Z4|l@^PG2B-6Y4rR=xC=6Ufh@nh7TciuVM;ytKA8VGH= zIh5nmwb4hRDyOBy5U?`*c)lSbn(6IuJKKR9KD1)Vy7XnRS+$3W@Pa?OSbQq6e7Tg; zUeULS^R6bRE^bmTf$cZ_{pdlCZZ8$&C0cdEGf3-{+i`xo7}J-Tid&)(Rb9q0ezVae s9B#%QuFe_8qLmn(4}^XK*0p_sa^6mb4u4=!_ei%EwY0OKnEC$kFKvtwA^-pY diff --git a/icons/mob/inhands/antag/clockwork_righthand.dmi b/icons/mob/inhands/antag/clockwork_righthand.dmi index efc69e72613ba81552127cfa2ca9b12fa95cf958..42715d6e92f09134c97cb270c8c9c0b65dfb6521 100644 GIT binary patch delta 2711 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 QY5)KL07*qoM6N<$g2n!r*8l(j From abf825280ba497c981f4346f92c2427dfd1f7d8e Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Sun, 2 Aug 2020 21:43:41 +0200 Subject: [PATCH 04/20] Modifies a bunch and adds rite support Clockie implants don't get detected by medscanners, brass claws get combo aka bonus damage on consecutive attacks against the same target, spears have a check for now accidentally draining vitality, and rite support has been added via a special sigil, though as of now there only is the 'base' rite which should never actually exist / be casted --- code/__DEFINES/clockcult.dm | 1 + .../clockcult/clock_effects/clock_sigils.dm | 25 +++++ .../clockcult/clock_helpers/clock_rites.dm | 101 ++++++++++++++++++ .../clockcult/clock_items/clock_augments.dm | 1 + .../clock_items/clock_weapons/brass_claw.dm | 24 ++++- .../clock_weapons/ratvarian_spear.dm | 2 +- tgstation.dme | 1 + 7 files changed, 150 insertions(+), 5 deletions(-) create mode 100644 code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index f597eb4ae7..a42ba4996f 100644 --- a/code/__DEFINES/clockcult.dm +++ b/code/__DEFINES/clockcult.dm @@ -23,6 +23,7 @@ GLOBAL_VAR_INIT(script_scripture_unlocked, FALSE) //If script scripture is avail GLOBAL_VAR_INIT(application_scripture_unlocked, FALSE) //If application scripture is available GLOBAL_VAR_INIT(judgement_scripture_unlocked, FALSE) //If judgement scripture is available GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not used to track existing scripture +GLOBAL_LIST_INIT(clock_rites, list(typesof(/datum/clockwork_rite) - /datum/clockwork_rite)) //Scripture tiers and requirements; peripherals should never be used #define SCRIPTURE_PERIPHERAL "Peripheral" diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index e579023a7a..6cdc781617 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -405,3 +405,28 @@ animation_number = initial(animation_number) sigil_active = FALSE animate(src, alpha = initial(alpha), time = 10, flags = ANIMATION_END_NOW) + +/obj/effect/clockwork/sigil/rite + name = "radiant sigil" + desc = "A glowing sigil glowing with barely-contained power." + clockwork_desc = "A sigil that will allow you to perform certain rites on it, provided you have access to sufficient power and materials." + icon_state = "sigiltransmission" //TODO + sigil_name = "Sigil of Rites" + alpha = 255 + var/performing_rite = FALSE + color = "#ffe63a" + +/obj/effect/clockwork/sigil/rite/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags) + . = ..() + if(.) + return + if(!is_servant_of_ratvar(user)) + return + var/list/possible_rites = list() + for(var/datum/clockwork_rite/R in GLOB.clock_rites) + possible_rites[R] = R + var/input_key = input(user, "Choose a rite to cast", "Casting a rite") as null|anything in possible_rites + if(!input_key) + return + var/datum/clockwork_rite/CR = possible_rites[input_key] + CR.try_cast(src, user) \ No newline at end of file diff --git a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm new file mode 100644 index 0000000000..09d1aeee47 --- /dev/null +++ b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm @@ -0,0 +1,101 @@ +//This file is for clock rites, mainly used by the Sigil of Rites in clock_sigils.dm +//The rites themselves are in this file to prevent bloating the other file too much, aswell as for easier access + +//The base clockwork rite. This should never be visible +/datum/clockwork_rite + var/name = "Some random clockwork rite that you should not be able to see" //The name of the rite + var/list/required_ingredients = list() //What does this rite require? + var/power_cost = 0 //How much power does this rite cost.. or does it even add power? + var/requires_human = FALSE //Does the rite require a ../carbon/human on the rune? + var/must_be_servant = TRUE //If the above is true, does the human need to be a servant? + var/target_can_be_invoker = TRUE //Does this rite work if the invoker is also the target? + var/cast_time = 0 //How long does the rite take to cast? + var/limit = -1 //How often can this rite be used per round? Set this to -1 for unlimited, 0 for disallowed, anything above 0 for a limit + var/times_used = 0 //How often has the rite already been used this shift? + var/rite_cast_sound = 'sound/items/bikehorn.ogg' //The sound played when successfully casting the rite. If it honks, the one adding the rite forgot to set one (or was just lazy). + +/datum/clockwork_rite/proc/try_cast(var/obj/effect/clockwork/sigil/rite/R, var/mob/living/invoker) //Performs a ton of checks to see if the invoker can cast the rite + if(!istype(R)) + return FALSE + if(!R || !R.loc) + return FALSE + var/turf/T = R.loc + if(!T) //Uh oh something is fucky + return FALSE + + if(limit != -1 && times_used >= limit) //Is the limit on casts exceeded? + to_chat(invoker, "There are no more uses left for this rite!") + return FALSE + + var/mob/living/carbon/human/H //This is only used if requires_human is TRUE + if(requires_human) //In case this requires a target + for(var/mob/living/carbon/human/possible_H in T) + if((!must_be_servant || is_servant_of_ratvar(possible_H)) && (target_can_be_invoker || invoker != possible_H)) + H = possible_H + break + if(!H) + to_chat(invoker, "There is no target for the rite on the sigil!") + return FALSE + + if(required_ingredients.len) //In case this requires materials + var/is_missing_materials = FALSE + for(var/obj/item/I in required_ingredients) + var/obj/item/Material = locate(I) in T + if(!Material) + is_missing_materials = TRUE + break + if(!is_missing_materials) + var/still_required_string = "" + for(var/i = 1 to required_ingredients.len) + var/obj/O = required_ingredients[i] + if(i != 1) + still_required_string += ", " + still_required_string += initial(O.name) + to_chat(invoker, "There are still materials missing for this rite. You require [still_required_string].") + return FALSE + + if(power_cost) //If this costs power + if(!get_clockwork_power(power_cost)) + to_chat(invoker, "There is not enough power for this rite!") + return FALSE + R.performing_rite = TRUE + if(!do_after(invoker, cast_time, target = R)) + to_chat(invoker, "span class='warning'>Your rite is disrupted.") + R.performing_rite = FALSE + return FALSE + . = cast(invoker, T, H) + if(!.) + to_chat(invoker, " You fail casting [name]") + post_cast(FALSE) + else + to_chat(invoker, "You successfully cast [name]") + post_cast(TRUE) + R.performing_rite = FALSE + return + +/datum/clockwork_rite/proc/cast(/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target) //Casts the rite and uses up ingredients. Doublechecks some things to prevent bypassing some restrictions via funky timing or badminnery. + if(requires_human && !target) + return FALSE + if(power_cost && !get_clockwork_power(power_cost)) + return FALSE + adjust_clockwork_power(-power_cost) + if(limit != -1 && times_used >= limit) + return FALSE + if(required_ingredients.len) + var/is_missing_materials = FALSE + for(var/obj/item/I in required_ingredients) + var/obj/item/Material = locate(I) in T + if(!Material) + is_missing_materials = TRUE + break + else + qdel(Material) + if(!is_missing_materials) + return FALSE + playsound(T, rite_cast_sound, 50, 2) + return TRUE + +/datum/clockwork_rite/proc/post_cast(var/cast_succeeded) + if(cast_succeeded) + times_used++ + return TRUE \ No newline at end of file diff --git a/code/modules/antagonists/clockcult/clock_items/clock_augments.dm b/code/modules/antagonists/clockcult/clock_items/clock_augments.dm index 3709e5ee2b..0b9c31f4e0 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_augments.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_augments.dm @@ -4,6 +4,7 @@ /obj/item/organ/cyberimp/arm/clockwork name = "clock-themed arm-mounted implant" var/clockwork_desc = "According to Ratvar, this really shouldn't exist. Tell Him about this immediately." + syndicate_implant = TRUE /obj/item/organ/cyberimp/arm/clockwork/ui_action_click() if(is_servant_of_ratvar(owner) || (obj_flags & EMAGGED)) //If you somehow manage to steal a clockie's implant AND have an emag AND manage to get it implanted for yourself, good on ya! diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm index cedc04c59e..df84002f69 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm @@ -1,16 +1,16 @@ -//Brass claw, a armbladelike weapon used by an clock implant. Stealthy if retracted, very obvious if active. Simillar to an armblade strength-wise but has some funky stuff +//Brass claw, an armblade-like weapon used by a clock implant. Stealthy if retracted, very obvious if active. +//Bit weaker than an armblade strength-wise but gains combo on consecutive attacks against the same target, which causes bonus damage /obj/item/clockwork/brass_claw name = "brass claw" desc = "A highly sharp claw made out of brass." - clockwork_desc = "A incredibly sharp claw made out of brass. It is quite effective at crippling enemies, though incredibly obvious aswell." + clockwork_desc = "A incredibly sharp claw made out of brass. It is quite effective at crippling enemies, though incredibly obvious aswell. Gains combo on consecutive attacks against a target, causing bonus damage." icon_state = "brass_claw" //Codersprite moment item_state = "brass_claw" lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi' righthand_file = 'icons/mob/inhands/antag/clockwork_righthand.dmi' - //item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL w_class = WEIGHT_CLASS_HUGE - force = 15 //Doesn't generate vitality like the spear does / has somewhat less damage, but quite good at wounding and gets through armor pretty well. + force = 15 //Doesn't generate vitality like the spear does / has somewhat less damage, but quite good at wounding and gets through armor pretty well. Also gains 2 bonus damage per consecutive attack on the same target throwforce = 0 //haha yes lets be safe about this throw_range = 0 throw_speed = 0 @@ -21,7 +21,23 @@ wound_bonus = 5 bare_wound_bonus = 15 total_mass = TOTAL_MASS_HAND_REPLACEMENT + var/mob/living/last_attacked + var/combo = 0 /obj/item/clockwork/brass_claw/Initialize() . = ..() AddComponent(/datum/component/butchering, 60, 80) + +/obj/item/clockwork/brass_claw/attack(mob/living/target, mob/living/carbon/human/user) + . = ..() + if(QDELETED(target) || target.anti_magic_check(chargecost = 0) || is_servant_of_ratvar(target)) + return + if(target != last_attacked) //Loses all combat on switching targets + last_attacked = target + combo = 0 + else + if(!iscultist(target)) //Hostile cultists being hit stacks up combo far faster than usual + combo++ + else + combo += 3 + target.adjustBruteLoss(combo * 2) diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm index 22b0913b2f..abfba29cc9 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm @@ -45,7 +45,7 @@ else if(iscultist(target) || isconstruct(target)) to_chat(target, "Your body flares with agony at [src]'s presence!") bonus_damage *= 3 //total 30 damage on cultists, 50 with ratvar - GLOB.clockwork_vitality += target.adjustFireLoss(bonus_damage) //adds the damage done to existing vitality + GLOB.clockwork_vitality += max(0, target.adjustFireLoss(bonus_damage)) //adds the damage done to existing vitality /obj/item/clockwork/weapon/ratvarian_spear/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) var/turf/T = get_turf(hit_atom) diff --git a/tgstation.dme b/tgstation.dme index 05154aad92..b6ade162a5 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1519,6 +1519,7 @@ #include "code\modules\antagonists\clockcult\clock_effects\servant_blocker.dm" #include "code\modules\antagonists\clockcult\clock_effects\spatial_gateway.dm" #include "code\modules\antagonists\clockcult\clock_helpers\clock_powerdrain.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\clock_rites.dm" #include "code\modules\antagonists\clockcult\clock_helpers\component_helpers.dm" #include "code\modules\antagonists\clockcult\clock_helpers\fabrication_helpers.dm" #include "code\modules\antagonists\clockcult\clock_helpers\hierophant_network.dm" From 3a750a8ae56a98dd5b6bdf4dbe03f5b2ae4adcf0 Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Sun, 2 Aug 2020 21:46:12 +0200 Subject: [PATCH 05/20] empty last line --- .../modules/antagonists/clockcult/clock_effects/clock_sigils.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index 6cdc781617..a3802eb949 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -429,4 +429,4 @@ if(!input_key) return var/datum/clockwork_rite/CR = possible_rites[input_key] - CR.try_cast(src, user) \ No newline at end of file + CR.try_cast(src, user) From 50c6586dd0eb42e41b774b0bdc500a4d3686725f Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Sun, 2 Aug 2020 21:46:41 +0200 Subject: [PATCH 06/20] same here --- code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm index 09d1aeee47..7ca4c0ec45 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm @@ -98,4 +98,4 @@ /datum/clockwork_rite/proc/post_cast(var/cast_succeeded) if(cast_succeeded) times_used++ - return TRUE \ No newline at end of file + return TRUE From 932eeeecef607db81b06be3a4115b612b9efcb60 Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Mon, 3 Aug 2020 14:43:50 +0200 Subject: [PATCH 07/20] rites actually work now Rites can be casted now, added a show info option on the sigil of rites, adds a TON of debug messages, if this is PRd while they are still in yell at me loudly. Also adds the rite of advancement, a rite used to implant organs into a servant, without surgery being required. --- code/__DEFINES/clockcult.dm | 2 +- .../clockcult/clock_effects/clock_sigils.dm | 23 +++++- .../clockcult/clock_helpers/clock_rites.dm | 82 ++++++++++++++++--- 3 files changed, 91 insertions(+), 16 deletions(-) diff --git a/code/__DEFINES/clockcult.dm b/code/__DEFINES/clockcult.dm index a42ba4996f..5f4317060d 100644 --- a/code/__DEFINES/clockcult.dm +++ b/code/__DEFINES/clockcult.dm @@ -23,7 +23,7 @@ GLOBAL_VAR_INIT(script_scripture_unlocked, FALSE) //If script scripture is avail GLOBAL_VAR_INIT(application_scripture_unlocked, FALSE) //If application scripture is available GLOBAL_VAR_INIT(judgement_scripture_unlocked, FALSE) //If judgement scripture is available GLOBAL_LIST_EMPTY(all_scripture) //a list containing scripture instances; not used to track existing scripture -GLOBAL_LIST_INIT(clock_rites, list(typesof(/datum/clockwork_rite) - /datum/clockwork_rite)) +GLOBAL_LIST_EMPTY(all_clockwork_rites) //a list containing all clockwork rites. Filled the first time any cultist interacts with a sigil of rites. //Scripture tiers and requirements; peripherals should never be used #define SCRIPTURE_PERIPHERAL "Peripheral" diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index a3802eb949..4a9313cae4 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -422,11 +422,28 @@ return if(!is_servant_of_ratvar(user)) return + generate_all_rites() var/list/possible_rites = list() - for(var/datum/clockwork_rite/R in GLOB.clock_rites) + for(var/datum/clockwork_rite/R in GLOB.all_clockwork_rites) possible_rites[R] = R - var/input_key = input(user, "Choose a rite to cast", "Casting a rite") as null|anything in possible_rites + message_admins("[R]") + var/input_key = input(user, "Choose a rite", "Choosing a rite") as null|anything in possible_rites if(!input_key) return var/datum/clockwork_rite/CR = possible_rites[input_key] - CR.try_cast(src, user) + if(!CR) + return + var/choice = alert(user, "What to do with this rite?", "What to do?", "Cast", "Show Info", "Cancel") + switch(choice) + if("Cast") + CR.try_cast(src, user) + if("Show Info") + var/infotext = CR.build_info() + to_chat(user, infotext) + +/obj/effect/clockwork/sigil/rite/proc/generate_all_rites() //The first time someone uses a sigil of rites, all the rites are actually generated. No need to have a bunch of random datums laying around all the time. + if(GLOB.all_clockwork_rites.len) //we already generated the list + return + for(var/V in subtypesof(/datum/clockwork_rite)) + var/datum/clockwork_rite/R = new V + GLOB.all_clockwork_rites += R diff --git a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm index 7ca4c0ec45..351103ef1a 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm @@ -1,16 +1,19 @@ //This file is for clock rites, mainly used by the Sigil of Rites in clock_sigils.dm //The rites themselves are in this file to prevent bloating the other file too much, aswell as for easier access +#define INFINITE -1 + //The base clockwork rite. This should never be visible /datum/clockwork_rite var/name = "Some random clockwork rite that you should not be able to see" //The name of the rite + var/desc = "Someone forgot to set the description of this rite.. you shouldn't see this." //What does this rite do? Shown to cultists if they choose 'Show Info' after selecting the rite. var/list/required_ingredients = list() //What does this rite require? var/power_cost = 0 //How much power does this rite cost.. or does it even add power? var/requires_human = FALSE //Does the rite require a ../carbon/human on the rune? var/must_be_servant = TRUE //If the above is true, does the human need to be a servant? var/target_can_be_invoker = TRUE //Does this rite work if the invoker is also the target? var/cast_time = 0 //How long does the rite take to cast? - var/limit = -1 //How often can this rite be used per round? Set this to -1 for unlimited, 0 for disallowed, anything above 0 for a limit + var/limit = INFINITE //How often can this rite be used per round? Set this to INFINITE for unlimited, 0 for disallowed, anything above 0 for a limit var/times_used = 0 //How often has the rite already been used this shift? var/rite_cast_sound = 'sound/items/bikehorn.ogg' //The sound played when successfully casting the rite. If it honks, the one adding the rite forgot to set one (or was just lazy). @@ -20,11 +23,12 @@ if(!R || !R.loc) return FALSE var/turf/T = R.loc + message_admins("Turf: [T]") if(!T) //Uh oh something is fucky return FALSE - if(limit != -1 && times_used >= limit) //Is the limit on casts exceeded? - to_chat(invoker, "There are no more uses left for this rite!") + if(limit != INFINITE && times_used >= limit) //Is the limit on casts exceeded? + to_chat(invoker, "There are no more uses left for this rite!") return FALSE var/mob/living/carbon/human/H //This is only used if requires_human is TRUE @@ -39,12 +43,14 @@ if(required_ingredients.len) //In case this requires materials var/is_missing_materials = FALSE - for(var/obj/item/I in required_ingredients) + for(var/I in required_ingredients) var/obj/item/Material = locate(I) in T if(!Material) is_missing_materials = TRUE + message_admins("Failed at: [I]") break - if(!is_missing_materials) + message_admins("Found [Material] when searching for [I] - Success!") + if(is_missing_materials) var/still_required_string = "" for(var/i = 1 to required_ingredients.len) var/obj/O = required_ingredients[i] @@ -60,7 +66,7 @@ return FALSE R.performing_rite = TRUE if(!do_after(invoker, cast_time, target = R)) - to_chat(invoker, "span class='warning'>Your rite is disrupted.") + to_chat(invoker, "Your rite is disrupted.") R.performing_rite = FALSE return FALSE . = cast(invoker, T, H) @@ -73,24 +79,27 @@ R.performing_rite = FALSE return -/datum/clockwork_rite/proc/cast(/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target) //Casts the rite and uses up ingredients. Doublechecks some things to prevent bypassing some restrictions via funky timing or badminnery. +/datum/clockwork_rite/proc/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target) //Casts the rite and uses up ingredients. Doublechecks some things to prevent bypassing some restrictions via funky timing or badminnery. + if(!T || !invoker) + return FALSE if(requires_human && !target) return FALSE if(power_cost && !get_clockwork_power(power_cost)) return FALSE adjust_clockwork_power(-power_cost) - if(limit != -1 && times_used >= limit) + if(limit != INFINITE && times_used >= limit) return FALSE if(required_ingredients.len) var/is_missing_materials = FALSE - for(var/obj/item/I in required_ingredients) + for(var/I in required_ingredients) var/obj/item/Material = locate(I) in T if(!Material) is_missing_materials = TRUE + message_admins("Failed at: [I]") break - else - qdel(Material) - if(!is_missing_materials) + qdel(Material) + message_admins("Found [Material] when searching for [I] - Success!") + if(is_missing_materials) return FALSE playsound(T, rite_cast_sound, 50, 2) return TRUE @@ -99,3 +108,52 @@ if(cast_succeeded) times_used++ return TRUE + +/datum/clockwork_rite/proc/build_info() //Constructs the info text of a given rite, based on the vars of the rite + . = "" + . += "This is the [name].\n" + . += "[desc]\n" + . += "It requires: " + if(required_ingredients.len) + var/material_string = "" + for(var/i = 1 to required_ingredients.len) + var/obj/O = required_ingredients[i] + if(i != 1) + material_string += ", " + material_string += "a [initial(O.name)]" + . += "[material_string].\n" + else + . += "no materials.\n" + . += "It [power_cost >= 0 ? "costs" : "generates"] [power_cost ? "[power_cost]" : "no"] power.\n" + . += "It requires [requires_human ? " a human" : " no"] target.\n" + if(requires_human) + . += "The target [must_be_servant ? "cannot be" : "can be"] a nonservant.\n" + . += "The target [target_can_be_invoker ? "can be" : "cannot be"] the invoker.\n" + . += "It requires [cast_time/10] seconds to cast.\n" + . += "It has been used [times_used] times, out of [limit != INFINITE ? ", [limit]" : "infinite"] available uses." + +/datum/clockwork_rite/advancement + name = "Rite of Advancement" + desc = "This rite is used to augment a servant with organs or cybernetic implants. The organ of choice, aswell as the servant and the required ingredients must be placed on the sigil for this rite to take place." + required_ingredients = list(/obj/item/assembly/prox_sensor, /obj/item/stock_parts/cell) + power_cost = 500 + requires_human = TRUE + cast_time = 40 + +/datum/clockwork_rite/advancement/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target) + message_admins("Turf: [T]") + var/obj/item/organ/O = locate(/obj/item/organ) in T + if(!O) + message_admins("No organ found!") + return FALSE + if(istype(O, /obj/item/organ/brain)) //NOPE + return FALSE + message_admins("Organ to implant: [O]") + . = ..() + if(!.) + message_admins("Parent Rite cast failed - aborting") + return FALSE + O.Insert(target) + new /obj/effect/temp_visual/ratvar/sigil/transgression(T) + +#undef INFINITE From c0b9e2bace1294ef4bc3a8f761cfda2f4dff3032 Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Mon, 3 Aug 2020 15:11:49 +0200 Subject: [PATCH 08/20] updates some examines little fix in the rite desc generation, brass claws now show combo / bonus damage, if their wielder if a clock cultist --- .../clockcult/clock_helpers/clock_rites.dm | 2 +- .../clock_items/clock_weapons/brass_claw.dm | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm index 351103ef1a..6fb396fa7b 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm @@ -130,7 +130,7 @@ . += "The target [must_be_servant ? "cannot be" : "can be"] a nonservant.\n" . += "The target [target_can_be_invoker ? "can be" : "cannot be"] the invoker.\n" . += "It requires [cast_time/10] seconds to cast.\n" - . += "It has been used [times_used] times, out of [limit != INFINITE ? ", [limit]" : "infinite"] available uses." + . += "It has been used [times_used] time[times_used != 1 ? "s" : ""], out of [limit != INFINITE ? ", [limit]" : "infinite"] available uses." /datum/clockwork_rite/advancement name = "Rite of Advancement" diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm index df84002f69..340734e11b 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm @@ -3,8 +3,8 @@ /obj/item/clockwork/brass_claw name = "brass claw" - desc = "A highly sharp claw made out of brass." - clockwork_desc = "A incredibly sharp claw made out of brass. It is quite effective at crippling enemies, though incredibly obvious aswell. Gains combo on consecutive attacks against a target, causing bonus damage." + desc = "A very sharp claw made out of brass." + clockwork_desc = "A incredibly sharp claw made out of brass. It is quite effective at crippling enemies, though very obvious when extended.\nGains combo on consecutive attacks against a target, causing bonus damage." icon_state = "brass_claw" //Codersprite moment item_state = "brass_claw" lefthand_file = 'icons/mob/inhands/antag/clockwork_lefthand.dmi' @@ -23,11 +23,18 @@ total_mass = TOTAL_MASS_HAND_REPLACEMENT var/mob/living/last_attacked var/combo = 0 + var/damage_per_combo = 2 /obj/item/clockwork/brass_claw/Initialize() . = ..() AddComponent(/datum/component/butchering, 60, 80) +/obj/item/clockwork/brass_claw/examine(mob/user) + if(is_servant_of_ratvar(user)) + clockwork_desc += "\nIt has [combo] combo stacks built up against the current target, causing [combo * damage_per_combo] bonus damage." + . = ..() + clockwork_desc = initial(desc) + /obj/item/clockwork/brass_claw/attack(mob/living/target, mob/living/carbon/human/user) . = ..() if(QDELETED(target) || target.anti_magic_check(chargecost = 0) || is_servant_of_ratvar(target)) @@ -40,4 +47,4 @@ combo++ else combo += 3 - target.adjustBruteLoss(combo * 2) + target.adjustBruteLoss(combo * damage_per_combo) From 7c871cbad132bca361a973973868ce84b351d187 Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Mon, 3 Aug 2020 15:43:35 +0200 Subject: [PATCH 09/20] oops --- .../clockcult/clock_items/clock_weapons/brass_claw.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm index 340734e11b..de8d7c09ef 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm @@ -33,7 +33,7 @@ if(is_servant_of_ratvar(user)) clockwork_desc += "\nIt has [combo] combo stacks built up against the current target, causing [combo * damage_per_combo] bonus damage." . = ..() - clockwork_desc = initial(desc) + clockwork_desc = initial(clockwork_desc) /obj/item/clockwork/brass_claw/attack(mob/living/target, mob/living/carbon/human/user) . = ..() From a75aac288d350bc15b9beb143d89df6e0a890ba1 Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Mon, 3 Aug 2020 17:25:37 +0200 Subject: [PATCH 10/20] Makes the Sigil of rites summonable and adds some more rites The sigil of rites can now be summoned for 1400 power at tier two. Two new rites are available: The rite of woundmending, which heals any wounds (not damage) a target may have, but causes 10 toxins damage per wound healed aswell as the rite of the claw, which summons a brass claw implant on the rune. This rite specifically can only be used a limited amount of times --- .../clockcult/clock_effects/clock_sigils.dm | 2 + .../clockcult/clock_helpers/clock_rites.dm | 39 +++++++++++++++++++ .../clock_scriptures/scripture_scripts.dm | 29 +++++++++++--- 3 files changed, 64 insertions(+), 6 deletions(-) diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index 4a9313cae4..fcd70513f4 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -415,6 +415,8 @@ alpha = 255 var/performing_rite = FALSE color = "#ffe63a" + light_range = 1 + light_power = 3 /obj/effect/clockwork/sigil/rite/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags) . = ..() diff --git a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm index 6fb396fa7b..a76c14a92b 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm @@ -156,4 +156,43 @@ O.Insert(target) new /obj/effect/temp_visual/ratvar/sigil/transgression(T) +/datum/clockwork_rite/treat_wounds + name = "Rite of Woundmending" + desc = "This rite is used to heal wounds of the servant on the rune. It causes toxins damage proportional to the amount of wounds healed. This can be lethal if performed on an critically injured target." + required_ingredients = list(/obj/item/stock_parts/cell, /obj/item/healthanalyzer, /obj/item/reagent_containers/food/drinks/bottle/holyoil) + power_cost = 300 + requires_human = TRUE + must_be_servant = FALSE + target_can_be_invoker = FALSE + cast_time = 80 + +/datum/clockwork_rite/treat_wounds/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target) + if(!target) + return FALSE + if(!target.all_wounds.len) + to_chat(invoker, "This one does not require mending.") + return FALSE + .= ..() + if(!.) + return FALSE + target.adjustToxLoss(10 * target.all_wounds.len) + QDEL_LIST(target.all_wounds) + to_chat(target, "You feel your wounds heal, but are overcome with deep nausea.") + new /obj/effect/temp_visual/ratvar/sigil/vitality(T) + +/datum/clockwork_rite/summon_claw + name = "Rite of the Claw" + desc = "Summons a special arm implant that, when added to a cultist's limb, will allow them to extend and retract a claw at will. Don't leave any implants you want to keep on this rune when casting the rite." + required_ingredients = list(/obj/item/stock_parts/cell, /obj/item/organ/cyberimp, /obj/item/assembly/flash) + power_cost = 1000 + cast_time = 60 + limit = 4 + +/datum/clockwork_rite/summon_claw/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target) + . = ..() + if(!.) + return FALSE + var/obj/item/organ/cyberimp/arm/clockwork/claw/CL = new /obj/item/organ/cyberimp/arm/clockwork/claw(T) + CL.visible_message("[CL] materialises out of thin air!") + #undef INFINITE diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm index d96765d536..c98391bc1d 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm @@ -81,6 +81,23 @@ return /obj/effect/clockwork/sigil/vitality/neutered return ..() +//Sigil of Rites: Creates a sigil that allows to perform certain rites on it. More information on these can be found in clock_rites.dm, they usually require power, materials and sometimes a target. +/datum/clockwork_scripture/create_object/sigil_of_rites + descname = "Sigil, Access to rites" + name = "Sigil of Rites" + desc = "Places a sigil that, when itneracted with, will allow for a variety of rites to be performed on the sigil. These usually require power cells, clockwork power, and some other components." + invocations = list("Engine, allow us..", ".. to be blessed with rites.") + channel_time = 80 + power_cost = 1400 + whispered = TRUE + object_path = /obj/effect/clockwork/sigil/rite + creator_message = "A sigil of Rites appears beneath you. It will allow you to perform certain rites, given sufficient materials and power." + usage_tip = "It may be useful to coordinate to acquire needed materials quickly." + tier = SCRIPTURE_SCRIPT + one_per_tile = TRUE + primary_component = HIEROPHANT_ANSIBLE + sort_priority = 4 + //Judicial Visor: Creates a judicial visor, which can smite an area. /datum/clockwork_scripture/create_object/judicial_visor descname = "Delayed Area Knockdown Glasses" @@ -96,7 +113,7 @@ tier = SCRIPTURE_SCRIPT space_allowed = TRUE primary_component = BELLIGERENT_EYE - sort_priority = 4 + sort_priority = 5 quickbind = TRUE quickbind_desc = "Creates a Judicial Visor, which can smite an area, applying Belligerent and briefly stunning." @@ -115,7 +132,7 @@ tier = SCRIPTURE_SCRIPT space_allowed = TRUE primary_component = VANGUARD_COGWHEEL - sort_priority = 6 + sort_priority = 7 quickbind = TRUE quickbind_desc = "Creates a Ratvarian shield, which can absorb energy from attacks for use in powerful bashes." @@ -131,7 +148,7 @@ usage_tip = "Throwing the spear at a mob will do massive damage and knock them down, but break the spear. You will need to wait for 30 seconds before resummoning it." tier = SCRIPTURE_SCRIPT primary_component = VANGUARD_COGWHEEL - sort_priority = 7 + sort_priority = 8 important = TRUE quickbind = TRUE quickbind_desc = "Permanently binds clockwork armor and a Ratvarian spear to you." @@ -229,7 +246,7 @@ usage_tip = "This is a very effective way to rapidly reinforce a base after an attack." tier = SCRIPTURE_SCRIPT primary_component = VANGUARD_COGWHEEL - sort_priority = 8 + sort_priority = 9 quickbind = TRUE quickbind_desc = "Repairs nearby structures and constructs. Servants wearing clockwork armor will also be healed.
Maximum 10 chants." var/heal_attempts = 4 @@ -342,7 +359,7 @@ usage_tip = "Though it requires you to stand still, this scripture can do massive damage." tier = SCRIPTURE_SCRIPT primary_component = BELLIGERENT_EYE - sort_priority = 5 + sort_priority = 6 quickbind = TRUE quickbind_desc = "Allows you to fire energy rays at target locations.
Maximum 5 chants." var/static/list/nzcrentr_insults = list("You're not very good at aiming.", "You hunt badly.", "What a waste of energy.", "Almost funny to watch.", @@ -391,7 +408,7 @@ usage_tip = "It may be useful to end channelling early if the burning becomes too much to handle.." tier = SCRIPTURE_SCRIPT primary_component = GEIS_CAPACITOR - sort_priority = 10 + sort_priority = 11 quickbind = TRUE quickbind_desc = "Quickly drains power in an area around the invoker, causing burns proportional to the amount of energy drained.
Maximum of 20 chants." From c898b54ed30574e8f0ec67db4adb58b2618a5cdc Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Mon, 3 Aug 2020 17:55:10 +0200 Subject: [PATCH 11/20] span & class torture Unfucks a bunch of span stuff, adds a few comments --- .../clockcult/clock_helpers/clock_rites.dm | 33 +++++++++++-------- .../clock_scriptures/scripture_scripts.dm | 2 +- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm index a76c14a92b..42e70e65d5 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm @@ -56,7 +56,7 @@ var/obj/O = required_ingredients[i] if(i != 1) still_required_string += ", " - still_required_string += initial(O.name) + still_required_string += "a [initial(O.name)]" to_chat(invoker, "There are still materials missing for this rite. You require [still_required_string].") return FALSE @@ -111,9 +111,9 @@ /datum/clockwork_rite/proc/build_info() //Constructs the info text of a given rite, based on the vars of the rite . = "" - . += "This is the [name].\n" - . += "[desc]\n" - . += "It requires: " + . += "This is the [name].\n" + . += "[desc]\n" + . += "It requires: " if(required_ingredients.len) var/material_string = "" for(var/i = 1 to required_ingredients.len) @@ -121,17 +121,18 @@ if(i != 1) material_string += ", " material_string += "a [initial(O.name)]" - . += "[material_string].\n" + . += "[material_string].\n" else - . += "no materials.\n" - . += "It [power_cost >= 0 ? "costs" : "generates"] [power_cost ? "[power_cost]" : "no"] power.\n" - . += "It requires [requires_human ? " a human" : " no"] target.\n" + . += "
no materials.\n" + . += "It [power_cost >= 0 ? "costs" : "generates"] [power_cost ? "[power_cost]" : "no"] power.\n" + . += "It requires [requires_human ? " a human" : " no"] target.\n" if(requires_human) - . += "The target [must_be_servant ? "cannot be" : "can be"] a nonservant.\n" - . += "The target [target_can_be_invoker ? "can be" : "cannot be"] the invoker.\n" - . += "It requires [cast_time/10] seconds to cast.\n" - . += "It has been used [times_used] time[times_used != 1 ? "s" : ""], out of [limit != INFINITE ? ", [limit]" : "infinite"] available uses." + . += "The target [must_be_servant ? "cannot be" : "can be"] a nonservant.\n" + . += "The target [target_can_be_invoker ? "can be" : "cannot be"] the invoker.\n" + . += "It requires [cast_time/10] seconds to cast.\n" + . += "It has been used [times_used] time[times_used != 1 ? "s" : ""], out of [limit != INFINITE ? "[limit]" : "infinite"] available uses." +//Adds a organ or cybernetic implant to a servant without the need for surgery. Cannot be used with brains for.. reasons. /datum/clockwork_rite/advancement name = "Rite of Advancement" desc = "This rite is used to augment a servant with organs or cybernetic implants. The organ of choice, aswell as the servant and the required ingredients must be placed on the sigil for this rite to take place." @@ -139,6 +140,7 @@ power_cost = 500 requires_human = TRUE cast_time = 40 + rite_cast_sound = 'sound/magic/Blind.ogg' /datum/clockwork_rite/advancement/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target) message_admins("Turf: [T]") @@ -156,6 +158,7 @@ O.Insert(target) new /obj/effect/temp_visual/ratvar/sigil/transgression(T) +//Heals all wounds (not damage) on the target, causing toxloss proportional to amount of wounds healed. 10 damage per wound. /datum/clockwork_rite/treat_wounds name = "Rite of Woundmending" desc = "This rite is used to heal wounds of the servant on the rune. It causes toxins damage proportional to the amount of wounds healed. This can be lethal if performed on an critically injured target." @@ -165,6 +168,7 @@ must_be_servant = FALSE target_can_be_invoker = FALSE cast_time = 80 + rite_cast_sound = 'sound/magic/staff_healing.ogg' /datum/clockwork_rite/treat_wounds/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target) if(!target) @@ -180,13 +184,15 @@ to_chat(target, "You feel your wounds heal, but are overcome with deep nausea.") new /obj/effect/temp_visual/ratvar/sigil/vitality(T) +//Summons a brass claw implant on the sigil, which can extend a claw that benefits from repeatedly attacking a single target. Can only be cast a limited amount of times. /datum/clockwork_rite/summon_claw name = "Rite of the Claw" - desc = "Summons a special arm implant that, when added to a cultist's limb, will allow them to extend and retract a claw at will. Don't leave any implants you want to keep on this rune when casting the rite." + desc = "Summons a special arm implant that, when added to a servant's limb, will allow them to extend and retract a claw at will. Don't leave any implants you want to keep on this rune when casting the rite." required_ingredients = list(/obj/item/stock_parts/cell, /obj/item/organ/cyberimp, /obj/item/assembly/flash) power_cost = 1000 cast_time = 60 limit = 4 + rite_cast_sound = 'sound/magic/clockwork/fellowship_armory.ogg' /datum/clockwork_rite/summon_claw/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target) . = ..() @@ -194,5 +200,6 @@ return FALSE var/obj/item/organ/cyberimp/arm/clockwork/claw/CL = new /obj/item/organ/cyberimp/arm/clockwork/claw(T) CL.visible_message("[CL] materialises out of thin air!") + new /obj/effect/temp_visual/ratvar/sigil/transmission(T,2) #undef INFINITE diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm index c98391bc1d..72ba95e764 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm @@ -85,7 +85,7 @@ /datum/clockwork_scripture/create_object/sigil_of_rites descname = "Sigil, Access to rites" name = "Sigil of Rites" - desc = "Places a sigil that, when itneracted with, will allow for a variety of rites to be performed on the sigil. These usually require power cells, clockwork power, and some other components." + desc = "Places a sigil that, when interacted with, will allow for a variety of rites to be performed on the sigil. These usually require power cells, clockwork power, and some other components." invocations = list("Engine, allow us..", ".. to be blessed with rites.") channel_time = 80 power_cost = 1400 From b15ed5e3d1122dc72e6252caca3353cc7d5339ff Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Mon, 3 Aug 2020 17:58:18 +0200 Subject: [PATCH 12/20] smol tweaks --- .../antagonists/clockcult/clock_effects/clock_sigils.dm | 5 +++-- .../antagonists/clockcult/clock_helpers/clock_rites.dm | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index fcd70513f4..8784ce25fe 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -410,13 +410,14 @@ name = "radiant sigil" desc = "A glowing sigil glowing with barely-contained power." clockwork_desc = "A sigil that will allow you to perform certain rites on it, provided you have access to sufficient power and materials." - icon_state = "sigiltransmission" //TODO + icon_state = "sigiltransmission" //am big lazy - recolored transmission sigil sigil_name = "Sigil of Rites" alpha = 255 var/performing_rite = FALSE color = "#ffe63a" + light_color = "#ffe63a" light_range = 1 - light_power = 3 + light_power = 2 /obj/effect/clockwork/sigil/rite/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags) . = ..() diff --git a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm index 42e70e65d5..25a87ec908 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm @@ -140,7 +140,7 @@ power_cost = 500 requires_human = TRUE cast_time = 40 - rite_cast_sound = 'sound/magic/Blind.ogg' + rite_cast_sound = 'sound/magic/blind.ogg' /datum/clockwork_rite/advancement/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target) message_admins("Turf: [T]") From be44bcfd1c4c88266ab27c40885832f44b9a129c Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Mon, 3 Aug 2020 18:00:38 +0200 Subject: [PATCH 13/20] removes debug messages not forgetting that. --- .../antagonists/clockcult/clock_effects/clock_sigils.dm | 1 - .../antagonists/clockcult/clock_helpers/clock_rites.dm | 9 --------- 2 files changed, 10 deletions(-) diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index 8784ce25fe..99a5f02cdd 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -429,7 +429,6 @@ var/list/possible_rites = list() for(var/datum/clockwork_rite/R in GLOB.all_clockwork_rites) possible_rites[R] = R - message_admins("[R]") var/input_key = input(user, "Choose a rite", "Choosing a rite") as null|anything in possible_rites if(!input_key) return diff --git a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm index 25a87ec908..cb44f7e299 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm @@ -23,7 +23,6 @@ if(!R || !R.loc) return FALSE var/turf/T = R.loc - message_admins("Turf: [T]") if(!T) //Uh oh something is fucky return FALSE @@ -47,9 +46,7 @@ var/obj/item/Material = locate(I) in T if(!Material) is_missing_materials = TRUE - message_admins("Failed at: [I]") break - message_admins("Found [Material] when searching for [I] - Success!") if(is_missing_materials) var/still_required_string = "" for(var/i = 1 to required_ingredients.len) @@ -95,10 +92,8 @@ var/obj/item/Material = locate(I) in T if(!Material) is_missing_materials = TRUE - message_admins("Failed at: [I]") break qdel(Material) - message_admins("Found [Material] when searching for [I] - Success!") if(is_missing_materials) return FALSE playsound(T, rite_cast_sound, 50, 2) @@ -143,17 +138,13 @@ rite_cast_sound = 'sound/magic/blind.ogg' /datum/clockwork_rite/advancement/cast(var/mob/living/invoker, var/turf/T, var/mob/living/carbon/human/target) - message_admins("Turf: [T]") var/obj/item/organ/O = locate(/obj/item/organ) in T if(!O) - message_admins("No organ found!") return FALSE if(istype(O, /obj/item/organ/brain)) //NOPE return FALSE - message_admins("Organ to implant: [O]") . = ..() if(!.) - message_admins("Parent Rite cast failed - aborting") return FALSE O.Insert(target) new /obj/effect/temp_visual/ratvar/sigil/transgression(T) From d1622053d2e51db7c9aa339c04819831b0a552be Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Mon, 3 Aug 2020 18:08:47 +0200 Subject: [PATCH 14/20] kindle tweaks Time to cast back up to 1.5 seconds because yeah no you can't just stand still for a moment and kindle the guy chasing you. But also: Kindle now mutes for five seconds (instead of 2) after it ends, and causes stuttering for five seconds after it ends (instead of 3) --- code/datums/status_effects/debuffs.dm | 4 ++-- .../clockcult/clock_scriptures/scripture_drivers.dm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index aa27c6424e..16e929a110 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -547,8 +547,8 @@ owner.DefaultCombatKnockdown(15, TRUE, FALSE, 15) if(iscarbon(owner)) var/mob/living/carbon/C = owner - C.silent = max(2, C.silent) - C.stuttering = max(5, C.stuttering) + C.silent = max(5, C.silent) //Increased, now lasts until five seconds after it ends, instead of 2 + C.stuttering = max(10, C.stuttering) //Increased, now lasts for five seconds after the mute ends, instead of 3 if(!old_health) old_health = owner.health if(!old_oxyloss) diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm index c4b1913832..00c4d73428 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_drivers.dm @@ -97,7 +97,7 @@ desc = "Charges your slab with divine energy, allowing you to overwhelm a target with Ratvar's light." invocations = list("Divinity, show them your light!") whispered = TRUE - channel_time = 10 // I think making kindle channel a third of the time less is a good make up for the fact that it silences people for such a little amount of time. + channel_time = 15 // I think making kindle channel a third of the time less is a good make up for the fact that it silences people for such a little amount of time. power_cost = 125 usage_tip = "The light can be used from up to two tiles away. Damage taken will GREATLY REDUCE the stun's duration." tier = SCRIPTURE_DRIVER From 9649a900e9826c052fb78774606d58ce303683b8 Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Mon, 3 Aug 2020 18:20:26 +0200 Subject: [PATCH 15/20] tweak to sigil of rites The sigil of rites now needs two invokers to be able to be summoned. --- .../clockcult/clock_scriptures/scripture_scripts.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm index 72ba95e764..8819544928 100644 --- a/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm +++ b/code/modules/antagonists/clockcult/clock_scriptures/scripture_scripts.dm @@ -86,9 +86,11 @@ descname = "Sigil, Access to rites" name = "Sigil of Rites" desc = "Places a sigil that, when interacted with, will allow for a variety of rites to be performed on the sigil. These usually require power cells, clockwork power, and some other components." - invocations = list("Engine, allow us..", ".. to be blessed with rites.") + invocations = list("Engine, allow us..", ".. to be blessed with your rites.") channel_time = 80 power_cost = 1400 + invokers_required = 2 + multiple_invokers_used = TRUE whispered = TRUE object_path = /obj/effect/clockwork/sigil/rite creator_message = "A sigil of Rites appears beneath you. It will allow you to perform certain rites, given sufficient materials and power." From 619a2e47b910fd7e7bdc858a78d3a30f46516310 Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Mon, 3 Aug 2020 18:37:05 +0200 Subject: [PATCH 16/20] tiny phrasing change --- .../modules/antagonists/clockcult/clock_items/clock_augments.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/clockcult/clock_items/clock_augments.dm b/code/modules/antagonists/clockcult/clock_items/clock_augments.dm index 0b9c31f4e0..f6419d1889 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_augments.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_augments.dm @@ -21,7 +21,7 @@ if(obj_flags & EMAGGED) return obj_flags |= EMAGGED - to_chat(usr, "You swipe the emag on [src], hoping it'll achieve something..") + to_chat(usr, "You emag [src], hoping it'll achieve something..") //Brass claw implant. Holds the brass claw from brass_claw.dm and can extend / retract it at will. /obj/item/organ/cyberimp/arm/clockwork/claw From a2155f9e91cb674652a8271eebef878070804b4e Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Mon, 3 Aug 2020 22:13:50 +0200 Subject: [PATCH 17/20] more codersprite clockie arm implants now have a somewhat different looking sprite (totally not just a normal arm implant recolor) --- .../clockcult/clock_items/clock_augments.dm | 1 + icons/obj/surgery.dmi | Bin 41110 -> 41575 bytes 2 files changed, 1 insertion(+) diff --git a/code/modules/antagonists/clockcult/clock_items/clock_augments.dm b/code/modules/antagonists/clockcult/clock_items/clock_augments.dm index f6419d1889..2131aa7160 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_augments.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_augments.dm @@ -5,6 +5,7 @@ name = "clock-themed arm-mounted implant" var/clockwork_desc = "According to Ratvar, this really shouldn't exist. Tell Him about this immediately." syndicate_implant = TRUE + icon_state = "clock_arm_implant" /obj/item/organ/cyberimp/arm/clockwork/ui_action_click() if(is_servant_of_ratvar(owner) || (obj_flags & EMAGGED)) //If you somehow manage to steal a clockie's implant AND have an emag AND manage to get it implanted for yourself, good on ya! diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 3996f0ead26a5f6173f931c0a89e63ddf4b96534..8db1156dea8129b6c9725c092baa9854ebe4998d 100755 GIT binary patch delta 21721 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 D@WF|) From 160991c5b4d404c9f72b6171ade4c8ce45510305 Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Mon, 3 Aug 2020 23:15:14 +0200 Subject: [PATCH 18/20] Caps claw damage The claw can now only have a maximum of bonus 18 damage caused by combo (after 10 consecutive hits against the same target), making it 33 damage total. The target shouldn't be standing by then anyways if they attacked them consecutively, but if they still are, better to have this capped. --- .../clockcult/clock_items/clock_weapons/brass_claw.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm index de8d7c09ef..9498ed85a6 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm @@ -24,6 +24,7 @@ var/mob/living/last_attacked var/combo = 0 var/damage_per_combo = 2 + var/maximum_combo_damage = 18 //33 damage on max stacks. Usually the target will already be dead by then but if they somehow aren't, better to have this capped /obj/item/clockwork/brass_claw/Initialize() . = ..() @@ -31,7 +32,7 @@ /obj/item/clockwork/brass_claw/examine(mob/user) if(is_servant_of_ratvar(user)) - clockwork_desc += "\nIt has [combo] combo stacks built up against the current target, causing [combo * damage_per_combo] bonus damage." + clockwork_desc += "\nIt has [combo] combo stacks built up against the current target, causing [min(maximum_combo_damage, combo * damage_per_combo)] bonus damage." . = ..() clockwork_desc = initial(clockwork_desc) @@ -47,4 +48,4 @@ combo++ else combo += 3 - target.adjustBruteLoss(combo * damage_per_combo) + target.adjustBruteLoss(min(maximum_combo_damage, combo * damage_per_combo)) From 276d35a6937a70352e535a430684533efe661cf9 Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Tue, 4 Aug 2020 16:59:02 +0200 Subject: [PATCH 19/20] moves a check a few lines tin --- .../antagonists/clockcult/clock_effects/clock_sigils.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index 99a5f02cdd..6a7ff474a3 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -425,7 +425,8 @@ return if(!is_servant_of_ratvar(user)) return - generate_all_rites() + if(!GLOB.all_clockwork_rites.len) //Did we already generate the list? + generate_all_rites() var/list/possible_rites = list() for(var/datum/clockwork_rite/R in GLOB.all_clockwork_rites) possible_rites[R] = R @@ -444,8 +445,6 @@ to_chat(user, infotext) /obj/effect/clockwork/sigil/rite/proc/generate_all_rites() //The first time someone uses a sigil of rites, all the rites are actually generated. No need to have a bunch of random datums laying around all the time. - if(GLOB.all_clockwork_rites.len) //we already generated the list - return for(var/V in subtypesof(/datum/clockwork_rite)) var/datum/clockwork_rite/R = new V GLOB.all_clockwork_rites += R From 831ea372f82a3c4189905445e8264400fd82235e Mon Sep 17 00:00:00 2001 From: DeltaFire Date: Tue, 4 Aug 2020 17:33:57 +0200 Subject: [PATCH 20/20] buncha stuff adds a check if the sigil is already busy which I forgot before, makes the brass claw wounds-2 compartible and changes some misc stuff --- .../antagonists/clockcult/clock_effects/clock_sigils.dm | 3 +++ .../antagonists/clockcult/clock_helpers/clock_rites.dm | 6 +++--- .../clockcult/clock_items/clock_weapons/brass_claw.dm | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index 6a7ff474a3..454870d1e1 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -427,6 +427,9 @@ return if(!GLOB.all_clockwork_rites.len) //Did we already generate the list? generate_all_rites() + if(performing_rite) + to_chat(user, "Someone is already performing a rite here!") + return var/list/possible_rites = list() for(var/datum/clockwork_rite/R in GLOB.all_clockwork_rites) possible_rites[R] = R diff --git a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm index cb44f7e299..7dabb18f03 100644 --- a/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm +++ b/code/modules/antagonists/clockcult/clock_helpers/clock_rites.dm @@ -5,9 +5,9 @@ //The base clockwork rite. This should never be visible /datum/clockwork_rite - var/name = "Some random clockwork rite that you should not be able to see" //The name of the rite - var/desc = "Someone forgot to set the description of this rite.. you shouldn't see this." //What does this rite do? Shown to cultists if they choose 'Show Info' after selecting the rite. - var/list/required_ingredients = list() //What does this rite require? + var/name = "Rite of THE frog" //The name of the rite + var/desc = "This rite is used to summon the legendary frog whose-name-shall-not-be-spoken, ender of many worlds." //What does this rite do? Shown to cultists if they choose 'Show Info' after selecting the rite. + var/list/required_ingredients = list(/obj/item/clockwork) //What does this rite require? var/power_cost = 0 //How much power does this rite cost.. or does it even add power? var/requires_human = FALSE //Does the rite require a ../carbon/human on the rune? var/must_be_servant = TRUE //If the above is true, does the human need to be a servant? diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm index 9498ed85a6..340f01f6f8 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/brass_claw.dm @@ -17,7 +17,7 @@ armour_penetration = 20 hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") - sharpness = IS_SHARP + sharpness = SHARP_EDGED wound_bonus = 5 bare_wound_bonus = 15 total_mass = TOTAL_MASS_HAND_REPLACEMENT