diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index 217683fad45..8917d28d6bb 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -159,7 +159,7 @@ DROP TABLE IF EXISTS `admin`; CREATE TABLE `admin` ( `id` int(11) NOT NULL AUTO_INCREMENT, `ckey` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL, - `rank` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'Administrator', + `admin_rank` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'Administrator', `level` int(2) NOT NULL DEFAULT '0', `flags` int(16) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), diff --git a/SQL/paradise_schema_prefixed.sql b/SQL/paradise_schema_prefixed.sql index 627ec9229a8..b3c8f1f7643 100644 --- a/SQL/paradise_schema_prefixed.sql +++ b/SQL/paradise_schema_prefixed.sql @@ -158,7 +158,7 @@ DROP TABLE IF EXISTS `SS13_admin`; CREATE TABLE `SS13_admin` ( `id` int(11) NOT NULL AUTO_INCREMENT, `ckey` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL, - `rank` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'Administrator', + `admin_rank` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'Administrator', `level` int(2) NOT NULL DEFAULT '0', `flags` int(16) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), diff --git a/SQL/updates/21-22.sql b/SQL/updates/21-22.sql new file mode 100644 index 00000000000..24ef6fd9f25 --- /dev/null +++ b/SQL/updates/21-22.sql @@ -0,0 +1,4 @@ +# Updating DB from 21-22, -AffectedArc07 +# Changes `rank` to `admin_rank` to remove use of reserved keyword + +ALTER TABLE `admin` CHANGE COLUMN `rank` `admin_rank` VARCHAR(32) NOT NULL DEFAULT 'Administrator' COLLATE 'utf8mb4_unicode_ci' AFTER `ckey`; diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 18ebaee412b..e75eb49a02e 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -363,7 +363,7 @@ #define INVESTIGATE_BOMB "bombs" // The SQL version required by this version of the code -#define SQL_VERSION 21 +#define SQL_VERSION 22 // Vending machine stuff #define CAT_NORMAL 1 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 52ea8a174f9..a023063ca7f 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -276,3 +276,9 @@ #define HEARING_PROTECTION_MINOR 1 #define HEARING_PROTECTION_MAJOR 2 #define HEARING_PROTECTION_TOTAL 3 + +// Eye protection +#define FLASH_PROTECTION_SENSITIVE -1 +#define FLASH_PROTECTION_NONE 0 +#define FLASH_PROTECTION_FLASH 1 +#define FLASH_PROTECTION_WELDER 2 diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 6ee2ea3674f..ccd0b4c66e5 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -406,7 +406,7 @@ GLOBAL_VAR_INIT(record_id_num, 1001) var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = H.dna.species ? H.dna.species.eyes : "eyes_s") if(!eyes_organ) return - eyes_s.Blend(eyes_organ.eye_colour, ICON_ADD) + eyes_s.Blend(eyes_organ.eye_color, ICON_ADD) face_s.Blend(eyes_s, ICON_OVERLAY) var/datum/sprite_accessory/hair_style = GLOB.hair_styles_full_list[head_organ.h_style] diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 1e5da319f0f..591a487598e 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1515,14 +1515,8 @@ else if(href_list["common"]) switch(href_list["common"]) if("undress") - if(ishuman(current)) - var/mob/living/carbon/human/H = current - // Don't "undress" organs right out of the body - for(var/obj/item/W in H.contents - (H.bodyparts | H.internal_organs)) - current.unEquip(W, 1) - else - for(var/obj/item/W in current) - current.unEquip(W, 1) + for(var/obj/item/I in current) + current.unEquip(I, TRUE) log_admin("[key_name(usr)] has unequipped [key_name(current)]") message_admins("[key_name_admin(usr)] has unequipped [key_name_admin(current)]") if("takeuplink") diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index d8b253c58b0..1c5aba0f171 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -115,7 +115,7 @@ H.equip_or_collect(new path(H), slot_in_backpack) for(var/path in cybernetic_implants) - var/obj/item/organ/internal/O = new path(H) + var/obj/item/organ/internal/O = new path O.insert(H) if(!H.head && toggle_helmet && istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit)) diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm index f40d29df78c..22d61c818ec 100644 --- a/code/datums/outfits/outfit_admin.dm +++ b/code/datums/outfits/outfit_admin.dm @@ -239,9 +239,8 @@ /obj/item/implant/dust ) cybernetic_implants = list( - /obj/item/organ/internal/cyberimp/eyes/shield, /obj/item/organ/internal/cyberimp/eyes/hud/security, - /obj/item/organ/internal/cyberimp/eyes/xray, + /obj/item/organ/internal/eyes/cybernetic/xray, /obj/item/organ/internal/cyberimp/brain/anti_stun/hardened, /obj/item/organ/internal/cyberimp/chest/nutriment/plus, /obj/item/organ/internal/cyberimp/arm/combat/centcom diff --git a/code/datums/outfits/vv_outfit.dm b/code/datums/outfits/vv_outfit.dm index 95c91318bb8..a8162a04dec 100644 --- a/code/datums/outfits/vv_outfit.dm +++ b/code/datums/outfits/vv_outfit.dm @@ -125,9 +125,9 @@ // Copy cybernetic implants O.cybernetic_implants = list() - for(var/obj/item/organ/internal/CI in contents) - if(istype(CI)) - O.cybernetic_implants |= CI.type + for(var/org in internal_organs) + var/obj/item/organ/internal/aug = org + O.cybernetic_implants |= aug.type // Copy accessories var/obj/item/clothing/under/uniform_slot = get_item_by_slot(slot_w_uniform) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 1066bf972c1..8175f4353cc 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -1556,43 +1556,32 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) surplus = 0 gamemodes = list(/datum/game_mode/nuclear) -/datum/uplink_item/cyber_implants/spawn_item(turf/loc, obj/item/uplink/U) - if(item) - if(findtext(item, /obj/item/organ/internal/cyberimp)) - U.uses -= max(cost, 0) - U.used_TC += cost - SSblackbox.record_feedback("nested tally", "traitor_uplink_items_bought", 1, list("[initial(name)]", "[cost]")) //this one and the line before copypasted because snowflaek code - return new /obj/item/storage/box/cyber_implants(loc, item) - else - return ..() - /datum/uplink_item/cyber_implants/thermals name = "Thermal Vision Implant" - desc = "These cybernetic eyes will give you thermal vision. Comes with an automated implanting tool." + desc = "These cybernetic eyes will give you thermal vision. Comes with an autosurgeon." reference = "CIT" - item = /obj/item/organ/internal/cyberimp/eyes/thermals + item = /obj/item/autosurgeon/organ/syndicate/thermal_eyes 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 automated implanting tool." + desc = "These cybernetic eyes will give you X-ray vision. Comes with an autosurgeon." reference = "CIX" - item = /obj/item/organ/internal/cyberimp/eyes/xray + item = /obj/item/autosurgeon/organ/syndicate/xray_eyes cost = 10 /datum/uplink_item/cyber_implants/antistun name = "Hardened CNS Rebooter Implant" - desc = "This implant will help you get back up on your feet faster after being stunned. It is invulnerable to EMPs. \ - Comes with an automated implanting tool." + desc = "This implant will help you get back up on your feet faster after being stunned. It is immune to EMP attacks. Comes with an autosurgeon." reference = "CIAS" - item = /obj/item/organ/internal/cyberimp/brain/anti_stun/hardened + item = /obj/item/autosurgeon/organ/syndicate/anti_stun cost = 12 /datum/uplink_item/cyber_implants/reviver name = "Hardened Reviver Implant" - desc = "This implant will attempt to revive you if you lose consciousness. It is invulnerable to EMPs. Comes with an automated implanting tool." + desc = "This implant will attempt to revive and heal you if you lose consciousness. It is immune to EMP attacks. Comes with an autosurgeon." reference = "CIR" - item = /obj/item/organ/internal/cyberimp/chest/reviver/hardened + item = /obj/item/autosurgeon/organ/syndicate/reviver cost = 8 // POINTLESS BADASSERY @@ -1674,10 +1663,9 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/bundles_TC/cyber_implants name = "Cybernetic Implants Bundle" - desc = "A random selection of cybernetic implants. Guaranteed 5 high quality implants. \ - Comes with an automated implanting tool." + desc = "A random selection of cybernetic implants. Guaranteed 5 high quality implants. Comes with an autosurgeon." reference = "CIB" - item = /obj/item/storage/box/cyber_implants/bundle + item = /obj/item/storage/box/cyber_implants cost = 40 gamemodes = list(/datum/game_mode/nuclear) diff --git a/code/datums/vision_override.dm b/code/datums/vision_override.dm index 86aab6d65ec..e110daafd53 100644 --- a/code/datums/vision_override.dm +++ b/code/datums/vision_override.dm @@ -4,15 +4,7 @@ var/sight_flags = 0 var/see_in_dark = 0 var/lighting_alpha - - var/light_sensitive = 0 /datum/vision_override/nightvision see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - -/datum/vision_override/nightvision/thermals - sight_flags = SEE_MOBS - -/datum/vision_override/nightvision/thermals/ling_augmented_eyesight - light_sensitive = 1 diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index ac521fd90d1..9ecad776e3e 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -213,7 +213,7 @@ // This proc gives the DNA info for eye color to the given eyes /datum/dna/proc/write_eyes_attributes(obj/item/organ/internal/eyes/eyes_organ) - eyes_organ.eye_colour = rgb(eyes_organ.dna.GetUIValueRange(DNA_UI_EYES_R, 255), eyes_organ.dna.GetUIValueRange(DNA_UI_EYES_G, 255), eyes_organ.dna.GetUIValueRange(DNA_UI_EYES_B, 255)) + eyes_organ.eye_color = rgb(eyes_organ.dna.GetUIValueRange(DNA_UI_EYES_R, 255), eyes_organ.dna.GetUIValueRange(DNA_UI_EYES_G, 255), eyes_organ.dna.GetUIValueRange(DNA_UI_EYES_B, 255)) /* TRAIT CHANGING PROCS @@ -223,9 +223,9 @@ // In absence of eyes, possibly randomize the eye color DNA? return - SetUIValueRange(DNA_UI_EYES_R, color2R(eyes_organ.eye_colour), 255, 1) - SetUIValueRange(DNA_UI_EYES_G, color2G(eyes_organ.eye_colour), 255, 1) - SetUIValueRange(DNA_UI_EYES_B, color2B(eyes_organ.eye_colour), 255, 1) + SetUIValueRange(DNA_UI_EYES_R, color2R(eyes_organ.eye_color), 255, 1) + SetUIValueRange(DNA_UI_EYES_G, color2G(eyes_organ.eye_color), 255, 1) + SetUIValueRange(DNA_UI_EYES_B, color2B(eyes_organ.eye_color), 255, 1) /datum/dna/proc/head_traits_to_dna(obj/item/organ/external/head/head_organ) if(!head_organ) diff --git a/code/game/dna/mutations/monkey.dm b/code/game/dna/mutations/monkey.dm index 8939ee31e00..4ebe366bfb7 100644 --- a/code/game/dna/mutations/monkey.dm +++ b/code/game/dna/mutations/monkey.dm @@ -14,9 +14,7 @@ if(issmall(H)) return for(var/obj/item/W in H) - if(istype(W,/obj/item/organ)) - continue - if(istype(W,/obj/item/implant)) + if(istype(W, /obj/item/implant)) continue H.unEquip(W) @@ -51,9 +49,7 @@ for(var/obj/item/W in H) if(W == H.w_uniform) // will be torn continue - if(istype(W,/obj/item/organ)) - continue - if(istype(W,/obj/item/implant)) + if(istype(W, /obj/item/implant)) continue H.unEquip(W) H.regenerate_icons() diff --git a/code/game/dna/mutations/powers.dm b/code/game/dna/mutations/powers.dm index c2590fd227d..98d94299bfc 100644 --- a/code/game/dna/mutations/powers.dm +++ b/code/game/dna/mutations/powers.dm @@ -821,7 +821,7 @@ else M.change_gender(FEMALE) - var/new_eyes = input("Please select eye color.", "Character Generation", eyes_organ.eye_colour) as null|color + var/new_eyes = input("Please select eye color.", "Character Generation", eyes_organ.eye_color) as null|color if(new_eyes) M.change_eye_color(new_eyes) diff --git a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm index 3e7d72cfd42..9e0a2279bbd 100644 --- a/code/game/gamemodes/changeling/powers/augmented_eyesight.dm +++ b/code/game/gamemodes/changeling/powers/augmented_eyesight.dm @@ -3,84 +3,54 @@ /datum/action/changeling/augmented_eyesight name = "Augmented Eyesight" - desc = "Creates heat receptors in our eyes and dramatically increases light sensing ability." - helptext = "Grants us thermal vision or flash protection. We will become a lot more vulnerable to flash based devices while thermal vision is active." + desc = "Creates more light sensing rods in our eyes, allowing our vision to penetrate most blocking objects. Protects our vision from flashes while inactive." + helptext = "Grants us x-ray vision or flash protection. We will become a lot more vulnerable to flash-based devices while x-ray vision is active." button_icon_state = "augmented_eyesight" chemical_cost = 0 dna_cost = 2 //Would be 1 without thermal vision active = FALSE /datum/action/changeling/augmented_eyesight/on_purchase(mob/user) //The ability starts inactive, so we should be protected from flashes. + if(!istype(user)) + return ..() - var/obj/item/organ/internal/cyberimp/eyes/O = new /obj/item/organ/internal/cyberimp/eyes/shield/ling() - O.insert(user) - active = FALSE + var/obj/item/organ/internal/eyes/E = user.get_organ_slot("eyes") + if(E) + E.flash_protect = FLASH_PROTECTION_WELDER //Adjust the user's eyes' flash protection + to_chat(user, "We adjust our eyes to protect them from bright lights.") + else + to_chat(user, "We can't adjust our eyes if we don't have any!") /datum/action/changeling/augmented_eyesight/sting_action(mob/living/carbon/user) if(!istype(user)) return - if(!active) - var/obj/item/organ/internal/cyberimp/eyes/O = new /obj/item/organ/internal/cyberimp/eyes/thermals/ling() - O.insert(user) - active = TRUE + ..() + var/obj/item/organ/internal/eyes/E = user.get_organ_slot("eyes") + if(E) + if(!active) + E.vision_flags |= SEE_MOBS | SEE_OBJS | SEE_TURFS //Add sight flags to the user's eyes + E.flash_protect = FLASH_PROTECTION_SENSITIVE //Adjust the user's eyes' flash protection + to_chat(user, "We adjust our eyes to sense prey through walls.") + active = TRUE + else + E.vision_flags ^= SEE_MOBS | SEE_OBJS | SEE_TURFS //Remove sight flags from the user's eyes + E.flash_protect = FLASH_PROTECTION_WELDER //Adjust the user's eyes' flash protection + to_chat(user, "We adjust our eyes to protect them from bright lights.") + active = FALSE + user.update_sight() else - var/obj/item/organ/internal/cyberimp/eyes/O = new /obj/item/organ/internal/cyberimp/eyes/shield/ling() - O.insert(user) - active = FALSE - return 1 + to_chat(user, "We can't adjust our eyes if we don't have any!") + return TRUE -/datum/action/changeling/augmented_eyesight/Remove(mob/user) - var/obj/item/organ/internal/cyberimp/eyes/O = user.get_organ_slot("eye_ling") - if(O) - O.remove(user) - qdel(O) - ..() - -/obj/item/organ/internal/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_colour = "#000000" - implant_overlay = null - slot = "eye_ling" - status = 0 - aug_message = "We feel a minute twitch in our eyes, our eyes feel more durable." - -/obj/item/organ/internal/cyberimp/eyes/shield/ling/on_life() - ..() - var/obj/item/organ/internal/eyes/E = owner.get_int_organ(/obj/item/organ/internal/eyes) - if(owner.eye_blind || owner.eye_blurry || HAS_TRAIT(owner, TRAIT_BLIND) || HAS_TRAIT(owner, TRAIT_NEARSIGHT) || (E && E.damage > 0)) - owner.reagents.add_reagent("oculine", 1) - -/obj/item/organ/internal/cyberimp/eyes/shield/ling/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent("oculine", 15) - return S - -/obj/item/organ/internal/cyberimp/eyes/thermals/ling - name = "heat receptors" - desc = "These heat receptors dramatically increases eyes light sensing ability." - icon_state = "ling_thermal" - eye_colour = "#000000" - implant_overlay = null - slot = "eye_ling" - status = 0 - aug_message = "We feel a minute twitch in our eyes, and darkness creeps away." - -/obj/item/organ/internal/cyberimp/eyes/thermals/ling/emp_act(severity) - return - -/obj/item/organ/internal/cyberimp/eyes/thermals/ling/insert(mob/living/carbon/M, special = 0) - ..() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.weakeyes = 1 - if(!H.vision_type) - H.set_sight(/datum/vision_override/nightvision) - -/obj/item/organ/internal/cyberimp/eyes/thermals/ling/remove(mob/living/carbon/M, special = 0) - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.weakeyes = 0 - H.set_sight(null) + +/datum/action/changeling/augmented_eyesight/Remove(mob/user) //Get rid of x-ray vision and flash protection when the user refunds this ability + if(!istype(user)) + return + var/obj/item/organ/internal/eyes/E = user.get_organ_slot("eyes") + if(E) + if(active) + E.vision_flags ^= SEE_MOBS | SEE_OBJS | SEE_TURFS + else + E.flash_protect = FLASH_PROTECTION_NONE + user.update_sight() ..() diff --git a/code/game/gamemodes/changeling/powers/headslug.dm b/code/game/gamemodes/changeling/powers/headslug.dm index d67ad36a80e..e37f97269e4 100644 --- a/code/game/gamemodes/changeling/powers/headslug.dm +++ b/code/game/gamemodes/changeling/powers/headslug.dm @@ -17,7 +17,7 @@ var/list/organs = user.get_organs_zone("head", 1) for(var/obj/item/organ/internal/I in organs) - I.remove(user, 1) + I.remove(user, TRUE) explosion(get_turf(user),0,0,2,0,silent=1) for(var/mob/living/carbon/human/H in range(2,user)) @@ -35,7 +35,7 @@ spawn(5) // So it's not killed in explosion var/mob/living/simple_animal/hostile/headslug/crab = new(new_location) for(var/obj/item/organ/internal/I in organs) - I.loc = crab + I.forceMove(crab) crab.origin = M if(crab.origin) crab.origin.active = 1 diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm index 047bc322ccd..2ed440f366d 100644 --- a/code/game/gamemodes/shadowling/shadowling.dm +++ b/code/game/gamemodes/shadowling/shadowling.dm @@ -162,7 +162,7 @@ Made by Xhuis new_thrall_mind.current.create_log(CONVERSION_LOG, "Became a thrall") new_thrall_mind.current.add_language("Shadowling Hivemind") new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/lesser_shadow_walk(null)) - new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision/thrall(null)) + new_thrall_mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision(null)) to_chat(new_thrall_mind.current, "You see the truth. Reality has been torn away and you realize what a fool you've been.") to_chat(new_thrall_mind.current, "The shadowlings are your masters. Serve them above all else and ensure they complete their goals.") to_chat(new_thrall_mind.current, "You may not harm other thralls or the shadowlings. However, you do not need to obey other thralls.") diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 22faac6a489..5d7f6c269e8 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -146,9 +146,9 @@ /obj/effect/proc_holder/spell/targeted/shadow_vision - name = "Shadowling Darksight" - desc = "Gives you night and thermal vision." - panel = "Shadowling Abilities" + name = "Thrall Darksight" + desc = "Gives you night vision." + panel = "Thrall Abilities" charge_max = 0 range = -1 include_user = 1 @@ -167,11 +167,6 @@ to_chat(H, "You return your vision to normal.") H.set_sight(null) -/obj/effect/proc_holder/spell/targeted/shadow_vision/thrall - desc = "Thrall Darksight" - desc = "Gives you night vision." - panel = "Thrall Abilities" - /obj/effect/proc_holder/spell/aoe_turf/flashfreeze name = "Icy Veins" desc = "Instantly freezes the blood of nearby people, stunning them and causing burn damage." diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm index 1aa8d628560..9fb234a27ff 100644 --- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm @@ -30,7 +30,7 @@ GLOBAL_LIST_INIT(possibleShadowlingNames, list("U'ruan", "Y`shej", "Nex", "Hel-u H.visible_message("[H]'s things suddenly slip off. They hunch over and vomit up a copious amount of purple goo which begins to shape around them!", \ "You remove any equipment which would hinder your hatching and begin regurgitating the resin which will protect you.") - for(var/obj/item/I in H.contents - (H.bodyparts | H.internal_organs)) //drops all items except organs + for(var/obj/item/I in H.contents) H.unEquip(I) sleep(50) @@ -99,7 +99,6 @@ GLOBAL_LIST_INIT(possibleShadowlingNames, list("U'ruan", "Y`shej", "Nex", "Hel-u sleep(10) to_chat(H, "Your powers are awoken. You may now live to your fullest extent. Remember your goal. Cooperate with your thralls and allies.") H.ExtinguishMob() - H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_vision(null)) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/click/enthrall(null)) H.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/click/glare(null)) H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/veil(null)) diff --git a/code/game/jobs/job/central.dm b/code/game/jobs/job/central.dm index 8684ca7d1b0..c25dfdd256f 100644 --- a/code/game/jobs/job/central.dm +++ b/code/game/jobs/job/central.dm @@ -93,7 +93,7 @@ /obj/item/implant/dust ) cybernetic_implants = list( - /obj/item/organ/internal/cyberimp/eyes/xray, + /obj/item/organ/internal/eyes/cybernetic/xray, /obj/item/organ/internal/cyberimp/brain/anti_stun/hardened, /obj/item/organ/internal/cyberimp/chest/nutriment/plus, /obj/item/organ/internal/cyberimp/arm/combat/centcom diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 369d43e5d94..b7b35863541 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -66,9 +66,6 @@ if(L.flash_eyes(affect_silicon = 1)) L.Weaken(strength) - if(L.weakeyes) - L.Weaken(strength * 1.5) - L.visible_message("[L] gasps and shields [L.p_their()] eyes!") /obj/machinery/flasher/emp_act(severity) if(stat & (BROKEN|NOPOWER)) diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 04822a8014f..d03536e8f5b 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -252,8 +252,6 @@ for(var/obj/item/I in H) if(istype(I, /obj/item/implant)) continue - if(istype(I, /obj/item/organ)) - continue qdel(I) H.equipOutfit(selected_outfit) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 7e24cfab25c..3ecd0d0fc3c 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -258,7 +258,7 @@ /obj/item/assembly/signaler/anomaly = 50, // anomaly core /obj/item/mecha_parts/mecha_equipment/weapon/energy/xray = 25, // mecha x-ray laser /obj/item/mecha_parts/mecha_equipment/teleporter/precise = 25, // upgraded mecha teleporter - /obj/item/autoimplanter = 50, + /obj/item/autosurgeon = 50, // Research / Experimentor /obj/item/paper/researchnotes = 150, // papers that give random R&D levels diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 4ae316236df..8fb04c81473 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -69,7 +69,7 @@ if("letter") temp = input("Choose the letter.", "Scribbles") in letters if("random_rune") - temp = "rune[rand(1,10)]" + temp = "rune[rand(1, 8)]" if("random_graffiti") temp = pick(graffiti) else diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 2edd1c01a26..d2cf5a65bd2 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -89,8 +89,6 @@ if(user) add_attack_logs(user, M, "Flashed with [src]") if(targeted) - if(M.weakeyes) - M.Weaken(3) //quick weaken bypasses eye protection but has no eye flash if(M.flash_eyes(1, 1)) M.AdjustConfused(power) terrible_conversion_proc(M, user) @@ -98,9 +96,6 @@ visible_message("[user] blinds [M] with the flash!") to_chat(user, "You blind [M] with the flash!") to_chat(M, "[user] blinds you with the flash!") - if(M.weakeyes) - M.Stun(2) - M.visible_message("[M] gasps and shields [M.p_their()] eyes!", "You gasp and shield your eyes!") else visible_message("[user] fails to blind [M] with the flash!") to_chat(user, "You fail to blind [M] with the flash!") diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index aadd814c0f2..009c7e70b48 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -396,3 +396,11 @@ anchored = TRUE var/range = null resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + +/obj/item/flashlight/eyelight + name = "eyelight" + desc = "This shouldn't exist outside of someone's head, how are you seeing this?" + light_range = 15 + light_power = 1 + flags = CONDUCT | DROPDEL + actions_types = list() diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index fe7d0cb3fe6..d96b2822bc2 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -108,8 +108,6 @@ //20% chance to actually hit the eyes if(prob(effectchance * diode.rating) && C.flash_eyes(severity)) outmsg = "You blind [C] by shining [src] in [C.p_their()] eyes." - if(C.weakeyes) - C.Stun(1) else outmsg = "You fail to blind [C] by shining [src] at [C.p_their()] eyes!" diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 8178beca64c..ea9f7200177 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -333,7 +333,7 @@ effective or pretty fucking useless. playsound(destination, "sound/magic/disintegrate.ogg", 50, TRUE) destination.ex_act(rand(1,2)) for(var/obj/item/W in user) - if(istype(W, /obj/item/organ)|| istype(W, /obj/item/implant)) + if(istype(W, /obj/item/implant)) continue if(!user.unEquip(W)) qdel(W) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index 6606b7cc703..8122814353b 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -50,17 +50,6 @@ // Flash if(flash) - if(M.weakeyes) - M.visible_message("[M] screams and collapses!") - to_chat(M, "AAAAGH!") - M.Weaken(15) //hella stunned - M.Stun(15) - if(ishuman(M)) - M.emote("scream") - var/mob/living/carbon/human/H = M - var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) - if(E) - E.receive_damage(8, TRUE) if(M.flash_eyes(affect_silicon = TRUE)) M.Stun(stun_amount) M.Weaken(stun_amount) diff --git a/code/game/objects/items/weapons/storage/artistic_toolbox.dm b/code/game/objects/items/weapons/storage/artistic_toolbox.dm index f7b8a4eb200..3fbaa1d468d 100644 --- a/code/game/objects/items/weapons/storage/artistic_toolbox.dm +++ b/code/game/objects/items/weapons/storage/artistic_toolbox.dm @@ -2,10 +2,7 @@ name = "artistic toolbox" desc = "A metal container designed to hold various tools. This variety holds art supplies." icon_state = "green" - item_state = "toolbox_green" - icon = 'icons/goonstation/objects/objects.dmi' - lefthand_file = 'icons/goonstation/mob/inhands/items_lefthand.dmi' - righthand_file = 'icons/goonstation/mob/inhands/items_righthand.dmi' + item_state = "artistic_toolbox" /obj/item/storage/toolbox/green/memetic name = "artistic toolbox" diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 85aa8ca72cc..d1548eb2305 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -88,7 +88,7 @@ return if((istype(over_object, /obj/structure/table) || isfloorturf(over_object)) && length(contents) \ - && loc == M && !M.stat && !M.restrained() && M.canmove && over_object.Adjacent(M) && !istype(M, /obj/item/storage/lockbox)) // Worlds longest `if()` + && loc == M && !M.stat && !M.restrained() && M.canmove && over_object.Adjacent(M) && !istype(src, /obj/item/storage/lockbox)) // Worlds longest `if()` var/turf/T = get_turf(over_object) if(isfloorturf(over_object)) if(get_turf(M) != T) diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index 2f2eb9841cc..db3e97b4154 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -1,9 +1,10 @@ /obj/item/storage/toolbox name = "toolbox" desc = "Danger. Very robust." - icon = 'icons/obj/storage.dmi' - icon_state = "red" - item_state = "toolbox_red" + icon_state = "toolbox_default" + item_state = "toolbox_default" + lefthand_file = 'icons/mob/inhands/equipment/toolbox_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' flags = CONDUCT force = 10 throwforce = 10 @@ -16,6 +17,23 @@ hitsound = 'sound/weapons/smash.ogg' drop_sound = 'sound/items/handling/toolbox_drop.ogg' pickup_sound = 'sound/items/handling/toolbox_pickup.ogg' + var/latches = "single_latch" + var/has_latches = TRUE + +/obj/item/storage/toolbox/Initialize(mapload) + . = ..() + if(has_latches) + if(prob(10)) + latches = "double_latch" + if(prob(1)) + latches = "triple_latch" + update_icon() + +/obj/item/storage/toolbox/update_icon() + ..() + cut_overlays() + if(has_latches) + add_overlay(latches) /obj/item/storage/toolbox/emergency name = "emergency toolbox" @@ -35,6 +53,7 @@ /obj/item/storage/toolbox/emergency/old name = "rusty red toolbox" icon_state = "toolbox_red_old" + has_latches = FALSE /obj/item/storage/toolbox/mechanical name = "mechanical toolbox" @@ -55,6 +74,7 @@ /obj/item/storage/toolbox/mechanical/old name = "rusty blue toolbox" icon_state = "toolbox_blue_old" + has_latches = FALSE /obj/item/storage/toolbox/electrical name = "electrical toolbox" @@ -112,22 +132,3 @@ new /obj/item/stack/cable_coil(src, 30, paramcolor = pickedcolor) new /obj/item/wirecutters(src) new /obj/item/multitool(src) - -/obj/item/storage/toolbox/brass - name = "brass box" - desc = "A huge brass box with several indentations in its surface." - icon_state = "brassbox" - item_state = null - resistance_flags = FIRE_PROOF | ACID_PROOF - w_class = WEIGHT_CLASS_HUGE - max_w_class = WEIGHT_CLASS_NORMAL - max_combined_w_class = 28 - storage_slots = 28 - attack_verb = list("robusted", "crushed", "smashed") - -/obj/item/storage/toolbox/brass/prefilled/populate_contents() - new /obj/item/screwdriver/brass(src) - new /obj/item/wirecutters/brass(src) - new /obj/item/wrench/brass(src) - new /obj/item/crowbar/brass(src) - new /obj/item/weldingtool/experimental/brass(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 98d0bce5e5e..cf1ad89b4ed 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -40,4 +40,4 @@ new /obj/item/clothing/glasses/meson(src) new /obj/item/clothing/head/soft(src) new /obj/item/door_remote/quartermaster(src) - new /obj/item/organ/internal/cyberimp/eyes/meson(src) + new /obj/item/organ/internal/eyes/cybernetic/meson(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index f11b301202c..7fa60e02c3c 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -38,7 +38,7 @@ new /obj/item/door_remote/chief_engineer(src) new /obj/item/rpd(src) new /obj/item/reagent_containers/food/drinks/mug/ce(src) - new /obj/item/organ/internal/cyberimp/eyes/meson(src) + new /obj/item/organ/internal/eyes/cybernetic/meson(src) new /obj/item/clothing/accessory/medal/engineering(src) new /obj/item/holosign_creator/atmos(src) diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm index f913d9d98ef..72376027dc5 100644 --- a/code/modules/admin/admin_ranks.dm +++ b/code/modules/admin/admin_ranks.dm @@ -117,7 +117,7 @@ GLOBAL_PROTECT(admin_ranks) // this shit is being protected for obvious reasons load_admins() return - var/datum/db_query/query = SSdbcore.NewQuery("SELECT ckey, rank, level, flags FROM [format_table_name("admin")]") + var/datum/db_query/query = SSdbcore.NewQuery("SELECT ckey, admin_rank, level, flags FROM [format_table_name("admin")]") if(!query.warn_execute(async=run_async)) qdel(query) return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 65ca7edfded..d0660ef89e7 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -696,7 +696,7 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list( return var/datum/db_query/rank_read = SSdbcore.NewQuery( - "SELECT rank FROM [format_table_name("admin")] WHERE ckey=:ckey", + "SELECT admin_rank FROM [format_table_name("admin")] WHERE ckey=:ckey", list("ckey" = ckey) ) @@ -722,7 +722,7 @@ GLOBAL_LIST_INIT(admin_verbs_ticket, list( return var/datum/db_query/admin_read = SSdbcore.NewQuery( - "SELECT ckey, rank, flags FROM [format_table_name("admin")] WHERE ckey=:ckey", + "SELECT ckey, admin_rank, flags FROM [format_table_name("admin")] WHERE ckey=:ckey", list("ckey" = ckey) ) diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm index 748dee2cae3..dc55605d202 100644 --- a/code/modules/admin/permissionverbs/permissionedit.dm +++ b/code/modules/admin/permissionverbs/permissionedit.dm @@ -90,7 +90,7 @@ qdel(select_query) flag_account_for_forum_sync(adm_ckey) if(new_admin) - var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin")] (`id`, `ckey`, `rank`, `level`, `flags`) VALUES (null, :adm_ckey, :new_rank, -1, 0)", list( + var/datum/db_query/insert_query = SSdbcore.NewQuery("INSERT INTO [format_table_name("admin")] (`id`, `ckey`, `admin_rank`, `level`, `flags`) VALUES (null, :adm_ckey, :new_rank, -1, 0)", list( "adm_ckey" = adm_ckey, "new_rank" = new_rank )) @@ -113,7 +113,7 @@ to_chat(usr, "New admin added.") else if(!isnull(admin_id) && isnum(admin_id)) - var/datum/db_query/insert_query = SSdbcore.NewQuery("UPDATE [format_table_name("admin")] SET rank=:new_rank WHERE id=:admin_id", list( + var/datum/db_query/insert_query = SSdbcore.NewQuery("UPDATE [format_table_name("admin")] SET admin_rank=:new_rank WHERE id=:admin_id", list( "new_rank" = new_rank, "admin_id" = admin_id, )) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 46a67e32a98..aa10d51ce1d 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2967,9 +2967,6 @@ if(!security) //strip their stuff before they teleport into a cell :downs: for(var/obj/item/W in H) - if(istype(W, /obj/item/organ/external)) - continue - //don't strip organs H.unEquip(W) if(H.client) H.client.screen -= W diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index ccb1c8a315a..32ec86541ab 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -30,8 +30,6 @@ for(var/obj/item/I in H) if(istype(I, /obj/item/implant)) continue - if(istype(I, /obj/item/organ)) - continue qdel(I) H.equip_to_slot_or_del(new /obj/item/clothing/under/kilt(H), slot_w_uniform) diff --git a/code/modules/admin/verbs/onlyoneteam.dm b/code/modules/admin/verbs/onlyoneteam.dm index 974b65e05d2..a822367b68c 100644 --- a/code/modules/admin/verbs/onlyoneteam.dm +++ b/code/modules/admin/verbs/onlyoneteam.dm @@ -18,8 +18,6 @@ for(var/obj/item/I in H) if(istype(I, /obj/item/implant)) continue - if(istype (I, /obj/item/organ)) - continue qdel(I) to_chat(H, "You are part of the [station_name()] dodgeball tournament. Throw dodgeballs at crewmembers wearing a different color than you. OOC: Use THROW on an EMPTY-HAND to catch thrown dodgeballs.") diff --git a/code/modules/awaymissions/mission_code/academy.dm b/code/modules/awaymissions/mission_code/academy.dm index 40c4975505d..4421bc9c232 100644 --- a/code/modules/awaymissions/mission_code/academy.dm +++ b/code/modules/awaymissions/mission_code/academy.dm @@ -114,7 +114,7 @@ //Destroy Equipment T.visible_message("Everything [user] is holding and wearing disappears!") for(var/obj/item/I in user) - if(istype(I, /obj/item/implant) || istype(I, /obj/item/organ)) + if(istype(I, /obj/item/implant)) continue qdel(I) if(5) diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index dcf12d64746..18ef065d62c 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -278,6 +278,14 @@ reqs = list(/obj/item/paper = 5) category = CAT_MISC +/datum/crafting_recipe/flashlight_eyes + name = "Flashlight Eyes" + result = /obj/item/organ/internal/eyes/cybernetic/flashlight + time = 10 + reqs = list(/obj/item/flashlight = 2, + /obj/item/restraints/handcuffs/cable = 1) + category = CAT_MISC + /datum/crafting_recipe/sushimat name = "Sushi Mat" result = /obj/item/kitchen/sushimat diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index f65b78f3ca2..4336c870bf3 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -387,8 +387,6 @@ var/obj/item/implant/I = O if(I.implanted) continue - if(istype(O,/obj/item/organ)) - continue if(O.flags & NODROP || stealthmode) qdel(O) //they are already dead by now H.unEquip(O) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 589ae6c8b6c..bb48bbf9b0d 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -253,14 +253,5 @@ Des: Removes all infected images from the alien. if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. return - for(var/obj/item/organ/internal/cyberimp/eyes/E in internal_organs) - sight |= E.vision_flags - if(E.see_in_dark) - see_in_dark = max(see_in_dark, E.see_in_dark) - if(E.see_invisible) - see_invisible = min(see_invisible, E.see_invisible) - if(!isnull(E.lighting_alpha)) - lighting_alpha = min(lighting_alpha, E.lighting_alpha) - SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) sync_lighting_plane_alpha() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index ca7d06292f4..f04e7766eb6 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -343,9 +343,6 @@ if(.) if(visual) return - if(weakeyes) - Stun(2) - var/obj/item/organ/internal/eyes/E = get_int_organ(/obj/item/organ/internal/eyes) if(!E || (E && E.weld_proof)) return @@ -485,8 +482,6 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven var/failed = 0 if(istype(I, /obj/item/implant)) continue - if(istype(I, /obj/item/organ)) - continue if(I.flags & ABSTRACT) continue else @@ -1148,6 +1143,10 @@ so that different stomachs can handle things in different ways VB*/ if(wear_mask) . += wear_mask.tint + var/obj/item/organ/internal/eyes/E = get_organ_slot("eyes") + if(E) + . += E.tint + /mob/living/carbon/human/get_total_tint() . = ..() if(glasses) @@ -1188,15 +1187,6 @@ so that different stomachs can handle things in different ways VB*/ sight = initial(sight) lighting_alpha = initial(lighting_alpha) - for(var/obj/item/organ/internal/cyberimp/eyes/E in internal_organs) - sight |= E.vision_flags - if(E.see_in_dark) - see_in_dark = max(see_in_dark, E.see_in_dark) - if(E.see_invisible) - see_invisible = min(see_invisible, E.see_invisible) - if(!isnull(E.lighting_alpha)) - lighting_alpha = min(lighting_alpha, E.lighting_alpha) - if(client.eye != src) var/atom/A = client.eye if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. @@ -1209,7 +1199,6 @@ so that different stomachs can handle things in different ways VB*/ if(HAS_TRAIT(src, TRAIT_XRAY_VISION)) sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) see_in_dark = max(see_in_dark, 8) - lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT) sync_lighting_plane_alpha() diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index f0bfdb31b7b..3695ed7d478 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -206,10 +206,10 @@ // Update the main DNA datum, then sync the change across the organs var/obj/item/organ/internal/eyes/eyes_organ = get_int_organ(/obj/item/organ/internal/eyes) if(eyes_organ) - if(colour == eyes_organ.eye_colour) + if(colour == eyes_organ.eye_color) return - eyes_organ.eye_colour = colour + eyes_organ.eye_color = colour dna.eye_color_to_dna(eyes_organ) eyes_organ.set_dna(dna) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 93992336a18..78db4d3c1b4 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -332,8 +332,7 @@ if(slot_wear_mask in obscured) dat += " ↳Headpocket:Obscured" else - var/list/items = C.get_contents() - if(items.len) + if(C.held_item) dat += " ↳Headpocket:Dislodge Items" else dat += " ↳Headpocket:Empty" @@ -943,9 +942,9 @@ if(istype(wear_mask, /obj/item/clothing/mask)) //mask var/obj/item/clothing/mask/MFP = wear_mask number += MFP.flash_protect - for(var/obj/item/organ/internal/cyberimp/eyes/EFP in internal_organs) - number += EFP.flash_protect - + var/obj/item/organ/internal/eyes/E = get_organ_slot("eyes") + if(E) + number += E.flash_protect return number /mob/living/carbon/human/check_ear_prot() @@ -1477,12 +1476,9 @@ /mob/living/carbon/human/proc/get_eyecon() var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes) - var/obj/item/organ/internal/cyberimp/eyes/eye_implant = get_int_organ(/obj/item/organ/internal/cyberimp/eyes) if(istype(dna.species) && dna.species.eyes) var/icon/eyes_icon - if(eye_implant) //Eye implants override native DNA eye colo(u)r - eyes_icon = eye_implant.generate_icon() - else if(eyes) + if(eyes) eyes_icon = eyes.generate_icon() else //Error 404: Eyes not found! eyes_icon = new('icons/mob/human_face.dmi', dna.species.eyes) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 7e45c9c81cc..5c5d5bc652b 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -226,6 +226,12 @@ emp_act if(mind && mind.martial_art && prob(mind.martial_art.block_chance) && mind.martial_art.can_use(src) && in_throw_mode && !incapacitated(FALSE, TRUE)) return TRUE +/mob/living/carbon/human/emp_act(severity) + ..() + for(var/X in bodyparts) + var/obj/item/organ/external/L = X + L.emp_act(severity) + /mob/living/carbon/human/acid_act(acidpwr, acid_volume, bodyzone_hit) //todo: update this to utilize check_obscured_slots() //and make sure it's check_obscured_slots(TRUE) to stop aciding through visors etc var/list/damaged = list() var/list/inventory_items_to_kill = list() diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 56bed537c20..92752c3669c 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -66,14 +66,6 @@ if(slot_tie) return TRUE -// The actual dropping happens at the mob level - checks to prevent drops should -// come here -/mob/living/carbon/human/canUnEquip(obj/item/I, force) - . = ..() - var/obj/item/organ/O = I - if(istype(O) && O.owner == src) - . = 0 // keep a good grip on your heart - /mob/living/carbon/human/unEquip(obj/item/I, force, silent = FALSE) . = ..() //See mob.dm for an explanation on this and some rage about people copypasting instead of calling ..() like they should. if(!. || !I) diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm index a11a7189e54..9d642c155f8 100644 --- a/code/modules/mob/living/carbon/human/species/_species.dm +++ b/code/modules/mob/living/carbon/human/species/_species.dm @@ -151,7 +151,7 @@ "appendix" = /obj/item/organ/internal/appendix, "eyes" = /obj/item/organ/internal/eyes ) - var/vision_organ // If set, this organ is required for vision. Defaults to "eyes" if the species has them. + var/vision_organ = /obj/item/organ/internal/eyes // If set, this organ is required for vision. var/list/has_limbs = list( "chest" = list("path" = /obj/item/organ/external/chest), "groin" = list("path" = /obj/item/organ/external/groin), @@ -172,10 +172,6 @@ var/speciesbox /datum/species/New() - //If the species has eyes, they are the default vision organ - if(!vision_organ && has_organ["eyes"]) - vision_organ = /obj/item/organ/internal/eyes - unarmed = new unarmed_type() /datum/species/proc/get_random_name(gender) @@ -846,7 +842,8 @@ It'll return null if the organ doesn't correspond, so include null checks when u H.sight |= eyes.vision_flags H.see_in_dark = eyes.see_in_dark H.see_invisible = eyes.see_invisible - H.lighting_alpha = eyes.lighting_alpha + if(!isnull(eyes.lighting_alpha)) + H.lighting_alpha = eyes.lighting_alpha else H.see_in_dark = initial(H.see_in_dark) H.see_invisible = initial(H.see_invisible) @@ -866,15 +863,6 @@ It'll return null if the organ doesn't correspond, so include null checks when u H.sight |= SEE_MOBS H.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - for(var/obj/item/organ/internal/cyberimp/eyes/E in H.internal_organs) - H.sight |= E.vision_flags - if(E.see_in_dark) - H.see_in_dark = max(H.see_in_dark, E.see_in_dark) - if(E.see_invisible) - H.see_invisible = min(H.see_invisible, E.see_invisible) - if(E.lighting_alpha) - H.lighting_alpha = min(H.lighting_alpha, E.lighting_alpha) - // my glasses, I can't see without my glasses if(H.glasses) var/obj/item/clothing/glasses/G = H.glasses @@ -906,9 +894,6 @@ It'll return null if the organ doesn't correspond, so include null checks when u if(!isnull(H.vision_type.lighting_alpha)) H.lighting_alpha = min(H.vision_type.lighting_alpha, H.lighting_alpha) - if(H.vision_type.light_sensitive) - H.weakeyes = TRUE - if(HAS_TRAIT(src, TRAIT_THERMAL_VISION)) H.sight |= (SEE_MOBS) H.lighting_alpha = min(H.lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) diff --git a/code/modules/mob/living/carbon/human/species/diona.dm b/code/modules/mob/living/carbon/human/species/diona.dm index bd3e85bf645..ffb7510dd40 100644 --- a/code/modules/mob/living/carbon/human/species/diona.dm +++ b/code/modules/mob/living/carbon/human/species/diona.dm @@ -39,13 +39,11 @@ "nutrient channel" = /obj/item/organ/internal/liver/diona, "respiratory vacuoles" = /obj/item/organ/internal/lungs/diona, "neural strata" = /obj/item/organ/internal/heart/diona, - "receptor node" = /obj/item/organ/internal/eyes/diona, //Default darksight of 2. + "eyes" = /obj/item/organ/internal/eyes/diona, //Default darksight of 2. "gas bladder" = /obj/item/organ/internal/brain/diona, "polyp segment" = /obj/item/organ/internal/kidneys/diona, "anchoring ligament" = /obj/item/organ/internal/appendix/diona ) - - vision_organ = /obj/item/organ/internal/eyes/diona has_limbs = list( "chest" = list("path" = /obj/item/organ/external/chest/diona), "groin" = list("path" = /obj/item/organ/external/groin/diona), diff --git a/code/modules/mob/living/carbon/human/species/drask.dm b/code/modules/mob/living/carbon/human/species/drask.dm index 145e28db401..5eb62de833f 100644 --- a/code/modules/mob/living/carbon/human/species/drask.dm +++ b/code/modules/mob/living/carbon/human/species/drask.dm @@ -63,4 +63,4 @@ /datum/species/drask/get_species_runechat_color(mob/living/carbon/human/H) var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) - return E.eye_colour + return E.eye_color diff --git a/code/modules/mob/living/carbon/human/species/grey.dm b/code/modules/mob/living/carbon/human/species/grey.dm index f91c4252b48..008fa9b39ac 100644 --- a/code/modules/mob/living/carbon/human/species/grey.dm +++ b/code/modules/mob/living/carbon/human/species/grey.dm @@ -91,4 +91,4 @@ /datum/species/grey/get_species_runechat_color(mob/living/carbon/human/H) var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) - return E.eye_colour + return E.eye_color diff --git a/code/modules/mob/living/carbon/human/species/kidan.dm b/code/modules/mob/living/carbon/human/species/kidan.dm index 68ccfbb37a4..da887e261b6 100644 --- a/code/modules/mob/living/carbon/human/species/kidan.dm +++ b/code/modules/mob/living/carbon/human/species/kidan.dm @@ -46,4 +46,4 @@ /datum/species/kidan/get_species_runechat_color(mob/living/carbon/human/H) var/obj/item/organ/internal/eyes/E = H.get_int_organ(/obj/item/organ/internal/eyes) - return E.eye_colour + return E.eye_color diff --git a/code/modules/mob/living/carbon/human/species/machine.dm b/code/modules/mob/living/carbon/human/species/machine.dm index 8dfae64dcee..e0df022eb79 100644 --- a/code/modules/mob/living/carbon/human/species/machine.dm +++ b/code/modules/mob/living/carbon/human/species/machine.dm @@ -48,11 +48,9 @@ has_organ = list( "brain" = /obj/item/organ/internal/brain/mmi_holder/posibrain, "cell" = /obj/item/organ/internal/cell, - "optics" = /obj/item/organ/internal/eyes/optical_sensor, //Default darksight of 2. + "eyes" = /obj/item/organ/internal/eyes/optical_sensor, //Default darksight of 2. "charger" = /obj/item/organ/internal/cyberimp/arm/power_cord ) - - vision_organ = /obj/item/organ/internal/eyes/optical_sensor mutantears = /obj/item/organ/internal/ears/microphone has_limbs = list( "chest" = list("path" = /obj/item/organ/external/chest/ipc), diff --git a/code/modules/mob/living/carbon/human/species/nucleation.dm b/code/modules/mob/living/carbon/human/species/nucleation.dm index f5fa663641c..4c2f7623f0e 100644 --- a/code/modules/mob/living/carbon/human/species/nucleation.dm +++ b/code/modules/mob/living/carbon/human/species/nucleation.dm @@ -28,7 +28,6 @@ "eyes" = /obj/item/organ/internal/eyes/luminescent_crystal, //Standard darksight of 2. "strange crystal" = /obj/item/organ/internal/nucleation/strange_crystal ) - vision_organ = /obj/item/organ/internal/eyes/luminescent_crystal /datum/species/nucleation/on_species_gain(mob/living/carbon/human/H) ..() diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm index d865a9485f4..e7f5450858d 100644 --- a/code/modules/mob/living/carbon/human/species/shadow.dm +++ b/code/modules/mob/living/carbon/human/species/shadow.dm @@ -12,7 +12,7 @@ flesh_color = "#AAAAAA" has_organ = list( "brain" = /obj/item/organ/internal/brain, - "eyes" = /obj/item/organ/internal/eyes/shadow //8 darksight. + "eyes" = /obj/item/organ/internal/eyes/night_vision/nightmare //8 darksight. ) species_traits = list(NO_BLOOD) @@ -27,36 +27,6 @@ "is twisting their own neck!", "is staring into the closest light source!") - var/grant_vision_toggle = TRUE - var/datum/action/innate/shadow/darkvision/vision_toggle - -/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.vision_type) - H.set_sight(/datum/vision_override/nightvision) - to_chat(H, "You adjust your vision to pierce the darkness.") - else - H.set_sight(null) - to_chat(H, "You adjust your vision to recognize the shadows.") - -/datum/species/shadow/on_species_gain(mob/living/carbon/human/H) - ..() - if(grant_vision_toggle) - vision_toggle = new - vision_toggle.Grant(H) - -/datum/species/shadow/on_species_loss(mob/living/carbon/human/H) - ..() - if(grant_vision_toggle && vision_toggle) - H.vision_type = null - vision_toggle.Remove(H) - /datum/species/shadow/handle_life(mob/living/carbon/human/H) var/light_amount = 0 if(isturf(H.loc)) diff --git a/code/modules/mob/living/carbon/human/species/shadowling.dm b/code/modules/mob/living/carbon/human/species/shadowling.dm index 2c6309dfbcb..6619692cf66 100644 --- a/code/modules/mob/living/carbon/human/species/shadowling.dm +++ b/code/modules/mob/living/carbon/human/species/shadowling.dm @@ -13,15 +13,11 @@ burn_mod = 1.5 //1.5x burn damage, 2x is excessive heatmod = 1.5 - grant_vision_toggle = 0 - has_organ = list( "brain" = /obj/item/organ/internal/brain, - "eyes" = /obj/item/organ/internal/eyes) + "eyes" = /obj/item/organ/internal/eyes/night_vision/nightmare) /datum/species/shadow/ling/handle_life(mob/living/carbon/human/H) - if(!H.weakeyes) - H.weakeyes = 1 //Makes them more vulnerable to flashes and flashbangs var/light_amount = 0 if(isturf(H.loc)) var/turf/T = H.loc @@ -63,8 +59,6 @@ heatmod = 1.1 /datum/species/shadow/ling/lesser/handle_life(mob/living/carbon/human/H) - if(!H.weakeyes) - H.weakeyes = 1 //Makes them more vulnerable to flashes and flashbangs var/light_amount = 0 if(isturf(H.loc)) var/turf/T = H.loc diff --git a/code/modules/mob/living/carbon/human/species/slime.dm b/code/modules/mob/living/carbon/human/species/slime.dm index 77f07c15adf..c849615e4a0 100644 --- a/code/modules/mob/living/carbon/human/species/slime.dm +++ b/code/modules/mob/living/carbon/human/species/slime.dm @@ -39,6 +39,7 @@ butt_sprite = "slime" //Has default darksight of 2. + vision_organ = null has_organ = list( "brain" = /obj/item/organ/internal/brain/slime, "heart" = /obj/item/organ/internal/heart/slime, diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 5d9e8af255d..9919778562f 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -1309,7 +1309,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes) if(eyes) - . += "[eyes.eye_colour]" + . += "[eyes.eye_color]" else . += "#000000" diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index e4431c03acb..ff48fe1256b 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -148,7 +148,6 @@ var/area/lastarea = null var/digitalcamo = 0 // Can they be tracked by the AI? - var/weakeyes = 0 //Are they vulnerable to flashes? var/has_unlimited_silicon_privilege = 0 // Can they interact with station electronics diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm index f01325c4242..cb69f3b7b31 100644 --- a/code/modules/reagents/chemistry/reagents/water.dm +++ b/code/modules/reagents/chemistry/reagents/water.dm @@ -272,7 +272,7 @@ M.SetConfused(0) if(ishuman(M)) // Unequip all cult clothing var/mob/living/carbon/human/H = M - for(var/I in H.contents - (H.bodyparts | H.internal_organs)) // Satanic liver NYI + for(var/I in H.contents) if(is_type_in_list(I, CULT_CLOTHING)) H.unEquip(I) return diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index ef0c984596a..f91b8f2012b 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -287,7 +287,7 @@ build_type = PROTOLATHE | MECHFAB construction_time = 40 materials = list(MAT_METAL = 600, MAT_GLASS = 400) - build_path = /obj/item/organ/internal/cyberimp/eyes/shield + build_path = /obj/item/organ/internal/eyes/cybernetic/shield category = list("Medical") /datum/design/cyberimp_breather @@ -397,7 +397,7 @@ build_type = PROTOLATHE | MECHFAB construction_time = 50 materials = list(MAT_METAL = 500, MAT_GLASS = 500, MAT_SILVER = 500, MAT_GOLD = 300) - build_path = /obj/item/organ/internal/cyberimp/eyes/meson + build_path = /obj/item/organ/internal/eyes/cybernetic/meson category = list("Medical") /datum/design/cyberimp_xray @@ -408,7 +408,7 @@ 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 = 1000, MAT_BLUESPACE = 1000) - build_path = /obj/item/organ/internal/cyberimp/eyes/xray + build_path = /obj/item/organ/internal/eyes/cybernetic/xray category = list("Medical") /datum/design/cyberimp_thermals @@ -419,7 +419,7 @@ 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/internal/cyberimp/eyes/thermals + build_path = /obj/item/organ/internal/eyes/cybernetic/thermals category = list("Medical") /datum/design/cyberimp_antidrop diff --git a/code/modules/response_team/ert_outfits.dm b/code/modules/response_team/ert_outfits.dm index 1c093bc3c1d..d5be97a4081 100644 --- a/code/modules/response_team/ert_outfits.dm +++ b/code/modules/response_team/ert_outfits.dm @@ -255,7 +255,7 @@ glasses = /obj/item/clothing/glasses/meson/engine mask = /obj/item/clothing/mask/gas cybernetic_implants = list( - /obj/item/organ/internal/cyberimp/eyes/shield, + /obj/item/organ/internal/eyes/cybernetic/shield, /obj/item/organ/internal/cyberimp/chest/nutriment ) l_pocket = /obj/item/t_scanner @@ -293,7 +293,7 @@ /obj/item/organ/internal/cyberimp/chest/nutriment/plus, /obj/item/organ/internal/cyberimp/eyes/hud/security, /obj/item/organ/internal/cyberimp/brain/anti_stun/hardened, - /obj/item/organ/internal/cyberimp/eyes/shield, + /obj/item/organ/internal/eyes/cybernetic/shield, /obj/item/organ/internal/cyberimp/arm/toolset ) diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index 6dee1763aad..24b567db203 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -6,77 +6,12 @@ slot = "eye_sight" parent_organ = "eyes" w_class = WEIGHT_CLASS_TINY - - var/vision_flags = 0 - var/see_in_dark = 0 - var/see_invisible = 0 - var/lighting_alpha - - var/eye_colour = "#000000" // Should never be null - var/old_eye_colour = "#000000" - var/flash_protect = 0 var/aug_message = "Your vision is augmented!" -/obj/item/organ/internal/cyberimp/eyes/insert(var/mob/living/carbon/M, var/special = 0) +/obj/item/organ/internal/cyberimp/eyes/insert(mob/living/carbon/M, special = FALSE) ..() - var/mob/living/carbon/human/H = M - if(istype(H) && eye_colour) - H.update_body() //Apply our eye colour to the target. if(aug_message && !special) to_chat(owner, "[aug_message]") - M.update_sight() - -/obj/item/organ/internal/cyberimp/eyes/remove(var/mob/living/carbon/M, var/special = 0) - . = ..() - M.update_sight() - -/obj/item/organ/internal/cyberimp/eyes/proc/generate_icon(var/mob/living/carbon/human/HA) - var/mob/living/carbon/human/H = HA - if(!istype(H)) - H = owner - var/icon/cybereyes_icon = new /icon('icons/mob/human_face.dmi', H.dna.species.eyes) - cybereyes_icon.Blend(eye_colour, ICON_ADD) // Eye implants override native DNA eye color - - return cybereyes_icon - -/obj/item/organ/internal/cyberimp/eyes/emp_act(severity) - if(!owner || emp_proof) - return - if(severity > 1) - if(prob(10 * severity)) - return - to_chat(owner, "Static obfuscates your vision!") - owner.flash_eyes(visual = 1) - -/obj/item/organ/internal/cyberimp/eyes/meson - name = "Meson scanner implant" - desc = "These cybernetic eyes will allow you to see the structural layout of the station, and, well, everything else." - eye_colour = "#199900" - implant_color = "#AEFF00" - origin_tech = "materials=4;engineering=4;biotech=4;magnets=4" - vision_flags = SEE_TURFS - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - aug_message = "Suddenly, you realize how much of a mess the station really is..." - -/obj/item/organ/internal/cyberimp/eyes/xray - name = "X-ray implant" - desc = "These cybernetic eye implants will give you X-ray vision. Blinking is futile." - implant_color = "#000000" - origin_tech = "materials=4;programming=4;biotech=7;magnets=4" - vision_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS - see_in_dark = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - -/obj/item/organ/internal/cyberimp/eyes/thermals - name = "Thermals implant" - desc = "These cybernetic eye implants will give you Thermal vision. Vertical slit pupil included." - eye_colour = "#FFCC00" - implant_color = "#FFCC00" - vision_flags = SEE_MOBS - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - flash_protect = -1 - origin_tech = "materials=5;programming=4;biotech=4;magnets=4;syndicate=1" - aug_message = "You see prey everywhere you look..." // HUD implants /obj/item/organ/internal/cyberimp/eyes/hud @@ -104,7 +39,6 @@ /obj/item/organ/internal/cyberimp/eyes/hud/medical name = "Medical HUD implant" desc = "These cybernetic eye implants will display a medical HUD over everything you see." - eye_colour = "#0000D0" implant_color = "#00FFFF" origin_tech = "materials=4;programming=4;biotech=4" aug_message = "You suddenly see health bars floating above people's heads..." @@ -114,7 +48,6 @@ /obj/item/organ/internal/cyberimp/eyes/hud/diagnostic name = "Diagnostic HUD implant" desc = "These cybernetic eye implants will display a diagnostic HUD over everything you see." - eye_colour = "#723E02" implant_color = "#ff9000" origin_tech = "materials=4;engineering=4;biotech=4" aug_message = "You see the diagnostic information of the synthetics around you..." @@ -123,22 +56,8 @@ /obj/item/organ/internal/cyberimp/eyes/hud/security name = "Security HUD implant" desc = "These cybernetic eye implants will display a security HUD over everything you see." - eye_colour = "#D00000" 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 examine_extensions = list(EXAMINE_HUD_SECURITY_READ, EXAMINE_HUD_SECURITY_WRITE) - -// Welding shield implant -/obj/item/organ/internal/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 - // Welding with thermals will still hurt your eyes a bit. - -/obj/item/organ/internal/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 56d82e24833..9c442fb6e28 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -9,9 +9,9 @@ /obj/item/organ/internal/cyberimp/New(var/mob/M = null) . = ..() if(implant_overlay) - var/image/overlay = new /image(icon, implant_overlay) + var/mutable_appearance/overlay = mutable_appearance(icon, implant_overlay) overlay.color = implant_color - overlays |= overlay + add_overlay(overlay) /obj/item/organ/internal/cyberimp/emp_act() return // These shouldn't be hurt by EMPs in the standard way @@ -405,26 +405,18 @@ //BOX O' IMPLANTS /obj/item/storage/box/cyber_implants - name = "boxed cybernetic implant" + name = "boxed cybernetic implants" desc = "A sleek, sturdy box." icon_state = "cyber_implants" - -/obj/item/storage/box/cyber_implants/New(loc, implant) - ..() - new /obj/item/autoimplanter(src) - if(ispath(implant)) - new implant(src) - -/obj/item/storage/box/cyber_implants/bundle - name = "boxed cybernetic implants" - var/list/boxed = list(/obj/item/organ/internal/cyberimp/eyes/xray,/obj/item/organ/internal/cyberimp/eyes/thermals, - /obj/item/organ/internal/cyberimp/brain/anti_stun, /obj/item/organ/internal/cyberimp/chest/reviver/hardened) + var/list/boxed = list( + /obj/item/autosurgeon/organ/syndicate/thermal_eyes, + /obj/item/autosurgeon/organ/syndicate/xray_eyes, + /obj/item/autosurgeon/organ/syndicate/anti_stun, + /obj/item/autosurgeon/organ/syndicate/reviver) var/amount = 5 -/obj/item/storage/box/cyber_implants/bundle/New() - ..() +/obj/item/storage/box/cyber_implants/populate_contents() var/implant - while(amount > 0) + while(length(contents) <= amount) implant = pick(boxed) new implant(src) - amount-- diff --git a/code/modules/surgery/organs/autoimplanter.dm b/code/modules/surgery/organs/autoimplanter.dm deleted file mode 100644 index e3f40bc8b46..00000000000 --- a/code/modules/surgery/organs/autoimplanter.dm +++ /dev/null @@ -1,37 +0,0 @@ -/obj/item/autoimplanter - name = "autoimplanter" - desc = "A device that automatically injects a cyber-implant into the user without the hassle of extensive surgery. It has a slot to insert implants and a screwdriver slot for removing accidentally added implants." - icon = 'icons/obj/device.dmi' - icon_state = "autoimplanter" - item_state = "walkietalkie"//left as this so as to intentionally not have inhands - w_class = WEIGHT_CLASS_SMALL - usesound = 'sound/weapons/circsawhit.ogg' - var/obj/item/organ/internal/cyberimp/storedorgan - -/obj/item/autoimplanter/attack_self(mob/user)//when the object it used... - if(!storedorgan) - to_chat(user, "[src] currently has no implant stored.") - return - storedorgan.insert(user)//insert stored organ into the user - user.visible_message("[user] presses a button on [src], and you hear a short mechanical noise.", "You feel a sharp sting as [src] plunges into your body.") - playsound(get_turf(user), usesound, 50, 1) - storedorgan = null - -/obj/item/autoimplanter/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/organ/internal/cyberimp)) - if(storedorgan) - to_chat(user, "[src] already has an implant stored.") - return - if(!user.drop_item()) - return - I.forceMove(src) - storedorgan = I - to_chat(user, "You insert the [I] into [src].") - else if(istype(I, /obj/item/screwdriver)) - if(!storedorgan) - to_chat(user, "There's no implant in [src] for you to remove.") - else - storedorgan.forceMove(get_turf(user)) - storedorgan = null - to_chat(user, "You remove the [storedorgan] from [src].") - playsound(get_turf(user), I.usesound, 50, 1) diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm new file mode 100644 index 00000000000..652bf7058a2 --- /dev/null +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -0,0 +1,103 @@ +#define INFINITE -1 + +/obj/item/autosurgeon + name = "autosurgeon" + desc = "A device that automatically inserts an implant or organ into the user without the hassle of extensive surgery. It has a screwdriver slot for removing accidentally added items." + icon = 'icons/obj/device.dmi' + icon_state = "autoimplanter" + item_state = "" + w_class = WEIGHT_CLASS_SMALL + var/uses = INFINITE + +/obj/item/autosurgeon/attack_self_tk(mob/user) + return //stops TK fuckery + +/obj/item/autosurgeon/organ + name = "implant autosurgeon" + desc = "A device that automatically inserts an implant or organ into the user without the hassle of extensive surgery. It has a slot to insert implants or organs and a screwdriver slot for removing accidentally added items." + var/organ_type = /obj/item/organ/internal + var/starting_organ + var/obj/item/organ/internal/storedorgan + +/obj/item/autosurgeon/organ/syndicate + name = "suspicious implant autosurgeon" + icon_state = "syndicate_autoimplanter" + +/obj/item/autosurgeon/organ/Initialize(mapload) + . = ..() + if(starting_organ) + insert_organ(new starting_organ(src)) + +/obj/item/autosurgeon/organ/proc/insert_organ(obj/item/I) + storedorgan = I + I.forceMove(src) + name = "[initial(name)] ([storedorgan.name])" + +/obj/item/autosurgeon/organ/attack_self(mob/user) //when the object it used... + if(!uses) + to_chat(user, "[src] has already been used. The tools are dull and won't reactivate.") + return + else if(!storedorgan) + to_chat(user, "[src] currently has no implant stored.") + return + storedorgan.insert(user) //insert stored organ into the user + user.visible_message("[user] presses a button on [src], and you hear a short mechanical noise.", "You feel a sharp sting as [src] plunges into your body.") + playsound(get_turf(user), 'sound/weapons/circsawhit.ogg', 50, TRUE) + storedorgan = null + name = initial(name) + if(uses != INFINITE) + uses-- + if(!uses) + desc = "[initial(desc)] Looks like it's been used up." + +/obj/item/autosurgeon/organ/attackby(obj/item/I, mob/user, params) + if(istype(I, organ_type)) + if(storedorgan) + to_chat(user, "[src] already has an implant stored.") + return + else if(!uses) + to_chat(user, "[src] has already been used up.") + return + if(!user.drop_item()) + return + I.forceMove(src) + storedorgan = I + to_chat(user, "You insert [I] into [src].") + else + return ..() + +/obj/item/autosurgeon/organ/screwdriver_act(mob/living/user, obj/item/I) + if(..()) + return TRUE + if(!storedorgan) + to_chat(user, "There's no implant in [src] for you to remove!") + else + storedorgan.forceMove(user.drop_location()) + + to_chat(user, "You remove [storedorgan] from [src].") + I.play_tool_sound(src) + storedorgan = null + if(uses != INFINITE) + uses-- + if(!uses) + desc = "[initial(desc)] Looks like it's been used up." + return TRUE + +/obj/item/autosurgeon/organ/syndicate/laser_arm + desc = "A single use autosurgeon that contains a combat arms-up laser augment. A screwdriver can be used to remove it, but implants can't be placed back in." + uses = 1 + starting_organ = /obj/item/organ/internal/cyberimp/arm/gun/laser + +/obj/item/autosurgeon/organ/syndicate/thermal_eyes + starting_organ = /obj/item/organ/internal/eyes/cybernetic/thermals + +/obj/item/autosurgeon/organ/syndicate/xray_eyes + starting_organ = /obj/item/organ/internal/eyes/cybernetic/xray + +/obj/item/autosurgeon/organ/syndicate/anti_stun + starting_organ = /obj/item/organ/internal/cyberimp/brain/anti_stun/hardened + +/obj/item/autosurgeon/organ/syndicate/reviver + starting_organ = /obj/item/organ/internal/cyberimp/chest/reviver/hardened + +#undef INFINITE diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 085434b25f2..4d1fba70497 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -5,17 +5,19 @@ organ_tag = "eyes" parent_organ = "head" slot = "eyes" - var/eye_colour = "#000000" // Should never be null + var/eye_color = "#000000" // Should never be null var/list/colourmatrix = null var/list/colourblind_matrix = MATRIX_GREYSCALE //Special colourblindness parameters. By default, it's black-and-white. var/list/replace_colours = GREYSCALE_COLOR_REPLACE var/dependent_disabilities = list() //Gets set by eye-dependent disabilities such as colourblindness so the eyes can transfer the disability during transplantation. - var/weld_proof = null //If set, the eyes will not take damage during welding. eg. IPC optical sensors do not take damage when they weld things while all other eyes will. + var/weld_proof = FALSE //If set, the eyes will not take damage during welding. eg. IPC optical sensors do not take damage when they weld things while all other eyes will. var/vision_flags = 0 var/see_in_dark = 2 + var/tint = 0 + var/flash_protect = FLASH_PROTECTION_NONE var/see_invisible = SEE_INVISIBLE_LIVING - var/lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + var/lighting_alpha /obj/item/organ/internal/eyes/proc/update_colour() dna.write_eyes_attributes(src) @@ -25,7 +27,7 @@ if(!istype(H)) H = owner var/icon/eyes_icon = new /icon('icons/mob/human_face.dmi', H.dna.species.eyes) - eyes_icon.Blend(eye_colour, ICON_ADD) + eyes_icon.Blend(eye_color, ICON_ADD) return eyes_icon @@ -41,9 +43,12 @@ /obj/item/organ/internal/eyes/insert(mob/living/carbon/human/M, special = 0) ..() - if(istype(M) && eye_colour) + if(istype(M) && eye_color) M.update_body() //Apply our eye colour to the target. + M.update_tint() + M.update_sight() + if(!HAS_TRAIT(M, TRAIT_COLORBLIND) && (TRAIT_COLORBLIND in dependent_disabilities)) //If the eyes are colourblind and we're not, carry over the gene. dependent_disabilities -= TRAIT_COLORBLIND M.dna.SetSEState(GLOB.colourblindblock, TRUE) @@ -58,6 +63,8 @@ M.dna.SetSEState(GLOB.colourblindblock, FALSE) singlemutcheck(M, GLOB.colourblindblock, MUTCHK_FORCED) . = ..() + M.update_tint() + M.update_sight() /obj/item/organ/internal/eyes/surgeryize() if(!owner) @@ -67,6 +74,32 @@ owner.SetEyeBlurry(0) owner.SetEyeBlind(0) +/obj/item/organ/internal/eyes/night_vision + name = "shadow eyes" + desc = "A spooky set of eyes that can see in the dark." + see_in_dark = 8 + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + actions_types = list(/datum/action/item_action/organ_action/use) + +/obj/item/organ/internal/eyes/night_vision/ui_action_click() + vision_flags = initial(vision_flags) + switch(lighting_alpha) + if(LIGHTING_PLANE_ALPHA_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + if(LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + if(LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) + lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE + else + lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE + vision_flags &= ~SEE_BLACKNESS + owner.update_sight() + +/obj/item/organ/internal/eyes/night_vision/nightmare + name = "burning red eyes" + desc = "Even without their shadowy owner, looking at these eyes gives you a sense of dread." + icon_state = "burning_eyes" + /obj/item/organ/internal/eyes/robotize(make_tough) colourmatrix = null ..() //Make sure the organ's got the robotic status indicators before updating the client colour. @@ -79,3 +112,79 @@ desc = "An electronic device designed to mimic the functions of a pair of human eyes. It has no benefits over organic eyes, but is easy to produce." origin_tech = "biotech=4" status = ORGAN_ROBOT + +/obj/item/organ/internal/eyes/cybernetic/emp_act(severity) + if(!owner || emp_proof) + return + if(prob(10 * severity)) + return + to_chat(owner, "Static obfuscates your vision!") + owner.flash_eyes(visual = TRUE) + ..() + +/obj/item/organ/internal/eyes/cybernetic/meson + name = "meson eyes" + desc = "These cybernetic eyes will allow you to see the structural layout of the station, and, well, everything else." + eye_color = "#199900" + vision_flags = SEE_TURFS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + origin_tech = "materials=4;engineering=4;biotech=4;magnets=4" + +/obj/item/organ/internal/eyes/cybernetic/xray + name = "\improper X-ray eyes" + desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." + see_in_dark = 8 + vision_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS + origin_tech = "materials=4;programming=4;biotech=7;magnets=4" + +/obj/item/organ/internal/eyes/cybernetic/thermals + name = "thermal eyes" + desc = "These cybernetic eye implants will give you thermal vision. Vertical slit pupil included." + eye_color = "#FFCC00" + vision_flags = SEE_MOBS + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + flash_protect = FLASH_PROTECTION_SENSITIVE + see_in_dark = 8 + origin_tech = "materials=5;programming=4;biotech=4;magnets=4;syndicate=1" + +/obj/item/organ/internal/eyes/cybernetic/flashlight + name = "flashlight eyes" + desc = "It's two flashlights rigged together with some wire. Why would you put these in someone's head?" + eye_color ="#FEE5A3" + icon = 'icons/obj/lighting.dmi' + icon_state = "flashlight_eyes" + flash_protect = FLASH_PROTECTION_WELDER + tint = INFINITY + var/obj/item/flashlight/eyelight/eye + +/obj/item/organ/internal/eyes/cybernetic/flashlight/emp_act(severity) + return + +/obj/item/organ/internal/eyes/cybernetic/flashlight/insert(mob/living/carbon/M, special = FALSE) + ..() + if(!eye) + eye = new /obj/item/flashlight/eyelight() + eye.on = TRUE + eye.forceMove(M) + eye.update_brightness(M) + M.become_blind("flashlight_eyes") + + +/obj/item/organ/internal/eyes/cybernetic/flashlight/remove(mob/living/carbon/M, special = FALSE) + if(eye) + eye.on = FALSE + eye.update_brightness(M) + eye.forceMove(src) + M.cure_blind("flashlight_eyes") + . = ..() + +// Welding shield implant +/obj/item/organ/internal/eyes/cybernetic/shield + name = "shielded robotic eyes" + desc = "These reactive micro-shields will protect you from welders and flashes without obscuring your vision." + flash_protect = FLASH_PROTECTION_WELDER + eye_color = "#101010" + origin_tech = "materials=4;biotech=3;engineering=4;plasmatech=3" + +/obj/item/organ/internal/eyes/cybernetic/shield/emp_act(severity) + return diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 1f1529bd7b5..12cc87aeb3f 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -91,7 +91,7 @@ return if(!breath || (breath.total_moles() == 0)) - if(isspaceturf(loc)) + if(isspaceturf(H.loc)) H.adjustOxyLoss(10) else H.adjustOxyLoss(5) diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index 8c07bd97433..0ccbae57471 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -239,7 +239,7 @@ var/obj/item/organ/external/affected = owner.get_organ(parent_organ) if(affected) affected.internal_organs -= src - loc = get_turf(owner) + forceMove(get_turf(owner)) START_PROCESSING(SSobj, src) if(owner && vital && is_primary_organ()) // I'd do another check for species or whatever so that you couldn't "kill" an IPC by removing a human head from them, but it doesn't matter since they'll come right back from the dead diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index e15fc28f2f8..b1adcae26ca 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -7,7 +7,6 @@ max_damage = 0 dir = SOUTH organ_tag = "limb" - flags_2 = RAD_PROTECT_CONTENTS_2 | RAD_NO_CONTAMINATE_2 // On Para, external organs have a loc, ergo they need this. var/brute_mod = 1 var/burn_mod = 1 @@ -115,7 +114,7 @@ /obj/item/organ/external/replaced(var/mob/living/carbon/human/target) owner = target - forceMove(owner) + loc = null if(istype(owner)) if(!isnull(owner.bodyparts_by_name[limb_name])) log_debug("Duplicate organ in slot \"[limb_name]\", mob '[target]'") @@ -227,7 +226,7 @@ check_fracture(brute) var/mob/living/carbon/owner_old = owner //Need to update health, but need a reference in case the below check cuts off a limb. //If limb took enough damage, try to cut or tear it off - if(owner && loc == owner) + if(owner) if(!cannot_amputate && (brute_dam) >= (max_damage)) if(prob(brute / 2)) if(sharp) diff --git a/code/modules/surgery/organs/subtypes/kidan.dm b/code/modules/surgery/organs/subtypes/kidan.dm index 6407917bcae..33574ef8104 100644 --- a/code/modules/surgery/organs/subtypes/kidan.dm +++ b/code/modules/surgery/organs/subtypes/kidan.dm @@ -49,8 +49,7 @@ colour = BlendRGB(owner.m_colours["body"], owner.m_colours["head"], 0.65) //then again im pretty bad at theoretics if(new_light != glowing) - var/obj/item/organ/external/groin/lbody = owner.get_organ(check_zone(parent_organ)) - lbody.set_light(new_light,l_color = colour) + owner.set_light(new_light, l_color = colour) glowing = new_light return @@ -73,14 +72,12 @@ if(!glowing) var/light = calculate_glow(KIDAN_LANTERN_LIGHT) - var/obj/item/organ/external/groin/lbody = owner.get_organ(check_zone(parent_organ)) - lbody.set_light(light,l_color = colour) + owner.set_light(light, l_color = colour) glowing = light return 1 else - var/obj/item/organ/external/groin/lbody = owner.get_organ(check_zone(parent_organ)) - lbody.set_light(0) + owner.set_light(0) glowing = 0 return 1 diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm index 415cdb7875d..8a4d63aeaf8 100644 --- a/code/modules/surgery/organs/subtypes/machine.dm +++ b/code/modules/surgery/organs/subtypes/machine.dm @@ -118,7 +118,7 @@ icon_state = "camera" status = ORGAN_ROBOT // dead_icon = "camera_broken" - weld_proof = 1 + weld_proof = TRUE /obj/item/organ/internal/eyes/optical_sensor/remove(var/mob/living/user,special = 0) if(!special) diff --git a/code/modules/surgery/organs/subtypes/shadow.dm b/code/modules/surgery/organs/subtypes/shadow.dm deleted file mode 100644 index d147feb0317..00000000000 --- a/code/modules/surgery/organs/subtypes/shadow.dm +++ /dev/null @@ -1,3 +0,0 @@ -/obj/item/organ/internal/eyes/shadow - name = "dark orbs" - see_in_dark = 8 diff --git a/code/modules/surgery/organs/subtypes/skrell.dm b/code/modules/surgery/organs/subtypes/skrell.dm index 32a416fc887..9021e53393b 100644 --- a/code/modules/surgery/organs/subtypes/skrell.dm +++ b/code/modules/surgery/organs/subtypes/skrell.dm @@ -9,34 +9,34 @@ icon = 'icons/obj/species_organs/skrell.dmi' icon_state = "skrell_headpocket" origin_tech = "biotech=2" - w_class = WEIGHT_CLASS_TINY + w_class = WEIGHT_CLASS_SMALL parent_organ = "head" slot = "headpocket" actions_types = list(/datum/action/item_action/organ_action/toggle) - var/obj/item/storage/internal/pocket + var/obj/item/held_item -/obj/item/organ/internal/headpocket/New() - ..() - pocket = new /obj/item/storage/internal(src) - pocket.storage_slots = 1 - // Allow adjacency calculation to work properly - loc = owner - // Fit only pocket sized items - pocket.max_w_class = WEIGHT_CLASS_SMALL - pocket.max_combined_w_class = 2 +/obj/item/organ/internal/headpocket/Destroy() + QDEL_NULL(held_item) + return ..() /obj/item/organ/internal/headpocket/on_life() ..() var/obj/item/organ/external/head/head = owner.get_organ("head") - if(pocket.contents.len && !findtextEx(head.h_style, "Tentacles")) - owner.visible_message("Something falls from [owner]'s head!", - "Something falls from your head!") + if(held_item && !findtextEx(head.h_style, "Tentacles")) + owner.visible_message("[held_item] falls from [owner]'s [name]!", "[held_item] falls from your [name]!") empty_contents() /obj/item/organ/internal/headpocket/ui_action_click() - if(!loc) - loc = owner - pocket.MouseDrop(owner) + if(held_item) + owner.visible_message("[owner] removes [held_item] from [owner.p_their()] [name].", "You remove [held_item] from your [name].") + owner.put_in_hands(held_item) + held_item = null + else + var/obj/item/I = owner.get_active_hand() + if(I && I.w_class <= WEIGHT_CLASS_SMALL && !istype(I, /obj/item/disk/nuclear) && owner.unEquip(I)) + owner.visible_message("[owner] places [I] into [owner.p_their()] [name].", "You place [I] into your [name].") + I.forceMove(src) + held_item = I /obj/item/organ/internal/headpocket/on_owner_death() empty_contents() @@ -46,22 +46,20 @@ . = ..() /obj/item/organ/internal/headpocket/proc/empty_contents() - for(var/obj/item/I in pocket.contents) - pocket.remove_from_storage(I, get_turf(owner)) - -/obj/item/organ/internal/headpocket/proc/get_contents() - return pocket.contents + if(held_item) + held_item.forceMove(get_turf(owner)) + held_item = null /obj/item/organ/internal/headpocket/emp_act(severity) - pocket.emp_act(severity) + held_item.emp_act(severity) ..() -/obj/item/organ/internal/headpocket/hear_talk(mob/living/M as mob, list/message_pieces) - pocket.hear_talk(M, message_pieces) +/obj/item/organ/internal/headpocket/hear_talk(mob/living/M, list/message_pieces) + held_item.hear_talk(M, message_pieces) ..() -/obj/item/organ/internal/headpocket/hear_message(mob/living/M as mob, msg) - pocket.hear_message(M, msg) +/obj/item/organ/internal/headpocket/hear_message(mob/living/M, msg) + held_item.hear_message(M, msg) ..() /obj/item/organ/internal/heart/skrell diff --git a/code/modules/tgui/modules/appearance_changer.dm b/code/modules/tgui/modules/appearance_changer.dm index b6139792b71..6af513e1d08 100644 --- a/code/modules/tgui/modules/appearance_changer.dm +++ b/code/modules/tgui/modules/appearance_changer.dm @@ -113,7 +113,7 @@ if("eye_color") if(can_change(APPEARANCE_EYE_COLOR)) var/obj/item/organ/internal/eyes/eyes_organ = owner.get_int_organ(/obj/item/organ/internal/eyes) - var/new_eyes = input("Please select eye color.", "Eye Color", eyes_organ.eye_colour) as color|null + var/new_eyes = input("Please select eye color.", "Eye Color", eyes_organ.eye_color) as color|null if(new_eyes && (!..()) && owner.change_eye_color(new_eyes)) update_dna() diff --git a/config/example/dbconfig.txt b/config/example/dbconfig.txt index 58c68281bb5..1cf22d60895 100644 --- a/config/example/dbconfig.txt +++ b/config/example/dbconfig.txt @@ -9,7 +9,7 @@ ## This value must be set to the version of the paradise schema in use. ## If this value does not match, the SQL database will not be loaded and an error will be generated. ## Roundstart will be delayed. -DB_VERSION 21 +DB_VERSION 22 ## Server the MySQL database can be found at. # Examples: localhost, 200.135.5.43, www.mysqldb.com, etc. diff --git a/icons/goonstation/mob/inhands/items_lefthand.dmi b/icons/goonstation/mob/inhands/items_lefthand.dmi index 042c15f279b..3368b0f926d 100644 Binary files a/icons/goonstation/mob/inhands/items_lefthand.dmi and b/icons/goonstation/mob/inhands/items_lefthand.dmi differ diff --git a/icons/goonstation/mob/inhands/items_righthand.dmi b/icons/goonstation/mob/inhands/items_righthand.dmi index 051f205bac7..e4dd176755f 100644 Binary files a/icons/goonstation/mob/inhands/items_righthand.dmi and b/icons/goonstation/mob/inhands/items_righthand.dmi differ diff --git a/icons/goonstation/objects/objects.dmi b/icons/goonstation/objects/objects.dmi index 76c8e17c99a..0c78e218d6a 100644 Binary files a/icons/goonstation/objects/objects.dmi and b/icons/goonstation/objects/objects.dmi differ diff --git a/icons/mob/inhands/equipment/toolbox_lefthand.dmi b/icons/mob/inhands/equipment/toolbox_lefthand.dmi new file mode 100644 index 00000000000..4b6385b28e7 Binary files /dev/null and b/icons/mob/inhands/equipment/toolbox_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/toolbox_righthand.dmi b/icons/mob/inhands/equipment/toolbox_righthand.dmi new file mode 100644 index 00000000000..31ab7ce3b68 Binary files /dev/null and b/icons/mob/inhands/equipment/toolbox_righthand.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 11189a5a0ad..ed35f85b21c 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 19b4d85a1d8..60ffb6462f9 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index ca1dec37685..28b2a79a06d 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index eb3901077b9..7af3800e5d4 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/paradise.dme b/paradise.dme index 995e72d1b6d..ff6f214d36c 100644 --- a/paradise.dme +++ b/paradise.dme @@ -2417,7 +2417,7 @@ #include "code\modules\surgery\organs\augments_arms.dm" #include "code\modules\surgery\organs\augments_eyes.dm" #include "code\modules\surgery\organs\augments_internal.dm" -#include "code\modules\surgery\organs\autoimplanter.dm" +#include "code\modules\surgery\organs\autosurgeon.dm" #include "code\modules\surgery\organs\blood.dm" #include "code\modules\surgery\organs\body_egg.dm" #include "code\modules\surgery\organs\ears.dm" @@ -2445,7 +2445,6 @@ #include "code\modules\surgery\organs\subtypes\machine.dm" #include "code\modules\surgery\organs\subtypes\nucleation.dm" #include "code\modules\surgery\organs\subtypes\plasmaman.dm" -#include "code\modules\surgery\organs\subtypes\shadow.dm" #include "code\modules\surgery\organs\subtypes\skrell.dm" #include "code\modules\surgery\organs\subtypes\slime.dm" #include "code\modules\surgery\organs\subtypes\standard.dm" diff --git a/tools/ci/dbconfig.txt b/tools/ci/dbconfig.txt index 95121b4923f..2e5f85ee767 100644 --- a/tools/ci/dbconfig.txt +++ b/tools/ci/dbconfig.txt @@ -2,7 +2,7 @@ # Dont use it ingame # Remember to update this when you increase the SQL version! -aa SQL_ENABLED -DB_VERSION 21 +DB_VERSION 22 ADDRESS 127.0.0.1 PORT 3306 FEEDBACK_DATABASE feedback