From 6eef1d884991bfea09f5b093c3d1c510aafbf62e Mon Sep 17 00:00:00 2001 From: Azarak Date: Sun, 27 Sep 2020 23:38:19 +0200 Subject: [PATCH] [SEMI-MODULAR] CUSTOMIZATION - Modular Augmentation system (#1000) * limbs finished * only styles left * STYLESzz * a * UI tweaks * more UI tweak * Update preferences.dm * cyborg limbs 2 stronk * Validation * aa * Render key fix --- code/datums/traits/negative.dm | 4 + .../living/carbon/human/human_update_icons.dm | 8 + code/modules/surgery/bodyparts/_bodyparts.dm | 8 +- .../customization/__DEFINES/augment.dm | 27 +++ .../modules/customization/__DEFINES/lists.dm | 4 + .../customization/__HELPERS/global_lists.dm | 16 ++ .../customization/_globalvars/lists.dm | 18 ++ .../icons/mob/augmentation/bs2ipc.dmi | Bin 0 -> 1946 bytes .../icons/mob/augmentation/bshipc.dmi | Bin 0 -> 1914 bytes .../icons/mob/augmentation/hi2ipc.dmi | Bin 0 -> 1340 bytes .../icons/mob/augmentation/hsiipc.dmi | Bin 0 -> 3302 bytes .../icons/mob/augmentation/mcgipc.dmi | Bin 0 -> 1334 bytes .../icons/mob/augmentation/sgmipc.dmi | Bin 0 -> 1197 bytes .../icons/mob/augmentation/wtmipc.dmi | Bin 0 -> 1433 bytes .../icons/mob/augmentation/xm2ipc.dmi | Bin 0 -> 1315 bytes .../icons/mob/augmentation/xmgipc.dmi | Bin 0 -> 2994 bytes .../icons/mob/augmentation/zhpipc.dmi | Bin 0 -> 1340 bytes .../modules/client/augment/_augment.dm | 22 +++ .../modules/client/augment/implants.dm | 37 ++++ .../modules/client/augment/limbs.dm | 88 ++++++++++ .../modules/client/augment/organs.dm | 69 ++++++++ .../modules/client/preferences.dm | 159 ++++++++++++++++-- .../modules/client/preferences_savefile.dm | 18 ++ .../mob/dead/new_player/preferences_setup.dm | 7 +- .../mob/living/carbon/carbon_update_icons.dm | 6 +- .../mob/living/carbon/human/species.dm | 12 +- .../modules/surgery/bodyparts/_bodyparts.dm | 2 +- .../surgery/bodyparts/robot_bodyparts.dm | 15 ++ .../modules/surgery/bodyparts/robot_parts.dm | 17 ++ .../modules/surgery/robot_restore_looks.dm | 1 + .../modules/customization/readme.md | 1 + tgstation.dme | 7 + 32 files changed, 519 insertions(+), 27 deletions(-) create mode 100644 modular_skyrat/modules/customization/__DEFINES/augment.dm create mode 100644 modular_skyrat/modules/customization/icons/mob/augmentation/bs2ipc.dmi create mode 100644 modular_skyrat/modules/customization/icons/mob/augmentation/bshipc.dmi create mode 100644 modular_skyrat/modules/customization/icons/mob/augmentation/hi2ipc.dmi create mode 100644 modular_skyrat/modules/customization/icons/mob/augmentation/hsiipc.dmi create mode 100644 modular_skyrat/modules/customization/icons/mob/augmentation/mcgipc.dmi create mode 100644 modular_skyrat/modules/customization/icons/mob/augmentation/sgmipc.dmi create mode 100644 modular_skyrat/modules/customization/icons/mob/augmentation/wtmipc.dmi create mode 100644 modular_skyrat/modules/customization/icons/mob/augmentation/xm2ipc.dmi create mode 100644 modular_skyrat/modules/customization/icons/mob/augmentation/xmgipc.dmi create mode 100644 modular_skyrat/modules/customization/icons/mob/augmentation/zhpipc.dmi create mode 100644 modular_skyrat/modules/customization/modules/client/augment/_augment.dm create mode 100644 modular_skyrat/modules/customization/modules/client/augment/implants.dm create mode 100644 modular_skyrat/modules/customization/modules/client/augment/limbs.dm create mode 100644 modular_skyrat/modules/customization/modules/client/augment/organs.dm create mode 100644 modular_skyrat/modules/customization/modules/surgery/bodyparts/robot_bodyparts.dm create mode 100644 modular_skyrat/modules/customization/modules/surgery/bodyparts/robot_parts.dm diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index b3f3eef2d94..d98a8abe039 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -408,6 +408,8 @@ medical_record_text = "Patient suffers from prosopagnosia and cannot recognize faces." hardcore_value = 5 +//SKYRAT EDIT REMOVAL BEGIN - CUSTOMIZATION +/* /datum/quirk/prosthetic_limb name = "Prosthetic Limb" desc = "An accident caused you to lose one of your limbs. Because of this, you now have a random prosthetic!" @@ -441,6 +443,8 @@ /datum/quirk/prosthetic_limb/post_add() to_chat(quirk_holder, "Your [slot_string] has been replaced with a surplus prosthetic. It is fragile and will easily come apart under duress. Additionally, \ you need to use a welding tool and cables to repair it, instead of bruise packs and ointment.") +*/ +//SKYRAT EDIT REMOVAL END /datum/quirk/pushover name = "Pushover" diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index f925a4c9ae7..1f8b9f4042d 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -591,14 +591,22 @@ generate/load female uniform sprites matching all previously decided variables for(var/X in bodyparts) var/obj/item/bodypart/BP = X . += "-[BP.body_zone]" + //SKYRAT EDIT REMOVAL BEGIN - CUSTOMIZATION + /* if(BP.status == BODYPART_ORGANIC) . += "-organic" else . += "-robotic" + */ + //SKYRAT EDIT REMOVAL END if(BP.use_digitigrade) . += "-digitigrade[BP.use_digitigrade]" if(BP.dmg_overlay_type) . += "-[BP.dmg_overlay_type]" + //SKYRAT EDIT ADDITION BEGIN - CUSTOMIZATION + if(BP.organic_render) + . += "-OR" + //SKYRAT EDIT ADDITION END if(HAS_TRAIT(src, TRAIT_HUSK)) . += "-husk" diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 335c13e0dd4..ed651686e68 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -95,6 +95,7 @@ /// If something is currently grasping this bodypart and trying to staunch bleeding (see [/obj/item/self_grasp]) var/obj/item/self_grasp/grasped_by var/rendered_bp_icon //SKYRAT EDIT ADDITION - CUSTOMIZATION + var/organic_render = TRUE //SKYRAT EDIT ADDITION - CUSTOMIZATION /obj/item/bodypart/Initialize(mapload) @@ -736,8 +737,10 @@ if(change_icon_to_default) if(status == BODYPART_ORGANIC) icon = DEFAULT_BODYPART_ICON_ORGANIC + organic_render = TRUE //SKYRAT EDIT ADDITION - CUSTOMIZATION else if(status == BODYPART_ROBOTIC) icon = DEFAULT_BODYPART_ICON_ROBOTIC + organic_render = FALSE //SKYRAT EDIT ADDITION - CUSTOMIZATION if(owner) owner.updatehealth() @@ -777,8 +780,9 @@ should_draw_greyscale = FALSE var/datum/species/S = H.dna.species - species_id = S.limbs_id - rendered_bp_icon = S.limbs_icon + if(organic_render) //SKYRAT EDIT ADDITION - CUSTOMIZATION + species_id = S.limbs_id + rendered_bp_icon = S.limbs_icon //SKYRAT EDIT ADDITION - CUSTOMIZATION species_flags_list = H.dna.species.species_traits if(S.use_skintones) diff --git a/modular_skyrat/modules/customization/__DEFINES/augment.dm b/modular_skyrat/modules/customization/__DEFINES/augment.dm new file mode 100644 index 00000000000..b17a66a1cdb --- /dev/null +++ b/modular_skyrat/modules/customization/__DEFINES/augment.dm @@ -0,0 +1,27 @@ +#define AUGMENT_CATEGORY_NONE "ERROR" +#define AUGMENT_SLOT_NONE "ERROR" +//ALL OF THOSE DEFINES NEED TO BE UNIQUE!!! +//Limbs +#define AUGMENT_CATEGORY_LIMBS "Limbs" +#define AUGMENT_SLOT_HEAD "Head" +#define AUGMENT_SLOT_CHEST "Chest" +#define AUGMENT_SLOT_L_ARM "Left Arm" +#define AUGMENT_SLOT_R_ARM "Right Arm" +#define AUGMENT_SLOT_L_LEG "Left Leg" +#define AUGMENT_SLOT_R_LEG "Right Leg" +//Organs +#define AUGMENT_CATEGORY_ORGANS "Organs" +#define AUGMENT_SLOT_HEART "Heart" +#define AUGMENT_SLOT_LUNGS "Lungs" +#define AUGMENT_SLOT_LIVER "Liver" +#define AUGMENT_SLOT_STOMACH "Stomach" +#define AUGMENT_SLOT_EYES "Eyes" +#define AUGMENT_SLOT_TONGUE "Tongue" +//Implants - we add an "implant" suffix because the defines need to be unique +#define AUGMENT_CATEGORY_IMPLANTS "Implants" +#define AUGMENT_SLOT_BRAIN_IMPLANT "Brain implant" +#define AUGMENT_SLOT_CHEST_IMPLANT "Chest implant" +#define AUGMENT_SLOT_LEFT_ARM_IMPLANT "Left Arm implant" +#define AUGMENT_SLOT_RIGHT_ARM_IMPLANT "Right Arm implant" +#define AUGMENT_SLOT_EYES_IMPLANT "Eyes implant" +#define AUGMENT_SLOT_MOUTH_IMPLANT "Mouth implant" diff --git a/modular_skyrat/modules/customization/__DEFINES/lists.dm b/modular_skyrat/modules/customization/__DEFINES/lists.dm index 8dcf8448b51..2973dbdfaa6 100644 --- a/modular_skyrat/modules/customization/__DEFINES/lists.dm +++ b/modular_skyrat/modules/customization/__DEFINES/lists.dm @@ -7,3 +7,7 @@ GLOBAL_LIST_EMPTY(body_marking_sets) GLOBAL_LIST_EMPTY(loadout_items) GLOBAL_LIST_EMPTY(loadout_category_to_subcategory_to_items) + +GLOBAL_LIST_EMPTY(augment_items) +GLOBAL_LIST_EMPTY(augment_categories_to_slots) +GLOBAL_LIST_EMPTY(augment_slot_to_items) diff --git a/modular_skyrat/modules/customization/__HELPERS/global_lists.dm b/modular_skyrat/modules/customization/__HELPERS/global_lists.dm index 48a43ddc34b..a9fbd76e809 100644 --- a/modular_skyrat/modules/customization/__HELPERS/global_lists.dm +++ b/modular_skyrat/modules/customization/__HELPERS/global_lists.dm @@ -3,6 +3,7 @@ make_body_marking_references() make_body_marking_set_references() make_loadout_references() + make_augment_references() //We're loading donators here because it's the least intrusive way modularly load_donators() @@ -54,3 +55,18 @@ if(!GLOB.loadout_category_to_subcategory_to_items[L.category][L.subcategory]) GLOB.loadout_category_to_subcategory_to_items[L.category][L.subcategory] = list() GLOB.loadout_category_to_subcategory_to_items[L.category][L.subcategory] += L.path + +/proc/make_augment_references() + // Here we build the global loadout lists + for(var/path in subtypesof(/datum/augment_item)) + var/datum/augment_item/L = path + if(initial(L.path)) + L = new path() + GLOB.augment_items[L.path] = L + + if(!GLOB.augment_slot_to_items[L.slot]) + GLOB.augment_slot_to_items[L.slot] = list() + if(!GLOB.augment_categories_to_slots[L.category]) + GLOB.augment_categories_to_slots[L.category] = list() + GLOB.augment_categories_to_slots[L.category] += L.slot + GLOB.augment_slot_to_items[L.slot] += L.path diff --git a/modular_skyrat/modules/customization/_globalvars/lists.dm b/modular_skyrat/modules/customization/_globalvars/lists.dm index a2a46e32423..6a4f94df03e 100644 --- a/modular_skyrat/modules/customization/_globalvars/lists.dm +++ b/modular_skyrat/modules/customization/_globalvars/lists.dm @@ -54,3 +54,21 @@ GLOBAL_LIST_INIT(marking_zones, list(BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_L_ GLOBAL_LIST_INIT(preference_breast_sizes, list("Flatchested","A","B","C","D","E","F","G","H")) GLOBAL_LIST_INIT(preference_balls_sizes, list("Small","Average","Big","Enormous")) + +GLOBAL_LIST_INIT(robotic_styles_list, list("None" = "None", + "Surplus" = 'icons/mob/augmentation/surplus_augments.dmi', + "Cyborg" = 'icons/mob/augmentation/augments.dmi', + "Engineering" = 'icons/mob/augmentation/augments_engineer.dmi', + "Mining" = 'icons/mob/augmentation/augments_mining.dmi', + "Security" = 'icons/mob/augmentation/augments_security.dmi', + "Morpheus Cyberkinetics" = 'modular_skyrat/modules/customization/icons/mob/augmentation/mcgipc.dmi', + "Bishop Cyberkinetics" = 'modular_skyrat/modules/customization/icons/mob/augmentation/bshipc.dmi', + "Bishop Cyberkinetics 2.0" = 'modular_skyrat/modules/customization/icons/mob/augmentation/bs2ipc.dmi', + "Hephaestus Industries" = 'modular_skyrat/modules/customization/icons/mob/augmentation/hsiipc.dmi', + "Hephaestus Industries 2.0" = 'modular_skyrat/modules/customization/icons/mob/augmentation/hi2ipc.dmi', + "Shellguard Munitions Standard Series" = 'modular_skyrat/modules/customization/icons/mob/augmentation/sgmipc.dmi', + "Ward-Takahashi Manufacturing" = 'modular_skyrat/modules/customization/icons/mob/augmentation/wtmipc.dmi', + "Xion Manufacturing Group" = 'modular_skyrat/modules/customization/icons/mob/augmentation/xmgipc.dmi', + "Xion Manufacturing Group 2.0" = 'modular_skyrat/modules/customization/icons/mob/augmentation/xm2ipc.dmi', + "Zeng-Hu Pharmaceuticals" = 'modular_skyrat/modules/customization/icons/mob/augmentation/zhpipc.dmi' + )) diff --git a/modular_skyrat/modules/customization/icons/mob/augmentation/bs2ipc.dmi b/modular_skyrat/modules/customization/icons/mob/augmentation/bs2ipc.dmi new file mode 100644 index 0000000000000000000000000000000000000000..3c25aa6aa3000abcf265f1a8004052ce89a83a64 GIT binary patch literal 1946 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 literal 0 HcmV?d00001 diff --git a/modular_skyrat/modules/customization/icons/mob/augmentation/hsiipc.dmi b/modular_skyrat/modules/customization/icons/mob/augmentation/hsiipc.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a15c7b94e24cab140c2a99d603c93f3624fddccb GIT binary patch literal 3302 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 literal 0 HcmV?d00001 diff --git a/modular_skyrat/modules/customization/icons/mob/augmentation/mcgipc.dmi b/modular_skyrat/modules/customization/icons/mob/augmentation/mcgipc.dmi new file mode 100644 index 0000000000000000000000000000000000000000..63b79807d9edefd006a9637724ab60e6c03313ef GIT binary patch literal 1334 zcmV-61005u}0{{R3yb+fl0000*P)t-s0001Y zcX!6d#+{v=|9O4R&d#}_|I5qEo`nD1-QBslx&Qxnp`oGwd3=+3|BZS7|9N|gdH?F_ z>Hq)$!NI|@va-IuzEk1kh5!Hn0d!JMQvg8b*k%9#0EK!~Sad{Xb7OL8aCB*JZU6vy zoKseCa&`CgQ*iP1C^0t`#5P2zDvHlZO(#NCVo@$ZRXIeNl|z(S8L5dW zxD+WXxca$(!vp{Y!A}Iq=O<|Z00a(6L_t(|ob8e_5) zcBetd1`*75^v(271^C1mUycQbgJBqkVXO!_QpFGKSP`yrBu^(0KLrX$bO9nJARz~- z@(Ur%o;-sB!b^-tPy(goqpXlA`jiw39XrZ@@&WNRgkzHRxs+U1D8{2NM=V$9X-ETk z`GD~9dJf|Ca|267p)9cIONw@wTVU1)eqefgJb)Mcq0dF6X zKE!BZ&idpga7bBUK1R_BNp3(R@95%*m`m}Z!c=|&Gx`Y?IE9272qmbn2#hS>BbZW^rZ9#7C5 zu!CAP@JP8^*Z``*`W}p%@vtrgnYi^`EbV@410L=(#LC(6`8}8ek9Z29a&`#Iw~^X_ z19f#Ggm)oUfxuoH)f_yk9YEY2`-i#9)GSy4pz+ODadCruo{XpG-)I(yPGY!=mtQ(MO z&=yC1GE(xG*VXe_gzVncy~EL7?B*}Fc!#3_`RqEBJi;dL&@4v7Fbu<}BUns|7yAC? zq+ePNlXGVNwa#3VJb3l6@e-4BW(sMQc@jCV7MLbhZk|-{UjKzx$ZVOKx|jd0B9PYb zp(ktba9G7%dWiO+C~hOf6kJeY*dd+`g+?OwZIVTIu z!7Om`!kl;%D9(-fcFhCf^#(tk=I(b{;Qj82}LCc)NkkxF&&1^^Fq+LX(AB seEe<{_$m~R8irvQhG7_nVHiJ;-005u_0{{R3dEt5<0000gP)t-s00014 zR#GM=CO|+yI5;>nGc##wYVbZjtTHlaXlPbeRv{rF92^_~002Rn)CT|n00DGTPE!Ct z=GbNc004!0R9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM z;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+CqA(#SBZ-=C9|j)q=}0&ttc@!6~s0~ zR+W>QPEb`5QDzkpWma-VYHll`6vr4GYSXg^Osu*bz=SVDVkb0J2;3FXT z0vtm@Vqxsij{x6=487Lx*?EqyMj-J27C+z1KX#I{e|By#2nq`Nql&VNa^55Vjx{4W zFR?Yd-<6x0B_pbyFN*sUyCHk>$d*x_8`ivsp*XOmjAv(sc$V1>2hwWDI4+Rl_Orgz z3Y6YkGuU~Tn;w4g%$jn%zQ|2K*$uy}TT|wXhb5ZyFr3>TEtV}xeQwG{_L+KJcn7U~ z@NCHI%&+0N&!gd@)y%VD_Fx?P-4d?T(ehq_yf_}eD{1|1+`vp8Zj~E~;H$MX%M$pi8DXP;UtYMBV^nMKubO-^`4Ihnk2mvyh z%v?qT6CFZ;ygnKoI2Z;6{Uc&&LdV+fSDKN2l9vq;I~x}JX);wZ3f_LyBY48WU=Z`1 zq!~WT$BkmprswLrP?nbh8j2>Nnpm`5JW^X&?Cz>9Wa)+k%U>Z6CzK(3CZ#&4vmAD* zZJ`7^UA3fJIN-7Y-*XP%{_;Wsq-@Vm6Jeg`nI$gOxJeRv-a|Ll8ncSi^IlR_Yc6qA z6y(MZE0UBG@nAJc;SrO3hcv8`q#|PNCb6~xS|Gk_ACruViwXRxu}O-q;VrlUsXZpR zMY=+gQHO?JI3Eri0Q00000 LNkvXXu0mjf=L8)X literal 0 HcmV?d00001 diff --git a/modular_skyrat/modules/customization/icons/mob/augmentation/wtmipc.dmi b/modular_skyrat/modules/customization/icons/mob/augmentation/wtmipc.dmi new file mode 100644 index 0000000000000000000000000000000000000000..eb8bf8e727a2b0d56df8be463811bb22534b394f GIT binary patch literal 1433 zcmV;K1!nq*P)005u}0{{R3yb+fl00012P)t-s0000c zCMN6a>i_@%*Vor7Dk`k3tWQr*S65d;LPAtjR6#*Om6erdW@bo8NSOft)6>%&931cO z@BaY*)YR0>X8+6p|2sQ7wzjs5i;KX(z-eh|aBy((bqGNK0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6# za*U0*I5Sc+(=$pSoZ^zil2jm5sVF|NC|8M#GbOXA7^I1dGp#5wHxx#O zPHH+4W)Y(*IU}{WgrKU7)Wj5Aij);x{anCd0ssKDPXrICPi+7I1YSu*K~#90?VRg! zn=lZCy{s&QkmERp)FgTT=d6U&=`_|}z!0YGelz)#6{~|TARWuz?F_>(4C8+RRwy}- za{da{39u^v-?=$*l=&;SS0?~pROp=7-z3N074qYR4f< z^zCZ&cloiNk{qE_TGdX*Z9hiH42pT1`*k-E>Rid%|M|eQCZrA<5^+1+k)1 zesDNpl3-bgkfix+J5eB_yDI}>!X&9FfqWA6Ft0J(=dbnpcDuGEGEYguuv8wyFbu;m z48t&t|A@6+zekzi5ArPK5`Llb3$-BnbrkxdVKoChEM#N;NevUc86G^WF`CPc-&YjY zUe2W}HVs_|>nxLIjV@OCgP+bGJDp&qNs@-3eBYnKYR*Y5d3#Hc1gb4B!2~RLdrLrB zev_fSJ#Ejg^PtyMta9oxZYD6gC@aJm<2Pt2qpEsCeJ&mpr4Ac*v7(2^K3-i3h0|1x zTk6wH65Ma5(5YrI-hWQ_Jvg_IipEI|xL;{aE|8vYn(-fT({XK<0CbJ^mP>WGxTH~NF3Kwf}k&gBQ0WFe0(V5yAeVsi%# z!!Z7JARO5v6A%I$M{!RBkDP!4?*PD&$7a%EZiLnlz30z_K=6L{n=a|AGL*u!8otFz zg?YzOaVuVkmAvbDK;T%wd0ODpQ&LELIXRQAc27_91$vk9w7?srKxkV?0?Fl6j^#2l z1*RUl)lcs^_;{KDkT+R)wt+ke37Do}3-n3JkeVk1rU{Q>EHYbQI|?A1 zD0ffG^${j@aAfKq!-0F(u?8SuR@ZVZn7_MCw;<;B15>{kM-*n! z80J?C!mAK>{8|I}Zv^Dk3_nT4)r`Ub+!)ya+!)ya+!)ya+!oatzb#Rn@!JlK0k|nD z56>{xBitb4^{KAYADy5cAs?j8Ek0kLe?Fhj&z@3Pzg)VP?(#y_P&ZIj{cBbH#iksG z>b0*bXy!`%@qA9}x$`siu4}s2Yj=I^s1|Cvq@e3MIG5vRNWr9^Odtx3qd@Xy+zkEo zdhG{N;2Tu^>2#t6reI&e+gyS0J_>v%SIi$n-}l1@xteI;(w+K&7C7{$?gF!4_V6Cl z7>ta-k6{=-Xn{MZy3=r>1zv_zS3R&=f*Z5rze>!DssQ0Ds4z$dB-6ffSVl}B|ESl4 n*FTuwFbu;m48t%CV^Mwr2Ye!LDX}J+00000NkvXXu0mjfy4#bw literal 0 HcmV?d00001 diff --git a/modular_skyrat/modules/customization/icons/mob/augmentation/xm2ipc.dmi b/modular_skyrat/modules/customization/icons/mob/augmentation/xm2ipc.dmi new file mode 100644 index 0000000000000000000000000000000000000000..3be3166a846b35ceb0197570f2c456d3197759cf GIT binary patch literal 1315 zcmV+;1>E|HP)005u}0{{R3yb+fl0000&P)t-s0001g zGXNnWA*e$Dyh{LRXlPbeRsjD1Gcz*)004l1fSH*ybS?m^L;xHd9My0vW|=c4CMIUg zGnvdYnLPkcPfz;|vh@G}00DGTPE!Ct=GbNc004!0R9JLGWpiV4X>fFDZ*Bkpc$`yK zaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBS zC_b?$SBZ-=C9|j)q=}0&ttc@!6~s0~R+W>QPEb`2QD)^3Wma-VYHqb(b&} z=O;ywLFHZCE}AXA4=kK-zm9T)Gy?a$T-#1?!E2vN48t%CY9b^t>;!q1?W)Gv|B0r?9!KEp#q z-U4Zd8>BJFcOq%+;ax0-U>XuK?FRGxHg=pr)(#$p&O312Z(VTc1FIT_VHk$-4ffq6 zxE*l1a;SHJ**&NR*mIlZClIb@bpY?-o-Sx*cX$^|`H%*GqCt1`qA4S80@Pqoq_#(p zPZ0Oq#k>GMLG*ZdY|`W#GHikvKtl*eWW7T=ISK}72qd4RA>ccdDxA9j zJHOswKDjhV$e;6)-T_D-;3>lTKF)iRS|K0Ex|i~UjzAQi6K)Z6o3#dGOb%UQ`6>7)B;vX;CfL|U04B1q{0R2;g0EqLVZf#}G9s~M2C-PGz+ZQ#KR zJELmUD)<5NBfbg(9-jP&uWEzppP(g!8Ztbd{D`ma66%P^1aupGJ>sj_;p-7!-S^Xt z-;I00>t|BW()C=X?>V{e<>OcVh2e6!41v9!dcB2fxLsMj9|JLsOanJgSs(kg7W?5s z3xdnQRiF>|Aq@Ax>en$0!*ClfW&JYVNDkwbEpg4De;V|x0YA|RCSDI@@O(b=21z7? z>?f=-_D_TT$QgL}X`1|lA7f*<(=g=?(g?m&7q9e320e{I&l(&b5AXfs!Rgdu8fpfI ziU0Sy!xyXd{5{RAQ)e+c`SXozdH;F%BO0j4b*cuc{Zlcp(O=W7j~xudFbu;m48t&% Z^B17M7q*l8QQH6j002ovPDHLkV1mLESzrJF literal 0 HcmV?d00001 diff --git a/modular_skyrat/modules/customization/icons/mob/augmentation/xmgipc.dmi b/modular_skyrat/modules/customization/icons/mob/augmentation/xmgipc.dmi new file mode 100644 index 0000000000000000000000000000000000000000..20e94250dd6490e43328ee434ff2409897819207 GIT binary patch literal 2994 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 KP`eWD5cMDWXwY*2 literal 0 HcmV?d00001 diff --git a/modular_skyrat/modules/customization/icons/mob/augmentation/zhpipc.dmi b/modular_skyrat/modules/customization/icons/mob/augmentation/zhpipc.dmi new file mode 100644 index 0000000000000000000000000000000000000000..327f0145fe572f2fcc53f5241331aa32b5846e19 GIT binary patch literal 1340 zcmV-C1;hG@P)005u}0{{R3yb+fl0000>P)t-s0002q z-r&2t#6LejFE1}2A0Ph!|DK+n{{Wehk&)Qg*vrey92^|g)z!wv#%yeCS65d6006zc zy=G=+&d$!n#KfPUpT)(+Pft(7ehzs60004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pS zoZ^zil2jm5sVF|NC|8M#GbOXA7^I1dGp#5wHx2J~@5fgVQ-L|+WH!wmxn7^bu?K5Wj7zQ^gfNdiMzAZ#jd zQghs0AixygP!tFQ3Kz{m4ksuCjHRj24>(yUuo^Fr+A;#g2o5bXAU2q`NR?ariBIxx zr<*QBD?kFb8)R#sUtm-&&~LfdScUQ1fuk^iO9@kUEPDgA$@Jx|x(;0BRO>Sg!!V4o z2-&+`b+B;xMLmbQa(;1qesXir$G$=z^c+YK3;QZibs!17fG2?g?2)zip_(S1Vtz!!hC{tTF-51KhtoO&>@Z1-3~${D z#K2GMG{)V;mr{md7>4nWp(TsQ!j})~fKCLUD~<9CjDAub+Ww#~mL2H-QlGLQWqi)31kDjQyPCrAHUK}D?{B16e{UK#lc?^s9_C4C>G!* zqK*i9=2HYMZ@UorF(l?5_d*PkhT<&s0_FUof-a^Yl{1JCKu3k8XEKPc3M%v&hG7_n zgco*ui6C$4=}0KQFeUSn^)UOF9Hfc?$(*hi@6az&NS6W~9eD@nT>8g4NY~0W1;Z^w zf!-z9P9kwGIzb_%)SZ+YOBeeE0s&lb{P8=-7lh+EV0OX(LiWC(ZUZ31AQUDcV3a=Z z%+E;Rt6r+)eaR?E?xp+%B8_6fKmB$PGu+9#Y#7tQQMx<}6wFDX(1noAO9Te*y)@Ac z2&5?_`0~foUji#1q=WSkm?J23VZH&@?sEi%VoQ>qBPb~pM^FlY{EUe=kOgAJ7YgF@ zDUbvXq<2vq17GfWvwxcTE`E9t11L;$D==aJ3^dtT;BwMpuUcTGU7wB;L74^fOkrR8GM@jm`SF=9j|0mW7{>)G}WNvES!6{L*4eB~Kn60mVIbSZ9^9%O_^)=qE zx8};)Pi=E0+SjuEwN2L8o`hQzIh`+WZ*P|~cZ;W6)7`q}#@gT8YjeNf+e_JgX~`I` z?fcvqo<6d`4^}`IyN>>|b_&tGi489>Ht|jYo-45JvcRt81U$MJWA|YFpGY9x123@a z8WK4BA#A%(dImpPf$if#5qvy2JGGz)$^uga=jtQ>PiEV{TgMarkings" dat += "Background" dat += "Loadout" //If you change the index of this tab, change all the logic regarding tab + dat += "Augmentation" dat += "" dat += "
" @@ -271,23 +278,29 @@ dat += "[PREVIEW_PREF_LOADOUT]" dat += "[PREVIEW_PREF_NAKED]" dat += "" - if(character_settings_tab == 4) //if loadout - dat += "" - dat += "Remaining loadout points: [loadout_points]" - dat += "" - dat += "" - dat += "Reset Loadout" - dat += "" - else - dat += "" - dat += "Mismatched parts: [(mismatched_customization) ? "Enabled" : "Disabled"]" - dat += "" + switch(character_settings_tab) + if(4) //Loadout + dat += "" + dat += "Remaining loadout points: [loadout_points]" + dat += "" + dat += "" + dat += "Reset Loadout" + dat += "" + if(5) //Augments + dat += "" + if(!(!SSquirks || !SSquirks.quirks.len)) + dat += "Remaining quirk points: [GetQuirkBalance()]" + dat += "" + else + dat += "" + dat += "Mismatched parts: [(mismatched_customization) ? "Enabled" : "Disabled"]" + dat += "" - dat += "" - dat += " Advanced colors: [(allow_advanced_colors) ? "Enabled" : "Disabled"]" - if(allow_advanced_colors) - dat += "Reset colors
" - dat += "" + dat += "" + dat += " Advanced colors: [(allow_advanced_colors) ? "Enabled" : "Disabled"]" + if(allow_advanced_colors) + dat += "Reset colors
" + dat += "" dat += "" dat += "" @@ -778,6 +791,75 @@ dat += "
Thank you for staffing the server! Enjoy those cool items
" else dat += "
You can support us on our patreon to help us run the servers, and get access to cool loadout items, and more points!
" + if(5) //Augmentations + if(!pref_species.can_augment) + dat += "Sorry, but your species doesn't support augmentations" + else if(!SSquirks || !SSquirks.quirks.len) + dat += "The quirk subsystem is still initializing! Try again in a minute." + else + dat += "" + for(var/category_name in GLOB.augment_categories_to_slots) + dat += "" + dat += "
" + dat += "

[category_name]:

" + var/list/slot_list = GLOB.augment_categories_to_slots[category_name] + for(var/slot_name in slot_list) + var/link = "href='?_src_=prefs;task=augment_slot;slot=[slot_name]'" + var/datum/augment_item/chosen_item + if(augments[slot_name]) + chosen_item = GLOB.augment_items[augments[slot_name]] + if(chosen_augment_slot && chosen_augment_slot == slot_name) + link = "class='linkOn'" + var/print_name = "" + if(chosen_item) + print_name = chosen_item.name + var/font_color = "#AAAAFF" + if(chosen_item.cost != 0) + font_color = chosen_item.cost > 0 ? "#AAFFAA" : "#FFAAAA" + print_name = "[print_name]" + dat += "" + dat += "" + if(category_name == AUGMENT_CATEGORY_LIMBS && chosen_item) + var/datum/augment_item/limb/chosen_limb = chosen_item + var/print_style = "None" + if(augment_limb_styles[slot_name]) + print_style = augment_limb_styles[slot_name] + if(chosen_limb.uses_robotic_styles) + dat += "" + dat += "" + dat += "
[slot_name]: [print_name]
Style: [print_style]
[chosen_item ? "[chosen_item.description]" : ""]
" + dat += "
" + if(chosen_augment_slot) + var/list/augment_list = GLOB.augment_slot_to_items[chosen_augment_slot] + if(augment_list) + dat += "" + dat += "

[chosen_augment_slot]

" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + var/even = FALSE + for(var/type_thing in augment_list) + var/datum/augment_item/aug_datum = GLOB.augment_items[type_thing] + var/datum/augment_item/current + even = !even + if(augments[chosen_augment_slot]) + current = GLOB.augment_items[augments[chosen_augment_slot]] + var/aug_link = "class='linkOff'" + var/name_print = aug_datum.name + if (current == aug_datum) + aug_link = "class='linkOn' href='?_src_=prefs;task=set_augment;type=[type_thing]'" + name_print = "[name_print] (Remove)" + else if(CanBuyAugment(aug_datum, current)) + aug_link = "href='?_src_=prefs;task=set_augment;type=[type_thing]'" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "
NameCostDescription
[name_print]
[aug_datum.cost]
[aug_datum.description]
" + dat += "
" if (1) // Game Preferences dat += "
" @@ -1310,6 +1392,9 @@ for(var/V in all_quirks) var/datum/quirk/T = SSquirks.quirks[V] bal -= initial(T.value) + for(var/key in augments) + var/datum/augment_item/aug = GLOB.augment_items[augments[key]] + bal -= aug.cost return bal /datum/preferences/proc/GetPositiveQuirkCount() @@ -1410,6 +1495,31 @@ return TRUE switch(href_list["task"]) + if("augment_style") + needs_update = TRUE + var/slot_name = href_list["slot"] + var/new_style = input(user, "Choose your character's [slot_name] augmentation style:", "Character Preference") as null|anything in GLOB.robotic_styles_list + if(new_style) + if(new_style == "None") + if(augment_limb_styles[slot_name]) + augment_limb_styles -= slot_name + else + augment_limb_styles[slot_name] = new_style + if("set_augment") + if(pref_species.can_augment) + needs_update = TRUE + var/typed_path = text2path(href_list["type"]) + var/datum/augment_item/target_aug = GLOB.augment_items[typed_path] + var/datum/augment_item/current + if(augments[target_aug.slot]) + current = GLOB.augment_items[augments[target_aug.slot]] + if(current == target_aug) + augments -= target_aug.slot + else if(CanBuyAugment(target_aug, current)) + augments[target_aug.slot] = typed_path + if("augment_slot") + var/slot_name = href_list["slot"] + chosen_augment_slot = slot_name if("change_loadout_customization") needs_update = TRUE var/path = text2path(href_list["item"]) @@ -2549,6 +2659,10 @@ /*if("tail_lizard" in pref_species.default_features) character.dna.species.mutant_bodyparts |= "tail_lizard"*/ + if(length(augments)) + for(var/key in augments) + var/datum/augment_item/aug = GLOB.augment_items[augments[key]] + aug.apply(character, character_setup, src) if(icon_updates) character.update_body() @@ -2631,3 +2745,16 @@ return LOADOUT_POINTS_MAX_DONATOR else return LOADOUT_POINTS_MAX + +/datum/preferences/proc/CanBuyAugment(datum/augment_item/target_aug, datum/augment_item/current_aug) + //Check biotypes + if(!(pref_species.inherent_biotypes & target_aug.allowed_biotypes)) + return + var/quirk_points = GetQuirkBalance() + var/leverage = 0 + if(current_aug) + leverage += current_aug.cost + if((quirk_points+leverage)>= target_aug.cost) + return TRUE + else + return FALSE diff --git a/modular_skyrat/modules/customization/modules/client/preferences_savefile.dm b/modular_skyrat/modules/customization/modules/client/preferences_savefile.dm index 60b9f535948..4a75f832ff7 100644 --- a/modular_skyrat/modules/customization/modules/client/preferences_savefile.dm +++ b/modular_skyrat/modules/customization/modules/client/preferences_savefile.dm @@ -435,6 +435,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car READ_FILE(S["mismatched_customization"] , mismatched_customization) READ_FILE(S["allow_advanced_colors"] , allow_advanced_colors) + READ_FILE(S["augments"] , augments) + READ_FILE(S["augment_limb_styles"] , augment_limb_styles) + features = SANITIZE_LIST(features) mutant_bodyparts = SANITIZE_LIST(mutant_bodyparts) body_markings = SANITIZE_LIST(body_markings) @@ -483,6 +486,18 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(!(name in GLOB.body_markings_per_limb[zone])) body_markings[zone] -= name + augments = SANITIZE_LIST(augments) + //validating augments + for(var/aug_slot in augments) + var/datum/augment_item/aug = GLOB.augment_items[augments[aug_slot]] + if(!aug) + augments -= aug_slot + augment_limb_styles = SANITIZE_LIST(augment_limb_styles) + //validating limb styles + for(var/key in augment_limb_styles) + if(!GLOB.robotic_styles_list[key]) + augment_limb_styles -= key + validate_species_parts() needs_update = TRUE @@ -577,6 +592,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["mismatched_customization"] , mismatched_customization) WRITE_FILE(S["allow_advanced_colors"] , allow_advanced_colors) + WRITE_FILE(S["augments"] , augments) + WRITE_FILE(S["augment_limb_styles"] , augment_limb_styles) + return TRUE diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/preferences_setup.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/preferences_setup.dm index 966f2bf131d..24ac5d8fa71 100644 --- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/preferences_setup.dm +++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/preferences_setup.dm @@ -100,6 +100,9 @@ features[key] = new_features[key] mutant_bodyparts = pref_species.get_random_mutant_bodyparts(features) body_markings = pref_species.get_random_body_markings(features) + //We reset the quirk-based stuff + augments = list() + all_quirks = list() /datum/preferences/proc/reset_colors() for(var/key in mutant_bodyparts) @@ -148,15 +151,13 @@ mannequin.job = previewJob.title previewJob.equip(mannequin, TRUE, preference_source = parent) mannequin.underwear_visibility = NONE - mannequin.update_body() //Unfortunately, due to a certain case we need to update this just in case if(PREVIEW_PREF_LOADOUT) mannequin.underwear_visibility = NONE equip_preference_loadout(mannequin, TRUE, previewJob) mannequin.underwear_visibility = NONE - mannequin.update_body() if(PREVIEW_PREF_NAKED) mannequin.underwear_visibility = UNDERWEAR_HIDE_UNDIES | UNDERWEAR_HIDE_SHIRT | UNDERWEAR_HIDE_SOCKS - mannequin.update_body() //Unfortunately, due to a certain case we need to update this just in case + mannequin.update_body() //Unfortunately, due to a certain case we need to update this just in case COMPILE_OVERLAYS(mannequin) parent.show_character_previews(new /mutable_appearance(mannequin)) diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/carbon_update_icons.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/carbon_update_icons.dm index 15e751c6850..f72e289b211 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/carbon_update_icons.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/carbon_update_icons.dm @@ -45,10 +45,8 @@ . += "-digitigrade[BP.use_digitigrade]" if(BP.animal_origin) . += "-[BP.animal_origin]" - if(BP.status == BODYPART_ORGANIC) - . += "-organic" - else - . += "-robotic" + if(BP.organic_render) + . += "-OR" if(HAS_TRAIT(src, TRAIT_HUSK)) . += "-husk" diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm index 66f9b2bf129..3a6a25557df 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm @@ -10,6 +10,8 @@ var/eyes_icon ///How are we treated regarding processing reagents, by default we process them as if we're organic var/reagent_flags = PROCESS_ORGANIC + ///Whether a species can use augmentations in preferences + var/can_augment = TRUE /datum/species/proc/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour) var/list/standing = list() @@ -275,11 +277,13 @@ default_features = null mutant_bodyparts = list() can_have_genitals = FALSE + can_augment = FALSE /datum/species/ethereal default_features = null mutant_bodyparts = list() can_have_genitals = FALSE + can_augment = FALSE /datum/species/proc/get_random_features() var/list/returned = MANDATORY_FEATURE_LIST @@ -373,9 +377,15 @@ fly = new fly.Grant(C) + var/robotic_limbs if(ROBOTIC_LIMBS in species_traits) - for(var/obj/item/bodypart/B in C.bodyparts) + robotic_limbs = TRUE + for(var/obj/item/bodypart/B in C.bodyparts) + if(robotic_limbs) B.change_bodypart_status(BODYPART_ROBOTIC, FALSE, TRUE) + B.organic_render = TRUE + else if (B.status == BODYPART_ORGANIC) + B.organic_render = TRUE C.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/species, multiplicative_slowdown=speedmod) diff --git a/modular_skyrat/modules/customization/modules/surgery/bodyparts/_bodyparts.dm b/modular_skyrat/modules/customization/modules/surgery/bodyparts/_bodyparts.dm index 52814c96f1d..fb85841b73a 100644 --- a/modular_skyrat/modules/customization/modules/surgery/bodyparts/_bodyparts.dm +++ b/modular_skyrat/modules/customization/modules/surgery/bodyparts/_bodyparts.dm @@ -33,7 +33,7 @@ if((body_zone != BODY_ZONE_HEAD && body_zone != BODY_ZONE_CHEST)) should_draw_gender = FALSE - if(species_id) + if(organic_render) if(should_draw_greyscale) limb.icon = rendered_bp_icon || 'icons/mob/human_parts_greyscale.dmi' //Skyrat change - customization if(should_draw_gender) diff --git a/modular_skyrat/modules/customization/modules/surgery/bodyparts/robot_bodyparts.dm b/modular_skyrat/modules/customization/modules/surgery/bodyparts/robot_bodyparts.dm new file mode 100644 index 00000000000..b675d156dc2 --- /dev/null +++ b/modular_skyrat/modules/customization/modules/surgery/bodyparts/robot_bodyparts.dm @@ -0,0 +1,15 @@ +/obj/item/bodypart/l_arm/robot/weak + brute_reduction = 0 + burn_reduction = 0 + +/obj/item/bodypart/r_arm/robot/weak + brute_reduction = 0 + burn_reduction = 0 + +/obj/item/bodypart/l_leg/robot/weak + brute_reduction = 0 + burn_reduction = 0 + +/obj/item/bodypart/r_leg/robot/weak + brute_reduction = 0 + burn_reduction = 0 diff --git a/modular_skyrat/modules/customization/modules/surgery/bodyparts/robot_parts.dm b/modular_skyrat/modules/customization/modules/surgery/bodyparts/robot_parts.dm new file mode 100644 index 00000000000..ef3b524c01b --- /dev/null +++ b/modular_skyrat/modules/customization/modules/surgery/bodyparts/robot_parts.dm @@ -0,0 +1,17 @@ +/obj/item/bodypart/l_arm/robot/l_arm + organic_render = FALSE + +/obj/item/bodypart/r_arm/robot/r_arm + organic_render = FALSE + +/obj/item/bodypart/l_leg/robot/l_leg + organic_render = FALSE + +/obj/item/bodypart/r_leg/robot/r_leg + organic_render = FALSE + +/obj/item/bodypart/chest/robot/chest + organic_render = FALSE + +/obj/item/bodypart/head/robot/head + organic_render = FALSE diff --git a/modular_skyrat/modules/customization/modules/surgery/robot_restore_looks.dm b/modular_skyrat/modules/customization/modules/surgery/robot_restore_looks.dm index 6a9224ad5da..4c1d0edfe42 100644 --- a/modular_skyrat/modules/customization/modules/surgery/robot_restore_looks.dm +++ b/modular_skyrat/modules/customization/modules/surgery/robot_restore_looks.dm @@ -35,6 +35,7 @@ if(O.status == BODYPART_ROBOTIC) O.rendered_bp_icon = target.dna.species.limbs_icon O.species_id = target.dna.species.limbs_id + O.organic_render = TRUE if(O.body_zone == BODY_ZONE_L_LEG || O.body_zone == BODY_ZONE_R_LEG) if(target.dna.mutant_bodyparts["legs"] && target.dna.mutant_bodyparts["legs"][MUTANT_INDEX_NAME] == "Digitigrade Legs") O.use_digitigrade = FULL_DIGITIGRADE diff --git a/modular_skyrat/modules/customization/readme.md b/modular_skyrat/modules/customization/readme.md index 4f33da6409a..5eb248a8a79 100644 --- a/modular_skyrat/modules/customization/readme.md +++ b/modular_skyrat/modules/customization/readme.md @@ -35,6 +35,7 @@ Re-writes how mutant bodyparts exist and how they're handled. Adds in a per limb ./code/modules/mob/living/carbon/human/human_defense.dm > /mob/living/carbon/human/emp_act() ./code/modules/mob/living/carbon/human.dm > /mob/living/carbon/human/revive() > APPENDED ./code/modules/reagents/chemistry/reagents/food_reagents.dm > datum/reagent/consumable/on_mob_life() + ./code/datums/traits/negative.dm > /datum/quirk/prosthetic_limb ./code/modules/mob/living/carbon/human/species.dm > /datum/species/regenerate_organs() > APPENDED diff --git a/tgstation.dme b/tgstation.dme index 0923fdb94a1..fa8f9cf583e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3280,6 +3280,7 @@ #include "modular_skyrat\modules\blueshield\code\modules\jobs\job_types\blueshield.dm" #include "modular_skyrat\modules\blueshield\code\modules\projectiles\guns\energy\special.dm" #include "modular_skyrat\modules\cryosleep\code\cryopod.dm" +#include "modular_skyrat\modules\customization\__DEFINES\augment.dm" #include "modular_skyrat\modules\customization\__DEFINES\inventory.dm" #include "modular_skyrat\modules\customization\__DEFINES\lists.dm" #include "modular_skyrat\modules\customization\__DEFINES\loadout.dm" @@ -3296,6 +3297,10 @@ #include "modular_skyrat\modules\customization\modules\admin\donator_list.dm" #include "modular_skyrat\modules\customization\modules\client\preferences.dm" #include "modular_skyrat\modules\customization\modules\client\preferences_savefile.dm" +#include "modular_skyrat\modules\customization\modules\client\augment\_augment.dm" +#include "modular_skyrat\modules\customization\modules\client\augment\implants.dm" +#include "modular_skyrat\modules\customization\modules\client\augment\limbs.dm" +#include "modular_skyrat\modules\customization\modules\client\augment\organs.dm" #include "modular_skyrat\modules\customization\modules\client\loadout\_loadout.dm" #include "modular_skyrat\modules\customization\modules\client\loadout\backpack.dm" #include "modular_skyrat\modules\customization\modules\client\loadout\glasses.dm" @@ -3380,6 +3385,8 @@ #include "modular_skyrat\modules\customization\modules\surgery\robot_healing.dm" #include "modular_skyrat\modules\customization\modules\surgery\robot_restore_looks.dm" #include "modular_skyrat\modules\customization\modules\surgery\bodyparts\_bodyparts.dm" +#include "modular_skyrat\modules\customization\modules\surgery\bodyparts\robot_bodyparts.dm" +#include "modular_skyrat\modules\customization\modules\surgery\bodyparts\robot_parts.dm" #include "modular_skyrat\modules\customization\modules\surgery\organs\ears.dm" #include "modular_skyrat\modules\customization\modules\surgery\organs\genitals.dm" #include "modular_skyrat\modules\customization\modules\surgery\organs\ipc.dm"