From df2980db460e44e2536e00a30b73a28c07bc4f0f Mon Sep 17 00:00:00 2001 From: skull132 Date: Fri, 10 Jul 2015 22:42:49 +0300 Subject: [PATCH] Revert "Synthetics revised" --- aurora.dme | 1 - code/__HELPERS/mobs.dm | 62 +- code/__HELPERS/text.dm | 3 - code/__HELPERS/type2type.dm | 8 - code/game/jobs/jobs.dm | 285 -------- code/game/mecha/mech_fabricator.dm | 21 +- code/game/objects/items/robot/robot_parts.dm | 327 ++++----- .../objects/items/weapons/surgery_tools.dm | 670 ++++++++++++++++++ code/game/objects/structures/mirror.dm | 54 +- code/modules/client/preferences.dm | 656 +++++++++-------- code/modules/client/preferences_savefile.dm | 48 +- code/modules/mob/living/carbon/brain/MMI.dm | 2 - .../mob/living/carbon/brain/brain_item.dm | 15 +- .../mob/living/carbon/brain/posibrain.dm | 1 - code/modules/mob/living/carbon/human/human.dm | 79 --- .../mob/living/carbon/human/human_species.dm | 2 +- .../mob/living/carbon/human/species.dm | 132 +--- .../mob/living/carbon/human/update_icons.dm | 186 ++--- code/modules/mob/living/carbon/species.dm | 8 - .../mob/living/silicon/robot/component.dm | 5 - .../mob/new_player/preferences_setup.dm | 612 +++++++++++++++- code/modules/organs/organ_external.dm | 144 ++-- code/modules/organs/organ_internal.dm | 19 - code/modules/organs/organ_objects.dm | 5 - code/modules/organs/synth_skin.dm | 362 ---------- code/modules/surgery/organs_internal.dm | 8 +- icons/mob/human_face.dmi | Bin 53916 -> 63793 bytes icons/mob/human_races/r_human_grey.dmi | Bin 5283 -> 0 bytes icons/obj/synthskin.dmi | Bin 869 -> 0 bytes 29 files changed, 1961 insertions(+), 1754 deletions(-) delete mode 100644 code/modules/organs/synth_skin.dm delete mode 100644 icons/mob/human_races/r_human_grey.dmi delete mode 100644 icons/obj/synthskin.dmi diff --git a/aurora.dme b/aurora.dme index e37f87e6..86733683 100644 --- a/aurora.dme +++ b/aurora.dme @@ -1240,7 +1240,6 @@ #include "code\modules\organs\organ_internal.dm" #include "code\modules\organs\organ_objects.dm" #include "code\modules\organs\pain.dm" -#include "code\modules\organs\synth_skin.dm" #include "code\modules\organs\wound.dm" #include "code\modules\paperwork\carbonpaper.dm" #include "code\modules\paperwork\clipboard.dm" diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 5536e6b4..454206da 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -1,41 +1,41 @@ -proc/valid_sprite_accessories(gender,species,test_list) - var/list/valid = list() - for(var/style in test_list) - var/datum/sprite_accessory/S = test_list[style] +proc/random_hair_style(gender, species = "Human") + var/h_style = "Bald" + + var/list/valid_hairstyles = list() + for(var/hairstyle in hair_styles_list) + var/datum/sprite_accessory/S = hair_styles_list[hairstyle] + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue if( !(species in S.species_allowed)) continue - if (S.gender!=NEUTER) - if (S.gender!=gender) - continue - valid[style] = S - return valid - + valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] -proc/get_valid_hairstyles(gender, species) - return valid_sprite_accessories(gender,species,hair_styles_list) - - -proc/get_valid_facialhairstyles(gender, species) - return valid_sprite_accessories(gender,species,facial_hair_styles_list) + if(valid_hairstyles.len) + h_style = pick(valid_hairstyles) - -proc/random_hair_style(gender, species) - var/h_style = "Bald" - if (species) - var/list/valid_hairstyles = get_valid_hairstyles(gender,species) - if(valid_hairstyles.len) - h_style = pick(valid_hairstyles) return h_style - -proc/random_facial_hair_style(gender, species) +proc/random_facial_hair_style(gender, species = "Human") var/f_style = "Shaved" - if (species) - var/list/valid_facialhairstyles = get_valid_facialhairstyles(gender,species) - if(valid_facialhairstyles.len) - f_style = pick(valid_facialhairstyles) - return f_style - + + var/list/valid_facialhairstyles = list() + for(var/facialhairstyle in facial_hair_styles_list) + var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue + if( !(species in S.species_allowed)) + continue + + valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] + + if(valid_facialhairstyles.len) + f_style = pick(valid_facialhairstyles) + + return f_style proc/random_name(gender, species = "Human") if(gender==FEMALE) return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index e13226e3..3bbd38bf 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -241,9 +241,6 @@ proc/checkhtml(var/t, var/whitelist = paper_tag_whitelist) //Returns a string with the first element of the string capitalized. /proc/capitalize(var/t as text) return uppertext(copytext(t, 1, 2)) + copytext(t, 2) - -/proc/capitalized(var/t as text) - return capitalize(lowertext(t)) //Centers text by adding spaces to either side of the string. /proc/dd_centertext(message, length) diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index d173eaea..b15a1116 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -81,15 +81,7 @@ while(length(hex) < placeholder) hex = text("0[]", hex) return hex - -/proc/colour_to_html(r,g,b) - return "'#[num2hex(r)][num2hex(g)][num2hex(b)]'" - - -/proc/htmlcolour_to_values(colour) - return list(hex2num(copytext(colour, 2, 4)),hex2num(copytext(colour, 4, 6)),hex2num(copytext(colour, 6, 8))) - // Concatenates a list of strings into a single string. A seperator may optionally be provided. /proc/list2text(list/ls, sep) diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index 79a43c30..221149cc 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -154,288 +154,3 @@ var/list/nonhuman_positions = list( return titles - - -// All this datum/preview/job stuff is for the preview icon when you're building your character. -// See code\modules\mob\new_player\preferences_setup.dm for where it's used - -datum/preview/job - var/job_type=null - var/job_index=null - var/uniform_icon='icons/mob/uniform.dmi' - var/uniform_state="grey_s" - var/mask_icon='icons/mob/mask.dmi' - var/mask_state=null - var/hat_state=null - var/hat_icon='icons/mob/head.dmi' - var/gloves_icon='icons/mob/hands.dmi' - var/gloves_state=null - var/shoes_icon='icons/mob/feet.dmi' - var/shoes_state="black" - var/jacket_icon='icons/mob/suit.dmi' - var/jacket_state=null - var/belt_icon='icons/mob/belt.dmi' - var/belt_state=null - var/backpack_01_icon='icons/mob/back.dmi' - var/backpack_01_state="backpack" - var/backpack_02_icon='icons/mob/back.dmi' - var/backpack_02_state="satchel-norm" - var/backpack_03_icon='icons/mob/back.dmi' - var/backpack_03_state="satchel" - -datum/preview/job/proc/blend_icon(var/icon/result_icon, var/current_icon, var/current_state, var/blend_type) - if (current_state) - result_icon.Blend(new /icon(current_icon,current_state),blend_type) - -datum/preview/job/proc/create_clothes_icon(var/backpack_selection) - var/icon/result=new /icon(uniform_icon, uniform_state) - blend_icon(result,shoes_icon,shoes_state,ICON_UNDERLAY) - blend_icon(result,gloves_icon,gloves_state,ICON_UNDERLAY) - blend_icon(result,belt_icon,belt_state,ICON_OVERLAY) - blend_icon(result,jacket_icon,jacket_state,ICON_OVERLAY) - blend_icon(result,mask_icon,mask_state,ICON_OVERLAY) - blend_icon(result,hat_icon,hat_state,ICON_OVERLAY) - switch(backpack_selection) - if(2) - blend_icon(result,backpack_01_icon,backpack_01_state,ICON_OVERLAY) - if(3) - blend_icon(result,backpack_02_icon,backpack_02_state,ICON_OVERLAY) - if(4) - blend_icon(result,backpack_03_icon,backpack_03_state,ICON_OVERLAY) - return result - - -datum/preview/job/engsec - job_type=ENGSEC - -datum/preview/job/engsec/captain - job_index=CAPTAIN - uniform_state="captain_s" - shoes_state="brown" - hat_state="captain" - backpack_02_state="satchel-cap" - -datum/preview/job/engsec/security - shoes_state="jackboots" - gloves_state="bgloves" - backpack_01_state="securitypack" - backpack_02_state="satchel-sec" - -datum/preview/job/engsec/security/head_of_security - job_index=HOS - uniform_state="hosred_s" - hat_state="hosberet" - -datum/preview/job/engsec/security/warden - job_index=WARDEN - uniform_state="warden_s" - -datum/preview/job/engsec/security/officer - job_index=OFFICER - uniform_state="secred_s" - -datum/preview/job/engsec/detective - job_index=DETECTIVE - uniform_state="wardentanclothes_s" - gloves_state="bgloves" - -datum/preview/job/engsec/forensics - job_index=FORENSICS - uniform_state="polsuit_s" - jacket_state="labcoat_open" - -datum/preview/job/engsec/chief_of_engineering - job_index=CHIEF - uniform_state="chief_s" - shoes_state="brown" - belt_state="utility" - hat_state="hardhat0_white" - backpack_01_state="engiepack" - backpack_02_state="satchel-eng" - -datum/preview/job/engsec/engineer - job_index=ENGINEER - uniform_state="engine_s" - shoes_state="orange" - belt_state="utility" - hat_state="hardhat0_yellow" - backpack_01_state="engiepack" - backpack_02_state="satchel-eng" - -datum/preview/job/engsec/atmospherics_tech - job_index=ATMOSTECH - uniform_state="atmos_s" - shoes_state="black" - gloves_state="bgloves" - belt_state="utility" - -datum/preview/job/engsec/security/security_cadet - job_index=INTERN_SEC - uniform_state="redshirt2_s" - hat_state="officerberet" - -datum/preview/job/engsec/security/engineering_assistant - job_index=INTERN_ENG - uniform_state="engine_s" - shoes_state="orange" - hat_state="e_beret_badge" - backpack_01_state="engiepack" - backpack_02_state="satchel-eng" - -datum/preview/job/engsec/ai - job_index=AI - -datum/preview/job/engsec/cyborg - job_index=CYBORG - -datum/preview/job/medsci - job_type=MEDSCI - shoes_state="white" - jacket_state="labcoat_open" - -datum/preview/job/medsci/science - backpack_02_state="satchel-tox" - uniform_state="sciencewhite_s" - jacket_state="labcoat_tox_open" - -datum/preview/job/medsci/science/research_director - job_index=RD - uniform_state="director_s" - shoes_state="brown" - -datum/preview/job/medsci/science/scientist - job_index=SCIENTIST - -datum/preview/job/medsci/science/xenobiologist - job_index=XENOBIOLOGIST - -datum/preview/job/medsci/science/intern - job_index=INTERN_SCI - jacket_state=null - -datum/preview/job/medsci/chemist - job_index=CHEMIST - uniform_state="chemistrywhite_s" - jacket_state="labcoat_chem_open" - backpack_02_state="satchel-chem" - -datum/preview/job/medsci/medical - backpack_01_state="medicalpack" - backpack_02_state="satchel-med" - -datum/preview/job/medsci/medical/chief_medical_officer - job_index=CMO - uniform_state="cmo_s" - shoes_state="brown" - jacket_state="labcoat_cmo_open" - -datum/preview/job/medsci/medical/emt - job_index=EMT - uniform_state="emt_s" - jacket_state="fr_jacket_open" - backpack_01_state="emtpack" - backpack_02_state="satchel-emt" - -datum/preview/job/medsci/medical/geneticist - job_index=GENETICIST - uniform_state="geneticswhite_s" - jacket_state="labcoat_gen_open" - backpack_01_state="backpack" - backpack_02_state="satchel-gen" - -datum/preview/job/medsci/medical/virologist - job_index=VIROLOGIST - uniform_state="virologywhite_s" - mask_state="sterile" - jacket_state="labcoat_vir_open" - backpack_02_state="satchel-vir" - -datum/preview/job/medsci/medical/intern - job_index=INTERN_MED - uniform_state="medical_s" - jacket_state=null - -datum/preview/job/medsci/roboticist - job_index=ROBOTICIST - uniform_state="robotics_s" - shoes_state="black" - gloves_state="bgloves" - -datum/preview/job/civilian - job_type=CIVILIAN - shoes_state="black" - -datum/preview/job/civilian/head_of_personnel - job_index=HOP - uniform_state="hop_s" - shoes_state="brown" - -datum/preview/job/civilian/bartender - job_index=BARTENDER - uniform_state="ba_suit_s" - -datum/preview/job/civilian/botanist - job_index=BOTANIST - uniform_state="hydroponics_s" - gloves_state="ggloves" - jacket_state="apron" - backpack_02_state="satchel-hyd" - -datum/preview/job/civilian/chef - job_index=CHEF - uniform_state="chef_s" - hat_state="chef" - -datum/preview/job/civilian/janitor - job_index=JANITOR - uniform_state="janitor_s" - -datum/preview/job/civilian/librarian - job_index=LIBRARIAN - uniform_state="red_suit_s" - -datum/preview/job/civilian/quartermaster - job_index=QUARTERMASTER - uniform_state="qm_s" - shoes_state="brown" - gloves_state="bgloves" - -datum/preview/job/civilian/cargo_tech - job_index=CARGOTECH - uniform_state="cargotech_s" - gloves_state="bgloves" - hat_state="flat_cap" - -datum/preview/job/civilian/miner - job_index=MINER - uniform_state="miner_s" - gloves_state="bgloves" - backpack_02_state="satchel-eng" - -datum/preview/job/civilian/internal_affairs - job_index=LAWYER - uniform_state="internalaffairs_s" - shoes_state="brown" - -datum/preview/job/civilian/chaplain - job_index=CHAPLAIN - uniform_state="chapblack_s" - -var/list/job_preview_data=null -proc/job_preview_list() - if (!job_preview_data) - job_preview_data=list() - for(var/job_preview_type in typesof(/datum/preview/job)-/datum/preview/job) - var/datum/preview/job/new_job = new job_preview_type() - var/type_string="[new_job.job_type]" - var/index_string="[new_job.job_index]" - if(!(type_string in job_preview_data)) - job_preview_data[type_string]=list() - if(new_job.job_index) - job_preview_data[type_string][index_string]=new_job - job_preview_data["DEFAULT"] = list(new/datum/preview/job()) - return job_preview_data - -proc/get_job_preview_for_index(job_type,job_index) - var/list/preview_list=job_preview_list() - return preview_list[job_type][job_index] \ No newline at end of file diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 8508f849..92d137a5 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -51,7 +51,6 @@ /obj/item/robot_parts/robot_component/actuator, /obj/item/robot_parts/robot_component/diagnosis_unit, /obj/item/robot_parts/robot_component/camera, - /obj/item/robot_parts/robot_component/law_computer, /obj/item/robot_parts/robot_component/armour ), "Ripley"=list( @@ -119,21 +118,23 @@ // /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/banana_mortar // /obj/item/mecha_parts/mecha_equipment/weapon/honker ), + "Robotic Upgrade Modules" = list( /obj/item/borg/upgrade/reset, /obj/item/borg/upgrade/rename, /obj/item/borg/upgrade/restart, /obj/item/borg/upgrade/vtec, /obj/item/borg/upgrade/tasercooler, - /obj/item/borg/upgrade/jetpack), - - "Synthetic Coverings" = list( /obj/item/weapon/synth_skin_spray, - /obj/item/weapon/synth_skin_cartridge/paint, - /obj/item/weapon/synth_skin_cartridge/skin, - /obj/item/weapon/synth_skin_cartridge/fur, - /obj/item/weapon/synth_skin_cartridge/scales), - - "Engineering Equipment"=list(/obj/item/mecha_parts/mecha_tracking)) + /obj/item/borg/upgrade/jetpack + ), + + + + + + + "Engineering Equipment"=list(/obj/item/mecha_parts/mecha_tracking) + ) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index ea698991..a37b2f5f 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -9,17 +9,6 @@ var/list/construction_cost = list("metal"=20000,"glass"=5000) var/list/part = null var/sabotaged = 0 //Emagging limbs can have repercussions when installed as prosthetics. - - -/obj/item/robot_parts/proc/attach_to_robot(mob/user as mob, obj/item/robot_parts/robot_suit/assembly as obj) - user << "\red This is not used to construct robots." - - -/obj/item/robot_parts/proc/move_into_robot(mob/user as mob, obj/item/robot_parts/robot_suit/assembly as obj) - user.drop_item() - src.loc = assembly - assembly.updateicon() - /obj/item/robot_parts/l_arm name = "robot left arm" @@ -28,12 +17,6 @@ construction_time = 200 construction_cost = list("metal"=18000) part = list("l_arm","l_hand") - attach_to_robot(mob/user as mob, obj/item/robot_parts/robot_suit/assembly as obj) - if(assembly.l_arm) - return - assembly.l_arm = src - move_into_robot(user,assembly) - /obj/item/robot_parts/r_arm name = "robot right arm" @@ -42,11 +25,6 @@ construction_time = 200 construction_cost = list("metal"=18000) part = list("r_arm","r_hand") - attach_to_robot(mob/user as mob, obj/item/robot_parts/robot_suit/assembly as obj) - if(assembly.r_arm) - return - assembly.r_arm = src - move_into_robot(user,assembly) /obj/item/robot_parts/l_leg name = "robot left leg" @@ -55,12 +33,6 @@ construction_time = 200 construction_cost = list("metal"=15000) part = list("l_leg","l_foot") - attach_to_robot(mob/user as mob, obj/item/robot_parts/robot_suit/assembly as obj) - if(assembly.l_leg) - return - assembly.l_leg = src - move_into_robot(user,assembly) - /obj/item/robot_parts/r_leg name = "robot right leg" @@ -69,12 +41,6 @@ construction_time = 200 construction_cost = list("metal"=15000) part = list("r_leg","r_foot") - attach_to_robot(mob/user as mob, obj/item/robot_parts/robot_suit/assembly as obj) - if(assembly.r_leg) - return - assembly.r_leg = src - move_into_robot(user,assembly) - /obj/item/robot_parts/chest name = "robot torso" @@ -84,18 +50,6 @@ construction_cost = list("metal"=40000) var/wires = 0.0 var/obj/item/weapon/cell/cell = null - attach_to_robot(mob/user as mob, obj/item/robot_parts/robot_suit/assembly as obj) - if(assembly.chest) - return - if(!(src.wires && src.cell)) - if (!src.wires) - user << "\blue You need to attach wires to it first!" - if (!src.cell) - user << "\blue You need to attach a cell to it first!" - return - assembly.chest = src - move_into_robot(user,assembly) - /obj/item/robot_parts/head name = "robot head" @@ -103,17 +57,8 @@ icon_state = "head" construction_time = 350 construction_cost = list("metal"=25000) - var/obj/item/robot_parts/robot_component/camera/camera = null - var/obj/item/robot_parts/robot_component/law_computer/law_computer = null - attach_to_robot(mob/user as mob, obj/item/robot_parts/robot_suit/assembly as obj) - if(assembly.head) - return - if(!src.camera) - user << "\blue You need to attach a camera to it first!" - return - assembly.head = src - move_into_robot(user,assembly) - + var/obj/item/device/flash/flash1 = null + var/obj/item/device/flash/flash2 = null /obj/item/robot_parts/robot_suit name = "robot endoskeleton" @@ -147,7 +92,6 @@ src.overlays += "r_leg+o" if(src.head) src.overlays += "head+o" - /obj/item/robot_parts/robot_suit/proc/check_completion() if(src.l_arm && src.r_arm) @@ -156,48 +100,9 @@ feedback_inc("cyborg_frames_built",1) return 1 return 0 - - -/obj/item/robot_parts/robot_suit/proc/allowed_to_build(mob/user as mob, obj/item/device/mmi/brain as obj) - if(!check_completion()) // not complete? not allowed - return - if(!check_allowed_to_install_brain(user,brain)) // not allowed to put the brain in there - return - return TRUE - - -/obj/item/robot_parts/robot_suit/proc/check_allowed_to_install_brain(mob/user as mob, obj/item/device/mmi/brain as obj) - if(!istype(loc,/turf)) - user << "\red You can't put the [brain] in, the frame has to be standing on the ground to be perfectly precise." - return - if(!brain.brainmob) - user << "\red Sticking an empty [brain] into the frame would sort of defeat the purpose." - return - if(!brain.brainmob.key) - var/ghost_can_reenter = 0 - if(brain.brainmob.mind) - for(var/mob/dead/observer/G in player_list) - if(G.can_reenter_corpse && G.mind == brain.brainmob.mind) - ghost_can_reenter = 1 - break - if(!ghost_can_reenter) - user << "The [brain] is completely unresponsive; there's no point." - return - if(brain.brainmob.stat == DEAD) - user << "\red Sticking a dead [brain] into the frame would sort of defeat the purpose." - return - if(brain.brainmob.mind in ticker.mode.head_revolutionaries) - user << "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [brain]." - return - if(jobban_isbanned(brain.brainmob, "Cyborg")) - user << "\red This [brain] does not seem to fit." - return - return TRUE - - + /obj/item/robot_parts/robot_suit/attackby(obj/item/W as obj, mob/user as mob) ..() - // HANDLE ED209 ASSEMBLY if(istype(W, /obj/item/stack/sheet/metal) && !l_arm && !r_arm && !l_leg && !r_leg && !chest && !head) var/obj/item/weapon/ed209_assembly/B = new /obj/item/weapon/ed209_assembly B.loc = get_turf(src) @@ -207,73 +112,132 @@ user.before_take_item(src) user.put_in_inactive_hand(B) del(src) - // HANDLE RENAME + if(istype(W, /obj/item/robot_parts/l_leg)) + if(src.l_leg) return + user.drop_item() + W.loc = src + src.l_leg = W + src.updateicon() + + if(istype(W, /obj/item/robot_parts/r_leg)) + if(src.r_leg) return + user.drop_item() + W.loc = src + src.r_leg = W + src.updateicon() + + if(istype(W, /obj/item/robot_parts/l_arm)) + if(src.l_arm) return + user.drop_item() + W.loc = src + src.l_arm = W + src.updateicon() + + if(istype(W, /obj/item/robot_parts/r_arm)) + if(src.r_arm) return + user.drop_item() + W.loc = src + src.r_arm = W + src.updateicon() + + if(istype(W, /obj/item/robot_parts/chest)) + if(src.chest) return + if(W:wires && W:cell) + user.drop_item() + W.loc = src + src.chest = W + src.updateicon() + else if(!W:wires) + user << "\blue You need to attach wires to it first!" + else + user << "\blue You need to attach a cell to it first!" + + if(istype(W, /obj/item/robot_parts/head)) + if(src.head) return + if(W:flash2 && W:flash1) + user.drop_item() + W.loc = src + src.head = W + src.updateicon() + else + user << "\blue You need to attach a flash to it first!" + + if(istype(W, /obj/item/device/mmi)) + var/obj/item/device/mmi/M = W + if(check_completion()) + if(!istype(loc,/turf)) + user << "\red You can't put the [W] in, the frame has to be standing on the ground to be perfectly precise." + return + if(!M.brainmob) + user << "\red Sticking an empty [W] into the frame would sort of defeat the purpose." + return + if(!M.brainmob.key) + var/ghost_can_reenter = 0 + if(M.brainmob.mind) + for(var/mob/dead/observer/G in player_list) + if(G.can_reenter_corpse && G.mind == M.brainmob.mind) + ghost_can_reenter = 1 + break + if(!ghost_can_reenter) + user << "The [W] is completely unresponsive; there's no point." + return + + if(M.brainmob.stat == DEAD) + user << "\red Sticking a dead [W] into the frame would sort of defeat the purpose." + return + + if(M.brainmob.mind in ticker.mode.head_revolutionaries) + user << "\red The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the [W]." + return + + if(jobban_isbanned(M.brainmob, "Cyborg")) + user << "\red This [W] does not seem to fit." + return + + var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc), unfinished = 1) + if(!O) return + + user.drop_item() + + O.mmi = W + O.invisibility = 0 + O.custom_name = created_name + O.updatename("Default") + + M.brainmob.mind.transfer_to(O) + + if(O.mind && O.mind.special_role) + O.mind.store_memory("In case you look at this after being borged, the objectives are only here until I find a way to make them not show up for you, as I can't simply delete them without screwing up round-end reporting. --NeoFite") + + O.job = "Cyborg" + + O.cell = chest.cell + O.cell.loc = O + W.loc = O//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame. + + // Since we "magically" installed a cell, we also have to update the correct component. + if(O.cell) + var/datum/robot_component/cell_component = O.components["power cell"] + cell_component.wrapped = O.cell + cell_component.installed = 1 + + feedback_inc("cyborg_birth",1) + O.Namepick() + + del(src) + else + user << "\blue The MMI must go in after everything else!" + if (istype(W, /obj/item/weapon/pen)) var/t = stripped_input(user, "Enter new robot name", src.name, src.created_name, MAX_NAME_LEN) if (!t) return if (!in_range(src, usr) && src.loc != usr) return - src.created_name = t - // HANDLE PART ASSEMBLY - if(istype(W,/obj/item/robot_parts)) - var/obj/item/robot_parts/part = W - part.attach_to_robot(user,src) - return - // HANDLE ROBOT CREATION - if(istype(W, /obj/item/device/mmi)) - var/obj/item/device/mmi/brain = W - if (allowed_to_build(user,brain)) // we are allowed to build this robot - user.drop_item() // drop this thing - if (src.head.law_computer) // do we have a law computer? If so, we're making a standard robot - create_robot(brain) - else // otherwise we're making a shell - create_shell(brain) - - -/obj/item/robot_parts/robot_suit/proc/create_robot(obj/item/device/mmi/brain as obj) - var/mob/living/silicon/robot/new_robot = new(get_turf(loc), unfinished = 1) - if(!new_robot) // something has gone poorly - return - // move the brain - new_robot.mmi = brain - new_robot.invisibility = 0 - new_robot.custom_name = created_name - new_robot.updatename("Default") - brain.brainmob.mind.transfer_to(new_robot) // shove that mob in the mmi - if(new_robot.mind && new_robot.mind.special_role) - new_robot.mind.store_memory("In case you look at this after being borged, the objectives are only here until I find a way to make them not show up for you, as I can't simply delete them without screwing up round-end reporting. --NeoFite") - new_robot.job = "Cyborg" - new_robot.cell = chest.cell - new_robot.cell.loc = new_robot - brain.loc = new_robot //Should fix cybros run time erroring when blown up. It got deleted before, along with the frame. - if(new_robot.cell) // Since we "magically" installed a cell, we also have to update the correct component. - var/datum/robot_component/cell_component = new_robot.components["power cell"] - cell_component.wrapped = new_robot.cell - cell_component.installed = 1 - feedback_inc("cyborg_birth",1) - new_robot.Namepick() - del(src) - - -/obj/item/robot_parts/robot_suit/proc/create_shell(obj/item/device/mmi/brain as obj) - var/mob/living/carbon/human/machine/new_shell = new(src.loc) - var/key=brain.brainmob.mind.key - brain.brainmob.mind.transfer_to(new_shell) // transfer brain - var/datum/organ/internal/brain/robot/brain_datum=new_shell.internal_organs_by_name["brain"] // put the brain in the head - brain_datum.machine_brain_type=brain.machine_brain_type - new_shell.real_name=brain.brainmob.real_name - give_option_to_rename(new_shell) - del(brain) - del(src) - -proc/give_option_to_rename(var/mob/living/carbon/human/new_shell) - spawn(0) - var/newname - newname = input(new_shell,"You are a newly created humanoid robot. Enter a name.", "Name change","") as text - if (newname != "") - new_shell.fully_replace_character_name(new_shell.real_name,newname) + src.created_name = t + + return /obj/item/robot_parts/chest/attackby(obj/item/W as obj, mob/user as mob) ..() @@ -297,47 +261,25 @@ proc/give_option_to_rename(var/mob/living/carbon/human/new_shell) user << "\blue You insert the wire!" return - -/obj/item/robot_parts/head/attack_hand(mob/user) - var/obj/item/inactive_item = user.get_inactive_hand() - if (src==inactive_item) // if we are clicking on this in our hand - if(src.law_computer) - src.law_computer.add_fingerprint(user) - user.put_in_active_hand(src.law_computer) - user << "You carefully remove \the [src.law_computer] from the head." - src.law_computer = null - return - else if(src.camera) - src.camera.add_fingerprint(user) - user.put_in_active_hand(src.camera) - user << "You carefully remove \the [src.camera] from the head." - src.camera = null - return - return ..() - - /obj/item/robot_parts/head/attackby(obj/item/W as obj, mob/user as mob) ..() if(istype(W, /obj/item/device/flash)) - user << "\red Why are you trying to put a weapon into a robots head? (use a camera component)" // should warn people who have done it the other way - if(istype(W, /obj/item/robot_parts/robot_component/camera)) - if(src.camera) - user << "\red You have already inserted the camera!" + if(istype(user,/mob/living/silicon/robot)) + user << "\red How do you propose to do that?" return + else if(src.flash1 && src.flash2) + user << "\blue You have already inserted the eyes!" + return + else if(src.flash1) + user.drop_item() + W.loc = src + src.flash2 = W + user << "\blue You insert the flash into the eye socket!" else user.drop_item() W.loc = src - src.camera = W - user << "\blue You carefully insert the camera into the camera socket." - else if(istype(W, /obj/item/robot_parts/robot_component/law_computer)) - if(src.law_computer) - user << "\red You have already inserted a law computer!" - return - else - user.drop_item() - W.loc = src - src.law_computer = W - user << "\blue You carefully insert the law computer into the robots head. This will slave the robot to the station AI." + src.flash1 = W + user << "\blue You insert the flash into the eye socket!" else if(istype(W, /obj/item/weapon/stock_parts/manipulator)) user << "\blue You install some manipulators and modify the head, creating a functional spider-bot!" new /mob/living/simple_animal/spiderbot(get_turf(loc)) @@ -346,7 +288,6 @@ proc/give_option_to_rename(var/mob/living/carbon/human/new_shell) del(src) return return - /obj/item/robot_parts/attackby(obj/item/W as obj, mob/user as mob) if(istype(W,/obj/item/weapon/card/emag)) diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 9cd1b0b2..fcd94603 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -21,6 +21,106 @@ w_class = 2.0 origin_tech = "materials=1;biotech=1" +/*HAHA, SUCK IT, 2000 LINES OF SPAGHETTI CODE! + +NOW YOUR JOB IOS DONE BY ONLY 500 LINES OF SPAGHETTI CODE! + +LOOK FOR SURGERY.DM*/ + +/* +/obj/item/weapon/retractor/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) + if(!istype(M)) + return + + var/mob/living/carbon/human/H = M + if(istype(H) && ( \ + (H.head && H.head.flags & HEADCOVERSEYES) || \ + (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \ + (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \ + )) + user << "\red You're going to need to remove that mask/helmet/glasses first." + return + + var/mob/living/carbon/monkey/Mo = M + if(istype(Mo) && ( \ + (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \ + )) + user << "\red You're going to need to remove that mask/helmet/glasses first." + return + + if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/slime))//Aliens don't have eyes./N + user << "\red You cannot locate any eyes on this creature!" + return + + switch(M.eye_op_stage) + if(1.0) + if(M != user) + for(var/mob/O in (viewers(M) - user - M)) + O.show_message("\red [M] is having his eyes retracted by [user].", 1) + M << "\red [user] begins to seperate your eyes with [src]!" + user << "\red You seperate [M]'s eyes with [src]!" + else + user.visible_message( \ + "\red [user] begins to have his eyes retracted.", \ + "\red You begin to pry open your eyes with [src]!" \ + ) + if(M == user && prob(25)) + user << "\red You mess up!" + if(istype(M, /mob/living/carbon/human)) + var/datum/organ/external/affecting = M:get_organ("head") + if(affecting.take_damage(15)) + M:UpdateDamageIcon() + M.updatehealth() + else + M.take_organ_damage(15) + + M:eye_op_stage = 2.0 + + else if(user.zone_sel.selecting == "chest") + switch(M:alien_op_stage) + if(3.0) + var/mob/living/carbon/human/H = M + if(!istype(H)) + return ..() + + if(H.wear_suit || H.w_uniform) + user << "\red You're going to need to remove that suit/jumpsuit first." + return + + var/obj/item/alien_embryo/A = locate() in M.contents + if(!A) + return ..() + user.visible_message("\red [user] begins to pull something out of [M]'s chest.", "\red You begin to pull the alien organism out of [M]'s chest.") + + spawn(20 + rand(0,50)) + if(!A || A.loc != M) + return + + if(M == user && prob(25)) + user << "\red You mess up!" + if(istype(M, /mob/living/carbon/human)) + var/datum/organ/external/affecting = M:get_organ("chest") + if(affecting.take_damage(30)) + M:UpdateDamageIcon() + else + M.take_organ_damage(30) + + if(A.stage > 3) + var/chance = 15 + max(0, A.stage - 3) * 10 + if(prob(chance)) + A.AttemptGrow(0) + M:alien_op_stage = 4.0 + + if(M) + user.visible_message("\red [user] pulls an alien organism out of [M]'s chest.", "\red You pull the alien organism out of [M]'s chest.") + A.loc = M.loc //alien embryo handles cleanup + + else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) + return ..() + + return +*/ + /* * Hemostat */ @@ -35,6 +135,125 @@ origin_tech = "materials=1;biotech=1" attack_verb = list("attacked", "pinched") +/* +/obj/item/weapon/hemostat/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) + if(!istype(M)) + return + + if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50)))) + return ..() + + if(user.zone_sel.selecting == "groin") + if(istype(M, /mob/living/carbon/human)) + switch(M:appendix_op_stage) + if(1.0) + if(M != user) + for(var/mob/O in (viewers(M) - user - M)) + O.show_message("\red [user] is beginning to clamp bleeders in [M]'s abdomen cut open with [src].", 1) + M << "\red [user] begins to clamp bleeders in your abdomen with [src]!" + user << "\red You clamp bleeders in [M]'s abdomen with [src]!" + M:appendix_op_stage = 2.0 + if(4.0) + if(M != user) + for(var/mob/O in (viewers(M) - user - M)) + O.show_message("\red [user] is removing [M]'s appendix with [src].", 1) + M << "\red [user] begins to remove your appendix with [src]!" + user << "\red You remove [M]'s appendix with [src]!" + for(var/datum/disease/D in M.viruses) + if(istype(D, /datum/disease/appendicitis)) + new /obj/item/weapon/reagent_containers/food/snacks/appendix/inflamed(get_turf(M)) + M:appendix_op_stage = 5.0 + return + new /obj/item/weapon/reagent_containers/food/snacks/appendix(get_turf(M)) + M:appendix_op_stage = 5.0 + return + + if (user.zone_sel.selecting == "eyes") + + var/mob/living/carbon/human/H = M + if(istype(H) && ( \ + (H.head && H.head.flags & HEADCOVERSEYES) || \ + (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \ + (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \ + )) + user << "\red You're going to need to remove that mask/helmet/glasses first." + return + + var/mob/living/carbon/monkey/Mo = M + if(istype(Mo) && ( \ + (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \ + )) + user << "\red You're going to need to remove that mask/helmet/glasses first." + return + + if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N + user << "\red You cannot locate any eyes on this creature!" + return + + switch(M.eye_op_stage) + if(2.0) + if(M != user) + for(var/mob/O in (viewers(M) - user - M)) + O.show_message("\red [M] is having his eyes mended by [user].", 1) + M << "\red [user] begins to mend your eyes with [src]!" + user << "\red You mend [M]'s eyes with [src]!" + else + user.visible_message( \ + "\red [user] begins to have his eyes mended.", \ + "\red You begin to mend your eyes with [src]!" \ + ) + if(M == user && prob(25)) + user << "\red You mess up!" + if(istype(M, /mob/living/carbon/human)) + var/datum/organ/external/affecting = M:get_organ("head") + if(affecting.take_damage(15)) + M:UpdateDamageIcon() + M.updatehealth() + else + M.take_organ_damage(15) + M:eye_op_stage = 3.0 + + else if(user.zone_sel.selecting == "chest") + if(M:alien_op_stage == 2.0 || M:alien_op_stage == 3.0) + var/mob/living/carbon/human/H = M + if(!istype(H)) + return ..() + + if(H.wear_suit || H.w_uniform) + user << "\red You're going to need to remove that suit/jumpsuit first." + return + + user.visible_message("\red [user] begins to dig around in [M]'s chest.", "\red You begin to dig around in [M]'s chest.") + + spawn(20 + (M:alien_op_stage == 3 ? 0 : rand(0,50))) + if(M == user && prob(25)) + user << "\red You mess up!" + if(istype(M, /mob/living/carbon/human)) + var/datum/organ/external/affecting = M:get_organ("chest") + if(affecting.take_damage(30)) + M:UpdateDamageIcon() + else + M.take_organ_damage(30) + + var/obj/item/alien_embryo/A = locate() in M.contents + if(A) + var/dat = "\blue You found an unknown alien organism in [M]'s chest!" + if(A.stage < 4) + dat += " It's small and weak, barely the size of a foetus." + if(A.stage > 3) + dat += " It's grown quite large, and writhes slightly as you look at it." + if(prob(10)) + A.AttemptGrow() + user << dat + M:alien_op_stage = 3.0 + else + user << "\blue You find nothing of interest." + + else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) + return ..() + + return +*/ /* * Cautery @@ -50,6 +269,81 @@ origin_tech = "materials=1;biotech=1" attack_verb = list("burnt") +/* +/obj/item/weapon/cautery/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) + if(!istype(M)) + return + + if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50)))) + return ..() + + if(user.zone_sel.selecting == "groin") + if(istype(M, /mob/living/carbon/human)) + switch(M:appendix_op_stage) + if(5.0) + if(M != user) + for(var/mob/O in (viewers(M) - user - M)) + O.show_message("\red [user] is beginning to cauterize the incision in [M]'s abdomen with [src].", 1) + M << "\red [user] begins to cauterize the incision in your abdomen with [src]!" + user << "\red You cauterize the incision in [M]'s abdomen with [src]!" + M:appendix_op_stage = 6.0 + for(var/datum/disease/appendicitis in M.viruses) + appendicitis.cure() + return + + if (user.zone_sel.selecting == "eyes") + + var/mob/living/carbon/human/H = M + if(istype(H) && ( \ + (H.head && H.head.flags & HEADCOVERSEYES) || \ + (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \ + (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \ + )) + user << "\red You're going to need to remove that mask/helmet/glasses first." + return + + var/mob/living/carbon/monkey/Mo = M + if(istype(Mo) && ( \ + (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \ + )) + user << "\red You're going to need to remove that mask/helmet/glasses first." + return + + if(istype(M, /mob/living/carbon/alien))//Aliens don't have eyes./N + user << "\red You cannot locate any eyes on this creature!" + return + + switch(M.eye_op_stage) + if(3.0) + if(M != user) + for(var/mob/O in (viewers(M) - user - M)) + O.show_message("\red [M] is having his eyes cauterized by [user].", 1) + M << "\red [user] begins to cauterize your eyes!" + user << "\red You cauterize [M]'s eyes with [src]!" + else + user.visible_message( \ + "\red [user] begins to have his eyes cauterized.", \ + "\red You begin to cauterize your eyes!" \ + ) + if(M == user && prob(25)) + user << "\red You mess up!" + if(istype(M, /mob/living/carbon/human)) + var/datum/organ/external/affecting = M:get_organ("head") + if(affecting.take_damage(15)) + M:UpdateDamageIcon() + M.updatehealth() + else + M.take_organ_damage(15) + M.sdisabilities &= ~BLIND + M.eye_stat = 0 + M:eye_op_stage = 0.0 + + else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) + return ..() + + return +*/ + /* * Surgical Drill */ @@ -97,6 +391,231 @@ "\red [user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.") return (BRUTELOSS) +/* +/obj/item/weapon/scalpel/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) + if(!istype(M)) + return ..() + + //if(M.mutations & HUSK) return ..() + + if((CLUMSY in user.mutations) && prob(50)) + M = user + return eyestab(M,user) + + if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50)))) + return ..() + + src.add_fingerprint(user) + + if(user.zone_sel.selecting == "groin") + if(istype(M, /mob/living/carbon/human)) + switch(M:appendix_op_stage) + if(0.0) + if(M != user) + for(var/mob/O in (viewers(M) - user - M)) + O.show_message("\red [M] is beginning to have his abdomen cut open with [src] by [user].", 1) + M << "\red [user] begins to cut open your abdomen with [src]!" + user << "\red You cut [M]'s abdomen open with [src]!" + M:appendix_op_stage = 1.0 + if(3.0) + if(M != user) + for(var/mob/O in (viewers(M) - user - M)) + O.show_message("\red [M] is beginning to have his appendix seperated with [src] by [user].", 1) + M << "\red [user] begins to seperate your appendix with [src]!" + user << "\red You seperate [M]'s appendix with [src]!" + M:appendix_op_stage = 4.0 + return + + if(user.zone_sel.selecting == "head" || istype(M, /mob/living/carbon/slime)) + + var/mob/living/carbon/human/H = M + if(istype(H) && ( \ + (H.head && H.head.flags & HEADCOVERSEYES) || \ + (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \ + (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \ + )) + user << "\red You're going to need to remove that mask/helmet/glasses first." + return + + var/mob/living/carbon/monkey/Mo = M + if(istype(Mo) && ( \ + (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \ + )) + user << "\red You're going to need to remove that mask/helmet/glasses first." + return + + switch(M:brain_op_stage) + if(0.0) + if(istype(M, /mob/living/carbon/slime)) + if(M.stat == 2) + for(var/mob/O in (viewers(M) - user - M)) + O.show_message("\red [M.name] is beginning to have its flesh cut open with [src] by [user].", 1) + M << "\red [user] begins to cut open your flesh with [src]!" + user << "\red You cut [M]'s flesh open with [src]!" + M:brain_op_stage = 1.0 + + return + + if(M != user) + for(var/mob/O in (viewers(M) - user - M)) + O.show_message("\red [M] is beginning to have his head cut open with [src] by [user].", 1) + M << "\red [user] begins to cut open your head with [src]!" + user << "\red You cut [M]'s head open with [src]!" + else + user.visible_message( \ + "\red [user] begins to cut open his skull with [src]!", \ + "\red You begin to cut open your head with [src]!" \ + ) + + if(M == user && prob(25)) + user << "\red You mess up!" + if(istype(M, /mob/living/carbon/human)) + var/datum/organ/external/affecting = M:get_organ("head") + if(affecting.take_damage(15)) + M:UpdateDamageIcon() + else + M.take_organ_damage(15) + + if(istype(M, /mob/living/carbon/human)) + var/datum/organ/external/affecting = M:get_organ("head") + affecting.take_damage(7) + else + M.take_organ_damage(7) + + M.updatehealth() + M:brain_op_stage = 1.0 + + if(1) + if(istype(M, /mob/living/carbon/slime)) + if(M.stat == 2) + for(var/mob/O in (viewers(M) - user - M)) + O.show_message("\red [M.name] is having its silky innards cut apart with [src] by [user].", 1) + M << "\red [user] begins to cut apart your innards with [src]!" + user << "\red You cut [M]'s silky innards apart with [src]!" + M:brain_op_stage = 2.0 + return + if(2.0) + if(istype(M, /mob/living/carbon/slime)) + if(M.stat == 2) + var/mob/living/carbon/slime/slime = M + if(slime.cores > 0) + if(istype(M, /mob/living/carbon/slime)) + user << "\red You attempt to remove [M]'s core, but [src] is ineffective!" + return + + if(M != user) + for(var/mob/O in (viewers(M) - user - M)) + O.show_message("\red [M] is having his connections to the brain delicately severed with [src] by [user].", 1) + M << "\red [user] begins to cut open your head with [src]!" + user << "\red You cut [M]'s head open with [src]!" + else + user.visible_message( \ + "\red [user] begin to delicately remove the connections to his brain with [src]!", \ + "\red You begin to cut open your head with [src]!" \ + ) + if(M == user && prob(25)) + user << "\red You nick an artery!" + if(istype(M, /mob/living/carbon/human)) + var/datum/organ/external/affecting = M:get_organ("head") + if(affecting.take_damage(75)) + M:UpdateDamageIcon() + else + M.take_organ_damage(75) + + if(istype(M, /mob/living/carbon/human)) + var/datum/organ/external/affecting = M:get_organ("head") + affecting.take_damage(7) + else + M.take_organ_damage(7) + + M.updatehealth() + M:brain_op_stage = 3.0 + else + ..() + return + + else if(user.zone_sel.selecting == "eyes") + user << "\blue So far so good." + + var/mob/living/carbon/human/H = M + if(istype(H) && ( \ + (H.head && H.head.flags & HEADCOVERSEYES) || \ + (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \ + (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \ + )) + user << "\red You're going to need to remove that mask/helmet/glasses first." + return + + var/mob/living/carbon/monkey/Mo = M + if(istype(Mo) && ( \ + (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \ + )) + user << "\red You're going to need to remove that mask/helmet/glasses first." + return + + if(istype(M, /mob/living/carbon/alien) || istype(M, /mob/living/carbon/slime))//Aliens don't have eyes./N + user << "\red You cannot locate any eyes on this creature!" + return + + switch(M:eye_op_stage) + if(0.0) + if(M != user) + for(var/mob/O in (viewers(M) - user - M)) + O.show_message("\red [M] is beginning to have his eyes incised with [src] by [user].", 1) + M << "\red [user] begins to cut open your eyes with [src]!" + user << "\red You make an incision around [M]'s eyes with [src]!" + else + user.visible_message( \ + "\red [user] begins to cut around his eyes with [src]!", \ + "\red You begin to cut open your eyes with [src]!" \ + ) + if(M == user && prob(25)) + user << "\red You mess up!" + if(istype(M, /mob/living/carbon/human)) + var/datum/organ/external/affecting = M:get_organ("head") + if(affecting.take_damage(15)) + M:UpdateDamageIcon() + else + M.take_organ_damage(15) + + user << "\blue So far so good before." + M.updatehealth() + M:eye_op_stage = 1.0 + user << "\blue So far so good after." + + else if(user.zone_sel.selecting == "chest") + switch(M:alien_op_stage) + if(0.0) + var/mob/living/carbon/human/H = M + if(!istype(H)) + return ..() + + if(H.wear_suit || H.w_uniform) + user << "\red You're going to need to remove that suit/jumpsuit first." + return + + user.visible_message("\red [user] begins to slice open [M]'s chest.", "\red You begin to slice open [M]'s chest.") + + spawn(rand(20,50)) + if(M == user && prob(25)) + user << "\red You mess up!" + if(istype(M, /mob/living/carbon/human)) + var/datum/organ/external/affecting = M:get_organ("chest") + if(affecting.take_damage(15)) + M:UpdateDamageIcon() + else + M.take_organ_damage(15) + + M:alien_op_stage = 1.0 + user << "\blue So far so good." + + else + return ..() +/* wat + else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) + return ..()*/ + return +*/ /* * Researchable Scalpels @@ -148,6 +667,157 @@ sharp = 1 edge = 1 +/* +/obj/item/weapon/circular_saw/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) + if(!istype(M)) + return ..() + + if((CLUMSY in user.mutations) && prob(50)) + M = user + return eyestab(M,user) + + if(!((locate(/obj/machinery/optable, M.loc) && M.resting) || (locate(/obj/structure/table/, M.loc) && M.lying && prob(50)))) + return ..() + + src.add_fingerprint(user) + + if(user.zone_sel.selecting == "head" || istype(M, /mob/living/carbon/slime)) + + var/mob/living/carbon/human/H = M + if(istype(H) && ( \ + (H.head && H.head.flags & HEADCOVERSEYES) || \ + (H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \ + (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \ + )) + user << "\red You're going to need to remove that mask/helmet/glasses first." + return + + var/mob/living/carbon/monkey/Mo = M + if(istype(Mo) && ( \ + (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \ + )) + user << "\red You're going to need to remove that mask/helmet/glasses first." + return + + switch(M:brain_op_stage) + if(1.0) + if(istype(M, /mob/living/carbon/slime)) + return + if(M != user) + for(var/mob/O in (viewers(M) - user - M)) + O.show_message("\red [M] has his skull sawed open with [src] by [user].", 1) + M << "\red [user] begins to saw open your head with [src]!" + user << "\red You saw [M]'s head open with [src]!" + else + user.visible_message( \ + "\red [user] saws open his skull with [src]!", \ + "\red You begin to saw open your head with [src]!" \ + ) + if(M == user && prob(25)) + user << "\red You mess up!" + if(istype(M, /mob/living/carbon/human)) + var/datum/organ/external/affecting = M:get_organ("head") + if(affecting.take_damage(40)) + M:UpdateDamageIcon() + M.updatehealth() + else + M.take_organ_damage(40) + + if(istype(M, /mob/living/carbon/human)) + var/datum/organ/external/affecting = M:get_organ("head") + affecting.take_damage(7) + else + M.take_organ_damage(7) + + M.updatehealth() + M:brain_op_stage = 2.0 + + if(2.0) + if(istype(M, /mob/living/carbon/slime)) + if(M.stat == 2) + var/mob/living/carbon/slime/slime = M + if(slime.cores > 0) + for(var/mob/O in (viewers(M) - user - M)) + O.show_message("\red [M.name] is having one of its cores sawed out with [src] by [user].", 1) + + slime.cores-- + M << "\red [user] begins to remove one of your cores with [src]! ([slime.cores] cores remaining)" + user << "\red You cut one of [M]'s cores out with [src]! ([slime.cores] cores remaining)" + + new slime.coretype(M.loc) + + if(slime.cores <= 0) + M.icon_state = "[slime.colour] baby slime dead-nocore" + + return + + if(3.0) + /*if(M.mind && M.mind.changeling) + user << "\red The neural tissue regrows before your eyes as you cut it." + return*/ + + if(M != user) + for(var/mob/O in (viewers(M) - user - M)) + O.show_message("\red [M] has his spine's connection to the brain severed with [src] by [user].", 1) + M << "\red [user] severs your brain's connection to the spine with [src]!" + user << "\red You sever [M]'s brain's connection to the spine with [src]!" + else + user.visible_message( \ + "\red [user] severs his brain's connection to the spine with [src]!", \ + "\red You sever your brain's connection to the spine with [src]!" \ + ) + + user.attack_log += "\[[time_stamp()]\] Debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" + M.attack_log += "\[[time_stamp()]\] Debrained by [user.name] ([user.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])" + + log_attack("[user.name] ([user.ckey]) debrained [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") + + + var/obj/item/brain/B = new(M.loc) + B.transfer_identity(M) + + M:brain_op_stage = 4.0 + M.death()//You want them to die after the brain was transferred, so not to trigger client death() twice. + + else + ..() + return + + else if(user.zone_sel.selecting == "chest") + switch(M:alien_op_stage) + if(1.0) + var/mob/living/carbon/human/H = M + if(!istype(H)) + return ..() + + if(H.wear_suit || H.w_uniform) + user << "\red You're going to need to remove that suit/jumpsuit first." + return + + user.visible_message("\red [user] begins to slice through the bone of [M]'s chest.", "\red You begin to slice through the bone of [M]'s chest.") + + spawn(20 + rand(0,50)) + if(M == user && prob(25)) + user << "\red You mess up!" + if(istype(M, /mob/living/carbon/human)) + var/datum/organ/external/affecting = M:get_organ("chest") + if(affecting.take_damage(15)) + M:UpdateDamageIcon() + else + M.take_organ_damage(15) + + M:alien_op_stage = 2.0 + user << "\blue So far so good." + + else + return ..() +/* + else if((!(user.zone_sel.selecting == "head")) || (!(user.zone_sel.selecting == "groin")) || (!(istype(M, /mob/living/carbon/human)))) + return ..() +*/ + return +*/ + //misc, formerly from code/defines/weapons.dm /obj/item/weapon/bonegel name = "bone gel" diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 00f2df03..21071711 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -14,35 +14,43 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user + var/userloc = H.loc - - var/list/hair_styles = H.valid_hairstyles_for_this_mob() - var/list/facial_styles = H.valid_facialhairstyles_for_this_mob() - - if (facial_styles.len > 1) //handle facial hair (if necessary) - var/new_style = input(user, "Select a facial hair style", "Grooming") as null|anything in facial_styles + + //see code/modules/mob/new_player/preferences.dm at approx line 545 for comments! + //this is largely copypasted from there. + + //handle facial hair (if necessary) + if(H.gender == MALE) + var/list/species_facial_hair = list() + if(H.species) + for(var/i in facial_hair_styles_list) + var/datum/sprite_accessory/facial_hair/tmp_facial = facial_hair_styles_list[i] + if(H.species.name in tmp_facial.species_allowed) + species_facial_hair += i + else + species_facial_hair = facial_hair_styles_list + + var/new_style = input(user, "Select a facial hair style", "Grooming") as null|anything in species_facial_hair if(userloc != H.loc) return //no tele-grooming if(new_style) H.f_style = new_style //handle normal hair - if (hair_styles.len) - var/new_style = input(user, "Select a hair style", "Grooming") as null|anything in hair_styles - if(userloc != H.loc) return //no tele-grooming - if(new_style) - H.h_style = new_style - - //machines can change their eye colours in the mirror - if (istype(H.species,/datum/species/machine)) - var/new_eyes = input(user, "Choose your new eye colour.", "Robotic Eyes") as color|null - if(new_eyes) - var/list/new_eyes_as_values = htmlcolour_to_values(new_eyes) - H.r_eyes=new_eyes_as_values[1] - H.g_eyes=new_eyes_as_values[2] - H.b_eyes=new_eyes_as_values[3] - H.update_hair() // need to do a full rebuild here - H.update_body() - return + var/list/species_hair = list() + if(H.species) + for(var/i in hair_styles_list) + var/datum/sprite_accessory/hair/tmp_hair = hair_styles_list[i] + if(H.species.name in tmp_hair.species_allowed) + species_hair += i + else + species_hair = hair_styles_list + + var/new_style = input(user, "Select a hair style", "Grooming") as null|anything in species_hair + if(userloc != H.loc) return //no tele-grooming + if(new_style) + H.h_style = new_style + H.update_hair() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index a5ee273a..dd6963e3 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -78,8 +78,6 @@ datum/preferences var/species = "Human" //Species datum to use. var/language = "None" //Secondary language var/list/gear //Custom/fluff item loadout. - var/covering_type = null //synth covering type - var/machine_brain_type = "Posibrain" //synth brain type //Some faction information. var/home_system = "Unset" //System of birth. @@ -242,212 +240,226 @@ datum/preferences /datum/preferences/proc/ShowChoices(mob/user) if(!user || !user.client) return update_preview_icon() + user << browse_rsc(preview_icon_front, "previewicon.png") user << browse_rsc(preview_icon_side, "previewicon2.png") - user << browse_rsc(preview_icon_front, "previewicon1.png") - spawn(0) - var/dat = "
" + var/dat = "
" - if(path) - dat += "
" - dat += "Slot [slot_name] - " - dat += "Load slot - " - dat += "Save slot - " - dat += "Reload slot" - dat += "
" + if(path) + dat += "
" + dat += "Slot [slot_name] - " + dat += "Load slot - " + dat += "Save slot - " + dat += "Reload slot" + dat += "
" - else - dat += "Please create an account to save your preferences." + else + dat += "Please create an account to save your preferences." - dat += "

" + dat += "
" - dat += "Name: " - dat += "[real_name]
" - dat += "(Random Name) " - dat += "(Always Random Name: [be_random_name ? "Yes" : "No"])" + dat += "Name: " + dat += "[real_name]
" + dat += "(Random Name) " + dat += "(Always Random Name: [be_random_name ? "Yes" : "No"])" + dat += "
" + + dat += "Gender: [gender == MALE ? "Male" : "Female"]
" + dat += "Age: [age]
" + dat += "Spawn Point: [spawnpoint]" + + dat += "
" + dat += "UI Style: [UI_style]
" + dat += "Custom UI(recommended for White UI):
" + dat += "-Color: [UI_style_color]
__

" + dat += "-Alpha(transparency): [UI_style_alpha]
" + dat += "Play admin midis: [(toggles & SOUND_MIDI) ? "Yes" : "No"]
" + dat += "Play lobby music: [(toggles & SOUND_LOBBY) ? "Yes" : "No"]
" + dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
" + dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
" + dat += "Ghost radio: [(toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]
" + + if(config.allow_Metadata) + dat += "OOC Notes: Edit
" + + dat += "
Custom Loadout: " + var/total_cost = 0 + + if(isnull(gear) || !islist(gear)) gear = list() + + if(gear && gear.len) dat += "
" + for(var/gear_name in gear) + if(gear_datums[gear_name]) + var/datum/gear/G = gear_datums[gear_name] + total_cost += G.cost + dat += "[gear_name] \[remove\]
" - dat += "Gender: [gender == MALE ? "Male" : "Female"]
" - dat += "Age: [age]
" - dat += "Spawn Point: [spawnpoint]" - - dat += "
" - dat += "UI Style: [UI_style]
" - dat += "Custom UI(recommended for White UI):
" - dat += "-Color: [UI_style_color]
__

" - dat += "-Alpha(transparency): [UI_style_alpha]
" - dat += "Play admin midis: [(toggles & SOUND_MIDI) ? "Yes" : "No"]
" - dat += "Play lobby music: [(toggles & SOUND_LOBBY) ? "Yes" : "No"]
" - dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
" - dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
" - dat += "Ghost radio: [(toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]
" - - if(config.allow_Metadata) - dat += "OOC Notes: Edit
" - - dat += "
Custom Loadout: " - var/total_cost = 0 - - if(isnull(gear) || !islist(gear)) gear = list() + dat += "Used: [total_cost] points." + else + dat += "none." + if(total_cost < MAX_GEAR_COST) + dat += " \[add\]" if(gear && gear.len) - dat += "
" - for(var/gear_name in gear) - if(gear_datums[gear_name]) - var/datum/gear/G = gear_datums[gear_name] - total_cost += G.cost - dat += "[gear_name] \[remove\]
" + dat += " \[remove\]" - dat += "Used: [total_cost] points." - else - dat += "none." + dat += "

Occupation Choices
" + dat += "\tSet Preferences
" - if(total_cost < MAX_GEAR_COST) - dat += " \[add\]" - if(gear && gear.len) - dat += " \[remove\]" + dat += "
Body " + dat += "(®)" + dat += "
" + dat += "Species: [species]
" + dat += "Secondary Language:
[language]
" + dat += "Blood Type: [b_type]
" + dat += "Skin Tone: [-s_tone + 35]/220
" + //dat += "Skin pattern: Adjust
" + dat += "Needs Glasses: [disabilities == 0 ? "No" : "Yes"]
" + dat += "Limbs: Adjust
" + dat += "Internal Organs: Adjust
" - dat += "

Occupation Choices
" - dat += "\tSet Preferences
" - - dat += "
Body " - dat += "(®)" - dat += "
" - dat += "Species: [species]
" - dat += "Secondary Language:
[language]
" - dat += "Blood Type: [b_type]
" - dat += "Skin Tone: [-s_tone + 35]/220
" - //dat += "Skin pattern: Adjust
" - dat += "Needs Glasses: [disabilities == 0 ? "No" : "Yes"]
" - if (species=="Machine") // brain and covering type for shells - dat += "Brain Type: [machine_brain_type]
" - dat += "Exterior Coating: [isnull(covering_type) ? "None" : covering_type]
" - dat += "Limbs: Adjust
" - dat += "Internal Organs: Adjust
" - - //display limbs below - var/ind = 0 - var/list/organ_names = get_limb_name_to_descriptive_name() - var/mechanical_organ_string = (species!="Machine" ? "Mechanical" : "Custom") - for(var/name in organ_data) - var/status = organ_data[name] - var/organ_name = organ_names[name] - if(status == "amputated") - ++ind - if(ind > 1) - dat += ", " - dat += "\tAmputated [organ_name]" - else if(status == "mechanical") - ++ind - if(ind > 1) - dat += ", " - dat += "\tMechanical [organ_name]" - else if(status == "assisted") - ++ind - if(ind > 1) - dat += ", " - switch(organ_name) - if("heart") - dat += "\tPacemaker-assisted [organ_name]" - if("voicebox") //on adding voiceboxes for speaking skrell/similar replacements - dat += "\tSurgically altered [organ_name]" - if("eyes") - dat += "\tRetinal overlayed [organ_name]" - else - dat += "\tMechanically assisted [organ_name]" - var/list/status_as_list=status - if (istype(status_as_list)) // we got a robot here - ++ind - if(ind > 1) - dat += ", " - dat += "\t[mechanical_organ_string] [organ_name]" - if (status_as_list[1]!="None") - dat += " covered in [lowertext(status_as_list[1])]" - if(!ind) - dat += "\[...\]

" - else - dat += ".

" - - if(gender == MALE) - dat += "Underwear: [underwear_m[underwear]]
" - else - dat += "Underwear: [underwear_f[underwear]]
" - - dat += "Undershirt: [undershirt_t[undershirt]]
" - - dat += "Backpack Type:
[backbaglist[backbag]]
" - - dat += "Nanotrasen Relation:
[nanotrasen_relation]
" - - dat += "
Preview
" - - dat += "
" - - if(jobban_isbanned(user, "Records")) - dat += "You are banned from using character records.
" - else - dat += "Character Records
" - - dat += "Set Antag Options
" - - dat += "\tSet Skills ([GetSkillClass(used_skillpoints)][used_skillpoints > 0 ? " [used_skillpoints]" : "0"])
" - - dat += "Set Flavor Text
" - - dat += "pAI Configuration
" - dat += "
" - - dat += "Character's Signature
" - dat += "Edit Font Help
" - dat += "[signature]
" - - - dat += "
Hair
" - dat += "Change Color
__
" - dat += " Style: [h_style]
" - - dat += "
Facial
" - dat += "Change Color
__
" - dat += " Style: [f_style]
" - - dat += "
Eyes
" - dat += "Change Color
__

" - - dat += "
Body Color
" - dat += "Change Color
__
" - - dat += "

Background Information
" - dat += "Home system: [home_system]
" - dat += "Citizenship: [citizenship]
" - dat += "Faction: [faction]
" - dat += "Religion: [religion]
" + //display limbs below + var/ind = 0 + for(var/name in organ_data) + //world << "[ind] \ [organ_data.len]" + var/status = organ_data[name] + var/organ_name = null + switch(name) + if("l_arm") + organ_name = "left arm" + if("r_arm") + organ_name = "right arm" + if("l_leg") + organ_name = "left leg" + if("r_leg") + organ_name = "right leg" + if("l_foot") + organ_name = "left foot" + if("r_foot") + organ_name = "right foot" + if("l_hand") + organ_name = "left hand" + if("r_hand") + organ_name = "right hand" + if("heart") + organ_name = "heart" + if("eyes") + organ_name = "eyes" + if(status == "cyborg") + ++ind + if(ind > 1) + dat += ", " + dat += "\tMechanical [organ_name] prothesis" + else if(status == "amputated") + ++ind + if(ind > 1) + dat += ", " + dat += "\tAmputated [organ_name]" + else if(status == "mechanical") + ++ind + if(ind > 1) + dat += ", " + dat += "\tMechanical [organ_name]" + else if(status == "assisted") + ++ind + if(ind > 1) + dat += ", " + switch(organ_name) + if("heart") + dat += "\tPacemaker-assisted [organ_name]" + if("voicebox") //on adding voiceboxes for speaking skrell/similar replacements + dat += "\tSurgically altered [organ_name]" + if("eyes") + dat += "\tRetinal overlayed [organ_name]" + else + dat += "\tMechanically assisted [organ_name]" + if(!ind) + dat += "\[...\]

" + else dat += "

" - if(jobban_isbanned(user, "Syndicate")) - dat += "You are banned from antagonist roles." - src.be_special = 0 - else - var/n = 0 - for (var/i in special_roles) - if(special_roles[i]) //if mode is available on the server - if(jobban_isbanned(user, i)) + if(gender == MALE) + dat += "Underwear: [underwear_m[underwear]]
" + else + dat += "Underwear: [underwear_f[underwear]]
" + + dat += "Undershirt: [undershirt_t[undershirt]]
" + + dat += "Backpack Type:
[backbaglist[backbag]]
" + + dat += "Nanotrasen Relation:
[nanotrasen_relation]
" + + dat += "
Preview
" + + dat += "
" + + if(jobban_isbanned(user, "Records")) + dat += "You are banned from using character records.
" + else + dat += "Character Records
" + + dat += "Set Antag Options
" + + dat += "\tSet Skills ([GetSkillClass(used_skillpoints)][used_skillpoints > 0 ? " [used_skillpoints]" : "0"])
" + + dat += "Set Flavor Text
" + + dat += "pAI Configuration
" + dat += "
" + + dat += "Character's Signature
" + dat += "Edit Font Help
" + dat += "[signature]
" + + + dat += "
Hair
" + dat += "Change Color
__
" + dat += " Style: [h_style]
" + + dat += "
Facial
" + dat += "Change Color
__
" + dat += " Style: [f_style]
" + + dat += "
Eyes
" + dat += "Change Color
__

" + + dat += "
Body Color
" + dat += "Change Color
__
" + + dat += "

Background Information
" + dat += "Home system: [home_system]
" + dat += "Citizenship: [citizenship]
" + dat += "Faction: [faction]
" + dat += "Religion: [religion]
" + + dat += "

" + + if(jobban_isbanned(user, "Syndicate")) + dat += "You are banned from antagonist roles." + src.be_special = 0 + else + var/n = 0 + for (var/i in special_roles) + if(special_roles[i]) //if mode is available on the server + if(jobban_isbanned(user, i)) + dat += "Be [i]: \[BANNED]
" + else if(i == "pai candidate") + if(jobban_isbanned(user, "pAI")) dat += "Be [i]: \[BANNED]
" - else if(i == "pai candidate") - if(jobban_isbanned(user, "pAI")) - dat += "Be [i]: \[BANNED]
" - else - dat += "Be [i]: [src.be_special&(1<
" - n++ - dat += "

" + else + dat += "Be [i]: [src.be_special&(1<
" + n++ + dat += "

" - if(!IsGuestKey(user.key)) - dat += "Undo - " - dat += "Save Setup - " + if(!IsGuestKey(user.key)) + dat += "Undo - " + dat += "Save Setup - " - dat += "Reset Setup" - dat += "
" + dat += "Reset Setup" + dat += "
" - user << browse(dat, "window=preferences;size=560x736") + user << browse(dat, "window=preferences;size=560x736") /datum/preferences/proc/SetChoices(mob/user, limit = 16, list/splitJobs = list("Chief Medical Officer"), width = 550, height = 660) if(!job_master) @@ -1100,7 +1112,6 @@ datum/preferences if(new_age) age = max(min( round(text2num(new_age)), AGE_MAX),AGE_MIN) if("species") - config.usealienwhitelist=0 // REMOVE ME var/list/new_species = list("Human") var/prev_species = species @@ -1120,8 +1131,41 @@ datum/preferences if(prev_species != species) //grab one of the valid hair styles for the newly chosen species - h_style = random_hair_style(gender,get_hair_species()) - f_style = random_facial_hair_style(gender,get_hair_species()) + var/list/valid_hairstyles = list() + for(var/hairstyle in hair_styles_list) + var/datum/sprite_accessory/S = hair_styles_list[hairstyle] + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue + if( !(species in S.species_allowed)) + continue + valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] + + if(valid_hairstyles.len) + h_style = pick(valid_hairstyles) + else + //this shouldn't happen + h_style = hair_styles_list["Bald"] + + //grab one of the valid facial hair styles for the newly chosen species + var/list/valid_facialhairstyles = list() + for(var/facialhairstyle in facial_hair_styles_list) + var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue + if( !(species in S.species_allowed)) + continue + + valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] + + if(valid_facialhairstyles.len) + f_style = pick(valid_facialhairstyles) + else + //this shouldn't happen + f_style = facial_hair_styles_list["Shaved"] //reset hair colour and skin colour r_hair = 0//hex2num(copytext(new_hair, 2, 4)) @@ -1164,14 +1208,24 @@ datum/preferences b_type = new_b_type if("hair") - var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference") as color|null - if(new_hair) - r_hair = hex2num(copytext(new_hair, 2, 4)) - g_hair = hex2num(copytext(new_hair, 4, 6)) - b_hair = hex2num(copytext(new_hair, 6, 8)) + if(species == "Human" || species == "Unathi" || species == "Tajaran" || species == "Skrell") + var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference") as color|null + if(new_hair) + r_hair = hex2num(copytext(new_hair, 2, 4)) + g_hair = hex2num(copytext(new_hair, 4, 6)) + b_hair = hex2num(copytext(new_hair, 6, 8)) + else if (species == "Machine") + alert("Please select the Body Color instead.") if("h_style") - var/list/valid_hairstyles = get_valid_hairstyles(gender,get_hair_species()) + var/list/valid_hairstyles = list() + for(var/hairstyle in hair_styles_list) + var/datum/sprite_accessory/S = hair_styles_list[hairstyle] + if( !(species in S.species_allowed)) + continue + + valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] + var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles if(new_h_style) h_style = new_h_style @@ -1184,7 +1238,18 @@ datum/preferences b_facial = hex2num(copytext(new_facial, 6, 8)) if("f_style") - var/list/valid_facialhairstyles = get_valid_facialhairstyles(gender,get_hair_species()) + var/list/valid_facialhairstyles = list() + for(var/facialhairstyle in facial_hair_styles_list) + var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] + if(gender == MALE && S.gender == FEMALE) + continue + if(gender == FEMALE && S.gender == MALE) + continue + if( !(species in S.species_allowed)) + continue + + valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] + var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facialhairstyles if(new_f_style) f_style = new_f_style @@ -1231,6 +1296,10 @@ datum/preferences r_skin = hex2num(copytext(new_skin, 2, 4)) g_skin = hex2num(copytext(new_skin, 4, 6)) b_skin = hex2num(copytext(new_skin, 6, 8)) + if(species == "Machine") + r_hair = r_skin + g_hair = g_skin + b_hair = b_skin if("ooccolor") var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference") as color|null @@ -1256,19 +1325,57 @@ datum/preferences else user << browse(null, "window=disabil") - if("set_machine_brain") // shell customization junk - var/new_brain = input(user, "Choose your brain.", "Character Preference") as null|anything in list("MMI", "Posibrain") // not differentiating brain species at the moment - if(new_brain) - machine_brain_type=new_brain - - if("set_machine_covering") - var/new_coating = input(user, "Choose your exterior coating.", "Character Preference") as null|anything in get_limb_covering_names() - if(new_coating) - covering_type=(new_coating!="None" ? new_coating : null) - if("limbs") - customize_limbs(user,species!="Machine") + var/limb_name = input(user, "Which limb do you want to change?") as null|anything in list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand") + if(!limb_name) return + var/limb = null + var/second_limb = null // if you try to change the arm, the hand should also change + var/third_limb = null // if you try to unchange the hand, the arm should also change + switch(limb_name) + if("Left Leg") + limb = "l_leg" + second_limb = "l_foot" + if("Right Leg") + limb = "r_leg" + second_limb = "r_foot" + if("Left Arm") + limb = "l_arm" + second_limb = "l_hand" + if("Right Arm") + limb = "r_arm" + second_limb = "r_hand" + if("Left Foot") + limb = "l_foot" + third_limb = "l_leg" + if("Right Foot") + limb = "r_foot" + third_limb = "r_leg" + if("Left Hand") + limb = "l_hand" + third_limb = "l_arm" + if("Right Hand") + limb = "r_hand" + third_limb = "r_arm" + + var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in list("Normal","Amputated","Prothesis") + if(!new_state) return + + switch(new_state) + if("Normal") + organ_data[limb] = null + if(third_limb) + organ_data[third_limb] = null + if("Amputated") + organ_data[limb] = "amputated" + if(second_limb) + organ_data[second_limb] = "amputated" + if("Prothesis") + organ_data[limb] = "cyborg" + if(second_limb) + organ_data[second_limb] = "cyborg" + if(third_limb && organ_data[third_limb] == "amputated") + organ_data[third_limb] = null if("organs") var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes") if(!organ_name) return @@ -1487,43 +1594,29 @@ datum/preferences character.h_style = h_style character.f_style = f_style + character.skills = skills character.used_skillpoints = used_skillpoints - var/list/covering_name_to_type = get_limb_covering_list() + // Destroy/cyborgize organs - if (species=="Machine") - var/datum/organ/internal/brain/robot/brain_datum = character.get_organ("brain") - if (brain_datum) // sanity check - brain_datum.machine_brain_type=machine_brain_type // set the brain type - for (var/datum/organ/external/organ in character.organs) // provide default covering for shells - if (organ) // gotta make sure we're getting an actual organ here - if (covering_type) - var/covering_path = covering_name_to_type[covering_type] - organ.covering = new covering_path(organ,rgb(r_skin,g_skin,b_skin)) - organ.covering.limb_datum=organ - - // Destroy or cyborgize organs for(var/name in organ_data) var/datum/organ/external/O = character.organs_by_name[name] var/datum/organ/internal/I = character.internal_organs_by_name[name] var/status = organ_data[name] + if(status == "amputated") O.amputated = 1 O.status |= ORGAN_DESTROYED O.destspawn = 1 + if(status == "cyborg") + O.status |= ORGAN_ROBOT if(status == "assisted") I.mechassist() - if(status == "mechanical") + else if(status == "mechanical") I.mechanize() - var/list/status_as_list=status - if (istype(status_as_list)) // we got a robot here - O.status |= ORGAN_ROBOT - O.covering = null // wipe any old covering we might have - if (status_as_list[1]!="None") - var/covering_path = covering_name_to_type[status_as_list[1]] - O.covering = new covering_path(O,status_as_list[2]) - O.covering.limb_datum=O + + else continue if(underwear > underwear_m.len || underwear < 1) underwear = 0 //I'm sure this is 100% unnecessary, but I'm paranoid... sue me. //HAH NOW NO MORE MAGIC CLONING UNDIES @@ -1564,104 +1657,5 @@ datum/preferences dat += "" user << browse(dat, "window=saves;size=300x390") - /datum/preferences/proc/close_load_dialog(mob/user) user << browse(null, "window=saves") - - -/datum/preferences/proc/get_hair_species() - // this is incredibly snowflakey but I don't see an alternative - if (species!="Machine") - return species - var/head_coat=covering_type // we get the base coating - if (organ_data["Head"]) // if we're customizing the head we should get their coating - head_coat=organ_data["Head"][0] - if (!head_coat) // no coating? - return - var/list/refs=get_limb_covering_references() - for(var/skin_type in refs) - var/datum/synthetic_limb_cover/temp=refs[skin_type] - if (temp.icon_key_type==head_coat) - return temp.hair_species - - -/datum/preferences/proc/custom_robot_limb(mob/user,) - var/covering_name = input(user, "What kind of covering do you want?") as null|anything in get_limb_covering_names() - if (!covering_name) - return - if (covering_name=="None") // don't want no colour - return list(covering_name,rgb(128,128,128)) - var/new_colour = input(user, "Pick the colour for your limb:", "Character Preference") as color|null - if(!new_colour) - return - return list(covering_name,new_colour) - - -var/list/limb_name_to_descriptive_names -/datum/preferences/proc/get_limb_name_to_descriptive_name() - if (isnull(limb_name_to_descriptive_names)) - limb_name_to_descriptive_names=list() - for(var/organ_type in typesof(/datum/organ/external)-/datum/organ/external) - var/datum/organ/external/temp = new organ_type() - limb_name_to_descriptive_names[temp.name]=temp.display_name - del(temp) - return limb_name_to_descriptive_names - - -var/list/limb_connection_data -/datum/preferences/proc/get_limb_connection_data() - if (isnull(limb_connection_data)) - limb_connection_data = list() - limb_connection_data["Left Leg"]=list("l_leg","l_foot",null) - limb_connection_data["Right Leg"]=list("r_leg","r_foot",null) - limb_connection_data["Left Arm"]=list("l_arm","l_hand",null) - limb_connection_data["Right Arm"]=list("r_arm","r_hand",null) - limb_connection_data["Left Foot"]=list("l_foot",null,"l_leg") - limb_connection_data["Right Foot"]=list("r_foot",null,"r_leg") - limb_connection_data["Left Hand"]=list("l_hand",null,"l_arm") - limb_connection_data["Right Hand"]=list("r_hand",null,"r_arm") - limb_connection_data["Chest"]=list("chest",null,null) - limb_connection_data["Groin"]=list("groin",null,null) - limb_connection_data["Head"]=list("head",null,null) - return limb_connection_data - - -/datum/preferences/proc/pick_organ_to_customize(mob/user,var/is_organic_species) - var/list/valid_targets = list("Left Leg","Right Leg","Left Arm","Right Arm","Left Foot","Right Foot","Left Hand","Right Hand") - if (!is_organic_species) - valid_targets.Add(list("Head","Chest","Groin")) - var/limb_name = input(user, "Which limb do you want to change?") as null|anything in valid_targets - if(!limb_name) // you have picked nothing - return - var/list/limb_info=get_limb_connection_data() - return limb_info[limb_name] - - -/datum/preferences/proc/customize_limbs(mob/user,var/is_organic_species) - var/list/limb_info = pick_organ_to_customize(user,is_organic_species) - if (!limb_info) - return - var/limb=limb_info[1] - var/limb_child=limb_info[2] - var/limb_parent=limb_info[3] - var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in (is_organic_species ? list("Normal","Amputated","Prosthesis") : list("Normal","Custom")) - if(!new_state) - return // cancel - switch(new_state) - if("Normal") - organ_data-= limb - if(!isnull(limb_parent)) - organ_data-=limb_parent - if("Amputated") - organ_data[limb] = "amputated" - if(!isnull(limb_child)) - organ_data[limb_child] = "amputated" - if("Prosthesis") - var/list/custom = custom_robot_limb(user) - organ_data[limb] = custom - if(!isnull(limb_child)) - organ_data[limb_child] = custom - if(!isnull(limb_parent) && organ_data[limb_parent] == "amputated") - organ_data-=limb_parent - if("Custom") - organ_data[limb] = custom_robot_limb(user) // robots have no dependencies \ No newline at end of file diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 0a12ea94..b8237e1e 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -1,5 +1,5 @@ #define SAVEFILE_VERSION_MIN 8 -#define SAVEFILE_VERSION_MAX 12 +#define SAVEFILE_VERSION_MAX 11 //handles converting savefiles to new formats //MAKE SURE YOU KEEP THIS UP TO DATE! @@ -19,13 +19,7 @@ fdel(delpath) break return 0 - if(savefile_version < 12) - if (species=="Machine") // give IPC's posibrains and paint by default - machine_brain_type="Posibrain" - covering_type="Paint" - for(var/name in organ_data) - if (organ_data[name]=="Cyborg") - organ_data[name]=list("None",rgb(128,128,128)) // standard robo limbs + if(savefile_version == SAVEFILE_VERSION_MAX) //update successful. save_preferences() save_character() @@ -179,10 +173,6 @@ S["citizenship"] >> citizenship S["faction"] >> faction S["religion"] >> religion - - //Robot - S["machine_brain_type"] >> machine_brain_type - S["covering_type"] >> covering_type S["nanotrasen_relation"] >> nanotrasen_relation //S["skin_style"] >> skin_style @@ -288,8 +278,6 @@ S["backbag"] << backbag S["b_type"] << b_type S["spawnpoint"] << spawnpoint - S["machine_brain_type"] << machine_brain_type - S["covering_type"] << covering_type //Jobs S["alternate_option"] << alternate_option @@ -315,26 +303,26 @@ S["flavor_texts_feet"] << flavor_texts["feet"] //Miscellaneous - S["med_record"] << med_record - S["sec_record"] << sec_record - S["gen_record"] << gen_record + S["med_record"] << med_record + S["sec_record"] << sec_record + S["gen_record"] << gen_record S["player_alt_titles"] << player_alt_titles - S["be_special"] << be_special - S["disabilities"] << disabilities - S["used_skillpoints"] << used_skillpoints - S["skills"] << skills - S["skill_specialization"] << skill_specialization - S["organ_data"] << organ_data - S["gear"] << gear - S["home_system"] << home_system - S["citizenship"] << citizenship - S["faction"] << faction - S["religion"] << religion + S["be_special"] << be_special + S["disabilities"] << disabilities + S["used_skillpoints"] << used_skillpoints + S["skills"] << skills + S["skill_specialization"] << skill_specialization + S["organ_data"] << organ_data + S["gear"] << gear + S["home_system"] << home_system + S["citizenship"] << citizenship + S["faction"] << faction + S["religion"] << religion - S["nanotrasen_relation"] << nanotrasen_relation + S["nanotrasen_relation"] << nanotrasen_relation //S["skin_style"] << skin_style - S["uplinklocation"] << uplinklocation + S["uplinklocation"] << uplinklocation S["UI_style_color"] << UI_style_color S["UI_style_alpha"] << UI_style_alpha diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 654f58cf..649ffaff 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -20,8 +20,6 @@ var/mob/living/carbon/brain/brainmob = null//The current occupant. var/mob/living/silicon/robot = null//Appears unused. var/obj/mecha = null//This does not appear to be used outside of reference in mecha.dm. - - var/machine_brain_type="MMI" attackby(var/obj/item/O as obj, var/mob/user as mob) if(istype(O,/obj/item/organ/brain) && !brainmob) //Time to stick a brain in it --NEO diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 5a39c132..97ffc345 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -39,6 +39,7 @@ brainmob.timeofhostdeath = H.timeofdeath if(H.mind) H.mind.transfer_to(brainmob) + brainmob << "\blue You feel slightly disoriented. That's normal when you're just a brain." callHook("debrain", list(brainmob)) @@ -52,24 +53,20 @@ usr << "You can feel the small spark of life still left in this one." else usr << "This one seems particularly lifeless. Perhaps it will regain some of its luster later.." - - + /obj/item/organ/brain/removed(var/mob/living/target,var/mob/living/user) + ..() + var/mob/living/simple_animal/borer/borer = target.has_brain_worms() + if(borer) borer.detatch() //Should remove borer if the brain is removed - RR + var/mob/living/carbon/human/H = target var/obj/item/organ/brain/B = src if(istype(B) && istype(H)) B.transfer_identity(target) - -/obj/item/organ/brain/exposed_to_the_world() - var/datum/organ/internal/brain/robot/robotic_brain=organ_data - if (istype(robotic_brain)) - var/new_mmi=robotic_brain.create_robot_brain_replacement(brainmob,src.loc) - del(src) - return new_mmi /obj/item/organ/brain/replaced(var/mob/living/target) diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index 921aa630..59f83deb 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -5,7 +5,6 @@ icon_state = "posibrain" w_class = 3 origin_tech = "engineering=4;materials=4;bluespace=2;programming=4" - machine_brain_type="Posibrain" construction_cost = list("metal"=500,"glass"=500,"silver"=200,"gold"=200,"plasma"=100,"diamond"=10) construction_time = 75 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 79dc0096..decf0bf3 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1659,82 +1659,3 @@ if(eyes && istype(eyes) && !eyes.status & ORGAN_CUT_AWAY) return 1 return 0 - -/mob/living/carbon/human/proc/hair_species_name() - var/datum/organ/external/head/head_organ = get_organ("head") - if (head_organ.covering) - return head_organ.covering.hair_species - return species.name - - -/mob/living/carbon/human/proc/valid_hairstyles_for_this_mob() - return get_valid_hairstyles(gender, hair_species_name()) - - -/mob/living/carbon/human/proc/valid_facialhairstyles_for_this_mob() - return get_valid_facialhairstyles(gender, hair_species_name()) - - -/mob/living/carbon/human/proc/should_we_show_hair() - var/datum/organ/external/head/head_organ = get_organ("head") - if(!head_organ || (head_organ.status & ORGAN_DESTROYED)) - return - if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) - return - return TRUE - -/mob/living/carbon/human/proc/validate_hair() - var/list/hair=valid_hairstyles_for_this_mob() - if (!(h_style in hair)) - h_style=null - var/list/face=valid_facialhairstyles_for_this_mob() - if (!(f_style in face)) - f_style=null - - -/mob/living/carbon/human/proc/hair_icon() - if (h_style) - var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] - var/icon/hair = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - if(hair_style.do_colouration) - hair.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) - return hair - - -/mob/living/carbon/human/proc/facial_hair_icon() - if (f_style) - var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] - var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") - if(facial_hair_style.do_colouration) - facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) - return facial_s - - -/mob/living/carbon/human/proc/get_eye_icon_state() - var/datum/organ/external/head/head_organ = get_organ("head") - if (head_organ.covering) - return head_organ.covering.eyes_state - return species.eyes - - -/mob/living/carbon/human/proc/eye_icon() - var/icon/result_icon = new/icon('icons/mob/human_face.dmi', get_eye_icon_state()) - result_icon.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) - return result_icon - - -/mob/living/carbon/human/proc/tail_icon_state() - var/datum/organ/external/groin/groin_organ = get_organ("groin") - if (groin_organ.covering) - return list(groin_organ.covering.tail,groin_organ.covering.colour) - if (species.tail) - return list(species.tail,rgb(r_skin, g_skin, b_skin)) - - -/mob/living/carbon/human/proc/tail_icon() - var/list/tail_info = tail_icon_state() - if(!isnull(tail_info)) - if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space)) - var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail_info[1]]_s") - tail_s.Blend(tail_info[2], ICON_ADD) - return tail_s \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/carbon/human/human_species.dm index ea550240..c313c601 100644 --- a/code/modules/mob/living/carbon/human/human_species.dm +++ b/code/modules/mob/living/carbon/human/human_species.dm @@ -30,5 +30,5 @@ ..(new_loc, "Diona") /mob/living/carbon/human/machine/New(var/new_loc) - h_style = "Bald" + h_style = "blue IPC screen" ..(new_loc, "Machine") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 2840900b..1f4b301e 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -201,131 +201,10 @@ // Grabs the window recieved when you click-drag someone onto you. /datum/species/proc/get_inventory_dialogue(var/mob/living/carbon/human/H) return - //Used by xenos understanding larvae and dionaea understanding nymphs. /datum/species/proc/can_understand(var/mob/other) return - - -/datum/species/proc/blend_preview_icon(var/icon/main_icon,var/datum/preferences/preferences,var/paint_colour) - if(paint_colour) - main_icon.Blend(paint_colour, ICON_ADD) - return - if(flags & HAS_SKIN_COLOR) - main_icon.Blend(rgb(preferences.r_skin, preferences.g_skin, preferences.b_skin), ICON_ADD) - return - if(flags & HAS_SKIN_TONE) // Skin tone - if (preferences.s_tone >= 0) - main_icon.Blend(rgb(preferences.s_tone, preferences.s_tone, preferences.s_tone), ICON_ADD) - else - main_icon.Blend(rgb(-preferences.s_tone, -preferences.s_tone, -preferences.s_tone), ICON_SUBTRACT) - - -/datum/species/proc/get_organ_preview_icon(var/name, var/robot, var/gendered, var/gender_string, var/datum/preferences/preferences, var/datum/synthetic_limb_cover/covering, var/paint_colour) - var/icon_name = icobase - if (robot) - icon_name = (istype(covering)) ? covering.main_icon : 'icons/mob/human_races/robotic.dmi' - var/state_name = name - if (gendered) - state_name+="_[gender_string]" - var/icon/result = new /icon(icon_name,state_name) - blend_preview_icon(result,preferences,paint_colour) - return result - - -/datum/species/proc/get_is_preview_organ_robotic(var/name,var/datum/preferences/preferences) - if (flags & IS_SYNTHETIC) - return TRUE - if (name in preferences.organ_data) - var/list/organ_robotic_info=preferences.organ_data[name] - if (istype(organ_robotic_info)) - return TRUE - -/datum/species/proc/get_preview_organ_covering(var/name,var/datum/preferences/preferences) - if (name in preferences.organ_data) - var/list/organ_robotic_info=preferences.organ_data[name] - if (istype(organ_robotic_info)) - return organ_robotic_info - if (preferences.species=="Machine") - if (preferences.covering_type) - return list(preferences.covering_type,rgb(preferences.r_skin,preferences.g_skin,preferences.b_skin)) - - -/datum/species/proc/get_tail_preview_icon(var/list/preview_coverings,var/datum/preferences/preferences) - var/tail_state=null - if (!(isnull(preview_coverings["groin"]))) - var/datum/synthetic_limb_cover/covering=preview_coverings["groin"] - tail_state=covering.tail - if(tail) - tail_state="[tail]_s" - if(tail_state) - var/icon/result = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = tail_state) - result.Blend(rgb(preferences.r_hair,preferences.g_hair,preferences.b_hair),ICON_ADD) - return result - -/datum/species/proc/get_eyes_preview_icon(var/list/preview_coverings,var/datum/preferences/preferences) - var/eye_state=null - if (!(isnull(preview_coverings["head"]))) - var/datum/synthetic_limb_cover/covering=preview_coverings["head"] - eye_state=covering.eyes_state - else - eye_state=eyes - var/icon/result = new/icon('icons/mob/human_face.dmi',eye_state) - result.Blend(rgb(preferences.r_eyes,preferences.g_eyes,preferences.b_eyes),ICON_ADD) - return result - -/* This function takes a preferences object and generates a complete body and hair icon for that set of preferences. It's needlessly complicated -and duplicates a lot of what's going on in update_icons. The two systems should be combined somehow, possibly by using a 'visual identity' object -that could be created from either a living human or a preferences object and then passing that to a single render function, but I'll leave that -exercise for another day. - -See code\modules\mob\new_player\preferences_setup.dm for where it's used. - - jack_fractal*/ -/datum/species/proc/create_body_preview_icon(var/datum/preferences/preferences) - var/gender_string = (preferences.gender==FEMALE) ? "f" : "m" - var/icon/preview_icon = new/icon('icons/mob/human_face.dmi', "blank_eyes") // this is just an empty icon - var/list/external_organs = list("torso","groin","head","r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","l_arm","l_hand") - var/list/coverings=list() - var/list/gendered_organs = list("torso","groin","head") - var/list/limb_coverings = get_limb_covering_references() - var/list/limb_coverings_names = get_limb_covering_list() - for (var/name in external_organs) - if(preferences.organ_data[name] == "amputated") // amputated organs don't show up - continue - var/robotic = get_is_preview_organ_robotic(name,preferences) - var/datum/synthetic_limb_cover/covering = null - var/paint_colour=null - if (robotic) - var/list/covering_as_list=get_preview_organ_covering(name, preferences) - if (istype(covering_as_list)) - covering=limb_coverings[limb_coverings_names[covering_as_list[1]]] - paint_colour=covering_as_list[2] - coverings[name]=covering - var/icon/organ_icon = get_organ_preview_icon(name, robotic, (name in gendered_organs), gender_string, preferences, covering, paint_colour) - preview_icon.Blend(organ_icon, ICON_OVERLAY) - del(organ_icon) - var/icon/tail_icon = get_tail_preview_icon(coverings,preferences) // Tail - if(tail_icon) - preview_icon.Blend(tail_icon, ICON_OVERLAY) - del(tail_icon) - var/icon/eye_icon = get_eyes_preview_icon(coverings,preferences) - if(eye_icon) - preview_icon.Blend(eye_icon, ICON_OVERLAY) - del(eye_icon) - var/datum/sprite_accessory/hair_style = hair_styles_list[preferences.h_style] - if(hair_style) - var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - hair_s.Blend(rgb(preferences.r_hair, preferences.g_hair, preferences.b_hair), ICON_ADD) - preview_icon.Blend(hair_s, ICON_OVERLAY) - del(hair_s) - var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[preferences.f_style] - if(facial_hair_style) - var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") - facial_s.Blend(rgb(preferences.r_facial, preferences.g_facial, preferences.b_facial), ICON_ADD) - preview_icon.Blend(facial_s, ICON_OVERLAY) - del(facial_s) - return preview_icon /datum/species/human name = "Human" @@ -595,16 +474,9 @@ See code\modules\mob\new_player\preferences_setup.dm for where it's used. has_organ = list( "heart" = /datum/organ/internal/heart, - "brain" = /datum/organ/internal/brain/robot, + "brain" = /datum/organ/internal/brain, ) -/datum/species/machine/create_organs(var/mob/living/carbon/human/H) - ..() - var/datum/organ/internal/brain/robot/brain_datum = H.internal_organs_by_name["brain"] // handle weird robot brains - if (istype(brain_datum)) - if (isnull(brain_datum.machine_brain_type)) - brain_datum.machine_brain_type="Posibrain" - - + /datum/species/bug name = "Vaurca" name_plural = "varucae" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 54ff6a66..8c52146b 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -234,58 +234,21 @@ proc/get_damage_icon_part(damage_state, body_part) overlays_standing[DAMAGE_LAYER] = standing_image if(update_icons) update_icons() - - -/mob/living/carbon/human/proc/get_skin_tone_key() - if (species.flags & HAS_SKIN_COLOR) - return "[r_skin],[g_skin],[b_skin]" - if(species.flags & HAS_SKIN_TONE) - return "[s_tone]" - return "" - - -/mob/living/carbon/human/proc/get_icon_key(var/list/mutations=list()) - if (!mutations) - mutations=get_visible_mutations() - var/icon_key = "[species.race_key][(gender == FEMALE ? "f" : "m")][get_skin_tone_key()]" - for(var/datum/organ/external/part in organs) // get the part icon keys - icon_key = "[icon_key][part.get_icon_key()]" - return "[icon_key][mutations["husk"]][mutations["fat"]][mutations["hulk"]][mutations["skeleton"]]" - - -/mob/living/carbon/human/proc/get_visible_mutations() - return list("husk"=(HUSK in src.mutations), - "hulk"=(HULK in src.mutations), - "skeleton"=(SKELETON in src.mutations), - "fat"=(FAT in src.mutations)) - - -/mob/living/carbon/human/proc/skin_colour_info(var/list/mutations=list()) - if (!mutations) - mutations=get_visible_mutations() - var/icon_blend=ICON_ADD - var/colour=rgb(127,127,127) - var/good=FALSE - if (species.flags & HAS_SKIN_COLOR) - colour=rgb(r_skin,g_skin,b_skin) - good=TRUE - if(!mutations["husk"] && !mutations["hulk"]) // if we have regular skin - if(species.flags & HAS_SKIN_TONE) - icon_blend=(s_tone >= 0 ? ICON_ADD : ICON_SUBTRACT) - var/res=(s_tone >= 0 ? s_tone : -s_tone) - colour=rgb(res,res,res) - good=TRUE - return list("rgb"=colour,"mode"=icon_blend,"blend"=good) - //BASE MOB SPRITE /mob/living/carbon/human/proc/update_body(var/update_icons=1) + var/husk_color_mod = rgb(96,88,80) var/hulk_color_mod = rgb(48,224,40) var/necrosis_color_mod = rgb(10,50,0) - var/list/mutations = get_visible_mutations() + var/husk = (HUSK in src.mutations) + var/fat = (FAT in src.mutations) + var/hulk = (HULK in src.mutations) + var/skeleton = (SKELETON in src.mutations) + var/g = (gender == FEMALE ? "f" : "m") + var/has_head = 0 //CACHING: Generate an index key from visible bodyparts. //0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic. @@ -296,9 +259,22 @@ proc/get_damage_icon_part(damage_state, body_part) stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi',"blank") + var/icon_key = "[species.race_key][g][s_tone]" + for(var/datum/organ/external/part in organs) - // GENERATE THE ICON KEY - var/icon_key = get_icon_key(mutations) + if(istype(part,/datum/organ/external/head) && !(part.status & ORGAN_DESTROYED)) + has_head = 1 + + if(part.status & ORGAN_DESTROYED) + icon_key = "[icon_key]0" + else if(part.status & ORGAN_ROBOT) + icon_key = "[icon_key]2" + else if(part.status & ORGAN_DEAD) + icon_key = "[icon_key]3" + else + icon_key = "[icon_key]1" + + icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0][s_tone]" var/icon/base_icon if(human_icon_cache[icon_key]) @@ -311,18 +287,14 @@ proc/get_damage_icon_part(damage_state, body_part) //BEGIN CACHED ICON GENERATION. - // Why don't we just make mutations["skeleton"]s/shadows/golems a species? ~Z - var/race_icon = (mutations["skeleton"] ? 'icons/mob/human_races/r_skeleton.dmi' : species.icobase) - var/deform_icon = (mutations["skeleton"] ? 'icons/mob/human_races/r_skeleton.dmi' : species.icobase) + // Why don't we just make skeletons/shadows/golems a species? ~Z + var/race_icon = (skeleton ? 'icons/mob/human_races/r_skeleton.dmi' : species.icobase) + var/deform_icon = (skeleton ? 'icons/mob/human_races/r_skeleton.dmi' : species.icobase) - var/list/skin_info = skin_colour_info(mutations) // get the skin tone info - //Robotic limbs are handled in get_icon() so all we worry about are missing or dead limbs. //No icon stored, so we need to start with a basic one. var/datum/organ/external/chest = get_organ("chest") - base_icon = chest.get_icon(race_icon,deform_icon,skin_info) - - + base_icon = chest.get_icon(race_icon,deform_icon,g) if(chest.status & ORGAN_DEAD) base_icon.ColorTone(necrosis_color_mod) @@ -335,7 +307,10 @@ proc/get_damage_icon_part(damage_state, body_part) if(part.status & ORGAN_DESTROYED) continue - temp = part.get_icon(race_icon,deform_icon,skin_info) // synthetics are handled here + if (istype(part, /datum/organ/external/groin) || istype(part, /datum/organ/external/head)) + temp = part.get_icon(race_icon,deform_icon,g) + else + temp = part.get_icon(race_icon,deform_icon) if(part.status & ORGAN_DEAD) temp.ColorTone(necrosis_color_mod) @@ -370,33 +345,48 @@ proc/get_damage_icon_part(damage_state, body_part) base_icon.Blend(temp, ICON_OVERLAY) - if(!mutations["skeleton"]) - if(mutations["husk"]) + if(!skeleton) + if(husk) base_icon.ColorTone(husk_color_mod) - else if(mutations["hulk"]) + else if(hulk) var/list/tone = ReadRGB(hulk_color_mod) base_icon.MapColors(rgb(tone[1],0,0),rgb(0,tone[2],0),rgb(0,0,tone[3])) - //Handle mutations["husk"] overlay. - if(mutations["husk"]) + //Handle husk overlay. + if(husk) var/icon/mask = new(base_icon) var/icon/husk_over = new(race_icon,"overlay_husk") mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0) husk_over.Blend(mask, ICON_ADD) base_icon.Blend(husk_over, ICON_OVERLAY) + + //Skin tone. + if(!husk && !hulk) + if(species.flags & HAS_SKIN_TONE) + if(s_tone >= 0) + base_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) + else + base_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) + human_icon_cache[icon_key] = base_icon //log_debug("Generated new cached mob icon ([icon_key] \icon[human_icon_cache[icon_key]]) for [src]. [human_icon_cache.len] cached mob icons.") //END CACHED ICON GENERATION. + stand_icon.Blend(base_icon,ICON_OVERLAY) - var/datum/organ/external/head = get_organ("head") // check if we have a head - if(head ? (head.status & ORGAN_DESTROYED ? 0 : 1) : 0) // we need a head and that head needs to not be destroyed + //Skin colour. Not in cache because highly variable (and relatively benign). + if (species.flags & HAS_SKIN_COLOR) + stand_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + + if(has_head) //Eyes - if(!mutations["skeleton"]) - stand_icon.Blend(eye_icon(), ICON_OVERLAY) + if(!skeleton) + var/icon/eyes = new/icon('icons/mob/human_face.dmi', species.eyes) + eyes.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) + stand_icon.Blend(eyes, ICON_OVERLAY) //Mouth (lipstick!) if(lip_style && (species && species.flags & HAS_LIPS)) //skeletons are allowed to wear lipstick no matter what you think, agouri. @@ -404,7 +394,7 @@ proc/get_damage_icon_part(damage_state, body_part) //Underwear if(underwear >0 && underwear < 12 && species.flags & HAS_UNDERWEAR) - if(!mutations["fat"] && !mutations["skeleton"]) + if(!fat && !skeleton) stand_icon.Blend(new /icon('icons/mob/human.dmi', "underwear[underwear]_[g]_s"), ICON_OVERLAY) if(undershirt>0 && undershirt <= undershirt_t.len && species.flags & HAS_UNDERWEAR) @@ -417,27 +407,47 @@ proc/get_damage_icon_part(damage_state, body_part) update_tail_showing(0) -/mob/living/carbon/human/proc/create_hair_icon() - if(!should_we_show_hair()) // if we're missing our head or we're wearing a mask, no hair - return - validate_hair() // make sure our hair is valid - var/icon/face_standing = new /icon('icons/mob/human_face.dmi',"bald_s") //base icons - var/icon/facial_s = facial_hair_icon() - if (facial_s) - face_standing.Blend(facial_s, ICON_OVERLAY) - var/icon/hair_s = hair_icon() - if (hair_s) - face_standing.Blend(hair_s, ICON_OVERLAY) - overlays_standing[HAIR_LAYER] = image(face_standing) //HAIR OVERLAY /mob/living/carbon/human/proc/update_hair(var/update_icons=1) - overlays_standing[HAIR_LAYER] = null //Reset our hair - create_hair_icon() // do the hair blending - if(update_icons) - update_icons() - + //Reset our hair + overlays_standing[HAIR_LAYER] = null + + var/datum/organ/external/head/head_organ = get_organ("head") + if( !head_organ || (head_organ.status & ORGAN_DESTROYED) ) + if(update_icons) update_icons() + return + + //masks and helmets can obscure our hair. + if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) + if(update_icons) update_icons() + return + + //base icons + var/icon/face_standing = new /icon('icons/mob/human_face.dmi',"bald_s") + + if(f_style) + var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] + if(facial_hair_style && facial_hair_style.species_allowed && src.species.name in facial_hair_style.species_allowed) + var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") + if(facial_hair_style.do_colouration) + facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) + + face_standing.Blend(facial_s, ICON_OVERLAY) + + if(h_style && !(head && (head.flags & BLOCKHEADHAIR))) + var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] + if(hair_style && src.species.name in hair_style.species_allowed) + var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") + if(hair_style.do_colouration) + hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) + + face_standing.Blend(hair_s, ICON_OVERLAY) + + overlays_standing[HAIR_LAYER] = image(face_standing) + + if(update_icons) update_icons() /mob/living/carbon/human/update_mutations(var/update_icons=1) var/fat @@ -978,12 +988,16 @@ proc/get_damage_icon_part(damage_state, body_part) overlays_standing[L_HAND_LAYER] = null if(update_icons) update_icons() - /mob/living/carbon/human/proc/update_tail_showing(var/update_icons=1) overlays_standing[TAIL_LAYER] = null - var/icon/tail_s = tail_icon() - if (tail_s) - overlays_standing[TAIL_LAYER] = image(tail_s) + + if(species.tail) + if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space)) + var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s") + tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + + overlays_standing[TAIL_LAYER] = image(tail_s) + if(update_icons) update_icons() diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index b5043fd2..8837307a 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -105,11 +105,6 @@ //H.jitteriness = 0 H.update_hair() return - - -/datum/species/proc/get_eye_icon() - return eyes - /datum/species/human name = "Human" @@ -333,9 +328,6 @@ blood_color = "#1F181F" flesh_color = "#575757" - - var/brain_type = 'posibrain' // default is robots - //Species unarmed attacks diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index bb03edb4..6927f837 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -168,11 +168,6 @@ name = "camera" icon_state = "camera" icon_state_broken = "camera_broken" - -/obj/item/robot_parts/robot_component/law_computer - name = "law computer" - icon_state = "radio" - icon_state_broken = "radio_broken" /obj/item/robot_parts/robot_component/diagnosis_unit name = "diagnosis unit" diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 5db2878a..f704f6c2 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -177,42 +177,590 @@ datum/preferences g_skin = green b_skin = blue - proc/job_type_info() - var/job_type=null - var/job_index=null - if (job_civilian_high) - job_type="[CIVILIAN]" - job_index="[job_civilian_high]" - if (job_engsec_high) - job_type="[ENGSEC]" - job_index="[job_engsec_high]" - if (job_medsci_high) - job_type="[MEDSCI]" - job_index="[job_medsci_high]" - if (!job_type) - job_type="DEFAULT" - job_index=1 - return list(job_type,job_index) - - proc/update_preview_icon() //this is a little better - jf + + proc/update_preview_icon() //seriously. This is horrendous. del(preview_icon_front) del(preview_icon_side) del(preview_icon) + + var/g = "m" + if(gender == FEMALE) g = "f" + + var/icon/icobase var/datum/species/current_species = all_species[species] - if(!current_species) // no species? no preview for you - return - preview_icon = new/icon("icons/turf/floors.dmi","floor") - preview_icon.Blend(current_species.create_body_preview_icon(src),ICON_OVERLAY) // create the body icon + + if(current_species) + icobase = current_species.icobase + else + icobase = 'icons/mob/human_races/r_human.dmi' + + preview_icon = new /icon(icobase, "torso_[g]") + preview_icon.Blend(new /icon(icobase, "groin_[g]"), ICON_OVERLAY) + preview_icon.Blend(new /icon(icobase, "head_[g]"), ICON_OVERLAY) + + for(var/name in list("r_arm","r_hand","r_leg","r_foot","l_leg","l_foot","l_arm","l_hand")) + if(organ_data[name] == "amputated") continue + + var/icon/temp = new /icon(icobase, "[name]") + if(organ_data[name] == "cyborg") + temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) + + preview_icon.Blend(temp, ICON_OVERLAY) + + //Tail + if(current_species && (current_species.tail)) + var/icon/temp = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[current_species.tail]_s") + preview_icon.Blend(temp, ICON_OVERLAY) + + // Skin color + if(current_species && (current_species.flags & HAS_SKIN_COLOR)) + preview_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + + // Skin tone + if(current_species && (current_species.flags & HAS_SKIN_TONE)) + if (s_tone >= 0) + preview_icon.Blend(rgb(s_tone, s_tone, s_tone), ICON_ADD) + else + preview_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT) + + var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = current_species ? current_species.eyes : "eyes_s") + eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) + + var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] + if(hair_style) + var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") + hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) + eyes_s.Blend(hair_s, ICON_OVERLAY) + + var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] + if(facial_hair_style) + var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") + facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) + eyes_s.Blend(facial_s, ICON_OVERLAY) + + var/icon/underwear_s = null + if(underwear > 0 && underwear < 7 && (current_species && (current_species.flags & HAS_UNDERWEAR))) + underwear_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = "underwear[underwear]_[g]_s") + + var/icon/undershirt_s = null + if(undershirt > 0 && undershirt < 16 && (current_species && (current_species.flags & HAS_UNDERWEAR))) + undershirt_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = "undershirt[undershirt]_s") + + var/icon/clothes_s = null + if(job_civilian_low & ASSISTANT)//This gives the preview icon clothes depending on which job(if any) is set to 'high' + clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + else if(backbag == 3 || backbag == 4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + + else if(job_civilian_high)//I hate how this looks, but there's no reason to go through this switch if it's empty + switch(job_civilian_high) + if(HOP) + clothes_s = new /icon('icons/mob/uniform.dmi', "hop_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "ianshirt"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(BARTENDER) + clothes_s = new /icon('icons/mob/uniform.dmi', "ba_suit_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "tophat"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(BOTANIST) + clothes_s = new /icon('icons/mob/uniform.dmi', "hydroponics_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "ggloves"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "apron"), ICON_OVERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "nymph"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-hyd"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(CHEF) + clothes_s = new /icon('icons/mob/uniform.dmi', "chef_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "chef"), ICON_OVERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "apronchef"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(JANITOR) + clothes_s = new /icon('icons/mob/uniform.dmi', "janitor_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "bio_janitor"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(LIBRARIAN) + clothes_s = new /icon('icons/mob/uniform.dmi', "red_suit_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "hairflower"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(QUARTERMASTER) + clothes_s = new /icon('icons/mob/uniform.dmi', "qm_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "poncho"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(CARGOTECH) + clothes_s = new /icon('icons/mob/uniform.dmi', "cargotech_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "flat_cap"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(MINER) + clothes_s = new /icon('icons/mob/uniform.dmi', "miner_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "bearpelt"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(LAWYER) + clothes_s = new /icon('icons/mob/uniform.dmi', "internalaffairs_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "briefcase"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "suitjacket_blue"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(CHAPLAIN) + clothes_s = new /icon('icons/mob/uniform.dmi', "chapblack_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "imperium_monk"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(CLOWN) + clothes_s = new /icon('icons/mob/uniform.dmi', "clown_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "clown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/mask.dmi', "clown"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "clownpack"), ICON_OVERLAY) + if(MIME) + clothes_s = new /icon('icons/mob/uniform.dmi', "mime_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "lgloves"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/mask.dmi', "mime"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "beret"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "suspenders"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) +/* if(INTERN) + clothes_s = new /icon('icons/mob/uniform.dmi', "white_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + else if(backbag == 3 || backbag == 4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)*/ + + else if(job_medsci_high) + switch(job_medsci_high) + if(RD) + clothes_s = new /icon('icons/mob/uniform.dmi', "director_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "petehat"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-tox"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(SCIENTIST) + clothes_s = new /icon('icons/mob/uniform.dmi', "sciencewhite_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_tox_open"), ICON_OVERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "metroid"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-tox"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(XENOBIOLOGIST) + clothes_s = new /icon('icons/mob/uniform.dmi', "sciencewhite_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_tox_open"), ICON_OVERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "metroid"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-tox"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(CHEMIST) + clothes_s = new /icon('icons/mob/uniform.dmi', "chemistrywhite_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labgreen"), ICON_OVERLAY) + else + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_chem_open"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-chem"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(CMO) + clothes_s = new /icon('icons/mob/uniform.dmi', "cmo_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "bio_cmo"), ICON_OVERLAY) + else + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_cmo_open"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(DOCTOR) + clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "surgeon"), ICON_OVERLAY) + else + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(EMT) + clothes_s = new /icon('icons/mob/uniform.dmi', "emt_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "fr_jacket_open"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "emtpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-emt"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(GENETICIST) + clothes_s = new /icon('icons/mob/uniform.dmi', "geneticswhite_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "monkeysuit"), ICON_OVERLAY) + else + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_gen_open"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-gen"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(VIROLOGIST) + clothes_s = new /icon('icons/mob/uniform.dmi', "virologywhite_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/mask.dmi', "sterile"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir_open"), ICON_OVERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "plaguedoctor"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-vir"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(ROBOTICIST) + clothes_s = new /icon('icons/mob/uniform.dmi', "robotics_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "toolbox_blue"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(INTERN_MED) + clothes_s = new /icon('icons/mob/uniform.dmi', "medical_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "medicalpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-med"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(INTERN_SCI) + clothes_s = new /icon('icons/mob/uniform.dmi', "sciencewhite_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-tox"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + + else if(job_engsec_high) + switch(job_engsec_high) + if(CAPTAIN) + clothes_s = new /icon('icons/mob/uniform.dmi', "captain_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "centcomcaptain"), ICON_OVERLAY) + else + clothes_s.Blend(new /icon('icons/mob/head.dmi', "captain"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-cap"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(HOS) + clothes_s = new /icon('icons/mob/uniform.dmi', "hosred_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "hosberet"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(WARDEN) + clothes_s = new /icon('icons/mob/uniform.dmi', "warden_s") + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "slippers_worn"), ICON_OVERLAY) + else + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(DETECTIVE) + clothes_s = new /icon('icons/mob/uniform.dmi', "wardentanclothes_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/mask.dmi', "cigaron"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + + if(FORENSICS) + clothes_s = new /icon('icons/mob/uniform.dmi', "polsuit_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "laceups"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_open"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + + if(OFFICER) + clothes_s = new /icon('icons/mob/uniform.dmi', "secred_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "officerberet"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(CHIEF) + clothes_s = new /icon('icons/mob/uniform.dmi', "chief_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "hardhat0_white"), ICON_OVERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "blueprints"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(ENGINEER) + clothes_s = new /icon('icons/mob/uniform.dmi', "engine_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "hardhat0_yellow"), ICON_OVERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "hazard"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(ATMOSTECH) + clothes_s = new /icon('icons/mob/uniform.dmi', "atmos_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/hands.dmi', "bgloves"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/belt.dmi', "utility"), ICON_OVERLAY) + if(prob(1)) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "firesuit"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-norm"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(INTERN_SEC) + clothes_s = new /icon('icons/mob/uniform.dmi', "redshirt2_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "jackboots"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "officerberet"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "securitypack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-sec"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(INTERN_ENG) + clothes_s = new /icon('icons/mob/uniform.dmi', "engine_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "orange"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "e_beret_badge"), ICON_OVERLAY) + switch(backbag) + if(2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "engiepack"), ICON_OVERLAY) + if(3) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel-eng"), ICON_OVERLAY) + if(4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + + if(AI)//Gives AI and borgs assistant-wear, so they can still customize their character + clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "straight_jacket"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "cardborg_h"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + else if(backbag == 3 || backbag == 4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(CYBORG) + clothes_s = new /icon('icons/mob/uniform.dmi', "grey_s") + clothes_s.Blend(new /icon('icons/mob/feet.dmi', "black"), ICON_UNDERLAY) + clothes_s.Blend(new /icon('icons/mob/suit.dmi', "cardborg"), ICON_OVERLAY) + clothes_s.Blend(new /icon('icons/mob/head.dmi', "cardborg_h"), ICON_OVERLAY) + if(backbag == 2) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "backpack"), ICON_OVERLAY) + else if(backbag == 3 || backbag == 4) + clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY) + if(disabilities & NEARSIGHTED) preview_icon.Blend(new /icon('icons/mob/eyes.dmi', "glasses"), ICON_OVERLAY) - if (current_species.flags & HAS_UNDERWEAR) // do we even need to handle underwear? - if(underwear > 0 && underwear < 7) - preview_icon.Blend(new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = "underwear[underwear]_[(gender==FEMALE) ? "f" : "m"]_s"),ICON_OVERLAY) - if(undershirt > 0 && undershirt < 16) - preview_icon.Blend(new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = "undershirt[undershirt]_s"),ICON_OVERLAY) - var/list/job_types=job_type_info() - var/datum/preview/job/current_job=get_job_preview_for_index(job_types[1],job_types[2]) - if(istype(current_job)) - preview_icon.Blend(current_job.create_clothes_icon(backbag), ICON_OVERLAY) + + preview_icon.Blend(eyes_s, ICON_OVERLAY) + if(underwear_s) + preview_icon.Blend(underwear_s, ICON_OVERLAY) + if(undershirt_s) + preview_icon.Blend(undershirt_s, ICON_OVERLAY) + if(clothes_s) + preview_icon.Blend(clothes_s, ICON_OVERLAY) preview_icon_front = new(preview_icon, dir = SOUTH) - preview_icon_side = new(preview_icon, dir = WEST) \ No newline at end of file + preview_icon_side = new(preview_icon, dir = WEST) + + del(eyes_s) + del(underwear_s) + del(undershirt_s) + del(clothes_s) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 70f2d187..fe20acd3 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -43,10 +43,6 @@ // how often wounds should be updated, a higher number means less often var/wound_update_accuracy = 1 - - var/datum/synthetic_limb_cover/covering = null // paint or synth skin - - var/gendered = FALSE /datum/organ/external/New(var/datum/organ/external/P) @@ -517,36 +513,17 @@ Note that amputating the affected organ does in fact remove the infection from t if (open && !clamped && (H && !(H.species.flags & NO_BLOOD))) //things tend to bleed if they are CUT OPEN status |= ORGAN_BLEEDING - - -/datum/organ/external/proc/can_take_covering() // is this organ functional enough to take a covering - if (status&(ORGAN_DESTROYED|ORGAN_BROKEN|ORGAN_DEAD)) - return - return (burn_dam + brute_dam) <= (max_damage * 0.1) // you get hurt you're going to lose your covering - - + + // new damage icon system // adjusted to set damage_state to brute/burn code only (without r_name0 as before) /datum/organ/external/proc/update_icon() var/n_is = damage_state_text() if (n_is != damage_state) damage_state = n_is - return TRUE - if (covering) // check to see if we lose the covering - if (covering.coverage==SYNTHETIC_COVERING_WORKING) - if (!can_take_covering()) // if your limbs get badly damaged you lose the covering - covering.coverage = SYNTHETIC_COVERING_DAMAGED - owner.update_body(TRUE) - return TRUE - return FALSE - -/datum/organ/external/head/update_icon() - var/result = ..() - if (result) - owner.update_hair() - return result - - + return 1 + return 0 + // new damage icon system // returns just the brute/burn damage code /datum/organ/external/proc/damage_state_text() @@ -573,8 +550,6 @@ Note that amputating the affected organ does in fact remove the infection from t tbrute = 2 else tbrute = 3 - - return "[tbrute][tburn]" /**************************************************** @@ -829,52 +804,14 @@ Note that amputating the affected organ does in fact remove the infection from t return 1 return 0 - -/datum/organ/external/proc/get_icon_key() - if (status & ORGAN_DESTROYED) - return "L" // l for lost - if (status & ORGAN_DEAD) - return "D" // d for dead - if (status & ORGAN_ROBOT) - return get_synthetic_icon_key() - return "G" // regular old limb +/datum/organ/external/get_icon(var/icon/race_icon, var/icon/deform_icon,gender="") + if (status & ORGAN_ROBOT && !(owner.species && owner.species.flags & IS_SYNTHETIC)) + return new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]") + if (status & ORGAN_MUTATED) + return new /icon(deform_icon, "[icon_name][gender ? "_[gender]" : ""]") -/datum/organ/external/proc/valid_covering() - if (status & ORGAN_ROBOT) - if (covering) - return (covering.coverage) // is our covering working? - return FALSE // if we have no covering at all - return TRUE // squishies always have skin - - -/datum/organ/external/proc/get_synthetic_icon_key() - if (!covering) // no covering at all, this should not happen - return "R" // regular old robot - return covering.get_icon_key() - - -/datum/organ/external/proc/get_synthetic_icon() - if (!covering) // no covering at all, this should not happen - return new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][get_gender_string()]") - return covering.get_icon() - - -/datum/organ/external/proc/get_gender_string() - if (!gendered) // most organs aren't gender specific - return "" - if (owner) // if we're a gender specific organ with an owner - return (owner.gender == FEMALE ? "_f" : "_m") - return "_f" - - -/datum/organ/external/get_icon(var/icon/race_icon, var/icon/deform_icon, var/list/skin_info) - if (status & ORGAN_ROBOT) - return get_synthetic_icon() - var/icon/result = new /icon((status & ORGAN_MUTATED) ? deform_icon : race_icon, "[icon_name][get_gender_string()]") - if (skin_info["blend"]) - result.Blend(skin_info["rgb"],skin_info["mode"]) - return result + return new /icon(race_icon, "[icon_name][gender ? "_[gender]" : ""]") /datum/organ/external/proc/is_usable() @@ -930,7 +867,6 @@ Note that amputating the affected organ does in fact remove the infection from t body_part = UPPER_TORSO vital = 1 encased = "ribcage" - gendered = TRUE /datum/organ/external/groin name = "groin" @@ -940,7 +876,6 @@ Note that amputating the affected organ does in fact remove the infection from t min_broken_damage = 30 body_part = LOWER_TORSO vital = 1 - gendered = TRUE /datum/organ/external/l_arm name = "l_arm" @@ -1036,8 +971,16 @@ Note that amputating the affected organ does in fact remove the infection from t var/disfigured = 0 vital = 1 encased = "skull" - gendered = TRUE - + +/datum/organ/external/head/get_icon(var/icon/race_icon, var/icon/deform_icon) + if (!owner) + return ..() + var/g = "m" + if(owner.gender == FEMALE) g = "f" + if (status & ORGAN_MUTATED) + . = new /icon(deform_icon, "[icon_name]_[g]") + else + . = new /icon(race_icon, "[icon_name]_[g]") /datum/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) ..(brute, burn, sharp, edge, used_weapon, forbidden_limbs) @@ -1069,7 +1012,6 @@ obj/item/weapon/organ icon = 'icons/mob/human_races/r_human.dmi' var/op_stage = 0 var/list/organs_internal = list() - obj/item/weapon/organ/New(loc, mob/living/carbon/human/H) ..(loc) @@ -1084,12 +1026,12 @@ obj/item/weapon/organ/New(loc, mob/living/carbon/human/H) for(var/datum/organ/internal/I in H.internal_organs) if(I.parent_organ != name) continue - var/obj/item/organ/new_organ_object = I.remove() - if(new_organ_object && istype(new_organ_object)) - new_organ_object.removed(H) - if(new_organ_object.organ_data) - organs_internal |= new_organ_object.organ_data - new_organ_object.loc = src // put the organ inside the severed external organ + var/obj/item/organ/current_organ = I.remove() + current_organ.removed(H) + current_organ.loc = src + if(current_organ.organ_data) + organs_internal |= current_organ.organ_data + // Forming icon for the limb // Setting base icon for this mob's race var/icon/base @@ -1097,13 +1039,24 @@ obj/item/weapon/organ/New(loc, mob/living/carbon/human/H) base = icon(H.species.icobase) else base = icon('icons/mob/human_races/r_human.dmi') - if(base) // handle skin colours - var/list/skin_info = H.skin_colour_info() // get the skin tone info - base.Blend(skin_info["rgb"],skin_info["mode"]) + + if(base) + //Changing limb's skin tone to match owner + if(!H.species || H.species.flags & HAS_SKIN_TONE) + if (H.s_tone >= 0) + base.Blend(rgb(H.s_tone, H.s_tone, H.s_tone), ICON_ADD) + else + base.Blend(rgb(-H.s_tone, -H.s_tone, -H.s_tone), ICON_SUBTRACT) + + if(base) + //Changing limb's skin color to match owner + if(!H.species || H.species.flags & HAS_SKIN_COLOR) + base.Blend(rgb(H.r_skin, H.g_skin, H.b_skin), ICON_ADD) + icon = base set_dir(SOUTH) src.transform = turn(src.transform, rand(70,130)) - + /**************************************************** EXTERNAL ORGAN ITEMS DEFINES @@ -1137,7 +1090,8 @@ obj/item/weapon/organ/head name = "head" icon_state = "head_m" var/mob/living/carbon/brain/brainmob - + var/brain_op_stage = 0 + /obj/item/weapon/organ/head/posi name = "robotic head" @@ -1182,15 +1136,13 @@ obj/item/weapon/organ/attackby(obj/item/weapon/W as obj, mob/user as mob) if(2) if(istype(W,/obj/item/weapon/hemostat)) if(contents.len) - var/obj/item/organ/removing = pick(contents) - var/exposed_result + var/obj/item/removing = pick(contents) removing.loc = get_turf(user.loc) - if(istype(removing)) + if(!(user.l_hand && user.r_hand)) + user.put_in_hands(removing) + if(istype(removing,/obj/item/organ)) var/obj/item/organ/removed_organ = removing organs_internal -= removed_organ.organ_data - exposed_result = removing.exposed_to_the_world() - if(!(user.l_hand && user.r_hand)) - user.put_in_hands((isnull(exposed_result)) ? removing : exposed_result) user.visible_message("[user] extracts [removing] from [src] with [W]!") else user.visible_message("[user] fishes around fruitlessly in [src] with [W].") diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 3ee262b7..6b9595d9 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -249,25 +249,6 @@ parent_organ = "head" removed_type = /obj/item/organ/brain vital = 1 - - -/datum/organ/internal/brain/robot // brains for shells - var/machine_brain_type=null - - -/datum/organ/internal/brain/robot/proc/create_robot_brain_replacement(var/target,var/new_location) - var/obj/item/device/mmi/new_mmi - if (machine_brain_type=="Posibrain") - new_mmi = new/obj/item/device/mmi/posibrain() - new_mmi.name = "positronic brain ([owner])" - new_mmi.brainmob.name = owner.real_name - new_mmi.brainmob.real_name = owner.real_name - else - new_mmi = new/obj/item/device/mmi() - new_mmi.transfer_identity(target) - new_mmi.loc = new_location - return new_mmi - /datum/organ/internal/brain/xeno removed_type = /obj/item/organ/brain/xeno diff --git a/code/modules/organs/organ_objects.dm b/code/modules/organs/organ_objects.dm index c375cbb4..a97f1f28 100644 --- a/code/modules/organs/organ_objects.dm +++ b/code/modules/organs/organ_objects.dm @@ -180,11 +180,6 @@ msg_admin_attack("[user.name] ([user.ckey]) removed a vital organ ([src]) from [target.name] ([target.ckey]) (INTENT: [uppertext(user.a_intent)]) (JMP)") target.death() - -/obj/item/organ/proc/exposed_to_the_world() // this is only useful for organs that change when actually removed from the body - return - - /obj/item/organ/appendix/removed(var/mob/living/target,var/mob/living/user) ..() diff --git a/code/modules/organs/synth_skin.dm b/code/modules/organs/synth_skin.dm deleted file mode 100644 index 27a55411..00000000 --- a/code/modules/organs/synth_skin.dm +++ /dev/null @@ -1,362 +0,0 @@ -/* - -We need to mix blending into limb object code, this will slow shit down a lot. - -*/ - -var/SYNTHETIC_COVERING_WORKING=1 -var/SYNTHETIC_COVERING_DAMAGED=0 - -datum/synthetic_limb_cover - var/coverage // - var/colour=null// - var/datum/organ/external/limb_datum // the limb in question - var/obj/item/robot_parts/limb_item // also the limb in question (if dismembered) - var/main_icon = 'icons/mob/human_races/robotic.dmi' - var/damage_icon = 'icons/mob/human_races/robotic.dmi' - var/icon_key_type="BAD" - var/hair_species=null - var/eyes_state = "blank_eyes" - var/tail = null - - -datum/synthetic_limb_cover/New( var/datum/organ/external/datum_target=null,var/input_colour=null) - limb_datum=datum_target - coverage=SYNTHETIC_COVERING_WORKING // start working - colour= (input_colour) ? input_colour : rgb(128,128,128) - - -datum/synthetic_limb_cover/proc/get_icon() // default mechanical limbs return robo versions - var/icon/temp = new /icon((coverage ? main_icon : damage_icon), "[limb_datum.icon_name][limb_datum.get_gender_string()]") // only add a gender if it's necessary - var/icon/result = icon(temp) - result.Blend(colour, ICON_ADD) - return result - - -datum/synthetic_limb_cover/proc/repair() - coverage = SYNTHETIC_COVERING_WORKING - update_icon() - - -datum/synthetic_limb_cover/proc/damage() - coverage = SYNTHETIC_COVERING_DAMAGED - update_icon() - - -datum/synthetic_limb_cover/proc/set_colour(input_colour) - colour=input_colour - - -datum/synthetic_limb_cover/proc/update_icon() - if (limb_datum) - if (limb_datum.owner) - limb_datum.owner.update_body() - - -datum/synthetic_limb_cover/proc/get_icon_key() // this is going to wreck the icon cache but to do custom colour per limb this is necessary - return "SYNTH:[icon_key_type]:[colour]:[coverage]" - - -datum/synthetic_limb_cover/paint - main_icon = 'icons/mob/human_races/r_machine.dmi' - icon_key_type = "Paint" - hair_species = "Machine" - - -datum/synthetic_limb_cover/skin - main_icon = 'icons/mob/human_races/r_human_grey.dmi' - icon_key_type = "Skin" - hair_species = "Human" - eyes_state="eyes_s" - - -datum/synthetic_limb_cover/fur - main_icon = 'icons/mob/human_races/r_tajaran.dmi' - icon_key_type = "Fur" - hair_species = "Tajaran" - eyes_state="eyes_s" - tail = "tajtail" - - -datum/synthetic_limb_cover/scales - main_icon = 'icons/mob/human_races/r_lizard.dmi' - icon_key_type = "Scales" - hair_species = "Unathi" - eyes_state="eyes_s" - tail = "sogtail" - - -var/list/limb_covering_references -/proc/get_limb_covering_references() - if (isnull(limb_covering_references)) - limb_covering_references = list() - for(var/skin_type in typesof(/datum/synthetic_limb_cover)-/datum/synthetic_limb_cover) - var/datum/synthetic_limb_cover/temp_cover = new skin_type() - limb_covering_references[skin_type]=temp_cover - return limb_covering_references - - -var/list/limb_covering_names -/proc/get_limb_covering_names() - if (isnull(limb_covering_names)) - limb_covering_names=list("None") - var/list/refs=get_limb_covering_references() - for(var/skin_type in refs) - var/datum/synthetic_limb_cover/temp=refs[skin_type] - limb_covering_names.Add(temp.icon_key_type) - return limb_covering_names - - -var/list/limb_covering_list -/proc/get_limb_covering_list() - if(isnull(limb_covering_list)) - limb_covering_list=list("None"=null) - var/list/refs=get_limb_covering_references() - for(var/skin_type in refs) - var/datum/synthetic_limb_cover/temp=refs[skin_type] - limb_covering_list[temp.icon_key_type]=skin_type - return limb_covering_list - - -/obj/item/weapon/synth_skin_spray - name = "robot paint gun" - desc = "A compact hand-held spray gun for painting synthetics." - icon = 'icons/obj/synthskin.dmi' - icon_state = "spray_can_icon" - force = 5.0 - throwforce = 7.0 - w_class = 2.0 - flags = FPRINT | TABLEPASS - slot_flags = SLOT_BELT - origin_tech = "materials=1;engineering=1" - attack_verb = list("bashed", "battered", "bludgeoned", "whacked") - var/icon/spray_can_icon = null - var/obj/item/weapon/synth_skin_cartridge/cartridge = null - var/construction_time = 20 - var/list/construction_cost = list("metal"=400,"glass"=100) - New() - update_icon() - - -proc/create_tinted_icon(icon_name, icon_state_name, target_colour) - var/icon/result = new /icon(icon_name,icon_state_name) - result.Blend(target_colour, ICON_ADD) // if we have charges left, show the colour, otherwise grey - return result - - -/obj/item/weapon/synth_skin_spray/proc/paint_icon() - return create_tinted_icon(icon,"installed_paint_skin",cartridge.paint_colour) - -/obj/item/weapon/synth_skin_spray/proc/hair_icon() - return create_tinted_icon(icon,"installed_paint_hair",cartridge.hair_colour) - -/obj/item/weapon/synth_skin_spray/proc/cartridge_icon() - return new/icon(icon,"[cartridge.installed_icon]") - -/obj/item/weapon/synth_skin_spray/proc/charges_icon() - return new/icon(icon,"charges_[cartridge.current_charges]") - - -/obj/item/weapon/synth_skin_spray/update_icon() - underlays.Cut() - overlays.Cut() - if (cartridge) - underlays += cartridge_icon() - underlays += paint_icon() - underlays += hair_icon() - overlays += charges_icon() - - -/obj/item/weapon/synth_skin_spray/attack(mob/M, mob/user) - switch (user.a_intent) - if ("hurt") - ..(M,user) - playsound(loc, "swing_hit", 50, 1, -1) - if("help") - return try_to_paint(M,user) - - -/obj/item/weapon/synth_skin_spray/proc/allowed_to_paint(mob/living/carbon/human/human_target, mob/user, target) - if (!cartridge) - user << "You cannot paint anything with an empty spray gun." - if (human_target!=user) - human_target << "[user] waves the spray gun vaguely toward you but the gun is empty." - return - if (!cartridge.current_charges) - user << "You click the [src] but your [cartridge] is empty." - if (human_target!=user) - human_target << "[user] clicks the [src] at you but their [cartridge] is empty." - return - if(!istype(human_target,/mob/living/carbon/human)) - user << "You can't figure out a way you could apply paint to [human_target]." - if (human_target!=user) - human_target << "[user] stares at you and appears to decide that they're unable to paint you." - return - var/datum/organ/external/datum_target=human_target.get_organ(target) - if(!datum_target || (!datum_target.can_take_covering())) - user << "You cannot paint [human_target]'s [target] because it's too badly damaged." - if (human_target!=user) - human_target << "[user] goes to paint your [target] but it's too badly damaged." - return - if (!(datum_target.status && ORGAN_ROBOT)) - if (human_target!=user) - user << "You go to paint [human_target]'s [target] but realize that it isn't robotic.." - human_target << "[user] looks like they are about to try to paint your [target] before realizing that it isn't robotic." - else - user << "Your [target] isn't robotic, so you decide not to try to paint it." - return - return TRUE - - -/obj/item/weapon/synth_skin_spray/proc/try_to_paint(mob/living/carbon/human/human_target, mob/user) - var/target=user.zone_sel.selecting - if (target in list("mouth","eyes")) // we don't paint these individually - target="head" - if (allowed_to_paint(human_target,user,target)) - paint_organ(human_target, user, human_target.get_organ(target)) - - -/obj/item/weapon/synth_skin_spray/proc/paint_organ(mob/M, mob/user, datum/organ/external/datum_target) - if (datum_target.covering) // if we've already got a covering, remove it - del(datum_target.covering) - datum_target.covering = new cartridge.covering_path(datum_target,cartridge.paint_colour) - var/mob/living/carbon/human/human_target = M - if (istype(datum_target,/datum/organ/external/head)) - var/list/hair_colour_as_list = htmlcolour_to_values(cartridge.hair_colour) - human_target.r_hair = hair_colour_as_list[1] // byond starts at 1! WHYYYYYYY?!!!! -jf - human_target.g_hair = hair_colour_as_list[2] - human_target.b_hair = hair_colour_as_list[3] - human_target.r_facial = hair_colour_as_list[1] - human_target.g_facial = hair_colour_as_list[2] - human_target.b_facial = hair_colour_as_list[3] - human_target.h_style=random_hair_style(human_target.gender,human_target.species) - human_target.update_hair() - - - if (istype(datum_target,/datum/organ/external/groin)) // this is a bit reductive, but whatever - var/gender_string = input(user,"What sex do you want this shell to appear as?") in list("Male","Female") - human_target.gender = (gender_string=="Male") ? MALE : FEMALE - human_target.update_body(TRUE) - cartridge.current_charges-- - user.visible_message("[user] has covered [M]'s [datum_target.display_name] with [cartridge.covering_description].") - update_icon() - - -/obj/item/weapon/synth_skin_spray/attackby(obj/item/weapon/W, mob/user) - if(istype(W, /obj/item/weapon/synth_skin_cartridge)) - if (!cartridge) - user.drop_item() - W.loc = src - cartridge=W - user << "You insert \the [W] into [src]." - update_icon() - else - user << "You will have to remove the other cartridge first." - - -/obj/item/weapon/synth_skin_spray/attack_hand(mob/user) - var/obj/item/inactive_item = user.get_inactive_hand() - if (src==inactive_item) // if we are clicking on this with our off hand - if(src.cartridge) - src.cartridge.add_fingerprint(user) - user.put_in_active_hand(src.cartridge) - user << "You remove \the [src.cartridge] from the [src]." - src.cartridge.update_icon() - src.cartridge = null - update_icon() - return - return ..() - - -/obj/item/weapon/synth_skin_cartridge - name = "ERROR" - desc = "You should not be reading this." - icon = 'icons/obj/synthskin.dmi' - icon_state = "bottle_paint" - var/installed_icon = "installed_paint" - flags = FPRINT | TABLEPASS - var/max_charges = 9 - var/current_charges = 9 - var/construction_time = 20 - var/paint_colour = null - var/hair_colour = null - var/covering_description = "paint" - var/list/construction_cost = list("metal"=200,"glass"=50) - var/covering_path = "/datum/synthetic_limb_cover/paint" - origin_tech = "materials=1;engineering=1" - New() - paint_colour = rgb(128,128,128) // starts on red - hair_colour = rgb(128,128,128) // starts black - update_icon() - - -/obj/item/weapon/synth_skin_cartridge/proc/get_charges_string() - return " It looks like there are [current_charges] charges left." - - -/obj/item/weapon/synth_skin_cartridge/examine(mob/user) - user << src.desc + get_charges_string() - - -/obj/item/weapon/synth_skin_cartridge/attack_self(mob/user) - pick_colours(user) - - -/obj/item/weapon/synth_skin_cartridge/proc/pick_colours(mob/user) - var/new_paint = input(user, "Choose the primary colour you want to paint.", "Synthetic Painting") as color|null - if(new_paint) - paint_colour = new_paint - var/new_hair = input(user, "Choose the hair colour you want to paint.", "Synthetic Painting") as color|null - if(new_hair) - hair_colour = new_hair - update_icon() - - -/obj/item/weapon/synth_skin_cartridge/proc/paint_icon() - return create_tinted_icon(icon,"bottle_paint_skin",paint_colour) - - -/obj/item/weapon/synth_skin_cartridge/proc/hair_icon() - return create_tinted_icon(icon,"bottle_paint_hair",hair_colour) - - -/obj/item/weapon/synth_skin_cartridge/update_icon() - overlays.Cut() - if (current_charges > 0) - overlays += paint_icon() - overlays += hair_icon() - - -/obj/item/weapon/synth_skin_cartridge/paint - name = "synthetic paint cartridge" - desc = "A small cartridge for robotic paint." - - -/obj/item/weapon/synth_skin_cartridge/skin - name = "synthetic skin cartridge" - desc = "A small cartridge filled with pressurized synthetic skin. It's covered in thin grease." - icon_state = "bottle_skin" - installed_icon = "installed_skin" - covering_path = "/datum/synthetic_limb_cover/skin" - origin_tech = "materials=1;engineering=1;biotech=2" - covering_description = "synthetic skin" - - -/obj/item/weapon/synth_skin_cartridge/fur - name = "synthetic fur cartridge" - desc = "A small cartridge filled with pressurized synthetic fur. Dozens of fine hairs are stuck to it with static." - icon_state = "bottle_fur" - installed_icon = "installed_fur" - covering_path = "/datum/synthetic_limb_cover/fur" - origin_tech = "materials=1;engineering=1;biotech=3" - covering_description = "synthetic fur" - - -/obj/item/weapon/synth_skin_cartridge/scales - name = "synthetic scales cartridge" - desc = "A small cartridge filled with pressurized synthetic scales. It makes a dry crunching noise when you shake it." - icon_state = "bottle_scales" - installed_icon = "installed_scales" - covering_path = "/datum/synthetic_limb_cover/scales" - origin_tech = "materials=1;engineering=1;biotech=3" - covering_description = "synthetic scales" \ No newline at end of file diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 3ea958bb..19f64c5d 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -305,11 +305,11 @@ // Extract the organ! if(target.op_stage.current_organ) var/datum/organ/internal/I = target.internal_organs_by_name[target.op_stage.current_organ] + var/obj/item/organ/O if(I && istype(I)) - var/obj/item/organ/new_organ_object = I.remove(user) - if(new_organ_object && istype(new_organ_object)) - new_organ_object.removed(target,user) - new_organ_object.exposed_to_the_world() // useless except for replacements + O = I.remove(user) + if(O && istype(O)) + O.removed(target,user) target.op_stage.current_organ = null fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 1f65c43f51399f33850821ce21dedacf493f0bc9..0f28d76aca1aee24ebddef4208ad1a7a926a247c 100644 GIT binary patch delta 41543 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 W5mNQ#{GZ*^uUxu$G55ULKvgsc;?FQdW~ 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%0A+P|HW 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 diff --git a/icons/mob/human_races/r_human_grey.dmi b/icons/mob/human_races/r_human_grey.dmi deleted file mode 100644 index 0404ad8fa2ad209348cb11ca5ad59ed292933404..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5283 zcmb_gcTiL7w%;Lir6@;5Aj0uj@PHBp0qG!06GA&6&47qPXwne~0aOsAT{#p*npBOU z6C@}>P*71?D3S=M5ow0dQbmg3>)Yw}b{0~S z3X%W-NLg8$I|2X%e1rhvqTu2gUUwB-I^vu!MwP60f5+tS;K~sz3`nP zpQns&TQWz>o?fyxTg&x)DgX3Ujg@e7@hBzc&G2LM%FonAtJ9x4(_rN^+)Qr7qdhyd zYFk|BKUoVy+p#XYNIwl2efzp2B{`#HzIyc6LxbMsBd9AxZ&7Gr*@JT#UYmikx6(hp z`rRewc~neg`E+Jp`9t$2#q7hWSYo(&AwO8Dt3E!63Dhqg+JgM}9c+ij1 zfdl5z#SF8{!wz@MeuQNkwWjU78Wt@_?^C~QHax@BkiES+GAt2PK)xy7aY6rSVWuWZ z*3Ig-zHHz8vEakej`6ag9fZSfJnYQU1ZyklZ)5iuU2(+U5JU#$y4ODQLnKQwOy$ug z9JnLw3&=|J0V=yQAts09p-Gl-QQ&XhJAs2QgNU|73+jDUu5|dzGBOe z)(ca&wzgz}6qW8tBql4KwbEwDOdAAJ!&b-5ieAy{Czq|Z$-h*WQH?VPknRLGZOV*r zoeLHwSl3!uns3ZZ3$e=D(a-gMk@+DIYEs=Wf5S^BS9EA&cZrCwY3{2A!&98o{9eL# zbp^$*8Mi-)&b7Q;tS6C8mG7b-C8v_bOyUop(U{bB5phYjo^`zZ(S`5cuv9y zi<58`Pj#W6-IDq?J{XW48Rw^YE zz3<*h>IHM#Gyw|!?9hhygCpS`o}q^0hYAN?YT3q?ic#>rRg}@U&FVN>ROLS!R<@$R z&^wV9B2-i(0j#2lwW*N~JZGL=Mx5*DF>#?k;%2GFK?7jiR+r4s27xa~T_!Z}Ao*W= z;XKECD;wbPbd8LRoP8fT8TVu43yr72zDGO!NR~Un3sX%e*oxTTgpFiAS;@q z{BAD1XlS1GeC5W0y?giW#@yQ2-cFDY)to5=F}}WQRD!$OE7N=7NXtCqd}T7FJ@lv% zUm3F<7Q4+313oY?YhOi-*q@;j#IrE5?w+2M5d|TFOXB#1DWr;m^Jq64XqFX*pxPeb zuYIK8VS6P->hSbW9hJc^iD)kVpTR)v`Zo!?G9wuJMN115V1G$dj?|j{raDHX0zmZH zZal5=qWU9u9E#fu>DKz-@5e$D7o)sFrU`pKn5C#B`MHtFF3xLI-pC%|_Rv}FAWC+h zNeplN-5`f`3DX-jU9ay$iLPs5zoTOW-0Qx+zi>G3?`yI*Nr*E%IkWNEFr{8REtf&R zgn*cs_hwl@{vX=$*S6-O1;m>YtqbD(06&lOVQ46A&B7(`l3pJsw~**_n*0ItYvI6` zo}Qj=gX|8^6KPusmux)n!D+Y6Di%)yiT$(+*a=9dPpE8+W$cfo~hJ-64j=VG~Kg&qHF1Fn|l^nY}8{bD#ti?Wj$tW zY3QG9kNb9`^bI~>vT?EuGJI1-ys^3Y-n+5*D_4YT0uG9&jMWGnAAd+v5eJEM{`_Xc zc~Fwn)YRgc(8vtPFm#|9Ze&!7;{IN*6$n1fL~#EQ-<^|Dq!s9{>RX!sO^N^7YW@l6 ze~A6RZ_zjsjTy$%WPyy=2UAo`a4t8gy63~a0*T1mW{?8E3U{24$yZ)R`{IoQ3A2-W zd%@y%cuH?27%|)z6a=Oo{Oot9h9`FZ3!N9$qi3A5oR!CW?p4u=f&)PA(0p5)1P~Ds z;nQ@{+^8&csb9qswJjF473d}U{rmS;btuY!)3meI5Nf|@bO&SzQ@hMCzJOe`)BSj4 zrl6enp?k*9`-=JO-Y8;U?{%+s4dR_UsWLG_yZ^JPMZth-$77k8v12n=6=>LK5-MJn z^YaUSK>KuqQDoG?Ts;}RMA4#^jdBgoXG!__duTKPa|k29h0Wp9ug$U`00^$}ja4d- z&8%$C<}K=Aw$E8~IxaVmm0xjUNIBU;CM8ra)t~GeCMzdxNtt_74~d;^!>oKdbK$}T z@4&zvwRR;v)c%|%JiZ{7YyH?+GNMDN-m@cx%c5H}EW68oohM_Bw&}*~e*QJGZRFfF z9+Gj^>yDi9VVx|_zPqnWPn<{T17jlM*0RDQ^96qA%3QJIuj)meTvM{Lvk&IIHJ{}! z)|RbObBw=^J$6cOQ>Ld8B-O=J7Eq11Z;RmQLUZ9~oLy5McOANMTWMMFM43B|oF7lZ zxe75I1$ZXpM|+8no6BZHNg4f|!J7I&Mn*$@ih`nI?_;N0KxIU2qo%gD*Q_FGZqCp7 z*ZhT09b37%a5oCm8*IKUNw`t}0O+R!0|Tl*NfwosuEZN(6nKe^8K$7FTH6all9BY zHeiYMSR^4LLJp8k^&w3%;=Bg@Dktl`&Ymc=nLG8(rOjOmJT~~krWMv7w(~R}=liq^ zoJX!J_3OT45X0xJH%B%MfX-oN0SsUlv^d~@V2 zi&tkjwDBnBWz`Hi*_FXUE0@k!*sE%xiT0}Il$TZtzjKfs;UZH(+DmDEZg5*C4;~1q zt4U9kr=M<{i0KGBK(Y9U@D3%=8>9gC_u|k8iARos8Us@C{smDG96H|iYB%dk;79Eq z0*#$hnkP^GjXkEnLdluYW9kST1p7ZuvsT$_)H(!#GeX$%aVx;%sU$vIO4nUSERqtM z7bH(!@|QEAB^5n{P2w3k-Vvv^>*eO+|X-Bd34IcW}jjx@R3JF zJk;H_$K*w66?QPM5Ln$@bTUA5v#Zh^C8~965TW^yrez=kEIjD;#=l zv70vnQob?VpE!CE$d8%1QMygu6u5w$xfSrh7K3qT49#yiU~cu-@yw88%Q?V+rk9P0YqKs*Pur8SyGD2z0chH4|s(}@XNr~3N) z}S2-7y;6NU0*`rfW5{N4D1(7|DI?ZYC=t#G& z9u1(tHqgr82y5};68HlL*^zlY>D~nHh)2H%(y8{cP^bRFZW?e27T{2e!ISzE({n<% z;cx&X@+(*1Hw*~I-t46aue2}jua_H0rVP5X#Xjg`Cj+m^)8I@-717AI_8}sGGj%d+ z%<=x%*?U2Pb_~Dw%^H%Zv(6H1BQ?|q%;ZzqKU#)%hqnI)%G+!_-B3O?Sw(!cOt2o) zkKCSXLEhV0F~Na02p!AfU?(FdkR4IWE_E*3*46i{dE;-9rm~+0OZ2_kX4mGr36h3y z_?&r-^E1yl4aWUQ8(+vB3~&1`Mvpn(giRkZ0o7$~4H0O-8A;2Q+26$OcI~g{H#6un z=|}{^Ug4>6THnk+SJl=v!n!e!Pd6vAF0JDPrhPU(=oQnQR>1V)#r!G`WO5+ z3I-MyR0qq9%gDF)gC(45xke_(Gk@GK;10EAOd_WRrsxYT{H*i8FgP(A_SqrFH8fZ_ zK5Pg$U>J9cMx!kpDW3}3OQBF=Hy0d`dXYu&oogUU4FzLo4@TPSJhBH{t6glHaM)hW zTe~=zAaOf8eq9aqviQLR6sJxtw+H@eV#39V){e(JHVDSXe#dhVwzdp#3y~zMF34ul zB}QDNVwH+GXpT)yO%-z;02Yh=NG7A=(4aGd&t&||@QzQVkfEzB>7imzD5h;Q$x|%! zaYS{PQh(hz%Hcy`n|rJJp)K#xSS}bJyS09})EIMs7r(Xcx5RLb@wX%J*Yq9KUVx+V z{v^rdAnm)LRRw8d{pNDoi3CChSSu(1rqs8wL7n7EJsUiBBhUktJQjr@xZ^}gS|?AQ z+-0cX8N;KBR`Us=JL)$b1@+R9+kJ0|<$_sxT>VaG{;B&(MYb*M+^Y9_k$(tqsmI z!66|hz=g(PEc<}0v#EBB<#8C!9Jr>Y+~E87w?Na+X9lpN_5dv{Enh%v6dN%+eH%1& zboQM%aY6x{!oJ+sytc~c(gTBu&cEK4Ibe{qOgO)N+KV;>rUTbmD_+!<>CQef*?m*N z;bzR;C|QA8^~% zv>XSGyt0`fe;tj60gbJ#zrPcz>rt_-Usgaxs2HhPn*HI$6BFHgN;wtS{oSLZ_nNx8 zvKfph_2b9)2jI4E9$MUkbh~&F?tTq0pI(ZSOH$)qBA6xBA=$C3Cl-rVmb*0}e$*R) zmukNCm)CdqwXJL&wKnsB!1eVNYoeZGhU@Z)47kb&Tu%!aYvM;sGY;?BO)K53T&^l- zziYS(c_=juM+GV;xi@uCL*aPdwX0Wq5@Dj>jDRUJS=irjY?5PF#{8Z`-Zw4H=%BWoSE3m177$3U@P??cK1 zt1F%KR8W*My4stXk}Yx$n4*z|S~5GBz7{Gn(03Cf4!~rTRNGe#uqz;%D!^7}DeCmZ z${sr06^`L=&5N!sO(R)}khZTfJwB$7LZTAn?Q!h2$%)BHCw-&R3F()n7uRmc=f=Ip zLee}NiXoqbb8*z(q<}I;Om1t4^aFfn3|+xM*m8PF7hqC^EsF_O{$!qtg7(=qiSj`{ z_gfy~Su;yQ2XaO6iDF7!Cty>uLQf-Mmd;r~;Nnh#*RRh}qe$puUt}@bCS-KQm+@$z ziXoe8_gE}-0fm^B_H>PxbWK=F%Vt7exhBpiRZXdUQms<_B&I?UK##!As}7!WC005u}0{{R3yb+fl00015P)t-sz`(#H zBqY!)Go%|L|LmaLz-_6>*k+lT0GSLAbtnl52@wzwi3ktc*VwPGuPrStfq{V$5fT66 zZsf5rGcz+$QBg@3FM$d}6%`d)FGHUbR;x>SqcUi~z`!d()xiJ&00DGTPE!Ct=GbNc z007^5R9JLGWpiV4X>fFDZ*Bkpc$}5gyAFdO6b9fKo`UG!)Jtzemqyb#)K@SRQBG>n z0BzH^uhGHA#p8A$AMg)<@YyB3W;si48GTD*q1Ein;?0(l50p;zizuW-NvM?@7uInn z`_a3%&NZ^=IB4flQi8Glc0fsG_*0Ja9NPzItgT)KeXZb)v{*ePUKM3Lp*SojvYp}I zLU3JxXqO)likn*6;)Iq*v^=2Y9xZoh8KY%{mLXaOXt`aKp!>0DWQpwhbn~**UC_N%U$F8={C>ODU2xW>K>z>%06wtqRfhK8Pn{0=7a&Px!Jz!P`X3L+$^eCQA@59G`UnAC?n4^P ziXUSE0002sFRT4Hoiq%_1Bo)rzCLHAuFvV^^Zq?`eXfFn@*^(&__u;X)djcn6-$?p v)IZIPF;+dz++lsr%6dp@cC60<0B}biy;~S5eR&nL00000NkvXXu0mjft*4ix