From 97452248883ca62844bf466a52485e491202f42d Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 3 Feb 2017 15:38:26 -0600 Subject: [PATCH 01/14] Eyes As Organs --- .../abduction/machinery/experiment.dm | 2 +- code/modules/mob/living/carbon/alien/alien.dm | 35 ----------- code/modules/mob/living/carbon/carbon.dm | 38 ++++++++---- .../mob/living/carbon/carbon_defense.dm | 8 ++- code/modules/mob/living/carbon/human/human.dm | 13 +---- .../mob/living/carbon/human/species.dm | 55 +++++------------- .../carbon/human/species_types/abductors.dm | 1 - .../carbon/human/species_types/jellypeople.dm | 3 - .../human/species_types/shadowpeople.dm | 2 - .../living/simple_animal/hostile/statue.dm | 5 +- code/modules/surgery/bodyparts/head.dm | 1 - code/modules/surgery/organs/organ_internal.dm | 42 +++++++++++++ icons/mob/human_face.dmi | Bin 50435 -> 50534 bytes 13 files changed, 95 insertions(+), 110 deletions(-) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index adc9627ca8f..265838d15a3 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -70,7 +70,7 @@ var/icon/eyes if(EYECOLOR in H.dna.species.species_traits) - eyes = icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[H.dna.species.eyes]") + eyes = icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes") eyes.Blend("#[H.eye_color]", ICON_MULTIPLY) var/datum/sprite_accessory/S diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index e1cf5ade791..5d9d6937bb7 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -151,40 +151,5 @@ Des: Removes all infected images from the alien. #undef HEAT_DAMAGE_LEVEL_2 #undef HEAT_DAMAGE_LEVEL_3 - -/mob/living/carbon/alien/update_sight() - if(!client) - return - if(stat == DEAD) - sight |= SEE_TURFS - sight |= SEE_MOBS - sight |= SEE_OBJS - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_OBSERVER - return - - sight = SEE_MOBS - if(nightvision) - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM - else - see_in_dark = 4 - see_invisible = SEE_INVISIBLE_LIVING - - if(client.eye != src) - var/atom/A = client.eye - if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. - return - - for(var/obj/item/organ/cyberimp/eyes/E in internal_organs) - sight |= E.sight_flags - if(E.dark_view) - see_in_dark = max(see_in_dark, E.dark_view) - if(E.see_invisible) - see_invisible = min(see_invisible, E.see_invisible) - - if(see_override) - see_invisible = see_override - /mob/living/carbon/alien/can_hold_items() return has_fine_manipulation diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 644bb450cbe..daaf134bd98 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -529,21 +529,34 @@ see_invisible = SEE_INVISIBLE_OBSERVER return - see_invisible = initial(see_invisible) - see_in_dark = initial(see_in_dark) sight = initial(sight) + var/obj/item/organ/eyes/E = getorganslot("eye_sight") + if(!E) + update_tint() + else + see_invisible = E.see_invisible + see_in_dark = E.see_in_dark + sight |= E.sight_flags if(client.eye != src) var/atom/A = client.eye if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. return - for(var/obj/item/organ/cyberimp/eyes/E in internal_organs) - sight |= E.sight_flags - if(E.dark_view) - see_in_dark = max(see_in_dark,E.dark_view) - if(E.see_invisible) - see_invisible = min(see_invisible, E.see_invisible) + if(glasses) + var/obj/item/clothing/glasses/G = glasses + sight |= G.vision_flags + see_in_dark = max(G.darkness_view, see_in_dark) + if(G.invis_override) + see_invisible = G.invis_override + else + see_invisible = min(G.invis_view, see_invisible) + if(dna) + for(var/X in dna.mutations) + var/datum/mutation/M = X + if(M.name == XRAY) + sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) + see_in_dark = max(see_in_dark, 8) if(see_override) see_invisible = see_override @@ -568,9 +581,14 @@ . += HT.tint if(wear_mask) . += wear_mask.tint - for(var/obj/item/organ/cyberimp/eyes/E in internal_organs) - . += E.tint + var/has_eyes = FALSE + for(var/obj/item/organ/eyes/E in internal_organs) + . += E.tint + has_eyes = TRUE + + if(!has_eyes) + . += INFINITY //this handles hud updates /mob/living/carbon/update_damage_hud() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index c112139b0cb..e472ebead4f 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -1,8 +1,12 @@ /mob/living/carbon/get_eye_protection() var/number = ..() - for(var/obj/item/organ/cyberimp/eyes/EFP in internal_organs) - number += EFP.flash_protect + + var/obj/item/organ/eyes/E = getorganslot("eye_sight") + if(!E) + number = INFINITY //Can't get flashed without eyes + else + number += E.flash_protect return number /mob/living/carbon/get_ear_protection() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 0671dd11ff0..0ff51c45cf7 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -47,6 +47,8 @@ internal_organs += new /obj/item/organ/lungs() if(!(NOBLOOD in dna.species.species_traits)) internal_organs += new /obj/item/organ/heart + + internal_organs += new dna.species.mutanteyes() internal_organs += new /obj/item/organ/brain ..() @@ -764,17 +766,6 @@ if(R) R.fields["name"] = newname -/mob/living/carbon/human/update_sight() - if(!client) - return - if(stat == DEAD) - sight = (SEE_TURFS|SEE_MOBS|SEE_OBJS) - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_OBSERVER - return - - dna.species.update_sight(src) - /mob/living/carbon/human/get_total_tint() . = ..() if(glasses) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index c76c03efd53..cecefb30b45 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -16,7 +16,6 @@ var/roundstart = 0 // can this mob be chosen at roundstart? (assuming the config option is checked?) var/default_color = "#FFF" // if alien colors are disabled, this is the color that will be used by that race - var/eyes = "eyes" // which eyes the race uses. at the moment, the only types of eyes are "eyes" (regular eyes) and "jelleyes" (three eyes) var/sexes = 1 // whether or not the race has sexual characteristics. at the moment this is only 0 for skeletons and shadows var/hair_color = null // this allows races to have specific hair colors... if null, it uses the H's hair/facial hair colors. if "mutcolor", it uses the H's mutant_color var/hair_alpha = 255 // the alpha used by the hair. 255 is completely solid, 0 is transparent. @@ -47,9 +46,6 @@ var/damage_overlay_type = "human" //what kind of damage overlays (if any) appear on our species when wounded? var/fixed_mut_color = "" //to use MUTCOLOR with a fixed color that's independent of dna.feature["mcolor"] - var/invis_sight = SEE_INVISIBLE_LIVING - var/darksight = 2 - // species flags. these can be found in flags.dm var/list/species_traits = list() @@ -65,6 +61,9 @@ //Flight and floating var/override_float = 0 + + //Eyes + var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes /////////// // PROCS // /////////// @@ -242,6 +241,14 @@ var/obj/item/bodypart/head/HD = H.get_bodypart("head") + + // eyes + var/has_eyes = TRUE + + if(!H.getorgan(/obj/item/organ/eyes)) + standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "eyes_missing", "layer" = -BODY_LAYER) + has_eyes = FALSE + if(!(H.disabilities & HUSK)) // lipstick if(H.lip_style && (LIPS in species_traits) && HD) @@ -250,8 +257,8 @@ standing += lips // eyes - if((EYECOLOR in species_traits) && HD) - var/image/img_eyes = image("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[eyes]", "layer" = -BODY_LAYER) + if((EYECOLOR in species_traits) && HD && has_eyes) + var/image/img_eyes = image("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes", "layer" = -BODY_LAYER) img_eyes.color = "#" + H.eye_color standing += img_eyes @@ -780,42 +787,6 @@ else H.throw_alert("nutrition", /obj/screen/alert/starving) - -/datum/species/proc/update_sight(mob/living/carbon/human/H) - H.sight = initial(H.sight) - H.see_in_dark = darksight - H.see_invisible = invis_sight - - if(H.client.eye != H) - var/atom/A = H.client.eye - if(A.update_remote_sight(H)) //returns 1 if we override all other sight updates. - return - - for(var/obj/item/organ/cyberimp/eyes/E in H.internal_organs) - H.sight |= E.sight_flags - if(E.dark_view) - H.see_in_dark = E.dark_view - if(E.see_invisible) - H.see_invisible = min(H.see_invisible, E.see_invisible) - - if(H.glasses) - var/obj/item/clothing/glasses/G = H.glasses - H.sight |= G.vision_flags - H.see_in_dark = max(G.darkness_view, H.see_in_dark) - if(G.invis_override) - H.see_invisible = G.invis_override - else - H.see_invisible = min(G.invis_view, H.see_invisible) - - for(var/X in H.dna.mutations) - var/datum/mutation/M = X - if(M.name == XRAY) - H.sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) - H.see_in_dark = max(H.see_in_dark, 8) - - if(H.see_override) //Override all - H.see_invisible = H.see_override - /datum/species/proc/update_health_hud(mob/living/carbon/human/H) return 0 diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index 3ad0a9bf6c4..750c88fd881 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -1,7 +1,6 @@ /datum/species/abductor name = "Abductor" id = "abductor" - darksight = 3 say_mod = "gibbers" sexes = 0 species_traits = list(NOBLOOD,NOBREATH,VIRUSIMMUNE,NOGUNS) diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index fc3a29b3fb3..b9f46bdf91b 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -4,7 +4,6 @@ id = "jelly" default_color = "00FF90" say_mod = "chirps" - eyes = "jelleyes" species_traits = list(MUTCOLORS,EYECOLOR,NOBLOOD,VIRUSIMMUNE,TOXINLOVER) meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/slime exotic_blood = "slimejelly" @@ -99,10 +98,8 @@ name = "Slimeperson" id = "slime" default_color = "00FFFF" - darksight = 3 species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD,VIRUSIMMUNE, TOXINLOVER) say_mod = "says" - eyes = "eyes" hair_color = "mutcolor" hair_alpha = 150 ignored_by = list(/mob/living/simple_animal/slime) diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 92eee6125d1..9886893c474 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -2,8 +2,6 @@ // Humans cursed to stay in the darkness, lest their life forces drain. They regain health in shadow and die in light. name = "???" id = "shadow" - darksight = 8 - invis_sight = SEE_INVISIBLE_MINIMUM sexes = 0 blacklisted = 1 ignored_by = list(/mob/living/simple_animal/hostile/faithless) diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 3e8d9d633eb..c71ba17219d 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -206,7 +206,8 @@ include_user = 1 /obj/effect/proc_holder/spell/targeted/night_vision/cast(list/targets,mob/user = usr) - for(var/mob/living/target in targets) + return + /*for(var/mob/living/target in targets) if(ishuman(target)) var/mob/living/carbon/human/H = target if(H.dna.species.invis_sight == SEE_INVISIBLE_LIVING) @@ -222,7 +223,7 @@ name = "Toggle Nightvision \[ON]" else target.see_invisible = SEE_INVISIBLE_LIVING - name = "Toggle Nightvision \[OFF]" + name = "Toggle Nightvision \[OFF]"*/ /mob/living/simple_animal/hostile/statue/sentience_act() diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 110314cb8ba..e0256d9bdef 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -108,7 +108,6 @@ lip_color = "white" // eyes if(EYECOLOR in S.species_traits) - eyes = S.eyes eye_color = H.eye_color else eyes = "eyes" diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 5a509604f6e..deb1204b15a 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -728,3 +728,45 @@ if(!T) T = new() T.Insert(src) + + +//Eyes + +/obj/item/organ/eyes + name = "eyes" + desc = "I see you!" + zone = "eyes" + slot = "eye_sight" + + var/sight_flags = 0 + var/see_in_dark = 2 + var/tint = 0 + var/eye_color = "fff" + var/old_eye_color = "fff" + var/flash_protect = 0 + var/see_invisible = SEE_INVISIBLE_LIVING + +/obj/item/organ/eyes/Insert(mob/living/carbon/M, special = 0) + ..() + if(ishuman(owner) && eye_color) + var/mob/living/carbon/human/HMN = owner + old_eye_color = HMN.eye_color + HMN.eye_color = eye_color + HMN.regenerate_icons() + M.update_tint() + owner.update_sight() + +/obj/item/organ/eyes/Remove(mob/living/carbon/M, special = 0) + M.sight ^= sight_flags + if(ishuman(M) && eye_color) + var/mob/living/carbon/human/HMN = owner + HMN.eye_color = old_eye_color + HMN.regenerate_icons() + M.update_tint() + ..() + +/obj/item/organ/eyes/shadow + name = "shadow eyes" + desc = "A spooky set of eyes that can see in the dark." + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM \ No newline at end of file diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 2b4f28029a9a799a1464b87387fc9cdb541122b3..e1dbb99158ff0a9d3e6ca9ffca1cc395d68f4626 100644 GIT binary patch delta 6693 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 F^*_l-SDOF; From f50e88c16f5aed34180376264eff3ab66303285a Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 3 Feb 2017 17:34:34 -0600 Subject: [PATCH 02/14] Gives aliens, shadowpeople, monkeys, devils eyes --- code/_onclick/hud/alien.dm | 14 ---------- code/_onclick/hud/alien_larva.dm | 3 -- .../gamemodes/devil/true_devil/_true_devil.dm | 1 + code/modules/mob/living/carbon/alien/alien.dm | 2 +- .../carbon/alien/humanoid/alien_powers.dm | 20 ------------- .../human/species_types/shadowpeople.dm | 28 +------------------ .../mob/living/carbon/monkey/monkey.dm | 1 + code/modules/surgery/organs/organ_internal.dm | 23 +++++++++++++-- 8 files changed, 25 insertions(+), 67 deletions(-) diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 0c02ab22dad..e2bfe128741 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -10,17 +10,6 @@ var/mob/living/carbon/alien/humanoid/hunter/AH = usr AH.toggle_leap() -/obj/screen/alien/nightvision - name = "toggle night-vision" - icon_state = "nightvision1" - screen_loc = ui_alien_nightvision - -/obj/screen/alien/nightvision/Click() - var/mob/living/carbon/alien/A = usr - var/obj/effect/proc_holder/alien/nightvisiontoggle/T = locate() in A.abilities - if(T) - T.fire(A) - /obj/screen/alien/plasma_display icon = 'icons/mob/screen_gen.dmi' icon_state = "power_display2" @@ -105,9 +94,6 @@ healths = new /obj/screen/healths/alien() infodisplay += healths - nightvisionicon = new /obj/screen/alien/nightvision() - infodisplay += nightvisionicon - alien_plasma_display = new /obj/screen/alien/plasma_display() infodisplay += alien_plasma_display diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 4c04cc363ac..0879ec8f313 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -10,9 +10,6 @@ healths = new /obj/screen/healths/alien() infodisplay += healths - nightvisionicon = new /obj/screen/alien/nightvision() - nightvisionicon.screen_loc = ui_alien_nightvision - infodisplay += nightvisionicon alien_queen_finder = new /obj/screen/alien/alien_queen_finder() infodisplay += alien_queen_finder pull_icon = new /obj/screen/pull() diff --git a/code/game/gamemodes/devil/true_devil/_true_devil.dm b/code/game/gamemodes/devil/true_devil/_true_devil.dm index e541d6a0669..1de71b46d3c 100644 --- a/code/game/gamemodes/devil/true_devil/_true_devil.dm +++ b/code/game/gamemodes/devil/true_devil/_true_devil.dm @@ -36,6 +36,7 @@ /mob/living/carbon/true_devil/create_internal_organs() internal_organs += new /obj/item/organ/brain internal_organs += new /obj/item/organ/tongue + internal_organs += new /obj/item/organ/eyes ..() diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 5d9d6937bb7..886d801449e 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -41,13 +41,13 @@ create_internal_organs() - AddAbility(new/obj/effect/proc_holder/alien/nightvisiontoggle(null)) ..() /mob/living/carbon/alien/create_internal_organs() internal_organs += new /obj/item/organ/brain/alien internal_organs += new /obj/item/organ/alien/hivenode internal_organs += new /obj/item/organ/tongue/alien + internal_organs += new /obj/item/organ/eyes/night_vision/alien ..() /mob/living/carbon/alien/assess_threat() // beepsky won't hunt aliums diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 103ace63e79..cb4020c98d7 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -286,26 +286,6 @@ Doesn't work on other aliens/AI.*/ user.visible_message("[user] hurls out the contents of their stomach!") return -/obj/effect/proc_holder/alien/nightvisiontoggle - name = "Toggle Night Vision" - desc = "Toggles Night Vision" - plasma_cost = 0 - has_action = 0 // Has dedicated GUI button already - -/obj/effect/proc_holder/alien/nightvisiontoggle/fire(mob/living/carbon/alien/user) - if(!user.nightvision) - user.see_in_dark = 8 - user.see_invisible = SEE_INVISIBLE_MINIMUM - user.nightvision = 1 - user.hud_used.nightvisionicon.icon_state = "nightvision1" - else if(user.nightvision == 1) - user.see_in_dark = 4 - user.see_invisible = 45 - user.nightvision = 0 - user.hud_used.nightvisionicon.icon_state = "nightvision0" - - return 1 - /obj/effect/proc_holder/alien/sneak name = "Sneak" desc = "Blend into the shadows to stalk your prey." diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 9886893c474..a09d59b2cbc 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -8,34 +8,8 @@ meat = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/shadow species_traits = list(NOBREATH,NOBLOOD,RADIMMUNE,VIRUSIMMUNE) dangerous_existence = 1 - var/datum/action/innate/shadow/darkvision/vision_toggle + mutanteyes = /obj/item/organ/eyes/night_vision -/datum/action/innate/shadow/darkvision //Darkvision toggle so shadowpeople can actually see where darkness is - name = "Toggle Darkvision" - check_flags = AB_CHECK_CONSCIOUS - background_icon_state = "bg_default" - button_icon_state = "blind" - -/datum/action/innate/shadow/darkvision/Activate() - var/mob/living/carbon/human/H = owner - if(H.see_in_dark < 8) - H.see_in_dark = 8 - H.see_invisible = SEE_INVISIBLE_MINIMUM - H << "You adjust your vision to pierce the darkness." - else - H.see_in_dark = 2 - H.see_invisible = SEE_INVISIBLE_LIVING - H << "You adjust your vision to recognize the shadows." - -/datum/species/shadow/on_species_gain(mob/living/carbon/C, datum/species/old_species) - . = ..() - vision_toggle = new - vision_toggle.Grant(C) - -/datum/species/shadow/on_species_loss(mob/living/carbon/C) - . = ..() - if(vision_toggle) - vision_toggle.Remove(C) /datum/species/shadow/spec_life(mob/living/carbon/human/H) var/light_amount = 0 diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index d0cc88e67fe..1844cc28f05 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -44,6 +44,7 @@ internal_organs += new /obj/item/organ/heart internal_organs += new /obj/item/organ/brain internal_organs += new /obj/item/organ/tongue + internal_organs += new /obj/item/organ/eyes ..() /mob/living/carbon/monkey/movement_delay() diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index deb1204b15a..58fc8ba77ed 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -765,8 +765,27 @@ M.update_tint() ..() -/obj/item/organ/eyes/shadow +/obj/item/organ/eyes/night_vision name = "shadow eyes" desc = "A spooky set of eyes that can see in the dark." see_in_dark = 8 - see_invisible = SEE_INVISIBLE_MINIMUM \ No newline at end of file + see_invisible = SEE_INVISIBLE_MINIMUM + actions_types = list(/datum/action/item_action/organ_action/use) + var/night_vision = TRUE + +/obj/item/organ/eyes/night_vision/ui_action_click() + if(night_vision) + see_in_dark = 4 + see_invisible = SEE_INVISIBLE_LIVING + night_vision = FALSE + else + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + night_vision = TRUE + +/obj/item/organ/eyes/night_vision/alien + name = "alien eyes" + desc = "It turned out they had them after all!" + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + sight_flags = SEE_MOBS From 6ad9b5abe11e3a4411904b12bbf6e07ab9f05c49 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 3 Feb 2017 18:47:49 -0600 Subject: [PATCH 03/14] Replaces cybernetic implants with cybernetic eyes --- .../changeling/powers/augmented_eyesight.dm | 61 +++------- code/modules/crafting/recipes.dm | 2 +- .../research/designs/medical_designs.dm | 12 +- code/modules/surgery/organs/augments_eyes.dm | 106 +----------------- .../surgery/organs/augments_internal.dm | 6 +- code/modules/surgery/organs/organ_internal.dm | 66 +++++++++++ code/modules/uplink/uplink_item.dm | 6 +- 7 files changed, 97 insertions(+), 162 deletions(-) diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm index 1644c4325da..eb1f6626c06 100644 --- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm +++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm @@ -12,54 +12,25 @@ /obj/effect/proc_holder/changeling/augmented_eyesight/sting_action(mob/living/carbon/human/user) if(!istype(user)) return - if(user.getorgan(/obj/item/organ/cyberimp/eyes/thermals/ling)) - user << "Our eyes are protected from flashes." - var/obj/item/organ/cyberimp/eyes/O = new /obj/item/organ/cyberimp/eyes/shield/ling() - O.Insert(user) - + var/obj/item/organ/eyes/E = user.getorganslot("eye_sight") + if(E) + if(E.flash_protect) + E.sight_flags |= SEE_MOBS + E.flash_protect = -1 + user << "We adjust our eyes to sense prey through walls." + else + E.sight_flags -= SEE_MOBS + E.flash_protect = 2 + user << "We adjust our eyes to protect them from bright lights." else - var/obj/item/organ/cyberimp/eyes/O = new /obj/item/organ/cyberimp/eyes/thermals/ling() - O.Insert(user) + user << "We can't adjust our eyes if we don't have any!" + + return 1 /obj/effect/proc_holder/changeling/augmented_eyesight/on_refund(mob/user) - var/obj/item/organ/cyberimp/eyes/O = user.getorganslot("eye_ling") - if(O) - O.Remove(user) - qdel(O) - - -/obj/item/organ/cyberimp/eyes/shield/ling - name = "protective membranes" - desc = "These variable transparency organic membranes will protect you from welders and flashes and heal your eye damage." - icon_state = "ling_eyeshield" - eye_color = null - implant_overlay = null - slot = "eye_ling" - status = ORGAN_ORGANIC - -/obj/item/organ/cyberimp/eyes/shield/ling/on_life() - ..() - if(owner.eye_blind>1 || (owner.eye_blind && owner.stat !=UNCONSCIOUS) || owner.eye_damage || owner.eye_blurry || (owner.disabilities & NEARSIGHT)) - owner.reagents.add_reagent("oculine", 1) - -/obj/item/organ/cyberimp/eyes/shield/ling/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent("oculine", 15) - return S - - -/obj/item/organ/cyberimp/eyes/thermals/ling - name = "heat receptors" - desc = "These heat receptors dramatically increases eyes light sensing ability." - icon_state = "ling_thermal" - eye_color = null - implant_overlay = null - slot = "eye_ling" - status = ORGAN_ORGANIC - aug_message = "You feel a minute twitch in our eyes, and darkness creeps away." - -/obj/item/organ/cyberimp/eyes/thermals/ling/emp_act(severity) - return + var/obj/item/organ/eyes/E = user.getorganslot("eye_sight") + if(E) + E.sight_flags -= SEE_MOBS \ No newline at end of file diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 39fb1b8f2de..671105f5c5e 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -329,7 +329,7 @@ /datum/crafting_recipe/flashlight_eyes name = "Flashlight Eyes" - result = /obj/item/organ/cyberimp/eyes/flashlight + result = /obj/item/organ/eyes/robotic/flashlight time = 10 reqs = list( /obj/item/device/flashlight = 2, diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 818d616bb3d..752bc73919f 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -180,14 +180,14 @@ ///////////////////////////////////////// /datum/design/cyberimp_welding - name = "Welding Shield implant" + name = "Welding Shield Eyes" desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." id = "ci-welding" req_tech = list("materials" = 4, "biotech" = 4, "engineering" = 5, "plasmatech" = 4) build_type = PROTOLATHE | MECHFAB construction_time = 40 materials = list(MAT_METAL = 600, MAT_GLASS = 400) - build_path = /obj/item/organ/cyberimp/eyes/shield + build_path = /obj/item/organ/eyes/robotic/shield category = list("Misc", "Medical Designs") /datum/design/cyberimp_breather @@ -235,25 +235,25 @@ category = list("Misc", "Medical Designs") /datum/design/cyberimp_xray - name = "X-Ray implant" + name = "X-Ray eyes" desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." id = "ci-xray" req_tech = list("materials" = 7, "programming" = 5, "biotech" = 7, "magnets" = 5,"plasmatech" = 6) build_type = PROTOLATHE | MECHFAB construction_time = 60 materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_URANIUM = 1000, MAT_DIAMOND = 2000) - build_path = /obj/item/organ/cyberimp/eyes/xray + build_path = /obj/item/organ/eyes/robotic/xray category = list("Misc", "Medical Designs") /datum/design/cyberimp_thermals - name = "Thermals implant" + name = "Thermal eyes" desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included." id = "ci-thermals" req_tech = list("materials" = 6, "programming" = 4, "biotech" = 7, "magnets" = 5,"plasmatech" = 4) build_type = PROTOLATHE | MECHFAB construction_time = 60 materials = list(MAT_METAL = 600, MAT_GLASS = 600, MAT_SILVER = 600, MAT_GOLD = 600, MAT_PLASMA = 1000, MAT_DIAMOND = 2000) - build_path = /obj/item/organ/cyberimp/eyes/thermals + build_path = /obj/item/organ/eyes/robotic/thermals category = list("Misc", "Medical Designs") /datum/design/cyberimp_antidrop diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index 666eeac27a1..7ca10c5c5e3 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -1,5 +1,5 @@ -/obj/item/organ/cyberimp/eyes - name = "cybernetic eyes" +/obj/item/organ/cyberimp/eyes/hud + name = "cybernetic hud" desc = "artificial photoreceptors with specialized functionality" icon_state = "eye_implant" implant_overlay = "eye_implant_overlay" @@ -7,87 +7,6 @@ zone = "eyes" w_class = WEIGHT_CLASS_TINY - var/sight_flags = 0 - var/dark_view = 0 - var/tint = 0 - var/eye_color = "fff" - var/old_eye_color = "fff" - var/flash_protect = 0 - var/see_invisible = 0 - var/aug_message = "Your vision is augmented!" - - -/obj/item/organ/cyberimp/eyes/Insert(var/mob/living/carbon/M, var/special = 0) - ..() - if(ishuman(owner) && eye_color) - var/mob/living/carbon/human/HMN = owner - old_eye_color = HMN.eye_color - HMN.eye_color = eye_color - HMN.regenerate_icons() - if(aug_message && !special) - owner << "[aug_message]" - M.update_tint() - owner.update_sight() - -/obj/item/organ/cyberimp/eyes/Remove(var/mob/living/carbon/M, var/special = 0) - M.sight ^= sight_flags - if(ishuman(M) && eye_color) - var/mob/living/carbon/human/HMN = owner - HMN.eye_color = old_eye_color - HMN.regenerate_icons() - M.update_tint() - ..() - -/obj/item/organ/cyberimp/eyes/emp_act(severity) - if(!owner) - return - if(severity > 1) - if(prob(10 * severity)) - return - owner << "Static obfuscates your vision!" - owner.flash_act(visual = 1) - -/obj/item/organ/cyberimp/eyes/xray - name = "X-ray implant" - desc = "These cybernetic eye implants will give you X-ray vision. Blinking is futile." - eye_color = "000" - implant_color = "#000000" - origin_tech = "materials=4;programming=4;biotech=6;magnets=4" - dark_view = 8 - sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS - -/obj/item/organ/cyberimp/eyes/thermals - name = "Thermals implant" - desc = "These cybernetic eye implants will give you Thermal vision. Vertical slit pupil included." - eye_color = "FC0" - implant_color = "#FFCC00" - origin_tech = "materials=5;programming=4;biotech=4;magnets=4;syndicate=1" - sight_flags = SEE_MOBS - see_invisible = SEE_INVISIBLE_MINIMUM - flash_protect = -1 - dark_view = 8 - aug_message = "You see prey everywhere you look..." - -/obj/item/organ/cyberimp/eyes/flashlight - name = "flashlight eyes" - desc = "It's two flashlights rigged together with some wire. Why would you put these in someones head?" - eye_color ="fee5a3" - icon = 'icons/obj/lighting.dmi' - icon_state = "flashlight_eyes" - flash_protect = 2 - tint = INFINITY - implant_color = "#FFFF00" - aug_message = "You've become a beacon of light, but ironically can see nothing at all." - -/obj/item/organ/cyberimp/eyes/flashlight/Insert(var/mob/living/carbon/M, var/special = 0) - ..() - M.AddLuminosity(15) - - -/obj/item/organ/cyberimp/eyes/flashlight/Remove(var/mob/living/carbon/M, var/special = 0) - M.AddLuminosity(-15) - ..() - // HUD implants /obj/item/organ/cyberimp/eyes/hud name = "HUD implant" @@ -112,32 +31,11 @@ /obj/item/organ/cyberimp/eyes/hud/medical name = "Medical HUD implant" desc = "These cybernetic eye implants will display a medical HUD over everything you see." - eye_color = "0ff" - implant_color = "#00FFFF" origin_tech = "materials=4;programming=4;biotech=4" - aug_message = "You suddenly see health bars floating above people's heads..." HUD_type = DATA_HUD_MEDICAL_ADVANCED /obj/item/organ/cyberimp/eyes/hud/security name = "Security HUD implant" desc = "These cybernetic eye implants will display a security HUD over everything you see." - eye_color = "d00" - implant_color = "#CC0000" origin_tech = "materials=4;programming=4;biotech=3;combat=3" - aug_message = "Job indicator icons pop up in your vision. That is not a certified surgeon..." HUD_type = DATA_HUD_SECURITY_ADVANCED - - -// Welding shield implant -/obj/item/organ/cyberimp/eyes/shield - name = "welding shield implant" - desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." - slot = "eye_shield" - origin_tech = "materials=4;biotech=3;engineering=4;plasmatech=3" - implant_color = "#101010" - flash_protect = 2 - aug_message = null - eye_color = null - -/obj/item/organ/cyberimp/eyes/shield/emp_act(severity) - return diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 2c8f377fee4..51fc8f1ab2a 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -63,7 +63,7 @@ for(var/obj/item/I in stored_items) owner << "Your [owner.get_held_index_name(owner.get_held_index_of_item(I))]'s grip tightens." I.flags |= NODROP - + else release_items() owner << "Your hands relax..." @@ -157,8 +157,8 @@ /obj/item/weapon/storage/box/cyber_implants/bundle name = "boxed cybernetic implants" var/list/boxed = list( - /obj/item/organ/cyberimp/eyes/xray, - /obj/item/organ/cyberimp/eyes/thermals, + /obj/item/organ/eyes/robotic/xray, + /obj/item/organ/eyes/robotic/thermals, /obj/item/organ/cyberimp/brain/anti_stun, /obj/item/organ/cyberimp/chest/reviver) var/amount = 5 diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 58fc8ba77ed..3b0c66a1f37 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -789,3 +789,69 @@ see_in_dark = 8 see_invisible = SEE_INVISIBLE_MINIMUM sight_flags = SEE_MOBS + + + + +///Robotic + +/obj/item/organ/eyes/robotic + name = "robotic eyes" + desc = "Your vision is augmented." + +/obj/item/organ/eyes/robotic/emp_act(severity) + if(!owner) + return + if(severity > 1) + if(prob(10 * severity)) + return + owner << "Static obfuscates your vision!" + owner.flash_act(visual = 1) + +/obj/item/organ/eyes/robotic/xray + name = "X-ray eyes" + desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." + eye_color = "000" + see_in_dark = 8 + sight_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS + +/obj/item/organ/eyes/robotic/thermals + name = "Thermals eyes" + desc = "These cybernetic eye implants will give you Thermal vision. Vertical slit pupil included." + eye_color = "FC0" + origin_tech = "materials=5;programming=4;biotech=4;magnets=4;syndicate=1" + sight_flags = SEE_MOBS + see_invisible = SEE_INVISIBLE_MINIMUM + flash_protect = -1 + see_in_dark = 8 + +/obj/item/organ/eyes/robotic/flashlight + name = "flashlight eyes" + desc = "It's two flashlights rigged together with some wire. Why would you put these in someones head?" + eye_color ="fee5a3" + icon = 'icons/obj/lighting.dmi' + icon_state = "flashlight_eyes" + flash_protect = 2 + tint = INFINITY + +/obj/item/organ/eyes/robotic/flashlight/emp_act(severity) + return + +/obj/item/organ/eyes/robotic/flashlight/Insert(var/mob/living/carbon/M, var/special = 0) + ..() + M.AddLuminosity(15) + + +/obj/item/organ/eyes/robotic/flashlight/Remove(var/mob/living/carbon/M, var/special = 0) + M.AddLuminosity(-15) + ..() + +// Welding shield implant +/obj/item/organ/eyes/robotic/shield + name = "shielded robotic eyes" + desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." + origin_tech = "materials=4;biotech=3;engineering=4;plasmatech=3" + flash_protect = 2 + +/obj/item/organ/eyes/robotic/shield/emp_act(severity) + return \ No newline at end of file diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index 2ecd1e92112..7f86b61868d 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -1130,15 +1130,15 @@ var/list/uplink_items = list() // Global list so we only initialize this once. /datum/uplink_item/cyber_implants/thermals - name = "Thermal Vision Implant" + name = "Thermal eyes" desc = "These cybernetic eyes will give you thermal vision. Comes with a free autoimplanter." - item = /obj/item/organ/cyberimp/eyes/thermals + item = /obj/item/organ/eyes/robotic/thermals cost = 8 /datum/uplink_item/cyber_implants/xray name = "X-Ray Vision Implant" desc = "These cybernetic eyes will give you X-ray vision. Comes with an autoimplanter." - item = /obj/item/organ/cyberimp/eyes/xray + item = /obj/item/organ/eyes/robotic/xray cost = 10 /datum/uplink_item/cyber_implants/antistun From c47c6a4169d7cfa22c6940ac0c42442aa04bc7c9 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 3 Feb 2017 18:53:04 -0600 Subject: [PATCH 04/14] No eye surgery for people without eyes --- code/modules/surgery/eye_surgery.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index 5e1ef149876..c9f29265770 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -11,6 +11,12 @@ implements = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/screwdriver = 45, /obj/item/weapon/pen = 25) time = 64 +/datum/surgery/eye_surgery/can_start(mob/user, mob/living/carbon/target) + var/obj/item/organ/eyes/E = target.getorganslot("eye_sight") + if(!E) + user << "It's hard to do surgery on someones eyes when they don't have any." + return 0 + /datum/surgery_step/fix_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user] begins to fix [target]'s eyes.", "You begin to fix [target]'s eyes...") From 3156b55cd99d12bc77543bc00d25615e4dc8da61 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 3 Feb 2017 18:54:24 -0600 Subject: [PATCH 05/14] Path replacement on away mission that will never be loaded again --- _maps/RandomZLevels/caves.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 07f9df788c2..19b2c6579bf 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -2374,7 +2374,7 @@ info = "
CARAVAN SERVICES

Quality service since 2205


SHIPMENT CONTENTS:


4 scattershot rifles
6 grenades
1 laser rifle
1 blowup doll"; name = "Shipment Receipt" }, -/obj/item/organ/cyberimp/eyes/thermals, +/obj/item/organ/eyes/robotic/thermals, /obj/item/weapon/gun/energy/laser/captain/scattershot, /obj/item/slimepotion/fireproof, /turf/open/floor/plating/asteroid/basalt{ From 71e958b44e0b07fa8bc2452664394e5ccf04b727 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 3 Feb 2017 19:13:47 -0600 Subject: [PATCH 06/14] Eyes travel with the head when dismembered --- .../mob/living/carbon/human/species.dm | 2 +- .../surgery/bodyparts/dismemberment.dm | 4 +++- code/modules/surgery/bodyparts/head.dm | 23 ++++++++----------- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index cecefb30b45..f63af6f79f9 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -245,7 +245,7 @@ // eyes var/has_eyes = TRUE - if(!H.getorgan(/obj/item/organ/eyes)) + if(!H.getorgan(/obj/item/organ/eyes) && HD) standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "eyes_missing", "layer" = -BODY_LAYER) has_eyes = FALSE diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 877f8b490cf..bd01b14c216 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -145,6 +145,9 @@ LB.brainmob.container = LB LB.brainmob.stat = DEAD +/obj/item/organ/eyes/transfer_to_limb(obj/item/bodypart/head/LB, mob/living/carbon/human/C) + LB.eyes = src + ..() /obj/item/bodypart/chest/drop_limb(special) return @@ -289,7 +292,6 @@ H.hair_style = hair_style H.facial_hair_color = facial_hair_color H.facial_hair_style = facial_hair_style - H.eye_color = eye_color H.lip_style = lip_style H.lip_color = lip_color if(real_name) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index e0256d9bdef..19327936542 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -25,8 +25,9 @@ var/facial_hair_color = "000" var/facial_hair_style = "Shaved" //Eye Colouring - var/eyes = "eyes" - var/eye_color = "" + + var/obj/item/organ/eyes/eyes = null + var/lip_style = null var/lip_color = "white" @@ -61,8 +62,6 @@ real_name = "Unknown" hair_style = "Bald" facial_hair_style = "Shaved" - eyes = "eyes" - eye_color = "" lip_style = null else if(!animal_origin) @@ -106,13 +105,6 @@ else lip_style = null lip_color = "white" - // eyes - if(EYECOLOR in S.species_traits) - eye_color = H.eye_color - else - eyes = "eyes" - eye_color = "" - ..() /obj/item/bodypart/head/update_icon_dropped() @@ -166,9 +158,12 @@ standing += lips // eyes - if(eye_color) - var/image/img_eyes = image("icon" = 'icons/mob/human_face.dmi', "icon_state" = "[eyes]", "layer" = -BODY_LAYER, "dir"=SOUTH) - img_eyes.color = "#" + eye_color + if(!eyes) + standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "eyes_missing", "layer" = -BODY_LAYER, "dir"=SOUTH) + + else if(eyes.eye_color) + var/image/img_eyes = image("icon" = 'icons/mob/human_face.dmi', "icon_state" = "eyes", "layer" = -BODY_LAYER, "dir"=SOUTH) + img_eyes.color = "#" + eyes.eye_color standing += img_eyes return standing From f9350ff38e4a08a01b8055fa5db14a60daa4fff7 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 3 Feb 2017 20:04:36 -0600 Subject: [PATCH 07/14] Eyeball sprites --- code/modules/surgery/organs/organ_internal.dm | 11 +++++++++++ icons/obj/surgery.dmi | Bin 26565 -> 28021 bytes 2 files changed, 11 insertions(+) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 3b0c66a1f37..af3c8d1d959 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -729,11 +729,21 @@ T = new() T.Insert(src) + if(!getorganslot("eye_sight")) + var/obj/item/organ/eyes/E + + if(dna && dna.species && dna.species.mutanteyes) + E = new dna.species.mutanteyes() + + else + E = new() + E.Insert(src) //Eyes /obj/item/organ/eyes name = "eyes" + icon_state = "eyeballs" desc = "I see you!" zone = "eyes" slot = "eye_sight" @@ -797,6 +807,7 @@ /obj/item/organ/eyes/robotic name = "robotic eyes" + icon_state = "cybernetic eyeballs" desc = "Your vision is augmented." /obj/item/organ/eyes/robotic/emp_act(severity) diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index c3716eda376107146cce0f8c0c8713bcdd71f436..d1adc2919618d53772c33f0547247ddbac01e200 100644 GIT binary patch delta 8811 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 delta 7343 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 From 99dddbfdfc79bfa0e1e4a195dea3dc5c79c62986 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 3 Feb 2017 20:17:15 -0600 Subject: [PATCH 08/14] Fixes eyes not updating properly after surgery --- code/modules/surgery/organs/organ_internal.dm | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index af3c8d1d959..31a94bee551 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -767,13 +767,14 @@ owner.update_sight() /obj/item/organ/eyes/Remove(mob/living/carbon/M, special = 0) + ..() M.sight ^= sight_flags if(ishuman(M) && eye_color) var/mob/living/carbon/human/HMN = owner HMN.eye_color = old_eye_color - HMN.regenerate_icons() + M.regenerate_icons() M.update_tint() - ..() + /obj/item/organ/eyes/night_vision name = "shadow eyes" @@ -801,13 +802,11 @@ sight_flags = SEE_MOBS - - ///Robotic /obj/item/organ/eyes/robotic name = "robotic eyes" - icon_state = "cybernetic eyeballs" + icon_state = "cybernetic_eyeballs" desc = "Your vision is augmented." /obj/item/organ/eyes/robotic/emp_act(severity) From 0b79d25b9d8fbd173124043ca665457820a5df71 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 3 Feb 2017 21:17:51 -0600 Subject: [PATCH 09/14] Undoes a fix that somehow broke everything instead --- code/modules/surgery/organs/organ_internal.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 31a94bee551..d71d18eb096 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -767,14 +767,13 @@ owner.update_sight() /obj/item/organ/eyes/Remove(mob/living/carbon/M, special = 0) - ..() M.sight ^= sight_flags if(ishuman(M) && eye_color) var/mob/living/carbon/human/HMN = owner HMN.eye_color = old_eye_color - M.regenerate_icons() + HMN.regenerate_icons() M.update_tint() - + ..() /obj/item/organ/eyes/night_vision name = "shadow eyes" From 3d5443212bbc2b9ad0fe9123c10ae900aefb6216 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 3 Feb 2017 21:58:45 -0600 Subject: [PATCH 10/14] Fixes a runtime --- code/modules/mob/living/carbon/carbon.dm | 8 ++++---- code/modules/surgery/organs/organ_internal.dm | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index daaf134bd98..fe9f7fa7425 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -582,13 +582,13 @@ if(wear_mask) . += wear_mask.tint - var/has_eyes = FALSE - for(var/obj/item/organ/eyes/E in internal_organs) + var/obj/item/organ/eyes/E = getorganslot("eye_sight") + if(E) . += E.tint - has_eyes = TRUE - if(!has_eyes) + else . += INFINITY + //this handles hud updates /mob/living/carbon/update_damage_hud() diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index d71d18eb096..7316a188cea 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -767,13 +767,13 @@ owner.update_sight() /obj/item/organ/eyes/Remove(mob/living/carbon/M, special = 0) - M.sight ^= sight_flags + ..() if(ishuman(M) && eye_color) - var/mob/living/carbon/human/HMN = owner + var/mob/living/carbon/human/HMN = M HMN.eye_color = old_eye_color HMN.regenerate_icons() M.update_tint() - ..() + M.update_sight() /obj/item/organ/eyes/night_vision name = "shadow eyes" From 57ae996d898512f8f84551ebc0ac2bd8d22ad86d Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 3 Feb 2017 22:57:01 -0600 Subject: [PATCH 11/14] Luminosity --- code/modules/surgery/bodyparts/head.dm | 1 + code/modules/surgery/organs/organ_internal.dm | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 19327936542..aea96927d12 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -49,6 +49,7 @@ update_icon_dropped() else I.loc = T + SetLuminosity((initial(luminosity))) /obj/item/bodypart/head/update_limb(dropping_limb, mob/living/carbon/source) var/mob/living/carbon/C diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 7316a188cea..f2e84691633 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -855,6 +855,12 @@ M.AddLuminosity(-15) ..() +/obj/item/organ/eyes/robotic/flashlight/transfer_to_limb(obj/item/bodypart/head/LB, mob/living/carbon/human/C) + LB.eyes = src + LB.AddLuminosity(15) + ..() + + // Welding shield implant /obj/item/organ/eyes/robotic/shield name = "shielded robotic eyes" From 858e2950b10b608a519dfb8623734bb3bc77779a Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 3 Feb 2017 22:57:23 -0600 Subject: [PATCH 12/14] Revert "Luminosity" This reverts commit 57ae996d898512f8f84551ebc0ac2bd8d22ad86d. --- code/modules/surgery/bodyparts/head.dm | 1 - code/modules/surgery/organs/organ_internal.dm | 6 ------ 2 files changed, 7 deletions(-) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index aea96927d12..19327936542 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -49,7 +49,6 @@ update_icon_dropped() else I.loc = T - SetLuminosity((initial(luminosity))) /obj/item/bodypart/head/update_limb(dropping_limb, mob/living/carbon/source) var/mob/living/carbon/C diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index f2e84691633..7316a188cea 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -855,12 +855,6 @@ M.AddLuminosity(-15) ..() -/obj/item/organ/eyes/robotic/flashlight/transfer_to_limb(obj/item/bodypart/head/LB, mob/living/carbon/human/C) - LB.eyes = src - LB.AddLuminosity(15) - ..() - - // Welding shield implant /obj/item/organ/eyes/robotic/shield name = "shielded robotic eyes" From 0117b71d48a0c9a79ad1692a64d8f0e3155fbe55 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Sat, 4 Feb 2017 08:36:17 -0600 Subject: [PATCH 13/14] Lazy nightvision spell is no longer meant for carbons to use --- .../mob/living/simple_animal/hostile/statue.dm | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index c71ba17219d..0ce98701788 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -206,18 +206,8 @@ include_user = 1 /obj/effect/proc_holder/spell/targeted/night_vision/cast(list/targets,mob/user = usr) - return - /*for(var/mob/living/target in targets) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(H.dna.species.invis_sight == SEE_INVISIBLE_LIVING) - H.dna.species.invis_sight = SEE_INVISIBLE_NOLIGHTING - name = "Toggle Nightvision \[ON]" - else - H.dna.species.invis_sight = SEE_INVISIBLE_LIVING - name = "Toggle Nightvision \[OFF]" - - else + for(var/mob/living/target in targets) + if(!iscarbon(target)) //Carbons should be toggling their vision via organ, this spell is used as a power for simple mobs if(target.see_invisible == SEE_INVISIBLE_LIVING) target.see_invisible = SEE_INVISIBLE_NOLIGHTING name = "Toggle Nightvision \[ON]" @@ -225,7 +215,6 @@ target.see_invisible = SEE_INVISIBLE_LIVING name = "Toggle Nightvision \[OFF]"*/ - /mob/living/simple_animal/hostile/statue/sentience_act() faction -= "neutral" From 8f5b9a3aa04ac4bccadecd02155d30a3b1b601a2 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Sat, 4 Feb 2017 08:38:06 -0600 Subject: [PATCH 14/14] It should probably actually compile --- code/modules/mob/living/simple_animal/hostile/statue.dm | 2 +- code/modules/surgery/eye_surgery.dm | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index 0ce98701788..f38ee857059 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -213,7 +213,7 @@ name = "Toggle Nightvision \[ON]" else target.see_invisible = SEE_INVISIBLE_LIVING - name = "Toggle Nightvision \[OFF]"*/ + name = "Toggle Nightvision \[OFF]" /mob/living/simple_animal/hostile/statue/sentience_act() faction -= "neutral" diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm index c9f29265770..107dfd692c3 100644 --- a/code/modules/surgery/eye_surgery.dm +++ b/code/modules/surgery/eye_surgery.dm @@ -15,7 +15,7 @@ var/obj/item/organ/eyes/E = target.getorganslot("eye_sight") if(!E) user << "It's hard to do surgery on someones eyes when they don't have any." - return 0 + return FALSE /datum/surgery_step/fix_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) user.visible_message("[user] begins to fix [target]'s eyes.", "You begin to fix [target]'s eyes...") @@ -27,7 +27,7 @@ target.cure_nearsighted() target.blur_eyes(35) //this will fix itself slowly. target.set_eye_damage(0) - return 1 + return TRUE /datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(target.getorgan(/obj/item/organ/brain)) @@ -35,4 +35,4 @@ target.adjustBrainLoss(100) else user.visible_message("[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain.", "You accidentally stab [target] right in the brain! Or would have, if [target] had a brain.") - return 0 \ No newline at end of file + return FALSE \ No newline at end of file